mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-08-12 04:06:08 +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;
|
||||
|
||||
var
|
||||
paraloc : pcgparalocation;
|
||||
href : treference;
|
||||
sizeleft : aint;
|
||||
{$if defined(sparc) or defined(arm) or defined(mips)}
|
||||
tempref : treference;
|
||||
{$endif defined(sparc) or defined(arm) or defined(mips)}
|
||||
paraloc : pcgparalocation;
|
||||
href : treference;
|
||||
sizeleft : aint;
|
||||
alignment : longint;
|
||||
tempref : treference;
|
||||
{$ifdef mips}
|
||||
tmpreg : tregister;
|
||||
{$endif mips}
|
||||
@ -1085,7 +1084,38 @@ implementation
|
||||
end
|
||||
{$endif defined(cpu8bitalu)}
|
||||
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
|
||||
else
|
||||
begin
|
||||
|
Loading…
Reference in New Issue
Block a user