mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-08-11 18:25:58 +02:00
* do not use an extra register in tcginlinenode.second_IncDec if not needed
git-svn-id: trunk@45177 -
This commit is contained in:
parent
7f769f024b
commit
9e0337f248
@ -72,6 +72,7 @@ unit cg64f32;
|
|||||||
procedure a_op64_reg_ref(list : TAsmList;op:TOpCG;size : tcgsize;reg : tregister64; const ref: treference);override;
|
procedure a_op64_reg_ref(list : TAsmList;op:TOpCG;size : tcgsize;reg : tregister64; const ref: treference);override;
|
||||||
procedure a_op64_const_loc(list : TAsmList;op:TOpCG;size : tcgsize;value : int64;const l: tlocation);override;
|
procedure a_op64_const_loc(list : TAsmList;op:TOpCG;size : tcgsize;value : int64;const l: tlocation);override;
|
||||||
procedure a_op64_reg_loc(list : TAsmList;op:TOpCG;size : tcgsize;reg : tregister64;const l : tlocation);override;
|
procedure a_op64_reg_loc(list : TAsmList;op:TOpCG;size : tcgsize;reg : tregister64;const l : tlocation);override;
|
||||||
|
procedure a_op64_ref_loc(list: TAsmList; op: TOpCG; size: tcgsize;const ref: treference; const l: tlocation);override;
|
||||||
procedure a_op64_loc_reg(list : TAsmList;op:TOpCG;size : tcgsize;const l : tlocation;reg : tregister64);override;
|
procedure a_op64_loc_reg(list : TAsmList;op:TOpCG;size : tcgsize;const l : tlocation;reg : tregister64);override;
|
||||||
procedure a_op64_const_ref(list : TAsmList;op:TOpCG;size : tcgsize;value : int64;const ref : treference);override;
|
procedure a_op64_const_ref(list : TAsmList;op:TOpCG;size : tcgsize;value : int64;const ref : treference);override;
|
||||||
|
|
||||||
@ -705,6 +706,25 @@ unit cg64f32;
|
|||||||
end;
|
end;
|
||||||
|
|
||||||
|
|
||||||
|
procedure tcg64f32.a_op64_ref_loc(list : TAsmList;op:TOpCG;size : tcgsize;const ref : treference;const l : tlocation);
|
||||||
|
var
|
||||||
|
tempreg: tregister64;
|
||||||
|
begin
|
||||||
|
case l.loc of
|
||||||
|
LOC_REFERENCE, LOC_CREFERENCE:
|
||||||
|
begin
|
||||||
|
tempreg.reghi:=cg.getintregister(list,OS_32);
|
||||||
|
tempreg.reglo:=cg.getintregister(list,OS_32);
|
||||||
|
a_load64_ref_reg(list,ref,tempreg);
|
||||||
|
a_op64_reg_ref(list,op,size,tempreg,l.reference);
|
||||||
|
end;
|
||||||
|
LOC_REGISTER,LOC_CREGISTER:
|
||||||
|
a_op64_ref_reg(list,op,size,ref,l.register64);
|
||||||
|
else
|
||||||
|
internalerror(2020042803);
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
|
|
||||||
procedure tcg64f32.a_op64_loc_reg(list : TAsmList;op:TOpCG;size : tcgsize;const l : tlocation;reg : tregister64);
|
procedure tcg64f32.a_op64_loc_reg(list : TAsmList;op:TOpCG;size : tcgsize;const l : tlocation;reg : tregister64);
|
||||||
begin
|
begin
|
||||||
|
@ -519,6 +519,7 @@ unit cgobj;
|
|||||||
procedure a_op64_const_ref(list : TAsmList;op:TOpCG;size : tcgsize;value : int64;const ref : treference);virtual;abstract;
|
procedure a_op64_const_ref(list : TAsmList;op:TOpCG;size : tcgsize;value : int64;const ref : treference);virtual;abstract;
|
||||||
procedure a_op64_const_loc(list : TAsmList;op:TOpCG;size : tcgsize;value : int64;const l: tlocation);virtual;abstract;
|
procedure a_op64_const_loc(list : TAsmList;op:TOpCG;size : tcgsize;value : int64;const l: tlocation);virtual;abstract;
|
||||||
procedure a_op64_reg_loc(list : TAsmList;op:TOpCG;size : tcgsize;reg : tregister64;const l : tlocation);virtual;abstract;
|
procedure a_op64_reg_loc(list : TAsmList;op:TOpCG;size : tcgsize;reg : tregister64;const l : tlocation);virtual;abstract;
|
||||||
|
procedure a_op64_ref_loc(list : TAsmList;op:TOpCG;size : tcgsize;const ref : treference;const l : tlocation);virtual;abstract;
|
||||||
procedure a_op64_loc_reg(list : TAsmList;op:TOpCG;size : tcgsize;const l : tlocation;reg64 : tregister64);virtual;abstract;
|
procedure a_op64_loc_reg(list : TAsmList;op:TOpCG;size : tcgsize;const l : tlocation;reg64 : tregister64);virtual;abstract;
|
||||||
procedure a_op64_const_reg_reg(list: TAsmList;op:TOpCG;size : tcgsize;value : int64;regsrc,regdst : tregister64);virtual;
|
procedure a_op64_const_reg_reg(list: TAsmList;op:TOpCG;size : tcgsize;value : int64;regsrc,regdst : tregister64);virtual;
|
||||||
procedure a_op64_reg_reg_reg(list: TAsmList;op:TOpCG;size : tcgsize;regsrc1,regsrc2,regdst : tregister64);virtual;
|
procedure a_op64_reg_reg_reg(list: TAsmList;op:TOpCG;size : tcgsize;regsrc1,regsrc2,regdst : tregister64);virtual;
|
||||||
|
@ -395,6 +395,7 @@ implementation
|
|||||||
hregisterhi,
|
hregisterhi,
|
||||||
{$endif not cpu64bitalu and not cpuhighleveltarget}
|
{$endif not cpu64bitalu and not cpuhighleveltarget}
|
||||||
hregister : tregister;
|
hregister : tregister;
|
||||||
|
hloc: tlocation;
|
||||||
begin
|
begin
|
||||||
{ set defaults }
|
{ set defaults }
|
||||||
addconstant:=true;
|
addconstant:=true;
|
||||||
@ -435,14 +436,25 @@ implementation
|
|||||||
addvalue:=addvalue*tpointerconstnode(tcallparanode(tcallparanode(left).right).left).value
|
addvalue:=addvalue*tpointerconstnode(tcallparanode(tcallparanode(left).right).left).value
|
||||||
else
|
else
|
||||||
begin
|
begin
|
||||||
hlcg.location_force_reg(current_asmdata.CurrAsmList,tcallparanode(tcallparanode(left).right).left.location,tcallparanode(tcallparanode(left).right).left.resultdef,second_incdec_tempregdef,addvalue<=1);
|
if not(tcallparanode(tcallparanode(left).right).left.location.loc in [LOC_REGISTER,LOC_CREGISTER,LOC_REFERENCE,LOC_CREFERENCE]) or (addvalue>1) or
|
||||||
hregister:=tcallparanode(tcallparanode(left).right).left.location.register;
|
(def_cgsize(left.resultdef)<>tcallparanode(tcallparanode(left).right).left.location.size) then
|
||||||
|
begin
|
||||||
|
hlcg.location_force_reg(current_asmdata.CurrAsmList,tcallparanode(tcallparanode(left).right).left.location,tcallparanode(tcallparanode(left).right).left.resultdef,second_incdec_tempregdef,addvalue<=1);
|
||||||
|
hregister:=tcallparanode(tcallparanode(left).right).left.location.register;
|
||||||
{$if not defined(cpu64bitalu) and not defined(cpuhighleveltarget)}
|
{$if not defined(cpu64bitalu) and not defined(cpuhighleveltarget)}
|
||||||
hregisterhi:=tcallparanode(tcallparanode(left).right).left.location.register64.reghi;
|
hregisterhi:=tcallparanode(tcallparanode(left).right).left.location.register64.reghi;
|
||||||
{$endif not defined(cpu64bitalu) and not defined(cpuhighleveltarget)}
|
{$endif not defined(cpu64bitalu) and not defined(cpuhighleveltarget)}
|
||||||
{ insert multiply with addvalue if its >1 }
|
{ insert multiply with addvalue if its >1 }
|
||||||
if addvalue>1 then
|
if addvalue>1 then
|
||||||
hlcg.a_op_const_reg(current_asmdata.CurrAsmList,OP_IMUL,left.resultdef,addvalue.svalue,hregister);
|
hlcg.a_op_const_reg(current_asmdata.CurrAsmList,OP_IMUL,left.resultdef,addvalue.svalue,hregister);
|
||||||
|
end
|
||||||
|
else if tcallparanode(tcallparanode(left).right).left.location.loc in [LOC_REGISTER,LOC_CREGISTER] then
|
||||||
|
begin
|
||||||
|
hregister:=tcallparanode(tcallparanode(left).right).left.location.register;
|
||||||
|
{$if not defined(cpu64bitalu) and not defined(cpuhighleveltarget)}
|
||||||
|
hregisterhi:=tcallparanode(tcallparanode(left).right).left.location.register64.reghi;
|
||||||
|
{$endif not defined(cpu64bitalu) and not defined(cpuhighleveltarget)}
|
||||||
|
end;
|
||||||
addconstant:=false;
|
addconstant:=false;
|
||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
@ -468,12 +480,28 @@ implementation
|
|||||||
begin
|
begin
|
||||||
{$if not defined(cpu64bitalu) and not defined(cpuhighleveltarget)}
|
{$if not defined(cpu64bitalu) and not defined(cpuhighleveltarget)}
|
||||||
if def_cgsize(left.resultdef) in [OS_64,OS_S64] then
|
if def_cgsize(left.resultdef) in [OS_64,OS_S64] then
|
||||||
cg64.a_op64_reg_loc(current_asmdata.CurrAsmList,addsubop[inlinenumber],def_cgsize(left.resultdef),
|
case tcallparanode(tcallparanode(left).right).left.location.loc of
|
||||||
joinreg64(hregister,hregisterhi),tcallparanode(left).left.location)
|
LOC_REFERENCE,LOC_CREFERENCE:
|
||||||
|
cg64.a_op64_ref_loc(current_asmdata.CurrAsmList,addsubop[inlinenumber],def_cgsize(left.resultdef),
|
||||||
|
tcallparanode(tcallparanode(left).right).left.location.reference,tcallparanode(left).left.location);
|
||||||
|
LOC_REGISTER,LOC_CREGISTER:
|
||||||
|
cg64.a_op64_reg_loc(current_asmdata.CurrAsmList,addsubop[inlinenumber],def_cgsize(left.resultdef),
|
||||||
|
joinreg64(hregister,hregisterhi),tcallparanode(left).left.location);
|
||||||
|
else
|
||||||
|
Internalerror(2020042801);
|
||||||
|
end
|
||||||
else
|
else
|
||||||
{$endif not cpu64bitalu and not cpuhighleveltarget}
|
{$endif not cpu64bitalu and not cpuhighleveltarget}
|
||||||
hlcg.a_op_reg_loc(current_asmdata.CurrAsmList,addsubop[inlinenumber],left.resultdef,
|
case tcallparanode(tcallparanode(left).right).left.location.loc of
|
||||||
hregister,tcallparanode(left).left.location);
|
LOC_REFERENCE,LOC_CREFERENCE:
|
||||||
|
hlcg.a_op_ref_loc(current_asmdata.CurrAsmList,addsubop[inlinenumber],left.resultdef,
|
||||||
|
tcallparanode(tcallparanode(left).right).left.location.reference,tcallparanode(left).left.location);
|
||||||
|
LOC_REGISTER,LOC_CREGISTER:
|
||||||
|
hlcg.a_op_reg_loc(current_asmdata.CurrAsmList,addsubop[inlinenumber],left.resultdef,
|
||||||
|
hregister,tcallparanode(left).left.location);
|
||||||
|
else
|
||||||
|
Internalerror(2020042802);
|
||||||
|
end;
|
||||||
end;
|
end;
|
||||||
{ no overflow checking for pointers (see ninl), and range checking }
|
{ no overflow checking for pointers (see ninl), and range checking }
|
||||||
{ is not applicable for them }
|
{ is not applicable for them }
|
||||||
|
Loading…
Reference in New Issue
Block a user