guile-commits
[Top][All Lists]
Advanced

[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



reply via email to

[Prev in Thread] Current Thread [Next in Thread]