Source code
Revision control
Copy as Markdown
Other Tools
// |jit-test| --canonicalize-nan-at-uses=on
load(libdir + "nans.js");
// Math.hypot with 3 arguments.
testWithFloatTypedArrays((FloatArray, UintArray, NaNs) => {
var f = new FloatArray(2);
var u = new UintArray(f.buffer);
for (var i = 0; i < 100; ++i) {
u[0] = NaNs[i % NaNs.length];
var x = Math.hypot(f[0], f[0], f[0]);
// Store possibly tainted value.
f[1] = x;
assertEq(f[1], NaN);
assertEq(x, NaN);
assertSameNaNPayload(FloatArray, u[0], u[1]);
}
for (var i = 0; i < 100; ++i) {
u[0] = NaNs[i % NaNs.length];
// With constant non-NaN operand.
var x = Math.hypot(0, f[0], f[0]);
// Store possibly tainted value.
f[1] = x;
assertEq(f[1], NaN);
assertEq(x, NaN);
assertSameNaNPayload(FloatArray, u[0], u[1]);
}
for (var i = 0; i < 100; ++i) {
u[0] = NaNs[i % NaNs.length];
// With constant NaN operand.
var x = Math.hypot(NaN, f[0], f[0]);
// Store possibly tainted value.
f[1] = x;
assertEq(f[1], NaN);
assertEq(x, NaN);
assertSameNaNPayload(FloatArray, u[0], u[1]);
}
});
// Math.hypot with 4 arguments.
testWithFloatTypedArrays((FloatArray, UintArray, NaNs) => {
var f = new FloatArray(2);
var u = new UintArray(f.buffer);
for (var i = 0; i < 100; ++i) {
u[0] = NaNs[i % NaNs.length];
var x = Math.hypot(f[0], f[0], f[0], f[0]);
// Store possibly tainted value.
f[1] = x;
assertEq(f[1], NaN);
assertEq(x, NaN);
assertSameNaNPayload(FloatArray, u[0], u[1]);
}
for (var i = 0; i < 100; ++i) {
u[0] = NaNs[i % NaNs.length];
// With constant non-NaN operand.
var x = Math.hypot(0, f[0], f[0], f[0]);
// Store possibly tainted value.
f[1] = x;
assertEq(f[1], NaN);
assertEq(x, NaN);
assertSameNaNPayload(FloatArray, u[0], u[1]);
}
for (var i = 0; i < 100; ++i) {
u[0] = NaNs[i % NaNs.length];
// With constant NaN operand.
var x = Math.hypot(NaN, f[0], f[0], f[0]);
// Store possibly tainted value.
f[1] = x;
assertEq(f[1], NaN);
assertEq(x, NaN);
assertSameNaNPayload(FloatArray, u[0], u[1]);
}
});