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 -
This commit is contained in:
sergei 2011-05-17 20:06:12 +00:00
parent 6ea8eb7dc2
commit 9e8a31193b
9 changed files with 438 additions and 305 deletions

2
.gitattributes vendored
View File

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

View File

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

View File

@ -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);
optypes : (ot_mmxreg,ot_mmxrm,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);
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
),

View File

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

View File

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

View File

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

View File

@ -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_regmem or ot_bits32 or ot_bits64,ot_immediate,ot_none);
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,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_regmem or ot_bits32 or ot_bits64,ot_immediate,ot_none);
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,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);
optypes : (ot_mmxreg,ot_mmxrm,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);
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
tests/test/tasm5.pp Normal file
View File

@ -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
tests/test/tasm6.pp Normal file
View File

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