// Copyright (C) 2016 ecmascript_simd authors. All rights reserved. // This code is governed by the BSD license found in the LICENSE file. /*--- esid: shuffle description: Tests SIMD shuffle. includes: [simdUtilities.js] ---*/ function testShuffle(type) { assert.sameValue('function', typeof type.fn.shuffle); var indices = []; for (var i = 0; i < type.lanes; i++) indices.push(i); var a = type.fn.apply(type.fn, indices); // 0, 1, 2, 3, 4 ... var b = type.fn.add(a, type.fn.splat(type.lanes)); // lanes, lanes+1 ... // All lanes from a. var result = type.fn.shuffle.apply(type.fn, [a, b].concat(indices)); checkValue(type, result, function(index) { return type.fn.extractLane(a, index); }); // One lane from b. for (var i = 0; i < type.lanes; i++) { var args = [a, b].concat(indices); args[2 + i] += type.lanes; var result = type.fn.shuffle.apply(type.fn, args); checkValue(type, result, function(index) { var val = index == i ? b : a; return type.fn.extractLane(val, index); }); } // All lanes from b. for (var i = 0; i < type.lanes; i++) indices[i] += type.lanes; var result = type.fn.shuffle.apply(type.fn, [a, b].concat(indices)); checkValue(type, result, function(index) { return type.fn.extractLane(b, index); }); function testIndexCheck(index, err) { for (var i = 0; i < type.lanes; i++) { var args = [a, b].concat(indices); args[i + 2] = index; assert.throws(err, function() { type.fn.shuffle.apply(type.fn, args); }); } } testIndexCheck(2 * type.lanes, RangeError); testIndexCheck(13.37, TypeError); testIndexCheck(undefined, TypeError); testIndexCheck({}, TypeError); testIndexCheck('yo', TypeError); testIndexCheck(-1, RangeError); testIndexCheck(128, RangeError); } simdTypes.filter(isNumerical).forEach(function(type) { testSimdFunction(type.name + ' shuffle', function() { testShuffle(type); }); });