@@ -99,6 +99,7 @@ class RISCVInstructionSelector : public InstructionSelector {
9999 LLT *IndexVT = nullptr ) const ;
100100 bool selectIntrinsicWithSideEffects (MachineInstr &I,
101101 MachineIRBuilder &MIB) const ;
102+ bool selectExtractSubvector (MachineInstr &MI, MachineIRBuilder &MIB) const ;
102103
103104 ComplexRendererFns selectShiftMask (MachineOperand &Root,
104105 unsigned ShiftWidth) const ;
@@ -967,6 +968,45 @@ bool RISCVInstructionSelector::selectIntrinsicWithSideEffects(
967968 }
968969}
969970
971+ bool RISCVInstructionSelector::selectExtractSubvector (
972+ MachineInstr &MI, MachineIRBuilder &MIB) const {
973+ assert (MI.getOpcode () == TargetOpcode::G_EXTRACT_SUBVECTOR);
974+
975+ Register DstReg = MI.getOperand (0 ).getReg ();
976+ Register SrcReg = MI.getOperand (1 ).getReg ();
977+
978+ LLT DstTy = MRI->getType (DstReg);
979+ LLT SrcTy = MRI->getType (SrcReg);
980+
981+ unsigned Idx = static_cast <unsigned >(MI.getOperand (2 ).getImm ());
982+
983+ MVT DstMVT = getMVTForLLT (DstTy);
984+ MVT SrcMVT = getMVTForLLT (SrcTy);
985+
986+ unsigned SubRegIdx;
987+ std::tie (SubRegIdx, Idx) =
988+ RISCVTargetLowering::decomposeSubvectorInsertExtractToSubRegs (
989+ SrcMVT, DstMVT, Idx, &TRI);
990+
991+ if (Idx != 0 )
992+ return false ;
993+
994+ unsigned DstRegClassID = RISCVTargetLowering::getRegClassIDForVecVT (DstMVT);
995+ const TargetRegisterClass *DstRC = TRI.getRegClass (DstRegClassID);
996+ if (!RBI.constrainGenericRegister (DstReg, *DstRC, *MRI))
997+ return false ;
998+
999+ unsigned SrcRegClassID = RISCVTargetLowering::getRegClassIDForVecVT (SrcMVT);
1000+ const TargetRegisterClass *SrcRC = TRI.getRegClass (SrcRegClassID);
1001+ if (!RBI.constrainGenericRegister (SrcReg, *SrcRC, *MRI))
1002+ return false ;
1003+
1004+ MIB.buildInstr (TargetOpcode::COPY, {DstReg}, {}).addReg (SrcReg, 0 , SubRegIdx);
1005+
1006+ MI.eraseFromParent ();
1007+ return true ;
1008+ }
1009+
9701010bool RISCVInstructionSelector::select (MachineInstr &MI) {
9711011 MachineIRBuilder MIB (MI);
9721012
@@ -1239,6 +1279,8 @@ bool RISCVInstructionSelector::select(MachineInstr &MI) {
12391279 }
12401280 case TargetOpcode::G_INTRINSIC_W_SIDE_EFFECTS:
12411281 return selectIntrinsicWithSideEffects (MI, MIB);
1282+ case TargetOpcode::G_EXTRACT_SUBVECTOR:
1283+ return selectExtractSubvector (MI, MIB);
12421284 default :
12431285 return false ;
12441286 }
0 commit comments