@@ -9571,13 +9571,17 @@ SDValue AArch64TargetLowering::LowerCTPOP_PARITY(SDValue Op,
95719571 Attribute::NoImplicitFloat))
95729572 return SDValue();
95739573
9574- if (!Subtarget->hasNEON())
9574+ EVT VT = Op.getValueType();
9575+ if (VT.isScalableVector() ||
9576+ useSVEForFixedLengthVectorVT(VT, !Subtarget->isNeonAvailable()))
9577+ return LowerToPredicatedOp(Op, DAG, AArch64ISD::CTPOP_MERGE_PASSTHRU);
9578+
9579+ if (!Subtarget->isNeonAvailable())
95759580 return SDValue();
95769581
95779582 bool IsParity = Op.getOpcode() == ISD::PARITY;
95789583 SDValue Val = Op.getOperand(0);
95799584 SDLoc DL(Op);
9580- EVT VT = Op.getValueType();
95819585
95829586 // for i32, general parity function using EORs is more efficient compared to
95839587 // using floating point
@@ -9626,10 +9630,6 @@ SDValue AArch64TargetLowering::LowerCTPOP_PARITY(SDValue Op,
96269630
96279631 assert(!IsParity && "ISD::PARITY of vector types not supported");
96289632
9629- if (VT.isScalableVector() ||
9630- useSVEForFixedLengthVectorVT(VT, !Subtarget->isNeonAvailable()))
9631- return LowerToPredicatedOp(Op, DAG, AArch64ISD::CTPOP_MERGE_PASSTHRU);
9632-
96339633 assert((VT == MVT::v1i64 || VT == MVT::v2i64 || VT == MVT::v2i32 ||
96349634 VT == MVT::v4i32 || VT == MVT::v4i16 || VT == MVT::v8i16) &&
96359635 "Unexpected type for custom ctpop lowering");
0 commit comments