summaryrefslogtreecommitdiffstats
path: root/js/src/jit-test/tests/SIMD/shuffle.js
diff options
context:
space:
mode:
Diffstat (limited to 'js/src/jit-test/tests/SIMD/shuffle.js')
-rw-r--r--js/src/jit-test/tests/SIMD/shuffle.js86
1 files changed, 86 insertions, 0 deletions
diff --git a/js/src/jit-test/tests/SIMD/shuffle.js b/js/src/jit-test/tests/SIMD/shuffle.js
new file mode 100644
index 000000000..505f01131
--- /dev/null
+++ b/js/src/jit-test/tests/SIMD/shuffle.js
@@ -0,0 +1,86 @@
+load(libdir + 'simd.js');
+
+setJitCompilerOption("ion.warmup.trigger", 50);
+
+function f() {
+ var i1 = SIMD.Int32x4(1, 2, 3, 4);
+ var i2 = SIMD.Int32x4(5, 6, 7, 8);
+
+ var leet = Math.fround(13.37);
+ var f1 = SIMD.Float32x4(-.5, -0, Infinity, leet);
+ var f2 = SIMD.Float32x4(42, .5, 23, -10);
+
+ // computes all rotations of a given array
+ function *gen(arr) {
+ var previous = arr.slice().splice(0, 4);
+ var i = 4;
+ for (var j = 0; j < 8; j++) {
+ yield previous.slice();
+ previous = previous.splice(1, previous.length - 1);
+ previous.push(arr[i]);
+ i = (i + 1) % arr.length;
+ }
+ }
+
+ var compI = [];
+ var baseI = [];
+ for (var i = 0; i < 8; i++)
+ baseI.push(SIMD.Int32x4.extractLane(i < 4 ? i1 : i2, i % 4));
+ for (var k of gen(baseI))
+ compI.push(k);
+
+ var compF = [];
+ var baseF = [];
+ for (var i = 0; i < 8; i++)
+ baseF.push(SIMD.Float32x4.extractLane(i < 4 ? f1 : f2, i % 4));
+ for (var k of gen(baseF))
+ compF.push(k);
+
+ for (var i = 0; i < 150; i++) {
+ // Variable lanes
+ var r = SIMD.Float32x4.shuffle(f1, f2, i % 8, (i + 1) % 8, (i + 2) % 8, (i + 3) % 8);
+ assertEqX4(r, compF[i % 8]);
+
+ // Constant lanes
+ assertEqX4(SIMD.Float32x4.shuffle(f1, f2, 3, 2, 4, 5), [leet, Infinity, 42, .5]);
+
+ // Variable lanes
+ var r = SIMD.Int32x4.shuffle(i1, i2, i % 8, (i + 1) % 8, (i + 2) % 8, (i + 3) % 8);
+ assertEqX4(r, compI[i % 8]);
+
+ // Constant lanes
+ assertEqX4(SIMD.Int32x4.shuffle(i1, i2, 3, 2, 4, 5), [4, 3, 5, 6]);
+ }
+}
+
+function testBailouts(expectException, uglyDuckling) {
+ var i1 = SIMD.Int32x4(1, 2, 3, 4);
+ var i2 = SIMD.Int32x4(5, 6, 7, 8);
+
+ for (var i = 0; i < 150; i++) {
+ // Test bailouts
+ var value = i == 149 ? uglyDuckling : 0;
+ var caught = false;
+ try {
+ assertEqX4(SIMD.Int32x4.shuffle(i1, i2, value, 2, 4, 5), [1, 3, 5, 6]);
+ } catch(e) {
+ print(e);
+ caught = true;
+ assertEq(i, 149);
+ assertEq(e instanceof TypeError || e instanceof RangeError, true);
+ }
+ if (i == 149)
+ assertEq(caught, expectException);
+ }
+}
+
+f();
+testBailouts(true, -1);
+testBailouts(true, 8);
+testBailouts(true, 2.5);
+testBailouts(true, undefined);
+testBailouts(true, {});
+testBailouts(true, 'one');
+testBailouts(false, false);
+testBailouts(false, null);
+testBailouts(false, " 0.0 ");