mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-09-13 20:29:24 +02:00
* fix return registers for hfa's containing singles
git-svn-id: trunk@42666 -
This commit is contained in:
parent
5a379cc256
commit
58bbbadc16
@ -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;
|
||||||
|
Loading…
Reference in New Issue
Block a user