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.e68
1 files changed, 46 insertions, 22 deletions
diff --git a/amd64.e b/amd64.e
index 5036c81..20f140c 100644
--- a/amd64.e
+++ b/amd64.e
@@ -745,7 +745,6 @@ s" :cc-greater" keyword
 
 ~ (output point, source register, target register, target displacement value
 ~  -- output point)
-~ TODO IAK this is where the verification is up to
 : mov-disp8-reg64-reg64
   ~ : 1 # # # mov-disp8-reg64-reg64
   4 roll rex-w 0x89 pack8 4 unroll
@@ -768,7 +767,10 @@ s" :cc-greater" keyword
 : mov-reg64-disp32-reg64
   ~ : 1 # # # mov-reg64-disp32-reg64
   4 roll rex-w 0x89 pack8 4 unroll
-  3roll reg64 swap 3roll addressing-disp32-reg64 ;
+  3roll reg64 swap 3roll addressing-disp32-reg64
+  ~ : swap-subitems
+  ~ : 3 roll-subitems
+  ;
 
 ~ (output point,
 ~  source base register, source index register, source index scale factor,
@@ -785,20 +787,26 @@ s" :cc-greater" keyword
   ~ : 1 # # # # mov-indexed-reg64-reg64
   5 roll rex-w 0x89 pack8 5 unroll
   4 roll reg64 4 unroll
-  3unroll swap addressing-indexed-reg64 ;
+  3unroll swap addressing-indexed-reg64
+  ~ : 4 roll-subitems
+  ;
 
 ~ (output point, source register, target register -- output point)
 : mov-indirect-reg64-reg32
   ~ : 1 # # mov-indirect-reg64-reg32
   3roll 0x89 pack8 3unroll
-  swap reg32 swap addressing-indirect-reg64 ;
+  swap reg32 swap addressing-indirect-reg64
+  ~ : swap-subitems
+  ;
 
 ~ (output point, source register, target register, target displacement value
 ~  -- output point)
 : mov-disp8-reg64-reg32
   ~ : 1 # # # mov-disp8-reg64-reg32
   4 roll 0x89 pack8 4 unroll
-  3roll reg32 3unroll addressing-disp8-reg64 ;
+  3roll reg32 3unroll addressing-disp8-reg64
+  ~ : 3 roll-subitems
+  ;
 
 ~ (output point, source register, target register -- output point)
 : mov-reg32-indirect-reg64
@@ -817,14 +825,18 @@ s" :cc-greater" keyword
 : mov-indirect-reg64-reg16
   ~ : 2 # # mov-indirect-reg64-reg16
   3roll 0x66 pack8 0x89 pack8 3unroll
-  swap reg16 swap addressing-indirect-reg64 ;
+  swap reg16 swap addressing-indirect-reg64
+  ~ : swap-subitems
+  ;
 
 ~ (output point, source register, target register, target displacement value
 ~  -- output point)
 : mov-disp8-reg64-reg16
   ~ : 2 # # # mov-disp8-reg64-reg16
   4 roll 0x66 pack8 0x89 pack8 4 unroll
-  3roll reg16 3unroll addressing-disp8-reg64 ;
+  3roll reg16 3unroll addressing-disp8-reg64
+  ~ : 3 roll-subitems
+  ;
 
 ~ (output point, source register, target register -- output point)
 : mov-reg16-indirect-reg64
@@ -843,14 +855,18 @@ s" :cc-greater" keyword
 : mov-indirect-reg64-reg8
   ~ : 1 # # mov-indirect-reg64-reg8
   3roll 0x88 pack8 3unroll
-  swap reg8 swap addressing-indirect-reg64 ;
+  swap reg8 swap addressing-indirect-reg64
+  ~ : swap-subitems
+  ;
 
 ~ (output point, source register, target register, target displacement value
 ~  -- output point)
 : mov-disp8-reg64-reg8
   ~ : 1 # # # mov-disp8-reg64-reg8
   4 roll 0x88 pack8 4 unroll
-  3roll reg8 3unroll addressing-disp8-reg64 ;
+  3roll reg8 3unroll addressing-disp8-reg64
+  ~ : 3 roll-subitems
+  ;
 
 ~ (output point, source register, target register -- output point)
 : mov-reg8-indirect-reg64
@@ -858,22 +874,20 @@ s" :cc-greater" keyword
   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
-  4 roll
-  ~ : provide-hex8
-  pack8 0x8A pack8 4 unroll
+  4 roll 0x8A pack8 4 unroll
   reg8 3unroll addressing-disp8-reg64 ;
 
 ~ (output point, source register, target register -- output point)
 : mov-reg8-reg8
   ~ : 1 # # mov-reg8-reg8
   3roll 0x88 pack8 3unroll
-  swap reg8 swap addressing-reg8 ;
+  swap reg8 swap addressing-reg8
+  ~ : swap-subitems
+  ;
 
 
 ~ String instructions
@@ -1077,13 +1091,17 @@ s" :cc-greater" keyword
 : add-reg64-reg64
   ~ : 1 # # add-reg64-reg64
   3roll rex-w 0x01 pack8 3unroll
-  swap reg64 swap addressing-reg64 ;
+  swap reg64 swap addressing-reg64
+  ~ : swap-subitems
+  ;
 
 ~ (output point, source register, target register -- output point)
 : add-indirect-reg64-reg64
   ~ : 1 # # add-indirect-reg64-reg64
   3roll rex-w 0x01 pack8 3unroll
-  swap reg64 swap addressing-indirect-reg64 ;
+  swap reg64 swap addressing-indirect-reg64
+  ~ : swap-subitems
+  ;
 
 ~ (output point, source register, target register -- output point)
 : add-reg64-indirect-reg64
@@ -1111,7 +1129,9 @@ s" :cc-greater" keyword
 : sub-indirect-reg64-reg64
   ~ : 1 # # sub-indirect-reg64-reg64
   3roll rex-w 0x2B pack8 3unroll
-  swap reg64 swap addressing-indirect-reg64 ;
+  swap reg64 swap addressing-indirect-reg64
+  ~ : swap-subitems
+  ;
 
 ~ See above re: parameter order.
 ~
@@ -1235,7 +1255,7 @@ s" :cc-greater" keyword
 ~ (output point, bit count, target register -- output point)
 : ror-reg64-imm8
   ~ : 1 # # ror-reg64-imm8
-  3roll rex-w 0xC1 swap
+  3roll rex-w 0xC1 pack8 swap
   1 swap addressing-reg64
   swap
   ~ : provide-hex
@@ -1291,14 +1311,18 @@ s" :cc-greater" keyword
 : test-reg64-reg64
   ~ : 1 # # test-reg64-reg64
   3roll rex-w 0x85 pack8 3unroll
-  swap reg64 swap addressing-reg64 ;
+  swap reg64 swap addressing-reg64
+  ~ : swap-subitems
+  ;
 
 ~ (output point, condition code, target register -- output point)
 : set-reg8-cc
   ~ : 1 # # set-reg8-cc
   3roll 0x0F pack8
   3roll condition-code 0x90 opcodecc
-  swap reg8 3 0 3roll modrm ;
+  swap reg8 3 0 3roll modrm
+  ~ : swap-subitems
+  ;
 
 ~ (output point, address offset value, condition code -- output point)
 : jmp-cc-rel-imm8
@@ -1311,7 +1335,7 @@ s" :cc-greater" keyword
 ~ (output point, address offset value, condition code -- output point)
 : jmp-cc-rel-imm32
   ~ : 5 # # jmp-cc-rel-imm32
-  3unroll 0x0F pack8
+  3roll 0x0F pack8
   swap condition-code 0x70 opcodecc
   swap
   ~ : provide-hex