Source code
Revision control
Copy as Markdown
Other Tools
// |jit-test| --fast-warmup; --no-threads
function makeRotate(n) {
return new Function("i", "cond", `
let x = i >>> ${n} | i << ${32-n};
if (cond) return x + 1;
return 0;
`);
}
function correct(n, i) {
let a = i >>> n | i << (32-n);
return a + 1;
}
function test(n) {
let rotate = makeRotate(n);
for (var i = 0; i < 100; i++) {
assertEq(rotate(i, false), 0);
}
assertEq(rotate(1, true), correct(n, 1));
}
for (var n = -2; n < 40; n++) {
test(n)
}
function maybeOverflow(value, flag) {
let sum = value + 1;
let rotated = (sum >>> 1) | (sum << 31);
if (flag) return rotated + 1;
return 0;
}
for (let iteration = 0; iteration < 100; iteration++) {
assertEq(maybeOverflow(iteration, false), 0);
}
assertEq(maybeOverflow(2147483647, true), 1073741825);