Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
24 changes: 24 additions & 0 deletions i64/asconfig.json
Original file line number Diff line number Diff line change
@@ -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
}
}
}
80 changes: 40 additions & 40 deletions i64/assembly/i64.ts
Original file line number Diff line number Diff line change
@@ -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;
Expand All @@ -8,186 +18,176 @@ 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<u64>(<u64>loLeft | <u64>hiLeft << 32);
lo = <u32>ret;
hi = 0;
}

import { ctz as builtin_ctz } from "builtins";

export function ctz(loLeft: u32, hiLeft: u32): void {
var ret = builtin_ctz<u64>(<u64>loLeft | <u64>hiLeft << 32);
lo = <u32>ret;
hi = 0;
}

import { popcnt as builtin_popcnt } from "builtins";

export function popcnt(loLeft: u32, hiLeft: u32): void {
var ret = builtin_popcnt<u64>(<u64>loLeft | <u64>hiLeft << 32);
lo = <u32>ret;
hi = 0;
}

export function eqz(loLeft: u32, hiLeft: u32): void {
var ret: bool = !(<u64>loLeft | <u64>hiLeft << 32);
var ret = !(<u64>loLeft | <u64>hiLeft << 32);
lo = u32(ret);
hi = 0;
}

export function add(loLeft: u32, hiLeft: u32, loRight: u32, hiRight: u32): void {
var ret = (<u64>loLeft | <u64>hiLeft << 32) + (<u64>loRight | <u64>hiRight << 32);
lo = <u32>ret;
hi = <u32>(ret >> 32);
hi = u32(ret >> 32);
}

export function sub(loLeft: u32, hiLeft: u32, loRight: u32, hiRight: u32): void {
var ret = (<u64>loLeft | <u64>hiLeft << 32) - (<u64>loRight | <u64>hiRight << 32);
lo = <u32>ret;
hi = <u32>(ret >> 32);
hi = u32(ret >> 32);
}

export function mul(loLeft: u32, hiLeft: u32, loRight: u32, hiRight: u32): void {
var ret = (<u64>loLeft | <u64>hiLeft << 32) * (<u64>loRight | <u64>hiRight << 32);
lo = <u32>ret;
hi = <u32>(ret >> 32);
hi = u32(ret >> 32);
}

export function div_s(loLeft: u32, hiLeft: u32, loRight: u32, hiRight: u32): void {
var ret = <u64>(<i64>(<u64>loLeft | <u64>hiLeft << 32) / <i64>(<u64>loRight | <u64>hiRight << 32));
var ret = u64(i64(<u64>loLeft | <u64>hiLeft << 32) / i64(<u64>loRight | <u64>hiRight << 32));
lo = <u32>ret;
hi = <u32>(ret >> 32);
hi = u32(ret >> 32);
}

export function div_u(loLeft: u32, hiLeft: u32, loRight: u32, hiRight: u32): void {
var ret = (<u64>loLeft | <u64>hiLeft << 32) / (<u64>loRight | <u64>hiRight << 32);
lo = <u32>ret;
hi = <u32>(ret >> 32);
hi = u32(ret >> 32);
}

export function rem_s(loLeft: u32, hiLeft: u32, loRight: u32, hiRight: u32): void {
var ret = <u64>(<i64>(<u64>loLeft | <u64>hiLeft << 32) % <i64>(<u64>loRight | <u64>hiRight << 32));
var ret = u64(i64(<u64>loLeft | <u64>hiLeft << 32) % i64(<u64>loRight | <u64>hiRight << 32));
lo = <u32>ret;
hi = <u32>(ret >> 32);
hi = u32(ret >> 32);
}

export function rem_u(loLeft: u32, hiLeft: u32, loRight: u32, hiRight: u32): void {
var ret = (<u64>loLeft | <u64>hiLeft << 32) % (<u64>loRight | <u64>hiRight << 32);
lo = <u32>ret;
hi = <u32>(ret >>> 32);
hi = u32(ret >>> 32);
}

export function and(loLeft: u32, hiLeft: u32, loRight: u32, hiRight: u32): void {
var ret = (<u64>loLeft | <u64>hiLeft << 32) & (<u64>loRight | <u64>hiRight << 32);
lo = <u32>ret;
hi = <u32>(ret >>> 32);
hi = u32(ret >>> 32);
}

export function or(loLeft: u32, hiLeft: u32, loRight: u32, hiRight: u32): void {
var ret = (<u64>loLeft | <u64>hiLeft << 32) | (<u64>loRight | <u64>hiRight << 32);
lo = <u32>ret;
hi = <u32>(ret >>> 32);
hi = u32(ret >>> 32);
}

export function xor(loLeft: u32, hiLeft: u32, loRight: u32, hiRight: u32): void {
var ret = (<u64>loLeft | <u64>hiLeft << 32) ^ (<u64>loRight | <u64>hiRight << 32);
lo = <u32>ret;
hi = <u32>(ret >>> 32);
hi = u32(ret >>> 32);
}

export function shl(loLeft: u32, hiLeft: u32, loRight: u32, hiRight: u32): void {
var ret = (<u64>loLeft | <u64>hiLeft << 32) << (<u64>loRight | <u64>hiRight << 32);
lo = <u32>ret;
hi = <u32>(ret >>> 32);
hi = u32(ret >>> 32);
}

export function shr_s(loLeft: u32, hiLeft: u32, loRight: u32, hiRight: u32): void {
var ret = <u64>(<i64>(<u64>loLeft | <u64>hiLeft << 32) >> <i64>(<u64>loRight | <u64>hiRight << 32));
var ret = u64(i64(<u64>loLeft | <u64>hiLeft << 32) >> i64(<u64>loRight | <u64>hiRight << 32));
lo = <u32>ret;
hi = <u32>(ret >>> 32);
hi = u32(ret >>> 32);
}

export function shr_u(loLeft: u32, hiLeft: u32, loRight: u32, hiRight: u32): void {
var ret = (<u64>loLeft | <u64>hiLeft << 32) >> (<u64>loRight | <u64>hiRight << 32);
lo = <u32>ret;
hi = <u32>(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<u64>(<u64>loLeft | <u64>hiLeft << 32, <u64>loRight | <u64>hiRight << 32);
lo = <u32>ret;
hi = <u32>(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<u64>(<u64>loLeft | <u64>hiLeft << 32, <u64>loRight | <u64>hiRight << 32);
lo = <u32>ret;
hi = <u32>(ret >>> 32);
hi = u32(ret >>> 32);
}

export function eq(loLeft: u32, hiLeft: u32, loRight: u32, hiRight: u32): void {
var ret: bool = (<u64>loLeft | <u64>hiLeft << 32) == (<u64>loRight | <u64>hiRight << 32);
var ret = (<u64>loLeft | <u64>hiLeft << 32) == (<u64>loRight | <u64>hiRight << 32);
lo = u32(ret);
hi = 0;
}

export function ne(loLeft: u32, hiLeft: u32, loRight: u32, hiRight: u32): void {
var ret: bool = (<u64>loLeft | <u64>hiLeft << 32) != (<u64>loRight | <u64>hiRight << 32);
var ret = (<u64>loLeft | <u64>hiLeft << 32) != (<u64>loRight | <u64>hiRight << 32);
lo = u32(ret);
hi = 0;
}

export function lt_s(loLeft: u32, hiLeft: u32, loRight: u32, hiRight: u32): void {
var ret: bool = <i64>(<u64>loLeft | <u64>hiLeft << 32) < <i64>(<u64>loRight | <u64>hiRight << 32);
var ret = i64(<u64>loLeft | <u64>hiLeft << 32) < i64(<u64>loRight | <u64>hiRight << 32);
lo = u32(ret);
hi = 0;
}

export function lt_u(loLeft: u32, hiLeft: u32, loRight: u32, hiRight: u32): void {
var ret: bool = (<u64>loLeft | <u64>hiLeft << 32) < (<u64>loRight | <u64>hiRight << 32);
var ret = (<u64>loLeft | <u64>hiLeft << 32) < (<u64>loRight | <u64>hiRight << 32);
lo = u32(ret);
hi = 0;
}

export function le_s(loLeft: u32, hiLeft: u32, loRight: u32, hiRight: u32): void {
var ret: bool = <i64>(<u64>loLeft | <u64>hiLeft << 32) <= <i64>(<u64>loRight | <u64>hiRight << 32);
var ret = i64(<u64>loLeft | <u64>hiLeft << 32) <= i64(<u64>loRight | <u64>hiRight << 32);
lo = u32(ret);
hi = 0;
}

export function le_u(loLeft: u32, hiLeft: u32, loRight: u32, hiRight: u32): void {
var ret: bool = (<u64>loLeft | <u64>hiLeft << 32) <= (<u64>loRight | <u64>hiRight << 32);
var ret = (<u64>loLeft | <u64>hiLeft << 32) <= (<u64>loRight | <u64>hiRight << 32);
lo = u32(ret);
hi = 0;
}

export function gt_s(loLeft: u32, hiLeft: u32, loRight: u32, hiRight: u32): void {
var ret: bool = <i64>(<u64>loLeft | <u64>hiLeft << 32) > <i64>(<u64>loRight | <u64>hiRight << 32);
var ret = <i64>(<u64>loLeft | <u64>hiLeft << 32) > <i64>(<u64>loRight | <u64>hiRight << 32);
lo = u32(ret);
hi = 0;
}

export function gt_u(loLeft: u32, hiLeft: u32, loRight: u32, hiRight: u32): void {
var ret: bool = (<u64>loLeft | <u64>hiLeft << 32) > (<u64>loRight | <u64>hiRight << 32);
var ret = (<u64>loLeft | <u64>hiLeft << 32) > (<u64>loRight | <u64>hiRight << 32);
lo = u32(ret);
hi = 0;
}

export function ge_s(loLeft: u32, hiLeft: u32, loRight: u32, hiRight: u32): void {
var ret: bool = <i64>(<u64>loLeft | <u64>hiLeft << 32) >= <i64>(<u64>loRight | <u64>hiRight << 32);
var ret = i64(<u64>loLeft | <u64>hiLeft << 32) >= i64(<u64>loRight | <u64>hiRight << 32);
lo = u32(ret);
hi = 0;
}

export function ge_u(loLeft: u32, hiLeft: u32, loRight: u32, hiRight: u32): void {
var ret: bool = (<u64>loLeft | <u64>hiLeft << 32) >= (<u64>loRight | <u64>hiRight << 32);
var ret = (<u64>loLeft | <u64>hiLeft << 32) >= (<u64>loRight | <u64>hiRight << 32);
lo = u32(ret);
hi = 0;
}
2 changes: 1 addition & 1 deletion i64/index.js
Original file line number Diff line number Diff line change
@@ -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
Expand Down
10 changes: 5 additions & 5 deletions i64/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -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"
Expand Down