Jelajahi Sumber

* save standard registers moved to tcgobj

peter 21 tahun lalu
induk
melakukan
d19663f3a8

+ 58 - 4
compiler/cgobj.pas

@@ -409,14 +409,14 @@ unit cgobj;
 
              @param(usedinproc Registers which are used in the code of this routine)
           }
-          procedure g_save_standard_registers(list:Taasmoutput);virtual;abstract;
+          procedure g_save_standard_registers(list:Taasmoutput);virtual;
           {# This routine is called when generating the code for the exit point
              of a routine. It should restore all registers which were previously
              saved in @var(g_save_standard_registers).
 
              @param(usedinproc Registers which are used in the code of this routine)
           }
-          procedure g_restore_standard_registers(list:Taasmoutput);virtual;abstract;
+          procedure g_restore_standard_registers(list:Taasmoutput);virtual;
        end;
 
 {$ifndef cpu64bit}
@@ -500,7 +500,7 @@ implementation
     uses
        globals,options,systems,
        verbose,defutil,paramgr,
-       tgobj,cutils,
+       tgobj,cutils,procinfo,
        cgutils;
 
     const
@@ -1916,6 +1916,57 @@ implementation
       end;
 
 
+    procedure tcg.g_save_standard_registers(list:Taasmoutput);
+      var
+        href : treference;
+        size : longint;
+        r : integer;
+      begin
+        { Get temp }
+        size:=0;
+        for r:=low(saved_standard_registers) to high(saved_standard_registers) do
+          if saved_standard_registers[r] in rg[R_INTREGISTER].used_in_proc then
+            inc(size,sizeof(aint));
+        if size>0 then
+          begin
+            tg.GetTemp(list,size,tt_noreuse,current_procinfo.save_regs_ref);
+            { Copy registers to temp }
+            href:=current_procinfo.save_regs_ref;
+
+            for r:=low(saved_standard_registers) to high(saved_standard_registers) do
+              begin
+                if saved_standard_registers[r] in rg[R_INTREGISTER].used_in_proc then
+                  begin
+                    a_load_reg_ref(list,OS_ADDR,OS_ADDR,newreg(R_INTREGISTER,saved_standard_registers[r],R_SUBWHOLE),href);
+                    inc(href.offset,sizeof(aint));
+                  end;
+                include(rg[R_INTREGISTER].preserved_by_proc,saved_standard_registers[r]);
+              end;
+          end;
+      end;
+
+
+    procedure tcg.g_restore_standard_registers(list:Taasmoutput);
+      var
+        href : treference;
+        r : integer;
+        hreg : tregister;
+      begin
+        { Copy registers from temp }
+        href:=current_procinfo.save_regs_ref;
+        for r:=low(saved_standard_registers) to high(saved_standard_registers) do
+          if saved_standard_registers[r] in rg[R_INTREGISTER].used_in_proc then
+            begin
+              hreg:=newreg(R_INTREGISTER,saved_standard_registers[r],R_SUBWHOLE);
+              { Allocate register so the optimizer does remove the load }
+              a_reg_alloc(list,hreg);
+              a_load_ref_reg(list,OS_ADDR,OS_ADDR,href,hreg);
+              inc(href.offset,sizeof(aint));
+            end;
+        tg.UnGetTemp(list,current_procinfo.save_regs_ref);
+      end;
+
+
     procedure tcg.g_profilecode(list : taasmoutput);
       begin
       end;
@@ -2027,7 +2078,10 @@ finalization
 end.
 {
   $Log$
-  Revision 1.181  2004-10-24 20:01:08  peter
+  Revision 1.182  2004-10-25 15:36:47  peter
+    * save standard registers moved to tcgobj
+
+  Revision 1.181  2004/10/24 20:01:08  peter
     * remove saveregister calling convention
 
   Revision 1.180  2004/10/24 11:44:28  peter

+ 21 - 22
compiler/powerpc/cpubase.pas

@@ -309,23 +309,13 @@ uses
                 1 : (register,registerhigh : tregister);
                 { overlay a registerlow }
                 2 : (registerlow : tregister);
+{$ifndef cpu64bit}
                 { overlay a 64 Bit register type }
-                3 : (reg64 : tregister64);
-                4 : (register64 : tregister64);
+                3 : (register64 : tregister64);
+{$endif cpu64bit}
             );
       end;
 
-      treglocation = packed record
-        case longint of
-          1 : (register,registerhigh : tregister);
-          { overlay a registerlow }
-          2 : (registerlow : tregister);
-          { overlay a 64 Bit register type }
-          3 : (reg64 : tregister64);
-          4 : (register64 : tregister64);
-       end;
-
-
       tlocation = packed record
          size : TCGSize;
          loc : tcgloc;
@@ -333,19 +323,21 @@ uses
             LOC_CREFERENCE,LOC_REFERENCE : (reference : treference);
             LOC_CONSTANT : (
               case longint of
-{$ifdef FPC_BIG_ENDIAN}
-                1 : (_valuedummy,value : AWord);
-{$else FPC_BIG_ENDIAN}
-                1 : (value : AWord);
-{$endif FPC_BIG_ENDIAN}
-                2 : (value64 : int64);
+                1 : (value : AInt);
+                { can't do this, this layout depends on the host cpu. Use }
+                { lo(valueqword)/hi(valueqword) instead (JM)              }
+                { overlay a complete 64 Bit value }
+                2 : (value64 : Int64);
               );
             LOC_FPUREGISTER, LOC_CFPUREGISTER, LOC_MMREGISTER, LOC_CMMREGISTER,
               LOC_REGISTER,LOC_CREGISTER : (
                 case longint of
                   1 : (registerlow,registerhigh : tregister);
                   2 : (register : tregister);
-                  4 : (register64 : tregister64);
+{$ifndef cpu64bit}
+                  { overlay a 64 Bit register type }
+                  3 : (register64 : tregister64);
+{$endif cpu64bit}
                 );
             LOC_FLAGS : (resflags : tresflags);
       end;
@@ -444,7 +436,11 @@ uses
          This value can be deduced from CALLED_USED_REGISTERS array in the
          GCC source.
       }
-      std_saved_registers = [RS_R13..RS_R29];
+      saved_standard_registers : array[0..16] of tsuperregister = (
+        RS_R13,RS_R14,RS_R15,RS_R16,RS_R17,RS_R18,RS_R19,
+        RS_R20,RS_R21,RS_R22,RS_R23,RS_R24,RS_R25,RS_R26,RS_R27,RS_R28,RS_R29
+      );
+
       {# Required parameter alignment when calling a routine declared as
          stdcall and cdecl. The alignment value should be the one defined
          by GCC or the target ABI.
@@ -641,7 +637,10 @@ implementation
 end.
 {
   $Log$
-  Revision 1.89  2004-06-20 08:55:32  florian
+  Revision 1.90  2004-10-25 15:36:47  peter
+    * save standard registers moved to tcgobj
+
+  Revision 1.89  2004/06/20 08:55:32  florian
     * logs truncated
 
   Revision 1.88  2004/06/17 16:55:46  peter

+ 22 - 19
compiler/powerpc/nppcadd.pas

@@ -215,7 +215,7 @@ interface
                 useconst := false;
                 tmpreg := cg.getintregister(exprasmlist,OS_INT);
                 cg.a_load_const_reg(exprasmlist,OS_INT,
-                  aword(right.location.value),tmpreg);
+                    right.location.value,tmpreg);
                end
           end
         else
@@ -361,7 +361,7 @@ interface
                       location.register)
                   else
                     cg.a_op_const_reg_reg(exprasmlist,cgop,OS_INT,
-                      aword(right.location.value),left.location.register,
+                      right.location.value,left.location.register,
                       location.register);
                 end;
             end;
@@ -524,7 +524,7 @@ interface
                    internalerror(43244);
                   if (right.location.loc = LOC_CONSTANT) then
                     cg.a_op_const_reg_reg(exprasmlist,OP_OR,OS_INT,
-                      aword(1 shl aword(right.location.value)),
+                      1 shl right.location.value,
                       left.location.register,location.register)
                   else
                     begin
@@ -537,7 +537,7 @@ interface
                           left.location.register,location.register)
                       else
                         cg.a_op_const_reg_reg(exprasmlist,OP_OR,OS_INT,
-                          aword(left.location.value),tmpreg,location.register);
+                          left.location.value,tmpreg,location.register);
                     end;
                   opdone := true;
                 end
@@ -569,7 +569,7 @@ interface
                     begin
                       tmpreg := cg.getintregister(exprasmlist,OS_INT);
                       cg.a_load_const_reg(exprasmlist,OS_INT,
-                        aword(left.location.value),tmpreg);
+                        left.location.value,tmpreg);
                       exprasmlist.concat(taicpu.op_reg_reg_reg(A_ANDC,
                         location.register,tmpreg,right.location.register));
                     end
@@ -607,7 +607,7 @@ interface
                   if right.location.loc = LOC_CONSTANT then
                     begin
                       cg.a_load_const_reg(exprasmlist,OS_INT,
-                        aword(right.location.value),tmpreg);
+                        right.location.value,tmpreg);
                       exprasmlist.concat(taicpu.op_reg_reg_reg(A_ANDC_,tmpreg,
                         tmpreg,left.location.register));
                     end
@@ -630,7 +630,7 @@ interface
               swapleftright;
             if (right.location.loc = LOC_CONSTANT) then
               cg.a_op_const_reg_reg(exprasmlist,cgop,OS_INT,
-                aword(right.location.value),left.location.register,
+                right.location.value,left.location.register,
                 location.register)
             else
               cg.a_op_reg_reg_reg(exprasmlist,cgop,OS_INT,
@@ -839,7 +839,7 @@ interface
                         end
                       else
                         begin
-                          if (aword(right.location.value64) <> 0) then
+                          if (aint(right.location.value64) <> 0) then
                             tempreg64.reglo := cg.getintregister(exprasmlist,OS_32)
                           else
                             tempreg64.reglo := left.location.registerlow;
@@ -849,28 +849,28 @@ interface
                             tempreg64.reghi := left.location.registerhigh;
                         end;
 
-                      if (aword(right.location.value64) <> 0) then
+                      if (aint(right.location.value64) <> 0) then
                         { negative values can be handled using SUB, }
                         { positive values < 65535 using XOR.        }
                         if (longint(right.location.value64) >= -32767) and
                            (longint(right.location.value64) < 0) then
                           cg.a_op_const_reg_reg(exprasmlist,OP_SUB,OS_INT,
-                            aword(right.location.value64),
+                            aint(right.location.value64),
                             left.location.registerlow,tempreg64.reglo)
                         else
                           cg.a_op_const_reg_reg(exprasmlist,OP_XOR,OS_INT,
-                            aword(right.location.value64),
+                            aint(right.location.value64),
                             left.location.registerlow,tempreg64.reglo);
 
                       if ((right.location.value64 shr 32) <> 0) then
                         if (longint(right.location.value64 shr 32) >= -32767) and
                            (longint(right.location.value64 shr 32) < 0) then
                           cg.a_op_const_reg_reg(exprasmlist,OP_SUB,OS_INT,
-                            aword(right.location.value64 shr 32),
+                            aint(right.location.value64 shr 32),
                             left.location.registerhigh,tempreg64.reghi)
                         else
                           cg.a_op_const_reg_reg(exprasmlist,OP_XOR,OS_INT,
-                            aword(right.location.value64 shr 32),
+                            aint(right.location.value64 shr 32),
                             left.location.registerhigh,tempreg64.reghi);
                     end
                   else
@@ -943,7 +943,7 @@ interface
                           // consts16 - reg64
                           exprasmlist.concat(taicpu.op_reg_reg_const(A_SUBFIC,
                             location.registerlow,right.location.registerlow,
-                            aword(left.location.value)));
+                            left.location.value));
                         end
                       else
                         begin
@@ -957,7 +957,7 @@ interface
                       exprasmlist.concat(taicpu.op_reg_reg(A_SUBFZE,
                         location.registerhigh,right.location.registerhigh));
                     end
-                  else if (aword(left.location.value64) = 0) then
+                  else if (aint(left.location.value64) = 0) then
                     begin
                       // (const32 shl 32) - reg64
                       if (location.registerlow = NR_NO) then
@@ -1359,7 +1359,7 @@ interface
                        location.register)
                    else
                      cg.a_op_const_reg_reg(exprasmlist,cgop,OS_INT,
-                       aword(right.location.value),left.location.register,
+                       right.location.value,left.location.register,
                      location.register);
                  end;
                subn:
@@ -1373,7 +1373,7 @@ interface
                          location.register)
                      else
                        cg.a_op_const_reg_reg(exprasmlist,OP_SUB,OS_INT,
-                         aword(right.location.value),left.location.register,
+                         right.location.value,left.location.register,
                          location.register)
                    else
                      if (longint(left.location.value) >= low(smallint)) and
@@ -1387,7 +1387,7 @@ interface
                        begin
                          tmpreg := cg.getintregister(exprasmlist,OS_INT);
                          cg.a_load_const_reg(exprasmlist,OS_INT,
-                           aword(left.location.value),tmpreg);
+                           left.location.value,tmpreg);
                          cg.a_op_reg_reg_reg(exprasmlist,OP_SUB,OS_INT,
                            right.location.register,tmpreg,location.register);
                        end;
@@ -1458,7 +1458,10 @@ begin
 end.
 {
   $Log$
-  Revision 1.49  2004-09-25 14:23:54  peter
+  Revision 1.50  2004-10-25 15:36:47  peter
+    * save standard registers moved to tcgobj
+
+  Revision 1.49  2004/09/25 14:23:54  peter
     * ungetregister is now only used for cpuregisters, renamed to
       ungetcpuregister
     * renamed (get|unget)explicitregister(s) to ..cpuregister

+ 6 - 3
compiler/powerpc/nppcmat.pas

@@ -126,7 +126,7 @@ implementation
              { n = -13, (0xFFFF_FFF3), and k = 2, after executing the srawi  }
              { instruction, q = -4 (0xFFFF_FFFC) and CA = 1. After executing }
              { the addze instruction, q = -3, the correct quotient.          }
-             cg.a_op_const_reg_reg(exprasmlist,OP_SAR,OS_32,aword(power),
+             cg.a_op_const_reg_reg(exprasmlist,OP_SAR,OS_32,power,
                numerator,resultreg);
              exprasmlist.concat(taicpu.op_reg_reg(A_ADDZE,resultreg,resultreg));
            end
@@ -187,7 +187,7 @@ implementation
          hregisterhigh,hregisterlow : tregister;
          op : topcg;
          asmop1, asmop2: tasmop;
-         shiftval: aword;
+         shiftval: aint;
          r : Tregister;
 
       begin
@@ -521,7 +521,10 @@ begin
 end.
 {
   $Log$
-  Revision 1.40  2004-09-25 14:23:55  peter
+  Revision 1.41  2004-10-25 15:36:47  peter
+    * save standard registers moved to tcgobj
+
+  Revision 1.40  2004/09/25 14:23:55  peter
     * ungetregister is now only used for cpuregisters, renamed to
       ungetcpuregister
     * renamed (get|unget)explicitregister(s) to ..cpuregister

+ 5 - 2
compiler/powerpc/nppcset.pas

@@ -78,7 +78,7 @@ implementation
             else
               begin
                 tmpreg := cg.getintregister(exprasmlist,OS_INT);
-                 cg.a_load_const_reg(exprasmlist,OS_INT,aword(value),tmpreg);
+                 cg.a_load_const_reg(exprasmlist,OS_INT,value,tmpreg);
                 exprasmlist.concat(taicpu.op_reg_reg_reg(A_ADD_,hregister,
                   hregister,tmpreg));
               end;
@@ -156,7 +156,10 @@ begin
 end.
 {
   $Log$
-  Revision 1.15  2004-09-25 14:23:55  peter
+  Revision 1.16  2004-10-25 15:36:47  peter
+    * save standard registers moved to tcgobj
+
+  Revision 1.15  2004/09/25 14:23:55  peter
     * ungetregister is now only used for cpuregisters, renamed to
       ungetcpuregister
     * renamed (get|unget)explicitregister(s) to ..cpuregister

+ 4 - 54
compiler/x86/cgx86.pas

@@ -109,8 +109,6 @@ unit cgx86;
         procedure g_profilecode(list : taasmoutput);override;
         procedure g_stackpointer_alloc(list : taasmoutput;localsize : longint);override;
         procedure g_proc_entry(list : taasmoutput;localsize : longint;nostackframe:boolean);override;
-        procedure g_save_standard_registers(list:Taasmoutput);override;
-        procedure g_restore_standard_registers(list:Taasmoutput);override;
 
         procedure g_overflowcheck(list: taasmoutput; const l:tlocation;def:tdef);override;
 
@@ -1599,57 +1597,6 @@ unit cgx86;
       end;
 
 
-    procedure tcgx86.g_save_standard_registers(list:Taasmoutput);
-      var
-        href : treference;
-        size : longint;
-        r : integer;
-      begin
-        { Get temp }
-        size:=0;
-        for r:=low(saved_standard_registers) to high(saved_standard_registers) do
-          if saved_standard_registers[r] in rg[R_INTREGISTER].used_in_proc then
-            inc(size,sizeof(aint));
-        if size>0 then
-          begin
-            tg.GetTemp(list,size,tt_noreuse,current_procinfo.save_regs_ref);
-            { Copy registers to temp }
-            href:=current_procinfo.save_regs_ref;
-
-            for r:=low(saved_standard_registers) to high(saved_standard_registers) do
-              begin
-                if saved_standard_registers[r] in rg[R_INTREGISTER].used_in_proc then
-                  begin
-                    a_load_reg_ref(list,OS_ADDR,OS_ADDR,newreg(R_INTREGISTER,saved_standard_registers[r],R_SUBWHOLE),href);
-                    inc(href.offset,sizeof(aint));
-                  end;
-                include(rg[R_INTREGISTER].preserved_by_proc,saved_standard_registers[r]);
-              end;
-          end;
-      end;
-
-
-    procedure tcgx86.g_restore_standard_registers(list:Taasmoutput);
-      var
-        href : treference;
-        r : integer;
-        hreg : tregister;
-      begin
-        { Copy registers from temp }
-        href:=current_procinfo.save_regs_ref;
-        for r:=low(saved_standard_registers) to high(saved_standard_registers) do
-          if saved_standard_registers[r] in rg[R_INTREGISTER].used_in_proc then
-            begin
-              hreg:=newreg(R_INTREGISTER,saved_standard_registers[r],R_SUBWHOLE);
-              { Allocate register so the optimizer does remove the load }
-              a_reg_alloc(list,hreg);
-              a_load_ref_reg(list,OS_ADDR,OS_ADDR,href,hreg);
-              inc(href.offset,sizeof(aint));
-            end;
-        tg.UnGetTemp(list,current_procinfo.save_regs_ref);
-      end;
-
-
     { produces if necessary overflowcode }
     procedure tcgx86.g_overflowcheck(list: taasmoutput; const l:tlocation;def:tdef);
       var
@@ -1680,7 +1627,10 @@ unit cgx86;
 end.
 {
   $Log$
-  Revision 1.131  2004-10-24 20:10:08  peter
+  Revision 1.132  2004-10-25 15:36:47  peter
+    * save standard registers moved to tcgobj
+
+  Revision 1.131  2004/10/24 20:10:08  peter
     * -Or fixes
 
   Revision 1.130  2004/10/24 11:44:28  peter

+ 5 - 3
compiler/x86/cpubase.pas

@@ -310,8 +310,7 @@ uses
                 { overlay a registerlow }
                 2 : (registerlow : tregister);
                 { overlay a 64 Bit register type }
-                3 : (reg64 : tregister64);
-                4 : (register64 : tregister64);
+                3 : (register64 : tregister64);
               );
             { it's only for better handling }
             LOC_MMXREGISTER,LOC_CMMXREGISTER : (mmxreg : tregister);
@@ -540,7 +539,10 @@ implementation
 end.
 {
   $Log$
-  Revision 1.47  2004-10-15 09:22:23  mazen
+  Revision 1.48  2004-10-25 15:36:47  peter
+    * save standard registers moved to tcgobj
+
+  Revision 1.47  2004/10/15 09:22:23  mazen
   - remove $IFDEF DELPHI and related code
   - remove $IFDEF FPCPROCVAR and related code