]> git.ipfire.org Git - thirdparty/glibc.git/commitdiff
float128: Extend __MATH_TG for float128 support
authorGabriel F. T. Gomes <gftg@linux.vnet.ibm.com>
Fri, 9 Dec 2016 13:41:55 +0000 (11:41 -0200)
committerGabriel F. T. Gomes <gftg@linux.vnet.ibm.com>
Wed, 17 May 2017 21:59:23 +0000 (18:59 -0300)
* math/math.h (__MATH_TG): Extend the conditions to add
_Float128 support.
* misc/sys/cdefs.h (__HAVE_GENERIC_SELECTION): New macro.

ChangeLog
math/math.h
misc/sys/cdefs.h

index 6c03b363a2611022fd5a2c6d72dd6179a1e513b7..d1b4523888d15742d8bd302692bad2187a270dfe 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,10 @@
+2017-05-17  Gabriel F. T. Gomes  <gftg@linux.vnet.ibm.com>
+           Tulio Magno Quites Machado Filho  <tuliom@linux.vnet.ibm.com>
+
+       * math/math.h (__MATH_TG): Extend the conditions to add
+       _Float128 support.
+       * misc/sys/cdefs.h (__HAVE_GENERIC_SELECTION): New macro.
+
 2017-05-17  Paul A. Clarke  <pc@us.ibm.com>
 
        * sysdeps/powerpc/powerpc64/fpu/multiarch/Makefile
index 3b0bcadb00c8bf7b775ffd991a7a55f99ce031a6..5f006a8358d3f4edbe70e69bcbfd44c06b17f163 100644 (file)
@@ -340,6 +340,27 @@ extern int signgam;
 #ifdef __NO_LONG_DOUBLE_MATH
 # define __MATH_TG(TG_ARG, FUNC, ARGS)                                 \
   (sizeof (TG_ARG) == sizeof (float) ? FUNC ## f ARGS : FUNC ARGS)
+#elif __HAVE_DISTINCT_FLOAT128
+# if __HAVE_GENERIC_SELECTION
+#  define __MATH_TG(TG_ARG, FUNC, ARGS)                \
+     _Generic ((TG_ARG),                       \
+              float: FUNC ## f ARGS,           \
+              default: FUNC ARGS,              \
+              long double: FUNC ## l ARGS,     \
+              _Float128: FUNC ## f128 ARGS)
+# else
+#  define __MATH_TG(TG_ARG, FUNC, ARGS)                                        \
+     __builtin_choose_expr                                             \
+     (__builtin_types_compatible_p (__typeof (TG_ARG), float),         \
+      FUNC ## f ARGS,                                                  \
+      __builtin_choose_expr                                            \
+      (__builtin_types_compatible_p (__typeof (TG_ARG), double),       \
+       FUNC ARGS,                                                      \
+       __builtin_choose_expr                                           \
+       (__builtin_types_compatible_p (__typeof (TG_ARG), long double), \
+       FUNC ## l ARGS,                                                 \
+       FUNC ## f128 ARGS)))
+# endif
 #else
 # define __MATH_TG(TG_ARG, FUNC, ARGS)         \
   (sizeof (TG_ARG) == sizeof (float)           \
index 74f9a49b058f40ad5ea0ed7b00096a6e8acf6694..06523bfe9c65dbd3a583128d69457efdc8a8f139 100644 (file)
 # define __glibc_macro_warning(msg)
 #endif
 
+/* Support for generic selection (ISO C11) is available in GCC since
+   version 4.9.  Previous versions do not provide generic selection,
+   even though they might set __STDC_VERSION__ to 201112L, when in
+   -std=c11 mode.  Thus, we must check for !defined __GNUC__ when
+   testing __STDC_VERSION__ for generic selection support.
+   On the other hand, Clang also defines __GNUC__, so a clang-specific
+   check is required to enable the use of generic selection.  */
+#if __GNUC_PREREQ (4, 9) \
+    || __glibc_clang_has_extension (c_generic_selections) \
+    || (!defined __GNUC__ && defined __STDC_VERSION__ \
+       && __STDC_VERSION__ >= 201112L)
+# define __HAVE_GENERIC_SELECTION 1
+#else
+# define __HAVE_GENERIC_SELECTION 0
+#endif
+
 #endif  /* sys/cdefs.h */