about summary refs log tree commit diff
path: root/amd64.e
diff options
context:
space:
mode:
Diffstat (limited to 'amd64.e')
-rw-r--r--amd64.e66
1 files changed, 38 insertions, 28 deletions
diff --git a/amd64.e b/amd64.e
index 1449bfd..c6dabb4 100644
--- a/amd64.e
+++ b/amd64.e
@@ -263,6 +263,7 @@ s" :cc-greater" keyword
 ~
 ~ (scale factor -- 2-bit encoded value)
 : scalefield
+  ~ : provide-decimal
   dup 1 = { drop 0 exit } if
   dup 2 = { drop 1 exit } if
   dup 4 = { drop 2 exit } if
@@ -286,6 +287,7 @@ s" :cc-greater" keyword
 ~
 ~ (condition -- 4-bit encoded value)
 : condition-code
+  ~ : provide-keyword
   dup :cc-overflow = { drop 0 exit } if
   dup :cc-no-overflow = { drop 1 exit } if
   dup :cc-below = { drop 2 exit } if
@@ -511,8 +513,10 @@ s" :cc-greater" keyword
   ~ If the R/M register was rsp, we need an SIB byte; otherwise, skip it.
   3roll { 0 4 :rsp reg64 sib } if
   ~ The displacement byte.
+  swap
   ~ : 1 adjust-length
-  swap pack8 ;
+  ~ : provide-hex8
+  pack8 ;
 
 ~ (output point, reg/op field value, reg/mem field register,
 ~  displacement value -- output point)
@@ -526,8 +530,10 @@ s" :cc-greater" keyword
   ~ If the R/M register was rsp, we need an SIB byte; otherwise, skip it.
   3roll { 0 4 :rsp reg64 sib } if
   ~ The displacement value.
+  swap
   ~ : 4 adjust-length
-  swap pack32 ;
+  ~ : provide-hex32
+  pack32 ;
 
 ~ (output point, reg/op field value,
 ~  scale factor, index register, base field register
@@ -550,8 +556,10 @@ s" :cc-greater" keyword
   ~ Reg/mem value 4 means to use an SIB byte (at least, with this mode).
   6 roll 1 7 roll 4 modrm 5 unroll
   5 unroll reg64 3unroll reg64 3unroll scalefield 3unroll sib
+  swap
   ~ : 1 adjust-length
-  swap pack8 ;
+  ~ : provide-hex8
+  pack8 ;
 
 
 ~ Easy instructions
@@ -604,14 +612,14 @@ s" :cc-greater" keyword
 ~ (output point, source register, source displacement value, target register
 ~  -- output point)
 : lea-reg64-disp8-reg64
-  ~ : 1 lea-reg64-disp8-reg64
+  ~ : 1 # # # lea-reg64-disp8-reg64
   4 roll rex-w 0x8D pack8 4 unroll
   reg64 3unroll addressing-disp8-reg64 ;
 
 ~ (output point, source register, source displacement value, target register
 ~  -- output point)
 : lea-reg64-disp32-reg64
-  ~ : 1 lea-reg64-disp32-reg64
+  ~ : 1 # # # lea-reg64-disp32-reg64
   4 roll rex-w 0x8D pack8 4 unroll
   reg64 3unroll addressing-disp32-reg64 ;
 
@@ -619,7 +627,7 @@ s" :cc-greater" keyword
 ~  source base register, source index register, source index scale factor,
 ~  target register -- output point)
 : lea-reg64-indexed-reg64
-  ~ : 1 lea-reg64-indexed-reg64
+  ~ : 1 # # # lea-reg64-indexed-reg64
   5 roll rex-w 0x8D pack8 5 unroll
   reg64 4 unroll 3unroll swap addressing-indexed-reg64 ;
 
@@ -628,7 +636,7 @@ s" :cc-greater" keyword
 ~  source displacement value,
 ~  target register -- output point)
 : lea-reg64-disp8-indexed-reg64
-  ~ : 1 lea-reg64-disp8-indexed-reg64
+  ~ : 1 # # # # lea-reg64-disp8-indexed-reg64
   6 roll rex-w 0x8D pack8 6 unroll
   reg64 5 unroll 3 roll 4 roll 3 roll addressing-disp8-indexed-reg64 ;
 
@@ -681,7 +689,7 @@ s" :cc-greater" keyword
 ~ (output point, source register, target register, target displacement value
 ~  -- output point)
 : mov-disp8-reg64-reg64
-  ~ : 1 # # mov-disp8-reg64-reg64
+  ~ : 1 # # # mov-disp8-reg64-reg64
   4 roll rex-w 0x89 pack8 4 unroll
   3roll reg64 3unroll addressing-disp8-reg64 ;
 
@@ -694,11 +702,11 @@ s" :cc-greater" keyword
 ~ (output point, source register, source displacement value, target register
 ~  -- output point)
 : mov-reg64-disp8-reg64
-  ~ : 1 # # mov-reg64-disp8-reg64
+  ~ : 1 # # # mov-reg64-disp8-reg64
   4 roll rex-w 0x8B pack8 4 unroll
   reg64 3unroll addressing-disp8-reg64 ;
 : mov-reg64-disp32-reg64
-  ~ : 1 mov-reg64-disp32-reg64
+  ~ : 1 # # # mov-reg64-disp32-reg64
   4 roll rex-w 0x89 pack8 4 unroll
   3roll reg64 swap 3roll addressing-disp32-reg64 ;
 
@@ -706,7 +714,7 @@ s" :cc-greater" keyword
 ~  source base register, source index register, source index scale factor,
 ~  target register -- output point)
 : mov-reg64-indexed-reg64
-  ~ : 1 mov-reg64-indexed-reg64
+  ~ : 1 # # # mov-reg64-indexed-reg64
   5 roll rex-w 0x8B pack8 5 unroll
   reg64 4 unroll 3unroll swap addressing-indexed-reg64 ;
 
@@ -714,86 +722,88 @@ s" :cc-greater" keyword
 ~  target base register, target index register, target index scale factor
 ~  -- output point)
 : mov-indexed-reg64-reg64
-  ~ : 1 mov-indexed-reg64-reg64
+  ~ : 1 # # # mov-indexed-reg64-reg64
   5 roll rex-w 0x89 pack8 5 unroll
   4 roll reg64 4 unroll
   3unroll swap addressing-indexed-reg64 ;
 
 ~ (output point, source register, target register -- output point)
 : mov-indirect-reg64-reg32
-  ~ : 1 mov-indirect-reg64-reg32
+  ~ : 1 # # mov-indirect-reg64-reg32
   3roll 0x89 pack8 3unroll
   swap reg32 swap addressing-indirect-reg64 ;
 
 ~ (output point, source register, target register, target displacement value
 ~  -- output point)
 : mov-disp8-reg64-reg32
-  ~ : 1 mov-disp8-reg64-reg32
+  ~ : 1 # # # mov-disp8-reg64-reg32
   4 roll 0x89 pack8 4 unroll
   3roll reg32 3unroll addressing-disp8-reg64 ;
 
 ~ (output point, source register, target register -- output point)
 : mov-reg32-indirect-reg64
-  ~ : 1 mov-reg32-indirect-reg64
+  ~ : 1 # # mov-reg32-indirect-reg64
   3roll 0x8B pack8 3unroll
   reg32 swap addressing-indirect-reg64 ;
 
 ~ (output point, source register, source displacement value, target register
 ~ -- output point)
 : mov-reg32-disp8-reg64
-  ~ : 1 mov-reg32-disp8-reg64
+  ~ : 1 # # # mov-reg32-disp8-reg64
   4 roll 0x8B pack8 4 unroll
   reg32 3unroll addressing-disp8-reg64 ;
 
 ~ (output point, source register, target register -- output point)
 : mov-indirect-reg64-reg16
-  ~ : 2 mov-indirect-reg64-reg16
+  ~ : 2 # # mov-indirect-reg64-reg16
   3roll 0x66 pack8 0x89 pack8 3unroll
   swap reg16 swap addressing-indirect-reg64 ;
 
 ~ (output point, source register, target register, target displacement value
 ~  -- output point)
 : mov-disp8-reg64-reg16
-  ~ : 2 mov-disp8-reg64-reg16
+  ~ : 2 # # # mov-disp8-reg64-reg16
   4 roll 0x66 pack8 0x89 pack8 4 unroll
   3roll reg16 3unroll addressing-disp8-reg64 ;
 
 ~ (output point, source register, target register -- output point)
 : mov-reg16-indirect-reg64
-  ~ : 2 mov-reg16-indirect-reg64
+  ~ : 2 # # mov-reg16-indirect-reg64
   3roll 0x66 pack8 0x8B pack8 3unroll
   reg16 swap addressing-indirect-reg64 ;
 
 ~ (output point, source register, target displacement value, target register
 ~  -- output point)
 : mov-reg16-disp8-reg64
-  ~ : 2 mov-reg16-disp8-reg64
+  ~ : 2 # # # mov-reg16-disp8-reg64
   4 roll 0x66 pack8 0x8B pack8 4 unroll
   reg16 3unroll addressing-disp8-reg64 ;
 
 ~ (output point, source register, target register -- output point)
 : mov-indirect-reg64-reg8
-  ~ : 1 mov-indirect-reg64-reg8
+  ~ : 1 # # mov-indirect-reg64-reg8
   3roll 0x88 pack8 3unroll
   swap reg8 swap addressing-indirect-reg64 ;
 
 ~ (output point, source register, target register, target displacement value
 ~  -- output point)
 : mov-disp8-reg64-reg8
-  ~ : 1 mov-disp8-reg64-reg8
+  ~ : 1 # # # mov-disp8-reg64-reg8
   4 roll 0x88 pack8 4 unroll
   3roll reg8 3unroll addressing-disp8-reg64 ;
 
 ~ (output point, source register, target register -- output point)
 : mov-reg8-indirect-reg64
-  ~ : 1 mov-reg8-indirect-reg64
+  ~ : 1 # # mov-reg8-indirect-reg64
   3roll 0x8A pack8 3unroll
   reg8 swap addressing-indirect-reg64 ;
 
+~ TODO this word is probably broken? It appears to try packing something
+~ that doesn't exist, and it's never called.
 ~ (output point, source register, source displacement value, target register
 ~  -- output point)
 : mov-reg8-disp8-reg64
-  ~ : 2 # mov-reg8-disp8-reg64
+  ~ : 2 # # # mov-reg8-disp8-reg64
   4 roll
   ~ : provide-hex8
   pack8 0x8A pack8 4 unroll
@@ -801,7 +811,7 @@ s" :cc-greater" keyword
 
 ~ (output point, source register, target register -- output point)
 : mov-reg8-reg8
-  ~ : 1 mov-reg8-reg8
+  ~ : 1 # # mov-reg8-reg8
   3roll 0x88 pack8 3unroll
   swap reg8 swap addressing-reg8 ;
 
@@ -1225,14 +1235,14 @@ s" :cc-greater" keyword
 
 ~ (output point, condition code, target register -- output point)
 : set-reg8-cc
-  ~ : 1 # set-reg8-cc
+  ~ : 1 # # set-reg8-cc
   3roll 0x0F pack8
   3roll condition-code 0x90 opcodecc
   swap reg8 3 0 3roll modrm ;
 
 ~ (output point, address offset value, condition code -- output point)
 : jmp-cc-rel-imm8
-  ~ : 1 # jmp-cc-rel-imm8
+  ~ : 1 # # jmp-cc-rel-imm8
   3roll swap condition-code 0x70 opcodecc
   swap
   ~ : provide-hex8
@@ -1240,7 +1250,7 @@ s" :cc-greater" keyword
 
 ~ (output point, address offset value, condition code -- output point)
 : jmp-cc-rel-imm32
-  ~ : 5 # jmp-cc-rel-imm32
+  ~ : 5 # # jmp-cc-rel-imm32
   3unroll 0x0F pack8
   swap condition-code 0x70 opcodecc
   swap