@@ -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 Opc, bool isExt);
230
232
231
233
bool selectIndexedExtLoad (MachineInstr &I, MachineRegisterInfo &MRI);
232
234
bool selectIndexedLoad (MachineInstr &I, MachineRegisterInfo &MRI);
@@ -6537,6 +6539,48 @@ 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 ,
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 ;
6540
6584
case Intrinsic::swift_async_context_addr:
6541
6585
auto Sub = MIB.buildInstr (AArch64::SUBXri, {I.getOperand (0 ).getReg ()},
6542
6586
{Register (AArch64::FP)})
@@ -6552,6 +6596,28 @@ bool AArch64InstructionSelector::selectIntrinsic(MachineInstr &I,
6552
6596
return false ;
6553
6597
}
6554
6598
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
+
6555
6621
InstructionSelector::ComplexRendererFns
6556
6622
AArch64InstructionSelector::selectShiftA_32 (const MachineOperand &Root) const {
6557
6623
auto MaybeImmed = getImmedFromMO (Root);
0 commit comments