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)

Reply via email to