| Index: src/objects.cc
 | 
| diff --git a/src/objects.cc b/src/objects.cc
 | 
| index 6e25e624a9110d2ebe307eb653942c49bc98fe12..0da20dd43de8517e0cd995b410870f3ba6ae33ef 100644
 | 
| --- a/src/objects.cc
 | 
| +++ b/src/objects.cc
 | 
| @@ -77,6 +77,10 @@ MUST_USE_RESULT static MaybeObject* CreateJSValue(JSFunction* constructor,
 | 
|  MaybeObject* Object::ToObject(Context* native_context) {
 | 
|    if (IsNumber()) {
 | 
|      return CreateJSValue(native_context->number_function(), this);
 | 
| +  } else if (IsFloat32x4()) {
 | 
| +    return CreateJSValue(native_context->float32x4_function(), this);
 | 
| +  } else if (IsInt32x4()) {
 | 
| +    return CreateJSValue(native_context->int32x4_function(), this);
 | 
|    } else if (IsBoolean()) {
 | 
|      return CreateJSValue(native_context->boolean_function(), this);
 | 
|    } else if (IsString()) {
 | 
| @@ -93,6 +97,14 @@ MaybeObject* Object::ToObject(Isolate* isolate) {
 | 
|    } else if (IsNumber()) {
 | 
|      Context* native_context = isolate->context()->native_context();
 | 
|      return CreateJSValue(native_context->number_function(), this);
 | 
| +  } else if (IsFloat32x4()) {
 | 
| +    Isolate* isolate = HeapObject::cast(this)->GetIsolate();
 | 
| +    Context* native_context = isolate->context()->native_context();
 | 
| +    return CreateJSValue(native_context->float32x4_function(), this);
 | 
| +  } else if (IsInt32x4()) {
 | 
| +    Isolate* isolate = HeapObject::cast(this)->GetIsolate();
 | 
| +    Context* native_context = isolate->context()->native_context();
 | 
| +    return CreateJSValue(native_context->int32x4_function(), this);
 | 
|    } else if (IsBoolean()) {
 | 
|      Context* native_context = isolate->context()->native_context();
 | 
|      return CreateJSValue(native_context->boolean_function(), this);
 | 
| @@ -128,6 +140,10 @@ void Object::Lookup(Name* name, LookupResult* result) {
 | 
|      Context* native_context = result->isolate()->context()->native_context();
 | 
|      if (IsNumber()) {
 | 
|        holder = native_context->number_function()->instance_prototype();
 | 
| +    } else if (IsFloat32x4()) {
 | 
| +      holder = native_context->float32x4_function()->instance_prototype();
 | 
| +    } else if (IsInt32x4()) {
 | 
| +      holder = native_context->int32x4_function()->instance_prototype();
 | 
|      } else if (IsString()) {
 | 
|        holder = native_context->string_function()->instance_prototype();
 | 
|      } else if (IsSymbol()) {
 | 
| @@ -977,6 +993,10 @@ MaybeObject* Object::GetElementWithReceiver(Isolate* isolate,
 | 
|        Context* native_context = isolate->context()->native_context();
 | 
|        if (holder->IsNumber()) {
 | 
|          holder = native_context->number_function()->instance_prototype();
 | 
| +      } else if (holder->IsFloat32x4()) {
 | 
| +        holder = native_context->float32x4_function()->instance_prototype();
 | 
| +      } else if (holder->IsInt32x4()) {
 | 
| +        holder = native_context->int32x4_function()->instance_prototype();
 | 
|        } else if (holder->IsString()) {
 | 
|          holder = native_context->string_function()->instance_prototype();
 | 
|        } else if (holder->IsSymbol()) {
 | 
| @@ -1040,6 +1060,12 @@ Object* Object::GetPrototype(Isolate* isolate) {
 | 
|    if (heap_object->IsHeapNumber()) {
 | 
|      return context->number_function()->instance_prototype();
 | 
|    }
 | 
| +  if (heap_object->IsFloat32x4()) {
 | 
| +    return context->float32x4_function()->instance_prototype();
 | 
| +  }
 | 
| +  if (heap_object->IsInt32x4()) {
 | 
| +    return context->int32x4_function()->instance_prototype();
 | 
| +  }
 | 
|    if (heap_object->IsString()) {
 | 
|      return context->string_function()->instance_prototype();
 | 
|    }
 | 
| @@ -1663,6 +1689,14 @@ void HeapObject::HeapObjectShortPrint(StringStream* accumulator) {
 | 
|        accumulator->Add("<ExternalFloatArray[%u]>",
 | 
|                         ExternalFloatArray::cast(this)->length());
 | 
|        break;
 | 
| +    case EXTERNAL_FLOAT32x4_ARRAY_TYPE:
 | 
| +      accumulator->Add("<ExternalFloat32x4Array[%u]>",
 | 
| +                       ExternalFloat32x4Array::cast(this)->length());
 | 
| +      break;
 | 
| +    case EXTERNAL_INT32x4_ARRAY_TYPE:
 | 
| +      accumulator->Add("<ExternalInt32x4Array[%u]>",
 | 
| +                       ExternalInt32x4Array::cast(this)->length());
 | 
| +      break;
 | 
|      case EXTERNAL_DOUBLE_ARRAY_TYPE:
 | 
|        accumulator->Add("<ExternalDoubleArray[%u]>",
 | 
|                         ExternalDoubleArray::cast(this)->length());
 | 
| @@ -1722,6 +1756,16 @@ void HeapObject::HeapObjectShortPrint(StringStream* accumulator) {
 | 
|        HeapNumber::cast(this)->HeapNumberPrint(accumulator);
 | 
|        accumulator->Put('>');
 | 
|        break;
 | 
| +    case FLOAT32x4_TYPE:
 | 
| +      accumulator->Add("<Float32x4: ");
 | 
| +      Float32x4::cast(this)->Float32x4Print(accumulator);
 | 
| +      accumulator->Put('>');
 | 
| +      break;
 | 
| +    case INT32x4_TYPE:
 | 
| +      accumulator->Add("<Int32x4: ");
 | 
| +      Int32x4::cast(this)->Int32x4Print(accumulator);
 | 
| +      accumulator->Put('>');
 | 
| +      break;
 | 
|      case JS_PROXY_TYPE:
 | 
|        accumulator->Add("<JSProxy>");
 | 
|        break;
 | 
| @@ -1844,6 +1888,8 @@ void HeapObject::IterateBody(InstanceType type, int object_size,
 | 
|        Symbol::BodyDescriptor::IterateBody(this, v);
 | 
|        break;
 | 
|      case HEAP_NUMBER_TYPE:
 | 
| +    case FLOAT32x4_TYPE:
 | 
| +    case INT32x4_TYPE:
 | 
|      case FILLER_TYPE:
 | 
|      case BYTE_ARRAY_TYPE:
 | 
|      case FREE_SPACE_TYPE:
 | 
| @@ -1855,6 +1901,8 @@ void HeapObject::IterateBody(InstanceType type, int object_size,
 | 
|      case EXTERNAL_INT_ARRAY_TYPE:
 | 
|      case EXTERNAL_UNSIGNED_INT_ARRAY_TYPE:
 | 
|      case EXTERNAL_FLOAT_ARRAY_TYPE:
 | 
| +    case EXTERNAL_FLOAT32x4_ARRAY_TYPE:
 | 
| +    case EXTERNAL_INT32x4_ARRAY_TYPE:
 | 
|      case EXTERNAL_DOUBLE_ARRAY_TYPE:
 | 
|        break;
 | 
|      case SHARED_FUNCTION_INFO_TYPE: {
 | 
| @@ -1917,6 +1965,42 @@ void HeapNumber::HeapNumberPrint(StringStream* accumulator) {
 | 
|  }
 | 
|  
 | 
|  
 | 
| +void Float32x4::Float32x4Print(FILE* out) {
 | 
| +  PrintF(out, "%.16g %.16g %.16g %.16g", x(), y(), z(), w());
 | 
| +}
 | 
| +
 | 
| +
 | 
| +void Float32x4::Float32x4Print(StringStream* accumulator) {
 | 
| +  // The Windows version of vsnprintf can allocate when printing a %g string
 | 
| +  // into a buffer that may not be big enough.  We don't want random memory
 | 
| +  // allocation when producing post-crash stack traces, so we print into a
 | 
| +  // buffer that is plenty big enough for any floating point number, then
 | 
| +  // print that using vsnprintf (which may truncate but never allocate if
 | 
| +  // there is no more space in the buffer).
 | 
| +  EmbeddedVector<char, 100> buffer;
 | 
| +  OS::SNPrintF(buffer, "%.16g %.16g %.16g %.16g", x(), y(), z(), w());
 | 
| +  accumulator->Add("%s", buffer.start());
 | 
| +}
 | 
| +
 | 
| +
 | 
| +void Int32x4::Int32x4Print(FILE* out) {
 | 
| +  PrintF(out, "%u %u %u %u", x(), y(), z(), w());
 | 
| +}
 | 
| +
 | 
| +
 | 
| +void Int32x4::Int32x4Print(StringStream* accumulator) {
 | 
| +  // The Windows version of vsnprintf can allocate when printing a %g string
 | 
| +  // into a buffer that may not be big enough.  We don't want random memory
 | 
| +  // allocation when producing post-crash stack traces, so we print into a
 | 
| +  // buffer that is plenty big enough for any floating point number, then
 | 
| +  // print that using vsnprintf (which may truncate but never allocate if
 | 
| +  // there is no more space in the buffer).
 | 
| +  EmbeddedVector<char, 100> buffer;
 | 
| +  OS::SNPrintF(buffer, "%u %u %u %u", x(), y(), z(), w());
 | 
| +  accumulator->Add("%s", buffer.start());
 | 
| +}
 | 
| +
 | 
| +
 | 
|  String* JSReceiver::class_name() {
 | 
|    if (IsJSFunction() && IsJSFunctionProxy()) {
 | 
|      return GetHeap()->function_class_string();
 | 
| @@ -2283,6 +2367,8 @@ const char* Representation::Mnemonic() const {
 | 
|      case kTagged: return "t";
 | 
|      case kSmi: return "s";
 | 
|      case kDouble: return "d";
 | 
| +    case kFloat32x4: return "float32x4";
 | 
| +    case kInt32x4: return "int32x44";
 | 
|      case kInteger32: return "i";
 | 
|      case kHeapObject: return "h";
 | 
|      case kExternal: return "x";
 | 
| @@ -5366,6 +5452,8 @@ bool JSObject::ReferencesObject(Object* obj) {
 | 
|      case EXTERNAL_INT_ELEMENTS:
 | 
|      case EXTERNAL_UNSIGNED_INT_ELEMENTS:
 | 
|      case EXTERNAL_FLOAT_ELEMENTS:
 | 
| +    case EXTERNAL_FLOAT32x4_ELEMENTS:
 | 
| +    case EXTERNAL_INT32x4_ELEMENTS:
 | 
|      case EXTERNAL_DOUBLE_ELEMENTS:
 | 
|      case FAST_DOUBLE_ELEMENTS:
 | 
|      case FAST_HOLEY_DOUBLE_ELEMENTS:
 | 
| @@ -5861,6 +5949,8 @@ Handle<JSObject> JSObjectWalkVisitor<ContextObject>::StructureWalk(
 | 
|        case EXTERNAL_INT_ELEMENTS:
 | 
|        case EXTERNAL_UNSIGNED_INT_ELEMENTS:
 | 
|        case EXTERNAL_FLOAT_ELEMENTS:
 | 
| +      case EXTERNAL_FLOAT32x4_ELEMENTS:
 | 
| +      case EXTERNAL_INT32x4_ELEMENTS:
 | 
|        case EXTERNAL_DOUBLE_ELEMENTS:
 | 
|        case FAST_DOUBLE_ELEMENTS:
 | 
|        case FAST_HOLEY_DOUBLE_ELEMENTS:
 | 
| @@ -6082,6 +6172,8 @@ void JSObject::DefineElementAccessor(Handle<JSObject> object,
 | 
|      case EXTERNAL_INT_ELEMENTS:
 | 
|      case EXTERNAL_UNSIGNED_INT_ELEMENTS:
 | 
|      case EXTERNAL_FLOAT_ELEMENTS:
 | 
| +    case EXTERNAL_FLOAT32x4_ELEMENTS:
 | 
| +    case EXTERNAL_INT32x4_ELEMENTS:
 | 
|      case EXTERNAL_DOUBLE_ELEMENTS:
 | 
|        // Ignore getters and setters on pixel and external array elements.
 | 
|        return;
 | 
| @@ -6540,6 +6632,8 @@ Handle<Object> JSObject::SetAccessor(Handle<JSObject> object,
 | 
|        case EXTERNAL_INT_ELEMENTS:
 | 
|        case EXTERNAL_UNSIGNED_INT_ELEMENTS:
 | 
|        case EXTERNAL_FLOAT_ELEMENTS:
 | 
| +      case EXTERNAL_FLOAT32x4_ELEMENTS:
 | 
| +      case EXTERNAL_INT32x4_ELEMENTS:
 | 
|        case EXTERNAL_DOUBLE_ELEMENTS:
 | 
|          // Ignore getters and setters on pixel and external array
 | 
|          // elements.
 | 
| @@ -10995,6 +11089,20 @@ void DeoptimizationInputData::DeoptimizationInputDataPrint(FILE* out) {
 | 
|            break;
 | 
|          }
 | 
|  
 | 
| +        case Translation::FLOAT32x4_REGISTER: {
 | 
| +          int reg_code = iterator.Next();
 | 
| +          PrintF(out, "{input=%s}",
 | 
| +                 Float32x4Register::AllocationIndexToString(reg_code));
 | 
| +          break;
 | 
| +        }
 | 
| +
 | 
| +        case Translation::INT32x4_REGISTER: {
 | 
| +          int reg_code = iterator.Next();
 | 
| +          PrintF(out, "{input=%s}",
 | 
| +                 Int32x4Register::AllocationIndexToString(reg_code));
 | 
| +          break;
 | 
| +        }
 | 
| +
 | 
|          case Translation::STACK_SLOT: {
 | 
|            int input_slot_index = iterator.Next();
 | 
|            PrintF(out, "{input=%d}", input_slot_index);
 | 
| @@ -11019,6 +11127,18 @@ void DeoptimizationInputData::DeoptimizationInputDataPrint(FILE* out) {
 | 
|            break;
 | 
|          }
 | 
|  
 | 
| +        case Translation::FLOAT32x4_STACK_SLOT: {
 | 
| +          int input_slot_index = iterator.Next();
 | 
| +          PrintF(out, "{input=%d}", input_slot_index);
 | 
| +          break;
 | 
| +        }
 | 
| +
 | 
| +        case Translation::INT32x4_STACK_SLOT: {
 | 
| +          int input_slot_index = iterator.Next();
 | 
| +          PrintF(out, "{input=%d}", input_slot_index);
 | 
| +          break;
 | 
| +        }
 | 
| +
 | 
|          case Translation::LITERAL: {
 | 
|            unsigned literal_index = iterator.Next();
 | 
|            PrintF(out, "{literal_id=%u}", literal_index);
 | 
| @@ -12541,7 +12661,10 @@ Handle<Object> JSObject::SetElement(Handle<JSObject> object,
 | 
|    Isolate* isolate = object->GetIsolate();
 | 
|  
 | 
|    if (object->HasExternalArrayElements()) {
 | 
| -    if (!value->IsNumber() && !value->IsUndefined()) {
 | 
| +    // TODO(ningxin): Throw an error if setting a Float32x4Array element
 | 
| +    // while the value is not Float32x4Object.
 | 
| +    if (!value->IsNumber() && !value->IsFloat32x4() &&
 | 
| +        !value->IsInt32x4() && !value->IsUndefined()) {
 | 
|        bool has_exception;
 | 
|        Handle<Object> number =
 | 
|            Execution::ToNumber(isolate, value, &has_exception);
 | 
| @@ -12734,6 +12857,16 @@ Handle<Object> JSObject::SetElementWithoutInterceptor(
 | 
|            ExternalFloatArray::cast(object->elements()));
 | 
|        return ExternalFloatArray::SetValue(array, index, value);
 | 
|      }
 | 
| +    case EXTERNAL_FLOAT32x4_ELEMENTS: {
 | 
| +      Handle<ExternalFloat32x4Array> array(
 | 
| +          ExternalFloat32x4Array::cast(object->elements()));
 | 
| +      return ExternalFloat32x4Array::SetValue(array, index, value);
 | 
| +    }
 | 
| +    case EXTERNAL_INT32x4_ELEMENTS: {
 | 
| +      Handle<ExternalInt32x4Array> array(
 | 
| +          ExternalInt32x4Array::cast(object->elements()));
 | 
| +      return ExternalInt32x4Array::SetValue(array, index, value);
 | 
| +    }
 | 
|      case EXTERNAL_DOUBLE_ELEMENTS: {
 | 
|        Handle<ExternalDoubleArray> array(
 | 
|            ExternalDoubleArray::cast(object->elements()));
 | 
| @@ -13126,6 +13259,8 @@ void JSObject::GetElementsCapacityAndUsage(int* capacity, int* used) {
 | 
|      case EXTERNAL_INT_ELEMENTS:
 | 
|      case EXTERNAL_UNSIGNED_INT_ELEMENTS:
 | 
|      case EXTERNAL_FLOAT_ELEMENTS:
 | 
| +    case EXTERNAL_FLOAT32x4_ELEMENTS:
 | 
| +    case EXTERNAL_INT32x4_ELEMENTS:
 | 
|      case EXTERNAL_DOUBLE_ELEMENTS:
 | 
|      case EXTERNAL_PIXEL_ELEMENTS:
 | 
|        // External arrays are considered 100% used.
 | 
| @@ -13640,6 +13775,8 @@ int JSObject::GetLocalElementKeys(FixedArray* storage,
 | 
|      case EXTERNAL_INT_ELEMENTS:
 | 
|      case EXTERNAL_UNSIGNED_INT_ELEMENTS:
 | 
|      case EXTERNAL_FLOAT_ELEMENTS:
 | 
| +    case EXTERNAL_FLOAT32x4_ELEMENTS:
 | 
| +    case EXTERNAL_INT32x4_ELEMENTS:
 | 
|      case EXTERNAL_DOUBLE_ELEMENTS: {
 | 
|        int length = ExternalArray::cast(elements())->length();
 | 
|        while (counter < length) {
 | 
| @@ -14687,6 +14824,10 @@ ExternalArrayType JSTypedArray::type() {
 | 
|        return kExternalUnsignedIntArray;
 | 
|      case EXTERNAL_FLOAT_ARRAY_TYPE:
 | 
|        return kExternalFloatArray;
 | 
| +    case EXTERNAL_FLOAT32x4_ARRAY_TYPE:
 | 
| +      return kExternalFloat32x4Array;
 | 
| +    case EXTERNAL_INT32x4_ARRAY_TYPE:
 | 
| +      return kExternalInt32x4Array;
 | 
|      case EXTERNAL_DOUBLE_ARRAY_TYPE:
 | 
|        return kExternalDoubleArray;
 | 
|      case EXTERNAL_PIXEL_ARRAY_TYPE:
 | 
| @@ -14713,6 +14854,10 @@ size_t JSTypedArray::element_size() {
 | 
|        return 4;
 | 
|      case EXTERNAL_FLOAT_ARRAY_TYPE:
 | 
|        return 4;
 | 
| +    case EXTERNAL_FLOAT32x4_ARRAY_TYPE:
 | 
| +      return 16;
 | 
| +    case EXTERNAL_INT32x4_ARRAY_TYPE:
 | 
| +      return 16;
 | 
|      case EXTERNAL_DOUBLE_ARRAY_TYPE:
 | 
|        return 8;
 | 
|      case EXTERNAL_PIXEL_ARRAY_TYPE:
 | 
| @@ -14954,6 +15099,66 @@ MaybeObject* ExternalDoubleArray::SetValue(uint32_t index, Object* value) {
 | 
|  }
 | 
|  
 | 
|  
 | 
| +Handle<Object> ExternalFloat32x4Array::SetValue(
 | 
| +    Handle<ExternalFloat32x4Array> array,
 | 
| +    uint32_t index,
 | 
| +    Handle<Object> value) {
 | 
| +  CALL_HEAP_FUNCTION(array->GetIsolate(),
 | 
| +                     array->SetValue(index, *value),
 | 
| +                     Object);
 | 
| +}
 | 
| +
 | 
| +
 | 
| +MaybeObject* ExternalFloat32x4Array::SetValue(uint32_t index, Object* value) {
 | 
| +  float32x4_value_t cast_value;
 | 
| +  cast_value.storage[0] = static_cast<float>(OS::nan_value());
 | 
| +  cast_value.storage[1] = static_cast<float>(OS::nan_value());
 | 
| +  cast_value.storage[2] = static_cast<float>(OS::nan_value());
 | 
| +  cast_value.storage[3] = static_cast<float>(OS::nan_value());
 | 
| +  Heap* heap = GetHeap();
 | 
| +  if (index < static_cast<uint32_t>(length())) {
 | 
| +    if (value->IsFloat32x4()) {
 | 
| +      cast_value = Float32x4::cast(value)->value();
 | 
| +    } else {
 | 
| +      // Clamp undefined to NaN (default). All other types have been
 | 
| +      // converted to a number type further up in the call chain.
 | 
| +      ASSERT(value->IsUndefined());
 | 
| +    }
 | 
| +    set(index, cast_value);
 | 
| +  }
 | 
| +  return heap->AllocateFloat32x4(cast_value);
 | 
| +}
 | 
| +
 | 
| +
 | 
| +Handle<Object> ExternalInt32x4Array::SetValue(
 | 
| +    Handle<ExternalInt32x4Array> array, uint32_t index, Handle<Object> value) {
 | 
| +  CALL_HEAP_FUNCTION(array->GetIsolate(),
 | 
| +                     array->SetValue(index, *value),
 | 
| +                     Object);
 | 
| +}
 | 
| +
 | 
| +
 | 
| +MaybeObject* ExternalInt32x4Array::SetValue(uint32_t index, Object* value) {
 | 
| +  int32x4_value_t cast_value;
 | 
| +  cast_value.storage[0] = 0;
 | 
| +  cast_value.storage[1] = 0;
 | 
| +  cast_value.storage[2] = 0;
 | 
| +  cast_value.storage[3] = 0;
 | 
| +  Heap* heap = GetHeap();
 | 
| +  if (index < static_cast<uint32_t>(length())) {
 | 
| +    if (value->IsInt32x4()) {
 | 
| +      cast_value = Int32x4::cast(value)->value();
 | 
| +    } else {
 | 
| +      // Clamp undefined to zero (default). All other types have been
 | 
| +      // converted to a number type further up in the call chain.
 | 
| +      ASSERT(value->IsUndefined());
 | 
| +    }
 | 
| +    set(index, cast_value);
 | 
| +  }
 | 
| +  return heap->AllocateInt32x4(cast_value);
 | 
| +}
 | 
| +
 | 
| +
 | 
|  PropertyCell* GlobalObject::GetPropertyCell(LookupResult* result) {
 | 
|    ASSERT(!HasFastProperties());
 | 
|    Object* value = property_dictionary()->ValueAt(result->GetDictionaryEntry());
 | 
| 
 |