From eff1c1900f47ec5dfb6d435325b366362d09d2db Mon Sep 17 00:00:00 2001 From: Paul Eggert Date: Sat, 9 Feb 2013 14:42:33 -0800 Subject: Minor hashing refactoring. * fns.c (SXHASH_REDUCE): Move to lisp.h. (sxhash_float): Return EMACS_UINT, for consistency with the other hash functions. * lisp.h (INTMASK): Now a macro, since SXHASH_REDUCE is now a non-static inline function and therefore can't use static vars. (SXHASH_REDUCE): Move here from fns.c, and make it inline. * profiler.c (hashfn_profiler): Use SXHASH_REDUCE, to be consistent with the other hash functions. --- src/ChangeLog | 12 ++++++++++++ src/fns.c | 6 +----- src/lisp.h | 10 +++++++++- src/profiler.c | 2 +- 4 files changed, 23 insertions(+), 7 deletions(-) diff --git a/src/ChangeLog b/src/ChangeLog index cfe59c2ec88..05d69382855 100644 --- a/src/ChangeLog +++ b/src/ChangeLog @@ -1,3 +1,15 @@ +2013-02-09 Paul Eggert + + Minor hashing refactoring. + * fns.c (SXHASH_REDUCE): Move to lisp.h. + (sxhash_float): Return EMACS_UINT, for consistency with the other + hash functions. + * lisp.h (INTMASK): Now a macro, since SXHASH_REDUCE is now a + non-static inline function and therefore can't use static vars. + (SXHASH_REDUCE): Move here from fns.c, and make it inline. + * profiler.c (hashfn_profiler): Use SXHASH_REDUCE, to be consistent + with the other hash functions. + 2013-02-09 Eli Zaretskii * callproc.c (Fcall_process_region) [WINDOWSNT]: Make sure the diff --git a/src/fns.c b/src/fns.c index ecd1a31335a..527976593da 100644 --- a/src/fns.c +++ b/src/fns.c @@ -4045,10 +4045,6 @@ sweep_weak_hash_tables (void) #define SXHASH_MAX_LEN 7 -/* Hash X, returning a value that fits into a Lisp integer. */ -#define SXHASH_REDUCE(X) \ - ((((X) ^ (X) >> (BITS_PER_EMACS_INT - FIXNUM_BITS))) & INTMASK) - /* Return a hash for string PTR which has length LEN. The hash value can be any EMACS_UINT value. */ @@ -4081,7 +4077,7 @@ sxhash_string (char const *ptr, ptrdiff_t len) /* Return a hash for the floating point value VAL. */ -static EMACS_INT +static EMACS_UINT sxhash_float (double val) { EMACS_UINT hash = 0; diff --git a/src/lisp.h b/src/lisp.h index c15e83bd51c..14db66c6793 100644 --- a/src/lisp.h +++ b/src/lisp.h @@ -227,7 +227,7 @@ enum enum_USE_LSB_TAG { USE_LSB_TAG = 0 }; /* Lisp integers use 2 tags, to give them one extra bit, thus extending their range from, e.g., -2^28..2^28-1 to -2^29..2^29-1. */ -static EMACS_INT const INTMASK = EMACS_INT_MAX >> (INTTYPEBITS - 1); +#define INTMASK (EMACS_INT_MAX >> (INTTYPEBITS - 1)) #define case_Lisp_Int case Lisp_Int0: case Lisp_Int1 #define LISP_INT_TAG_P(x) (((x) & ~Lisp_Int1) == 0) @@ -1304,6 +1304,14 @@ sxhash_combine (EMACS_UINT x, EMACS_UINT y) return (x << 4) + (x >> (BITS_PER_EMACS_INT - 4)) + y; } +/* Hash X, returning a value that fits into a fixnum. */ + +LISP_INLINE EMACS_UINT +SXHASH_REDUCE (EMACS_UINT x) +{ + return (x ^ x >> (BITS_PER_EMACS_INT - FIXNUM_BITS)) & INTMASK; +} + /* These structures are used for various misc types. */ struct Lisp_Misc_Any /* Supertype of all Misc types. */ diff --git a/src/profiler.c b/src/profiler.c index f6503cf182e..85d9c1ca88a 100644 --- a/src/profiler.c +++ b/src/profiler.c @@ -560,7 +560,7 @@ hashfn_profiler (struct hash_table_test *ht, Lisp_Object bt) ? XHASH (XCDR (XCDR (f))) : XHASH (f)); hash = sxhash_combine (hash, hash1); } - return (hash & INTMASK); + return SXHASH_REDUCE (hash); } else return XHASH (bt); -- cgit v1.2.1