Coverage Report

Created: 2025-07-11 06:21

/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
8.60M
Expect<OpCode> Loader::loadOpCode() {
15
8.60M
  EXPECTED_TRY(uint8_t Prefix, FMgr.readByte());
16
17
8.60M
  if (Prefix >= 0xFBU && Prefix <= 0xFEU) {
18
    // Multi-byte OpCode case.
19
874k
    EXPECTED_TRY(uint32_t Extend, FMgr.readU32());
20
874k
    if (Prefix == 0xFBU) {
21
50
      switch (Extend) {
22
0
#define UseOpCode
23
0
#define Line(NAME, STRING, PREFIX)
24
0
#define Line_FB(NAME, STRING, PREFIX, EXTEND)                                  \
25
46
  case EXTEND:                                                                 \
26
46
    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
4
      default:
38
4
        return Unexpect(ErrCode::Value::IllegalOpCode);
39
50
      }
40
874k
    } else if (Prefix == 0xFCU) {
41
32.0k
      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
32.0k
  case EXTEND:                                                                 \
47
32.0k
    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
10
      default:
58
10
        return Unexpect(ErrCode::Value::IllegalOpCode);
59
32.0k
      }
60
842k
    } else if (Prefix == 0xFDU) {
61
835k
      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
835k
  case EXTEND:                                                                 \
68
835k
    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
89
      default:
78
89
        return Unexpect(ErrCode::Value::IllegalOpCode);
79
835k
      }
80
835k
    } else {
81
6.73k
      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
6.72k
  case EXTEND:                                                                 \
89
6.72k
    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
7
      default:
98
7
        return Unexpect(ErrCode::Value::IllegalOpCode);
99
6.73k
      }
100
6.73k
    }
101
7.72M
  } else {
102
    // Single-byte OpCode case.
103
7.72M
    switch (Prefix) {
104
0
#define UseOpCode
105
0
#define Line(NAME, STRING, PREFIX)                                             \
106
7.72M
  case PREFIX:                                                                 \
107
7.72M
    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
184
    default:
120
184
      return Unexpect(ErrCode::Value::IllegalOpCode);
121
7.72M
    }
122
7.72M
  }
123
8.60M
}
124
125
// Load instruction sequence. See "include/loader/loader.h".
126
32.5k
Expect<AST::InstrVec> Loader::loadInstrSeq(std::optional<uint64_t> SizeBound) {
127
32.5k
  AST::InstrVec Instrs;
128
32.5k
  std::vector<std::pair<OpCode, uint32_t>> BlockStack;
129
32.5k
  uint32_t Cnt = 0;
130
32.5k
  bool IsReachEnd = false;
131
  // Read opcode until the End code of the top block.
132
8.60M
  do {
133
    // Read the opcode and check if error.
134
8.60M
    uint64_t Offset = FMgr.getOffset();
135
8.60M
    EXPECTED_TRY(OpCode Code, loadOpCode().map_error([this](auto E) {
136
8.60M
      return logLoadError(E, FMgr.getLastOffset(), ASTNodeAttr::Instruction);
137
8.60M
    }));
138
139
    // Check with proposals.
140
8.60M
    if (auto Res = Conf.isInstrNeedProposal(Code); unlikely(!!Res)) {
141
323
      return logNeedProposal(ErrCode::Value::IllegalOpCode, Res.value(), Offset,
142
323
                             ASTNodeAttr::Instruction);
143
323
    }
144
145
8.60M
    auto logIllegalOpCode = [this, &Offset,
146
8.60M
                             &SizeBound]() -> Unexpected<ErrCode> {
147
89
      if (SizeBound.has_value() && FMgr.getOffset() > SizeBound.value()) {
148
40
        return logLoadError(ErrCode::Value::ENDCodeExpected, Offset,
149
40
                            ASTNodeAttr::Instruction);
150
49
      } else {
151
49
        return logLoadError(ErrCode::Value::IllegalOpCode, Offset,
152
49
                            ASTNodeAttr::Instruction);
153
49
      }
154
89
    };
155
156
    // Process the instruction which contains a block.
157
8.60M
    switch (Code) {
158
103k
    case OpCode::Block:
159
181k
    case OpCode::Loop:
160
245k
    case OpCode::If:
161
    // LEGACY-EH: remove the `Try` after deprecating legacy EH.
162
245k
    case OpCode::Try:
163
245k
    case OpCode::Try_table:
164
245k
      BlockStack.emplace_back(Code, Cnt);
165
245k
      break;
166
2.78k
    case OpCode::Else: {
167
2.78k
      if (BlockStack.size() == 0 || BlockStack.back().first != OpCode::If) {
168
        // An Else instruction appeared outside the If-block.
169
80
        return logIllegalOpCode();
170
80
      }
171
2.70k
      uint32_t Pos = BlockStack.back().second;
172
2.70k
      if (Instrs[Pos].getJumpElse() > 0) {
173
        // An Else instruction appeared before in this If-block.
174
9
        return logIllegalOpCode();
175
9
      }
176
2.69k
      Instrs[Pos].setJumpElse(Cnt - Pos);
177
2.69k
      break;
178
2.70k
    }
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
8.35M
    default:
196
8.35M
      break;
197
8.60M
    }
198
199
    // Create the instruction node and load contents.
200
8.60M
    Instrs.emplace_back(Code, static_cast<uint32_t>(Offset));
201
8.60M
    EXPECTED_TRY(loadInstruction(Instrs.back()));
202
203
8.59M
    if (Code == OpCode::End) {
204
      // Post process the End instruction.
205
67.3k
      if (BlockStack.size() > 0) {
206
38.3k
        Instrs.back().setExprLast(false);
207
38.3k
        const auto &[BackOp, Pos] = BlockStack.back();
208
38.3k
        if (BackOp == OpCode::Block || BackOp == OpCode::Loop ||
209
38.3k
            BackOp == OpCode::If) {
210
38.3k
          Instrs.back().setTryBlockLast(false);
211
          // LEGACY-EH: remove this after deprecating legacy EH.
212
38.3k
          Instrs.back().setLegacyTryBlockLast(false);
213
38.3k
          Instrs[Pos].setJumpEnd(Cnt - Pos);
214
38.3k
          if (BackOp == OpCode::If) {
215
17.7k
            if (Instrs[Pos].getJumpElse() == 0) {
216
              // If block without else. Set the else jump the same as end jump.
217
15.3k
              Instrs[Pos].setJumpElse(Cnt - Pos);
218
15.3k
            } else {
219
2.43k
              const uint32_t ElsePos = Pos + Instrs[Pos].getJumpElse();
220
2.43k
              Instrs[ElsePos].setJumpEnd(Cnt - ElsePos);
221
2.43k
            }
222
17.7k
          }
223
38.3k
        } 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
38.3k
        BlockStack.pop_back();
235
38.3k
      } else {
236
28.9k
        Instrs.back().setExprLast(true);
237
28.9k
        IsReachEnd = true;
238
28.9k
      }
239
8.53M
    } 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
8.59M
    Cnt++;
254
8.59M
  } while (!IsReachEnd);
255
256
  // Check the loaded offset should match the segment boundary.
257
28.9k
  if (SizeBound.has_value()) {
258
19.4k
    auto Offset = FMgr.getOffset();
259
19.4k
    if (Offset < SizeBound.value()) {
260
17
      return logLoadError(ErrCode::Value::JunkSection, Offset,
261
17
                          ASTNodeAttr::Instruction);
262
19.4k
    } else if (Offset > SizeBound.value()) {
263
159
      return logLoadError(ErrCode::Value::SectionSizeMismatch, Offset,
264
159
                          ASTNodeAttr::Instruction);
265
159
    }
266
19.4k
  }
267
28.7k
  return Instrs;
268
28.9k
}
269
270
// Load instruction node. See "include/loader/loader.h".
271
8.61M
Expect<void> Loader::loadInstruction(AST::Instruction &Instr) {
272
  // Node: The instruction has checked for the proposals. Need to check their
273
  // immediates.
274
275
8.61M
  auto ReportError = [this](auto E) {
276
629
    return logLoadError(E, FMgr.getLastOffset(), ASTNodeAttr::Instruction);
277
629
  };
278
279
8.61M
  auto readU8 = [this, ReportError](uint8_t &Dst) -> Expect<void> {
280
70.6k
    EXPECTED_TRY(Dst, FMgr.readByte().map_error(ReportError));
281
70.5k
    return {};
282
70.6k
  };
283
284
8.61M
  auto readU32 = [this, ReportError](uint32_t &Dst) -> Expect<void> {
285
623k
    EXPECTED_TRY(Dst, FMgr.readU32().map_error(ReportError));
286
623k
    return {};
287
623k
  };
288
289
8.61M
  auto readMemImmediate = [this, readU32, &Instr]() -> Expect<void> {
290
189k
    Instr.getTargetIndex() = 0;
291
189k
    EXPECTED_TRY(readU32(Instr.getMemoryAlign()));
292
189k
    if (Conf.hasProposal(Proposal::MultiMemories) &&
293
189k
        Instr.getMemoryAlign() >= 64) {
294
0
      Instr.getMemoryAlign() -= 64;
295
0
      EXPECTED_TRY(readU32(Instr.getTargetIndex()));
296
0
    }
297
189k
    if (unlikely(Instr.getMemoryAlign() >= 32)) {
298
      // This is for WASM32. May change for memory64 proposal in the future.
299
288
      return logLoadError(ErrCode::Value::MalformedMemoryOpFlags,
300
288
                          FMgr.getLastOffset(), ASTNodeAttr::Instruction);
301
288
    }
302
189k
    EXPECTED_TRY(readU32(Instr.getMemoryOffset()));
303
189k
    return {};
304
189k
  };
305
306
8.61M
  auto readCheckZero = [this, readU8](uint32_t &Dst) -> Expect<void> {
307
22.7k
    uint8_t C = 0;
308
22.7k
    EXPECTED_TRY(readU8(C));
309
22.7k
    if (C != UINT8_C(0)) {
310
31
      return logLoadError(ErrCode::Value::ExpectedZeroByte,
311
31
                          FMgr.getLastOffset(), ASTNodeAttr::Instruction);
312
31
    }
313
22.7k
    Dst = 0;
314
22.7k
    return {};
315
22.7k
  };
316
317
8.61M
  auto readBlockType = [this, ReportError](BlockType &Dst) -> Expect<void> {
318
245k
    auto StartOffset = FMgr.getOffset();
319
    // Read the block return type.
320
245k
    EXPECTED_TRY(int64_t Code, FMgr.readS33().map_error(ReportError));
321
245k
    if (Code < 0) {
322
66.0k
      TypeCode TypeByte = static_cast<TypeCode>(Code & INT64_C(0x7F));
323
66.0k
      if (TypeByte == TypeCode::Epsilon) {
324
        // Empty case.
325
12.4k
        Dst.setEmpty();
326
53.5k
      } else {
327
        // Value type case. Seek back to the origin offset and read the
328
        // valtype.
329
53.5k
        FMgr.seek(StartOffset);
330
        // The AST node information is handled.
331
53.5k
        EXPECTED_TRY(auto Type, loadValType(ASTNodeAttr::Instruction));
332
53.5k
        Dst.setData(Type);
333
53.5k
      }
334
179k
    } else {
335
      // Type index case.
336
179k
      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
179k
      Dst.setData(static_cast<uint32_t>(Code));
342
179k
    }
343
245k
    return {};
344
245k
  };
345
346
8.61M
  switch (Instr.getOpCode()) {
347
  // Control instructions.
348
3.52M
  case OpCode::Unreachable:
349
3.84M
  case OpCode::Nop:
350
3.85M
  case OpCode::Return:
351
3.85M
  case OpCode::Throw_ref:
352
3.92M
  case OpCode::End:
353
3.92M
  case OpCode::Else:
354
  // LEGACY-EH: remove the `Catch_all` case after deprecating legacy EH.
355
3.92M
  case OpCode::Catch_all:
356
3.92M
    return {};
357
358
103k
  case OpCode::Block:
359
181k
  case OpCode::Loop:
360
245k
  case OpCode::If:
361
245k
    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
9.58k
  case OpCode::Br:
406
15.8k
  case OpCode::Br_if:
407
15.8k
  case OpCode::Br_on_null:
408
15.8k
  case OpCode::Br_on_non_null:
409
15.8k
    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
8.98k
  case OpCode::Br_table: {
418
    // Read the vector of labels.
419
8.98k
    EXPECTED_TRY(uint32_t VecCnt, loadVecCnt().map_error(ReportError));
420
8.95k
    Instr.setLabelListSize(VecCnt + 1);
421
84.8k
    for (uint32_t I = 0; I < VecCnt; ++I) {
422
75.8k
      EXPECTED_TRY(readU32(Instr.getLabelList()[I].TargetIndex));
423
75.8k
    }
424
    // Read default label.
425
8.93k
    return readU32(Instr.getLabelList()[VecCnt].TargetIndex);
426
8.95k
  }
427
428
12.5k
  case OpCode::Call:
429
12.5k
  case OpCode::Return_call:
430
12.5k
  case OpCode::Call_ref:
431
12.5k
  case OpCode::Return_call_ref:
432
12.5k
    return readU32(Instr.getTargetIndex());
433
434
16.6k
  case OpCode::Call_indirect:
435
16.6k
  case OpCode::Return_call_indirect: {
436
    // Read the type index.
437
16.6k
    EXPECTED_TRY(readU32(Instr.getTargetIndex()));
438
16.6k
    uint64_t SrcIdxOffset = FMgr.getOffset();
439
    // Read the table index.
440
16.6k
    EXPECTED_TRY(readU32(Instr.getSourceIndex()));
441
16.6k
    if ((Instr.getSourceIndex() > 0 || FMgr.getOffset() - SrcIdxOffset > 1) &&
442
16.6k
        !Conf.hasProposal(Proposal::ReferenceTypes)) {
443
0
      return logNeedProposal(ErrCode::Value::ExpectedZeroByte,
444
0
                             Proposal::ReferenceTypes, FMgr.getLastOffset(),
445
0
                             ASTNodeAttr::Instruction);
446
0
    }
447
16.6k
    return {};
448
16.6k
  }
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.48k
  case OpCode::Ref__is_null:
469
2.48k
  case OpCode::Ref__eq:
470
2.48k
  case OpCode::Ref__as_non_null:
471
2.48k
    return {};
472
11.3k
  case OpCode::Ref__func:
473
11.3k
  case OpCode::Struct__new:
474
11.3k
  case OpCode::Struct__new_default:
475
11.3k
  case OpCode::Array__new:
476
11.3k
  case OpCode::Array__new_default:
477
11.3k
  case OpCode::Array__get:
478
11.3k
  case OpCode::Array__get_s:
479
11.3k
  case OpCode::Array__get_u:
480
11.3k
  case OpCode::Array__set:
481
11.3k
  case OpCode::Array__fill:
482
11.3k
    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
22.2k
  case OpCode::Drop:
525
31.9k
  case OpCode::Select:
526
31.9k
    return {};
527
1.77k
  case OpCode::Select_t: {
528
    // Read the vector of value types.
529
1.77k
    EXPECTED_TRY(uint32_t VecCnt, loadVecCnt().map_error(ReportError));
530
1.77k
    Instr.setValTypeListSize(VecCnt);
531
3.60k
    for (uint32_t I = 0; I < VecCnt; ++I) {
532
      // The AST node information is handled.
533
1.84k
      EXPECTED_TRY(Instr.getValTypeList()[I],
534
1.82k
                   loadValType(ASTNodeAttr::Instruction));
535
1.82k
    }
536
1.75k
    return {};
537
1.77k
  }
538
539
  // Variable Instructions.
540
49.2k
  case OpCode::Local__get:
541
64.4k
  case OpCode::Local__set:
542
73.2k
  case OpCode::Local__tee:
543
75.5k
  case OpCode::Global__get:
544
77.0k
  case OpCode::Global__set:
545
77.0k
    return readU32(Instr.getTargetIndex());
546
547
  // Table Instructions.
548
134
  case OpCode::Table__init:
549
134
    EXPECTED_TRY(readU32(Instr.getSourceIndex()));
550
132
    [[fallthrough]];
551
3.04k
  case OpCode::Table__get:
552
4.52k
  case OpCode::Table__set:
553
5.79k
  case OpCode::Table__grow:
554
6.68k
  case OpCode::Table__size:
555
6.81k
  case OpCode::Table__fill:
556
7.58k
  case OpCode::Elem__drop:
557
7.58k
    return readU32(Instr.getTargetIndex());
558
506
  case OpCode::Table__copy:
559
506
    EXPECTED_TRY(readU32(Instr.getTargetIndex()));
560
504
    return readU32(Instr.getSourceIndex());
561
562
  // Memory Instructions.
563
5.64k
  case OpCode::I32__load:
564
12.2k
  case OpCode::I64__load:
565
12.9k
  case OpCode::F32__load:
566
16.3k
  case OpCode::F64__load:
567
19.6k
  case OpCode::I32__load8_s:
568
20.5k
  case OpCode::I32__load8_u:
569
23.4k
  case OpCode::I32__load16_s:
570
31.1k
  case OpCode::I32__load16_u:
571
35.4k
  case OpCode::I64__load8_s:
572
40.5k
  case OpCode::I64__load8_u:
573
45.8k
  case OpCode::I64__load16_s:
574
54.5k
  case OpCode::I64__load16_u:
575
57.9k
  case OpCode::I64__load32_s:
576
62.2k
  case OpCode::I64__load32_u:
577
64.8k
  case OpCode::I32__store:
578
70.0k
  case OpCode::I64__store:
579
74.3k
  case OpCode::F32__store:
580
75.7k
  case OpCode::F64__store:
581
79.8k
  case OpCode::I32__store8:
582
85.2k
  case OpCode::I32__store16:
583
87.8k
  case OpCode::I64__store8:
584
90.5k
  case OpCode::I64__store16:
585
92.5k
  case OpCode::I64__store32:
586
92.5k
    return readMemImmediate();
587
588
746
  case OpCode::Memory__init:
589
746
    if (!HasDataSection) {
590
2
      return logLoadError(ErrCode::Value::DataCountRequired, Instr.getOffset(),
591
2
                          ASTNodeAttr::Instruction);
592
2
    }
593
744
    EXPECTED_TRY(readU32(Instr.getSourceIndex()));
594
739
    [[fallthrough]];
595
8.33k
  case OpCode::Memory__grow:
596
15.5k
  case OpCode::Memory__size:
597
18.3k
  case OpCode::Memory__fill:
598
18.3k
    if (Conf.hasProposal(Proposal::MultiMemories)) {
599
0
      return readU32(Instr.getTargetIndex());
600
0
    }
601
18.3k
    return readCheckZero(Instr.getTargetIndex());
602
1.72k
  case OpCode::Memory__copy:
603
1.72k
    if (Conf.hasProposal(Proposal::MultiMemories)) {
604
0
      EXPECTED_TRY(readU32(Instr.getTargetIndex()));
605
0
      return readU32(Instr.getSourceIndex());
606
0
    }
607
1.72k
    EXPECTED_TRY(readCheckZero(Instr.getTargetIndex()));
608
1.71k
    return readCheckZero(Instr.getSourceIndex());
609
660
  case OpCode::Data__drop:
610
660
    if (!HasDataSection) {
611
1
      return logLoadError(ErrCode::Value::DataCountRequired, Instr.getOffset(),
612
1
                          ASTNodeAttr::Instruction);
613
1
    }
614
659
    return readU32(Instr.getTargetIndex());
615
616
  // Const Instructions.
617
1.87M
  case OpCode::I32__const:
618
1.87M
    EXPECTED_TRY(FMgr.readS32().map_error(ReportError).map([&](int32_t Num) {
619
1.87M
      Instr.setNum(static_cast<uint128_t>(static_cast<uint32_t>(Num)));
620
1.87M
    }));
621
1.87M
    return {};
622
264k
  case OpCode::I64__const:
623
264k
    EXPECTED_TRY(FMgr.readS64().map_error(ReportError).map([&](int64_t Num) {
624
264k
      Instr.setNum(static_cast<uint128_t>(static_cast<uint64_t>(Num)));
625
264k
    }));
626
264k
    return {};
627
36.2k
  case OpCode::F32__const:
628
36.2k
    EXPECTED_TRY(FMgr.readF32().map_error(ReportError).map([&](float Num) {
629
36.2k
      Instr.setNum(Num);
630
36.2k
    }));
631
36.2k
    return {};
632
15.3k
  case OpCode::F64__const:
633
15.3k
    EXPECTED_TRY(FMgr.readF64().map_error(ReportError).map([&](double Num) {
634
15.3k
      Instr.setNum(Num);
635
15.3k
    }));
636
15.3k
    return {};
637
638
  // Unary Numeric Instructions.
639
22.2k
  case OpCode::I32__eqz:
640
35.9k
  case OpCode::I32__clz:
641
43.4k
  case OpCode::I32__ctz:
642
102k
  case OpCode::I32__popcnt:
643
126k
  case OpCode::I64__eqz:
644
128k
  case OpCode::I64__clz:
645
131k
  case OpCode::I64__ctz:
646
152k
  case OpCode::I64__popcnt:
647
154k
  case OpCode::F32__abs:
648
157k
  case OpCode::F32__neg:
649
160k
  case OpCode::F32__ceil:
650
162k
  case OpCode::F32__floor:
651
167k
  case OpCode::F32__trunc:
652
174k
  case OpCode::F32__nearest:
653
181k
  case OpCode::F32__sqrt:
654
183k
  case OpCode::F64__abs:
655
188k
  case OpCode::F64__neg:
656
196k
  case OpCode::F64__ceil:
657
199k
  case OpCode::F64__floor:
658
201k
  case OpCode::F64__trunc:
659
202k
  case OpCode::F64__nearest:
660
210k
  case OpCode::F64__sqrt:
661
214k
  case OpCode::I32__wrap_i64:
662
220k
  case OpCode::I32__trunc_f32_s:
663
227k
  case OpCode::I32__trunc_f32_u:
664
251k
  case OpCode::I32__trunc_f64_s:
665
256k
  case OpCode::I32__trunc_f64_u:
666
264k
  case OpCode::I64__extend_i32_s:
667
275k
  case OpCode::I64__extend_i32_u:
668
277k
  case OpCode::I64__trunc_f32_s:
669
279k
  case OpCode::I64__trunc_f32_u:
670
284k
  case OpCode::I64__trunc_f64_s:
671
288k
  case OpCode::I64__trunc_f64_u:
672
295k
  case OpCode::F32__convert_i32_s:
673
299k
  case OpCode::F32__convert_i32_u:
674
303k
  case OpCode::F32__convert_i64_s:
675
307k
  case OpCode::F32__convert_i64_u:
676
308k
  case OpCode::F32__demote_f64:
677
317k
  case OpCode::F64__convert_i32_s:
678
324k
  case OpCode::F64__convert_i32_u:
679
347k
  case OpCode::F64__convert_i64_s:
680
350k
  case OpCode::F64__convert_i64_u:
681
352k
  case OpCode::F64__promote_f32:
682
362k
  case OpCode::I32__reinterpret_f32:
683
371k
  case OpCode::I64__reinterpret_f64:
684
419k
  case OpCode::F32__reinterpret_i32:
685
429k
  case OpCode::F64__reinterpret_i64:
686
437k
  case OpCode::I32__extend8_s:
687
446k
  case OpCode::I32__extend16_s:
688
448k
  case OpCode::I64__extend8_s:
689
469k
  case OpCode::I64__extend16_s:
690
476k
  case OpCode::I64__extend32_s:
691
481k
  case OpCode::I32__trunc_sat_f32_s:
692
485k
  case OpCode::I32__trunc_sat_f32_u:
693
488k
  case OpCode::I32__trunc_sat_f64_s:
694
489k
  case OpCode::I32__trunc_sat_f64_u:
695
491k
  case OpCode::I64__trunc_sat_f32_s:
696
492k
  case OpCode::I64__trunc_sat_f32_u:
697
497k
  case OpCode::I64__trunc_sat_f64_s:
698
499k
  case OpCode::I64__trunc_sat_f64_u:
699
700
  // Binary Numeric Instructions.
701
508k
  case OpCode::I32__eq:
702
513k
  case OpCode::I32__ne:
703
523k
  case OpCode::I32__lt_s:
704
554k
  case OpCode::I32__lt_u:
705
561k
  case OpCode::I32__gt_s:
706
581k
  case OpCode::I32__gt_u:
707
591k
  case OpCode::I32__le_s:
708
594k
  case OpCode::I32__le_u:
709
608k
  case OpCode::I32__ge_s:
710
614k
  case OpCode::I32__ge_u:
711
616k
  case OpCode::I64__eq:
712
621k
  case OpCode::I64__ne:
713
627k
  case OpCode::I64__lt_s:
714
631k
  case OpCode::I64__lt_u:
715
634k
  case OpCode::I64__gt_s:
716
635k
  case OpCode::I64__gt_u:
717
639k
  case OpCode::I64__le_s:
718
647k
  case OpCode::I64__le_u:
719
648k
  case OpCode::I64__ge_s:
720
652k
  case OpCode::I64__ge_u:
721
654k
  case OpCode::F32__eq:
722
656k
  case OpCode::F32__ne:
723
659k
  case OpCode::F32__lt:
724
703k
  case OpCode::F32__gt:
725
706k
  case OpCode::F32__le:
726
712k
  case OpCode::F32__ge:
727
720k
  case OpCode::F64__eq:
728
721k
  case OpCode::F64__ne:
729
725k
  case OpCode::F64__lt:
730
728k
  case OpCode::F64__gt:
731
731k
  case OpCode::F64__le:
732
754k
  case OpCode::F64__ge:
733
734
759k
  case OpCode::I32__add:
735
764k
  case OpCode::I32__sub:
736
769k
  case OpCode::I32__mul:
737
788k
  case OpCode::I32__div_s:
738
807k
  case OpCode::I32__div_u:
739
812k
  case OpCode::I32__rem_s:
740
816k
  case OpCode::I32__rem_u:
741
820k
  case OpCode::I32__and:
742
827k
  case OpCode::I32__or:
743
838k
  case OpCode::I32__xor:
744
854k
  case OpCode::I32__shl:
745
861k
  case OpCode::I32__shr_s:
746
880k
  case OpCode::I32__shr_u:
747
895k
  case OpCode::I32__rotl:
748
902k
  case OpCode::I32__rotr:
749
915k
  case OpCode::I64__add:
750
922k
  case OpCode::I64__sub:
751
936k
  case OpCode::I64__mul:
752
941k
  case OpCode::I64__div_s:
753
951k
  case OpCode::I64__div_u:
754
958k
  case OpCode::I64__rem_s:
755
963k
  case OpCode::I64__rem_u:
756
966k
  case OpCode::I64__and:
757
974k
  case OpCode::I64__or:
758
1.00M
  case OpCode::I64__xor:
759
1.01M
  case OpCode::I64__shl:
760
1.01M
  case OpCode::I64__shr_s:
761
1.01M
  case OpCode::I64__shr_u:
762
1.02M
  case OpCode::I64__rotl:
763
1.03M
  case OpCode::I64__rotr:
764
1.03M
  case OpCode::F32__add:
765
1.04M
  case OpCode::F32__sub:
766
1.07M
  case OpCode::F32__mul:
767
1.07M
  case OpCode::F32__div:
768
1.07M
  case OpCode::F32__min:
769
1.07M
  case OpCode::F32__max:
770
1.07M
  case OpCode::F32__copysign:
771
1.08M
  case OpCode::F64__add:
772
1.08M
  case OpCode::F64__sub:
773
1.09M
  case OpCode::F64__mul:
774
1.09M
  case OpCode::F64__div:
775
1.09M
  case OpCode::F64__min:
776
1.10M
  case OpCode::F64__max:
777
1.10M
  case OpCode::F64__copysign:
778
1.10M
    return {};
779
780
  // SIMD Memory Instruction.
781
46.0k
  case OpCode::V128__load:
782
50.2k
  case OpCode::V128__load8x8_s:
783
50.8k
  case OpCode::V128__load8x8_u:
784
52.0k
  case OpCode::V128__load16x4_s:
785
55.0k
  case OpCode::V128__load16x4_u:
786
57.4k
  case OpCode::V128__load32x2_s:
787
57.8k
  case OpCode::V128__load32x2_u:
788
59.6k
  case OpCode::V128__load8_splat:
789
65.3k
  case OpCode::V128__load16_splat:
790
67.8k
  case OpCode::V128__load32_splat:
791
69.2k
  case OpCode::V128__load64_splat:
792
72.9k
  case OpCode::V128__load32_zero:
793
73.5k
  case OpCode::V128__load64_zero:
794
74.5k
  case OpCode::V128__store:
795
74.5k
    return readMemImmediate();
796
904
  case OpCode::V128__load8_lane:
797
5.81k
  case OpCode::V128__load16_lane:
798
6.91k
  case OpCode::V128__load32_lane:
799
8.43k
  case OpCode::V128__load64_lane:
800
10.3k
  case OpCode::V128__store8_lane:
801
10.6k
  case OpCode::V128__store16_lane:
802
15.3k
  case OpCode::V128__store32_lane:
803
16.7k
  case OpCode::V128__store64_lane:
804
    // Read memory immediate.
805
16.7k
    EXPECTED_TRY(readMemImmediate());
806
    // Read lane index.
807
16.6k
    return readU8(Instr.getMemoryLane());
808
809
  // SIMD Const Instruction.
810
1.07k
  case OpCode::V128__const:
811
  // SIMD Shuffle Instruction.
812
2.15k
  case OpCode::I8x16__shuffle: {
813
    // Read value.
814
2.15k
    uint128_t Value = 0U;
815
36.3k
    for (uint32_t I = 0U; I < 16U; ++I) {
816
34.2k
      EXPECTED_TRY(FMgr.readByte().map_error(ReportError).map([&](uint8_t B) {
817
34.2k
        Value |= static_cast<uint128_t>(static_cast<uint32_t>(B)) << (I * 8U);
818
34.2k
      }));
819
34.2k
    }
820
2.13k
    Instr.setNum(Value);
821
2.13k
    return {};
822
2.15k
  }
823
824
  // SIMD Lane Instructions.
825
4.33k
  case OpCode::I8x16__extract_lane_s:
826
4.96k
  case OpCode::I8x16__extract_lane_u:
827
8.38k
  case OpCode::I8x16__replace_lane:
828
11.8k
  case OpCode::I16x8__extract_lane_s:
829
13.2k
  case OpCode::I16x8__extract_lane_u:
830
15.0k
  case OpCode::I16x8__replace_lane:
831
20.3k
  case OpCode::I32x4__extract_lane:
832
21.7k
  case OpCode::I32x4__replace_lane:
833
22.8k
  case OpCode::I64x2__extract_lane:
834
24.7k
  case OpCode::I64x2__replace_lane:
835
25.4k
  case OpCode::F32x4__extract_lane:
836
27.2k
  case OpCode::F32x4__replace_lane:
837
28.7k
  case OpCode::F64x2__extract_lane:
838
31.1k
  case OpCode::F64x2__replace_lane:
839
    // Read lane index.
840
31.1k
    return readU8(Instr.getMemoryLane());
841
842
  // SIMD Numeric Instructions.
843
5.79k
  case OpCode::I8x16__swizzle:
844
138k
  case OpCode::I8x16__splat:
845
178k
  case OpCode::I16x8__splat:
846
187k
  case OpCode::I32x4__splat:
847
189k
  case OpCode::I64x2__splat:
848
191k
  case OpCode::F32x4__splat:
849
195k
  case OpCode::F64x2__splat:
850
851
199k
  case OpCode::I8x16__eq:
852
200k
  case OpCode::I8x16__ne:
853
203k
  case OpCode::I8x16__lt_s:
854
205k
  case OpCode::I8x16__lt_u:
855
209k
  case OpCode::I8x16__gt_s:
856
211k
  case OpCode::I8x16__gt_u:
857
212k
  case OpCode::I8x16__le_s:
858
213k
  case OpCode::I8x16__le_u:
859
215k
  case OpCode::I8x16__ge_s:
860
218k
  case OpCode::I8x16__ge_u:
861
862
220k
  case OpCode::I16x8__eq:
863
223k
  case OpCode::I16x8__ne:
864
227k
  case OpCode::I16x8__lt_s:
865
231k
  case OpCode::I16x8__lt_u:
866
235k
  case OpCode::I16x8__gt_s:
867
244k
  case OpCode::I16x8__gt_u:
868
246k
  case OpCode::I16x8__le_s:
869
249k
  case OpCode::I16x8__le_u:
870
254k
  case OpCode::I16x8__ge_s:
871
258k
  case OpCode::I16x8__ge_u:
872
873
260k
  case OpCode::I32x4__eq:
874
264k
  case OpCode::I32x4__ne:
875
267k
  case OpCode::I32x4__lt_s:
876
268k
  case OpCode::I32x4__lt_u:
877
269k
  case OpCode::I32x4__gt_s:
878
271k
  case OpCode::I32x4__gt_u:
879
276k
  case OpCode::I32x4__le_s:
880
277k
  case OpCode::I32x4__le_u:
881
278k
  case OpCode::I32x4__ge_s:
882
281k
  case OpCode::I32x4__ge_u:
883
884
294k
  case OpCode::F32x4__eq:
885
296k
  case OpCode::F32x4__ne:
886
298k
  case OpCode::F32x4__lt:
887
300k
  case OpCode::F32x4__gt:
888
304k
  case OpCode::F32x4__le:
889
306k
  case OpCode::F32x4__ge:
890
891
316k
  case OpCode::F64x2__eq:
892
318k
  case OpCode::F64x2__ne:
893
319k
  case OpCode::F64x2__lt:
894
323k
  case OpCode::F64x2__gt:
895
325k
  case OpCode::F64x2__le:
896
329k
  case OpCode::F64x2__ge:
897
898
332k
  case OpCode::V128__not:
899
333k
  case OpCode::V128__and:
900
334k
  case OpCode::V128__andnot:
901
337k
  case OpCode::V128__or:
902
339k
  case OpCode::V128__xor:
903
340k
  case OpCode::V128__bitselect:
904
342k
  case OpCode::V128__any_true:
905
906
351k
  case OpCode::I8x16__abs:
907
361k
  case OpCode::I8x16__neg:
908
362k
  case OpCode::I8x16__popcnt:
909
364k
  case OpCode::I8x16__all_true:
910
369k
  case OpCode::I8x16__bitmask:
911
371k
  case OpCode::I8x16__narrow_i16x8_s:
912
372k
  case OpCode::I8x16__narrow_i16x8_u:
913
375k
  case OpCode::I8x16__shl:
914
378k
  case OpCode::I8x16__shr_s:
915
379k
  case OpCode::I8x16__shr_u:
916
380k
  case OpCode::I8x16__add:
917
383k
  case OpCode::I8x16__add_sat_s:
918
384k
  case OpCode::I8x16__add_sat_u:
919
389k
  case OpCode::I8x16__sub:
920
393k
  case OpCode::I8x16__sub_sat_s:
921
395k
  case OpCode::I8x16__sub_sat_u:
922
396k
  case OpCode::I8x16__min_s:
923
402k
  case OpCode::I8x16__min_u:
924
404k
  case OpCode::I8x16__max_s:
925
406k
  case OpCode::I8x16__max_u:
926
407k
  case OpCode::I8x16__avgr_u:
927
928
409k
  case OpCode::I16x8__abs:
929
410k
  case OpCode::I16x8__neg:
930
411k
  case OpCode::I16x8__all_true:
931
414k
  case OpCode::I16x8__bitmask:
932
415k
  case OpCode::I16x8__narrow_i32x4_s:
933
417k
  case OpCode::I16x8__narrow_i32x4_u:
934
421k
  case OpCode::I16x8__extend_low_i8x16_s:
935
422k
  case OpCode::I16x8__extend_high_i8x16_s:
936
423k
  case OpCode::I16x8__extend_low_i8x16_u:
937
424k
  case OpCode::I16x8__extend_high_i8x16_u:
938
425k
  case OpCode::I16x8__shl:
939
426k
  case OpCode::I16x8__shr_s:
940
426k
  case OpCode::I16x8__shr_u:
941
428k
  case OpCode::I16x8__add:
942
430k
  case OpCode::I16x8__add_sat_s:
943
432k
  case OpCode::I16x8__add_sat_u:
944
436k
  case OpCode::I16x8__sub:
945
441k
  case OpCode::I16x8__sub_sat_s:
946
443k
  case OpCode::I16x8__sub_sat_u:
947
444k
  case OpCode::I16x8__mul:
948
446k
  case OpCode::I16x8__min_s:
949
447k
  case OpCode::I16x8__min_u:
950
450k
  case OpCode::I16x8__max_s:
951
452k
  case OpCode::I16x8__max_u:
952
456k
  case OpCode::I16x8__avgr_u:
953
458k
  case OpCode::I16x8__extmul_low_i8x16_s:
954
459k
  case OpCode::I16x8__extmul_high_i8x16_s:
955
460k
  case OpCode::I16x8__extmul_low_i8x16_u:
956
465k
  case OpCode::I16x8__extmul_high_i8x16_u:
957
467k
  case OpCode::I16x8__q15mulr_sat_s:
958
470k
  case OpCode::I16x8__extadd_pairwise_i8x16_s:
959
474k
  case OpCode::I16x8__extadd_pairwise_i8x16_u:
960
961
476k
  case OpCode::I32x4__abs:
962
477k
  case OpCode::I32x4__neg:
963
480k
  case OpCode::I32x4__all_true:
964
484k
  case OpCode::I32x4__bitmask:
965
486k
  case OpCode::I32x4__extend_low_i16x8_s:
966
488k
  case OpCode::I32x4__extend_high_i16x8_s:
967
498k
  case OpCode::I32x4__extend_low_i16x8_u:
968
500k
  case OpCode::I32x4__extend_high_i16x8_u:
969
503k
  case OpCode::I32x4__shl:
970
504k
  case OpCode::I32x4__shr_s:
971
506k
  case OpCode::I32x4__shr_u:
972
508k
  case OpCode::I32x4__add:
973
509k
  case OpCode::I32x4__sub:
974
511k
  case OpCode::I32x4__mul:
975
512k
  case OpCode::I32x4__min_s:
976
514k
  case OpCode::I32x4__min_u:
977
515k
  case OpCode::I32x4__max_s:
978
516k
  case OpCode::I32x4__max_u:
979
518k
  case OpCode::I32x4__extmul_low_i16x8_s:
980
519k
  case OpCode::I32x4__extmul_high_i16x8_s:
981
519k
  case OpCode::I32x4__extmul_low_i16x8_u:
982
521k
  case OpCode::I32x4__extmul_high_i16x8_u:
983
527k
  case OpCode::I32x4__extadd_pairwise_i16x8_s:
984
533k
  case OpCode::I32x4__extadd_pairwise_i16x8_u:
985
986
535k
  case OpCode::I64x2__abs:
987
537k
  case OpCode::I64x2__neg:
988
538k
  case OpCode::I64x2__bitmask:
989
539k
  case OpCode::I64x2__extend_low_i32x4_s:
990
542k
  case OpCode::I64x2__extend_high_i32x4_s:
991
544k
  case OpCode::I64x2__extend_low_i32x4_u:
992
549k
  case OpCode::I64x2__extend_high_i32x4_u:
993
549k
  case OpCode::I64x2__shl:
994
552k
  case OpCode::I64x2__shr_s:
995
552k
  case OpCode::I64x2__shr_u:
996
554k
  case OpCode::I64x2__add:
997
555k
  case OpCode::I64x2__sub:
998
557k
  case OpCode::I64x2__mul:
999
558k
  case OpCode::I64x2__eq:
1000
560k
  case OpCode::I64x2__ne:
1001
563k
  case OpCode::I64x2__lt_s:
1002
564k
  case OpCode::I64x2__gt_s:
1003
564k
  case OpCode::I64x2__le_s:
1004
568k
  case OpCode::I64x2__ge_s:
1005
570k
  case OpCode::I64x2__all_true:
1006
571k
  case OpCode::I64x2__extmul_low_i32x4_s:
1007
573k
  case OpCode::I64x2__extmul_high_i32x4_s:
1008
574k
  case OpCode::I64x2__extmul_low_i32x4_u:
1009
577k
  case OpCode::I64x2__extmul_high_i32x4_u:
1010
1011
578k
  case OpCode::F32x4__abs:
1012
580k
  case OpCode::F32x4__neg:
1013
580k
  case OpCode::F32x4__sqrt:
1014
585k
  case OpCode::F32x4__add:
1015
587k
  case OpCode::F32x4__sub:
1016
589k
  case OpCode::F32x4__mul:
1017
590k
  case OpCode::F32x4__div:
1018
592k
  case OpCode::F32x4__min:
1019
593k
  case OpCode::F32x4__max:
1020
601k
  case OpCode::F32x4__pmin:
1021
602k
  case OpCode::F32x4__pmax:
1022
1023
605k
  case OpCode::F64x2__abs:
1024
608k
  case OpCode::F64x2__neg:
1025
609k
  case OpCode::F64x2__sqrt:
1026
611k
  case OpCode::F64x2__add:
1027
616k
  case OpCode::F64x2__sub:
1028
617k
  case OpCode::F64x2__mul:
1029
618k
  case OpCode::F64x2__div:
1030
618k
  case OpCode::F64x2__min:
1031
619k
  case OpCode::F64x2__max:
1032
621k
  case OpCode::F64x2__pmin:
1033
622k
  case OpCode::F64x2__pmax:
1034
1035
624k
  case OpCode::I32x4__trunc_sat_f32x4_s:
1036
644k
  case OpCode::I32x4__trunc_sat_f32x4_u:
1037
645k
  case OpCode::F32x4__convert_i32x4_s:
1038
650k
  case OpCode::F32x4__convert_i32x4_u:
1039
654k
  case OpCode::I32x4__trunc_sat_f64x2_s_zero:
1040
665k
  case OpCode::I32x4__trunc_sat_f64x2_u_zero:
1041
668k
  case OpCode::F64x2__convert_low_i32x4_s:
1042
676k
  case OpCode::F64x2__convert_low_i32x4_u:
1043
679k
  case OpCode::F32x4__demote_f64x2_zero:
1044
682k
  case OpCode::F64x2__promote_low_f32x4:
1045
1046
683k
  case OpCode::I32x4__dot_i16x8_s:
1047
687k
  case OpCode::F32x4__ceil:
1048
694k
  case OpCode::F32x4__floor:
1049
700k
  case OpCode::F32x4__trunc:
1050
702k
  case OpCode::F32x4__nearest:
1051
704k
  case OpCode::F64x2__ceil:
1052
706k
  case OpCode::F64x2__floor:
1053
708k
  case OpCode::F64x2__trunc:
1054
710k
  case OpCode::F64x2__nearest:
1055
710k
    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
984
  case OpCode::Atomic__fence:
1081
984
    return readCheckZero(Instr.getTargetIndex());
1082
1083
3.15k
  case OpCode::Memory__atomic__notify:
1084
5.54k
  case OpCode::Memory__atomic__wait32:
1085
5.66k
  case OpCode::Memory__atomic__wait64:
1086
1087
5.66k
  case OpCode::I32__atomic__load:
1088
5.66k
  case OpCode::I64__atomic__load:
1089
5.66k
  case OpCode::I32__atomic__load8_u:
1090
5.66k
  case OpCode::I32__atomic__load16_u:
1091
5.66k
  case OpCode::I64__atomic__load8_u:
1092
5.66k
  case OpCode::I64__atomic__load16_u:
1093
5.66k
  case OpCode::I64__atomic__load32_u:
1094
5.66k
  case OpCode::I32__atomic__store:
1095
5.66k
  case OpCode::I64__atomic__store:
1096
5.66k
  case OpCode::I32__atomic__store8:
1097
5.66k
  case OpCode::I32__atomic__store16:
1098
5.66k
  case OpCode::I64__atomic__store8:
1099
5.66k
  case OpCode::I64__atomic__store16:
1100
5.66k
  case OpCode::I64__atomic__store32:
1101
5.66k
  case OpCode::I32__atomic__rmw__add:
1102
5.66k
  case OpCode::I64__atomic__rmw__add:
1103
5.66k
  case OpCode::I32__atomic__rmw8__add_u:
1104
5.66k
  case OpCode::I32__atomic__rmw16__add_u:
1105
5.66k
  case OpCode::I64__atomic__rmw8__add_u:
1106
5.66k
  case OpCode::I64__atomic__rmw16__add_u:
1107
5.66k
  case OpCode::I64__atomic__rmw32__add_u:
1108
5.66k
  case OpCode::I32__atomic__rmw__sub:
1109
5.66k
  case OpCode::I64__atomic__rmw__sub:
1110
5.66k
  case OpCode::I32__atomic__rmw8__sub_u:
1111
5.66k
  case OpCode::I32__atomic__rmw16__sub_u:
1112
5.66k
  case OpCode::I64__atomic__rmw8__sub_u:
1113
5.66k
  case OpCode::I64__atomic__rmw16__sub_u:
1114
5.66k
  case OpCode::I64__atomic__rmw32__sub_u:
1115
5.66k
  case OpCode::I32__atomic__rmw__and:
1116
5.66k
  case OpCode::I64__atomic__rmw__and:
1117
5.66k
  case OpCode::I32__atomic__rmw8__and_u:
1118
5.66k
  case OpCode::I32__atomic__rmw16__and_u:
1119
5.66k
  case OpCode::I64__atomic__rmw8__and_u:
1120
5.66k
  case OpCode::I64__atomic__rmw16__and_u:
1121
5.66k
  case OpCode::I64__atomic__rmw32__and_u:
1122
5.66k
  case OpCode::I32__atomic__rmw__or:
1123
5.66k
  case OpCode::I64__atomic__rmw__or:
1124
5.66k
  case OpCode::I32__atomic__rmw8__or_u:
1125
5.66k
  case OpCode::I32__atomic__rmw16__or_u:
1126
5.66k
  case OpCode::I64__atomic__rmw8__or_u:
1127
5.66k
  case OpCode::I64__atomic__rmw16__or_u:
1128
5.66k
  case OpCode::I64__atomic__rmw32__or_u:
1129
5.66k
  case OpCode::I32__atomic__rmw__xor:
1130
5.66k
  case OpCode::I64__atomic__rmw__xor:
1131
5.66k
  case OpCode::I32__atomic__rmw8__xor_u:
1132
5.66k
  case OpCode::I32__atomic__rmw16__xor_u:
1133
5.66k
  case OpCode::I64__atomic__rmw8__xor_u:
1134
5.66k
  case OpCode::I64__atomic__rmw16__xor_u:
1135
5.66k
  case OpCode::I64__atomic__rmw32__xor_u:
1136
5.66k
  case OpCode::I32__atomic__rmw__xchg:
1137
5.66k
  case OpCode::I64__atomic__rmw__xchg:
1138
5.66k
  case OpCode::I32__atomic__rmw8__xchg_u:
1139
5.66k
  case OpCode::I32__atomic__rmw16__xchg_u:
1140
5.66k
  case OpCode::I64__atomic__rmw8__xchg_u:
1141
5.66k
  case OpCode::I64__atomic__rmw16__xchg_u:
1142
5.66k
  case OpCode::I64__atomic__rmw32__xchg_u:
1143
5.66k
  case OpCode::I32__atomic__rmw__cmpxchg:
1144
5.66k
  case OpCode::I64__atomic__rmw__cmpxchg:
1145
5.66k
  case OpCode::I32__atomic__rmw8__cmpxchg_u:
1146
5.66k
  case OpCode::I32__atomic__rmw16__cmpxchg_u:
1147
5.66k
  case OpCode::I64__atomic__rmw8__cmpxchg_u:
1148
5.66k
  case OpCode::I64__atomic__rmw16__cmpxchg_u:
1149
5.66k
  case OpCode::I64__atomic__rmw32__cmpxchg_u:
1150
5.66k
    return readMemImmediate();
1151
1152
0
  default:
1153
0
    assumingUnreachable();
1154
8.61M
  }
1155
8.61M
}
1156
1157
} // namespace Loader
1158
} // namespace WasmEdge