Browse Source

+ Z80: added a registers_interfere helper function

git-svn-id: trunk@45338 -
nickysn 5 năm trước cách đây
mục cha
commit
4263ff44c1
1 tập tin đã thay đổi với 58 bổ sung0 xóa
  1. 58 0
      compiler/z80/cpubase.pas

+ 58 - 0
compiler/z80/cpubase.pas

@@ -285,6 +285,7 @@ unit cpubase;
     { Checks if sreg is a subset of reg (e.g. NR_H is a subset of NR_HL }
     function register_in(sreg,reg:Tregister):boolean;
     function super_registers_equal(reg1,reg2 : TRegister) : Boolean;
+    function registers_interfere(reg1,reg2: TRegister) : Boolean;
 
     function inverse_cond(const c: TAsmCond): TAsmCond; {$ifdef USEINLINE}inline;{$endif USEINLINE}
     function conditions_equal(const c1, c2: TAsmCond): boolean; {$ifdef USEINLINE}inline;{$endif USEINLINE}
@@ -481,6 +482,63 @@ unit cpubase;
       end;
 
 
+    function registers_interfere(reg1, reg2: TRegister): Boolean;
+      begin
+        case reg1 of
+          NR_A:
+            result:=(reg2=NR_A) or (reg2=NR_AF);
+          NR_F:
+            result:=(reg2=NR_F) or (reg2=NR_AF);
+          NR_AF:
+            result:=(reg2=NR_A) or (reg2=NR_F) or (reg2=NR_AF);
+          NR_B:
+            result:=(reg2=NR_B) or (reg2=NR_BC);
+          NR_C:
+            result:=(reg2=NR_C) or (reg2=NR_BC);
+          NR_BC:
+            result:=(reg2=NR_B) or (reg2=NR_C) or (reg2=NR_BC);
+          NR_D:
+            result:=(reg2=NR_D) or (reg2=NR_DE);
+          NR_E:
+            result:=(reg2=NR_E) or (reg2=NR_DE);
+          NR_DE:
+            result:=(reg2=NR_D) or (reg2=NR_E) or (reg2=NR_DE);
+          NR_H:
+            result:=(reg2=NR_H) or (reg2=NR_HL);
+          NR_L:
+            result:=(reg2=NR_L) or (reg2=NR_HL);
+          NR_HL:
+            result:=(reg2=NR_H) or (reg2=NR_L) or (reg2=NR_HL);
+          NR_A_:
+            result:=(reg2=NR_A_) or (reg2=NR_AF_);
+          NR_F_:
+            result:=(reg2=NR_F_) or (reg2=NR_AF_);
+          NR_AF_:
+            result:=(reg2=NR_A_) or (reg2=NR_F_) or (reg2=NR_AF_);
+          NR_B_:
+            result:=(reg2=NR_B_) or (reg2=NR_BC_);
+          NR_C_:
+            result:=(reg2=NR_C_) or (reg2=NR_BC_);
+          NR_BC_:
+            result:=(reg2=NR_B_) or (reg2=NR_C_) or (reg2=NR_BC_);
+          NR_D_:
+            result:=(reg2=NR_D_) or (reg2=NR_DE_);
+          NR_E_:
+            result:=(reg2=NR_E_) or (reg2=NR_DE_);
+          NR_DE_:
+            result:=(reg2=NR_D_) or (reg2=NR_E_) or (reg2=NR_DE_);
+          NR_H_:
+            result:=(reg2=NR_H_) or (reg2=NR_HL_);
+          NR_L_:
+            result:=(reg2=NR_L_) or (reg2=NR_HL_);
+          NR_HL_:
+            result:=(reg2=NR_H_) or (reg2=NR_L_) or (reg2=NR_HL_);
+          else
+            result:=reg1=reg2;
+        end;
+      end;
+
+
     function inverse_cond(const c: TAsmCond): TAsmCond; {$ifdef USEINLINE}inline;{$endif USEINLINE}
       const
         inverse: array[TAsmCond] of TAsmCond=(C_None,