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