Port the `vdiv` family of NEON intrinsics to the pragma-based framework,
and add assembly tests for every variant.

gcc/ChangeLog:

        * config/aarch64/aarch64-neon-builtins-base.cc (vdivh, vdiv,
        vdivq): New function bases.
        * config/aarch64/aarch64-neon-builtins-base.def (vdiv, vdivq,
        vdivh): New function declarations.
        * config/aarch64/arm_neon.h (vdiv_f32, vdiv_f64, vdivq_f32,
        vdivq_f64, vdiv_f16, vdivq_f16): Delete function definitions.

gcc/testsuite/ChangeLog:

        * gcc.target/aarch64/neon/vdiv.c: New test.
---
 .../aarch64/aarch64-neon-builtins-base.cc     |  1 +
 .../aarch64/aarch64-neon-builtins-base.def    |  8 ++++
 gcc/config/aarch64/arm_neon.h                 | 42 -----------------
 gcc/testsuite/gcc.target/aarch64/neon/vdiv.c  | 46 +++++++++++++++++++
 4 files changed, 55 insertions(+), 42 deletions(-)
 create mode 100644 gcc/testsuite/gcc.target/aarch64/neon/vdiv.c

diff --git a/gcc/config/aarch64/aarch64-neon-builtins-base.cc 
b/gcc/config/aarch64/aarch64-neon-builtins-base.cc
index fe6d569171f..7deed63b739 100644
--- a/gcc/config/aarch64/aarch64-neon-builtins-base.cc
+++ b/gcc/config/aarch64/aarch64-neon-builtins-base.cc
@@ -901,6 +901,7 @@ NEON_FUNCTION (vdupb_lane, vdupb_laneq, vduph_lane,   
vduph_laneq,
 // Lanewise arithmetic
 NEON_FUNCTION (vadd, vaddq, vaddd, gimple_arith, (PLUS_EXPR, PLUS_EXPR, 
BIT_XOR_EXPR))
 NEON_FUNCTION (vsub, vsubq, vsubd, gimple_arith, (MINUS_EXPR))
+NEON_FUNCTION (vdiv, vdivq,       gimple_arith, (RDIV_EXPR))
 
 NEON_FUNCTION (vmul, vmulq,            gimple_arith, (MULT_EXPR))
 NEON_FUNCTION (vmul_n, vmulq_n,                gimple_arith_dup, (MULT_EXPR))
diff --git a/gcc/config/aarch64/aarch64-neon-builtins-base.def 
b/gcc/config/aarch64/aarch64-neon-builtins-base.def
index e96bd77be92..ffbde05d769 100644
--- a/gcc/config/aarch64/aarch64-neon-builtins-base.def
+++ b/gcc/config/aarch64/aarch64-neon-builtins-base.def
@@ -90,6 +90,10 @@ DEF_NEON_FUNCTION (vmuls_lane,  neon_mul, ("s0,s0,D0,ss32", 
lane<2>))
 DEF_NEON_FUNCTION (vmuls_laneq, neon_mul, ("s0,s0,Q0,ss32", lane<2>))
 DEF_NEON_FUNCTION (vmuld_lane,  neon_mul, ("s0,s0,D0,ss32", lane<2>))
 DEF_NEON_FUNCTION (vmuld_laneq, neon_mul, ("s0,s0,Q0,ss32", lane<2>))
+
+// Division
+DEF_NEON_FUNCTION (vdiv,  sd_float, ("D0,D0,D0"))
+DEF_NEON_FUNCTION (vdivq, sd_float, ("Q0,Q0,Q0"))
 #undef REQUIRED_EXTENSIONS
 
 // Lanewise arithmetic (FP16)
@@ -113,6 +117,10 @@ DEF_NEON_FUNCTION (vmulq_lane,  h_float, ("Q0,Q0,D0,ss32", 
lane<2>))
 DEF_NEON_FUNCTION (vmulq_laneq, h_float, ("Q0,Q0,Q0,ss32", lane<2>))
 DEF_NEON_FUNCTION (vmulh_lane,  h_float, ("s0,s0,D0,ss32", lane<2>))
 DEF_NEON_FUNCTION (vmulh_laneq, h_float, ("s0,s0,Q0,ss32", lane<2>))
+
+// Division
+DEF_NEON_FUNCTION (vdiv,  h_float, ("D0,D0,D0"))
+DEF_NEON_FUNCTION (vdivq, h_float, ("Q0,Q0,Q0"))
 #undef REQUIRED_EXTENSIONS
 
 // Saturating arithmetic
diff --git a/gcc/config/aarch64/arm_neon.h b/gcc/config/aarch64/arm_neon.h
index 201e8de2621..6c35eb722ae 100644
--- a/gcc/config/aarch64/arm_neon.h
+++ b/gcc/config/aarch64/arm_neon.h
@@ -441,34 +441,6 @@ vraddhn_high_u64 (uint32x2_t __a, uint64x2_t __b, 
uint64x2_t __c)
   return __builtin_aarch64_raddhn2v2di_uuuu (__a, __b, __c);
 }
 
-__extension__ extern __inline float32x2_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vdiv_f32 (float32x2_t __a, float32x2_t __b)
-{
-  return __a / __b;
-}
-
-__extension__ extern __inline float64x1_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vdiv_f64 (float64x1_t __a, float64x1_t __b)
-{
-  return __a / __b;
-}
-
-__extension__ extern __inline float32x4_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vdivq_f32 (float32x4_t __a, float32x4_t __b)
-{
-  return __a / __b;
-}
-
-__extension__ extern __inline float64x2_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vdivq_f64 (float64x2_t __a, float64x2_t __b)
-{
-  return __a / __b;
-}
-
 __extension__ extern __inline poly8x8_t
 __attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
 vmul_p8 (poly8x8_t __a, poly8x8_t __b)
@@ -18244,20 +18216,6 @@ vcvtq_n_u16_f16 (float16x8_t __a, const int __b)
   return __builtin_aarch64_fcvtzuv8hf_uss (__a, __b);
 }
 
-__extension__ extern __inline float16x4_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vdiv_f16 (float16x4_t __a, float16x4_t __b)
-{
-  return __a / __b;
-}
-
-__extension__ extern __inline float16x8_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vdivq_f16 (float16x8_t __a, float16x8_t __b)
-{
-  return __a / __b;
-}
-
 __extension__ extern __inline float16x4_t
 __attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
 vmax_f16 (float16x4_t __a, float16x4_t __b)
diff --git a/gcc/testsuite/gcc.target/aarch64/neon/vdiv.c 
b/gcc/testsuite/gcc.target/aarch64/neon/vdiv.c
new file mode 100644
index 00000000000..ef675ca82f3
--- /dev/null
+++ b/gcc/testsuite/gcc.target/aarch64/neon/vdiv.c
@@ -0,0 +1,46 @@
+/* { dg-do compile } */
+/* { dg-final { check-function-bodies "**" "" } } */
+
+#include "arm_neon_test.h"
+
+/*
+** test_vdiv_f32:
+** fdiv        v0\.2s, v0\.2s, v1\.2s
+** ret
+*/
+TEST_UNIFORM_BINARY (vdiv_f32, float32x2_t)
+
+/*
+** test_vdivq_f32:
+** fdiv        v0\.4s, v0\.4s, v1\.4s
+** ret
+*/
+TEST_UNIFORM_BINARY (vdivq_f32, float32x4_t)
+
+/*
+** test_vdiv_f64:
+** fdiv        d0, d0, d1
+** ret
+*/
+TEST_UNIFORM_BINARY (vdiv_f64, float64x1_t)
+
+/*
+** test_vdivq_f64:
+** fdiv        v0\.2d, v0\.2d, v1\.2d
+** ret
+*/
+TEST_UNIFORM_BINARY (vdivq_f64, float64x2_t)
+
+/*
+** test_vdiv_f16:
+** fdiv        v0\.4h, v0\.4h, v1\.4h
+** ret
+*/
+TEST_UNIFORM_BINARY (vdiv_f16, float16x4_t)
+
+/*
+** test_vdivq_f16:
+** fdiv        v0\.8h, v0\.8h, v1\.8h
+** ret
+*/
+TEST_UNIFORM_BINARY (vdivq_f16, float16x8_t)
-- 
2.56.0

Reply via email to