Browse Source

* fixed more ppc stuff

florian 22 years ago
parent
commit
5b33ab3643
4 changed files with 61 additions and 23 deletions
  1. 22 6
      compiler/cgobj.pas
  2. 28 6
      compiler/powerpc/cgcpu.pas
  3. 7 3
      compiler/rgobj.pas
  4. 4 8
      compiler/x86/cgx86.pas

+ 22 - 6
compiler/cgobj.pas

@@ -73,14 +73,14 @@ unit cgobj;
           {# Gets a register suitable to do integer operations on.}
           function getintregister(list:Taasmoutput;size:Tcgsize):Tregister;virtual;abstract;
           {# Gets a register suitable to do integer operations on.}
-          function getaddressregister(list:Taasmoutput):Tregister;virtual;abstract;
+          function getaddressregister(list:Taasmoutput):Tregister;virtual;
           function getfpuregister(list:Taasmoutput;size:Tcgsize):Tregister;virtual;abstract;
           function getmmregister(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
            the cpu specific child cg object have such a method?}
           procedure ungetregister(list:Taasmoutput;r:Tregister);virtual;abstract;
-          procedure ungetreference(list:Taasmoutput;const r:Treference);virtual;abstract;
+          procedure ungetreference(list:Taasmoutput;const r:Treference);virtual;
 
           procedure add_move_instruction(instr:Taicpu);virtual;abstract;
 
@@ -563,20 +563,33 @@ implementation
       setsubreg(result,subreg);
     end;
 
-    procedure tcg.a_reg_alloc(list : taasmoutput;r : tregister);
 
+    function tcg.getaddressregister(list:Taasmoutput):Tregister;
+      begin
+        result:=getintregister(list,OS_ADDR);
+      end;
+
+
+    procedure tcg.ungetreference(list:Taasmoutput;const r:Treference);
+      begin
+        if r.base<>NR_NO then
+          ungetregister(list,r.base);
+      end;
+
+
+    procedure tcg.a_reg_alloc(list : taasmoutput;r : tregister);
       begin
          list.concat(tai_regalloc.alloc(r));
       end;
 
-    procedure tcg.a_reg_dealloc(list : taasmoutput;r : tregister);
 
+    procedure tcg.a_reg_dealloc(list : taasmoutput;r : tregister);
       begin
          list.concat(tai_regalloc.dealloc(r));
       end;
 
-    procedure tcg.a_label(list : taasmoutput;l : tasmlabel);
 
+    procedure tcg.a_label(list : taasmoutput;l : tasmlabel);
       begin
          list.concat(tai_label.create(l));
       end;
@@ -1774,7 +1787,10 @@ finalization
 end.
 {
   $Log$
-  Revision 1.131  2003-10-17 14:38:32  peter
+  Revision 1.132  2003-10-17 15:25:18  florian
+    * fixed more ppc stuff
+
+  Revision 1.131  2003/10/17 14:38:32  peter
     * 64k registers supported
     * fixed some memory leaks
 

+ 28 - 6
compiler/powerpc/cgcpu.pas

@@ -47,11 +47,8 @@ unit cgcpu;
         function  getmmregister(list:Taasmoutput;size:Tcgsize):Tregister;override;
         procedure getexplicitregister(list:Taasmoutput;r:Tregister);override;
         procedure ungetregister(list:Taasmoutput;r:Tregister);override;
-        {!!!
-        procedure allocexplicitregisters(list:Taasmoutput;rt:Tregistertype;r:Tsuperregisterset);override;
-        procedure deallocexplicitregisters(list:Taasmoutput;rt:Tregistertype;r:Tsuperregisterset);override;
         procedure add_move_instruction(instr:Taicpu);override;
-        }
+        procedure do_register_allocation(list:Taasmoutput;headertai:tai);override;
 
         { passing parameters, per default the parameter is pushed }
         { nr gives the number of the parameter (enumerated from   }
@@ -178,7 +175,7 @@ const
 
     procedure tcgppc.init_register_allocators;
       begin
-        rgfpu:=trgcpu.create(R_INTREGISTER,R_SUBWHOLE,
+        rgint:=trgcpu.create(R_INTREGISTER,R_SUBWHOLE,
             [RS_R3,RS_R4,RS_R5,RS_R6,RS_R7,RS_R8,
              RS_R9,RS_R10,RS_R11,RS_R12,RS_R31,RS_R30,RS_R29,
              RS_R28,RS_R27,RS_R26,RS_R25,RS_R24,RS_R23,RS_R22,
@@ -254,6 +251,28 @@ const
       end;
 
 
+    procedure tcgppc.add_move_instruction(instr:Taicpu);
+      begin
+        rgint.add_move_instruction(instr);
+      end;
+
+
+    procedure tcgppc.do_register_allocation(list:Taasmoutput;headertai:tai);
+      begin
+        { Int }
+        rgint.do_register_allocation(list,headertai);
+        rgint.translate_registers(list);
+
+        { FPU }
+        rgfpu.do_register_allocation(list,headertai);
+        rgfpu.translate_registers(list);
+
+        { MM }
+        rgmm.do_register_allocation(list,headertai);
+        rgmm.translate_registers(list);
+      end;
+
+
     procedure tcgppc.a_param_const(list : taasmoutput;size : tcgsize;a : aword;const locpara : tparalocation);
       var
         ref: treference;
@@ -2436,7 +2455,10 @@ begin
 end.
 {
   $Log$
-  Revision 1.132  2003-10-17 15:08:34  peter
+  Revision 1.133  2003-10-17 15:25:18  florian
+    * fixed more ppc stuff
+
+  Revision 1.132  2003/10/17 15:08:34  peter
     * commented out more obsolete constants
 
   Revision 1.131  2003/10/17 14:52:07  peter

+ 7 - 3
compiler/rgobj.pas

@@ -485,8 +485,9 @@ implementation
          worklist_moves:=Tlinkedlist.create;
          { Usable registers }
          fillchar(usable_registers,sizeof(usable_registers),0);
-         for i:=low(Ausable) to high(Ausable) do
-           usable_registers[i]:=Ausable[i];
+         if high(Ausable)>0 then
+           for i:=low(Ausable) to high(Ausable) do
+             usable_registers[i]:=Ausable[i];
          usable_registers_cnt:=high(Ausable)+1;
       end;
 
@@ -1742,7 +1743,10 @@ end;
 end.
 {
   $Log$
-  Revision 1.85  2003-10-17 14:38:32  peter
+  Revision 1.86  2003-10-17 15:25:18  florian
+    * fixed more ppc stuff
+
+  Revision 1.85  2003/10/17 14:38:32  peter
     * 64k registers supported
     * fixed some memory leaks
 

+ 4 - 8
compiler/x86/cgx86.pas

@@ -43,7 +43,6 @@ unit cgx86;
         procedure done_register_allocators;override;
 
         function  getintregister(list:Taasmoutput;size:Tcgsize):Tregister;override;
-        function  getaddressregister(list:Taasmoutput):Tregister;override;
         function  getfpuregister(list:Taasmoutput;size:Tcgsize):Tregister;override;
         function  getmmregister(list:Taasmoutput;size:Tcgsize):Tregister;override;
         procedure getexplicitregister(list:Taasmoutput;r:Tregister);override;
@@ -212,12 +211,6 @@ unit cgx86;
       end;
 
 
-    function Tcgx86.getaddressregister(list:Taasmoutput):Tregister;
-      begin
-        result:=rgint.getregister(list,R_SUBWHOLE);
-      end;
-
-
     function Tcgx86.getfpuregister(list:Taasmoutput;size:Tcgsize):Tregister;
       begin
         result:=trgx86fpu(rgfpu).getregisterfpu(list);
@@ -1753,7 +1746,10 @@ unit cgx86;
 end.
 {
   $Log$
-  Revision 1.80  2003-10-17 14:38:32  peter
+  Revision 1.81  2003-10-17 15:25:18  florian
+    * fixed more ppc stuff
+
+  Revision 1.80  2003/10/17 14:38:32  peter
     * 64k registers supported
     * fixed some memory leaks