v2 / vlib / v / gen / wasm / tests / asm.vv
150 lines · 129 sloc · 2.07 KB · c32b04d5bec354511fa92c6653f76f71a8a4307a
Raw
1fn add_int(init f64, val int) f64 {
2 mut ret := 0.0
3 asm wasm {
4 local.get init
5 local.get val
6 f64.convert_i32_s
7 f64.add
8 local.set ret
9 ; =r (ret)
10 ; r (init)
11 r (val)
12 }
13 return ret
14}
15
16fn add_f64(init int, val f64) int {
17 mut ret := 0
18 asm wasm {
19 local.get init
20 local.get val
21 i32.trunc_sat_f64_s
22 i32.add
23 local.set ret
24 ; =r (ret)
25 ; r (init)
26 r (val)
27 }
28 return ret
29}
30
31fn memory_size() int {
32 mut ret := 0
33 asm wasm {
34 memory.size
35 local.set ret
36 ; =r (ret)
37 }
38 return ret
39}
40
41fn memset() {
42 mut memory := [16]u8{}
43
44 asm wasm {
45 local.get memory
46 i32.const 0x33
47 i32.const 16
48 memory.fill
49 ; =r (memory)
50 }
51
52 for i := 0; i < 16; i++ {
53 print(memory[i])
54 if i + 1 < 16 {
55 print(' ')
56 }
57 }
58 println('')
59}
60
61fn literals() (int, i64, f32, f64) {
62 mut l1 := 0
63 mut l2 := i64(0)
64 mut l3 := f32(0.0)
65 mut l4 := 0.0
66
67 asm wasm {
68 i32.const 999
69 i64.const 999
70 f32.const 999
71 f64.const 999
72 local.set l4
73 local.set l3
74 local.set l2
75 local.set l1
76 ; =r (l1)
77 =r (l2)
78 =r (l3)
79 =r (l4)
80 }
81
82 return l1, l2, l3, l4
83}
84
85fn reinterpret_asm() string {
86 mut reinterp := 0
87
88 // reinterpret int value into f32, convert back
89 asm wasm {
90 i32.const 0x44424000 // 777.0
91 f32.reinterpret_i32
92 i32.trunc_sat_f32_s
93 local.set reinterp
94 ; =r (reinterp)
95 }
96
97 mut lit := ''
98
99 // call "int.str" to convert int to string
100 asm wasm {
101 local.get lit
102 local.get reinterp
103 call 'int.str'
104 ; =r (lit)
105 ; r (reinterp)
106 }
107
108 return lit
109}
110
111fn malloc_ptr() {
112 mut v := unsafe { &int(malloc(sizeof(int))) }
113
114 asm wasm {
115 local.get v
116 i32.const 42
117 i32.store 2, 0 // log2(sizeof(int)) == 2
118 ; =r (v)
119 }
120
121 println(*v)
122
123 mut readp := 0
124 asm wasm {
125 local.get v
126 i32.load 2, 0 // log2(sizeof(int)) == 2
127 local.set readp
128 ; =r (readp)
129 ; r (v)
130 }
131
132 println(readp)
133}
134
135fn main() {
136 println(int(add_int(1.0, 2))) // no f64.str()
137 println(add_f64(1, 2.0))
138 println(memory_size())
139 memset()
140
141 a, b, c, d := literals()
142 println(a)
143 println(b)
144 println(int(c)) // no f32.str()
145 println(int(d)) // no f64.str()
146
147 seven_seven_seven := reinterpret_asm()
148 println(seven_seven_seven)
149 malloc_ptr()
150}
151