Index: src/ia32/code-stubs-ia32.cc |
diff --git a/src/ia32/code-stubs-ia32.cc b/src/ia32/code-stubs-ia32.cc |
index c113dfbc523a830a1de517209b336378248b1ec8..e0ac00da5a098a75e76fc25d474985889ca02e03 100644 |
--- a/src/ia32/code-stubs-ia32.cc |
+++ b/src/ia32/code-stubs-ia32.cc |
@@ -3767,98 +3767,13 @@ void RegExpConstructResultStub::Generate(MacroAssembler* masm) { |
} |
-void NumberToStringStub::GenerateLookupNumberStringCache(MacroAssembler* masm, |
- Register object, |
- Register result, |
- Register scratch1, |
- Register scratch2, |
- Label* not_found) { |
- // Use of registers. Register result is used as a temporary. |
- Register number_string_cache = result; |
- Register mask = scratch1; |
- Register scratch = scratch2; |
- |
- // Load the number string cache. |
- __ LoadRoot(number_string_cache, Heap::kNumberStringCacheRootIndex); |
- // Make the hash mask from the length of the number string cache. It |
- // contains two elements (number and string) for each cache entry. |
- __ mov(mask, FieldOperand(number_string_cache, FixedArray::kLengthOffset)); |
- __ shr(mask, kSmiTagSize + 1); // Untag length and divide it by two. |
- __ sub(mask, Immediate(1)); // Make mask. |
- |
- // Calculate the entry in the number string cache. The hash value in the |
- // number string cache for smis is just the smi value, and the hash for |
- // doubles is the xor of the upper and lower words. See |
- // Heap::GetNumberStringCache. |
- Label smi_hash_calculated; |
- Label load_result_from_cache; |
- Label not_smi; |
- STATIC_ASSERT(kSmiTag == 0); |
- __ JumpIfNotSmi(object, ¬_smi, Label::kNear); |
- __ mov(scratch, object); |
- __ SmiUntag(scratch); |
- __ jmp(&smi_hash_calculated, Label::kNear); |
- __ bind(¬_smi); |
- __ cmp(FieldOperand(object, HeapObject::kMapOffset), |
- masm->isolate()->factory()->heap_number_map()); |
- __ j(not_equal, not_found); |
- STATIC_ASSERT(8 == kDoubleSize); |
- __ mov(scratch, FieldOperand(object, HeapNumber::kValueOffset)); |
- __ xor_(scratch, FieldOperand(object, HeapNumber::kValueOffset + 4)); |
- // Object is heap number and hash is now in scratch. Calculate cache index. |
- __ and_(scratch, mask); |
- Register index = scratch; |
- Register probe = mask; |
- __ mov(probe, |
- FieldOperand(number_string_cache, |
- index, |
- times_twice_pointer_size, |
- FixedArray::kHeaderSize)); |
- __ JumpIfSmi(probe, not_found); |
- if (CpuFeatures::IsSupported(SSE2)) { |
- CpuFeatureScope fscope(masm, SSE2); |
- __ movdbl(xmm0, FieldOperand(object, HeapNumber::kValueOffset)); |
- __ movdbl(xmm1, FieldOperand(probe, HeapNumber::kValueOffset)); |
- __ ucomisd(xmm0, xmm1); |
- } else { |
- __ fld_d(FieldOperand(object, HeapNumber::kValueOffset)); |
- __ fld_d(FieldOperand(probe, HeapNumber::kValueOffset)); |
- __ FCmp(); |
- } |
- __ j(parity_even, not_found); // Bail out if NaN is involved. |
- __ j(not_equal, not_found); // The cache did not contain this value. |
- __ jmp(&load_result_from_cache, Label::kNear); |
- |
- __ bind(&smi_hash_calculated); |
- // Object is smi and hash is now in scratch. Calculate cache index. |
- __ and_(scratch, mask); |
- // Check if the entry is the smi we are looking for. |
- __ cmp(object, |
- FieldOperand(number_string_cache, |
- index, |
- times_twice_pointer_size, |
- FixedArray::kHeaderSize)); |
- __ j(not_equal, not_found); |
- |
- // Get the result from the cache. |
- __ bind(&load_result_from_cache); |
- __ mov(result, |
- FieldOperand(number_string_cache, |
- index, |
- times_twice_pointer_size, |
- FixedArray::kHeaderSize + kPointerSize)); |
- Counters* counters = masm->isolate()->counters(); |
- __ IncrementCounter(counters->number_to_string_native(), 1); |
-} |
- |
- |
void NumberToStringStub::Generate(MacroAssembler* masm) { |
Label runtime; |
__ mov(ebx, Operand(esp, kPointerSize)); |
// Generate code to lookup number in the number string cache. |
- GenerateLookupNumberStringCache(masm, ebx, eax, ecx, edx, &runtime); |
+ __ LookupNumberStringCache(ebx, eax, ecx, edx, &runtime); |
__ ret(1 * kPointerSize); |
__ bind(&runtime); |
@@ -5518,12 +5433,7 @@ void StringAddStub::GenerateConvertArgument(MacroAssembler* masm, |
// Check the number to string cache. |
__ bind(¬_string); |
// Puts the cached result into scratch1. |
- NumberToStringStub::GenerateLookupNumberStringCache(masm, |
- arg, |
- scratch1, |
- scratch2, |
- scratch3, |
- slow); |
+ __ LookupNumberStringCache(arg, scratch1, scratch2, scratch3, slow); |
__ mov(arg, scratch1); |
__ mov(Operand(esp, stack_offset), arg); |
__ bind(&done); |