Source code

Revision control

Copy as Markdown

Other Tools

// |jit-test| skip-if: !wasmSimdEnabled()
// Cloned from ad-hack.js but kept separate because it may have to be disabled
// on some devices until bugs are fixed.
// Bug 1666747 - partially OOB stores are not handled correctly on ARM and ARM64.
// The simulators don't implement the correct semantics anyhow, so when the bug
// is fixed in the code generator they must remain excluded here.
if (getBuildConfiguration("arm64") || getBuildConfiguration("arm64-simulator") ||
getBuildConfiguration("arm") || getBuildConfiguration("arm-simulator")) {
quit(0);
}
function get(arr, loc, len) {
let res = [];
for ( let i=0; i < len; i++ ) {
res.push(arr[loc+i]);
}
return res;
}
for ( let offset of iota(16) ) {
var ins = wasmEvalText(`
(module
(memory (export "mem") 1 1)
(func (export "f") (param $loc i32)
(v128.store offset=${offset} (local.get $loc) (v128.const i32x4 ${1+offset} 2 3 ${4+offset*2}))))`);
// OOB write should trap
assertErrorMessage(() => ins.exports.f(65536-15),
WebAssembly.RuntimeError,
/index out of bounds/)
// Ensure that OOB writes don't write anything.
let start = 65536 - 15 + offset;
let legalBytes = 65536 - start;
var mem8 = new Uint8Array(ins.exports.mem.buffer);
assertSame(get(mem8, start, legalBytes), iota(legalBytes).map((_) => 0));
}