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)54OpKind 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