[clang] [llvm] [Clang][RISCV] Add packed narrowing shift intrinsics (PR #228726)
Craig Topper via cfe-commits
cfe-commits at lists.llvm.org
Sat Oct 3 10:04:23 PDT 2026
================
@@ -18063,6 +18088,49 @@ void RISCVTargetLowering::ReplaceNodeResults(SDNode *N,
Results.push_back(DAG.getExtractSubvector(DL, VT, Res, 0));
return;
}
+ case Intrinsic::riscv_pnsrl:
+ case Intrinsic::riscv_pnsra:
+ case Intrinsic::riscv_pnsrar: {
+ MVT VT = N->getSimpleValueType(0);
+ if (!Subtarget.is64Bit() || (VT != MVT::v4i8 && VT != MVT::v2i16))
+ return;
+
+ SDValue Src = N->getOperand(1);
+ MVT SrcVT = Src.getSimpleValueType();
+ if (!((VT == MVT::v4i8 && SrcVT == MVT::v4i16) ||
+ (VT == MVT::v2i16 && SrcVT == MVT::v2i32)))
+ reportFatalUsageError("unsupported packed narrowing shift intrinsic");
+
+ MVT XLenVT = Subtarget.getXLenVT();
+ SDValue ShAmt =
+ DAG.getNode(ISD::ANY_EXTEND, DL, XLenVT, N->getOperand(2));
+ unsigned Opc;
+ switch (IntNo) {
+ default:
+ llvm_unreachable("Unexpected packed narrowing shift intrinsic");
+ case Intrinsic::riscv_pnsrl:
+ Opc = RISCVISD::PSRL;
+ break;
+ case Intrinsic::riscv_pnsra:
+ Opc = RISCVISD::PSRA;
+ break;
+ case Intrinsic::riscv_pnsrar:
+ Opc = RISCVISD::PSSHAR;
+ ShAmt = DAG.getNode(ISD::AND, DL, XLenVT, ShAmt,
+ DAG.getConstant(31, DL, XLenVT));
+ ShAmt = DAG.getNode(ISD::SUB, DL, XLenVT,
----------------
topperc wrote:
I think we have a getNegative helper.
https://github.com/llvm/llvm-project/pull/228726
More information about the cfe-commits
mailing list