+ choose the correct version of "Jcc near" to use on i8086 (386+ or 8086+)

depending on the specified target cpu type
+ support the \60..\62 magic codes on i8086 in the internal asm writer

git-svn-id: trunk@30613 -
This commit is contained in:
nickysn 2015-04-16 19:49:22 +00:00
parent 2cf6852910
commit 25a834087e

View File

@ -1349,6 +1349,17 @@ implementation
if (p^.opcode<>opcode) or (p^.ops<>ops) then
exit;
{$ifdef i8086}
{ On i8086, we need to skip the i386+ version of Jcc near, if the target
cpu is earlier than 386. There's another entry, later in the table for
i8086, which simulates it with i8086 instructions:
JNcc short +3
JMP near target }
if (p^.opcode=A_Jcc) and (current_settings.cputype<cpu_386) and
((p^.flags and IF_386)<>0) then
exit;
{$endif i8086}
for i:=0 to p^.ops-1 do
begin
insot:=p^.optypes[i];
@ -2973,6 +2984,18 @@ implementation
else
objdata.writebytes(currval,8);
end;
&60,&61,&62 :
begin
getvalsym(c-&60);
{$ifdef i8086}
if assigned(currsym) then
objdata_writereloc(currval,2,currsym,currrelreloc)
else
objdata_writereloc(currval-insend,2,nil,currabsreloc)
{$else i8086}
InternalError(777006);
{$endif i8086}
end;
&64,&65,&66 : // 064..066 - select between 16/32 address mode, but we support only 32 (only 16 on i8086)
begin
getvalsym(c-&64);
@ -3161,10 +3184,6 @@ implementation
InternalError(777006);
{$endif i8086}
end;
&60,&61,&62 :
begin
InternalError(777006);
end
else
begin
{ rex should be written at this point }