mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-08-15 21:49:06 +02:00
+ implement TCpuAsmOptimizer.RegLoadedWithNewValue for x86-64, resolves issue #29527
git-svn-id: trunk@33525 -
This commit is contained in:
parent
f576b0c01b
commit
f634387394
@ -27,11 +27,12 @@ unit aoptcpu;
|
|||||||
|
|
||||||
interface
|
interface
|
||||||
|
|
||||||
uses cpubase, aasmtai, aopt, aoptcpub;
|
uses cgbase, cpubase, aasmtai, aopt, aoptcpub;
|
||||||
|
|
||||||
type
|
type
|
||||||
TCpuAsmOptimizer = class(TAsmOptimizer)
|
TCpuAsmOptimizer = class(TAsmOptimizer)
|
||||||
function PeepHoleOptPass1Cpu(var p: tai): boolean; override;
|
function PeepHoleOptPass1Cpu(var p: tai): boolean; override;
|
||||||
|
function RegLoadedWithNewValue(reg : tregister; hp : tai) : boolean; override;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
implementation
|
implementation
|
||||||
@ -40,7 +41,7 @@ uses
|
|||||||
globtype, globals,
|
globtype, globals,
|
||||||
cutils,
|
cutils,
|
||||||
verbose,
|
verbose,
|
||||||
cgbase, cgutils,
|
cgutils,
|
||||||
aoptobj,
|
aoptobj,
|
||||||
aasmbase, aasmdata, aasmcpu,
|
aasmbase, aasmdata, aasmcpu,
|
||||||
aoptx86,
|
aoptx86,
|
||||||
@ -65,6 +66,40 @@ begin
|
|||||||
end;
|
end;
|
||||||
|
|
||||||
|
|
||||||
|
function TCpuAsmOptimizer.RegLoadedWithNewValue(reg: tregister; hp: tai): boolean;
|
||||||
|
var
|
||||||
|
p: taicpu;
|
||||||
|
begin
|
||||||
|
if not assigned(hp) or
|
||||||
|
(hp.typ <> ait_instruction) then
|
||||||
|
begin
|
||||||
|
Result := false;
|
||||||
|
exit;
|
||||||
|
end;
|
||||||
|
p := taicpu(hp);
|
||||||
|
Result :=
|
||||||
|
(((p.opcode = A_MOV) or
|
||||||
|
(p.opcode = A_MOVZX) or
|
||||||
|
(p.opcode = A_MOVSX) or
|
||||||
|
(p.opcode = A_LEA) or
|
||||||
|
(p.opcode = A_VMOVSS) or
|
||||||
|
(p.opcode = A_VMOVSD) or
|
||||||
|
(p.opcode = A_VMOVQ) or
|
||||||
|
(p.opcode = A_MOVSS) or
|
||||||
|
(p.opcode = A_MOVSD) or
|
||||||
|
(p.opcode = A_MOVQ)) and
|
||||||
|
(p.oper[1]^.typ = top_reg) and
|
||||||
|
(getsupreg(p.oper[1]^.reg) = getsupreg(reg)) and
|
||||||
|
((p.oper[0]^.typ = top_const) or
|
||||||
|
((p.oper[0]^.typ = top_reg) and
|
||||||
|
(getsupreg(p.oper[0]^.reg) <> getsupreg(reg))) or
|
||||||
|
((p.oper[0]^.typ = top_ref) and
|
||||||
|
not RegInRef(reg,p.oper[0]^.ref^)))) or
|
||||||
|
((p.opcode = A_POP) and
|
||||||
|
(getsupreg(p.oper[0]^.reg) = getsupreg(reg)));
|
||||||
|
end;
|
||||||
|
|
||||||
|
|
||||||
function TCpuAsmOptimizer.PeepHoleOptPass1Cpu(var p: tai): boolean;
|
function TCpuAsmOptimizer.PeepHoleOptPass1Cpu(var p: tai): boolean;
|
||||||
var
|
var
|
||||||
hp1, hp2: tai;
|
hp1, hp2: tai;
|
||||||
|
Loading…
Reference in New Issue
Block a user