Source code

Revision control

Copy as Markdown

Other Tools

// |jit-test| --ion-limit-script-size=off
setJitCompilerOption("baseline.warmup.trigger", 9);
setJitCompilerOption("ion.warmup.trigger", 20);
// Prevent GC from cancelling/discarding Ion compilations.
gczeal(0);
var max = 200;
// Check that we are able to remove the operation inside recover test functions
// (denoted by "rop..."), when we inline the first version of uceFault, and
// ensure that the bailout is correct when uceFault is replaced (which cause an
// invalidation bailout).
var uceFault = function (i) {
if (i > 98) {
uceFault = function (i) { return true; };
}
return false;
};
let i64 = new BigInt64Array(100);
for (let i = 0; i < i64.length; ++i) {
i64[i] = 0x8000_0000_0000_0000n + BigInt(i);
}
let u64 = new BigUint64Array(i64.length);
u64.set(i64);
let dv = new DataView(i64.buffer);
let uceFault_rint64tobigint_i64_load = eval(`(${uceFault})`.replace('uceFault', 'uceFault_rint64tobigint_i64_load'));
function rint64tobigint_i64_load(i) {
var y = i64[i];
if (uceFault_rint64tobigint_i64_load(i) || uceFault_rint64tobigint_i64_load(i))
assertEq(y, -0x7fff_ffff_ffff_ff9dn);
assertRecoveredOnBailout(y, true);
return i;
}
let uceFault_rint64tobigint_u64_load = eval(`(${uceFault})`.replace('uceFault', 'uceFault_rint64tobigint_u64_load'));
function rint64tobigint_u64_load(i) {
var y = u64[i];
if (uceFault_rint64tobigint_u64_load(i) || uceFault_rint64tobigint_u64_load(i))
assertEq(y, 0x8000_0000_0000_0063n);
assertRecoveredOnBailout(y, true);
return i;
}
let uceFault_rint64tobigint_i64_dataview = eval(`(${uceFault})`.replace('uceFault', 'uceFault_rint64tobigint_i64_dataview'));
function rint64tobigint_i64_dataview(i) {
var y = dv.getBigInt64(i * 8, true);
if (uceFault_rint64tobigint_i64_dataview(i) || uceFault_rint64tobigint_i64_dataview(i))
assertEq(y, -0x7fff_ffff_ffff_ff9dn);
assertRecoveredOnBailout(y, true);
return i;
}
let uceFault_rint64tobigint_u64_dataview = eval(`(${uceFault})`.replace('uceFault', 'uceFault_rint64tobigint_u64_dataview'));
function rint64tobigint_u64_dataview(i) {
var y = dv.getBigUint64(i * 8, true);
if (uceFault_rint64tobigint_u64_dataview(i) || uceFault_rint64tobigint_u64_dataview(i))
assertEq(y, 0x8000_0000_0000_0063n);
assertRecoveredOnBailout(y, true);
return i;
}
let uceFault_rint64tobigint_i64_atomics_load = eval(`(${uceFault})`.replace('uceFault', 'uceFault_rint64tobigint_i64_atomics_load'));
function rint64tobigint_i64_atomics_load(i) {
var y = Atomics.load(i64, i);
if (uceFault_rint64tobigint_i64_atomics_load(i) || uceFault_rint64tobigint_i64_atomics_load(i))
assertEq(y, -0x7fff_ffff_ffff_ff9dn);
assertRecoveredOnBailout(y, true);
return i;
}
let uceFault_rint64tobigint_u64_atomics_load = eval(`(${uceFault})`.replace('uceFault', 'uceFault_rint64tobigint_u64_atomics_load'));
function rint64tobigint_u64_atomics_load(i) {
var y = Atomics.load(u64, i);
if (uceFault_rint64tobigint_u64_atomics_load(i) || uceFault_rint64tobigint_u64_atomics_load(i))
assertEq(y, 0x8000_0000_0000_0063n);
assertRecoveredOnBailout(y, true);
return i;
}
let uceFault_rint64tobigint_i64_atomics_and = eval(`(${uceFault})`.replace('uceFault', 'uceFault_rint64tobigint_i64_atomics_and'));
function rint64tobigint_i64_atomics_and(i) {
var y = Atomics.and(i64, i, -1n);
if (uceFault_rint64tobigint_i64_atomics_and(i) || uceFault_rint64tobigint_i64_atomics_and(i))
assertEq(y, -0x7fff_ffff_ffff_ff9dn);
assertRecoveredOnBailout(y, true);
return i;
}
let uceFault_rint64tobigint_u64_atomics_and = eval(`(${uceFault})`.replace('uceFault', 'uceFault_rint64tobigint_u64_atomics_and'));
function rint64tobigint_u64_atomics_and(i) {
var y = Atomics.and(u64, i, -1n);
if (uceFault_rint64tobigint_u64_atomics_and(i) || uceFault_rint64tobigint_u64_atomics_and(i))
assertEq(y, 0x8000_0000_0000_0063n);
assertRecoveredOnBailout(y, true);
return i;
}
let uceFault_rint64tobigint_i64_atomics_cmpxchg = eval(`(${uceFault})`.replace('uceFault', 'uceFault_rint64tobigint_i64_atomics_cmpxchg'));
function rint64tobigint_i64_atomics_cmpxchg(i) {
var y = Atomics.compareExchange(i64, i, -1n, 0n);
if (uceFault_rint64tobigint_i64_atomics_cmpxchg(i) || uceFault_rint64tobigint_i64_atomics_cmpxchg(i))
assertEq(y, -0x7fff_ffff_ffff_ff9dn);
assertRecoveredOnBailout(y, true);
return i;
}
let uceFault_rint64tobigint_u64_atomics_cmpxchg = eval(`(${uceFault})`.replace('uceFault', 'uceFault_rint64tobigint_u64_atomics_cmpxchg'));
function rint64tobigint_u64_atomics_cmpxchg(i) {
var y = Atomics.compareExchange(u64, i, -1n, 0n);
if (uceFault_rint64tobigint_u64_atomics_cmpxchg(i) || uceFault_rint64tobigint_u64_atomics_cmpxchg(i))
assertEq(y, 0x8000_0000_0000_0063n);
assertRecoveredOnBailout(y, true);
return i;
}
let uceFault_rint64tobigint_i64_atomics_xchg = eval(`(${uceFault})`.replace('uceFault', 'uceFault_rint64tobigint_i64_atomics_xchg'));
function rint64tobigint_i64_atomics_xchg(i) {
var y = Atomics.exchange(i64, i, -1n);
if (uceFault_rint64tobigint_i64_atomics_xchg(i) || uceFault_rint64tobigint_i64_atomics_xchg(i))
assertEq(y, -0x7fff_ffff_ffff_ff9dn);
assertRecoveredOnBailout(y, true);
return i;
}
let uceFault_rint64tobigint_u64_atomics_xchg = eval(`(${uceFault})`.replace('uceFault', 'uceFault_rint64tobigint_u64_atomics_xchg'));
function rint64tobigint_u64_atomics_xchg(i) {
var y = Atomics.exchange(u64, i, -1n);
if (uceFault_rint64tobigint_u64_atomics_xchg(i) || uceFault_rint64tobigint_u64_atomics_xchg(i))
assertEq(y, 0x8000_0000_0000_0063n);
assertRecoveredOnBailout(y, true);
return i;
}
for (let j = 100 - max; j < 100; j++) {
with({}){} // Do not Ion-compile this loop.
let i = j < 2 ? (Math.abs(j) % 50) + 2 : j;
rint64tobigint_i64_load(i);
rint64tobigint_u64_load(i);
rint64tobigint_i64_dataview(i);
rint64tobigint_u64_dataview(i);
rint64tobigint_i64_atomics_load(i);
rint64tobigint_u64_atomics_load(i);
rint64tobigint_i64_atomics_and(i);
rint64tobigint_u64_atomics_and(i);
rint64tobigint_i64_atomics_cmpxchg(i);
rint64tobigint_u64_atomics_cmpxchg(i);
rint64tobigint_i64_atomics_xchg(i);
rint64tobigint_u64_atomics_xchg(i);
}