From 2507c1ace69387df7feb0d805cb33ec6611089d7 Mon Sep 17 00:00:00 2001 From: nickysn Date: Wed, 20 May 2020 20:20:10 +0000 Subject: [PATCH] * Reg1ReadDependsOnReg2 moved to TAoptBaseCpu * use Reg1ReadDependsOnReg2 in TAoptBaseCpu.RegModifiedByInstruction to handle properly Z80 subregisters git-svn-id: trunk@45449 - --- compiler/z80/aoptcpu.pas | 62 ------------------------------------- compiler/z80/aoptcpub.pas | 64 ++++++++++++++++++++++++++++++++++++++- 2 files changed, 63 insertions(+), 63 deletions(-) diff --git a/compiler/z80/aoptcpu.pas b/compiler/z80/aoptcpu.pas index b24970bedc..45083b3035 100644 --- a/compiler/z80/aoptcpu.pas +++ b/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 diff --git a/compiler/z80/aoptcpub.pas b/compiler/z80/aoptcpub.pas index ff9bc5a71f..b2d6d0e6e7 100644 --- a/compiler/z80/aoptcpub.pas +++ b/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;