// NOT YET SUPPORTED DUE TO MISSING SIMD OP CODE IMPLS in v8:
// https://github.com/WebAssembly/simd/blob/master/proposals/simd/ImplementationStatus.md

// @ts-ignore: decorator
@inline
function addm_64x2(x: v128, y: v128, n: f64): v128 {
    return f64x2.mul(x, f64x2.add(y, f64x2.splat(n)));
}

// @ts-ignore: decorator
@inline
function fastexp9_64x2(ptr: usize): v128 {
    let x = v128.load(ptr);
    let y = addm_64x2(x, x, 9.0);
    y = addm_64x2(x, y, 72.0);
    y = addm_64x2(x, y, 504.0);
    y = addm_64x2(x, y, 3024.0);
    y = addm_64x2(x, y, 15120.0);
    y = addm_64x2(x, y, 60480.0);
    y = addm_64x2(x, y, 181440.0);
    y = addm_64x2(x, y, 362880.0);
    y = addm_64x2(x, y, 362880.0);
    return f64x2.mul(y, f64x2.splat(2.75573192e-6));
}

// @ts-ignore: decorator
@inline
function sigmoid_64x2(x: usize): v128 {
    const one = f64x2.splat(1.0);
    return f64x2.div(one, f64x2.add(one, fastexp9_64x2(-x)));
}

export function sigmoid_64x2_ptr(out: usize, src: usize, n: usize): usize {
    const res = out;
    n >>= 1;
    while (n-- > 0) {
        v128.store(out, sigmoid_64x2(src));
        out += sizeof<v128>();
        src += sizeof<v128>();
    }
    return res;
}