Summary: | iscanonical in C++ and float128 | ||
---|---|---|---|
Product: | glibc | Reporter: | Joseph Myers <jsm28> |
Component: | math | Assignee: | Gabriel F. T. Gomes <gabriel> |
Status: | RESOLVED FIXED | ||
Severity: | normal | CC: | gabriel |
Priority: | P2 | Flags: | fweimer:
security-
|
Version: | 2.26 | ||
Target Milestone: | 2.27 | ||
Host: | Target: | ||
Build: | Last reconfirmed: |
Description
Joseph Myers
2017-10-02 15:43:54 UTC
I posted a patch on libc-alpha: https://sourceware.org/ml/libc-alpha/2017-10/msg00102.html This is an automated email from the git hooks/post-receive script. It was generated because a ref change was pushed to the repository containing the project "GNU C Library master sources". The branch, master has been updated via aa0235dfdebffe9b338deba51f3ba563ee9b433d (commit) from a1132b5e56fe8aaa148ebd249034181863857d60 (commit) Those revisions listed above that are new to this repository have not appeared on any other notification email; so we list those revisions in full, below. - Log ----------------------------------------------------------------- https://sourceware.org/git/gitweb.cgi?p=glibc.git;h=aa0235dfdebffe9b338deba51f3ba563ee9b433d commit aa0235dfdebffe9b338deba51f3ba563ee9b433d Author: Gabriel F. T. Gomes <gabriel@inconstante.eti.br> Date: Mon Oct 2 14:46:35 2017 -0300 Add C++ versions of iscanonical for ldbl-96 and ldbl-128ibm (bug 22235) All representations of floating-point numbers in types with IEC 60559 binary exchange format are canonical. On the other hand, types with IEC 60559 extended formats, such as those implemented under ldbl-96 and ldbl-128ibm, contain representations that are not canonical. TS 18661-1 introduced the type-generic macro iscanonical, which returns whether a floating-point value is canonical or not. In Glibc, this type-generic macro is implemented using the macro __MATH_TG, which, when support for float128 is enabled, relies on __builtin_types_compatible_p to select between floating-point types. However, this use of iscanonical breaks C++ applications, because the builtin is only available in C mode. This patch provides a C++ implementation of iscanonical that relies on function overloading, rather than builtins, to select between floating-point types. Unlike the C++ implementations for iszero and issignaling, this implementation ignores __NO_LONG_DOUBLE_MATH. The double type always matches IEC 60559 double format, which is always canonical. Thus, when double and long double are the same (__NO_LONG_DOUBLE_MATH), iscanonical always returns 1 and is not implemented with __MATH_TG. Tested for powerpc64, powerpc64le and x86_64. [BZ #22235] * math/math.h: Trivial fix for unbalanced parentheses in comment. * math/Makefile [CXX] (tests): Add test-math-iscanonical.cc. (CFLAGS-test-math-iscanonical.cc): New variable. * math/test-math-iscanonical.cc: New file. * sysdeps/ieee754/ldbl-96/bits/iscanonical.h (iscanonical): Provide a C++ implementation based on function overloading, rather than using __MATH_TG, which uses C-only builtins. * sysdeps/ieee754/ldbl-128ibm/bits/iscanonical.h (iscanonical): Likewise. * sysdeps/powerpc/powerpc64le/Makefile (CFLAGS-test-math-iscanonical.cc): New variable. ----------------------------------------------------------------------- Summary of changes: ChangeLog | 15 +++++++++ math/Makefile | 4 ++- math/math.h | 2 +- ...st-finite-macros.c => test-math-iscanonical.cc} | 31 ++++++++++++++------ sysdeps/ieee754/ldbl-128ibm/bits/iscanonical.h | 21 ++++++++++++- sysdeps/ieee754/ldbl-96/bits/iscanonical.h | 19 +++++++++++- sysdeps/powerpc/powerpc64le/Makefile | 1 + 7 files changed, 79 insertions(+), 14 deletions(-) copy math/{test-finite-macros.c => test-math-iscanonical.cc} (66%) Fixed for 2.27. This is an automated email from the git hooks/post-receive script. It was generated because a ref change was pushed to the repository containing the project "GNU C Library master sources". The branch, release/2.26/master has been updated via 3b10c5d2abb0392d5ecfd865e2eb911ac109e36f (commit) from 3f68c5c9b61600f0f85c75bac15b1520d5059359 (commit) Those revisions listed above that are new to this repository have not appeared on any other notification email; so we list those revisions in full, below. - Log ----------------------------------------------------------------- https://sourceware.org/git/gitweb.cgi?p=glibc.git;h=3b10c5d2abb0392d5ecfd865e2eb911ac109e36f commit 3b10c5d2abb0392d5ecfd865e2eb911ac109e36f Author: Gabriel F. T. Gomes <gabriel@inconstante.eti.br> Date: Mon Oct 2 14:46:35 2017 -0300 Add C++ versions of iscanonical for ldbl-96 and ldbl-128ibm (bug 22235) All representations of floating-point numbers in types with IEC 60559 binary exchange format are canonical. On the other hand, types with IEC 60559 extended formats, such as those implemented under ldbl-96 and ldbl-128ibm, contain representations that are not canonical. TS 18661-1 introduced the type-generic macro iscanonical, which returns whether a floating-point value is canonical or not. In Glibc, this type-generic macro is implemented using the macro __MATH_TG, which, when support for float128 is enabled, relies on __builtin_types_compatible_p to select between floating-point types. However, this use of iscanonical breaks C++ applications, because the builtin is only available in C mode. This patch provides a C++ implementation of iscanonical that relies on function overloading, rather than builtins, to select between floating-point types. Unlike the C++ implementations for iszero and issignaling, this implementation ignores __NO_LONG_DOUBLE_MATH. The double type always matches IEC 60559 double format, which is always canonical. Thus, when double and long double are the same (__NO_LONG_DOUBLE_MATH), iscanonical always returns 1 and is not implemented with __MATH_TG. Tested for powerpc64, powerpc64le and x86_64. [BZ #22235] * math/math.h: Trivial fix for unbalanced parentheses in comment. * math/Makefile [CXX] (tests): Add test-math-iscanonical.cc. (CFLAGS-test-math-iscanonical.cc): New variable. * math/test-math-iscanonical.cc: New file. * sysdeps/ieee754/ldbl-96/bits/iscanonical.h (iscanonical): Provide a C++ implementation based on function overloading, rather than using __MATH_TG, which uses C-only builtins. * sysdeps/ieee754/ldbl-128ibm/bits/iscanonical.h (iscanonical): Likewise. * sysdeps/powerpc/powerpc64le/Makefile (CFLAGS-test-math-iscanonical.cc): New variable. (cherry picked from commit aa0235dfdebffe9b338deba51f3ba563ee9b433d) ----------------------------------------------------------------------- Summary of changes: ChangeLog | 15 +++++++++ NEWS | 1 + math/Makefile | 4 ++- math/math.h | 2 +- debug/tst-ssp-1.c => math/test-math-iscanonical.cc | 33 +++++++++++--------- sysdeps/ieee754/ldbl-128ibm/bits/iscanonical.h | 21 +++++++++++- sysdeps/ieee754/ldbl-96/bits/iscanonical.h | 19 +++++++++++- sysdeps/powerpc/powerpc64le/Makefile | 1 + 8 files changed, 76 insertions(+), 20 deletions(-) copy debug/tst-ssp-1.c => math/test-math-iscanonical.cc (65%) |