* 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; retcgsize : tcgsize;
basedef: tdef; basedef: tdef;
i: longint; i: longint;
mmreg: tregister; sparesinglereg: tregister;
mmreg : TSuperRegister;
begin begin
if set_common_funcretloc_info(p,forcetempdef,retcgsize,result) then if set_common_funcretloc_info(p,forcetempdef,retcgsize,result) then
exit; exit;
@ -719,6 +720,7 @@ unit cpupara;
paraloc:=result.add_location; paraloc:=result.add_location;
{ Return in FPU register? } { Return in FPU register? }
basedef:=nil; basedef:=nil;
sparesinglereg:=NR_NO;
if (result.def.typ=floatdef) or if (result.def.typ=floatdef) or
is_hfa(result.def,basedef) then is_hfa(result.def,basedef) then
begin begin
@ -736,20 +738,43 @@ unit cpupara;
OS_64, OS_64,
OS_F64: OS_F64:
begin begin
mmreg:=NR_MM_RESULT_REG mmreg:=RS_D0;
end; end;
OS_32, OS_32,
OS_F32: OS_F32:
begin begin
mmreg:=NR_S0; mmreg:=RS_S0;
end; end;
else else
internalerror(2012032501); internalerror(2012032501);
end; end;
repeat repeat
paraloc^.loc:=LOC_MMREGISTER; paraloc^.loc:=LOC_MMREGISTER;
paraloc^.register:=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); 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^.size:=retcgsize;
paraloc^.def:=basedef; paraloc^.def:=basedef;
paraloc:=paraloc^.next; paraloc:=paraloc^.next;