ソースを参照

* remove a number of superfluous register moves

git-svn-id: trunk@1377 -
Jonas Maebe 20 年 前
コミット
9cf0865d0e
1 ファイル変更68 行追加2 行削除
  1. 68 2
      compiler/powerpc/aoptcpu.pas

+ 68 - 2
compiler/powerpc/aoptcpu.pas

@@ -44,6 +44,55 @@ Implementation
   uses
     cutils, aasmcpu, cgbase;
 
+const
+  calculation_target_op0: array[tasmop] of tasmop = (a_none,
+    a_add, a_add_, a_addo, a_addo_, a_addc, a_addc_, a_addco, a_addco_,
+    a_adde, a_adde_, a_addeo, a_addeo_, a_addi, a_addic, a_addic_, a_addis,
+    a_addme, a_addme_, a_addmeo, a_addmeo_, a_addze, a_addze_, a_addzeo,
+    a_addzeo_, a_and, a_and_, a_andc, a_andc_, a_andi_, a_andis_, a_none,
+    a_none, a_none, a_none, a_none, a_none, a_none, a_none, a_none, a_none, a_none,
+    a_none, a_none, a_none, a_none, a_none, a_cntlzw, a_cntlzw_, a_none,
+    a_none, a_none, a_none, a_none, a_none, a_none, a_none, a_none,
+    a_none, a_none, a_none, a_none, a_none, a_none, a_divw, a_divw_, a_divwo, a_divwo_,
+    a_divwu, a_divwu_, a_divwuo, a_divwuo_, a_none, a_none, a_none, a_eqv,
+    a_eqv_, a_extsb, a_extsb_, a_extsh, a_extsh_, a_fabs, a_fabs_, a_fadd,
+    a_fadd_, a_fadds, a_fadds_, a_none, a_none, a_none, a_none, a_none,
+    a_none, a_fdiv, a_fdiv_, a_fdivs, a_fdivs_, a_fmadd, a_fmadd_, a_fmadds,
+    a_fmadds_, a_none, a_fmsub, a_fmsub_, a_fmsubs, a_fmsubs_, a_fmul, a_fmul_,
+    a_fmuls, a_fmuls_, a_fnabs, a_fnabs_, a_fneg, a_fneg_, a_fnmadd,
+    a_fnmadd_, a_fnmadds, a_fnmadds_, a_fnmsub, a_fnmsub_, a_fnmsubs,
+    a_fnmsubs_, a_fres, a_fres_, a_frsp, a_frsp_, a_frsqrte, a_frsqrte_,
+    a_none, a_none, a_fsqrt, a_fsqrt_, a_fsqrts, a_fsqrts_, a_fsub, a_fsub_,
+    a_fsubs, a_fsubs_, a_none, a_none, a_none, a_none, a_none, a_none,
+    a_none, a_none, a_none, a_none, a_none, a_none, a_none, a_none, a_none,
+    a_none, a_none, a_none, a_none, a_none, a_none, a_none, a_none, a_none,
+    a_none, a_none, a_none, a_none, a_none, a_none, a_none, a_none, a_none,
+    a_none, a_none, a_none, a_none, a_none, a_none, a_none, a_none,
+    a_none, a_none, a_none, a_none, a_none, a_none, a_none,
+    a_none, a_none, a_none, a_none, a_none, a_none, a_mulhw,
+    a_mulhw_, a_mulhwu, a_mulhwu_, a_mulli, a_mullw, a_mullw_, a_mullwo,
+    a_mullwo_, a_nand, a_nand_, a_neg, a_neg_, a_nego, a_nego_, a_nor, a_nor_,
+    a_or, a_or_, a_orc, a_orc_, a_ori, a_oris, a_rfi, a_rlwimi, a_rlwimi_,
+    a_rlwinm, a_rlwinm_, a_rlwnm, a_rlwnm_, a_none, a_slw, a_slw_, a_sraw, a_sraw_,
+    a_srawi, a_srawi_,a_srw, a_srw_, a_stb, a_none, a_none, a_none, a_none,
+    a_none, a_none, a_none, a_none, a_none, a_none, a_none, a_none,
+    a_none, a_none, a_none, a_none, a_none, a_none, a_none, a_none, a_none,
+    a_none, a_none, a_none, a_none, a_none, a_subf, a_subf_, a_subfo,
+    a_subfo_, a_subfc, a_subfc_, a_subfco, a_subfco_, a_subfe, a_subfe_,
+    a_subfeo, a_subfeo_, a_subfic, a_subfme, a_subfme_, a_subfmeo, a_subfmeo_,
+    a_subfze, a_subfze_, a_subfzeo, a_subfzeo_, a_none, a_none, a_none,
+    a_none, a_none, a_none, a_xor, a_xor_, a_xori, a_xoris,
+    { simplified mnemonics }
+    a_subi, a_subis, a_subic, a_subic_, a_sub, a_sub_, a_subo, a_subo_,
+    a_subc, a_subc_, a_subco, a_subco_, a_none, a_none, a_none, a_none,
+    a_extlwi, a_extlwi_, a_extrwi, a_extrwi_, a_inslwi, a_inslwi_, a_insrwi,
+    a_insrwi_, a_rotlwi, a_rotlwi_, a_rotlw, a_rotlw_, a_slwi, a_slwi_,
+    a_srwi, a_srwi_, a_clrlwi, a_clrlwi_, a_clrrwi, a_clrrwi_, a_clrslwi,
+    a_clrslwi_, a_none, a_none, a_none, a_none, a_none, a_none, a_none,
+    a_none, a_none {move to special prupose reg}, a_none {move from special purpose reg},
+    a_none, a_none, a_none, a_none, a_none, a_none, a_not, a_not_, a_none, a_none, a_none,
+    a_none, a_none);
+
   function TCpuAsmOptimizer.PeepHoleOptPass1Cpu(var p: tai): boolean;
     var
       next1, next2: tai;
@@ -54,6 +103,25 @@ Implementation
         ait_instruction:
           begin
             case taicpu(p).opcode of
+{ seems the register allocator doesn't generate superfluous fmr's }
+{              A_FMR, }
+              A_MR:
+                begin
+                  if getnextinstruction(p,next1) and
+                     (next1.typ = ait_instruction) and
+                     (calculation_target_op0[taicpu(next1).opcode] <> a_none) and
+                     (taicpu(next1).oper[0]^.reg = taicpu(p).oper[0]^.reg) then
+                    begin
+                      for l1 := 1 to taicpu(next1).ops - 1 do
+                        if (taicpu(next1).oper[l1]^.typ = top_reg) and
+                           (taicpu(next1).oper[l1]^.reg = taicpu(p).oper[0]^.reg) then
+                          taicpu(next1).loadreg(l1,taicpu(p).oper[1]^.reg);
+                      asml.remove(p);
+                      p.free;
+                      p := next1;
+                      result := true;
+                    end;
+                end;
               A_SRWI:
                 begin
                   if getnextinstruction(p,next1) and
@@ -209,8 +277,6 @@ Implementation
         end;
     end;
 
-
-
   function TCpuAsmOptimizer.PostPeepHoleOptsCpu(var p: tai): boolean;
     var
       next1: tai;