Skip to content

Commit cbce65a

Browse files
committed
Add library examples
1 parent dd2f050 commit cbce65a

File tree

25 files changed

+856
-2
lines changed

25 files changed

+856
-2
lines changed

README.md

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -45,11 +45,21 @@ These examples cover slightly higher level aspects, like working with managed ob
4545

4646
<img src="./loader/preview.jpg" />
4747

48-
## Other
48+
## AssemblyScript as a library
49+
50+
Various WebAssembly or AssemblyScript features as a library.
51+
52+
* [i64](./i64)<br />
53+
Exposes WebAssembly's i64 operations to JavaScript using 32-bit integers (low and high bits).
54+
55+
* [libm](./libm)<br />
56+
Exposes AssemblyScript's math routines for double and single precision as a library.
57+
58+
## Features
4959

5060
General examples showing how to utilize specific AssemblyScript features.
5161

52-
* [Browser SDK](./sdk)<br />
62+
* [Browser SDK](./sdk) ([demo](https://assemblyscript.github.io/examples/sdk/))<br />
5363
Shows how to use the browser SDK to run the AssemblyScript compiler in the browser.
5464

5565
<img src="./sdk/preview.jpg" />

game-of-life/package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
{
22
"name": "@assemblyscript/game-of-life-example",
33
"version": "1.0.0",
4+
"license": "Apache-2.0",
45
"private": true,
56
"scripts": {
67
"asbuild:untouched": "asc assembly/index.ts -b build/untouched.wasm -t build/untouched.wat --use Math=JSMath --runtime none --importMemory --sourceMap --debug --validate --measure",

i64/README.md

Lines changed: 128 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,128 @@
1+
i64
2+
===
3+
4+
An [AssemblyScript](http://assemblyscript.org) example. Exposes WebAssembly's i64 operations to JavaScript using 32-bit integers (low and high bits).
5+
6+
Usage
7+
-----
8+
9+
```ts
10+
import * as i64 from "path/to/i64";
11+
12+
i64.div(10, 0, 2, 0);
13+
14+
console.log("result: lo=" + i64.getLo() + ", hi=" + i64.getHi());
15+
```
16+
17+
API
18+
---
19+
20+
**Note** that `u32` is just an alias of `number` in JavaScript with values in 32-bit integer range.
21+
22+
* **getLo**(): `u32`<br />
23+
Gets the low 32 bits of the computed 64-bit value.
24+
25+
* **getHi**(): `u32`<br />
26+
Gets the high 32 bits of the computed 64-bit value.
27+
28+
* **clz**(loLeft: `u32`, hiLeft: `u32`): `void`<br />
29+
Performs the sign-agnostic count leading zero bits operation. All zero bits are considered leading if the value is zero.
30+
31+
* **ctz**(loLeft: `u32`, hiLeft: `u32`): `void`<br />
32+
Performs the sign-agnostic count tailing zero bits operation. All zero bits are considered trailing if the value is zero.
33+
34+
* **popcnt**(loLeft: `u32`, hiLeft: `u32`): `void`<br />
35+
Performs the sign-agnostic count number of one bits operation.
36+
37+
* **eqz**(loLeft: `u32`, hiLeft: `u32`): `void`<br />
38+
Performs the sign-agnostic equals-zero operation.
39+
40+
* **add**(loLeft: `u32`, hiLeft: `u32`, loRight: `u32`, hiRight: `u32`): `void`<br />
41+
Performs the sign-agnostic addition operation.
42+
43+
* **sub**(loLeft: `u32`, hiLeft: `u32`, loRight: `u32`, hiRight: `u32`): `void`<br />
44+
Performs the sign-agnostic subtraction operation.
45+
46+
* **mul**(loLeft: `u32`, hiLeft: `u32`, loRight: `u32`, hiRight: `u32`): `void`<br />
47+
Performs the sign-agnostic multiplication operation.
48+
49+
* **div_s**(loLeft: `u32`, hiLeft: `u32`, loRight: `u32`, hiRight: `u32`): `void`<br />
50+
Performs the signed division operation.
51+
52+
* **div_u**(loLeft: `u32`, hiLeft: `u32`, loRight: `u32`, hiRight: `u32`): `void`<br />
53+
Performs the unsigned division operation.
54+
55+
* **rem_s**(loLeft: `u32`, hiLeft: `u32`, loRight: `u32`, hiRight: `u32`): `void`<br />
56+
Performs the signed remainder operation.
57+
58+
* **rem_u**(loLeft: `u32`, hiLeft: `u32`, loRight: `u32`, hiRight: `u32`): `void`<br />
59+
Performs the unsigned remainder operation.
60+
61+
* **and**(loLeft: `u32`, hiLeft: `u32`, loRight: `u32`, hiRight: `u32`): `void`<br />
62+
Performs the sign-agnostic bitwise and operation.
63+
64+
* **or**(loLeft: `u32`, hiLeft: `u32`, loRight: `u32`, hiRight: `u32`): `void`<br />
65+
Performs the sign-agnostic bitwise or operation.
66+
67+
* **xor**(loLeft: `u32`, hiLeft: `u32`, loRight: `u32`, hiRight: `u32`): `void`<br />
68+
Performs the sign-agnostic bitwise xor operation.
69+
70+
* **shl**(loLeft: `u32`, hiLeft: `u32`, loRight: `u32`, hiRight: `u32`): `void`<br />
71+
Performs the sign-agnostic bitwise shift left operation.
72+
73+
* **shr_s**(loLeft: `u32`, hiLeft: `u32`, loRight: `u32`, hiRight: `u32`): `void`<br />
74+
Performs the signed bitwise shift right operation.
75+
76+
* **shr_u**(loLeft: `u32`, hiLeft: `u32`, loRight: `u32`, hiRight: `u32`): `void`<br />
77+
Performs the unsigned bitwise shift right operation.
78+
79+
* **rotl**(loLeft: `u32`, hiLeft: `u32`, loRight: `u32`, hiRight: `u32`): `void`<br />
80+
Performs the sign-agnostic rotate left operation.
81+
82+
* **rotr**(loLeft: `u32`, hiLeft: `u32`, loRight: `u32`, hiRight: `u32`): `void`<br />
83+
Performs the sign-agnostic rotate right operation.
84+
85+
* **eq**(loLeft: `u32`, hiLeft: `u32`, loRight: `u32`, hiRight: `u32`): `void`<br />
86+
Performs the sign-agnostic compare equal operation.
87+
88+
* **ne**(loLeft: `u32`, hiLeft: `u32`, loRight: `u32`, hiRight: `u32`): `void`<br />
89+
Performs the sign-agnostic compare unequal operation.
90+
91+
* **lt_s**(loLeft: `u32`, hiLeft: `u32`, loRight: `u32`, hiRight: `u32`): `void`<br />
92+
Performs the signed less than operation.
93+
94+
* **lt_u**(loLeft: `u32`, hiLeft: `u32`, loRight: `u32`, hiRight: `u32`): `void`<br />
95+
Performs the unsigned less than operation.
96+
97+
* **le_s**(loLeft: `u32`, hiLeft: `u32`, loRight: `u32`, hiRight: `u32`): `void`<br />
98+
Performs the signed less than or equal operation.
99+
100+
* **le_u**(loLeft: `u32`, hiLeft: `u32`, loRight: `u32`, hiRight: `u32`): `void`<br />
101+
Performs the unsigned less than or equal operation.
102+
103+
* **gt_s**(loLeft: `u32`, hiLeft: `u32`, loRight: `u32`, hiRight: `u32`): `void`<br />
104+
Performs the signed greater than operation.
105+
106+
* **gt_u**(loLeft: `u32`, hiLeft: `u32`, loRight: `u32`, hiRight: `u32`): `void`<br />
107+
Performs the unsigned greater than operation.
108+
109+
* **ge_s**(loLeft: `u32`, hiLeft: `u32`, loRight: `u32`, hiRight: `u32`): `void`<br />
110+
Performs the signed greater than or equal operation.
111+
112+
* **ge_u**(loLeft: `u32`, hiLeft: `u32`, loRight: `u32`, hiRight: `u32`): `void`<br />
113+
Performs the unsigned greater than or equal operation.
114+
115+
Building
116+
--------
117+
118+
To build [assembly/i64.ts](./assembly/i64.ts) to an untouched and an optimized `.wasm` including their respective `.wat` representations, run:
119+
120+
```
121+
$> npm run asbuild
122+
```
123+
124+
Afterwards, to run the included [test](./tests/index.js):
125+
126+
```
127+
$> npm test
128+
```

i64/assembly/i64.ts

Lines changed: 193 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,193 @@
1+
var lo: u32, hi: u32;
2+
3+
export function getLo(): u32 {
4+
return lo;
5+
}
6+
7+
export function getHi(): u32 {
8+
return hi;
9+
}
10+
11+
import { clz as builtin_clz } from "builtins";
12+
13+
export function clz(loLeft: u32, hiLeft: u32): void {
14+
var ret = builtin_clz<u64>(<u64>loLeft | <u64>hiLeft << 32);
15+
lo = <u32>ret;
16+
hi = 0;
17+
}
18+
19+
import { ctz as builtin_ctz } from "builtins";
20+
21+
export function ctz(loLeft: u32, hiLeft: u32): void {
22+
var ret = builtin_ctz<u64>(<u64>loLeft | <u64>hiLeft << 32);
23+
lo = <u32>ret;
24+
hi = 0;
25+
}
26+
27+
import { popcnt as builtin_popcnt } from "builtins";
28+
29+
export function popcnt(loLeft: u32, hiLeft: u32): void {
30+
var ret = builtin_popcnt<u64>(<u64>loLeft | <u64>hiLeft << 32);
31+
lo = <u32>ret;
32+
hi = 0;
33+
}
34+
35+
export function eqz(loLeft: u32, hiLeft: u32): void {
36+
var ret: bool = !(<u64>loLeft | <u64>hiLeft << 32);
37+
lo = u32(ret);
38+
hi = 0;
39+
}
40+
41+
export function add(loLeft: u32, hiLeft: u32, loRight: u32, hiRight: u32): void {
42+
var ret = (<u64>loLeft | <u64>hiLeft << 32) + (<u64>loRight | <u64>hiRight << 32);
43+
lo = <u32>ret;
44+
hi = <u32>(ret >> 32);
45+
}
46+
47+
export function sub(loLeft: u32, hiLeft: u32, loRight: u32, hiRight: u32): void {
48+
var ret = (<u64>loLeft | <u64>hiLeft << 32) - (<u64>loRight | <u64>hiRight << 32);
49+
lo = <u32>ret;
50+
hi = <u32>(ret >> 32);
51+
}
52+
53+
export function mul(loLeft: u32, hiLeft: u32, loRight: u32, hiRight: u32): void {
54+
var ret = (<u64>loLeft | <u64>hiLeft << 32) * (<u64>loRight | <u64>hiRight << 32);
55+
lo = <u32>ret;
56+
hi = <u32>(ret >> 32);
57+
}
58+
59+
export function div_s(loLeft: u32, hiLeft: u32, loRight: u32, hiRight: u32): void {
60+
var ret = <u64>(<i64>(<u64>loLeft | <u64>hiLeft << 32) / <i64>(<u64>loRight | <u64>hiRight << 32));
61+
lo = <u32>ret;
62+
hi = <u32>(ret >> 32);
63+
}
64+
65+
export function div_u(loLeft: u32, hiLeft: u32, loRight: u32, hiRight: u32): void {
66+
var ret = (<u64>loLeft | <u64>hiLeft << 32) / (<u64>loRight | <u64>hiRight << 32);
67+
lo = <u32>ret;
68+
hi = <u32>(ret >> 32);
69+
}
70+
71+
export function rem_s(loLeft: u32, hiLeft: u32, loRight: u32, hiRight: u32): void {
72+
var ret = <u64>(<i64>(<u64>loLeft | <u64>hiLeft << 32) % <i64>(<u64>loRight | <u64>hiRight << 32));
73+
lo = <u32>ret;
74+
hi = <u32>(ret >> 32);
75+
}
76+
77+
export function rem_u(loLeft: u32, hiLeft: u32, loRight: u32, hiRight: u32): void {
78+
var ret = (<u64>loLeft | <u64>hiLeft << 32) % (<u64>loRight | <u64>hiRight << 32);
79+
lo = <u32>ret;
80+
hi = <u32>(ret >>> 32);
81+
}
82+
83+
export function and(loLeft: u32, hiLeft: u32, loRight: u32, hiRight: u32): void {
84+
var ret = (<u64>loLeft | <u64>hiLeft << 32) & (<u64>loRight | <u64>hiRight << 32);
85+
lo = <u32>ret;
86+
hi = <u32>(ret >>> 32);
87+
}
88+
89+
export function or(loLeft: u32, hiLeft: u32, loRight: u32, hiRight: u32): void {
90+
var ret = (<u64>loLeft | <u64>hiLeft << 32) | (<u64>loRight | <u64>hiRight << 32);
91+
lo = <u32>ret;
92+
hi = <u32>(ret >>> 32);
93+
}
94+
95+
export function xor(loLeft: u32, hiLeft: u32, loRight: u32, hiRight: u32): void {
96+
var ret = (<u64>loLeft | <u64>hiLeft << 32) ^ (<u64>loRight | <u64>hiRight << 32);
97+
lo = <u32>ret;
98+
hi = <u32>(ret >>> 32);
99+
}
100+
101+
export function shl(loLeft: u32, hiLeft: u32, loRight: u32, hiRight: u32): void {
102+
var ret = (<u64>loLeft | <u64>hiLeft << 32) << (<u64>loRight | <u64>hiRight << 32);
103+
lo = <u32>ret;
104+
hi = <u32>(ret >>> 32);
105+
}
106+
107+
export function shr_s(loLeft: u32, hiLeft: u32, loRight: u32, hiRight: u32): void {
108+
var ret = <u64>(<i64>(<u64>loLeft | <u64>hiLeft << 32) >> <i64>(<u64>loRight | <u64>hiRight << 32));
109+
lo = <u32>ret;
110+
hi = <u32>(ret >>> 32);
111+
}
112+
113+
export function shr_u(loLeft: u32, hiLeft: u32, loRight: u32, hiRight: u32): void {
114+
var ret = (<u64>loLeft | <u64>hiLeft << 32) >> (<u64>loRight | <u64>hiRight << 32);
115+
lo = <u32>ret;
116+
hi = <u32>(ret >>> 32);
117+
}
118+
119+
import { rotl as builtin_rotl } from "builtins";
120+
121+
export function rotl(loLeft: u32, hiLeft: u32, loRight: u32, hiRight: u32): void {
122+
var ret = builtin_rotl<u64>(<u64>loLeft | <u64>hiLeft << 32, <u64>loRight | <u64>hiRight << 32);
123+
lo = <u32>ret;
124+
hi = <u32>(ret >>> 32);
125+
}
126+
127+
import { rotr as builtin_rotr } from "builtins";
128+
129+
export function rotr(loLeft: u32, hiLeft: u32, loRight: u32, hiRight: u32): void {
130+
var ret = builtin_rotr<u64>(<u64>loLeft | <u64>hiLeft << 32, <u64>loRight | <u64>hiRight << 32);
131+
lo = <u32>ret;
132+
hi = <u32>(ret >>> 32);
133+
}
134+
135+
export function eq(loLeft: u32, hiLeft: u32, loRight: u32, hiRight: u32): void {
136+
var ret: bool = (<u64>loLeft | <u64>hiLeft << 32) == (<u64>loRight | <u64>hiRight << 32);
137+
lo = u32(ret);
138+
hi = 0;
139+
}
140+
141+
export function ne(loLeft: u32, hiLeft: u32, loRight: u32, hiRight: u32): void {
142+
var ret: bool = (<u64>loLeft | <u64>hiLeft << 32) != (<u64>loRight | <u64>hiRight << 32);
143+
lo = u32(ret);
144+
hi = 0;
145+
}
146+
147+
export function lt_s(loLeft: u32, hiLeft: u32, loRight: u32, hiRight: u32): void {
148+
var ret: bool = <i64>(<u64>loLeft | <u64>hiLeft << 32) < <i64>(<u64>loRight | <u64>hiRight << 32);
149+
lo = u32(ret);
150+
hi = 0;
151+
}
152+
153+
export function lt_u(loLeft: u32, hiLeft: u32, loRight: u32, hiRight: u32): void {
154+
var ret: bool = (<u64>loLeft | <u64>hiLeft << 32) < (<u64>loRight | <u64>hiRight << 32);
155+
lo = u32(ret);
156+
hi = 0;
157+
}
158+
159+
export function le_s(loLeft: u32, hiLeft: u32, loRight: u32, hiRight: u32): void {
160+
var ret: bool = <i64>(<u64>loLeft | <u64>hiLeft << 32) <= <i64>(<u64>loRight | <u64>hiRight << 32);
161+
lo = u32(ret);
162+
hi = 0;
163+
}
164+
165+
export function le_u(loLeft: u32, hiLeft: u32, loRight: u32, hiRight: u32): void {
166+
var ret: bool = (<u64>loLeft | <u64>hiLeft << 32) <= (<u64>loRight | <u64>hiRight << 32);
167+
lo = u32(ret);
168+
hi = 0;
169+
}
170+
171+
export function gt_s(loLeft: u32, hiLeft: u32, loRight: u32, hiRight: u32): void {
172+
var ret: bool = <i64>(<u64>loLeft | <u64>hiLeft << 32) > <i64>(<u64>loRight | <u64>hiRight << 32);
173+
lo = u32(ret);
174+
hi = 0;
175+
}
176+
177+
export function gt_u(loLeft: u32, hiLeft: u32, loRight: u32, hiRight: u32): void {
178+
var ret: bool = (<u64>loLeft | <u64>hiLeft << 32) > (<u64>loRight | <u64>hiRight << 32);
179+
lo = u32(ret);
180+
hi = 0;
181+
}
182+
183+
export function ge_s(loLeft: u32, hiLeft: u32, loRight: u32, hiRight: u32): void {
184+
var ret: bool = <i64>(<u64>loLeft | <u64>hiLeft << 32) >= <i64>(<u64>loRight | <u64>hiRight << 32);
185+
lo = u32(ret);
186+
hi = 0;
187+
}
188+
189+
export function ge_u(loLeft: u32, hiLeft: u32, loRight: u32, hiRight: u32): void {
190+
var ret: bool = (<u64>loLeft | <u64>hiLeft << 32) >= (<u64>loRight | <u64>hiRight << 32);
191+
lo = u32(ret);
192+
hi = 0;
193+
}

i64/assembly/tsconfig.json

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
{
2+
"extends": "../node_modules/assemblyscript/std/assembly.json",
3+
"include": [
4+
"./**/*.ts"
5+
]
6+
}

i64/build/.gitignore

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
*
2+
!.gitignore

0 commit comments

Comments
 (0)