From: ager@chromium.org Date: Wed, 16 Jun 2010 08:29:25 +0000 (+0000) Subject: Change hash computation for transcendental cache to use arithmetic X-Git-Tag: upstream/4.7.83~21633 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=ed0fc417235b909ee3f67d696614c2239d95b844;p=platform%2Fupstream%2Fv8.git 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 --- 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);