From cdf13a70a8840d5f79c16c3d4b0aa84d53cbc46e Mon Sep 17 00:00:00 2001 From: Irene Knapp Date: Tue, 8 Sep 2026 22:44:30 -0700 Subject: handle the rest of the fields (keywords and numbers) in amd64.e add a provide-decimal variant of the magic-comment provide command family note that the fields are all printed in a wrong order, at present Force-Push: yes Change-Id: I01f5cbb86f61e78ce652c54fc8b29b88efd1b2b6 --- amd64.e | 66 +++++++++++++++++++++++++++++++++++++---------------------------- 1 file changed, 38 insertions(+), 28 deletions(-) (limited to 'amd64.e') 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 -- cgit 1.4.1