| Index: src/hydrogen.cc
|
| diff --git a/src/hydrogen.cc b/src/hydrogen.cc
|
| index 374e54c97389e448721421ca80898aeb6d42df1d..f87e83969a5a471773201e8c99ec4b295a066157 100644
|
| --- a/src/hydrogen.cc
|
| +++ b/src/hydrogen.cc
|
| @@ -2715,17 +2715,18 @@ bool Uint32Analysis::IsSafeUint32Use(HValue* val, HValue* use) {
|
| } else if (use->IsChange() || use->IsSimulate()) {
|
| // Conversions and deoptimization have special support for unt32.
|
| return true;
|
| - } else if (use->IsStoreKeyedSpecializedArrayElement()) {
|
| - // Storing a value into an external integer array is a bit level operation.
|
| - HStoreKeyedSpecializedArrayElement* store =
|
| - HStoreKeyedSpecializedArrayElement::cast(use);
|
| -
|
| - if (store->value() == val) {
|
| - // Clamping or a conversion to double should have beed inserted.
|
| - ASSERT(store->elements_kind() != EXTERNAL_PIXEL_ELEMENTS);
|
| - ASSERT(store->elements_kind() != EXTERNAL_FLOAT_ELEMENTS);
|
| - ASSERT(store->elements_kind() != EXTERNAL_DOUBLE_ELEMENTS);
|
| - return true;
|
| + } else if (use->IsStoreKeyed()) {
|
| + HStoreKeyed* store = HStoreKeyed::cast(use);
|
| + if (store->is_external()) {
|
| + // Storing a value into an external integer array is a bit level
|
| + // operation.
|
| + if (store->value() == val) {
|
| + // Clamping or a conversion to double should have beed inserted.
|
| + ASSERT(store->elements_kind() != EXTERNAL_PIXEL_ELEMENTS);
|
| + ASSERT(store->elements_kind() != EXTERNAL_FLOAT_ELEMENTS);
|
| + ASSERT(store->elements_kind() != EXTERNAL_DOUBLE_ELEMENTS);
|
| + return true;
|
| + }
|
| }
|
| }
|
|
|
| @@ -3757,27 +3758,11 @@ void HGraph::DehoistSimpleArrayIndexComputations() {
|
| instr != NULL;
|
| instr = instr->next()) {
|
| ArrayInstructionInterface* array_instruction = NULL;
|
| - if (instr->IsLoadKeyedFastElement()) {
|
| - HLoadKeyedFastElement* op = HLoadKeyedFastElement::cast(instr);
|
| - array_instruction = static_cast<ArrayInstructionInterface*>(op);
|
| - } else if (instr->IsLoadKeyedFastDoubleElement()) {
|
| - HLoadKeyedFastDoubleElement* op =
|
| - HLoadKeyedFastDoubleElement::cast(instr);
|
| - array_instruction = static_cast<ArrayInstructionInterface*>(op);
|
| - } else if (instr->IsLoadKeyedSpecializedArrayElement()) {
|
| - HLoadKeyedSpecializedArrayElement* op =
|
| - HLoadKeyedSpecializedArrayElement::cast(instr);
|
| + if (instr->IsLoadKeyed()) {
|
| + HLoadKeyed* op = HLoadKeyed::cast(instr);
|
| array_instruction = static_cast<ArrayInstructionInterface*>(op);
|
| - } else if (instr->IsStoreKeyedFastElement()) {
|
| - HStoreKeyedFastElement* op = HStoreKeyedFastElement::cast(instr);
|
| - array_instruction = static_cast<ArrayInstructionInterface*>(op);
|
| - } else if (instr->IsStoreKeyedFastDoubleElement()) {
|
| - HStoreKeyedFastDoubleElement* op =
|
| - HStoreKeyedFastDoubleElement::cast(instr);
|
| - array_instruction = static_cast<ArrayInstructionInterface*>(op);
|
| - } else if (instr->IsStoreKeyedSpecializedArrayElement()) {
|
| - HStoreKeyedSpecializedArrayElement* op =
|
| - HStoreKeyedSpecializedArrayElement::cast(instr);
|
| + } else if (instr->IsStoreKeyed()) {
|
| + HStoreKeyed* op = HStoreKeyed::cast(instr);
|
| array_instruction = static_cast<ArrayInstructionInterface*>(op);
|
| } else {
|
| continue;
|
| @@ -4617,10 +4602,11 @@ void HGraphBuilder::VisitForInStatement(ForInStatement* stmt) {
|
| set_current_block(loop_body);
|
|
|
| HValue* key = AddInstruction(
|
| - new(zone()) HLoadKeyedFastElement(
|
| + new(zone()) HLoadKeyed(
|
| environment()->ExpressionStackAt(2), // Enum cache.
|
| environment()->ExpressionStackAt(0), // Iteration index.
|
| - environment()->ExpressionStackAt(0)));
|
| + environment()->ExpressionStackAt(0),
|
| + FAST_ELEMENTS));
|
|
|
| // Check if the expected map still matches that of the enumerable.
|
| // If not just deoptimize.
|
| @@ -5225,18 +5211,14 @@ void HGraphBuilder::VisitArrayLiteral(ArrayLiteral* expr) {
|
| // Fall through.
|
| case FAST_ELEMENTS:
|
| case FAST_HOLEY_ELEMENTS:
|
| - AddInstruction(new(zone()) HStoreKeyedFastElement(
|
| + case FAST_DOUBLE_ELEMENTS:
|
| + case FAST_HOLEY_DOUBLE_ELEMENTS:
|
| + AddInstruction(new(zone()) HStoreKeyed(
|
| elements,
|
| key,
|
| value,
|
| boilerplate_elements_kind));
|
| break;
|
| - case FAST_DOUBLE_ELEMENTS:
|
| - case FAST_HOLEY_DOUBLE_ELEMENTS:
|
| - AddInstruction(new(zone()) HStoreKeyedFastDoubleElement(elements,
|
| - key,
|
| - value));
|
| - break;
|
| default:
|
| UNREACHABLE();
|
| break;
|
| @@ -6085,13 +6067,15 @@ HInstruction* HGraphBuilder::BuildExternalArrayElementAccess(
|
| UNREACHABLE();
|
| break;
|
| }
|
| - return new(zone()) HStoreKeyedSpecializedArrayElement(
|
| - external_elements, checked_key, val, elements_kind);
|
| + return new(zone()) HStoreKeyed(external_elements,
|
| + checked_key,
|
| + val,
|
| + elements_kind);
|
| } else {
|
| ASSERT(val == NULL);
|
| - HLoadKeyedSpecializedArrayElement* load =
|
| - new(zone()) HLoadKeyedSpecializedArrayElement(
|
| - external_elements, checked_key, dependency, elements_kind);
|
| + 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);
|
| @@ -6110,10 +6094,6 @@ HInstruction* HGraphBuilder::BuildFastElementAccess(HValue* elements,
|
| if (is_store) {
|
| ASSERT(val != NULL);
|
| switch (elements_kind) {
|
| - case FAST_DOUBLE_ELEMENTS:
|
| - case FAST_HOLEY_DOUBLE_ELEMENTS:
|
| - return new(zone()) HStoreKeyedFastDoubleElement(
|
| - elements, checked_key, val);
|
| case FAST_SMI_ELEMENTS:
|
| case FAST_HOLEY_SMI_ELEMENTS:
|
| // Smi-only arrays need a smi check.
|
| @@ -6121,7 +6101,9 @@ HInstruction* HGraphBuilder::BuildFastElementAccess(HValue* elements,
|
| // Fall through.
|
| case FAST_ELEMENTS:
|
| case FAST_HOLEY_ELEMENTS:
|
| - return new(zone()) HStoreKeyedFastElement(
|
| + case FAST_DOUBLE_ELEMENTS:
|
| + case FAST_HOLEY_DOUBLE_ELEMENTS:
|
| + return new(zone()) HStoreKeyed(
|
| elements, checked_key, val, elements_kind);
|
| default:
|
| UNREACHABLE();
|
| @@ -6129,16 +6111,10 @@ HInstruction* HGraphBuilder::BuildFastElementAccess(HValue* elements,
|
| }
|
| }
|
| // It's an element load (!is_store).
|
| - HoleCheckMode mode = IsFastPackedElementsKind(elements_kind) ?
|
| - OMIT_HOLE_CHECK :
|
| - PERFORM_HOLE_CHECK;
|
| - if (IsFastDoubleElementsKind(elements_kind)) {
|
| - return new(zone()) HLoadKeyedFastDoubleElement(elements, checked_key,
|
| - load_dependency, mode);
|
| - } else { // Smi or Object elements.
|
| - return new(zone()) HLoadKeyedFastElement(elements, checked_key,
|
| - load_dependency, elements_kind);
|
| - }
|
| + return new(zone()) HLoadKeyed(elements,
|
| + checked_key,
|
| + load_dependency,
|
| + elements_kind);
|
| }
|
|
|
|
|
|
|