benchtests: Run _Float128 tests only on architectures that support it
Commit Message
From: Arjun Shankar <arjun@redhat.com>
__float128 is a non-standard name and is not available on some architectures
(like aarch64 or s390x) even though they may support the standard _Float128
type. Other architectures (like armv7) don't support quad-precision
floating-point operations at all.
This commit adds a configure check for quad-precision FP support and runs
the corresponding benchtests only on architectures that support it. It also
replaces references to __float128 with _Float128.
---
Tested on armv7hl, i686, x86_64, aarch64, ppc64le, and s390x.
benchtests/Makefile | 6 +++++-
benchtests/expf128-inputs | 4 ++--
benchtests/powf128-inputs | 4 ++--
benchtests/sinf128-inputs | 4 ++--
configure | 24 ++++++++++++++++++++++++
configure.ac | 15 +++++++++++++++
6 files changed, 50 insertions(+), 7 deletions(-)
Comments
Dear Arjun,
some comments on your patch:
* the changes to benchtests/Makefile and benchtests/*f128-inputs look ok to me
* for configure.ac I'm not fluent enough in the autotools
* I wonder why you also patch configure, isn't this file automatically
generated?
* finally "find . -type f -exec grep \-l __float128 {} \;" finds several other
instances of __float128 (sysdeps/x86_64/fpu/math-tests-snan.h for example).
Should some of those be changed to _Float128 too?
Best regards,
Paul
* Paul Zimmermann:
> * I wonder why you also patch configure, isn't this file automatically
> generated?
It's checked into the repository, so it shows up in the diff.
> * finally "find . -type f -exec grep \-l __float128 {} \;" finds several other
> instances of __float128 (sysdeps/x86_64/fpu/math-tests-snan.h for example).
> Should some of those be changed to _Float128 too?
I think it's mostly comments or architecture-specific code. For x86, we
know that __float128 exists, so that's not actually a problem.
Thanks,
Florian
* Arjun Shankar:
> diff --git a/configure.ac b/configure.ac
> index 93e68fb696..7ee79162be 100644
> --- a/configure.ac
> +++ b/configure.ac
> @@ -1821,6 +1821,21 @@ libc_cv_pie_default=$libc_cv_cc_pie_default
> AC_SUBST(libc_cv_cc_pie_default)
> AC_SUBST(libc_cv_pie_default)
>
> +AC_CACHE_CHECK([whether quad-precision floating-point is supported],
> +libc_cv_have_qp_float, [libc_cv_have_qp_float=yes
> +cat > conftest.c <<EOF
> +#include <math.h>
> +#if __HAVE_FLOAT128
> +# error quad-precision floating-point is supported
> +#endif
> +EOF
> +if eval "${CC-cc} -S conftest.c 2>&AS_MESSAGE_LOG_FD 1>&AS_MESSAGE_LOG_FD"; then
> + libc_cv_have_qp_float=no
> +fi
> +rm -f conftest.*])
> +AC_SUBST(libc_cv_have_qp_float)
> +LIBC_CONFIG_VAR([have-qp-float], [$libc_cv_have_qp_float])
This configure test does not run against <math.h> from the glibc tree,
so its result is not correct.
Please try adding the benchtests via a fragment in
sysdeps/ieee754/float128/Makefile. I think this won't need additional
configure checks.
Thanks,
Florian
On Thu, 17 Sep 2020, Florian Weimer via Libc-alpha wrote:
> Please try adding the benchtests via a fragment in
> sysdeps/ieee754/float128/Makefile. I think this won't need additional
> configure checks.
If you want these benchmarks only if _Float128 has a different format from
long double, you can use the existing makefile variable $(float128-fcts).
If you want to run them also when _Float128 has the same format as long
double, use $(float128-alias-fcts) as well. See math/Makefile for example
usage.
* Joseph Myers:
> On Thu, 17 Sep 2020, Florian Weimer via Libc-alpha wrote:
>
>> Please try adding the benchtests via a fragment in
>> sysdeps/ieee754/float128/Makefile. I think this won't need additional
>> configure checks.
>
> If you want these benchmarks only if _Float128 has a different format from
> long double, you can use the existing makefile variable $(float128-fcts).
> If you want to run them also when _Float128 has the same format as long
> double, use $(float128-alias-fcts) as well. See math/Makefile for example
> usage.
In this case, the ifeq Makefile conditional should be added to
benchtests/Makefile, right?
Thanks,
Florian
On Thu, 17 Sep 2020, Florian Weimer via Libc-alpha wrote:
> * Joseph Myers:
>
> > On Thu, 17 Sep 2020, Florian Weimer via Libc-alpha wrote:
> >
> >> Please try adding the benchtests via a fragment in
> >> sysdeps/ieee754/float128/Makefile. I think this won't need additional
> >> configure checks.
> >
> > If you want these benchmarks only if _Float128 has a different format from
> > long double, you can use the existing makefile variable $(float128-fcts).
> > If you want to run them also when _Float128 has the same format as long
> > double, use $(float128-alias-fcts) as well. See math/Makefile for example
> > usage.
>
> In this case, the ifeq Makefile conditional should be added to
> benchtests/Makefile, right?
ifeq, or any of the other mechanisms used such as $(var-$(float128-fcts)).
@@ -25,7 +25,11 @@ bench-math := acos acosh asin asinh atan atanh cos cosh exp exp2 log log2 \
modf pow rint sin sincos sinh sqrt tan tanh fmin fmax fminf \
fmaxf powf trunc truncf roundeven roundevenf expf exp2f logf \
log2f sincosf sinf cosf isnan isinf isfinite hypot logb logbf \
- exp10f expf128 powf128 sinf128
+ exp10f
+
+ifeq (yes,$(have-qp-float))
+bench-math += expf128 powf128 sinf128
+endif
bench-pthread := pthread_once thread_create
@@ -1,6 +1,6 @@
## includes: math.h
-## args: __float128
-## ret: __float128
+## args: _Float128
+## ret: _Float128
# Random inputs in [-10,10]
## name: workload-random.wrf
0x4.e6f9d6da10d9a422942a89cdfa1p+0L
@@ -1,6 +1,6 @@
## includes: math.h
-## args: __float128:__float128
-## ret: __float128
+## args: _Float128:_Float128
+## ret: _Float128
# Random inputs in [-10,10] such that x and y are not both negative
## name: workload-random.wrf
0x8.130b31ed5288656428a29cead83p+0L, -0x6.e7ead09b7877a118813b50cfb3c8p+0L
@@ -1,6 +1,6 @@
## includes: math.h
-## args: __float128
-## ret: __float128
+## args: _Float128
+## ret: _Float128
# Random inputs in [-10,10]
## name: workload-random.wrf
0x4.e6f9d6da10d9a422942a89cdfa1p+0
@@ -595,6 +595,7 @@ DEFINES
static_nss
profile
libc_cv_multidir
+libc_cv_have_qp_float
libc_cv_pie_default
libc_cv_cc_pie_default
libc_cv_pic_default
@@ -6805,6 +6806,29 @@ libc_cv_pie_default=$libc_cv_cc_pie_default
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether quad-precision floating-point is supported" >&5
+$as_echo_n "checking whether quad-precision floating-point is supported... " >&6; }
+if ${libc_cv_have_qp_float+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ libc_cv_have_qp_float=yes
+cat > conftest.c <<EOF
+#include <math.h>
+#if __HAVE_FLOAT128
+# error quad-precision floating-point is supported
+#endif
+EOF
+if eval "${CC-cc} -S conftest.c 2>&5 1>&5"; then
+ libc_cv_have_qp_float=no
+fi
+rm -f conftest.*
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $libc_cv_have_qp_float" >&5
+$as_echo "$libc_cv_have_qp_float" >&6; }
+
+config_vars="$config_vars
+have-qp-float = $libc_cv_have_qp_float"
+
# Set the `multidir' variable by grabbing the variable from the compiler.
# We do it once and save the result in a generated makefile.
libc_cv_multidir=`${CC-cc} $CFLAGS $CPPFLAGS -print-multi-directory`
@@ -1821,6 +1821,21 @@ libc_cv_pie_default=$libc_cv_cc_pie_default
AC_SUBST(libc_cv_cc_pie_default)
AC_SUBST(libc_cv_pie_default)
+AC_CACHE_CHECK([whether quad-precision floating-point is supported],
+libc_cv_have_qp_float, [libc_cv_have_qp_float=yes
+cat > conftest.c <<EOF
+#include <math.h>
+#if __HAVE_FLOAT128
+# error quad-precision floating-point is supported
+#endif
+EOF
+if eval "${CC-cc} -S conftest.c 2>&AS_MESSAGE_LOG_FD 1>&AS_MESSAGE_LOG_FD"; then
+ libc_cv_have_qp_float=no
+fi
+rm -f conftest.*])
+AC_SUBST(libc_cv_have_qp_float)
+LIBC_CONFIG_VAR([have-qp-float], [$libc_cv_have_qp_float])
+
# Set the `multidir' variable by grabbing the variable from the compiler.
# We do it once and save the result in a generated makefile.
libc_cv_multidir=`${CC-cc} $CFLAGS $CPPFLAGS -print-multi-directory`