mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-04-21 21:51:42 +02:00
* first spill the registers of top_ref before spilling top_reg
This commit is contained in:
parent
736ae20a79
commit
6b12cc11e5
@ -2133,6 +2133,67 @@ implementation
|
||||
end;
|
||||
2:
|
||||
begin
|
||||
{ First spill the registers from the references. This is
|
||||
required because the reference can be moved from this instruction
|
||||
to a MOV instruction when spilling of the register operand is done }
|
||||
for i:=0 to 1 do
|
||||
if oper[i].typ=top_ref then
|
||||
begin
|
||||
supreg:=oper[i].ref^.base.number shr 8;
|
||||
if supreg in r then
|
||||
begin
|
||||
{Situation example:
|
||||
add r20d,[r21d+4*r22d] ; r21d must be spilled into [ebp-12]
|
||||
|
||||
Change into:
|
||||
|
||||
mov r23d,[ebp-12] ; Use a help register
|
||||
add r20d,[r23d+4*r22d] ; Replace register by helpregister }
|
||||
subreg:=oper[i].ref^.base.number and $ff;
|
||||
if i=1 then
|
||||
pos:=get_insert_pos(Tai(previous),oper[i].ref^.index.number shr 8,oper[0].reg.number shr 8,
|
||||
0,unusedregsint)
|
||||
else
|
||||
pos:=get_insert_pos(Tai(previous),oper[i].ref^.index.number shr 8,0,0,unusedregsint);
|
||||
rgget(list,pos,subreg,helpreg);
|
||||
spill_registers:=true;
|
||||
helpins:=Taicpu.op_ref_reg(A_MOV,reg2opsize(oper[i].ref^.base),spilltemplist[supreg],helpreg);
|
||||
if pos=nil then
|
||||
list.insertafter(helpins,list.first)
|
||||
else
|
||||
list.insertafter(helpins,pos.next);
|
||||
oper[i].ref^.base:=helpreg;
|
||||
rgunget(list,helpins,helpreg);
|
||||
forward_allocation(Tai(helpins.next),unusedregsint);
|
||||
end;
|
||||
supreg:=oper[i].ref^.index.number shr 8;
|
||||
if supreg in r then
|
||||
begin
|
||||
{Situation example:
|
||||
add r20d,[r21d+4*r22d] ; r22d must be spilled into [ebp-12]
|
||||
|
||||
Change into:
|
||||
|
||||
mov r23d,[ebp-12] ; Use a help register
|
||||
add r20d,[r21d+4*r23d] ; Replace register by helpregister }
|
||||
subreg:=oper[i].ref^.index.number and $ff;
|
||||
if i=1 then
|
||||
pos:=get_insert_pos(Tai(previous),oper[i].ref^.base.number shr 8,oper[0].reg.number shr 8,
|
||||
0,unusedregsint)
|
||||
else
|
||||
pos:=get_insert_pos(Tai(previous),oper[i].ref^.base.number shr 8,0,0,unusedregsint);
|
||||
rgget(list,pos,subreg,helpreg);
|
||||
spill_registers:=true;
|
||||
helpins:=Taicpu.op_ref_reg(A_MOV,reg2opsize(oper[i].ref^.index),spilltemplist[supreg],helpreg);
|
||||
if pos=nil then
|
||||
list.insertafter(helpins,list.first)
|
||||
else
|
||||
list.insertafter(helpins,pos.next);
|
||||
oper[i].ref^.index:=helpreg;
|
||||
rgunget(list,helpins,helpreg);
|
||||
forward_allocation(Tai(helpins.next),unusedregsint);
|
||||
end;
|
||||
end;
|
||||
if (oper[0].typ=top_reg) and (oper[0].reg.enum=R_INTREGISTER) then
|
||||
begin
|
||||
supreg:=oper[0].reg.number shr 8;
|
||||
@ -2278,64 +2339,6 @@ implementation
|
||||
end;
|
||||
end;
|
||||
end;
|
||||
for i:=0 to 1 do
|
||||
if oper[i].typ=top_ref then
|
||||
begin
|
||||
supreg:=oper[i].ref^.base.number shr 8;
|
||||
if supreg in r then
|
||||
begin
|
||||
{Situation example:
|
||||
add r20d,[r21d+4*r22d] ; r21d must be spilled into [ebp-12]
|
||||
|
||||
Change into:
|
||||
|
||||
mov r23d,[ebp-12] ; Use a help register
|
||||
add r20d,[r23d+4*r22d] ; Replace register by helpregister }
|
||||
subreg:=oper[i].ref^.base.number and $ff;
|
||||
if i=1 then
|
||||
pos:=get_insert_pos(Tai(previous),oper[i].ref^.index.number shr 8,oper[0].reg.number shr 8,
|
||||
0,unusedregsint)
|
||||
else
|
||||
pos:=get_insert_pos(Tai(previous),oper[i].ref^.index.number shr 8,0,0,unusedregsint);
|
||||
rgget(list,pos,subreg,helpreg);
|
||||
spill_registers:=true;
|
||||
helpins:=Taicpu.op_ref_reg(A_MOV,reg2opsize(oper[i].ref^.base),spilltemplist[supreg],helpreg);
|
||||
if pos=nil then
|
||||
list.insertafter(helpins,list.first)
|
||||
else
|
||||
list.insertafter(helpins,pos.next);
|
||||
oper[i].ref^.base:=helpreg;
|
||||
rgunget(list,helpins,helpreg);
|
||||
forward_allocation(Tai(helpins.next),unusedregsint);
|
||||
end;
|
||||
supreg:=oper[i].ref^.index.number shr 8;
|
||||
if supreg in r then
|
||||
begin
|
||||
{Situation example:
|
||||
add r20d,[r21d+4*r22d] ; r22d must be spilled into [ebp-12]
|
||||
|
||||
Change into:
|
||||
|
||||
mov r23d,[ebp-12] ; Use a help register
|
||||
add r20d,[r21d+4*r23d] ; Replace register by helpregister }
|
||||
subreg:=oper[i].ref^.index.number and $ff;
|
||||
if i=1 then
|
||||
pos:=get_insert_pos(Tai(previous),oper[i].ref^.base.number shr 8,oper[0].reg.number shr 8,
|
||||
0,unusedregsint)
|
||||
else
|
||||
pos:=get_insert_pos(Tai(previous),oper[i].ref^.base.number shr 8,0,0,unusedregsint);
|
||||
rgget(list,pos,subreg,helpreg);
|
||||
spill_registers:=true;
|
||||
helpins:=Taicpu.op_ref_reg(A_MOV,reg2opsize(oper[i].ref^.index),spilltemplist[supreg],helpreg);
|
||||
if pos=nil then
|
||||
list.insertafter(helpins,list.first)
|
||||
else
|
||||
list.insertafter(helpins,pos.next);
|
||||
oper[i].ref^.index:=helpreg;
|
||||
rgunget(list,helpins,helpreg);
|
||||
forward_allocation(Tai(helpins.next),unusedregsint);
|
||||
end;
|
||||
end;
|
||||
end;
|
||||
3:
|
||||
begin
|
||||
@ -2395,7 +2398,10 @@ implementation
|
||||
end.
|
||||
{
|
||||
$Log$
|
||||
Revision 1.15 2003-08-21 14:48:36 peter
|
||||
Revision 1.16 2003-08-21 17:20:19 peter
|
||||
* first spill the registers of top_ref before spilling top_reg
|
||||
|
||||
Revision 1.15 2003/08/21 14:48:36 peter
|
||||
* fix reg-supreg range check error
|
||||
|
||||
Revision 1.14 2003/08/20 16:52:01 daniel
|
||||
|
Loading…
Reference in New Issue
Block a user