[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Guile-commits] 04/06: Start to optimize scm_integer_sub_iz
From: |
Andy Wingo |
Subject: |
[Guile-commits] 04/06: Start to optimize scm_integer_sub_iz |
Date: |
Sun, 9 Jan 2022 16:44:48 -0500 (EST) |
wingo pushed a commit to branch wip-inline-digits
in repository guile.
commit ca3c1ff44fce206f0092112f6cc0d5d0fc6730ab
Author: Andy Wingo <wingo@pobox.com>
AuthorDate: Sun Jan 9 21:10:14 2022 +0100
Start to optimize scm_integer_sub_iz
* libguile/integers.c (scm_integer_sub_iz): Avoid cloning bignum.
---
libguile/integers.c | 14 +++++++++++++-
1 file changed, 13 insertions(+), 1 deletion(-)
diff --git a/libguile/integers.c b/libguile/integers.c
index b368f52db..64fed6362 100644
--- a/libguile/integers.c
+++ b/libguile/integers.c
@@ -2869,7 +2869,19 @@ scm_integer_sub_ii (scm_t_inum x, scm_t_inum y)
SCM
scm_integer_sub_iz (scm_t_inum x, struct scm_bignum *y)
{
- return scm_integer_add_zi (negate_bignum (clone_bignum (y)), x);
+ if (x == 0)
+ return scm_integer_negate_z (y);
+
+ mpz_t result, zx, zy;
+ mpz_init (result);
+ mpz_init_set_si (zx, x);
+ alias_bignum_to_mpz (y, zy);
+ mpz_sub (result, zx, zy);
+ scm_remember_upto_here_1 (y);
+ mpz_clear (zx);
+ // FIXME: We know that if X is negative, no need to check if
+ // result is fixable.
+ return take_mpz (result);
}
SCM
- [Guile-commits] branch wip-inline-digits updated (6c13cd098 -> 4cc1f01ff), Andy Wingo, 2022/01/09
- [Guile-commits] 01/06: Optimize scm_integer_mul_zi, Andy Wingo, 2022/01/09
- [Guile-commits] 02/06: Optimize scm_integer_mul_zz., Andy Wingo, 2022/01/09
- [Guile-commits] 04/06: Start to optimize scm_integer_sub_iz,
Andy Wingo <=
- [Guile-commits] 03/06: Less pessimal scm_integer_sub_zi, Andy Wingo, 2022/01/09
- [Guile-commits] 05/06: Avoid bignum clone in scm_integer_sub_zz, Andy Wingo, 2022/01/09
- [Guile-commits] 06/06: Optimize bignum add to avoid temporary allocations, Andy Wingo, 2022/01/09