https://gcc.gnu.org/g:78ed779c28d1254e08b6c0a758bedfc8fcb1747c
commit r17-4915-g78ed779c28d1254e08b6c0a758bedfc8fcb1747c Author: Dhruv Chawla <[email protected]> Date: Tue Aug 25 08:50:53 2026 +0000 aarch64: Port NEON square-root intrinsics to pragma-based framework Port the vsqrt set of intrinsics to the pragma-based framework. Bootstrapped and regtested on aarch64-linux-gnu. Signed-off-by: Dhruv Chawla <[email protected]> gcc/ChangeLog: * config/aarch64/aarch64-neon-builtins-base.cc (vsqrt, vsqrtq): New function bases. * config/aarch64/aarch64-neon-builtins-base.def (vsqrt, vsqrtq): New function groups. * config/aarch64/arm_neon.h (vsqrt_f32, vsqrt_f64, vsqrtq_f32, vsqrtq_f64, vsqrt_f16, vsqrtq_f16): Delete functions. gcc/testsuite/ChangeLog: * gcc.target/aarch64/neon/vsqrt.c: New test. Diff: --- gcc/config/aarch64/aarch64-neon-builtins-base.cc | 3 ++ gcc/config/aarch64/aarch64-neon-builtins-base.def | 12 ++++++ gcc/config/aarch64/arm_neon.h | 43 --------------------- gcc/testsuite/gcc.target/aarch64/neon/vsqrt.c | 46 +++++++++++++++++++++++ 4 files changed, 61 insertions(+), 43 deletions(-) diff --git a/gcc/config/aarch64/aarch64-neon-builtins-base.cc b/gcc/config/aarch64/aarch64-neon-builtins-base.cc index 3a5ba21eb61d..dc06abd5e0dc 100644 --- a/gcc/config/aarch64/aarch64-neon-builtins-base.cc +++ b/gcc/config/aarch64/aarch64-neon-builtins-base.cc @@ -797,6 +797,9 @@ NEON_FUNCTION (vminnmv, vminnmvq, gimple_ifn, (IFN_REDUC_FMIN)) NEON_FUNCTION (vhadd, vhaddq, gimple_ifn, (IFN_AVG_FLOOR)) NEON_FUNCTION (vrhadd, vrhaddq, gimple_ifn, (IFN_AVG_CEIL)) +// Square root +NEON_FUNCTION (vsqrt, vsqrtq, gimple_ifn, (IFN_SQRT)) + // Bitwise operations NEON_FUNCTION (vand, vandq, gimple_expr, (BIT_AND_EXPR)) NEON_FUNCTION (vbic, vbicq, gimple_not_rhs, (BIT_AND_EXPR)) diff --git a/gcc/config/aarch64/aarch64-neon-builtins-base.def b/gcc/config/aarch64/aarch64-neon-builtins-base.def index 095932c85343..783c9ddababc 100644 --- a/gcc/config/aarch64/aarch64-neon-builtins-base.def +++ b/gcc/config/aarch64/aarch64-neon-builtins-base.def @@ -122,6 +122,18 @@ DEF_NEON_FUNCTION (vrhadd, bhs_integer, ("D0,D0,D0")) DEF_NEON_FUNCTION (vrhaddq, bhs_integer, ("Q0,Q0,Q0")) #undef REQUIRED_EXTENSIONS +// Square root +#define REQUIRED_EXTENSIONS nonstreaming_only (AARCH64_FL_SIMD) +DEF_NEON_FUNCTION (vsqrt, sd_float, ("D0,D0")) +DEF_NEON_FUNCTION (vsqrtq, sd_float, ("Q0,Q0")) +#undef REQUIRED_EXTENSIONS + +// Square root (FP16) +#define REQUIRED_EXTENSIONS nonstreaming_only (AARCH64_FL_SIMD | AARCH64_FL_F16) +DEF_NEON_FUNCTION (vsqrt, h_float, ("D0,D0")) +DEF_NEON_FUNCTION (vsqrtq, h_float, ("Q0,Q0")) +#undef REQUIRED_EXTENSIONS + // Bitwise operations #define REQUIRED_EXTENSIONS nonstreaming_only (AARCH64_FL_SIMD) DEF_NEON_FUNCTION (vand, all_integer, ("D0,D0,D0")) diff --git a/gcc/config/aarch64/arm_neon.h b/gcc/config/aarch64/arm_neon.h index 0edccdec49b2..be64c47071d3 100644 --- a/gcc/config/aarch64/arm_neon.h +++ b/gcc/config/aarch64/arm_neon.h @@ -16574,35 +16574,6 @@ vsqaddd_u64 (uint64_t __a, int64_t __b) return __builtin_aarch64_usqadddi_uus (__a, __b); } -/* vsqrt */ -__extension__ extern __inline float32x2_t -__attribute__ ((__always_inline__, __gnu_inline__, __artificial__)) -vsqrt_f32 (float32x2_t __a) -{ - return __builtin_aarch64_sqrtv2sf (__a); -} - -__extension__ extern __inline float32x4_t -__attribute__ ((__always_inline__, __gnu_inline__, __artificial__)) -vsqrtq_f32 (float32x4_t __a) -{ - return __builtin_aarch64_sqrtv4sf (__a); -} - -__extension__ extern __inline float64x1_t -__attribute__ ((__always_inline__, __gnu_inline__, __artificial__)) -vsqrt_f64 (float64x1_t __a) -{ - return (float64x1_t) { __builtin_aarch64_sqrtdf (__a[0]) }; -} - -__extension__ extern __inline float64x2_t -__attribute__ ((__always_inline__, __gnu_inline__, __artificial__)) -vsqrtq_f64 (float64x2_t __a) -{ - return __builtin_aarch64_sqrtv2df (__a); -} - /* vsra */ __extension__ extern __inline int8x8_t @@ -19182,20 +19153,6 @@ vrsqrteq_f16 (float16x8_t __a) return __builtin_aarch64_rsqrtev8hf (__a); } -__extension__ extern __inline float16x4_t -__attribute__ ((__always_inline__, __gnu_inline__, __artificial__)) -vsqrt_f16 (float16x4_t __a) -{ - return __builtin_aarch64_sqrtv4hf (__a); -} - -__extension__ extern __inline float16x8_t -__attribute__ ((__always_inline__, __gnu_inline__, __artificial__)) -vsqrtq_f16 (float16x8_t __a) -{ - return __builtin_aarch64_sqrtv8hf (__a); -} - /* ARMv8.2-A FP16 two operands vector intrinsics. */ __extension__ extern __inline float16x4_t diff --git a/gcc/testsuite/gcc.target/aarch64/neon/vsqrt.c b/gcc/testsuite/gcc.target/aarch64/neon/vsqrt.c new file mode 100644 index 000000000000..3b623f3ae568 --- /dev/null +++ b/gcc/testsuite/gcc.target/aarch64/neon/vsqrt.c @@ -0,0 +1,46 @@ +/* { dg-do compile } */ +/* { dg-final { check-function-bodies "**" "" } } */ + +#include "arm_neon_test.h" + +/* +** test_vsqrt_f16: +** fsqrt v0.4h, v0.4h +** ret +*/ +TEST_UNIFORM_UNARY (vsqrt_f16, float16x4_t) + +/* +** test_vsqrt_f32: +** fsqrt v0.2s, v0.2s +** ret +*/ +TEST_UNIFORM_UNARY (vsqrt_f32, float32x2_t) + +/* +** test_vsqrt_f64: +** fsqrt d0, d0 +** ret +*/ +TEST_UNIFORM_UNARY (vsqrt_f64, float64x1_t) + +/* +** test_vsqrtq_f16: +** fsqrt v0.8h, v0.8h +** ret +*/ +TEST_UNIFORM_UNARY (vsqrtq_f16, float16x8_t) + +/* +** test_vsqrtq_f32: +** fsqrt v0.4s, v0.4s +** ret +*/ +TEST_UNIFORM_UNARY (vsqrtq_f32, float32x4_t) + +/* +** test_vsqrtq_f64: +** fsqrt v0.2d, v0.2d +** ret +*/ +TEST_UNIFORM_UNARY (vsqrtq_f64, float64x2_t)
