[llvm] [RISCV][GISel] Support select G_EXTRACT_SUBVECTOR (PR #169789)
Jianjian Guan via llvm-commits
llvm-commits at lists.llvm.org
Wed Dec 3 18:39:17 PST 2025
================
@@ -967,6 +968,48 @@ bool RISCVInstructionSelector::selectIntrinsicWithSideEffects(
}
}
+bool RISCVInstructionSelector::selectExtractSubvector(
+ MachineInstr &MI, MachineIRBuilder &MIB) const {
+ assert(MI.getOpcode() == TargetOpcode::G_EXTRACT_SUBVECTOR);
+
+ Register DstReg = MI.getOperand(0).getReg();
+ Register SrcReg = MI.getOperand(1).getReg();
+
+ LLT DstTy = MRI->getType(DstReg);
+ LLT SrcTy = MRI->getType(SrcReg);
+
+ unsigned Idx = static_cast<unsigned>(MI.getOperand(2).getImm());
+
+ MVT DstMVT = getMVTForLLT(DstTy);
+ MVT SrcMVT = getMVTForLLT(SrcTy);
+
+ unsigned SubRegIdx;
+ std::tie(SubRegIdx, Idx) =
+ RISCVTargetLowering::decomposeSubvectorInsertExtractToSubRegs(
+ SrcMVT, DstMVT, Idx, &TRI);
+
+ if (Idx != 0)
+ return false;
+
+ unsigned DstRegClassID = RISCVTargetLowering::getRegClassIDForVecVT(DstMVT);
+ const TargetRegisterClass *DstRC = TRI.getRegClass(DstRegClassID);
+ if (!RBI.constrainGenericRegister(DstReg, *DstRC, *MRI))
+ return false;
+
+ unsigned SrcRegClassID = RISCVTargetLowering::getRegClassIDForVecVT(SrcMVT);
+ const TargetRegisterClass *SrcRC = TRI.getRegClass(SrcRegClassID);
+ if (!RBI.constrainGenericRegister(SrcReg, *SrcRC, *MRI))
+ return false;
+
+ MachineInstr *CopyMI = MIB.buildInstr(TargetOpcode::COPY, {DstReg}, {})
+ .addReg(SrcReg, 0, SubRegIdx);
+ if (!constrainSelectedInstRegOperands(*CopyMI, TII, TRI, RBI))
----------------
jacquesguan wrote:
Removed.
https://github.com/llvm/llvm-project/pull/169789
More information about the llvm-commits
mailing list