[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Guile-commits] 76/85: Avoid bignum clone in scm_integer_sub_zz
From: |
Andy Wingo |
Subject: |
[Guile-commits] 76/85: Avoid bignum clone in scm_integer_sub_zz |
Date: |
Thu, 13 Jan 2022 03:40:26 -0500 (EST) |
wingo pushed a commit to branch main
in repository guile.
commit 95350aae8cd7e5c9222687e21c6ba442bfb18758
Author: Andy Wingo <wingo@pobox.com>
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
- [Guile-commits] 46/85: Fix deprecated bit-count* when counting 0 bits, (continued)
- [Guile-commits] 46/85: Fix deprecated bit-count* when counting 0 bits, Andy Wingo, 2022/01/13
- [Guile-commits] 48/85: Reimplement scm_is_{un, }signed_integer for bignums, Andy Wingo, 2022/01/13
- [Guile-commits] 54/85: scm_to_mpz uses integer lib, Andy Wingo, 2022/01/13
- [Guile-commits] 51/85: Reimplement scm_{to,from}_{int64,uint64}, Andy Wingo, 2022/01/13
- [Guile-commits] 52/85: Implement scm_{to,from}_wchar inline, Andy Wingo, 2022/01/13
- [Guile-commits] 58/85: Remove dead bignum frexp code from numbers.c, Andy Wingo, 2022/01/13
- [Guile-commits] 53/85: Remove unused conv-{u,}integer.i.c, Andy Wingo, 2022/01/13
- [Guile-commits] 63/85: Use scm_integer_to_double_z in numbers.c instead of big2dbl, Andy Wingo, 2022/01/13
- [Guile-commits] 66/85: Finish srfi-60 port off old scm mpz API, Andy Wingo, 2022/01/13
- [Guile-commits] 74/85: Less pessimal scm_integer_sub_zi, Andy Wingo, 2022/01/13
- [Guile-commits] 76/85: Avoid bignum clone in scm_integer_sub_zz,
Andy Wingo <=
- [Guile-commits] 79/85: Optimize scm_integer_mul_ii, Andy Wingo, 2022/01/13
- [Guile-commits] 80/85: Optimize integer-expt for fixnums, Andy Wingo, 2022/01/13
- [Guile-commits] 81/85: Optimize logand against a positive inum, Andy Wingo, 2022/01/13
- [Guile-commits] 82/85: Simplify scm_abs for the real case, Andy Wingo, 2022/01/13
- [Guile-commits] 09/85: Implement ceiling-divide with new integer lib, Andy Wingo, 2022/01/13
- [Guile-commits] 08/85: Implement ceiling-remainder with new integer lib, Andy Wingo, 2022/01/13
- [Guile-commits] 11/85: Implement truncate-remainder with new integer lib, Andy Wingo, 2022/01/13
- [Guile-commits] 49/85: Reimplement scm_from_int8 etc, Andy Wingo, 2022/01/13
- [Guile-commits] 55/85: Reimplement exact-integer-sqrt with integers.[ch], Andy Wingo, 2022/01/13
- [Guile-commits] 56/85: Refactor scm_sqrt in terms of integers.[ch], Andy Wingo, 2022/01/13