Bläddra i källkod

* dealloc function result registers, register allocation is now
back at pre-paraloc level

peter 21 år sedan
förälder
incheckning
96a6acbda2
1 ändrade filer med 19 tillägg och 3 borttagningar
  1. 19 3
      compiler/ncgcal.pas

+ 19 - 3
compiler/ncgcal.pas

@@ -505,14 +505,16 @@ implementation
           { ansi/widestrings must be registered, so we can dispose them }
           if resulttype.def.needs_inittable then
             begin
+              if resultparaloc^.loc<>LOC_REGISTER then
+                internalerror(200409261);
               { the FUNCTION_RESULT_REG is already allocated }
+              if getsupreg(resultparaloc^.register)<first_mm_imreg then
+                cg.ungetcpuregister(exprasmlist,resultparaloc^.register);
               if not assigned(funcretnode) then
                 begin
                   location_reset(location,LOC_REFERENCE,OS_ADDR);
                   location.reference:=refcountedtemp;
-                  { a_load_reg_ref may allocate registers! }
                   cg.a_load_reg_ref(exprasmlist,OS_ADDR,OS_ADDR,NR_FUNCTION_RESULT_REG,location.reference);
-                  cg.ungetcpuregister(exprasmlist,NR_FUNCTION_RESULT_REG);
                 end
               else
                 begin
@@ -552,6 +554,8 @@ implementation
 {$ifdef x86}
                        tcgx86(cg).inc_fpu_stack;
 {$else x86}
+                       if getsupreg(resultparaloc^.register)<first_fpu_imreg then
+                         cg.ungetcpuregister(exprasmlist,resultparaloc^.register);
                        hregister:=cg.getfpuregister(exprasmlist,location.size);
                        cg.a_loadfpu_reg_reg(exprasmlist,location.size,location.register,hregister);
                        location.register:=hregister;
@@ -570,8 +574,12 @@ implementation
                              if retloc.loc<>LOC_REGISTER then
                                internalerror(200409141);
                              { the function result registers are already allocated }
+                             if getsupreg(retloc.registerlow)<first_int_imreg then
+                               cg.ungetcpuregister(exprasmlist,retloc.registerlow);
                              location.registerlow:=cg.getintregister(exprasmlist,OS_32);
                              cg.a_load_reg_reg(exprasmlist,OS_32,OS_32,retloc.registerlow,location.registerlow);
+                             if getsupreg(retloc.registerhigh)<first_int_imreg then
+                               cg.ungetcpuregister(exprasmlist,retloc.registerhigh);
                              location.registerhigh:=cg.getintregister(exprasmlist,OS_32);
                              cg.a_load_reg_reg(exprasmlist,OS_32,OS_32,retloc.registerhigh,location.registerhigh);
                            end
@@ -582,6 +590,8 @@ implementation
                                getregister was done for the full register
                                def_cgsize(resulttype.def) is used here because
                                it could be a constructor call }
+                             if getsupreg(resultparaloc^.register)<first_int_imreg then
+                               cg.ungetcpuregister(exprasmlist,resultparaloc^.register);
                              location.register:=cg.getintregister(exprasmlist,def_cgsize(resulttype.def));
                              cg.a_load_reg_reg(exprasmlist,cgsize,def_cgsize(resulttype.def),resultparaloc^.register,location.register);
                            end;
@@ -596,6 +606,8 @@ implementation
                    LOC_MMREGISTER:
                      begin
                        location_reset(location,LOC_MMREGISTER,cgsize);
+                       if getsupreg(resultparaloc^.register)<first_mm_imreg then
+                         cg.ungetcpuregister(exprasmlist,resultparaloc^.register);
                        location.register:=cg.getmmregister(exprasmlist,cgsize);
                        cg.a_loadmm_reg_reg(exprasmlist,cgsize,cgsize,resultparaloc^.register,location.register,mms_movescalar);
                      end;
@@ -1220,7 +1232,11 @@ begin
 end.
 {
   $Log$
-  Revision 1.175  2004-09-25 14:23:54  peter
+  Revision 1.176  2004-09-27 15:15:20  peter
+    * dealloc function result registers, register allocation is now
+      back at pre-paraloc level
+
+  Revision 1.175  2004/09/25 14:23:54  peter
     * ungetregister is now only used for cpuregisters, renamed to
       ungetcpuregister
     * renamed (get|unget)explicitregister(s) to ..cpuregister