]> git.ipfire.org Git - thirdparty/glibc.git/commit - math/Makefile
Add C++ versions of iscanonical for ldbl-96 and ldbl-128ibm (bug 22235)
authorGabriel F. T. Gomes <gabriel@inconstante.eti.br>
Mon, 2 Oct 2017 17:46:35 +0000 (14:46 -0300)
committerGabriel F. T. Gomes <gabriel@inconstante.eti.br>
Tue, 3 Oct 2017 19:01:37 +0000 (16:01 -0300)
commitaa0235dfdebffe9b338deba51f3ba563ee9b433d
tree7ed57f11a759ad2c670a34b99207cb720030ef6a
parenta1132b5e56fe8aaa148ebd249034181863857d60
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.
ChangeLog
math/Makefile
math/math.h
math/test-math-iscanonical.cc [new file with mode: 0644]
sysdeps/ieee754/ldbl-128ibm/bits/iscanonical.h
sysdeps/ieee754/ldbl-96/bits/iscanonical.h
sysdeps/powerpc/powerpc64le/Makefile