diff options
| author | Mattias EngdegÄrd | 2025-09-01 12:51:15 +0200 |
|---|---|---|
| committer | Mattias EngdegÄrd | 2025-09-01 14:20:04 +0200 |
| commit | bbc9ed387193efb57b5dd0179057a343ef16b006 (patch) | |
| tree | b40485bd9825a21c6b84e518971814bc7c2d83a7 /src/data.c | |
| parent | 7c6de4fe73334e45deb4954bfe56e43808471eca (diff) | |
| download | emacs-bbc9ed387193efb57b5dd0179057a343ef16b006.tar.gz emacs-bbc9ed387193efb57b5dd0179057a343ef16b006.zip | |
* src/data.c (Fash): Speed up when argument and result are fixnums.
Diffstat (limited to 'src/data.c')
| -rw-r--r-- | src/data.c | 26 |
1 files changed, 17 insertions, 9 deletions
diff --git a/src/data.c b/src/data.c index b8a48203bcf..202ab0a2a36 100644 --- a/src/data.c +++ b/src/data.c | |||
| @@ -3523,10 +3523,10 @@ discarding bits. */) | |||
| 3523 | CHECK_INTEGER (value); | 3523 | CHECK_INTEGER (value); |
| 3524 | CHECK_INTEGER (count); | 3524 | CHECK_INTEGER (count); |
| 3525 | 3525 | ||
| 3526 | if (BASE_EQ (value, make_fixnum (0))) | ||
| 3527 | return value; | ||
| 3526 | if (! FIXNUMP (count)) | 3528 | if (! FIXNUMP (count)) |
| 3527 | { | 3529 | { |
| 3528 | if (BASE_EQ (value, make_fixnum (0))) | ||
| 3529 | return value; | ||
| 3530 | if (mpz_sgn (*xbignum_val (count)) < 0) | 3530 | if (mpz_sgn (*xbignum_val (count)) < 0) |
| 3531 | { | 3531 | { |
| 3532 | EMACS_INT v = (FIXNUMP (value) ? XFIXNUM (value) | 3532 | EMACS_INT v = (FIXNUMP (value) ? XFIXNUM (value) |
| @@ -3536,30 +3536,38 @@ discarding bits. */) | |||
| 3536 | overflow_error (); | 3536 | overflow_error (); |
| 3537 | } | 3537 | } |
| 3538 | 3538 | ||
| 3539 | if (XFIXNUM (count) <= 0) | 3539 | EMACS_INT c = XFIXNUM (count); |
| 3540 | if (c <= 0) | ||
| 3540 | { | 3541 | { |
| 3541 | if (XFIXNUM (count) == 0) | 3542 | if (c == 0) |
| 3542 | return value; | 3543 | return value; |
| 3543 | 3544 | ||
| 3544 | if ((EMACS_INT) -1 >> 1 == -1 && FIXNUMP (value)) | 3545 | if ((EMACS_INT) -1 >> 1 == -1 && FIXNUMP (value)) |
| 3545 | { | 3546 | { |
| 3546 | EMACS_INT shift = -XFIXNUM (count); | 3547 | EMACS_INT shift = -c; |
| 3547 | EMACS_INT result | 3548 | EMACS_INT result |
| 3548 | = (shift < EMACS_INT_WIDTH ? XFIXNUM (value) >> shift | 3549 | = (shift < EMACS_INT_WIDTH ? XFIXNUM (value) >> shift |
| 3549 | : XFIXNUM (value) < 0 ? -1 : 0); | 3550 | : XFIXNUM (value) < 0 ? -1 : 0); |
| 3550 | return make_fixnum (result); | 3551 | return make_fixnum (result); |
| 3551 | } | 3552 | } |
| 3552 | } | 3553 | } |
| 3554 | else if (FIXNUMP (value)) | ||
| 3555 | { | ||
| 3556 | EMACS_INT v = XFIXNUM (value); | ||
| 3557 | if (stdc_leading_zeros (v < 0 ? ~v : v) - c | ||
| 3558 | >= EMACS_INT_WIDTH - FIXNUM_BITS + 1) | ||
| 3559 | return make_fixnum (v << c); | ||
| 3560 | } | ||
| 3553 | 3561 | ||
| 3554 | mpz_t const *zval = bignum_integer (&mpz[0], value); | 3562 | mpz_t const *zval = bignum_integer (&mpz[0], value); |
| 3555 | if (XFIXNUM (count) < 0) | 3563 | if (c < 0) |
| 3556 | { | 3564 | { |
| 3557 | if (TYPE_MAXIMUM (mp_bitcnt_t) < - XFIXNUM (count)) | 3565 | if (TYPE_MAXIMUM (mp_bitcnt_t) < -c) |
| 3558 | return make_fixnum (mpz_sgn (*zval) < 0 ? -1 : 0); | 3566 | return make_fixnum (mpz_sgn (*zval) < 0 ? -1 : 0); |
| 3559 | mpz_fdiv_q_2exp (mpz[0], *zval, - XFIXNUM (count)); | 3567 | mpz_fdiv_q_2exp (mpz[0], *zval, -c); |
| 3560 | } | 3568 | } |
| 3561 | else | 3569 | else |
| 3562 | emacs_mpz_mul_2exp (mpz[0], *zval, XFIXNUM (count)); | 3570 | emacs_mpz_mul_2exp (mpz[0], *zval, c); |
| 3563 | return make_integer_mpz (); | 3571 | return make_integer_mpz (); |
| 3564 | } | 3572 | } |
| 3565 | 3573 | ||