| if (!this.SharedArrayBuffer || !isAsmJSCompilationAvailable()) |
| quit(0); |
| |
| // 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. |
| |
| function m(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]); |