about summary refs log tree commit diff
diff options
context:
space:
mode:
authorIrene Knapp <ireneista@irenes.space>2026-09-12 20:44:52 -0700
committerIrene Knapp <ireneista@irenes.space>2026-09-12 20:44:52 -0700
commit010625ab1a82f95a2d5dd51939a25636c5fdcbf9 (patch)
tree1509f6ea18ab8b946e9b4a2675e2e67045946511
parentfb274a2b22f7a4c1f81b7639a80fb02ddc5bf402 (diff)
fully verify the hex-transformed output of all Evocation-assembly words
the verification included words that aren't used in Evocation itself. it also resulted in fixing several such words that were broken in ways that would have crashed. it was a very thorough verification.

do honor to the effort that was put into it by always verifying that changes to amd64.e don't break it, from now on :)

Force-Push: yes
Change-Id: Ia1904f4b35f90772fd9dce79a0274627c547edbf
-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