* proper fix to avoid sp relative adressing as r23867 tries

git-svn-id: branches/i8086@23868 -
This commit is contained in:
florian 2013-03-16 16:51:31 +00:00
parent 01106a0968
commit edd4c1ce4b
2 changed files with 9 additions and 24 deletions

View File

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

View File

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