Coverage Report

Created: 2025-07-01 06:18

/src/WasmEdge/lib/loader/serialize/serial_instruction.cpp
Line
Count
Source (jump to first uncovered line)
1
// SPDX-License-Identifier: Apache-2.0
2
// SPDX-FileCopyrightText: 2019-2024 Second State INC
3
4
#include "loader/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
    serializeU32(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
  case OpCode::Table__copy:
278
0
    serializeU32(Instr.getTargetIndex(), OutVec);
279
0
    return {};
280
281
  // Memory Instructions.
282
0
  case OpCode::I32__load:
283
0
  case OpCode::I64__load:
284
0
  case OpCode::F32__load:
285
0
  case OpCode::F64__load:
286
0
  case OpCode::I32__load8_s:
287
0
  case OpCode::I32__load8_u:
288
0
  case OpCode::I32__load16_s:
289
0
  case OpCode::I32__load16_u:
290
0
  case OpCode::I64__load8_s:
291
0
  case OpCode::I64__load8_u:
292
0
  case OpCode::I64__load16_s:
293
0
  case OpCode::I64__load16_u:
294
0
  case OpCode::I64__load32_s:
295
0
  case OpCode::I64__load32_u:
296
0
  case OpCode::I32__store:
297
0
  case OpCode::I64__store:
298
0
  case OpCode::F32__store:
299
0
  case OpCode::F64__store:
300
0
  case OpCode::I32__store8:
301
0
  case OpCode::I32__store16:
302
0
  case OpCode::I64__store8:
303
0
  case OpCode::I64__store16:
304
0
  case OpCode::I64__store32:
305
0
    return serializeMemImmediate();
306
307
0
  case OpCode::Memory__init:
308
0
    serializeU32(Instr.getTargetIndex(), OutVec);
309
0
    [[fallthrough]];
310
0
  case OpCode::Memory__grow:
311
0
  case OpCode::Memory__size:
312
0
  case OpCode::Memory__fill:
313
0
    if (Conf.hasProposal(Proposal::MultiMemories)) {
314
0
      serializeU32(Instr.getTargetIndex(), OutVec);
315
0
      return {};
316
0
    } else {
317
0
      return serializeCheckZero(Instr.getTargetIndex());
318
0
    }
319
320
0
  case OpCode::Memory__copy:
321
0
    if (Conf.hasProposal(Proposal::MultiMemories)) {
322
0
      serializeU32(Instr.getTargetIndex(), OutVec);
323
0
      serializeU32(Instr.getSourceIndex(), OutVec);
324
0
      return {};
325
0
    } else {
326
0
      EXPECTED_TRY(serializeCheckZero(Instr.getTargetIndex()));
327
0
      return serializeCheckZero(Instr.getTargetIndex());
328
0
    }
329
330
0
  case OpCode::Data__drop:
331
0
    serializeU32(Instr.getTargetIndex(), OutVec);
332
0
    return {};
333
334
  // Const Instructions.
335
0
  case OpCode::I32__const:
336
0
    serializeS32(Instr.getNum().get<int32_t>(), OutVec);
337
0
    return {};
338
339
0
  case OpCode::I64__const:
340
0
    serializeS64(Instr.getNum().get<int64_t>(), OutVec);
341
0
    return {};
342
0
  case OpCode::F32__const:
343
0
    serializeF32(Instr.getNum().get<float>(), OutVec);
344
0
    return {};
345
0
  case OpCode::F64__const:
346
0
    serializeF64(Instr.getNum().get<double>(), OutVec);
347
0
    return {};
348
349
  // Unary Numeric Instructions.
350
0
  case OpCode::I32__eqz:
351
0
  case OpCode::I32__clz:
352
0
  case OpCode::I32__ctz:
353
0
  case OpCode::I32__popcnt:
354
0
  case OpCode::I64__eqz:
355
0
  case OpCode::I64__clz:
356
0
  case OpCode::I64__ctz:
357
0
  case OpCode::I64__popcnt:
358
0
  case OpCode::F32__abs:
359
0
  case OpCode::F32__neg:
360
0
  case OpCode::F32__ceil:
361
0
  case OpCode::F32__floor:
362
0
  case OpCode::F32__trunc:
363
0
  case OpCode::F32__nearest:
364
0
  case OpCode::F32__sqrt:
365
0
  case OpCode::F64__abs:
366
0
  case OpCode::F64__neg:
367
0
  case OpCode::F64__ceil:
368
0
  case OpCode::F64__floor:
369
0
  case OpCode::F64__trunc:
370
0
  case OpCode::F64__nearest:
371
0
  case OpCode::F64__sqrt:
372
0
  case OpCode::I32__wrap_i64:
373
0
  case OpCode::I32__trunc_f32_s:
374
0
  case OpCode::I32__trunc_f32_u:
375
0
  case OpCode::I32__trunc_f64_s:
376
0
  case OpCode::I32__trunc_f64_u:
377
0
  case OpCode::I64__extend_i32_s:
378
0
  case OpCode::I64__extend_i32_u:
379
0
  case OpCode::I64__trunc_f32_s:
380
0
  case OpCode::I64__trunc_f32_u:
381
0
  case OpCode::I64__trunc_f64_s:
382
0
  case OpCode::I64__trunc_f64_u:
383
0
  case OpCode::F32__convert_i32_s:
384
0
  case OpCode::F32__convert_i32_u:
385
0
  case OpCode::F32__convert_i64_s:
386
0
  case OpCode::F32__convert_i64_u:
387
0
  case OpCode::F32__demote_f64:
388
0
  case OpCode::F64__convert_i32_s:
389
0
  case OpCode::F64__convert_i32_u:
390
0
  case OpCode::F64__convert_i64_s:
391
0
  case OpCode::F64__convert_i64_u:
392
0
  case OpCode::F64__promote_f32:
393
0
  case OpCode::I32__reinterpret_f32:
394
0
  case OpCode::I64__reinterpret_f64:
395
0
  case OpCode::F32__reinterpret_i32:
396
0
  case OpCode::F64__reinterpret_i64:
397
0
  case OpCode::I32__extend8_s:
398
0
  case OpCode::I32__extend16_s:
399
0
  case OpCode::I64__extend8_s:
400
0
  case OpCode::I64__extend16_s:
401
0
  case OpCode::I64__extend32_s:
402
0
  case OpCode::I32__trunc_sat_f32_s:
403
0
  case OpCode::I32__trunc_sat_f32_u:
404
0
  case OpCode::I32__trunc_sat_f64_s:
405
0
  case OpCode::I32__trunc_sat_f64_u:
406
0
  case OpCode::I64__trunc_sat_f32_s:
407
0
  case OpCode::I64__trunc_sat_f32_u:
408
0
  case OpCode::I64__trunc_sat_f64_s:
409
0
  case OpCode::I64__trunc_sat_f64_u:
410
411
  // Binary Numeric Instructions.
412
0
  case OpCode::I32__eq:
413
0
  case OpCode::I32__ne:
414
0
  case OpCode::I32__lt_s:
415
0
  case OpCode::I32__lt_u:
416
0
  case OpCode::I32__gt_s:
417
0
  case OpCode::I32__gt_u:
418
0
  case OpCode::I32__le_s:
419
0
  case OpCode::I32__le_u:
420
0
  case OpCode::I32__ge_s:
421
0
  case OpCode::I32__ge_u:
422
0
  case OpCode::I64__eq:
423
0
  case OpCode::I64__ne:
424
0
  case OpCode::I64__lt_s:
425
0
  case OpCode::I64__lt_u:
426
0
  case OpCode::I64__gt_s:
427
0
  case OpCode::I64__gt_u:
428
0
  case OpCode::I64__le_s:
429
0
  case OpCode::I64__le_u:
430
0
  case OpCode::I64__ge_s:
431
0
  case OpCode::I64__ge_u:
432
0
  case OpCode::F32__eq:
433
0
  case OpCode::F32__ne:
434
0
  case OpCode::F32__lt:
435
0
  case OpCode::F32__gt:
436
0
  case OpCode::F32__le:
437
0
  case OpCode::F32__ge:
438
0
  case OpCode::F64__eq:
439
0
  case OpCode::F64__ne:
440
0
  case OpCode::F64__lt:
441
0
  case OpCode::F64__gt:
442
0
  case OpCode::F64__le:
443
0
  case OpCode::F64__ge:
444
445
0
  case OpCode::I32__add:
446
0
  case OpCode::I32__sub:
447
0
  case OpCode::I32__mul:
448
0
  case OpCode::I32__div_s:
449
0
  case OpCode::I32__div_u:
450
0
  case OpCode::I32__rem_s:
451
0
  case OpCode::I32__rem_u:
452
0
  case OpCode::I32__and:
453
0
  case OpCode::I32__or:
454
0
  case OpCode::I32__xor:
455
0
  case OpCode::I32__shl:
456
0
  case OpCode::I32__shr_s:
457
0
  case OpCode::I32__shr_u:
458
0
  case OpCode::I32__rotl:
459
0
  case OpCode::I32__rotr:
460
0
  case OpCode::I64__add:
461
0
  case OpCode::I64__sub:
462
0
  case OpCode::I64__mul:
463
0
  case OpCode::I64__div_s:
464
0
  case OpCode::I64__div_u:
465
0
  case OpCode::I64__rem_s:
466
0
  case OpCode::I64__rem_u:
467
0
  case OpCode::I64__and:
468
0
  case OpCode::I64__or:
469
0
  case OpCode::I64__xor:
470
0
  case OpCode::I64__shl:
471
0
  case OpCode::I64__shr_s:
472
0
  case OpCode::I64__shr_u:
473
0
  case OpCode::I64__rotl:
474
0
  case OpCode::I64__rotr:
475
0
  case OpCode::F32__add:
476
0
  case OpCode::F32__sub:
477
0
  case OpCode::F32__mul:
478
0
  case OpCode::F32__div:
479
0
  case OpCode::F32__min:
480
0
  case OpCode::F32__max:
481
0
  case OpCode::F32__copysign:
482
0
  case OpCode::F64__add:
483
0
  case OpCode::F64__sub:
484
0
  case OpCode::F64__mul:
485
0
  case OpCode::F64__div:
486
0
  case OpCode::F64__min:
487
0
  case OpCode::F64__max:
488
0
  case OpCode::F64__copysign:
489
0
    return {};
490
491
  // SIMD Memory Instruction.
492
0
  case OpCode::V128__load:
493
0
  case OpCode::V128__load8x8_s:
494
0
  case OpCode::V128__load8x8_u:
495
0
  case OpCode::V128__load16x4_s:
496
0
  case OpCode::V128__load16x4_u:
497
0
  case OpCode::V128__load32x2_s:
498
0
  case OpCode::V128__load32x2_u:
499
0
  case OpCode::V128__load8_splat:
500
0
  case OpCode::V128__load16_splat:
501
0
  case OpCode::V128__load32_splat:
502
0
  case OpCode::V128__load64_splat:
503
0
  case OpCode::V128__load32_zero:
504
0
  case OpCode::V128__load64_zero:
505
0
  case OpCode::V128__store:
506
0
    return serializeMemImmediate();
507
0
  case OpCode::V128__load8_lane:
508
0
  case OpCode::V128__load16_lane:
509
0
  case OpCode::V128__load32_lane:
510
0
  case OpCode::V128__load64_lane:
511
0
  case OpCode::V128__store8_lane:
512
0
  case OpCode::V128__store16_lane:
513
0
  case OpCode::V128__store32_lane:
514
0
  case OpCode::V128__store64_lane:
515
0
    EXPECTED_TRY(serializeMemImmediate());
516
0
    OutVec.push_back(Instr.getMemoryLane());
517
0
    return {};
518
519
  // SIMD Const Instruction.
520
0
  case OpCode::V128__const:
521
  // SIMD Shuffle Instruction.
522
0
  case OpCode::I8x16__shuffle: {
523
0
    uint128_t Value = Instr.getNum().get<uint128_t>();
524
0
    const std::uint8_t *Ptr = reinterpret_cast<const uint8_t *>(&Value);
525
0
    for (uint32_t I = 0; I < 16; ++I) {
526
0
      OutVec.push_back(Ptr[15 - I]);
527
0
    }
528
0
    return {};
529
0
  }
530
531
  // SIMD Lane Instructions.
532
0
  case OpCode::I8x16__extract_lane_s:
533
0
  case OpCode::I8x16__extract_lane_u:
534
0
  case OpCode::I8x16__replace_lane:
535
0
  case OpCode::I16x8__extract_lane_s:
536
0
  case OpCode::I16x8__extract_lane_u:
537
0
  case OpCode::I16x8__replace_lane:
538
0
  case OpCode::I32x4__extract_lane:
539
0
  case OpCode::I32x4__replace_lane:
540
0
  case OpCode::I64x2__extract_lane:
541
0
  case OpCode::I64x2__replace_lane:
542
0
  case OpCode::F32x4__extract_lane:
543
0
  case OpCode::F32x4__replace_lane:
544
0
  case OpCode::F64x2__extract_lane:
545
0
  case OpCode::F64x2__replace_lane:
546
0
    OutVec.push_back(Instr.getMemoryLane());
547
0
    return {};
548
549
  // SIMD Numeric Instructions.
550
0
  case OpCode::I8x16__swizzle:
551
0
  case OpCode::I8x16__splat:
552
0
  case OpCode::I16x8__splat:
553
0
  case OpCode::I32x4__splat:
554
0
  case OpCode::I64x2__splat:
555
0
  case OpCode::F32x4__splat:
556
0
  case OpCode::F64x2__splat:
557
558
0
  case OpCode::I8x16__eq:
559
0
  case OpCode::I8x16__ne:
560
0
  case OpCode::I8x16__lt_s:
561
0
  case OpCode::I8x16__lt_u:
562
0
  case OpCode::I8x16__gt_s:
563
0
  case OpCode::I8x16__gt_u:
564
0
  case OpCode::I8x16__le_s:
565
0
  case OpCode::I8x16__le_u:
566
0
  case OpCode::I8x16__ge_s:
567
0
  case OpCode::I8x16__ge_u:
568
569
0
  case OpCode::I16x8__eq:
570
0
  case OpCode::I16x8__ne:
571
0
  case OpCode::I16x8__lt_s:
572
0
  case OpCode::I16x8__lt_u:
573
0
  case OpCode::I16x8__gt_s:
574
0
  case OpCode::I16x8__gt_u:
575
0
  case OpCode::I16x8__le_s:
576
0
  case OpCode::I16x8__le_u:
577
0
  case OpCode::I16x8__ge_s:
578
0
  case OpCode::I16x8__ge_u:
579
580
0
  case OpCode::I32x4__eq:
581
0
  case OpCode::I32x4__ne:
582
0
  case OpCode::I32x4__lt_s:
583
0
  case OpCode::I32x4__lt_u:
584
0
  case OpCode::I32x4__gt_s:
585
0
  case OpCode::I32x4__gt_u:
586
0
  case OpCode::I32x4__le_s:
587
0
  case OpCode::I32x4__le_u:
588
0
  case OpCode::I32x4__ge_s:
589
0
  case OpCode::I32x4__ge_u:
590
591
0
  case OpCode::F32x4__eq:
592
0
  case OpCode::F32x4__ne:
593
0
  case OpCode::F32x4__lt:
594
0
  case OpCode::F32x4__gt:
595
0
  case OpCode::F32x4__le:
596
0
  case OpCode::F32x4__ge:
597
598
0
  case OpCode::F64x2__eq:
599
0
  case OpCode::F64x2__ne:
600
0
  case OpCode::F64x2__lt:
601
0
  case OpCode::F64x2__gt:
602
0
  case OpCode::F64x2__le:
603
0
  case OpCode::F64x2__ge:
604
605
0
  case OpCode::V128__not:
606
0
  case OpCode::V128__and:
607
0
  case OpCode::V128__andnot:
608
0
  case OpCode::V128__or:
609
0
  case OpCode::V128__xor:
610
0
  case OpCode::V128__bitselect:
611
0
  case OpCode::V128__any_true:
612
613
0
  case OpCode::I8x16__abs:
614
0
  case OpCode::I8x16__neg:
615
0
  case OpCode::I8x16__popcnt:
616
0
  case OpCode::I8x16__all_true:
617
0
  case OpCode::I8x16__bitmask:
618
0
  case OpCode::I8x16__narrow_i16x8_s:
619
0
  case OpCode::I8x16__narrow_i16x8_u:
620
0
  case OpCode::I8x16__shl:
621
0
  case OpCode::I8x16__shr_s:
622
0
  case OpCode::I8x16__shr_u:
623
0
  case OpCode::I8x16__add:
624
0
  case OpCode::I8x16__add_sat_s:
625
0
  case OpCode::I8x16__add_sat_u:
626
0
  case OpCode::I8x16__sub:
627
0
  case OpCode::I8x16__sub_sat_s:
628
0
  case OpCode::I8x16__sub_sat_u:
629
0
  case OpCode::I8x16__min_s:
630
0
  case OpCode::I8x16__min_u:
631
0
  case OpCode::I8x16__max_s:
632
0
  case OpCode::I8x16__max_u:
633
0
  case OpCode::I8x16__avgr_u:
634
635
0
  case OpCode::I16x8__abs:
636
0
  case OpCode::I16x8__neg:
637
0
  case OpCode::I16x8__all_true:
638
0
  case OpCode::I16x8__bitmask:
639
0
  case OpCode::I16x8__narrow_i32x4_s:
640
0
  case OpCode::I16x8__narrow_i32x4_u:
641
0
  case OpCode::I16x8__extend_low_i8x16_s:
642
0
  case OpCode::I16x8__extend_high_i8x16_s:
643
0
  case OpCode::I16x8__extend_low_i8x16_u:
644
0
  case OpCode::I16x8__extend_high_i8x16_u:
645
0
  case OpCode::I16x8__shl:
646
0
  case OpCode::I16x8__shr_s:
647
0
  case OpCode::I16x8__shr_u:
648
0
  case OpCode::I16x8__add:
649
0
  case OpCode::I16x8__add_sat_s:
650
0
  case OpCode::I16x8__add_sat_u:
651
0
  case OpCode::I16x8__sub:
652
0
  case OpCode::I16x8__sub_sat_s:
653
0
  case OpCode::I16x8__sub_sat_u:
654
0
  case OpCode::I16x8__mul:
655
0
  case OpCode::I16x8__min_s:
656
0
  case OpCode::I16x8__min_u:
657
0
  case OpCode::I16x8__max_s:
658
0
  case OpCode::I16x8__max_u:
659
0
  case OpCode::I16x8__avgr_u:
660
0
  case OpCode::I16x8__extmul_low_i8x16_s:
661
0
  case OpCode::I16x8__extmul_high_i8x16_s:
662
0
  case OpCode::I16x8__extmul_low_i8x16_u:
663
0
  case OpCode::I16x8__extmul_high_i8x16_u:
664
0
  case OpCode::I16x8__q15mulr_sat_s:
665
0
  case OpCode::I16x8__extadd_pairwise_i8x16_s:
666
0
  case OpCode::I16x8__extadd_pairwise_i8x16_u:
667
668
0
  case OpCode::I32x4__abs:
669
0
  case OpCode::I32x4__neg:
670
0
  case OpCode::I32x4__all_true:
671
0
  case OpCode::I32x4__bitmask:
672
0
  case OpCode::I32x4__extend_low_i16x8_s:
673
0
  case OpCode::I32x4__extend_high_i16x8_s:
674
0
  case OpCode::I32x4__extend_low_i16x8_u:
675
0
  case OpCode::I32x4__extend_high_i16x8_u:
676
0
  case OpCode::I32x4__shl:
677
0
  case OpCode::I32x4__shr_s:
678
0
  case OpCode::I32x4__shr_u:
679
0
  case OpCode::I32x4__add:
680
0
  case OpCode::I32x4__sub:
681
0
  case OpCode::I32x4__mul:
682
0
  case OpCode::I32x4__min_s:
683
0
  case OpCode::I32x4__min_u:
684
0
  case OpCode::I32x4__max_s:
685
0
  case OpCode::I32x4__max_u:
686
0
  case OpCode::I32x4__extmul_low_i16x8_s:
687
0
  case OpCode::I32x4__extmul_high_i16x8_s:
688
0
  case OpCode::I32x4__extmul_low_i16x8_u:
689
0
  case OpCode::I32x4__extmul_high_i16x8_u:
690
0
  case OpCode::I32x4__extadd_pairwise_i16x8_s:
691
0
  case OpCode::I32x4__extadd_pairwise_i16x8_u:
692
693
0
  case OpCode::I64x2__abs:
694
0
  case OpCode::I64x2__neg:
695
0
  case OpCode::I64x2__bitmask:
696
0
  case OpCode::I64x2__extend_low_i32x4_s:
697
0
  case OpCode::I64x2__extend_high_i32x4_s:
698
0
  case OpCode::I64x2__extend_low_i32x4_u:
699
0
  case OpCode::I64x2__extend_high_i32x4_u:
700
0
  case OpCode::I64x2__shl:
701
0
  case OpCode::I64x2__shr_s:
702
0
  case OpCode::I64x2__shr_u:
703
0
  case OpCode::I64x2__add:
704
0
  case OpCode::I64x2__sub:
705
0
  case OpCode::I64x2__mul:
706
0
  case OpCode::I64x2__eq:
707
0
  case OpCode::I64x2__ne:
708
0
  case OpCode::I64x2__lt_s:
709
0
  case OpCode::I64x2__gt_s:
710
0
  case OpCode::I64x2__le_s:
711
0
  case OpCode::I64x2__ge_s:
712
0
  case OpCode::I64x2__all_true:
713
0
  case OpCode::I64x2__extmul_low_i32x4_s:
714
0
  case OpCode::I64x2__extmul_high_i32x4_s:
715
0
  case OpCode::I64x2__extmul_low_i32x4_u:
716
0
  case OpCode::I64x2__extmul_high_i32x4_u:
717
718
0
  case OpCode::F32x4__abs:
719
0
  case OpCode::F32x4__neg:
720
0
  case OpCode::F32x4__sqrt:
721
0
  case OpCode::F32x4__add:
722
0
  case OpCode::F32x4__sub:
723
0
  case OpCode::F32x4__mul:
724
0
  case OpCode::F32x4__div:
725
0
  case OpCode::F32x4__min:
726
0
  case OpCode::F32x4__max:
727
0
  case OpCode::F32x4__pmin:
728
0
  case OpCode::F32x4__pmax:
729
730
0
  case OpCode::F64x2__abs:
731
0
  case OpCode::F64x2__neg:
732
0
  case OpCode::F64x2__sqrt:
733
0
  case OpCode::F64x2__add:
734
0
  case OpCode::F64x2__sub:
735
0
  case OpCode::F64x2__mul:
736
0
  case OpCode::F64x2__div:
737
0
  case OpCode::F64x2__min:
738
0
  case OpCode::F64x2__max:
739
0
  case OpCode::F64x2__pmin:
740
0
  case OpCode::F64x2__pmax:
741
742
0
  case OpCode::I32x4__trunc_sat_f32x4_s:
743
0
  case OpCode::I32x4__trunc_sat_f32x4_u:
744
0
  case OpCode::F32x4__convert_i32x4_s:
745
0
  case OpCode::F32x4__convert_i32x4_u:
746
0
  case OpCode::I32x4__trunc_sat_f64x2_s_zero:
747
0
  case OpCode::I32x4__trunc_sat_f64x2_u_zero:
748
0
  case OpCode::F64x2__convert_low_i32x4_s:
749
0
  case OpCode::F64x2__convert_low_i32x4_u:
750
0
  case OpCode::F32x4__demote_f64x2_zero:
751
0
  case OpCode::F64x2__promote_low_f32x4:
752
753
0
  case OpCode::I32x4__dot_i16x8_s:
754
0
  case OpCode::F32x4__ceil:
755
0
  case OpCode::F32x4__floor:
756
0
  case OpCode::F32x4__trunc:
757
0
  case OpCode::F32x4__nearest:
758
0
  case OpCode::F64x2__ceil:
759
0
  case OpCode::F64x2__floor:
760
0
  case OpCode::F64x2__trunc:
761
0
  case OpCode::F64x2__nearest:
762
0
    return {};
763
764
0
  case OpCode::I8x16__relaxed_swizzle:
765
0
  case OpCode::I32x4__relaxed_trunc_f32x4_s:
766
0
  case OpCode::I32x4__relaxed_trunc_f32x4_u:
767
0
  case OpCode::I32x4__relaxed_trunc_f64x2_s_zero:
768
0
  case OpCode::I32x4__relaxed_trunc_f64x2_u_zero:
769
0
  case OpCode::F32x4__relaxed_madd:
770
0
  case OpCode::F32x4__relaxed_nmadd:
771
0
  case OpCode::F64x2__relaxed_madd:
772
0
  case OpCode::F64x2__relaxed_nmadd:
773
0
  case OpCode::I8x16__relaxed_laneselect:
774
0
  case OpCode::I16x8__relaxed_laneselect:
775
0
  case OpCode::I32x4__relaxed_laneselect:
776
0
  case OpCode::I64x2__relaxed_laneselect:
777
0
  case OpCode::F32x4__relaxed_min:
778
0
  case OpCode::F32x4__relaxed_max:
779
0
  case OpCode::F64x2__relaxed_min:
780
0
  case OpCode::F64x2__relaxed_max:
781
0
  case OpCode::I16x8__relaxed_q15mulr_s:
782
0
  case OpCode::I16x8__relaxed_dot_i8x16_i7x16_s:
783
0
  case OpCode::I32x4__relaxed_dot_i8x16_i7x16_add_s:
784
0
    return {};
785
786
  // Atomic Memory Instructions.
787
0
  case OpCode::Atomic__fence:
788
0
    return serializeCheckZero(Instr.getTargetIndex());
789
790
0
  case OpCode::Memory__atomic__notify:
791
0
  case OpCode::Memory__atomic__wait32:
792
0
  case OpCode::Memory__atomic__wait64:
793
794
0
  case OpCode::I32__atomic__load:
795
0
  case OpCode::I64__atomic__load:
796
0
  case OpCode::I32__atomic__load8_u:
797
0
  case OpCode::I32__atomic__load16_u:
798
0
  case OpCode::I64__atomic__load8_u:
799
0
  case OpCode::I64__atomic__load16_u:
800
0
  case OpCode::I64__atomic__load32_u:
801
0
  case OpCode::I32__atomic__store:
802
0
  case OpCode::I64__atomic__store:
803
0
  case OpCode::I32__atomic__store8:
804
0
  case OpCode::I32__atomic__store16:
805
0
  case OpCode::I64__atomic__store8:
806
0
  case OpCode::I64__atomic__store16:
807
0
  case OpCode::I64__atomic__store32:
808
0
  case OpCode::I32__atomic__rmw__add:
809
0
  case OpCode::I64__atomic__rmw__add:
810
0
  case OpCode::I32__atomic__rmw8__add_u:
811
0
  case OpCode::I32__atomic__rmw16__add_u:
812
0
  case OpCode::I64__atomic__rmw8__add_u:
813
0
  case OpCode::I64__atomic__rmw16__add_u:
814
0
  case OpCode::I64__atomic__rmw32__add_u:
815
0
  case OpCode::I32__atomic__rmw__sub:
816
0
  case OpCode::I64__atomic__rmw__sub:
817
0
  case OpCode::I32__atomic__rmw8__sub_u:
818
0
  case OpCode::I32__atomic__rmw16__sub_u:
819
0
  case OpCode::I64__atomic__rmw8__sub_u:
820
0
  case OpCode::I64__atomic__rmw16__sub_u:
821
0
  case OpCode::I64__atomic__rmw32__sub_u:
822
0
  case OpCode::I32__atomic__rmw__and:
823
0
  case OpCode::I64__atomic__rmw__and:
824
0
  case OpCode::I32__atomic__rmw8__and_u:
825
0
  case OpCode::I32__atomic__rmw16__and_u:
826
0
  case OpCode::I64__atomic__rmw8__and_u:
827
0
  case OpCode::I64__atomic__rmw16__and_u:
828
0
  case OpCode::I64__atomic__rmw32__and_u:
829
0
  case OpCode::I32__atomic__rmw__or:
830
0
  case OpCode::I64__atomic__rmw__or:
831
0
  case OpCode::I32__atomic__rmw8__or_u:
832
0
  case OpCode::I32__atomic__rmw16__or_u:
833
0
  case OpCode::I64__atomic__rmw8__or_u:
834
0
  case OpCode::I64__atomic__rmw16__or_u:
835
0
  case OpCode::I64__atomic__rmw32__or_u:
836
0
  case OpCode::I32__atomic__rmw__xor:
837
0
  case OpCode::I64__atomic__rmw__xor:
838
0
  case OpCode::I32__atomic__rmw8__xor_u:
839
0
  case OpCode::I32__atomic__rmw16__xor_u:
840
0
  case OpCode::I64__atomic__rmw8__xor_u:
841
0
  case OpCode::I64__atomic__rmw16__xor_u:
842
0
  case OpCode::I64__atomic__rmw32__xor_u:
843
0
  case OpCode::I32__atomic__rmw__xchg:
844
0
  case OpCode::I64__atomic__rmw__xchg:
845
0
  case OpCode::I32__atomic__rmw8__xchg_u:
846
0
  case OpCode::I32__atomic__rmw16__xchg_u:
847
0
  case OpCode::I64__atomic__rmw8__xchg_u:
848
0
  case OpCode::I64__atomic__rmw16__xchg_u:
849
0
  case OpCode::I64__atomic__rmw32__xchg_u:
850
0
  case OpCode::I32__atomic__rmw__cmpxchg:
851
0
  case OpCode::I64__atomic__rmw__cmpxchg:
852
0
  case OpCode::I32__atomic__rmw8__cmpxchg_u:
853
0
  case OpCode::I32__atomic__rmw16__cmpxchg_u:
854
0
  case OpCode::I64__atomic__rmw8__cmpxchg_u:
855
0
  case OpCode::I64__atomic__rmw16__cmpxchg_u:
856
0
  case OpCode::I64__atomic__rmw32__cmpxchg_u:
857
0
    return serializeMemImmediate();
858
859
0
  default:
860
0
    assumingUnreachable();
861
0
  }
862
0
}
863
864
} // namespace Loader
865
} // namespace WasmEdge