[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Guile-commits] 03/06: Less pessimal scm_integer_sub_zi
From: |
Andy Wingo |
Subject: |
[Guile-commits] 03/06: Less pessimal scm_integer_sub_zi |
Date: |
Sun, 9 Jan 2022 16:44:47 -0500 (EST) |
wingo pushed a commit to branch wip-inline-digits
in repository guile.
commit 774b863bfcfba724e4caf7dc4b580260acf55138
Author: Andy Wingo <wingo@pobox.com>
AuthorDate: Sun Jan 9 20:48:45 2022 +0100
Less pessimal scm_integer_sub_zi
* libguile/integers.c (scm_integer_sub_zi): Only delegate to
scm_integer_add_ii if y is negative.
---
libguile/integers.c | 20 ++++++++++++++++----
1 file changed, 16 insertions(+), 4 deletions(-)
diff --git a/libguile/integers.c b/libguile/integers.c
index 60c0fd34a..b368f52db 100644
--- a/libguile/integers.c
+++ b/libguile/integers.c
@@ -2875,10 +2875,22 @@ scm_integer_sub_iz (scm_t_inum x, struct scm_bignum *y)
SCM
scm_integer_sub_zi (struct scm_bignum *x, scm_t_inum y)
{
- // Assumes that -INUM_MIN can fit in a scm_t_inum, even if that
- // scm_t_inum is not fixable, and that scm_integer_add_ii can handle
- // scm_t_inum inputs outside the fixable range.
- return scm_integer_add_zi (x, -y);
+ if (y == 0)
+ return scm_from_bignum (x);
+ if (y < 0)
+ // Assumes that -INUM_MIN can fit in a scm_t_inum, even if that
+ // scm_t_inum is not fixable, and that scm_integer_add_ii can handle
+ // scm_t_inum inputs outside the fixable range.
+ return scm_integer_add_zi (x, -y);
+
+ mpz_t result, zx;
+ mpz_init (result);
+ alias_bignum_to_mpz (x, zx);
+ mpz_sub_ui (result, zx, y);
+ scm_remember_upto_here_1 (x);
+ // 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, 2022/01/09
- [Guile-commits] 03/06: Less pessimal scm_integer_sub_zi,
Andy Wingo <=
- [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