Source code
Revision control
Copy as Markdown
Other Tools
// Int64 always in range of Int32. No Int64ToBigIntPtr bailout on 32- and 64-bit.
function i64InI32Range() {
var ta = new BigInt64Array([
-0x8000_0000n,
-0x7fff_ffffn,
-2n,
-1n,
0n,
1n,
2n,
0x7fff_fffen,
0x7fff_ffffn,
]);
// Add operation to trigger BigIntPtr code path. Don't use constant 0n to
// ensure compiler doesn't optimize away the addition.
var zero = new BigInt64Array([
0n, 0n,
]);
var N = 200;
for (var i = 0; i < N; ++i) {
var x = ta[i % ta.length];
var y = zero[i & 1];
var z = x + y;
assertEq(z, x);
}
}
for (var i = 0; i < 2; ++i) i64InI32Range();
// Int64 not in range of Int32. Int64ToBigIntPtr bailout on 32-bit.
function i64NotInI32RangeBailout() {
var ta = new BigInt64Array([
// Ensure not interpreted as signed Int32 value.
0x8000_0000n,
-0x8000_0000n,
-0x7fff_ffffn,
-2n,
-1n,
0n,
1n,
2n,
0x7fff_fffen,
0x7fff_ffffn,
]);
// Add operation to trigger BigIntPtr code path. Don't use constant 0n to
// ensure compiler doesn't optimize away the addition.
var zero = new BigInt64Array([
0n, 0n,
]);
var N = 200;
for (var i = 0; i <= N; ++i) {
// Use index zero when |i == N|, but make sure all code paths are always
// executed to ensure there are no cold path bailouts.
var index = ((1 + (i % (ta.length - 1))) * (i < N))|0;
var x = ta[index];
var y = zero[i & 1];
var z = x + y;
assertEq(z, x);
}
assertEq(index, 0);
assertEq(x, 0x8000_0000n);
}
for (var i = 0; i < 2; ++i) i64NotInI32RangeBailout();
// Int64 not in range of Int32. Int64ToBigIntPtr bailout on 32-bit.
function i64NotInI32RangeBailout2() {
var ta = new BigInt64Array([
0x8000_0000_0000_0000n,
-0x8000_0000n,
-0x7fff_ffffn,
-2n,
-1n,
0n,
1n,
2n,
0x7fff_fffen,
0x7fff_ffffn,
]);
// Add operation to trigger BigIntPtr code path. Don't use constant 0n to
// ensure compiler doesn't optimize away the addition.
var zero = new BigInt64Array([
0n, 0n,
]);
var N = 200;
for (var i = 0; i <= N; ++i) {
// Use index zero when |i == N|, but make sure all code paths are always
// executed to ensure there are no cold path bailouts.
var index = ((1 + (i % (ta.length - 1))) * (i < N))|0;
var x = ta[index];
var y = zero[i & 1];
var z = x + y;
assertEq(z, x);
}
assertEq(index, 0);
assertEq(x, -0x8000_0000_0000_0000n);
}
for (var i = 0; i < 2; ++i) i64NotInI32RangeBailout2();
// UInt64 always in range of Int32. No Int64ToBigIntPtr bailout on 32- and 64-bit.
function u64InI32Range() {
var ta = new BigUint64Array([
0n,
1n,
2n,
0x7fff_fffen,
0x7fff_ffffn,
]);
// Add operation to trigger BigIntPtr code path. Don't use constant 0n to
// ensure compiler doesn't optimize away the addition.
var zero = new BigUint64Array([
0n, 0n,
]);
var N = 200;
for (var i = 0; i < N; ++i) {
var x = ta[i % ta.length];
var y = zero[i & 1];
var z = x + y;
assertEq(z, x);
}
}
for (var i = 0; i < 2; ++i) u64InI32Range();
// UInt64 not in range of Int32. Int64ToBigIntPtr bailout on 32-bit.
function u64NotInI32RangeBailout() {
var ta = new BigUint64Array([
0x8000_0000n,
0n,
1n,
2n,
0x7fff_fffen,
0x7fff_ffffn,
]);
// Add operation to trigger BigIntPtr code path. Don't use constant 0n to
// ensure compiler doesn't optimize away the addition.
var zero = new BigUint64Array([
0n, 0n,
]);
var N = 200;
for (var i = 0; i <= N; ++i) {
// Use index zero when |i == N|, but make sure all code paths are always
// executed to ensure there are no cold path bailouts.
var index = ((1 + (i % (ta.length - 1))) * (i < N))|0;
var x = ta[index];
var y = zero[i & 1];
var z = x + y;
assertEq(z, x);
}
assertEq(index, 0);
assertEq(x, 0x8000_0000n);
}
for (var i = 0; i < 2; ++i) u64NotInI32RangeBailout();
// UInt64 not in range of Int64. Int64ToBigIntPtr bailout on 32- and 64-bit.
function u64NotInI64RangeBailout() {
var ta = new BigUint64Array([
0x8000_0000_0000_0000n,
0n,
1n,
2n,
0x7fff_fffen,
0x7fff_ffffn,
]);
// Add operation to trigger BigIntPtr code path. Don't use constant 0n to
// ensure compiler doesn't optimize away the addition.
var zero = new BigUint64Array([
0n, 0n,
]);
var N = 200;
for (var i = 0; i <= N; ++i) {
// Use index zero when |i == N|, but make sure all code paths are always
// executed to ensure there are no cold path bailouts.
var index = ((1 + (i % (ta.length - 1))) * (i < N))|0;
var x = ta[index];
var y = zero[i & 1];
var z = x + y;
assertEq(z, x);
}
assertEq(index, 0);
assertEq(x, 0x8000_0000_0000_0000n);
}
for (var i = 0; i < 2; ++i) u64NotInI64RangeBailout();