[10/13] s390: Use sqrt{f} builtin
Commit Message
Checked on s390x-linux-gnu.
---
sysdeps/s390/fpu/e_sqrt.c | 30 -----------------------
sysdeps/s390/fpu/e_sqrtf.c | 30 -----------------------
sysdeps/s390/fpu/math-use-builtins-sqrt.h | 4 +++
3 files changed, 4 insertions(+), 60 deletions(-)
delete mode 100644 sysdeps/s390/fpu/e_sqrt.c
delete mode 100644 sysdeps/s390/fpu/e_sqrtf.c
create mode 100644 sysdeps/s390/fpu/math-use-builtins-sqrt.h
Comments
Hi Adhemerval,
my last tests with the sqrt builtin on s390x showed that gcc emits a
call to libm which would lead to an infinite loop:
if (x < 0)
sqrt(x)
else
sqdbr-instruction
Can you have a look into the generated code?
I will also apply your series and perform some test-runs. (next week as
I'll be on vacation the next days)
Then I'll also have a look at the fma-builtins. But those should be fine
for float and double.
Bye.
Stefan
On 6/9/20 11:32 PM, Adhemerval Zanella via Libc-alpha wrote:
> Checked on s390x-linux-gnu.
> ---
> sysdeps/s390/fpu/e_sqrt.c | 30 -----------------------
> sysdeps/s390/fpu/e_sqrtf.c | 30 -----------------------
> sysdeps/s390/fpu/math-use-builtins-sqrt.h | 4 +++
> 3 files changed, 4 insertions(+), 60 deletions(-)
> delete mode 100644 sysdeps/s390/fpu/e_sqrt.c
> delete mode 100644 sysdeps/s390/fpu/e_sqrtf.c
> create mode 100644 sysdeps/s390/fpu/math-use-builtins-sqrt.h
>
> diff --git a/sysdeps/s390/fpu/e_sqrt.c b/sysdeps/s390/fpu/e_sqrt.c
> deleted file mode 100644
> index 484c6aae95..0000000000
> --- a/sysdeps/s390/fpu/e_sqrt.c
> +++ /dev/null
> @@ -1,30 +0,0 @@
> -/* Copyright (C) 2004-2020 Free Software Foundation, Inc.
> - Contributed by Martin Schwidefsky <schwidefsky@de.ibm.com>.
> - This file is part of the GNU C Library.
> -
> - The GNU C Library is free software; you can redistribute it and/or
> - modify it under the terms of the GNU Lesser General Public
> - License as published by the Free Software Foundation; either
> - version 2.1 of the License, or (at your option) any later version.
> -
> - The GNU C Library is distributed in the hope that it will be useful,
> - but WITHOUT ANY WARRANTY; without even the implied warranty of
> - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
> - Lesser General Public License for more details.
> -
> - You should have received a copy of the GNU Lesser General Public
> - License along with the GNU C Library; if not, see
> - <https://www.gnu.org/licenses/>. */
> -
> -#include <math_private.h>
> -#include <libm-alias-finite.h>
> -
> -double
> -__ieee754_sqrt (double x)
> -{
> - double res;
> -
> - __asm__ ( "sqdbr %0,%1" : "=f" (res) : "f" (x) );
> - return res;
> -}
> -libm_alias_finite (__ieee754_sqrt, __sqrt)
> diff --git a/sysdeps/s390/fpu/e_sqrtf.c b/sysdeps/s390/fpu/e_sqrtf.c
> deleted file mode 100644
> index bce49c90f1..0000000000
> --- a/sysdeps/s390/fpu/e_sqrtf.c
> +++ /dev/null
> @@ -1,30 +0,0 @@
> -/* Copyright (C) 2004-2020 Free Software Foundation, Inc.
> - Contributed by Martin Schwidefsky <schwidefsky@de.ibm.com>.
> - This file is part of the GNU C Library.
> -
> - The GNU C Library is free software; you can redistribute it and/or
> - modify it under the terms of the GNU Lesser General Public
> - License as published by the Free Software Foundation; either
> - version 2.1 of the License, or (at your option) any later version.
> -
> - The GNU C Library is distributed in the hope that it will be useful,
> - but WITHOUT ANY WARRANTY; without even the implied warranty of
> - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
> - Lesser General Public License for more details.
> -
> - You should have received a copy of the GNU Lesser General Public
> - License along with the GNU C Library; if not, see
> - <https://www.gnu.org/licenses/>. */
> -
> -#include <math_private.h>
> -#include <libm-alias-finite.h>
> -
> -float
> -__ieee754_sqrtf (float x)
> -{
> - float res;
> -
> - __asm__ ( "sqebr %0,%1" : "=f" (res) : "f" (x) );
> - return res;
> -}
> -libm_alias_finite (__ieee754_sqrtf, __sqrtf)
> diff --git a/sysdeps/s390/fpu/math-use-builtins-sqrt.h b/sysdeps/s390/fpu/math-use-builtins-sqrt.h
> new file mode 100644
> index 0000000000..e94c915ba6
> --- /dev/null
> +++ b/sysdeps/s390/fpu/math-use-builtins-sqrt.h
> @@ -0,0 +1,4 @@
> +#define USE_SQRT_BUILTIN 1
> +#define USE_SQRTF_BUILTIN 1
> +#define USE_SQRTL_BUILTIN 0
> +#define USE_SQRTF128_BUILTIN 0
>
The 06/10/2020 17:39, Stefan Liebler via Libc-alpha wrote:
> Hi Adhemerval,
>
> my last tests with the sqrt builtin on s390x showed that gcc emits a
> call to libm which would lead to an infinite loop:
> if (x < 0)
> sqrt(x)
> else
> sqdbr-instruction
in general the builtins based implementation
must be compiled with -fno-math-errno if
they have error conditions otherwise math-errno
may cause the compiler not to do a single
instruction inline like in this sqrt case.
>
> Can you have a look into the generated code?
> I will also apply your series and perform some test-runs. (next week as
> I'll be on vacation the next days)
>
> Then I'll also have a look at the fma-builtins. But those should be fine
> for float and double.
>
> Bye.
> Stefan
>
> On 6/9/20 11:32 PM, Adhemerval Zanella via Libc-alpha wrote:
> > Checked on s390x-linux-gnu.
> > ---
> > sysdeps/s390/fpu/e_sqrt.c | 30 -----------------------
> > sysdeps/s390/fpu/e_sqrtf.c | 30 -----------------------
> > sysdeps/s390/fpu/math-use-builtins-sqrt.h | 4 +++
> > 3 files changed, 4 insertions(+), 60 deletions(-)
> > delete mode 100644 sysdeps/s390/fpu/e_sqrt.c
> > delete mode 100644 sysdeps/s390/fpu/e_sqrtf.c
> > create mode 100644 sysdeps/s390/fpu/math-use-builtins-sqrt.h
> >
> > diff --git a/sysdeps/s390/fpu/e_sqrt.c b/sysdeps/s390/fpu/e_sqrt.c
> > deleted file mode 100644
> > index 484c6aae95..0000000000
> > --- a/sysdeps/s390/fpu/e_sqrt.c
> > +++ /dev/null
> > @@ -1,30 +0,0 @@
> > -/* Copyright (C) 2004-2020 Free Software Foundation, Inc.
> > - Contributed by Martin Schwidefsky <schwidefsky@de.ibm.com>.
> > - This file is part of the GNU C Library.
> > -
> > - The GNU C Library is free software; you can redistribute it and/or
> > - modify it under the terms of the GNU Lesser General Public
> > - License as published by the Free Software Foundation; either
> > - version 2.1 of the License, or (at your option) any later version.
> > -
> > - The GNU C Library is distributed in the hope that it will be useful,
> > - but WITHOUT ANY WARRANTY; without even the implied warranty of
> > - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
> > - Lesser General Public License for more details.
> > -
> > - You should have received a copy of the GNU Lesser General Public
> > - License along with the GNU C Library; if not, see
> > - <https://www.gnu.org/licenses/>. */
> > -
> > -#include <math_private.h>
> > -#include <libm-alias-finite.h>
> > -
> > -double
> > -__ieee754_sqrt (double x)
> > -{
> > - double res;
> > -
> > - __asm__ ( "sqdbr %0,%1" : "=f" (res) : "f" (x) );
> > - return res;
> > -}
> > -libm_alias_finite (__ieee754_sqrt, __sqrt)
> > diff --git a/sysdeps/s390/fpu/e_sqrtf.c b/sysdeps/s390/fpu/e_sqrtf.c
> > deleted file mode 100644
> > index bce49c90f1..0000000000
> > --- a/sysdeps/s390/fpu/e_sqrtf.c
> > +++ /dev/null
> > @@ -1,30 +0,0 @@
> > -/* Copyright (C) 2004-2020 Free Software Foundation, Inc.
> > - Contributed by Martin Schwidefsky <schwidefsky@de.ibm.com>.
> > - This file is part of the GNU C Library.
> > -
> > - The GNU C Library is free software; you can redistribute it and/or
> > - modify it under the terms of the GNU Lesser General Public
> > - License as published by the Free Software Foundation; either
> > - version 2.1 of the License, or (at your option) any later version.
> > -
> > - The GNU C Library is distributed in the hope that it will be useful,
> > - but WITHOUT ANY WARRANTY; without even the implied warranty of
> > - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
> > - Lesser General Public License for more details.
> > -
> > - You should have received a copy of the GNU Lesser General Public
> > - License along with the GNU C Library; if not, see
> > - <https://www.gnu.org/licenses/>. */
> > -
> > -#include <math_private.h>
> > -#include <libm-alias-finite.h>
> > -
> > -float
> > -__ieee754_sqrtf (float x)
> > -{
> > - float res;
> > -
> > - __asm__ ( "sqebr %0,%1" : "=f" (res) : "f" (x) );
> > - return res;
> > -}
> > -libm_alias_finite (__ieee754_sqrtf, __sqrtf)
> > diff --git a/sysdeps/s390/fpu/math-use-builtins-sqrt.h b/sysdeps/s390/fpu/math-use-builtins-sqrt.h
> > new file mode 100644
> > index 0000000000..e94c915ba6
> > --- /dev/null
> > +++ b/sysdeps/s390/fpu/math-use-builtins-sqrt.h
> > @@ -0,0 +1,4 @@
> > +#define USE_SQRT_BUILTIN 1
> > +#define USE_SQRTF_BUILTIN 1
> > +#define USE_SQRTL_BUILTIN 0
> > +#define USE_SQRTF128_BUILTIN 0
> >
>
--
On 10/06/2020 12:45, Szabolcs Nagy wrote:
> The 06/10/2020 17:39, Stefan Liebler via Libc-alpha wrote:
>> Hi Adhemerval,
>>
>> my last tests with the sqrt builtin on s390x showed that gcc emits a
>> call to libm which would lead to an infinite loop:
>> if (x < 0)
>> sqrt(x)
>> else
>> sqdbr-instruction
>
> in general the builtins based implementation
> must be compiled with -fno-math-errno if
> they have error conditions otherwise math-errno
> may cause the compiler not to do a single
> instruction inline like in this sqrt case.
Afaik libm is already build with -fno-math-errno with:
Makeconfig:849:+extra-math-flags = $(if $(filter libm,$(in-module)),-fno-math-errno,-fmath-errno)
And for some implementation (either default or compat ones)
we have specific wrapper (for instance w_sqrt_*) to handle
errno.
On 6/10/20 5:59 PM, Adhemerval Zanella via Libc-alpha wrote:
>
>
> On 10/06/2020 12:45, Szabolcs Nagy wrote:
>> The 06/10/2020 17:39, Stefan Liebler via Libc-alpha wrote:
>>> Hi Adhemerval,
>>>
>>> my last tests with the sqrt builtin on s390x showed that gcc emits a
>>> call to libm which would lead to an infinite loop:
>>> if (x < 0)
>>> sqrt(x)
>>> else
>>> sqdbr-instruction
>>
>> in general the builtins based implementation
>> must be compiled with -fno-math-errno if
>> they have error conditions otherwise math-errno
>> may cause the compiler not to do a single
>> instruction inline like in this sqrt case.
>
> Afaik libm is already build with -fno-math-errno with:
>
> Makeconfig:849:+extra-math-flags = $(if $(filter libm,$(in-module)),-fno-math-errno,-fmath-errno)
>
> And for some implementation (either default or compat ones)
> we have specific wrapper (for instance w_sqrt_*) to handle
> errno.
>
Hi Adhemerval,
I've applied your patches and successfully run some test builds on
s390x/s390. Using the builtins for sqrt and sqrtf works fine.
This patch is okay.
Thanks,
Stefan
deleted file mode 100644
@@ -1,30 +0,0 @@
-/* Copyright (C) 2004-2020 Free Software Foundation, Inc.
- Contributed by Martin Schwidefsky <schwidefsky@de.ibm.com>.
- This file is part of the GNU C Library.
-
- The GNU C Library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- The GNU C Library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with the GNU C Library; if not, see
- <https://www.gnu.org/licenses/>. */
-
-#include <math_private.h>
-#include <libm-alias-finite.h>
-
-double
-__ieee754_sqrt (double x)
-{
- double res;
-
- __asm__ ( "sqdbr %0,%1" : "=f" (res) : "f" (x) );
- return res;
-}
-libm_alias_finite (__ieee754_sqrt, __sqrt)
deleted file mode 100644
@@ -1,30 +0,0 @@
-/* Copyright (C) 2004-2020 Free Software Foundation, Inc.
- Contributed by Martin Schwidefsky <schwidefsky@de.ibm.com>.
- This file is part of the GNU C Library.
-
- The GNU C Library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- The GNU C Library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with the GNU C Library; if not, see
- <https://www.gnu.org/licenses/>. */
-
-#include <math_private.h>
-#include <libm-alias-finite.h>
-
-float
-__ieee754_sqrtf (float x)
-{
- float res;
-
- __asm__ ( "sqebr %0,%1" : "=f" (res) : "f" (x) );
- return res;
-}
-libm_alias_finite (__ieee754_sqrtf, __sqrtf)
new file mode 100644
@@ -0,0 +1,4 @@
+#define USE_SQRT_BUILTIN 1
+#define USE_SQRTF_BUILTIN 1
+#define USE_SQRTL_BUILTIN 0
+#define USE_SQRTF128_BUILTIN 0