mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-08-15 01:29:19 +02:00
* x86: New "aoc_DoPass2JccOpts" option to catch branch and
STC/CLC optimisations that only manifest in Pass 2
This commit is contained in:
parent
2055ef4e88
commit
62495c964a
@ -316,6 +316,9 @@ unit aoptcpu;
|
|||||||
Result:=OptPass2SUB(p);
|
Result:=OptPass2SUB(p);
|
||||||
A_SETcc:
|
A_SETcc:
|
||||||
Result:=OptPass2SETcc(p);
|
Result:=OptPass2SETcc(p);
|
||||||
|
A_CLC,
|
||||||
|
A_STC:
|
||||||
|
Result:=OptPass2STCCLC(p);
|
||||||
else
|
else
|
||||||
;
|
;
|
||||||
end;
|
end;
|
||||||
|
@ -41,7 +41,8 @@ unit aoptx86;
|
|||||||
type
|
type
|
||||||
TOptsToCheck = (
|
TOptsToCheck = (
|
||||||
aoc_MovAnd2Mov_3,
|
aoc_MovAnd2Mov_3,
|
||||||
aoc_ForceNewIteration
|
aoc_ForceNewIteration,
|
||||||
|
aoc_DoPass2JccOpts
|
||||||
);
|
);
|
||||||
|
|
||||||
TX86AsmOptimizer = class(TAsmOptimizer)
|
TX86AsmOptimizer = class(TAsmOptimizer)
|
||||||
@ -188,6 +189,7 @@ unit aoptx86;
|
|||||||
function OptPass1_V_Cvtss2sd(var p: tai): boolean;
|
function OptPass1_V_Cvtss2sd(var p: tai): boolean;
|
||||||
function OptPass1STCCLC(var p: tai): Boolean;
|
function OptPass1STCCLC(var p: tai): Boolean;
|
||||||
|
|
||||||
|
function OptPass2STCCLC(var p: tai): Boolean;
|
||||||
function OptPass2Movx(var p : tai): Boolean;
|
function OptPass2Movx(var p : tai): Boolean;
|
||||||
function OptPass2MOV(var p : tai) : boolean;
|
function OptPass2MOV(var p : tai) : boolean;
|
||||||
function OptPass2Imul(var p : tai) : boolean;
|
function OptPass2Imul(var p : tai) : boolean;
|
||||||
@ -9643,6 +9645,13 @@ unit aoptx86;
|
|||||||
end;
|
end;
|
||||||
|
|
||||||
|
|
||||||
|
function TX86AsmOptimizer.OptPass2STCCLC(var p: tai): Boolean;
|
||||||
|
begin
|
||||||
|
{ This generally only executes under -O3 and above }
|
||||||
|
Result := (aoc_DoPass2JccOpts in OptsToCheck) and OptPass1STCCLC(p);
|
||||||
|
end;
|
||||||
|
|
||||||
|
|
||||||
function TX86AsmOptimizer.OptPass2MOV(var p : tai) : boolean;
|
function TX86AsmOptimizer.OptPass2MOV(var p : tai) : boolean;
|
||||||
|
|
||||||
function IsXCHGAcceptable: Boolean; inline;
|
function IsXCHGAcceptable: Boolean; inline;
|
||||||
@ -11893,7 +11902,11 @@ unit aoptx86;
|
|||||||
if taicpu(hp2).opcode = A_SETcc then
|
if taicpu(hp2).opcode = A_SETcc then
|
||||||
DebugMsg(SPeepholeOptimization + 'SETcc/TEST/SETcc -> SETcc',p)
|
DebugMsg(SPeepholeOptimization + 'SETcc/TEST/SETcc -> SETcc',p)
|
||||||
else
|
else
|
||||||
DebugMsg(SPeepholeOptimization + 'SETcc/TEST/Jcc -> Jcc',p);
|
begin
|
||||||
|
DebugMsg(SPeepholeOptimization + 'SETcc/TEST/Jcc -> Jcc',p);
|
||||||
|
if (cs_opt_level3 in current_settings.optimizerswitches) then
|
||||||
|
Include(OptsToCheck, aoc_DoPass2JccOpts);
|
||||||
|
end;
|
||||||
end
|
end
|
||||||
else
|
else
|
||||||
if taicpu(hp2).opcode = A_SETcc then
|
if taicpu(hp2).opcode = A_SETcc then
|
||||||
@ -13236,8 +13249,13 @@ unit aoptx86;
|
|||||||
CMOVTracking: PCMOVTracking;
|
CMOVTracking: PCMOVTracking;
|
||||||
hp3,hp4,hp5: tai;
|
hp3,hp4,hp5: tai;
|
||||||
{$endif i8086}
|
{$endif i8086}
|
||||||
|
TempBool: Boolean;
|
||||||
|
|
||||||
begin
|
begin
|
||||||
|
if (aoc_DoPass2JccOpts in OptsToCheck) and
|
||||||
|
DoJumpOptimizations(p, TempBool) then
|
||||||
|
Exit(True);
|
||||||
|
|
||||||
result:=false;
|
result:=false;
|
||||||
if GetNextInstruction(p,hp1) then
|
if GetNextInstruction(p,hp1) then
|
||||||
begin
|
begin
|
||||||
|
@ -235,6 +235,9 @@ uses
|
|||||||
Result:=OptPass2CMP(p);
|
Result:=OptPass2CMP(p);
|
||||||
A_TEST:
|
A_TEST:
|
||||||
Result:=OptPass2TEST(p);
|
Result:=OptPass2TEST(p);
|
||||||
|
A_CLC,
|
||||||
|
A_STC:
|
||||||
|
Result:=OptPass2STCCLC(p);
|
||||||
else
|
else
|
||||||
;
|
;
|
||||||
end;
|
end;
|
||||||
|
Loading…
Reference in New Issue
Block a user