Skip to content

Commit 193957b

Browse files
committed
[AArch64][GlobalISel] Select TBL/TBX instrinsics
1 parent 8b9722f commit 193957b

File tree

2 files changed

+627
-353
lines changed

2 files changed

+627
-353
lines changed

llvm/lib/Target/AArch64/GISel/AArch64InstructionSelector.cpp

Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -227,6 +227,8 @@ class AArch64InstructionSelector : public InstructionSelector {
227227
bool selectReduction(MachineInstr &I, MachineRegisterInfo &MRI);
228228
bool selectMOPS(MachineInstr &I, MachineRegisterInfo &MRI);
229229
bool selectUSMovFromExtend(MachineInstr &I, MachineRegisterInfo &MRI);
230+
void SelectTable(MachineInstr &I, MachineRegisterInfo &MRI, unsigned NumVecs,
231+
unsigned Opc, bool isExt);
230232

231233
bool selectIndexedExtLoad(MachineInstr &I, MachineRegisterInfo &MRI);
232234
bool selectIndexedLoad(MachineInstr &I, MachineRegisterInfo &MRI);
@@ -6537,6 +6539,48 @@ bool AArch64InstructionSelector::selectIntrinsic(MachineInstr &I,
65376539
I.eraseFromParent();
65386540
return true;
65396541
}
6542+
case Intrinsic::aarch64_neon_tbl2:
6543+
SelectTable(I, MRI, 2,
6544+
MRI.getType(I.getOperand(0).getReg()) == LLT::fixed_vector(8, 8)
6545+
? AArch64::TBLv8i8Two
6546+
: AArch64::TBLv16i8Two,
6547+
false);
6548+
return true;
6549+
case Intrinsic::aarch64_neon_tbl3:
6550+
SelectTable(I, MRI, 3,
6551+
MRI.getType(I.getOperand(0).getReg()) == LLT::fixed_vector(8, 8)
6552+
? AArch64::TBLv8i8Three
6553+
: AArch64::TBLv16i8Three,
6554+
false);
6555+
return true;
6556+
case Intrinsic::aarch64_neon_tbl4:
6557+
SelectTable(I, MRI, 4,
6558+
MRI.getType(I.getOperand(0).getReg()) == LLT::fixed_vector(8, 8)
6559+
? AArch64::TBLv8i8Four
6560+
: AArch64::TBLv16i8Four,
6561+
false);
6562+
return true;
6563+
case Intrinsic::aarch64_neon_tbx2:
6564+
SelectTable(I, MRI, 2,
6565+
MRI.getType(I.getOperand(0).getReg()) == LLT::fixed_vector(8, 8)
6566+
? AArch64::TBXv8i8Two
6567+
: AArch64::TBXv16i8Two,
6568+
true);
6569+
return true;
6570+
case Intrinsic::aarch64_neon_tbx3:
6571+
SelectTable(I, MRI, 3,
6572+
MRI.getType(I.getOperand(0).getReg()) == LLT::fixed_vector(8, 8)
6573+
? AArch64::TBXv8i8Three
6574+
: AArch64::TBXv16i8Three,
6575+
true);
6576+
return true;
6577+
case Intrinsic::aarch64_neon_tbx4:
6578+
SelectTable(I, MRI, 4,
6579+
MRI.getType(I.getOperand(0).getReg()) == LLT::fixed_vector(8, 8)
6580+
? AArch64::TBXv8i8Four
6581+
: AArch64::TBXv16i8Four,
6582+
true);
6583+
return true;
65406584
case Intrinsic::swift_async_context_addr:
65416585
auto Sub = MIB.buildInstr(AArch64::SUBXri, {I.getOperand(0).getReg()},
65426586
{Register(AArch64::FP)})
@@ -6552,6 +6596,28 @@ bool AArch64InstructionSelector::selectIntrinsic(MachineInstr &I,
65526596
return false;
65536597
}
65546598

6599+
void AArch64InstructionSelector::SelectTable(MachineInstr &I,
6600+
MachineRegisterInfo &MRI,
6601+
unsigned NumVec, unsigned Opc,
6602+
bool isExt) {
6603+
// Create the REG_SEQUENCE
6604+
SmallVector<Register, 4> Regs;
6605+
for (unsigned i = 0; i < NumVec; i++)
6606+
Regs.push_back(I.getOperand(i + 2 + isExt).getReg());
6607+
Register RegSeq = createQTuple(Regs, MIB);
6608+
6609+
Register DstReg = I.getOperand(0).getReg();
6610+
Register IdxReg = I.getOperand(2 + NumVec + isExt).getReg();
6611+
MachineInstrBuilder Instr;
6612+
if (isExt) {
6613+
Register Reg = I.getOperand(2).getReg();
6614+
Instr = MIB.buildInstr(Opc, {DstReg}, {Reg, RegSeq, IdxReg});
6615+
} else
6616+
Instr = MIB.buildInstr(Opc, {DstReg}, {RegSeq, IdxReg});
6617+
constrainSelectedInstRegOperands(*Instr, TII, TRI, RBI);
6618+
I.eraseFromParent();
6619+
}
6620+
65556621
InstructionSelector::ComplexRendererFns
65566622
AArch64InstructionSelector::selectShiftA_32(const MachineOperand &Root) const {
65576623
auto MaybeImmed = getImmedFromMO(Root);

0 commit comments

Comments
 (0)