]> gcc.gnu.org Git - gcc.git/commitdiff
pointer-set.c (hash1): Use integer part of 2^64 / phi instead 2^32 / phi if long...
authorJakub Jelinek <jakub@redhat.com>
Sun, 17 Oct 2004 07:15:53 +0000 (09:15 +0200)
committerJakub Jelinek <jakub@gcc.gnu.org>
Sun, 17 Oct 2004 07:15:53 +0000 (09:15 +0200)
* pointer-set.c (hash1): Use integer part of 2^64 / phi
instead 2^32 / phi if long is 64-bit.

From-SVN: r89165

gcc/ChangeLog
gcc/pointer-set.c

index cfc0ac2a3ae0e587c01e5516d6ef211b9b97b537..91e97316f02bcaa77f512eeaa4d136acf09eddbb 100644 (file)
@@ -1,3 +1,8 @@
+2004-10-17  Jakub Jelinek  <jakub@redhat.com>
+
+       * 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  <jsm@polyomino.org.uk>
 
        * c-common.h (enum rid): Remove RID_PTRBASE, RID_PTREXTENT and
index 06592d741a667328215c3c03004f0503c35dd814..f8023c7fc6c7b52e37881f54c967030710a9fdef 100644 (file)
@@ -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);
 }
This page took 0.090982 seconds and 5 git commands to generate.