|
|
@@ -53,6 +53,8 @@ unit cgcpu;
|
|
|
procedure a_op64_const_reg(list : TAsmList;op:TOpCG;size : tcgsize;value : int64;reg : tregister64);override;
|
|
|
procedure a_op64_const_reg_reg(list: TAsmList;op:TOpCG;size : tcgsize;value : int64;regsrc,regdst : tregister64);override;
|
|
|
procedure a_op64_reg_reg_reg(list: TAsmList;op:TOpCG;size : tcgsize;regsrc1,regsrc2,regdst : tregister64);override;
|
|
|
+ procedure a_load64_ref_cgpara(list: TAsmList; const r: treference; const paraloc: tcgpara);override;
|
|
|
+ procedure a_load64_ref_reg(list: TAsmList; const ref: treference; reg: tregister64);override;
|
|
|
end;
|
|
|
|
|
|
procedure create_codegen;
|
|
|
@@ -485,6 +487,32 @@ unit cgcpu;
|
|
|
end;
|
|
|
|
|
|
|
|
|
+ procedure tcg64frv.a_load64_ref_cgpara(list : TAsmList;const r : treference;const paraloc : tcgpara);
|
|
|
+ var
|
|
|
+ hreg64 : tregister64;
|
|
|
+ begin
|
|
|
+ { Override this function to prevent loading the reference twice.
|
|
|
+ Use here some extra registers, but those are optimized away by the RA }
|
|
|
+ hreg64.reglo:=cg.GetIntRegister(list,OS_32);
|
|
|
+ hreg64.reghi:=cg.GetIntRegister(list,OS_32);
|
|
|
+ a_load64_ref_reg(list,r,hreg64);
|
|
|
+ a_load64_reg_cgpara(list,hreg64,paraloc);
|
|
|
+ end;
|
|
|
+
|
|
|
+
|
|
|
+ procedure tcg64frv.a_load64_ref_reg(list : TAsmList;const ref : treference;reg : tregister64);
|
|
|
+ var
|
|
|
+ tmpref: treference;
|
|
|
+ begin
|
|
|
+ { Override this function to prevent loading the reference twice }
|
|
|
+ tmpref:=ref;
|
|
|
+ tcgrv32(cg).fixref(list,tmpref);
|
|
|
+ cg.a_load_ref_reg(list,OS_32,OS_32,tmpref,reg.reglo);
|
|
|
+ inc(tmpref.offset,4);
|
|
|
+ cg.a_load_ref_reg(list,OS_32,OS_32,tmpref,reg.reghi);
|
|
|
+ end;
|
|
|
+
|
|
|
+
|
|
|
procedure create_codegen;
|
|
|
begin
|
|
|
cg := tcgrv32.create;
|