mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-08-14 07:09:23 +02:00
* fixed newra bug due to the fact that we sometimes need a temp reg
when loading/storing to memory (base+index+offset is not possible) and because a reference is often freed before it is last used, this temp register was soemtimes the same as one of the reference regs
This commit is contained in:
parent
db3bd69a18
commit
d73acd12f6
@ -2305,6 +2305,10 @@ const
|
|||||||
|
|
||||||
var
|
var
|
||||||
tmpreg: tregister;
|
tmpreg: tregister;
|
||||||
|
{$ifdef newra}
|
||||||
|
orgindex: tregister;
|
||||||
|
freeindex: boolean;
|
||||||
|
{$endif newra}
|
||||||
begin
|
begin
|
||||||
result := false;
|
result := false;
|
||||||
if (ref.base.number = NR_NO) then
|
if (ref.base.number = NR_NO) then
|
||||||
@ -2321,7 +2325,18 @@ const
|
|||||||
{$ifndef newra}
|
{$ifndef newra}
|
||||||
tmpreg := cg.get_scratch_reg_int(list,OS_INT);
|
tmpreg := cg.get_scratch_reg_int(list,OS_INT);
|
||||||
{$else newra}
|
{$else newra}
|
||||||
tmpreg := rg.getregisterint(list,OS_INT);
|
{ references are often freed before they are used. Since we allocate }
|
||||||
|
{ a register here, we must first reallocate the index register, since }
|
||||||
|
{ otherwise it may be overwritten (and it's still used afterwards) }
|
||||||
|
freeindex := false;
|
||||||
|
if ((ref.index.number shr 8) >= first_supreg) and
|
||||||
|
((ref.index.number shr 8) in rg.unusedregsint) then
|
||||||
|
begin
|
||||||
|
rg.getexplicitregisterint(list,ref.index.number);
|
||||||
|
orgindex := ref.index;
|
||||||
|
freeindex := true;
|
||||||
|
end;
|
||||||
|
tmpreg := rg.getregisterint(list,OS_ADDR);
|
||||||
{$endif newra}
|
{$endif newra}
|
||||||
if not assigned(ref.symbol) and
|
if not assigned(ref.symbol) and
|
||||||
(cardinal(ref.offset-low(smallint)) <=
|
(cardinal(ref.offset-low(smallint)) <=
|
||||||
@ -2338,6 +2353,12 @@ const
|
|||||||
ref.index.number := NR_NO;
|
ref.index.number := NR_NO;
|
||||||
end;
|
end;
|
||||||
ref.base := tmpreg;
|
ref.base := tmpreg;
|
||||||
|
{$ifdef newra}
|
||||||
|
if freeindex then
|
||||||
|
begin
|
||||||
|
rg.ungetregisterint(list,orgindex);
|
||||||
|
end;
|
||||||
|
{$endif newra}
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
else
|
else
|
||||||
@ -2702,7 +2723,13 @@ begin
|
|||||||
end.
|
end.
|
||||||
{
|
{
|
||||||
$Log$
|
$Log$
|
||||||
Revision 1.114 2003-07-20 16:15:58 jonas
|
Revision 1.115 2003-07-20 20:39:20 jonas
|
||||||
|
* fixed newra bug due to the fact that we sometimes need a temp reg
|
||||||
|
when loading/storing to memory (base+index+offset is not possible)
|
||||||
|
and because a reference is often freed before it is last used, this
|
||||||
|
temp register was soemtimes the same as one of the reference regs
|
||||||
|
|
||||||
|
Revision 1.114 2003/07/20 16:15:58 jonas
|
||||||
* fixed bug in g_concatcopy with -dnewra
|
* fixed bug in g_concatcopy with -dnewra
|
||||||
|
|
||||||
Revision 1.113 2003/07/06 20:25:03 jonas
|
Revision 1.113 2003/07/06 20:25:03 jonas
|
||||||
|
Loading…
Reference in New Issue
Block a user