diff options
Diffstat (limited to 'amd64.e')
| -rw-r--r-- | amd64.e | 77 |
1 files changed, 41 insertions, 36 deletions
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 ; |