Chromium Code Reviews| Index: src/hydrogen-instructions.cc |
| diff --git a/src/hydrogen-instructions.cc b/src/hydrogen-instructions.cc |
| index 939b4f49748e3ea9acd0c7b6594d1e70e74071ff..a40dfe9241b97d8cb553b55718dfc201dc207238 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,41 +1849,86 @@ void HLoadNamedGeneric::PrintDataTo(StringStream* stream) { |
| } |
| -void HLoadKeyedFastElement::PrintDataTo(StringStream* stream) { |
| - object()->PrintNameTo(stream); |
| - stream->Add("["); |
| - key()->PrintNameTo(stream); |
| - stream->Add("] "); |
| - dependency()->PrintNameTo(stream); |
| - if (RequiresHoleCheck()) { |
| - stream->Add(" check_hole"); |
| +void HLoadKeyed::PrintDataTo(StringStream* stream) { |
| + if (!is_external()) { |
| + object()->PrintNameTo(stream); |
| + stream->Add("["); |
|
danno
2012/10/21 20:44:41
From the above line
mvstanton
2012/10/23 23:44:20
Done.
|
| + key()->PrintNameTo(stream); |
| + stream->Add("] "); |
| + dependency()->PrintNameTo(stream); |
| + if (RequiresHoleCheck()) { |
| + stream->Add(" check_hole"); |
| + } |
|
danno
2012/10/21 20:44:41
To here can be shared at the end of the routine. R
mvstanton
2012/10/23 23:44:20
Done.
|
| + } else { |
| + external_pointer()->PrintNameTo(stream); |
| + stream->Add("."); |
| + switch (elements_kind()) { |
|
Sven Panne
2012/10/22 06:14:18
DBC: Add a new function ElementsKind2String and us
mvstanton
2012/10/23 23:44:20
Good idea, thanks Sven. Now, the string will be di
|
| + 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); |
| } |
| } |
| -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,8 +1941,11 @@ 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()->IsLoadKeyed()) { |
| + HLoadKeyed* key_load = HLoadKeyed::cast(key()); |
| + // TODO(mvstanton): before this didn't recognize the fast double case, |
| + // now it does. Is that okay? Do a test that calls Canonicalize on a |
| + // fast double HLoadKeyed. |
|
danno
2012/10/21 20:44:41
Yes, this should be OK
mvstanton
2012/10/23 23:44:20
Done.
|
| if (key_load->object()->IsForInCacheArray()) { |
| HForInCacheArray* names_cache = |
| HForInCacheArray::cast(key_load->object()); |
| @@ -1907,10 +1955,12 @@ HValue* HLoadKeyedGeneric::Canonicalize() { |
| 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(), |
| + false); |
| map_check->InsertBefore(this); |
| index->InsertBefore(this); |
| HLoadFieldByIndex* load = new(block()->zone()) HLoadFieldByIndex( |
| @@ -1925,56 +1975,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,21 +2001,67 @@ void HStoreNamedField::PrintDataTo(StringStream* stream) { |
| } |
| -void HStoreKeyedFastElement::PrintDataTo(StringStream* stream) { |
| +void HStoreKeyed::PrintDataTo(StringStream* stream) { |
| object()->PrintNameTo(stream); |
| stream->Add("["); |
| key()->PrintNameTo(stream); |
| stream->Add("] = "); |
| value()->PrintNameTo(stream); |
| -} |
| -void HStoreKeyedFastDoubleElement::PrintDataTo(StringStream* stream) { |
| - elements()->PrintNameTo(stream); |
| - stream->Add("["); |
| - key()->PrintNameTo(stream); |
| - stream->Add("] = "); |
| - value()->PrintNameTo(stream); |
| + if (!is_external()) { |
| + object()->PrintNameTo(stream); |
| + stream->Add("["); |
|
danno
2012/10/21 20:44:41
Can share from above line...
mvstanton
2012/10/23 23:44:20
Done.
|
| + key()->PrintNameTo(stream); |
| + stream->Add("] = "); |
| + value()->PrintNameTo(stream); |
|
danno
2012/10/21 20:44:41
...to line above between both external and non-ext
mvstanton
2012/10/23 23:44:20
Done, also fixed duplicate code issue at line 2005
|
| + } else { |
| + external_pointer()->PrintNameTo(stream); |
| + stream->Add("."); |
| + switch (elements_kind()) { |
|
Sven Panne
2012/10/22 06:14:18
See my comment above...
mvstanton
2012/10/23 23:44:20
Done.
|
| + 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); |
| + } |
| } |
| @@ -2028,56 +2074,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 +2364,10 @@ HValue* HAdd::EnsureAndPropagateNotMinusZero(BitVector* visited) { |
| } |
| -bool HStoreKeyedFastDoubleElement::NeedsCanonicalization() { |
| +bool HStoreKeyed::NeedsCanonicalization() { |
| // If value was loaded from unboxed double backing store or |
| // 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; |
| } |