[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Guile-commits] 02/06: Optimize scm_integer_mul_zz.
From: |
Andy Wingo |
Subject: |
[Guile-commits] 02/06: Optimize scm_integer_mul_zz. |
Date: |
Sun, 9 Jan 2022 16:44:45 -0500 (EST) |
wingo pushed a commit to branch wip-inline-digits
in repository guile.
commit 83d65b2312211114544f6febfcfddb562d210e38
Author: Andy Wingo <wingo@pobox.com>
AuthorDate: Sun Jan 9 16:46:27 2022 +0100
Optimize scm_integer_mul_zz.
* libguile/integers.c (scm_integer_mul_zz): Optimize to avoid temporary
allocations.
---
libguile/integers.c | 24 ++++++++++++++++++------
1 file changed, 18 insertions(+), 6 deletions(-)
diff --git a/libguile/integers.c b/libguile/integers.c
index ee2907f30..60c0fd34a 100644
--- a/libguile/integers.c
+++ b/libguile/integers.c
@@ -2939,13 +2939,25 @@ scm_integer_mul_zi (struct scm_bignum *x, scm_t_inum y)
SCM
scm_integer_mul_zz (struct scm_bignum *x, struct scm_bignum *y)
{
- mpz_t result, zx, zy;
- mpz_init (result);
- alias_bignum_to_mpz (x, zx);
- alias_bignum_to_mpz (y, zy);
- mpz_mul (result, zx, zy);
+ size_t xn = bignum_limb_count (x);
+ size_t yn = bignum_limb_count (y);
+ if (xn == 0 || yn == 0)
+ return SCM_INUM0;
+
+ struct scm_bignum *result = allocate_bignum (xn + yn);
+ mp_limb_t *rd = bignum_limbs (result);
+ const mp_limb_t *xd = bignum_limbs (x);
+ const mp_limb_t *yd = bignum_limbs (y);
+ int negate = bignum_is_negative (x) != bignum_is_negative (y);
+ if (xd == yd)
+ mpn_sqr (rd, xd, xn);
+ else if (xn <= yn)
+ mpn_mul (rd, yd, yn, xd, xn);
+ else
+ mpn_mul (rd, xd, xn, yd, yn);
scm_remember_upto_here_2 (x, y);
- return take_mpz (result);
+ return normalize_bignum
+ (bignum_negate_if (negate, (bignum_trim1 (result))));
}
int
- [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 <=
- [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, 2022/01/09
- [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