guile-commits
[Top][All Lists]
Advanced

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

[Guile-commits] branch main updated: Slight bignum-fixnum multiplication


From: Andy Wingo
Subject: [Guile-commits] branch main updated: Slight bignum-fixnum multiplication optimization
Date: Tue, 01 Feb 2022 14:02:01 -0500

This is an automated email from the git hooks/post-receive script.

wingo pushed a commit to branch main
in repository guile.

The following commit(s) were added to refs/heads/main by this push:
     new 62fc44e6e Slight bignum-fixnum multiplication optimization
62fc44e6e is described below

commit 62fc44e6ee6165253fa33dc6f8897c7bde620a05
Author: Andy Wingo <wingo@pobox.com>
AuthorDate: Sun Jan 30 21:15:58 2022 +0100

    Slight bignum-fixnum multiplication optimization
    
    * libguile/integers.c (scm_integer_mul_zi): Use mpn_mul_1.
---
 libguile/integers.c | 12 ++++++++----
 1 file changed, 8 insertions(+), 4 deletions(-)

diff --git a/libguile/integers.c b/libguile/integers.c
index adf1c401e..168593da5 100644
--- a/libguile/integers.c
+++ b/libguile/integers.c
@@ -3094,13 +3094,17 @@ scm_integer_mul_zi (struct scm_bignum *x, scm_t_inum y)
           return SCM_INUM0;
 
         struct scm_bignum *result = allocate_bignum (xn + 1);
+        mp_limb_t *rd = bignum_limbs (result);
         const mp_limb_t *xd = bignum_limbs (x);
-        mp_limb_t yd[1] = { long_magnitude (y) };
+        mp_limb_t yd = long_magnitude (y);
         int negate = bignum_is_negative (x) != (y < 0);
-        mpn_mul (bignum_limbs (result), xd, xn, yd, 1);
+        mp_limb_t hi = mpn_mul_1 (rd, xd, xn, yd);
+        if (hi)
+          rd[xn] = hi;
+        else
+          result->u.z.size--;
         scm_remember_upto_here_1 (x);
-        return normalize_bignum
-          (bignum_negate_if (negate, (bignum_trim1 (result))));
+        return normalize_bignum (bignum_negate_if (negate, (result)));
       }
     }
 }



reply via email to

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