o patch by J. Gareth "Kit" Moreton, resolves partially issue #32037

* generate instructions with shorter imm on x86-64 if possible

git-svn-id: trunk@37376 -
This commit is contained in:
florian 2017-10-01 18:40:09 +00:00
parent 01ac3334af
commit 198c53a908
4 changed files with 217 additions and 35 deletions

View File

@ -16,7 +16,7 @@
program mkx86ins;
const
Version = '1.6.0';
Version = '1.6.1';
max_operands = 4;
var
s : string;
@ -205,6 +205,11 @@ var
optypes : array[1..max_operands] of string;
inschanges: string;
instrwritten: boolean;
SignCheck: Cardinal;
StrSearch: Integer;
const
SIGNED_INT = ' or ot_signed';
procedure DoWriteInstr;
@ -298,6 +303,7 @@ begin
end
else
begin
SignCheck := 0;
opcode:='A_'+Copy(s,2,i-2);
intopcode:=Copy(s,2,i-2);
{ intel conditional }
@ -402,8 +408,15 @@ begin
else
begin
case code of
12,13,14 :
optypes[code-11]:=optypes[code-11]+' or ot_signed';
12,13,14: {signed byte}
optypes[code-11]:=optypes[code-11]+SIGNED_INT;
172,173,174: {signed long}
begin
{ Addition by J. Gareth "Kit" Moreton }
{ See below for workaround for routines that take a 64-bit destination but a 32-bit operand in a non-decorated opcode }
SignCheck := code-171;
optypes[SignCheck]:=optypes[SignCheck]+SIGNED_INT;
end;
end;
end;
end;
@ -445,9 +458,18 @@ begin
end;
if hs<>'ND' then
begin
if flags<>'' then
flags:=flags+',';
flags:=flags+'if_'+lower(hs);
{ Addition by J. Gareth "Kit" Moreton }
{ Workaround for routines that take a 64-bit destination but a 32-bit operand in a non-decorated opcode }
if (lower(hs)='sm') and (SignCheck > 0) then
begin
{ Remove signed flag }
StrSearch := Pos(SIGNED_INT, optypes[SignCheck]);
Delete(optypes[SignCheck], StrSearch, Length(SIGNED_INT));
end;
if flags<>'' then
flags:=flags+',';
flags:=flags+'if_'+lower(hs);
end;
if (s[i]=',') and (i<=length(s)) then
inc(i)

View File

@ -41,9 +41,11 @@ rm8,reg8 \1\x10\101 8086
reg8,rm8 \1\x12\110 8086
rm16|32|64,imm8 \320\1\x83\202\15 8086
reg_eax,imm \325\1\x15\41 386,SM
reg_rax,imm \326\1\x15\255 X86_64,SM
reg_rax,imm \326\1\x15\255 X86_64,SD
reg_rax,imm \326\1\x15\255 X86_64,SM ; 64-bit undecorated workaround - Kit
rm32,imm \325\1\x81\202\41 386,SM
rm64,imm \326\1\x81\202\255 X86_64,SM
rm64,imm \326\1\x81\202\255 X86_64,SD
rm64,imm \326\1\x81\202\255 X86_64,SM ; 64-bit undecorated workaround - Kit
reg_ax,imm \324\1\x15\31 8086,SW
rm16,imm \324\1\x81\202\31 8086,SW
reg_al,imm \1\x14\21 8086,SB
@ -57,9 +59,11 @@ rm8,reg8 \1\x00\101 8086
reg8,rm8 \1\x02\110 8086,SM
rm16|32|64,imm8 \320\1\x83\200\15 8086
reg_eax,imm \320\1\x05\41 386,SM
reg_rax,imm \326\1\x05\255 X86_64,SM
reg_rax,imm \326\1\x05\255 X86_64,SD
reg_rax,imm \326\1\x05\255 X86_64,SM ; 64-bit undecorated workaround - Kit
rm32,imm \325\1\x81\200\41 386,SM
rm64,imm \326\1\x81\200\255 X86_64,SM
rm64,imm \326\1\x81\200\255 X86_64,SD
rm64,imm \326\1\x81\200\255 X86_64,SM ; 64-bit undecorated workaround - Kit
reg_ax,imm \324\1\x05\31 8086,SW
rm16,imm \324\1\x81\200\31 8086,SW
reg_al,imm \1\x04\21 8086,SB
@ -73,9 +77,11 @@ rm8,reg8 \1\x20\101 8086
reg8,rm8 \1\x22\110 8086
rm16|32|64,imm8 \320\1\x83\204\15 8086
reg_eax,imm \325\1\x25\41 386,SM
reg_rax,imm \326\1\x25\255 X86_64,SM
reg_rax,imm \326\1\x25\255 X86_64,SD
reg_rax,imm \326\1\x25\255 X86_64,SM ; 64-bit undecorated workaround - Kit
rm32,imm \325\1\x81\204\41 386,SM
rm64,imm \326\1\x81\204\255 X86_64,SM
rm64,imm \326\1\x81\204\255 X86_64,SD
rm64,imm \326\1\x81\204\255 X86_64,SM ; 64-bit undecorated workaround - Kit
reg_ax,imm \324\1\x25\31 8086,SW
rm16,imm \324\1\x81\204\31 8086,SW
reg_al,imm \1\x24\21 8086,SB
@ -181,9 +187,11 @@ rm8,reg8 \1\x38\101 8086
reg8,rm8 \1\x3A\110 8086
rm16|32|64,imm8 \320\1\x83\207\15 8086
reg_eax,imm \325\1\x3D\41 386,SM
reg_rax,imm \326\1\x3D\255 X86_64,SM
reg_rax,imm \326\1\x3D\255 X86_64,SD
reg_rax,imm \326\1\x3D\255 X86_64,SM ; 64-bit undecorated workaround - Kit
rm32,imm \325\1\x81\207\41 386,SM
rm64,imm \326\1\x81\207\255 X86_64,SM
rm64,imm \326\1\x81\207\255 X86_64,SD
rm64,imm \326\1\x81\207\255 X86_64,SM ; 64-bit undecorated workaround - Kit
reg_ax,imm \324\1\x3D\31 8086,SW
rm16,imm \324\1\x81\207\31 8086,SW
reg_al,imm \1\x3C\21 8086,SB
@ -794,7 +802,8 @@ reg32|64,regmem,imm8 \320\1\x6B\110\16 386,SM
reg32|64,regmem,imm \320\1\x69\110\42 386,SM,SD,AR2
reg32|64,imm8 \320\1\x6B\100\15 386
reg32,imm \325\1\x69\100\41 386,SD
reg64,imm \326\1\x69\100\255 X86_64
reg64,imm \326\1\x69\100\255 X86_64,SD
reg64,imm \326\1\x69\100\255 X86_64,SM ; 64-bit undecorated workaround - Kit
reg16,regmem,imm8 \324\1\x6B\110\16 186,SM
reg16,regmem,imm \324\1\x69\110\32 186,SM,SW,AR2
reg16,imm8 \324\1\x6B\100\15 186
@ -1052,9 +1061,10 @@ reg_eax,mem_offs \325\1\xA1\45 386,SM
reg_rax,mem_offs \326\1\xA1\45 X86_64,SM
reg16|32|64,regmem \320\1\x8B\110 8086,SM
reg32,imm \325\10\xB8\41 386,SD
rm64,imm \326\1\xC7\200\255 X86_64,SD ; Shorter form for writing a 32-bit signed integer to a 64-bit register
reg64,imm \326\10\xB8\55 X86_64,SM
rm64,imm \326\1\xC7\200\255 X86_64,SM ; 64-bit undecorated workaround - Kit
rm32,imm \325\1\xC7\200\41 386,SM
rm64,imm \326\1\xC7\200\255 X86_64,SM
reg16,imm \324\10\xB8\31 8086,SW
rm16,imm \324\1\xC7\200\31 8086,SW
mem_offs,reg_al \1\xA2\44 8086,SM
@ -1165,9 +1175,11 @@ rm8,reg8 \1\x08\101 8086
reg8,rm8 \1\x0A\110 8086,SM
rm16|32|64,imm8 \320\1\x83\201\15 8086
reg_eax,imm \325\1\x0D\41 386,SM
reg_rax,imm \326\1\x0D\255 X86_64,SM
reg_rax,imm \326\1\x0D\255 X86_64,SD
reg_rax,imm \326\1\x0D\255 X86_64,SM ; 64-bit undecorated workaround - Kit
rm32,imm \325\1\x81\201\41 386,SM
rm64,imm \326\1\x81\201\255 X86_64,SM
rm64,imm \326\1\x81\201\255 X86_64,SD
rm64,imm \326\1\x81\201\255 X86_64,SM ; 64-bit undecorated workaround - Kit
reg_ax,imm \324\1\x0D\31 8086,SW
rm16,imm \324\1\x81\201\31 8086,SW
reg_al,imm \1\x0C\21 8086,SB
@ -1785,9 +1797,11 @@ rm16|32|64,imm8 \320\1\x83\203\15 8086
rm8,reg8 \1\x18\101 8086
reg8,rm8 \1\x1A\110 8086,SM
reg_eax,imm \325\1\x1D\41 386,SM
reg_rax,imm \326\1\x1D\255 X86_64,SM
reg_rax,imm \326\1\x1D\255 X86_64,SD
reg_rax,imm \326\1\x1D\255 X86_64,SM ; 64-bit undecorated workaround - Kit
rm32,imm \320\1\x81\203\41 386,SM
rm64,imm \326\1\x81\203\255 X86_64,SM
rm64,imm \326\1\x81\203\255 X86_64,SD
rm64,imm \326\1\x81\203\255 X86_64,SM ; 64-bit undecorated workaround - Kit
reg_ax,imm \324\1\x1D\31 8086,SW
rm16,imm \320\1\x81\203\31 8086,SW
reg_al,imm \1\x1C\21 8086,SB
@ -1927,9 +1941,11 @@ rm8,reg8 \1\x28\101 8086
reg8,rm8 \1\x2A\110 8086,SM
rm16|32|64,imm8 \320\1\x83\205\15 8086
reg_eax,imm \325\1\x2D\41 386,SM
reg_rax,imm \326\1\x2D\255 X86_64,SM
reg_rax,imm \326\1\x2D\255 X86_64,SD
reg_rax,imm \326\1\x2D\255 X86_64,SM ; 64-bit undecorated workaround - Kit
rm32,imm \320\1\x81\205\41 386,SM
rm64,imm \326\1\x81\205\255 X86_64,SM
rm64,imm \326\1\x81\205\255 X86_64,SD
rm64,imm \326\1\x81\205\255 X86_64,SM ; 64-bit undecorated workaround - Kit
reg_ax,imm \324\1\x2D\31 8086,SW
rm16,imm \324\1\x81\205\31 8086,SW
reg_al,imm \1\x2C\21 8086,SB
@ -1969,11 +1985,13 @@ regmem,reg16|32|64 \320\1\x85\101 8086,SM
reg16|32|64,mem \320\1\x85\110 8086,SM
reg8,reg8 \1\x84\101 8086
rm8,reg8 \1\x84\101 8086,SM
reg_rax,imm \326\1\xA9\255 X86_64,SM
reg_rax,imm \326\1\xA9\255 X86_64,SD
reg_rax,imm \326\1\xA9\255 X86_64,SM ; 64-bit undecorated workaround - Kit
reg_eax,imm \325\1\xA9\41 386,SM
reg_ax,imm \324\1\xA9\31 8086,SM
reg_al,imm \1\xA8\21 8086,SM
rm64,imm \326\1\xF7\200\255 X86_64,SM
rm64,imm \326\1\xF7\200\255 X86_64,SD
rm64,imm \326\1\xF7\200\255 X86_64,SM ; 64-bit undecorated workaround - Kit
rm32,imm \325\1\xF7\200\41 386,SM
rm16,imm \324\1\xF7\200\31 8086,SM
rm8,imm \1\xF6\200\21 8086,SM
@ -2069,9 +2087,11 @@ rm8,reg8 \1\x30\101 8086
reg8,rm8 \1\x32\110 8086
rm16|32|64,imm8 \320\1\x83\206\15 8086
reg_eax,imm \325\1\x35\41 386,SM
reg_rax,imm \326\1\x35\255 X86_64,SM
reg_rax,imm \326\1\x35\255 X86_64,SD
reg_rax,imm \326\1\x35\255 X86_64,SM ; 64-bit undecorated workaround - Kit
rm32,imm \320\1\x81\206\41 386,SM
rm64,imm \326\1\x81\206\255 X86_64,SM
rm64,imm \326\1\x81\206\255 X86_64,SD
rm64,imm \326\1\x81\206\255 X86_64,SM ; 64-bit undecorated workaround - Kit
reg_ax,imm \324\1\x35\31 8086,SW
rm16,imm \324\1\x81\206\31 8086,SW
reg_al,imm \1\x34\21 8086,SB

View File

@ -1,2 +1,2 @@
{ don't edit, this file is generated from x86ins.dat }
1981;
2001;

View File

@ -49,6 +49,13 @@
code : #213#1#21#33;
flags : [if_386,if_sm]
),
(
opcode : A_ADC;
ops : 2;
optypes : (ot_reg_rax,ot_immediate or ot_signed,ot_none,ot_none);
code : #214#1#21#173;
flags : [if_x86_64,if_sd]
),
(
opcode : A_ADC;
ops : 2;
@ -63,6 +70,13 @@
code : #213#1#129#130#33;
flags : [if_386,if_sm]
),
(
opcode : A_ADC;
ops : 2;
optypes : (ot_rm_gpr or ot_bits64,ot_immediate or ot_signed,ot_none,ot_none);
code : #214#1#129#130#173;
flags : [if_x86_64,if_sd]
),
(
opcode : A_ADC;
ops : 2;
@ -140,6 +154,13 @@
code : #208#1#5#33;
flags : [if_386,if_sm]
),
(
opcode : A_ADD;
ops : 2;
optypes : (ot_reg_rax,ot_immediate or ot_signed,ot_none,ot_none);
code : #214#1#5#173;
flags : [if_x86_64,if_sd]
),
(
opcode : A_ADD;
ops : 2;
@ -154,6 +175,13 @@
code : #213#1#129#128#33;
flags : [if_386,if_sm]
),
(
opcode : A_ADD;
ops : 2;
optypes : (ot_rm_gpr or ot_bits64,ot_immediate or ot_signed,ot_none,ot_none);
code : #214#1#129#128#173;
flags : [if_x86_64,if_sd]
),
(
opcode : A_ADD;
ops : 2;
@ -231,6 +259,13 @@
code : #213#1#37#33;
flags : [if_386,if_sm]
),
(
opcode : A_AND;
ops : 2;
optypes : (ot_reg_rax,ot_immediate or ot_signed,ot_none,ot_none);
code : #214#1#37#173;
flags : [if_x86_64,if_sd]
),
(
opcode : A_AND;
ops : 2;
@ -245,6 +280,13 @@
code : #213#1#129#132#33;
flags : [if_386,if_sm]
),
(
opcode : A_AND;
ops : 2;
optypes : (ot_rm_gpr or ot_bits64,ot_immediate or ot_signed,ot_none,ot_none);
code : #214#1#129#132#173;
flags : [if_x86_64,if_sd]
),
(
opcode : A_AND;
ops : 2;
@ -490,6 +532,13 @@
code : #213#1#61#33;
flags : [if_386,if_sm]
),
(
opcode : A_CMP;
ops : 2;
optypes : (ot_reg_rax,ot_immediate or ot_signed,ot_none,ot_none);
code : #214#1#61#173;
flags : [if_x86_64,if_sd]
),
(
opcode : A_CMP;
ops : 2;
@ -504,6 +553,13 @@
code : #213#1#129#135#33;
flags : [if_386,if_sm]
),
(
opcode : A_CMP;
ops : 2;
optypes : (ot_rm_gpr or ot_bits64,ot_immediate or ot_signed,ot_none,ot_none);
code : #214#1#129#135#173;
flags : [if_x86_64,if_sd]
),
(
opcode : A_CMP;
ops : 2;
@ -2261,12 +2317,19 @@
code : #213#1#105#64#33;
flags : [if_386,if_sd]
),
(
opcode : A_IMUL;
ops : 2;
optypes : (ot_reg64,ot_immediate or ot_signed,ot_none,ot_none);
code : #214#1#105#64#173;
flags : [if_x86_64,if_sd]
),
(
opcode : A_IMUL;
ops : 2;
optypes : (ot_reg64,ot_immediate,ot_none,ot_none);
code : #214#1#105#64#173;
flags : [if_x86_64]
flags : [if_x86_64,if_sm]
),
(
opcode : A_IMUL;
@ -2821,6 +2884,13 @@
code : #213#8#184#33;
flags : [if_386,if_sd]
),
(
opcode : A_MOV;
ops : 2;
optypes : (ot_rm_gpr or ot_bits64,ot_immediate or ot_signed,ot_none,ot_none);
code : #214#1#199#128#173;
flags : [if_x86_64,if_sd]
),
(
opcode : A_MOV;
ops : 2;
@ -2828,6 +2898,13 @@
code : #214#8#184#45;
flags : [if_x86_64,if_sm]
),
(
opcode : A_MOV;
ops : 2;
optypes : (ot_rm_gpr or ot_bits64,ot_immediate,ot_none,ot_none);
code : #214#1#199#128#173;
flags : [if_x86_64,if_sm]
),
(
opcode : A_MOV;
ops : 2;
@ -2835,13 +2912,6 @@
code : #213#1#199#128#33;
flags : [if_386,if_sm]
),
(
opcode : A_MOV;
ops : 2;
optypes : (ot_rm_gpr or ot_bits64,ot_immediate,ot_none,ot_none);
code : #214#1#199#128#173;
flags : [if_x86_64,if_sm]
),
(
opcode : A_MOV;
ops : 2;
@ -3248,6 +3318,13 @@
code : #213#1#13#33;
flags : [if_386,if_sm]
),
(
opcode : A_OR;
ops : 2;
optypes : (ot_reg_rax,ot_immediate or ot_signed,ot_none,ot_none);
code : #214#1#13#173;
flags : [if_x86_64,if_sd]
),
(
opcode : A_OR;
ops : 2;
@ -3262,6 +3339,13 @@
code : #213#1#129#129#33;
flags : [if_386,if_sm]
),
(
opcode : A_OR;
ops : 2;
optypes : (ot_rm_gpr or ot_bits64,ot_immediate or ot_signed,ot_none,ot_none);
code : #214#1#129#129#173;
flags : [if_x86_64,if_sd]
),
(
opcode : A_OR;
ops : 2;
@ -4893,6 +4977,13 @@
code : #213#1#29#33;
flags : [if_386,if_sm]
),
(
opcode : A_SBB;
ops : 2;
optypes : (ot_reg_rax,ot_immediate or ot_signed,ot_none,ot_none);
code : #214#1#29#173;
flags : [if_x86_64,if_sd]
),
(
opcode : A_SBB;
ops : 2;
@ -4907,6 +4998,13 @@
code : #208#1#129#131#33;
flags : [if_386,if_sm]
),
(
opcode : A_SBB;
ops : 2;
optypes : (ot_rm_gpr or ot_bits64,ot_immediate or ot_signed,ot_none,ot_none);
code : #214#1#129#131#173;
flags : [if_x86_64,if_sd]
),
(
opcode : A_SBB;
ops : 2;
@ -5278,6 +5376,13 @@
code : #213#1#45#33;
flags : [if_386,if_sm]
),
(
opcode : A_SUB;
ops : 2;
optypes : (ot_reg_rax,ot_immediate or ot_signed,ot_none,ot_none);
code : #214#1#45#173;
flags : [if_x86_64,if_sd]
),
(
opcode : A_SUB;
ops : 2;
@ -5292,6 +5397,13 @@
code : #208#1#129#133#33;
flags : [if_386,if_sm]
),
(
opcode : A_SUB;
ops : 2;
optypes : (ot_rm_gpr or ot_bits64,ot_immediate or ot_signed,ot_none,ot_none);
code : #214#1#129#133#173;
flags : [if_x86_64,if_sd]
),
(
opcode : A_SUB;
ops : 2;
@ -5404,6 +5516,13 @@
code : #1#132#65;
flags : [if_8086,if_sm]
),
(
opcode : A_TEST;
ops : 2;
optypes : (ot_reg_rax,ot_immediate or ot_signed,ot_none,ot_none);
code : #214#1#169#173;
flags : [if_x86_64,if_sd]
),
(
opcode : A_TEST;
ops : 2;
@ -5432,6 +5551,13 @@
code : #1#168#17;
flags : [if_8086,if_sm]
),
(
opcode : A_TEST;
ops : 2;
optypes : (ot_rm_gpr or ot_bits64,ot_immediate or ot_signed,ot_none,ot_none);
code : #214#1#247#128#173;
flags : [if_x86_64,if_sd]
),
(
opcode : A_TEST;
ops : 2;
@ -5789,6 +5915,13 @@
code : #213#1#53#33;
flags : [if_386,if_sm]
),
(
opcode : A_XOR;
ops : 2;
optypes : (ot_reg_rax,ot_immediate or ot_signed,ot_none,ot_none);
code : #214#1#53#173;
flags : [if_x86_64,if_sd]
),
(
opcode : A_XOR;
ops : 2;
@ -5803,6 +5936,13 @@
code : #208#1#129#134#33;
flags : [if_386,if_sm]
),
(
opcode : A_XOR;
ops : 2;
optypes : (ot_rm_gpr or ot_bits64,ot_immediate or ot_signed,ot_none,ot_none);
code : #214#1#129#134#173;
flags : [if_x86_64,if_sd]
),
(
opcode : A_XOR;
ops : 2;