Coverage Report

Created: 2026-11-12 06:35

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/WasmEdge/lib/loader/ast/instruction.cpp
Line
Count
Source
1
// SPDX-License-Identifier: Apache-2.0
2
// SPDX-FileCopyrightText: Copyright The WasmEdge Authors
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
40.9M
Expect<OpCode> Loader::loadOpCode() {
15
40.9M
  EXPECTED_TRY(uint8_t Prefix, FMgr.readByte());
16
17
40.9M
  if (Prefix >= 0xFBU && Prefix <= 0xFEU) {
18
    // Multi-byte OpCode case.
19
2.09M
    EXPECTED_TRY(uint32_t Extend, FMgr.readU32());
20
2.09M
    if (Prefix == 0xFBU) {
21
59.0k
      switch (Extend) {
22
0
#define UseOpCode
23
0
#define Line(NAME, STRING, PREFIX)
24
0
#define Line_FB(NAME, STRING, PREFIX, EXTEND)                                  \
25
59.0k
  case EXTEND:                                                                 \
26
59.0k
    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
10
      default:
38
10
        return Unexpect(ErrCode::Value::IllegalOpCode);
39
59.0k
      }
40
2.03M
    } else if (Prefix == 0xFCU) {
41
60.3k
      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
60.3k
  case EXTEND:                                                                 \
47
60.3k
    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
17
      default:
58
17
        return Unexpect(ErrCode::Value::IllegalOpCode);
59
60.3k
      }
60
1.97M
    } else if (Prefix == 0xFDU) {
61
1.95M
      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
1.95M
  case EXTEND:                                                                 \
68
1.95M
    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
157
      default:
78
157
        return Unexpect(ErrCode::Value::IllegalOpCode);
79
1.95M
      }
80
1.95M
    } else {
81
19.0k
      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
19.0k
  case EXTEND:                                                                 \
89
19.0k
    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
10
      default:
98
10
        return Unexpect(ErrCode::Value::IllegalOpCode);
99
19.0k
      }
100
19.0k
    }
101
38.8M
  } else {
102
    // Single-byte OpCode case.
103
38.8M
    switch (Prefix) {
104
0
#define UseOpCode
105
0
#define Line(NAME, STRING, PREFIX)                                             \
106
38.8M
  case PREFIX:                                                                 \
107
38.8M
    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
450
    default:
120
450
      return Unexpect(ErrCode::Value::IllegalOpCode);
121
38.8M
    }
122
38.8M
  }
123
40.9M
}
124
125
// Load instruction sequence. See "include/loader/loader.h".
126
61.6k
Expect<AST::InstrVec> Loader::loadInstrSeq(std::optional<uint64_t> SizeBound) {
127
61.6k
  AST::InstrVec Instrs;
128
61.6k
  std::vector<std::pair<OpCode, uint32_t>> BlockStack;
129
61.6k
  uint32_t Cnt = 0;
130
61.6k
  bool IsReachEnd = false;
131
  // Read opcode until the End code of the top block.
132
40.9M
  do {
133
    // Read the opcode and check for errors.
134
40.9M
    uint64_t Offset = FMgr.getOffset();
135
40.9M
    EXPECTED_TRY(OpCode Code, loadOpCode().map_error([this](auto E) {
136
40.9M
      return logLoadError(E, FMgr.getLastOffset(), ASTNodeAttr::Instruction);
137
40.9M
    }));
138
139
    // Check with proposals.
140
40.9M
    if (auto Res = Conf.isInstrNeedProposal(Code); unlikely(!!Res)) {
141
257
      return logNeedProposal(ErrCode::Value::IllegalOpCode, Res.value(), Offset,
142
257
                             ASTNodeAttr::Instruction);
143
257
    }
144
145
40.9M
    auto logIllegalOpCode = [this, &Offset,
146
40.9M
                             &SizeBound]() -> Unexpected<ErrCode> {
147
127
      if (SizeBound.has_value() && FMgr.getOffset() > SizeBound.value()) {
148
51
        return logLoadError(ErrCode::Value::ENDCodeExpected, Offset,
149
51
                            ASTNodeAttr::Instruction);
150
76
      } else {
151
76
        return logLoadError(ErrCode::Value::IllegalOpCode, Offset,
152
76
                            ASTNodeAttr::Instruction);
153
76
      }
154
127
    };
155
156
    // Process the instruction that contains a block.
157
40.9M
    switch (Code) {
158
509k
    case OpCode::Block:
159
1.72M
    case OpCode::Loop:
160
1.95M
    case OpCode::If:
161
1.96M
    case OpCode::Try_table:
162
1.96M
      BlockStack.emplace_back(Code, Cnt);
163
1.96M
      break;
164
28.0k
    case OpCode::Else: {
165
28.0k
      if (BlockStack.size() == 0 || BlockStack.back().first != OpCode::If) {
166
        // An Else instruction appeared outside the If-block.
167
111
        return logIllegalOpCode();
168
111
      }
169
27.9k
      uint32_t Pos = BlockStack.back().second;
170
27.9k
      if (Instrs[Pos].getJumpElse() > 0) {
171
        // An Else instruction appeared before in this If-block.
172
16
        return logIllegalOpCode();
173
16
      }
174
27.9k
      Instrs[Pos].setJumpElse(Cnt - Pos);
175
27.9k
      break;
176
27.9k
    }
177
38.9M
    default:
178
38.9M
      break;
179
40.9M
    }
180
181
    // Create the instruction node and load contents.
182
40.9M
    Instrs.emplace_back(Code, static_cast<uint32_t>(Offset));
183
40.9M
    EXPECTED_TRY(loadInstruction(Instrs.back()));
184
185
40.9M
    if (Code == OpCode::End) {
186
      // Post process the End instruction.
187
127k
      if (BlockStack.size() > 0) {
188
74.1k
        Instrs.back().setExprLast(false);
189
74.1k
        const auto &[BackOp, Pos] = BlockStack.back();
190
74.1k
        if (BackOp == OpCode::Block || BackOp == OpCode::Loop ||
191
65.7k
            BackOp == OpCode::If) {
192
65.7k
          Instrs.back().setTryBlockLast(false);
193
65.7k
          Instrs[Pos].setJumpEnd(Cnt - Pos);
194
65.7k
          if (BackOp == OpCode::If) {
195
21.0k
            if (Instrs[Pos].getJumpElse() == 0) {
196
              // For an if block without an else branch, set the else jump to
197
              // the end jump.
198
16.0k
              Instrs[Pos].setJumpElse(Cnt - Pos);
199
16.0k
            } else {
200
4.96k
              const uint32_t ElsePos = Pos + Instrs[Pos].getJumpElse();
201
4.96k
              Instrs[ElsePos].setJumpEnd(Cnt - ElsePos);
202
4.96k
            }
203
21.0k
          }
204
65.7k
        } else if (BackOp == OpCode::Try_table) {
205
8.41k
          Instrs.back().setTryBlockLast(true);
206
8.41k
          Instrs[Pos].getTryCatch().JumpEnd = Cnt - Pos;
207
8.41k
        }
208
74.1k
        BlockStack.pop_back();
209
74.1k
      } else {
210
52.8k
        Instrs.back().setExprLast(true);
211
52.8k
        IsReachEnd = true;
212
52.8k
      }
213
127k
    }
214
40.9M
    Cnt++;
215
40.9M
  } while (!IsReachEnd);
216
217
  // Check the loaded offset should match the segment boundary.
218
52.8k
  if (SizeBound.has_value()) {
219
31.7k
    auto Offset = FMgr.getOffset();
220
31.7k
    if (Offset < SizeBound.value()) {
221
33
      return logLoadError(ErrCode::Value::JunkSection, Offset,
222
33
                          ASTNodeAttr::Instruction);
223
31.6k
    } else if (Offset > SizeBound.value()) {
224
93
      return logLoadError(ErrCode::Value::SectionSizeMismatch, Offset,
225
93
                          ASTNodeAttr::Instruction);
226
93
    }
227
31.7k
  }
228
52.7k
  return Instrs;
229
52.8k
}
230
231
// Load instruction node. See "include/loader/loader.h".
232
41.4M
Expect<void> Loader::loadInstruction(AST::Instruction &Instr) {
233
  // Node: The instruction has checked for the proposals. Need to check their
234
  // immediates.
235
236
41.4M
  auto ReportError = [this](auto E) {
237
2.18k
    return logLoadError(E, FMgr.getLastOffset(), ASTNodeAttr::Instruction);
238
2.18k
  };
239
240
41.4M
  auto readU8 = [this, ReportError](uint8_t &Dst) -> Expect<void> {
241
147k
    EXPECTED_TRY(Dst, FMgr.readByte().map_error(ReportError));
242
147k
    return {};
243
147k
  };
244
245
41.4M
  auto readU32 = [this, ReportError](uint32_t &Dst) -> Expect<void> {
246
2.63M
    EXPECTED_TRY(Dst, FMgr.readU32().map_error(ReportError));
247
2.63M
    return {};
248
2.63M
  };
249
250
41.4M
  auto readU64 = [this, ReportError](uint64_t &Dst) -> Expect<void> {
251
549k
    EXPECTED_TRY(Dst, FMgr.readU64().map_error(ReportError));
252
549k
    return {};
253
549k
  };
254
255
41.4M
  auto readMemImmediate = [this, readU32, readU64, &Instr]() -> Expect<void> {
256
550k
    Instr.getTargetIndex() = 0;
257
550k
    EXPECTED_TRY(readU32(Instr.getMemoryAlign()));
258
549k
    if (Conf.hasProposal(Proposal::MultiMemories) &&
259
549k
        Instr.getMemoryAlign() >= 64) {
260
87.7k
      Instr.getMemoryAlign() -= 64;
261
87.7k
      EXPECTED_TRY(readU32(Instr.getTargetIndex()));
262
87.7k
    }
263
549k
    uint32_t MaxAlign = Conf.hasProposal(Proposal::Memory64) ? 64U : 32U;
264
549k
    if (unlikely(Instr.getMemoryAlign() >= MaxAlign)) {
265
139
      return logLoadError(ErrCode::Value::MalformedMemoryOpFlags,
266
139
                          FMgr.getLastOffset(), ASTNodeAttr::Instruction);
267
139
    }
268
549k
    if (Conf.hasProposal(Proposal::Memory64)) {
269
549k
      EXPECTED_TRY(readU64(Instr.getMemoryOffset()));
270
549k
    } else {
271
0
      uint32_t Offset;
272
0
      EXPECTED_TRY(readU32(Offset));
273
0
      Instr.getMemoryOffset() = static_cast<uint64_t>(Offset);
274
0
    }
275
549k
    return {};
276
549k
  };
277
278
41.4M
  auto readCheckZero = [this, readU8](uint32_t &Dst) -> Expect<void> {
279
1.66k
    uint8_t C = 0;
280
1.66k
    EXPECTED_TRY(readU8(C));
281
1.66k
    if (C != UINT8_C(0)) {
282
6
      return logLoadError(ErrCode::Value::ExpectedZeroByte,
283
6
                          FMgr.getLastOffset(), ASTNodeAttr::Instruction);
284
6
    }
285
1.65k
    Dst = 0;
286
1.65k
    return {};
287
1.66k
  };
288
289
41.4M
  auto readBlockType = [this, ReportError](BlockType &Dst) -> Expect<void> {
290
1.96M
    auto StartOffset = FMgr.getOffset();
291
    // Read the block return type.
292
1.96M
    EXPECTED_TRY(int64_t Code, FMgr.readS33().map_error(ReportError));
293
1.96M
    if (Code < 0) {
294
      // The empty and valtype cases are encoded as a single-byte SLEB128,
295
      // i.e. the decoded value must be in [-64, -1]. Any negative value
296
      // smaller than -64 means a non-canonical multi-byte SLEB128 encoding,
297
      // which is not a valid blocktype.
298
1.35M
      if (Code < -64) {
299
84
        return logLoadError(ErrCode::Value::MalformedValType,
300
84
                            FMgr.getLastOffset(), ASTNodeAttr::Instruction);
301
84
      }
302
1.35M
      TypeCode TypeByte = static_cast<TypeCode>(Code & INT64_C(0x7F));
303
1.35M
      if (TypeByte == TypeCode::Epsilon) {
304
        // Empty case.
305
35.5k
        Dst.setEmpty();
306
1.31M
      } else {
307
        // Value type case. Seek back to the origin offset and read the
308
        // valtype.
309
1.31M
        FMgr.seek(StartOffset);
310
        // The AST node information is handled.
311
1.31M
        EXPECTED_TRY(auto Type, loadValType(ASTNodeAttr::Instruction));
312
1.31M
        Dst.setData(Type);
313
1.31M
      }
314
1.35M
    } else {
315
      // Type index case.
316
615k
      if (unlikely(!Conf.hasProposal(Proposal::MultiValue))) {
317
0
        return logNeedProposal(ErrCode::Value::MalformedValType,
318
0
                               Proposal::MultiValue, FMgr.getLastOffset(),
319
0
                               ASTNodeAttr::Instruction);
320
0
      }
321
615k
      Dst.setData(static_cast<uint32_t>(Code));
322
615k
    }
323
1.96M
    return {};
324
1.96M
  };
325
326
41.4M
  switch (Instr.getOpCode()) {
327
  // Control instructions.
328
21.7M
  case OpCode::Unreachable:
329
22.5M
  case OpCode::Nop:
330
22.6M
  case OpCode::Return:
331
22.7M
  case OpCode::Throw_ref:
332
22.8M
  case OpCode::End:
333
22.9M
  case OpCode::Else:
334
22.9M
    return {};
335
336
509k
  case OpCode::Block:
337
1.72M
  case OpCode::Loop:
338
1.95M
  case OpCode::If:
339
1.95M
    return readBlockType(Instr.getBlockType());
340
341
9.38k
  case OpCode::Try_table: {
342
9.38k
    Instr.setTryCatch();
343
    // Read the result type.
344
9.38k
    EXPECTED_TRY(readBlockType(Instr.getTryCatch().ResType));
345
18.7k
    EXPECTED_TRY(uint32_t VecCnt, loadVecCnt().map_error(ReportError));
346
18.7k
    Instr.getTryCatch().Catch.resize(VecCnt);
347
19.8k
    for (uint32_t I = 0; I < VecCnt; ++I) {
348
10.5k
      auto &Desc = Instr.getTryCatch().Catch[I];
349
      // Read the catch flag.
350
10.5k
      EXPECTED_TRY(uint8_t Flag, FMgr.readByte().map_error(ReportError));
351
10.5k
      if (unlikely(Flag > 0x03U)) {
352
41
        return logLoadError(ErrCode::Value::MalformedCatchFlags,
353
41
                            FMgr.getLastOffset(), ASTNodeAttr::Instruction);
354
41
      }
355
10.5k
      Desc.IsRef = (Flag & 0x01U) ? true : false;
356
10.5k
      Desc.IsAll = (Flag & 0x02U) ? true : false;
357
10.5k
      if (!Desc.IsAll) {
358
        // Read the tag index.
359
4.07k
        EXPECTED_TRY(readU32(Desc.TagIndex));
360
4.07k
      }
361
      // Read the label index.
362
10.5k
      EXPECTED_TRY(readU32(Desc.LabelIndex));
363
10.5k
    }
364
9.28k
    return {};
365
18.7k
  }
366
367
18.6k
  case OpCode::Throw:
368
18.6k
    return readU32(Instr.getTargetIndex());
369
370
67.8k
  case OpCode::Br:
371
94.1k
  case OpCode::Br_if:
372
98.2k
  case OpCode::Br_on_null:
373
115k
  case OpCode::Br_on_non_null:
374
115k
    return readU32(Instr.getJump().TargetIndex);
375
376
21.7k
  case OpCode::Br_table: {
377
    // Read the vector of labels.
378
21.7k
    EXPECTED_TRY(uint32_t VecCnt, loadVecCnt().map_error(ReportError));
379
21.6k
    Instr.setLabelListSize(VecCnt + 1);
380
293k
    for (uint32_t I = 0; I < VecCnt; ++I) {
381
272k
      EXPECTED_TRY(readU32(Instr.getLabelList()[I].TargetIndex));
382
272k
    }
383
    // Read default label.
384
21.6k
    return readU32(Instr.getLabelList()[VecCnt].TargetIndex);
385
21.6k
  }
386
387
18.7k
  case OpCode::Call:
388
56.5k
  case OpCode::Return_call:
389
108k
  case OpCode::Call_ref:
390
127k
  case OpCode::Return_call_ref:
391
127k
    return readU32(Instr.getTargetIndex());
392
393
35.6k
  case OpCode::Call_indirect:
394
37.9k
  case OpCode::Return_call_indirect: {
395
    // Read the type index.
396
37.9k
    EXPECTED_TRY(readU32(Instr.getTargetIndex()));
397
37.8k
    uint64_t SrcIdxOffset = FMgr.getOffset();
398
    // Read the table index.
399
37.8k
    EXPECTED_TRY(readU32(Instr.getSourceIndex()));
400
37.8k
    if ((Instr.getSourceIndex() > 0 || FMgr.getOffset() - SrcIdxOffset > 1) &&
401
22.2k
        !Conf.hasProposal(Proposal::ReferenceTypes)) {
402
0
      return logNeedProposal(ErrCode::Value::ExpectedZeroByte,
403
0
                             Proposal::ReferenceTypes, FMgr.getLastOffset(),
404
0
                             ASTNodeAttr::Instruction);
405
0
    }
406
37.8k
    return {};
407
37.8k
  }
408
409
  // Reference Instructions.
410
29.6k
  case OpCode::Ref__null:
411
30.9k
  case OpCode::Ref__test_null:
412
32.5k
  case OpCode::Ref__cast_null: {
413
    // The AST node information is handled.
414
32.5k
    EXPECTED_TRY(auto Type,
415
32.4k
                 loadHeapType(TypeCode::RefNull, ASTNodeAttr::Instruction));
416
32.4k
    Instr.setValType(Type);
417
32.4k
    return {};
418
32.5k
  }
419
2.01k
  case OpCode::Ref__test:
420
6.58k
  case OpCode::Ref__cast: {
421
    // The AST node information is handled.
422
6.58k
    EXPECTED_TRY(auto Type,
423
6.57k
                 loadHeapType(TypeCode::Ref, ASTNodeAttr::Instruction));
424
6.57k
    Instr.setValType(Type);
425
6.57k
    return {};
426
6.58k
  }
427
6.88k
  case OpCode::Ref__is_null:
428
9.91k
  case OpCode::Ref__eq:
429
16.5k
  case OpCode::Ref__as_non_null:
430
16.5k
    return {};
431
538k
  case OpCode::Ref__func:
432
543k
  case OpCode::Struct__new:
433
546k
  case OpCode::Struct__new_default:
434
546k
  case OpCode::Array__new:
435
547k
  case OpCode::Array__new_default:
436
548k
  case OpCode::Array__get:
437
549k
  case OpCode::Array__get_s:
438
550k
  case OpCode::Array__get_u:
439
551k
  case OpCode::Array__set:
440
552k
  case OpCode::Array__fill:
441
552k
    return readU32(Instr.getTargetIndex());
442
800
  case OpCode::Struct__get:
443
2.45k
  case OpCode::Struct__get_s:
444
3.13k
  case OpCode::Struct__get_u:
445
3.65k
  case OpCode::Struct__set:
446
5.84k
  case OpCode::Array__new_fixed:
447
6.33k
  case OpCode::Array__new_data:
448
13.1k
  case OpCode::Array__new_elem:
449
13.9k
  case OpCode::Array__copy:
450
14.4k
  case OpCode::Array__init_data:
451
15.2k
  case OpCode::Array__init_elem:
452
15.2k
    EXPECTED_TRY(readU32(Instr.getTargetIndex()));
453
15.1k
    return readU32(Instr.getSourceIndex());
454
994
  case OpCode::Br_on_cast:
455
1.83k
  case OpCode::Br_on_cast_fail: {
456
    // Read the flag.
457
1.83k
    uint8_t Flag = 0U;
458
1.83k
    EXPECTED_TRY(readU8(Flag).map_error(ReportError));
459
1.81k
    if (unlikely(Flag > 0x03U)) {
460
18
      return logLoadError(ErrCode::Value::MalformedCastFlags,
461
18
                          FMgr.getLastOffset(), ASTNodeAttr::Instruction);
462
18
    }
463
    // Read the label index.
464
1.79k
    uint32_t LabelIdx = 0U;
465
1.79k
    EXPECTED_TRY(readU32(LabelIdx).map_error(ReportError));
466
    // Read the heap types.
467
1.79k
    Instr.setBrCast(LabelIdx);
468
1.79k
    TypeCode TC = ((Flag & 0x01U) ? TypeCode::RefNull : TypeCode::Ref);
469
1.79k
    EXPECTED_TRY(
470
1.78k
        Instr.getBrCast().RType1,
471
1.78k
        loadHeapType(TC, ASTNodeAttr::Instruction).map_error(ReportError));
472
1.78k
    TC = ((Flag & 0x02U) ? TypeCode::RefNull : TypeCode::Ref);
473
1.78k
    EXPECTED_TRY(
474
1.77k
        Instr.getBrCast().RType2,
475
1.77k
        loadHeapType(TC, ASTNodeAttr::Instruction).map_error(ReportError));
476
1.77k
    return {};
477
1.78k
  }
478
3.21k
  case OpCode::Array__len:
479
4.51k
  case OpCode::Any__convert_extern:
480
8.11k
  case OpCode::Extern__convert_any:
481
17.1k
  case OpCode::Ref__i31:
482
17.8k
  case OpCode::I31__get_s:
483
18.4k
  case OpCode::I31__get_u:
484
18.4k
    return {};
485
486
  // Parametric Instructions.
487
451k
  case OpCode::Drop:
488
614k
  case OpCode::Select:
489
614k
    return {};
490
49.3k
  case OpCode::Select_t: {
491
    // Read the vector of value types.
492
49.3k
    EXPECTED_TRY(uint32_t VecCnt, loadVecCnt().map_error(ReportError));
493
49.2k
    Instr.setValTypeListSize(VecCnt);
494
119k
    for (uint32_t I = 0; I < VecCnt; ++I) {
495
      // The AST node information is handled.
496
70.6k
      EXPECTED_TRY(Instr.getValTypeList()[I],
497
70.6k
                   loadValType(ASTNodeAttr::Instruction));
498
70.6k
    }
499
49.2k
    return {};
500
49.2k
  }
501
502
  // Variable Instructions.
503
84.1k
  case OpCode::Local__get:
504
140k
  case OpCode::Local__set:
505
164k
  case OpCode::Local__tee:
506
227k
  case OpCode::Global__get:
507
295k
  case OpCode::Global__set:
508
295k
    return readU32(Instr.getTargetIndex());
509
510
  // Table Instructions.
511
1.00k
  case OpCode::Table__init:
512
1.00k
    EXPECTED_TRY(readU32(Instr.getSourceIndex()));
513
1.00k
    [[fallthrough]];
514
35.5k
  case OpCode::Table__get:
515
47.6k
  case OpCode::Table__set:
516
51.8k
  case OpCode::Table__grow:
517
55.5k
  case OpCode::Table__size:
518
56.1k
  case OpCode::Table__fill:
519
63.1k
  case OpCode::Elem__drop:
520
63.1k
    return readU32(Instr.getTargetIndex());
521
1.87k
  case OpCode::Table__copy:
522
1.87k
    EXPECTED_TRY(readU32(Instr.getTargetIndex()));
523
1.86k
    return readU32(Instr.getSourceIndex());
524
525
  // Memory Instructions.
526
17.3k
  case OpCode::I32__load:
527
31.3k
  case OpCode::I64__load:
528
34.8k
  case OpCode::F32__load:
529
46.1k
  case OpCode::F64__load:
530
51.1k
  case OpCode::I32__load8_s:
531
71.0k
  case OpCode::I32__load8_u:
532
99.2k
  case OpCode::I32__load16_s:
533
130k
  case OpCode::I32__load16_u:
534
153k
  case OpCode::I64__load8_s:
535
167k
  case OpCode::I64__load8_u:
536
192k
  case OpCode::I64__load16_s:
537
205k
  case OpCode::I64__load16_u:
538
213k
  case OpCode::I64__load32_s:
539
219k
  case OpCode::I64__load32_u:
540
276k
  case OpCode::I32__store:
541
289k
  case OpCode::I64__store:
542
303k
  case OpCode::F32__store:
543
346k
  case OpCode::F64__store:
544
358k
  case OpCode::I32__store8:
545
367k
  case OpCode::I32__store16:
546
371k
  case OpCode::I64__store8:
547
387k
  case OpCode::I64__store16:
548
392k
  case OpCode::I64__store32:
549
392k
    return readMemImmediate();
550
551
1.79k
  case OpCode::Memory__init:
552
1.79k
    if (!HasDataSection) {
553
4
      return logLoadError(ErrCode::Value::DataCountRequired, Instr.getOffset(),
554
4
                          ASTNodeAttr::Instruction);
555
4
    }
556
1.78k
    EXPECTED_TRY(readU32(Instr.getSourceIndex()));
557
1.78k
    [[fallthrough]];
558
39.2k
  case OpCode::Memory__grow:
559
392k
  case OpCode::Memory__size:
560
395k
  case OpCode::Memory__fill:
561
395k
    if (Conf.hasProposal(Proposal::MultiMemories)) {
562
395k
      return readU32(Instr.getTargetIndex());
563
395k
    }
564
0
    return readCheckZero(Instr.getTargetIndex());
565
1.03k
  case OpCode::Memory__copy:
566
1.03k
    if (Conf.hasProposal(Proposal::MultiMemories)) {
567
1.03k
      EXPECTED_TRY(readU32(Instr.getTargetIndex()));
568
1.03k
      return readU32(Instr.getSourceIndex());
569
1.03k
    }
570
0
    EXPECTED_TRY(readCheckZero(Instr.getTargetIndex()));
571
0
    return readCheckZero(Instr.getSourceIndex());
572
1.37k
  case OpCode::Data__drop:
573
1.37k
    if (!HasDataSection) {
574
3
      return logLoadError(ErrCode::Value::DataCountRequired, Instr.getOffset(),
575
3
                          ASTNodeAttr::Instruction);
576
3
    }
577
1.36k
    return readU32(Instr.getTargetIndex());
578
579
  // Const Instructions.
580
2.33M
  case OpCode::I32__const:
581
2.33M
    EXPECTED_TRY(FMgr.readS32().map_error(ReportError).map([&](int32_t Num) {
582
      // Should clear the higher bits.
583
2.33M
      Instr.setNum(static_cast<uint128_t>(0U));
584
2.33M
      Instr.setNum(static_cast<uint32_t>(Num));
585
2.33M
    }));
586
2.33M
    return {};
587
936k
  case OpCode::I64__const:
588
936k
    EXPECTED_TRY(FMgr.readS64().map_error(ReportError).map([&](int64_t Num) {
589
      // Should clear the higher bits.
590
936k
      Instr.setNum(static_cast<uint128_t>(0U));
591
936k
      Instr.setNum(static_cast<uint64_t>(Num));
592
936k
    }));
593
936k
    return {};
594
71.1k
  case OpCode::F32__const:
595
71.1k
    EXPECTED_TRY(FMgr.readF32().map_error(ReportError).map([&](float Num) {
596
71.1k
      Instr.setNum(Num);
597
71.1k
    }));
598
71.1k
    return {};
599
62.4k
  case OpCode::F64__const:
600
62.4k
    EXPECTED_TRY(FMgr.readF64().map_error(ReportError).map([&](double Num) {
601
62.3k
      Instr.setNum(Num);
602
62.3k
    }));
603
62.3k
    return {};
604
605
  // Unary Numeric Instructions.
606
62.7k
  case OpCode::I32__eqz:
607
89.5k
  case OpCode::I32__clz:
608
344k
  case OpCode::I32__ctz:
609
480k
  case OpCode::I32__popcnt:
610
511k
  case OpCode::I64__eqz:
611
523k
  case OpCode::I64__clz:
612
590k
  case OpCode::I64__ctz:
613
1.00M
  case OpCode::I64__popcnt:
614
1.01M
  case OpCode::F32__abs:
615
1.02M
  case OpCode::F32__neg:
616
1.04M
  case OpCode::F32__ceil:
617
1.05M
  case OpCode::F32__floor:
618
1.06M
  case OpCode::F32__trunc:
619
1.07M
  case OpCode::F32__nearest:
620
1.09M
  case OpCode::F32__sqrt:
621
1.10M
  case OpCode::F64__abs:
622
1.11M
  case OpCode::F64__neg:
623
1.12M
  case OpCode::F64__ceil:
624
1.13M
  case OpCode::F64__floor:
625
1.14M
  case OpCode::F64__trunc:
626
1.15M
  case OpCode::F64__nearest:
627
1.19M
  case OpCode::F64__sqrt:
628
1.20M
  case OpCode::I32__wrap_i64:
629
1.22M
  case OpCode::I32__trunc_f32_s:
630
1.22M
  case OpCode::I32__trunc_f32_u:
631
1.26M
  case OpCode::I32__trunc_f64_s:
632
1.50M
  case OpCode::I32__trunc_f64_u:
633
1.52M
  case OpCode::I64__extend_i32_s:
634
1.53M
  case OpCode::I64__extend_i32_u:
635
1.54M
  case OpCode::I64__trunc_f32_s:
636
1.55M
  case OpCode::I64__trunc_f32_u:
637
1.56M
  case OpCode::I64__trunc_f64_s:
638
1.58M
  case OpCode::I64__trunc_f64_u:
639
1.60M
  case OpCode::F32__convert_i32_s:
640
1.64M
  case OpCode::F32__convert_i32_u:
641
1.66M
  case OpCode::F32__convert_i64_s:
642
1.67M
  case OpCode::F32__convert_i64_u:
643
1.69M
  case OpCode::F32__demote_f64:
644
1.72M
  case OpCode::F64__convert_i32_s:
645
1.75M
  case OpCode::F64__convert_i32_u:
646
1.80M
  case OpCode::F64__convert_i64_s:
647
1.83M
  case OpCode::F64__convert_i64_u:
648
1.83M
  case OpCode::F64__promote_f32:
649
1.85M
  case OpCode::I32__reinterpret_f32:
650
1.90M
  case OpCode::I64__reinterpret_f64:
651
1.93M
  case OpCode::F32__reinterpret_i32:
652
1.96M
  case OpCode::F64__reinterpret_i64:
653
1.97M
  case OpCode::I32__extend8_s:
654
1.99M
  case OpCode::I32__extend16_s:
655
2.01M
  case OpCode::I64__extend8_s:
656
2.05M
  case OpCode::I64__extend16_s:
657
2.13M
  case OpCode::I64__extend32_s:
658
2.13M
  case OpCode::I32__trunc_sat_f32_s:
659
2.14M
  case OpCode::I32__trunc_sat_f32_u:
660
2.14M
  case OpCode::I32__trunc_sat_f64_s:
661
2.14M
  case OpCode::I32__trunc_sat_f64_u:
662
2.15M
  case OpCode::I64__trunc_sat_f32_s:
663
2.15M
  case OpCode::I64__trunc_sat_f32_u:
664
2.16M
  case OpCode::I64__trunc_sat_f64_s:
665
2.16M
  case OpCode::I64__trunc_sat_f64_u:
666
667
  // Binary Numeric Instructions.
668
2.23M
  case OpCode::I32__eq:
669
2.24M
  case OpCode::I32__ne:
670
2.28M
  case OpCode::I32__lt_s:
671
2.31M
  case OpCode::I32__lt_u:
672
2.60M
  case OpCode::I32__gt_s:
673
2.63M
  case OpCode::I32__gt_u:
674
2.65M
  case OpCode::I32__le_s:
675
2.78M
  case OpCode::I32__le_u:
676
2.85M
  case OpCode::I32__ge_s:
677
2.86M
  case OpCode::I32__ge_u:
678
2.87M
  case OpCode::I64__eq:
679
2.88M
  case OpCode::I64__ne:
680
2.89M
  case OpCode::I64__lt_s:
681
2.94M
  case OpCode::I64__lt_u:
682
2.96M
  case OpCode::I64__gt_s:
683
2.97M
  case OpCode::I64__gt_u:
684
2.97M
  case OpCode::I64__le_s:
685
2.99M
  case OpCode::I64__le_u:
686
2.99M
  case OpCode::I64__ge_s:
687
3.14M
  case OpCode::I64__ge_u:
688
3.18M
  case OpCode::F32__eq:
689
3.21M
  case OpCode::F32__ne:
690
3.23M
  case OpCode::F32__lt:
691
3.50M
  case OpCode::F32__gt:
692
3.51M
  case OpCode::F32__le:
693
3.54M
  case OpCode::F32__ge:
694
3.99M
  case OpCode::F64__eq:
695
4.06M
  case OpCode::F64__ne:
696
4.09M
  case OpCode::F64__lt:
697
4.14M
  case OpCode::F64__gt:
698
4.17M
  case OpCode::F64__le:
699
4.20M
  case OpCode::F64__ge:
700
701
4.39M
  case OpCode::I32__add:
702
4.75M
  case OpCode::I32__sub:
703
4.79M
  case OpCode::I32__mul:
704
5.08M
  case OpCode::I32__div_s:
705
5.51M
  case OpCode::I32__div_u:
706
6.29M
  case OpCode::I32__rem_s:
707
6.32M
  case OpCode::I32__rem_u:
708
6.41M
  case OpCode::I32__and:
709
6.53M
  case OpCode::I32__or:
710
7.14M
  case OpCode::I32__xor:
711
7.22M
  case OpCode::I32__shl:
712
7.24M
  case OpCode::I32__shr_s:
713
7.28M
  case OpCode::I32__shr_u:
714
7.30M
  case OpCode::I32__rotl:
715
7.87M
  case OpCode::I32__rotr:
716
7.89M
  case OpCode::I64__add:
717
7.92M
  case OpCode::I64__sub:
718
7.94M
  case OpCode::I64__mul:
719
7.98M
  case OpCode::I64__div_s:
720
8.01M
  case OpCode::I64__div_u:
721
8.02M
  case OpCode::I64__rem_s:
722
8.03M
  case OpCode::I64__rem_u:
723
8.04M
  case OpCode::I64__and:
724
8.05M
  case OpCode::I64__or:
725
8.07M
  case OpCode::I64__xor:
726
8.08M
  case OpCode::I64__shl:
727
8.08M
  case OpCode::I64__shr_s:
728
8.10M
  case OpCode::I64__shr_u:
729
8.11M
  case OpCode::I64__rotl:
730
8.12M
  case OpCode::I64__rotr:
731
8.13M
  case OpCode::F32__add:
732
8.24M
  case OpCode::F32__sub:
733
8.25M
  case OpCode::F32__mul:
734
8.25M
  case OpCode::F32__div:
735
8.29M
  case OpCode::F32__min:
736
8.30M
  case OpCode::F32__max:
737
8.30M
  case OpCode::F32__copysign:
738
8.32M
  case OpCode::F64__add:
739
8.36M
  case OpCode::F64__sub:
740
8.37M
  case OpCode::F64__mul:
741
8.38M
  case OpCode::F64__div:
742
8.38M
  case OpCode::F64__min:
743
8.39M
  case OpCode::F64__max:
744
8.42M
  case OpCode::F64__copysign:
745
8.42M
    return {};
746
747
  // SIMD Memory Instruction.
748
59.4k
  case OpCode::V128__load:
749
80.4k
  case OpCode::V128__load8x8_s:
750
82.0k
  case OpCode::V128__load8x8_u:
751
85.2k
  case OpCode::V128__load16x4_s:
752
88.8k
  case OpCode::V128__load16x4_u:
753
92.4k
  case OpCode::V128__load32x2_s:
754
93.7k
  case OpCode::V128__load32x2_u:
755
96.4k
  case OpCode::V128__load8_splat:
756
101k
  case OpCode::V128__load16_splat:
757
104k
  case OpCode::V128__load32_splat:
758
106k
  case OpCode::V128__load64_splat:
759
110k
  case OpCode::V128__load32_zero:
760
112k
  case OpCode::V128__load64_zero:
761
113k
  case OpCode::V128__store:
762
113k
    return readMemImmediate();
763
1.66k
  case OpCode::V128__load8_lane:
764
7.03k
  case OpCode::V128__load16_lane:
765
8.67k
  case OpCode::V128__load32_lane:
766
10.8k
  case OpCode::V128__load64_lane:
767
13.1k
  case OpCode::V128__store8_lane:
768
15.0k
  case OpCode::V128__store16_lane:
769
20.4k
  case OpCode::V128__store32_lane:
770
27.2k
  case OpCode::V128__store64_lane:
771
    // Read memory immediate.
772
27.2k
    EXPECTED_TRY(readMemImmediate());
773
    // Read lane index.
774
27.1k
    return readU8(Instr.getMemoryLane());
775
776
  // SIMD Const Instruction.
777
19.7k
  case OpCode::V128__const:
778
  // SIMD Shuffle Instruction.
779
23.8k
  case OpCode::I8x16__shuffle: {
780
    // Read value.
781
23.8k
    uint128_t Value = 0U;
782
405k
    for (uint32_t I = 0U; I < 16U; ++I) {
783
381k
      EXPECTED_TRY(FMgr.readByte().map_error(ReportError).map([&](uint8_t B) {
784
381k
        Value |= static_cast<uint128_t>(static_cast<uint32_t>(B)) << (I * 8U);
785
381k
      }));
786
381k
    }
787
23.8k
    Instr.setNum(Value);
788
23.8k
    return {};
789
23.8k
  }
790
791
  // SIMD Lane Instructions.
792
30.5k
  case OpCode::I8x16__extract_lane_s:
793
31.8k
  case OpCode::I8x16__extract_lane_u:
794
35.6k
  case OpCode::I8x16__replace_lane:
795
44.8k
  case OpCode::I16x8__extract_lane_s:
796
47.2k
  case OpCode::I16x8__extract_lane_u:
797
49.6k
  case OpCode::I16x8__replace_lane:
798
56.6k
  case OpCode::I32x4__extract_lane:
799
77.5k
  case OpCode::I32x4__replace_lane:
800
79.1k
  case OpCode::I64x2__extract_lane:
801
81.5k
  case OpCode::I64x2__replace_lane:
802
84.6k
  case OpCode::F32x4__extract_lane:
803
87.8k
  case OpCode::F32x4__replace_lane:
804
112k
  case OpCode::F64x2__extract_lane:
805
117k
  case OpCode::F64x2__replace_lane:
806
    // Read lane index.
807
117k
    return readU8(Instr.getMemoryLane());
808
809
  // SIMD Numeric Instructions.
810
4.74k
  case OpCode::I8x16__swizzle:
811
178k
  case OpCode::I8x16__splat:
812
220k
  case OpCode::I16x8__splat:
813
235k
  case OpCode::I32x4__splat:
814
239k
  case OpCode::I64x2__splat:
815
243k
  case OpCode::F32x4__splat:
816
276k
  case OpCode::F64x2__splat:
817
818
282k
  case OpCode::I8x16__eq:
819
284k
  case OpCode::I8x16__ne:
820
287k
  case OpCode::I8x16__lt_s:
821
289k
  case OpCode::I8x16__lt_u:
822
296k
  case OpCode::I8x16__gt_s:
823
302k
  case OpCode::I8x16__gt_u:
824
305k
  case OpCode::I8x16__le_s:
825
306k
  case OpCode::I8x16__le_u:
826
308k
  case OpCode::I8x16__ge_s:
827
416k
  case OpCode::I8x16__ge_u:
828
829
422k
  case OpCode::I16x8__eq:
830
426k
  case OpCode::I16x8__ne:
831
431k
  case OpCode::I16x8__lt_s:
832
446k
  case OpCode::I16x8__lt_u:
833
476k
  case OpCode::I16x8__gt_s:
834
483k
  case OpCode::I16x8__gt_u:
835
489k
  case OpCode::I16x8__le_s:
836
491k
  case OpCode::I16x8__le_u:
837
495k
  case OpCode::I16x8__ge_s:
838
500k
  case OpCode::I16x8__ge_u:
839
840
502k
  case OpCode::I32x4__eq:
841
504k
  case OpCode::I32x4__ne:
842
515k
  case OpCode::I32x4__lt_s:
843
516k
  case OpCode::I32x4__lt_u:
844
522k
  case OpCode::I32x4__gt_s:
845
526k
  case OpCode::I32x4__gt_u:
846
535k
  case OpCode::I32x4__le_s:
847
537k
  case OpCode::I32x4__le_u:
848
540k
  case OpCode::I32x4__ge_s:
849
548k
  case OpCode::I32x4__ge_u:
850
851
581k
  case OpCode::F32x4__eq:
852
585k
  case OpCode::F32x4__ne:
853
588k
  case OpCode::F32x4__lt:
854
589k
  case OpCode::F32x4__gt:
855
592k
  case OpCode::F32x4__le:
856
599k
  case OpCode::F32x4__ge:
857
858
607k
  case OpCode::F64x2__eq:
859
609k
  case OpCode::F64x2__ne:
860
614k
  case OpCode::F64x2__lt:
861
622k
  case OpCode::F64x2__gt:
862
625k
  case OpCode::F64x2__le:
863
631k
  case OpCode::F64x2__ge:
864
865
648k
  case OpCode::V128__not:
866
652k
  case OpCode::V128__and:
867
654k
  case OpCode::V128__andnot:
868
656k
  case OpCode::V128__or:
869
667k
  case OpCode::V128__xor:
870
669k
  case OpCode::V128__bitselect:
871
671k
  case OpCode::V128__any_true:
872
873
692k
  case OpCode::I8x16__abs:
874
726k
  case OpCode::I8x16__neg:
875
741k
  case OpCode::I8x16__popcnt:
876
780k
  case OpCode::I8x16__all_true:
877
848k
  case OpCode::I8x16__bitmask:
878
856k
  case OpCode::I8x16__narrow_i16x8_s:
879
858k
  case OpCode::I8x16__narrow_i16x8_u:
880
862k
  case OpCode::I8x16__shl:
881
866k
  case OpCode::I8x16__shr_s:
882
876k
  case OpCode::I8x16__shr_u:
883
879k
  case OpCode::I8x16__add:
884
897k
  case OpCode::I8x16__add_sat_s:
885
900k
  case OpCode::I8x16__add_sat_u:
886
903k
  case OpCode::I8x16__sub:
887
906k
  case OpCode::I8x16__sub_sat_s:
888
912k
  case OpCode::I8x16__sub_sat_u:
889
915k
  case OpCode::I8x16__min_s:
890
924k
  case OpCode::I8x16__min_u:
891
936k
  case OpCode::I8x16__max_s:
892
958k
  case OpCode::I8x16__max_u:
893
969k
  case OpCode::I8x16__avgr_u:
894
895
972k
  case OpCode::I16x8__abs:
896
978k
  case OpCode::I16x8__neg:
897
980k
  case OpCode::I16x8__all_true:
898
983k
  case OpCode::I16x8__bitmask:
899
985k
  case OpCode::I16x8__narrow_i32x4_s:
900
992k
  case OpCode::I16x8__narrow_i32x4_u:
901
1.00M
  case OpCode::I16x8__extend_low_i8x16_s:
902
1.00M
  case OpCode::I16x8__extend_high_i8x16_s:
903
1.00M
  case OpCode::I16x8__extend_low_i8x16_u:
904
1.00M
  case OpCode::I16x8__extend_high_i8x16_u:
905
1.00M
  case OpCode::I16x8__shl:
906
1.01M
  case OpCode::I16x8__shr_s:
907
1.01M
  case OpCode::I16x8__shr_u:
908
1.02M
  case OpCode::I16x8__add:
909
1.02M
  case OpCode::I16x8__add_sat_s:
910
1.02M
  case OpCode::I16x8__add_sat_u:
911
1.02M
  case OpCode::I16x8__sub:
912
1.03M
  case OpCode::I16x8__sub_sat_s:
913
1.04M
  case OpCode::I16x8__sub_sat_u:
914
1.04M
  case OpCode::I16x8__mul:
915
1.04M
  case OpCode::I16x8__min_s:
916
1.04M
  case OpCode::I16x8__min_u:
917
1.05M
  case OpCode::I16x8__max_s:
918
1.05M
  case OpCode::I16x8__max_u:
919
1.06M
  case OpCode::I16x8__avgr_u:
920
1.07M
  case OpCode::I16x8__extmul_low_i8x16_s:
921
1.07M
  case OpCode::I16x8__extmul_high_i8x16_s:
922
1.07M
  case OpCode::I16x8__extmul_low_i8x16_u:
923
1.08M
  case OpCode::I16x8__extmul_high_i8x16_u:
924
1.08M
  case OpCode::I16x8__q15mulr_sat_s:
925
1.09M
  case OpCode::I16x8__extadd_pairwise_i8x16_s:
926
1.10M
  case OpCode::I16x8__extadd_pairwise_i8x16_u:
927
928
1.11M
  case OpCode::I32x4__abs:
929
1.12M
  case OpCode::I32x4__neg:
930
1.12M
  case OpCode::I32x4__all_true:
931
1.14M
  case OpCode::I32x4__bitmask:
932
1.14M
  case OpCode::I32x4__extend_low_i16x8_s:
933
1.14M
  case OpCode::I32x4__extend_high_i16x8_s:
934
1.15M
  case OpCode::I32x4__extend_low_i16x8_u:
935
1.16M
  case OpCode::I32x4__extend_high_i16x8_u:
936
1.16M
  case OpCode::I32x4__shl:
937
1.16M
  case OpCode::I32x4__shr_s:
938
1.17M
  case OpCode::I32x4__shr_u:
939
1.17M
  case OpCode::I32x4__add:
940
1.17M
  case OpCode::I32x4__sub:
941
1.17M
  case OpCode::I32x4__mul:
942
1.17M
  case OpCode::I32x4__min_s:
943
1.18M
  case OpCode::I32x4__min_u:
944
1.18M
  case OpCode::I32x4__max_s:
945
1.18M
  case OpCode::I32x4__max_u:
946
1.18M
  case OpCode::I32x4__extmul_low_i16x8_s:
947
1.18M
  case OpCode::I32x4__extmul_high_i16x8_s:
948
1.18M
  case OpCode::I32x4__extmul_low_i16x8_u:
949
1.19M
  case OpCode::I32x4__extmul_high_i16x8_u:
950
1.19M
  case OpCode::I32x4__extadd_pairwise_i16x8_s:
951
1.21M
  case OpCode::I32x4__extadd_pairwise_i16x8_u:
952
953
1.22M
  case OpCode::I64x2__abs:
954
1.22M
  case OpCode::I64x2__neg:
955
1.22M
  case OpCode::I64x2__bitmask:
956
1.23M
  case OpCode::I64x2__extend_low_i32x4_s:
957
1.23M
  case OpCode::I64x2__extend_high_i32x4_s:
958
1.24M
  case OpCode::I64x2__extend_low_i32x4_u:
959
1.25M
  case OpCode::I64x2__extend_high_i32x4_u:
960
1.25M
  case OpCode::I64x2__shl:
961
1.25M
  case OpCode::I64x2__shr_s:
962
1.25M
  case OpCode::I64x2__shr_u:
963
1.26M
  case OpCode::I64x2__add:
964
1.26M
  case OpCode::I64x2__sub:
965
1.26M
  case OpCode::I64x2__mul:
966
1.27M
  case OpCode::I64x2__eq:
967
1.27M
  case OpCode::I64x2__ne:
968
1.27M
  case OpCode::I64x2__lt_s:
969
1.28M
  case OpCode::I64x2__gt_s:
970
1.28M
  case OpCode::I64x2__le_s:
971
1.29M
  case OpCode::I64x2__ge_s:
972
1.30M
  case OpCode::I64x2__all_true:
973
1.30M
  case OpCode::I64x2__extmul_low_i32x4_s:
974
1.30M
  case OpCode::I64x2__extmul_high_i32x4_s:
975
1.30M
  case OpCode::I64x2__extmul_low_i32x4_u:
976
1.31M
  case OpCode::I64x2__extmul_high_i32x4_u:
977
978
1.31M
  case OpCode::F32x4__abs:
979
1.33M
  case OpCode::F32x4__neg:
980
1.33M
  case OpCode::F32x4__sqrt:
981
1.34M
  case OpCode::F32x4__add:
982
1.34M
  case OpCode::F32x4__sub:
983
1.34M
  case OpCode::F32x4__mul:
984
1.34M
  case OpCode::F32x4__div:
985
1.35M
  case OpCode::F32x4__min:
986
1.35M
  case OpCode::F32x4__max:
987
1.36M
  case OpCode::F32x4__pmin:
988
1.36M
  case OpCode::F32x4__pmax:
989
990
1.36M
  case OpCode::F64x2__abs:
991
1.37M
  case OpCode::F64x2__neg:
992
1.40M
  case OpCode::F64x2__sqrt:
993
1.41M
  case OpCode::F64x2__add:
994
1.42M
  case OpCode::F64x2__sub:
995
1.42M
  case OpCode::F64x2__mul:
996
1.42M
  case OpCode::F64x2__div:
997
1.43M
  case OpCode::F64x2__min:
998
1.43M
  case OpCode::F64x2__max:
999
1.43M
  case OpCode::F64x2__pmin:
1000
1.43M
  case OpCode::F64x2__pmax:
1001
1002
1.44M
  case OpCode::I32x4__trunc_sat_f32x4_s:
1003
1.45M
  case OpCode::I32x4__trunc_sat_f32x4_u:
1004
1.46M
  case OpCode::F32x4__convert_i32x4_s:
1005
1.46M
  case OpCode::F32x4__convert_i32x4_u:
1006
1.51M
  case OpCode::I32x4__trunc_sat_f64x2_s_zero:
1007
1.52M
  case OpCode::I32x4__trunc_sat_f64x2_u_zero:
1008
1.55M
  case OpCode::F64x2__convert_low_i32x4_s:
1009
1.57M
  case OpCode::F64x2__convert_low_i32x4_u:
1010
1.57M
  case OpCode::F32x4__demote_f64x2_zero:
1011
1.58M
  case OpCode::F64x2__promote_low_f32x4:
1012
1013
1.58M
  case OpCode::I32x4__dot_i16x8_s:
1014
1.60M
  case OpCode::F32x4__ceil:
1015
1.61M
  case OpCode::F32x4__floor:
1016
1.62M
  case OpCode::F32x4__trunc:
1017
1.62M
  case OpCode::F32x4__nearest:
1018
1.63M
  case OpCode::F64x2__ceil:
1019
1.63M
  case OpCode::F64x2__floor:
1020
1.64M
  case OpCode::F64x2__trunc:
1021
1.64M
  case OpCode::F64x2__nearest:
1022
1.64M
    return {};
1023
1024
577
  case OpCode::I8x16__relaxed_swizzle:
1025
2.24k
  case OpCode::I32x4__relaxed_trunc_f32x4_s:
1026
3.89k
  case OpCode::I32x4__relaxed_trunc_f32x4_u:
1027
4.93k
  case OpCode::I32x4__relaxed_trunc_f64x2_s_zero:
1028
5.77k
  case OpCode::I32x4__relaxed_trunc_f64x2_u_zero:
1029
6.86k
  case OpCode::F32x4__relaxed_madd:
1030
8.73k
  case OpCode::F32x4__relaxed_nmadd:
1031
9.54k
  case OpCode::F64x2__relaxed_madd:
1032
10.1k
  case OpCode::F64x2__relaxed_nmadd:
1033
11.2k
  case OpCode::I8x16__relaxed_laneselect:
1034
12.6k
  case OpCode::I16x8__relaxed_laneselect:
1035
13.5k
  case OpCode::I32x4__relaxed_laneselect:
1036
16.1k
  case OpCode::I64x2__relaxed_laneselect:
1037
17.1k
  case OpCode::F32x4__relaxed_min:
1038
18.2k
  case OpCode::F32x4__relaxed_max:
1039
19.2k
  case OpCode::F64x2__relaxed_min:
1040
20.6k
  case OpCode::F64x2__relaxed_max:
1041
21.6k
  case OpCode::I16x8__relaxed_q15mulr_s:
1042
23.2k
  case OpCode::I16x8__relaxed_dot_i8x16_i7x16_s:
1043
30.2k
  case OpCode::I32x4__relaxed_dot_i8x16_i7x16_add_s:
1044
30.2k
    return {};
1045
1046
  // Atomic Memory Instructions.
1047
1.66k
  case OpCode::Atomic__fence:
1048
1.66k
    return readCheckZero(Instr.getTargetIndex());
1049
1050
6.27k
  case OpCode::Memory__atomic__notify:
1051
10.9k
  case OpCode::Memory__atomic__wait32:
1052
17.1k
  case OpCode::Memory__atomic__wait64:
1053
1054
17.1k
  case OpCode::I32__atomic__load:
1055
17.1k
  case OpCode::I64__atomic__load:
1056
17.1k
  case OpCode::I32__atomic__load8_u:
1057
17.1k
  case OpCode::I32__atomic__load16_u:
1058
17.1k
  case OpCode::I64__atomic__load8_u:
1059
17.1k
  case OpCode::I64__atomic__load16_u:
1060
17.1k
  case OpCode::I64__atomic__load32_u:
1061
17.1k
  case OpCode::I32__atomic__store:
1062
17.1k
  case OpCode::I64__atomic__store:
1063
17.1k
  case OpCode::I32__atomic__store8:
1064
17.1k
  case OpCode::I32__atomic__store16:
1065
17.1k
  case OpCode::I64__atomic__store8:
1066
17.1k
  case OpCode::I64__atomic__store16:
1067
17.1k
  case OpCode::I64__atomic__store32:
1068
17.1k
  case OpCode::I32__atomic__rmw__add:
1069
17.1k
  case OpCode::I64__atomic__rmw__add:
1070
17.1k
  case OpCode::I32__atomic__rmw8__add_u:
1071
17.1k
  case OpCode::I32__atomic__rmw16__add_u:
1072
17.1k
  case OpCode::I64__atomic__rmw8__add_u:
1073
17.1k
  case OpCode::I64__atomic__rmw16__add_u:
1074
17.1k
  case OpCode::I64__atomic__rmw32__add_u:
1075
17.1k
  case OpCode::I32__atomic__rmw__sub:
1076
17.1k
  case OpCode::I64__atomic__rmw__sub:
1077
17.1k
  case OpCode::I32__atomic__rmw8__sub_u:
1078
17.1k
  case OpCode::I32__atomic__rmw16__sub_u:
1079
17.1k
  case OpCode::I64__atomic__rmw8__sub_u:
1080
17.1k
  case OpCode::I64__atomic__rmw16__sub_u:
1081
17.1k
  case OpCode::I64__atomic__rmw32__sub_u:
1082
17.1k
  case OpCode::I32__atomic__rmw__and:
1083
17.1k
  case OpCode::I64__atomic__rmw__and:
1084
17.1k
  case OpCode::I32__atomic__rmw8__and_u:
1085
17.1k
  case OpCode::I32__atomic__rmw16__and_u:
1086
17.1k
  case OpCode::I64__atomic__rmw8__and_u:
1087
17.1k
  case OpCode::I64__atomic__rmw16__and_u:
1088
17.1k
  case OpCode::I64__atomic__rmw32__and_u:
1089
17.1k
  case OpCode::I32__atomic__rmw__or:
1090
17.1k
  case OpCode::I64__atomic__rmw__or:
1091
17.1k
  case OpCode::I32__atomic__rmw8__or_u:
1092
17.1k
  case OpCode::I32__atomic__rmw16__or_u:
1093
17.1k
  case OpCode::I64__atomic__rmw8__or_u:
1094
17.1k
  case OpCode::I64__atomic__rmw16__or_u:
1095
17.1k
  case OpCode::I64__atomic__rmw32__or_u:
1096
17.1k
  case OpCode::I32__atomic__rmw__xor:
1097
17.1k
  case OpCode::I64__atomic__rmw__xor:
1098
17.1k
  case OpCode::I32__atomic__rmw8__xor_u:
1099
17.1k
  case OpCode::I32__atomic__rmw16__xor_u:
1100
17.1k
  case OpCode::I64__atomic__rmw8__xor_u:
1101
17.1k
  case OpCode::I64__atomic__rmw16__xor_u:
1102
17.1k
  case OpCode::I64__atomic__rmw32__xor_u:
1103
17.1k
  case OpCode::I32__atomic__rmw__xchg:
1104
17.1k
  case OpCode::I64__atomic__rmw__xchg:
1105
17.1k
  case OpCode::I32__atomic__rmw8__xchg_u:
1106
17.1k
  case OpCode::I32__atomic__rmw16__xchg_u:
1107
17.1k
  case OpCode::I64__atomic__rmw8__xchg_u:
1108
17.1k
  case OpCode::I64__atomic__rmw16__xchg_u:
1109
17.1k
  case OpCode::I64__atomic__rmw32__xchg_u:
1110
17.1k
  case OpCode::I32__atomic__rmw__cmpxchg:
1111
17.1k
  case OpCode::I64__atomic__rmw__cmpxchg:
1112
17.1k
  case OpCode::I32__atomic__rmw8__cmpxchg_u:
1113
17.1k
  case OpCode::I32__atomic__rmw16__cmpxchg_u:
1114
17.1k
  case OpCode::I64__atomic__rmw8__cmpxchg_u:
1115
17.1k
  case OpCode::I64__atomic__rmw16__cmpxchg_u:
1116
17.1k
  case OpCode::I64__atomic__rmw32__cmpxchg_u:
1117
17.1k
    return readMemImmediate();
1118
1119
  // Wide-arithmetic instructions.
1120
0
  case OpCode::I64__add128:
1121
0
  case OpCode::I64__sub128:
1122
0
  case OpCode::I64__mul_wide_s:
1123
0
  case OpCode::I64__mul_wide_u:
1124
0
    return {};
1125
1126
0
  default:
1127
0
    assumingUnreachable();
1128
41.4M
  }
1129
41.4M
}
1130
1131
} // namespace Loader
1132
} // namespace WasmEdge