mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-04-24 03:39:31 +02:00
+ support 8 locations in splitparaloc64
git-svn-id: trunk@30533 -
This commit is contained in:
parent
b5bac61409
commit
6c19c18bc9
@ -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? }
|
||||
|
Loading…
Reference in New Issue
Block a user