mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-12-16 01:50:38 +01:00
* draft of improving Addi0Op2Op
This commit is contained in:
parent
8685ec918f
commit
e8144afb6b
@ -381,20 +381,32 @@ implementation
|
||||
(taicpu(p).oper[2]^.typ=top_const) and
|
||||
(taicpu(p).oper[2]^.val=0) and
|
||||
GetNextInstructionUsingReg(p, hp1, taicpu(p).oper[0]^.reg) and
|
||||
MatchInstruction(hp1, [A_SUB,A_ADD,A_SLL,A_SRL,A_SLT,A_AND,A_OR,
|
||||
A_ADDI,A_ANDI,A_ORI,A_SRAI,A_SRLI,A_SLLI,A_XORI
|
||||
{$ifdef riscv64},A_ADDIW,A_SLLIW,A_SRLIW,A_SRAIW,
|
||||
A_ADDW,A_SLLW,A_SRLW,A_SUBW,A_SRAW{$endif}]
|
||||
) and
|
||||
(taicpu(hp1).ops=3) and
|
||||
(MatchOperand(taicpu(p).oper[0]^,taicpu(hp1).oper[2]^) or MatchOperand(taicpu(p).oper[0]^,taicpu(hp1).oper[1]^)) and
|
||||
((MatchInstruction(hp1, [A_SUB,A_ADD,A_SLL,A_SRL,A_SLT,A_AND,A_OR,
|
||||
A_ADDI,A_ANDI,A_ORI,A_SRAI,A_SRLI,A_SLLI,A_XORI
|
||||
{$ifdef riscv64},A_ADDIW,A_SLLIW,A_SRLIW,A_SRAIW,
|
||||
A_ADDW,A_SLLW,A_SRLW,A_SUBW,A_SRAW{$endif}]
|
||||
) and
|
||||
(taicpu(hp1).ops=3) and
|
||||
(MatchOperand(taicpu(p).oper[0]^,taicpu(hp1).oper[2]^) or MatchOperand(taicpu(p).oper[0]^,taicpu(hp1).oper[1]^))) {or
|
||||
|
||||
This is not possible yet as the deallocation after the jump could also mean that the register is in use at the
|
||||
jump target.
|
||||
|
||||
(MatchInstruction(hp1, [A_Bxx]) and
|
||||
(taicpu(hp1).ops=3) and
|
||||
(MatchOperand(taicpu(p).oper[0]^,taicpu(hp1).oper[0]^) or MatchOperand(taicpu(p).oper[0]^,taicpu(hp1).oper[1]^))) }
|
||||
) and
|
||||
(not RegModifiedBetween(taicpu(p).oper[1]^.reg, p,hp1)) and
|
||||
RegEndOfLife(taicpu(p).oper[0]^.reg, taicpu(hp1)) then
|
||||
begin
|
||||
if MatchOperand(taicpu(p).oper[0]^,taicpu(hp1).oper[2]^) then
|
||||
taicpu(hp1).loadreg(2,taicpu(p).oper[1]^.reg);
|
||||
{ if MatchInstruction(hp1, [A_Bxx]) and MatchOperand(taicpu(p).oper[0]^,taicpu(hp1).oper[0]^) then
|
||||
taicpu(hp1).loadreg(0,taicpu(p).oper[1]^.reg); }
|
||||
if MatchOperand(taicpu(p).oper[0]^,taicpu(hp1).oper[1]^) then
|
||||
taicpu(hp1).loadreg(1,taicpu(p).oper[1]^.reg);
|
||||
if MatchOperand(taicpu(p).oper[0]^,taicpu(hp1).oper[2]^) then
|
||||
taicpu(hp1).loadreg(2,taicpu(p).oper[1]^.reg);
|
||||
|
||||
AllocRegBetween(taicpu(p).oper[1]^.reg,p,hp1,UsedRegs);
|
||||
|
||||
DebugMsg('Peephole Addi0Op2Op performed', hp1);
|
||||
|
||||
|
||||
Loading…
Reference in New Issue
Block a user