mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-11-03 13:29:26 +01:00
* MIPS: MOVE instruction cannot be changed into conditional move (MOVZ/MOVN) if it overwrites register used as condition.
git-svn-id: trunk@28587 -
This commit is contained in:
parent
e86504af04
commit
406a678223
@ -97,10 +97,15 @@ unit aoptcpu;
|
||||
end;
|
||||
|
||||
|
||||
function CanBeCMOV(p: tai): boolean;
|
||||
function CanBeCMOV(p: tai; condreg: tregister): boolean;
|
||||
begin
|
||||
result:=assigned(p) and (p.typ=ait_instruction) and
|
||||
(taicpu(p).opcode in [A_MOV_D,A_MOV_S,A_MOVE]);
|
||||
((taicpu(p).opcode in [A_MOV_D,A_MOV_S]) or
|
||||
(
|
||||
{ register with condition must not be overwritten }
|
||||
(taicpu(p).opcode=A_MOVE) and
|
||||
(taicpu(p).oper[0]^.reg<>condreg)
|
||||
));
|
||||
end;
|
||||
|
||||
|
||||
@ -576,7 +581,7 @@ unit aoptcpu;
|
||||
}
|
||||
l:=0;
|
||||
GetNextInstruction(p, hp1);
|
||||
while CanBeCMOV(hp1) do // CanBeCMOV returns False for nil or labels
|
||||
while CanBeCMOV(hp1,condreg) do // CanBeCMOV returns False for nil or labels
|
||||
begin
|
||||
inc(l);
|
||||
GetNextInstruction(hp1,hp1);
|
||||
@ -594,7 +599,7 @@ unit aoptcpu;
|
||||
repeat
|
||||
ChangeToCMOV(taicpu(hp1),condition,condreg);
|
||||
GetNextInstruction(hp1,hp1);
|
||||
until not CanBeCMOV(hp1);
|
||||
until not CanBeCMOV(hp1,condreg);
|
||||
{ wait with removing else GetNextInstruction could
|
||||
ignore the label if it was the only usage in the
|
||||
jump moved away }
|
||||
@ -632,7 +637,7 @@ unit aoptcpu;
|
||||
l:=0;
|
||||
{ skip hp1 to <several moves 2> }
|
||||
GetNextInstruction(hp1, hp1);
|
||||
while CanBeCMOV(hp1) do
|
||||
while CanBeCMOV(hp1,condreg) do
|
||||
begin
|
||||
inc(l);
|
||||
GetNextInstruction(hp1, hp1);
|
||||
@ -648,7 +653,7 @@ unit aoptcpu;
|
||||
repeat
|
||||
ChangeToCMOV(taicpu(hp1),condition,condreg);
|
||||
GetNextInstruction(hp1,hp1);
|
||||
until not CanBeCMOV(hp1);
|
||||
until not CanBeCMOV(hp1,condreg);
|
||||
{ hp2 is still at b yyy }
|
||||
GetNextInstruction(hp2,hp1);
|
||||
{ hp2 is now at xxx: }
|
||||
@ -658,7 +663,7 @@ unit aoptcpu;
|
||||
repeat
|
||||
ChangeToCMOV(taicpu(hp1),condition,condreg);
|
||||
GetNextInstruction(hp1,hp1);
|
||||
until not CanBeCMOV(hp1);
|
||||
until not CanBeCMOV(hp1,condreg);
|
||||
{ remove bCC }
|
||||
tasmlabel(taicpu(hp3).oper[taicpu(hp3).ops-1]^.ref^.symbol).decrefs;
|
||||
RemoveDelaySlot(hp3);
|
||||
|
||||
Loading…
Reference in New Issue
Block a user