Browse Source

* use stmw/lmw when saving/restoring a lot of registers, to reduce generated
code size and thus instruction cache pressure.

git-svn-id: trunk@1785 -

Jonas Maebe 19 years ago
parent
commit
cc44a19af5
1 changed files with 28 additions and 4 deletions
  1. 28 4
      compiler/powerpc/cgcpu.pas

+ 28 - 4
compiler/powerpc/cgcpu.pas

@@ -1197,8 +1197,20 @@ const
                 if regcounter2 in rg[R_INTREGISTER].used_in_proc then
                   begin
                      usesgpr:=true;
-                     a_load_reg_ref(list,OS_INT,OS_INT,newreg(R_INTREGISTER,regcounter2,R_SUBNONE),href);
-                     dec(href.offset,4);
+                     if (regcounter2 <= RS_R22) or
+                        ((cs_littlesize in aktglobalswitches) and
+                         { with RS_R30 it's also already smaller, but too big a speed trade-off to make }
+                         (regcounter2 <= RS_R29)) then
+                       begin
+                         dec(href.offset,(RS_R31-regcounter2+1)*sizeof(aint));
+                         list.concat(taicpu.op_reg_ref(A_STMW,newreg(R_INTREGISTER,regcounter2,R_SUBNONE),href));
+                         break;
+                       end
+                     else
+                       begin
+                         a_load_reg_ref(list,OS_INT,OS_INT,newreg(R_INTREGISTER,regcounter2,R_SUBNONE),href);
+                         dec(href.offset,4);
+                       end;
                   end;
               end;
 {
@@ -1338,8 +1350,20 @@ const
                 if regcounter2 in rg[R_INTREGISTER].used_in_proc then
                   begin
                      usesgpr:=true;
-                     a_load_ref_reg(list,OS_INT,OS_INT,href,newreg(R_INTREGISTER,regcounter2,R_SUBNONE));
-                     dec(href.offset,4);
+                     if (regcounter2 <= RS_R22) or
+                        ((cs_littlesize in aktglobalswitches) and
+                         { with RS_R30 it's also already smaller, but too big a speed trade-off to make }
+                         (regcounter2 <= RS_R29)) then
+                       begin
+                         dec(href.offset,(RS_R31-regcounter2+1)*sizeof(aint));
+                         list.concat(taicpu.op_reg_ref(A_LMW,newreg(R_INTREGISTER,regcounter2,R_SUBNONE),href));
+                         break;
+                       end
+                     else
+                       begin
+                         a_load_ref_reg(list,OS_INT,OS_INT,href,newreg(R_INTREGISTER,regcounter2,R_SUBNONE));
+                         dec(href.offset,4);
+                       end;
                   end;
               end;