This patch extends the existing patterns for SVE_INT_BINARY_SD to
support partial SVE integer modes, including those implement the
conditional form.

gcc/ChangeLog:

        * config/aarch64/aarch64-sve.md (<optab><mode>3): Extend
        to SVE_SDI_SIMD.
        (@aarch64_pred_<optab><mode>): Likewise.
        (@cond_<optab><mode>): Extend to SVE_SDI.
        (*cond_<optab><mode>_2): Likewise.
        (*cond_<optab><mode>_3): Likewise.
        (*cond_<optab><mode>_any): Likewise.
        * config/aarch64/iterators.md (SVE_SDI): New iterator for
        all SVE vector modes with 32-bit or 64-bit elements.
        (SVE_SDI_SIMD): New iterator.  As above, but including
        V4SI and V2DI.

gcc/testsuite/ChangeLog:

        * g++.target/aarch64/sve/cond_arith_1.C: Rename TEST_SHIFT
        to TEST_OP, add tests for SDIV and UDIV.
        * g++.target/aarch64/sve/cond_arith_2.C: Likewise.
        * g++.target/aarch64/sve/cond_arith_3.C: Likewise.
        * g++.target/aarch64/sve/cond_arith_4.C: Likewise.
        * gcc.target/aarch64/sve/div_2.c: New test.

---

Bootstrapped & regtested on aarch64-linux-gnu.  OK for master?

Thanks,
Spencer

---
 gcc/config/aarch64/aarch64-sve.md             | 64 +++++++++----------
 gcc/config/aarch64/iterators.md               |  7 ++
 .../g++.target/aarch64/sve/cond_arith_1.C     | 25 +++++---
 .../g++.target/aarch64/sve/cond_arith_2.C     | 25 +++++---
 .../g++.target/aarch64/sve/cond_arith_3.C     | 27 +++++---
 .../g++.target/aarch64/sve/cond_arith_4.C     | 27 +++++---
 gcc/testsuite/gcc.target/aarch64/sve/div_2.c  | 22 +++++++
 7 files changed, 127 insertions(+), 70 deletions(-)
 create mode 100644 gcc/testsuite/gcc.target/aarch64/sve/div_2.c

diff --git a/gcc/config/aarch64/aarch64-sve.md 
b/gcc/config/aarch64/aarch64-sve.md
index 6b5113eb70f..871b31623bb 100644
--- a/gcc/config/aarch64/aarch64-sve.md
+++ b/gcc/config/aarch64/aarch64-sve.md
@@ -4712,12 +4712,12 @@
 ;; We can use it with Advanced SIMD modes to expose the V2DI and V4SI
 ;; optabs to the midend.
 (define_expand "<optab><mode>3"
-  [(set (match_operand:SVE_FULL_SDI_SIMD 0 "register_operand")
-       (unspec:SVE_FULL_SDI_SIMD
+  [(set (match_operand:SVE_SDI_SIMD 0 "register_operand")
+       (unspec:SVE_SDI_SIMD
          [(match_dup 3)
-          (SVE_INT_BINARY_SD:SVE_FULL_SDI_SIMD
-            (match_operand:SVE_FULL_SDI_SIMD 1 "register_operand")
-            (match_operand:SVE_FULL_SDI_SIMD 2 "register_operand"))]
+          (SVE_INT_BINARY_SD:SVE_SDI_SIMD
+            (match_operand:SVE_SDI_SIMD 1 "register_operand")
+            (match_operand:SVE_SDI_SIMD 2 "register_operand"))]
          UNSPEC_PRED_X))]
   "TARGET_SVE"
   {
@@ -4727,12 +4727,12 @@
 
 ;; Integer division predicated with a PTRUE.
 (define_insn "@aarch64_pred_<optab><mode>"
-  [(set (match_operand:SVE_FULL_SDI_SIMD 0 "register_operand")
-       (unspec:SVE_FULL_SDI_SIMD
+  [(set (match_operand:SVE_SDI_SIMD 0 "register_operand")
+       (unspec:SVE_SDI_SIMD
          [(match_operand:<VPRED> 1 "register_operand")
-          (SVE_INT_BINARY_SD:SVE_FULL_SDI_SIMD
-            (match_operand:SVE_FULL_SDI_SIMD 2 "register_operand")
-            (match_operand:SVE_FULL_SDI_SIMD 3 "register_operand"))]
+          (SVE_INT_BINARY_SD:SVE_SDI_SIMD
+            (match_operand:SVE_SDI_SIMD 2 "register_operand")
+            (match_operand:SVE_SDI_SIMD 3 "register_operand"))]
          UNSPEC_PRED_X))]
   "TARGET_SVE"
   {@ [ cons: =0 , 1   , 2 , 3 ; attrs: movprfx ]
@@ -4744,25 +4744,25 @@
 
 ;; Predicated integer division with merging.
 (define_expand "@cond_<optab><mode>"
-  [(set (match_operand:SVE_FULL_SDI 0 "register_operand")
-       (unspec:SVE_FULL_SDI
+  [(set (match_operand:SVE_SDI 0 "register_operand")
+       (unspec:SVE_SDI
          [(match_operand:<VPRED> 1 "register_operand")
-          (SVE_INT_BINARY_SD:SVE_FULL_SDI
-            (match_operand:SVE_FULL_SDI 2 "register_operand")
-            (match_operand:SVE_FULL_SDI 3 "register_operand"))
-          (match_operand:SVE_FULL_SDI 4 "aarch64_simd_reg_or_zero")]
+          (SVE_INT_BINARY_SD:SVE_SDI
+            (match_operand:SVE_SDI 2 "register_operand")
+            (match_operand:SVE_SDI 3 "register_operand"))
+          (match_operand:SVE_SDI 4 "aarch64_simd_reg_or_zero")]
          UNSPEC_SEL))]
   "TARGET_SVE"
 )
 
 ;; Predicated integer division, merging with the first input.
 (define_insn "*cond_<optab><mode>_2"
-  [(set (match_operand:SVE_FULL_SDI 0 "register_operand")
-       (unspec:SVE_FULL_SDI
+  [(set (match_operand:SVE_SDI 0 "register_operand")
+       (unspec:SVE_SDI
          [(match_operand:<VPRED> 1 "register_operand")
-          (SVE_INT_BINARY_SD:SVE_FULL_SDI
-            (match_operand:SVE_FULL_SDI 2 "register_operand")
-            (match_operand:SVE_FULL_SDI 3 "register_operand"))
+          (SVE_INT_BINARY_SD:SVE_SDI
+            (match_operand:SVE_SDI 2 "register_operand")
+            (match_operand:SVE_SDI 3 "register_operand"))
           (match_dup 2)]
          UNSPEC_SEL))]
   "TARGET_SVE"
@@ -4774,12 +4774,12 @@
 
 ;; Predicated integer division, merging with the second input.
 (define_insn "*cond_<optab><mode>_3"
-  [(set (match_operand:SVE_FULL_SDI 0 "register_operand")
-       (unspec:SVE_FULL_SDI
+  [(set (match_operand:SVE_SDI 0 "register_operand")
+       (unspec:SVE_SDI
          [(match_operand:<VPRED> 1 "register_operand")
-          (SVE_INT_BINARY_SD:SVE_FULL_SDI
-            (match_operand:SVE_FULL_SDI 2 "register_operand")
-            (match_operand:SVE_FULL_SDI 3 "register_operand"))
+          (SVE_INT_BINARY_SD:SVE_SDI
+            (match_operand:SVE_SDI 2 "register_operand")
+            (match_operand:SVE_SDI 3 "register_operand"))
           (match_dup 3)]
          UNSPEC_SEL))]
   "TARGET_SVE"
@@ -4791,13 +4791,13 @@
 
 ;; Predicated integer division, merging with an independent value.
 (define_insn_and_rewrite "*cond_<optab><mode>_any"
-  [(set (match_operand:SVE_FULL_SDI 0 "register_operand")
-       (unspec:SVE_FULL_SDI
+  [(set (match_operand:SVE_SDI 0 "register_operand")
+       (unspec:SVE_SDI
          [(match_operand:<VPRED> 1 "register_operand")
-          (SVE_INT_BINARY_SD:SVE_FULL_SDI
-            (match_operand:SVE_FULL_SDI 2 "register_operand")
-            (match_operand:SVE_FULL_SDI 3 "register_operand"))
-          (match_operand:SVE_FULL_SDI 4 "aarch64_simd_reg_or_zero")]
+          (SVE_INT_BINARY_SD:SVE_SDI
+            (match_operand:SVE_SDI 2 "register_operand")
+            (match_operand:SVE_SDI 3 "register_operand"))
+          (match_operand:SVE_SDI 4 "aarch64_simd_reg_or_zero")]
          UNSPEC_SEL))]
   "TARGET_SVE
    && !rtx_equal_p (operands[2], operands[4])
diff --git a/gcc/config/aarch64/iterators.md b/gcc/config/aarch64/iterators.md
index c59fcd679d7..08ff6e42780 100644
--- a/gcc/config/aarch64/iterators.md
+++ b/gcc/config/aarch64/iterators.md
@@ -557,10 +557,17 @@
 ;; Fully-packed SVE integer vector modes that have 32-bit or 64-bit elements.
 (define_mode_iterator SVE_FULL_SDI [VNx4SI VNx2DI])
 
+;; SVE integer vector modes that have 32-bit or 64-bit elements.
+(define_mode_iterator SVE_SDI [VNx2SI SVE_FULL_SDI])
+
 ;; Fully-packed SVE and Advanced SIMD integer vector modes that have 32-bit or
 ;; 64-bit elements.
 (define_mode_iterator SVE_FULL_SDI_SIMD [SVE_FULL_SDI V4SI V2DI])
 
+;; SVE and full Advanced SIMD integer vector modes that have 32-bit or
+;; 64-bit elements.
+(define_mode_iterator SVE_SDI_SIMD [VNx2SI SVE_FULL_SDI_SIMD])
+
 ;; 2x and 4x tuples of the above, excluding 2x DI.
 (define_mode_iterator SVE_FULL_SIx2_SDIx4 [VNx8SI VNx16SI VNx8DI])
 
diff --git a/gcc/testsuite/g++.target/aarch64/sve/cond_arith_1.C 
b/gcc/testsuite/g++.target/aarch64/sve/cond_arith_1.C
index 0c6f640e35b..40ecb3a012e 100644
--- a/gcc/testsuite/g++.target/aarch64/sve/cond_arith_1.C
+++ b/gcc/testsuite/g++.target/aarch64/sve/cond_arith_1.C
@@ -9,10 +9,11 @@
 #define op_ior(A, B) ((A) | (B))
 #define op_xor(A, B) ((A) ^ (B))
 #define op_mul(A, B) ((A) * (B))
+#define op_div(A, B) ((A) / (B))
 #define op_max(A, B) ((A) > (B) ? (A) : (B))
 #define op_min(A, B) ((A) < (B) ? (A) : (B))
 
-#define TEST_SHIFT(TYPE, NAME) \
+#define TEST_OP(TYPE, NAME) \
   TYPE \
   NAME##_##TYPE##_reg (TYPE a, TYPE b, TYPE c) \
   { \
@@ -21,14 +22,14 @@
 
 #define TEST_TYPE(TYPE, SIZE) \
   typedef TYPE TYPE##SIZE __attribute__((vector_size(SIZE))); \
-  TEST_SHIFT (TYPE##SIZE, add) \
-  TEST_SHIFT (TYPE##SIZE, sub) \
-  TEST_SHIFT (TYPE##SIZE, and) \
-  TEST_SHIFT (TYPE##SIZE, ior) \
-  TEST_SHIFT (TYPE##SIZE, xor) \
-  TEST_SHIFT (TYPE##SIZE, mul) \
-  TEST_SHIFT (TYPE##SIZE, min) \
-  TEST_SHIFT (TYPE##SIZE, max)
+  TEST_OP (TYPE##SIZE, add) \
+  TEST_OP (TYPE##SIZE, sub) \
+  TEST_OP (TYPE##SIZE, and) \
+  TEST_OP (TYPE##SIZE, ior) \
+  TEST_OP (TYPE##SIZE, xor) \
+  TEST_OP (TYPE##SIZE, mul) \
+  TEST_OP (TYPE##SIZE, min) \
+  TEST_OP (TYPE##SIZE, max)
 
 TEST_TYPE (int8_t, 32)
 TEST_TYPE (uint8_t, 32)
@@ -45,6 +46,9 @@ TEST_TYPE (uint16_t, 128)
 TEST_TYPE (int32_t, 128)
 TEST_TYPE (uint32_t, 128)
 
+TEST_OP (int32_t128, div)
+TEST_OP (uint32_t128, div)
+
 /* { dg-final { scan-assembler-times {\tadd\tz[0-9]+\.b, p[0-7]/m, z[0-9]+\.b, 
z[0-9]+\.b\n} 6 } } */
 /* { dg-final { scan-assembler-times {\tadd\tz[0-9]+\.h, p[0-7]/m, z[0-9]+\.h, 
z[0-9]+\.h\n} 4 } } */
 /* { dg-final { scan-assembler-times {\tadd\tz[0-9]+\.s, p[0-7]/m, z[0-9]+\.s, 
z[0-9]+\.s\n} 2 } } */
@@ -85,5 +89,8 @@ TEST_TYPE (uint32_t, 128)
 /* { dg-final { scan-assembler-times {\tumax\tz[0-9]+\.h, p[0-7]/m, 
z[0-9]+\.h, z[0-9]+\.h\n} 2 } } */
 /* { dg-final { scan-assembler-times {\tumax\tz[0-9]+\.s, p[0-7]/m, 
z[0-9]+\.s, z[0-9]+\.s\n} 1 } } */
 
+/* { dg-final { scan-assembler-times {\tsdiv\tz[0-9]+\.s, p[0-7]/m, 
z[0-9]+\.s, z[0-9]+\.s\n} 1 } } */
+/* { dg-final { scan-assembler-times {\tudiv\tz[0-9]+\.s, p[0-7]/m, 
z[0-9]+\.s, z[0-9]+\.s\n} 1 } } */
+
 /* { dg-final { scan-assembler-not {\tmovprfx\t} } } */
 /* { dg-final { scan-assembler-not {\tsel\t} } } */
diff --git a/gcc/testsuite/g++.target/aarch64/sve/cond_arith_2.C 
b/gcc/testsuite/g++.target/aarch64/sve/cond_arith_2.C
index 8965c949873..9e40249fc11 100644
--- a/gcc/testsuite/g++.target/aarch64/sve/cond_arith_2.C
+++ b/gcc/testsuite/g++.target/aarch64/sve/cond_arith_2.C
@@ -9,10 +9,11 @@
 #define op_ior(A, B) ((A) | (B))
 #define op_xor(A, B) ((A) ^ (B))
 #define op_mul(A, B) ((A) * (B))
+#define op_div(A, B) ((A) / (B))
 #define op_max(A, B) ((A) > (B) ? (A) : (B))
 #define op_min(A, B) ((A) < (B) ? (A) : (B))
 
-#define TEST_SHIFT(TYPE, NAME) \
+#define TEST_OP(TYPE, NAME) \
   TYPE \
   NAME##_##TYPE##_reg (TYPE a, TYPE b, TYPE c) \
   { \
@@ -21,14 +22,14 @@
 
 #define TEST_TYPE(TYPE, SIZE) \
   typedef TYPE TYPE##SIZE __attribute__((vector_size(SIZE))); \
-  TEST_SHIFT (TYPE##SIZE, add) \
-  TEST_SHIFT (TYPE##SIZE, sub) \
-  TEST_SHIFT (TYPE##SIZE, and) \
-  TEST_SHIFT (TYPE##SIZE, ior) \
-  TEST_SHIFT (TYPE##SIZE, xor) \
-  TEST_SHIFT (TYPE##SIZE, mul) \
-  TEST_SHIFT (TYPE##SIZE, min) \
-  TEST_SHIFT (TYPE##SIZE, max)
+  TEST_OP (TYPE##SIZE, add) \
+  TEST_OP (TYPE##SIZE, sub) \
+  TEST_OP (TYPE##SIZE, and) \
+  TEST_OP (TYPE##SIZE, ior) \
+  TEST_OP (TYPE##SIZE, xor) \
+  TEST_OP (TYPE##SIZE, mul) \
+  TEST_OP (TYPE##SIZE, min) \
+  TEST_OP (TYPE##SIZE, max)
 
 TEST_TYPE (int8_t, 32)
 TEST_TYPE (uint8_t, 32)
@@ -45,6 +46,9 @@ TEST_TYPE (uint16_t, 128)
 TEST_TYPE (int32_t, 128)
 TEST_TYPE (uint32_t, 128)
 
+TEST_OP (int32_t128, div)
+TEST_OP (uint32_t128, div)
+
 /* { dg-final { scan-assembler-times {\tadd\tz[0-9]+\.b, p[0-7]/m, z[0-9]+\.b, 
z[0-9]+\.b\n} 6 } } */
 /* { dg-final { scan-assembler-times {\tadd\tz[0-9]+\.h, p[0-7]/m, z[0-9]+\.h, 
z[0-9]+\.h\n} 4 } } */
 /* { dg-final { scan-assembler-times {\tadd\tz[0-9]+\.s, p[0-7]/m, z[0-9]+\.s, 
z[0-9]+\.s\n} 2 } } */
@@ -85,5 +89,8 @@ TEST_TYPE (uint32_t, 128)
 /* { dg-final { scan-assembler-times {\tumax\tz[0-9]+\.h, p[0-7]/m, 
z[0-9]+\.h, z[0-9]+\.h\n} 2 } } */
 /* { dg-final { scan-assembler-times {\tumax\tz[0-9]+\.s, p[0-7]/m, 
z[0-9]+\.s, z[0-9]+\.s\n} 1 } } */
 
+/* { dg-final { scan-assembler-times {\tsdivr\tz[0-9]+\.s, p[0-7]/m, 
z[0-9]+\.s, z[0-9]+\.s\n} 1 } } */
+/* { dg-final { scan-assembler-times {\tudivr\tz[0-9]+\.s, p[0-7]/m, 
z[0-9]+\.s, z[0-9]+\.s\n} 1 } } */
+
 /* { dg-final { scan-assembler-not {\tmovprfx\t} } } */
 /* { dg-final { scan-assembler-not {\tsel\t} } } */
diff --git a/gcc/testsuite/g++.target/aarch64/sve/cond_arith_3.C 
b/gcc/testsuite/g++.target/aarch64/sve/cond_arith_3.C
index 3aa8669fe3e..bbc7cc331fb 100644
--- a/gcc/testsuite/g++.target/aarch64/sve/cond_arith_3.C
+++ b/gcc/testsuite/g++.target/aarch64/sve/cond_arith_3.C
@@ -9,10 +9,11 @@
 #define op_ior(A, B) ((A) | (B))
 #define op_xor(A, B) ((A) ^ (B))
 #define op_mul(A, B) ((A) * (B))
+#define op_div(A, B) ((A) / (B))
 #define op_max(A, B) ((A) > (B) ? (A) : (B))
 #define op_min(A, B) ((A) < (B) ? (A) : (B))
 
-#define TEST_SHIFT(TYPE, NAME) \
+#define TEST_OP(TYPE, NAME) \
   TYPE \
   NAME##_##TYPE##_reg (TYPE a, TYPE b, TYPE c, TYPE d) \
   { \
@@ -21,14 +22,14 @@
 
 #define TEST_TYPE(TYPE, SIZE) \
   typedef TYPE TYPE##SIZE __attribute__((vector_size(SIZE))); \
-  TEST_SHIFT (TYPE##SIZE, add) \
-  TEST_SHIFT (TYPE##SIZE, sub) \
-  TEST_SHIFT (TYPE##SIZE, and) \
-  TEST_SHIFT (TYPE##SIZE, ior) \
-  TEST_SHIFT (TYPE##SIZE, xor) \
-  TEST_SHIFT (TYPE##SIZE, mul) \
-  TEST_SHIFT (TYPE##SIZE, min) \
-  TEST_SHIFT (TYPE##SIZE, max)
+  TEST_OP (TYPE##SIZE, add) \
+  TEST_OP (TYPE##SIZE, sub) \
+  TEST_OP (TYPE##SIZE, and) \
+  TEST_OP (TYPE##SIZE, ior) \
+  TEST_OP (TYPE##SIZE, xor) \
+  TEST_OP (TYPE##SIZE, mul) \
+  TEST_OP (TYPE##SIZE, min) \
+  TEST_OP (TYPE##SIZE, max)
 
 TEST_TYPE (int8_t, 32)
 TEST_TYPE (uint8_t, 32)
@@ -45,6 +46,9 @@ TEST_TYPE (uint16_t, 128)
 TEST_TYPE (int32_t, 128)
 TEST_TYPE (uint32_t, 128)
 
+TEST_OP (int32_t128, div)
+TEST_OP (uint32_t128, div)
+
 /* { dg-final { scan-assembler-times {\tadd\tz[0-9]+\.b, p[0-7]/m, z[0-9]+\.b, 
z[0-9]+\.b\n} 6 } } */
 /* { dg-final { scan-assembler-times {\tadd\tz[0-9]+\.h, p[0-7]/m, z[0-9]+\.h, 
z[0-9]+\.h\n} 4 } } */
 /* { dg-final { scan-assembler-times {\tadd\tz[0-9]+\.s, p[0-7]/m, z[0-9]+\.s, 
z[0-9]+\.s\n} 2 } } */
@@ -85,7 +89,10 @@ TEST_TYPE (uint32_t, 128)
 /* { dg-final { scan-assembler-times {\tumax\tz[0-9]+\.h, p[0-7]/m, 
z[0-9]+\.h, z[0-9]+\.h\n} 2 } } */
 /* { dg-final { scan-assembler-times {\tumax\tz[0-9]+\.s, p[0-7]/m, 
z[0-9]+\.s, z[0-9]+\.s\n} 1 } } */
 
+/* { dg-final { scan-assembler-times {\tsdiv\tz[0-9]+\.s, p[0-7]/m, 
z[0-9]+\.s, z[0-9]+\.s\n} 1 } } */
+/* { dg-final { scan-assembler-times {\tudiv\tz[0-9]+\.s, p[0-7]/m, 
z[0-9]+\.s, z[0-9]+\.s\n} 1 } } */
+
 /* { dg-final { scan-assembler-times {\tmovprfx\tz[0-9]+\.b, p[0-7]/m, 
z[0-9]+\.b\n} 48 } } */
 /* { dg-final { scan-assembler-times {\tmovprfx\tz[0-9]+\.h, p[0-7]/m, 
z[0-9]+\.h\n} 32 } } */
-/* { dg-final { scan-assembler-times {\tmovprfx\tz[0-9]+\.s, p[0-7]/m, 
z[0-9]+\.s\n} 16 } } */
+/* { dg-final { scan-assembler-times {\tmovprfx\tz[0-9]+\.s, p[0-7]/m, 
z[0-9]+\.s\n} 18 } } */
 /* { dg-final { scan-assembler-not {\tsel\t} } } */
diff --git a/gcc/testsuite/g++.target/aarch64/sve/cond_arith_4.C 
b/gcc/testsuite/g++.target/aarch64/sve/cond_arith_4.C
index efa4b8953a3..fc799255e19 100644
--- a/gcc/testsuite/g++.target/aarch64/sve/cond_arith_4.C
+++ b/gcc/testsuite/g++.target/aarch64/sve/cond_arith_4.C
@@ -9,10 +9,11 @@
 #define op_ior(A, B) ((A) | (B))
 #define op_xor(A, B) ((A) ^ (B))
 #define op_mul(A, B) ((A) * (B))
+#define op_div(A, B) ((A) / (B))
 #define op_max(A, B) ((A) > (B) ? (A) : (B))
 #define op_min(A, B) ((A) < (B) ? (A) : (B))
 
-#define TEST_SHIFT(TYPE, NAME) \
+#define TEST_OP(TYPE, NAME) \
   TYPE \
   NAME##_##TYPE##_reg (TYPE a, TYPE b, TYPE c) \
   { \
@@ -21,14 +22,14 @@
 
 #define TEST_TYPE(TYPE, SIZE) \
   typedef TYPE TYPE##SIZE __attribute__((vector_size(SIZE))); \
-  TEST_SHIFT (TYPE##SIZE, add) \
-  TEST_SHIFT (TYPE##SIZE, sub) \
-  TEST_SHIFT (TYPE##SIZE, and) \
-  TEST_SHIFT (TYPE##SIZE, ior) \
-  TEST_SHIFT (TYPE##SIZE, xor) \
-  TEST_SHIFT (TYPE##SIZE, mul) \
-  TEST_SHIFT (TYPE##SIZE, min) \
-  TEST_SHIFT (TYPE##SIZE, max)
+  TEST_OP (TYPE##SIZE, add) \
+  TEST_OP (TYPE##SIZE, sub) \
+  TEST_OP (TYPE##SIZE, and) \
+  TEST_OP (TYPE##SIZE, ior) \
+  TEST_OP (TYPE##SIZE, xor) \
+  TEST_OP (TYPE##SIZE, mul) \
+  TEST_OP (TYPE##SIZE, min) \
+  TEST_OP (TYPE##SIZE, max)
 
 TEST_TYPE (int8_t, 32)
 TEST_TYPE (uint8_t, 32)
@@ -45,6 +46,9 @@ TEST_TYPE (uint16_t, 128)
 TEST_TYPE (int32_t, 128)
 TEST_TYPE (uint32_t, 128)
 
+TEST_OP (int32_t128, div)
+TEST_OP (uint32_t128, div)
+
 /* { dg-final { scan-assembler-times {\tadd\tz[0-9]+\.b, p[0-7]/m, z[0-9]+\.b, 
z[0-9]+\.b\n} 6 } } */
 /* { dg-final { scan-assembler-times {\tadd\tz[0-9]+\.h, p[0-7]/m, z[0-9]+\.h, 
z[0-9]+\.h\n} 4 } } */
 /* { dg-final { scan-assembler-times {\tadd\tz[0-9]+\.s, p[0-7]/m, z[0-9]+\.s, 
z[0-9]+\.s\n} 2 } } */
@@ -85,7 +89,10 @@ TEST_TYPE (uint32_t, 128)
 /* { dg-final { scan-assembler-times {\tumax\tz[0-9]+\.h, p[0-7]/m, 
z[0-9]+\.h, z[0-9]+\.h\n} 2 } } */
 /* { dg-final { scan-assembler-times {\tumax\tz[0-9]+\.s, p[0-7]/m, 
z[0-9]+\.s, z[0-9]+\.s\n} 1 } } */
 
+/* { dg-final { scan-assembler-times {\tsdiv\tz[0-9]+\.s, p[0-7]/m, 
z[0-9]+\.s, z[0-9]+\.s\n} 1 } } */
+/* { dg-final { scan-assembler-times {\tudiv\tz[0-9]+\.s, p[0-7]/m, 
z[0-9]+\.s, z[0-9]+\.s\n} 1 } } */
+
 /* { dg-final { scan-assembler-times {\tmovprfx\tz[0-9]+\.b, p[0-7]/z, 
z[0-9]+\.b\n} 48 } } */
 /* { dg-final { scan-assembler-times {\tmovprfx\tz[0-9]+\.h, p[0-7]/z, 
z[0-9]+\.h\n} 32 } } */
-/* { dg-final { scan-assembler-times {\tmovprfx\tz[0-9]+\.s, p[0-7]/z, 
z[0-9]+\.s\n} 16 } } */
+/* { dg-final { scan-assembler-times {\tmovprfx\tz[0-9]+\.s, p[0-7]/z, 
z[0-9]+\.s\n} 18 } } */
 /* { dg-final { scan-assembler-not {\tsel\t} } } */
diff --git a/gcc/testsuite/gcc.target/aarch64/sve/div_2.c 
b/gcc/testsuite/gcc.target/aarch64/sve/div_2.c
new file mode 100644
index 00000000000..02483ec47de
--- /dev/null
+++ b/gcc/testsuite/gcc.target/aarch64/sve/div_2.c
@@ -0,0 +1,22 @@
+/* { dg-do assemble { target aarch64_asm_sve_ok } } */
+/* { dg-options "-O -msve-vector-bits=2048 -save-temps" } */
+
+#include <stdint.h>
+
+typedef int32_t v32si __attribute__((vector_size(128)));
+typedef uint32_t v32usi __attribute__((vector_size(128)));
+
+v32si
+test_sdiv (v32si x, v32si y)
+{
+    return x / y;
+}
+
+v32usi
+test_udiv (v32usi x, v32usi y)
+{
+    return x / y;
+}
+
+/* { dg-final { scan-assembler-times {\tsdivr?\tz[0-9]+\.s, p[0-7]/m, 
z[0-9]+\.s, z[0-9]+\.s\n} 1 } } */
+/* { dg-final { scan-assembler-times {\tudivr?\tz[0-9]+\.s, p[0-7]/m, 
z[0-9]+\.s, z[0-9]+\.s\n} 1 } } */
-- 
2.34.1

Reply via email to