(module (type $0 (func (param i32 i32) (result i32))) (type $1 (func (param i64))) (type $2 (func (param i64 i32 i32) (result i32))) (type $3 (func (param i64 i32 i32) (result i64))) (memory $mem 1 1) (data $strdata.1_0 (i32.const 0) "demos/hare/gol/gol.ha") (data $strliteral.0_1 (i32.const 29) "\15") (data $strliteral.0_2 (i32.const 37) "\15") (export "mutate" (func $mutate)) (export "mem" (memory $mem)) (func $mutate (param $0 i64) (local $1 i32) (local $2 i32) (local $3 i32) (local $4 i32) (local $5 i64) (local $6 i32) (local $7 i32) (local $8 i32) (loop $shape$1$continue (if (i32.gt_u (i32.load (i32.wrap_i64 (i64.add (local.get $0) (i64.const 8) ) ) ) (local.get $3) ) (then (local.set $2 (i32.const 0) ) (loop $shape$4$continue (if (i32.gt_u (i32.load (i32.wrap_i64 (local.tee $5 (i64.add (local.get $0) (i64.const 12) ) ) ) ) (local.get $2) ) (then (i32.store (i32.wrap_i64 (call $cell (local.get $0) (local.get $3) (local.get $2) ) ) (block (result i32) (local.set $4 (call $next (local.get $2) (i32.load (i32.wrap_i64 (local.get $5) ) ) ) ) (local.set $6 (call $prev (local.get $2) (i32.load (i32.wrap_i64 (local.get $5) ) ) ) ) (local.set $7 (call $next (local.get $3) (i32.load (i32.wrap_i64 (local.tee $5 (i64.add (local.get $0) (i64.const 8) ) ) ) ) ) ) (local.set $1 (i32.eqz (i32.eqz (i32.and (call $isalive (local.get $0) (local.tee $8 (call $prev (local.get $3) (i32.load (i32.wrap_i64 (local.get $5) ) ) ) ) (local.get $6) ) (i32.const 255) ) ) ) ) (local.set $1 (select (i32.add (local.get $1) (i32.const 1) ) (local.get $1) (i32.and (call $isalive (local.get $0) (local.get $8) (local.get $2) ) (i32.const 255) ) ) ) (local.set $1 (select (i32.add (local.get $1) (i32.const 1) ) (local.get $1) (i32.and (call $isalive (local.get $0) (local.get $8) (local.get $4) ) (i32.const 255) ) ) ) (local.set $1 (select (i32.add (local.get $1) (i32.const 1) ) (local.get $1) (i32.and (call $isalive (local.get $0) (local.get $3) (local.get $6) ) (i32.const 255) ) ) ) (local.set $1 (select (i32.add (local.get $1) (i32.const 1) ) (local.get $1) (i32.and (call $isalive (local.get $0) (local.get $3) (local.get $4) ) (i32.const 255) ) ) ) (local.set $1 (select (i32.add (local.get $1) (i32.const 1) ) (local.get $1) (i32.and (call $isalive (local.get $0) (local.get $7) (local.get $6) ) (i32.const 255) ) ) ) (local.set $1 (select (i32.add (local.get $1) (i32.const 1) ) (local.get $1) (i32.and (call $isalive (local.get $0) (local.get $7) (local.get $2) ) (i32.const 255) ) ) ) (i32.load (i32.wrap_i64 (select (i64.add (local.get $0) (i64.const 4) ) (local.get $0) (i32.and (if (result i32) (local.tee $4 (i32.eq (local.tee $1 (select (i32.add (local.get $1) (i32.const 1) ) (local.get $1) (i32.and (call $isalive (local.get $0) (local.get $7) (local.get $4) ) (i32.const 255) ) ) ) (i32.const 3) ) ) (then (local.get $4) ) (else (if (result i32) (local.tee $1 (i32.eq (local.get $1) (i32.const 2) ) ) (then (call $isalive (local.get $0) (local.get $3) (local.get $2) ) ) (else (local.get $1) ) ) ) ) (i32.const 255) ) ) ) ) ) ) (local.set $2 (i32.add (local.get $2) (i32.const 1) ) ) (br $shape$4$continue) ) ) ) (local.set $3 (i32.add (local.get $3) (i32.const 1) ) ) (br $shape$1$continue) ) ) ) ) (func $prev (param $0 i32) (param $1 i32) (result i32) (i32.and (i32.sub (local.get $0) (i32.const 1) ) (i32.sub (local.get $1) (i32.const 1) ) ) ) (func $next (param $0 i32) (param $1 i32) (result i32) (i32.and (i32.add (local.get $0) (i32.const 1) ) (i32.sub (local.get $1) (i32.const 1) ) ) ) (func $isalive (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 $cell (param $0 i64) (param $1 i32) (param $2 i32) (result i64) (i64.add (i64.load (i32.wrap_i64 (i64.add (local.get $0) (i64.const 16) ) ) ) (i64.shl (i64.extend_i32_u (i32.add (i32.mul (i32.load (i32.wrap_i64 (i64.add (local.get $0) (i64.const 8) ) ) ) (local.get $1) ) (local.get $2) ) ) (i64.const 2) ) ) ) )