1 /* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*-
2  * vim: set ts=8 sts=2 et sw=2 tw=80:
3  *
4  * Copyright 2015 Mozilla Foundation
5  *
6  * Licensed under the Apache License, Version 2.0 (the "License");
7  * you may not use this file except in compliance with the License.
8  * You may obtain a copy of the License at
9  *
10  *     http://www.apache.org/licenses/LICENSE-2.0
11  *
12  * Unless required by applicable law or agreed to in writing, software
13  * distributed under the License is distributed on an "AS IS" BASIS,
14  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15  * See the License for the specific language governing permissions and
16  * limitations under the License.
17  */
18 
19 #include "wasm/WasmOpIter.h"
20 
21 using namespace js;
22 using namespace js::jit;
23 using namespace js::wasm;
24 
25 #ifdef ENABLE_WASM_GC
26 #  ifndef ENABLE_WASM_FUNCTION_REFERENCES
27 #    error "GC types require the function-references feature"
28 #  endif
29 #endif
30 
31 #ifdef DEBUG
32 
33 #  ifdef ENABLE_WASM_FUNCTION_REFERENCES
34 #    define WASM_FUNCTION_REFERENCES_OP(code) return code
35 #  else
36 #    define WASM_FUNCTION_REFERENCES_OP(code) break
37 #  endif
38 #  ifdef ENABLE_WASM_GC
39 #    define WASM_GC_OP(code) return code
40 #  else
41 #    define WASM_GC_OP(code) break
42 #  endif
43 #  ifdef ENABLE_WASM_SIMD
44 #    define WASM_SIMD_OP(code) return code
45 #  else
46 #    define WASM_SIMD_OP(code) break
47 #  endif
48 #  ifdef ENABLE_WASM_EXCEPTIONS
49 #    define WASM_EXN_OP(code) return code
50 #  else
51 #    define WASM_EXN_OP(code) break
52 #  endif
53 
Classify(OpBytes op)54 OpKind wasm::Classify(OpBytes op) {
55   switch (Op(op.b0)) {
56     case Op::Block:
57       return OpKind::Block;
58     case Op::Loop:
59       return OpKind::Loop;
60     case Op::Unreachable:
61       return OpKind::Unreachable;
62     case Op::Drop:
63       return OpKind::Drop;
64     case Op::I32Const:
65       return OpKind::I32;
66     case Op::I64Const:
67       return OpKind::I64;
68     case Op::F32Const:
69       return OpKind::F32;
70     case Op::F64Const:
71       return OpKind::F64;
72     case Op::Br:
73       return OpKind::Br;
74     case Op::BrIf:
75       return OpKind::BrIf;
76     case Op::BrTable:
77       return OpKind::BrTable;
78     case Op::Nop:
79       return OpKind::Nop;
80     case Op::I32Clz:
81     case Op::I32Ctz:
82     case Op::I32Popcnt:
83     case Op::I64Clz:
84     case Op::I64Ctz:
85     case Op::I64Popcnt:
86     case Op::F32Abs:
87     case Op::F32Neg:
88     case Op::F32Ceil:
89     case Op::F32Floor:
90     case Op::F32Trunc:
91     case Op::F32Nearest:
92     case Op::F32Sqrt:
93     case Op::F64Abs:
94     case Op::F64Neg:
95     case Op::F64Ceil:
96     case Op::F64Floor:
97     case Op::F64Trunc:
98     case Op::F64Nearest:
99     case Op::F64Sqrt:
100       return OpKind::Unary;
101     case Op::I32Add:
102     case Op::I32Sub:
103     case Op::I32Mul:
104     case Op::I32DivS:
105     case Op::I32DivU:
106     case Op::I32RemS:
107     case Op::I32RemU:
108     case Op::I32And:
109     case Op::I32Or:
110     case Op::I32Xor:
111     case Op::I32Shl:
112     case Op::I32ShrS:
113     case Op::I32ShrU:
114     case Op::I32Rotl:
115     case Op::I32Rotr:
116     case Op::I64Add:
117     case Op::I64Sub:
118     case Op::I64Mul:
119     case Op::I64DivS:
120     case Op::I64DivU:
121     case Op::I64RemS:
122     case Op::I64RemU:
123     case Op::I64And:
124     case Op::I64Or:
125     case Op::I64Xor:
126     case Op::I64Shl:
127     case Op::I64ShrS:
128     case Op::I64ShrU:
129     case Op::I64Rotl:
130     case Op::I64Rotr:
131     case Op::F32Add:
132     case Op::F32Sub:
133     case Op::F32Mul:
134     case Op::F32Div:
135     case Op::F32Min:
136     case Op::F32Max:
137     case Op::F32CopySign:
138     case Op::F64Add:
139     case Op::F64Sub:
140     case Op::F64Mul:
141     case Op::F64Div:
142     case Op::F64Min:
143     case Op::F64Max:
144     case Op::F64CopySign:
145       return OpKind::Binary;
146     case Op::I32Eq:
147     case Op::I32Ne:
148     case Op::I32LtS:
149     case Op::I32LtU:
150     case Op::I32LeS:
151     case Op::I32LeU:
152     case Op::I32GtS:
153     case Op::I32GtU:
154     case Op::I32GeS:
155     case Op::I32GeU:
156     case Op::I64Eq:
157     case Op::I64Ne:
158     case Op::I64LtS:
159     case Op::I64LtU:
160     case Op::I64LeS:
161     case Op::I64LeU:
162     case Op::I64GtS:
163     case Op::I64GtU:
164     case Op::I64GeS:
165     case Op::I64GeU:
166     case Op::F32Eq:
167     case Op::F32Ne:
168     case Op::F32Lt:
169     case Op::F32Le:
170     case Op::F32Gt:
171     case Op::F32Ge:
172     case Op::F64Eq:
173     case Op::F64Ne:
174     case Op::F64Lt:
175     case Op::F64Le:
176     case Op::F64Gt:
177     case Op::F64Ge:
178       return OpKind::Comparison;
179     case Op::I32Eqz:
180     case Op::I32WrapI64:
181     case Op::I32TruncSF32:
182     case Op::I32TruncUF32:
183     case Op::I32ReinterpretF32:
184     case Op::I32TruncSF64:
185     case Op::I32TruncUF64:
186     case Op::I64ExtendSI32:
187     case Op::I64ExtendUI32:
188     case Op::I64TruncSF32:
189     case Op::I64TruncUF32:
190     case Op::I64TruncSF64:
191     case Op::I64TruncUF64:
192     case Op::I64ReinterpretF64:
193     case Op::I64Eqz:
194     case Op::F32ConvertSI32:
195     case Op::F32ConvertUI32:
196     case Op::F32ReinterpretI32:
197     case Op::F32ConvertSI64:
198     case Op::F32ConvertUI64:
199     case Op::F32DemoteF64:
200     case Op::F64ConvertSI32:
201     case Op::F64ConvertUI32:
202     case Op::F64ConvertSI64:
203     case Op::F64ConvertUI64:
204     case Op::F64ReinterpretI64:
205     case Op::F64PromoteF32:
206     case Op::I32Extend8S:
207     case Op::I32Extend16S:
208     case Op::I64Extend8S:
209     case Op::I64Extend16S:
210     case Op::I64Extend32S:
211       return OpKind::Conversion;
212     case Op::I32Load8S:
213     case Op::I32Load8U:
214     case Op::I32Load16S:
215     case Op::I32Load16U:
216     case Op::I64Load8S:
217     case Op::I64Load8U:
218     case Op::I64Load16S:
219     case Op::I64Load16U:
220     case Op::I64Load32S:
221     case Op::I64Load32U:
222     case Op::I32Load:
223     case Op::I64Load:
224     case Op::F32Load:
225     case Op::F64Load:
226       return OpKind::Load;
227     case Op::I32Store8:
228     case Op::I32Store16:
229     case Op::I64Store8:
230     case Op::I64Store16:
231     case Op::I64Store32:
232     case Op::I32Store:
233     case Op::I64Store:
234     case Op::F32Store:
235     case Op::F64Store:
236       return OpKind::Store;
237     case Op::SelectNumeric:
238     case Op::SelectTyped:
239       return OpKind::Select;
240     case Op::GetLocal:
241       return OpKind::GetLocal;
242     case Op::SetLocal:
243       return OpKind::SetLocal;
244     case Op::TeeLocal:
245       return OpKind::TeeLocal;
246     case Op::GetGlobal:
247       return OpKind::GetGlobal;
248     case Op::SetGlobal:
249       return OpKind::SetGlobal;
250     case Op::TableGet:
251       return OpKind::TableGet;
252     case Op::TableSet:
253       return OpKind::TableSet;
254     case Op::Call:
255       return OpKind::Call;
256     case Op::CallIndirect:
257       return OpKind::CallIndirect;
258     case Op::Return:
259     case Op::Limit:
260       // Accept Limit, for use in decoding the end of a function after the body.
261       return OpKind::Return;
262     case Op::If:
263       return OpKind::If;
264     case Op::Else:
265       return OpKind::Else;
266     case Op::End:
267       return OpKind::End;
268 #  ifdef ENABLE_WASM_EXCEPTIONS
269     case Op::Catch:
270       WASM_EXN_OP(OpKind::Catch);
271     case Op::CatchAll:
272       WASM_EXN_OP(OpKind::CatchAll);
273     case Op::Delegate:
274       WASM_EXN_OP(OpKind::Delegate);
275     case Op::Throw:
276       WASM_EXN_OP(OpKind::Throw);
277     case Op::Rethrow:
278       WASM_EXN_OP(OpKind::Rethrow);
279     case Op::Try:
280       WASM_EXN_OP(OpKind::Try);
281 #  endif
282     case Op::MemorySize:
283       return OpKind::MemorySize;
284     case Op::MemoryGrow:
285       return OpKind::MemoryGrow;
286     case Op::RefNull:
287       return OpKind::RefNull;
288     case Op::RefIsNull:
289       return OpKind::Conversion;
290     case Op::RefFunc:
291       return OpKind::RefFunc;
292     case Op::RefAsNonNull:
293       WASM_FUNCTION_REFERENCES_OP(OpKind::RefAsNonNull);
294     case Op::BrOnNull:
295       WASM_FUNCTION_REFERENCES_OP(OpKind::BrOnNull);
296     case Op::RefEq:
297       WASM_GC_OP(OpKind::Comparison);
298     case Op::GcPrefix: {
299       switch (GcOp(op.b1)) {
300         case GcOp::Limit:
301           // Reject Limit for GcPrefix encoding
302           break;
303         case GcOp::StructNewWithRtt:
304           WASM_GC_OP(OpKind::StructNewWithRtt);
305         case GcOp::StructNewDefaultWithRtt:
306           WASM_GC_OP(OpKind::StructNewDefaultWithRtt);
307         case GcOp::StructGet:
308         case GcOp::StructGetS:
309         case GcOp::StructGetU:
310           WASM_GC_OP(OpKind::StructGet);
311         case GcOp::StructSet:
312           WASM_GC_OP(OpKind::StructSet);
313         case GcOp::ArrayNewWithRtt:
314           WASM_GC_OP(OpKind::ArrayNewWithRtt);
315         case GcOp::ArrayNewDefaultWithRtt:
316           WASM_GC_OP(OpKind::ArrayNewDefaultWithRtt);
317         case GcOp::ArrayGet:
318         case GcOp::ArrayGetS:
319         case GcOp::ArrayGetU:
320           WASM_GC_OP(OpKind::ArrayGet);
321         case GcOp::ArraySet:
322           WASM_GC_OP(OpKind::ArraySet);
323         case GcOp::ArrayLen:
324           WASM_GC_OP(OpKind::ArrayLen);
325         case GcOp::RttCanon:
326           WASM_GC_OP(OpKind::RttCanon);
327         case GcOp::RttSub:
328           WASM_GC_OP(OpKind::RttSub);
329         case GcOp::RefTest:
330           WASM_GC_OP(OpKind::RefTest);
331         case GcOp::RefCast:
332           WASM_GC_OP(OpKind::RefCast);
333         case GcOp::BrOnCast:
334           WASM_GC_OP(OpKind::BrOnCast);
335       }
336       break;
337     }
338     case Op::SimdPrefix: {
339       switch (SimdOp(op.b1)) {
340         case SimdOp::Limit:
341           // Reject Limit for SimdPrefix encoding
342           break;
343         case SimdOp::I8x16ExtractLaneS:
344         case SimdOp::I8x16ExtractLaneU:
345         case SimdOp::I16x8ExtractLaneS:
346         case SimdOp::I16x8ExtractLaneU:
347         case SimdOp::I32x4ExtractLane:
348         case SimdOp::I64x2ExtractLane:
349         case SimdOp::F32x4ExtractLane:
350         case SimdOp::F64x2ExtractLane:
351           WASM_SIMD_OP(OpKind::ExtractLane);
352         case SimdOp::I8x16Splat:
353         case SimdOp::I16x8Splat:
354         case SimdOp::I32x4Splat:
355         case SimdOp::I64x2Splat:
356         case SimdOp::F32x4Splat:
357         case SimdOp::F64x2Splat:
358         case SimdOp::V128AnyTrue:
359         case SimdOp::I8x16AllTrue:
360         case SimdOp::I16x8AllTrue:
361         case SimdOp::I32x4AllTrue:
362         case SimdOp::I64x2AllTrue:
363         case SimdOp::I8x16Bitmask:
364         case SimdOp::I16x8Bitmask:
365         case SimdOp::I32x4Bitmask:
366         case SimdOp::I64x2Bitmask:
367           WASM_SIMD_OP(OpKind::Conversion);
368         case SimdOp::I8x16ReplaceLane:
369         case SimdOp::I16x8ReplaceLane:
370         case SimdOp::I32x4ReplaceLane:
371         case SimdOp::I64x2ReplaceLane:
372         case SimdOp::F32x4ReplaceLane:
373         case SimdOp::F64x2ReplaceLane:
374           WASM_SIMD_OP(OpKind::ReplaceLane);
375         case SimdOp::I8x16Eq:
376         case SimdOp::I8x16Ne:
377         case SimdOp::I8x16LtS:
378         case SimdOp::I8x16LtU:
379         case SimdOp::I8x16GtS:
380         case SimdOp::I8x16GtU:
381         case SimdOp::I8x16LeS:
382         case SimdOp::I8x16LeU:
383         case SimdOp::I8x16GeS:
384         case SimdOp::I8x16GeU:
385         case SimdOp::I16x8Eq:
386         case SimdOp::I16x8Ne:
387         case SimdOp::I16x8LtS:
388         case SimdOp::I16x8LtU:
389         case SimdOp::I16x8GtS:
390         case SimdOp::I16x8GtU:
391         case SimdOp::I16x8LeS:
392         case SimdOp::I16x8LeU:
393         case SimdOp::I16x8GeS:
394         case SimdOp::I16x8GeU:
395         case SimdOp::I32x4Eq:
396         case SimdOp::I32x4Ne:
397         case SimdOp::I32x4LtS:
398         case SimdOp::I32x4LtU:
399         case SimdOp::I32x4GtS:
400         case SimdOp::I32x4GtU:
401         case SimdOp::I32x4LeS:
402         case SimdOp::I32x4LeU:
403         case SimdOp::I32x4GeS:
404         case SimdOp::I32x4GeU:
405         case SimdOp::I64x2Eq:
406         case SimdOp::I64x2Ne:
407         case SimdOp::I64x2LtS:
408         case SimdOp::I64x2GtS:
409         case SimdOp::I64x2LeS:
410         case SimdOp::I64x2GeS:
411         case SimdOp::F32x4Eq:
412         case SimdOp::F32x4Ne:
413         case SimdOp::F32x4Lt:
414         case SimdOp::F32x4Gt:
415         case SimdOp::F32x4Le:
416         case SimdOp::F32x4Ge:
417         case SimdOp::F64x2Eq:
418         case SimdOp::F64x2Ne:
419         case SimdOp::F64x2Lt:
420         case SimdOp::F64x2Gt:
421         case SimdOp::F64x2Le:
422         case SimdOp::F64x2Ge:
423         case SimdOp::V128And:
424         case SimdOp::V128Or:
425         case SimdOp::V128Xor:
426         case SimdOp::V128AndNot:
427         case SimdOp::I8x16AvgrU:
428         case SimdOp::I16x8AvgrU:
429         case SimdOp::I8x16Add:
430         case SimdOp::I8x16AddSaturateS:
431         case SimdOp::I8x16AddSaturateU:
432         case SimdOp::I8x16Sub:
433         case SimdOp::I8x16SubSaturateS:
434         case SimdOp::I8x16SubSaturateU:
435         case SimdOp::I8x16MinS:
436         case SimdOp::I8x16MaxS:
437         case SimdOp::I8x16MinU:
438         case SimdOp::I8x16MaxU:
439         case SimdOp::I16x8Add:
440         case SimdOp::I16x8AddSaturateS:
441         case SimdOp::I16x8AddSaturateU:
442         case SimdOp::I16x8Sub:
443         case SimdOp::I16x8SubSaturateS:
444         case SimdOp::I16x8SubSaturateU:
445         case SimdOp::I16x8Mul:
446         case SimdOp::I16x8MinS:
447         case SimdOp::I16x8MaxS:
448         case SimdOp::I16x8MinU:
449         case SimdOp::I16x8MaxU:
450         case SimdOp::I32x4Add:
451         case SimdOp::I32x4Sub:
452         case SimdOp::I32x4Mul:
453         case SimdOp::I32x4MinS:
454         case SimdOp::I32x4MaxS:
455         case SimdOp::I32x4MinU:
456         case SimdOp::I32x4MaxU:
457         case SimdOp::I64x2Add:
458         case SimdOp::I64x2Sub:
459         case SimdOp::I64x2Mul:
460         case SimdOp::F32x4Add:
461         case SimdOp::F32x4Sub:
462         case SimdOp::F32x4Mul:
463         case SimdOp::F32x4Div:
464         case SimdOp::F32x4Min:
465         case SimdOp::F32x4Max:
466         case SimdOp::F64x2Add:
467         case SimdOp::F64x2Sub:
468         case SimdOp::F64x2Mul:
469         case SimdOp::F64x2Div:
470         case SimdOp::F64x2Min:
471         case SimdOp::F64x2Max:
472         case SimdOp::I8x16NarrowSI16x8:
473         case SimdOp::I8x16NarrowUI16x8:
474         case SimdOp::I16x8NarrowSI32x4:
475         case SimdOp::I16x8NarrowUI32x4:
476         case SimdOp::V8x16Swizzle:
477         case SimdOp::F32x4PMin:
478         case SimdOp::F32x4PMax:
479         case SimdOp::F64x2PMin:
480         case SimdOp::F64x2PMax:
481         case SimdOp::I32x4DotSI16x8:
482         case SimdOp::I16x8ExtMulLowSI8x16:
483         case SimdOp::I16x8ExtMulHighSI8x16:
484         case SimdOp::I16x8ExtMulLowUI8x16:
485         case SimdOp::I16x8ExtMulHighUI8x16:
486         case SimdOp::I32x4ExtMulLowSI16x8:
487         case SimdOp::I32x4ExtMulHighSI16x8:
488         case SimdOp::I32x4ExtMulLowUI16x8:
489         case SimdOp::I32x4ExtMulHighUI16x8:
490         case SimdOp::I64x2ExtMulLowSI32x4:
491         case SimdOp::I64x2ExtMulHighSI32x4:
492         case SimdOp::I64x2ExtMulLowUI32x4:
493         case SimdOp::I64x2ExtMulHighUI32x4:
494         case SimdOp::I16x8Q15MulrSatS:
495           WASM_SIMD_OP(OpKind::Binary);
496         case SimdOp::I8x16Neg:
497         case SimdOp::I16x8Neg:
498         case SimdOp::I16x8WidenLowSI8x16:
499         case SimdOp::I16x8WidenHighSI8x16:
500         case SimdOp::I16x8WidenLowUI8x16:
501         case SimdOp::I16x8WidenHighUI8x16:
502         case SimdOp::I32x4Neg:
503         case SimdOp::I32x4WidenLowSI16x8:
504         case SimdOp::I32x4WidenHighSI16x8:
505         case SimdOp::I32x4WidenLowUI16x8:
506         case SimdOp::I32x4WidenHighUI16x8:
507         case SimdOp::I32x4TruncSSatF32x4:
508         case SimdOp::I32x4TruncUSatF32x4:
509         case SimdOp::I64x2Neg:
510         case SimdOp::I64x2WidenLowSI32x4:
511         case SimdOp::I64x2WidenHighSI32x4:
512         case SimdOp::I64x2WidenLowUI32x4:
513         case SimdOp::I64x2WidenHighUI32x4:
514         case SimdOp::F32x4Abs:
515         case SimdOp::F32x4Neg:
516         case SimdOp::F32x4Sqrt:
517         case SimdOp::F32x4ConvertSI32x4:
518         case SimdOp::F32x4ConvertUI32x4:
519         case SimdOp::F64x2Abs:
520         case SimdOp::F64x2Neg:
521         case SimdOp::F64x2Sqrt:
522         case SimdOp::V128Not:
523         case SimdOp::I8x16Popcnt:
524         case SimdOp::I8x16Abs:
525         case SimdOp::I16x8Abs:
526         case SimdOp::I32x4Abs:
527         case SimdOp::I64x2Abs:
528         case SimdOp::F32x4Ceil:
529         case SimdOp::F32x4Floor:
530         case SimdOp::F32x4Trunc:
531         case SimdOp::F32x4Nearest:
532         case SimdOp::F64x2Ceil:
533         case SimdOp::F64x2Floor:
534         case SimdOp::F64x2Trunc:
535         case SimdOp::F64x2Nearest:
536         case SimdOp::F32x4DemoteF64x2Zero:
537         case SimdOp::F64x2PromoteLowF32x4:
538         case SimdOp::F64x2ConvertLowI32x4S:
539         case SimdOp::F64x2ConvertLowI32x4U:
540         case SimdOp::I32x4TruncSatF64x2SZero:
541         case SimdOp::I32x4TruncSatF64x2UZero:
542         case SimdOp::I16x8ExtAddPairwiseI8x16S:
543         case SimdOp::I16x8ExtAddPairwiseI8x16U:
544         case SimdOp::I32x4ExtAddPairwiseI16x8S:
545         case SimdOp::I32x4ExtAddPairwiseI16x8U:
546           WASM_SIMD_OP(OpKind::Unary);
547         case SimdOp::I8x16Shl:
548         case SimdOp::I8x16ShrS:
549         case SimdOp::I8x16ShrU:
550         case SimdOp::I16x8Shl:
551         case SimdOp::I16x8ShrS:
552         case SimdOp::I16x8ShrU:
553         case SimdOp::I32x4Shl:
554         case SimdOp::I32x4ShrS:
555         case SimdOp::I32x4ShrU:
556         case SimdOp::I64x2Shl:
557         case SimdOp::I64x2ShrS:
558         case SimdOp::I64x2ShrU:
559           WASM_SIMD_OP(OpKind::VectorShift);
560         case SimdOp::V128Bitselect:
561           WASM_SIMD_OP(OpKind::VectorSelect);
562         case SimdOp::V8x16Shuffle:
563           WASM_SIMD_OP(OpKind::VectorShuffle);
564         case SimdOp::V128Const:
565           WASM_SIMD_OP(OpKind::V128);
566         case SimdOp::V128Load:
567         case SimdOp::V8x16LoadSplat:
568         case SimdOp::V16x8LoadSplat:
569         case SimdOp::V32x4LoadSplat:
570         case SimdOp::V64x2LoadSplat:
571         case SimdOp::I16x8LoadS8x8:
572         case SimdOp::I16x8LoadU8x8:
573         case SimdOp::I32x4LoadS16x4:
574         case SimdOp::I32x4LoadU16x4:
575         case SimdOp::I64x2LoadS32x2:
576         case SimdOp::I64x2LoadU32x2:
577         case SimdOp::V128Load32Zero:
578         case SimdOp::V128Load64Zero:
579           WASM_SIMD_OP(OpKind::Load);
580         case SimdOp::V128Store:
581           WASM_SIMD_OP(OpKind::Store);
582         case SimdOp::V128Load8Lane:
583         case SimdOp::V128Load16Lane:
584         case SimdOp::V128Load32Lane:
585         case SimdOp::V128Load64Lane:
586           WASM_SIMD_OP(OpKind::LoadLane);
587         case SimdOp::V128Store8Lane:
588         case SimdOp::V128Store16Lane:
589         case SimdOp::V128Store32Lane:
590         case SimdOp::V128Store64Lane:
591           WASM_SIMD_OP(OpKind::StoreLane);
592 #  ifdef ENABLE_WASM_SIMD_WORMHOLE
593         case SimdOp::MozWHSELFTEST:
594         case SimdOp::MozWHPMADDUBSW:
595         case SimdOp::MozWHPMADDWD:
596           MOZ_CRASH("Should not be seen");
597 #  endif
598       }
599       break;
600     }
601     case Op::MiscPrefix: {
602       switch (MiscOp(op.b1)) {
603         case MiscOp::Limit:
604           // Reject Limit for MiscPrefix encoding
605           break;
606         case MiscOp::I32TruncSSatF32:
607         case MiscOp::I32TruncUSatF32:
608         case MiscOp::I32TruncSSatF64:
609         case MiscOp::I32TruncUSatF64:
610         case MiscOp::I64TruncSSatF32:
611         case MiscOp::I64TruncUSatF32:
612         case MiscOp::I64TruncSSatF64:
613         case MiscOp::I64TruncUSatF64:
614           return OpKind::Conversion;
615         case MiscOp::MemCopy:
616         case MiscOp::TableCopy:
617           return OpKind::MemOrTableCopy;
618         case MiscOp::DataDrop:
619         case MiscOp::ElemDrop:
620           return OpKind::DataOrElemDrop;
621         case MiscOp::MemFill:
622           return OpKind::MemFill;
623         case MiscOp::MemInit:
624         case MiscOp::TableInit:
625           return OpKind::MemOrTableInit;
626         case MiscOp::TableFill:
627           return OpKind::TableFill;
628         case MiscOp::TableGrow:
629           return OpKind::TableGrow;
630         case MiscOp::TableSize:
631           return OpKind::TableSize;
632       }
633       break;
634     }
635     case Op::ThreadPrefix: {
636       switch (ThreadOp(op.b1)) {
637         case ThreadOp::Limit:
638           // Reject Limit for ThreadPrefix encoding
639           break;
640         case ThreadOp::Wake:
641           return OpKind::Wake;
642         case ThreadOp::I32Wait:
643         case ThreadOp::I64Wait:
644           return OpKind::Wait;
645         case ThreadOp::Fence:
646           return OpKind::Fence;
647         case ThreadOp::I32AtomicLoad:
648         case ThreadOp::I64AtomicLoad:
649         case ThreadOp::I32AtomicLoad8U:
650         case ThreadOp::I32AtomicLoad16U:
651         case ThreadOp::I64AtomicLoad8U:
652         case ThreadOp::I64AtomicLoad16U:
653         case ThreadOp::I64AtomicLoad32U:
654           return OpKind::AtomicLoad;
655         case ThreadOp::I32AtomicStore:
656         case ThreadOp::I64AtomicStore:
657         case ThreadOp::I32AtomicStore8U:
658         case ThreadOp::I32AtomicStore16U:
659         case ThreadOp::I64AtomicStore8U:
660         case ThreadOp::I64AtomicStore16U:
661         case ThreadOp::I64AtomicStore32U:
662           return OpKind::AtomicStore;
663         case ThreadOp::I32AtomicAdd:
664         case ThreadOp::I64AtomicAdd:
665         case ThreadOp::I32AtomicAdd8U:
666         case ThreadOp::I32AtomicAdd16U:
667         case ThreadOp::I64AtomicAdd8U:
668         case ThreadOp::I64AtomicAdd16U:
669         case ThreadOp::I64AtomicAdd32U:
670         case ThreadOp::I32AtomicSub:
671         case ThreadOp::I64AtomicSub:
672         case ThreadOp::I32AtomicSub8U:
673         case ThreadOp::I32AtomicSub16U:
674         case ThreadOp::I64AtomicSub8U:
675         case ThreadOp::I64AtomicSub16U:
676         case ThreadOp::I64AtomicSub32U:
677         case ThreadOp::I32AtomicAnd:
678         case ThreadOp::I64AtomicAnd:
679         case ThreadOp::I32AtomicAnd8U:
680         case ThreadOp::I32AtomicAnd16U:
681         case ThreadOp::I64AtomicAnd8U:
682         case ThreadOp::I64AtomicAnd16U:
683         case ThreadOp::I64AtomicAnd32U:
684         case ThreadOp::I32AtomicOr:
685         case ThreadOp::I64AtomicOr:
686         case ThreadOp::I32AtomicOr8U:
687         case ThreadOp::I32AtomicOr16U:
688         case ThreadOp::I64AtomicOr8U:
689         case ThreadOp::I64AtomicOr16U:
690         case ThreadOp::I64AtomicOr32U:
691         case ThreadOp::I32AtomicXor:
692         case ThreadOp::I64AtomicXor:
693         case ThreadOp::I32AtomicXor8U:
694         case ThreadOp::I32AtomicXor16U:
695         case ThreadOp::I64AtomicXor8U:
696         case ThreadOp::I64AtomicXor16U:
697         case ThreadOp::I64AtomicXor32U:
698         case ThreadOp::I32AtomicXchg:
699         case ThreadOp::I64AtomicXchg:
700         case ThreadOp::I32AtomicXchg8U:
701         case ThreadOp::I32AtomicXchg16U:
702         case ThreadOp::I64AtomicXchg8U:
703         case ThreadOp::I64AtomicXchg16U:
704         case ThreadOp::I64AtomicXchg32U:
705           return OpKind::AtomicBinOp;
706         case ThreadOp::I32AtomicCmpXchg:
707         case ThreadOp::I64AtomicCmpXchg:
708         case ThreadOp::I32AtomicCmpXchg8U:
709         case ThreadOp::I32AtomicCmpXchg16U:
710         case ThreadOp::I64AtomicCmpXchg8U:
711         case ThreadOp::I64AtomicCmpXchg16U:
712         case ThreadOp::I64AtomicCmpXchg32U:
713           return OpKind::AtomicCompareExchange;
714         default:
715           break;
716       }
717       break;
718     }
719     case Op::MozPrefix: {
720       switch (MozOp(op.b1)) {
721         case MozOp::Limit:
722           // Reject Limit for the MozPrefix encoding
723           break;
724         case MozOp::TeeGlobal:
725           return OpKind::TeeGlobal;
726         case MozOp::I32BitNot:
727         case MozOp::I32Abs:
728         case MozOp::I32Neg:
729           return OpKind::Unary;
730         case MozOp::I32Min:
731         case MozOp::I32Max:
732         case MozOp::F64Mod:
733         case MozOp::F64Pow:
734         case MozOp::F64Atan2:
735           return OpKind::Binary;
736         case MozOp::F64Sin:
737         case MozOp::F64Cos:
738         case MozOp::F64Tan:
739         case MozOp::F64Asin:
740         case MozOp::F64Acos:
741         case MozOp::F64Atan:
742         case MozOp::F64Exp:
743         case MozOp::F64Log:
744           return OpKind::Unary;
745         case MozOp::I32TeeStore8:
746         case MozOp::I32TeeStore16:
747         case MozOp::I64TeeStore8:
748         case MozOp::I64TeeStore16:
749         case MozOp::I64TeeStore32:
750         case MozOp::I32TeeStore:
751         case MozOp::I64TeeStore:
752         case MozOp::F32TeeStore:
753         case MozOp::F64TeeStore:
754         case MozOp::F32TeeStoreF64:
755         case MozOp::F64TeeStoreF32:
756           return OpKind::TeeStore;
757         case MozOp::OldCallDirect:
758           return OpKind::OldCallDirect;
759         case MozOp::OldCallIndirect:
760           return OpKind::OldCallIndirect;
761       }
762       break;
763     }
764   }
765   MOZ_CRASH("unimplemented opcode");
766 }
767 
768 #  undef WASM_EXN_OP
769 #  undef WASM_GC_OP
770 #  undef WASM_REF_OP
771 
772 #endif
773