Index: src/hydrogen.cc |
diff --git a/src/hydrogen.cc b/src/hydrogen.cc |
index cccfa5b041ee7ee3cf12f747f69dea295f0fcd32..d796235c68f9a837b6e88738c53749f3417deb8f 100644 |
--- a/src/hydrogen.cc |
+++ b/src/hydrogen.cc |
@@ -2036,7 +2036,9 @@ HInstruction* HGraphBuilder::BuildUncheckedMonomorphicElementAccess( |
bool is_store, |
LoadKeyedHoleMode load_mode, |
KeyedAccessStoreMode store_mode) { |
- ASSERT(!IsExternalArrayElementsKind(elements_kind) || !is_js_array); |
+ ASSERT((!IsExternalArrayElementsKind(elements_kind) |
+ && !IsFixedTypedArrayElementsKind(elements_kind)) |
Toon Verwaest
2013/12/23 10:40:32
&& on previous line. Align new line 1 space furthe
Dmitry Lomov (no reviews)
2014/01/07 15:48:43
Done.
|
+ || !is_js_array); |
// No GVNFlag is necessary for ElementsKind if there is an explicit dependency |
// on a HElementsTransition instruction. The flag can also be removed if the |
// map to check has FAST_HOLEY_ELEMENTS, since there can be no further |
@@ -2066,11 +2068,17 @@ HInstruction* HGraphBuilder::BuildUncheckedMonomorphicElementAccess( |
} |
length->set_type(HType::Smi()); |
HValue* checked_key = NULL; |
- if (IsExternalArrayElementsKind(elements_kind)) { |
+ if (IsExternalArrayElementsKind(elements_kind) || |
+ IsFixedTypedArrayElementsKind(elements_kind)) { |
+ HValue* backing_store; |
+ if (IsExternalArrayElementsKind(elements_kind)) { |
+ backing_store = |
+ Add<HLoadExternalArrayPointer>(elements); |
+ } else { |
+ backing_store = elements; |
+ } |
if (store_mode == STORE_NO_TRANSITION_IGNORE_OUT_OF_BOUNDS) { |
NoObservableSideEffectsScope no_effects(this); |
- HLoadExternalArrayPointer* external_elements = |
- Add<HLoadExternalArrayPointer>(elements); |
IfBuilder length_checker(this); |
length_checker.If<HCompareNumericAndBranch>(key, length, Token::LT); |
length_checker.Then(); |
@@ -2079,7 +2087,7 @@ HInstruction* HGraphBuilder::BuildUncheckedMonomorphicElementAccess( |
key, graph()->GetConstant0(), Token::GTE); |
negative_checker.Then(); |
HInstruction* result = AddElementAccess( |
- external_elements, key, val, bounds_check, elements_kind, is_store); |
+ backing_store, key, val, bounds_check, elements_kind, is_store); |
negative_checker.ElseDeopt("Negative key encountered"); |
negative_checker.End(); |
length_checker.End(); |
@@ -2087,10 +2095,8 @@ HInstruction* HGraphBuilder::BuildUncheckedMonomorphicElementAccess( |
} else { |
ASSERT(store_mode == STANDARD_STORE); |
checked_key = Add<HBoundsCheck>(key, length); |
- HLoadExternalArrayPointer* external_elements = |
- Add<HLoadExternalArrayPointer>(elements); |
return AddElementAccess( |
- external_elements, checked_key, val, |
+ backing_store, checked_key, val, |
checked_object, elements_kind, is_store); |
} |
} |
@@ -2271,7 +2277,8 @@ HInstruction* HGraphBuilder::AddElementAccess( |
LoadKeyedHoleMode load_mode) { |
if (is_store) { |
ASSERT(val != NULL); |
- if (elements_kind == EXTERNAL_PIXEL_ELEMENTS) { |
+ if (elements_kind == EXTERNAL_PIXEL_ELEMENTS || |
+ elements_kind == UINT8_CLAMPED_ELEMENTS) { |
val = Add<HClampToUint8>(val); |
} |
return Add<HStoreKeyed>(elements, checked_key, val, elements_kind, |
@@ -2285,7 +2292,8 @@ HInstruction* HGraphBuilder::AddElementAccess( |
HLoadKeyed* load = Add<HLoadKeyed>( |
elements, checked_key, dependency, elements_kind, load_mode); |
if (FLAG_opt_safe_uint32_operations && |
- elements_kind == EXTERNAL_UNSIGNED_INT_ELEMENTS) { |
+ (elements_kind == EXTERNAL_UNSIGNED_INT_ELEMENTS || |
+ elements_kind == UINT32_ELEMENTS)) { |
graph()->RecordUint32Instruction(load); |
} |
return load; |