instruction.go

   1package wasm
   2
   3// Opcode is the binary Opcode of an instruction. See also InstructionName
   4type Opcode = byte
   5
   6const (
   7	// OpcodeUnreachable causes an unconditional trap.
   8	OpcodeUnreachable Opcode = 0x00
   9	// OpcodeNop does nothing
  10	OpcodeNop Opcode = 0x01
  11	// OpcodeBlock brackets a sequence of instructions. A branch instruction on an if label breaks out to after its
  12	// OpcodeEnd.
  13	OpcodeBlock Opcode = 0x02
  14	// OpcodeLoop brackets a sequence of instructions. A branch instruction on a loop label will jump back to the
  15	// beginning of its block.
  16	OpcodeLoop Opcode = 0x03
  17	// OpcodeIf brackets a sequence of instructions. When the top of the stack evaluates to 1, the block is executed.
  18	// Zero jumps to the optional OpcodeElse. A branch instruction on an if label breaks out to after its OpcodeEnd.
  19	OpcodeIf Opcode = 0x04
  20	// OpcodeElse brackets a sequence of instructions enclosed by an OpcodeIf. A branch instruction on a then label
  21	// breaks out to after the OpcodeEnd on the enclosing OpcodeIf.
  22	OpcodeElse Opcode = 0x05
  23	// OpcodeEnd terminates a control instruction OpcodeBlock, OpcodeLoop or OpcodeIf.
  24	OpcodeEnd Opcode = 0x0b
  25
  26	// OpcodeBr is a stack-polymorphic opcode that performs an unconditional branch. How the stack is modified depends
  27	// on whether the "br" is enclosed by a loop, and if CoreFeatureMultiValue is enabled.
  28	//
  29	// Here are the rules in pseudocode about how the stack is modified based on the "br" operand L (label):
  30	//	if L is loop: append(L.originalStackWithoutInputs, N-values popped from the stack) where N == L.inputs
  31	//	else: append(L.originalStackWithoutInputs, N-values popped from the stack) where N == L.results
  32	//
  33	// In WebAssembly 1.0 (20191205), N can be zero or one. When CoreFeatureMultiValue is enabled, N can be more than one,
  34	// depending on the type use of the label L.
  35	//
  36	// See https://www.w3.org/TR/2019/REC-wasm-core-1-20191205/#-hrefsyntax-instr-controlmathsfbrl
  37	OpcodeBr Opcode = 0x0c
  38
  39	OpcodeBrIf         Opcode = 0x0d
  40	OpcodeBrTable      Opcode = 0x0e
  41	OpcodeReturn       Opcode = 0x0f
  42	OpcodeCall         Opcode = 0x10
  43	OpcodeCallIndirect Opcode = 0x11
  44
  45	// parametric instructions
  46
  47	OpcodeDrop        Opcode = 0x1a
  48	OpcodeSelect      Opcode = 0x1b
  49	OpcodeTypedSelect Opcode = 0x1c
  50
  51	// variable instructions
  52
  53	OpcodeLocalGet  Opcode = 0x20
  54	OpcodeLocalSet  Opcode = 0x21
  55	OpcodeLocalTee  Opcode = 0x22
  56	OpcodeGlobalGet Opcode = 0x23
  57	OpcodeGlobalSet Opcode = 0x24
  58
  59	// Below are toggled with CoreFeatureReferenceTypes
  60
  61	OpcodeTableGet Opcode = 0x25
  62	OpcodeTableSet Opcode = 0x26
  63
  64	// memory instructions
  65
  66	OpcodeI32Load    Opcode = 0x28
  67	OpcodeI64Load    Opcode = 0x29
  68	OpcodeF32Load    Opcode = 0x2a
  69	OpcodeF64Load    Opcode = 0x2b
  70	OpcodeI32Load8S  Opcode = 0x2c
  71	OpcodeI32Load8U  Opcode = 0x2d
  72	OpcodeI32Load16S Opcode = 0x2e
  73	OpcodeI32Load16U Opcode = 0x2f
  74	OpcodeI64Load8S  Opcode = 0x30
  75	OpcodeI64Load8U  Opcode = 0x31
  76	OpcodeI64Load16S Opcode = 0x32
  77	OpcodeI64Load16U Opcode = 0x33
  78	OpcodeI64Load32S Opcode = 0x34
  79	OpcodeI64Load32U Opcode = 0x35
  80	OpcodeI32Store   Opcode = 0x36
  81	OpcodeI64Store   Opcode = 0x37
  82	OpcodeF32Store   Opcode = 0x38
  83	OpcodeF64Store   Opcode = 0x39
  84	OpcodeI32Store8  Opcode = 0x3a
  85	OpcodeI32Store16 Opcode = 0x3b
  86	OpcodeI64Store8  Opcode = 0x3c
  87	OpcodeI64Store16 Opcode = 0x3d
  88	OpcodeI64Store32 Opcode = 0x3e
  89	OpcodeMemorySize Opcode = 0x3f
  90	OpcodeMemoryGrow Opcode = 0x40
  91
  92	// const instructions
  93
  94	OpcodeI32Const Opcode = 0x41
  95	OpcodeI64Const Opcode = 0x42
  96	OpcodeF32Const Opcode = 0x43
  97	OpcodeF64Const Opcode = 0x44
  98
  99	// numeric instructions
 100
 101	OpcodeI32Eqz Opcode = 0x45
 102	OpcodeI32Eq  Opcode = 0x46
 103	OpcodeI32Ne  Opcode = 0x47
 104	OpcodeI32LtS Opcode = 0x48
 105	OpcodeI32LtU Opcode = 0x49
 106	OpcodeI32GtS Opcode = 0x4a
 107	OpcodeI32GtU Opcode = 0x4b
 108	OpcodeI32LeS Opcode = 0x4c
 109	OpcodeI32LeU Opcode = 0x4d
 110	OpcodeI32GeS Opcode = 0x4e
 111	OpcodeI32GeU Opcode = 0x4f
 112
 113	OpcodeI64Eqz Opcode = 0x50
 114	OpcodeI64Eq  Opcode = 0x51
 115	OpcodeI64Ne  Opcode = 0x52
 116	OpcodeI64LtS Opcode = 0x53
 117	OpcodeI64LtU Opcode = 0x54
 118	OpcodeI64GtS Opcode = 0x55
 119	OpcodeI64GtU Opcode = 0x56
 120	OpcodeI64LeS Opcode = 0x57
 121	OpcodeI64LeU Opcode = 0x58
 122	OpcodeI64GeS Opcode = 0x59
 123	OpcodeI64GeU Opcode = 0x5a
 124
 125	OpcodeF32Eq Opcode = 0x5b
 126	OpcodeF32Ne Opcode = 0x5c
 127	OpcodeF32Lt Opcode = 0x5d
 128	OpcodeF32Gt Opcode = 0x5e
 129	OpcodeF32Le Opcode = 0x5f
 130	OpcodeF32Ge Opcode = 0x60
 131
 132	OpcodeF64Eq Opcode = 0x61
 133	OpcodeF64Ne Opcode = 0x62
 134	OpcodeF64Lt Opcode = 0x63
 135	OpcodeF64Gt Opcode = 0x64
 136	OpcodeF64Le Opcode = 0x65
 137	OpcodeF64Ge Opcode = 0x66
 138
 139	OpcodeI32Clz    Opcode = 0x67
 140	OpcodeI32Ctz    Opcode = 0x68
 141	OpcodeI32Popcnt Opcode = 0x69
 142	OpcodeI32Add    Opcode = 0x6a
 143	OpcodeI32Sub    Opcode = 0x6b
 144	OpcodeI32Mul    Opcode = 0x6c
 145	OpcodeI32DivS   Opcode = 0x6d
 146	OpcodeI32DivU   Opcode = 0x6e
 147	OpcodeI32RemS   Opcode = 0x6f
 148	OpcodeI32RemU   Opcode = 0x70
 149	OpcodeI32And    Opcode = 0x71
 150	OpcodeI32Or     Opcode = 0x72
 151	OpcodeI32Xor    Opcode = 0x73
 152	OpcodeI32Shl    Opcode = 0x74
 153	OpcodeI32ShrS   Opcode = 0x75
 154	OpcodeI32ShrU   Opcode = 0x76
 155	OpcodeI32Rotl   Opcode = 0x77
 156	OpcodeI32Rotr   Opcode = 0x78
 157
 158	OpcodeI64Clz    Opcode = 0x79
 159	OpcodeI64Ctz    Opcode = 0x7a
 160	OpcodeI64Popcnt Opcode = 0x7b
 161	OpcodeI64Add    Opcode = 0x7c
 162	OpcodeI64Sub    Opcode = 0x7d
 163	OpcodeI64Mul    Opcode = 0x7e
 164	OpcodeI64DivS   Opcode = 0x7f
 165	OpcodeI64DivU   Opcode = 0x80
 166	OpcodeI64RemS   Opcode = 0x81
 167	OpcodeI64RemU   Opcode = 0x82
 168	OpcodeI64And    Opcode = 0x83
 169	OpcodeI64Or     Opcode = 0x84
 170	OpcodeI64Xor    Opcode = 0x85
 171	OpcodeI64Shl    Opcode = 0x86
 172	OpcodeI64ShrS   Opcode = 0x87
 173	OpcodeI64ShrU   Opcode = 0x88
 174	OpcodeI64Rotl   Opcode = 0x89
 175	OpcodeI64Rotr   Opcode = 0x8a
 176
 177	OpcodeF32Abs      Opcode = 0x8b
 178	OpcodeF32Neg      Opcode = 0x8c
 179	OpcodeF32Ceil     Opcode = 0x8d
 180	OpcodeF32Floor    Opcode = 0x8e
 181	OpcodeF32Trunc    Opcode = 0x8f
 182	OpcodeF32Nearest  Opcode = 0x90
 183	OpcodeF32Sqrt     Opcode = 0x91
 184	OpcodeF32Add      Opcode = 0x92
 185	OpcodeF32Sub      Opcode = 0x93
 186	OpcodeF32Mul      Opcode = 0x94
 187	OpcodeF32Div      Opcode = 0x95
 188	OpcodeF32Min      Opcode = 0x96
 189	OpcodeF32Max      Opcode = 0x97
 190	OpcodeF32Copysign Opcode = 0x98
 191
 192	OpcodeF64Abs      Opcode = 0x99
 193	OpcodeF64Neg      Opcode = 0x9a
 194	OpcodeF64Ceil     Opcode = 0x9b
 195	OpcodeF64Floor    Opcode = 0x9c
 196	OpcodeF64Trunc    Opcode = 0x9d
 197	OpcodeF64Nearest  Opcode = 0x9e
 198	OpcodeF64Sqrt     Opcode = 0x9f
 199	OpcodeF64Add      Opcode = 0xa0
 200	OpcodeF64Sub      Opcode = 0xa1
 201	OpcodeF64Mul      Opcode = 0xa2
 202	OpcodeF64Div      Opcode = 0xa3
 203	OpcodeF64Min      Opcode = 0xa4
 204	OpcodeF64Max      Opcode = 0xa5
 205	OpcodeF64Copysign Opcode = 0xa6
 206
 207	OpcodeI32WrapI64   Opcode = 0xa7
 208	OpcodeI32TruncF32S Opcode = 0xa8
 209	OpcodeI32TruncF32U Opcode = 0xa9
 210	OpcodeI32TruncF64S Opcode = 0xaa
 211	OpcodeI32TruncF64U Opcode = 0xab
 212
 213	OpcodeI64ExtendI32S Opcode = 0xac
 214	OpcodeI64ExtendI32U Opcode = 0xad
 215	OpcodeI64TruncF32S  Opcode = 0xae
 216	OpcodeI64TruncF32U  Opcode = 0xaf
 217	OpcodeI64TruncF64S  Opcode = 0xb0
 218	OpcodeI64TruncF64U  Opcode = 0xb1
 219
 220	OpcodeF32ConvertI32S Opcode = 0xb2
 221	OpcodeF32ConvertI32U Opcode = 0xb3
 222	OpcodeF32ConvertI64S Opcode = 0xb4
 223	OpcodeF32ConvertI64U Opcode = 0xb5
 224	OpcodeF32DemoteF64   Opcode = 0xb6
 225
 226	OpcodeF64ConvertI32S Opcode = 0xb7
 227	OpcodeF64ConvertI32U Opcode = 0xb8
 228	OpcodeF64ConvertI64S Opcode = 0xb9
 229	OpcodeF64ConvertI64U Opcode = 0xba
 230	OpcodeF64PromoteF32  Opcode = 0xbb
 231
 232	OpcodeI32ReinterpretF32 Opcode = 0xbc
 233	OpcodeI64ReinterpretF64 Opcode = 0xbd
 234	OpcodeF32ReinterpretI32 Opcode = 0xbe
 235	OpcodeF64ReinterpretI64 Opcode = 0xbf
 236
 237	// OpcodeRefNull pushes a null reference value whose type is specified by immediate to this opcode.
 238	// This is defined in the reference-types proposal, but necessary for CoreFeatureBulkMemoryOperations as well.
 239	//
 240	// Currently only supported in the constant expression in element segments.
 241	OpcodeRefNull = 0xd0
 242	// OpcodeRefIsNull pops a reference value, and pushes 1 if it is null, 0 otherwise.
 243	// This is defined in the reference-types proposal, but necessary for CoreFeatureBulkMemoryOperations as well.
 244	//
 245	// Currently not supported.
 246	OpcodeRefIsNull = 0xd1
 247	// OpcodeRefFunc pushes a funcref value whose index equals the immediate to this opcode.
 248	// This is defined in the reference-types proposal, but necessary for CoreFeatureBulkMemoryOperations as well.
 249	//
 250	// Currently, this is only supported in the constant expression in element segments.
 251	OpcodeRefFunc = 0xd2
 252
 253	// Below are toggled with CoreFeatureSignExtensionOps
 254
 255	// OpcodeI32Extend8S extends a signed 8-bit integer to a 32-bit integer.
 256	// Note: This is dependent on the flag CoreFeatureSignExtensionOps
 257	OpcodeI32Extend8S Opcode = 0xc0
 258
 259	// OpcodeI32Extend16S extends a signed 16-bit integer to a 32-bit integer.
 260	// Note: This is dependent on the flag CoreFeatureSignExtensionOps
 261	OpcodeI32Extend16S Opcode = 0xc1
 262
 263	// OpcodeI64Extend8S extends a signed 8-bit integer to a 64-bit integer.
 264	// Note: This is dependent on the flag CoreFeatureSignExtensionOps
 265	OpcodeI64Extend8S Opcode = 0xc2
 266
 267	// OpcodeI64Extend16S extends a signed 16-bit integer to a 64-bit integer.
 268	// Note: This is dependent on the flag CoreFeatureSignExtensionOps
 269	OpcodeI64Extend16S Opcode = 0xc3
 270
 271	// OpcodeI64Extend32S extends a signed 32-bit integer to a 64-bit integer.
 272	// Note: This is dependent on the flag CoreFeatureSignExtensionOps
 273	OpcodeI64Extend32S Opcode = 0xc4
 274
 275	// OpcodeMiscPrefix is the prefix of various multi-byte opcodes.
 276	// Introduced in CoreFeatureNonTrappingFloatToIntConversion, but used in other
 277	// features, such as CoreFeatureBulkMemoryOperations.
 278	OpcodeMiscPrefix Opcode = 0xfc
 279
 280	// OpcodeVecPrefix is the prefix of all vector isntructions introduced in
 281	// CoreFeatureSIMD.
 282	OpcodeVecPrefix Opcode = 0xfd
 283
 284	// OpcodeAtomicPrefix is the prefix of all atomic instructions introduced in
 285	// CoreFeatureThreads.
 286	OpcodeAtomicPrefix Opcode = 0xfe
 287)
 288
 289// OpcodeMisc represents opcodes of the miscellaneous operations.
 290// Such an operations has multi-byte encoding which is prefixed by OpcodeMiscPrefix.
 291type OpcodeMisc = byte
 292
 293const (
 294	// Below are toggled with CoreFeatureNonTrappingFloatToIntConversion.
 295	// https://github.com/WebAssembly/spec/blob/ce4b6c4d47eb06098cc7ab2e81f24748da822f20/proposals/nontrapping-float-to-int-conversion/Overview.md
 296
 297	OpcodeMiscI32TruncSatF32S OpcodeMisc = 0x00
 298	OpcodeMiscI32TruncSatF32U OpcodeMisc = 0x01
 299	OpcodeMiscI32TruncSatF64S OpcodeMisc = 0x02
 300	OpcodeMiscI32TruncSatF64U OpcodeMisc = 0x03
 301	OpcodeMiscI64TruncSatF32S OpcodeMisc = 0x04
 302	OpcodeMiscI64TruncSatF32U OpcodeMisc = 0x05
 303	OpcodeMiscI64TruncSatF64S OpcodeMisc = 0x06
 304	OpcodeMiscI64TruncSatF64U OpcodeMisc = 0x07
 305
 306	// Below are toggled with CoreFeatureBulkMemoryOperations.
 307	// Opcodes are those new in document/core/appendix/index-instructions.rst (the commit that merged the feature).
 308	// See https://github.com/WebAssembly/spec/commit/7fa2f20a6df4cf1c114582c8cb60f5bfcdbf1be1
 309	// See https://www.w3.org/TR/2022/WD-wasm-core-2-20220419/appendix/changes.html#bulk-memory-and-table-instructions
 310
 311	OpcodeMiscMemoryInit OpcodeMisc = 0x08
 312	OpcodeMiscDataDrop   OpcodeMisc = 0x09
 313	OpcodeMiscMemoryCopy OpcodeMisc = 0x0a
 314	OpcodeMiscMemoryFill OpcodeMisc = 0x0b
 315	OpcodeMiscTableInit  OpcodeMisc = 0x0c
 316	OpcodeMiscElemDrop   OpcodeMisc = 0x0d
 317	OpcodeMiscTableCopy  OpcodeMisc = 0x0e
 318
 319	// Below are toggled with CoreFeatureReferenceTypes
 320
 321	OpcodeMiscTableGrow OpcodeMisc = 0x0f
 322	OpcodeMiscTableSize OpcodeMisc = 0x10
 323	OpcodeMiscTableFill OpcodeMisc = 0x11
 324)
 325
 326// OpcodeVec represents an opcode of a vector instructions which has
 327// multi-byte encoding and is prefixed by OpcodeMiscPrefix.
 328//
 329// These opcodes are toggled with CoreFeatureSIMD.
 330type OpcodeVec = byte
 331
 332const (
 333	// Loads and stores.
 334
 335	OpcodeVecV128Load        OpcodeVec = 0x00
 336	OpcodeVecV128Load8x8s    OpcodeVec = 0x01
 337	OpcodeVecV128Load8x8u    OpcodeVec = 0x02
 338	OpcodeVecV128Load16x4s   OpcodeVec = 0x03
 339	OpcodeVecV128Load16x4u   OpcodeVec = 0x04
 340	OpcodeVecV128Load32x2s   OpcodeVec = 0x05
 341	OpcodeVecV128Load32x2u   OpcodeVec = 0x06
 342	OpcodeVecV128Load8Splat  OpcodeVec = 0x07
 343	OpcodeVecV128Load16Splat OpcodeVec = 0x08
 344	OpcodeVecV128Load32Splat OpcodeVec = 0x09
 345	OpcodeVecV128Load64Splat OpcodeVec = 0x0a
 346
 347	OpcodeVecV128Load32zero OpcodeVec = 0x5c
 348	OpcodeVecV128Load64zero OpcodeVec = 0x5d
 349
 350	OpcodeVecV128Store       OpcodeVec = 0x0b
 351	OpcodeVecV128Load8Lane   OpcodeVec = 0x54
 352	OpcodeVecV128Load16Lane  OpcodeVec = 0x55
 353	OpcodeVecV128Load32Lane  OpcodeVec = 0x56
 354	OpcodeVecV128Load64Lane  OpcodeVec = 0x57
 355	OpcodeVecV128Store8Lane  OpcodeVec = 0x58
 356	OpcodeVecV128Store16Lane OpcodeVec = 0x59
 357	OpcodeVecV128Store32Lane OpcodeVec = 0x5a
 358	OpcodeVecV128Store64Lane OpcodeVec = 0x5b
 359
 360	// OpcodeVecV128Const is the vector const instruction.
 361	OpcodeVecV128Const OpcodeVec = 0x0c
 362
 363	// OpcodeVecV128i8x16Shuffle is the vector shuffle instruction.
 364	OpcodeVecV128i8x16Shuffle OpcodeVec = 0x0d
 365
 366	// Extrac and replaces.
 367
 368	OpcodeVecI8x16ExtractLaneS OpcodeVec = 0x15
 369	OpcodeVecI8x16ExtractLaneU OpcodeVec = 0x16
 370	OpcodeVecI8x16ReplaceLane  OpcodeVec = 0x17
 371	OpcodeVecI16x8ExtractLaneS OpcodeVec = 0x18
 372	OpcodeVecI16x8ExtractLaneU OpcodeVec = 0x19
 373	OpcodeVecI16x8ReplaceLane  OpcodeVec = 0x1a
 374	OpcodeVecI32x4ExtractLane  OpcodeVec = 0x1b
 375	OpcodeVecI32x4ReplaceLane  OpcodeVec = 0x1c
 376	OpcodeVecI64x2ExtractLane  OpcodeVec = 0x1d
 377	OpcodeVecI64x2ReplaceLane  OpcodeVec = 0x1e
 378	OpcodeVecF32x4ExtractLane  OpcodeVec = 0x1f
 379	OpcodeVecF32x4ReplaceLane  OpcodeVec = 0x20
 380	OpcodeVecF64x2ExtractLane  OpcodeVec = 0x21
 381	OpcodeVecF64x2ReplaceLane  OpcodeVec = 0x22
 382
 383	// Splat and swizzle.
 384
 385	OpcodeVecI8x16Swizzle OpcodeVec = 0x0e
 386	OpcodeVecI8x16Splat   OpcodeVec = 0x0f
 387	OpcodeVecI16x8Splat   OpcodeVec = 0x10
 388	OpcodeVecI32x4Splat   OpcodeVec = 0x11
 389	OpcodeVecI64x2Splat   OpcodeVec = 0x12
 390	OpcodeVecF32x4Splat   OpcodeVec = 0x13
 391	OpcodeVecF64x2Splat   OpcodeVec = 0x14
 392
 393	// i8 comparisons.
 394
 395	OpcodeVecI8x16Eq  OpcodeVec = 0x23
 396	OpcodeVecI8x16Ne  OpcodeVec = 0x24
 397	OpcodeVecI8x16LtS OpcodeVec = 0x25
 398	OpcodeVecI8x16LtU OpcodeVec = 0x26
 399	OpcodeVecI8x16GtS OpcodeVec = 0x27
 400	OpcodeVecI8x16GtU OpcodeVec = 0x28
 401	OpcodeVecI8x16LeS OpcodeVec = 0x29
 402	OpcodeVecI8x16LeU OpcodeVec = 0x2a
 403	OpcodeVecI8x16GeS OpcodeVec = 0x2b
 404	OpcodeVecI8x16GeU OpcodeVec = 0x2c
 405
 406	// i16 comparisons.
 407
 408	OpcodeVecI16x8Eq  OpcodeVec = 0x2d
 409	OpcodeVecI16x8Ne  OpcodeVec = 0x2e
 410	OpcodeVecI16x8LtS OpcodeVec = 0x2f
 411	OpcodeVecI16x8LtU OpcodeVec = 0x30
 412	OpcodeVecI16x8GtS OpcodeVec = 0x31
 413	OpcodeVecI16x8GtU OpcodeVec = 0x32
 414	OpcodeVecI16x8LeS OpcodeVec = 0x33
 415	OpcodeVecI16x8LeU OpcodeVec = 0x34
 416	OpcodeVecI16x8GeS OpcodeVec = 0x35
 417	OpcodeVecI16x8GeU OpcodeVec = 0x36
 418
 419	// i32 comparisons.
 420
 421	OpcodeVecI32x4Eq  OpcodeVec = 0x37
 422	OpcodeVecI32x4Ne  OpcodeVec = 0x38
 423	OpcodeVecI32x4LtS OpcodeVec = 0x39
 424	OpcodeVecI32x4LtU OpcodeVec = 0x3a
 425	OpcodeVecI32x4GtS OpcodeVec = 0x3b
 426	OpcodeVecI32x4GtU OpcodeVec = 0x3c
 427	OpcodeVecI32x4LeS OpcodeVec = 0x3d
 428	OpcodeVecI32x4LeU OpcodeVec = 0x3e
 429	OpcodeVecI32x4GeS OpcodeVec = 0x3f
 430	OpcodeVecI32x4GeU OpcodeVec = 0x40
 431
 432	// i64 comparisons.
 433
 434	OpcodeVecI64x2Eq  OpcodeVec = 0xd6
 435	OpcodeVecI64x2Ne  OpcodeVec = 0xd7
 436	OpcodeVecI64x2LtS OpcodeVec = 0xd8
 437	OpcodeVecI64x2GtS OpcodeVec = 0xd9
 438	OpcodeVecI64x2LeS OpcodeVec = 0xda
 439	OpcodeVecI64x2GeS OpcodeVec = 0xdb
 440
 441	// f32 comparisons.
 442
 443	OpcodeVecF32x4Eq OpcodeVec = 0x41
 444	OpcodeVecF32x4Ne OpcodeVec = 0x42
 445	OpcodeVecF32x4Lt OpcodeVec = 0x43
 446	OpcodeVecF32x4Gt OpcodeVec = 0x44
 447	OpcodeVecF32x4Le OpcodeVec = 0x45
 448	OpcodeVecF32x4Ge OpcodeVec = 0x46
 449
 450	// f64 comparisons.
 451
 452	OpcodeVecF64x2Eq OpcodeVec = 0x47
 453	OpcodeVecF64x2Ne OpcodeVec = 0x48
 454	OpcodeVecF64x2Lt OpcodeVec = 0x49
 455	OpcodeVecF64x2Gt OpcodeVec = 0x4a
 456	OpcodeVecF64x2Le OpcodeVec = 0x4b
 457	OpcodeVecF64x2Ge OpcodeVec = 0x4c
 458
 459	// v128 logical instructions.
 460
 461	OpcodeVecV128Not       OpcodeVec = 0x4d
 462	OpcodeVecV128And       OpcodeVec = 0x4e
 463	OpcodeVecV128AndNot    OpcodeVec = 0x4f
 464	OpcodeVecV128Or        OpcodeVec = 0x50
 465	OpcodeVecV128Xor       OpcodeVec = 0x51
 466	OpcodeVecV128Bitselect OpcodeVec = 0x52
 467	OpcodeVecV128AnyTrue   OpcodeVec = 0x53
 468
 469	// i8 misc.
 470
 471	OpcodeVecI8x16Abs          OpcodeVec = 0x60
 472	OpcodeVecI8x16Neg          OpcodeVec = 0x61
 473	OpcodeVecI8x16Popcnt       OpcodeVec = 0x62
 474	OpcodeVecI8x16AllTrue      OpcodeVec = 0x63
 475	OpcodeVecI8x16BitMask      OpcodeVec = 0x64
 476	OpcodeVecI8x16NarrowI16x8S OpcodeVec = 0x65
 477	OpcodeVecI8x16NarrowI16x8U OpcodeVec = 0x66
 478
 479	OpcodeVecI8x16Shl     OpcodeVec = 0x6b
 480	OpcodeVecI8x16ShrS    OpcodeVec = 0x6c
 481	OpcodeVecI8x16ShrU    OpcodeVec = 0x6d
 482	OpcodeVecI8x16Add     OpcodeVec = 0x6e
 483	OpcodeVecI8x16AddSatS OpcodeVec = 0x6f
 484
 485	OpcodeVecI8x16AddSatU OpcodeVec = 0x70
 486	OpcodeVecI8x16Sub     OpcodeVec = 0x71
 487	OpcodeVecI8x16SubSatS OpcodeVec = 0x72
 488	OpcodeVecI8x16SubSatU OpcodeVec = 0x73
 489	OpcodeVecI8x16MinS    OpcodeVec = 0x76
 490	OpcodeVecI8x16MinU    OpcodeVec = 0x77
 491	OpcodeVecI8x16MaxS    OpcodeVec = 0x78
 492	OpcodeVecI8x16MaxU    OpcodeVec = 0x79
 493	OpcodeVecI8x16AvgrU   OpcodeVec = 0x7b
 494
 495	// i16 misc.
 496
 497	OpcodeVecI16x8ExtaddPairwiseI8x16S OpcodeVec = 0x7c
 498	OpcodeVecI16x8ExtaddPairwiseI8x16U OpcodeVec = 0x7d
 499	OpcodeVecI16x8Abs                  OpcodeVec = 0x80
 500	OpcodeVecI16x8Neg                  OpcodeVec = 0x81
 501	OpcodeVecI16x8Q15mulrSatS          OpcodeVec = 0x82
 502	OpcodeVecI16x8AllTrue              OpcodeVec = 0x83
 503	OpcodeVecI16x8BitMask              OpcodeVec = 0x84
 504	OpcodeVecI16x8NarrowI32x4S         OpcodeVec = 0x85
 505	OpcodeVecI16x8NarrowI32x4U         OpcodeVec = 0x86
 506	OpcodeVecI16x8ExtendLowI8x16S      OpcodeVec = 0x87
 507	OpcodeVecI16x8ExtendHighI8x16S     OpcodeVec = 0x88
 508	OpcodeVecI16x8ExtendLowI8x16U      OpcodeVec = 0x89
 509	OpcodeVecI16x8ExtendHighI8x16U     OpcodeVec = 0x8a
 510	OpcodeVecI16x8Shl                  OpcodeVec = 0x8b
 511	OpcodeVecI16x8ShrS                 OpcodeVec = 0x8c
 512	OpcodeVecI16x8ShrU                 OpcodeVec = 0x8d
 513	OpcodeVecI16x8Add                  OpcodeVec = 0x8e
 514	OpcodeVecI16x8AddSatS              OpcodeVec = 0x8f
 515	OpcodeVecI16x8AddSatU              OpcodeVec = 0x90
 516	OpcodeVecI16x8Sub                  OpcodeVec = 0x91
 517	OpcodeVecI16x8SubSatS              OpcodeVec = 0x92
 518	OpcodeVecI16x8SubSatU              OpcodeVec = 0x93
 519	OpcodeVecI16x8Mul                  OpcodeVec = 0x95
 520	OpcodeVecI16x8MinS                 OpcodeVec = 0x96
 521	OpcodeVecI16x8MinU                 OpcodeVec = 0x97
 522	OpcodeVecI16x8MaxS                 OpcodeVec = 0x98
 523	OpcodeVecI16x8MaxU                 OpcodeVec = 0x99
 524	OpcodeVecI16x8AvgrU                OpcodeVec = 0x9b
 525	OpcodeVecI16x8ExtMulLowI8x16S      OpcodeVec = 0x9c
 526	OpcodeVecI16x8ExtMulHighI8x16S     OpcodeVec = 0x9d
 527	OpcodeVecI16x8ExtMulLowI8x16U      OpcodeVec = 0x9e
 528	OpcodeVecI16x8ExtMulHighI8x16U     OpcodeVec = 0x9f
 529
 530	// i32 misc.
 531
 532	OpcodeVecI32x4ExtaddPairwiseI16x8S OpcodeVec = 0x7e
 533	OpcodeVecI32x4ExtaddPairwiseI16x8U OpcodeVec = 0x7f
 534	OpcodeVecI32x4Abs                  OpcodeVec = 0xa0
 535	OpcodeVecI32x4Neg                  OpcodeVec = 0xa1
 536	OpcodeVecI32x4AllTrue              OpcodeVec = 0xa3
 537	OpcodeVecI32x4BitMask              OpcodeVec = 0xa4
 538	OpcodeVecI32x4ExtendLowI16x8S      OpcodeVec = 0xa7
 539	OpcodeVecI32x4ExtendHighI16x8S     OpcodeVec = 0xa8
 540	OpcodeVecI32x4ExtendLowI16x8U      OpcodeVec = 0xa9
 541	OpcodeVecI32x4ExtendHighI16x8U     OpcodeVec = 0xaa
 542	OpcodeVecI32x4Shl                  OpcodeVec = 0xab
 543	OpcodeVecI32x4ShrS                 OpcodeVec = 0xac
 544	OpcodeVecI32x4ShrU                 OpcodeVec = 0xad
 545	OpcodeVecI32x4Add                  OpcodeVec = 0xae
 546	OpcodeVecI32x4Sub                  OpcodeVec = 0xb1
 547	OpcodeVecI32x4Mul                  OpcodeVec = 0xb5
 548	OpcodeVecI32x4MinS                 OpcodeVec = 0xb6
 549	OpcodeVecI32x4MinU                 OpcodeVec = 0xb7
 550	OpcodeVecI32x4MaxS                 OpcodeVec = 0xb8
 551	OpcodeVecI32x4MaxU                 OpcodeVec = 0xb9
 552	OpcodeVecI32x4DotI16x8S            OpcodeVec = 0xba
 553	OpcodeVecI32x4ExtMulLowI16x8S      OpcodeVec = 0xbc
 554	OpcodeVecI32x4ExtMulHighI16x8S     OpcodeVec = 0xbd
 555	OpcodeVecI32x4ExtMulLowI16x8U      OpcodeVec = 0xbe
 556	OpcodeVecI32x4ExtMulHighI16x8U     OpcodeVec = 0xbf
 557
 558	// i64 misc.
 559
 560	OpcodeVecI64x2Abs              OpcodeVec = 0xc0
 561	OpcodeVecI64x2Neg              OpcodeVec = 0xc1
 562	OpcodeVecI64x2AllTrue          OpcodeVec = 0xc3
 563	OpcodeVecI64x2BitMask          OpcodeVec = 0xc4
 564	OpcodeVecI64x2ExtendLowI32x4S  OpcodeVec = 0xc7
 565	OpcodeVecI64x2ExtendHighI32x4S OpcodeVec = 0xc8
 566	OpcodeVecI64x2ExtendLowI32x4U  OpcodeVec = 0xc9
 567	OpcodeVecI64x2ExtendHighI32x4U OpcodeVec = 0xca
 568	OpcodeVecI64x2Shl              OpcodeVec = 0xcb
 569	OpcodeVecI64x2ShrS             OpcodeVec = 0xcc
 570	OpcodeVecI64x2ShrU             OpcodeVec = 0xcd
 571	OpcodeVecI64x2Add              OpcodeVec = 0xce
 572	OpcodeVecI64x2Sub              OpcodeVec = 0xd1
 573	OpcodeVecI64x2Mul              OpcodeVec = 0xd5
 574	OpcodeVecI64x2ExtMulLowI32x4S  OpcodeVec = 0xdc
 575	OpcodeVecI64x2ExtMulHighI32x4S OpcodeVec = 0xdd
 576	OpcodeVecI64x2ExtMulLowI32x4U  OpcodeVec = 0xde
 577	OpcodeVecI64x2ExtMulHighI32x4U OpcodeVec = 0xdf
 578
 579	// f32 misc.
 580
 581	OpcodeVecF32x4Ceil    OpcodeVec = 0x67
 582	OpcodeVecF32x4Floor   OpcodeVec = 0x68
 583	OpcodeVecF32x4Trunc   OpcodeVec = 0x69
 584	OpcodeVecF32x4Nearest OpcodeVec = 0x6a
 585	OpcodeVecF32x4Abs     OpcodeVec = 0xe0
 586	OpcodeVecF32x4Neg     OpcodeVec = 0xe1
 587	OpcodeVecF32x4Sqrt    OpcodeVec = 0xe3
 588	OpcodeVecF32x4Add     OpcodeVec = 0xe4
 589	OpcodeVecF32x4Sub     OpcodeVec = 0xe5
 590	OpcodeVecF32x4Mul     OpcodeVec = 0xe6
 591	OpcodeVecF32x4Div     OpcodeVec = 0xe7
 592	OpcodeVecF32x4Min     OpcodeVec = 0xe8
 593	OpcodeVecF32x4Max     OpcodeVec = 0xe9
 594	OpcodeVecF32x4Pmin    OpcodeVec = 0xea
 595	OpcodeVecF32x4Pmax    OpcodeVec = 0xeb
 596
 597	// f64 misc.
 598
 599	OpcodeVecF64x2Ceil    OpcodeVec = 0x74
 600	OpcodeVecF64x2Floor   OpcodeVec = 0x75
 601	OpcodeVecF64x2Trunc   OpcodeVec = 0x7a
 602	OpcodeVecF64x2Nearest OpcodeVec = 0x94
 603	OpcodeVecF64x2Abs     OpcodeVec = 0xec
 604	OpcodeVecF64x2Neg     OpcodeVec = 0xed
 605	OpcodeVecF64x2Sqrt    OpcodeVec = 0xef
 606	OpcodeVecF64x2Add     OpcodeVec = 0xf0
 607	OpcodeVecF64x2Sub     OpcodeVec = 0xf1
 608	OpcodeVecF64x2Mul     OpcodeVec = 0xf2
 609	OpcodeVecF64x2Div     OpcodeVec = 0xf3
 610	OpcodeVecF64x2Min     OpcodeVec = 0xf4
 611	OpcodeVecF64x2Max     OpcodeVec = 0xf5
 612	OpcodeVecF64x2Pmin    OpcodeVec = 0xf6
 613	OpcodeVecF64x2Pmax    OpcodeVec = 0xf7
 614
 615	// conversions.
 616
 617	OpcodeVecI32x4TruncSatF32x4S      OpcodeVec = 0xf8
 618	OpcodeVecI32x4TruncSatF32x4U      OpcodeVec = 0xf9
 619	OpcodeVecF32x4ConvertI32x4S       OpcodeVec = 0xfa
 620	OpcodeVecF32x4ConvertI32x4U       OpcodeVec = 0xfb
 621	OpcodeVecI32x4TruncSatF64x2SZero  OpcodeVec = 0xfc
 622	OpcodeVecI32x4TruncSatF64x2UZero  OpcodeVec = 0xfd
 623	OpcodeVecF64x2ConvertLowI32x4S    OpcodeVec = 0xfe
 624	OpcodeVecF64x2ConvertLowI32x4U    OpcodeVec = 0xff
 625	OpcodeVecF32x4DemoteF64x2Zero     OpcodeVec = 0x5e
 626	OpcodeVecF64x2PromoteLowF32x4Zero OpcodeVec = 0x5f
 627)
 628
 629// OpcodeAtomic represents an opcode of atomic instructions which has
 630// multi-byte encoding and is prefixed by OpcodeAtomicPrefix.
 631//
 632// These opcodes are toggled with CoreFeaturesThreads.
 633type OpcodeAtomic = byte
 634
 635const (
 636	// OpcodeAtomicMemoryNotify represents the instruction memory.atomic.notify.
 637	OpcodeAtomicMemoryNotify OpcodeAtomic = 0x00
 638	// OpcodeAtomicMemoryWait32 represents the instruction memory.atomic.wait32.
 639	OpcodeAtomicMemoryWait32 OpcodeAtomic = 0x01
 640	// OpcodeAtomicMemoryWait64 represents the instruction memory.atomic.wait64.
 641	OpcodeAtomicMemoryWait64 OpcodeAtomic = 0x02
 642	// OpcodeAtomicFence represents the instruction atomic.fence.
 643	OpcodeAtomicFence OpcodeAtomic = 0x03
 644
 645	// OpcodeAtomicI32Load represents the instruction i32.atomic.load.
 646	OpcodeAtomicI32Load OpcodeAtomic = 0x10
 647	// OpcodeAtomicI64Load represents the instruction i64.atomic.load.
 648	OpcodeAtomicI64Load OpcodeAtomic = 0x11
 649	// OpcodeAtomicI32Load8U represents the instruction i32.atomic.load8_u.
 650	OpcodeAtomicI32Load8U OpcodeAtomic = 0x12
 651	// OpcodeAtomicI32Load16U represents the instruction i32.atomic.load16_u.
 652	OpcodeAtomicI32Load16U OpcodeAtomic = 0x13
 653	// OpcodeAtomicI64Load8U represents the instruction i64.atomic.load8_u.
 654	OpcodeAtomicI64Load8U OpcodeAtomic = 0x14
 655	// OpcodeAtomicI64Load16U represents the instruction i64.atomic.load16_u.
 656	OpcodeAtomicI64Load16U OpcodeAtomic = 0x15
 657	// OpcodeAtomicI64Load32U represents the instruction i64.atomic.load32_u.
 658	OpcodeAtomicI64Load32U OpcodeAtomic = 0x16
 659	// OpcodeAtomicI32Store represents the instruction i32.atomic.store.
 660	OpcodeAtomicI32Store OpcodeAtomic = 0x17
 661	// OpcodeAtomicI64Store represents the instruction i64.atomic.store.
 662	OpcodeAtomicI64Store OpcodeAtomic = 0x18
 663	// OpcodeAtomicI32Store8 represents the instruction i32.atomic.store8.
 664	OpcodeAtomicI32Store8 OpcodeAtomic = 0x19
 665	// OpcodeAtomicI32Store16 represents the instruction i32.atomic.store16.
 666	OpcodeAtomicI32Store16 OpcodeAtomic = 0x1a
 667	// OpcodeAtomicI64Store8 represents the instruction i64.atomic.store8.
 668	OpcodeAtomicI64Store8 OpcodeAtomic = 0x1b
 669	// OpcodeAtomicI64Store16 represents the instruction i64.atomic.store16.
 670	OpcodeAtomicI64Store16 OpcodeAtomic = 0x1c
 671	// OpcodeAtomicI64Store32 represents the instruction i64.atomic.store32.
 672	OpcodeAtomicI64Store32 OpcodeAtomic = 0x1d
 673
 674	// OpcodeAtomicI32RmwAdd represents the instruction i32.atomic.rmw.add.
 675	OpcodeAtomicI32RmwAdd OpcodeAtomic = 0x1e
 676	// OpcodeAtomicI64RmwAdd represents the instruction i64.atomic.rmw.add.
 677	OpcodeAtomicI64RmwAdd OpcodeAtomic = 0x1f
 678	// OpcodeAtomicI32Rmw8AddU represents the instruction i32.atomic.rmw8.add_u.
 679	OpcodeAtomicI32Rmw8AddU OpcodeAtomic = 0x20
 680	// OpcodeAtomicI32Rmw16AddU represents the instruction i32.atomic.rmw16.add_u.
 681	OpcodeAtomicI32Rmw16AddU OpcodeAtomic = 0x21
 682	// OpcodeAtomicI64Rmw8AddU represents the instruction i64.atomic.rmw8.add_u.
 683	OpcodeAtomicI64Rmw8AddU OpcodeAtomic = 0x22
 684	// OpcodeAtomicI64Rmw16AddU represents the instruction i64.atomic.rmw16.add_u.
 685	OpcodeAtomicI64Rmw16AddU OpcodeAtomic = 0x23
 686	// OpcodeAtomicI64Rmw32AddU represents the instruction i64.atomic.rmw32.add_u.
 687	OpcodeAtomicI64Rmw32AddU OpcodeAtomic = 0x24
 688
 689	// OpcodeAtomicI32RmwSub represents the instruction i32.atomic.rmw.sub.
 690	OpcodeAtomicI32RmwSub OpcodeAtomic = 0x25
 691	// OpcodeAtomicI64RmwSub represents the instruction i64.atomic.rmw.sub.
 692	OpcodeAtomicI64RmwSub OpcodeAtomic = 0x26
 693	// OpcodeAtomicI32Rmw8SubU represents the instruction i32.atomic.rmw8.sub_u.
 694	OpcodeAtomicI32Rmw8SubU OpcodeAtomic = 0x27
 695	// OpcodeAtomicI32Rmw16SubU represents the instruction i32.atomic.rmw16.sub_u.
 696	OpcodeAtomicI32Rmw16SubU OpcodeAtomic = 0x28
 697	// OpcodeAtomicI64Rmw8SubU represents the instruction i64.atomic.rmw8.sub_u.
 698	OpcodeAtomicI64Rmw8SubU OpcodeAtomic = 0x29
 699	// OpcodeAtomicI64Rmw16SubU represents the instruction i64.atomic.rmw16.sub_u.
 700	OpcodeAtomicI64Rmw16SubU OpcodeAtomic = 0x2a
 701	// OpcodeAtomicI64Rmw32SubU represents the instruction i64.atomic.rmw32.sub_u.
 702	OpcodeAtomicI64Rmw32SubU OpcodeAtomic = 0x2b
 703
 704	// OpcodeAtomicI32RmwAnd represents the instruction i32.atomic.rmw.and.
 705	OpcodeAtomicI32RmwAnd OpcodeAtomic = 0x2c
 706	// OpcodeAtomicI64RmwAnd represents the instruction i64.atomic.rmw.and.
 707	OpcodeAtomicI64RmwAnd OpcodeAtomic = 0x2d
 708	// OpcodeAtomicI32Rmw8AndU represents the instruction i32.atomic.rmw8.and_u.
 709	OpcodeAtomicI32Rmw8AndU OpcodeAtomic = 0x2e
 710	// OpcodeAtomicI32Rmw16AndU represents the instruction i32.atomic.rmw16.and_u.
 711	OpcodeAtomicI32Rmw16AndU OpcodeAtomic = 0x2f
 712	// OpcodeAtomicI64Rmw8AndU represents the instruction i64.atomic.rmw8.and_u.
 713	OpcodeAtomicI64Rmw8AndU OpcodeAtomic = 0x30
 714	// OpcodeAtomicI64Rmw16AndU represents the instruction i64.atomic.rmw16.and_u.
 715	OpcodeAtomicI64Rmw16AndU OpcodeAtomic = 0x31
 716	// OpcodeAtomicI64Rmw32AndU represents the instruction i64.atomic.rmw32.and_u.
 717	OpcodeAtomicI64Rmw32AndU OpcodeAtomic = 0x32
 718
 719	// OpcodeAtomicI32RmwOr represents the instruction i32.atomic.rmw.or.
 720	OpcodeAtomicI32RmwOr OpcodeAtomic = 0x33
 721	// OpcodeAtomicI64RmwOr represents the instruction i64.atomic.rmw.or.
 722	OpcodeAtomicI64RmwOr OpcodeAtomic = 0x34
 723	// OpcodeAtomicI32Rmw8OrU represents the instruction i32.atomic.rmw8.or_u.
 724	OpcodeAtomicI32Rmw8OrU OpcodeAtomic = 0x35
 725	// OpcodeAtomicI32Rmw16OrU represents the instruction i32.atomic.rmw16.or_u.
 726	OpcodeAtomicI32Rmw16OrU OpcodeAtomic = 0x36
 727	// OpcodeAtomicI64Rmw8OrU represents the instruction i64.atomic.rmw8.or_u.
 728	OpcodeAtomicI64Rmw8OrU OpcodeAtomic = 0x37
 729	// OpcodeAtomicI64Rmw16OrU represents the instruction i64.atomic.rmw16.or_u.
 730	OpcodeAtomicI64Rmw16OrU OpcodeAtomic = 0x38
 731	// OpcodeAtomicI64Rmw32OrU represents the instruction i64.atomic.rmw32.or_u.
 732	OpcodeAtomicI64Rmw32OrU OpcodeAtomic = 0x39
 733
 734	// OpcodeAtomicI32RmwXor represents the instruction i32.atomic.rmw.xor.
 735	OpcodeAtomicI32RmwXor OpcodeAtomic = 0x3a
 736	// OpcodeAtomicI64RmwXor represents the instruction i64.atomic.rmw.xor.
 737	OpcodeAtomicI64RmwXor OpcodeAtomic = 0x3b
 738	// OpcodeAtomicI32Rmw8XorU represents the instruction i32.atomic.rmw8.xor_u.
 739	OpcodeAtomicI32Rmw8XorU OpcodeAtomic = 0x3c
 740	// OpcodeAtomicI32Rmw16XorU represents the instruction i32.atomic.rmw16.xor_u.
 741	OpcodeAtomicI32Rmw16XorU OpcodeAtomic = 0x3d
 742	// OpcodeAtomicI64Rmw8XorU represents the instruction i64.atomic.rmw8.xor_u.
 743	OpcodeAtomicI64Rmw8XorU OpcodeAtomic = 0x3e
 744	// OpcodeAtomicI64Rmw16XorU represents the instruction i64.atomic.rmw16.xor_u.
 745	OpcodeAtomicI64Rmw16XorU OpcodeAtomic = 0x3f
 746	// OpcodeAtomicI64Rmw32XorU represents the instruction i64.atomic.rmw32.xor_u.
 747	OpcodeAtomicI64Rmw32XorU OpcodeAtomic = 0x40
 748
 749	// OpcodeAtomicI32RmwXchg represents the instruction i32.atomic.rmw.xchg.
 750	OpcodeAtomicI32RmwXchg OpcodeAtomic = 0x41
 751	// OpcodeAtomicI64RmwXchg represents the instruction i64.atomic.rmw.xchg.
 752	OpcodeAtomicI64RmwXchg OpcodeAtomic = 0x42
 753	// OpcodeAtomicI32Rmw8XchgU represents the instruction i32.atomic.rmw8.xchg_u.
 754	OpcodeAtomicI32Rmw8XchgU OpcodeAtomic = 0x43
 755	// OpcodeAtomicI32Rmw16XchgU represents the instruction i32.atomic.rmw16.xchg_u.
 756	OpcodeAtomicI32Rmw16XchgU OpcodeAtomic = 0x44
 757	// OpcodeAtomicI64Rmw8XchgU represents the instruction i64.atomic.rmw8.xchg_u.
 758	OpcodeAtomicI64Rmw8XchgU OpcodeAtomic = 0x45
 759	// OpcodeAtomicI64Rmw16XchgU represents the instruction i64.atomic.rmw16.xchg_u.
 760	OpcodeAtomicI64Rmw16XchgU OpcodeAtomic = 0x46
 761	// OpcodeAtomicI64Rmw32XchgU represents the instruction i64.atomic.rmw32.xchg_u.
 762	OpcodeAtomicI64Rmw32XchgU OpcodeAtomic = 0x47
 763
 764	// OpcodeAtomicI32RmwCmpxchg represents the instruction i32.atomic.rmw.cmpxchg.
 765	OpcodeAtomicI32RmwCmpxchg OpcodeAtomic = 0x48
 766	// OpcodeAtomicI64RmwCmpxchg represents the instruction i64.atomic.rmw.cmpxchg.
 767	OpcodeAtomicI64RmwCmpxchg OpcodeAtomic = 0x49
 768	// OpcodeAtomicI32Rmw8CmpxchgU represents the instruction i32.atomic.rmw8.cmpxchg_u.
 769	OpcodeAtomicI32Rmw8CmpxchgU OpcodeAtomic = 0x4a
 770	// OpcodeAtomicI32Rmw16CmpxchgU represents the instruction i32.atomic.rmw16.cmpxchg_u.
 771	OpcodeAtomicI32Rmw16CmpxchgU OpcodeAtomic = 0x4b
 772	// OpcodeAtomicI64Rmw8CmpxchgU represents the instruction i64.atomic.rmw8.cmpxchg_u.
 773	OpcodeAtomicI64Rmw8CmpxchgU OpcodeAtomic = 0x4c
 774	// OpcodeAtomicI64Rmw16CmpxchgU represents the instruction i64.atomic.rmw16.cmpxchg_u.
 775	OpcodeAtomicI64Rmw16CmpxchgU OpcodeAtomic = 0x4d
 776	// OpcodeAtomicI64Rmw32CmpxchgU represents the instruction i64.atomic.rmw32.cmpxchg_u.
 777	OpcodeAtomicI64Rmw32CmpxchgU OpcodeAtomic = 0x4e
 778)
 779
 780const (
 781	OpcodeUnreachableName       = "unreachable"
 782	OpcodeNopName               = "nop"
 783	OpcodeBlockName             = "block"
 784	OpcodeLoopName              = "loop"
 785	OpcodeIfName                = "if"
 786	OpcodeElseName              = "else"
 787	OpcodeEndName               = "end"
 788	OpcodeBrName                = "br"
 789	OpcodeBrIfName              = "br_if"
 790	OpcodeBrTableName           = "br_table"
 791	OpcodeReturnName            = "return"
 792	OpcodeCallName              = "call"
 793	OpcodeCallIndirectName      = "call_indirect"
 794	OpcodeDropName              = "drop"
 795	OpcodeSelectName            = "select"
 796	OpcodeTypedSelectName       = "typed_select"
 797	OpcodeLocalGetName          = "local.get"
 798	OpcodeLocalSetName          = "local.set"
 799	OpcodeLocalTeeName          = "local.tee"
 800	OpcodeGlobalGetName         = "global.get"
 801	OpcodeGlobalSetName         = "global.set"
 802	OpcodeI32LoadName           = "i32.load"
 803	OpcodeI64LoadName           = "i64.load"
 804	OpcodeF32LoadName           = "f32.load"
 805	OpcodeF64LoadName           = "f64.load"
 806	OpcodeI32Load8SName         = "i32.load8_s"
 807	OpcodeI32Load8UName         = "i32.load8_u"
 808	OpcodeI32Load16SName        = "i32.load16_s"
 809	OpcodeI32Load16UName        = "i32.load16_u"
 810	OpcodeI64Load8SName         = "i64.load8_s"
 811	OpcodeI64Load8UName         = "i64.load8_u"
 812	OpcodeI64Load16SName        = "i64.load16_s"
 813	OpcodeI64Load16UName        = "i64.load16_u"
 814	OpcodeI64Load32SName        = "i64.load32_s"
 815	OpcodeI64Load32UName        = "i64.load32_u"
 816	OpcodeI32StoreName          = "i32.store"
 817	OpcodeI64StoreName          = "i64.store"
 818	OpcodeF32StoreName          = "f32.store"
 819	OpcodeF64StoreName          = "f64.store"
 820	OpcodeI32Store8Name         = "i32.store8"
 821	OpcodeI32Store16Name        = "i32.store16"
 822	OpcodeI64Store8Name         = "i64.store8"
 823	OpcodeI64Store16Name        = "i64.store16"
 824	OpcodeI64Store32Name        = "i64.store32"
 825	OpcodeMemorySizeName        = "memory.size"
 826	OpcodeMemoryGrowName        = "memory.grow"
 827	OpcodeI32ConstName          = "i32.const"
 828	OpcodeI64ConstName          = "i64.const"
 829	OpcodeF32ConstName          = "f32.const"
 830	OpcodeF64ConstName          = "f64.const"
 831	OpcodeI32EqzName            = "i32.eqz"
 832	OpcodeI32EqName             = "i32.eq"
 833	OpcodeI32NeName             = "i32.ne"
 834	OpcodeI32LtSName            = "i32.lt_s"
 835	OpcodeI32LtUName            = "i32.lt_u"
 836	OpcodeI32GtSName            = "i32.gt_s"
 837	OpcodeI32GtUName            = "i32.gt_u"
 838	OpcodeI32LeSName            = "i32.le_s"
 839	OpcodeI32LeUName            = "i32.le_u"
 840	OpcodeI32GeSName            = "i32.ge_s"
 841	OpcodeI32GeUName            = "i32.ge_u"
 842	OpcodeI64EqzName            = "i64.eqz"
 843	OpcodeI64EqName             = "i64.eq"
 844	OpcodeI64NeName             = "i64.ne"
 845	OpcodeI64LtSName            = "i64.lt_s"
 846	OpcodeI64LtUName            = "i64.lt_u"
 847	OpcodeI64GtSName            = "i64.gt_s"
 848	OpcodeI64GtUName            = "i64.gt_u"
 849	OpcodeI64LeSName            = "i64.le_s"
 850	OpcodeI64LeUName            = "i64.le_u"
 851	OpcodeI64GeSName            = "i64.ge_s"
 852	OpcodeI64GeUName            = "i64.ge_u"
 853	OpcodeF32EqName             = "f32.eq"
 854	OpcodeF32NeName             = "f32.ne"
 855	OpcodeF32LtName             = "f32.lt"
 856	OpcodeF32GtName             = "f32.gt"
 857	OpcodeF32LeName             = "f32.le"
 858	OpcodeF32GeName             = "f32.ge"
 859	OpcodeF64EqName             = "f64.eq"
 860	OpcodeF64NeName             = "f64.ne"
 861	OpcodeF64LtName             = "f64.lt"
 862	OpcodeF64GtName             = "f64.gt"
 863	OpcodeF64LeName             = "f64.le"
 864	OpcodeF64GeName             = "f64.ge"
 865	OpcodeI32ClzName            = "i32.clz"
 866	OpcodeI32CtzName            = "i32.ctz"
 867	OpcodeI32PopcntName         = "i32.popcnt"
 868	OpcodeI32AddName            = "i32.add"
 869	OpcodeI32SubName            = "i32.sub"
 870	OpcodeI32MulName            = "i32.mul"
 871	OpcodeI32DivSName           = "i32.div_s"
 872	OpcodeI32DivUName           = "i32.div_u"
 873	OpcodeI32RemSName           = "i32.rem_s"
 874	OpcodeI32RemUName           = "i32.rem_u"
 875	OpcodeI32AndName            = "i32.and"
 876	OpcodeI32OrName             = "i32.or"
 877	OpcodeI32XorName            = "i32.xor"
 878	OpcodeI32ShlName            = "i32.shl"
 879	OpcodeI32ShrSName           = "i32.shr_s"
 880	OpcodeI32ShrUName           = "i32.shr_u"
 881	OpcodeI32RotlName           = "i32.rotl"
 882	OpcodeI32RotrName           = "i32.rotr"
 883	OpcodeI64ClzName            = "i64.clz"
 884	OpcodeI64CtzName            = "i64.ctz"
 885	OpcodeI64PopcntName         = "i64.popcnt"
 886	OpcodeI64AddName            = "i64.add"
 887	OpcodeI64SubName            = "i64.sub"
 888	OpcodeI64MulName            = "i64.mul"
 889	OpcodeI64DivSName           = "i64.div_s"
 890	OpcodeI64DivUName           = "i64.div_u"
 891	OpcodeI64RemSName           = "i64.rem_s"
 892	OpcodeI64RemUName           = "i64.rem_u"
 893	OpcodeI64AndName            = "i64.and"
 894	OpcodeI64OrName             = "i64.or"
 895	OpcodeI64XorName            = "i64.xor"
 896	OpcodeI64ShlName            = "i64.shl"
 897	OpcodeI64ShrSName           = "i64.shr_s"
 898	OpcodeI64ShrUName           = "i64.shr_u"
 899	OpcodeI64RotlName           = "i64.rotl"
 900	OpcodeI64RotrName           = "i64.rotr"
 901	OpcodeF32AbsName            = "f32.abs"
 902	OpcodeF32NegName            = "f32.neg"
 903	OpcodeF32CeilName           = "f32.ceil"
 904	OpcodeF32FloorName          = "f32.floor"
 905	OpcodeF32TruncName          = "f32.trunc"
 906	OpcodeF32NearestName        = "f32.nearest"
 907	OpcodeF32SqrtName           = "f32.sqrt"
 908	OpcodeF32AddName            = "f32.add"
 909	OpcodeF32SubName            = "f32.sub"
 910	OpcodeF32MulName            = "f32.mul"
 911	OpcodeF32DivName            = "f32.div"
 912	OpcodeF32MinName            = "f32.min"
 913	OpcodeF32MaxName            = "f32.max"
 914	OpcodeF32CopysignName       = "f32.copysign"
 915	OpcodeF64AbsName            = "f64.abs"
 916	OpcodeF64NegName            = "f64.neg"
 917	OpcodeF64CeilName           = "f64.ceil"
 918	OpcodeF64FloorName          = "f64.floor"
 919	OpcodeF64TruncName          = "f64.trunc"
 920	OpcodeF64NearestName        = "f64.nearest"
 921	OpcodeF64SqrtName           = "f64.sqrt"
 922	OpcodeF64AddName            = "f64.add"
 923	OpcodeF64SubName            = "f64.sub"
 924	OpcodeF64MulName            = "f64.mul"
 925	OpcodeF64DivName            = "f64.div"
 926	OpcodeF64MinName            = "f64.min"
 927	OpcodeF64MaxName            = "f64.max"
 928	OpcodeF64CopysignName       = "f64.copysign"
 929	OpcodeI32WrapI64Name        = "i32.wrap_i64"
 930	OpcodeI32TruncF32SName      = "i32.trunc_f32_s"
 931	OpcodeI32TruncF32UName      = "i32.trunc_f32_u"
 932	OpcodeI32TruncF64SName      = "i32.trunc_f64_s"
 933	OpcodeI32TruncF64UName      = "i32.trunc_f64_u"
 934	OpcodeI64ExtendI32SName     = "i64.extend_i32_s"
 935	OpcodeI64ExtendI32UName     = "i64.extend_i32_u"
 936	OpcodeI64TruncF32SName      = "i64.trunc_f32_s"
 937	OpcodeI64TruncF32UName      = "i64.trunc_f32_u"
 938	OpcodeI64TruncF64SName      = "i64.trunc_f64_s"
 939	OpcodeI64TruncF64UName      = "i64.trunc_f64_u"
 940	OpcodeF32ConvertI32SName    = "f32.convert_i32_s"
 941	OpcodeF32ConvertI32UName    = "f32.convert_i32_u"
 942	OpcodeF32ConvertI64SName    = "f32.convert_i64_s"
 943	OpcodeF32ConvertI64UName    = "f32.convert_i64u"
 944	OpcodeF32DemoteF64Name      = "f32.demote_f64"
 945	OpcodeF64ConvertI32SName    = "f64.convert_i32_s"
 946	OpcodeF64ConvertI32UName    = "f64.convert_i32_u"
 947	OpcodeF64ConvertI64SName    = "f64.convert_i64_s"
 948	OpcodeF64ConvertI64UName    = "f64.convert_i64_u"
 949	OpcodeF64PromoteF32Name     = "f64.promote_f32"
 950	OpcodeI32ReinterpretF32Name = "i32.reinterpret_f32"
 951	OpcodeI64ReinterpretF64Name = "i64.reinterpret_f64"
 952	OpcodeF32ReinterpretI32Name = "f32.reinterpret_i32"
 953	OpcodeF64ReinterpretI64Name = "f64.reinterpret_i64"
 954
 955	OpcodeRefNullName   = "ref.null"
 956	OpcodeRefIsNullName = "ref.is_null"
 957	OpcodeRefFuncName   = "ref.func"
 958
 959	OpcodeTableGetName = "table.get"
 960	OpcodeTableSetName = "table.set"
 961
 962	// Below are toggled with CoreFeatureSignExtensionOps
 963
 964	OpcodeI32Extend8SName  = "i32.extend8_s"
 965	OpcodeI32Extend16SName = "i32.extend16_s"
 966	OpcodeI64Extend8SName  = "i64.extend8_s"
 967	OpcodeI64Extend16SName = "i64.extend16_s"
 968	OpcodeI64Extend32SName = "i64.extend32_s"
 969
 970	OpcodeMiscPrefixName   = "misc_prefix"
 971	OpcodeVecPrefixName    = "vector_prefix"
 972	OpcodeAtomicPrefixName = "atomic_prefix"
 973)
 974
 975var instructionNames = [256]string{
 976	OpcodeUnreachable:       OpcodeUnreachableName,
 977	OpcodeNop:               OpcodeNopName,
 978	OpcodeBlock:             OpcodeBlockName,
 979	OpcodeLoop:              OpcodeLoopName,
 980	OpcodeIf:                OpcodeIfName,
 981	OpcodeElse:              OpcodeElseName,
 982	OpcodeEnd:               OpcodeEndName,
 983	OpcodeBr:                OpcodeBrName,
 984	OpcodeBrIf:              OpcodeBrIfName,
 985	OpcodeBrTable:           OpcodeBrTableName,
 986	OpcodeReturn:            OpcodeReturnName,
 987	OpcodeCall:              OpcodeCallName,
 988	OpcodeCallIndirect:      OpcodeCallIndirectName,
 989	OpcodeDrop:              OpcodeDropName,
 990	OpcodeSelect:            OpcodeSelectName,
 991	OpcodeTypedSelect:       OpcodeTypedSelectName,
 992	OpcodeLocalGet:          OpcodeLocalGetName,
 993	OpcodeLocalSet:          OpcodeLocalSetName,
 994	OpcodeLocalTee:          OpcodeLocalTeeName,
 995	OpcodeGlobalGet:         OpcodeGlobalGetName,
 996	OpcodeGlobalSet:         OpcodeGlobalSetName,
 997	OpcodeI32Load:           OpcodeI32LoadName,
 998	OpcodeI64Load:           OpcodeI64LoadName,
 999	OpcodeF32Load:           OpcodeF32LoadName,
1000	OpcodeF64Load:           OpcodeF64LoadName,
1001	OpcodeI32Load8S:         OpcodeI32Load8SName,
1002	OpcodeI32Load8U:         OpcodeI32Load8UName,
1003	OpcodeI32Load16S:        OpcodeI32Load16SName,
1004	OpcodeI32Load16U:        OpcodeI32Load16UName,
1005	OpcodeI64Load8S:         OpcodeI64Load8SName,
1006	OpcodeI64Load8U:         OpcodeI64Load8UName,
1007	OpcodeI64Load16S:        OpcodeI64Load16SName,
1008	OpcodeI64Load16U:        OpcodeI64Load16UName,
1009	OpcodeI64Load32S:        OpcodeI64Load32SName,
1010	OpcodeI64Load32U:        OpcodeI64Load32UName,
1011	OpcodeI32Store:          OpcodeI32StoreName,
1012	OpcodeI64Store:          OpcodeI64StoreName,
1013	OpcodeF32Store:          OpcodeF32StoreName,
1014	OpcodeF64Store:          OpcodeF64StoreName,
1015	OpcodeI32Store8:         OpcodeI32Store8Name,
1016	OpcodeI32Store16:        OpcodeI32Store16Name,
1017	OpcodeI64Store8:         OpcodeI64Store8Name,
1018	OpcodeI64Store16:        OpcodeI64Store16Name,
1019	OpcodeI64Store32:        OpcodeI64Store32Name,
1020	OpcodeMemorySize:        OpcodeMemorySizeName,
1021	OpcodeMemoryGrow:        OpcodeMemoryGrowName,
1022	OpcodeI32Const:          OpcodeI32ConstName,
1023	OpcodeI64Const:          OpcodeI64ConstName,
1024	OpcodeF32Const:          OpcodeF32ConstName,
1025	OpcodeF64Const:          OpcodeF64ConstName,
1026	OpcodeI32Eqz:            OpcodeI32EqzName,
1027	OpcodeI32Eq:             OpcodeI32EqName,
1028	OpcodeI32Ne:             OpcodeI32NeName,
1029	OpcodeI32LtS:            OpcodeI32LtSName,
1030	OpcodeI32LtU:            OpcodeI32LtUName,
1031	OpcodeI32GtS:            OpcodeI32GtSName,
1032	OpcodeI32GtU:            OpcodeI32GtUName,
1033	OpcodeI32LeS:            OpcodeI32LeSName,
1034	OpcodeI32LeU:            OpcodeI32LeUName,
1035	OpcodeI32GeS:            OpcodeI32GeSName,
1036	OpcodeI32GeU:            OpcodeI32GeUName,
1037	OpcodeI64Eqz:            OpcodeI64EqzName,
1038	OpcodeI64Eq:             OpcodeI64EqName,
1039	OpcodeI64Ne:             OpcodeI64NeName,
1040	OpcodeI64LtS:            OpcodeI64LtSName,
1041	OpcodeI64LtU:            OpcodeI64LtUName,
1042	OpcodeI64GtS:            OpcodeI64GtSName,
1043	OpcodeI64GtU:            OpcodeI64GtUName,
1044	OpcodeI64LeS:            OpcodeI64LeSName,
1045	OpcodeI64LeU:            OpcodeI64LeUName,
1046	OpcodeI64GeS:            OpcodeI64GeSName,
1047	OpcodeI64GeU:            OpcodeI64GeUName,
1048	OpcodeF32Eq:             OpcodeF32EqName,
1049	OpcodeF32Ne:             OpcodeF32NeName,
1050	OpcodeF32Lt:             OpcodeF32LtName,
1051	OpcodeF32Gt:             OpcodeF32GtName,
1052	OpcodeF32Le:             OpcodeF32LeName,
1053	OpcodeF32Ge:             OpcodeF32GeName,
1054	OpcodeF64Eq:             OpcodeF64EqName,
1055	OpcodeF64Ne:             OpcodeF64NeName,
1056	OpcodeF64Lt:             OpcodeF64LtName,
1057	OpcodeF64Gt:             OpcodeF64GtName,
1058	OpcodeF64Le:             OpcodeF64LeName,
1059	OpcodeF64Ge:             OpcodeF64GeName,
1060	OpcodeI32Clz:            OpcodeI32ClzName,
1061	OpcodeI32Ctz:            OpcodeI32CtzName,
1062	OpcodeI32Popcnt:         OpcodeI32PopcntName,
1063	OpcodeI32Add:            OpcodeI32AddName,
1064	OpcodeI32Sub:            OpcodeI32SubName,
1065	OpcodeI32Mul:            OpcodeI32MulName,
1066	OpcodeI32DivS:           OpcodeI32DivSName,
1067	OpcodeI32DivU:           OpcodeI32DivUName,
1068	OpcodeI32RemS:           OpcodeI32RemSName,
1069	OpcodeI32RemU:           OpcodeI32RemUName,
1070	OpcodeI32And:            OpcodeI32AndName,
1071	OpcodeI32Or:             OpcodeI32OrName,
1072	OpcodeI32Xor:            OpcodeI32XorName,
1073	OpcodeI32Shl:            OpcodeI32ShlName,
1074	OpcodeI32ShrS:           OpcodeI32ShrSName,
1075	OpcodeI32ShrU:           OpcodeI32ShrUName,
1076	OpcodeI32Rotl:           OpcodeI32RotlName,
1077	OpcodeI32Rotr:           OpcodeI32RotrName,
1078	OpcodeI64Clz:            OpcodeI64ClzName,
1079	OpcodeI64Ctz:            OpcodeI64CtzName,
1080	OpcodeI64Popcnt:         OpcodeI64PopcntName,
1081	OpcodeI64Add:            OpcodeI64AddName,
1082	OpcodeI64Sub:            OpcodeI64SubName,
1083	OpcodeI64Mul:            OpcodeI64MulName,
1084	OpcodeI64DivS:           OpcodeI64DivSName,
1085	OpcodeI64DivU:           OpcodeI64DivUName,
1086	OpcodeI64RemS:           OpcodeI64RemSName,
1087	OpcodeI64RemU:           OpcodeI64RemUName,
1088	OpcodeI64And:            OpcodeI64AndName,
1089	OpcodeI64Or:             OpcodeI64OrName,
1090	OpcodeI64Xor:            OpcodeI64XorName,
1091	OpcodeI64Shl:            OpcodeI64ShlName,
1092	OpcodeI64ShrS:           OpcodeI64ShrSName,
1093	OpcodeI64ShrU:           OpcodeI64ShrUName,
1094	OpcodeI64Rotl:           OpcodeI64RotlName,
1095	OpcodeI64Rotr:           OpcodeI64RotrName,
1096	OpcodeF32Abs:            OpcodeF32AbsName,
1097	OpcodeF32Neg:            OpcodeF32NegName,
1098	OpcodeF32Ceil:           OpcodeF32CeilName,
1099	OpcodeF32Floor:          OpcodeF32FloorName,
1100	OpcodeF32Trunc:          OpcodeF32TruncName,
1101	OpcodeF32Nearest:        OpcodeF32NearestName,
1102	OpcodeF32Sqrt:           OpcodeF32SqrtName,
1103	OpcodeF32Add:            OpcodeF32AddName,
1104	OpcodeF32Sub:            OpcodeF32SubName,
1105	OpcodeF32Mul:            OpcodeF32MulName,
1106	OpcodeF32Div:            OpcodeF32DivName,
1107	OpcodeF32Min:            OpcodeF32MinName,
1108	OpcodeF32Max:            OpcodeF32MaxName,
1109	OpcodeF32Copysign:       OpcodeF32CopysignName,
1110	OpcodeF64Abs:            OpcodeF64AbsName,
1111	OpcodeF64Neg:            OpcodeF64NegName,
1112	OpcodeF64Ceil:           OpcodeF64CeilName,
1113	OpcodeF64Floor:          OpcodeF64FloorName,
1114	OpcodeF64Trunc:          OpcodeF64TruncName,
1115	OpcodeF64Nearest:        OpcodeF64NearestName,
1116	OpcodeF64Sqrt:           OpcodeF64SqrtName,
1117	OpcodeF64Add:            OpcodeF64AddName,
1118	OpcodeF64Sub:            OpcodeF64SubName,
1119	OpcodeF64Mul:            OpcodeF64MulName,
1120	OpcodeF64Div:            OpcodeF64DivName,
1121	OpcodeF64Min:            OpcodeF64MinName,
1122	OpcodeF64Max:            OpcodeF64MaxName,
1123	OpcodeF64Copysign:       OpcodeF64CopysignName,
1124	OpcodeI32WrapI64:        OpcodeI32WrapI64Name,
1125	OpcodeI32TruncF32S:      OpcodeI32TruncF32SName,
1126	OpcodeI32TruncF32U:      OpcodeI32TruncF32UName,
1127	OpcodeI32TruncF64S:      OpcodeI32TruncF64SName,
1128	OpcodeI32TruncF64U:      OpcodeI32TruncF64UName,
1129	OpcodeI64ExtendI32S:     OpcodeI64ExtendI32SName,
1130	OpcodeI64ExtendI32U:     OpcodeI64ExtendI32UName,
1131	OpcodeI64TruncF32S:      OpcodeI64TruncF32SName,
1132	OpcodeI64TruncF32U:      OpcodeI64TruncF32UName,
1133	OpcodeI64TruncF64S:      OpcodeI64TruncF64SName,
1134	OpcodeI64TruncF64U:      OpcodeI64TruncF64UName,
1135	OpcodeF32ConvertI32S:    OpcodeF32ConvertI32SName,
1136	OpcodeF32ConvertI32U:    OpcodeF32ConvertI32UName,
1137	OpcodeF32ConvertI64S:    OpcodeF32ConvertI64SName,
1138	OpcodeF32ConvertI64U:    OpcodeF32ConvertI64UName,
1139	OpcodeF32DemoteF64:      OpcodeF32DemoteF64Name,
1140	OpcodeF64ConvertI32S:    OpcodeF64ConvertI32SName,
1141	OpcodeF64ConvertI32U:    OpcodeF64ConvertI32UName,
1142	OpcodeF64ConvertI64S:    OpcodeF64ConvertI64SName,
1143	OpcodeF64ConvertI64U:    OpcodeF64ConvertI64UName,
1144	OpcodeF64PromoteF32:     OpcodeF64PromoteF32Name,
1145	OpcodeI32ReinterpretF32: OpcodeI32ReinterpretF32Name,
1146	OpcodeI64ReinterpretF64: OpcodeI64ReinterpretF64Name,
1147	OpcodeF32ReinterpretI32: OpcodeF32ReinterpretI32Name,
1148	OpcodeF64ReinterpretI64: OpcodeF64ReinterpretI64Name,
1149
1150	OpcodeRefNull:   OpcodeRefNullName,
1151	OpcodeRefIsNull: OpcodeRefIsNullName,
1152	OpcodeRefFunc:   OpcodeRefFuncName,
1153
1154	OpcodeTableGet: OpcodeTableGetName,
1155	OpcodeTableSet: OpcodeTableSetName,
1156
1157	// Below are toggled with CoreFeatureSignExtensionOps
1158
1159	OpcodeI32Extend8S:  OpcodeI32Extend8SName,
1160	OpcodeI32Extend16S: OpcodeI32Extend16SName,
1161	OpcodeI64Extend8S:  OpcodeI64Extend8SName,
1162	OpcodeI64Extend16S: OpcodeI64Extend16SName,
1163	OpcodeI64Extend32S: OpcodeI64Extend32SName,
1164
1165	OpcodeMiscPrefix: OpcodeMiscPrefixName,
1166	OpcodeVecPrefix:  OpcodeVecPrefixName,
1167}
1168
1169// InstructionName returns the instruction corresponding to this binary Opcode.
1170// See https://www.w3.org/TR/2019/REC-wasm-core-1-20191205/#a7-index-of-instructions
1171func InstructionName(oc Opcode) string {
1172	return instructionNames[oc]
1173}
1174
1175const (
1176	OpcodeI32TruncSatF32SName = "i32.trunc_sat_f32_s"
1177	OpcodeI32TruncSatF32UName = "i32.trunc_sat_f32_u"
1178	OpcodeI32TruncSatF64SName = "i32.trunc_sat_f64_s"
1179	OpcodeI32TruncSatF64UName = "i32.trunc_sat_f64_u"
1180	OpcodeI64TruncSatF32SName = "i64.trunc_sat_f32_s"
1181	OpcodeI64TruncSatF32UName = "i64.trunc_sat_f32_u"
1182	OpcodeI64TruncSatF64SName = "i64.trunc_sat_f64_s"
1183	OpcodeI64TruncSatF64UName = "i64.trunc_sat_f64_u"
1184
1185	OpcodeMemoryInitName = "memory.init"
1186	OpcodeDataDropName   = "data.drop"
1187	OpcodeMemoryCopyName = "memory.copy"
1188	OpcodeMemoryFillName = "memory.fill"
1189	OpcodeTableInitName  = "table.init"
1190	OpcodeElemDropName   = "elem.drop"
1191	OpcodeTableCopyName  = "table.copy"
1192	OpcodeTableGrowName  = "table.grow"
1193	OpcodeTableSizeName  = "table.size"
1194	OpcodeTableFillName  = "table.fill"
1195)
1196
1197var miscInstructionNames = [256]string{
1198	OpcodeMiscI32TruncSatF32S: OpcodeI32TruncSatF32SName,
1199	OpcodeMiscI32TruncSatF32U: OpcodeI32TruncSatF32UName,
1200	OpcodeMiscI32TruncSatF64S: OpcodeI32TruncSatF64SName,
1201	OpcodeMiscI32TruncSatF64U: OpcodeI32TruncSatF64UName,
1202	OpcodeMiscI64TruncSatF32S: OpcodeI64TruncSatF32SName,
1203	OpcodeMiscI64TruncSatF32U: OpcodeI64TruncSatF32UName,
1204	OpcodeMiscI64TruncSatF64S: OpcodeI64TruncSatF64SName,
1205	OpcodeMiscI64TruncSatF64U: OpcodeI64TruncSatF64UName,
1206
1207	OpcodeMiscMemoryInit: OpcodeMemoryInitName,
1208	OpcodeMiscDataDrop:   OpcodeDataDropName,
1209	OpcodeMiscMemoryCopy: OpcodeMemoryCopyName,
1210	OpcodeMiscMemoryFill: OpcodeMemoryFillName,
1211	OpcodeMiscTableInit:  OpcodeTableInitName,
1212	OpcodeMiscElemDrop:   OpcodeElemDropName,
1213	OpcodeMiscTableCopy:  OpcodeTableCopyName,
1214	OpcodeMiscTableGrow:  OpcodeTableGrowName,
1215	OpcodeMiscTableSize:  OpcodeTableSizeName,
1216	OpcodeMiscTableFill:  OpcodeTableFillName,
1217}
1218
1219// MiscInstructionName returns the instruction corresponding to this miscellaneous Opcode.
1220func MiscInstructionName(oc OpcodeMisc) string {
1221	return miscInstructionNames[oc]
1222}
1223
1224const (
1225	OpcodeVecV128LoadName                  = "v128.load"
1226	OpcodeVecV128Load8x8SName              = "v128.load8x8_s"
1227	OpcodeVecV128Load8x8UName              = "v128.load8x8_u"
1228	OpcodeVecV128Load16x4SName             = "v128.load16x4_s"
1229	OpcodeVecV128Load16x4UName             = "v128.load16x4_u"
1230	OpcodeVecV128Load32x2SName             = "v128.load32x2_s"
1231	OpcodeVecV128Load32x2UName             = "v128.load32x2_u"
1232	OpcodeVecV128Load8SplatName            = "v128.load8_splat"
1233	OpcodeVecV128Load16SplatName           = "v128.load16_splat"
1234	OpcodeVecV128Load32SplatName           = "v128.load32_splat"
1235	OpcodeVecV128Load64SplatName           = "v128.load64_splat"
1236	OpcodeVecV128Load32zeroName            = "v128.load32_zero"
1237	OpcodeVecV128Load64zeroName            = "v128.load64_zero"
1238	OpcodeVecV128StoreName                 = "v128.store"
1239	OpcodeVecV128Load8LaneName             = "v128.load8_lane"
1240	OpcodeVecV128Load16LaneName            = "v128.load16_lane"
1241	OpcodeVecV128Load32LaneName            = "v128.load32_lane"
1242	OpcodeVecV128Load64LaneName            = "v128.load64_lane"
1243	OpcodeVecV128Store8LaneName            = "v128.store8_lane"
1244	OpcodeVecV128Store16LaneName           = "v128.store16_lane"
1245	OpcodeVecV128Store32LaneName           = "v128.store32_lane"
1246	OpcodeVecV128Store64LaneName           = "v128.store64_lane"
1247	OpcodeVecV128ConstName                 = "v128.const"
1248	OpcodeVecV128i8x16ShuffleName          = "v128.shuffle"
1249	OpcodeVecI8x16ExtractLaneSName         = "i8x16.extract_lane_s"
1250	OpcodeVecI8x16ExtractLaneUName         = "i8x16.extract_lane_u"
1251	OpcodeVecI8x16ReplaceLaneName          = "i8x16.replace_lane"
1252	OpcodeVecI16x8ExtractLaneSName         = "i16x8.extract_lane_s"
1253	OpcodeVecI16x8ExtractLaneUName         = "i16x8.extract_lane_u"
1254	OpcodeVecI16x8ReplaceLaneName          = "i16x8.replace_lane"
1255	OpcodeVecI32x4ExtractLaneName          = "i32x4.extract_lane"
1256	OpcodeVecI32x4ReplaceLaneName          = "i32x4.replace_lane"
1257	OpcodeVecI64x2ExtractLaneName          = "i64x2.extract_lane"
1258	OpcodeVecI64x2ReplaceLaneName          = "i64x2.replace_lane"
1259	OpcodeVecF32x4ExtractLaneName          = "f32x4.extract_lane"
1260	OpcodeVecF32x4ReplaceLaneName          = "f32x4.replace_lane"
1261	OpcodeVecF64x2ExtractLaneName          = "f64x2.extract_lane"
1262	OpcodeVecF64x2ReplaceLaneName          = "f64x2.replace_lane"
1263	OpcodeVecI8x16SwizzleName              = "i8x16.swizzle"
1264	OpcodeVecI8x16SplatName                = "i8x16.splat"
1265	OpcodeVecI16x8SplatName                = "i16x8.splat"
1266	OpcodeVecI32x4SplatName                = "i32x4.splat"
1267	OpcodeVecI64x2SplatName                = "i64x2.splat"
1268	OpcodeVecF32x4SplatName                = "f32x4.splat"
1269	OpcodeVecF64x2SplatName                = "f64x2.splat"
1270	OpcodeVecI8x16EqName                   = "i8x16.eq"
1271	OpcodeVecI8x16NeName                   = "i8x16.ne"
1272	OpcodeVecI8x16LtSName                  = "i8x16.lt_s"
1273	OpcodeVecI8x16LtUName                  = "i8x16.lt_u"
1274	OpcodeVecI8x16GtSName                  = "i8x16.gt_s"
1275	OpcodeVecI8x16GtUName                  = "i8x16.gt_u"
1276	OpcodeVecI8x16LeSName                  = "i8x16.le_s"
1277	OpcodeVecI8x16LeUName                  = "i8x16.le_u"
1278	OpcodeVecI8x16GeSName                  = "i8x16.ge_s"
1279	OpcodeVecI8x16GeUName                  = "i8x16.ge_u"
1280	OpcodeVecI16x8EqName                   = "i16x8.eq"
1281	OpcodeVecI16x8NeName                   = "i16x8.ne"
1282	OpcodeVecI16x8LtSName                  = "i16x8.lt_s"
1283	OpcodeVecI16x8LtUName                  = "i16x8.lt_u"
1284	OpcodeVecI16x8GtSName                  = "i16x8.gt_s"
1285	OpcodeVecI16x8GtUName                  = "i16x8.gt_u"
1286	OpcodeVecI16x8LeSName                  = "i16x8.le_s"
1287	OpcodeVecI16x8LeUName                  = "i16x8.le_u"
1288	OpcodeVecI16x8GeSName                  = "i16x8.ge_s"
1289	OpcodeVecI16x8GeUName                  = "i16x8.ge_u"
1290	OpcodeVecI32x4EqName                   = "i32x4.eq"
1291	OpcodeVecI32x4NeName                   = "i32x4.ne"
1292	OpcodeVecI32x4LtSName                  = "i32x4.lt_s"
1293	OpcodeVecI32x4LtUName                  = "i32x4.lt_u"
1294	OpcodeVecI32x4GtSName                  = "i32x4.gt_s"
1295	OpcodeVecI32x4GtUName                  = "i32x4.gt_u"
1296	OpcodeVecI32x4LeSName                  = "i32x4.le_s"
1297	OpcodeVecI32x4LeUName                  = "i32x4.le_u"
1298	OpcodeVecI32x4GeSName                  = "i32x4.ge_s"
1299	OpcodeVecI32x4GeUName                  = "i32x4.ge_u"
1300	OpcodeVecI64x2EqName                   = "i64x2.eq"
1301	OpcodeVecI64x2NeName                   = "i64x2.ne"
1302	OpcodeVecI64x2LtSName                  = "i64x2.lt"
1303	OpcodeVecI64x2GtSName                  = "i64x2.gt"
1304	OpcodeVecI64x2LeSName                  = "i64x2.le"
1305	OpcodeVecI64x2GeSName                  = "i64x2.ge"
1306	OpcodeVecF32x4EqName                   = "f32x4.eq"
1307	OpcodeVecF32x4NeName                   = "f32x4.ne"
1308	OpcodeVecF32x4LtName                   = "f32x4.lt"
1309	OpcodeVecF32x4GtName                   = "f32x4.gt"
1310	OpcodeVecF32x4LeName                   = "f32x4.le"
1311	OpcodeVecF32x4GeName                   = "f32x4.ge"
1312	OpcodeVecF64x2EqName                   = "f64x2.eq"
1313	OpcodeVecF64x2NeName                   = "f64x2.ne"
1314	OpcodeVecF64x2LtName                   = "f64x2.lt"
1315	OpcodeVecF64x2GtName                   = "f64x2.gt"
1316	OpcodeVecF64x2LeName                   = "f64x2.le"
1317	OpcodeVecF64x2GeName                   = "f64x2.ge"
1318	OpcodeVecV128NotName                   = "v128.not"
1319	OpcodeVecV128AndName                   = "v128.and"
1320	OpcodeVecV128AndNotName                = "v128.andnot"
1321	OpcodeVecV128OrName                    = "v128.or"
1322	OpcodeVecV128XorName                   = "v128.xor"
1323	OpcodeVecV128BitselectName             = "v128.bitselect"
1324	OpcodeVecV128AnyTrueName               = "v128.any_true"
1325	OpcodeVecI8x16AbsName                  = "i8x16.abs"
1326	OpcodeVecI8x16NegName                  = "i8x16.neg"
1327	OpcodeVecI8x16PopcntName               = "i8x16.popcnt"
1328	OpcodeVecI8x16AllTrueName              = "i8x16.all_true"
1329	OpcodeVecI8x16BitMaskName              = "i8x16.bitmask"
1330	OpcodeVecI8x16NarrowI16x8SName         = "i8x16.narrow_i16x8_s"
1331	OpcodeVecI8x16NarrowI16x8UName         = "i8x16.narrow_i16x8_u"
1332	OpcodeVecI8x16ShlName                  = "i8x16.shl"
1333	OpcodeVecI8x16ShrSName                 = "i8x16.shr_s"
1334	OpcodeVecI8x16ShrUName                 = "i8x16.shr_u"
1335	OpcodeVecI8x16AddName                  = "i8x16.add"
1336	OpcodeVecI8x16AddSatSName              = "i8x16.add_sat_s"
1337	OpcodeVecI8x16AddSatUName              = "i8x16.add_sat_u"
1338	OpcodeVecI8x16SubName                  = "i8x16.sub"
1339	OpcodeVecI8x16SubSatSName              = "i8x16.sub_s"
1340	OpcodeVecI8x16SubSatUName              = "i8x16.sub_u"
1341	OpcodeVecI8x16MinSName                 = "i8x16.min_s"
1342	OpcodeVecI8x16MinUName                 = "i8x16.min_u"
1343	OpcodeVecI8x16MaxSName                 = "i8x16.max_s"
1344	OpcodeVecI8x16MaxUName                 = "i8x16.max_u"
1345	OpcodeVecI8x16AvgrUName                = "i8x16.avgr_u"
1346	OpcodeVecI16x8ExtaddPairwiseI8x16SName = "i16x8.extadd_pairwise_i8x16_s"
1347	OpcodeVecI16x8ExtaddPairwiseI8x16UName = "i16x8.extadd_pairwise_i8x16_u"
1348	OpcodeVecI16x8AbsName                  = "i16x8.abs"
1349	OpcodeVecI16x8NegName                  = "i16x8.neg"
1350	OpcodeVecI16x8Q15mulrSatSName          = "i16x8.q15mulr_sat_s"
1351	OpcodeVecI16x8AllTrueName              = "i16x8.all_true"
1352	OpcodeVecI16x8BitMaskName              = "i16x8.bitmask"
1353	OpcodeVecI16x8NarrowI32x4SName         = "i16x8.narrow_i32x4_s"
1354	OpcodeVecI16x8NarrowI32x4UName         = "i16x8.narrow_i32x4_u"
1355	OpcodeVecI16x8ExtendLowI8x16SName      = "i16x8.extend_low_i8x16_s"
1356	OpcodeVecI16x8ExtendHighI8x16SName     = "i16x8.extend_high_i8x16_s"
1357	OpcodeVecI16x8ExtendLowI8x16UName      = "i16x8.extend_low_i8x16_u"
1358	OpcodeVecI16x8ExtendHighI8x16UName     = "i16x8.extend_high_i8x16_u"
1359	OpcodeVecI16x8ShlName                  = "i16x8.shl"
1360	OpcodeVecI16x8ShrSName                 = "i16x8.shr_s"
1361	OpcodeVecI16x8ShrUName                 = "i16x8.shr_u"
1362	OpcodeVecI16x8AddName                  = "i16x8.add"
1363	OpcodeVecI16x8AddSatSName              = "i16x8.add_sat_s"
1364	OpcodeVecI16x8AddSatUName              = "i16x8.add_sat_u"
1365	OpcodeVecI16x8SubName                  = "i16x8.sub"
1366	OpcodeVecI16x8SubSatSName              = "i16x8.sub_sat_s"
1367	OpcodeVecI16x8SubSatUName              = "i16x8.sub_sat_u"
1368	OpcodeVecI16x8MulName                  = "i16x8.mul"
1369	OpcodeVecI16x8MinSName                 = "i16x8.min_s"
1370	OpcodeVecI16x8MinUName                 = "i16x8.min_u"
1371	OpcodeVecI16x8MaxSName                 = "i16x8.max_s"
1372	OpcodeVecI16x8MaxUName                 = "i16x8.max_u"
1373	OpcodeVecI16x8AvgrUName                = "i16x8.avgr_u"
1374	OpcodeVecI16x8ExtMulLowI8x16SName      = "i16x8.extmul_low_i8x16_s"
1375	OpcodeVecI16x8ExtMulHighI8x16SName     = "i16x8.extmul_high_i8x16_s"
1376	OpcodeVecI16x8ExtMulLowI8x16UName      = "i16x8.extmul_low_i8x16_u"
1377	OpcodeVecI16x8ExtMulHighI8x16UName     = "i16x8.extmul_high_i8x16_u"
1378	OpcodeVecI32x4ExtaddPairwiseI16x8SName = "i32x4.extadd_pairwise_i16x8_s"
1379	OpcodeVecI32x4ExtaddPairwiseI16x8UName = "i32x4.extadd_pairwise_i16x8_u"
1380	OpcodeVecI32x4AbsName                  = "i32x4.abs"
1381	OpcodeVecI32x4NegName                  = "i32x4.neg"
1382	OpcodeVecI32x4AllTrueName              = "i32x4.all_true"
1383	OpcodeVecI32x4BitMaskName              = "i32x4.bitmask"
1384	OpcodeVecI32x4ExtendLowI16x8SName      = "i32x4.extend_low_i16x8_s"
1385	OpcodeVecI32x4ExtendHighI16x8SName     = "i32x4.extend_high_i16x8_s"
1386	OpcodeVecI32x4ExtendLowI16x8UName      = "i32x4.extend_low_i16x8_u"
1387	OpcodeVecI32x4ExtendHighI16x8UName     = "i32x4.extend_high_i16x8_u"
1388	OpcodeVecI32x4ShlName                  = "i32x4.shl"
1389	OpcodeVecI32x4ShrSName                 = "i32x4.shr_s"
1390	OpcodeVecI32x4ShrUName                 = "i32x4.shr_u"
1391	OpcodeVecI32x4AddName                  = "i32x4.add"
1392	OpcodeVecI32x4SubName                  = "i32x4.sub"
1393	OpcodeVecI32x4MulName                  = "i32x4.mul"
1394	OpcodeVecI32x4MinSName                 = "i32x4.min_s"
1395	OpcodeVecI32x4MinUName                 = "i32x4.min_u"
1396	OpcodeVecI32x4MaxSName                 = "i32x4.max_s"
1397	OpcodeVecI32x4MaxUName                 = "i32x4.max_u"
1398	OpcodeVecI32x4DotI16x8SName            = "i32x4.dot_i16x8_s"
1399	OpcodeVecI32x4ExtMulLowI16x8SName      = "i32x4.extmul_low_i16x8_s"
1400	OpcodeVecI32x4ExtMulHighI16x8SName     = "i32x4.extmul_high_i16x8_s"
1401	OpcodeVecI32x4ExtMulLowI16x8UName      = "i32x4.extmul_low_i16x8_u"
1402	OpcodeVecI32x4ExtMulHighI16x8UName     = "i32x4.extmul_high_i16x8_u"
1403	OpcodeVecI64x2AbsName                  = "i64x2.abs"
1404	OpcodeVecI64x2NegName                  = "i64x2.neg"
1405	OpcodeVecI64x2AllTrueName              = "i64x2.all_true"
1406	OpcodeVecI64x2BitMaskName              = "i64x2.bitmask"
1407	OpcodeVecI64x2ExtendLowI32x4SName      = "i64x2.extend_low_i32x4_s"
1408	OpcodeVecI64x2ExtendHighI32x4SName     = "i64x2.extend_high_i32x4_s"
1409	OpcodeVecI64x2ExtendLowI32x4UName      = "i64x2.extend_low_i32x4_u"
1410	OpcodeVecI64x2ExtendHighI32x4UName     = "i64x2.extend_high_i32x4_u"
1411	OpcodeVecI64x2ShlName                  = "i64x2.shl"
1412	OpcodeVecI64x2ShrSName                 = "i64x2.shr_s"
1413	OpcodeVecI64x2ShrUName                 = "i64x2.shr_u"
1414	OpcodeVecI64x2AddName                  = "i64x2.add"
1415	OpcodeVecI64x2SubName                  = "i64x2.sub"
1416	OpcodeVecI64x2MulName                  = "i64x2.mul"
1417	OpcodeVecI64x2ExtMulLowI32x4SName      = "i64x2.extmul_low_i32x4_s"
1418	OpcodeVecI64x2ExtMulHighI32x4SName     = "i64x2.extmul_high_i32x4_s"
1419	OpcodeVecI64x2ExtMulLowI32x4UName      = "i64x2.extmul_low_i32x4_u"
1420	OpcodeVecI64x2ExtMulHighI32x4UName     = "i64x2.extmul_high_i32x4_u"
1421	OpcodeVecF32x4CeilName                 = "f32x4.ceil"
1422	OpcodeVecF32x4FloorName                = "f32x4.floor"
1423	OpcodeVecF32x4TruncName                = "f32x4.trunc"
1424	OpcodeVecF32x4NearestName              = "f32x4.nearest"
1425	OpcodeVecF32x4AbsName                  = "f32x4.abs"
1426	OpcodeVecF32x4NegName                  = "f32x4.neg"
1427	OpcodeVecF32x4SqrtName                 = "f32x4.sqrt"
1428	OpcodeVecF32x4AddName                  = "f32x4.add"
1429	OpcodeVecF32x4SubName                  = "f32x4.sub"
1430	OpcodeVecF32x4MulName                  = "f32x4.mul"
1431	OpcodeVecF32x4DivName                  = "f32x4.div"
1432	OpcodeVecF32x4MinName                  = "f32x4.min"
1433	OpcodeVecF32x4MaxName                  = "f32x4.max"
1434	OpcodeVecF32x4PminName                 = "f32x4.pmin"
1435	OpcodeVecF32x4PmaxName                 = "f32x4.pmax"
1436	OpcodeVecF64x2CeilName                 = "f64x2.ceil"
1437	OpcodeVecF64x2FloorName                = "f64x2.floor"
1438	OpcodeVecF64x2TruncName                = "f64x2.trunc"
1439	OpcodeVecF64x2NearestName              = "f64x2.nearest"
1440	OpcodeVecF64x2AbsName                  = "f64x2.abs"
1441	OpcodeVecF64x2NegName                  = "f64x2.neg"
1442	OpcodeVecF64x2SqrtName                 = "f64x2.sqrt"
1443	OpcodeVecF64x2AddName                  = "f64x2.add"
1444	OpcodeVecF64x2SubName                  = "f64x2.sub"
1445	OpcodeVecF64x2MulName                  = "f64x2.mul"
1446	OpcodeVecF64x2DivName                  = "f64x2.div"
1447	OpcodeVecF64x2MinName                  = "f64x2.min"
1448	OpcodeVecF64x2MaxName                  = "f64x2.max"
1449	OpcodeVecF64x2PminName                 = "f64x2.pmin"
1450	OpcodeVecF64x2PmaxName                 = "f64x2.pmax"
1451	OpcodeVecI32x4TruncSatF32x4SName       = "i32x4.trunc_sat_f32x4_s"
1452	OpcodeVecI32x4TruncSatF32x4UName       = "i32x4.trunc_sat_f32x4_u"
1453	OpcodeVecF32x4ConvertI32x4SName        = "f32x4.convert_i32x4_s"
1454	OpcodeVecF32x4ConvertI32x4UName        = "f32x4.convert_i32x4_u"
1455	OpcodeVecI32x4TruncSatF64x2SZeroName   = "i32x4.trunc_sat_f64x2_s_zero"
1456	OpcodeVecI32x4TruncSatF64x2UZeroName   = "i32x4.trunc_sat_f64x2_u_zero"
1457	OpcodeVecF64x2ConvertLowI32x4SName     = "f64x2.convert_low_i32x4_s"
1458	OpcodeVecF64x2ConvertLowI32x4UName     = "f64x2.convert_low_i32x4_u"
1459	OpcodeVecF32x4DemoteF64x2ZeroName      = "f32x4.demote_f64x2_zero"
1460	OpcodeVecF64x2PromoteLowF32x4ZeroName  = "f64x2.promote_low_f32x4"
1461)
1462
1463var vectorInstructionName = map[OpcodeVec]string{
1464	OpcodeVecV128Load:                  OpcodeVecV128LoadName,
1465	OpcodeVecV128Load8x8s:              OpcodeVecV128Load8x8SName,
1466	OpcodeVecV128Load8x8u:              OpcodeVecV128Load8x8UName,
1467	OpcodeVecV128Load16x4s:             OpcodeVecV128Load16x4SName,
1468	OpcodeVecV128Load16x4u:             OpcodeVecV128Load16x4UName,
1469	OpcodeVecV128Load32x2s:             OpcodeVecV128Load32x2SName,
1470	OpcodeVecV128Load32x2u:             OpcodeVecV128Load32x2UName,
1471	OpcodeVecV128Load8Splat:            OpcodeVecV128Load8SplatName,
1472	OpcodeVecV128Load16Splat:           OpcodeVecV128Load16SplatName,
1473	OpcodeVecV128Load32Splat:           OpcodeVecV128Load32SplatName,
1474	OpcodeVecV128Load64Splat:           OpcodeVecV128Load64SplatName,
1475	OpcodeVecV128Load32zero:            OpcodeVecV128Load32zeroName,
1476	OpcodeVecV128Load64zero:            OpcodeVecV128Load64zeroName,
1477	OpcodeVecV128Store:                 OpcodeVecV128StoreName,
1478	OpcodeVecV128Load8Lane:             OpcodeVecV128Load8LaneName,
1479	OpcodeVecV128Load16Lane:            OpcodeVecV128Load16LaneName,
1480	OpcodeVecV128Load32Lane:            OpcodeVecV128Load32LaneName,
1481	OpcodeVecV128Load64Lane:            OpcodeVecV128Load64LaneName,
1482	OpcodeVecV128Store8Lane:            OpcodeVecV128Store8LaneName,
1483	OpcodeVecV128Store16Lane:           OpcodeVecV128Store16LaneName,
1484	OpcodeVecV128Store32Lane:           OpcodeVecV128Store32LaneName,
1485	OpcodeVecV128Store64Lane:           OpcodeVecV128Store64LaneName,
1486	OpcodeVecV128Const:                 OpcodeVecV128ConstName,
1487	OpcodeVecV128i8x16Shuffle:          OpcodeVecV128i8x16ShuffleName,
1488	OpcodeVecI8x16ExtractLaneS:         OpcodeVecI8x16ExtractLaneSName,
1489	OpcodeVecI8x16ExtractLaneU:         OpcodeVecI8x16ExtractLaneUName,
1490	OpcodeVecI8x16ReplaceLane:          OpcodeVecI8x16ReplaceLaneName,
1491	OpcodeVecI16x8ExtractLaneS:         OpcodeVecI16x8ExtractLaneSName,
1492	OpcodeVecI16x8ExtractLaneU:         OpcodeVecI16x8ExtractLaneUName,
1493	OpcodeVecI16x8ReplaceLane:          OpcodeVecI16x8ReplaceLaneName,
1494	OpcodeVecI32x4ExtractLane:          OpcodeVecI32x4ExtractLaneName,
1495	OpcodeVecI32x4ReplaceLane:          OpcodeVecI32x4ReplaceLaneName,
1496	OpcodeVecI64x2ExtractLane:          OpcodeVecI64x2ExtractLaneName,
1497	OpcodeVecI64x2ReplaceLane:          OpcodeVecI64x2ReplaceLaneName,
1498	OpcodeVecF32x4ExtractLane:          OpcodeVecF32x4ExtractLaneName,
1499	OpcodeVecF32x4ReplaceLane:          OpcodeVecF32x4ReplaceLaneName,
1500	OpcodeVecF64x2ExtractLane:          OpcodeVecF64x2ExtractLaneName,
1501	OpcodeVecF64x2ReplaceLane:          OpcodeVecF64x2ReplaceLaneName,
1502	OpcodeVecI8x16Swizzle:              OpcodeVecI8x16SwizzleName,
1503	OpcodeVecI8x16Splat:                OpcodeVecI8x16SplatName,
1504	OpcodeVecI16x8Splat:                OpcodeVecI16x8SplatName,
1505	OpcodeVecI32x4Splat:                OpcodeVecI32x4SplatName,
1506	OpcodeVecI64x2Splat:                OpcodeVecI64x2SplatName,
1507	OpcodeVecF32x4Splat:                OpcodeVecF32x4SplatName,
1508	OpcodeVecF64x2Splat:                OpcodeVecF64x2SplatName,
1509	OpcodeVecI8x16Eq:                   OpcodeVecI8x16EqName,
1510	OpcodeVecI8x16Ne:                   OpcodeVecI8x16NeName,
1511	OpcodeVecI8x16LtS:                  OpcodeVecI8x16LtSName,
1512	OpcodeVecI8x16LtU:                  OpcodeVecI8x16LtUName,
1513	OpcodeVecI8x16GtS:                  OpcodeVecI8x16GtSName,
1514	OpcodeVecI8x16GtU:                  OpcodeVecI8x16GtUName,
1515	OpcodeVecI8x16LeS:                  OpcodeVecI8x16LeSName,
1516	OpcodeVecI8x16LeU:                  OpcodeVecI8x16LeUName,
1517	OpcodeVecI8x16GeS:                  OpcodeVecI8x16GeSName,
1518	OpcodeVecI8x16GeU:                  OpcodeVecI8x16GeUName,
1519	OpcodeVecI16x8Eq:                   OpcodeVecI16x8EqName,
1520	OpcodeVecI16x8Ne:                   OpcodeVecI16x8NeName,
1521	OpcodeVecI16x8LtS:                  OpcodeVecI16x8LtSName,
1522	OpcodeVecI16x8LtU:                  OpcodeVecI16x8LtUName,
1523	OpcodeVecI16x8GtS:                  OpcodeVecI16x8GtSName,
1524	OpcodeVecI16x8GtU:                  OpcodeVecI16x8GtUName,
1525	OpcodeVecI16x8LeS:                  OpcodeVecI16x8LeSName,
1526	OpcodeVecI16x8LeU:                  OpcodeVecI16x8LeUName,
1527	OpcodeVecI16x8GeS:                  OpcodeVecI16x8GeSName,
1528	OpcodeVecI16x8GeU:                  OpcodeVecI16x8GeUName,
1529	OpcodeVecI32x4Eq:                   OpcodeVecI32x4EqName,
1530	OpcodeVecI32x4Ne:                   OpcodeVecI32x4NeName,
1531	OpcodeVecI32x4LtS:                  OpcodeVecI32x4LtSName,
1532	OpcodeVecI32x4LtU:                  OpcodeVecI32x4LtUName,
1533	OpcodeVecI32x4GtS:                  OpcodeVecI32x4GtSName,
1534	OpcodeVecI32x4GtU:                  OpcodeVecI32x4GtUName,
1535	OpcodeVecI32x4LeS:                  OpcodeVecI32x4LeSName,
1536	OpcodeVecI32x4LeU:                  OpcodeVecI32x4LeUName,
1537	OpcodeVecI32x4GeS:                  OpcodeVecI32x4GeSName,
1538	OpcodeVecI32x4GeU:                  OpcodeVecI32x4GeUName,
1539	OpcodeVecI64x2Eq:                   OpcodeVecI64x2EqName,
1540	OpcodeVecI64x2Ne:                   OpcodeVecI64x2NeName,
1541	OpcodeVecI64x2LtS:                  OpcodeVecI64x2LtSName,
1542	OpcodeVecI64x2GtS:                  OpcodeVecI64x2GtSName,
1543	OpcodeVecI64x2LeS:                  OpcodeVecI64x2LeSName,
1544	OpcodeVecI64x2GeS:                  OpcodeVecI64x2GeSName,
1545	OpcodeVecF32x4Eq:                   OpcodeVecF32x4EqName,
1546	OpcodeVecF32x4Ne:                   OpcodeVecF32x4NeName,
1547	OpcodeVecF32x4Lt:                   OpcodeVecF32x4LtName,
1548	OpcodeVecF32x4Gt:                   OpcodeVecF32x4GtName,
1549	OpcodeVecF32x4Le:                   OpcodeVecF32x4LeName,
1550	OpcodeVecF32x4Ge:                   OpcodeVecF32x4GeName,
1551	OpcodeVecF64x2Eq:                   OpcodeVecF64x2EqName,
1552	OpcodeVecF64x2Ne:                   OpcodeVecF64x2NeName,
1553	OpcodeVecF64x2Lt:                   OpcodeVecF64x2LtName,
1554	OpcodeVecF64x2Gt:                   OpcodeVecF64x2GtName,
1555	OpcodeVecF64x2Le:                   OpcodeVecF64x2LeName,
1556	OpcodeVecF64x2Ge:                   OpcodeVecF64x2GeName,
1557	OpcodeVecV128Not:                   OpcodeVecV128NotName,
1558	OpcodeVecV128And:                   OpcodeVecV128AndName,
1559	OpcodeVecV128AndNot:                OpcodeVecV128AndNotName,
1560	OpcodeVecV128Or:                    OpcodeVecV128OrName,
1561	OpcodeVecV128Xor:                   OpcodeVecV128XorName,
1562	OpcodeVecV128Bitselect:             OpcodeVecV128BitselectName,
1563	OpcodeVecV128AnyTrue:               OpcodeVecV128AnyTrueName,
1564	OpcodeVecI8x16Abs:                  OpcodeVecI8x16AbsName,
1565	OpcodeVecI8x16Neg:                  OpcodeVecI8x16NegName,
1566	OpcodeVecI8x16Popcnt:               OpcodeVecI8x16PopcntName,
1567	OpcodeVecI8x16AllTrue:              OpcodeVecI8x16AllTrueName,
1568	OpcodeVecI8x16BitMask:              OpcodeVecI8x16BitMaskName,
1569	OpcodeVecI8x16NarrowI16x8S:         OpcodeVecI8x16NarrowI16x8SName,
1570	OpcodeVecI8x16NarrowI16x8U:         OpcodeVecI8x16NarrowI16x8UName,
1571	OpcodeVecI8x16Shl:                  OpcodeVecI8x16ShlName,
1572	OpcodeVecI8x16ShrS:                 OpcodeVecI8x16ShrSName,
1573	OpcodeVecI8x16ShrU:                 OpcodeVecI8x16ShrUName,
1574	OpcodeVecI8x16Add:                  OpcodeVecI8x16AddName,
1575	OpcodeVecI8x16AddSatS:              OpcodeVecI8x16AddSatSName,
1576	OpcodeVecI8x16AddSatU:              OpcodeVecI8x16AddSatUName,
1577	OpcodeVecI8x16Sub:                  OpcodeVecI8x16SubName,
1578	OpcodeVecI8x16SubSatS:              OpcodeVecI8x16SubSatSName,
1579	OpcodeVecI8x16SubSatU:              OpcodeVecI8x16SubSatUName,
1580	OpcodeVecI8x16MinS:                 OpcodeVecI8x16MinSName,
1581	OpcodeVecI8x16MinU:                 OpcodeVecI8x16MinUName,
1582	OpcodeVecI8x16MaxS:                 OpcodeVecI8x16MaxSName,
1583	OpcodeVecI8x16MaxU:                 OpcodeVecI8x16MaxUName,
1584	OpcodeVecI8x16AvgrU:                OpcodeVecI8x16AvgrUName,
1585	OpcodeVecI16x8ExtaddPairwiseI8x16S: OpcodeVecI16x8ExtaddPairwiseI8x16SName,
1586	OpcodeVecI16x8ExtaddPairwiseI8x16U: OpcodeVecI16x8ExtaddPairwiseI8x16UName,
1587	OpcodeVecI16x8Abs:                  OpcodeVecI16x8AbsName,
1588	OpcodeVecI16x8Neg:                  OpcodeVecI16x8NegName,
1589	OpcodeVecI16x8Q15mulrSatS:          OpcodeVecI16x8Q15mulrSatSName,
1590	OpcodeVecI16x8AllTrue:              OpcodeVecI16x8AllTrueName,
1591	OpcodeVecI16x8BitMask:              OpcodeVecI16x8BitMaskName,
1592	OpcodeVecI16x8NarrowI32x4S:         OpcodeVecI16x8NarrowI32x4SName,
1593	OpcodeVecI16x8NarrowI32x4U:         OpcodeVecI16x8NarrowI32x4UName,
1594	OpcodeVecI16x8ExtendLowI8x16S:      OpcodeVecI16x8ExtendLowI8x16SName,
1595	OpcodeVecI16x8ExtendHighI8x16S:     OpcodeVecI16x8ExtendHighI8x16SName,
1596	OpcodeVecI16x8ExtendLowI8x16U:      OpcodeVecI16x8ExtendLowI8x16UName,
1597	OpcodeVecI16x8ExtendHighI8x16U:     OpcodeVecI16x8ExtendHighI8x16UName,
1598	OpcodeVecI16x8Shl:                  OpcodeVecI16x8ShlName,
1599	OpcodeVecI16x8ShrS:                 OpcodeVecI16x8ShrSName,
1600	OpcodeVecI16x8ShrU:                 OpcodeVecI16x8ShrUName,
1601	OpcodeVecI16x8Add:                  OpcodeVecI16x8AddName,
1602	OpcodeVecI16x8AddSatS:              OpcodeVecI16x8AddSatSName,
1603	OpcodeVecI16x8AddSatU:              OpcodeVecI16x8AddSatUName,
1604	OpcodeVecI16x8Sub:                  OpcodeVecI16x8SubName,
1605	OpcodeVecI16x8SubSatS:              OpcodeVecI16x8SubSatSName,
1606	OpcodeVecI16x8SubSatU:              OpcodeVecI16x8SubSatUName,
1607	OpcodeVecI16x8Mul:                  OpcodeVecI16x8MulName,
1608	OpcodeVecI16x8MinS:                 OpcodeVecI16x8MinSName,
1609	OpcodeVecI16x8MinU:                 OpcodeVecI16x8MinUName,
1610	OpcodeVecI16x8MaxS:                 OpcodeVecI16x8MaxSName,
1611	OpcodeVecI16x8MaxU:                 OpcodeVecI16x8MaxUName,
1612	OpcodeVecI16x8AvgrU:                OpcodeVecI16x8AvgrUName,
1613	OpcodeVecI16x8ExtMulLowI8x16S:      OpcodeVecI16x8ExtMulLowI8x16SName,
1614	OpcodeVecI16x8ExtMulHighI8x16S:     OpcodeVecI16x8ExtMulHighI8x16SName,
1615	OpcodeVecI16x8ExtMulLowI8x16U:      OpcodeVecI16x8ExtMulLowI8x16UName,
1616	OpcodeVecI16x8ExtMulHighI8x16U:     OpcodeVecI16x8ExtMulHighI8x16UName,
1617	OpcodeVecI32x4ExtaddPairwiseI16x8S: OpcodeVecI32x4ExtaddPairwiseI16x8SName,
1618	OpcodeVecI32x4ExtaddPairwiseI16x8U: OpcodeVecI32x4ExtaddPairwiseI16x8UName,
1619	OpcodeVecI32x4Abs:                  OpcodeVecI32x4AbsName,
1620	OpcodeVecI32x4Neg:                  OpcodeVecI32x4NegName,
1621	OpcodeVecI32x4AllTrue:              OpcodeVecI32x4AllTrueName,
1622	OpcodeVecI32x4BitMask:              OpcodeVecI32x4BitMaskName,
1623	OpcodeVecI32x4ExtendLowI16x8S:      OpcodeVecI32x4ExtendLowI16x8SName,
1624	OpcodeVecI32x4ExtendHighI16x8S:     OpcodeVecI32x4ExtendHighI16x8SName,
1625	OpcodeVecI32x4ExtendLowI16x8U:      OpcodeVecI32x4ExtendLowI16x8UName,
1626	OpcodeVecI32x4ExtendHighI16x8U:     OpcodeVecI32x4ExtendHighI16x8UName,
1627	OpcodeVecI32x4Shl:                  OpcodeVecI32x4ShlName,
1628	OpcodeVecI32x4ShrS:                 OpcodeVecI32x4ShrSName,
1629	OpcodeVecI32x4ShrU:                 OpcodeVecI32x4ShrUName,
1630	OpcodeVecI32x4Add:                  OpcodeVecI32x4AddName,
1631	OpcodeVecI32x4Sub:                  OpcodeVecI32x4SubName,
1632	OpcodeVecI32x4Mul:                  OpcodeVecI32x4MulName,
1633	OpcodeVecI32x4MinS:                 OpcodeVecI32x4MinSName,
1634	OpcodeVecI32x4MinU:                 OpcodeVecI32x4MinUName,
1635	OpcodeVecI32x4MaxS:                 OpcodeVecI32x4MaxSName,
1636	OpcodeVecI32x4MaxU:                 OpcodeVecI32x4MaxUName,
1637	OpcodeVecI32x4DotI16x8S:            OpcodeVecI32x4DotI16x8SName,
1638	OpcodeVecI32x4ExtMulLowI16x8S:      OpcodeVecI32x4ExtMulLowI16x8SName,
1639	OpcodeVecI32x4ExtMulHighI16x8S:     OpcodeVecI32x4ExtMulHighI16x8SName,
1640	OpcodeVecI32x4ExtMulLowI16x8U:      OpcodeVecI32x4ExtMulLowI16x8UName,
1641	OpcodeVecI32x4ExtMulHighI16x8U:     OpcodeVecI32x4ExtMulHighI16x8UName,
1642	OpcodeVecI64x2Abs:                  OpcodeVecI64x2AbsName,
1643	OpcodeVecI64x2Neg:                  OpcodeVecI64x2NegName,
1644	OpcodeVecI64x2AllTrue:              OpcodeVecI64x2AllTrueName,
1645	OpcodeVecI64x2BitMask:              OpcodeVecI64x2BitMaskName,
1646	OpcodeVecI64x2ExtendLowI32x4S:      OpcodeVecI64x2ExtendLowI32x4SName,
1647	OpcodeVecI64x2ExtendHighI32x4S:     OpcodeVecI64x2ExtendHighI32x4SName,
1648	OpcodeVecI64x2ExtendLowI32x4U:      OpcodeVecI64x2ExtendLowI32x4UName,
1649	OpcodeVecI64x2ExtendHighI32x4U:     OpcodeVecI64x2ExtendHighI32x4UName,
1650	OpcodeVecI64x2Shl:                  OpcodeVecI64x2ShlName,
1651	OpcodeVecI64x2ShrS:                 OpcodeVecI64x2ShrSName,
1652	OpcodeVecI64x2ShrU:                 OpcodeVecI64x2ShrUName,
1653	OpcodeVecI64x2Add:                  OpcodeVecI64x2AddName,
1654	OpcodeVecI64x2Sub:                  OpcodeVecI64x2SubName,
1655	OpcodeVecI64x2Mul:                  OpcodeVecI64x2MulName,
1656	OpcodeVecI64x2ExtMulLowI32x4S:      OpcodeVecI64x2ExtMulLowI32x4SName,
1657	OpcodeVecI64x2ExtMulHighI32x4S:     OpcodeVecI64x2ExtMulHighI32x4SName,
1658	OpcodeVecI64x2ExtMulLowI32x4U:      OpcodeVecI64x2ExtMulLowI32x4UName,
1659	OpcodeVecI64x2ExtMulHighI32x4U:     OpcodeVecI64x2ExtMulHighI32x4UName,
1660	OpcodeVecF32x4Ceil:                 OpcodeVecF32x4CeilName,
1661	OpcodeVecF32x4Floor:                OpcodeVecF32x4FloorName,
1662	OpcodeVecF32x4Trunc:                OpcodeVecF32x4TruncName,
1663	OpcodeVecF32x4Nearest:              OpcodeVecF32x4NearestName,
1664	OpcodeVecF32x4Abs:                  OpcodeVecF32x4AbsName,
1665	OpcodeVecF32x4Neg:                  OpcodeVecF32x4NegName,
1666	OpcodeVecF32x4Sqrt:                 OpcodeVecF32x4SqrtName,
1667	OpcodeVecF32x4Add:                  OpcodeVecF32x4AddName,
1668	OpcodeVecF32x4Sub:                  OpcodeVecF32x4SubName,
1669	OpcodeVecF32x4Mul:                  OpcodeVecF32x4MulName,
1670	OpcodeVecF32x4Div:                  OpcodeVecF32x4DivName,
1671	OpcodeVecF32x4Min:                  OpcodeVecF32x4MinName,
1672	OpcodeVecF32x4Max:                  OpcodeVecF32x4MaxName,
1673	OpcodeVecF32x4Pmin:                 OpcodeVecF32x4PminName,
1674	OpcodeVecF32x4Pmax:                 OpcodeVecF32x4PmaxName,
1675	OpcodeVecF64x2Ceil:                 OpcodeVecF64x2CeilName,
1676	OpcodeVecF64x2Floor:                OpcodeVecF64x2FloorName,
1677	OpcodeVecF64x2Trunc:                OpcodeVecF64x2TruncName,
1678	OpcodeVecF64x2Nearest:              OpcodeVecF64x2NearestName,
1679	OpcodeVecF64x2Abs:                  OpcodeVecF64x2AbsName,
1680	OpcodeVecF64x2Neg:                  OpcodeVecF64x2NegName,
1681	OpcodeVecF64x2Sqrt:                 OpcodeVecF64x2SqrtName,
1682	OpcodeVecF64x2Add:                  OpcodeVecF64x2AddName,
1683	OpcodeVecF64x2Sub:                  OpcodeVecF64x2SubName,
1684	OpcodeVecF64x2Mul:                  OpcodeVecF64x2MulName,
1685	OpcodeVecF64x2Div:                  OpcodeVecF64x2DivName,
1686	OpcodeVecF64x2Min:                  OpcodeVecF64x2MinName,
1687	OpcodeVecF64x2Max:                  OpcodeVecF64x2MaxName,
1688	OpcodeVecF64x2Pmin:                 OpcodeVecF64x2PminName,
1689	OpcodeVecF64x2Pmax:                 OpcodeVecF64x2PmaxName,
1690	OpcodeVecI32x4TruncSatF32x4S:       OpcodeVecI32x4TruncSatF32x4SName,
1691	OpcodeVecI32x4TruncSatF32x4U:       OpcodeVecI32x4TruncSatF32x4UName,
1692	OpcodeVecF32x4ConvertI32x4S:        OpcodeVecF32x4ConvertI32x4SName,
1693	OpcodeVecF32x4ConvertI32x4U:        OpcodeVecF32x4ConvertI32x4UName,
1694	OpcodeVecI32x4TruncSatF64x2SZero:   OpcodeVecI32x4TruncSatF64x2SZeroName,
1695	OpcodeVecI32x4TruncSatF64x2UZero:   OpcodeVecI32x4TruncSatF64x2UZeroName,
1696	OpcodeVecF64x2ConvertLowI32x4S:     OpcodeVecF64x2ConvertLowI32x4SName,
1697	OpcodeVecF64x2ConvertLowI32x4U:     OpcodeVecF64x2ConvertLowI32x4UName,
1698	OpcodeVecF32x4DemoteF64x2Zero:      OpcodeVecF32x4DemoteF64x2ZeroName,
1699	OpcodeVecF64x2PromoteLowF32x4Zero:  OpcodeVecF64x2PromoteLowF32x4ZeroName,
1700}
1701
1702// VectorInstructionName returns the instruction name corresponding to the vector Opcode.
1703func VectorInstructionName(oc OpcodeVec) (ret string) {
1704	return vectorInstructionName[oc]
1705}
1706
1707const (
1708	OpcodeAtomicMemoryNotifyName = "memory.atomic.notify"
1709	OpcodeAtomicMemoryWait32Name = "memory.atomic.wait32"
1710	OpcodeAtomicMemoryWait64Name = "memory.atomic.wait64"
1711	OpcodeAtomicFenceName        = "atomic.fence"
1712
1713	OpcodeAtomicI32LoadName    = "i32.atomic.load"
1714	OpcodeAtomicI64LoadName    = "i64.atomic.load"
1715	OpcodeAtomicI32Load8UName  = "i32.atomic.load8_u"
1716	OpcodeAtomicI32Load16UName = "i32.atomic.load16_u"
1717	OpcodeAtomicI64Load8UName  = "i64.atomic.load8_u"
1718	OpcodeAtomicI64Load16UName = "i64.atomic.load16_u"
1719	OpcodeAtomicI64Load32UName = "i64.atomic.load32_u"
1720	OpcodeAtomicI32StoreName   = "i32.atomic.store"
1721	OpcodeAtomicI64StoreName   = "i64.atomic.store"
1722	OpcodeAtomicI32Store8Name  = "i32.atomic.store8"
1723	OpcodeAtomicI32Store16Name = "i32.atomic.store16"
1724	OpcodeAtomicI64Store8Name  = "i64.atomic.store8"
1725	OpcodeAtomicI64Store16Name = "i64.atomic.store16"
1726	OpcodeAtomicI64Store32Name = "i64.atomic.store32"
1727
1728	OpcodeAtomicI32RmwAddName    = "i32.atomic.rmw.add"
1729	OpcodeAtomicI64RmwAddName    = "i64.atomic.rmw.add"
1730	OpcodeAtomicI32Rmw8AddUName  = "i32.atomic.rmw8.add_u"
1731	OpcodeAtomicI32Rmw16AddUName = "i32.atomic.rmw16.add_u"
1732	OpcodeAtomicI64Rmw8AddUName  = "i64.atomic.rmw8.add_u"
1733	OpcodeAtomicI64Rmw16AddUName = "i64.atomic.rmw16.add_u"
1734	OpcodeAtomicI64Rmw32AddUName = "i64.atomic.rmw32.add_u"
1735
1736	OpcodeAtomicI32RmwSubName    = "i32.atomic.rmw.sub"
1737	OpcodeAtomicI64RmwSubName    = "i64.atomic.rmw.sub"
1738	OpcodeAtomicI32Rmw8SubUName  = "i32.atomic.rmw8.sub_u"
1739	OpcodeAtomicI32Rmw16SubUName = "i32.atomic.rmw16.sub_u"
1740	OpcodeAtomicI64Rmw8SubUName  = "i64.atomic.rmw8.sub_u"
1741	OpcodeAtomicI64Rmw16SubUName = "i64.atomic.rmw16.sub_u"
1742	OpcodeAtomicI64Rmw32SubUName = "i64.atomic.rmw32.sub_u"
1743
1744	OpcodeAtomicI32RmwAndName    = "i32.atomic.rmw.and"
1745	OpcodeAtomicI64RmwAndName    = "i64.atomic.rmw.and"
1746	OpcodeAtomicI32Rmw8AndUName  = "i32.atomic.rmw8.and_u"
1747	OpcodeAtomicI32Rmw16AndUName = "i32.atomic.rmw16.and_u"
1748	OpcodeAtomicI64Rmw8AndUName  = "i64.atomic.rmw8.and_u"
1749	OpcodeAtomicI64Rmw16AndUName = "i64.atomic.rmw16.and_u"
1750	OpcodeAtomicI64Rmw32AndUName = "i64.atomic.rmw32.and_u"
1751
1752	OpcodeAtomicI32RmwOrName    = "i32.atomic.rmw.or"
1753	OpcodeAtomicI64RmwOrName    = "i64.atomic.rmw.or"
1754	OpcodeAtomicI32Rmw8OrUName  = "i32.atomic.rmw8.or_u"
1755	OpcodeAtomicI32Rmw16OrUName = "i32.atomic.rmw16.or_u"
1756	OpcodeAtomicI64Rmw8OrUName  = "i64.atomic.rmw8.or_u"
1757	OpcodeAtomicI64Rmw16OrUName = "i64.atomic.rmw16.or_u"
1758	OpcodeAtomicI64Rmw32OrUName = "i64.atomic.rmw32.or_u"
1759
1760	OpcodeAtomicI32RmwXorName    = "i32.atomic.rmw.xor"
1761	OpcodeAtomicI64RmwXorName    = "i64.atomic.rmw.xor"
1762	OpcodeAtomicI32Rmw8XorUName  = "i32.atomic.rmw8.xor_u"
1763	OpcodeAtomicI32Rmw16XorUName = "i32.atomic.rmw16.xor_u"
1764	OpcodeAtomicI64Rmw8XorUName  = "i64.atomic.rmw8.xor_u"
1765	OpcodeAtomicI64Rmw16XorUName = "i64.atomic.rmw16.xor_u"
1766	OpcodeAtomicI64Rmw32XorUName = "i64.atomic.rmw32.xor_u"
1767
1768	OpcodeAtomicI32RmwXchgName    = "i32.atomic.rmw.xchg"
1769	OpcodeAtomicI64RmwXchgName    = "i64.atomic.rmw.xchg"
1770	OpcodeAtomicI32Rmw8XchgUName  = "i32.atomic.rmw8.xchg_u"
1771	OpcodeAtomicI32Rmw16XchgUName = "i32.atomic.rmw16.xchg_u"
1772	OpcodeAtomicI64Rmw8XchgUName  = "i64.atomic.rmw8.xchg_u"
1773	OpcodeAtomicI64Rmw16XchgUName = "i64.atomic.rmw16.xchg_u"
1774	OpcodeAtomicI64Rmw32XchgUName = "i64.atomic.rmw32.xchg_u"
1775
1776	OpcodeAtomicI32RmwCmpxchgName    = "i32.atomic.rmw.cmpxchg"
1777	OpcodeAtomicI64RmwCmpxchgName    = "i64.atomic.rmw.cmpxchg"
1778	OpcodeAtomicI32Rmw8CmpxchgUName  = "i32.atomic.rmw8.cmpxchg_u"
1779	OpcodeAtomicI32Rmw16CmpxchgUName = "i32.atomic.rmw16.cmpxchg_u"
1780	OpcodeAtomicI64Rmw8CmpxchgUName  = "i64.atomic.rmw8.cmpxchg_u"
1781	OpcodeAtomicI64Rmw16CmpxchgUName = "i64.atomic.rmw16.cmpxchg_u"
1782	OpcodeAtomicI64Rmw32CmpxchgUName = "i64.atomic.rmw32.cmpxchg_u"
1783)
1784
1785var atomicInstructionName = map[OpcodeAtomic]string{
1786	OpcodeAtomicMemoryNotify: OpcodeAtomicMemoryNotifyName,
1787	OpcodeAtomicMemoryWait32: OpcodeAtomicMemoryWait32Name,
1788	OpcodeAtomicMemoryWait64: OpcodeAtomicMemoryWait64Name,
1789	OpcodeAtomicFence:        OpcodeAtomicFenceName,
1790
1791	OpcodeAtomicI32Load:    OpcodeAtomicI32LoadName,
1792	OpcodeAtomicI64Load:    OpcodeAtomicI64LoadName,
1793	OpcodeAtomicI32Load8U:  OpcodeAtomicI32Load8UName,
1794	OpcodeAtomicI32Load16U: OpcodeAtomicI32Load16UName,
1795	OpcodeAtomicI64Load8U:  OpcodeAtomicI64Load8UName,
1796	OpcodeAtomicI64Load16U: OpcodeAtomicI64Load16UName,
1797	OpcodeAtomicI64Load32U: OpcodeAtomicI64Load32UName,
1798	OpcodeAtomicI32Store:   OpcodeAtomicI32StoreName,
1799	OpcodeAtomicI64Store:   OpcodeAtomicI64StoreName,
1800	OpcodeAtomicI32Store8:  OpcodeAtomicI32Store8Name,
1801	OpcodeAtomicI32Store16: OpcodeAtomicI32Store16Name,
1802	OpcodeAtomicI64Store8:  OpcodeAtomicI64Store8Name,
1803	OpcodeAtomicI64Store16: OpcodeAtomicI64Store16Name,
1804	OpcodeAtomicI64Store32: OpcodeAtomicI64Store32Name,
1805
1806	OpcodeAtomicI32RmwAdd:    OpcodeAtomicI32RmwAddName,
1807	OpcodeAtomicI64RmwAdd:    OpcodeAtomicI64RmwAddName,
1808	OpcodeAtomicI32Rmw8AddU:  OpcodeAtomicI32Rmw8AddUName,
1809	OpcodeAtomicI32Rmw16AddU: OpcodeAtomicI32Rmw16AddUName,
1810	OpcodeAtomicI64Rmw8AddU:  OpcodeAtomicI64Rmw8AddUName,
1811	OpcodeAtomicI64Rmw16AddU: OpcodeAtomicI64Rmw16AddUName,
1812	OpcodeAtomicI64Rmw32AddU: OpcodeAtomicI64Rmw32AddUName,
1813
1814	OpcodeAtomicI32RmwSub:    OpcodeAtomicI32RmwSubName,
1815	OpcodeAtomicI64RmwSub:    OpcodeAtomicI64RmwSubName,
1816	OpcodeAtomicI32Rmw8SubU:  OpcodeAtomicI32Rmw8SubUName,
1817	OpcodeAtomicI32Rmw16SubU: OpcodeAtomicI32Rmw16SubUName,
1818	OpcodeAtomicI64Rmw8SubU:  OpcodeAtomicI64Rmw8SubUName,
1819	OpcodeAtomicI64Rmw16SubU: OpcodeAtomicI64Rmw16SubUName,
1820	OpcodeAtomicI64Rmw32SubU: OpcodeAtomicI64Rmw32SubUName,
1821
1822	OpcodeAtomicI32RmwAnd:    OpcodeAtomicI32RmwAndName,
1823	OpcodeAtomicI64RmwAnd:    OpcodeAtomicI64RmwAndName,
1824	OpcodeAtomicI32Rmw8AndU:  OpcodeAtomicI32Rmw8AndUName,
1825	OpcodeAtomicI32Rmw16AndU: OpcodeAtomicI32Rmw16AndUName,
1826	OpcodeAtomicI64Rmw8AndU:  OpcodeAtomicI64Rmw8AndUName,
1827	OpcodeAtomicI64Rmw16AndU: OpcodeAtomicI64Rmw16AndUName,
1828	OpcodeAtomicI64Rmw32AndU: OpcodeAtomicI64Rmw32AndUName,
1829
1830	OpcodeAtomicI32RmwOr:    OpcodeAtomicI32RmwOrName,
1831	OpcodeAtomicI64RmwOr:    OpcodeAtomicI64RmwOrName,
1832	OpcodeAtomicI32Rmw8OrU:  OpcodeAtomicI32Rmw8OrUName,
1833	OpcodeAtomicI32Rmw16OrU: OpcodeAtomicI32Rmw16OrUName,
1834	OpcodeAtomicI64Rmw8OrU:  OpcodeAtomicI64Rmw8OrUName,
1835	OpcodeAtomicI64Rmw16OrU: OpcodeAtomicI64Rmw16OrUName,
1836	OpcodeAtomicI64Rmw32OrU: OpcodeAtomicI64Rmw32OrUName,
1837
1838	OpcodeAtomicI32RmwXor:    OpcodeAtomicI32RmwXorName,
1839	OpcodeAtomicI64RmwXor:    OpcodeAtomicI64RmwXorName,
1840	OpcodeAtomicI32Rmw8XorU:  OpcodeAtomicI32Rmw8XorUName,
1841	OpcodeAtomicI32Rmw16XorU: OpcodeAtomicI32Rmw16XorUName,
1842	OpcodeAtomicI64Rmw8XorU:  OpcodeAtomicI64Rmw8XorUName,
1843	OpcodeAtomicI64Rmw16XorU: OpcodeAtomicI64Rmw16XorUName,
1844	OpcodeAtomicI64Rmw32XorU: OpcodeAtomicI64Rmw32XorUName,
1845
1846	OpcodeAtomicI32RmwXchg:    OpcodeAtomicI32RmwXchgName,
1847	OpcodeAtomicI64RmwXchg:    OpcodeAtomicI64RmwXchgName,
1848	OpcodeAtomicI32Rmw8XchgU:  OpcodeAtomicI32Rmw8XchgUName,
1849	OpcodeAtomicI32Rmw16XchgU: OpcodeAtomicI32Rmw16XchgUName,
1850	OpcodeAtomicI64Rmw8XchgU:  OpcodeAtomicI64Rmw8XchgUName,
1851	OpcodeAtomicI64Rmw16XchgU: OpcodeAtomicI64Rmw16XchgUName,
1852	OpcodeAtomicI64Rmw32XchgU: OpcodeAtomicI64Rmw32XchgUName,
1853
1854	OpcodeAtomicI32RmwCmpxchg:    OpcodeAtomicI32RmwCmpxchgName,
1855	OpcodeAtomicI64RmwCmpxchg:    OpcodeAtomicI64RmwCmpxchgName,
1856	OpcodeAtomicI32Rmw8CmpxchgU:  OpcodeAtomicI32Rmw8CmpxchgUName,
1857	OpcodeAtomicI32Rmw16CmpxchgU: OpcodeAtomicI32Rmw16CmpxchgUName,
1858	OpcodeAtomicI64Rmw8CmpxchgU:  OpcodeAtomicI64Rmw8CmpxchgUName,
1859	OpcodeAtomicI64Rmw16CmpxchgU: OpcodeAtomicI64Rmw16CmpxchgUName,
1860	OpcodeAtomicI64Rmw32CmpxchgU: OpcodeAtomicI64Rmw32CmpxchgUName,
1861}
1862
1863// AtomicInstructionName returns the instruction name corresponding to the atomic Opcode.
1864func AtomicInstructionName(oc OpcodeAtomic) (ret string) {
1865	return atomicInstructionName[oc]
1866}