[clang] [llvm] [RISCV][P-ext] Support Packed Narrowing Clip Pair (PR #215779)
via llvm-commits
llvm-commits at lists.llvm.org
Fri Aug 14 00:43:15 PDT 2026
================
@@ -12302,6 +12302,54 @@ SDValue RISCVTargetLowering::LowerINTRINSIC_WO_CHAIN(SDValue Op,
return DAG.getNode(Opc, DL, Op.getValueType(), Op.getOperand(1),
Op.getOperand(2));
}
+ case Intrinsic::riscv_pnclipp:
+ case Intrinsic::riscv_pnclipup: {
+ bool IsSigned = IntNo == Intrinsic::riscv_pnclipp;
+ EVT VT = Op.getValueType();
+ SDValue Rs1 = Op.getOperand(1);
+ SDValue Rs2 = Op.getOperand(2);
+ unsigned Opc = IsSigned ? RISCVISD::PNCLIPP : RISCVISD::PNCLIPUP;
+
+ if (Subtarget.is64Bit()) {
+ if (VT == MVT::v2i32 && !Rs1.getValueType().isVector()) {
+ unsigned WOpc = IsSigned ? RISCVISD::PNCLIPP_W : RISCVISD::PNCLIPUP_W;
+ return DAG.getNode(WOpc, DL, VT, Rs1, Rs2);
+ }
+ return DAG.getNode(Opc, DL, VT, Rs1, Rs2);
+ }
+
+ MVT XLenVT = Subtarget.getXLenVT();
+ auto ToXLen = [&](SDValue V) { return DAG.getBitcast(XLenVT, V); };
+ SDValue Shift = DAG.getTargetConstant(0, DL, XLenVT);
+ if (VT == MVT::v4i8) {
+ unsigned ClipOpc = IsSigned ? RISCVISD::PNCLIP : RISCVISD::PNCLIPU;
+ SDValue Pair = DAG.getNode(ISD::CONCAT_VECTORS, DL, MVT::v4i16, Rs1, Rs2);
+ return DAG.getNode(ClipOpc, DL, VT, Pair, Shift);
+ }
+ if (VT == MVT::v2i16) {
+ unsigned ClipOpc = IsSigned ? RISCVISD::PNCLIP : RISCVISD::PNCLIPU;
+ SDValue Pair = DAG.getNode(RISCVISD::BuildPairGPRVec, DL, MVT::v2i32,
----------------
TelGome wrote:
Use ISD::CONCAT_VECTOR for v4i8/v4i16 cases, for v2i16, rs1 and rs2 are scalar i32 GPRs , so CONCAT_VECTORS can't apply? I tested using ISD::BUILD_VECTORS for the v2i16 cases and the intrinsics work correctly.
https://github.com/llvm/llvm-project/pull/215779
More information about the llvm-commits
mailing list