blob: 9c179b8e6b05326c39280163230e3c0743e4fa72 [file] [log] [blame]
// |reftest| skip-if(!this.hasOwnProperty("SIMD"))
/*
* Any copyright is dedicated to the Public Domain.
* https://creativecommons.org/publicdomain/zero/1.0/
*/
var Int8x16 = SIMD.Int8x16;
var Int16x8 = SIMD.Int16x8;
var Int32x4 = SIMD.Int32x4;
function lsh8(a, b) {
return (b >>> 0) >= 8 ? 0 : (a << b) << 24 >> 24;
}
function rsh8(a, b) {
return (a >> Math.min(b >>> 0, 7)) << 24 >> 24;
}
function ursh8(a, b) {
return (b >>> 0) >= 8 ? 0 : (a >>> b) << 24 >> 24;
}
function lsh16(a, b) {
return (b >>> 0) >= 16 ? 0 : (a << b) << 16 >> 16;
}
function rsh16(a, b) {
return (a >> Math.min(b >>> 0, 15)) << 16 >> 16;
}
function ursh16(a, b) {
return (b >>> 0) >= 16 ? 0 : (a >>> b) << 16 >> 16;
}
function lsh32(a, b) {
return (b >>> 0) >= 32 ? 0 : (a << b) | 0;
}
function rsh32(a, b) {
return (a >> Math.min(b >>> 0, 31)) | 0;
}
function ursh32(a, b) {
return (b >>> 0) >= 32 ? 0 : (a >>> b) | 0;
}
function test() {
function TestError() {};
var good = {valueOf: () => 21};
var bad = {valueOf: () => {throw new TestError(); }};
for (var v of [
Int8x16(-1, 2, -3, 4, -5, 6, -7, 8, -9, 10, -11, 12, -13, 14, -15, 16),
Int8x16(INT8_MAX, INT8_MIN, INT8_MAX - 1, INT8_MIN + 1)
])
{
for (var bits = -2; bits < 12; bits++) {
testBinaryScalarFunc(v, bits, Int8x16.shiftLeftByScalar, lsh8);
testBinaryScalarFunc(v, bits, Int8x16.shiftRightArithmeticByScalar, rsh8);
testBinaryScalarFunc(v, bits, Int8x16.shiftRightLogicalByScalar, ursh8);
}
// Test that the shift count is coerced to an int32.
testBinaryScalarFunc(v, undefined, Int8x16.shiftLeftByScalar, lsh8);
testBinaryScalarFunc(v, 3.5, Int8x16.shiftLeftByScalar, lsh8);
testBinaryScalarFunc(v, good, Int8x16.shiftLeftByScalar, lsh8);
}
for (var v of [
Int16x8(-1, 2, -3, 4, -5, 6, -7, 8),
Int16x8(INT16_MAX, INT16_MIN, INT16_MAX - 1, INT16_MIN + 1)
])
{
for (var bits = -2; bits < 20; bits++) {
testBinaryScalarFunc(v, bits, Int16x8.shiftLeftByScalar, lsh16);
testBinaryScalarFunc(v, bits, Int16x8.shiftRightArithmeticByScalar, rsh16);
testBinaryScalarFunc(v, bits, Int16x8.shiftRightLogicalByScalar, ursh16);
}
// Test that the shift count is coerced to an int32.
testBinaryScalarFunc(v, undefined, Int16x8.shiftLeftByScalar, lsh16);
testBinaryScalarFunc(v, 3.5, Int16x8.shiftLeftByScalar, lsh16);
testBinaryScalarFunc(v, good, Int16x8.shiftLeftByScalar, lsh16);
}
for (var v of [
Int32x4(-1, 2, -3, 4),
Int32x4(INT32_MAX, INT32_MIN, INT32_MAX - 1, INT32_MIN + 1)
])
{
for (var bits = -2; bits < 36; bits++) {
testBinaryScalarFunc(v, bits, Int32x4.shiftLeftByScalar, lsh32);
testBinaryScalarFunc(v, bits, Int32x4.shiftRightArithmeticByScalar, rsh32);
testBinaryScalarFunc(v, bits, Int32x4.shiftRightLogicalByScalar, ursh32);
}
// Test that the shift count is coerced to an int32.
testBinaryScalarFunc(v, undefined, Int32x4.shiftLeftByScalar, lsh32);
testBinaryScalarFunc(v, 3.5, Int32x4.shiftLeftByScalar, lsh32);
testBinaryScalarFunc(v, good, Int32x4.shiftLeftByScalar, lsh32);
}
var v = SIMD.Int8x16(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16);
assertThrowsInstanceOf(() => SIMD.Int8x16.shiftLeftByScalar(v, bad), TestError);
assertThrowsInstanceOf(() => SIMD.Int8x16.shiftRightArithmeticByScalar(v, bad), TestError);
assertThrowsInstanceOf(() => SIMD.Int8x16.shiftRightLogicalByScalar(v, bad), TestError);
var v = SIMD.Int16x8(1,2,3,4,5,6,7,8);
assertThrowsInstanceOf(() => SIMD.Int16x8.shiftLeftByScalar(v, bad), TestError);
assertThrowsInstanceOf(() => SIMD.Int16x8.shiftRightArithmeticByScalar(v, bad), TestError);
assertThrowsInstanceOf(() => SIMD.Int16x8.shiftRightLogicalByScalar(v, bad), TestError);
var v = SIMD.Int32x4(1,2,3,4);
assertThrowsInstanceOf(() => SIMD.Int32x4.shiftLeftByScalar(v, bad), TestError);
assertThrowsInstanceOf(() => SIMD.Int32x4.shiftRightArithmeticByScalar(v, bad), TestError);
assertThrowsInstanceOf(() => SIMD.Int32x4.shiftRightLogicalByScalar(v, bad), TestError);
if (typeof reportCompare === "function")
reportCompare(true, true);
}
test();