Skip to content

Commit 314754c

Browse files
authored
[RISCV][GISel] Support select vector store instrinsics (llvm#165500)
Include Unit-stride, Strided, Mask store.
1 parent 2fac5a9 commit 314754c

File tree

4 files changed

+3505
-15
lines changed

4 files changed

+3505
-15
lines changed

llvm/lib/Target/RISCV/GISel/RISCVInstructionSelector.cpp

Lines changed: 67 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -92,6 +92,10 @@ class RISCVInstructionSelector : public InstructionSelector {
9292
void emitFence(AtomicOrdering FenceOrdering, SyncScope::ID FenceSSID,
9393
MachineIRBuilder &MIB) const;
9494
bool selectUnmergeValues(MachineInstr &MI, MachineIRBuilder &MIB) const;
95+
void addVectorLoadStoreOperands(MachineInstr &I,
96+
SmallVectorImpl<SrcOp> &SrcOps,
97+
unsigned &CurOp, bool IsMasked,
98+
bool IsStrided) const;
9599
bool selectIntrinsicWithSideEffects(MachineInstr &I,
96100
MachineIRBuilder &MIB) const;
97101

@@ -716,6 +720,26 @@ static unsigned selectRegImmLoadStoreOp(unsigned GenericOpc, unsigned OpSize) {
716720
return GenericOpc;
717721
}
718722

723+
void RISCVInstructionSelector::addVectorLoadStoreOperands(
724+
MachineInstr &I, SmallVectorImpl<SrcOp> &SrcOps, unsigned &CurOp,
725+
bool IsMasked, bool IsStrided) const {
726+
// Base Pointer
727+
auto PtrReg = I.getOperand(CurOp++).getReg();
728+
SrcOps.push_back(PtrReg);
729+
730+
// Stride
731+
if (IsStrided) {
732+
auto StrideReg = I.getOperand(CurOp++).getReg();
733+
SrcOps.push_back(StrideReg);
734+
}
735+
736+
// Mask
737+
if (IsMasked) {
738+
auto MaskReg = I.getOperand(CurOp++).getReg();
739+
SrcOps.push_back(MaskReg);
740+
}
741+
}
742+
719743
bool RISCVInstructionSelector::selectIntrinsicWithSideEffects(
720744
MachineInstr &I, MachineIRBuilder &MIB) const {
721745
// Find the intrinsic ID.
@@ -752,21 +776,7 @@ bool RISCVInstructionSelector::selectIntrinsicWithSideEffects(
752776
SrcOps.push_back(Register(RISCV::NoRegister));
753777
}
754778

755-
// Base Pointer
756-
auto PtrReg = I.getOperand(CurOp++).getReg();
757-
SrcOps.push_back(PtrReg);
758-
759-
// Stride
760-
if (IsStrided) {
761-
auto StrideReg = I.getOperand(CurOp++).getReg();
762-
SrcOps.push_back(StrideReg);
763-
}
764-
765-
// Mask
766-
if (IsMasked) {
767-
auto MaskReg = I.getOperand(CurOp++).getReg();
768-
SrcOps.push_back(MaskReg);
769-
}
779+
addVectorLoadStoreOperands(I, SrcOps, CurOp, IsMasked, IsStrided);
770780

771781
RISCVVType::VLMUL LMUL = RISCVTargetLowering::getLMUL(getMVTForLLT(VT));
772782
const RISCV::VLEPseudo *P =
@@ -795,6 +805,48 @@ bool RISCVInstructionSelector::selectIntrinsicWithSideEffects(
795805
I.eraseFromParent();
796806
return constrainSelectedInstRegOperands(*PseudoMI, TII, TRI, RBI);
797807
}
808+
case Intrinsic::riscv_vsm:
809+
case Intrinsic::riscv_vse:
810+
case Intrinsic::riscv_vse_mask:
811+
case Intrinsic::riscv_vsse:
812+
case Intrinsic::riscv_vsse_mask: {
813+
bool IsMasked = IntrinID == Intrinsic::riscv_vse_mask ||
814+
IntrinID == Intrinsic::riscv_vsse_mask;
815+
bool IsStrided = IntrinID == Intrinsic::riscv_vsse ||
816+
IntrinID == Intrinsic::riscv_vsse_mask;
817+
LLT VT = MRI->getType(I.getOperand(1).getReg());
818+
unsigned Log2SEW = Log2_32(VT.getScalarSizeInBits());
819+
820+
// Sources
821+
unsigned CurOp = 1;
822+
SmallVector<SrcOp, 4> SrcOps; // Source registers.
823+
824+
// Store value
825+
auto PassthruReg = I.getOperand(CurOp++).getReg();
826+
SrcOps.push_back(PassthruReg);
827+
828+
addVectorLoadStoreOperands(I, SrcOps, CurOp, IsMasked, IsStrided);
829+
830+
RISCVVType::VLMUL LMUL = RISCVTargetLowering::getLMUL(getMVTForLLT(VT));
831+
const RISCV::VSEPseudo *P = RISCV::getVSEPseudo(
832+
IsMasked, IsStrided, Log2SEW, static_cast<unsigned>(LMUL));
833+
834+
auto PseudoMI = MIB.buildInstr(P->Pseudo, {}, SrcOps);
835+
836+
// Select VL
837+
auto VLOpFn = renderVLOp(I.getOperand(CurOp++));
838+
for (auto &RenderFn : *VLOpFn)
839+
RenderFn(PseudoMI);
840+
841+
// SEW
842+
PseudoMI.addImm(Log2SEW);
843+
844+
// Memref
845+
PseudoMI.cloneMemRefs(I);
846+
847+
I.eraseFromParent();
848+
return constrainSelectedInstRegOperands(*PseudoMI, TII, TRI, RBI);
849+
}
798850
}
799851
}
800852

0 commit comments

Comments
 (0)