mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-08-17 21:09:20 +02:00
* support transfering a cgpara that is stored in multiple paralocs into a
single register, by first storing everything consecutively to memory and then loading it. Required for "homogeneous float aggregates" on AArch64 git-svn-id: trunk@29815 -
This commit is contained in:
parent
e6511bcb33
commit
b8c8ef8489
@ -864,12 +864,11 @@ implementation
|
|||||||
end;
|
end;
|
||||||
|
|
||||||
var
|
var
|
||||||
paraloc : pcgparalocation;
|
paraloc : pcgparalocation;
|
||||||
href : treference;
|
href : treference;
|
||||||
sizeleft : aint;
|
sizeleft : aint;
|
||||||
{$if defined(sparc) or defined(arm) or defined(mips)}
|
alignment : longint;
|
||||||
tempref : treference;
|
tempref : treference;
|
||||||
{$endif defined(sparc) or defined(arm) or defined(mips)}
|
|
||||||
{$ifdef mips}
|
{$ifdef mips}
|
||||||
tmpreg : tregister;
|
tmpreg : tregister;
|
||||||
{$endif mips}
|
{$endif mips}
|
||||||
@ -1085,7 +1084,38 @@ implementation
|
|||||||
end
|
end
|
||||||
{$endif defined(cpu8bitalu)}
|
{$endif defined(cpu8bitalu)}
|
||||||
else
|
else
|
||||||
internalerror(200410105);
|
begin
|
||||||
|
{ this can happen if a parameter is spread over
|
||||||
|
multiple paralocs, e.g. if a record with two single
|
||||||
|
fields must be passed in two single precision
|
||||||
|
registers }
|
||||||
|
{ does it fit in the register of destloc? }
|
||||||
|
sizeleft:=para.intsize;
|
||||||
|
if sizeleft<>vardef.size then
|
||||||
|
internalerror(2014122806);
|
||||||
|
if sizeleft<>tcgsize2size[destloc.size] then
|
||||||
|
internalerror(200410105);
|
||||||
|
{ store everything first to memory, then load it in
|
||||||
|
destloc }
|
||||||
|
tg.gettemp(list,sizeleft,sizeleft,tt_persistent,tempref);
|
||||||
|
gen_alloc_regloc(list,destloc);
|
||||||
|
while sizeleft>0 do
|
||||||
|
begin
|
||||||
|
if not assigned(paraloc) then
|
||||||
|
internalerror(2014122807);
|
||||||
|
unget_para(paraloc^);
|
||||||
|
cg.a_load_cgparaloc_ref(list,paraloc^,tempref,sizeleft,newalignment(para.alignment,para.intsize-sizeleft));
|
||||||
|
if (paraloc^.size=OS_NO) and
|
||||||
|
assigned(paraloc^.next) then
|
||||||
|
internalerror(2014122805);
|
||||||
|
inc(tempref.offset,tcgsize2size[paraloc^.size]);
|
||||||
|
dec(sizeleft,tcgsize2size[paraloc^.size]);
|
||||||
|
paraloc:=paraloc^.next;
|
||||||
|
end;
|
||||||
|
dec(tempref.offset,para.intsize);
|
||||||
|
cg.a_load_ref_reg(list,para.size,para.size,tempref,destloc.register);
|
||||||
|
tg.ungettemp(list,tempref);
|
||||||
|
end;
|
||||||
end
|
end
|
||||||
else
|
else
|
||||||
begin
|
begin
|
||||||
|
Loading…
Reference in New Issue
Block a user