diff options
| author | Paul Eggert | 2018-08-18 23:06:41 -0700 |
|---|---|---|
| committer | Paul Eggert | 2018-08-18 23:07:00 -0700 |
| commit | 7ea369e5f22d6e3bcf1e55225c0ff356d9cabb2e (patch) | |
| tree | be44953a6dbb9607b1ec9a64ea80935295941127 /src/data.c | |
| parent | a1b79567a8253a8e8a1ceed02145a64b87a4768d (diff) | |
| download | emacs-7ea369e5f22d6e3bcf1e55225c0ff356d9cabb2e.tar.gz emacs-7ea369e5f22d6e3bcf1e55225c0ff356d9cabb2e.zip | |
Tweak integer division
* src/data.c (arith_driver): Reorder to remove unnecessary
FIXNUMP. Tighten test for whether to convert the divisor from
fixnum to mpz_t. Simplify.
Diffstat (limited to 'src/data.c')
| -rw-r--r-- | src/data.c | 13 |
1 files changed, 5 insertions, 8 deletions
diff --git a/src/data.c b/src/data.c index 5ef0ef85571..8a6975da3ab 100644 --- a/src/data.c +++ b/src/data.c | |||
| @@ -2896,11 +2896,11 @@ arith_driver (enum arithop code, ptrdiff_t nargs, Lisp_Object *args) | |||
| 2896 | { | 2896 | { |
| 2897 | /* Note that a bignum can never be 0, so we don't need | 2897 | /* Note that a bignum can never be 0, so we don't need |
| 2898 | to check that case. */ | 2898 | to check that case. */ |
| 2899 | if (FIXNUMP (val) && XFIXNUM (val) == 0) | ||
| 2900 | xsignal0 (Qarith_error); | ||
| 2901 | if (BIGNUMP (val)) | 2899 | if (BIGNUMP (val)) |
| 2902 | mpz_tdiv_q (accum, accum, XBIGNUM (val)->value); | 2900 | mpz_tdiv_q (accum, accum, XBIGNUM (val)->value); |
| 2903 | else if (sizeof (EMACS_INT) > sizeof (long)) | 2901 | else if (XFIXNUM (val) == 0) |
| 2902 | xsignal0 (Qarith_error); | ||
| 2903 | else if (ULONG_MAX < -MOST_NEGATIVE_FIXNUM) | ||
| 2904 | { | 2904 | { |
| 2905 | mpz_t tem; | 2905 | mpz_t tem; |
| 2906 | mpz_init (tem); | 2906 | mpz_init (tem); |
| @@ -2911,11 +2911,8 @@ arith_driver (enum arithop code, ptrdiff_t nargs, Lisp_Object *args) | |||
| 2911 | else | 2911 | else |
| 2912 | { | 2912 | { |
| 2913 | EMACS_INT value = XFIXNUM (val); | 2913 | EMACS_INT value = XFIXNUM (val); |
| 2914 | bool negate = value < 0; | 2914 | mpz_tdiv_q_ui (accum, accum, eabs (value)); |
| 2915 | if (negate) | 2915 | if (value < 0) |
| 2916 | value = -value; | ||
| 2917 | mpz_tdiv_q_ui (accum, accum, value); | ||
| 2918 | if (negate) | ||
| 2919 | mpz_neg (accum, accum); | 2916 | mpz_neg (accum, accum); |
| 2920 | } | 2917 | } |
| 2921 | } | 2918 | } |