diff options
| author | Tom Tromey | 2018-07-07 14:22:44 -0600 |
|---|---|---|
| committer | Tom Tromey | 2018-07-12 22:12:27 -0600 |
| commit | a770fb44288c75fa2b0471ceaf00bf741376e40f (patch) | |
| tree | 263136cf11b50104797d7642247b87fab2814ded /src | |
| parent | c7e393bc4130c871a92fef7e9ac0c7c1832aa614 (diff) | |
| download | emacs-a770fb44288c75fa2b0471ceaf00bf741376e40f.tar.gz emacs-a770fb44288c75fa2b0471ceaf00bf741376e40f.zip | |
Make logcount handle bignums
* src/data.c (Flogcount): Handle bignums.
* test/src/data-tests.el (data-tests-logcount): New test.
Diffstat (limited to 'src')
| -rw-r--r-- | src/data.c | 17 |
1 files changed, 16 insertions, 1 deletions
diff --git a/src/data.c b/src/data.c index c9504694e37..2e366b5313f 100644 --- a/src/data.c +++ b/src/data.c | |||
| @@ -3184,7 +3184,22 @@ of VALUE. If VALUE is negative, return the number of zero bits in the | |||
| 3184 | representation. */) | 3184 | representation. */) |
| 3185 | (Lisp_Object value) | 3185 | (Lisp_Object value) |
| 3186 | { | 3186 | { |
| 3187 | CHECK_FIXNUM (value); | 3187 | CHECK_INTEGER (value); |
| 3188 | |||
| 3189 | if (BIGNUMP (value)) | ||
| 3190 | { | ||
| 3191 | if (mpz_cmp_si (XBIGNUM (value)->value, 0) >= 0) | ||
| 3192 | return make_fixnum (mpz_popcount (XBIGNUM (value)->value)); | ||
| 3193 | mpz_t tem; | ||
| 3194 | mpz_init (tem); | ||
| 3195 | mpz_neg (tem, XBIGNUM (value)->value); | ||
| 3196 | mpz_sub_ui (tem, tem, 1); | ||
| 3197 | Lisp_Object result = make_fixnum (mpz_popcount (tem)); | ||
| 3198 | mpz_clear (tem); | ||
| 3199 | return result; | ||
| 3200 | } | ||
| 3201 | |||
| 3202 | eassume (FIXNUMP (value)); | ||
| 3188 | EMACS_INT v = XINT (value) < 0 ? -1 - XINT (value) : XINT (value); | 3203 | EMACS_INT v = XINT (value) < 0 ? -1 - XINT (value) : XINT (value); |
| 3189 | return make_fixnum (EMACS_UINT_WIDTH <= UINT_WIDTH | 3204 | return make_fixnum (EMACS_UINT_WIDTH <= UINT_WIDTH |
| 3190 | ? count_one_bits (v) | 3205 | ? count_one_bits (v) |