Skip to content

Commit

Permalink
[AArch64][GlobalISel] Select TBL/TBX Intrinsics (llvm#92914)
Browse files Browse the repository at this point in the history
  • Loading branch information
chuongg3 committed May 29, 2024
1 parent 9c4bae7 commit 35f2caf
Show file tree
Hide file tree
Showing 2 changed files with 1,069 additions and 349 deletions.
45 changes: 45 additions & 0 deletions llvm/lib/Target/AArch64/GISel/AArch64InstructionSelector.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -227,6 +227,8 @@ class AArch64InstructionSelector : public InstructionSelector {
bool selectReduction(MachineInstr &I, MachineRegisterInfo &MRI);
bool selectMOPS(MachineInstr &I, MachineRegisterInfo &MRI);
bool selectUSMovFromExtend(MachineInstr &I, MachineRegisterInfo &MRI);
void SelectTable(MachineInstr &I, MachineRegisterInfo &MRI, unsigned NumVecs,
unsigned Opc1, unsigned Opc2, bool isExt);

bool selectIndexedExtLoad(MachineInstr &I, MachineRegisterInfo &MRI);
bool selectIndexedLoad(MachineInstr &I, MachineRegisterInfo &MRI);
Expand Down Expand Up @@ -6537,6 +6539,25 @@ bool AArch64InstructionSelector::selectIntrinsic(MachineInstr &I,
I.eraseFromParent();
return true;
}
case Intrinsic::aarch64_neon_tbl2:
SelectTable(I, MRI, 2, AArch64::TBLv8i8Two, AArch64::TBLv16i8Two, false);
return true;
case Intrinsic::aarch64_neon_tbl3:
SelectTable(I, MRI, 3, AArch64::TBLv8i8Three, AArch64::TBLv16i8Three,
false);
return true;
case Intrinsic::aarch64_neon_tbl4:
SelectTable(I, MRI, 4, AArch64::TBLv8i8Four, AArch64::TBLv16i8Four, false);
return true;
case Intrinsic::aarch64_neon_tbx2:
SelectTable(I, MRI, 2, AArch64::TBXv8i8Two, AArch64::TBXv16i8Two, true);
return true;
case Intrinsic::aarch64_neon_tbx3:
SelectTable(I, MRI, 3, AArch64::TBXv8i8Three, AArch64::TBXv16i8Three, true);
return true;
case Intrinsic::aarch64_neon_tbx4:
SelectTable(I, MRI, 4, AArch64::TBXv8i8Four, AArch64::TBXv16i8Four, true);
return true;
case Intrinsic::swift_async_context_addr:
auto Sub = MIB.buildInstr(AArch64::SUBXri, {I.getOperand(0).getReg()},
{Register(AArch64::FP)})
Expand All @@ -6552,6 +6573,30 @@ bool AArch64InstructionSelector::selectIntrinsic(MachineInstr &I,
return false;
}

void AArch64InstructionSelector::SelectTable(MachineInstr &I,
MachineRegisterInfo &MRI,
unsigned NumVec, unsigned Opc1,
unsigned Opc2, bool isExt) {
Register DstReg = I.getOperand(0).getReg();
unsigned Opc = MRI.getType(DstReg) == LLT::fixed_vector(8, 8) ? Opc1 : Opc2;

// Create the REG_SEQUENCE
SmallVector<Register, 4> Regs;
for (unsigned i = 0; i < NumVec; i++)
Regs.push_back(I.getOperand(i + 2 + isExt).getReg());
Register RegSeq = createQTuple(Regs, MIB);

Register IdxReg = I.getOperand(2 + NumVec + isExt).getReg();
MachineInstrBuilder Instr;
if (isExt) {
Register Reg = I.getOperand(2).getReg();
Instr = MIB.buildInstr(Opc, {DstReg}, {Reg, RegSeq, IdxReg});
} else
Instr = MIB.buildInstr(Opc, {DstReg}, {RegSeq, IdxReg});
constrainSelectedInstRegOperands(*Instr, TII, TRI, RBI);
I.eraseFromParent();
}

InstructionSelector::ComplexRendererFns
AArch64InstructionSelector::selectShiftA_32(const MachineOperand &Root) const {
auto MaybeImmed = getImmedFromMO(Root);
Expand Down
Loading

0 comments on commit 35f2caf

Please sign in to comment.