blob: 23a7156108486d241afca7af82ce317008ffbf02 [file] [log] [blame]
diff --git a/base/third_party/cityhash/city.cc b/base/third_party/cityhash/city.cc
index 41cd5ee16993..be08dc99cf18 100644
--- a/base/third_party/cityhash/city.cc
+++ b/base/third_party/cityhash/city.cc
@@ -27,12 +27,14 @@
// possible hash functions, by using SIMD instructions, or by
// compromising on hash quality.
-#include "config.h"
-#include <city.h>
+#include "city.h"
#include <algorithm>
#include <string.h> // for memcpy and memset
+namespace base {
+namespace internal {
+namespace cityhash_v111 {
using namespace std;
static uint64 UNALIGNED_LOAD64(const char *p) {
@@ -89,7 +91,12 @@ static uint32 UNALIGNED_LOAD32(const char *p) {
#else
-#include <byteswap.h>
+// XXX(cavalcanti): building 'native_client' fails with this header.
+//#include <byteswap.h>
+
+// Falling back to compiler builtins instead.
+#define bswap_32(x) __builtin_bswap32(x)
+#define bswap_64(x) __builtin_bswap64(x)
#endif
@@ -217,11 +224,11 @@ uint32 CityHash32(const char *s, size_t len) {
f = f * 5 + 0xe6546b64;
size_t iters = (len - 1) / 20;
do {
- uint32 a0 = Rotate32(Fetch32(s) * c1, 17) * c2;
- uint32 a1 = Fetch32(s + 4);
- uint32 a2 = Rotate32(Fetch32(s + 8) * c1, 17) * c2;
- uint32 a3 = Rotate32(Fetch32(s + 12) * c1, 17) * c2;
- uint32 a4 = Fetch32(s + 16);
+ a0 = Rotate32(Fetch32(s) * c1, 17) * c2;
+ a1 = Fetch32(s + 4);
+ a2 = Rotate32(Fetch32(s + 8) * c1, 17) * c2;
+ a3 = Rotate32(Fetch32(s + 12) * c1, 17) * c2;
+ a4 = Fetch32(s + 16);
h ^= a0;
h = Rotate32(h, 18);
h = h * 5 + 0xe6546b64;
@@ -512,135 +519,7 @@ uint128 CityHash128(const char *s, size_t len) {
CityHash128WithSeed(s, len, uint128(k0, k1));
}
-#ifdef __SSE4_2__
-#include <citycrc.h>
-#include <nmmintrin.h>
-
-// Requires len >= 240.
-static void CityHashCrc256Long(const char *s, size_t len,
- uint32 seed, uint64 *result) {
- uint64 a = Fetch64(s + 56) + k0;
- uint64 b = Fetch64(s + 96) + k0;
- uint64 c = result[0] = HashLen16(b, len);
- uint64 d = result[1] = Fetch64(s + 120) * k0 + len;
- uint64 e = Fetch64(s + 184) + seed;
- uint64 f = 0;
- uint64 g = 0;
- uint64 h = c + d;
- uint64 x = seed;
- uint64 y = 0;
- uint64 z = 0;
-
- // 240 bytes of input per iter.
- size_t iters = len / 240;
- len -= iters * 240;
- do {
-#undef CHUNK
-#define CHUNK(r) \
- PERMUTE3(x, z, y); \
- b += Fetch64(s); \
- c += Fetch64(s + 8); \
- d += Fetch64(s + 16); \
- e += Fetch64(s + 24); \
- f += Fetch64(s + 32); \
- a += b; \
- h += f; \
- b += c; \
- f += d; \
- g += e; \
- e += z; \
- g += x; \
- z = _mm_crc32_u64(z, b + g); \
- y = _mm_crc32_u64(y, e + h); \
- x = _mm_crc32_u64(x, f + a); \
- e = Rotate(e, r); \
- c += e; \
- s += 40
-
- CHUNK(0); PERMUTE3(a, h, c);
- CHUNK(33); PERMUTE3(a, h, f);
- CHUNK(0); PERMUTE3(b, h, f);
- CHUNK(42); PERMUTE3(b, h, d);
- CHUNK(0); PERMUTE3(b, h, e);
- CHUNK(33); PERMUTE3(a, h, e);
- } while (--iters > 0);
-
- while (len >= 40) {
- CHUNK(29);
- e ^= Rotate(a, 20);
- h += Rotate(b, 30);
- g ^= Rotate(c, 40);
- f += Rotate(d, 34);
- PERMUTE3(c, h, g);
- len -= 40;
- }
- if (len > 0) {
- s = s + len - 40;
- CHUNK(33);
- e ^= Rotate(a, 43);
- h += Rotate(b, 42);
- g ^= Rotate(c, 41);
- f += Rotate(d, 40);
- }
- result[0] ^= h;
- result[1] ^= g;
- g += h;
- a = HashLen16(a, g + z);
- x += y << 32;
- b += x;
- c = HashLen16(c, z) + h;
- d = HashLen16(d, e + result[0]);
- g += e;
- h += HashLen16(x, f);
- e = HashLen16(a, d) + g;
- z = HashLen16(b, c) + a;
- y = HashLen16(g, h) + c;
- result[0] = e + z + y + x;
- a = ShiftMix((a + y) * k0) * k0 + b;
- result[1] += a + result[0];
- a = ShiftMix(a * k0) * k0 + c;
- result[2] = a + result[1];
- a = ShiftMix((a + e) * k0) * k0;
- result[3] = a + result[2];
-}
-
-// Requires len < 240.
-static void CityHashCrc256Short(const char *s, size_t len, uint64 *result) {
- char buf[240];
- memcpy(buf, s, len);
- memset(buf + len, 0, 240 - len);
- CityHashCrc256Long(buf, 240, ~static_cast<uint32>(len), result);
-}
-
-void CityHashCrc256(const char *s, size_t len, uint64 *result) {
- if (LIKELY(len >= 240)) {
- CityHashCrc256Long(s, len, 0, result);
- } else {
- CityHashCrc256Short(s, len, result);
- }
-}
-
-uint128 CityHashCrc128WithSeed(const char *s, size_t len, uint128 seed) {
- if (len <= 900) {
- return CityHash128WithSeed(s, len, seed);
- } else {
- uint64 result[4];
- CityHashCrc256(s, len, result);
- uint64 u = Uint128High64(seed) + result[0];
- uint64 v = Uint128Low64(seed) + result[1];
- return uint128(HashLen16(u, v + result[2]),
- HashLen16(Rotate(v, 32), u * k0 + result[3]));
- }
-}
+} // namespace cityhash_v111
+} // namespace internal
+} // namespace base
-uint128 CityHashCrc128(const char *s, size_t len) {
- if (len <= 900) {
- return CityHash128(s, len);
- } else {
- uint64 result[4];
- CityHashCrc256(s, len, result);
- return uint128(result[2], result[3]);
- }
-}
-
-#endif
diff --git a/base/third_party/cityhash/city.h b/base/third_party/cityhash/city.h
index 94499ce419c7..e4672f6d44da 100644
--- a/base/third_party/cityhash/city.h
+++ b/base/third_party/cityhash/city.h
@@ -59,13 +59,20 @@
// of a+b is easily derived from the hashes of a and b. This property
// doesn't hold for any hash functions in this file.
-#ifndef CITY_HASH_H_
-#define CITY_HASH_H_
+#ifndef BASE_THIRD_PARTY_CITYHASH_CITY_H_
+#define BASE_THIRD_PARTY_CITYHASH_CITY_H_
#include <stdlib.h> // for size_t.
#include <stdint.h>
#include <utility>
+// XXX(cavalcantii): Declaring it inside of the 'base' namespace allows to
+// handle linker symbol clash error with deprecated CityHash from
+// third_party/smhasher in a few unit tests.
+namespace base {
+namespace internal {
+namespace cityhash_v111 {
+
typedef uint8_t uint8;
typedef uint32_t uint32;
typedef uint64_t uint64;
@@ -109,4 +116,8 @@ inline uint64 Hash128to64(const uint128& x) {
return b;
}
+} // namespace cityhash_v111
+} // namespace internal
+} // namespace base
+
#endif // CITY_HASH_H_