summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorzimmerma <zimmerma@280ebfd0-de03-0410-8827-d642c229c3f4>2016-02-29 17:31:52 +0000
committerzimmerma <zimmerma@280ebfd0-de03-0410-8827-d642c229c3f4>2016-02-29 17:31:52 +0000
commit694fe0b0aa8c7624f4fa2972a803a2a2ca45e002 (patch)
tree81a65de97919b91f1760ac97e2a5fbb42466e9b2 /src
parentf195d7e1d80c77d394ff34bfdfdada65f3deea4c (diff)
downloadmpfr-694fe0b0aa8c7624f4fa2972a803a2a2ca45e002.tar.gz
native detection of ieee_double_extract (work in progress),
this will allow to have decimal-float support without gmp-build (and also faster set_d/get_d) git-svn-id: svn://scm.gforge.inria.fr/svn/mpfr/branches/3.1@10144 280ebfd0-de03-0410-8827-d642c229c3f4
Diffstat (limited to 'src')
-rw-r--r--src/mpfr-gmp.h63
1 files changed, 63 insertions, 0 deletions
diff --git a/src/mpfr-gmp.h b/src/mpfr-gmp.h
index 445b35338..267375ebb 100644
--- a/src/mpfr-gmp.h
+++ b/src/mpfr-gmp.h
@@ -405,6 +405,69 @@ typedef struct {mp_limb_t inv32;} mpfr_pi1_t; /* We changed gmp_pi1_t into
} \
} while (0)
+/* ieee_double_extract structure (copied from GMP 6.1.0, gmp-impl.h) */
+
+/* Define ieee_double_extract and _GMP_IEEE_FLOATS.
+
+ Bit field packing is "implementation defined" according to C99, which
+ leaves us at the compiler's mercy here. For some systems packing is
+ defined in the ABI (eg. x86). In any case so far it seems universal that
+ little endian systems pack from low to high, and big endian from high to
+ low within the given type.
+
+ Within the fields we rely on the integer endianness being the same as the
+ float endianness, this is true everywhere we know of and it'd be a fairly
+ strange system that did anything else. */
+
+#ifndef _GMP_IEEE_FLOATS
+
+#if HAVE_DOUBLE_IEEE_LITTLE_SWAPPED
+#define _GMP_IEEE_FLOATS 1
+union ieee_double_extract
+{
+ struct
+ {
+ unsigned long manh:20;
+ unsigned long exp:11;
+ unsigned long sig:1;
+ unsigned long manl:32;
+ } s;
+ double d;
+};
+#endif
+
+#if HAVE_DOUBLE_IEEE_LITTLE_ENDIAN
+#define _GMP_IEEE_FLOATS 1
+union ieee_double_extract
+{
+ struct
+ {
+ unsigned long manl:32;
+ unsigned long manh:20;
+ unsigned long exp:11;
+ unsigned long sig:1;
+ } s;
+ double d;
+};
+#endif
+
+#if HAVE_DOUBLE_IEEE_BIG_ENDIAN
+#define _GMP_IEEE_FLOATS 1
+union ieee_double_extract
+{
+ struct
+ {
+ unsigned long sig:1;
+ unsigned long exp:11;
+ unsigned long manh:20;
+ unsigned long manl:32;
+ } s;
+ double d;
+};
+#endif
+
+#endif /* _GMP_IEEE_FLOATS */
+
#if defined (__cplusplus)
}
#endif