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