From 1fe3f785bb4bdd6a222eb66501b8ce4e281de908 Mon Sep 17 00:00:00 2001 From: MaxGraey Date: Tue, 25 Feb 2020 03:21:49 +0200 Subject: [PATCH 1/2] rebuild game-of-life example + minor refactorings --- examples/game-of-life/assembly/index.ts | 36 +- examples/game-of-life/build/optimized.d.ts | 2 +- examples/game-of-life/build/optimized.wasm | Bin 916 -> 901 bytes examples/game-of-life/build/optimized.wat | 247 +++++----- examples/game-of-life/build/untouched.wat | 543 +++++++++++---------- examples/game-of-life/package.json | 2 +- 6 files changed, 418 insertions(+), 412 deletions(-) diff --git a/examples/game-of-life/assembly/index.ts b/examples/game-of-life/assembly/index.ts index ce095c9e5b..ca6c93b713 100644 --- a/examples/game-of-life/assembly/index.ts +++ b/examples/game-of-life/assembly/index.ts @@ -3,43 +3,49 @@ // Configuration imported from JS import { BGR_ALIVE, BGR_DEAD, BIT_ROT } from "./config"; -var w: i32, h: i32, s: i32; +var width: i32, height: i32, offset: i32; /** Gets an input pixel in the range [0, s]. */ @inline function get(x: u32, y: u32): u32 { - return load((y * w + x) << 2); + return load((y * width + x) << 2); } /** Sets an output pixel in the range [s, 2*s]. */ @inline function set(x: u32, y: u32, v: u32): void { - store((s + y * w + x) << 2, v); + store((offset + y * width + x) << 2, v); } /** Sets an output pixel in the range [s, 2*s] while fading it out. */ @inline function rot(x: u32, y: u32, v: u32): void { - var a = max((v >>> 24) - BIT_ROT, 0); - set(x, y, (a << 24) | (v & 0x00ffffff)); + var alpha = max((v >> 24) - BIT_ROT, 0); + set(x, y, (alpha << 24) | (v & 0x00ffffff)); } /** Initializes width and height. Called once from JS. */ -export function init(width: i32, height: i32): void { - w = width; - h = height; - s = width * height; +export function init(w: i32, h: i32): void { + width = w; + height = h; + offset = w * h; // 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 ? BGR_DEAD & 0x00ffffff : BGR_ALIVE | 0xff000000); + let c = Math.random() > 0.1 + ? BGR_DEAD & 0x00ffffff + : BGR_ALIVE | 0xff000000; + set(x, y, c); } } } /** Performs one step. Called about 30 times a second from JS. */ export function step(): void { + var w = width, + h = height; + var hm1 = h - 1, // h - 1 wm1 = w - 1; // w - 1 @@ -55,9 +61,9 @@ export function step(): void { // Every cell interacts with its eight neighbours, which are the cells that are horizontally, // vertically, or diagonally adjacent. Least significant bit indicates alive or dead. let aliveNeighbors = ( - (get(xm1, ym1) & 1) + (get(x , ym1) & 1) + (get(xp1, ym1) & 1) + - (get(xm1, y ) & 1) + (get(xp1, y ) & 1) + - (get(xm1, yp1) & 1) + (get(x , yp1) & 1) + (get(xp1, yp1) & 1) + (get(xm1, ym1) & 1) + (get(x, ym1) & 1) + (get(xp1, ym1) & 1) + + (get(xm1, y ) & 1) + (get(xp1, y ) & 1) + + (get(xm1, yp1) & 1) + (get(x, yp1) & 1) + (get(xp1, yp1) & 1) ); let self = get(x, y); @@ -78,10 +84,10 @@ 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) { + for (let ix = 0; ix < width; ++ix) { if (Math.random() < p) set(ix, y, BGR_ALIVE | 0xff000000); } - for (let iy = 0; iy < h; ++iy) { + for (let iy = 0; iy < height; ++iy) { if (Math.random() < p) set(x, iy, BGR_ALIVE | 0xff000000); } } diff --git a/examples/game-of-life/build/optimized.d.ts b/examples/game-of-life/build/optimized.d.ts index 08e7e10a24..83e5b54edd 100644 --- a/examples/game-of-life/build/optimized.d.ts +++ b/examples/game-of-life/build/optimized.d.ts @@ -8,7 +8,7 @@ declare module ASModule { type f32 = number; type f64 = number; type bool = any; - export function init(width: i32, height: i32): void; + export function init(w: i32, h: i32): void; export function step(): void; export function fill(x: u32, y: u32, p: f64): void; } diff --git a/examples/game-of-life/build/optimized.wasm b/examples/game-of-life/build/optimized.wasm index 17c21d1b0ac293f776d19bb9138c0fca9d93383c..7702c9c6f6395e2dfdac3318b68ab237230695c7 100644 GIT binary patch literal 901 zcmZ`&%Wl&^6umQdY$r8Bkzi5D3&wVYScM&1I#n7dYK0V)ZW}9ci{1DU$CQUEO@0Hu zfgfPWmxVh9S|?F0*_wOq`-k9HO1vmyhu zr$v65Ty+lLj4y^qYKR*CL0to>ljHNFd(1gJKD!vdKO+R={Kn4Wtf;p7YOf2iT1THR<`5bWXr-d~`EuoK+^@Rk<=6wqfB$;o;fdZeC!6lH< zgW-?w=K1w{CUgjDyiqJz;>m8m{`#8Ts>YW zJ~C?%aZRg+IQ&a35w?F5^6P-pfgc5S`gs+XVxP;8Mv4)^QG;dgMyBN>dfJAVsCu#!B4c#7>;V4NygL{s#OL zBrg22FzdKYno>))cb@0-y)lHd6afI=$gU^~=mIXf09`7I1&9kvo`v~Wdm4`V;}p>D zjYn7U_1@ue=dyLATU0;=Ju{F#J-ImAV9w#m`DN$xIU^K}=5`vT9q z1aox%67Cg&)Hw9*fXvI;Dr`K5%2wd{QbQTX9olWrH!W`WWYQ0nqtL4p*OrMX{7!KE zq%_x^tbqZiGTkUtPTQ-C9sfbuyP{2o3K0(xE7|p7q#U>^!+99lj$&pEFZW(`o_Hdg zO6XS;E!wiVLmaKCRiyXlff&{Wch2`mPw(ebCe?cA&r*~M@E6x&M|za;PNT=MT%(ln z$y%)2|0SIB{*;#v&t diff --git a/examples/game-of-life/build/optimized.wat b/examples/game-of-life/build/optimized.wat index b51fc8ebda..9474a6ca67 100644 --- a/examples/game-of-life/build/optimized.wat +++ b/examples/game-of-life/build/optimized.wat @@ -1,46 +1,44 @@ (module - (type $FUNCSIG$vii (func (param i32 i32))) - (type $FUNCSIG$d (func (result f64))) - (type $FUNCSIG$v (func)) - (type $FUNCSIG$viid (func (param i32 i32 f64))) + (type $none_=>_none (func)) + (type $i32_i32_=>_none (func (param i32 i32))) + (type $i32_i32_f64_=>_none (func (param i32 i32 f64))) + (type $none_=>_f64 (func (result f64))) (import "env" "memory" (memory $0 0)) (import "config" "BGR_DEAD" (global $assembly/config/BGR_DEAD i32)) (import "config" "BGR_ALIVE" (global $assembly/config/BGR_ALIVE i32)) (import "config" "BIT_ROT" (global $assembly/config/BIT_ROT i32)) (import "Math" "random" (func $~lib/bindings/Math/random (result f64))) - (global $assembly/index/w (mut i32) (i32.const 0)) - (global $assembly/index/h (mut i32) (i32.const 0)) - (global $assembly/index/s (mut i32) (i32.const 0)) + (global $assembly/index/width (mut i32) (i32.const 0)) + (global $assembly/index/height (mut i32) (i32.const 0)) + (global $assembly/index/offset (mut i32) (i32.const 0)) (export "memory" (memory $0)) (export "init" (func $assembly/index/init)) (export "step" (func $assembly/index/step)) (export "fill" (func $assembly/index/fill)) - (func $assembly/index/init (; 1 ;) (type $FUNCSIG$vii) (param $0 i32) (param $1 i32) + (func $assembly/index/init (; 1 ;) (param $0 i32) (param $1 i32) (local $2 i32) + (local $3 i32) + (local $4 i32) local.get $0 - global.set $assembly/index/w + global.set $assembly/index/width local.get $1 - global.set $assembly/index/h + global.set $assembly/index/height local.get $0 local.get $1 i32.mul - global.set $assembly/index/s - i32.const 0 - local.set $0 - loop $loop|0 - block $break|0 - local.get $0 - global.get $assembly/index/h - i32.ge_s - br_if $break|0 + global.set $assembly/index/offset + loop $for-loop|0 + local.get $3 + local.get $1 + i32.lt_s + if i32.const 0 - local.set $1 - loop $loop|1 - block $break|1 - local.get $1 - global.get $assembly/index/w - i32.ge_s - br_if $break|1 + local.set $2 + loop $for-loop|1 + local.get $2 + local.get $0 + i32.lt_s + if call $~lib/bindings/Math/random f64.const 0.1 f64.gt @@ -48,39 +46,39 @@ global.get $assembly/config/BGR_DEAD i32.const 16777215 i32.and - else + else global.get $assembly/config/BGR_ALIVE i32.const -16777216 i32.or end - local.set $2 - global.get $assembly/index/s - global.get $assembly/index/w - local.get $0 + local.set $4 + local.get $2 + global.get $assembly/index/offset + local.get $3 + global.get $assembly/index/width i32.mul i32.add - local.get $1 i32.add i32.const 2 i32.shl - local.get $2 + local.get $4 i32.store - local.get $1 + local.get $2 i32.const 1 i32.add - local.set $1 - br $loop|1 + local.set $2 + br $for-loop|1 end end - local.get $0 + local.get $3 i32.const 1 i32.add - local.set $0 - br $loop|0 + local.set $3 + br $for-loop|0 end end ) - (func $assembly/index/step (; 2 ;) (type $FUNCSIG$v) + (func $assembly/index/step (; 2 ;) (local $0 i32) (local $1 i32) (local $2 i32) @@ -89,53 +87,55 @@ (local $5 i32) (local $6 i32) (local $7 i32) - global.get $assembly/index/h + (local $8 i32) + (local $9 i32) + global.get $assembly/index/height + local.tee $8 i32.const 1 i32.sub local.set $6 - global.get $assembly/index/w + global.get $assembly/index/width + local.tee $9 i32.const 1 i32.sub local.set $7 - loop $loop|0 - block $break|0 - local.get $0 - global.get $assembly/index/h - i32.ge_s - br_if $break|0 - local.get $0 + loop $for-loop|0 + local.get $1 + local.get $8 + i32.lt_s + if + local.get $1 i32.const 1 i32.sub local.get $6 - local.get $0 + local.get $1 select local.set $4 i32.const 0 - local.get $0 + local.get $1 i32.const 1 i32.add - local.get $0 + local.get $1 local.get $6 i32.eq select local.set $5 i32.const 0 - local.set $1 - loop $loop|1 - block $break|1 - local.get $1 - global.get $assembly/index/w - i32.ge_s - br_if $break|1 - local.get $1 + local.set $0 + loop $for-loop|1 + local.get $0 + local.get $9 + i32.lt_s + if + local.get $0 i32.const 1 i32.sub local.get $7 - local.get $1 + local.get $0 select local.tee $3 - global.get $assembly/index/w local.get $4 + global.get $assembly/index/width i32.mul i32.add i32.const 2 @@ -143,10 +143,10 @@ i32.load i32.const 1 i32.and - global.get $assembly/index/w + local.get $0 local.get $4 + global.get $assembly/index/width i32.mul - local.get $1 i32.add i32.const 2 i32.shl @@ -155,16 +155,16 @@ i32.and i32.add i32.const 0 - local.get $1 + local.get $0 i32.const 1 i32.add - local.get $1 + local.get $0 local.get $7 i32.eq select local.tee $2 - global.get $assembly/index/w local.get $4 + global.get $assembly/index/width i32.mul i32.add i32.const 2 @@ -173,10 +173,10 @@ i32.const 1 i32.and i32.add - global.get $assembly/index/w - local.get $0 - i32.mul local.get $3 + local.get $1 + global.get $assembly/index/width + i32.mul i32.add i32.const 2 i32.shl @@ -184,10 +184,10 @@ i32.const 1 i32.and i32.add - global.get $assembly/index/w - local.get $0 - i32.mul local.get $2 + local.get $1 + global.get $assembly/index/width + i32.mul i32.add i32.const 2 i32.shl @@ -195,10 +195,10 @@ i32.const 1 i32.and i32.add - global.get $assembly/index/w + local.get $3 local.get $5 + global.get $assembly/index/width i32.mul - local.get $3 i32.add i32.const 2 i32.shl @@ -206,10 +206,10 @@ i32.const 1 i32.and i32.add - global.get $assembly/index/w + local.get $0 local.get $5 + global.get $assembly/index/width i32.mul - local.get $1 i32.add i32.const 2 i32.shl @@ -217,10 +217,10 @@ i32.const 1 i32.and i32.add - global.get $assembly/index/w + local.get $2 local.get $5 + global.get $assembly/index/width i32.mul - local.get $2 i32.add i32.const 2 i32.shl @@ -229,10 +229,10 @@ i32.and i32.add local.set $2 - global.get $assembly/index/w local.get $0 - i32.mul local.get $1 + global.get $assembly/index/width + i32.mul i32.add i32.const 2 i32.shl @@ -247,12 +247,12 @@ i32.const 2 i32.eq if - global.get $assembly/index/s - global.get $assembly/index/w local.get $0 + global.get $assembly/index/offset + local.get $1 + global.get $assembly/index/width i32.mul i32.add - local.get $1 i32.add i32.const 2 i32.shl @@ -274,13 +274,13 @@ i32.shl i32.or i32.store - else - global.get $assembly/index/s - global.get $assembly/index/w + else local.get $0 + global.get $assembly/index/offset + local.get $1 + global.get $assembly/index/width i32.mul i32.add - local.get $1 i32.add i32.const 2 i32.shl @@ -289,17 +289,17 @@ i32.or i32.store end - else + else local.get $2 i32.const 3 i32.eq if - global.get $assembly/index/s - global.get $assembly/index/w local.get $0 + global.get $assembly/index/offset + local.get $1 + global.get $assembly/index/width i32.mul i32.add - local.get $1 i32.add i32.const 2 i32.shl @@ -307,13 +307,13 @@ i32.const -16777216 i32.or i32.store - else - global.get $assembly/index/s - global.get $assembly/index/w + else local.get $0 + global.get $assembly/index/offset + local.get $1 + global.get $assembly/index/width i32.mul i32.add - local.get $1 i32.add i32.const 2 i32.shl @@ -337,39 +337,38 @@ i32.store end end - local.get $1 + local.get $0 i32.const 1 i32.add - local.set $1 - br $loop|1 + local.set $0 + br $for-loop|1 end end - local.get $0 + local.get $1 i32.const 1 i32.add - local.set $0 - br $loop|0 + local.set $1 + br $for-loop|0 end end ) - (func $assembly/index/fill (; 3 ;) (type $FUNCSIG$viid) (param $0 i32) (param $1 i32) (param $2 f64) + (func $assembly/index/fill (; 3 ;) (param $0 i32) (param $1 i32) (param $2 f64) (local $3 i32) - loop $loop|0 - block $break|0 - local.get $3 - global.get $assembly/index/w - i32.ge_s - br_if $break|0 + loop $for-loop|0 + local.get $3 + global.get $assembly/index/width + i32.lt_s + if call $~lib/bindings/Math/random local.get $2 f64.lt if - global.get $assembly/index/s - global.get $assembly/index/w + local.get $3 + global.get $assembly/index/offset local.get $1 + global.get $assembly/index/width i32.mul i32.add - local.get $3 i32.add i32.const 2 i32.shl @@ -382,27 +381,26 @@ i32.const 1 i32.add local.set $3 - br $loop|0 + br $for-loop|0 end end i32.const 0 local.set $3 - loop $loop|1 - block $break|1 - local.get $3 - global.get $assembly/index/h - i32.ge_s - br_if $break|1 + loop $for-loop|1 + local.get $3 + global.get $assembly/index/height + i32.lt_s + if call $~lib/bindings/Math/random local.get $2 f64.lt if - global.get $assembly/index/s - global.get $assembly/index/w + local.get $0 + global.get $assembly/index/offset local.get $3 + global.get $assembly/index/width i32.mul i32.add - local.get $0 i32.add i32.const 2 i32.shl @@ -415,11 +413,8 @@ i32.const 1 i32.add local.set $3 - br $loop|1 + br $for-loop|1 end end ) - (func $null (; 4 ;) (type $FUNCSIG$v) - nop - ) ) diff --git a/examples/game-of-life/build/untouched.wat b/examples/game-of-life/build/untouched.wat index 9f380f3a71..4e28015dea 100644 --- a/examples/game-of-life/build/untouched.wat +++ b/examples/game-of-life/build/untouched.wat @@ -1,58 +1,56 @@ (module - (type $FUNCSIG$vii (func (param i32 i32))) - (type $FUNCSIG$d (func (result f64))) - (type $FUNCSIG$v (func)) - (type $FUNCSIG$viid (func (param i32 i32 f64))) + (type $none_=>_none (func)) + (type $i32_i32_=>_none (func (param i32 i32))) + (type $i32_i32_f64_=>_none (func (param i32 i32 f64))) + (type $none_=>_f64 (func (result f64))) (import "env" "memory" (memory $0 0)) (import "config" "BGR_DEAD" (global $assembly/config/BGR_DEAD i32)) (import "config" "BGR_ALIVE" (global $assembly/config/BGR_ALIVE i32)) (import "config" "BIT_ROT" (global $assembly/config/BIT_ROT i32)) (import "Math" "random" (func $~lib/bindings/Math/random (result f64))) (table $0 1 funcref) - (elem (i32.const 0) $null) - (global $assembly/index/w (mut i32) (i32.const 0)) - (global $assembly/index/h (mut i32) (i32.const 0)) - (global $assembly/index/s (mut i32) (i32.const 0)) + (global $assembly/index/width (mut i32) (i32.const 0)) + (global $assembly/index/height (mut i32) (i32.const 0)) + (global $assembly/index/offset (mut i32) (i32.const 0)) (export "memory" (memory $0)) (export "init" (func $assembly/index/init)) (export "step" (func $assembly/index/step)) (export "fill" (func $assembly/index/fill)) - (func $assembly/index/init (; 1 ;) (type $FUNCSIG$vii) (param $0 i32) (param $1 i32) + (func $assembly/index/init (; 1 ;) (param $0 i32) (param $1 i32) (local $2 i32) (local $3 i32) (local $4 i32) (local $5 i32) (local $6 i32) + (local $7 i32) + (local $8 i32) + (local $9 i32) local.get $0 - global.set $assembly/index/w + global.set $assembly/index/width local.get $1 - global.set $assembly/index/h + global.set $assembly/index/height local.get $0 local.get $1 i32.mul - global.set $assembly/index/s - block $break|0 - i32.const 0 - local.set $2 - loop $loop|0 - local.get $2 - global.get $assembly/index/h - i32.lt_s - i32.eqz - br_if $break|0 - block $break|1 - i32.const 0 - local.set $3 - loop $loop|1 - local.get $3 - global.get $assembly/index/w - i32.lt_s - i32.eqz - br_if $break|1 - local.get $3 - local.set $6 - local.get $2 - local.set $5 + global.set $assembly/index/offset + i32.const 0 + local.set $2 + loop $for-loop|0 + local.get $2 + local.get $1 + i32.lt_s + local.set $3 + local.get $3 + if + i32.const 0 + local.set $4 + loop $for-loop|1 + local.get $4 + local.get $0 + i32.lt_s + local.set $5 + local.get $5 + if call $~lib/bindings/Math/random f64.const 0.1 f64.gt @@ -60,41 +58,45 @@ global.get $assembly/config/BGR_DEAD i32.const 16777215 i32.and - else + else global.get $assembly/config/BGR_ALIVE i32.const -16777216 i32.or end - local.set $4 - global.get $assembly/index/s - local.get $5 - global.get $assembly/index/w + local.set $6 + local.get $4 + local.set $9 + local.get $2 + local.set $8 + local.get $6 + local.set $7 + global.get $assembly/index/offset + local.get $8 + global.get $assembly/index/width i32.mul i32.add - local.get $6 + local.get $9 i32.add i32.const 2 i32.shl - local.get $4 + local.get $7 i32.store - local.get $3 + local.get $4 i32.const 1 i32.add - local.set $3 - br $loop|1 + local.set $4 + br $for-loop|1 end - unreachable end local.get $2 i32.const 1 i32.add local.set $2 - br $loop|0 + br $for-loop|0 end - unreachable end ) - (func $assembly/index/step (; 2 ;) (type $FUNCSIG$v) + (func $assembly/index/step (; 2 ;) (local $0 i32) (local $1 i32) (local $2 i32) @@ -112,98 +114,106 @@ (local $14 i32) (local $15 i32) (local $16 i32) - global.get $assembly/index/h + (local $17 i32) + (local $18 i32) + (local $19 i32) + (local $20 i32) + global.get $assembly/index/width + local.set $0 + global.get $assembly/index/height + local.set $1 + local.get $1 i32.const 1 i32.sub - local.set $0 - global.get $assembly/index/w + local.set $2 + local.get $0 i32.const 1 i32.sub - local.set $1 - block $break|0 - i32.const 0 - local.set $2 - loop $loop|0 - local.get $2 - global.get $assembly/index/h - i32.lt_s - i32.eqz - br_if $break|0 - local.get $2 + local.set $3 + i32.const 0 + local.set $4 + loop $for-loop|0 + local.get $4 + local.get $1 + i32.lt_s + local.set $5 + local.get $5 + if + local.get $4 i32.const 0 i32.eq if (result i32) - local.get $0 - else local.get $2 + else + local.get $4 i32.const 1 i32.sub end - local.set $3 + local.set $6 + local.get $4 local.get $2 - local.get $0 i32.eq if (result i32) i32.const 0 - else - local.get $2 + else + local.get $4 i32.const 1 i32.add end - local.set $4 - block $break|1 - i32.const 0 - local.set $5 - loop $loop|1 - local.get $5 - global.get $assembly/index/w - i32.lt_s - i32.eqz - br_if $break|1 - local.get $5 + local.set $7 + i32.const 0 + local.set $8 + loop $for-loop|1 + local.get $8 + local.get $0 + i32.lt_s + local.set $9 + local.get $9 + if + local.get $8 i32.const 0 i32.eq if (result i32) - local.get $1 - else - local.get $5 + local.get $3 + else + local.get $8 i32.const 1 i32.sub end - local.set $6 - local.get $5 - local.get $1 + local.set $10 + local.get $8 + local.get $3 i32.eq if (result i32) i32.const 0 - else - local.get $5 + else + local.get $8 i32.const 1 i32.add end - local.set $7 + local.set $11 + local.get $10 + local.set $13 local.get $6 - local.set $9 - local.get $3 - local.set $8 - local.get $8 - global.get $assembly/index/w + local.set $12 + local.get $12 + global.get $assembly/index/width i32.mul - local.get $9 + local.get $13 i32.add i32.const 2 i32.shl i32.load i32.const 1 i32.and - local.get $5 - local.set $9 - local.get $3 - local.set $8 local.get $8 - global.get $assembly/index/w + local.set $13 + local.get $6 + local.set $12 + local.get $12 + global.get $assembly/index/width i32.mul - local.get $9 + local.get $13 i32.add i32.const 2 i32.shl @@ -211,14 +221,14 @@ i32.const 1 i32.and i32.add - local.get $7 - local.set $9 - local.get $3 - local.set $8 - local.get $8 - global.get $assembly/index/w + local.get $11 + local.set $13 + local.get $6 + local.set $12 + local.get $12 + global.get $assembly/index/width i32.mul - local.get $9 + local.get $13 i32.add i32.const 2 i32.shl @@ -226,14 +236,14 @@ i32.const 1 i32.and i32.add - local.get $6 - local.set $9 - local.get $2 - local.set $8 - local.get $8 - global.get $assembly/index/w + local.get $10 + local.set $13 + local.get $4 + local.set $12 + local.get $12 + global.get $assembly/index/width i32.mul - local.get $9 + local.get $13 i32.add i32.const 2 i32.shl @@ -241,14 +251,14 @@ i32.const 1 i32.and i32.add - local.get $7 - local.set $9 - local.get $2 - local.set $8 - local.get $8 - global.get $assembly/index/w + local.get $11 + local.set $13 + local.get $4 + local.set $12 + local.get $12 + global.get $assembly/index/width i32.mul - local.get $9 + local.get $13 i32.add i32.const 2 i32.shl @@ -256,14 +266,14 @@ i32.const 1 i32.and i32.add - local.get $6 - local.set $9 - local.get $4 - local.set $8 - local.get $8 - global.get $assembly/index/w + local.get $10 + local.set $13 + local.get $7 + local.set $12 + local.get $12 + global.get $assembly/index/width i32.mul - local.get $9 + local.get $13 i32.add i32.const 2 i32.shl @@ -271,14 +281,14 @@ i32.const 1 i32.and i32.add - local.get $5 - local.set $9 - local.get $4 - local.set $8 local.get $8 - global.get $assembly/index/w + local.set $13 + local.get $7 + local.set $12 + local.get $12 + global.get $assembly/index/width i32.mul - local.get $9 + local.get $13 i32.add i32.const 2 i32.shl @@ -286,14 +296,14 @@ i32.const 1 i32.and i32.add + local.get $11 + local.set $13 local.get $7 - local.set $9 - local.get $4 - local.set $8 - local.get $8 - global.get $assembly/index/w + local.set $12 + local.get $12 + global.get $assembly/index/width i32.mul - local.get $9 + local.get $13 i32.add i32.const 2 i32.shl @@ -301,267 +311,262 @@ i32.const 1 i32.and i32.add - local.set $9 - local.get $5 - local.set $10 - local.get $2 - local.set $8 + local.set $13 local.get $8 - global.get $assembly/index/w + local.set $14 + local.get $4 + local.set $12 + local.get $12 + global.get $assembly/index/width i32.mul - local.get $10 + local.get $14 i32.add i32.const 2 i32.shl i32.load - local.set $10 - local.get $10 + local.set $14 + local.get $14 i32.const 1 i32.and if - local.get $9 + local.get $13 i32.const 14 i32.and i32.const 2 i32.eq if - local.get $5 - local.set $12 - local.get $2 - local.set $11 - local.get $10 - local.set $8 local.get $8 + local.set $16 + local.get $4 + local.set $15 + local.get $14 + local.set $12 + local.get $12 i32.const 24 i32.shr_u global.get $assembly/config/BIT_ROT i32.sub - local.tee $13 + local.tee $17 i32.const 0 - local.tee $14 - local.get $13 - local.get $14 + local.tee $18 + local.get $17 + local.get $18 i32.gt_s select - local.set $13 - local.get $12 - local.set $16 - local.get $11 - local.set $15 - local.get $13 + local.set $17 + local.get $16 + local.set $20 + local.get $15 + local.set $19 + local.get $17 i32.const 24 i32.shl - local.get $8 + local.get $12 i32.const 16777215 i32.and i32.or - local.set $14 - global.get $assembly/index/s - local.get $15 - global.get $assembly/index/w + local.set $18 + global.get $assembly/index/offset + local.get $19 + global.get $assembly/index/width i32.mul i32.add - local.get $16 + local.get $20 i32.add i32.const 2 i32.shl - local.get $14 + local.get $18 i32.store - else - local.get $5 - local.set $16 - local.get $2 - local.set $15 + else + local.get $8 + local.set $20 + local.get $4 + local.set $19 global.get $assembly/config/BGR_DEAD i32.const -16777216 i32.or - local.set $14 - global.get $assembly/index/s - local.get $15 - global.get $assembly/index/w + local.set $18 + global.get $assembly/index/offset + local.get $19 + global.get $assembly/index/width i32.mul i32.add - local.get $16 + local.get $20 i32.add i32.const 2 i32.shl - local.get $14 + local.get $18 i32.store end - else - local.get $9 + else + local.get $13 i32.const 3 i32.eq if - local.get $5 - local.set $12 - local.get $2 - local.set $11 + local.get $8 + local.set $16 + local.get $4 + local.set $15 global.get $assembly/config/BGR_ALIVE i32.const -16777216 i32.or - local.set $8 - global.get $assembly/index/s - local.get $11 - global.get $assembly/index/w + local.set $12 + global.get $assembly/index/offset + local.get $15 + global.get $assembly/index/width i32.mul i32.add - local.get $12 + local.get $16 i32.add i32.const 2 i32.shl - local.get $8 + local.get $12 i32.store - else - local.get $5 - local.set $15 - local.get $2 - local.set $14 - local.get $10 - local.set $13 - local.get $13 + else + local.get $8 + local.set $19 + local.get $4 + local.set $18 + local.get $14 + local.set $17 + local.get $17 i32.const 24 i32.shr_u global.get $assembly/config/BIT_ROT i32.sub - local.tee $12 + local.tee $16 i32.const 0 - local.tee $11 - local.get $12 - local.get $11 + local.tee $15 + local.get $16 + local.get $15 i32.gt_s select + local.set $16 + local.get $19 + local.set $15 + local.get $18 local.set $12 - local.get $15 - local.set $11 - local.get $14 - local.set $8 - local.get $12 + local.get $16 i32.const 24 i32.shl - local.get $13 + local.get $17 i32.const 16777215 i32.and i32.or - local.set $16 - global.get $assembly/index/s - local.get $8 - global.get $assembly/index/w + local.set $20 + global.get $assembly/index/offset + local.get $12 + global.get $assembly/index/width i32.mul i32.add - local.get $11 + local.get $15 i32.add i32.const 2 i32.shl - local.get $16 + local.get $20 i32.store end end - local.get $5 + local.get $8 i32.const 1 i32.add - local.set $5 - br $loop|1 + local.set $8 + br $for-loop|1 end - unreachable end - local.get $2 + local.get $4 i32.const 1 i32.add - local.set $2 - br $loop|0 + local.set $4 + br $for-loop|0 end - unreachable end ) - (func $assembly/index/fill (; 3 ;) (type $FUNCSIG$viid) (param $0 i32) (param $1 i32) (param $2 f64) + (func $assembly/index/fill (; 3 ;) (param $0 i32) (param $1 i32) (param $2 f64) (local $3 i32) (local $4 i32) (local $5 i32) (local $6 i32) - block $break|0 - i32.const 0 - local.set $3 - loop $loop|0 - local.get $3 - global.get $assembly/index/w - i32.lt_s - i32.eqz - br_if $break|0 + (local $7 i32) + i32.const 0 + local.set $3 + loop $for-loop|0 + local.get $3 + global.get $assembly/index/width + i32.lt_s + local.set $4 + local.get $4 + if call $~lib/bindings/Math/random local.get $2 f64.lt if local.get $3 - local.set $6 + local.set $7 local.get $1 - local.set $5 + local.set $6 global.get $assembly/config/BGR_ALIVE i32.const -16777216 i32.or - local.set $4 - global.get $assembly/index/s - local.get $5 - global.get $assembly/index/w + local.set $5 + global.get $assembly/index/offset + local.get $6 + global.get $assembly/index/width i32.mul i32.add - local.get $6 + local.get $7 i32.add i32.const 2 i32.shl - local.get $4 + local.get $5 i32.store end local.get $3 i32.const 1 i32.add local.set $3 - br $loop|0 + br $for-loop|0 end - unreachable end - block $break|1 - i32.const 0 - local.set $3 - loop $loop|1 - local.get $3 - global.get $assembly/index/h - i32.lt_s - i32.eqz - br_if $break|1 + i32.const 0 + local.set $3 + loop $for-loop|1 + local.get $3 + global.get $assembly/index/height + i32.lt_s + local.set $4 + local.get $4 + if call $~lib/bindings/Math/random local.get $2 f64.lt if local.get $0 - local.set $6 + local.set $7 local.get $3 - local.set $5 + local.set $6 global.get $assembly/config/BGR_ALIVE i32.const -16777216 i32.or - local.set $4 - global.get $assembly/index/s - local.get $5 - global.get $assembly/index/w + local.set $5 + global.get $assembly/index/offset + local.get $6 + global.get $assembly/index/width i32.mul i32.add - local.get $6 + local.get $7 i32.add i32.const 2 i32.shl - local.get $4 + local.get $5 i32.store end local.get $3 i32.const 1 i32.add local.set $3 - br $loop|1 + br $for-loop|1 end - unreachable end ) - (func $null (; 4 ;) (type $FUNCSIG$v) - ) ) diff --git a/examples/game-of-life/package.json b/examples/game-of-life/package.json index 93ff48f7ff..49674e09fb 100644 --- a/examples/game-of-life/package.json +++ b/examples/game-of-life/package.json @@ -4,7 +4,7 @@ "private": true, "scripts": { "asbuild:untouched": "asc assembly/index.ts -b build/untouched.wasm -t build/untouched.wat --use Math=JSMath --runtime none --importMemory --sourceMap --debug --validate --measure", - "asbuild:optimized": "asc assembly/index.ts -b build/optimized.wasm -t build/optimized.wat -d build/optimized.d.ts --use Math=JSMath -O3 --runtime none --importMemory --sourceMap --validate --measure", + "asbuild:optimized": "asc assembly/index.ts -b build/optimized.wasm -t build/optimized.wat -d build/optimized.d.ts --use Math=JSMath -O3 --runtime none --importMemory --sourceMap --validate --measure", "asbuild": "npm run asbuild:untouched && npm run asbuild:optimized", "server": "http-server . -o -c-1" }, From f4441b376d40249fce227b97382accbd7cd9bebf Mon Sep 17 00:00:00 2001 From: MaxGraey Date: Wed, 26 Feb 2020 19:10:59 +0200 Subject: [PATCH 2/2] sync with master & update n-body bench results with new StaticArray --- examples/n-body/README.md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/examples/n-body/README.md b/examples/n-body/README.md index 5acc74fb03..b94dc3dc8f 100644 --- a/examples/n-body/README.md +++ b/examples/n-body/README.md @@ -31,17 +31,17 @@ Benchmark ***Environment:*** - MacBook Pro (15-inch, 2019) -- macOS 10.14.6 -- node.js v13.5.0 +- macOS 10.15.3 +- node.js v13.8.0 - rustc 1.42.0-nightly (3a3f4a7cb 2019-12-28) ***Results:*** | Target | Time, ***ms*** | Size, ***KB*** | |-------------------------|-----------------|----------------| -| **AssemblyScript WASM** | **1650** | **1.6** | -| AssemblyScript ASMJS | 2558 | 10* | -| JavaScript | 1596 | 5* | -| Rust WASM | 1570 | 2 | +| **AssemblyScript WASM** | **1602** | **1.6** | +| AssemblyScript ASMJS | 2368 | 10* | +| JavaScript | 1616 | 5* | +| Rust WASM | 1618 | 2 | ___* unminified___