]> sourceware.org Git - glibc.git/commitdiff
Handle more _FloatN, _FloatNx types in tgmath.h.
authorJoseph Myers <joseph@codesourcery.com>
Fri, 3 Nov 2017 21:11:50 +0000 (21:11 +0000)
committerJoseph Myers <joseph@codesourcery.com>
Fri, 3 Nov 2017 21:11:50 +0000 (21:11 +0000)
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.

ChangeLog
math/tgmath.h

index aa115b62fa608ec1aa83c0ee26797c3718064280..e8913ba3db48593e82b2b03df3a21c3eedc111f7 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,17 @@
 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
        [__HAVE_FLOAT16 && __GLIBC_USE (IEC_60559_TYPES_EXT)] (strtof16):
        Declare.
index 243813cdc0bd1a1c5a6f1b80b723baef51f631bc..108c1a19c78c289555702c0b93c1c3bcf709721d 100644 (file)
                             __real_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
    so calls the appropriately suffixed FCT (which may include a cast),
    or FCT and CFCT for complex functions, with arguments ARG_CALL.  */
 # if __HAVE_DISTINCT_FLOAT128 && __GLIBC_USE (IEC_60559_TYPES_EXT)
-#  define __TGMATH_F128(arg_comb, fct, arg_call) \
+#  if (!__HAVE_FLOAT64X                                \
+       || __HAVE_FLOAT64X_LONG_DOUBLE          \
+       || !__HAVE_FLOATN_NOT_TYPEDEF)
+#   define __TGMATH_F128(arg_comb, fct, arg_call)                      \
   __builtin_types_compatible_p (__typeof (+(arg_comb)), _Float128)     \
   ? fct ## f128 arg_call :
-#  define __TGMATH_CF128(arg_comb, fct, cfct, arg_call)                        \
+#   define __TGMATH_CF128(arg_comb, fct, cfct, arg_call)               \
   __builtin_types_compatible_p (__typeof (+__real__ (arg_comb)), _Float128) \
   ? (__expr_is_real (arg_comb)                                         \
      ? fct ## f128 arg_call                                            \
      : cfct ## f128 arg_call) :
+#  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_CF128(arg_comb, fct, cfct, arg_call) /* Nothing.  */
This page took 0.084051 seconds and 5 git commands to generate.