about summary refs log tree commit diff
path: root/amd64.e
diff options
context:
space:
mode:
authorIrene Knapp <ireneista@irenes.space>2026-09-08 18:32:42 -0700
committerIrene Knapp <ireneista@irenes.space>2026-09-08 18:34:33 -0700
commite03216ba8bbc7547b1451ed99497c0693446983b (patch)
treecfdc240bbec1ca905ecc70a342b3dbe21df067b5 /amd64.e
parentecb9b0a2c65743c8d072eb1e8f13f7afbc68d505 (diff)
add "provide" words for all sizes of hex literal, and use them in amd64
Force-Push: yes
Change-Id: Ibdc4e05f8c63f0b4b6b8e504f89e053e6cd3a912
Diffstat (limited to 'amd64.e')
-rw-r--r--amd64.e120
1 files changed, 80 insertions, 40 deletions
diff --git a/amd64.e b/amd64.e
index d2fa2cd..e11ec2e 100644
--- a/amd64.e
+++ b/amd64.e
@@ -591,8 +591,10 @@ s" :cc-greater" keyword
 
 ~ (output point, immediate value -- output point)
 : push-imm32-extended64
-  ~ : 5 push-imm32-extended64
-  swap 0x68 pack8 swap pack32 ;
+  ~ : 5 # push-imm32-extended64
+  swap 0x68 pack8 swap
+  ~ : provide-hex32
+  pack32 ;
 
 ~ (output point, source register, source displacement value, target register
 ~  -- output point)
@@ -641,19 +643,25 @@ s" :cc-greater" keyword
 
 ~ (output point, immediate value, register -- output point)
 : mov-reg64-imm32
-  ~ : 5 mov-reg64-imm32
+  ~ : 5 # mov-reg64-imm32
   3roll
   rex-w 0xC7 pack8 swap
   0 swap addressing-reg64
-  swap pack32 ;
+  swap
+  ~ : provide-hex32
+  pack32 ;
 : mov-reg64-imm64
-  ~ : 8 mov-reg64-imm64
-  3roll rex-w swap reg64 0xB8 opcodereg swap pack64 ;
+  ~ : 8 # mov-reg64-imm64
+  3roll rex-w swap reg64 0xB8 opcodereg swap
+  ~ : provide-hex64
+  pack64 ;
 : mov-extrareg64-imm64
-  ~ : 8 mov-extrareg64-imm64
+  ~ : 8 # mov-extrareg64-imm64
   ~   Note the use of the B rex bit here; this instruction puts the register
   ~ number in the opcode field, so it uses Table 3-1.
-  3roll rex-wb swap extrareg64 0xB8 opcodereg swap pack64 ;
+  3roll rex-wb swap extrareg64 0xB8 opcodereg swap
+  ~ : provide-hex64
+  pack64 ;
 
 ~ (output point, source register, target register -- output point)
 : mov-reg64-reg64
@@ -780,8 +788,10 @@ s" :cc-greater" keyword
 ~ (output point, source register, source displacement value, target register
 ~  -- output point)
 : mov-reg8-disp8-reg64
-  ~ : 2 mov-reg8-disp8-reg64
-  4 roll pack8 0x8A pack8 4 unroll
+  ~ : 2 # mov-reg8-disp8-reg64
+  4 roll
+  ~ : provide-hex8
+  pack8 0x8A pack8 4 unroll
   reg8 3unroll addressing-disp8-reg64 ;
 
 ~ (output point, source register, target register -- output point)
@@ -1008,9 +1018,11 @@ s" :cc-greater" keyword
 
 ~ (output point, immediate value, target register -- output point)
 : add-reg64-imm8
-  ~ : 2 add-reg64-imm8
+  ~ : 2 # add-reg64-imm8
   3roll rex-w 0x83 pack8 swap 0 swap addressing-reg64
-  swap pack8 ;
+  swap
+  ~ : provide-hex8
+  pack8 ;
 
 ~ See above re: parameter order.
 ~
@@ -1030,17 +1042,21 @@ s" :cc-greater" keyword
 ~
 ~ (output point, immediate value, target register -- output point)
 : sub-reg64-imm8
-  ~ : 2 sub-reg64-imm8
+  ~ : 2 # sub-reg64-imm8
   3roll rex-w 0x83 pack8 swap 5 swap addressing-reg64
-  swap pack8 ;
+  swap
+  ~ : provide-hex8
+  pack8 ;
 
 ~ See above re: parameter order.
 ~
 ~ (output point, source register, target register -- output point)
 : sbb-reg64-imm8
-  ~ : 2 sbb-reg64-imm8
+  ~ : 2 # sbb-reg64-imm8
   3roll rex-w 0x83 pack8 swap 3 swap addressing-reg64
-  swap pack8 ;
+  swap
+  ~ : provide-hex8
+  pack8 ;
 
 ~  The target register is always rax.
 ~
@@ -1089,10 +1105,12 @@ s" :cc-greater" keyword
 
 ~ (output point, source value, target register -- output point)
 : and-reg64-imm8
-  ~ : 2 and-reg64-imm8
+  ~ : 2 # and-reg64-imm8
   3roll rex-w 0x83 pack8 swap
   4 swap addressing-reg64
-  swap pack8 ;
+  swap
+  ~ : provide-hex8
+  pack8 ;
 
 ~ (output point, source register, target register -- output point)
 : or-reg64-reg64
@@ -1102,10 +1120,12 @@ s" :cc-greater" keyword
 
 ~ (output point, source value, target register -- output point)
 : or-reg64-imm8
-  ~ : 2 or-reg64-imm8
+  ~ : 2 # or-reg64-imm8
   3roll rex-w 0x83 pack8 swap
   1 swap addressing-reg64
-  swap pack8 ;
+  swap
+  ~ : provide-hex8
+  pack8 ;
 
 ~ (output point, source register, target register -- output point)
 : xor-reg64-reg64
@@ -1121,31 +1141,39 @@ s" :cc-greater" keyword
 
 ~ (output point, bit count, target register -- output point)
 : rol-reg64-imm8
-  ~ : 2 rol-reg64-imm8
+  ~ : 2 # rol-reg64-imm8
   3roll rex-w 0xC1 pack8 swap
   0 swap addressing-reg64
-  swap pack8 ;
+  swap
+  ~ : provide-hex8
+  pack8 ;
 
 ~ (output point, bit count, target register -- output point)
 : rol-reg8-imm8
-  ~ : 2 rol-reg8-imm8
+  ~ : 2 # rol-reg8-imm8
   3roll 0xC0 pack8 swap
   0 swap addressing-reg8
-  swap pack8 ;
+  swap
+  ~ : provide-hex8
+  pack8 ;
 
 ~ (output point, bit count, target register -- output point)
 : ror-reg64-imm8
-  ~ : 1 ror-reg64-imm8
+  ~ : 1 # ror-reg64-imm8
   3roll rex-w 0xC1 swap
   1 swap addressing-reg64
-  swap pack8 ;
+  swap
+  ~ : provide-hex8
+  pack8 ;
 
 ~ (output point, bit count, target register -- output point)
 : ror-reg8-imm8
-  ~ : 2 ror-reg8-imm8
+  ~ : 2 # ror-reg8-imm8
   3roll 0xC0 pack8 swap
   1 swap addressing-reg64
-  swap pack8 ;
+  swap
+  ~ : provide-hex8
+  pack8 ;
 
 
 ~ Control flow instructions
@@ -1168,12 +1196,14 @@ s" :cc-greater" keyword
 ~
 ~ (output point, immediate value, target register -- output point)
 : cmp-reg64-imm8
-  ~ : 2 cmp-reg64-imm8
+  ~ : 2 # cmp-reg64-imm8
   3roll rex-w 0x83 pack8
   ~ (immediate value, register, output point)
   swap 7 swap addressing-reg64
   ~ ( output point, immediate value)
-  swap pack8 ;
+  swap
+  ~ : provide-hex8
+  pack8 ;
 
 ~   Pretend to bitwise-and left with right, and set the flags the same way as
 ~ if we actually had.
@@ -1197,16 +1227,20 @@ s" :cc-greater" keyword
 
 ~ (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 pack8 ;
+  swap
+  ~ : provide-hex8
+  pack8 ;
 
 ~ (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 pack32 ;
+  swap
+  ~ : provide-hex32
+  pack32 ;
 
 ~ (output point, register -- output point)
 : jmp-abs-indirect-reg64
@@ -1216,23 +1250,29 @@ s" :cc-greater" keyword
 
 ~ (output point, address offset value -- output point)
 : jmp-rel-imm8
-  ~ : 2 jmp-rel-imm8
+  ~ : 2 # jmp-rel-imm8
   swap 0xEB pack8
-  swap pack8 ;
+  swap
+  ~ : provide-hex8
+  pack8 ;
 
 ~ (output point, address offset value -- output point)
 : jmp-rel-imm32
-  ~ : 5 jmp-rel-imm32
+  ~ : 5 # jmp-rel-imm32
   swap 0xE9 pack8
-  swap pack32 ;
+  swap
+  ~ : provide-hex32
+  pack32 ;
 
 ~ This is technically a "near" call. The name intentionally doesn't say so.
 ~
 ~ (output point, address offset value -- output point)
 : call-rel-imm32
-  ~ : 5 call-rel-imm32
+  ~ : 5 # call-rel-imm32
   swap 0xE8 pack8
-  swap pack32 ;
+  swap
+  ~ : provide-hex32
+  pack32 ;
 
 ~ Similarly, this is a "near" return.
 ~