mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-08-30 06:23:02 +02:00
* cpu-specific overrides of optimizer methods now get called
+ first simple rlwinm optimization for ppc git-svn-id: trunk@1320 -
This commit is contained in:
parent
1066eb1cb3
commit
ab3bc45fa4
@ -35,7 +35,7 @@ Unit aopt;
|
|||||||
TAsmOptimizer = class(TAoptObj)
|
TAsmOptimizer = class(TAoptObj)
|
||||||
|
|
||||||
{ _AsmL is the PAasmOutpout list that has to be optimized }
|
{ _AsmL is the PAasmOutpout list that has to be optimized }
|
||||||
Constructor create(_AsmL: taasmoutput);
|
Constructor create(_AsmL: taasmoutput); virtual;
|
||||||
|
|
||||||
{ call the necessary optimizer procedures }
|
{ call the necessary optimizer procedures }
|
||||||
Procedure Optimize;
|
Procedure Optimize;
|
||||||
@ -262,6 +262,4 @@ Unit aopt;
|
|||||||
end;
|
end;
|
||||||
|
|
||||||
|
|
||||||
begin
|
|
||||||
casmoptimizer:=TAsmOptimizer;
|
|
||||||
end.
|
end.
|
||||||
|
@ -44,7 +44,7 @@ unit aoptbase;
|
|||||||
TAoptBase = class
|
TAoptBase = class
|
||||||
{ processor independent methods }
|
{ processor independent methods }
|
||||||
|
|
||||||
constructor create;
|
constructor create; virtual;
|
||||||
destructor destroy;override;
|
destructor destroy;override;
|
||||||
{ returns true if register Reg is used by instruction p1 }
|
{ returns true if register Reg is used by instruction p1 }
|
||||||
Function RegInInstruction(Reg: TRegister; p1: tai): Boolean;
|
Function RegInInstruction(Reg: TRegister; p1: tai): Boolean;
|
||||||
|
@ -249,7 +249,7 @@ Unit AoptObj;
|
|||||||
{ that has to be optimized and _LabelInfo a pointer to a }
|
{ that has to be optimized and _LabelInfo a pointer to a }
|
||||||
{ TLabelInfo record }
|
{ TLabelInfo record }
|
||||||
Constructor create(_AsmL: TAasmOutput; _BlockStart, _BlockEnd: Tai;
|
Constructor create(_AsmL: TAasmOutput; _BlockStart, _BlockEnd: Tai;
|
||||||
_LabelInfo: PLabelInfo);
|
_LabelInfo: PLabelInfo); virtual;
|
||||||
|
|
||||||
{ processor independent methods }
|
{ processor independent methods }
|
||||||
|
|
||||||
@ -290,12 +290,14 @@ Unit AoptObj;
|
|||||||
function getlabelwithsym(sym: tasmlabel): tai;
|
function getlabelwithsym(sym: tasmlabel): tai;
|
||||||
|
|
||||||
{ peephole optimizer }
|
{ peephole optimizer }
|
||||||
procedure PrePeepHoleOpts;virtual;
|
procedure PrePeepHoleOpts;
|
||||||
procedure PeepHoleOptPass1;virtual;
|
procedure PeepHoleOptPass1;
|
||||||
procedure PeepHoleOptPass2;virtual;
|
procedure PeepHoleOptPass2;
|
||||||
procedure PostPeepHoleOpts;virtual;
|
procedure PostPeepHoleOpts;
|
||||||
|
|
||||||
{ processor dependent methods }
|
{ processor dependent methods }
|
||||||
|
// if it returns true, perform a "continue"
|
||||||
|
function PeepHoleOptPass1Cpu(var p: tai): boolean; virtual;
|
||||||
End;
|
End;
|
||||||
|
|
||||||
Function ArrayRefsEq(const r1, r2: TReference): Boolean;
|
Function ArrayRefsEq(const r1, r2: TReference): Boolean;
|
||||||
@ -997,6 +999,8 @@ Unit AoptObj;
|
|||||||
while (p <> BlockEnd) Do
|
while (p <> BlockEnd) Do
|
||||||
begin
|
begin
|
||||||
//!!!! UpDateUsedRegs(UsedRegs, tai(p.next));
|
//!!!! UpDateUsedRegs(UsedRegs, tai(p.next));
|
||||||
|
if PeepHoleOptPass1Cpu(p) then
|
||||||
|
continue;
|
||||||
case p.Typ Of
|
case p.Typ Of
|
||||||
ait_instruction:
|
ait_instruction:
|
||||||
begin
|
begin
|
||||||
@ -1094,4 +1098,9 @@ Unit AoptObj;
|
|||||||
end;
|
end;
|
||||||
|
|
||||||
|
|
||||||
|
function TAOptObj.PeepHoleOptPass1Cpu(var p: tai): boolean;
|
||||||
|
begin
|
||||||
|
result := false;
|
||||||
|
end;
|
||||||
|
|
||||||
End.
|
End.
|
||||||
|
@ -31,10 +31,12 @@ Interface
|
|||||||
uses cpubase, aoptobj, aoptcpub;
|
uses cpubase, aoptobj, aoptcpub;
|
||||||
|
|
||||||
Type
|
Type
|
||||||
TAOptCpu = class(TAoptObj)
|
TCpuAsmOptimizer = class(TAsmOptimizer)
|
||||||
{ uses the same constructor as TAopObj }
|
{ uses the same constructor as TAopObj }
|
||||||
End;
|
End;
|
||||||
|
|
||||||
Implementation
|
Implementation
|
||||||
|
|
||||||
|
begin
|
||||||
|
casmoptimizer:=TCpuAsmOptimizer;
|
||||||
End.
|
End.
|
||||||
|
@ -28,15 +28,71 @@ Interface
|
|||||||
|
|
||||||
{$i fpcdefs.inc}
|
{$i fpcdefs.inc}
|
||||||
|
|
||||||
uses cpubase, aoptobj, aoptcpub, aopt;
|
uses cpubase, aoptobj, aoptcpub, aopt, aasmtai;
|
||||||
|
|
||||||
Type
|
Type
|
||||||
TCpuAsmOptimizer = class(TAsmOptimizer)
|
TCpuAsmOptimizer = class(TAsmOptimizer)
|
||||||
{ uses the same constructor as TAopObj }
|
{ uses the same constructor as TAopObj }
|
||||||
|
function PeepHoleOptPass1Cpu(var p: tai): boolean; override;
|
||||||
End;
|
End;
|
||||||
|
|
||||||
Implementation
|
Implementation
|
||||||
|
|
||||||
|
uses
|
||||||
|
cutils, aasmcpu;
|
||||||
|
|
||||||
|
function TCpuAsmOptimizer.PeepHoleOptPass1Cpu(var p: tai): boolean;
|
||||||
|
var
|
||||||
|
next1, next2: tai;
|
||||||
|
l1, l2: longint;
|
||||||
|
begin
|
||||||
|
result := false;
|
||||||
|
case p.typ of
|
||||||
|
ait_instruction:
|
||||||
|
begin
|
||||||
|
case taicpu(p).opcode of
|
||||||
|
A_RLWINM:
|
||||||
|
begin
|
||||||
|
if getnextinstruction(p,next1) and
|
||||||
|
(next1.typ = ait_instruction) and
|
||||||
|
(taicpu(next1).opcode = A_RLWINM) and
|
||||||
|
(taicpu(next1).oper[0]^.reg = taicpu(p).oper[0]^.reg) and
|
||||||
|
// both source and target of next1 must equal target of p
|
||||||
|
(taicpu(next1).oper[1]^.reg = taicpu(p).oper[0]^.reg) and
|
||||||
|
(taicpu(next1).oper[2]^.val = 0) then
|
||||||
|
begin
|
||||||
|
l1 := taicpu(p).oper[4]^.val;
|
||||||
|
if (l1 < taicpu(p).oper[3]^.val) then
|
||||||
|
inc(l1,32);
|
||||||
|
l2 := taicpu(next1).oper[4]^.val;
|
||||||
|
if (l2 < taicpu(next1).oper[3]^.val) then
|
||||||
|
inc(l2,32);
|
||||||
|
|
||||||
|
if (taicpu(p).oper[3]^.val > l2) or
|
||||||
|
(taicpu(next1).oper[3]^.val > l1) then
|
||||||
|
begin
|
||||||
|
// masks have no bits in common
|
||||||
|
taicpu(p).opcode := A_LI;
|
||||||
|
taicpu(p).loadconst(1,0);
|
||||||
|
taicpu(p).clearop(2);
|
||||||
|
taicpu(p).clearop(3);
|
||||||
|
taicpu(p).clearop(4);
|
||||||
|
end
|
||||||
|
else
|
||||||
|
begin
|
||||||
|
taicpu(p).oper[3]^.val := max(taicpu(p).oper[3]^.val,taicpu(next1).oper[3]^.val);
|
||||||
|
taicpu(p).oper[4]^.val := min(taicpu(p).oper[4]^.val,taicpu(next1).oper[4]^.val);
|
||||||
|
end;
|
||||||
|
asml.remove(next1);
|
||||||
|
next1.free;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
begin
|
begin
|
||||||
casmoptimizer:=TCpuAsmOptimizer;
|
casmoptimizer:=TCpuAsmOptimizer;
|
||||||
End.
|
End.
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user