mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-12-25 07:00:41 +01:00
* when restoring a register's previous contents after it's been replaced
completely, there were some missing checks to make certain these
previous contents didn't conflict with memory operations in the new
sequence
git-svn-id: trunk@3329 -
This commit is contained in:
parent
a0d4f358eb
commit
4b887ef604
@ -904,15 +904,39 @@ begin
|
|||||||
{ ptaiprop(p.optinfo)^.Regs[reg] := c;}
|
{ ptaiprop(p.optinfo)^.Regs[reg] := c;}
|
||||||
newrstate := c.rstate;
|
newrstate := c.rstate;
|
||||||
incstate(newrstate,$7f);
|
incstate(newrstate,$7f);
|
||||||
while (p <> endP) do
|
memconflict := false;
|
||||||
|
invalsmemwrite := false;
|
||||||
|
while (p <> endP) and
|
||||||
|
not(memconflict) and
|
||||||
|
not(invalsmemwrite) do
|
||||||
begin
|
begin
|
||||||
if not(ptaiprop(p.optinfo)^.canberemoved) and
|
if not(ptaiprop(p.optinfo)^.canberemoved) and
|
||||||
regreadbyinstruction(supreg,p) then
|
regreadbyinstruction(supreg,p) then
|
||||||
incstate(newrstate,1);
|
incstate(newrstate,1);
|
||||||
ptaiprop(p.optinfo)^.Regs[supreg] := c;
|
// is this a write to memory that destroys the contents we are restoring?
|
||||||
ptaiprop(p.optinfo)^.Regs[supreg].rstate := newrstate;
|
memconflict := modifiesConflictingMemLocation(p,supreg,ptaiprop(p.optinfo)^.regs,dummyregs,true,invalsmemwrite);
|
||||||
|
if not memconflict and not invalsmemwrite then
|
||||||
|
begin
|
||||||
|
ptaiprop(p.optinfo)^.Regs[supreg] := c;
|
||||||
|
ptaiprop(p.optinfo)^.Regs[supreg].rstate := newrstate;
|
||||||
|
end
|
||||||
|
else
|
||||||
|
begin
|
||||||
|
clearRegContentsFrom(asml,supreg,p,endP);
|
||||||
|
{$ifdef replaceregdebug}
|
||||||
|
if assigned(p) then
|
||||||
|
begin
|
||||||
|
hp := tai_comment.Create(strpnew(
|
||||||
|
'stopping restoring of '+std_regname(newreg(R_INTREGISTER,supreg,R_SUBWHOLE))+'because memory conflict... '+tostr(l)));
|
||||||
|
insertllitem(asml,p,p.next,hp);
|
||||||
|
end;
|
||||||
|
{$endif replaceregdebug}
|
||||||
|
exit
|
||||||
|
end;
|
||||||
|
|
||||||
getNextInstruction(p,p);
|
getNextInstruction(p,p);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
tmpState := ptaiprop(p.optinfo)^.Regs[supreg].wState;
|
tmpState := ptaiprop(p.optinfo)^.Regs[supreg].wState;
|
||||||
if (newrstate = ptaiprop(p.optinfo)^.Regs[supreg].rState) then
|
if (newrstate = ptaiprop(p.optinfo)^.Regs[supreg].rState) then
|
||||||
begin
|
begin
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user