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); |
} |
} |