浏览代码

* mkx86ins.pp: ot_signed flag must not be set by literal opcodes. Ignore 2- and 3-byte literal sequences, not just 1-byte ones.
* x86ins.dat: replaced codes \17 with literal zeros. They aren't necessary for FPC, and they were removed from NASM quite a while ago.

git-svn-id: trunk@17430 -

sergei 14 年之前
父节点
当前提交
9bb0dc6cfe
共有 4 个文件被更改,包括 72 次插入67 次删除
  1. 20 20
      compiler/i386/i386tab.inc
  2. 17 12
      compiler/utils/mkx86ins.pp
  3. 15 15
      compiler/x86/x86ins.dat
  4. 20 20
      compiler/x86_64/x8664tab.inc

+ 20 - 20
compiler/i386/i386tab.inc

@@ -144,7 +144,7 @@
     opcode  : A_ADD;
     ops     : 2;
     optypes : (ot_regmem or ot_bits8,ot_reg8,ot_none);
-    code    : #192#211#15#65;
+    code    : #192#211#1#0#65;
     flags   : if_8086
   ),
   (
@@ -1333,7 +1333,7 @@
   (
     opcode  : A_FEMMS;
     ops     : 0;
-    optypes : (ot_none,ot_none,ot_none or ot_signed);
+    optypes : (ot_none,ot_none,ot_none);
     code    : #2#15#14;
     flags   : if_pent or if_3dnow
   ),
@@ -2727,7 +2727,7 @@
     opcode  : A_LLDT;
     ops     : 1;
     optypes : (ot_regmem or ot_bits16,ot_none,ot_none);
-    code    : #192#1#15#15#130;
+    code    : #192#2#15#0#130;
     flags   : if_286 or if_prot or if_priv
   ),
   (
@@ -2902,7 +2902,7 @@
     opcode  : A_LTR;
     ops     : 1;
     optypes : (ot_regmem or ot_bits16,ot_none,ot_none);
-    code    : #192#1#15#15#131;
+    code    : #192#2#15#0#131;
     flags   : if_286 or if_prot or if_priv
   ),
   (
@@ -4595,14 +4595,14 @@
   (
     opcode  : A_PREFETCH;
     ops     : 1;
-    optypes : (ot_memory,ot_none or ot_signed,ot_none);
+    optypes : (ot_memory,ot_none,ot_none);
     code    : #2#15#13#128;
     flags   : if_pent or if_3dnow or if_sm
   ),
   (
     opcode  : A_PREFETCHW;
     ops     : 1;
-    optypes : (ot_memory,ot_none or ot_signed,ot_none);
+    optypes : (ot_memory,ot_none,ot_none);
     code    : #2#15#13#129;
     flags   : if_pent or if_3dnow or if_sm
   ),
@@ -6108,14 +6108,14 @@
     opcode  : A_SLDT;
     ops     : 1;
     optypes : (ot_memory,ot_none,ot_none);
-    code    : #192#1#15#15#128;
+    code    : #192#2#15#0#128;
     flags   : if_286
   ),
   (
     opcode  : A_SLDT;
     ops     : 1;
     optypes : (ot_reg16 or ot_bits32 or ot_bits64,ot_none,ot_none);
-    code    : #208#1#15#15#128;
+    code    : #208#2#15#0#128;
     flags   : if_286
   ),
   (
@@ -6192,14 +6192,14 @@
     opcode  : A_STR;
     ops     : 1;
     optypes : (ot_memory,ot_none,ot_none);
-    code    : #192#1#15#15#129;
+    code    : #192#2#15#0#129;
     flags   : if_286 or if_prot
   ),
   (
     opcode  : A_STR;
     ops     : 1;
     optypes : (ot_reg16 or ot_bits32 or ot_bits64,ot_none,ot_none);
-    code    : #208#1#15#15#129;
+    code    : #208#2#15#0#129;
     flags   : if_286 or if_prot
   ),
   (
@@ -6465,42 +6465,42 @@
     opcode  : A_VERR;
     ops     : 1;
     optypes : (ot_memory,ot_none,ot_none);
-    code    : #192#1#15#15#132;
+    code    : #192#2#15#0#132;
     flags   : if_286 or if_prot
   ),
   (
     opcode  : A_VERR;
     ops     : 1;
     optypes : (ot_memory or ot_bits16,ot_none,ot_none);
-    code    : #192#1#15#15#132;
+    code    : #192#2#15#0#132;
     flags   : if_286 or if_prot
   ),
   (
     opcode  : A_VERR;
     ops     : 1;
     optypes : (ot_reg16,ot_none,ot_none);
-    code    : #192#1#15#15#132;
+    code    : #192#2#15#0#132;
     flags   : if_286 or if_prot
   ),
   (
     opcode  : A_VERW;
     ops     : 1;
     optypes : (ot_memory,ot_none,ot_none);
-    code    : #192#1#15#15#133;
+    code    : #192#2#15#0#133;
     flags   : if_286 or if_prot
   ),
   (
     opcode  : A_VERW;
     ops     : 1;
     optypes : (ot_memory or ot_bits16,ot_none,ot_none);
-    code    : #192#1#15#15#133;
+    code    : #192#2#15#0#133;
     flags   : if_286 or if_prot
   ),
   (
     opcode  : A_VERW;
     ops     : 1;
     optypes : (ot_reg16,ot_none,ot_none);
-    code    : #192#1#15#15#133;
+    code    : #192#2#15#0#133;
     flags   : if_286 or if_prot
   ),
   (
@@ -10104,14 +10104,14 @@
   (
     opcode  : A_BLENDPS;
     ops     : 3;
-    optypes : (ot_xmmreg or ot_signed,ot_xmmreg,ot_immediate);
+    optypes : (ot_xmmreg,ot_xmmreg,ot_immediate);
     code    : #1#102#217#3#15#58#12#72#22;
     flags   : if_sse4
   ),
   (
     opcode  : A_BLENDPS;
     ops     : 3;
-    optypes : (ot_xmmreg or ot_signed,ot_memory,ot_immediate);
+    optypes : (ot_xmmreg,ot_memory,ot_immediate);
     code    : #1#102#193#217#3#15#58#12#72#22;
     flags   : if_sse4
   ),
@@ -10265,14 +10265,14 @@
   (
     opcode  : A_PBLENDW;
     ops     : 3;
-    optypes : (ot_xmmreg,ot_xmmreg,ot_immediate or ot_signed);
+    optypes : (ot_xmmreg,ot_xmmreg,ot_immediate);
     code    : #1#102#217#3#15#58#14#72#22;
     flags   : if_sse4
   ),
   (
     opcode  : A_PBLENDW;
     ops     : 3;
-    optypes : (ot_xmmreg,ot_memory,ot_immediate or ot_signed);
+    optypes : (ot_xmmreg,ot_memory,ot_immediate);
     code    : #1#102#193#217#3#15#58#14#72#22;
     flags   : if_sse4
   ),

+ 17 - 12
compiler/utils/mkx86ins.pp

@@ -198,7 +198,7 @@ var
    infile,insfile : text;
    { instruction fields }
    skip : boolean;
-   last,
+   literalcount,
    ops    : longint;
    intopcode,
    attopcode,
@@ -360,24 +360,29 @@ begin
         { codes }
         skipspace;
         j:=0;
-        last:=0;
+        literalcount:=0;
         if s[i] in ['\','0'..'9'] then
           begin
              while not(s[i] in [' ',#9]) do
                begin
                  code:=readnumber;
                  { for some codes we want also to change the optypes, but not
-                   if the last byte was a 1 then this byte belongs to a direct
-                   copy }
-                 if last<>1 then
-                  begin
-                    case code of
-                      12,13,14 :
-                        optypes[code-11]:=optypes[code-11]+' or ot_signed';
-                    end;
-                  end;
+                   if the code belongs to a literal sequence }
+                 if (literalcount=0) and (code>=1) and (code<=3) then
+                   literalcount:=code
+                 else
+                   begin
+                     if literalcount>0 then
+                       dec(literalcount)
+                     else
+                       begin
+                         case code of
+                           12,13,14 :
+                             optypes[code-11]:=optypes[code-11]+' or ot_signed';
+                         end;
+                       end;
+                   end;
                  codes:=codes+'#'+tostr(code);
-                 last:=code;
                  inc(j);
                end;
           end

+ 15 - 15
compiler/x86/x86ins.dat

@@ -50,7 +50,7 @@ rm8,imm               \300\323\1\x80\202\21           8086,SB
 (Ch_Mop2, Ch_Rop1, Ch_WFlags)
 regmem,reg16|32|64    \300\320\1\x01\101              8086,SM
 reg16|32|64,regmem    \301\320\1\x03\110              8086,SM
-rm8,reg8              \300\323\17\101                 8086
+rm8,reg8              \300\323\1\x00\101              8086
 reg8,rm8              \301\323\1\x02\110              8086,SM
 rm16|32|64,imm8       \300\320\1\x83\200\15           8086
 reg_eax|64,imm        \320\1\x05\41                   386,SD
@@ -936,7 +936,7 @@ mem|near              \300\320\1\xFF\204              8086
 
 [LLDT,lldtX]
 (Ch_None, Ch_None, Ch_None)
-rm16                  \300\1\x0F\17\202               286,PROT,PRIV
+rm16                  \300\2\x0F\x00\202              286,PROT,PRIV
 
 [LMSW,lmswX]
 (Ch_None, Ch_None, Ch_None)
@@ -1006,7 +1006,7 @@ reg16|32|64,mem       \301\320\2\x0F\xB2\110          386
 
 [LTR,ltrX]
 (Ch_None, Ch_None, Ch_None)
-rm16                  \300\1\x0F\17\203               286,PROT,PRIV
+rm16                  \300\2\x0F\x00\203              286,PROT,PRIV
 
 [MONITOR]
 (Ch_None, Ch_None, Ch_None)
@@ -1941,8 +1941,8 @@ mem                   \300\2\x0F\x01\201              286
 
 [SLDT,sldtX]
 (Ch_Wop1, Ch_None, Ch_None)
-mem                   \300\1\x0F\17\200               286
-reg16|32|64           \320\1\x0F\17\200               286
+mem                   \300\2\x0F\x00\200              286
+reg16|32|64           \320\2\x0F\x00\200              286
 
 [SMI]
 (Ch_All, Ch_None, Ch_None)
@@ -1986,8 +1986,8 @@ void                  \324\1\xAB                      8086
 
 [STR,strX]
 (Ch_Wop1, Ch_None, Ch_None)
-mem                   \300\1\x0F\17\201               286,PROT
-reg16|32|64           \320\1\x0F\17\201               286,PROT
+mem                   \300\2\x0F\x00\201              286,PROT
+reg16|32|64           \320\2\x0F\x00\201              286,PROT
 
 [SUB,subX]
 (Ch_Mop2, Ch_Rop1, Ch_WFlags)
@@ -2064,15 +2064,15 @@ reg8,rm8              \301\323\2\x0F\x12\110              386,UNDOC
 
 [VERR,verrX]
 (Ch_WFlags, Ch_None, Ch_None)
-mem                   \300\1\x0F\17\204               286,PROT
-mem16                 \300\1\x0F\17\204               286,PROT
-reg16                 \300\1\x0F\17\204               286,PROT
+mem                   \300\2\x0F\x00\204              286,PROT
+mem16                 \300\2\x0F\x00\204              286,PROT
+reg16                 \300\2\x0F\x00\204              286,PROT
 
 [VERW]
 (Ch_WFlags, Ch_None, Ch_None)
-mem                   \300\1\x0F\17\205               286,PROT
-mem16                 \300\1\x0F\17\205               286,PROT
-reg16                 \300\1\x0F\17\205               286,PROT
+mem                   \300\2\x0F\x00\205              286,PROT
+mem16                 \300\2\x0F\x00\205              286,PROT
+reg16                 \300\2\x0F\x00\205              286,PROT
 
 [WAIT]
 (Ch_None, Ch_None, Ch_None)
@@ -3407,12 +3407,12 @@ xmmreg,mem            \1\x66\301\331\3\x0F\x38\x0A\110               SSE4
 ;*******************************************************************************
 ;**********SSE4.1***************************************************************
 ;*******************************************************************************
-[BLENDPS] ;By hands delete 'or ot_signed' from i386tab.inc or x8664tab.inc
+[BLENDPS]
 (Ch_All, Ch_None, Ch_None)
 xmmreg,xmmreg,imm     \1\x66\331\3\x0F\x3A\x0C\110\26          SSE4
 xmmreg,mem,imm        \1\x66\301\331\3\x0F\x3A\x0C\110\26      SSE4
 
-[BLENDPD] ;By hands delete 'or ot_signed' from i386tab.inc or x8664tab.inc 
+[BLENDPD]
 (Ch_All, Ch_None, Ch_None)
 xmmreg,xmmreg,imm     \1\x66\331\2\x0F\x3A\375\1\x0D\110\26          SSE4
 xmmreg,mem,imm        \1\x66\301\331\2\x0F\x3A\375\1\x0D\110\26      SSE4

+ 20 - 20
compiler/x86_64/x8664tab.inc

@@ -144,7 +144,7 @@
     opcode  : A_ADD;
     ops     : 2;
     optypes : (ot_regmem or ot_bits8,ot_reg8,ot_none);
-    code    : #192#211#15#65;
+    code    : #192#211#1#0#65;
     flags   : if_8086
   ),
   (
@@ -1326,7 +1326,7 @@
   (
     opcode  : A_FEMMS;
     ops     : 0;
-    optypes : (ot_none,ot_none,ot_none or ot_signed);
+    optypes : (ot_none,ot_none,ot_none);
     code    : #2#15#14;
     flags   : if_pent or if_3dnow
   ),
@@ -2713,7 +2713,7 @@
     opcode  : A_LLDT;
     ops     : 1;
     optypes : (ot_regmem or ot_bits16,ot_none,ot_none);
-    code    : #192#1#15#15#130;
+    code    : #192#2#15#0#130;
     flags   : if_286 or if_prot or if_priv
   ),
   (
@@ -2888,7 +2888,7 @@
     opcode  : A_LTR;
     ops     : 1;
     optypes : (ot_regmem or ot_bits16,ot_none,ot_none);
-    code    : #192#1#15#15#131;
+    code    : #192#2#15#0#131;
     flags   : if_286 or if_prot or if_priv
   ),
   (
@@ -4532,14 +4532,14 @@
   (
     opcode  : A_PREFETCH;
     ops     : 1;
-    optypes : (ot_memory,ot_none or ot_signed,ot_none);
+    optypes : (ot_memory,ot_none,ot_none);
     code    : #2#15#13#128;
     flags   : if_pent or if_3dnow or if_sm
   ),
   (
     opcode  : A_PREFETCHW;
     ops     : 1;
-    optypes : (ot_memory,ot_none or ot_signed,ot_none);
+    optypes : (ot_memory,ot_none,ot_none);
     code    : #2#15#13#129;
     flags   : if_pent or if_3dnow or if_sm
   ),
@@ -6003,14 +6003,14 @@
     opcode  : A_SLDT;
     ops     : 1;
     optypes : (ot_memory,ot_none,ot_none);
-    code    : #192#1#15#15#128;
+    code    : #192#2#15#0#128;
     flags   : if_286
   ),
   (
     opcode  : A_SLDT;
     ops     : 1;
     optypes : (ot_reg16 or ot_bits32 or ot_bits64,ot_none,ot_none);
-    code    : #208#1#15#15#128;
+    code    : #208#2#15#0#128;
     flags   : if_286
   ),
   (
@@ -6087,14 +6087,14 @@
     opcode  : A_STR;
     ops     : 1;
     optypes : (ot_memory,ot_none,ot_none);
-    code    : #192#1#15#15#129;
+    code    : #192#2#15#0#129;
     flags   : if_286 or if_prot
   ),
   (
     opcode  : A_STR;
     ops     : 1;
     optypes : (ot_reg16 or ot_bits32 or ot_bits64,ot_none,ot_none);
-    code    : #208#1#15#15#129;
+    code    : #208#2#15#0#129;
     flags   : if_286 or if_prot
   ),
   (
@@ -6360,42 +6360,42 @@
     opcode  : A_VERR;
     ops     : 1;
     optypes : (ot_memory,ot_none,ot_none);
-    code    : #192#1#15#15#132;
+    code    : #192#2#15#0#132;
     flags   : if_286 or if_prot
   ),
   (
     opcode  : A_VERR;
     ops     : 1;
     optypes : (ot_memory or ot_bits16,ot_none,ot_none);
-    code    : #192#1#15#15#132;
+    code    : #192#2#15#0#132;
     flags   : if_286 or if_prot
   ),
   (
     opcode  : A_VERR;
     ops     : 1;
     optypes : (ot_reg16,ot_none,ot_none);
-    code    : #192#1#15#15#132;
+    code    : #192#2#15#0#132;
     flags   : if_286 or if_prot
   ),
   (
     opcode  : A_VERW;
     ops     : 1;
     optypes : (ot_memory,ot_none,ot_none);
-    code    : #192#1#15#15#133;
+    code    : #192#2#15#0#133;
     flags   : if_286 or if_prot
   ),
   (
     opcode  : A_VERW;
     ops     : 1;
     optypes : (ot_memory or ot_bits16,ot_none,ot_none);
-    code    : #192#1#15#15#133;
+    code    : #192#2#15#0#133;
     flags   : if_286 or if_prot
   ),
   (
     opcode  : A_VERW;
     ops     : 1;
     optypes : (ot_reg16,ot_none,ot_none);
-    code    : #192#1#15#15#133;
+    code    : #192#2#15#0#133;
     flags   : if_286 or if_prot
   ),
   (
@@ -10048,14 +10048,14 @@
   (
     opcode  : A_BLENDPS;
     ops     : 3;
-    optypes : (ot_xmmreg or ot_signed,ot_xmmreg,ot_immediate);
+    optypes : (ot_xmmreg,ot_xmmreg,ot_immediate);
     code    : #1#102#217#3#15#58#12#72#22;
     flags   : if_sse4
   ),
   (
     opcode  : A_BLENDPS;
     ops     : 3;
-    optypes : (ot_xmmreg or ot_signed,ot_memory,ot_immediate);
+    optypes : (ot_xmmreg,ot_memory,ot_immediate);
     code    : #1#102#193#217#3#15#58#12#72#22;
     flags   : if_sse4
   ),
@@ -10209,14 +10209,14 @@
   (
     opcode  : A_PBLENDW;
     ops     : 3;
-    optypes : (ot_xmmreg,ot_xmmreg,ot_immediate or ot_signed);
+    optypes : (ot_xmmreg,ot_xmmreg,ot_immediate);
     code    : #1#102#217#3#15#58#14#72#22;
     flags   : if_sse4
   ),
   (
     opcode  : A_PBLENDW;
     ops     : 3;
-    optypes : (ot_xmmreg,ot_memory,ot_immediate or ot_signed);
+    optypes : (ot_xmmreg,ot_memory,ot_immediate);
     code    : #1#102#193#217#3#15#58#14#72#22;
     flags   : if_sse4
   ),