Index: src/hydrogen-instructions.h |
diff --git a/src/hydrogen-instructions.h b/src/hydrogen-instructions.h |
index 8cf65d5c8e3f3ed2512c7757d8f80fb03f6d9d23..3d3c56cc4063d4ad4859b060a9509c92be84da58 100644 |
--- a/src/hydrogen-instructions.h |
+++ b/src/hydrogen-instructions.h |
@@ -6248,6 +6248,11 @@ |
JSArrayBuffer::kBitFieldSlot, Representation::Smi()); |
} |
+ static HObjectAccess ForExternalArrayExternalPointer() { |
+ return HObjectAccess::ForObservableJSObjectOffset( |
+ ExternalArray::kExternalPointerOffset, Representation::External()); |
+ } |
+ |
static HObjectAccess ForJSArrayBufferViewBuffer() { |
return HObjectAccess::ForObservableJSObjectOffset( |
JSArrayBufferView::kBufferOffset); |
@@ -6617,8 +6622,14 @@ |
DECLARE_INSTRUCTION_FACTORY_P6(HLoadKeyed, HValue*, HValue*, HValue*, |
ElementsKind, LoadKeyedHoleMode, int); |
+ bool is_external() const { |
+ return IsExternalArrayElementsKind(elements_kind()); |
+ } |
bool is_fixed_typed_array() const { |
return IsFixedTypedArrayElementsKind(elements_kind()); |
+ } |
+ bool is_typed_elements() const { |
+ return is_external() || is_fixed_typed_array(); |
} |
HValue* elements() const { return OperandAt(0); } |
HValue* key() const { return OperandAt(1); } |
@@ -6650,8 +6661,8 @@ |
// kind_fixed_typed_array: external[int32] (none) |
// kind_external: external[int32] (none) |
if (index == 0) { |
- return is_fixed_typed_array() ? Representation::External() |
- : Representation::Tagged(); |
+ return is_typed_elements() ? Representation::External() |
+ : Representation::Tagged(); |
} |
if (index == 1) { |
return ArrayInstructionInterface::KeyedAccessIndexRequirement( |
@@ -6700,7 +6711,7 @@ |
SetOperandAt(1, key); |
SetOperandAt(2, dependency != NULL ? dependency : obj); |
- if (!is_fixed_typed_array()) { |
+ if (!is_typed_elements()) { |
// I can detect the case between storing double (holey and fast) and |
// smi/object by looking at elements_kind_. |
DCHECK(IsFastSmiOrObjectElementsKind(elements_kind) || |
@@ -6726,15 +6737,18 @@ |
SetDependsOnFlag(kDoubleArrayElements); |
} |
} else { |
- if (elements_kind == FLOAT32_ELEMENTS || |
+ if (elements_kind == EXTERNAL_FLOAT32_ELEMENTS || |
+ elements_kind == EXTERNAL_FLOAT64_ELEMENTS || |
+ elements_kind == FLOAT32_ELEMENTS || |
elements_kind == FLOAT64_ELEMENTS) { |
set_representation(Representation::Double()); |
} else { |
set_representation(Representation::Integer32()); |
} |
- if (is_fixed_typed_array()) { |
+ if (is_external()) { |
SetDependsOnFlag(kExternalMemory); |
+ } else if (is_fixed_typed_array()) { |
SetDependsOnFlag(kTypedArrayElements); |
} else { |
UNREACHABLE(); |
@@ -7109,8 +7123,8 @@ |
// kind_fixed_typed_array: tagged[int32] = (double | int32) |
// kind_external: external[int32] = (double | int32) |
if (index == 0) { |
- return is_fixed_typed_array() ? Representation::External() |
- : Representation::Tagged(); |
+ return is_typed_elements() ? Representation::External() |
+ : Representation::Tagged(); |
} else if (index == 1) { |
return ArrayInstructionInterface::KeyedAccessIndexRequirement( |
OperandAt(1)->representation()); |
@@ -7135,14 +7149,22 @@ |
return Representation::Smi(); |
} |
- if (IsFixedTypedArrayElementsKind(kind)) { |
- return Representation::Integer32(); |
- } |
- return Representation::Tagged(); |
+ return IsExternalArrayElementsKind(kind) || |
+ IsFixedTypedArrayElementsKind(kind) |
+ ? Representation::Integer32() |
+ : Representation::Tagged(); |
+ } |
+ |
+ bool is_external() const { |
+ return IsExternalArrayElementsKind(elements_kind()); |
} |
bool is_fixed_typed_array() const { |
return IsFixedTypedArrayElementsKind(elements_kind()); |
+ } |
+ |
+ bool is_typed_elements() const { |
+ return is_external() || is_fixed_typed_array(); |
} |
Representation observed_input_representation(int index) override { |
@@ -7234,20 +7256,25 @@ |
SetFlag(kTrackSideEffectDominators); |
SetDependsOnFlag(kNewSpacePromotion); |
} |
- if (IsFastDoubleElementsKind(elements_kind)) { |
+ if (is_external()) { |
+ SetChangesFlag(kExternalMemory); |
+ SetFlag(kAllowUndefinedAsNaN); |
+ } else if (IsFastDoubleElementsKind(elements_kind)) { |
SetChangesFlag(kDoubleArrayElements); |
} else if (IsFastSmiElementsKind(elements_kind)) { |
SetChangesFlag(kArrayElements); |
} else if (is_fixed_typed_array()) { |
SetChangesFlag(kTypedArrayElements); |
- SetChangesFlag(kExternalMemory); |
SetFlag(kAllowUndefinedAsNaN); |
} else { |
SetChangesFlag(kArrayElements); |
} |
- // {UNSIGNED_,}{BYTE,SHORT,INT}_ELEMENTS are truncating. |
- if (elements_kind >= UINT8_ELEMENTS && elements_kind <= INT32_ELEMENTS) { |
+ // EXTERNAL_{UNSIGNED_,}{BYTE,SHORT,INT}_ELEMENTS are truncating. |
+ if ((elements_kind >= EXTERNAL_INT8_ELEMENTS && |
+ elements_kind <= EXTERNAL_UINT32_ELEMENTS) || |
+ (elements_kind >= UINT8_ELEMENTS && |
+ elements_kind <= INT32_ELEMENTS)) { |
SetFlag(kTruncatingToInt32); |
} |
} |