@@ -836,25 +836,40 @@ namespace std
# endif
#endif
-// Define if float has the IEEE binary32 format.
#if __FLT_MANT_DIG__ == 24 \
&& __FLT_MIN_EXP__ == -125 \
&& __FLT_MAX_EXP__ == 128
+// Define if float has the IEEE binary32 format.
# define _GLIBCXX_FLOAT_IS_IEEE_BINARY32 1
#endif
-// Define if double has the IEEE binary64 format.
#if __DBL_MANT_DIG__ == 53 \
&& __DBL_MIN_EXP__ == -1021 \
&& __DBL_MAX_EXP__ == 1024
+// Define if double has the IEEE binary64 format.
# define _GLIBCXX_DOUBLE_IS_IEEE_BINARY64 1
+#elif __FLT_MANT_DIG__ == 24 \
+ && __FLT_MIN_EXP__ == -125 \
+ && __FLT_MAX_EXP__ == 128
+// Define if double has the IEEE binary32 format.
+# define _GLIBCXX_DOUBLE_IS_IEEE_BINARY32 1
#endif
-// Define if long double has the IEEE binary128 format.
#if __LDBL_MANT_DIG__ == 113 \
&& __LDBL_MIN_EXP__ == -16381 \
&& __LDBL_MAX_EXP__ == 16384
+// Define if long double has the IEEE binary128 format.
# define _GLIBCXX_LDOUBLE_IS_IEEE_BINARY128 1
+#elif __LDBL_MANT_DIG__ == 53 \
+ && __LDBL_MIN_EXP__ == -1021 \
+ && __LDBL_MAX_EXP__ == 1024
+// Define if long double has the IEEE binary64 format.
+# define _GLIBCXX_LDOUBLE_IS_IEEE_BINARY64 1
+#elif __LDBL_MANT_DIG__ == 24 \
+ && __LDBL_MIN_EXP__ == -125 \
+ && __LDBL_MAX_EXP__ == 128
+// Define if long double has the IEEE binary32 format.
+# define _GLIBCXX_LDOUBLE_IS_IEEE_BINARY32 1
#endif
#if defined __cplusplus && defined __BFLT16_DIG__
@@ -556,6 +556,13 @@ __INT_N(__GLIBCXX_TYPE_INT_N_3)
struct __memcpyable_integer<unsigned __int128> { enum { __width = 128 }; };
#endif
+#if _GLIBCXX_DOUBLE_IS_IEEE_BINARY64 && _GLIBCXX_LDOUBLE_IS_IEEE_BINARY64
+ template<>
+ struct __memcpyable<double*, long double*> { enum { __value = true }; };
+ template<>
+ struct __memcpyable<long double*, double*> { enum { __value = true }; };
+#endif
+
#if defined(__STDCPP_FLOAT32_T__) && defined(_GLIBCXX_FLOAT_IS_IEEE_BINARY32)
template<>
struct __memcpyable<_Float32*, float*> { enum { __value = true }; };