libstdc++: Small extended float support tweaks
The following patch 1) enables the std::float128_t overloads for x86 with glibc 2.26+ 2) makes std::nextafter(std::float16_t, std::float16_t) and std::nextafter(std::bfloat16_t, std::bfloat16_t) constexpr 3) adds (small) testsuite coverage for that 2022-10-21 Jakub Jelinek <jakub@redhat.com> * config/os/gnu-linux/os_defines.h (_GLIBCXX_HAVE_FLOAT128_MATH): Uncomment. * include/c_global/cmath (nextafter(_Float16, _Float16)): Make it constexpr. If std::__is_constant_evaluated() call __builtin_nextafterf16. (nextafter(__gnu_cxx::__bfloat16_t, __gnu_cxx::__bfloat16_t)): Similarly but call __builtin_nextafterf16b. * testsuite/26_numerics/headers/cmath/nextafter_c++23.cc (test): Add static assertions to test constexpr nextafter.
This commit is contained in:
parent
1b07d37476
commit
cbf56503d5
3 changed files with 9 additions and 3 deletions
|
@ -57,7 +57,7 @@
|
|||
|| (defined(__powerpc__) && defined(_ARCH_PWR8) \
|
||||
&& defined(__LITTLE_ENDIAN__) && (_CALL_ELF == 2) \
|
||||
&& defined(__FLOAT128__)))
|
||||
//# define _GLIBCXX_HAVE_FLOAT128_MATH 1
|
||||
# define _GLIBCXX_HAVE_FLOAT128_MATH 1
|
||||
#endif
|
||||
|
||||
#if __GLIBC_PREREQ(2, 27)
|
||||
|
|
|
@ -2755,9 +2755,11 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
|
|||
nearbyint(_Float16 __x)
|
||||
{ return _Float16(__builtin_nearbyintf(__x)); }
|
||||
|
||||
inline _Float16
|
||||
constexpr _Float16
|
||||
nextafter(_Float16 __x, _Float16 __y)
|
||||
{
|
||||
if (std::__is_constant_evaluated())
|
||||
return __builtin_nextafterf16(__x, __y);
|
||||
#ifdef __INT16_TYPE__
|
||||
using __float16_int_type = __INT16_TYPE__;
|
||||
#else
|
||||
|
@ -3471,9 +3473,11 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
|
|||
nearbyint(__gnu_cxx::__bfloat16_t __x)
|
||||
{ return __gnu_cxx::__bfloat16_t(__builtin_nearbyintf(__x)); }
|
||||
|
||||
inline __gnu_cxx::__bfloat16_t
|
||||
constexpr __gnu_cxx::__bfloat16_t
|
||||
nextafter(__gnu_cxx::__bfloat16_t __x, __gnu_cxx::__bfloat16_t __y)
|
||||
{
|
||||
if (std::__is_constant_evaluated())
|
||||
return __builtin_nextafterf16b(__x, __y);
|
||||
#ifdef __INT16_TYPE__
|
||||
using __bfloat16_int_type = __INT16_TYPE__;
|
||||
#else
|
||||
|
|
|
@ -100,6 +100,8 @@ test ()
|
|||
VERIFY(std::fpclassify(t36) == FP_NAN);
|
||||
T t37 = std::nextafter(T(-0.0), T());
|
||||
VERIFY(t37 == T() && !std::signbit(t37));
|
||||
static_assert(std::nextafter(T(1.0), T(2.0)) > T(1.0));
|
||||
static_assert(std::nextafter(std::nextafter(T(1.0), T(5.0)), T(0.0)) == T(1.0));
|
||||
}
|
||||
|
||||
int
|
||||
|
|
Loading…
Add table
Reference in a new issue