@@ -1114,6 +1114,13 @@ AArch64TargetLowering::AArch64TargetLowering(const TargetMachine &TM,
11141114 setOperationAction(ISD::UMAX, MVT::v2i64, Custom);
11151115 setOperationAction(ISD::UMIN, MVT::v1i64, Custom);
11161116 setOperationAction(ISD::UMIN, MVT::v2i64, Custom);
1117+ setOperationAction(ISD::VECREDUCE_AND, MVT::v8i8, Custom);
1118+ setOperationAction(ISD::VECREDUCE_AND, MVT::v16i8, Custom);
1119+ setOperationAction(ISD::VECREDUCE_AND, MVT::v4i16, Custom);
1120+ setOperationAction(ISD::VECREDUCE_AND, MVT::v8i16, Custom);
1121+ setOperationAction(ISD::VECREDUCE_AND, MVT::v2i32, Custom);
1122+ setOperationAction(ISD::VECREDUCE_AND, MVT::v4i32, Custom);
1123+ setOperationAction(ISD::VECREDUCE_AND, MVT::v2i64, Custom);
11171124 setOperationAction(ISD::VECREDUCE_SMAX, MVT::v2i64, Custom);
11181125 setOperationAction(ISD::VECREDUCE_SMIN, MVT::v2i64, Custom);
11191126 setOperationAction(ISD::VECREDUCE_UMAX, MVT::v2i64, Custom);
@@ -1245,6 +1252,7 @@ void AArch64TargetLowering::addTypeForFixedLengthSVE(MVT VT) {
12451252 setOperationAction(ISD::UMAX, VT, Custom);
12461253 setOperationAction(ISD::UMIN, VT, Custom);
12471254 setOperationAction(ISD::VECREDUCE_ADD, VT, Custom);
1255+ setOperationAction(ISD::VECREDUCE_AND, VT, Custom);
12481256 setOperationAction(ISD::VECREDUCE_FMAX, VT, Custom);
12491257 setOperationAction(ISD::VECREDUCE_FMIN, VT, Custom);
12501258 setOperationAction(ISD::VECREDUCE_SMAX, VT, Custom);
@@ -3927,6 +3935,7 @@ SDValue AArch64TargetLowering::LowerOperation(SDValue Op,
39273935 case ISD::STORE:
39283936 return LowerSTORE(Op, DAG);
39293937 case ISD::VECREDUCE_ADD:
3938+ case ISD::VECREDUCE_AND:
39303939 case ISD::VECREDUCE_SMAX:
39313940 case ISD::VECREDUCE_SMIN:
39323941 case ISD::VECREDUCE_UMAX:
@@ -9714,12 +9723,15 @@ SDValue AArch64TargetLowering::LowerVECREDUCE(SDValue Op,
97149723
97159724 // Try to lower fixed length reductions to SVE.
97169725 EVT SrcVT = Src.getValueType();
9717- bool OverrideNEON = Op.getOpcode() != ISD::VECREDUCE_ADD &&
9718- SrcVT.getVectorElementType() == MVT::i64;
9726+ bool OverrideNEON = Op.getOpcode() == ISD::VECREDUCE_AND ||
9727+ (Op.getOpcode() != ISD::VECREDUCE_ADD &&
9728+ SrcVT.getVectorElementType() == MVT::i64);
97199729 if (useSVEForFixedLengthVectorVT(SrcVT, OverrideNEON)) {
97209730 switch (Op.getOpcode()) {
97219731 case ISD::VECREDUCE_ADD:
97229732 return LowerFixedLengthReductionToSVE(AArch64ISD::UADDV_PRED, Op, DAG);
9733+ case ISD::VECREDUCE_AND:
9734+ return LowerFixedLengthReductionToSVE(AArch64ISD::ANDV_PRED, Op, DAG);
97239735 case ISD::VECREDUCE_SMAX:
97249736 return LowerFixedLengthReductionToSVE(AArch64ISD::SMAXV_PRED, Op, DAG);
97259737 case ISD::VECREDUCE_SMIN:
0 commit comments