guile-commits
[Top][All Lists]
Advanced

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

[Guile-commits] 81/85: Optimize logand against a positive inum


From: Andy Wingo
Subject: [Guile-commits] 81/85: Optimize logand against a positive inum
Date: Thu, 13 Jan 2022 03:40:26 -0500 (EST)

wingo pushed a commit to branch main
in repository guile.

commit 9e5aa173c79b2f14c8a1ffe758a91a63f52cc3b7
Author: Andy Wingo <wingo@pobox.com>
AuthorDate: Mon Jan 10 11:56:13 2022 +0100

    Optimize logand against a positive inum
    
    * libguile/integers.c (scm_integer_logand_zi): Optimize.
---
 libguile/integers.c | 12 ++++++++++++
 1 file changed, 12 insertions(+)

diff --git a/libguile/integers.c b/libguile/integers.c
index a173d01f2..a1231a10d 100644
--- a/libguile/integers.c
+++ b/libguile/integers.c
@@ -2119,6 +2119,18 @@ scm_integer_logand_zi (struct scm_bignum *x, scm_t_inum 
y)
   if (y == 0)
     return SCM_INUM0;
 
+  if (y > 0)
+    {
+      mp_limb_t rd = bignum_limbs (x)[0];
+      mp_limb_t yd = y;
+      if (bignum_is_negative (x))
+        rd = ~rd + 1;
+      scm_remember_upto_here_1 (x);
+      rd &= yd;
+      // Result must be a positive inum.
+      return SCM_I_MAKINUM (rd);
+    }
+
   mpz_t result, zx, zy;
   mpz_init (result);
   alias_bignum_to_mpz (x, zx);



reply via email to

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