wingo pushed a commit to branch wip-inline-digits
in repository guile.
commit 0ba64e1ed1622d79e44e36086765ec03e570f8d2
Author: Andy Wingo <[email protected]>
AuthorDate: Sun Jan 9 21:12:42 2022 +0100
Avoid bignum clone in scm_integer_sub_zz
* libguile/integers.c (scm_integer_abs_z): Just call
scm_integer_negate_z if negation is needed.
(scm_integer_sub_zz): Use mpz_sub instead of cloning bignum.
---
libguile/integers.c | 12 ++++++++++--
1 file changed, 10 insertions(+), 2 deletions(-)
diff --git a/libguile/integers.c b/libguile/integers.c
index 64fed6362..62b108cd7 100644
--- a/libguile/integers.c
+++ b/libguile/integers.c
@@ -518,7 +518,7 @@ scm_integer_abs_z (struct scm_bignum *z)
if (!bignum_is_negative (z))
return scm_from_bignum (z);
- return scm_from_bignum (negate_bignum (clone_bignum (z)));
+ return scm_integer_negate_z (z);
}
SCM
@@ -2908,7 +2908,15 @@ scm_integer_sub_zi (struct scm_bignum *x, scm_t_inum y)
SCM
scm_integer_sub_zz (struct scm_bignum *x, struct scm_bignum *y)
{
- return scm_integer_add_zz (x, negate_bignum (clone_bignum (y)));
+ mpz_t result, zx, zy;
+ mpz_init (result);
+ alias_bignum_to_mpz (x, zx);
+ alias_bignum_to_mpz (y, zy);
+ mpz_sub (result, zx, zy);
+ scm_remember_upto_here_2 (x, y);
+ // FIXME: We know that if X and Y have opposite signs, no need to
+ // check if result is fixable.
+ return take_mpz (result);
}
SCM