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";
}
