From 58bbbadc16877e99d24515f7e05920c47854eac7 Mon Sep 17 00:00:00 2001 From: florian Date: Mon, 12 Aug 2019 20:30:18 +0000 Subject: [PATCH] * fix return registers for hfa's containing singles git-svn-id: trunk@42666 - --- compiler/arm/cpupara.pas | 35 ++++++++++++++++++++++++++++++----- 1 file changed, 30 insertions(+), 5 deletions(-) diff --git a/compiler/arm/cpupara.pas b/compiler/arm/cpupara.pas index b8dc761de9..519dc09b03 100644 --- a/compiler/arm/cpupara.pas +++ b/compiler/arm/cpupara.pas @@ -711,7 +711,8 @@ unit cpupara; retcgsize : tcgsize; basedef: tdef; i: longint; - mmreg: tregister; + sparesinglereg: tregister; + mmreg : TSuperRegister; begin if set_common_funcretloc_info(p,forcetempdef,retcgsize,result) then exit; @@ -719,6 +720,7 @@ unit cpupara; paraloc:=result.add_location; { Return in FPU register? } basedef:=nil; + sparesinglereg:=NR_NO; if (result.def.typ=floatdef) or is_hfa(result.def,basedef) then begin @@ -736,20 +738,43 @@ unit cpupara; OS_64, OS_F64: begin - mmreg:=NR_MM_RESULT_REG + mmreg:=RS_D0; end; OS_32, OS_F32: begin - mmreg:=NR_S0; + mmreg:=RS_S0; end; else internalerror(2012032501); end; repeat paraloc^.loc:=LOC_MMREGISTER; - paraloc^.register:=mmreg; - inc(mmreg); + { mm registers are strangly ordered in the arm compiler } + case retcgsize of + OS_32,OS_F32: + begin + if sparesinglereg=NR_NO then + begin + paraloc^.register:=newreg(R_MMREGISTER,mmreg,R_SUBFS); + sparesinglereg:=newreg(R_MMREGISTER,mmreg-RS_S0+RS_S1,R_SUBFS); + inc(mmreg); + end + else + begin + paraloc^.register:=sparesinglereg; + sparesinglereg:=NR_NO; + end; + end; + OS_64,OS_F64: + begin + paraloc^.register:=newreg(R_MMREGISTER,mmreg,R_SUBFD); + inc(mmreg); + end; + else + Internalerror(2019081201); + end; + paraloc^.size:=retcgsize; paraloc^.def:=basedef; paraloc:=paraloc^.next;