소스 검색

* fixed saving/restoring of volatile fpu registers under sysv
+ better provisions for abi differences regarding fpu registers that have
to be saved

Jonas Maebe 21 년 전
부모
커밋
92f038ebec
2개의 변경된 파일115개의 추가작업 그리고 38개의 파일을 삭제
  1. 95 35
      compiler/powerpc/cgcpu.pas
  2. 20 3
      compiler/powerpc/cpupi.pas

+ 95 - 35
compiler/powerpc/cgcpu.pas

@@ -173,6 +173,22 @@ const
              RS_R28,RS_R27,RS_R26,RS_R25,RS_R24,RS_R23,RS_R22,
              RS_R21,RS_R20,RS_R19,RS_R18,RS_R17,RS_R16,RS_R15,
              RS_R14,RS_R13],first_int_imreg,[]);
+        case target_info.abi of
+          abi_powerpc_aix:
+            rg[R_FPUREGISTER]:=trgcpu.create(R_FPUREGISTER,R_SUBNONE,
+                [RS_F0,RS_F1,RS_F2,RS_F3,RS_F4,RS_F5,RS_F6,RS_F7,RS_F8,RS_F9,
+                 RS_F10,RS_F11,RS_F12,RS_F13,RS_F31,RS_F30,RS_F29,RS_F28,RS_F27,
+                 RS_F26,RS_F25,RS_F24,RS_F23,RS_F22,RS_F21,RS_F20,RS_F19,RS_F18,
+                 RS_F17,RS_F16,RS_F15,RS_F14],first_fpu_imreg,[]);
+          abi_powerpc_sysv:
+            rg[R_FPUREGISTER]:=trgcpu.create(R_FPUREGISTER,R_SUBNONE,
+                [RS_F0,RS_F1,RS_F2,RS_F3,RS_F4,RS_F5,RS_F6,RS_F7,RS_F8,RS_F9,
+                 RS_F31,RS_F30,RS_F29,RS_F28,RS_F27,RS_F26,RS_F25,RS_F24,RS_F23,
+                 RS_F22,RS_F21,RS_F20,RS_F19,RS_F18,RS_F17,RS_F16,RS_F15,RS_F14,
+                 RS_F13,RS_F12,RS_F11,RS_F10],first_fpu_imreg,[]);
+          else
+            internalerror(2003122903);
+        end;
         rg[R_FPUREGISTER]:=trgcpu.create(R_FPUREGISTER,R_SUBNONE,
             [RS_F0,RS_F1,RS_F2,RS_F3,RS_F4,RS_F5,RS_F6,RS_F7,RS_F8,RS_F9,
              RS_F10,RS_F11,RS_F12,RS_F13,RS_F31,RS_F30,RS_F29,RS_F28,RS_F27,
@@ -942,9 +958,8 @@ const
          href,href2 : treference;
          usesfpr,usesgpr,gotgot : boolean;
          parastart : aword;
-         offset : aword;
 //         r,r2,rsp:Tregister;
-         regcounter2: Tsuperregister;
+         regcounter2, firstfpureg: Tsuperregister;
          hp: tparaitem;
 
       begin
@@ -960,9 +975,16 @@ const
 
         usesfpr:=false;
         if not (po_assembler in current_procinfo.procdef.procoptions) then
-{$warning FIXME!!}
-          { FIXME: has to be R_F8 instad of R_F14 for SYSV abi }
-          for regcounter:=RS_F14 to RS_F31 do
+          { FIXME: has to be R_F14 instad of R_F8 for SYSV-64bit }
+          case target_info.abi of
+            abi_powerpc_aix:
+              firstfpureg := RS_F14;
+            abi_powerpc_sysv:
+              firstfpureg := RS_F9;
+            else
+              internalerror(2003122903);
+          end;
+          for regcounter:=firstfpureg to RS_F31 do
            begin
              if regcounter in rg[R_FPUREGISTER].used_in_proc then
               begin
@@ -1173,22 +1195,33 @@ const
          regcounter,firstregfpu,firstreggpr: TsuperRegister;
          href : treference;
          usesfpr,usesgpr,genret : boolean;
-         regcounter2:Tsuperregister;
+         regcounter2, firstfpureg:Tsuperregister;
          localsize: aword;
       begin
         { AltiVec context restore, not yet implemented !!! }
 
         usesfpr:=false;
         if not (po_assembler in current_procinfo.procdef.procoptions) then
-          for regcounter:=RS_F14 to RS_F31 do
-           begin
-             if regcounter in rg[R_FPUREGISTER].used_in_proc then
-              begin
-                 usesfpr:=true;
-                 firstregfpu:=regcounter;
-                 break;
-              end;
-           end;
+          begin
+            { FIXME: has to be R_F14 instad of R_F8 for SYSV-64bit }
+            case target_info.abi of
+              abi_powerpc_aix:
+                firstfpureg := RS_F14;
+              abi_powerpc_sysv:
+                firstfpureg := RS_F9;
+              else
+                internalerror(2003122903);
+            end;
+            for regcounter:=firstfpureg to RS_F31 do
+             begin
+               if regcounter in rg[R_FPUREGISTER].used_in_proc then
+                begin
+                   usesfpr:=true;
+                   firstregfpu:=regcounter;
+                   break;
+                end;
+             end;
+          end;
 
         usesgpr:=false;
         if not (po_assembler in current_procinfo.procdef.procoptions) then
@@ -1307,19 +1340,30 @@ const
          usesfpr,usesgpr: boolean;
          href : treference;
          offset: integer;
-         regcounter2: Tsuperregister;
+         regcounter2, firstfpureg: Tsuperregister;
     begin
       usesfpr:=false;
       if not (po_assembler in current_procinfo.procdef.procoptions) then
-        for regcounter:=RS_F14 to RS_F31 do
-         begin
-           if regcounter in rg[R_FPUREGISTER].used_in_proc then
-            begin
-               usesfpr:=true;
-               firstregfpu:=regcounter;
-               break;
+        begin
+            { FIXME: has to be R_F14 instad of R_F8 for SYSV-64bit }
+            case target_info.abi of
+              abi_powerpc_aix:
+                firstfpureg := RS_F14;
+              abi_powerpc_sysv:
+                firstfpureg := RS_F9;
+              else
+                internalerror(2003122903);
             end;
-         end;
+          for regcounter:=firstfpureg to RS_F31 do
+           begin
+             if regcounter in rg[R_FPUREGISTER].used_in_proc then
+              begin
+                 usesfpr:=true;
+                 firstregfpu:=regcounter;
+                 break;
+              end;
+           end;
+        end;
       usesgpr:=false;
       if not (po_assembler in current_procinfo.procdef.procoptions) then
         for regcounter2:=RS_R13 to RS_R31 do
@@ -1375,20 +1419,31 @@ const
          usesfpr,usesgpr: boolean;
          href : treference;
          offset: integer;
-         regcounter2: Tsuperregister;
+         regcounter2, firstfpureg: Tsuperregister;
 
     begin
       usesfpr:=false;
       if not (po_assembler in current_procinfo.procdef.procoptions) then
-        for regcounter:=RS_F14 to RS_F31 do
-         begin
-           if regcounter in rg[R_FPUREGISTER].used_in_proc then
-            begin
-               usesfpr:=true;
-               firstregfpu:=regcounter;
-               break;
-            end;
-         end;
+        begin
+          { FIXME: has to be R_F14 instad of R_F8 for SYSV-64bit }
+          case target_info.abi of
+            abi_powerpc_aix:
+              firstfpureg := RS_F14;
+            abi_powerpc_sysv:
+              firstfpureg := RS_F9;
+            else
+              internalerror(2003122903);
+          end;
+          for regcounter:=firstfpureg to RS_F31 do
+           begin
+             if regcounter in rg[R_FPUREGISTER].used_in_proc then
+              begin
+                 usesfpr:=true;
+                 firstregfpu:=regcounter;
+                 break;
+              end;
+           end;
+        end;
 
       usesgpr:=false;
       if not (po_assembler in current_procinfo.procdef.procoptions) then
@@ -2326,7 +2381,12 @@ begin
 end.
 {
   $Log$
-  Revision 1.153  2003-12-29 11:13:53  jonas
+  Revision 1.154  2003-12-29 14:17:50  jonas
+    * fixed saving/restoring of volatile fpu registers under sysv
+    + better provisions for abi differences regarding fpu registers that have
+      to be saved
+
+  Revision 1.153  2003/12/29 11:13:53  jonas
     * fixed tb0350 (support loading address of reference containing the
       address 0)
 

+ 20 - 3
compiler/powerpc/cpupi.pas

@@ -52,7 +52,8 @@ unit cpupi;
        cpubase,
        aasmtai,
        tgobj,
-       symconst,symsym,paramgr,symutil;
+       symconst,symsym,paramgr,symutil,
+       verbose;
 
     constructor tppcprocinfo.create(aparent:tprocinfo);
 
@@ -119,10 +120,21 @@ unit cpupi;
 
 
     function tppcprocinfo.calc_stackframe_size:longint;
+      var
+        first_save_fpu_register: longint;
       begin
         { more or less copied from cgcpu.pas/g_stackframe_entry }
+        { FIXME: has to be R_F14 instad of R_F8 for SYSV-64bit }
+        case target_info.abi of
+          abi_powerpc_aix:
+            first_save_fpu_register := 14;
+          abi_powerpc_sysv:
+            first_save_fpu_register := 9;
+          else
+            internalerror(2003122903);
+        end;
         if not (po_assembler in procdef.procoptions) then
-          result := align(align((31-13+1)*4+(31-14+1)*8,16)+tg.lasttemp,16)
+          result := align(align((31-13+1)*4+(31-first_save_fpu_register+1)*8,16)+tg.lasttemp,16)
         else
           result := align(tg.lasttemp,16);
       end;
@@ -133,7 +145,12 @@ begin
 end.
 {
   $Log$
-  Revision 1.32  2003-12-07 16:40:45  jonas
+  Revision 1.33  2003-12-29 14:17:50  jonas
+    * fixed saving/restoring of volatile fpu registers under sysv
+    + better provisions for abi differences regarding fpu registers that have
+      to be saved
+
+  Revision 1.32  2003/12/07 16:40:45  jonas
     * moved count_locals from pstatmnt to symutils
     * use count_locals in powerpc/cpupi to check whether we should set the
       first temp offset (and as such generate a stackframe)