Sfoglia il codice sorgente

* ungetregister is now only used for cpuregisters, renamed to
ungetcpuregister
* renamed (get|unget)explicitregister(s) to ..cpuregister
* removed location-release/reference_release

peter 21 anni fa
parent
commit
65c3ba277c
45 ha cambiato i file con 696 aggiunte e 1136 eliminazioni
  1. 10 4
      compiler/alpha/rgcpu.pas
  2. 8 29
      compiler/cg64f32.pas
  3. 81 149
      compiler/cgobj.pas
  4. 15 11
      compiler/i386/cgcpu.pas
  5. 18 45
      compiler/i386/n386add.pas
  6. 7 4
      compiler/i386/n386cal.pas
  7. 18 29
      compiler/i386/n386mat.pas
  8. 7 2
      compiler/i386/n386mem.pas
  9. 15 9
      compiler/m68k/cgcpu.pas
  10. 11 5
      compiler/m68k/n68kmat.pas
  11. 7 31
      compiler/ncgadd.pas
  12. 10 7
      compiler/ncgbas.pas
  13. 34 62
      compiler/ncgcal.pas
  14. 8 12
      compiler/ncgcnv.pas
  15. 42 48
      compiler/ncgflw.pas
  16. 9 12
      compiler/ncginl.pas
  17. 31 63
      compiler/ncgld.pas
  18. 7 11
      compiler/ncgmat.pas
  19. 21 31
      compiler/ncgmem.pas
  20. 8 7
      compiler/ncgopt.pas
  21. 7 29
      compiler/ncgset.pas
  22. 46 108
      compiler/ncgutil.pas
  23. 24 7
      compiler/paramgr.pas
  24. 15 80
      compiler/powerpc/cgcpu.pas
  25. 13 29
      compiler/powerpc/nppcadd.pas
  26. 11 5
      compiler/powerpc/nppccal.pas
  27. 14 33
      compiler/powerpc/nppccnv.pas
  28. 7 4
      compiler/powerpc/nppcinl.pas
  29. 10 17
      compiler/powerpc/nppcmat.pas
  30. 8 3
      compiler/powerpc/nppcset.pas
  31. 13 7
      compiler/powerpc/rgcpu.pas
  32. 7 3
      compiler/regvars.pas
  33. 19 18
      compiler/rgobj.pas
  34. 9 23
      compiler/sparc/cgcpu.pas
  35. 7 13
      compiler/sparc/ncpuadd.pas
  36. 7 5
      compiler/sparc/ncpucnv.pas
  37. 8 9
      compiler/sparc/ncpumat.pas
  38. 32 50
      compiler/x86/cgx86.pas
  39. 13 36
      compiler/x86/nx86add.pas
  40. 8 13
      compiler/x86/nx86cnv.pas
  41. 8 10
      compiler/x86/nx86inl.pas
  42. 7 5
      compiler/x86/nx86mat.pas
  43. 8 22
      compiler/x86/nx86set.pas
  44. 12 11
      compiler/x86_64/nx64add.pas
  45. 16 25
      compiler/x86_64/nx64mat.pas

+ 10 - 4
compiler/alpha/rgcpu.pas

@@ -35,7 +35,7 @@ unit rgcpu;
 
      type
        trgcpu = class(trgobj)
-         function getexplicitregisterint(list: taasmoutput; reg: tregister): tregister; override;
+         function getcpuregisterint(list: taasmoutput; reg: tregister): tregister; override;
          procedure ungetregisterint(list: taasmoutput; reg: tregister); override;
        end;
 
@@ -44,7 +44,7 @@ unit rgcpu;
     uses
       cgobj;
 
-    function trgcpu.getexplicitregisterint(list: taasmoutput; reg: tregister): tregister;
+    function trgcpu.getcpuregisterint(list: taasmoutput; reg: tregister): tregister;
 
       begin
         if reg = R_0 then
@@ -52,7 +52,7 @@ unit rgcpu;
             cg.a_reg_alloc(list,reg);
             result := reg;
           end
-        else result := inherited getexplicitregisterint(list,reg);
+        else result := inherited getcpuregisterint(list,reg);
       end;
 
 
@@ -71,7 +71,13 @@ end.
 
 {
   $Log$
-  Revision 1.2  2004-06-20 08:55:31  florian
+  Revision 1.3  2004-09-25 14:23:54  peter
+    * ungetregister is now only used for cpuregisters, renamed to
+      ungetcpuregister
+    * renamed (get|unget)explicitregister(s) to ..cpuregister
+    * removed location-release/reference_release
+
+  Revision 1.2  2004/06/20 08:55:31  florian
     * logs truncated
 
 }

+ 8 - 29
compiler/cg64f32.pas

@@ -209,7 +209,6 @@ unit cg64f32;
       var
         tmpreg: tregister;
         tmpref: treference;
-        got_scratch: boolean;
       begin
         if target_info.endian = endian_big then
           begin
@@ -217,12 +216,10 @@ unit cg64f32;
             reg.reglo := reg.reghi;
             reg.reghi := tmpreg;
           end;
-        got_scratch:=false;
         tmpref := ref;
         if (tmpref.base=reg.reglo) then
          begin
            tmpreg:=cg.getaddressregister(list);
-           got_scratch:=true;
            cg.a_load_reg_reg(list,OS_ADDR,OS_ADDR,tmpref.base,tmpreg);
            tmpref.base:=tmpreg;
          end
@@ -233,15 +230,12 @@ unit cg64f32;
          if (tmpref.index=reg.reglo) then
           begin
             tmpreg:=cg.getaddressregister(list);
-            got_scratch:=true;
             cg.a_load_reg_reg(list,OS_ADDR,OS_ADDR,tmpref.index,tmpreg);
             tmpref.index:=tmpreg;
           end;
         cg.a_load_ref_reg(list,OS_32,OS_32,tmpref,reg.reglo);
         inc(tmpref.offset,4);
         cg.a_load_ref_reg(list,OS_32,OS_32,tmpref,reg.reghi);
-        if got_scratch then
-          cg.ungetregister(list,tmpreg);
       end;
 
 
@@ -459,8 +453,6 @@ unit cg64f32;
         tempreg.reglo:=cg.getintregister(list,OS_32);
         a_load64_ref_reg(list,ref,tempreg);
         a_op64_reg_reg(list,op,tempreg,reg);
-        cg.ungetregister(list,tempreg.reglo);
-        cg.ungetregister(list,tempreg.reghi);
       end;
 
 
@@ -473,8 +465,6 @@ unit cg64f32;
         a_load64_ref_reg(list,ref,tempreg);
         a_op64_reg_reg(list,op,reg,tempreg);
         a_load64_reg_ref(list,tempreg,ref);
-        cg.ungetregister(list,tempreg.reglo);
-        cg.ungetregister(list,tempreg.reghi);
       end;
 
 
@@ -487,8 +477,6 @@ unit cg64f32;
         a_load64_ref_reg(list,ref,tempreg);
         a_op64_const_reg(list,op,value,tempreg);
         a_load64_reg_ref(list,tempreg,ref);
-        cg.ungetregister(list,tempreg.reglo);
-        cg.ungetregister(list,tempreg.reghi);
       end;
 
 
@@ -569,7 +557,6 @@ unit cg64f32;
         opsize   : tcgsize;
         oldregisterdef: boolean;
         from_signed,to_signed: boolean;
-        got_scratch: boolean;
         temploc : tlocation;
 
       begin
@@ -585,12 +572,10 @@ unit cg64f32;
              if l.loc in [LOC_REGISTER,LOC_CREGISTER] then
                begin
                  hreg := l.registerhigh;
-                 got_scratch := false
                end
              else
                begin
                  hreg:=cg.getintregister(list,OS_32);
-                 got_scratch := true;
                  a_load64high_ref_reg(list,l.reference,hreg);
                end;
              objectlibrary.getlabel(poslabel);
@@ -604,9 +589,6 @@ unit cg64f32;
                  objectlibrary.getlabel(neglabel);
                  cg.a_cmp_const_reg_label(list,OS_32,OC_EQ,-1,hreg,neglabel);
                end;
-             { !!! freeing of register should happen directly after compare! (JM) }
-             if got_scratch then
-               cg.ungetregister(list,hreg);
              { For all other values we have a range check error }
              cg.a_call_name(list,'FPC_RANGEERROR');
 
@@ -635,20 +617,15 @@ unit cg64f32;
                  if l.loc in [LOC_REGISTER,LOC_CREGISTER] then
                    begin
                      hreg := l.registerlow;
-                     got_scratch := false
                    end
                  else
                    begin
                      hreg:=cg.getintregister(list,OS_32);
-                     got_scratch := true;
                      a_load64low_ref_reg(list,l.reference,hreg);
                    end;
                  { get a new neglabel (JM) }
                  objectlibrary.getlabel(neglabel);
                  cg.a_cmp_const_reg_label(list,OS_32,OC_LT,0,hreg,neglabel);
-                 { !!! freeing of register should happen directly after compare! (JM) }
-                 if got_scratch then
-                   cg.ungetregister(list,hreg);
 
                  cg.a_call_name(list,'FPC_RANGEERROR');
 
@@ -688,12 +665,10 @@ unit cg64f32;
                        hreg := l.register;
                        opsize := def_cgsize(fromdef);
                      end;
-                   got_scratch := false;
                  end
                else
                  begin
                    hreg:=cg.getintregister(list,OS_32);
-                   got_scratch := true;
 
                    opsize := def_cgsize(fromdef);
                    if opsize in [OS_64,OS_S64] then
@@ -704,14 +679,12 @@ unit cg64f32;
                objectlibrary.getlabel(poslabel);
                cg.a_cmp_const_reg_label(list,opsize,OC_GTE,0,hreg,poslabel);
 
-               { !!! freeing of register should happen directly after compare! (JM) }
-               if got_scratch then
-                 cg.ungetregister(list,hreg);
                cg.a_call_name(list,'FPC_RANGEERROR');
                cg.a_label(list,poslabel);
              end;
       end;
 
+
     function tcg64f32.optimize64_op_const_reg(list: taasmoutput; var op: topcg; var a : int64; var reg: tregister64): boolean;
       var
         lowvalue, highvalue : longint;
@@ -807,7 +780,13 @@ unit cg64f32;
 end.
 {
   $Log$
-  Revision 1.62  2004-09-21 17:25:12  peter
+  Revision 1.63  2004-09-25 14:23:54  peter
+    * ungetregister is now only used for cpuregisters, renamed to
+      ungetcpuregister
+    * renamed (get|unget)explicitregister(s) to ..cpuregister
+    * removed location-release/reference_release
+
+  Revision 1.62  2004/09/21 17:25:12  peter
     * paraloc branch merged
 
   Revision 1.61.4.2  2004/09/20 20:46:34  peter

+ 81 - 149
compiler/cgobj.pas

@@ -87,19 +87,18 @@ unit cgobj;
           function getflagregister(list:Taasmoutput;size:Tcgsize):Tregister;virtual;abstract;
           {Does the generic cg need SIMD registers, like getmmxregister? Or should
            the cpu specific child cg object have such a method?}
-          procedure ungetregister(list:Taasmoutput;r:Tregister);virtual;
-          procedure ungetreference(list:Taasmoutput;const r:Treference);virtual;
 
           procedure add_reg_instruction(instr:Tai;r:tregister);virtual;
           procedure add_move_instruction(instr:Taicpu);virtual;
 
           function  uses_registers(rt:Tregistertype):boolean;virtual;
           {# Get a specific register.}
-          procedure getexplicitregister(list:Taasmoutput;r:Tregister);virtual;
+          procedure getcpuregister(list:Taasmoutput;r:Tregister);virtual;
+          procedure ungetcpuregister(list:Taasmoutput;r:Tregister);virtual;
           {# Get multiple registers specified.}
-          procedure allocexplicitregisters(list:Taasmoutput;rt:Tregistertype;r:Tcpuregisterset);virtual;
+          procedure alloccpuregisters(list:Taasmoutput;rt:Tregistertype;r:Tcpuregisterset);virtual;
           {# Free multiple registers specified.}
-          procedure deallocexplicitregisters(list:Taasmoutput;rt:Tregistertype;r:Tcpuregisterset);virtual;
+          procedure dealloccpuregisters(list:Taasmoutput;rt:Tregistertype;r:Tcpuregisterset);virtual;
 
           procedure do_register_allocation(list:Taasmoutput;headertai:tai);virtual;
 
@@ -339,11 +338,10 @@ unit cgobj;
 
              @param(source Source reference of copy)
              @param(dest Destination reference of copy)
-             @param(delsource Indicates if the source reference's resources should be freed)
              @param(loadref Is the source reference a pointer to the actual source (TRUE), is it the actual source address (FALSE))
 
           }
-          procedure g_concatcopy(list : taasmoutput;const source,dest : treference;len : aint;delsource,loadref : boolean);virtual; abstract;
+          procedure g_concatcopy(list : taasmoutput;const source,dest : treference;len : aint;loadref : boolean);virtual; abstract;
           {# This should emit the opcode to copy len bytes from the an unaligned source
              to destination, if loadref is true, it assumes that it first must load
              the source address from the memory location where
@@ -353,11 +351,10 @@ unit cgobj;
 
              @param(source Source reference of copy)
              @param(dest Destination reference of copy)
-             @param(delsource Indicates if the source reference's resources should be freed)
              @param(loadref Is the source reference a pointer to the actual source (TRUE), is it the actual source address (FALSE))
 
           }
-          procedure g_concatcopy_unaligned(list : taasmoutput;const source,dest : treference;len : aint;delsource,loadref : boolean);virtual;
+          procedure g_concatcopy_unaligned(list : taasmoutput;const source,dest : treference;len : aint;loadref : boolean);virtual;
           {# This should emit the opcode to a shortrstring from the source
              to destination, if loadref is true, it assumes that it first must load
              the source address from the memory location where
@@ -365,11 +362,10 @@ unit cgobj;
 
              @param(source Source reference of copy)
              @param(dest Destination reference of copy)
-             @param(delsource Indicates if the source reference's resources should be freed)
              @param(loadref Is the source reference a pointer to the actual source (TRUE), is it the actual source address (FALSE))
 
           }
-          procedure g_copyshortstring(list : taasmoutput;const source,dest : treference;len:byte;delsource,loadref : boolean);
+          procedure g_copyshortstring(list : taasmoutput;const source,dest : treference;len:byte;loadref : boolean);
 
           procedure g_incrrefcount(list : taasmoutput;t: tdef; const ref: treference;loadref : boolean);
           procedure g_decrrefcount(list : taasmoutput;t: tdef; const ref: treference;loadref : boolean);
@@ -496,12 +492,9 @@ unit cgobj;
     end;
 {$endif cpu64bit}
 
-    procedure reference_release(list: taasmoutput; const ref : treference);
-
     { tlocation handling }
 
     procedure location_reset(var l : tlocation;lt:TCGLoc;lsize:TCGSize);
-    procedure location_release(list: taasmoutput; const l : tlocation);
     procedure location_freetemp(list: taasmoutput; const l : tlocation);
     procedure location_copy(var destloc:tlocation; const sourceloc : tlocation);
     procedure location_swap(var destloc,sourceloc : tlocation);
@@ -622,44 +615,35 @@ implementation
       end;
 
 
-    procedure tcg.getexplicitregister(list:Taasmoutput;r:Tregister);
+    procedure tcg.getcpuregister(list:Taasmoutput;r:Tregister);
       begin
         if not assigned(rg[getregtype(r)]) then
           internalerror(200312125);
-        rg[getregtype(r)].getexplicitregister(list,r);
+        rg[getregtype(r)].getcpuregister(list,r);
       end;
 
 
-    procedure tcg.ungetregister(list:Taasmoutput;r:Tregister);
+    procedure tcg.ungetcpuregister(list:Taasmoutput;r:Tregister);
       begin
         if not assigned(rg[getregtype(r)]) then
           internalerror(200312126);
-        rg[getregtype(r)].ungetregister(list,r);
+        rg[getregtype(r)].ungetcpuregister(list,r);
       end;
 
 
-    procedure tcg.ungetreference(list:Taasmoutput;const r:Treference);
-      begin
-        if r.base<>NR_NO then
-          ungetregister(list,r.base);
-        if r.index<>NR_NO then
-          ungetregister(list,r.index);
-      end;
-
-
-    procedure tcg.allocexplicitregisters(list:Taasmoutput;rt:Tregistertype;r:Tcpuregisterset);
+    procedure tcg.alloccpuregisters(list:Taasmoutput;rt:Tregistertype;r:Tcpuregisterset);
       begin
         if assigned(rg[rt]) then
-          rg[rt].allocexplicitregisters(list,r)
+          rg[rt].alloccpuregisters(list,r)
         else
           internalerror(200310092);
       end;
 
 
-    procedure tcg.deallocexplicitregisters(list:Taasmoutput;rt:Tregistertype;r:Tcpuregisterset);
+    procedure tcg.dealloccpuregisters(list:Taasmoutput;rt:Tregistertype;r:Tcpuregisterset);
       begin
         if assigned(rg[rt]) then
-          rg[rt].deallocexplicitregisters(list,r)
+          rg[rt].dealloccpuregisters(list,r)
         else
           internalerror(200310093);
       end;
@@ -792,7 +776,7 @@ implementation
                  ref.offset:=paraloc.location^.reference.offset;
                  { use concatcopy, because it can also be a float which fails when
                    load_ref_ref is used }
-                 g_concatcopy(list,r,ref,tcgsize2size[size],false,false);
+                 g_concatcopy(list,r,ref,tcgsize2size[size],false);
               end
             else
               internalerror(2002071004);
@@ -823,7 +807,6 @@ implementation
       begin
          hr:=getaddressregister(list);
          a_loadaddr_ref_reg(list,r,hr);
-         ungetregister(list,hr);
          a_param_reg(list,OS_ADDR,hr,paraloc);
       end;
 
@@ -836,7 +819,7 @@ implementation
          if not(paraloc.location^.loc in [LOC_REFERENCE,LOC_CREFERENCE]) then
            internalerror(2003010901);
          reference_reset_base(ref,paraloc.location^.reference.index,paraloc.location^.reference.offset);
-         g_concatcopy(list,r,ref,size,false,false);
+         g_concatcopy(list,r,ref,size,false);
       end;
 
 
@@ -852,8 +835,8 @@ implementation
                 begin
                   if getsupreg(paraloc.register)<first_int_imreg then
                     begin
-                      getexplicitregister(list,paraloc.register);
-                      ungetregister(list,paraloc.register);
+                      getcpuregister(list,paraloc.register);
+                      ungetcpuregister(list,paraloc.register);
                     end;
                   a_load_reg_ref(list,paraloc.size,paraloc.size,paraloc.register,ref);
                 end;
@@ -862,8 +845,8 @@ implementation
                 begin
                   if getsupreg(paraloc.register)<first_mm_imreg then
                     begin
-                      getexplicitregister(list,paraloc.register);
-                      ungetregister(list,paraloc.register);
+                      getcpuregister(list,paraloc.register);
+                      ungetcpuregister(list,paraloc.register);
                     end;
                   a_loadmm_reg_ref(list,paraloc.size,paraloc.size,paraloc.register,ref,shuffle);
                 end;
@@ -872,8 +855,8 @@ implementation
                 begin
                   if getsupreg(paraloc.register)<first_fpu_imreg then
                     begin
-                      getexplicitregister(list,paraloc.register);
-                      ungetregister(list,paraloc.register);
+                      getcpuregister(list,paraloc.register);
+                      ungetcpuregister(list,paraloc.register);
                     end;
                   a_loadfpu_reg_ref(list,paraloc.size,paraloc.register,ref);
                 end;
@@ -882,7 +865,7 @@ implementation
                   reference_reset_base(href,paraloc.reference.index,paraloc.reference.offset);
                   { use concatcopy, because it can also be a float which fails when
                     load_ref_ref is used }
-                  g_concatcopy(list,href,ref,tcgsize2size[paraloc.size],false,false);
+                  g_concatcopy(list,href,ref,tcgsize2size[paraloc.size],false);
                 end;
               else
                 internalerror(2002081302);
@@ -913,8 +896,8 @@ implementation
             begin
               if getsupreg(paraloc.location^.register)<first_int_imreg then
                 begin
-                  getexplicitregister(list,paraloc.location^.register);
-                  ungetregister(list,paraloc.location^.register);
+                  getcpuregister(list,paraloc.location^.register);
+                  ungetcpuregister(list,paraloc.location^.register);
                 end;
               a_load_reg_reg(list,paraloc.location^.size,paraloc.location^.size,paraloc.location^.register,reg)
             end;
@@ -923,8 +906,8 @@ implementation
             begin
               if getsupreg(paraloc.location^.register)<first_fpu_imreg then
                 begin
-                  getexplicitregister(list,paraloc.location^.register);
-                  ungetregister(list,paraloc.location^.register);
+                  getcpuregister(list,paraloc.location^.register);
+                  ungetcpuregister(list,paraloc.location^.register);
                 end;
               a_loadfpu_reg_reg(list,paraloc.location^.size,paraloc.location^.register,reg);
             end;
@@ -933,8 +916,8 @@ implementation
             begin
               if getsupreg(paraloc.location^.register)<first_mm_imreg then
                 begin
-                  getexplicitregister(list,paraloc.location^.register);
-                  ungetregister(list,paraloc.location^.register);
+                  getcpuregister(list,paraloc.location^.register);
+                  ungetcpuregister(list,paraloc.location^.register);
                 end;
               a_loadmm_reg_reg(list,paraloc.location^.size,paraloc.location^.size,paraloc.location^.register,reg,shuffle);
             end;
@@ -964,7 +947,6 @@ implementation
         tmpreg:=getintregister(list,tosize);
         a_load_ref_reg(list,fromsize,tosize,sref,tmpreg);
         a_load_reg_ref(list,tosize,tosize,tmpreg,dref);
-        ungetregister(list,tmpreg);
       end;
 
 
@@ -975,7 +957,6 @@ implementation
         tmpreg:=getintregister(list,size);
         a_load_const_reg(list,size,a,tmpreg);
         a_load_reg_ref(list,size,size,tmpreg,ref);
-        ungetregister(list,tmpreg);
       end;
 
 
@@ -1146,7 +1127,7 @@ implementation
             begin
               reference_reset_base(href,paraloc.location^.reference.index,paraloc.location^.reference.offset);
               { concatcopy should choose the best way to copy the data }
-              g_concatcopy(list,ref,href,tcgsize2size[size],false,false);
+              g_concatcopy(list,ref,href,tcgsize2size[size],false);
             end
           else
             internalerror(200402201);
@@ -1162,7 +1143,6 @@ implementation
         a_load_ref_reg(list,size,size,ref,tmpreg);
         a_op_const_reg(list,op,size,a,tmpreg);
         a_load_reg_ref(list,size,size,tmpreg,ref);
-        ungetregister(list,tmpreg);
       end;
 
 
@@ -1187,7 +1167,6 @@ implementation
         a_load_ref_reg(list,size,size,ref,tmpreg);
         a_op_reg_reg(list,op,size,reg,tmpreg);
         a_load_reg_ref(list,size,size,tmpreg,ref);
-        ungetregister(list,tmpreg);
       end;
 
 
@@ -1209,7 +1188,6 @@ implementation
               tmpreg:=getintregister(list,size);
               a_load_ref_reg(list,size,size,ref,tmpreg);
               a_op_reg_reg(list,op,size,tmpreg,reg);
-              ungetregister(list,tmpreg);
             end;
         end;
       end;
@@ -1243,7 +1221,6 @@ implementation
               tmpreg:=getintregister(list,loc.size);
               a_load_ref_reg(list,loc.size,loc.size,ref,tmpreg);
               a_op_reg_ref(list,op,loc.size,tmpreg,loc.reference);
-              ungetregister(list,tmpreg);
             end;
           else
             internalerror(200109061);
@@ -1274,7 +1251,6 @@ implementation
             a_load_reg_reg(list,size,size,src2,tmpreg);
             a_op_reg_reg(list,op,size,src1,tmpreg);
             a_load_reg_reg(list,size,size,tmpreg,dst);
-            ungetregister(list,tmpreg);
           end;
       end;
 
@@ -1285,14 +1261,13 @@ implementation
 
       var
         tmpreg: tregister;
-
       begin
         tmpreg:=getintregister(list,size);
         a_load_ref_reg(list,size,size,ref,tmpreg);
         a_cmp_const_reg_label(list,size,cmp_op,a,tmpreg,l);
-        ungetregister(list,tmpreg);
       end;
 
+
     procedure tcg.a_cmp_const_loc_label(list : taasmoutput;size : tcgsize;cmp_op : topcmp;a : aint;const loc : tlocation;
       l : tasmlabel);
 
@@ -1315,7 +1290,6 @@ implementation
         tmpreg:=getintregister(list,size);
         a_load_ref_reg(list,size,size,ref,tmpreg);
         a_cmp_reg_reg_label(list,size,cmp_op,tmpreg,reg,l);
-        ungetregister(list,tmpreg);
       end;
 
 
@@ -1326,7 +1300,6 @@ implementation
         tmpreg:=getintregister(list,size);
         a_load_ref_reg(list,size,size,ref,tmpreg);
         a_cmp_reg_reg_label(list,size,cmp_op,reg,tmpreg,l);
-        ungetregister(list,tmpreg);
       end;
 
 
@@ -1360,7 +1333,6 @@ implementation
               tmpreg:=getintregister(list,size);
               a_load_ref_reg(list,size,size,loc.reference,tmpreg);
               a_cmp_ref_reg_label(list,size,cmp_op,ref,tmpreg,l);
-              ungetregister(list,tmpreg);
             end
           else
             internalerror(200109061);
@@ -1429,7 +1401,6 @@ implementation
            end
          else
            a_parammm_reg(list,paraloc.location^.size,hr,paraloc,shuffle);
-         ungetregister(list,hr);
       end;
 
 
@@ -1461,7 +1432,6 @@ implementation
            end
          else
            a_opmm_reg_reg(list,op,size,hr,reg,shuffle);
-         ungetregister(list,hr);
       end;
 
 
@@ -1484,7 +1454,6 @@ implementation
              a_opmm_reg_reg(list,op,size,reg,hr,shuffle);
              a_loadmm_reg_ref(list,size,size,hr,ref,shuffle);
            end;
-         ungetregister(list,hr);
       end;
 
 
@@ -1501,7 +1470,7 @@ implementation
       end;
 
 
-    procedure tcg.g_concatcopy_unaligned(list : taasmoutput;const source,dest : treference;len : aint;delsource,loadref : boolean);
+    procedure tcg.g_concatcopy_unaligned(list : taasmoutput;const source,dest : treference;len : aint;loadref : boolean);
       var
         paraloc1,paraloc2,paraloc3 : TCGPara;
       begin
@@ -1520,23 +1489,21 @@ implementation
           a_param_ref(list,OS_ADDR,source,paraloc1)
         else
           a_paramaddr_ref(list,source,paraloc1);
-        if delsource then
-         reference_release(list,source);
         paramanager.freeparaloc(list,paraloc3);
         paramanager.freeparaloc(list,paraloc2);
         paramanager.freeparaloc(list,paraloc1);
-        allocexplicitregisters(list,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
-        allocexplicitregisters(list,R_FPUREGISTER,paramanager.get_volatile_registers_fpu(pocall_default));
+        alloccpuregisters(list,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
+        alloccpuregisters(list,R_FPUREGISTER,paramanager.get_volatile_registers_fpu(pocall_default));
         a_call_name(list,'FPC_MOVE');
-        deallocexplicitregisters(list,R_FPUREGISTER,paramanager.get_volatile_registers_fpu(pocall_default));
-        deallocexplicitregisters(list,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
+        dealloccpuregisters(list,R_FPUREGISTER,paramanager.get_volatile_registers_fpu(pocall_default));
+        dealloccpuregisters(list,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
         paraloc3.done;
         paraloc2.done;
         paraloc1.done;
       end;
 
 
-    procedure tcg.g_copyshortstring(list : taasmoutput;const source,dest : treference;len:byte;delsource,loadref : boolean);
+    procedure tcg.g_copyshortstring(list : taasmoutput;const source,dest : treference;len:byte;loadref : boolean);
       var
         paraloc1,paraloc2,paraloc3 : TCGPara;
       begin
@@ -1553,18 +1520,16 @@ implementation
           a_param_ref(list,OS_ADDR,source,paraloc2)
         else
           a_paramaddr_ref(list,source,paraloc2);
-        if delsource then
-         reference_release(list,source);
         paramanager.allocparaloc(list,paraloc1);
         a_param_const(list,OS_INT,len,paraloc1);
         paramanager.freeparaloc(list,paraloc3);
         paramanager.freeparaloc(list,paraloc2);
         paramanager.freeparaloc(list,paraloc1);
-        allocexplicitregisters(list,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
-        allocexplicitregisters(list,R_FPUREGISTER,paramanager.get_volatile_registers_fpu(pocall_default));
+        alloccpuregisters(list,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
+        alloccpuregisters(list,R_FPUREGISTER,paramanager.get_volatile_registers_fpu(pocall_default));
         a_call_name(list,'FPC_SHORTSTR_ASSIGN');
-        deallocexplicitregisters(list,R_FPUREGISTER,paramanager.get_volatile_registers_fpu(pocall_default));
-        deallocexplicitregisters(list,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
+        dealloccpuregisters(list,R_FPUREGISTER,paramanager.get_volatile_registers_fpu(pocall_default));
+        dealloccpuregisters(list,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
         paraloc3.done;
         paraloc2.done;
         paraloc1.done;
@@ -1613,9 +1578,9 @@ implementation
             paramanager.allocparaloc(list,paraloc1);
             a_param_ref(list,OS_ADDR,ref,paraloc1);
             paramanager.freeparaloc(list,paraloc1);
-            allocexplicitregisters(list,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
+            alloccpuregisters(list,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
             a_call_name(list,incrfunc);
-            deallocexplicitregisters(list,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
+            dealloccpuregisters(list,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
           end
          else
           begin
@@ -1629,9 +1594,9 @@ implementation
               a_paramaddr_ref(list,ref,paraloc1);
             paramanager.freeparaloc(list,paraloc1);
             paramanager.freeparaloc(list,paraloc2);
-            allocexplicitregisters(list,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
+            alloccpuregisters(list,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
             a_call_name(list,'FPC_ADDREF');
-            deallocexplicitregisters(list,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
+            dealloccpuregisters(list,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
           end;
          paraloc2.done;
          paraloc1.done;
@@ -1694,9 +1659,9 @@ implementation
             paramanager.freeparaloc(list,paraloc1);
             if needrtti then
               paramanager.freeparaloc(list,paraloc2);
-            allocexplicitregisters(list,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
+            alloccpuregisters(list,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
             a_call_name(list,decrfunc);
-            deallocexplicitregisters(list,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
+            dealloccpuregisters(list,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
           end
          else
           begin
@@ -1710,9 +1675,9 @@ implementation
               a_paramaddr_ref(list,ref,paraloc1);
             paramanager.freeparaloc(list,paraloc1);
             paramanager.freeparaloc(list,paraloc2);
-            allocexplicitregisters(list,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
+            alloccpuregisters(list,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
             a_call_name(list,'FPC_DECREF');
-            deallocexplicitregisters(list,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
+            dealloccpuregisters(list,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
          end;
         { Temp locations need always to be reset to 0 }
         if tg.istemp(ref) then
@@ -1723,7 +1688,6 @@ implementation
                 a_load_ref_reg(list,OS_ADDR,OS_ADDR,ref,hreg);
                 reference_reset_base(href,hreg,0);
                 a_load_const_ref(list,OS_ADDR,0,href);
-                ungetregister(list,hreg);
               end
             else
               a_load_const_ref(list,OS_ADDR,0,ref);
@@ -1759,11 +1723,11 @@ implementation
                 a_paramaddr_ref(list,ref,paraloc1);
               paramanager.freeparaloc(list,paraloc1);
               paramanager.freeparaloc(list,paraloc2);
-              allocexplicitregisters(list,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
-              allocexplicitregisters(list,R_FPUREGISTER,paramanager.get_volatile_registers_fpu(pocall_default));
+              alloccpuregisters(list,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
+              alloccpuregisters(list,R_FPUREGISTER,paramanager.get_volatile_registers_fpu(pocall_default));
               a_call_name(list,'FPC_INITIALIZE');
-              deallocexplicitregisters(list,R_FPUREGISTER,paramanager.get_volatile_registers_fpu(pocall_default));
-              deallocexplicitregisters(list,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
+              dealloccpuregisters(list,R_FPUREGISTER,paramanager.get_volatile_registers_fpu(pocall_default));
+              dealloccpuregisters(list,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
            end;
         paraloc1.done;
         paraloc2.done;
@@ -1794,7 +1758,6 @@ implementation
                      a_load_ref_reg(list,OS_ADDR,OS_ADDR,ref,hreg);
                      reference_reset_base(href,hreg,0);
                      a_load_const_ref(list,OS_ADDR,0,href);
-                     ungetregister(list,hreg);
                    end
                  else
                    a_load_const_ref(list,OS_ADDR,0,ref);
@@ -1812,11 +1775,11 @@ implementation
                 a_paramaddr_ref(list,ref,paraloc1);
               paramanager.freeparaloc(list,paraloc1);
               paramanager.freeparaloc(list,paraloc2);
-              allocexplicitregisters(list,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
-              allocexplicitregisters(list,R_FPUREGISTER,paramanager.get_volatile_registers_fpu(pocall_default));
+              alloccpuregisters(list,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
+              alloccpuregisters(list,R_FPUREGISTER,paramanager.get_volatile_registers_fpu(pocall_default));
               a_call_name(list,'FPC_FINALIZE');
-              deallocexplicitregisters(list,R_FPUREGISTER,paramanager.get_volatile_registers_fpu(pocall_default));
-              deallocexplicitregisters(list,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
+              dealloccpuregisters(list,R_FPUREGISTER,paramanager.get_volatile_registers_fpu(pocall_default));
+              dealloccpuregisters(list,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
            end;
         paraloc1.done;
         paraloc2.done;
@@ -1954,8 +1917,6 @@ implementation
         a_op_const_reg(list,OP_SUB,OS_INT,aint(lto),hreg);
         objectlibrary.getlabel(neglabel);
         a_cmp_const_reg_label(list,OS_INT,OC_BE,aint(hto-lto),hreg,neglabel);
-        { !!! should happen right after the compare (JM) }
-        ungetregister(list,hreg);
         a_call_name(list,'FPC_RANGEERROR');
         a_label(list,neglabel);
       end;
@@ -1969,7 +1930,6 @@ implementation
         tmpreg:=getintregister(list,size);
         g_flags2reg(list,size,f,tmpreg);
         a_load_reg_ref(list,size,size,tmpreg,ref);
-        ungetregister(list,tmpreg);
       end;
 
 
@@ -2013,9 +1973,9 @@ implementation
            a_param_reg(list,OS_ADDR,reg,paraloc1);
            paramanager.freeparaloc(list,paraloc1);
            paramanager.freeparaloc(list,paraloc2);
-           allocexplicitregisters(list,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
+           alloccpuregisters(list,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
            a_call_name(list,'FPC_CHECK_OBJECT_EXT');
-           deallocexplicitregisters(list,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
+           dealloccpuregisters(list,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
          end
         else
          if (cs_check_range in aktlocalswitches) then
@@ -2023,9 +1983,9 @@ implementation
             paramanager.allocparaloc(list,paraloc1);
             a_param_reg(list,OS_ADDR,reg,paraloc1);
             paramanager.freeparaloc(list,paraloc1);
-            allocexplicitregisters(list,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
+            alloccpuregisters(list,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
             a_call_name(list,'FPC_CHECK_OBJECT');
-            deallocexplicitregisters(list,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
+            dealloccpuregisters(list,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
           end;
         paraloc1.done;
         paraloc2.done;
@@ -2062,11 +2022,11 @@ implementation
         paramanager.allocparaloc(list,paraloc1);
         a_param_reg(list,OS_INT,sizereg,paraloc1);
         paramanager.freeparaloc(list,paraloc1);
-        allocexplicitregisters(list,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
-        allocexplicitregisters(list,R_FPUREGISTER,paramanager.get_volatile_registers_fpu(pocall_default));
+        alloccpuregisters(list,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
+        alloccpuregisters(list,R_FPUREGISTER,paramanager.get_volatile_registers_fpu(pocall_default));
         a_call_name(list,'FPC_GETMEM');
-        deallocexplicitregisters(list,R_FPUREGISTER,paramanager.get_volatile_registers_fpu(pocall_default));
-        deallocexplicitregisters(list,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
+        dealloccpuregisters(list,R_FPUREGISTER,paramanager.get_volatile_registers_fpu(pocall_default));
+        dealloccpuregisters(list,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
         a_load_reg_reg(list,OS_ADDR,OS_ADDR,NR_FUNCTION_RESULT_REG,destreg);
         a_load_reg_ref(list,OS_ADDR,OS_ADDR,NR_FUNCTION_RESULT_REG,ref);
         paraloc1.done;
@@ -2090,19 +2050,14 @@ implementation
         paramanager.freeparaloc(list,paraloc3);
         paramanager.freeparaloc(list,paraloc2);
         paramanager.freeparaloc(list,paraloc1);
-        allocexplicitregisters(list,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
-        allocexplicitregisters(list,R_FPUREGISTER,paramanager.get_volatile_registers_fpu(pocall_default));
+        alloccpuregisters(list,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
+        alloccpuregisters(list,R_FPUREGISTER,paramanager.get_volatile_registers_fpu(pocall_default));
         a_call_name(list,'FPC_MOVE');
-        deallocexplicitregisters(list,R_FPUREGISTER,paramanager.get_volatile_registers_fpu(pocall_default));
-        deallocexplicitregisters(list,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
+        dealloccpuregisters(list,R_FPUREGISTER,paramanager.get_volatile_registers_fpu(pocall_default));
+        dealloccpuregisters(list,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
         paraloc3.done;
         paraloc2.done;
         paraloc1.done;
-
-        { release used registers }
-        ungetregister(list,sizereg);
-        ungetregister(list,sourcereg);
-        ungetregister(list,destreg);
       end;
 
 
@@ -2117,11 +2072,11 @@ implementation
         paramanager.allocparaloc(list,paraloc1);
         a_param_ref(list,OS_ADDR,ref,paraloc1);
         paramanager.freeparaloc(list,paraloc1);
-        allocexplicitregisters(list,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
-        allocexplicitregisters(list,R_FPUREGISTER,paramanager.get_volatile_registers_fpu(pocall_default));
+        alloccpuregisters(list,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
+        alloccpuregisters(list,R_FPUREGISTER,paramanager.get_volatile_registers_fpu(pocall_default));
         a_call_name(list,'FPC_FREEMEM');
-        deallocexplicitregisters(list,R_FPUREGISTER,paramanager.get_volatile_registers_fpu(pocall_default));
-        deallocexplicitregisters(list,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
+        dealloccpuregisters(list,R_FPUREGISTER,paramanager.get_volatile_registers_fpu(pocall_default));
+        dealloccpuregisters(list,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
         paraloc1.done;
       end;
 
@@ -2187,16 +2142,6 @@ implementation
 {$endif cpu64bit}
 
 
-{****************************************************************************
-                                  TReference
-****************************************************************************}
-
-    procedure reference_release(list: taasmoutput; const ref : treference);
-      begin
-        cg.ungetreference(list,ref);
-      end;
-
-
 {****************************************************************************
                                   TLocation
 ****************************************************************************}
@@ -2213,25 +2158,6 @@ implementation
       end;
 
 
-    procedure location_release(list: taasmoutput; const l : tlocation);
-      begin
-        case l.loc of
-          LOC_REGISTER,LOC_CREGISTER :
-            begin
-              cg.ungetregister(list,l.register);
-{$ifndef cpu64bit}
-              if l.size in [OS_64,OS_S64] then
-               cg.ungetregister(list,l.registerhigh);
-{$endif cpu64bit}
-            end;
-          LOC_FPUREGISTER,LOC_CFPUREGISTER :
-            cg.ungetregister(list,l.register);
-          LOC_CREFERENCE,LOC_REFERENCE :
-            cg.ungetreference(list, l.reference);
-        end;
-      end;
-
-
     procedure location_freetemp(list:taasmoutput; const l : tlocation);
       begin
         if (l.loc in [LOC_REFERENCE,LOC_CREFERENCE]) then
@@ -2266,7 +2192,13 @@ finalization
 end.
 {
   $Log$
-  Revision 1.169  2004-09-21 17:25:12  peter
+  Revision 1.170  2004-09-25 14:23:54  peter
+    * ungetregister is now only used for cpuregisters, renamed to
+      ungetcpuregister
+    * renamed (get|unget)explicitregister(s) to ..cpuregister
+    * removed location-release/reference_release
+
+  Revision 1.169  2004/09/21 17:25:12  peter
     * paraloc branch merged
 
   Revision 1.168.4.4  2004/09/20 20:45:57  peter

+ 15 - 11
compiler/i386/cgcpu.pas

@@ -137,7 +137,6 @@ unit cgcpu;
                   tmpreg:=getintregister(list,pushsize);
                   a_load_ref_reg(list,size,pushsize,r,tmpreg);
                   list.concat(taicpu.op_reg(A_PUSH,TCgsize2opsize[pushsize],tmpreg));
-                  ungetregister(list,tmpreg);
                 end
               else
                 list.concat(taicpu.op_ref(A_PUSH,TCgsize2opsize[pushsize],r));
@@ -179,7 +178,6 @@ unit cgcpu;
                     begin
                       tmpreg:=getaddressregister(list);
                       a_loadaddr_ref_reg(list,r,tmpreg);
-                      ungetregister(list,tmpreg);
                       list.concat(taicpu.op_reg(A_PUSH,opsize,tmpreg));
                     end;
                 end
@@ -310,7 +308,7 @@ unit cgcpu;
 {$endif}
       begin
         { get stack space }
-        getexplicitregister(list,NR_EDI);
+        getcpuregister(list,NR_EDI);
         list.concat(Taicpu.op_ref_reg(A_MOV,S_L,lenref,NR_EDI));
         list.concat(Taicpu.op_reg(A_INC,S_L,NR_EDI));
         if (elesize<>1) then
@@ -337,9 +335,9 @@ unit cgcpu;
 
              a_label(list,ok);
              list.concat(Taicpu.op_reg_reg(A_SUB,S_L,NR_EDI,NR_ESP));
-             ungetregister(list,NR_EDI);
+             ungetcpuregister(list,NR_EDI);
              { now reload EDI }
-             getexplicitregister(list,NR_EDI);
+             getcpuregister(list,NR_EDI);
              list.concat(Taicpu.op_ref_reg(A_MOV,S_L,lenref,NR_EDI));
              list.concat(Taicpu.op_reg(A_INC,S_L,NR_EDI));
 
@@ -360,8 +358,8 @@ unit cgcpu;
         a_load_reg_reg(list,OS_INT,OS_INT,NR_ESP,NR_EDI);
 
         { Allocate other registers }
-        getexplicitregister(list,NR_ECX);
-        getexplicitregister(list,NR_ESI);
+        getcpuregister(list,NR_ECX);
+        getcpuregister(list,NR_ESI);
 
         { load count }
         a_load_ref_reg(list,OS_INT,OS_INT,lenref,NR_ECX);
@@ -397,9 +395,9 @@ unit cgcpu;
           S_W : list.concat(Taicpu.Op_none(A_MOVSW,S_NO));
           S_L : list.concat(Taicpu.Op_none(A_MOVSD,S_NO));
         end;
-        ungetregister(list,NR_EDI);
-        ungetregister(list,NR_ECX);
-        ungetregister(list,NR_ESI);
+        ungetcpuregister(list,NR_EDI);
+        ungetcpuregister(list,NR_ECX);
+        ungetcpuregister(list,NR_ESI);
 
         { patch the new address }
         a_load_reg_ref(list,OS_INT,OS_INT,NR_ESP,ref);
@@ -558,7 +556,13 @@ begin
 end.
 {
   $Log$
-  Revision 1.52  2004-09-21 17:25:12  peter
+  Revision 1.53  2004-09-25 14:23:54  peter
+    * ungetregister is now only used for cpuregisters, renamed to
+      ungetcpuregister
+    * renamed (get|unget)explicitregister(s) to ..cpuregister
+    * removed location-release/reference_release
+
+  Revision 1.52  2004/09/21 17:25:12  peter
     * paraloc branch merged
 
   Revision 1.51.4.1  2004/08/31 20:43:06  peter

+ 18 - 45
compiler/i386/n386add.pas

@@ -125,12 +125,8 @@ interface
         left_must_be_reg(opsize,noswap);
 {        emit_generic_code(op,opsize,true,extra_not,false);}
         location_freetemp(exprasmlist,right.location);
-        location_release(exprasmlist,right.location);
         if cmpop then
-         begin
-           location_freetemp(exprasmlist,left.location);
-           location_release(exprasmlist,left.location);
-         end;
+          location_freetemp(exprasmlist,left.location);
         set_result_location(cmpop,true);
       end;
 {$endif SUPPORT_MMX}
@@ -227,7 +223,6 @@ interface
                 right.location.register64,
                 left.location.register64);
             end;
-           location_release(exprasmlist,right.location);
          end
         else
          begin
@@ -242,23 +237,13 @@ interface
               { the carry flag is still ok }
               emit_reg_reg(op2,opsize,left.location.registerhigh,r);
               emit_reg_reg(A_MOV,opsize,r,left.location.registerhigh);
-              cg.ungetregister(exprasmlist,r);
-              if right.location.loc<>LOC_CREGISTER then
-               begin
-                 location_freetemp(exprasmlist,right.location);
-                 location_release(exprasmlist,right.location);
-               end;
             end
            else
             begin
               cg64.a_op64_loc_reg(exprasmlist,op,right.location,
                 left.location.register64);
-              if (right.location.loc<>LOC_CREGISTER) then
-               begin
-                 location_freetemp(exprasmlist,right.location);
-                 location_release(exprasmlist,right.location);
-               end;
             end;
+          location_freetemp(exprasmlist,right.location);
          end;
 
         { only in case of overflow operations }
@@ -398,7 +383,6 @@ interface
            firstjmp64bitcmp;
            emit_reg_reg(A_CMP,S_L,right.location.registerlow,left.location.registerlow);
            secondjmp64bitcmp;
-           location_release(exprasmlist,right.location);
          end
         else
          begin
@@ -421,7 +405,6 @@ interface
                  secondjmp64bitcmp;
                  cg.a_jmp_always(exprasmlist,falselabel);
                  location_freetemp(exprasmlist,right.location);
-                 location_release(exprasmlist,right.location);
                end;
              LOC_CONSTANT :
                begin
@@ -435,11 +418,7 @@ interface
            end;
          end;
 
-        if (left.location.loc<>LOC_CREGISTER) then
-         begin
-           location_freetemp(exprasmlist,left.location);
-           location_release(exprasmlist,left.location);
-         end;
+        location_freetemp(exprasmlist,left.location);
 
         { we have LOC_JUMP as result }
         location_reset(location,LOC_JUMP,OS_NO)
@@ -560,8 +539,6 @@ interface
                  if not(left.location.loc in [LOC_REFERENCE,LOC_CREFERENCE]) then
                   internalerror(200203245);
 
-                 location_release(exprasmlist,left.location);
-
                  hregister:=cg.getmmxregister(exprasmlist,OS_M64);
                  emit_ref_reg(A_MOVQ,S_NO,left.location.reference,hregister);
                end;
@@ -588,7 +565,6 @@ interface
                begin
                  if not(left.location.loc in [LOC_REFERENCE,LOC_CREFERENCE]) then
                   internalerror(200203247);
-                 location_release(exprasmlist,right.location);
                  hreg:=cg.getmmxregister(exprasmlist,OS_M64);
                  emit_ref_reg(A_MOVQ,S_NO,right.location.reference,hreg);
                  emit_reg_reg(op,S_NO,left.location.register,hreg);
@@ -605,7 +581,6 @@ interface
                  if not(right.location.loc in [LOC_REFERENCE,LOC_CREFERENCE]) then
                   internalerror(200203246);
                  emit_ref_reg(op,S_NO,right.location.reference,left.location.register);
-                 location_release(exprasmlist,right.location);
                end;
             end;
           end
@@ -625,12 +600,9 @@ interface
           end;
 
         location_freetemp(exprasmlist,right.location);
-        location_release(exprasmlist,right.location);
         if cmpop then
-         begin
-           location_freetemp(exprasmlist,left.location);
-           location_release(exprasmlist,left.location);
-         end;
+          location_freetemp(exprasmlist,left.location);
+
         set_result_location(cmpop,true);
       end;
 {$endif SUPPORT_MMX}
@@ -652,16 +624,12 @@ interface
        and free the location.}
       r:=cg.getintregister(exprasmlist,OS_INT);
       cg.a_load_loc_reg(exprasmlist,OS_INT,left.location,r);
-      location_release(exprasmlist,left.location);
       {Allocate EAX.}
-      cg.getexplicitregister(exprasmlist,NR_EAX);
+      cg.getcpuregister(exprasmlist,NR_EAX);
       {Load the right value.}
       cg.a_load_loc_reg(exprasmlist,OS_INT,right.location,NR_EAX);
-      location_release(exprasmlist,right.location);
-      {The mul instruction frees register r.}
-      cg.ungetregister(exprasmlist,r);
       {Also allocate EDX, since it is also modified by a mul (JM).}
-      cg.getexplicitregister(exprasmlist,NR_EDX);
+      cg.getcpuregister(exprasmlist,NR_EDX);
       emit_reg(A_MUL,S_L,r);
       if cs_check_overflow in aktlocalswitches  then
        begin
@@ -670,13 +638,12 @@ interface
          cg.a_call_name(exprasmlist,'FPC_OVERFLOW');
          cg.a_label(exprasmlist,hl4);
        end;
-      {Free EDX}
-      cg.ungetregister(exprasmlist,NR_EDX);
-      {Free EAX}
-      cg.ungetregister(exprasmlist,NR_EAX);
+      {Free EAX,EDX}
+      cg.ungetcpuregister(exprasmlist,NR_EDX);
+      cg.ungetcpuregister(exprasmlist,NR_EAX);
       {Allocate a new register and store the result in EAX in it.}
       location.register:=cg.getintregister(exprasmlist,OS_INT);
-      emit_reg_reg(A_MOV,S_L,NR_EAX,location.register);
+      cg.a_load_reg_reg(exprasmlist,OS_INT,OS_INT,NR_EAX,location.register);
       location_freetemp(exprasmlist,left.location);
       location_freetemp(exprasmlist,right.location);
     end;
@@ -687,7 +654,13 @@ begin
 end.
 {
   $Log$
-  Revision 1.98  2004-06-20 08:55:31  florian
+  Revision 1.99  2004-09-25 14:23:54  peter
+    * ungetregister is now only used for cpuregisters, renamed to
+      ungetcpuregister
+    * renamed (get|unget)explicitregister(s) to ..cpuregister
+    * removed location-release/reference_release
+
+  Revision 1.98  2004/06/20 08:55:31  florian
     * logs truncated
 
   Revision 1.97  2004/06/16 20:07:10  florian

+ 7 - 4
compiler/i386/n386cal.pas

@@ -75,7 +75,6 @@ implementation
           begin
             hreg:=cg.getintregister(exprasmlist,OS_INT);
             exprasmlist.concat(taicpu.op_reg(A_POP,S_L,hreg));
-            cg.ungetregister(exprasmlist,hreg);
           end
         { the pentium has two pipes and pop reg is pairable }
         { but the registers must be different!        }
@@ -86,10 +85,8 @@ implementation
             begin
                hreg:=cg.getintregister(exprasmlist,OS_INT);
                exprasmlist.concat(taicpu.op_reg(A_POP,S_L,hreg));
-               cg.ungetregister(exprasmlist,hreg);
                hreg:=cg.getintregister(exprasmlist,OS_INT);
                exprasmlist.concat(taicpu.op_reg(A_POP,S_L,hreg));
-               cg.ungetregister(exprasmlist,hreg);
             end
         else
           if pop_size<>0 then
@@ -102,7 +99,13 @@ begin
 end.
 {
   $Log$
-  Revision 1.101  2004-06-20 08:55:31  florian
+  Revision 1.102  2004-09-25 14:23:54  peter
+    * ungetregister is now only used for cpuregisters, renamed to
+      ungetcpuregister
+    * renamed (get|unget)explicitregister(s) to ..cpuregister
+    * removed location-release/reference_release
+
+  Revision 1.101  2004/06/20 08:55:31  florian
     * logs truncated
 
   Revision 1.100  2004/06/16 20:07:10  florian

+ 18 - 29
compiler/i386/n386mat.pas

@@ -107,8 +107,6 @@ implementation
                   emit_const_reg(A_AND,S_L,tordconstnode(right).value-1,hreg2);
                   { add to the left value }
                   emit_reg_reg(A_ADD,S_L,hreg2,hreg1);
-                  { release EDX if we used it }
-                  cg.ungetregister(exprasmlist,hreg2);
                   { do the shift }
                   emit_const_reg(A_SAR,S_L,power,hreg1);
                 end
@@ -132,11 +130,9 @@ implementation
         end
       else
         begin
-          {Bring denominator to a register.}
-          cg.ungetregister(exprasmlist,hreg1);
-          cg.getexplicitregister(exprasmlist,NR_EAX);
+          cg.getcpuregister(exprasmlist,NR_EAX);
           emit_reg_reg(A_MOV,S_L,hreg1,NR_EAX);
-          cg.getexplicitregister(exprasmlist,NR_EDX);
+          cg.getcpuregister(exprasmlist,NR_EDX);
           {Sign extension depends on the left type.}
           if torddef(left.resulttype.def).typ=u32bit then
             emit_reg_reg(A_XOR,S_L,NR_EDX,NR_EDX)
@@ -157,26 +153,17 @@ implementation
             begin
               hreg1:=cg.getintregister(exprasmlist,right.location.size);
               cg.a_load_loc_reg(exprasmlist,OS_32,right.location,hreg1);
-              cg.ungetregister(exprasmlist,hreg1);
               emit_reg(op,S_L,hreg1);
             end;
-          location_release(exprasmlist,right.location);
 
           {Copy the result into a new register. Release EAX & EDX.}
+          cg.ungetcpuregister(exprasmlist,NR_EDX);
+          cg.ungetcpuregister(exprasmlist,NR_EAX);
+          location.register:=cg.getintregister(exprasmlist,OS_INT);
           if nodetype=divn then
-            begin
-              cg.ungetregister(exprasmlist,NR_EDX);
-              cg.ungetregister(exprasmlist,NR_EAX);
-              location.register:=cg.getintregister(exprasmlist,OS_INT);
-              emit_reg_reg(A_MOV,S_L,NR_EAX,location.register);
-            end
+            cg.a_load_reg_reg(exprasmlist,OS_INT,OS_INT,NR_EAX,location.register)
           else
-            begin
-              cg.ungetregister(exprasmlist,NR_EAX);
-              cg.ungetregister(exprasmlist,NR_EDX);
-              location.register:=cg.getintregister(exprasmlist,OS_INT);
-              emit_reg_reg(A_MOV,S_L,NR_EDX,location.register);
-            end;
+            cg.a_load_reg_reg(exprasmlist,OS_INT,OS_INT,NR_EDX,location.register);
         end;
     end;
 
@@ -258,10 +245,8 @@ implementation
           else
             begin
               { load right operators in a register }
-              cg.getexplicitregister(exprasmlist,NR_ECX);
+              cg.getcpuregister(exprasmlist,NR_ECX);
               cg.a_load_loc_reg(exprasmlist,OS_32,right.location,NR_ECX);
-              if right.location.loc<>LOC_CREGISTER then
-                location_release(exprasmlist,right.location);
 
               { left operator is already in a register }
               { hence are both in a register }
@@ -303,7 +288,7 @@ implementation
                 end;
               cg.a_label(exprasmlist,l3);
 
-              cg.ungetregister(exprasmlist,NR_ECX);
+              cg.ungetcpuregister(exprasmlist,NR_ECX);
               location.registerlow:=hregisterlow;
               location.registerhigh:=hregisterhigh;
             end;
@@ -321,13 +306,11 @@ implementation
           else
             begin
               { load right operators in a ECX }
-              if right.location.loc<>LOC_CREGISTER then
-                location_release(exprasmlist,right.location);
-              cg.getexplicitregister(exprasmlist,NR_ECX);
+              cg.getcpuregister(exprasmlist,NR_ECX);
               cg.a_load_loc_reg(exprasmlist,OS_32,right.location,NR_ECX);
 
               { right operand is in ECX }
-              cg.ungetregister(exprasmlist,NR_ECX);
+              cg.ungetcpuregister(exprasmlist,NR_ECX);
               emit_reg_reg(op,S_L,NR_CL,location.register);
             end;
         end;
@@ -342,7 +325,13 @@ begin
 end.
 {
   $Log$
-  Revision 1.71  2004-06-20 08:55:31  florian
+  Revision 1.72  2004-09-25 14:23:54  peter
+    * ungetregister is now only used for cpuregisters, renamed to
+      ungetcpuregister
+    * renamed (get|unget)explicitregister(s) to ..cpuregister
+    * removed location-release/reference_release
+
+  Revision 1.71  2004/06/20 08:55:31  florian
     * logs truncated
 
   Revision 1.70  2004/05/23 14:10:17  peter

+ 7 - 2
compiler/i386/n386mem.pas

@@ -109,7 +109,6 @@ implementation
           end
          else
           begin
-            cg.ungetreference(exprasmlist,location.reference);
             hreg := cg.getaddressregister(exprasmlist);
             cg.a_loadaddr_ref_reg(exprasmlist,location.reference,hreg);
             reference_reset_base(location.reference,hreg,0);
@@ -145,7 +144,13 @@ begin
 end.
 {
   $Log$
-  Revision 1.62  2004-06-20 08:55:31  florian
+  Revision 1.63  2004-09-25 14:23:54  peter
+    * ungetregister is now only used for cpuregisters, renamed to
+      ungetcpuregister
+    * renamed (get|unget)explicitregister(s) to ..cpuregister
+    * removed location-release/reference_release
+
+  Revision 1.62  2004/06/20 08:55:31  florian
     * logs truncated
 
   Revision 1.61  2004/06/16 20:07:10  florian

+ 15 - 9
compiler/m68k/cgcpu.pas

@@ -427,8 +427,8 @@ unit cgcpu;
                    begin
                      r:=NR_D0;
                      r2:=NR_D1;
-                     getexplicitregister(list,NR_D0);
-                     getexplicitregister(list,NR_D1);
+                     getcpuregister(list,NR_D0);
+                     getcpuregister(list,NR_D1);
                      list.concat(taicpu.op_const_reg(A_MOVE,S_L,a, r));
                      list.concat(taicpu.op_reg_reg(A_MOVE,S_L,reg, r2));
                      cg.a_call_name(list,'FPC_MUL_LONGINT');
@@ -456,8 +456,8 @@ unit cgcpu;
                    begin
                      r:=NR_D0;
                      r2:=NR_D1;
-                     getexplicitregister(list,NR_D0);
-                     getexplicitregister(list,NR_D1);
+                     getcpuregister(list,NR_D0);
+                     getcpuregister(list,NR_D1);
                      list.concat(taicpu.op_const_reg(A_MOVE,S_L,a, r));
                      list.concat(taicpu.op_reg_reg(A_MOVE,S_L,reg, r2));
                      cg.a_call_name(list,'FPC_MUL_LONGWORD');
@@ -620,8 +620,8 @@ unit cgcpu;
                    begin
                      r:=NR_D0;
                      r2:=NR_D1;
-                     getexplicitregister(list,NR_D0);
-                     getexplicitregister(list,NR_D1);
+                     getcpuregister(list,NR_D0);
+                     getcpuregister(list,NR_D1);
                      list.concat(taicpu.op_reg_reg(A_MOVE,S_L,reg1, r));
                      list.concat(taicpu.op_reg_reg(A_MOVE,S_L,reg2, r2));
                      cg.a_call_name(list,'FPC_MUL_LONGINT');
@@ -663,8 +663,8 @@ unit cgcpu;
                    begin
                      r:=NR_D0;
                      r2:=NR_D1;
-                     getexplicitregister(list,NR_D0);
-                     getexplicitregister(list,NR_D1);
+                     getcpuregister(list,NR_D0);
+                     getcpuregister(list,NR_D1);
                      list.concat(taicpu.op_reg_reg(A_MOVE,S_L,reg1, r));
                      list.concat(taicpu.op_reg_reg(A_MOVE,S_L,reg2, r2));
                      cg.a_call_name(list,'FPC_MUL_LONGWORD');
@@ -1313,7 +1313,13 @@ end.
 
 {
   $Log$
-  Revision 1.28  2004-06-20 08:55:31  florian
+  Revision 1.29  2004-09-25 14:23:54  peter
+    * ungetregister is now only used for cpuregisters, renamed to
+      ungetcpuregister
+    * renamed (get|unget)explicitregister(s) to ..cpuregister
+    * removed location-release/reference_release
+
+  Revision 1.28  2004/06/20 08:55:31  florian
     * logs truncated
 
   Revision 1.27  2004/05/20 21:54:33  florian

+ 11 - 5
compiler/m68k/n68kmat.pas

@@ -160,9 +160,9 @@ implementation
        begin
          { On MC68000/68010 mw must pass through RTL routines }
          reg_d0:=NR_D0;
-         cg.getexplicitregister(exprasmlist,NR_D0);
+         cg.getcpuregister(exprasmlist,NR_D0);
          reg_d1:=NR_D1;
-         cg.getexplicitregister(exprasmlist,NR_D1);
+         cg.getcpuregister(exprasmlist,NR_D1);
          { put numerator in d0 }
          cg.a_load_reg_reg(exprasmlist,OS_INT,OS_INT,num,reg_d0);
          { put denum in D1 }
@@ -221,9 +221,9 @@ implementation
        begin
          { On MC68000/68010 mw must pass through RTL routines }
          Reg_d0:=NR_D0;
-         cg.getexplicitregister(exprasmlist,NR_D0);
+         cg.getcpuregister(exprasmlist,NR_D0);
          Reg_d1:=NR_D1;
-         cg.getexplicitregister(exprasmlist,NR_D1);
+         cg.getcpuregister(exprasmlist,NR_D1);
          { put numerator in d0 }
          cg.a_load_reg_reg(exprasmlist,OS_INT,OS_INT,num,Reg_D0);
          { put denum in D1 }
@@ -246,7 +246,13 @@ begin
 end.
 {
   $Log$
-  Revision 1.9  2004-06-20 08:55:31  florian
+  Revision 1.10  2004-09-25 14:23:54  peter
+    * ungetregister is now only used for cpuregisters, renamed to
+      ungetcpuregister
+    * renamed (get|unget)explicitregister(s) to ..cpuregister
+    * removed location-release/reference_release
+
+  Revision 1.9  2004/06/20 08:55:31  florian
     * logs truncated
 
   Revision 1.8  2004/04/25 21:26:16  florian

+ 7 - 31
compiler/ncgadd.pas

@@ -40,8 +40,6 @@ interface
           procedure set_result_location_reg;
           { load left and right nodes into registers }
           procedure force_reg_left_right(allow_swap,allow_constant:boolean);
-          { free used registers, except result location }
-          procedure release_reg_left_right;
 
           procedure second_opfloat;
           procedure second_opboolean;
@@ -220,23 +218,6 @@ interface
       end;
 
 
-    procedure tcgaddnode.release_reg_left_right;
-      begin
-        if (right.location.loc in [LOC_REGISTER,LOC_FPUREGISTER]) and
-           not(
-               (location.loc = right.location.loc) and
-               (location.register=right.location.register)
-              ) then
-          location_release(exprasmlist,right.location);
-        if (left.location.loc in [LOC_REGISTER,LOC_FPUREGISTER]) and
-           not(
-               (location.loc = left.location.loc) and
-               (location.register=left.location.register)
-              ) then
-          location_release(exprasmlist,left.location);
-      end;
-
-
 {*****************************************************************************
                                 Smallsets
 *****************************************************************************}
@@ -306,7 +287,6 @@ interface
                       else
                         cg.a_op_const_reg_reg(exprasmlist,OP_OR,location.size,
                             left.location.value,tmpreg,location.register);
-                      cg.ungetregister(exprasmlist,tmpreg);
                     end;
                   opdone := true;
                 end
@@ -342,7 +322,6 @@ interface
                       cg.a_op_reg_reg(exprasmlist,OP_NOT,location.size,right.location.register,right.location.register);
                       cg.a_op_reg_reg(exprasmlist,OP_AND,location.size,right.location.register,tmpreg);
                       cg.a_load_reg_reg(exprasmlist,OS_INT,location.size,tmpreg,location.register);
-                      cg.ungetregister(exprasmlist,tmpreg);
                     end
                   else
                     begin
@@ -370,8 +349,6 @@ interface
                 right.location.register,left.location.register,
                 location.register);
           end;
-
-        release_reg_left_right;
       end;
 
 
@@ -450,8 +427,6 @@ interface
                  right.location.value,left.location.register,
                  location.register);
          end;
-
-        release_reg_left_right;
       end;
 
 
@@ -596,8 +571,6 @@ interface
         { emit overflow check if enabled }
         if checkoverflow then
            cg.g_overflowcheck(exprasmlist,Location,ResultType.Def);
-
-        release_reg_left_right;
       end;
 
 
@@ -723,15 +696,12 @@ interface
                 aword(left.location.value),tmpreg);
               cg.a_op_reg_reg_reg(exprasmlist,OP_SUB,location.size,
                 right.location.register,tmpreg,location.register);
-              cg.ungetregister(exprasmlist,tmpreg);
             end;
         end;
 
         { emit overflow check if required }
         if checkoverflow then
           cg.g_overflowcheck(exprasmlist,Location,ResultType.Def);
-
-        release_reg_left_right;
       end;
 
 
@@ -807,7 +777,13 @@ begin
 end.
 {
   $Log$
-  Revision 1.31  2004-06-20 08:55:29  florian
+  Revision 1.32  2004-09-25 14:23:54  peter
+    * ungetregister is now only used for cpuregisters, renamed to
+      ungetcpuregister
+    * renamed (get|unget)explicitregister(s) to ..cpuregister
+    * removed location-release/reference_release
+
+  Revision 1.31  2004/06/20 08:55:29  florian
     * logs truncated
 
   Revision 1.30  2004/06/16 20:07:08  florian

+ 10 - 7
compiler/ncgbas.pas

@@ -218,7 +218,7 @@ interface
            end;
 
          { Allocate registers used in the assembler block }
-         cg.allocexplicitregisters(exprasmlist,R_INTREGISTER,used_regs_int);
+         cg.alloccpuregisters(exprasmlist,R_INTREGISTER,used_regs_int);
 
          if (current_procinfo.procdef.proccalloption=pocall_inline) then
            begin
@@ -314,7 +314,7 @@ interface
            end;
 
          { Release register used in the assembler block }
-         cg.deallocexplicitregisters(exprasmlist,R_INTREGISTER,used_regs_int);
+         cg.dealloccpuregisters(exprasmlist,R_INTREGISTER,used_regs_int);
        end;
 
 
@@ -476,10 +476,7 @@ interface
               cg.a_load_reg_reg(exprasmlist,OS_INT,OS_INT,tempinfo^.loc.reg,
                 tempinfo^.loc.reg);
               if release_to_normal then
-                tempinfo^.loc.loc := LOC_REGISTER
-              else
-                { !!tell rgobj this register is no longer a regvar!! }
-                cg.ungetregister(exprasmlist,tempinfo^.loc.reg);
+                tempinfo^.loc.loc := LOC_REGISTER;
             end;
         end;
       end;
@@ -496,7 +493,13 @@ begin
 end.
 {
   $Log$
-  Revision 1.66  2004-09-21 17:25:12  peter
+  Revision 1.67  2004-09-25 14:23:54  peter
+    * ungetregister is now only used for cpuregisters, renamed to
+      ungetcpuregister
+    * renamed (get|unget)explicitregister(s) to ..cpuregister
+    * removed location-release/reference_release
+
+  Revision 1.66  2004/09/21 17:25:12  peter
     * paraloc branch merged
 
   Revision 1.65.4.1  2004/08/31 20:43:06  peter

+ 34 - 62
compiler/ncgcal.pas

@@ -120,7 +120,6 @@ implementation
       begin
         if not(left.location.loc in [LOC_CREFERENCE,LOC_REFERENCE]) then
           internalerror(200304235);
-        location_release(exprasmlist,left.location);
         cg.a_paramaddr_ref(exprasmlist,left.location.reference,tempcgpara);
       end;
 
@@ -144,7 +143,6 @@ implementation
         { Handle Floating point types differently }
         if left.resulttype.def.deftype=floatdef then
          begin
-           location_release(exprasmlist,left.location);
 {$ifdef i386}
            if tempcgpara.location^.loc<>LOC_REFERENCE then
              internalerror(200309291);
@@ -203,7 +201,7 @@ implementation
                  else
                    begin
                      reference_reset_base(href,tempcgpara.location^.reference.index,tempcgpara.location^.reference.offset);
-                     cg.g_concatcopy(exprasmlist,left.location.reference,href,size,false,false);
+                     cg.g_concatcopy(exprasmlist,left.location.reference,href,size,false);
                    end;
                end;
              else
@@ -303,7 +301,6 @@ implementation
               paramanager.copy_value_on_stack(paraitem.paratyp,left.resulttype.def,
                   aktcallnode.procdefinition.proccalloption) then
             begin
-              location_release(exprasmlist,left.location);
 {$ifdef i386}
               if tempcgpara.location^.loc<>LOC_REFERENCE then
                 internalerror(200309292);
@@ -318,7 +315,7 @@ implementation
                 end
               else
                 reference_reset_base(href,tempcgpara.location^.reference.index,tempcgpara.location^.reference.offset);
-              cg.g_concatcopy(exprasmlist,left.location.reference,href,size,false,false);
+              cg.g_concatcopy(exprasmlist,left.location.reference,href,size,false);
 {$else i386}
               cg.a_param_copy_ref(exprasmlist,left.resulttype.def.size,left.location.reference,tempcgpara);
 {$endif i386}
@@ -334,24 +331,15 @@ implementation
                   begin
 {$ifndef cpu64bit}
                     if left.location.size in [OS_64,OS_S64] then
-                     begin
-                       cg64.a_param64_loc(exprasmlist,left.location,tempcgpara);
-                       location_release(exprasmlist,left.location);
-                     end
+                      cg64.a_param64_loc(exprasmlist,left.location,tempcgpara)
                     else
 {$endif cpu64bit}
-                     begin
-                       location_release(exprasmlist,left.location);
-                       cg.a_param_loc(exprasmlist,left.location,tempcgpara);
-                     end;
+                      cg.a_param_loc(exprasmlist,left.location,tempcgpara);
                   end;
 {$ifdef SUPPORT_MMX}
                 LOC_MMXREGISTER,
                 LOC_CMMXREGISTER:
-                  begin
-                     location_release(exprasmlist,left.location);
-                     cg.a_parammm_reg(exprasmlist,left.location.register);
-                  end;
+                  cg.a_parammm_reg(exprasmlist,left.location.register);
 {$endif SUPPORT_MMX}
                 else
                   internalerror(200204241);
@@ -424,10 +412,7 @@ implementation
                     hp:=ttypeconvnode(hp).left;
                   if (hp.nodetype=addrn) and
                      (not(nf_procvarload in hp.flags)) then
-                    begin
-                      location_release(exprasmlist,left.location);
-                      cg.a_param_loc(exprasmlist,left.location,tempcgpara);
-                    end
+                    cg.a_param_loc(exprasmlist,left.location,tempcgpara)
                   else
                     push_addr_para;
                end
@@ -527,11 +512,10 @@ implementation
                   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.ungetregister(exprasmlist,NR_FUNCTION_RESULT_REG);
+                  cg.ungetcpuregister(exprasmlist,NR_FUNCTION_RESULT_REG);
                 end
               else
                 begin
-                  cg.ungetregister(exprasmlist,resultparaloc^.register);
                   hregister := cg.getaddressregister(exprasmlist);
                   cg.a_load_reg_reg(exprasmlist,OS_ADDR,OS_ADDR,resultparaloc^.register,hregister);
                   { in case of a regular funcretnode with ret_in_param, the }
@@ -543,7 +527,6 @@ implementation
                   tempnode.free;
                   cg.g_decrrefcount(exprasmlist,resulttype.def,location.reference,false);
                   cg.a_load_reg_ref(exprasmlist,OS_ADDR,OS_ADDR,hregister,location.reference);
-                  cg.ungetregister(exprasmlist,hregister);
                end;
 
               { When the result is not used we need to finalize the result and
@@ -569,7 +552,6 @@ implementation
 {$ifdef x86}
                        tcgx86(cg).inc_fpu_stack;
 {$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;
@@ -588,21 +570,16 @@ implementation
                              if retloc.loc<>LOC_REGISTER then
                                internalerror(200409141);
                              { the function result registers are already allocated }
-                             cg.ungetregister(exprasmlist,retloc.registerlow);
                              location.registerlow:=cg.getintregister(exprasmlist,OS_32);
                              cg.a_load_reg_reg(exprasmlist,OS_32,OS_32,retloc.registerlow,location.registerlow);
-                             cg.ungetregister(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
                           else
 {$endif cpu64bit}
                            begin
-                             { the function result register are already allocated }
-                             cg.ungetregister(exprasmlist,resultparaloc^.register);
                              { change register size after the unget because the
                                getregister was done for the full register
-
                                def_cgsize(resulttype.def) is used here because
                                it could be a constructor call }
                              location.register:=cg.getintregister(exprasmlist,def_cgsize(resulttype.def));
@@ -619,7 +596,6 @@ implementation
                    LOC_MMREGISTER:
                      begin
                        location_reset(location,LOC_MMREGISTER,cgsize);
-                       cg.ungetregister(exprasmlist,resultparaloc^.register);
                        location.register:=cg.getmmregister(exprasmlist,cgsize);
                        cg.a_loadmm_reg_reg(exprasmlist,cgsize,cgsize,resultparaloc^.register,location.register,mms_movescalar);
                      end;
@@ -713,7 +689,7 @@ implementation
                            if tmpparaloc^.loc<>LOC_REGISTER then
                              internalerror(200408221);
                            if getsupreg(callerparaloc^.register)<first_int_imreg then
-                             cg.getexplicitregister(exprasmlist,callerparaloc^.register);
+                             cg.getcpuregister(exprasmlist,callerparaloc^.register);
                            cg.a_load_reg_reg(exprasmlist,tmpparaloc^.size,tmpparaloc^.size,
                                tmpparaloc^.register,callerparaloc^.register);
                          end;
@@ -722,7 +698,7 @@ implementation
                            if tmpparaloc^.loc<>LOC_FPUREGISTER then
                              internalerror(200408222);
                            if getsupreg(callerparaloc^.register)<first_fpu_imreg then
-                             cg.getexplicitregister(exprasmlist,callerparaloc^.register);
+                             cg.getcpuregister(exprasmlist,callerparaloc^.register);
                            cg.a_loadfpu_reg_reg(exprasmlist,ppn.tempcgpara.size,tmpparaloc^.register,callerparaloc^.register);
                          end;
                        LOC_MMREGISTER:
@@ -730,7 +706,7 @@ implementation
                            if tmpparaloc^.loc<>LOC_MMREGISTER then
                              internalerror(200408223);
                            if getsupreg(callerparaloc^.register)<first_mm_imreg then
-                             cg.getexplicitregister(exprasmlist,callerparaloc^.register);
+                             cg.getcpuregister(exprasmlist,callerparaloc^.register);
                            cg.a_loadmm_reg_reg(exprasmlist,tmpparaloc^.size,tmpparaloc^.size,
                              tmpparaloc^.register,callerparaloc^.register,mms_movescalar);
                          end;
@@ -747,7 +723,7 @@ implementation
                                      reference_reset_base(htempref,tmpparaloc^.reference.index,tmpparaloc^.reference.offset);
                                      { use concatcopy, because it can also be a float which fails when
                                        load_ref_ref is used }
-                                     cg.g_concatcopy(exprasmlist,htempref,href,tcgsize2size[tmpparaloc^.size],false,false);
+                                     cg.g_concatcopy(exprasmlist,htempref,href,tcgsize2size[tmpparaloc^.size],false);
                                    end;
                                  LOC_REGISTER:
                                    cg.a_load_reg_ref(exprasmlist,tmpparaloc^.size,tmpparaloc^.size,tmpparaloc^.register,href);
@@ -874,9 +850,6 @@ implementation
                  assigned(methodpointer) then
                 begin
                    vmtreg:=methodpointer.location.register;
-
-                   { release self }
-                   cg.ungetregister(exprasmlist,vmtreg);
                    pvreg:=cg.getintregister(exprasmlist,OS_ADDR);
                    reference_reset_base(href,vmtreg,
                       tprocdef(procdefinition)._class.vmtmethodoffset(tprocdef(procdefinition).extnumber));
@@ -890,14 +863,11 @@ implementation
                    { free the resources allocated for the parameters }
                    freeparas;
 
-                   { Release register containing procvar }
-                   cg.ungetregister(exprasmlist,pvreg);
-
-                   cg.allocexplicitregisters(exprasmlist,R_INTREGISTER,regs_to_save_int);
+                   cg.alloccpuregisters(exprasmlist,R_INTREGISTER,regs_to_save_int);
                    if cg.uses_registers(R_FPUREGISTER) then
-                     cg.allocexplicitregisters(exprasmlist,R_FPUREGISTER,regs_to_save_fpu);
+                     cg.alloccpuregisters(exprasmlist,R_FPUREGISTER,regs_to_save_fpu);
                    if cg.uses_registers(R_MMREGISTER) then
-                     cg.allocexplicitregisters(exprasmlist,R_MMREGISTER,regs_to_save_mm);
+                     cg.alloccpuregisters(exprasmlist,R_MMREGISTER,regs_to_save_mm);
 
                    { call method }
                    extra_call_code;
@@ -913,11 +883,11 @@ implementation
                   { free the resources allocated for the parameters }
                   freeparas;
 
-                  cg.allocexplicitregisters(exprasmlist,R_INTREGISTER,regs_to_save_int);
+                  cg.alloccpuregisters(exprasmlist,R_INTREGISTER,regs_to_save_int);
                   if cg.uses_registers(R_FPUREGISTER) then
-                    cg.allocexplicitregisters(exprasmlist,R_FPUREGISTER,regs_to_save_fpu);
+                    cg.alloccpuregisters(exprasmlist,R_FPUREGISTER,regs_to_save_fpu);
                   if cg.uses_registers(R_MMREGISTER) then
-                    cg.allocexplicitregisters(exprasmlist,R_MMREGISTER,regs_to_save_mm);
+                    cg.alloccpuregisters(exprasmlist,R_MMREGISTER,regs_to_save_mm);
 
                   if procdefinition.proccalloption=pocall_syscall then
                     do_syscall
@@ -937,7 +907,6 @@ implementation
            begin
               secondpass(right);
 
-              location_release(exprasmlist,right.location);
               pvreg:=cg.getintregister(exprasmlist,OS_ADDR);
               { Only load OS_ADDR from the reference }
               if right.location.loc in [LOC_REFERENCE,LOC_CREFERENCE] then
@@ -954,14 +923,11 @@ implementation
               { free the resources allocated for the parameters }
               freeparas;
 
-              { Release register containing procvar }
-              cg.ungetregister(exprasmlist,pvreg);
-
-              cg.allocexplicitregisters(exprasmlist,R_INTREGISTER,regs_to_save_int);
+              cg.alloccpuregisters(exprasmlist,R_INTREGISTER,regs_to_save_int);
               if cg.uses_registers(R_FPUREGISTER) then
-                cg.allocexplicitregisters(exprasmlist,R_FPUREGISTER,regs_to_save_fpu);
+                cg.alloccpuregisters(exprasmlist,R_FPUREGISTER,regs_to_save_fpu);
               if cg.uses_registers(R_MMREGISTER) then
-                cg.allocexplicitregisters(exprasmlist,R_MMREGISTER,regs_to_save_mm);
+                cg.alloccpuregisters(exprasmlist,R_MMREGISTER,regs_to_save_mm);
 
               { Calling interrupt from the same code requires some
                 extra code }
@@ -1007,10 +973,10 @@ implementation
               end;
            end;
          if cg.uses_registers(R_MMREGISTER) then
-           cg.deallocexplicitregisters(exprasmlist,R_MMREGISTER,regs_to_save_mm);
+           cg.dealloccpuregisters(exprasmlist,R_MMREGISTER,regs_to_save_mm);
          if cg.uses_registers(R_FPUREGISTER) then
-           cg.deallocexplicitregisters(exprasmlist,R_FPUREGISTER,regs_to_save_fpu);
-         cg.deallocexplicitregisters(exprasmlist,R_INTREGISTER,regs_to_save_int);
+           cg.dealloccpuregisters(exprasmlist,R_FPUREGISTER,regs_to_save_fpu);
+         cg.dealloccpuregisters(exprasmlist,R_INTREGISTER,regs_to_save_int);
 
          { handle function results }
          if (not is_void(resulttype.def)) then
@@ -1026,9 +992,9 @@ implementation
             (right=nil) and
             not(po_virtualmethod in procdefinition.procoptions) then
            begin
-              cg.allocexplicitregisters(exprasmlist,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
+              cg.alloccpuregisters(exprasmlist,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
               cg.a_call_name(exprasmlist,'FPC_IOCHECK');
-              cg.deallocexplicitregisters(exprasmlist,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
+              cg.dealloccpuregisters(exprasmlist,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
            end;
 
          { release temps of paras }
@@ -1175,9 +1141,9 @@ implementation
             (right=nil) and
             not(po_virtualmethod in procdefinition.procoptions) then
            begin
-              cg.allocexplicitregisters(exprasmlist,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
+              cg.alloccpuregisters(exprasmlist,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
               cg.a_call_name(exprasmlist,'FPC_IOCHECK');
-              cg.deallocexplicitregisters(exprasmlist,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
+              cg.dealloccpuregisters(exprasmlist,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
            end;
 
          { release temps of paras }
@@ -1254,7 +1220,13 @@ begin
 end.
 {
   $Log$
-  Revision 1.174  2004-09-21 17:25:12  peter
+  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
+    * removed location-release/reference_release
+
+  Revision 1.174  2004/09/21 17:25:12  peter
     * paraloc branch merged
 
   Revision 1.173.4.3  2004/09/20 20:46:34  peter

+ 8 - 12
compiler/ncgcnv.pas

@@ -117,7 +117,6 @@ interface
         hr : treference;
 
       begin
-         location_release(exprasmlist,left.location);
          location_reset(location,LOC_REGISTER,OS_ADDR);
          case tstringdef(left.resulttype.def).string_typ of
            st_shortstring :
@@ -201,7 +200,6 @@ interface
     procedure tcgtypeconvnode.second_array_to_pointer;
 
       begin
-         location_release(exprasmlist,left.location);
          location_reset(location,LOC_REGISTER,OS_ADDR);
          location.register:=cg.getaddressregister(exprasmlist);
          cg.a_loadaddr_ref_reg(exprasmlist,left.location.reference,location.register);
@@ -218,7 +216,6 @@ interface
             {$ifdef cpu_uses_separate_address_registers}
               if getregtype(left.location.register)<>R_ADDRESSREGISTER then
                 begin
-                  location_release(exprasmlist,left.location);
                   location.reference.base:=rg.getaddressregister(exprasmlist);
                   cg.a_load_reg_reg(exprasmlist,OS_ADDR,OS_ADDR,
                           left.location.register,location.reference.base);
@@ -236,7 +233,6 @@ interface
           LOC_REFERENCE,
           LOC_CREFERENCE :
             begin
-              location_release(exprasmlist,left.location);
               location.reference.base:=cg.getaddressregister(exprasmlist);
               cg.a_load_ref_reg(exprasmlist,OS_ADDR,OS_ADDR,left.location.reference,
                 location.reference.base);
@@ -254,7 +250,6 @@ interface
          case tstringdef(resulttype.def).string_typ of
            st_shortstring :
              begin
-               location_release(exprasmlist,left.location);
                tg.GetTemp(exprasmlist,256,tt_normal,location.reference);
                cg.a_load_loc_ref(exprasmlist,left.location.size,left.location,
                  location.reference);
@@ -289,7 +284,6 @@ interface
             LOC_CREFERENCE,
             LOC_REFERENCE:
               begin
-                 location_release(exprasmlist,left.location);
                  location.register:=cg.getfpuregister(exprasmlist,left.location.size);
                  cg.a_loadfpu_loc_reg(exprasmlist,left.location,location.register);
                  location_freetemp(exprasmlist,left.location);
@@ -335,7 +329,6 @@ interface
           end
         else
           begin
-             location_release(exprasmlist,left.location);
              location_reset(location,LOC_REGISTER,OS_ADDR);
              location.register:=cg.getaddressregister(exprasmlist);
              cg.a_loadaddr_ref_reg(exprasmlist,left.location.reference,location.register);
@@ -393,7 +386,6 @@ interface
                {$ifdef cpu_uses_separate_address_registers}
                  if getregtype(left.location.register)<>R_ADDRESSREGISTER then
                    begin
-                     location_release(exprasmlist,left.location);
                      location.register:=cg.getaddressregister(exprasmlist);
                      cg.a_load_reg_reg(exprasmlist,OS_ADDR,OS_ADDR,
                               left.location.register,location.register);
@@ -404,10 +396,9 @@ interface
               end;
             LOC_CREFERENCE,LOC_REFERENCE:
               begin
-                location_release(exprasmlist,left.location);
                 location.register:=cg.getaddressregister(exprasmlist);
                 cg.a_load_ref_reg(exprasmlist,OS_ADDR,OS_ADDR,left.location.reference,location.register);
-                location_freetemp(exprasmlist,left.location);
+//                location_freetemp(exprasmlist,left.location);
               end;
             else
               internalerror(2002032214);
@@ -430,7 +421,6 @@ interface
             LOC_CREFERENCE,
             LOC_REFERENCE:
               begin
-                 location_release(exprasmlist,left.location);
                  location.register:=cg.getaddressregister(exprasmlist);
                  cg.a_load_ref_reg(exprasmlist,OS_ADDR,OS_ADDR,left.location.reference,location.register);
                  location_freetemp(exprasmlist,left.location);
@@ -539,7 +529,13 @@ end.
 
 {
   $Log$
-  Revision 1.59  2004-06-20 08:55:29  florian
+  Revision 1.60  2004-09-25 14:23:54  peter
+    * ungetregister is now only used for cpuregisters, renamed to
+      ungetcpuregister
+    * renamed (get|unget)explicitregister(s) to ..cpuregister
+    * removed location-release/reference_release
+
+  Revision 1.59  2004/06/20 08:55:29  florian
     * logs truncated
 
   Revision 1.58  2004/06/16 20:07:08  florian

+ 42 - 48
compiler/ncgflw.pas

@@ -364,15 +364,8 @@ implementation
               do_loopvar_at_end:=false;
               tg.GetTemp(exprasmlist,hs,tt_normal,temp1);
               temptovalue:=true;
-              if (right.location.loc=LOC_REGISTER) or
-                 (right.location.loc=LOC_CREGISTER) then
-                begin
-                   cg.a_load_reg_ref(exprasmlist,opsize,opsize,right.location.register,temp1);
-                   cg.ungetregister(exprasmlist,right.location.register);
-                 end
-              else
-                cg.g_concatcopy(exprasmlist,right.location.reference,temp1,
-                  hs,true,false);
+              cg.a_load_loc_ref(exprasmlist,opsize,right.location,temp1);
+              location_freetemp(exprasmlist,right.location);
            end
          else
            temptovalue:=false;
@@ -803,14 +796,10 @@ implementation
                 begin
                   paramanager.allocparaloc(exprasmlist,paraloc3);
                   if assigned(frametree) then
-                    begin
-                      location_release(exprasmlist,frametree.location);
-                      cg.a_param_loc(exprasmlist,frametree.location,paraloc3)
-                    end
+                    cg.a_param_loc(exprasmlist,frametree.location,paraloc3)
                   else
                     cg.a_param_const(exprasmlist,OS_INT,0,paraloc3);
                   { push address }
-                  location_release(exprasmlist,right.location);
                   paramanager.allocparaloc(exprasmlist,paraloc2);
                   cg.a_param_loc(exprasmlist,right.location,paraloc2);
                 end
@@ -830,22 +819,21 @@ implementation
                    else
                      cg.a_param_const(exprasmlist,OS_INT,0,paraloc2);
                 end;
-              location_release(exprasmlist,left.location);
               paramanager.allocparaloc(exprasmlist,paraloc1);
               cg.a_param_loc(exprasmlist,left.location,paraloc1);
               paramanager.freeparaloc(exprasmlist,paraloc1);
               paramanager.freeparaloc(exprasmlist,paraloc2);
               paramanager.freeparaloc(exprasmlist,paraloc3);
-              cg.allocexplicitregisters(exprasmlist,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
+              cg.alloccpuregisters(exprasmlist,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
               cg.a_call_name(exprasmlist,'FPC_RAISEEXCEPTION');
-              cg.deallocexplicitregisters(exprasmlist,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
+              cg.dealloccpuregisters(exprasmlist,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
            end
          else
            begin
-              cg.allocexplicitregisters(exprasmlist,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
+              cg.alloccpuregisters(exprasmlist,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
               cg.a_call_name(exprasmlist,'FPC_POPADDRSTACK');
               cg.a_call_name(exprasmlist,'FPC_RERAISE');
-              cg.deallocexplicitregisters(exprasmlist,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
+              cg.dealloccpuregisters(exprasmlist,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
            end;
          paraloc1.done;
          paraloc2.done;
@@ -867,17 +855,17 @@ implementation
       var
         paraloc1 : tcgpara;
       begin
-         cg.allocexplicitregisters(exprasmlist,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
+         cg.alloccpuregisters(exprasmlist,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
          cg.a_call_name(exprasmlist,'FPC_POPOBJECTSTACK');
-         cg.deallocexplicitregisters(exprasmlist,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
+         cg.dealloccpuregisters(exprasmlist,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
          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.allocexplicitregisters(exprasmlist,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
+         cg.alloccpuregisters(exprasmlist,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
          cg.a_call_name(exprasmlist,'FPC_DESTROYEXCEPTION');
-         cg.deallocexplicitregisters(exprasmlist,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
+         cg.dealloccpuregisters(exprasmlist,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
          paraloc1.done;
       end;
 
@@ -989,9 +977,9 @@ implementation
               paramanager.allocparaloc(exprasmlist,paraloc1);
               cg.a_param_const(exprasmlist,OS_ADDR,-1,paraloc1);
               paramanager.freeparaloc(exprasmlist,paraloc1);
-              cg.allocexplicitregisters(exprasmlist,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
+              cg.alloccpuregisters(exprasmlist,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
               cg.a_call_name(exprasmlist,'FPC_CATCHES');
-              cg.deallocexplicitregisters(exprasmlist,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
+              cg.dealloccpuregisters(exprasmlist,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
               paraloc1.done;
 
               { the destruction of the exception object must be also }
@@ -1011,18 +999,18 @@ implementation
 
               free_exception(exprasmlist,destroytemps,0,doobjectdestroy,false);
 
-              cg.allocexplicitregisters(exprasmlist,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
+              cg.alloccpuregisters(exprasmlist,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
               cg.a_call_name(exprasmlist,'FPC_POPSECONDOBJECTSTACK');
-              cg.deallocexplicitregisters(exprasmlist,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
+              cg.dealloccpuregisters(exprasmlist,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
 
               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.allocexplicitregisters(exprasmlist,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
+              cg.alloccpuregisters(exprasmlist,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
               cg.a_call_name(exprasmlist,'FPC_DESTROYEXCEPTION');
-              cg.deallocexplicitregisters(exprasmlist,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
+              cg.dealloccpuregisters(exprasmlist,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
               paraloc1.done;
               { we don't need to restore esi here because reraise never }
               { returns                                                 }
@@ -1045,9 +1033,9 @@ implementation
               cg.a_label(exprasmlist,exitexceptlabel);
               { we must also destroy the address frame which guards }
               { exception object                                    }
-              cg.allocexplicitregisters(exprasmlist,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
+              cg.alloccpuregisters(exprasmlist,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
               cg.a_call_name(exprasmlist,'FPC_POPADDRSTACK');
-              cg.deallocexplicitregisters(exprasmlist,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
+              cg.dealloccpuregisters(exprasmlist,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
               cg.g_exception_reason_load(exprasmlist,excepttemps.reasonbuf);
               cleanupobjectstack;
               cg.a_jmp_always(exprasmlist,oldaktexitlabel);
@@ -1058,9 +1046,9 @@ implementation
               cg.a_label(exprasmlist,breakexceptlabel);
               { we must also destroy the address frame which guards }
               { exception object                                    }
-              cg.allocexplicitregisters(exprasmlist,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
+              cg.alloccpuregisters(exprasmlist,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
               cg.a_call_name(exprasmlist,'FPC_POPADDRSTACK');
-              cg.deallocexplicitregisters(exprasmlist,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
+              cg.dealloccpuregisters(exprasmlist,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
               cg.g_exception_reason_load(exprasmlist,excepttemps.reasonbuf);
               cleanupobjectstack;
               cg.a_jmp_always(exprasmlist,oldaktbreaklabel);
@@ -1071,9 +1059,9 @@ implementation
               cg.a_label(exprasmlist,continueexceptlabel);
               { we must also destroy the address frame which guards }
               { exception object                                    }
-              cg.allocexplicitregisters(exprasmlist,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
+              cg.alloccpuregisters(exprasmlist,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
               cg.a_call_name(exprasmlist,'FPC_POPADDRSTACK');
-              cg.deallocexplicitregisters(exprasmlist,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
+              cg.dealloccpuregisters(exprasmlist,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
               cg.g_exception_reason_load(exprasmlist,excepttemps.reasonbuf);
               cleanupobjectstack;
               cg.a_jmp_always(exprasmlist,oldaktcontinuelabel);
@@ -1083,9 +1071,9 @@ implementation
            begin
               { do some magic for exit in the try block }
               cg.a_label(exprasmlist,exittrylabel);
-              cg.allocexplicitregisters(exprasmlist,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
+              cg.alloccpuregisters(exprasmlist,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
               cg.a_call_name(exprasmlist,'FPC_POPADDRSTACK');
-              cg.deallocexplicitregisters(exprasmlist,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
+              cg.dealloccpuregisters(exprasmlist,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
               cg.g_exception_reason_load(exprasmlist,excepttemps.reasonbuf);
               cg.a_jmp_always(exprasmlist,oldaktexitlabel);
            end;
@@ -1093,9 +1081,9 @@ implementation
          if fc_break in tryflowcontrol then
            begin
               cg.a_label(exprasmlist,breaktrylabel);
-              cg.allocexplicitregisters(exprasmlist,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
+              cg.alloccpuregisters(exprasmlist,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
               cg.a_call_name(exprasmlist,'FPC_POPADDRSTACK');
-              cg.deallocexplicitregisters(exprasmlist,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
+              cg.dealloccpuregisters(exprasmlist,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
               cg.g_exception_reason_load(exprasmlist,excepttemps.reasonbuf);
               cg.a_jmp_always(exprasmlist,oldaktbreaklabel);
            end;
@@ -1103,9 +1091,9 @@ implementation
          if fc_continue in tryflowcontrol then
            begin
               cg.a_label(exprasmlist,continuetrylabel);
-              cg.allocexplicitregisters(exprasmlist,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
+              cg.alloccpuregisters(exprasmlist,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
               cg.a_call_name(exprasmlist,'FPC_POPADDRSTACK');
-              cg.deallocexplicitregisters(exprasmlist,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
+              cg.dealloccpuregisters(exprasmlist,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
               cg.g_exception_reason_load(exprasmlist,excepttemps.reasonbuf);
               cg.a_jmp_always(exprasmlist,oldaktcontinuelabel);
            end;
@@ -1160,9 +1148,9 @@ implementation
          paramanager.allocparaloc(exprasmlist,paraloc1);
          cg.a_paramaddr_ref(exprasmlist,href2,paraloc1);
          paramanager.freeparaloc(exprasmlist,paraloc1);
-         cg.allocexplicitregisters(exprasmlist,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
+         cg.alloccpuregisters(exprasmlist,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
          cg.a_call_name(exprasmlist,'FPC_CATCHES');
-         cg.deallocexplicitregisters(exprasmlist,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
+         cg.dealloccpuregisters(exprasmlist,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
 
          { 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);
@@ -1213,16 +1201,16 @@ implementation
 
          free_exception(exprasmlist,excepttemps,0,doobjectdestroy,false);
 
-         cg.allocexplicitregisters(exprasmlist,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
+         cg.alloccpuregisters(exprasmlist,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
          cg.a_call_name(exprasmlist,'FPC_POPSECONDOBJECTSTACK');
-         cg.deallocexplicitregisters(exprasmlist,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
+         cg.dealloccpuregisters(exprasmlist,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
          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.allocexplicitregisters(exprasmlist,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
+         cg.alloccpuregisters(exprasmlist,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
          cg.a_call_name(exprasmlist,'FPC_DESTROYEXCEPTION');
-         cg.deallocexplicitregisters(exprasmlist,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
+         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.a_call_name(exprasmlist,'FPC_RERAISE');
@@ -1454,7 +1442,13 @@ begin
 end.
 {
   $Log$
-  Revision 1.98  2004-09-21 17:25:12  peter
+  Revision 1.99  2004-09-25 14:23:54  peter
+    * ungetregister is now only used for cpuregisters, renamed to
+      ungetcpuregister
+    * renamed (get|unget)explicitregister(s) to ..cpuregister
+    * removed location-release/reference_release
+
+  Revision 1.98  2004/09/21 17:25:12  peter
     * paraloc branch merged
 
   Revision 1.97.4.2  2004/09/12 18:30:48  peter

+ 9 - 12
compiler/ncginl.pas

@@ -227,9 +227,9 @@ implementation
        paramanager.freeparaloc(exprasmlist,paraloc2);
        paramanager.freeparaloc(exprasmlist,paraloc3);
        paramanager.freeparaloc(exprasmlist,paraloc4);
-       cg.allocexplicitregisters(exprasmlist,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
+       cg.alloccpuregisters(exprasmlist,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
        cg.a_call_name(exprasmlist,'FPC_ASSERT');
-       cg.deallocexplicitregisters(exprasmlist,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
+       cg.dealloccpuregisters(exprasmlist,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
        cg.a_label(exprasmlist,truelabel);
        truelabel:=otlabel;
        falselabel:=oflabel;
@@ -265,7 +265,6 @@ implementation
         else
           begin
             secondpass(left);
-            location_release(exprasmlist,left.location);
             hregister:=cg.getaddressregister(exprasmlist);
 
             { handle self inside a method of a class }
@@ -311,7 +310,6 @@ implementation
         if inlinenumber=in_sizeof_x then
            begin
              reference_reset_base(href,hregister,0);
-             cg.ungetregister(exprasmlist,hregister);
              hregister:=cg.getintregister(exprasmlist,OS_INT);
              cg.a_load_ref_reg(exprasmlist,OS_INT,OS_INT,href,hregister);
            end;
@@ -459,9 +457,7 @@ implementation
 {$endif cpu64bit}
                  cg.a_op_reg_loc(exprasmlist,addsubop[inlinenumber],
                    hregister,tcallparanode(left).left.location);
-               location_release(exprasmlist,tcallparanode(tcallparanode(left).right).left.location);
              end;
-          location_release(exprasmlist,tcallparanode(left).left.location);
           cg.g_overflowcheck(exprasmlist,tcallparanode(left).left.location,tcallparanode(left).resulttype.def);
           cg.g_rangecheck(exprasmlist,tcallparanode(left).left.location,tcallparanode(left).left.resulttype.def,
               tcallparanode(left).left.resulttype.def);
@@ -518,7 +514,6 @@ implementation
                     inc(tcallparanode(left).left.location.reference.offset,
                       (tordconstnode(tcallparanode(tcallparanode(left).right).left).value div bitsperop)*tcgsize2size[opsize]);
                     cg.a_op_const_ref(exprasmlist,cgop,opsize,l,tcallparanode(left).left.location.reference);
-                    location_release(exprasmlist,tcallparanode(left).left.location);
                   end;
                 LOC_CREGISTER :
                   cg.a_op_const_reg(exprasmlist,cgop,tcallparanode(left).left.location.size,l,tcallparanode(left).left.location.register);
@@ -594,7 +589,6 @@ implementation
                   { calculate the correct address of the operand }
                   cg.a_loadaddr_ref_reg(exprasmlist, tcallparanode(left).left.location.reference,addrreg);
                   cg.a_op_reg_reg(exprasmlist, OP_ADD, OS_ADDR, addrreg2, addrreg);
-                  cg.ungetregister(exprasmlist,addrreg2);
 
                   { hregister contains the bitnumber to add }
                   cg.a_load_const_reg(exprasmlist, opsize, 1, hregister2);
@@ -610,10 +604,7 @@ implementation
                       cg.a_op_reg_reg(exprasmlist, OP_NOT, opsize, hregister2, hregister2);
                       cg.a_op_reg_ref(exprasmlist, OP_AND, opsize, hregister2, href);
                     end;
-                  cg.ungetregister(exprasmlist,addrreg);
                 end;
-              cg.ungetregister(exprasmlist,hregister);
-              cg.ungetregister(exprasmlist,hregister2);
             end;
         end;
 
@@ -694,7 +685,13 @@ end.
 
 {
   $Log$
-  Revision 1.63  2004-09-21 17:25:12  peter
+  Revision 1.64  2004-09-25 14:23:54  peter
+    * ungetregister is now only used for cpuregisters, renamed to
+      ungetcpuregister
+    * renamed (get|unget)explicitregister(s) to ..cpuregister
+    * removed location-release/reference_release
+
+  Revision 1.63  2004/09/21 17:25:12  peter
     * paraloc branch merged
 
   Revision 1.62.4.1  2004/08/31 20:43:06  peter

+ 31 - 63
compiler/ncgld.pas

@@ -169,7 +169,6 @@ implementation
                        hregister:=cg.getaddressregister(exprasmlist);
                        reference_reset_symbol(href,objectlibrary.newasmsymbol('FPC_THREADVAR_RELOCATE',AB_EXTERNAL,AT_DATA),0);
                        cg.a_load_ref_reg(exprasmlist,OS_ADDR,OS_ADDR,href,hregister);
-                       cg.ungetregister(exprasmlist,hregister);
                        cg.a_cmp_const_reg_label(exprasmlist,OS_ADDR,OC_EQ,0,hregister,norelocatelab);
                        { don't save the allocated register else the result will be destroyed later }
                        reference_reset_symbol(href,objectlibrary.newasmsymbol(tvarsym(symtableentry).mangledname,AB_EXTERNAL,AT_DATA),0);
@@ -177,11 +176,11 @@ implementation
                        cg.a_param_ref(exprasmlist,OS_ADDR,href,paraloc1);
                        paramanager.freeparaloc(exprasmlist,paraloc1);
                        paraloc1.done;
-                       cg.allocexplicitregisters(exprasmlist,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
+                       cg.alloccpuregisters(exprasmlist,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
                        cg.a_call_reg(exprasmlist,hregister);
-                       cg.deallocexplicitregisters(exprasmlist,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
-                       cg.getexplicitregister(exprasmlist,NR_FUNCTION_RESULT_REG);
-                       cg.ungetregister(exprasmlist,NR_FUNCTION_RESULT_REG);
+                       cg.dealloccpuregisters(exprasmlist,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
+                       cg.getcpuregister(exprasmlist,NR_FUNCTION_RESULT_REG);
+                       cg.ungetcpuregister(exprasmlist,NR_FUNCTION_RESULT_REG);
                        hregister:=cg.getaddressregister(exprasmlist);
                        cg.a_load_reg_reg(exprasmlist,OS_INT,OS_ADDR,NR_FUNCTION_RESULT_REG,hregister);
                        cg.a_jmp_always(exprasmlist,endrelocatelab);
@@ -318,7 +317,6 @@ implementation
                          LOC_CREFERENCE,
                          LOC_REFERENCE:
                            begin
-                              location_release(exprasmlist,left.location);
                               hregister:=cg.getaddressregister(exprasmlist);
                               if is_class_or_interface(left.resulttype.def) then
                                 cg.a_load_ref_reg(exprasmlist,OS_ADDR,OS_ADDR,left.location.reference,hregister)
@@ -340,32 +338,22 @@ implementation
                         begin
                           { load vmt pointer }
                           reference_reset_base(href,hregister,0);
-                          reference_release(exprasmlist,href);
                           hregister:=cg.getaddressregister(exprasmlist);
                           cg.a_load_ref_reg(exprasmlist,OS_ADDR,OS_ADDR,href,hregister);
-
-
-                          reference_reset_base(href,hregister,
-                              procdef._class.vmtmethodoffset(procdef.extnumber));
-                          reference_release(exprasmlist,href);
-
                           { load method address }
+                          reference_reset_base(href,hregister,procdef._class.vmtmethodoffset(procdef.extnumber));
                           hregister:=cg.getaddressregister(exprasmlist);
                           cg.a_load_ref_reg(exprasmlist,OS_ADDR,OS_ADDR,href,hregister);
                           { ... and store it }
                           cg.a_load_reg_ref(exprasmlist,OS_ADDR,OS_ADDR,hregister,location.reference);
-                          cg.ungetregister(exprasmlist,hregister);
                         end
                       else
                         begin
-                          { we don't use the hregister }
-                          cg.ungetregister(exprasmlist,hregister);
                           { load address of the function }
                           reference_reset_symbol(href,objectlibrary.newasmsymbol(procdef.mangledname,AB_EXTERNAL,AT_FUNCTION),0);
                           hregister:=cg.getaddressregister(exprasmlist);
                           cg.a_loadaddr_ref_reg(exprasmlist,href,hregister);
                           cg.a_load_reg_ref(exprasmlist,OS_ADDR,OS_ADDR,hregister,location.reference);
-                          cg.ungetregister(exprasmlist,hregister);
                         end;
                     end
                   else
@@ -576,18 +564,10 @@ implementation
                         cgsize:=def_cgsize(left.resulttype.def);
 {$ifndef cpu64bit}
                         if cgsize in [OS_64,OS_S64] then
-                          begin
-                            cg64.a_load64_ref_reg(exprasmlist,
-                               right.location.reference,left.location.register64);
-                            location_release(exprasmlist,right.location);
-                          end
+                          cg64.a_load64_ref_reg(exprasmlist,right.location.reference,left.location.register64)
                         else
 {$endif cpu64bit}
-                          begin
-                            location_release(exprasmlist,right.location);
-                            cg.a_load_ref_reg(exprasmlist,cgsize,cgsize,
-                                right.location.reference,left.location.register);
-                          end;
+                          cg.a_load_ref_reg(exprasmlist,cgsize,cgsize,right.location.reference,left.location.register);
                       end;
                     LOC_CFPUREGISTER :
                       begin
@@ -605,10 +585,10 @@ implementation
                         if (right.location.reference.offset mod sizeof(aint)<>0) and
                            (len>sizeof(aint)) then
                           cg.g_concatcopy_unaligned(exprasmlist,right.location.reference,
-                              left.location.reference,len,false,false)
+                              left.location.reference,len,false)
                         else
                           cg.g_concatcopy(exprasmlist,right.location.reference,
-                              left.location.reference,len,false,false);
+                              left.location.reference,len,false);
                       end;
                     else
                       internalerror(200203284);
@@ -679,7 +659,6 @@ implementation
                   if codegenerror then
                     exit;
                   cg.a_load_const_loc(exprasmlist,1,left.location);
-                  location_release(exprasmlist,left.location);
                   cg.a_jmp_always(exprasmlist,hlabel);
                   { generate the leftnode for the false case }
                   cg.a_label(exprasmlist,falselabel);
@@ -710,11 +689,7 @@ implementation
          end;
 
         if releaseright then
-          begin
-            location_release(exprasmlist,right.location);
-            location_freetemp(exprasmlist,right.location);
-          end;
-        location_release(exprasmlist,left.location);
+          location_freetemp(exprasmlist,right.location);
 
         truelabel:=otlabel;
         falselabel:=oflabel;
@@ -894,19 +869,12 @@ implementation
                  if vaddr then
                   begin
                     location_force_mem(exprasmlist,hp.left.location);
-                    location_release(exprasmlist,hp.left.location);
                     tmpreg:=cg.getaddressregister(exprasmlist);
                     cg.a_loadaddr_ref_reg(exprasmlist,hp.left.location.reference,tmpreg);
-                    cg.ungetregister(exprasmlist,tmpreg);
                     cg.a_load_reg_ref(exprasmlist,OS_ADDR,OS_ADDR,tmpreg,href);
-                    if freetemp then
-                      location_freetemp(exprasmlist,hp.left.location);
                   end
                  else
-                  begin
-                    location_release(exprasmlist,hp.left.location);
-                    cg.a_load_loc_ref(exprasmlist,OS_ADDR,hp.left.location,href);
-                  end;
+                  cg.a_load_loc_ref(exprasmlist,OS_ADDR,hp.left.location,href);
                  { update href to the vtype field and write it }
                  dec(href.offset,sizeof(aint));
                  cg.a_load_const_ref(exprasmlist, OS_INT,vtype,href);
@@ -916,45 +884,39 @@ implementation
               else
               { normal array constructor of the same type }
                begin
-                 if is_ansistring(left.resulttype.def) or
-                    is_widestring(left.resulttype.def) or
-                    (left.resulttype.def.deftype=variantdef) then
-                   freetemp:=false;
+                 if not(
+                        is_ansistring(left.resulttype.def) or
+                        is_widestring(left.resulttype.def) or
+                        (left.resulttype.def.deftype=variantdef)
+                       ) then
+                   freetemp:=true;
                  case hp.left.location.loc of
                    LOC_FPUREGISTER,
                    LOC_CFPUREGISTER :
-                     begin
-                       location_release(exprasmlist,hp.left.location);
-                       cg.a_loadfpu_reg_ref(exprasmlist,hp.left.location.size,hp.left.location.register,href);
-                     end;
+                     cg.a_loadfpu_reg_ref(exprasmlist,hp.left.location.size,hp.left.location.register,href);
                    LOC_REFERENCE,
                    LOC_CREFERENCE :
                      begin
-                       location_release(exprasmlist,hp.left.location);
                        if is_shortstring(hp.left.resulttype.def) then
                          cg.g_copyshortstring(exprasmlist,hp.left.location.reference,href,
-                                              Tstringdef(hp.left.resulttype.def).len,freetemp,false)
+                                              Tstringdef(hp.left.resulttype.def).len,false)
                        else
-                         cg.g_concatcopy(exprasmlist,hp.left.location.reference,href,elesize,freetemp,false);
+                         cg.g_concatcopy(exprasmlist,hp.left.location.reference,href,elesize,false);
                      end;
                    else
                      begin
 {$ifndef cpu64bit}
                        if hp.left.location.size in [OS_64,OS_S64] then
-                         begin
-                           cg64.a_load64_loc_ref(exprasmlist,hp.left.location,href);
-                           location_release(exprasmlist,hp.left.location);
-                         end
+                         cg64.a_load64_loc_ref(exprasmlist,hp.left.location,href)
                        else
 {$endif cpu64bit}
-                         begin
-                           location_release(exprasmlist,hp.left.location);
-                           cg.a_load_loc_ref(exprasmlist,hp.left.location.size,hp.left.location,href);
-                         end;
+                         cg.a_load_loc_ref(exprasmlist,hp.left.location.size,hp.left.location,href);
                      end;
                  end;
                  inc(href.offset,elesize);
                end;
+              if freetemp then
+                location_freetemp(exprasmlist,hp.left.location);
             end;
            { load next entry }
            hp:=tarrayconstructornode(hp.right);
@@ -968,7 +930,13 @@ begin
 end.
 {
   $Log$
-  Revision 1.124  2004-09-21 17:25:12  peter
+  Revision 1.125  2004-09-25 14:23:54  peter
+    * ungetregister is now only used for cpuregisters, renamed to
+      ungetcpuregister
+    * renamed (get|unget)explicitregister(s) to ..cpuregister
+    * removed location-release/reference_release
+
+  Revision 1.124  2004/09/21 17:25:12  peter
     * paraloc branch merged
 
   Revision 1.123  2004/09/13 20:33:41  peter

+ 7 - 11
compiler/ncgmat.pas

@@ -192,7 +192,6 @@ implementation
           LOC_REFERENCE,
           LOC_CREFERENCE :
             begin
-              reference_release(exprasmlist,left.location.reference);
               location.register:=cg.getfpuregister(exprasmlist,location.size);
               cg.a_loadfpu_ref_reg(exprasmlist,
                  def_cgsize(left.resulttype.def),
@@ -325,8 +324,6 @@ implementation
                   { only used for temporary }
                   { purposes                }
                   hdenom := cg.getintregister(exprasmlist,OS_INT);
-                  if right.location.loc<>LOC_CREGISTER then
-                   location_release(exprasmlist,right.location);
                   cg.a_load_loc_reg(exprasmlist,right.location.size,right.location,hdenom);
                   { verify if the divisor is zero, if so return an error
                     immediately
@@ -369,11 +366,9 @@ implementation
 
     procedure tcgshlshrnode.second_integer;
       var
-         freescratch : boolean;
          op : topcg;
          hcountreg : tregister;
       begin
-         freescratch:=false;
          { determine operator }
          case nodetype of
            shln: op:=OP_SHL;
@@ -406,16 +401,11 @@ implementation
               if right.location.loc<>LOC_REGISTER then
                 begin
                   hcountreg:=cg.getintregister(exprasmlist,OS_INT);
-                  freescratch := true;
                   cg.a_load_loc_reg(exprasmlist,right.location.size,right.location,hcountreg);
                 end
               else
                 hcountreg:=right.location.register;
               cg.a_op_reg_reg(exprasmlist,op,OS_INT,hcountreg,location.register);
-              if right.location.loc<>LOC_REGISTER then
-                location_release(exprasmlist,right.location);
-              if freescratch then
-                cg.ungetregister(exprasmlist,hcountreg);
            end;
       end;
 
@@ -483,7 +473,13 @@ begin
 end.
 {
   $Log$
-  Revision 1.28  2004-09-21 17:25:12  peter
+  Revision 1.29  2004-09-25 14:23:54  peter
+    * ungetregister is now only used for cpuregisters, renamed to
+      ungetcpuregister
+    * renamed (get|unget)explicitregister(s) to ..cpuregister
+    * removed location-release/reference_release
+
+  Revision 1.28  2004/09/21 17:25:12  peter
     * paraloc branch merged
 
   Revision 1.27.4.1  2004/08/31 20:43:06  peter

+ 21 - 31
compiler/ncgmem.pas

@@ -113,7 +113,6 @@ implementation
                   LOC_CREFERENCE,
                   LOC_REFERENCE:
                     begin
-                       location_release(exprasmlist,left.location);
                        reference_reset_base(href,cg.getaddressregister(exprasmlist),tobjectdef(left.resulttype.def).vmt_offset);
                        cg.a_loadaddr_ref_reg(exprasmlist,left.location.reference,href.base);
                     end;
@@ -129,7 +128,6 @@ implementation
                     {$ifdef cpu_uses_separate_address_registers}
                       if getregtype(left.location.register)<>R_ADDRESSREGISTER then
                         begin
-                          location_release(exprasmlist,left.location);
                           reference_reset_base(href,cg.getaddressregister(exprasmlist),tobjectdef(left.resulttype.def).vmt_offset);
                           cg.a_load_reg_reg(exprasmlist,OS_ADDR,OS_ADDR,left.location.register,href.base);
                         end
@@ -141,7 +139,6 @@ implementation
                   LOC_CREFERENCE,
                   LOC_REFERENCE:
                     begin
-                       location_release(exprasmlist,left.location);
                        reference_reset_base(href,cg.getaddressregister(exprasmlist),tobjectdef(left.resulttype.def).vmt_offset);
                        cg.a_load_loc_reg(exprasmlist,OS_ADDR,left.location,href.base);
                     end;
@@ -149,7 +146,6 @@ implementation
                     internalerror(200305057);
                end;
              end;
-            reference_release(exprasmlist,href);
             location.register:=cg.getaddressregister(exprasmlist);
             cg.g_maybe_testself(exprasmlist,href.base);
             cg.a_load_ref_reg(exprasmlist,OS_ADDR,OS_ADDR,href,location.register);
@@ -223,7 +219,6 @@ implementation
             exit;
           end;
 
-         location_release(exprasmlist,left.location);
          location_reset(location,LOC_REGISTER,OS_ADDR);
          location.register:=cg.getaddressregister(exprasmlist);
          { @ on a procvar means returning an address to the procedure that
@@ -255,7 +250,6 @@ implementation
               {$ifdef cpu_uses_separate_address_registers}
                 if getregtype(left.location.register)<>R_ADDRESSREGISTER then
                   begin
-                    location_release(exprasmlist,left.location);
                     location.reference.base := cg.getaddressregister(exprasmlist);
                     cg.a_load_reg_reg(exprasmlist,OS_ADDR,OS_ADDR,left.location.register,
                       location.reference.base);
@@ -268,7 +262,6 @@ implementation
             LOC_CREFERENCE,
             LOC_REFERENCE:
               begin
-                 location_release(exprasmlist,left.location);
                  location.reference.base:=cg.getaddressregister(exprasmlist);
                  cg.a_load_loc_reg(exprasmlist,OS_ADDR,left.location,location.reference.base);
               end;
@@ -284,9 +277,9 @@ implementation
             cg.a_param_reg(exprasmlist, OS_ADDR,location.reference.base,paraloc1);
             paramanager.freeparaloc(exprasmlist,paraloc1);
             paraloc1.done;
-            cg.allocexplicitregisters(exprasmlist,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
+            cg.alloccpuregisters(exprasmlist,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
             cg.a_call_name(exprasmlist,'FPC_CHECKPOINTER');
-            cg.deallocexplicitregisters(exprasmlist,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
+            cg.dealloccpuregisters(exprasmlist,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
           end;
       end;
 
@@ -314,7 +307,6 @@ implementation
                   {$ifdef cpu_uses_separate_address_registers}
                     if getregtype(left.location.register)<>R_ADDRESSREGISTER then
                       begin
-                        location_release(exprasmlist,left.location);
                         location.reference.base:=rg.getaddressregister(exprasmlist);
                         cg.a_load_reg_reg(exprasmlist,OS_ADDR,OS_ADDR,
                           left.location.register,location.reference.base);
@@ -326,7 +318,6 @@ implementation
                 LOC_CREFERENCE,
                 LOC_REFERENCE:
                   begin
-                     location_release(exprasmlist,left.location);
                      location.reference.base:=cg.getaddressregister(exprasmlist);
                      cg.a_load_loc_reg(exprasmlist,OS_ADDR,left.location,location.reference.base);
                   end;
@@ -340,9 +331,9 @@ implementation
                 paramanager.allocparaloc(exprasmlist,paraloc1);
                 cg.a_param_reg(exprasmlist, OS_ADDR,location.reference.base,paraloc1);
                 paramanager.freeparaloc(exprasmlist,paraloc1);
-                cg.allocexplicitregisters(exprasmlist,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
+                cg.alloccpuregisters(exprasmlist,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
                 cg.a_call_name(exprasmlist,'FPC_CHECKPOINTER');
-                cg.deallocexplicitregisters(exprasmlist,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
+                cg.dealloccpuregisters(exprasmlist,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
               end;
            end
          else if is_interfacecom(left.resulttype.def) then
@@ -358,9 +349,9 @@ implementation
                 paramanager.allocparaloc(exprasmlist,paraloc1);
                 cg.a_param_reg(exprasmlist, OS_ADDR,location.reference.base,paraloc1);
                 paramanager.freeparaloc(exprasmlist,paraloc1);
-                cg.allocexplicitregisters(exprasmlist,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
+                cg.alloccpuregisters(exprasmlist,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
                 cg.a_call_name(exprasmlist,'FPC_CHECKPOINTER');
-                cg.deallocexplicitregisters(exprasmlist,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
+                cg.dealloccpuregisters(exprasmlist,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
               end;
            end
          else
@@ -400,7 +391,6 @@ implementation
             else
               refnode:=withrefnode;
             secondpass(refnode);
-            location_release(exprasmlist,refnode.location);
             location_freetemp(exprasmlist,refnode.location);
             if not(refnode.location.loc in [LOC_REFERENCE,LOC_CREFERENCE]) then
               internalerror(2003092810);
@@ -482,7 +472,6 @@ implementation
           end
          else
           begin
-            cg.ungetreference(exprasmlist,location.reference);
             hreg := cg.getaddressregister(exprasmlist);
             cg.a_loadaddr_ref_reg(exprasmlist,location.reference,hreg);
             reference_reset_base(location.reference,hreg,0);
@@ -540,10 +529,7 @@ implementation
                objectlibrary.getlabel(neglabel);
                objectlibrary.getlabel(poslabel);
                cg.a_cmp_const_reg_label(exprasmlist,OS_INT,OC_LT,0,hreg,poslabel);
-               location_release(exprasmlist,hightree.location);
                cg.a_cmp_loc_reg_label(exprasmlist,OS_INT,OC_BE,hightree.location,hreg,neglabel);
-               if freereg then
-                 cg.ungetregister(exprasmlist,hreg);
                cg.a_label(exprasmlist,poslabel);
                cg.a_call_name(exprasmlist,'FPC_RANGEERROR');
                cg.a_label(exprasmlist,neglabel);
@@ -562,9 +548,9 @@ implementation
                cg.a_param_loc(exprasmlist,left.location,paraloc1);
                paramanager.freeparaloc(exprasmlist,paraloc1);
                paramanager.freeparaloc(exprasmlist,paraloc2);
-               cg.allocexplicitregisters(exprasmlist,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
+               cg.alloccpuregisters(exprasmlist,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
                cg.a_call_name(exprasmlist,'FPC_DYNARRAY_RANGECHECK');
-               cg.deallocexplicitregisters(exprasmlist,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
+               cg.dealloccpuregisters(exprasmlist,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
             end
          else
            cg.g_rangecheck(exprasmlist,right.location,right.resulttype.def,left.resulttype.def);
@@ -612,7 +598,6 @@ implementation
                 LOC_CREFERENCE,
                 LOC_REFERENCE :
                   begin
-                    location_release(exprasmlist,left.location);
                     location.reference.base:=cg.getaddressregister(exprasmlist);
                     cg.a_load_ref_reg(exprasmlist,OS_ADDR,OS_ADDR,left.location.reference,location.reference.base);
                   end;
@@ -628,9 +613,9 @@ implementation
                    paramanager.allocparaloc(exprasmlist,paraloc1);
                    cg.a_param_reg(exprasmlist,OS_ADDR,location.reference.base,paraloc1);
                    paramanager.freeparaloc(exprasmlist,paraloc1);
-                   cg.allocexplicitregisters(exprasmlist,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
+                   cg.alloccpuregisters(exprasmlist,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
                    cg.a_call_name(exprasmlist,'FPC_'+upper(tstringdef(left.resulttype.def).stringtypname)+'_CHECKZERO');
-                   cg.deallocexplicitregisters(exprasmlist,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
+                   cg.dealloccpuregisters(exprasmlist,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
                 end;
 
               { in ansistrings/widestrings S[1] is p<w>char(S)[0] !! }
@@ -649,7 +634,6 @@ implementation
                 LOC_REFERENCE,
                 LOC_CREFERENCE :
                   begin
-                     location_release(exprasmlist,left.location);
                      location.reference.base:=cg.getaddressregister(exprasmlist);
                      cg.a_load_ref_reg(exprasmlist,OS_ADDR,OS_ADDR,
                       left.location.reference,location.reference.base);
@@ -718,9 +702,9 @@ implementation
                               cg.a_param_ref(exprasmlist,OS_INT,href,paraloc1);
                               paramanager.freeparaloc(exprasmlist,paraloc1);
                               paramanager.freeparaloc(exprasmlist,paraloc2);
-                              cg.allocexplicitregisters(exprasmlist,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
+                              cg.alloccpuregisters(exprasmlist,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
                               cg.a_call_name(exprasmlist,'FPC_'+upper(tstringdef(left.resulttype.def).stringtypname)+'_RANGECHECK');
-                              cg.deallocexplicitregisters(exprasmlist,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
+                              cg.dealloccpuregisters(exprasmlist,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
                            end;
 
                          st_shortstring:
@@ -857,9 +841,9 @@ implementation
                               cg.a_param_ref(exprasmlist,OS_INT,href,paraloc1);
                               paramanager.freeparaloc(exprasmlist,paraloc1);
                               paramanager.freeparaloc(exprasmlist,paraloc2);
-                              cg.allocexplicitregisters(exprasmlist,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
+                              cg.alloccpuregisters(exprasmlist,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
                               cg.a_call_name(exprasmlist,'FPC_'+upper(tstringdef(left.resulttype.def).stringtypname)+'_RANGECHECK');
-                              cg.deallocexplicitregisters(exprasmlist,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
+                              cg.dealloccpuregisters(exprasmlist,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
                            end;
                          st_shortstring:
                            begin
@@ -895,7 +879,13 @@ begin
 end.
 {
   $Log$
-  Revision 1.96  2004-09-21 17:25:12  peter
+  Revision 1.97  2004-09-25 14:23:54  peter
+    * ungetregister is now only used for cpuregisters, renamed to
+      ungetcpuregister
+    * renamed (get|unget)explicitregister(s) to ..cpuregister
+    * removed location-release/reference_release
+
+  Revision 1.96  2004/09/21 17:25:12  peter
     * paraloc branch merged
 
   Revision 1.95.4.1  2004/08/31 20:43:06  peter

+ 8 - 7
compiler/ncgopt.pas

@@ -98,8 +98,7 @@ begin
      not(nf_use_strconcat in flags) then
     begin
        tg.Gettemp(exprasmlist,256,tt_normal,href);
-       cg.g_copyshortstring(exprasmlist,left.location.reference,href,255,true,false);
-       { location is released by copyshortstring }
+       cg.g_copyshortstring(exprasmlist,left.location.reference,href,255,false);
        location_freetemp(exprasmlist,left.location);
        { return temp reference }
        location_reset(left.location,LOC_REFERENCE,def_cgsize(resulttype.def));
@@ -117,8 +116,6 @@ begin
     { no, make sure it is in a register }
     if right.location.loc in [LOC_REFERENCE,LOC_CREFERENCE] then
       begin
-        { free the registers of right }
-        reference_release(exprasmlist,right.location.reference);
         { get register for the char }
         hreg := cg.getintregister(exprasmlist,OS_8);
         cg.a_load_ref_reg(exprasmlist,OS_8,OS_8,right.location.reference,hreg);
@@ -181,7 +178,6 @@ begin
       { no new_reference(href2) because it's only }
       { used once (JM)                            }
       cg.a_load_reg_ref(exprasmlist,OS_8,OS_8,hreg,href2);
-      cg.ungetregister(exprasmlist,hreg);
     end
   else
     cg.a_load_const_ref(exprasmlist,OS_8,tordconstnode(right).value,href2);
@@ -189,7 +185,6 @@ begin
   { increase the string length }
   cg.a_op_const_reg(exprasmlist,OP_ADD,OS_8,1,lengthreg);
   cg.a_load_reg_ref(exprasmlist,OS_8,OS_8,lengthreg,left.location.reference);
-  cg.ungetregister(exprasmlist,lengthreg);
   if checklength then
     cg.a_label(exprasmlist,l);
   location_copy(location,left.location);
@@ -201,7 +196,13 @@ end.
 
 {
   $Log$
-  Revision 1.14  2004-06-20 08:55:29  florian
+  Revision 1.15  2004-09-25 14:23:54  peter
+    * ungetregister is now only used for cpuregisters, renamed to
+      ungetcpuregister
+    * renamed (get|unget)explicitregister(s) to ..cpuregister
+    * removed location-release/reference_release
+
+  Revision 1.14  2004/06/20 08:55:29  florian
     * logs truncated
 
   Revision 1.13  2004/05/22 23:34:28  peter

+ 7 - 29
compiler/ncgset.pas

@@ -351,17 +351,6 @@ implementation
              cg.a_load_const_reg(exprasmlist,location.size,1,location.register);
              { in case value is not found }
              cg.a_label(exprasmlist,l3);
-             case left.location.loc of
-               LOC_CREGISTER :
-                 cg.ungetregister(exprasmlist,pleftreg);
-               LOC_REGISTER :
-                 cg.ungetregister(exprasmlist,pleftreg);
-               else
-                 begin
-                   reference_release(exprasmlist,left.location.reference);
-                   cg.ungetregister(exprasmlist,pleftreg);
-                 end;
-             end;
           end
          else
          {*****************************************************************}
@@ -392,8 +381,6 @@ implementation
                   emit_bit_test_reg_reg(exprasmlist,left.location.size,left.location.register,
                       right.location.register,location.size,location.register);
                 end;
-               location_release(exprasmlist,left.location);
-               location_release(exprasmlist,right.location);
              end
             else
              {************************** NOT SMALL SET ********************}
@@ -423,13 +410,6 @@ implementation
                   cg.a_op_const_reg_reg(exprasmlist,OP_SUB,opsize,32,left.location.register,hr);
                   cg.a_op_const_reg(exprasmlist,OP_SAR,opsize,31,hr);
 
-                  { free registers }
-                  cg.ungetregister(exprasmlist,hr2);
-                  if (left.location.loc in [LOC_CREGISTER]) then
-                    cg.ungetregister(exprasmlist,hr)
-                  else
-                    cg.ungetregister(exprasmlist,left.location.register);
-
                   { if left > 31, then result := 0 else result := result of bit test }
                   cg.a_op_reg_reg(exprasmlist,OP_AND,opsize,hr,hr2);
                   { allocate a register for the result }
@@ -449,7 +429,6 @@ implementation
                   { allocate a register for the result }
                   location.register := cg.getintregister(exprasmlist,location.size);
                   cg.a_load_ref_reg(exprasmlist,OS_8,location.size,right.location.reference, location.register);
-                  location_release(exprasmlist,right.location);
                   cg.a_op_const_reg(exprasmlist,OP_SHR,location.size,tordconstnode(left).value and 7,
                     location.register);
                   cg.a_op_const_reg(exprasmlist,OP_AND,location.size,1,location.register);
@@ -471,22 +450,18 @@ implementation
                     href.index := hr
                   else
                     begin
-                      reference_release(exprasmlist,href);
                       hr2 := cg.getaddressregister(exprasmlist);
                       cg.a_loadaddr_ref_reg(exprasmlist,href, hr2);
                       reference_reset_base(href,hr2,0);
                       href.index := hr;
                     end;
-                  reference_release(exprasmlist,href);
                   { allocate a register for the result }
                   location.register := cg.getintregister(exprasmlist,opsize);
                   cg.a_load_ref_reg(exprasmlist,opsize,opsize,href,location.register);
 
-                  cg.ungetregister(exprasmlist,pleftreg);
                   hr := cg.getintregister(exprasmlist,opsize);
                   cg.a_op_const_reg_reg(exprasmlist,OP_AND,opsize,31,pleftreg,hr);
                   cg.a_op_reg_reg(exprasmlist,OP_SHR,opsize,hr,location.register);
-                  cg.ungetregister(exprasmlist,hr);
                   cg.a_op_const_reg(exprasmlist,OP_AND,opsize,1,location.register);
                 end;
              end;
@@ -591,7 +566,6 @@ implementation
               first:=true;
               scratch_reg:=cg.getintregister(exprasmlist,opsize);
               genitem(hp);
-              cg.ungetregister(exprasmlist,scratch_reg);
               cg.a_jmp_always(exprasmlist,elselabel);
            end;
       end;
@@ -921,8 +895,6 @@ implementation
                 genlinearlist(nodes);
            end;
 
-         cg.ungetregister(exprasmlist,hregister);
-
          { now generate the instructions }
          hp:=tstatementnode(right);
          while assigned(hp) do
@@ -972,7 +944,13 @@ begin
 end.
 {
   $Log$
-  Revision 1.67  2004-08-25 11:51:31  jonas
+  Revision 1.68  2004-09-25 14:23:54  peter
+    * ungetregister is now only used for cpuregisters, renamed to
+      ungetcpuregister
+    * renamed (get|unget)explicitregister(s) to ..cpuregister
+    * removed location-release/reference_release
+
+  Revision 1.67  2004/08/25 11:51:31  jonas
     * fixed rare case bug (see tests/test/tb0478.pp)
 
   Revision 1.66  2004/08/16 21:00:15  peter

+ 46 - 108
compiler/ncgutil.pas

@@ -214,10 +214,7 @@ implementation
                          if (p.location.loc = LOC_CREGISTER) then
                            load_regvar_reg(list,p.location.register);
 {$endif OLDREGVARS}
-                         cg.a_cmp_const_loc_label(list,opsize,OC_NE,
-                           0,p.location,truelabel);
-                         { !!! should happen right after cmp (JM) }
-                         location_release(list,p.location);
+                         cg.a_cmp_const_loc_label(list,opsize,OC_NE,0,p.location,truelabel);
                          cg.a_jmp_always(list,falselabel);
                        end;
                      LOC_JUMP:
@@ -225,8 +222,7 @@ implementation
 {$ifdef cpuflags}
                      LOC_FLAGS :
                        begin
-                         cg.a_jmp_flags(list,p.location.resflags,
-                           truelabel);
+                         cg.a_jmp_flags(list,p.location.resflags,truelabel);
                          cg.a_jmp_always(list,falselabel);
                        end;
 {$endif cpuflags}
@@ -312,17 +308,17 @@ implementation
         paramanager.freeparaloc(list,paraloc3);
         paramanager.freeparaloc(list,paraloc2);
         paramanager.freeparaloc(list,paraloc1);
-        cg.allocexplicitregisters(list,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
+        cg.alloccpuregisters(list,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
         cg.a_call_name(list,'FPC_PUSHEXCEPTADDR');
-        cg.deallocexplicitregisters(list,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
+        cg.dealloccpuregisters(list,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
 
         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.allocexplicitregisters(list,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
+        cg.alloccpuregisters(list,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
         cg.a_call_name(list,'FPC_SETJMP');
-        cg.deallocexplicitregisters(list,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
+        cg.dealloccpuregisters(list,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
 
         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);
@@ -334,9 +330,9 @@ implementation
 
     procedure free_exception(list:TAAsmoutput;const t:texceptiontemps;a:aint;endexceptlabel:tasmlabel;onlyfree:boolean);
      begin
-         cg.allocexplicitregisters(list,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
+         cg.alloccpuregisters(list,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
          cg.a_call_name(list,'FPC_POPADDRSTACK');
-         cg.deallocexplicitregisters(list,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
+         cg.dealloccpuregisters(list,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
 
          if not onlyfree then
           begin
@@ -376,10 +372,7 @@ implementation
                  cg.a_load_reg_reg(list,l.size,OS_32,l.registerlow,hregister);
                end
               else
-               begin
-                 location_release(list,l);
-                 hregister:=cg.getintregister(list,OS_INT);
-               end;
+               hregister:=cg.getintregister(list,OS_INT);
               { load value in low register }
               case l.loc of
                 LOC_FLAGS :
@@ -433,7 +426,6 @@ implementation
                begin
                  hregister:=cg.getintregister(list,OS_INT);
                  hregisterhi:=cg.getintregister(list,OS_INT);
-                 location_release(list,l);
                end;
               hreg64.reglo:=hregister;
               hreg64.reghi:=hregisterhi;
@@ -460,10 +452,7 @@ implementation
               ((l.size = dst_size) or
                (TCGSize2Size[l.size] = TCGSize2Size[OS_INT]));
            if not const_location then
-             begin
-               location_release(list,l);
-               hregister:=cg.getintregister(list,dst_size)
-             end
+             hregister:=cg.getintregister(list,dst_size)
            else
              hregister := l.register;
            { load value in new register }
@@ -528,11 +517,6 @@ implementation
         oldloc : tlocation;
       begin
         oldloc:=l;
-        {Do not bother to recycle the existing register. The register
-         allocator eliminates unnecessary moves, so it's not needed
-         and trying to recycle registers can cause problems because
-         the registers changes size and may need aditional constraints.}
-        location_release(list,l);
         hregister:=cg.getintregister(list,dst_size);
         { load value in new register }
         case l.loc of
@@ -601,14 +585,12 @@ implementation
               begin
                 tg.GetTemp(list,tcgsize2size[l.size],tt_normal,href);
                 cg.a_loadmm_reg_ref(list,l.size,l.size,l.register,href,mms_movescalar);
-                location_release(list,l);
                 location_reset(l,LOC_REFERENCE,l.size);
                 l.reference:=href;
               end;
             reg:=cg.getfpuregister(list,l.size);
             cg.a_loadfpu_loc_reg(list,l,reg);
             location_freetemp(list,l);
-            location_release(list,l);
             location_reset(l,LOC_FPUREGISTER,l.size);
             l.register:=reg;
           end;
@@ -628,14 +610,12 @@ implementation
               begin
                 tg.GetTemp(list,tcgsize2size[l.size],tt_normal,href);
                 cg.a_loadfpu_reg_ref(list,l.size,l.register,href);
-                location_release(list,l);
                 location_reset(l,LOC_REFERENCE,l.size);
                 l.reference:=href;
               end;
             reg:=cg.getmmregister(list,l.size);
             cg.a_loadmm_loc_reg(list,l.size,l,reg,mms_movescalar);
             location_freetemp(list,l);
-            location_release(list,l);
             location_reset(l,LOC_MMREGISTER,l.size);
             l.register:=reg;
           end;
@@ -652,7 +632,6 @@ implementation
             begin
               tg.GetTemp(list,TCGSize2Size[l.size],tt_normal,r);
               cg.a_loadfpu_reg_ref(list,l.size,l.register,r);
-              location_release(list,l);
               location_reset(l,LOC_REFERENCE,l.size);
               l.reference:=r;
             end;
@@ -661,7 +640,6 @@ implementation
             begin
               tg.GetTemp(list,TCGSize2Size[l.size],tt_normal,r);
               cg.a_loadmm_reg_ref(list,l.size,l.size,l.register,r,mms_movescalar);
-              location_release(list,l);
               location_reset(l,LOC_REFERENCE,l.size);
               l.reference:=r;
             end;
@@ -672,16 +650,10 @@ implementation
               tg.GetTemp(list,TCGSize2Size[l.size],tt_normal,r);
 {$ifndef cpu64bit}
               if l.size in [OS_64,OS_S64] then
-                begin
-                  cg64.a_load64_loc_ref(list,l,r);
-                  location_release(list,l);
-                end
+                cg64.a_load64_loc_ref(list,l,r)
               else
 {$endif cpu64bit}
-                begin
-                  location_release(list,l);
-                  cg.a_load_loc_ref(list,l.size,l,r);
-                end;
+                cg.a_load_loc_ref(list,l.size,l,r);
               location_reset(l,LOC_REFERENCE,l.size);
               l.reference:=r;
             end;
@@ -784,10 +756,10 @@ implementation
                     so we're allowed to include pi_do_call here; after pass1 is run, this isn't allowed anymore
                   }
                   include(current_procinfo.flags,pi_do_call);
-                  cg.g_copyshortstring(list,href1,localcopyloc.reference,tstringdef(tvarsym(p).vartype.def).len,false,loadref)
+                  cg.g_copyshortstring(list,href1,localcopyloc.reference,tstringdef(tvarsym(p).vartype.def).len,loadref)
                 end
               else
-                cg.g_concatcopy(list,href1,localcopyloc.reference,tvarsym(p).vartype.def.size,true,loadref);
+                cg.g_concatcopy(list,href1,localcopyloc.reference,tvarsym(p).vartype.def.size,loadref);
               { update localloc of varsym }
               tg.Ungetlocal(list,tvarsym(p).localloc.reference);
               tvarsym(p).localloc:=localcopyloc;
@@ -947,7 +919,6 @@ implementation
                  cg.a_load_ref_reg(list,OS_ADDR,OS_ADDR,href,tmpreg);
                  reference_reset_base(href,tmpreg,0);
                  cg.g_initialize(list,tvarsym(p).vartype.def,href,false);
-                 cg.ungetregister(list,tmpreg);
                end;
            end;
          end;
@@ -1100,8 +1071,8 @@ implementation
                         allocation info }
                       if getsupreg(resloc.registerlow)<first_int_imreg then
                         begin
-                          cg.getexplicitregister(list,resloc.registerlow);
-                          cg.ungetregister(list,resloc.registerlow);
+                          cg.getcpuregister(list,resloc.registerlow);
+                          cg.ungetcpuregister(list,resloc.registerlow);
                           // for the optimizer
                           cg.a_reg_alloc(list,resloc.registerlow);
                         end;
@@ -1120,8 +1091,8 @@ implementation
                       end;
                       if getsupreg(resloc.registerhigh)<first_int_imreg then
                         begin
-                          cg.getexplicitregister(list,resloc.registerhigh);
-                          cg.ungetregister(list,resloc.registerhigh);
+                          cg.getcpuregister(list,resloc.registerhigh);
+                          cg.ungetcpuregister(list,resloc.registerhigh);
                           // for the optimizer
                           cg.a_reg_alloc(list,resloc.registerhigh);
                         end;
@@ -1145,8 +1116,8 @@ implementation
                       hreg:=cg.makeregsize(list,funcretloc^.register,restmploc.size);
                       if getsupreg(funcretloc^.register)<first_int_imreg then
                         begin
-                          cg.getexplicitregister(list,funcretloc^.register);
-                          cg.ungetregister(list,hreg);
+                          cg.getcpuregister(list,funcretloc^.register);
+                          cg.ungetcpuregister(list,hreg);
                           // for the optimizer
                           cg.a_reg_alloc(list,funcretloc^.register);
                         end;
@@ -1157,8 +1128,8 @@ implementation
                 begin
                   if getsupreg(funcretloc^.register)<first_fpu_imreg then
                     begin
-                      cg.getexplicitregister(list,funcretloc^.register);
-                      cg.ungetregister(list,funcretloc^.register);
+                      cg.getcpuregister(list,funcretloc^.register);
+                      cg.ungetcpuregister(list,funcretloc^.register);
                     end;
                   cg.a_loadfpu_loc_reg(list,restmploc,funcretloc^.register);
                 end;
@@ -1166,8 +1137,8 @@ implementation
                 begin
                   if getsupreg(funcretloc^.register)<first_mm_imreg then
                     begin
-                      cg.getexplicitregister(list,funcretloc^.register);
-                      cg.ungetregister(list,funcretloc^.register);
+                      cg.getcpuregister(list,funcretloc^.register);
+                      cg.ungetcpuregister(list,funcretloc^.register);
                     end;
                   cg.a_loadmm_loc_reg(list,restmploc.size,restmploc,funcretloc^.register,mms_movescalar);
                 end;
@@ -1220,20 +1191,19 @@ implementation
                         begin
                           if getregtype(paraloc^.register)=R_INTREGISTER then
                             begin
+                              { Release parameter register }
                               if getsupreg(paraloc^.register)<first_int_imreg then
                                 begin
 {$ifndef cpu64bit}
                                   if assigned(hiparaloc) then
-                                    cg.getexplicitregister(list,hiparaloc^.register);
+                                    begin
+                                      cg.getcpuregister(list,hiparaloc^.register);
+                                      cg.ungetcpuregister(list,hiparaloc^.register);
+                                    end;
 {$endif cpu64bit}
-                                  cg.getexplicitregister(list,paraloc^.register);
+                                  cg.getcpuregister(list,paraloc^.register);
+                                  cg.ungetcpuregister(list,paraloc^.register);
                                 end;
-                              { Release parameter register }
-{$ifndef cpu64bit}
-                              if assigned(hiparaloc) then
-                                cg.ungetregister(list,hiparaloc^.register);
-{$endif cpu64bit}
-                              cg.ungetregister(list,paraloc^.register);
                             end;
                           cg.a_loadany_param_ref(list,hp.paraloc[calleeside],tvarsym(hp.parasym).localloc.reference,mms_movescalar);
                         end;
@@ -1243,17 +1213,6 @@ implementation
                 end;
                 hp:=tparaitem(hp.next);
               end;
-            if gotregvarparas then
-              begin
-                { deallocate all register variables again }
-                hp:=tparaitem(current_procinfo.procdef.para.first);
-                while assigned(hp) do
-                  begin
-                    if (tvarsym(hp.parasym).localloc.loc=LOC_REGISTER) then
-                      cg.ungetregister(list,tvarsym(hp.parasym).localloc.register);
-                    hp:=tparaitem(hp.next);
-                  end;
-              end;
           end;
 
         { generate copies of call by value parameters, must be done before
@@ -1350,9 +1309,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.allocexplicitregisters(list,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_cdecl));
+                cg.alloccpuregisters(list,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_cdecl));
                 cg.g_profilecode(list);
-                cg.deallocexplicitregisters(list,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_cdecl));
+                cg.dealloccpuregisters(list,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_cdecl));
               end;
           end;
 
@@ -1373,15 +1332,15 @@ implementation
               cg.a_paramaddr_ref(list,href,paraloc1);
               paramanager.freeparaloc(list,paraloc2);
               paramanager.freeparaloc(list,paraloc1);
-              cg.allocexplicitregisters(list,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_cdecl));
+              cg.alloccpuregisters(list,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_cdecl));
               cg.a_call_name(list,'_monstartup');
-              cg.deallocexplicitregisters(list,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_cdecl));
+              cg.dealloccpuregisters(list,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_cdecl));
             end;
 
            { initialize units }
-           cg.allocexplicitregisters(list,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
+           cg.alloccpuregisters(list,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
            cg.a_call_name(list,'FPC_INITIALIZEUNITS');
-           cg.deallocexplicitregisters(list,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
+           cg.dealloccpuregisters(list,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
 
 {$ifdef GDB}
            if (cs_debuginfo in aktmoduleswitches) then
@@ -1608,9 +1567,9 @@ implementation
              paramanager.allocparaloc(list,paraloc1);
              cg.a_param_const(list,OS_INT,stackframe,paraloc1);
              paramanager.freeparaloc(list,paraloc1);
-             cg.allocexplicitregisters(list,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
+             cg.alloccpuregisters(list,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
              cg.a_call_name(list,'FPC_STACKCHECK');
-             cg.deallocexplicitregisters(list,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
+             cg.dealloccpuregisters(list,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
              if paraloc1.location^.loc=LOC_REGISTER then
                begin
                  cg.a_load_ref_reg(list,OS_INT,OS_INT,href,paraloc1.location^.register);
@@ -1787,18 +1746,6 @@ implementation
                     case localloc.loc of
                       LOC_REFERENCE :
                         tg.Ungetlocal(list,localloc.reference);
-                      LOC_REGISTER :
-                        begin
-{$ifndef cpu64bit}
-                          if localloc.size in [OS_64,OS_S64] then
-                            begin
-                              cg.ungetregister(list,localloc.registerlow);
-                              cg.ungetregister(list,localloc.registerhigh);
-                            end
-                          else
-{$endif cpu64bit}
-                            cg.ungetregister(list,localloc.register);
-                        end;
                     end;
                   end;
               end;
@@ -2036,21 +1983,6 @@ implementation
                     case localloc.loc of
                       LOC_REFERENCE :
                         tg.UngetLocal(list,localloc.reference);
-                      LOC_REGISTER :
-                        begin
-                          if localloc.register<>paraitem.paraloc[calleeside].location^.register then
-                            begin
-{$ifndef cpu64bit}
-                              if localloc.size in [OS_64,OS_S64] then
-                                begin
-                                  cg.ungetregister(list,localloc.registerlow);
-                                  cg.ungetregister(list,localloc.registerhigh);
-                                end
-                              else
-{$endif cpu64bit}
-                                cg.ungetregister(list,localloc.register);
-                            end;
-                        end;
                     end;
                   end;
               end;
@@ -2133,7 +2065,13 @@ implementation
 end.
 {
   $Log$
-  Revision 1.216  2004-09-21 17:25:12  peter
+  Revision 1.217  2004-09-25 14:23:54  peter
+    * ungetregister is now only used for cpuregisters, renamed to
+      ungetcpuregister
+    * renamed (get|unget)explicitregister(s) to ..cpuregister
+    * removed location-release/reference_release
+
+  Revision 1.216  2004/09/21 17:25:12  peter
     * paraloc branch merged
 
   Revision 1.215  2004/09/14 16:33:46  peter

+ 24 - 7
compiler/paramgr.pas

@@ -300,19 +300,19 @@ implementation
               LOC_CREGISTER:
                 begin
                   if getsupreg(paraloc^.register)<first_int_imreg then
-                    cg.getexplicitregister(list,paraloc^.register);
+                    cg.getcpuregister(list,paraloc^.register);
                 end;
               LOC_FPUREGISTER,
               LOC_CFPUREGISTER:
                 begin
                   if getsupreg(paraloc^.register)<first_fpu_imreg then
-                    cg.getexplicitregister(list,paraloc^.register);
+                    cg.getcpuregister(list,paraloc^.register);
                 end;
               LOC_MMREGISTER,
               LOC_CMMREGISTER :
                 begin
                   if getsupreg(paraloc^.register)<first_mm_imreg then
-                    cg.getexplicitregister(list,paraloc^.register);
+                    cg.getcpuregister(list,paraloc^.register);
                 end;
             end;
             paraloc:=paraloc^.next;
@@ -332,12 +332,23 @@ implementation
           begin
             case paraloc^.loc of
               LOC_REGISTER,
-              LOC_CREGISTER,
+              LOC_CREGISTER:
+                begin
+                  if getsupreg(paraloc^.register)<first_int_imreg then
+                    cg.ungetcpuregister(list,paraloc^.register);
+                end;
               LOC_FPUREGISTER,
-              LOC_CFPUREGISTER,
+              LOC_CFPUREGISTER:
+                begin
+                  if getsupreg(paraloc^.register)<first_fpu_imreg then
+                    cg.ungetcpuregister(list,paraloc^.register);
+                end;
               LOC_MMREGISTER,
               LOC_CMMREGISTER :
-                cg.ungetregister(list,paraloc^.register);
+                begin
+                  if getsupreg(paraloc^.register)<first_mm_imreg then
+                    cg.ungetcpuregister(list,paraloc^.register);
+                end;
               LOC_REFERENCE,
               LOC_CREFERENCE :
                 begin
@@ -436,7 +447,13 @@ end.
 
 {
    $Log$
-   Revision 1.78  2004-09-21 17:25:12  peter
+   Revision 1.79  2004-09-25 14:23:54  peter
+     * ungetregister is now only used for cpuregisters, renamed to
+       ungetcpuregister
+     * renamed (get|unget)explicitregister(s) to ..cpuregister
+     * removed location-release/reference_release
+
+   Revision 1.78  2004/09/21 17:25:12  peter
      * paraloc branch merged
 
    Revision 1.77.4.1  2004/08/31 20:43:06  peter

+ 15 - 80
compiler/powerpc/cgcpu.pas

@@ -38,8 +38,6 @@ unit cgcpu;
         procedure init_register_allocators;override;
         procedure done_register_allocators;override;
 
-        procedure ungetreference(list:Taasmoutput;const r:Treference);override;
-
         { passing parameters, per default the parameter is pushed }
         { nr gives the number of the parameter (enumerated from   }
         { left to right), this allows to move the parameter to    }
@@ -88,7 +86,7 @@ unit cgcpu;
 
         procedure a_loadaddr_ref_reg(list : taasmoutput;const ref : treference;r : tregister);override;
 
-        procedure g_concatcopy(list : taasmoutput;const source,dest : treference;len : aint; delsource,loadref : boolean);override;
+        procedure g_concatcopy(list : taasmoutput;const source,dest : treference;len : aint; loadref : boolean);override;
 
         procedure g_overflowcheck(list: taasmoutput; const l: tlocation; def: tdef); override;
         { find out whether a is of the form 11..00..11b or 00..11...00. If }
@@ -226,15 +224,6 @@ const
       end;
 
 
-    procedure tcgppc.ungetreference(list:Taasmoutput;const r:Treference);
-      begin
-        if r.base<>NR_NO then
-          ungetregister(list,r.base);
-        if r.index<>NR_NO then
-          ungetregister(list,r.index);
-      end;
-
-
     procedure tcgppc.a_param_const(list : taasmoutput;size : tcgsize;a : aint;const paraloc : tcgpara);
       var
         ref: treference;
@@ -269,13 +258,10 @@ const
             a_load_ref_reg(list,size,size,r,paraloc.location^.register);
           LOC_REFERENCE:
             begin
-               reference_reset(ref);
-               ref.base:=paraloc.location^.reference.index;
-               ref.offset:=paraloc.location^.reference.offset;
+               reference_reset_base(ref,paraloc.location^.reference.index,paraloc.location^.reference.offset);
                tmpreg := rg[R_INTREGISTER].getregister(list,R_SUBWHOLE);
                a_load_ref_reg(list,size,size,r,tmpreg);
                a_load_reg_ref(list,size,size,tmpreg,ref);
-               rg[R_INTREGISTER].ungetregister(list,tmpreg);
             end;
           LOC_FPUREGISTER,LOC_CFPUREGISTER:
             case size of
@@ -308,7 +294,6 @@ const
                tmpreg := rg[R_INTREGISTER].getregister(list,R_SUBWHOLE);
                a_loadaddr_ref_reg(list,r,tmpreg);
                a_load_reg_ref(list,OS_ADDR,OS_ADDR,tmpreg,ref);
-               rg[R_INTREGISTER].ungetregister(list,tmpreg);
              end;
            else
              internalerror(2002080701);
@@ -404,7 +389,6 @@ const
             tmpref.base:= reg;
             list.concat(taicpu.op_reg_ref(A_LWZ,tmpreg,tmpref));
             list.concat(taicpu.op_reg(A_MTCTR,tmpreg));
-            rg[R_INTREGISTER].ungetregister(list,tmpreg);
           end
         else
           list.concat(taicpu.op_reg(A_MTCTR,reg));
@@ -452,10 +436,9 @@ const
        var
          op: TAsmOp;
          ref2: TReference;
-         freereg: boolean;
        begin
          ref2 := ref;
-         freereg := fixref(list,ref2);
+         fixref(list,ref2);
          if tosize in [OS_S8..OS_S16] then
            { storing is the same for signed and unsigned values }
            tosize := tcgsize(ord(tosize)-(ord(OS_S8)-ord(OS_8)));
@@ -464,8 +447,6 @@ const
            internalerror(200109236);
          op := storeinstr[tcgsize2unsigned[tosize],ref2.index<>NR_NO,false];
          a_load_store(list,op,reg,ref2);
-         if freereg then
-           rg[R_INTREGISTER].ungetregister(list,ref2.base);
        End;
 
 
@@ -489,7 +470,6 @@ const
          op: tasmop;
          tmpreg: tregister;
          ref2, tmpref: treference;
-         freereg: boolean;
 
        begin
           { TODO: optimize/take into consideration fromsize/tosize. Will }
@@ -497,15 +477,13 @@ const
           if not(fromsize in [OS_8,OS_S8,OS_16,OS_S16,OS_32,OS_S32]) then
             internalerror(2002090902);
           ref2 := ref;
-          freereg := fixref(list,ref2);
+          fixref(list,ref2);
           { the caller is expected to have adjusted the reference already }
           { in this case                                                  }
           if (TCGSize2Size[fromsize] >= TCGSize2Size[tosize]) then
             fromsize := tosize;
           op := loadinstr[fromsize,ref2.index<>NR_NO,false];
           a_load_store(list,op,reg,ref2);
-          if freereg then
-            rg[R_INTREGISTER].ungetregister(list,ref2.base);
           { sign extend shortint if necessary, since there is no }
           { load instruction that does that automatically (JM)   }
           if fromsize = OS_S8 then
@@ -559,7 +537,6 @@ const
        var
          op: tasmop;
          ref2: treference;
-         freereg: boolean;
 
        begin
           { several functions call this procedure with OS_32 or OS_64 }
@@ -573,11 +550,9 @@ const
                internalerror(200201121);
           end;
          ref2 := ref;
-         freereg := fixref(list,ref2);
+         fixref(list,ref2);
          op := fpuloadinstr[size,ref2.index <> NR_NO,false];
          a_load_store(list,op,reg,ref2);
-         if freereg then
-           rg[R_INTREGISTER].ungetregister(list,ref2.base);
        end;
 
 
@@ -591,17 +566,14 @@ const
        var
          op: tasmop;
          ref2: treference;
-         freereg: boolean;
 
        begin
          if not(size in [OS_F32,OS_F64]) then
            internalerror(200201122);
          ref2 := ref;
-         freereg := fixref(list,ref2);
+         fixref(list,ref2);
          op := fpustoreinstr[size,ref2.index <> NR_NO,false];
          a_load_store(list,op,reg,ref2);
-         if freereg then
-           rg[R_INTREGISTER].ungetregister(list,ref2.base);
        end;
 
 
@@ -756,7 +728,6 @@ const
                 list.concat(taicpu.op_reg_const(A_LI,scratchreg,-1));
                 list.concat(taicpu.op_reg_reg_const_const_const(A_RLWIMI,dst,
                   scratchreg,0,l1,l2));
-                rg[R_INTREGISTER].ungetregister(list,scratchreg);
               end
             else
               do_lo_hi;
@@ -789,7 +760,6 @@ const
             scratchreg := rg[R_INTREGISTER].getregister(list,R_SUBWHOLE);
             a_load_const_reg(list,OS_32,a,scratchreg);
             a_op_reg_reg_reg(list,op,OS_32,scratchreg,src,dst);
-            rg[R_INTREGISTER].ungetregister(list,scratchreg);
           end;
       end;
 
@@ -843,7 +813,6 @@ const
                 scratch_register := rg[R_INTREGISTER].getregister(list,R_SUBWHOLE);
                 a_load_const_reg(list,OS_32,a,scratch_register);
                 list.concat(taicpu.op_reg_reg_reg(A_CMPW,NR_CR0,reg,scratch_register));
-                rg[R_INTREGISTER].ungetregister(list,scratch_register);
               end
           else
             if (aword(a) <= $ffff) then
@@ -853,7 +822,6 @@ const
                 scratch_register := rg[R_INTREGISTER].getregister(list,R_SUBWHOLE);
                 a_load_const_reg(list,OS_32,a,scratch_register);
                 list.concat(taicpu.op_reg_reg_reg(A_CMPLW,NR_CR0,reg,scratch_register));
-                rg[R_INTREGISTER].ungetregister(list,scratch_register);
               end;
           a_jmp(list,A_BC,TOpCmp2AsmCond[cmp_op],0,l);
         end;
@@ -1758,12 +1726,11 @@ const
 
        var
          ref2, tmpref: treference;
-         freereg: boolean;
          tmpreg:Tregister;
 
        begin
          ref2 := ref;
-         freereg := fixref(list,ref2);
+         fixref(list,ref2);
          if assigned(ref2.symbol) then
            begin
              if target_info.system = system_powerpc_macos then
@@ -1812,11 +1779,6 @@ const
                    begin
                      list.concat(taicpu.op_reg_reg_ref(A_ADDIS,r,
                        ref2.base,tmpref));
-                     if freereg then
-                       begin
-                         rg[R_INTREGISTER].ungetregister(list,ref2.base);
-                         freereg := false;
-                       end;
                    end
                  else
                    list.concat(taicpu.op_reg_ref(A_LIS,r,tmpref));
@@ -1841,8 +1803,6 @@ const
            a_load_reg_reg(list,OS_ADDR,OS_ADDR,ref2.base,r)
          else
            list.concat(taicpu.op_reg_const(A_LI,r,0));
-         if freereg then
-           rg[R_INTREGISTER].ungetregister(list,ref2.base);
        end;
 
 { ************* concatcopy ************ }
@@ -1855,7 +1815,7 @@ const
     maxmoveunit = 4;
 {$endif ppc603}
 
-    procedure tcgppc.g_concatcopy(list : taasmoutput;const source,dest : treference;len : aint; delsource,loadref : boolean);
+    procedure tcgppc.g_concatcopy(list : taasmoutput;const source,dest : treference;len : aint; loadref : boolean);
 
       var
         countreg: TRegister;
@@ -1880,21 +1840,11 @@ const
                 begin
                   size := int_cgsize(len);
                   a_load_ref_ref(list,size,size,source,dest);
-                  if delsource then
-                    begin
-                      reference_release(list,source);
-                      tg.ungetiftemp(list,source);
-                    end;
                 end
               else
                 begin
                   a_reg_alloc(list,NR_F0);
                   a_loadfpu_ref_reg(list,OS_F64,source,NR_F0);
-                  if delsource then
-                    begin
-                      reference_release(list,source);
-                      tg.ungetiftemp(list,source);
-                    end;
                   a_loadfpu_reg_ref(list,OS_F64,NR_F0,dest);
                   a_reg_dealloc(list,NR_F0);
                 end;
@@ -1926,8 +1876,6 @@ const
             src := source;
             orgsrc := true;
           end;
-        if not orgsrc and delsource then
-          reference_release(list,source);
         { load the address of dest into dst.base }
         if (count > 4) or
            not issimpleref(dest) or
@@ -1967,7 +1915,6 @@ const
             list.concat(taicpu.op_reg_ref(A_LFDU,NR_F0,src));
             list.concat(taicpu.op_reg_ref(A_STFDU,NR_F0,dst));
             a_jmp(list,A_BC,C_NE,0,lab);
-            rg[R_INTREGISTER].ungetregister(list,countreg);
             a_reg_dealloc(list,NR_F0);
             len := len mod 8;
           end;
@@ -2020,7 +1967,6 @@ const
             list.concat(taicpu.op_reg_ref(A_LWZU,NR_R0,src));
             list.concat(taicpu.op_reg_ref(A_STWU,NR_R0,dst));
             a_jmp(list,A_BC,C_NE,0,lab);
-            rg[R_INTREGISTER].ungetregister(list,countreg);
             a_reg_dealloc(list,NR_R0);
             len := len mod 4;
           end;
@@ -2058,17 +2004,6 @@ const
            a_load_reg_ref(list,OS_8,OS_8,NR_R0,dst);
            a_reg_dealloc(list,NR_R0);
          end;
-       if orgsrc then
-         begin
-           if delsource then
-             reference_release(list,source);
-         end
-       else
-         rg[R_INTREGISTER].ungetregister(list,src.base);
-       if not orgdst then
-         rg[R_INTREGISTER].ungetregister(list,dst.base);
-       if delsource then
-         tg.ungetiftemp(list,source);
       end;
 
 
@@ -2302,9 +2237,6 @@ const
             else
               list.concat(taicpu.op_reg_ref(op,reg,ref));
           end;
-
-        if (tmpreg <> NR_NO) then
-          rg[R_INTREGISTER].ungetregister(list,tmpreg);
       end;
 
 
@@ -2402,7 +2334,6 @@ const
                       cg.a_load_const_reg(list,OS_32,cardinal(value),tmpreg);
                       list.concat(taicpu.op_reg_reg_reg(ops[issub,2],
                         regdst.reglo,regsrc.reglo,tmpreg));
-                      tcgppc(cg).rg[R_INTREGISTER].ungetregister(list,tmpreg);
                       list.concat(taicpu.op_reg_reg(ops[issub,3],
                         regdst.reghi,regsrc.reghi));
                     end
@@ -2412,8 +2343,6 @@ const
                       tmpreg64.reghi := tcgppc(cg).rg[R_INTREGISTER].getregister(list,R_SUBWHOLE);
                       a_load64_const_reg(list,value,tmpreg64);
                       a_op64_reg_reg_reg(list,op,tmpreg64,regsrc,regdst);
-                      tcgppc(cg).rg[R_INTREGISTER].ungetregister(list,tmpreg64.reglo);
-                      tcgppc(cg).rg[R_INTREGISTER].ungetregister(list,tmpreg64.reghi);
                     end
                 end
               else
@@ -2435,7 +2364,13 @@ begin
 end.
 {
   $Log$
-  Revision 1.177  2004-09-21 17:25:12  peter
+  Revision 1.178  2004-09-25 14:23:54  peter
+    * ungetregister is now only used for cpuregisters, renamed to
+      ungetcpuregister
+    * renamed (get|unget)explicitregister(s) to ..cpuregister
+    * removed location-release/reference_release
+
+  Revision 1.177  2004/09/21 17:25:12  peter
     * paraloc branch merged
 
   Revision 1.176.4.2  2004/09/18 20:21:08  jonas

+ 13 - 29
compiler/powerpc/nppcadd.pas

@@ -234,15 +234,12 @@ interface
             op := A_CMPLW;
 
         if (right.location.loc = LOC_CONSTANT) then
-          if useconst then
-            exprasmlist.concat(taicpu.op_reg_const(op,
-              left.location.register,longint(right.location.value)))
-          else
-            begin
-              exprasmlist.concat(taicpu.op_reg_reg(op,
-                left.location.register,tmpreg));
-              cg.ungetregister(exprasmlist,tmpreg);
-            end
+          begin
+            if useconst then
+              exprasmlist.concat(taicpu.op_reg_const(op,left.location.register,longint(right.location.value)))
+            else
+              exprasmlist.concat(taicpu.op_reg_reg(op,left.location.register,tmpreg));
+          end
         else
           exprasmlist.concat(taicpu.op_reg_reg(op,
             left.location.register,right.location.register));
@@ -405,8 +402,6 @@ interface
                end;
            end;
          end;
-
-        release_reg_left_right;
       end;
 
 
@@ -479,8 +474,6 @@ interface
             exprasmlist.concat(taicpu.op_reg_reg_reg(op,
               newreg(R_SPECIALREGISTER,location.resflags.cr,R_SUBNONE),left.location.register,right.location.register))
           end;
-
-        release_reg_left_right;
       end;
 
 {*****************************************************************************
@@ -545,7 +538,6 @@ interface
                       else
                         cg.a_op_const_reg_reg(exprasmlist,OP_OR,OS_INT,
                           aword(left.location.value),tmpreg,location.register);
-                      cg.ungetregister(exprasmlist,tmpreg);
                     end;
                   opdone := true;
                 end
@@ -580,7 +572,6 @@ interface
                         aword(left.location.value),tmpreg);
                       exprasmlist.concat(taicpu.op_reg_reg_reg(A_ANDC,
                         location.register,tmpreg,right.location.register));
-                      cg.ungetregister(exprasmlist,tmpreg);
                     end
                   else
                     exprasmlist.concat(taicpu.op_reg_reg_reg(A_ANDC,
@@ -624,7 +615,6 @@ interface
                     exprasmlist.concat(taicpu.op_reg_reg_reg(A_ANDC_,tmpreg,
                       right.location.register,left.location.register));
                 end;
-              cg.ungetregister(exprasmlist,tmpreg);
               location.resflags.cr := RS_CR0;
               location.resflags.flag := F_EQ;
               opdone := true;
@@ -647,8 +637,6 @@ interface
                 right.location.register,left.location.register,
                 location.register);
           end;
-
-        release_reg_left_right;
       end;
 
 {*****************************************************************************
@@ -898,10 +886,6 @@ interface
                   exprasmlist.concat(taicpu.op_reg_reg_reg(A_OR_,NR_R0,
                     tempreg64.reglo,tempreg64.reghi));
                   cg.a_reg_dealloc(exprasmlist,NR_R0);
-                  if (tempreg64.reglo <> left.location.registerlow) then
-                    cg.ungetregister(exprasmlist,tempreg64.reglo);
-                  if (tempreg64.reghi <> left.location.registerhigh) then
-                    cg.ungetregister(exprasmlist,tempreg64.reghi);
 
                   location_reset(location,LOC_FLAGS,OS_NO);
                   location.resflags := getresflags;
@@ -1062,9 +1046,6 @@ interface
         if cmpop and
            not(nodetype in [equaln,unequaln]) then
           location_reset(location,LOC_JUMP,OS_NO);
-
-        release_reg_left_right;
-
       end;
 
 
@@ -1409,7 +1390,6 @@ interface
                            aword(left.location.value),tmpreg);
                          cg.a_op_reg_reg_reg(exprasmlist,OP_SUB,OS_INT,
                            right.location.register,tmpreg,location.register);
-                         cg.ungetregister(exprasmlist,tmpreg);
                        end;
                  end;
                ltn,lten,gtn,gten,equaln,unequaln :
@@ -1471,8 +1451,6 @@ interface
                 end;
               end;
            end;
-
-         release_reg_left_right;
       end;
 
 begin
@@ -1480,7 +1458,13 @@ begin
 end.
 {
   $Log$
-  Revision 1.48  2004-08-30 09:28:40  jonas
+  Revision 1.49  2004-09-25 14:23:54  peter
+    * ungetregister is now only used for cpuregisters, renamed to
+      ungetcpuregister
+    * renamed (get|unget)explicitregister(s) to ..cpuregister
+    * removed location-release/reference_release
+
+  Revision 1.48  2004/08/30 09:28:40  jonas
     * only specially handle 64bit operations on ordinals
 
   Revision 1.47  2004/07/21 15:09:10  jonas

+ 11 - 5
compiler/powerpc/nppccal.pas

@@ -75,8 +75,8 @@ implementation
         case target_info.system of
           system_powerpc_morphos:
             begin
-              cg.getexplicitregister(exprasmlist,NR_R0);
-              cg.getexplicitregister(exprasmlist,NR_R3);
+              cg.getcpuregister(exprasmlist,NR_R0);
+              cg.getcpuregister(exprasmlist,NR_R3);
 
               { store call offset into R3 }
               exprasmlist.concat(taicpu.op_reg_const(A_LI,NR_R3,-tprocdef(procdefinition).extnumber));
@@ -87,8 +87,8 @@ implementation
               exprasmlist.concat(taicpu.op_reg(A_MTLR,NR_R0));
               exprasmlist.concat(taicpu.op_none(A_BLRL));
 
-              cg.ungetregister(exprasmlist,NR_R0);
-              cg.ungetregister(exprasmlist,NR_R3);
+              cg.ungetcpuregister(exprasmlist,NR_R0);
+              cg.ungetcpuregister(exprasmlist,NR_R3);
             end;
           else
             internalerror(2004042901);
@@ -100,7 +100,13 @@ begin
 end.
 {
   $Log$
-  Revision 1.28  2004-09-21 17:25:13  peter
+  Revision 1.29  2004-09-25 14:23:54  peter
+    * ungetregister is now only used for cpuregisters, renamed to
+      ungetcpuregister
+    * renamed (get|unget)explicitregister(s) to ..cpuregister
+    * removed location-release/reference_release
+
+  Revision 1.28  2004/09/21 17:25:13  peter
     * paraloc branch merged
 
   Revision 1.27.4.1  2004/09/18 20:21:08  jonas

+ 14 - 33
compiler/powerpc/nppccnv.pas

@@ -132,14 +132,13 @@ implementation
         ref: treference;
         valuereg, tempreg, leftreg, tmpfpureg: tregister;
         size: tcgsize;
-        signed, valuereg_is_scratch: boolean;
+        signed : boolean;
       begin
 {$ifdef VER1_0}
         dummy1 := (int64(1) shl 31) or (int64($43300000) shl 32);
         dummy2 := int64($43300000) shl 32;
 {$endif VER1_0}
 
-        valuereg_is_scratch := false;
         location_reset(location,LOC_FPUREGISTER,def_cgsize(resulttype.def));
 
         { the code here comes from the PowerPC Compiler Writer's Guide }
@@ -190,10 +189,7 @@ implementation
             begin
               leftreg := left.location.register;
               if signed then
-                begin
-                  valuereg := cg.getintregister(exprasmlist,OS_INT);
-                  valuereg_is_scratch := true;
-                end
+                valuereg := cg.getintregister(exprasmlist,OS_INT)
               else
                 valuereg := leftreg;
             end;
@@ -201,7 +197,6 @@ implementation
             begin
               leftreg := cg.getintregister(exprasmlist,OS_INT);
               valuereg := leftreg;
-              valuereg_is_scratch := true;
               if signed then
                 size := OS_S32
               else
@@ -215,7 +210,6 @@ implementation
          tempreg := cg.getintregister(exprasmlist,OS_INT);
          exprasmlist.concat(taicpu.op_reg_const(A_LIS,tempreg,$4330));
          cg.a_load_reg_ref(exprasmlist,OS_32,OS_32,tempreg,ref);
-         cg.ungetregister(exprasmlist,tempreg);
          if signed then
            exprasmlist.concat(taicpu.op_reg_reg_const(A_XORIS,valuereg,
              { xoris expects a unsigned 16 bit int (FK) }
@@ -223,15 +217,6 @@ implementation
          inc(ref.offset,4);
          cg.a_load_reg_ref(exprasmlist,OS_32,OS_32,valuereg,ref);
          dec(ref.offset,4);
-         if (valuereg_is_scratch) then
-           cg.ungetregister(exprasmlist,valuereg);
-
-         if (left.location.loc = LOC_REGISTER) or
-            ((left.location.loc = LOC_CREGISTER) and
-             not signed) then
-           cg.ungetregister(exprasmlist,leftreg)
-         else
-           cg.ungetregister(exprasmlist,valuereg);
 
          tmpfpureg := cg.getfpuregister(exprasmlist,OS_F64);
          cg.a_loadfpu_ref_reg(exprasmlist,OS_F64,tempconst.location.reference,
@@ -245,7 +230,6 @@ implementation
 
          exprasmlist.concat(taicpu.op_reg_reg_reg(A_FSUB,location.register,
            location.register,tmpfpureg));
-         cg.ungetregister(exprasmlist,tmpfpureg);
 
          { work around bug in some PowerPC processors }
          if (tfloatdef(resulttype.def).typ = s32real) then
@@ -303,29 +287,23 @@ implementation
               begin
                 if left.location.loc in [LOC_CREFERENCE,LOC_REFERENCE] then
                   begin
-                    reference_release(exprasmlist,left.location.reference);
                     hreg1:=cg.getintregister(exprasmlist,OS_INT);
                     if left.location.size in [OS_64,OS_S64] then
                       begin
-                        cg.a_load_ref_reg(exprasmlist,OS_INT,OS_INT,
-                         left.location.reference,hreg1);
+                        cg.a_load_ref_reg(exprasmlist,OS_INT,OS_INT,left.location.reference,hreg1);
                         hreg2:=cg.getintregister(exprasmlist,OS_INT);
                         href:=left.location.reference;
                         inc(href.offset,4);
-                        cg.a_load_ref_reg(exprasmlist,OS_INT,OS_INT,
-                          href,hreg2);
-                        cg.ungetregister(exprasmlist,hreg2);
+                        cg.a_load_ref_reg(exprasmlist,OS_INT,OS_INT,href,hreg2);
                         cg.a_op_reg_reg_reg(exprasmlist,OP_OR,OS_32,hreg1,hreg2,hreg1);
                       end
                     else
-                      cg.a_load_ref_reg(exprasmlist,opsize,opsize,
-                        left.location.reference,hreg1);
+                      cg.a_load_ref_reg(exprasmlist,opsize,opsize,left.location.reference,hreg1);
                   end
                 else
                   begin
                      if left.location.size in [OS_64,OS_S64] then
                        begin
-                          location_release(exprasmlist,left.location);
                           hreg1:=cg.getintregister(exprasmlist,OS_32);
                           cg.a_op_reg_reg_reg(exprasmlist,OP_OR,OS_32,left.location.registerhigh,left.location.registerlow,hreg1);
                        end
@@ -333,11 +311,8 @@ implementation
                        hreg1 := left.location.register;
                   end;
                 hreg2 := cg.getintregister(exprasmlist,OS_INT);
-                exprasmlist.concat(taicpu.op_reg_reg_const(A_SUBIC,hreg2,
-                  hreg1,1));
-                cg.ungetregister(exprasmlist,hreg2);
-                exprasmlist.concat(taicpu.op_reg_reg_reg(A_SUBFE,hreg1,hreg2,
-                  hreg1));
+                exprasmlist.concat(taicpu.op_reg_reg_const(A_SUBIC,hreg2,hreg1,1));
+                exprasmlist.concat(taicpu.op_reg_reg_reg(A_SUBFE,hreg1,hreg2,hreg1));
               end;
             LOC_FLAGS :
               begin
@@ -370,7 +345,13 @@ begin
 end.
 {
   $Log$
-  Revision 1.53  2004-06-20 08:55:32  florian
+  Revision 1.54  2004-09-25 14:23:55  peter
+    * ungetregister is now only used for cpuregisters, renamed to
+      ungetcpuregister
+    * renamed (get|unget)explicitregister(s) to ..cpuregister
+    * removed location-release/reference_release
+
+  Revision 1.53  2004/06/20 08:55:32  florian
     * logs truncated
 
   Revision 1.52  2004/05/19 22:26:46  jonas

+ 7 - 4
compiler/powerpc/nppcinl.pas

@@ -130,14 +130,11 @@ implementation
                      exprasmlist.concat(taicpu.op_const_reg(A_DCBT,0,left.location.reference.base))
                    else
                      exprasmlist.concat(taicpu.op_reg_reg(A_DCBT,left.location.reference.base,left.location.reference.index));
-                   location_release(exprasmlist,left.location);
                  end
                else
                  begin
                    cg.a_loadaddr_ref_reg(exprasmlist,left.location.reference,r);
-                   location_release(exprasmlist,left.location);
                    exprasmlist.concat(taicpu.op_const_reg(A_DCBT,0,r));
-                   cg.ungetregister(exprasmlist,r);
                  end;
              end;
            else
@@ -150,7 +147,13 @@ begin
 end.
 {
   $Log$
-  Revision 1.15  2004-06-20 08:55:32  florian
+  Revision 1.16  2004-09-25 14:23:55  peter
+    * ungetregister is now only used for cpuregisters, renamed to
+      ungetcpuregister
+    * renamed (get|unget)explicitregister(s) to ..cpuregister
+    * removed location-release/reference_release
+
+  Revision 1.15  2004/06/20 08:55:32  florian
     * logs truncated
 
   Revision 1.14  2004/05/31 11:57:48  jonas

+ 10 - 17
compiler/powerpc/nppcmat.pas

@@ -152,18 +152,11 @@ implementation
              begin
                exprasmlist.concat(taicpu.op_reg_reg_reg(A_MULLW,resultreg,
                  divider,resultreg));
-               cg.ungetregister(exprasmlist,divider);
                exprasmlist.concat(taicpu.op_reg_reg_reg(A_SUB,location.register,
                  numerator,resultreg));
-               cg.ungetregister(exprasmlist,resultreg);
                resultreg := location.register;
-             end
-           else
-             cg.ungetregister(exprasmlist,divider);
+             end;
            end;
-       { free used registers }
-        if numerator <> resultreg then
-          cg.ungetregister(exprasmlist,numerator);
         { set result location }
         location.loc:=LOC_REGISTER;
         location.register:=resultreg;
@@ -287,7 +280,7 @@ implementation
                      location.registerlow := resultreg;
                    end;
 
-                 cg.getexplicitregister(exprasmlist,NR_R0);
+                 cg.getcpuregister(exprasmlist,NR_R0);
                  exprasmlist.concat(taicpu.op_reg_reg_const(A_SUBFIC,
                    NR_R0,hregister1,32));
                  exprasmlist.concat(taicpu.op_reg_reg_reg(asmop1,
@@ -304,7 +297,7 @@ implementation
                    location.registerhigh,location.registerhigh,NR_R0));
                  exprasmlist.concat(taicpu.op_reg_reg_reg(asmop1,
                    location.registerlow,hregisterlow,hregister1));
-                 cg.ungetregister(exprasmlist,NR_R0);
+                 cg.ungetcpuregister(exprasmlist,NR_R0);
 
                  if nodetype = shrn then
                    begin
@@ -312,8 +305,6 @@ implementation
                      location.registerhigh := location.registerlow;
                      location.registerlow := resultreg;
                    end;
-
-                   cg.ungetregister(exprasmlist,hregister1);
                end
            end
          else
@@ -348,8 +339,6 @@ implementation
 
                   cg.a_op_reg_reg_reg(exprasmlist,op,OS_32,hregister2,
                     hregister1,resultreg);
-
-                  cg.ungetregister(exprasmlist,hregister2);
                 end;
            end;
       end;
@@ -421,7 +410,6 @@ implementation
                           cg.a_load_ref_reg(exprasmlist,OS_32,OS_32,
                             left.location.reference,src1);
                        end;
-                     reference_release(exprasmlist,left.location.reference);
                   end;
               end;
               { choose appropriate operand }
@@ -492,7 +480,6 @@ implementation
                     begin
                       location_force_reg(exprasmlist,left.location,def_cgsize(left.resulttype.def),true);
                       exprasmlist.concat(taicpu.op_reg_const(A_CMPWI,left.location.register,0));
-                      location_release(exprasmlist,left.location);
                       location_reset(location,LOC_FLAGS,OS_NO);
                       location.resflags.cr:=RS_CR0;
                       location.resflags.flag:=F_EQ;
@@ -534,7 +521,13 @@ begin
 end.
 {
   $Log$
-  Revision 1.39  2004-06-20 08:55:32  florian
+  Revision 1.40  2004-09-25 14:23:55  peter
+    * ungetregister is now only used for cpuregisters, renamed to
+      ungetcpuregister
+    * renamed (get|unget)explicitregister(s) to ..cpuregister
+    * removed location-release/reference_release
+
+  Revision 1.39  2004/06/20 08:55:32  florian
     * logs truncated
 
   Revision 1.38  2004/01/01 17:58:16  jonas

+ 8 - 3
compiler/powerpc/nppcset.pas

@@ -81,8 +81,7 @@ implementation
                  cg.a_load_const_reg(exprasmlist,OS_INT,aword(value),tmpreg);
                 exprasmlist.concat(taicpu.op_reg_reg_reg(A_ADD_,hregister,
                   hregister,tmpreg));
-                cg.ungetregister(exprasmlist,tmpreg);
-               end;
+              end;
           end;
 
         begin
@@ -157,7 +156,13 @@ begin
 end.
 {
   $Log$
-  Revision 1.14  2004-06-20 08:55:32  florian
+  Revision 1.15  2004-09-25 14:23:55  peter
+    * ungetregister is now only used for cpuregisters, renamed to
+      ungetcpuregister
+    * renamed (get|unget)explicitregister(s) to ..cpuregister
+    * removed location-release/reference_release
+
+  Revision 1.14  2004/06/20 08:55:32  florian
     * logs truncated
 
 }

+ 13 - 7
compiler/powerpc/rgcpu.pas

@@ -36,9 +36,9 @@ unit rgcpu;
      type
        trgcpu = class(trgobj)
 {
-         function getexplicitregisterint(list: taasmoutput; reg: Tnewregister): tregister; override;
+         function getcpuregisterint(list: taasmoutput; reg: Tnewregister): tregister; override;
          procedure ungetregisterint(list: taasmoutput; reg: tregister); override;
-         function getexplicitregisterfpu(list : taasmoutput; r : Toldregister) : tregister;override;
+         function getcpuregisterfpu(list : taasmoutput; r : Toldregister) : tregister;override;
          procedure ungetregisterfpu(list: taasmoutput; r : tregister; size:TCGsize);override;
          procedure cleartempgen; override;
         private
@@ -53,7 +53,7 @@ unit rgcpu;
       cgobj, verbose, cutils;
 
 (*
-    function trgcpu.getexplicitregisterint(list: taasmoutput; reg: Tnewregister): tregister;
+    function trgcpu.getcpuregisterint(list: taasmoutput; reg: Tnewregister): tregister;
 
       begin
         if ((reg shr 8) in [RS_R0]) and
@@ -67,7 +67,7 @@ unit rgcpu;
             result.number:=reg;
             cg.a_reg_alloc(list,result);
           end
-        else result := inherited getexplicitregisterint(list,reg);
+        else result := inherited getcpuregisterint(list,reg);
       end;
 
 
@@ -88,7 +88,7 @@ unit rgcpu;
       end;
 
 
-    function trgcpu.getexplicitregisterfpu(list : taasmoutput; r : Toldregister) : tregister;
+    function trgcpu.getcpuregisterfpu(list : taasmoutput; r : Toldregister) : tregister;
       begin
         if (r in [R_F1..R_F13]) and
            not is_reg_var_other[r] then
@@ -100,7 +100,7 @@ unit rgcpu;
             cg.a_reg_alloc(list,result);
           end
         else
-          result := inherited getexplicitregisterfpu(list,r);
+          result := inherited getcpuregisterfpu(list,r);
       end;
 
 
@@ -132,7 +132,13 @@ end.
 
 {
   $Log$
-  Revision 1.17  2004-06-20 08:55:32  florian
+  Revision 1.18  2004-09-25 14:23:55  peter
+    * ungetregister is now only used for cpuregisters, renamed to
+      ungetcpuregister
+    * renamed (get|unget)explicitregister(s) to ..cpuregister
+    * removed location-release/reference_release
+
+  Revision 1.17  2004/06/20 08:55:32  florian
     * logs truncated
 
 }

+ 7 - 3
compiler/regvars.pas

@@ -650,7 +650,6 @@ implementation
                 begin
                   reg:=cg.makeregsize(list,tvarsym(regvars[i]).localloc.register,OS_INT);
                   cg.a_load_reg_reg(list,OS_INT,OS_INT,reg,reg);
-                  cg.ungetregister(list,tvarsym(regvars[i]).localloc.register);
                 end;
             for i := 1 to maxfpuvarregs do
               if assigned(fpuregvars[i]) then
@@ -658,7 +657,6 @@ implementation
                   reg:=tvarsym(fpuregvars[i]).localloc.register;
                   size:=reg_cgsize(reg);
                   cg.a_loadfpu_reg_reg(list,size,reg,reg);
-                  cg.ungetregister(list,reg);
                 end;
           end;
       end;
@@ -671,7 +669,13 @@ end.
 
 {
   $Log$
-  Revision 1.78  2004-09-10 19:59:38  jonas
+  Revision 1.79  2004-09-25 14:23:54  peter
+    * ungetregister is now only used for cpuregisters, renamed to
+      ungetcpuregister
+    * renamed (get|unget)explicitregister(s) to ..cpuregister
+    * removed location-release/reference_release
+
+  Revision 1.78  2004/09/10 19:59:38  jonas
     * clarified comment
 
   Revision 1.77  2004/06/20 08:55:30  florian

+ 19 - 18
compiler/rgobj.pas

@@ -149,14 +149,13 @@ unit rgobj;
          no more free registers which can be allocated.}
         function getregister(list:Taasmoutput;subreg:Tsubregister):Tregister;virtual;
         {# Get the register specified.}
-        procedure getexplicitregister(list:Taasmoutput;r:Tregister);virtual;
+        procedure getcpuregister(list:Taasmoutput;r:Tregister);virtual;
+        procedure ungetcpuregister(list:Taasmoutput;r:Tregister);virtual;
         {# Get multiple registers specified.}
-        procedure allocexplicitregisters(list:Taasmoutput;r:Tcpuregisterset);virtual;
+        procedure alloccpuregisters(list:Taasmoutput;r:Tcpuregisterset);virtual;
         {# Free multiple registers specified.}
-        procedure deallocexplicitregisters(list:Taasmoutput;r:Tcpuregisterset);virtual;
+        procedure dealloccpuregisters(list:Taasmoutput;r:Tcpuregisterset);virtual;
         function uses_registers:boolean;virtual;
-        {# Deallocate any kind of register }
-        procedure ungetregister(list:Taasmoutput;r:Tregister);virtual;
         procedure add_reg_instruction(instr:Tai;r:tregister);
         procedure add_move_instruction(instr:Taicpu);
         {# Do the register allocation.}
@@ -490,19 +489,15 @@ unit rgobj;
       end;
 
 
-    procedure trgobj.ungetregister(list:Taasmoutput;r:Tregister);
+    procedure trgobj.ungetcpuregister(list:Taasmoutput;r:Tregister);
       begin
-{$ifdef EXTDEBUG}
-        if (reginfo=nil) and (getsupreg(r)>=first_imaginary) then
+        if (getsupreg(r)>=first_imaginary) then
           InternalError(2004020901);
-{$endif EXTDEBUG}
-        { Only explicit allocs insert regalloc info }
-        if getsupreg(r)<first_imaginary then
-          list.concat(Tai_regalloc.dealloc(r));
+        list.concat(Tai_regalloc.dealloc(r));
       end;
 
 
-    procedure trgobj.getexplicitregister(list:Taasmoutput;r:Tregister);
+    procedure trgobj.getcpuregister(list:Taasmoutput;r:Tregister);
       var
         supreg:Tsuperregister;
       begin
@@ -514,25 +509,25 @@ unit rgobj;
       end;
 
 
-    procedure trgobj.allocexplicitregisters(list:Taasmoutput;r:Tcpuregisterset);
+    procedure trgobj.alloccpuregisters(list:Taasmoutput;r:Tcpuregisterset);
 
     var i:Tsuperregister;
 
     begin
       for i:=0 to first_imaginary-1 do
         if i in r then
-          getexplicitregister(list,newreg(regtype,i,defaultsub));
+          getcpuregister(list,newreg(regtype,i,defaultsub));
     end;
 
 
-    procedure trgobj.deallocexplicitregisters(list:Taasmoutput;r:Tcpuregisterset);
+    procedure trgobj.dealloccpuregisters(list:Taasmoutput;r:Tcpuregisterset);
 
     var i:Tsuperregister;
 
     begin
       for i:=0 to first_imaginary-1 do
         if i in r then
-          ungetregister(list,newreg(regtype,i,defaultsub));
+          ungetcpuregister(list,newreg(regtype,i,defaultsub));
     end;
 
 
@@ -2001,7 +1996,13 @@ unit rgobj;
 end.
 {
   $Log$
-  Revision 1.135  2004-09-21 17:25:12  peter
+  Revision 1.136  2004-09-25 14:23:54  peter
+    * ungetregister is now only used for cpuregisters, renamed to
+      ungetcpuregister
+    * renamed (get|unget)explicitregister(s) to ..cpuregister
+    * removed location-release/reference_release
+
+  Revision 1.135  2004/09/21 17:25:12  peter
     * paraloc branch merged
 
   Revision 1.134.4.2  2004/09/21 17:03:26  peter

+ 9 - 23
compiler/sparc/cgcpu.pas

@@ -86,7 +86,7 @@ interface
         procedure g_restore_standard_registers(list:taasmoutput);override;
         procedure g_save_all_registers(list : taasmoutput);override;
         procedure g_save_standard_registers(list : taasmoutput);override;
-        procedure g_concatcopy(list:TAasmOutput;const source,dest:TReference;len:aint;delsource,loadref:boolean);override;
+        procedure g_concatcopy(list : taasmoutput;const source,dest : treference;len : aint;loadref : boolean);override;
       end;
 
       TCg64Sparc=class(tcg64f32)
@@ -218,7 +218,6 @@ implementation
             tmpreg:=GetIntRegister(list,OS_INT);
             a_load_const_reg(list,OS_INT,a,tmpreg);
             list.concat(taicpu.op_reg_reg_reg(op,src,tmpreg,dst));
-            UnGetRegister(list,tmpreg);
           end
         else
           list.concat(taicpu.op_reg_const_reg(op,src,a,dst));
@@ -310,7 +309,6 @@ implementation
                   tmpreg:=GetIntRegister(list,OS_INT);
                   a_load_ref_reg(list,sz,sz,r,tmpreg);
                   a_load_reg_ref(list,sz,sz,tmpreg,ref);
-                  UnGetRegister(list,tmpreg);
                 end;
               else
                 internalerror(2002081103);
@@ -338,7 +336,6 @@ implementation
                   tmpreg:=GetAddressRegister(list);
                   a_loadaddr_ref_reg(list,r,tmpreg);
                   a_load_reg_ref(list,OS_ADDR,OS_ADDR,tmpreg,ref);
-                  UnGetRegister(list,tmpreg);
                 end;
               else
                 internalerror(2002080701);
@@ -639,8 +636,6 @@ implementation
                 if hreg<>r then
                   a_load_reg_reg(list,OS_ADDR,OS_ADDR,hreg,r);
               end;
-            if hreg<>r then
-              UnGetRegister(list,hreg);
           end
         else
         { At least small offset, maybe base and maybe index }
@@ -960,7 +955,7 @@ implementation
 
     { ************* concatcopy ************ }
 
-    procedure TCgSparc.g_concatcopy(list:taasmoutput;const source,dest:treference;len:aint;delsource,loadref:boolean);
+    procedure TCgSparc.g_concatcopy(list:taasmoutput;const source,dest:treference;len:aint;loadref:boolean);
       var
         tmpreg1,
         hreg,
@@ -987,8 +982,6 @@ implementation
             a_loadaddr_ref_reg(list,source,src.base);
             orgsrc := false;
           end;
-        if not orgsrc and delsource then
-          reference_release(list,source);
           { load the address of dest into dst.base }
         dst.base:=GetAddressRegister(list);
         a_loadaddr_ref_reg(list,dest,dst.base);
@@ -1019,7 +1012,6 @@ implementation
             list.concat(taicpu.op_reg_reg(A_MOV,countreg,countreg));
             list.concat(taicpu.op_reg_reg(A_MOV,src.base,src.base));
             list.concat(taicpu.op_reg_reg(A_MOV,dst.base,dst.base));
-            UnGetRegister(list,countreg);
             len := len mod 4;
           end;
         { unrolled loop }
@@ -1043,7 +1035,6 @@ implementation
             a_load_reg_ref(list,OS_32,OS_32,hreg,dst);
             inc(src.offset,4);
             inc(dst.offset,4);
-            UnGetRegister(list,hreg);
           end;
         { copy the leftovers }
         if (len and 2) <> 0 then
@@ -1053,24 +1044,13 @@ implementation
             a_load_reg_ref(list,OS_16,OS_16,hreg,dst);
             inc(src.offset,2);
             inc(dst.offset,2);
-            UnGetRegister(list,hreg);
           end;
         if (len and 1) <> 0 then
           begin
             hreg:=GetIntRegister(list,OS_INT);
             a_load_ref_reg(list,OS_8,OS_8,src,hreg);
             a_load_reg_ref(list,OS_8,OS_8,hreg,dst);
-            UnGetRegister(list,hreg);
           end;
-        if orgsrc then
-          begin
-            if delsource then
-              reference_release(list,source);
-          end
-        else
-          UnGetRegister(list,src.base);
-        if not orgdst then
-          UnGetRegister(list,dst.base);
       end;
 
 {****************************************************************************
@@ -1227,7 +1207,13 @@ begin
 end.
 {
   $Log$
-  Revision 1.88  2004-09-21 20:33:00  peter
+  Revision 1.89  2004-09-25 14:23:55  peter
+    * ungetregister is now only used for cpuregisters, renamed to
+      ungetcpuregister
+    * renamed (get|unget)explicitregister(s) to ..cpuregister
+    * removed location-release/reference_release
+
+  Revision 1.88  2004/09/21 20:33:00  peter
     * don't remove MOV reg1,reg1 it is needed for the RA
 
   Revision 1.87  2004/09/21 17:25:13  peter

+ 7 - 13
compiler/sparc/ncpuadd.pas

@@ -211,8 +211,6 @@ interface
 
         exprasmlist.concat(taicpu.op_reg_reg_reg(op,
            left.location.register,right.location.register,location.register));
-
-        release_reg_left_right;
       end;
 
 
@@ -240,8 +238,6 @@ interface
              left.location.register,right.location.register));
         { Delay slot (can only contain integer operation) }
         exprasmlist.concat(taicpu.op_none(A_NOP));
-
-        release_reg_left_right;
       end;
 
 
@@ -257,8 +253,6 @@ interface
 
         location_reset(location,LOC_FLAGS,OS_NO);
         location.resflags:=getresflags(true);
-
-        release_reg_left_right;
       end;
 
 
@@ -274,8 +268,6 @@ interface
 
         location_reset(location,LOC_FLAGS,OS_NO);
         location.resflags:=getresflags(true);
-
-        release_reg_left_right;
       end;
 
 
@@ -358,8 +350,6 @@ interface
         firstjmp64bitcmp;
         exprasmlist.concat(taicpu.op_reg_reg(A_CMP,left.location.register64.reglo,right.location.register64.reglo));
         secondjmp64bitcmp;
-
-        release_reg_left_right;
       end;
 
 
@@ -380,8 +370,6 @@ interface
 
         location_reset(location,LOC_FLAGS,OS_NO);
         location.resflags:=getresflags(unsigned);
-
-        release_reg_left_right;
       end;
 
 begin
@@ -389,7 +377,13 @@ begin
 end.
 {
   $Log$
-  Revision 1.26  2004-09-21 17:25:13  peter
+  Revision 1.27  2004-09-25 14:23:55  peter
+    * ungetregister is now only used for cpuregisters, renamed to
+      ungetcpuregister
+    * renamed (get|unget)explicitregister(s) to ..cpuregister
+    * removed location-release/reference_release
+
+  Revision 1.26  2004/09/21 17:25:13  peter
     * paraloc branch merged
 
   Revision 1.25.4.1  2004/09/19 18:08:30  peter

+ 7 - 5
compiler/sparc/ncpucnv.pas

@@ -149,7 +149,6 @@ implementation
         op:=conv_op[tfloatdef(resulttype.def).typ,tfloatdef(left.resulttype.def).typ];
         if op=A_NONE then
           internalerror(200401121);
-        location_release(exprasmlist,left.location);
         location.register:=cg.getfpuregister(exprasmlist,location.size);
         exprasmlist.concat(taicpu.op_reg_reg(op,left.location.register,location.register));
       end;
@@ -188,7 +187,6 @@ implementation
             begin
               if left.location.loc in [LOC_CREFERENCE,LOC_REFERENCE] then
                 begin
-                  reference_release(exprasmlist,left.location.reference);
                   hreg2:=cg.getintregister(exprasmlist,opsize);
                   cg.a_load_ref_reg(exprasmlist,opsize,opsize,left.location.reference,hreg2);
                 end
@@ -197,7 +195,6 @@ implementation
 {$ifndef cpu64bit}
               if left.location.size in [OS_64,OS_S64] then
                 begin
-                  cg.ungetregister(exprasmlist,hreg2);
                   hreg1:=cg.getintregister(exprasmlist,OS_32);
                   cg.a_op_reg_reg_reg(exprasmlist,OP_OR,OS_32,hreg2,tregister(succ(longint(hreg2))),hreg1);
                   hreg2:=hreg1;
@@ -205,7 +202,6 @@ implementation
                 end;
 {$endif cpu64bit}
               exprasmlist.concat(taicpu.op_reg_reg_reg(A_SUBCC,NR_G0,hreg2,NR_G0));
-              cg.ungetregister(exprasmlist,hreg2);
               hreg1:=cg.getintregister(exprasmlist,opsize);
               exprasmlist.concat(taicpu.op_reg_const_reg(A_ADDX,NR_G0,0,hreg1));
             end;
@@ -244,7 +240,13 @@ begin
 end.
 {
   $Log$
-  Revision 1.31  2004-08-25 20:40:04  florian
+  Revision 1.32  2004-09-25 14:23:55  peter
+    * ungetregister is now only used for cpuregisters, renamed to
+      ungetcpuregister
+    * renamed (get|unget)explicitregister(s) to ..cpuregister
+    * removed location-release/reference_release
+
+  Revision 1.31  2004/08/25 20:40:04  florian
     * fixed absolute on sparc
 
   Revision 1.30  2004/08/24 21:02:33  florian

+ 8 - 9
compiler/sparc/ncpumat.pas

@@ -107,7 +107,6 @@ implementation
              cg.a_op_const_reg(exprasmlist,OP_AND,OS_INT,tordconstnode(right).value-1,tmpreg);
              { add to the left value }
              cg.a_op_reg_reg(exprasmlist,OP_ADD,OS_INT,tmpreg,numerator);
-             cg.UngetRegister(exprasmlist,tmpreg);
              cg.a_op_const_reg_reg(exprasmlist,OP_SAR,OS_INT,aword(power),numerator,resultreg);
            end
          else
@@ -149,13 +148,8 @@ implementation
                  cg.a_label(exprasmlist,overflowlabel);
                  exprasmlist.concat(taicpu.op_reg_reg_reg(A_SMUL,resultreg,divider,resultreg));
                  exprasmlist.concat(taicpu.op_reg_reg_reg(A_SUB,numerator,resultreg,resultreg));
-               end
-             else
-               cg.UngetRegister(exprasmlist,divider);
+               end;
            end;
-        { free used registers }
-        if numerator<>resultreg then
-          cg.UngetRegister(exprasmlist,numerator);
         { set result location }
         location.loc:=LOC_REGISTER;
         location.register:=resultreg;
@@ -314,7 +308,6 @@ implementation
                 begin
                   location_force_reg(exprasmlist,left.location,def_cgsize(left.resulttype.def),true);
                   exprasmlist.concat(taicpu.op_reg_const_reg(A_SUBcc,left.location.register,0,NR_G0));
-                  location_release(exprasmlist,left.location);
                   location_reset(location,LOC_FLAGS,OS_NO);
                   location.resflags:=F_E;
                end;
@@ -332,7 +325,13 @@ begin
 end.
 {
   $Log$
-  Revision 1.20  2004-08-16 21:00:30  peter
+  Revision 1.21  2004-09-25 14:23:55  peter
+    * ungetregister is now only used for cpuregisters, renamed to
+      ungetcpuregister
+    * renamed (get|unget)explicitregister(s) to ..cpuregister
+    * removed location-release/reference_release
+
+  Revision 1.20  2004/08/16 21:00:30  peter
     * fixed shr/shl 32
 
   Revision 1.19  2004/08/01 08:46:31  florian

+ 32 - 50
compiler/x86/cgx86.pas

@@ -43,10 +43,10 @@ unit cgx86;
         function getfpuregister(list:Taasmoutput;size:Tcgsize):Tregister;override;
         function getmmxregister(list:Taasmoutput):Tregister;
 
-        procedure getexplicitregister(list:Taasmoutput;r:Tregister);override;
-        procedure ungetregister(list:Taasmoutput;r:Tregister);override;
-        procedure allocexplicitregisters(list:Taasmoutput;rt:Tregistertype;r:Tcpuregisterset);override;
-        procedure deallocexplicitregisters(list:Taasmoutput;rt:Tregistertype;r:Tcpuregisterset);override;
+        procedure getcpuregister(list:Taasmoutput;r:Tregister);override;
+        procedure ungetcpuregister(list:Taasmoutput;r:Tregister);override;
+        procedure alloccpuregisters(list:Taasmoutput;rt:Tregistertype;r:Tcpuregisterset);override;
+        procedure dealloccpuregisters(list:Taasmoutput;rt:Tregistertype;r:Tcpuregisterset);override;
         function  uses_registers(rt:Tregistertype):boolean;override;
         procedure add_reg_instruction(instr:Tai;r:tregister);override;
         procedure dec_fpu_stack;
@@ -102,7 +102,7 @@ unit cgx86;
         procedure g_flags2reg(list: taasmoutput; size: TCgSize; const f: tresflags; reg: TRegister); override;
         procedure g_flags2ref(list: taasmoutput; size: TCgSize; const f: tresflags; const ref: TReference); override;
 
-        procedure g_concatcopy(list : taasmoutput;const source,dest : treference;len : aint; delsource,loadref : boolean);override;
+        procedure g_concatcopy(list : taasmoutput;const source,dest : treference;len : aint; loadref : boolean);override;
 
         { entry/exit code helpers }
         procedure g_releasevaluepara_openarray(list : taasmoutput;const ref:treference);override;
@@ -193,35 +193,35 @@ unit cgx86;
         result:=rg[R_MMXREGISTER].getregister(list,R_SUBNONE);
       end;
 
-    procedure Tcgx86.getexplicitregister(list:Taasmoutput;r:Tregister);
+    procedure Tcgx86.getcpuregister(list:Taasmoutput;r:Tregister);
       begin
         if getregtype(r)=R_FPUREGISTER then
           internalerror(2003121210)
         else
-          inherited getexplicitregister(list,r);
+          inherited getcpuregister(list,r);
       end;
 
 
-    procedure tcgx86.ungetregister(list:Taasmoutput;r:Tregister);
+    procedure tcgx86.ungetcpuregister(list:Taasmoutput;r:Tregister);
       begin
         if getregtype(r)=R_FPUREGISTER then
           rgfpu.ungetregisterfpu(list,r)
         else
-          inherited ungetregister(list,r);
+          inherited ungetcpuregister(list,r);
       end;
 
 
-    procedure Tcgx86.allocexplicitregisters(list:Taasmoutput;rt:Tregistertype;r:Tcpuregisterset);
+    procedure Tcgx86.alloccpuregisters(list:Taasmoutput;rt:Tregistertype;r:Tcpuregisterset);
       begin
         if rt<>R_FPUREGISTER then
-          inherited allocexplicitregisters(list,rt,r);
+          inherited alloccpuregisters(list,rt,r);
       end;
 
 
-    procedure Tcgx86.deallocexplicitregisters(list:Taasmoutput;rt:Tregistertype;r:Tcpuregisterset);
+    procedure Tcgx86.dealloccpuregisters(list:Taasmoutput;rt:Tregistertype;r:Tcpuregisterset);
       begin
         if rt<>R_FPUREGISTER then
-          inherited deallocexplicitregisters(list,rt,r);
+          inherited dealloccpuregisters(list,rt,r);
       end;
 
 
@@ -504,7 +504,6 @@ unit cgx86;
 {$endif x86_64}
               list.concat(taicpu.op_reg_reg(op,s,reg,tmpreg));
               a_load_reg_ref(list,tosize,tosize,tmpreg,ref);
-              ungetregister(list,tmpreg);
             end;
         else
           list.concat(taicpu.op_reg_ref(op,s,reg,ref));
@@ -976,10 +975,10 @@ unit cgx86;
             internalerror(200109233);
           OP_SHR,OP_SHL,OP_SAR:
             begin
-              getexplicitregister(list,NR_CL);
+              getcpuregister(list,NR_CL);
               a_load_reg_reg(list,OS_8,OS_8,makeregsize(list,src,OS_8),NR_CL);
               list.concat(taicpu.op_reg_reg(Topcg2asmop[op],tcgsize2opsize[size],NR_CL,src));
-              ungetregister(list,NR_CL);
+              ungetcpuregister(list,NR_CL);
             end;
           else
             begin
@@ -1267,8 +1266,7 @@ unit cgx86;
 
 { ************* concatcopy ************ }
 
-    procedure Tcgx86.g_concatcopy(list:Taasmoutput;const source,dest:Treference;
-                                  len:aint;delsource,loadref:boolean);
+    procedure Tcgx86.g_concatcopy(list:Taasmoutput;const source,dest:Treference;len:aint;loadref:boolean);
 
     const
 {$ifdef cpu64bit}
@@ -1331,11 +1329,8 @@ unit cgx86;
                     cgsize:=OS_32;
                   end;
                 dec(len,copysize);
-                if (len=0) and delsource then
-                  reference_release(list,source);
                 r:=getintregister(list,cgsize);
                 a_load_ref_reg(list,cgsize,cgsize,srcref,r);
-                ungetregister(list,r);
                 a_load_reg_ref(list,cgsize,cgsize,r,dstref);
                 inc(srcref.offset,copysize);
                 inc(dstref.offset,copysize);
@@ -1366,50 +1361,33 @@ unit cgx86;
                 a_loadmm_ref_reg(list,OS_M64,OS_M64,srcref,r3,nil);
               end;
             a_loadmm_reg_ref(list,OS_M64,OS_M64,r0,dstref,nil);
-            ungetregister(list,r0);
             if len>=16 then
               begin
                 inc(dstref.offset,8);
                 a_loadmm_reg_ref(list,OS_M64,OS_M64,r1,dstref,nil);
-                ungetregister(list,r1);
               end;
             if len>=24 then
               begin
                 inc(dstref.offset,8);
                 a_loadmm_reg_ref(list,OS_M64,OS_M64,r2,dstref,nil);
-                ungetregister(list,r2);
               end;
             if len>=32 then
               begin
                 inc(dstref.offset,8);
                 a_loadmm_reg_ref(list,OS_M64,OS_M64,r3,dstref,nil);
-                ungetregister(list,r3);
               end;
           end
         else {copy_string, should be a good fallback in case of unhandled}
           begin
-            getexplicitregister(list,REGDI);
+            getcpuregister(list,REGDI);
             a_loadaddr_ref_reg(list,dest,REGDI);
-            getexplicitregister(list,REGSI);
+            getcpuregister(list,REGSI);
             if loadref then
               a_load_ref_reg(list,OS_ADDR,OS_ADDR,source,REGSI)
             else
-              begin
-                a_loadaddr_ref_reg(list,source,REGSI);
-                if delsource then
-                  begin
-                    srcref:=source;
-                    { Don't release ESI register yet, it's needed
-                      by the movsl }
-                    if (srcref.base=REGSI) then
-                      srcref.base:=NR_NO
-                    else if (srcref.index=REGSI) then
-                      srcref.index:=NR_NO;
-                    reference_release(list,srcref);
-                  end;
-              end;
+              a_loadaddr_ref_reg(list,source,REGSI);
 
-            getexplicitregister(list,REGCX);
+            getcpuregister(list,REGCX);
 
             list.concat(Taicpu.op_none(A_CLD,S_NO));
             if cs_littlesize in aktglobalswitches  then
@@ -1449,13 +1427,11 @@ unit cgx86;
                 if len=1 then
                   list.concat(Taicpu.op_none(A_MOVSB,S_NO));
               end;
-            ungetregister(list,REGCX);
-            ungetregister(list,REGSI);
-            ungetregister(list,REGDI);
+            ungetcpuregister(list,REGCX);
+            ungetcpuregister(list,REGSI);
+            ungetcpuregister(list,REGDI);
           end;
         end;
-      if delsource then
-        tg.ungetiftemp(list,source);
     end;
 
 
@@ -1546,14 +1522,14 @@ unit cgx86;
                else
                  begin
                     objectlibrary.getlabel(again);
-                    getexplicitregister(list,NR_EDI);
+                    getcpuregister(list,NR_EDI);
                     list.concat(Taicpu.op_const_reg(A_MOV,S_L,localsize div winstackpagesize,NR_EDI));
                     a_label(list,again);
                     list.concat(Taicpu.op_const_reg(A_SUB,S_L,winstackpagesize-4,NR_ESP));
                     list.concat(Taicpu.op_reg(A_PUSH,S_L,NR_EAX));
                     list.concat(Taicpu.op_reg(A_DEC,S_L,NR_EDI));
                     a_jmp_cond(list,OC_NE,again);
-                    ungetregister(list,NR_EDI);
+                    ungetcpuregister(list,NR_EDI);
                     list.concat(Taicpu.op_const_reg(A_SUB,S_L,localsize mod winstackpagesize,NR_ESP));
                  end
              end
@@ -1697,7 +1673,13 @@ unit cgx86;
 end.
 {
   $Log$
-  Revision 1.124  2004-06-20 08:55:32  florian
+  Revision 1.125  2004-09-25 14:23:55  peter
+    * ungetregister is now only used for cpuregisters, renamed to
+      ungetcpuregister
+    * renamed (get|unget)explicitregister(s) to ..cpuregister
+    * removed location-release/reference_release
+
+  Revision 1.124  2004/06/20 08:55:32  florian
     * logs truncated
 
   Revision 1.123  2004/06/16 20:07:11  florian

+ 13 - 36
compiler/x86/nx86add.pas

@@ -119,7 +119,6 @@ unit nx86add;
               cg.a_load_loc_reg(exprasmlist,opsize,right.location,r);
               emit_reg_reg(op,TCGSize2Opsize[opsize],left.location.register,r);
               cg.a_load_reg_reg(exprasmlist,opsize,opsize,r,left.location.register);
-              cg.ungetregister(exprasmlist,r);
             end
            else
             begin
@@ -163,7 +162,6 @@ unit nx86add;
                         cg.a_load_loc_reg(exprasmlist,opsize,right.location,r);
                         emit_reg(A_NOT,TCGSize2Opsize[opsize],r);
                         emit_reg_reg(A_AND,TCGSize2Opsize[opsize],r,left.location.register);
-                        cg.ungetregister(exprasmlist,r);
                      end
                    else
                      begin
@@ -234,9 +232,6 @@ unit nx86add;
               { left was on the stack => swap }
               toggleflag(nf_swaped);
             end;
-
-           { releases the right reference }
-           location_release(exprasmlist,right.location);
          end
         { the nominator in st0 }
         else if (left.location.loc<>LOC_FPUREGISTER) then
@@ -402,7 +397,6 @@ unit nx86add;
         left_must_be_reg(opsize,noswap);
         emit_generic_code(op,opsize,true,extra_not,false);
         location_freetemp(exprasmlist,right.location);
-        location_release(exprasmlist,right.location);
 
         set_result_location_reg;
       end;
@@ -437,9 +431,7 @@ unit nx86add;
         left_must_be_reg(opsize,false);
         emit_generic_code(op,opsize,true,false,false);
         location_freetemp(exprasmlist,right.location);
-        location_release(exprasmlist,right.location);
         location_freetemp(exprasmlist,left.location);
-        location_release(exprasmlist,left.location);
 
         location_reset(location,LOC_FLAGS,OS_NO);
         location.resflags:=getresflags(true);
@@ -484,7 +476,6 @@ unit nx86add;
             if left.location.loc in [LOC_FPUREGISTER,LOC_CFPUREGISTER] then
               location_force_mem(exprasmlist,left.location);
             cg.a_opmm_loc_reg(exprasmlist,op,location.size,left.location,location.register,mms_movescalar);
-            location_release(exprasmlist,left.location);
           end
         else
           begin
@@ -498,7 +489,6 @@ unit nx86add;
             if right.location.loc in [LOC_FPUREGISTER,LOC_CFPUREGISTER] then
               location_force_mem(exprasmlist,right.location);
             cg.a_opmm_loc_reg(exprasmlist,op,location.size,right.location,location.register,mms_movescalar);
-            location_release(exprasmlist,right.location);
           end;
       end;
 
@@ -558,8 +548,6 @@ unit nx86add;
                 internalerror(200402223);
             end;
           end;
-        location_release(exprasmlist,right.location);
-        location_release(exprasmlist,left.location);
         location.resflags:=getresflags(true);
       end;
 
@@ -591,10 +579,6 @@ unit nx86add;
 
         left_and_right_must_be_fpureg;
 
-        { releases the left reference }
-        if (left.location.loc in [LOC_CREFERENCE,LOC_REFERENCE]) then
-          location_release(exprasmlist,left.location);
-
         { if we swaped the tree nodes, then use the reverse operator }
         if nf_swaped in flags then
           begin
@@ -625,10 +609,6 @@ unit nx86add;
         pass_left_right;
         left_and_right_must_be_fpureg;
 
-        { releases the left reference }
-        if (left.location.loc in [LOC_CREFERENCE,LOC_REFERENCE]) then
-          location_release(exprasmlist,left.location);
-
 {$ifndef x86_64}
         if aktspecificoptprocessor<ClassPentium2 then
           begin
@@ -637,10 +617,10 @@ unit nx86add;
             tcgx86(cg).dec_fpu_stack;
 
             { load fpu flags }
-            cg.getexplicitregister(exprasmlist,NR_AX);
+            cg.getcpuregister(exprasmlist,NR_AX);
             emit_reg(A_FNSTSW,S_NO,NR_AX);
             emit_none(A_SAHF,S_NO);
-            cg.ungetregister(exprasmlist,NR_AX);
+            cg.ungetcpuregister(exprasmlist,NR_AX);
             if nf_swaped in flags then
              begin
                case nodetype of
@@ -754,7 +734,6 @@ unit nx86add;
                        paramanager.getintparaloc(pocall_default,2,paraloc2);
                        { process parameters }
                        secondpass(left);
-                       location_release(exprasmlist,left.location);
                        if paraloc2.location^.loc=LOC_REGISTER then
                          begin
                            hregister2:=cg.getaddressregister(exprasmlist);
@@ -766,7 +745,6 @@ unit nx86add;
                            cg.a_paramaddr_ref(exprasmlist,left.location.reference,paraloc2);
                          end;
                        secondpass(right);
-                       location_release(exprasmlist,right.location);
                        if paraloc1.location^.loc=LOC_REGISTER then
                          begin
                            hregister1:=cg.getaddressregister(exprasmlist);
@@ -780,21 +758,19 @@ unit nx86add;
                        { push parameters }
                        if paraloc1.location^.loc=LOC_REGISTER then
                          begin
-                           cg.ungetregister(exprasmlist,hregister2);
                            paramanager.allocparaloc(exprasmlist,paraloc2);
                            cg.a_param_reg(exprasmlist,OS_ADDR,hregister2,paraloc2);
                          end;
                        if paraloc2.location^.loc=LOC_REGISTER then
                          begin
-                           cg.ungetregister(exprasmlist,hregister1);
                            paramanager.allocparaloc(exprasmlist,paraloc1);
                            cg.a_param_reg(exprasmlist,OS_ADDR,hregister1,paraloc1);
                          end;
                        paramanager.freeparaloc(exprasmlist,paraloc1);
                        paramanager.freeparaloc(exprasmlist,paraloc2);
-                       cg.allocexplicitregisters(exprasmlist,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
+                       cg.alloccpuregisters(exprasmlist,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
                        cg.a_call_name(exprasmlist,'FPC_SHORTSTR_COMPARE');
-                       cg.deallocexplicitregisters(exprasmlist,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
+                       cg.dealloccpuregisters(exprasmlist,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
                        location_freetemp(exprasmlist,left.location);
                        location_freetemp(exprasmlist,right.location);
                        paraloc1.done;
@@ -900,7 +876,6 @@ unit nx86add;
          left_must_be_reg(opsize,false);
          emit_generic_code(op,opsize,unsigned,extra_not,mboverflow);
          location_freetemp(exprasmlist,right.location);
-         location_release(exprasmlist,right.location);
 
          set_result_location_reg;
       end;
@@ -920,12 +895,8 @@ unit nx86add;
          left_must_be_reg(opsize,false);
          emit_generic_code(A_CMP,opsize,unsigned,false,false);
          location_freetemp(exprasmlist,right.location);
-         location_release(exprasmlist,right.location);
-         if (left.location.loc<>LOC_CREGISTER) then
-           begin
-             location_freetemp(exprasmlist,left.location);
-             location_release(exprasmlist,left.location);
-           end;
+         location_freetemp(exprasmlist,left.location);
+
          location_reset(location,LOC_FLAGS,OS_NO);
          location.resflags:=getresflags(unsigned);
       end;
@@ -935,7 +906,13 @@ begin
 end.
 {
   $Log$
-  Revision 1.12  2004-09-21 17:25:13  peter
+  Revision 1.13  2004-09-25 14:23:55  peter
+    * ungetregister is now only used for cpuregisters, renamed to
+      ungetcpuregister
+    * renamed (get|unget)explicitregister(s) to ..cpuregister
+    * removed location-release/reference_release
+
+  Revision 1.12  2004/09/21 17:25:13  peter
     * paraloc branch merged
 
   Revision 1.11.4.1  2004/08/31 20:43:06  peter

+ 8 - 13
compiler/x86/nx86cnv.pas

@@ -129,19 +129,16 @@ implementation
 {$ifndef cpu64bit}
                 if left.location.size in [OS_64,OS_S64] then
                  begin
-                   location_release(exprasmlist,left.location);
                    hregister:=cg.getintregister(exprasmlist,OS_INT);
                    cg.a_load_ref_reg(exprasmlist,OS_32,OS_32,left.location.reference,hregister);
                    href:=left.location.reference;
                    inc(href.offset,4);
-                   cg.ungetregister(exprasmlist,hregister);
                    cg.a_op_ref_reg(exprasmlist,OP_OR,OS_32,href,hregister);
                  end
                 else
 {$endif cpu64bit}
                  begin
                    location_force_reg(exprasmlist,left.location,left.location.size,true);
-                   location_release(exprasmlist,left.location);
                    cg.a_op_reg_reg(exprasmlist,OP_OR,left.location.size,left.location.register,left.location.register);
                  end;
               end;
@@ -156,16 +153,11 @@ implementation
                  begin
                    hregister:=cg.getintregister(exprasmlist,OS_32);
                    cg.a_load_reg_reg(exprasmlist,OS_32,OS_32,left.location.registerlow,hregister);
-                   cg.ungetregister(exprasmlist,hregister);
-                   location_release(exprasmlist,left.location);
                    cg.a_op_reg_reg(exprasmlist,OP_OR,OS_32,left.location.registerhigh,hregister);
                  end
                 else
 {$endif cpu64bit}
-                 begin
-                   location_release(exprasmlist,left.location);
-                   cg.a_op_reg_reg(exprasmlist,OP_OR,left.location.size,left.location.register,left.location.register);
-                 end;
+                  cg.a_op_reg_reg(exprasmlist,OP_OR,left.location.size,left.location.register,left.location.register);
               end;
             LOC_JUMP :
               begin
@@ -177,7 +169,6 @@ implementation
                 cg.a_label(exprasmlist,falselabel);
                 cg.a_load_const_reg(exprasmlist,OS_INT,0,hregister);
                 cg.a_label(exprasmlist,hlabel);
-                cg.ungetregister(exprasmlist,hregister);
                 cg.a_op_reg_reg(exprasmlist,OP_OR,OS_INT,hregister,hregister);
               end;
             else
@@ -238,7 +229,6 @@ implementation
             if (torddef(left.resulttype.def).typ=u32bit) then
               begin
                 tg.GetTemp(exprasmlist,8,tt_normal,href);
-                location_release(exprasmlist,left.location);
                 location_freetemp(exprasmlist,left.location);
                 cg.a_load_ref_ref(exprasmlist,left.location.size,OS_32,left.location.reference,href);
                 inc(href.offset,4);
@@ -248,7 +238,6 @@ implementation
               end;
 
             { Load from reference to fpu reg }
-            location_release(exprasmlist,left.location);
             case torddef(left.resulttype.def).typ of
               u32bit,
               scurrency,
@@ -301,7 +290,13 @@ implementation
 end.
 {
   $Log$
-  Revision 1.13  2004-06-20 08:55:32  florian
+  Revision 1.14  2004-09-25 14:23:55  peter
+    * ungetregister is now only used for cpuregisters, renamed to
+      ungetcpuregister
+    * renamed (get|unget)explicitregister(s) to ..cpuregister
+    * removed location-release/reference_release
+
+  Revision 1.13  2004/06/20 08:55:32  florian
     * logs truncated
 
   Revision 1.12  2004/06/16 20:07:11  florian

+ 8 - 10
compiler/x86/nx86inl.pas

@@ -190,7 +190,6 @@ implementation
                cg.a_loadfpu_ref_reg(exprasmlist,
                   def_cgsize(left.resulttype.def),
                   left.location.reference,location.register);
-               location_release(exprasmlist,left.location);
              end
          else
             internalerror(309991);
@@ -261,11 +260,8 @@ implementation
                  begin
                    r:=cg.getintregister(exprasmlist,OS_ADDR);
                    cg.a_loadaddr_ref_reg(exprasmlist,left.location.reference,r);
-                   location_release(exprasmlist,left.location);
-                   reference_reset(ref);
-                   ref.base:=r;
+                   reference_reset_base(ref,r,0);
                    exprasmlist.concat(taicpu.op_ref(A_PREFETCHNTA,S_NO,ref));
-                   cg.ungetregister(exprasmlist,r);
                  end;
                else
                  internalerror(200402021);
@@ -307,7 +303,6 @@ implementation
                     inc(tcallparanode(left).left.location.reference.offset,
                       (tordconstnode(tcallparanode(tcallparanode(left).right).left).value div bitsperop)*tcgsize2size[opsize]);
                     cg.a_op_const_ref(exprasmlist,cgop,opsize,l,tcallparanode(left).left.location.reference);
-                    location_release(exprasmlist,tcallparanode(left).left.location);
                   end;
                 LOC_CREGISTER :
                   cg.a_op_const_reg(exprasmlist,cgop,tcallparanode(left).left.location.size,l,tcallparanode(left).left.location.register);
@@ -337,14 +332,11 @@ implementation
                 hregister:=cg.makeregsize(exprasmlist,Tcallparanode(Tcallparanode(left).right).left.location.register,opsize)
               else
                 hregister:=cg.getintregister(exprasmlist,opsize);
-              location_release(exprasmlist,tcallparanode(tcallparanode(left).right).left.location);
               cg.a_load_loc_reg(exprasmlist,opsize,tcallparanode(tcallparanode(left).right).left.location,hregister);
               if (tcallparanode(left).left.location.loc=LOC_REFERENCE) then
                 emit_reg_ref(asmop,tcgsize2opsize[opsize],hregister,tcallparanode(left).left.location.reference)
               else
                 emit_reg_reg(asmop,tcgsize2opsize[opsize],hregister,tcallparanode(left).left.location.register);
-              cg.ungetregister(exprasmlist,hregister);
-              location_release(exprasmlist,Tcallparanode(left).left.location);
             end;
         end;
 
@@ -352,7 +344,13 @@ implementation
 end.
 {
   $Log$
-  Revision 1.5  2004-06-20 08:55:32  florian
+  Revision 1.6  2004-09-25 14:23:55  peter
+    * ungetregister is now only used for cpuregisters, renamed to
+      ungetcpuregister
+    * renamed (get|unget)explicitregister(s) to ..cpuregister
+    * removed location-release/reference_release
+
+  Revision 1.5  2004/06/20 08:55:32  florian
     * logs truncated
 
   Revision 1.4  2004/06/16 20:07:11  florian

+ 7 - 5
compiler/x86/nx86mat.pas

@@ -174,7 +174,6 @@ interface
             if left.location.loc in [LOC_FPUREGISTER,LOC_CFPUREGISTER] then
               location_force_mem(exprasmlist,left.location);
             cg.a_opmm_loc_reg(exprasmlist,OP_SUB,left.location.size,left.location,reg,mms_movescalar);
-            location_release(exprasmlist,left.location);
             location_reset(location,LOC_MMREGISTER,def_cgsize(resulttype.def));
             location.register:=reg;
           end
@@ -185,7 +184,6 @@ interface
               LOC_REFERENCE,
               LOC_CREFERENCE:
                 begin
-                  reference_release(exprasmlist,left.location.reference);
                   location.register:=NR_ST;
                   cg.a_loadfpu_ref_reg(exprasmlist,
                      def_cgsize(left.resulttype.def),
@@ -239,7 +237,6 @@ interface
            case left.expectloc of
              LOC_FLAGS :
                begin
-                 location_release(exprasmlist,left.location);
                  location_reset(location,LOC_FLAGS,OS_NO);
                  location.resflags:=left.location.resflags;
                  inverse_flags(location.resflags);
@@ -251,7 +248,6 @@ interface
              LOC_CREFERENCE :
                begin
                  location_force_reg(exprasmlist,left.location,opsize,true);
-                 location_release(exprasmlist,left.location);
                  emit_reg_reg(A_TEST,TCGSize2Opsize[opsize],left.location.register,left.location.register);
                  location_reset(location,LOC_FLAGS,OS_NO);
                  location.resflags:=F_E;
@@ -308,7 +304,13 @@ end.
 
 {
   $Log$
-  Revision 1.5  2004-06-20 08:55:32  florian
+  Revision 1.6  2004-09-25 14:23:55  peter
+    * ungetregister is now only used for cpuregisters, renamed to
+      ungetcpuregister
+    * renamed (get|unget)explicitregister(s) to ..cpuregister
+    * removed location-release/reference_release
+
+  Revision 1.5  2004/06/20 08:55:32  florian
     * logs truncated
 
   Revision 1.4  2004/06/16 20:07:11  florian

+ 8 - 22
compiler/x86/nx86set.pas

@@ -226,7 +226,6 @@ implementation
                pleftreg:=cg.getintregister(exprasmlist,OS_32);
                opsize:=OS_32;
                cg.a_load_ref_reg(exprasmlist,OS_8,OS_32,left.location.reference,pleftreg);
-               location_release(exprasmlist,left.location);
              end;
 
             { Get a label to jump to the end }
@@ -261,7 +260,6 @@ implementation
                       { move and substract in one instruction with LEA)    }
                       if (left.location.loc = LOC_CREGISTER) then
                         begin
-                          cg.ungetregister(exprasmlist,pleftreg);
                           r:=cg.getintregister(exprasmlist,OS_32);
                           reference_reset_base(href,pleftreg,-setparts[i].start);
                           cg.a_loadaddr_ref_reg(exprasmlist,href,r);
@@ -314,9 +312,6 @@ implementation
              right.location.reference.symbol:=nil;
              { Now place the end label }
              cg.a_label(exprasmlist,l);
-             cg.ungetregister(exprasmlist,pleftreg);
-             if r<>NR_NO then
-              cg.ungetregister(exprasmlist,r);
           end
          else
           begin
@@ -345,7 +340,6 @@ implementation
                     else
                       internalerror(200203312);
                   end;
-                  location_release(exprasmlist,right.location);
                 end
                else
                 begin
@@ -363,7 +357,6 @@ implementation
                         but 8 bits are easier to load                    }
                       hr:=cg.getintregister(exprasmlist,OS_32);
                       cg.a_load_ref_reg(exprasmlist,OS_8,OS_32,left.location.reference,hr);
-                      location_release(exprasmlist,left.location);
                     end;
                   end;
 
@@ -371,9 +364,7 @@ implementation
                     LOC_REGISTER,
                     LOC_CREGISTER :
                       begin
-                        emit_reg_reg(A_BT,S_L,hr,
-                          right.location.register);
-                        cg.ungetregister(exprasmlist,right.location.register);
+                        emit_reg_reg(A_BT,S_L,hr,right.location.register);
                       end;
                      LOC_CONSTANT :
                        begin
@@ -382,19 +373,15 @@ implementation
                          hr2:=cg.getintregister(exprasmlist,OS_32);
                          cg.a_load_const_reg(exprasmlist,OS_32,right.location.value,hr2);
                          emit_reg_reg(A_BT,S_L,hr,hr2);
-                         cg.ungetregister(exprasmlist,hr2);
                        end;
                      LOC_CREFERENCE,
                      LOC_REFERENCE :
                        begin
-                         location_release(exprasmlist,right.location);
                          emit_reg_ref(A_BT,S_L,hr,right.location.reference);
                        end;
                      else
                        internalerror(2002032210);
                   end;
-                  { simply to indicate EDI is deallocated here too (JM) }
-                  cg.ungetregister(exprasmlist,hr);
                   location.resflags:=F_C;
                 end;
              end
@@ -426,7 +413,6 @@ implementation
                           hr2:=cg.getintregister(exprasmlist,OS_32);
                           cg.a_load_const_reg(exprasmlist,OS_32,right.location.value,hr2);
                           emit_reg_reg(A_BT,S_L,hr,hr2);
-                          cg.ungetregister(exprasmlist,hr2);
                        end;
                   else
                     begin
@@ -447,7 +433,6 @@ implementation
                        exprasmlist.concat(taicpu.op_none(A_CLC,S_NO));
                        cg.a_jmp_always(exprasmlist,l2);
                        cg.a_label(exprasmlist,l);
-                       location_release(exprasmlist,left.location);
                        hr:=cg.getintregister(exprasmlist,OS_32);
                        cg.a_load_ref_reg(exprasmlist,OS_32,OS_32,left.location.reference,hr);
                        { We have to load the value into a register because
@@ -455,7 +440,6 @@ implementation
                        hr2:=cg.getintregister(exprasmlist,OS_32);
                        cg.a_load_const_reg(exprasmlist,OS_32,right.location.value,hr2);
                        emit_reg_reg(A_BT,S_L,hr,hr2);
-                       cg.ungetregister(exprasmlist,hr2);
                     end;
                   end;
                   cg.a_label(exprasmlist,l2);
@@ -467,7 +451,6 @@ implementation
                   location.resflags:=F_NE;
                   inc(right.location.reference.offset,tordconstnode(left).value shr 3);
                   emit_const_ref(A_TEST,S_B,1 shl (tordconstnode(left).value and 7),right.location.reference);
-                  location_release(exprasmlist,right.location);
                 end
                else
                 begin
@@ -477,10 +460,7 @@ implementation
                     pleftreg:=cg.getintregister(exprasmlist,OS_32);
                   cg.a_load_loc_reg(exprasmlist,OS_32,left.location,pleftreg);
                   location_freetemp(exprasmlist,left.location);
-                  location_release(exprasmlist,left.location);
                   emit_reg_ref(A_BT,S_L,pleftreg,right.location.reference);
-                  cg.ungetregister(exprasmlist,pleftreg);
-                  location_release(exprasmlist,right.location);
                   { tg.ungetiftemp(exprasmlist,right.location.reference) happens below }
                   location.resflags:=F_C;
                 end;
@@ -495,7 +475,13 @@ begin
 end.
 {
   $Log$
-  Revision 1.4  2004-06-16 20:07:11  florian
+  Revision 1.5  2004-09-25 14:23:55  peter
+    * ungetregister is now only used for cpuregisters, renamed to
+      ungetcpuregister
+    * renamed (get|unget)explicitregister(s) to ..cpuregister
+    * removed location-release/reference_release
+
+  Revision 1.4  2004/06/16 20:07:11  florian
     * dwarf branch merged
 
   Revision 1.3  2004/05/22 23:34:28  peter

+ 12 - 11
compiler/x86_64/nx64add.pas

@@ -57,16 +57,12 @@ interface
         and free the location. }
       r:=cg.getintregister(exprasmlist,OS_INT);
       cg.a_load_loc_reg(exprasmlist,OS_INT,left.location,r);
-      location_release(exprasmlist,left.location);
       { Allocate RAX. }
-      cg.getexplicitregister(exprasmlist,NR_RAX);
+      cg.getcpuregister(exprasmlist,NR_RAX);
       { Load the right value. }
       cg.a_load_loc_reg(exprasmlist,OS_INT,right.location,NR_RAX);
-      location_release(exprasmlist,right.location);
-      { The mul instruction frees register r.}
-      cg.ungetregister(exprasmlist,r);
       { Also allocate RDX, since it is also modified by a mul (JM). }
-      cg.getexplicitregister(exprasmlist,NR_RDX);
+      cg.getcpuregister(exprasmlist,NR_RDX);
       emit_reg(A_MUL,S_Q,r);
       if cs_check_overflow in aktlocalswitches  then
        begin
@@ -75,10 +71,9 @@ interface
          cg.a_call_name(exprasmlist,'FPC_OVERFLOW');
          cg.a_label(exprasmlist,hl4);
        end;
-      { Free RDX }
-      cg.ungetregister(exprasmlist,NR_RDX);
-      { Free RAX }
-      cg.ungetregister(exprasmlist,NR_RAX);
+      { Free RDX,RAX }
+      cg.ungetcpuregister(exprasmlist,NR_RDX);
+      cg.ungetcpuregister(exprasmlist,NR_RAX);
       { Allocate a new register and store the result in RAX in it. }
       location.register:=cg.getintregister(exprasmlist,OS_INT);
       emit_reg_reg(A_MOV,S_Q,NR_RAX,location.register);
@@ -92,7 +87,13 @@ begin
 end.
 {
   $Log$
-  Revision 1.3  2004-06-16 20:07:11  florian
+  Revision 1.4  2004-09-25 14:23:55  peter
+    * ungetregister is now only used for cpuregisters, renamed to
+      ungetcpuregister
+    * renamed (get|unget)explicitregister(s) to ..cpuregister
+    * removed location-release/reference_release
+
+  Revision 1.3  2004/06/16 20:07:11  florian
     * dwarf branch merged
 
   Revision 1.2.2.1  2004/04/26 15:54:33  peter

+ 16 - 25
compiler/x86_64/nx64mat.pas

@@ -96,8 +96,6 @@ implementation
                   emit_const_reg(A_AND,S_Q,tordconstnode(right).value-1,hreg2);
                   { add to the left value }
                   emit_reg_reg(A_ADD,S_Q,hreg2,hreg1);
-                  { release EDX if we used it }
-                  cg.ungetregister(exprasmlist,hreg2);
                   { do the shift }
                   emit_const_reg(A_SAR,S_Q,power,hreg1);
               end
@@ -108,10 +106,9 @@ implementation
         else
           begin
             {Bring denominator to a register.}
-            cg.ungetregister(exprasmlist,hreg1);
-            cg.getexplicitregister(exprasmlist,NR_RAX);
+            cg.getcpuregister(exprasmlist,NR_RAX);
             emit_reg_reg(A_MOV,S_Q,hreg1,NR_RAX);
-            cg.getexplicitregister(exprasmlist,NR_RDX);
+            cg.getcpuregister(exprasmlist,NR_RDX);
             {Sign extension depends on the left type.}
             if torddef(left.resulttype.def).typ=u64bit then
               emit_reg_reg(A_XOR,S_Q,NR_RDX,NR_RDX)
@@ -132,26 +129,17 @@ implementation
               begin
                 hreg1:=cg.getintregister(exprasmlist,right.location.size);
                 cg.a_load_loc_reg(exprasmlist,OS_64,right.location,hreg1);
-                cg.ungetregister(exprasmlist,hreg1);
                 emit_reg(op,S_Q,hreg1);
               end;
-            location_release(exprasmlist,right.location);
 
             { Copy the result into a new register. Release RAX & RDX.}
+            cg.ungetcpuregister(exprasmlist,NR_RDX);
+            cg.ungetcpuregister(exprasmlist,NR_RAX);
+            location.register:=cg.getintregister(exprasmlist,OS_INT);
             if nodetype=divn then
-              begin
-                cg.ungetregister(exprasmlist,NR_RDX);
-                cg.ungetregister(exprasmlist,NR_RAX);
-                location.register:=cg.getintregister(exprasmlist,OS_INT);
-                emit_reg_reg(A_MOV,S_Q,NR_RAX,location.register);
-              end
+              cg.a_load_reg_reg(exprasmlist,OS_INT,OS_INT,NR_RAX,location.register)
             else
-              begin
-                cg.ungetregister(exprasmlist,NR_RAX);
-                cg.ungetregister(exprasmlist,NR_RDX);
-                location.register:=cg.getintregister(exprasmlist,OS_INT);
-                emit_reg_reg(A_MOV,S_Q,NR_RDX,location.register);
-              end;
+              cg.a_load_reg_reg(exprasmlist,OS_INT,OS_INT,NR_RDX,location.register);
           end;
       end;
 
@@ -188,7 +176,6 @@ implementation
             mask:=63;
           end;
 
-
         { load left operators in a register }
         location_copy(location,left.location);
         location_force_reg(exprasmlist,location,opsize,false);
@@ -199,13 +186,11 @@ implementation
         else
           begin
             { load right operators in a RCX }
-            if right.location.loc<>LOC_CREGISTER then
-              location_release(exprasmlist,right.location);
-            cg.getexplicitregister(exprasmlist,NR_RCX);
+            cg.getcpuregister(exprasmlist,NR_RCX);
             cg.a_load_loc_reg(exprasmlist,OS_INT,right.location,NR_RCX);
 
             { right operand is in ECX }
-            cg.ungetregister(exprasmlist,NR_RCX);
+            cg.ungetcpuregister(exprasmlist,NR_RCX);
             emit_reg_reg(op,tcgsize2opsize[opsize],NR_CL,location.register);
           end;
       end;
@@ -219,7 +204,13 @@ begin
 end.
 {
   $Log$
-  Revision 1.6  2004-06-20 08:55:32  florian
+  Revision 1.7  2004-09-25 14:23:55  peter
+    * ungetregister is now only used for cpuregisters, renamed to
+      ungetcpuregister
+    * renamed (get|unget)explicitregister(s) to ..cpuregister
+    * removed location-release/reference_release
+
+  Revision 1.6  2004/06/20 08:55:32  florian
     * logs truncated
 
   Revision 1.5  2004/06/16 20:07:11  florian