blob: 4bd2f9aed4a3e4f65d4aa49221197ef46238b186 [file] [log] [blame]
//-------------------------------------------------------------------------------------------------------
// Copyright (C) Microsoft Corporation and contributors. All rights reserved.
// Licensed under the MIT license. See LICENSE.txt file in the project root for full license information.
//-------------------------------------------------------------------------------------------------------
var DEBUG = false;
function sameValue(x, y) {
if (x == y)
{
return x != 0 || y != 0 || (1/x == 1/y); // 0.0 != -0.0
}
return (x != x) && (y != y); // NaN == NaN
}
function equal(ev, v) {
var eps = 0.000001;
if (sameValue(ev, v))
{
if(DEBUG) WScript.Echo("same value");
return true;
}
else if ((ev == 0.0 || v == 0.0) && Math.abs(v - ev) <= eps) // -0.0 covered here
{
if(DEBUG) WScript.Echo("Float 0.0 ");
return true;
}
else if (Math.abs(v - ev) / Math.abs(ev) <= eps)
{
if(DEBUG) WScript.Echo("Float values within eps");
return true;
}
else
{
WScript.Echo(">> Fail!");
WScript.Echo("Expected "+ev+" Found "+v);
return false;
}
}
function equalSimd(values, simdValue, type, msg)
{ var ok = true;
length = getLength(type);
if (Array.isArray(values))
{
for ( var i = 0; i < length; i ++)
{
if(!equal(values[i],type.extractLane(simdValue, i)))
{
ok = false;
}
}
if (ok)
return;
else
{
WScript.Echo(">> Fail!!");
if (msg !== undefined)
{
WScript.Echo(msg);
}
printSimd(simdValue, type);
}
}
else
{
type.check(values);
for ( var i = 0; i < length; i ++)
{
if(!equal(type.extractLane(values, i),type.extractLane(simdValue, i)))
{
ok = false;
}
}
if (ok)
return;
else
{
WScript.Echo(">> Fail!!");
if (msg !== undefined)
{
WScript.Echo(msg);
}
printSimd(simdValue, type);
}
}
}
function printSimd(simdValue, type)
{
var length;
var vals = "";
length = getLength(type);
for (var i = 0; i < length; i ++)
{
vals += type.extractLane(simdValue,i);
if (i < length - 1)
vals += ", "
}
WScript.Echo(type.toString() + "(" + vals + ")");
}
function printSimdBaseline(simdValue, typeName, varName, msg)
{
var length;
var vals = "";
if (typeName === "SIMD.Float32x4")
{
type = SIMD.Float32x4;
}
else if (typeName === "SIMD.Int32x4")
{
type = SIMD.Int32x4;
}
else if (typeName === "SIMD.Int16x8")
{
type = SIMD.Int16x8;
}
else if (typeName === "SIMD.Int8x16")
{
type = SIMD.Int8x16;
}
else if (typeName === "SIMD.Uint32x4")
{
type = SIMD.Uint32x4;
}
else if (typeName === "SIMD.Uint16x8")
{
type = SIMD.Uint16x8;
}
else if (typeName === "SIMD.Uint8x16")
{
type = SIMD.Uint8x16;
}
else if (typeName === "SIMD.Bool32x4")
{
type = SIMD.Bool32x4;
}
else if (typeName === "SIMD.Bool16x8")
{
type = SIMD.Bool16x8;
}
else if (typeName === "SIMD.Bool8x16")
{
type = SIMD.Bool8x16;
}
else
{
throw "Unsupported type";
}
length = getLength(type);
for (var i = 0; i < length; i ++)
{
vals += type.extractLane(simdValue,i);
if (i < length - 1)
vals += ", "
}
print("equalSimd([" + vals + "], " + varName + ", " + typeName + ", \"" + msg + "\")");
}
function getLength(type)
{
var length;
switch (type)
{
case SIMD.Float32x4:
case SIMD.Int32x4:
case SIMD.Uint32x4:
case SIMD.Bool32x4:
length = 4;
break;
case SIMD.Int16x8:
case SIMD.Uint16x8:
case SIMD.Bool16x8:
length = 8;
break;
case SIMD.Int8x16:
case SIMD.Uint8x16:
case SIMD.Bool8x16:
length = 16;
break;
default:
throw "Undefined type";
}
return length;
}