diff options
Diffstat (limited to 'js/src/jit-test/lib/simd.js')
-rw-r--r-- | js/src/jit-test/lib/simd.js | 109 |
1 files changed, 109 insertions, 0 deletions
diff --git a/js/src/jit-test/lib/simd.js b/js/src/jit-test/lib/simd.js new file mode 100644 index 000000000..f275c6f08 --- /dev/null +++ b/js/src/jit-test/lib/simd.js @@ -0,0 +1,109 @@ +if (!this.hasOwnProperty("SIMD")) + quit(); + +function booleanBinaryX4(op, v, w) { + var arr = []; + var [varr, warr] = [simdToArray(v), simdToArray(w)]; + for (var i = 0; i < 4; i++) + arr[i] = op(varr[i], warr[i]); + return arr; +} + +function binaryX(op, v, w) { + var arr = []; + var [varr, warr] = [simdToArray(v), simdToArray(w)]; + [varr, warr] = [varr.map(Math.fround), warr.map(Math.fround)]; + for (var i = 0; i < varr.length; i++) + arr[i] = op(varr[i], warr[i]); + return arr.map(Math.fround); +} + +function unaryX4(op, v, coerceFunc) { + var arr = []; + var varr = simdToArray(v).map(coerceFunc); + for (var i = 0; i < 4; i++) + arr[i] = op(varr[i]); + return arr.map(coerceFunc); +} + +function assertNear(a, b) { + assertEq((a != a && b != b) || Math.abs(a - b) < 0.001, true); +} + +function GetType(v) { + var pt = Object.getPrototypeOf(v); + switch (pt) { + case SIMD.Int8x16.prototype: return SIMD.Int8x16; + case SIMD.Int16x8.prototype: return SIMD.Int16x8; + case SIMD.Int32x4.prototype: return SIMD.Int32x4; + case SIMD.Uint8x16.prototype: return SIMD.Uint8x16; + case SIMD.Uint16x8.prototype: return SIMD.Uint16x8; + case SIMD.Uint32x4.prototype: return SIMD.Uint32x4; + case SIMD.Float32x4.prototype: return SIMD.Float32x4; + case SIMD.Bool8x16.prototype: return SIMD.Bool8x16; + case SIMD.Bool16x8.prototype: return SIMD.Bool16x8; + case SIMD.Bool32x4.prototype: return SIMD.Bool32x4; + } + throw "unexpected SIMD type"; +} + +function GetLength(t) { + switch (t) { + case SIMD.Int8x16: return 16; + case SIMD.Int16x8: return 8; + case SIMD.Int32x4: return 4; + case SIMD.Uint8x16: return 16; + case SIMD.Uint16x8: return 8; + case SIMD.Uint32x4: return 4; + case SIMD.Float32x4: return 4; + case SIMD.Bool8x16: return 16; + case SIMD.Bool16x8: return 8; + case SIMD.Bool32x4: return 4; + } + throw "unexpected SIMD type"; +} + +function assertEqVec(v, w) { + var typeV = GetType(v); + var lengthV = GetLength(typeV); + var ext = typeV.extractLane; + assertEq(GetType(w), typeV); + for (var i = 0; i < lengthV; i++) + assertEq(ext(v, i), ext(w, i)); +} + +function assertEqVecArr(v, w) { + var typeV = GetType(v); + var lengthV = GetLength(typeV); + var ext = typeV.extractLane; + assertEq(w.length, lengthV); + + for (var i = 0; i < lengthV; i++) + assertEq(ext(v, i), w[i]); +} + +function assertEqX4(vec, arr, ...opts) { + + var assertFunc; + if (opts.length == 1 && typeof opts[0] !== 'undefined') { + assertFunc = opts[0]; + } else { + assertFunc = assertEq; + } + + var Type = GetType(vec); + + assertFunc(Type.extractLane(vec, 0), arr[0]); + assertFunc(Type.extractLane(vec, 1), arr[1]); + assertFunc(Type.extractLane(vec, 2), arr[2]); + assertFunc(Type.extractLane(vec, 3), arr[3]); +} + +function simdToArray(vec) { + var Type = GetType(vec); + var Length = GetLength(Type); + var a = []; + for (var i = 0; i < Length; i++) + a.push(Type.extractLane(vec, i)); + return a; +} |