Procházet zdrojové kódy

* fixes for FPU register allocation

peter před 22 roky
rodič
revize
610cbec252
1 změnil soubory, kde provedl 42 přidání a 29 odebrání
  1. 42 29
      compiler/rgobj.pas

+ 42 - 29
compiler/rgobj.pas

@@ -22,6 +22,9 @@
 
 {$i fpcdefs.inc}
 
+{ Allow duplicate allocations, can be used to get the .s file written }
+{ $define ALLOWDUPREG}
+
 {# @abstract(Abstract register allocator unit)
    This unit contains services to allocate, free
    references and registers which are used by
@@ -357,13 +360,13 @@ unit rgobj;
           coalesced_moves,constrained_moves:Tlinkedlist;
           { the following two contain the common (generic) code for all }
           { get- and ungetregisterxxx functions/procedures              }
-          function getregistergenother(list: taasmoutput; const lowreg, highreg: Tregisterindex;
-              var unusedregs:Totherregisterset;var countunusedregs:byte): tregister;
+          function getregistergenother(list: taasmoutput; const lowreg, highreg: tsuperregister;
+              var unusedregs:Tsuperregisterset;var countunusedregs:byte): tregister;
           function getregistergenint(list:Taasmoutput;subreg:Tsubregister;
                                      const lowreg,highreg:Tsuperregister;
                                      var fusedinproc,unusedregs:Tsuperregisterset):Tregister;
           procedure ungetregistergen(list: taasmoutput; r: tregister;
-              const usableregs:totherregisterset;var unusedregs: totherregisterset; var countunusedregs: byte);
+              const usableregs:tsuperregisterset;var unusedregs: tsuperregisterset; var countunusedregs: byte);
           procedure ungetregistergenint(list:taasmoutput;r:Tregister;
                                         const usableregs:Tsuperregisterset;
                                         var unusedregs:Tsuperregisterset);
@@ -488,20 +491,21 @@ unit rgobj;
      end;
 
 
-    function trgobj.getregistergenother(list: taasmoutput; const lowreg, highreg: Tregisterindex;
-        var unusedregs: totherregisterset; var countunusedregs: byte): tregister;
+    function trgobj.getregistergenother(list: taasmoutput; const lowreg, highreg: tsuperregister;
+        var unusedregs: tsuperregisterset; var countunusedregs: byte): tregister;
       var
-        i: tregisterindex;
+        i: tsuperregister;
         r: Tregister;
       begin
-         for i:=low(tregisterindex) to high(tregisterindex) do
+         for i:=lowreg to highreg do
            begin
               if i in unusedregs then
                 begin
                    exclude(unusedregs,i);
                    include(used_in_proc_other,i);
                    dec(countunusedregs);
-                   r:=regnumber_table[i];
+{$warning Only FPU Registers supported}
+                   r:=newreg(R_FPUREGISTER,i,R_SUBNONE);
                    list.concat(tai_regalloc.alloc(r));
                    result := r;
                    exit;
@@ -545,19 +549,19 @@ unit rgobj;
 
 
     procedure trgobj.ungetregistergen(list: taasmoutput; r: tregister;
-        const usableregs: totherregisterset; var unusedregs: totherregisterset; var countunusedregs: byte);
+        const usableregs: tsuperregisterset; var unusedregs: tsuperregisterset; var countunusedregs: byte);
       var
-        regidx : tregisterindex;
+        supreg : tsuperregister;
       begin
-         regidx:=findreg_by_number(r);
+         supreg:=getsupreg(r);
          { takes much time }
-         if not(regidx in usableregs) then
+         if not(supreg in usableregs) then
            exit;
-         if (regidx in unusedregs) then
+         if (supreg in unusedregs) then
            exit
          else
           inc(countunusedregs);
-        include(unusedregs,regidx);
+        include(unusedregs,supreg);
         list.concat(tai_regalloc.dealloc(r));
       end;
 
@@ -623,7 +627,10 @@ unit rgobj;
           add_edges_used(supreg);
          end
        else
-         internalerror(200301103);
+{$ifndef ALLOWDUPREG}
+         internalerror(200301103)
+{$endif ALLOWDUPREG}
+         ;
        getexplicitregisterint:=r;
     end;
 
@@ -647,7 +654,10 @@ unit rgobj;
               end;
          end
        else
-         internalerror(200305061);
+{$ifndef ALLOWDUPREG}
+         internalerror(200305061)
+{$endif ALLOWDUPREG}
+       ;
     end;
 
     procedure Trgobj.deallocexplicitregistersint(list:Taasmoutput;r:Tsuperregisterset);
@@ -667,22 +677,24 @@ unit rgobj;
               end;
          end
        else
-         internalerror(200305062);
+{$ifndef ALLOWDUPREG}
+         internalerror(200305061)
+{$endif ALLOWDUPREG}
+         ;
     end;
 
 
     { tries to allocate the passed register, if possible }
     function trgobj.getexplicitregisterfpu(list : taasmoutput; r : Tregister) : tregister;
-
-      var regidx : tregisterindex;
-
+      var
+        supreg : tsuperregister;
       begin
-         regidx:=findreg_by_number(r);
-         if regidx in unusedregsfpu then
+         supreg:=getsupreg(r);
+         if supreg in unusedregsfpu then
            begin
               dec(countunusedregsfpu);
-              exclude(unusedregsfpu,regidx);
-              include(used_in_proc_other,regidx);
+              exclude(unusedregsfpu,supreg);
+              include(used_in_proc_other,supreg);
               list.concat(tai_regalloc.alloc(r));
               getexplicitregisterfpu:=r;
            end
@@ -697,7 +709,7 @@ unit rgobj;
         if countunusedregsfpu=0 then
           internalerror(10);
 {$warning TODO firstsavefpureg}
-        result := getregistergenother(list,{firstsavefpureg,lastsavefpureg,}0,0,
+        result := getregistergenother(list,firstsavefpureg,lastsavefpureg,
           unusedregsfpu,countunusedregsfpu);
       end;
 
@@ -714,8 +726,7 @@ unit rgobj;
       begin
         if countunusedregsmm=0 then
            internalerror(10);
-{$warning TODO firstsavemmreg}
-       result := getregistergenother(list,{firstsavemmreg,lastsavemmreg,}0,0,
+       result := getregistergenother(list,firstsavemmreg,lastsavemmreg,
                    unusedregsmm,countunusedregsmm);
       end;
 
@@ -2009,7 +2020,6 @@ unit rgobj;
     {Returns true if any help registers have been used.}
 
     var i:byte;
-        r:Tsuperregister;
         p,q:Tai;
         regs_to_spill_set:Tsuperregisterset;
         spill_temps:^Tspill_temp_list;
@@ -2200,7 +2210,10 @@ end.
 
 {
   $Log$
-  Revision 1.69  2003-09-03 15:55:01  peter
+  Revision 1.70  2003-09-03 21:06:45  peter
+    * fixes for FPU register allocation
+
+  Revision 1.69  2003/09/03 15:55:01  peter
     * NEWRA branch merged
 
   Revision 1.68  2003/09/03 11:18:37  florian