mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-04-22 14:09:59 +02:00
m68k: attempt to make MOVE+OP+MOVE optmization more robust. this fixes random exceptions in tfmtbcd test among others
git-svn-id: trunk@36480 -
This commit is contained in:
parent
d3a47bc6b5
commit
40fb45aef6
@ -135,6 +135,7 @@ unit aoptcpu;
|
||||
var
|
||||
next, next2: tai;
|
||||
opstr: string[15];
|
||||
TmpUsedRegs : TAllUsedRegs;
|
||||
begin
|
||||
result:=false;
|
||||
|
||||
@ -145,8 +146,11 @@ unit aoptcpu;
|
||||
(taicpu(p).oper[1]^.typ = top_reg) and
|
||||
MatchOperand(taicpu(p).oper[1]^,taicpu(next).oper[0]^) then
|
||||
begin
|
||||
CopyUsedRegs(TmpUsedRegs);
|
||||
UpdateUsedRegs(TmpUsedRegs, tai(next));
|
||||
|
||||
if not(RegInOp(taicpu(p).oper[1]^.reg,taicpu(next).oper[1]^)) and
|
||||
RegEndOfLife(taicpu(next).oper[0]^.reg, taicpu(next)) then
|
||||
not(RegUsedAfterInstruction(taicpu(next).oper[0]^.reg,next,TmpUsedRegs)) then
|
||||
begin
|
||||
opstr:=opname(p);
|
||||
case taicpu(p).oper[0]^.typ of
|
||||
@ -195,6 +199,7 @@ unit aoptcpu;
|
||||
end;
|
||||
end;
|
||||
end;
|
||||
ReleaseUsedRegs(TmpUsedRegs);
|
||||
exit;
|
||||
end;
|
||||
|
||||
@ -216,24 +221,30 @@ unit aoptcpu;
|
||||
opstr:=opname(p);
|
||||
|
||||
if not(RegInOp(taicpu(p).oper[1]^.reg,taicpu(next2).oper[1]^)) and
|
||||
not(RegInOp(taicpu(p).oper[1]^.reg,taicpu(next).oper[0]^)) and
|
||||
RegEndOfLife(taicpu(p).oper[0]^.reg, taicpu(next2)) then
|
||||
not(RegInOp(taicpu(p).oper[1]^.reg,taicpu(next).oper[0]^)) then
|
||||
begin
|
||||
{ move %reg0, %tmpreg
|
||||
op ???, %tmpreg
|
||||
move %tmpreg, %reg0
|
||||
to:
|
||||
op ???, %reg0 }
|
||||
if MatchOperand(taicpu(p).oper[1]^,taicpu(next).oper[taicpu(next).ops-1]^) then
|
||||
CopyUsedRegs(TmpUsedRegs);
|
||||
UpdateUsedRegs(TmpUsedRegs, tai(next));
|
||||
UpdateUsedRegs(TmpUsedRegs, tai(next2));
|
||||
if not(RegUsedAfterInstruction(taicpu(p).oper[1]^.reg,next2,TmpUsedRegs)) then
|
||||
begin
|
||||
DebugMsg('Optimizer: '+opstr+' + OP + '+opstr+' to OP #1',next);
|
||||
taicpu(next).loadOper(taicpu(next).ops-1,taicpu(p).oper[0]^);
|
||||
asml.remove(p);
|
||||
asml.remove(next2);
|
||||
p.free;
|
||||
next2.free;
|
||||
result:=true;
|
||||
{ move %reg0, %tmpreg
|
||||
op ???, %tmpreg
|
||||
move %tmpreg, %reg0
|
||||
to:
|
||||
op ???, %reg0 }
|
||||
if MatchOperand(taicpu(p).oper[1]^,taicpu(next).oper[taicpu(next).ops-1]^) then
|
||||
begin
|
||||
DebugMsg('Optimizer: '+opstr+' + OP + '+opstr+' to OP #1',next);
|
||||
taicpu(next).loadOper(taicpu(next).ops-1,taicpu(p).oper[0]^);
|
||||
asml.remove(p);
|
||||
asml.remove(next2);
|
||||
p.free;
|
||||
next2.free;
|
||||
result:=true;
|
||||
end;
|
||||
end;
|
||||
ReleaseUsedRegs(TmpUsedRegs);
|
||||
end;
|
||||
end;
|
||||
end;
|
||||
|
Loading…
Reference in New Issue
Block a user