summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHerbert Valerio Riedel <hvr@gnu.org>2014-11-29 09:30:46 +0100
committerHerbert Valerio Riedel <hvr@gnu.org>2014-11-29 09:32:00 +0100
commit447f592697fef04d1e19a2045ec707cfcd1eb59f (patch)
tree3f9bd838ca543522f10c75734ed2749119ffad3a
parentf0df243d9b6a37628a992c5d1b16c44fe8b2c894 (diff)
downloadhaskell-447f592697fef04d1e19a2045ec707cfcd1eb59f.tar.gz
Minor refactoring of static C initializers
-rw-r--r--libraries/integer-gmp2/cbits/wrappers.c42
1 files changed, 13 insertions, 29 deletions
diff --git a/libraries/integer-gmp2/cbits/wrappers.c b/libraries/integer-gmp2/cbits/wrappers.c
index 1621d3b3b5..520c412d82 100644
--- a/libraries/integer-gmp2/cbits/wrappers.c
+++ b/libraries/integer-gmp2/cbits/wrappers.c
@@ -36,6 +36,10 @@ typedef unsigned long int mp_bitcnt_t;
# error (SIZEOF_HSWORD*8) != WORD_SIZE_IN_BITS
#endif
+// Turn a (const) {xp,xn} pair into static initializer
+#define CONST_MPZ_INIT(xp,xn) \
+ {{ ._mp_alloc = 0, ._mp_size = (xn), ._mp_d = (mp_limb_t*)(xp) }}
+
/* Perform arithmetic right shift on MPNs (multi-precision naturals)
*
* pre-conditions:
@@ -132,7 +136,8 @@ integer_gmp_mpn_lshift (mp_limb_t rp[], const mp_limb_t sp[],
}
}
-/*
+/* Convert bignum to a `double`, truncating if necessary
+ * (i.e. rounding towards zero).
*
* sign of mp_size_t argument controls sign of converted double
*/
@@ -146,17 +151,13 @@ integer_gmp_mpn_get_d (const mp_limb_t sp[], const mp_size_t sn,
if (sn == 1 && sp[0] == 0)
return 0.0;
- __mpz_struct const mpz = {
- ._mp_alloc = abs(sn),
- ._mp_size = sn,
- ._mp_d = (mp_limb_t*)sp
- };
+ const mpz_t mpz = CONST_MPZ_INIT(sp, sn);
if (!exponent)
- return mpz_get_d(&mpz);
+ return mpz_get_d(mpz);
long e = 0;
- double d = mpz_get_d_2exp (&e, &mpz);
+ double d = mpz_get_d_2exp (&e, mpz);
// TODO: over/underflow handling?
return ldexp(d, e+exponent);
@@ -212,17 +213,8 @@ integer_gmp_mpn_gcd(mp_limb_t r[],
// the cost of a few additional temporary buffer allocations in
// C-land.
- const mpz_t op1 = {{
- ._mp_alloc = xn,
- ._mp_size = xn,
- ._mp_d = (mp_limb_t*)x0
- }};
-
- const mpz_t op2 = {{
- ._mp_alloc = yn,
- ._mp_size = yn,
- ._mp_d = (mp_limb_t*)y0
- }};
+ const mpz_t op1 = CONST_MPZ_INIT(x0, xn);
+ const mpz_t op2 = CONST_MPZ_INIT(y0, yn);
mpz_t rop;
mpz_init (rop);
@@ -299,11 +291,7 @@ integer_gmp_mpn_sizeinbase(const mp_limb_t s[], const mp_size_t sn,
if (!sn) return 1;
- const mpz_t zs = {{
- ._mp_alloc = sn,
- ._mp_size = sn,
- ._mp_d = (mp_limb_t*)s
- }};
+ const mpz_t zs = CONST_MPZ_INIT(s, sn);
return mpz_sizeinbase(zs, base);
}
@@ -326,11 +314,7 @@ integer_gmp_mpn_export(const mp_limb_t s[], const mp_size_t sn,
if (!sn || (sn == 1 && !s[0]))
return 0;
- const mpz_t zs = {{
- ._mp_alloc = sn,
- ._mp_size = sn,
- ._mp_d = (mp_limb_t*)s
- }};
+ const mpz_t zs = CONST_MPZ_INIT(s, sn);
size_t written = 0;