* fix return registers for hfa's containing singles

git-svn-id: trunk@42666 -
This commit is contained in:
florian 2019-08-12 20:30:18 +00:00
parent 5a379cc256
commit 58bbbadc16

View File

@ -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;