| Index: src/ia32/macro-assembler-ia32.cc | 
| diff --git a/src/ia32/macro-assembler-ia32.cc b/src/ia32/macro-assembler-ia32.cc | 
| index 66bfb6569ae3978966231b6354fb5eebc945b27d..f0cacc9377110eec955692b3d1d7c5012dbb116a 100644 | 
| --- a/src/ia32/macro-assembler-ia32.cc | 
| +++ b/src/ia32/macro-assembler-ia32.cc | 
| @@ -992,6 +992,49 @@ void MacroAssembler::CheckAccessGlobalProxy(Register holder_reg, | 
| } | 
|  | 
|  | 
| +// Compute the hash code from the untagged key.  This must be kept in sync | 
| +// with ComputeIntegerHash in utils.h. | 
| +// | 
| +// Note: r0 will contain hash code | 
| +void MacroAssembler::GetNumberHash(Register r0, Register scratch) { | 
| +  // Xor original key with a seed. | 
| +  if (Serializer::enabled()) { | 
| +    ExternalReference roots_array_start = | 
| +        ExternalReference::roots_array_start(isolate()); | 
| +    mov(scratch, Immediate(Heap::kStringHashSeedRootIndex)); | 
| +    xor_(r0, Operand::StaticArray(scratch, | 
| +                                  times_pointer_size, | 
| +                                  roots_array_start)); | 
| +  } else { | 
| +    int32_t seed = isolate()->heap()->StringHashSeed(); | 
| +    xor_(r0, Immediate(seed)); | 
| +  } | 
| + | 
| +  // hash = ~hash + (hash << 15); | 
| +  mov(scratch, r0); | 
| +  not_(r0); | 
| +  shl(scratch, 15); | 
| +  add(r0, scratch); | 
| +  // hash = hash ^ (hash >> 12); | 
| +  mov(scratch, r0); | 
| +  shr(scratch, 12); | 
| +  xor_(r0, scratch); | 
| +  // hash = hash + (hash << 2); | 
| +  lea(r0, Operand(r0, r0, times_4, 0)); | 
| +  // hash = hash ^ (hash >> 4); | 
| +  mov(scratch, r0); | 
| +  shr(scratch, 4); | 
| +  xor_(r0, scratch); | 
| +  // hash = hash * 2057; | 
| +  imul(r0, r0, 2057); | 
| +  // hash = hash ^ (hash >> 16); | 
| +  mov(scratch, r0); | 
| +  shr(scratch, 16); | 
| +  xor_(r0, scratch); | 
| +} | 
| + | 
| + | 
| + | 
| void MacroAssembler::LoadFromNumberDictionary(Label* miss, | 
| Register elements, | 
| Register key, | 
| @@ -1017,30 +1060,7 @@ void MacroAssembler::LoadFromNumberDictionary(Label* miss, | 
|  | 
| Label done; | 
|  | 
| -  // Compute the hash code from the untagged key.  This must be kept in sync | 
| -  // with ComputeIntegerHash in utils.h. | 
| -  // | 
| -  // hash = ~hash + (hash << 15); | 
| -  mov(r1, r0); | 
| -  not_(r0); | 
| -  shl(r1, 15); | 
| -  add(r0, r1); | 
| -  // hash = hash ^ (hash >> 12); | 
| -  mov(r1, r0); | 
| -  shr(r1, 12); | 
| -  xor_(r0, r1); | 
| -  // hash = hash + (hash << 2); | 
| -  lea(r0, Operand(r0, r0, times_4, 0)); | 
| -  // hash = hash ^ (hash >> 4); | 
| -  mov(r1, r0); | 
| -  shr(r1, 4); | 
| -  xor_(r0, r1); | 
| -  // hash = hash * 2057; | 
| -  imul(r0, r0, 2057); | 
| -  // hash = hash ^ (hash >> 16); | 
| -  mov(r1, r0); | 
| -  shr(r1, 16); | 
| -  xor_(r0, r1); | 
| +  GetNumberHash(r0, r1); | 
|  | 
| // Compute capacity mask. | 
| mov(r1, FieldOperand(elements, NumberDictionary::kCapacityOffset)); | 
|  |