+ support 8 locations in splitparaloc64

git-svn-id: trunk@30533 -
This commit is contained in:
florian 2015-04-10 20:32:22 +00:00
parent b5bac61409
commit 6c19c18bc9

View File

@ -113,8 +113,9 @@ unit cg64f32;
procedure splitparaloc64(const cgpara:tcgpara;var cgparalo,cgparahi:tcgpara);
var
paraloclo,paraloclo2,
paralochi,paralochi2 : pcgparalocation;
paraloclo,paraloclo2,paraloclo3,paraloclo4,
paralochi,paralochi2,paralochi3,paralochi4 : pcgparalocation;
curparaloc : PCGParaLocation;
begin
if not(cgpara.size in [OS_64,OS_S64]) then
internalerror(200408231);
@ -135,6 +136,73 @@ unit cg64f32;
cgparalo.alignment:=cgpara.alignment;
paraloclo:=cgparalo.add_location;
case cgpara.locations_count of
8:
begin
{ 8 parameter fields? }
{ Order for multiple locations is always
paraloc^ -> high
paraloc^.next -> low }
if (target_info.endian=ENDIAN_BIG) then
begin
{ is there any big endian 8 bit ALU/16 bit Addr CPU? }
internalerror(2015041001);
{ paraloc^ -> high }
move(cgpara.location^,paralochi^,sizeof(paralochi^));
paralochi^.next:=nil;
paralochi2:=cgparahi.add_location;
move(cgpara.location^.next,paralochi2^,sizeof(paralochi2^));
{ paraloc^.next^.next^ -> low }
move(cgpara.location^.next^.next^,paraloclo^,sizeof(paraloclo^));
paraloclo^.next:=nil;
paraloclo2:=cgparalo.add_location;
move(cgpara.location^.next^.next^.next^,paraloclo2^,sizeof(paraloclo2^));
end
else
begin
{ paraloc^ -> low }
move(cgpara.location^,paraloclo^,sizeof(paraloclo^));
paraloclo^.next:=nil;
paraloclo2:=cgparalo.add_location;
move(cgpara.location^.next^,paraloclo2^,sizeof(paraloclo2^));
paraloclo2^.next:=nil;
paraloclo3:=cgparalo.add_location;
move(cgpara.location^.next^.next^,paraloclo3^,sizeof(paraloclo3^));
paraloclo3^.next:=nil;
paraloclo4:=cgparalo.add_location;
move(cgpara.location^.next^.next^.next^,paraloclo4^,sizeof(paraloclo4^));
{ paraloc^.next^.next^.next^.next^ -> high }
curparaloc:=cgpara.location^.next^.next^.next^.next;
move(curparaloc^,paralochi^,sizeof(paralochi^));
paralochi^.next:=nil;
paralochi2:=cgparahi.add_location;
move(curparaloc^.next^,paralochi2^,sizeof(paralochi2^));
paralochi2^.next:=nil;
paralochi3:=cgparahi.add_location;
move(curparaloc^.next^.next^,paralochi3^,sizeof(paralochi3^));
paralochi3^.next:=nil;
paralochi4:=cgparahi.add_location;
move(curparaloc^.next^.next^.next^,paralochi4^,sizeof(paralochi4^));
end;
{ fix size }
paraloclo^.size:=OS_8;
paraloclo2^.size:=OS_8;
paraloclo3^.size:=OS_8;
paraloclo4^.size:=OS_8;
paraloclo4^.next:=nil;
paralochi^.size:=OS_8;
paralochi2^.size:=OS_8;
paralochi3^.size:=OS_8;
paralochi4^.size:=OS_8;
paralochi4^.next:=nil;
if cgpara.size=OS_S64 then
if target_info.endian=ENDIAN_BIG then
paralochi^.size:=OS_S8
else
paraloclo4^.size:=OS_S8;
end;
4:
begin
{ 4 parameter fields? }