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