Patchwork Use long double not double for _Float64 with old GCC if values the same [committed]

login
register
mail settings
Submitter Joseph Myers
Date Dec. 5, 2017, 9:53 p.m.
Message ID <alpine.DEB.2.20.1712052153040.17142@digraph.polyomino.org.uk>
Download mbox | patch
Permalink /patch/24752/
State New
Headers show

Comments

Joseph Myers - Dec. 5, 2017, 9:53 p.m.
If double, long double and _Float64 all have the same set of values,
TS 18661-3 requires the usual arithmetic conversions on long double
and _Float64 to produce _Float64.  For this to be the case when
building with a compiler without a distinct _Float64 type, _Float64
must be a typedef for long double, not for double.  (_Float32x,
however, must be double in such a case, not long double, because the
usual arithmetic conversions on _Float32x and double must produce
double.)

This patch adjusts the fallback definition of _Float64 and associated
macros accordingly in that case, to fix the build of test-tgmath3 with
GCC 6 for such a configuration.  Tested in conjunction with _Float64
changes with build-many-glibcs.py for arm-linux-gnueabi, to make sure
the issue with test-tgmath3 is fixed.  Also tested for x86_64.  Committed.

2017-12-05  Joseph Myers  <joseph@codesourcery.com>

	* bits/floatn-common.h: Include <bits/long-double.h>.
	[__HAVE_FLOAT64 && (!__GNUC_PREREQ (7, 0) || defined __cplusplus)
	&& __NO_LONG_DOUBLE_MATH] (__f64): Use suffix 'l'.
	[__HAVE_FLOAT64 && (!__GNUC_PREREQ (7, 0) || defined __cplusplus)
	&& __NO_LONG_DOUBLE_MATH] (__CFLOAT64): Use _Complex long double.
	[__HAVE_FLOAT64 && (!__GNUC_PREREQ (7, 0) || defined __cplusplus)
	&& __NO_LONG_DOUBLE_MATH] (_Float64): Use long double.
	[__HAVE_FLOAT64 && !__GNUC_PREREQ (7, 0) && __NO_LONG_DOUBLE_MATH]
	(__builtin_huge_valf64): Use __builtin_huge_vall.
	[__HAVE_FLOAT64 && !__GNUC_PREREQ (7, 0) && __NO_LONG_DOUBLE_MATH]
	(__builtin_inff64): Use __builtin_infl.
	[__HAVE_FLOAT64 && !__GNUC_PREREQ (7, 0) && __NO_LONG_DOUBLE_MATH]
	(__builtin_nanf64): Use __builtin_nanl.
	[__HAVE_FLOAT64 && !__GNUC_PREREQ (7, 0) && __NO_LONG_DOUBLE_MATH]
	(__builtin_nansf64): Use __builtin_nansl.

Patch

diff --git a/bits/floatn-common.h b/bits/floatn-common.h
index 4d38a91..aa0a757 100644
--- a/bits/floatn-common.h
+++ b/bits/floatn-common.h
@@ -21,6 +21,7 @@ 
 #define _BITS_FLOATN_COMMON_H
 
 #include <features.h>
+#include <bits/long-double.h>
 
 /* This header should be included at the bottom of each bits/floatn.h.
    It defines the following macros for each _FloatN and _FloatNx type,
@@ -88,7 +89,11 @@ 
 
 # if __HAVE_FLOAT64
 #  if !__GNUC_PREREQ (7, 0) || defined __cplusplus
-#   define __f64(x) x
+#   ifdef __NO_LONG_DOUBLE_MATH
+#    define __f64(x) x##l
+#   else
+#    define __f64(x) x
+#   endif
 #  else
 #   define __f64(x) x##f64
 #  endif
@@ -142,7 +147,11 @@  typedef _Complex float __cfloat16 __attribute__ ((__mode__ (__HC__)));
 
 # if __HAVE_FLOAT64
 #  if !__GNUC_PREREQ (7, 0) || defined __cplusplus
-#   define __CFLOAT64 _Complex double
+#   ifdef __NO_LONG_DOUBLE_MATH
+#    define __CFLOAT64 _Complex long double
+#   else
+#    define __CFLOAT64 _Complex double
+#   endif
 #  else
 #   define __CFLOAT64 _Complex _Float64
 #  endif
@@ -209,15 +218,39 @@  typedef float _Float32;
 
 # if __HAVE_FLOAT64
 
-#  if !__GNUC_PREREQ (7, 0) || defined __cplusplus
+/* If double, long double and _Float64 all have the same set of
+   values, TS 18661-3 requires the usual arithmetic conversions on
+   long double and _Float64 to produce _Float64.  For this to be the
+   case when building with a compiler without a distinct _Float64
+   type, _Float64 must be a typedef for long double, not for
+   double.  */
+
+#  ifdef __NO_LONG_DOUBLE_MATH
+
+#   if !__GNUC_PREREQ (7, 0) || defined __cplusplus
+typedef long double _Float64;
+#   endif
+
+#   if !__GNUC_PREREQ (7, 0)
+#    define __builtin_huge_valf64() (__builtin_huge_vall ())
+#    define __builtin_inff64() (__builtin_infl ())
+#    define __builtin_nanf64(x) (__builtin_nanl (x))
+#    define __builtin_nansf64(x) (__builtin_nansl (x))
+#   endif
+
+#  else
+
+#   if !__GNUC_PREREQ (7, 0) || defined __cplusplus
 typedef double _Float64;
-#  endif
+#   endif
+
+#   if !__GNUC_PREREQ (7, 0)
+#    define __builtin_huge_valf64() (__builtin_huge_val ())
+#    define __builtin_inff64() (__builtin_inf ())
+#    define __builtin_nanf64(x) (__builtin_nan (x))
+#    define __builtin_nansf64(x) (__builtin_nans (x))
+#   endif
 
-#  if !__GNUC_PREREQ (7, 0)
-#   define __builtin_huge_valf64() (__builtin_huge_val ())
-#   define __builtin_inff64() (__builtin_inf ())
-#   define __builtin_nanf64(x) (__builtin_nan (x))
-#   define __builtin_nansf64(x) (__builtin_nans (x))
 #  endif
 
 # endif