mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-04-20 11:09:42 +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
|
||||
|
||||
uses cpubase, aasmtai, aopt, aoptcpub;
|
||||
uses cgbase, cpubase, aasmtai, aopt, aoptcpub;
|
||||
|
||||
type
|
||||
TCpuAsmOptimizer = class(TAsmOptimizer)
|
||||
function PeepHoleOptPass1Cpu(var p: tai): boolean; override;
|
||||
function RegLoadedWithNewValue(reg : tregister; hp : tai) : boolean; override;
|
||||
end;
|
||||
|
||||
implementation
|
||||
@ -40,7 +41,7 @@ uses
|
||||
globtype, globals,
|
||||
cutils,
|
||||
verbose,
|
||||
cgbase, cgutils,
|
||||
cgutils,
|
||||
aoptobj,
|
||||
aasmbase, aasmdata, aasmcpu,
|
||||
aoptx86,
|
||||
@ -65,6 +66,40 @@ begin
|
||||
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;
|
||||
var
|
||||
hp1, hp2: tai;
|
||||
|
Loading…
Reference in New Issue
Block a user