Chromium Code Reviews| Index: src/hydrogen-instructions.h |
| diff --git a/src/hydrogen-instructions.h b/src/hydrogen-instructions.h |
| index fde3abcbe8d3567814a218ff515ab6c43940a9a6..708f1b4f31421445e14d46174a6e96b35f151f00 100644 |
| --- a/src/hydrogen-instructions.h |
| +++ b/src/hydrogen-instructions.h |
| @@ -6316,6 +6316,9 @@ class HLoadKeyed V8_FINAL |
| bool is_external() const { |
| return IsExternalArrayElementsKind(elements_kind()); |
| } |
| + bool is_fixed_typed_array() const { |
| + return IsFixedTypedArrayElementsKind(elements_kind()); |
| + } |
| HValue* elements() { return OperandAt(0); } |
| HValue* key() { return OperandAt(1); } |
| HValue* dependency() { |
| @@ -6344,9 +6347,10 @@ class HLoadKeyed V8_FINAL |
| } |
| virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE { |
| - // kind_fast: tagged[int32] (none) |
| - // kind_double: tagged[int32] (none) |
| - // kind_external: external[int32] (none) |
| + // kind_fast: tagged[int32] (none) |
| + // kind_double: tagged[int32] (none) |
| + // kind_fixed_typed_array: tagged[int32] (none) |
| + // kind_external: external[int32] (none) |
| if (index == 0) { |
| return is_external() ? Representation::External() |
| : Representation::Tagged(); |
| @@ -6396,7 +6400,7 @@ class HLoadKeyed V8_FINAL |
| SetOperandAt(1, key); |
| SetOperandAt(2, dependency != NULL ? dependency : obj); |
| - if (!is_external()) { |
| + if (!is_external() && !is_fixed_typed_array()) { |
| // I can detect the case between storing double (holey and fast) and |
| // smi/object by looking at elements_kind_. |
| ASSERT(IsFastSmiOrObjectElementsKind(elements_kind) || |
| @@ -6423,13 +6427,21 @@ class HLoadKeyed V8_FINAL |
| } |
| } else { |
| if (elements_kind == EXTERNAL_FLOAT_ELEMENTS || |
| - elements_kind == EXTERNAL_DOUBLE_ELEMENTS) { |
| + elements_kind == EXTERNAL_DOUBLE_ELEMENTS || |
| + elements_kind == FLOAT32_ELEMENTS || |
| + elements_kind == FLOAT64_ELEMENTS) { |
| set_representation(Representation::Double()); |
| } else { |
| set_representation(Representation::Integer32()); |
| } |
| - SetGVNFlag(kDependsOnExternalMemory); |
| + if (is_external()) { |
| + SetGVNFlag(kDependsOnExternalMemory); |
| + } else if (is_fixed_typed_array()) { |
| + SetGVNFlag(kDependsOnArrayElements); |
|
Toon Verwaest
2013/12/23 10:40:32
Don't you want to make a separate DependsOnTypedAr
Dmitry Lomov (no reviews)
2014/01/07 15:48:43
Done. Good suggestion.
|
| + } else { |
| + UNREACHABLE(); |
| + } |
| // Native code could change the specialized array. |
| SetGVNFlag(kDependsOnCalls); |
| } |
| @@ -6688,10 +6700,11 @@ class HStoreKeyed V8_FINAL |
| ElementsKind, StoreFieldOrKeyedMode); |
| virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE { |
| - // kind_fast: tagged[int32] = tagged |
| - // kind_double: tagged[int32] = double |
| - // kind_smi : tagged[int32] = smi |
| - // kind_external: external[int32] = (double | int32) |
| + // kind_fast: tagged[int32] = tagged |
| + // kind_double: tagged[int32] = double |
| + // kind_smi : tagged[int32] = smi |
| + // kind_fixed_typed_array: tagged[int32] = (double | int32) |
| + // kind_external: external[int32] = (double | int32) |
| if (index == 0) { |
| return is_external() ? Representation::External() |
| : Representation::Tagged(); |
| @@ -6711,7 +6724,8 @@ class HStoreKeyed V8_FINAL |
| return Representation::Smi(); |
| } |
| - return is_external() ? Representation::Integer32() |
| + return is_external() || is_fixed_typed_array() |
| + ? Representation::Integer32() |
|
Toon Verwaest
2013/12/23 10:40:32
4-space indent if you put the ? on a new line.
Dmitry Lomov (no reviews)
2014/01/07 15:48:43
Done.
|
| : Representation::Tagged(); |
| } |
| @@ -6719,6 +6733,10 @@ class HStoreKeyed V8_FINAL |
| return IsExternalArrayElementsKind(elements_kind()); |
| } |
| + bool is_fixed_typed_array() const { |
| + return IsFixedTypedArrayElementsKind(elements_kind()); |
| + } |
| + |
| virtual Representation observed_input_representation(int index) V8_OVERRIDE { |
| if (index < 2) return RequiredInputRepresentation(index); |
| if (IsUninitialized()) { |
| @@ -6733,7 +6751,7 @@ class HStoreKeyed V8_FINAL |
| if (IsFastSmiElementsKind(elements_kind())) { |
| return Representation::Smi(); |
| } |
| - if (is_external()) { |
| + if (is_external() || is_fixed_typed_array()) { |
| return Representation::Integer32(); |
| } |
| // For fast object elements kinds, don't assume anything. |
| @@ -6818,13 +6836,18 @@ class HStoreKeyed V8_FINAL |
| SetGVNFlag(kChangesDoubleArrayElements); |
| } else if (IsFastSmiElementsKind(elements_kind)) { |
| SetGVNFlag(kChangesArrayElements); |
| + } else if (is_fixed_typed_array()) { |
| + SetGVNFlag(kChangesArrayElements); |
| + SetFlag(kAllowUndefinedAsNaN); |
| } else { |
| SetGVNFlag(kChangesArrayElements); |
| } |
| // EXTERNAL_{UNSIGNED_,}{BYTE,SHORT,INT}_ELEMENTS are truncating. |
| - if (elements_kind >= EXTERNAL_BYTE_ELEMENTS && |
| - elements_kind <= EXTERNAL_UNSIGNED_INT_ELEMENTS) { |
| + if ((elements_kind >= EXTERNAL_BYTE_ELEMENTS && |
| + elements_kind <= EXTERNAL_UNSIGNED_INT_ELEMENTS) || |
| + (elements_kind >= UINT8_ELEMENTS && |
| + elements_kind <= INT32_ELEMENTS)) { |
| SetFlag(kTruncatingToInt32); |
| } |
| } |