summaryrefslogtreecommitdiffstats
path: root/js/src/jit-test/tests/asm.js/testBug1155176.js
diff options
context:
space:
mode:
Diffstat (limited to 'js/src/jit-test/tests/asm.js/testBug1155176.js')
-rw-r--r--js/src/jit-test/tests/asm.js/testBug1155176.js52
1 files changed, 52 insertions, 0 deletions
diff --git a/js/src/jit-test/tests/asm.js/testBug1155176.js b/js/src/jit-test/tests/asm.js/testBug1155176.js
new file mode 100644
index 000000000..80c6f6314
--- /dev/null
+++ b/js/src/jit-test/tests/asm.js/testBug1155176.js
@@ -0,0 +1,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]);