Skip to content

Commit 35f2caf

Browse files
authored
[AArch64][GlobalISel] Select TBL/TBX Intrinsics (#92914)
1 parent 9c4bae7 commit 35f2caf

File tree

2 files changed

+1069
-349
lines changed

2 files changed

+1069
-349
lines changed

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

Lines changed: 45 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 Opc1, unsigned Opc2, bool isExt);
230232

231233
bool selectIndexedExtLoad(MachineInstr &I, MachineRegisterInfo &MRI);
232234
bool selectIndexedLoad(MachineInstr &I, MachineRegisterInfo &MRI);
@@ -6537,6 +6539,25 @@ bool AArch64InstructionSelector::selectIntrinsic(MachineInstr &I,
65376539
I.eraseFromParent();
65386540
return true;
65396541
}
6542+
case Intrinsic::aarch64_neon_tbl2:
6543+
SelectTable(I, MRI, 2, AArch64::TBLv8i8Two, AArch64::TBLv16i8Two, false);
6544+
return true;
6545+
case Intrinsic::aarch64_neon_tbl3:
6546+
SelectTable(I, MRI, 3, AArch64::TBLv8i8Three, AArch64::TBLv16i8Three,
6547+
false);
6548+
return true;
6549+
case Intrinsic::aarch64_neon_tbl4:
6550+
SelectTable(I, MRI, 4, AArch64::TBLv8i8Four, AArch64::TBLv16i8Four, false);
6551+
return true;
6552+
case Intrinsic::aarch64_neon_tbx2:
6553+
SelectTable(I, MRI, 2, AArch64::TBXv8i8Two, AArch64::TBXv16i8Two, true);
6554+
return true;
6555+
case Intrinsic::aarch64_neon_tbx3:
6556+
SelectTable(I, MRI, 3, AArch64::TBXv8i8Three, AArch64::TBXv16i8Three, true);
6557+
return true;
6558+
case Intrinsic::aarch64_neon_tbx4:
6559+
SelectTable(I, MRI, 4, AArch64::TBXv8i8Four, AArch64::TBXv16i8Four, true);
6560+
return true;
65406561
case Intrinsic::swift_async_context_addr:
65416562
auto Sub = MIB.buildInstr(AArch64::SUBXri, {I.getOperand(0).getReg()},
65426563
{Register(AArch64::FP)})
@@ -6552,6 +6573,30 @@ bool AArch64InstructionSelector::selectIntrinsic(MachineInstr &I,
65526573
return false;
65536574
}
65546575

6576+
void AArch64InstructionSelector::SelectTable(MachineInstr &I,
6577+
MachineRegisterInfo &MRI,
6578+
unsigned NumVec, unsigned Opc1,
6579+
unsigned Opc2, bool isExt) {
6580+
Register DstReg = I.getOperand(0).getReg();
6581+
unsigned Opc = MRI.getType(DstReg) == LLT::fixed_vector(8, 8) ? Opc1 : Opc2;
6582+
6583+
// Create the REG_SEQUENCE
6584+
SmallVector<Register, 4> Regs;
6585+
for (unsigned i = 0; i < NumVec; i++)
6586+
Regs.push_back(I.getOperand(i + 2 + isExt).getReg());
6587+
Register RegSeq = createQTuple(Regs, MIB);
6588+
6589+
Register IdxReg = I.getOperand(2 + NumVec + isExt).getReg();
6590+
MachineInstrBuilder Instr;
6591+
if (isExt) {
6592+
Register Reg = I.getOperand(2).getReg();
6593+
Instr = MIB.buildInstr(Opc, {DstReg}, {Reg, RegSeq, IdxReg});
6594+
} else
6595+
Instr = MIB.buildInstr(Opc, {DstReg}, {RegSeq, IdxReg});
6596+
constrainSelectedInstRegOperands(*Instr, TII, TRI, RBI);
6597+
I.eraseFromParent();
6598+
}
6599+
65556600
InstructionSelector::ComplexRendererFns
65566601
AArch64InstructionSelector::selectShiftA_32(const MachineOperand &Root) const {
65576602
auto MaybeImmed = getImmedFromMO(Root);

0 commit comments

Comments
 (0)