@@ -1114,6 +1114,13 @@ AArch64TargetLowering::AArch64TargetLowering(const TargetMachine &TM,
1114
1114
setOperationAction(ISD::UMAX, MVT::v2i64, Custom);
1115
1115
setOperationAction(ISD::UMIN, MVT::v1i64, Custom);
1116
1116
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);
1117
1124
setOperationAction(ISD::VECREDUCE_SMAX, MVT::v2i64, Custom);
1118
1125
setOperationAction(ISD::VECREDUCE_SMIN, MVT::v2i64, Custom);
1119
1126
setOperationAction(ISD::VECREDUCE_UMAX, MVT::v2i64, Custom);
@@ -1245,6 +1252,7 @@ void AArch64TargetLowering::addTypeForFixedLengthSVE(MVT VT) {
1245
1252
setOperationAction(ISD::UMAX, VT, Custom);
1246
1253
setOperationAction(ISD::UMIN, VT, Custom);
1247
1254
setOperationAction(ISD::VECREDUCE_ADD, VT, Custom);
1255
+ setOperationAction(ISD::VECREDUCE_AND, VT, Custom);
1248
1256
setOperationAction(ISD::VECREDUCE_FMAX, VT, Custom);
1249
1257
setOperationAction(ISD::VECREDUCE_FMIN, VT, Custom);
1250
1258
setOperationAction(ISD::VECREDUCE_SMAX, VT, Custom);
@@ -3927,6 +3935,7 @@ SDValue AArch64TargetLowering::LowerOperation(SDValue Op,
3927
3935
case ISD::STORE:
3928
3936
return LowerSTORE(Op, DAG);
3929
3937
case ISD::VECREDUCE_ADD:
3938
+ case ISD::VECREDUCE_AND:
3930
3939
case ISD::VECREDUCE_SMAX:
3931
3940
case ISD::VECREDUCE_SMIN:
3932
3941
case ISD::VECREDUCE_UMAX:
@@ -9714,12 +9723,15 @@ SDValue AArch64TargetLowering::LowerVECREDUCE(SDValue Op,
9714
9723
9715
9724
// Try to lower fixed length reductions to SVE.
9716
9725
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);
9719
9729
if (useSVEForFixedLengthVectorVT(SrcVT, OverrideNEON)) {
9720
9730
switch (Op.getOpcode()) {
9721
9731
case ISD::VECREDUCE_ADD:
9722
9732
return LowerFixedLengthReductionToSVE(AArch64ISD::UADDV_PRED, Op, DAG);
9733
+ case ISD::VECREDUCE_AND:
9734
+ return LowerFixedLengthReductionToSVE(AArch64ISD::ANDV_PRED, Op, DAG);
9723
9735
case ISD::VECREDUCE_SMAX:
9724
9736
return LowerFixedLengthReductionToSVE(AArch64ISD::SMAXV_PRED, Op, DAG);
9725
9737
case ISD::VECREDUCE_SMIN:
0 commit comments