if (!this.Atomics)
    quit();

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

var code = `
    "use asm";

    var HEAP32 = new stdlib.Int32Array(heap);
    var add = stdlib.Atomics.add;
    var load = stdlib.Atomics.load;
    var _emscripten_asm_const_int=ffi._emscripten_asm_const_int;

    // Regression test for bug 1154858 - Atomics.add for effect did
    // not get compiled properly because of an assembler bug.  This
    // kernel is derived from the large test case in that bug.

    function add_sharedEv(i1) {
        i1 = i1 | 0;
        var i2 = 0;
        var xx = 0;
        i2 = i1 + 4 | 0;
        i1 = load(HEAP32, i2 >> 2) | 0;
        _emscripten_asm_const_int(7, i2 | 0, i1 | 0) | 0;
        add(HEAP32, i2 >> 2, 1) | 0;
        _emscripten_asm_const_int(8, i2 | 0, load(HEAP32, i2 >> 2) | 0, i1 + 1 | 0) | 0;
        return xx|0;
    }

    return {add_sharedEv:add_sharedEv};
`;

var x;

var sab = new SharedArrayBuffer(65536);
var ffi =
    { _emscripten_asm_const_int:
        function (...rest) {
            //print("OUT: " + rest.join(" "));
            if (rest[0] == 8)
                x = rest[2];
        }
    };
var m = asmCompile('stdlib', 'ffi', 'heap', code);
var {add_sharedEv} = asmLink(m, this, ffi, sab);
add_sharedEv(13812);

assertEq(x, 1);
