diff options
Diffstat (limited to 'js/src/jit-test/tests/SIMD/shuffle.js')
-rw-r--r-- | js/src/jit-test/tests/SIMD/shuffle.js | 86 |
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 "); |