Index: src/crankshaft/hydrogen.cc |
diff --git a/src/crankshaft/hydrogen.cc b/src/crankshaft/hydrogen.cc |
index 43ee8b977f50202066ecda70c3f8190926280aa3..d62aa5f00123539640f579595b700d4fdb779e9e 100644 |
--- a/src/crankshaft/hydrogen.cc |
+++ b/src/crankshaft/hydrogen.cc |
@@ -1647,190 +1647,6 @@ HValue* HGraphBuilder::BuildCopyElementsOnWrite(HValue* object, |
return environment()->Pop(); |
} |
- |
-void HGraphBuilder::BuildJSObjectCheck(HValue* receiver, |
- int bit_field_mask) { |
- // Check that the object isn't a smi. |
- Add<HCheckHeapObject>(receiver); |
- |
- // Get the map of the receiver. |
- HValue* map = |
- Add<HLoadNamedField>(receiver, nullptr, HObjectAccess::ForMap()); |
- |
- // Check the instance type and if an access check is needed, this can be |
- // done with a single load, since both bytes are adjacent in the map. |
- HObjectAccess access(HObjectAccess::ForMapInstanceTypeAndBitField()); |
- HValue* instance_type_and_bit_field = |
- Add<HLoadNamedField>(map, nullptr, access); |
- |
- HValue* mask = Add<HConstant>(0x00FF | (bit_field_mask << 8)); |
- HValue* and_result = AddUncasted<HBitwise>(Token::BIT_AND, |
- instance_type_and_bit_field, |
- mask); |
- HValue* sub_result = AddUncasted<HSub>(and_result, |
- Add<HConstant>(JS_OBJECT_TYPE)); |
- Add<HBoundsCheck>(sub_result, |
- Add<HConstant>(LAST_JS_OBJECT_TYPE + 1 - JS_OBJECT_TYPE)); |
-} |
- |
- |
-void HGraphBuilder::BuildKeyedIndexCheck(HValue* key, |
- HIfContinuation* join_continuation) { |
- // The sometimes unintuitively backward ordering of the ifs below is |
- // convoluted, but necessary. All of the paths must guarantee that the |
- // if-true of the continuation returns a smi element index and the if-false of |
- // the continuation returns either a symbol or a unique string key. All other |
- // object types cause a deopt to fall back to the runtime. |
- |
- IfBuilder key_smi_if(this); |
- key_smi_if.If<HIsSmiAndBranch>(key); |
- key_smi_if.Then(); |
- { |
- Push(key); // Nothing to do, just continue to true of continuation. |
- } |
- key_smi_if.Else(); |
- { |
- HValue* map = Add<HLoadNamedField>(key, nullptr, HObjectAccess::ForMap()); |
- HValue* instance_type = |
- Add<HLoadNamedField>(map, nullptr, HObjectAccess::ForMapInstanceType()); |
- |
- // Non-unique string, check for a string with a hash code that is actually |
- // an index. |
- STATIC_ASSERT(LAST_UNIQUE_NAME_TYPE == FIRST_NONSTRING_TYPE); |
- IfBuilder not_string_or_name_if(this); |
- not_string_or_name_if.If<HCompareNumericAndBranch>( |
- instance_type, |
- Add<HConstant>(LAST_UNIQUE_NAME_TYPE), |
- Token::GT); |
- |
- not_string_or_name_if.Then(); |
- { |
- // Non-smi, non-Name, non-String: Try to convert to smi in case of |
- // HeapNumber. |
- // TODO(danno): This could call some variant of ToString |
- Push(AddUncasted<HForceRepresentation>(key, Representation::Smi())); |
- } |
- not_string_or_name_if.Else(); |
- { |
- // String or Name: check explicitly for Name, they can short-circuit |
- // directly to unique non-index key path. |
- IfBuilder not_symbol_if(this); |
- not_symbol_if.If<HCompareNumericAndBranch>( |
- instance_type, |
- Add<HConstant>(SYMBOL_TYPE), |
- Token::NE); |
- |
- not_symbol_if.Then(); |
- { |
- // String: check whether the String is a String of an index. If it is, |
- // extract the index value from the hash. |
- HValue* hash = Add<HLoadNamedField>(key, nullptr, |
- HObjectAccess::ForNameHashField()); |
- HValue* not_index_mask = Add<HConstant>(static_cast<int>( |
- String::kContainsCachedArrayIndexMask)); |
- |
- HValue* not_index_test = AddUncasted<HBitwise>( |
- Token::BIT_AND, hash, not_index_mask); |
- |
- IfBuilder string_index_if(this); |
- string_index_if.If<HCompareNumericAndBranch>(not_index_test, |
- graph()->GetConstant0(), |
- Token::EQ); |
- string_index_if.Then(); |
- { |
- // String with index in hash: extract string and merge to index path. |
- Push(BuildDecodeField<String::ArrayIndexValueBits>(hash)); |
- } |
- string_index_if.Else(); |
- { |
- // Key is a non-index String, check for uniqueness/internalization. |
- // If it's not internalized yet, internalize it now. |
- HValue* not_internalized_bit = AddUncasted<HBitwise>( |
- Token::BIT_AND, |
- instance_type, |
- Add<HConstant>(static_cast<int>(kIsNotInternalizedMask))); |
- |
- IfBuilder internalized(this); |
- internalized.If<HCompareNumericAndBranch>(not_internalized_bit, |
- graph()->GetConstant0(), |
- Token::EQ); |
- internalized.Then(); |
- Push(key); |
- |
- internalized.Else(); |
- Add<HPushArguments>(key); |
- HValue* intern_key = Add<HCallRuntime>( |
- Runtime::FunctionForId(Runtime::kInternalizeString), 1); |
- Push(intern_key); |
- |
- internalized.End(); |
- // Key guaranteed to be a unique string |
- } |
- string_index_if.JoinContinuation(join_continuation); |
- } |
- not_symbol_if.Else(); |
- { |
- Push(key); // Key is symbol |
- } |
- not_symbol_if.JoinContinuation(join_continuation); |
- } |
- not_string_or_name_if.JoinContinuation(join_continuation); |
- } |
- key_smi_if.JoinContinuation(join_continuation); |
-} |
- |
- |
-void HGraphBuilder::BuildNonGlobalObjectCheck(HValue* receiver) { |
- // Get the the instance type of the receiver, and make sure that it is |
- // not one of the global object types. |
- HValue* map = |
- Add<HLoadNamedField>(receiver, nullptr, HObjectAccess::ForMap()); |
- HValue* instance_type = |
- Add<HLoadNamedField>(map, nullptr, HObjectAccess::ForMapInstanceType()); |
- HValue* global_type = Add<HConstant>(JS_GLOBAL_OBJECT_TYPE); |
- |
- IfBuilder if_global_object(this); |
- if_global_object.If<HCompareNumericAndBranch>(instance_type, global_type, |
- Token::EQ); |
- if_global_object.ThenDeopt(DeoptimizeReason::kReceiverWasAGlobalObject); |
- if_global_object.End(); |
-} |
- |
- |
-void HGraphBuilder::BuildTestForDictionaryProperties( |
- HValue* object, |
- HIfContinuation* continuation) { |
- HValue* properties = Add<HLoadNamedField>( |
- object, nullptr, HObjectAccess::ForPropertiesPointer()); |
- HValue* properties_map = |
- Add<HLoadNamedField>(properties, nullptr, HObjectAccess::ForMap()); |
- HValue* hash_map = Add<HLoadRoot>(Heap::kHashTableMapRootIndex); |
- IfBuilder builder(this); |
- builder.If<HCompareObjectEqAndBranch>(properties_map, hash_map); |
- builder.CaptureContinuation(continuation); |
-} |
- |
- |
-HValue* HGraphBuilder::BuildKeyedLookupCacheHash(HValue* object, |
- HValue* key) { |
- // Load the map of the receiver, compute the keyed lookup cache hash |
- // based on 32 bits of the map pointer and the string hash. |
- HValue* object_map = |
- Add<HLoadNamedField>(object, nullptr, HObjectAccess::ForMapAsInteger32()); |
- HValue* shifted_map = AddUncasted<HShr>( |
- object_map, Add<HConstant>(KeyedLookupCache::kMapHashShift)); |
- HValue* string_hash = |
- Add<HLoadNamedField>(key, nullptr, HObjectAccess::ForStringHashField()); |
- HValue* shifted_hash = AddUncasted<HShr>( |
- string_hash, Add<HConstant>(String::kHashShift)); |
- HValue* xor_result = AddUncasted<HBitwise>(Token::BIT_XOR, shifted_map, |
- shifted_hash); |
- int mask = (KeyedLookupCache::kCapacityMask & KeyedLookupCache::kHashMask); |
- return AddUncasted<HBitwise>(Token::BIT_AND, xor_result, |
- Add<HConstant>(mask)); |
-} |
- |
- |
HValue* HGraphBuilder::BuildElementIndexHash(HValue* index) { |
int32_t seed_value = static_cast<uint32_t>(isolate()->heap()->HashSeed()); |
HValue* seed = Add<HConstant>(seed_value); |
@@ -1997,7 +1813,6 @@ HValue* HGraphBuilder::BuildUncheckedDictionaryElementLoad(HValue* receiver, |
return Pop(); |
} |
- |
HValue* HGraphBuilder::BuildCreateIterResultObject(HValue* value, |
HValue* done) { |
NoObservableSideEffectsScope scope(this); |