wardite 0.8.1 → 0.9.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/Rakefile +23 -0
- data/examples/i32_bench.html +482 -0
- data/examples/i32_bench.wat +137 -0
- data/examples/i32_bench_original.wat +314 -0
- data/examples/load_perf.rb +24 -0
- data/lib/wardite/alu_f32.generated.rb +12 -10
- data/lib/wardite/alu_f64.generated.rb +12 -10
- data/lib/wardite/alu_i32.generated.rb +24 -22
- data/lib/wardite/alu_i64.generated.rb +30 -28
- data/lib/wardite/cli/cli.rb +22 -0
- data/lib/wardite/convert.generated.rb +7 -5
- data/lib/wardite/instruction.rb +424 -64
- data/lib/wardite/leb128.rb +3 -6
- data/lib/wardite/load.rb +65 -26
- data/lib/wardite/revisitor.rb +12 -4
- data/lib/wardite/version.rb +1 -1
- data/lib/wardite.rb +53 -36
- data/rbs_collection.lock.yaml +24 -20
- data/scripts/gen_alu.rb +24 -24
- data/scripts/templates/alu_module.rb.tmpl +7 -5
- data/scripts/templates/conv_module.rb.tmpl +7 -5
- data/sig/generated/wardite/alu_f32.generated.rbs +4 -3
- data/sig/generated/wardite/alu_f64.generated.rbs +4 -3
- data/sig/generated/wardite/alu_i32.generated.rbs +4 -3
- data/sig/generated/wardite/alu_i64.generated.rbs +4 -3
- data/sig/generated/wardite/cli/cli.rbs +5 -0
- data/sig/generated/wardite/convert.generated.rbs +4 -3
- data/sig/generated/wardite/instruction.rbs +13 -9
- data/sig/generated/wardite/load.rbs +9 -9
- data/sig/generated/wardite.rbs +11 -7
- data/sig/vernier.rbs +3 -0
- metadata +8 -3
data/lib/wardite/cli/cli.rb
CHANGED
@@ -13,6 +13,8 @@ module Wardite
|
|
13
13
|
attr_reader :wasi #: bool
|
14
14
|
attr_reader :yjit #: bool
|
15
15
|
|
16
|
+
attr_reader :profile_file_path #: String?
|
17
|
+
|
16
18
|
# @rbs args: Array[String]
|
17
19
|
# @rbs return: void
|
18
20
|
def initialize(args)
|
@@ -37,6 +39,9 @@ module Wardite
|
|
37
39
|
opts.on("--yjit", "Enable yjit if available; setting WARDITE_YJIT_ON=1 has the same effect") {|_v|
|
38
40
|
@yjit = true
|
39
41
|
}
|
42
|
+
opts.on("--out-profile [file]", "Enable Vernier profiling and save to the file") {|v|
|
43
|
+
@profile_file_path = v
|
44
|
+
}
|
40
45
|
opts.on("FILE.wasm") { }
|
41
46
|
end
|
42
47
|
options.parse!(args)
|
@@ -47,6 +52,10 @@ module Wardite
|
|
47
52
|
if (yjit || ENV["WARDITE_YJIT_ON"] == "1") && (defined? RubyVM::YJIT)
|
48
53
|
RubyVM::YJIT.enable
|
49
54
|
end
|
55
|
+
|
56
|
+
if (yjit || ENV["WARDITE_YJIT_ON"] == "1") && !defined?(RubyVM::YJIT)
|
57
|
+
warn "Warning: --yjit option is specified, but not available in this Ruby build"
|
58
|
+
end
|
50
59
|
end
|
51
60
|
|
52
61
|
# @rbs return: Array[Integer | Float]
|
@@ -73,6 +82,19 @@ module Wardite
|
|
73
82
|
|
74
83
|
# @rbs return: void
|
75
84
|
def run
|
85
|
+
if profile_file_path
|
86
|
+
require "vernier"
|
87
|
+
$stderr.puts "Activated Vernier profiling"
|
88
|
+
Vernier.profile(out: profile_file_path) do
|
89
|
+
__run
|
90
|
+
end
|
91
|
+
else
|
92
|
+
__run
|
93
|
+
end
|
94
|
+
end
|
95
|
+
|
96
|
+
# @rbs return: void
|
97
|
+
def __run
|
76
98
|
if invoke
|
77
99
|
invoke_function
|
78
100
|
else
|
@@ -5,10 +5,11 @@ module Wardite
|
|
5
5
|
module Evaluator
|
6
6
|
# @rbs runtime: Runtime
|
7
7
|
# @rbs frame: Frame
|
8
|
-
# @rbs
|
9
|
-
# @rbs
|
10
|
-
|
11
|
-
|
8
|
+
# @rbs code: Symbol
|
9
|
+
# @rbs operand: Array[operandItem]
|
10
|
+
# @rbs return: bool?
|
11
|
+
def self.convert_eval_insn(runtime, frame, code, operand)
|
12
|
+
case code
|
12
13
|
|
13
14
|
when :i32_wrap_i64
|
14
15
|
from = runtime.stack.pop
|
@@ -331,8 +332,9 @@ module Wardite
|
|
331
332
|
|
332
333
|
|
333
334
|
else
|
334
|
-
|
335
|
+
return
|
335
336
|
end
|
337
|
+
return true
|
336
338
|
end
|
337
339
|
end
|
338
340
|
end
|
data/lib/wardite/instruction.rb
CHANGED
@@ -34,6 +34,7 @@ module Wardite
|
|
34
34
|
i32_extend8_s i32_extend16_s i64_extend8_s i64_extend16_s i64_extend32_s
|
35
35
|
__unsuported_from_here_on__
|
36
36
|
] #: Array[Symbol]
|
37
|
+
SYMS[0xfc] = :fc
|
37
38
|
|
38
39
|
FC_SYMS = %i[
|
39
40
|
i32_trunc_sat_f32_s i32_trunc_sat_f32_u i32_trunc_sat_f64_s i32_trunc_sat_f64_u
|
@@ -44,30 +45,417 @@ module Wardite
|
|
44
45
|
__unsuported_from_here_on__
|
45
46
|
] #: Array[Symbol]
|
46
47
|
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
48
|
+
OPERANDS = [
|
49
|
+
[],
|
50
|
+
[],
|
51
|
+
[:u8_block],
|
52
|
+
[:u8_block],
|
53
|
+
[:u8_block],
|
54
|
+
[],
|
55
|
+
[],
|
56
|
+
[],
|
57
|
+
[],
|
58
|
+
[],
|
59
|
+
[],
|
60
|
+
[],
|
61
|
+
[:u32],
|
62
|
+
[:u32],
|
63
|
+
[:u32_vec, :u32],
|
64
|
+
[],
|
65
|
+
[:u32],
|
66
|
+
[:u32, :u32],
|
67
|
+
[],
|
68
|
+
[],
|
69
|
+
[],
|
70
|
+
[],
|
71
|
+
[],
|
72
|
+
[],
|
73
|
+
[],
|
74
|
+
[],
|
75
|
+
[],
|
76
|
+
[],
|
77
|
+
[],
|
78
|
+
[],
|
79
|
+
[],
|
80
|
+
[],
|
81
|
+
[:u32],
|
82
|
+
[:u32],
|
83
|
+
[:u32],
|
84
|
+
[:u32],
|
85
|
+
[:u32],
|
86
|
+
[],
|
87
|
+
[],
|
88
|
+
[],
|
89
|
+
[:u32, :u32],
|
90
|
+
[:u32, :u32],
|
91
|
+
[:u32, :u32],
|
92
|
+
[:u32, :u32],
|
93
|
+
[:u32, :u32],
|
94
|
+
[:u32, :u32],
|
95
|
+
[:u32, :u32],
|
96
|
+
[:u32, :u32],
|
97
|
+
[:u32, :u32],
|
98
|
+
[:u32, :u32],
|
99
|
+
[:u32, :u32],
|
100
|
+
[:u32, :u32],
|
101
|
+
[:u32, :u32],
|
102
|
+
[:u32, :u32],
|
103
|
+
[:u32, :u32],
|
104
|
+
[:u32, :u32],
|
105
|
+
[:u32, :u32],
|
106
|
+
[:u32, :u32],
|
107
|
+
[:u32, :u32],
|
108
|
+
[:u32, :u32],
|
109
|
+
[:u32, :u32],
|
110
|
+
[:u32, :u32],
|
111
|
+
[:u32, :u32],
|
112
|
+
[:u32],
|
113
|
+
[:u32],
|
114
|
+
[:i32],
|
115
|
+
[:i64],
|
116
|
+
[:f32],
|
117
|
+
[:f64],
|
118
|
+
[],
|
119
|
+
[],
|
120
|
+
[],
|
121
|
+
[],
|
122
|
+
[],
|
123
|
+
[],
|
124
|
+
[],
|
125
|
+
[],
|
126
|
+
[],
|
127
|
+
[],
|
128
|
+
[],
|
129
|
+
[],
|
130
|
+
[],
|
131
|
+
[],
|
132
|
+
[],
|
133
|
+
[],
|
134
|
+
[],
|
135
|
+
[],
|
136
|
+
[],
|
137
|
+
[],
|
138
|
+
[],
|
139
|
+
[],
|
140
|
+
[],
|
141
|
+
[],
|
142
|
+
[],
|
143
|
+
[],
|
144
|
+
[],
|
145
|
+
[],
|
146
|
+
[],
|
147
|
+
[],
|
148
|
+
[],
|
149
|
+
[],
|
150
|
+
[],
|
151
|
+
[],
|
152
|
+
[],
|
153
|
+
[],
|
154
|
+
[],
|
155
|
+
[],
|
156
|
+
[],
|
157
|
+
[],
|
158
|
+
[],
|
159
|
+
[],
|
160
|
+
[],
|
161
|
+
[],
|
162
|
+
[],
|
163
|
+
[],
|
164
|
+
[],
|
165
|
+
[],
|
166
|
+
[],
|
167
|
+
[],
|
168
|
+
[],
|
169
|
+
[],
|
170
|
+
[],
|
171
|
+
[],
|
172
|
+
[],
|
173
|
+
[],
|
174
|
+
[],
|
175
|
+
[],
|
176
|
+
[],
|
177
|
+
[],
|
178
|
+
[],
|
179
|
+
[],
|
180
|
+
[],
|
181
|
+
[],
|
182
|
+
[],
|
183
|
+
[],
|
184
|
+
[],
|
185
|
+
[],
|
186
|
+
[],
|
187
|
+
[],
|
188
|
+
[],
|
189
|
+
[],
|
190
|
+
[],
|
191
|
+
[],
|
192
|
+
[],
|
193
|
+
[],
|
194
|
+
[],
|
195
|
+
[],
|
196
|
+
[],
|
197
|
+
[],
|
198
|
+
[],
|
199
|
+
[],
|
200
|
+
[],
|
201
|
+
[],
|
202
|
+
[],
|
203
|
+
[],
|
204
|
+
[],
|
205
|
+
[],
|
206
|
+
[],
|
207
|
+
[],
|
208
|
+
[],
|
209
|
+
[],
|
210
|
+
[],
|
211
|
+
[],
|
212
|
+
[],
|
213
|
+
[],
|
214
|
+
[],
|
215
|
+
[],
|
216
|
+
[],
|
217
|
+
[],
|
218
|
+
[],
|
219
|
+
[],
|
220
|
+
[],
|
221
|
+
[],
|
222
|
+
[],
|
223
|
+
[],
|
224
|
+
[],
|
225
|
+
[],
|
226
|
+
[],
|
227
|
+
[],
|
228
|
+
[],
|
229
|
+
[],
|
230
|
+
[],
|
231
|
+
[],
|
232
|
+
[],
|
233
|
+
[],
|
234
|
+
[],
|
235
|
+
[],
|
236
|
+
[],
|
237
|
+
[],
|
238
|
+
[],
|
239
|
+
[],
|
240
|
+
[],
|
241
|
+
[],
|
242
|
+
[],
|
243
|
+
[],
|
244
|
+
[],
|
245
|
+
[],
|
246
|
+
[]
|
247
|
+
] #: Array[Array[Symbol]]
|
51
248
|
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
249
|
+
NAMESPACES = [
|
250
|
+
:default,
|
251
|
+
:default,
|
252
|
+
:default,
|
253
|
+
:default,
|
254
|
+
:default,
|
255
|
+
:default,
|
256
|
+
:default,
|
257
|
+
:default,
|
258
|
+
:default,
|
259
|
+
:default,
|
260
|
+
:default,
|
261
|
+
:default,
|
262
|
+
:default,
|
263
|
+
:default,
|
264
|
+
:default,
|
265
|
+
:default,
|
266
|
+
:default,
|
267
|
+
:default,
|
268
|
+
:default,
|
269
|
+
:default,
|
270
|
+
:default,
|
271
|
+
:default,
|
272
|
+
:default,
|
273
|
+
:default,
|
274
|
+
:default,
|
275
|
+
:default,
|
276
|
+
:default,
|
277
|
+
:default,
|
278
|
+
:default,
|
279
|
+
:default,
|
280
|
+
:default,
|
281
|
+
:default,
|
282
|
+
:default,
|
283
|
+
:default,
|
284
|
+
:default,
|
285
|
+
:default,
|
286
|
+
:default,
|
287
|
+
:default,
|
288
|
+
:default,
|
289
|
+
:default,
|
290
|
+
:i32,
|
291
|
+
:i64,
|
292
|
+
:f32,
|
293
|
+
:f64,
|
294
|
+
:i32,
|
295
|
+
:i32,
|
296
|
+
:i32,
|
297
|
+
:i32,
|
298
|
+
:i64,
|
299
|
+
:i64,
|
300
|
+
:i64,
|
301
|
+
:i64,
|
302
|
+
:i64,
|
303
|
+
:i64,
|
304
|
+
:i32,
|
305
|
+
:i64,
|
306
|
+
:f32,
|
307
|
+
:f64,
|
308
|
+
:i32,
|
309
|
+
:i32,
|
310
|
+
:i64,
|
311
|
+
:i64,
|
312
|
+
:i64,
|
313
|
+
:default,
|
314
|
+
:default,
|
315
|
+
:i32,
|
316
|
+
:i64,
|
317
|
+
:f32,
|
318
|
+
:f64,
|
319
|
+
:i32,
|
320
|
+
:i32,
|
321
|
+
:i32,
|
322
|
+
:i32,
|
323
|
+
:i32,
|
324
|
+
:i32,
|
325
|
+
:i32,
|
326
|
+
:i32,
|
327
|
+
:i32,
|
328
|
+
:i32,
|
329
|
+
:i32,
|
330
|
+
:i64,
|
331
|
+
:i64,
|
332
|
+
:i64,
|
333
|
+
:i64,
|
334
|
+
:i64,
|
335
|
+
:i64,
|
336
|
+
:i64,
|
337
|
+
:i64,
|
338
|
+
:i64,
|
339
|
+
:i64,
|
340
|
+
:i64,
|
341
|
+
:f32,
|
342
|
+
:f32,
|
343
|
+
:f32,
|
344
|
+
:f32,
|
345
|
+
:f32,
|
346
|
+
:f32,
|
347
|
+
:f64,
|
348
|
+
:f64,
|
349
|
+
:f64,
|
350
|
+
:f64,
|
351
|
+
:f64,
|
352
|
+
:f64,
|
353
|
+
:i32,
|
354
|
+
:i32,
|
355
|
+
:i32,
|
356
|
+
:i32,
|
357
|
+
:i32,
|
358
|
+
:i32,
|
359
|
+
:i32,
|
360
|
+
:i32,
|
361
|
+
:i32,
|
362
|
+
:i32,
|
363
|
+
:i32,
|
364
|
+
:i32,
|
365
|
+
:i32,
|
366
|
+
:i32,
|
367
|
+
:i32,
|
368
|
+
:i32,
|
369
|
+
:i32,
|
370
|
+
:i32,
|
371
|
+
:i64,
|
372
|
+
:i64,
|
373
|
+
:i64,
|
374
|
+
:i64,
|
375
|
+
:i64,
|
376
|
+
:i64,
|
377
|
+
:i64,
|
378
|
+
:i64,
|
379
|
+
:i64,
|
380
|
+
:i64,
|
381
|
+
:i64,
|
382
|
+
:i64,
|
383
|
+
:i64,
|
384
|
+
:i64,
|
385
|
+
:i64,
|
386
|
+
:i64,
|
387
|
+
:i64,
|
388
|
+
:i64,
|
389
|
+
:f32,
|
390
|
+
:f32,
|
391
|
+
:f32,
|
392
|
+
:f32,
|
393
|
+
:f32,
|
394
|
+
:f32,
|
395
|
+
:f32,
|
396
|
+
:f32,
|
397
|
+
:f32,
|
398
|
+
:f32,
|
399
|
+
:f32,
|
400
|
+
:f32,
|
401
|
+
:f32,
|
402
|
+
:f32,
|
403
|
+
:f64,
|
404
|
+
:f64,
|
405
|
+
:f64,
|
406
|
+
:f64,
|
407
|
+
:f64,
|
408
|
+
:f64,
|
409
|
+
:f64,
|
410
|
+
:f64,
|
411
|
+
:f64,
|
412
|
+
:f64,
|
413
|
+
:f64,
|
414
|
+
:f64,
|
415
|
+
:f64,
|
416
|
+
:f64,
|
417
|
+
:convert,
|
418
|
+
:convert,
|
419
|
+
:convert,
|
420
|
+
:convert,
|
421
|
+
:convert,
|
422
|
+
:convert,
|
423
|
+
:convert,
|
424
|
+
:convert,
|
425
|
+
:convert,
|
426
|
+
:convert,
|
427
|
+
:convert,
|
428
|
+
:convert,
|
429
|
+
:convert,
|
430
|
+
:convert,
|
431
|
+
:convert,
|
432
|
+
:convert,
|
433
|
+
:convert,
|
434
|
+
:convert,
|
435
|
+
:convert,
|
436
|
+
:convert,
|
437
|
+
:convert,
|
438
|
+
:convert,
|
439
|
+
:convert,
|
440
|
+
:convert,
|
441
|
+
:convert,
|
442
|
+
:convert,
|
443
|
+
:convert,
|
444
|
+
:convert,
|
445
|
+
:convert,
|
446
|
+
:convert
|
447
|
+
] #: Array[Symbol]
|
61
448
|
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
449
|
+
FC_OPERANDS = [
|
450
|
+
:convert,
|
451
|
+
:convert,
|
452
|
+
:convert,
|
453
|
+
:convert,
|
454
|
+
:convert,
|
455
|
+
:convert,
|
456
|
+
:convert,
|
457
|
+
:convert
|
458
|
+
] #: Array[Symbol]
|
71
459
|
|
72
460
|
attr_accessor :namespace #: Symbol
|
73
461
|
|
@@ -78,6 +466,10 @@ module Wardite
|
|
78
466
|
|
79
467
|
attr_accessor :meta #: Hash[Symbol, Integer]
|
80
468
|
|
469
|
+
# $OP_COUNT = 0
|
470
|
+
# END {
|
471
|
+
# puts "Total opcodes: #{$OP_COUNT}"
|
472
|
+
# }
|
81
473
|
# @rbs namespace: Symbol
|
82
474
|
# @rbs code: Symbol
|
83
475
|
# @rbs operand: Array[operandItem]
|
@@ -86,61 +478,25 @@ module Wardite
|
|
86
478
|
@code = code
|
87
479
|
@operand = operand
|
88
480
|
@meta = {}
|
481
|
+
# $OP_COUNT += 1
|
89
482
|
end
|
90
483
|
|
91
|
-
# @rbs chr:
|
92
|
-
# @rbs return:
|
484
|
+
# @rbs chr: Integer
|
485
|
+
# @rbs return: Symbol
|
93
486
|
def self.to_sym(chr)
|
94
|
-
|
95
|
-
return [:fc, :fc]
|
96
|
-
end
|
97
|
-
|
98
|
-
code = table[chr.ord]
|
99
|
-
if ! code
|
100
|
-
raise "found unknown code 0x#{chr.ord.to_s(16)}"
|
101
|
-
end
|
102
|
-
# opcodes equal to or larger than are "convert" ops
|
103
|
-
if chr.ord >= 0xa7
|
104
|
-
return [:convert, code]
|
105
|
-
end
|
106
|
-
|
107
|
-
prefix = code.to_s.split("_")[0]
|
108
|
-
case prefix
|
109
|
-
when "i32", "i64", "f32", "f64"
|
110
|
-
[prefix.to_sym, code]
|
111
|
-
else
|
112
|
-
[:default, code]
|
113
|
-
end
|
487
|
+
return SYMS[chr]
|
114
488
|
end
|
115
489
|
|
116
490
|
# @rbs lower: Integer
|
117
|
-
# @rbs return:
|
491
|
+
# @rbs return: Symbol
|
118
492
|
def self.resolve_fc_sym(lower)
|
119
|
-
|
120
|
-
return [:fc, :fc]
|
121
|
-
end
|
122
|
-
|
123
|
-
code = fc_table[lower]
|
124
|
-
if ! code
|
125
|
-
raise "found unknown code 0xfc 0x#{lower.to_s(16)}"
|
126
|
-
end
|
127
|
-
|
128
|
-
prefix = code.to_s.split("_")[0]
|
129
|
-
case prefix
|
130
|
-
when "i32", "i64", "f32", "f64"
|
131
|
-
# All FC operations for numeric are "convert"
|
132
|
-
[:convert, code]
|
133
|
-
else
|
134
|
-
[:default, code]
|
135
|
-
end
|
493
|
+
FC_SYMS[lower] || raise("found unknown code 0xfc 0x#{lower.to_s(16)}")
|
136
494
|
end
|
137
495
|
|
138
496
|
# @rbs code: Symbol
|
139
497
|
# @rbs return: Array[Symbol]
|
140
498
|
def self.operand_of(code)
|
141
499
|
case code
|
142
|
-
when /load/, /store/
|
143
|
-
[:u32, :u32]
|
144
500
|
when :local_get, :local_set, :local_tee, :global_get, :global_set, :call, :br, :br_if
|
145
501
|
[:u32]
|
146
502
|
when :memory_init, :memory_copy
|
@@ -161,6 +517,10 @@ module Wardite
|
|
161
517
|
[:f64]
|
162
518
|
when :if, :block, :loop
|
163
519
|
[:u8_block]
|
520
|
+
when :i32_load, :i64_load, :f32_load, :f64_load, :i32_load8_s, :i32_load8_u, :i32_load16_s, :i32_load16_u,
|
521
|
+
:i64_load8_s, :i64_load8_u, :i64_load16_s, :i64_load16_u, :i64_load32_s, :i64_load32_u, :i32_store, :i64_store,
|
522
|
+
:f32_store, :f64_store, :i32_store8, :i32_store16, :i64_store8, :i64_store16, :i64_store32
|
523
|
+
[:u32, :u32]
|
164
524
|
else
|
165
525
|
[]
|
166
526
|
end
|
data/lib/wardite/leb128.rb
CHANGED
@@ -8,10 +8,9 @@ module Wardite
|
|
8
8
|
dest = 0
|
9
9
|
level = 0
|
10
10
|
while b = buf.read(1)
|
11
|
-
|
12
|
-
raise LoadError, "buffer too short"
|
13
|
-
end
|
11
|
+
raise LoadError, "buffer too short" unless b
|
14
12
|
c = b.ord
|
13
|
+
return c if c < 0x80 && level.zero?
|
15
14
|
|
16
15
|
upper, lower = (c >> 7), (c & (1 << 7) - 1)
|
17
16
|
dest |= lower << (7 * level)
|
@@ -34,9 +33,7 @@ module Wardite
|
|
34
33
|
dest = 0
|
35
34
|
level = 0
|
36
35
|
while b = buf.read(1)
|
37
|
-
|
38
|
-
raise LoadError, "buffer too short"
|
39
|
-
end
|
36
|
+
raise LoadError, "buffer too short" unless b
|
40
37
|
c = b.ord
|
41
38
|
|
42
39
|
upper, lower = (c >> 7), (c & (1 << 7) - 1)
|