瀏覽代碼

* fixes for FPU register allocation

peter 22 年之前
父節點
當前提交
610cbec252
共有 1 個文件被更改,包括 42 次插入29 次删除
  1. 42 29
      compiler/rgobj.pas

+ 42 - 29
compiler/rgobj.pas

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