Jelajahi Sumber

* Reg1ReadDependsOnReg2 moved to TAoptBaseCpu
* use Reg1ReadDependsOnReg2 in TAoptBaseCpu.RegModifiedByInstruction to handle properly Z80 subregisters

git-svn-id: trunk@45449 -

nickysn 5 tahun lalu
induk
melakukan
2507c1ace6
2 mengubah file dengan 63 tambahan dan 63 penghapusan
  1. 0 62
      compiler/z80/aoptcpu.pas
  2. 63 1
      compiler/z80/aoptcpub.pas

+ 0 - 62
compiler/z80/aoptcpu.pas

@@ -39,11 +39,6 @@ Type
 
     { checks whether loading a new value in reg1 overwrites the entirety of reg2 }
     function Reg1WriteOverwritesReg2Entirely(reg1, reg2: tregister): boolean;
-    { checks whether reading the value in reg1 depends on the value of reg2. This
-      is very similar to SuperRegisterEquals, except it takes into account that
-      R_SUBH and R_SUBL are independendent (e.g. reading from AL does not
-      depend on the value in AH). }
-    function Reg1ReadDependsOnReg2(reg1, reg2: tregister): boolean;
 
     Function GetNextInstructionUsingReg(Current: tai; Var Next: tai;reg : TRegister): Boolean;
     function RegLoadedWithNewValue(reg : tregister; hp : tai) : boolean; override;
@@ -180,63 +175,6 @@ Implementation
     end;
 
 
-  function TCpuAsmOptimizer.Reg1ReadDependsOnReg2(reg1, reg2: tregister): boolean;
-    begin
-      case reg1 of
-        NR_AF:
-          result:=(reg2=NR_A) or (reg2=NR_AF) or SuperRegistersEqual(reg2,NR_DEFAULTFLAGS);
-        NR_A:
-          result:=(reg2=NR_A) or (reg2=NR_AF);
-        NR_F:
-          result:=SuperRegistersEqual(reg2,NR_DEFAULTFLAGS);
-        NR_BC:
-          result:=(reg2=NR_B) or (reg2=NR_C) or (reg2=NR_BC);
-        NR_B:
-          result:=(reg2=NR_B) or (reg2=NR_BC);
-        NR_C:
-          result:=(reg2=NR_C) or (reg2=NR_BC);
-        NR_DE:
-          result:=(reg2=NR_D) or (reg2=NR_E) or (reg2=NR_DE);
-        NR_D:
-          result:=(reg2=NR_D) or (reg2=NR_DE);
-        NR_E:
-          result:=(reg2=NR_E) or (reg2=NR_DE);
-        NR_HL:
-          result:=(reg2=NR_H) or (reg2=NR_L) or (reg2=NR_HL);
-        NR_H:
-          result:=(reg2=NR_H) or (reg2=NR_HL);
-        NR_L:
-          result:=(reg2=NR_L) or (reg2=NR_HL);
-        NR_AF_:
-          result:=(reg2=NR_A_) or (reg2=NR_AF_) or SuperRegistersEqual(reg2,NR_F_);
-        NR_A_:
-          result:=(reg2=NR_A_) or (reg2=NR_AF_);
-        NR_F_:
-          result:=SuperRegistersEqual(reg2,NR_F_);
-        NR_BC_:
-          result:=(reg2=NR_B_) or (reg2=NR_C_) or (reg2=NR_BC_);
-        NR_B_:
-          result:=(reg2=NR_B_) or (reg2=NR_BC_);
-        NR_C_:
-          result:=(reg2=NR_C_) or (reg2=NR_BC_);
-        NR_DE_:
-          result:=(reg2=NR_D_) or (reg2=NR_E_) or (reg2=NR_DE_);
-        NR_D_:
-          result:=(reg2=NR_D_) or (reg2=NR_DE_);
-        NR_E_:
-          result:=(reg2=NR_E_) or (reg2=NR_DE_);
-        NR_HL_:
-          result:=(reg2=NR_H_) or (reg2=NR_L_) or (reg2=NR_HL_);
-        NR_H_:
-          result:=(reg2=NR_H_) or (reg2=NR_HL_);
-        NR_L_:
-          result:=(reg2=NR_L_) or (reg2=NR_HL_);
-        else
-          result:=reg1=reg2;
-      end;
-    end;
-
-
   function TCpuAsmOptimizer.GetNextInstructionUsingReg(Current: tai;
     var Next: tai; reg: TRegister): Boolean;
     begin

+ 63 - 1
compiler/z80/aoptcpub.pas

@@ -61,6 +61,11 @@ Type
 { ************************************************************************* }
 
   TAoptBaseCpu = class(TAoptBase)
+    { checks whether reading the value in reg1 depends on the value of reg2. This
+      is very similar to SuperRegisterEquals, except it takes into account that
+      R_SUBH and R_SUBL are independendent (e.g. reading from AL does not
+      depend on the value in AH). }
+    function Reg1ReadDependsOnReg2(reg1, reg2: tregister): boolean;
     function RegModifiedByInstruction(Reg: TRegister; p1: tai): boolean; override;
   End;
 
@@ -116,13 +121,70 @@ Implementation
     End;
 
 
+  function TAoptBaseCpu.Reg1ReadDependsOnReg2(reg1, reg2: tregister): boolean;
+    begin
+      case reg1 of
+        NR_AF:
+          result:=(reg2=NR_A) or (reg2=NR_AF) or SuperRegistersEqual(reg2,NR_DEFAULTFLAGS);
+        NR_A:
+          result:=(reg2=NR_A) or (reg2=NR_AF);
+        NR_F:
+          result:=SuperRegistersEqual(reg2,NR_DEFAULTFLAGS);
+        NR_BC:
+          result:=(reg2=NR_B) or (reg2=NR_C) or (reg2=NR_BC);
+        NR_B:
+          result:=(reg2=NR_B) or (reg2=NR_BC);
+        NR_C:
+          result:=(reg2=NR_C) or (reg2=NR_BC);
+        NR_DE:
+          result:=(reg2=NR_D) or (reg2=NR_E) or (reg2=NR_DE);
+        NR_D:
+          result:=(reg2=NR_D) or (reg2=NR_DE);
+        NR_E:
+          result:=(reg2=NR_E) or (reg2=NR_DE);
+        NR_HL:
+          result:=(reg2=NR_H) or (reg2=NR_L) or (reg2=NR_HL);
+        NR_H:
+          result:=(reg2=NR_H) or (reg2=NR_HL);
+        NR_L:
+          result:=(reg2=NR_L) or (reg2=NR_HL);
+        NR_AF_:
+          result:=(reg2=NR_A_) or (reg2=NR_AF_) or SuperRegistersEqual(reg2,NR_F_);
+        NR_A_:
+          result:=(reg2=NR_A_) or (reg2=NR_AF_);
+        NR_F_:
+          result:=SuperRegistersEqual(reg2,NR_F_);
+        NR_BC_:
+          result:=(reg2=NR_B_) or (reg2=NR_C_) or (reg2=NR_BC_);
+        NR_B_:
+          result:=(reg2=NR_B_) or (reg2=NR_BC_);
+        NR_C_:
+          result:=(reg2=NR_C_) or (reg2=NR_BC_);
+        NR_DE_:
+          result:=(reg2=NR_D_) or (reg2=NR_E_) or (reg2=NR_DE_);
+        NR_D_:
+          result:=(reg2=NR_D_) or (reg2=NR_DE_);
+        NR_E_:
+          result:=(reg2=NR_E_) or (reg2=NR_DE_);
+        NR_HL_:
+          result:=(reg2=NR_H_) or (reg2=NR_L_) or (reg2=NR_HL_);
+        NR_H_:
+          result:=(reg2=NR_H_) or (reg2=NR_HL_);
+        NR_L_:
+          result:=(reg2=NR_L_) or (reg2=NR_HL_);
+        else
+          result:=reg1=reg2;
+      end;
+    end;
+
+
   function TAoptBaseCpu.RegModifiedByInstruction(Reg: TRegister; p1: tai): boolean;
     var
       i : Longint;
     begin
       result:=false;
       for i:=0 to taicpu(p1).ops-1 do
-        if (taicpu(p1).oper[i]^.typ=top_reg) and (taicpu(p1).oper[i]^.reg=Reg) and (taicpu(p1).spilling_get_operation_type(i) in [operand_write,operand_readwrite]) then
+        if (taicpu(p1).oper[i]^.typ=top_reg) and Reg1ReadDependsOnReg2(Reg,taicpu(p1).oper[i]^.reg) and (taicpu(p1).spilling_get_operation_type(i) in [operand_write,operand_readwrite]) then
           begin
             result:=true;
             exit;