Index: src/hydrogen.cc |
diff --git a/src/hydrogen.cc b/src/hydrogen.cc |
index 2cae33263b2a0e7c7116963804b0c39a74f411de..57220e0de1e5cf77641235343b45aba12249cb8a 100644 |
--- a/src/hydrogen.cc |
+++ b/src/hydrogen.cc |
@@ -1051,59 +1051,6 @@ HValue* HGraphBuilder::BuildCheckMap(HValue* obj, |
} |
-HInstruction* HGraphBuilder::BuildExternalArrayElementAccess( |
- HValue* external_elements, |
- HValue* checked_key, |
- HValue* val, |
- HValue* dependency, |
- ElementsKind elements_kind, |
- bool is_store) { |
- Zone* zone = this->zone(); |
- if (is_store) { |
- ASSERT(val != NULL); |
- switch (elements_kind) { |
- case EXTERNAL_PIXEL_ELEMENTS: { |
- val = Add<HClampToUint8>(val); |
- break; |
- } |
- case EXTERNAL_BYTE_ELEMENTS: |
- case EXTERNAL_UNSIGNED_BYTE_ELEMENTS: |
- case EXTERNAL_SHORT_ELEMENTS: |
- case EXTERNAL_UNSIGNED_SHORT_ELEMENTS: |
- case EXTERNAL_INT_ELEMENTS: |
- case EXTERNAL_UNSIGNED_INT_ELEMENTS: { |
- break; |
- } |
- case EXTERNAL_FLOAT_ELEMENTS: |
- case EXTERNAL_DOUBLE_ELEMENTS: |
- 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; |
- } |
- return new(zone) HStoreKeyed(external_elements, checked_key, |
- val, elements_kind); |
- } else { |
- ASSERT(val == NULL); |
- HLoadKeyed* load = |
- new(zone) HLoadKeyed( |
- external_elements, checked_key, dependency, elements_kind); |
- if (FLAG_opt_safe_uint32_operations && |
- elements_kind == EXTERNAL_UNSIGNED_INT_ELEMENTS) { |
- graph()->RecordUint32Instruction(load); |
- } |
- return load; |
- } |
-} |
- |
- |
HValue* HGraphBuilder::BuildCheckForCapacityGrow(HValue* object, |
HValue* elements, |
ElementsKind kind, |
@@ -1286,10 +1233,8 @@ HInstruction* HGraphBuilder::BuildUncheckedMonomorphicElementAccess( |
HValue* bounds_check = negative_checker.If<HCompareNumericAndBranch>( |
key, graph()->GetConstant0(), Token::GTE); |
negative_checker.Then(); |
- HInstruction* result = BuildExternalArrayElementAccess( |
- external_elements, key, val, bounds_check, |
- elements_kind, is_store); |
- AddInstruction(result); |
+ HInstruction* result = AddExternalArrayElementAccess( |
+ external_elements, key, val, bounds_check, elements_kind, is_store); |
negative_checker.ElseDeopt(); |
length_checker.End(); |
return result; |
@@ -1298,9 +1243,9 @@ HInstruction* HGraphBuilder::BuildUncheckedMonomorphicElementAccess( |
checked_key = Add<HBoundsCheck>(key, length); |
HLoadExternalArrayPointer* external_elements = |
Add<HLoadExternalArrayPointer>(elements); |
- return AddInstruction(BuildExternalArrayElementAccess( |
- external_elements, checked_key, val, mapcheck, |
- elements_kind, is_store)); |
+ return AddExternalArrayElementAccess( |
+ external_elements, checked_key, val, |
+ mapcheck, elements_kind, is_store); |
} |
} |
ASSERT(fast_smi_only_elements || |
@@ -1435,6 +1380,56 @@ HInnerAllocatedObject* HGraphBuilder::BuildJSArrayHeader(HValue* array, |
} |
+HInstruction* HGraphBuilder::AddExternalArrayElementAccess( |
+ HValue* external_elements, |
+ HValue* checked_key, |
+ HValue* val, |
+ HValue* dependency, |
+ ElementsKind elements_kind, |
+ bool is_store) { |
+ if (is_store) { |
+ ASSERT(val != NULL); |
+ switch (elements_kind) { |
+ case EXTERNAL_PIXEL_ELEMENTS: { |
+ val = Add<HClampToUint8>(val); |
+ break; |
+ } |
+ case EXTERNAL_BYTE_ELEMENTS: |
+ case EXTERNAL_UNSIGNED_BYTE_ELEMENTS: |
+ case EXTERNAL_SHORT_ELEMENTS: |
+ case EXTERNAL_UNSIGNED_SHORT_ELEMENTS: |
+ case EXTERNAL_INT_ELEMENTS: |
+ case EXTERNAL_UNSIGNED_INT_ELEMENTS: { |
+ break; |
+ } |
+ case EXTERNAL_FLOAT_ELEMENTS: |
+ case EXTERNAL_DOUBLE_ELEMENTS: |
+ 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; |
+ } |
+ return Add<HStoreKeyed>(external_elements, checked_key, val, elements_kind); |
+ } else { |
+ ASSERT(val == NULL); |
+ HLoadKeyed* load = Add<HLoadKeyed>(external_elements, checked_key, |
+ dependency, elements_kind); |
+ if (FLAG_opt_safe_uint32_operations && |
+ elements_kind == EXTERNAL_UNSIGNED_INT_ELEMENTS) { |
+ graph()->RecordUint32Instruction(load); |
+ } |
+ return load; |
+ } |
+} |
+ |
+ |
HInstruction* HGraphBuilder::AddFastElementAccess( |
HValue* elements, |
HValue* checked_key, |
@@ -5721,9 +5716,9 @@ HValue* HOptimizedGraphBuilder::HandlePolymorphicElementAccess( |
checked_key = Add<HBoundsCheck>(key, length); |
HLoadExternalArrayPointer* external_elements = |
Add<HLoadExternalArrayPointer>(elements); |
- access = AddInstruction(BuildExternalArrayElementAccess( |
+ access = AddExternalArrayElementAccess( |
external_elements, checked_key, val, |
- mapcompare, elements_kind, is_store)); |
+ mapcompare, elements_kind, is_store); |
} |
*has_side_effects |= access->HasObservableSideEffects(); |
// The caller will use has_side_effects and add a correct Simulate. |