瀏覽代碼

x86 assembler:
* Optimized the opcode representation of movq and remaining 3DNow instructions
* Disallow immediates not fitting in 32 bits (Mantis #14685) + test
* Disallow push/pop with 32-bit operands in x86_64 + test

git-svn-id: trunk@17490 -

sergei 14 年之前
父節點
當前提交
9e8a31193b

+ 2 - 0
.gitattributes

@@ -9569,6 +9569,8 @@ tests/test/tasm1.pp svneol=native#text/plain
 tests/test/tasm2.pp svneol=native#text/plain
 tests/test/tasm3.pp svneol=native#text/plain
 tests/test/tasm4.pp svneol=native#text/plain
+tests/test/tasm5.pp svneol=native#text/plain
+tests/test/tasm6.pp svneol=native#text/plain
 tests/test/tasmread.pp svneol=native#text/plain
 tests/test/tasout.pp svneol=native#text/plain
 tests/test/tassignmentoperator1.pp svneol=native#text/pascal

+ 1 - 1
compiler/i386/i386nop.inc

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

+ 94 - 129
compiler/i386/i386tab.inc

@@ -87,16 +87,16 @@
   (
     opcode  : A_ADC;
     ops     : 2;
-    optypes : (ot_reg_eax or ot_bits64,ot_immediate,ot_none);
-    code    : #208#1#21#33;
-    flags   : if_386 or if_sd
+    optypes : (ot_reg_eax,ot_immediate,ot_none);
+    code    : #213#1#21#33;
+    flags   : if_386 or if_sm
   ),
   (
     opcode  : A_ADC;
     ops     : 2;
-    optypes : (ot_regmem or ot_bits32 or ot_bits64,ot_immediate,ot_none);
-    code    : #208#1#129#130#33;
-    flags   : if_386 or if_sd
+    optypes : (ot_regmem or ot_bits32,ot_immediate,ot_none);
+    code    : #213#1#129#130#33;
+    flags   : if_386 or if_sm
   ),
   (
     opcode  : A_ADC;
@@ -164,16 +164,16 @@
   (
     opcode  : A_ADD;
     ops     : 2;
-    optypes : (ot_reg_eax or ot_bits64,ot_immediate,ot_none);
+    optypes : (ot_reg_eax,ot_immediate,ot_none);
     code    : #208#1#5#33;
-    flags   : if_386 or if_sd
+    flags   : if_386 or if_sm
   ),
   (
     opcode  : A_ADD;
     ops     : 2;
-    optypes : (ot_regmem or ot_bits32 or ot_bits64,ot_immediate,ot_none);
-    code    : #208#1#129#128#33;
-    flags   : if_386 or if_sd
+    optypes : (ot_regmem or ot_bits32,ot_immediate,ot_none);
+    code    : #213#1#129#128#33;
+    flags   : if_386 or if_sm
   ),
   (
     opcode  : A_ADD;
@@ -241,16 +241,16 @@
   (
     opcode  : A_AND;
     ops     : 2;
-    optypes : (ot_reg_eax or ot_bits64,ot_immediate,ot_none);
-    code    : #208#1#37#33;
-    flags   : if_386 or if_sd
+    optypes : (ot_reg_eax,ot_immediate,ot_none);
+    code    : #213#1#37#33;
+    flags   : if_386 or if_sm
   ),
   (
     opcode  : A_AND;
     ops     : 2;
-    optypes : (ot_regmem or ot_bits32 or ot_bits64,ot_immediate,ot_none);
-    code    : #208#1#129#132#33;
-    flags   : if_386 or if_sd
+    optypes : (ot_regmem or ot_bits32,ot_immediate,ot_none);
+    code    : #213#1#129#132#33;
+    flags   : if_386 or if_sm
   ),
   (
     opcode  : A_AND;
@@ -542,16 +542,16 @@
   (
     opcode  : A_CMP;
     ops     : 2;
-    optypes : (ot_reg_eax or ot_bits64,ot_immediate,ot_none);
-    code    : #208#1#61#33;
-    flags   : if_386 or if_sd
+    optypes : (ot_reg_eax,ot_immediate,ot_none);
+    code    : #213#1#61#33;
+    flags   : if_386 or if_sm
   ),
   (
     opcode  : A_CMP;
     ops     : 2;
-    optypes : (ot_regmem or ot_bits32 or ot_bits64,ot_immediate,ot_none);
-    code    : #208#1#129#135#33;
-    flags   : if_386 or if_sd
+    optypes : (ot_regmem or ot_bits32,ot_immediate,ot_none);
+    code    : #213#1#129#135#33;
+    flags   : if_386 or if_sm
   ),
   (
     opcode  : A_CMP;
@@ -2320,8 +2320,8 @@
   (
     opcode  : A_IMUL;
     ops     : 2;
-    optypes : (ot_reg32 or ot_bits64,ot_immediate,ot_none);
-    code    : #208#1#105#64#33;
+    optypes : (ot_reg32,ot_immediate,ot_none);
+    code    : #213#1#105#64#33;
     flags   : if_286 or if_sd
   ),
   (
@@ -2957,9 +2957,9 @@
   (
     opcode  : A_MOV;
     ops     : 2;
-    optypes : (ot_regmem or ot_bits32 or ot_bits64,ot_immediate,ot_none);
-    code    : #208#1#199#128#33;
-    flags   : if_386 or if_sd
+    optypes : (ot_regmem or ot_bits32,ot_immediate,ot_none);
+    code    : #213#1#199#128#33;
+    flags   : if_386 or if_sm
   ),
   (
     opcode  : A_MOV;
@@ -3167,59 +3167,31 @@
   (
     opcode  : A_MOVQ;
     ops     : 2;
-    optypes : (ot_mmxreg,ot_memory,ot_none);
+    optypes : (ot_mmxreg,ot_mmxrm,ot_none);
     code    : #2#15#111#72;
     flags   : if_pent or if_mmx or if_sm
   ),
   (
     opcode  : A_MOVQ;
     ops     : 2;
-    optypes : (ot_mmxreg,ot_mmxreg,ot_none);
-    code    : #2#15#111#72;
-    flags   : if_pent or if_mmx
-  ),
-  (
-    opcode  : A_MOVQ;
-    ops     : 2;
-    optypes : (ot_memory,ot_mmxreg,ot_none);
+    optypes : (ot_mmxrm,ot_mmxreg,ot_none);
     code    : #2#15#127#65;
     flags   : if_pent or if_mmx or if_sm
   ),
   (
     opcode  : A_MOVQ;
     ops     : 2;
-    optypes : (ot_mmxreg,ot_mmxreg,ot_none);
-    code    : #2#15#127#65;
-    flags   : if_pent or if_mmx
-  ),
-  (
-    opcode  : A_MOVQ;
-    ops     : 2;
-    optypes : (ot_xmmreg,ot_xmmreg,ot_none);
+    optypes : (ot_xmmreg,ot_xmmrm,ot_none);
     code    : #219#2#15#126#72;
     flags   : if_willamette or if_sse2
   ),
   (
     opcode  : A_MOVQ;
     ops     : 2;
-    optypes : (ot_xmmreg,ot_xmmreg,ot_none);
+    optypes : (ot_xmmrm,ot_xmmreg,ot_none);
     code    : #241#2#15#214#72;
     flags   : if_willamette or if_sse2
   ),
-  (
-    opcode  : A_MOVQ;
-    ops     : 2;
-    optypes : (ot_memory,ot_xmmreg,ot_none);
-    code    : #241#2#15#214#65;
-    flags   : if_willamette or if_sse2
-  ),
-  (
-    opcode  : A_MOVQ;
-    ops     : 2;
-    optypes : (ot_xmmreg,ot_memory,ot_none);
-    code    : #219#2#15#126#72;
-    flags   : if_willamette or if_sse2
-  ),
   (
     opcode  : A_MOVQ;
     ops     : 2;
@@ -3412,16 +3384,16 @@
   (
     opcode  : A_OR;
     ops     : 2;
-    optypes : (ot_reg_eax or ot_bits64,ot_immediate,ot_none);
-    code    : #208#1#13#33;
-    flags   : if_386 or if_sd
+    optypes : (ot_reg_eax,ot_immediate,ot_none);
+    code    : #213#1#13#33;
+    flags   : if_386 or if_sm
   ),
   (
     opcode  : A_OR;
     ops     : 2;
-    optypes : (ot_regmem or ot_bits32 or ot_bits64,ot_immediate,ot_none);
-    code    : #208#1#129#129#33;
-    flags   : if_386 or if_sd
+    optypes : (ot_regmem or ot_bits32,ot_immediate,ot_none);
+    code    : #213#1#129#129#33;
+    flags   : if_386 or if_sm
   ),
   (
     opcode  : A_OR;
@@ -4021,17 +3993,31 @@
   (
     opcode  : A_POP;
     ops     : 1;
-    optypes : (ot_reg16 or ot_bits32 or ot_bits64,ot_none,ot_none);
-    code    : #208#8#88#221;
+    optypes : (ot_reg16,ot_none,ot_none);
+    code    : #212#8#88;
     flags   : if_8086
   ),
   (
     opcode  : A_POP;
     ops     : 1;
-    optypes : (ot_regmem or ot_bits16 or ot_bits32 or ot_bits64,ot_none,ot_none);
-    code    : #192#208#1#143#128#221;
+    optypes : (ot_reg32,ot_none,ot_none);
+    code    : #213#8#88;
+    flags   : if_386 or if_nox86_64
+  ),
+  (
+    opcode  : A_POP;
+    ops     : 1;
+    optypes : (ot_regmem or ot_bits16,ot_none,ot_none);
+    code    : #212#1#143#128;
     flags   : if_8086
   ),
+  (
+    opcode  : A_POP;
+    ops     : 1;
+    optypes : (ot_regmem or ot_bits32,ot_none,ot_none);
+    code    : #213#1#143#128;
+    flags   : if_386 or if_nox86_64
+  ),
   (
     opcode  : A_POP;
     ops     : 1;
@@ -4553,17 +4539,31 @@
   (
     opcode  : A_PUSH;
     ops     : 1;
-    optypes : (ot_reg16 or ot_bits32 or ot_bits64,ot_none,ot_none);
-    code    : #208#8#80#221;
+    optypes : (ot_reg16,ot_none,ot_none);
+    code    : #212#8#80;
     flags   : if_8086
   ),
   (
     opcode  : A_PUSH;
     ops     : 1;
-    optypes : (ot_regmem or ot_bits16 or ot_bits32 or ot_bits64,ot_none,ot_none);
-    code    : #192#208#1#255#134#221;
+    optypes : (ot_reg32,ot_none,ot_none);
+    code    : #213#8#80;
+    flags   : if_386 or if_nox86_64
+  ),
+  (
+    opcode  : A_PUSH;
+    ops     : 1;
+    optypes : (ot_regmem or ot_bits16,ot_none,ot_none);
+    code    : #212#1#255#134;
     flags   : if_8086
   ),
+  (
+    opcode  : A_PUSH;
+    ops     : 1;
+    optypes : (ot_regmem or ot_bits32,ot_none,ot_none);
+    code    : #213#1#255#134;
+    flags   : if_386 or if_nox86_64
+  ),
   (
     opcode  : A_PUSH;
     ops     : 1;
@@ -5085,16 +5085,16 @@
   (
     opcode  : A_SBB;
     ops     : 2;
-    optypes : (ot_reg_eax or ot_bits64,ot_immediate,ot_none);
-    code    : #208#1#29#33;
-    flags   : if_386 or if_sd
+    optypes : (ot_reg_eax,ot_immediate,ot_none);
+    code    : #213#1#29#33;
+    flags   : if_386 or if_sm
   ),
   (
     opcode  : A_SBB;
     ops     : 2;
-    optypes : (ot_regmem or ot_bits32 or ot_bits64,ot_immediate,ot_none);
+    optypes : (ot_regmem or ot_bits32,ot_immediate,ot_none);
     code    : #208#1#129#131#33;
-    flags   : if_386 or if_sd
+    flags   : if_386 or if_sm
   ),
   (
     opcode  : A_SBB;
@@ -5449,16 +5449,16 @@
   (
     opcode  : A_SUB;
     ops     : 2;
-    optypes : (ot_reg_eax or ot_bits64,ot_immediate,ot_none);
-    code    : #208#1#45#33;
-    flags   : if_386 or if_sd
+    optypes : (ot_reg_eax,ot_immediate,ot_none);
+    code    : #213#1#45#33;
+    flags   : if_386 or if_sm
   ),
   (
     opcode  : A_SUB;
     ops     : 2;
-    optypes : (ot_regmem or ot_bits32 or ot_bits64,ot_immediate,ot_none);
+    optypes : (ot_regmem or ot_bits32,ot_immediate,ot_none);
     code    : #208#1#129#133#33;
-    flags   : if_8086 or if_sd
+    flags   : if_386 or if_sm
   ),
   (
     opcode  : A_SUB;
@@ -5890,16 +5890,16 @@
   (
     opcode  : A_XOR;
     ops     : 2;
-    optypes : (ot_reg_eax or ot_bits64,ot_immediate,ot_none);
-    code    : #208#1#53#33;
-    flags   : if_386 or if_sd
+    optypes : (ot_reg_eax,ot_immediate,ot_none);
+    code    : #213#1#53#33;
+    flags   : if_386 or if_sm
   ),
   (
     opcode  : A_XOR;
     ops     : 2;
-    optypes : (ot_regmem or ot_bits32 or ot_bits64,ot_immediate,ot_none);
+    optypes : (ot_regmem or ot_bits32,ot_immediate,ot_none);
     code    : #208#1#129#134#33;
-    flags   : if_386 or if_sd
+    flags   : if_386 or if_sm
   ),
   (
     opcode  : A_XOR;
@@ -6793,70 +6793,35 @@
   (
     opcode  : A_PFNACC;
     ops     : 2;
-    optypes : (ot_mmxreg,ot_memory,ot_none);
-    code    : #2#15#15#72#1#138;
-    flags   : if_pent or if_3dnow or if_sm
-  ),
-  (
-    opcode  : A_PFNACC;
-    ops     : 2;
-    optypes : (ot_mmxreg,ot_mmxreg,ot_none);
+    optypes : (ot_mmxreg,ot_mmxrm,ot_none);
     code    : #2#15#15#72#1#138;
-    flags   : if_pent or if_3dnow
-  ),
-  (
-    opcode  : A_PFPNACC;
-    ops     : 2;
-    optypes : (ot_mmxreg,ot_memory,ot_none);
-    code    : #2#15#15#72#1#142;
     flags   : if_pent or if_3dnow or if_sm
   ),
   (
     opcode  : A_PFPNACC;
     ops     : 2;
-    optypes : (ot_mmxreg,ot_mmxreg,ot_none);
+    optypes : (ot_mmxreg,ot_mmxrm,ot_none);
     code    : #2#15#15#72#1#142;
-    flags   : if_pent or if_3dnow
-  ),
-  (
-    opcode  : A_PI2FW;
-    ops     : 2;
-    optypes : (ot_mmxreg,ot_memory,ot_none);
-    code    : #2#15#15#72#1#12;
     flags   : if_pent or if_3dnow or if_sm
   ),
   (
     opcode  : A_PI2FW;
     ops     : 2;
-    optypes : (ot_mmxreg,ot_mmxreg,ot_none);
+    optypes : (ot_mmxreg,ot_mmxrm,ot_none);
     code    : #2#15#15#72#1#12;
-    flags   : if_pent or if_3dnow
-  ),
-  (
-    opcode  : A_PF2IW;
-    ops     : 2;
-    optypes : (ot_mmxreg,ot_memory,ot_none);
-    code    : #2#15#15#72#1#28;
     flags   : if_pent or if_3dnow or if_sm
   ),
   (
     opcode  : A_PF2IW;
     ops     : 2;
-    optypes : (ot_mmxreg,ot_mmxreg,ot_none);
+    optypes : (ot_mmxreg,ot_mmxrm,ot_none);
     code    : #2#15#15#72#1#28;
-    flags   : if_pent or if_3dnow
-  ),
-  (
-    opcode  : A_PSWAPD;
-    ops     : 2;
-    optypes : (ot_mmxreg,ot_memory,ot_none);
-    code    : #2#15#15#72#1#187;
     flags   : if_pent or if_3dnow or if_sm
   ),
   (
     opcode  : A_PSWAPD;
     ops     : 2;
-    optypes : (ot_mmxreg,ot_mmxreg,ot_none);
+    optypes : (ot_mmxreg,ot_mmxrm,ot_none);
     code    : #2#15#15#72#1#187;
     flags   : if_pent or if_3dnow or if_sm
   ),

+ 18 - 5
compiler/x86/aasmcpu.pas

@@ -1769,7 +1769,8 @@ implementation
               end;
             32,33,34,
             52,53,54,
-            56,57,58 :
+            56,57,58,
+            172,173,174 :
               inc(len,4);
             192,193,194 :
               if NeedAddrPrefix(c-192) then
@@ -1819,7 +1820,7 @@ implementation
               omit_rexw:=true
 {$endif x86_64}
               ;
-            64..191 :
+            64..151 :
               begin
 {$ifdef x86_64}
                  if (c<127) then
@@ -1892,6 +1893,7 @@ implementation
        *                 field the register value of operand b.
        * \2ab          - a ModRM, calculated on EA in operand a, with the spare
        *                 field equal to digit b.
+       * \254,\255,\256 - a signed 32-bit immediate to be extended to 64 bits
        * \300,\301,\302 - might be an 0x67, depending on the address size of
        *                 the memory reference in operand x.
        * \310          - indicates fixed 16-bit address size, i.e. optional 0x67.
@@ -2194,6 +2196,17 @@ implementation
                 else
                  objdata_writereloc(currval-insend,4,nil,currabsreloc32)
               end;
+            172,173,174 :  // 0254..0256 - dword implicitly sign-extended to 64-bit (x86_64 only)
+              begin
+                getvalsym(c-172);
+                if (currval<low(longint)) or (currval>high(longint)) then
+                  Message2(asmw_e_value_exceeds_bounds,'signed dword',tostr(currval));
+
+                if assigned(currsym) then
+                  objdata_writereloc(currval,4,currsym,currabsreloc32)
+                else
+                  objdata.writebytes(currval,4);
+              end;
             192,193,194 :
               begin
                 if NeedAddrPrefix(c-192) then
@@ -2279,9 +2292,9 @@ implementation
                 if (rex<>0) and not(rexwritten) then
                   internalerror(200603191);
 {$endif x86_64}
-                if (c>=64) and (c<=191) then
+                if (c>=64) and (c<=151) then  // 0100..0227
                  begin
-                   if (c<127) then
+                   if (c<127) then            // 0177
                     begin
                       if (oper[c and 7]^.typ=top_reg) then
                         rfield:=regval(oper[c and 7]^.reg)
@@ -2353,7 +2366,7 @@ implementation
                                      Dec(currval, 1);
                                    24,25,26:
                                      Dec(currval, 2);
-                                   32,33,34:
+                                   32,33,34,172,173,174:
                                      Dec(currval, 4);
                                  end;
                              end

+ 59 - 40
compiler/x86/x86ins.dat

@@ -39,8 +39,10 @@ reg16|32|64,regmem    \320\1\x13\110                  8086,SM
 rm8,reg8              \1\x10\101                      8086
 reg8,rm8              \1\x12\110                      8086
 rm16|32|64,imm8       \320\1\x83\202\15               8086
-reg_eax|64,imm        \320\1\x15\41                   386,SD
-rm32|64,imm           \320\1\x81\202\41               386,SD
+reg_eax,imm           \325\1\x15\41                   386,SM
+reg_rax,imm           \326\1\x15\255                  X86_64,SM
+rm32,imm              \325\1\x81\202\41               386,SM
+rm64,imm              \326\1\x81\202\255              X86_64,SM
 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
@@ -53,8 +55,10 @@ reg16|32|64,regmem    \320\1\x03\110                  8086,SM
 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|64,imm        \320\1\x05\41                   386,SD
-rm32|64,imm           \320\1\x81\200\41               386,SD
+reg_eax,imm           \320\1\x05\41                   386,SM
+reg_rax,imm           \326\1\x05\255                  X86_64,SM
+rm32,imm              \325\1\x81\200\41               386,SM
+rm64,imm              \326\1\x81\200\255              X86_64,SM
 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
@@ -67,8 +71,10 @@ reg16|32|64,regmem    \320\1\x23\110                  8086,SM
 rm8,reg8              \1\x20\101                      8086
 reg8,rm8              \1\x22\110                      8086
 rm16|32|64,imm8       \320\1\x83\204\15               8086
-reg_eax|64,imm        \320\1\x25\41                   386,SD
-rm32|64,imm           \320\1\x81\204\41               386,SD
+reg_eax,imm           \325\1\x25\41                   386,SM
+reg_rax,imm           \326\1\x25\255                  X86_64,SM
+rm32,imm              \325\1\x81\204\41               386,SM
+rm64,imm              \326\1\x81\204\255              X86_64,SM
 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
@@ -165,8 +171,10 @@ reg16|32|64,regmem    \320\1\x3B\110                  8086,SM
 rm8,reg8              \1\x38\101                      8086
 reg8,rm8              \1\x3A\110                      8086
 rm16|32|64,imm8       \320\1\x83\207\15               8086
-reg_eax|64,imm        \320\1\x3D\41                   386,SD
-rm32|64,imm           \320\1\x81\207\41               386,SD
+reg_eax,imm           \325\1\x3D\41                   386,SM
+reg_rax,imm           \326\1\x3D\255                  X86_64,SM
+rm32,imm              \325\1\x81\207\41               386,SM
+rm64,imm              \326\1\x81\207\255              X86_64,SM
 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
@@ -776,7 +784,8 @@ rm16|32|64            \320\1\xF7\205                  8086
 reg32|64,regmem,imm8  \320\1\x6B\110\16               286,SM
 reg32|64,regmem,imm   \320\1\x69\110\42               286,SM,SD,AR2
 reg32|64,imm8         \320\1\x6B\100\15               286
-reg32|64,imm          \320\1\x69\100\41               286,SD
+reg32,imm             \325\1\x69\100\41               286,SD
+reg64,imm             \326\1\x69\100\255              X86_64
 reg16,regmem,imm8     \324\1\x6B\110\16               286,SM
 reg16,regmem,imm      \324\1\x69\110\32               286,SM,SW,AR2
 reg16,imm8            \324\1\x6B\100\15               286
@@ -1020,7 +1029,8 @@ reg_ax,mem_offs       \324\1\xA1\35                   8086,SM,NOX86_64
 reg_eax,mem_offs      \325\1\xA1\35                   386,SM,NOX86_64
 reg16|32|64,regmem    \320\1\x8B\110                  8086,SM
 reg32|64,imm          \320\10\xB8\35                  386,SD
-rm32|64,imm           \320\1\xC7\200\41               386,SD
+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\34                       8086,SM,NOX86_64
@@ -1064,14 +1074,10 @@ xmmreg,mem            \361\325\2\x0F\x6E\110          WILLAMETTE,SSE2
 
 [MOVQ,movq]
 (Ch_Rop1, Ch_Wop2, Ch_None)
-mmxreg,mem            \2\x0F\x6F\110                  PENT,MMX,SM
-mmxreg,mmxreg         \2\x0F\x6F\110                  PENT,MMX
-mem,mmxreg            \2\x0F\x7F\101                  PENT,MMX,SM
-mmxreg,mmxreg         \2\x0F\x7F\101                  PENT,MMX
-xmmreg,xmmreg         \333\2\x0F\x7E\110              WILLAMETTE,SSE2
-xmmreg,xmmreg         \361\2\x0F\xD6\110              WILLAMETTE,SSE2
-mem,xmmreg            \361\2\x0F\xD6\101              WILLAMETTE,SSE2
-xmmreg,mem            \333\2\x0F\x7E\110              WILLAMETTE,SSE2
+mmxreg,mmxrm          \2\x0F\x6F\110                  PENT,MMX,SM
+mmxrm,mmxreg          \2\x0F\x7F\101                  PENT,MMX,SM
+xmmreg,xmmrm          \333\2\x0F\x7E\110              WILLAMETTE,SSE2
+xmmrm,xmmreg          \361\2\x0F\xD6\110              WILLAMETTE,SSE2
 xmmreg,reg64          \361\326\2\x0F\x6E\110          WILLAMETTE,SSE2
 reg64,xmmreg          \361\326\2\x0F\x7E\101          WILLAMETTE,SSE2
 
@@ -1138,8 +1144,10 @@ reg16|32|64,regmem    \320\1\x0B\110                  8086,SM
 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|64,imm        \320\1\x0D\41                   386,SD
-rm32|64,imm           \320\1\x81\201\41               386,SD
+reg_eax,imm           \325\1\x0D\41                   386,SM
+reg_rax,imm           \326\1\x0D\255                  X86_64,SM
+rm32,imm              \325\1\x81\201\41               386,SM
+rm64,imm              \326\1\x81\201\255              X86_64,SM
 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
@@ -1393,8 +1401,12 @@ mmxreg,mem            \2\x0F\x58\110                  PENT,MMX,SM,CYRIX
 
 [POP,popX]
 (Ch_Wop1, Ch_RWESP, Ch_None)
-reg16|32|64           \320\10\x58\335                 8086
-rm16|32|64            \300\320\1\x8F\200\335          8086
+reg16                 \324\10\x58                     8086
+reg32                 \325\10\x58                     386,NOX86_64
+reg64                 \335\10\x58                     X86_64
+rm16                  \324\1\x8F\200                  8086
+rm32                  \325\1\x8F\200                  386,NOX86_64
+rm64                  \335\1\x8F\200                  X86_64
 reg_cs                \1\x0F                          8086,UNDOC,ND
 reg_dess              \4                              8086,NOX86_64
 reg_fsgs              \1\x0F\5\335                    386
@@ -1574,8 +1586,12 @@ xmmreg,xmmrm          \361\2\x0F\x61\110              WILLAMETTE,SSE2,SM
 
 [PUSH,pushX]
 (Ch_Rop1, Ch_RWESP, Ch_None)
-reg16|32|64           \320\10\x50\335                 8086
-rm16|32|64            \300\320\1\xFF\206\335          8086
+reg16                 \324\10\x50                     8086
+reg32                 \325\10\x50                     386,NOX86_64
+reg64                 \335\10\x50                     X86_64
+rm16                  \324\1\xFF\206                  8086
+rm32                  \325\1\xFF\206                  386,NOX86_64
+rm64                  \335\1\xFF\206                  X86_64
 imm32                 \325\1\x68\40\335               386
 imm16                 \324\1\x68\30\335               286
 imm8                  \1\x6A\14\335                   286
@@ -1748,8 +1764,10 @@ reg16|32|64,regmem    \320\1\x1B\110                  8086,SM
 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|64,imm        \320\1\x1D\41                   386,SD
-rm32|64,imm           \320\1\x81\203\41               386,SD
+reg_eax,imm           \325\1\x1D\41                   386,SM
+reg_rax,imm           \326\1\x1D\255                  X86_64,SM
+rm32,imm              \320\1\x81\203\41               386,SM
+rm64,imm              \326\1\x81\203\255              X86_64,SM
 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
@@ -1888,8 +1906,10 @@ reg16|32|64,regmem    \320\1\x2B\110                  8086,SM
 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|64,imm        \320\1\x2D\41                   386,SD
-rm32|64,imm           \320\1\x81\205\41               8086,SD
+reg_eax,imm           \325\1\x2D\41                   386,SM
+reg_rax,imm           \326\1\x2D\255                  X86_64,SM
+rm32,imm              \320\1\x81\205\41               386,SM
+rm64,imm              \326\1\x81\205\255              X86_64,SM
 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
@@ -1929,9 +1949,11 @@ 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_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
 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
@@ -2022,8 +2044,10 @@ reg16|32|64,regmem    \320\1\x33\110                  8086,SM
 rm8,reg8              \1\x30\101                      8086
 reg8,rm8              \1\x32\110                      8086
 rm16|32|64,imm8       \320\1\x83\206\15               8086
-reg_eax|64,imm        \320\1\x35\41                   386,SD
-rm32|64,imm           \320\1\x81\206\41               386,SD
+reg_eax,imm           \325\1\x35\41                   386,SM
+reg_rax,imm           \326\1\x35\255                  X86_64,SM
+rm32,imm              \320\1\x81\206\41               386,SM
+rm64,imm              \326\1\x81\206\255              X86_64,SM
 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
@@ -2456,28 +2480,23 @@ mmxreg,mmxrm,imm      \2\x0F\x70\110\22               KATMAI,MMX,SM2,SB,AR2
 
 [PFNACC]
 (Ch_All, Ch_None, Ch_None)
-mmxreg,mem            \2\x0F\x0F\110\01\x8A           PENT,3DNOW,SM
-mmxreg,mmxreg         \2\x0F\x0F\110\01\x8A           PENT,3DNOW
+mmxreg,mmxrm          \2\x0F\x0F\110\01\x8A           PENT,3DNOW,SM
 
 [PFPNACC]
 (Ch_All, Ch_None, Ch_None)
-mmxreg,mem            \2\x0F\x0F\110\01\x8E           PENT,3DNOW,SM
-mmxreg,mmxreg         \2\x0F\x0F\110\01\x8E           PENT,3DNOW
+mmxreg,mmxrm          \2\x0F\x0F\110\01\x8E           PENT,3DNOW,SM
 
 [PI2FW]
 (Ch_All, Ch_None, Ch_None)
-mmxreg,mem            \2\x0F\x0F\110\01\x0C           PENT,3DNOW,SM
-mmxreg,mmxreg         \2\x0F\x0F\110\01\x0C           PENT,3DNOW
+mmxreg,mmxrm          \2\x0F\x0F\110\01\x0C           PENT,3DNOW,SM
 
 [PF2IW]
 (Ch_All, Ch_None, Ch_None)
-mmxreg,mem            \2\x0F\x0F\110\01\x1C           PENT,3DNOW,SM
-mmxreg,mmxreg         \2\x0F\x0F\110\01\x1C           PENT,3DNOW
+mmxreg,mmxrm          \2\x0F\x0F\110\01\x1C           PENT,3DNOW,SM
 
 [PSWAPD]
 (Ch_All, Ch_None, Ch_None)
-mmxreg,mem            \2\x0F\x0F\110\01\xBB           PENT,3DNOW,SM
-mmxreg,mmxreg         \2\x0F\x0F\110\01\xBB           PENT,3DNOW,SM
+mmxreg,mmxrm          \2\x0F\x0F\110\01\xBB           PENT,3DNOW,SM
 
 [FFREEP]
 (Ch_All, Ch_None, Ch_None)

+ 1 - 1
compiler/x86_64/x8664nop.inc

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

+ 234 - 129
compiler/x86_64/x8664tab.inc

@@ -45,16 +45,30 @@
   (
     opcode  : A_ADC;
     ops     : 2;
-    optypes : (ot_reg_eax or ot_bits64,ot_immediate,ot_none);
-    code    : #208#1#21#33;
-    flags   : if_386 or if_sd
+    optypes : (ot_reg_eax,ot_immediate,ot_none);
+    code    : #213#1#21#33;
+    flags   : if_386 or if_sm
   ),
   (
     opcode  : A_ADC;
     ops     : 2;
-    optypes : (ot_regmem or ot_bits32 or ot_bits64,ot_immediate,ot_none);
-    code    : #208#1#129#130#33;
-    flags   : if_386 or if_sd
+    optypes : (ot_reg_rax,ot_immediate,ot_none);
+    code    : #214#1#21#173;
+    flags   : if_x86_64 or if_sm
+  ),
+  (
+    opcode  : A_ADC;
+    ops     : 2;
+    optypes : (ot_regmem or ot_bits32,ot_immediate,ot_none);
+    code    : #213#1#129#130#33;
+    flags   : if_386 or if_sm
+  ),
+  (
+    opcode  : A_ADC;
+    ops     : 2;
+    optypes : (ot_regmem or ot_bits64,ot_immediate,ot_none);
+    code    : #214#1#129#130#173;
+    flags   : if_x86_64 or if_sm
   ),
   (
     opcode  : A_ADC;
@@ -122,16 +136,30 @@
   (
     opcode  : A_ADD;
     ops     : 2;
-    optypes : (ot_reg_eax or ot_bits64,ot_immediate,ot_none);
+    optypes : (ot_reg_eax,ot_immediate,ot_none);
     code    : #208#1#5#33;
-    flags   : if_386 or if_sd
+    flags   : if_386 or if_sm
   ),
   (
     opcode  : A_ADD;
     ops     : 2;
-    optypes : (ot_regmem or ot_bits32 or ot_bits64,ot_immediate,ot_none);
-    code    : #208#1#129#128#33;
-    flags   : if_386 or if_sd
+    optypes : (ot_reg_rax,ot_immediate,ot_none);
+    code    : #214#1#5#173;
+    flags   : if_x86_64 or if_sm
+  ),
+  (
+    opcode  : A_ADD;
+    ops     : 2;
+    optypes : (ot_regmem or ot_bits32,ot_immediate,ot_none);
+    code    : #213#1#129#128#33;
+    flags   : if_386 or if_sm
+  ),
+  (
+    opcode  : A_ADD;
+    ops     : 2;
+    optypes : (ot_regmem or ot_bits64,ot_immediate,ot_none);
+    code    : #214#1#129#128#173;
+    flags   : if_x86_64 or if_sm
   ),
   (
     opcode  : A_ADD;
@@ -199,16 +227,30 @@
   (
     opcode  : A_AND;
     ops     : 2;
-    optypes : (ot_reg_eax or ot_bits64,ot_immediate,ot_none);
-    code    : #208#1#37#33;
-    flags   : if_386 or if_sd
+    optypes : (ot_reg_eax,ot_immediate,ot_none);
+    code    : #213#1#37#33;
+    flags   : if_386 or if_sm
   ),
   (
     opcode  : A_AND;
     ops     : 2;
-    optypes : (ot_regmem or ot_bits32 or ot_bits64,ot_immediate,ot_none);
-    code    : #208#1#129#132#33;
-    flags   : if_386 or if_sd
+    optypes : (ot_reg_rax,ot_immediate,ot_none);
+    code    : #214#1#37#173;
+    flags   : if_x86_64 or if_sm
+  ),
+  (
+    opcode  : A_AND;
+    ops     : 2;
+    optypes : (ot_regmem or ot_bits32,ot_immediate,ot_none);
+    code    : #213#1#129#132#33;
+    flags   : if_386 or if_sm
+  ),
+  (
+    opcode  : A_AND;
+    ops     : 2;
+    optypes : (ot_regmem or ot_bits64,ot_immediate,ot_none);
+    code    : #214#1#129#132#173;
+    flags   : if_x86_64 or if_sm
   ),
   (
     opcode  : A_AND;
@@ -437,16 +479,30 @@
   (
     opcode  : A_CMP;
     ops     : 2;
-    optypes : (ot_reg_eax or ot_bits64,ot_immediate,ot_none);
-    code    : #208#1#61#33;
-    flags   : if_386 or if_sd
+    optypes : (ot_reg_eax,ot_immediate,ot_none);
+    code    : #213#1#61#33;
+    flags   : if_386 or if_sm
   ),
   (
     opcode  : A_CMP;
     ops     : 2;
-    optypes : (ot_regmem or ot_bits32 or ot_bits64,ot_immediate,ot_none);
-    code    : #208#1#129#135#33;
-    flags   : if_386 or if_sd
+    optypes : (ot_reg_rax,ot_immediate,ot_none);
+    code    : #214#1#61#173;
+    flags   : if_x86_64 or if_sm
+  ),
+  (
+    opcode  : A_CMP;
+    ops     : 2;
+    optypes : (ot_regmem or ot_bits32,ot_immediate,ot_none);
+    code    : #213#1#129#135#33;
+    flags   : if_386 or if_sm
+  ),
+  (
+    opcode  : A_CMP;
+    ops     : 2;
+    optypes : (ot_regmem or ot_bits64,ot_immediate,ot_none);
+    code    : #214#1#129#135#173;
+    flags   : if_x86_64 or if_sm
   ),
   (
     opcode  : A_CMP;
@@ -2194,10 +2250,17 @@
   (
     opcode  : A_IMUL;
     ops     : 2;
-    optypes : (ot_reg32 or ot_bits64,ot_immediate,ot_none);
-    code    : #208#1#105#64#33;
+    optypes : (ot_reg32,ot_immediate,ot_none);
+    code    : #213#1#105#64#33;
     flags   : if_286 or if_sd
   ),
+  (
+    opcode  : A_IMUL;
+    ops     : 2;
+    optypes : (ot_reg64,ot_immediate,ot_none);
+    code    : #214#1#105#64#173;
+    flags   : if_x86_64
+  ),
   (
     opcode  : A_IMUL;
     ops     : 3;
@@ -2719,9 +2782,16 @@
   (
     opcode  : A_MOV;
     ops     : 2;
-    optypes : (ot_regmem or ot_bits32 or ot_bits64,ot_immediate,ot_none);
-    code    : #208#1#199#128#33;
-    flags   : if_386 or if_sd
+    optypes : (ot_regmem or ot_bits32,ot_immediate,ot_none);
+    code    : #213#1#199#128#33;
+    flags   : if_386 or if_sm
+  ),
+  (
+    opcode  : A_MOV;
+    ops     : 2;
+    optypes : (ot_regmem or ot_bits64,ot_immediate,ot_none);
+    code    : #214#1#199#128#173;
+    flags   : if_x86_64 or if_sm
   ),
   (
     opcode  : A_MOV;
@@ -2915,59 +2985,31 @@
   (
     opcode  : A_MOVQ;
     ops     : 2;
-    optypes : (ot_mmxreg,ot_memory,ot_none);
+    optypes : (ot_mmxreg,ot_mmxrm,ot_none);
     code    : #2#15#111#72;
     flags   : if_pent or if_mmx or if_sm
   ),
   (
     opcode  : A_MOVQ;
     ops     : 2;
-    optypes : (ot_mmxreg,ot_mmxreg,ot_none);
-    code    : #2#15#111#72;
-    flags   : if_pent or if_mmx
-  ),
-  (
-    opcode  : A_MOVQ;
-    ops     : 2;
-    optypes : (ot_memory,ot_mmxreg,ot_none);
+    optypes : (ot_mmxrm,ot_mmxreg,ot_none);
     code    : #2#15#127#65;
     flags   : if_pent or if_mmx or if_sm
   ),
   (
     opcode  : A_MOVQ;
     ops     : 2;
-    optypes : (ot_mmxreg,ot_mmxreg,ot_none);
-    code    : #2#15#127#65;
-    flags   : if_pent or if_mmx
-  ),
-  (
-    opcode  : A_MOVQ;
-    ops     : 2;
-    optypes : (ot_xmmreg,ot_xmmreg,ot_none);
+    optypes : (ot_xmmreg,ot_xmmrm,ot_none);
     code    : #219#2#15#126#72;
     flags   : if_willamette or if_sse2
   ),
   (
     opcode  : A_MOVQ;
     ops     : 2;
-    optypes : (ot_xmmreg,ot_xmmreg,ot_none);
+    optypes : (ot_xmmrm,ot_xmmreg,ot_none);
     code    : #241#2#15#214#72;
     flags   : if_willamette or if_sse2
   ),
-  (
-    opcode  : A_MOVQ;
-    ops     : 2;
-    optypes : (ot_memory,ot_xmmreg,ot_none);
-    code    : #241#2#15#214#65;
-    flags   : if_willamette or if_sse2
-  ),
-  (
-    opcode  : A_MOVQ;
-    ops     : 2;
-    optypes : (ot_xmmreg,ot_memory,ot_none);
-    code    : #219#2#15#126#72;
-    flags   : if_willamette or if_sse2
-  ),
   (
     opcode  : A_MOVQ;
     ops     : 2;
@@ -3167,16 +3209,30 @@
   (
     opcode  : A_OR;
     ops     : 2;
-    optypes : (ot_reg_eax or ot_bits64,ot_immediate,ot_none);
-    code    : #208#1#13#33;
-    flags   : if_386 or if_sd
+    optypes : (ot_reg_eax,ot_immediate,ot_none);
+    code    : #213#1#13#33;
+    flags   : if_386 or if_sm
   ),
   (
     opcode  : A_OR;
     ops     : 2;
-    optypes : (ot_regmem or ot_bits32 or ot_bits64,ot_immediate,ot_none);
-    code    : #208#1#129#129#33;
-    flags   : if_386 or if_sd
+    optypes : (ot_reg_rax,ot_immediate,ot_none);
+    code    : #214#1#13#173;
+    flags   : if_x86_64 or if_sm
+  ),
+  (
+    opcode  : A_OR;
+    ops     : 2;
+    optypes : (ot_regmem or ot_bits32,ot_immediate,ot_none);
+    code    : #213#1#129#129#33;
+    flags   : if_386 or if_sm
+  ),
+  (
+    opcode  : A_OR;
+    ops     : 2;
+    optypes : (ot_regmem or ot_bits64,ot_immediate,ot_none);
+    code    : #214#1#129#129#173;
+    flags   : if_x86_64 or if_sm
   ),
   (
     opcode  : A_OR;
@@ -3776,17 +3832,31 @@
   (
     opcode  : A_POP;
     ops     : 1;
-    optypes : (ot_reg16 or ot_bits32 or ot_bits64,ot_none,ot_none);
-    code    : #208#8#88#221;
+    optypes : (ot_reg16,ot_none,ot_none);
+    code    : #212#8#88;
     flags   : if_8086
   ),
   (
     opcode  : A_POP;
     ops     : 1;
-    optypes : (ot_regmem or ot_bits16 or ot_bits32 or ot_bits64,ot_none,ot_none);
-    code    : #192#208#1#143#128#221;
+    optypes : (ot_reg64,ot_none,ot_none);
+    code    : #221#8#88;
+    flags   : if_x86_64
+  ),
+  (
+    opcode  : A_POP;
+    ops     : 1;
+    optypes : (ot_regmem or ot_bits16,ot_none,ot_none);
+    code    : #212#1#143#128;
     flags   : if_8086
   ),
+  (
+    opcode  : A_POP;
+    ops     : 1;
+    optypes : (ot_regmem or ot_bits64,ot_none,ot_none);
+    code    : #221#1#143#128;
+    flags   : if_x86_64
+  ),
   (
     opcode  : A_POP;
     ops     : 1;
@@ -4280,17 +4350,31 @@
   (
     opcode  : A_PUSH;
     ops     : 1;
-    optypes : (ot_reg16 or ot_bits32 or ot_bits64,ot_none,ot_none);
-    code    : #208#8#80#221;
+    optypes : (ot_reg16,ot_none,ot_none);
+    code    : #212#8#80;
     flags   : if_8086
   ),
   (
     opcode  : A_PUSH;
     ops     : 1;
-    optypes : (ot_regmem or ot_bits16 or ot_bits32 or ot_bits64,ot_none,ot_none);
-    code    : #192#208#1#255#134#221;
+    optypes : (ot_reg64,ot_none,ot_none);
+    code    : #221#8#80;
+    flags   : if_x86_64
+  ),
+  (
+    opcode  : A_PUSH;
+    ops     : 1;
+    optypes : (ot_regmem or ot_bits16,ot_none,ot_none);
+    code    : #212#1#255#134;
     flags   : if_8086
   ),
+  (
+    opcode  : A_PUSH;
+    ops     : 1;
+    optypes : (ot_regmem or ot_bits64,ot_none,ot_none);
+    code    : #221#1#255#134;
+    flags   : if_x86_64
+  ),
   (
     opcode  : A_PUSH;
     ops     : 1;
@@ -4770,16 +4854,30 @@
   (
     opcode  : A_SBB;
     ops     : 2;
-    optypes : (ot_reg_eax or ot_bits64,ot_immediate,ot_none);
-    code    : #208#1#29#33;
-    flags   : if_386 or if_sd
+    optypes : (ot_reg_eax,ot_immediate,ot_none);
+    code    : #213#1#29#33;
+    flags   : if_386 or if_sm
   ),
   (
     opcode  : A_SBB;
     ops     : 2;
-    optypes : (ot_regmem or ot_bits32 or ot_bits64,ot_immediate,ot_none);
+    optypes : (ot_reg_rax,ot_immediate,ot_none);
+    code    : #214#1#29#173;
+    flags   : if_x86_64 or if_sm
+  ),
+  (
+    opcode  : A_SBB;
+    ops     : 2;
+    optypes : (ot_regmem or ot_bits32,ot_immediate,ot_none);
     code    : #208#1#129#131#33;
-    flags   : if_386 or if_sd
+    flags   : if_386 or if_sm
+  ),
+  (
+    opcode  : A_SBB;
+    ops     : 2;
+    optypes : (ot_regmem or ot_bits64,ot_immediate,ot_none);
+    code    : #214#1#129#131#173;
+    flags   : if_x86_64 or if_sm
   ),
   (
     opcode  : A_SBB;
@@ -5141,16 +5239,30 @@
   (
     opcode  : A_SUB;
     ops     : 2;
-    optypes : (ot_reg_eax or ot_bits64,ot_immediate,ot_none);
-    code    : #208#1#45#33;
-    flags   : if_386 or if_sd
+    optypes : (ot_reg_eax,ot_immediate,ot_none);
+    code    : #213#1#45#33;
+    flags   : if_386 or if_sm
+  ),
+  (
+    opcode  : A_SUB;
+    ops     : 2;
+    optypes : (ot_reg_rax,ot_immediate,ot_none);
+    code    : #214#1#45#173;
+    flags   : if_x86_64 or if_sm
   ),
   (
     opcode  : A_SUB;
     ops     : 2;
-    optypes : (ot_regmem or ot_bits32 or ot_bits64,ot_immediate,ot_none);
+    optypes : (ot_regmem or ot_bits32,ot_immediate,ot_none);
     code    : #208#1#129#133#33;
-    flags   : if_8086 or if_sd
+    flags   : if_386 or if_sm
+  ),
+  (
+    opcode  : A_SUB;
+    ops     : 2;
+    optypes : (ot_regmem or ot_bits64,ot_immediate,ot_none);
+    code    : #214#1#129#133#173;
+    flags   : if_x86_64 or if_sm
   ),
   (
     opcode  : A_SUB;
@@ -5257,6 +5369,13 @@
     code    : #1#132#65;
     flags   : if_8086 or if_sm
   ),
+  (
+    opcode  : A_TEST;
+    ops     : 2;
+    optypes : (ot_reg_rax,ot_immediate,ot_none);
+    code    : #214#1#169#173;
+    flags   : if_x86_64 or if_sm
+  ),
   (
     opcode  : A_TEST;
     ops     : 2;
@@ -5278,6 +5397,13 @@
     code    : #1#168#17;
     flags   : if_8086 or if_sm
   ),
+  (
+    opcode  : A_TEST;
+    ops     : 2;
+    optypes : (ot_regmem or ot_bits64,ot_immediate,ot_none);
+    code    : #214#1#247#128#173;
+    flags   : if_x86_64 or if_sm
+  ),
   (
     opcode  : A_TEST;
     ops     : 2;
@@ -5596,16 +5722,30 @@
   (
     opcode  : A_XOR;
     ops     : 2;
-    optypes : (ot_reg_eax or ot_bits64,ot_immediate,ot_none);
-    code    : #208#1#53#33;
-    flags   : if_386 or if_sd
+    optypes : (ot_reg_eax,ot_immediate,ot_none);
+    code    : #213#1#53#33;
+    flags   : if_386 or if_sm
+  ),
+  (
+    opcode  : A_XOR;
+    ops     : 2;
+    optypes : (ot_reg_rax,ot_immediate,ot_none);
+    code    : #214#1#53#173;
+    flags   : if_x86_64 or if_sm
   ),
   (
     opcode  : A_XOR;
     ops     : 2;
-    optypes : (ot_regmem or ot_bits32 or ot_bits64,ot_immediate,ot_none);
+    optypes : (ot_regmem or ot_bits32,ot_immediate,ot_none);
     code    : #208#1#129#134#33;
-    flags   : if_386 or if_sd
+    flags   : if_386 or if_sm
+  ),
+  (
+    opcode  : A_XOR;
+    ops     : 2;
+    optypes : (ot_regmem or ot_bits64,ot_immediate,ot_none);
+    code    : #214#1#129#134#173;
+    flags   : if_x86_64 or if_sm
   ),
   (
     opcode  : A_XOR;
@@ -6499,70 +6639,35 @@
   (
     opcode  : A_PFNACC;
     ops     : 2;
-    optypes : (ot_mmxreg,ot_memory,ot_none);
-    code    : #2#15#15#72#1#138;
-    flags   : if_pent or if_3dnow or if_sm
-  ),
-  (
-    opcode  : A_PFNACC;
-    ops     : 2;
-    optypes : (ot_mmxreg,ot_mmxreg,ot_none);
+    optypes : (ot_mmxreg,ot_mmxrm,ot_none);
     code    : #2#15#15#72#1#138;
-    flags   : if_pent or if_3dnow
-  ),
-  (
-    opcode  : A_PFPNACC;
-    ops     : 2;
-    optypes : (ot_mmxreg,ot_memory,ot_none);
-    code    : #2#15#15#72#1#142;
     flags   : if_pent or if_3dnow or if_sm
   ),
   (
     opcode  : A_PFPNACC;
     ops     : 2;
-    optypes : (ot_mmxreg,ot_mmxreg,ot_none);
+    optypes : (ot_mmxreg,ot_mmxrm,ot_none);
     code    : #2#15#15#72#1#142;
-    flags   : if_pent or if_3dnow
-  ),
-  (
-    opcode  : A_PI2FW;
-    ops     : 2;
-    optypes : (ot_mmxreg,ot_memory,ot_none);
-    code    : #2#15#15#72#1#12;
     flags   : if_pent or if_3dnow or if_sm
   ),
   (
     opcode  : A_PI2FW;
     ops     : 2;
-    optypes : (ot_mmxreg,ot_mmxreg,ot_none);
+    optypes : (ot_mmxreg,ot_mmxrm,ot_none);
     code    : #2#15#15#72#1#12;
-    flags   : if_pent or if_3dnow
-  ),
-  (
-    opcode  : A_PF2IW;
-    ops     : 2;
-    optypes : (ot_mmxreg,ot_memory,ot_none);
-    code    : #2#15#15#72#1#28;
     flags   : if_pent or if_3dnow or if_sm
   ),
   (
     opcode  : A_PF2IW;
     ops     : 2;
-    optypes : (ot_mmxreg,ot_mmxreg,ot_none);
+    optypes : (ot_mmxreg,ot_mmxrm,ot_none);
     code    : #2#15#15#72#1#28;
-    flags   : if_pent or if_3dnow
-  ),
-  (
-    opcode  : A_PSWAPD;
-    ops     : 2;
-    optypes : (ot_mmxreg,ot_memory,ot_none);
-    code    : #2#15#15#72#1#187;
     flags   : if_pent or if_3dnow or if_sm
   ),
   (
     opcode  : A_PSWAPD;
     ops     : 2;
-    optypes : (ot_mmxreg,ot_mmxreg,ot_none);
+    optypes : (ot_mmxreg,ot_mmxrm,ot_none);
     code    : #2#15#15#72#1#187;
     flags   : if_pent or if_3dnow or if_sm
   ),

+ 14 - 0
tests/test/tasm5.pp

@@ -0,0 +1,14 @@
+{ %CPU=x86_64 }
+{ %fail }
+
+{$asmmode att}
+// Immediates must fit into 32 bits (except in 'mov' instruction)
+procedure test; assembler; nostackframe;
+asm
+      andq   $0x0000000105060708, %rax
+      orq    $0xffffffff00000000, %rax
+end;
+
+
+begin
+end.

+ 15 - 0
tests/test/tasm6.pp

@@ -0,0 +1,15 @@
+{ %CPU=x86_64 }
+{ %fail }
+
+// push and pop with 32-bit operands aren't encodable in x86_64
+{$asmmode att}
+procedure test; assembler; nostackframe;
+asm
+     push   %eax
+     pop    %r8d
+     pushl  (%rax)
+     popl   (%r8)
+end;
+
+begin
+end.