Coverage Report

Created: 2025-07-18 06:13

/src/WasmEdge/lib/loader/ast/instruction.cpp
Line
Count
Source (jump to first uncovered line)
1
// SPDX-License-Identifier: Apache-2.0
2
// SPDX-FileCopyrightText: 2019-2024 Second State INC
3
4
#include "loader/loader.h"
5
6
#include <utility>
7
8
using namespace std::literals;
9
10
namespace WasmEdge {
11
namespace Loader {
12
13
// OpCode loader. See "include/loader/loader.h".
14
7.85M
Expect<OpCode> Loader::loadOpCode() {
15
7.85M
  EXPECTED_TRY(uint8_t Prefix, FMgr.readByte());
16
17
7.85M
  if (Prefix >= 0xFBU && Prefix <= 0xFEU) {
18
    // Multi-byte OpCode case.
19
867k
    EXPECTED_TRY(uint32_t Extend, FMgr.readU32());
20
867k
    if (Prefix == 0xFBU) {
21
42
      switch (Extend) {
22
0
#define UseOpCode
23
0
#define Line(NAME, STRING, PREFIX)
24
0
#define Line_FB(NAME, STRING, PREFIX, EXTEND)                                  \
25
39
  case EXTEND:                                                                 \
26
39
    return OpCode::NAME;
27
0
#define Line_FC(NAME, STRING, PREFIX, EXTEND)
28
0
#define Line_FD(NAME, STRING, PREFIX, EXTEND)
29
0
#define Line_FE(NAME, STRING, PREFIX, EXTEND)
30
0
#include "common/enum.inc"
31
0
#undef Line
32
0
#undef Line_FB
33
0
#undef Line_FC
34
0
#undef Line_FD
35
0
#undef Line_FE
36
0
#undef UseOpCode
37
3
      default:
38
3
        return Unexpect(ErrCode::Value::IllegalOpCode);
39
42
      }
40
867k
    } else if (Prefix == 0xFCU) {
41
28.6k
      switch (Extend) {
42
0
#define UseOpCode
43
0
#define Line(NAME, STRING, PREFIX)
44
0
#define Line_FB(NAME, STRING, PREFIX, EXTEND)
45
0
#define Line_FC(NAME, STRING, PREFIX, EXTEND)                                  \
46
28.6k
  case EXTEND:                                                                 \
47
28.6k
    return OpCode::NAME;
48
0
#define Line_FD(NAME, STRING, PREFIX, EXTEND)
49
0
#define Line_FE(NAME, STRING, PREFIX, EXTEND)
50
0
#include "common/enum.inc"
51
0
#undef Line
52
0
#undef Line_FB
53
0
#undef Line_FC
54
0
#undef Line_FD
55
0
#undef Line_FE
56
0
#undef UseOpCode
57
5
      default:
58
5
        return Unexpect(ErrCode::Value::IllegalOpCode);
59
28.6k
      }
60
838k
    } else if (Prefix == 0xFDU) {
61
831k
      switch (Extend) {
62
0
#define UseOpCode
63
0
#define Line(NAME, STRING, PREFIX)
64
0
#define Line_FB(NAME, STRING, PREFIX, EXTEND)
65
0
#define Line_FC(NAME, STRING, PREFIX, EXTEND)
66
0
#define Line_FD(NAME, STRING, PREFIX, EXTEND)                                  \
67
831k
  case EXTEND:                                                                 \
68
831k
    return OpCode::NAME;
69
0
#define Line_FE(NAME, STRING, PREFIX, EXTEND)
70
0
#include "common/enum.inc"
71
0
#undef Line
72
0
#undef Line_FB
73
0
#undef Line_FC
74
0
#undef Line_FD
75
0
#undef Line_FE
76
0
#undef UseOpCode
77
66
      default:
78
66
        return Unexpect(ErrCode::Value::IllegalOpCode);
79
831k
      }
80
831k
    } else {
81
7.27k
      switch (Extend) {
82
0
#define UseOpCode
83
0
#define Line(NAME, STRING, PREFIX)
84
0
#define Line_FB(NAME, STRING, PREFIX, EXTEND)
85
0
#define Line_FC(NAME, STRING, PREFIX, EXTEND)
86
0
#define Line_FD(NAME, STRING, PREFIX, EXTEND)
87
0
#define Line_FE(NAME, STRING, PREFIX, EXTEND)                                  \
88
7.27k
  case EXTEND:                                                                 \
89
7.27k
    return OpCode::NAME;
90
0
#include "common/enum.inc"
91
0
#undef Line
92
0
#undef Line_FB
93
0
#undef Line_FC
94
0
#undef Line_FD
95
0
#undef Line_FE
96
0
#undef UseOpCode
97
9
      default:
98
9
        return Unexpect(ErrCode::Value::IllegalOpCode);
99
7.27k
      }
100
7.27k
    }
101
6.98M
  } else {
102
    // Single-byte OpCode case.
103
6.98M
    switch (Prefix) {
104
0
#define UseOpCode
105
0
#define Line(NAME, STRING, PREFIX)                                             \
106
6.98M
  case PREFIX:                                                                 \
107
6.98M
    return OpCode::NAME;
108
0
#define Line_FB(NAME, STRING, PREFIX, EXTEND)
109
0
#define Line_FC(NAME, STRING, PREFIX, EXTEND)
110
0
#define Line_FD(NAME, STRING, PREFIX, EXTEND)
111
0
#define Line_FE(NAME, STRING, PREFIX, EXTEND)
112
0
#include "common/enum.inc"
113
0
#undef Line
114
0
#undef Line_FB
115
0
#undef Line_FC
116
0
#undef Line_FD
117
0
#undef Line_FE
118
0
#undef UseOpCode
119
104
    default:
120
104
      return Unexpect(ErrCode::Value::IllegalOpCode);
121
6.98M
    }
122
6.98M
  }
123
7.85M
}
124
125
// Load instruction sequence. See "include/loader/loader.h".
126
28.7k
Expect<AST::InstrVec> Loader::loadInstrSeq(std::optional<uint64_t> SizeBound) {
127
28.7k
  AST::InstrVec Instrs;
128
28.7k
  std::vector<std::pair<OpCode, uint32_t>> BlockStack;
129
28.7k
  uint32_t Cnt = 0;
130
28.7k
  bool IsReachEnd = false;
131
  // Read opcode until the End code of the top block.
132
7.85M
  do {
133
    // Read the opcode and check if error.
134
7.85M
    uint64_t Offset = FMgr.getOffset();
135
7.85M
    EXPECTED_TRY(OpCode Code, loadOpCode().map_error([this](auto E) {
136
7.85M
      return logLoadError(E, FMgr.getLastOffset(), ASTNodeAttr::Instruction);
137
7.85M
    }));
138
139
    // Check with proposals.
140
7.85M
    if (auto Res = Conf.isInstrNeedProposal(Code); unlikely(!!Res)) {
141
226
      return logNeedProposal(ErrCode::Value::IllegalOpCode, Res.value(), Offset,
142
226
                             ASTNodeAttr::Instruction);
143
226
    }
144
145
7.85M
    auto logIllegalOpCode = [this, &Offset,
146
7.85M
                             &SizeBound]() -> Unexpected<ErrCode> {
147
38
      if (SizeBound.has_value() && FMgr.getOffset() > SizeBound.value()) {
148
10
        return logLoadError(ErrCode::Value::ENDCodeExpected, Offset,
149
10
                            ASTNodeAttr::Instruction);
150
28
      } else {
151
28
        return logLoadError(ErrCode::Value::IllegalOpCode, Offset,
152
28
                            ASTNodeAttr::Instruction);
153
28
      }
154
38
    };
155
156
    // Process the instruction which contains a block.
157
7.85M
    switch (Code) {
158
104k
    case OpCode::Block:
159
163k
    case OpCode::Loop:
160
217k
    case OpCode::If:
161
    // LEGACY-EH: remove the `Try` after deprecating legacy EH.
162
217k
    case OpCode::Try:
163
217k
    case OpCode::Try_table:
164
217k
      BlockStack.emplace_back(Code, Cnt);
165
217k
      break;
166
2.56k
    case OpCode::Else: {
167
2.56k
      if (BlockStack.size() == 0 || BlockStack.back().first != OpCode::If) {
168
        // An Else instruction appeared outside the If-block.
169
35
        return logIllegalOpCode();
170
35
      }
171
2.53k
      uint32_t Pos = BlockStack.back().second;
172
2.53k
      if (Instrs[Pos].getJumpElse() > 0) {
173
        // An Else instruction appeared before in this If-block.
174
3
        return logIllegalOpCode();
175
3
      }
176
2.52k
      Instrs[Pos].setJumpElse(Cnt - Pos);
177
2.52k
      break;
178
2.53k
    }
179
    // LEGACY-EH: remove the `Catch` cases after deprecating legacy EH.
180
0
    case OpCode::Catch:
181
0
    case OpCode::Catch_all: {
182
0
      if (BlockStack.size() == 0 || BlockStack.back().first != OpCode::Try) {
183
        // A Catch/Catch_all instruction appeared outside a try-block.
184
0
        return logIllegalOpCode();
185
0
      }
186
0
      auto Pos = BlockStack.back().second;
187
0
      auto &CatchClause = Instrs[Pos].getTryCatch().Catch;
188
0
      if (CatchClause.size() > 0 && CatchClause.back().IsAll) {
189
        // A Catch shouldn't behind a Catch_all in the same block.
190
        // And also a try block may contain only one Catch_all instruction.
191
0
        return logIllegalOpCode();
192
0
      }
193
0
      break;
194
0
    }
195
7.63M
    default:
196
7.63M
      break;
197
7.85M
    }
198
199
    // Create the instruction node and load contents.
200
7.85M
    Instrs.emplace_back(Code, static_cast<uint32_t>(Offset));
201
7.85M
    EXPECTED_TRY(loadInstruction(Instrs.back()));
202
203
7.85M
    if (Code == OpCode::End) {
204
      // Post process the End instruction.
205
53.1k
      if (BlockStack.size() > 0) {
206
27.4k
        Instrs.back().setExprLast(false);
207
27.4k
        const auto &[BackOp, Pos] = BlockStack.back();
208
27.4k
        if (BackOp == OpCode::Block || BackOp == OpCode::Loop ||
209
27.4k
            BackOp == OpCode::If) {
210
27.4k
          Instrs.back().setTryBlockLast(false);
211
          // LEGACY-EH: remove this after deprecating legacy EH.
212
27.4k
          Instrs.back().setLegacyTryBlockLast(false);
213
27.4k
          Instrs[Pos].setJumpEnd(Cnt - Pos);
214
27.4k
          if (BackOp == OpCode::If) {
215
11.2k
            if (Instrs[Pos].getJumpElse() == 0) {
216
              // If block without else. Set the else jump the same as end jump.
217
8.87k
              Instrs[Pos].setJumpElse(Cnt - Pos);
218
8.87k
            } else {
219
2.33k
              const uint32_t ElsePos = Pos + Instrs[Pos].getJumpElse();
220
2.33k
              Instrs[ElsePos].setJumpEnd(Cnt - ElsePos);
221
2.33k
            }
222
11.2k
          }
223
27.4k
        } else if (BackOp == OpCode::Try_table) {
224
0
          Instrs.back().setTryBlockLast(true);
225
          // LEGACY-EH: remove this after deprecating legacy EH.
226
0
          Instrs.back().setLegacyTryBlockLast(false);
227
0
          Instrs[Pos].getTryCatch().JumpEnd = Cnt - Pos;
228
0
        } else if (BackOp == OpCode::Try) {
229
          // LEGACY-EH: remove the `Try` case after deprecating legacy EH.
230
0
          Instrs.back().setTryBlockLast(false);
231
0
          Instrs.back().setLegacyTryBlockLast(true);
232
0
          Instrs[Pos].getTryCatch().JumpEnd = Cnt - Pos;
233
0
        }
234
27.4k
        BlockStack.pop_back();
235
27.4k
      } else {
236
25.6k
        Instrs.back().setExprLast(true);
237
25.6k
        IsReachEnd = true;
238
25.6k
      }
239
7.80M
    } else if (Code == OpCode::Catch || Code == OpCode::Catch_all) {
240
      // LEGACY-EH: remove these cases after deprecating legacy EH.
241
0
      uint32_t Pos = BlockStack.back().second;
242
0
      auto &CatchClause = Instrs[Pos].getTryCatch().Catch;
243
0
      auto &CatchDesc = Instrs.back().getCatchLegacy();
244
0
      CatchDesc.CatchPCOffset = Cnt - Pos;
245
0
      CatchDesc.CatchIndex = static_cast<uint32_t>(CatchClause.size());
246
0
      CatchClause.push_back({true,
247
0
                             Code == OpCode::Catch_all,
248
0
                             false,
249
0
                             Code == OpCode::Catch ? CatchDesc.TagIndex : 0,
250
0
                             0,
251
0
                             {0, 0, 0, 0}});
252
0
    }
253
7.85M
    Cnt++;
254
7.85M
  } while (!IsReachEnd);
255
256
  // Check the loaded offset should match the segment boundary.
257
25.6k
  if (SizeBound.has_value()) {
258
16.8k
    auto Offset = FMgr.getOffset();
259
16.8k
    if (Offset < SizeBound.value()) {
260
9
      return logLoadError(ErrCode::Value::JunkSection, Offset,
261
9
                          ASTNodeAttr::Instruction);
262
16.8k
    } else if (Offset > SizeBound.value()) {
263
68
      return logLoadError(ErrCode::Value::SectionSizeMismatch, Offset,
264
68
                          ASTNodeAttr::Instruction);
265
68
    }
266
16.8k
  }
267
25.5k
  return Instrs;
268
25.6k
}
269
270
// Load instruction node. See "include/loader/loader.h".
271
7.86M
Expect<void> Loader::loadInstruction(AST::Instruction &Instr) {
272
  // Node: The instruction has checked for the proposals. Need to check their
273
  // immediates.
274
275
7.86M
  auto ReportError = [this](auto E) {
276
566
    return logLoadError(E, FMgr.getLastOffset(), ASTNodeAttr::Instruction);
277
566
  };
278
279
7.86M
  auto readU8 = [this, ReportError](uint8_t &Dst) -> Expect<void> {
280
70.2k
    EXPECTED_TRY(Dst, FMgr.readByte().map_error(ReportError));
281
70.2k
    return {};
282
70.2k
  };
283
284
7.86M
  auto readU32 = [this, ReportError](uint32_t &Dst) -> Expect<void> {
285
500k
    EXPECTED_TRY(Dst, FMgr.readU32().map_error(ReportError));
286
500k
    return {};
287
500k
  };
288
289
7.86M
  auto readMemImmediate = [this, readU32, &Instr]() -> Expect<void> {
290
156k
    Instr.getTargetIndex() = 0;
291
156k
    EXPECTED_TRY(readU32(Instr.getMemoryAlign()));
292
156k
    if (Conf.hasProposal(Proposal::MultiMemories) &&
293
156k
        Instr.getMemoryAlign() >= 64) {
294
0
      Instr.getMemoryAlign() -= 64;
295
0
      EXPECTED_TRY(readU32(Instr.getTargetIndex()));
296
0
    }
297
156k
    if (unlikely(Instr.getMemoryAlign() >= 32)) {
298
      // This is for WASM32. May change for memory64 proposal in the future.
299
238
      return logLoadError(ErrCode::Value::MalformedMemoryOpFlags,
300
238
                          FMgr.getLastOffset(), ASTNodeAttr::Instruction);
301
238
    }
302
155k
    EXPECTED_TRY(readU32(Instr.getMemoryOffset()));
303
155k
    return {};
304
155k
  };
305
306
7.86M
  auto readCheckZero = [this, readU8](uint32_t &Dst) -> Expect<void> {
307
23.3k
    uint8_t C = 0;
308
23.3k
    EXPECTED_TRY(readU8(C));
309
23.3k
    if (C != UINT8_C(0)) {
310
23
      return logLoadError(ErrCode::Value::ExpectedZeroByte,
311
23
                          FMgr.getLastOffset(), ASTNodeAttr::Instruction);
312
23
    }
313
23.2k
    Dst = 0;
314
23.2k
    return {};
315
23.3k
  };
316
317
7.86M
  auto readBlockType = [this, ReportError](BlockType &Dst) -> Expect<void> {
318
217k
    auto StartOffset = FMgr.getOffset();
319
    // Read the block return type.
320
217k
    EXPECTED_TRY(int64_t Code, FMgr.readS33().map_error(ReportError));
321
217k
    if (Code < 0) {
322
57.0k
      TypeCode TypeByte = static_cast<TypeCode>(Code & INT64_C(0x7F));
323
57.0k
      if (TypeByte == TypeCode::Epsilon) {
324
        // Empty case.
325
6.25k
        Dst.setEmpty();
326
50.8k
      } else {
327
        // Value type case. Seek back to the origin offset and read the
328
        // valtype.
329
50.8k
        FMgr.seek(StartOffset);
330
        // The AST node information is handled.
331
50.8k
        EXPECTED_TRY(auto Type, loadValType(ASTNodeAttr::Instruction));
332
50.8k
        Dst.setData(Type);
333
50.8k
      }
334
160k
    } else {
335
      // Type index case.
336
160k
      if (unlikely(!Conf.hasProposal(Proposal::MultiValue))) {
337
0
        return logNeedProposal(ErrCode::Value::MalformedValType,
338
0
                               Proposal::MultiValue, FMgr.getLastOffset(),
339
0
                               ASTNodeAttr::Instruction);
340
0
      }
341
160k
      Dst.setData(static_cast<uint32_t>(Code));
342
160k
    }
343
217k
    return {};
344
217k
  };
345
346
7.86M
  switch (Instr.getOpCode()) {
347
  // Control instructions.
348
3.00M
  case OpCode::Unreachable:
349
3.31M
  case OpCode::Nop:
350
3.31M
  case OpCode::Return:
351
3.31M
  case OpCode::Throw_ref:
352
3.37M
  case OpCode::End:
353
3.37M
  case OpCode::Else:
354
  // LEGACY-EH: remove the `Catch_all` case after deprecating legacy EH.
355
3.37M
  case OpCode::Catch_all:
356
3.37M
    return {};
357
358
104k
  case OpCode::Block:
359
163k
  case OpCode::Loop:
360
217k
  case OpCode::If:
361
217k
    return readBlockType(Instr.getBlockType());
362
363
0
  case OpCode::Try_table: {
364
0
    Instr.setTryCatch();
365
    // Read the result type.
366
0
    EXPECTED_TRY(readBlockType(Instr.getTryCatch().ResType));
367
0
    EXPECTED_TRY(uint32_t VecCnt, loadVecCnt().map_error(ReportError));
368
0
    Instr.getTryCatch().Catch.resize(VecCnt);
369
0
    for (uint32_t I = 0; I < VecCnt; ++I) {
370
0
      auto &Desc = Instr.getTryCatch().Catch[I];
371
      // Read the catch flag.
372
0
      EXPECTED_TRY(uint8_t Flag, FMgr.readByte().map_error(ReportError));
373
      // LEGACY-EH: remove this `IsLegacy` flag after deprecating legacy EH.
374
0
      Desc.IsLegacy = false;
375
0
      Desc.IsRef = (Flag & 0x01U) ? true : false;
376
0
      Desc.IsAll = (Flag & 0x02U) ? true : false;
377
0
      if (!Desc.IsAll) {
378
        // Read the tag index.
379
0
        EXPECTED_TRY(readU32(Desc.TagIndex));
380
0
      }
381
      // Read the label index.
382
0
      EXPECTED_TRY(readU32(Desc.LabelIndex));
383
0
    }
384
0
    return {};
385
0
  }
386
387
  // LEGACY-EH: remove the `Try` case after deprecating legacy EH.
388
0
  case OpCode::Try:
389
0
    Instr.setTryCatch();
390
0
    return readBlockType(Instr.getTryCatch().ResType);
391
392
  // LEGACY-EH: remove the `Catch` case after deprecating legacy EH.
393
0
  case OpCode::Catch:
394
0
    return readU32(Instr.getCatchLegacy().TagIndex);
395
396
0
  case OpCode::Throw:
397
0
    return readU32(Instr.getTargetIndex());
398
399
  // LEGACY-EH: remove the `Rethrow` case after deprecating legacy EH.
400
0
  case OpCode::Rethrow:
401
0
    spdlog::error(ErrCode::Value::IllegalOpCode);
402
0
    spdlog::error("    Deprecated `rethrow` instruction."sv);
403
0
    return Unexpect(ErrCode::Value::IllegalOpCode);
404
405
6.16k
  case OpCode::Br:
406
11.7k
  case OpCode::Br_if:
407
11.7k
  case OpCode::Br_on_null:
408
11.7k
  case OpCode::Br_on_non_null:
409
11.7k
    return readU32(Instr.getJump().TargetIndex);
410
411
  // LEGACY-EH: remove the `Delegate` case after deprecating legacy EH.
412
0
  case OpCode::Delegate:
413
0
    spdlog::error(ErrCode::Value::IllegalOpCode);
414
0
    spdlog::error("    Deprecated `delegate` instruction."sv);
415
0
    return Unexpect(ErrCode::Value::IllegalOpCode);
416
417
6.83k
  case OpCode::Br_table: {
418
    // Read the vector of labels.
419
6.83k
    EXPECTED_TRY(uint32_t VecCnt, loadVecCnt().map_error(ReportError));
420
6.80k
    Instr.setLabelListSize(VecCnt + 1);
421
81.0k
    for (uint32_t I = 0; I < VecCnt; ++I) {
422
74.2k
      EXPECTED_TRY(readU32(Instr.getLabelList()[I].TargetIndex));
423
74.2k
    }
424
    // Read default label.
425
6.79k
    return readU32(Instr.getLabelList()[VecCnt].TargetIndex);
426
6.80k
  }
427
428
6.45k
  case OpCode::Call:
429
6.45k
  case OpCode::Return_call:
430
6.45k
  case OpCode::Call_ref:
431
6.45k
  case OpCode::Return_call_ref:
432
6.45k
    return readU32(Instr.getTargetIndex());
433
434
9.35k
  case OpCode::Call_indirect:
435
9.35k
  case OpCode::Return_call_indirect: {
436
    // Read the type index.
437
9.35k
    EXPECTED_TRY(readU32(Instr.getTargetIndex()));
438
9.35k
    uint64_t SrcIdxOffset = FMgr.getOffset();
439
    // Read the table index.
440
9.35k
    EXPECTED_TRY(readU32(Instr.getSourceIndex()));
441
9.34k
    if ((Instr.getSourceIndex() > 0 || FMgr.getOffset() - SrcIdxOffset > 1) &&
442
9.34k
        !Conf.hasProposal(Proposal::ReferenceTypes)) {
443
0
      return logNeedProposal(ErrCode::Value::ExpectedZeroByte,
444
0
                             Proposal::ReferenceTypes, FMgr.getLastOffset(),
445
0
                             ASTNodeAttr::Instruction);
446
0
    }
447
9.34k
    return {};
448
9.34k
  }
449
450
  // Reference Instructions.
451
3.32k
  case OpCode::Ref__null:
452
3.32k
  case OpCode::Ref__test_null:
453
3.32k
  case OpCode::Ref__cast_null: {
454
    // The AST node information is handled.
455
3.32k
    EXPECTED_TRY(auto Type,
456
3.27k
                 loadHeapType(TypeCode::RefNull, ASTNodeAttr::Instruction));
457
3.27k
    Instr.setValType(Type);
458
3.27k
    return {};
459
3.32k
  }
460
0
  case OpCode::Ref__test:
461
0
  case OpCode::Ref__cast: {
462
    // The AST node information is handled.
463
0
    EXPECTED_TRY(auto Type,
464
0
                 loadHeapType(TypeCode::Ref, ASTNodeAttr::Instruction));
465
0
    Instr.setValType(Type);
466
0
    return {};
467
0
  }
468
2.44k
  case OpCode::Ref__is_null:
469
2.44k
  case OpCode::Ref__eq:
470
2.44k
  case OpCode::Ref__as_non_null:
471
2.44k
    return {};
472
11.6k
  case OpCode::Ref__func:
473
11.6k
  case OpCode::Struct__new:
474
11.6k
  case OpCode::Struct__new_default:
475
11.6k
  case OpCode::Array__new:
476
11.6k
  case OpCode::Array__new_default:
477
11.6k
  case OpCode::Array__get:
478
11.6k
  case OpCode::Array__get_s:
479
11.6k
  case OpCode::Array__get_u:
480
11.6k
  case OpCode::Array__set:
481
11.6k
  case OpCode::Array__fill:
482
11.6k
    return readU32(Instr.getTargetIndex());
483
0
  case OpCode::Struct__get:
484
0
  case OpCode::Struct__get_s:
485
0
  case OpCode::Struct__get_u:
486
0
  case OpCode::Struct__set:
487
0
  case OpCode::Array__new_fixed:
488
0
  case OpCode::Array__new_data:
489
0
  case OpCode::Array__new_elem:
490
0
  case OpCode::Array__copy:
491
0
  case OpCode::Array__init_data:
492
0
  case OpCode::Array__init_elem:
493
0
    EXPECTED_TRY(readU32(Instr.getTargetIndex()));
494
0
    return readU32(Instr.getSourceIndex());
495
0
  case OpCode::Br_on_cast:
496
0
  case OpCode::Br_on_cast_fail: {
497
    // Read the flag.
498
0
    uint8_t Flag = 0U;
499
0
    EXPECTED_TRY(readU8(Flag).map_error(ReportError));
500
    // Read the label index.
501
0
    uint32_t LabelIdx = 0U;
502
0
    EXPECTED_TRY(readU32(LabelIdx).map_error(ReportError));
503
    // Read the heap types.
504
0
    Instr.setBrCast(LabelIdx);
505
0
    TypeCode TC = ((Flag & 0x01U) ? TypeCode::RefNull : TypeCode::Ref);
506
0
    EXPECTED_TRY(
507
0
        Instr.getBrCast().RType1,
508
0
        loadHeapType(TC, ASTNodeAttr::Instruction).map_error(ReportError));
509
0
    TC = ((Flag & 0x02U) ? TypeCode::RefNull : TypeCode::Ref);
510
0
    EXPECTED_TRY(
511
0
        Instr.getBrCast().RType2,
512
0
        loadHeapType(TC, ASTNodeAttr::Instruction).map_error(ReportError));
513
0
    return {};
514
0
  }
515
0
  case OpCode::Array__len:
516
0
  case OpCode::Any__convert_extern:
517
0
  case OpCode::Extern__convert_any:
518
0
  case OpCode::Ref__i31:
519
0
  case OpCode::I31__get_s:
520
0
  case OpCode::I31__get_u:
521
0
    return {};
522
523
  // Parametric Instructions.
524
21.0k
  case OpCode::Drop:
525
29.4k
  case OpCode::Select:
526
29.4k
    return {};
527
1.89k
  case OpCode::Select_t: {
528
    // Read the vector of value types.
529
1.89k
    EXPECTED_TRY(uint32_t VecCnt, loadVecCnt().map_error(ReportError));
530
1.88k
    Instr.setValTypeListSize(VecCnt);
531
3.97k
    for (uint32_t I = 0; I < VecCnt; ++I) {
532
      // The AST node information is handled.
533
2.10k
      EXPECTED_TRY(Instr.getValTypeList()[I],
534
2.08k
                   loadValType(ASTNodeAttr::Instruction));
535
2.08k
    }
536
1.86k
    return {};
537
1.88k
  }
538
539
  // Variable Instructions.
540
29.0k
  case OpCode::Local__get:
541
37.9k
  case OpCode::Local__set:
542
46.5k
  case OpCode::Local__tee:
543
47.8k
  case OpCode::Global__get:
544
48.8k
  case OpCode::Global__set:
545
48.8k
    return readU32(Instr.getTargetIndex());
546
547
  // Table Instructions.
548
265
  case OpCode::Table__init:
549
265
    EXPECTED_TRY(readU32(Instr.getSourceIndex()));
550
263
    [[fallthrough]];
551
2.61k
  case OpCode::Table__get:
552
3.65k
  case OpCode::Table__set:
553
4.90k
  case OpCode::Table__grow:
554
5.77k
  case OpCode::Table__size:
555
5.91k
  case OpCode::Table__fill:
556
7.21k
  case OpCode::Elem__drop:
557
7.21k
    return readU32(Instr.getTargetIndex());
558
468
  case OpCode::Table__copy:
559
468
    EXPECTED_TRY(readU32(Instr.getTargetIndex()));
560
466
    return readU32(Instr.getSourceIndex());
561
562
  // Memory Instructions.
563
4.50k
  case OpCode::I32__load:
564
10.2k
  case OpCode::I64__load:
565
10.5k
  case OpCode::F32__load:
566
13.2k
  case OpCode::F64__load:
567
16.4k
  case OpCode::I32__load8_s:
568
17.6k
  case OpCode::I32__load8_u:
569
20.0k
  case OpCode::I32__load16_s:
570
27.1k
  case OpCode::I32__load16_u:
571
31.3k
  case OpCode::I64__load8_s:
572
35.9k
  case OpCode::I64__load8_u:
573
40.9k
  case OpCode::I64__load16_s:
574
49.8k
  case OpCode::I64__load16_u:
575
53.4k
  case OpCode::I64__load32_s:
576
57.1k
  case OpCode::I64__load32_u:
577
59.4k
  case OpCode::I32__store:
578
63.8k
  case OpCode::I64__store:
579
66.8k
  case OpCode::F32__store:
580
67.9k
  case OpCode::F64__store:
581
71.6k
  case OpCode::I32__store8:
582
76.2k
  case OpCode::I32__store16:
583
78.8k
  case OpCode::I64__store8:
584
81.7k
  case OpCode::I64__store16:
585
83.0k
  case OpCode::I64__store32:
586
83.0k
    return readMemImmediate();
587
588
740
  case OpCode::Memory__init:
589
740
    if (!HasDataSection) {
590
2
      return logLoadError(ErrCode::Value::DataCountRequired, Instr.getOffset(),
591
2
                          ASTNodeAttr::Instruction);
592
2
    }
593
738
    EXPECTED_TRY(readU32(Instr.getSourceIndex()));
594
733
    [[fallthrough]];
595
8.62k
  case OpCode::Memory__grow:
596
17.2k
  case OpCode::Memory__size:
597
20.1k
  case OpCode::Memory__fill:
598
20.1k
    if (Conf.hasProposal(Proposal::MultiMemories)) {
599
0
      return readU32(Instr.getTargetIndex());
600
0
    }
601
20.1k
    return readCheckZero(Instr.getTargetIndex());
602
1.10k
  case OpCode::Memory__copy:
603
1.10k
    if (Conf.hasProposal(Proposal::MultiMemories)) {
604
0
      EXPECTED_TRY(readU32(Instr.getTargetIndex()));
605
0
      return readU32(Instr.getSourceIndex());
606
0
    }
607
1.10k
    EXPECTED_TRY(readCheckZero(Instr.getTargetIndex()));
608
1.09k
    return readCheckZero(Instr.getSourceIndex());
609
673
  case OpCode::Data__drop:
610
673
    if (!HasDataSection) {
611
1
      return logLoadError(ErrCode::Value::DataCountRequired, Instr.getOffset(),
612
1
                          ASTNodeAttr::Instruction);
613
1
    }
614
672
    return readU32(Instr.getTargetIndex());
615
616
  // Const Instructions.
617
1.97M
  case OpCode::I32__const:
618
1.97M
    EXPECTED_TRY(FMgr.readS32().map_error(ReportError).map([&](int32_t Num) {
619
1.97M
      Instr.setNum(static_cast<uint128_t>(static_cast<uint32_t>(Num)));
620
1.97M
    }));
621
1.97M
    return {};
622
268k
  case OpCode::I64__const:
623
268k
    EXPECTED_TRY(FMgr.readS64().map_error(ReportError).map([&](int64_t Num) {
624
268k
      Instr.setNum(static_cast<uint128_t>(static_cast<uint64_t>(Num)));
625
268k
    }));
626
268k
    return {};
627
37.1k
  case OpCode::F32__const:
628
37.1k
    EXPECTED_TRY(FMgr.readF32().map_error(ReportError).map([&](float Num) {
629
37.1k
      Instr.setNum(Num);
630
37.1k
    }));
631
37.1k
    return {};
632
15.4k
  case OpCode::F64__const:
633
15.4k
    EXPECTED_TRY(FMgr.readF64().map_error(ReportError).map([&](double Num) {
634
15.4k
      Instr.setNum(Num);
635
15.4k
    }));
636
15.4k
    return {};
637
638
  // Unary Numeric Instructions.
639
21.1k
  case OpCode::I32__eqz:
640
35.6k
  case OpCode::I32__clz:
641
42.1k
  case OpCode::I32__ctz:
642
110k
  case OpCode::I32__popcnt:
643
120k
  case OpCode::I64__eqz:
644
122k
  case OpCode::I64__clz:
645
125k
  case OpCode::I64__ctz:
646
142k
  case OpCode::I64__popcnt:
647
144k
  case OpCode::F32__abs:
648
147k
  case OpCode::F32__neg:
649
151k
  case OpCode::F32__ceil:
650
152k
  case OpCode::F32__floor:
651
155k
  case OpCode::F32__trunc:
652
162k
  case OpCode::F32__nearest:
653
170k
  case OpCode::F32__sqrt:
654
172k
  case OpCode::F64__abs:
655
175k
  case OpCode::F64__neg:
656
182k
  case OpCode::F64__ceil:
657
185k
  case OpCode::F64__floor:
658
187k
  case OpCode::F64__trunc:
659
188k
  case OpCode::F64__nearest:
660
195k
  case OpCode::F64__sqrt:
661
199k
  case OpCode::I32__wrap_i64:
662
205k
  case OpCode::I32__trunc_f32_s:
663
212k
  case OpCode::I32__trunc_f32_u:
664
214k
  case OpCode::I32__trunc_f64_s:
665
220k
  case OpCode::I32__trunc_f64_u:
666
229k
  case OpCode::I64__extend_i32_s:
667
235k
  case OpCode::I64__extend_i32_u:
668
238k
  case OpCode::I64__trunc_f32_s:
669
239k
  case OpCode::I64__trunc_f32_u:
670
243k
  case OpCode::I64__trunc_f64_s:
671
246k
  case OpCode::I64__trunc_f64_u:
672
254k
  case OpCode::F32__convert_i32_s:
673
258k
  case OpCode::F32__convert_i32_u:
674
262k
  case OpCode::F32__convert_i64_s:
675
267k
  case OpCode::F32__convert_i64_u:
676
268k
  case OpCode::F32__demote_f64:
677
277k
  case OpCode::F64__convert_i32_s:
678
284k
  case OpCode::F64__convert_i32_u:
679
307k
  case OpCode::F64__convert_i64_s:
680
309k
  case OpCode::F64__convert_i64_u:
681
311k
  case OpCode::F64__promote_f32:
682
316k
  case OpCode::I32__reinterpret_f32:
683
322k
  case OpCode::I64__reinterpret_f64:
684
339k
  case OpCode::F32__reinterpret_i32:
685
348k
  case OpCode::F64__reinterpret_i64:
686
357k
  case OpCode::I32__extend8_s:
687
368k
  case OpCode::I32__extend16_s:
688
369k
  case OpCode::I64__extend8_s:
689
391k
  case OpCode::I64__extend16_s:
690
397k
  case OpCode::I64__extend32_s:
691
401k
  case OpCode::I32__trunc_sat_f32_s:
692
403k
  case OpCode::I32__trunc_sat_f32_u:
693
406k
  case OpCode::I32__trunc_sat_f64_s:
694
408k
  case OpCode::I32__trunc_sat_f64_u:
695
409k
  case OpCode::I64__trunc_sat_f32_s:
696
411k
  case OpCode::I64__trunc_sat_f32_u:
697
415k
  case OpCode::I64__trunc_sat_f64_s:
698
416k
  case OpCode::I64__trunc_sat_f64_u:
699
700
  // Binary Numeric Instructions.
701
421k
  case OpCode::I32__eq:
702
425k
  case OpCode::I32__ne:
703
436k
  case OpCode::I32__lt_s:
704
460k
  case OpCode::I32__lt_u:
705
468k
  case OpCode::I32__gt_s:
706
489k
  case OpCode::I32__gt_u:
707
500k
  case OpCode::I32__le_s:
708
502k
  case OpCode::I32__le_u:
709
510k
  case OpCode::I32__ge_s:
710
516k
  case OpCode::I32__ge_u:
711
518k
  case OpCode::I64__eq:
712
522k
  case OpCode::I64__ne:
713
529k
  case OpCode::I64__lt_s:
714
530k
  case OpCode::I64__lt_u:
715
533k
  case OpCode::I64__gt_s:
716
534k
  case OpCode::I64__gt_u:
717
537k
  case OpCode::I64__le_s:
718
544k
  case OpCode::I64__le_u:
719
545k
  case OpCode::I64__ge_s:
720
548k
  case OpCode::I64__ge_u:
721
550k
  case OpCode::F32__eq:
722
552k
  case OpCode::F32__ne:
723
555k
  case OpCode::F32__lt:
724
577k
  case OpCode::F32__gt:
725
580k
  case OpCode::F32__le:
726
583k
  case OpCode::F32__ge:
727
588k
  case OpCode::F64__eq:
728
591k
  case OpCode::F64__ne:
729
594k
  case OpCode::F64__lt:
730
596k
  case OpCode::F64__gt:
731
598k
  case OpCode::F64__le:
732
603k
  case OpCode::F64__ge:
733
734
608k
  case OpCode::I32__add:
735
613k
  case OpCode::I32__sub:
736
617k
  case OpCode::I32__mul:
737
635k
  case OpCode::I32__div_s:
738
654k
  case OpCode::I32__div_u:
739
658k
  case OpCode::I32__rem_s:
740
663k
  case OpCode::I32__rem_u:
741
667k
  case OpCode::I32__and:
742
674k
  case OpCode::I32__or:
743
683k
  case OpCode::I32__xor:
744
698k
  case OpCode::I32__shl:
745
706k
  case OpCode::I32__shr_s:
746
727k
  case OpCode::I32__shr_u:
747
741k
  case OpCode::I32__rotl:
748
748k
  case OpCode::I32__rotr:
749
758k
  case OpCode::I64__add:
750
764k
  case OpCode::I64__sub:
751
768k
  case OpCode::I64__mul:
752
771k
  case OpCode::I64__div_s:
753
780k
  case OpCode::I64__div_u:
754
787k
  case OpCode::I64__rem_s:
755
790k
  case OpCode::I64__rem_u:
756
792k
  case OpCode::I64__and:
757
802k
  case OpCode::I64__or:
758
835k
  case OpCode::I64__xor:
759
837k
  case OpCode::I64__shl:
760
841k
  case OpCode::I64__shr_s:
761
845k
  case OpCode::I64__shr_u:
762
855k
  case OpCode::I64__rotl:
763
861k
  case OpCode::I64__rotr:
764
863k
  case OpCode::F32__add:
765
866k
  case OpCode::F32__sub:
766
870k
  case OpCode::F32__mul:
767
871k
  case OpCode::F32__div:
768
873k
  case OpCode::F32__min:
769
875k
  case OpCode::F32__max:
770
877k
  case OpCode::F32__copysign:
771
881k
  case OpCode::F64__add:
772
888k
  case OpCode::F64__sub:
773
889k
  case OpCode::F64__mul:
774
891k
  case OpCode::F64__div:
775
893k
  case OpCode::F64__min:
776
896k
  case OpCode::F64__max:
777
898k
  case OpCode::F64__copysign:
778
898k
    return {};
779
780
  // SIMD Memory Instruction.
781
24.0k
  case OpCode::V128__load:
782
27.9k
  case OpCode::V128__load8x8_s:
783
28.5k
  case OpCode::V128__load8x8_u:
784
29.7k
  case OpCode::V128__load16x4_s:
785
32.8k
  case OpCode::V128__load16x4_u:
786
35.2k
  case OpCode::V128__load32x2_s:
787
35.8k
  case OpCode::V128__load32x2_u:
788
37.6k
  case OpCode::V128__load8_splat:
789
40.9k
  case OpCode::V128__load16_splat:
790
43.6k
  case OpCode::V128__load32_splat:
791
45.2k
  case OpCode::V128__load64_splat:
792
48.9k
  case OpCode::V128__load32_zero:
793
49.4k
  case OpCode::V128__load64_zero:
794
50.5k
  case OpCode::V128__store:
795
50.5k
    return readMemImmediate();
796
787
  case OpCode::V128__load8_lane:
797
5.61k
  case OpCode::V128__load16_lane:
798
6.68k
  case OpCode::V128__load32_lane:
799
8.13k
  case OpCode::V128__load64_lane:
800
10.0k
  case OpCode::V128__store8_lane:
801
10.5k
  case OpCode::V128__store16_lane:
802
15.1k
  case OpCode::V128__store32_lane:
803
16.4k
  case OpCode::V128__store64_lane:
804
    // Read memory immediate.
805
16.4k
    EXPECTED_TRY(readMemImmediate());
806
    // Read lane index.
807
16.4k
    return readU8(Instr.getMemoryLane());
808
809
  // SIMD Const Instruction.
810
965
  case OpCode::V128__const:
811
  // SIMD Shuffle Instruction.
812
2.03k
  case OpCode::I8x16__shuffle: {
813
    // Read value.
814
2.03k
    uint128_t Value = 0U;
815
34.3k
    for (uint32_t I = 0U; I < 16U; ++I) {
816
32.3k
      EXPECTED_TRY(FMgr.readByte().map_error(ReportError).map([&](uint8_t B) {
817
32.3k
        Value |= static_cast<uint128_t>(static_cast<uint32_t>(B)) << (I * 8U);
818
32.3k
      }));
819
32.3k
    }
820
2.01k
    Instr.setNum(Value);
821
2.01k
    return {};
822
2.03k
  }
823
824
  // SIMD Lane Instructions.
825
4.26k
  case OpCode::I8x16__extract_lane_s:
826
4.82k
  case OpCode::I8x16__extract_lane_u:
827
7.93k
  case OpCode::I8x16__replace_lane:
828
11.4k
  case OpCode::I16x8__extract_lane_s:
829
12.9k
  case OpCode::I16x8__extract_lane_u:
830
14.7k
  case OpCode::I16x8__replace_lane:
831
19.3k
  case OpCode::I32x4__extract_lane:
832
20.9k
  case OpCode::I32x4__replace_lane:
833
22.0k
  case OpCode::I64x2__extract_lane:
834
23.9k
  case OpCode::I64x2__replace_lane:
835
24.9k
  case OpCode::F32x4__extract_lane:
836
26.4k
  case OpCode::F32x4__replace_lane:
837
28.1k
  case OpCode::F64x2__extract_lane:
838
30.5k
  case OpCode::F64x2__replace_lane:
839
    // Read lane index.
840
30.5k
    return readU8(Instr.getMemoryLane());
841
842
  // SIMD Numeric Instructions.
843
5.50k
  case OpCode::I8x16__swizzle:
844
154k
  case OpCode::I8x16__splat:
845
199k
  case OpCode::I16x8__splat:
846
208k
  case OpCode::I32x4__splat:
847
211k
  case OpCode::I64x2__splat:
848
212k
  case OpCode::F32x4__splat:
849
217k
  case OpCode::F64x2__splat:
850
851
222k
  case OpCode::I8x16__eq:
852
223k
  case OpCode::I8x16__ne:
853
225k
  case OpCode::I8x16__lt_s:
854
227k
  case OpCode::I8x16__lt_u:
855
232k
  case OpCode::I8x16__gt_s:
856
234k
  case OpCode::I8x16__gt_u:
857
235k
  case OpCode::I8x16__le_s:
858
236k
  case OpCode::I8x16__le_u:
859
237k
  case OpCode::I8x16__ge_s:
860
241k
  case OpCode::I8x16__ge_u:
861
862
243k
  case OpCode::I16x8__eq:
863
246k
  case OpCode::I16x8__ne:
864
249k
  case OpCode::I16x8__lt_s:
865
254k
  case OpCode::I16x8__lt_u:
866
258k
  case OpCode::I16x8__gt_s:
867
263k
  case OpCode::I16x8__gt_u:
868
265k
  case OpCode::I16x8__le_s:
869
266k
  case OpCode::I16x8__le_u:
870
269k
  case OpCode::I16x8__ge_s:
871
274k
  case OpCode::I16x8__ge_u:
872
873
276k
  case OpCode::I32x4__eq:
874
277k
  case OpCode::I32x4__ne:
875
280k
  case OpCode::I32x4__lt_s:
876
281k
  case OpCode::I32x4__lt_u:
877
282k
  case OpCode::I32x4__gt_s:
878
283k
  case OpCode::I32x4__gt_u:
879
289k
  case OpCode::I32x4__le_s:
880
290k
  case OpCode::I32x4__le_u:
881
291k
  case OpCode::I32x4__ge_s:
882
294k
  case OpCode::I32x4__ge_u:
883
884
303k
  case OpCode::F32x4__eq:
885
304k
  case OpCode::F32x4__ne:
886
306k
  case OpCode::F32x4__lt:
887
307k
  case OpCode::F32x4__gt:
888
310k
  case OpCode::F32x4__le:
889
311k
  case OpCode::F32x4__ge:
890
891
321k
  case OpCode::F64x2__eq:
892
323k
  case OpCode::F64x2__ne:
893
324k
  case OpCode::F64x2__lt:
894
329k
  case OpCode::F64x2__gt:
895
331k
  case OpCode::F64x2__le:
896
335k
  case OpCode::F64x2__ge:
897
898
339k
  case OpCode::V128__not:
899
341k
  case OpCode::V128__and:
900
341k
  case OpCode::V128__andnot:
901
344k
  case OpCode::V128__or:
902
346k
  case OpCode::V128__xor:
903
347k
  case OpCode::V128__bitselect:
904
349k
  case OpCode::V128__any_true:
905
906
360k
  case OpCode::I8x16__abs:
907
374k
  case OpCode::I8x16__neg:
908
376k
  case OpCode::I8x16__popcnt:
909
378k
  case OpCode::I8x16__all_true:
910
381k
  case OpCode::I8x16__bitmask:
911
384k
  case OpCode::I8x16__narrow_i16x8_s:
912
385k
  case OpCode::I8x16__narrow_i16x8_u:
913
388k
  case OpCode::I8x16__shl:
914
391k
  case OpCode::I8x16__shr_s:
915
392k
  case OpCode::I8x16__shr_u:
916
393k
  case OpCode::I8x16__add:
917
395k
  case OpCode::I8x16__add_sat_s:
918
397k
  case OpCode::I8x16__add_sat_u:
919
402k
  case OpCode::I8x16__sub:
920
405k
  case OpCode::I8x16__sub_sat_s:
921
407k
  case OpCode::I8x16__sub_sat_u:
922
408k
  case OpCode::I8x16__min_s:
923
415k
  case OpCode::I8x16__min_u:
924
417k
  case OpCode::I8x16__max_s:
925
418k
  case OpCode::I8x16__max_u:
926
419k
  case OpCode::I8x16__avgr_u:
927
928
421k
  case OpCode::I16x8__abs:
929
422k
  case OpCode::I16x8__neg:
930
424k
  case OpCode::I16x8__all_true:
931
426k
  case OpCode::I16x8__bitmask:
932
427k
  case OpCode::I16x8__narrow_i32x4_s:
933
430k
  case OpCode::I16x8__narrow_i32x4_u:
934
435k
  case OpCode::I16x8__extend_low_i8x16_s:
935
435k
  case OpCode::I16x8__extend_high_i8x16_s:
936
437k
  case OpCode::I16x8__extend_low_i8x16_u:
937
438k
  case OpCode::I16x8__extend_high_i8x16_u:
938
439k
  case OpCode::I16x8__shl:
939
440k
  case OpCode::I16x8__shr_s:
940
441k
  case OpCode::I16x8__shr_u:
941
442k
  case OpCode::I16x8__add:
942
443k
  case OpCode::I16x8__add_sat_s:
943
446k
  case OpCode::I16x8__add_sat_u:
944
449k
  case OpCode::I16x8__sub:
945
453k
  case OpCode::I16x8__sub_sat_s:
946
454k
  case OpCode::I16x8__sub_sat_u:
947
455k
  case OpCode::I16x8__mul:
948
457k
  case OpCode::I16x8__min_s:
949
459k
  case OpCode::I16x8__min_u:
950
462k
  case OpCode::I16x8__max_s:
951
464k
  case OpCode::I16x8__max_u:
952
468k
  case OpCode::I16x8__avgr_u:
953
470k
  case OpCode::I16x8__extmul_low_i8x16_s:
954
472k
  case OpCode::I16x8__extmul_high_i8x16_s:
955
473k
  case OpCode::I16x8__extmul_low_i8x16_u:
956
478k
  case OpCode::I16x8__extmul_high_i8x16_u:
957
480k
  case OpCode::I16x8__q15mulr_sat_s:
958
482k
  case OpCode::I16x8__extadd_pairwise_i8x16_s:
959
487k
  case OpCode::I16x8__extadd_pairwise_i8x16_u:
960
961
489k
  case OpCode::I32x4__abs:
962
490k
  case OpCode::I32x4__neg:
963
493k
  case OpCode::I32x4__all_true:
964
496k
  case OpCode::I32x4__bitmask:
965
498k
  case OpCode::I32x4__extend_low_i16x8_s:
966
500k
  case OpCode::I32x4__extend_high_i16x8_s:
967
511k
  case OpCode::I32x4__extend_low_i16x8_u:
968
512k
  case OpCode::I32x4__extend_high_i16x8_u:
969
515k
  case OpCode::I32x4__shl:
970
516k
  case OpCode::I32x4__shr_s:
971
519k
  case OpCode::I32x4__shr_u:
972
520k
  case OpCode::I32x4__add:
973
522k
  case OpCode::I32x4__sub:
974
524k
  case OpCode::I32x4__mul:
975
525k
  case OpCode::I32x4__min_s:
976
526k
  case OpCode::I32x4__min_u:
977
527k
  case OpCode::I32x4__max_s:
978
529k
  case OpCode::I32x4__max_u:
979
530k
  case OpCode::I32x4__extmul_low_i16x8_s:
980
531k
  case OpCode::I32x4__extmul_high_i16x8_s:
981
532k
  case OpCode::I32x4__extmul_low_i16x8_u:
982
533k
  case OpCode::I32x4__extmul_high_i16x8_u:
983
537k
  case OpCode::I32x4__extadd_pairwise_i16x8_s:
984
545k
  case OpCode::I32x4__extadd_pairwise_i16x8_u:
985
986
547k
  case OpCode::I64x2__abs:
987
549k
  case OpCode::I64x2__neg:
988
550k
  case OpCode::I64x2__bitmask:
989
551k
  case OpCode::I64x2__extend_low_i32x4_s:
990
554k
  case OpCode::I64x2__extend_high_i32x4_s:
991
557k
  case OpCode::I64x2__extend_low_i32x4_u:
992
561k
  case OpCode::I64x2__extend_high_i32x4_u:
993
562k
  case OpCode::I64x2__shl:
994
564k
  case OpCode::I64x2__shr_s:
995
564k
  case OpCode::I64x2__shr_u:
996
566k
  case OpCode::I64x2__add:
997
568k
  case OpCode::I64x2__sub:
998
569k
  case OpCode::I64x2__mul:
999
570k
  case OpCode::I64x2__eq:
1000
572k
  case OpCode::I64x2__ne:
1001
576k
  case OpCode::I64x2__lt_s:
1002
577k
  case OpCode::I64x2__gt_s:
1003
577k
  case OpCode::I64x2__le_s:
1004
580k
  case OpCode::I64x2__ge_s:
1005
582k
  case OpCode::I64x2__all_true:
1006
583k
  case OpCode::I64x2__extmul_low_i32x4_s:
1007
585k
  case OpCode::I64x2__extmul_high_i32x4_s:
1008
586k
  case OpCode::I64x2__extmul_low_i32x4_u:
1009
588k
  case OpCode::I64x2__extmul_high_i32x4_u:
1010
1011
590k
  case OpCode::F32x4__abs:
1012
592k
  case OpCode::F32x4__neg:
1013
593k
  case OpCode::F32x4__sqrt:
1014
598k
  case OpCode::F32x4__add:
1015
600k
  case OpCode::F32x4__sub:
1016
603k
  case OpCode::F32x4__mul:
1017
604k
  case OpCode::F32x4__div:
1018
606k
  case OpCode::F32x4__min:
1019
607k
  case OpCode::F32x4__max:
1020
615k
  case OpCode::F32x4__pmin:
1021
616k
  case OpCode::F32x4__pmax:
1022
1023
619k
  case OpCode::F64x2__abs:
1024
622k
  case OpCode::F64x2__neg:
1025
623k
  case OpCode::F64x2__sqrt:
1026
625k
  case OpCode::F64x2__add:
1027
630k
  case OpCode::F64x2__sub:
1028
631k
  case OpCode::F64x2__mul:
1029
632k
  case OpCode::F64x2__div:
1030
632k
  case OpCode::F64x2__min:
1031
633k
  case OpCode::F64x2__max:
1032
635k
  case OpCode::F64x2__pmin:
1033
636k
  case OpCode::F64x2__pmax:
1034
1035
638k
  case OpCode::I32x4__trunc_sat_f32x4_s:
1036
658k
  case OpCode::I32x4__trunc_sat_f32x4_u:
1037
659k
  case OpCode::F32x4__convert_i32x4_s:
1038
664k
  case OpCode::F32x4__convert_i32x4_u:
1039
668k
  case OpCode::I32x4__trunc_sat_f64x2_s_zero:
1040
679k
  case OpCode::I32x4__trunc_sat_f64x2_u_zero:
1041
683k
  case OpCode::F64x2__convert_low_i32x4_s:
1042
691k
  case OpCode::F64x2__convert_low_i32x4_u:
1043
694k
  case OpCode::F32x4__demote_f64x2_zero:
1044
698k
  case OpCode::F64x2__promote_low_f32x4:
1045
1046
699k
  case OpCode::I32x4__dot_i16x8_s:
1047
705k
  case OpCode::F32x4__ceil:
1048
713k
  case OpCode::F32x4__floor:
1049
720k
  case OpCode::F32x4__trunc:
1050
722k
  case OpCode::F32x4__nearest:
1051
724k
  case OpCode::F64x2__ceil:
1052
727k
  case OpCode::F64x2__floor:
1053
729k
  case OpCode::F64x2__trunc:
1054
731k
  case OpCode::F64x2__nearest:
1055
731k
    return {};
1056
1057
0
  case OpCode::I8x16__relaxed_swizzle:
1058
0
  case OpCode::I32x4__relaxed_trunc_f32x4_s:
1059
0
  case OpCode::I32x4__relaxed_trunc_f32x4_u:
1060
0
  case OpCode::I32x4__relaxed_trunc_f64x2_s_zero:
1061
0
  case OpCode::I32x4__relaxed_trunc_f64x2_u_zero:
1062
0
  case OpCode::F32x4__relaxed_madd:
1063
0
  case OpCode::F32x4__relaxed_nmadd:
1064
0
  case OpCode::F64x2__relaxed_madd:
1065
0
  case OpCode::F64x2__relaxed_nmadd:
1066
0
  case OpCode::I8x16__relaxed_laneselect:
1067
0
  case OpCode::I16x8__relaxed_laneselect:
1068
0
  case OpCode::I32x4__relaxed_laneselect:
1069
0
  case OpCode::I64x2__relaxed_laneselect:
1070
0
  case OpCode::F32x4__relaxed_min:
1071
0
  case OpCode::F32x4__relaxed_max:
1072
0
  case OpCode::F64x2__relaxed_min:
1073
0
  case OpCode::F64x2__relaxed_max:
1074
0
  case OpCode::I16x8__relaxed_q15mulr_s:
1075
0
  case OpCode::I16x8__relaxed_dot_i8x16_i7x16_s:
1076
0
  case OpCode::I32x4__relaxed_dot_i8x16_i7x16_add_s:
1077
0
    return {};
1078
1079
  // Atomic Memory Instructions.
1080
1.00k
  case OpCode::Atomic__fence:
1081
1.00k
    return readCheckZero(Instr.getTargetIndex());
1082
1083
3.25k
  case OpCode::Memory__atomic__notify:
1084
6.04k
  case OpCode::Memory__atomic__wait32:
1085
6.18k
  case OpCode::Memory__atomic__wait64:
1086
1087
6.18k
  case OpCode::I32__atomic__load:
1088
6.18k
  case OpCode::I64__atomic__load:
1089
6.18k
  case OpCode::I32__atomic__load8_u:
1090
6.18k
  case OpCode::I32__atomic__load16_u:
1091
6.18k
  case OpCode::I64__atomic__load8_u:
1092
6.18k
  case OpCode::I64__atomic__load16_u:
1093
6.18k
  case OpCode::I64__atomic__load32_u:
1094
6.18k
  case OpCode::I32__atomic__store:
1095
6.18k
  case OpCode::I64__atomic__store:
1096
6.18k
  case OpCode::I32__atomic__store8:
1097
6.18k
  case OpCode::I32__atomic__store16:
1098
6.18k
  case OpCode::I64__atomic__store8:
1099
6.18k
  case OpCode::I64__atomic__store16:
1100
6.18k
  case OpCode::I64__atomic__store32:
1101
6.18k
  case OpCode::I32__atomic__rmw__add:
1102
6.18k
  case OpCode::I64__atomic__rmw__add:
1103
6.18k
  case OpCode::I32__atomic__rmw8__add_u:
1104
6.18k
  case OpCode::I32__atomic__rmw16__add_u:
1105
6.18k
  case OpCode::I64__atomic__rmw8__add_u:
1106
6.18k
  case OpCode::I64__atomic__rmw16__add_u:
1107
6.18k
  case OpCode::I64__atomic__rmw32__add_u:
1108
6.18k
  case OpCode::I32__atomic__rmw__sub:
1109
6.18k
  case OpCode::I64__atomic__rmw__sub:
1110
6.18k
  case OpCode::I32__atomic__rmw8__sub_u:
1111
6.18k
  case OpCode::I32__atomic__rmw16__sub_u:
1112
6.18k
  case OpCode::I64__atomic__rmw8__sub_u:
1113
6.18k
  case OpCode::I64__atomic__rmw16__sub_u:
1114
6.18k
  case OpCode::I64__atomic__rmw32__sub_u:
1115
6.18k
  case OpCode::I32__atomic__rmw__and:
1116
6.18k
  case OpCode::I64__atomic__rmw__and:
1117
6.18k
  case OpCode::I32__atomic__rmw8__and_u:
1118
6.18k
  case OpCode::I32__atomic__rmw16__and_u:
1119
6.18k
  case OpCode::I64__atomic__rmw8__and_u:
1120
6.18k
  case OpCode::I64__atomic__rmw16__and_u:
1121
6.18k
  case OpCode::I64__atomic__rmw32__and_u:
1122
6.18k
  case OpCode::I32__atomic__rmw__or:
1123
6.18k
  case OpCode::I64__atomic__rmw__or:
1124
6.18k
  case OpCode::I32__atomic__rmw8__or_u:
1125
6.18k
  case OpCode::I32__atomic__rmw16__or_u:
1126
6.18k
  case OpCode::I64__atomic__rmw8__or_u:
1127
6.18k
  case OpCode::I64__atomic__rmw16__or_u:
1128
6.18k
  case OpCode::I64__atomic__rmw32__or_u:
1129
6.18k
  case OpCode::I32__atomic__rmw__xor:
1130
6.18k
  case OpCode::I64__atomic__rmw__xor:
1131
6.18k
  case OpCode::I32__atomic__rmw8__xor_u:
1132
6.18k
  case OpCode::I32__atomic__rmw16__xor_u:
1133
6.18k
  case OpCode::I64__atomic__rmw8__xor_u:
1134
6.18k
  case OpCode::I64__atomic__rmw16__xor_u:
1135
6.18k
  case OpCode::I64__atomic__rmw32__xor_u:
1136
6.18k
  case OpCode::I32__atomic__rmw__xchg:
1137
6.18k
  case OpCode::I64__atomic__rmw__xchg:
1138
6.18k
  case OpCode::I32__atomic__rmw8__xchg_u:
1139
6.18k
  case OpCode::I32__atomic__rmw16__xchg_u:
1140
6.18k
  case OpCode::I64__atomic__rmw8__xchg_u:
1141
6.18k
  case OpCode::I64__atomic__rmw16__xchg_u:
1142
6.18k
  case OpCode::I64__atomic__rmw32__xchg_u:
1143
6.18k
  case OpCode::I32__atomic__rmw__cmpxchg:
1144
6.18k
  case OpCode::I64__atomic__rmw__cmpxchg:
1145
6.18k
  case OpCode::I32__atomic__rmw8__cmpxchg_u:
1146
6.18k
  case OpCode::I32__atomic__rmw16__cmpxchg_u:
1147
6.18k
  case OpCode::I64__atomic__rmw8__cmpxchg_u:
1148
6.18k
  case OpCode::I64__atomic__rmw16__cmpxchg_u:
1149
6.18k
  case OpCode::I64__atomic__rmw32__cmpxchg_u:
1150
6.18k
    return readMemImmediate();
1151
1152
0
  default:
1153
0
    assumingUnreachable();
1154
7.86M
  }
1155
7.86M
}
1156
1157
} // namespace Loader
1158
} // namespace WasmEdge