1;;! memory64 = true
2;;! threads = true
3
4;; make sure everything codegens correctly and has no cranelift verifier errors
5(module
6  (memory i64 1)
7  (func (export "run")
8    i64.const 0 i32.atomic.load drop
9    i64.const 0 i64.atomic.load drop
10    i64.const 0 i32.atomic.load8_u drop
11    i64.const 0 i32.atomic.load16_u drop
12    i64.const 0 i64.atomic.load8_u drop
13    i64.const 0 i64.atomic.load16_u drop
14    i64.const 0 i64.atomic.load32_u drop
15    i64.const 0 i32.const 0 i32.atomic.store
16    i64.const 0 i64.const 0 i64.atomic.store
17    i64.const 0 i32.const 0 i32.atomic.store8
18    i64.const 0 i32.const 0 i32.atomic.store16
19    i64.const 0 i64.const 0 i64.atomic.store8
20    i64.const 0 i64.const 0 i64.atomic.store16
21    i64.const 0 i64.const 0 i64.atomic.store32
22    i64.const 0 i32.const 0 i32.atomic.rmw.add drop
23    i64.const 0 i64.const 0 i64.atomic.rmw.add drop
24    i64.const 0 i32.const 0 i32.atomic.rmw8.add_u drop
25    i64.const 0 i32.const 0 i32.atomic.rmw16.add_u drop
26    i64.const 0 i64.const 0 i64.atomic.rmw8.add_u drop
27    i64.const 0 i64.const 0 i64.atomic.rmw16.add_u drop
28    i64.const 0 i64.const 0 i64.atomic.rmw32.add_u drop
29    i64.const 0 i32.const 0 i32.atomic.rmw.sub drop
30    i64.const 0 i64.const 0 i64.atomic.rmw.sub drop
31    i64.const 0 i32.const 0 i32.atomic.rmw8.sub_u drop
32    i64.const 0 i32.const 0 i32.atomic.rmw16.sub_u drop
33    i64.const 0 i64.const 0 i64.atomic.rmw8.sub_u drop
34    i64.const 0 i64.const 0 i64.atomic.rmw16.sub_u drop
35    i64.const 0 i64.const 0 i64.atomic.rmw32.sub_u drop
36    i64.const 0 i32.const 0 i32.atomic.rmw.and drop
37    i64.const 0 i64.const 0 i64.atomic.rmw.and drop
38    i64.const 0 i32.const 0 i32.atomic.rmw8.and_u drop
39    i64.const 0 i32.const 0 i32.atomic.rmw16.and_u drop
40    i64.const 0 i64.const 0 i64.atomic.rmw8.and_u drop
41    i64.const 0 i64.const 0 i64.atomic.rmw16.and_u drop
42    i64.const 0 i64.const 0 i64.atomic.rmw32.and_u drop
43    i64.const 0 i32.const 0 i32.atomic.rmw.or drop
44    i64.const 0 i64.const 0 i64.atomic.rmw.or drop
45    i64.const 0 i32.const 0 i32.atomic.rmw8.or_u drop
46    i64.const 0 i32.const 0 i32.atomic.rmw16.or_u drop
47    i64.const 0 i64.const 0 i64.atomic.rmw8.or_u drop
48    i64.const 0 i64.const 0 i64.atomic.rmw16.or_u drop
49    i64.const 0 i64.const 0 i64.atomic.rmw32.or_u drop
50    i64.const 0 i32.const 0 i32.atomic.rmw.xor drop
51    i64.const 0 i64.const 0 i64.atomic.rmw.xor drop
52    i64.const 0 i32.const 0 i32.atomic.rmw8.xor_u drop
53    i64.const 0 i32.const 0 i32.atomic.rmw16.xor_u drop
54    i64.const 0 i64.const 0 i64.atomic.rmw8.xor_u drop
55    i64.const 0 i64.const 0 i64.atomic.rmw16.xor_u drop
56    i64.const 0 i64.const 0 i64.atomic.rmw32.xor_u drop
57    i64.const 0 i32.const 0 i32.atomic.rmw.xchg drop
58    i64.const 0 i64.const 0 i64.atomic.rmw.xchg drop
59    i64.const 0 i32.const 0 i32.atomic.rmw8.xchg_u drop
60    i64.const 0 i32.const 0 i32.atomic.rmw16.xchg_u drop
61    i64.const 0 i64.const 0 i64.atomic.rmw8.xchg_u drop
62    i64.const 0 i64.const 0 i64.atomic.rmw16.xchg_u drop
63    i64.const 0 i64.const 0 i64.atomic.rmw32.xchg_u drop
64    i64.const 0 i32.const 0 i32.const 0 i32.atomic.rmw.cmpxchg drop
65    i64.const 0 i64.const 0 i64.const 0 i64.atomic.rmw.cmpxchg drop
66    i64.const 0 i32.const 0 i32.const 0 i32.atomic.rmw8.cmpxchg_u drop
67    i64.const 0 i32.const 0 i32.const 0 i32.atomic.rmw16.cmpxchg_u drop
68    i64.const 0 i64.const 0 i64.const 0 i64.atomic.rmw8.cmpxchg_u drop
69    i64.const 0 i64.const 0 i64.const 0 i64.atomic.rmw16.cmpxchg_u drop
70    i64.const 0 i64.const 0 i64.const 0 i64.atomic.rmw32.cmpxchg_u drop
71  )
72
73  ;; these are unimplemented intrinsics that trap at runtime so just make sure
74  ;; we can codegen instead of also testing execution.
75  (func $just_validate_codegen
76    i64.const 0 i32.const 0 memory.atomic.notify drop
77    i64.const 0 i32.const 0 i64.const 0 memory.atomic.wait32 drop
78    i64.const 0 i64.const 0 i64.const 0 memory.atomic.wait64 drop
79  )
80)
81
82(assert_return (invoke "run"))
83
84(module
85  (memory i64 1 1 shared)
86
87  (func (export "notify_oob") (param i64) (result i32)
88    local.get 0
89    i32.const 1
90    memory.atomic.notify offset=0x200
91  )
92  (func (export "wait32_oob") (param i64) (result i32)
93    local.get 0
94    i32.const 1
95    i64.const -1
96    memory.atomic.wait32 offset=0x200
97  )
98  (func (export "wait64_oob") (param i64) (result i32)
99    local.get 0
100    i64.const 1
101    i64.const -1
102    memory.atomic.wait64 offset=0x200
103  )
104)
105(assert_trap (invoke "notify_oob" (i64.const 0xFFFF_FFFF_FFFF_FF00))
106  "out of bounds memory access")
107(assert_trap (invoke "wait32_oob" (i64.const 0xFFFF_FFFF_FFFF_FF00))
108  "out of bounds memory access")
109(assert_trap (invoke "wait64_oob" (i64.const 0xFFFF_FFFF_FFFF_FF00))
110  "out of bounds memory access")
111