|
@@ -44,6 +44,7 @@ unit cgcpu;
|
|
procedure a_load_const_cgpara(list : TAsmList;size : tcgsize;a : tcgint;const paraloc : TCGPara);override;
|
|
procedure a_load_const_cgpara(list : TAsmList;size : tcgsize;a : tcgint;const paraloc : TCGPara);override;
|
|
protected
|
|
protected
|
|
procedure a_load_ref_cgparalocref(list: TAsmList; sourcesize: tcgsize; sizeleft: tcgint; const ref, paralocref: treference; const cgpara: tcgpara; const location: PCGParaLocation); override;
|
|
procedure a_load_ref_cgparalocref(list: TAsmList; sourcesize: tcgsize; sizeleft: tcgint; const ref, paralocref: treference; const cgpara: tcgpara; const location: PCGParaLocation); override;
|
|
|
|
+ procedure init_mmregister_allocator;
|
|
public
|
|
public
|
|
procedure a_loadaddr_ref_cgpara(list : TAsmList;const r : treference;const paraloc : TCGPara);override;
|
|
procedure a_loadaddr_ref_cgpara(list : TAsmList;const r : treference;const paraloc : TCGPara);override;
|
|
|
|
|
|
@@ -297,19 +298,8 @@ unit cgcpu;
|
|
if FPUARM_HAS_FPA in fpu_capabilities[current_settings.fputype] then
|
|
if FPUARM_HAS_FPA in fpu_capabilities[current_settings.fputype] then
|
|
rg[R_FPUREGISTER]:=trgcpu.create(R_FPUREGISTER,R_SUBNONE,
|
|
rg[R_FPUREGISTER]:=trgcpu.create(R_FPUREGISTER,R_SUBNONE,
|
|
[RS_F0,RS_F1,RS_F2,RS_F3,RS_F4,RS_F5,RS_F6,RS_F7],first_fpu_imreg,[]);
|
|
[RS_F0,RS_F1,RS_F2,RS_F3,RS_F4,RS_F5,RS_F6,RS_F7],first_fpu_imreg,[]);
|
|
- { The register allocator currently cannot deal with multiple
|
|
|
|
- non-overlapping subregs per register, so we can only use
|
|
|
|
- half the single precision registers for now (as sub registers of the
|
|
|
|
- double precision ones). }
|
|
|
|
- if FPUARM_HAS_32REGS in fpu_capabilities[current_settings.fputype] then
|
|
|
|
- rg[R_MMREGISTER]:=trgcpu.create(R_MMREGISTER,R_SUBFD,
|
|
|
|
- [RS_D0,RS_D1,RS_D2,RS_D3,RS_D4,RS_D5,RS_D6,RS_D7,
|
|
|
|
- RS_D16,RS_D17,RS_D18,RS_D19,RS_D20,RS_D21,RS_D22,RS_D23,RS_D24,RS_D25,RS_D26,RS_D27,RS_D28,RS_D29,RS_D30,RS_D31,
|
|
|
|
- RS_D8,RS_D9,RS_D10,RS_D11,RS_D12,RS_D13,RS_D14,RS_D15
|
|
|
|
- ],first_mm_imreg,[])
|
|
|
|
- else if FPUARM_HAS_VFP_EXTENSION in fpu_capabilities[current_settings.fputype] then
|
|
|
|
- rg[R_MMREGISTER]:=trgcpu.create(R_MMREGISTER,R_SUBFD,
|
|
|
|
- [RS_D0,RS_D1,RS_D2,RS_D3,RS_D4,RS_D5,RS_D6,RS_D7,RS_D8,RS_D9,RS_D10,RS_D11,RS_D12,RS_D13,RS_D14,RS_D15],first_mm_imreg,[]);
|
|
|
|
|
|
+
|
|
|
|
+ init_mmregister_allocator;
|
|
end;
|
|
end;
|
|
|
|
|
|
|
|
|
|
@@ -589,6 +579,33 @@ unit cgcpu;
|
|
end;
|
|
end;
|
|
|
|
|
|
|
|
|
|
|
|
+ procedure tbasecgarm.init_mmregister_allocator;
|
|
|
|
+ begin
|
|
|
|
+ { The register allocator currently cannot deal with multiple
|
|
|
|
+ non-overlapping subregs per register, so we can only use
|
|
|
|
+ half the single precision registers for now (as sub registers of the
|
|
|
|
+ double precision ones). }
|
|
|
|
+ if (FPUARM_HAS_32REGS in fpu_capabilities[current_settings.fputype]) and
|
|
|
|
+ (FPUARM_HAS_VFP_DOUBLE in fpu_capabilities[current_settings.fputype]) then
|
|
|
|
+ rg[R_MMREGISTER]:=trgcpu.create(R_MMREGISTER,R_SUBFD,
|
|
|
|
+ [RS_D0,RS_D1,RS_D2,RS_D3,RS_D4,RS_D5,RS_D6,RS_D7,
|
|
|
|
+ RS_D16,RS_D17,RS_D18,RS_D19,RS_D20,RS_D21,RS_D22,RS_D23,RS_D24,RS_D25,RS_D26,RS_D27,RS_D28,RS_D29,RS_D30,RS_D31,
|
|
|
|
+ RS_D8,RS_D9,RS_D10,RS_D11,RS_D12,RS_D13,RS_D14,RS_D15
|
|
|
|
+ ],first_mm_imreg,[])
|
|
|
|
+ else if (FPUARM_HAS_32REGS in fpu_capabilities[current_settings.fputype]) then
|
|
|
|
+ rg[R_MMREGISTER]:=trgcpu.create(R_MMREGISTER,R_SUBFS,
|
|
|
|
+ [RS_S0,RS_S1,RS_S2,RS_S3,RS_S4,RS_S5,RS_S6,RS_S7,
|
|
|
|
+ RS_S16,RS_S17,RS_S18,RS_S19,RS_S20,RS_S21,RS_S22,RS_S23,RS_S24,RS_S25,RS_S26,RS_S27,RS_S28,RS_S29,RS_S30,RS_S31,
|
|
|
|
+ RS_S8,RS_S9,RS_S10,RS_S11,RS_S12,RS_S13,RS_S14,RS_S15
|
|
|
|
+ ],first_mm_imreg,[])
|
|
|
|
+ else if FPUARM_HAS_VFP_EXTENSION in fpu_capabilities[current_settings.fputype] then
|
|
|
|
+ rg[R_MMREGISTER]:=trgcpu.create(R_MMREGISTER,R_SUBFD,
|
|
|
|
+ [RS_D0,RS_D1,RS_D2,RS_D3,RS_D4,RS_D5,RS_D6,RS_D7,
|
|
|
|
+ RS_D8,RS_D9,RS_D10,RS_D11,RS_D12,RS_D13,RS_D14,RS_D15
|
|
|
|
+ ],first_mm_imreg,[]);
|
|
|
|
+ end;
|
|
|
|
+
|
|
|
|
+
|
|
procedure tbasecgarm.a_loadaddr_ref_cgpara(list : TAsmList;const r : treference;const paraloc : TCGPara);
|
|
procedure tbasecgarm.a_loadaddr_ref_cgpara(list : TAsmList;const r : treference;const paraloc : TCGPara);
|
|
var
|
|
var
|
|
ref: treference;
|
|
ref: treference;
|
|
@@ -4334,24 +4351,7 @@ unit cgcpu;
|
|
rg[R_FPUREGISTER]:=trgcpu.create(R_FPUREGISTER,R_SUBNONE,
|
|
rg[R_FPUREGISTER]:=trgcpu.create(R_FPUREGISTER,R_SUBNONE,
|
|
[RS_F0,RS_F1,RS_F2,RS_F3,RS_F4,RS_F5,RS_F6,RS_F7],first_fpu_imreg,[]);
|
|
[RS_F0,RS_F1,RS_F2,RS_F3,RS_F4,RS_F5,RS_F6,RS_F7],first_fpu_imreg,[]);
|
|
|
|
|
|
- if (FPUARM_HAS_32REGS in fpu_capabilities[current_settings.fputype]) and
|
|
|
|
- (FPUARM_HAS_VFP_DOUBLE in fpu_capabilities[current_settings.fputype]) then
|
|
|
|
- rg[R_MMREGISTER]:=trgcpu.create(R_MMREGISTER,R_SUBFD,
|
|
|
|
- [RS_D0,RS_D1,RS_D2,RS_D3,RS_D4,RS_D5,RS_D6,RS_D7,
|
|
|
|
- RS_D16,RS_D17,RS_D18,RS_D19,RS_D20,RS_D21,RS_D22,RS_D23,RS_D24,RS_D25,RS_D26,RS_D27,RS_D28,RS_D29,RS_D30,RS_D31,
|
|
|
|
- RS_D8,RS_D9,RS_D10,RS_D11,RS_D12,RS_D13,RS_D14,RS_D15
|
|
|
|
- ],first_mm_imreg,[])
|
|
|
|
- else if (FPUARM_HAS_32REGS in fpu_capabilities[current_settings.fputype]) then
|
|
|
|
- rg[R_MMREGISTER]:=trgcpu.create(R_MMREGISTER,R_SUBFS,
|
|
|
|
- [RS_S0,RS_S1,RS_S2,RS_S3,RS_S4,RS_S5,RS_S6,RS_S7,
|
|
|
|
- RS_S16,RS_S17,RS_S18,RS_S19,RS_S20,RS_S21,RS_S22,RS_S23,RS_S24,RS_S25,RS_S26,RS_S27,RS_S28,RS_S29,RS_S30,RS_S31,
|
|
|
|
- RS_S8,RS_S9,RS_S10,RS_S11,RS_S12,RS_S13,RS_S14,RS_S15
|
|
|
|
- ],first_mm_imreg,[])
|
|
|
|
- else if FPUARM_HAS_VFP_EXTENSION in fpu_capabilities[current_settings.fputype] then
|
|
|
|
- rg[R_MMREGISTER]:=trgcpu.create(R_MMREGISTER,R_SUBFD,
|
|
|
|
- [RS_D0,RS_D1,RS_D2,RS_D3,RS_D4,RS_D5,RS_D6,RS_D7,
|
|
|
|
- RS_D8,RS_D9,RS_D10,RS_D11,RS_D12,RS_D13,RS_D14,RS_D15
|
|
|
|
- ],first_mm_imreg,[]);
|
|
|
|
|
|
+ init_mmregister_allocator;
|
|
end;
|
|
end;
|
|
|
|
|
|
|
|
|