From: Jakub Jelinek Date: Sun, 17 Oct 2004 07:15:53 +0000 (+0200) Subject: pointer-set.c (hash1): Use integer part of 2^64 / phi instead 2^32 / phi if long... X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=bc54ef99a22a4a77efb7f8f79230a5a0d3d3f4d8;p=gcc.git pointer-set.c (hash1): Use integer part of 2^64 / phi instead 2^32 / phi if long is 64-bit. * pointer-set.c (hash1): Use integer part of 2^64 / phi instead 2^32 / phi if long is 64-bit. From-SVN: r89165 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index cfc0ac2a3ae..91e97316f02 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +2004-10-17 Jakub Jelinek + + * pointer-set.c (hash1): Use integer part of 2^64 / phi + instead 2^32 / phi if long is 64-bit. + 2004-10-17 Joseph S. Myers * c-common.h (enum rid): Remove RID_PTRBASE, RID_PTREXTENT and diff --git a/gcc/pointer-set.c b/gcc/pointer-set.c index 06592d741a6..f8023c7fc6c 100644 --- a/gcc/pointer-set.c +++ b/gcc/pointer-set.c @@ -46,8 +46,8 @@ struct pointer_set_t relatively prime to 2^sizeof(size_t). The result is two words. Discard the most significant word, and return the most significant N bits of the least significant word. As suggested by Knuth, our - choice for A is the integer part of 2^32 / phi, where phi is the - golden ratio. + choice for A is the integer part of (ULONG_MAX + 1.0) / phi, where phi + is the golden ratio. We don't need to do anything special for full-width multiplication because we're only interested in the least significant word of the @@ -56,8 +56,16 @@ struct pointer_set_t static inline size_t hash1 (const void *p, unsigned long max, unsigned long logmax) { +#if HOST_BITS_PER_LONG == 32 const unsigned long A = 0x9e3779b9u; - const unsigned long shift = sizeof(unsigned long) * CHAR_BIT - logmax; +#elif HOST_BITS_PER_LONG == 64 + const unsigned long A = 0x9e3779b97f4a7c16ul; +#else + const double M = (ULONG_MAX + 1.0); + const double B = M / ((sqrt (5) - 1) / 2.0); + const unsigned long A = B - (floor (B / M) * M); +#endif + const unsigned long shift = sizeof (unsigned long) * CHAR_BIT - logmax; return ((A * (unsigned long) p) >> shift) & (max - 1); }