From 880b631f268d70cf0282203f001afc1f0cc7bf31 Mon Sep 17 00:00:00 2001 From: Irene Knapp Date: Tue, 8 Sep 2026 19:41:25 -0700 Subject: add keyword support to magic comment templates additionally, handle many (not yet all) of the keywords used by amd64 words this exposed an existing flaw in the metadata entry processing, which is now fixed as well. to wit: it's common for provide-substring entries to come after the comment entries they go with in the entry array, but this is valid because adjust-length commands can edit the length field of the comment entry afterwards, and the comment entry will be moved to after the provide-substring entry based on its final length, but this can't happen if the adjust-length array isn't able to find the comment entry it goes with, which may not be the most recent entry. so, the adjust-length command needs to scan backwards to find the most recent comment entry, not just the most recent entry. confused? don't worry... this CL includes documentation. wow. that was a lot. Change-Id: I01c574fca020fd2e3adaf335267264fdbc8b87f1 Force-Push: yes please --- amd64.e | 77 +++++++++++++++++++++++++++++++++++------------------------------ 1 file changed, 41 insertions(+), 36 deletions(-) (limited to 'amd64.e') diff --git a/amd64.e b/amd64.e index e11ec2e..1449bfd 100644 --- a/amd64.e +++ b/amd64.e @@ -190,6 +190,7 @@ s" :cc-greater" keyword ~ ~ (register -- 3-bit encoded value for register) : reg64 + ~ : provide-keyword dup :rax = { drop 0 exit } if dup :rcx = { drop 1 exit } if dup :rdx = { drop 2 exit } if @@ -202,6 +203,7 @@ s" :cc-greater" keyword ~ (register -- 3-bit encoded value for register) : extrareg64 + ~ : provide-keyword dup :r8 = { drop 0 exit } if dup :r9 = { drop 1 exit } if dup :r10 = { drop 2 exit } if @@ -214,6 +216,7 @@ s" :cc-greater" keyword ~ (register -- 3-bit encoded value for register) : reg32 + ~ : provide-keyword dup :eax = { drop 0 exit } if dup :ecx = { drop 1 exit } if dup :edx = { drop 2 exit } if @@ -226,6 +229,7 @@ s" :cc-greater" keyword ~ (register -- 3-bit encoded value for register) : reg16 + ~ : provide-keyword dup :ax = { drop 0 exit } if dup :cx = { drop 1 exit } if dup :dx = { drop 2 exit } if @@ -238,6 +242,7 @@ s" :cc-greater" keyword ~ (register -- 3-bit encoded value for register) : reg8 + ~ : provide-keyword dup :al = { drop 0 exit } if dup :cl = { drop 1 exit } if dup :dl = { drop 2 exit } if @@ -643,7 +648,7 @@ 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 @@ -651,12 +656,12 @@ s" :cc-greater" keyword ~ : provide-hex32 pack32 ; : mov-reg64-imm64 - ~ : 8 # mov-reg64-imm64 + ~ : 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 @@ -665,31 +670,31 @@ s" :cc-greater" keyword ~ (output point, source register, target register -- output point) : mov-reg64-reg64 - ~ : 1 mov-reg64-reg64 + ~ : 1 # # mov-reg64-reg64 3roll rex-w 0x89 pack8 3unroll swap reg64 swap addressing-reg64 ; : mov-indirect-reg64-reg64 - ~ : 1 mov-indirect-reg64-reg64 + ~ : 1 # # mov-indirect-reg64-reg64 3roll rex-w 0x89 pack8 3unroll swap reg64 swap addressing-indirect-reg64 ; ~ (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 ; ~ (output point, source register, target register -- output point) : mov-reg64-indirect-reg64 - ~ : 1 mov-reg64-indirect-reg64 + ~ : 1 # # mov-reg64-indirect-reg64 3roll rex-w 0x8B pack8 3unroll reg64 swap addressing-indirect-reg64 ; ~ (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 @@ -1000,25 +1005,25 @@ s" :cc-greater" keyword ~ (output point, source register, target register -- output point) : add-reg64-reg64 - ~ : 1 add-reg64-reg64 + ~ : 1 # # add-reg64-reg64 3roll rex-w 0x01 pack8 3unroll swap reg64 swap addressing-reg64 ; ~ (output point, source register, target register -- output point) : add-indirect-reg64-reg64 - ~ : 1 add-indirect-reg64-reg64 + ~ : 1 # # add-indirect-reg64-reg64 3roll rex-w 0x01 pack8 3unroll swap reg64 swap addressing-indirect-reg64 ; ~ (output point, source register, target register -- output point) : add-reg64-indirect-reg64 - ~ : 1 add-reg64-indirect-reg64 + ~ : 1 # # add-reg64-indirect-reg64 3roll rex-w 0x03 pack8 3unroll reg64 swap addressing-indirect-reg64 ; ~ (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 ~ : provide-hex8 @@ -1028,13 +1033,13 @@ s" :cc-greater" keyword ~ ~ (output point, source register, target register -- output point) : sub-reg64-reg64 - ~ : 1 sub-reg64-reg64 + ~ : 1 # # sub-reg64-reg64 3roll rex-w 0x2B pack8 3unroll reg64 swap addressing-reg64 ; ~ (output point, source register, target register -- output point) : sub-indirect-reg64-reg64 - ~ : 1 sub-indirect-reg64-reg64 + ~ : 1 # # sub-indirect-reg64-reg64 3roll rex-w 0x2B pack8 3unroll swap reg64 swap addressing-indirect-reg64 ; @@ -1042,7 +1047,7 @@ 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 ~ : provide-hex8 @@ -1052,7 +1057,7 @@ s" :cc-greater" keyword ~ ~ (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 ~ : provide-hex8 @@ -1062,7 +1067,7 @@ s" :cc-greater" keyword ~ ~ (output point, source register -- output point) : mul-reg64 - ~ : 1 mul-reg64 + ~ : 1 # mul-reg64 swap rex-w 0xF7 pack8 swap 4 swap addressing-reg64 ; @@ -1075,7 +1080,7 @@ s" :cc-greater" keyword ~ ~ (output point, divisor register -- output point) : divmod-reg64 - ~ : 1 divmod-reg64 + ~ : 1 # divmod-reg64 swap rex-w 0xF7 pack8 swap 6 swap addressing-reg64 ; @@ -1083,29 +1088,29 @@ s" :cc-greater" keyword ~ ~ (output point, divisor register -- output point) : idivmod-reg64 - ~ : 1 idivmod-reg64 + ~ : 1 # idivmod-reg64 swap rex-w 0xF7 pack8 swap 7 swap addressing-reg64 ; ~ (output point, target register -- output point) : inc-reg64 - ~ : 1 inc-reg64 + ~ : 1 # inc-reg64 swap rex-w 0xFF pack8 swap 0 swap addressing-reg64 ; ~ (output point, target register -- output point) : dec-reg64 - ~ : 1 dec-reg64 + ~ : 1 # dec-reg64 swap rex-w 0xFF pack8 swap 1 swap addressing-reg64 ; ~ (output point, source register, target register -- output point) : and-reg64-reg64 - ~ : 1 and-reg64-reg64 + ~ : 1 # # and-reg64-reg64 3roll rex-w 0x23 pack8 3unroll reg64 swap addressing-reg64 ; ~ (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 @@ -1114,13 +1119,13 @@ s" :cc-greater" keyword ~ (output point, source register, target register -- output point) : or-reg64-reg64 - ~ : 1 or-reg64-reg64 + ~ : 1 # # or-reg64-reg64 3roll rex-w 0x0B pack8 3unroll reg64 swap addressing-reg64 ; ~ (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 @@ -1129,19 +1134,19 @@ s" :cc-greater" keyword ~ (output point, source register, target register -- output point) : xor-reg64-reg64 - ~ : 1 xor-reg64-reg64 + ~ : 1 # # xor-reg64-reg64 3roll rex-w 0x33 pack8 3unroll reg64 swap addressing-reg64 ; ~ (output point, target register -- output point) : not-reg64 - ~ : 1 not-reg64 + ~ : 1 # not-reg64 swap rex-w 0xF7 pack8 swap 2 swap addressing-reg64 ; ~ (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 @@ -1150,7 +1155,7 @@ s" :cc-greater" keyword ~ (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 @@ -1159,7 +1164,7 @@ s" :cc-greater" keyword ~ (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 @@ -1168,7 +1173,7 @@ s" :cc-greater" keyword ~ (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 @@ -1188,7 +1193,7 @@ s" :cc-greater" keyword ~ ~ (output point, left register, right register -- output point) : cmp-reg64-reg64 - ~ : 1 cmp-reg64-reg64 + ~ : 1 # # cmp-reg64-reg64 3roll rex-w 0x3B pack8 3unroll reg64 swap addressing-reg64 ; @@ -1196,7 +1201,7 @@ 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 @@ -1214,13 +1219,13 @@ s" :cc-greater" keyword ~ ~ (output point, left register, right register -- output point) : test-reg64-reg64 - ~ : 1 test-reg64-reg64 + ~ : 1 # # test-reg64-reg64 3roll rex-w 0x85 pack8 3unroll swap reg64 swap addressing-reg64 ; ~ (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 ; @@ -1244,7 +1249,7 @@ s" :cc-greater" keyword ~ (output point, register -- output point) : jmp-abs-indirect-reg64 - ~ : 1 jmp-abs-indirect-reg64 + ~ : 1 # jmp-abs-indirect-reg64 swap 0xFF pack8 swap 4 swap addressing-indirect-reg64 ; -- cgit 1.4.1