Index: src/hydrogen.cc |
diff --git a/src/hydrogen.cc b/src/hydrogen.cc |
index 3ce9a948f3ec1c0d2ab91fdae23aa70483b97e1c..50882a8a7f899e657076b55d7be7a1feedbcc191 100644 |
--- a/src/hydrogen.cc |
+++ b/src/hydrogen.cc |
@@ -1273,142 +1273,6 @@ void HGraphBuilder::BuildTransitionElementsKind(HValue* object, |
} |
-HValue* HGraphBuilder::BuildLookupNumberStringCache( |
- HValue* object, |
- HIfContinuation* continuation) { |
- // Create a joinable continuation. |
- HIfContinuation found(graph()->CreateBasicBlock(), |
- graph()->CreateBasicBlock()); |
- |
- // Load the number string cache. |
- HValue* number_string_cache = |
- Add<HLoadRoot>(Heap::kNumberStringCacheRootIndex); |
- |
- // Make the hash maks from the length of the number string cache. It |
- // contains two elements (number and string) for each cache entry. |
- HValue* mask = AddLoadFixedArrayLength(number_string_cache); |
- mask->set_type(HType::Smi()); |
- mask = Add<HSar>(mask, graph()->GetConstant1()); |
- mask = Add<HSub>(mask, graph()->GetConstant1()); |
- |
- // Check whether object is a smi. |
- IfBuilder if_objectissmi(this); |
- if_objectissmi.If<HIsSmiAndBranch>(object); |
- if_objectissmi.Then(); |
- { |
- // Compute hash for smi similar to smi_get_hash(). |
- HValue* hash = Add<HBitwise>(Token::BIT_AND, object, mask); |
- |
- // Load the key. |
- HValue* key_index = Add<HShl>(hash, graph()->GetConstant1()); |
- HValue* key = AddFastElementAccess(number_string_cache, key_index, |
- NULL, NULL, FAST_ELEMENTS, false, |
- ALLOW_RETURN_HOLE, STANDARD_STORE); |
- |
- // Check if object == key. |
- IfBuilder if_objectiskey(this); |
- if_objectiskey.If<HCompareObjectEqAndBranch>(key, object); |
- if_objectiskey.Then(); |
- { |
- // Make the key_index available. |
- Push(key_index); |
- } |
- if_objectiskey.JoinContinuation(&found); |
- } |
- if_objectissmi.Else(); |
- { |
- // Check if object is a heap number. |
- IfBuilder if_objectisnumber(this); |
- if_objectisnumber.If<HCompareMap>( |
- object, isolate()->factory()->heap_number_map()); |
- if_objectisnumber.Then(); |
- { |
- // Compute hash for heap number similar to double_get_hash(). |
- HValue* low = Add<HLoadNamedField>( |
- object, HObjectAccess::ForHeapNumberValueLowestBits()); |
- HValue* high = Add<HLoadNamedField>( |
- object, HObjectAccess::ForHeapNumberValueHighestBits()); |
- HValue* hash = Add<HBitwise>(Token::BIT_XOR, low, high); |
- hash = Add<HBitwise>(Token::BIT_AND, hash, mask); |
- |
- // Load the key. |
- HValue* key_index = Add<HShl>(hash, graph()->GetConstant1()); |
- HValue* key = AddFastElementAccess(number_string_cache, key_index, |
- NULL, NULL, FAST_ELEMENTS, false, |
- ALLOW_RETURN_HOLE, STANDARD_STORE); |
- |
- // Check if key is a heap number. |
- IfBuilder if_keyisnumber(this); |
- if_keyisnumber.IfNot<HIsSmiAndBranch>(key); |
- if_keyisnumber.AndIf<HCompareMap>( |
- key, isolate()->factory()->heap_number_map()); |
- if_keyisnumber.Then(); |
- { |
- // Check if values of key and object match. |
- IfBuilder if_keyeqobject(this); |
- if_keyeqobject.If<HCompareNumericAndBranch>( |
- Add<HLoadNamedField>(key, HObjectAccess::ForHeapNumberValue()), |
- Add<HLoadNamedField>(object, HObjectAccess::ForHeapNumberValue()), |
- Token::EQ); |
- if_keyeqobject.Then(); |
- { |
- // Make the key_index available. |
- Push(key_index); |
- } |
- if_keyeqobject.JoinContinuation(&found); |
- } |
- if_keyisnumber.JoinContinuation(&found); |
- } |
- if_objectisnumber.JoinContinuation(&found); |
- } |
- if_objectissmi.End(); |
- |
- // Check for cache hit. |
- IfBuilder if_found(this, &found); |
- if_found.Then(); |
- |
- // Load the value in case of cache hit. |
- HValue* key_index = Pop(); |
- HValue* value_index = Add<HAdd>(key_index, graph()->GetConstant1()); |
- HValue* value = AddFastElementAccess(number_string_cache, value_index, |
- NULL, NULL, FAST_ELEMENTS, false, |
- ALLOW_RETURN_HOLE, STANDARD_STORE); |
- AddIncrementCounter(isolate()->counters()->number_to_string_native()); |
- |
- if_found.CaptureContinuation(continuation); |
- |
- // The value is only available in true branch of continuation. |
- return value; |
-} |
- |
- |
-HValue* HGraphBuilder::BuildNumberToString(HValue* number) { |
- NoObservableSideEffectsScope scope(this); |
- |
- // Lookup the number in the number string cache. |
- HIfContinuation continuation; |
- HValue* value = BuildLookupNumberStringCache(number, &continuation); |
- IfBuilder if_found(this, &continuation); |
- if_found.Then(); |
- |
- // Cache hit. |
- Push(value); |
- |
- if_found.Else(); |
- |
- // Cache miss, fallback to runtime. |
- Add<HPushArgument>(number); |
- Push(Add<HCallRuntime>( |
- isolate()->factory()->empty_string(), |
- Runtime::FunctionForId(Runtime::kNumberToStringSkipCache), |
- 1)); |
- |
- if_found.End(); |
- |
- return Pop(); |
-} |
- |
- |
HInstruction* HGraphBuilder::BuildUncheckedMonomorphicElementAccess( |
HValue* checked_object, |
HValue* key, |
@@ -9145,10 +9009,12 @@ void HOptimizedGraphBuilder::GenerateGetFromCache(CallRuntime* call) { |
// Fast support for number to string. |
void HOptimizedGraphBuilder::GenerateNumberToString(CallRuntime* call) { |
ASSERT_EQ(1, call->arguments()->length()); |
- CHECK_ALIVE(VisitForValue(call->arguments()->at(0))); |
- HValue* number = Pop(); |
- HValue* result = BuildNumberToString(number); |
- return ast_context()->ReturnValue(result); |
+ CHECK_ALIVE(VisitArgumentList(call->arguments())); |
+ HValue* context = environment()->context(); |
+ HCallStub* result = |
+ new(zone()) HCallStub(context, CodeStub::NumberToString, 1); |
+ Drop(1); |
+ return ast_context()->ReturnInstruction(result, call->id()); |
} |