mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-08-30 07:23:48 +02:00
* Reg1ReadDependsOnReg2 moved to TAoptBaseCpu
* use Reg1ReadDependsOnReg2 in TAoptBaseCpu.RegModifiedByInstruction to handle properly Z80 subregisters git-svn-id: trunk@45449 -
This commit is contained in:
parent
4f707c3d7e
commit
2507c1ace6
@ -39,11 +39,6 @@ Type
|
|||||||
|
|
||||||
{ checks whether loading a new value in reg1 overwrites the entirety of reg2 }
|
{ checks whether loading a new value in reg1 overwrites the entirety of reg2 }
|
||||||
function Reg1WriteOverwritesReg2Entirely(reg1, reg2: tregister): boolean;
|
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 GetNextInstructionUsingReg(Current: tai; Var Next: tai;reg : TRegister): Boolean;
|
||||||
function RegLoadedWithNewValue(reg : tregister; hp : tai) : boolean; override;
|
function RegLoadedWithNewValue(reg : tregister; hp : tai) : boolean; override;
|
||||||
@ -180,63 +175,6 @@ Implementation
|
|||||||
end;
|
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;
|
function TCpuAsmOptimizer.GetNextInstructionUsingReg(Current: tai;
|
||||||
var Next: tai; reg: TRegister): Boolean;
|
var Next: tai; reg: TRegister): Boolean;
|
||||||
begin
|
begin
|
||||||
|
@ -61,6 +61,11 @@ Type
|
|||||||
{ ************************************************************************* }
|
{ ************************************************************************* }
|
||||||
|
|
||||||
TAoptBaseCpu = class(TAoptBase)
|
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;
|
function RegModifiedByInstruction(Reg: TRegister; p1: tai): boolean; override;
|
||||||
End;
|
End;
|
||||||
|
|
||||||
@ -116,13 +121,70 @@ Implementation
|
|||||||
End;
|
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;
|
function TAoptBaseCpu.RegModifiedByInstruction(Reg: TRegister; p1: tai): boolean;
|
||||||
var
|
var
|
||||||
i : Longint;
|
i : Longint;
|
||||||
begin
|
begin
|
||||||
result:=false;
|
result:=false;
|
||||||
for i:=0 to taicpu(p1).ops-1 do
|
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
|
begin
|
||||||
result:=true;
|
result:=true;
|
||||||
exit;
|
exit;
|
||||||
|
Loading…
Reference in New Issue
Block a user