// |reftest| skip-if(!this.hasOwnProperty("SIMD"))
var Float64x2 = SIMD.Float64x2;

/*
 * Any copyright is dedicated to the Public Domain.
 * https://creativecommons.org/publicdomain/zero/1.0/
 */

function add(a, b) { return a + b; }
function sub(a, b) { return a - b; }
function mul(a, b) { return a * b; }
function div(a, b) { return a / b; }
function neg(a) { return -a; }
function reciprocalApproximation(a) { return 1 / a; }
function reciprocalSqrtApproximation(a) { return 1 / Math.sqrt(a); }

function testAdd(v, w) {
    return testBinaryFunc(v, w, Float64x2.add, add);
}
function testSub(v, w) {
    return testBinaryFunc(v, w, Float64x2.sub, sub);
}
function testMul(v, w) {
    return testBinaryFunc(v, w, Float64x2.mul, mul);
}
function testDiv(v, w) {
    return testBinaryFunc(v, w, Float64x2.div, div);
}
function testAbs(v) {
    return testUnaryFunc(v, Float64x2.abs, Math.abs);
}
function testNeg(v) {
    return testUnaryFunc(v, Float64x2.neg, neg);
}
function testReciprocalApproximation(v) {
    return testUnaryFunc(v, Float64x2.reciprocalApproximation, reciprocalApproximation);
}
function testReciprocalSqrtApproximation(v) {
    return testUnaryFunc(v, Float64x2.reciprocalSqrtApproximation, reciprocalSqrtApproximation);
}
function testSqrt(v) {
    return testUnaryFunc(v, Float64x2.sqrt, Math.sqrt);
}

function test() {
  var v, w;
  for ([v, w] of [[Float64x2(1, 2), Float64x2(3, 4)],
                  [Float64x2(1.894, 2.8909), Float64x2(100.764, 200.987)],
                  [Float64x2(-1, -2), Float64x2(-14.54, 57)],
                  [Float64x2(+Infinity, -Infinity), Float64x2(NaN, -0)],
                  [Float64x2(Math.pow(2, 31), Math.pow(2, -31)), Float64x2(Math.pow(2, -1047), Math.pow(2, -149))]])
  {
      testAdd(v, w);
      testSub(v, w);
      testMul(v, w);
      testDiv(v, w);
      testAbs(v);
      testNeg(v);
      testReciprocalApproximation(v);
      testSqrt(v);
      testReciprocalSqrtApproximation(v);
  }

  if (typeof reportCompare === "function")
    reportCompare(true, true);
}

test();