From d566616f528a55795abeaf9ea48833a6f5488759 Mon Sep 17 00:00:00 2001 From: Paul Eggert Date: Thu, 11 Jul 2024 12:27:36 +0200 Subject: [PATCH 12/17] New FASTER_BIGNUM macro to test slow-path code * src/bignum.h (FASTER_BIGNUM): New macro. (mpz_set_intmax, mpz_set_uintmax): Optimize only if FASTER_BIGNUM. Also, use ckd_add to test for overflow instead of doing it by hand. --- src/bignum.h | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/src/bignum.h b/src/bignum.h index 2749f8370d0..54ba0cde410 100644 --- a/src/bignum.h +++ b/src/bignum.h @@ -25,6 +25,12 @@ #define BIGNUM_H #include #include "lisp.h" +/* Compile with -DFASTER_BIGNUM=0 to disable common optimizations and + allow easier testing of some slow-path code. */ +#ifndef FASTER_BIGNUM +# define FASTER_BIGNUM 1 +#endif + /* Number of data bits in a limb. */ #ifndef GMP_NUMB_BITS enum { GMP_NUMB_BITS = TYPE_WIDTH (mp_limb_t) }; @@ -68,16 +74,18 @@ mpz_set_intmax (mpz_t result, intmax_t v) /* mpz_set_si works in terms of long, but Emacs may use a wider integer type, and so sometimes will have to construct the mpz_t by hand. */ - if (LONG_MIN <= v && v <= LONG_MAX) - mpz_set_si (result, v); + long int i; + if (FASTER_BIGNUM && !ckd_add (&i, v, 0)) + mpz_set_si (result, i); else mpz_set_intmax_slow (result, v); } INLINE void ARG_NONNULL ((1)) mpz_set_uintmax (mpz_t result, uintmax_t v) { - if (v <= ULONG_MAX) - mpz_set_ui (result, v); + unsigned long int i; + if (FASTER_BIGNUM && !ckd_add (&i, v, 0)) + mpz_set_ui (result, i); else mpz_set_uintmax_slow (result, v); } -- 2.34.1