[10/13] s390: Use sqrt{f} builtin

Message ID 20200609213301.3591135-10-adhemerval.zanella@linaro.org
State Committed
Commit 3ca05a8e9e8f13d93bd27ceb998075bdcd63d9f9
Headers
Series [01/13] math: Decompose math-use-builtins.h |

Commit Message

Adhemerval Zanella June 9, 2020, 9:32 p.m. UTC
  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

Stefan Liebler June 10, 2020, 3:39 p.m. UTC | #1
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
>
  
Szabolcs Nagy June 10, 2020, 3:45 p.m. UTC | #2
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
> > 
> 

--
  
Adhemerval Zanella June 10, 2020, 3:59 p.m. UTC | #3
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.
  
Stefan Liebler June 16, 2020, 10:13 a.m. UTC | #4
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
  

Patch

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