mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-08-13 12:59:15 +02:00
* x86: New "Jcc; CLC/STC; .Lbl" optimisation
This commit is contained in:
parent
c29dd86bb2
commit
d06dd2b0ea
@ -8626,8 +8626,9 @@ unit aoptx86;
|
|||||||
|
|
||||||
function TX86AsmOptimizer.OptPass1Jcc(var p : tai) : boolean;
|
function TX86AsmOptimizer.OptPass1Jcc(var p : tai) : boolean;
|
||||||
var
|
var
|
||||||
hp1, hp2, hp3, hp4, hp5, hp6: tai;
|
hp1, hp2, hp3, hp4, hp5: tai;
|
||||||
ThisReg: TRegister;
|
ThisReg: TRegister;
|
||||||
|
TempBool: Boolean;
|
||||||
begin
|
begin
|
||||||
Result := False;
|
Result := False;
|
||||||
if not GetNextInstruction(p,hp1) then
|
if not GetNextInstruction(p,hp1) then
|
||||||
@ -8785,6 +8786,56 @@ unit aoptx86;
|
|||||||
Result:=true;
|
Result:=true;
|
||||||
exit;
|
exit;
|
||||||
end
|
end
|
||||||
|
else if MatchInstruction(hp1, A_CLC, A_STC, []) then
|
||||||
|
begin
|
||||||
|
{
|
||||||
|
j(c) .L1
|
||||||
|
stc/clc
|
||||||
|
.L1:
|
||||||
|
jc/jnc .L2
|
||||||
|
(Flags deallocated)
|
||||||
|
|
||||||
|
Change to:
|
||||||
|
j)c) .L1
|
||||||
|
jmp .L2
|
||||||
|
.L1:
|
||||||
|
jc/jnc .L2
|
||||||
|
|
||||||
|
Then call DoJumpOptimizations to convert to:
|
||||||
|
j(nc) .L2
|
||||||
|
.L1: (may become a dead label)
|
||||||
|
jc/jnc .L2
|
||||||
|
}
|
||||||
|
if GetNextInstruction(hp1, hp2) and
|
||||||
|
(hp2.typ = ait_label) and
|
||||||
|
(tai_label(hp2).labsym = TAsmLabel(taicpu(p).oper[0]^.ref^.symbol)) and
|
||||||
|
GetNextInstruction(hp2, hp3) and
|
||||||
|
MatchInstruction(hp3, A_Jcc, []) and
|
||||||
|
(
|
||||||
|
(
|
||||||
|
(taicpu(hp3).condition = C_C) and
|
||||||
|
(taicpu(hp1).opcode = A_STC)
|
||||||
|
) or (
|
||||||
|
(taicpu(hp3).condition = C_NC) and
|
||||||
|
(taicpu(hp1).opcode = A_CLC)
|
||||||
|
)
|
||||||
|
) and
|
||||||
|
{ Make sure the flags aren't used again }
|
||||||
|
Assigned(FindRegDealloc(NR_DEFAULTFLAGS, tai(hp3.Next))) then
|
||||||
|
begin
|
||||||
|
taicpu(hp1).allocate_oper(1);
|
||||||
|
taicpu(hp1).ops := 1;
|
||||||
|
taicpu(hp1).loadsymbol(0, TAsmLabel(taicpu(hp3).oper[0]^.ref^.symbol), 0);
|
||||||
|
taicpu(hp1).opcode := A_JMP;
|
||||||
|
taicpu(hp1).is_jmp := True;
|
||||||
|
|
||||||
|
TempBool := True; { Prevent compiler warnings }
|
||||||
|
if DoJumpOptimizations(p, TempBool) then
|
||||||
|
Result := True
|
||||||
|
else
|
||||||
|
Include(OptsToCheck, aoc_ForceNewIteration);
|
||||||
|
end;
|
||||||
|
end
|
||||||
else if (hp1.typ = ait_label) then
|
else if (hp1.typ = ait_label) then
|
||||||
Result := DoSETccLblRETOpt(p, tai_label(hp1));
|
Result := DoSETccLblRETOpt(p, tai_label(hp1));
|
||||||
end;
|
end;
|
||||||
|
Loading…
Reference in New Issue
Block a user