Explorar o código

+ before calling a helper procedure, all register classes are now saved, this patch is subject to being merged back

git-svn-id: trunk@201 -
florian %!s(int64=20) %!d(string=hai) anos
pai
achega
355aaa69c8
Modificáronse 7 ficheiros con 112 adicións e 110 borrados
  1. 42 40
      compiler/cgobj.pas
  2. 4 4
      compiler/ncgcal.pas
  3. 34 34
      compiler/ncgflw.pas
  4. 2 2
      compiler/ncginl.pas
  5. 2 2
      compiler/ncgld.pas
  6. 14 14
      compiler/ncgmem.pas
  7. 14 14
      compiler/ncgutil.pas

+ 42 - 40
compiler/cgobj.pas

@@ -95,6 +95,8 @@ unit cgobj;
           {# Free multiple registers specified.}
           procedure dealloccpuregisters(list:Taasmoutput;rt:Tregistertype;r:Tcpuregisterset);virtual;
 
+          procedure allocallcpuregisters(list:Taasmoutput);virtual;
+          procedure deallocallcpuregisters(list:Taasmoutput);virtual;
           procedure do_register_allocation(list:Taasmoutput;headertai:tai);virtual;
 
           function makeregsize(list:Taasmoutput;reg:Tregister;size:Tcgsize):Tregister;
@@ -617,6 +619,14 @@ implementation
       end;
 
 
+    procedure tcg.allocallcpuregisters(list:Taasmoutput);
+      begin
+        alloccpuregisters(list,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
+        alloccpuregisters(list,R_FPUREGISTER,paramanager.get_volatile_registers_fpu(pocall_default));
+        alloccpuregisters(list,R_MMREGISTER,paramanager.get_volatile_registers_mm(pocall_default));
+      end;
+
+
     procedure tcg.dealloccpuregisters(list:Taasmoutput;rt:Tregistertype;r:Tcpuregisterset);
       begin
         if assigned(rg[rt]) then
@@ -626,6 +636,14 @@ implementation
       end;
 
 
+    procedure tcg.deallocallcpuregisters(list:Taasmoutput);
+      begin
+        dealloccpuregisters(list,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
+        dealloccpuregisters(list,R_FPUREGISTER,paramanager.get_volatile_registers_fpu(pocall_default));
+        dealloccpuregisters(list,R_MMREGISTER,paramanager.get_volatile_registers_mm(pocall_default));
+      end;
+
+
     function tcg.uses_registers(rt:Tregistertype):boolean;
       begin
         if assigned(rg[rt]) then
@@ -1374,13 +1392,9 @@ implementation
         paramanager.freeparaloc(list,cgpara3);
         paramanager.freeparaloc(list,cgpara2);
         paramanager.freeparaloc(list,cgpara1);
-        alloccpuregisters(list,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
-        alloccpuregisters(list,R_FPUREGISTER,paramanager.get_volatile_registers_fpu(pocall_default));
-        alloccpuregisters(list,R_MMREGISTER,paramanager.get_volatile_registers_mm(pocall_default));
+        allocallcpuregisters(list);
         a_call_name(list,'FPC_SHORTSTR_ASSIGN');
-        dealloccpuregisters(list,R_MMREGISTER,paramanager.get_volatile_registers_mm(pocall_default));
-        dealloccpuregisters(list,R_FPUREGISTER,paramanager.get_volatile_registers_fpu(pocall_default));
-        dealloccpuregisters(list,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
+        deallocallcpuregisters(list);
         cgpara3.done;
         cgpara2.done;
         cgpara1.done;
@@ -1427,11 +1441,9 @@ implementation
             { these functions get the pointer by value }
             a_param_ref(list,OS_ADDR,ref,cgpara1);
             paramanager.freeparaloc(list,cgpara1);
-            alloccpuregisters(list,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
-            alloccpuregisters(list,R_FPUREGISTER,paramanager.get_volatile_registers_fpu(pocall_default));
-            alloccpuregisters(list,R_MMREGISTER,paramanager.get_volatile_registers_int(pocall_default));
+            allocallcpuregisters(list);
             a_call_name(list,incrfunc);
-            dealloccpuregisters(list,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
+            deallocallcpuregisters(list);
           end
          else
           begin
@@ -1442,9 +1454,9 @@ implementation
             a_paramaddr_ref(list,ref,cgpara1);
             paramanager.freeparaloc(list,cgpara1);
             paramanager.freeparaloc(list,cgpara2);
-            alloccpuregisters(list,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
+            allocallcpuregisters(list);
             a_call_name(list,'FPC_ADDREF');
-            dealloccpuregisters(list,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
+            deallocallcpuregisters(list);
           end;
          cgpara2.done;
          cgpara1.done;
@@ -1503,9 +1515,9 @@ implementation
             paramanager.freeparaloc(list,cgpara1);
             if needrtti then
               paramanager.freeparaloc(list,cgpara2);
-            alloccpuregisters(list,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
+            allocallcpuregisters(list);
             a_call_name(list,decrfunc);
-            dealloccpuregisters(list,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
+            deallocallcpuregisters(list);
           end
          else
           begin
@@ -1516,9 +1528,9 @@ implementation
             a_paramaddr_ref(list,ref,cgpara1);
             paramanager.freeparaloc(list,cgpara1);
             paramanager.freeparaloc(list,cgpara2);
-            alloccpuregisters(list,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
+            allocallcpuregisters(list);
             a_call_name(list,'FPC_DECREF');
-            dealloccpuregisters(list,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
+            deallocallcpuregisters(list);
          end;
         cgpara2.done;
         cgpara1.done;
@@ -1548,11 +1560,9 @@ implementation
               a_paramaddr_ref(list,ref,cgpara1);
               paramanager.freeparaloc(list,cgpara1);
               paramanager.freeparaloc(list,cgpara2);
-              alloccpuregisters(list,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
-              alloccpuregisters(list,R_FPUREGISTER,paramanager.get_volatile_registers_fpu(pocall_default));
+              allocallcpuregisters(list);
               a_call_name(list,'FPC_INITIALIZE');
-              dealloccpuregisters(list,R_FPUREGISTER,paramanager.get_volatile_registers_fpu(pocall_default));
-              dealloccpuregisters(list,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
+              deallocallcpuregisters(list);
            end;
         cgpara1.done;
         cgpara2.done;
@@ -1584,11 +1594,9 @@ implementation
               a_paramaddr_ref(list,ref,cgpara1);
               paramanager.freeparaloc(list,cgpara1);
               paramanager.freeparaloc(list,cgpara2);
-              alloccpuregisters(list,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
-              alloccpuregisters(list,R_FPUREGISTER,paramanager.get_volatile_registers_fpu(pocall_default));
+              allocallcpuregisters(list);
               a_call_name(list,'FPC_FINALIZE');
-              dealloccpuregisters(list,R_FPUREGISTER,paramanager.get_volatile_registers_fpu(pocall_default));
-              dealloccpuregisters(list,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
+              deallocallcpuregisters(list);
            end;
         cgpara1.done;
         cgpara2.done;
@@ -1798,9 +1806,9 @@ implementation
            a_param_reg(list,OS_ADDR,reg,cgpara1);
            paramanager.freeparaloc(list,cgpara1);
            paramanager.freeparaloc(list,cgpara2);
-           alloccpuregisters(list,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
+           allocallcpuregisters(list);
            a_call_name(list,'FPC_CHECK_OBJECT_EXT');
-           dealloccpuregisters(list,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
+           deallocallcpuregisters(list);
          end
         else
          if (cs_check_range in aktlocalswitches) then
@@ -1808,9 +1816,9 @@ implementation
             paramanager.allocparaloc(list,cgpara1);
             a_param_reg(list,OS_ADDR,reg,cgpara1);
             paramanager.freeparaloc(list,cgpara1);
-            alloccpuregisters(list,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
+            allocallcpuregisters(list);
             a_call_name(list,'FPC_CHECK_OBJECT');
-            dealloccpuregisters(list,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
+            deallocallcpuregisters(list);
           end;
         cgpara1.done;
         cgpara2.done;
@@ -1854,11 +1862,9 @@ implementation
         paramanager.allocparaloc(list,cgpara1);
         a_param_reg(list,OS_INT,sizereg,cgpara1);
         paramanager.freeparaloc(list,cgpara1);
-        alloccpuregisters(list,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
-        alloccpuregisters(list,R_FPUREGISTER,paramanager.get_volatile_registers_fpu(pocall_default));
+        allocallcpuregisters(list);
         a_call_name(list,'FPC_GETMEM');
-        dealloccpuregisters(list,R_FPUREGISTER,paramanager.get_volatile_registers_fpu(pocall_default));
-        dealloccpuregisters(list,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
+        deallocallcpuregisters(list);
         cgpara1.done;
         { return the new address }
         a_load_reg_reg(list,OS_ADDR,OS_ADDR,NR_FUNCTION_RESULT_REG,destreg);
@@ -1882,11 +1888,9 @@ implementation
         paramanager.freeparaloc(list,cgpara3);
         paramanager.freeparaloc(list,cgpara2);
         paramanager.freeparaloc(list,cgpara1);
-        alloccpuregisters(list,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
-        alloccpuregisters(list,R_FPUREGISTER,paramanager.get_volatile_registers_fpu(pocall_default));
+        allocallcpuregisters(list);
         a_call_name(list,'FPC_MOVE');
-        dealloccpuregisters(list,R_FPUREGISTER,paramanager.get_volatile_registers_fpu(pocall_default));
-        dealloccpuregisters(list,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
+        deallocallcpuregisters(list);
         cgpara3.done;
         cgpara2.done;
         cgpara1.done;
@@ -1904,11 +1908,9 @@ implementation
         paramanager.allocparaloc(list,cgpara1);
         a_param_loc(list,l,cgpara1);
         paramanager.freeparaloc(list,cgpara1);
-        alloccpuregisters(list,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
-        alloccpuregisters(list,R_FPUREGISTER,paramanager.get_volatile_registers_fpu(pocall_default));
+        allocallcpuregisters(list);
         a_call_name(list,'FPC_FREEMEM');
-        dealloccpuregisters(list,R_FPUREGISTER,paramanager.get_volatile_registers_fpu(pocall_default));
-        dealloccpuregisters(list,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
+        deallocallcpuregisters(list);
         cgpara1.done;
       end;
 

+ 4 - 4
compiler/ncgcal.pas

@@ -1022,9 +1022,9 @@ implementation
             (right=nil) and
             not(po_virtualmethod in procdefinition.procoptions) then
            begin
-              cg.alloccpuregisters(exprasmlist,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
+              cg.allocallcpuregisters(exprasmlist);
               cg.a_call_name(exprasmlist,'FPC_IOCHECK');
-              cg.dealloccpuregisters(exprasmlist,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
+              cg.deallocallcpuregisters(exprasmlist);
            end;
 
          { release temps of paras }
@@ -1172,9 +1172,9 @@ implementation
             (right=nil) and
             not(po_virtualmethod in procdefinition.procoptions) then
            begin
-              cg.alloccpuregisters(exprasmlist,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
+              cg.allocallcpuregisters(exprasmlist);
               cg.a_call_name(exprasmlist,'FPC_IOCHECK');
-              cg.dealloccpuregisters(exprasmlist,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
+              cg.deallocallcpuregisters(exprasmlist);
            end;
 
          { release temps of paras }

+ 34 - 34
compiler/ncgflw.pas

@@ -830,16 +830,16 @@ implementation
               paramanager.freeparaloc(exprasmlist,paraloc1);
               paramanager.freeparaloc(exprasmlist,paraloc2);
               paramanager.freeparaloc(exprasmlist,paraloc3);
-              cg.alloccpuregisters(exprasmlist,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
+              cg.allocallcpuregisters(exprasmlist);
               cg.a_call_name(exprasmlist,'FPC_RAISEEXCEPTION');
-              cg.dealloccpuregisters(exprasmlist,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
+              cg.deallocallcpuregisters(exprasmlist);
            end
          else
            begin
-              cg.alloccpuregisters(exprasmlist,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
+              cg.allocallcpuregisters(exprasmlist);
               cg.a_call_name(exprasmlist,'FPC_POPADDRSTACK');
               cg.a_call_name(exprasmlist,'FPC_RERAISE');
-              cg.dealloccpuregisters(exprasmlist,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
+              cg.deallocallcpuregisters(exprasmlist);
            end;
          paraloc1.done;
          paraloc2.done;
@@ -861,17 +861,17 @@ implementation
       var
         paraloc1 : tcgpara;
       begin
-         cg.alloccpuregisters(exprasmlist,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
+         cg.allocallcpuregisters(exprasmlist);
          cg.a_call_name(exprasmlist,'FPC_POPOBJECTSTACK');
-         cg.dealloccpuregisters(exprasmlist,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
+         cg.deallocallcpuregisters(exprasmlist);
          paraloc1.init;
          paramanager.getintparaloc(pocall_default,1,paraloc1);
          paramanager.allocparaloc(exprasmlist,paraloc1);
          cg.a_param_reg(exprasmlist,OS_ADDR,NR_FUNCTION_RESULT_REG,paraloc1);
          paramanager.freeparaloc(exprasmlist,paraloc1);
-         cg.alloccpuregisters(exprasmlist,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
+         cg.allocallcpuregisters(exprasmlist);
          cg.a_call_name(exprasmlist,'FPC_DESTROYEXCEPTION');
-         cg.dealloccpuregisters(exprasmlist,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
+         cg.deallocallcpuregisters(exprasmlist);
          paraloc1.done;
       end;
 
@@ -983,9 +983,9 @@ implementation
               paramanager.allocparaloc(exprasmlist,paraloc1);
               cg.a_param_const(exprasmlist,OS_ADDR,-1,paraloc1);
               paramanager.freeparaloc(exprasmlist,paraloc1);
-              cg.alloccpuregisters(exprasmlist,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
+              cg.allocallcpuregisters(exprasmlist);
               cg.a_call_name(exprasmlist,'FPC_CATCHES');
-              cg.dealloccpuregisters(exprasmlist,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
+              cg.deallocallcpuregisters(exprasmlist);
               paraloc1.done;
 
               { the destruction of the exception object must be also }
@@ -1005,18 +1005,18 @@ implementation
 
               free_exception(exprasmlist,destroytemps,0,doobjectdestroy,false);
 
-              cg.alloccpuregisters(exprasmlist,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
+              cg.allocallcpuregisters(exprasmlist);
               cg.a_call_name(exprasmlist,'FPC_POPSECONDOBJECTSTACK');
-              cg.dealloccpuregisters(exprasmlist,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
+              cg.deallocallcpuregisters(exprasmlist);
 
               paraloc1.init;
               paramanager.getintparaloc(pocall_default,1,paraloc1);
               paramanager.allocparaloc(exprasmlist,paraloc1);
               cg.a_param_reg(exprasmlist, OS_ADDR, NR_FUNCTION_RESULT_REG, paraloc1);
               paramanager.freeparaloc(exprasmlist,paraloc1);
-              cg.alloccpuregisters(exprasmlist,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
+              cg.allocallcpuregisters(exprasmlist);
               cg.a_call_name(exprasmlist,'FPC_DESTROYEXCEPTION');
-              cg.dealloccpuregisters(exprasmlist,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
+              cg.deallocallcpuregisters(exprasmlist);
               paraloc1.done;
               { we don't need to restore esi here because reraise never }
               { returns                                                 }
@@ -1039,9 +1039,9 @@ implementation
               cg.a_label(exprasmlist,exitexceptlabel);
               { we must also destroy the address frame which guards }
               { exception object                                    }
-              cg.alloccpuregisters(exprasmlist,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
+              cg.allocallcpuregisters(exprasmlist);
               cg.a_call_name(exprasmlist,'FPC_POPADDRSTACK');
-              cg.dealloccpuregisters(exprasmlist,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
+              cg.deallocallcpuregisters(exprasmlist);
               cg.g_exception_reason_load(exprasmlist,excepttemps.reasonbuf);
               cleanupobjectstack;
               cg.a_jmp_always(exprasmlist,oldaktexitlabel);
@@ -1052,9 +1052,9 @@ implementation
               cg.a_label(exprasmlist,breakexceptlabel);
               { we must also destroy the address frame which guards }
               { exception object                                    }
-              cg.alloccpuregisters(exprasmlist,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
+              cg.allocallcpuregisters(exprasmlist);
               cg.a_call_name(exprasmlist,'FPC_POPADDRSTACK');
-              cg.dealloccpuregisters(exprasmlist,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
+              cg.deallocallcpuregisters(exprasmlist);
               cg.g_exception_reason_load(exprasmlist,excepttemps.reasonbuf);
               cleanupobjectstack;
               cg.a_jmp_always(exprasmlist,oldaktbreaklabel);
@@ -1065,9 +1065,9 @@ implementation
               cg.a_label(exprasmlist,continueexceptlabel);
               { we must also destroy the address frame which guards }
               { exception object                                    }
-              cg.alloccpuregisters(exprasmlist,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
+              cg.allocallcpuregisters(exprasmlist);
               cg.a_call_name(exprasmlist,'FPC_POPADDRSTACK');
-              cg.dealloccpuregisters(exprasmlist,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
+              cg.deallocallcpuregisters(exprasmlist);
               cg.g_exception_reason_load(exprasmlist,excepttemps.reasonbuf);
               cleanupobjectstack;
               cg.a_jmp_always(exprasmlist,oldaktcontinuelabel);
@@ -1077,9 +1077,9 @@ implementation
            begin
               { do some magic for exit in the try block }
               cg.a_label(exprasmlist,exittrylabel);
-              cg.alloccpuregisters(exprasmlist,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
+              cg.allocallcpuregisters(exprasmlist);
               cg.a_call_name(exprasmlist,'FPC_POPADDRSTACK');
-              cg.dealloccpuregisters(exprasmlist,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
+              cg.deallocallcpuregisters(exprasmlist);
               cg.g_exception_reason_load(exprasmlist,excepttemps.reasonbuf);
               cg.a_jmp_always(exprasmlist,oldaktexitlabel);
            end;
@@ -1087,9 +1087,9 @@ implementation
          if fc_break in tryflowcontrol then
            begin
               cg.a_label(exprasmlist,breaktrylabel);
-              cg.alloccpuregisters(exprasmlist,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
+              cg.allocallcpuregisters(exprasmlist);
               cg.a_call_name(exprasmlist,'FPC_POPADDRSTACK');
-              cg.dealloccpuregisters(exprasmlist,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
+              cg.deallocallcpuregisters(exprasmlist);
               cg.g_exception_reason_load(exprasmlist,excepttemps.reasonbuf);
               cg.a_jmp_always(exprasmlist,oldaktbreaklabel);
            end;
@@ -1097,9 +1097,9 @@ implementation
          if fc_continue in tryflowcontrol then
            begin
               cg.a_label(exprasmlist,continuetrylabel);
-              cg.alloccpuregisters(exprasmlist,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
+              cg.allocallcpuregisters(exprasmlist);
               cg.a_call_name(exprasmlist,'FPC_POPADDRSTACK');
-              cg.dealloccpuregisters(exprasmlist,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
+              cg.deallocallcpuregisters(exprasmlist);
               cg.g_exception_reason_load(exprasmlist,excepttemps.reasonbuf);
               cg.a_jmp_always(exprasmlist,oldaktcontinuelabel);
            end;
@@ -1154,9 +1154,9 @@ implementation
          paramanager.allocparaloc(exprasmlist,paraloc1);
          cg.a_paramaddr_ref(exprasmlist,href2,paraloc1);
          paramanager.freeparaloc(exprasmlist,paraloc1);
-         cg.alloccpuregisters(exprasmlist,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
+         cg.allocallcpuregisters(exprasmlist);
          cg.a_call_name(exprasmlist,'FPC_CATCHES');
-         cg.dealloccpuregisters(exprasmlist,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
+         cg.deallocallcpuregisters(exprasmlist);
 
          { is it this catch? No. go to next onlabel }
          cg.a_cmp_const_reg_label(exprasmlist,OS_ADDR,OC_EQ,0,NR_FUNCTION_RESULT_REG,nextonlabel);
@@ -1208,18 +1208,18 @@ implementation
 
          free_exception(exprasmlist,excepttemps,0,doobjectdestroy,false);
 
-         cg.alloccpuregisters(exprasmlist,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
+         cg.allocallcpuregisters(exprasmlist);
          cg.a_call_name(exprasmlist,'FPC_POPSECONDOBJECTSTACK');
-         cg.dealloccpuregisters(exprasmlist,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
+         cg.deallocallcpuregisters(exprasmlist);
          paramanager.getintparaloc(pocall_default,1,paraloc1);
          paramanager.allocparaloc(exprasmlist,paraloc1);
          cg.a_param_reg(exprasmlist, OS_ADDR, NR_FUNCTION_RESULT_REG, paraloc1);
          paramanager.freeparaloc(exprasmlist,paraloc1);
-         cg.alloccpuregisters(exprasmlist,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
+         cg.allocallcpuregisters(exprasmlist);
          cg.a_call_name(exprasmlist,'FPC_DESTROYEXCEPTION');
-         cg.dealloccpuregisters(exprasmlist,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
-         { we don't need to restore esi here because reraise never }
-         { returns                                                 }
+         cg.deallocallcpuregisters(exprasmlist);
+         { we don't need to store/restore registers here because reraise never
+           returns                                                             }
          cg.a_call_name(exprasmlist,'FPC_RERAISE');
 
          cg.a_label(exprasmlist,doobjectdestroy);

+ 2 - 2
compiler/ncginl.pas

@@ -231,9 +231,9 @@ implementation
        paramanager.freeparaloc(exprasmlist,paraloc2);
        paramanager.freeparaloc(exprasmlist,paraloc3);
        paramanager.freeparaloc(exprasmlist,paraloc4);
-       cg.alloccpuregisters(exprasmlist,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
+       cg.allocallcpuregisters(exprasmlist);
        cg.a_call_name(exprasmlist,'FPC_ASSERT');
-       cg.dealloccpuregisters(exprasmlist,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
+       cg.deallocallcpuregisters(exprasmlist);
        location_freetemp(exprasmlist,hp3.location);
        location_freetemp(exprasmlist,hp2.location);
        cg.a_label(exprasmlist,truelabel);

+ 2 - 2
compiler/ncgld.pas

@@ -171,9 +171,9 @@ implementation
                        cg.a_param_ref(exprasmlist,OS_ADDR,href,paraloc1);
                        paramanager.freeparaloc(exprasmlist,paraloc1);
                        paraloc1.done;
-                       cg.alloccpuregisters(exprasmlist,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
+                       cg.allocallcpuregisters(exprasmlist);
                        cg.a_call_reg(exprasmlist,hregister);
-                       cg.dealloccpuregisters(exprasmlist,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
+                       cg.deallocallcpuregisters(exprasmlist);
                        cg.getcpuregister(exprasmlist,NR_FUNCTION_RESULT_REG);
                        cg.ungetcpuregister(exprasmlist,NR_FUNCTION_RESULT_REG);
                        hregister:=cg.getaddressregister(exprasmlist);

+ 14 - 14
compiler/ncgmem.pas

@@ -258,9 +258,9 @@ implementation
             cg.a_param_reg(exprasmlist, OS_ADDR,location.reference.base,paraloc1);
             paramanager.freeparaloc(exprasmlist,paraloc1);
             paraloc1.done;
-            cg.alloccpuregisters(exprasmlist,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
+            cg.allocallcpuregisters(exprasmlist);
             cg.a_call_name(exprasmlist,'FPC_CHECKPOINTER');
-            cg.dealloccpuregisters(exprasmlist,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
+            cg.deallocallcpuregisters(exprasmlist);
           end;
       end;
 
@@ -312,9 +312,9 @@ implementation
                 paramanager.allocparaloc(exprasmlist,paraloc1);
                 cg.a_param_reg(exprasmlist, OS_ADDR,location.reference.base,paraloc1);
                 paramanager.freeparaloc(exprasmlist,paraloc1);
-                cg.alloccpuregisters(exprasmlist,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
+                cg.allocallcpuregisters(exprasmlist);
                 cg.a_call_name(exprasmlist,'FPC_CHECKPOINTER');
-                cg.dealloccpuregisters(exprasmlist,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
+                cg.deallocallcpuregisters(exprasmlist);
               end;
            end
          else if is_interfacecom(left.resulttype.def) then
@@ -330,9 +330,9 @@ implementation
                 paramanager.allocparaloc(exprasmlist,paraloc1);
                 cg.a_param_reg(exprasmlist, OS_ADDR,location.reference.base,paraloc1);
                 paramanager.freeparaloc(exprasmlist,paraloc1);
-                cg.alloccpuregisters(exprasmlist,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
+                cg.allocallcpuregisters(exprasmlist);
                 cg.a_call_name(exprasmlist,'FPC_CHECKPOINTER');
-                cg.dealloccpuregisters(exprasmlist,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
+                cg.deallocallcpuregisters(exprasmlist);
               end;
            end
          else
@@ -526,9 +526,9 @@ implementation
                cg.a_param_loc(exprasmlist,left.location,paraloc1);
                paramanager.freeparaloc(exprasmlist,paraloc1);
                paramanager.freeparaloc(exprasmlist,paraloc2);
-               cg.alloccpuregisters(exprasmlist,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
+               cg.allocallcpuregisters(exprasmlist);
                cg.a_call_name(exprasmlist,'FPC_DYNARRAY_RANGECHECK');
-               cg.dealloccpuregisters(exprasmlist,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
+               cg.deallocallcpuregisters(exprasmlist);
             end
          else
            cg.g_rangecheck(exprasmlist,right.location,right.resulttype.def,left.resulttype.def);
@@ -592,9 +592,9 @@ implementation
                    paramanager.allocparaloc(exprasmlist,paraloc1);
                    cg.a_param_reg(exprasmlist,OS_ADDR,location.reference.base,paraloc1);
                    paramanager.freeparaloc(exprasmlist,paraloc1);
-                   cg.alloccpuregisters(exprasmlist,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
+                   cg.allocallcpuregisters(exprasmlist);
                    cg.a_call_name(exprasmlist,'FPC_'+upper(tstringdef(left.resulttype.def).stringtypname)+'_CHECKZERO');
-                   cg.dealloccpuregisters(exprasmlist,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
+                   cg.deallocallcpuregisters(exprasmlist);
                 end;
 
               { in ansistrings/widestrings S[1] is p<w>char(S)[0] !! }
@@ -685,9 +685,9 @@ implementation
                               cg.a_param_ref(exprasmlist,OS_INT,href,paraloc1);
                               paramanager.freeparaloc(exprasmlist,paraloc1);
                               paramanager.freeparaloc(exprasmlist,paraloc2);
-                              cg.alloccpuregisters(exprasmlist,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
+                              cg.allocallcpuregisters(exprasmlist);
                               cg.a_call_name(exprasmlist,'FPC_'+upper(tstringdef(left.resulttype.def).stringtypname)+'_RANGECHECK');
-                              cg.dealloccpuregisters(exprasmlist,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
+                              cg.deallocallcpuregisters(exprasmlist);
                            end;
 
                          st_shortstring:
@@ -824,9 +824,9 @@ implementation
                               cg.a_param_ref(exprasmlist,OS_INT,href,paraloc1);
                               paramanager.freeparaloc(exprasmlist,paraloc1);
                               paramanager.freeparaloc(exprasmlist,paraloc2);
-                              cg.alloccpuregisters(exprasmlist,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
+                              cg.allocallcpuregisters(exprasmlist);
                               cg.a_call_name(exprasmlist,'FPC_'+upper(tstringdef(left.resulttype.def).stringtypname)+'_RANGECHECK');
-                              cg.dealloccpuregisters(exprasmlist,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
+                              cg.deallocallcpuregisters(exprasmlist);
                            end;
                          st_shortstring:
                            begin

+ 14 - 14
compiler/ncgutil.pas

@@ -357,17 +357,17 @@ implementation
         paramanager.freeparaloc(list,paraloc3);
         paramanager.freeparaloc(list,paraloc2);
         paramanager.freeparaloc(list,paraloc1);
-        cg.alloccpuregisters(list,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
+        cg.allocallcpuregisters(list);
         cg.a_call_name(list,'FPC_PUSHEXCEPTADDR');
-        cg.dealloccpuregisters(list,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
+        cg.deallocallcpuregisters(list);
 
         paramanager.getintparaloc(pocall_default,1,paraloc1);
         paramanager.allocparaloc(list,paraloc1);
         cg.a_param_reg(list,OS_ADDR,NR_FUNCTION_RESULT_REG,paraloc1);
         paramanager.freeparaloc(list,paraloc1);
-        cg.alloccpuregisters(list,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
+        cg.allocallcpuregisters(list);
         cg.a_call_name(list,'FPC_SETJMP');
-        cg.dealloccpuregisters(list,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
+        cg.deallocallcpuregisters(list);
 
         cg.g_exception_reason_save(list, t.reasonbuf);
         cg.a_cmp_const_reg_label(list,OS_S32,OC_NE,0,cg.makeregsize(list,NR_FUNCTION_RESULT_REG,OS_S32),exceptlabel);
@@ -379,9 +379,9 @@ implementation
 
     procedure free_exception(list:TAAsmoutput;const t:texceptiontemps;a:aint;endexceptlabel:tasmlabel;onlyfree:boolean);
      begin
-         cg.alloccpuregisters(list,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
+         cg.allocallcpuregisters(list);
          cg.a_call_name(list,'FPC_POPADDRSTACK');
-         cg.dealloccpuregisters(list,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
+         cg.deallocallcpuregisters(list);
 
          if not onlyfree then
           begin
@@ -1583,9 +1583,9 @@ implementation
             if not (target_info.system in [system_i386_win32,system_i386_wdosx]) or
                not (current_procinfo.procdef.proctypeoption=potype_proginit) then
               begin
-                cg.alloccpuregisters(list,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_cdecl));
+                cg.allocallcpuregisters(list);
                 cg.g_profilecode(list);
-                cg.dealloccpuregisters(list,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_cdecl));
+                cg.deallocallcpuregisters(list);
               end;
           end;
 
@@ -1606,15 +1606,15 @@ implementation
               cg.a_paramaddr_ref(list,href,paraloc1);
               paramanager.freeparaloc(list,paraloc2);
               paramanager.freeparaloc(list,paraloc1);
-              cg.alloccpuregisters(list,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_cdecl));
+              cg.allocallcpuregisters(list);
               cg.a_call_name(list,'_monstartup');
-              cg.dealloccpuregisters(list,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_cdecl));
+              cg.deallocallcpuregisters(list);
             end;
 
            { initialize units }
-           cg.alloccpuregisters(list,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
+           cg.allocallcpuregisters(list);
            cg.a_call_name(list,'FPC_INITIALIZEUNITS');
-           cg.dealloccpuregisters(list,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
+           cg.deallocallcpuregisters(list);
 
 {$ifdef GDB}
            if (cs_debuginfo in aktmoduleswitches) then
@@ -1863,9 +1863,9 @@ implementation
         paramanager.allocparaloc(list,paraloc1);
         paramanager.freeparaloc(list,paraloc1);
         { Call the helper }
-        cg.alloccpuregisters(list,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
+        cg.allocallcpuregisters(list);
         cg.a_call_name(list,'FPC_STACKCHECK');
-        cg.dealloccpuregisters(list,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
+        cg.deallocallcpuregisters(list);
         paraloc1.done;
       end;