summaryrefslogtreecommitdiff
path: root/libguile/integers.c
diff options
context:
space:
mode:
Diffstat (limited to 'libguile/integers.c')
-rw-r--r--libguile/integers.c12
1 files changed, 8 insertions, 4 deletions
diff --git a/libguile/integers.c b/libguile/integers.c
index adf1c401e..168593da5 100644
--- a/libguile/integers.c
+++ b/libguile/integers.c
@@ -3094,13 +3094,17 @@ scm_integer_mul_zi (struct scm_bignum *x, scm_t_inum y)
return SCM_INUM0;
struct scm_bignum *result = allocate_bignum (xn + 1);
+ mp_limb_t *rd = bignum_limbs (result);
const mp_limb_t *xd = bignum_limbs (x);
- mp_limb_t yd[1] = { long_magnitude (y) };
+ mp_limb_t yd = long_magnitude (y);
int negate = bignum_is_negative (x) != (y < 0);
- mpn_mul (bignum_limbs (result), xd, xn, yd, 1);
+ mp_limb_t hi = mpn_mul_1 (rd, xd, xn, yd);
+ if (hi)
+ rd[xn] = hi;
+ else
+ result->u.z.size--;
scm_remember_upto_here_1 (x);
- return normalize_bignum
- (bignum_negate_if (negate, (bignum_trim1 (result))));
+ return normalize_bignum (bignum_negate_if (negate, (result)));
}
}
}