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]);
|