|
@@ -38,6 +38,9 @@ uses
|
|
|
type
|
|
|
thlcgmips = class(thlcg2ll)
|
|
|
function a_call_name(list: TAsmList; pd: tprocdef; const s: TSymStr; forceresdef: tdef; weak: boolean): tcgpara; override;
|
|
|
+ procedure a_load_subsetreg_reg(list: TAsmList; subsetsize, tosize: tdef; const sreg: tsubsetregister; destreg: tregister);override;
|
|
|
+ protected
|
|
|
+ procedure a_load_regconst_subsetreg_intern(list: TAsmList; fromsize, subsetsize: tdef; fromreg: tregister; const sreg: tsubsetregister; slopt: tsubsetloadopt); override;
|
|
|
end;
|
|
|
|
|
|
procedure create_hlcodegen;
|
|
@@ -45,11 +48,15 @@ uses
|
|
|
implementation
|
|
|
|
|
|
uses
|
|
|
+ verbose,
|
|
|
aasmtai,
|
|
|
+ aasmcpu,
|
|
|
cutils,
|
|
|
globals,
|
|
|
+ defutil,
|
|
|
cgobj,
|
|
|
cpubase,
|
|
|
+ cpuinfo,
|
|
|
cgcpu;
|
|
|
|
|
|
function thlcgmips.a_call_name(list: TAsmList; pd: tprocdef; const s: TSymStr; forceresdef: tdef; weak: boolean): tcgpara;
|
|
@@ -79,6 +86,66 @@ implementation
|
|
|
end;
|
|
|
|
|
|
|
|
|
+ procedure thlcgmips.a_load_subsetreg_reg(list: TAsmList; subsetsize, tosize: tdef; const sreg: tsubsetregister; destreg: tregister);
|
|
|
+ var
|
|
|
+ cgsubsetsize,
|
|
|
+ cgtosize: tcgsize;
|
|
|
+ begin
|
|
|
+ cgsubsetsize:=def_cgsize(subsetsize);
|
|
|
+ cgtosize:=def_cgsize(tosize);
|
|
|
+ if (current_settings.cputype<>cpu_mips32r2) then
|
|
|
+ inherited a_load_subsetreg_reg(list,subsetsize,tosize,sreg,destreg)
|
|
|
+ else if (sreg.bitlen>32) then
|
|
|
+ InternalError(2013070201)
|
|
|
+ else if (sreg.bitlen<>32) then
|
|
|
+ begin
|
|
|
+ list.concat(taicpu.op_reg_reg_const_const(A_EXT,destreg,sreg.subsetreg,
|
|
|
+ sreg.startbit,sreg.bitlen));
|
|
|
+ { types with a negative lower bound are always a base type (8, 16, 32 bits) }
|
|
|
+ if (cgsubsetsize in [OS_S8..OS_S128]) then
|
|
|
+ if ((sreg.bitlen mod 8) = 0) then
|
|
|
+ begin
|
|
|
+ cg.a_load_reg_reg(list,tcgsize2unsigned[cgsubsetsize],cgsubsetsize,destreg,destreg);
|
|
|
+ cg.a_load_reg_reg(list,cgsubsetsize,cgtosize,destreg,destreg);
|
|
|
+ end
|
|
|
+ else
|
|
|
+ begin
|
|
|
+ cg.a_op_const_reg(list,OP_SHL,OS_INT,32-sreg.bitlen,destreg);
|
|
|
+ cg.a_op_const_reg(list,OP_SAR,OS_INT,32-sreg.bitlen,destreg);
|
|
|
+ end;
|
|
|
+ end
|
|
|
+ else
|
|
|
+ cg.a_load_reg_reg(list,cgsubsetsize,cgtosize,sreg.subsetreg,destreg);
|
|
|
+ end;
|
|
|
+
|
|
|
+
|
|
|
+ procedure thlcgmips.a_load_regconst_subsetreg_intern(list: TAsmList; fromsize, subsetsize: tdef; fromreg: tregister; const sreg: tsubsetregister; slopt: tsubsetloadopt);
|
|
|
+ begin
|
|
|
+ if (current_settings.cputype<>cpu_mips32r2) then
|
|
|
+ inherited a_load_regconst_subsetreg_intern(list,fromsize,subsetsize,fromreg,sreg,slopt)
|
|
|
+ else if (sreg.bitlen>32) then
|
|
|
+ InternalError(2013070202)
|
|
|
+ else if (sreg.bitlen<>32) then
|
|
|
+ begin
|
|
|
+ case slopt of
|
|
|
+ SL_SETZERO:
|
|
|
+ fromreg:=NR_R0;
|
|
|
+ SL_SETMAX:
|
|
|
+ begin
|
|
|
+ fromreg:=cg.getintregister(list,OS_INT);
|
|
|
+ cg.a_load_const_reg(list,OS_INT,-1,fromreg);
|
|
|
+ end;
|
|
|
+ end;
|
|
|
+ list.concat(taicpu.op_reg_reg_const_const(A_INS,sreg.subsetreg,fromreg,
|
|
|
+ sreg.startbit,sreg.bitlen));
|
|
|
+ end
|
|
|
+ else if not (slopt in [SL_SETZERO,SL_SETMAX]) then
|
|
|
+ cg.a_load_reg_reg(list,def_cgsize(fromsize),def_cgsize(subsetsize),fromreg,sreg.subsetreg)
|
|
|
+ else
|
|
|
+ inherited a_load_regconst_subsetreg_intern(list,fromsize,subsetsize,fromreg,sreg,slopt);
|
|
|
+ end;
|
|
|
+
|
|
|
+
|
|
|
procedure create_hlcodegen;
|
|
|
begin
|
|
|
hlcg:=thlcgmips.create;
|