Handle more _FloatN, _FloatNx types in tgmath.h.
Continuing the preparation for additional _FloatN / _FloatNx type support, this patch improves how <tgmath.h> handles such types. Use of #error is added for cases of distinct types that are not supported by the header, to indicate that additional work on the header would be needed if, for example, _Float16 support were added to glibc. Given that #error, types with the same format as other types are handled automatically by the sizeof-based logic, so the only case needing special handling is that where _Float64x exists, has the same format as _Float128, does not have the same format as long double, and is not a typedef for _Float128. In this case (which will apply for powerpc64le once _Float64x support is added to glibc), the __builtin_types_compatible_p calls testing for _Float128 need corresponding calls testing for _Float64x, which this patch adds. Tested for x86_64. * math/tgmath.h [__HAVE_DISTINCT_FLOAT16 || __HAVE_DISTINCT_FLOAT32 || __HAVE_DISTINCT_FLOAT64 || __HAVE_DISTINCT_FLOAT32X || __HAVE_DISTINCT_FLOAT64X || __HAVE_DISTINCT_FLOAT128X]: Use #error. [__HAVE_DISTINCT_FLOAT128 && __GLIBC_USE (IEC_60559_TYPES_EXT) && __HAVE_FLOAT64X && !__HAVE_FLOAT64X_LONG_DOUBLE && __HAVE_FLOATN_NOT_TYPEDEF] (__TGMATH_F128): Handle _Float64x the same as _Float128. [__HAVE_DISTINCT_FLOAT128 && __GLIBC_USE (IEC_60559_TYPES_EXT) && __HAVE_FLOAT64X && !__HAVE_FLOAT64X_LONG_DOUBLE && __HAVE_FLOATN_NOT_TYPEDEF] (__TGMATH_CF128): Likewise.
This commit is contained in:
parent
9725517070
commit
86ec486597
12
ChangeLog
12
ChangeLog
|
@ -1,5 +1,17 @@
|
||||||
2017-11-03 Joseph Myers <joseph@codesourcery.com>
|
2017-11-03 Joseph Myers <joseph@codesourcery.com>
|
||||||
|
|
||||||
|
* math/tgmath.h [__HAVE_DISTINCT_FLOAT16
|
||||||
|
|| __HAVE_DISTINCT_FLOAT32 || __HAVE_DISTINCT_FLOAT64
|
||||||
|
|| __HAVE_DISTINCT_FLOAT32X || __HAVE_DISTINCT_FLOAT64X
|
||||||
|
|| __HAVE_DISTINCT_FLOAT128X]: Use #error.
|
||||||
|
[__HAVE_DISTINCT_FLOAT128 && __GLIBC_USE (IEC_60559_TYPES_EXT)
|
||||||
|
&& __HAVE_FLOAT64X && !__HAVE_FLOAT64X_LONG_DOUBLE
|
||||||
|
&& __HAVE_FLOATN_NOT_TYPEDEF] (__TGMATH_F128): Handle _Float64x
|
||||||
|
the same as _Float128.
|
||||||
|
[__HAVE_DISTINCT_FLOAT128 && __GLIBC_USE (IEC_60559_TYPES_EXT)
|
||||||
|
&& __HAVE_FLOAT64X && !__HAVE_FLOAT64X_LONG_DOUBLE
|
||||||
|
&& __HAVE_FLOATN_NOT_TYPEDEF] (__TGMATH_CF128): Likewise.
|
||||||
|
|
||||||
* stdlib/stdlib.h
|
* stdlib/stdlib.h
|
||||||
[__HAVE_FLOAT16 && __GLIBC_USE (IEC_60559_TYPES_EXT)] (strtof16):
|
[__HAVE_FLOAT16 && __GLIBC_USE (IEC_60559_TYPES_EXT)] (strtof16):
|
||||||
Declare.
|
Declare.
|
||||||
|
|
|
@ -115,10 +115,22 @@
|
||||||
__real_integer_type (__typeof__ (+(expr))), \
|
__real_integer_type (__typeof__ (+(expr))), \
|
||||||
__complex_integer_type (__typeof__ (+(expr))))
|
__complex_integer_type (__typeof__ (+(expr))))
|
||||||
|
|
||||||
|
# if (__HAVE_DISTINCT_FLOAT16 \
|
||||||
|
|| __HAVE_DISTINCT_FLOAT32 \
|
||||||
|
|| __HAVE_DISTINCT_FLOAT64 \
|
||||||
|
|| __HAVE_DISTINCT_FLOAT32X \
|
||||||
|
|| __HAVE_DISTINCT_FLOAT64X \
|
||||||
|
|| __HAVE_DISTINCT_FLOAT128X)
|
||||||
|
# error "Unsupported _FloatN or _FloatNx types for <tgmath.h>."
|
||||||
|
# endif
|
||||||
|
|
||||||
/* Expand to text that checks if ARG_COMB has type _Float128, and if
|
/* Expand to text that checks if ARG_COMB has type _Float128, and if
|
||||||
so calls the appropriately suffixed FCT (which may include a cast),
|
so calls the appropriately suffixed FCT (which may include a cast),
|
||||||
or FCT and CFCT for complex functions, with arguments ARG_CALL. */
|
or FCT and CFCT for complex functions, with arguments ARG_CALL. */
|
||||||
# if __HAVE_DISTINCT_FLOAT128 && __GLIBC_USE (IEC_60559_TYPES_EXT)
|
# if __HAVE_DISTINCT_FLOAT128 && __GLIBC_USE (IEC_60559_TYPES_EXT)
|
||||||
|
# if (!__HAVE_FLOAT64X \
|
||||||
|
|| __HAVE_FLOAT64X_LONG_DOUBLE \
|
||||||
|
|| !__HAVE_FLOATN_NOT_TYPEDEF)
|
||||||
# define __TGMATH_F128(arg_comb, fct, arg_call) \
|
# define __TGMATH_F128(arg_comb, fct, arg_call) \
|
||||||
__builtin_types_compatible_p (__typeof (+(arg_comb)), _Float128) \
|
__builtin_types_compatible_p (__typeof (+(arg_comb)), _Float128) \
|
||||||
? fct ## f128 arg_call :
|
? fct ## f128 arg_call :
|
||||||
|
@ -128,6 +140,21 @@
|
||||||
? fct ## f128 arg_call \
|
? fct ## f128 arg_call \
|
||||||
: cfct ## f128 arg_call) :
|
: cfct ## f128 arg_call) :
|
||||||
# else
|
# else
|
||||||
|
/* _Float64x is a distinct type at the C language level, which must be
|
||||||
|
handled like _Float128. */
|
||||||
|
# define __TGMATH_F128(arg_comb, fct, arg_call) \
|
||||||
|
(__builtin_types_compatible_p (__typeof (+(arg_comb)), _Float128) \
|
||||||
|
|| __builtin_types_compatible_p (__typeof (+(arg_comb)), _Float64x)) \
|
||||||
|
? fct ## f128 arg_call :
|
||||||
|
# define __TGMATH_CF128(arg_comb, fct, cfct, arg_call) \
|
||||||
|
(__builtin_types_compatible_p (__typeof (+__real__ (arg_comb)), _Float128) \
|
||||||
|
|| __builtin_types_compatible_p (__typeof (+__real__ (arg_comb)), \
|
||||||
|
_Float64x)) \
|
||||||
|
? (__expr_is_real (arg_comb) \
|
||||||
|
? fct ## f128 arg_call \
|
||||||
|
: cfct ## f128 arg_call) :
|
||||||
|
# endif
|
||||||
|
# else
|
||||||
# define __TGMATH_F128(arg_comb, fct, arg_call) /* Nothing. */
|
# define __TGMATH_F128(arg_comb, fct, arg_call) /* Nothing. */
|
||||||
# define __TGMATH_CF128(arg_comb, fct, cfct, arg_call) /* Nothing. */
|
# define __TGMATH_CF128(arg_comb, fct, cfct, arg_call) /* Nothing. */
|
||||||
# endif
|
# endif
|
||||||
|
|
Loading…
Reference in New Issue