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

*** empty log message ***

mazen 23 жил өмнө
parent
commit
fcc5675528

+ 8 - 5
compiler/sparc/cgcpu.pas

@@ -274,7 +274,7 @@ procedure tcgSPARC.a_load_reg_reg(list:TAasmOutput;fromsize,tosize:tcgsize;reg1,
 procedure tcgSPARC.a_loadfpu_reg_reg(list:TAasmOutput;reg1, reg2:tregister);
 procedure tcgSPARC.a_loadfpu_reg_reg(list:TAasmOutput;reg1, reg2:tregister);
 
 
        begin
        begin
-         if NOT (reg1 IN [R_F0..R_F31]) then
+{         if NOT (reg1 IN [R_F0..R_F31]) then
            begin
            begin
              list.concat(taicpu.op_reg(A_NONE,S_NO,
              list.concat(taicpu.op_reg(A_NONE,S_NO,
                trgcpu(rg).correct_fpuregister(reg1,trgcpu(rg).fpuvaroffset)));
                trgcpu(rg).correct_fpuregister(reg1,trgcpu(rg).fpuvaroffset)));
@@ -285,7 +285,7 @@ procedure tcgSPARC.a_loadfpu_reg_reg(list:TAasmOutput;reg1, reg2:tregister);
              list.concat(taicpu.op_reg(A_JMPL,S_NO,
              list.concat(taicpu.op_reg(A_JMPL,S_NO,
                  trgcpu(rg).correct_fpuregister(reg2,trgcpu(rg).fpuvaroffset)));
                  trgcpu(rg).correct_fpuregister(reg2,trgcpu(rg).fpuvaroffset)));
              dec(trgcpu(rg).fpuvaroffset);
              dec(trgcpu(rg).fpuvaroffset);
-           end;
+           end;}
        end;
        end;
 
 
 
 
@@ -1225,7 +1225,7 @@ procedure tcgSPARC.floatload(list:TAasmOutput;t:tcgsize;CONST ref:TReference);
   BEGIN
   BEGIN
     floatloadops(t,op,s);
     floatloadops(t,op,s);
     list.concat(Taicpu.Op_ref(op,s,ref));
     list.concat(Taicpu.Op_ref(op,s,ref));
-    inc(trgcpu(rg).fpuvaroffset);
+{    inc(trgcpu(rg).fpuvaroffset);}
   END;
   END;
 procedure tcgSPARC.floatstoreops(t:tcgsize;var op:tasmop;var s:topsize);
 procedure tcgSPARC.floatstoreops(t:tcgsize;var op:tasmop;var s:topsize);
   BEGIN
   BEGIN
@@ -1257,14 +1257,17 @@ procedure tcgSPARC.floatstore(list:TAasmOutput;t:tcgsize;CONST ref:TReference);
   BEGIN
   BEGIN
     floatstoreops(t,op,s);
     floatstoreops(t,op,s);
     list.concat(Taicpu.Op_ref(op,s,ref));
     list.concat(Taicpu.Op_ref(op,s,ref));
-    dec(trgcpu(rg).fpuvaroffset);
+{    dec(trgcpu(rg).fpuvaroffset);}
   END;
   END;
 BEGIN
 BEGIN
   cg:=tcgSPARC.create;
   cg:=tcgSPARC.create;
 END.
 END.
 {
 {
   $Log$
   $Log$
-  Revision 1.14  2002-10-10 19:57:51  mazen
+  Revision 1.15  2002-10-11 13:35:14  mazen
+  *** empty log message ***
+
+  Revision 1.14  2002/10/10 19:57:51  mazen
   * Just to update repsitory
   * Just to update repsitory
 
 
   Revision 1.13  2002/10/10 15:10:39  mazen
   Revision 1.13  2002/10/10 15:10:39  mazen

+ 5 - 2
compiler/sparc/cpubase.pas

@@ -402,7 +402,7 @@ CONST
   {           excludes registers which can be only used for parameter      }
   {           excludes registers which can be only used for parameter      }
   {           passing on ABI's that define this)                           }
   {           passing on ABI's that define this)                           }
   { c_countusableregsxxx = amount of registers in the usableregsxxx set    }
   { c_countusableregsxxx = amount of registers in the usableregsxxx set    }
-  IntRegs=[R_L0..R_O7];
+  IntRegs=[R_G0..R_I7];
   usableregsint=general_registers;
   usableregsint=general_registers;
   c_countusableregsint = 4;
   c_countusableregsint = 4;
   fpuregs=[R_F0..R_F31];
   fpuregs=[R_F0..R_F31];
@@ -571,7 +571,10 @@ FUNCTION flags_to_cond(CONST f:TResFlags):TAsmCond;
 END.
 END.
 {
 {
   $Log$
   $Log$
-  Revision 1.11  2002-10-10 19:57:51  mazen
+  Revision 1.12  2002-10-11 13:35:14  mazen
+  *** empty log message ***
+
+  Revision 1.11  2002/10/10 19:57:51  mazen
   * Just to update repsitory
   * Just to update repsitory
 
 
   Revision 1.10  2002/10/02 22:20:28  mazen
   Revision 1.10  2002/10/02 22:20:28  mazen

+ 35 - 306
compiler/sparc/rgcpu.pas

@@ -1,13 +1,4 @@
-{*****************************************************************************}
-{ File                   : rgcpu.pas                                          }
-{ Author                 : Mazen NEIFER                                       }
-{ Project                : Free Pascal Compiler (FPC)                         }
-{ Creation date          : 2002\26\26                                         }
-{ Last modification date : 2002\08\20                                         }
-{ Licence                : GPL                                                }
-{ Bug report             : [email protected]                        }
-{*****************************************************************************}
-{
+{******************************************************************************
     $Id$
     $Id$
     Copyright (c) 1998-2002 by Florian Klaempfl
     Copyright (c) 1998-2002 by Florian Klaempfl
 
 
@@ -28,311 +19,49 @@
     along with this program; if not, write to the Free Software
     along with this program; if not, write to the Free Software
     Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
     Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
 
 
- ****************************************************************************
-}
-
+ ****************************************************************************}
 unit rgcpu;
 unit rgcpu;
-
 {$INCLUDE fpcdefs.inc}
 {$INCLUDE fpcdefs.inc}
-
-  interface
-
-    uses
-      cpubase,
-      cpuinfo,
-      aasmcpu,
-      aasmtai,
-      cclasses,globtype,cgbase,aasmbase,rgobj;
-
-    type
-       trgcpu = class(trgobj)
-
-          { to keep the same allocation order as with the old routines }
-          function getregisterint(list: taasmoutput): tregister; override;
-          procedure ungetregisterint(list: taasmoutput; r : tregister); override;
-          function getexplicitregisterint(list: taasmoutput; r : tregister) : tregister; override;
-
-          function getregisterfpu(list: taasmoutput) : tregister; override;
-          procedure ungetregisterfpu(list: taasmoutput; r : tregister); override;
-
-          procedure ungetreference(list: taasmoutput; const ref : treference); override;
-
-          { pushes and restores registers }
-          procedure pushusedregisters(list: taasmoutput;
-            var pushed : tpushedsaved;const s: tregisterset);
-          procedure popusedregisters(list: taasmoutput;
-            const pushed : tpushedsaved);
-
-          procedure resetusableregisters;override;
-
-         { corrects the fpu stack register by ofs }
-         function correct_fpuregister(r : tregister;ofs : byte) : tregister;
-
-         fpuvaroffset : byte;
-       end;
-
-
-  implementation
-
-    uses
-       systems,
-       globals,verbose,node,
-       cgobj,tgobj,cga;
-
-
-    function trgcpu.getregisterint(list: taasmoutput): tregister;
+interface
+uses
+  cpubase,
+  cpuinfo,
+  aasmcpu,
+  aasmtai,
+  cclasses,globtype,cgbase,aasmbase,rgobj;
+type
+  trgcpu=class(trgobj)
+    { to keep the same allocation order as with the old routines }
+    procedure UngetregisterInt(list:taasmoutput;Reg:tregister);override;
+    function GetExplicitRegisterInt(list:taasmoutput;Reg:tregister):tregister;override;
+  end;
+implementation
+uses
+  cgobj;
+function trgcpu.GetExplicitRegisterInt(list:taasmoutput;reg:tregister):tregister;
+  begin
+    if reg = R_i0
+    then
       begin
       begin
-         if countunusedregsint=0 then
-           internalerror(10);(*
-{$ifdef TEMPREGDEBUG}
-         if curptree^.usableregsint-countunusedregsint>curptree^.registers32 then
-           internalerror(10);
-{$endif TEMPREGDEBUG}
-{$ifdef EXTTEMPREGDEBUG}
-         if curptree^.usableregs-countunusedregistersint>curptree^^.reallyusedregs then
-           curptree^.reallyusedregs:=curptree^^.usableregs-countunusedregistersint;
-{$endif EXTTEMPREGDEBUG}
-         dec(countunusedregsint);
-         if R_EAX in unusedregsint then
-           begin
-              exclude(unusedregsint,R_EAX);
-              include(usedinproc,R_EAX);
-              getregisterint:=R_EAX;
-{$ifdef TEMPREGDEBUG}
-              reg_user[R_EAX]:=curptree^;
-{$endif TEMPREGDEBUG}
-              exprasmlist.concat(tairegalloc.alloc(R_EAX));
-           end
-         else if R_EDX in unusedregsint then
-           begin
-              exclude(unusedregsint,R_EDX);
-              include(usedinproc,R_EDX);
-              getregisterint:=R_EDX;
-{$ifdef TEMPREGDEBUG}
-              reg_user[R_EDX]:=curptree^;
-{$endif TEMPREGDEBUG}
-              exprasmlist.concat(tairegalloc.alloc(R_EDX));
-           end
-         else if R_EBX in unusedregsint then
-           begin
-              exclude(unusedregsint,R_EBX);
-              include(usedinproc,R_EBX);
-              getregisterint:=R_EBX;
-{$ifdef TEMPREGDEBUG}
-              reg_user[R_EBX]:=curptree^;
-{$endif TEMPREGDEBUG}
-              exprasmlist.concat(tairegalloc.alloc(R_EBX));
-           end
-         else if R_ECX in unusedregsint then
-           begin
-              exclude(unusedregsint,R_ECX);
-              include(usedinproc,R_ECX);
-              getregisterint:=R_ECX;
-{$ifdef TEMPREGDEBUG}
-              reg_user[R_ECX]:=curptree^;
-{$endif TEMPREGDEBUG}
-              exprasmlist.concat(tairegalloc.alloc(R_ECX));
-           end
-         else internalerror(10);
-{$ifdef TEMPREGDEBUG}
-         testregisters;
-{$endif TEMPREGDEBUG}*)
+        cg.a_reg_alloc(list,Reg);
+        result := Reg;
+      end
+        else result := inherited GetExplicitRegisterInt(list,reg);
       end;
       end;
-
-    procedure trgcpu.ungetregisterint(list: taasmoutput; r : tregister);
-      begin
-{         if (r = R_EDI) or
-            ((not assigned(procinfo^._class)) and (r = R_ESI)) then
-           begin
-             list.concat(Tairegalloc.DeAlloc(r));
-             exit;
-           end;
-         if not(r in [R_EAX,R_EBX,R_ECX,R_EDX]) then
-           exit;
-         inherited ungetregisterint(list,r);}
-      end;
-
-
-   function trgcpu.getexplicitregisterint(list: taasmoutput; r : tregister) : tregister;
-     begin
-{       if r in [R_ESI,R_EDI] then
-         begin
-           list.concat(Tairegalloc.Alloc(r));
-           getexplicitregisterint := r;
-           exit;
-         end;}
-       result := inherited getexplicitregisterint(list,r);
-    end;
-
-
-    function trgcpu.getregisterfpu(list: taasmoutput) : tregister;
-
-      begin
-        { note: don't return R_ST0, see comments above implementation of }
-        { a_loadfpu_* methods in cgcpu (JM)                              }
-//        result := R_ST;
-      end;
-
-
-    procedure trgcpu.ungetregisterfpu(list : taasmoutput; r : tregister);
-
-      begin
-        { nothing to do, fpu stack management is handled by the load/ }
-        { store operations in cgcpu (JM)                              }
-      end;
-
-
-    procedure trgcpu.ungetreference(list: taasmoutput; const ref : treference);
-
-      begin
-         ungetregisterint(list,ref.base);
-         ungetregisterint(list,ref.index);
-      end;
-
-
-    procedure trgcpu.pushusedregisters(list: taasmoutput;
-        var pushed : tpushedsaved; const s: tregisterset);
-
-      var
-        r: tregister;
-        hr: treference;
-      begin
-        usedinproc:=usedinproc + s;
-(*        for r:=R_EAX to R_EBX do
-          begin
-            pushed[r].pushed:=false;
-            { if the register is used by the calling subroutine    }
-            if not is_reg_var[r] and
-               (r in s) and
-               { and is present in use }
-               not(r in unusedregsint) then
-              begin
-                { then save it }
-                list.concat(Taicpu.Op_reg(A_PUSH,S_L,r));
-                include(unusedregsint,r);
-                inc(countunusedregsint);
-                pushed[r].pushed:=true;
-              end;
-          end;*)
-{$ifdef SUPPORT_MMX}
-        (*for r:=R_MM0 to R_MM6 do
-          begin
-            pushed[r].pushed:=false;
-            { if the register is used by the calling subroutine    }
-            if not is_reg_var[r] and
-               (r in s) and
-               { and is present in use }
-               not(r in unusedregsmm) then
-              begin
-                list.concat(Taicpu.Op_const_reg(A_SUB,S_L,8,R_ESP));
-                reference_reset_base(hr,R_ESP,0);
-                list.concat(Taicpu.Op_reg_ref(A_MOVQ,S_NO,r,hr));
-                include(unusedregsmm,r);
-                inc(countunusedregsmm);
-                pushed[r].pushed:=true;
-              end;
-          end;*)
-{$endif SUPPORT_MMX}
-{$ifdef TEMPREGDEBUG}
-        testregisters;
-{$endif TEMPREGDEBUG}
-      end;
-
-
-    procedure trgcpu.popusedregisters(list: taasmoutput;
-        const pushed : tpushedsaved);
-
-      var
-        r : tregister;
-{$ifdef SUPPORT_MMX}
-        hr : treference;
-{$endif SUPPORT_MMX}
-      begin
-        { restore in reverse order: }
-{$ifdef SUPPORT_MMX}
-        for r:=R_MM6 downto R_MM0 do
-          if pushed[r].pushed then
-            begin
-              reference_reset_base(hr,R_ESP,0);
-              list.concat(Taicpu.Op_ref_reg(
-                A_MOVQ,S_NO,hr,r));
-              list.concat(Taicpu.Op_const_reg(
-                A_ADD,S_L,8,R_ESP));
-              if not (r in unusedregsmm) then
-                { internalerror(10)
-                  in cg386cal we always restore regs
-                  that appear as used
-                  due to a unused tmep storage PM }
-              else
-                dec(countunusedregsmm);
-              exclude(unusedregsmm,r);
-            end;
-{$endif SUPPORT_MMX}
-(*        for r:=R_EBX downto R_EAX do
-          if pushed[r].pushed then
-            begin
-              list.concat(Taicpu.Op_reg(A_POP,S_L,r));
-              if not (r in unusedregsint) then
-                { internalerror(10)
-                  in cg386cal we always restore regs
-                  that appear as used
-                  due to a unused tmep storage PM }
-              else
-                dec(countunusedregsint);
-              exclude(unusedregsint,r);
-            end;*)
-{$ifdef TEMPREGDEBUG}
-        testregisters;
-{$endif TEMPREGDEBUG}
-      end;
-
-   procedure trgcpu.resetusableregisters;
-
-     begin
-       inherited resetusableregisters;
-       fpuvaroffset := 0;
-     end;
-
-
-   function trgcpu.correct_fpuregister(r : tregister;ofs : byte) : tregister;
-
-     begin
-        correct_fpuregister:=tregister(longint(r)+ofs);
-     end;
-
-
+procedure trgcpu.UngetregisterInt(list: taasmoutput; reg: tregister);
+  begin
+    if reg = R_i0
+    then
+      cg.a_reg_dealloc(list,reg)
+    else
+      inherited ungetregisterint(list,reg);
+  end;
 initialization
 initialization
   rg := trgcpu.create;
   rg := trgcpu.create;
 end.
 end.
-
 {
 {
   $Log$
   $Log$
-  Revision 1.1  2002-08-21 13:30:07  mazen
+  Revision 1.2  2002-10-11 13:35:14  mazen
   *** empty log message ***
   *** empty log message ***
 
 
-  Revision 1.2  2002/04/02 17:11:39  peter
-    * tlocation,treference update
-    * LOC_CONSTANT added for better constant handling
-    * secondadd splitted in multiple routines
-    * location_force_reg added for loading a location to a register
-      of a specified size
-    * secondassignment parses now first the right and then the left node
-      (this is compatible with Kylix). This saves a lot of push/pop especially
-      with string operations
-    * adapted some routines to use the new cg methods
-
-  Revision 1.1  2002/03/31 20:26:40  jonas
-    + a_loadfpu_* and a_loadmm_* methods in tcg
-    * register allocation is now handled by a class and is mostly processor
-      independent (+rgobj.pas and i386/rgcpu.pas)
-    * temp allocation is now handled by a class (+tgobj.pas, -i386\tgcpu.pas)
-    * some small improvements and fixes to the optimizer
-    * some register allocation fixes
-    * some fpuvaroffset fixes in the unary minus node
-    * fixed and optimized register saving/restoring for new/dispose nodes
-    * LOC_FPU locations now also require their "register" field to be set to
-      R_ST, not R_ST0 (the latter is used for LOC_CFPUREGISTER locations only)
-    - list field removed of the tnode class because it's not used currently
-      and can cause hard-to-find bugs
-
 }
 }