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     |  4 ++
 .../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, 58 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 2eab81c6bcc..c367ed7a937 100644
--- a/gcc/config/aarch64/aarch64-neon-builtins-base.cc
+++ b/gcc/config/aarch64/aarch64-neon-builtins-base.cc
@@ -818,6 +818,10 @@ NEON_FUNCTION (vsubq, gimple_arith, (MINUS_EXPR))
 NEON_FUNCTION (vmul,  gimple_arith, (MULT_EXPR))
 NEON_FUNCTION (vmulq, gimple_arith, (MULT_EXPR))
 
+// Division
+NEON_FUNCTION (vdiv,  gimple_arith, (RDIV_EXPR))
+NEON_FUNCTION (vdivq, gimple_arith, (RDIV_EXPR))
+
 // Bitwise operations
 NEON_FUNCTION (vand,   gimple_expr,    (BIT_AND_EXPR))
 NEON_FUNCTION (vandq,  gimple_expr,    (BIT_AND_EXPR))
diff --git a/gcc/config/aarch64/aarch64-neon-builtins-base.def 
b/gcc/config/aarch64/aarch64-neon-builtins-base.def
index c8a67619055..828dd0c7e80 100644
--- a/gcc/config/aarch64/aarch64-neon-builtins-base.def
+++ b/gcc/config/aarch64/aarch64-neon-builtins-base.def
@@ -82,6 +82,10 @@ DEF_NEON_FUNCTION (vmul,  bhs_integer, ("D0,D0,D0"))
 DEF_NEON_FUNCTION (vmulq, bhs_integer, ("Q0,Q0,Q0"))
 DEF_NEON_FUNCTION (vmul,  sd_float,    ("D0,D0,D0"))
 DEF_NEON_FUNCTION (vmulq, sd_float,    ("Q0,Q0,Q0"))
+
+// 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)
@@ -97,6 +101,10 @@ DEF_NEON_FUNCTION (vsubq, h_float, ("Q0,Q0,Q0"))
 // Multiplication
 DEF_NEON_FUNCTION (vmul,  h_float, ("D0,D0,D0"))
 DEF_NEON_FUNCTION (vmulq, h_float, ("Q0,Q0,Q0"))
+
+// Division
+DEF_NEON_FUNCTION (vdiv,  h_float, ("D0,D0,D0"))
+DEF_NEON_FUNCTION (vdivq, h_float, ("Q0,Q0,Q0"))
 #undef REQUIRED_EXTENSIONS
 
 // Bitwise operations
diff --git a/gcc/config/aarch64/arm_neon.h b/gcc/config/aarch64/arm_neon.h
index 1abdd525d07..b896fed7e3f 100644
--- a/gcc/config/aarch64/arm_neon.h
+++ b/gcc/config/aarch64/arm_neon.h
@@ -609,34 +609,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)
@@ -20093,20 +20065,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.51.0

Reply via email to