2
0
Эх сурвалжийг харах

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

peter 21 жил өмнө
parent
commit
65c3ba277c
45 өөрчлөгдсөн 696 нэмэгдсэн , 1136 устгасан
  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
      type
        trgcpu = class(trgobj)
        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;
          procedure ungetregisterint(list: taasmoutput; reg: tregister); override;
        end;
        end;
 
 
@@ -44,7 +44,7 @@ unit rgcpu;
     uses
     uses
       cgobj;
       cgobj;
 
 
-    function trgcpu.getexplicitregisterint(list: taasmoutput; reg: tregister): tregister;
+    function trgcpu.getcpuregisterint(list: taasmoutput; reg: tregister): tregister;
 
 
       begin
       begin
         if reg = R_0 then
         if reg = R_0 then
@@ -52,7 +52,7 @@ unit rgcpu;
             cg.a_reg_alloc(list,reg);
             cg.a_reg_alloc(list,reg);
             result := reg;
             result := reg;
           end
           end
-        else result := inherited getexplicitregisterint(list,reg);
+        else result := inherited getcpuregisterint(list,reg);
       end;
       end;
 
 
 
 
@@ -71,7 +71,13 @@ end.
 
 
 {
 {
   $Log$
   $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
     * logs truncated
 
 
 }
 }

+ 8 - 29
compiler/cg64f32.pas

@@ -209,7 +209,6 @@ unit cg64f32;
       var
       var
         tmpreg: tregister;
         tmpreg: tregister;
         tmpref: treference;
         tmpref: treference;
-        got_scratch: boolean;
       begin
       begin
         if target_info.endian = endian_big then
         if target_info.endian = endian_big then
           begin
           begin
@@ -217,12 +216,10 @@ unit cg64f32;
             reg.reglo := reg.reghi;
             reg.reglo := reg.reghi;
             reg.reghi := tmpreg;
             reg.reghi := tmpreg;
           end;
           end;
-        got_scratch:=false;
         tmpref := ref;
         tmpref := ref;
         if (tmpref.base=reg.reglo) then
         if (tmpref.base=reg.reglo) then
          begin
          begin
            tmpreg:=cg.getaddressregister(list);
            tmpreg:=cg.getaddressregister(list);
-           got_scratch:=true;
            cg.a_load_reg_reg(list,OS_ADDR,OS_ADDR,tmpref.base,tmpreg);
            cg.a_load_reg_reg(list,OS_ADDR,OS_ADDR,tmpref.base,tmpreg);
            tmpref.base:=tmpreg;
            tmpref.base:=tmpreg;
          end
          end
@@ -233,15 +230,12 @@ unit cg64f32;
          if (tmpref.index=reg.reglo) then
          if (tmpref.index=reg.reglo) then
           begin
           begin
             tmpreg:=cg.getaddressregister(list);
             tmpreg:=cg.getaddressregister(list);
-            got_scratch:=true;
             cg.a_load_reg_reg(list,OS_ADDR,OS_ADDR,tmpref.index,tmpreg);
             cg.a_load_reg_reg(list,OS_ADDR,OS_ADDR,tmpref.index,tmpreg);
             tmpref.index:=tmpreg;
             tmpref.index:=tmpreg;
           end;
           end;
         cg.a_load_ref_reg(list,OS_32,OS_32,tmpref,reg.reglo);
         cg.a_load_ref_reg(list,OS_32,OS_32,tmpref,reg.reglo);
         inc(tmpref.offset,4);
         inc(tmpref.offset,4);
         cg.a_load_ref_reg(list,OS_32,OS_32,tmpref,reg.reghi);
         cg.a_load_ref_reg(list,OS_32,OS_32,tmpref,reg.reghi);
-        if got_scratch then
-          cg.ungetregister(list,tmpreg);
       end;
       end;
 
 
 
 
@@ -459,8 +453,6 @@ unit cg64f32;
         tempreg.reglo:=cg.getintregister(list,OS_32);
         tempreg.reglo:=cg.getintregister(list,OS_32);
         a_load64_ref_reg(list,ref,tempreg);
         a_load64_ref_reg(list,ref,tempreg);
         a_op64_reg_reg(list,op,tempreg,reg);
         a_op64_reg_reg(list,op,tempreg,reg);
-        cg.ungetregister(list,tempreg.reglo);
-        cg.ungetregister(list,tempreg.reghi);
       end;
       end;
 
 
 
 
@@ -473,8 +465,6 @@ unit cg64f32;
         a_load64_ref_reg(list,ref,tempreg);
         a_load64_ref_reg(list,ref,tempreg);
         a_op64_reg_reg(list,op,reg,tempreg);
         a_op64_reg_reg(list,op,reg,tempreg);
         a_load64_reg_ref(list,tempreg,ref);
         a_load64_reg_ref(list,tempreg,ref);
-        cg.ungetregister(list,tempreg.reglo);
-        cg.ungetregister(list,tempreg.reghi);
       end;
       end;
 
 
 
 
@@ -487,8 +477,6 @@ unit cg64f32;
         a_load64_ref_reg(list,ref,tempreg);
         a_load64_ref_reg(list,ref,tempreg);
         a_op64_const_reg(list,op,value,tempreg);
         a_op64_const_reg(list,op,value,tempreg);
         a_load64_reg_ref(list,tempreg,ref);
         a_load64_reg_ref(list,tempreg,ref);
-        cg.ungetregister(list,tempreg.reglo);
-        cg.ungetregister(list,tempreg.reghi);
       end;
       end;
 
 
 
 
@@ -569,7 +557,6 @@ unit cg64f32;
         opsize   : tcgsize;
         opsize   : tcgsize;
         oldregisterdef: boolean;
         oldregisterdef: boolean;
         from_signed,to_signed: boolean;
         from_signed,to_signed: boolean;
-        got_scratch: boolean;
         temploc : tlocation;
         temploc : tlocation;
 
 
       begin
       begin
@@ -585,12 +572,10 @@ unit cg64f32;
              if l.loc in [LOC_REGISTER,LOC_CREGISTER] then
              if l.loc in [LOC_REGISTER,LOC_CREGISTER] then
                begin
                begin
                  hreg := l.registerhigh;
                  hreg := l.registerhigh;
-                 got_scratch := false
                end
                end
              else
              else
                begin
                begin
                  hreg:=cg.getintregister(list,OS_32);
                  hreg:=cg.getintregister(list,OS_32);
-                 got_scratch := true;
                  a_load64high_ref_reg(list,l.reference,hreg);
                  a_load64high_ref_reg(list,l.reference,hreg);
                end;
                end;
              objectlibrary.getlabel(poslabel);
              objectlibrary.getlabel(poslabel);
@@ -604,9 +589,6 @@ unit cg64f32;
                  objectlibrary.getlabel(neglabel);
                  objectlibrary.getlabel(neglabel);
                  cg.a_cmp_const_reg_label(list,OS_32,OC_EQ,-1,hreg,neglabel);
                  cg.a_cmp_const_reg_label(list,OS_32,OC_EQ,-1,hreg,neglabel);
                end;
                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 }
              { For all other values we have a range check error }
              cg.a_call_name(list,'FPC_RANGEERROR');
              cg.a_call_name(list,'FPC_RANGEERROR');
 
 
@@ -635,20 +617,15 @@ unit cg64f32;
                  if l.loc in [LOC_REGISTER,LOC_CREGISTER] then
                  if l.loc in [LOC_REGISTER,LOC_CREGISTER] then
                    begin
                    begin
                      hreg := l.registerlow;
                      hreg := l.registerlow;
-                     got_scratch := false
                    end
                    end
                  else
                  else
                    begin
                    begin
                      hreg:=cg.getintregister(list,OS_32);
                      hreg:=cg.getintregister(list,OS_32);
-                     got_scratch := true;
                      a_load64low_ref_reg(list,l.reference,hreg);
                      a_load64low_ref_reg(list,l.reference,hreg);
                    end;
                    end;
                  { get a new neglabel (JM) }
                  { get a new neglabel (JM) }
                  objectlibrary.getlabel(neglabel);
                  objectlibrary.getlabel(neglabel);
                  cg.a_cmp_const_reg_label(list,OS_32,OC_LT,0,hreg,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');
                  cg.a_call_name(list,'FPC_RANGEERROR');
 
 
@@ -688,12 +665,10 @@ unit cg64f32;
                        hreg := l.register;
                        hreg := l.register;
                        opsize := def_cgsize(fromdef);
                        opsize := def_cgsize(fromdef);
                      end;
                      end;
-                   got_scratch := false;
                  end
                  end
                else
                else
                  begin
                  begin
                    hreg:=cg.getintregister(list,OS_32);
                    hreg:=cg.getintregister(list,OS_32);
-                   got_scratch := true;
 
 
                    opsize := def_cgsize(fromdef);
                    opsize := def_cgsize(fromdef);
                    if opsize in [OS_64,OS_S64] then
                    if opsize in [OS_64,OS_S64] then
@@ -704,14 +679,12 @@ unit cg64f32;
                objectlibrary.getlabel(poslabel);
                objectlibrary.getlabel(poslabel);
                cg.a_cmp_const_reg_label(list,opsize,OC_GTE,0,hreg,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_call_name(list,'FPC_RANGEERROR');
                cg.a_label(list,poslabel);
                cg.a_label(list,poslabel);
              end;
              end;
       end;
       end;
 
 
+
     function tcg64f32.optimize64_op_const_reg(list: taasmoutput; var op: topcg; var a : int64; var reg: tregister64): boolean;
     function tcg64f32.optimize64_op_const_reg(list: taasmoutput; var op: topcg; var a : int64; var reg: tregister64): boolean;
       var
       var
         lowvalue, highvalue : longint;
         lowvalue, highvalue : longint;
@@ -807,7 +780,13 @@ unit cg64f32;
 end.
 end.
 {
 {
   $Log$
   $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
     * paraloc branch merged
 
 
   Revision 1.61.4.2  2004/09/20 20:46:34  peter
   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;
           function getflagregister(list:Taasmoutput;size:Tcgsize):Tregister;virtual;abstract;
           {Does the generic cg need SIMD registers, like getmmxregister? Or should
           {Does the generic cg need SIMD registers, like getmmxregister? Or should
            the cpu specific child cg object have such a method?}
            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_reg_instruction(instr:Tai;r:tregister);virtual;
           procedure add_move_instruction(instr:Taicpu);virtual;
           procedure add_move_instruction(instr:Taicpu);virtual;
 
 
           function  uses_registers(rt:Tregistertype):boolean;virtual;
           function  uses_registers(rt:Tregistertype):boolean;virtual;
           {# Get a specific register.}
           {# 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.}
           {# 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.}
           {# 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;
           procedure do_register_allocation(list:Taasmoutput;headertai:tai);virtual;
 
 
@@ -339,11 +338,10 @@ unit cgobj;
 
 
              @param(source Source reference of copy)
              @param(source Source reference of copy)
              @param(dest Destination 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))
              @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
           {# 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
              to destination, if loadref is true, it assumes that it first must load
              the source address from the memory location where
              the source address from the memory location where
@@ -353,11 +351,10 @@ unit cgobj;
 
 
              @param(source Source reference of copy)
              @param(source Source reference of copy)
              @param(dest Destination 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))
              @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
           {# This should emit the opcode to a shortrstring from the source
              to destination, if loadref is true, it assumes that it first must load
              to destination, if loadref is true, it assumes that it first must load
              the source address from the memory location where
              the source address from the memory location where
@@ -365,11 +362,10 @@ unit cgobj;
 
 
              @param(source Source reference of copy)
              @param(source Source reference of copy)
              @param(dest Destination 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))
              @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_incrrefcount(list : taasmoutput;t: tdef; const ref: treference;loadref : boolean);
           procedure g_decrrefcount(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;
     end;
 {$endif cpu64bit}
 {$endif cpu64bit}
 
 
-    procedure reference_release(list: taasmoutput; const ref : treference);
-
     { tlocation handling }
     { tlocation handling }
 
 
     procedure location_reset(var l : tlocation;lt:TCGLoc;lsize:TCGSize);
     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_freetemp(list: taasmoutput; const l : tlocation);
     procedure location_copy(var destloc:tlocation; const sourceloc : tlocation);
     procedure location_copy(var destloc:tlocation; const sourceloc : tlocation);
     procedure location_swap(var destloc,sourceloc : tlocation);
     procedure location_swap(var destloc,sourceloc : tlocation);
@@ -622,44 +615,35 @@ implementation
       end;
       end;
 
 
 
 
-    procedure tcg.getexplicitregister(list:Taasmoutput;r:Tregister);
+    procedure tcg.getcpuregister(list:Taasmoutput;r:Tregister);
       begin
       begin
         if not assigned(rg[getregtype(r)]) then
         if not assigned(rg[getregtype(r)]) then
           internalerror(200312125);
           internalerror(200312125);
-        rg[getregtype(r)].getexplicitregister(list,r);
+        rg[getregtype(r)].getcpuregister(list,r);
       end;
       end;
 
 
 
 
-    procedure tcg.ungetregister(list:Taasmoutput;r:Tregister);
+    procedure tcg.ungetcpuregister(list:Taasmoutput;r:Tregister);
       begin
       begin
         if not assigned(rg[getregtype(r)]) then
         if not assigned(rg[getregtype(r)]) then
           internalerror(200312126);
           internalerror(200312126);
-        rg[getregtype(r)].ungetregister(list,r);
+        rg[getregtype(r)].ungetcpuregister(list,r);
       end;
       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
       begin
         if assigned(rg[rt]) then
         if assigned(rg[rt]) then
-          rg[rt].allocexplicitregisters(list,r)
+          rg[rt].alloccpuregisters(list,r)
         else
         else
           internalerror(200310092);
           internalerror(200310092);
       end;
       end;
 
 
 
 
-    procedure tcg.deallocexplicitregisters(list:Taasmoutput;rt:Tregistertype;r:Tcpuregisterset);
+    procedure tcg.dealloccpuregisters(list:Taasmoutput;rt:Tregistertype;r:Tcpuregisterset);
       begin
       begin
         if assigned(rg[rt]) then
         if assigned(rg[rt]) then
-          rg[rt].deallocexplicitregisters(list,r)
+          rg[rt].dealloccpuregisters(list,r)
         else
         else
           internalerror(200310093);
           internalerror(200310093);
       end;
       end;
@@ -792,7 +776,7 @@ implementation
                  ref.offset:=paraloc.location^.reference.offset;
                  ref.offset:=paraloc.location^.reference.offset;
                  { use concatcopy, because it can also be a float which fails when
                  { use concatcopy, because it can also be a float which fails when
                    load_ref_ref is used }
                    load_ref_ref is used }
-                 g_concatcopy(list,r,ref,tcgsize2size[size],false,false);
+                 g_concatcopy(list,r,ref,tcgsize2size[size],false);
               end
               end
             else
             else
               internalerror(2002071004);
               internalerror(2002071004);
@@ -823,7 +807,6 @@ implementation
       begin
       begin
          hr:=getaddressregister(list);
          hr:=getaddressregister(list);
          a_loadaddr_ref_reg(list,r,hr);
          a_loadaddr_ref_reg(list,r,hr);
-         ungetregister(list,hr);
          a_param_reg(list,OS_ADDR,hr,paraloc);
          a_param_reg(list,OS_ADDR,hr,paraloc);
       end;
       end;
 
 
@@ -836,7 +819,7 @@ implementation
          if not(paraloc.location^.loc in [LOC_REFERENCE,LOC_CREFERENCE]) then
          if not(paraloc.location^.loc in [LOC_REFERENCE,LOC_CREFERENCE]) then
            internalerror(2003010901);
            internalerror(2003010901);
          reference_reset_base(ref,paraloc.location^.reference.index,paraloc.location^.reference.offset);
          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;
       end;
 
 
 
 
@@ -852,8 +835,8 @@ implementation
                 begin
                 begin
                   if getsupreg(paraloc.register)<first_int_imreg then
                   if getsupreg(paraloc.register)<first_int_imreg then
                     begin
                     begin
-                      getexplicitregister(list,paraloc.register);
-                      ungetregister(list,paraloc.register);
+                      getcpuregister(list,paraloc.register);
+                      ungetcpuregister(list,paraloc.register);
                     end;
                     end;
                   a_load_reg_ref(list,paraloc.size,paraloc.size,paraloc.register,ref);
                   a_load_reg_ref(list,paraloc.size,paraloc.size,paraloc.register,ref);
                 end;
                 end;
@@ -862,8 +845,8 @@ implementation
                 begin
                 begin
                   if getsupreg(paraloc.register)<first_mm_imreg then
                   if getsupreg(paraloc.register)<first_mm_imreg then
                     begin
                     begin
-                      getexplicitregister(list,paraloc.register);
-                      ungetregister(list,paraloc.register);
+                      getcpuregister(list,paraloc.register);
+                      ungetcpuregister(list,paraloc.register);
                     end;
                     end;
                   a_loadmm_reg_ref(list,paraloc.size,paraloc.size,paraloc.register,ref,shuffle);
                   a_loadmm_reg_ref(list,paraloc.size,paraloc.size,paraloc.register,ref,shuffle);
                 end;
                 end;
@@ -872,8 +855,8 @@ implementation
                 begin
                 begin
                   if getsupreg(paraloc.register)<first_fpu_imreg then
                   if getsupreg(paraloc.register)<first_fpu_imreg then
                     begin
                     begin
-                      getexplicitregister(list,paraloc.register);
-                      ungetregister(list,paraloc.register);
+                      getcpuregister(list,paraloc.register);
+                      ungetcpuregister(list,paraloc.register);
                     end;
                     end;
                   a_loadfpu_reg_ref(list,paraloc.size,paraloc.register,ref);
                   a_loadfpu_reg_ref(list,paraloc.size,paraloc.register,ref);
                 end;
                 end;
@@ -882,7 +865,7 @@ implementation
                   reference_reset_base(href,paraloc.reference.index,paraloc.reference.offset);
                   reference_reset_base(href,paraloc.reference.index,paraloc.reference.offset);
                   { use concatcopy, because it can also be a float which fails when
                   { use concatcopy, because it can also be a float which fails when
                     load_ref_ref is used }
                     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;
                 end;
               else
               else
                 internalerror(2002081302);
                 internalerror(2002081302);
@@ -913,8 +896,8 @@ implementation
             begin
             begin
               if getsupreg(paraloc.location^.register)<first_int_imreg then
               if getsupreg(paraloc.location^.register)<first_int_imreg then
                 begin
                 begin
-                  getexplicitregister(list,paraloc.location^.register);
-                  ungetregister(list,paraloc.location^.register);
+                  getcpuregister(list,paraloc.location^.register);
+                  ungetcpuregister(list,paraloc.location^.register);
                 end;
                 end;
               a_load_reg_reg(list,paraloc.location^.size,paraloc.location^.size,paraloc.location^.register,reg)
               a_load_reg_reg(list,paraloc.location^.size,paraloc.location^.size,paraloc.location^.register,reg)
             end;
             end;
@@ -923,8 +906,8 @@ implementation
             begin
             begin
               if getsupreg(paraloc.location^.register)<first_fpu_imreg then
               if getsupreg(paraloc.location^.register)<first_fpu_imreg then
                 begin
                 begin
-                  getexplicitregister(list,paraloc.location^.register);
-                  ungetregister(list,paraloc.location^.register);
+                  getcpuregister(list,paraloc.location^.register);
+                  ungetcpuregister(list,paraloc.location^.register);
                 end;
                 end;
               a_loadfpu_reg_reg(list,paraloc.location^.size,paraloc.location^.register,reg);
               a_loadfpu_reg_reg(list,paraloc.location^.size,paraloc.location^.register,reg);
             end;
             end;
@@ -933,8 +916,8 @@ implementation
             begin
             begin
               if getsupreg(paraloc.location^.register)<first_mm_imreg then
               if getsupreg(paraloc.location^.register)<first_mm_imreg then
                 begin
                 begin
-                  getexplicitregister(list,paraloc.location^.register);
-                  ungetregister(list,paraloc.location^.register);
+                  getcpuregister(list,paraloc.location^.register);
+                  ungetcpuregister(list,paraloc.location^.register);
                 end;
                 end;
               a_loadmm_reg_reg(list,paraloc.location^.size,paraloc.location^.size,paraloc.location^.register,reg,shuffle);
               a_loadmm_reg_reg(list,paraloc.location^.size,paraloc.location^.size,paraloc.location^.register,reg,shuffle);
             end;
             end;
@@ -964,7 +947,6 @@ implementation
         tmpreg:=getintregister(list,tosize);
         tmpreg:=getintregister(list,tosize);
         a_load_ref_reg(list,fromsize,tosize,sref,tmpreg);
         a_load_ref_reg(list,fromsize,tosize,sref,tmpreg);
         a_load_reg_ref(list,tosize,tosize,tmpreg,dref);
         a_load_reg_ref(list,tosize,tosize,tmpreg,dref);
-        ungetregister(list,tmpreg);
       end;
       end;
 
 
 
 
@@ -975,7 +957,6 @@ implementation
         tmpreg:=getintregister(list,size);
         tmpreg:=getintregister(list,size);
         a_load_const_reg(list,size,a,tmpreg);
         a_load_const_reg(list,size,a,tmpreg);
         a_load_reg_ref(list,size,size,tmpreg,ref);
         a_load_reg_ref(list,size,size,tmpreg,ref);
-        ungetregister(list,tmpreg);
       end;
       end;
 
 
 
 
@@ -1146,7 +1127,7 @@ implementation
             begin
             begin
               reference_reset_base(href,paraloc.location^.reference.index,paraloc.location^.reference.offset);
               reference_reset_base(href,paraloc.location^.reference.index,paraloc.location^.reference.offset);
               { concatcopy should choose the best way to copy the data }
               { 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
             end
           else
           else
             internalerror(200402201);
             internalerror(200402201);
@@ -1162,7 +1143,6 @@ implementation
         a_load_ref_reg(list,size,size,ref,tmpreg);
         a_load_ref_reg(list,size,size,ref,tmpreg);
         a_op_const_reg(list,op,size,a,tmpreg);
         a_op_const_reg(list,op,size,a,tmpreg);
         a_load_reg_ref(list,size,size,tmpreg,ref);
         a_load_reg_ref(list,size,size,tmpreg,ref);
-        ungetregister(list,tmpreg);
       end;
       end;
 
 
 
 
@@ -1187,7 +1167,6 @@ implementation
         a_load_ref_reg(list,size,size,ref,tmpreg);
         a_load_ref_reg(list,size,size,ref,tmpreg);
         a_op_reg_reg(list,op,size,reg,tmpreg);
         a_op_reg_reg(list,op,size,reg,tmpreg);
         a_load_reg_ref(list,size,size,tmpreg,ref);
         a_load_reg_ref(list,size,size,tmpreg,ref);
-        ungetregister(list,tmpreg);
       end;
       end;
 
 
 
 
@@ -1209,7 +1188,6 @@ implementation
               tmpreg:=getintregister(list,size);
               tmpreg:=getintregister(list,size);
               a_load_ref_reg(list,size,size,ref,tmpreg);
               a_load_ref_reg(list,size,size,ref,tmpreg);
               a_op_reg_reg(list,op,size,tmpreg,reg);
               a_op_reg_reg(list,op,size,tmpreg,reg);
-              ungetregister(list,tmpreg);
             end;
             end;
         end;
         end;
       end;
       end;
@@ -1243,7 +1221,6 @@ implementation
               tmpreg:=getintregister(list,loc.size);
               tmpreg:=getintregister(list,loc.size);
               a_load_ref_reg(list,loc.size,loc.size,ref,tmpreg);
               a_load_ref_reg(list,loc.size,loc.size,ref,tmpreg);
               a_op_reg_ref(list,op,loc.size,tmpreg,loc.reference);
               a_op_reg_ref(list,op,loc.size,tmpreg,loc.reference);
-              ungetregister(list,tmpreg);
             end;
             end;
           else
           else
             internalerror(200109061);
             internalerror(200109061);
@@ -1274,7 +1251,6 @@ implementation
             a_load_reg_reg(list,size,size,src2,tmpreg);
             a_load_reg_reg(list,size,size,src2,tmpreg);
             a_op_reg_reg(list,op,size,src1,tmpreg);
             a_op_reg_reg(list,op,size,src1,tmpreg);
             a_load_reg_reg(list,size,size,tmpreg,dst);
             a_load_reg_reg(list,size,size,tmpreg,dst);
-            ungetregister(list,tmpreg);
           end;
           end;
       end;
       end;
 
 
@@ -1285,14 +1261,13 @@ implementation
 
 
       var
       var
         tmpreg: tregister;
         tmpreg: tregister;
-
       begin
       begin
         tmpreg:=getintregister(list,size);
         tmpreg:=getintregister(list,size);
         a_load_ref_reg(list,size,size,ref,tmpreg);
         a_load_ref_reg(list,size,size,ref,tmpreg);
         a_cmp_const_reg_label(list,size,cmp_op,a,tmpreg,l);
         a_cmp_const_reg_label(list,size,cmp_op,a,tmpreg,l);
-        ungetregister(list,tmpreg);
       end;
       end;
 
 
+
     procedure tcg.a_cmp_const_loc_label(list : taasmoutput;size : tcgsize;cmp_op : topcmp;a : aint;const loc : tlocation;
     procedure tcg.a_cmp_const_loc_label(list : taasmoutput;size : tcgsize;cmp_op : topcmp;a : aint;const loc : tlocation;
       l : tasmlabel);
       l : tasmlabel);
 
 
@@ -1315,7 +1290,6 @@ implementation
         tmpreg:=getintregister(list,size);
         tmpreg:=getintregister(list,size);
         a_load_ref_reg(list,size,size,ref,tmpreg);
         a_load_ref_reg(list,size,size,ref,tmpreg);
         a_cmp_reg_reg_label(list,size,cmp_op,tmpreg,reg,l);
         a_cmp_reg_reg_label(list,size,cmp_op,tmpreg,reg,l);
-        ungetregister(list,tmpreg);
       end;
       end;
 
 
 
 
@@ -1326,7 +1300,6 @@ implementation
         tmpreg:=getintregister(list,size);
         tmpreg:=getintregister(list,size);
         a_load_ref_reg(list,size,size,ref,tmpreg);
         a_load_ref_reg(list,size,size,ref,tmpreg);
         a_cmp_reg_reg_label(list,size,cmp_op,reg,tmpreg,l);
         a_cmp_reg_reg_label(list,size,cmp_op,reg,tmpreg,l);
-        ungetregister(list,tmpreg);
       end;
       end;
 
 
 
 
@@ -1360,7 +1333,6 @@ implementation
               tmpreg:=getintregister(list,size);
               tmpreg:=getintregister(list,size);
               a_load_ref_reg(list,size,size,loc.reference,tmpreg);
               a_load_ref_reg(list,size,size,loc.reference,tmpreg);
               a_cmp_ref_reg_label(list,size,cmp_op,ref,tmpreg,l);
               a_cmp_ref_reg_label(list,size,cmp_op,ref,tmpreg,l);
-              ungetregister(list,tmpreg);
             end
             end
           else
           else
             internalerror(200109061);
             internalerror(200109061);
@@ -1429,7 +1401,6 @@ implementation
            end
            end
          else
          else
            a_parammm_reg(list,paraloc.location^.size,hr,paraloc,shuffle);
            a_parammm_reg(list,paraloc.location^.size,hr,paraloc,shuffle);
-         ungetregister(list,hr);
       end;
       end;
 
 
 
 
@@ -1461,7 +1432,6 @@ implementation
            end
            end
          else
          else
            a_opmm_reg_reg(list,op,size,hr,reg,shuffle);
            a_opmm_reg_reg(list,op,size,hr,reg,shuffle);
-         ungetregister(list,hr);
       end;
       end;
 
 
 
 
@@ -1484,7 +1454,6 @@ implementation
              a_opmm_reg_reg(list,op,size,reg,hr,shuffle);
              a_opmm_reg_reg(list,op,size,reg,hr,shuffle);
              a_loadmm_reg_ref(list,size,size,hr,ref,shuffle);
              a_loadmm_reg_ref(list,size,size,hr,ref,shuffle);
            end;
            end;
-         ungetregister(list,hr);
       end;
       end;
 
 
 
 
@@ -1501,7 +1470,7 @@ implementation
       end;
       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
       var
         paraloc1,paraloc2,paraloc3 : TCGPara;
         paraloc1,paraloc2,paraloc3 : TCGPara;
       begin
       begin
@@ -1520,23 +1489,21 @@ implementation
           a_param_ref(list,OS_ADDR,source,paraloc1)
           a_param_ref(list,OS_ADDR,source,paraloc1)
         else
         else
           a_paramaddr_ref(list,source,paraloc1);
           a_paramaddr_ref(list,source,paraloc1);
-        if delsource then
-         reference_release(list,source);
         paramanager.freeparaloc(list,paraloc3);
         paramanager.freeparaloc(list,paraloc3);
         paramanager.freeparaloc(list,paraloc2);
         paramanager.freeparaloc(list,paraloc2);
         paramanager.freeparaloc(list,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_MOVE');
         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;
         paraloc3.done;
         paraloc2.done;
         paraloc2.done;
         paraloc1.done;
         paraloc1.done;
       end;
       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
       var
         paraloc1,paraloc2,paraloc3 : TCGPara;
         paraloc1,paraloc2,paraloc3 : TCGPara;
       begin
       begin
@@ -1553,18 +1520,16 @@ implementation
           a_param_ref(list,OS_ADDR,source,paraloc2)
           a_param_ref(list,OS_ADDR,source,paraloc2)
         else
         else
           a_paramaddr_ref(list,source,paraloc2);
           a_paramaddr_ref(list,source,paraloc2);
-        if delsource then
-         reference_release(list,source);
         paramanager.allocparaloc(list,paraloc1);
         paramanager.allocparaloc(list,paraloc1);
         a_param_const(list,OS_INT,len,paraloc1);
         a_param_const(list,OS_INT,len,paraloc1);
         paramanager.freeparaloc(list,paraloc3);
         paramanager.freeparaloc(list,paraloc3);
         paramanager.freeparaloc(list,paraloc2);
         paramanager.freeparaloc(list,paraloc2);
         paramanager.freeparaloc(list,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_SHORTSTR_ASSIGN');
         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;
         paraloc3.done;
         paraloc2.done;
         paraloc2.done;
         paraloc1.done;
         paraloc1.done;
@@ -1613,9 +1578,9 @@ implementation
             paramanager.allocparaloc(list,paraloc1);
             paramanager.allocparaloc(list,paraloc1);
             a_param_ref(list,OS_ADDR,ref,paraloc1);
             a_param_ref(list,OS_ADDR,ref,paraloc1);
             paramanager.freeparaloc(list,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);
             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
           end
          else
          else
           begin
           begin
@@ -1629,9 +1594,9 @@ implementation
               a_paramaddr_ref(list,ref,paraloc1);
               a_paramaddr_ref(list,ref,paraloc1);
             paramanager.freeparaloc(list,paraloc1);
             paramanager.freeparaloc(list,paraloc1);
             paramanager.freeparaloc(list,paraloc2);
             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');
             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;
           end;
          paraloc2.done;
          paraloc2.done;
          paraloc1.done;
          paraloc1.done;
@@ -1694,9 +1659,9 @@ implementation
             paramanager.freeparaloc(list,paraloc1);
             paramanager.freeparaloc(list,paraloc1);
             if needrtti then
             if needrtti then
               paramanager.freeparaloc(list,paraloc2);
               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);
             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
           end
          else
          else
           begin
           begin
@@ -1710,9 +1675,9 @@ implementation
               a_paramaddr_ref(list,ref,paraloc1);
               a_paramaddr_ref(list,ref,paraloc1);
             paramanager.freeparaloc(list,paraloc1);
             paramanager.freeparaloc(list,paraloc1);
             paramanager.freeparaloc(list,paraloc2);
             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');
             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;
          end;
         { Temp locations need always to be reset to 0 }
         { Temp locations need always to be reset to 0 }
         if tg.istemp(ref) then
         if tg.istemp(ref) then
@@ -1723,7 +1688,6 @@ implementation
                 a_load_ref_reg(list,OS_ADDR,OS_ADDR,ref,hreg);
                 a_load_ref_reg(list,OS_ADDR,OS_ADDR,ref,hreg);
                 reference_reset_base(href,hreg,0);
                 reference_reset_base(href,hreg,0);
                 a_load_const_ref(list,OS_ADDR,0,href);
                 a_load_const_ref(list,OS_ADDR,0,href);
-                ungetregister(list,hreg);
               end
               end
             else
             else
               a_load_const_ref(list,OS_ADDR,0,ref);
               a_load_const_ref(list,OS_ADDR,0,ref);
@@ -1759,11 +1723,11 @@ implementation
                 a_paramaddr_ref(list,ref,paraloc1);
                 a_paramaddr_ref(list,ref,paraloc1);
               paramanager.freeparaloc(list,paraloc1);
               paramanager.freeparaloc(list,paraloc1);
               paramanager.freeparaloc(list,paraloc2);
               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');
               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;
            end;
         paraloc1.done;
         paraloc1.done;
         paraloc2.done;
         paraloc2.done;
@@ -1794,7 +1758,6 @@ implementation
                      a_load_ref_reg(list,OS_ADDR,OS_ADDR,ref,hreg);
                      a_load_ref_reg(list,OS_ADDR,OS_ADDR,ref,hreg);
                      reference_reset_base(href,hreg,0);
                      reference_reset_base(href,hreg,0);
                      a_load_const_ref(list,OS_ADDR,0,href);
                      a_load_const_ref(list,OS_ADDR,0,href);
-                     ungetregister(list,hreg);
                    end
                    end
                  else
                  else
                    a_load_const_ref(list,OS_ADDR,0,ref);
                    a_load_const_ref(list,OS_ADDR,0,ref);
@@ -1812,11 +1775,11 @@ implementation
                 a_paramaddr_ref(list,ref,paraloc1);
                 a_paramaddr_ref(list,ref,paraloc1);
               paramanager.freeparaloc(list,paraloc1);
               paramanager.freeparaloc(list,paraloc1);
               paramanager.freeparaloc(list,paraloc2);
               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');
               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;
            end;
         paraloc1.done;
         paraloc1.done;
         paraloc2.done;
         paraloc2.done;
@@ -1954,8 +1917,6 @@ implementation
         a_op_const_reg(list,OP_SUB,OS_INT,aint(lto),hreg);
         a_op_const_reg(list,OP_SUB,OS_INT,aint(lto),hreg);
         objectlibrary.getlabel(neglabel);
         objectlibrary.getlabel(neglabel);
         a_cmp_const_reg_label(list,OS_INT,OC_BE,aint(hto-lto),hreg,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_call_name(list,'FPC_RANGEERROR');
         a_label(list,neglabel);
         a_label(list,neglabel);
       end;
       end;
@@ -1969,7 +1930,6 @@ implementation
         tmpreg:=getintregister(list,size);
         tmpreg:=getintregister(list,size);
         g_flags2reg(list,size,f,tmpreg);
         g_flags2reg(list,size,f,tmpreg);
         a_load_reg_ref(list,size,size,tmpreg,ref);
         a_load_reg_ref(list,size,size,tmpreg,ref);
-        ungetregister(list,tmpreg);
       end;
       end;
 
 
 
 
@@ -2013,9 +1973,9 @@ implementation
            a_param_reg(list,OS_ADDR,reg,paraloc1);
            a_param_reg(list,OS_ADDR,reg,paraloc1);
            paramanager.freeparaloc(list,paraloc1);
            paramanager.freeparaloc(list,paraloc1);
            paramanager.freeparaloc(list,paraloc2);
            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');
            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
          end
         else
         else
          if (cs_check_range in aktlocalswitches) then
          if (cs_check_range in aktlocalswitches) then
@@ -2023,9 +1983,9 @@ implementation
             paramanager.allocparaloc(list,paraloc1);
             paramanager.allocparaloc(list,paraloc1);
             a_param_reg(list,OS_ADDR,reg,paraloc1);
             a_param_reg(list,OS_ADDR,reg,paraloc1);
             paramanager.freeparaloc(list,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');
             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;
           end;
         paraloc1.done;
         paraloc1.done;
         paraloc2.done;
         paraloc2.done;
@@ -2062,11 +2022,11 @@ implementation
         paramanager.allocparaloc(list,paraloc1);
         paramanager.allocparaloc(list,paraloc1);
         a_param_reg(list,OS_INT,sizereg,paraloc1);
         a_param_reg(list,OS_INT,sizereg,paraloc1);
         paramanager.freeparaloc(list,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');
         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_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);
         a_load_reg_ref(list,OS_ADDR,OS_ADDR,NR_FUNCTION_RESULT_REG,ref);
         paraloc1.done;
         paraloc1.done;
@@ -2090,19 +2050,14 @@ implementation
         paramanager.freeparaloc(list,paraloc3);
         paramanager.freeparaloc(list,paraloc3);
         paramanager.freeparaloc(list,paraloc2);
         paramanager.freeparaloc(list,paraloc2);
         paramanager.freeparaloc(list,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_MOVE');
         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;
         paraloc3.done;
         paraloc2.done;
         paraloc2.done;
         paraloc1.done;
         paraloc1.done;
-
-        { release used registers }
-        ungetregister(list,sizereg);
-        ungetregister(list,sourcereg);
-        ungetregister(list,destreg);
       end;
       end;
 
 
 
 
@@ -2117,11 +2072,11 @@ implementation
         paramanager.allocparaloc(list,paraloc1);
         paramanager.allocparaloc(list,paraloc1);
         a_param_ref(list,OS_ADDR,ref,paraloc1);
         a_param_ref(list,OS_ADDR,ref,paraloc1);
         paramanager.freeparaloc(list,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');
         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;
         paraloc1.done;
       end;
       end;
 
 
@@ -2187,16 +2142,6 @@ implementation
 {$endif cpu64bit}
 {$endif cpu64bit}
 
 
 
 
-{****************************************************************************
-                                  TReference
-****************************************************************************}
-
-    procedure reference_release(list: taasmoutput; const ref : treference);
-      begin
-        cg.ungetreference(list,ref);
-      end;
-
-
 {****************************************************************************
 {****************************************************************************
                                   TLocation
                                   TLocation
 ****************************************************************************}
 ****************************************************************************}
@@ -2213,25 +2158,6 @@ implementation
       end;
       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);
     procedure location_freetemp(list:taasmoutput; const l : tlocation);
       begin
       begin
         if (l.loc in [LOC_REFERENCE,LOC_CREFERENCE]) then
         if (l.loc in [LOC_REFERENCE,LOC_CREFERENCE]) then
@@ -2266,7 +2192,13 @@ finalization
 end.
 end.
 {
 {
   $Log$
   $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
     * paraloc branch merged
 
 
   Revision 1.168.4.4  2004/09/20 20:45:57  peter
   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);
                   tmpreg:=getintregister(list,pushsize);
                   a_load_ref_reg(list,size,pushsize,r,tmpreg);
                   a_load_ref_reg(list,size,pushsize,r,tmpreg);
                   list.concat(taicpu.op_reg(A_PUSH,TCgsize2opsize[pushsize],tmpreg));
                   list.concat(taicpu.op_reg(A_PUSH,TCgsize2opsize[pushsize],tmpreg));
-                  ungetregister(list,tmpreg);
                 end
                 end
               else
               else
                 list.concat(taicpu.op_ref(A_PUSH,TCgsize2opsize[pushsize],r));
                 list.concat(taicpu.op_ref(A_PUSH,TCgsize2opsize[pushsize],r));
@@ -179,7 +178,6 @@ unit cgcpu;
                     begin
                     begin
                       tmpreg:=getaddressregister(list);
                       tmpreg:=getaddressregister(list);
                       a_loadaddr_ref_reg(list,r,tmpreg);
                       a_loadaddr_ref_reg(list,r,tmpreg);
-                      ungetregister(list,tmpreg);
                       list.concat(taicpu.op_reg(A_PUSH,opsize,tmpreg));
                       list.concat(taicpu.op_reg(A_PUSH,opsize,tmpreg));
                     end;
                     end;
                 end
                 end
@@ -310,7 +308,7 @@ unit cgcpu;
 {$endif}
 {$endif}
       begin
       begin
         { get stack space }
         { 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_ref_reg(A_MOV,S_L,lenref,NR_EDI));
         list.concat(Taicpu.op_reg(A_INC,S_L,NR_EDI));
         list.concat(Taicpu.op_reg(A_INC,S_L,NR_EDI));
         if (elesize<>1) then
         if (elesize<>1) then
@@ -337,9 +335,9 @@ unit cgcpu;
 
 
              a_label(list,ok);
              a_label(list,ok);
              list.concat(Taicpu.op_reg_reg(A_SUB,S_L,NR_EDI,NR_ESP));
              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 }
              { 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_ref_reg(A_MOV,S_L,lenref,NR_EDI));
              list.concat(Taicpu.op_reg(A_INC,S_L,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);
         a_load_reg_reg(list,OS_INT,OS_INT,NR_ESP,NR_EDI);
 
 
         { Allocate other registers }
         { Allocate other registers }
-        getexplicitregister(list,NR_ECX);
-        getexplicitregister(list,NR_ESI);
+        getcpuregister(list,NR_ECX);
+        getcpuregister(list,NR_ESI);
 
 
         { load count }
         { load count }
         a_load_ref_reg(list,OS_INT,OS_INT,lenref,NR_ECX);
         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_W : list.concat(Taicpu.Op_none(A_MOVSW,S_NO));
           S_L : list.concat(Taicpu.Op_none(A_MOVSD,S_NO));
           S_L : list.concat(Taicpu.Op_none(A_MOVSD,S_NO));
         end;
         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 }
         { patch the new address }
         a_load_reg_ref(list,OS_INT,OS_INT,NR_ESP,ref);
         a_load_reg_ref(list,OS_INT,OS_INT,NR_ESP,ref);
@@ -558,7 +556,13 @@ begin
 end.
 end.
 {
 {
   $Log$
   $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
     * paraloc branch merged
 
 
   Revision 1.51.4.1  2004/08/31 20:43:06  peter
   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);
         left_must_be_reg(opsize,noswap);
 {        emit_generic_code(op,opsize,true,extra_not,false);}
 {        emit_generic_code(op,opsize,true,extra_not,false);}
         location_freetemp(exprasmlist,right.location);
         location_freetemp(exprasmlist,right.location);
-        location_release(exprasmlist,right.location);
         if cmpop then
         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);
         set_result_location(cmpop,true);
       end;
       end;
 {$endif SUPPORT_MMX}
 {$endif SUPPORT_MMX}
@@ -227,7 +223,6 @@ interface
                 right.location.register64,
                 right.location.register64,
                 left.location.register64);
                 left.location.register64);
             end;
             end;
-           location_release(exprasmlist,right.location);
          end
          end
         else
         else
          begin
          begin
@@ -242,23 +237,13 @@ interface
               { the carry flag is still ok }
               { the carry flag is still ok }
               emit_reg_reg(op2,opsize,left.location.registerhigh,r);
               emit_reg_reg(op2,opsize,left.location.registerhigh,r);
               emit_reg_reg(A_MOV,opsize,r,left.location.registerhigh);
               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
             end
            else
            else
             begin
             begin
               cg64.a_op64_loc_reg(exprasmlist,op,right.location,
               cg64.a_op64_loc_reg(exprasmlist,op,right.location,
                 left.location.register64);
                 left.location.register64);
-              if (right.location.loc<>LOC_CREGISTER) then
-               begin
-                 location_freetemp(exprasmlist,right.location);
-                 location_release(exprasmlist,right.location);
-               end;
             end;
             end;
+          location_freetemp(exprasmlist,right.location);
          end;
          end;
 
 
         { only in case of overflow operations }
         { only in case of overflow operations }
@@ -398,7 +383,6 @@ interface
            firstjmp64bitcmp;
            firstjmp64bitcmp;
            emit_reg_reg(A_CMP,S_L,right.location.registerlow,left.location.registerlow);
            emit_reg_reg(A_CMP,S_L,right.location.registerlow,left.location.registerlow);
            secondjmp64bitcmp;
            secondjmp64bitcmp;
-           location_release(exprasmlist,right.location);
          end
          end
         else
         else
          begin
          begin
@@ -421,7 +405,6 @@ interface
                  secondjmp64bitcmp;
                  secondjmp64bitcmp;
                  cg.a_jmp_always(exprasmlist,falselabel);
                  cg.a_jmp_always(exprasmlist,falselabel);
                  location_freetemp(exprasmlist,right.location);
                  location_freetemp(exprasmlist,right.location);
-                 location_release(exprasmlist,right.location);
                end;
                end;
              LOC_CONSTANT :
              LOC_CONSTANT :
                begin
                begin
@@ -435,11 +418,7 @@ interface
            end;
            end;
          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 }
         { we have LOC_JUMP as result }
         location_reset(location,LOC_JUMP,OS_NO)
         location_reset(location,LOC_JUMP,OS_NO)
@@ -560,8 +539,6 @@ interface
                  if not(left.location.loc in [LOC_REFERENCE,LOC_CREFERENCE]) then
                  if not(left.location.loc in [LOC_REFERENCE,LOC_CREFERENCE]) then
                   internalerror(200203245);
                   internalerror(200203245);
 
 
-                 location_release(exprasmlist,left.location);
-
                  hregister:=cg.getmmxregister(exprasmlist,OS_M64);
                  hregister:=cg.getmmxregister(exprasmlist,OS_M64);
                  emit_ref_reg(A_MOVQ,S_NO,left.location.reference,hregister);
                  emit_ref_reg(A_MOVQ,S_NO,left.location.reference,hregister);
                end;
                end;
@@ -588,7 +565,6 @@ interface
                begin
                begin
                  if not(left.location.loc in [LOC_REFERENCE,LOC_CREFERENCE]) then
                  if not(left.location.loc in [LOC_REFERENCE,LOC_CREFERENCE]) then
                   internalerror(200203247);
                   internalerror(200203247);
-                 location_release(exprasmlist,right.location);
                  hreg:=cg.getmmxregister(exprasmlist,OS_M64);
                  hreg:=cg.getmmxregister(exprasmlist,OS_M64);
                  emit_ref_reg(A_MOVQ,S_NO,right.location.reference,hreg);
                  emit_ref_reg(A_MOVQ,S_NO,right.location.reference,hreg);
                  emit_reg_reg(op,S_NO,left.location.register,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
                  if not(right.location.loc in [LOC_REFERENCE,LOC_CREFERENCE]) then
                   internalerror(200203246);
                   internalerror(200203246);
                  emit_ref_reg(op,S_NO,right.location.reference,left.location.register);
                  emit_ref_reg(op,S_NO,right.location.reference,left.location.register);
-                 location_release(exprasmlist,right.location);
                end;
                end;
             end;
             end;
           end
           end
@@ -625,12 +600,9 @@ interface
           end;
           end;
 
 
         location_freetemp(exprasmlist,right.location);
         location_freetemp(exprasmlist,right.location);
-        location_release(exprasmlist,right.location);
         if cmpop then
         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);
         set_result_location(cmpop,true);
       end;
       end;
 {$endif SUPPORT_MMX}
 {$endif SUPPORT_MMX}
@@ -652,16 +624,12 @@ interface
        and free the location.}
        and free the location.}
       r:=cg.getintregister(exprasmlist,OS_INT);
       r:=cg.getintregister(exprasmlist,OS_INT);
       cg.a_load_loc_reg(exprasmlist,OS_INT,left.location,r);
       cg.a_load_loc_reg(exprasmlist,OS_INT,left.location,r);
-      location_release(exprasmlist,left.location);
       {Allocate EAX.}
       {Allocate EAX.}
-      cg.getexplicitregister(exprasmlist,NR_EAX);
+      cg.getcpuregister(exprasmlist,NR_EAX);
       {Load the right value.}
       {Load the right value.}
       cg.a_load_loc_reg(exprasmlist,OS_INT,right.location,NR_EAX);
       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).}
       {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);
       emit_reg(A_MUL,S_L,r);
       if cs_check_overflow in aktlocalswitches  then
       if cs_check_overflow in aktlocalswitches  then
        begin
        begin
@@ -670,13 +638,12 @@ interface
          cg.a_call_name(exprasmlist,'FPC_OVERFLOW');
          cg.a_call_name(exprasmlist,'FPC_OVERFLOW');
          cg.a_label(exprasmlist,hl4);
          cg.a_label(exprasmlist,hl4);
        end;
        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.}
       {Allocate a new register and store the result in EAX in it.}
       location.register:=cg.getintregister(exprasmlist,OS_INT);
       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,left.location);
       location_freetemp(exprasmlist,right.location);
       location_freetemp(exprasmlist,right.location);
     end;
     end;
@@ -687,7 +654,13 @@ begin
 end.
 end.
 {
 {
   $Log$
   $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
     * logs truncated
 
 
   Revision 1.97  2004/06/16 20:07:10  florian
   Revision 1.97  2004/06/16 20:07:10  florian

+ 7 - 4
compiler/i386/n386cal.pas

@@ -75,7 +75,6 @@ implementation
           begin
           begin
             hreg:=cg.getintregister(exprasmlist,OS_INT);
             hreg:=cg.getintregister(exprasmlist,OS_INT);
             exprasmlist.concat(taicpu.op_reg(A_POP,S_L,hreg));
             exprasmlist.concat(taicpu.op_reg(A_POP,S_L,hreg));
-            cg.ungetregister(exprasmlist,hreg);
           end
           end
         { the pentium has two pipes and pop reg is pairable }
         { the pentium has two pipes and pop reg is pairable }
         { but the registers must be different!        }
         { but the registers must be different!        }
@@ -86,10 +85,8 @@ implementation
             begin
             begin
                hreg:=cg.getintregister(exprasmlist,OS_INT);
                hreg:=cg.getintregister(exprasmlist,OS_INT);
                exprasmlist.concat(taicpu.op_reg(A_POP,S_L,hreg));
                exprasmlist.concat(taicpu.op_reg(A_POP,S_L,hreg));
-               cg.ungetregister(exprasmlist,hreg);
                hreg:=cg.getintregister(exprasmlist,OS_INT);
                hreg:=cg.getintregister(exprasmlist,OS_INT);
                exprasmlist.concat(taicpu.op_reg(A_POP,S_L,hreg));
                exprasmlist.concat(taicpu.op_reg(A_POP,S_L,hreg));
-               cg.ungetregister(exprasmlist,hreg);
             end
             end
         else
         else
           if pop_size<>0 then
           if pop_size<>0 then
@@ -102,7 +99,13 @@ begin
 end.
 end.
 {
 {
   $Log$
   $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
     * logs truncated
 
 
   Revision 1.100  2004/06/16 20:07:10  florian
   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);
                   emit_const_reg(A_AND,S_L,tordconstnode(right).value-1,hreg2);
                   { add to the left value }
                   { add to the left value }
                   emit_reg_reg(A_ADD,S_L,hreg2,hreg1);
                   emit_reg_reg(A_ADD,S_L,hreg2,hreg1);
-                  { release EDX if we used it }
-                  cg.ungetregister(exprasmlist,hreg2);
                   { do the shift }
                   { do the shift }
                   emit_const_reg(A_SAR,S_L,power,hreg1);
                   emit_const_reg(A_SAR,S_L,power,hreg1);
                 end
                 end
@@ -132,11 +130,9 @@ implementation
         end
         end
       else
       else
         begin
         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);
           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.}
           {Sign extension depends on the left type.}
           if torddef(left.resulttype.def).typ=u32bit then
           if torddef(left.resulttype.def).typ=u32bit then
             emit_reg_reg(A_XOR,S_L,NR_EDX,NR_EDX)
             emit_reg_reg(A_XOR,S_L,NR_EDX,NR_EDX)
@@ -157,26 +153,17 @@ implementation
             begin
             begin
               hreg1:=cg.getintregister(exprasmlist,right.location.size);
               hreg1:=cg.getintregister(exprasmlist,right.location.size);
               cg.a_load_loc_reg(exprasmlist,OS_32,right.location,hreg1);
               cg.a_load_loc_reg(exprasmlist,OS_32,right.location,hreg1);
-              cg.ungetregister(exprasmlist,hreg1);
               emit_reg(op,S_L,hreg1);
               emit_reg(op,S_L,hreg1);
             end;
             end;
-          location_release(exprasmlist,right.location);
 
 
           {Copy the result into a new register. Release EAX & EDX.}
           {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
           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
           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;
     end;
     end;
 
 
@@ -258,10 +245,8 @@ implementation
           else
           else
             begin
             begin
               { load right operators in a register }
               { 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);
               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 }
               { left operator is already in a register }
               { hence are both in a register }
               { hence are both in a register }
@@ -303,7 +288,7 @@ implementation
                 end;
                 end;
               cg.a_label(exprasmlist,l3);
               cg.a_label(exprasmlist,l3);
 
 
-              cg.ungetregister(exprasmlist,NR_ECX);
+              cg.ungetcpuregister(exprasmlist,NR_ECX);
               location.registerlow:=hregisterlow;
               location.registerlow:=hregisterlow;
               location.registerhigh:=hregisterhigh;
               location.registerhigh:=hregisterhigh;
             end;
             end;
@@ -321,13 +306,11 @@ implementation
           else
           else
             begin
             begin
               { load right operators in a ECX }
               { 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);
               cg.a_load_loc_reg(exprasmlist,OS_32,right.location,NR_ECX);
 
 
               { right operand is in 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);
               emit_reg_reg(op,S_L,NR_CL,location.register);
             end;
             end;
         end;
         end;
@@ -342,7 +325,13 @@ begin
 end.
 end.
 {
 {
   $Log$
   $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
     * logs truncated
 
 
   Revision 1.70  2004/05/23 14:10:17  peter
   Revision 1.70  2004/05/23 14:10:17  peter

+ 7 - 2
compiler/i386/n386mem.pas

@@ -109,7 +109,6 @@ implementation
           end
           end
          else
          else
           begin
           begin
-            cg.ungetreference(exprasmlist,location.reference);
             hreg := cg.getaddressregister(exprasmlist);
             hreg := cg.getaddressregister(exprasmlist);
             cg.a_loadaddr_ref_reg(exprasmlist,location.reference,hreg);
             cg.a_loadaddr_ref_reg(exprasmlist,location.reference,hreg);
             reference_reset_base(location.reference,hreg,0);
             reference_reset_base(location.reference,hreg,0);
@@ -145,7 +144,13 @@ begin
 end.
 end.
 {
 {
   $Log$
   $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
     * logs truncated
 
 
   Revision 1.61  2004/06/16 20:07:10  florian
   Revision 1.61  2004/06/16 20:07:10  florian

+ 15 - 9
compiler/m68k/cgcpu.pas

@@ -427,8 +427,8 @@ unit cgcpu;
                    begin
                    begin
                      r:=NR_D0;
                      r:=NR_D0;
                      r2:=NR_D1;
                      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_const_reg(A_MOVE,S_L,a, r));
                      list.concat(taicpu.op_reg_reg(A_MOVE,S_L,reg, r2));
                      list.concat(taicpu.op_reg_reg(A_MOVE,S_L,reg, r2));
                      cg.a_call_name(list,'FPC_MUL_LONGINT');
                      cg.a_call_name(list,'FPC_MUL_LONGINT');
@@ -456,8 +456,8 @@ unit cgcpu;
                    begin
                    begin
                      r:=NR_D0;
                      r:=NR_D0;
                      r2:=NR_D1;
                      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_const_reg(A_MOVE,S_L,a, r));
                      list.concat(taicpu.op_reg_reg(A_MOVE,S_L,reg, r2));
                      list.concat(taicpu.op_reg_reg(A_MOVE,S_L,reg, r2));
                      cg.a_call_name(list,'FPC_MUL_LONGWORD');
                      cg.a_call_name(list,'FPC_MUL_LONGWORD');
@@ -620,8 +620,8 @@ unit cgcpu;
                    begin
                    begin
                      r:=NR_D0;
                      r:=NR_D0;
                      r2:=NR_D1;
                      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,reg1, r));
                      list.concat(taicpu.op_reg_reg(A_MOVE,S_L,reg2, r2));
                      list.concat(taicpu.op_reg_reg(A_MOVE,S_L,reg2, r2));
                      cg.a_call_name(list,'FPC_MUL_LONGINT');
                      cg.a_call_name(list,'FPC_MUL_LONGINT');
@@ -663,8 +663,8 @@ unit cgcpu;
                    begin
                    begin
                      r:=NR_D0;
                      r:=NR_D0;
                      r2:=NR_D1;
                      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,reg1, r));
                      list.concat(taicpu.op_reg_reg(A_MOVE,S_L,reg2, r2));
                      list.concat(taicpu.op_reg_reg(A_MOVE,S_L,reg2, r2));
                      cg.a_call_name(list,'FPC_MUL_LONGWORD');
                      cg.a_call_name(list,'FPC_MUL_LONGWORD');
@@ -1313,7 +1313,13 @@ end.
 
 
 {
 {
   $Log$
   $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
     * logs truncated
 
 
   Revision 1.27  2004/05/20 21:54:33  florian
   Revision 1.27  2004/05/20 21:54:33  florian

+ 11 - 5
compiler/m68k/n68kmat.pas

@@ -160,9 +160,9 @@ implementation
        begin
        begin
          { On MC68000/68010 mw must pass through RTL routines }
          { On MC68000/68010 mw must pass through RTL routines }
          reg_d0:=NR_D0;
          reg_d0:=NR_D0;
-         cg.getexplicitregister(exprasmlist,NR_D0);
+         cg.getcpuregister(exprasmlist,NR_D0);
          reg_d1:=NR_D1;
          reg_d1:=NR_D1;
-         cg.getexplicitregister(exprasmlist,NR_D1);
+         cg.getcpuregister(exprasmlist,NR_D1);
          { put numerator in d0 }
          { put numerator in d0 }
          cg.a_load_reg_reg(exprasmlist,OS_INT,OS_INT,num,reg_d0);
          cg.a_load_reg_reg(exprasmlist,OS_INT,OS_INT,num,reg_d0);
          { put denum in D1 }
          { put denum in D1 }
@@ -221,9 +221,9 @@ implementation
        begin
        begin
          { On MC68000/68010 mw must pass through RTL routines }
          { On MC68000/68010 mw must pass through RTL routines }
          Reg_d0:=NR_D0;
          Reg_d0:=NR_D0;
-         cg.getexplicitregister(exprasmlist,NR_D0);
+         cg.getcpuregister(exprasmlist,NR_D0);
          Reg_d1:=NR_D1;
          Reg_d1:=NR_D1;
-         cg.getexplicitregister(exprasmlist,NR_D1);
+         cg.getcpuregister(exprasmlist,NR_D1);
          { put numerator in d0 }
          { put numerator in d0 }
          cg.a_load_reg_reg(exprasmlist,OS_INT,OS_INT,num,Reg_D0);
          cg.a_load_reg_reg(exprasmlist,OS_INT,OS_INT,num,Reg_D0);
          { put denum in D1 }
          { put denum in D1 }
@@ -246,7 +246,13 @@ begin
 end.
 end.
 {
 {
   $Log$
   $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
     * logs truncated
 
 
   Revision 1.8  2004/04/25 21:26:16  florian
   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;
           procedure set_result_location_reg;
           { load left and right nodes into registers }
           { load left and right nodes into registers }
           procedure force_reg_left_right(allow_swap,allow_constant:boolean);
           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_opfloat;
           procedure second_opboolean;
           procedure second_opboolean;
@@ -220,23 +218,6 @@ interface
       end;
       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
                                 Smallsets
 *****************************************************************************}
 *****************************************************************************}
@@ -306,7 +287,6 @@ interface
                       else
                       else
                         cg.a_op_const_reg_reg(exprasmlist,OP_OR,location.size,
                         cg.a_op_const_reg_reg(exprasmlist,OP_OR,location.size,
                             left.location.value,tmpreg,location.register);
                             left.location.value,tmpreg,location.register);
-                      cg.ungetregister(exprasmlist,tmpreg);
                     end;
                     end;
                   opdone := true;
                   opdone := true;
                 end
                 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_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_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.a_load_reg_reg(exprasmlist,OS_INT,location.size,tmpreg,location.register);
-                      cg.ungetregister(exprasmlist,tmpreg);
                     end
                     end
                   else
                   else
                     begin
                     begin
@@ -370,8 +349,6 @@ interface
                 right.location.register,left.location.register,
                 right.location.register,left.location.register,
                 location.register);
                 location.register);
           end;
           end;
-
-        release_reg_left_right;
       end;
       end;
 
 
 
 
@@ -450,8 +427,6 @@ interface
                  right.location.value,left.location.register,
                  right.location.value,left.location.register,
                  location.register);
                  location.register);
          end;
          end;
-
-        release_reg_left_right;
       end;
       end;
 
 
 
 
@@ -596,8 +571,6 @@ interface
         { emit overflow check if enabled }
         { emit overflow check if enabled }
         if checkoverflow then
         if checkoverflow then
            cg.g_overflowcheck(exprasmlist,Location,ResultType.Def);
            cg.g_overflowcheck(exprasmlist,Location,ResultType.Def);
-
-        release_reg_left_right;
       end;
       end;
 
 
 
 
@@ -723,15 +696,12 @@ interface
                 aword(left.location.value),tmpreg);
                 aword(left.location.value),tmpreg);
               cg.a_op_reg_reg_reg(exprasmlist,OP_SUB,location.size,
               cg.a_op_reg_reg_reg(exprasmlist,OP_SUB,location.size,
                 right.location.register,tmpreg,location.register);
                 right.location.register,tmpreg,location.register);
-              cg.ungetregister(exprasmlist,tmpreg);
             end;
             end;
         end;
         end;
 
 
         { emit overflow check if required }
         { emit overflow check if required }
         if checkoverflow then
         if checkoverflow then
           cg.g_overflowcheck(exprasmlist,Location,ResultType.Def);
           cg.g_overflowcheck(exprasmlist,Location,ResultType.Def);
-
-        release_reg_left_right;
       end;
       end;
 
 
 
 
@@ -807,7 +777,13 @@ begin
 end.
 end.
 {
 {
   $Log$
   $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
     * logs truncated
 
 
   Revision 1.30  2004/06/16 20:07:08  florian
   Revision 1.30  2004/06/16 20:07:08  florian

+ 10 - 7
compiler/ncgbas.pas

@@ -218,7 +218,7 @@ interface
            end;
            end;
 
 
          { Allocate registers used in the assembler block }
          { 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
          if (current_procinfo.procdef.proccalloption=pocall_inline) then
            begin
            begin
@@ -314,7 +314,7 @@ interface
            end;
            end;
 
 
          { Release register used in the assembler block }
          { Release register used in the assembler block }
-         cg.deallocexplicitregisters(exprasmlist,R_INTREGISTER,used_regs_int);
+         cg.dealloccpuregisters(exprasmlist,R_INTREGISTER,used_regs_int);
        end;
        end;
 
 
 
 
@@ -476,10 +476,7 @@ interface
               cg.a_load_reg_reg(exprasmlist,OS_INT,OS_INT,tempinfo^.loc.reg,
               cg.a_load_reg_reg(exprasmlist,OS_INT,OS_INT,tempinfo^.loc.reg,
                 tempinfo^.loc.reg);
                 tempinfo^.loc.reg);
               if release_to_normal then
               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;
         end;
       end;
       end;
@@ -496,7 +493,13 @@ begin
 end.
 end.
 {
 {
   $Log$
   $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
     * paraloc branch merged
 
 
   Revision 1.65.4.1  2004/08/31 20:43:06  peter
   Revision 1.65.4.1  2004/08/31 20:43:06  peter

+ 34 - 62
compiler/ncgcal.pas

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

+ 8 - 12
compiler/ncgcnv.pas

@@ -117,7 +117,6 @@ interface
         hr : treference;
         hr : treference;
 
 
       begin
       begin
-         location_release(exprasmlist,left.location);
          location_reset(location,LOC_REGISTER,OS_ADDR);
          location_reset(location,LOC_REGISTER,OS_ADDR);
          case tstringdef(left.resulttype.def).string_typ of
          case tstringdef(left.resulttype.def).string_typ of
            st_shortstring :
            st_shortstring :
@@ -201,7 +200,6 @@ interface
     procedure tcgtypeconvnode.second_array_to_pointer;
     procedure tcgtypeconvnode.second_array_to_pointer;
 
 
       begin
       begin
-         location_release(exprasmlist,left.location);
          location_reset(location,LOC_REGISTER,OS_ADDR);
          location_reset(location,LOC_REGISTER,OS_ADDR);
          location.register:=cg.getaddressregister(exprasmlist);
          location.register:=cg.getaddressregister(exprasmlist);
          cg.a_loadaddr_ref_reg(exprasmlist,left.location.reference,location.register);
          cg.a_loadaddr_ref_reg(exprasmlist,left.location.reference,location.register);
@@ -218,7 +216,6 @@ interface
             {$ifdef cpu_uses_separate_address_registers}
             {$ifdef cpu_uses_separate_address_registers}
               if getregtype(left.location.register)<>R_ADDRESSREGISTER then
               if getregtype(left.location.register)<>R_ADDRESSREGISTER then
                 begin
                 begin
-                  location_release(exprasmlist,left.location);
                   location.reference.base:=rg.getaddressregister(exprasmlist);
                   location.reference.base:=rg.getaddressregister(exprasmlist);
                   cg.a_load_reg_reg(exprasmlist,OS_ADDR,OS_ADDR,
                   cg.a_load_reg_reg(exprasmlist,OS_ADDR,OS_ADDR,
                           left.location.register,location.reference.base);
                           left.location.register,location.reference.base);
@@ -236,7 +233,6 @@ interface
           LOC_REFERENCE,
           LOC_REFERENCE,
           LOC_CREFERENCE :
           LOC_CREFERENCE :
             begin
             begin
-              location_release(exprasmlist,left.location);
               location.reference.base:=cg.getaddressregister(exprasmlist);
               location.reference.base:=cg.getaddressregister(exprasmlist);
               cg.a_load_ref_reg(exprasmlist,OS_ADDR,OS_ADDR,left.location.reference,
               cg.a_load_ref_reg(exprasmlist,OS_ADDR,OS_ADDR,left.location.reference,
                 location.reference.base);
                 location.reference.base);
@@ -254,7 +250,6 @@ interface
          case tstringdef(resulttype.def).string_typ of
          case tstringdef(resulttype.def).string_typ of
            st_shortstring :
            st_shortstring :
              begin
              begin
-               location_release(exprasmlist,left.location);
                tg.GetTemp(exprasmlist,256,tt_normal,location.reference);
                tg.GetTemp(exprasmlist,256,tt_normal,location.reference);
                cg.a_load_loc_ref(exprasmlist,left.location.size,left.location,
                cg.a_load_loc_ref(exprasmlist,left.location.size,left.location,
                  location.reference);
                  location.reference);
@@ -289,7 +284,6 @@ interface
             LOC_CREFERENCE,
             LOC_CREFERENCE,
             LOC_REFERENCE:
             LOC_REFERENCE:
               begin
               begin
-                 location_release(exprasmlist,left.location);
                  location.register:=cg.getfpuregister(exprasmlist,left.location.size);
                  location.register:=cg.getfpuregister(exprasmlist,left.location.size);
                  cg.a_loadfpu_loc_reg(exprasmlist,left.location,location.register);
                  cg.a_loadfpu_loc_reg(exprasmlist,left.location,location.register);
                  location_freetemp(exprasmlist,left.location);
                  location_freetemp(exprasmlist,left.location);
@@ -335,7 +329,6 @@ interface
           end
           end
         else
         else
           begin
           begin
-             location_release(exprasmlist,left.location);
              location_reset(location,LOC_REGISTER,OS_ADDR);
              location_reset(location,LOC_REGISTER,OS_ADDR);
              location.register:=cg.getaddressregister(exprasmlist);
              location.register:=cg.getaddressregister(exprasmlist);
              cg.a_loadaddr_ref_reg(exprasmlist,left.location.reference,location.register);
              cg.a_loadaddr_ref_reg(exprasmlist,left.location.reference,location.register);
@@ -393,7 +386,6 @@ interface
                {$ifdef cpu_uses_separate_address_registers}
                {$ifdef cpu_uses_separate_address_registers}
                  if getregtype(left.location.register)<>R_ADDRESSREGISTER then
                  if getregtype(left.location.register)<>R_ADDRESSREGISTER then
                    begin
                    begin
-                     location_release(exprasmlist,left.location);
                      location.register:=cg.getaddressregister(exprasmlist);
                      location.register:=cg.getaddressregister(exprasmlist);
                      cg.a_load_reg_reg(exprasmlist,OS_ADDR,OS_ADDR,
                      cg.a_load_reg_reg(exprasmlist,OS_ADDR,OS_ADDR,
                               left.location.register,location.register);
                               left.location.register,location.register);
@@ -404,10 +396,9 @@ interface
               end;
               end;
             LOC_CREFERENCE,LOC_REFERENCE:
             LOC_CREFERENCE,LOC_REFERENCE:
               begin
               begin
-                location_release(exprasmlist,left.location);
                 location.register:=cg.getaddressregister(exprasmlist);
                 location.register:=cg.getaddressregister(exprasmlist);
                 cg.a_load_ref_reg(exprasmlist,OS_ADDR,OS_ADDR,left.location.reference,location.register);
                 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;
               end;
             else
             else
               internalerror(2002032214);
               internalerror(2002032214);
@@ -430,7 +421,6 @@ interface
             LOC_CREFERENCE,
             LOC_CREFERENCE,
             LOC_REFERENCE:
             LOC_REFERENCE:
               begin
               begin
-                 location_release(exprasmlist,left.location);
                  location.register:=cg.getaddressregister(exprasmlist);
                  location.register:=cg.getaddressregister(exprasmlist);
                  cg.a_load_ref_reg(exprasmlist,OS_ADDR,OS_ADDR,left.location.reference,location.register);
                  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);
@@ -539,7 +529,13 @@ end.
 
 
 {
 {
   $Log$
   $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
     * logs truncated
 
 
   Revision 1.58  2004/06/16 20:07:08  florian
   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;
               do_loopvar_at_end:=false;
               tg.GetTemp(exprasmlist,hs,tt_normal,temp1);
               tg.GetTemp(exprasmlist,hs,tt_normal,temp1);
               temptovalue:=true;
               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
            end
          else
          else
            temptovalue:=false;
            temptovalue:=false;
@@ -803,14 +796,10 @@ implementation
                 begin
                 begin
                   paramanager.allocparaloc(exprasmlist,paraloc3);
                   paramanager.allocparaloc(exprasmlist,paraloc3);
                   if assigned(frametree) then
                   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
                   else
                     cg.a_param_const(exprasmlist,OS_INT,0,paraloc3);
                     cg.a_param_const(exprasmlist,OS_INT,0,paraloc3);
                   { push address }
                   { push address }
-                  location_release(exprasmlist,right.location);
                   paramanager.allocparaloc(exprasmlist,paraloc2);
                   paramanager.allocparaloc(exprasmlist,paraloc2);
                   cg.a_param_loc(exprasmlist,right.location,paraloc2);
                   cg.a_param_loc(exprasmlist,right.location,paraloc2);
                 end
                 end
@@ -830,22 +819,21 @@ implementation
                    else
                    else
                      cg.a_param_const(exprasmlist,OS_INT,0,paraloc2);
                      cg.a_param_const(exprasmlist,OS_INT,0,paraloc2);
                 end;
                 end;
-              location_release(exprasmlist,left.location);
               paramanager.allocparaloc(exprasmlist,paraloc1);
               paramanager.allocparaloc(exprasmlist,paraloc1);
               cg.a_param_loc(exprasmlist,left.location,paraloc1);
               cg.a_param_loc(exprasmlist,left.location,paraloc1);
               paramanager.freeparaloc(exprasmlist,paraloc1);
               paramanager.freeparaloc(exprasmlist,paraloc1);
               paramanager.freeparaloc(exprasmlist,paraloc2);
               paramanager.freeparaloc(exprasmlist,paraloc2);
               paramanager.freeparaloc(exprasmlist,paraloc3);
               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.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
            end
          else
          else
            begin
            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_POPADDRSTACK');
               cg.a_call_name(exprasmlist,'FPC_RERAISE');
               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;
            end;
          paraloc1.done;
          paraloc1.done;
          paraloc2.done;
          paraloc2.done;
@@ -867,17 +855,17 @@ implementation
       var
       var
         paraloc1 : tcgpara;
         paraloc1 : tcgpara;
       begin
       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.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;
          paraloc1.init;
          paramanager.getintparaloc(pocall_default,1,paraloc1);
          paramanager.getintparaloc(pocall_default,1,paraloc1);
          paramanager.allocparaloc(exprasmlist,paraloc1);
          paramanager.allocparaloc(exprasmlist,paraloc1);
          cg.a_param_reg(exprasmlist,OS_ADDR,NR_FUNCTION_RESULT_REG,paraloc1);
          cg.a_param_reg(exprasmlist,OS_ADDR,NR_FUNCTION_RESULT_REG,paraloc1);
          paramanager.freeparaloc(exprasmlist,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.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;
          paraloc1.done;
       end;
       end;
 
 
@@ -989,9 +977,9 @@ implementation
               paramanager.allocparaloc(exprasmlist,paraloc1);
               paramanager.allocparaloc(exprasmlist,paraloc1);
               cg.a_param_const(exprasmlist,OS_ADDR,-1,paraloc1);
               cg.a_param_const(exprasmlist,OS_ADDR,-1,paraloc1);
               paramanager.freeparaloc(exprasmlist,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.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;
               paraloc1.done;
 
 
               { the destruction of the exception object must be also }
               { the destruction of the exception object must be also }
@@ -1011,18 +999,18 @@ implementation
 
 
               free_exception(exprasmlist,destroytemps,0,doobjectdestroy,false);
               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.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;
               paraloc1.init;
               paramanager.getintparaloc(pocall_default,1,paraloc1);
               paramanager.getintparaloc(pocall_default,1,paraloc1);
               paramanager.allocparaloc(exprasmlist,paraloc1);
               paramanager.allocparaloc(exprasmlist,paraloc1);
               cg.a_param_reg(exprasmlist, OS_ADDR, NR_FUNCTION_RESULT_REG, paraloc1);
               cg.a_param_reg(exprasmlist, OS_ADDR, NR_FUNCTION_RESULT_REG, paraloc1);
               paramanager.freeparaloc(exprasmlist,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.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;
               paraloc1.done;
               { we don't need to restore esi here because reraise never }
               { we don't need to restore esi here because reraise never }
               { returns                                                 }
               { returns                                                 }
@@ -1045,9 +1033,9 @@ implementation
               cg.a_label(exprasmlist,exitexceptlabel);
               cg.a_label(exprasmlist,exitexceptlabel);
               { we must also destroy the address frame which guards }
               { we must also destroy the address frame which guards }
               { exception object                                    }
               { 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.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.g_exception_reason_load(exprasmlist,excepttemps.reasonbuf);
               cleanupobjectstack;
               cleanupobjectstack;
               cg.a_jmp_always(exprasmlist,oldaktexitlabel);
               cg.a_jmp_always(exprasmlist,oldaktexitlabel);
@@ -1058,9 +1046,9 @@ implementation
               cg.a_label(exprasmlist,breakexceptlabel);
               cg.a_label(exprasmlist,breakexceptlabel);
               { we must also destroy the address frame which guards }
               { we must also destroy the address frame which guards }
               { exception object                                    }
               { 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.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.g_exception_reason_load(exprasmlist,excepttemps.reasonbuf);
               cleanupobjectstack;
               cleanupobjectstack;
               cg.a_jmp_always(exprasmlist,oldaktbreaklabel);
               cg.a_jmp_always(exprasmlist,oldaktbreaklabel);
@@ -1071,9 +1059,9 @@ implementation
               cg.a_label(exprasmlist,continueexceptlabel);
               cg.a_label(exprasmlist,continueexceptlabel);
               { we must also destroy the address frame which guards }
               { we must also destroy the address frame which guards }
               { exception object                                    }
               { 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.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.g_exception_reason_load(exprasmlist,excepttemps.reasonbuf);
               cleanupobjectstack;
               cleanupobjectstack;
               cg.a_jmp_always(exprasmlist,oldaktcontinuelabel);
               cg.a_jmp_always(exprasmlist,oldaktcontinuelabel);
@@ -1083,9 +1071,9 @@ implementation
            begin
            begin
               { do some magic for exit in the try block }
               { do some magic for exit in the try block }
               cg.a_label(exprasmlist,exittrylabel);
               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.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.g_exception_reason_load(exprasmlist,excepttemps.reasonbuf);
               cg.a_jmp_always(exprasmlist,oldaktexitlabel);
               cg.a_jmp_always(exprasmlist,oldaktexitlabel);
            end;
            end;
@@ -1093,9 +1081,9 @@ implementation
          if fc_break in tryflowcontrol then
          if fc_break in tryflowcontrol then
            begin
            begin
               cg.a_label(exprasmlist,breaktrylabel);
               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.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.g_exception_reason_load(exprasmlist,excepttemps.reasonbuf);
               cg.a_jmp_always(exprasmlist,oldaktbreaklabel);
               cg.a_jmp_always(exprasmlist,oldaktbreaklabel);
            end;
            end;
@@ -1103,9 +1091,9 @@ implementation
          if fc_continue in tryflowcontrol then
          if fc_continue in tryflowcontrol then
            begin
            begin
               cg.a_label(exprasmlist,continuetrylabel);
               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.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.g_exception_reason_load(exprasmlist,excepttemps.reasonbuf);
               cg.a_jmp_always(exprasmlist,oldaktcontinuelabel);
               cg.a_jmp_always(exprasmlist,oldaktcontinuelabel);
            end;
            end;
@@ -1160,9 +1148,9 @@ implementation
          paramanager.allocparaloc(exprasmlist,paraloc1);
          paramanager.allocparaloc(exprasmlist,paraloc1);
          cg.a_paramaddr_ref(exprasmlist,href2,paraloc1);
          cg.a_paramaddr_ref(exprasmlist,href2,paraloc1);
          paramanager.freeparaloc(exprasmlist,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.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 }
          { 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);
          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);
          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.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.getintparaloc(pocall_default,1,paraloc1);
          paramanager.allocparaloc(exprasmlist,paraloc1);
          paramanager.allocparaloc(exprasmlist,paraloc1);
          cg.a_param_reg(exprasmlist, OS_ADDR, NR_FUNCTION_RESULT_REG, paraloc1);
          cg.a_param_reg(exprasmlist, OS_ADDR, NR_FUNCTION_RESULT_REG, paraloc1);
          paramanager.freeparaloc(exprasmlist,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.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 }
          { we don't need to restore esi here because reraise never }
          { returns                                                 }
          { returns                                                 }
          cg.a_call_name(exprasmlist,'FPC_RERAISE');
          cg.a_call_name(exprasmlist,'FPC_RERAISE');
@@ -1454,7 +1442,13 @@ begin
 end.
 end.
 {
 {
   $Log$
   $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
     * paraloc branch merged
 
 
   Revision 1.97.4.2  2004/09/12 18:30:48  peter
   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,paraloc2);
        paramanager.freeparaloc(exprasmlist,paraloc3);
        paramanager.freeparaloc(exprasmlist,paraloc3);
        paramanager.freeparaloc(exprasmlist,paraloc4);
        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.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);
        cg.a_label(exprasmlist,truelabel);
        truelabel:=otlabel;
        truelabel:=otlabel;
        falselabel:=oflabel;
        falselabel:=oflabel;
@@ -265,7 +265,6 @@ implementation
         else
         else
           begin
           begin
             secondpass(left);
             secondpass(left);
-            location_release(exprasmlist,left.location);
             hregister:=cg.getaddressregister(exprasmlist);
             hregister:=cg.getaddressregister(exprasmlist);
 
 
             { handle self inside a method of a class }
             { handle self inside a method of a class }
@@ -311,7 +310,6 @@ implementation
         if inlinenumber=in_sizeof_x then
         if inlinenumber=in_sizeof_x then
            begin
            begin
              reference_reset_base(href,hregister,0);
              reference_reset_base(href,hregister,0);
-             cg.ungetregister(exprasmlist,hregister);
              hregister:=cg.getintregister(exprasmlist,OS_INT);
              hregister:=cg.getintregister(exprasmlist,OS_INT);
              cg.a_load_ref_reg(exprasmlist,OS_INT,OS_INT,href,hregister);
              cg.a_load_ref_reg(exprasmlist,OS_INT,OS_INT,href,hregister);
            end;
            end;
@@ -459,9 +457,7 @@ implementation
 {$endif cpu64bit}
 {$endif cpu64bit}
                  cg.a_op_reg_loc(exprasmlist,addsubop[inlinenumber],
                  cg.a_op_reg_loc(exprasmlist,addsubop[inlinenumber],
                    hregister,tcallparanode(left).left.location);
                    hregister,tcallparanode(left).left.location);
-               location_release(exprasmlist,tcallparanode(tcallparanode(left).right).left.location);
              end;
              end;
-          location_release(exprasmlist,tcallparanode(left).left.location);
           cg.g_overflowcheck(exprasmlist,tcallparanode(left).left.location,tcallparanode(left).resulttype.def);
           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,
           cg.g_rangecheck(exprasmlist,tcallparanode(left).left.location,tcallparanode(left).left.resulttype.def,
               tcallparanode(left).left.resulttype.def);
               tcallparanode(left).left.resulttype.def);
@@ -518,7 +514,6 @@ implementation
                     inc(tcallparanode(left).left.location.reference.offset,
                     inc(tcallparanode(left).left.location.reference.offset,
                       (tordconstnode(tcallparanode(tcallparanode(left).right).left).value div bitsperop)*tcgsize2size[opsize]);
                       (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);
                     cg.a_op_const_ref(exprasmlist,cgop,opsize,l,tcallparanode(left).left.location.reference);
-                    location_release(exprasmlist,tcallparanode(left).left.location);
                   end;
                   end;
                 LOC_CREGISTER :
                 LOC_CREGISTER :
                   cg.a_op_const_reg(exprasmlist,cgop,tcallparanode(left).left.location.size,l,tcallparanode(left).left.location.register);
                   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 }
                   { calculate the correct address of the operand }
                   cg.a_loadaddr_ref_reg(exprasmlist, tcallparanode(left).left.location.reference,addrreg);
                   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.a_op_reg_reg(exprasmlist, OP_ADD, OS_ADDR, addrreg2, addrreg);
-                  cg.ungetregister(exprasmlist,addrreg2);
 
 
                   { hregister contains the bitnumber to add }
                   { hregister contains the bitnumber to add }
                   cg.a_load_const_reg(exprasmlist, opsize, 1, hregister2);
                   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_reg(exprasmlist, OP_NOT, opsize, hregister2, hregister2);
                       cg.a_op_reg_ref(exprasmlist, OP_AND, opsize, hregister2, href);
                       cg.a_op_reg_ref(exprasmlist, OP_AND, opsize, hregister2, href);
                     end;
                     end;
-                  cg.ungetregister(exprasmlist,addrreg);
                 end;
                 end;
-              cg.ungetregister(exprasmlist,hregister);
-              cg.ungetregister(exprasmlist,hregister2);
             end;
             end;
         end;
         end;
 
 
@@ -694,7 +685,13 @@ end.
 
 
 {
 {
   $Log$
   $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
     * paraloc branch merged
 
 
   Revision 1.62.4.1  2004/08/31 20:43:06  peter
   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);
                        hregister:=cg.getaddressregister(exprasmlist);
                        reference_reset_symbol(href,objectlibrary.newasmsymbol('FPC_THREADVAR_RELOCATE',AB_EXTERNAL,AT_DATA),0);
                        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.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);
                        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 }
                        { 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);
                        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);
                        cg.a_param_ref(exprasmlist,OS_ADDR,href,paraloc1);
                        paramanager.freeparaloc(exprasmlist,paraloc1);
                        paramanager.freeparaloc(exprasmlist,paraloc1);
                        paraloc1.done;
                        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.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);
                        hregister:=cg.getaddressregister(exprasmlist);
                        cg.a_load_reg_reg(exprasmlist,OS_INT,OS_ADDR,NR_FUNCTION_RESULT_REG,hregister);
                        cg.a_load_reg_reg(exprasmlist,OS_INT,OS_ADDR,NR_FUNCTION_RESULT_REG,hregister);
                        cg.a_jmp_always(exprasmlist,endrelocatelab);
                        cg.a_jmp_always(exprasmlist,endrelocatelab);
@@ -318,7 +317,6 @@ implementation
                          LOC_CREFERENCE,
                          LOC_CREFERENCE,
                          LOC_REFERENCE:
                          LOC_REFERENCE:
                            begin
                            begin
-                              location_release(exprasmlist,left.location);
                               hregister:=cg.getaddressregister(exprasmlist);
                               hregister:=cg.getaddressregister(exprasmlist);
                               if is_class_or_interface(left.resulttype.def) then
                               if is_class_or_interface(left.resulttype.def) then
                                 cg.a_load_ref_reg(exprasmlist,OS_ADDR,OS_ADDR,left.location.reference,hregister)
                                 cg.a_load_ref_reg(exprasmlist,OS_ADDR,OS_ADDR,left.location.reference,hregister)
@@ -340,32 +338,22 @@ implementation
                         begin
                         begin
                           { load vmt pointer }
                           { load vmt pointer }
                           reference_reset_base(href,hregister,0);
                           reference_reset_base(href,hregister,0);
-                          reference_release(exprasmlist,href);
                           hregister:=cg.getaddressregister(exprasmlist);
                           hregister:=cg.getaddressregister(exprasmlist);
                           cg.a_load_ref_reg(exprasmlist,OS_ADDR,OS_ADDR,href,hregister);
                           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 }
                           { load method address }
+                          reference_reset_base(href,hregister,procdef._class.vmtmethodoffset(procdef.extnumber));
                           hregister:=cg.getaddressregister(exprasmlist);
                           hregister:=cg.getaddressregister(exprasmlist);
                           cg.a_load_ref_reg(exprasmlist,OS_ADDR,OS_ADDR,href,hregister);
                           cg.a_load_ref_reg(exprasmlist,OS_ADDR,OS_ADDR,href,hregister);
                           { ... and store it }
                           { ... and store it }
                           cg.a_load_reg_ref(exprasmlist,OS_ADDR,OS_ADDR,hregister,location.reference);
                           cg.a_load_reg_ref(exprasmlist,OS_ADDR,OS_ADDR,hregister,location.reference);
-                          cg.ungetregister(exprasmlist,hregister);
                         end
                         end
                       else
                       else
                         begin
                         begin
-                          { we don't use the hregister }
-                          cg.ungetregister(exprasmlist,hregister);
                           { load address of the function }
                           { load address of the function }
                           reference_reset_symbol(href,objectlibrary.newasmsymbol(procdef.mangledname,AB_EXTERNAL,AT_FUNCTION),0);
                           reference_reset_symbol(href,objectlibrary.newasmsymbol(procdef.mangledname,AB_EXTERNAL,AT_FUNCTION),0);
                           hregister:=cg.getaddressregister(exprasmlist);
                           hregister:=cg.getaddressregister(exprasmlist);
                           cg.a_loadaddr_ref_reg(exprasmlist,href,hregister);
                           cg.a_loadaddr_ref_reg(exprasmlist,href,hregister);
                           cg.a_load_reg_ref(exprasmlist,OS_ADDR,OS_ADDR,hregister,location.reference);
                           cg.a_load_reg_ref(exprasmlist,OS_ADDR,OS_ADDR,hregister,location.reference);
-                          cg.ungetregister(exprasmlist,hregister);
                         end;
                         end;
                     end
                     end
                   else
                   else
@@ -576,18 +564,10 @@ implementation
                         cgsize:=def_cgsize(left.resulttype.def);
                         cgsize:=def_cgsize(left.resulttype.def);
 {$ifndef cpu64bit}
 {$ifndef cpu64bit}
                         if cgsize in [OS_64,OS_S64] then
                         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
                         else
 {$endif cpu64bit}
 {$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;
                       end;
                     LOC_CFPUREGISTER :
                     LOC_CFPUREGISTER :
                       begin
                       begin
@@ -605,10 +585,10 @@ implementation
                         if (right.location.reference.offset mod sizeof(aint)<>0) and
                         if (right.location.reference.offset mod sizeof(aint)<>0) and
                            (len>sizeof(aint)) then
                            (len>sizeof(aint)) then
                           cg.g_concatcopy_unaligned(exprasmlist,right.location.reference,
                           cg.g_concatcopy_unaligned(exprasmlist,right.location.reference,
-                              left.location.reference,len,false,false)
+                              left.location.reference,len,false)
                         else
                         else
                           cg.g_concatcopy(exprasmlist,right.location.reference,
                           cg.g_concatcopy(exprasmlist,right.location.reference,
-                              left.location.reference,len,false,false);
+                              left.location.reference,len,false);
                       end;
                       end;
                     else
                     else
                       internalerror(200203284);
                       internalerror(200203284);
@@ -679,7 +659,6 @@ implementation
                   if codegenerror then
                   if codegenerror then
                     exit;
                     exit;
                   cg.a_load_const_loc(exprasmlist,1,left.location);
                   cg.a_load_const_loc(exprasmlist,1,left.location);
-                  location_release(exprasmlist,left.location);
                   cg.a_jmp_always(exprasmlist,hlabel);
                   cg.a_jmp_always(exprasmlist,hlabel);
                   { generate the leftnode for the false case }
                   { generate the leftnode for the false case }
                   cg.a_label(exprasmlist,falselabel);
                   cg.a_label(exprasmlist,falselabel);
@@ -710,11 +689,7 @@ implementation
          end;
          end;
 
 
         if releaseright then
         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;
         truelabel:=otlabel;
         falselabel:=oflabel;
         falselabel:=oflabel;
@@ -894,19 +869,12 @@ implementation
                  if vaddr then
                  if vaddr then
                   begin
                   begin
                     location_force_mem(exprasmlist,hp.left.location);
                     location_force_mem(exprasmlist,hp.left.location);
-                    location_release(exprasmlist,hp.left.location);
                     tmpreg:=cg.getaddressregister(exprasmlist);
                     tmpreg:=cg.getaddressregister(exprasmlist);
                     cg.a_loadaddr_ref_reg(exprasmlist,hp.left.location.reference,tmpreg);
                     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);
                     cg.a_load_reg_ref(exprasmlist,OS_ADDR,OS_ADDR,tmpreg,href);
-                    if freetemp then
-                      location_freetemp(exprasmlist,hp.left.location);
                   end
                   end
                  else
                  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 }
                  { update href to the vtype field and write it }
                  dec(href.offset,sizeof(aint));
                  dec(href.offset,sizeof(aint));
                  cg.a_load_const_ref(exprasmlist, OS_INT,vtype,href);
                  cg.a_load_const_ref(exprasmlist, OS_INT,vtype,href);
@@ -916,45 +884,39 @@ implementation
               else
               else
               { normal array constructor of the same type }
               { normal array constructor of the same type }
                begin
                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
                  case hp.left.location.loc of
                    LOC_FPUREGISTER,
                    LOC_FPUREGISTER,
                    LOC_CFPUREGISTER :
                    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_REFERENCE,
                    LOC_CREFERENCE :
                    LOC_CREFERENCE :
                      begin
                      begin
-                       location_release(exprasmlist,hp.left.location);
                        if is_shortstring(hp.left.resulttype.def) then
                        if is_shortstring(hp.left.resulttype.def) then
                          cg.g_copyshortstring(exprasmlist,hp.left.location.reference,href,
                          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
                        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;
                      end;
                    else
                    else
                      begin
                      begin
 {$ifndef cpu64bit}
 {$ifndef cpu64bit}
                        if hp.left.location.size in [OS_64,OS_S64] then
                        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
                        else
 {$endif cpu64bit}
 {$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;
                  end;
                  end;
                  inc(href.offset,elesize);
                  inc(href.offset,elesize);
                end;
                end;
+              if freetemp then
+                location_freetemp(exprasmlist,hp.left.location);
             end;
             end;
            { load next entry }
            { load next entry }
            hp:=tarrayconstructornode(hp.right);
            hp:=tarrayconstructornode(hp.right);
@@ -968,7 +930,13 @@ begin
 end.
 end.
 {
 {
   $Log$
   $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
     * paraloc branch merged
 
 
   Revision 1.123  2004/09/13 20:33:41  peter
   Revision 1.123  2004/09/13 20:33:41  peter

+ 7 - 11
compiler/ncgmat.pas

@@ -192,7 +192,6 @@ implementation
           LOC_REFERENCE,
           LOC_REFERENCE,
           LOC_CREFERENCE :
           LOC_CREFERENCE :
             begin
             begin
-              reference_release(exprasmlist,left.location.reference);
               location.register:=cg.getfpuregister(exprasmlist,location.size);
               location.register:=cg.getfpuregister(exprasmlist,location.size);
               cg.a_loadfpu_ref_reg(exprasmlist,
               cg.a_loadfpu_ref_reg(exprasmlist,
                  def_cgsize(left.resulttype.def),
                  def_cgsize(left.resulttype.def),
@@ -325,8 +324,6 @@ implementation
                   { only used for temporary }
                   { only used for temporary }
                   { purposes                }
                   { purposes                }
                   hdenom := cg.getintregister(exprasmlist,OS_INT);
                   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);
                   cg.a_load_loc_reg(exprasmlist,right.location.size,right.location,hdenom);
                   { verify if the divisor is zero, if so return an error
                   { verify if the divisor is zero, if so return an error
                     immediately
                     immediately
@@ -369,11 +366,9 @@ implementation
 
 
     procedure tcgshlshrnode.second_integer;
     procedure tcgshlshrnode.second_integer;
       var
       var
-         freescratch : boolean;
          op : topcg;
          op : topcg;
          hcountreg : tregister;
          hcountreg : tregister;
       begin
       begin
-         freescratch:=false;
          { determine operator }
          { determine operator }
          case nodetype of
          case nodetype of
            shln: op:=OP_SHL;
            shln: op:=OP_SHL;
@@ -406,16 +401,11 @@ implementation
               if right.location.loc<>LOC_REGISTER then
               if right.location.loc<>LOC_REGISTER then
                 begin
                 begin
                   hcountreg:=cg.getintregister(exprasmlist,OS_INT);
                   hcountreg:=cg.getintregister(exprasmlist,OS_INT);
-                  freescratch := true;
                   cg.a_load_loc_reg(exprasmlist,right.location.size,right.location,hcountreg);
                   cg.a_load_loc_reg(exprasmlist,right.location.size,right.location,hcountreg);
                 end
                 end
               else
               else
                 hcountreg:=right.location.register;
                 hcountreg:=right.location.register;
               cg.a_op_reg_reg(exprasmlist,op,OS_INT,hcountreg,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;
       end;
       end;
 
 
@@ -483,7 +473,13 @@ begin
 end.
 end.
 {
 {
   $Log$
   $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
     * paraloc branch merged
 
 
   Revision 1.27.4.1  2004/08/31 20:43:06  peter
   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_CREFERENCE,
                   LOC_REFERENCE:
                   LOC_REFERENCE:
                     begin
                     begin
-                       location_release(exprasmlist,left.location);
                        reference_reset_base(href,cg.getaddressregister(exprasmlist),tobjectdef(left.resulttype.def).vmt_offset);
                        reference_reset_base(href,cg.getaddressregister(exprasmlist),tobjectdef(left.resulttype.def).vmt_offset);
                        cg.a_loadaddr_ref_reg(exprasmlist,left.location.reference,href.base);
                        cg.a_loadaddr_ref_reg(exprasmlist,left.location.reference,href.base);
                     end;
                     end;
@@ -129,7 +128,6 @@ implementation
                     {$ifdef cpu_uses_separate_address_registers}
                     {$ifdef cpu_uses_separate_address_registers}
                       if getregtype(left.location.register)<>R_ADDRESSREGISTER then
                       if getregtype(left.location.register)<>R_ADDRESSREGISTER then
                         begin
                         begin
-                          location_release(exprasmlist,left.location);
                           reference_reset_base(href,cg.getaddressregister(exprasmlist),tobjectdef(left.resulttype.def).vmt_offset);
                           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);
                           cg.a_load_reg_reg(exprasmlist,OS_ADDR,OS_ADDR,left.location.register,href.base);
                         end
                         end
@@ -141,7 +139,6 @@ implementation
                   LOC_CREFERENCE,
                   LOC_CREFERENCE,
                   LOC_REFERENCE:
                   LOC_REFERENCE:
                     begin
                     begin
-                       location_release(exprasmlist,left.location);
                        reference_reset_base(href,cg.getaddressregister(exprasmlist),tobjectdef(left.resulttype.def).vmt_offset);
                        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);
                        cg.a_load_loc_reg(exprasmlist,OS_ADDR,left.location,href.base);
                     end;
                     end;
@@ -149,7 +146,6 @@ implementation
                     internalerror(200305057);
                     internalerror(200305057);
                end;
                end;
              end;
              end;
-            reference_release(exprasmlist,href);
             location.register:=cg.getaddressregister(exprasmlist);
             location.register:=cg.getaddressregister(exprasmlist);
             cg.g_maybe_testself(exprasmlist,href.base);
             cg.g_maybe_testself(exprasmlist,href.base);
             cg.a_load_ref_reg(exprasmlist,OS_ADDR,OS_ADDR,href,location.register);
             cg.a_load_ref_reg(exprasmlist,OS_ADDR,OS_ADDR,href,location.register);
@@ -223,7 +219,6 @@ implementation
             exit;
             exit;
           end;
           end;
 
 
-         location_release(exprasmlist,left.location);
          location_reset(location,LOC_REGISTER,OS_ADDR);
          location_reset(location,LOC_REGISTER,OS_ADDR);
          location.register:=cg.getaddressregister(exprasmlist);
          location.register:=cg.getaddressregister(exprasmlist);
          { @ on a procvar means returning an address to the procedure that
          { @ on a procvar means returning an address to the procedure that
@@ -255,7 +250,6 @@ implementation
               {$ifdef cpu_uses_separate_address_registers}
               {$ifdef cpu_uses_separate_address_registers}
                 if getregtype(left.location.register)<>R_ADDRESSREGISTER then
                 if getregtype(left.location.register)<>R_ADDRESSREGISTER then
                   begin
                   begin
-                    location_release(exprasmlist,left.location);
                     location.reference.base := cg.getaddressregister(exprasmlist);
                     location.reference.base := cg.getaddressregister(exprasmlist);
                     cg.a_load_reg_reg(exprasmlist,OS_ADDR,OS_ADDR,left.location.register,
                     cg.a_load_reg_reg(exprasmlist,OS_ADDR,OS_ADDR,left.location.register,
                       location.reference.base);
                       location.reference.base);
@@ -268,7 +262,6 @@ implementation
             LOC_CREFERENCE,
             LOC_CREFERENCE,
             LOC_REFERENCE:
             LOC_REFERENCE:
               begin
               begin
-                 location_release(exprasmlist,left.location);
                  location.reference.base:=cg.getaddressregister(exprasmlist);
                  location.reference.base:=cg.getaddressregister(exprasmlist);
                  cg.a_load_loc_reg(exprasmlist,OS_ADDR,left.location,location.reference.base);
                  cg.a_load_loc_reg(exprasmlist,OS_ADDR,left.location,location.reference.base);
               end;
               end;
@@ -284,9 +277,9 @@ implementation
             cg.a_param_reg(exprasmlist, OS_ADDR,location.reference.base,paraloc1);
             cg.a_param_reg(exprasmlist, OS_ADDR,location.reference.base,paraloc1);
             paramanager.freeparaloc(exprasmlist,paraloc1);
             paramanager.freeparaloc(exprasmlist,paraloc1);
             paraloc1.done;
             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.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;
       end;
       end;
 
 
@@ -314,7 +307,6 @@ implementation
                   {$ifdef cpu_uses_separate_address_registers}
                   {$ifdef cpu_uses_separate_address_registers}
                     if getregtype(left.location.register)<>R_ADDRESSREGISTER then
                     if getregtype(left.location.register)<>R_ADDRESSREGISTER then
                       begin
                       begin
-                        location_release(exprasmlist,left.location);
                         location.reference.base:=rg.getaddressregister(exprasmlist);
                         location.reference.base:=rg.getaddressregister(exprasmlist);
                         cg.a_load_reg_reg(exprasmlist,OS_ADDR,OS_ADDR,
                         cg.a_load_reg_reg(exprasmlist,OS_ADDR,OS_ADDR,
                           left.location.register,location.reference.base);
                           left.location.register,location.reference.base);
@@ -326,7 +318,6 @@ implementation
                 LOC_CREFERENCE,
                 LOC_CREFERENCE,
                 LOC_REFERENCE:
                 LOC_REFERENCE:
                   begin
                   begin
-                     location_release(exprasmlist,left.location);
                      location.reference.base:=cg.getaddressregister(exprasmlist);
                      location.reference.base:=cg.getaddressregister(exprasmlist);
                      cg.a_load_loc_reg(exprasmlist,OS_ADDR,left.location,location.reference.base);
                      cg.a_load_loc_reg(exprasmlist,OS_ADDR,left.location,location.reference.base);
                   end;
                   end;
@@ -340,9 +331,9 @@ implementation
                 paramanager.allocparaloc(exprasmlist,paraloc1);
                 paramanager.allocparaloc(exprasmlist,paraloc1);
                 cg.a_param_reg(exprasmlist, OS_ADDR,location.reference.base,paraloc1);
                 cg.a_param_reg(exprasmlist, OS_ADDR,location.reference.base,paraloc1);
                 paramanager.freeparaloc(exprasmlist,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.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;
            end
            end
          else if is_interfacecom(left.resulttype.def) then
          else if is_interfacecom(left.resulttype.def) then
@@ -358,9 +349,9 @@ implementation
                 paramanager.allocparaloc(exprasmlist,paraloc1);
                 paramanager.allocparaloc(exprasmlist,paraloc1);
                 cg.a_param_reg(exprasmlist, OS_ADDR,location.reference.base,paraloc1);
                 cg.a_param_reg(exprasmlist, OS_ADDR,location.reference.base,paraloc1);
                 paramanager.freeparaloc(exprasmlist,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.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;
            end
            end
          else
          else
@@ -400,7 +391,6 @@ implementation
             else
             else
               refnode:=withrefnode;
               refnode:=withrefnode;
             secondpass(refnode);
             secondpass(refnode);
-            location_release(exprasmlist,refnode.location);
             location_freetemp(exprasmlist,refnode.location);
             location_freetemp(exprasmlist,refnode.location);
             if not(refnode.location.loc in [LOC_REFERENCE,LOC_CREFERENCE]) then
             if not(refnode.location.loc in [LOC_REFERENCE,LOC_CREFERENCE]) then
               internalerror(2003092810);
               internalerror(2003092810);
@@ -482,7 +472,6 @@ implementation
           end
           end
          else
          else
           begin
           begin
-            cg.ungetreference(exprasmlist,location.reference);
             hreg := cg.getaddressregister(exprasmlist);
             hreg := cg.getaddressregister(exprasmlist);
             cg.a_loadaddr_ref_reg(exprasmlist,location.reference,hreg);
             cg.a_loadaddr_ref_reg(exprasmlist,location.reference,hreg);
             reference_reset_base(location.reference,hreg,0);
             reference_reset_base(location.reference,hreg,0);
@@ -540,10 +529,7 @@ implementation
                objectlibrary.getlabel(neglabel);
                objectlibrary.getlabel(neglabel);
                objectlibrary.getlabel(poslabel);
                objectlibrary.getlabel(poslabel);
                cg.a_cmp_const_reg_label(exprasmlist,OS_INT,OC_LT,0,hreg,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);
                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_label(exprasmlist,poslabel);
                cg.a_call_name(exprasmlist,'FPC_RANGEERROR');
                cg.a_call_name(exprasmlist,'FPC_RANGEERROR');
                cg.a_label(exprasmlist,neglabel);
                cg.a_label(exprasmlist,neglabel);
@@ -562,9 +548,9 @@ implementation
                cg.a_param_loc(exprasmlist,left.location,paraloc1);
                cg.a_param_loc(exprasmlist,left.location,paraloc1);
                paramanager.freeparaloc(exprasmlist,paraloc1);
                paramanager.freeparaloc(exprasmlist,paraloc1);
                paramanager.freeparaloc(exprasmlist,paraloc2);
                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.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
             end
          else
          else
            cg.g_rangecheck(exprasmlist,right.location,right.resulttype.def,left.resulttype.def);
            cg.g_rangecheck(exprasmlist,right.location,right.resulttype.def,left.resulttype.def);
@@ -612,7 +598,6 @@ implementation
                 LOC_CREFERENCE,
                 LOC_CREFERENCE,
                 LOC_REFERENCE :
                 LOC_REFERENCE :
                   begin
                   begin
-                    location_release(exprasmlist,left.location);
                     location.reference.base:=cg.getaddressregister(exprasmlist);
                     location.reference.base:=cg.getaddressregister(exprasmlist);
                     cg.a_load_ref_reg(exprasmlist,OS_ADDR,OS_ADDR,left.location.reference,location.reference.base);
                     cg.a_load_ref_reg(exprasmlist,OS_ADDR,OS_ADDR,left.location.reference,location.reference.base);
                   end;
                   end;
@@ -628,9 +613,9 @@ implementation
                    paramanager.allocparaloc(exprasmlist,paraloc1);
                    paramanager.allocparaloc(exprasmlist,paraloc1);
                    cg.a_param_reg(exprasmlist,OS_ADDR,location.reference.base,paraloc1);
                    cg.a_param_reg(exprasmlist,OS_ADDR,location.reference.base,paraloc1);
                    paramanager.freeparaloc(exprasmlist,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.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;
                 end;
 
 
               { in ansistrings/widestrings S[1] is p<w>char(S)[0] !! }
               { in ansistrings/widestrings S[1] is p<w>char(S)[0] !! }
@@ -649,7 +634,6 @@ implementation
                 LOC_REFERENCE,
                 LOC_REFERENCE,
                 LOC_CREFERENCE :
                 LOC_CREFERENCE :
                   begin
                   begin
-                     location_release(exprasmlist,left.location);
                      location.reference.base:=cg.getaddressregister(exprasmlist);
                      location.reference.base:=cg.getaddressregister(exprasmlist);
                      cg.a_load_ref_reg(exprasmlist,OS_ADDR,OS_ADDR,
                      cg.a_load_ref_reg(exprasmlist,OS_ADDR,OS_ADDR,
                       left.location.reference,location.reference.base);
                       left.location.reference,location.reference.base);
@@ -718,9 +702,9 @@ implementation
                               cg.a_param_ref(exprasmlist,OS_INT,href,paraloc1);
                               cg.a_param_ref(exprasmlist,OS_INT,href,paraloc1);
                               paramanager.freeparaloc(exprasmlist,paraloc1);
                               paramanager.freeparaloc(exprasmlist,paraloc1);
                               paramanager.freeparaloc(exprasmlist,paraloc2);
                               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.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;
                            end;
 
 
                          st_shortstring:
                          st_shortstring:
@@ -857,9 +841,9 @@ implementation
                               cg.a_param_ref(exprasmlist,OS_INT,href,paraloc1);
                               cg.a_param_ref(exprasmlist,OS_INT,href,paraloc1);
                               paramanager.freeparaloc(exprasmlist,paraloc1);
                               paramanager.freeparaloc(exprasmlist,paraloc1);
                               paramanager.freeparaloc(exprasmlist,paraloc2);
                               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.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;
                            end;
                          st_shortstring:
                          st_shortstring:
                            begin
                            begin
@@ -895,7 +879,13 @@ begin
 end.
 end.
 {
 {
   $Log$
   $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
     * paraloc branch merged
 
 
   Revision 1.95.4.1  2004/08/31 20:43:06  peter
   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
      not(nf_use_strconcat in flags) then
     begin
     begin
        tg.Gettemp(exprasmlist,256,tt_normal,href);
        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);
        location_freetemp(exprasmlist,left.location);
        { return temp reference }
        { return temp reference }
        location_reset(left.location,LOC_REFERENCE,def_cgsize(resulttype.def));
        location_reset(left.location,LOC_REFERENCE,def_cgsize(resulttype.def));
@@ -117,8 +116,6 @@ begin
     { no, make sure it is in a register }
     { no, make sure it is in a register }
     if right.location.loc in [LOC_REFERENCE,LOC_CREFERENCE] then
     if right.location.loc in [LOC_REFERENCE,LOC_CREFERENCE] then
       begin
       begin
-        { free the registers of right }
-        reference_release(exprasmlist,right.location.reference);
         { get register for the char }
         { get register for the char }
         hreg := cg.getintregister(exprasmlist,OS_8);
         hreg := cg.getintregister(exprasmlist,OS_8);
         cg.a_load_ref_reg(exprasmlist,OS_8,OS_8,right.location.reference,hreg);
         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 }
       { no new_reference(href2) because it's only }
       { used once (JM)                            }
       { used once (JM)                            }
       cg.a_load_reg_ref(exprasmlist,OS_8,OS_8,hreg,href2);
       cg.a_load_reg_ref(exprasmlist,OS_8,OS_8,hreg,href2);
-      cg.ungetregister(exprasmlist,hreg);
     end
     end
   else
   else
     cg.a_load_const_ref(exprasmlist,OS_8,tordconstnode(right).value,href2);
     cg.a_load_const_ref(exprasmlist,OS_8,tordconstnode(right).value,href2);
@@ -189,7 +185,6 @@ begin
   { increase the string length }
   { increase the string length }
   cg.a_op_const_reg(exprasmlist,OP_ADD,OS_8,1,lengthreg);
   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.a_load_reg_ref(exprasmlist,OS_8,OS_8,lengthreg,left.location.reference);
-  cg.ungetregister(exprasmlist,lengthreg);
   if checklength then
   if checklength then
     cg.a_label(exprasmlist,l);
     cg.a_label(exprasmlist,l);
   location_copy(location,left.location);
   location_copy(location,left.location);
@@ -201,7 +196,13 @@ end.
 
 
 {
 {
   $Log$
   $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
     * logs truncated
 
 
   Revision 1.13  2004/05/22 23:34:28  peter
   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);
              cg.a_load_const_reg(exprasmlist,location.size,1,location.register);
              { in case value is not found }
              { in case value is not found }
              cg.a_label(exprasmlist,l3);
              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
           end
          else
          else
          {*****************************************************************}
          {*****************************************************************}
@@ -392,8 +381,6 @@ implementation
                   emit_bit_test_reg_reg(exprasmlist,left.location.size,left.location.register,
                   emit_bit_test_reg_reg(exprasmlist,left.location.size,left.location.register,
                       right.location.register,location.size,location.register);
                       right.location.register,location.size,location.register);
                 end;
                 end;
-               location_release(exprasmlist,left.location);
-               location_release(exprasmlist,right.location);
              end
              end
             else
             else
              {************************** NOT SMALL SET ********************}
              {************************** 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_reg(exprasmlist,OP_SUB,opsize,32,left.location.register,hr);
                   cg.a_op_const_reg(exprasmlist,OP_SAR,opsize,31,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 }
                   { if left > 31, then result := 0 else result := result of bit test }
                   cg.a_op_reg_reg(exprasmlist,OP_AND,opsize,hr,hr2);
                   cg.a_op_reg_reg(exprasmlist,OP_AND,opsize,hr,hr2);
                   { allocate a register for the result }
                   { allocate a register for the result }
@@ -449,7 +429,6 @@ implementation
                   { allocate a register for the result }
                   { allocate a register for the result }
                   location.register := cg.getintregister(exprasmlist,location.size);
                   location.register := cg.getintregister(exprasmlist,location.size);
                   cg.a_load_ref_reg(exprasmlist,OS_8,location.size,right.location.reference, location.register);
                   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,
                   cg.a_op_const_reg(exprasmlist,OP_SHR,location.size,tordconstnode(left).value and 7,
                     location.register);
                     location.register);
                   cg.a_op_const_reg(exprasmlist,OP_AND,location.size,1,location.register);
                   cg.a_op_const_reg(exprasmlist,OP_AND,location.size,1,location.register);
@@ -471,22 +450,18 @@ implementation
                     href.index := hr
                     href.index := hr
                   else
                   else
                     begin
                     begin
-                      reference_release(exprasmlist,href);
                       hr2 := cg.getaddressregister(exprasmlist);
                       hr2 := cg.getaddressregister(exprasmlist);
                       cg.a_loadaddr_ref_reg(exprasmlist,href, hr2);
                       cg.a_loadaddr_ref_reg(exprasmlist,href, hr2);
                       reference_reset_base(href,hr2,0);
                       reference_reset_base(href,hr2,0);
                       href.index := hr;
                       href.index := hr;
                     end;
                     end;
-                  reference_release(exprasmlist,href);
                   { allocate a register for the result }
                   { allocate a register for the result }
                   location.register := cg.getintregister(exprasmlist,opsize);
                   location.register := cg.getintregister(exprasmlist,opsize);
                   cg.a_load_ref_reg(exprasmlist,opsize,opsize,href,location.register);
                   cg.a_load_ref_reg(exprasmlist,opsize,opsize,href,location.register);
 
 
-                  cg.ungetregister(exprasmlist,pleftreg);
                   hr := cg.getintregister(exprasmlist,opsize);
                   hr := cg.getintregister(exprasmlist,opsize);
                   cg.a_op_const_reg_reg(exprasmlist,OP_AND,opsize,31,pleftreg,hr);
                   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.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);
                   cg.a_op_const_reg(exprasmlist,OP_AND,opsize,1,location.register);
                 end;
                 end;
              end;
              end;
@@ -591,7 +566,6 @@ implementation
               first:=true;
               first:=true;
               scratch_reg:=cg.getintregister(exprasmlist,opsize);
               scratch_reg:=cg.getintregister(exprasmlist,opsize);
               genitem(hp);
               genitem(hp);
-              cg.ungetregister(exprasmlist,scratch_reg);
               cg.a_jmp_always(exprasmlist,elselabel);
               cg.a_jmp_always(exprasmlist,elselabel);
            end;
            end;
       end;
       end;
@@ -921,8 +895,6 @@ implementation
                 genlinearlist(nodes);
                 genlinearlist(nodes);
            end;
            end;
 
 
-         cg.ungetregister(exprasmlist,hregister);
-
          { now generate the instructions }
          { now generate the instructions }
          hp:=tstatementnode(right);
          hp:=tstatementnode(right);
          while assigned(hp) do
          while assigned(hp) do
@@ -972,7 +944,13 @@ begin
 end.
 end.
 {
 {
   $Log$
   $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)
     * fixed rare case bug (see tests/test/tb0478.pp)
 
 
   Revision 1.66  2004/08/16 21:00:15  peter
   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
                          if (p.location.loc = LOC_CREGISTER) then
                            load_regvar_reg(list,p.location.register);
                            load_regvar_reg(list,p.location.register);
 {$endif OLDREGVARS}
 {$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);
                          cg.a_jmp_always(list,falselabel);
                        end;
                        end;
                      LOC_JUMP:
                      LOC_JUMP:
@@ -225,8 +222,7 @@ implementation
 {$ifdef cpuflags}
 {$ifdef cpuflags}
                      LOC_FLAGS :
                      LOC_FLAGS :
                        begin
                        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);
                          cg.a_jmp_always(list,falselabel);
                        end;
                        end;
 {$endif cpuflags}
 {$endif cpuflags}
@@ -312,17 +308,17 @@ implementation
         paramanager.freeparaloc(list,paraloc3);
         paramanager.freeparaloc(list,paraloc3);
         paramanager.freeparaloc(list,paraloc2);
         paramanager.freeparaloc(list,paraloc2);
         paramanager.freeparaloc(list,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_PUSHEXCEPTADDR');
         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.getintparaloc(pocall_default,1,paraloc1);
         paramanager.allocparaloc(list,paraloc1);
         paramanager.allocparaloc(list,paraloc1);
         cg.a_param_reg(list,OS_ADDR,NR_FUNCTION_RESULT_REG,paraloc1);
         cg.a_param_reg(list,OS_ADDR,NR_FUNCTION_RESULT_REG,paraloc1);
         paramanager.freeparaloc(list,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.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.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);
         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);
     procedure free_exception(list:TAAsmoutput;const t:texceptiontemps;a:aint;endexceptlabel:tasmlabel;onlyfree:boolean);
      begin
      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.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
          if not onlyfree then
           begin
           begin
@@ -376,10 +372,7 @@ implementation
                  cg.a_load_reg_reg(list,l.size,OS_32,l.registerlow,hregister);
                  cg.a_load_reg_reg(list,l.size,OS_32,l.registerlow,hregister);
                end
                end
               else
               else
-               begin
-                 location_release(list,l);
-                 hregister:=cg.getintregister(list,OS_INT);
-               end;
+               hregister:=cg.getintregister(list,OS_INT);
               { load value in low register }
               { load value in low register }
               case l.loc of
               case l.loc of
                 LOC_FLAGS :
                 LOC_FLAGS :
@@ -433,7 +426,6 @@ implementation
                begin
                begin
                  hregister:=cg.getintregister(list,OS_INT);
                  hregister:=cg.getintregister(list,OS_INT);
                  hregisterhi:=cg.getintregister(list,OS_INT);
                  hregisterhi:=cg.getintregister(list,OS_INT);
-                 location_release(list,l);
                end;
                end;
               hreg64.reglo:=hregister;
               hreg64.reglo:=hregister;
               hreg64.reghi:=hregisterhi;
               hreg64.reghi:=hregisterhi;
@@ -460,10 +452,7 @@ implementation
               ((l.size = dst_size) or
               ((l.size = dst_size) or
                (TCGSize2Size[l.size] = TCGSize2Size[OS_INT]));
                (TCGSize2Size[l.size] = TCGSize2Size[OS_INT]));
            if not const_location then
            if not const_location then
-             begin
-               location_release(list,l);
-               hregister:=cg.getintregister(list,dst_size)
-             end
+             hregister:=cg.getintregister(list,dst_size)
            else
            else
              hregister := l.register;
              hregister := l.register;
            { load value in new register }
            { load value in new register }
@@ -528,11 +517,6 @@ implementation
         oldloc : tlocation;
         oldloc : tlocation;
       begin
       begin
         oldloc:=l;
         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);
         hregister:=cg.getintregister(list,dst_size);
         { load value in new register }
         { load value in new register }
         case l.loc of
         case l.loc of
@@ -601,14 +585,12 @@ implementation
               begin
               begin
                 tg.GetTemp(list,tcgsize2size[l.size],tt_normal,href);
                 tg.GetTemp(list,tcgsize2size[l.size],tt_normal,href);
                 cg.a_loadmm_reg_ref(list,l.size,l.size,l.register,href,mms_movescalar);
                 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);
                 location_reset(l,LOC_REFERENCE,l.size);
                 l.reference:=href;
                 l.reference:=href;
               end;
               end;
             reg:=cg.getfpuregister(list,l.size);
             reg:=cg.getfpuregister(list,l.size);
             cg.a_loadfpu_loc_reg(list,l,reg);
             cg.a_loadfpu_loc_reg(list,l,reg);
             location_freetemp(list,l);
             location_freetemp(list,l);
-            location_release(list,l);
             location_reset(l,LOC_FPUREGISTER,l.size);
             location_reset(l,LOC_FPUREGISTER,l.size);
             l.register:=reg;
             l.register:=reg;
           end;
           end;
@@ -628,14 +610,12 @@ implementation
               begin
               begin
                 tg.GetTemp(list,tcgsize2size[l.size],tt_normal,href);
                 tg.GetTemp(list,tcgsize2size[l.size],tt_normal,href);
                 cg.a_loadfpu_reg_ref(list,l.size,l.register,href);
                 cg.a_loadfpu_reg_ref(list,l.size,l.register,href);
-                location_release(list,l);
                 location_reset(l,LOC_REFERENCE,l.size);
                 location_reset(l,LOC_REFERENCE,l.size);
                 l.reference:=href;
                 l.reference:=href;
               end;
               end;
             reg:=cg.getmmregister(list,l.size);
             reg:=cg.getmmregister(list,l.size);
             cg.a_loadmm_loc_reg(list,l.size,l,reg,mms_movescalar);
             cg.a_loadmm_loc_reg(list,l.size,l,reg,mms_movescalar);
             location_freetemp(list,l);
             location_freetemp(list,l);
-            location_release(list,l);
             location_reset(l,LOC_MMREGISTER,l.size);
             location_reset(l,LOC_MMREGISTER,l.size);
             l.register:=reg;
             l.register:=reg;
           end;
           end;
@@ -652,7 +632,6 @@ implementation
             begin
             begin
               tg.GetTemp(list,TCGSize2Size[l.size],tt_normal,r);
               tg.GetTemp(list,TCGSize2Size[l.size],tt_normal,r);
               cg.a_loadfpu_reg_ref(list,l.size,l.register,r);
               cg.a_loadfpu_reg_ref(list,l.size,l.register,r);
-              location_release(list,l);
               location_reset(l,LOC_REFERENCE,l.size);
               location_reset(l,LOC_REFERENCE,l.size);
               l.reference:=r;
               l.reference:=r;
             end;
             end;
@@ -661,7 +640,6 @@ implementation
             begin
             begin
               tg.GetTemp(list,TCGSize2Size[l.size],tt_normal,r);
               tg.GetTemp(list,TCGSize2Size[l.size],tt_normal,r);
               cg.a_loadmm_reg_ref(list,l.size,l.size,l.register,r,mms_movescalar);
               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);
               location_reset(l,LOC_REFERENCE,l.size);
               l.reference:=r;
               l.reference:=r;
             end;
             end;
@@ -672,16 +650,10 @@ implementation
               tg.GetTemp(list,TCGSize2Size[l.size],tt_normal,r);
               tg.GetTemp(list,TCGSize2Size[l.size],tt_normal,r);
 {$ifndef cpu64bit}
 {$ifndef cpu64bit}
               if l.size in [OS_64,OS_S64] then
               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
               else
 {$endif cpu64bit}
 {$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);
               location_reset(l,LOC_REFERENCE,l.size);
               l.reference:=r;
               l.reference:=r;
             end;
             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
                     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);
                   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
                 end
               else
               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 }
               { update localloc of varsym }
               tg.Ungetlocal(list,tvarsym(p).localloc.reference);
               tg.Ungetlocal(list,tvarsym(p).localloc.reference);
               tvarsym(p).localloc:=localcopyloc;
               tvarsym(p).localloc:=localcopyloc;
@@ -947,7 +919,6 @@ implementation
                  cg.a_load_ref_reg(list,OS_ADDR,OS_ADDR,href,tmpreg);
                  cg.a_load_ref_reg(list,OS_ADDR,OS_ADDR,href,tmpreg);
                  reference_reset_base(href,tmpreg,0);
                  reference_reset_base(href,tmpreg,0);
                  cg.g_initialize(list,tvarsym(p).vartype.def,href,false);
                  cg.g_initialize(list,tvarsym(p).vartype.def,href,false);
-                 cg.ungetregister(list,tmpreg);
                end;
                end;
            end;
            end;
          end;
          end;
@@ -1100,8 +1071,8 @@ implementation
                         allocation info }
                         allocation info }
                       if getsupreg(resloc.registerlow)<first_int_imreg then
                       if getsupreg(resloc.registerlow)<first_int_imreg then
                         begin
                         begin
-                          cg.getexplicitregister(list,resloc.registerlow);
-                          cg.ungetregister(list,resloc.registerlow);
+                          cg.getcpuregister(list,resloc.registerlow);
+                          cg.ungetcpuregister(list,resloc.registerlow);
                           // for the optimizer
                           // for the optimizer
                           cg.a_reg_alloc(list,resloc.registerlow);
                           cg.a_reg_alloc(list,resloc.registerlow);
                         end;
                         end;
@@ -1120,8 +1091,8 @@ implementation
                       end;
                       end;
                       if getsupreg(resloc.registerhigh)<first_int_imreg then
                       if getsupreg(resloc.registerhigh)<first_int_imreg then
                         begin
                         begin
-                          cg.getexplicitregister(list,resloc.registerhigh);
-                          cg.ungetregister(list,resloc.registerhigh);
+                          cg.getcpuregister(list,resloc.registerhigh);
+                          cg.ungetcpuregister(list,resloc.registerhigh);
                           // for the optimizer
                           // for the optimizer
                           cg.a_reg_alloc(list,resloc.registerhigh);
                           cg.a_reg_alloc(list,resloc.registerhigh);
                         end;
                         end;
@@ -1145,8 +1116,8 @@ implementation
                       hreg:=cg.makeregsize(list,funcretloc^.register,restmploc.size);
                       hreg:=cg.makeregsize(list,funcretloc^.register,restmploc.size);
                       if getsupreg(funcretloc^.register)<first_int_imreg then
                       if getsupreg(funcretloc^.register)<first_int_imreg then
                         begin
                         begin
-                          cg.getexplicitregister(list,funcretloc^.register);
-                          cg.ungetregister(list,hreg);
+                          cg.getcpuregister(list,funcretloc^.register);
+                          cg.ungetcpuregister(list,hreg);
                           // for the optimizer
                           // for the optimizer
                           cg.a_reg_alloc(list,funcretloc^.register);
                           cg.a_reg_alloc(list,funcretloc^.register);
                         end;
                         end;
@@ -1157,8 +1128,8 @@ implementation
                 begin
                 begin
                   if getsupreg(funcretloc^.register)<first_fpu_imreg then
                   if getsupreg(funcretloc^.register)<first_fpu_imreg then
                     begin
                     begin
-                      cg.getexplicitregister(list,funcretloc^.register);
-                      cg.ungetregister(list,funcretloc^.register);
+                      cg.getcpuregister(list,funcretloc^.register);
+                      cg.ungetcpuregister(list,funcretloc^.register);
                     end;
                     end;
                   cg.a_loadfpu_loc_reg(list,restmploc,funcretloc^.register);
                   cg.a_loadfpu_loc_reg(list,restmploc,funcretloc^.register);
                 end;
                 end;
@@ -1166,8 +1137,8 @@ implementation
                 begin
                 begin
                   if getsupreg(funcretloc^.register)<first_mm_imreg then
                   if getsupreg(funcretloc^.register)<first_mm_imreg then
                     begin
                     begin
-                      cg.getexplicitregister(list,funcretloc^.register);
-                      cg.ungetregister(list,funcretloc^.register);
+                      cg.getcpuregister(list,funcretloc^.register);
+                      cg.ungetcpuregister(list,funcretloc^.register);
                     end;
                     end;
                   cg.a_loadmm_loc_reg(list,restmploc.size,restmploc,funcretloc^.register,mms_movescalar);
                   cg.a_loadmm_loc_reg(list,restmploc.size,restmploc,funcretloc^.register,mms_movescalar);
                 end;
                 end;
@@ -1220,20 +1191,19 @@ implementation
                         begin
                         begin
                           if getregtype(paraloc^.register)=R_INTREGISTER then
                           if getregtype(paraloc^.register)=R_INTREGISTER then
                             begin
                             begin
+                              { Release parameter register }
                               if getsupreg(paraloc^.register)<first_int_imreg then
                               if getsupreg(paraloc^.register)<first_int_imreg then
                                 begin
                                 begin
 {$ifndef cpu64bit}
 {$ifndef cpu64bit}
                                   if assigned(hiparaloc) then
                                   if assigned(hiparaloc) then
-                                    cg.getexplicitregister(list,hiparaloc^.register);
+                                    begin
+                                      cg.getcpuregister(list,hiparaloc^.register);
+                                      cg.ungetcpuregister(list,hiparaloc^.register);
+                                    end;
 {$endif cpu64bit}
 {$endif cpu64bit}
-                                  cg.getexplicitregister(list,paraloc^.register);
+                                  cg.getcpuregister(list,paraloc^.register);
+                                  cg.ungetcpuregister(list,paraloc^.register);
                                 end;
                                 end;
-                              { Release parameter register }
-{$ifndef cpu64bit}
-                              if assigned(hiparaloc) then
-                                cg.ungetregister(list,hiparaloc^.register);
-{$endif cpu64bit}
-                              cg.ungetregister(list,paraloc^.register);
                             end;
                             end;
                           cg.a_loadany_param_ref(list,hp.paraloc[calleeside],tvarsym(hp.parasym).localloc.reference,mms_movescalar);
                           cg.a_loadany_param_ref(list,hp.paraloc[calleeside],tvarsym(hp.parasym).localloc.reference,mms_movescalar);
                         end;
                         end;
@@ -1243,17 +1213,6 @@ implementation
                 end;
                 end;
                 hp:=tparaitem(hp.next);
                 hp:=tparaitem(hp.next);
               end;
               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;
           end;
 
 
         { generate copies of call by value parameters, must be done before
         { 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
             if not (target_info.system in [system_i386_win32,system_i386_wdosx]) or
                not (current_procinfo.procdef.proctypeoption=potype_proginit) then
                not (current_procinfo.procdef.proctypeoption=potype_proginit) then
               begin
               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.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;
           end;
           end;
 
 
@@ -1373,15 +1332,15 @@ implementation
               cg.a_paramaddr_ref(list,href,paraloc1);
               cg.a_paramaddr_ref(list,href,paraloc1);
               paramanager.freeparaloc(list,paraloc2);
               paramanager.freeparaloc(list,paraloc2);
               paramanager.freeparaloc(list,paraloc1);
               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.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;
             end;
 
 
            { initialize units }
            { 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.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}
 {$ifdef GDB}
            if (cs_debuginfo in aktmoduleswitches) then
            if (cs_debuginfo in aktmoduleswitches) then
@@ -1608,9 +1567,9 @@ implementation
              paramanager.allocparaloc(list,paraloc1);
              paramanager.allocparaloc(list,paraloc1);
              cg.a_param_const(list,OS_INT,stackframe,paraloc1);
              cg.a_param_const(list,OS_INT,stackframe,paraloc1);
              paramanager.freeparaloc(list,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.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
              if paraloc1.location^.loc=LOC_REGISTER then
                begin
                begin
                  cg.a_load_ref_reg(list,OS_INT,OS_INT,href,paraloc1.location^.register);
                  cg.a_load_ref_reg(list,OS_INT,OS_INT,href,paraloc1.location^.register);
@@ -1787,18 +1746,6 @@ implementation
                     case localloc.loc of
                     case localloc.loc of
                       LOC_REFERENCE :
                       LOC_REFERENCE :
                         tg.Ungetlocal(list,localloc.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;
                   end;
               end;
               end;
@@ -2036,21 +1983,6 @@ implementation
                     case localloc.loc of
                     case localloc.loc of
                       LOC_REFERENCE :
                       LOC_REFERENCE :
                         tg.UngetLocal(list,localloc.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;
                   end;
               end;
               end;
@@ -2133,7 +2065,13 @@ implementation
 end.
 end.
 {
 {
   $Log$
   $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
     * paraloc branch merged
 
 
   Revision 1.215  2004/09/14 16:33:46  peter
   Revision 1.215  2004/09/14 16:33:46  peter

+ 24 - 7
compiler/paramgr.pas

@@ -300,19 +300,19 @@ implementation
               LOC_CREGISTER:
               LOC_CREGISTER:
                 begin
                 begin
                   if getsupreg(paraloc^.register)<first_int_imreg then
                   if getsupreg(paraloc^.register)<first_int_imreg then
-                    cg.getexplicitregister(list,paraloc^.register);
+                    cg.getcpuregister(list,paraloc^.register);
                 end;
                 end;
               LOC_FPUREGISTER,
               LOC_FPUREGISTER,
               LOC_CFPUREGISTER:
               LOC_CFPUREGISTER:
                 begin
                 begin
                   if getsupreg(paraloc^.register)<first_fpu_imreg then
                   if getsupreg(paraloc^.register)<first_fpu_imreg then
-                    cg.getexplicitregister(list,paraloc^.register);
+                    cg.getcpuregister(list,paraloc^.register);
                 end;
                 end;
               LOC_MMREGISTER,
               LOC_MMREGISTER,
               LOC_CMMREGISTER :
               LOC_CMMREGISTER :
                 begin
                 begin
                   if getsupreg(paraloc^.register)<first_mm_imreg then
                   if getsupreg(paraloc^.register)<first_mm_imreg then
-                    cg.getexplicitregister(list,paraloc^.register);
+                    cg.getcpuregister(list,paraloc^.register);
                 end;
                 end;
             end;
             end;
             paraloc:=paraloc^.next;
             paraloc:=paraloc^.next;
@@ -332,12 +332,23 @@ implementation
           begin
           begin
             case paraloc^.loc of
             case paraloc^.loc of
               LOC_REGISTER,
               LOC_REGISTER,
-              LOC_CREGISTER,
+              LOC_CREGISTER:
+                begin
+                  if getsupreg(paraloc^.register)<first_int_imreg then
+                    cg.ungetcpuregister(list,paraloc^.register);
+                end;
               LOC_FPUREGISTER,
               LOC_FPUREGISTER,
-              LOC_CFPUREGISTER,
+              LOC_CFPUREGISTER:
+                begin
+                  if getsupreg(paraloc^.register)<first_fpu_imreg then
+                    cg.ungetcpuregister(list,paraloc^.register);
+                end;
               LOC_MMREGISTER,
               LOC_MMREGISTER,
               LOC_CMMREGISTER :
               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_REFERENCE,
               LOC_CREFERENCE :
               LOC_CREFERENCE :
                 begin
                 begin
@@ -436,7 +447,13 @@ end.
 
 
 {
 {
    $Log$
    $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
      * paraloc branch merged
 
 
    Revision 1.77.4.1  2004/08/31 20:43:06  peter
    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 init_register_allocators;override;
         procedure done_register_allocators;override;
         procedure done_register_allocators;override;
 
 
-        procedure ungetreference(list:Taasmoutput;const r:Treference);override;
-
         { passing parameters, per default the parameter is pushed }
         { passing parameters, per default the parameter is pushed }
         { nr gives the number of the parameter (enumerated from   }
         { nr gives the number of the parameter (enumerated from   }
         { left to right), this allows to move the parameter to    }
         { 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 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;
         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 }
         { find out whether a is of the form 11..00..11b or 00..11...00. If }
@@ -226,15 +224,6 @@ const
       end;
       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);
     procedure tcgppc.a_param_const(list : taasmoutput;size : tcgsize;a : aint;const paraloc : tcgpara);
       var
       var
         ref: treference;
         ref: treference;
@@ -269,13 +258,10 @@ const
             a_load_ref_reg(list,size,size,r,paraloc.location^.register);
             a_load_ref_reg(list,size,size,r,paraloc.location^.register);
           LOC_REFERENCE:
           LOC_REFERENCE:
             begin
             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);
                tmpreg := rg[R_INTREGISTER].getregister(list,R_SUBWHOLE);
                a_load_ref_reg(list,size,size,r,tmpreg);
                a_load_ref_reg(list,size,size,r,tmpreg);
                a_load_reg_ref(list,size,size,tmpreg,ref);
                a_load_reg_ref(list,size,size,tmpreg,ref);
-               rg[R_INTREGISTER].ungetregister(list,tmpreg);
             end;
             end;
           LOC_FPUREGISTER,LOC_CFPUREGISTER:
           LOC_FPUREGISTER,LOC_CFPUREGISTER:
             case size of
             case size of
@@ -308,7 +294,6 @@ const
                tmpreg := rg[R_INTREGISTER].getregister(list,R_SUBWHOLE);
                tmpreg := rg[R_INTREGISTER].getregister(list,R_SUBWHOLE);
                a_loadaddr_ref_reg(list,r,tmpreg);
                a_loadaddr_ref_reg(list,r,tmpreg);
                a_load_reg_ref(list,OS_ADDR,OS_ADDR,tmpreg,ref);
                a_load_reg_ref(list,OS_ADDR,OS_ADDR,tmpreg,ref);
-               rg[R_INTREGISTER].ungetregister(list,tmpreg);
              end;
              end;
            else
            else
              internalerror(2002080701);
              internalerror(2002080701);
@@ -404,7 +389,6 @@ const
             tmpref.base:= reg;
             tmpref.base:= reg;
             list.concat(taicpu.op_reg_ref(A_LWZ,tmpreg,tmpref));
             list.concat(taicpu.op_reg_ref(A_LWZ,tmpreg,tmpref));
             list.concat(taicpu.op_reg(A_MTCTR,tmpreg));
             list.concat(taicpu.op_reg(A_MTCTR,tmpreg));
-            rg[R_INTREGISTER].ungetregister(list,tmpreg);
           end
           end
         else
         else
           list.concat(taicpu.op_reg(A_MTCTR,reg));
           list.concat(taicpu.op_reg(A_MTCTR,reg));
@@ -452,10 +436,9 @@ const
        var
        var
          op: TAsmOp;
          op: TAsmOp;
          ref2: TReference;
          ref2: TReference;
-         freereg: boolean;
        begin
        begin
          ref2 := ref;
          ref2 := ref;
-         freereg := fixref(list,ref2);
+         fixref(list,ref2);
          if tosize in [OS_S8..OS_S16] then
          if tosize in [OS_S8..OS_S16] then
            { storing is the same for signed and unsigned values }
            { storing is the same for signed and unsigned values }
            tosize := tcgsize(ord(tosize)-(ord(OS_S8)-ord(OS_8)));
            tosize := tcgsize(ord(tosize)-(ord(OS_S8)-ord(OS_8)));
@@ -464,8 +447,6 @@ const
            internalerror(200109236);
            internalerror(200109236);
          op := storeinstr[tcgsize2unsigned[tosize],ref2.index<>NR_NO,false];
          op := storeinstr[tcgsize2unsigned[tosize],ref2.index<>NR_NO,false];
          a_load_store(list,op,reg,ref2);
          a_load_store(list,op,reg,ref2);
-         if freereg then
-           rg[R_INTREGISTER].ungetregister(list,ref2.base);
        End;
        End;
 
 
 
 
@@ -489,7 +470,6 @@ const
          op: tasmop;
          op: tasmop;
          tmpreg: tregister;
          tmpreg: tregister;
          ref2, tmpref: treference;
          ref2, tmpref: treference;
-         freereg: boolean;
 
 
        begin
        begin
           { TODO: optimize/take into consideration fromsize/tosize. Will }
           { 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
           if not(fromsize in [OS_8,OS_S8,OS_16,OS_S16,OS_32,OS_S32]) then
             internalerror(2002090902);
             internalerror(2002090902);
           ref2 := ref;
           ref2 := ref;
-          freereg := fixref(list,ref2);
+          fixref(list,ref2);
           { the caller is expected to have adjusted the reference already }
           { the caller is expected to have adjusted the reference already }
           { in this case                                                  }
           { in this case                                                  }
           if (TCGSize2Size[fromsize] >= TCGSize2Size[tosize]) then
           if (TCGSize2Size[fromsize] >= TCGSize2Size[tosize]) then
             fromsize := tosize;
             fromsize := tosize;
           op := loadinstr[fromsize,ref2.index<>NR_NO,false];
           op := loadinstr[fromsize,ref2.index<>NR_NO,false];
           a_load_store(list,op,reg,ref2);
           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 }
           { sign extend shortint if necessary, since there is no }
           { load instruction that does that automatically (JM)   }
           { load instruction that does that automatically (JM)   }
           if fromsize = OS_S8 then
           if fromsize = OS_S8 then
@@ -559,7 +537,6 @@ const
        var
        var
          op: tasmop;
          op: tasmop;
          ref2: treference;
          ref2: treference;
-         freereg: boolean;
 
 
        begin
        begin
           { several functions call this procedure with OS_32 or OS_64 }
           { several functions call this procedure with OS_32 or OS_64 }
@@ -573,11 +550,9 @@ const
                internalerror(200201121);
                internalerror(200201121);
           end;
           end;
          ref2 := ref;
          ref2 := ref;
-         freereg := fixref(list,ref2);
+         fixref(list,ref2);
          op := fpuloadinstr[size,ref2.index <> NR_NO,false];
          op := fpuloadinstr[size,ref2.index <> NR_NO,false];
          a_load_store(list,op,reg,ref2);
          a_load_store(list,op,reg,ref2);
-         if freereg then
-           rg[R_INTREGISTER].ungetregister(list,ref2.base);
        end;
        end;
 
 
 
 
@@ -591,17 +566,14 @@ const
        var
        var
          op: tasmop;
          op: tasmop;
          ref2: treference;
          ref2: treference;
-         freereg: boolean;
 
 
        begin
        begin
          if not(size in [OS_F32,OS_F64]) then
          if not(size in [OS_F32,OS_F64]) then
            internalerror(200201122);
            internalerror(200201122);
          ref2 := ref;
          ref2 := ref;
-         freereg := fixref(list,ref2);
+         fixref(list,ref2);
          op := fpustoreinstr[size,ref2.index <> NR_NO,false];
          op := fpustoreinstr[size,ref2.index <> NR_NO,false];
          a_load_store(list,op,reg,ref2);
          a_load_store(list,op,reg,ref2);
-         if freereg then
-           rg[R_INTREGISTER].ungetregister(list,ref2.base);
        end;
        end;
 
 
 
 
@@ -756,7 +728,6 @@ const
                 list.concat(taicpu.op_reg_const(A_LI,scratchreg,-1));
                 list.concat(taicpu.op_reg_const(A_LI,scratchreg,-1));
                 list.concat(taicpu.op_reg_reg_const_const_const(A_RLWIMI,dst,
                 list.concat(taicpu.op_reg_reg_const_const_const(A_RLWIMI,dst,
                   scratchreg,0,l1,l2));
                   scratchreg,0,l1,l2));
-                rg[R_INTREGISTER].ungetregister(list,scratchreg);
               end
               end
             else
             else
               do_lo_hi;
               do_lo_hi;
@@ -789,7 +760,6 @@ const
             scratchreg := rg[R_INTREGISTER].getregister(list,R_SUBWHOLE);
             scratchreg := rg[R_INTREGISTER].getregister(list,R_SUBWHOLE);
             a_load_const_reg(list,OS_32,a,scratchreg);
             a_load_const_reg(list,OS_32,a,scratchreg);
             a_op_reg_reg_reg(list,op,OS_32,scratchreg,src,dst);
             a_op_reg_reg_reg(list,op,OS_32,scratchreg,src,dst);
-            rg[R_INTREGISTER].ungetregister(list,scratchreg);
           end;
           end;
       end;
       end;
 
 
@@ -843,7 +813,6 @@ const
                 scratch_register := rg[R_INTREGISTER].getregister(list,R_SUBWHOLE);
                 scratch_register := rg[R_INTREGISTER].getregister(list,R_SUBWHOLE);
                 a_load_const_reg(list,OS_32,a,scratch_register);
                 a_load_const_reg(list,OS_32,a,scratch_register);
                 list.concat(taicpu.op_reg_reg_reg(A_CMPW,NR_CR0,reg,scratch_register));
                 list.concat(taicpu.op_reg_reg_reg(A_CMPW,NR_CR0,reg,scratch_register));
-                rg[R_INTREGISTER].ungetregister(list,scratch_register);
               end
               end
           else
           else
             if (aword(a) <= $ffff) then
             if (aword(a) <= $ffff) then
@@ -853,7 +822,6 @@ const
                 scratch_register := rg[R_INTREGISTER].getregister(list,R_SUBWHOLE);
                 scratch_register := rg[R_INTREGISTER].getregister(list,R_SUBWHOLE);
                 a_load_const_reg(list,OS_32,a,scratch_register);
                 a_load_const_reg(list,OS_32,a,scratch_register);
                 list.concat(taicpu.op_reg_reg_reg(A_CMPLW,NR_CR0,reg,scratch_register));
                 list.concat(taicpu.op_reg_reg_reg(A_CMPLW,NR_CR0,reg,scratch_register));
-                rg[R_INTREGISTER].ungetregister(list,scratch_register);
               end;
               end;
           a_jmp(list,A_BC,TOpCmp2AsmCond[cmp_op],0,l);
           a_jmp(list,A_BC,TOpCmp2AsmCond[cmp_op],0,l);
         end;
         end;
@@ -1758,12 +1726,11 @@ const
 
 
        var
        var
          ref2, tmpref: treference;
          ref2, tmpref: treference;
-         freereg: boolean;
          tmpreg:Tregister;
          tmpreg:Tregister;
 
 
        begin
        begin
          ref2 := ref;
          ref2 := ref;
-         freereg := fixref(list,ref2);
+         fixref(list,ref2);
          if assigned(ref2.symbol) then
          if assigned(ref2.symbol) then
            begin
            begin
              if target_info.system = system_powerpc_macos then
              if target_info.system = system_powerpc_macos then
@@ -1812,11 +1779,6 @@ const
                    begin
                    begin
                      list.concat(taicpu.op_reg_reg_ref(A_ADDIS,r,
                      list.concat(taicpu.op_reg_reg_ref(A_ADDIS,r,
                        ref2.base,tmpref));
                        ref2.base,tmpref));
-                     if freereg then
-                       begin
-                         rg[R_INTREGISTER].ungetregister(list,ref2.base);
-                         freereg := false;
-                       end;
                    end
                    end
                  else
                  else
                    list.concat(taicpu.op_reg_ref(A_LIS,r,tmpref));
                    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)
            a_load_reg_reg(list,OS_ADDR,OS_ADDR,ref2.base,r)
          else
          else
            list.concat(taicpu.op_reg_const(A_LI,r,0));
            list.concat(taicpu.op_reg_const(A_LI,r,0));
-         if freereg then
-           rg[R_INTREGISTER].ungetregister(list,ref2.base);
        end;
        end;
 
 
 { ************* concatcopy ************ }
 { ************* concatcopy ************ }
@@ -1855,7 +1815,7 @@ const
     maxmoveunit = 4;
     maxmoveunit = 4;
 {$endif ppc603}
 {$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
       var
         countreg: TRegister;
         countreg: TRegister;
@@ -1880,21 +1840,11 @@ const
                 begin
                 begin
                   size := int_cgsize(len);
                   size := int_cgsize(len);
                   a_load_ref_ref(list,size,size,source,dest);
                   a_load_ref_ref(list,size,size,source,dest);
-                  if delsource then
-                    begin
-                      reference_release(list,source);
-                      tg.ungetiftemp(list,source);
-                    end;
                 end
                 end
               else
               else
                 begin
                 begin
                   a_reg_alloc(list,NR_F0);
                   a_reg_alloc(list,NR_F0);
                   a_loadfpu_ref_reg(list,OS_F64,source,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_loadfpu_reg_ref(list,OS_F64,NR_F0,dest);
                   a_reg_dealloc(list,NR_F0);
                   a_reg_dealloc(list,NR_F0);
                 end;
                 end;
@@ -1926,8 +1876,6 @@ const
             src := source;
             src := source;
             orgsrc := true;
             orgsrc := true;
           end;
           end;
-        if not orgsrc and delsource then
-          reference_release(list,source);
         { load the address of dest into dst.base }
         { load the address of dest into dst.base }
         if (count > 4) or
         if (count > 4) or
            not issimpleref(dest) 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_LFDU,NR_F0,src));
             list.concat(taicpu.op_reg_ref(A_STFDU,NR_F0,dst));
             list.concat(taicpu.op_reg_ref(A_STFDU,NR_F0,dst));
             a_jmp(list,A_BC,C_NE,0,lab);
             a_jmp(list,A_BC,C_NE,0,lab);
-            rg[R_INTREGISTER].ungetregister(list,countreg);
             a_reg_dealloc(list,NR_F0);
             a_reg_dealloc(list,NR_F0);
             len := len mod 8;
             len := len mod 8;
           end;
           end;
@@ -2020,7 +1967,6 @@ const
             list.concat(taicpu.op_reg_ref(A_LWZU,NR_R0,src));
             list.concat(taicpu.op_reg_ref(A_LWZU,NR_R0,src));
             list.concat(taicpu.op_reg_ref(A_STWU,NR_R0,dst));
             list.concat(taicpu.op_reg_ref(A_STWU,NR_R0,dst));
             a_jmp(list,A_BC,C_NE,0,lab);
             a_jmp(list,A_BC,C_NE,0,lab);
-            rg[R_INTREGISTER].ungetregister(list,countreg);
             a_reg_dealloc(list,NR_R0);
             a_reg_dealloc(list,NR_R0);
             len := len mod 4;
             len := len mod 4;
           end;
           end;
@@ -2058,17 +2004,6 @@ const
            a_load_reg_ref(list,OS_8,OS_8,NR_R0,dst);
            a_load_reg_ref(list,OS_8,OS_8,NR_R0,dst);
            a_reg_dealloc(list,NR_R0);
            a_reg_dealloc(list,NR_R0);
          end;
          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;
       end;
 
 
 
 
@@ -2302,9 +2237,6 @@ const
             else
             else
               list.concat(taicpu.op_reg_ref(op,reg,ref));
               list.concat(taicpu.op_reg_ref(op,reg,ref));
           end;
           end;
-
-        if (tmpreg <> NR_NO) then
-          rg[R_INTREGISTER].ungetregister(list,tmpreg);
       end;
       end;
 
 
 
 
@@ -2402,7 +2334,6 @@ const
                       cg.a_load_const_reg(list,OS_32,cardinal(value),tmpreg);
                       cg.a_load_const_reg(list,OS_32,cardinal(value),tmpreg);
                       list.concat(taicpu.op_reg_reg_reg(ops[issub,2],
                       list.concat(taicpu.op_reg_reg_reg(ops[issub,2],
                         regdst.reglo,regsrc.reglo,tmpreg));
                         regdst.reglo,regsrc.reglo,tmpreg));
-                      tcgppc(cg).rg[R_INTREGISTER].ungetregister(list,tmpreg);
                       list.concat(taicpu.op_reg_reg(ops[issub,3],
                       list.concat(taicpu.op_reg_reg(ops[issub,3],
                         regdst.reghi,regsrc.reghi));
                         regdst.reghi,regsrc.reghi));
                     end
                     end
@@ -2412,8 +2343,6 @@ const
                       tmpreg64.reghi := tcgppc(cg).rg[R_INTREGISTER].getregister(list,R_SUBWHOLE);
                       tmpreg64.reghi := tcgppc(cg).rg[R_INTREGISTER].getregister(list,R_SUBWHOLE);
                       a_load64_const_reg(list,value,tmpreg64);
                       a_load64_const_reg(list,value,tmpreg64);
                       a_op64_reg_reg_reg(list,op,tmpreg64,regsrc,regdst);
                       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
                 end
                 end
               else
               else
@@ -2435,7 +2364,13 @@ begin
 end.
 end.
 {
 {
   $Log$
   $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
     * paraloc branch merged
 
 
   Revision 1.176.4.2  2004/09/18 20:21:08  jonas
   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;
             op := A_CMPLW;
 
 
         if (right.location.loc = LOC_CONSTANT) then
         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
         else
           exprasmlist.concat(taicpu.op_reg_reg(op,
           exprasmlist.concat(taicpu.op_reg_reg(op,
             left.location.register,right.location.register));
             left.location.register,right.location.register));
@@ -405,8 +402,6 @@ interface
                end;
                end;
            end;
            end;
          end;
          end;
-
-        release_reg_left_right;
       end;
       end;
 
 
 
 
@@ -479,8 +474,6 @@ interface
             exprasmlist.concat(taicpu.op_reg_reg_reg(op,
             exprasmlist.concat(taicpu.op_reg_reg_reg(op,
               newreg(R_SPECIALREGISTER,location.resflags.cr,R_SUBNONE),left.location.register,right.location.register))
               newreg(R_SPECIALREGISTER,location.resflags.cr,R_SUBNONE),left.location.register,right.location.register))
           end;
           end;
-
-        release_reg_left_right;
       end;
       end;
 
 
 {*****************************************************************************
 {*****************************************************************************
@@ -545,7 +538,6 @@ interface
                       else
                       else
                         cg.a_op_const_reg_reg(exprasmlist,OP_OR,OS_INT,
                         cg.a_op_const_reg_reg(exprasmlist,OP_OR,OS_INT,
                           aword(left.location.value),tmpreg,location.register);
                           aword(left.location.value),tmpreg,location.register);
-                      cg.ungetregister(exprasmlist,tmpreg);
                     end;
                     end;
                   opdone := true;
                   opdone := true;
                 end
                 end
@@ -580,7 +572,6 @@ interface
                         aword(left.location.value),tmpreg);
                         aword(left.location.value),tmpreg);
                       exprasmlist.concat(taicpu.op_reg_reg_reg(A_ANDC,
                       exprasmlist.concat(taicpu.op_reg_reg_reg(A_ANDC,
                         location.register,tmpreg,right.location.register));
                         location.register,tmpreg,right.location.register));
-                      cg.ungetregister(exprasmlist,tmpreg);
                     end
                     end
                   else
                   else
                     exprasmlist.concat(taicpu.op_reg_reg_reg(A_ANDC,
                     exprasmlist.concat(taicpu.op_reg_reg_reg(A_ANDC,
@@ -624,7 +615,6 @@ interface
                     exprasmlist.concat(taicpu.op_reg_reg_reg(A_ANDC_,tmpreg,
                     exprasmlist.concat(taicpu.op_reg_reg_reg(A_ANDC_,tmpreg,
                       right.location.register,left.location.register));
                       right.location.register,left.location.register));
                 end;
                 end;
-              cg.ungetregister(exprasmlist,tmpreg);
               location.resflags.cr := RS_CR0;
               location.resflags.cr := RS_CR0;
               location.resflags.flag := F_EQ;
               location.resflags.flag := F_EQ;
               opdone := true;
               opdone := true;
@@ -647,8 +637,6 @@ interface
                 right.location.register,left.location.register,
                 right.location.register,left.location.register,
                 location.register);
                 location.register);
           end;
           end;
-
-        release_reg_left_right;
       end;
       end;
 
 
 {*****************************************************************************
 {*****************************************************************************
@@ -898,10 +886,6 @@ interface
                   exprasmlist.concat(taicpu.op_reg_reg_reg(A_OR_,NR_R0,
                   exprasmlist.concat(taicpu.op_reg_reg_reg(A_OR_,NR_R0,
                     tempreg64.reglo,tempreg64.reghi));
                     tempreg64.reglo,tempreg64.reghi));
                   cg.a_reg_dealloc(exprasmlist,NR_R0);
                   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_reset(location,LOC_FLAGS,OS_NO);
                   location.resflags := getresflags;
                   location.resflags := getresflags;
@@ -1062,9 +1046,6 @@ interface
         if cmpop and
         if cmpop and
            not(nodetype in [equaln,unequaln]) then
            not(nodetype in [equaln,unequaln]) then
           location_reset(location,LOC_JUMP,OS_NO);
           location_reset(location,LOC_JUMP,OS_NO);
-
-        release_reg_left_right;
-
       end;
       end;
 
 
 
 
@@ -1409,7 +1390,6 @@ interface
                            aword(left.location.value),tmpreg);
                            aword(left.location.value),tmpreg);
                          cg.a_op_reg_reg_reg(exprasmlist,OP_SUB,OS_INT,
                          cg.a_op_reg_reg_reg(exprasmlist,OP_SUB,OS_INT,
                            right.location.register,tmpreg,location.register);
                            right.location.register,tmpreg,location.register);
-                         cg.ungetregister(exprasmlist,tmpreg);
                        end;
                        end;
                  end;
                  end;
                ltn,lten,gtn,gten,equaln,unequaln :
                ltn,lten,gtn,gten,equaln,unequaln :
@@ -1471,8 +1451,6 @@ interface
                 end;
                 end;
               end;
               end;
            end;
            end;
-
-         release_reg_left_right;
       end;
       end;
 
 
 begin
 begin
@@ -1480,7 +1458,13 @@ begin
 end.
 end.
 {
 {
   $Log$
   $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
     * only specially handle 64bit operations on ordinals
 
 
   Revision 1.47  2004/07/21 15:09:10  jonas
   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
         case target_info.system of
           system_powerpc_morphos:
           system_powerpc_morphos:
             begin
             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 }
               { store call offset into R3 }
               exprasmlist.concat(taicpu.op_reg_const(A_LI,NR_R3,-tprocdef(procdefinition).extnumber));
               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_reg(A_MTLR,NR_R0));
               exprasmlist.concat(taicpu.op_none(A_BLRL));
               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;
             end;
           else
           else
             internalerror(2004042901);
             internalerror(2004042901);
@@ -100,7 +100,13 @@ begin
 end.
 end.
 {
 {
   $Log$
   $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
     * paraloc branch merged
 
 
   Revision 1.27.4.1  2004/09/18 20:21:08  jonas
   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;
         ref: treference;
         valuereg, tempreg, leftreg, tmpfpureg: tregister;
         valuereg, tempreg, leftreg, tmpfpureg: tregister;
         size: tcgsize;
         size: tcgsize;
-        signed, valuereg_is_scratch: boolean;
+        signed : boolean;
       begin
       begin
 {$ifdef VER1_0}
 {$ifdef VER1_0}
         dummy1 := (int64(1) shl 31) or (int64($43300000) shl 32);
         dummy1 := (int64(1) shl 31) or (int64($43300000) shl 32);
         dummy2 := int64($43300000) shl 32;
         dummy2 := int64($43300000) shl 32;
 {$endif VER1_0}
 {$endif VER1_0}
 
 
-        valuereg_is_scratch := false;
         location_reset(location,LOC_FPUREGISTER,def_cgsize(resulttype.def));
         location_reset(location,LOC_FPUREGISTER,def_cgsize(resulttype.def));
 
 
         { the code here comes from the PowerPC Compiler Writer's Guide }
         { the code here comes from the PowerPC Compiler Writer's Guide }
@@ -190,10 +189,7 @@ implementation
             begin
             begin
               leftreg := left.location.register;
               leftreg := left.location.register;
               if signed then
               if signed then
-                begin
-                  valuereg := cg.getintregister(exprasmlist,OS_INT);
-                  valuereg_is_scratch := true;
-                end
+                valuereg := cg.getintregister(exprasmlist,OS_INT)
               else
               else
                 valuereg := leftreg;
                 valuereg := leftreg;
             end;
             end;
@@ -201,7 +197,6 @@ implementation
             begin
             begin
               leftreg := cg.getintregister(exprasmlist,OS_INT);
               leftreg := cg.getintregister(exprasmlist,OS_INT);
               valuereg := leftreg;
               valuereg := leftreg;
-              valuereg_is_scratch := true;
               if signed then
               if signed then
                 size := OS_S32
                 size := OS_S32
               else
               else
@@ -215,7 +210,6 @@ implementation
          tempreg := cg.getintregister(exprasmlist,OS_INT);
          tempreg := cg.getintregister(exprasmlist,OS_INT);
          exprasmlist.concat(taicpu.op_reg_const(A_LIS,tempreg,$4330));
          exprasmlist.concat(taicpu.op_reg_const(A_LIS,tempreg,$4330));
          cg.a_load_reg_ref(exprasmlist,OS_32,OS_32,tempreg,ref);
          cg.a_load_reg_ref(exprasmlist,OS_32,OS_32,tempreg,ref);
-         cg.ungetregister(exprasmlist,tempreg);
          if signed then
          if signed then
            exprasmlist.concat(taicpu.op_reg_reg_const(A_XORIS,valuereg,
            exprasmlist.concat(taicpu.op_reg_reg_const(A_XORIS,valuereg,
              { xoris expects a unsigned 16 bit int (FK) }
              { xoris expects a unsigned 16 bit int (FK) }
@@ -223,15 +217,6 @@ implementation
          inc(ref.offset,4);
          inc(ref.offset,4);
          cg.a_load_reg_ref(exprasmlist,OS_32,OS_32,valuereg,ref);
          cg.a_load_reg_ref(exprasmlist,OS_32,OS_32,valuereg,ref);
          dec(ref.offset,4);
          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);
          tmpfpureg := cg.getfpuregister(exprasmlist,OS_F64);
          cg.a_loadfpu_ref_reg(exprasmlist,OS_F64,tempconst.location.reference,
          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,
          exprasmlist.concat(taicpu.op_reg_reg_reg(A_FSUB,location.register,
            location.register,tmpfpureg));
            location.register,tmpfpureg));
-         cg.ungetregister(exprasmlist,tmpfpureg);
 
 
          { work around bug in some PowerPC processors }
          { work around bug in some PowerPC processors }
          if (tfloatdef(resulttype.def).typ = s32real) then
          if (tfloatdef(resulttype.def).typ = s32real) then
@@ -303,29 +287,23 @@ implementation
               begin
               begin
                 if left.location.loc in [LOC_CREFERENCE,LOC_REFERENCE] then
                 if left.location.loc in [LOC_CREFERENCE,LOC_REFERENCE] then
                   begin
                   begin
-                    reference_release(exprasmlist,left.location.reference);
                     hreg1:=cg.getintregister(exprasmlist,OS_INT);
                     hreg1:=cg.getintregister(exprasmlist,OS_INT);
                     if left.location.size in [OS_64,OS_S64] then
                     if left.location.size in [OS_64,OS_S64] then
                       begin
                       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);
                         hreg2:=cg.getintregister(exprasmlist,OS_INT);
                         href:=left.location.reference;
                         href:=left.location.reference;
                         inc(href.offset,4);
                         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);
                         cg.a_op_reg_reg_reg(exprasmlist,OP_OR,OS_32,hreg1,hreg2,hreg1);
                       end
                       end
                     else
                     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
                   end
                 else
                 else
                   begin
                   begin
                      if left.location.size in [OS_64,OS_S64] then
                      if left.location.size in [OS_64,OS_S64] then
                        begin
                        begin
-                          location_release(exprasmlist,left.location);
                           hreg1:=cg.getintregister(exprasmlist,OS_32);
                           hreg1:=cg.getintregister(exprasmlist,OS_32);
                           cg.a_op_reg_reg_reg(exprasmlist,OP_OR,OS_32,left.location.registerhigh,left.location.registerlow,hreg1);
                           cg.a_op_reg_reg_reg(exprasmlist,OP_OR,OS_32,left.location.registerhigh,left.location.registerlow,hreg1);
                        end
                        end
@@ -333,11 +311,8 @@ implementation
                        hreg1 := left.location.register;
                        hreg1 := left.location.register;
                   end;
                   end;
                 hreg2 := cg.getintregister(exprasmlist,OS_INT);
                 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;
               end;
             LOC_FLAGS :
             LOC_FLAGS :
               begin
               begin
@@ -370,7 +345,13 @@ begin
 end.
 end.
 {
 {
   $Log$
   $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
     * logs truncated
 
 
   Revision 1.52  2004/05/19 22:26:46  jonas
   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))
                      exprasmlist.concat(taicpu.op_const_reg(A_DCBT,0,left.location.reference.base))
                    else
                    else
                      exprasmlist.concat(taicpu.op_reg_reg(A_DCBT,left.location.reference.base,left.location.reference.index));
                      exprasmlist.concat(taicpu.op_reg_reg(A_DCBT,left.location.reference.base,left.location.reference.index));
-                   location_release(exprasmlist,left.location);
                  end
                  end
                else
                else
                  begin
                  begin
                    cg.a_loadaddr_ref_reg(exprasmlist,left.location.reference,r);
                    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));
                    exprasmlist.concat(taicpu.op_const_reg(A_DCBT,0,r));
-                   cg.ungetregister(exprasmlist,r);
                  end;
                  end;
              end;
              end;
            else
            else
@@ -150,7 +147,13 @@ begin
 end.
 end.
 {
 {
   $Log$
   $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
     * logs truncated
 
 
   Revision 1.14  2004/05/31 11:57:48  jonas
   Revision 1.14  2004/05/31 11:57:48  jonas

+ 10 - 17
compiler/powerpc/nppcmat.pas

@@ -152,18 +152,11 @@ implementation
              begin
              begin
                exprasmlist.concat(taicpu.op_reg_reg_reg(A_MULLW,resultreg,
                exprasmlist.concat(taicpu.op_reg_reg_reg(A_MULLW,resultreg,
                  divider,resultreg));
                  divider,resultreg));
-               cg.ungetregister(exprasmlist,divider);
                exprasmlist.concat(taicpu.op_reg_reg_reg(A_SUB,location.register,
                exprasmlist.concat(taicpu.op_reg_reg_reg(A_SUB,location.register,
                  numerator,resultreg));
                  numerator,resultreg));
-               cg.ungetregister(exprasmlist,resultreg);
                resultreg := location.register;
                resultreg := location.register;
-             end
-           else
-             cg.ungetregister(exprasmlist,divider);
+             end;
            end;
            end;
-       { free used registers }
-        if numerator <> resultreg then
-          cg.ungetregister(exprasmlist,numerator);
         { set result location }
         { set result location }
         location.loc:=LOC_REGISTER;
         location.loc:=LOC_REGISTER;
         location.register:=resultreg;
         location.register:=resultreg;
@@ -287,7 +280,7 @@ implementation
                      location.registerlow := resultreg;
                      location.registerlow := resultreg;
                    end;
                    end;
 
 
-                 cg.getexplicitregister(exprasmlist,NR_R0);
+                 cg.getcpuregister(exprasmlist,NR_R0);
                  exprasmlist.concat(taicpu.op_reg_reg_const(A_SUBFIC,
                  exprasmlist.concat(taicpu.op_reg_reg_const(A_SUBFIC,
                    NR_R0,hregister1,32));
                    NR_R0,hregister1,32));
                  exprasmlist.concat(taicpu.op_reg_reg_reg(asmop1,
                  exprasmlist.concat(taicpu.op_reg_reg_reg(asmop1,
@@ -304,7 +297,7 @@ implementation
                    location.registerhigh,location.registerhigh,NR_R0));
                    location.registerhigh,location.registerhigh,NR_R0));
                  exprasmlist.concat(taicpu.op_reg_reg_reg(asmop1,
                  exprasmlist.concat(taicpu.op_reg_reg_reg(asmop1,
                    location.registerlow,hregisterlow,hregister1));
                    location.registerlow,hregisterlow,hregister1));
-                 cg.ungetregister(exprasmlist,NR_R0);
+                 cg.ungetcpuregister(exprasmlist,NR_R0);
 
 
                  if nodetype = shrn then
                  if nodetype = shrn then
                    begin
                    begin
@@ -312,8 +305,6 @@ implementation
                      location.registerhigh := location.registerlow;
                      location.registerhigh := location.registerlow;
                      location.registerlow := resultreg;
                      location.registerlow := resultreg;
                    end;
                    end;
-
-                   cg.ungetregister(exprasmlist,hregister1);
                end
                end
            end
            end
          else
          else
@@ -348,8 +339,6 @@ implementation
 
 
                   cg.a_op_reg_reg_reg(exprasmlist,op,OS_32,hregister2,
                   cg.a_op_reg_reg_reg(exprasmlist,op,OS_32,hregister2,
                     hregister1,resultreg);
                     hregister1,resultreg);
-
-                  cg.ungetregister(exprasmlist,hregister2);
                 end;
                 end;
            end;
            end;
       end;
       end;
@@ -421,7 +410,6 @@ implementation
                           cg.a_load_ref_reg(exprasmlist,OS_32,OS_32,
                           cg.a_load_ref_reg(exprasmlist,OS_32,OS_32,
                             left.location.reference,src1);
                             left.location.reference,src1);
                        end;
                        end;
-                     reference_release(exprasmlist,left.location.reference);
                   end;
                   end;
               end;
               end;
               { choose appropriate operand }
               { choose appropriate operand }
@@ -492,7 +480,6 @@ implementation
                     begin
                     begin
                       location_force_reg(exprasmlist,left.location,def_cgsize(left.resulttype.def),true);
                       location_force_reg(exprasmlist,left.location,def_cgsize(left.resulttype.def),true);
                       exprasmlist.concat(taicpu.op_reg_const(A_CMPWI,left.location.register,0));
                       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_reset(location,LOC_FLAGS,OS_NO);
                       location.resflags.cr:=RS_CR0;
                       location.resflags.cr:=RS_CR0;
                       location.resflags.flag:=F_EQ;
                       location.resflags.flag:=F_EQ;
@@ -534,7 +521,13 @@ begin
 end.
 end.
 {
 {
   $Log$
   $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
     * logs truncated
 
 
   Revision 1.38  2004/01/01 17:58:16  jonas
   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);
                  cg.a_load_const_reg(exprasmlist,OS_INT,aword(value),tmpreg);
                 exprasmlist.concat(taicpu.op_reg_reg_reg(A_ADD_,hregister,
                 exprasmlist.concat(taicpu.op_reg_reg_reg(A_ADD_,hregister,
                   hregister,tmpreg));
                   hregister,tmpreg));
-                cg.ungetregister(exprasmlist,tmpreg);
-               end;
+              end;
           end;
           end;
 
 
         begin
         begin
@@ -157,7 +156,13 @@ begin
 end.
 end.
 {
 {
   $Log$
   $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
     * logs truncated
 
 
 }
 }

+ 13 - 7
compiler/powerpc/rgcpu.pas

@@ -36,9 +36,9 @@ unit rgcpu;
      type
      type
        trgcpu = class(trgobj)
        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;
          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 ungetregisterfpu(list: taasmoutput; r : tregister; size:TCGsize);override;
          procedure cleartempgen; override;
          procedure cleartempgen; override;
         private
         private
@@ -53,7 +53,7 @@ unit rgcpu;
       cgobj, verbose, cutils;
       cgobj, verbose, cutils;
 
 
 (*
 (*
-    function trgcpu.getexplicitregisterint(list: taasmoutput; reg: Tnewregister): tregister;
+    function trgcpu.getcpuregisterint(list: taasmoutput; reg: Tnewregister): tregister;
 
 
       begin
       begin
         if ((reg shr 8) in [RS_R0]) and
         if ((reg shr 8) in [RS_R0]) and
@@ -67,7 +67,7 @@ unit rgcpu;
             result.number:=reg;
             result.number:=reg;
             cg.a_reg_alloc(list,result);
             cg.a_reg_alloc(list,result);
           end
           end
-        else result := inherited getexplicitregisterint(list,reg);
+        else result := inherited getcpuregisterint(list,reg);
       end;
       end;
 
 
 
 
@@ -88,7 +88,7 @@ unit rgcpu;
       end;
       end;
 
 
 
 
-    function trgcpu.getexplicitregisterfpu(list : taasmoutput; r : Toldregister) : tregister;
+    function trgcpu.getcpuregisterfpu(list : taasmoutput; r : Toldregister) : tregister;
       begin
       begin
         if (r in [R_F1..R_F13]) and
         if (r in [R_F1..R_F13]) and
            not is_reg_var_other[r] then
            not is_reg_var_other[r] then
@@ -100,7 +100,7 @@ unit rgcpu;
             cg.a_reg_alloc(list,result);
             cg.a_reg_alloc(list,result);
           end
           end
         else
         else
-          result := inherited getexplicitregisterfpu(list,r);
+          result := inherited getcpuregisterfpu(list,r);
       end;
       end;
 
 
 
 
@@ -132,7 +132,13 @@ end.
 
 
 {
 {
   $Log$
   $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
     * logs truncated
 
 
 }
 }

+ 7 - 3
compiler/regvars.pas

@@ -650,7 +650,6 @@ implementation
                 begin
                 begin
                   reg:=cg.makeregsize(list,tvarsym(regvars[i]).localloc.register,OS_INT);
                   reg:=cg.makeregsize(list,tvarsym(regvars[i]).localloc.register,OS_INT);
                   cg.a_load_reg_reg(list,OS_INT,OS_INT,reg,reg);
                   cg.a_load_reg_reg(list,OS_INT,OS_INT,reg,reg);
-                  cg.ungetregister(list,tvarsym(regvars[i]).localloc.register);
                 end;
                 end;
             for i := 1 to maxfpuvarregs do
             for i := 1 to maxfpuvarregs do
               if assigned(fpuregvars[i]) then
               if assigned(fpuregvars[i]) then
@@ -658,7 +657,6 @@ implementation
                   reg:=tvarsym(fpuregvars[i]).localloc.register;
                   reg:=tvarsym(fpuregvars[i]).localloc.register;
                   size:=reg_cgsize(reg);
                   size:=reg_cgsize(reg);
                   cg.a_loadfpu_reg_reg(list,size,reg,reg);
                   cg.a_loadfpu_reg_reg(list,size,reg,reg);
-                  cg.ungetregister(list,reg);
                 end;
                 end;
           end;
           end;
       end;
       end;
@@ -671,7 +669,13 @@ end.
 
 
 {
 {
   $Log$
   $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
     * clarified comment
 
 
   Revision 1.77  2004/06/20 08:55:30  florian
   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.}
          no more free registers which can be allocated.}
         function getregister(list:Taasmoutput;subreg:Tsubregister):Tregister;virtual;
         function getregister(list:Taasmoutput;subreg:Tsubregister):Tregister;virtual;
         {# Get the register specified.}
         {# 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.}
         {# Get multiple registers specified.}
-        procedure allocexplicitregisters(list:Taasmoutput;r:Tcpuregisterset);virtual;
+        procedure alloccpuregisters(list:Taasmoutput;r:Tcpuregisterset);virtual;
         {# Free multiple registers specified.}
         {# Free multiple registers specified.}
-        procedure deallocexplicitregisters(list:Taasmoutput;r:Tcpuregisterset);virtual;
+        procedure dealloccpuregisters(list:Taasmoutput;r:Tcpuregisterset);virtual;
         function uses_registers:boolean;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_reg_instruction(instr:Tai;r:tregister);
         procedure add_move_instruction(instr:Taicpu);
         procedure add_move_instruction(instr:Taicpu);
         {# Do the register allocation.}
         {# Do the register allocation.}
@@ -490,19 +489,15 @@ unit rgobj;
       end;
       end;
 
 
 
 
-    procedure trgobj.ungetregister(list:Taasmoutput;r:Tregister);
+    procedure trgobj.ungetcpuregister(list:Taasmoutput;r:Tregister);
       begin
       begin
-{$ifdef EXTDEBUG}
-        if (reginfo=nil) and (getsupreg(r)>=first_imaginary) then
+        if (getsupreg(r)>=first_imaginary) then
           InternalError(2004020901);
           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;
       end;
 
 
 
 
-    procedure trgobj.getexplicitregister(list:Taasmoutput;r:Tregister);
+    procedure trgobj.getcpuregister(list:Taasmoutput;r:Tregister);
       var
       var
         supreg:Tsuperregister;
         supreg:Tsuperregister;
       begin
       begin
@@ -514,25 +509,25 @@ unit rgobj;
       end;
       end;
 
 
 
 
-    procedure trgobj.allocexplicitregisters(list:Taasmoutput;r:Tcpuregisterset);
+    procedure trgobj.alloccpuregisters(list:Taasmoutput;r:Tcpuregisterset);
 
 
     var i:Tsuperregister;
     var i:Tsuperregister;
 
 
     begin
     begin
       for i:=0 to first_imaginary-1 do
       for i:=0 to first_imaginary-1 do
         if i in r then
         if i in r then
-          getexplicitregister(list,newreg(regtype,i,defaultsub));
+          getcpuregister(list,newreg(regtype,i,defaultsub));
     end;
     end;
 
 
 
 
-    procedure trgobj.deallocexplicitregisters(list:Taasmoutput;r:Tcpuregisterset);
+    procedure trgobj.dealloccpuregisters(list:Taasmoutput;r:Tcpuregisterset);
 
 
     var i:Tsuperregister;
     var i:Tsuperregister;
 
 
     begin
     begin
       for i:=0 to first_imaginary-1 do
       for i:=0 to first_imaginary-1 do
         if i in r then
         if i in r then
-          ungetregister(list,newreg(regtype,i,defaultsub));
+          ungetcpuregister(list,newreg(regtype,i,defaultsub));
     end;
     end;
 
 
 
 
@@ -2001,7 +1996,13 @@ unit rgobj;
 end.
 end.
 {
 {
   $Log$
   $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
     * paraloc branch merged
 
 
   Revision 1.134.4.2  2004/09/21 17:03:26  peter
   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_restore_standard_registers(list:taasmoutput);override;
         procedure g_save_all_registers(list : taasmoutput);override;
         procedure g_save_all_registers(list : taasmoutput);override;
         procedure g_save_standard_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;
       end;
 
 
       TCg64Sparc=class(tcg64f32)
       TCg64Sparc=class(tcg64f32)
@@ -218,7 +218,6 @@ implementation
             tmpreg:=GetIntRegister(list,OS_INT);
             tmpreg:=GetIntRegister(list,OS_INT);
             a_load_const_reg(list,OS_INT,a,tmpreg);
             a_load_const_reg(list,OS_INT,a,tmpreg);
             list.concat(taicpu.op_reg_reg_reg(op,src,tmpreg,dst));
             list.concat(taicpu.op_reg_reg_reg(op,src,tmpreg,dst));
-            UnGetRegister(list,tmpreg);
           end
           end
         else
         else
           list.concat(taicpu.op_reg_const_reg(op,src,a,dst));
           list.concat(taicpu.op_reg_const_reg(op,src,a,dst));
@@ -310,7 +309,6 @@ implementation
                   tmpreg:=GetIntRegister(list,OS_INT);
                   tmpreg:=GetIntRegister(list,OS_INT);
                   a_load_ref_reg(list,sz,sz,r,tmpreg);
                   a_load_ref_reg(list,sz,sz,r,tmpreg);
                   a_load_reg_ref(list,sz,sz,tmpreg,ref);
                   a_load_reg_ref(list,sz,sz,tmpreg,ref);
-                  UnGetRegister(list,tmpreg);
                 end;
                 end;
               else
               else
                 internalerror(2002081103);
                 internalerror(2002081103);
@@ -338,7 +336,6 @@ implementation
                   tmpreg:=GetAddressRegister(list);
                   tmpreg:=GetAddressRegister(list);
                   a_loadaddr_ref_reg(list,r,tmpreg);
                   a_loadaddr_ref_reg(list,r,tmpreg);
                   a_load_reg_ref(list,OS_ADDR,OS_ADDR,tmpreg,ref);
                   a_load_reg_ref(list,OS_ADDR,OS_ADDR,tmpreg,ref);
-                  UnGetRegister(list,tmpreg);
                 end;
                 end;
               else
               else
                 internalerror(2002080701);
                 internalerror(2002080701);
@@ -639,8 +636,6 @@ implementation
                 if hreg<>r then
                 if hreg<>r then
                   a_load_reg_reg(list,OS_ADDR,OS_ADDR,hreg,r);
                   a_load_reg_reg(list,OS_ADDR,OS_ADDR,hreg,r);
               end;
               end;
-            if hreg<>r then
-              UnGetRegister(list,hreg);
           end
           end
         else
         else
         { At least small offset, maybe base and maybe index }
         { At least small offset, maybe base and maybe index }
@@ -960,7 +955,7 @@ implementation
 
 
     { ************* concatcopy ************ }
     { ************* 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
       var
         tmpreg1,
         tmpreg1,
         hreg,
         hreg,
@@ -987,8 +982,6 @@ implementation
             a_loadaddr_ref_reg(list,source,src.base);
             a_loadaddr_ref_reg(list,source,src.base);
             orgsrc := false;
             orgsrc := false;
           end;
           end;
-        if not orgsrc and delsource then
-          reference_release(list,source);
           { load the address of dest into dst.base }
           { load the address of dest into dst.base }
         dst.base:=GetAddressRegister(list);
         dst.base:=GetAddressRegister(list);
         a_loadaddr_ref_reg(list,dest,dst.base);
         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,countreg,countreg));
             list.concat(taicpu.op_reg_reg(A_MOV,src.base,src.base));
             list.concat(taicpu.op_reg_reg(A_MOV,src.base,src.base));
             list.concat(taicpu.op_reg_reg(A_MOV,dst.base,dst.base));
             list.concat(taicpu.op_reg_reg(A_MOV,dst.base,dst.base));
-            UnGetRegister(list,countreg);
             len := len mod 4;
             len := len mod 4;
           end;
           end;
         { unrolled loop }
         { unrolled loop }
@@ -1043,7 +1035,6 @@ implementation
             a_load_reg_ref(list,OS_32,OS_32,hreg,dst);
             a_load_reg_ref(list,OS_32,OS_32,hreg,dst);
             inc(src.offset,4);
             inc(src.offset,4);
             inc(dst.offset,4);
             inc(dst.offset,4);
-            UnGetRegister(list,hreg);
           end;
           end;
         { copy the leftovers }
         { copy the leftovers }
         if (len and 2) <> 0 then
         if (len and 2) <> 0 then
@@ -1053,24 +1044,13 @@ implementation
             a_load_reg_ref(list,OS_16,OS_16,hreg,dst);
             a_load_reg_ref(list,OS_16,OS_16,hreg,dst);
             inc(src.offset,2);
             inc(src.offset,2);
             inc(dst.offset,2);
             inc(dst.offset,2);
-            UnGetRegister(list,hreg);
           end;
           end;
         if (len and 1) <> 0 then
         if (len and 1) <> 0 then
           begin
           begin
             hreg:=GetIntRegister(list,OS_INT);
             hreg:=GetIntRegister(list,OS_INT);
             a_load_ref_reg(list,OS_8,OS_8,src,hreg);
             a_load_ref_reg(list,OS_8,OS_8,src,hreg);
             a_load_reg_ref(list,OS_8,OS_8,hreg,dst);
             a_load_reg_ref(list,OS_8,OS_8,hreg,dst);
-            UnGetRegister(list,hreg);
           end;
           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;
       end;
 
 
 {****************************************************************************
 {****************************************************************************
@@ -1227,7 +1207,13 @@ begin
 end.
 end.
 {
 {
   $Log$
   $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
     * don't remove MOV reg1,reg1 it is needed for the RA
 
 
   Revision 1.87  2004/09/21 17:25:13  peter
   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,
         exprasmlist.concat(taicpu.op_reg_reg_reg(op,
            left.location.register,right.location.register,location.register));
            left.location.register,right.location.register,location.register));
-
-        release_reg_left_right;
       end;
       end;
 
 
 
 
@@ -240,8 +238,6 @@ interface
              left.location.register,right.location.register));
              left.location.register,right.location.register));
         { Delay slot (can only contain integer operation) }
         { Delay slot (can only contain integer operation) }
         exprasmlist.concat(taicpu.op_none(A_NOP));
         exprasmlist.concat(taicpu.op_none(A_NOP));
-
-        release_reg_left_right;
       end;
       end;
 
 
 
 
@@ -257,8 +253,6 @@ interface
 
 
         location_reset(location,LOC_FLAGS,OS_NO);
         location_reset(location,LOC_FLAGS,OS_NO);
         location.resflags:=getresflags(true);
         location.resflags:=getresflags(true);
-
-        release_reg_left_right;
       end;
       end;
 
 
 
 
@@ -274,8 +268,6 @@ interface
 
 
         location_reset(location,LOC_FLAGS,OS_NO);
         location_reset(location,LOC_FLAGS,OS_NO);
         location.resflags:=getresflags(true);
         location.resflags:=getresflags(true);
-
-        release_reg_left_right;
       end;
       end;
 
 
 
 
@@ -358,8 +350,6 @@ interface
         firstjmp64bitcmp;
         firstjmp64bitcmp;
         exprasmlist.concat(taicpu.op_reg_reg(A_CMP,left.location.register64.reglo,right.location.register64.reglo));
         exprasmlist.concat(taicpu.op_reg_reg(A_CMP,left.location.register64.reglo,right.location.register64.reglo));
         secondjmp64bitcmp;
         secondjmp64bitcmp;
-
-        release_reg_left_right;
       end;
       end;
 
 
 
 
@@ -380,8 +370,6 @@ interface
 
 
         location_reset(location,LOC_FLAGS,OS_NO);
         location_reset(location,LOC_FLAGS,OS_NO);
         location.resflags:=getresflags(unsigned);
         location.resflags:=getresflags(unsigned);
-
-        release_reg_left_right;
       end;
       end;
 
 
 begin
 begin
@@ -389,7 +377,13 @@ begin
 end.
 end.
 {
 {
   $Log$
   $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
     * paraloc branch merged
 
 
   Revision 1.25.4.1  2004/09/19 18:08:30  peter
   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];
         op:=conv_op[tfloatdef(resulttype.def).typ,tfloatdef(left.resulttype.def).typ];
         if op=A_NONE then
         if op=A_NONE then
           internalerror(200401121);
           internalerror(200401121);
-        location_release(exprasmlist,left.location);
         location.register:=cg.getfpuregister(exprasmlist,location.size);
         location.register:=cg.getfpuregister(exprasmlist,location.size);
         exprasmlist.concat(taicpu.op_reg_reg(op,left.location.register,location.register));
         exprasmlist.concat(taicpu.op_reg_reg(op,left.location.register,location.register));
       end;
       end;
@@ -188,7 +187,6 @@ implementation
             begin
             begin
               if left.location.loc in [LOC_CREFERENCE,LOC_REFERENCE] then
               if left.location.loc in [LOC_CREFERENCE,LOC_REFERENCE] then
                 begin
                 begin
-                  reference_release(exprasmlist,left.location.reference);
                   hreg2:=cg.getintregister(exprasmlist,opsize);
                   hreg2:=cg.getintregister(exprasmlist,opsize);
                   cg.a_load_ref_reg(exprasmlist,opsize,opsize,left.location.reference,hreg2);
                   cg.a_load_ref_reg(exprasmlist,opsize,opsize,left.location.reference,hreg2);
                 end
                 end
@@ -197,7 +195,6 @@ implementation
 {$ifndef cpu64bit}
 {$ifndef cpu64bit}
               if left.location.size in [OS_64,OS_S64] then
               if left.location.size in [OS_64,OS_S64] then
                 begin
                 begin
-                  cg.ungetregister(exprasmlist,hreg2);
                   hreg1:=cg.getintregister(exprasmlist,OS_32);
                   hreg1:=cg.getintregister(exprasmlist,OS_32);
                   cg.a_op_reg_reg_reg(exprasmlist,OP_OR,OS_32,hreg2,tregister(succ(longint(hreg2))),hreg1);
                   cg.a_op_reg_reg_reg(exprasmlist,OP_OR,OS_32,hreg2,tregister(succ(longint(hreg2))),hreg1);
                   hreg2:=hreg1;
                   hreg2:=hreg1;
@@ -205,7 +202,6 @@ implementation
                 end;
                 end;
 {$endif cpu64bit}
 {$endif cpu64bit}
               exprasmlist.concat(taicpu.op_reg_reg_reg(A_SUBCC,NR_G0,hreg2,NR_G0));
               exprasmlist.concat(taicpu.op_reg_reg_reg(A_SUBCC,NR_G0,hreg2,NR_G0));
-              cg.ungetregister(exprasmlist,hreg2);
               hreg1:=cg.getintregister(exprasmlist,opsize);
               hreg1:=cg.getintregister(exprasmlist,opsize);
               exprasmlist.concat(taicpu.op_reg_const_reg(A_ADDX,NR_G0,0,hreg1));
               exprasmlist.concat(taicpu.op_reg_const_reg(A_ADDX,NR_G0,0,hreg1));
             end;
             end;
@@ -244,7 +240,13 @@ begin
 end.
 end.
 {
 {
   $Log$
   $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
     * fixed absolute on sparc
 
 
   Revision 1.30  2004/08/24 21:02:33  florian
   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);
              cg.a_op_const_reg(exprasmlist,OP_AND,OS_INT,tordconstnode(right).value-1,tmpreg);
              { add to the left value }
              { add to the left value }
              cg.a_op_reg_reg(exprasmlist,OP_ADD,OS_INT,tmpreg,numerator);
              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);
              cg.a_op_const_reg_reg(exprasmlist,OP_SAR,OS_INT,aword(power),numerator,resultreg);
            end
            end
          else
          else
@@ -149,13 +148,8 @@ implementation
                  cg.a_label(exprasmlist,overflowlabel);
                  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_SMUL,resultreg,divider,resultreg));
                  exprasmlist.concat(taicpu.op_reg_reg_reg(A_SUB,numerator,resultreg,resultreg));
                  exprasmlist.concat(taicpu.op_reg_reg_reg(A_SUB,numerator,resultreg,resultreg));
-               end
-             else
-               cg.UngetRegister(exprasmlist,divider);
+               end;
            end;
            end;
-        { free used registers }
-        if numerator<>resultreg then
-          cg.UngetRegister(exprasmlist,numerator);
         { set result location }
         { set result location }
         location.loc:=LOC_REGISTER;
         location.loc:=LOC_REGISTER;
         location.register:=resultreg;
         location.register:=resultreg;
@@ -314,7 +308,6 @@ implementation
                 begin
                 begin
                   location_force_reg(exprasmlist,left.location,def_cgsize(left.resulttype.def),true);
                   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));
                   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_reset(location,LOC_FLAGS,OS_NO);
                   location.resflags:=F_E;
                   location.resflags:=F_E;
                end;
                end;
@@ -332,7 +325,13 @@ begin
 end.
 end.
 {
 {
   $Log$
   $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
     * fixed shr/shl 32
 
 
   Revision 1.19  2004/08/01 08:46:31  florian
   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 getfpuregister(list:Taasmoutput;size:Tcgsize):Tregister;override;
         function getmmxregister(list:Taasmoutput):Tregister;
         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;
         function  uses_registers(rt:Tregistertype):boolean;override;
         procedure add_reg_instruction(instr:Tai;r:tregister);override;
         procedure add_reg_instruction(instr:Tai;r:tregister);override;
         procedure dec_fpu_stack;
         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_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_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 }
         { entry/exit code helpers }
         procedure g_releasevaluepara_openarray(list : taasmoutput;const ref:treference);override;
         procedure g_releasevaluepara_openarray(list : taasmoutput;const ref:treference);override;
@@ -193,35 +193,35 @@ unit cgx86;
         result:=rg[R_MMXREGISTER].getregister(list,R_SUBNONE);
         result:=rg[R_MMXREGISTER].getregister(list,R_SUBNONE);
       end;
       end;
 
 
-    procedure Tcgx86.getexplicitregister(list:Taasmoutput;r:Tregister);
+    procedure Tcgx86.getcpuregister(list:Taasmoutput;r:Tregister);
       begin
       begin
         if getregtype(r)=R_FPUREGISTER then
         if getregtype(r)=R_FPUREGISTER then
           internalerror(2003121210)
           internalerror(2003121210)
         else
         else
-          inherited getexplicitregister(list,r);
+          inherited getcpuregister(list,r);
       end;
       end;
 
 
 
 
-    procedure tcgx86.ungetregister(list:Taasmoutput;r:Tregister);
+    procedure tcgx86.ungetcpuregister(list:Taasmoutput;r:Tregister);
       begin
       begin
         if getregtype(r)=R_FPUREGISTER then
         if getregtype(r)=R_FPUREGISTER then
           rgfpu.ungetregisterfpu(list,r)
           rgfpu.ungetregisterfpu(list,r)
         else
         else
-          inherited ungetregister(list,r);
+          inherited ungetcpuregister(list,r);
       end;
       end;
 
 
 
 
-    procedure Tcgx86.allocexplicitregisters(list:Taasmoutput;rt:Tregistertype;r:Tcpuregisterset);
+    procedure Tcgx86.alloccpuregisters(list:Taasmoutput;rt:Tregistertype;r:Tcpuregisterset);
       begin
       begin
         if rt<>R_FPUREGISTER then
         if rt<>R_FPUREGISTER then
-          inherited allocexplicitregisters(list,rt,r);
+          inherited alloccpuregisters(list,rt,r);
       end;
       end;
 
 
 
 
-    procedure Tcgx86.deallocexplicitregisters(list:Taasmoutput;rt:Tregistertype;r:Tcpuregisterset);
+    procedure Tcgx86.dealloccpuregisters(list:Taasmoutput;rt:Tregistertype;r:Tcpuregisterset);
       begin
       begin
         if rt<>R_FPUREGISTER then
         if rt<>R_FPUREGISTER then
-          inherited deallocexplicitregisters(list,rt,r);
+          inherited dealloccpuregisters(list,rt,r);
       end;
       end;
 
 
 
 
@@ -504,7 +504,6 @@ unit cgx86;
 {$endif x86_64}
 {$endif x86_64}
               list.concat(taicpu.op_reg_reg(op,s,reg,tmpreg));
               list.concat(taicpu.op_reg_reg(op,s,reg,tmpreg));
               a_load_reg_ref(list,tosize,tosize,tmpreg,ref);
               a_load_reg_ref(list,tosize,tosize,tmpreg,ref);
-              ungetregister(list,tmpreg);
             end;
             end;
         else
         else
           list.concat(taicpu.op_reg_ref(op,s,reg,ref));
           list.concat(taicpu.op_reg_ref(op,s,reg,ref));
@@ -976,10 +975,10 @@ unit cgx86;
             internalerror(200109233);
             internalerror(200109233);
           OP_SHR,OP_SHL,OP_SAR:
           OP_SHR,OP_SHL,OP_SAR:
             begin
             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);
               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));
               list.concat(taicpu.op_reg_reg(Topcg2asmop[op],tcgsize2opsize[size],NR_CL,src));
-              ungetregister(list,NR_CL);
+              ungetcpuregister(list,NR_CL);
             end;
             end;
           else
           else
             begin
             begin
@@ -1267,8 +1266,7 @@ unit cgx86;
 
 
 { ************* concatcopy ************ }
 { ************* 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
     const
 {$ifdef cpu64bit}
 {$ifdef cpu64bit}
@@ -1331,11 +1329,8 @@ unit cgx86;
                     cgsize:=OS_32;
                     cgsize:=OS_32;
                   end;
                   end;
                 dec(len,copysize);
                 dec(len,copysize);
-                if (len=0) and delsource then
-                  reference_release(list,source);
                 r:=getintregister(list,cgsize);
                 r:=getintregister(list,cgsize);
                 a_load_ref_reg(list,cgsize,cgsize,srcref,r);
                 a_load_ref_reg(list,cgsize,cgsize,srcref,r);
-                ungetregister(list,r);
                 a_load_reg_ref(list,cgsize,cgsize,r,dstref);
                 a_load_reg_ref(list,cgsize,cgsize,r,dstref);
                 inc(srcref.offset,copysize);
                 inc(srcref.offset,copysize);
                 inc(dstref.offset,copysize);
                 inc(dstref.offset,copysize);
@@ -1366,50 +1361,33 @@ unit cgx86;
                 a_loadmm_ref_reg(list,OS_M64,OS_M64,srcref,r3,nil);
                 a_loadmm_ref_reg(list,OS_M64,OS_M64,srcref,r3,nil);
               end;
               end;
             a_loadmm_reg_ref(list,OS_M64,OS_M64,r0,dstref,nil);
             a_loadmm_reg_ref(list,OS_M64,OS_M64,r0,dstref,nil);
-            ungetregister(list,r0);
             if len>=16 then
             if len>=16 then
               begin
               begin
                 inc(dstref.offset,8);
                 inc(dstref.offset,8);
                 a_loadmm_reg_ref(list,OS_M64,OS_M64,r1,dstref,nil);
                 a_loadmm_reg_ref(list,OS_M64,OS_M64,r1,dstref,nil);
-                ungetregister(list,r1);
               end;
               end;
             if len>=24 then
             if len>=24 then
               begin
               begin
                 inc(dstref.offset,8);
                 inc(dstref.offset,8);
                 a_loadmm_reg_ref(list,OS_M64,OS_M64,r2,dstref,nil);
                 a_loadmm_reg_ref(list,OS_M64,OS_M64,r2,dstref,nil);
-                ungetregister(list,r2);
               end;
               end;
             if len>=32 then
             if len>=32 then
               begin
               begin
                 inc(dstref.offset,8);
                 inc(dstref.offset,8);
                 a_loadmm_reg_ref(list,OS_M64,OS_M64,r3,dstref,nil);
                 a_loadmm_reg_ref(list,OS_M64,OS_M64,r3,dstref,nil);
-                ungetregister(list,r3);
               end;
               end;
           end
           end
         else {copy_string, should be a good fallback in case of unhandled}
         else {copy_string, should be a good fallback in case of unhandled}
           begin
           begin
-            getexplicitregister(list,REGDI);
+            getcpuregister(list,REGDI);
             a_loadaddr_ref_reg(list,dest,REGDI);
             a_loadaddr_ref_reg(list,dest,REGDI);
-            getexplicitregister(list,REGSI);
+            getcpuregister(list,REGSI);
             if loadref then
             if loadref then
               a_load_ref_reg(list,OS_ADDR,OS_ADDR,source,REGSI)
               a_load_ref_reg(list,OS_ADDR,OS_ADDR,source,REGSI)
             else
             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));
             list.concat(Taicpu.op_none(A_CLD,S_NO));
             if cs_littlesize in aktglobalswitches  then
             if cs_littlesize in aktglobalswitches  then
@@ -1449,13 +1427,11 @@ unit cgx86;
                 if len=1 then
                 if len=1 then
                   list.concat(Taicpu.op_none(A_MOVSB,S_NO));
                   list.concat(Taicpu.op_none(A_MOVSB,S_NO));
               end;
               end;
-            ungetregister(list,REGCX);
-            ungetregister(list,REGSI);
-            ungetregister(list,REGDI);
+            ungetcpuregister(list,REGCX);
+            ungetcpuregister(list,REGSI);
+            ungetcpuregister(list,REGDI);
           end;
           end;
         end;
         end;
-      if delsource then
-        tg.ungetiftemp(list,source);
     end;
     end;
 
 
 
 
@@ -1546,14 +1522,14 @@ unit cgx86;
                else
                else
                  begin
                  begin
                     objectlibrary.getlabel(again);
                     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));
                     list.concat(Taicpu.op_const_reg(A_MOV,S_L,localsize div winstackpagesize,NR_EDI));
                     a_label(list,again);
                     a_label(list,again);
                     list.concat(Taicpu.op_const_reg(A_SUB,S_L,winstackpagesize-4,NR_ESP));
                     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_PUSH,S_L,NR_EAX));
                     list.concat(Taicpu.op_reg(A_DEC,S_L,NR_EDI));
                     list.concat(Taicpu.op_reg(A_DEC,S_L,NR_EDI));
                     a_jmp_cond(list,OC_NE,again);
                     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));
                     list.concat(Taicpu.op_const_reg(A_SUB,S_L,localsize mod winstackpagesize,NR_ESP));
                  end
                  end
              end
              end
@@ -1697,7 +1673,13 @@ unit cgx86;
 end.
 end.
 {
 {
   $Log$
   $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
     * logs truncated
 
 
   Revision 1.123  2004/06/16 20:07:11  florian
   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);
               cg.a_load_loc_reg(exprasmlist,opsize,right.location,r);
               emit_reg_reg(op,TCGSize2Opsize[opsize],left.location.register,r);
               emit_reg_reg(op,TCGSize2Opsize[opsize],left.location.register,r);
               cg.a_load_reg_reg(exprasmlist,opsize,opsize,r,left.location.register);
               cg.a_load_reg_reg(exprasmlist,opsize,opsize,r,left.location.register);
-              cg.ungetregister(exprasmlist,r);
             end
             end
            else
            else
             begin
             begin
@@ -163,7 +162,6 @@ unit nx86add;
                         cg.a_load_loc_reg(exprasmlist,opsize,right.location,r);
                         cg.a_load_loc_reg(exprasmlist,opsize,right.location,r);
                         emit_reg(A_NOT,TCGSize2Opsize[opsize],r);
                         emit_reg(A_NOT,TCGSize2Opsize[opsize],r);
                         emit_reg_reg(A_AND,TCGSize2Opsize[opsize],r,left.location.register);
                         emit_reg_reg(A_AND,TCGSize2Opsize[opsize],r,left.location.register);
-                        cg.ungetregister(exprasmlist,r);
                      end
                      end
                    else
                    else
                      begin
                      begin
@@ -234,9 +232,6 @@ unit nx86add;
               { left was on the stack => swap }
               { left was on the stack => swap }
               toggleflag(nf_swaped);
               toggleflag(nf_swaped);
             end;
             end;
-
-           { releases the right reference }
-           location_release(exprasmlist,right.location);
          end
          end
         { the nominator in st0 }
         { the nominator in st0 }
         else if (left.location.loc<>LOC_FPUREGISTER) then
         else if (left.location.loc<>LOC_FPUREGISTER) then
@@ -402,7 +397,6 @@ unit nx86add;
         left_must_be_reg(opsize,noswap);
         left_must_be_reg(opsize,noswap);
         emit_generic_code(op,opsize,true,extra_not,false);
         emit_generic_code(op,opsize,true,extra_not,false);
         location_freetemp(exprasmlist,right.location);
         location_freetemp(exprasmlist,right.location);
-        location_release(exprasmlist,right.location);
 
 
         set_result_location_reg;
         set_result_location_reg;
       end;
       end;
@@ -437,9 +431,7 @@ unit nx86add;
         left_must_be_reg(opsize,false);
         left_must_be_reg(opsize,false);
         emit_generic_code(op,opsize,true,false,false);
         emit_generic_code(op,opsize,true,false,false);
         location_freetemp(exprasmlist,right.location);
         location_freetemp(exprasmlist,right.location);
-        location_release(exprasmlist,right.location);
         location_freetemp(exprasmlist,left.location);
         location_freetemp(exprasmlist,left.location);
-        location_release(exprasmlist,left.location);
 
 
         location_reset(location,LOC_FLAGS,OS_NO);
         location_reset(location,LOC_FLAGS,OS_NO);
         location.resflags:=getresflags(true);
         location.resflags:=getresflags(true);
@@ -484,7 +476,6 @@ unit nx86add;
             if left.location.loc in [LOC_FPUREGISTER,LOC_CFPUREGISTER] then
             if left.location.loc in [LOC_FPUREGISTER,LOC_CFPUREGISTER] then
               location_force_mem(exprasmlist,left.location);
               location_force_mem(exprasmlist,left.location);
             cg.a_opmm_loc_reg(exprasmlist,op,location.size,left.location,location.register,mms_movescalar);
             cg.a_opmm_loc_reg(exprasmlist,op,location.size,left.location,location.register,mms_movescalar);
-            location_release(exprasmlist,left.location);
           end
           end
         else
         else
           begin
           begin
@@ -498,7 +489,6 @@ unit nx86add;
             if right.location.loc in [LOC_FPUREGISTER,LOC_CFPUREGISTER] then
             if right.location.loc in [LOC_FPUREGISTER,LOC_CFPUREGISTER] then
               location_force_mem(exprasmlist,right.location);
               location_force_mem(exprasmlist,right.location);
             cg.a_opmm_loc_reg(exprasmlist,op,location.size,right.location,location.register,mms_movescalar);
             cg.a_opmm_loc_reg(exprasmlist,op,location.size,right.location,location.register,mms_movescalar);
-            location_release(exprasmlist,right.location);
           end;
           end;
       end;
       end;
 
 
@@ -558,8 +548,6 @@ unit nx86add;
                 internalerror(200402223);
                 internalerror(200402223);
             end;
             end;
           end;
           end;
-        location_release(exprasmlist,right.location);
-        location_release(exprasmlist,left.location);
         location.resflags:=getresflags(true);
         location.resflags:=getresflags(true);
       end;
       end;
 
 
@@ -591,10 +579,6 @@ unit nx86add;
 
 
         left_and_right_must_be_fpureg;
         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 we swaped the tree nodes, then use the reverse operator }
         if nf_swaped in flags then
         if nf_swaped in flags then
           begin
           begin
@@ -625,10 +609,6 @@ unit nx86add;
         pass_left_right;
         pass_left_right;
         left_and_right_must_be_fpureg;
         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}
 {$ifndef x86_64}
         if aktspecificoptprocessor<ClassPentium2 then
         if aktspecificoptprocessor<ClassPentium2 then
           begin
           begin
@@ -637,10 +617,10 @@ unit nx86add;
             tcgx86(cg).dec_fpu_stack;
             tcgx86(cg).dec_fpu_stack;
 
 
             { load fpu flags }
             { load fpu flags }
-            cg.getexplicitregister(exprasmlist,NR_AX);
+            cg.getcpuregister(exprasmlist,NR_AX);
             emit_reg(A_FNSTSW,S_NO,NR_AX);
             emit_reg(A_FNSTSW,S_NO,NR_AX);
             emit_none(A_SAHF,S_NO);
             emit_none(A_SAHF,S_NO);
-            cg.ungetregister(exprasmlist,NR_AX);
+            cg.ungetcpuregister(exprasmlist,NR_AX);
             if nf_swaped in flags then
             if nf_swaped in flags then
              begin
              begin
                case nodetype of
                case nodetype of
@@ -754,7 +734,6 @@ unit nx86add;
                        paramanager.getintparaloc(pocall_default,2,paraloc2);
                        paramanager.getintparaloc(pocall_default,2,paraloc2);
                        { process parameters }
                        { process parameters }
                        secondpass(left);
                        secondpass(left);
-                       location_release(exprasmlist,left.location);
                        if paraloc2.location^.loc=LOC_REGISTER then
                        if paraloc2.location^.loc=LOC_REGISTER then
                          begin
                          begin
                            hregister2:=cg.getaddressregister(exprasmlist);
                            hregister2:=cg.getaddressregister(exprasmlist);
@@ -766,7 +745,6 @@ unit nx86add;
                            cg.a_paramaddr_ref(exprasmlist,left.location.reference,paraloc2);
                            cg.a_paramaddr_ref(exprasmlist,left.location.reference,paraloc2);
                          end;
                          end;
                        secondpass(right);
                        secondpass(right);
-                       location_release(exprasmlist,right.location);
                        if paraloc1.location^.loc=LOC_REGISTER then
                        if paraloc1.location^.loc=LOC_REGISTER then
                          begin
                          begin
                            hregister1:=cg.getaddressregister(exprasmlist);
                            hregister1:=cg.getaddressregister(exprasmlist);
@@ -780,21 +758,19 @@ unit nx86add;
                        { push parameters }
                        { push parameters }
                        if paraloc1.location^.loc=LOC_REGISTER then
                        if paraloc1.location^.loc=LOC_REGISTER then
                          begin
                          begin
-                           cg.ungetregister(exprasmlist,hregister2);
                            paramanager.allocparaloc(exprasmlist,paraloc2);
                            paramanager.allocparaloc(exprasmlist,paraloc2);
                            cg.a_param_reg(exprasmlist,OS_ADDR,hregister2,paraloc2);
                            cg.a_param_reg(exprasmlist,OS_ADDR,hregister2,paraloc2);
                          end;
                          end;
                        if paraloc2.location^.loc=LOC_REGISTER then
                        if paraloc2.location^.loc=LOC_REGISTER then
                          begin
                          begin
-                           cg.ungetregister(exprasmlist,hregister1);
                            paramanager.allocparaloc(exprasmlist,paraloc1);
                            paramanager.allocparaloc(exprasmlist,paraloc1);
                            cg.a_param_reg(exprasmlist,OS_ADDR,hregister1,paraloc1);
                            cg.a_param_reg(exprasmlist,OS_ADDR,hregister1,paraloc1);
                          end;
                          end;
                        paramanager.freeparaloc(exprasmlist,paraloc1);
                        paramanager.freeparaloc(exprasmlist,paraloc1);
                        paramanager.freeparaloc(exprasmlist,paraloc2);
                        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.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,left.location);
                        location_freetemp(exprasmlist,right.location);
                        location_freetemp(exprasmlist,right.location);
                        paraloc1.done;
                        paraloc1.done;
@@ -900,7 +876,6 @@ unit nx86add;
          left_must_be_reg(opsize,false);
          left_must_be_reg(opsize,false);
          emit_generic_code(op,opsize,unsigned,extra_not,mboverflow);
          emit_generic_code(op,opsize,unsigned,extra_not,mboverflow);
          location_freetemp(exprasmlist,right.location);
          location_freetemp(exprasmlist,right.location);
-         location_release(exprasmlist,right.location);
 
 
          set_result_location_reg;
          set_result_location_reg;
       end;
       end;
@@ -920,12 +895,8 @@ unit nx86add;
          left_must_be_reg(opsize,false);
          left_must_be_reg(opsize,false);
          emit_generic_code(A_CMP,opsize,unsigned,false,false);
          emit_generic_code(A_CMP,opsize,unsigned,false,false);
          location_freetemp(exprasmlist,right.location);
          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_reset(location,LOC_FLAGS,OS_NO);
          location.resflags:=getresflags(unsigned);
          location.resflags:=getresflags(unsigned);
       end;
       end;
@@ -935,7 +906,13 @@ begin
 end.
 end.
 {
 {
   $Log$
   $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
     * paraloc branch merged
 
 
   Revision 1.11.4.1  2004/08/31 20:43:06  peter
   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}
 {$ifndef cpu64bit}
                 if left.location.size in [OS_64,OS_S64] then
                 if left.location.size in [OS_64,OS_S64] then
                  begin
                  begin
-                   location_release(exprasmlist,left.location);
                    hregister:=cg.getintregister(exprasmlist,OS_INT);
                    hregister:=cg.getintregister(exprasmlist,OS_INT);
                    cg.a_load_ref_reg(exprasmlist,OS_32,OS_32,left.location.reference,hregister);
                    cg.a_load_ref_reg(exprasmlist,OS_32,OS_32,left.location.reference,hregister);
                    href:=left.location.reference;
                    href:=left.location.reference;
                    inc(href.offset,4);
                    inc(href.offset,4);
-                   cg.ungetregister(exprasmlist,hregister);
                    cg.a_op_ref_reg(exprasmlist,OP_OR,OS_32,href,hregister);
                    cg.a_op_ref_reg(exprasmlist,OP_OR,OS_32,href,hregister);
                  end
                  end
                 else
                 else
 {$endif cpu64bit}
 {$endif cpu64bit}
                  begin
                  begin
                    location_force_reg(exprasmlist,left.location,left.location.size,true);
                    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);
                    cg.a_op_reg_reg(exprasmlist,OP_OR,left.location.size,left.location.register,left.location.register);
                  end;
                  end;
               end;
               end;
@@ -156,16 +153,11 @@ implementation
                  begin
                  begin
                    hregister:=cg.getintregister(exprasmlist,OS_32);
                    hregister:=cg.getintregister(exprasmlist,OS_32);
                    cg.a_load_reg_reg(exprasmlist,OS_32,OS_32,left.location.registerlow,hregister);
                    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);
                    cg.a_op_reg_reg(exprasmlist,OP_OR,OS_32,left.location.registerhigh,hregister);
                  end
                  end
                 else
                 else
 {$endif cpu64bit}
 {$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;
               end;
             LOC_JUMP :
             LOC_JUMP :
               begin
               begin
@@ -177,7 +169,6 @@ implementation
                 cg.a_label(exprasmlist,falselabel);
                 cg.a_label(exprasmlist,falselabel);
                 cg.a_load_const_reg(exprasmlist,OS_INT,0,hregister);
                 cg.a_load_const_reg(exprasmlist,OS_INT,0,hregister);
                 cg.a_label(exprasmlist,hlabel);
                 cg.a_label(exprasmlist,hlabel);
-                cg.ungetregister(exprasmlist,hregister);
                 cg.a_op_reg_reg(exprasmlist,OP_OR,OS_INT,hregister,hregister);
                 cg.a_op_reg_reg(exprasmlist,OP_OR,OS_INT,hregister,hregister);
               end;
               end;
             else
             else
@@ -238,7 +229,6 @@ implementation
             if (torddef(left.resulttype.def).typ=u32bit) then
             if (torddef(left.resulttype.def).typ=u32bit) then
               begin
               begin
                 tg.GetTemp(exprasmlist,8,tt_normal,href);
                 tg.GetTemp(exprasmlist,8,tt_normal,href);
-                location_release(exprasmlist,left.location);
                 location_freetemp(exprasmlist,left.location);
                 location_freetemp(exprasmlist,left.location);
                 cg.a_load_ref_ref(exprasmlist,left.location.size,OS_32,left.location.reference,href);
                 cg.a_load_ref_ref(exprasmlist,left.location.size,OS_32,left.location.reference,href);
                 inc(href.offset,4);
                 inc(href.offset,4);
@@ -248,7 +238,6 @@ implementation
               end;
               end;
 
 
             { Load from reference to fpu reg }
             { Load from reference to fpu reg }
-            location_release(exprasmlist,left.location);
             case torddef(left.resulttype.def).typ of
             case torddef(left.resulttype.def).typ of
               u32bit,
               u32bit,
               scurrency,
               scurrency,
@@ -301,7 +290,13 @@ implementation
 end.
 end.
 {
 {
   $Log$
   $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
     * logs truncated
 
 
   Revision 1.12  2004/06/16 20:07:11  florian
   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,
                cg.a_loadfpu_ref_reg(exprasmlist,
                   def_cgsize(left.resulttype.def),
                   def_cgsize(left.resulttype.def),
                   left.location.reference,location.register);
                   left.location.reference,location.register);
-               location_release(exprasmlist,left.location);
              end
              end
          else
          else
             internalerror(309991);
             internalerror(309991);
@@ -261,11 +260,8 @@ implementation
                  begin
                  begin
                    r:=cg.getintregister(exprasmlist,OS_ADDR);
                    r:=cg.getintregister(exprasmlist,OS_ADDR);
                    cg.a_loadaddr_ref_reg(exprasmlist,left.location.reference,r);
                    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));
                    exprasmlist.concat(taicpu.op_ref(A_PREFETCHNTA,S_NO,ref));
-                   cg.ungetregister(exprasmlist,r);
                  end;
                  end;
                else
                else
                  internalerror(200402021);
                  internalerror(200402021);
@@ -307,7 +303,6 @@ implementation
                     inc(tcallparanode(left).left.location.reference.offset,
                     inc(tcallparanode(left).left.location.reference.offset,
                       (tordconstnode(tcallparanode(tcallparanode(left).right).left).value div bitsperop)*tcgsize2size[opsize]);
                       (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);
                     cg.a_op_const_ref(exprasmlist,cgop,opsize,l,tcallparanode(left).left.location.reference);
-                    location_release(exprasmlist,tcallparanode(left).left.location);
                   end;
                   end;
                 LOC_CREGISTER :
                 LOC_CREGISTER :
                   cg.a_op_const_reg(exprasmlist,cgop,tcallparanode(left).left.location.size,l,tcallparanode(left).left.location.register);
                   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)
                 hregister:=cg.makeregsize(exprasmlist,Tcallparanode(Tcallparanode(left).right).left.location.register,opsize)
               else
               else
                 hregister:=cg.getintregister(exprasmlist,opsize);
                 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);
               cg.a_load_loc_reg(exprasmlist,opsize,tcallparanode(tcallparanode(left).right).left.location,hregister);
               if (tcallparanode(left).left.location.loc=LOC_REFERENCE) then
               if (tcallparanode(left).left.location.loc=LOC_REFERENCE) then
                 emit_reg_ref(asmop,tcgsize2opsize[opsize],hregister,tcallparanode(left).left.location.reference)
                 emit_reg_ref(asmop,tcgsize2opsize[opsize],hregister,tcallparanode(left).left.location.reference)
               else
               else
                 emit_reg_reg(asmop,tcgsize2opsize[opsize],hregister,tcallparanode(left).left.location.register);
                 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;
         end;
         end;
 
 
@@ -352,7 +344,13 @@ implementation
 end.
 end.
 {
 {
   $Log$
   $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
     * logs truncated
 
 
   Revision 1.4  2004/06/16 20:07:11  florian
   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
             if left.location.loc in [LOC_FPUREGISTER,LOC_CFPUREGISTER] then
               location_force_mem(exprasmlist,left.location);
               location_force_mem(exprasmlist,left.location);
             cg.a_opmm_loc_reg(exprasmlist,OP_SUB,left.location.size,left.location,reg,mms_movescalar);
             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_reset(location,LOC_MMREGISTER,def_cgsize(resulttype.def));
             location.register:=reg;
             location.register:=reg;
           end
           end
@@ -185,7 +184,6 @@ interface
               LOC_REFERENCE,
               LOC_REFERENCE,
               LOC_CREFERENCE:
               LOC_CREFERENCE:
                 begin
                 begin
-                  reference_release(exprasmlist,left.location.reference);
                   location.register:=NR_ST;
                   location.register:=NR_ST;
                   cg.a_loadfpu_ref_reg(exprasmlist,
                   cg.a_loadfpu_ref_reg(exprasmlist,
                      def_cgsize(left.resulttype.def),
                      def_cgsize(left.resulttype.def),
@@ -239,7 +237,6 @@ interface
            case left.expectloc of
            case left.expectloc of
              LOC_FLAGS :
              LOC_FLAGS :
                begin
                begin
-                 location_release(exprasmlist,left.location);
                  location_reset(location,LOC_FLAGS,OS_NO);
                  location_reset(location,LOC_FLAGS,OS_NO);
                  location.resflags:=left.location.resflags;
                  location.resflags:=left.location.resflags;
                  inverse_flags(location.resflags);
                  inverse_flags(location.resflags);
@@ -251,7 +248,6 @@ interface
              LOC_CREFERENCE :
              LOC_CREFERENCE :
                begin
                begin
                  location_force_reg(exprasmlist,left.location,opsize,true);
                  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);
                  emit_reg_reg(A_TEST,TCGSize2Opsize[opsize],left.location.register,left.location.register);
                  location_reset(location,LOC_FLAGS,OS_NO);
                  location_reset(location,LOC_FLAGS,OS_NO);
                  location.resflags:=F_E;
                  location.resflags:=F_E;
@@ -308,7 +304,13 @@ end.
 
 
 {
 {
   $Log$
   $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
     * logs truncated
 
 
   Revision 1.4  2004/06/16 20:07:11  florian
   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);
                pleftreg:=cg.getintregister(exprasmlist,OS_32);
                opsize:=OS_32;
                opsize:=OS_32;
                cg.a_load_ref_reg(exprasmlist,OS_8,OS_32,left.location.reference,pleftreg);
                cg.a_load_ref_reg(exprasmlist,OS_8,OS_32,left.location.reference,pleftreg);
-               location_release(exprasmlist,left.location);
              end;
              end;
 
 
             { Get a label to jump to the end }
             { Get a label to jump to the end }
@@ -261,7 +260,6 @@ implementation
                       { move and substract in one instruction with LEA)    }
                       { move and substract in one instruction with LEA)    }
                       if (left.location.loc = LOC_CREGISTER) then
                       if (left.location.loc = LOC_CREGISTER) then
                         begin
                         begin
-                          cg.ungetregister(exprasmlist,pleftreg);
                           r:=cg.getintregister(exprasmlist,OS_32);
                           r:=cg.getintregister(exprasmlist,OS_32);
                           reference_reset_base(href,pleftreg,-setparts[i].start);
                           reference_reset_base(href,pleftreg,-setparts[i].start);
                           cg.a_loadaddr_ref_reg(exprasmlist,href,r);
                           cg.a_loadaddr_ref_reg(exprasmlist,href,r);
@@ -314,9 +312,6 @@ implementation
              right.location.reference.symbol:=nil;
              right.location.reference.symbol:=nil;
              { Now place the end label }
              { Now place the end label }
              cg.a_label(exprasmlist,l);
              cg.a_label(exprasmlist,l);
-             cg.ungetregister(exprasmlist,pleftreg);
-             if r<>NR_NO then
-              cg.ungetregister(exprasmlist,r);
           end
           end
          else
          else
           begin
           begin
@@ -345,7 +340,6 @@ implementation
                     else
                     else
                       internalerror(200203312);
                       internalerror(200203312);
                   end;
                   end;
-                  location_release(exprasmlist,right.location);
                 end
                 end
                else
                else
                 begin
                 begin
@@ -363,7 +357,6 @@ implementation
                         but 8 bits are easier to load                    }
                         but 8 bits are easier to load                    }
                       hr:=cg.getintregister(exprasmlist,OS_32);
                       hr:=cg.getintregister(exprasmlist,OS_32);
                       cg.a_load_ref_reg(exprasmlist,OS_8,OS_32,left.location.reference,hr);
                       cg.a_load_ref_reg(exprasmlist,OS_8,OS_32,left.location.reference,hr);
-                      location_release(exprasmlist,left.location);
                     end;
                     end;
                   end;
                   end;
 
 
@@ -371,9 +364,7 @@ implementation
                     LOC_REGISTER,
                     LOC_REGISTER,
                     LOC_CREGISTER :
                     LOC_CREGISTER :
                       begin
                       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;
                       end;
                      LOC_CONSTANT :
                      LOC_CONSTANT :
                        begin
                        begin
@@ -382,19 +373,15 @@ implementation
                          hr2:=cg.getintregister(exprasmlist,OS_32);
                          hr2:=cg.getintregister(exprasmlist,OS_32);
                          cg.a_load_const_reg(exprasmlist,OS_32,right.location.value,hr2);
                          cg.a_load_const_reg(exprasmlist,OS_32,right.location.value,hr2);
                          emit_reg_reg(A_BT,S_L,hr,hr2);
                          emit_reg_reg(A_BT,S_L,hr,hr2);
-                         cg.ungetregister(exprasmlist,hr2);
                        end;
                        end;
                      LOC_CREFERENCE,
                      LOC_CREFERENCE,
                      LOC_REFERENCE :
                      LOC_REFERENCE :
                        begin
                        begin
-                         location_release(exprasmlist,right.location);
                          emit_reg_ref(A_BT,S_L,hr,right.location.reference);
                          emit_reg_ref(A_BT,S_L,hr,right.location.reference);
                        end;
                        end;
                      else
                      else
                        internalerror(2002032210);
                        internalerror(2002032210);
                   end;
                   end;
-                  { simply to indicate EDI is deallocated here too (JM) }
-                  cg.ungetregister(exprasmlist,hr);
                   location.resflags:=F_C;
                   location.resflags:=F_C;
                 end;
                 end;
              end
              end
@@ -426,7 +413,6 @@ implementation
                           hr2:=cg.getintregister(exprasmlist,OS_32);
                           hr2:=cg.getintregister(exprasmlist,OS_32);
                           cg.a_load_const_reg(exprasmlist,OS_32,right.location.value,hr2);
                           cg.a_load_const_reg(exprasmlist,OS_32,right.location.value,hr2);
                           emit_reg_reg(A_BT,S_L,hr,hr2);
                           emit_reg_reg(A_BT,S_L,hr,hr2);
-                          cg.ungetregister(exprasmlist,hr2);
                        end;
                        end;
                   else
                   else
                     begin
                     begin
@@ -447,7 +433,6 @@ implementation
                        exprasmlist.concat(taicpu.op_none(A_CLC,S_NO));
                        exprasmlist.concat(taicpu.op_none(A_CLC,S_NO));
                        cg.a_jmp_always(exprasmlist,l2);
                        cg.a_jmp_always(exprasmlist,l2);
                        cg.a_label(exprasmlist,l);
                        cg.a_label(exprasmlist,l);
-                       location_release(exprasmlist,left.location);
                        hr:=cg.getintregister(exprasmlist,OS_32);
                        hr:=cg.getintregister(exprasmlist,OS_32);
                        cg.a_load_ref_reg(exprasmlist,OS_32,OS_32,left.location.reference,hr);
                        cg.a_load_ref_reg(exprasmlist,OS_32,OS_32,left.location.reference,hr);
                        { We have to load the value into a register because
                        { We have to load the value into a register because
@@ -455,7 +440,6 @@ implementation
                        hr2:=cg.getintregister(exprasmlist,OS_32);
                        hr2:=cg.getintregister(exprasmlist,OS_32);
                        cg.a_load_const_reg(exprasmlist,OS_32,right.location.value,hr2);
                        cg.a_load_const_reg(exprasmlist,OS_32,right.location.value,hr2);
                        emit_reg_reg(A_BT,S_L,hr,hr2);
                        emit_reg_reg(A_BT,S_L,hr,hr2);
-                       cg.ungetregister(exprasmlist,hr2);
                     end;
                     end;
                   end;
                   end;
                   cg.a_label(exprasmlist,l2);
                   cg.a_label(exprasmlist,l2);
@@ -467,7 +451,6 @@ implementation
                   location.resflags:=F_NE;
                   location.resflags:=F_NE;
                   inc(right.location.reference.offset,tordconstnode(left).value shr 3);
                   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);
                   emit_const_ref(A_TEST,S_B,1 shl (tordconstnode(left).value and 7),right.location.reference);
-                  location_release(exprasmlist,right.location);
                 end
                 end
                else
                else
                 begin
                 begin
@@ -477,10 +460,7 @@ implementation
                     pleftreg:=cg.getintregister(exprasmlist,OS_32);
                     pleftreg:=cg.getintregister(exprasmlist,OS_32);
                   cg.a_load_loc_reg(exprasmlist,OS_32,left.location,pleftreg);
                   cg.a_load_loc_reg(exprasmlist,OS_32,left.location,pleftreg);
                   location_freetemp(exprasmlist,left.location);
                   location_freetemp(exprasmlist,left.location);
-                  location_release(exprasmlist,left.location);
                   emit_reg_ref(A_BT,S_L,pleftreg,right.location.reference);
                   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 }
                   { tg.ungetiftemp(exprasmlist,right.location.reference) happens below }
                   location.resflags:=F_C;
                   location.resflags:=F_C;
                 end;
                 end;
@@ -495,7 +475,13 @@ begin
 end.
 end.
 {
 {
   $Log$
   $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
     * dwarf branch merged
 
 
   Revision 1.3  2004/05/22 23:34:28  peter
   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. }
         and free the location. }
       r:=cg.getintregister(exprasmlist,OS_INT);
       r:=cg.getintregister(exprasmlist,OS_INT);
       cg.a_load_loc_reg(exprasmlist,OS_INT,left.location,r);
       cg.a_load_loc_reg(exprasmlist,OS_INT,left.location,r);
-      location_release(exprasmlist,left.location);
       { Allocate RAX. }
       { Allocate RAX. }
-      cg.getexplicitregister(exprasmlist,NR_RAX);
+      cg.getcpuregister(exprasmlist,NR_RAX);
       { Load the right value. }
       { Load the right value. }
       cg.a_load_loc_reg(exprasmlist,OS_INT,right.location,NR_RAX);
       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). }
       { 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);
       emit_reg(A_MUL,S_Q,r);
       if cs_check_overflow in aktlocalswitches  then
       if cs_check_overflow in aktlocalswitches  then
        begin
        begin
@@ -75,10 +71,9 @@ interface
          cg.a_call_name(exprasmlist,'FPC_OVERFLOW');
          cg.a_call_name(exprasmlist,'FPC_OVERFLOW');
          cg.a_label(exprasmlist,hl4);
          cg.a_label(exprasmlist,hl4);
        end;
        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. }
       { Allocate a new register and store the result in RAX in it. }
       location.register:=cg.getintregister(exprasmlist,OS_INT);
       location.register:=cg.getintregister(exprasmlist,OS_INT);
       emit_reg_reg(A_MOV,S_Q,NR_RAX,location.register);
       emit_reg_reg(A_MOV,S_Q,NR_RAX,location.register);
@@ -92,7 +87,13 @@ begin
 end.
 end.
 {
 {
   $Log$
   $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
     * dwarf branch merged
 
 
   Revision 1.2.2.1  2004/04/26 15:54:33  peter
   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);
                   emit_const_reg(A_AND,S_Q,tordconstnode(right).value-1,hreg2);
                   { add to the left value }
                   { add to the left value }
                   emit_reg_reg(A_ADD,S_Q,hreg2,hreg1);
                   emit_reg_reg(A_ADD,S_Q,hreg2,hreg1);
-                  { release EDX if we used it }
-                  cg.ungetregister(exprasmlist,hreg2);
                   { do the shift }
                   { do the shift }
                   emit_const_reg(A_SAR,S_Q,power,hreg1);
                   emit_const_reg(A_SAR,S_Q,power,hreg1);
               end
               end
@@ -108,10 +106,9 @@ implementation
         else
         else
           begin
           begin
             {Bring denominator to a register.}
             {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);
             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.}
             {Sign extension depends on the left type.}
             if torddef(left.resulttype.def).typ=u64bit then
             if torddef(left.resulttype.def).typ=u64bit then
               emit_reg_reg(A_XOR,S_Q,NR_RDX,NR_RDX)
               emit_reg_reg(A_XOR,S_Q,NR_RDX,NR_RDX)
@@ -132,26 +129,17 @@ implementation
               begin
               begin
                 hreg1:=cg.getintregister(exprasmlist,right.location.size);
                 hreg1:=cg.getintregister(exprasmlist,right.location.size);
                 cg.a_load_loc_reg(exprasmlist,OS_64,right.location,hreg1);
                 cg.a_load_loc_reg(exprasmlist,OS_64,right.location,hreg1);
-                cg.ungetregister(exprasmlist,hreg1);
                 emit_reg(op,S_Q,hreg1);
                 emit_reg(op,S_Q,hreg1);
               end;
               end;
-            location_release(exprasmlist,right.location);
 
 
             { Copy the result into a new register. Release RAX & RDX.}
             { 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
             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
             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;
       end;
       end;
 
 
@@ -188,7 +176,6 @@ implementation
             mask:=63;
             mask:=63;
           end;
           end;
 
 
-
         { load left operators in a register }
         { load left operators in a register }
         location_copy(location,left.location);
         location_copy(location,left.location);
         location_force_reg(exprasmlist,location,opsize,false);
         location_force_reg(exprasmlist,location,opsize,false);
@@ -199,13 +186,11 @@ implementation
         else
         else
           begin
           begin
             { load right operators in a RCX }
             { 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);
             cg.a_load_loc_reg(exprasmlist,OS_INT,right.location,NR_RCX);
 
 
             { right operand is in ECX }
             { 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);
             emit_reg_reg(op,tcgsize2opsize[opsize],NR_CL,location.register);
           end;
           end;
       end;
       end;
@@ -219,7 +204,13 @@ begin
 end.
 end.
 {
 {
   $Log$
   $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
     * logs truncated
 
 
   Revision 1.5  2004/06/16 20:07:11  florian
   Revision 1.5  2004/06/16 20:07:11  florian