mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-04-23 00:09:31 +02:00
+ x86 assembler: fixed MOVABS instruction (it is a x86_64-only subset of MOV with 8-byte immediates/offsets) and same-form encodings of MOV instruction.
git-svn-id: trunk@17666 -
This commit is contained in:
parent
aa064c569d
commit
354d0520b7
@ -1,2 +1,2 @@
|
||||
{ don't edit, this file is generated from x86ins.dat }
|
||||
1202;
|
||||
1203;
|
||||
|
@ -2915,9 +2915,16 @@
|
||||
(
|
||||
opcode : A_MOV;
|
||||
ops : 2;
|
||||
optypes : (ot_mem_offs,ot_reg_ax or ot_bits32,ot_none);
|
||||
code : #208#1#163#28;
|
||||
flags : if_8086 or if_sm or if_nox86_64
|
||||
optypes : (ot_mem_offs,ot_reg_ax,ot_none);
|
||||
code : #212#1#163#36;
|
||||
flags : if_8086 or if_sm
|
||||
),
|
||||
(
|
||||
opcode : A_MOV;
|
||||
ops : 2;
|
||||
optypes : (ot_mem_offs,ot_reg_eax,ot_none);
|
||||
code : #213#1#163#36;
|
||||
flags : if_386 or if_sm
|
||||
),
|
||||
(
|
||||
opcode : A_MOV;
|
||||
@ -2930,15 +2937,15 @@
|
||||
opcode : A_MOV;
|
||||
ops : 2;
|
||||
optypes : (ot_reg_ax,ot_mem_offs,ot_none);
|
||||
code : #212#1#161#29;
|
||||
flags : if_8086 or if_sm or if_nox86_64
|
||||
code : #212#1#161#37;
|
||||
flags : if_8086 or if_sm
|
||||
),
|
||||
(
|
||||
opcode : A_MOV;
|
||||
ops : 2;
|
||||
optypes : (ot_reg_eax,ot_mem_offs,ot_none);
|
||||
code : #213#1#161#29;
|
||||
flags : if_386 or if_sm or if_nox86_64
|
||||
code : #213#1#161#37;
|
||||
flags : if_386 or if_sm
|
||||
),
|
||||
(
|
||||
opcode : A_MOV;
|
||||
@ -2950,8 +2957,8 @@
|
||||
(
|
||||
opcode : A_MOV;
|
||||
ops : 2;
|
||||
optypes : (ot_reg32 or ot_bits64,ot_immediate,ot_none);
|
||||
code : #208#8#184#29;
|
||||
optypes : (ot_reg32,ot_immediate,ot_none);
|
||||
code : #213#8#184#33;
|
||||
flags : if_386 or if_sd
|
||||
),
|
||||
(
|
||||
@ -2979,8 +2986,8 @@
|
||||
opcode : A_MOV;
|
||||
ops : 2;
|
||||
optypes : (ot_mem_offs,ot_reg_al,ot_none);
|
||||
code : #1#162#28;
|
||||
flags : if_8086 or if_sm or if_nox86_64
|
||||
code : #1#162#36;
|
||||
flags : if_8086 or if_sm
|
||||
),
|
||||
(
|
||||
opcode : A_MOV;
|
||||
@ -2993,8 +3000,8 @@
|
||||
opcode : A_MOV;
|
||||
ops : 2;
|
||||
optypes : (ot_reg_al,ot_mem_offs,ot_none);
|
||||
code : #1#160#29;
|
||||
flags : if_8086 or if_sm or if_nox86_64
|
||||
code : #1#160#37;
|
||||
flags : if_8086 or if_sm
|
||||
),
|
||||
(
|
||||
opcode : A_MOV;
|
||||
|
@ -1767,14 +1767,15 @@ implementation
|
||||
else
|
||||
inc(len,4);
|
||||
end;
|
||||
36,37,38:
|
||||
inc(len,sizeof(pint));
|
||||
44,45,46:
|
||||
inc(len,8);
|
||||
32,33,34,
|
||||
52,53,54,
|
||||
56,57,58,
|
||||
172,173,174 :
|
||||
inc(len,4);
|
||||
192,193,194 :
|
||||
if NeedAddrPrefix(c-192) then
|
||||
inc(len);
|
||||
208,209,210 :
|
||||
begin
|
||||
case (oper[c-208]^.ot and OT_SIZE_MASK) of
|
||||
@ -1884,7 +1885,10 @@ implementation
|
||||
* assembly mode or the address-size override on the operand
|
||||
* \37 - a word constant, from the _segment_ part of operand 0
|
||||
* \40, \41, \42 - a long immediate operand, from operand 0, 1 or 2
|
||||
* \44, \45, \46 - select between \3[012], \4[012] or \5[456] depending
|
||||
on the address size of instruction
|
||||
* \50, \51, \52 - a byte relative operand, from operand 0, 1 or 2
|
||||
* \54, \55, \56 - a qword immediate, from operand 0, 1 or 2
|
||||
* \60, \61, \62 - a word relative operand, from operand 0, 1 or 2
|
||||
* \64, \65, \66 - select between \6[012] and \7[012] depending on 16/32 bit
|
||||
* assembly mode or the address-size override on the operand
|
||||
@ -2170,6 +2174,21 @@ implementation
|
||||
else
|
||||
objdata.writebytes(currval,4);
|
||||
end;
|
||||
36,37,38 : // 044..046 - select between word/dword/qword depending on
|
||||
begin // address size (we support only default address sizes).
|
||||
getvalsym(c-36);
|
||||
{$ifdef x86_64}
|
||||
if assigned(currsym) then
|
||||
objdata_writereloc(currval,8,currsym,currabsreloc)
|
||||
else
|
||||
objdata.writebytes(currval,8);
|
||||
{$else x86_64}
|
||||
if assigned(currsym) then
|
||||
objdata_writereloc(currval,4,currsym,currabsreloc32)
|
||||
else
|
||||
objdata.writebytes(currval,4);
|
||||
{$endif x86_64}
|
||||
end;
|
||||
40,41,42 : // 050..052 - byte relative operand
|
||||
begin
|
||||
getvalsym(c-40);
|
||||
@ -2180,6 +2199,14 @@ implementation
|
||||
Message1(asmw_e_short_jmp_out_of_range,tostr(data));
|
||||
objdata.writebytes(data,1);
|
||||
end;
|
||||
44,45,46: // 054..056 - qword immediate operand
|
||||
begin
|
||||
getvalsym(c-44);
|
||||
if assigned(currsym) then
|
||||
objdata_writereloc(currval,8,currsym,currabsreloc)
|
||||
else
|
||||
objdata.writebytes(currval,8);
|
||||
end;
|
||||
52,53,54 : // 064..066 - select between 16/32 address mode, but we support only 32
|
||||
begin
|
||||
getvalsym(c-52);
|
||||
@ -2207,14 +2234,6 @@ implementation
|
||||
else
|
||||
objdata.writebytes(currval,4);
|
||||
end;
|
||||
192,193,194 :
|
||||
begin
|
||||
if NeedAddrPrefix(c-192) then
|
||||
begin
|
||||
bytes[0]:=$67;
|
||||
objdata.writebytes(bytes,1);
|
||||
end;
|
||||
end;
|
||||
200 : { fixed 16-bit addr }
|
||||
{$ifndef x86_64}
|
||||
begin
|
||||
|
@ -1024,19 +1024,23 @@ reg_eax,reg_ecx,reg_edx \3\x0F\x01\xC8 PRESCOTT,ND
|
||||
|
||||
[MOV,movX]
|
||||
(Ch_Wop2, Ch_Rop1, Ch_None)
|
||||
mem_offs,reg_ax|32 \320\1\xA3\34 8086,SM,NOX86_64
|
||||
mem_offs,reg_ax \324\1\xA3\44 8086,SM
|
||||
mem_offs,reg_eax \325\1\xA3\44 386,SM
|
||||
mem_offs,reg_rax \326\1\xA3\44 X86_64,SM
|
||||
regmem,reg16|32|64 \320\1\x89\101 8086,SM
|
||||
reg_ax,mem_offs \324\1\xA1\35 8086,SM,NOX86_64
|
||||
reg_eax,mem_offs \325\1\xA1\35 386,SM,NOX86_64
|
||||
reg_ax,mem_offs \324\1\xA1\45 8086,SM
|
||||
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|64,imm \320\10\xB8\35 386,SD
|
||||
reg32,imm \325\10\xB8\41 386,SD
|
||||
reg64,imm \326\10\xB8\55 X86_64,SM
|
||||
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
|
||||
mem_offs,reg_al \1\xA2\44 8086,SM
|
||||
rm8,reg8 \1\x88\101 8086
|
||||
reg_al,mem_offs \1\xA0\35 8086,SM,NOX86_64
|
||||
reg_al,mem_offs \1\xA0\45 8086,SM
|
||||
reg8,rm8 \1\x8A\110 8086,SM
|
||||
reg8,imm \10\xB0\21 8086,SB
|
||||
rm8,imm \1\xC6\200\21 8086,SB
|
||||
@ -3008,7 +3012,11 @@ void \2\x0F\x3A P6,CYRIX
|
||||
;
|
||||
[MOVABS]
|
||||
(Ch_Wop2, Ch_Rop1, Ch_None)
|
||||
reg32,imm \325\10\xB8\41 X86_64
|
||||
reg_al,mem_offs \1\xA0\45 X86_64,SM
|
||||
reg_ax|32|64,mem_offs \320\1\xA1\45 X86_64,SM
|
||||
mem_offs,reg_al \1\xA2\44 X86_64,SM
|
||||
mem_offs,reg_ax|32|64 \321\xA3\44 X86_64,SM
|
||||
reg64,imm \326\10\xB8\55 X86_64
|
||||
|
||||
[MOVSXD,movslq]
|
||||
(Ch_Wop2, Ch_Rop1, Ch_None)
|
||||
|
@ -1,2 +1,2 @@
|
||||
{ don't edit, this file is generated from x86ins.dat }
|
||||
1199;
|
||||
1212;
|
||||
|
@ -2758,6 +2758,27 @@
|
||||
code : #3#15#1#200;
|
||||
flags : if_prescott
|
||||
),
|
||||
(
|
||||
opcode : A_MOV;
|
||||
ops : 2;
|
||||
optypes : (ot_mem_offs,ot_reg_ax,ot_none);
|
||||
code : #212#1#163#36;
|
||||
flags : if_8086 or if_sm
|
||||
),
|
||||
(
|
||||
opcode : A_MOV;
|
||||
ops : 2;
|
||||
optypes : (ot_mem_offs,ot_reg_eax,ot_none);
|
||||
code : #213#1#163#36;
|
||||
flags : if_386 or if_sm
|
||||
),
|
||||
(
|
||||
opcode : A_MOV;
|
||||
ops : 2;
|
||||
optypes : (ot_mem_offs,ot_reg_rax,ot_none);
|
||||
code : #214#1#163#36;
|
||||
flags : if_x86_64 or if_sm
|
||||
),
|
||||
(
|
||||
opcode : A_MOV;
|
||||
ops : 2;
|
||||
@ -2765,6 +2786,27 @@
|
||||
code : #208#1#137#65;
|
||||
flags : if_8086 or if_sm
|
||||
),
|
||||
(
|
||||
opcode : A_MOV;
|
||||
ops : 2;
|
||||
optypes : (ot_reg_ax,ot_mem_offs,ot_none);
|
||||
code : #212#1#161#37;
|
||||
flags : if_8086 or if_sm
|
||||
),
|
||||
(
|
||||
opcode : A_MOV;
|
||||
ops : 2;
|
||||
optypes : (ot_reg_eax,ot_mem_offs,ot_none);
|
||||
code : #213#1#161#37;
|
||||
flags : if_386 or if_sm
|
||||
),
|
||||
(
|
||||
opcode : A_MOV;
|
||||
ops : 2;
|
||||
optypes : (ot_reg_rax,ot_mem_offs,ot_none);
|
||||
code : #214#1#161#37;
|
||||
flags : if_x86_64 or if_sm
|
||||
),
|
||||
(
|
||||
opcode : A_MOV;
|
||||
ops : 2;
|
||||
@ -2775,10 +2817,17 @@
|
||||
(
|
||||
opcode : A_MOV;
|
||||
ops : 2;
|
||||
optypes : (ot_reg32 or ot_bits64,ot_immediate,ot_none);
|
||||
code : #208#8#184#29;
|
||||
optypes : (ot_reg32,ot_immediate,ot_none);
|
||||
code : #213#8#184#33;
|
||||
flags : if_386 or if_sd
|
||||
),
|
||||
(
|
||||
opcode : A_MOV;
|
||||
ops : 2;
|
||||
optypes : (ot_reg64,ot_immediate,ot_none);
|
||||
code : #214#8#184#45;
|
||||
flags : if_x86_64 or if_sm
|
||||
),
|
||||
(
|
||||
opcode : A_MOV;
|
||||
ops : 2;
|
||||
@ -2807,6 +2856,13 @@
|
||||
code : #212#1#199#128#25;
|
||||
flags : if_8086 or if_sw
|
||||
),
|
||||
(
|
||||
opcode : A_MOV;
|
||||
ops : 2;
|
||||
optypes : (ot_mem_offs,ot_reg_al,ot_none);
|
||||
code : #1#162#36;
|
||||
flags : if_8086 or if_sm
|
||||
),
|
||||
(
|
||||
opcode : A_MOV;
|
||||
ops : 2;
|
||||
@ -2814,6 +2870,13 @@
|
||||
code : #1#136#65;
|
||||
flags : if_8086
|
||||
),
|
||||
(
|
||||
opcode : A_MOV;
|
||||
ops : 2;
|
||||
optypes : (ot_reg_al,ot_mem_offs,ot_none);
|
||||
code : #1#160#37;
|
||||
flags : if_8086 or if_sm
|
||||
),
|
||||
(
|
||||
opcode : A_MOV;
|
||||
ops : 2;
|
||||
@ -7563,8 +7626,36 @@
|
||||
(
|
||||
opcode : A_MOVABS;
|
||||
ops : 2;
|
||||
optypes : (ot_reg32,ot_immediate,ot_none);
|
||||
code : #213#8#184#33;
|
||||
optypes : (ot_reg_al,ot_mem_offs,ot_none);
|
||||
code : #1#160#37;
|
||||
flags : if_x86_64 or if_sm
|
||||
),
|
||||
(
|
||||
opcode : A_MOVABS;
|
||||
ops : 2;
|
||||
optypes : (ot_reg_ax or ot_bits32 or ot_bits64,ot_mem_offs,ot_none);
|
||||
code : #208#1#161#37;
|
||||
flags : if_x86_64 or if_sm
|
||||
),
|
||||
(
|
||||
opcode : A_MOVABS;
|
||||
ops : 2;
|
||||
optypes : (ot_mem_offs,ot_reg_al,ot_none);
|
||||
code : #1#162#36;
|
||||
flags : if_x86_64 or if_sm
|
||||
),
|
||||
(
|
||||
opcode : A_MOVABS;
|
||||
ops : 2;
|
||||
optypes : (ot_mem_offs,ot_reg_ax or ot_bits32 or ot_bits64,ot_none);
|
||||
code : #209#163#36;
|
||||
flags : if_x86_64 or if_sm
|
||||
),
|
||||
(
|
||||
opcode : A_MOVABS;
|
||||
ops : 2;
|
||||
optypes : (ot_reg64,ot_immediate,ot_none);
|
||||
code : #214#8#184#45;
|
||||
flags : if_x86_64
|
||||
),
|
||||
(
|
||||
|
Loading…
Reference in New Issue
Block a user