浏览代码

+ avr: LddMov2Ldd optimization

florian 1 天之前
父节点
当前提交
cb019e1757
共有 1 个文件被更改,包括 41 次插入0 次删除
  1. 41 0
      compiler/avr/aoptcpu.pas

+ 41 - 0
compiler/avr/aoptcpu.pas

@@ -55,6 +55,7 @@ Type
     function OptPass1IN(var p : tai) : boolean;
     function OptPass1LDI(var p : tai) : boolean;
     function OptPass1LDS(var p : tai) : boolean;
+    function OptPass1LDD(var p: tai): boolean;
     function OptPass1MOV(var p : tai) : boolean;
     function OptPass1PUSH(var p : tai) : boolean;
     function OptPass1RCALL(var p : tai) : boolean;
@@ -519,6 +520,44 @@ Implementation
     end;
 
 
+  function TCpuAsmOptimizer.OptPass1LDD(var p : tai) : boolean;
+    var
+      hp1, alloc, dealloc: tai;
+    begin
+      Result:=false;
+      { turn
+          alloc reg0
+          ldd reg0, <mem>
+          ...
+          mov reg1, reg0
+          dealloc reg0
+
+        into
+          lds reg1, <mem>
+      }
+      if (GetNextInstructionUsingReg(p,hp1,taicpu(p).oper[0]^.reg)) and
+      MatchInstruction(hp1,A_MOV) and
+      (taicpu(hp1).oper[1]^.reg=taicpu(p).oper[0]^.reg) and
+      (not RegModifiedBetween(taicpu(p).oper[0]^.reg, p, hp1)) and
+      (not RegUsedBetween(taicpu(hp1).oper[0]^.reg, p, hp1)) then
+      begin
+        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
+            DebugMsg('Peephole LddMov2Ldd performed', p);
+            asml.Remove(alloc);
+            alloc.Free;
+            asml.Remove(dealloc);
+            dealloc.Free;
+            taicpu(p).oper[0]^.reg:=taicpu(hp1).oper[0]^.reg;
+            RemoveInstruction(hp1);
+            result:=true;
+          end;
+      end;
+    end;
+
+
   function TCpuAsmOptimizer.OptPass1IN(var p : tai) : boolean;
     var
       hp1, hp2: tai;
@@ -1449,6 +1488,8 @@ Implementation
                   Result:=OptPass1STS(p);
                 A_LDS:
                   Result:=OptPass1LDS(p);
+                A_LDD:
+                  Result:=OptPass1LDD(p);
                 A_IN:
                   Result:=OptPass1IN(p);
                 A_SBRS,