Coverage Report

Created: 2025-12-14 06:36

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