mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-09-01 06:30:26 +02:00
* proper fix to avoid sp relative adressing as r23867 tries
git-svn-id: branches/i8086@23868 -
This commit is contained in:
parent
01106a0968
commit
edd4c1ce4b
@ -59,9 +59,6 @@ unit cgcpu;
|
||||
procedure a_load_ref_reg(list : TAsmList;fromsize,tosize: tcgsize;const ref : treference;reg : tregister);override;
|
||||
procedure a_load_reg_reg(list : TAsmList;fromsize,tosize: tcgsize;reg1,reg2 : tregister);override;
|
||||
|
||||
{ fpu move instructions }
|
||||
procedure a_loadfpu_reg_ref(list: TAsmList; fromsize, tosize: tcgsize; reg: tregister; const ref: treference); override;
|
||||
|
||||
procedure g_flags2reg(list: TAsmList; size: TCgSize; const f: tresflags; reg: TRegister);override;
|
||||
procedure g_flags2ref(list: TAsmList; size: TCgSize; const f: tresflags; const ref: TReference);override;
|
||||
|
||||
@ -829,27 +826,6 @@ unit cgcpu;
|
||||
end;
|
||||
|
||||
|
||||
procedure tcg8086.a_loadfpu_reg_ref(list: TAsmList; fromsize, tosize: tcgsize; reg: tregister; const ref: treference);
|
||||
var
|
||||
tmpref: treference;
|
||||
begin
|
||||
{ i8086 does not support stack relative addressing }
|
||||
if ref.base = NR_STACK_POINTER_REG then
|
||||
begin
|
||||
tmpref := ref;
|
||||
{ TODO: is there a faster way to do this (e.g. rebase the address to
|
||||
be relative to bp directly)? }
|
||||
list.Concat(Taicpu.op_reg(A_PUSH, S_W, NR_BP));
|
||||
list.Concat(Taicpu.op_reg_reg(A_MOV, S_W, NR_SP, NR_BP));
|
||||
reference_reset_base(tmpref,NR_BP,ref.offset + 2,ref.alignment);
|
||||
inherited a_loadfpu_reg_ref(list, fromsize, tosize, reg, tmpref);
|
||||
list.Concat(Taicpu.op_reg(A_POP, S_W, NR_BP));
|
||||
end
|
||||
else
|
||||
inherited a_loadfpu_reg_ref(list, fromsize, tosize, reg, ref);
|
||||
end;
|
||||
|
||||
|
||||
procedure tcg8086.g_flags2reg(list: TAsmList; size: TCgSize; const f: tresflags; reg: TRegister);
|
||||
var
|
||||
ai : taicpu;
|
||||
|
@ -568,6 +568,15 @@ unit cgx86;
|
||||
end;
|
||||
end;
|
||||
{$elseif defined(i8086)}
|
||||
{ i8086 does not support stack relative addressing }
|
||||
if ref.base = NR_STACK_POINTER_REG then
|
||||
begin
|
||||
href:=ref;
|
||||
href.base:=getaddressregister(list);
|
||||
{ let the register allocator find a suitable register for the reference }
|
||||
list.Concat(Taicpu.op_reg_reg(A_MOV, S_W, NR_SP, href.base));
|
||||
ref:=href;
|
||||
end
|
||||
{$endif}
|
||||
end;
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user