about summary refs log tree commit diff
path: root/src/internal
diff options
context:
space:
mode:
Diffstat (limited to 'src/internal')
-rw-r--r--src/internal/libm.h28
-rw-r--r--src/internal/longdbl.h26
2 files changed, 28 insertions, 26 deletions
diff --git a/src/internal/libm.h b/src/internal/libm.h
index 64cc8388..52ac61ec 100644
--- a/src/internal/libm.h
+++ b/src/internal/libm.h
@@ -17,6 +17,7 @@
 #include <float.h>
 #include <math.h>
 #include <complex.h>
+#include <endian.h>
 
 #include "longdbl.h"
 
@@ -32,6 +33,33 @@ union dshape {
 	uint64_t bits;
 };
 
+#if LDBL_MANT_DIG == 53 && LDBL_MAX_EXP == 1024
+#elif LDBL_MANT_DIG == 64 && LDBL_MAX_EXP == 16384 && __BYTE_ORDER == __LITTLE_ENDIAN
+union ldshape {
+	long double f;
+	struct {
+		uint64_t m;
+		uint16_t se;
+	} i;
+};
+#elif LDBL_MANT_DIG == 113 && LDBL_MAX_EXP == 16384 && __BYTE_ORDER == __LITTLE_ENDIAN
+union ldshape {
+	long double f;
+	struct {
+		uint64_t lo;
+		uint32_t mid;
+		uint16_t top;
+		uint16_t se;
+	} i;
+	struct {
+		uint64_t lo;
+		uint64_t hi;
+	} i2;
+};
+#else
+#error Unsupported long double representation
+#endif
+
 #define FORCE_EVAL(x) do {                          \
 	if (sizeof(x) == sizeof(float)) {           \
 		volatile float __x;                 \
diff --git a/src/internal/longdbl.h b/src/internal/longdbl.h
index 25ec8021..e93fb4ff 100644
--- a/src/internal/longdbl.h
+++ b/src/internal/longdbl.h
@@ -4,32 +4,6 @@
 #include <float.h>
 #include <stdint.h>
 
-#if LDBL_MANT_DIG == 53 && LDBL_MAX_EXP == 1024
-#elif LDBL_MANT_DIG == 64 && LDBL_MAX_EXP == 16384
-union ldshape {
-	long double value;
-	struct {
-		uint64_t m;
-		uint16_t exp:15;
-		uint16_t sign:1;
-		uint16_t pad;
-	} bits;
-};
-#elif LDBL_MANT_DIG == 113 && LDBL_MAX_EXP == 16384
-union ldshape {
-	long double value;
-	struct {
-		uint64_t mlo;
-		uint64_t mhi:48;
-		uint16_t exp:15;
-		uint16_t sign:1;
-	} bits;
-};
-#else
-#error Unsupported long double representation
-#endif
-
-
 // FIXME: hacks to make freebsd+openbsd long double code happy
 
 // union and macros for freebsd