Coverage Report

Created: 2025-07-23 06:30

/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.98M
Expect<OpCode> Loader::loadOpCode() {
15
7.98M
  EXPECTED_TRY(uint8_t Prefix, FMgr.readByte());
16
17
7.98M
  if (Prefix >= 0xFBU && Prefix <= 0xFEU) {
18
    // Multi-byte OpCode case.
19
946k
    EXPECTED_TRY(uint32_t Extend, FMgr.readU32());
20
946k
    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
946k
    } else if (Prefix == 0xFCU) {
41
28.8k
      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.8k
  case EXTEND:                                                                 \
47
28.8k
    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.8k
      }
60
917k
    } else if (Prefix == 0xFDU) {
61
908k
      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
908k
  case EXTEND:                                                                 \
68
908k
    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
65
      default:
78
65
        return Unexpect(ErrCode::Value::IllegalOpCode);
79
908k
      }
80
908k
    } else {
81
8.67k
      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
8.66k
  case EXTEND:                                                                 \
89
8.66k
    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
8.67k
      }
100
8.67k
    }
101
7.03M
  } else {
102
    // Single-byte OpCode case.
103
7.03M
    switch (Prefix) {
104
0
#define UseOpCode
105
0
#define Line(NAME, STRING, PREFIX)                                             \
106
7.03M
  case PREFIX:                                                                 \
107
7.03M
    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
7.03M
    }
122
7.03M
  }
123
7.98M
}
124
125
// Load instruction sequence. See "include/loader/loader.h".
126
29.4k
Expect<AST::InstrVec> Loader::loadInstrSeq(std::optional<uint64_t> SizeBound) {
127
29.4k
  AST::InstrVec Instrs;
128
29.4k
  std::vector<std::pair<OpCode, uint32_t>> BlockStack;
129
29.4k
  uint32_t Cnt = 0;
130
29.4k
  bool IsReachEnd = false;
131
  // Read opcode until the End code of the top block.
132
7.98M
  do {
133
    // Read the opcode and check if error.
134
7.98M
    uint64_t Offset = FMgr.getOffset();
135
7.98M
    EXPECTED_TRY(OpCode Code, loadOpCode().map_error([this](auto E) {
136
7.98M
      return logLoadError(E, FMgr.getLastOffset(), ASTNodeAttr::Instruction);
137
7.98M
    }));
138
139
    // Check with proposals.
140
7.98M
    if (auto Res = Conf.isInstrNeedProposal(Code); unlikely(!!Res)) {
141
225
      return logNeedProposal(ErrCode::Value::IllegalOpCode, Res.value(), Offset,
142
225
                             ASTNodeAttr::Instruction);
143
225
    }
144
145
7.98M
    auto logIllegalOpCode = [this, &Offset,
146
7.98M
                             &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.98M
    switch (Code) {
158
103k
    case OpCode::Block:
159
163k
    case OpCode::Loop:
160
216k
    case OpCode::If:
161
    // LEGACY-EH: remove the `Try` after deprecating legacy EH.
162
216k
    case OpCode::Try:
163
216k
    case OpCode::Try_table:
164
216k
      BlockStack.emplace_back(Code, Cnt);
165
216k
      break;
166
2.59k
    case OpCode::Else: {
167
2.59k
      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.55k
      uint32_t Pos = BlockStack.back().second;
172
2.55k
      if (Instrs[Pos].getJumpElse() > 0) {
173
        // An Else instruction appeared before in this If-block.
174
3
        return logIllegalOpCode();
175
3
      }
176
2.55k
      Instrs[Pos].setJumpElse(Cnt - Pos);
177
2.55k
      break;
178
2.55k
    }
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.76M
    default:
196
7.76M
      break;
197
7.98M
    }
198
199
    // Create the instruction node and load contents.
200
7.98M
    Instrs.emplace_back(Code, static_cast<uint32_t>(Offset));
201
7.98M
    EXPECTED_TRY(loadInstruction(Instrs.back()));
202
203
7.98M
    if (Code == OpCode::End) {
204
      // Post process the End instruction.
205
53.5k
      if (BlockStack.size() > 0) {
206
27.1k
        Instrs.back().setExprLast(false);
207
27.1k
        const auto &[BackOp, Pos] = BlockStack.back();
208
27.1k
        if (BackOp == OpCode::Block || BackOp == OpCode::Loop ||
209
27.1k
            BackOp == OpCode::If) {
210
27.1k
          Instrs.back().setTryBlockLast(false);
211
          // LEGACY-EH: remove this after deprecating legacy EH.
212
27.1k
          Instrs.back().setLegacyTryBlockLast(false);
213
27.1k
          Instrs[Pos].setJumpEnd(Cnt - Pos);
214
27.1k
          if (BackOp == OpCode::If) {
215
11.1k
            if (Instrs[Pos].getJumpElse() == 0) {
216
              // If block without else. Set the else jump the same as end jump.
217
8.83k
              Instrs[Pos].setJumpElse(Cnt - Pos);
218
8.83k
            } else {
219
2.35k
              const uint32_t ElsePos = Pos + Instrs[Pos].getJumpElse();
220
2.35k
              Instrs[ElsePos].setJumpEnd(Cnt - ElsePos);
221
2.35k
            }
222
11.1k
          }
223
27.1k
        } 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.1k
        BlockStack.pop_back();
235
27.1k
      } else {
236
26.3k
        Instrs.back().setExprLast(true);
237
26.3k
        IsReachEnd = true;
238
26.3k
      }
239
7.92M
    } 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.98M
    Cnt++;
254
7.98M
  } while (!IsReachEnd);
255
256
  // Check the loaded offset should match the segment boundary.
257
26.3k
  if (SizeBound.has_value()) {
258
17.5k
    auto Offset = FMgr.getOffset();
259
17.5k
    if (Offset < SizeBound.value()) {
260
9
      return logLoadError(ErrCode::Value::JunkSection, Offset,
261
9
                          ASTNodeAttr::Instruction);
262
17.5k
    } else if (Offset > SizeBound.value()) {
263
70
      return logLoadError(ErrCode::Value::SectionSizeMismatch, Offset,
264
70
                          ASTNodeAttr::Instruction);
265
70
    }
266
17.5k
  }
267
26.3k
  return Instrs;
268
26.3k
}
269
270
// Load instruction node. See "include/loader/loader.h".
271
7.99M
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.99M
  auto ReportError = [this](auto E) {
276
567
    return logLoadError(E, FMgr.getLastOffset(), ASTNodeAttr::Instruction);
277
567
  };
278
279
7.99M
  auto readU8 = [this, ReportError](uint8_t &Dst) -> Expect<void> {
280
72.8k
    EXPECTED_TRY(Dst, FMgr.readByte().map_error(ReportError));
281
72.7k
    return {};
282
72.8k
  };
283
284
7.99M
  auto readU32 = [this, ReportError](uint32_t &Dst) -> Expect<void> {
285
499k
    EXPECTED_TRY(Dst, FMgr.readU32().map_error(ReportError));
286
499k
    return {};
287
499k
  };
288
289
7.99M
  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
156k
    EXPECTED_TRY(readU32(Instr.getMemoryOffset()));
303
156k
    return {};
304
156k
  };
305
306
7.99M
  auto readCheckZero = [this, readU8](uint32_t &Dst) -> Expect<void> {
307
25.9k
    uint8_t C = 0;
308
25.9k
    EXPECTED_TRY(readU8(C));
309
25.9k
    if (C != UINT8_C(0)) {
310
23
      return logLoadError(ErrCode::Value::ExpectedZeroByte,
311
23
                          FMgr.getLastOffset(), ASTNodeAttr::Instruction);
312
23
    }
313
25.9k
    Dst = 0;
314
25.9k
    return {};
315
25.9k
  };
316
317
7.99M
  auto readBlockType = [this, ReportError](BlockType &Dst) -> Expect<void> {
318
216k
    auto StartOffset = FMgr.getOffset();
319
    // Read the block return type.
320
216k
    EXPECTED_TRY(int64_t Code, FMgr.readS33().map_error(ReportError));
321
216k
    if (Code < 0) {
322
58.0k
      TypeCode TypeByte = static_cast<TypeCode>(Code & INT64_C(0x7F));
323
58.0k
      if (TypeByte == TypeCode::Epsilon) {
324
        // Empty case.
325
6.25k
        Dst.setEmpty();
326
51.7k
      } else {
327
        // Value type case. Seek back to the origin offset and read the
328
        // valtype.
329
51.7k
        FMgr.seek(StartOffset);
330
        // The AST node information is handled.
331
51.7k
        EXPECTED_TRY(auto Type, loadValType(ASTNodeAttr::Instruction));
332
51.7k
        Dst.setData(Type);
333
51.7k
      }
334
158k
    } else {
335
      // Type index case.
336
158k
      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
158k
      Dst.setData(static_cast<uint32_t>(Code));
342
158k
    }
343
216k
    return {};
344
216k
  };
345
346
7.99M
  switch (Instr.getOpCode()) {
347
  // Control instructions.
348
2.97M
  case OpCode::Unreachable:
349
3.28M
  case OpCode::Nop:
350
3.29M
  case OpCode::Return:
351
3.29M
  case OpCode::Throw_ref:
352
3.34M
  case OpCode::End:
353
3.35M
  case OpCode::Else:
354
  // LEGACY-EH: remove the `Catch_all` case after deprecating legacy EH.
355
3.35M
  case OpCode::Catch_all:
356
3.35M
    return {};
357
358
103k
  case OpCode::Block:
359
163k
  case OpCode::Loop:
360
216k
  case OpCode::If:
361
216k
    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.07k
  case OpCode::Br:
406
11.6k
  case OpCode::Br_if:
407
11.6k
  case OpCode::Br_on_null:
408
11.6k
  case OpCode::Br_on_non_null:
409
11.6k
    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.92k
  case OpCode::Br_table: {
418
    // Read the vector of labels.
419
6.92k
    EXPECTED_TRY(uint32_t VecCnt, loadVecCnt().map_error(ReportError));
420
6.89k
    Instr.setLabelListSize(VecCnt + 1);
421
81.1k
    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.87k
    return readU32(Instr.getLabelList()[VecCnt].TargetIndex);
426
6.89k
  }
427
428
6.80k
  case OpCode::Call:
429
6.80k
  case OpCode::Return_call:
430
6.80k
  case OpCode::Call_ref:
431
6.80k
  case OpCode::Return_call_ref:
432
6.80k
    return readU32(Instr.getTargetIndex());
433
434
7.56k
  case OpCode::Call_indirect:
435
7.56k
  case OpCode::Return_call_indirect: {
436
    // Read the type index.
437
7.56k
    EXPECTED_TRY(readU32(Instr.getTargetIndex()));
438
7.55k
    uint64_t SrcIdxOffset = FMgr.getOffset();
439
    // Read the table index.
440
7.55k
    EXPECTED_TRY(readU32(Instr.getSourceIndex()));
441
7.55k
    if ((Instr.getSourceIndex() > 0 || FMgr.getOffset() - SrcIdxOffset > 1) &&
442
7.55k
        !Conf.hasProposal(Proposal::ReferenceTypes)) {
443
0
      return logNeedProposal(ErrCode::Value::ExpectedZeroByte,
444
0
                             Proposal::ReferenceTypes, FMgr.getLastOffset(),
445
0
                             ASTNodeAttr::Instruction);
446
0
    }
447
7.55k
    return {};
448
7.55k
  }
449
450
  // Reference Instructions.
451
3.59k
  case OpCode::Ref__null:
452
3.59k
  case OpCode::Ref__test_null:
453
3.59k
  case OpCode::Ref__cast_null: {
454
    // The AST node information is handled.
455
3.59k
    EXPECTED_TRY(auto Type,
456
3.55k
                 loadHeapType(TypeCode::RefNull, ASTNodeAttr::Instruction));
457
3.55k
    Instr.setValType(Type);
458
3.55k
    return {};
459
3.59k
  }
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.59k
  case OpCode::Ref__is_null:
469
2.59k
  case OpCode::Ref__eq:
470
2.59k
  case OpCode::Ref__as_non_null:
471
2.59k
    return {};
472
11.8k
  case OpCode::Ref__func:
473
11.8k
  case OpCode::Struct__new:
474
11.8k
  case OpCode::Struct__new_default:
475
11.8k
  case OpCode::Array__new:
476
11.8k
  case OpCode::Array__new_default:
477
11.8k
  case OpCode::Array__get:
478
11.8k
  case OpCode::Array__get_s:
479
11.8k
  case OpCode::Array__get_u:
480
11.8k
  case OpCode::Array__set:
481
11.8k
  case OpCode::Array__fill:
482
11.8k
    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.7k
  case OpCode::Drop:
525
31.0k
  case OpCode::Select:
526
31.0k
    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.3k
  case OpCode::Local__get:
541
38.7k
  case OpCode::Local__set:
542
47.3k
  case OpCode::Local__tee:
543
48.5k
  case OpCode::Global__get:
544
49.5k
  case OpCode::Global__set:
545
49.5k
    return readU32(Instr.getTargetIndex());
546
547
  // Table Instructions.
548
266
  case OpCode::Table__init:
549
266
    EXPECTED_TRY(readU32(Instr.getSourceIndex()));
550
264
    [[fallthrough]];
551
2.50k
  case OpCode::Table__get:
552
3.59k
  case OpCode::Table__set:
553
4.83k
  case OpCode::Table__grow:
554
5.70k
  case OpCode::Table__size:
555
5.97k
  case OpCode::Table__fill:
556
7.27k
  case OpCode::Elem__drop:
557
7.27k
    return readU32(Instr.getTargetIndex());
558
507
  case OpCode::Table__copy:
559
507
    EXPECTED_TRY(readU32(Instr.getTargetIndex()));
560
505
    return readU32(Instr.getSourceIndex());
561
562
  // Memory Instructions.
563
4.19k
  case OpCode::I32__load:
564
10.6k
  case OpCode::I64__load:
565
10.9k
  case OpCode::F32__load:
566
13.6k
  case OpCode::F64__load:
567
16.6k
  case OpCode::I32__load8_s:
568
17.8k
  case OpCode::I32__load8_u:
569
20.1k
  case OpCode::I32__load16_s:
570
27.2k
  case OpCode::I32__load16_u:
571
31.4k
  case OpCode::I64__load8_s:
572
35.8k
  case OpCode::I64__load8_u:
573
40.8k
  case OpCode::I64__load16_s:
574
49.6k
  case OpCode::I64__load16_u:
575
53.1k
  case OpCode::I64__load32_s:
576
56.7k
  case OpCode::I64__load32_u:
577
59.0k
  case OpCode::I32__store:
578
64.1k
  case OpCode::I64__store:
579
67.2k
  case OpCode::F32__store:
580
68.3k
  case OpCode::F64__store:
581
72.0k
  case OpCode::I32__store8:
582
76.6k
  case OpCode::I32__store16:
583
79.2k
  case OpCode::I64__store8:
584
82.1k
  case OpCode::I64__store16:
585
83.4k
  case OpCode::I64__store32:
586
83.4k
    return readMemImmediate();
587
588
739
  case OpCode::Memory__init:
589
739
    if (!HasDataSection) {
590
2
      return logLoadError(ErrCode::Value::DataCountRequired, Instr.getOffset(),
591
2
                          ASTNodeAttr::Instruction);
592
2
    }
593
737
    EXPECTED_TRY(readU32(Instr.getSourceIndex()));
594
732
    [[fallthrough]];
595
8.61k
  case OpCode::Memory__grow:
596
20.0k
  case OpCode::Memory__size:
597
22.8k
  case OpCode::Memory__fill:
598
22.8k
    if (Conf.hasProposal(Proposal::MultiMemories)) {
599
0
      return readU32(Instr.getTargetIndex());
600
0
    }
601
22.8k
    return readCheckZero(Instr.getTargetIndex());
602
1.06k
  case OpCode::Memory__copy:
603
1.06k
    if (Conf.hasProposal(Proposal::MultiMemories)) {
604
0
      EXPECTED_TRY(readU32(Instr.getTargetIndex()));
605
0
      return readU32(Instr.getSourceIndex());
606
0
    }
607
1.06k
    EXPECTED_TRY(readCheckZero(Instr.getTargetIndex()));
608
1.06k
    return readCheckZero(Instr.getSourceIndex());
609
676
  case OpCode::Data__drop:
610
676
    if (!HasDataSection) {
611
1
      return logLoadError(ErrCode::Value::DataCountRequired, Instr.getOffset(),
612
1
                          ASTNodeAttr::Instruction);
613
1
    }
614
675
    return readU32(Instr.getTargetIndex());
615
616
  // Const Instructions.
617
2.01M
  case OpCode::I32__const:
618
2.01M
    EXPECTED_TRY(FMgr.readS32().map_error(ReportError).map([&](int32_t Num) {
619
2.01M
      Instr.setNum(static_cast<uint128_t>(static_cast<uint32_t>(Num)));
620
2.01M
    }));
621
2.01M
    return {};
622
280k
  case OpCode::I64__const:
623
280k
    EXPECTED_TRY(FMgr.readS64().map_error(ReportError).map([&](int64_t Num) {
624
279k
      Instr.setNum(static_cast<uint128_t>(static_cast<uint64_t>(Num)));
625
279k
    }));
626
279k
    return {};
627
39.1k
  case OpCode::F32__const:
628
39.1k
    EXPECTED_TRY(FMgr.readF32().map_error(ReportError).map([&](float Num) {
629
39.1k
      Instr.setNum(Num);
630
39.1k
    }));
631
39.1k
    return {};
632
16.0k
  case OpCode::F64__const:
633
16.0k
    EXPECTED_TRY(FMgr.readF64().map_error(ReportError).map([&](double Num) {
634
16.0k
      Instr.setNum(Num);
635
16.0k
    }));
636
16.0k
    return {};
637
638
  // Unary Numeric Instructions.
639
21.1k
  case OpCode::I32__eqz:
640
34.3k
  case OpCode::I32__clz:
641
41.0k
  case OpCode::I32__ctz:
642
119k
  case OpCode::I32__popcnt:
643
130k
  case OpCode::I64__eqz:
644
132k
  case OpCode::I64__clz:
645
135k
  case OpCode::I64__ctz:
646
152k
  case OpCode::I64__popcnt:
647
154k
  case OpCode::F32__abs:
648
157k
  case OpCode::F32__neg:
649
161k
  case OpCode::F32__ceil:
650
162k
  case OpCode::F32__floor:
651
166k
  case OpCode::F32__trunc:
652
173k
  case OpCode::F32__nearest:
653
181k
  case OpCode::F32__sqrt:
654
183k
  case OpCode::F64__abs:
655
186k
  case OpCode::F64__neg:
656
193k
  case OpCode::F64__ceil:
657
196k
  case OpCode::F64__floor:
658
198k
  case OpCode::F64__trunc:
659
199k
  case OpCode::F64__nearest:
660
206k
  case OpCode::F64__sqrt:
661
210k
  case OpCode::I32__wrap_i64:
662
216k
  case OpCode::I32__trunc_f32_s:
663
223k
  case OpCode::I32__trunc_f32_u:
664
226k
  case OpCode::I32__trunc_f64_s:
665
231k
  case OpCode::I32__trunc_f64_u:
666
240k
  case OpCode::I64__extend_i32_s:
667
245k
  case OpCode::I64__extend_i32_u:
668
248k
  case OpCode::I64__trunc_f32_s:
669
249k
  case OpCode::I64__trunc_f32_u:
670
253k
  case OpCode::I64__trunc_f64_s:
671
256k
  case OpCode::I64__trunc_f64_u:
672
263k
  case OpCode::F32__convert_i32_s:
673
268k
  case OpCode::F32__convert_i32_u:
674
272k
  case OpCode::F32__convert_i64_s:
675
276k
  case OpCode::F32__convert_i64_u:
676
278k
  case OpCode::F32__demote_f64:
677
286k
  case OpCode::F64__convert_i32_s:
678
293k
  case OpCode::F64__convert_i32_u:
679
316k
  case OpCode::F64__convert_i64_s:
680
318k
  case OpCode::F64__convert_i64_u:
681
320k
  case OpCode::F64__promote_f32:
682
325k
  case OpCode::I32__reinterpret_f32:
683
330k
  case OpCode::I64__reinterpret_f64:
684
347k
  case OpCode::F32__reinterpret_i32:
685
356k
  case OpCode::F64__reinterpret_i64:
686
366k
  case OpCode::I32__extend8_s:
687
376k
  case OpCode::I32__extend16_s:
688
378k
  case OpCode::I64__extend8_s:
689
399k
  case OpCode::I64__extend16_s:
690
406k
  case OpCode::I64__extend32_s:
691
409k
  case OpCode::I32__trunc_sat_f32_s:
692
412k
  case OpCode::I32__trunc_sat_f32_u:
693
415k
  case OpCode::I32__trunc_sat_f64_s:
694
416k
  case OpCode::I32__trunc_sat_f64_u:
695
417k
  case OpCode::I64__trunc_sat_f32_s:
696
419k
  case OpCode::I64__trunc_sat_f32_u:
697
423k
  case OpCode::I64__trunc_sat_f64_s:
698
425k
  case OpCode::I64__trunc_sat_f64_u:
699
700
  // Binary Numeric Instructions.
701
430k
  case OpCode::I32__eq:
702
433k
  case OpCode::I32__ne:
703
445k
  case OpCode::I32__lt_s:
704
469k
  case OpCode::I32__lt_u:
705
476k
  case OpCode::I32__gt_s:
706
496k
  case OpCode::I32__gt_u:
707
506k
  case OpCode::I32__le_s:
708
509k
  case OpCode::I32__le_u:
709
517k
  case OpCode::I32__ge_s:
710
522k
  case OpCode::I32__ge_u:
711
524k
  case OpCode::I64__eq:
712
529k
  case OpCode::I64__ne:
713
535k
  case OpCode::I64__lt_s:
714
537k
  case OpCode::I64__lt_u:
715
539k
  case OpCode::I64__gt_s:
716
541k
  case OpCode::I64__gt_u:
717
544k
  case OpCode::I64__le_s:
718
552k
  case OpCode::I64__le_u:
719
553k
  case OpCode::I64__ge_s:
720
555k
  case OpCode::I64__ge_u:
721
558k
  case OpCode::F32__eq:
722
560k
  case OpCode::F32__ne:
723
563k
  case OpCode::F32__lt:
724
579k
  case OpCode::F32__gt:
725
582k
  case OpCode::F32__le:
726
585k
  case OpCode::F32__ge:
727
590k
  case OpCode::F64__eq:
728
593k
  case OpCode::F64__ne:
729
596k
  case OpCode::F64__lt:
730
598k
  case OpCode::F64__gt:
731
600k
  case OpCode::F64__le:
732
605k
  case OpCode::F64__ge:
733
734
610k
  case OpCode::I32__add:
735
615k
  case OpCode::I32__sub:
736
619k
  case OpCode::I32__mul:
737
636k
  case OpCode::I32__div_s:
738
655k
  case OpCode::I32__div_u:
739
659k
  case OpCode::I32__rem_s:
740
665k
  case OpCode::I32__rem_u:
741
670k
  case OpCode::I32__and:
742
676k
  case OpCode::I32__or:
743
685k
  case OpCode::I32__xor:
744
699k
  case OpCode::I32__shl:
745
708k
  case OpCode::I32__shr_s:
746
731k
  case OpCode::I32__shr_u:
747
746k
  case OpCode::I32__rotl:
748
752k
  case OpCode::I32__rotr:
749
762k
  case OpCode::I64__add:
750
768k
  case OpCode::I64__sub:
751
772k
  case OpCode::I64__mul:
752
776k
  case OpCode::I64__div_s:
753
785k
  case OpCode::I64__div_u:
754
791k
  case OpCode::I64__rem_s:
755
794k
  case OpCode::I64__rem_u:
756
797k
  case OpCode::I64__and:
757
806k
  case OpCode::I64__or:
758
840k
  case OpCode::I64__xor:
759
842k
  case OpCode::I64__shl:
760
845k
  case OpCode::I64__shr_s:
761
849k
  case OpCode::I64__shr_u:
762
859k
  case OpCode::I64__rotl:
763
866k
  case OpCode::I64__rotr:
764
868k
  case OpCode::F32__add:
765
871k
  case OpCode::F32__sub:
766
875k
  case OpCode::F32__mul:
767
876k
  case OpCode::F32__div:
768
878k
  case OpCode::F32__min:
769
880k
  case OpCode::F32__max:
770
882k
  case OpCode::F32__copysign:
771
886k
  case OpCode::F64__add:
772
893k
  case OpCode::F64__sub:
773
894k
  case OpCode::F64__mul:
774
896k
  case OpCode::F64__div:
775
898k
  case OpCode::F64__min:
776
901k
  case OpCode::F64__max:
777
903k
  case OpCode::F64__copysign:
778
903k
    return {};
779
780
  // SIMD Memory Instruction.
781
23.3k
  case OpCode::V128__load:
782
27.3k
  case OpCode::V128__load8x8_s:
783
27.9k
  case OpCode::V128__load8x8_u:
784
29.0k
  case OpCode::V128__load16x4_s:
785
32.1k
  case OpCode::V128__load16x4_u:
786
34.5k
  case OpCode::V128__load32x2_s:
787
35.0k
  case OpCode::V128__load32x2_u:
788
36.9k
  case OpCode::V128__load8_splat:
789
40.1k
  case OpCode::V128__load16_splat:
790
42.8k
  case OpCode::V128__load32_splat:
791
44.3k
  case OpCode::V128__load64_splat:
792
48.0k
  case OpCode::V128__load32_zero:
793
48.5k
  case OpCode::V128__load64_zero:
794
49.5k
  case OpCode::V128__store:
795
49.5k
    return readMemImmediate();
796
788
  case OpCode::V128__load8_lane:
797
5.60k
  case OpCode::V128__load16_lane:
798
6.62k
  case OpCode::V128__load32_lane:
799
8.10k
  case OpCode::V128__load64_lane:
800
10.0k
  case OpCode::V128__store8_lane:
801
10.5k
  case OpCode::V128__store16_lane:
802
15.0k
  case OpCode::V128__store32_lane:
803
16.3k
  case OpCode::V128__store64_lane:
804
    // Read memory immediate.
805
16.3k
    EXPECTED_TRY(readMemImmediate());
806
    // Read lane index.
807
16.3k
    return readU8(Instr.getMemoryLane());
808
809
  // SIMD Const Instruction.
810
930
  case OpCode::V128__const:
811
  // SIMD Shuffle Instruction.
812
2.00k
  case OpCode::I8x16__shuffle: {
813
    // Read value.
814
2.00k
    uint128_t Value = 0U;
815
33.7k
    for (uint32_t I = 0U; I < 16U; ++I) {
816
31.7k
      EXPECTED_TRY(FMgr.readByte().map_error(ReportError).map([&](uint8_t B) {
817
31.7k
        Value |= static_cast<uint128_t>(static_cast<uint32_t>(B)) << (I * 8U);
818
31.7k
      }));
819
31.7k
    }
820
1.98k
    Instr.setNum(Value);
821
1.98k
    return {};
822
2.00k
  }
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.91k
  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
21.9k
  case OpCode::I64x2__extract_lane:
834
23.9k
  case OpCode::I64x2__replace_lane:
835
24.9k
  case OpCode::F32x4__extract_lane:
836
26.3k
  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
6.88k
  case OpCode::I8x16__swizzle:
844
169k
  case OpCode::I8x16__splat:
845
211k
  case OpCode::I16x8__splat:
846
221k
  case OpCode::I32x4__splat:
847
223k
  case OpCode::I64x2__splat:
848
225k
  case OpCode::F32x4__splat:
849
229k
  case OpCode::F64x2__splat:
850
851
234k
  case OpCode::I8x16__eq:
852
235k
  case OpCode::I8x16__ne:
853
238k
  case OpCode::I8x16__lt_s:
854
239k
  case OpCode::I8x16__lt_u:
855
246k
  case OpCode::I8x16__gt_s:
856
249k
  case OpCode::I8x16__gt_u:
857
250k
  case OpCode::I8x16__le_s:
858
251k
  case OpCode::I8x16__le_u:
859
252k
  case OpCode::I8x16__ge_s:
860
256k
  case OpCode::I8x16__ge_u:
861
862
261k
  case OpCode::I16x8__eq:
863
264k
  case OpCode::I16x8__ne:
864
267k
  case OpCode::I16x8__lt_s:
865
272k
  case OpCode::I16x8__lt_u:
866
276k
  case OpCode::I16x8__gt_s:
867
281k
  case OpCode::I16x8__gt_u:
868
284k
  case OpCode::I16x8__le_s:
869
285k
  case OpCode::I16x8__le_u:
870
288k
  case OpCode::I16x8__ge_s:
871
292k
  case OpCode::I16x8__ge_u:
872
873
294k
  case OpCode::I32x4__eq:
874
295k
  case OpCode::I32x4__ne:
875
299k
  case OpCode::I32x4__lt_s:
876
300k
  case OpCode::I32x4__lt_u:
877
300k
  case OpCode::I32x4__gt_s:
878
302k
  case OpCode::I32x4__gt_u:
879
308k
  case OpCode::I32x4__le_s:
880
309k
  case OpCode::I32x4__le_u:
881
310k
  case OpCode::I32x4__ge_s:
882
312k
  case OpCode::I32x4__ge_u:
883
884
322k
  case OpCode::F32x4__eq:
885
324k
  case OpCode::F32x4__ne:
886
326k
  case OpCode::F32x4__lt:
887
327k
  case OpCode::F32x4__gt:
888
330k
  case OpCode::F32x4__le:
889
331k
  case OpCode::F32x4__ge:
890
891
341k
  case OpCode::F64x2__eq:
892
343k
  case OpCode::F64x2__ne:
893
344k
  case OpCode::F64x2__lt:
894
349k
  case OpCode::F64x2__gt:
895
351k
  case OpCode::F64x2__le:
896
355k
  case OpCode::F64x2__ge:
897
898
367k
  case OpCode::V128__not:
899
368k
  case OpCode::V128__and:
900
369k
  case OpCode::V128__andnot:
901
372k
  case OpCode::V128__or:
902
374k
  case OpCode::V128__xor:
903
375k
  case OpCode::V128__bitselect:
904
377k
  case OpCode::V128__any_true:
905
906
399k
  case OpCode::I8x16__abs:
907
429k
  case OpCode::I8x16__neg:
908
431k
  case OpCode::I8x16__popcnt:
909
433k
  case OpCode::I8x16__all_true:
910
436k
  case OpCode::I8x16__bitmask:
911
438k
  case OpCode::I8x16__narrow_i16x8_s:
912
439k
  case OpCode::I8x16__narrow_i16x8_u:
913
442k
  case OpCode::I8x16__shl:
914
445k
  case OpCode::I8x16__shr_s:
915
447k
  case OpCode::I8x16__shr_u:
916
447k
  case OpCode::I8x16__add:
917
450k
  case OpCode::I8x16__add_sat_s:
918
451k
  case OpCode::I8x16__add_sat_u:
919
456k
  case OpCode::I8x16__sub:
920
459k
  case OpCode::I8x16__sub_sat_s:
921
461k
  case OpCode::I8x16__sub_sat_u:
922
463k
  case OpCode::I8x16__min_s:
923
469k
  case OpCode::I8x16__min_u:
924
471k
  case OpCode::I8x16__max_s:
925
473k
  case OpCode::I8x16__max_u:
926
474k
  case OpCode::I8x16__avgr_u:
927
928
475k
  case OpCode::I16x8__abs:
929
477k
  case OpCode::I16x8__neg:
930
478k
  case OpCode::I16x8__all_true:
931
481k
  case OpCode::I16x8__bitmask:
932
482k
  case OpCode::I16x8__narrow_i32x4_s:
933
485k
  case OpCode::I16x8__narrow_i32x4_u:
934
491k
  case OpCode::I16x8__extend_low_i8x16_s:
935
492k
  case OpCode::I16x8__extend_high_i8x16_s:
936
493k
  case OpCode::I16x8__extend_low_i8x16_u:
937
495k
  case OpCode::I16x8__extend_high_i8x16_u:
938
495k
  case OpCode::I16x8__shl:
939
496k
  case OpCode::I16x8__shr_s:
940
497k
  case OpCode::I16x8__shr_u:
941
499k
  case OpCode::I16x8__add:
942
500k
  case OpCode::I16x8__add_sat_s:
943
501k
  case OpCode::I16x8__add_sat_u:
944
505k
  case OpCode::I16x8__sub:
945
509k
  case OpCode::I16x8__sub_sat_s:
946
510k
  case OpCode::I16x8__sub_sat_u:
947
511k
  case OpCode::I16x8__mul:
948
513k
  case OpCode::I16x8__min_s:
949
514k
  case OpCode::I16x8__min_u:
950
517k
  case OpCode::I16x8__max_s:
951
519k
  case OpCode::I16x8__max_u:
952
523k
  case OpCode::I16x8__avgr_u:
953
525k
  case OpCode::I16x8__extmul_low_i8x16_s:
954
527k
  case OpCode::I16x8__extmul_high_i8x16_s:
955
528k
  case OpCode::I16x8__extmul_low_i8x16_u:
956
533k
  case OpCode::I16x8__extmul_high_i8x16_u:
957
535k
  case OpCode::I16x8__q15mulr_sat_s:
958
537k
  case OpCode::I16x8__extadd_pairwise_i8x16_s:
959
542k
  case OpCode::I16x8__extadd_pairwise_i8x16_u:
960
961
544k
  case OpCode::I32x4__abs:
962
545k
  case OpCode::I32x4__neg:
963
548k
  case OpCode::I32x4__all_true:
964
551k
  case OpCode::I32x4__bitmask:
965
552k
  case OpCode::I32x4__extend_low_i16x8_s:
966
555k
  case OpCode::I32x4__extend_high_i16x8_s:
967
566k
  case OpCode::I32x4__extend_low_i16x8_u:
968
567k
  case OpCode::I32x4__extend_high_i16x8_u:
969
570k
  case OpCode::I32x4__shl:
970
571k
  case OpCode::I32x4__shr_s:
971
574k
  case OpCode::I32x4__shr_u:
972
575k
  case OpCode::I32x4__add:
973
576k
  case OpCode::I32x4__sub:
974
578k
  case OpCode::I32x4__mul:
975
580k
  case OpCode::I32x4__min_s:
976
581k
  case OpCode::I32x4__min_u:
977
582k
  case OpCode::I32x4__max_s:
978
584k
  case OpCode::I32x4__max_u:
979
585k
  case OpCode::I32x4__extmul_low_i16x8_s:
980
586k
  case OpCode::I32x4__extmul_high_i16x8_s:
981
587k
  case OpCode::I32x4__extmul_low_i16x8_u:
982
588k
  case OpCode::I32x4__extmul_high_i16x8_u:
983
592k
  case OpCode::I32x4__extadd_pairwise_i16x8_s:
984
613k
  case OpCode::I32x4__extadd_pairwise_i16x8_u:
985
986
615k
  case OpCode::I64x2__abs:
987
617k
  case OpCode::I64x2__neg:
988
618k
  case OpCode::I64x2__bitmask:
989
619k
  case OpCode::I64x2__extend_low_i32x4_s:
990
622k
  case OpCode::I64x2__extend_high_i32x4_s:
991
626k
  case OpCode::I64x2__extend_low_i32x4_u:
992
630k
  case OpCode::I64x2__extend_high_i32x4_u:
993
631k
  case OpCode::I64x2__shl:
994
633k
  case OpCode::I64x2__shr_s:
995
633k
  case OpCode::I64x2__shr_u:
996
635k
  case OpCode::I64x2__add:
997
637k
  case OpCode::I64x2__sub:
998
638k
  case OpCode::I64x2__mul:
999
639k
  case OpCode::I64x2__eq:
1000
641k
  case OpCode::I64x2__ne:
1001
645k
  case OpCode::I64x2__lt_s:
1002
646k
  case OpCode::I64x2__gt_s:
1003
646k
  case OpCode::I64x2__le_s:
1004
649k
  case OpCode::I64x2__ge_s:
1005
651k
  case OpCode::I64x2__all_true:
1006
652k
  case OpCode::I64x2__extmul_low_i32x4_s:
1007
654k
  case OpCode::I64x2__extmul_high_i32x4_s:
1008
655k
  case OpCode::I64x2__extmul_low_i32x4_u:
1009
658k
  case OpCode::I64x2__extmul_high_i32x4_u:
1010
1011
660k
  case OpCode::F32x4__abs:
1012
662k
  case OpCode::F32x4__neg:
1013
664k
  case OpCode::F32x4__sqrt:
1014
668k
  case OpCode::F32x4__add:
1015
670k
  case OpCode::F32x4__sub:
1016
673k
  case OpCode::F32x4__mul:
1017
674k
  case OpCode::F32x4__div:
1018
676k
  case OpCode::F32x4__min:
1019
677k
  case OpCode::F32x4__max:
1020
685k
  case OpCode::F32x4__pmin:
1021
686k
  case OpCode::F32x4__pmax:
1022
1023
689k
  case OpCode::F64x2__abs:
1024
692k
  case OpCode::F64x2__neg:
1025
693k
  case OpCode::F64x2__sqrt:
1026
695k
  case OpCode::F64x2__add:
1027
700k
  case OpCode::F64x2__sub:
1028
701k
  case OpCode::F64x2__mul:
1029
702k
  case OpCode::F64x2__div:
1030
702k
  case OpCode::F64x2__min:
1031
703k
  case OpCode::F64x2__max:
1032
705k
  case OpCode::F64x2__pmin:
1033
706k
  case OpCode::F64x2__pmax:
1034
1035
708k
  case OpCode::I32x4__trunc_sat_f32x4_s:
1036
728k
  case OpCode::I32x4__trunc_sat_f32x4_u:
1037
730k
  case OpCode::F32x4__convert_i32x4_s:
1038
734k
  case OpCode::F32x4__convert_i32x4_u:
1039
738k
  case OpCode::I32x4__trunc_sat_f64x2_s_zero:
1040
749k
  case OpCode::I32x4__trunc_sat_f64x2_u_zero:
1041
753k
  case OpCode::F64x2__convert_low_i32x4_s:
1042
760k
  case OpCode::F64x2__convert_low_i32x4_u:
1043
766k
  case OpCode::F32x4__demote_f64x2_zero:
1044
771k
  case OpCode::F64x2__promote_low_f32x4:
1045
1046
773k
  case OpCode::I32x4__dot_i16x8_s:
1047
782k
  case OpCode::F32x4__ceil:
1048
792k
  case OpCode::F32x4__floor:
1049
799k
  case OpCode::F32x4__trunc:
1050
801k
  case OpCode::F32x4__nearest:
1051
803k
  case OpCode::F64x2__ceil:
1052
806k
  case OpCode::F64x2__floor:
1053
808k
  case OpCode::F64x2__trunc:
1054
810k
  case OpCode::F64x2__nearest:
1055
810k
    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.02k
  case OpCode::Atomic__fence:
1081
1.02k
    return readCheckZero(Instr.getTargetIndex());
1082
1083
3.25k
  case OpCode::Memory__atomic__notify:
1084
7.43k
  case OpCode::Memory__atomic__wait32:
1085
7.56k
  case OpCode::Memory__atomic__wait64:
1086
1087
7.56k
  case OpCode::I32__atomic__load:
1088
7.56k
  case OpCode::I64__atomic__load:
1089
7.56k
  case OpCode::I32__atomic__load8_u:
1090
7.56k
  case OpCode::I32__atomic__load16_u:
1091
7.56k
  case OpCode::I64__atomic__load8_u:
1092
7.56k
  case OpCode::I64__atomic__load16_u:
1093
7.56k
  case OpCode::I64__atomic__load32_u:
1094
7.56k
  case OpCode::I32__atomic__store:
1095
7.56k
  case OpCode::I64__atomic__store:
1096
7.56k
  case OpCode::I32__atomic__store8:
1097
7.56k
  case OpCode::I32__atomic__store16:
1098
7.56k
  case OpCode::I64__atomic__store8:
1099
7.56k
  case OpCode::I64__atomic__store16:
1100
7.56k
  case OpCode::I64__atomic__store32:
1101
7.56k
  case OpCode::I32__atomic__rmw__add:
1102
7.56k
  case OpCode::I64__atomic__rmw__add:
1103
7.56k
  case OpCode::I32__atomic__rmw8__add_u:
1104
7.56k
  case OpCode::I32__atomic__rmw16__add_u:
1105
7.56k
  case OpCode::I64__atomic__rmw8__add_u:
1106
7.56k
  case OpCode::I64__atomic__rmw16__add_u:
1107
7.56k
  case OpCode::I64__atomic__rmw32__add_u:
1108
7.56k
  case OpCode::I32__atomic__rmw__sub:
1109
7.56k
  case OpCode::I64__atomic__rmw__sub:
1110
7.56k
  case OpCode::I32__atomic__rmw8__sub_u:
1111
7.56k
  case OpCode::I32__atomic__rmw16__sub_u:
1112
7.56k
  case OpCode::I64__atomic__rmw8__sub_u:
1113
7.56k
  case OpCode::I64__atomic__rmw16__sub_u:
1114
7.56k
  case OpCode::I64__atomic__rmw32__sub_u:
1115
7.56k
  case OpCode::I32__atomic__rmw__and:
1116
7.56k
  case OpCode::I64__atomic__rmw__and:
1117
7.56k
  case OpCode::I32__atomic__rmw8__and_u:
1118
7.56k
  case OpCode::I32__atomic__rmw16__and_u:
1119
7.56k
  case OpCode::I64__atomic__rmw8__and_u:
1120
7.56k
  case OpCode::I64__atomic__rmw16__and_u:
1121
7.56k
  case OpCode::I64__atomic__rmw32__and_u:
1122
7.56k
  case OpCode::I32__atomic__rmw__or:
1123
7.56k
  case OpCode::I64__atomic__rmw__or:
1124
7.56k
  case OpCode::I32__atomic__rmw8__or_u:
1125
7.56k
  case OpCode::I32__atomic__rmw16__or_u:
1126
7.56k
  case OpCode::I64__atomic__rmw8__or_u:
1127
7.56k
  case OpCode::I64__atomic__rmw16__or_u:
1128
7.56k
  case OpCode::I64__atomic__rmw32__or_u:
1129
7.56k
  case OpCode::I32__atomic__rmw__xor:
1130
7.56k
  case OpCode::I64__atomic__rmw__xor:
1131
7.56k
  case OpCode::I32__atomic__rmw8__xor_u:
1132
7.56k
  case OpCode::I32__atomic__rmw16__xor_u:
1133
7.56k
  case OpCode::I64__atomic__rmw8__xor_u:
1134
7.56k
  case OpCode::I64__atomic__rmw16__xor_u:
1135
7.56k
  case OpCode::I64__atomic__rmw32__xor_u:
1136
7.56k
  case OpCode::I32__atomic__rmw__xchg:
1137
7.56k
  case OpCode::I64__atomic__rmw__xchg:
1138
7.56k
  case OpCode::I32__atomic__rmw8__xchg_u:
1139
7.56k
  case OpCode::I32__atomic__rmw16__xchg_u:
1140
7.56k
  case OpCode::I64__atomic__rmw8__xchg_u:
1141
7.56k
  case OpCode::I64__atomic__rmw16__xchg_u:
1142
7.56k
  case OpCode::I64__atomic__rmw32__xchg_u:
1143
7.56k
  case OpCode::I32__atomic__rmw__cmpxchg:
1144
7.56k
  case OpCode::I64__atomic__rmw__cmpxchg:
1145
7.56k
  case OpCode::I32__atomic__rmw8__cmpxchg_u:
1146
7.56k
  case OpCode::I32__atomic__rmw16__cmpxchg_u:
1147
7.56k
  case OpCode::I64__atomic__rmw8__cmpxchg_u:
1148
7.56k
  case OpCode::I64__atomic__rmw16__cmpxchg_u:
1149
7.56k
  case OpCode::I64__atomic__rmw32__cmpxchg_u:
1150
7.56k
    return readMemImmediate();
1151
1152
0
  default:
1153
0
    assumingUnreachable();
1154
7.99M
  }
1155
7.99M
}
1156
1157
} // namespace Loader
1158
} // namespace WasmEdge