diff options
author | zimmerma <zimmerma@280ebfd0-de03-0410-8827-d642c229c3f4> | 2016-02-29 17:31:52 +0000 |
---|---|---|
committer | zimmerma <zimmerma@280ebfd0-de03-0410-8827-d642c229c3f4> | 2016-02-29 17:31:52 +0000 |
commit | 694fe0b0aa8c7624f4fa2972a803a2a2ca45e002 (patch) | |
tree | 81a65de97919b91f1760ac97e2a5fbb42466e9b2 /src | |
parent | f195d7e1d80c77d394ff34bfdfdada65f3deea4c (diff) | |
download | mpfr-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.h | 63 |
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 |