================
@@ -6352,11 +6352,69 @@ SDValue
RISCVTargetLowering::lowerVECTOR_SHUFFLE(SDValue Op,
unsigned NumElts = VT.getVectorNumElements();
ShuffleVectorSDNode *SVN = cast<ShuffleVectorSDNode>(Op.getNode());
- // Select an element reverse shuffle to VECTOR_REVERSE
(rev8/rev16/ppairoe.*).
+ // Select RVP-specific packed shuffles before falling back to the generic
+ // fixed/scalable-vector lowering below.
if (Subtarget.hasStdExtP() && !Subtarget.hasVInstructions()) {
+ ArrayRef<int> Mask = SVN->getMask();
+
+ // Match the IR produced by the packed widening high-half convert header
+ // intrinsics:
+ // shufflevector zeroinitializer, src, <0, N, 1, N+1, ...>
+ // bitcast to the widened vector type
+ // This places each source element in the high half of the widened element.
+ // Lower it to PZIP with a zero first operand and let tablegen select
+ // pwcvth.* via zip*p/wzip*p.
+ auto IsBuildVectorAllZeros = [](SDValue V) {
+ if (V.getOpcode() == ISD::BUILD_VECTOR)
+ return ISD::isBuildVectorAllZeros(V.getNode());
+ return V.getOpcode() == ISD::SPLAT_VECTOR &&
+ isNullConstant(V.getOperand(0));
+ };
+
+ auto IsWidenHighMask = [&](unsigned SrcNumElts) {
+ for (unsigned I = 0; I != SrcNumElts; ++I)
+ if (Mask[2 * I] != (int)I || Mask[2 * I + 1] != (int)(NumElts + I))
+ return false;
+ return true;
+ };
+ auto GetZeroVector = [&]() { return DAG.getConstant(0, DL, VT); };
----------------
topperc wrote:
I don't think the `GetZeroVector` helper is necessary.
https://github.com/llvm/llvm-project/pull/208394
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits