Bug 1241872: Fix inlining of SIMD extractLanes in self-hosting; r?jolesen draft
authorBenjamin Bouvier <benj@benj.me>
Fri, 22 Jan 2016 16:44:54 +0100
changeset 324369 e4f5a5ffbd03207bf33a59fdf3670811b39410f6
parent 324368 9f4ad9127752dcc7494d4cc31f0d02fe4cc066e7
child 513363 5861b967c8a106b0bc392161e9478e04abf1423d
push id9886
push userbenj@benj.me
push dateFri, 22 Jan 2016 15:50:49 +0000
reviewersjolesen
bugs1241872
milestone46.0a1
Bug 1241872: Fix inlining of SIMD extractLanes in self-hosting; r?jolesen
js/src/builtin/SIMD.cpp
js/src/builtin/SIMD.h
js/src/jit-test/tests/SIMD/bug1241872.js
js/src/vm/SelfHosting.cpp
--- a/js/src/builtin/SIMD.cpp
+++ b/js/src/builtin/SIMD.cpp
@@ -216,16 +216,19 @@ static const JSFunctionSpec SimdTypedObj
 };
 
 // Provide JSJitInfo structs for those types that are supported by Ion.
 // The controlling SIMD type is encoded as the InlinableNative primary opcode.
 // The SimdOperation within the type is encoded in the .depth field.
 //
 // The JS_INLINABLE_FN macro refers to js::JitInfo_##native which we provide as
 // Simd##Type##_##Operation
+//
+// /!\ Don't forget to keep this list in sync with the SIMD instrinics used in
+// SelfHosting.cpp.
 
 namespace js {
 namespace jit {
 
 // See also JitInfo_* in MCallOptimize.cpp. We provide a JSJitInfo for all the
 // named functions here. The default JitInfo_SimdInt32x4 etc structs represent the
 // SimdOperation::Constructor.
 #define DEFN(TYPE, OP) const JSJitInfo JitInfo_Simd##TYPE##_##OP = {                             \
--- a/js/src/builtin/SIMD.h
+++ b/js/src/builtin/SIMD.h
@@ -1015,16 +1015,26 @@ template<typename V>
 JSObject* CreateSimd(JSContext* cx, const typename V::Elem* data);
 
 template<typename V>
 bool IsVectorObject(HandleValue v);
 
 template<typename V>
 bool ToSimdConstant(JSContext* cx, HandleValue v, jit::SimdConstant* out);
 
+JSObject*
+InitSimdClass(JSContext* cx, HandleObject obj);
+
+namespace jit {
+
+extern const JSJitInfo JitInfo_SimdInt32x4_extractLane;
+extern const JSJitInfo JitInfo_SimdFloat32x4_extractLane;
+
+} // namespace jit
+
 #define DECLARE_SIMD_FLOAT32X4_FUNCTION(Name, Func, Operands)   \
 extern bool                                                     \
 simd_float32x4_##Name(JSContext* cx, unsigned argc, Value* vp);
 FLOAT32X4_FUNCTION_LIST(DECLARE_SIMD_FLOAT32X4_FUNCTION)
 #undef DECLARE_SIMD_FLOAT32X4_FUNCTION
 
 #define DECLARE_SIMD_FLOAT64X2_FUNCTION(Name, Func, Operands)   \
 extern bool                                                     \
@@ -1087,14 +1097,11 @@ BOOL32X4_FUNCTION_LIST(DECLARE_SIMD_BOOL
 #undef DECLARE_SIMD_BOOL32X4_FUNCTION
 
 #define DECLARE_SIMD_BOOL64x2_FUNCTION(Name, Func, Operands)    \
 extern bool                                                     \
 simd_bool64x2_##Name(JSContext* cx, unsigned argc, Value* vp);
 BOOL64X2_FUNCTION_LIST(DECLARE_SIMD_BOOL64x2_FUNCTION)
 #undef DECLARE_SIMD_BOOL64x2_FUNCTION
 
-JSObject*
-InitSimdClass(JSContext* cx, HandleObject obj);
-
 }  /* namespace js */
 
 #endif /* builtin_SIMD_h */
new file mode 100644
--- /dev/null
+++ b/js/src/jit-test/tests/SIMD/bug1241872.js
@@ -0,0 +1,10 @@
+if (typeof SIMD !== 'object')
+    exit(0);
+
+function test() {
+    return SIMD.Float32x4().toSource();
+}
+
+var r = '';
+for (var i = 0; i < 10000; i++)
+    r = test();
--- a/js/src/vm/SelfHosting.cpp
+++ b/js/src/vm/SelfHosting.cpp
@@ -1647,21 +1647,21 @@ static const JSFunctionSpec intrinsic_fu
 
     JS_FN("std_WeakMap_has",                     WeakMap_has,                  1,0),
     JS_FN("std_WeakMap_get",                     WeakMap_get,                  2,0),
     JS_FN("std_WeakMap_set",                     WeakMap_set,                  2,0),
     JS_FN("std_WeakMap_delete",                  WeakMap_delete,               1,0),
 
     JS_FN("std_SIMD_Int8x16_extractLane",        simd_int8x16_extractLane,     2,0),
     JS_FN("std_SIMD_Int16x8_extractLane",        simd_int16x8_extractLane,     2,0),
-    JS_INLINABLE_FN("std_SIMD_Int32x4_extractLane",   simd_int32x4_extractLane,  2,0, SimdInt32x4),
+    JS_INLINABLE_FN("std_SIMD_Int32x4_extractLane",   simd_int32x4_extractLane,  2,0, SimdInt32x4_extractLane),
     JS_FN("std_SIMD_Uint8x16_extractLane",       simd_uint8x16_extractLane,    2,0),
     JS_FN("std_SIMD_Uint16x8_extractLane",       simd_uint16x8_extractLane,    2,0),
     JS_FN("std_SIMD_Uint32x4_extractLane",       simd_uint32x4_extractLane,    2,0),
-    JS_INLINABLE_FN("std_SIMD_Float32x4_extractLane", simd_float32x4_extractLane,2,0, SimdFloat32x4),
+    JS_INLINABLE_FN("std_SIMD_Float32x4_extractLane", simd_float32x4_extractLane,2,0, SimdFloat32x4_extractLane),
     JS_FN("std_SIMD_Float64x2_extractLane",      simd_float64x2_extractLane,   2,0),
     JS_FN("std_SIMD_Bool8x16_extractLane",       simd_bool8x16_extractLane,    2,0),
     JS_FN("std_SIMD_Bool16x8_extractLane",       simd_bool16x8_extractLane,    2,0),
     JS_FN("std_SIMD_Bool32x4_extractLane",       simd_bool32x4_extractLane,    2,0),
     JS_FN("std_SIMD_Bool64x2_extractLane",       simd_bool64x2_extractLane,    2,0),
 
     // Helper funtions after this point.
     JS_INLINABLE_FN("ToObject",      intrinsic_ToObject,                1,0, IntrinsicToObject),