guile-commits
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Guile-commits] 05/06: Avoid bignum clone in scm_integer_sub_zz


From: Andy Wingo
Subject: [Guile-commits] 05/06: Avoid bignum clone in scm_integer_sub_zz
Date: Sun, 9 Jan 2022 16:44:49 -0500 (EST)

wingo pushed a commit to branch wip-inline-digits
in repository guile.

commit 0ba64e1ed1622d79e44e36086765ec03e570f8d2
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



reply via email to

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