diff options
author | vlefevre <vlefevre@280ebfd0-de03-0410-8827-d642c229c3f4> | 2018-09-05 15:23:00 +0000 |
---|---|---|
committer | vlefevre <vlefevre@280ebfd0-de03-0410-8827-d642c229c3f4> | 2018-09-05 15:23:00 +0000 |
commit | 5a73260116f2c357e2c68761c4700a11c56556e2 (patch) | |
tree | 4499f4bdfd53d0df5d114a013a68b92ff438e938 | |
parent | ac7ce8b09e14c6df8837ab185df70646608a297c (diff) | |
download | mpfr-5a73260116f2c357e2c68761c4700a11c56556e2.tar.gz |
[src] Moved mpfr_nbits_ulong to its own file "nbits_ulong.c".
git-svn-id: svn://scm.gforge.inria.fr/svn/mpfr/trunk@13143 280ebfd0-de03-0410-8827-d642c229c3f4
-rw-r--r-- | src/Makefile.am | 2 | ||||
-rw-r--r-- | src/exp_2.c | 46 | ||||
-rw-r--r-- | src/nbits_ulong.c | 66 |
3 files changed, 68 insertions, 46 deletions
diff --git a/src/Makefile.am b/src/Makefile.am index 519f05be5..1577359c5 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -60,7 +60,7 @@ grandom.c fpif.c set_float128.c get_float128.c rndna.c nrandom.c \ random_deviate.h random_deviate.c erandom.c mpfr-mini-gmp.c \ mpfr-mini-gmp.h fmma.c log_ui.c gamma_inc.c ubf.c invert_limb.h \ invsqrt_limb.h beta.c odd_p.c get_q.c pool.c total_order.c set_d128.c \ -get_d128.c +get_d128.c nbits_ulong.c libmpfr_la_LIBADD = @LIBOBJS@ diff --git a/src/exp_2.c b/src/exp_2.c index cc1c5f3c0..c4fe70f03 100644 --- a/src/exp_2.c +++ b/src/exp_2.c @@ -21,9 +21,7 @@ along with the GNU MPFR Library; see the file COPYING.LESSER. If not, see http://www.gnu.org/licenses/ or write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. */ -#ifdef MPFR_LONG_WITHIN_LIMB -#define MPFR_NEED_LONGLONG_H /* for count_leading_zeros */ -#endif +#define MPFR_NEED_LONGLONG_H /* MPFR_INT_CEIL_LOG2 */ #include "mpfr-impl.h" static unsigned long @@ -35,48 +33,6 @@ mpz_normalize (mpz_t, mpz_t, mpfr_exp_t); static mpfr_exp_t mpz_normalize2 (mpz_t, mpz_t, mpfr_exp_t, mpfr_exp_t); -/* count the number of significant bits of n, i.e., - nbits(unsigned long) - count_leading_zeros (n) */ -int -mpfr_nbits_ulong (unsigned long n) -{ -#ifdef MPFR_LONG_WITHIN_LIMB - int cnt; - count_leading_zeros (cnt, (mp_limb_t) n); - return GMP_NUMB_BITS - cnt; -#else - int nbits = 0; - - MPFR_ASSERTD (n > 0); - while (n >= 0x10000) - { - n >>= 16; - nbits += 16; - } - MPFR_ASSERTD (n <= 0xffff); - if (n >= 0x100) - { - n >>= 8; - nbits += 8; - } - MPFR_ASSERTD (n <= 0xff); - if (n >= 0x10) - { - n >>= 4; - nbits += 4; - } - MPFR_ASSERTD (n <= 0xf); - if (n >= 4) - { - n >>= 2; - nbits += 2; - } - MPFR_ASSERTD (n <= 3); - /* now n = 1, 2, or 3 */ - return nbits + 1 + (n >= 2); -#endif -} - /* if k = the number of bits of z > q, divides z by 2^(k-q) and returns k-q. Otherwise do nothing and return 0. */ diff --git a/src/nbits_ulong.c b/src/nbits_ulong.c new file mode 100644 index 000000000..be76aa233 --- /dev/null +++ b/src/nbits_ulong.c @@ -0,0 +1,66 @@ +/* mpfr_nbits_ulong -- number of significant bits in an unsigned long + +Copyright 2018 Free Software Foundation, Inc. +Contributed by the AriC and Caramba projects, INRIA. + +This file is part of the GNU MPFR Library. + +The GNU MPFR Library is free software; you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The GNU MPFR Library is distributed in the hope that it will be useful, but +WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public +License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with the GNU MPFR Library; see the file COPYING.LESSER. If not, see +http://www.gnu.org/licenses/ or write to the Free Software Foundation, Inc., +51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. */ + +#define MPFR_NEED_LONGLONG_H /* for count_leading_zeros */ +#include "mpfr-impl.h" + +/* count the number of significant bits of n, i.e., + nbits(unsigned long) - count_leading_zeros (n) */ +int +mpfr_nbits_ulong (unsigned long n) +{ +#ifdef MPFR_LONG_WITHIN_LIMB + int cnt; + count_leading_zeros (cnt, (mp_limb_t) n); + return GMP_NUMB_BITS - cnt; +#else + int nbits = 0; + + MPFR_ASSERTD (n > 0); + while (n >= 0x10000) + { + n >>= 16; + nbits += 16; + } + MPFR_ASSERTD (n <= 0xffff); + if (n >= 0x100) + { + n >>= 8; + nbits += 8; + } + MPFR_ASSERTD (n <= 0xff); + if (n >= 0x10) + { + n >>= 4; + nbits += 4; + } + MPFR_ASSERTD (n <= 0xf); + if (n >= 4) + { + n >>= 2; + nbits += 2; + } + MPFR_ASSERTD (n <= 3); + /* now n = 1, 2, or 3 */ + return nbits + 1 + (n >= 2); +#endif +} |