On Fri, Jul 11, 2025 at 02:40:46PM +0000, Remi Machet wrote:
> 
> On 7/11/25 08:21, Spencer Abson wrote:
> 
> External email: Use caution opening links or attachments
> 
> 
> 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 
> "<mailto:@@-4774,12+4774,12@@;;Predicatedintegerdivision,mergingwiththesecondinput.(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 
> "<mailto:@@-4791,13+4791,13@@;;Predicatedintegerdivision,mergingwithanindependentvalue.(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])
> +
> 
> Hi Spencer,
> 
> Based on the definition of SVE_FULL_SDI_SIMD, I would have expected V2SI to 
> also be in SVE_SDI_SIMD. I assume it is excluded because it is taken care of 
> by another iterator already? If so it might be worth mentioning.
> 
> Looks good to me otherwise (but someone else needs to approve).
> 
Hi Remi,

Good point.  Perhaps SVE_SDI_SIMD isn't the best name...

This change needs an iterator to replace SVE_FULL_SDI_SIMD which includes
all full/partial SVE integer modes that have 32-bit or 64-bit elements, plus
V4SI and V2DI.  V2SI was intentionally exlcuded from this new iterator since
it is not part of SVE_FULL_SDI_SIMD and adding it would be a functional change
that I'm not intending to make here.

Perhaps a better name for this new iterator would be SVE_VQ_SDI?

Also, I've realised that this patch would remove the only existing uses of
SVE_FULL_SDI_SIMD, so I could remove it entirely if we want.

Thanks,
Spencer
> 
> 
>  ;; 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