mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-08-12 07:46:00 +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
|
||||
tmpreg: tregister;
|
||||
{$ifdef newra}
|
||||
orgindex: tregister;
|
||||
freeindex: boolean;
|
||||
{$endif newra}
|
||||
begin
|
||||
result := false;
|
||||
if (ref.base.number = NR_NO) then
|
||||
@ -2321,7 +2325,18 @@ const
|
||||
{$ifndef newra}
|
||||
tmpreg := cg.get_scratch_reg_int(list,OS_INT);
|
||||
{$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}
|
||||
if not assigned(ref.symbol) and
|
||||
(cardinal(ref.offset-low(smallint)) <=
|
||||
@ -2338,6 +2353,12 @@ const
|
||||
ref.index.number := NR_NO;
|
||||
end;
|
||||
ref.base := tmpreg;
|
||||
{$ifdef newra}
|
||||
if freeindex then
|
||||
begin
|
||||
rg.ungetregisterint(list,orgindex);
|
||||
end;
|
||||
{$endif newra}
|
||||
end
|
||||
end
|
||||
else
|
||||
@ -2702,7 +2723,13 @@ begin
|
||||
end.
|
||||
{
|
||||
$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
|
||||
|
||||
Revision 1.113 2003/07/06 20:25:03 jonas
|
||||
|
Loading…
Reference in New Issue
Block a user