> On 28 Apr 2025, at 21:29, Ayan Shafqat <ayan.x.shaf...@gmail.com> wrote: > > Rebased with gcc 15.1 > > This patch introduces two new inline functions, __sqrt and __sqrtf, in > arm_acle.h for Aarch64 targets. These functions wrap the new builtins > __builtin_aarch64_sqrtdf and __builtin_aarch64_sqrtsf, respectively, > providing direct access to hardware instructions without relying on the > standard math library or optimization levels. > > This patch also introduces acle_sqrt.c in the AArch64 testsuite, > verifying that the new __sqrt and __sqrtf intrinsics emit the expected > fsqrt instructions for double and float arguments. > > Coverage for new intrinsics ensures that __sqrt and __sqrtf are > correctly expanded to hardware instructions and do not fall back to > library calls, regardless of optimization levels. > > gcc/ChangeLog: > > * config/aarch64/arm_acle.h (__sqrt, __sqrtf): New function. > > gcc/testsuite/ChangeLog: > > * gcc.target/aarch64/acle/acle_sqrt.c: New test. > > Signed-off-by: Ayan Shafqat <ayan.x.shaf...@gmail.com> > --- > gcc/config/aarch64/arm_acle.h | 14 ++++++++++++++ > .../gcc.target/aarch64/acle/acle_sqrt.c | 19 +++++++++++++++++++ > 2 files changed, 33 insertions(+) > create mode 100644 gcc/testsuite/gcc.target/aarch64/acle/acle_sqrt.c > > diff --git a/gcc/config/aarch64/arm_acle.h b/gcc/config/aarch64/arm_acle.h > index d9e2401ea9f..507b6e72bcb 100644 > --- a/gcc/config/aarch64/arm_acle.h > +++ b/gcc/config/aarch64/arm_acle.h > @@ -118,6 +118,20 @@ __revl (unsigned long __value) > return __rev (__value); > } > > +__extension__ extern __inline double > +__attribute__ ((__always_inline__, __gnu_inline__, __artificial__)) > +__sqrt (double __x) > +{ > + return __builtin_aarch64_sqrtdf (__x); > +} > + > +__extension__ extern __inline float > +__attribute__ ((__always_inline__, __gnu_inline__, __artificial__)) > +__sqrtf (float __x) > +{ > + return __builtin_aarch64_sqrtsf (__x); > +}
I was going to ask why not use the standard __buuiltin_sqrt builtins but I guess those don’t guarantee that we avoid a libcall in all cases. So this is ok. Do you want me to push the patches for you? Thanks, Kyrill > + > #pragma GCC push_options > #pragma GCC target ("+nothing+jscvt") > __extension__ extern __inline int32_t > diff --git a/gcc/testsuite/gcc.target/aarch64/acle/acle_sqrt.c > b/gcc/testsuite/gcc.target/aarch64/acle/acle_sqrt.c > new file mode 100644 > index 00000000000..482351fa7e6 > --- /dev/null > +++ b/gcc/testsuite/gcc.target/aarch64/acle/acle_sqrt.c > @@ -0,0 +1,19 @@ > +/* { dg-do compile } */ > +/* { dg-options "-O2" } */ > + > +#include "arm_acle.h" > + > +double > +test_acle_sqrt (double x) > +{ > + return __sqrt (x); > +} > + > +float > +test_acle_sqrtf (float x) > +{ > + return __sqrtf (x); > +} > + > +/* { dg-final { scan-assembler-times "fsqrt\td\[0-9\]" 1 } } */ > +/* { dg-final { scan-assembler-times "fsqrt\ts\[0-9\]" 1 } } */ > -- > 2.43.0 >