浏览代码

* sparc updates
* use registertype in spill_register

peter 21 年之前
父节点
当前提交
1c7e6fc380

+ 28 - 27
compiler/aasmtai.pas

@@ -83,9 +83,6 @@ interface
 {$ifdef m68k}
           ait_labeled_instruction,
 {$endif m68k}
-{$ifdef SPARC}
-          ait_labeled_instruction,
-{$endif SPARC}
           ait_cut, { used to split into tiny assembler files }
           ait_regalloc,
           ait_tempalloc,
@@ -133,9 +130,6 @@ interface
 {$ifdef m68k}
           'labeled_instr',
 {$endif m68k}
-{$ifdef SPARC}
-          'labeled_instr',
-{$endif SPARC}
           'cut',
           'regalloc',
           'tempalloc',
@@ -491,16 +485,16 @@ interface
           procedure loadreg(opidx:longint;r:tregister);
           procedure loadoper(opidx:longint;o:toper);
           procedure clearop(opidx:longint);
-          function is_nop:boolean;virtual;abstract;
           function is_reg_move:boolean;virtual;abstract;
+          function is_same_reg_move:boolean;virtual;abstract;
           { register allocator }
           function get_insert_pos(p:Tai;huntfor1,huntfor2,huntfor3:Tsuperregister;var live_registers_int:Tsuperregisterworklist):Tai;
-          procedure forward_allocation(p:Tai;var {unusedregsint:tsuperregisterset}live_registers_int:Tsuperregisterworklist);
+          procedure forward_allocation(p:Tai;var live_registers_int:Tsuperregisterworklist);
           function spill_registers(list:Taasmoutput;
+                                   rt:Tregistertype;
                                    rgget:Trggetproc;
                                    rgunget:Trgungetproc;
                                    const r:tsuperregisterset;
-{                                   var unusedregsint:tsuperregisterset;}
                                    var live_registers_int:Tsuperregisterworklist;
                                    const spilltemplist:Tspill_temp_list):boolean;virtual;
           function spilling_decode_loadstore(op: tasmop; var counterpart: tasmop; var wasload: boolean): boolean;virtual;abstract;
@@ -1681,8 +1675,11 @@ implementation
               segprefix:=ref^.segment;
 {$endif}
             typ:=top_ref;
-            add_reg_instruction_hook(self,ref^.base);
-            add_reg_instruction_hook(self,ref^.index);
+            if assigned(add_reg_instruction_hook) then
+              begin
+                add_reg_instruction_hook(self,ref^.base);
+                add_reg_instruction_hook(self,ref^.index);
+              end;
             { mark symbol as used }
             if assigned(ref^.symbol) then
               ref^.symbol.increfs;
@@ -1700,7 +1697,8 @@ implementation
            reg:=r;
            typ:=top_reg;
          end;
-        add_reg_instruction_hook(self,r);
+        if assigned(add_reg_instruction_hook) then
+          add_reg_instruction_hook(self,r);
 {$ifdef ARM}
         { R15 is the PC on the ARM thus moves to R15 are jumps.
           Due to speed considerations we don't use a virtual overridden method here.
@@ -1722,13 +1720,19 @@ implementation
           begin
             case typ of
               top_reg:
-                add_reg_instruction_hook(self,reg);
+                begin
+                  if assigned(add_reg_instruction_hook) then
+                    add_reg_instruction_hook(self,reg);
+                end;
               top_ref:
                 begin
                   new(ref);
                   ref^:=o.ref^;
-                  add_reg_instruction_hook(self,ref^.base);
-                  add_reg_instruction_hook(self,ref^.index);
+                  if assigned(add_reg_instruction_hook) then
+                    begin
+                      add_reg_instruction_hook(self,ref^.base);
+                      add_reg_instruction_hook(self,ref^.index);
+                    end;
                 end;
 {$ifdef ARM}
               top_shifterop:
@@ -1778,39 +1782,33 @@ implementation
             supreg:=getsupreg(Tai_regalloc(p).reg);
             {Rewind the register allocation.}
             if Tai_regalloc(p).allocation then
-{              supregset_include(unusedregsint,supreg)}
               live_registers_int.delete(supreg)
             else
               begin
-{                supregset_exclude(unusedregsint,supreg);}
                 live_registers_int.add(supreg);
                 if supreg=huntfor1 then
                   begin
                     get_insert_pos:=Tai(p.previous);
                     back.done;
                     back.copyfrom(live_registers_int);
-{                    back:=unusedregsint;}
                   end;
                 if supreg=huntfor2 then
                   begin
                     get_insert_pos:=Tai(p.previous);
                     back.done;
                     back.copyfrom(live_registers_int);
-{                    back:=unusedregsint;}
                   end;
                 if supreg=huntfor3 then
                   begin
                     get_insert_pos:=Tai(p.previous);
                     back.done;
                     back.copyfrom(live_registers_int);
-{                    back:=unusedregsint;}
                   end;
               end;
             p:=Tai(p.previous);
           end;
         live_registers_int.done;
         live_registers_int.copyfrom(back);
-{        unusedregsint:=back;}
       end;
 
 
@@ -1822,10 +1820,8 @@ implementation
             if p.typ<>ait_regalloc then
               internalerror(200305311);
             if Tai_regalloc(p).allocation then
-{              supregset_exclude(unusedregsint,getsupreg(Tai_regalloc(p).reg))}
               live_registers_int.add(getsupreg(Tai_regalloc(p).reg))
             else
-{              supregset_include(unusedregsint,getsupreg(Tai_regalloc(p).reg));}
               live_registers_int.delete(getsupreg(Tai_regalloc(p).reg));
             p:=Tai(p.next);
           end;
@@ -1833,6 +1829,7 @@ implementation
 
 
     function taicpu_abstract.spill_registers(list:Taasmoutput;
+                             rt:Tregistertype;
                              rgget:Trggetproc;
                              rgunget:Trgungetproc;
                              const r:Tsuperregisterset;
@@ -1862,7 +1859,7 @@ implementation
           else
             list.insertafter(helpins,pos.next);
           rgunget(list,self,regs[regidx].newreg);
-          forward_allocation(tai(helpins.next),{unusedregsint)}live_registers_int);
+          forward_allocation(tai(helpins.next),live_registers_int);
         end;
 
 
@@ -1888,7 +1885,7 @@ implementation
           helpins2:=spilling_create_store(regs[regidx].newreg,spilltemplist[regs[regidx].orgreg]);
           list.insertafter(helpins2,self);
           rgunget(list,helpins2,regs[regidx].newreg);
-          forward_allocation(tai(helpins1.next),{unusedregsint}live_registers_int);
+          forward_allocation(tai(helpins1.next),live_registers_int);
         end;
 
 
@@ -1988,7 +1985,7 @@ implementation
                 if regs[counter].mustbespilled then
                   begin
                     supreg := regs[counter].orgreg;
-                    pos := get_insert_pos(Tai(previous),regs[0].orgreg,regs[1].orgreg,regs[2].orgreg,{unusedregsint}live_registers_int);
+                    pos := get_insert_pos(Tai(previous),regs[0].orgreg,regs[1].orgreg,regs[2].orgreg,live_registers_int);
                     rgget(list,pos,R_SUBWHOLE,regs[counter].newreg);
                     if regs[counter].regread then
                       if regs[counter].regwritten then
@@ -2213,7 +2210,11 @@ implementation
 end.
 {
   $Log$
-  Revision 1.61  2003-12-15 21:25:48  peter
+  Revision 1.62  2003-12-26 14:02:30  peter
+    * sparc updates
+    * use registertype in spill_register
+
+  Revision 1.61  2003/12/15 21:25:48  peter
     * reg allocations for imaginary register are now inserted just
       before reg allocation
     * tregister changed to enum to allow compile time check

+ 7 - 3
compiler/arm/aasmcpu.pas

@@ -68,7 +68,7 @@ uses
          constructor op_reg_sym_ofs(op : tasmop;_op1 : tregister;_op2:tasmsymbol;_op2ofs : longint);
          constructor op_sym_ofs_ref(op : tasmop;_op1 : tasmsymbol;_op1ofs:longint;const _op2 : treference);
 
-         function is_nop: boolean; override;
+         function is_same_reg_move: boolean; override;
          function is_reg_move:boolean; override;
 
          { register spilling code }
@@ -283,7 +283,7 @@ implementation
 
 { ****************************** newra stuff *************************** }
 
-    function taicpu.is_nop: boolean;
+    function taicpu.is_same_reg_move: boolean;
       begin
         { allow the register allocator to remove unnecessary moves }
         result:=is_reg_move and (oper[0]^.reg=oper[1]^.reg);
@@ -374,7 +374,11 @@ implementation
 end.
 {
   $Log$
-  Revision 1.18  2003-12-18 17:06:21  florian
+  Revision 1.19  2003-12-26 14:02:30  peter
+    * sparc updates
+    * use registertype in spill_register
+
+  Revision 1.18  2003/12/18 17:06:21  florian
     * arm compiler compilation fixed
 
   Revision 1.17  2003/12/03 17:39:05  florian

+ 7 - 4
compiler/arm/cgcpu.pas

@@ -122,6 +122,7 @@ unit cgcpu;
 
     procedure tcgarm.init_register_allocators;
       begin
+        inherited init_register_allocators;
         rg[R_INTREGISTER]:=trgcpu.create(R_INTREGISTER,R_SUBWHOLE,
             [RS_R0,RS_R1,RS_R2,RS_R3,RS_R4,RS_R5,RS_R6,RS_R7,RS_R8,
              RS_R9,RS_R10,RS_R12],first_int_imreg,[]);
@@ -135,11 +136,9 @@ unit cgcpu;
     procedure tcgarm.done_register_allocators;
       begin
         rg[R_INTREGISTER].free;
-        rg[R_INTREGISTER]:=nil;
         rg[R_FPUREGISTER].free;
-        rg[R_FPUREGISTER]:=nil;
         rg[R_MMREGISTER].free;
-        rg[R_MMREGISTER]:=nil;
+        inherited done_register_allocators;
       end;
 
 
@@ -1199,7 +1198,11 @@ begin
 end.
 {
   $Log$
-  Revision 1.28  2003-12-18 17:06:21  florian
+  Revision 1.29  2003-12-26 14:02:30  peter
+    * sparc updates
+    * use registertype in spill_register
+
+  Revision 1.28  2003/12/18 17:06:21  florian
     * arm compiler compilation fixed
 
   Revision 1.27  2003/12/08 17:43:57  florian

+ 5 - 5
compiler/arm/cpubase.pas

@@ -309,10 +309,6 @@ unit cpubase;
 *****************************************************************************}
 
     const
-      { declare aliases }
-      LOC_MMREGISTER = LOC_SSEREGISTER;
-      LOC_CMMREGISTER = LOC_CSSEREGISTER;
-
       max_operands = 3;
 
       {# Constant defining possibly all registers which might require saving }
@@ -569,7 +565,11 @@ unit cpubase;
 end.
 {
   $Log$
-  Revision 1.21  2003-12-18 17:06:21  florian
+  Revision 1.22  2003-12-26 14:02:30  peter
+    * sparc updates
+    * use registertype in spill_register
+
+  Revision 1.21  2003/12/18 17:06:21  florian
     * arm compiler compilation fixed
 
   Revision 1.20  2003/11/29 17:36:56  peter

+ 24 - 5
compiler/cgobj.pas

@@ -68,9 +68,9 @@ unit cgobj;
           constructor create;
 
           {# Initialize the register allocators needed for the codegenerator.}
-          procedure init_register_allocators;virtual;abstract;
+          procedure init_register_allocators;virtual;
           {# Clean up the register allocators needed for the codegenerator.}
-          procedure done_register_allocators;virtual;abstract;
+          procedure done_register_allocators;virtual;
 
           {# Gets a register suitable to do integer operations on.}
           function getintregister(list:Taasmoutput;size:Tcgsize):Tregister;virtual;
@@ -558,7 +558,6 @@ implementation
 
     constructor tcg.create;
       begin
-        add_reg_instruction_hook:={$ifdef FPCPROCVAR}@{$endif}add_reg_instruction;
       end;
 
 
@@ -576,6 +575,22 @@ implementation
                                 register allocation
 ******************************************************************************}
 
+
+    procedure tcg.init_register_allocators;
+      begin
+        fillchar(rg,sizeof(rg),0);
+        add_reg_instruction_hook:={$ifdef FPCPROCVAR}@{$endif}add_reg_instruction;
+      end;
+
+
+    procedure tcg.done_register_allocators;
+      begin
+        { Safety }
+        fillchar(rg,sizeof(rg),0);
+        add_reg_instruction_hook:=nil;
+      end;
+
+
     function tcg.getintregister(list:Taasmoutput;size:Tcgsize):Tregister;
       begin
         if not assigned(rg[R_INTREGISTER]) then
@@ -661,7 +676,7 @@ implementation
         if assigned(rg[rt]) then
           result:=rg[rt].uses_registers
         else
-          internalerror(200310094);
+          result:=false;
       end;
 
 
@@ -2032,7 +2047,11 @@ finalization
 end.
 {
   $Log$
-  Revision 1.145  2003-12-26 13:19:16  florian
+  Revision 1.146  2003-12-26 14:02:30  peter
+    * sparc updates
+    * use registertype in spill_register
+
+  Revision 1.145  2003/12/26 13:19:16  florian
     * rtl and compiler compile with -Cfsse2
 
   Revision 1.144  2003/12/24 00:10:02  florian

+ 9 - 5
compiler/powerpc/aasmcpu.pas

@@ -80,7 +80,7 @@ uses
          procedure loadbool(opidx:longint;_b:boolean);
 
 
-         function is_nop: boolean; override;
+         function is_same_reg_move: boolean; override;
          function is_reg_move:boolean; override;
 
          { register spilling code }
@@ -346,11 +346,11 @@ uses cutils,rgobj;
 
 { ****************************** newra stuff *************************** }
 
-    function taicpu.is_nop: boolean;
+    function taicpu.is_same_reg_move: boolean;
       begin
         { we don't insert any more nops than necessary }
-        is_nop :=
-          ((opcode=A_MR) and (oper[0]^.typ=top_reg) and (oper[1]^.typ=top_reg) and (oper[0]^.reg=oper[1]^.reg));
+        result :=
+          ((opcode=A_MR) and (ops=2) and (oper[0]^.typ=top_reg) and (oper[1]^.typ=top_reg) and (oper[0]^.reg=oper[1]^.reg));
       end;
 
 
@@ -406,7 +406,11 @@ uses cutils,rgobj;
 end.
 {
   $Log$
-  Revision 1.21  2003-12-16 21:49:47  florian
+  Revision 1.22  2003-12-26 14:02:30  peter
+    * sparc updates
+    * use registertype in spill_register
+
+  Revision 1.21  2003/12/16 21:49:47  florian
     * fixed ppc compilation
 
   Revision 1.20  2003/12/06 22:16:13  jonas

+ 7 - 4
compiler/powerpc/cgcpu.pas

@@ -166,6 +166,7 @@ const
 
     procedure tcgppc.init_register_allocators;
       begin
+        inherited init_register_allocators;
         rg[R_INTREGISTER]:=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,
@@ -186,11 +187,9 @@ const
     procedure tcgppc.done_register_allocators;
       begin
         rg[R_INTREGISTER].free;
-        rg[R_INTREGISTER]:=nil;
         rg[R_FPUREGISTER].free;
-        rg[R_FPUREGISTER]:=nil;
         rg[R_MMREGISTER].free;
-        rg[R_MMREGISTER]:=nil;
+        inherited done_register_allocators;
       end;
 
 
@@ -2317,7 +2316,11 @@ begin
 end.
 {
   $Log$
-  Revision 1.149  2003-12-18 01:03:52  florian
+  Revision 1.150  2003-12-26 14:02:30  peter
+    * sparc updates
+    * use registertype in spill_register
+
+  Revision 1.149  2003/12/18 01:03:52  florian
     + register allocators are set to nil now after they are freed
 
   Revision 1.148  2003/12/16 21:49:47  florian

+ 5 - 22
compiler/procinfo.pas

@@ -96,10 +96,6 @@ unit procinfo;
           constructor create(aparent:tprocinfo);virtual;
           destructor destroy;override;
 
-          { Allocate framepointer so it can not be used by the
-            register allocator }
-{          procedure allocate_framepointer_reg;virtual;}
-
           procedure allocate_push_parasize(size:longint);virtual;
 
           function calc_stackframe_size:longint;virtual;
@@ -110,11 +106,6 @@ unit procinfo;
 
           { Generate parameter information }
           procedure generate_parameter_info;virtual;
-
-          { This procedure is called after the pass 1 of the subroutine body is done.
-            Here the address fix ups to generate code for the body must be done.
-          }
-          {procedure after_pass1;virtual;}
        end;
        tcprocinfo = class of tprocinfo;
 
@@ -159,18 +150,6 @@ implementation
          aktlocaldata.free;
       end;
 
-(*
-    procedure tprocinfo.allocate_framepointer_reg;
-      begin
-        if framepointer=NR_FRAME_POINTER_REG then
-          begin
-            { Make sure the register allocator won't allocate registers
-              into ebp }
-            include(rg.used_in_proc_int,RS_FRAME_POINTER_REG);
-            exclude(rg.unusedregsint,RS_FRAME_POINTER_REG);
-          end;
-      end;
-*)
 
     procedure tprocinfo.allocate_push_parasize(size:longint);
       begin
@@ -199,7 +178,11 @@ implementation
 end.
 {
   $Log$
-  Revision 1.10  2003-12-16 21:29:24  florian
+  Revision 1.11  2003-12-26 14:02:30  peter
+    * sparc updates
+    * use registertype in spill_register
+
+  Revision 1.10  2003/12/16 21:29:24  florian
     + inlined procedures inherit procinfo flags
 
   Revision 1.9  2003/12/03 23:13:20  peter

+ 7 - 2
compiler/rgobj.pas

@@ -1566,6 +1566,7 @@ implementation
               begin
                 aktfilepos:=Taicpu_abstract(p).fileinfo;
                 if Taicpu_abstract(p).spill_registers(list,
+                                                      regtype,
                                                       @getregisterinline,
                                                       @ungetregisterinline,
                                                       regs_to_spill_set,
@@ -1662,7 +1663,7 @@ implementation
 
                 { Maybe the operation can be removed when
                   it is a move and both arguments are the same }
-                if Taicpu_abstract(p).is_nop then
+                if Taicpu_abstract(p).is_same_reg_move then
                   begin
                     q:=Tai(p.next);
                     list.remove(p);
@@ -1680,7 +1681,11 @@ implementation
 end.
 {
   $Log$
-  Revision 1.108  2003-12-22 23:09:34  peter
+  Revision 1.109  2003-12-26 14:02:30  peter
+    * sparc updates
+    * use registertype in spill_register
+
+  Revision 1.108  2003/12/22 23:09:34  peter
     * only report unreleased imaginary registers
 
   Revision 1.107  2003/12/22 22:13:46  peter

+ 17 - 4
compiler/sparc/aasmcpu.pas

@@ -61,7 +61,8 @@ uses
          constructor op_sym_ofs(op : tasmop;_op1 : tasmsymbol;_op1ofs:longint);
 
          { register allocation }
-         function is_nop:boolean;override;
+         function is_reg_move:boolean;override;
+         function is_same_reg_move:boolean;override;
 
          { register spilling code }
          function spilling_get_operation_type(opnr: longint): topertype;override;
@@ -216,7 +217,16 @@ implementation
       end;
 
 
-    function taicpu.is_nop:boolean;
+    function taicpu.is_reg_move:boolean;
+      begin
+        result:=(opcode=A_MOV) and
+                (ops=2) and
+                (oper[0]^.typ=top_reg) and
+                (oper[1]^.typ=top_reg);
+      end;
+
+
+    function taicpu.is_same_reg_move:boolean;
       begin
         { Note: This should not check for A_NOP, because that is
           used for the delay slots }
@@ -229,7 +239,6 @@ implementation
 
 
     function taicpu.spilling_get_operation_type(opnr: longint): topertype;
-    {$WARNING ******Check taicpu.spilling_get_operation_type******}
       begin
         result := operand_read;
         case opcode of
@@ -344,7 +353,11 @@ implementation
 end.
 {
   $Log$
-  Revision 1.38  2003-12-19 14:38:03  mazen
+  Revision 1.39  2003-12-26 14:02:30  peter
+    * sparc updates
+    * use registertype in spill_register
+
+  Revision 1.38  2003/12/19 14:38:03  mazen
   * new TRegister definition applied
 
   Revision 1.37  2003/12/10 13:16:35  mazen

+ 13 - 112
compiler/sparc/cgcpu.pas

@@ -36,21 +36,11 @@ interface
     type
       TCgSparc=class(tcg)
       protected
-        rgint,
-        rgfpu  : trgcpu;
         function IsSimpleRef(const ref:treference):boolean;
      public
         procedure init_register_allocators;override;
         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;
-        procedure getexplicitregister(list:Taasmoutput;r:Tregister);override;
-        procedure ungetregister(list:Taasmoutput;r:Tregister);override;
-        procedure add_move_instruction(instr:Taicpu);override;
-        procedure allocexplicitregisters(list:Taasmoutput;rt:Tregistertype;r:Tcpuregisterset);override;
-        procedure deallocexplicitregisters(list:Taasmoutput;rt:Tregistertype;r:Tcpuregisterset);override;
-        function  uses_registers(rt:Tregistertype):boolean;override;
         { sparc special, needed by cg64 }
         procedure handle_load_store(list:taasmoutput;isstore:boolean;op: tasmop;reg:tregister;ref: treference);
         procedure handle_reg_const_reg(list:taasmoutput;op:Tasmop;src:tregister;a:aword;dst:tregister);
@@ -96,7 +86,6 @@ interface
         procedure g_save_all_registers(list : taasmoutput);override;
         procedure g_save_standard_registers(list : taasmoutput);override;
         procedure g_concatcopy(list:TAasmOutput;const source,dest:TReference;len:aword;delsource,loadref:boolean);override;
-        class function reg_cgsize(const reg:tregister):tcgsize;override;
       end;
 
       TCg64Sparc=class(tcg64f32)
@@ -233,11 +222,12 @@ implementation
 
     procedure Tcgsparc.init_register_allocators;
       begin
-        rgint:=Trgcpu.create(R_INTREGISTER,R_SUBWHOLE,
+        inherited init_register_allocators;
+        rg[R_INTREGISTER]:=Trgcpu.create(R_INTREGISTER,R_SUBWHOLE,
             [RS_O0,RS_O1,RS_O2,RS_O3,RS_O4,RS_O5,RS_O7,
              RS_L0,RS_L1,RS_L2,RS_L3,RS_L4,RS_L5,RS_L6,RS_L7],
             first_int_imreg,[]);
-        rgfpu:=trgcpu.create(R_FPUREGISTER,R_SUBNONE,
+        rg[R_FPUREGISTER]:=trgcpu.create(R_FPUREGISTER,R_SUBNONE,
             [RS_F0,RS_F1,RS_F2,RS_F3,RS_F4,RS_F5,RS_F6,RS_F7,
              RS_F8,RS_F9,RS_F10,RS_F11,RS_F12,RS_F13,RS_F14,RS_F15,
              RS_F16,RS_F17,RS_F18,RS_F19,RS_F20,RS_F21,RS_F22,RS_F23,
@@ -248,111 +238,18 @@ implementation
 
     procedure Tcgsparc.done_register_allocators;
       begin
-        rgint.free;
-        rgfpu.free;
-      end;
-
-
-    function tcgsparc.getintregister(list:Taasmoutput;size:Tcgsize):Tregister;
-      begin
-        result:=rgint.getregister(list,R_SUBWHOLE);
-      end;
-
-
-    function tcgsparc.getaddressregister(list:Taasmoutput):Tregister;
-      begin
-        result:=rgint.getregister(list,R_SUBWHOLE);
+        rg[R_INTREGISTER].free;
+        rg[R_FPUREGISTER].free;
+        inherited done_register_allocators;
       end;
 
 
     function tcgsparc.getfpuregister(list:Taasmoutput;size:Tcgsize):Tregister;
       begin
         if size=OS_F64 then
-          result:=rgfpu.getregister(list,R_SUBFD)
+          result:=rg[R_FPUREGISTER].getregister(list,R_SUBFD)
         else
-          result:=rgfpu.getregister(list,R_SUBWHOLE);
-      end;
-
-
-    procedure tcgsparc.getexplicitregister(list:Taasmoutput;r:Tregister);
-      begin
-        case getregtype(r) of
-          R_INTREGISTER :
-            rgint.getexplicitregister(list,r);
-          R_FPUREGISTER :
-            rgfpu.getexplicitregister(list,r);
-          else
-            internalerror(200310091);
-        end;
-      end;
-
-
-    procedure tcgsparc.ungetregister(list:Taasmoutput;r:Tregister);
-      begin
-        case getregtype(r) of
-          R_INTREGISTER :
-            rgint.ungetregister(list,r);
-          R_FPUREGISTER :
-            rgfpu.ungetregister(list,r);
-          else
-            internalerror(200310091);
-        end;
-      end;
-
-
-    procedure tcgsparc.allocexplicitregisters(list:Taasmoutput;rt:Tregistertype;r:Tcpuregisterset);
-      begin
-        case rt of
-          R_INTREGISTER :
-            rgint.allocexplicitregisters(list,r);
-          R_FPUREGISTER :
-            rgfpu.allocexplicitregisters(list,r);
-          R_MMREGISTER :;
-          else
-            internalerror(200310092);
-        end;
-      end;
-
-
-    procedure tcgsparc.deallocexplicitregisters(list:Taasmoutput;rt:Tregistertype;r:Tcpuregisterset);
-      begin
-        case rt of
-          R_INTREGISTER :
-            rgint.deallocexplicitregisters(list,r);
-          R_FPUREGISTER :
-            rgfpu.deallocexplicitregisters(list,r);
-          R_MMREGISTER :;
-          else
-            internalerror(200310093);
-        end;
-      end;
-
-
-
-    function  TCgSparc.uses_registers(rt:Tregistertype):boolean;
-      begin
-        case rt of
-          R_INTREGISTER :
-            result:=rgint.uses_registers;
-          R_MMREGISTER  :
-            result:=false;
-          R_FPUREGISTER :
-            result:=rgfpu.uses_registers;
-          else
-            internalerror(2003120900);
-        end;
-      end;
-
-
-    procedure tcgsparc.add_move_instruction(instr:Taicpu);
-      begin
-        rgint.add_move_instruction(instr);
-      end;
-
-
-    function TCgSparc.reg_cgsize(const reg:tregister):tcgsize;
-      begin
-        result:=OS_32;
+          result:=rg[R_FPUREGISTER].getregister(list,R_SUBWHOLE);
       end;
 
 
@@ -1212,7 +1109,11 @@ begin
 end.
 {
   $Log$
-  Revision 1.74  2003-12-19 14:38:03  mazen
+  Revision 1.75  2003-12-26 14:02:30  peter
+    * sparc updates
+    * use registertype in spill_register
+
+  Revision 1.74  2003/12/19 14:38:03  mazen
   * new TRegister definition applied
 
   Revision 1.73  2003/12/09 09:44:22  mazen

+ 6 - 1
compiler/sparc/racpugas.pas

@@ -124,6 +124,7 @@ Interface
         regs : byte;
         hasimm : boolean;
       begin
+        oper.initref;
         regs:=0;
         hasimm:=false;
         Consume(AS_LBRACKET);
@@ -621,7 +622,11 @@ initialization
 end.
 {
   $Log$
-  Revision 1.3  2003-12-25 01:25:43  peter
+  Revision 1.4  2003-12-26 14:02:30  peter
+    * sparc updates
+    * use registertype in spill_register
+
+  Revision 1.3  2003/12/25 01:25:43  peter
     * sparc assembler reader updates
 
   Revision 1.2  2003/12/10 13:16:36  mazen

+ 28 - 26
compiler/x86/aasmcpu.pas

@@ -200,9 +200,10 @@ interface
          function  Pass1(offset:longint):longint;virtual;
          procedure Pass2(sec:TAsmObjectdata);virtual;
          procedure SetOperandOrder(order:TOperandOrder);
-         function is_nop:boolean;override;
+         function is_same_reg_move:boolean;override;
          function is_reg_move:boolean;override;
          function spill_registers(list:Taasmoutput;
+                                  rt:Tregistertype;
                                   rgget:Trggetproc;
                                   rgunget:Trgungetproc;
                                   const r:Tsuperregisterset;
@@ -1909,34 +1910,31 @@ implementation
       end;
 {$endif NOAG386BIN}
 
-    function Taicpu.is_nop:boolean;
 
-    begin
-      {We do not check the number of operands; we assume that nobody constructs
-       a mov or xchg instruction with less than 2 operands. (DM)}
-      is_nop:=(opcode=A_NOP) or
-              (opcode=A_MOV) and (oper[0]^.typ=top_reg) and (oper[1]^.typ=top_reg) and (oper[0]^.reg=oper[1]^.reg) or
-              (opcode=A_XCHG) and (oper[0]^.typ=top_reg) and (oper[1]^.typ=top_reg) and (oper[0]^.reg=oper[1]^.reg);
-    end;
+    function Taicpu.is_same_reg_move:boolean;
+      begin
+        result:=(ops=2) and
+                (oper[0]^.typ=top_reg) and
+                (oper[1]^.typ=top_reg) and
+                (oper[0]^.reg=oper[1]^.reg) and
+                ((opcode=A_MOV) or (opcode=A_XCHG));
+      end;
 
-    function Taicpu.is_reg_move:boolean;
 
-    begin
-      {We do not check the number of operands; we assume that nobody constructs
-       a mov, movzx or movsx instruction with less than 2 operands. Note that
-       a move between a reference and a register is not a move that is of
-       interrest to the register allocation, therefore we only return true
-       for a move between two registers. (DM)}
-      result:=((opcode=A_MOV) or (opcode=A_MOVZX) or (opcode=A_MOVSX)) and
-        ((oper[0]^.typ=top_reg) and (oper[1]^.typ=top_reg));
-    end;
+    function Taicpu.is_reg_move:boolean;
+      begin
+        result:=(ops=2) and
+                (oper[0]^.typ=top_reg) and
+                (oper[1]^.typ=top_reg) and
+                ((opcode=A_MOV) or (opcode=A_MOVZX) or (opcode=A_MOVSX));
+      end;
 
 
     function Taicpu.spill_registers(list:Taasmoutput;
+                                    rt:Tregistertype;
                                     rgget:Trggetproc;
                                     rgunget:Trgungetproc;
                                     const r:Tsuperregisterset;
-{                                    var unusedregsint:Tsuperregisterset;}
                                     var live_registers_int:Tsuperregisterworklist;
                                     const spilltemplist:Tspill_temp_list):boolean;
 
@@ -1966,7 +1964,7 @@ implementation
         1:
           begin
             if (oper[0]^.typ=top_reg) and
-               (getregtype(oper[0]^.reg)=R_INTREGISTER) then
+               (getregtype(oper[0]^.reg)=rt) then
               begin
                 supreg:=getsupreg(oper[0]^.reg);
                 if supregset_in(r,supreg) then
@@ -2103,7 +2101,7 @@ implementation
                     end;
                 end;
             if (oper[0]^.typ=top_reg) and
-               (getregtype(oper[0]^.reg)=R_INTREGISTER) then
+               (getregtype(oper[0]^.reg)=rt) then
               begin
                 supreg:=getsupreg(oper[0]^.reg);
                 subreg:=getsubreg(oper[0]^.reg);
@@ -2145,7 +2143,7 @@ implementation
                     end;
               end;
             if (oper[1]^.typ=top_reg) and
-               (getregtype(oper[1]^.reg)=R_INTREGISTER) then
+               (getregtype(oper[1]^.reg)=rt) then
               begin
                 supreg:=getsupreg(oper[1]^.reg);
                 subreg:=getsubreg(oper[1]^.reg);
@@ -2227,7 +2225,7 @@ implementation
                (
                 (oper[0]^.typ=top_const) or
                 ((oper[0]^.typ=top_reg) and
-                 (getregtype(oper[0]^.reg)=R_INTREGISTER))
+                 (getregtype(oper[0]^.reg)=rt))
                ) then
               begin
                 case opcode of
@@ -2269,7 +2267,7 @@ implementation
               some opcodes do not support a memory location as source }
             if (oper[0]^.typ=top_ref) and
                (oper[1]^.typ=top_reg) and
-               (getregtype(oper[1]^.reg)=R_INTREGISTER) then
+               (getregtype(oper[1]^.reg)=rt) then
               begin
                 case opcode of
                   A_BT,A_BTS,
@@ -2359,7 +2357,11 @@ implementation
 end.
 {
   $Log$
-  Revision 1.42  2003-12-25 12:01:35  florian
+  Revision 1.43  2003-12-26 14:02:30  peter
+    * sparc updates
+    * use registertype in spill_register
+
+  Revision 1.42  2003/12/25 12:01:35  florian
     + possible sse2 unit usage for double calculations
     * some sse2 assembler issues fixed
 

+ 7 - 4
compiler/x86/cgx86.pas

@@ -189,6 +189,7 @@ unit cgx86;
 
     procedure Tcgx86.init_register_allocators;
       begin
+        inherited init_register_allocators;
         if cs_create_pic in aktmoduleswitches then
           rg[R_INTREGISTER]:=trgcpu.create(R_INTREGISTER,R_SUBWHOLE,[RS_EAX,RS_EDX,RS_ECX,RS_ESI,RS_EDI],first_int_imreg,[RS_EBP,RS_EBX])
         else
@@ -202,12 +203,10 @@ unit cgx86;
     procedure Tcgx86.done_register_allocators;
       begin
         rg[R_INTREGISTER].free;
-        rg[R_INTREGISTER]:=nil;
         rg[R_MMREGISTER].free;
-        rg[R_MMREGISTER]:=nil;
         rg[R_MMXREGISTER].free;
-        rg[R_MMXREGISTER]:=nil;
         rgfpu.free;
+        inherited done_register_allocators;
       end;
 
 
@@ -1921,7 +1920,11 @@ unit cgx86;
 end.
 {
   $Log$
-  Revision 1.99  2003-12-26 13:19:16  florian
+  Revision 1.100  2003-12-26 14:02:30  peter
+    * sparc updates
+    * use registertype in spill_register
+
+  Revision 1.99  2003/12/26 13:19:16  florian
     * rtl and compiler compile with -Cfsse2
 
   Revision 1.98  2003/12/26 00:32:22  florian