diff options
author | florian <florian@3ad0048d-3df7-0310-abae-a5850022a9f2> | 2015-04-10 20:32:22 +0000 |
---|---|---|
committer | florian <florian@3ad0048d-3df7-0310-abae-a5850022a9f2> | 2015-04-10 20:32:22 +0000 |
commit | 19f56796e5fd3e367d4e2bea84dd4661714a433f (patch) | |
tree | c098ee25bc07ab2f31b899a8a4d498e96a3a3bc0 /compiler/cg64f32.pas | |
parent | e654bb5b52c84074f26dadaaa80bad8b973dadd7 (diff) | |
download | fpc-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.pas | 72 |
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? } |