aboutsummaryrefslogtreecommitdiffstats
path: root/src/lisp.h
diff options
context:
space:
mode:
authorPaul Eggert2013-10-07 14:37:19 -0700
committerPaul Eggert2013-10-07 14:37:19 -0700
commit595e113b15e2ce80b95d39d1851ce78f25ffa1f4 (patch)
tree42c02de46a13e0af39fcc83de9d57c29e309f99e /src/lisp.h
parentddb317ba828f05eb48e98fda530443955485e75d (diff)
downloademacs-595e113b15e2ce80b95d39d1851ce78f25ffa1f4.tar.gz
emacs-595e113b15e2ce80b95d39d1851ce78f25ffa1f4.zip
Improve support for popcount and counting trailing zeros.
Do this by using the Gnulib modules for this. This should generate faster code on non-GCC, non-MSC platforms, and make the code a bit more portable, at least in theory. * admin/merge-gnulib (GNULIB_MODULES): Add count-one-bits and count-trailing-zeros. * lib/count-one-bits.c, lib/count-one-bits.h: * lib/count-trailing-zeros.c, lib/count-trailing-zeros.h: * m4/count-one-bits.m4, m4/count-trailing-zeros.m4: New files, copied from gnulib. * lib/gnulib.mk, m4/gnulib-comp.m4: Regenerate. * nt/gnulib.mk: Merge changes from lib/gnulib.mk. * src/data.c: Include <count-one-bits.h>, <count-trailing-zeros.h>. (USE_MSC_POPCOUNT, POPCOUNT_STATIC_INLINE) (NEED_GENERIC_POPCOUNT, popcount_size_t_generic) (popcount_size_t_msc, popcount_size_t_gcc): Remove; now done by Gnulib. (popcount_size_t): Now a macro that defers to Gnulib. (count_trailing_zero_bits): Return int, for consistency with Gnulib and because Emacs prefers signed to unsigned int. Don't assume that size_t is either unsigned int or unsigned long or unsigned long long. (size_t_to_host_endian): Do not assume that size_t is either exactly 32 or exactly 64 bits wide. * src/lisp.h (BITS_PER_SIZE_T): Define consistently with BITS_PER_LONG etc., so that it's now an enum constant, not a macro. No need to assume that it's either 32 or 64. Fixes: debbugs:15550
Diffstat (limited to 'src/lisp.h')
-rw-r--r--src/lisp.h7
1 files changed, 1 insertions, 6 deletions
diff --git a/src/lisp.h b/src/lisp.h
index c7f13e21e55..b8863d6821d 100644
--- a/src/lisp.h
+++ b/src/lisp.h
@@ -71,6 +71,7 @@ enum
71 BITS_PER_SHORT = CHAR_BIT * sizeof (short), 71 BITS_PER_SHORT = CHAR_BIT * sizeof (short),
72 BITS_PER_INT = CHAR_BIT * sizeof (int), 72 BITS_PER_INT = CHAR_BIT * sizeof (int),
73 BITS_PER_LONG = CHAR_BIT * sizeof (long int), 73 BITS_PER_LONG = CHAR_BIT * sizeof (long int),
74 BITS_PER_SIZE_T = CHAR_BIT * sizeof (size_t),
74 BITS_PER_EMACS_INT = CHAR_BIT * sizeof (EMACS_INT) 75 BITS_PER_EMACS_INT = CHAR_BIT * sizeof (EMACS_INT)
75 }; 76 };
76 77
@@ -4366,12 +4367,6 @@ functionp (Lisp_Object object)
4366 return 0; 4367 return 0;
4367} 4368}
4368 4369
4369#if ((SIZE_MAX >> 31) >> 1) & 1
4370# define BITS_PER_SIZE_T 64
4371#else
4372# define BITS_PER_SIZE_T 32
4373#endif
4374
4375/* Round x to the next multiple of y. Does not overflow. Evaluates 4370/* Round x to the next multiple of y. Does not overflow. Evaluates
4376 arguments repeatedly. */ 4371 arguments repeatedly. */
4377#define ROUNDUP(x,y) ((y)*((x)/(y) + ((x)%(y)!=0))) 4372#define ROUNDUP(x,y) ((y)*((x)/(y) + ((x)%(y)!=0)))