瀏覽代碼

* fold mov/lea/mov as well if possible

git-svn-id: trunk@25905 -
florian 11 年之前
父節點
當前提交
4148637c8c
共有 2 個文件被更改,包括 35 次插入6 次删除
  1. 1 0
      compiler/cgbase.pas
  2. 34 6
      compiler/i386/popt386.pas

+ 1 - 0
compiler/cgbase.pas

@@ -282,6 +282,7 @@ interface
 
        { Invalid register number }
        RS_INVALID    = high(tsuperregister);
+       NR_INVALID    = tregister($fffffffff);
 
        tcgsize2size : Array[tcgsize] of integer =
          { integer values }

+ 34 - 6
compiler/i386/popt386.pas

@@ -1911,6 +1911,17 @@ end;
 
 procedure PeepHoleOptPass2(asml: TAsmList; BlockStart, BlockEnd: tai);
 
+{$ifdef DEBUG_AOPTCPU}
+  procedure DebugMsg(const s: string;p : tai);
+    begin
+      asml.insertbefore(tai_comment.Create(strpnew(s)), p);
+    end;
+{$else DEBUG_AOPTCPU}
+  procedure DebugMsg(const s: string;p : tai);inline;
+    begin
+    end;
+{$endif DEBUG_AOPTCPU}
+
   function CanBeCMOV(p : tai) : boolean;
     begin
        CanBeCMOV:=assigned(p) and (p.typ=ait_instruction) and
@@ -2184,12 +2195,19 @@ begin
                   else if (taicpu(p).oper[0]^.typ = top_ref) and
                      GetNextInstruction(p,hp1) and
                      (hp1.typ = ait_instruction) and
-                     IsFoldableArithOp(taicpu(hp1),taicpu(p).oper[1]^.reg) and
+                     (IsFoldableArithOp(taicpu(hp1),taicpu(p).oper[1]^.reg) or
+                      ((taicpu(hp1).opcode=A_LEA) and
+                       (taicpu(hp1).oper[1]^.reg = taicpu(p).oper[1]^.reg) and
+                       ((MatchReference(taicpu(hp1).oper[0]^.ref^,taicpu(p).oper[1]^.reg,NR_INVALID) and
+                        (taicpu(hp1).oper[0]^.ref^.index<>taicpu(p).oper[1]^.reg)) or
+                        (MatchReference(taicpu(hp1).oper[0]^.ref^,NR_INVALID,taicpu(p).oper[1]^.reg) and
+                        (taicpu(hp1).oper[0]^.ref^.base<>taicpu(p).oper[1]^.reg))
+                       )
+                      )
+                     ) and
                      GetNextInstruction(hp1,hp2) and
-                     (hp2.typ = ait_instruction) and
-                     (taicpu(hp2).opcode = A_MOV) and
-                     (taicpu(hp2).oper[0]^.typ = top_reg) and
-                     (taicpu(hp2).oper[0]^.reg = taicpu(p).oper[1]^.reg) and
+                     MatchInstruction(hp2,A_MOV,[]) and
+                     MatchOperand(taicpu(p).oper[1]^,taicpu(hp2).oper[0]^) and
                      (taicpu(hp2).oper[1]^.typ = top_ref) then
                     begin
                       TmpUsedRegs := UsedRegs;
@@ -2205,7 +2223,17 @@ begin
                         begin
                           case taicpu(hp1).opcode of
                             A_INC,A_DEC:
-                              taicpu(hp1).loadRef(0,taicpu(p).oper[0]^.ref^)
+                              taicpu(hp1).loadRef(0,taicpu(p).oper[0]^.ref^);
+                            A_LEA:
+                              begin
+                                taicpu(hp1).opcode:=A_ADD;
+                                if taicpu(hp1).oper[0]^.ref^.index<>taicpu(p).oper[1]^.reg then
+                                  taicpu(hp1).loadreg(0,taicpu(hp1).oper[0]^.ref^.index)
+                                else
+                                  taicpu(hp1).loadreg(0,taicpu(hp1).oper[0]^.ref^.base);
+                                taicpu(hp1).loadRef(1,taicpu(p).oper[0]^.ref^);
+                                DebugMsg('Peephole FoldLea done',hp1);
+                              end
                             else
                               taicpu(hp1).loadRef(1,taicpu(p).oper[0]^.ref^);
                           end;