From ed0fc417235b909ee3f67d696614c2239d95b844 Mon Sep 17 00:00:00 2001 From: "ager@chromium.org" Date: Wed, 16 Jun 2010 08:29:25 +0000 Subject: [PATCH] Change hash computation for transcendental cache to use arithmetic shifts. Leads to fewer collisions. Review URL: http://codereview.chromium.org/2809012 git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@4872 ce2b1a6d-e550-0410-aec6-3dcde31c8c00 --- src/arm/codegen-arm.cc | 6 +++--- src/heap.h | 4 ++-- src/ia32/codegen-ia32.cc | 6 +++--- src/x64/codegen-x64.cc | 8 ++++---- 4 files changed, 12 insertions(+), 12 deletions(-) diff --git a/src/arm/codegen-arm.cc b/src/arm/codegen-arm.cc index 325e67a..a2eb717 100644 --- a/src/arm/codegen-arm.cc +++ b/src/arm/codegen-arm.cc @@ -8304,11 +8304,11 @@ void TranscendentalCacheStub::Generate(MacroAssembler* masm) { __ bind(&loaded); // r2 = low 32 bits of double value // r3 = high 32 bits of double value - // Compute hash: + // Compute hash (the shifts are arithmetic): // h = (low ^ high); h ^= h >> 16; h ^= h >> 8; h = h & (cacheSize - 1); __ eor(r1, r2, Operand(r3)); - __ eor(r1, r1, Operand(r1, LSR, 16)); - __ eor(r1, r1, Operand(r1, LSR, 8)); + __ eor(r1, r1, Operand(r1, ASR, 16)); + __ eor(r1, r1, Operand(r1, ASR, 8)); ASSERT(IsPowerOf2(TranscendentalCache::kCacheSize)); __ And(r1, r1, Operand(TranscendentalCache::kCacheSize - 1)); diff --git a/src/heap.h b/src/heap.h index 0db4008..8386e73 100644 --- a/src/heap.h +++ b/src/heap.h @@ -1882,8 +1882,8 @@ class TranscendentalCache { }; inline static int Hash(const Converter& c) { uint32_t hash = (c.integers[0] ^ c.integers[1]); - hash ^= hash >> 16; - hash ^= hash >> 8; + hash ^= static_cast(hash) >> 16; + hash ^= static_cast(hash) >> 8; return (hash & (kCacheSize - 1)); } diff --git a/src/ia32/codegen-ia32.cc b/src/ia32/codegen-ia32.cc index 521e4fe..4471d8c 100644 --- a/src/ia32/codegen-ia32.cc +++ b/src/ia32/codegen-ia32.cc @@ -10293,15 +10293,15 @@ void TranscendentalCacheStub::Generate(MacroAssembler* masm) { // ST[0] == double value // ebx = low 32 bits of double value // edx = high 32 bits of double value - // Compute hash: + // Compute hash (the shifts are arithmetic): // h = (low ^ high); h ^= h >> 16; h ^= h >> 8; h = h & (cacheSize - 1); __ mov(ecx, ebx); __ xor_(ecx, Operand(edx)); __ mov(eax, ecx); - __ shr(eax, 16); + __ sar(eax, 16); __ xor_(ecx, Operand(eax)); __ mov(eax, ecx); - __ shr(eax, 8); + __ sar(eax, 8); __ xor_(ecx, Operand(eax)); ASSERT(IsPowerOf2(TranscendentalCache::kCacheSize)); __ and_(Operand(ecx), Immediate(TranscendentalCache::kCacheSize - 1)); diff --git a/src/x64/codegen-x64.cc b/src/x64/codegen-x64.cc index 1201ace..d5be787 100644 --- a/src/x64/codegen-x64.cc +++ b/src/x64/codegen-x64.cc @@ -8177,7 +8177,7 @@ void TranscendentalCacheStub::Generate(MacroAssembler* masm) { // ST[0] == double value // rbx = bits of double value. // rdx = also bits of double value. - // Compute hash (h is 32 bits, bits are 64): + // Compute hash (h is 32 bits, bits are 64 and the shifts are arithmetic): // h = h0 = bits ^ (bits >> 32); // h ^= h >> 16; // h ^= h >> 8; @@ -8188,9 +8188,9 @@ void TranscendentalCacheStub::Generate(MacroAssembler* masm) { __ movl(rcx, rdx); __ movl(rax, rdx); __ movl(rdi, rdx); - __ shrl(rdx, Immediate(8)); - __ shrl(rcx, Immediate(16)); - __ shrl(rax, Immediate(24)); + __ sarl(rdx, Immediate(8)); + __ sarl(rcx, Immediate(16)); + __ sarl(rax, Immediate(24)); __ xorl(rcx, rdx); __ xorl(rax, rdi); __ xorl(rcx, rax); -- 2.7.4