Coverage Report

Created: 2026-06-30 06:10

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/WasmEdge/lib/loader/serialize/serial_instruction.cpp
Line
Count
Source
1
// SPDX-License-Identifier: Apache-2.0
2
// SPDX-FileCopyrightText: Copyright The WasmEdge Authors
3
4
#include "loader/serialize.h"
5
6
namespace WasmEdge {
7
namespace Loader {
8
9
// Serialize instruction. See "include/loader/serialize.h".
10
Expect<void>
11
Serializer::serializeInstruction(const AST::Instruction &Instr,
12
0
                                 std::vector<uint8_t> &OutVec) const noexcept {
13
0
  auto serializeMemImmediate = [this, &Instr, &OutVec]() -> Expect<void> {
14
0
    if (Conf.hasProposal(Proposal::MultiMemories) &&
15
0
        Instr.getMemoryAlign() < 64 && Instr.getTargetIndex() != 0) {
16
0
      serializeU32(Instr.getMemoryAlign() + 64, OutVec);
17
0
      serializeU32(Instr.getTargetIndex(), OutVec);
18
0
    } else {
19
0
      serializeU32(Instr.getMemoryAlign(), OutVec);
20
0
    }
21
0
    serializeU64(Instr.getMemoryOffset(), OutVec);
22
0
    return {};
23
0
  };
24
25
0
  auto serializeCheckZero = [this, &OutVec](uint32_t C) -> Expect<void> {
26
0
    if (C != 0) {
27
0
      return logSerializeError(ErrCode::Value::ExpectedZeroByte,
28
0
                               ASTNodeAttr::Instruction);
29
0
    }
30
0
    OutVec.push_back(0x00);
31
0
    return {};
32
0
  };
33
34
  // Check with proposals.
35
0
  if (auto Res = Conf.isInstrNeedProposal(Instr.getOpCode());
36
0
      unlikely(Res.has_value())) {
37
0
    return logNeedProposal(ErrCode::Value::IllegalOpCode, Res.value(),
38
0
                           ASTNodeAttr::Instruction);
39
0
  }
40
41
  // Serialize OpCode.
42
0
  switch (Instr.getOpCode()) {
43
0
#define UseOpCode
44
0
#define Line(NAME, STRING, PREFIX)                                             \
45
0
  case OpCode::NAME:                                                           \
46
0
    OutVec.push_back(static_cast<uint8_t>(PREFIX));                            \
47
0
    break;
48
0
#define Line_FB(NAME, STRING, PREFIX, EXTEND)                                  \
49
0
  case OpCode::NAME:                                                           \
50
0
    OutVec.push_back(static_cast<uint8_t>(PREFIX));                            \
51
0
    serializeU32(EXTEND, OutVec);                                              \
52
0
    break;
53
0
#define Line_FC(NAME, STRING, PREFIX, EXTEND)                                  \
54
0
  case OpCode::NAME:                                                           \
55
0
    OutVec.push_back(static_cast<uint8_t>(PREFIX));                            \
56
0
    serializeU32(EXTEND, OutVec);                                              \
57
0
    break;
58
0
#define Line_FD(NAME, STRING, PREFIX, EXTEND)                                  \
59
0
  case OpCode::NAME:                                                           \
60
0
    OutVec.push_back(static_cast<uint8_t>(PREFIX));                            \
61
0
    serializeU32(EXTEND, OutVec);                                              \
62
0
    break;
63
0
#define Line_FE(NAME, STRING, PREFIX, EXTEND)                                  \
64
0
  case OpCode::NAME:                                                           \
65
0
    OutVec.push_back(static_cast<uint8_t>(PREFIX));                            \
66
0
    serializeU32(EXTEND, OutVec);                                              \
67
0
    break;
68
0
#include "common/enum.inc"
69
0
#undef Line
70
0
#undef Line_FB
71
0
#undef Line_FC
72
0
#undef Line_FD
73
0
#undef Line_FE
74
0
#undef UseOpCode
75
0
  default:
76
0
    assumingUnreachable();
77
0
  }
78
79
0
  auto serializeBlockType = [this,
80
0
                             &OutVec](const BlockType &Type) -> Expect<void> {
81
0
    if (Type.isEmpty()) {
82
0
      OutVec.push_back(static_cast<uint8_t>(TypeCode::Epsilon));
83
0
    } else if (Type.isValType()) {
84
0
      EXPECTED_TRY(serializeValType(Type.getValType(), ASTNodeAttr::Instruction,
85
0
                                    OutVec));
86
0
    } else {
87
0
      if (unlikely(!Conf.hasProposal(Proposal::MultiValue))) {
88
0
        return logNeedProposal(ErrCode::Value::MalformedValType,
89
0
                               Proposal::MultiValue, ASTNodeAttr::Instruction);
90
0
      }
91
0
      serializeS33(static_cast<int64_t>(Type.getTypeIndex()), OutVec);
92
0
    }
93
0
    return {};
94
0
  };
95
96
  // Serialize immediate.
97
0
  switch (Instr.getOpCode()) {
98
  // Control instructions.
99
0
  case OpCode::Unreachable:
100
0
  case OpCode::Nop:
101
0
  case OpCode::Return:
102
0
  case OpCode::Throw_ref:
103
0
  case OpCode::End:
104
0
  case OpCode::Else:
105
0
    return {};
106
107
0
  case OpCode::Block:
108
0
  case OpCode::Loop:
109
0
  case OpCode::If:
110
0
    return serializeBlockType(Instr.getBlockType());
111
112
0
  case OpCode::Try_table: {
113
    // Serialize the result type.
114
0
    EXPECTED_TRY(serializeBlockType(Instr.getTryCatch().ResType));
115
    // Serialize the vector of catches.
116
0
    uint32_t VecCnt = static_cast<uint32_t>(Instr.getTryCatch().Catch.size());
117
0
    serializeU32(VecCnt, OutVec);
118
0
    for (auto Catch : Instr.getTryCatch().Catch) {
119
      // Read the catch flags.
120
0
      uint8_t Flags = 0;
121
0
      if (Catch.IsRef) {
122
0
        Flags |= 0x01U;
123
0
      }
124
0
      if (Catch.IsAll) {
125
0
        Flags |= 0x02U;
126
0
      }
127
0
      OutVec.push_back(Flags);
128
      // Read the tag index.
129
0
      if (!Catch.IsAll) {
130
0
        serializeU32(Catch.TagIndex, OutVec);
131
0
      }
132
      // Read the label index.
133
0
      serializeU32(Catch.LabelIndex, OutVec);
134
0
    }
135
0
    return {};
136
0
  }
137
138
0
  case OpCode::Throw:
139
0
    serializeU32(Instr.getTargetIndex(), OutVec);
140
0
    return {};
141
142
0
  case OpCode::Br:
143
0
  case OpCode::Br_if:
144
0
  case OpCode::Br_on_null:
145
0
  case OpCode::Br_on_non_null:
146
0
    serializeU32(Instr.getJump().TargetIndex, OutVec);
147
0
    return {};
148
149
0
  case OpCode::Br_table: {
150
0
    uint32_t VecCnt = static_cast<uint32_t>(Instr.getLabelList().size()) - 1;
151
0
    serializeU32(VecCnt, OutVec);
152
0
    for (auto &Label : Instr.getLabelList()) {
153
0
      serializeU32(Label.TargetIndex, OutVec);
154
0
    }
155
0
    return {};
156
0
  }
157
158
0
  case OpCode::Call:
159
0
  case OpCode::Return_call:
160
0
  case OpCode::Call_ref:
161
0
  case OpCode::Return_call_ref:
162
0
    serializeU32(Instr.getTargetIndex(), OutVec);
163
0
    return {};
164
165
0
  case OpCode::Call_indirect:
166
0
  case OpCode::Return_call_indirect:
167
    // Serialize the type index.
168
0
    serializeU32(Instr.getTargetIndex(), OutVec);
169
0
    if (Instr.getSourceIndex() > 0 &&
170
0
        !Conf.hasProposal(Proposal::ReferenceTypes)) {
171
0
      return logNeedProposal(ErrCode::Value::ExpectedZeroByte,
172
0
                             Proposal::ReferenceTypes,
173
0
                             ASTNodeAttr::Instruction);
174
0
    }
175
    // Serialize the table index.
176
0
    serializeU32(Instr.getSourceIndex(), OutVec);
177
0
    return {};
178
179
  // Reference Instructions.
180
0
  case OpCode::Ref__null:
181
0
  case OpCode::Ref__test:
182
0
  case OpCode::Ref__cast:
183
0
  case OpCode::Ref__test_null:
184
0
  case OpCode::Ref__cast_null:
185
0
    EXPECTED_TRY(serializeHeapType(Instr.getValType(), ASTNodeAttr::Instruction,
186
0
                                   OutVec));
187
0
    return {};
188
0
  case OpCode::Ref__eq:
189
0
  case OpCode::Ref__is_null:
190
0
  case OpCode::Ref__as_non_null:
191
0
    return {};
192
0
  case OpCode::Ref__func:
193
0
  case OpCode::Struct__new:
194
0
  case OpCode::Struct__new_default:
195
0
  case OpCode::Array__new:
196
0
  case OpCode::Array__new_default:
197
0
  case OpCode::Array__get:
198
0
  case OpCode::Array__get_s:
199
0
  case OpCode::Array__get_u:
200
0
  case OpCode::Array__set:
201
0
  case OpCode::Array__fill:
202
0
    serializeU32(Instr.getTargetIndex(), OutVec);
203
0
    return {};
204
0
  case OpCode::Struct__get:
205
0
  case OpCode::Struct__get_s:
206
0
  case OpCode::Struct__get_u:
207
0
  case OpCode::Struct__set:
208
0
  case OpCode::Array__new_fixed:
209
0
  case OpCode::Array__new_data:
210
0
  case OpCode::Array__new_elem:
211
0
  case OpCode::Array__copy:
212
0
  case OpCode::Array__init_data:
213
0
  case OpCode::Array__init_elem:
214
0
    serializeU32(Instr.getTargetIndex(), OutVec);
215
0
    serializeU32(Instr.getSourceIndex(), OutVec);
216
0
    return {};
217
0
  case OpCode::Array__len:
218
0
  case OpCode::Any__convert_extern:
219
0
  case OpCode::Extern__convert_any:
220
0
  case OpCode::Ref__i31:
221
0
  case OpCode::I31__get_s:
222
0
  case OpCode::I31__get_u:
223
0
    return {};
224
0
  case OpCode::Br_on_cast:
225
0
  case OpCode::Br_on_cast_fail: {
226
    // Flag
227
0
    uint8_t Flags = 0U;
228
0
    if (Instr.getBrCast().RType1.isNullableRefType()) {
229
0
      Flags |= 0x01U;
230
0
    }
231
0
    if (Instr.getBrCast().RType2.isNullableRefType()) {
232
0
      Flags |= 0x02U;
233
0
    }
234
0
    OutVec.push_back(Flags);
235
    // LabelIdx
236
0
    serializeU32(Instr.getBrCast().Jump.TargetIndex, OutVec);
237
    // First RefType
238
0
    EXPECTED_TRY(serializeHeapType(Instr.getBrCast().RType1,
239
0
                                   ASTNodeAttr::Instruction, OutVec));
240
    // Second RefType.
241
0
    EXPECTED_TRY(serializeHeapType(Instr.getBrCast().RType2,
242
0
                                   ASTNodeAttr::Instruction, OutVec));
243
0
    return {};
244
0
  }
245
  // Parametric Instructions.
246
0
  case OpCode::Drop:
247
0
  case OpCode::Select:
248
0
    return {};
249
0
  case OpCode::Select_t: {
250
0
    uint32_t VecCnt = static_cast<uint32_t>(Instr.getValTypeList().size());
251
0
    serializeU32(VecCnt, OutVec);
252
0
    for (auto &VType : Instr.getValTypeList()) {
253
0
      EXPECTED_TRY(serializeValType(VType, ASTNodeAttr::Instruction, OutVec));
254
0
    }
255
0
    return {};
256
0
  }
257
258
  // Variable Instructions.
259
0
  case OpCode::Local__get:
260
0
  case OpCode::Local__set:
261
0
  case OpCode::Local__tee:
262
0
  case OpCode::Global__get:
263
0
  case OpCode::Global__set:
264
0
    serializeU32(Instr.getTargetIndex(), OutVec);
265
0
    return {};
266
267
  // Table Instructions.
268
0
  case OpCode::Table__init:
269
0
    serializeU32(Instr.getSourceIndex(), OutVec);
270
0
    [[fallthrough]];
271
0
  case OpCode::Table__get:
272
0
  case OpCode::Table__set:
273
0
  case OpCode::Table__grow:
274
0
  case OpCode::Table__size:
275
0
  case OpCode::Table__fill:
276
0
  case OpCode::Elem__drop:
277
0
    serializeU32(Instr.getTargetIndex(), OutVec);
278
0
    return {};
279
0
  case OpCode::Table__copy:
280
0
    serializeU32(Instr.getTargetIndex(), OutVec);
281
0
    serializeU32(Instr.getSourceIndex(), OutVec);
282
0
    return {};
283
284
  // Memory Instructions.
285
0
  case OpCode::I32__load:
286
0
  case OpCode::I64__load:
287
0
  case OpCode::F32__load:
288
0
  case OpCode::F64__load:
289
0
  case OpCode::I32__load8_s:
290
0
  case OpCode::I32__load8_u:
291
0
  case OpCode::I32__load16_s:
292
0
  case OpCode::I32__load16_u:
293
0
  case OpCode::I64__load8_s:
294
0
  case OpCode::I64__load8_u:
295
0
  case OpCode::I64__load16_s:
296
0
  case OpCode::I64__load16_u:
297
0
  case OpCode::I64__load32_s:
298
0
  case OpCode::I64__load32_u:
299
0
  case OpCode::I32__store:
300
0
  case OpCode::I64__store:
301
0
  case OpCode::F32__store:
302
0
  case OpCode::F64__store:
303
0
  case OpCode::I32__store8:
304
0
  case OpCode::I32__store16:
305
0
  case OpCode::I64__store8:
306
0
  case OpCode::I64__store16:
307
0
  case OpCode::I64__store32:
308
0
    return serializeMemImmediate();
309
310
0
  case OpCode::Memory__init:
311
0
    serializeU32(Instr.getSourceIndex(), OutVec);
312
0
    [[fallthrough]];
313
0
  case OpCode::Memory__grow:
314
0
  case OpCode::Memory__size:
315
0
  case OpCode::Memory__fill:
316
0
    if (Conf.hasProposal(Proposal::MultiMemories)) {
317
0
      serializeU32(Instr.getTargetIndex(), OutVec);
318
0
      return {};
319
0
    } else {
320
0
      return serializeCheckZero(Instr.getTargetIndex());
321
0
    }
322
323
0
  case OpCode::Memory__copy:
324
0
    if (Conf.hasProposal(Proposal::MultiMemories)) {
325
0
      serializeU32(Instr.getTargetIndex(), OutVec);
326
0
      serializeU32(Instr.getSourceIndex(), OutVec);
327
0
      return {};
328
0
    } else {
329
0
      EXPECTED_TRY(serializeCheckZero(Instr.getTargetIndex()));
330
0
      return serializeCheckZero(Instr.getSourceIndex());
331
0
    }
332
333
0
  case OpCode::Data__drop:
334
0
    serializeU32(Instr.getTargetIndex(), OutVec);
335
0
    return {};
336
337
  // Const Instructions.
338
0
  case OpCode::I32__const:
339
0
    serializeS32(Instr.getNum().get<int32_t>(), OutVec);
340
0
    return {};
341
342
0
  case OpCode::I64__const:
343
0
    serializeS64(Instr.getNum().get<int64_t>(), OutVec);
344
0
    return {};
345
0
  case OpCode::F32__const:
346
0
    serializeF32(Instr.getNum().get<float>(), OutVec);
347
0
    return {};
348
0
  case OpCode::F64__const:
349
0
    serializeF64(Instr.getNum().get<double>(), OutVec);
350
0
    return {};
351
352
  // Unary Numeric Instructions.
353
0
  case OpCode::I32__eqz:
354
0
  case OpCode::I32__clz:
355
0
  case OpCode::I32__ctz:
356
0
  case OpCode::I32__popcnt:
357
0
  case OpCode::I64__eqz:
358
0
  case OpCode::I64__clz:
359
0
  case OpCode::I64__ctz:
360
0
  case OpCode::I64__popcnt:
361
0
  case OpCode::F32__abs:
362
0
  case OpCode::F32__neg:
363
0
  case OpCode::F32__ceil:
364
0
  case OpCode::F32__floor:
365
0
  case OpCode::F32__trunc:
366
0
  case OpCode::F32__nearest:
367
0
  case OpCode::F32__sqrt:
368
0
  case OpCode::F64__abs:
369
0
  case OpCode::F64__neg:
370
0
  case OpCode::F64__ceil:
371
0
  case OpCode::F64__floor:
372
0
  case OpCode::F64__trunc:
373
0
  case OpCode::F64__nearest:
374
0
  case OpCode::F64__sqrt:
375
0
  case OpCode::I32__wrap_i64:
376
0
  case OpCode::I32__trunc_f32_s:
377
0
  case OpCode::I32__trunc_f32_u:
378
0
  case OpCode::I32__trunc_f64_s:
379
0
  case OpCode::I32__trunc_f64_u:
380
0
  case OpCode::I64__extend_i32_s:
381
0
  case OpCode::I64__extend_i32_u:
382
0
  case OpCode::I64__trunc_f32_s:
383
0
  case OpCode::I64__trunc_f32_u:
384
0
  case OpCode::I64__trunc_f64_s:
385
0
  case OpCode::I64__trunc_f64_u:
386
0
  case OpCode::F32__convert_i32_s:
387
0
  case OpCode::F32__convert_i32_u:
388
0
  case OpCode::F32__convert_i64_s:
389
0
  case OpCode::F32__convert_i64_u:
390
0
  case OpCode::F32__demote_f64:
391
0
  case OpCode::F64__convert_i32_s:
392
0
  case OpCode::F64__convert_i32_u:
393
0
  case OpCode::F64__convert_i64_s:
394
0
  case OpCode::F64__convert_i64_u:
395
0
  case OpCode::F64__promote_f32:
396
0
  case OpCode::I32__reinterpret_f32:
397
0
  case OpCode::I64__reinterpret_f64:
398
0
  case OpCode::F32__reinterpret_i32:
399
0
  case OpCode::F64__reinterpret_i64:
400
0
  case OpCode::I32__extend8_s:
401
0
  case OpCode::I32__extend16_s:
402
0
  case OpCode::I64__extend8_s:
403
0
  case OpCode::I64__extend16_s:
404
0
  case OpCode::I64__extend32_s:
405
0
  case OpCode::I32__trunc_sat_f32_s:
406
0
  case OpCode::I32__trunc_sat_f32_u:
407
0
  case OpCode::I32__trunc_sat_f64_s:
408
0
  case OpCode::I32__trunc_sat_f64_u:
409
0
  case OpCode::I64__trunc_sat_f32_s:
410
0
  case OpCode::I64__trunc_sat_f32_u:
411
0
  case OpCode::I64__trunc_sat_f64_s:
412
0
  case OpCode::I64__trunc_sat_f64_u:
413
414
  // Binary Numeric Instructions.
415
0
  case OpCode::I32__eq:
416
0
  case OpCode::I32__ne:
417
0
  case OpCode::I32__lt_s:
418
0
  case OpCode::I32__lt_u:
419
0
  case OpCode::I32__gt_s:
420
0
  case OpCode::I32__gt_u:
421
0
  case OpCode::I32__le_s:
422
0
  case OpCode::I32__le_u:
423
0
  case OpCode::I32__ge_s:
424
0
  case OpCode::I32__ge_u:
425
0
  case OpCode::I64__eq:
426
0
  case OpCode::I64__ne:
427
0
  case OpCode::I64__lt_s:
428
0
  case OpCode::I64__lt_u:
429
0
  case OpCode::I64__gt_s:
430
0
  case OpCode::I64__gt_u:
431
0
  case OpCode::I64__le_s:
432
0
  case OpCode::I64__le_u:
433
0
  case OpCode::I64__ge_s:
434
0
  case OpCode::I64__ge_u:
435
0
  case OpCode::F32__eq:
436
0
  case OpCode::F32__ne:
437
0
  case OpCode::F32__lt:
438
0
  case OpCode::F32__gt:
439
0
  case OpCode::F32__le:
440
0
  case OpCode::F32__ge:
441
0
  case OpCode::F64__eq:
442
0
  case OpCode::F64__ne:
443
0
  case OpCode::F64__lt:
444
0
  case OpCode::F64__gt:
445
0
  case OpCode::F64__le:
446
0
  case OpCode::F64__ge:
447
448
0
  case OpCode::I32__add:
449
0
  case OpCode::I32__sub:
450
0
  case OpCode::I32__mul:
451
0
  case OpCode::I32__div_s:
452
0
  case OpCode::I32__div_u:
453
0
  case OpCode::I32__rem_s:
454
0
  case OpCode::I32__rem_u:
455
0
  case OpCode::I32__and:
456
0
  case OpCode::I32__or:
457
0
  case OpCode::I32__xor:
458
0
  case OpCode::I32__shl:
459
0
  case OpCode::I32__shr_s:
460
0
  case OpCode::I32__shr_u:
461
0
  case OpCode::I32__rotl:
462
0
  case OpCode::I32__rotr:
463
0
  case OpCode::I64__add:
464
0
  case OpCode::I64__sub:
465
0
  case OpCode::I64__mul:
466
0
  case OpCode::I64__div_s:
467
0
  case OpCode::I64__div_u:
468
0
  case OpCode::I64__rem_s:
469
0
  case OpCode::I64__rem_u:
470
0
  case OpCode::I64__and:
471
0
  case OpCode::I64__or:
472
0
  case OpCode::I64__xor:
473
0
  case OpCode::I64__shl:
474
0
  case OpCode::I64__shr_s:
475
0
  case OpCode::I64__shr_u:
476
0
  case OpCode::I64__rotl:
477
0
  case OpCode::I64__rotr:
478
0
  case OpCode::F32__add:
479
0
  case OpCode::F32__sub:
480
0
  case OpCode::F32__mul:
481
0
  case OpCode::F32__div:
482
0
  case OpCode::F32__min:
483
0
  case OpCode::F32__max:
484
0
  case OpCode::F32__copysign:
485
0
  case OpCode::F64__add:
486
0
  case OpCode::F64__sub:
487
0
  case OpCode::F64__mul:
488
0
  case OpCode::F64__div:
489
0
  case OpCode::F64__min:
490
0
  case OpCode::F64__max:
491
0
  case OpCode::F64__copysign:
492
0
    return {};
493
494
  // SIMD Memory Instruction.
495
0
  case OpCode::V128__load:
496
0
  case OpCode::V128__load8x8_s:
497
0
  case OpCode::V128__load8x8_u:
498
0
  case OpCode::V128__load16x4_s:
499
0
  case OpCode::V128__load16x4_u:
500
0
  case OpCode::V128__load32x2_s:
501
0
  case OpCode::V128__load32x2_u:
502
0
  case OpCode::V128__load8_splat:
503
0
  case OpCode::V128__load16_splat:
504
0
  case OpCode::V128__load32_splat:
505
0
  case OpCode::V128__load64_splat:
506
0
  case OpCode::V128__load32_zero:
507
0
  case OpCode::V128__load64_zero:
508
0
  case OpCode::V128__store:
509
0
    return serializeMemImmediate();
510
0
  case OpCode::V128__load8_lane:
511
0
  case OpCode::V128__load16_lane:
512
0
  case OpCode::V128__load32_lane:
513
0
  case OpCode::V128__load64_lane:
514
0
  case OpCode::V128__store8_lane:
515
0
  case OpCode::V128__store16_lane:
516
0
  case OpCode::V128__store32_lane:
517
0
  case OpCode::V128__store64_lane:
518
0
    EXPECTED_TRY(serializeMemImmediate());
519
0
    OutVec.push_back(Instr.getMemoryLane());
520
0
    return {};
521
522
  // SIMD Const Instruction.
523
0
  case OpCode::V128__const:
524
  // SIMD Shuffle Instruction.
525
0
  case OpCode::I8x16__shuffle: {
526
0
    uint128_t Value = Instr.getNum().get<uint128_t>();
527
0
    for (uint32_t I = 0; I < 16; ++I) {
528
0
      OutVec.push_back(static_cast<uint8_t>(Value >> (I * 8)));
529
0
    }
530
0
    return {};
531
0
  }
532
533
  // SIMD Lane Instructions.
534
0
  case OpCode::I8x16__extract_lane_s:
535
0
  case OpCode::I8x16__extract_lane_u:
536
0
  case OpCode::I8x16__replace_lane:
537
0
  case OpCode::I16x8__extract_lane_s:
538
0
  case OpCode::I16x8__extract_lane_u:
539
0
  case OpCode::I16x8__replace_lane:
540
0
  case OpCode::I32x4__extract_lane:
541
0
  case OpCode::I32x4__replace_lane:
542
0
  case OpCode::I64x2__extract_lane:
543
0
  case OpCode::I64x2__replace_lane:
544
0
  case OpCode::F32x4__extract_lane:
545
0
  case OpCode::F32x4__replace_lane:
546
0
  case OpCode::F64x2__extract_lane:
547
0
  case OpCode::F64x2__replace_lane:
548
0
    OutVec.push_back(Instr.getMemoryLane());
549
0
    return {};
550
551
  // SIMD Numeric Instructions.
552
0
  case OpCode::I8x16__swizzle:
553
0
  case OpCode::I8x16__splat:
554
0
  case OpCode::I16x8__splat:
555
0
  case OpCode::I32x4__splat:
556
0
  case OpCode::I64x2__splat:
557
0
  case OpCode::F32x4__splat:
558
0
  case OpCode::F64x2__splat:
559
560
0
  case OpCode::I8x16__eq:
561
0
  case OpCode::I8x16__ne:
562
0
  case OpCode::I8x16__lt_s:
563
0
  case OpCode::I8x16__lt_u:
564
0
  case OpCode::I8x16__gt_s:
565
0
  case OpCode::I8x16__gt_u:
566
0
  case OpCode::I8x16__le_s:
567
0
  case OpCode::I8x16__le_u:
568
0
  case OpCode::I8x16__ge_s:
569
0
  case OpCode::I8x16__ge_u:
570
571
0
  case OpCode::I16x8__eq:
572
0
  case OpCode::I16x8__ne:
573
0
  case OpCode::I16x8__lt_s:
574
0
  case OpCode::I16x8__lt_u:
575
0
  case OpCode::I16x8__gt_s:
576
0
  case OpCode::I16x8__gt_u:
577
0
  case OpCode::I16x8__le_s:
578
0
  case OpCode::I16x8__le_u:
579
0
  case OpCode::I16x8__ge_s:
580
0
  case OpCode::I16x8__ge_u:
581
582
0
  case OpCode::I32x4__eq:
583
0
  case OpCode::I32x4__ne:
584
0
  case OpCode::I32x4__lt_s:
585
0
  case OpCode::I32x4__lt_u:
586
0
  case OpCode::I32x4__gt_s:
587
0
  case OpCode::I32x4__gt_u:
588
0
  case OpCode::I32x4__le_s:
589
0
  case OpCode::I32x4__le_u:
590
0
  case OpCode::I32x4__ge_s:
591
0
  case OpCode::I32x4__ge_u:
592
593
0
  case OpCode::F32x4__eq:
594
0
  case OpCode::F32x4__ne:
595
0
  case OpCode::F32x4__lt:
596
0
  case OpCode::F32x4__gt:
597
0
  case OpCode::F32x4__le:
598
0
  case OpCode::F32x4__ge:
599
600
0
  case OpCode::F64x2__eq:
601
0
  case OpCode::F64x2__ne:
602
0
  case OpCode::F64x2__lt:
603
0
  case OpCode::F64x2__gt:
604
0
  case OpCode::F64x2__le:
605
0
  case OpCode::F64x2__ge:
606
607
0
  case OpCode::V128__not:
608
0
  case OpCode::V128__and:
609
0
  case OpCode::V128__andnot:
610
0
  case OpCode::V128__or:
611
0
  case OpCode::V128__xor:
612
0
  case OpCode::V128__bitselect:
613
0
  case OpCode::V128__any_true:
614
615
0
  case OpCode::I8x16__abs:
616
0
  case OpCode::I8x16__neg:
617
0
  case OpCode::I8x16__popcnt:
618
0
  case OpCode::I8x16__all_true:
619
0
  case OpCode::I8x16__bitmask:
620
0
  case OpCode::I8x16__narrow_i16x8_s:
621
0
  case OpCode::I8x16__narrow_i16x8_u:
622
0
  case OpCode::I8x16__shl:
623
0
  case OpCode::I8x16__shr_s:
624
0
  case OpCode::I8x16__shr_u:
625
0
  case OpCode::I8x16__add:
626
0
  case OpCode::I8x16__add_sat_s:
627
0
  case OpCode::I8x16__add_sat_u:
628
0
  case OpCode::I8x16__sub:
629
0
  case OpCode::I8x16__sub_sat_s:
630
0
  case OpCode::I8x16__sub_sat_u:
631
0
  case OpCode::I8x16__min_s:
632
0
  case OpCode::I8x16__min_u:
633
0
  case OpCode::I8x16__max_s:
634
0
  case OpCode::I8x16__max_u:
635
0
  case OpCode::I8x16__avgr_u:
636
637
0
  case OpCode::I16x8__abs:
638
0
  case OpCode::I16x8__neg:
639
0
  case OpCode::I16x8__all_true:
640
0
  case OpCode::I16x8__bitmask:
641
0
  case OpCode::I16x8__narrow_i32x4_s:
642
0
  case OpCode::I16x8__narrow_i32x4_u:
643
0
  case OpCode::I16x8__extend_low_i8x16_s:
644
0
  case OpCode::I16x8__extend_high_i8x16_s:
645
0
  case OpCode::I16x8__extend_low_i8x16_u:
646
0
  case OpCode::I16x8__extend_high_i8x16_u:
647
0
  case OpCode::I16x8__shl:
648
0
  case OpCode::I16x8__shr_s:
649
0
  case OpCode::I16x8__shr_u:
650
0
  case OpCode::I16x8__add:
651
0
  case OpCode::I16x8__add_sat_s:
652
0
  case OpCode::I16x8__add_sat_u:
653
0
  case OpCode::I16x8__sub:
654
0
  case OpCode::I16x8__sub_sat_s:
655
0
  case OpCode::I16x8__sub_sat_u:
656
0
  case OpCode::I16x8__mul:
657
0
  case OpCode::I16x8__min_s:
658
0
  case OpCode::I16x8__min_u:
659
0
  case OpCode::I16x8__max_s:
660
0
  case OpCode::I16x8__max_u:
661
0
  case OpCode::I16x8__avgr_u:
662
0
  case OpCode::I16x8__extmul_low_i8x16_s:
663
0
  case OpCode::I16x8__extmul_high_i8x16_s:
664
0
  case OpCode::I16x8__extmul_low_i8x16_u:
665
0
  case OpCode::I16x8__extmul_high_i8x16_u:
666
0
  case OpCode::I16x8__q15mulr_sat_s:
667
0
  case OpCode::I16x8__extadd_pairwise_i8x16_s:
668
0
  case OpCode::I16x8__extadd_pairwise_i8x16_u:
669
670
0
  case OpCode::I32x4__abs:
671
0
  case OpCode::I32x4__neg:
672
0
  case OpCode::I32x4__all_true:
673
0
  case OpCode::I32x4__bitmask:
674
0
  case OpCode::I32x4__extend_low_i16x8_s:
675
0
  case OpCode::I32x4__extend_high_i16x8_s:
676
0
  case OpCode::I32x4__extend_low_i16x8_u:
677
0
  case OpCode::I32x4__extend_high_i16x8_u:
678
0
  case OpCode::I32x4__shl:
679
0
  case OpCode::I32x4__shr_s:
680
0
  case OpCode::I32x4__shr_u:
681
0
  case OpCode::I32x4__add:
682
0
  case OpCode::I32x4__sub:
683
0
  case OpCode::I32x4__mul:
684
0
  case OpCode::I32x4__min_s:
685
0
  case OpCode::I32x4__min_u:
686
0
  case OpCode::I32x4__max_s:
687
0
  case OpCode::I32x4__max_u:
688
0
  case OpCode::I32x4__extmul_low_i16x8_s:
689
0
  case OpCode::I32x4__extmul_high_i16x8_s:
690
0
  case OpCode::I32x4__extmul_low_i16x8_u:
691
0
  case OpCode::I32x4__extmul_high_i16x8_u:
692
0
  case OpCode::I32x4__extadd_pairwise_i16x8_s:
693
0
  case OpCode::I32x4__extadd_pairwise_i16x8_u:
694
695
0
  case OpCode::I64x2__abs:
696
0
  case OpCode::I64x2__neg:
697
0
  case OpCode::I64x2__bitmask:
698
0
  case OpCode::I64x2__extend_low_i32x4_s:
699
0
  case OpCode::I64x2__extend_high_i32x4_s:
700
0
  case OpCode::I64x2__extend_low_i32x4_u:
701
0
  case OpCode::I64x2__extend_high_i32x4_u:
702
0
  case OpCode::I64x2__shl:
703
0
  case OpCode::I64x2__shr_s:
704
0
  case OpCode::I64x2__shr_u:
705
0
  case OpCode::I64x2__add:
706
0
  case OpCode::I64x2__sub:
707
0
  case OpCode::I64x2__mul:
708
0
  case OpCode::I64x2__eq:
709
0
  case OpCode::I64x2__ne:
710
0
  case OpCode::I64x2__lt_s:
711
0
  case OpCode::I64x2__gt_s:
712
0
  case OpCode::I64x2__le_s:
713
0
  case OpCode::I64x2__ge_s:
714
0
  case OpCode::I64x2__all_true:
715
0
  case OpCode::I64x2__extmul_low_i32x4_s:
716
0
  case OpCode::I64x2__extmul_high_i32x4_s:
717
0
  case OpCode::I64x2__extmul_low_i32x4_u:
718
0
  case OpCode::I64x2__extmul_high_i32x4_u:
719
720
0
  case OpCode::F32x4__abs:
721
0
  case OpCode::F32x4__neg:
722
0
  case OpCode::F32x4__sqrt:
723
0
  case OpCode::F32x4__add:
724
0
  case OpCode::F32x4__sub:
725
0
  case OpCode::F32x4__mul:
726
0
  case OpCode::F32x4__div:
727
0
  case OpCode::F32x4__min:
728
0
  case OpCode::F32x4__max:
729
0
  case OpCode::F32x4__pmin:
730
0
  case OpCode::F32x4__pmax:
731
732
0
  case OpCode::F64x2__abs:
733
0
  case OpCode::F64x2__neg:
734
0
  case OpCode::F64x2__sqrt:
735
0
  case OpCode::F64x2__add:
736
0
  case OpCode::F64x2__sub:
737
0
  case OpCode::F64x2__mul:
738
0
  case OpCode::F64x2__div:
739
0
  case OpCode::F64x2__min:
740
0
  case OpCode::F64x2__max:
741
0
  case OpCode::F64x2__pmin:
742
0
  case OpCode::F64x2__pmax:
743
744
0
  case OpCode::I32x4__trunc_sat_f32x4_s:
745
0
  case OpCode::I32x4__trunc_sat_f32x4_u:
746
0
  case OpCode::F32x4__convert_i32x4_s:
747
0
  case OpCode::F32x4__convert_i32x4_u:
748
0
  case OpCode::I32x4__trunc_sat_f64x2_s_zero:
749
0
  case OpCode::I32x4__trunc_sat_f64x2_u_zero:
750
0
  case OpCode::F64x2__convert_low_i32x4_s:
751
0
  case OpCode::F64x2__convert_low_i32x4_u:
752
0
  case OpCode::F32x4__demote_f64x2_zero:
753
0
  case OpCode::F64x2__promote_low_f32x4:
754
755
0
  case OpCode::I32x4__dot_i16x8_s:
756
0
  case OpCode::F32x4__ceil:
757
0
  case OpCode::F32x4__floor:
758
0
  case OpCode::F32x4__trunc:
759
0
  case OpCode::F32x4__nearest:
760
0
  case OpCode::F64x2__ceil:
761
0
  case OpCode::F64x2__floor:
762
0
  case OpCode::F64x2__trunc:
763
0
  case OpCode::F64x2__nearest:
764
0
    return {};
765
766
0
  case OpCode::I8x16__relaxed_swizzle:
767
0
  case OpCode::I32x4__relaxed_trunc_f32x4_s:
768
0
  case OpCode::I32x4__relaxed_trunc_f32x4_u:
769
0
  case OpCode::I32x4__relaxed_trunc_f64x2_s_zero:
770
0
  case OpCode::I32x4__relaxed_trunc_f64x2_u_zero:
771
0
  case OpCode::F32x4__relaxed_madd:
772
0
  case OpCode::F32x4__relaxed_nmadd:
773
0
  case OpCode::F64x2__relaxed_madd:
774
0
  case OpCode::F64x2__relaxed_nmadd:
775
0
  case OpCode::I8x16__relaxed_laneselect:
776
0
  case OpCode::I16x8__relaxed_laneselect:
777
0
  case OpCode::I32x4__relaxed_laneselect:
778
0
  case OpCode::I64x2__relaxed_laneselect:
779
0
  case OpCode::F32x4__relaxed_min:
780
0
  case OpCode::F32x4__relaxed_max:
781
0
  case OpCode::F64x2__relaxed_min:
782
0
  case OpCode::F64x2__relaxed_max:
783
0
  case OpCode::I16x8__relaxed_q15mulr_s:
784
0
  case OpCode::I16x8__relaxed_dot_i8x16_i7x16_s:
785
0
  case OpCode::I32x4__relaxed_dot_i8x16_i7x16_add_s:
786
0
    return {};
787
788
  // Atomic Memory Instructions.
789
0
  case OpCode::Atomic__fence:
790
0
    return serializeCheckZero(Instr.getTargetIndex());
791
792
0
  case OpCode::Memory__atomic__notify:
793
0
  case OpCode::Memory__atomic__wait32:
794
0
  case OpCode::Memory__atomic__wait64:
795
796
0
  case OpCode::I32__atomic__load:
797
0
  case OpCode::I64__atomic__load:
798
0
  case OpCode::I32__atomic__load8_u:
799
0
  case OpCode::I32__atomic__load16_u:
800
0
  case OpCode::I64__atomic__load8_u:
801
0
  case OpCode::I64__atomic__load16_u:
802
0
  case OpCode::I64__atomic__load32_u:
803
0
  case OpCode::I32__atomic__store:
804
0
  case OpCode::I64__atomic__store:
805
0
  case OpCode::I32__atomic__store8:
806
0
  case OpCode::I32__atomic__store16:
807
0
  case OpCode::I64__atomic__store8:
808
0
  case OpCode::I64__atomic__store16:
809
0
  case OpCode::I64__atomic__store32:
810
0
  case OpCode::I32__atomic__rmw__add:
811
0
  case OpCode::I64__atomic__rmw__add:
812
0
  case OpCode::I32__atomic__rmw8__add_u:
813
0
  case OpCode::I32__atomic__rmw16__add_u:
814
0
  case OpCode::I64__atomic__rmw8__add_u:
815
0
  case OpCode::I64__atomic__rmw16__add_u:
816
0
  case OpCode::I64__atomic__rmw32__add_u:
817
0
  case OpCode::I32__atomic__rmw__sub:
818
0
  case OpCode::I64__atomic__rmw__sub:
819
0
  case OpCode::I32__atomic__rmw8__sub_u:
820
0
  case OpCode::I32__atomic__rmw16__sub_u:
821
0
  case OpCode::I64__atomic__rmw8__sub_u:
822
0
  case OpCode::I64__atomic__rmw16__sub_u:
823
0
  case OpCode::I64__atomic__rmw32__sub_u:
824
0
  case OpCode::I32__atomic__rmw__and:
825
0
  case OpCode::I64__atomic__rmw__and:
826
0
  case OpCode::I32__atomic__rmw8__and_u:
827
0
  case OpCode::I32__atomic__rmw16__and_u:
828
0
  case OpCode::I64__atomic__rmw8__and_u:
829
0
  case OpCode::I64__atomic__rmw16__and_u:
830
0
  case OpCode::I64__atomic__rmw32__and_u:
831
0
  case OpCode::I32__atomic__rmw__or:
832
0
  case OpCode::I64__atomic__rmw__or:
833
0
  case OpCode::I32__atomic__rmw8__or_u:
834
0
  case OpCode::I32__atomic__rmw16__or_u:
835
0
  case OpCode::I64__atomic__rmw8__or_u:
836
0
  case OpCode::I64__atomic__rmw16__or_u:
837
0
  case OpCode::I64__atomic__rmw32__or_u:
838
0
  case OpCode::I32__atomic__rmw__xor:
839
0
  case OpCode::I64__atomic__rmw__xor:
840
0
  case OpCode::I32__atomic__rmw8__xor_u:
841
0
  case OpCode::I32__atomic__rmw16__xor_u:
842
0
  case OpCode::I64__atomic__rmw8__xor_u:
843
0
  case OpCode::I64__atomic__rmw16__xor_u:
844
0
  case OpCode::I64__atomic__rmw32__xor_u:
845
0
  case OpCode::I32__atomic__rmw__xchg:
846
0
  case OpCode::I64__atomic__rmw__xchg:
847
0
  case OpCode::I32__atomic__rmw8__xchg_u:
848
0
  case OpCode::I32__atomic__rmw16__xchg_u:
849
0
  case OpCode::I64__atomic__rmw8__xchg_u:
850
0
  case OpCode::I64__atomic__rmw16__xchg_u:
851
0
  case OpCode::I64__atomic__rmw32__xchg_u:
852
0
  case OpCode::I32__atomic__rmw__cmpxchg:
853
0
  case OpCode::I64__atomic__rmw__cmpxchg:
854
0
  case OpCode::I32__atomic__rmw8__cmpxchg_u:
855
0
  case OpCode::I32__atomic__rmw16__cmpxchg_u:
856
0
  case OpCode::I64__atomic__rmw8__cmpxchg_u:
857
0
  case OpCode::I64__atomic__rmw16__cmpxchg_u:
858
0
  case OpCode::I64__atomic__rmw32__cmpxchg_u:
859
0
    return serializeMemImmediate();
860
861
0
  default:
862
0
    assumingUnreachable();
863
0
  }
864
0
}
865
866
} // namespace Loader
867
} // namespace WasmEdge