summaryrefslogtreecommitdiffstats
path: root/js/src/jit-test/tests/SIMD/convert.js
diff options
context:
space:
mode:
Diffstat (limited to 'js/src/jit-test/tests/SIMD/convert.js')
-rw-r--r--js/src/jit-test/tests/SIMD/convert.js68
1 files changed, 68 insertions, 0 deletions
diff --git a/js/src/jit-test/tests/SIMD/convert.js b/js/src/jit-test/tests/SIMD/convert.js
new file mode 100644
index 000000000..b27a041e7
--- /dev/null
+++ b/js/src/jit-test/tests/SIMD/convert.js
@@ -0,0 +1,68 @@
+load(libdir + 'simd.js');
+
+setJitCompilerOption("ion.warmup.trigger", 30);
+
+var cast = (function() {
+ var i32 = new Int32Array(1);
+ var f32 = new Float32Array(i32.buffer);
+ return {
+ fromInt32Bits(x) {
+ i32[0] = x;
+ return f32[0];
+ },
+
+ fromFloat32Bits(x) {
+ f32[0] = x;
+ return i32[0];
+ }
+ }
+})();
+
+function f() {
+ // No bailout here.
+ var f4 = SIMD.Float32x4(1, 2, 3, 4);
+ var i4 = SIMD.Int32x4(1, 2, 3, 4);
+ var BitOrZero = (x) => x | 0;
+ for (var i = 0; i < 150; i++) {
+ assertEqX4(SIMD.Float32x4.fromInt32x4(i4), unaryX4(BitOrZero, f4, Math.fround));
+ assertEqX4(SIMD.Float32x4.fromInt32x4Bits(i4), unaryX4(cast.fromInt32Bits, f4, Math.fround));
+ assertEqX4(SIMD.Int32x4.fromFloat32x4(f4), unaryX4(Math.fround, i4, BitOrZero));
+ assertEqX4(SIMD.Int32x4.fromFloat32x4Bits(f4), unaryX4(cast.fromFloat32Bits, i4, BitOrZero));
+ }
+}
+
+function uglyDuckling(val) {
+ // We bail out when i == 149 because the conversion will return
+ // 0x80000000 and the input actually wasn't in bounds.
+ val = Math.fround(val);
+ for (var i = 0; i < 150; i++) {
+ var caught = false;
+ try {
+ var v = SIMD.Float32x4(i < 149 ? 0 : val, 0, 0, 0)
+ SIMD.Int32x4.fromFloat32x4(v);
+ } catch(e) {
+ assertEq(e instanceof RangeError, true);
+ assertEq(i, 149);
+ caught = true;
+ }
+ assertEq(i < 149 || caught, true);
+ }
+}
+
+function dontBail() {
+ // On x86, the conversion will return 0x80000000, which will imply that we
+ // check the input values. However, we shouldn't bail out in this case.
+ for (var i = 0; i < 150; i++) {
+ var v = SIMD.Float32x4(i < 149 ? 0 : -Math.pow(2, 31), 0, 0, 0)
+ SIMD.Int32x4.fromFloat32x4(v);
+ }
+}
+
+f();
+
+dontBail();
+dontBail();
+
+uglyDuckling(Math.pow(2, 31));
+uglyDuckling(NaN);
+uglyDuckling(-Math.pow(2, 32));