@@ -29537,20 +29537,31 @@ SDValue AArch64TargetLowering::LowerVECTOR_HISTOGRAM(SDValue Op,
2953729537SDValue
2953829538AArch64TargetLowering::LowerPARTIAL_REDUCE_MLA(SDValue Op,
2953929539 SelectionDAG &DAG) const {
29540+ bool Scalable = Op.getValueType().isScalableVector();
29541+ if (Scalable && !Subtarget->isSVEorStreamingSVEAvailable())
29542+ return SDValue();
29543+ if (!Scalable && (!Subtarget->isNeonAvailable() || !Subtarget->hasDotProd()))
29544+ return SDValue();
2954029545
2954129546 SDLoc DL(Op);
2954229547
2954329548 SDValue Acc = Op.getOperand(0);
2954429549 SDValue LHS = Op.getOperand(1);
2954529550 SDValue RHS = Op.getOperand(2);
2954629551 EVT ResultVT = Op.getValueType();
29547- assert(ResultVT == MVT::nxv2i64 && LHS.getValueType() == MVT::nxv16i8);
2954829552
29549- SDValue DotNode = DAG.getNode(Op.getOpcode(), DL, MVT::nxv4i32,
29550- DAG.getConstant(0, DL, MVT::nxv4i32), LHS, RHS);
29553+ assert((Scalable && ResultVT == MVT::nxv2i64 &&
29554+ LHS.getValueType() == MVT::nxv16i8) ||
29555+ (!Scalable && ResultVT == MVT::v2i64 &&
29556+ LHS.getValueType() == MVT::v16i8));
29557+
29558+ EVT DotVT = Scalable ? MVT::nxv4i32 : MVT::v4i32;
29559+ SDValue DotNode = DAG.getNode(Op.getOpcode(), DL, DotVT,
29560+ DAG.getConstant(0, DL, DotVT), LHS, RHS);
2955129561
2955229562 bool IsUnsigned = Op.getOpcode() == ISD::PARTIAL_REDUCE_UMLA;
29553- if (Subtarget->hasSVE2() || Subtarget->isStreamingSVEAvailable()) {
29563+ if (Scalable &&
29564+ (Subtarget->hasSVE2() || Subtarget->isStreamingSVEAvailable())) {
2955429565 unsigned LoOpcode = IsUnsigned ? AArch64ISD::UADDWB : AArch64ISD::SADDWB;
2955529566 unsigned HiOpcode = IsUnsigned ? AArch64ISD::UADDWT : AArch64ISD::SADDWT;
2955629567 SDValue Lo = DAG.getNode(LoOpcode, DL, ResultVT, Acc, DotNode);
0 commit comments