summaryrefslogtreecommitdiff
path: root/src/bignum.h
diff options
context:
space:
mode:
authorPaul Eggert <eggert@cs.ucla.edu>2024-07-11 12:27:36 +0200
committerPaul Eggert <eggert@cs.ucla.edu>2024-07-11 16:01:41 +0200
commit1c8e64a9536ed092af27279fa3f044cf031a4324 (patch)
treeea4df87d22f36b9eb5456c5782865003a99aee2f /src/bignum.h
parent2fb7bb41bee5e39391c9abc8013bcef39782e88d (diff)
downloademacs-1c8e64a9536ed092af27279fa3f044cf031a4324.tar.gz
emacs-1c8e64a9536ed092af27279fa3f044cf031a4324.tar.bz2
emacs-1c8e64a9536ed092af27279fa3f044cf031a4324.zip
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.
Diffstat (limited to 'src/bignum.h')
-rw-r--r--src/bignum.h16
1 files 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 @@ along with GNU Emacs. If not, see <https://www.gnu.org/licenses/>. */
#include <gmp.h>
#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);
}