aboutsummaryrefslogtreecommitdiffstats
path: root/src/data.c
diff options
context:
space:
mode:
authorMattias EngdegÄrd2025-09-01 12:51:15 +0200
committerMattias EngdegÄrd2025-09-01 14:20:04 +0200
commitbbc9ed387193efb57b5dd0179057a343ef16b006 (patch)
treeb40485bd9825a21c6b84e518971814bc7c2d83a7 /src/data.c
parent7c6de4fe73334e45deb4954bfe56e43808471eca (diff)
downloademacs-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.c26
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