瀏覽代碼

+ AVR: MovOp2Op 2 optimization

git-svn-id: trunk@49350 -
florian 4 年之前
父節點
當前提交
9bfc731bb6
共有 1 個文件被更改,包括 39 次插入1 次删除
  1. 39 1
      compiler/avr/aoptcpu.pas

+ 39 - 1
compiler/avr/aoptcpu.pas

@@ -927,7 +927,45 @@ Implementation
                        (taicpu(hp1).oper[0]^.reg=taicpu(p).oper[0]^.reg) and  }
                        assigned(FindRegDeAlloc(taicpu(p).oper[0]^.reg,tai(hp1.Next))) then
                       begin
-                        DebugMsg('Peephole MovOp2Op performed', p);
+                        DebugMsg('Peephole MovOp2Op 1 performed', p);
+
+                        for i := 0 to taicpu(hp1).ops-1 do
+                          if taicpu(hp1).oper[i]^.typ=top_reg then
+                            if taicpu(hp1).oper[i]^.reg=taicpu(p).oper[0]^.reg then
+                              taicpu(hp1).oper[i]^.reg:=taicpu(p).oper[1]^.reg;
+
+                        alloc:=FindRegAllocBackward(taicpu(p).oper[0]^.reg,tai(p.Previous));
+                        dealloc:=FindRegDeAlloc(taicpu(p).oper[0]^.reg,tai(hp1.Next));
+
+                        if assigned(alloc) and assigned(dealloc) then
+                          begin
+                            asml.Remove(alloc);
+                            alloc.Free;
+                            asml.Remove(dealloc);
+                            dealloc.Free;
+                          end;
+
+                        { life range of reg1 is increased }
+                        AllocRegBetween(taicpu(p).oper[1]^.reg,p,hp1,usedregs);
+                        { p will be removed, update used register as we continue
+                          with the next instruction after p }
+
+                        result:=RemoveCurrentP(p);
+                      end
+                    { turn
+                      mov reg1, reg0
+                      <op> reg1,xxxx
+                      dealloc reg1
+                      into
+                      <op> reg1,xxx
+                    }
+                    else if MatchOpType(taicpu(p),top_reg,top_reg) and
+                       GetNextInstructionUsingReg(p,hp1,taicpu(p).oper[0]^.reg) and
+                       not(RegModifiedBetween(taicpu(p).oper[1]^.reg, p, hp1)) and
+                       MatchInstruction(hp1,[A_CP,A_CPC,A_CPI,A_SBRS,A_SBRC]) and
+                       assigned(FindRegDeAlloc(taicpu(p).oper[0]^.reg,tai(hp1.Next))) then
+                      begin
+                        DebugMsg('Peephole MovOp2Op 2 performed', p);
 
                         for i := 0 to taicpu(hp1).ops-1 do
                           if taicpu(hp1).oper[i]^.typ=top_reg then