summaryrefslogtreecommitdiffstats
path: root/js/src/jit-test/tests/asm.js/testBug1155176.js
blob: 80c6f631457b4e21242689911b9efe871851b6cb (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
40
41
42
43
44
45
46
47
48
49
50
51
52
if (!this.SharedArrayBuffer || !isAsmJSCompilationAvailable())
    quit(0);

load(libdir + "asm.js");
setJitCompilerOption('asmjs.atomics.enable', 1);

// The way this is constructed, either the first module does not
// verify as asm.js (if the >>>0 is left off, which was legal prior to
// bug 1155176), or the results of the two modules have to be equal.

var m = asmCompile("stdlib", "ffi", "heap", `
    "use asm";

    var view = new stdlib.Uint32Array(heap);
    var cas = stdlib.Atomics.compareExchange;
    var hi = ffi.hi;

    function run() {
	hi(+(cas(view, 37, 0, 0)>>>0));
    }

    return run;
`);

assertEq(isAsmJSModule(m), true);

function nonm(stdlib, ffi, heap) {

    var view = new stdlib.Uint32Array(heap);
    var cas = stdlib.Atomics.compareExchange;
    var hi = ffi.hi;

    function run() {
	hi(+cas(view, 37, 0, 0));
    }

    return run;
}

var sab = new SharedArrayBuffer(65536);
var ua = new Uint32Array(sab);
var results = [];
var mrun = m(this, {hi: function (x) { results.push(x) }}, sab);
var nonmrun = nonm(this, {hi: function (x) { results.push(x) }}, sab);

ua[37] = 0x80000001;

mrun();
nonmrun();

assertEq(results[0], ua[37]);
assertEq(results[0], results[1]);