From a6921fff7bd15a4635d0bffc5f17df08bdeaa6d7 Mon Sep 17 00:00:00 2001 From: florian Date: Thu, 20 Jan 2022 19:02:27 +0100 Subject: [PATCH] + Aarch64: SxthSxtw2Sxth optimization --- compiler/armgen/aoptarm.pas | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/compiler/armgen/aoptarm.pas b/compiler/armgen/aoptarm.pas index 40175737f5..9c0ae62699 100644 --- a/compiler/armgen/aoptarm.pas +++ b/compiler/armgen/aoptarm.pas @@ -1004,6 +1004,36 @@ Implementation p:=hp1; result:=true; end +{$ifdef AARCH64} + { + change + sxth reg2,reg1 + sxtw reg3,reg2 + dealloc reg2 + to + sxth reg3,reg1 + } + else if MatchInstruction(p, A_SXTH, [C_None], [PF_None]) and + (taicpu(p).ops=2) and + GetNextInstructionUsingReg(p,hp1,taicpu(p).oper[0]^.reg) and + MatchInstruction(hp1, A_SXTW, [C_None], [PF_None]) and + (taicpu(hp1).ops=2) and + MatchOperand(taicpu(hp1).oper[1]^, taicpu(p).oper[0]^.reg) and + RegEndofLife(taicpu(p).oper[0]^.reg,taicpu(hp1)) and + { reg1 might not be modified inbetween } + not(RegModifiedBetween(taicpu(p).oper[1]^.reg,p,hp1)) then + begin + DebugMsg('Peephole SxthSxtw2Sxth done', p); + AllocRegBetween(taicpu(p).oper[1]^.reg,p,hp1,UsedRegs); + taicpu(hp1).opcode:=A_SXTH; + taicpu(hp1).loadReg(1,taicpu(p).oper[1]^.reg); + GetNextInstruction(p, hp1); + asml.remove(p); + p.free; + p:=hp1; + result:=true; + end + {$endif AARCH64} { change sxth reg2,reg1