|
@@ -135,6 +135,7 @@ unit aoptcpu;
|
|
var
|
|
var
|
|
next, next2: tai;
|
|
next, next2: tai;
|
|
opstr: string[15];
|
|
opstr: string[15];
|
|
|
|
+ TmpUsedRegs : TAllUsedRegs;
|
|
begin
|
|
begin
|
|
result:=false;
|
|
result:=false;
|
|
|
|
|
|
@@ -145,8 +146,11 @@ unit aoptcpu;
|
|
(taicpu(p).oper[1]^.typ = top_reg) and
|
|
(taicpu(p).oper[1]^.typ = top_reg) and
|
|
MatchOperand(taicpu(p).oper[1]^,taicpu(next).oper[0]^) then
|
|
MatchOperand(taicpu(p).oper[1]^,taicpu(next).oper[0]^) then
|
|
begin
|
|
begin
|
|
|
|
+ CopyUsedRegs(TmpUsedRegs);
|
|
|
|
+ UpdateUsedRegs(TmpUsedRegs, tai(next));
|
|
|
|
+
|
|
if not(RegInOp(taicpu(p).oper[1]^.reg,taicpu(next).oper[1]^)) and
|
|
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
|
|
begin
|
|
opstr:=opname(p);
|
|
opstr:=opname(p);
|
|
case taicpu(p).oper[0]^.typ of
|
|
case taicpu(p).oper[0]^.typ of
|
|
@@ -195,6 +199,7 @@ unit aoptcpu;
|
|
end;
|
|
end;
|
|
end;
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
+ ReleaseUsedRegs(TmpUsedRegs);
|
|
exit;
|
|
exit;
|
|
end;
|
|
end;
|
|
|
|
|
|
@@ -216,24 +221,30 @@ unit aoptcpu;
|
|
opstr:=opname(p);
|
|
opstr:=opname(p);
|
|
|
|
|
|
if not(RegInOp(taicpu(p).oper[1]^.reg,taicpu(next2).oper[1]^)) and
|
|
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
|
|
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
|
|
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;
|
|
end;
|
|
|
|
+ ReleaseUsedRegs(TmpUsedRegs);
|
|
end;
|
|
end;
|
|
end;
|
|
end;
|
|
end;
|
|
end;
|