diff --git a/examples/game-of-life/assembly/index.ts b/examples/game-of-life/assembly/index.ts index 3b1dee1e..66d96e76 100644 --- a/examples/game-of-life/assembly/index.ts +++ b/examples/game-of-life/assembly/index.ts @@ -1,8 +1,10 @@ // see: https://en.wikipedia.org/wiki/Conway%27s_Game_of_Life -// Configuration imported from JS. -declare const RGB_ALIVE: u32; -declare const RGB_DEAD: u32; +// Configuration imported from JS. On the WASM side, colors are handled in ABGR order (alpha, blue, +// green, red) because WASM is little endian. Doing so makes it possible to just copy the entire +// ABGR memory in little endian byte order to the RGBA image buffer in big endian byte order. +declare const BGR_ALIVE: u32; +declare const BGR_DEAD: u32; declare const BIT_ROT: u32; var w: i32, h: i32, s: i32; @@ -35,7 +37,7 @@ export function init(width: i32, height: i32): void { // Start by filling output with random live cells. for (let y = 0; y < h; ++y) { for (let x = 0; x < w; ++x) { - set(x, y, Math.random() > 0.1 ? RGB_DEAD & 0x00ffffff : RGB_ALIVE | 0xff000000); + set(x, y, Math.random() > 0.1 ? BGR_DEAD & 0x00ffffff : BGR_ALIVE | 0xff000000); } } } @@ -67,10 +69,10 @@ export function step(): void { // A live cell with 2 or 3 live neighbors rots on to the next generation. if ((aliveNeighbors & 0b1110) == 0b0010) rot(x, y, self); // A live cell with fewer than 2 or more than 3 live neighbors dies. - else set(x, y, RGB_DEAD | 0xff000000); + else set(x, y, BGR_DEAD | 0xff000000); } else { // A dead cell with exactly 3 live neighbors becomes a live cell. - if (aliveNeighbors == 3) set(x, y, RGB_ALIVE | 0xff000000); + if (aliveNeighbors == 3) set(x, y, BGR_ALIVE | 0xff000000); // A dead cell with fewer or more than 3 live neighbors just rots. else rot(x, y, self); } @@ -81,9 +83,9 @@ export function step(): void { /** Fills the row and column indicated by `x` and `y` with random live cells. */ export function fill(x: u32, y: u32, p: f64): void { for (let ix = 0; ix < w; ++ix) { - if (Math.random() < p) set(ix, y, RGB_ALIVE | 0xff000000); + if (Math.random() < p) set(ix, y, BGR_ALIVE | 0xff000000); } for (let iy = 0; iy < h; ++iy) { - if (Math.random() < p) set(x, iy, RGB_ALIVE | 0xff000000); + if (Math.random() < p) set(x, iy, BGR_ALIVE | 0xff000000); } } diff --git a/examples/game-of-life/build/optimized.wasm b/examples/game-of-life/build/optimized.wasm index 98888cfe..db5cf771 100644 Binary files a/examples/game-of-life/build/optimized.wasm and b/examples/game-of-life/build/optimized.wasm differ diff --git a/examples/game-of-life/build/optimized.wat b/examples/game-of-life/build/optimized.wat index 1a5108ca..21970622 100644 --- a/examples/game-of-life/build/optimized.wat +++ b/examples/game-of-life/build/optimized.wat @@ -3,8 +3,8 @@ (type $F (func (result f64))) (type $v (func)) (type $iiFv (func (param i32 i32 f64))) - (import "env" "RGB_ALIVE" (global $assembly/index/RGB_ALIVE i32)) - (import "env" "RGB_DEAD" (global $assembly/index/RGB_DEAD i32)) + (import "env" "BGR_ALIVE" (global $assembly/index/BGR_ALIVE i32)) + (import "env" "BGR_DEAD" (global $assembly/index/BGR_DEAD i32)) (import "env" "BIT_ROT" (global $assembly/index/BIT_ROT i32)) (import "JSMath" "random" (func $~lib/math/JSMath.random (result f64))) (import "env" "memory" (memory $0 1)) @@ -17,104 +17,104 @@ (export "memory" (memory $0)) (func $assembly/index/init (; 1 ;) (type $iiv) (param $0 i32) (param $1 i32) (local $2 i32) - ;;@ assembly/index.ts:31:2 + ;;@ assembly/index.ts:33:2 (set_global $assembly/index/w - ;;@ assembly/index.ts:31:6 + ;;@ assembly/index.ts:33:6 (get_local $0) ) - ;;@ assembly/index.ts:32:2 + ;;@ assembly/index.ts:34:2 (set_global $assembly/index/h - ;;@ assembly/index.ts:32:6 + ;;@ assembly/index.ts:34:6 (get_local $1) ) - ;;@ assembly/index.ts:33:2 + ;;@ assembly/index.ts:35:2 (set_global $assembly/index/s - ;;@ assembly/index.ts:33:6 + ;;@ assembly/index.ts:35:6 (i32.mul (get_local $0) - ;;@ assembly/index.ts:33:14 + ;;@ assembly/index.ts:35:14 (get_local $1) ) ) - ;;@ assembly/index.ts:36:7 + ;;@ assembly/index.ts:38:7 (set_local $0 - ;;@ assembly/index.ts:36:15 + ;;@ assembly/index.ts:38:15 (i32.const 0) ) (loop $continue|0 (if - ;;@ assembly/index.ts:36:18 + ;;@ assembly/index.ts:38:18 (i32.lt_s (get_local $0) - ;;@ assembly/index.ts:36:22 + ;;@ assembly/index.ts:38:22 (get_global $assembly/index/h) ) (block - ;;@ assembly/index.ts:37:9 + ;;@ assembly/index.ts:39:9 (set_local $1 - ;;@ assembly/index.ts:37:17 + ;;@ assembly/index.ts:39:17 (i32.const 0) ) (loop $continue|1 (if - ;;@ assembly/index.ts:37:20 + ;;@ assembly/index.ts:39:20 (i32.lt_s (get_local $1) - ;;@ assembly/index.ts:37:24 + ;;@ assembly/index.ts:39:24 (get_global $assembly/index/w) ) (block (set_local $2 - ;;@ assembly/index.ts:38:16 + ;;@ assembly/index.ts:40:16 (if (result i32) (f64.gt - ;;@ assembly/index.ts:38:21 + ;;@ assembly/index.ts:40:21 (call $~lib/math/JSMath.random) - ;;@ assembly/index.ts:38:32 + ;;@ assembly/index.ts:40:32 (f64.const 0.1) ) - ;;@ assembly/index.ts:38:38 + ;;@ assembly/index.ts:40:38 (i32.and - (get_global $assembly/index/RGB_DEAD) - ;;@ assembly/index.ts:38:49 + (get_global $assembly/index/BGR_DEAD) + ;;@ assembly/index.ts:40:49 (i32.const 16777215) ) - ;;@ assembly/index.ts:38:62 + ;;@ assembly/index.ts:40:62 (i32.or - (get_global $assembly/index/RGB_ALIVE) - ;;@ assembly/index.ts:38:74 + (get_global $assembly/index/BGR_ALIVE) + ;;@ assembly/index.ts:40:74 (i32.const -16777216) ) ) ) - ;;@ assembly/index.ts:19:2 + ;;@ assembly/index.ts:21:2 (i32.store - ;;@ assembly/index.ts:19:13 + ;;@ assembly/index.ts:21:13 (i32.shl (i32.add - ;;@ assembly/index.ts:19:14 + ;;@ assembly/index.ts:21:14 (i32.add (get_global $assembly/index/s) - ;;@ assembly/index.ts:19:18 + ;;@ assembly/index.ts:21:18 (i32.mul (get_local $0) - ;;@ assembly/index.ts:19:22 + ;;@ assembly/index.ts:21:22 (get_global $assembly/index/w) ) ) - ;;@ assembly/index.ts:19:26 + ;;@ assembly/index.ts:21:26 (get_local $1) ) - ;;@ assembly/index.ts:19:32 + ;;@ assembly/index.ts:21:32 (i32.const 2) ) - ;;@ assembly/index.ts:19:35 + ;;@ assembly/index.ts:21:35 (get_local $2) ) - ;;@ assembly/index.ts:37:27 + ;;@ assembly/index.ts:39:27 (set_local $1 (i32.add - ;;@ assembly/index.ts:37:29 + ;;@ assembly/index.ts:39:29 (get_local $1) (i32.const 1) ) @@ -123,10 +123,10 @@ ) ) ) - ;;@ assembly/index.ts:36:25 + ;;@ assembly/index.ts:38:25 (set_local $0 (i32.add - ;;@ assembly/index.ts:36:27 + ;;@ assembly/index.ts:38:27 (get_local $0) (i32.const 1) ) @@ -146,82 +146,82 @@ (local $6 i32) (local $7 i32) (local $8 i32) - (set_local $5 - ;;@ assembly/index.ts:45:12 + (set_local $7 + ;;@ assembly/index.ts:47:12 (i32.sub (get_global $assembly/index/h) - ;;@ assembly/index.ts:45:16 + ;;@ assembly/index.ts:47:16 (i32.const 1) ) ) - (set_local $6 - ;;@ assembly/index.ts:46:12 + (set_local $8 + ;;@ assembly/index.ts:48:12 (i32.sub (get_global $assembly/index/w) - ;;@ assembly/index.ts:46:16 + ;;@ assembly/index.ts:48:16 (i32.const 1) ) ) (loop $continue|0 (if - ;;@ assembly/index.ts:50:18 + ;;@ assembly/index.ts:52:18 (i32.lt_s - (get_local $2) - ;;@ assembly/index.ts:50:22 + (get_local $0) + ;;@ assembly/index.ts:52:22 (get_global $assembly/index/h) ) (block - (set_local $7 - ;;@ assembly/index.ts:51:14 + (set_local $4 + ;;@ assembly/index.ts:53:14 (if (result i32) - (get_local $2) - ;;@ assembly/index.ts:51:29 + (get_local $0) + ;;@ assembly/index.ts:53:29 (i32.sub - (get_local $2) - ;;@ assembly/index.ts:51:33 + (get_local $0) + ;;@ assembly/index.ts:53:33 (i32.const 1) ) - ;;@ assembly/index.ts:51:23 - (get_local $5) + ;;@ assembly/index.ts:53:23 + (get_local $7) ) ) - (set_local $8 - ;;@ assembly/index.ts:52:14 + (set_local $5 + ;;@ assembly/index.ts:54:14 (if (result i32) (i32.eq - (get_local $2) - ;;@ assembly/index.ts:52:19 - (get_local $5) + (get_local $0) + ;;@ assembly/index.ts:54:19 + (get_local $7) ) - ;;@ assembly/index.ts:52:25 + ;;@ assembly/index.ts:54:25 (i32.const 0) - ;;@ assembly/index.ts:52:29 + ;;@ assembly/index.ts:54:29 (i32.add - (get_local $2) - ;;@ assembly/index.ts:52:33 + (get_local $0) + ;;@ assembly/index.ts:54:33 (i32.const 1) ) ) ) - ;;@ assembly/index.ts:53:9 + ;;@ assembly/index.ts:55:9 (set_local $1 - ;;@ assembly/index.ts:53:17 + ;;@ assembly/index.ts:55:17 (i32.const 0) ) (loop $continue|1 (if - ;;@ assembly/index.ts:53:20 + ;;@ assembly/index.ts:55:20 (i32.lt_s (get_local $1) - ;;@ assembly/index.ts:53:24 + ;;@ assembly/index.ts:55:24 (get_global $assembly/index/w) ) (block - ;;@ assembly/index.ts:59:6 - (set_local $0 - ;;@ assembly/index.ts:59:27 + ;;@ assembly/index.ts:61:6 + (set_local $2 + ;;@ assembly/index.ts:61:27 (i32.add - ;;@ assembly/index.ts:60:8 + ;;@ assembly/index.ts:62:8 (i32.add (i32.add (i32.add @@ -233,77 +233,71 @@ (i32.shl (i32.add (i32.mul - (tee_local $0 - ;;@ assembly/index.ts:60:18 - (get_local $7) - ) + (get_local $4) (get_global $assembly/index/w) ) (tee_local $3 - ;;@ assembly/index.ts:54:16 + ;;@ assembly/index.ts:56:16 (if (result i32) (get_local $1) - ;;@ assembly/index.ts:54:31 + ;;@ assembly/index.ts:56:31 (i32.sub (get_local $1) - ;;@ assembly/index.ts:54:35 + ;;@ assembly/index.ts:56:35 (i32.const 1) ) - ;;@ assembly/index.ts:54:25 - (get_local $6) + ;;@ assembly/index.ts:56:25 + (get_local $8) ) ) ) (i32.const 2) ) ) - ;;@ assembly/index.ts:60:25 + ;;@ assembly/index.ts:62:25 (i32.const 1) ) - ;;@ assembly/index.ts:60:30 + ;;@ assembly/index.ts:62:30 (i32.and (i32.load (i32.shl (i32.add (i32.mul - ;;@ assembly/index.ts:60:40 - (get_local $0) + (get_local $4) (get_global $assembly/index/w) ) - ;;@ assembly/index.ts:60:35 (get_local $1) ) (i32.const 2) ) ) - ;;@ assembly/index.ts:60:47 + ;;@ assembly/index.ts:62:47 (i32.const 1) ) ) - ;;@ assembly/index.ts:60:52 + ;;@ assembly/index.ts:62:52 (i32.and (i32.load (i32.shl (i32.add (i32.mul - ;;@ assembly/index.ts:60:62 - (get_local $0) + (get_local $4) (get_global $assembly/index/w) ) - (tee_local $4 - ;;@ assembly/index.ts:55:16 + (tee_local $2 + ;;@ assembly/index.ts:57:16 (if (result i32) (i32.eq (get_local $1) - ;;@ assembly/index.ts:55:21 - (get_local $6) + ;;@ assembly/index.ts:57:21 + (get_local $8) ) - ;;@ assembly/index.ts:55:27 + ;;@ assembly/index.ts:57:27 (i32.const 0) - ;;@ assembly/index.ts:55:31 + ;;@ assembly/index.ts:57:31 (i32.add (get_local $1) - ;;@ assembly/index.ts:55:35 + ;;@ assembly/index.ts:57:35 (i32.const 1) ) ) @@ -312,155 +306,140 @@ (i32.const 2) ) ) - ;;@ assembly/index.ts:60:69 + ;;@ assembly/index.ts:62:69 (i32.const 1) ) ) - ;;@ assembly/index.ts:61:8 + ;;@ assembly/index.ts:63:8 (i32.and (i32.load (i32.shl (i32.add (i32.mul - (tee_local $0 - ;;@ assembly/index.ts:61:18 - (get_local $2) - ) + (get_local $0) (get_global $assembly/index/w) ) - ;;@ assembly/index.ts:61:13 (get_local $3) ) (i32.const 2) ) ) - ;;@ assembly/index.ts:61:25 + ;;@ assembly/index.ts:63:25 (i32.const 1) ) ) - ;;@ assembly/index.ts:61:52 + ;;@ assembly/index.ts:63:52 (i32.and (i32.load (i32.shl (i32.add (i32.mul - ;;@ assembly/index.ts:61:62 (get_local $0) (get_global $assembly/index/w) ) - ;;@ assembly/index.ts:61:57 - (get_local $4) + (get_local $2) ) (i32.const 2) ) ) - ;;@ assembly/index.ts:61:69 + ;;@ assembly/index.ts:63:69 (i32.const 1) ) ) - ;;@ assembly/index.ts:62:8 + ;;@ assembly/index.ts:64:8 (i32.and (i32.load (i32.shl (i32.add (i32.mul - (tee_local $0 - ;;@ assembly/index.ts:62:18 - (get_local $8) - ) + (get_local $5) (get_global $assembly/index/w) ) - ;;@ assembly/index.ts:62:13 (get_local $3) ) (i32.const 2) ) ) - ;;@ assembly/index.ts:62:25 + ;;@ assembly/index.ts:64:25 (i32.const 1) ) ) - ;;@ assembly/index.ts:62:30 + ;;@ assembly/index.ts:64:30 (i32.and (i32.load (i32.shl (i32.add (i32.mul - ;;@ assembly/index.ts:62:40 - (get_local $0) + (get_local $5) (get_global $assembly/index/w) ) - ;;@ assembly/index.ts:62:35 (get_local $1) ) (i32.const 2) ) ) - ;;@ assembly/index.ts:62:47 + ;;@ assembly/index.ts:64:47 (i32.const 1) ) ) - ;;@ assembly/index.ts:62:52 + ;;@ assembly/index.ts:64:52 (i32.and (i32.load (i32.shl (i32.add (i32.mul - ;;@ assembly/index.ts:62:62 - (get_local $0) + (get_local $5) (get_global $assembly/index/w) ) - ;;@ assembly/index.ts:62:57 - (get_local $4) + (get_local $2) ) (i32.const 2) ) ) - ;;@ assembly/index.ts:62:69 + ;;@ assembly/index.ts:64:69 (i32.const 1) ) ) ) - ;;@ assembly/index.ts:66:6 + ;;@ assembly/index.ts:68:6 (if - ;;@ assembly/index.ts:66:10 + ;;@ assembly/index.ts:68:10 (i32.and - ;;@ assembly/index.ts:65:6 + ;;@ assembly/index.ts:67:6 (tee_local $3 - ;;@ assembly/index.ts:13:9 + ;;@ assembly/index.ts:15:9 (i32.load - ;;@ assembly/index.ts:13:19 + ;;@ assembly/index.ts:15:19 (i32.shl (i32.add - ;;@ assembly/index.ts:13:20 + ;;@ assembly/index.ts:15:20 (i32.mul - ;;@ assembly/index.ts:65:24 - (get_local $2) - ;;@ assembly/index.ts:13:24 + (get_local $0) + ;;@ assembly/index.ts:15:24 (get_global $assembly/index/w) ) - ;;@ assembly/index.ts:65:21 + ;;@ assembly/index.ts:15:28 (get_local $1) ) - ;;@ assembly/index.ts:13:34 + ;;@ assembly/index.ts:15:34 (i32.const 2) ) ) ) - ;;@ assembly/index.ts:66:17 + ;;@ assembly/index.ts:68:17 (i32.const 1) ) - ;;@ assembly/index.ts:68:8 + ;;@ assembly/index.ts:70:8 (if - ;;@ assembly/index.ts:68:12 + ;;@ assembly/index.ts:70:12 (i32.eq (i32.and - ;;@ assembly/index.ts:68:13 - (get_local $0) - ;;@ assembly/index.ts:68:30 + ;;@ assembly/index.ts:70:13 + (get_local $2) + ;;@ assembly/index.ts:70:30 (i32.const 14) ) - ;;@ assembly/index.ts:68:41 + ;;@ assembly/index.ts:70:41 (i32.const 2) ) (i32.store @@ -469,45 +448,36 @@ (i32.add (get_global $assembly/index/s) (i32.mul - ;;@ assembly/index.ts:68:56 - (get_local $2) + (get_local $0) (get_global $assembly/index/w) ) ) - ;;@ assembly/index.ts:68:53 (get_local $1) ) (i32.const 2) ) (i32.or (i32.shl - (tee_local $3 - (select - (tee_local $3 - (i32.sub - (i32.shr_u - (tee_local $0 - ;;@ assembly/index.ts:68:59 - (get_local $3) - ) - (i32.const 24) - ) - (get_global $assembly/index/BIT_ROT) + (select + (tee_local $2 + (i32.sub + (i32.shr_u + (get_local $3) + (i32.const 24) ) + (get_global $assembly/index/BIT_ROT) ) - (tee_local $4 - (i32.const 0) - ) - (i32.gt_s - (get_local $3) - (i32.const 0) - ) + ) + (i32.const 0) + (i32.gt_s + (get_local $2) + (i32.const 0) ) ) (i32.const 24) ) (i32.and - (get_local $0) + (get_local $3) (i32.const 16777215) ) ) @@ -518,30 +488,28 @@ (i32.add (get_global $assembly/index/s) (i32.mul - ;;@ assembly/index.ts:70:20 - (get_local $2) + (get_local $0) (get_global $assembly/index/w) ) ) - ;;@ assembly/index.ts:70:17 (get_local $1) ) (i32.const 2) ) - ;;@ assembly/index.ts:70:23 + ;;@ assembly/index.ts:72:23 (i32.or - (get_global $assembly/index/RGB_DEAD) - ;;@ assembly/index.ts:70:34 + (get_global $assembly/index/BGR_DEAD) + ;;@ assembly/index.ts:72:34 (i32.const -16777216) ) ) ) - ;;@ assembly/index.ts:73:8 + ;;@ assembly/index.ts:75:8 (if - ;;@ assembly/index.ts:73:12 + ;;@ assembly/index.ts:75:12 (i32.eq - (get_local $0) - ;;@ assembly/index.ts:73:30 + (get_local $2) + ;;@ assembly/index.ts:75:30 (i32.const 3) ) (i32.store @@ -550,93 +518,85 @@ (i32.add (get_global $assembly/index/s) (i32.mul - ;;@ assembly/index.ts:73:40 - (get_local $2) + (get_local $0) (get_global $assembly/index/w) ) ) - ;;@ assembly/index.ts:73:37 (get_local $1) ) (i32.const 2) ) - ;;@ assembly/index.ts:73:43 + ;;@ assembly/index.ts:75:43 (i32.or - (get_global $assembly/index/RGB_ALIVE) - ;;@ assembly/index.ts:73:55 + (get_global $assembly/index/BGR_ALIVE) + ;;@ assembly/index.ts:75:55 (i32.const -16777216) ) ) - ;;@ assembly/index.ts:19:2 + ;;@ assembly/index.ts:21:2 (i32.store - ;;@ assembly/index.ts:19:13 + ;;@ assembly/index.ts:21:13 (i32.shl (i32.add - ;;@ assembly/index.ts:19:14 + ;;@ assembly/index.ts:21:14 (i32.add (get_global $assembly/index/s) - ;;@ assembly/index.ts:19:18 + ;;@ assembly/index.ts:21:18 (i32.mul - ;;@ assembly/index.ts:75:20 - (get_local $2) - ;;@ assembly/index.ts:19:22 + (get_local $0) + ;;@ assembly/index.ts:21:22 (get_global $assembly/index/w) ) ) - ;;@ assembly/index.ts:75:17 + ;;@ assembly/index.ts:21:26 (get_local $1) ) - ;;@ assembly/index.ts:19:32 + ;;@ assembly/index.ts:21:32 (i32.const 2) ) - ;;@ assembly/index.ts:26:12 + ;;@ assembly/index.ts:28:12 (i32.or (i32.shl - ;;@ assembly/index.ts:25:2 - (tee_local $0 - ;;@ assembly/index.ts:25:10 - (select - (tee_local $0 - ;;@ assembly/index.ts:25:19 - (i32.sub - (i32.shr_u - ;;@ assembly/index.ts:75:23 - (get_local $3) - ;;@ assembly/index.ts:25:26 - (i32.const 24) - ) - ;;@ assembly/index.ts:25:32 - (get_global $assembly/index/BIT_ROT) + ;;@ assembly/index.ts:27:10 + (select + (tee_local $2 + ;;@ assembly/index.ts:27:19 + (i32.sub + (i32.shr_u + ;;@ assembly/index.ts:27:20 + (get_local $3) + ;;@ assembly/index.ts:27:26 + (i32.const 24) ) - ) - (tee_local $4 - ;;@ assembly/index.ts:25:41 - (i32.const 0) - ) - (i32.gt_s - (get_local $0) - (i32.const 0) + ;;@ assembly/index.ts:27:32 + (get_global $assembly/index/BIT_ROT) ) ) + ;;@ assembly/index.ts:27:41 + (i32.const 0) + (i32.gt_s + (get_local $2) + (i32.const 0) + ) ) - ;;@ assembly/index.ts:26:18 + ;;@ assembly/index.ts:28:18 (i32.const 24) ) - ;;@ assembly/index.ts:26:24 + ;;@ assembly/index.ts:28:24 (i32.and - ;;@ assembly/index.ts:26:25 + ;;@ assembly/index.ts:28:25 (get_local $3) - ;;@ assembly/index.ts:26:29 + ;;@ assembly/index.ts:28:29 (i32.const 16777215) ) ) ) ) ) - ;;@ assembly/index.ts:53:27 + ;;@ assembly/index.ts:55:27 (set_local $1 (i32.add - ;;@ assembly/index.ts:53:29 + ;;@ assembly/index.ts:55:29 (get_local $1) (i32.const 1) ) @@ -645,11 +605,11 @@ ) ) ) - ;;@ assembly/index.ts:50:25 - (set_local $2 + ;;@ assembly/index.ts:52:25 + (set_local $0 (i32.add - ;;@ assembly/index.ts:50:27 - (get_local $2) + ;;@ assembly/index.ts:52:27 + (get_local $0) (i32.const 1) ) ) @@ -662,20 +622,20 @@ (local $3 i32) (loop $continue|0 (if - ;;@ assembly/index.ts:83:19 + ;;@ assembly/index.ts:85:19 (i32.lt_s (get_local $3) - ;;@ assembly/index.ts:83:24 + ;;@ assembly/index.ts:85:24 (get_global $assembly/index/w) ) (block - ;;@ assembly/index.ts:84:4 + ;;@ assembly/index.ts:86:4 (if - ;;@ assembly/index.ts:84:8 + ;;@ assembly/index.ts:86:8 (f64.lt - ;;@ assembly/index.ts:84:13 + ;;@ assembly/index.ts:86:13 (call $~lib/math/JSMath.random) - ;;@ assembly/index.ts:84:24 + ;;@ assembly/index.ts:86:24 (get_local $2) ) (i32.store @@ -684,28 +644,26 @@ (i32.add (get_global $assembly/index/s) (i32.mul - ;;@ assembly/index.ts:84:35 (get_local $1) (get_global $assembly/index/w) ) ) - ;;@ assembly/index.ts:84:31 (get_local $3) ) (i32.const 2) ) - ;;@ assembly/index.ts:84:38 + ;;@ assembly/index.ts:86:38 (i32.or - (get_global $assembly/index/RGB_ALIVE) - ;;@ assembly/index.ts:84:50 + (get_global $assembly/index/BGR_ALIVE) + ;;@ assembly/index.ts:86:50 (i32.const -16777216) ) ) ) - ;;@ assembly/index.ts:83:27 + ;;@ assembly/index.ts:85:27 (set_local $3 (i32.add - ;;@ assembly/index.ts:83:29 + ;;@ assembly/index.ts:85:29 (get_local $3) (i32.const 1) ) @@ -714,64 +672,63 @@ ) ) ) - ;;@ assembly/index.ts:86:7 - (set_local $3 - ;;@ assembly/index.ts:86:16 + ;;@ assembly/index.ts:88:7 + (set_local $1 + ;;@ assembly/index.ts:88:16 (i32.const 0) ) (loop $continue|1 (if - ;;@ assembly/index.ts:86:19 + ;;@ assembly/index.ts:88:19 (i32.lt_s - (get_local $3) - ;;@ assembly/index.ts:86:24 + (get_local $1) + ;;@ assembly/index.ts:88:24 (get_global $assembly/index/h) ) (block - ;;@ assembly/index.ts:87:4 + ;;@ assembly/index.ts:89:4 (if - ;;@ assembly/index.ts:87:8 + ;;@ assembly/index.ts:89:8 (f64.lt - ;;@ assembly/index.ts:87:13 + ;;@ assembly/index.ts:89:13 (call $~lib/math/JSMath.random) - ;;@ assembly/index.ts:87:24 + ;;@ assembly/index.ts:89:24 (get_local $2) ) - ;;@ assembly/index.ts:19:2 + ;;@ assembly/index.ts:21:2 (i32.store - ;;@ assembly/index.ts:19:13 + ;;@ assembly/index.ts:21:13 (i32.shl (i32.add - ;;@ assembly/index.ts:19:14 + ;;@ assembly/index.ts:21:14 (i32.add (get_global $assembly/index/s) - ;;@ assembly/index.ts:19:18 + ;;@ assembly/index.ts:21:18 (i32.mul - ;;@ assembly/index.ts:87:34 - (get_local $3) - ;;@ assembly/index.ts:19:22 + (get_local $1) + ;;@ assembly/index.ts:21:22 (get_global $assembly/index/w) ) ) - ;;@ assembly/index.ts:87:31 + ;;@ assembly/index.ts:21:26 (get_local $0) ) - ;;@ assembly/index.ts:19:32 + ;;@ assembly/index.ts:21:32 (i32.const 2) ) - ;;@ assembly/index.ts:87:38 + ;;@ assembly/index.ts:89:38 (i32.or - (get_global $assembly/index/RGB_ALIVE) - ;;@ assembly/index.ts:87:50 + (get_global $assembly/index/BGR_ALIVE) + ;;@ assembly/index.ts:89:50 (i32.const -16777216) ) ) ) - ;;@ assembly/index.ts:86:27 - (set_local $3 + ;;@ assembly/index.ts:88:27 + (set_local $1 (i32.add - ;;@ assembly/index.ts:86:29 - (get_local $3) + ;;@ assembly/index.ts:88:29 + (get_local $1) (i32.const 1) ) ) diff --git a/examples/game-of-life/build/untouched.wat b/examples/game-of-life/build/untouched.wat index 329e7774..1f0128f2 100644 --- a/examples/game-of-life/build/untouched.wat +++ b/examples/game-of-life/build/untouched.wat @@ -4,8 +4,8 @@ (type $i (func (result i32))) (type $v (func)) (type $iiFv (func (param i32 i32 f64))) - (import "env" "RGB_ALIVE" (global $assembly/index/RGB_ALIVE i32)) - (import "env" "RGB_DEAD" (global $assembly/index/RGB_DEAD i32)) + (import "env" "BGR_ALIVE" (global $assembly/index/BGR_ALIVE i32)) + (import "env" "BGR_DEAD" (global $assembly/index/BGR_DEAD i32)) (import "env" "BIT_ROT" (global $assembly/index/BIT_ROT i32)) (import "JSMath" "random" (func $~lib/math/JSMath.random (result f64))) (import "env" "memory" (memory $0 1)) @@ -21,122 +21,112 @@ (local $2 i32) (local $3 i32) (local $4 i32) - (local $5 i32) - (local $6 i32) - ;;@ assembly/index.ts:31:2 + ;;@ assembly/index.ts:33:2 (set_global $assembly/index/w - ;;@ assembly/index.ts:31:6 + ;;@ assembly/index.ts:33:6 (get_local $0) ) - ;;@ assembly/index.ts:32:2 + ;;@ assembly/index.ts:34:2 (set_global $assembly/index/h - ;;@ assembly/index.ts:32:6 + ;;@ assembly/index.ts:34:6 (get_local $1) ) - ;;@ assembly/index.ts:33:2 + ;;@ assembly/index.ts:35:2 (set_global $assembly/index/s - ;;@ assembly/index.ts:33:6 + ;;@ assembly/index.ts:35:6 (i32.mul (get_local $0) - ;;@ assembly/index.ts:33:14 + ;;@ assembly/index.ts:35:14 (get_local $1) ) ) - ;;@ assembly/index.ts:36:2 + ;;@ assembly/index.ts:38:2 (block $break|0 - ;;@ assembly/index.ts:36:7 + ;;@ assembly/index.ts:38:7 (set_local $2 - ;;@ assembly/index.ts:36:15 + ;;@ assembly/index.ts:38:15 (i32.const 0) ) (loop $continue|0 (if - ;;@ assembly/index.ts:36:18 + ;;@ assembly/index.ts:38:18 (i32.lt_s (get_local $2) - ;;@ assembly/index.ts:36:22 + ;;@ assembly/index.ts:38:22 (get_global $assembly/index/h) ) (block (block (block $break|1 - ;;@ assembly/index.ts:37:9 + ;;@ assembly/index.ts:39:9 (set_local $3 - ;;@ assembly/index.ts:37:17 + ;;@ assembly/index.ts:39:17 (i32.const 0) ) (loop $continue|1 (if - ;;@ assembly/index.ts:37:20 + ;;@ assembly/index.ts:39:20 (i32.lt_s (get_local $3) - ;;@ assembly/index.ts:37:24 + ;;@ assembly/index.ts:39:24 (get_global $assembly/index/w) ) (block (block (block $assembly/index/set|inlined.0 (set_local $4 - ;;@ assembly/index.ts:38:10 - (get_local $3) - ) - (set_local $5 - ;;@ assembly/index.ts:38:13 - (get_local $2) - ) - (set_local $6 - ;;@ assembly/index.ts:38:16 + ;;@ assembly/index.ts:40:16 (if (result i32) (f64.gt - ;;@ assembly/index.ts:38:21 + ;;@ assembly/index.ts:40:21 (call $~lib/math/JSMath.random) - ;;@ assembly/index.ts:38:32 + ;;@ assembly/index.ts:40:32 (f64.const 0.1) ) - ;;@ assembly/index.ts:38:38 + ;;@ assembly/index.ts:40:38 (i32.and - (get_global $assembly/index/RGB_DEAD) - ;;@ assembly/index.ts:38:49 + (get_global $assembly/index/BGR_DEAD) + ;;@ assembly/index.ts:40:49 (i32.const 16777215) ) - ;;@ assembly/index.ts:38:62 + ;;@ assembly/index.ts:40:62 (i32.or - (get_global $assembly/index/RGB_ALIVE) - ;;@ assembly/index.ts:38:74 + (get_global $assembly/index/BGR_ALIVE) + ;;@ assembly/index.ts:40:74 (i32.const -16777216) ) ) ) - ;;@ assembly/index.ts:19:2 + ;;@ assembly/index.ts:21:2 (i32.store - ;;@ assembly/index.ts:19:13 + ;;@ assembly/index.ts:21:13 (i32.shl (i32.add - ;;@ assembly/index.ts:19:14 + ;;@ assembly/index.ts:21:14 (i32.add (get_global $assembly/index/s) - ;;@ assembly/index.ts:19:18 + ;;@ assembly/index.ts:21:18 (i32.mul - (get_local $5) - ;;@ assembly/index.ts:19:22 + (get_local $2) + ;;@ assembly/index.ts:21:22 (get_global $assembly/index/w) ) ) - ;;@ assembly/index.ts:19:26 - (get_local $4) + ;;@ assembly/index.ts:21:26 + (get_local $3) ) - ;;@ assembly/index.ts:19:32 + ;;@ assembly/index.ts:21:32 (i32.const 2) ) - ;;@ assembly/index.ts:19:35 - (get_local $6) + ;;@ assembly/index.ts:21:35 + (get_local $4) ) ) ) - ;;@ assembly/index.ts:37:27 + ;;@ assembly/index.ts:39:27 (set_local $3 (i32.add - ;;@ assembly/index.ts:37:29 + ;;@ assembly/index.ts:39:29 (get_local $3) (i32.const 1) ) @@ -147,10 +137,10 @@ ) ) ) - ;;@ assembly/index.ts:36:25 + ;;@ assembly/index.ts:38:25 (set_local $2 (i32.add - ;;@ assembly/index.ts:36:27 + ;;@ assembly/index.ts:38:27 (get_local $2) (i32.const 1) ) @@ -178,141 +168,140 @@ (local $13 i32) (local $14 i32) (local $15 i32) - (local $16 i32) - ;;@ assembly/index.ts:45:2 + ;;@ assembly/index.ts:47:2 (block (set_local $0 - ;;@ assembly/index.ts:45:12 + ;;@ assembly/index.ts:47:12 (i32.sub (get_global $assembly/index/h) - ;;@ assembly/index.ts:45:16 + ;;@ assembly/index.ts:47:16 (i32.const 1) ) ) (set_local $1 - ;;@ assembly/index.ts:46:12 + ;;@ assembly/index.ts:48:12 (i32.sub (get_global $assembly/index/w) - ;;@ assembly/index.ts:46:16 + ;;@ assembly/index.ts:48:16 (i32.const 1) ) ) ) - ;;@ assembly/index.ts:50:2 + ;;@ assembly/index.ts:52:2 (block $break|0 - ;;@ assembly/index.ts:50:7 + ;;@ assembly/index.ts:52:7 (set_local $2 - ;;@ assembly/index.ts:50:15 + ;;@ assembly/index.ts:52:15 (i32.const 0) ) (loop $continue|0 (if - ;;@ assembly/index.ts:50:18 + ;;@ assembly/index.ts:52:18 (i32.lt_s (get_local $2) - ;;@ assembly/index.ts:50:22 + ;;@ assembly/index.ts:52:22 (get_global $assembly/index/h) ) (block (block (block (set_local $3 - ;;@ assembly/index.ts:51:14 + ;;@ assembly/index.ts:53:14 (if (result i32) (i32.eq (get_local $2) - ;;@ assembly/index.ts:51:19 + ;;@ assembly/index.ts:53:19 (i32.const 0) ) - ;;@ assembly/index.ts:51:23 + ;;@ assembly/index.ts:53:23 (get_local $0) - ;;@ assembly/index.ts:51:29 + ;;@ assembly/index.ts:53:29 (i32.sub (get_local $2) - ;;@ assembly/index.ts:51:33 + ;;@ assembly/index.ts:53:33 (i32.const 1) ) ) ) (set_local $4 - ;;@ assembly/index.ts:52:14 + ;;@ assembly/index.ts:54:14 (if (result i32) (i32.eq (get_local $2) - ;;@ assembly/index.ts:52:19 + ;;@ assembly/index.ts:54:19 (get_local $0) ) - ;;@ assembly/index.ts:52:25 + ;;@ assembly/index.ts:54:25 (i32.const 0) - ;;@ assembly/index.ts:52:29 + ;;@ assembly/index.ts:54:29 (i32.add (get_local $2) - ;;@ assembly/index.ts:52:33 + ;;@ assembly/index.ts:54:33 (i32.const 1) ) ) ) ) - ;;@ assembly/index.ts:53:4 + ;;@ assembly/index.ts:55:4 (block $break|1 - ;;@ assembly/index.ts:53:9 + ;;@ assembly/index.ts:55:9 (set_local $5 - ;;@ assembly/index.ts:53:17 + ;;@ assembly/index.ts:55:17 (i32.const 0) ) (loop $continue|1 (if - ;;@ assembly/index.ts:53:20 + ;;@ assembly/index.ts:55:20 (i32.lt_s (get_local $5) - ;;@ assembly/index.ts:53:24 + ;;@ assembly/index.ts:55:24 (get_global $assembly/index/w) ) (block (block (block (set_local $6 - ;;@ assembly/index.ts:54:16 + ;;@ assembly/index.ts:56:16 (if (result i32) (i32.eq (get_local $5) - ;;@ assembly/index.ts:54:21 + ;;@ assembly/index.ts:56:21 (i32.const 0) ) - ;;@ assembly/index.ts:54:25 + ;;@ assembly/index.ts:56:25 (get_local $1) - ;;@ assembly/index.ts:54:31 + ;;@ assembly/index.ts:56:31 (i32.sub (get_local $5) - ;;@ assembly/index.ts:54:35 + ;;@ assembly/index.ts:56:35 (i32.const 1) ) ) ) (set_local $7 - ;;@ assembly/index.ts:55:16 + ;;@ assembly/index.ts:57:16 (if (result i32) (i32.eq (get_local $5) - ;;@ assembly/index.ts:55:21 + ;;@ assembly/index.ts:57:21 (get_local $1) ) - ;;@ assembly/index.ts:55:27 + ;;@ assembly/index.ts:57:27 (i32.const 0) - ;;@ assembly/index.ts:55:31 + ;;@ assembly/index.ts:57:31 (i32.add (get_local $5) - ;;@ assembly/index.ts:55:35 + ;;@ assembly/index.ts:57:35 (i32.const 1) ) ) ) ) - ;;@ assembly/index.ts:59:6 + ;;@ assembly/index.ts:61:6 (set_local $8 - ;;@ assembly/index.ts:59:27 + ;;@ assembly/index.ts:61:27 (i32.add - ;;@ assembly/index.ts:60:8 + ;;@ assembly/index.ts:62:8 (i32.add (i32.add (i32.add @@ -320,357 +309,267 @@ (i32.add (i32.add (i32.and - ;;@ assembly/index.ts:60:9 + ;;@ assembly/index.ts:62:9 (block $assembly/index/get|inlined.0 (result i32) - (set_local $8 - ;;@ assembly/index.ts:60:13 - (get_local $6) - ) - (set_local $9 - ;;@ assembly/index.ts:60:18 - (get_local $3) - ) (br $assembly/index/get|inlined.0 (i32.load (i32.shl (i32.add (i32.mul - (get_local $9) + (get_local $3) (get_global $assembly/index/w) ) - (get_local $8) + (get_local $6) ) (i32.const 2) ) ) ) ) - ;;@ assembly/index.ts:60:25 + ;;@ assembly/index.ts:62:25 (i32.const 1) ) - ;;@ assembly/index.ts:60:30 + ;;@ assembly/index.ts:62:30 (i32.and - ;;@ assembly/index.ts:60:31 + ;;@ assembly/index.ts:62:31 (block $assembly/index/get|inlined.1 (result i32) - (set_local $9 - ;;@ assembly/index.ts:60:35 - (get_local $5) - ) - (set_local $8 - ;;@ assembly/index.ts:60:40 - (get_local $3) - ) (br $assembly/index/get|inlined.1 (i32.load (i32.shl (i32.add (i32.mul - (get_local $8) + (get_local $3) (get_global $assembly/index/w) ) - (get_local $9) + (get_local $5) ) (i32.const 2) ) ) ) ) - ;;@ assembly/index.ts:60:47 + ;;@ assembly/index.ts:62:47 (i32.const 1) ) ) - ;;@ assembly/index.ts:60:52 + ;;@ assembly/index.ts:62:52 (i32.and - ;;@ assembly/index.ts:60:53 + ;;@ assembly/index.ts:62:53 (block $assembly/index/get|inlined.2 (result i32) - (set_local $8 - ;;@ assembly/index.ts:60:57 - (get_local $7) - ) - (set_local $9 - ;;@ assembly/index.ts:60:62 - (get_local $3) - ) (br $assembly/index/get|inlined.2 (i32.load (i32.shl (i32.add (i32.mul - (get_local $9) + (get_local $3) (get_global $assembly/index/w) ) - (get_local $8) + (get_local $7) ) (i32.const 2) ) ) ) ) - ;;@ assembly/index.ts:60:69 + ;;@ assembly/index.ts:62:69 (i32.const 1) ) ) - ;;@ assembly/index.ts:61:8 + ;;@ assembly/index.ts:63:8 (i32.and - ;;@ assembly/index.ts:61:9 + ;;@ assembly/index.ts:63:9 (block $assembly/index/get|inlined.3 (result i32) - (set_local $9 - ;;@ assembly/index.ts:61:13 - (get_local $6) - ) - (set_local $8 - ;;@ assembly/index.ts:61:18 - (get_local $2) - ) (br $assembly/index/get|inlined.3 (i32.load (i32.shl (i32.add (i32.mul - (get_local $8) + (get_local $2) (get_global $assembly/index/w) ) - (get_local $9) + (get_local $6) ) (i32.const 2) ) ) ) ) - ;;@ assembly/index.ts:61:25 + ;;@ assembly/index.ts:63:25 (i32.const 1) ) ) - ;;@ assembly/index.ts:61:52 + ;;@ assembly/index.ts:63:52 (i32.and - ;;@ assembly/index.ts:61:53 + ;;@ assembly/index.ts:63:53 (block $assembly/index/get|inlined.4 (result i32) - (set_local $8 - ;;@ assembly/index.ts:61:57 - (get_local $7) - ) - (set_local $9 - ;;@ assembly/index.ts:61:62 - (get_local $2) - ) (br $assembly/index/get|inlined.4 (i32.load (i32.shl (i32.add (i32.mul - (get_local $9) + (get_local $2) (get_global $assembly/index/w) ) - (get_local $8) + (get_local $7) ) (i32.const 2) ) ) ) ) - ;;@ assembly/index.ts:61:69 + ;;@ assembly/index.ts:63:69 (i32.const 1) ) ) - ;;@ assembly/index.ts:62:8 + ;;@ assembly/index.ts:64:8 (i32.and - ;;@ assembly/index.ts:62:9 + ;;@ assembly/index.ts:64:9 (block $assembly/index/get|inlined.5 (result i32) - (set_local $9 - ;;@ assembly/index.ts:62:13 - (get_local $6) - ) - (set_local $8 - ;;@ assembly/index.ts:62:18 - (get_local $4) - ) (br $assembly/index/get|inlined.5 (i32.load (i32.shl (i32.add (i32.mul - (get_local $8) + (get_local $4) (get_global $assembly/index/w) ) - (get_local $9) + (get_local $6) ) (i32.const 2) ) ) ) ) - ;;@ assembly/index.ts:62:25 + ;;@ assembly/index.ts:64:25 (i32.const 1) ) ) - ;;@ assembly/index.ts:62:30 + ;;@ assembly/index.ts:64:30 (i32.and - ;;@ assembly/index.ts:62:31 + ;;@ assembly/index.ts:64:31 (block $assembly/index/get|inlined.6 (result i32) - (set_local $8 - ;;@ assembly/index.ts:62:35 - (get_local $5) - ) - (set_local $9 - ;;@ assembly/index.ts:62:40 - (get_local $4) - ) (br $assembly/index/get|inlined.6 (i32.load (i32.shl (i32.add (i32.mul - (get_local $9) + (get_local $4) (get_global $assembly/index/w) ) - (get_local $8) + (get_local $5) ) (i32.const 2) ) ) ) ) - ;;@ assembly/index.ts:62:47 + ;;@ assembly/index.ts:64:47 (i32.const 1) ) ) - ;;@ assembly/index.ts:62:52 + ;;@ assembly/index.ts:64:52 (i32.and - ;;@ assembly/index.ts:62:53 + ;;@ assembly/index.ts:64:53 (block $assembly/index/get|inlined.7 (result i32) - (set_local $9 - ;;@ assembly/index.ts:62:57 - (get_local $7) - ) - (set_local $8 - ;;@ assembly/index.ts:62:62 - (get_local $4) - ) (br $assembly/index/get|inlined.7 (i32.load (i32.shl (i32.add (i32.mul - (get_local $8) + (get_local $4) (get_global $assembly/index/w) ) - (get_local $9) + (get_local $7) ) (i32.const 2) ) ) ) ) - ;;@ assembly/index.ts:62:69 + ;;@ assembly/index.ts:64:69 (i32.const 1) ) ) ) - ;;@ assembly/index.ts:65:6 - (set_local $10 - ;;@ assembly/index.ts:65:17 + ;;@ assembly/index.ts:67:6 + (set_local $9 + ;;@ assembly/index.ts:67:17 (block $assembly/index/get|inlined.8 (result i32) - (set_local $9 - ;;@ assembly/index.ts:65:21 - (get_local $5) - ) - (set_local $10 - ;;@ assembly/index.ts:65:24 - (get_local $2) - ) - ;;@ assembly/index.ts:13:35 + ;;@ assembly/index.ts:15:35 (br $assembly/index/get|inlined.8 - ;;@ assembly/index.ts:13:9 + ;;@ assembly/index.ts:15:9 (i32.load - ;;@ assembly/index.ts:13:19 + ;;@ assembly/index.ts:15:19 (i32.shl (i32.add - ;;@ assembly/index.ts:13:20 + ;;@ assembly/index.ts:15:20 (i32.mul - (get_local $10) - ;;@ assembly/index.ts:13:24 + (get_local $2) + ;;@ assembly/index.ts:15:24 (get_global $assembly/index/w) ) - ;;@ assembly/index.ts:13:28 - (get_local $9) + ;;@ assembly/index.ts:15:28 + (get_local $5) ) - ;;@ assembly/index.ts:13:34 + ;;@ assembly/index.ts:15:34 (i32.const 2) ) ) ) ) ) - ;;@ assembly/index.ts:66:6 + ;;@ assembly/index.ts:68:6 (if - ;;@ assembly/index.ts:66:10 + ;;@ assembly/index.ts:68:10 (i32.and - (get_local $10) - ;;@ assembly/index.ts:66:17 + (get_local $9) + ;;@ assembly/index.ts:68:17 (i32.const 1) ) - ;;@ assembly/index.ts:68:8 + ;;@ assembly/index.ts:70:8 (if - ;;@ assembly/index.ts:68:12 + ;;@ assembly/index.ts:70:12 (i32.eq (i32.and - ;;@ assembly/index.ts:68:13 + ;;@ assembly/index.ts:70:13 (get_local $8) - ;;@ assembly/index.ts:68:30 + ;;@ assembly/index.ts:70:30 (i32.const 14) ) - ;;@ assembly/index.ts:68:41 + ;;@ assembly/index.ts:70:41 (i32.const 2) ) - ;;@ assembly/index.ts:68:49 + ;;@ assembly/index.ts:70:49 (block $assembly/index/rot|inlined.0 - (set_local $9 - ;;@ assembly/index.ts:68:53 - (get_local $5) - ) - (set_local $11 - ;;@ assembly/index.ts:68:56 - (get_local $2) - ) - (set_local $12 - ;;@ assembly/index.ts:68:59 - (get_local $10) - ) - (set_local $13 + (set_local $10 (select - (tee_local $13 + (tee_local $10 (i32.sub (i32.shr_u - (get_local $12) + (get_local $9) (i32.const 24) ) (get_global $assembly/index/BIT_ROT) ) ) - (tee_local $14 + (tee_local $11 (i32.const 0) ) (i32.gt_s - (get_local $13) - (get_local $14) + (get_local $10) + (get_local $11) ) ) ) (block $assembly/index/set|inlined.1 - (set_local $14 - (get_local $9) - ) - (set_local $15 - (get_local $11) - ) - (set_local $16 + (set_local $11 (i32.or (i32.shl - (get_local $13) + (get_local $10) (i32.const 24) ) (i32.and - (get_local $12) + (get_local $9) (i32.const 16777215) ) ) @@ -681,33 +580,25 @@ (i32.add (get_global $assembly/index/s) (i32.mul - (get_local $15) + (get_local $2) (get_global $assembly/index/w) ) ) - (get_local $14) + (get_local $5) ) (i32.const 2) ) - (get_local $16) + (get_local $11) ) ) ) - ;;@ assembly/index.ts:70:13 + ;;@ assembly/index.ts:72:13 (block $assembly/index/set|inlined.2 - (set_local $13 - ;;@ assembly/index.ts:70:17 - (get_local $5) - ) (set_local $12 - ;;@ assembly/index.ts:70:20 - (get_local $2) - ) - (set_local $11 - ;;@ assembly/index.ts:70:23 + ;;@ assembly/index.ts:72:23 (i32.or - (get_global $assembly/index/RGB_DEAD) - ;;@ assembly/index.ts:70:34 + (get_global $assembly/index/BGR_DEAD) + ;;@ assembly/index.ts:72:34 (i32.const -16777216) ) ) @@ -717,41 +608,33 @@ (i32.add (get_global $assembly/index/s) (i32.mul - (get_local $12) + (get_local $2) (get_global $assembly/index/w) ) ) - (get_local $13) + (get_local $5) ) (i32.const 2) ) - (get_local $11) + (get_local $12) ) ) ) - ;;@ assembly/index.ts:73:8 + ;;@ assembly/index.ts:75:8 (if - ;;@ assembly/index.ts:73:12 + ;;@ assembly/index.ts:75:12 (i32.eq (get_local $8) - ;;@ assembly/index.ts:73:30 + ;;@ assembly/index.ts:75:30 (i32.const 3) ) - ;;@ assembly/index.ts:73:33 + ;;@ assembly/index.ts:75:33 (block $assembly/index/set|inlined.3 - (set_local $11 - ;;@ assembly/index.ts:73:37 - (get_local $5) - ) - (set_local $12 - ;;@ assembly/index.ts:73:40 - (get_local $2) - ) (set_local $13 - ;;@ assembly/index.ts:73:43 + ;;@ assembly/index.ts:75:43 (i32.or - (get_global $assembly/index/RGB_ALIVE) - ;;@ assembly/index.ts:73:55 + (get_global $assembly/index/BGR_ALIVE) + ;;@ assembly/index.ts:75:55 (i32.const -16777216) ) ) @@ -761,119 +644,99 @@ (i32.add (get_global $assembly/index/s) (i32.mul - (get_local $12) + (get_local $2) (get_global $assembly/index/w) ) ) - (get_local $11) + (get_local $5) ) (i32.const 2) ) (get_local $13) ) ) - ;;@ assembly/index.ts:75:13 + ;;@ assembly/index.ts:77:13 (block $assembly/index/rot|inlined.1 - (set_local $13 - ;;@ assembly/index.ts:75:17 - (get_local $5) - ) - (set_local $12 - ;;@ assembly/index.ts:75:20 - (get_local $2) - ) - (set_local $11 - ;;@ assembly/index.ts:75:23 - (get_local $10) - ) - ;;@ assembly/index.ts:25:2 - (set_local $9 - ;;@ assembly/index.ts:25:10 + ;;@ assembly/index.ts:27:2 + (set_local $14 + ;;@ assembly/index.ts:27:10 (select - (tee_local $9 - ;;@ assembly/index.ts:25:19 + (tee_local $14 + ;;@ assembly/index.ts:27:19 (i32.sub (i32.shr_u - ;;@ assembly/index.ts:25:20 - (get_local $11) - ;;@ assembly/index.ts:25:26 + ;;@ assembly/index.ts:27:20 + (get_local $9) + ;;@ assembly/index.ts:27:26 (i32.const 24) ) - ;;@ assembly/index.ts:25:32 + ;;@ assembly/index.ts:27:32 (get_global $assembly/index/BIT_ROT) ) ) - (tee_local $16 - ;;@ assembly/index.ts:25:41 + (tee_local $15 + ;;@ assembly/index.ts:27:41 (i32.const 0) ) (i32.gt_s - (get_local $9) - (get_local $16) + (get_local $14) + (get_local $15) ) ) ) - ;;@ assembly/index.ts:26:2 + ;;@ assembly/index.ts:28:2 (block $assembly/index/set|inlined.4 - (set_local $16 - ;;@ assembly/index.ts:26:6 - (get_local $13) - ) (set_local $15 - ;;@ assembly/index.ts:26:9 - (get_local $12) - ) - (set_local $14 - ;;@ assembly/index.ts:26:12 + ;;@ assembly/index.ts:28:12 (i32.or (i32.shl - ;;@ assembly/index.ts:26:13 - (get_local $9) - ;;@ assembly/index.ts:26:18 + ;;@ assembly/index.ts:28:13 + (get_local $14) + ;;@ assembly/index.ts:28:18 (i32.const 24) ) - ;;@ assembly/index.ts:26:24 + ;;@ assembly/index.ts:28:24 (i32.and - ;;@ assembly/index.ts:26:25 - (get_local $11) - ;;@ assembly/index.ts:26:29 + ;;@ assembly/index.ts:28:25 + (get_local $9) + ;;@ assembly/index.ts:28:29 (i32.const 16777215) ) ) ) - ;;@ assembly/index.ts:19:2 + ;;@ assembly/index.ts:21:2 (i32.store - ;;@ assembly/index.ts:19:13 + ;;@ assembly/index.ts:21:13 (i32.shl (i32.add - ;;@ assembly/index.ts:19:14 + ;;@ assembly/index.ts:21:14 (i32.add (get_global $assembly/index/s) - ;;@ assembly/index.ts:19:18 + ;;@ assembly/index.ts:21:18 (i32.mul - (get_local $15) - ;;@ assembly/index.ts:19:22 + (get_local $2) + ;;@ assembly/index.ts:21:22 (get_global $assembly/index/w) ) ) - ;;@ assembly/index.ts:19:26 - (get_local $16) + ;;@ assembly/index.ts:21:26 + (get_local $5) ) - ;;@ assembly/index.ts:19:32 + ;;@ assembly/index.ts:21:32 (i32.const 2) ) - ;;@ assembly/index.ts:19:35 - (get_local $14) + ;;@ assembly/index.ts:21:35 + (get_local $15) ) ) ) ) ) ) - ;;@ assembly/index.ts:53:27 + ;;@ assembly/index.ts:55:27 (set_local $5 (i32.add - ;;@ assembly/index.ts:53:29 + ;;@ assembly/index.ts:55:29 (get_local $5) (i32.const 1) ) @@ -884,10 +747,10 @@ ) ) ) - ;;@ assembly/index.ts:50:25 + ;;@ assembly/index.ts:52:25 (set_local $2 (i32.add - ;;@ assembly/index.ts:50:27 + ;;@ assembly/index.ts:52:27 (get_local $2) (i32.const 1) ) @@ -903,47 +766,39 @@ (local $4 i32) (local $5 i32) (local $6 i32) - ;;@ assembly/index.ts:83:2 + ;;@ assembly/index.ts:85:2 (block $break|0 - ;;@ assembly/index.ts:83:7 + ;;@ assembly/index.ts:85:7 (set_local $3 - ;;@ assembly/index.ts:83:16 + ;;@ assembly/index.ts:85:16 (i32.const 0) ) (loop $continue|0 (if - ;;@ assembly/index.ts:83:19 + ;;@ assembly/index.ts:85:19 (i32.lt_s (get_local $3) - ;;@ assembly/index.ts:83:24 + ;;@ assembly/index.ts:85:24 (get_global $assembly/index/w) ) (block (block - ;;@ assembly/index.ts:84:4 + ;;@ assembly/index.ts:86:4 (if - ;;@ assembly/index.ts:84:8 + ;;@ assembly/index.ts:86:8 (f64.lt - ;;@ assembly/index.ts:84:13 + ;;@ assembly/index.ts:86:13 (call $~lib/math/JSMath.random) - ;;@ assembly/index.ts:84:24 + ;;@ assembly/index.ts:86:24 (get_local $2) ) - ;;@ assembly/index.ts:84:27 + ;;@ assembly/index.ts:86:27 (block $assembly/index/set|inlined.5 (set_local $4 - ;;@ assembly/index.ts:84:31 - (get_local $3) - ) - (set_local $5 - ;;@ assembly/index.ts:84:35 - (get_local $1) - ) - (set_local $6 - ;;@ assembly/index.ts:84:38 + ;;@ assembly/index.ts:86:38 (i32.or - (get_global $assembly/index/RGB_ALIVE) - ;;@ assembly/index.ts:84:50 + (get_global $assembly/index/BGR_ALIVE) + ;;@ assembly/index.ts:86:50 (i32.const -16777216) ) ) @@ -953,23 +808,23 @@ (i32.add (get_global $assembly/index/s) (i32.mul - (get_local $5) + (get_local $1) (get_global $assembly/index/w) ) ) - (get_local $4) + (get_local $3) ) (i32.const 2) ) - (get_local $6) + (get_local $4) ) ) ) ) - ;;@ assembly/index.ts:83:27 + ;;@ assembly/index.ts:85:27 (set_local $3 (i32.add - ;;@ assembly/index.ts:83:29 + ;;@ assembly/index.ts:85:29 (get_local $3) (i32.const 1) ) @@ -979,82 +834,74 @@ ) ) ) - ;;@ assembly/index.ts:86:2 + ;;@ assembly/index.ts:88:2 (block $break|1 - ;;@ assembly/index.ts:86:7 - (set_local $3 - ;;@ assembly/index.ts:86:16 + ;;@ assembly/index.ts:88:7 + (set_local $5 + ;;@ assembly/index.ts:88:16 (i32.const 0) ) (loop $continue|1 (if - ;;@ assembly/index.ts:86:19 + ;;@ assembly/index.ts:88:19 (i32.lt_s - (get_local $3) - ;;@ assembly/index.ts:86:24 + (get_local $5) + ;;@ assembly/index.ts:88:24 (get_global $assembly/index/h) ) (block (block - ;;@ assembly/index.ts:87:4 + ;;@ assembly/index.ts:89:4 (if - ;;@ assembly/index.ts:87:8 + ;;@ assembly/index.ts:89:8 (f64.lt - ;;@ assembly/index.ts:87:13 + ;;@ assembly/index.ts:89:13 (call $~lib/math/JSMath.random) - ;;@ assembly/index.ts:87:24 + ;;@ assembly/index.ts:89:24 (get_local $2) ) - ;;@ assembly/index.ts:87:27 + ;;@ assembly/index.ts:89:27 (block $assembly/index/set|inlined.6 (set_local $6 - ;;@ assembly/index.ts:87:31 - (get_local $0) - ) - (set_local $5 - ;;@ assembly/index.ts:87:34 - (get_local $3) - ) - (set_local $4 - ;;@ assembly/index.ts:87:38 + ;;@ assembly/index.ts:89:38 (i32.or - (get_global $assembly/index/RGB_ALIVE) - ;;@ assembly/index.ts:87:50 + (get_global $assembly/index/BGR_ALIVE) + ;;@ assembly/index.ts:89:50 (i32.const -16777216) ) ) - ;;@ assembly/index.ts:19:2 + ;;@ assembly/index.ts:21:2 (i32.store - ;;@ assembly/index.ts:19:13 + ;;@ assembly/index.ts:21:13 (i32.shl (i32.add - ;;@ assembly/index.ts:19:14 + ;;@ assembly/index.ts:21:14 (i32.add (get_global $assembly/index/s) - ;;@ assembly/index.ts:19:18 + ;;@ assembly/index.ts:21:18 (i32.mul (get_local $5) - ;;@ assembly/index.ts:19:22 + ;;@ assembly/index.ts:21:22 (get_global $assembly/index/w) ) ) - ;;@ assembly/index.ts:19:26 - (get_local $6) + ;;@ assembly/index.ts:21:26 + (get_local $0) ) - ;;@ assembly/index.ts:19:32 + ;;@ assembly/index.ts:21:32 (i32.const 2) ) - ;;@ assembly/index.ts:19:35 - (get_local $4) + ;;@ assembly/index.ts:21:35 + (get_local $6) ) ) ) ) - ;;@ assembly/index.ts:86:27 - (set_local $3 + ;;@ assembly/index.ts:88:27 + (set_local $5 (i32.add - ;;@ assembly/index.ts:86:29 - (get_local $3) + ;;@ assembly/index.ts:88:29 + (get_local $5) (i32.const 1) ) ) diff --git a/examples/game-of-life/index.html b/examples/game-of-life/index.html index efc17f23..a5049b73 100644 --- a/examples/game-of-life/index.html +++ b/examples/game-of-life/index.html @@ -62,8 +62,8 @@ fetch("build/optimized.wasm") .then(response => response.arrayBuffer()) .then(buffer => WebAssembly.instantiate(buffer, { env: { - RGB_ALIVE : rgb2le(RGB_ALIVE) | 1, // little endian, LSB must be set - RGB_DEAD : rgb2le(RGB_DEAD) & ~1, // little endian, LSB must not be set + BGR_ALIVE : rgb2bgr(RGB_ALIVE) | 1, // little endian, LSB must be set + BGR_DEAD : rgb2bgr(RGB_DEAD) & ~1, // little endian, LSB must not be set BIT_ROT, memory, abort: function() {} @@ -125,7 +125,8 @@ fetch("build/optimized.wasm") console.log(err.stack); }); -function rgb2le(rgb) { +// see comment in assembly/index.ts on why this is useful +function rgb2bgr(rgb) { return ((rgb >>> 16) & 0xff) | (rgb & 0xff00) | (rgb & 0xff) << 16; }