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