blob: d5814ff7fae91024d6e7ae5c724b857e320e34ef [file] [log] [blame]
if (!this.hasOwnProperty("SIMD"))
quit();
function binaryX4(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 < 4; 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.Int32x4.prototype: return SIMD.Int32x4;
case SIMD.Float32x4.prototype: return SIMD.Float32x4;
}
throw "unexpected SIMD type";
}
function assertEqVec(v, w) {
var typeV = GetType(v);
var ext = typeV.extractLane;
assertEq(GetType(w), typeV);
if (typeV === SIMD.Int32x4 || typeV === SIMD.Float32x4) {
[0, 1, 2, 3].forEach((i) => assertEq(ext(v, i), ext(w, i)));
return;
}
}
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);
if (Type === SIMD.Int32x4) {
assertFunc(SIMD.Int32x4.extractLane(vec, 0), arr[0]);
assertFunc(SIMD.Int32x4.extractLane(vec, 1), arr[1]);
assertFunc(SIMD.Int32x4.extractLane(vec, 2), arr[2]);
assertFunc(SIMD.Int32x4.extractLane(vec, 3), arr[3]);
return;
}
if (Type === SIMD.Float32x4) {
assertFunc(SIMD.Float32x4.extractLane(vec, 0), arr[0]);
assertFunc(SIMD.Float32x4.extractLane(vec, 1), arr[1]);
assertFunc(SIMD.Float32x4.extractLane(vec, 2), arr[2]);
assertFunc(SIMD.Float32x4.extractLane(vec, 3), arr[3]);
return;
}
throw "unexpected SIMD type";
}
function simdToArray(vec) {
var Type = GetType(vec);
if (Type === SIMD.Int32x4) {
return [
SIMD.Int32x4.extractLane(vec, 0),
SIMD.Int32x4.extractLane(vec, 1),
SIMD.Int32x4.extractLane(vec, 2),
SIMD.Int32x4.extractLane(vec, 3),
];
}
if (Type === SIMD.Float32x4) {
return [
SIMD.Float32x4.extractLane(vec, 0),
SIMD.Float32x4.extractLane(vec, 1),
SIMD.Float32x4.extractLane(vec, 2),
SIMD.Float32x4.extractLane(vec, 3),
];
}
throw "unexpected SIMD type";
}