Browse Source

+ support 8 locations in splitparaloc64

git-svn-id: trunk@30533 -
florian 10 years ago
parent
commit
6c19c18bc9
1 changed files with 70 additions and 2 deletions
  1. 70 2
      compiler/cg64f32.pas

+ 70 - 2
compiler/cg64f32.pas

@@ -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,
-        paralochi,paralochi2 : pcgparalocation;
+        paraloclo,paraloclo2,paraloclo3,paraloclo4,
+        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? }