Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(76)

Unified Diff: src/objects.cc

Issue 90643003: Experimental implementation: Exposing SIMD instructions into JavaScript Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Created 7 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « src/objects.h ('k') | src/objects-debug.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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());
« no previous file with comments | « src/objects.h ('k') | src/objects-debug.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698