소스 검색

+ support for fpu temp parameters
+ saving/restoring of fpu register before/after a procedure call

Jonas Maebe 22 년 전
부모
커밋
0cac29ec76
3개의 변경된 파일100개의 추가작업 그리고 39개의 파일을 삭제
  1. 66 28
      compiler/ncgcal.pas
  2. 27 10
      compiler/paramgr.pas
  3. 7 1
      compiler/x86/cgx86.pas

+ 66 - 28
compiler/ncgcal.pas

@@ -103,10 +103,8 @@ implementation
       begin
          { Allocate (temporary) paralocation }
          tempparaloc:=paraitem.paraloc[callerside];
-         if tempparaloc.loc=LOC_REGISTER then
+         if (tempparaloc.loc in [LOC_REGISTER,LOC_FPUREGISTER,LOC_MMREGISTER]) then
            paramanager.alloctempregs(exprasmlist,tempparaloc)
-         else
-           paramanager.allocparaloc(exprasmlist,tempparaloc);
       end;
 
 
@@ -480,7 +478,8 @@ implementation
                   location.register:=NR_FPU_RESULT_REG;
 {$ifdef x86}
                 tcgx86(cg).inc_fpu_stack;
-{$else x86}
+{$else x86} 
+                cg.ungetregister(exprasmlist,location.register);
                 hregister := cg.getfpuregister(exprasmlist,location.size);
                 cg.a_loadfpu_reg_reg(exprasmlist,location.size,location.register,hregister);
                 location.register := hregister;
@@ -605,31 +604,52 @@ implementation
            ppn:=tcgcallparanode(left);
            while assigned(ppn) do
              begin
-               if ppn.tempparaloc.loc=LOC_REGISTER then
-                 begin
-                   paramanager.freeparaloc(exprasmlist,ppn.tempparaloc);
-                   paramanager.allocparaloc(exprasmlist,ppn.paraitem.paraloc[callerside]);
+               case ppn.tempparaloc.loc of
+                 LOC_REGISTER:
+                   begin
+                     paramanager.freeparaloc(exprasmlist,ppn.tempparaloc);
+                     paramanager.allocparaloc(exprasmlist,ppn.paraitem.paraloc[callerside]);
 {$ifdef sparc}
-                   case ppn.tempparaloc.size of
-                     OS_F32 :
-                       ppn.tempparaloc.size:=OS_32;
-                     OS_F64 :
-                       ppn.tempparaloc.size:=OS_64;
-                   end;
+                     case ppn.tempparaloc.size of
+                       OS_F32 :
+                         ppn.tempparaloc.size:=OS_32;
+                       OS_F64 :
+                         ppn.tempparaloc.size:=OS_64;
+                     end;
 {$endif sparc}
 {$ifndef cpu64bit}
-                   if ppn.tempparaloc.size in [OS_64,OS_S64] then
-                     begin
-                       cg.a_load_reg_reg(exprasmlist,OS_32,OS_32,ppn.tempparaloc.registerlow,
-                          ppn.paraitem.paraloc[callerside].registerlow);
-                       cg.a_load_reg_reg(exprasmlist,OS_32,OS_32,ppn.tempparaloc.registerhigh,
-                          ppn.paraitem.paraloc[callerside].registerhigh);
-                     end
-                   else
+                     if ppn.tempparaloc.size in [OS_64,OS_S64] then
+                       begin
+                         cg.a_load_reg_reg(exprasmlist,OS_32,OS_32,ppn.tempparaloc.registerlow,
+                            ppn.paraitem.paraloc[callerside].registerlow);
+                         cg.a_load_reg_reg(exprasmlist,OS_32,OS_32,ppn.tempparaloc.registerhigh,
+                            ppn.paraitem.paraloc[callerside].registerhigh);
+                       end
+                     else
 {$endif cpu64bit}
-                     cg.a_load_reg_reg(exprasmlist,ppn.tempparaloc.size,ppn.tempparaloc.size,
-                         ppn.tempparaloc.register,ppn.paraitem.paraloc[callerside].register);
-                 end;
+                       cg.a_load_reg_reg(exprasmlist,ppn.tempparaloc.size,ppn.tempparaloc.size,
+                           ppn.tempparaloc.register,ppn.paraitem.paraloc[callerside].register);
+                   end;
+                 LOC_FPUREGISTER:
+                   begin
+                     paramanager.freeparaloc(exprasmlist,ppn.tempparaloc);
+                     paramanager.allocparaloc(exprasmlist,ppn.paraitem.paraloc[callerside]);
+                     cg.a_loadfpu_reg_reg(exprasmlist,ppn.tempparaloc.size,
+                       ppn.tempparaloc.register,ppn.paraitem.paraloc[callerside].register);
+                   end;
+                 LOC_MMREGISTER:
+                   begin
+{
+                     paramanager.freeparaloc(exprasmlist,ppn.tempparaloc);
+                     paramanager.allocparaloc(exprasmlist,ppn.paraitem.paraloc[callerside]);
+                     paramanager.freeparaloc(exprasmlist,ppn.tempparaloc);
+                     paramanager.allocparaloc(exprasmlist,ppn.paraitem.paraloc[callerside]);
+                     cg.a_loadmm_reg_reg(exprasmlist,ppn.tempparaloc.size,
+                       ppn.tempparaloc.size,ppn.tempparaloc.register,ppn.paraitem.paraloc[callerside].register, shuffle???);
+}
+                     internalerror(2003102910);
+                   end;
+               end;
                ppn:=tcgcallparanode(ppn.right);
              end;
          end;
@@ -642,8 +662,6 @@ implementation
            ppn:=tcgcallparanode(left);
            while assigned(ppn) do
              begin
-               if ppn.tempparaloc.loc=LOC_REGISTER then
-                 paramanager.freeparaloc(exprasmlist,ppn.tempparaloc);
                paramanager.freeparaloc(exprasmlist,ppn.paraitem.paraloc[callerside]);
                ppn:=tcgcallparanode(ppn.right);
              end;
@@ -699,6 +717,14 @@ implementation
 {$endif cpu64bit}
                    include(regs_to_alloc,getsupreg(procdefinition.funcret_paraloc[callerside].register));
                 end;
+              LOC_FPUREGISTER,LOC_CFPUREGISTER:
+                begin
+                  include(regs_to_push_fpu,procdefinition.funcret_paraloc[callerside].register);
+                end;
+              LOC_MMREGISTER,LOC_CMMREGISTER:
+                begin
+                  internalerror(2003102911);
+                end;
             end;
           end;
 
@@ -770,6 +796,7 @@ implementation
                    cg.ungetregister(exprasmlist,pvreg);
 
                    cg.allocexplicitregisters(exprasmlist,R_INTREGISTER,regs_to_alloc);
+                   cg.allocexplicitregisters(exprasmlist,R_FPUREGISTER,regs_to_push_fpu);
                    cg.allocexplicitregisters(exprasmlist,R_SSEREGISTER,paramanager.get_volatile_registers_mm(procdefinition.proccalloption));
 
                    { call method }
@@ -786,6 +813,7 @@ implementation
                   freeparas;
 
                   cg.allocexplicitregisters(exprasmlist,R_INTREGISTER,regs_to_alloc);
+                  cg.allocexplicitregisters(exprasmlist,R_FPUREGISTER,regs_to_push_fpu);
                   cg.allocexplicitregisters(exprasmlist,R_SSEREGISTER,paramanager.get_volatile_registers_mm(procdefinition.proccalloption));
 
                   { Calling interrupt from the same code requires some
@@ -821,6 +849,7 @@ implementation
               cg.ungetregister(exprasmlist,pvreg);
 
               cg.allocexplicitregisters(exprasmlist,R_INTREGISTER,regs_to_alloc);
+              cg.allocexplicitregisters(exprasmlist,R_FPUREGISTER,regs_to_push_fpu);
               cg.allocexplicitregisters(exprasmlist,R_MMREGISTER,paramanager.get_volatile_registers_mm(procdefinition.proccalloption));
 
               { Calling interrupt from the same code requires some
@@ -871,9 +900,14 @@ implementation
 {$endif cpu64bit}
                      exclude(regs_to_free,getsupreg(procdefinition.funcret_paraloc[callerside].register));
                  end;
+               LOC_FPUREGISTER,LOC_CFPUREGISTER:
+                 begin
+                   exclude(regs_to_push_fpu,getsupreg(procdefinition.funcret_paraloc[callerside].register));
+                 end;
              end;
            end;
          cg.deallocexplicitregisters(exprasmlist,R_MMREGISTER,paramanager.get_volatile_registers_mm(procdefinition.proccalloption));
+         cg.deallocexplicitregisters(exprasmlist,R_FPUREGISTER,regs_to_push_fpu);
          cg.deallocexplicitregisters(exprasmlist,R_INTREGISTER,regs_to_free);
 
          { handle function results }
@@ -1120,7 +1154,11 @@ begin
 end.
 {
   $Log$
-  Revision 1.133  2003-10-20 19:28:17  peter
+  Revision 1.134  2003-10-29 21:24:14  jonas
+    + support for fpu temp parameters
+    + saving/restoring of fpu register before/after a procedure call
+
+  Revision 1.133  2003/10/20 19:28:17  peter
     * fixed inlining float parameters for i386
 
   Revision 1.132  2003/10/17 14:38:32  peter

+ 27 - 10
compiler/paramgr.pas

@@ -377,17 +377,30 @@ implementation
 
     procedure tparamanager.alloctempregs(list: taasmoutput;var locpara:tparalocation);
       begin
-        if locpara.loc<>LOC_REGISTER then
-          internalerror(200308123);
+        case locpara.loc of
+          LOC_REGISTER:
+            begin
 {$ifndef cpu64bit}
-        if locpara.size in [OS_64,OS_S64] then
-          begin
-            locpara.registerlow:=cg.getintregister(list,OS_32);
-            locpara.registerhigh:=cg.getintregister(list,OS_32);
-          end
-        else
+              if locpara.size in [OS_64,OS_S64] then
+                begin
+                  locpara.registerlow:=cg.getintregister(list,OS_32);
+                  locpara.registerhigh:=cg.getintregister(list,OS_32);
+                end
+              else
 {$endif cpu64bit}
-          locpara.register:=cg.getintregister(list,locpara.size);
+                locpara.register:=cg.getintregister(list,locpara.size);
+            end;
+          LOC_FPUREGISTER:
+            begin
+              locpara.register:=cg.getfpuregister(list,locpara.size);
+            end;
+          LOC_MMREGISTER:
+            begin
+              locpara.register:=cg.getfpuregister(list,locpara.size);
+            end;
+          else
+            internalerror(200308123);
+        end;
       end;
 
 
@@ -437,7 +450,11 @@ end.
 
 {
    $Log$
-   Revision 1.64  2003-10-17 14:38:32  peter
+   Revision 1.65  2003-10-29 21:24:14  jonas
+     + support for fpu temp parameters
+     + saving/restoring of fpu register before/after a procedure call
+
+   Revision 1.64  2003/10/17 14:38:32  peter
      * 64k registers supported
      * fixed some memory leaks
 

+ 7 - 1
compiler/x86/cgx86.pas

@@ -254,6 +254,7 @@ unit cgx86;
             rgint.allocexplicitregisters(list,r);
           R_SSEREGISTER :
             rgmm.allocexplicitregisters(list,r);
+          R_FPUREGISTER :
           else
             internalerror(200310092);
         end;
@@ -267,6 +268,7 @@ unit cgx86;
             rgint.deallocexplicitregisters(list,r);
           R_SSEREGISTER :
             rgmm.deallocexplicitregisters(list,r);
+          R_FPUREGISTER :
           else
             internalerror(200310093);
         end;
@@ -1733,7 +1735,11 @@ unit cgx86;
 end.
 {
   $Log$
-  Revision 1.83  2003-10-20 19:30:08  peter
+  Revision 1.84  2003-10-29 21:24:14  jonas
+    + support for fpu temp parameters
+    + saving/restoring of fpu register before/after a procedure call
+
+  Revision 1.83  2003/10/20 19:30:08  peter
     * remove memdebug code for rg
 
   Revision 1.82  2003/10/18 15:41:26  peter