1use crate::{
2 config::Config,
3 execution::interpreter_loop::{
4 control, fc_extensions, fd_extensions, memory, numeric, parametric, reference, table,
5 unset, variable, vector, InstructionHandlerFn,
6 },
7};
8
9pub(crate) trait HasBaseDispatchTable {
10 const DISPATCH_TABLE: [InstructionHandlerFn; 256];
11}
12
13pub(crate) trait HasFcDispatchTable {
14 const FC_DISPATCH_TABLE: [InstructionHandlerFn; 18];
15}
16
17pub(crate) trait HasFdDispatchTable {
18 const FD_DISPATCH_TABLE: [InstructionHandlerFn; 256];
19}
20
21impl<T: Config> HasBaseDispatchTable for T {
22 const DISPATCH_TABLE: [InstructionHandlerFn; 256] = [
23 control::unreachable::<T>,
24 control::nop::<T>,
25 control::block::<T>,
26 control::r#loop::<T>,
27 control::r#if::<T>,
28 control::r#else::<T>,
29 unset::<T>,
30 unset::<T>,
31 unset::<T>,
32 unset::<T>,
33 unset::<T>,
34 control::end::<T>,
35 control::br::<T>,
36 control::br_if::<T>,
37 control::br_table::<T>,
38 control::r#return::<T>,
39 control::call::<T>,
40 control::call_indirect::<T>,
41 unset::<T>,
42 unset::<T>,
43 unset::<T>,
44 unset::<T>,
45 unset::<T>,
46 unset::<T>,
47 unset::<T>,
48 unset::<T>,
49 parametric::drop::<T>,
50 parametric::select::<T>,
51 parametric::select_t::<T>,
52 unset::<T>,
53 unset::<T>,
54 unset::<T>,
55 variable::local_get::<T>,
56 variable::local_set::<T>,
57 variable::local_tee::<T>,
58 variable::global_get::<T>,
59 variable::global_set::<T>,
60 table::table_get::<T>,
61 table::table_set::<T>,
62 unset::<T>,
63 memory::i32_load::<T>,
64 memory::i64_load::<T>,
65 memory::f32_load::<T>,
66 memory::f64_load::<T>,
67 memory::i32_load8_s::<T>,
68 memory::i32_load8_u::<T>,
69 memory::i32_load16_s::<T>,
70 memory::i32_load16_u::<T>,
71 memory::i64_load8_s::<T>,
72 memory::i64_load8_u::<T>,
73 memory::i64_load16_s::<T>,
74 memory::i64_load16_u::<T>,
75 memory::i64_load32_s::<T>,
76 memory::i64_load32_u::<T>,
77 memory::i32_store::<T>,
78 memory::i64_store::<T>,
79 memory::f32_store::<T>,
80 memory::f64_store::<T>,
81 memory::i32_store8::<T>,
82 memory::i32_store16::<T>,
83 memory::i64_store8::<T>,
84 memory::i64_store16::<T>,
85 memory::i64_store32::<T>,
86 memory::memory_size::<T>,
87 memory::memory_grow::<T>,
88 numeric::i32_const::<T>,
89 numeric::i64_const::<T>,
90 numeric::f32_const::<T>,
91 numeric::f64_const::<T>,
92 numeric::i32_eqz::<T>,
93 numeric::i32_eq::<T>,
94 numeric::i32_ne::<T>,
95 numeric::i32_lt_s::<T>,
96 numeric::i32_lt_u::<T>,
97 numeric::i32_gt_s::<T>,
98 numeric::i32_gt_u::<T>,
99 numeric::i32_le_s::<T>,
100 numeric::i32_le_u::<T>,
101 numeric::i32_ge_s::<T>,
102 numeric::i32_ge_u::<T>,
103 numeric::i64_eqz::<T>,
104 numeric::i64_eq::<T>,
105 numeric::i64_ne::<T>,
106 numeric::i64_lt_s::<T>,
107 numeric::i64_lt_u::<T>,
108 numeric::i64_gt_s::<T>,
109 numeric::i64_gt_u::<T>,
110 numeric::i64_le_s::<T>,
111 numeric::i64_le_u::<T>,
112 numeric::i64_ge_s::<T>,
113 numeric::i64_ge_u::<T>,
114 numeric::f32_eq::<T>,
115 numeric::f32_ne::<T>,
116 numeric::f32_lt::<T>,
117 numeric::f32_gt::<T>,
118 numeric::f32_le::<T>,
119 numeric::f32_ge::<T>,
120 numeric::f64_eq::<T>,
121 numeric::f64_ne::<T>,
122 numeric::f64_lt::<T>,
123 numeric::f64_gt::<T>,
124 numeric::f64_le::<T>,
125 numeric::f64_ge::<T>,
126 numeric::i32_clz::<T>,
127 numeric::i32_ctz::<T>,
128 numeric::i32_popcnt::<T>,
129 numeric::i32_add::<T>,
130 numeric::i32_sub::<T>,
131 numeric::i32_mul::<T>,
132 numeric::i32_div_s::<T>,
133 numeric::i32_div_u::<T>,
134 numeric::i32_rem_s::<T>,
135 numeric::i32_rem_u::<T>,
136 numeric::i32_and::<T>,
137 numeric::i32_or::<T>,
138 numeric::i32_xor::<T>,
139 numeric::i32_shl::<T>,
140 numeric::i32_shr_s::<T>,
141 numeric::i32_shr_u::<T>,
142 numeric::i32_rotl::<T>,
143 numeric::i32_rotr::<T>,
144 numeric::i64_clz::<T>,
145 numeric::i64_ctz::<T>,
146 numeric::i64_popcnt::<T>,
147 numeric::i64_add::<T>,
148 numeric::i64_sub::<T>,
149 numeric::i64_mul::<T>,
150 numeric::i64_div_s::<T>,
151 numeric::i64_div_u::<T>,
152 numeric::i64_rem_s::<T>,
153 numeric::i64_rem_u::<T>,
154 numeric::i64_and::<T>,
155 numeric::i64_or::<T>,
156 numeric::i64_xor::<T>,
157 numeric::i64_shl::<T>,
158 numeric::i64_shr_s::<T>,
159 numeric::i64_shr_u::<T>,
160 numeric::i64_rotl::<T>,
161 numeric::i64_rotr::<T>,
162 numeric::f32_abs::<T>,
163 numeric::f32_neg::<T>,
164 numeric::f32_ceil::<T>,
165 numeric::f32_floor::<T>,
166 numeric::f32_trunc::<T>,
167 numeric::f32_nearest::<T>,
168 numeric::f32_sqrt::<T>,
169 numeric::f32_add::<T>,
170 numeric::f32_sub::<T>,
171 numeric::f32_mul::<T>,
172 numeric::f32_div::<T>,
173 numeric::f32_min::<T>,
174 numeric::f32_max::<T>,
175 numeric::f32_copysign::<T>,
176 numeric::f64_abs::<T>,
177 numeric::f64_neg::<T>,
178 numeric::f64_ceil::<T>,
179 numeric::f64_floor::<T>,
180 numeric::f64_trunc::<T>,
181 numeric::f64_nearest::<T>,
182 numeric::f64_sqrt::<T>,
183 numeric::f64_add::<T>,
184 numeric::f64_sub::<T>,
185 numeric::f64_mul::<T>,
186 numeric::f64_div::<T>,
187 numeric::f64_min::<T>,
188 numeric::f64_max::<T>,
189 numeric::f64_copysign::<T>,
190 numeric::i32_wrap_i64::<T>,
191 numeric::i32_trunc_f32_s::<T>,
192 numeric::i32_trunc_f32_u::<T>,
193 numeric::i32_trunc_f64_s::<T>,
194 numeric::i32_trunc_f64_u::<T>,
195 numeric::i64_extend_i32_s::<T>,
196 numeric::i64_extend_i32_u::<T>,
197 numeric::i64_trunc_f32_s::<T>,
198 numeric::i64_trunc_f32_u::<T>,
199 numeric::i64_trunc_f64_s::<T>,
200 numeric::i64_trunc_f64_u::<T>,
201 numeric::f32_convert_i32_s::<T>,
202 numeric::f32_convert_i32_u::<T>,
203 numeric::f32_convert_i64_s::<T>,
204 numeric::f32_convert_i64_u::<T>,
205 numeric::f32_demote_f64::<T>,
206 numeric::f64_convert_i32_s::<T>,
207 numeric::f64_convert_i32_u::<T>,
208 numeric::f64_convert_i64_s::<T>,
209 numeric::f64_convert_i64_u::<T>,
210 numeric::f64_promote_f32::<T>,
211 numeric::i32_reinterpret_f32::<T>,
212 numeric::i64_reinterpret_f64::<T>,
213 numeric::f32_reinterpret_i32::<T>,
214 numeric::f64_reinterpret_i64::<T>,
215 numeric::i32_extend8_s::<T>,
216 numeric::i32_extend16_s::<T>,
217 numeric::i64_extend8_s::<T>,
218 numeric::i64_extend16_s::<T>,
219 numeric::i64_extend32_s::<T>,
220 unset::<T>,
221 unset::<T>,
222 unset::<T>,
223 unset::<T>,
224 unset::<T>,
225 unset::<T>,
226 unset::<T>,
227 unset::<T>,
228 unset::<T>,
229 unset::<T>,
230 unset::<T>,
231 reference::ref_null::<T>,
232 reference::ref_is_null::<T>,
233 reference::ref_func::<T>,
234 unset::<T>,
235 unset::<T>,
236 unset::<T>,
237 unset::<T>,
238 unset::<T>,
239 unset::<T>,
240 unset::<T>,
241 unset::<T>,
242 unset::<T>,
243 unset::<T>,
244 unset::<T>,
245 unset::<T>,
246 unset::<T>,
247 unset::<T>,
248 unset::<T>,
249 unset::<T>,
250 unset::<T>,
251 unset::<T>,
252 unset::<T>,
253 unset::<T>,
254 unset::<T>,
255 unset::<T>,
256 unset::<T>,
257 unset::<T>,
258 unset::<T>,
259 unset::<T>,
260 unset::<T>,
261 unset::<T>,
262 unset::<T>,
263 unset::<T>,
264 unset::<T>,
265 unset::<T>,
266 unset::<T>,
267 unset::<T>,
268 unset::<T>,
269 unset::<T>,
270 unset::<T>,
271 unset::<T>,
272 unset::<T>,
273 unset::<T>,
274 unset::<T>,
275 fc_extensions::<T>,
276 fd_extensions::<T>,
277 unset::<T>,
278 unset::<T>,
279 ];
280}
281
282impl<T: Config> HasFcDispatchTable for T {
283 const FC_DISPATCH_TABLE: [InstructionHandlerFn; 18] = [
284 numeric::i32_trunc_sat_f32_s::<T>,
285 numeric::i32_trunc_sat_f32_u::<T>,
286 numeric::i32_trunc_sat_f64_s::<T>,
287 numeric::i32_trunc_sat_f64_u::<T>,
288 numeric::i64_trunc_sat_f32_s::<T>,
289 numeric::i64_trunc_sat_f32_u::<T>,
290 numeric::i64_trunc_sat_f64_s::<T>,
291 numeric::i64_trunc_sat_f64_u::<T>,
292 memory::memory_init_fn::<T>,
293 memory::data_drop_fn::<T>,
294 memory::memory_copy::<T>,
295 memory::memory_fill::<T>,
296 table::table_init_fn::<T>,
297 table::elem_drop_fn::<T>,
298 table::table_copy::<T>,
299 table::table_grow::<T>,
300 table::table_size::<T>,
301 table::table_fill::<T>,
302 ];
303}
304
305impl<T: Config> HasFdDispatchTable for T {
306 const FD_DISPATCH_TABLE: [InstructionHandlerFn; 256] = [
307 memory::v128_load::<T>,
308 memory::v128_load8x8_s::<T>,
309 memory::v128_load8x8_u::<T>,
310 memory::v128_load16x4_s::<T>,
311 memory::v128_load16x4_u::<T>,
312 memory::v128_load32x2_s::<T>,
313 memory::v128_load32x2_u::<T>,
314 memory::v128_load8_splat::<T>,
315 memory::v128_load16_splat::<T>,
316 memory::v128_load32_splat::<T>,
317 memory::v128_load64_splat::<T>,
318 memory::v128_store::<T>,
319 vector::v128_const::<T>,
320 vector::i8x16_shuffle::<T>,
321 vector::i8x16_swizzle::<T>,
322 vector::i8x16_splat::<T>,
323 vector::i16x8_splat::<T>,
324 vector::i32x4_splat::<T>,
325 vector::i64x2_splat::<T>,
326 vector::f32x4_splat::<T>,
327 vector::f64x2_splat::<T>,
328 vector::i8x16_extract_lane_s::<T>,
329 vector::i8x16_extract_lane_u::<T>,
330 vector::i8x16_replace_lane::<T>,
331 vector::i16x8_extract_lane_s::<T>,
332 vector::i16x8_extract_lane_u::<T>,
333 vector::i16x8_replace_lane::<T>,
334 vector::i32x4_extract_lane::<T>,
335 vector::i32x4_replace_lane::<T>,
336 vector::i64x2_extract_lane::<T>,
337 vector::i64x2_replace_lane::<T>,
338 vector::f32x4_extract_lane::<T>,
339 vector::f32x4_replace_lane::<T>,
340 vector::f64x2_extract_lane::<T>,
341 vector::f64x2_replace_lane::<T>,
342 vector::i8x16_eq::<T>,
344 vector::i8x16_ne::<T>,
345 vector::i8x16_lt_s::<T>,
346 vector::i8x16_lt_u::<T>,
347 vector::i8x16_gt_s::<T>,
348 vector::i8x16_gt_u::<T>,
349 vector::i8x16_le_s::<T>,
350 vector::i8x16_le_u::<T>,
351 vector::i8x16_ge_s::<T>,
352 vector::i8x16_ge_u::<T>,
353 vector::i16x8_eq::<T>,
355 vector::i16x8_ne::<T>,
356 vector::i16x8_lt_s::<T>,
357 vector::i16x8_lt_u::<T>,
358 vector::i16x8_gt_s::<T>,
359 vector::i16x8_gt_u::<T>,
360 vector::i16x8_le_s::<T>,
361 vector::i16x8_le_u::<T>,
362 vector::i16x8_ge_s::<T>,
363 vector::i16x8_ge_u::<T>,
364 vector::i32x4_eq::<T>,
366 vector::i32x4_ne::<T>,
367 vector::i32x4_lt_s::<T>,
368 vector::i32x4_lt_u::<T>,
369 vector::i32x4_gt_s::<T>,
370 vector::i32x4_gt_u::<T>,
371 vector::i32x4_le_s::<T>,
372 vector::i32x4_le_u::<T>,
373 vector::i32x4_ge_s::<T>,
374 vector::i32x4_ge_u::<T>,
375 vector::f32x4_eq::<T>,
377 vector::f32x4_ne::<T>,
378 vector::f32x4_lt::<T>,
379 vector::f32x4_gt::<T>,
380 vector::f32x4_le::<T>,
381 vector::f32x4_ge::<T>,
382 vector::f64x2_eq::<T>,
384 vector::f64x2_ne::<T>,
385 vector::f64x2_lt::<T>,
386 vector::f64x2_gt::<T>,
387 vector::f64x2_le::<T>,
388 vector::f64x2_ge::<T>,
389 vector::v128_not::<T>,
391 vector::v128_and::<T>,
392 vector::v128_andnot::<T>,
393 vector::v128_or::<T>,
394 vector::v128_xor::<T>,
395 vector::v128_bitselect::<T>,
396 vector::v128_any_true::<T>,
397 memory::v128_load8_lane::<T>,
399 memory::v128_load16_lane::<T>,
400 memory::v128_load32_lane::<T>,
401 memory::v128_load64_lane::<T>,
402 memory::v128_store8_lane::<T>,
403 memory::v128_store16_lane::<T>,
404 memory::v128_store32_lane::<T>,
405 memory::v128_store64_lane::<T>,
406 memory::v128_load32_zero::<T>,
407 memory::v128_load64_zero::<T>,
408 vector::f32x4_demote_f64x2_zero::<T>,
410 vector::f64x2_promote_low_f32x4::<T>,
411 vector::i8x16_abs::<T>,
413 vector::i8x16_neg::<T>,
414 vector::i8x16_popcnt::<T>,
415 vector::i8x16_all_true::<T>,
416 vector::i8x16_bitmask::<T>,
417 vector::i8x16_narrow_i16x8_s::<T>,
418 vector::i8x16_narrow_i16x8_u::<T>,
419 vector::f32x4_ceil::<T>,
421 vector::f32x4_floor::<T>,
422 vector::f32x4_trunc::<T>,
423 vector::f32x4_nearest::<T>,
424 vector::i8x16_shl::<T>,
426 vector::i8x16_shr_s::<T>,
427 vector::i8x16_shr_u::<T>,
428 vector::i8x16_add::<T>,
429 vector::i8x16_add_sat_s::<T>,
430 vector::i8x16_add_sat_u::<T>,
431 vector::i8x16_sub::<T>,
432 vector::i8x16_sub_sat_s::<T>,
433 vector::i8x16_sub_sat_u::<T>,
434 vector::f64x2_ceil::<T>,
436 vector::f64x2_floor::<T>,
437 vector::i8x16_min_s::<T>,
439 vector::i8x16_min_u::<T>,
440 vector::i8x16_max_s::<T>,
441 vector::i8x16_max_u::<T>,
442 vector::f64x2_trunc::<T>,
444 vector::i8x16_avgr_u::<T>,
446 vector::i16x8_extadd_pairwise_i8x16_s::<T>,
448 vector::i16x8_extadd_pairwise_i8x16_u::<T>,
449 vector::i32x4_extadd_pairwise_i16x8_s::<T>,
451 vector::i32x4_extadd_pairwise_i16x8_u::<T>,
452 vector::i16x8_abs::<T>,
454 vector::i16x8_neg::<T>,
455 vector::i16x8_q15mulrsat_s::<T>,
456 vector::i16x8_all_true::<T>,
457 vector::i16x8_bitmask::<T>,
458 vector::i16x8_narrow_i32x4_s::<T>,
459 vector::i16x8_narrow_i32x4_u::<T>,
460 vector::i16x8_extend_low_i8x16_s::<T>,
461 vector::i16x8_extend_high_i8x16_s::<T>,
462 vector::i16x8_extend_low_i8x16_u::<T>,
463 vector::i16x8_extend_high_i8x16_u::<T>,
464 vector::i16x8_shl::<T>,
465 vector::i16x8_shr_s::<T>,
466 vector::i16x8_shr_u::<T>,
467 vector::i16x8_add::<T>,
468 vector::i16x8_add_sat_s::<T>,
469 vector::i16x8_add_sat_u::<T>,
470 vector::i16x8_sub::<T>,
471 vector::i16x8_sub_sat_s::<T>,
472 vector::i16x8_sub_sat_u::<T>,
473 vector::f64x2_nearest::<T>,
475 vector::i16x8_mul::<T>,
477 vector::i16x8_min_s::<T>,
478 vector::i16x8_min_u::<T>,
479 vector::i16x8_max_s::<T>,
480 vector::i16x8_max_u::<T>,
481 unset::<T>,
483 vector::i16x8_avgr_u::<T>,
485 vector::i16x8_extmul_low_i8x16_s::<T>,
486 vector::i16x8_extmul_high_i8x16_s::<T>,
487 vector::i16x8_extmul_low_i8x16_u::<T>,
488 vector::i16x8_extmul_high_i8x16_u::<T>,
489 vector::i32x4_abs::<T>,
491 vector::i32x4_neg::<T>,
492 unset::<T>,
494 vector::i32x4_all_true::<T>,
496 vector::i32x4_bitmask::<T>,
497 unset::<T>,
499 unset::<T>,
500 vector::i32x4_extend_low_i16x8_s::<T>,
502 vector::i32x4_extend_high_i16x8_s::<T>,
503 vector::i32x4_extend_low_i16x8_u::<T>,
504 vector::i32x4_extend_high_i16x8_u::<T>,
505 vector::i32x4_shl::<T>,
506 vector::i32x4_shr_s::<T>,
507 vector::i32x4_shr_u::<T>,
508 vector::i32x4_add::<T>,
509 unset::<T>,
511 unset::<T>,
512 vector::i32x4_sub::<T>,
514 unset::<T>,
516 unset::<T>,
517 unset::<T>,
518 vector::i32x4_mul::<T>,
520 vector::i32x4_min_s::<T>,
521 vector::i32x4_min_u::<T>,
522 vector::i32x4_max_s::<T>,
523 vector::i32x4_max_u::<T>,
524 vector::i32x4_dot_i16x8_s::<T>,
525 unset::<T>,
527 vector::i32x4_extmul_low_i16x8_s::<T>,
529 vector::i32x4_extmul_high_i16x8_s::<T>,
530 vector::i32x4_extmul_low_i16x8_u::<T>,
531 vector::i32x4_extmul_high_i16x8_u::<T>,
532 vector::i64x2_abs::<T>,
534 vector::i64x2_neg::<T>,
535 unset::<T>,
537 vector::i64x2_all_true::<T>,
539 vector::i64x2_bitmask::<T>,
540 unset::<T>,
542 unset::<T>,
543 vector::i64x2_extend_low_i32x4_s::<T>,
545 vector::i64x2_extend_high_i32x4_s::<T>,
546 vector::i64x2_extend_low_i32x4_u::<T>,
547 vector::i64x2_extend_high_i32x4_u::<T>,
548 vector::i64x2_shl::<T>,
549 vector::i64x2_shr_s::<T>,
550 vector::i64x2_shr_u::<T>,
551 vector::i64x2_add::<T>,
552 unset::<T>,
554 unset::<T>,
555 vector::i64x2_sub::<T>,
557 unset::<T>,
559 unset::<T>,
560 unset::<T>,
561 vector::i64x2_mul::<T>,
563 vector::i64x2_eq::<T>,
565 vector::i64x2_ne::<T>,
566 vector::i64x2_lt_s::<T>,
567 vector::i64x2_gt_s::<T>,
568 vector::i64x2_le_s::<T>,
569 vector::i64x2_ge_s::<T>,
570 vector::i64x2_extmul_low_i32x4_s::<T>,
572 vector::i64x2_extmul_high_i32x4_s::<T>,
573 vector::i64x2_extmul_low_i32x4_u::<T>,
574 vector::i64x2_extmul_high_i32x4_u::<T>,
575 vector::f32x4_abs::<T>,
577 vector::f32x4_neg::<T>,
578 unset::<T>,
580 vector::f32x4_sqrt::<T>,
582 vector::f32x4_add::<T>,
583 vector::f32x4_sub::<T>,
584 vector::f32x4_mul::<T>,
585 vector::f32x4_div::<T>,
586 vector::f32x4_min::<T>,
587 vector::f32x4_max::<T>,
588 vector::f32x4_pmin::<T>,
589 vector::f32x4_pmax::<T>,
590 vector::f64x2_abs::<T>,
592 vector::f64x2_neg::<T>,
593 unset::<T>,
595 vector::f64x2_sqrt::<T>,
597 vector::f64x2_add::<T>,
598 vector::f64x2_sub::<T>,
599 vector::f64x2_mul::<T>,
600 vector::f64x2_div::<T>,
601 vector::f64x2_min::<T>,
602 vector::f64x2_max::<T>,
603 vector::f64x2_pmin::<T>,
604 vector::f64x2_pmax::<T>,
605 vector::i32x4_trunc_sat_f32x4_s::<T>,
607 vector::i32x4_trunc_sat_f32x4_u::<T>,
608 vector::f32x4_convert_i32x4_s::<T>,
610 vector::f32x4_convert_i32x4_u::<T>,
611 vector::i32x4_trunc_sat_f64x2_s_zero::<T>,
613 vector::i32x4_trunc_sat_f64x2_u_zero::<T>,
614 vector::f64x2_convert_low_i32x4_s::<T>,
616 vector::f64x2_convert_low_i32x4_u::<T>,
617 ];
619}