function l $cell(l %.1, w %.3, w %.5) { @start.1 %.2 =l alloc8 8 storel %.1, %.2 %.4 =l alloc4 4 storew %.3, %.4 %.6 =l alloc4 4 storew %.5, %.6 @body.2 %.7 =l loadl %.2 %.8 =l add %.7, 16 %.9 =l loadl %.8 %.10 =w loadw %.4 %.11 =l loadl %.2 %.12 =l add %.11, 8 %.13 =w loadw %.12 %.14 =w mul %.10, %.13 %.15 =l extuw %.14 %.16 =l mul %.15, 4 %.17 =l add %.9, %.16 %.18 =w loadw %.6 %.19 =l extsw %.18 %.20 =l mul %.19, 4 %.21 =l add %.17, %.20 ret %.21 } function w $is_alive(l %.1, w %.3, w %.5) { @start.3 %.2 =l alloc8 8 storel %.1, %.2 %.4 =l alloc4 4 storew %.3, %.4 %.6 =l alloc4 4 storew %.5, %.6 @body.4 %.7 =l loadl %.2 %.8 =w loadw %.4 %.9 =w loadw %.6 %.10 =l call $cell(l %.7, w %.8, w %.9) %.11 =w loadw %.10 %.12 =l loadl %.2 %.13 =l add %.12, 4 %.14 =w loadw %.13 %.15 =w ceqw %.11, %.14 ret %.15 } function w $live_neighbors(l %.1, w %.3, w %.5) { @start.5 %.2 =l alloc8 8 storel %.1, %.2 %.4 =l alloc4 4 storew %.3, %.4 %.6 =l alloc4 4 storew %.5, %.6 %.7 =l alloc4 4 %.15 =l alloc4 4 %.23 =l alloc4 4 %.31 =l alloc4 4 @body.6 %.8 =w loadw %.6 %.9 =w add %.8, 1 %.10 =l loadl %.2 %.11 =l add %.10, 12 %.12 =w loadw %.11 %.13 =w sub %.12, 1 %.14 =w and %.9, %.13 storew %.14, %.7 %.16 =w loadw %.6 %.17 =w sub %.16, 1 %.18 =l loadl %.2 %.19 =l add %.18, 12 %.20 =w loadw %.19 %.21 =w sub %.20, 1 %.22 =w and %.17, %.21 storew %.22, %.15 %.24 =w loadw %.4 %.25 =w add %.24, 1 %.26 =l loadl %.2 %.27 =l add %.26, 8 %.28 =w loadw %.27 %.29 =w sub %.28, 1 %.30 =w and %.25, %.29 storew %.30, %.23 %.32 =w loadw %.4 %.33 =w sub %.32, 1 %.34 =l loadl %.2 %.35 =l add %.34, 8 %.36 =w loadw %.35 %.37 =w sub %.36, 1 %.38 =w and %.33, %.37 storew %.38, %.31 %.39 =l loadl %.2 %.40 =w loadw %.31 %.41 =w loadw %.15 %.42 =w call $is_alive(l %.39, w %.40, w %.41) %.43 =l loadl %.2 %.44 =w loadw %.31 %.45 =w loadw %.6 %.46 =w call $is_alive(l %.43, w %.44, w %.45) %.47 =w add %.42, %.46 %.48 =l loadl %.2 %.49 =w loadw %.31 %.50 =w loadw %.7 %.51 =w call $is_alive(l %.48, w %.49, w %.50) %.52 =w add %.47, %.51 %.53 =l loadl %.2 %.54 =w loadw %.4 %.55 =w loadw %.15 %.56 =w call $is_alive(l %.53, w %.54, w %.55) %.57 =w add %.52, %.56 %.58 =l loadl %.2 %.59 =w loadw %.4 %.60 =w loadw %.7 %.61 =w call $is_alive(l %.58, w %.59, w %.60) %.62 =w add %.57, %.61 %.63 =l loadl %.2 %.64 =w loadw %.23 %.65 =w loadw %.15 %.66 =w call $is_alive(l %.63, w %.64, w %.65) %.67 =w add %.62, %.66 %.68 =l loadl %.2 %.69 =w loadw %.23 %.70 =w loadw %.6 %.71 =w call $is_alive(l %.68, w %.69, w %.70) %.72 =w add %.67, %.71 %.73 =l loadl %.2 %.74 =w loadw %.23 %.75 =w loadw %.7 %.76 =w call $is_alive(l %.73, w %.74, w %.75) %.77 =w add %.72, %.76 ret %.77 } export function $mutate(l %.1) { @start.7 %.2 =l alloc8 8 storel %.1, %.2 %.3 =l alloc4 4 %.9 =l alloc4 4 %.15 =l alloc4 4 @body.8 storew 0, %.3 @for_cond.9 %.4 =w loadw %.3 %.5 =l loadl %.2 %.6 =l add %.5, 8 %.7 =w loadw %.6 %.8 =w cultw %.4, %.7 jnz %.8, @for_body.10, @for_join.12 @for_body.10 storew 0, %.9 @for_cond.13 %.10 =w loadw %.9 %.11 =l loadl %.2 %.12 =l add %.11, 12 %.13 =w loadw %.12 %.14 =w cultw %.10, %.13 jnz %.14, @for_body.14, @for_join.16 @for_body.14 %.16 =l loadl %.2 %.17 =l add %.16, 0 %.18 =w loadw %.17 storew %.18, %.15 %.19 =l loadl %.2 %.20 =w loadw %.3 %.21 =w loadw %.9 %.22 =w call $live_neighbors(l %.19, w %.20, w %.21) jmp @switch_cond.17 @switch_case.19 %.23 =l loadl %.2 %.24 =w loadw %.3 %.25 =w loadw %.9 %.26 =w call $is_alive(l %.23, w %.24, w %.25) jnz %.26, @if_false.21, @if_true.20 @if_true.20 jmp @switch_join.18 @if_false.21 @switch_case.22 %.27 =l loadl %.2 %.28 =l add %.27, 4 %.29 =w loadw %.28 storew %.29, %.15 jmp @switch_join.18 @switch_cond.17 %.30 =w ceqw %.22, 2 jnz %.30, @switch_case.19, @switch_ne.23 @switch_ne.23 %.31 =w cultw %.22, 2 jnz %.31, @switch_lt.24, @switch_gt.25 @switch_lt.24 jmp @switch_join.18 @switch_gt.25 %.32 =w ceqw %.22, 3 jnz %.32, @switch_case.22, @switch_ne.26 @switch_ne.26 %.33 =w cultw %.22, 3 jnz %.33, @switch_lt.27, @switch_gt.28 @switch_lt.27 jmp @switch_join.18 @switch_gt.28 jmp @switch_join.18 @switch_join.18 %.34 =w loadw %.15 %.35 =l loadl %.2 %.36 =w loadw %.3 %.37 =w loadw %.9 %.38 =l call $cell(l %.35, w %.36, w %.37) storew %.34, %.38 @for_cont.15 %.39 =w loadw %.9 %.40 =w add %.39, 1 storew %.40, %.9 jmp @for_cond.13 @for_join.16 @for_cont.11 %.41 =w loadw %.3 %.42 =w add %.41, 1 storew %.42, %.3 jmp @for_cond.9 @for_join.12 ret }