From 423b0bc3f8f3408726740f31bbbfe530682a09fd Mon Sep 17 00:00:00 2001 From: MaxGraey Date: Fri, 12 Aug 2022 09:00:38 +0300 Subject: [PATCH] refactor i64 example --- i64/asconfig.json | 24 ++++++++++++++ i64/assembly/i64.ts | 80 ++++++++++++++++++++++----------------------- i64/index.js | 2 +- i64/package.json | 10 +++--- 4 files changed, 70 insertions(+), 46 deletions(-) create mode 100644 i64/asconfig.json diff --git a/i64/asconfig.json b/i64/asconfig.json new file mode 100644 index 0000000..6937ae7 --- /dev/null +++ b/i64/asconfig.json @@ -0,0 +1,24 @@ +{ + "entries": [ + "./assembly/i64.ts" + ], + "options": { + "runtime": "stub", + "sourceMap": true, + "measure": true + }, + "targets": { + "debug": { + "outFile": "build/debug.wasm", + "textFile": "build/debug.wat", + "debug": true + }, + "release": { + "outFile": "build/release.wasm", + "textFile": "build/release.wat", + "optimizeLevel": 3, + "shrinkLevel": 0, + "noAssert": true + } + } +} diff --git a/i64/assembly/i64.ts b/i64/assembly/i64.ts index 8548d30..c9508cf 100644 --- a/i64/assembly/i64.ts +++ b/i64/assembly/i64.ts @@ -1,4 +1,14 @@ -var lo: u32, hi: u32; +import { + clz as builtin_clz, + ctz as builtin_ctz, + popcnt as builtin_popcnt, + rotl as builtin_rotl, + rotr as builtin_rotr, +} from "builtins"; + +let + lo: u32, + hi: u32; export function getLo(): u32 { return lo; @@ -8,24 +18,18 @@ export function getHi(): u32 { return hi; } -import { clz as builtin_clz } from "builtins"; - export function clz(loLeft: u32, hiLeft: u32): void { var ret = builtin_clz(loLeft | hiLeft << 32); lo = ret; hi = 0; } -import { ctz as builtin_ctz } from "builtins"; - export function ctz(loLeft: u32, hiLeft: u32): void { var ret = builtin_ctz(loLeft | hiLeft << 32); lo = ret; hi = 0; } -import { popcnt as builtin_popcnt } from "builtins"; - export function popcnt(loLeft: u32, hiLeft: u32): void { var ret = builtin_popcnt(loLeft | hiLeft << 32); lo = ret; @@ -33,7 +37,7 @@ export function popcnt(loLeft: u32, hiLeft: u32): void { } export function eqz(loLeft: u32, hiLeft: u32): void { - var ret: bool = !(loLeft | hiLeft << 32); + var ret = !(loLeft | hiLeft << 32); lo = u32(ret); hi = 0; } @@ -41,153 +45,149 @@ export function eqz(loLeft: u32, hiLeft: u32): void { export function add(loLeft: u32, hiLeft: u32, loRight: u32, hiRight: u32): void { var ret = (loLeft | hiLeft << 32) + (loRight | hiRight << 32); lo = ret; - hi = (ret >> 32); + hi = u32(ret >> 32); } export function sub(loLeft: u32, hiLeft: u32, loRight: u32, hiRight: u32): void { var ret = (loLeft | hiLeft << 32) - (loRight | hiRight << 32); lo = ret; - hi = (ret >> 32); + hi = u32(ret >> 32); } export function mul(loLeft: u32, hiLeft: u32, loRight: u32, hiRight: u32): void { var ret = (loLeft | hiLeft << 32) * (loRight | hiRight << 32); lo = ret; - hi = (ret >> 32); + hi = u32(ret >> 32); } export function div_s(loLeft: u32, hiLeft: u32, loRight: u32, hiRight: u32): void { - var ret = ((loLeft | hiLeft << 32) / (loRight | hiRight << 32)); + var ret = u64(i64(loLeft | hiLeft << 32) / i64(loRight | hiRight << 32)); lo = ret; - hi = (ret >> 32); + hi = u32(ret >> 32); } export function div_u(loLeft: u32, hiLeft: u32, loRight: u32, hiRight: u32): void { var ret = (loLeft | hiLeft << 32) / (loRight | hiRight << 32); lo = ret; - hi = (ret >> 32); + hi = u32(ret >> 32); } export function rem_s(loLeft: u32, hiLeft: u32, loRight: u32, hiRight: u32): void { - var ret = ((loLeft | hiLeft << 32) % (loRight | hiRight << 32)); + var ret = u64(i64(loLeft | hiLeft << 32) % i64(loRight | hiRight << 32)); lo = ret; - hi = (ret >> 32); + hi = u32(ret >> 32); } export function rem_u(loLeft: u32, hiLeft: u32, loRight: u32, hiRight: u32): void { var ret = (loLeft | hiLeft << 32) % (loRight | hiRight << 32); lo = ret; - hi = (ret >>> 32); + hi = u32(ret >>> 32); } export function and(loLeft: u32, hiLeft: u32, loRight: u32, hiRight: u32): void { var ret = (loLeft | hiLeft << 32) & (loRight | hiRight << 32); lo = ret; - hi = (ret >>> 32); + hi = u32(ret >>> 32); } export function or(loLeft: u32, hiLeft: u32, loRight: u32, hiRight: u32): void { var ret = (loLeft | hiLeft << 32) | (loRight | hiRight << 32); lo = ret; - hi = (ret >>> 32); + hi = u32(ret >>> 32); } export function xor(loLeft: u32, hiLeft: u32, loRight: u32, hiRight: u32): void { var ret = (loLeft | hiLeft << 32) ^ (loRight | hiRight << 32); lo = ret; - hi = (ret >>> 32); + hi = u32(ret >>> 32); } export function shl(loLeft: u32, hiLeft: u32, loRight: u32, hiRight: u32): void { var ret = (loLeft | hiLeft << 32) << (loRight | hiRight << 32); lo = ret; - hi = (ret >>> 32); + hi = u32(ret >>> 32); } export function shr_s(loLeft: u32, hiLeft: u32, loRight: u32, hiRight: u32): void { - var ret = ((loLeft | hiLeft << 32) >> (loRight | hiRight << 32)); + var ret = u64(i64(loLeft | hiLeft << 32) >> i64(loRight | hiRight << 32)); lo = ret; - hi = (ret >>> 32); + hi = u32(ret >>> 32); } export function shr_u(loLeft: u32, hiLeft: u32, loRight: u32, hiRight: u32): void { var ret = (loLeft | hiLeft << 32) >> (loRight | hiRight << 32); lo = ret; - hi = (ret >>> 32); + hi = u32(ret >>> 32); } -import { rotl as builtin_rotl } from "builtins"; - export function rotl(loLeft: u32, hiLeft: u32, loRight: u32, hiRight: u32): void { var ret = builtin_rotl(loLeft | hiLeft << 32, loRight | hiRight << 32); lo = ret; - hi = (ret >>> 32); + hi = u32(ret >>> 32); } -import { rotr as builtin_rotr } from "builtins"; - export function rotr(loLeft: u32, hiLeft: u32, loRight: u32, hiRight: u32): void { var ret = builtin_rotr(loLeft | hiLeft << 32, loRight | hiRight << 32); lo = ret; - hi = (ret >>> 32); + hi = u32(ret >>> 32); } export function eq(loLeft: u32, hiLeft: u32, loRight: u32, hiRight: u32): void { - var ret: bool = (loLeft | hiLeft << 32) == (loRight | hiRight << 32); + var ret = (loLeft | hiLeft << 32) == (loRight | hiRight << 32); lo = u32(ret); hi = 0; } export function ne(loLeft: u32, hiLeft: u32, loRight: u32, hiRight: u32): void { - var ret: bool = (loLeft | hiLeft << 32) != (loRight | hiRight << 32); + var ret = (loLeft | hiLeft << 32) != (loRight | hiRight << 32); lo = u32(ret); hi = 0; } export function lt_s(loLeft: u32, hiLeft: u32, loRight: u32, hiRight: u32): void { - var ret: bool = (loLeft | hiLeft << 32) < (loRight | hiRight << 32); + var ret = i64(loLeft | hiLeft << 32) < i64(loRight | hiRight << 32); lo = u32(ret); hi = 0; } export function lt_u(loLeft: u32, hiLeft: u32, loRight: u32, hiRight: u32): void { - var ret: bool = (loLeft | hiLeft << 32) < (loRight | hiRight << 32); + var ret = (loLeft | hiLeft << 32) < (loRight | hiRight << 32); lo = u32(ret); hi = 0; } export function le_s(loLeft: u32, hiLeft: u32, loRight: u32, hiRight: u32): void { - var ret: bool = (loLeft | hiLeft << 32) <= (loRight | hiRight << 32); + var ret = i64(loLeft | hiLeft << 32) <= i64(loRight | hiRight << 32); lo = u32(ret); hi = 0; } export function le_u(loLeft: u32, hiLeft: u32, loRight: u32, hiRight: u32): void { - var ret: bool = (loLeft | hiLeft << 32) <= (loRight | hiRight << 32); + var ret = (loLeft | hiLeft << 32) <= (loRight | hiRight << 32); lo = u32(ret); hi = 0; } export function gt_s(loLeft: u32, hiLeft: u32, loRight: u32, hiRight: u32): void { - var ret: bool = (loLeft | hiLeft << 32) > (loRight | hiRight << 32); + var ret = (loLeft | hiLeft << 32) > (loRight | hiRight << 32); lo = u32(ret); hi = 0; } export function gt_u(loLeft: u32, hiLeft: u32, loRight: u32, hiRight: u32): void { - var ret: bool = (loLeft | hiLeft << 32) > (loRight | hiRight << 32); + var ret = (loLeft | hiLeft << 32) > (loRight | hiRight << 32); lo = u32(ret); hi = 0; } export function ge_s(loLeft: u32, hiLeft: u32, loRight: u32, hiRight: u32): void { - var ret: bool = (loLeft | hiLeft << 32) >= (loRight | hiRight << 32); + var ret = i64(loLeft | hiLeft << 32) >= i64(loRight | hiRight << 32); lo = u32(ret); hi = 0; } export function ge_u(loLeft: u32, hiLeft: u32, loRight: u32, hiRight: u32): void { - var ret: bool = (loLeft | hiLeft << 32) >= (loRight | hiRight << 32); + var ret = (loLeft | hiLeft << 32) >= (loRight | hiRight << 32); lo = u32(ret); hi = 0; } diff --git a/i64/index.js b/i64/index.js index 5c44fc0..41bc175 100644 --- a/i64/index.js +++ b/i64/index.js @@ -1,7 +1,7 @@ var fs = require("fs"); // Instantiate the module -var mod = new WebAssembly.Module(fs.readFileSync(__dirname + "/build/optimized.wasm")); +var mod = new WebAssembly.Module(fs.readFileSync(__dirname + "/build/release.wasm")); var ins = new WebAssembly.Instance(mod, { /* no imports */ }); // Export its exports diff --git a/i64/package.json b/i64/package.json index 2e584d2..43d3216 100644 --- a/i64/package.json +++ b/i64/package.json @@ -5,15 +5,15 @@ "main": "index.js", "types": "index.d.ts", "scripts": { - "asbuild": "npm run asbuild:untouched && npm run asbuild:optimized", - "asbuild:untouched": "asc assembly/i64.ts -t build/untouched.wat -o build/untouched.wasm --runtime stub --sourceMap --debug --measure", - "asbuild:optimized": "asc assembly/i64.ts -t build/optimized.wat -o build/optimized.wasm -O3 --runtime stub --sourceMap --measure", + "asbuild:debug": "asc --target debug", + "asbuild:release": "asc --target release", + "asbuild": "npm run asbuild:debug && npm run asbuild:release", "test": "node tests" }, "files": [ "assembly/", - "build/optimized.wasm", - "build/optimized.wasm.map", + "build/release.wasm", + "build/release.wasm.map", "index.d.ts", "index.js", "README.md"