wasm/execution/interpreter_loop/
dispatch_tables.rs

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        // 35
343        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        // 45
354        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        // 55
365        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        // 65
376        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        // 71
383        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        // 77
390        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        // 84
398        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        // 94
409        vector::f32x4_demote_f64x2_zero::<T>,
410        vector::f64x2_promote_low_f32x4::<T>,
411        // 96
412        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        // 103
420        vector::f32x4_ceil::<T>,
421        vector::f32x4_floor::<T>,
422        vector::f32x4_trunc::<T>,
423        vector::f32x4_nearest::<T>,
424        // 107
425        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        // 116
435        vector::f64x2_ceil::<T>,
436        vector::f64x2_floor::<T>,
437        // 118
438        vector::i8x16_min_s::<T>,
439        vector::i8x16_min_u::<T>,
440        vector::i8x16_max_s::<T>,
441        vector::i8x16_max_u::<T>,
442        // 122
443        vector::f64x2_trunc::<T>,
444        // 123
445        vector::i8x16_avgr_u::<T>,
446        // 124
447        vector::i16x8_extadd_pairwise_i8x16_s::<T>,
448        vector::i16x8_extadd_pairwise_i8x16_u::<T>,
449        // 126
450        vector::i32x4_extadd_pairwise_i16x8_s::<T>,
451        vector::i32x4_extadd_pairwise_i16x8_u::<T>,
452        // 128
453        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        // 148
474        vector::f64x2_nearest::<T>,
475        // 149
476        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        // 154
482        unset::<T>,
483        // 155
484        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        // 160
490        vector::i32x4_abs::<T>,
491        vector::i32x4_neg::<T>,
492        // 162
493        unset::<T>,
494        // 163
495        vector::i32x4_all_true::<T>,
496        vector::i32x4_bitmask::<T>,
497        // 165,
498        unset::<T>,
499        unset::<T>,
500        // 167
501        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        // 175
510        unset::<T>,
511        unset::<T>,
512        // 177
513        vector::i32x4_sub::<T>,
514        // 178
515        unset::<T>,
516        unset::<T>,
517        unset::<T>,
518        // 181
519        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        // 187
526        unset::<T>,
527        // 188
528        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        // 192
533        vector::i64x2_abs::<T>,
534        vector::i64x2_neg::<T>,
535        // 194
536        unset::<T>,
537        // 195
538        vector::i64x2_all_true::<T>,
539        vector::i64x2_bitmask::<T>,
540        // 197
541        unset::<T>,
542        unset::<T>,
543        // 199
544        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        // 207
553        unset::<T>,
554        unset::<T>,
555        // 209
556        vector::i64x2_sub::<T>,
557        // 210
558        unset::<T>,
559        unset::<T>,
560        unset::<T>,
561        // 213
562        vector::i64x2_mul::<T>,
563        // 214
564        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        // 220
571        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        // 224
576        vector::f32x4_abs::<T>,
577        vector::f32x4_neg::<T>,
578        // 226
579        unset::<T>,
580        // 227
581        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        // 236
591        vector::f64x2_abs::<T>,
592        vector::f64x2_neg::<T>,
593        // 238
594        unset::<T>,
595        // 239
596        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        // 248
606        vector::i32x4_trunc_sat_f32x4_s::<T>,
607        vector::i32x4_trunc_sat_f32x4_u::<T>,
608        // 250
609        vector::f32x4_convert_i32x4_s::<T>,
610        vector::f32x4_convert_i32x4_u::<T>,
611        // 252
612        vector::i32x4_trunc_sat_f64x2_s_zero::<T>,
613        vector::i32x4_trunc_sat_f64x2_u_zero::<T>,
614        // 254
615        vector::f64x2_convert_low_i32x4_s::<T>,
616        vector::f64x2_convert_low_i32x4_u::<T>,
617        // todo
618    ];
619}