@@ -227,6 +227,8 @@ class AArch64InstructionSelector : public InstructionSelector {
227
227
bool selectReduction (MachineInstr &I, MachineRegisterInfo &MRI);
228
228
bool selectMOPS (MachineInstr &I, MachineRegisterInfo &MRI);
229
229
bool selectUSMovFromExtend (MachineInstr &I, MachineRegisterInfo &MRI);
230
+ void SelectTable (MachineInstr &I, MachineRegisterInfo &MRI, unsigned NumVecs,
231
+ unsigned Opc1, unsigned Opc2, bool isExt);
230
232
231
233
bool selectIndexedExtLoad (MachineInstr &I, MachineRegisterInfo &MRI);
232
234
bool selectIndexedLoad (MachineInstr &I, MachineRegisterInfo &MRI);
@@ -6537,6 +6539,25 @@ bool AArch64InstructionSelector::selectIntrinsic(MachineInstr &I,
6537
6539
I.eraseFromParent ();
6538
6540
return true ;
6539
6541
}
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 ;
6540
6561
case Intrinsic::swift_async_context_addr:
6541
6562
auto Sub = MIB.buildInstr (AArch64::SUBXri, {I.getOperand (0 ).getReg ()},
6542
6563
{Register (AArch64::FP)})
@@ -6552,6 +6573,30 @@ bool AArch64InstructionSelector::selectIntrinsic(MachineInstr &I,
6552
6573
return false ;
6553
6574
}
6554
6575
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
+
6555
6600
InstructionSelector::ComplexRendererFns
6556
6601
AArch64InstructionSelector::selectShiftA_32 (const MachineOperand &Root) const {
6557
6602
auto MaybeImmed = getImmedFromMO (Root);
0 commit comments