Coverage Report

Created: 2025-07-01 06:18

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