summaryrefslogtreecommitdiff
path: root/compiler/cg64f32.pas
diff options
context:
space:
mode:
authorflorian <florian@3ad0048d-3df7-0310-abae-a5850022a9f2>2015-04-10 20:32:22 +0000
committerflorian <florian@3ad0048d-3df7-0310-abae-a5850022a9f2>2015-04-10 20:32:22 +0000
commit19f56796e5fd3e367d4e2bea84dd4661714a433f (patch)
treec098ee25bc07ab2f31b899a8a4d498e96a3a3bc0 /compiler/cg64f32.pas
parente654bb5b52c84074f26dadaaa80bad8b973dadd7 (diff)
downloadfpc-19f56796e5fd3e367d4e2bea84dd4661714a433f.tar.gz
+ support 8 locations in splitparaloc64
git-svn-id: http://svn.freepascal.org/svn/fpc/trunk@30533 3ad0048d-3df7-0310-abae-a5850022a9f2
Diffstat (limited to 'compiler/cg64f32.pas')
-rw-r--r--compiler/cg64f32.pas72
1 files changed, 70 insertions, 2 deletions
diff --git a/compiler/cg64f32.pas b/compiler/cg64f32.pas
index fde37bc256..6e4de622c0 100644
--- a/compiler/cg64f32.pas
+++ b/compiler/cg64f32.pas
@@ -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? }