Jelajahi Sumber

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 -

florian 7 tahun lalu
induk
melakukan
198c53a908

+ 28 - 6
compiler/utils/mkx86ins.pp

@@ -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)

+ 40 - 20
compiler/x86/x86ins.dat

@@ -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

+ 1 - 1
compiler/x86_64/x8664nop.inc

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

+ 147 - 7
compiler/x86_64/x8664tab.inc

@@ -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;
@@ -2824,16 +2887,16 @@
   (
     opcode  : A_MOV;
     ops     : 2;
-    optypes : (ot_reg64,ot_immediate,ot_none,ot_none);
-    code    : #214#8#184#45;
-    flags   : [if_x86_64,if_sm]
+    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;
-    optypes : (ot_rm_gpr or ot_bits32,ot_immediate,ot_none,ot_none);
-    code    : #213#1#199#128#33;
-    flags   : [if_386,if_sm]
+    optypes : (ot_reg64,ot_immediate,ot_none,ot_none);
+    code    : #214#8#184#45;
+    flags   : [if_x86_64,if_sm]
   ),
   (
     opcode  : A_MOV;
@@ -2842,6 +2905,13 @@
     code    : #214#1#199#128#173;
     flags   : [if_x86_64,if_sm]
   ),
+  (
+    opcode  : A_MOV;
+    ops     : 2;
+    optypes : (ot_rm_gpr or ot_bits32,ot_immediate,ot_none,ot_none);
+    code    : #213#1#199#128#33;
+    flags   : [if_386,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;