v2 / examples / wasm / functions.v
57 lines · 52 sloc · 701 bytes · 0625caad564def44421cd1f5a4cf596a79596079
Raw
1// `pub` functions will be exported.
2//
3// ```
4// v -b wasm -no-builtin functions.v
5// wasmer functions.wasm -i main.powi <a> <b>
6// wasmer functions.wasm -i main.gcd <a> <b>
7// ```
8
9pub fn gcd(a_ i64, b_ i64) i64 {
10 mut a := a_
11 mut b := b_
12 if a < 0 {
13 a = -a
14 }
15 if b < 0 {
16 b = -b
17 }
18 for b != 0 {
19 a %= b
20 if a == 0 {
21 return b
22 }
23 b %= a
24 }
25 return a
26}
27
28pub fn powi(a i64, b i64) i64 {
29 mut b_ := b
30 mut p := a
31 mut v := i64(1)
32
33 if b_ < 0 { // exponent < 0
34 if a == 0 {
35 return -1 // division by 0
36 }
37 return if a * a != 1 {
38 0
39 } else {
40 if (b_ & 1) > 0 {
41 a
42 } else {
43 1
44 }
45 }
46 }
47
48 for b_ > 0 {
49 if b_ & 1 > 0 {
50 v *= p
51 }
52 p *= p
53 b_ >>= 1
54 }
55
56 return v
57}
58