summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorvlefevre <vlefevre@280ebfd0-de03-0410-8827-d642c229c3f4>2018-09-05 15:23:00 +0000
committervlefevre <vlefevre@280ebfd0-de03-0410-8827-d642c229c3f4>2018-09-05 15:23:00 +0000
commit5a73260116f2c357e2c68761c4700a11c56556e2 (patch)
tree4499f4bdfd53d0df5d114a013a68b92ff438e938
parentac7ce8b09e14c6df8837ab185df70646608a297c (diff)
downloadmpfr-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.am2
-rw-r--r--src/exp_2.c46
-rw-r--r--src/nbits_ulong.c66
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
+}