Index: src/hydrogen-instructions.h |
diff --git a/src/hydrogen-instructions.h b/src/hydrogen-instructions.h |
index db3e3b254dda3c0f607a08ee425ca000f460da37..7ebfda950e511b32d469b8ef932d126bd9ec0455 100644 |
--- a/src/hydrogen-instructions.h |
+++ b/src/hydrogen-instructions.h |
@@ -210,7 +210,8 @@ class LChunkBuilder; |
V(InobjectFields) \ |
V(OsrEntries) \ |
V(ExternalMemory) \ |
- V(StringChars) |
+ V(StringChars) \ |
+ V(TypedArrayElements) |
#define DECLARE_ABSTRACT_INSTRUCTION(type) \ |
@@ -6375,6 +6376,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() { |
@@ -6403,9 +6407,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(); |
@@ -6455,7 +6460,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) || |
@@ -6482,13 +6487,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(kDependsOnTypedArrayElements); |
+ } else { |
+ UNREACHABLE(); |
+ } |
// Native code could change the specialized array. |
SetGVNFlag(kDependsOnCalls); |
} |
@@ -6747,10 +6760,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(); |
@@ -6770,14 +6784,19 @@ class HStoreKeyed V8_FINAL |
return Representation::Smi(); |
} |
- return is_external() ? Representation::Integer32() |
- : Representation::Tagged(); |
+ return is_external() || is_fixed_typed_array() |
+ ? Representation::Integer32() |
+ : Representation::Tagged(); |
} |
bool is_external() const { |
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()) { |
@@ -6792,7 +6811,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. |
@@ -6877,13 +6896,18 @@ class HStoreKeyed V8_FINAL |
SetGVNFlag(kChangesDoubleArrayElements); |
} else if (IsFastSmiElementsKind(elements_kind)) { |
SetGVNFlag(kChangesArrayElements); |
+ } else if (is_fixed_typed_array()) { |
+ SetGVNFlag(kChangesTypedArrayElements); |
+ 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); |
} |
} |