summaryrefslogtreecommitdiffstats
path: root/js/src/jit-test/tests/wasm/simd/simd-partial-oob-store.js
blob: 94a903484887db186e7cc38d1d44cfbd125d3fe6 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
// |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));
}