(module (type $0 (func (param i64 i32 i32) (result i64))) (type $1 (func (param i64 i32 i32) (result i32))) (type $2 (func (param i64))) (import "env" "mem" (memory $mem 0 65536)) (export "mutate" (func $mutate)) (func $cell (param $0 i64) (param $1 i32) (param $2 i32) (result i64) (i64.add (i64.add (i64.load (i32.wrap_i64 (i64.add (local.get $0) (i64.const 16) ) ) ) (i64.shl (i64.extend_i32_u (i32.mul (i32.load (i32.wrap_i64 (i64.add (local.get $0) (i64.const 8) ) ) ) (local.get $1) ) ) (i64.const 2) ) ) (i64.shl (i64.extend_i32_s (local.get $2) ) (i64.const 2) ) ) ) (func $is_alive (param $0 i64) (param $1 i32) (param $2 i32) (result i32) (i32.eq (i32.load (i32.wrap_i64 (call $cell (local.get $0) (local.get $1) (local.get $2) ) ) ) (i32.load (i32.wrap_i64 (i64.add (local.get $0) (i64.const 4) ) ) ) ) ) (func $mutate (param $0 i64) (local $1 i32) (local $2 i32) (local $3 i32) (local $4 i32) (local $5 i32) (local $6 i32) (local $7 i32) (loop $shape$1$continue (if (i32.gt_u (i32.load (i32.wrap_i64 (i64.add (local.get $0) (i64.const 8) ) ) ) (local.get $2) ) (then (local.set $1 (i32.const 0) ) (loop $shape$4$continue (if (i32.gt_u (local.tee $3 (i32.load (i32.wrap_i64 (i64.add (local.get $0) (i64.const 12) ) ) ) ) (local.get $1) ) (then (local.set $7 (i32.load (i32.wrap_i64 (local.get $0) ) ) ) (local.set $3 (i32.and (local.tee $4 (i32.sub (local.get $3) (i32.const 1) ) ) (i32.add (local.get $1) (i32.const 1) ) ) ) (local.set $6 (i32.and (local.tee $5 (i32.sub (i32.load (i32.wrap_i64 (i64.add (local.get $0) (i64.const 8) ) ) ) (i32.const 1) ) ) (i32.add (local.get $2) (i32.const 1) ) ) ) (block $block$16$break (if (i32.eq (local.tee $3 (i32.add (i32.add (i32.add (i32.add (i32.add (i32.add (i32.add (call $is_alive (local.get $0) (local.tee $5 (i32.and (i32.sub (local.get $2) (i32.const 1) ) (local.get $5) ) ) (local.tee $4 (i32.and (i32.sub (local.get $1) (i32.const 1) ) (local.get $4) ) ) ) (call $is_alive (local.get $0) (local.get $5) (local.get $1) ) ) (call $is_alive (local.get $0) (local.get $5) (local.get $3) ) ) (call $is_alive (local.get $0) (local.get $2) (local.get $4) ) ) (call $is_alive (local.get $0) (local.get $2) (local.get $3) ) ) (call $is_alive (local.get $0) (local.get $6) (local.get $4) ) ) (call $is_alive (local.get $0) (local.get $6) (local.get $1) ) ) (call $is_alive (local.get $0) (local.get $6) (local.get $3) ) ) ) (i32.const 2) ) (then (br_if $block$16$break (i32.eqz (call $is_alive (local.get $0) (local.get $2) (local.get $1) ) ) ) ) (else (block $block$9$break (br_if $block$16$break (i32.lt_u (local.get $3) (i32.const 2) ) ) (br_if $block$9$break (i32.eq (local.get $3) (i32.const 3) ) ) (br $block$16$break) ) ) ) (local.set $7 (i32.load (i32.wrap_i64 (i64.add (local.get $0) (i64.const 4) ) ) ) ) ) (i32.store (i32.wrap_i64 (call $cell (local.get $0) (local.get $2) (local.get $1) ) ) (local.get $7) ) (local.set $1 (i32.add (local.get $1) (i32.const 1) ) ) (br $shape$4$continue) ) ) ) (local.set $2 (i32.add (local.get $2) (i32.const 1) ) ) (br $shape$1$continue) ) ) ) ) )