blob: 3e7a3686dae8f24dbac014bb2834d05771a08a59 [file] [log] [blame] [edit]
;; NOTE: Assertions have been generated by update_lit_checks.py and should not be edited.
;; RUN: wasm-opt -all %s -S -o - | filecheck %s
;; RUN: wasm-opt -all %s --roundtrip -S -o - | filecheck %s
(module
;; CHECK: (type $struct (struct (field (mut i32))))
(type $struct (struct (field (mut i32))))
;; CHECK: (type $packed (struct (field (mut i8))))
(type $packed (struct (field (mut i8))))
;; CHECK: (type $array (array (mut i32)))
(type $array (array (mut i32)))
;; CHECK: (type $array-packed (array (mut i8)))
(type $array-packed (array (mut i8)))
;; CHECK: (func $get (type $1) (param $0 (ref null $struct)) (result i32)
;; CHECK-NEXT: (struct.atomic.get $struct 0
;; CHECK-NEXT: (local.get $0)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
(func $get (param (ref null $struct)) (result i32)
(struct.atomic.get $struct 0
(local.get 0)
)
)
;; CHECK: (func $get-seqcst (type $1) (param $0 (ref null $struct)) (result i32)
;; CHECK-NEXT: (struct.atomic.get $struct 0
;; CHECK-NEXT: (local.get $0)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
(func $get-seqcst (param (ref null $struct)) (result i32)
(struct.atomic.get seqcst $struct 0
(local.get 0)
)
)
;; CHECK: (func $get-acqrel (type $1) (param $0 (ref null $struct)) (result i32)
;; CHECK-NEXT: (struct.atomic.get acqrel $struct 0
;; CHECK-NEXT: (local.get $0)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
(func $get-acqrel (param (ref null $struct)) (result i32)
(struct.atomic.get acqrel $struct 0
(local.get 0)
)
)
;; CHECK: (func $get-s (type $5) (param $0 (ref null $packed)) (result i32)
;; CHECK-NEXT: (struct.atomic.get_s $packed 0
;; CHECK-NEXT: (local.get $0)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
(func $get-s (param (ref null $packed)) (result i32)
(struct.atomic.get_s $packed 0
(local.get 0)
)
)
;; CHECK: (func $get-s-seqcst (type $5) (param $0 (ref null $packed)) (result i32)
;; CHECK-NEXT: (struct.atomic.get_s $packed 0
;; CHECK-NEXT: (local.get $0)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
(func $get-s-seqcst (param (ref null $packed)) (result i32)
(struct.atomic.get_s seqcst $packed 0
(local.get 0)
)
)
;; CHECK: (func $get-s-acqrel (type $5) (param $0 (ref null $packed)) (result i32)
;; CHECK-NEXT: (struct.atomic.get_s acqrel $packed 0
;; CHECK-NEXT: (local.get $0)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
(func $get-s-acqrel (param (ref null $packed)) (result i32)
(struct.atomic.get_s acqrel $packed 0
(local.get 0)
)
)
;; CHECK: (func $get-u (type $5) (param $0 (ref null $packed)) (result i32)
;; CHECK-NEXT: (struct.atomic.get_u $packed 0
;; CHECK-NEXT: (local.get $0)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
(func $get-u (param (ref null $packed)) (result i32)
(struct.atomic.get_u $packed 0
(local.get 0)
)
)
;; CHECK: (func $get-u-seqcst (type $5) (param $0 (ref null $packed)) (result i32)
;; CHECK-NEXT: (struct.atomic.get_u $packed 0
;; CHECK-NEXT: (local.get $0)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
(func $get-u-seqcst (param (ref null $packed)) (result i32)
(struct.atomic.get_u seqcst $packed 0
(local.get 0)
)
)
;; CHECK: (func $get-u-acqrel (type $5) (param $0 (ref null $packed)) (result i32)
;; CHECK-NEXT: (struct.atomic.get_u acqrel $packed 0
;; CHECK-NEXT: (local.get $0)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
(func $get-u-acqrel (param (ref null $packed)) (result i32)
(struct.atomic.get_u acqrel $packed 0
(local.get 0)
)
)
;; CHECK: (func $set (type $7) (param $0 (ref null $struct))
;; CHECK-NEXT: (struct.atomic.set $struct 0
;; CHECK-NEXT: (local.get $0)
;; CHECK-NEXT: (i32.const 0)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
(func $set (param (ref null $struct))
(struct.atomic.set $struct 0
(local.get 0)
(i32.const 0)
)
)
;; CHECK: (func $set-seqcst (type $7) (param $0 (ref null $struct))
;; CHECK-NEXT: (struct.atomic.set $struct 0
;; CHECK-NEXT: (local.get $0)
;; CHECK-NEXT: (i32.const 0)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
(func $set-seqcst (param (ref null $struct))
(struct.atomic.set seqcst $struct 0
(local.get 0)
(i32.const 0)
)
)
;; CHECK: (func $set-acqrel (type $7) (param $0 (ref null $struct))
;; CHECK-NEXT: (struct.atomic.set acqrel $struct 0
;; CHECK-NEXT: (local.get $0)
;; CHECK-NEXT: (i32.const 0)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
(func $set-acqrel (param (ref null $struct))
(struct.atomic.set acqrel $struct 0
(local.get 0)
(i32.const 0)
)
)
;; CHECK: (func $rmw-add (type $1) (param $0 (ref null $struct)) (result i32)
;; CHECK-NEXT: (struct.atomic.rmw.add $struct 0
;; CHECK-NEXT: (local.get $0)
;; CHECK-NEXT: (i32.const 1)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
(func $rmw-add (param (ref null $struct)) (result i32)
(struct.atomic.rmw.add $struct 0
(local.get 0)
(i32.const 1)
)
)
;; CHECK: (func $rmw-add-seqcst (type $1) (param $0 (ref null $struct)) (result i32)
;; CHECK-NEXT: (struct.atomic.rmw.add $struct 0
;; CHECK-NEXT: (local.get $0)
;; CHECK-NEXT: (i32.const 1)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
(func $rmw-add-seqcst (param (ref null $struct)) (result i32)
(struct.atomic.rmw.add seqcst seqcst $struct 0
(local.get 0)
(i32.const 1)
)
)
;; CHECK: (func $rmw-add-acqrel (type $1) (param $0 (ref null $struct)) (result i32)
;; CHECK-NEXT: (struct.atomic.rmw.add acqrel acqrel $struct 0
;; CHECK-NEXT: (local.get $0)
;; CHECK-NEXT: (i32.const 1)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
(func $rmw-add-acqrel (param (ref null $struct)) (result i32)
(struct.atomic.rmw.add acqrel acqrel $struct 0
(local.get 0)
(i32.const 1)
)
)
;; CHECK: (func $rmw-sub (type $1) (param $0 (ref null $struct)) (result i32)
;; CHECK-NEXT: (struct.atomic.rmw.sub $struct 0
;; CHECK-NEXT: (local.get $0)
;; CHECK-NEXT: (i32.const 1)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
(func $rmw-sub (param (ref null $struct)) (result i32)
(struct.atomic.rmw.sub $struct 0
(local.get 0)
(i32.const 1)
)
)
;; CHECK: (func $rmw-sub-seqcst (type $1) (param $0 (ref null $struct)) (result i32)
;; CHECK-NEXT: (struct.atomic.rmw.sub $struct 0
;; CHECK-NEXT: (local.get $0)
;; CHECK-NEXT: (i32.const 1)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
(func $rmw-sub-seqcst (param (ref null $struct)) (result i32)
(struct.atomic.rmw.sub seqcst seqcst $struct 0
(local.get 0)
(i32.const 1)
)
)
;; CHECK: (func $rmw-sub-acqrel (type $1) (param $0 (ref null $struct)) (result i32)
;; CHECK-NEXT: (struct.atomic.rmw.sub acqrel acqrel $struct 0
;; CHECK-NEXT: (local.get $0)
;; CHECK-NEXT: (i32.const 1)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
(func $rmw-sub-acqrel (param (ref null $struct)) (result i32)
(struct.atomic.rmw.sub acqrel acqrel $struct 0
(local.get 0)
(i32.const 1)
)
)
;; CHECK: (func $rmw-and (type $1) (param $0 (ref null $struct)) (result i32)
;; CHECK-NEXT: (struct.atomic.rmw.and $struct 0
;; CHECK-NEXT: (local.get $0)
;; CHECK-NEXT: (i32.const 1)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
(func $rmw-and (param (ref null $struct)) (result i32)
(struct.atomic.rmw.and $struct 0
(local.get 0)
(i32.const 1)
)
)
;; CHECK: (func $rmw-and-seqcst (type $1) (param $0 (ref null $struct)) (result i32)
;; CHECK-NEXT: (struct.atomic.rmw.and $struct 0
;; CHECK-NEXT: (local.get $0)
;; CHECK-NEXT: (i32.const 1)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
(func $rmw-and-seqcst (param (ref null $struct)) (result i32)
(struct.atomic.rmw.and seqcst seqcst $struct 0
(local.get 0)
(i32.const 1)
)
)
;; CHECK: (func $rmw-and-acqrel (type $1) (param $0 (ref null $struct)) (result i32)
;; CHECK-NEXT: (struct.atomic.rmw.and acqrel acqrel $struct 0
;; CHECK-NEXT: (local.get $0)
;; CHECK-NEXT: (i32.const 1)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
(func $rmw-and-acqrel (param (ref null $struct)) (result i32)
(struct.atomic.rmw.and acqrel acqrel $struct 0
(local.get 0)
(i32.const 1)
)
)
;; CHECK: (func $rmw-or (type $1) (param $0 (ref null $struct)) (result i32)
;; CHECK-NEXT: (struct.atomic.rmw.or $struct 0
;; CHECK-NEXT: (local.get $0)
;; CHECK-NEXT: (i32.const 1)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
(func $rmw-or (param (ref null $struct)) (result i32)
(struct.atomic.rmw.or $struct 0
(local.get 0)
(i32.const 1)
)
)
;; CHECK: (func $rmw-or-seqcst (type $1) (param $0 (ref null $struct)) (result i32)
;; CHECK-NEXT: (struct.atomic.rmw.or $struct 0
;; CHECK-NEXT: (local.get $0)
;; CHECK-NEXT: (i32.const 1)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
(func $rmw-or-seqcst (param (ref null $struct)) (result i32)
(struct.atomic.rmw.or seqcst seqcst $struct 0
(local.get 0)
(i32.const 1)
)
)
;; CHECK: (func $rmw-or-acqrel (type $1) (param $0 (ref null $struct)) (result i32)
;; CHECK-NEXT: (struct.atomic.rmw.or acqrel acqrel $struct 0
;; CHECK-NEXT: (local.get $0)
;; CHECK-NEXT: (i32.const 1)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
(func $rmw-or-acqrel (param (ref null $struct)) (result i32)
(struct.atomic.rmw.or acqrel acqrel $struct 0
(local.get 0)
(i32.const 1)
)
)
;; CHECK: (func $rmw-xor (type $1) (param $0 (ref null $struct)) (result i32)
;; CHECK-NEXT: (struct.atomic.rmw.xor $struct 0
;; CHECK-NEXT: (local.get $0)
;; CHECK-NEXT: (i32.const 1)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
(func $rmw-xor (param (ref null $struct)) (result i32)
(struct.atomic.rmw.xor $struct 0
(local.get 0)
(i32.const 1)
)
)
;; CHECK: (func $rmw-xor-seqcst (type $1) (param $0 (ref null $struct)) (result i32)
;; CHECK-NEXT: (struct.atomic.rmw.xor $struct 0
;; CHECK-NEXT: (local.get $0)
;; CHECK-NEXT: (i32.const 1)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
(func $rmw-xor-seqcst (param (ref null $struct)) (result i32)
(struct.atomic.rmw.xor seqcst seqcst $struct 0
(local.get 0)
(i32.const 1)
)
)
;; CHECK: (func $rmw-xor-acqrel (type $1) (param $0 (ref null $struct)) (result i32)
;; CHECK-NEXT: (struct.atomic.rmw.xor acqrel acqrel $struct 0
;; CHECK-NEXT: (local.get $0)
;; CHECK-NEXT: (i32.const 1)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
(func $rmw-xor-acqrel (param (ref null $struct)) (result i32)
(struct.atomic.rmw.xor acqrel acqrel $struct 0
(local.get 0)
(i32.const 1)
)
)
;; CHECK: (func $rmw-xchg (type $1) (param $0 (ref null $struct)) (result i32)
;; CHECK-NEXT: (struct.atomic.rmw.xchg $struct 0
;; CHECK-NEXT: (local.get $0)
;; CHECK-NEXT: (i32.const 1)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
(func $rmw-xchg (param (ref null $struct)) (result i32)
(struct.atomic.rmw.xchg $struct 0
(local.get 0)
(i32.const 1)
)
)
;; CHECK: (func $rmw-xchg-seqcst (type $1) (param $0 (ref null $struct)) (result i32)
;; CHECK-NEXT: (struct.atomic.rmw.xchg $struct 0
;; CHECK-NEXT: (local.get $0)
;; CHECK-NEXT: (i32.const 1)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
(func $rmw-xchg-seqcst (param (ref null $struct)) (result i32)
(struct.atomic.rmw.xchg seqcst seqcst $struct 0
(local.get 0)
(i32.const 1)
)
)
;; CHECK: (func $rmw-xchg-acqrel (type $1) (param $0 (ref null $struct)) (result i32)
;; CHECK-NEXT: (struct.atomic.rmw.xchg acqrel acqrel $struct 0
;; CHECK-NEXT: (local.get $0)
;; CHECK-NEXT: (i32.const 1)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
(func $rmw-xchg-acqrel (param (ref null $struct)) (result i32)
(struct.atomic.rmw.xchg acqrel acqrel $struct 0
(local.get 0)
(i32.const 1)
)
)
;; CHECK: (func $rmw-cmpxchg (type $1) (param $0 (ref null $struct)) (result i32)
;; CHECK-NEXT: (struct.atomic.rmw.cmpxchg $struct 0
;; CHECK-NEXT: (local.get $0)
;; CHECK-NEXT: (i32.const 1)
;; CHECK-NEXT: (i32.const 2)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
(func $rmw-cmpxchg (param (ref null $struct)) (result i32)
(struct.atomic.rmw.cmpxchg $struct 0
(local.get 0)
(i32.const 1)
(i32.const 2)
)
)
;; CHECK: (func $rmw-cmpxchg-seqcst (type $1) (param $0 (ref null $struct)) (result i32)
;; CHECK-NEXT: (struct.atomic.rmw.cmpxchg $struct 0
;; CHECK-NEXT: (local.get $0)
;; CHECK-NEXT: (i32.const 1)
;; CHECK-NEXT: (i32.const 2)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
(func $rmw-cmpxchg-seqcst (param (ref null $struct)) (result i32)
(struct.atomic.rmw.cmpxchg seqcst seqcst $struct 0
(local.get 0)
(i32.const 1)
(i32.const 2)
)
)
;; CHECK: (func $rmw-cmpxchg-acqrel (type $1) (param $0 (ref null $struct)) (result i32)
;; CHECK-NEXT: (struct.atomic.rmw.cmpxchg acqrel acqrel $struct 0
;; CHECK-NEXT: (local.get $0)
;; CHECK-NEXT: (i32.const 1)
;; CHECK-NEXT: (i32.const 2)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
(func $rmw-cmpxchg-acqrel (param (ref null $struct)) (result i32)
(struct.atomic.rmw.cmpxchg acqrel acqrel $struct 0
(local.get 0)
(i32.const 1)
(i32.const 2)
)
)
;; CHECK: (func $array.get (type $4) (param $0 (ref null $array)) (result i32)
;; CHECK-NEXT: (array.atomic.get $array
;; CHECK-NEXT: (local.get $0)
;; CHECK-NEXT: (i32.const 42)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
(func $array.get (param (ref null $array)) (result i32)
(array.atomic.get $array
(local.get 0)
(i32.const 42)
)
)
;; CHECK: (func $array.get_s (type $8) (param $0 (ref null $array-packed)) (result i32)
;; CHECK-NEXT: (array.atomic.get_s $array-packed
;; CHECK-NEXT: (local.get $0)
;; CHECK-NEXT: (i32.const 42)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
(func $array.get_s (param (ref null $array-packed)) (result i32)
(array.atomic.get_s seqcst $array-packed
(local.get 0)
(i32.const 42)
)
)
;; CHECK: (func $array.get_u (type $8) (param $0 (ref null $array-packed)) (result i32)
;; CHECK-NEXT: (array.atomic.get_u acqrel $array-packed
;; CHECK-NEXT: (local.get $0)
;; CHECK-NEXT: (i32.const 42)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
(func $array.get_u (param (ref null $array-packed)) (result i32)
(array.atomic.get_u acqrel $array-packed
(local.get 0)
(i32.const 42)
)
)
;; CHECK: (func $array.set (type $9) (param $0 (ref null $array))
;; CHECK-NEXT: (array.atomic.set acqrel $array
;; CHECK-NEXT: (local.get $0)
;; CHECK-NEXT: (i32.const 42)
;; CHECK-NEXT: (i32.const 1337)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
(func $array.set (param (ref null $array))
(array.atomic.set acqrel $array
(local.get 0)
(i32.const 42)
(i32.const 1337)
)
)
;; CHECK: (func $array-rmw-add (type $4) (param $0 (ref null $array)) (result i32)
;; CHECK-NEXT: (array.atomic.rmw.add $array
;; CHECK-NEXT: (local.get $0)
;; CHECK-NEXT: (i32.const 1)
;; CHECK-NEXT: (i32.const 2)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
(func $array-rmw-add (param (ref null $array)) (result i32)
(array.atomic.rmw.add $array
(local.get 0)
(i32.const 1)
(i32.const 2)
)
)
;; CHECK: (func $array-rmw-sub (type $4) (param $0 (ref null $array)) (result i32)
;; CHECK-NEXT: (array.atomic.rmw.sub $array
;; CHECK-NEXT: (local.get $0)
;; CHECK-NEXT: (i32.const 1)
;; CHECK-NEXT: (i32.const 2)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
(func $array-rmw-sub (param (ref null $array)) (result i32)
(array.atomic.rmw.sub $array
(local.get 0)
(i32.const 1)
(i32.const 2)
)
)
;; CHECK: (func $array-rmw-and (type $4) (param $0 (ref null $array)) (result i32)
;; CHECK-NEXT: (array.atomic.rmw.and $array
;; CHECK-NEXT: (local.get $0)
;; CHECK-NEXT: (i32.const 1)
;; CHECK-NEXT: (i32.const 2)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
(func $array-rmw-and (param (ref null $array)) (result i32)
(array.atomic.rmw.and $array
(local.get 0)
(i32.const 1)
(i32.const 2)
)
)
;; CHECK: (func $array-rmw-or (type $4) (param $0 (ref null $array)) (result i32)
;; CHECK-NEXT: (array.atomic.rmw.or $array
;; CHECK-NEXT: (local.get $0)
;; CHECK-NEXT: (i32.const 1)
;; CHECK-NEXT: (i32.const 2)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
(func $array-rmw-or (param (ref null $array)) (result i32)
(array.atomic.rmw.or $array
(local.get 0)
(i32.const 1)
(i32.const 2)
)
)
;; CHECK: (func $array-rmw-xor (type $4) (param $0 (ref null $array)) (result i32)
;; CHECK-NEXT: (array.atomic.rmw.xor $array
;; CHECK-NEXT: (local.get $0)
;; CHECK-NEXT: (i32.const 1)
;; CHECK-NEXT: (i32.const 2)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
(func $array-rmw-xor (param (ref null $array)) (result i32)
(array.atomic.rmw.xor $array
(local.get 0)
(i32.const 1)
(i32.const 2)
)
)
;; CHECK: (func $array-rmw-xchg (type $4) (param $0 (ref null $array)) (result i32)
;; CHECK-NEXT: (array.atomic.rmw.xchg $array
;; CHECK-NEXT: (local.get $0)
;; CHECK-NEXT: (i32.const 1)
;; CHECK-NEXT: (i32.const 2)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
(func $array-rmw-xchg (param (ref null $array)) (result i32)
(array.atomic.rmw.xchg $array
(local.get 0)
(i32.const 1)
(i32.const 2)
)
)
;; CHECK: (func $array-rmw-xchg-acqrel (type $4) (param $0 (ref null $array)) (result i32)
;; CHECK-NEXT: (array.atomic.rmw.xchg acqrel acqrel $array
;; CHECK-NEXT: (local.get $0)
;; CHECK-NEXT: (i32.const 1)
;; CHECK-NEXT: (i32.const 2)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
(func $array-rmw-xchg-acqrel (param (ref null $array)) (result i32)
(array.atomic.rmw.xchg acqrel acqrel $array
(local.get 0)
(i32.const 1)
(i32.const 2)
)
)
;; CHECK: (func $array-rmw-cmpxchg (type $4) (param $0 (ref null $array)) (result i32)
;; CHECK-NEXT: (array.atomic.rmw.cmpxchg $array
;; CHECK-NEXT: (local.get $0)
;; CHECK-NEXT: (i32.const 1)
;; CHECK-NEXT: (i32.const 2)
;; CHECK-NEXT: (i32.const 3)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
(func $array-rmw-cmpxchg (param (ref null $array)) (result i32)
(array.atomic.rmw.cmpxchg $array
(local.get 0)
(i32.const 1)
(i32.const 2)
(i32.const 3)
)
)
;; CHECK: (func $array-rmw-cmpxchg-acqrel (type $4) (param $0 (ref null $array)) (result i32)
;; CHECK-NEXT: (array.atomic.rmw.cmpxchg acqrel acqrel $array
;; CHECK-NEXT: (local.get $0)
;; CHECK-NEXT: (i32.const 1)
;; CHECK-NEXT: (i32.const 2)
;; CHECK-NEXT: (i32.const 3)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
(func $array-rmw-cmpxchg-acqrel (param (ref null $array)) (result i32)
(array.atomic.rmw.cmpxchg acqrel acqrel $array
(local.get 0)
(i32.const 1)
(i32.const 2)
(i32.const 3)
)
)
)