summaryrefslogtreecommitdiff
path: root/test
diff options
context:
space:
mode:
Diffstat (limited to 'test')
-rw-r--r--test/dump/atomic.txt333
-rw-r--r--test/interp/atomic-load.txt54
-rw-r--r--test/interp/atomic-rmw-add.txt110
-rw-r--r--test/interp/atomic-rmw-and.txt110
-rw-r--r--test/interp/atomic-rmw-cmpxchg.txt180
-rw-r--r--test/interp/atomic-rmw-or.txt110
-rw-r--r--test/interp/atomic-rmw-sub.txt110
-rw-r--r--test/interp/atomic-rmw-xchg.txt110
-rw-r--r--test/interp/atomic-rmw-xor.txt110
-rw-r--r--test/interp/atomic-store.txt70
-rw-r--r--test/parse/expr/atomic-align.txt77
-rw-r--r--test/parse/expr/atomic-disabled.txt269
-rw-r--r--test/parse/expr/atomic.txt77
-rw-r--r--test/parse/expr/bad-atomic-unnatural-align.txt264
-rw-r--r--test/roundtrip/fold-atomic.txt330
-rwxr-xr-xtest/run-roundtrip.py3
-rw-r--r--test/typecheck/bad-atomic-type-mismatch.txt745
17 files changed, 3062 insertions, 0 deletions
diff --git a/test/dump/atomic.txt b/test/dump/atomic.txt
new file mode 100644
index 00000000..9b2fc0b6
--- /dev/null
+++ b/test/dump/atomic.txt
@@ -0,0 +1,333 @@
+;;; TOOL: run-objdump
+;;; FLAGS: --enable-threads
+
+(module
+ (memory 1)
+ (func
+ i32.const 0 i32.atomic.load drop
+ i32.const 0 i64.atomic.load drop
+ i32.const 0 i32.atomic.load8_u drop
+ i32.const 0 i32.atomic.load16_u drop
+ i32.const 0 i64.atomic.load8_u drop
+ i32.const 0 i64.atomic.load16_u drop
+ i32.const 0 i64.atomic.load32_u drop
+
+ i32.const 0 i32.const 0 i32.atomic.store
+ i32.const 0 i64.const 0 i64.atomic.store
+ i32.const 0 i32.const 0 i32.atomic.store8
+ i32.const 0 i32.const 0 i32.atomic.store16
+ i32.const 0 i64.const 0 i64.atomic.store8
+ i32.const 0 i64.const 0 i64.atomic.store16
+ i32.const 0 i64.const 0 i64.atomic.store32
+
+ i32.const 0 i32.const 0 i32.atomic.rmw.add drop
+ i32.const 0 i64.const 0 i64.atomic.rmw.add drop
+ i32.const 0 i32.const 0 i32.atomic.rmw8_u.add drop
+ i32.const 0 i32.const 0 i32.atomic.rmw16_u.add drop
+ i32.const 0 i64.const 0 i64.atomic.rmw8_u.add drop
+ i32.const 0 i64.const 0 i64.atomic.rmw16_u.add drop
+ i32.const 0 i64.const 0 i64.atomic.rmw32_u.add drop
+
+ i32.const 0 i32.const 0 i32.atomic.rmw.sub drop
+ i32.const 0 i64.const 0 i64.atomic.rmw.sub drop
+ i32.const 0 i32.const 0 i32.atomic.rmw8_u.sub drop
+ i32.const 0 i32.const 0 i32.atomic.rmw16_u.sub drop
+ i32.const 0 i64.const 0 i64.atomic.rmw8_u.sub drop
+ i32.const 0 i64.const 0 i64.atomic.rmw16_u.sub drop
+ i32.const 0 i64.const 0 i64.atomic.rmw32_u.sub drop
+
+ i32.const 0 i32.const 0 i32.atomic.rmw.and drop
+ i32.const 0 i64.const 0 i64.atomic.rmw.and drop
+ i32.const 0 i32.const 0 i32.atomic.rmw8_u.and drop
+ i32.const 0 i32.const 0 i32.atomic.rmw16_u.and drop
+ i32.const 0 i64.const 0 i64.atomic.rmw8_u.and drop
+ i32.const 0 i64.const 0 i64.atomic.rmw16_u.and drop
+ i32.const 0 i64.const 0 i64.atomic.rmw32_u.and drop
+
+ i32.const 0 i32.const 0 i32.atomic.rmw.or drop
+ i32.const 0 i64.const 0 i64.atomic.rmw.or drop
+ i32.const 0 i32.const 0 i32.atomic.rmw8_u.or drop
+ i32.const 0 i32.const 0 i32.atomic.rmw16_u.or drop
+ i32.const 0 i64.const 0 i64.atomic.rmw8_u.or drop
+ i32.const 0 i64.const 0 i64.atomic.rmw16_u.or drop
+ i32.const 0 i64.const 0 i64.atomic.rmw32_u.or drop
+
+ i32.const 0 i32.const 0 i32.atomic.rmw.xor drop
+ i32.const 0 i64.const 0 i64.atomic.rmw.xor drop
+ i32.const 0 i32.const 0 i32.atomic.rmw8_u.xor drop
+ i32.const 0 i32.const 0 i32.atomic.rmw16_u.xor drop
+ i32.const 0 i64.const 0 i64.atomic.rmw8_u.xor drop
+ i32.const 0 i64.const 0 i64.atomic.rmw16_u.xor drop
+ i32.const 0 i64.const 0 i64.atomic.rmw32_u.xor drop
+
+ i32.const 0 i32.const 0 i32.atomic.rmw.xchg drop
+ i32.const 0 i64.const 0 i64.atomic.rmw.xchg drop
+ i32.const 0 i32.const 0 i32.atomic.rmw8_u.xchg drop
+ i32.const 0 i32.const 0 i32.atomic.rmw16_u.xchg drop
+ i32.const 0 i64.const 0 i64.atomic.rmw8_u.xchg drop
+ i32.const 0 i64.const 0 i64.atomic.rmw16_u.xchg drop
+ i32.const 0 i64.const 0 i64.atomic.rmw32_u.xchg drop
+
+ i32.const 0 i32.const 0 i32.const 0 i32.atomic.rmw.cmpxchg drop
+ i32.const 0 i64.const 0 i64.const 0 i64.atomic.rmw.cmpxchg drop
+ i32.const 0 i32.const 0 i32.const 0 i32.atomic.rmw8_u.cmpxchg drop
+ i32.const 0 i32.const 0 i32.const 0 i32.atomic.rmw16_u.cmpxchg drop
+ i32.const 0 i64.const 0 i64.const 0 i64.atomic.rmw8_u.cmpxchg drop
+ i32.const 0 i64.const 0 i64.const 0 i64.atomic.rmw16_u.cmpxchg drop
+ i32.const 0 i64.const 0 i64.const 0 i64.atomic.rmw32_u.cmpxchg drop
+
+))
+(;; STDOUT ;;;
+
+atomic.wasm: file format wasm 0x1
+
+Code Disassembly:
+
+00001b func[0]:
+ 00001e: 41 00 | i32.const 0
+ 000021: fe 10 02 00 | i32.atomic.load 2 0
+ 000024: 1a | drop
+ 000025: 41 00 | i32.const 0
+ 000028: fe 11 03 00 | i64.atomic.load 3 0
+ 00002b: 1a | drop
+ 00002c: 41 00 | i32.const 0
+ 00002f: fe 12 00 00 | i32.atomic.load8_u 0 0
+ 000032: 1a | drop
+ 000033: 41 00 | i32.const 0
+ 000036: fe 13 01 00 | i32.atomic.load16_u 1 0
+ 000039: 1a | drop
+ 00003a: 41 00 | i32.const 0
+ 00003d: fe 14 00 00 | i64.atomic.load8_u 0 0
+ 000040: 1a | drop
+ 000041: 41 00 | i32.const 0
+ 000044: fe 15 01 00 | i64.atomic.load16_u 1 0
+ 000047: 1a | drop
+ 000048: 41 00 | i32.const 0
+ 00004b: fe 16 02 00 | i64.atomic.load32_u 2 0
+ 00004e: 1a | drop
+ 00004f: 41 00 | i32.const 0
+ 000051: 41 00 | i32.const 0
+ 000054: fe 17 02 00 | i32.atomic.store 2 0
+ 000057: 41 00 | i32.const 0
+ 000059: 42 00 | i64.const 0
+ 00005c: fe 18 03 00 | i64.atomic.store 3 0
+ 00005f: 41 00 | i32.const 0
+ 000061: 41 00 | i32.const 0
+ 000064: fe 19 00 00 | i32.atomic.store8 0 0
+ 000067: 41 00 | i32.const 0
+ 000069: 41 00 | i32.const 0
+ 00006c: fe 1a 01 00 | i32.atomic.store16 1 0
+ 00006f: 41 00 | i32.const 0
+ 000071: 42 00 | i64.const 0
+ 000074: fe 1b 00 00 | i64.atomic.store8 0 0
+ 000077: 41 00 | i32.const 0
+ 000079: 42 00 | i64.const 0
+ 00007c: fe 1c 01 00 | i64.atomic.store16 1 0
+ 00007f: 41 00 | i32.const 0
+ 000081: 42 00 | i64.const 0
+ 000084: fe 1d 02 00 | i64.atomic.store32 2 0
+ 000087: 41 00 | i32.const 0
+ 000089: 41 00 | i32.const 0
+ 00008c: fe 1e 02 00 | i32.atomic.rmw.add 2 0
+ 00008f: 1a | drop
+ 000090: 41 00 | i32.const 0
+ 000092: 42 00 | i64.const 0
+ 000095: fe 1f 03 00 | i64.atomic.rmw.add 3 0
+ 000098: 1a | drop
+ 000099: 41 00 | i32.const 0
+ 00009b: 41 00 | i32.const 0
+ 00009e: fe 20 00 00 | i32.atomic.rmw8_u.add 0 0
+ 0000a1: 1a | drop
+ 0000a2: 41 00 | i32.const 0
+ 0000a4: 41 00 | i32.const 0
+ 0000a7: fe 21 01 00 | i32.atomic.rmw16_u.add 1 0
+ 0000aa: 1a | drop
+ 0000ab: 41 00 | i32.const 0
+ 0000ad: 42 00 | i64.const 0
+ 0000b0: fe 22 00 00 | i64.atomic.rmw8_u.add 0 0
+ 0000b3: 1a | drop
+ 0000b4: 41 00 | i32.const 0
+ 0000b6: 42 00 | i64.const 0
+ 0000b9: fe 23 01 00 | i64.atomic.rmw16_u.add 1 0
+ 0000bc: 1a | drop
+ 0000bd: 41 00 | i32.const 0
+ 0000bf: 42 00 | i64.const 0
+ 0000c2: fe 24 02 00 | i64.atomic.rmw32_u.add 2 0
+ 0000c5: 1a | drop
+ 0000c6: 41 00 | i32.const 0
+ 0000c8: 41 00 | i32.const 0
+ 0000cb: fe 25 02 00 | i32.atomic.rmw.sub 2 0
+ 0000ce: 1a | drop
+ 0000cf: 41 00 | i32.const 0
+ 0000d1: 42 00 | i64.const 0
+ 0000d4: fe 26 03 00 | i64.atomic.rmw.sub 3 0
+ 0000d7: 1a | drop
+ 0000d8: 41 00 | i32.const 0
+ 0000da: 41 00 | i32.const 0
+ 0000dd: fe 27 00 00 | i32.atomic.rmw8_u.sub 0 0
+ 0000e0: 1a | drop
+ 0000e1: 41 00 | i32.const 0
+ 0000e3: 41 00 | i32.const 0
+ 0000e6: fe 28 01 00 | i32.atomic.rmw16_u.sub 1 0
+ 0000e9: 1a | drop
+ 0000ea: 41 00 | i32.const 0
+ 0000ec: 42 00 | i64.const 0
+ 0000ef: fe 29 00 00 | i64.atomic.rmw8_u.sub 0 0
+ 0000f2: 1a | drop
+ 0000f3: 41 00 | i32.const 0
+ 0000f5: 42 00 | i64.const 0
+ 0000f8: fe 2a 01 00 | i64.atomic.rmw16_u.sub 1 0
+ 0000fb: 1a | drop
+ 0000fc: 41 00 | i32.const 0
+ 0000fe: 42 00 | i64.const 0
+ 000101: fe 2b 02 00 | i64.atomic.rmw32_u.sub 2 0
+ 000104: 1a | drop
+ 000105: 41 00 | i32.const 0
+ 000107: 41 00 | i32.const 0
+ 00010a: fe 2c 02 00 | i32.atomic.rmw.and 2 0
+ 00010d: 1a | drop
+ 00010e: 41 00 | i32.const 0
+ 000110: 42 00 | i64.const 0
+ 000113: fe 2d 03 00 | i64.atomic.rmw.and 3 0
+ 000116: 1a | drop
+ 000117: 41 00 | i32.const 0
+ 000119: 41 00 | i32.const 0
+ 00011c: fe 2e 00 00 | i32.atomic.rmw8_u.and 0 0
+ 00011f: 1a | drop
+ 000120: 41 00 | i32.const 0
+ 000122: 41 00 | i32.const 0
+ 000125: fe 2f 01 00 | i32.atomic.rmw16_u.and 1 0
+ 000128: 1a | drop
+ 000129: 41 00 | i32.const 0
+ 00012b: 42 00 | i64.const 0
+ 00012e: fe 30 00 00 | i64.atomic.rmw8_u.and 0 0
+ 000131: 1a | drop
+ 000132: 41 00 | i32.const 0
+ 000134: 42 00 | i64.const 0
+ 000137: fe 31 01 00 | i64.atomic.rmw16_u.and 1 0
+ 00013a: 1a | drop
+ 00013b: 41 00 | i32.const 0
+ 00013d: 42 00 | i64.const 0
+ 000140: fe 32 02 00 | i64.atomic.rmw32_u.and 2 0
+ 000143: 1a | drop
+ 000144: 41 00 | i32.const 0
+ 000146: 41 00 | i32.const 0
+ 000149: fe 33 02 00 | i32.atomic.rmw.or 2 0
+ 00014c: 1a | drop
+ 00014d: 41 00 | i32.const 0
+ 00014f: 42 00 | i64.const 0
+ 000152: fe 34 03 00 | i64.atomic.rmw.or 3 0
+ 000155: 1a | drop
+ 000156: 41 00 | i32.const 0
+ 000158: 41 00 | i32.const 0
+ 00015b: fe 35 00 00 | i32.atomic.rmw8_u.or 0 0
+ 00015e: 1a | drop
+ 00015f: 41 00 | i32.const 0
+ 000161: 41 00 | i32.const 0
+ 000164: fe 36 01 00 | i32.atomic.rmw16_u.or 1 0
+ 000167: 1a | drop
+ 000168: 41 00 | i32.const 0
+ 00016a: 42 00 | i64.const 0
+ 00016d: fe 37 00 00 | i64.atomic.rmw8_u.or 0 0
+ 000170: 1a | drop
+ 000171: 41 00 | i32.const 0
+ 000173: 42 00 | i64.const 0
+ 000176: fe 38 01 00 | i64.atomic.rmw16_u.or 1 0
+ 000179: 1a | drop
+ 00017a: 41 00 | i32.const 0
+ 00017c: 42 00 | i64.const 0
+ 00017f: fe 39 02 00 | i64.atomic.rmw32_u.or 2 0
+ 000182: 1a | drop
+ 000183: 41 00 | i32.const 0
+ 000185: 41 00 | i32.const 0
+ 000188: fe 3a 02 00 | i32.atomic.rmw.xor 2 0
+ 00018b: 1a | drop
+ 00018c: 41 00 | i32.const 0
+ 00018e: 42 00 | i64.const 0
+ 000191: fe 3b 03 00 | i64.atomic.rmw.xor 3 0
+ 000194: 1a | drop
+ 000195: 41 00 | i32.const 0
+ 000197: 41 00 | i32.const 0
+ 00019a: fe 3c 00 00 | i32.atomic.rmw8_u.xor 0 0
+ 00019d: 1a | drop
+ 00019e: 41 00 | i32.const 0
+ 0001a0: 41 00 | i32.const 0
+ 0001a3: fe 3d 01 00 | i32.atomic.rmw16_u.xor 1 0
+ 0001a6: 1a | drop
+ 0001a7: 41 00 | i32.const 0
+ 0001a9: 42 00 | i64.const 0
+ 0001ac: fe 3e 00 00 | i64.atomic.rmw8_u.xor 0 0
+ 0001af: 1a | drop
+ 0001b0: 41 00 | i32.const 0
+ 0001b2: 42 00 | i64.const 0
+ 0001b5: fe 3f 01 00 | i64.atomic.rmw16_u.xor 1 0
+ 0001b8: 1a | drop
+ 0001b9: 41 00 | i32.const 0
+ 0001bb: 42 00 | i64.const 0
+ 0001be: fe 40 02 00 | i64.atomic.rmw32_u.xor 2 0
+ 0001c1: 1a | drop
+ 0001c2: 41 00 | i32.const 0
+ 0001c4: 41 00 | i32.const 0
+ 0001c7: fe 41 02 00 | i32.atomic.rmw.xchg 2 0
+ 0001ca: 1a | drop
+ 0001cb: 41 00 | i32.const 0
+ 0001cd: 42 00 | i64.const 0
+ 0001d0: fe 42 03 00 | i64.atomic.rmw.xchg 3 0
+ 0001d3: 1a | drop
+ 0001d4: 41 00 | i32.const 0
+ 0001d6: 41 00 | i32.const 0
+ 0001d9: fe 43 00 00 | i32.atomic.rmw8_u.xchg 0 0
+ 0001dc: 1a | drop
+ 0001dd: 41 00 | i32.const 0
+ 0001df: 41 00 | i32.const 0
+ 0001e2: fe 44 01 00 | i32.atomic.rmw16_u.xchg 1 0
+ 0001e5: 1a | drop
+ 0001e6: 41 00 | i32.const 0
+ 0001e8: 42 00 | i64.const 0
+ 0001eb: fe 45 00 00 | i64.atomic.rmw8_u.xchg 0 0
+ 0001ee: 1a | drop
+ 0001ef: 41 00 | i32.const 0
+ 0001f1: 42 00 | i64.const 0
+ 0001f4: fe 46 01 00 | i64.atomic.rmw16_u.xchg 1 0
+ 0001f7: 1a | drop
+ 0001f8: 41 00 | i32.const 0
+ 0001fa: 42 00 | i64.const 0
+ 0001fd: fe 47 02 00 | i64.atomic.rmw32_u.xchg 2 0
+ 000200: 1a | drop
+ 000201: 41 00 | i32.const 0
+ 000203: 41 00 | i32.const 0
+ 000205: 41 00 | i32.const 0
+ 000208: fe 48 02 00 | i32.atomic.rmw.cmpxchg 2 0
+ 00020b: 1a | drop
+ 00020c: 41 00 | i32.const 0
+ 00020e: 42 00 | i64.const 0
+ 000210: 42 00 | i64.const 0
+ 000213: fe 49 03 00 | i64.atomic.rmw.cmpxchg 3 0
+ 000216: 1a | drop
+ 000217: 41 00 | i32.const 0
+ 000219: 41 00 | i32.const 0
+ 00021b: 41 00 | i32.const 0
+ 00021e: fe 4a 00 00 | i32.atomic.rmw8_u.cmpxchg 0 0
+ 000221: 1a | drop
+ 000222: 41 00 | i32.const 0
+ 000224: 41 00 | i32.const 0
+ 000226: 41 00 | i32.const 0
+ 000229: fe 4b 01 00 | i32.atomic.rmw16_u.cmpxchg 1 0
+ 00022c: 1a | drop
+ 00022d: 41 00 | i32.const 0
+ 00022f: 42 00 | i64.const 0
+ 000231: 42 00 | i64.const 0
+ 000234: fe 4c 00 00 | i64.atomic.rmw8_u.cmpxchg 0 0
+ 000237: 1a | drop
+ 000238: 41 00 | i32.const 0
+ 00023a: 42 00 | i64.const 0
+ 00023c: 42 00 | i64.const 0
+ 00023f: fe 4d 01 00 | i64.atomic.rmw16_u.cmpxchg 1 0
+ 000242: 1a | drop
+ 000243: 41 00 | i32.const 0
+ 000245: 42 00 | i64.const 0
+ 000247: 42 00 | i64.const 0
+ 00024a: fe 4e 02 00 | i64.atomic.rmw32_u.cmpxchg 2 0
+ 00024d: 1a | drop
+ 00024e: 0b | end
+;;; STDOUT ;;)
diff --git a/test/interp/atomic-load.txt b/test/interp/atomic-load.txt
new file mode 100644
index 00000000..4c4cf722
--- /dev/null
+++ b/test/interp/atomic-load.txt
@@ -0,0 +1,54 @@
+;;; TOOL: run-interp
+;;; FLAGS: --enable-threads
+(module
+ (memory 1)
+ (data (i32.const 0) "\ff\ff\ff\ff")
+ (data (i32.const 4) "\00\00\ce\41")
+ (data (i32.const 8) "\00\00\00\00\00\ff\8f\40")
+
+ (func (export "i32.atomic.load8_u") (result i32)
+ i32.const 1 i32.atomic.load8_u)
+ (func (export "i32.atomic.load16_u") (result i32)
+ i32.const 2 i32.atomic.load16_u)
+ (func (export "i32.atomic.load") (result i32)
+ i32.const 4 i32.atomic.load)
+
+ (func (export "i64.atomic.load8_u") (result i64)
+ i32.const 1 i64.atomic.load8_u)
+ (func (export "i64.atomic.load16_u") (result i64)
+ i32.const 2 i64.atomic.load16_u)
+ (func (export "i64.atomic.load32_u") (result i64)
+ i32.const 4 i64.atomic.load32_u)
+ (func (export "i64.atomic.load") (result i64)
+ i32.const 0 i64.atomic.load)
+
+ ;; Test bad alignment
+
+ (func (export "bad.align-i32.atomic.load16_u") (result i32)
+ i32.const 1 i32.atomic.load16_u)
+ (func (export "bad.align-i32.atomic.load") (result i32)
+ i32.const 2 i32.atomic.load)
+
+ (func (export "bad.align-i64.atomic.load16_u") (result i64)
+ i32.const 1 i64.atomic.load16_u)
+ (func (export "bad.align-i64.atomic.load32_u") (result i64)
+ i32.const 2 i64.atomic.load32_u)
+ (func (export "bad.align-i64.atomic.load") (result i64)
+ i32.const 4 i64.atomic.load)
+
+
+)
+(;; STDOUT ;;;
+i32.atomic.load8_u() => i32:255
+i32.atomic.load16_u() => i32:65535
+i32.atomic.load() => i32:1104019456
+i64.atomic.load8_u() => i64:255
+i64.atomic.load16_u() => i64:65535
+i64.atomic.load32_u() => i64:1104019456
+i64.atomic.load() => i64:4741727461962678271
+bad.align-i32.atomic.load16_u() => error: atomic memory access is unaligned
+bad.align-i32.atomic.load() => error: atomic memory access is unaligned
+bad.align-i64.atomic.load16_u() => error: atomic memory access is unaligned
+bad.align-i64.atomic.load32_u() => error: atomic memory access is unaligned
+bad.align-i64.atomic.load() => error: atomic memory access is unaligned
+;;; STDOUT ;;)
diff --git a/test/interp/atomic-rmw-add.txt b/test/interp/atomic-rmw-add.txt
new file mode 100644
index 00000000..6691e7cf
--- /dev/null
+++ b/test/interp/atomic-rmw-add.txt
@@ -0,0 +1,110 @@
+;;; TOOL: run-interp
+;;; FLAGS: --enable-threads
+(module
+ (memory 1)
+
+ ;; i32
+
+ (func (export "i32.atomic.rmw8_u.add-result") (result i32)
+ i32.const 0 i32.const 1000000 i32.store
+ i32.const 0 i32.const 1 i32.atomic.rmw8_u.add)
+
+ (func (export "i32.atomic.rmw8_u.add-memory") (result i32)
+ i32.const 0 i32.const 1000000 i32.store
+ i32.const 0 i32.const 1 i32.atomic.rmw8_u.add drop
+ i32.const 0 i32.load8_u)
+
+ (func (export "i32.atomic.rmw16_u.add-result") (result i32)
+ i32.const 0 i32.const 1000000 i32.store
+ i32.const 0 i32.const 1 i32.atomic.rmw16_u.add)
+
+ (func (export "i32.atomic.rmw16_u.add-memory") (result i32)
+ i32.const 0 i32.const 1000000 i32.store
+ i32.const 0 i32.const 1 i32.atomic.rmw16_u.add drop
+ i32.const 0 i32.load16_u)
+
+ (func (export "i32.atomic.rmw.add-result") (result i32)
+ i32.const 0 i32.const 1000000 i32.store
+ i32.const 0 i32.const 1 i32.atomic.rmw.add)
+
+ (func (export "i32.atomic.rmw.add-memory") (result i32)
+ i32.const 0 i32.const 1000000 i32.store
+ i32.const 0 i32.const 1 i32.atomic.rmw.add drop
+ i32.const 0 i32.load)
+
+
+ ;; i64
+
+ (func (export "i64.atomic.rmw8_u.add-result") (result i64)
+ i32.const 0 i64.const 10000000000 i64.store
+ i32.const 0 i64.const 1 i64.atomic.rmw8_u.add)
+
+ (func (export "i64.atomic.rmw8_u.add-memory") (result i64)
+ i32.const 0 i64.const 10000000000 i64.store
+ i32.const 0 i64.const 1 i64.atomic.rmw8_u.add drop
+ i32.const 0 i64.load8_u)
+
+ (func (export "i64.atomic.rmw16_u.add-result") (result i64)
+ i32.const 0 i64.const 10000000000 i64.store
+ i32.const 0 i64.const 1 i64.atomic.rmw16_u.add)
+
+ (func (export "i64.atomic.rmw16_u.add-memory") (result i64)
+ i32.const 0 i64.const 10000000000 i64.store
+ i32.const 0 i64.const 1 i64.atomic.rmw16_u.add drop
+ i32.const 0 i64.load16_u)
+
+ (func (export "i64.atomic.rmw32_u.add-result") (result i64)
+ i32.const 0 i64.const 10000000000 i64.store
+ i32.const 0 i64.const 1 i64.atomic.rmw32_u.add)
+
+ (func (export "i64.atomic.rmw32_u.add-memory") (result i64)
+ i32.const 0 i64.const 10000000000 i64.store
+ i32.const 0 i64.const 1 i64.atomic.rmw32_u.add drop
+ i32.const 0 i64.load32_u)
+
+ (func (export "i64.atomic.rmw.add-result") (result i64)
+ i32.const 0 i64.const 10000000000 i64.store
+ i32.const 0 i64.const 1 i64.atomic.rmw.add)
+
+ (func (export "i64.atomic.rmw.add-memory") (result i64)
+ i32.const 0 i64.const 10000000000 i64.store
+ i32.const 0 i64.const 1 i64.atomic.rmw.add drop
+ i32.const 0 i64.load)
+
+
+ ;; Test bad alignment
+
+ (func (export "bad_align-i32.atomic.rmw16_u.add")
+ i32.const 1 i32.const 0 i32.atomic.rmw16_u.add drop)
+ (func (export "bad_align-i32.atomic.rmw.add")
+ i32.const 2 i32.const 0 i32.atomic.rmw.add drop)
+
+ (func (export "bad_align-i64.atomic.rmw16_u.add")
+ i32.const 1 i64.const 0 i64.atomic.rmw16_u.add drop)
+ (func (export "bad_align-i64.atomic.rmw32_u.add")
+ i32.const 2 i64.const 0 i64.atomic.rmw32_u.add drop)
+ (func (export "bad_align-i64.atomic.rmw.add")
+ i32.const 4 i64.const 0 i64.atomic.rmw.add drop)
+
+)
+(;; STDOUT ;;;
+i32.atomic.rmw8_u.add-result() => i32:64
+i32.atomic.rmw8_u.add-memory() => i32:65
+i32.atomic.rmw16_u.add-result() => i32:16960
+i32.atomic.rmw16_u.add-memory() => i32:16961
+i32.atomic.rmw.add-result() => i32:1000000
+i32.atomic.rmw.add-memory() => i32:1000001
+i64.atomic.rmw8_u.add-result() => i64:0
+i64.atomic.rmw8_u.add-memory() => i64:1
+i64.atomic.rmw16_u.add-result() => i64:58368
+i64.atomic.rmw16_u.add-memory() => i64:58369
+i64.atomic.rmw32_u.add-result() => i64:1410065408
+i64.atomic.rmw32_u.add-memory() => i64:1410065409
+i64.atomic.rmw.add-result() => i64:10000000000
+i64.atomic.rmw.add-memory() => i64:10000000001
+bad_align-i32.atomic.rmw16_u.add() => error: atomic memory access is unaligned
+bad_align-i32.atomic.rmw.add() => error: atomic memory access is unaligned
+bad_align-i64.atomic.rmw16_u.add() => error: atomic memory access is unaligned
+bad_align-i64.atomic.rmw32_u.add() => error: atomic memory access is unaligned
+bad_align-i64.atomic.rmw.add() => error: atomic memory access is unaligned
+;;; STDOUT ;;)
diff --git a/test/interp/atomic-rmw-and.txt b/test/interp/atomic-rmw-and.txt
new file mode 100644
index 00000000..6dee152d
--- /dev/null
+++ b/test/interp/atomic-rmw-and.txt
@@ -0,0 +1,110 @@
+;;; TOOL: run-interp
+;;; FLAGS: --enable-threads
+(module
+ (memory 1)
+
+ ;; i32
+
+ (func (export "i32.atomic.rmw8_u.and-result") (result i32)
+ i32.const 0 i32.const 1000000 i32.store
+ i32.const 0 i32.const 64 i32.atomic.rmw8_u.and)
+
+ (func (export "i32.atomic.rmw8_u.and-memory") (result i32)
+ i32.const 0 i32.const 1000000 i32.store
+ i32.const 0 i32.const 64 i32.atomic.rmw8_u.and drop
+ i32.const 0 i32.load8_u)
+
+ (func (export "i32.atomic.rmw16_u.and-result") (result i32)
+ i32.const 0 i32.const 1000000 i32.store
+ i32.const 0 i32.const 64 i32.atomic.rmw16_u.and)
+
+ (func (export "i32.atomic.rmw16_u.and-memory") (result i32)
+ i32.const 0 i32.const 1000000 i32.store
+ i32.const 0 i32.const 64 i32.atomic.rmw16_u.and drop
+ i32.const 0 i32.load16_u)
+
+ (func (export "i32.atomic.rmw.and-result") (result i32)
+ i32.const 0 i32.const 1000000 i32.store
+ i32.const 0 i32.const 64 i32.atomic.rmw.and)
+
+ (func (export "i32.atomic.rmw.and-memory") (result i32)
+ i32.const 0 i32.const 1000000 i32.store
+ i32.const 0 i32.const 64 i32.atomic.rmw.and drop
+ i32.const 0 i32.load)
+
+
+ ;; i64
+
+ (func (export "i64.atomic.rmw8_u.and-result") (result i64)
+ i32.const 0 i64.const 10000000000 i64.store
+ i32.const 0 i64.const 64 i64.atomic.rmw8_u.and)
+
+ (func (export "i64.atomic.rmw8_u.and-memory") (result i64)
+ i32.const 0 i64.const 10000000000 i64.store
+ i32.const 0 i64.const 64 i64.atomic.rmw8_u.and drop
+ i32.const 0 i64.load8_u)
+
+ (func (export "i64.atomic.rmw16_u.and-result") (result i64)
+ i32.const 0 i64.const 10000000000 i64.store
+ i32.const 0 i64.const 1024 i64.atomic.rmw16_u.and)
+
+ (func (export "i64.atomic.rmw16_u.and-memory") (result i64)
+ i32.const 0 i64.const 10000000000 i64.store
+ i32.const 0 i64.const 1024 i64.atomic.rmw16_u.and drop
+ i32.const 0 i64.load16_u)
+
+ (func (export "i64.atomic.rmw32_u.and-result") (result i64)
+ i32.const 0 i64.const 10000000000 i64.store
+ i32.const 0 i64.const 1024 i64.atomic.rmw32_u.and)
+
+ (func (export "i64.atomic.rmw32_u.and-memory") (result i64)
+ i32.const 0 i64.const 10000000000 i64.store
+ i32.const 0 i64.const 1024 i64.atomic.rmw32_u.and drop
+ i32.const 0 i64.load32_u)
+
+ (func (export "i64.atomic.rmw.and-result") (result i64)
+ i32.const 0 i64.const 10000000000 i64.store
+ i32.const 0 i64.const 1024 i64.atomic.rmw.and)
+
+ (func (export "i64.atomic.rmw.and-memory") (result i64)
+ i32.const 0 i64.const 10000000000 i64.store
+ i32.const 0 i64.const 1024 i64.atomic.rmw.and drop
+ i32.const 0 i64.load)
+
+
+ ;; Test bad alignment
+
+ (func (export "bad_align-i32.atomic.rmw16_u.and")
+ i32.const 1 i32.const 0 i32.atomic.rmw16_u.and drop)
+ (func (export "bad_align-i32.atomic.rmw.and")
+ i32.const 2 i32.const 0 i32.atomic.rmw.and drop)
+
+ (func (export "bad_align-i64.atomic.rmw16_u.and")
+ i32.const 1 i64.const 0 i64.atomic.rmw16_u.and drop)
+ (func (export "bad_align-i64.atomic.rmw32_u.and")
+ i32.const 2 i64.const 0 i64.atomic.rmw32_u.and drop)
+ (func (export "bad_align-i64.atomic.rmw.and")
+ i32.const 4 i64.const 0 i64.atomic.rmw.and drop)
+
+)
+(;; STDOUT ;;;
+i32.atomic.rmw8_u.and-result() => i32:64
+i32.atomic.rmw8_u.and-memory() => i32:64
+i32.atomic.rmw16_u.and-result() => i32:16960
+i32.atomic.rmw16_u.and-memory() => i32:64
+i32.atomic.rmw.and-result() => i32:1000000
+i32.atomic.rmw.and-memory() => i32:64
+i64.atomic.rmw8_u.and-result() => i64:0
+i64.atomic.rmw8_u.and-memory() => i64:0
+i64.atomic.rmw16_u.and-result() => i64:58368
+i64.atomic.rmw16_u.and-memory() => i64:1024
+i64.atomic.rmw32_u.and-result() => i64:1410065408
+i64.atomic.rmw32_u.and-memory() => i64:1024
+i64.atomic.rmw.and-result() => i64:10000000000
+i64.atomic.rmw.and-memory() => i64:1024
+bad_align-i32.atomic.rmw16_u.and() => error: atomic memory access is unaligned
+bad_align-i32.atomic.rmw.and() => error: atomic memory access is unaligned
+bad_align-i64.atomic.rmw16_u.and() => error: atomic memory access is unaligned
+bad_align-i64.atomic.rmw32_u.and() => error: atomic memory access is unaligned
+bad_align-i64.atomic.rmw.and() => error: atomic memory access is unaligned
+;;; STDOUT ;;)
diff --git a/test/interp/atomic-rmw-cmpxchg.txt b/test/interp/atomic-rmw-cmpxchg.txt
new file mode 100644
index 00000000..74acfc7e
--- /dev/null
+++ b/test/interp/atomic-rmw-cmpxchg.txt
@@ -0,0 +1,180 @@
+;;; FLAGS: --enable-threads
+;;; TOOL: run-interp
+(module
+ (memory 1)
+
+ ;; i32
+
+ (func (export "i32.atomic.rmw8_u.cmpxchg-true-result") (result i32)
+ i32.const 0 i32.const 1000000 i32.store
+ i32.const 0 i32.const 1000000 i32.const 1 i32.atomic.rmw8_u.cmpxchg)
+ (func (export "i32.atomic.rmw8_u.cmpxchg-true-memory") (result i32)
+ i32.const 0 i32.const 1000000 i32.store
+ i32.const 0 i32.const 1000000 i32.const 1 i32.atomic.rmw8_u.cmpxchg drop
+ i32.const 0 i32.load8_u)
+
+ (func (export "i32.atomic.rmw8_u.cmpxchg-false-result") (result i32)
+ i32.const 0 i32.const 1000000 i32.store
+ i32.const 0 i32.const 123 i32.const 1 i32.atomic.rmw8_u.cmpxchg)
+ (func (export "i32.atomic.rmw8_u.cmpxchg-false-memory") (result i32)
+ i32.const 0 i32.const 1000000 i32.store
+ i32.const 0 i32.const 123 i32.const 1 i32.atomic.rmw8_u.cmpxchg drop
+ i32.const 0 i32.load8_u)
+
+
+ (func (export "i32.atomic.rmw16_u.cmpxchg-true-result") (result i32)
+ i32.const 0 i32.const 1000000 i32.store
+ i32.const 0 i32.const 1000000 i32.const 1 i32.atomic.rmw16_u.cmpxchg)
+ (func (export "i32.atomic.rmw16_u.cmpxchg-true-memory") (result i32)
+ i32.const 0 i32.const 1000000 i32.store
+ i32.const 0 i32.const 1000000 i32.const 1 i32.atomic.rmw16_u.cmpxchg drop
+ i32.const 0 i32.load16_u)
+
+ (func (export "i32.atomic.rmw16_u.cmpxchg-false-result") (result i32)
+ i32.const 0 i32.const 1000000 i32.store
+ i32.const 0 i32.const 123 i32.const 1 i32.atomic.rmw16_u.cmpxchg)
+ (func (export "i32.atomic.rmw16_u.cmpxchg-false-memory") (result i32)
+ i32.const 0 i32.const 1000000 i32.store
+ i32.const 0 i32.const 123 i32.const 1 i32.atomic.rmw16_u.cmpxchg drop
+ i32.const 0 i32.load16_u)
+
+
+ (func (export "i32.atomic.rmw.cmpxchg-true-result") (result i32)
+ i32.const 0 i32.const 1000000 i32.store
+ i32.const 0 i32.const 1000000 i32.const 1 i32.atomic.rmw.cmpxchg)
+ (func (export "i32.atomic.rmw.cmpxchg-true-memory") (result i32)
+ i32.const 0 i32.const 1000000 i32.store
+ i32.const 0 i32.const 1000000 i32.const 1 i32.atomic.rmw.cmpxchg drop
+ i32.const 0 i32.load)
+
+ (func (export "i32.atomic.rmw.cmpxchg-false-result") (result i32)
+ i32.const 0 i32.const 1000000 i32.store
+ i32.const 0 i32.const 123 i32.const 1 i32.atomic.rmw.cmpxchg)
+
+ (func (export "i32.atomic.rmw.cmpxchg-false-memory") (result i32)
+ i32.const 0 i32.const 1000000 i32.store
+ i32.const 0 i32.const 123 i32.const 1 i32.atomic.rmw.cmpxchg drop
+ i32.const 0 i32.load)
+
+
+
+ ;; i64
+
+ (func (export "i64.atomic.rmw8_u.cmpxchg-true-result") (result i64)
+ i32.const 0 i64.const 10000000000 i64.store
+ i32.const 0 i64.const 10000000000 i64.const 1 i64.atomic.rmw8_u.cmpxchg)
+ (func (export "i64.atomic.rmw8_u.cmpxchg-true-memory") (result i64)
+ i32.const 0 i64.const 10000000000 i64.store
+ i32.const 0 i64.const 10000000000 i64.const 1 i64.atomic.rmw8_u.cmpxchg drop
+ i32.const 0 i64.load8_u)
+
+ (func (export "i64.atomic.rmw8_u.cmpxchg-false-result") (result i64)
+ i32.const 0 i64.const 10000000000 i64.store
+ i32.const 0 i64.const 123 i64.const 1 i64.atomic.rmw8_u.cmpxchg)
+ (func (export "i64.atomic.rmw8_u.cmpxchg-false-memory") (result i64)
+ i32.const 0 i64.const 10000000000 i64.store
+ i32.const 0 i64.const 123 i64.const 1 i64.atomic.rmw8_u.cmpxchg drop
+ i32.const 0 i64.load8_u)
+
+
+ (func (export "i64.atomic.rmw16_u.cmpxchg-true-result") (result i64)
+ i32.const 0 i64.const 10000000000 i64.store
+ i32.const 0 i64.const 10000000000 i64.const 1 i64.atomic.rmw16_u.cmpxchg)
+ (func (export "i64.atomic.rmw16_u.cmpxchg-true-memory") (result i64)
+ i32.const 0 i64.const 10000000000 i64.store
+ i32.const 0 i64.const 10000000000 i64.const 1 i64.atomic.rmw16_u.cmpxchg drop
+ i32.const 0 i64.load16_u)
+
+ (func (export "i64.atomic.rmw16_u.cmpxchg-false-result") (result i64)
+ i32.const 0 i64.const 10000000000 i64.store
+ i32.const 0 i64.const 123 i64.const 1 i64.atomic.rmw16_u.cmpxchg)
+ (func (export "i64.atomic.rmw16_u.cmpxchg-false-memory") (result i64)
+ i32.const 0 i64.const 10000000000 i64.store
+ i32.const 0 i64.const 123 i64.const 1 i64.atomic.rmw16_u.cmpxchg drop
+ i32.const 0 i64.load16_u)
+
+
+ (func (export "i64.atomic.rmw32_u.cmpxchg-true-result") (result i64)
+ i32.const 0 i64.const 10000000000 i64.store
+ i32.const 0 i64.const 10000000000 i64.const 1 i64.atomic.rmw32_u.cmpxchg)
+ (func (export "i64.atomic.rmw32_u.cmpxchg-true-memory") (result i64)
+ i32.const 0 i64.const 10000000000 i64.store
+ i32.const 0 i64.const 10000000000 i64.const 1 i64.atomic.rmw32_u.cmpxchg drop
+ i32.const 0 i64.load32_u)
+
+ (func (export "i64.atomic.rmw32_u.cmpxchg-false-result") (result i64)
+ i32.const 0 i64.const 10000000000 i64.store
+ i32.const 0 i64.const 123 i64.const 1 i64.atomic.rmw32_u.cmpxchg)
+ (func (export "i64.atomic.rmw32_u.cmpxchg-false-memory") (result i64)
+ i32.const 0 i64.const 10000000000 i64.store
+ i32.const 0 i64.const 123 i64.const 1 i64.atomic.rmw32_u.cmpxchg drop
+ i32.const 0 i64.load32_u)
+
+
+ (func (export "i64.atomic.rmw.cmpxchg-true-result") (result i64)
+ i32.const 0 i64.const 10000000000 i64.store
+ i32.const 0 i64.const 10000000000 i64.const 1 i64.atomic.rmw.cmpxchg)
+ (func (export "i64.atomic.rmw.cmpxchg-true-memory") (result i64)
+ i32.const 0 i64.const 10000000000 i64.store
+ i32.const 0 i64.const 10000000000 i64.const 1 i64.atomic.rmw.cmpxchg drop
+ i32.const 0 i64.load)
+
+ (func (export "i64.atomic.rmw.cmpxchg-false-result") (result i64)
+ i32.const 0 i64.const 10000000000 i64.store
+ i32.const 0 i64.const 123 i64.const 1 i64.atomic.rmw.cmpxchg)
+ (func (export "i64.atomic.rmw.cmpxchg-false-memory") (result i64)
+ i32.const 0 i64.const 10000000000 i64.store
+ i32.const 0 i64.const 123 i64.const 1 i64.atomic.rmw.cmpxchg drop
+ i32.const 0 i64.load)
+
+
+ ;; Test bad alignment
+
+ (func (export "bad_align-i32.atomic.rmw16_u.cmpxchg")
+ i32.const 1 i32.const 0 i32.const 0 i32.atomic.rmw16_u.cmpxchg drop)
+ (func (export "bad_align-i32.atomic.rmw.cmpxchg")
+ i32.const 2 i32.const 0 i32.const 0 i32.atomic.rmw.cmpxchg drop)
+
+ (func (export "bad_align-i64.atomic.rmw16_u.cmpxchg")
+ i32.const 1 i64.const 0 i64.const 0 i64.atomic.rmw16_u.cmpxchg drop)
+ (func (export "bad_align-i64.atomic.rmw32_u.cmpxchg")
+ i32.const 2 i64.const 0 i64.const 0 i64.atomic.rmw32_u.cmpxchg drop)
+ (func (export "bad_align-i64.atomic.rmw.cmpxchg")
+ i32.const 4 i64.const 0 i64.const 0 i64.atomic.rmw.cmpxchg drop)
+
+)
+(;; STDOUT ;;;
+i32.atomic.rmw8_u.cmpxchg-true-result() => i32:64
+i32.atomic.rmw8_u.cmpxchg-true-memory() => i32:1
+i32.atomic.rmw8_u.cmpxchg-false-result() => i32:64
+i32.atomic.rmw8_u.cmpxchg-false-memory() => i32:64
+i32.atomic.rmw16_u.cmpxchg-true-result() => i32:16960
+i32.atomic.rmw16_u.cmpxchg-true-memory() => i32:1
+i32.atomic.rmw16_u.cmpxchg-false-result() => i32:16960
+i32.atomic.rmw16_u.cmpxchg-false-memory() => i32:16960
+i32.atomic.rmw.cmpxchg-true-result() => i32:1000000
+i32.atomic.rmw.cmpxchg-true-memory() => i32:1
+i32.atomic.rmw.cmpxchg-false-result() => i32:1000000
+i32.atomic.rmw.cmpxchg-false-memory() => i32:1000000
+i64.atomic.rmw8_u.cmpxchg-true-result() => i64:0
+i64.atomic.rmw8_u.cmpxchg-true-memory() => i64:1
+i64.atomic.rmw8_u.cmpxchg-false-result() => i64:0
+i64.atomic.rmw8_u.cmpxchg-false-memory() => i64:0
+i64.atomic.rmw16_u.cmpxchg-true-result() => i64:58368
+i64.atomic.rmw16_u.cmpxchg-true-memory() => i64:1
+i64.atomic.rmw16_u.cmpxchg-false-result() => i64:58368
+i64.atomic.rmw16_u.cmpxchg-false-memory() => i64:58368
+i64.atomic.rmw32_u.cmpxchg-true-result() => i64:1410065408
+i64.atomic.rmw32_u.cmpxchg-true-memory() => i64:1
+i64.atomic.rmw32_u.cmpxchg-false-result() => i64:1410065408
+i64.atomic.rmw32_u.cmpxchg-false-memory() => i64:1410065408
+i64.atomic.rmw.cmpxchg-true-result() => i64:10000000000
+i64.atomic.rmw.cmpxchg-true-memory() => i64:1
+i64.atomic.rmw.cmpxchg-false-result() => i64:10000000000
+i64.atomic.rmw.cmpxchg-false-memory() => i64:10000000000
+bad_align-i32.atomic.rmw16_u.cmpxchg() => error: atomic memory access is unaligned
+bad_align-i32.atomic.rmw.cmpxchg() => error: atomic memory access is unaligned
+bad_align-i64.atomic.rmw16_u.cmpxchg() => error: atomic memory access is unaligned
+bad_align-i64.atomic.rmw32_u.cmpxchg() => error: atomic memory access is unaligned
+bad_align-i64.atomic.rmw.cmpxchg() => error: atomic memory access is unaligned
+;;; STDOUT ;;)
diff --git a/test/interp/atomic-rmw-or.txt b/test/interp/atomic-rmw-or.txt
new file mode 100644
index 00000000..4781ab3d
--- /dev/null
+++ b/test/interp/atomic-rmw-or.txt
@@ -0,0 +1,110 @@
+;;; TOOL: run-interp
+;;; FLAGS: --enable-threads
+(module
+ (memory 1)
+
+ ;; i32
+
+ (func (export "i32.atomic.rmw8_u.or-result") (result i32)
+ i32.const 0 i32.const 1000000 i32.store
+ i32.const 0 i32.const 65 i32.atomic.rmw8_u.or)
+
+ (func (export "i32.atomic.rmw8_u.or-memory") (result i32)
+ i32.const 0 i32.const 1000000 i32.store
+ i32.const 0 i32.const 65 i32.atomic.rmw8_u.or drop
+ i32.const 0 i32.load8_u)
+
+ (func (export "i32.atomic.rmw16_u.or-result") (result i32)
+ i32.const 0 i32.const 1000000 i32.store
+ i32.const 0 i32.const 65 i32.atomic.rmw16_u.or)
+
+ (func (export "i32.atomic.rmw16_u.or-memory") (result i32)
+ i32.const 0 i32.const 1000000 i32.store
+ i32.const 0 i32.const 65 i32.atomic.rmw16_u.or drop
+ i32.const 0 i32.load16_u)
+
+ (func (export "i32.atomic.rmw.or-result") (result i32)
+ i32.const 0 i32.const 1000000 i32.store
+ i32.const 0 i32.const 65 i32.atomic.rmw.or)
+
+ (func (export "i32.atomic.rmw.or-memory") (result i32)
+ i32.const 0 i32.const 1000000 i32.store
+ i32.const 0 i32.const 65 i32.atomic.rmw.or drop
+ i32.const 0 i32.load)
+
+
+ ;; i64
+
+ (func (export "i64.atomic.rmw8_u.or-result") (result i64)
+ i32.const 0 i64.const 10000000000 i64.store
+ i32.const 0 i64.const 65 i64.atomic.rmw8_u.or)
+
+ (func (export "i64.atomic.rmw8_u.or-memory") (result i64)
+ i32.const 0 i64.const 10000000000 i64.store
+ i32.const 0 i64.const 65 i64.atomic.rmw8_u.or drop
+ i32.const 0 i64.load8_u)
+
+ (func (export "i64.atomic.rmw16_u.or-result") (result i64)
+ i32.const 0 i64.const 10000000000 i64.store
+ i32.const 0 i64.const 1025 i64.atomic.rmw16_u.or)
+
+ (func (export "i64.atomic.rmw16_u.or-memory") (result i64)
+ i32.const 0 i64.const 10000000000 i64.store
+ i32.const 0 i64.const 1025 i64.atomic.rmw16_u.or drop
+ i32.const 0 i64.load16_u)
+
+ (func (export "i64.atomic.rmw32_u.or-result") (result i64)
+ i32.const 0 i64.const 10000000000 i64.store
+ i32.const 0 i64.const 1025 i64.atomic.rmw32_u.or)
+
+ (func (export "i64.atomic.rmw32_u.or-memory") (result i64)
+ i32.const 0 i64.const 10000000000 i64.store
+ i32.const 0 i64.const 1025 i64.atomic.rmw32_u.or drop
+ i32.const 0 i64.load32_u)
+
+ (func (export "i64.atomic.rmw.or-result") (result i64)
+ i32.const 0 i64.const 10000000000 i64.store
+ i32.const 0 i64.const 1025 i64.atomic.rmw.or)
+
+ (func (export "i64.atomic.rmw.or-memory") (result i64)
+ i32.const 0 i64.const 10000000000 i64.store
+ i32.const 0 i64.const 1025 i64.atomic.rmw.or drop
+ i32.const 0 i64.load)
+
+
+ ;; Test bad alignment
+
+ (func (export "bad_align-i32.atomic.rmw16_u.or")
+ i32.const 1 i32.const 0 i32.atomic.rmw16_u.or drop)
+ (func (export "bad_align-i32.atomic.rmw.or")
+ i32.const 2 i32.const 0 i32.atomic.rmw.or drop)
+
+ (func (export "bad_align-i64.atomic.rmw16_u.or")
+ i32.const 1 i64.const 0 i64.atomic.rmw16_u.or drop)
+ (func (export "bad_align-i64.atomic.rmw32_u.or")
+ i32.const 2 i64.const 0 i64.atomic.rmw32_u.or drop)
+ (func (export "bad_align-i64.atomic.rmw.or")
+ i32.const 4 i64.const 0 i64.atomic.rmw.or drop)
+
+)
+(;; STDOUT ;;;
+i32.atomic.rmw8_u.or-result() => i32:64
+i32.atomic.rmw8_u.or-memory() => i32:65
+i32.atomic.rmw16_u.or-result() => i32:16960
+i32.atomic.rmw16_u.or-memory() => i32:16961
+i32.atomic.rmw.or-result() => i32:1000000
+i32.atomic.rmw.or-memory() => i32:1000001
+i64.atomic.rmw8_u.or-result() => i64:0
+i64.atomic.rmw8_u.or-memory() => i64:65
+i64.atomic.rmw16_u.or-result() => i64:58368
+i64.atomic.rmw16_u.or-memory() => i64:58369
+i64.atomic.rmw32_u.or-result() => i64:1410065408
+i64.atomic.rmw32_u.or-memory() => i64:1410065409
+i64.atomic.rmw.or-result() => i64:10000000000
+i64.atomic.rmw.or-memory() => i64:10000000001
+bad_align-i32.atomic.rmw16_u.or() => error: atomic memory access is unaligned
+bad_align-i32.atomic.rmw.or() => error: atomic memory access is unaligned
+bad_align-i64.atomic.rmw16_u.or() => error: atomic memory access is unaligned
+bad_align-i64.atomic.rmw32_u.or() => error: atomic memory access is unaligned
+bad_align-i64.atomic.rmw.or() => error: atomic memory access is unaligned
+;;; STDOUT ;;)
diff --git a/test/interp/atomic-rmw-sub.txt b/test/interp/atomic-rmw-sub.txt
new file mode 100644
index 00000000..5f46d12c
--- /dev/null
+++ b/test/interp/atomic-rmw-sub.txt
@@ -0,0 +1,110 @@
+;;; TOOL: run-interp
+;;; FLAGS: --enable-threads
+(module
+ (memory 1)
+
+ ;; i32
+
+ (func (export "i32.atomic.rmw8_u.sub-result") (result i32)
+ i32.const 0 i32.const 1000000 i32.store
+ i32.const 0 i32.const 1 i32.atomic.rmw8_u.sub)
+
+ (func (export "i32.atomic.rmw8_u.sub-memory") (result i32)
+ i32.const 0 i32.const 1000000 i32.store
+ i32.const 0 i32.const 1 i32.atomic.rmw8_u.sub drop
+ i32.const 0 i32.load8_u)
+
+ (func (export "i32.atomic.rmw16_u.sub-result") (result i32)
+ i32.const 0 i32.const 1000000 i32.store
+ i32.const 0 i32.const 1 i32.atomic.rmw16_u.sub)
+
+ (func (export "i32.atomic.rmw16_u.sub-memory") (result i32)
+ i32.const 0 i32.const 1000000 i32.store
+ i32.const 0 i32.const 1 i32.atomic.rmw16_u.sub drop
+ i32.const 0 i32.load16_u)
+
+ (func (export "i32.atomic.rmw.sub-result") (result i32)
+ i32.const 0 i32.const 1000000 i32.store
+ i32.const 0 i32.const 1 i32.atomic.rmw.sub)
+
+ (func (export "i32.atomic.rmw.sub-memory") (result i32)
+ i32.const 0 i32.const 1000000 i32.store
+ i32.const 0 i32.const 1 i32.atomic.rmw.sub drop
+ i32.const 0 i32.load)
+
+
+ ;; i64
+
+ (func (export "i64.atomic.rmw8_u.sub-result") (result i64)
+ i32.const 0 i64.const 10000000000 i64.store
+ i32.const 0 i64.const 1 i64.atomic.rmw8_u.sub)
+
+ (func (export "i64.atomic.rmw8_u.sub-memory") (result i64)
+ i32.const 0 i64.const 10000000000 i64.store
+ i32.const 0 i64.const 1 i64.atomic.rmw8_u.sub drop
+ i32.const 0 i64.load8_u)
+
+ (func (export "i64.atomic.rmw16_u.sub-result") (result i64)
+ i32.const 0 i64.const 10000000000 i64.store
+ i32.const 0 i64.const 1 i64.atomic.rmw16_u.sub)
+
+ (func (export "i64.atomic.rmw16_u.sub-memory") (result i64)
+ i32.const 0 i64.const 10000000000 i64.store
+ i32.const 0 i64.const 1 i64.atomic.rmw16_u.sub drop
+ i32.const 0 i64.load16_u)
+
+ (func (export "i64.atomic.rmw32_u.sub-result") (result i64)
+ i32.const 0 i64.const 10000000000 i64.store
+ i32.const 0 i64.const 1 i64.atomic.rmw32_u.sub)
+
+ (func (export "i64.atomic.rmw32_u.sub-memory") (result i64)
+ i32.const 0 i64.const 10000000000 i64.store
+ i32.const 0 i64.const 1 i64.atomic.rmw32_u.sub drop
+ i32.const 0 i64.load32_u)
+
+ (func (export "i64.atomic.rmw.sub-result") (result i64)
+ i32.const 0 i64.const 10000000000 i64.store
+ i32.const 0 i64.const 1 i64.atomic.rmw.sub)
+
+ (func (export "i64.atomic.rmw.sub-memory") (result i64)
+ i32.const 0 i64.const 10000000000 i64.store
+ i32.const 0 i64.const 1 i64.atomic.rmw.sub drop
+ i32.const 0 i64.load)
+
+
+ ;; Test bad alignment
+
+ (func (export "bad_align-i32.atomic.rmw16_u.sub")
+ i32.const 1 i32.const 0 i32.atomic.rmw16_u.sub drop)
+ (func (export "bad_align-i32.atomic.rmw.sub")
+ i32.const 2 i32.const 0 i32.atomic.rmw.sub drop)
+
+ (func (export "bad_align-i64.atomic.rmw16_u.sub")
+ i32.const 1 i64.const 0 i64.atomic.rmw16_u.sub drop)
+ (func (export "bad_align-i64.atomic.rmw32_u.sub")
+ i32.const 2 i64.const 0 i64.atomic.rmw32_u.sub drop)
+ (func (export "bad_align-i64.atomic.rmw.sub")
+ i32.const 4 i64.const 0 i64.atomic.rmw.sub drop)
+
+)
+(;; STDOUT ;;;
+i32.atomic.rmw8_u.sub-result() => i32:64
+i32.atomic.rmw8_u.sub-memory() => i32:63
+i32.atomic.rmw16_u.sub-result() => i32:16960
+i32.atomic.rmw16_u.sub-memory() => i32:16959
+i32.atomic.rmw.sub-result() => i32:1000000
+i32.atomic.rmw.sub-memory() => i32:999999
+i64.atomic.rmw8_u.sub-result() => i64:0
+i64.atomic.rmw8_u.sub-memory() => i64:255
+i64.atomic.rmw16_u.sub-result() => i64:58368
+i64.atomic.rmw16_u.sub-memory() => i64:58367
+i64.atomic.rmw32_u.sub-result() => i64:1410065408
+i64.atomic.rmw32_u.sub-memory() => i64:1410065407
+i64.atomic.rmw.sub-result() => i64:10000000000
+i64.atomic.rmw.sub-memory() => i64:9999999999
+bad_align-i32.atomic.rmw16_u.sub() => error: atomic memory access is unaligned
+bad_align-i32.atomic.rmw.sub() => error: atomic memory access is unaligned
+bad_align-i64.atomic.rmw16_u.sub() => error: atomic memory access is unaligned
+bad_align-i64.atomic.rmw32_u.sub() => error: atomic memory access is unaligned
+bad_align-i64.atomic.rmw.sub() => error: atomic memory access is unaligned
+;;; STDOUT ;;)
diff --git a/test/interp/atomic-rmw-xchg.txt b/test/interp/atomic-rmw-xchg.txt
new file mode 100644
index 00000000..e824203f
--- /dev/null
+++ b/test/interp/atomic-rmw-xchg.txt
@@ -0,0 +1,110 @@
+;;; TOOL: run-interp
+;;; FLAGS: --enable-threads
+(module
+ (memory 1)
+
+ ;; i32
+
+ (func (export "i32.atomic.rmw8_u.xchg-result") (result i32)
+ i32.const 0 i32.const 1000000 i32.store
+ i32.const 0 i32.const 1 i32.atomic.rmw8_u.xchg)
+
+ (func (export "i32.atomic.rmw8_u.xchg-memory") (result i32)
+ i32.const 0 i32.const 1000000 i32.store
+ i32.const 0 i32.const 1 i32.atomic.rmw8_u.xchg drop
+ i32.const 0 i32.load8_u)
+
+ (func (export "i32.atomic.rmw16_u.xchg-result") (result i32)
+ i32.const 0 i32.const 1000000 i32.store
+ i32.const 0 i32.const 1 i32.atomic.rmw16_u.xchg)
+
+ (func (export "i32.atomic.rmw16_u.xchg-memory") (result i32)
+ i32.const 0 i32.const 1000000 i32.store
+ i32.const 0 i32.const 1 i32.atomic.rmw16_u.xchg drop
+ i32.const 0 i32.load16_u)
+
+ (func (export "i32.atomic.rmw.xchg-result") (result i32)
+ i32.const 0 i32.const 1000000 i32.store
+ i32.const 0 i32.const 1 i32.atomic.rmw.xchg)
+
+ (func (export "i32.atomic.rmw.xchg-memory") (result i32)
+ i32.const 0 i32.const 1000000 i32.store
+ i32.const 0 i32.const 1 i32.atomic.rmw.xchg drop
+ i32.const 0 i32.load)
+
+
+ ;; i64
+
+ (func (export "i64.atomic.rmw8_u.xchg-result") (result i64)
+ i32.const 0 i64.const 10000000000 i64.store
+ i32.const 0 i64.const 1 i64.atomic.rmw8_u.xchg)
+
+ (func (export "i64.atomic.rmw8_u.xchg-memory") (result i64)
+ i32.const 0 i64.const 10000000000 i64.store
+ i32.const 0 i64.const 1 i64.atomic.rmw8_u.xchg drop
+ i32.const 0 i64.load8_u)
+
+ (func (export "i64.atomic.rmw16_u.xchg-result") (result i64)
+ i32.const 0 i64.const 10000000000 i64.store
+ i32.const 0 i64.const 1 i64.atomic.rmw16_u.xchg)
+
+ (func (export "i64.atomic.rmw16_u.xchg-memory") (result i64)
+ i32.const 0 i64.const 10000000000 i64.store
+ i32.const 0 i64.const 1 i64.atomic.rmw16_u.xchg drop
+ i32.const 0 i64.load16_u)
+
+ (func (export "i64.atomic.rmw32_u.xchg-result") (result i64)
+ i32.const 0 i64.const 10000000000 i64.store
+ i32.const 0 i64.const 1 i64.atomic.rmw32_u.xchg)
+
+ (func (export "i64.atomic.rmw32_u.xchg-memory") (result i64)
+ i32.const 0 i64.const 10000000000 i64.store
+ i32.const 0 i64.const 1 i64.atomic.rmw32_u.xchg drop
+ i32.const 0 i64.load32_u)
+
+ (func (export "i64.atomic.rmw.xchg-result") (result i64)
+ i32.const 0 i64.const 10000000000 i64.store
+ i32.const 0 i64.const 1 i64.atomic.rmw.xchg)
+
+ (func (export "i64.atomic.rmw.xchg-memory") (result i64)
+ i32.const 0 i64.const 10000000000 i64.store
+ i32.const 0 i64.const 1 i64.atomic.rmw.xchg drop
+ i32.const 0 i64.load)
+
+
+ ;; Test bad alignment
+
+ (func (export "bad_align-i32.atomic.rmw16_u.xchg")
+ i32.const 1 i32.const 0 i32.atomic.rmw16_u.xchg drop)
+ (func (export "bad_align-i32.atomic.rmw.xchg")
+ i32.const 2 i32.const 0 i32.atomic.rmw.xchg drop)
+
+ (func (export "bad_align-i64.atomic.rmw16_u.xchg")
+ i32.const 1 i64.const 0 i64.atomic.rmw16_u.xchg drop)
+ (func (export "bad_align-i64.atomic.rmw32_u.xchg")
+ i32.const 2 i64.const 0 i64.atomic.rmw32_u.xchg drop)
+ (func (export "bad_align-i64.atomic.rmw.xchg")
+ i32.const 4 i64.const 0 i64.atomic.rmw.xchg drop)
+
+)
+(;; STDOUT ;;;
+i32.atomic.rmw8_u.xchg-result() => i32:64
+i32.atomic.rmw8_u.xchg-memory() => i32:1
+i32.atomic.rmw16_u.xchg-result() => i32:16960
+i32.atomic.rmw16_u.xchg-memory() => i32:1
+i32.atomic.rmw.xchg-result() => i32:1000000
+i32.atomic.rmw.xchg-memory() => i32:1
+i64.atomic.rmw8_u.xchg-result() => i64:0
+i64.atomic.rmw8_u.xchg-memory() => i64:1
+i64.atomic.rmw16_u.xchg-result() => i64:58368
+i64.atomic.rmw16_u.xchg-memory() => i64:1
+i64.atomic.rmw32_u.xchg-result() => i64:1410065408
+i64.atomic.rmw32_u.xchg-memory() => i64:1
+i64.atomic.rmw.xchg-result() => i64:10000000000
+i64.atomic.rmw.xchg-memory() => i64:1
+bad_align-i32.atomic.rmw16_u.xchg() => error: atomic memory access is unaligned
+bad_align-i32.atomic.rmw.xchg() => error: atomic memory access is unaligned
+bad_align-i64.atomic.rmw16_u.xchg() => error: atomic memory access is unaligned
+bad_align-i64.atomic.rmw32_u.xchg() => error: atomic memory access is unaligned
+bad_align-i64.atomic.rmw.xchg() => error: atomic memory access is unaligned
+;;; STDOUT ;;)
diff --git a/test/interp/atomic-rmw-xor.txt b/test/interp/atomic-rmw-xor.txt
new file mode 100644
index 00000000..58352200
--- /dev/null
+++ b/test/interp/atomic-rmw-xor.txt
@@ -0,0 +1,110 @@
+;;; TOOL: run-interp
+;;; FLAGS: --enable-threads
+(module
+ (memory 1)
+
+ ;; i32
+
+ (func (export "i32.atomic.rmw8_u.xor-result") (result i32)
+ i32.const 0 i32.const 1000000 i32.store
+ i32.const 0 i32.const 65 i32.atomic.rmw8_u.xor)
+
+ (func (export "i32.atomic.rmw8_u.xor-memory") (result i32)
+ i32.const 0 i32.const 1000000 i32.store
+ i32.const 0 i32.const 65 i32.atomic.rmw8_u.xor drop
+ i32.const 0 i32.load8_u)
+
+ (func (export "i32.atomic.rmw16_u.xor-result") (result i32)
+ i32.const 0 i32.const 1000000 i32.store
+ i32.const 0 i32.const 65 i32.atomic.rmw16_u.xor)
+
+ (func (export "i32.atomic.rmw16_u.xor-memory") (result i32)
+ i32.const 0 i32.const 1000000 i32.store
+ i32.const 0 i32.const 65 i32.atomic.rmw16_u.xor drop
+ i32.const 0 i32.load16_u)
+
+ (func (export "i32.atomic.rmw.xor-result") (result i32)
+ i32.const 0 i32.const 1000000 i32.store
+ i32.const 0 i32.const 65 i32.atomic.rmw.xor)
+
+ (func (export "i32.atomic.rmw.xor-memory") (result i32)
+ i32.const 0 i32.const 1000000 i32.store
+ i32.const 0 i32.const 65 i32.atomic.rmw.xor drop
+ i32.const 0 i32.load)
+
+
+ ;; i64
+
+ (func (export "i64.atomic.rmw8_u.xor-result") (result i64)
+ i32.const 0 i64.const 10000000000 i64.store
+ i32.const 0 i64.const 65 i64.atomic.rmw8_u.xor)
+
+ (func (export "i64.atomic.rmw8_u.xor-memory") (result i64)
+ i32.const 0 i64.const 10000000000 i64.store
+ i32.const 0 i64.const 65 i64.atomic.rmw8_u.xor drop
+ i32.const 0 i64.load8_u)
+
+ (func (export "i64.atomic.rmw16_u.xor-result") (result i64)
+ i32.const 0 i64.const 10000000000 i64.store
+ i32.const 0 i64.const 1025 i64.atomic.rmw16_u.xor)
+
+ (func (export "i64.atomic.rmw16_u.xor-memory") (result i64)
+ i32.const 0 i64.const 10000000000 i64.store
+ i32.const 0 i64.const 1025 i64.atomic.rmw16_u.xor drop
+ i32.const 0 i64.load16_u)
+
+ (func (export "i64.atomic.rmw32_u.xor-result") (result i64)
+ i32.const 0 i64.const 10000000000 i64.store
+ i32.const 0 i64.const 1025 i64.atomic.rmw32_u.xor)
+
+ (func (export "i64.atomic.rmw32_u.xor-memory") (result i64)
+ i32.const 0 i64.const 10000000000 i64.store
+ i32.const 0 i64.const 1025 i64.atomic.rmw32_u.xor drop
+ i32.const 0 i64.load32_u)
+
+ (func (export "i64.atomic.rmw.xor-result") (result i64)
+ i32.const 0 i64.const 10000000000 i64.store
+ i32.const 0 i64.const 1025 i64.atomic.rmw.xor)
+
+ (func (export "i64.atomic.rmw.xor-memory") (result i64)
+ i32.const 0 i64.const 10000000000 i64.store
+ i32.const 0 i64.const 1025 i64.atomic.rmw.xor drop
+ i32.const 0 i64.load)
+
+
+ ;; Test bad alignment
+
+ (func (export "bad_align-i32.atomic.rmw16_u.xor")
+ i32.const 1 i32.const 0 i32.atomic.rmw16_u.xor drop)
+ (func (export "bad_align-i32.atomic.rmw.xor")
+ i32.const 2 i32.const 0 i32.atomic.rmw.xor drop)
+
+ (func (export "bad_align-i64.atomic.rmw16_u.xor")
+ i32.const 1 i64.const 0 i64.atomic.rmw16_u.xor drop)
+ (func (export "bad_align-i64.atomic.rmw32_u.xor")
+ i32.const 2 i64.const 0 i64.atomic.rmw32_u.xor drop)
+ (func (export "bad_align-i64.atomic.rmw.xor")
+ i32.const 4 i64.const 0 i64.atomic.rmw.xor drop)
+
+)
+(;; STDOUT ;;;
+i32.atomic.rmw8_u.xor-result() => i32:64
+i32.atomic.rmw8_u.xor-memory() => i32:1
+i32.atomic.rmw16_u.xor-result() => i32:16960
+i32.atomic.rmw16_u.xor-memory() => i32:16897
+i32.atomic.rmw.xor-result() => i32:1000000
+i32.atomic.rmw.xor-memory() => i32:999937
+i64.atomic.rmw8_u.xor-result() => i64:0
+i64.atomic.rmw8_u.xor-memory() => i64:65
+i64.atomic.rmw16_u.xor-result() => i64:58368
+i64.atomic.rmw16_u.xor-memory() => i64:57345
+i64.atomic.rmw32_u.xor-result() => i64:1410065408
+i64.atomic.rmw32_u.xor-memory() => i64:1410064385
+i64.atomic.rmw.xor-result() => i64:10000000000
+i64.atomic.rmw.xor-memory() => i64:9999998977
+bad_align-i32.atomic.rmw16_u.xor() => error: atomic memory access is unaligned
+bad_align-i32.atomic.rmw.xor() => error: atomic memory access is unaligned
+bad_align-i64.atomic.rmw16_u.xor() => error: atomic memory access is unaligned
+bad_align-i64.atomic.rmw32_u.xor() => error: atomic memory access is unaligned
+bad_align-i64.atomic.rmw.xor() => error: atomic memory access is unaligned
+;;; STDOUT ;;)
diff --git a/test/interp/atomic-store.txt b/test/interp/atomic-store.txt
new file mode 100644
index 00000000..f4a60050
--- /dev/null
+++ b/test/interp/atomic-store.txt
@@ -0,0 +1,70 @@
+;;; TOOL: run-interp
+;;; FLAGS: --enable-threads
+(module
+ (memory 1)
+
+ (func (export "i32.atomic.store8") (result i32)
+ i32.const 0 i32.const 0xfb i32.atomic.store8
+ i32.const 1 i32.const 0xfc i32.atomic.store8
+ i32.const 2 i32.const 0xfd i32.atomic.store8
+ i32.const 3 i32.const 0xfe i32.atomic.store8
+ i32.const 0 i32.load)
+
+ (func (export "i32.atomic.store16") (result i32)
+ i32.const 0 i32.const 0xcac9 i32.atomic.store16
+ i32.const 2 i32.const 0xcccb i32.atomic.store16
+ i32.const 0 i32.load)
+
+ (func (export "i32.atomic.store") (result i32)
+ i32.const 0 i32.const -123456 i32.atomic.store
+ i32.const 0 i32.load)
+
+ (func (export "i64.atomic.store8") (result i32)
+ i32.const 0 i64.const 0xeeeeeeeeeeeeeefb i64.atomic.store8
+ i32.const 1 i64.const 0xeeeeeeeeeeeeeefc i64.atomic.store8
+ i32.const 2 i64.const 0xeeeeeeeeeeeeeefd i64.atomic.store8
+ i32.const 3 i64.const 0xeeeeeeeeeeeeeefe i64.atomic.store8
+ i32.const 0 i32.load)
+
+ (func (export "i64.atomic.store16") (result i32)
+ i32.const 0 i64.const 0xeeeeeeeeeeeecac9 i64.atomic.store16
+ i32.const 2 i64.const 0xeeeeeeeeeeeecccb i64.atomic.store16
+ i32.const 0 i32.load)
+
+ (func (export "i64.atomic.store32") (result i32)
+ i32.const 0 i64.const -123456 i64.atomic.store32
+ i32.const 0 i32.load)
+
+ (func (export "i64.atomic.store") (result i64)
+ i32.const 0 i64.const 0xbaddc0de600dd00d i64.atomic.store
+ i32.const 0 i64.load)
+
+ ;; Test bad alignment
+
+ (func (export "bad.align-i32.atomic.store16")
+ i32.const 1 i32.const 0 i32.atomic.store16)
+ (func (export "bad.align-i32.atomic.store")
+ i32.const 2 i32.const 0 i32.atomic.store)
+
+ (func (export "bad.align-i64.atomic.store16")
+ i32.const 1 i64.const 0 i64.atomic.store16)
+ (func (export "bad.align-i64.atomic.store32")
+ i32.const 2 i64.const 0 i64.atomic.store32)
+ (func (export "bad.align-i64.atomic.store")
+ i32.const 4 i64.const 0 i64.atomic.store)
+
+)
+(;; STDOUT ;;;
+i32.atomic.store8() => i32:4278058235
+i32.atomic.store16() => i32:3435907785
+i32.atomic.store() => i32:4294843840
+i64.atomic.store8() => i32:4278058235
+i64.atomic.store16() => i32:3435907785
+i64.atomic.store32() => i32:4294843840
+i64.atomic.store() => i64:13465130522234441741
+bad.align-i32.atomic.store16() => error: atomic memory access is unaligned
+bad.align-i32.atomic.store() => error: atomic memory access is unaligned
+bad.align-i64.atomic.store16() => error: atomic memory access is unaligned
+bad.align-i64.atomic.store32() => error: atomic memory access is unaligned
+bad.align-i64.atomic.store() => error: atomic memory access is unaligned
+;;; STDOUT ;;)
diff --git a/test/parse/expr/atomic-align.txt b/test/parse/expr/atomic-align.txt
new file mode 100644
index 00000000..fc671ad4
--- /dev/null
+++ b/test/parse/expr/atomic-align.txt
@@ -0,0 +1,77 @@
+;;; FLAGS: --enable-threads
+(module
+ (memory 1)
+ (func
+ i32.const 0 i32.atomic.load align=4 drop
+ i32.const 0 i64.atomic.load align=8 drop
+ i32.const 0 i32.atomic.load8_u align=1 drop
+ i32.const 0 i32.atomic.load16_u align=2 drop
+ i32.const 0 i64.atomic.load8_u align=1 drop
+ i32.const 0 i64.atomic.load16_u align=2 drop
+ i32.const 0 i64.atomic.load32_u align=4 drop
+
+ i32.const 0 i32.const 0 i32.atomic.store align=4
+ i32.const 0 i64.const 0 i64.atomic.store align=8
+ i32.const 0 i32.const 0 i32.atomic.store8 align=1
+ i32.const 0 i32.const 0 i32.atomic.store16 align=2
+ i32.const 0 i64.const 0 i64.atomic.store8 align=1
+ i32.const 0 i64.const 0 i64.atomic.store16 align=2
+ i32.const 0 i64.const 0 i64.atomic.store32 align=4
+
+ i32.const 0 i32.const 0 i32.atomic.rmw.add align=4 drop
+ i32.const 0 i64.const 0 i64.atomic.rmw.add align=8 drop
+ i32.const 0 i32.const 0 i32.atomic.rmw8_u.add align=1 drop
+ i32.const 0 i32.const 0 i32.atomic.rmw16_u.add align=2 drop
+ i32.const 0 i64.const 0 i64.atomic.rmw8_u.add align=1 drop
+ i32.const 0 i64.const 0 i64.atomic.rmw16_u.add align=2 drop
+ i32.const 0 i64.const 0 i64.atomic.rmw32_u.add align=4 drop
+
+ i32.const 0 i32.const 0 i32.atomic.rmw.sub align=4 drop
+ i32.const 0 i64.const 0 i64.atomic.rmw.sub align=8 drop
+ i32.const 0 i32.const 0 i32.atomic.rmw8_u.sub align=1 drop
+ i32.const 0 i32.const 0 i32.atomic.rmw16_u.sub align=2 drop
+ i32.const 0 i64.const 0 i64.atomic.rmw8_u.sub align=1 drop
+ i32.const 0 i64.const 0 i64.atomic.rmw16_u.sub align=2 drop
+ i32.const 0 i64.const 0 i64.atomic.rmw32_u.sub align=4 drop
+
+ i32.const 0 i32.const 0 i32.atomic.rmw.and align=4 drop
+ i32.const 0 i64.const 0 i64.atomic.rmw.and align=8 drop
+ i32.const 0 i32.const 0 i32.atomic.rmw8_u.and align=1 drop
+ i32.const 0 i32.const 0 i32.atomic.rmw16_u.and align=2 drop
+ i32.const 0 i64.const 0 i64.atomic.rmw8_u.and align=1 drop
+ i32.const 0 i64.const 0 i64.atomic.rmw16_u.and align=2 drop
+ i32.const 0 i64.const 0 i64.atomic.rmw32_u.and align=4 drop
+
+ i32.const 0 i32.const 0 i32.atomic.rmw.or align=4 drop
+ i32.const 0 i64.const 0 i64.atomic.rmw.or align=8 drop
+ i32.const 0 i32.const 0 i32.atomic.rmw8_u.or align=1 drop
+ i32.const 0 i32.const 0 i32.atomic.rmw16_u.or align=2 drop
+ i32.const 0 i64.const 0 i64.atomic.rmw8_u.or align=1 drop
+ i32.const 0 i64.const 0 i64.atomic.rmw16_u.or align=2 drop
+ i32.const 0 i64.const 0 i64.atomic.rmw32_u.or align=4 drop
+
+ i32.const 0 i32.const 0 i32.atomic.rmw.xor align=4 drop
+ i32.const 0 i64.const 0 i64.atomic.rmw.xor align=8 drop
+ i32.const 0 i32.const 0 i32.atomic.rmw8_u.xor align=1 drop
+ i32.const 0 i32.const 0 i32.atomic.rmw16_u.xor align=2 drop
+ i32.const 0 i64.const 0 i64.atomic.rmw8_u.xor align=1 drop
+ i32.const 0 i64.const 0 i64.atomic.rmw16_u.xor align=2 drop
+ i32.const 0 i64.const 0 i64.atomic.rmw32_u.xor align=4 drop
+
+ i32.const 0 i32.const 0 i32.atomic.rmw.xchg align=4 drop
+ i32.const 0 i64.const 0 i64.atomic.rmw.xchg align=8 drop
+ i32.const 0 i32.const 0 i32.atomic.rmw8_u.xchg align=1 drop
+ i32.const 0 i32.const 0 i32.atomic.rmw16_u.xchg align=2 drop
+ i32.const 0 i64.const 0 i64.atomic.rmw8_u.xchg align=1 drop
+ i32.const 0 i64.const 0 i64.atomic.rmw16_u.xchg align=2 drop
+ i32.const 0 i64.const 0 i64.atomic.rmw32_u.xchg align=4 drop
+
+ i32.const 0 i32.const 0 i32.const 0 i32.atomic.rmw.cmpxchg align=4 drop
+ i32.const 0 i64.const 0 i64.const 0 i64.atomic.rmw.cmpxchg align=8 drop
+ i32.const 0 i32.const 0 i32.const 0 i32.atomic.rmw8_u.cmpxchg align=1 drop
+ i32.const 0 i32.const 0 i32.const 0 i32.atomic.rmw16_u.cmpxchg align=2 drop
+ i32.const 0 i64.const 0 i64.const 0 i64.atomic.rmw8_u.cmpxchg align=1 drop
+ i32.const 0 i64.const 0 i64.const 0 i64.atomic.rmw16_u.cmpxchg align=2 drop
+ i32.const 0 i64.const 0 i64.const 0 i64.atomic.rmw32_u.cmpxchg align=4 drop
+
+))
diff --git a/test/parse/expr/atomic-disabled.txt b/test/parse/expr/atomic-disabled.txt
new file mode 100644
index 00000000..43124dfe
--- /dev/null
+++ b/test/parse/expr/atomic-disabled.txt
@@ -0,0 +1,269 @@
+;;; ERROR: 1
+
+(module
+ (memory 1)
+ (func
+ i32.const 0 i32.atomic.load drop
+ i32.const 0 i64.atomic.load drop
+ i32.const 0 i32.atomic.load8_u drop
+ i32.const 0 i32.atomic.load16_u drop
+ i32.const 0 i64.atomic.load8_u drop
+ i32.const 0 i64.atomic.load16_u drop
+ i32.const 0 i64.atomic.load32_u drop
+
+ i32.const 0 i32.const 0 i32.atomic.store
+ i32.const 0 i64.const 0 i64.atomic.store
+ i32.const 0 i32.const 0 i32.atomic.store8
+ i32.const 0 i32.const 0 i32.atomic.store16
+ i32.const 0 i64.const 0 i64.atomic.store8
+ i32.const 0 i64.const 0 i64.atomic.store16
+ i32.const 0 i64.const 0 i64.atomic.store32
+
+ i32.const 0 i32.const 0 i32.atomic.rmw.add drop
+ i32.const 0 i64.const 0 i64.atomic.rmw.add drop
+ i32.const 0 i32.const 0 i32.atomic.rmw8_u.add drop
+ i32.const 0 i32.const 0 i32.atomic.rmw16_u.add drop
+ i32.const 0 i64.const 0 i64.atomic.rmw8_u.add drop
+ i32.const 0 i64.const 0 i64.atomic.rmw16_u.add drop
+ i32.const 0 i64.const 0 i64.atomic.rmw32_u.add drop
+
+ i32.const 0 i32.const 0 i32.atomic.rmw.sub drop
+ i32.const 0 i64.const 0 i64.atomic.rmw.sub drop
+ i32.const 0 i32.const 0 i32.atomic.rmw8_u.sub drop
+ i32.const 0 i32.const 0 i32.atomic.rmw16_u.sub drop
+ i32.const 0 i64.const 0 i64.atomic.rmw8_u.sub drop
+ i32.const 0 i64.const 0 i64.atomic.rmw16_u.sub drop
+ i32.const 0 i64.const 0 i64.atomic.rmw32_u.sub drop
+
+ i32.const 0 i32.const 0 i32.atomic.rmw.and drop
+ i32.const 0 i64.const 0 i64.atomic.rmw.and drop
+ i32.const 0 i32.const 0 i32.atomic.rmw8_u.and drop
+ i32.const 0 i32.const 0 i32.atomic.rmw16_u.and drop
+ i32.const 0 i64.const 0 i64.atomic.rmw8_u.and drop
+ i32.const 0 i64.const 0 i64.atomic.rmw16_u.and drop
+ i32.const 0 i64.const 0 i64.atomic.rmw32_u.and drop
+
+ i32.const 0 i32.const 0 i32.atomic.rmw.or drop
+ i32.const 0 i64.const 0 i64.atomic.rmw.or drop
+ i32.const 0 i32.const 0 i32.atomic.rmw8_u.or drop
+ i32.const 0 i32.const 0 i32.atomic.rmw16_u.or drop
+ i32.const 0 i64.const 0 i64.atomic.rmw8_u.or drop
+ i32.const 0 i64.const 0 i64.atomic.rmw16_u.or drop
+ i32.const 0 i64.const 0 i64.atomic.rmw32_u.or drop
+
+ i32.const 0 i32.const 0 i32.atomic.rmw.xor drop
+ i32.const 0 i64.const 0 i64.atomic.rmw.xor drop
+ i32.const 0 i32.const 0 i32.atomic.rmw8_u.xor drop
+ i32.const 0 i32.const 0 i32.atomic.rmw16_u.xor drop
+ i32.const 0 i64.const 0 i64.atomic.rmw8_u.xor drop
+ i32.const 0 i64.const 0 i64.atomic.rmw16_u.xor drop
+ i32.const 0 i64.const 0 i64.atomic.rmw32_u.xor drop
+
+ i32.const 0 i32.const 0 i32.atomic.rmw.xchg drop
+ i32.const 0 i64.const 0 i64.atomic.rmw.xchg drop
+ i32.const 0 i32.const 0 i32.atomic.rmw8_u.xchg drop
+ i32.const 0 i32.const 0 i32.atomic.rmw16_u.xchg drop
+ i32.const 0 i64.const 0 i64.atomic.rmw8_u.xchg drop
+ i32.const 0 i64.const 0 i64.atomic.rmw16_u.xchg drop
+ i32.const 0 i64.const 0 i64.atomic.rmw32_u.xchg drop
+
+ i32.const 0 i32.const 0 i32.const 0 i32.atomic.rmw.cmpxchg drop
+ i32.const 0 i64.const 0 i64.const 0 i64.atomic.rmw.cmpxchg drop
+ i32.const 0 i32.const 0 i32.const 0 i32.atomic.rmw8_u.cmpxchg drop
+ i32.const 0 i32.const 0 i32.const 0 i32.atomic.rmw16_u.cmpxchg drop
+ i32.const 0 i64.const 0 i64.const 0 i64.atomic.rmw8_u.cmpxchg drop
+ i32.const 0 i64.const 0 i64.const 0 i64.atomic.rmw16_u.cmpxchg drop
+ i32.const 0 i64.const 0 i64.const 0 i64.atomic.rmw32_u.cmpxchg drop
+
+))
+(;; STDERR ;;;
+out/test/parse/expr/atomic-disabled.txt:6:17: error: opcode not allowed: i32.atomic.load
+ i32.const 0 i32.atomic.load drop
+ ^^^^^^^^^^^^^^^
+out/test/parse/expr/atomic-disabled.txt:7:17: error: opcode not allowed: i64.atomic.load
+ i32.const 0 i64.atomic.load drop
+ ^^^^^^^^^^^^^^^
+out/test/parse/expr/atomic-disabled.txt:8:17: error: opcode not allowed: i32.atomic.load8_u
+ i32.const 0 i32.atomic.load8_u drop
+ ^^^^^^^^^^^^^^^^^^
+out/test/parse/expr/atomic-disabled.txt:9:17: error: opcode not allowed: i32.atomic.load16_u
+ i32.const 0 i32.atomic.load16_u drop
+ ^^^^^^^^^^^^^^^^^^^
+out/test/parse/expr/atomic-disabled.txt:10:17: error: opcode not allowed: i64.atomic.load8_u
+ i32.const 0 i64.atomic.load8_u drop
+ ^^^^^^^^^^^^^^^^^^
+out/test/parse/expr/atomic-disabled.txt:11:17: error: opcode not allowed: i64.atomic.load16_u
+ i32.const 0 i64.atomic.load16_u drop
+ ^^^^^^^^^^^^^^^^^^^
+out/test/parse/expr/atomic-disabled.txt:12:17: error: opcode not allowed: i64.atomic.load32_u
+ i32.const 0 i64.atomic.load32_u drop
+ ^^^^^^^^^^^^^^^^^^^
+out/test/parse/expr/atomic-disabled.txt:14:29: error: opcode not allowed: i32.atomic.store
+ i32.const 0 i32.const 0 i32.atomic.store
+ ^^^^^^^^^^^^^^^^
+out/test/parse/expr/atomic-disabled.txt:15:29: error: opcode not allowed: i64.atomic.store
+ i32.const 0 i64.const 0 i64.atomic.store
+ ^^^^^^^^^^^^^^^^
+out/test/parse/expr/atomic-disabled.txt:16:29: error: opcode not allowed: i32.atomic.store8
+ i32.const 0 i32.const 0 i32.atomic.store8
+ ^^^^^^^^^^^^^^^^^
+out/test/parse/expr/atomic-disabled.txt:17:29: error: opcode not allowed: i32.atomic.store16
+ i32.const 0 i32.const 0 i32.atomic.store16
+ ^^^^^^^^^^^^^^^^^^
+out/test/parse/expr/atomic-disabled.txt:18:29: error: opcode not allowed: i64.atomic.store8
+ i32.const 0 i64.const 0 i64.atomic.store8
+ ^^^^^^^^^^^^^^^^^
+out/test/parse/expr/atomic-disabled.txt:19:29: error: opcode not allowed: i64.atomic.store16
+ i32.const 0 i64.const 0 i64.atomic.store16
+ ^^^^^^^^^^^^^^^^^^
+out/test/parse/expr/atomic-disabled.txt:20:29: error: opcode not allowed: i64.atomic.store32
+ i32.const 0 i64.const 0 i64.atomic.store32
+ ^^^^^^^^^^^^^^^^^^
+out/test/parse/expr/atomic-disabled.txt:22:29: error: opcode not allowed: i32.atomic.rmw.add
+ i32.const 0 i32.const 0 i32.atomic.rmw.add drop
+ ^^^^^^^^^^^^^^^^^^
+out/test/parse/expr/atomic-disabled.txt:23:29: error: opcode not allowed: i64.atomic.rmw.add
+ i32.const 0 i64.const 0 i64.atomic.rmw.add drop
+ ^^^^^^^^^^^^^^^^^^
+out/test/parse/expr/atomic-disabled.txt:24:29: error: opcode not allowed: i32.atomic.rmw8_u.add
+ i32.const 0 i32.const 0 i32.atomic.rmw8_u.add drop
+ ^^^^^^^^^^^^^^^^^^^^^
+out/test/parse/expr/atomic-disabled.txt:25:29: error: opcode not allowed: i32.atomic.rmw16_u.add
+ i32.const 0 i32.const 0 i32.atomic.rmw16_u.add drop
+ ^^^^^^^^^^^^^^^^^^^^^^
+out/test/parse/expr/atomic-disabled.txt:26:29: error: opcode not allowed: i64.atomic.rmw8_u.add
+ i32.const 0 i64.const 0 i64.atomic.rmw8_u.add drop
+ ^^^^^^^^^^^^^^^^^^^^^
+out/test/parse/expr/atomic-disabled.txt:27:29: error: opcode not allowed: i64.atomic.rmw16_u.add
+ i32.const 0 i64.const 0 i64.atomic.rmw16_u.add drop
+ ^^^^^^^^^^^^^^^^^^^^^^
+out/test/parse/expr/atomic-disabled.txt:28:29: error: opcode not allowed: i64.atomic.rmw32_u.add
+ i32.const 0 i64.const 0 i64.atomic.rmw32_u.add drop
+ ^^^^^^^^^^^^^^^^^^^^^^
+out/test/parse/expr/atomic-disabled.txt:30:29: error: opcode not allowed: i32.atomic.rmw.sub
+ i32.const 0 i32.const 0 i32.atomic.rmw.sub drop
+ ^^^^^^^^^^^^^^^^^^
+out/test/parse/expr/atomic-disabled.txt:31:29: error: opcode not allowed: i64.atomic.rmw.sub
+ i32.const 0 i64.const 0 i64.atomic.rmw.sub drop
+ ^^^^^^^^^^^^^^^^^^
+out/test/parse/expr/atomic-disabled.txt:32:29: error: opcode not allowed: i32.atomic.rmw8_u.sub
+ i32.const 0 i32.const 0 i32.atomic.rmw8_u.sub drop
+ ^^^^^^^^^^^^^^^^^^^^^
+out/test/parse/expr/atomic-disabled.txt:33:29: error: opcode not allowed: i32.atomic.rmw16_u.sub
+ i32.const 0 i32.const 0 i32.atomic.rmw16_u.sub drop
+ ^^^^^^^^^^^^^^^^^^^^^^
+out/test/parse/expr/atomic-disabled.txt:34:29: error: opcode not allowed: i64.atomic.rmw8_u.sub
+ i32.const 0 i64.const 0 i64.atomic.rmw8_u.sub drop
+ ^^^^^^^^^^^^^^^^^^^^^
+out/test/parse/expr/atomic-disabled.txt:35:29: error: opcode not allowed: i64.atomic.rmw16_u.sub
+ i32.const 0 i64.const 0 i64.atomic.rmw16_u.sub drop
+ ^^^^^^^^^^^^^^^^^^^^^^
+out/test/parse/expr/atomic-disabled.txt:36:29: error: opcode not allowed: i64.atomic.rmw32_u.sub
+ i32.const 0 i64.const 0 i64.atomic.rmw32_u.sub drop
+ ^^^^^^^^^^^^^^^^^^^^^^
+out/test/parse/expr/atomic-disabled.txt:38:29: error: opcode not allowed: i32.atomic.rmw.and
+ i32.const 0 i32.const 0 i32.atomic.rmw.and drop
+ ^^^^^^^^^^^^^^^^^^
+out/test/parse/expr/atomic-disabled.txt:39:29: error: opcode not allowed: i64.atomic.rmw.and
+ i32.const 0 i64.const 0 i64.atomic.rmw.and drop
+ ^^^^^^^^^^^^^^^^^^
+out/test/parse/expr/atomic-disabled.txt:40:29: error: opcode not allowed: i32.atomic.rmw8_u.and
+ i32.const 0 i32.const 0 i32.atomic.rmw8_u.and drop
+ ^^^^^^^^^^^^^^^^^^^^^
+out/test/parse/expr/atomic-disabled.txt:41:29: error: opcode not allowed: i32.atomic.rmw16_u.and
+ i32.const 0 i32.const 0 i32.atomic.rmw16_u.and drop
+ ^^^^^^^^^^^^^^^^^^^^^^
+out/test/parse/expr/atomic-disabled.txt:42:29: error: opcode not allowed: i64.atomic.rmw8_u.and
+ i32.const 0 i64.const 0 i64.atomic.rmw8_u.and drop
+ ^^^^^^^^^^^^^^^^^^^^^
+out/test/parse/expr/atomic-disabled.txt:43:29: error: opcode not allowed: i64.atomic.rmw16_u.and
+ i32.const 0 i64.const 0 i64.atomic.rmw16_u.and drop
+ ^^^^^^^^^^^^^^^^^^^^^^
+out/test/parse/expr/atomic-disabled.txt:44:29: error: opcode not allowed: i64.atomic.rmw32_u.and
+ i32.const 0 i64.const 0 i64.atomic.rmw32_u.and drop
+ ^^^^^^^^^^^^^^^^^^^^^^
+out/test/parse/expr/atomic-disabled.txt:46:29: error: opcode not allowed: i32.atomic.rmw.or
+ i32.const 0 i32.const 0 i32.atomic.rmw.or drop
+ ^^^^^^^^^^^^^^^^^
+out/test/parse/expr/atomic-disabled.txt:47:29: error: opcode not allowed: i64.atomic.rmw.or
+ i32.const 0 i64.const 0 i64.atomic.rmw.or drop
+ ^^^^^^^^^^^^^^^^^
+out/test/parse/expr/atomic-disabled.txt:48:29: error: opcode not allowed: i32.atomic.rmw8_u.or
+ i32.const 0 i32.const 0 i32.atomic.rmw8_u.or drop
+ ^^^^^^^^^^^^^^^^^^^^
+out/test/parse/expr/atomic-disabled.txt:49:29: error: opcode not allowed: i32.atomic.rmw16_u.or
+ i32.const 0 i32.const 0 i32.atomic.rmw16_u.or drop
+ ^^^^^^^^^^^^^^^^^^^^^
+out/test/parse/expr/atomic-disabled.txt:50:29: error: opcode not allowed: i64.atomic.rmw8_u.or
+ i32.const 0 i64.const 0 i64.atomic.rmw8_u.or drop
+ ^^^^^^^^^^^^^^^^^^^^
+out/test/parse/expr/atomic-disabled.txt:51:29: error: opcode not allowed: i64.atomic.rmw16_u.or
+ i32.const 0 i64.const 0 i64.atomic.rmw16_u.or drop
+ ^^^^^^^^^^^^^^^^^^^^^
+out/test/parse/expr/atomic-disabled.txt:52:29: error: opcode not allowed: i64.atomic.rmw32_u.or
+ i32.const 0 i64.const 0 i64.atomic.rmw32_u.or drop
+ ^^^^^^^^^^^^^^^^^^^^^
+out/test/parse/expr/atomic-disabled.txt:54:29: error: opcode not allowed: i32.atomic.rmw.xor
+ i32.const 0 i32.const 0 i32.atomic.rmw.xor drop
+ ^^^^^^^^^^^^^^^^^^
+out/test/parse/expr/atomic-disabled.txt:55:29: error: opcode not allowed: i64.atomic.rmw.xor
+ i32.const 0 i64.const 0 i64.atomic.rmw.xor drop
+ ^^^^^^^^^^^^^^^^^^
+out/test/parse/expr/atomic-disabled.txt:56:29: error: opcode not allowed: i32.atomic.rmw8_u.xor
+ i32.const 0 i32.const 0 i32.atomic.rmw8_u.xor drop
+ ^^^^^^^^^^^^^^^^^^^^^
+out/test/parse/expr/atomic-disabled.txt:57:29: error: opcode not allowed: i32.atomic.rmw16_u.xor
+ i32.const 0 i32.const 0 i32.atomic.rmw16_u.xor drop
+ ^^^^^^^^^^^^^^^^^^^^^^
+out/test/parse/expr/atomic-disabled.txt:58:29: error: opcode not allowed: i64.atomic.rmw8_u.xor
+ i32.const 0 i64.const 0 i64.atomic.rmw8_u.xor drop
+ ^^^^^^^^^^^^^^^^^^^^^
+out/test/parse/expr/atomic-disabled.txt:59:29: error: opcode not allowed: i64.atomic.rmw16_u.xor
+ i32.const 0 i64.const 0 i64.atomic.rmw16_u.xor drop
+ ^^^^^^^^^^^^^^^^^^^^^^
+out/test/parse/expr/atomic-disabled.txt:60:29: error: opcode not allowed: i64.atomic.rmw32_u.xor
+ i32.const 0 i64.const 0 i64.atomic.rmw32_u.xor drop
+ ^^^^^^^^^^^^^^^^^^^^^^
+out/test/parse/expr/atomic-disabled.txt:62:29: error: opcode not allowed: i32.atomic.rmw.xchg
+ i32.const 0 i32.const 0 i32.atomic.rmw.xchg drop
+ ^^^^^^^^^^^^^^^^^^^
+out/test/parse/expr/atomic-disabled.txt:63:29: error: opcode not allowed: i64.atomic.rmw.xchg
+ i32.const 0 i64.const 0 i64.atomic.rmw.xchg drop
+ ^^^^^^^^^^^^^^^^^^^
+out/test/parse/expr/atomic-disabled.txt:64:29: error: opcode not allowed: i32.atomic.rmw8_u.xchg
+ i32.const 0 i32.const 0 i32.atomic.rmw8_u.xchg drop
+ ^^^^^^^^^^^^^^^^^^^^^^
+out/test/parse/expr/atomic-disabled.txt:65:29: error: opcode not allowed: i32.atomic.rmw16_u.xchg
+ i32.const 0 i32.const 0 i32.atomic.rmw16_u.xchg drop
+ ^^^^^^^^^^^^^^^^^^^^^^^
+out/test/parse/expr/atomic-disabled.txt:66:29: error: opcode not allowed: i64.atomic.rmw8_u.xchg
+ i32.const 0 i64.const 0 i64.atomic.rmw8_u.xchg drop
+ ^^^^^^^^^^^^^^^^^^^^^^
+out/test/parse/expr/atomic-disabled.txt:67:29: error: opcode not allowed: i64.atomic.rmw16_u.xchg
+ i32.const 0 i64.const 0 i64.atomic.rmw16_u.xchg drop
+ ^^^^^^^^^^^^^^^^^^^^^^^
+out/test/parse/expr/atomic-disabled.txt:68:29: error: opcode not allowed: i64.atomic.rmw32_u.xchg
+ i32.const 0 i64.const 0 i64.atomic.rmw32_u.xchg drop
+ ^^^^^^^^^^^^^^^^^^^^^^^
+out/test/parse/expr/atomic-disabled.txt:70:41: error: opcode not allowed: i32.atomic.rmw.cmpxchg
+ i32.const 0 i32.const 0 i32.const 0 i32.atomic.rmw.cmpxchg drop
+ ^^^^^^^^^^^^^^^^^^^^^^
+out/test/parse/expr/atomic-disabled.txt:71:41: error: opcode not allowed: i64.atomic.rmw.cmpxchg
+ i32.const 0 i64.const 0 i64.const 0 i64.atomic.rmw.cmpxchg drop
+ ^^^^^^^^^^^^^^^^^^^^^^
+out/test/parse/expr/atomic-disabled.txt:72:41: error: opcode not allowed: i32.atomic.rmw8_u.cmpxchg
+ i32.const 0 i32.const 0 i32.const 0 i32.atomic.rmw8_u.cmpxchg drop
+ ^^^^^^^^^^^^^^^^^^^^^^^^^
+out/test/parse/expr/atomic-disabled.txt:73:41: error: opcode not allowed: i32.atomic.rmw16_u.cmpxchg
+ i32.const 0 i32.const 0 i32.const 0 i32.atomic.rmw16_u.cmpxchg drop
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^
+out/test/parse/expr/atomic-disabled.txt:74:41: error: opcode not allowed: i64.atomic.rmw8_u.cmpxchg
+ i32.const 0 i64.const 0 i64.const 0 i64.atomic.rmw8_u.cmpxchg drop
+ ^^^^^^^^^^^^^^^^^^^^^^^^^
+out/test/parse/expr/atomic-disabled.txt:75:41: error: opcode not allowed: i64.atomic.rmw16_u.cmpxchg
+ i32.const 0 i64.const 0 i64.const 0 i64.atomic.rmw16_u.cmpxchg drop
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^
+out/test/parse/expr/atomic-disabled.txt:76:41: error: opcode not allowed: i64.atomic.rmw32_u.cmpxchg
+ i32.const 0 i64.const 0 i64.const 0 i64.atomic.rmw32_u.cmpxchg drop
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^
+;;; STDERR ;;)
diff --git a/test/parse/expr/atomic.txt b/test/parse/expr/atomic.txt
new file mode 100644
index 00000000..c6a8fc51
--- /dev/null
+++ b/test/parse/expr/atomic.txt
@@ -0,0 +1,77 @@
+;;; FLAGS: --enable-threads
+(module
+ (memory 1)
+ (func
+ i32.const 0 i32.atomic.load drop
+ i32.const 0 i64.atomic.load drop
+ i32.const 0 i32.atomic.load8_u drop
+ i32.const 0 i32.atomic.load16_u drop
+ i32.const 0 i64.atomic.load8_u drop
+ i32.const 0 i64.atomic.load16_u drop
+ i32.const 0 i64.atomic.load32_u drop
+
+ i32.const 0 i32.const 0 i32.atomic.store
+ i32.const 0 i64.const 0 i64.atomic.store
+ i32.const 0 i32.const 0 i32.atomic.store8
+ i32.const 0 i32.const 0 i32.atomic.store16
+ i32.const 0 i64.const 0 i64.atomic.store8
+ i32.const 0 i64.const 0 i64.atomic.store16
+ i32.const 0 i64.const 0 i64.atomic.store32
+
+ i32.const 0 i32.const 0 i32.atomic.rmw.add drop
+ i32.const 0 i64.const 0 i64.atomic.rmw.add drop
+ i32.const 0 i32.const 0 i32.atomic.rmw8_u.add drop
+ i32.const 0 i32.const 0 i32.atomic.rmw16_u.add drop
+ i32.const 0 i64.const 0 i64.atomic.rmw8_u.add drop
+ i32.const 0 i64.const 0 i64.atomic.rmw16_u.add drop
+ i32.const 0 i64.const 0 i64.atomic.rmw32_u.add drop
+
+ i32.const 0 i32.const 0 i32.atomic.rmw.sub drop
+ i32.const 0 i64.const 0 i64.atomic.rmw.sub drop
+ i32.const 0 i32.const 0 i32.atomic.rmw8_u.sub drop
+ i32.const 0 i32.const 0 i32.atomic.rmw16_u.sub drop
+ i32.const 0 i64.const 0 i64.atomic.rmw8_u.sub drop
+ i32.const 0 i64.const 0 i64.atomic.rmw16_u.sub drop
+ i32.const 0 i64.const 0 i64.atomic.rmw32_u.sub drop
+
+ i32.const 0 i32.const 0 i32.atomic.rmw.and drop
+ i32.const 0 i64.const 0 i64.atomic.rmw.and drop
+ i32.const 0 i32.const 0 i32.atomic.rmw8_u.and drop
+ i32.const 0 i32.const 0 i32.atomic.rmw16_u.and drop
+ i32.const 0 i64.const 0 i64.atomic.rmw8_u.and drop
+ i32.const 0 i64.const 0 i64.atomic.rmw16_u.and drop
+ i32.const 0 i64.const 0 i64.atomic.rmw32_u.and drop
+
+ i32.const 0 i32.const 0 i32.atomic.rmw.or drop
+ i32.const 0 i64.const 0 i64.atomic.rmw.or drop
+ i32.const 0 i32.const 0 i32.atomic.rmw8_u.or drop
+ i32.const 0 i32.const 0 i32.atomic.rmw16_u.or drop
+ i32.const 0 i64.const 0 i64.atomic.rmw8_u.or drop
+ i32.const 0 i64.const 0 i64.atomic.rmw16_u.or drop
+ i32.const 0 i64.const 0 i64.atomic.rmw32_u.or drop
+
+ i32.const 0 i32.const 0 i32.atomic.rmw.xor drop
+ i32.const 0 i64.const 0 i64.atomic.rmw.xor drop
+ i32.const 0 i32.const 0 i32.atomic.rmw8_u.xor drop
+ i32.const 0 i32.const 0 i32.atomic.rmw16_u.xor drop
+ i32.const 0 i64.const 0 i64.atomic.rmw8_u.xor drop
+ i32.const 0 i64.const 0 i64.atomic.rmw16_u.xor drop
+ i32.const 0 i64.const 0 i64.atomic.rmw32_u.xor drop
+
+ i32.const 0 i32.const 0 i32.atomic.rmw.xchg drop
+ i32.const 0 i64.const 0 i64.atomic.rmw.xchg drop
+ i32.const 0 i32.const 0 i32.atomic.rmw8_u.xchg drop
+ i32.const 0 i32.const 0 i32.atomic.rmw16_u.xchg drop
+ i32.const 0 i64.const 0 i64.atomic.rmw8_u.xchg drop
+ i32.const 0 i64.const 0 i64.atomic.rmw16_u.xchg drop
+ i32.const 0 i64.const 0 i64.atomic.rmw32_u.xchg drop
+
+ i32.const 0 i32.const 0 i32.const 0 i32.atomic.rmw.cmpxchg drop
+ i32.const 0 i64.const 0 i64.const 0 i64.atomic.rmw.cmpxchg drop
+ i32.const 0 i32.const 0 i32.const 0 i32.atomic.rmw8_u.cmpxchg drop
+ i32.const 0 i32.const 0 i32.const 0 i32.atomic.rmw16_u.cmpxchg drop
+ i32.const 0 i64.const 0 i64.const 0 i64.atomic.rmw8_u.cmpxchg drop
+ i32.const 0 i64.const 0 i64.const 0 i64.atomic.rmw16_u.cmpxchg drop
+ i32.const 0 i64.const 0 i64.const 0 i64.atomic.rmw32_u.cmpxchg drop
+
+))
diff --git a/test/parse/expr/bad-atomic-unnatural-align.txt b/test/parse/expr/bad-atomic-unnatural-align.txt
new file mode 100644
index 00000000..0e8a298c
--- /dev/null
+++ b/test/parse/expr/bad-atomic-unnatural-align.txt
@@ -0,0 +1,264 @@
+;;; ERROR: 1
+;;; FLAGS: --enable-threads
+(module
+ (memory 1)
+ (func
+ i32.const 0 i32.atomic.load align=8 drop
+ i32.const 0 i64.atomic.load align=16 drop
+ i32.const 0 i32.atomic.load8_u align=2 drop
+ i32.const 0 i32.atomic.load16_u align=4 drop
+ i32.const 0 i64.atomic.load8_u align=2 drop
+ i32.const 0 i64.atomic.load16_u align=4 drop
+ i32.const 0 i64.atomic.load32_u align=8 drop
+
+ i32.const 0 i32.const 0 i32.atomic.store align=8
+ i32.const 0 i64.const 0 i64.atomic.store align=16
+ i32.const 0 i32.const 0 i32.atomic.store8 align=1
+ i32.const 0 i32.const 0 i32.atomic.store16 align=4
+ i32.const 0 i64.const 0 i64.atomic.store8 align=1
+ i32.const 0 i64.const 0 i64.atomic.store16 align=4
+ i32.const 0 i64.const 0 i64.atomic.store32 align=8
+
+ i32.const 0 i32.const 0 i32.atomic.rmw.add align=8 drop
+ i32.const 0 i64.const 0 i64.atomic.rmw.add align=16 drop
+ i32.const 0 i32.const 0 i32.atomic.rmw8_u.add align=2 drop
+ i32.const 0 i32.const 0 i32.atomic.rmw16_u.add align=4 drop
+ i32.const 0 i64.const 0 i64.atomic.rmw8_u.add align=2 drop
+ i32.const 0 i64.const 0 i64.atomic.rmw16_u.add align=4 drop
+ i32.const 0 i64.const 0 i64.atomic.rmw32_u.add align=8 drop
+
+ i32.const 0 i32.const 0 i32.atomic.rmw.sub align=8 drop
+ i32.const 0 i64.const 0 i64.atomic.rmw.sub align=16 drop
+ i32.const 0 i32.const 0 i32.atomic.rmw8_u.sub align=2 drop
+ i32.const 0 i32.const 0 i32.atomic.rmw16_u.sub align=4 drop
+ i32.const 0 i64.const 0 i64.atomic.rmw8_u.sub align=2 drop
+ i32.const 0 i64.const 0 i64.atomic.rmw16_u.sub align=4 drop
+ i32.const 0 i64.const 0 i64.atomic.rmw32_u.sub align=8 drop
+
+ i32.const 0 i32.const 0 i32.atomic.rmw.and align=8 drop
+ i32.const 0 i64.const 0 i64.atomic.rmw.and align=16 drop
+ i32.const 0 i32.const 0 i32.atomic.rmw8_u.and align=2 drop
+ i32.const 0 i32.const 0 i32.atomic.rmw16_u.and align=4 drop
+ i32.const 0 i64.const 0 i64.atomic.rmw8_u.and align=2 drop
+ i32.const 0 i64.const 0 i64.atomic.rmw16_u.and align=4 drop
+ i32.const 0 i64.const 0 i64.atomic.rmw32_u.and align=8 drop
+
+ i32.const 0 i32.const 0 i32.atomic.rmw.or align=8 drop
+ i32.const 0 i64.const 0 i64.atomic.rmw.or align=16 drop
+ i32.const 0 i32.const 0 i32.atomic.rmw8_u.or align=2 drop
+ i32.const 0 i32.const 0 i32.atomic.rmw16_u.or align=4 drop
+ i32.const 0 i64.const 0 i64.atomic.rmw8_u.or align=2 drop
+ i32.const 0 i64.const 0 i64.atomic.rmw16_u.or align=4 drop
+ i32.const 0 i64.const 0 i64.atomic.rmw32_u.or align=8 drop
+
+ i32.const 0 i32.const 0 i32.atomic.rmw.xor align=8 drop
+ i32.const 0 i64.const 0 i64.atomic.rmw.xor align=16 drop
+ i32.const 0 i32.const 0 i32.atomic.rmw8_u.xor align=2 drop
+ i32.const 0 i32.const 0 i32.atomic.rmw16_u.xor align=4 drop
+ i32.const 0 i64.const 0 i64.atomic.rmw8_u.xor align=2 drop
+ i32.const 0 i64.const 0 i64.atomic.rmw16_u.xor align=4 drop
+ i32.const 0 i64.const 0 i64.atomic.rmw32_u.xor align=8 drop
+
+ i32.const 0 i32.const 0 i32.atomic.rmw.xchg align=8 drop
+ i32.const 0 i64.const 0 i64.atomic.rmw.xchg align=16 drop
+ i32.const 0 i32.const 0 i32.atomic.rmw8_u.xchg align=2 drop
+ i32.const 0 i32.const 0 i32.atomic.rmw16_u.xchg align=4 drop
+ i32.const 0 i64.const 0 i64.atomic.rmw8_u.xchg align=2 drop
+ i32.const 0 i64.const 0 i64.atomic.rmw16_u.xchg align=4 drop
+ i32.const 0 i64.const 0 i64.atomic.rmw32_u.xchg align=8 drop
+
+ i32.const 0 i32.const 0 i32.const 0 i32.atomic.rmw.cmpxchg align=8 drop
+ i32.const 0 i64.const 0 i64.const 0 i64.atomic.rmw.cmpxchg align=16 drop
+ i32.const 0 i32.const 0 i32.const 0 i32.atomic.rmw8_u.cmpxchg align=2 drop
+ i32.const 0 i32.const 0 i32.const 0 i32.atomic.rmw16_u.cmpxchg align=4 drop
+ i32.const 0 i64.const 0 i64.const 0 i64.atomic.rmw8_u.cmpxchg align=2 drop
+ i32.const 0 i64.const 0 i64.const 0 i64.atomic.rmw16_u.cmpxchg align=4 drop
+ i32.const 0 i64.const 0 i64.const 0 i64.atomic.rmw32_u.cmpxchg align=8 drop
+
+))
+
+(;; STDERR ;;;
+out/test/parse/expr/bad-atomic-unnatural-align.txt:6:17: error: alignment must be equal to natural alignment (4)
+ i32.const 0 i32.atomic.load align=8 drop
+ ^^^^^^^^^^^^^^^
+out/test/parse/expr/bad-atomic-unnatural-align.txt:7:17: error: alignment must be equal to natural alignment (8)
+ i32.const 0 i64.atomic.load align=16 drop
+ ^^^^^^^^^^^^^^^
+out/test/parse/expr/bad-atomic-unnatural-align.txt:8:17: error: alignment must be equal to natural alignment (1)
+ i32.const 0 i32.atomic.load8_u align=2 drop
+ ^^^^^^^^^^^^^^^^^^
+out/test/parse/expr/bad-atomic-unnatural-align.txt:9:17: error: alignment must be equal to natural alignment (2)
+ i32.const 0 i32.atomic.load16_u align=4 drop
+ ^^^^^^^^^^^^^^^^^^^
+out/test/parse/expr/bad-atomic-unnatural-align.txt:10:17: error: alignment must be equal to natural alignment (1)
+ i32.const 0 i64.atomic.load8_u align=2 drop
+ ^^^^^^^^^^^^^^^^^^
+out/test/parse/expr/bad-atomic-unnatural-align.txt:11:17: error: alignment must be equal to natural alignment (2)
+ i32.const 0 i64.atomic.load16_u align=4 drop
+ ^^^^^^^^^^^^^^^^^^^
+out/test/parse/expr/bad-atomic-unnatural-align.txt:12:17: error: alignment must be equal to natural alignment (4)
+ i32.const 0 i64.atomic.load32_u align=8 drop
+ ^^^^^^^^^^^^^^^^^^^
+out/test/parse/expr/bad-atomic-unnatural-align.txt:14:29: error: alignment must be equal to natural alignment (4)
+ i32.const 0 i32.const 0 i32.atomic.store align=8
+ ^^^^^^^^^^^^^^^^
+out/test/parse/expr/bad-atomic-unnatural-align.txt:15:29: error: alignment must be equal to natural alignment (8)
+ i32.const 0 i64.const 0 i64.atomic.store align=16
+ ^^^^^^^^^^^^^^^^
+out/test/parse/expr/bad-atomic-unnatural-align.txt:17:29: error: alignment must be equal to natural alignment (2)
+ i32.const 0 i32.const 0 i32.atomic.store16 align=4
+ ^^^^^^^^^^^^^^^^^^
+out/test/parse/expr/bad-atomic-unnatural-align.txt:19:29: error: alignment must be equal to natural alignment (2)
+ i32.const 0 i64.const 0 i64.atomic.store16 align=4
+ ^^^^^^^^^^^^^^^^^^
+out/test/parse/expr/bad-atomic-unnatural-align.txt:20:29: error: alignment must be equal to natural alignment (4)
+ i32.const 0 i64.const 0 i64.atomic.store32 align=8
+ ^^^^^^^^^^^^^^^^^^
+out/test/parse/expr/bad-atomic-unnatural-align.txt:22:29: error: alignment must be equal to natural alignment (4)
+ i32.const 0 i32.const 0 i32.atomic.rmw.add align=8 drop
+ ^^^^^^^^^^^^^^^^^^
+out/test/parse/expr/bad-atomic-unnatural-align.txt:23:29: error: alignment must be equal to natural alignment (8)
+ i32.const 0 i64.const 0 i64.atomic.rmw.add align=16 drop
+ ^^^^^^^^^^^^^^^^^^
+out/test/parse/expr/bad-atomic-unnatural-align.txt:24:29: error: alignment must be equal to natural alignment (1)
+ i32.const 0 i32.const 0 i32.atomic.rmw8_u.add align=2 drop
+ ^^^^^^^^^^^^^^^^^^^^^
+out/test/parse/expr/bad-atomic-unnatural-align.txt:25:29: error: alignment must be equal to natural alignment (2)
+ i32.const 0 i32.const 0 i32.atomic.rmw16_u.add align=4 drop
+ ^^^^^^^^^^^^^^^^^^^^^^
+out/test/parse/expr/bad-atomic-unnatural-align.txt:26:29: error: alignment must be equal to natural alignment (1)
+ i32.const 0 i64.const 0 i64.atomic.rmw8_u.add align=2 drop
+ ^^^^^^^^^^^^^^^^^^^^^
+out/test/parse/expr/bad-atomic-unnatural-align.txt:27:29: error: alignment must be equal to natural alignment (2)
+ i32.const 0 i64.const 0 i64.atomic.rmw16_u.add align=4 drop
+ ^^^^^^^^^^^^^^^^^^^^^^
+out/test/parse/expr/bad-atomic-unnatural-align.txt:28:29: error: alignment must be equal to natural alignment (4)
+ i32.const 0 i64.const 0 i64.atomic.rmw32_u.add align=8 drop
+ ^^^^^^^^^^^^^^^^^^^^^^
+out/test/parse/expr/bad-atomic-unnatural-align.txt:30:29: error: alignment must be equal to natural alignment (4)
+ i32.const 0 i32.const 0 i32.atomic.rmw.sub align=8 drop
+ ^^^^^^^^^^^^^^^^^^
+out/test/parse/expr/bad-atomic-unnatural-align.txt:31:29: error: alignment must be equal to natural alignment (8)
+ i32.const 0 i64.const 0 i64.atomic.rmw.sub align=16 drop
+ ^^^^^^^^^^^^^^^^^^
+out/test/parse/expr/bad-atomic-unnatural-align.txt:32:29: error: alignment must be equal to natural alignment (1)
+ i32.const 0 i32.const 0 i32.atomic.rmw8_u.sub align=2 drop
+ ^^^^^^^^^^^^^^^^^^^^^
+out/test/parse/expr/bad-atomic-unnatural-align.txt:33:29: error: alignment must be equal to natural alignment (2)
+ i32.const 0 i32.const 0 i32.atomic.rmw16_u.sub align=4 drop
+ ^^^^^^^^^^^^^^^^^^^^^^
+out/test/parse/expr/bad-atomic-unnatural-align.txt:34:29: error: alignment must be equal to natural alignment (1)
+ i32.const 0 i64.const 0 i64.atomic.rmw8_u.sub align=2 drop
+ ^^^^^^^^^^^^^^^^^^^^^
+out/test/parse/expr/bad-atomic-unnatural-align.txt:35:29: error: alignment must be equal to natural alignment (2)
+ i32.const 0 i64.const 0 i64.atomic.rmw16_u.sub align=4 drop
+ ^^^^^^^^^^^^^^^^^^^^^^
+out/test/parse/expr/bad-atomic-unnatural-align.txt:36:29: error: alignment must be equal to natural alignment (4)
+ i32.const 0 i64.const 0 i64.atomic.rmw32_u.sub align=8 drop
+ ^^^^^^^^^^^^^^^^^^^^^^
+out/test/parse/expr/bad-atomic-unnatural-align.txt:38:29: error: alignment must be equal to natural alignment (4)
+ i32.const 0 i32.const 0 i32.atomic.rmw.and align=8 drop
+ ^^^^^^^^^^^^^^^^^^
+out/test/parse/expr/bad-atomic-unnatural-align.txt:39:29: error: alignment must be equal to natural alignment (8)
+ i32.const 0 i64.const 0 i64.atomic.rmw.and align=16 drop
+ ^^^^^^^^^^^^^^^^^^
+out/test/parse/expr/bad-atomic-unnatural-align.txt:40:29: error: alignment must be equal to natural alignment (1)
+ i32.const 0 i32.const 0 i32.atomic.rmw8_u.and align=2 drop
+ ^^^^^^^^^^^^^^^^^^^^^
+out/test/parse/expr/bad-atomic-unnatural-align.txt:41:29: error: alignment must be equal to natural alignment (2)
+ i32.const 0 i32.const 0 i32.atomic.rmw16_u.and align=4 drop
+ ^^^^^^^^^^^^^^^^^^^^^^
+out/test/parse/expr/bad-atomic-unnatural-align.txt:42:29: error: alignment must be equal to natural alignment (1)
+ i32.const 0 i64.const 0 i64.atomic.rmw8_u.and align=2 drop
+ ^^^^^^^^^^^^^^^^^^^^^
+out/test/parse/expr/bad-atomic-unnatural-align.txt:43:29: error: alignment must be equal to natural alignment (2)
+ i32.const 0 i64.const 0 i64.atomic.rmw16_u.and align=4 drop
+ ^^^^^^^^^^^^^^^^^^^^^^
+out/test/parse/expr/bad-atomic-unnatural-align.txt:44:29: error: alignment must be equal to natural alignment (4)
+ i32.const 0 i64.const 0 i64.atomic.rmw32_u.and align=8 drop
+ ^^^^^^^^^^^^^^^^^^^^^^
+out/test/parse/expr/bad-atomic-unnatural-align.txt:46:29: error: alignment must be equal to natural alignment (4)
+ i32.const 0 i32.const 0 i32.atomic.rmw.or align=8 drop
+ ^^^^^^^^^^^^^^^^^
+out/test/parse/expr/bad-atomic-unnatural-align.txt:47:29: error: alignment must be equal to natural alignment (8)
+ i32.const 0 i64.const 0 i64.atomic.rmw.or align=16 drop
+ ^^^^^^^^^^^^^^^^^
+out/test/parse/expr/bad-atomic-unnatural-align.txt:48:29: error: alignment must be equal to natural alignment (1)
+ i32.const 0 i32.const 0 i32.atomic.rmw8_u.or align=2 drop
+ ^^^^^^^^^^^^^^^^^^^^
+out/test/parse/expr/bad-atomic-unnatural-align.txt:49:29: error: alignment must be equal to natural alignment (2)
+ i32.const 0 i32.const 0 i32.atomic.rmw16_u.or align=4 drop
+ ^^^^^^^^^^^^^^^^^^^^^
+out/test/parse/expr/bad-atomic-unnatural-align.txt:50:29: error: alignment must be equal to natural alignment (1)
+ i32.const 0 i64.const 0 i64.atomic.rmw8_u.or align=2 drop
+ ^^^^^^^^^^^^^^^^^^^^
+out/test/parse/expr/bad-atomic-unnatural-align.txt:51:29: error: alignment must be equal to natural alignment (2)
+ i32.const 0 i64.const 0 i64.atomic.rmw16_u.or align=4 drop
+ ^^^^^^^^^^^^^^^^^^^^^
+out/test/parse/expr/bad-atomic-unnatural-align.txt:52:29: error: alignment must be equal to natural alignment (4)
+ i32.const 0 i64.const 0 i64.atomic.rmw32_u.or align=8 drop
+ ^^^^^^^^^^^^^^^^^^^^^
+out/test/parse/expr/bad-atomic-unnatural-align.txt:54:29: error: alignment must be equal to natural alignment (4)
+ i32.const 0 i32.const 0 i32.atomic.rmw.xor align=8 drop
+ ^^^^^^^^^^^^^^^^^^
+out/test/parse/expr/bad-atomic-unnatural-align.txt:55:29: error: alignment must be equal to natural alignment (8)
+ i32.const 0 i64.const 0 i64.atomic.rmw.xor align=16 drop
+ ^^^^^^^^^^^^^^^^^^
+out/test/parse/expr/bad-atomic-unnatural-align.txt:56:29: error: alignment must be equal to natural alignment (1)
+ i32.const 0 i32.const 0 i32.atomic.rmw8_u.xor align=2 drop
+ ^^^^^^^^^^^^^^^^^^^^^
+out/test/parse/expr/bad-atomic-unnatural-align.txt:57:29: error: alignment must be equal to natural alignment (2)
+ i32.const 0 i32.const 0 i32.atomic.rmw16_u.xor align=4 drop
+ ^^^^^^^^^^^^^^^^^^^^^^
+out/test/parse/expr/bad-atomic-unnatural-align.txt:58:29: error: alignment must be equal to natural alignment (1)
+ i32.const 0 i64.const 0 i64.atomic.rmw8_u.xor align=2 drop
+ ^^^^^^^^^^^^^^^^^^^^^
+out/test/parse/expr/bad-atomic-unnatural-align.txt:59:29: error: alignment must be equal to natural alignment (2)
+ i32.const 0 i64.const 0 i64.atomic.rmw16_u.xor align=4 drop
+ ^^^^^^^^^^^^^^^^^^^^^^
+out/test/parse/expr/bad-atomic-unnatural-align.txt:60:29: error: alignment must be equal to natural alignment (4)
+ i32.const 0 i64.const 0 i64.atomic.rmw32_u.xor align=8 drop
+ ^^^^^^^^^^^^^^^^^^^^^^
+out/test/parse/expr/bad-atomic-unnatural-align.txt:62:29: error: alignment must be equal to natural alignment (4)
+ i32.const 0 i32.const 0 i32.atomic.rmw.xchg align=8 drop
+ ^^^^^^^^^^^^^^^^^^^
+out/test/parse/expr/bad-atomic-unnatural-align.txt:63:29: error: alignment must be equal to natural alignment (8)
+ i32.const 0 i64.const 0 i64.atomic.rmw.xchg align=16 drop
+ ^^^^^^^^^^^^^^^^^^^
+out/test/parse/expr/bad-atomic-unnatural-align.txt:64:29: error: alignment must be equal to natural alignment (1)
+ i32.const 0 i32.const 0 i32.atomic.rmw8_u.xchg align=2 drop
+ ^^^^^^^^^^^^^^^^^^^^^^
+out/test/parse/expr/bad-atomic-unnatural-align.txt:65:29: error: alignment must be equal to natural alignment (2)
+ i32.const 0 i32.const 0 i32.atomic.rmw16_u.xchg align=4 drop
+ ^^^^^^^^^^^^^^^^^^^^^^^
+out/test/parse/expr/bad-atomic-unnatural-align.txt:66:29: error: alignment must be equal to natural alignment (1)
+ i32.const 0 i64.const 0 i64.atomic.rmw8_u.xchg align=2 drop
+ ^^^^^^^^^^^^^^^^^^^^^^
+out/test/parse/expr/bad-atomic-unnatural-align.txt:67:29: error: alignment must be equal to natural alignment (2)
+ i32.const 0 i64.const 0 i64.atomic.rmw16_u.xchg align=4 drop
+ ^^^^^^^^^^^^^^^^^^^^^^^
+out/test/parse/expr/bad-atomic-unnatural-align.txt:68:29: error: alignment must be equal to natural alignment (4)
+ i32.const 0 i64.const 0 i64.atomic.rmw32_u.xchg align=8 drop
+ ^^^^^^^^^^^^^^^^^^^^^^^
+out/test/parse/expr/bad-atomic-unnatural-align.txt:70:41: error: alignment must be equal to natural alignment (4)
+ i32.const 0 i32.const 0 i32.const 0 i32.atomic.rmw.cmpxchg align=8 drop
+ ^^^^^^^^^^^^^^^^^^^^^^
+out/test/parse/expr/bad-atomic-unnatural-align.txt:71:41: error: alignment must be equal to natural alignment (8)
+ i32.const 0 i64.const 0 i64.const 0 i64.atomic.rmw.cmpxchg align=16 drop
+ ^^^^^^^^^^^^^^^^^^^^^^
+out/test/parse/expr/bad-atomic-unnatural-align.txt:72:41: error: alignment must be equal to natural alignment (1)
+ i32.const 0 i32.const 0 i32.const 0 i32.atomic.rmw8_u.cmpxchg align=2 drop
+ ^^^^^^^^^^^^^^^^^^^^^^^^^
+out/test/parse/expr/bad-atomic-unnatural-align.txt:73:41: error: alignment must be equal to natural alignment (2)
+ i32.const 0 i32.const 0 i32.const 0 i32.atomic.rmw16_u.cmpxchg align=4 drop
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^
+out/test/parse/expr/bad-atomic-unnatural-align.txt:74:41: error: alignment must be equal to natural alignment (1)
+ i32.const 0 i64.const 0 i64.const 0 i64.atomic.rmw8_u.cmpxchg align=2 drop
+ ^^^^^^^^^^^^^^^^^^^^^^^^^
+out/test/parse/expr/bad-atomic-unnatural-align.txt:75:41: error: alignment must be equal to natural alignment (2)
+ i32.const 0 i64.const 0 i64.const 0 i64.atomic.rmw16_u.cmpxchg align=4 drop
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^
+out/test/parse/expr/bad-atomic-unnatural-align.txt:76:41: error: alignment must be equal to natural alignment (4)
+ i32.const 0 i64.const 0 i64.const 0 i64.atomic.rmw32_u.cmpxchg align=8 drop
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^
+;;; STDERR ;;)
diff --git a/test/roundtrip/fold-atomic.txt b/test/roundtrip/fold-atomic.txt
new file mode 100644
index 00000000..fc9f07ed
--- /dev/null
+++ b/test/roundtrip/fold-atomic.txt
@@ -0,0 +1,330 @@
+;;; TOOL: run-roundtrip
+;;; FLAGS: --stdout --fold-exprs --enable-threads
+
+(module
+ (memory 1)
+ (func
+ i32.const 0 i32.atomic.load drop
+ i32.const 0 i64.atomic.load drop
+ i32.const 0 i32.atomic.load8_u drop
+ i32.const 0 i32.atomic.load16_u drop
+ i32.const 0 i64.atomic.load8_u drop
+ i32.const 0 i64.atomic.load16_u drop
+ i32.const 0 i64.atomic.load32_u drop
+
+ i32.const 0 i32.const 0 i32.atomic.store
+ i32.const 0 i64.const 0 i64.atomic.store
+ i32.const 0 i32.const 0 i32.atomic.store8
+ i32.const 0 i32.const 0 i32.atomic.store16
+ i32.const 0 i64.const 0 i64.atomic.store8
+ i32.const 0 i64.const 0 i64.atomic.store16
+ i32.const 0 i64.const 0 i64.atomic.store32
+
+ i32.const 0 i32.const 0 i32.atomic.rmw.add drop
+ i32.const 0 i64.const 0 i64.atomic.rmw.add drop
+ i32.const 0 i32.const 0 i32.atomic.rmw8_u.add drop
+ i32.const 0 i32.const 0 i32.atomic.rmw16_u.add drop
+ i32.const 0 i64.const 0 i64.atomic.rmw8_u.add drop
+ i32.const 0 i64.const 0 i64.atomic.rmw16_u.add drop
+ i32.const 0 i64.const 0 i64.atomic.rmw32_u.add drop
+
+ i32.const 0 i32.const 0 i32.atomic.rmw.sub drop
+ i32.const 0 i64.const 0 i64.atomic.rmw.sub drop
+ i32.const 0 i32.const 0 i32.atomic.rmw8_u.sub drop
+ i32.const 0 i32.const 0 i32.atomic.rmw16_u.sub drop
+ i32.const 0 i64.const 0 i64.atomic.rmw8_u.sub drop
+ i32.const 0 i64.const 0 i64.atomic.rmw16_u.sub drop
+ i32.const 0 i64.const 0 i64.atomic.rmw32_u.sub drop
+
+ i32.const 0 i32.const 0 i32.atomic.rmw.and drop
+ i32.const 0 i64.const 0 i64.atomic.rmw.and drop
+ i32.const 0 i32.const 0 i32.atomic.rmw8_u.and drop
+ i32.const 0 i32.const 0 i32.atomic.rmw16_u.and drop
+ i32.const 0 i64.const 0 i64.atomic.rmw8_u.and drop
+ i32.const 0 i64.const 0 i64.atomic.rmw16_u.and drop
+ i32.const 0 i64.const 0 i64.atomic.rmw32_u.and drop
+
+ i32.const 0 i32.const 0 i32.atomic.rmw.or drop
+ i32.const 0 i64.const 0 i64.atomic.rmw.or drop
+ i32.const 0 i32.const 0 i32.atomic.rmw8_u.or drop
+ i32.const 0 i32.const 0 i32.atomic.rmw16_u.or drop
+ i32.const 0 i64.const 0 i64.atomic.rmw8_u.or drop
+ i32.const 0 i64.const 0 i64.atomic.rmw16_u.or drop
+ i32.const 0 i64.const 0 i64.atomic.rmw32_u.or drop
+
+ i32.const 0 i32.const 0 i32.atomic.rmw.xor drop
+ i32.const 0 i64.const 0 i64.atomic.rmw.xor drop
+ i32.const 0 i32.const 0 i32.atomic.rmw8_u.xor drop
+ i32.const 0 i32.const 0 i32.atomic.rmw16_u.xor drop
+ i32.const 0 i64.const 0 i64.atomic.rmw8_u.xor drop
+ i32.const 0 i64.const 0 i64.atomic.rmw16_u.xor drop
+ i32.const 0 i64.const 0 i64.atomic.rmw32_u.xor drop
+
+ i32.const 0 i32.const 0 i32.atomic.rmw.xchg drop
+ i32.const 0 i64.const 0 i64.atomic.rmw.xchg drop
+ i32.const 0 i32.const 0 i32.atomic.rmw8_u.xchg drop
+ i32.const 0 i32.const 0 i32.atomic.rmw16_u.xchg drop
+ i32.const 0 i64.const 0 i64.atomic.rmw8_u.xchg drop
+ i32.const 0 i64.const 0 i64.atomic.rmw16_u.xchg drop
+ i32.const 0 i64.const 0 i64.atomic.rmw32_u.xchg drop
+
+ i32.const 0 i32.const 0 i32.const 0 i32.atomic.rmw.cmpxchg drop
+ i32.const 0 i64.const 0 i64.const 0 i64.atomic.rmw.cmpxchg drop
+ i32.const 0 i32.const 0 i32.const 0 i32.atomic.rmw8_u.cmpxchg drop
+ i32.const 0 i32.const 0 i32.const 0 i32.atomic.rmw16_u.cmpxchg drop
+ i32.const 0 i64.const 0 i64.const 0 i64.atomic.rmw8_u.cmpxchg drop
+ i32.const 0 i64.const 0 i64.const 0 i64.atomic.rmw16_u.cmpxchg drop
+ i32.const 0 i64.const 0 i64.const 0 i64.atomic.rmw32_u.cmpxchg drop
+
+))
+(;; STDOUT ;;;
+(module
+ (type (;0;) (func))
+ (func (;0;) (type 0)
+ (drop
+ (i32.atomic.load
+ (i32.const 0)))
+ (drop
+ (i64.atomic.load
+ (i32.const 0)))
+ (drop
+ (i32.atomic.load8_u
+ (i32.const 0)))
+ (drop
+ (i32.atomic.load16_u
+ (i32.const 0)))
+ (drop
+ (i64.atomic.load8_u
+ (i32.const 0)))
+ (drop
+ (i64.atomic.load16_u
+ (i32.const 0)))
+ (drop
+ (i64.atomic.load32_u
+ (i32.const 0)))
+ (i32.atomic.store
+ (i32.const 0)
+ (i32.const 0))
+ (i64.atomic.store
+ (i32.const 0)
+ (i64.const 0))
+ (i32.atomic.store8
+ (i32.const 0)
+ (i32.const 0))
+ (i32.atomic.store16
+ (i32.const 0)
+ (i32.const 0))
+ (i64.atomic.store8
+ (i32.const 0)
+ (i64.const 0))
+ (i64.atomic.store16
+ (i32.const 0)
+ (i64.const 0))
+ (i64.atomic.store32
+ (i32.const 0)
+ (i64.const 0))
+ (drop
+ (i32.atomic.rmw.add
+ (i32.const 0)
+ (i32.const 0)))
+ (drop
+ (i64.atomic.rmw.add
+ (i32.const 0)
+ (i64.const 0)))
+ (drop
+ (i32.atomic.rmw8_u.add
+ (i32.const 0)
+ (i32.const 0)))
+ (drop
+ (i32.atomic.rmw16_u.add
+ (i32.const 0)
+ (i32.const 0)))
+ (drop
+ (i64.atomic.rmw8_u.add
+ (i32.const 0)
+ (i64.const 0)))
+ (drop
+ (i64.atomic.rmw16_u.add
+ (i32.const 0)
+ (i64.const 0)))
+ (drop
+ (i64.atomic.rmw32_u.add
+ (i32.const 0)
+ (i64.const 0)))
+ (drop
+ (i32.atomic.rmw.sub
+ (i32.const 0)
+ (i32.const 0)))
+ (drop
+ (i64.atomic.rmw.sub
+ (i32.const 0)
+ (i64.const 0)))
+ (drop
+ (i32.atomic.rmw8_u.sub
+ (i32.const 0)
+ (i32.const 0)))
+ (drop
+ (i32.atomic.rmw16_u.sub
+ (i32.const 0)
+ (i32.const 0)))
+ (drop
+ (i64.atomic.rmw8_u.sub
+ (i32.const 0)
+ (i64.const 0)))
+ (drop
+ (i64.atomic.rmw16_u.sub
+ (i32.const 0)
+ (i64.const 0)))
+ (drop
+ (i64.atomic.rmw32_u.sub
+ (i32.const 0)
+ (i64.const 0)))
+ (drop
+ (i32.atomic.rmw.and
+ (i32.const 0)
+ (i32.const 0)))
+ (drop
+ (i64.atomic.rmw.and
+ (i32.const 0)
+ (i64.const 0)))
+ (drop
+ (i32.atomic.rmw8_u.and
+ (i32.const 0)
+ (i32.const 0)))
+ (drop
+ (i32.atomic.rmw16_u.and
+ (i32.const 0)
+ (i32.const 0)))
+ (drop
+ (i64.atomic.rmw8_u.and
+ (i32.const 0)
+ (i64.const 0)))
+ (drop
+ (i64.atomic.rmw16_u.and
+ (i32.const 0)
+ (i64.const 0)))
+ (drop
+ (i64.atomic.rmw32_u.and
+ (i32.const 0)
+ (i64.const 0)))
+ (drop
+ (i32.atomic.rmw.or
+ (i32.const 0)
+ (i32.const 0)))
+ (drop
+ (i64.atomic.rmw.or
+ (i32.const 0)
+ (i64.const 0)))
+ (drop
+ (i32.atomic.rmw8_u.or
+ (i32.const 0)
+ (i32.const 0)))
+ (drop
+ (i32.atomic.rmw16_u.or
+ (i32.const 0)
+ (i32.const 0)))
+ (drop
+ (i64.atomic.rmw8_u.or
+ (i32.const 0)
+ (i64.const 0)))
+ (drop
+ (i64.atomic.rmw16_u.or
+ (i32.const 0)
+ (i64.const 0)))
+ (drop
+ (i64.atomic.rmw32_u.or
+ (i32.const 0)
+ (i64.const 0)))
+ (drop
+ (i32.atomic.rmw.xor
+ (i32.const 0)
+ (i32.const 0)))
+ (drop
+ (i64.atomic.rmw.xor
+ (i32.const 0)
+ (i64.const 0)))
+ (drop
+ (i32.atomic.rmw8_u.xor
+ (i32.const 0)
+ (i32.const 0)))
+ (drop
+ (i32.atomic.rmw16_u.xor
+ (i32.const 0)
+ (i32.const 0)))
+ (drop
+ (i64.atomic.rmw8_u.xor
+ (i32.const 0)
+ (i64.const 0)))
+ (drop
+ (i64.atomic.rmw16_u.xor
+ (i32.const 0)
+ (i64.const 0)))
+ (drop
+ (i64.atomic.rmw32_u.xor
+ (i32.const 0)
+ (i64.const 0)))
+ (drop
+ (i32.atomic.rmw.xchg
+ (i32.const 0)
+ (i32.const 0)))
+ (drop
+ (i64.atomic.rmw.xchg
+ (i32.const 0)
+ (i64.const 0)))
+ (drop
+ (i32.atomic.rmw8_u.xchg
+ (i32.const 0)
+ (i32.const 0)))
+ (drop
+ (i32.atomic.rmw16_u.xchg
+ (i32.const 0)
+ (i32.const 0)))
+ (drop
+ (i64.atomic.rmw8_u.xchg
+ (i32.const 0)
+ (i64.const 0)))
+ (drop
+ (i64.atomic.rmw16_u.xchg
+ (i32.const 0)
+ (i64.const 0)))
+ (drop
+ (i64.atomic.rmw32_u.xchg
+ (i32.const 0)
+ (i64.const 0)))
+ (drop
+ (i32.atomic.rmw.cmpxchg
+ (i32.const 0)
+ (i32.const 0)
+ (i32.const 0)))
+ (drop
+ (i64.atomic.rmw.cmpxchg
+ (i32.const 0)
+ (i64.const 0)
+ (i64.const 0)))
+ (drop
+ (i32.atomic.rmw8_u.cmpxchg
+ (i32.const 0)
+ (i32.const 0)
+ (i32.const 0)))
+ (drop
+ (i32.atomic.rmw16_u.cmpxchg
+ (i32.const 0)
+ (i32.const 0)
+ (i32.const 0)))
+ (drop
+ (i64.atomic.rmw8_u.cmpxchg
+ (i32.const 0)
+ (i64.const 0)
+ (i64.const 0)))
+ (drop
+ (i64.atomic.rmw16_u.cmpxchg
+ (i32.const 0)
+ (i64.const 0)
+ (i64.const 0)))
+ (drop
+ (i64.atomic.rmw32_u.cmpxchg
+ (i32.const 0)
+ (i64.const 0)
+ (i64.const 0))))
+ (memory (;0;) 1))
+;;; STDOUT ;;)
diff --git a/test/run-roundtrip.py b/test/run-roundtrip.py
index bce745c5..e618432b 100755
--- a/test/run-roundtrip.py
+++ b/test/run-roundtrip.py
@@ -117,6 +117,7 @@ def main(args):
parser.add_argument('--generate-names', action='store_true')
parser.add_argument('--fold-exprs', action='store_true')
parser.add_argument('--enable-exceptions', action='store_true')
+ parser.add_argument('--enable-threads', action='store_true')
parser.add_argument('--inline-exports', action='store_true')
parser.add_argument('file', help='test file.')
options = parser.parse_args(args)
@@ -127,6 +128,7 @@ def main(args):
wat2wasm.AppendOptionalArgs({
'--debug-names': options.debug_names,
'--enable-exceptions': options.enable_exceptions,
+ '--enable-threads': options.enable_threads,
'--no-check': options.no_check,
})
@@ -136,6 +138,7 @@ def main(args):
wasm2wat.AppendOptionalArgs({
'--fold-exprs': options.fold_exprs,
'--enable-exceptions': options.enable_exceptions,
+ '--enable-threads': options.enable_threads,
'--inline-exports': options.inline_exports,
'--no-debug-names': not options.debug_names,
'--generate-names': options.generate_names,
diff --git a/test/typecheck/bad-atomic-type-mismatch.txt b/test/typecheck/bad-atomic-type-mismatch.txt
new file mode 100644
index 00000000..e8d78d37
--- /dev/null
+++ b/test/typecheck/bad-atomic-type-mismatch.txt
@@ -0,0 +1,745 @@
+;;; ERROR: 1
+;;; FLAGS: --enable-threads
+
+(module
+ (memory 1)
+
+ ;; Mismatch address.
+ (func f32.const 0 i32.atomic.load drop)
+ (func f32.const 0 i64.atomic.load drop)
+ (func f32.const 0 i32.atomic.load8_u drop)
+ (func f32.const 0 i32.atomic.load16_u drop)
+ (func f32.const 0 i64.atomic.load8_u drop)
+ (func f32.const 0 i64.atomic.load16_u drop)
+ (func f32.const 0 i64.atomic.load32_u drop)
+ (func f32.const 0 i32.const 0 i32.atomic.store)
+ (func f32.const 0 i64.const 0 i64.atomic.store)
+ (func f32.const 0 i32.const 0 i32.atomic.store8)
+ (func f32.const 0 i32.const 0 i32.atomic.store16)
+ (func f32.const 0 i64.const 0 i64.atomic.store8)
+ (func f32.const 0 i64.const 0 i64.atomic.store16)
+ (func f32.const 0 i64.const 0 i64.atomic.store32)
+ (func f32.const 0 i32.const 0 i32.atomic.rmw.add drop)
+ (func f32.const 0 i64.const 0 i64.atomic.rmw.add drop)
+ (func f32.const 0 i32.const 0 i32.atomic.rmw8_u.add drop)
+ (func f32.const 0 i32.const 0 i32.atomic.rmw16_u.add drop)
+ (func f32.const 0 i64.const 0 i64.atomic.rmw8_u.add drop)
+ (func f32.const 0 i64.const 0 i64.atomic.rmw16_u.add drop)
+ (func f32.const 0 i64.const 0 i64.atomic.rmw32_u.add drop)
+ (func f32.const 0 i32.const 0 i32.atomic.rmw.sub drop)
+ (func f32.const 0 i64.const 0 i64.atomic.rmw.sub drop)
+ (func f32.const 0 i32.const 0 i32.atomic.rmw8_u.sub drop)
+ (func f32.const 0 i32.const 0 i32.atomic.rmw16_u.sub drop)
+ (func f32.const 0 i64.const 0 i64.atomic.rmw8_u.sub drop)
+ (func f32.const 0 i64.const 0 i64.atomic.rmw16_u.sub drop)
+ (func f32.const 0 i64.const 0 i64.atomic.rmw32_u.sub drop)
+ (func f32.const 0 i32.const 0 i32.atomic.rmw.and drop)
+ (func f32.const 0 i64.const 0 i64.atomic.rmw.and drop)
+ (func f32.const 0 i32.const 0 i32.atomic.rmw8_u.and drop)
+ (func f32.const 0 i32.const 0 i32.atomic.rmw16_u.and drop)
+ (func f32.const 0 i64.const 0 i64.atomic.rmw8_u.and drop)
+ (func f32.const 0 i64.const 0 i64.atomic.rmw16_u.and drop)
+ (func f32.const 0 i64.const 0 i64.atomic.rmw32_u.and drop)
+ (func f32.const 0 i32.const 0 i32.atomic.rmw.or drop)
+ (func f32.const 0 i64.const 0 i64.atomic.rmw.or drop)
+ (func f32.const 0 i32.const 0 i32.atomic.rmw8_u.or drop)
+ (func f32.const 0 i32.const 0 i32.atomic.rmw16_u.or drop)
+ (func f32.const 0 i64.const 0 i64.atomic.rmw8_u.or drop)
+ (func f32.const 0 i64.const 0 i64.atomic.rmw16_u.or drop)
+ (func f32.const 0 i64.const 0 i64.atomic.rmw32_u.or drop)
+ (func f32.const 0 i32.const 0 i32.atomic.rmw.xor drop)
+ (func f32.const 0 i64.const 0 i64.atomic.rmw.xor drop)
+ (func f32.const 0 i32.const 0 i32.atomic.rmw8_u.xor drop)
+ (func f32.const 0 i32.const 0 i32.atomic.rmw16_u.xor drop)
+ (func f32.const 0 i64.const 0 i64.atomic.rmw8_u.xor drop)
+ (func f32.const 0 i64.const 0 i64.atomic.rmw16_u.xor drop)
+ (func f32.const 0 i64.const 0 i64.atomic.rmw32_u.xor drop)
+ (func f32.const 0 i32.const 0 i32.atomic.rmw.xchg drop)
+ (func f32.const 0 i64.const 0 i64.atomic.rmw.xchg drop)
+ (func f32.const 0 i32.const 0 i32.atomic.rmw8_u.xchg drop)
+ (func f32.const 0 i32.const 0 i32.atomic.rmw16_u.xchg drop)
+ (func f32.const 0 i64.const 0 i64.atomic.rmw8_u.xchg drop)
+ (func f32.const 0 i64.const 0 i64.atomic.rmw16_u.xchg drop)
+ (func f32.const 0 i64.const 0 i64.atomic.rmw32_u.xchg drop)
+ (func f32.const 0 i32.const 0 i32.const 0 i32.atomic.rmw.cmpxchg drop)
+ (func f32.const 0 i64.const 0 i64.const 0 i64.atomic.rmw.cmpxchg drop)
+ (func f32.const 0 i32.const 0 i32.const 0 i32.atomic.rmw8_u.cmpxchg drop)
+ (func f32.const 0 i32.const 0 i32.const 0 i32.atomic.rmw16_u.cmpxchg drop)
+ (func f32.const 0 i64.const 0 i64.const 0 i64.atomic.rmw8_u.cmpxchg drop)
+ (func f32.const 0 i64.const 0 i64.const 0 i64.atomic.rmw16_u.cmpxchg drop)
+ (func f32.const 0 i64.const 0 i64.const 0 i64.atomic.rmw32_u.cmpxchg drop)
+
+ ;; Mismatch first value operand.
+ (func i32.const 0 f32.const 0 i32.atomic.store)
+ (func i32.const 0 f64.const 0 i64.atomic.store)
+ (func i32.const 0 f32.const 0 i32.atomic.store8)
+ (func i32.const 0 f32.const 0 i32.atomic.store16)
+ (func i32.const 0 f64.const 0 i64.atomic.store8)
+ (func i32.const 0 f64.const 0 i64.atomic.store16)
+ (func i32.const 0 f64.const 0 i64.atomic.store32)
+ (func i32.const 0 f32.const 0 i32.atomic.rmw.add drop)
+ (func i32.const 0 f64.const 0 i64.atomic.rmw.add drop)
+ (func i32.const 0 f32.const 0 i32.atomic.rmw8_u.add drop)
+ (func i32.const 0 f32.const 0 i32.atomic.rmw16_u.add drop)
+ (func i32.const 0 f64.const 0 i64.atomic.rmw8_u.add drop)
+ (func i32.const 0 f64.const 0 i64.atomic.rmw16_u.add drop)
+ (func i32.const 0 f64.const 0 i64.atomic.rmw32_u.add drop)
+ (func i32.const 0 f32.const 0 i32.atomic.rmw.sub drop)
+ (func i32.const 0 f64.const 0 i64.atomic.rmw.sub drop)
+ (func i32.const 0 f32.const 0 i32.atomic.rmw8_u.sub drop)
+ (func i32.const 0 f32.const 0 i32.atomic.rmw16_u.sub drop)
+ (func i32.const 0 f64.const 0 i64.atomic.rmw8_u.sub drop)
+ (func i32.const 0 f64.const 0 i64.atomic.rmw16_u.sub drop)
+ (func i32.const 0 f64.const 0 i64.atomic.rmw32_u.sub drop)
+ (func i32.const 0 f32.const 0 i32.atomic.rmw.and drop)
+ (func i32.const 0 f64.const 0 i64.atomic.rmw.and drop)
+ (func i32.const 0 f32.const 0 i32.atomic.rmw8_u.and drop)
+ (func i32.const 0 f32.const 0 i32.atomic.rmw16_u.and drop)
+ (func i32.const 0 f64.const 0 i64.atomic.rmw8_u.and drop)
+ (func i32.const 0 f64.const 0 i64.atomic.rmw16_u.and drop)
+ (func i32.const 0 f64.const 0 i64.atomic.rmw32_u.and drop)
+ (func i32.const 0 f32.const 0 i32.atomic.rmw.or drop)
+ (func i32.const 0 f64.const 0 i64.atomic.rmw.or drop)
+ (func i32.const 0 f32.const 0 i32.atomic.rmw8_u.or drop)
+ (func i32.const 0 f32.const 0 i32.atomic.rmw16_u.or drop)
+ (func i32.const 0 f64.const 0 i64.atomic.rmw8_u.or drop)
+ (func i32.const 0 f64.const 0 i64.atomic.rmw16_u.or drop)
+ (func i32.const 0 f64.const 0 i64.atomic.rmw32_u.or drop)
+ (func i32.const 0 f32.const 0 i32.atomic.rmw.xor drop)
+ (func i32.const 0 f64.const 0 i64.atomic.rmw.xor drop)
+ (func i32.const 0 f32.const 0 i32.atomic.rmw8_u.xor drop)
+ (func i32.const 0 f32.const 0 i32.atomic.rmw16_u.xor drop)
+ (func i32.const 0 f64.const 0 i64.atomic.rmw8_u.xor drop)
+ (func i32.const 0 f64.const 0 i64.atomic.rmw16_u.xor drop)
+ (func i32.const 0 f64.const 0 i64.atomic.rmw32_u.xor drop)
+ (func i32.const 0 f32.const 0 i32.atomic.rmw.xchg drop)
+ (func i32.const 0 f64.const 0 i64.atomic.rmw.xchg drop)
+ (func i32.const 0 f32.const 0 i32.atomic.rmw8_u.xchg drop)
+ (func i32.const 0 f32.const 0 i32.atomic.rmw16_u.xchg drop)
+ (func i32.const 0 f64.const 0 i64.atomic.rmw8_u.xchg drop)
+ (func i32.const 0 f64.const 0 i64.atomic.rmw16_u.xchg drop)
+ (func i32.const 0 f64.const 0 i64.atomic.rmw32_u.xchg drop)
+ (func i32.const 0 f32.const 0 i32.const 0 i32.atomic.rmw.cmpxchg drop)
+ (func i32.const 0 f64.const 0 i64.const 0 i64.atomic.rmw.cmpxchg drop)
+ (func i32.const 0 f32.const 0 i32.const 0 i32.atomic.rmw8_u.cmpxchg drop)
+ (func i32.const 0 f32.const 0 i32.const 0 i32.atomic.rmw16_u.cmpxchg drop)
+ (func i32.const 0 f64.const 0 i64.const 0 i64.atomic.rmw8_u.cmpxchg drop)
+ (func i32.const 0 f64.const 0 i64.const 0 i64.atomic.rmw16_u.cmpxchg drop)
+ (func i32.const 0 f64.const 0 i64.const 0 i64.atomic.rmw32_u.cmpxchg drop)
+
+ ;; Mismatch second value operand.
+ (func i32.const 0 i32.const 0 f32.const 0 i32.atomic.rmw.cmpxchg drop)
+ (func i32.const 0 i64.const 0 f64.const 0 i64.atomic.rmw.cmpxchg drop)
+ (func i32.const 0 i32.const 0 f32.const 0 i32.atomic.rmw8_u.cmpxchg drop)
+ (func i32.const 0 i32.const 0 f32.const 0 i32.atomic.rmw16_u.cmpxchg drop)
+ (func i32.const 0 i64.const 0 f64.const 0 i64.atomic.rmw8_u.cmpxchg drop)
+ (func i32.const 0 i64.const 0 f64.const 0 i64.atomic.rmw16_u.cmpxchg drop)
+ (func i32.const 0 i64.const 0 f64.const 0 i64.atomic.rmw32_u.cmpxchg drop)
+
+ ;; Mismatch result.
+ (func (result f32) i32.const 0 i32.atomic.load)
+ (func (result f64) i32.const 0 i64.atomic.load)
+ (func (result f32) i32.const 0 i32.atomic.load8_u)
+ (func (result f32) i32.const 0 i32.atomic.load16_u)
+ (func (result f64) i32.const 0 i64.atomic.load8_u)
+ (func (result f64) i32.const 0 i64.atomic.load16_u)
+ (func (result f64) i32.const 0 i64.atomic.load32_u)
+ (func (result f32) i32.const 0 i32.const 0 i32.atomic.rmw.add)
+ (func (result f64) i32.const 0 i64.const 0 i64.atomic.rmw.add)
+ (func (result f32) i32.const 0 i32.const 0 i32.atomic.rmw8_u.add)
+ (func (result f32) i32.const 0 i32.const 0 i32.atomic.rmw16_u.add)
+ (func (result f64) i32.const 0 i64.const 0 i64.atomic.rmw8_u.add)
+ (func (result f64) i32.const 0 i64.const 0 i64.atomic.rmw16_u.add)
+ (func (result f64) i32.const 0 i64.const 0 i64.atomic.rmw32_u.add)
+ (func (result f32) i32.const 0 i32.const 0 i32.atomic.rmw.sub)
+ (func (result f64) i32.const 0 i64.const 0 i64.atomic.rmw.sub)
+ (func (result f32) i32.const 0 i32.const 0 i32.atomic.rmw8_u.sub)
+ (func (result f32) i32.const 0 i32.const 0 i32.atomic.rmw16_u.sub)
+ (func (result f64) i32.const 0 i64.const 0 i64.atomic.rmw8_u.sub)
+ (func (result f64) i32.const 0 i64.const 0 i64.atomic.rmw16_u.sub)
+ (func (result f64) i32.const 0 i64.const 0 i64.atomic.rmw32_u.sub)
+ (func (result f32) i32.const 0 i32.const 0 i32.atomic.rmw.and)
+ (func (result f64) i32.const 0 i64.const 0 i64.atomic.rmw.and)
+ (func (result f32) i32.const 0 i32.const 0 i32.atomic.rmw8_u.and)
+ (func (result f32) i32.const 0 i32.const 0 i32.atomic.rmw16_u.and)
+ (func (result f64) i32.const 0 i64.const 0 i64.atomic.rmw8_u.and)
+ (func (result f64) i32.const 0 i64.const 0 i64.atomic.rmw16_u.and)
+ (func (result f64) i32.const 0 i64.const 0 i64.atomic.rmw32_u.and)
+ (func (result f32) i32.const 0 i32.const 0 i32.atomic.rmw.or)
+ (func (result f64) i32.const 0 i64.const 0 i64.atomic.rmw.or)
+ (func (result f32) i32.const 0 i32.const 0 i32.atomic.rmw8_u.or)
+ (func (result f32) i32.const 0 i32.const 0 i32.atomic.rmw16_u.or)
+ (func (result f64) i32.const 0 i64.const 0 i64.atomic.rmw8_u.or)
+ (func (result f64) i32.const 0 i64.const 0 i64.atomic.rmw16_u.or)
+ (func (result f64) i32.const 0 i64.const 0 i64.atomic.rmw32_u.or)
+ (func (result f32) i32.const 0 i32.const 0 i32.atomic.rmw.xor)
+ (func (result f64) i32.const 0 i64.const 0 i64.atomic.rmw.xor)
+ (func (result f32) i32.const 0 i32.const 0 i32.atomic.rmw8_u.xor)
+ (func (result f32) i32.const 0 i32.const 0 i32.atomic.rmw16_u.xor)
+ (func (result f64) i32.const 0 i64.const 0 i64.atomic.rmw8_u.xor)
+ (func (result f64) i32.const 0 i64.const 0 i64.atomic.rmw16_u.xor)
+ (func (result f64) i32.const 0 i64.const 0 i64.atomic.rmw32_u.xor)
+ (func (result f32) i32.const 0 i32.const 0 i32.atomic.rmw.xchg)
+ (func (result f64) i32.const 0 i64.const 0 i64.atomic.rmw.xchg)
+ (func (result f32) i32.const 0 i32.const 0 i32.atomic.rmw8_u.xchg)
+ (func (result f32) i32.const 0 i32.const 0 i32.atomic.rmw16_u.xchg)
+ (func (result f64) i32.const 0 i64.const 0 i64.atomic.rmw8_u.xchg)
+ (func (result f64) i32.const 0 i64.const 0 i64.atomic.rmw16_u.xchg)
+ (func (result f64) i32.const 0 i64.const 0 i64.atomic.rmw32_u.xchg)
+ (func (result f32) i32.const 0 i32.const 0 i32.const 0 i32.atomic.rmw.cmpxchg)
+ (func (result f64) i32.const 0 i64.const 0 i64.const 0 i64.atomic.rmw.cmpxchg)
+ (func (result f32) i32.const 0 i32.const 0 i32.const 0 i32.atomic.rmw8_u.cmpxchg)
+ (func (result f32) i32.const 0 i32.const 0 i32.const 0 i32.atomic.rmw16_u.cmpxchg)
+ (func (result f64) i32.const 0 i64.const 0 i64.const 0 i64.atomic.rmw8_u.cmpxchg)
+ (func (result f64) i32.const 0 i64.const 0 i64.const 0 i64.atomic.rmw16_u.cmpxchg)
+ (func (result f64) i32.const 0 i64.const 0 i64.const 0 i64.atomic.rmw32_u.cmpxchg)
+
+)
+(;; STDERR ;;;
+out/test/typecheck/bad-atomic-type-mismatch.txt:8:21: error: type mismatch in i32.atomic.load, expected i32 but got f32.
+ (func f32.const 0 i32.atomic.load drop)
+ ^^^^^^^^^^^^^^^
+out/test/typecheck/bad-atomic-type-mismatch.txt:9:21: error: type mismatch in i64.atomic.load, expected i32 but got f32.
+ (func f32.const 0 i64.atomic.load drop)
+ ^^^^^^^^^^^^^^^
+out/test/typecheck/bad-atomic-type-mismatch.txt:10:21: error: type mismatch in i32.atomic.load8_u, expected i32 but got f32.
+ (func f32.const 0 i32.atomic.load8_u drop)
+ ^^^^^^^^^^^^^^^^^^
+out/test/typecheck/bad-atomic-type-mismatch.txt:11:21: error: type mismatch in i32.atomic.load16_u, expected i32 but got f32.
+ (func f32.const 0 i32.atomic.load16_u drop)
+ ^^^^^^^^^^^^^^^^^^^
+out/test/typecheck/bad-atomic-type-mismatch.txt:12:21: error: type mismatch in i64.atomic.load8_u, expected i32 but got f32.
+ (func f32.const 0 i64.atomic.load8_u drop)
+ ^^^^^^^^^^^^^^^^^^
+out/test/typecheck/bad-atomic-type-mismatch.txt:13:21: error: type mismatch in i64.atomic.load16_u, expected i32 but got f32.
+ (func f32.const 0 i64.atomic.load16_u drop)
+ ^^^^^^^^^^^^^^^^^^^
+out/test/typecheck/bad-atomic-type-mismatch.txt:14:21: error: type mismatch in i64.atomic.load32_u, expected i32 but got f32.
+ (func f32.const 0 i64.atomic.load32_u drop)
+ ^^^^^^^^^^^^^^^^^^^
+out/test/typecheck/bad-atomic-type-mismatch.txt:15:33: error: type mismatch in i32.atomic.store, expected i32 but got f32.
+ (func f32.const 0 i32.const 0 i32.atomic.store)
+ ^^^^^^^^^^^^^^^^
+out/test/typecheck/bad-atomic-type-mismatch.txt:16:33: error: type mismatch in i64.atomic.store, expected i32 but got f32.
+ (func f32.const 0 i64.const 0 i64.atomic.store)
+ ^^^^^^^^^^^^^^^^
+out/test/typecheck/bad-atomic-type-mismatch.txt:17:33: error: type mismatch in i32.atomic.store8, expected i32 but got f32.
+ (func f32.const 0 i32.const 0 i32.atomic.store8)
+ ^^^^^^^^^^^^^^^^^
+out/test/typecheck/bad-atomic-type-mismatch.txt:18:33: error: type mismatch in i32.atomic.store16, expected i32 but got f32.
+ (func f32.const 0 i32.const 0 i32.atomic.store16)
+ ^^^^^^^^^^^^^^^^^^
+out/test/typecheck/bad-atomic-type-mismatch.txt:19:33: error: type mismatch in i64.atomic.store8, expected i32 but got f32.
+ (func f32.const 0 i64.const 0 i64.atomic.store8)
+ ^^^^^^^^^^^^^^^^^
+out/test/typecheck/bad-atomic-type-mismatch.txt:20:33: error: type mismatch in i64.atomic.store16, expected i32 but got f32.
+ (func f32.const 0 i64.const 0 i64.atomic.store16)
+ ^^^^^^^^^^^^^^^^^^
+out/test/typecheck/bad-atomic-type-mismatch.txt:21:33: error: type mismatch in i64.atomic.store32, expected i32 but got f32.
+ (func f32.const 0 i64.const 0 i64.atomic.store32)
+ ^^^^^^^^^^^^^^^^^^
+out/test/typecheck/bad-atomic-type-mismatch.txt:22:33: error: type mismatch in i32.atomic.rmw.add, expected i32 but got f32.
+ (func f32.const 0 i32.const 0 i32.atomic.rmw.add drop)
+ ^^^^^^^^^^^^^^^^^^
+out/test/typecheck/bad-atomic-type-mismatch.txt:23:33: error: type mismatch in i64.atomic.rmw.add, expected i32 but got f32.
+ (func f32.const 0 i64.const 0 i64.atomic.rmw.add drop)
+ ^^^^^^^^^^^^^^^^^^
+out/test/typecheck/bad-atomic-type-mismatch.txt:24:33: error: type mismatch in i32.atomic.rmw8_u.add, expected i32 but got f32.
+ (func f32.const 0 i32.const 0 i32.atomic.rmw8_u.add drop)
+ ^^^^^^^^^^^^^^^^^^^^^
+out/test/typecheck/bad-atomic-type-mismatch.txt:25:33: error: type mismatch in i32.atomic.rmw16_u.add, expected i32 but got f32.
+ (func f32.const 0 i32.const 0 i32.atomic.rmw16_u.add drop)
+ ^^^^^^^^^^^^^^^^^^^^^^
+out/test/typecheck/bad-atomic-type-mismatch.txt:26:33: error: type mismatch in i64.atomic.rmw8_u.add, expected i32 but got f32.
+ (func f32.const 0 i64.const 0 i64.atomic.rmw8_u.add drop)
+ ^^^^^^^^^^^^^^^^^^^^^
+out/test/typecheck/bad-atomic-type-mismatch.txt:27:33: error: type mismatch in i64.atomic.rmw16_u.add, expected i32 but got f32.
+ (func f32.const 0 i64.const 0 i64.atomic.rmw16_u.add drop)
+ ^^^^^^^^^^^^^^^^^^^^^^
+out/test/typecheck/bad-atomic-type-mismatch.txt:28:33: error: type mismatch in i64.atomic.rmw32_u.add, expected i32 but got f32.
+ (func f32.const 0 i64.const 0 i64.atomic.rmw32_u.add drop)
+ ^^^^^^^^^^^^^^^^^^^^^^
+out/test/typecheck/bad-atomic-type-mismatch.txt:29:33: error: type mismatch in i32.atomic.rmw.sub, expected i32 but got f32.
+ (func f32.const 0 i32.const 0 i32.atomic.rmw.sub drop)
+ ^^^^^^^^^^^^^^^^^^
+out/test/typecheck/bad-atomic-type-mismatch.txt:30:33: error: type mismatch in i64.atomic.rmw.sub, expected i32 but got f32.
+ (func f32.const 0 i64.const 0 i64.atomic.rmw.sub drop)
+ ^^^^^^^^^^^^^^^^^^
+out/test/typecheck/bad-atomic-type-mismatch.txt:31:33: error: type mismatch in i32.atomic.rmw8_u.sub, expected i32 but got f32.
+ (func f32.const 0 i32.const 0 i32.atomic.rmw8_u.sub drop)
+ ^^^^^^^^^^^^^^^^^^^^^
+out/test/typecheck/bad-atomic-type-mismatch.txt:32:33: error: type mismatch in i32.atomic.rmw16_u.sub, expected i32 but got f32.
+ (func f32.const 0 i32.const 0 i32.atomic.rmw16_u.sub drop)
+ ^^^^^^^^^^^^^^^^^^^^^^
+out/test/typecheck/bad-atomic-type-mismatch.txt:33:33: error: type mismatch in i64.atomic.rmw8_u.sub, expected i32 but got f32.
+ (func f32.const 0 i64.const 0 i64.atomic.rmw8_u.sub drop)
+ ^^^^^^^^^^^^^^^^^^^^^
+out/test/typecheck/bad-atomic-type-mismatch.txt:34:33: error: type mismatch in i64.atomic.rmw16_u.sub, expected i32 but got f32.
+ (func f32.const 0 i64.const 0 i64.atomic.rmw16_u.sub drop)
+ ^^^^^^^^^^^^^^^^^^^^^^
+out/test/typecheck/bad-atomic-type-mismatch.txt:35:33: error: type mismatch in i64.atomic.rmw32_u.sub, expected i32 but got f32.
+ (func f32.const 0 i64.const 0 i64.atomic.rmw32_u.sub drop)
+ ^^^^^^^^^^^^^^^^^^^^^^
+out/test/typecheck/bad-atomic-type-mismatch.txt:36:33: error: type mismatch in i32.atomic.rmw.and, expected i32 but got f32.
+ (func f32.const 0 i32.const 0 i32.atomic.rmw.and drop)
+ ^^^^^^^^^^^^^^^^^^
+out/test/typecheck/bad-atomic-type-mismatch.txt:37:33: error: type mismatch in i64.atomic.rmw.and, expected i32 but got f32.
+ (func f32.const 0 i64.const 0 i64.atomic.rmw.and drop)
+ ^^^^^^^^^^^^^^^^^^
+out/test/typecheck/bad-atomic-type-mismatch.txt:38:33: error: type mismatch in i32.atomic.rmw8_u.and, expected i32 but got f32.
+ (func f32.const 0 i32.const 0 i32.atomic.rmw8_u.and drop)
+ ^^^^^^^^^^^^^^^^^^^^^
+out/test/typecheck/bad-atomic-type-mismatch.txt:39:33: error: type mismatch in i32.atomic.rmw16_u.and, expected i32 but got f32.
+ (func f32.const 0 i32.const 0 i32.atomic.rmw16_u.and drop)
+ ^^^^^^^^^^^^^^^^^^^^^^
+out/test/typecheck/bad-atomic-type-mismatch.txt:40:33: error: type mismatch in i64.atomic.rmw8_u.and, expected i32 but got f32.
+ (func f32.const 0 i64.const 0 i64.atomic.rmw8_u.and drop)
+ ^^^^^^^^^^^^^^^^^^^^^
+out/test/typecheck/bad-atomic-type-mismatch.txt:41:33: error: type mismatch in i64.atomic.rmw16_u.and, expected i32 but got f32.
+ (func f32.const 0 i64.const 0 i64.atomic.rmw16_u.and drop)
+ ^^^^^^^^^^^^^^^^^^^^^^
+out/test/typecheck/bad-atomic-type-mismatch.txt:42:33: error: type mismatch in i64.atomic.rmw32_u.and, expected i32 but got f32.
+ (func f32.const 0 i64.const 0 i64.atomic.rmw32_u.and drop)
+ ^^^^^^^^^^^^^^^^^^^^^^
+out/test/typecheck/bad-atomic-type-mismatch.txt:43:33: error: type mismatch in i32.atomic.rmw.or, expected i32 but got f32.
+ (func f32.const 0 i32.const 0 i32.atomic.rmw.or drop)
+ ^^^^^^^^^^^^^^^^^
+out/test/typecheck/bad-atomic-type-mismatch.txt:44:33: error: type mismatch in i64.atomic.rmw.or, expected i32 but got f32.
+ (func f32.const 0 i64.const 0 i64.atomic.rmw.or drop)
+ ^^^^^^^^^^^^^^^^^
+out/test/typecheck/bad-atomic-type-mismatch.txt:45:33: error: type mismatch in i32.atomic.rmw8_u.or, expected i32 but got f32.
+ (func f32.const 0 i32.const 0 i32.atomic.rmw8_u.or drop)
+ ^^^^^^^^^^^^^^^^^^^^
+out/test/typecheck/bad-atomic-type-mismatch.txt:46:33: error: type mismatch in i32.atomic.rmw16_u.or, expected i32 but got f32.
+ (func f32.const 0 i32.const 0 i32.atomic.rmw16_u.or drop)
+ ^^^^^^^^^^^^^^^^^^^^^
+out/test/typecheck/bad-atomic-type-mismatch.txt:47:33: error: type mismatch in i64.atomic.rmw8_u.or, expected i32 but got f32.
+ (func f32.const 0 i64.const 0 i64.atomic.rmw8_u.or drop)
+ ^^^^^^^^^^^^^^^^^^^^
+out/test/typecheck/bad-atomic-type-mismatch.txt:48:33: error: type mismatch in i64.atomic.rmw16_u.or, expected i32 but got f32.
+ (func f32.const 0 i64.const 0 i64.atomic.rmw16_u.or drop)
+ ^^^^^^^^^^^^^^^^^^^^^
+out/test/typecheck/bad-atomic-type-mismatch.txt:49:33: error: type mismatch in i64.atomic.rmw32_u.or, expected i32 but got f32.
+ (func f32.const 0 i64.const 0 i64.atomic.rmw32_u.or drop)
+ ^^^^^^^^^^^^^^^^^^^^^
+out/test/typecheck/bad-atomic-type-mismatch.txt:50:33: error: type mismatch in i32.atomic.rmw.xor, expected i32 but got f32.
+ (func f32.const 0 i32.const 0 i32.atomic.rmw.xor drop)
+ ^^^^^^^^^^^^^^^^^^
+out/test/typecheck/bad-atomic-type-mismatch.txt:51:33: error: type mismatch in i64.atomic.rmw.xor, expected i32 but got f32.
+ (func f32.const 0 i64.const 0 i64.atomic.rmw.xor drop)
+ ^^^^^^^^^^^^^^^^^^
+out/test/typecheck/bad-atomic-type-mismatch.txt:52:33: error: type mismatch in i32.atomic.rmw8_u.xor, expected i32 but got f32.
+ (func f32.const 0 i32.const 0 i32.atomic.rmw8_u.xor drop)
+ ^^^^^^^^^^^^^^^^^^^^^
+out/test/typecheck/bad-atomic-type-mismatch.txt:53:33: error: type mismatch in i32.atomic.rmw16_u.xor, expected i32 but got f32.
+ (func f32.const 0 i32.const 0 i32.atomic.rmw16_u.xor drop)
+ ^^^^^^^^^^^^^^^^^^^^^^
+out/test/typecheck/bad-atomic-type-mismatch.txt:54:33: error: type mismatch in i64.atomic.rmw8_u.xor, expected i32 but got f32.
+ (func f32.const 0 i64.const 0 i64.atomic.rmw8_u.xor drop)
+ ^^^^^^^^^^^^^^^^^^^^^
+out/test/typecheck/bad-atomic-type-mismatch.txt:55:33: error: type mismatch in i64.atomic.rmw16_u.xor, expected i32 but got f32.
+ (func f32.const 0 i64.const 0 i64.atomic.rmw16_u.xor drop)
+ ^^^^^^^^^^^^^^^^^^^^^^
+out/test/typecheck/bad-atomic-type-mismatch.txt:56:33: error: type mismatch in i64.atomic.rmw32_u.xor, expected i32 but got f32.
+ (func f32.const 0 i64.const 0 i64.atomic.rmw32_u.xor drop)
+ ^^^^^^^^^^^^^^^^^^^^^^
+out/test/typecheck/bad-atomic-type-mismatch.txt:57:33: error: type mismatch in i32.atomic.rmw.xchg, expected i32 but got f32.
+ (func f32.const 0 i32.const 0 i32.atomic.rmw.xchg drop)
+ ^^^^^^^^^^^^^^^^^^^
+out/test/typecheck/bad-atomic-type-mismatch.txt:58:33: error: type mismatch in i64.atomic.rmw.xchg, expected i32 but got f32.
+ (func f32.const 0 i64.const 0 i64.atomic.rmw.xchg drop)
+ ^^^^^^^^^^^^^^^^^^^
+out/test/typecheck/bad-atomic-type-mismatch.txt:59:33: error: type mismatch in i32.atomic.rmw8_u.xchg, expected i32 but got f32.
+ (func f32.const 0 i32.const 0 i32.atomic.rmw8_u.xchg drop)
+ ^^^^^^^^^^^^^^^^^^^^^^
+out/test/typecheck/bad-atomic-type-mismatch.txt:60:33: error: type mismatch in i32.atomic.rmw16_u.xchg, expected i32 but got f32.
+ (func f32.const 0 i32.const 0 i32.atomic.rmw16_u.xchg drop)
+ ^^^^^^^^^^^^^^^^^^^^^^^
+out/test/typecheck/bad-atomic-type-mismatch.txt:61:33: error: type mismatch in i64.atomic.rmw8_u.xchg, expected i32 but got f32.
+ (func f32.const 0 i64.const 0 i64.atomic.rmw8_u.xchg drop)
+ ^^^^^^^^^^^^^^^^^^^^^^
+out/test/typecheck/bad-atomic-type-mismatch.txt:62:33: error: type mismatch in i64.atomic.rmw16_u.xchg, expected i32 but got f32.
+ (func f32.const 0 i64.const 0 i64.atomic.rmw16_u.xchg drop)
+ ^^^^^^^^^^^^^^^^^^^^^^^
+out/test/typecheck/bad-atomic-type-mismatch.txt:63:33: error: type mismatch in i64.atomic.rmw32_u.xchg, expected i32 but got f32.
+ (func f32.const 0 i64.const 0 i64.atomic.rmw32_u.xchg drop)
+ ^^^^^^^^^^^^^^^^^^^^^^^
+out/test/typecheck/bad-atomic-type-mismatch.txt:64:45: error: type mismatch in i32.atomic.rmw.cmpxchg, expected i32 but got f32.
+ (func f32.const 0 i32.const 0 i32.const 0 i32.atomic.rmw.cmpxchg drop)
+ ^^^^^^^^^^^^^^^^^^^^^^
+out/test/typecheck/bad-atomic-type-mismatch.txt:65:45: error: type mismatch in i64.atomic.rmw.cmpxchg, expected i32 but got f32.
+ (func f32.const 0 i64.const 0 i64.const 0 i64.atomic.rmw.cmpxchg drop)
+ ^^^^^^^^^^^^^^^^^^^^^^
+out/test/typecheck/bad-atomic-type-mismatch.txt:66:45: error: type mismatch in i32.atomic.rmw8_u.cmpxchg, expected i32 but got f32.
+ (func f32.const 0 i32.const 0 i32.const 0 i32.atomic.rmw8_u.cmpxchg drop)
+ ^^^^^^^^^^^^^^^^^^^^^^^^^
+out/test/typecheck/bad-atomic-type-mismatch.txt:67:45: error: type mismatch in i32.atomic.rmw16_u.cmpxchg, expected i32 but got f32.
+ (func f32.const 0 i32.const 0 i32.const 0 i32.atomic.rmw16_u.cmpxchg drop)
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^
+out/test/typecheck/bad-atomic-type-mismatch.txt:68:45: error: type mismatch in i64.atomic.rmw8_u.cmpxchg, expected i32 but got f32.
+ (func f32.const 0 i64.const 0 i64.const 0 i64.atomic.rmw8_u.cmpxchg drop)
+ ^^^^^^^^^^^^^^^^^^^^^^^^^
+out/test/typecheck/bad-atomic-type-mismatch.txt:69:45: error: type mismatch in i64.atomic.rmw16_u.cmpxchg, expected i32 but got f32.
+ (func f32.const 0 i64.const 0 i64.const 0 i64.atomic.rmw16_u.cmpxchg drop)
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^
+out/test/typecheck/bad-atomic-type-mismatch.txt:70:45: error: type mismatch in i64.atomic.rmw32_u.cmpxchg, expected i32 but got f32.
+ (func f32.const 0 i64.const 0 i64.const 0 i64.atomic.rmw32_u.cmpxchg drop)
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^
+out/test/typecheck/bad-atomic-type-mismatch.txt:73:33: error: type mismatch in i32.atomic.store, expected i32 but got f32.
+ (func i32.const 0 f32.const 0 i32.atomic.store)
+ ^^^^^^^^^^^^^^^^
+out/test/typecheck/bad-atomic-type-mismatch.txt:74:33: error: type mismatch in i64.atomic.store, expected i64 but got f64.
+ (func i32.const 0 f64.const 0 i64.atomic.store)
+ ^^^^^^^^^^^^^^^^
+out/test/typecheck/bad-atomic-type-mismatch.txt:75:33: error: type mismatch in i32.atomic.store8, expected i32 but got f32.
+ (func i32.const 0 f32.const 0 i32.atomic.store8)
+ ^^^^^^^^^^^^^^^^^
+out/test/typecheck/bad-atomic-type-mismatch.txt:76:33: error: type mismatch in i32.atomic.store16, expected i32 but got f32.
+ (func i32.const 0 f32.const 0 i32.atomic.store16)
+ ^^^^^^^^^^^^^^^^^^
+out/test/typecheck/bad-atomic-type-mismatch.txt:77:33: error: type mismatch in i64.atomic.store8, expected i64 but got f64.
+ (func i32.const 0 f64.const 0 i64.atomic.store8)
+ ^^^^^^^^^^^^^^^^^
+out/test/typecheck/bad-atomic-type-mismatch.txt:78:33: error: type mismatch in i64.atomic.store16, expected i64 but got f64.
+ (func i32.const 0 f64.const 0 i64.atomic.store16)
+ ^^^^^^^^^^^^^^^^^^
+out/test/typecheck/bad-atomic-type-mismatch.txt:79:33: error: type mismatch in i64.atomic.store32, expected i64 but got f64.
+ (func i32.const 0 f64.const 0 i64.atomic.store32)
+ ^^^^^^^^^^^^^^^^^^
+out/test/typecheck/bad-atomic-type-mismatch.txt:80:33: error: type mismatch in i32.atomic.rmw.add, expected i32 but got f32.
+ (func i32.const 0 f32.const 0 i32.atomic.rmw.add drop)
+ ^^^^^^^^^^^^^^^^^^
+out/test/typecheck/bad-atomic-type-mismatch.txt:81:33: error: type mismatch in i64.atomic.rmw.add, expected i64 but got f64.
+ (func i32.const 0 f64.const 0 i64.atomic.rmw.add drop)
+ ^^^^^^^^^^^^^^^^^^
+out/test/typecheck/bad-atomic-type-mismatch.txt:82:33: error: type mismatch in i32.atomic.rmw8_u.add, expected i32 but got f32.
+ (func i32.const 0 f32.const 0 i32.atomic.rmw8_u.add drop)
+ ^^^^^^^^^^^^^^^^^^^^^
+out/test/typecheck/bad-atomic-type-mismatch.txt:83:33: error: type mismatch in i32.atomic.rmw16_u.add, expected i32 but got f32.
+ (func i32.const 0 f32.const 0 i32.atomic.rmw16_u.add drop)
+ ^^^^^^^^^^^^^^^^^^^^^^
+out/test/typecheck/bad-atomic-type-mismatch.txt:84:33: error: type mismatch in i64.atomic.rmw8_u.add, expected i64 but got f64.
+ (func i32.const 0 f64.const 0 i64.atomic.rmw8_u.add drop)
+ ^^^^^^^^^^^^^^^^^^^^^
+out/test/typecheck/bad-atomic-type-mismatch.txt:85:33: error: type mismatch in i64.atomic.rmw16_u.add, expected i64 but got f64.
+ (func i32.const 0 f64.const 0 i64.atomic.rmw16_u.add drop)
+ ^^^^^^^^^^^^^^^^^^^^^^
+out/test/typecheck/bad-atomic-type-mismatch.txt:86:33: error: type mismatch in i64.atomic.rmw32_u.add, expected i64 but got f64.
+ (func i32.const 0 f64.const 0 i64.atomic.rmw32_u.add drop)
+ ^^^^^^^^^^^^^^^^^^^^^^
+out/test/typecheck/bad-atomic-type-mismatch.txt:87:33: error: type mismatch in i32.atomic.rmw.sub, expected i32 but got f32.
+ (func i32.const 0 f32.const 0 i32.atomic.rmw.sub drop)
+ ^^^^^^^^^^^^^^^^^^
+out/test/typecheck/bad-atomic-type-mismatch.txt:88:33: error: type mismatch in i64.atomic.rmw.sub, expected i64 but got f64.
+ (func i32.const 0 f64.const 0 i64.atomic.rmw.sub drop)
+ ^^^^^^^^^^^^^^^^^^
+out/test/typecheck/bad-atomic-type-mismatch.txt:89:33: error: type mismatch in i32.atomic.rmw8_u.sub, expected i32 but got f32.
+ (func i32.const 0 f32.const 0 i32.atomic.rmw8_u.sub drop)
+ ^^^^^^^^^^^^^^^^^^^^^
+out/test/typecheck/bad-atomic-type-mismatch.txt:90:33: error: type mismatch in i32.atomic.rmw16_u.sub, expected i32 but got f32.
+ (func i32.const 0 f32.const 0 i32.atomic.rmw16_u.sub drop)
+ ^^^^^^^^^^^^^^^^^^^^^^
+out/test/typecheck/bad-atomic-type-mismatch.txt:91:33: error: type mismatch in i64.atomic.rmw8_u.sub, expected i64 but got f64.
+ (func i32.const 0 f64.const 0 i64.atomic.rmw8_u.sub drop)
+ ^^^^^^^^^^^^^^^^^^^^^
+out/test/typecheck/bad-atomic-type-mismatch.txt:92:33: error: type mismatch in i64.atomic.rmw16_u.sub, expected i64 but got f64.
+ (func i32.const 0 f64.const 0 i64.atomic.rmw16_u.sub drop)
+ ^^^^^^^^^^^^^^^^^^^^^^
+out/test/typecheck/bad-atomic-type-mismatch.txt:93:33: error: type mismatch in i64.atomic.rmw32_u.sub, expected i64 but got f64.
+ (func i32.const 0 f64.const 0 i64.atomic.rmw32_u.sub drop)
+ ^^^^^^^^^^^^^^^^^^^^^^
+out/test/typecheck/bad-atomic-type-mismatch.txt:94:33: error: type mismatch in i32.atomic.rmw.and, expected i32 but got f32.
+ (func i32.const 0 f32.const 0 i32.atomic.rmw.and drop)
+ ^^^^^^^^^^^^^^^^^^
+out/test/typecheck/bad-atomic-type-mismatch.txt:95:33: error: type mismatch in i64.atomic.rmw.and, expected i64 but got f64.
+ (func i32.const 0 f64.const 0 i64.atomic.rmw.and drop)
+ ^^^^^^^^^^^^^^^^^^
+out/test/typecheck/bad-atomic-type-mismatch.txt:96:33: error: type mismatch in i32.atomic.rmw8_u.and, expected i32 but got f32.
+ (func i32.const 0 f32.const 0 i32.atomic.rmw8_u.and drop)
+ ^^^^^^^^^^^^^^^^^^^^^
+out/test/typecheck/bad-atomic-type-mismatch.txt:97:33: error: type mismatch in i32.atomic.rmw16_u.and, expected i32 but got f32.
+ (func i32.const 0 f32.const 0 i32.atomic.rmw16_u.and drop)
+ ^^^^^^^^^^^^^^^^^^^^^^
+out/test/typecheck/bad-atomic-type-mismatch.txt:98:33: error: type mismatch in i64.atomic.rmw8_u.and, expected i64 but got f64.
+ (func i32.const 0 f64.const 0 i64.atomic.rmw8_u.and drop)
+ ^^^^^^^^^^^^^^^^^^^^^
+out/test/typecheck/bad-atomic-type-mismatch.txt:99:33: error: type mismatch in i64.atomic.rmw16_u.and, expected i64 but got f64.
+ (func i32.const 0 f64.const 0 i64.atomic.rmw16_u.and drop)
+ ^^^^^^^^^^^^^^^^^^^^^^
+out/test/typecheck/bad-atomic-type-mismatch.txt:100:33: error: type mismatch in i64.atomic.rmw32_u.and, expected i64 but got f64.
+ (func i32.const 0 f64.const 0 i64.atomic.rmw32_u.and drop)
+ ^^^^^^^^^^^^^^^^^^^^^^
+out/test/typecheck/bad-atomic-type-mismatch.txt:101:33: error: type mismatch in i32.atomic.rmw.or, expected i32 but got f32.
+ (func i32.const 0 f32.const 0 i32.atomic.rmw.or drop)
+ ^^^^^^^^^^^^^^^^^
+out/test/typecheck/bad-atomic-type-mismatch.txt:102:33: error: type mismatch in i64.atomic.rmw.or, expected i64 but got f64.
+ (func i32.const 0 f64.const 0 i64.atomic.rmw.or drop)
+ ^^^^^^^^^^^^^^^^^
+out/test/typecheck/bad-atomic-type-mismatch.txt:103:33: error: type mismatch in i32.atomic.rmw8_u.or, expected i32 but got f32.
+ (func i32.const 0 f32.const 0 i32.atomic.rmw8_u.or drop)
+ ^^^^^^^^^^^^^^^^^^^^
+out/test/typecheck/bad-atomic-type-mismatch.txt:104:33: error: type mismatch in i32.atomic.rmw16_u.or, expected i32 but got f32.
+ (func i32.const 0 f32.const 0 i32.atomic.rmw16_u.or drop)
+ ^^^^^^^^^^^^^^^^^^^^^
+out/test/typecheck/bad-atomic-type-mismatch.txt:105:33: error: type mismatch in i64.atomic.rmw8_u.or, expected i64 but got f64.
+ (func i32.const 0 f64.const 0 i64.atomic.rmw8_u.or drop)
+ ^^^^^^^^^^^^^^^^^^^^
+out/test/typecheck/bad-atomic-type-mismatch.txt:106:33: error: type mismatch in i64.atomic.rmw16_u.or, expected i64 but got f64.
+ (func i32.const 0 f64.const 0 i64.atomic.rmw16_u.or drop)
+ ^^^^^^^^^^^^^^^^^^^^^
+out/test/typecheck/bad-atomic-type-mismatch.txt:107:33: error: type mismatch in i64.atomic.rmw32_u.or, expected i64 but got f64.
+ (func i32.const 0 f64.const 0 i64.atomic.rmw32_u.or drop)
+ ^^^^^^^^^^^^^^^^^^^^^
+out/test/typecheck/bad-atomic-type-mismatch.txt:108:33: error: type mismatch in i32.atomic.rmw.xor, expected i32 but got f32.
+ (func i32.const 0 f32.const 0 i32.atomic.rmw.xor drop)
+ ^^^^^^^^^^^^^^^^^^
+out/test/typecheck/bad-atomic-type-mismatch.txt:109:33: error: type mismatch in i64.atomic.rmw.xor, expected i64 but got f64.
+ (func i32.const 0 f64.const 0 i64.atomic.rmw.xor drop)
+ ^^^^^^^^^^^^^^^^^^
+out/test/typecheck/bad-atomic-type-mismatch.txt:110:33: error: type mismatch in i32.atomic.rmw8_u.xor, expected i32 but got f32.
+ (func i32.const 0 f32.const 0 i32.atomic.rmw8_u.xor drop)
+ ^^^^^^^^^^^^^^^^^^^^^
+out/test/typecheck/bad-atomic-type-mismatch.txt:111:33: error: type mismatch in i32.atomic.rmw16_u.xor, expected i32 but got f32.
+ (func i32.const 0 f32.const 0 i32.atomic.rmw16_u.xor drop)
+ ^^^^^^^^^^^^^^^^^^^^^^
+out/test/typecheck/bad-atomic-type-mismatch.txt:112:33: error: type mismatch in i64.atomic.rmw8_u.xor, expected i64 but got f64.
+ (func i32.const 0 f64.const 0 i64.atomic.rmw8_u.xor drop)
+ ^^^^^^^^^^^^^^^^^^^^^
+out/test/typecheck/bad-atomic-type-mismatch.txt:113:33: error: type mismatch in i64.atomic.rmw16_u.xor, expected i64 but got f64.
+ (func i32.const 0 f64.const 0 i64.atomic.rmw16_u.xor drop)
+ ^^^^^^^^^^^^^^^^^^^^^^
+out/test/typecheck/bad-atomic-type-mismatch.txt:114:33: error: type mismatch in i64.atomic.rmw32_u.xor, expected i64 but got f64.
+ (func i32.const 0 f64.const 0 i64.atomic.rmw32_u.xor drop)
+ ^^^^^^^^^^^^^^^^^^^^^^
+out/test/typecheck/bad-atomic-type-mismatch.txt:115:33: error: type mismatch in i32.atomic.rmw.xchg, expected i32 but got f32.
+ (func i32.const 0 f32.const 0 i32.atomic.rmw.xchg drop)
+ ^^^^^^^^^^^^^^^^^^^
+out/test/typecheck/bad-atomic-type-mismatch.txt:116:33: error: type mismatch in i64.atomic.rmw.xchg, expected i64 but got f64.
+ (func i32.const 0 f64.const 0 i64.atomic.rmw.xchg drop)
+ ^^^^^^^^^^^^^^^^^^^
+out/test/typecheck/bad-atomic-type-mismatch.txt:117:33: error: type mismatch in i32.atomic.rmw8_u.xchg, expected i32 but got f32.
+ (func i32.const 0 f32.const 0 i32.atomic.rmw8_u.xchg drop)
+ ^^^^^^^^^^^^^^^^^^^^^^
+out/test/typecheck/bad-atomic-type-mismatch.txt:118:33: error: type mismatch in i32.atomic.rmw16_u.xchg, expected i32 but got f32.
+ (func i32.const 0 f32.const 0 i32.atomic.rmw16_u.xchg drop)
+ ^^^^^^^^^^^^^^^^^^^^^^^
+out/test/typecheck/bad-atomic-type-mismatch.txt:119:33: error: type mismatch in i64.atomic.rmw8_u.xchg, expected i64 but got f64.
+ (func i32.const 0 f64.const 0 i64.atomic.rmw8_u.xchg drop)
+ ^^^^^^^^^^^^^^^^^^^^^^
+out/test/typecheck/bad-atomic-type-mismatch.txt:120:33: error: type mismatch in i64.atomic.rmw16_u.xchg, expected i64 but got f64.
+ (func i32.const 0 f64.const 0 i64.atomic.rmw16_u.xchg drop)
+ ^^^^^^^^^^^^^^^^^^^^^^^
+out/test/typecheck/bad-atomic-type-mismatch.txt:121:33: error: type mismatch in i64.atomic.rmw32_u.xchg, expected i64 but got f64.
+ (func i32.const 0 f64.const 0 i64.atomic.rmw32_u.xchg drop)
+ ^^^^^^^^^^^^^^^^^^^^^^^
+out/test/typecheck/bad-atomic-type-mismatch.txt:122:45: error: type mismatch in i32.atomic.rmw.cmpxchg, expected i32 but got f32.
+ (func i32.const 0 f32.const 0 i32.const 0 i32.atomic.rmw.cmpxchg drop)
+ ^^^^^^^^^^^^^^^^^^^^^^
+out/test/typecheck/bad-atomic-type-mismatch.txt:123:45: error: type mismatch in i64.atomic.rmw.cmpxchg, expected i64 but got f64.
+ (func i32.const 0 f64.const 0 i64.const 0 i64.atomic.rmw.cmpxchg drop)
+ ^^^^^^^^^^^^^^^^^^^^^^
+out/test/typecheck/bad-atomic-type-mismatch.txt:124:45: error: type mismatch in i32.atomic.rmw8_u.cmpxchg, expected i32 but got f32.
+ (func i32.const 0 f32.const 0 i32.const 0 i32.atomic.rmw8_u.cmpxchg drop)
+ ^^^^^^^^^^^^^^^^^^^^^^^^^
+out/test/typecheck/bad-atomic-type-mismatch.txt:125:45: error: type mismatch in i32.atomic.rmw16_u.cmpxchg, expected i32 but got f32.
+ (func i32.const 0 f32.const 0 i32.const 0 i32.atomic.rmw16_u.cmpxchg drop)
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^
+out/test/typecheck/bad-atomic-type-mismatch.txt:126:45: error: type mismatch in i64.atomic.rmw8_u.cmpxchg, expected i64 but got f64.
+ (func i32.const 0 f64.const 0 i64.const 0 i64.atomic.rmw8_u.cmpxchg drop)
+ ^^^^^^^^^^^^^^^^^^^^^^^^^
+out/test/typecheck/bad-atomic-type-mismatch.txt:127:45: error: type mismatch in i64.atomic.rmw16_u.cmpxchg, expected i64 but got f64.
+ (func i32.const 0 f64.const 0 i64.const 0 i64.atomic.rmw16_u.cmpxchg drop)
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^
+out/test/typecheck/bad-atomic-type-mismatch.txt:128:45: error: type mismatch in i64.atomic.rmw32_u.cmpxchg, expected i64 but got f64.
+ (func i32.const 0 f64.const 0 i64.const 0 i64.atomic.rmw32_u.cmpxchg drop)
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^
+out/test/typecheck/bad-atomic-type-mismatch.txt:131:45: error: type mismatch in i32.atomic.rmw.cmpxchg, expected i32 but got f32.
+ (func i32.const 0 i32.const 0 f32.const 0 i32.atomic.rmw.cmpxchg drop)
+ ^^^^^^^^^^^^^^^^^^^^^^
+out/test/typecheck/bad-atomic-type-mismatch.txt:132:45: error: type mismatch in i64.atomic.rmw.cmpxchg, expected i64 but got f64.
+ (func i32.const 0 i64.const 0 f64.const 0 i64.atomic.rmw.cmpxchg drop)
+ ^^^^^^^^^^^^^^^^^^^^^^
+out/test/typecheck/bad-atomic-type-mismatch.txt:133:45: error: type mismatch in i32.atomic.rmw8_u.cmpxchg, expected i32 but got f32.
+ (func i32.const 0 i32.const 0 f32.const 0 i32.atomic.rmw8_u.cmpxchg drop)
+ ^^^^^^^^^^^^^^^^^^^^^^^^^
+out/test/typecheck/bad-atomic-type-mismatch.txt:134:45: error: type mismatch in i32.atomic.rmw16_u.cmpxchg, expected i32 but got f32.
+ (func i32.const 0 i32.const 0 f32.const 0 i32.atomic.rmw16_u.cmpxchg drop)
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^
+out/test/typecheck/bad-atomic-type-mismatch.txt:135:45: error: type mismatch in i64.atomic.rmw8_u.cmpxchg, expected i64 but got f64.
+ (func i32.const 0 i64.const 0 f64.const 0 i64.atomic.rmw8_u.cmpxchg drop)
+ ^^^^^^^^^^^^^^^^^^^^^^^^^
+out/test/typecheck/bad-atomic-type-mismatch.txt:136:45: error: type mismatch in i64.atomic.rmw16_u.cmpxchg, expected i64 but got f64.
+ (func i32.const 0 i64.const 0 f64.const 0 i64.atomic.rmw16_u.cmpxchg drop)
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^
+out/test/typecheck/bad-atomic-type-mismatch.txt:137:45: error: type mismatch in i64.atomic.rmw32_u.cmpxchg, expected i64 but got f64.
+ (func i32.const 0 i64.const 0 f64.const 0 i64.atomic.rmw32_u.cmpxchg drop)
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^
+out/test/typecheck/bad-atomic-type-mismatch.txt:140:34: error: type mismatch in implicit return, expected f32 but got i32.
+ (func (result f32) i32.const 0 i32.atomic.load)
+ ^^^^^^^^^^^^^^^
+out/test/typecheck/bad-atomic-type-mismatch.txt:141:34: error: type mismatch in implicit return, expected f64 but got i64.
+ (func (result f64) i32.const 0 i64.atomic.load)
+ ^^^^^^^^^^^^^^^
+out/test/typecheck/bad-atomic-type-mismatch.txt:142:34: error: type mismatch in implicit return, expected f32 but got i32.
+ (func (result f32) i32.const 0 i32.atomic.load8_u)
+ ^^^^^^^^^^^^^^^^^^
+out/test/typecheck/bad-atomic-type-mismatch.txt:143:34: error: type mismatch in implicit return, expected f32 but got i32.
+ (func (result f32) i32.const 0 i32.atomic.load16_u)
+ ^^^^^^^^^^^^^^^^^^^
+out/test/typecheck/bad-atomic-type-mismatch.txt:144:34: error: type mismatch in implicit return, expected f64 but got i64.
+ (func (result f64) i32.const 0 i64.atomic.load8_u)
+ ^^^^^^^^^^^^^^^^^^
+out/test/typecheck/bad-atomic-type-mismatch.txt:145:34: error: type mismatch in implicit return, expected f64 but got i64.
+ (func (result f64) i32.const 0 i64.atomic.load16_u)
+ ^^^^^^^^^^^^^^^^^^^
+out/test/typecheck/bad-atomic-type-mismatch.txt:146:34: error: type mismatch in implicit return, expected f64 but got i64.
+ (func (result f64) i32.const 0 i64.atomic.load32_u)
+ ^^^^^^^^^^^^^^^^^^^
+out/test/typecheck/bad-atomic-type-mismatch.txt:147:46: error: type mismatch in implicit return, expected f32 but got i32.
+ (func (result f32) i32.const 0 i32.const 0 i32.atomic.rmw.add)
+ ^^^^^^^^^^^^^^^^^^
+out/test/typecheck/bad-atomic-type-mismatch.txt:148:46: error: type mismatch in implicit return, expected f64 but got i64.
+ (func (result f64) i32.const 0 i64.const 0 i64.atomic.rmw.add)
+ ^^^^^^^^^^^^^^^^^^
+out/test/typecheck/bad-atomic-type-mismatch.txt:149:46: error: type mismatch in implicit return, expected f32 but got i32.
+ (func (result f32) i32.const 0 i32.const 0 i32.atomic.rmw8_u.add)
+ ^^^^^^^^^^^^^^^^^^^^^
+out/test/typecheck/bad-atomic-type-mismatch.txt:150:46: error: type mismatch in implicit return, expected f32 but got i32.
+ (func (result f32) i32.const 0 i32.const 0 i32.atomic.rmw16_u.add)
+ ^^^^^^^^^^^^^^^^^^^^^^
+out/test/typecheck/bad-atomic-type-mismatch.txt:151:46: error: type mismatch in implicit return, expected f64 but got i64.
+ (func (result f64) i32.const 0 i64.const 0 i64.atomic.rmw8_u.add)
+ ^^^^^^^^^^^^^^^^^^^^^
+out/test/typecheck/bad-atomic-type-mismatch.txt:152:46: error: type mismatch in implicit return, expected f64 but got i64.
+ (func (result f64) i32.const 0 i64.const 0 i64.atomic.rmw16_u.add)
+ ^^^^^^^^^^^^^^^^^^^^^^
+out/test/typecheck/bad-atomic-type-mismatch.txt:153:46: error: type mismatch in implicit return, expected f64 but got i64.
+ (func (result f64) i32.const 0 i64.const 0 i64.atomic.rmw32_u.add)
+ ^^^^^^^^^^^^^^^^^^^^^^
+out/test/typecheck/bad-atomic-type-mismatch.txt:154:46: error: type mismatch in implicit return, expected f32 but got i32.
+ (func (result f32) i32.const 0 i32.const 0 i32.atomic.rmw.sub)
+ ^^^^^^^^^^^^^^^^^^
+out/test/typecheck/bad-atomic-type-mismatch.txt:155:46: error: type mismatch in implicit return, expected f64 but got i64.
+ (func (result f64) i32.const 0 i64.const 0 i64.atomic.rmw.sub)
+ ^^^^^^^^^^^^^^^^^^
+out/test/typecheck/bad-atomic-type-mismatch.txt:156:46: error: type mismatch in implicit return, expected f32 but got i32.
+ (func (result f32) i32.const 0 i32.const 0 i32.atomic.rmw8_u.sub)
+ ^^^^^^^^^^^^^^^^^^^^^
+out/test/typecheck/bad-atomic-type-mismatch.txt:157:46: error: type mismatch in implicit return, expected f32 but got i32.
+ (func (result f32) i32.const 0 i32.const 0 i32.atomic.rmw16_u.sub)
+ ^^^^^^^^^^^^^^^^^^^^^^
+out/test/typecheck/bad-atomic-type-mismatch.txt:158:46: error: type mismatch in implicit return, expected f64 but got i64.
+ (func (result f64) i32.const 0 i64.const 0 i64.atomic.rmw8_u.sub)
+ ^^^^^^^^^^^^^^^^^^^^^
+out/test/typecheck/bad-atomic-type-mismatch.txt:159:46: error: type mismatch in implicit return, expected f64 but got i64.
+ (func (result f64) i32.const 0 i64.const 0 i64.atomic.rmw16_u.sub)
+ ^^^^^^^^^^^^^^^^^^^^^^
+out/test/typecheck/bad-atomic-type-mismatch.txt:160:46: error: type mismatch in implicit return, expected f64 but got i64.
+ (func (result f64) i32.const 0 i64.const 0 i64.atomic.rmw32_u.sub)
+ ^^^^^^^^^^^^^^^^^^^^^^
+out/test/typecheck/bad-atomic-type-mismatch.txt:161:46: error: type mismatch in implicit return, expected f32 but got i32.
+ (func (result f32) i32.const 0 i32.const 0 i32.atomic.rmw.and)
+ ^^^^^^^^^^^^^^^^^^
+out/test/typecheck/bad-atomic-type-mismatch.txt:162:46: error: type mismatch in implicit return, expected f64 but got i64.
+ (func (result f64) i32.const 0 i64.const 0 i64.atomic.rmw.and)
+ ^^^^^^^^^^^^^^^^^^
+out/test/typecheck/bad-atomic-type-mismatch.txt:163:46: error: type mismatch in implicit return, expected f32 but got i32.
+ (func (result f32) i32.const 0 i32.const 0 i32.atomic.rmw8_u.and)
+ ^^^^^^^^^^^^^^^^^^^^^
+out/test/typecheck/bad-atomic-type-mismatch.txt:164:46: error: type mismatch in implicit return, expected f32 but got i32.
+ (func (result f32) i32.const 0 i32.const 0 i32.atomic.rmw16_u.and)
+ ^^^^^^^^^^^^^^^^^^^^^^
+out/test/typecheck/bad-atomic-type-mismatch.txt:165:46: error: type mismatch in implicit return, expected f64 but got i64.
+ (func (result f64) i32.const 0 i64.const 0 i64.atomic.rmw8_u.and)
+ ^^^^^^^^^^^^^^^^^^^^^
+out/test/typecheck/bad-atomic-type-mismatch.txt:166:46: error: type mismatch in implicit return, expected f64 but got i64.
+ (func (result f64) i32.const 0 i64.const 0 i64.atomic.rmw16_u.and)
+ ^^^^^^^^^^^^^^^^^^^^^^
+out/test/typecheck/bad-atomic-type-mismatch.txt:167:46: error: type mismatch in implicit return, expected f64 but got i64.
+ (func (result f64) i32.const 0 i64.const 0 i64.atomic.rmw32_u.and)
+ ^^^^^^^^^^^^^^^^^^^^^^
+out/test/typecheck/bad-atomic-type-mismatch.txt:168:46: error: type mismatch in implicit return, expected f32 but got i32.
+ (func (result f32) i32.const 0 i32.const 0 i32.atomic.rmw.or)
+ ^^^^^^^^^^^^^^^^^
+out/test/typecheck/bad-atomic-type-mismatch.txt:169:46: error: type mismatch in implicit return, expected f64 but got i64.
+ (func (result f64) i32.const 0 i64.const 0 i64.atomic.rmw.or)
+ ^^^^^^^^^^^^^^^^^
+out/test/typecheck/bad-atomic-type-mismatch.txt:170:46: error: type mismatch in implicit return, expected f32 but got i32.
+ (func (result f32) i32.const 0 i32.const 0 i32.atomic.rmw8_u.or)
+ ^^^^^^^^^^^^^^^^^^^^
+out/test/typecheck/bad-atomic-type-mismatch.txt:171:46: error: type mismatch in implicit return, expected f32 but got i32.
+ (func (result f32) i32.const 0 i32.const 0 i32.atomic.rmw16_u.or)
+ ^^^^^^^^^^^^^^^^^^^^^
+out/test/typecheck/bad-atomic-type-mismatch.txt:172:46: error: type mismatch in implicit return, expected f64 but got i64.
+ (func (result f64) i32.const 0 i64.const 0 i64.atomic.rmw8_u.or)
+ ^^^^^^^^^^^^^^^^^^^^
+out/test/typecheck/bad-atomic-type-mismatch.txt:173:46: error: type mismatch in implicit return, expected f64 but got i64.
+ (func (result f64) i32.const 0 i64.const 0 i64.atomic.rmw16_u.or)
+ ^^^^^^^^^^^^^^^^^^^^^
+out/test/typecheck/bad-atomic-type-mismatch.txt:174:46: error: type mismatch in implicit return, expected f64 but got i64.
+ (func (result f64) i32.const 0 i64.const 0 i64.atomic.rmw32_u.or)
+ ^^^^^^^^^^^^^^^^^^^^^
+out/test/typecheck/bad-atomic-type-mismatch.txt:175:46: error: type mismatch in implicit return, expected f32 but got i32.
+ (func (result f32) i32.const 0 i32.const 0 i32.atomic.rmw.xor)
+ ^^^^^^^^^^^^^^^^^^
+out/test/typecheck/bad-atomic-type-mismatch.txt:176:46: error: type mismatch in implicit return, expected f64 but got i64.
+ (func (result f64) i32.const 0 i64.const 0 i64.atomic.rmw.xor)
+ ^^^^^^^^^^^^^^^^^^
+out/test/typecheck/bad-atomic-type-mismatch.txt:177:46: error: type mismatch in implicit return, expected f32 but got i32.
+ (func (result f32) i32.const 0 i32.const 0 i32.atomic.rmw8_u.xor)
+ ^^^^^^^^^^^^^^^^^^^^^
+out/test/typecheck/bad-atomic-type-mismatch.txt:178:46: error: type mismatch in implicit return, expected f32 but got i32.
+ (func (result f32) i32.const 0 i32.const 0 i32.atomic.rmw16_u.xor)
+ ^^^^^^^^^^^^^^^^^^^^^^
+out/test/typecheck/bad-atomic-type-mismatch.txt:179:46: error: type mismatch in implicit return, expected f64 but got i64.
+ (func (result f64) i32.const 0 i64.const 0 i64.atomic.rmw8_u.xor)
+ ^^^^^^^^^^^^^^^^^^^^^
+out/test/typecheck/bad-atomic-type-mismatch.txt:180:46: error: type mismatch in implicit return, expected f64 but got i64.
+ (func (result f64) i32.const 0 i64.const 0 i64.atomic.rmw16_u.xor)
+ ^^^^^^^^^^^^^^^^^^^^^^
+out/test/typecheck/bad-atomic-type-mismatch.txt:181:46: error: type mismatch in implicit return, expected f64 but got i64.
+ (func (result f64) i32.const 0 i64.const 0 i64.atomic.rmw32_u.xor)
+ ^^^^^^^^^^^^^^^^^^^^^^
+out/test/typecheck/bad-atomic-type-mismatch.txt:182:46: error: type mismatch in implicit return, expected f32 but got i32.
+ (func (result f32) i32.const 0 i32.const 0 i32.atomic.rmw.xchg)
+ ^^^^^^^^^^^^^^^^^^^
+out/test/typecheck/bad-atomic-type-mismatch.txt:183:46: error: type mismatch in implicit return, expected f64 but got i64.
+ (func (result f64) i32.const 0 i64.const 0 i64.atomic.rmw.xchg)
+ ^^^^^^^^^^^^^^^^^^^
+out/test/typecheck/bad-atomic-type-mismatch.txt:184:46: error: type mismatch in implicit return, expected f32 but got i32.
+ (func (result f32) i32.const 0 i32.const 0 i32.atomic.rmw8_u.xchg)
+ ^^^^^^^^^^^^^^^^^^^^^^
+out/test/typecheck/bad-atomic-type-mismatch.txt:185:46: error: type mismatch in implicit return, expected f32 but got i32.
+ (func (result f32) i32.const 0 i32.const 0 i32.atomic.rmw16_u.xchg)
+ ^^^^^^^^^^^^^^^^^^^^^^^
+out/test/typecheck/bad-atomic-type-mismatch.txt:186:46: error: type mismatch in implicit return, expected f64 but got i64.
+ (func (result f64) i32.const 0 i64.const 0 i64.atomic.rmw8_u.xchg)
+ ^^^^^^^^^^^^^^^^^^^^^^
+out/test/typecheck/bad-atomic-type-mismatch.txt:187:46: error: type mismatch in implicit return, expected f64 but got i64.
+ (func (result f64) i32.const 0 i64.const 0 i64.atomic.rmw16_u.xchg)
+ ^^^^^^^^^^^^^^^^^^^^^^^
+out/test/typecheck/bad-atomic-type-mismatch.txt:188:46: error: type mismatch in implicit return, expected f64 but got i64.
+ (func (result f64) i32.const 0 i64.const 0 i64.atomic.rmw32_u.xchg)
+ ^^^^^^^^^^^^^^^^^^^^^^^
+out/test/typecheck/bad-atomic-type-mismatch.txt:189:58: error: type mismatch in implicit return, expected f32 but got i32.
+ (func (result f32) i32.const 0 i32.const 0 i32.const 0 i32.atomic.rmw.cmpxchg)
+ ^^^^^^^^^^^^^^^^^^^^^^
+out/test/typecheck/bad-atomic-type-mismatch.txt:190:58: error: type mismatch in implicit return, expected f64 but got i64.
+ (func (result f64) i32.const 0 i64.const 0 i64.const 0 i64.atomic.rmw.cmpxchg)
+ ^^^^^^^^^^^^^^^^^^^^^^
+out/test/typecheck/bad-atomic-type-mismatch.txt:191:58: error: type mismatch in implicit return, expected f32 but got i32.
+...c (result f32) i32.const 0 i32.const 0 i32.const 0 i32.atomic.rmw8_u.cmpxchg)
+ ^^^^^^^^^^^^^^^^^^^^^^^^^
+out/test/typecheck/bad-atomic-type-mismatch.txt:192:58: error: type mismatch in implicit return, expected f32 but got i32.
+... (result f32) i32.const 0 i32.const 0 i32.const 0 i32.atomic.rmw16_u.cmpxchg)
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^
+out/test/typecheck/bad-atomic-type-mismatch.txt:193:58: error: type mismatch in implicit return, expected f64 but got i64.
+...c (result f64) i32.const 0 i64.const 0 i64.const 0 i64.atomic.rmw8_u.cmpxchg)
+ ^^^^^^^^^^^^^^^^^^^^^^^^^
+out/test/typecheck/bad-atomic-type-mismatch.txt:194:58: error: type mismatch in implicit return, expected f64 but got i64.
+... (result f64) i32.const 0 i64.const 0 i64.const 0 i64.atomic.rmw16_u.cmpxchg)
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^
+out/test/typecheck/bad-atomic-type-mismatch.txt:195:58: error: type mismatch in implicit return, expected f64 but got i64.
+... (result f64) i32.const 0 i64.const 0 i64.const 0 i64.atomic.rmw32_u.cmpxchg)
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^
+;;; STDERR ;;)