diff options
Diffstat (limited to 'js/src/tests/ecma_7/SIMD/unary-operations.js')
-rw-r--r-- | js/src/tests/ecma_7/SIMD/unary-operations.js | 410 |
1 files changed, 410 insertions, 0 deletions
diff --git a/js/src/tests/ecma_7/SIMD/unary-operations.js b/js/src/tests/ecma_7/SIMD/unary-operations.js new file mode 100644 index 000000000..b04d23874 --- /dev/null +++ b/js/src/tests/ecma_7/SIMD/unary-operations.js @@ -0,0 +1,410 @@ +// |reftest| skip-if(!this.hasOwnProperty("SIMD")) +var Float32x4 = SIMD.Float32x4; +var Int8x16 = SIMD.Int8x16; +var Int16x8 = SIMD.Int16x8; +var Int32x4 = SIMD.Int32x4; +var Uint8x16 = SIMD.Uint8x16; +var Uint16x8 = SIMD.Uint16x8; +var Uint32x4 = SIMD.Uint32x4; +var Bool8x16 = SIMD.Bool8x16; +var Bool16x8 = SIMD.Bool16x8; +var Bool32x4 = SIMD.Bool32x4; +var Bool64x2 = SIMD.Bool64x2; + +function testFloat32x4abs() { + function absf(a) { + return Math.abs(Math.fround(a)); + } + + var vals = [ + [-1, 2, -3, 4], + [-1.63, 2.46, -3.17, 4.94], + [NaN, -0, Infinity, -Infinity] + ]; + for (var v of vals) { + assertEqX4(Float32x4.abs(Float32x4(...v)), v.map(absf)); + } +} + +function testFloat32x4neg() { + function negf(a) { + return -1 * Math.fround(a); + } + + var vals = [ + [1, 2, 3, 4], + [0.999, -0.001, 3.78, 4.05], + [NaN, -0, Infinity, -Infinity] + ]; + for (var v of vals) { + assertEqX4(Float32x4.neg(Float32x4(...v)), v.map(negf)); + } +} + +function testFloat32x4reciprocalApproximation() { + function reciprocalf(a) { + return Math.fround(1 / Math.fround(a)); + } + + var vals = [ + [[1, 0.5, 0.25, 0.125], [1, 2, 4, 8]], + [[1.6, 0.8, 0.4, 0.2], [1.6, 0.8, 0.4, 0.2].map(reciprocalf)], + [[NaN, -0, Infinity, -Infinity], [NaN, -Infinity, 0, -0]] + ]; + + for (var [v,w] of vals) { + assertEqX4(Float32x4.reciprocalApproximation(Float32x4(...v)), w); + } +} + +function testFloat32x4reciprocalSqrtApproximation() { + function reciprocalsqrtf(a) { + assertEq(Math.fround(a), a); + return Math.fround(1 / Math.fround(Math.sqrt(a))); + } + + var vals = [ + [[1, 1, 0.25, 0.25], [1, 1, 2, 2]], + [[25, 16, 6.25, 1.5625], [25, 16, 6.25, 1.5625].map(reciprocalsqrtf)], + [[NaN, -0, Infinity, -Infinity], [NaN, -0, Infinity, -Infinity].map(reciprocalsqrtf)], + [[Math.pow(2, 32), Math.pow(2, -32), +0, Math.pow(2, -148)], + [Math.pow(2, -16), Math.pow(2, 16), Infinity, Math.pow(2, 74)]] + ]; + + for (var [v,w] of vals) { + assertEqX4(Float32x4.reciprocalSqrtApproximation(Float32x4(...v)), w); + } +} + +function testFloat32x4sqrt() { + function sqrtf(a) { + return Math.fround(Math.sqrt(Math.fround(a))); + } + + var vals = [ + [[1, 4, 9, 16], [1, 2, 3, 4]], + [[2.7225, 7.3441, 9.4249, -1], [2.7225, 7.3441, 9.4249, -1].map(sqrtf)], + [[NaN, -0, Infinity, -Infinity], [NaN, -0, Infinity, NaN]] + ]; + + for (var [v,w] of vals) { + assertEqX4(Float32x4.sqrt(Float32x4(...v)), w); + } +} + +function testInt8x16neg() { + var vals = [ + [[1, 2, 3, 4, 5, 6, 7, 8, -1, -2, -3, -4, -5, INT8_MAX, INT8_MIN, 0], + [-1, -2, -3, -4, -5, -6, -7, -8, 1, 2, 3, 4, 5, -INT8_MAX, INT8_MIN, 0]] + ]; + for (var [v,w] of vals) { + assertEqX16(Int8x16.neg(Int8x16(...v)), w); + } +} + +function testInt8x16not() { + var vals = [ + [[1, 2, 3, 4, 5, 6, 7, -1, -2, -3, -4, -5, -6, 0, INT8_MIN, INT8_MAX], + [1, 2, 3, 4, 5, 6, 7, -1, -2, -3, -4, -5, -6, 0, INT8_MIN, INT8_MAX].map((x) => ~x << 24 >> 24)] + ]; + for (var [v,w] of vals) { + assertEqX16(Int8x16.not(Int8x16(...v)), w); + } +} + +function testInt16x8neg() { + var vals = [ + [[1, 2, 3, -1, -2, 0, INT16_MIN, INT16_MAX], + [-1, -2, -3, 1, 2, 0, INT16_MIN, -INT16_MAX]] + ]; + for (var [v,w] of vals) { + assertEqX8(Int16x8.neg(Int16x8(...v)), w); + } +} + +function testInt16x8not() { + var vals = [ + [[1, 2, 3, -1, -2, 0, INT16_MIN, INT16_MAX], + [1, 2, 3, -1, -2, 0, INT16_MIN, INT16_MAX].map((x) => ~x << 16 >> 16)] + ]; + for (var [v,w] of vals) { + assertEqX8(Int16x8.not(Int16x8(...v)), w); + } +} + +function testInt32x4neg() { + var valsExp = [ + [[1, 2, 3, 4], [-1, -2, -3, -4]], + [[INT32_MAX, INT32_MIN, -0, 0], [-INT32_MAX | 0, -INT32_MIN | 0, 0, 0]] + ]; + for (var [v,w] of valsExp) { + assertEqX4(Int32x4.neg(Int32x4(...v)), w); + } +} + +function testInt32x4not() { + var valsExp = [ + [[1, 2, 3, 4], [-2, -3, -4, -5]], + [[INT32_MAX, INT32_MIN, 0, 0], [~INT32_MAX | 0, ~INT32_MIN | 0, ~0 | 0, ~0 | 0]] + ]; + for (var [v,w] of valsExp) { + assertEqX4(Int32x4.not(Int32x4(...v)), w); + } +} + +function testUint8x16neg() { + var vals = [ + [[ 1, 2, 3, 4, 5, 6, 7, 0, -1, -2, -3, -4, UINT8_MAX, INT8_MAX, 0, 0], + [255, 254, 253, 252, 251, 250, 249, 0, 1, 2, 3, 4, 1, INT8_MAX+2, 0, 0]] + ]; + for (var [v,w] of vals) { + assertEqX16(Uint8x16.neg(Uint8x16(...v)), w); + } +} + +function testUint8x16not() { + var vals = [ + [[1, 2, 3, 4, 5, 6, 7, -1, -2, -3, -4, -5, -6, 0, INT8_MIN, INT8_MAX], + [1, 2, 3, 4, 5, 6, 7, -1, -2, -3, -4, -5, -6, 0, INT8_MIN, INT8_MAX].map((x) => ~x << 24 >>> 24)] + ]; + for (var [v,w] of vals) { + assertEqX16(Uint8x16.not(Uint8x16(...v)), w); + } +} + +function testUint16x8neg() { + var vals = [ + [[1, 2, UINT16_MAX, -1, -2, 0, INT16_MIN, INT16_MAX], + [1, 2, UINT16_MAX, -1, -2, 0, INT16_MIN, INT16_MAX].map((x) => -x << 16 >>> 16)] + ]; + for (var [v,w] of vals) { + assertEqX8(Uint16x8.neg(Uint16x8(...v)), w); + } +} + +function testUint16x8not() { + var vals = [ + [[1, 2, UINT16_MAX, -1, -2, 0, INT16_MIN, INT16_MAX], + [1, 2, UINT16_MAX, -1, -2, 0, INT16_MIN, INT16_MAX].map((x) => ~x << 16 >>> 16)] + ]; + for (var [v,w] of vals) { + assertEqX8(Uint16x8.not(Uint16x8(...v)), w); + } +} + +function testUint32x4neg() { + var valsExp = [ + [[1, 2, 3, 4], [-1 >>> 0, -2 >>> 0, -3 >>> 0, -4 >>> 0]], + [[INT32_MAX, INT32_MIN, -0, 0], [-INT32_MAX >>> 0, -INT32_MIN >>> 0, 0, 0]] + ]; + for (var [v,w] of valsExp) { + assertEqX4(Uint32x4.neg(Uint32x4(...v)), w); + } +} + +function testUint32x4not() { + var valsExp = [ + [[1, 2, 3, 4], [~1 >>> 0, ~2 >>> 0, ~3 >>> 0, ~4 >>> 0]], + [[INT32_MAX, INT32_MIN, UINT32_MAX, 0], [~INT32_MAX >>> 0, ~INT32_MIN >>> 0, 0, ~0 >>> 0]] + ]; + for (var [v,w] of valsExp) { + assertEqX4(Uint32x4.not(Uint32x4(...v)), w); + } +} + +function testBool8x16not() { + var valsExp = [ + [[true, false, true, false, true, false, true, false, true, false, true, false, true, false, true, false], + [false, true, false, true, false, true, false, true, false, true, false, true, false, true, false, true]], + [[true, true, false, false, true, true, false, false, true, true, false, false, true, true, false, false], + [false, false, true, true, false, false, true, true, false, false, true, true, false, false, true, true]] + ]; + for (var [v,w] of valsExp) { + assertEqX16(Bool8x16.not(Bool8x16(...v)), w); + } +} + +function testBool8x16allTrue() { + var valsExp = [ + [[false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false], false], + [[true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true], true], + [[false, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true], false], + [[true, false, true, true, true, true, true, true, true, true, true, true, true, true, true, true], false], + [[true, false, true, true, true, true, true, true, true, true, true, true, true, true, false, true], false], + [[true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, false], false], + ]; + for (var [v,w] of valsExp) { + assertEq(Bool8x16.allTrue(Bool8x16(...v)), w); + } +} + +function testBool8x16anyTrue() { + var valsExp = [ + [[false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false], false], + [[true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true], true], + [[false, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true], true], + [[true, false, true, true, true, true, true, true, true, true, true, true, true, true, true, true], true], + [[true, false, true, true, true, true, true, true, true, true, true, true, true, true, false, true], true], + [[true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, false], true], + ]; + for (var [v,w] of valsExp) { + assertEq(Bool8x16.anyTrue(Bool8x16(...v)), w); + } +} + +function testBool16x8not() { + var valsExp = [ + [[true, false, true, false, true, false, true, false], [false, true, false, true, false, true, false, true]], + [[true, true, false, false, true, true, false, false], [false, false, true, true, false, false, true, true]] + ]; + for (var [v,w] of valsExp) { + assertEqX8(Bool16x8.not(Bool16x8(...v)), w); + } +} + +function testBool16x8allTrue() { + var valsExp = [ + [[false, false, false, false, false, false, false, false], false], + [[true, true, true, true, true, true, true, true], true], + [[false, true, true, true, true, true, true, true], false], + [[true, false, true, true, true, true, true, true], false], + [[true, true, true, true, true, true, false, true], false], + [[true, true, true, true, true, true, true, false], false], + ]; + for (var [v,w] of valsExp) { + assertEq(Bool16x8.allTrue(Bool16x8(...v)), w); + } +} + +function testBool16x8anyTrue() { + var valsExp = [ + [[false, false, false, false, false, false, false, false], false], + [[true, true, true, true, true, true, true, true], true], + [[false, false, false, false, false, false, false, true], true], + [[false, false, false, false, false, false, true, false], true], + [[false, true, false, false, false, false, false, true], true], + [[true, false, false, false, false, false, false, false], true], + ]; + for (var [v,w] of valsExp) { + assertEq(Bool16x8.anyTrue(Bool16x8(...v)), w); + } +} + +function testBool32x4not() { + var valsExp = [ + [[true, false, true, false], [false, true, false, true]], + [[true, true, false, false], [false, false, true, true]] + ]; + for (var [v,w] of valsExp) { + assertEqX4(Bool32x4.not(Bool32x4(...v)), w); + } +} + +function testBool32x4allTrue() { + var valsExp = [ + [[false, false, false, false], false], + [[true, false, true, false], false], + [[true, true, true, true], true], + [[true, true, false, false], false] + ]; + for (var [v,w] of valsExp) { + assertEq(Bool32x4.allTrue(Bool32x4(...v)), w); + } +} + +function testBool32x4anyTrue() { + var valsExp = [ + [[false, false, false, false], false], + [[true, false, true, false], true], + [[true, true, true, true], true], + [[true, true, false, false], true] + ]; + for (var [v,w] of valsExp) { + assertEq(Bool32x4.anyTrue(Bool32x4(...v)), w); + } +} + +function testBool64x2not() { + var valsExp = [ + [[false, false], [true, true]], + [[false, true], [true, false]], + [[true, false], [false, true]], + [[true, true], [false, false]] + ]; + for (var [v,w] of valsExp) { + assertEqX2(Bool64x2.not(Bool64x2(...v)), w); + } +} + +function testBool64x2allTrue() { + var valsExp = [ + [[false, false], false], + [[false, true], false], + [[true, false], false], + [[true, true], true] + ]; + for (var [v,w] of valsExp) { + assertEq(Bool64x2.allTrue(Bool64x2(...v)), w); + } +} + +function testBool64x2anyTrue() { + var valsExp = [ + [[false, false], false], + [[false, true], true], + [[true, false], true], + [[true, true], true] + ]; + for (var [v,w] of valsExp) { + assertEq(Bool64x2.anyTrue(Bool64x2(...v)), w); + } +} + +function test() { + testFloat32x4abs(); + testFloat32x4neg(); + testFloat32x4reciprocalApproximation(); + testFloat32x4reciprocalSqrtApproximation(); + testFloat32x4sqrt(); + + testInt8x16neg(); + testInt8x16not(); + + testInt16x8neg(); + testInt16x8not(); + + testInt32x4neg(); + testInt32x4not(); + + testUint8x16neg(); + testUint8x16not(); + + testUint16x8neg(); + testUint16x8not(); + + testUint32x4neg(); + testUint32x4not(); + + testBool8x16not(); + testBool8x16allTrue(); + testBool8x16anyTrue(); + + testBool16x8not(); + testBool16x8allTrue(); + testBool16x8anyTrue(); + + testBool32x4not(); + testBool32x4allTrue(); + testBool32x4anyTrue(); + + testBool64x2not(); + testBool64x2allTrue(); + testBool64x2anyTrue(); + + + if (typeof reportCompare === "function") { + reportCompare(true, true); + } +} + +test(); |