| 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);
 | 
|  }
 | 
|  
 | 
|  
 | 
| 
 |