@@ -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+
719743bool 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