Index: src/bootstrapper.cc |
diff --git a/src/bootstrapper.cc b/src/bootstrapper.cc |
index 67b579899fd4ea265fae4c3de22fb87e708a3afc..bea7b951d18aba275857304340ad11740bd84f93 100644 |
--- a/src/bootstrapper.cc |
+++ b/src/bootstrapper.cc |
@@ -210,6 +210,7 @@ class Genesis BASE_EMBEDDED { |
ElementsKind elementsKind); |
bool InstallExperimentalNatives(); |
void InstallBuiltinFunctionIds(); |
+ void InstallExperimentalSIMDBuiltinFunctionIds(); |
void InstallJSFunctionResultCaches(); |
void InitializeNormalizedMapCaches(); |
@@ -1438,6 +1439,41 @@ void Genesis::InitializeExperimentalGlobal() { |
generator_result_map->instance_size()); |
native_context()->set_generator_result_map(*generator_result_map); |
} |
+ |
+ if (FLAG_simd_object) { |
+ // --- f l o a t 3 2 x 4 --- |
+ Handle<JSFunction> float32x4_fun = |
+ InstallFunction(global, "float32x4", JS_VALUE_TYPE, JSValue::kSize, |
+ isolate()->initial_object_prototype(), |
+ Builtins::kIllegal, true, true); |
+ native_context()->set_float32x4_function(*float32x4_fun); |
+ InstallFunction(float32x4_fun, "zero", JS_VALUE_TYPE, JSValue::kSize, |
+ isolate()->initial_object_prototype(), |
+ Builtins::kIllegal, true, true); |
+ InstallFunction(float32x4_fun, "splat", JS_VALUE_TYPE, JSValue::kSize, |
+ isolate()->initial_object_prototype(), |
+ Builtins::kIllegal, true, true); |
+ |
+ // --- u i n t 3 2 x 4 --- |
+ Handle<JSFunction> int32x4_fun = |
+ InstallFunction(global, "int32x4", JS_VALUE_TYPE, JSValue::kSize, |
+ isolate()->initial_object_prototype(), |
+ Builtins::kIllegal, true, true); |
+ native_context()->set_int32x4_function(*int32x4_fun); |
+ InstallFunction(int32x4_fun, "bool", JS_VALUE_TYPE, JSValue::kSize, |
+ isolate()->initial_object_prototype(), |
+ Builtins::kIllegal, true, true); |
+ InstallFunction(int32x4_fun, "splat", JS_VALUE_TYPE, JSValue::kSize, |
+ isolate()->initial_object_prototype(), |
+ Builtins::kIllegal, true, true); |
+ |
+ Handle<JSFunction> float32x4_array_fun = InstallTypedArray("Float32x4Array", |
+ EXTERNAL_FLOAT32x4_ELEMENTS); |
+ native_context()->set_float32x4_array_fun(*float32x4_array_fun); |
+ Handle<JSFunction> int32x4_array_fun = InstallTypedArray("Int32x4Array", |
+ EXTERNAL_INT32x4_ELEMENTS); |
+ native_context()->set_int32x4_array_fun(*int32x4_array_fun); |
+ } |
} |
@@ -2069,6 +2105,22 @@ bool Genesis::InstallExperimentalNatives() { |
"native harmony-math.js") == 0) { |
if (!CompileExperimentalBuiltin(isolate(), i)) return false; |
} |
+ if (FLAG_simd_object && |
+ strcmp(ExperimentalNatives::GetScriptName(i).start(), |
+ "native simd128.js") == 0) { |
+ if (!CompileExperimentalBuiltin(isolate(), i)) return false; |
+ InstallExperimentalSIMDBuiltinFunctionIds(); |
+ // Store the map for the float32x4 and int32x4 function prototype after |
+ // the float32x4 and int32x4 function has been set up. |
+ JSObject* float32x4_function_prototype = JSObject::cast( |
+ native_context()->float32x4_function()->instance_prototype()); |
+ native_context()->set_float32x4_function_prototype_map( |
+ float32x4_function_prototype->map()); |
+ JSObject* int32x4_function_prototype = JSObject::cast( |
+ native_context()->int32x4_function()->instance_prototype()); |
+ native_context()->set_int32x4_function_prototype_map( |
+ int32x4_function_prototype->map()); |
+ } |
} |
InstallExperimentalNativeFunctions(); |
@@ -2097,6 +2149,33 @@ static Handle<JSObject> ResolveBuiltinIdHolder( |
} |
+static Handle<JSObject> ResolveBuiltinSIMDIdHolder( |
+ Handle<Context> native_context, |
+ const char* holder_expr) { |
+ Isolate* isolate = native_context->GetIsolate(); |
+ Factory* factory = isolate->factory(); |
+ Handle<GlobalObject> global(native_context->global_object()); |
+ Handle<Object> holder = global; |
+ char* name = const_cast<char*>(holder_expr); |
+ char* period_pos = strchr(name, '.'); |
+ while (period_pos != NULL) { |
+ Vector<const char> property(name, static_cast<int>(period_pos - name)); |
+ holder = GetProperty(isolate, holder, |
+ factory->InternalizeUtf8String(property)); |
+ if (strcmp(".prototype", period_pos) == 0) { |
+ Handle<JSFunction> function = Handle<JSFunction>::cast(holder); |
+ return Handle<JSObject>(JSObject::cast(function->prototype())); |
+ } else { |
+ name = period_pos + 1; |
+ period_pos = strchr(name, '.'); |
+ } |
+ } |
+ |
+ return Handle<JSObject>::cast(GetProperty( |
+ isolate, holder, factory->InternalizeUtf8String(name))); |
+} |
+ |
+ |
static void InstallBuiltinFunctionId(Handle<JSObject> holder, |
const char* function_name, |
BuiltinFunctionId id) { |
@@ -2122,6 +2201,25 @@ void Genesis::InstallBuiltinFunctionIds() { |
} |
+void Genesis::InstallExperimentalSIMDBuiltinFunctionIds() { |
+ HandleScope scope(isolate()); |
+#define INSTALL_BUILTIN_ID(holder_expr, fun_name, name) \ |
+ { \ |
+ Handle<JSObject> holder = ResolveBuiltinSIMDIdHolder( \ |
+ native_context(), #holder_expr); \ |
+ BuiltinFunctionId id = k##name; \ |
+ InstallBuiltinFunctionId(holder, #fun_name, id); \ |
+ } |
+ EXPERIMENTAL_SIMD_FUNCTIONS_WITH_ID_LIST(INSTALL_BUILTIN_ID) |
+#undef INSTALL_BUILTIN_ID |
+ { |
+ Handle<GlobalObject> global(native_context()->global_object()); |
+ InstallBuiltinFunctionId(global, "float32x4", kFloat32x4Constructor); |
+ InstallBuiltinFunctionId(global, "int32x4", kInt32x4Constructor); |
+ } |
+} |
+ |
+ |
// Do not forget to update macros.py with named constant |
// of cache id. |
#define JSFUNCTION_RESULT_CACHE_LIST(F) \ |