summaryrefslogtreecommitdiffstats
path: root/include/linux/hash.h
diff options
context:
space:
mode:
authorDmitry Torokhov <dmitry.torokhov@gmail.com>2014-10-11 11:41:19 -0700
committerDmitry Torokhov <dmitry.torokhov@gmail.com>2014-10-11 11:41:19 -0700
commit4af6600fd793023c01634cca5abfe4a2b707788f (patch)
tree9e3a830d7782512b492011932ddd789d13a900c4 /include/linux/hash.h
parent447a8b858e4bda41c394b1bc7fdbc9dc0bdf44f6 (diff)
parent68da166491655bc54051bf04c78ce648e2e33508 (diff)
downloadop-kernel-dev-4af6600fd793023c01634cca5abfe4a2b707788f.zip
op-kernel-dev-4af6600fd793023c01634cca5abfe4a2b707788f.tar.gz
Merge branch 'next' into for-linus
Prepare second round of input updates for 3.18.
Diffstat (limited to 'include/linux/hash.h')
-rw-r--r--include/linux/hash.h4
1 files changed, 4 insertions, 0 deletions
diff --git a/include/linux/hash.h b/include/linux/hash.h
index bd1754c..d0494c3 100644
--- a/include/linux/hash.h
+++ b/include/linux/hash.h
@@ -37,6 +37,9 @@ static __always_inline u64 hash_64(u64 val, unsigned int bits)
{
u64 hash = val;
+#if defined(CONFIG_ARCH_HAS_FAST_MULTIPLIER) && BITS_PER_LONG == 64
+ hash = hash * GOLDEN_RATIO_PRIME_64;
+#else
/* Sigh, gcc can't optimise this alone like it does for 32 bits. */
u64 n = hash;
n <<= 18;
@@ -51,6 +54,7 @@ static __always_inline u64 hash_64(u64 val, unsigned int bits)
hash += n;
n <<= 2;
hash += n;
+#endif
/* High bits are more random, so use them. */
return hash >> (64 - bits);
OpenPOWER on IntegriCloud