mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-08-15 08:49:25 +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;
|
end;
|
||||||
2:
|
2:
|
||||||
begin
|
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
|
if (oper[0].typ=top_reg) and (oper[0].reg.enum=R_INTREGISTER) then
|
||||||
begin
|
begin
|
||||||
supreg:=oper[0].reg.number shr 8;
|
supreg:=oper[0].reg.number shr 8;
|
||||||
@ -2278,64 +2339,6 @@ implementation
|
|||||||
end;
|
end;
|
||||||
end;
|
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;
|
end;
|
||||||
3:
|
3:
|
||||||
begin
|
begin
|
||||||
@ -2395,7 +2398,10 @@ implementation
|
|||||||
end.
|
end.
|
||||||
{
|
{
|
||||||
$Log$
|
$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
|
* fix reg-supreg range check error
|
||||||
|
|
||||||
Revision 1.14 2003/08/20 16:52:01 daniel
|
Revision 1.14 2003/08/20 16:52:01 daniel
|
||||||
|
Loading…
Reference in New Issue
Block a user