Index: src/ia32/code-stubs-ia32.cc |
diff --git a/src/ia32/code-stubs-ia32.cc b/src/ia32/code-stubs-ia32.cc |
index f91bde7aa116f627b78f913a27b450834c8f7b04..bcc3bcd7a59d5b59972499bd342d2725eaecda5e 100644 |
--- a/src/ia32/code-stubs-ia32.cc |
+++ b/src/ia32/code-stubs-ia32.cc |
@@ -3972,7 +3972,6 @@ void NumberToStringStub::GenerateLookupNumberStringCache(MacroAssembler* masm, |
Register result, |
Register scratch1, |
Register scratch2, |
- bool object_is_smi, |
Label* not_found) { |
// Use of registers. Register result is used as a temporary. |
Register number_string_cache = result; |
@@ -3997,52 +3996,46 @@ void NumberToStringStub::GenerateLookupNumberStringCache(MacroAssembler* masm, |
// Heap::GetNumberStringCache. |
Label smi_hash_calculated; |
Label load_result_from_cache; |
- if (object_is_smi) { |
- __ mov(scratch, object); |
- __ SmiUntag(scratch); |
+ 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 { |
- 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); |
+ __ 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); |
- Register index = scratch; |
// Check if the entry is the smi we are looking for. |
__ cmp(object, |
FieldOperand(number_string_cache, |
@@ -4069,7 +4062,7 @@ void NumberToStringStub::Generate(MacroAssembler* masm) { |
__ mov(ebx, Operand(esp, kPointerSize)); |
// Generate code to lookup number in the number string cache. |
- GenerateLookupNumberStringCache(masm, ebx, eax, ecx, edx, false, &runtime); |
+ GenerateLookupNumberStringCache(masm, ebx, eax, ecx, edx, &runtime); |
__ ret(1 * kPointerSize); |
__ bind(&runtime); |
@@ -5759,7 +5752,6 @@ void StringAddStub::GenerateConvertArgument(MacroAssembler* masm, |
scratch1, |
scratch2, |
scratch3, |
- false, |
¬_cached); |
__ mov(arg, scratch1); |
__ mov(Operand(esp, stack_offset), arg); |