mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-08-18 20:09:18 +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);
|
procedure splitparaloc64(const cgpara:tcgpara;var cgparalo,cgparahi:tcgpara);
|
||||||
var
|
var
|
||||||
paraloclo,paraloclo2,
|
paraloclo,paraloclo2,paraloclo3,paraloclo4,
|
||||||
paralochi,paralochi2 : pcgparalocation;
|
paralochi,paralochi2,paralochi3,paralochi4 : pcgparalocation;
|
||||||
|
curparaloc : PCGParaLocation;
|
||||||
begin
|
begin
|
||||||
if not(cgpara.size in [OS_64,OS_S64]) then
|
if not(cgpara.size in [OS_64,OS_S64]) then
|
||||||
internalerror(200408231);
|
internalerror(200408231);
|
||||||
@ -135,6 +136,73 @@ unit cg64f32;
|
|||||||
cgparalo.alignment:=cgpara.alignment;
|
cgparalo.alignment:=cgpara.alignment;
|
||||||
paraloclo:=cgparalo.add_location;
|
paraloclo:=cgparalo.add_location;
|
||||||
case cgpara.locations_count of
|
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:
|
4:
|
||||||
begin
|
begin
|
||||||
{ 4 parameter fields? }
|
{ 4 parameter fields? }
|
||||||
|
Loading…
Reference in New Issue
Block a user