Chromium Code Reviews| Index: src/hydrogen-instructions.cc |
| diff --git a/src/hydrogen-instructions.cc b/src/hydrogen-instructions.cc |
| index 939b4f49748e3ea9acd0c7b6594d1e70e74071ff..dcd16e19829ad30233a8654a23d9ea817bacf3da 100644 |
| --- a/src/hydrogen-instructions.cc |
| +++ b/src/hydrogen-instructions.cc |
| @@ -1622,7 +1622,7 @@ Range* HShl::InferRange(Zone* zone) { |
| } |
| -Range* HLoadKeyedSpecializedArrayElement::InferRange(Zone* zone) { |
| +Range* HLoadKeyed::InferRange(Zone* zone) { |
| switch (elements_kind()) { |
| case EXTERNAL_PIXEL_ELEMENTS: |
| return new(zone) Range(0, 255); |
| @@ -1849,8 +1849,17 @@ void HLoadNamedGeneric::PrintDataTo(StringStream* stream) { |
| } |
| -void HLoadKeyedFastElement::PrintDataTo(StringStream* stream) { |
| - object()->PrintNameTo(stream); |
| +void HLoadKeyed::PrintDataTo(StringStream* stream) { |
| + if (!is_external()) { |
| + elements()->PrintNameTo(stream); |
| + } else { |
| + ASSERT(elements_kind() >= FIRST_EXTERNAL_ARRAY_ELEMENTS_KIND && |
| + elements_kind() <= LAST_EXTERNAL_ARRAY_ELEMENTS_KIND); |
| + elements()->PrintNameTo(stream); |
| + stream->Add("."); |
| + stream->Add(ElementsKindToString(elements_kind())); |
| + } |
| + |
| stream->Add("["); |
| key()->PrintNameTo(stream); |
| stream->Add("] "); |
| @@ -1861,29 +1870,26 @@ void HLoadKeyedFastElement::PrintDataTo(StringStream* stream) { |
| } |
| -bool HLoadKeyedFastElement::RequiresHoleCheck() const { |
| +bool HLoadKeyed::RequiresHoleCheck() const { |
| if (IsFastPackedElementsKind(elements_kind())) { |
| return false; |
| } |
| + if (IsFastDoubleElementsKind(elements_kind())) { |
| + return true; |
| + } |
| + |
| for (HUseIterator it(uses()); !it.Done(); it.Advance()) { |
| HValue* use = it.value(); |
| - if (!use->IsChange()) return true; |
| + if (!use->IsChange()) { |
| + return true; |
| + } |
| } |
| return false; |
| } |
| -void HLoadKeyedFastDoubleElement::PrintDataTo(StringStream* stream) { |
| - elements()->PrintNameTo(stream); |
| - stream->Add("["); |
| - key()->PrintNameTo(stream); |
| - stream->Add("] "); |
| - dependency()->PrintNameTo(stream); |
| -} |
| - |
| - |
| void HLoadKeyedGeneric::PrintDataTo(StringStream* stream) { |
| object()->PrintNameTo(stream); |
| stream->Add("["); |
| @@ -1896,21 +1902,22 @@ HValue* HLoadKeyedGeneric::Canonicalize() { |
| // Recognize generic keyed loads that use property name generated |
| // by for-in statement as a key and rewrite them into fast property load |
| // by index. |
| - if (key()->IsLoadKeyedFastElement()) { |
| - HLoadKeyedFastElement* key_load = HLoadKeyedFastElement::cast(key()); |
| - if (key_load->object()->IsForInCacheArray()) { |
| + if (key()->IsLoadKeyed()) { |
| + HLoadKeyed* key_load = HLoadKeyed::cast(key()); |
| + if (key_load->elements()->IsForInCacheArray()) { |
| HForInCacheArray* names_cache = |
| - HForInCacheArray::cast(key_load->object()); |
| + HForInCacheArray::cast(key_load->elements()); |
| if (names_cache->enumerable() == object()) { |
| HForInCacheArray* index_cache = |
| names_cache->index_cache(); |
| HCheckMapValue* map_check = |
| new(block()->zone()) HCheckMapValue(object(), names_cache->map()); |
| - HInstruction* index = new(block()->zone()) HLoadKeyedFastElement( |
| + HInstruction* index = new(block()->zone()) HLoadKeyed( |
| index_cache, |
| key_load->key(), |
| - key_load->key()); |
| + key_load->key(), |
| + key_load->elements_kind()); |
| map_check->InsertBefore(this); |
| index->InsertBefore(this); |
| HLoadFieldByIndex* load = new(block()->zone()) HLoadFieldByIndex( |
| @@ -1925,56 +1932,6 @@ HValue* HLoadKeyedGeneric::Canonicalize() { |
| } |
| -void HLoadKeyedSpecializedArrayElement::PrintDataTo( |
| - StringStream* stream) { |
| - external_pointer()->PrintNameTo(stream); |
| - stream->Add("."); |
| - switch (elements_kind()) { |
| - case EXTERNAL_BYTE_ELEMENTS: |
| - stream->Add("byte"); |
| - break; |
| - case EXTERNAL_UNSIGNED_BYTE_ELEMENTS: |
| - stream->Add("u_byte"); |
| - break; |
| - case EXTERNAL_SHORT_ELEMENTS: |
| - stream->Add("short"); |
| - break; |
| - case EXTERNAL_UNSIGNED_SHORT_ELEMENTS: |
| - stream->Add("u_short"); |
| - break; |
| - case EXTERNAL_INT_ELEMENTS: |
| - stream->Add("int"); |
| - break; |
| - case EXTERNAL_UNSIGNED_INT_ELEMENTS: |
| - stream->Add("u_int"); |
| - break; |
| - case EXTERNAL_FLOAT_ELEMENTS: |
| - stream->Add("float"); |
| - break; |
| - case EXTERNAL_DOUBLE_ELEMENTS: |
| - stream->Add("double"); |
| - break; |
| - case EXTERNAL_PIXEL_ELEMENTS: |
| - stream->Add("pixel"); |
| - break; |
| - case FAST_ELEMENTS: |
| - case FAST_SMI_ELEMENTS: |
| - case FAST_DOUBLE_ELEMENTS: |
| - case FAST_HOLEY_ELEMENTS: |
| - case FAST_HOLEY_SMI_ELEMENTS: |
| - case FAST_HOLEY_DOUBLE_ELEMENTS: |
| - case DICTIONARY_ELEMENTS: |
| - case NON_STRICT_ARGUMENTS_ELEMENTS: |
| - UNREACHABLE(); |
| - break; |
| - } |
| - stream->Add("["); |
| - key()->PrintNameTo(stream); |
| - stream->Add("] "); |
| - dependency()->PrintNameTo(stream); |
| -} |
| - |
| - |
| void HStoreNamedGeneric::PrintDataTo(StringStream* stream) { |
| object()->PrintNameTo(stream); |
| stream->Add("."); |
| @@ -2001,17 +1958,17 @@ void HStoreNamedField::PrintDataTo(StringStream* stream) { |
| } |
| -void HStoreKeyedFastElement::PrintDataTo(StringStream* stream) { |
| - object()->PrintNameTo(stream); |
| - stream->Add("["); |
| - key()->PrintNameTo(stream); |
| - stream->Add("] = "); |
| - value()->PrintNameTo(stream); |
| -} |
| - |
| +void HStoreKeyed::PrintDataTo(StringStream* stream) { |
| + if (!is_external()) { |
| + elements()->PrintNameTo(stream); |
| + } else { |
| + elements()->PrintNameTo(stream); |
| + stream->Add("."); |
| + stream->Add(ElementsKindToString(elements_kind())); |
| + ASSERT(elements_kind() >= FIRST_EXTERNAL_ARRAY_ELEMENTS_KIND && |
| + elements_kind() <= LAST_EXTERNAL_ARRAY_ELEMENTS_KIND); |
| + } |
| -void HStoreKeyedFastDoubleElement::PrintDataTo(StringStream* stream) { |
| - elements()->PrintNameTo(stream); |
| stream->Add("["); |
| key()->PrintNameTo(stream); |
| stream->Add("] = "); |
| @@ -2028,56 +1985,6 @@ void HStoreKeyedGeneric::PrintDataTo(StringStream* stream) { |
| } |
| -void HStoreKeyedSpecializedArrayElement::PrintDataTo( |
| - StringStream* stream) { |
| - external_pointer()->PrintNameTo(stream); |
| - stream->Add("."); |
| - switch (elements_kind()) { |
| - case EXTERNAL_BYTE_ELEMENTS: |
| - stream->Add("byte"); |
| - break; |
| - case EXTERNAL_UNSIGNED_BYTE_ELEMENTS: |
| - stream->Add("u_byte"); |
| - break; |
| - case EXTERNAL_SHORT_ELEMENTS: |
| - stream->Add("short"); |
| - break; |
| - case EXTERNAL_UNSIGNED_SHORT_ELEMENTS: |
| - stream->Add("u_short"); |
| - break; |
| - case EXTERNAL_INT_ELEMENTS: |
| - stream->Add("int"); |
| - break; |
| - case EXTERNAL_UNSIGNED_INT_ELEMENTS: |
| - stream->Add("u_int"); |
| - break; |
| - case EXTERNAL_FLOAT_ELEMENTS: |
| - stream->Add("float"); |
| - break; |
| - case EXTERNAL_DOUBLE_ELEMENTS: |
| - stream->Add("double"); |
| - break; |
| - case EXTERNAL_PIXEL_ELEMENTS: |
| - stream->Add("pixel"); |
| - break; |
| - case FAST_SMI_ELEMENTS: |
| - case FAST_ELEMENTS: |
| - case FAST_DOUBLE_ELEMENTS: |
| - case FAST_HOLEY_SMI_ELEMENTS: |
| - case FAST_HOLEY_ELEMENTS: |
| - case FAST_HOLEY_DOUBLE_ELEMENTS: |
| - case DICTIONARY_ELEMENTS: |
| - case NON_STRICT_ARGUMENTS_ELEMENTS: |
| - UNREACHABLE(); |
| - break; |
| - } |
| - stream->Add("["); |
| - key()->PrintNameTo(stream); |
| - stream->Add("] = "); |
| - value()->PrintNameTo(stream); |
| -} |
| - |
| - |
| void HTransitionElementsKind::PrintDataTo(StringStream* stream) { |
| object()->PrintNameTo(stream); |
| ElementsKind from_kind = original_map()->elements_kind(); |
| @@ -2368,10 +2275,10 @@ HValue* HAdd::EnsureAndPropagateNotMinusZero(BitVector* visited) { |
| } |
| -bool HStoreKeyedFastDoubleElement::NeedsCanonicalization() { |
| +bool HStoreKeyed::NeedsCanonicalization() { |
| // If value was loaded from unboxed double backing store or |
|
danno
2012/10/29 14:56:13
nit: fix the comment here, it's now out of date. Y
mvstanton
2012/10/29 15:23:57
Done.
|
| // converted from an integer then we don't have to canonicalize it. |
| - if (value()->IsLoadKeyedFastDoubleElement() || |
| + if (value()->IsLoadKeyed() || |
| (value()->IsChange() && HChange::cast(value())->from().IsInteger32())) { |
| return false; |
| } |