Arrange
Group by
Sort by
Show

Table 0 201 opcodesSingle-byte instructions.

0x
_0
_1
_2
_3
_4
_5
_6
_7
_8
_9
_A
_B
_C
_D
_E
_F
0_
0x00unreachabletrap immediatelyControl flowWasm 1.0 0x01nopdo nothingControl flowWasm 1.0 0x02blockControl flowWasm 1.0 0x03loopControl flowWasm 1.0 0x04ifControl flowWasm 1.0 0x05elseControl flowWasm 1.0 0x06tryControl flowLegacy 0x07catchControl flowLegacy 0x08throwControl flowWasm 3.0 0x09rethrowControl flowLegacy 0x0Athrow_refControl flowWasm 3.0 0x0BendControl flowWasm 1.0 0x0Cbrbranch to a labelControl flowWasm 1.0 0x0Dbr_ifControl flowWasm 1.0 0x0Ebr_tableControl flowWasm 1.0 0x0Freturnreturn from the functionControl flowWasm 1.0
1_
0x10callcall a functionControl flowWasm 1.0 0x11call_indirectControl flowWasm 1.0 0x12return_callControl flowWasm 3.0 0x13return_call_indirectControl flowWasm 3.0 0x14call_refControl flowWasm 3.0 0x15return_call_refControl flowWasm 3.0
0x16
0x17
0x18delegateControl flowLegacy 0x19catch_allControl flowLegacy 0x1Adropdiscard the top of the stackParametricWasm 1.0 0x1Bselectchoose one of two valuesParametricWasm 1.0 0x1Cselect tParametricWasm 2.0
0x1D
0x1E
0x1Ftry_tableControl flowWasm 3.0
2_
0x20local.getVariablesWasm 1.0 0x21local.setVariablesWasm 1.0 0x22local.teeVariablesWasm 1.0 0x23global.getVariablesWasm 1.0 0x24global.setVariablesWasm 1.0 0x25table.getTableWasm 2.0 0x26table.setTableWasm 2.0
0x27
0x28i32.loadread from memoryMemoryWasm 1.0 0x29i64.loadread from memoryMemoryWasm 1.0 0x2Af32.loadread from memoryMemoryWasm 1.0 0x2Bf64.loadread from memoryMemoryWasm 1.0 0x2Ci32.load8_sread 1 byte from memory, sign-extendedMemoryWasm 1.0 0x2Di32.load8_uread 1 byte from memory, zero-extendedMemoryWasm 1.0 0x2Ei32.load16_sread 2 bytes from memory, sign-extendedMemoryWasm 1.0 0x2Fi32.load16_uread 2 bytes from memory, zero-extendedMemoryWasm 1.0
3_
0x30i64.load8_sread 1 byte from memory, sign-extendedMemoryWasm 1.0 0x31i64.load8_uread 1 byte from memory, zero-extendedMemoryWasm 1.0 0x32i64.load16_sread 2 bytes from memory, sign-extendedMemoryWasm 1.0 0x33i64.load16_uread 2 bytes from memory, zero-extendedMemoryWasm 1.0 0x34i64.load32_sread 4 bytes from memory, sign-extendedMemoryWasm 1.0 0x35i64.load32_uread 4 bytes from memory, zero-extendedMemoryWasm 1.0 0x36i32.storewrite to memoryMemoryWasm 1.0 0x37i64.storewrite to memoryMemoryWasm 1.0 0x38f32.storewrite to memoryMemoryWasm 1.0 0x39f64.storewrite to memoryMemoryWasm 1.0 0x3Ai32.store8write the low 1 byte to memoryMemoryWasm 1.0 0x3Bi32.store16write the low 2 bytes to memoryMemoryWasm 1.0 0x3Ci64.store8write the low 1 byte to memoryMemoryWasm 1.0 0x3Di64.store16write the low 2 bytes to memoryMemoryWasm 1.0 0x3Ei64.store32write the low 4 bytes to memoryMemoryWasm 1.0 0x3Fmemory.sizeMemoryWasm 1.0
4_
0x40memory.growMemoryWasm 1.0 0x41i32.constNumericWasm 1.0 0x42i64.constNumericWasm 1.0 0x43f32.constNumericWasm 1.0 0x44f64.constNumericWasm 1.0 0x45i32.eqzequal to zeroNumericWasm 1.0 0x46i32.eqequalNumericWasm 1.0 0x47i32.nenot equalNumericWasm 1.0 0x48i32.lt_sless than, signedNumericWasm 1.0 0x49i32.lt_uless than, unsignedNumericWasm 1.0 0x4Ai32.gt_sgreater than, signedNumericWasm 1.0 0x4Bi32.gt_ugreater than, unsignedNumericWasm 1.0 0x4Ci32.le_sless than or equal, signedNumericWasm 1.0 0x4Di32.le_uless than or equal, unsignedNumericWasm 1.0 0x4Ei32.ge_sgreater than or equal, signedNumericWasm 1.0 0x4Fi32.ge_ugreater than or equal, unsignedNumericWasm 1.0
5_
0x50i64.eqzequal to zeroNumericWasm 1.0 0x51i64.eqequalNumericWasm 1.0 0x52i64.nenot equalNumericWasm 1.0 0x53i64.lt_sless than, signedNumericWasm 1.0 0x54i64.lt_uless than, unsignedNumericWasm 1.0 0x55i64.gt_sgreater than, signedNumericWasm 1.0 0x56i64.gt_ugreater than, unsignedNumericWasm 1.0 0x57i64.le_sless than or equal, signedNumericWasm 1.0 0x58i64.le_uless than or equal, unsignedNumericWasm 1.0 0x59i64.ge_sgreater than or equal, signedNumericWasm 1.0 0x5Ai64.ge_ugreater than or equal, unsignedNumericWasm 1.0 0x5Bf32.eqequalNumericWasm 1.0 0x5Cf32.nenot equalNumericWasm 1.0 0x5Df32.ltless thanNumericWasm 1.0 0x5Ef32.gtgreater thanNumericWasm 1.0 0x5Ff32.leless than or equalNumericWasm 1.0
6_
0x60f32.gegreater than or equalNumericWasm 1.0 0x61f64.eqequalNumericWasm 1.0 0x62f64.nenot equalNumericWasm 1.0 0x63f64.ltless thanNumericWasm 1.0 0x64f64.gtgreater thanNumericWasm 1.0 0x65f64.leless than or equalNumericWasm 1.0 0x66f64.gegreater than or equalNumericWasm 1.0 0x67i32.clzcount leading zero bitsNumericWasm 1.0 0x68i32.ctzcount trailing zero bitsNumericWasm 1.0 0x69i32.popcntcount one bitsNumericWasm 1.0 0x6Ai32.addaddNumericWasm 1.0 0x6Bi32.subsubtractNumericWasm 1.0 0x6Ci32.mulmultiplyNumericWasm 1.0 0x6Di32.div_sdivide, signedNumericWasm 1.0 0x6Ei32.div_udivide, unsignedNumericWasm 1.0 0x6Fi32.rem_sremainder after division, signedNumericWasm 1.0
7_
0x70i32.rem_uremainder after division, unsignedNumericWasm 1.0 0x71i32.andbitwise andNumericWasm 1.0 0x72i32.orbitwise orNumericWasm 1.0 0x73i32.xorbitwise exclusive orNumericWasm 1.0 0x74i32.shlshift leftNumericWasm 1.0 0x75i32.shr_sshift right, signedNumericWasm 1.0 0x76i32.shr_ushift right, unsignedNumericWasm 1.0 0x77i32.rotlrotate bits leftNumericWasm 1.0 0x78i32.rotrrotate bits rightNumericWasm 1.0 0x79i64.clzcount leading zero bitsNumericWasm 1.0 0x7Ai64.ctzcount trailing zero bitsNumericWasm 1.0 0x7Bi64.popcntcount one bitsNumericWasm 1.0 0x7Ci64.addaddNumericWasm 1.0 0x7Di64.subsubtractNumericWasm 1.0 0x7Ei64.mulmultiplyNumericWasm 1.0 0x7Fi64.div_sdivide, signedNumericWasm 1.0
8_
0x80i64.div_udivide, unsignedNumericWasm 1.0 0x81i64.rem_sremainder after division, signedNumericWasm 1.0 0x82i64.rem_uremainder after division, unsignedNumericWasm 1.0 0x83i64.andbitwise andNumericWasm 1.0 0x84i64.orbitwise orNumericWasm 1.0 0x85i64.xorbitwise exclusive orNumericWasm 1.0 0x86i64.shlshift leftNumericWasm 1.0 0x87i64.shr_sshift right, signedNumericWasm 1.0 0x88i64.shr_ushift right, unsignedNumericWasm 1.0 0x89i64.rotlrotate bits leftNumericWasm 1.0 0x8Ai64.rotrrotate bits rightNumericWasm 1.0 0x8Bf32.absabsolute valueNumericWasm 1.0 0x8Cf32.negnegateNumericWasm 1.0 0x8Df32.ceilround up to the nearest integerNumericWasm 1.0 0x8Ef32.floorround down to the nearest integerNumericWasm 1.0 0x8Ff32.truncround toward zeroNumericWasm 1.0
9_
0x90f32.nearestround to the nearest integer, ties to evenNumericWasm 1.0 0x91f32.sqrtsquare rootNumericWasm 1.0 0x92f32.addaddNumericWasm 1.0 0x93f32.subsubtractNumericWasm 1.0 0x94f32.mulmultiplyNumericWasm 1.0 0x95f32.divdivideNumericWasm 1.0 0x96f32.minsmaller of the twoNumericWasm 1.0 0x97f32.maxlarger of the twoNumericWasm 1.0 0x98f32.copysignmagnitude of the first, sign of the secondNumericWasm 1.0 0x99f64.absabsolute valueNumericWasm 1.0 0x9Af64.negnegateNumericWasm 1.0 0x9Bf64.ceilround up to the nearest integerNumericWasm 1.0 0x9Cf64.floorround down to the nearest integerNumericWasm 1.0 0x9Df64.truncround toward zeroNumericWasm 1.0 0x9Ef64.nearestround to the nearest integer, ties to evenNumericWasm 1.0 0x9Ff64.sqrtsquare rootNumericWasm 1.0
A_
0xA0f64.addaddNumericWasm 1.0 0xA1f64.subsubtractNumericWasm 1.0 0xA2f64.mulmultiplyNumericWasm 1.0 0xA3f64.divdivideNumericWasm 1.0 0xA4f64.minsmaller of the twoNumericWasm 1.0 0xA5f64.maxlarger of the twoNumericWasm 1.0 0xA6f64.copysignmagnitude of the first, sign of the secondNumericWasm 1.0 0xA7i32.wrap_i64discard the high bits to fit a narrower typeNumericWasm 1.0 0xA8i32.trunc_f32_sfloat to integer, trapping out of range, signedNumericWasm 1.0 0xA9i32.trunc_f32_ufloat to integer, trapping out of range, unsignedNumericWasm 1.0 0xAAi32.trunc_f64_sfloat to integer, trapping out of range, signedNumericWasm 1.0 0xABi32.trunc_f64_ufloat to integer, trapping out of range, unsignedNumericWasm 1.0 0xACi64.extend_i32_swiden, keeping the value, signedNumericWasm 1.0 0xADi64.extend_i32_uwiden, keeping the value, unsignedNumericWasm 1.0 0xAEi64.trunc_f32_sfloat to integer, trapping out of range, signedNumericWasm 1.0 0xAFi64.trunc_f32_ufloat to integer, trapping out of range, unsignedNumericWasm 1.0
B_
0xB0i64.trunc_f64_sfloat to integer, trapping out of range, signedNumericWasm 1.0 0xB1i64.trunc_f64_ufloat to integer, trapping out of range, unsignedNumericWasm 1.0 0xB2f32.convert_i32_sinteger to floating point, signedNumericWasm 1.0 0xB3f32.convert_i32_uinteger to floating point, unsignedNumericWasm 1.0 0xB4f32.convert_i64_sinteger to floating point, signedNumericWasm 1.0 0xB5f32.convert_i64_uinteger to floating point, unsignedNumericWasm 1.0 0xB6f32.demote_f64to the narrower float typeNumericWasm 1.0 0xB7f64.convert_i32_sinteger to floating point, signedNumericWasm 1.0 0xB8f64.convert_i32_uinteger to floating point, unsignedNumericWasm 1.0 0xB9f64.convert_i64_sinteger to floating point, signedNumericWasm 1.0 0xBAf64.convert_i64_uinteger to floating point, unsignedNumericWasm 1.0 0xBBf64.promote_f32to the wider float typeNumericWasm 1.0 0xBCi32.reinterpret_f32same bits, read as the other typeNumericWasm 1.0 0xBDi64.reinterpret_f64same bits, read as the other typeNumericWasm 1.0 0xBEf32.reinterpret_i32same bits, read as the other typeNumericWasm 1.0 0xBFf64.reinterpret_i64same bits, read as the other typeNumericWasm 1.0
C_
0xC0i32.extend8_swiden, keeping the value, signedNumericWasm 2.0 0xC1i32.extend16_swiden, keeping the value, signedNumericWasm 2.0 0xC2i64.extend8_swiden, keeping the value, signedNumericWasm 2.0 0xC3i64.extend16_swiden, keeping the value, signedNumericWasm 2.0 0xC4i64.extend32_swiden, keeping the value, signedNumericWasm 2.0
0xC5
0xC6
0xC7
0xC8
0xC9
0xCA
0xCB
0xCC
0xCD
0xCE
0xCF
D_
0xD0ref.nullReferenceWasm 2.0 0xD1ref.is_nullReferenceWasm 2.0 0xD2ref.funcReferenceWasm 2.0 0xD3ref.eqequalReferenceWasm 3.0 0xD4ref.as_non_nullReferenceWasm 3.0 0xD5br_on_nullControl flowWasm 3.0 0xD6br_on_non_nullControl flowWasm 3.0
0xD7
0xD8
0xD9
0xDA
0xDB
0xDC
0xDD
0xDE
0xDF
E_
0xE0cont.newControl flowProposal (Phase 3) 0xE1cont.bindControl flowProposal (Phase 3) 0xE2suspendControl flowProposal (Phase 3) 0xE3resumeControl flowProposal (Phase 3) 0xE4resume_throwControl flowProposal (Phase 3) 0xE5resume_throw_refControl flowProposal (Phase 3) 0xE6switchControl flowProposal (Phase 3)
0xE7
0xE8
0xE9
0xEA
0xEB
0xEC
0xED
0xEE
0xEF
F_
0xF0
0xF1
0xF2
0xF3
0xF4
0xF5
0xF6
0xF7
0xF8
0xF9
0xFA
0xFB0xFB03839 opcodesBPrefix 0xFC0xFC04924 opcodesCPrefix 0xFD0xFD0335291 opcodesDPrefix 0xFE0xFE0113103 opcodesEPrefix
0xFF

Table B 39 opcodesMultibyte instructions beginning with 0xFB.

0xFB
+0
+1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
0
0xFB 0:u32struct.newGarbage collectionWasm 3.0 0xFB 1:u32struct.new_defaultGarbage collectionWasm 3.0 0xFB 2:u32struct.getGarbage collectionWasm 3.0 0xFB 3:u32struct.get_sGarbage collectionWasm 3.0 0xFB 4:u32struct.get_uGarbage collectionWasm 3.0 0xFB 5:u32struct.setGarbage collectionWasm 3.0 0xFB 6:u32array.newGarbage collectionWasm 3.0 0xFB 7:u32array.new_defaultGarbage collectionWasm 3.0 0xFB 8:u32array.new_fixedGarbage collectionWasm 3.0 0xFB 9:u32array.new_dataGarbage collectionWasm 3.0 0xFB 10:u32array.new_elemGarbage collectionWasm 3.0 0xFB 11:u32array.getGarbage collectionWasm 3.0 0xFB 12:u32array.get_sGarbage collectionWasm 3.0 0xFB 13:u32array.get_uGarbage collectionWasm 3.0 0xFB 14:u32array.setGarbage collectionWasm 3.0 0xFB 15:u32array.lenGarbage collectionWasm 3.0
16
0xFB 16:u32array.fillGarbage collectionWasm 3.0 0xFB 17:u32array.copyGarbage collectionWasm 3.0 0xFB 18:u32array.init_dataGarbage collectionWasm 3.0 0xFB 19:u32array.init_elemGarbage collectionWasm 3.0 0xFB 20:u32ref.testReferenceWasm 3.0 0xFB 21:u32ref.test nullReferenceWasm 3.0 0xFB 22:u32ref.castReferenceWasm 3.0 0xFB 23:u32ref.cast nullReferenceWasm 3.0 0xFB 24:u32br_on_castControl flowWasm 3.0 0xFB 25:u32br_on_cast_failControl flowWasm 3.0 0xFB 26:u32any.convert_externinteger to floating pointGarbage collectionWasm 3.0 0xFB 27:u32extern.convert_anyinteger to floating pointGarbage collectionWasm 3.0 0xFB 28:u32ref.i31ReferenceWasm 3.0 0xFB 29:u32i31.get_sGarbage collectionWasm 3.0 0xFB 30:u32i31.get_uGarbage collectionWasm 3.0 0xFB 31:u32ref.i31_sharedReferenceProposal (Phase 1)
32
0xFB 32:u32struct.new_descGarbage collectionProposal (Phase 3) 0xFB 33:u32struct.new_default_descGarbage collectionProposal (Phase 3) 0xFB 34:u32ref.get_descReferenceProposal (Phase 3) 0xFB 35:u32ref.cast_desc_eqReferenceProposal (Phase 3) 0xFB 36:u32ref.cast_desc_eq nullReferenceProposal (Phase 3) 0xFB 37:u32br_on_cast_desc_eqControl flowProposal (Phase 3) 0xFB 38:u32br_on_cast_desc_eq_failControl flowProposal (Phase 3)
0xFB 39:u32
0xFB 40:u32
0xFB 41:u32
0xFB 42:u32
0xFB 43:u32
0xFB 44:u32
0xFB 45:u32
0xFB 46:u32
0xFB 47:u32

Table C 24 opcodesMultibyte instructions beginning with 0xFC.

0xFC
+0
+1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
0
0xFC 0:u32i32.trunc_sat_f32_sfloat to integer, clamped to the range, signedNumericWasm 2.0 0xFC 1:u32i32.trunc_sat_f32_ufloat to integer, clamped to the range, unsignedNumericWasm 2.0 0xFC 2:u32i32.trunc_sat_f64_sfloat to integer, clamped to the range, signedNumericWasm 2.0 0xFC 3:u32i32.trunc_sat_f64_ufloat to integer, clamped to the range, unsignedNumericWasm 2.0 0xFC 4:u32i64.trunc_sat_f32_sfloat to integer, clamped to the range, signedNumericWasm 2.0 0xFC 5:u32i64.trunc_sat_f32_ufloat to integer, clamped to the range, unsignedNumericWasm 2.0 0xFC 6:u32i64.trunc_sat_f64_sfloat to integer, clamped to the range, signedNumericWasm 2.0 0xFC 7:u32i64.trunc_sat_f64_ufloat to integer, clamped to the range, unsignedNumericWasm 2.0 0xFC 8:u32memory.initMemoryWasm 2.0 0xFC 9:u32data.dropdiscard the top of the stackMemoryWasm 2.0 0xFC 10:u32memory.copyMemoryWasm 2.0 0xFC 11:u32memory.fillMemoryWasm 2.0 0xFC 12:u32table.initTableWasm 2.0 0xFC 13:u32elem.dropdiscard the top of the stackTableWasm 2.0 0xFC 14:u32table.copyTableWasm 2.0 0xFC 15:u32table.growTableWasm 2.0
16
0xFC 16:u32table.sizeTableWasm 2.0 0xFC 17:u32table.fillTableWasm 2.0
0xFC 18:u32
0xFC 19:u32i64.add128addNumericProposal (Phase 3) 0xFC 20:u32i64.sub128subtractNumericProposal (Phase 3) 0xFC 21:u32i64.mul_wide_smultiplyNumericProposal (Phase 3) 0xFC 22:u32i64.mul_wide_umultiplyNumericProposal (Phase 3)
0xFC 23:u32
0xFC 24:u32
0xFC 25:u32
0xFC 26:u32
0xFC 27:u32
0xFC 28:u32
0xFC 29:u32
0xFC 30:u32
0xFC 31:u32
32
0xFC 32:u32
0xFC 33:u32
0xFC 34:u32
0xFC 35:u32
0xFC 36:u32
0xFC 37:u32
0xFC 38:u32
0xFC 39:u32
0xFC 40:u32
0xFC 41:u32
0xFC 42:u32
0xFC 43:u32
0xFC 44:u32
0xFC 45:u32
0xFC 46:u32
0xFC 47:u32
48
0xFC 48:u32f32.load_f16read from memoryMemoryProposal (Phase 1) 0xFC 49:u32f32.store_f16write to memoryMemoryProposal (Phase 1)
0xFC 50:u32
0xFC 51:u32
0xFC 52:u32
0xFC 53:u32
0xFC 54:u32
0xFC 55:u32
0xFC 56:u32
0xFC 57:u32
0xFC 58:u32
0xFC 59:u32
0xFC 60:u32
0xFC 61:u32
0xFC 62:u32
0xFC 63:u32

Table D SIMD 291 opcodesMultibyte instructions beginning with 0xFD: Vector instructions.

0xFD
+0
+1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
0
0xFD 0:u32v128.loadread from memoryVector (SIMD)Wasm 2.0 0xFD 1:u32v128.load8x8_sread from memory, signedVector (SIMD)Wasm 2.0 0xFD 2:u32v128.load8x8_uread from memory, unsignedVector (SIMD)Wasm 2.0 0xFD 3:u32v128.load16x4_sread from memory, signedVector (SIMD)Wasm 2.0 0xFD 4:u32v128.load16x4_uread from memory, unsignedVector (SIMD)Wasm 2.0 0xFD 5:u32v128.load32x2_sread from memory, signedVector (SIMD)Wasm 2.0 0xFD 6:u32v128.load32x2_uread from memory, unsignedVector (SIMD)Wasm 2.0 0xFD 7:u32v128.load8_splatread 1 byte from memoryVector (SIMD)Wasm 2.0 0xFD 8:u32v128.load16_splatread 2 bytes from memoryVector (SIMD)Wasm 2.0 0xFD 9:u32v128.load32_splatread 4 bytes from memoryVector (SIMD)Wasm 2.0 0xFD 10:u32v128.load64_splatread 8 bytes from memoryVector (SIMD)Wasm 2.0 0xFD 11:u32v128.storewrite to memoryVector (SIMD)Wasm 2.0 0xFD 12:u32v128.constVector (SIMD)Wasm 2.0 0xFD 13:u32i8x16.shufflebuild a vector from lanes of two othersVector (SIMD)Wasm 2.0 0xFD 14:u32i8x16.swizzlerearrange lanes by an index vectorVector (SIMD)Wasm 2.0 0xFD 15:u32i8x16.splatcopy one value into every laneVector (SIMD)Wasm 2.0
16
0xFD 16:u32i16x8.splatcopy one value into every laneVector (SIMD)Wasm 2.0 0xFD 17:u32i32x4.splatcopy one value into every laneVector (SIMD)Wasm 2.0 0xFD 18:u32i64x2.splatcopy one value into every laneVector (SIMD)Wasm 2.0 0xFD 19:u32f32x4.splatcopy one value into every laneVector (SIMD)Wasm 2.0 0xFD 20:u32f64x2.splatcopy one value into every laneVector (SIMD)Wasm 2.0 0xFD 21:u32i8x16.extract_lane_sVector (SIMD)Wasm 2.0 0xFD 22:u32i8x16.extract_lane_uVector (SIMD)Wasm 2.0 0xFD 23:u32i8x16.replace_laneVector (SIMD)Wasm 2.0 0xFD 24:u32i16x8.extract_lane_sVector (SIMD)Wasm 2.0 0xFD 25:u32i16x8.extract_lane_uVector (SIMD)Wasm 2.0 0xFD 26:u32i16x8.replace_laneVector (SIMD)Wasm 2.0 0xFD 27:u32i32x4.extract_laneVector (SIMD)Wasm 2.0 0xFD 28:u32i32x4.replace_laneVector (SIMD)Wasm 2.0 0xFD 29:u32i64x2.extract_laneVector (SIMD)Wasm 2.0 0xFD 30:u32i64x2.replace_laneVector (SIMD)Wasm 2.0 0xFD 31:u32f32x4.extract_laneVector (SIMD)Wasm 2.0
32
0xFD 32:u32f32x4.replace_laneVector (SIMD)Wasm 2.0 0xFD 33:u32f64x2.extract_laneVector (SIMD)Wasm 2.0 0xFD 34:u32f64x2.replace_laneVector (SIMD)Wasm 2.0 0xFD 35:u32i8x16.eqequalVector (SIMD)Wasm 2.0 0xFD 36:u32i8x16.nenot equalVector (SIMD)Wasm 2.0 0xFD 37:u32i8x16.lt_sless than, signedVector (SIMD)Wasm 2.0 0xFD 38:u32i8x16.lt_uless than, unsignedVector (SIMD)Wasm 2.0 0xFD 39:u32i8x16.gt_sgreater than, signedVector (SIMD)Wasm 2.0 0xFD 40:u32i8x16.gt_ugreater than, unsignedVector (SIMD)Wasm 2.0 0xFD 41:u32i8x16.le_sless than or equal, signedVector (SIMD)Wasm 2.0 0xFD 42:u32i8x16.le_uless than or equal, unsignedVector (SIMD)Wasm 2.0 0xFD 43:u32i8x16.ge_sgreater than or equal, signedVector (SIMD)Wasm 2.0 0xFD 44:u32i8x16.ge_ugreater than or equal, unsignedVector (SIMD)Wasm 2.0 0xFD 45:u32i16x8.eqequalVector (SIMD)Wasm 2.0 0xFD 46:u32i16x8.nenot equalVector (SIMD)Wasm 2.0 0xFD 47:u32i16x8.lt_sless than, signedVector (SIMD)Wasm 2.0
48
0xFD 48:u32i16x8.lt_uless than, unsignedVector (SIMD)Wasm 2.0 0xFD 49:u32i16x8.gt_sgreater than, signedVector (SIMD)Wasm 2.0 0xFD 50:u32i16x8.gt_ugreater than, unsignedVector (SIMD)Wasm 2.0 0xFD 51:u32i16x8.le_sless than or equal, signedVector (SIMD)Wasm 2.0 0xFD 52:u32i16x8.le_uless than or equal, unsignedVector (SIMD)Wasm 2.0 0xFD 53:u32i16x8.ge_sgreater than or equal, signedVector (SIMD)Wasm 2.0 0xFD 54:u32i16x8.ge_ugreater than or equal, unsignedVector (SIMD)Wasm 2.0 0xFD 55:u32i32x4.eqequalVector (SIMD)Wasm 2.0 0xFD 56:u32i32x4.nenot equalVector (SIMD)Wasm 2.0 0xFD 57:u32i32x4.lt_sless than, signedVector (SIMD)Wasm 2.0 0xFD 58:u32i32x4.lt_uless than, unsignedVector (SIMD)Wasm 2.0 0xFD 59:u32i32x4.gt_sgreater than, signedVector (SIMD)Wasm 2.0 0xFD 60:u32i32x4.gt_ugreater than, unsignedVector (SIMD)Wasm 2.0 0xFD 61:u32i32x4.le_sless than or equal, signedVector (SIMD)Wasm 2.0 0xFD 62:u32i32x4.le_uless than or equal, unsignedVector (SIMD)Wasm 2.0 0xFD 63:u32i32x4.ge_sgreater than or equal, signedVector (SIMD)Wasm 2.0
64
0xFD 64:u32i32x4.ge_ugreater than or equal, unsignedVector (SIMD)Wasm 2.0 0xFD 65:u32f32x4.eqequalVector (SIMD)Wasm 2.0 0xFD 66:u32f32x4.nenot equalVector (SIMD)Wasm 2.0 0xFD 67:u32f32x4.ltless thanVector (SIMD)Wasm 2.0 0xFD 68:u32f32x4.gtgreater thanVector (SIMD)Wasm 2.0 0xFD 69:u32f32x4.leless than or equalVector (SIMD)Wasm 2.0 0xFD 70:u32f32x4.gegreater than or equalVector (SIMD)Wasm 2.0 0xFD 71:u32f64x2.eqequalVector (SIMD)Wasm 2.0 0xFD 72:u32f64x2.nenot equalVector (SIMD)Wasm 2.0 0xFD 73:u32f64x2.ltless thanVector (SIMD)Wasm 2.0 0xFD 74:u32f64x2.gtgreater thanVector (SIMD)Wasm 2.0 0xFD 75:u32f64x2.leless than or equalVector (SIMD)Wasm 2.0 0xFD 76:u32f64x2.gegreater than or equalVector (SIMD)Wasm 2.0 0xFD 77:u32v128.notVector (SIMD)Wasm 2.0 0xFD 78:u32v128.andbitwise andVector (SIMD)Wasm 2.0 0xFD 79:u32v128.andnotVector (SIMD)Wasm 2.0
80
0xFD 80:u32v128.orbitwise orVector (SIMD)Wasm 2.0 0xFD 81:u32v128.xorbitwise exclusive orVector (SIMD)Wasm 2.0 0xFD 82:u32v128.bitselectpick bits from two vectors by a maskVector (SIMD)Wasm 2.0 0xFD 83:u32v128.any_trueVector (SIMD)Wasm 2.0 0xFD 84:u32v128.load8_laneread 1 byte from memoryVector (SIMD)Wasm 2.0 0xFD 85:u32v128.load16_laneread 2 bytes from memoryVector (SIMD)Wasm 2.0 0xFD 86:u32v128.load32_laneread 4 bytes from memoryVector (SIMD)Wasm 2.0 0xFD 87:u32v128.load64_laneread 8 bytes from memoryVector (SIMD)Wasm 2.0 0xFD 88:u32v128.store8_lanewrite the low 1 byte to memoryVector (SIMD)Wasm 2.0 0xFD 89:u32v128.store16_lanewrite the low 2 bytes to memoryVector (SIMD)Wasm 2.0 0xFD 90:u32v128.store32_lanewrite the low 4 bytes to memoryVector (SIMD)Wasm 2.0 0xFD 91:u32v128.store64_lanewrite the low 8 bytes to memoryVector (SIMD)Wasm 2.0 0xFD 92:u32v128.load32_zeroread 4 bytes from memoryVector (SIMD)Wasm 2.0 0xFD 93:u32v128.load64_zeroread 8 bytes from memoryVector (SIMD)Wasm 2.0 0xFD 94:u32f32x4.demote_f64x2_zeroto the narrower float typeVector (SIMD)Wasm 2.0 0xFD 95:u32f64x2.promote_low_f32x4to the wider float typeVector (SIMD)Wasm 2.0
96
0xFD 96:u32i8x16.absabsolute valueVector (SIMD)Wasm 2.0 0xFD 97:u32i8x16.negnegateVector (SIMD)Wasm 2.0 0xFD 98:u32i8x16.popcntcount one bitsVector (SIMD)Wasm 2.0 0xFD 99:u32i8x16.all_trueVector (SIMD)Wasm 2.0 0xFD 100:u32i8x16.bitmaskVector (SIMD)Wasm 2.0 0xFD 101:u32i8x16.narrow_i16x8_sVector (SIMD)Wasm 2.0 0xFD 102:u32i8x16.narrow_i16x8_uVector (SIMD)Wasm 2.0 0xFD 103:u32f32x4.ceilround up to the nearest integerVector (SIMD)Wasm 2.0 0xFD 104:u32f32x4.floorround down to the nearest integerVector (SIMD)Wasm 2.0 0xFD 105:u32f32x4.truncround toward zeroVector (SIMD)Wasm 2.0 0xFD 106:u32f32x4.nearestround to the nearest integer, ties to evenVector (SIMD)Wasm 2.0 0xFD 107:u32i8x16.shlshift leftVector (SIMD)Wasm 2.0 0xFD 108:u32i8x16.shr_sshift right, signedVector (SIMD)Wasm 2.0 0xFD 109:u32i8x16.shr_ushift right, unsignedVector (SIMD)Wasm 2.0 0xFD 110:u32i8x16.addaddVector (SIMD)Wasm 2.0 0xFD 111:u32i8x16.add_sat_sadd, signedVector (SIMD)Wasm 2.0
112
0xFD 112:u32i8x16.add_sat_uadd, unsignedVector (SIMD)Wasm 2.0 0xFD 113:u32i8x16.subsubtractVector (SIMD)Wasm 2.0 0xFD 114:u32i8x16.sub_sat_ssubtract, signedVector (SIMD)Wasm 2.0 0xFD 115:u32i8x16.sub_sat_usubtract, unsignedVector (SIMD)Wasm 2.0 0xFD 116:u32f64x2.ceilround up to the nearest integerVector (SIMD)Wasm 2.0 0xFD 117:u32f64x2.floorround down to the nearest integerVector (SIMD)Wasm 2.0 0xFD 118:u32i8x16.min_ssmaller of the two, signedVector (SIMD)Wasm 2.0 0xFD 119:u32i8x16.min_usmaller of the two, unsignedVector (SIMD)Wasm 2.0 0xFD 120:u32i8x16.max_slarger of the two, signedVector (SIMD)Wasm 2.0 0xFD 121:u32i8x16.max_ularger of the two, unsignedVector (SIMD)Wasm 2.0 0xFD 122:u32f64x2.truncround toward zeroVector (SIMD)Wasm 2.0 0xFD 123:u32i8x16.avgr_uVector (SIMD)Wasm 2.0 0xFD 124:u32i16x8.extadd_pairwise_i8x16_sVector (SIMD)Wasm 2.0 0xFD 125:u32i16x8.extadd_pairwise_i8x16_uVector (SIMD)Wasm 2.0 0xFD 126:u32i32x4.extadd_pairwise_i16x8_sVector (SIMD)Wasm 2.0 0xFD 127:u32i32x4.extadd_pairwise_i16x8_uVector (SIMD)Wasm 2.0
128
0xFD 128:u32i16x8.absabsolute valueVector (SIMD)Wasm 2.0 0xFD 129:u32i16x8.negnegateVector (SIMD)Wasm 2.0 0xFD 130:u32i16x8.q15mulr_sat_sVector (SIMD)Wasm 2.0 0xFD 131:u32i16x8.all_trueVector (SIMD)Wasm 2.0 0xFD 132:u32i16x8.bitmaskVector (SIMD)Wasm 2.0 0xFD 133:u32i16x8.narrow_i32x4_sVector (SIMD)Wasm 2.0 0xFD 134:u32i16x8.narrow_i32x4_uVector (SIMD)Wasm 2.0 0xFD 135:u32i16x8.extend_low_i8x16_swiden, keeping the value, signedVector (SIMD)Wasm 2.0 0xFD 136:u32i16x8.extend_high_i8x16_swiden, keeping the value, signedVector (SIMD)Wasm 2.0 0xFD 137:u32i16x8.extend_low_i8x16_uwiden, keeping the value, unsignedVector (SIMD)Wasm 2.0 0xFD 138:u32i16x8.extend_high_i8x16_uwiden, keeping the value, unsignedVector (SIMD)Wasm 2.0 0xFD 139:u32i16x8.shlshift leftVector (SIMD)Wasm 2.0 0xFD 140:u32i16x8.shr_sshift right, signedVector (SIMD)Wasm 2.0 0xFD 141:u32i16x8.shr_ushift right, unsignedVector (SIMD)Wasm 2.0 0xFD 142:u32i16x8.addaddVector (SIMD)Wasm 2.0 0xFD 143:u32i16x8.add_sat_sadd, signedVector (SIMD)Wasm 2.0
144
0xFD 144:u32i16x8.add_sat_uadd, unsignedVector (SIMD)Wasm 2.0 0xFD 145:u32i16x8.subsubtractVector (SIMD)Wasm 2.0 0xFD 146:u32i16x8.sub_sat_ssubtract, signedVector (SIMD)Wasm 2.0 0xFD 147:u32i16x8.sub_sat_usubtract, unsignedVector (SIMD)Wasm 2.0 0xFD 148:u32f64x2.nearestround to the nearest integer, ties to evenVector (SIMD)Wasm 2.0 0xFD 149:u32i16x8.mulmultiplyVector (SIMD)Wasm 2.0 0xFD 150:u32i16x8.min_ssmaller of the two, signedVector (SIMD)Wasm 2.0 0xFD 151:u32i16x8.min_usmaller of the two, unsignedVector (SIMD)Wasm 2.0 0xFD 152:u32i16x8.max_slarger of the two, signedVector (SIMD)Wasm 2.0 0xFD 153:u32i16x8.max_ularger of the two, unsignedVector (SIMD)Wasm 2.0
0xFD 154:u32
0xFD 155:u32i16x8.avgr_uVector (SIMD)Wasm 2.0 0xFD 156:u32i16x8.extmul_low_i8x16_sVector (SIMD)Wasm 2.0 0xFD 157:u32i16x8.extmul_high_i8x16_sVector (SIMD)Wasm 2.0 0xFD 158:u32i16x8.extmul_low_i8x16_uVector (SIMD)Wasm 2.0 0xFD 159:u32i16x8.extmul_high_i8x16_uVector (SIMD)Wasm 2.0
160
0xFD 160:u32i32x4.absabsolute valueVector (SIMD)Wasm 2.0 0xFD 161:u32i32x4.negnegateVector (SIMD)Wasm 2.0 0xFD 162:u32i8x16.relaxed_swizzleVector (SIMD)Withdrawn 0xFD 163:u32i32x4.all_trueVector (SIMD)Wasm 2.0 0xFD 164:u32i32x4.bitmaskVector (SIMD)Wasm 2.0 0xFD 165:u32i32x4.relaxed_trunc_f32x4_sVector (SIMD)Withdrawn 0xFD 166:u32i32x4.relaxed_trunc_f32x4_uVector (SIMD)Withdrawn 0xFD 167:u32i32x4.extend_low_i16x8_swiden, keeping the value, signedVector (SIMD)Wasm 2.0 0xFD 168:u32i32x4.extend_high_i16x8_swiden, keeping the value, signedVector (SIMD)Wasm 2.0 0xFD 169:u32i32x4.extend_low_i16x8_uwiden, keeping the value, unsignedVector (SIMD)Wasm 2.0 0xFD 170:u32i32x4.extend_high_i16x8_uwiden, keeping the value, unsignedVector (SIMD)Wasm 2.0 0xFD 171:u32i32x4.shlshift leftVector (SIMD)Wasm 2.0 0xFD 172:u32i32x4.shr_sshift right, signedVector (SIMD)Wasm 2.0 0xFD 173:u32i32x4.shr_ushift right, unsignedVector (SIMD)Wasm 2.0 0xFD 174:u32i32x4.addaddVector (SIMD)Wasm 2.0 0xFD 175:u32f32x4.relaxed_maddVector (SIMD)Withdrawn
176
0xFD 176:u32f32x4.relaxed_nmaddVector (SIMD)Withdrawn 0xFD 177:u32i32x4.subsubtractVector (SIMD)Wasm 2.0 0xFD 178:u32i8x16.relaxed_laneselectVector (SIMD)Withdrawn 0xFD 179:u32i16x8.relaxed_laneselectVector (SIMD)Withdrawn 0xFD 180:u32f32x4.relaxed_minVector (SIMD)Withdrawn 0xFD 181:u32i32x4.mulmultiplyVector (SIMD)Wasm 2.0 0xFD 182:u32i32x4.min_ssmaller of the two, signedVector (SIMD)Wasm 2.0 0xFD 183:u32i32x4.min_usmaller of the two, unsignedVector (SIMD)Wasm 2.0 0xFD 184:u32i32x4.max_slarger of the two, signedVector (SIMD)Wasm 2.0 0xFD 185:u32i32x4.max_ularger of the two, unsignedVector (SIMD)Wasm 2.0 0xFD 186:u32i32x4.dot_i16x8_sVector (SIMD)Wasm 2.0
0xFD 187:u32
0xFD 188:u32i32x4.extmul_low_i16x8_sVector (SIMD)Wasm 2.0 0xFD 189:u32i32x4.extmul_high_i16x8_sVector (SIMD)Wasm 2.0 0xFD 190:u32i32x4.extmul_low_i16x8_uVector (SIMD)Wasm 2.0 0xFD 191:u32i32x4.extmul_high_i16x8_uVector (SIMD)Wasm 2.0
192
0xFD 192:u32i64x2.absabsolute valueVector (SIMD)Wasm 2.0 0xFD 193:u32i64x2.negnegateVector (SIMD)Wasm 2.0
0xFD 194:u32
0xFD 195:u32i64x2.all_trueVector (SIMD)Wasm 2.0 0xFD 196:u32i64x2.bitmaskVector (SIMD)Wasm 2.0 0xFD 197:u32i32x4.relaxed_trunc_f64x2_s_zeroVector (SIMD)Withdrawn 0xFD 198:u32i32x4.relaxed_trunc_f64x2_u_zeroVector (SIMD)Withdrawn 0xFD 199:u32i64x2.extend_low_i32x4_swiden, keeping the value, signedVector (SIMD)Wasm 2.0 0xFD 200:u32i64x2.extend_high_i32x4_swiden, keeping the value, signedVector (SIMD)Wasm 2.0 0xFD 201:u32i64x2.extend_low_i32x4_uwiden, keeping the value, unsignedVector (SIMD)Wasm 2.0 0xFD 202:u32i64x2.extend_high_i32x4_uwiden, keeping the value, unsignedVector (SIMD)Wasm 2.0 0xFD 203:u32i64x2.shlshift leftVector (SIMD)Wasm 2.0 0xFD 204:u32i64x2.shr_sshift right, signedVector (SIMD)Wasm 2.0 0xFD 205:u32i64x2.shr_ushift right, unsignedVector (SIMD)Wasm 2.0 0xFD 206:u32i64x2.addaddVector (SIMD)Wasm 2.0 0xFD 207:u32f64x2.relaxed_maddVector (SIMD)Withdrawn
208
0xFD 208:u32f64x2.relaxed_nmaddVector (SIMD)Withdrawn 0xFD 209:u32i64x2.subsubtractVector (SIMD)Wasm 2.0 0xFD 210:u32i32x4.relaxed_laneselectVector (SIMD)Withdrawn 0xFD 211:u32i64x2.relaxed_laneselectVector (SIMD)Withdrawn 0xFD 212:u32f64x2.relaxed_minVector (SIMD)Withdrawn 0xFD 213:u32i64x2.mulmultiplyVector (SIMD)Wasm 2.0 0xFD 214:u32i64x2.eqequalVector (SIMD)Wasm 2.0 0xFD 215:u32i64x2.nenot equalVector (SIMD)Wasm 2.0 0xFD 216:u32i64x2.lt_sless than, signedVector (SIMD)Wasm 2.0 0xFD 217:u32i64x2.gt_sgreater than, signedVector (SIMD)Wasm 2.0 0xFD 218:u32i64x2.le_sless than or equal, signedVector (SIMD)Wasm 2.0 0xFD 219:u32i64x2.ge_sgreater than or equal, signedVector (SIMD)Wasm 2.0 0xFD 220:u32i64x2.extmul_low_i32x4_sVector (SIMD)Wasm 2.0 0xFD 221:u32i64x2.extmul_high_i32x4_sVector (SIMD)Wasm 2.0 0xFD 222:u32i64x2.extmul_low_i32x4_uVector (SIMD)Wasm 2.0 0xFD 223:u32i64x2.extmul_high_i32x4_uVector (SIMD)Wasm 2.0
224
0xFD 224:u32f32x4.absabsolute valueVector (SIMD)Wasm 2.0 0xFD 225:u32f32x4.negnegateVector (SIMD)Wasm 2.0 0xFD 226:u32f32x4.relaxed_maxVector (SIMD)Withdrawn 0xFD 227:u32f32x4.sqrtsquare rootVector (SIMD)Wasm 2.0 0xFD 228:u32f32x4.addaddVector (SIMD)Wasm 2.0 0xFD 229:u32f32x4.subsubtractVector (SIMD)Wasm 2.0 0xFD 230:u32f32x4.mulmultiplyVector (SIMD)Wasm 2.0 0xFD 231:u32f32x4.divdivideVector (SIMD)Wasm 2.0 0xFD 232:u32f32x4.minsmaller of the twoVector (SIMD)Wasm 2.0 0xFD 233:u32f32x4.maxlarger of the twoVector (SIMD)Wasm 2.0 0xFD 234:u32f32x4.pminVector (SIMD)Wasm 2.0 0xFD 235:u32f32x4.pmaxVector (SIMD)Wasm 2.0 0xFD 236:u32f64x2.absabsolute valueVector (SIMD)Wasm 2.0 0xFD 237:u32f64x2.negnegateVector (SIMD)Wasm 2.0 0xFD 238:u32f64x2.relaxed_maxVector (SIMD)Withdrawn 0xFD 239:u32f64x2.sqrtsquare rootVector (SIMD)Wasm 2.0
240
0xFD 240:u32f64x2.addaddVector (SIMD)Wasm 2.0 0xFD 241:u32f64x2.subsubtractVector (SIMD)Wasm 2.0 0xFD 242:u32f64x2.mulmultiplyVector (SIMD)Wasm 2.0 0xFD 243:u32f64x2.divdivideVector (SIMD)Wasm 2.0 0xFD 244:u32f64x2.minsmaller of the twoVector (SIMD)Wasm 2.0 0xFD 245:u32f64x2.maxlarger of the twoVector (SIMD)Wasm 2.0 0xFD 246:u32f64x2.pminVector (SIMD)Wasm 2.0 0xFD 247:u32f64x2.pmaxVector (SIMD)Wasm 2.0 0xFD 248:u32i32x4.trunc_sat_f32x4_sfloat to integer, clamped to the range, signedVector (SIMD)Wasm 2.0 0xFD 249:u32i32x4.trunc_sat_f32x4_ufloat to integer, clamped to the range, unsignedVector (SIMD)Wasm 2.0 0xFD 250:u32f32x4.convert_i32x4_sinteger to floating point, signedVector (SIMD)Wasm 2.0 0xFD 251:u32f32x4.convert_i32x4_uinteger to floating point, unsignedVector (SIMD)Wasm 2.0 0xFD 252:u32i32x4.trunc_sat_f64x2_s_zerofloat to integer, clamped to the range, signedVector (SIMD)Wasm 2.0 0xFD 253:u32i32x4.trunc_sat_f64x2_u_zerofloat to integer, clamped to the range, unsignedVector (SIMD)Wasm 2.0 0xFD 254:u32f64x2.convert_low_i32x4_sinteger to floating point, signedVector (SIMD)Wasm 2.0 0xFD 255:u32f64x2.convert_low_i32x4_uinteger to floating point, unsignedVector (SIMD)Wasm 2.0
256
0xFD 256:u32i8x16.relaxed_swizzleVector (SIMD)Wasm 3.0 0xFD 257:u32i32x4.relaxed_trunc_f32x4_sVector (SIMD)Wasm 3.0 0xFD 258:u32i32x4.relaxed_trunc_f32x4_uVector (SIMD)Wasm 3.0 0xFD 259:u32i32x4.relaxed_trunc_f64x2_s_zeroVector (SIMD)Wasm 3.0 0xFD 260:u32i32x4.relaxed_trunc_f64x2_u_zeroVector (SIMD)Wasm 3.0 0xFD 261:u32f32x4.relaxed_maddVector (SIMD)Wasm 3.0 0xFD 262:u32f32x4.relaxed_nmaddVector (SIMD)Wasm 3.0 0xFD 263:u32f64x2.relaxed_maddVector (SIMD)Wasm 3.0 0xFD 264:u32f64x2.relaxed_nmaddVector (SIMD)Wasm 3.0 0xFD 265:u32i8x16.relaxed_laneselectVector (SIMD)Wasm 3.0 0xFD 266:u32i16x8.relaxed_laneselectVector (SIMD)Wasm 3.0 0xFD 267:u32i32x4.relaxed_laneselectVector (SIMD)Wasm 3.0 0xFD 268:u32i64x2.relaxed_laneselectVector (SIMD)Wasm 3.0 0xFD 269:u32f32x4.relaxed_minVector (SIMD)Wasm 3.0 0xFD 270:u32f32x4.relaxed_maxVector (SIMD)Wasm 3.0 0xFD 271:u32f64x2.relaxed_minVector (SIMD)Wasm 3.0
272
0xFD 272:u32f64x2.relaxed_maxVector (SIMD)Wasm 3.0 0xFD 273:u32i16x8.relaxed_q15mulr_sVector (SIMD)Wasm 3.0 0xFD 274:u32i16x8.relaxed_dot_i8x16_i7x16_sVector (SIMD)Wasm 3.0 0xFD 275:u32i32x4.relaxed_dot_i8x16_i7x16_add_sVector (SIMD)Wasm 3.0
0xFD 276:u32
0xFD 277:u32
0xFD 278:u32
0xFD 279:u32
0xFD 280:u32
0xFD 281:u32
0xFD 282:u32
0xFD 283:u32
0xFD 284:u32
0xFD 285:u32
0xFD 286:u32
0xFD 287:u32
288
0xFD 288:u32f16x8.splatcopy one value into every laneVector (SIMD)Proposal (Phase 1) 0xFD 289:u32f16x8.extract_laneVector (SIMD)Proposal (Phase 1) 0xFD 290:u32f16x8.replace_laneVector (SIMD)Proposal (Phase 1)
0xFD 291:u32
0xFD 292:u32
0xFD 293:u32
0xFD 294:u32
0xFD 295:u32
0xFD 296:u32
0xFD 297:u32
0xFD 298:u32
0xFD 299:u32
0xFD 300:u32
0xFD 301:u32
0xFD 302:u32
0xFD 303:u32
304
0xFD 304:u32f16x8.absabsolute valueVector (SIMD)Proposal (Phase 1) 0xFD 305:u32f16x8.negnegateVector (SIMD)Proposal (Phase 1) 0xFD 306:u32f16x8.sqrtsquare rootVector (SIMD)Proposal (Phase 1) 0xFD 307:u32f16x8.ceilround up to the nearest integerVector (SIMD)Proposal (Phase 1) 0xFD 308:u32f16x8.floorround down to the nearest integerVector (SIMD)Proposal (Phase 1) 0xFD 309:u32f16x8.truncround toward zeroVector (SIMD)Proposal (Phase 1) 0xFD 310:u32f16x8.nearestround to the nearest integer, ties to evenVector (SIMD)Proposal (Phase 1) 0xFD 311:u32f16x8.eqequalVector (SIMD)Proposal (Phase 1) 0xFD 312:u32f16x8.nenot equalVector (SIMD)Proposal (Phase 1) 0xFD 313:u32f16x8.ltless thanVector (SIMD)Proposal (Phase 1) 0xFD 314:u32f16x8.gtgreater thanVector (SIMD)Proposal (Phase 1) 0xFD 315:u32f16x8.leless than or equalVector (SIMD)Proposal (Phase 1) 0xFD 316:u32f16x8.gegreater than or equalVector (SIMD)Proposal (Phase 1) 0xFD 317:u32f16x8.addaddVector (SIMD)Proposal (Phase 1) 0xFD 318:u32f16x8.subsubtractVector (SIMD)Proposal (Phase 1) 0xFD 319:u32f16x8.mulmultiplyVector (SIMD)Proposal (Phase 1)
320
0xFD 320:u32f16x8.divdivideVector (SIMD)Proposal (Phase 1) 0xFD 321:u32f16x8.minsmaller of the twoVector (SIMD)Proposal (Phase 1) 0xFD 322:u32f16x8.maxlarger of the twoVector (SIMD)Proposal (Phase 1) 0xFD 323:u32f16x8.pminVector (SIMD)Proposal (Phase 1) 0xFD 324:u32f16x8.pmaxVector (SIMD)Proposal (Phase 1) 0xFD 325:u32i16x8.trunc_sat_f16x8_sfloat to integer, clamped to the range, signedVector (SIMD)Proposal (Phase 1) 0xFD 326:u32i16x8.trunc_sat_f16x8_ufloat to integer, clamped to the range, unsignedVector (SIMD)Proposal (Phase 1) 0xFD 327:u32f16x8.convert_i16x8_sinteger to floating point, signedVector (SIMD)Proposal (Phase 1) 0xFD 328:u32f16x8.convert_i16x8_uinteger to floating point, unsignedVector (SIMD)Proposal (Phase 1) 0xFD 329:u32f16x8.demote_f32x4_zeroto the narrower float typeVector (SIMD)Proposal (Phase 1) 0xFD 330:u32f16x8.demote_f64x2_zeroto the narrower float typeVector (SIMD)Proposal (Phase 1) 0xFD 331:u32f32x4.promote_f16x8_lowto the wider float typeVector (SIMD)Proposal (Phase 1) 0xFD 332:u32i16x8.trunc_f16x8_sfloat to integer, trapping out of range, signedVector (SIMD)Proposal (Phase 1) 0xFD 333:u32i16x8.trunc_f16x8_ufloat to integer, trapping out of range, unsignedVector (SIMD)Proposal (Phase 1) 0xFD 334:u32f16x8.maddVector (SIMD)Proposal (Phase 1) 0xFD 335:u32f16x8.nmaddVector (SIMD)Proposal (Phase 1)

Table E Threads & Atomics 103 opcodesMultibyte instructions beginning with 0xFE.

0xFE
+0
+1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
0
0xFE 0:u32memory.atomic.notifyAtomicProposal (Phase 4) 0xFE 1:u32memory.atomic.wait32AtomicProposal (Phase 4) 0xFE 2:u32memory.atomic.wait64AtomicProposal (Phase 4) 0xFE 3:u32atomic.fenceAtomicProposal (Phase 4) 0xFE 4:u32pauseAtomicProposal (Phase 2)
0xFE 5:u32
0xFE 6:u32
0xFE 7:u32
0xFE 8:u32
0xFE 9:u32
0xFE 10:u32
0xFE 11:u32
0xFE 12:u32
0xFE 13:u32
0xFE 14:u32
0xFE 15:u32
16
0xFE 16:u32i32.atomic.loadread from memoryAtomicProposal (Phase 4) 0xFE 17:u32i64.atomic.loadread from memoryAtomicProposal (Phase 4) 0xFE 18:u32i32.atomic.load8_uread 1 byte from memory, zero-extendedAtomicProposal (Phase 4) 0xFE 19:u32i32.atomic.load16_uread 2 bytes from memory, zero-extendedAtomicProposal (Phase 4) 0xFE 20:u32i64.atomic.load8_uread 1 byte from memory, zero-extendedAtomicProposal (Phase 4) 0xFE 21:u32i64.atomic.load16_uread 2 bytes from memory, zero-extendedAtomicProposal (Phase 4) 0xFE 22:u32i64.atomic.load32_uread 4 bytes from memory, zero-extendedAtomicProposal (Phase 4) 0xFE 23:u32i32.atomic.storewrite to memoryAtomicProposal (Phase 4) 0xFE 24:u32i64.atomic.storewrite to memoryAtomicProposal (Phase 4) 0xFE 25:u32i32.atomic.store8write the low 1 byte to memoryAtomicProposal (Phase 4) 0xFE 26:u32i32.atomic.store16write the low 2 bytes to memoryAtomicProposal (Phase 4) 0xFE 27:u32i64.atomic.store8write the low 1 byte to memoryAtomicProposal (Phase 4) 0xFE 28:u32i64.atomic.store16write the low 2 bytes to memoryAtomicProposal (Phase 4) 0xFE 29:u32i64.atomic.store32write the low 4 bytes to memoryAtomicProposal (Phase 4) 0xFE 30:u32i32.atomic.rmw.addaddAtomicProposal (Phase 4) 0xFE 31:u32i64.atomic.rmw.addaddAtomicProposal (Phase 4)
32
0xFE 32:u32i32.atomic.rmw8.add_uadd, unsignedAtomicProposal (Phase 4) 0xFE 33:u32i32.atomic.rmw16.add_uadd, unsignedAtomicProposal (Phase 4) 0xFE 34:u32i64.atomic.rmw8.add_uadd, unsignedAtomicProposal (Phase 4) 0xFE 35:u32i64.atomic.rmw16.add_uadd, unsignedAtomicProposal (Phase 4) 0xFE 36:u32i64.atomic.rmw32.add_uadd, unsignedAtomicProposal (Phase 4) 0xFE 37:u32i32.atomic.rmw.subsubtractAtomicProposal (Phase 4) 0xFE 38:u32i64.atomic.rmw.subsubtractAtomicProposal (Phase 4) 0xFE 39:u32i32.atomic.rmw8.sub_usubtract, unsignedAtomicProposal (Phase 4) 0xFE 40:u32i32.atomic.rmw16.sub_usubtract, unsignedAtomicProposal (Phase 4) 0xFE 41:u32i64.atomic.rmw8.sub_usubtract, unsignedAtomicProposal (Phase 4) 0xFE 42:u32i64.atomic.rmw16.sub_usubtract, unsignedAtomicProposal (Phase 4) 0xFE 43:u32i64.atomic.rmw32.sub_usubtract, unsignedAtomicProposal (Phase 4) 0xFE 44:u32i32.atomic.rmw.andbitwise andAtomicProposal (Phase 4) 0xFE 45:u32i64.atomic.rmw.andbitwise andAtomicProposal (Phase 4) 0xFE 46:u32i32.atomic.rmw8.and_ubitwise and, unsignedAtomicProposal (Phase 4) 0xFE 47:u32i32.atomic.rmw16.and_ubitwise and, unsignedAtomicProposal (Phase 4)
48
0xFE 48:u32i64.atomic.rmw8.and_ubitwise and, unsignedAtomicProposal (Phase 4) 0xFE 49:u32i64.atomic.rmw16.and_ubitwise and, unsignedAtomicProposal (Phase 4) 0xFE 50:u32i64.atomic.rmw32.and_ubitwise and, unsignedAtomicProposal (Phase 4) 0xFE 51:u32i32.atomic.rmw.orbitwise orAtomicProposal (Phase 4) 0xFE 52:u32i64.atomic.rmw.orbitwise orAtomicProposal (Phase 4) 0xFE 53:u32i32.atomic.rmw8.or_ubitwise or, unsignedAtomicProposal (Phase 4) 0xFE 54:u32i32.atomic.rmw16.or_ubitwise or, unsignedAtomicProposal (Phase 4) 0xFE 55:u32i64.atomic.rmw8.or_ubitwise or, unsignedAtomicProposal (Phase 4) 0xFE 56:u32i64.atomic.rmw16.or_ubitwise or, unsignedAtomicProposal (Phase 4) 0xFE 57:u32i64.atomic.rmw32.or_ubitwise or, unsignedAtomicProposal (Phase 4) 0xFE 58:u32i32.atomic.rmw.xorbitwise exclusive orAtomicProposal (Phase 4) 0xFE 59:u32i64.atomic.rmw.xorbitwise exclusive orAtomicProposal (Phase 4) 0xFE 60:u32i32.atomic.rmw8.xor_ubitwise exclusive or, unsignedAtomicProposal (Phase 4) 0xFE 61:u32i32.atomic.rmw16.xor_ubitwise exclusive or, unsignedAtomicProposal (Phase 4) 0xFE 62:u32i64.atomic.rmw8.xor_ubitwise exclusive or, unsignedAtomicProposal (Phase 4) 0xFE 63:u32i64.atomic.rmw16.xor_ubitwise exclusive or, unsignedAtomicProposal (Phase 4)
64
0xFE 64:u32i64.atomic.rmw32.xor_ubitwise exclusive or, unsignedAtomicProposal (Phase 4) 0xFE 65:u32i32.atomic.rmw.xchgAtomicProposal (Phase 4) 0xFE 66:u32i64.atomic.rmw.xchgAtomicProposal (Phase 4) 0xFE 67:u32i32.atomic.rmw8.xchg_uAtomicProposal (Phase 4) 0xFE 68:u32i32.atomic.rmw16.xchg_uAtomicProposal (Phase 4) 0xFE 69:u32i64.atomic.rmw8.xchg_uAtomicProposal (Phase 4) 0xFE 70:u32i64.atomic.rmw16.xchg_uAtomicProposal (Phase 4) 0xFE 71:u32i64.atomic.rmw32.xchg_uAtomicProposal (Phase 4) 0xFE 72:u32i32.atomic.rmw.cmpxchgAtomicProposal (Phase 4) 0xFE 73:u32i64.atomic.rmw.cmpxchgAtomicProposal (Phase 4) 0xFE 74:u32i32.atomic.rmw8.cmpxchg_uAtomicProposal (Phase 4) 0xFE 75:u32i32.atomic.rmw16.cmpxchg_uAtomicProposal (Phase 4) 0xFE 76:u32i64.atomic.rmw8.cmpxchg_uAtomicProposal (Phase 4) 0xFE 77:u32i64.atomic.rmw16.cmpxchg_uAtomicProposal (Phase 4) 0xFE 78:u32i64.atomic.rmw32.cmpxchg_uAtomicProposal (Phase 4) 0xFE 79:u32global.atomic.getAtomicProposal (Phase 1)
80
0xFE 80:u32global.atomic.setAtomicProposal (Phase 1) 0xFE 81:u32global.atomic.rmw.addaddAtomicProposal (Phase 1) 0xFE 82:u32global.atomic.rmw.subsubtractAtomicProposal (Phase 1) 0xFE 83:u32global.atomic.rmw.andbitwise andAtomicProposal (Phase 1) 0xFE 84:u32global.atomic.rmw.orbitwise orAtomicProposal (Phase 1) 0xFE 85:u32global.atomic.rmw.xorbitwise exclusive orAtomicProposal (Phase 1) 0xFE 86:u32global.atomic.rmw.xchgAtomicProposal (Phase 1) 0xFE 87:u32global.atomic.rmw.cmpxchgAtomicProposal (Phase 1) 0xFE 88:u32table.atomic.getAtomicProposal (Phase 1) 0xFE 89:u32table.atomic.setAtomicProposal (Phase 1) 0xFE 90:u32table.atomic.rmw.xchgAtomicProposal (Phase 1) 0xFE 91:u32table.atomic.rmw.cmpxchgAtomicProposal (Phase 1) 0xFE 92:u32struct.atomic.getAtomicProposal (Phase 1) 0xFE 93:u32struct.atomic.get_sAtomicProposal (Phase 1) 0xFE 94:u32struct.atomic.get_uAtomicProposal (Phase 1) 0xFE 95:u32struct.atomic.setAtomicProposal (Phase 1)
96
0xFE 96:u32struct.atomic.rmw.addaddAtomicProposal (Phase 1) 0xFE 97:u32struct.atomic.rmw.subsubtractAtomicProposal (Phase 1) 0xFE 98:u32struct.atomic.rmw.andbitwise andAtomicProposal (Phase 1) 0xFE 99:u32struct.atomic.rmw.orbitwise orAtomicProposal (Phase 1) 0xFE 100:u32struct.atomic.rmw.xorbitwise exclusive orAtomicProposal (Phase 1) 0xFE 101:u32struct.atomic.rmw.xchgAtomicProposal (Phase 1) 0xFE 102:u32struct.atomic.rmw.cmpxchgAtomicProposal (Phase 1) 0xFE 103:u32array.atomic.getAtomicProposal (Phase 1) 0xFE 104:u32array.atomic.get_sAtomicProposal (Phase 1) 0xFE 105:u32array.atomic.get_uAtomicProposal (Phase 1) 0xFE 106:u32array.atomic.setAtomicProposal (Phase 1) 0xFE 107:u32array.atomic.rmw.addaddAtomicProposal (Phase 1) 0xFE 108:u32array.atomic.rmw.subsubtractAtomicProposal (Phase 1) 0xFE 109:u32array.atomic.rmw.andbitwise andAtomicProposal (Phase 1) 0xFE 110:u32array.atomic.rmw.orbitwise orAtomicProposal (Phase 1) 0xFE 111:u32array.atomic.rmw.xorbitwise exclusive orAtomicProposal (Phase 1)
112
0xFE 112:u32array.atomic.rmw.xchgAtomicProposal (Phase 1) 0xFE 113:u32array.atomic.rmw.cmpxchgAtomicProposal (Phase 1)
0xFE 114:u32
0xFE 115:u32
0xFE 116:u32
0xFE 117:u32
0xFE 118:u32
0xFE 119:u32
0xFE 120:u32
0xFE 121:u32
0xFE 122:u32
0xFE 123:u32
0xFE 124:u32
0xFE 125:u32
0xFE 126:u32
0xFE 127:u32

Instruction reference

0x00unreachable

trap immediately

Description

The unreachable instruction causes an unconditional trap.

A trap immediately aborts execution. Traps cannot be handled by WebAssembly code, but are reported to the outside environment, where they typically can be caught.

The instructions after it are still validated, but against an unconstrained operand stack, so sequences that would not otherwise type-check are accepted there.

Stack

[t1*] → [t2*]

Stack-polymorphic: execution jumps away and never continues past this instruction, so the validator accepts whatever is left on the stack.

Status

WebAssembly 1.0Standardised in WebAssembly 1.0 (2017)Part of the original WebAssembly release. Supported everywhere WebAssembly is.

Properties

0x01nop

do nothing

Description

The nop instruction does nothing.

Stack

[] → []

Status

WebAssembly 1.0Standardised in WebAssembly 1.0 (2017)Part of the original WebAssembly release. Supported everywhere WebAssembly is.

Properties

0x02block bt

Description

The beginning of a block construct, a sequence of instructions with a label at the end.

Both the parameter and result types come from the bt immediate.

The block, loop and if instructions are structured instructions. They bracket nested sequences of instructions, called blocks, terminated with, or separated by, end or else pseudo-instructions. They must be well-nested.

Stack

[t1*] → [t2*]

Immediate operands

  1. s33 bt : blocktype — 0x40 for no result; one valtype byte (0x7F i32, 0x7E i64, 0x7D f32, 0x7C f64, 0x7B v128, or a reference type) for one result; or a typeidx of 0 or more, naming a function type, for a block that takes or returns more than one value

Then the block’s instructions, then 0x0B (end).

Status

WebAssembly 1.0Standardised in WebAssembly 1.0 (2017)Part of the original WebAssembly release. Supported everywhere WebAssembly is.

Properties

0x03loop bt

Description

A block with a label at the beginning which may be used to form loops.

Stack

[t1*] → [t2*]

Both the parameter and result types come from the bt immediate.

Immediate operands

  1. s33 bt : blocktype — 0x40 for no result; one valtype byte (0x7F i32, 0x7E i64, 0x7D f32, 0x7C f64, 0x7B v128, or a reference type) for one result; or a typeidx of 0 or more, naming a function type, for a block that takes or returns more than one value

Then the block’s instructions, then 0x0B (end).

Status

WebAssembly 1.0Standardised in WebAssembly 1.0 (2017)Part of the original WebAssembly release. Supported everywhere WebAssembly is.

Properties

0x04if bt

Description

The beginning of an if construct with an implicit then block.

Stack

[t1* i32] → [t2*]

Both the parameter and result types come from the bt immediate.

The i32 on top is the condition: non-zero runs the first branch, zero runs the else-branch if there is one.

Immediate operands

  1. s33 bt : blocktype — 0x40 for no result; one valtype byte (0x7F i32, 0x7E i64, 0x7D f32, 0x7C f64, 0x7B v128, or a reference type) for one result; or a typeidx of 0 or more, naming a function type, for a block that takes or returns more than one value

Then the instructions run when the condition is non-zero. Optionally 0x05 (else) and the instructions run when it is zero. Then 0x0B (end).

Status

WebAssembly 1.0Standardised in WebAssembly 1.0 (2017)Part of the original WebAssembly release. Supported everywhere WebAssembly is.

Properties

0x05else

Description

Marks the else block of an if.

Not typed on its own: what it does to the stack belongs to the enclosing if.

Status

WebAssembly 1.0Standardised in WebAssembly 1.0 (2017)Part of the original WebAssembly release. Supported everywhere WebAssembly is.

Properties

0x06try bt

Description

Begins a block which can handle thrown exceptions.

Stack

[t1*] → [t2*]

Both the parameter and result types come from the bt immediate.

Immediate operands

  1. s33 bt : blocktype — 0x40 for no result; one valtype byte (0x7F i32, 0x7E i64, 0x7D f32, 0x7C f64, 0x7B v128, or a reference type) for one result; or a typeidx of 0 or more, naming a function type, for a block that takes or returns more than one value

Then the instructions. Then zero or more 0x07 (catch) clauses, optionally ending with 0x19 (catch_all), or a single 0x18 (delegate). Then 0x0B (end).

Status

Legacy exception handling

Legacy (2023)Replaced by try_table (0x1F) and throw_ref (0x0A)

The exception handling design that preceded try_table. Engines still accept it and older toolchains still emit it, but new code should use the standardised form.Engine support

Properties

0x07catch x

Description

Begins the catch block of the try block.

Not typed on its own: what it does to the stack belongs to the enclosing try.

Immediate operands

  1. u32 x : tagidx

Status

Legacy exception handling

Legacy (2023)Replaced by try_table (0x1F) and throw_ref (0x0A)

The exception handling design that preceded try_table. Engines still accept it and older toolchains still emit it, but new code should use the standardised form.Engine support

Properties

0x08throw x

Description

Creates an exception defined by the tag and then throws it.

Stack

[t1* t*] → [t2*]

Stack-polymorphic: execution jumps away and never continues past this instruction, so the validator accepts whatever is left on the stack.

t* are the parameters of tag x.

Immediate operands

  1. u32 x : tagidx

Status

Exception handlingStandardised in WebAssembly 3.0 (2025)Standardised. This is the try_table form; the earlier try/catch encoding is still emitted by older toolchains.Engine support

Properties

0x09rethrow l

Description

Pops the exnref on top of the stack and throws it.

Stack

[t1* i32] → [t2*]

Stack-polymorphic: execution jumps away and never continues past this instruction, so the validator accepts whatever is left on the stack.

Immediate operands

  1. u32 l : labelidx

Status

Legacy exception handling

Legacy (2023)Replaced by try_table (0x1F) and throw_ref (0x0A)

The exception handling design that preceded try_table. Engines still accept it and older toolchains still emit it, but new code should use the standardised form.Engine support

Properties

0x0Athrow_ref

Description

Pops the exnref on top of the stack and throws it.

Stack

[t1* exnref] → [t2*]

Stack-polymorphic: execution jumps away and never continues past this instruction, so the validator accepts whatever is left on the stack.

Traps on a null exception reference.

Status

Exception handlingStandardised in WebAssembly 3.0 (2025)Standardised. This is the try_table form; the earlier try/catch encoding is still emitted by older toolchains.Engine support

Properties

0x0Bend

Description

Marks the end of a block, loop, if, or function.

Not typed on its own: what it does to the stack belongs to the construct it closes.

Status

WebAssembly 1.0Standardised in WebAssembly 1.0 (2017)Part of the original WebAssembly release. Supported everywhere WebAssembly is.

Properties

0x0Cbr l

branch to a label

Description

Branch to a given label in an enclosing construct.

Performs an unconditional branch.

A branch targeting a block or if behaves like a break statement in most C-like languages, while a branch targeting a loop behaves like a continue statement.

Stack

[t1* t*] → [t2*]

Stack-polymorphic: execution jumps away and never continues past this instruction, so the validator accepts whatever is left on the stack.

Immediate operands

  1. u32 l : labelidx

Label 0 is the innermost structured instruction enclosing the branch; increasing indices refer to those further out.

Status

WebAssembly 1.0Standardised in WebAssembly 1.0 (2017)Part of the original WebAssembly release. Supported everywhere WebAssembly is.

Properties

0x0Dbr_if l

Description

Performs a conditional branch, branching if i32 c is non-zero.

Conditionally branch to a given label in an enclosing construct.

Stack

[t* i32] → [t*]

Immediate operands

  1. u32 l : labelidx

Status

WebAssembly 1.0Standardised in WebAssembly 1.0 (2017)Part of the original WebAssembly release. Supported everywhere WebAssembly is.

Properties

0x0Ebr_table l* l

Description

A jump table which jumps to a label in an enclosing construct.

Performs an indirect branch through an operand indexing into the label vector that is an immediate to the instruction, or to a default target if the operand is out of bounds.

Stack

[t1* t* i32] → [t2*]

Stack-polymorphic: execution jumps away and never continues past this instruction, so the validator accepts whatever is left on the stack.

Immediate operands

  1. u32 l* : list(labelidx) — the branch table
  2. u32 l : labelidx — the default target

Status

WebAssembly 1.0Standardised in WebAssembly 1.0 (2017)Part of the original WebAssembly release. Supported everywhere WebAssembly is.

Properties

0x0Freturn

return from the function

Description

Return zero or more values from this function.

The return instruction is a shortcut for an unconditional branch to the outermost block, which implicitly is the body of the current function.

Stack

[t1* t*] → [t2*]

Stack-polymorphic: execution jumps away and never continues past this instruction, so the validator accepts whatever is left on the stack.

Status

WebAssembly 1.0Standardised in WebAssembly 1.0 (2017)Part of the original WebAssembly release. Supported everywhere WebAssembly is.

Properties

0x10call x

call a function

Description

The call instruction invokes another function, consuming the necessary arguments from the stack and returning the result values of the call.

Stack

[t1*] → [t2*]

Immediate operands

  1. u32 x : funcidx

Status

WebAssembly 1.0Standardised in WebAssembly 1.0 (2017)Part of the original WebAssembly release. Supported everywhere WebAssembly is.

Properties

0x11call_indirect y x

Description

The call_indirect instruction calls a function indirectly through an operand indexing into a table.

Stack

[t1* i32] → [t2*]

The i32 selects an entry of table x; the call traps unless that entry holds a function of type y. Before reference types this second immediate was always 0x00, the only table there was.

Immediate operands

  1. u32 y : typeidx
  2. u32 x : tableidx

Status

WebAssembly 1.0Standardised in WebAssembly 1.0 (2017)Part of the original WebAssembly release. Supported everywhere WebAssembly is.

Properties

0x12return_call x

Description

The tail-call version of call.

The current frame is replaced instead of a new one being pushed, so a chain of tail calls runs in constant stack space.

Stack

[t1* t*] → [t2*]

Stack-polymorphic: execution jumps away and never continues past this instruction, so the validator accepts whatever is left on the stack.

t* are the parameters of function x. The callee’s results become the current function’s, so execution does not continue past this instruction.

Immediate operands

  1. u32 x : funcidx

Status

Tail callStandardised in WebAssembly 3.0 (2025)Standardised. Shipping in current browsers; check support if you target older engines.Engine support

Properties

0x13return_call_indirect y x

Description

The tail-call version of call_indirect.

The current frame is replaced instead of a new one being pushed, so a chain of tail calls runs in constant stack space.

Stack

[t1* t* i32] → [t2*]

Stack-polymorphic: execution jumps away and never continues past this instruction, so the validator accepts whatever is left on the stack.

t* are the parameters of function type y, and the i32 indexes table x. The callee’s results become the current function’s, so execution does not continue past this instruction.

Immediate operands

  1. u32 y : typeidx
  2. u32 x : tableidx

Status

Tail callStandardised in WebAssembly 3.0 (2025)Standardised. Shipping in current browsers; check support if you target older engines.Engine support

Properties

0x14call_ref x

Description

Calls a function through a reference of type x.

Stack

[t1* (ref null x)] → [t2*]

t1* and t2* are the parameters and results of function type x. Traps on a null reference.

Immediate operands

  1. u32 x : typeidx

Status

Typed function referencesStandardised in WebAssembly 3.0 (2025)Standardised. Shipping in current browsers; check support if you target older engines.Engine support

Properties

0x15return_call_ref x

Description

The tail-call version of call_ref.

The current frame is replaced instead of a new one being pushed, so a chain of tail calls runs in constant stack space.

Stack

[t1* t* (ref null x)] → [t2*]

Stack-polymorphic: execution jumps away and never continues past this instruction, so the validator accepts whatever is left on the stack.

t* are the parameters of function type x. The callee’s results become the current function’s, so execution does not continue past this instruction. Traps on a null reference.

Immediate operands

  1. u32 x : typeidx

Status

Typed function referencesStandardised in WebAssembly 3.0 (2025)Standardised. Shipping in current browsers; check support if you target older engines.Engine support

Properties

0x18delegate l

Description

Begins the delegate block of the try block.

Not typed on its own: what it does to the stack belongs to the enclosing try.

Immediate operands

  1. u32 l : labelidx

Status

Legacy exception handling

Legacy (2023)Replaced by try_table (0x1F) and throw_ref (0x0A)

The exception handling design that preceded try_table. Engines still accept it and older toolchains still emit it, but new code should use the standardised form.Engine support

Properties

0x19catch_all

Description

Begins the catch_all block of the try block.

Not typed on its own: what it does to the stack belongs to the enclosing try.

Status

Legacy exception handling

Legacy (2023)Replaced by try_table (0x1F) and throw_ref (0x0A)

The exception handling design that preceded try_table. Engines still accept it and older toolchains still emit it, but new code should use the standardised form.Engine support

Properties

0x1Adrop

discard the top of the stack

Description

The drop instruction simply throws away a single operand.

Arguably the only stack manipulation instruction WebAssembly has. There is no dup, swap or rot, and no way to reach past the top of the stack. See WebAssembly is not quite a stack machine, by purplesyringa.

Stack

[t] → []

Works on any single value: t is whatever is on top.

Status

WebAssembly 1.0Standardised in WebAssembly 1.0 (2017)Part of the original WebAssembly release. Supported everywhere WebAssembly is.

Properties

0x1Bselect

choose one of two values

Description

The select instruction selects one of its first two operands based on whether its third operand is zero or not.

Stack

[t t i32] → [t]

Works on any value type, as long as both candidates have the same one, but only a number or vector type. For a reference, use the annotated form select t (0x1C).

Status

WebAssembly 1.0Standardised in WebAssembly 1.0 (2017)Part of the original WebAssembly release. Supported everywhere WebAssembly is.

Properties

0x1Cselect t t*

Description

Only the annotated form can be used with reference types.

Stack

[t t i32] → [t]

Value-polymorphic: works on any value type — t is whatever the operands are.

t is given by the immediate rather than inferred, which is what lets this form take a reference.

Immediate operands

  1. t* : list(valtype) — currently exactly one

Status

Reference typesStandardised in WebAssembly 2.0 (2022)Standardised and supported by every current engine.Engine support

Encoded across 2 tables:

Properties

0x1Ftry_table bt c*

Description

Begins a block which can handle thrown exceptions.

Stack

[t1*] → [t2*]

Both the parameter and result types come from the bt immediate.

Immediate operands

  1. s33 bt : blocktype — 0x40 for no result; one valtype byte (0x7F i32, 0x7E i64, 0x7D f32, 0x7C f64, 0x7B v128, or a reference type) for one result; or a typeidx of 0 or more, naming a function type, for a block that takes or returns more than one value
  2. c* : list(catch) — 0x00 x l (catch), 0x01 x l (catch_ref), 0x02 l (catch_all) or 0x03 l (catch_all_ref), where x is a tagidx and l a labelidx

Then the instructions, then 0x0B (end).

Status

Exception handlingStandardised in WebAssembly 3.0 (2025)Standardised. This is the try_table form; the earlier try/catch encoding is still emitted by older toolchains.Engine support

Properties

0x20local.get x

Description

This instruction gets the value of a variable.

The index space for locals is only accessible inside a function and includes the parameters of that function, which precede the local variables.

The locals context refers to the list of locals declared in the current function (including parameters), represented by their value type.

Stack

[] → [t]

Immediate operands

  1. u32 x : localidx

Status

WebAssembly 1.0Standardised in WebAssembly 1.0 (2017)Part of the original WebAssembly release. Supported everywhere WebAssembly is.

Properties

0x21local.set x

Description

This instruction sets the value of a variable.

The index space for locals is only accessible inside a function and includes the parameters of that function, which precede the local variables.

Stack

[t] → []

Immediate operands

  1. u32 x : localidx

Status

WebAssembly 1.0Standardised in WebAssembly 1.0 (2017)Part of the original WebAssembly release. Supported everywhere WebAssembly is.

Properties

0x22local.tee x

Description

The local.tee instruction is like local.set but also returns its argument.

The index space for locals is only accessible inside a function and includes the parameters of that function, which precede the local variables.

Stack

[t] → [t]

Immediate operands

  1. u32 x : localidx

Status

WebAssembly 1.0Standardised in WebAssembly 1.0 (2017)Part of the original WebAssembly release. Supported everywhere WebAssembly is.

Properties

0x23global.get x

Description

This instruction gets the value of a variable.

The globals context is the list of globals declared in the current module, represented by their global type.

Stack

[] → [t]

Immediate operands

  1. u32 x : globalidx

Status

WebAssembly 1.0Standardised in WebAssembly 1.0 (2017)Part of the original WebAssembly release. Supported everywhere WebAssembly is.

Properties

0x24global.set x

Description

This instruction sets the value of a variable.

Stack

[t] → []

Immediate operands

  1. u32 x : globalidx

Status

WebAssembly 1.0Standardised in WebAssembly 1.0 (2017)Part of the original WebAssembly release. Supported everywhere WebAssembly is.

Properties

0x25table.get x

Description

Reads the element at a given index of table x.

Traps if the index is past the end of the table.

Stack

[i32] → []

Immediate operands

  1. u32 x : tableidx

Status

Reference typesStandardised in WebAssembly 2.0 (2022)Standardised and supported by every current engine.Engine support

Encoded across 2 tables:

Properties

0x26table.set x

Description

Writes an element to a given index of table x.

Traps if the index is past the end of the table.

Stack

[i32] → []

Immediate operands

  1. u32 x : tableidx

Status

Reference typesStandardised in WebAssembly 2.0 (2022)Standardised and supported by every current engine.Engine support

Encoded across 2 tables:

Properties

0x28i32.load m

read from memory

Description

Load 4 bytes as i32.

Memory is accessed with load and store instructions, which all take a memory immediate memarg holding an address offset and the expected alignment.

effective address = address operand + memarg.offset.

Stack

[i32] → [i32]

The signatures on the memory instructions show a 32-bit memory. A 64-bit memory (memory64) takes and returns i64 addresses instead, including for memory.size and memory.grow.

Immediate operands

  1. m : memarg — u32 align, then u64 offset

Alignment

  • align is the base-2 logarithm of the assumed alignment in bytes: 0 for 1 byte, 1 for 2, 2 for 4, 3 for 8, 4 for 16.
  • A value larger than the width of the access is rejected when the module is validated. A smaller one is allowed, and only tells the engine not to assume alignment.
  • Bit 6 (0x40) is not part of the number. When it is set, a u32 memory index follows align, before the offset, and the alignment is what is left after subtracting 64. When it is clear, the instruction uses memory 0.

Addresses: an i32 for a 32-bit memory, an i64 for a 64-bit memory (memory64). The signatures here show the 32-bit case, which is what almost every module uses.

Status

WebAssembly 1.0Standardised in WebAssembly 1.0 (2017)Part of the original WebAssembly release. Supported everywhere WebAssembly is.

Properties

0x29i64.load m

read from memory

Description

Load 8 bytes as i64.

The static offset is added to the address operand taken from the stack. For a 32-bit memory the sum is computed in 33 bits, so it cannot wrap; a 64-bit memory (memory64) takes an i64 address instead. All values are read and written in little endian byte order. A trap results if any accessed byte lies outside the memory’s current size.

Stack

[i32] → [i64]

Immediate operands

  1. m : memarg — u32 align, then u64 offset

Alignment

  • align is the base-2 logarithm of the assumed alignment in bytes: 0 for 1 byte, 1 for 2, 2 for 4, 3 for 8, 4 for 16.
  • A value larger than the width of the access is rejected when the module is validated. A smaller one is allowed, and only tells the engine not to assume alignment.
  • Bit 6 (0x40) is not part of the number. When it is set, a u32 memory index follows align, before the offset, and the alignment is what is left after subtracting 64. When it is clear, the instruction uses memory 0.

Addresses: an i32 for a 32-bit memory, an i64 for a 64-bit memory (memory64). The signatures here show the 32-bit case, which is what almost every module uses.

Status

WebAssembly 1.0Standardised in WebAssembly 1.0 (2017)Part of the original WebAssembly release. Supported everywhere WebAssembly is.

Properties

0x2Af32.load m

read from memory

Description

Load 4 bytes as f32.

Note: When a number is stored into memory, it is converted into a sequence of bytes in little endian byte order.

Stack

[i32] → [f32]

Immediate operands

  1. m : memarg — u32 align, then u64 offset

Alignment

  • align is the base-2 logarithm of the assumed alignment in bytes: 0 for 1 byte, 1 for 2, 2 for 4, 3 for 8, 4 for 16.
  • A value larger than the width of the access is rejected when the module is validated. A smaller one is allowed, and only tells the engine not to assume alignment.
  • Bit 6 (0x40) is not part of the number. When it is set, a u32 memory index follows align, before the offset, and the alignment is what is left after subtracting 64. When it is clear, the instruction uses memory 0.

Addresses: an i32 for a 32-bit memory, an i64 for a 64-bit memory (memory64). The signatures here show the 32-bit case, which is what almost every module uses.

Status

WebAssembly 1.0Standardised in WebAssembly 1.0 (2017)Part of the original WebAssembly release. Supported everywhere WebAssembly is.

Properties

0x2Bf64.load m

read from memory

Description

Load 8 bytes as f64.

Stack

[i32] → [f64]

Immediate operands

  1. m : memarg — u32 align, then u64 offset

Alignment

  • align is the base-2 logarithm of the assumed alignment in bytes: 0 for 1 byte, 1 for 2, 2 for 4, 3 for 8, 4 for 16.
  • A value larger than the width of the access is rejected when the module is validated. A smaller one is allowed, and only tells the engine not to assume alignment.
  • Bit 6 (0x40) is not part of the number. When it is set, a u32 memory index follows align, before the offset, and the alignment is what is left after subtracting 64. When it is clear, the instruction uses memory 0.

Addresses: an i32 for a 32-bit memory, an i64 for a 64-bit memory (memory64). The signatures here show the 32-bit case, which is what almost every module uses.

Status

WebAssembly 1.0Standardised in WebAssembly 1.0 (2017)Part of the original WebAssembly release. Supported everywhere WebAssembly is.

Properties

0x2Ci32.load8_s m

read 1 byte from memory, sign-extended

Description

Load 1 byte and sign-extend i8 to i32.

Integer loads and stores can optionally specify a storage size that is smaller than the bit width of the respective value type. In the case of loads, a sign extension mode sx (s|u) is then required to select appropriate behavior.

Stack

[i32] → [i32]

Immediate operands

  1. m : memarg — u32 align, then u64 offset

Alignment

  • align is the base-2 logarithm of the assumed alignment in bytes: 0 for 1 byte, 1 for 2, 2 for 4, 3 for 8, 4 for 16.
  • A value larger than the width of the access is rejected when the module is validated. A smaller one is allowed, and only tells the engine not to assume alignment.
  • Bit 6 (0x40) is not part of the number. When it is set, a u32 memory index follows align, before the offset, and the alignment is what is left after subtracting 64. When it is clear, the instruction uses memory 0.

Addresses: an i32 for a 32-bit memory, an i64 for a 64-bit memory (memory64). The signatures here show the 32-bit case, which is what almost every module uses.

Status

WebAssembly 1.0Standardised in WebAssembly 1.0 (2017)Part of the original WebAssembly release. Supported everywhere WebAssembly is.

Properties

0x2Di32.load8_u m

read 1 byte from memory, zero-extended

Description

Load 1 byte and zero-extend i8 to i32.

Stack

[i32] → [i32]

Immediate operands

  1. m : memarg — u32 align, then u64 offset

Alignment

  • align is the base-2 logarithm of the assumed alignment in bytes: 0 for 1 byte, 1 for 2, 2 for 4, 3 for 8, 4 for 16.
  • A value larger than the width of the access is rejected when the module is validated. A smaller one is allowed, and only tells the engine not to assume alignment.
  • Bit 6 (0x40) is not part of the number. When it is set, a u32 memory index follows align, before the offset, and the alignment is what is left after subtracting 64. When it is clear, the instruction uses memory 0.

Addresses: an i32 for a 32-bit memory, an i64 for a 64-bit memory (memory64). The signatures here show the 32-bit case, which is what almost every module uses.

Status

WebAssembly 1.0Standardised in WebAssembly 1.0 (2017)Part of the original WebAssembly release. Supported everywhere WebAssembly is.

Properties

0x2Ei32.load16_s m

read 2 bytes from memory, sign-extended

Description

Load 2 bytes and sign-extend i16 to i32.

Stack

[i32] → [i32]

Immediate operands

  1. m : memarg — u32 align, then u64 offset

Alignment

  • align is the base-2 logarithm of the assumed alignment in bytes: 0 for 1 byte, 1 for 2, 2 for 4, 3 for 8, 4 for 16.
  • A value larger than the width of the access is rejected when the module is validated. A smaller one is allowed, and only tells the engine not to assume alignment.
  • Bit 6 (0x40) is not part of the number. When it is set, a u32 memory index follows align, before the offset, and the alignment is what is left after subtracting 64. When it is clear, the instruction uses memory 0.

Addresses: an i32 for a 32-bit memory, an i64 for a 64-bit memory (memory64). The signatures here show the 32-bit case, which is what almost every module uses.

Status

WebAssembly 1.0Standardised in WebAssembly 1.0 (2017)Part of the original WebAssembly release. Supported everywhere WebAssembly is.

Properties

0x2Fi32.load16_u m

read 2 bytes from memory, zero-extended

Description

Load 2 bytes and zero-extend i16 to i32.

Stack

[i32] → [i32]

Immediate operands

  1. m : memarg — u32 align, then u64 offset

Alignment

  • align is the base-2 logarithm of the assumed alignment in bytes: 0 for 1 byte, 1 for 2, 2 for 4, 3 for 8, 4 for 16.
  • A value larger than the width of the access is rejected when the module is validated. A smaller one is allowed, and only tells the engine not to assume alignment.
  • Bit 6 (0x40) is not part of the number. When it is set, a u32 memory index follows align, before the offset, and the alignment is what is left after subtracting 64. When it is clear, the instruction uses memory 0.

Addresses: an i32 for a 32-bit memory, an i64 for a 64-bit memory (memory64). The signatures here show the 32-bit case, which is what almost every module uses.

Status

WebAssembly 1.0Standardised in WebAssembly 1.0 (2017)Part of the original WebAssembly release. Supported everywhere WebAssembly is.

Properties

0x30i64.load8_s m

read 1 byte from memory, sign-extended

Description

Load 1 byte and sign-extend i8 to i64.

Stack

[i32] → [i64]

Immediate operands

  1. m : memarg — u32 align, then u64 offset

Alignment

  • align is the base-2 logarithm of the assumed alignment in bytes: 0 for 1 byte, 1 for 2, 2 for 4, 3 for 8, 4 for 16.
  • A value larger than the width of the access is rejected when the module is validated. A smaller one is allowed, and only tells the engine not to assume alignment.
  • Bit 6 (0x40) is not part of the number. When it is set, a u32 memory index follows align, before the offset, and the alignment is what is left after subtracting 64. When it is clear, the instruction uses memory 0.

Addresses: an i32 for a 32-bit memory, an i64 for a 64-bit memory (memory64). The signatures here show the 32-bit case, which is what almost every module uses.

Status

WebAssembly 1.0Standardised in WebAssembly 1.0 (2017)Part of the original WebAssembly release. Supported everywhere WebAssembly is.

Properties

0x31i64.load8_u m

read 1 byte from memory, zero-extended

Description

Load 1 byte and zero-extend i8 to i64.

Stack

[i32] → [i64]

Immediate operands

  1. m : memarg — u32 align, then u64 offset

Alignment

  • align is the base-2 logarithm of the assumed alignment in bytes: 0 for 1 byte, 1 for 2, 2 for 4, 3 for 8, 4 for 16.
  • A value larger than the width of the access is rejected when the module is validated. A smaller one is allowed, and only tells the engine not to assume alignment.
  • Bit 6 (0x40) is not part of the number. When it is set, a u32 memory index follows align, before the offset, and the alignment is what is left after subtracting 64. When it is clear, the instruction uses memory 0.

Addresses: an i32 for a 32-bit memory, an i64 for a 64-bit memory (memory64). The signatures here show the 32-bit case, which is what almost every module uses.

Status

WebAssembly 1.0Standardised in WebAssembly 1.0 (2017)Part of the original WebAssembly release. Supported everywhere WebAssembly is.

Properties

0x32i64.load16_s m

read 2 bytes from memory, sign-extended

Description

Load 2 bytes and sign-extend i16 to i64.

Stack

[i32] → [i64]

Immediate operands

  1. m : memarg — u32 align, then u64 offset

Alignment

  • align is the base-2 logarithm of the assumed alignment in bytes: 0 for 1 byte, 1 for 2, 2 for 4, 3 for 8, 4 for 16.
  • A value larger than the width of the access is rejected when the module is validated. A smaller one is allowed, and only tells the engine not to assume alignment.
  • Bit 6 (0x40) is not part of the number. When it is set, a u32 memory index follows align, before the offset, and the alignment is what is left after subtracting 64. When it is clear, the instruction uses memory 0.

Addresses: an i32 for a 32-bit memory, an i64 for a 64-bit memory (memory64). The signatures here show the 32-bit case, which is what almost every module uses.

Status

WebAssembly 1.0Standardised in WebAssembly 1.0 (2017)Part of the original WebAssembly release. Supported everywhere WebAssembly is.

Properties

0x33i64.load16_u m

read 2 bytes from memory, zero-extended

Description

Load 2 bytes and zero-extend i16 to i64.

Stack

[i32] → [i64]

Immediate operands

  1. m : memarg — u32 align, then u64 offset

Alignment

  • align is the base-2 logarithm of the assumed alignment in bytes: 0 for 1 byte, 1 for 2, 2 for 4, 3 for 8, 4 for 16.
  • A value larger than the width of the access is rejected when the module is validated. A smaller one is allowed, and only tells the engine not to assume alignment.
  • Bit 6 (0x40) is not part of the number. When it is set, a u32 memory index follows align, before the offset, and the alignment is what is left after subtracting 64. When it is clear, the instruction uses memory 0.

Addresses: an i32 for a 32-bit memory, an i64 for a 64-bit memory (memory64). The signatures here show the 32-bit case, which is what almost every module uses.

Status

WebAssembly 1.0Standardised in WebAssembly 1.0 (2017)Part of the original WebAssembly release. Supported everywhere WebAssembly is.

Properties

0x34i64.load32_s m

read 4 bytes from memory, sign-extended

Description

Load 4 bytes and sign-extend i32 to i64.

Stack

[i32] → [i64]

Immediate operands

  1. m : memarg — u32 align, then u64 offset

Alignment

  • align is the base-2 logarithm of the assumed alignment in bytes: 0 for 1 byte, 1 for 2, 2 for 4, 3 for 8, 4 for 16.
  • A value larger than the width of the access is rejected when the module is validated. A smaller one is allowed, and only tells the engine not to assume alignment.
  • Bit 6 (0x40) is not part of the number. When it is set, a u32 memory index follows align, before the offset, and the alignment is what is left after subtracting 64. When it is clear, the instruction uses memory 0.

Addresses: an i32 for a 32-bit memory, an i64 for a 64-bit memory (memory64). The signatures here show the 32-bit case, which is what almost every module uses.

Status

WebAssembly 1.0Standardised in WebAssembly 1.0 (2017)Part of the original WebAssembly release. Supported everywhere WebAssembly is.

Properties

0x35i64.load32_u m

read 4 bytes from memory, zero-extended

Description

Load 4 bytes and zero-extend i32 to i64.

Stack

[i32] → [i64]

Immediate operands

  1. m : memarg — u32 align, then u64 offset

Alignment

  • align is the base-2 logarithm of the assumed alignment in bytes: 0 for 1 byte, 1 for 2, 2 for 4, 3 for 8, 4 for 16.
  • A value larger than the width of the access is rejected when the module is validated. A smaller one is allowed, and only tells the engine not to assume alignment.
  • Bit 6 (0x40) is not part of the number. When it is set, a u32 memory index follows align, before the offset, and the alignment is what is left after subtracting 64. When it is clear, the instruction uses memory 0.

Addresses: an i32 for a 32-bit memory, an i64 for a 64-bit memory (memory64). The signatures here show the 32-bit case, which is what almost every module uses.

Status

WebAssembly 1.0Standardised in WebAssembly 1.0 (2017)Part of the original WebAssembly release. Supported everywhere WebAssembly is.

Properties

0x36i32.store m

write to memory

Description

Store 4 bytes (no conversion).

Stack

[i32 i32] → []

Immediate operands

  1. m : memarg — u32 align, then u64 offset

Alignment

  • align is the base-2 logarithm of the assumed alignment in bytes: 0 for 1 byte, 1 for 2, 2 for 4, 3 for 8, 4 for 16.
  • A value larger than the width of the access is rejected when the module is validated. A smaller one is allowed, and only tells the engine not to assume alignment.
  • Bit 6 (0x40) is not part of the number. When it is set, a u32 memory index follows align, before the offset, and the alignment is what is left after subtracting 64. When it is clear, the instruction uses memory 0.

Addresses: an i32 for a 32-bit memory, an i64 for a 64-bit memory (memory64). The signatures here show the 32-bit case, which is what almost every module uses.

Status

WebAssembly 1.0Standardised in WebAssembly 1.0 (2017)Part of the original WebAssembly release. Supported everywhere WebAssembly is.

Properties

0x37i64.store m

write to memory

Description

Store 8 bytes (no conversion).

Stack

[i32 i64] → []

Immediate operands

  1. m : memarg — u32 align, then u64 offset

Alignment

  • align is the base-2 logarithm of the assumed alignment in bytes: 0 for 1 byte, 1 for 2, 2 for 4, 3 for 8, 4 for 16.
  • A value larger than the width of the access is rejected when the module is validated. A smaller one is allowed, and only tells the engine not to assume alignment.
  • Bit 6 (0x40) is not part of the number. When it is set, a u32 memory index follows align, before the offset, and the alignment is what is left after subtracting 64. When it is clear, the instruction uses memory 0.

Addresses: an i32 for a 32-bit memory, an i64 for a 64-bit memory (memory64). The signatures here show the 32-bit case, which is what almost every module uses.

Status

WebAssembly 1.0Standardised in WebAssembly 1.0 (2017)Part of the original WebAssembly release. Supported everywhere WebAssembly is.

Properties

0x38f32.store m

write to memory

Description

Store 4 bytes (no conversion).

Stack

[i32 f32] → []

Immediate operands

  1. m : memarg — u32 align, then u64 offset

Alignment

  • align is the base-2 logarithm of the assumed alignment in bytes: 0 for 1 byte, 1 for 2, 2 for 4, 3 for 8, 4 for 16.
  • A value larger than the width of the access is rejected when the module is validated. A smaller one is allowed, and only tells the engine not to assume alignment.
  • Bit 6 (0x40) is not part of the number. When it is set, a u32 memory index follows align, before the offset, and the alignment is what is left after subtracting 64. When it is clear, the instruction uses memory 0.

Addresses: an i32 for a 32-bit memory, an i64 for a 64-bit memory (memory64). The signatures here show the 32-bit case, which is what almost every module uses.

Status

WebAssembly 1.0Standardised in WebAssembly 1.0 (2017)Part of the original WebAssembly release. Supported everywhere WebAssembly is.

Properties

0x39f64.store m

write to memory

Description

Store 8 bytes (no conversion).

Stack

[i32 f64] → []

Immediate operands

  1. m : memarg — u32 align, then u64 offset

Alignment

  • align is the base-2 logarithm of the assumed alignment in bytes: 0 for 1 byte, 1 for 2, 2 for 4, 3 for 8, 4 for 16.
  • A value larger than the width of the access is rejected when the module is validated. A smaller one is allowed, and only tells the engine not to assume alignment.
  • Bit 6 (0x40) is not part of the number. When it is set, a u32 memory index follows align, before the offset, and the alignment is what is left after subtracting 64. When it is clear, the instruction uses memory 0.

Addresses: an i32 for a 32-bit memory, an i64 for a 64-bit memory (memory64). The signatures here show the 32-bit case, which is what almost every module uses.

Status

WebAssembly 1.0Standardised in WebAssembly 1.0 (2017)Part of the original WebAssembly release. Supported everywhere WebAssembly is.

Properties

0x3Ai32.store8 m

write the low 1 byte to memory

Description

Wrap i32 to i8 and store 1 byte.

Stack

[i32 i32] → []

Immediate operands

  1. m : memarg — u32 align, then u64 offset

Alignment

  • align is the base-2 logarithm of the assumed alignment in bytes: 0 for 1 byte, 1 for 2, 2 for 4, 3 for 8, 4 for 16.
  • A value larger than the width of the access is rejected when the module is validated. A smaller one is allowed, and only tells the engine not to assume alignment.
  • Bit 6 (0x40) is not part of the number. When it is set, a u32 memory index follows align, before the offset, and the alignment is what is left after subtracting 64. When it is clear, the instruction uses memory 0.

Addresses: an i32 for a 32-bit memory, an i64 for a 64-bit memory (memory64). The signatures here show the 32-bit case, which is what almost every module uses.

Status

WebAssembly 1.0Standardised in WebAssembly 1.0 (2017)Part of the original WebAssembly release. Supported everywhere WebAssembly is.

Properties

0x3Bi32.store16 m

write the low 2 bytes to memory

Description

Wrap i32 to i16 and store 2 bytes.

Stack

[i32 i32] → []

Immediate operands

  1. m : memarg — u32 align, then u64 offset

Alignment

  • align is the base-2 logarithm of the assumed alignment in bytes: 0 for 1 byte, 1 for 2, 2 for 4, 3 for 8, 4 for 16.
  • A value larger than the width of the access is rejected when the module is validated. A smaller one is allowed, and only tells the engine not to assume alignment.
  • Bit 6 (0x40) is not part of the number. When it is set, a u32 memory index follows align, before the offset, and the alignment is what is left after subtracting 64. When it is clear, the instruction uses memory 0.

Addresses: an i32 for a 32-bit memory, an i64 for a 64-bit memory (memory64). The signatures here show the 32-bit case, which is what almost every module uses.

Status

WebAssembly 1.0Standardised in WebAssembly 1.0 (2017)Part of the original WebAssembly release. Supported everywhere WebAssembly is.

Properties

0x3Ci64.store8 m

write the low 1 byte to memory

Description

Wrap i64 to i8 and store 1 byte.

Stack

[i32 i64] → []

Immediate operands

  1. m : memarg — u32 align, then u64 offset

Alignment

  • align is the base-2 logarithm of the assumed alignment in bytes: 0 for 1 byte, 1 for 2, 2 for 4, 3 for 8, 4 for 16.
  • A value larger than the width of the access is rejected when the module is validated. A smaller one is allowed, and only tells the engine not to assume alignment.
  • Bit 6 (0x40) is not part of the number. When it is set, a u32 memory index follows align, before the offset, and the alignment is what is left after subtracting 64. When it is clear, the instruction uses memory 0.

Addresses: an i32 for a 32-bit memory, an i64 for a 64-bit memory (memory64). The signatures here show the 32-bit case, which is what almost every module uses.

Status

WebAssembly 1.0Standardised in WebAssembly 1.0 (2017)Part of the original WebAssembly release. Supported everywhere WebAssembly is.

Properties

0x3Di64.store16 m

write the low 2 bytes to memory

Description

Wrap i64 to i16 and store 2 bytes.

Stack

[i32 i64] → []

Immediate operands

  1. m : memarg — u32 align, then u64 offset

Alignment

  • align is the base-2 logarithm of the assumed alignment in bytes: 0 for 1 byte, 1 for 2, 2 for 4, 3 for 8, 4 for 16.
  • A value larger than the width of the access is rejected when the module is validated. A smaller one is allowed, and only tells the engine not to assume alignment.
  • Bit 6 (0x40) is not part of the number. When it is set, a u32 memory index follows align, before the offset, and the alignment is what is left after subtracting 64. When it is clear, the instruction uses memory 0.

Addresses: an i32 for a 32-bit memory, an i64 for a 64-bit memory (memory64). The signatures here show the 32-bit case, which is what almost every module uses.

Status

WebAssembly 1.0Standardised in WebAssembly 1.0 (2017)Part of the original WebAssembly release. Supported everywhere WebAssembly is.

Properties

0x3Ei64.store32 m

write the low 4 bytes to memory

Description

Wrap i64 to i32 and store 4 bytes.

Stack

[i32 i64] → []

Immediate operands

  1. m : memarg — u32 align, then u64 offset

Alignment

  • align is the base-2 logarithm of the assumed alignment in bytes: 0 for 1 byte, 1 for 2, 2 for 4, 3 for 8, 4 for 16.
  • A value larger than the width of the access is rejected when the module is validated. A smaller one is allowed, and only tells the engine not to assume alignment.
  • Bit 6 (0x40) is not part of the number. When it is set, a u32 memory index follows align, before the offset, and the alignment is what is left after subtracting 64. When it is clear, the instruction uses memory 0.

Addresses: an i32 for a 32-bit memory, an i64 for a 64-bit memory (memory64). The signatures here show the 32-bit case, which is what almost every module uses.

Status

WebAssembly 1.0Standardised in WebAssembly 1.0 (2017)Part of the original WebAssembly release. Supported everywhere WebAssembly is.

Properties

0x3Fmemory.size x

Description

The memory.size instruction returns the current size of a memory.

Operates in units of page size. Each page is 65,536 bytes (64KB).

Stack

[] → [i32]

Immediate operands

  1. u32 x : memidx

Addresses: an i32 for a 32-bit memory, an i64 for a 64-bit memory (memory64). The signatures here show the 32-bit case, which is what almost every module uses.

Status

WebAssembly 1.0Standardised in WebAssembly 1.0 (2017)Part of the original WebAssembly release. Supported everywhere WebAssembly is.

Properties

0x40memory.grow x

Description

The memory.grow instruction grows memory by a given delta and returns the previous size, or −1 if enough memory cannot be allocated.

Operates in units of page size. Each page is 65,536 bytes (64KB).

Stack

[i32] → [i32]

Immediate operands

  1. u32 x : memidx

Addresses: an i32 for a 32-bit memory, an i64 for a 64-bit memory (memory64). The signatures here show the 32-bit case, which is what almost every module uses.

Status

WebAssembly 1.0Standardised in WebAssembly 1.0 (2017)Part of the original WebAssembly release. Supported everywhere WebAssembly is.

Properties

0x41i32.const n

Description

Push a 32-bit integer value to the stack.

Stack

[] → [i32]

Immediate operands

  1. n : i32 — signed LEB, 1–5 bytes

Status

WebAssembly 1.0Standardised in WebAssembly 1.0 (2017)Part of the original WebAssembly release. Supported everywhere WebAssembly is.

Properties

0x42i64.const n

Description

Push a 64-bit integer value to the stack.

Stack

[] → [i64]

Immediate operands

  1. n : i64 — signed LEB, 1–10 bytes

Status

WebAssembly 1.0Standardised in WebAssembly 1.0 (2017)Part of the original WebAssembly release. Supported everywhere WebAssembly is.

Properties

0x43f32.const z

Description

Push a 32-bit float value to the stack.

Stack

[] → [f32]

Immediate operands

  1. z : f32 — 4 bytes, little-endian

Status

WebAssembly 1.0Standardised in WebAssembly 1.0 (2017)Part of the original WebAssembly release. Supported everywhere WebAssembly is.

Properties

0x44f64.const z

Description

Push a 64-bit float value to the stack.

Stack

[] → [f64]

Immediate operands

  1. z : f64 — 8 bytes, little-endian

Status

WebAssembly 1.0Standardised in WebAssembly 1.0 (2017)Part of the original WebAssembly release. Supported everywhere WebAssembly is.

Properties

0x45i32.eqz

equal to zero

Description

Compare equal to zero.

Return 1 if operand is zero, 0 otherwise.

Stack

[i32] → [i32]

Status

WebAssembly 1.0Standardised in WebAssembly 1.0 (2017)Part of the original WebAssembly release. Supported everywhere WebAssembly is.

Properties

0x46i32.eq

equal

Description

==

Sign-agnostic compare equal.

Stack

[i32 i32] → [i32]

Status

WebAssembly 1.0Standardised in WebAssembly 1.0 (2017)Part of the original WebAssembly release. Supported everywhere WebAssembly is.

Properties

0x47i32.ne

not equal

Description

Sign-agnostic compare unequal.

Stack

[i32 i32] → [i32]

Status

WebAssembly 1.0Standardised in WebAssembly 1.0 (2017)Part of the original WebAssembly release. Supported everywhere WebAssembly is.

Properties

0x48i32.lt_s

less than, signed

Description

<

Signed less than.

Stack

[i32 i32] → [i32]

Status

WebAssembly 1.0Standardised in WebAssembly 1.0 (2017)Part of the original WebAssembly release. Supported everywhere WebAssembly is.

Properties

0x49i32.lt_u

less than, unsigned

Description

<

Unsigned less than.

Stack

[i32 i32] → [i32]

Status

WebAssembly 1.0Standardised in WebAssembly 1.0 (2017)Part of the original WebAssembly release. Supported everywhere WebAssembly is.

Properties

0x4Ai32.gt_s

greater than, signed

Description

>

Signed greater than.

Stack

[i32 i32] → [i32]

Status

WebAssembly 1.0Standardised in WebAssembly 1.0 (2017)Part of the original WebAssembly release. Supported everywhere WebAssembly is.

Properties

0x4Bi32.gt_u

greater than, unsigned

Description

>

Unsigned greater than.

Stack

[i32 i32] → [i32]

Status

WebAssembly 1.0Standardised in WebAssembly 1.0 (2017)Part of the original WebAssembly release. Supported everywhere WebAssembly is.

Properties

0x4Ci32.le_s

less than or equal, signed

Description

Signed less than or equal.

Stack

[i32 i32] → [i32]

Status

WebAssembly 1.0Standardised in WebAssembly 1.0 (2017)Part of the original WebAssembly release. Supported everywhere WebAssembly is.

Properties

0x4Di32.le_u

less than or equal, unsigned

Description

Unsigned less than or equal.

Stack

[i32 i32] → [i32]

Status

WebAssembly 1.0Standardised in WebAssembly 1.0 (2017)Part of the original WebAssembly release. Supported everywhere WebAssembly is.

Properties

0x4Ei32.ge_s

greater than or equal, signed

Description

Signed greater than or equal.

Stack

[i32 i32] → [i32]

Status

WebAssembly 1.0Standardised in WebAssembly 1.0 (2017)Part of the original WebAssembly release. Supported everywhere WebAssembly is.

Properties

0x4Fi32.ge_u

greater than or equal, unsigned

Description

Unsigned greater than or equal.

Stack

[i32 i32] → [i32]

Status

WebAssembly 1.0Standardised in WebAssembly 1.0 (2017)Part of the original WebAssembly release. Supported everywhere WebAssembly is.

Properties

0x50i64.eqz

equal to zero

Description

Compare equal to zero.

Return 1 if operand is zero, 0 otherwise.

Stack

[i64] → [i32]

Status

WebAssembly 1.0Standardised in WebAssembly 1.0 (2017)Part of the original WebAssembly release. Supported everywhere WebAssembly is.

Properties

0x51i64.eq

equal

Description

==

Sign-agnostic compare equal.

Stack

[i64 i64] → [i32]

Status

WebAssembly 1.0Standardised in WebAssembly 1.0 (2017)Part of the original WebAssembly release. Supported everywhere WebAssembly is.

Properties

0x52i64.ne

not equal

Description

Sign-agnostic compare unequal.

Stack

[i64 i64] → [i32]

Status

WebAssembly 1.0Standardised in WebAssembly 1.0 (2017)Part of the original WebAssembly release. Supported everywhere WebAssembly is.

Properties

0x53i64.lt_s

less than, signed

Description

<

Signed less than.

Stack

[i64 i64] → [i32]

Status

WebAssembly 1.0Standardised in WebAssembly 1.0 (2017)Part of the original WebAssembly release. Supported everywhere WebAssembly is.

Properties

0x54i64.lt_u

less than, unsigned

Description

<

Unsigned less than.

Stack

[i64 i64] → [i32]

Status

WebAssembly 1.0Standardised in WebAssembly 1.0 (2017)Part of the original WebAssembly release. Supported everywhere WebAssembly is.

Properties

0x55i64.gt_s

greater than, signed

Description

>

Signed greater than.

Stack

[i64 i64] → [i32]

Status

WebAssembly 1.0Standardised in WebAssembly 1.0 (2017)Part of the original WebAssembly release. Supported everywhere WebAssembly is.

Properties

0x56i64.gt_u

greater than, unsigned

Description

>

Unsigned greater than.

Stack

[i64 i64] → [i32]

Status

WebAssembly 1.0Standardised in WebAssembly 1.0 (2017)Part of the original WebAssembly release. Supported everywhere WebAssembly is.

Properties

0x57i64.le_s

less than or equal, signed

Description

Signed less than or equal.

Stack

[i64 i64] → [i32]

Status

WebAssembly 1.0Standardised in WebAssembly 1.0 (2017)Part of the original WebAssembly release. Supported everywhere WebAssembly is.

Properties

0x58i64.le_u

less than or equal, unsigned

Description

Unsigned less than or equal.

Stack

[i64 i64] → [i32]

Status

WebAssembly 1.0Standardised in WebAssembly 1.0 (2017)Part of the original WebAssembly release. Supported everywhere WebAssembly is.

Properties

0x59i64.ge_s

greater than or equal, signed

Description

Signed greater than or equal.

Stack

[i64 i64] → [i32]

Status

WebAssembly 1.0Standardised in WebAssembly 1.0 (2017)Part of the original WebAssembly release. Supported everywhere WebAssembly is.

Properties

0x5Ai64.ge_u

greater than or equal, unsigned

Description

Unsigned greater than or equal.

Stack

[i64 i64] → [i32]

Status

WebAssembly 1.0Standardised in WebAssembly 1.0 (2017)Part of the original WebAssembly release. Supported everywhere WebAssembly is.

Properties

0x5Bf32.eq

equal

Description

==

Compare equal.

Stack

[f32 f32] → [i32]

Status

WebAssembly 1.0Standardised in WebAssembly 1.0 (2017)Part of the original WebAssembly release. Supported everywhere WebAssembly is.

Properties

0x5Cf32.ne

not equal

Description

Compare unordered or unequal.

Stack

[f32 f32] → [i32]

Status

WebAssembly 1.0Standardised in WebAssembly 1.0 (2017)Part of the original WebAssembly release. Supported everywhere WebAssembly is.

Properties

0x5Df32.lt

less than

Description

<

Less than.

Stack

[f32 f32] → [i32]

Status

WebAssembly 1.0Standardised in WebAssembly 1.0 (2017)Part of the original WebAssembly release. Supported everywhere WebAssembly is.

Properties

0x5Ef32.gt

greater than

Description

>

Greater than.

Stack

[f32 f32] → [i32]

Status

WebAssembly 1.0Standardised in WebAssembly 1.0 (2017)Part of the original WebAssembly release. Supported everywhere WebAssembly is.

Properties

0x5Ff32.le

less than or equal

Description

Less than or equal.

Stack

[f32 f32] → [i32]

Status

WebAssembly 1.0Standardised in WebAssembly 1.0 (2017)Part of the original WebAssembly release. Supported everywhere WebAssembly is.

Properties

0x60f32.ge

greater than or equal

Description

Greater than or equal.

Stack

[f32 f32] → [i32]

Status

WebAssembly 1.0Standardised in WebAssembly 1.0 (2017)Part of the original WebAssembly release. Supported everywhere WebAssembly is.

Properties

0x61f64.eq

equal

Description

==

Compare equal.

Stack

[f64 f64] → [i32]

Status

WebAssembly 1.0Standardised in WebAssembly 1.0 (2017)Part of the original WebAssembly release. Supported everywhere WebAssembly is.

Properties

0x62f64.ne

not equal

Description

Compare unordered or unequal.

Stack

[f64 f64] → [i32]

Status

WebAssembly 1.0Standardised in WebAssembly 1.0 (2017)Part of the original WebAssembly release. Supported everywhere WebAssembly is.

Properties

0x63f64.lt

less than

Description

<

Less than.

Stack

[f64 f64] → [i32]

Status

WebAssembly 1.0Standardised in WebAssembly 1.0 (2017)Part of the original WebAssembly release. Supported everywhere WebAssembly is.

Properties

0x64f64.gt

greater than

Description

>

Greater than.

Stack

[f64 f64] → [i32]

Status

WebAssembly 1.0Standardised in WebAssembly 1.0 (2017)Part of the original WebAssembly release. Supported everywhere WebAssembly is.

Properties

0x65f64.le

less than or equal

Description

Less than or equal.

Stack

[f64 f64] → [i32]

Status

WebAssembly 1.0Standardised in WebAssembly 1.0 (2017)Part of the original WebAssembly release. Supported everywhere WebAssembly is.

Properties

0x66f64.ge

greater than or equal

Description

Greater than or equal.

Stack

[f64 f64] → [i32]

Status

WebAssembly 1.0Standardised in WebAssembly 1.0 (2017)Part of the original WebAssembly release. Supported everywhere WebAssembly is.

Properties

0x67i32.clz

count leading zero bits

Description

Sign-agnostic count leading zero bits.

Return the count of leading zero bits in i. All zero bits are considered leading if the value is zero.

Stack

[i32] → [i32]

Status

WebAssembly 1.0Standardised in WebAssembly 1.0 (2017)Part of the original WebAssembly release. Supported everywhere WebAssembly is.

Properties

0x68i32.ctz

count trailing zero bits

Description

Sign-agnostic count trailing zero bits.

Return the count of trailing zero bits in i. All zero bits are considered trailing if the value is zero.

Stack

[i32] → [i32]

Status

WebAssembly 1.0Standardised in WebAssembly 1.0 (2017)Part of the original WebAssembly release. Supported everywhere WebAssembly is.

Properties

0x69i32.popcnt

count one bits

Description

Sign-agnostic count number of one bits.

Return the count of non-zero bits in i.

Stack

[i32] → [i32]

Status

WebAssembly 1.0Standardised in WebAssembly 1.0 (2017)Part of the original WebAssembly release. Supported everywhere WebAssembly is.

Properties

0x6Ai32.add

add

Description

Sign-agnostic addition.

Stack

[i32 i32] → [i32]

Status

WebAssembly 1.0Standardised in WebAssembly 1.0 (2017)Part of the original WebAssembly release. Supported everywhere WebAssembly is.

Properties

0x6Bi32.sub

subtract

Description

Sign-agnostic subtraction.

Stack

[i32 i32] → [i32]

Status

WebAssembly 1.0Standardised in WebAssembly 1.0 (2017)Part of the original WebAssembly release. Supported everywhere WebAssembly is.

Properties

0x6Ci32.mul

multiply

Description

Sign-agnostic multiplication, modulo 232.

Stack

[i32 i32] → [i32]

Status

WebAssembly 1.0Standardised in WebAssembly 1.0 (2017)Part of the original WebAssembly release. Supported everywhere WebAssembly is.

Properties

0x6Di32.div_s

divide, signed

Description

Signed division (result is truncated toward zero).

Stack

[i32 i32] → [i32]

Status

WebAssembly 1.0Standardised in WebAssembly 1.0 (2017)Part of the original WebAssembly release. Supported everywhere WebAssembly is.

Properties

0x6Ei32.div_u

divide, unsigned

Description

Unsigned division (result is floored).

Stack

[i32 i32] → [i32]

Status

WebAssembly 1.0Standardised in WebAssembly 1.0 (2017)Part of the original WebAssembly release. Supported everywhere WebAssembly is.

Properties

0x6Fi32.rem_s

remainder after division, signed

Description

Signed remainder (result has the sign of the dividend).

Stack

[i32 i32] → [i32]

Status

WebAssembly 1.0Standardised in WebAssembly 1.0 (2017)Part of the original WebAssembly release. Supported everywhere WebAssembly is.

Properties

0x70i32.rem_u

remainder after division, unsigned

Description

Unsigned remainder.

Stack

[i32 i32] → [i32]

Status

WebAssembly 1.0Standardised in WebAssembly 1.0 (2017)Part of the original WebAssembly release. Supported everywhere WebAssembly is.

Properties

0x71i32.and

bitwise and

Description

Sign-agnostic bitwise AND.

Sets each result bit where that bit is set in both operands.

Stack

[i32 i32] → [i32]

Status

WebAssembly 1.0Standardised in WebAssembly 1.0 (2017)Part of the original WebAssembly release. Supported everywhere WebAssembly is.

Properties

0x72i32.or

bitwise or

Description

Sign-agnostic bitwise inclusive OR.

Sets each result bit where that bit is set in either operand.

Stack

[i32 i32] → [i32]

Status

WebAssembly 1.0Standardised in WebAssembly 1.0 (2017)Part of the original WebAssembly release. Supported everywhere WebAssembly is.

Properties

0x73i32.xor

bitwise exclusive or

Description

Sign-agnostic bitwise exclusive OR (XOR).

Sets each result bit where that bit is set in exactly one of the two operands.

Stack

[i32 i32] → [i32]

Status

WebAssembly 1.0Standardised in WebAssembly 1.0 (2017)Part of the original WebAssembly release. Supported everywhere WebAssembly is.

Properties

0x74i32.shl

shift left

Description

Sign-agnostic shift left.

Return the result of shifting i1 left by k bits, modulo 232.

Stack

[i32 i32] → [i32]

Status

WebAssembly 1.0Standardised in WebAssembly 1.0 (2017)Part of the original WebAssembly release. Supported everywhere WebAssembly is.

Properties

0x75i32.shr_s

shift right, signed

Description

Sign-replicating (arithmetic) shift right.

Return the result of shifting i1 right by k bits, extended with the most significant bit of the original value.

Stack

[i32 i32] → [i32]

Status

WebAssembly 1.0Standardised in WebAssembly 1.0 (2017)Part of the original WebAssembly release. Supported everywhere WebAssembly is.

Properties

0x76i32.shr_u

shift right, unsigned

Description

Zero-replicating (logical) shift right.

Return the result of shifting i1 right by k bits, extended with 0 bits.

Stack

[i32 i32] → [i32]

Status

WebAssembly 1.0Standardised in WebAssembly 1.0 (2017)Part of the original WebAssembly release. Supported everywhere WebAssembly is.

Properties

0x77i32.rotl

rotate bits left

Description

Sign-agnostic rotate left.

Return the result of rotating i1 left by k bits.

Stack

[i32 i32] → [i32]

Status

WebAssembly 1.0Standardised in WebAssembly 1.0 (2017)Part of the original WebAssembly release. Supported everywhere WebAssembly is.

Properties

0x78i32.rotr

rotate bits right

Description

Sign-agnostic rotate right.

Return the result of rotating i1 right by k bits.

Stack

[i32 i32] → [i32]

Status

WebAssembly 1.0Standardised in WebAssembly 1.0 (2017)Part of the original WebAssembly release. Supported everywhere WebAssembly is.

Properties

0x79i64.clz

count leading zero bits

Description

Sign-agnostic count leading zero bits.

Return the count of leading zero bits in i. All zero bits are considered leading if the value is zero.

Stack

[i64] → [i64]

Status

WebAssembly 1.0Standardised in WebAssembly 1.0 (2017)Part of the original WebAssembly release. Supported everywhere WebAssembly is.

Properties

0x7Ai64.ctz

count trailing zero bits

Description

Sign-agnostic count trailing zero bits.

Return the count of trailing zero bits in i. All zero bits are considered trailing if the value is zero.

Stack

[i64] → [i64]

Status

WebAssembly 1.0Standardised in WebAssembly 1.0 (2017)Part of the original WebAssembly release. Supported everywhere WebAssembly is.

Properties

0x7Bi64.popcnt

count one bits

Description

Sign-agnostic count number of one bits.

Return the count of non-zero bits in i.

Stack

[i64] → [i64]

Status

WebAssembly 1.0Standardised in WebAssembly 1.0 (2017)Part of the original WebAssembly release. Supported everywhere WebAssembly is.

Properties

0x7Ci64.add

add

Description

Sign-agnostic addition.

Stack

[i64 i64] → [i64]

Status

WebAssembly 1.0Standardised in WebAssembly 1.0 (2017)Part of the original WebAssembly release. Supported everywhere WebAssembly is.

Properties

0x7Di64.sub

subtract

Description

Sign-agnostic subtraction.

Stack

[i64 i64] → [i64]

Status

WebAssembly 1.0Standardised in WebAssembly 1.0 (2017)Part of the original WebAssembly release. Supported everywhere WebAssembly is.

Properties

0x7Ei64.mul

multiply

Description

Sign-agnostic multiplication, modulo 264.

Stack

[i64 i64] → [i64]

Status

WebAssembly 1.0Standardised in WebAssembly 1.0 (2017)Part of the original WebAssembly release. Supported everywhere WebAssembly is.

Properties

0x7Fi64.div_s

divide, signed

Description

Signed division (result is truncated toward zero).

Stack

[i64 i64] → [i64]

Status

WebAssembly 1.0Standardised in WebAssembly 1.0 (2017)Part of the original WebAssembly release. Supported everywhere WebAssembly is.

Properties

0x80i64.div_u

divide, unsigned

Description

Unsigned division (result is floored).

Stack

[i64 i64] → [i64]

Status

WebAssembly 1.0Standardised in WebAssembly 1.0 (2017)Part of the original WebAssembly release. Supported everywhere WebAssembly is.

Properties

0x81i64.rem_s

remainder after division, signed

Description

Signed remainder (result has the sign of the dividend).

Stack

[i64 i64] → [i64]

Status

WebAssembly 1.0Standardised in WebAssembly 1.0 (2017)Part of the original WebAssembly release. Supported everywhere WebAssembly is.

Properties

0x82i64.rem_u

remainder after division, unsigned

Description

Unsigned remainder.

Stack

[i64 i64] → [i64]

Status

WebAssembly 1.0Standardised in WebAssembly 1.0 (2017)Part of the original WebAssembly release. Supported everywhere WebAssembly is.

Properties

0x83i64.and

bitwise and

Description

Sign-agnostic bitwise AND.

Sets each result bit where that bit is set in both operands.

Stack

[i64 i64] → [i64]

Status

WebAssembly 1.0Standardised in WebAssembly 1.0 (2017)Part of the original WebAssembly release. Supported everywhere WebAssembly is.

Properties

0x84i64.or

bitwise or

Description

Sign-agnostic bitwise inclusive OR.

Sets each result bit where that bit is set in either operand.

Stack

[i64 i64] → [i64]

Status

WebAssembly 1.0Standardised in WebAssembly 1.0 (2017)Part of the original WebAssembly release. Supported everywhere WebAssembly is.

Properties

0x85i64.xor

bitwise exclusive or

Description

Sign-agnostic bitwise exclusive OR (XOR).

Sets each result bit where that bit is set in exactly one of the two operands.

Stack

[i64 i64] → [i64]

Status

WebAssembly 1.0Standardised in WebAssembly 1.0 (2017)Part of the original WebAssembly release. Supported everywhere WebAssembly is.

Properties

0x86i64.shl

shift left

Description

Sign-agnostic shift left.

Return the result of shifting i1 left by k bits, modulo 264.

Stack

[i64 i64] → [i64]

Status

WebAssembly 1.0Standardised in WebAssembly 1.0 (2017)Part of the original WebAssembly release. Supported everywhere WebAssembly is.

Properties

0x87i64.shr_s

shift right, signed

Description

Sign-replicating (arithmetic) shift right.

Return the result of shifting i1 right by k bits, extended with the most significant bit of the original value.

Stack

[i64 i64] → [i64]

Status

WebAssembly 1.0Standardised in WebAssembly 1.0 (2017)Part of the original WebAssembly release. Supported everywhere WebAssembly is.

Properties

0x88i64.shr_u

shift right, unsigned

Description

Zero-replicating (logical) shift right.

Return the result of shifting i1 right by k bits, extended with 0 bits.

Stack

[i64 i64] → [i64]

Status

WebAssembly 1.0Standardised in WebAssembly 1.0 (2017)Part of the original WebAssembly release. Supported everywhere WebAssembly is.

Properties

0x89i64.rotl

rotate bits left

Description

Sign-agnostic rotate left.

Return the result of rotating i1 left by k bits.

Stack

[i64 i64] → [i64]

Status

WebAssembly 1.0Standardised in WebAssembly 1.0 (2017)Part of the original WebAssembly release. Supported everywhere WebAssembly is.

Properties

0x8Ai64.rotr

rotate bits right

Description

Sign-agnostic rotate right.

Return the result of rotating i1 right by k bits.

Stack

[i64 i64] → [i64]

Status

WebAssembly 1.0Standardised in WebAssembly 1.0 (2017)Part of the original WebAssembly release. Supported everywhere WebAssembly is.

Properties

0x8Bf32.abs

absolute value

Description

Absolute value.

Stack

[f32] → [f32]

Status

WebAssembly 1.0Standardised in WebAssembly 1.0 (2017)Part of the original WebAssembly release. Supported everywhere WebAssembly is.

Properties

0x8Cf32.neg

negate

Description

Negation.

Stack

[f32] → [f32]

Status

WebAssembly 1.0Standardised in WebAssembly 1.0 (2017)Part of the original WebAssembly release. Supported everywhere WebAssembly is.

Properties

0x8Df32.ceil

round up to the nearest integer

Description

Ceiling operator.

Stack

[f32] → [f32]

Status

WebAssembly 1.0Standardised in WebAssembly 1.0 (2017)Part of the original WebAssembly release. Supported everywhere WebAssembly is.

Properties

0x8Ef32.floor

round down to the nearest integer

Description

Floor operator.

Stack

[f32] → [f32]

Status

WebAssembly 1.0Standardised in WebAssembly 1.0 (2017)Part of the original WebAssembly release. Supported everywhere WebAssembly is.

Properties

0x8Ff32.trunc

round toward zero

Description

Round to nearest integer towards zero.

Stack

[f32] → [f32]

Status

WebAssembly 1.0Standardised in WebAssembly 1.0 (2017)Part of the original WebAssembly release. Supported everywhere WebAssembly is.

Properties

0x90f32.nearest

round to the nearest integer, ties to even

Description

Round to nearest integer, ties to even.

Stack

[f32] → [f32]

Status

WebAssembly 1.0Standardised in WebAssembly 1.0 (2017)Part of the original WebAssembly release. Supported everywhere WebAssembly is.

Properties

0x91f32.sqrt

square root

Description

Square root.

Stack

[f32] → [f32]

Status

WebAssembly 1.0Standardised in WebAssembly 1.0 (2017)Part of the original WebAssembly release. Supported everywhere WebAssembly is.

Properties

0x92f32.add

add

Description

Addition.

Stack

[f32 f32] → [f32]

Status

WebAssembly 1.0Standardised in WebAssembly 1.0 (2017)Part of the original WebAssembly release. Supported everywhere WebAssembly is.

Properties

0x93f32.sub

subtract

Description

Subtraction.

Stack

[f32 f32] → [f32]

Status

WebAssembly 1.0Standardised in WebAssembly 1.0 (2017)Part of the original WebAssembly release. Supported everywhere WebAssembly is.

Properties

0x94f32.mul

multiply

Description

Multiplication.

Stack

[f32 f32] → [f32]

Status

WebAssembly 1.0Standardised in WebAssembly 1.0 (2017)Part of the original WebAssembly release. Supported everywhere WebAssembly is.

Properties

0x95f32.div

divide

Description

Division.

partial function: division by 0 is undefined.

Stack

[f32 f32] → [f32]

Status

WebAssembly 1.0Standardised in WebAssembly 1.0 (2017)Part of the original WebAssembly release. Supported everywhere WebAssembly is.

Properties

0x96f32.min

smaller of the two

Description

Minimum (binary operator); if either operand is NaN, returns NaN.

Stack

[f32 f32] → [f32]

Status

WebAssembly 1.0Standardised in WebAssembly 1.0 (2017)Part of the original WebAssembly release. Supported everywhere WebAssembly is.

Properties

0x97f32.max

larger of the two

Description

Maximum (binary operator); if either operand is NaN, returns NaN.

Stack

[f32 f32] → [f32]

Status

WebAssembly 1.0Standardised in WebAssembly 1.0 (2017)Part of the original WebAssembly release. Supported everywhere WebAssembly is.

Properties

0x98f32.copysign

magnitude of the first, sign of the second

Description

If z1 and z2 have the same sign, then return z1. Else return z1 with negated sign.

Stack

[f32 f32] → [f32]

Status

WebAssembly 1.0Standardised in WebAssembly 1.0 (2017)Part of the original WebAssembly release. Supported everywhere WebAssembly is.

Properties

0x99f64.abs

absolute value

Description

Absolute value.

Stack

[f64] → [f64]

Status

WebAssembly 1.0Standardised in WebAssembly 1.0 (2017)Part of the original WebAssembly release. Supported everywhere WebAssembly is.

Properties

0x9Af64.neg

negate

Description

Negation.

Stack

[f64] → [f64]

Status

WebAssembly 1.0Standardised in WebAssembly 1.0 (2017)Part of the original WebAssembly release. Supported everywhere WebAssembly is.

Properties

0x9Bf64.ceil

round up to the nearest integer

Description

Ceiling operator.

Stack

[f64] → [f64]

Status

WebAssembly 1.0Standardised in WebAssembly 1.0 (2017)Part of the original WebAssembly release. Supported everywhere WebAssembly is.

Properties

0x9Cf64.floor

round down to the nearest integer

Description

Floor operator.

Stack

[f64] → [f64]

Status

WebAssembly 1.0Standardised in WebAssembly 1.0 (2017)Part of the original WebAssembly release. Supported everywhere WebAssembly is.

Properties

0x9Df64.trunc

round toward zero

Description

Round to nearest integer towards zero.

Stack

[f64] → [f64]

Status

WebAssembly 1.0Standardised in WebAssembly 1.0 (2017)Part of the original WebAssembly release. Supported everywhere WebAssembly is.

Properties

0x9Ef64.nearest

round to the nearest integer, ties to even

Description

Round to nearest integer, ties to even.

Stack

[f64] → [f64]

Status

WebAssembly 1.0Standardised in WebAssembly 1.0 (2017)Part of the original WebAssembly release. Supported everywhere WebAssembly is.

Properties

0x9Ff64.sqrt

square root

Description

Square root.

Stack

[f64] → [f64]

Status

WebAssembly 1.0Standardised in WebAssembly 1.0 (2017)Part of the original WebAssembly release. Supported everywhere WebAssembly is.

Properties

0xA0f64.add

add

Description

Addition.

Stack

[f64 f64] → [f64]

Status

WebAssembly 1.0Standardised in WebAssembly 1.0 (2017)Part of the original WebAssembly release. Supported everywhere WebAssembly is.

Properties

0xA1f64.sub

subtract

Description

Subtraction.

Stack

[f64 f64] → [f64]

Status

WebAssembly 1.0Standardised in WebAssembly 1.0 (2017)Part of the original WebAssembly release. Supported everywhere WebAssembly is.

Properties

0xA2f64.mul

multiply

Description

Multiplication.

Stack

[f64 f64] → [f64]

Status

WebAssembly 1.0Standardised in WebAssembly 1.0 (2017)Part of the original WebAssembly release. Supported everywhere WebAssembly is.

Properties

0xA3f64.div

divide

Description

Division.

partial function: division by 0 is undefined.

Stack

[f64 f64] → [f64]

Status

WebAssembly 1.0Standardised in WebAssembly 1.0 (2017)Part of the original WebAssembly release. Supported everywhere WebAssembly is.

Properties

0xA4f64.min

smaller of the two

Description

Minimum (binary operator); if either operand is NaN, returns NaN.

Stack

[f64 f64] → [f64]

Status

WebAssembly 1.0Standardised in WebAssembly 1.0 (2017)Part of the original WebAssembly release. Supported everywhere WebAssembly is.

Properties

0xA5f64.max

larger of the two

Description

Maximum (binary operator); if either operand is NaN, returns NaN.

Stack

[f64 f64] → [f64]

Status

WebAssembly 1.0Standardised in WebAssembly 1.0 (2017)Part of the original WebAssembly release. Supported everywhere WebAssembly is.

Properties

0xA6f64.copysign

magnitude of the first, sign of the second

Description

If z1 and z2 have the same sign, then return z1. Else return z1 with negated sign.

Stack

[f64 f64] → [f64]

Status

WebAssembly 1.0Standardised in WebAssembly 1.0 (2017)Part of the original WebAssembly release. Supported everywhere WebAssembly is.

Properties

0xA7i32.wrap_i64

discard the high bits to fit a narrower type

Description

Wraps a 64-bit integer to a 32-bit integer.

Keeps the low 32 bits, which is the operand modulo 232.

Stack

[i64] → [i32]

Status

WebAssembly 1.0Standardised in WebAssembly 1.0 (2017)Part of the original WebAssembly release. Supported everywhere WebAssembly is.

Properties

0xA8i32.trunc_f32_s

float to integer, trapping out of range, signed

Description

Truncate a 32-bit float to a signed 32-bit integer.

Stack

[f32] → [i32]

Status

WebAssembly 1.0Standardised in WebAssembly 1.0 (2017)Part of the original WebAssembly release. Supported everywhere WebAssembly is.

Properties

0xA9i32.trunc_f32_u

float to integer, trapping out of range, unsigned

Description

Truncate a 32-bit float to an unsigned 32-bit integer.

Stack

[f32] → [i32]

Status

WebAssembly 1.0Standardised in WebAssembly 1.0 (2017)Part of the original WebAssembly release. Supported everywhere WebAssembly is.

Properties

0xAAi32.trunc_f64_s

float to integer, trapping out of range, signed

Description

Truncate a 64-bit float to a signed 32-bit integer.

Stack

[f64] → [i32]

Status

WebAssembly 1.0Standardised in WebAssembly 1.0 (2017)Part of the original WebAssembly release. Supported everywhere WebAssembly is.

Properties

0xABi32.trunc_f64_u

float to integer, trapping out of range, unsigned

Description

Truncate a 64-bit float to an unsigned 32-bit integer.

Stack

[f64] → [i32]

Status

WebAssembly 1.0Standardised in WebAssembly 1.0 (2017)Part of the original WebAssembly release. Supported everywhere WebAssembly is.

Properties

0xACi64.extend_i32_s

widen, keeping the value, signed

Description

Extend a signed 32-bit integer to a 64-bit integer.

Stack

[i32] → [i64]

Status

WebAssembly 1.0Standardised in WebAssembly 1.0 (2017)Part of the original WebAssembly release. Supported everywhere WebAssembly is.

Properties

0xADi64.extend_i32_u

widen, keeping the value, unsigned

Description

Extend an unsigned 32-bit integer to a 64-bit integer.

Stack

[i32] → [i64]

Status

WebAssembly 1.0Standardised in WebAssembly 1.0 (2017)Part of the original WebAssembly release. Supported everywhere WebAssembly is.

Properties

0xAEi64.trunc_f32_s

float to integer, trapping out of range, signed

Description

Truncate a 32-bit float to a signed 64-bit integer.

Stack

[f32] → [i64]

Status

WebAssembly 1.0Standardised in WebAssembly 1.0 (2017)Part of the original WebAssembly release. Supported everywhere WebAssembly is.

Properties

0xAFi64.trunc_f32_u

float to integer, trapping out of range, unsigned

Description

Truncate a 32-bit float to an unsigned 64-bit integer.

Stack

[f32] → [i64]

Status

WebAssembly 1.0Standardised in WebAssembly 1.0 (2017)Part of the original WebAssembly release. Supported everywhere WebAssembly is.

Properties

0xB0i64.trunc_f64_s

float to integer, trapping out of range, signed

Description

Truncate a 64-bit float to a signed 64-bit integer.

Stack

[f64] → [i64]

Status

WebAssembly 1.0Standardised in WebAssembly 1.0 (2017)Part of the original WebAssembly release. Supported everywhere WebAssembly is.

Properties

0xB1i64.trunc_f64_u

float to integer, trapping out of range, unsigned

Description

Truncate a 64-bit float to an unsigned 64-bit integer.

Stack

[f64] → [i64]

Status

WebAssembly 1.0Standardised in WebAssembly 1.0 (2017)Part of the original WebAssembly release. Supported everywhere WebAssembly is.

Properties

0xB2f32.convert_i32_s

integer to floating point, signed

Description

Convert a signed 32-bit integer to a 32-bit float.

Stack

[i32] → [f32]

Status

WebAssembly 1.0Standardised in WebAssembly 1.0 (2017)Part of the original WebAssembly release. Supported everywhere WebAssembly is.

Properties

0xB3f32.convert_i32_u

integer to floating point, unsigned

Description

Convert an unsigned 32-bit integer to a 32-bit float.

Stack

[i32] → [f32]

Status

WebAssembly 1.0Standardised in WebAssembly 1.0 (2017)Part of the original WebAssembly release. Supported everywhere WebAssembly is.

Properties

0xB4f32.convert_i64_s

integer to floating point, signed

Description

Convert a signed 64-bit integer to a 32-bit float.

Stack

[i64] → [f32]

Status

WebAssembly 1.0Standardised in WebAssembly 1.0 (2017)Part of the original WebAssembly release. Supported everywhere WebAssembly is.

Properties

0xB5f32.convert_i64_u

integer to floating point, unsigned

Description

Convert an unsigned 64-bit integer to a 32-bit float.

Stack

[i64] → [f32]

Status

WebAssembly 1.0Standardised in WebAssembly 1.0 (2017)Part of the original WebAssembly release. Supported everywhere WebAssembly is.

Properties

0xB6f32.demote_f64

to the narrower float type

Description

Demote a 64-bit float to a 32-bit float.

Stack

[f64] → [f32]

Status

WebAssembly 1.0Standardised in WebAssembly 1.0 (2017)Part of the original WebAssembly release. Supported everywhere WebAssembly is.

Properties

0xB7f64.convert_i32_s

integer to floating point, signed

Description

Convert a signed 32-bit integer to a 64-bit float.

Stack

[i32] → [f64]

Status

WebAssembly 1.0Standardised in WebAssembly 1.0 (2017)Part of the original WebAssembly release. Supported everywhere WebAssembly is.

Properties

0xB8f64.convert_i32_u

integer to floating point, unsigned

Description

Convert an unsigned 32-bit integer to a 64-bit float.

Stack

[i32] → [f64]

Status

WebAssembly 1.0Standardised in WebAssembly 1.0 (2017)Part of the original WebAssembly release. Supported everywhere WebAssembly is.

Properties

0xB9f64.convert_i64_s

integer to floating point, signed

Description

Convert a signed 64-bit integer to a 64-bit float.

Stack

[i64] → [f64]

Status

WebAssembly 1.0Standardised in WebAssembly 1.0 (2017)Part of the original WebAssembly release. Supported everywhere WebAssembly is.

Properties

0xBAf64.convert_i64_u

integer to floating point, unsigned

Description

Convert an unsigned 64-bit integer to a 64-bit float.

Stack

[i64] → [f64]

Status

WebAssembly 1.0Standardised in WebAssembly 1.0 (2017)Part of the original WebAssembly release. Supported everywhere WebAssembly is.

Properties

0xBBf64.promote_f32

to the wider float type

Description

Promote a 32-bit float to a 64-bit float.

Stack

[f32] → [f64]

Status

WebAssembly 1.0Standardised in WebAssembly 1.0 (2017)Part of the original WebAssembly release. Supported everywhere WebAssembly is.

Properties

0xBCi32.reinterpret_f32

same bits, read as the other type

Description

Reinterpret the bits of a 32-bit float as a 32-bit integer.

Stack

[f32] → [i32]

Status

WebAssembly 1.0Standardised in WebAssembly 1.0 (2017)Part of the original WebAssembly release. Supported everywhere WebAssembly is.

Properties

0xBDi64.reinterpret_f64

same bits, read as the other type

Description

Reinterpret the bits of a 64-bit float as a 64-bit integer.

Stack

[f64] → [i64]

Status

WebAssembly 1.0Standardised in WebAssembly 1.0 (2017)Part of the original WebAssembly release. Supported everywhere WebAssembly is.

Properties

0xBEf32.reinterpret_i32

same bits, read as the other type

Description

Reinterpret the bits of a 32-bit integer as a 32-bit float.

Stack

[i32] → [f32]

Status

WebAssembly 1.0Standardised in WebAssembly 1.0 (2017)Part of the original WebAssembly release. Supported everywhere WebAssembly is.

Properties

0xBFf64.reinterpret_i64

same bits, read as the other type

Description

Reinterpret the bits of a 64-bit integer as a 64-bit float.

Stack

[i64] → [f64]

Status

WebAssembly 1.0Standardised in WebAssembly 1.0 (2017)Part of the original WebAssembly release. Supported everywhere WebAssembly is.

Properties

0xC0i32.extend8_s

widen, keeping the value, signed

Description

Extend a signed 8-bit integer to a 32-bit integer.

Sign-extension operators extension.

Stack

[i32] → [i32]

Status

Sign-extension operatorsStandardised in WebAssembly 2.0 (2022)Standardised and supported by every current engine.Engine support

Properties

0xC1i32.extend16_s

widen, keeping the value, signed

Description

Extend a signed 16-bit integer to a 32-bit integer.

Sign-extension operators extension.

Stack

[i32] → [i32]

Status

Sign-extension operatorsStandardised in WebAssembly 2.0 (2022)Standardised and supported by every current engine.Engine support

Properties

0xC2i64.extend8_s

widen, keeping the value, signed

Description

Extend a signed 8-bit integer to a 64-bit integer.

Sign-extension operators extension.

Stack

[i64] → [i64]

Status

Sign-extension operatorsStandardised in WebAssembly 2.0 (2022)Standardised and supported by every current engine.Engine support

Properties

0xC3i64.extend16_s

widen, keeping the value, signed

Description

Extend a signed 16-bit integer to a 64-bit integer.

Sign-extension operators extension.

Stack

[i64] → [i64]

Status

Sign-extension operatorsStandardised in WebAssembly 2.0 (2022)Standardised and supported by every current engine.Engine support

Properties

0xC4i64.extend32_s

widen, keeping the value, signed

Description

Extend a signed 32-bit integer to a 64-bit integer.

Sign-extension operators extension.

Stack

[i64] → [i64]

Status

Sign-extension operatorsStandardised in WebAssembly 2.0 (2022)Standardised and supported by every current engine.Engine support

Properties

0xD0ref.null ht

Description

Evaluates to the null reference constant.

Stack

[] → [(ref null ht)]

The result type is named by the immediate.

Immediate operands

  1. s33 ht : heaptype — a negative one-byte value is an abstract type (0x70 func, 0x6F extern, 0x6E any, 0x6D eq, 0x6C i31, 0x6B struct, 0x6A array, 0x69 exn, 0x74 noexn, 0x73 nofunc, 0x72 noextern, 0x71 none); a value of 0 or more is a typeidx

Status

Reference typesStandardised in WebAssembly 2.0 (2022)Standardised and supported by every current engine.Engine support

Encoded across 2 tables:

Properties

0xD1ref.is_null

Description

Checks for null.

Stack

[(ref null ht)] → [i32]

1 if the reference is null, 0 if not.

Status

Reference typesStandardised in WebAssembly 2.0 (2022)Standardised and supported by every current engine.Engine support

Encoded across 2 tables:

Properties

0xD2ref.func x

Description

Creates a reference to a given function.

Stack

[] → [(ref x)]

A non-null reference to function x.

Immediate operands

  1. u32 x : funcidx

Status

Reference typesStandardised in WebAssembly 2.0 (2022)Standardised and supported by every current engine.Engine support

Encoded across 2 tables:

Properties

0xD3ref.eq

equal

Description

[eqref eqref] -> [i32].

Stack

[eqref eqref] → [i32]

1 if the two are the same reference or both null, 0 otherwise.

Status

Garbage collectionStandardised in WebAssembly 3.0 (2025)Standardised as part of WebAssembly 3.0 and shipping in browsers since late 2023. These encodings replace the 2022 draft, which used *_canon names and a sparser numbering.Engine support

Encoded across 2 tables:

Properties

0xD4ref.as_non_null

Description

Converts a nullable reference to a non-nullable one or traps if null.

Stack

[(ref null ht)] → [(ref ht)]

Traps on null.

Status

Typed function referencesStandardised in WebAssembly 3.0 (2025)Standardised. Shipping in current browsers; check support if you target older engines.Engine support

Properties

0xD5br_on_null l

Description

Converts a nullable reference to a non-nullable one or branches if null.

Stack

[t* (ref null ht)] → [t* (ref ht)]

Branches to l if the reference is null; otherwise leaves it on the stack, now known to be non-null.

Immediate operands

  1. u32 l : labelidx

Status

Typed function referencesStandardised in WebAssembly 3.0 (2025)Standardised. Shipping in current browsers; check support if you target older engines.Engine support

Properties

0xD6br_on_non_null l

Description

Checks for null and branches if present.

Stack

[t* (ref null ht)] → [t*]

Branches to l if the reference is not null, carrying it to the label; otherwise leaves nothing.

Immediate operands

  1. u32 l : labelidx

Status

Typed function referencesStandardised in WebAssembly 3.0 (2025)Standardised. Shipping in current browsers; check support if you target older engines.Engine support

Properties

0xE0cont.new x

Description

Part of the stack switching proposal, which adds continuations so a module can run several execution stacks — coroutines, generators, async/await and lightweight threads.

Stack

[(ref null ft)] → [(ref x)]

ft is the function type that continuation type x wraps. Turns a function into a continuation that has not started running.

Immediate operands

  1. u32 x : typeidx

Status

Stack switching

Proposal: Phase 3 (2026)

Adds continuations for coroutines, generators and async. Encoding not final.Engine support

Properties

0xE1cont.bind x y

Description

Part of the stack switching proposal, which adds continuations so a module can run several execution stacks — coroutines, generators, async/await and lightweight threads.

Stack

[t* (ref null x)] → [(ref y)]

Types: t* are arguments bound into the continuation ahead of time, which is why y takes fewer parameters than x. The specification writes them t3*.

Immediate operands

  1. u32 x : typeidx
  2. u32 y : typeidx

Status

Stack switching

Proposal: Phase 3 (2026)

Adds continuations for coroutines, generators and async. Encoding not final.Engine support

Properties

0xE2suspend x

Description

Part of the stack switching proposal, which adds continuations so a module can run several execution stacks — coroutines, generators, async/await and lightweight threads.

Stack

[t1*] → [t2*]

t1* and t2* are the parameters and results of tag x. Suspends to the nearest handler for that tag.

Immediate operands

  1. u32 x : tagidx

Status

Stack switching

Proposal: Phase 3 (2026)

Adds continuations for coroutines, generators and async. Encoding not final.Engine support

Properties

0xE3resume x h*

Description

Part of the stack switching proposal, which adds continuations so a module can run several execution stacks — coroutines, generators, async/await and lightweight threads.

Stack

[t1* (ref null x)] → [t2*]

t1* and t2* are the parameters and results of continuation type x. The handler clauses say where control goes if the continuation suspends.

Immediate operands

  1. u32 x : typeidx
  2. h* : list(handler)

Status

Stack switching

Proposal: Phase 3 (2026)

Adds continuations for coroutines, generators and async. Encoding not final.Engine support

Properties

0xE4resume_throw x e h*

Description

Part of the stack switching proposal, which adds continuations so a module can run several execution stacks — coroutines, generators, async/await and lightweight threads.

Stack

[t* (ref null x)] → [t2*]

Types: t* are the parameters of tag e, raised at the point where the continuation suspended. t2* are the results of continuation type x.

Immediate operands

  1. u32 x : typeidx
  2. u32 e : tagidx
  3. h* : list(handler)

Status

Stack switching

Proposal: Phase 3 (2026)

Adds continuations for coroutines, generators and async. Encoding not final.Engine support

Properties

0xE5resume_throw_ref x h*

Description

Part of the stack switching proposal, which adds continuations so a module can run several execution stacks — coroutines, generators, async/await and lightweight threads.

Stack

[exnref (ref null x)] → [t2*]

Takes an existing exception reference rather than a tag’s parameters, as throw_ref does beside throw. t2* are the results of continuation type x.

Immediate operands

  1. u32 x : typeidx
  2. h* : list(handler)

Status

Stack switching

Proposal: Phase 3 (2026)

Adds continuations for coroutines, generators and async. Encoding not final.Engine support

Properties

0xE6switch x y

Description

Part of the stack switching proposal, which adds continuations so a module can run several execution stacks — coroutines, generators, async/await and lightweight threads.

Stack

[t1* (ref null x)] → [t2*]

t1* and t2* are the parameters and results of continuation type x. Switches straight to another continuation rather than suspending to a handler.

Immediate operands

  1. u32 x : typeidx
  2. u32 y : tagidx

Status

Stack switching

Proposal: Phase 3 (2026)

Adds continuations for coroutines, generators and async. Encoding not final.Engine support

Properties

0xFBopcode prefix

The first byte (prefix) of a multi-byte opcode. While the prefix is always a single byte, the sub-opcode which follows is variable-length: an unsigned 32-bit integer stored with Little Endian Base 128 (LEB128) encoding. For multi-byte opcodes, the prefix and sub-opcode together form an opcode. An opcode is 2-bytes when the sub-opcode has a value 0 to 127, and 3-bytes when it reaches 128, at which point variable encoding begins to differ from typical integer representations. The theoretical maximum for a 2-byte sub-opcode (in a 3-byte opcode) is 16,383. The instructions (opcodes) prefixed with 0xFB are listed in Table B.

Description

Sub-opcodes listed in:

  • Table B 39 opcodes
    • sub-opcodes 038

Proposals in this range:

Superseded, abandoned and dormant encodings (49)

0xFCopcode prefix

The first byte (prefix) of a multi-byte opcode. While the prefix is always a single byte, the sub-opcode which follows is variable-length: an unsigned 32-bit integer stored with Little Endian Base 128 (LEB128) encoding. For multi-byte opcodes, the prefix and sub-opcode together form an opcode. An opcode is 2-bytes when the sub-opcode has a value 0 to 127, and 3-bytes when it reaches 128, at which point variable encoding begins to differ from typical integer representations. The theoretical maximum for a 2-byte sub-opcode (in a 3-byte opcode) is 16,383. The instructions (opcodes) prefixed with 0xFC are listed in Table C.

Description

Sub-opcodes listed in:

  • Table C 24 opcodes
    • sub-opcodes 049

Proposals in this range:

0xFDopcode prefix

The first byte (prefix) of a multi-byte opcode. While the prefix is always a single byte, the sub-opcode which follows is variable-length: an unsigned 32-bit integer stored with Little Endian Base 128 (LEB128) encoding. For multi-byte opcodes, the prefix and sub-opcode together form an opcode. An opcode is 2-bytes when the sub-opcode has a value 0 to 127, and 3-bytes when it reaches 128, at which point variable encoding begins to differ from typical integer representations. The theoretical maximum for a 2-byte sub-opcode (in a 3-byte opcode) is 16,383. The instructions (opcodes) prefixed with 0xFD are listed in Table D SIMD.

Description

Sub-opcodes listed in:

Proposals in this range:

Superseded, abandoned and dormant encodings (17)

0xFEopcode prefix

The first byte (prefix) of a multi-byte opcode. While the prefix is always a single byte, the sub-opcode which follows is variable-length: an unsigned 32-bit integer stored with Little Endian Base 128 (LEB128) encoding. For multi-byte opcodes, the prefix and sub-opcode together form an opcode. An opcode is 2-bytes when the sub-opcode has a value 0 to 127, and 3-bytes when it reaches 128, at which point variable encoding begins to differ from typical integer representations. The theoretical maximum for a 2-byte sub-opcode (in a 3-byte opcode) is 16,383. The instructions (opcodes) prefixed with 0xFE are listed in Table E Threads & Atomics.

Description

Sub-opcodes listed in:

Proposals in this range:

0xFB 0:u32struct.new x

Description

Allocates a struct of type x, taking one value per field from the stack.

Stack

[t*] → [(ref x)]

One value per field of type x, in declaration order. A packed i8 or i16 field takes an i32.

Immediate operands

  1. u32 x : typeidx

Status

Garbage collectionStandardised in WebAssembly 3.0 (2025)Standardised as part of WebAssembly 3.0 and shipping in browsers since late 2023. These encodings replace the 2022 draft, which used *_canon names and a sparser numbering.Engine support

Encoded across 2 tables:

Properties

0xFB 1:u32struct.new_default x

Description

Allocates a struct of type x with every field at its default value.

Stack

[] → [(ref x)]

Every field gets the default value for its type.

Immediate operands

  1. u32 x : typeidx

Status

Garbage collectionStandardised in WebAssembly 3.0 (2025)Standardised as part of WebAssembly 3.0 and shipping in browsers since late 2023. These encodings replace the 2022 draft, which used *_canon names and a sparser numbering.Engine support

Encoded across 2 tables:

Properties

0xFB 2:u32struct.get x y

Description

Reads field y of struct type x.

Stack

[(ref null x)] → [t]

t is the type of field y. Only for an unpacked field. A packed i8 or i16 field is read with get_s or get_u, which extend it into an i32. Traps on a null reference.

Immediate operands

  1. u32 x : typeidx
  2. u32 y : fieldidx

Status

Garbage collectionStandardised in WebAssembly 3.0 (2025)Standardised as part of WebAssembly 3.0 and shipping in browsers since late 2023. These encodings replace the 2022 draft, which used *_canon names and a sparser numbering.Engine support

Encoded across 2 tables:

Properties

0xFB 3:u32struct.get_s x y

Description

Reads packed field y of struct type x, sign-extending it into an i32.

Stack

[(ref null x)] → [i32]

Packed field: it is an i8 or an i16, so it is read into an i32: sign-extended by struct.get_s, zero-extended by struct.get_u.

Immediate operands

  1. u32 x : typeidx
  2. u32 y : fieldidx

Status

Garbage collectionStandardised in WebAssembly 3.0 (2025)Standardised as part of WebAssembly 3.0 and shipping in browsers since late 2023. These encodings replace the 2022 draft, which used *_canon names and a sparser numbering.Engine support

Encoded across 2 tables:

Properties

0xFB 4:u32struct.get_u x y

Description

Reads packed field y of struct type x, zero-extending it into an i32.

Stack

[(ref null x)] → [i32]

Packed field: it is an i8 or an i16, so it is read into an i32: sign-extended by struct.get_s, zero-extended by struct.get_u.

Immediate operands

  1. u32 x : typeidx
  2. u32 y : fieldidx

Status

Garbage collectionStandardised in WebAssembly 3.0 (2025)Standardised as part of WebAssembly 3.0 and shipping in browsers since late 2023. These encodings replace the 2022 draft, which used *_canon names and a sparser numbering.Engine support

Encoded across 2 tables:

Properties

0xFB 5:u32struct.set x y

Description

Writes field y of struct type x.

Stack

[(ref null x) t] → []

t is the type of field y, which must be mutable. Traps on a null reference.

Immediate operands

  1. u32 x : typeidx
  2. u32 y : fieldidx

Status

Garbage collectionStandardised in WebAssembly 3.0 (2025)Standardised as part of WebAssembly 3.0 and shipping in browsers since late 2023. These encodings replace the 2022 draft, which used *_canon names and a sparser numbering.Engine support

Encoded across 2 tables:

Properties

0xFB 6:u32array.new x

Description

Allocates an array of type x, every element set to the same value.

Stack

[t i32] → [(ref x)]

t is the element type of x: the value to fill with, then how many elements.

Immediate operands

  1. u32 x : typeidx

Status

Garbage collectionStandardised in WebAssembly 3.0 (2025)Standardised as part of WebAssembly 3.0 and shipping in browsers since late 2023. These encodings replace the 2022 draft, which used *_canon names and a sparser numbering.Engine support

Encoded across 2 tables:

Properties

0xFB 7:u32array.new_default x

Description

Allocates an array of type x with every element at its default value.

Stack

[i32] → [(ref x)]

How many elements; each gets the default value for the element type.

Immediate operands

  1. u32 x : typeidx

Status

Garbage collectionStandardised in WebAssembly 3.0 (2025)Standardised as part of WebAssembly 3.0 and shipping in browsers since late 2023. These encodings replace the 2022 draft, which used *_canon names and a sparser numbering.Engine support

Encoded across 2 tables:

Properties

0xFB 8:u32array.new_fixed x n

Description

Allocates an array of type x with a fixed number of elements, taken from the stack.

Stack

[t*] → [(ref x)]

One value per element. How many there are is the immediate n, not an operand.

Immediate operands

  1. u32 x : typeidx
  2. u32 n — the number of elements

Status

Garbage collectionStandardised in WebAssembly 3.0 (2025)Standardised as part of WebAssembly 3.0 and shipping in browsers since late 2023. These encodings replace the 2022 draft, which used *_canon names and a sparser numbering.Engine support

Encoded across 2 tables:

Properties

0xFB 9:u32array.new_data x y

Description

Allocates an array of type x, initialised from data segment y.

Stack

[i32 i32] → [(ref x)]

Offset into data segment y, then how many elements to read from it.

Immediate operands

  1. u32 x : typeidx
  2. u32 y : dataidx

Status

Garbage collectionStandardised in WebAssembly 3.0 (2025)Standardised as part of WebAssembly 3.0 and shipping in browsers since late 2023. These encodings replace the 2022 draft, which used *_canon names and a sparser numbering.Engine support

Encoded across 2 tables:

Properties

0xFB 10:u32array.new_elem x y

Description

Allocates an array of type x, initialised from element segment y.

Stack

[i32 i32] → [(ref x)]

Offset into element segment y, then how many elements to read from it.

Immediate operands

  1. u32 x : typeidx
  2. u32 y : elemidx

Status

Garbage collectionStandardised in WebAssembly 3.0 (2025)Standardised as part of WebAssembly 3.0 and shipping in browsers since late 2023. These encodings replace the 2022 draft, which used *_canon names and a sparser numbering.Engine support

Encoded across 2 tables:

Properties

0xFB 11:u32array.get x

Description

Reads an element from an array.

Stack

[(ref null x) i32] → [t]

The array, then the index. t is the element type of x. Only for an unpacked field. A packed i8 or i16 field is read with get_s or get_u, which extend it into an i32. Traps on a null reference.

Immediate operands

  1. u32 x : typeidx

Status

Garbage collectionStandardised in WebAssembly 3.0 (2025)Standardised as part of WebAssembly 3.0 and shipping in browsers since late 2023. These encodings replace the 2022 draft, which used *_canon names and a sparser numbering.Engine support

Encoded across 2 tables:

Properties

0xFB 12:u32array.get_s x

Description

Reads a packed element of array type x, sign-extending it into an i32.

Stack

[(ref null x) i32] → [i32]

Packed field: it is an i8 or an i16, so it is read into an i32: sign-extended by array.get_s, zero-extended by array.get_u.

Immediate operands

  1. u32 x : typeidx

Status

Garbage collectionStandardised in WebAssembly 3.0 (2025)Standardised as part of WebAssembly 3.0 and shipping in browsers since late 2023. These encodings replace the 2022 draft, which used *_canon names and a sparser numbering.Engine support

Encoded across 2 tables:

Properties

0xFB 13:u32array.get_u x

Description

Reads a packed element of array type x, zero-extending it into an i32.

Stack

[(ref null x) i32] → [i32]

Packed field: it is an i8 or an i16, so it is read into an i32: sign-extended by array.get_s, zero-extended by array.get_u.

Immediate operands

  1. u32 x : typeidx

Status

Garbage collectionStandardised in WebAssembly 3.0 (2025)Standardised as part of WebAssembly 3.0 and shipping in browsers since late 2023. These encodings replace the 2022 draft, which used *_canon names and a sparser numbering.Engine support

Encoded across 2 tables:

Properties

0xFB 14:u32array.set x

Description

Writes an element to an array.

Stack

[(ref null x) i32 t] → []

Array, index, then the value. The element type must be mutable. Traps on a null reference.

Immediate operands

  1. u32 x : typeidx

Status

Garbage collectionStandardised in WebAssembly 3.0 (2025)Standardised as part of WebAssembly 3.0 and shipping in browsers since late 2023. These encodings replace the 2022 draft, which used *_canon names and a sparser numbering.Engine support

Encoded across 2 tables:

Properties

0xFB 15:u32array.len

Description

Inquires the length of an array.

Stack

[(ref null array)] → [i32]

Takes any array. Traps on null.

Status

Garbage collectionStandardised in WebAssembly 3.0 (2025)Standardised as part of WebAssembly 3.0 and shipping in browsers since late 2023. These encodings replace the 2022 draft, which used *_canon names and a sparser numbering.Engine support

Encoded across 2 tables:

Properties

0xFB 16:u32array.fill x

Description

Sets a range of an array’s elements to one value.

Stack

[(ref null x) i32 t i32] → []

Array, the offset to start at, the value to write, then how many elements. Traps on a null reference, or on the range running past the end.

Immediate operands

  1. u32 x : typeidx

Status

Garbage collectionStandardised in WebAssembly 3.0 (2025)Standardised as part of WebAssembly 3.0 and shipping in browsers since late 2023. These encodings replace the 2022 draft, which used *_canon names and a sparser numbering.Engine support

Encoded across 2 tables:

Properties

0xFB 17:u32array.copy x y

Description

Copies a range of elements from one array to another. Both may be the same array.

Stack

[(ref null x) i32 (ref null y) i32 i32] → []

Destination array and offset, source array and offset, then how many elements. Traps on either being null, or on either range running past the end.

Immediate operands

  1. u32 x : typeidx
  2. u32 y : typeidx

Status

Garbage collectionStandardised in WebAssembly 3.0 (2025)Standardised as part of WebAssembly 3.0 and shipping in browsers since late 2023. These encodings replace the 2022 draft, which used *_canon names and a sparser numbering.Engine support

Encoded across 2 tables:

Properties

0xFB 18:u32array.init_data x y

Description

Copies bytes from data segment y into a range of an array.

The array’s elements have to be numeric or packed, since a data segment is raw bytes.

Stack

[(ref null x) i32 i32 i32] → []

Array, the offset to start at, the offset into data segment y, then how many elements.

Immediate operands

  1. u32 x : typeidx
  2. u32 y : dataidx

Status

Garbage collectionStandardised in WebAssembly 3.0 (2025)Standardised as part of WebAssembly 3.0 and shipping in browsers since late 2023. These encodings replace the 2022 draft, which used *_canon names and a sparser numbering.Engine support

Encoded across 2 tables:

Properties

0xFB 19:u32array.init_elem x y

Description

Copies references from element segment y into a range of an array.

Stack

[(ref null x) i32 i32 i32] → []

Array, the offset to start at, the offset into element segment y, then how many elements.

Immediate operands

  1. u32 x : typeidx
  2. u32 y : elemidx

Status

Garbage collectionStandardised in WebAssembly 3.0 (2025)Standardised as part of WebAssembly 3.0 and shipping in browsers since late 2023. These encodings replace the 2022 draft, which used *_canon names and a sparser numbering.Engine support

Encoded across 2 tables:

Properties

0xFB 20:u32ref.test ht

Description

Checks whether a reference has a given heap type.

Stack

[(ref null ht′)] → [i32]

Types: ht′ is any supertype of ht, so the operand may be any reference in the same type hierarchy. Pushes 1 if the reference matches, 0 if not, and 0 for null.

Immediate operands

  1. s33 ht : heaptype — a negative one-byte value is an abstract type (0x70 func, 0x6F extern, 0x6E any, 0x6D eq, 0x6C i31, 0x6B struct, 0x6A array, 0x69 exn, 0x74 noexn, 0x73 nofunc, 0x72 noextern, 0x71 none); a value of 0 or more is a typeidx

Status

Garbage collectionStandardised in WebAssembly 3.0 (2025)Standardised as part of WebAssembly 3.0 and shipping in browsers since late 2023. These encodings replace the 2022 draft, which used *_canon names and a sparser numbering.Engine support

Encoded across 2 tables:

Properties

0xFB 21:u32ref.test null ht

Description

Checks whether a reference has a given heap type.

Stack

[(ref null ht′)] → [i32]

Types: ht′ is any supertype of ht, so the operand may be any reference in the same type hierarchy. Pushes 1 if the reference matches, 0 if not. Null counts as a match.

Immediate operands

  1. s33 ht : heaptype — a negative one-byte value is an abstract type (0x70 func, 0x6F extern, 0x6E any, 0x6D eq, 0x6C i31, 0x6B struct, 0x6A array, 0x69 exn, 0x74 noexn, 0x73 nofunc, 0x72 noextern, 0x71 none); a value of 0 or more is a typeidx

Status

Garbage collectionStandardised in WebAssembly 3.0 (2025)Standardised as part of WebAssembly 3.0 and shipping in browsers since late 2023. These encodings replace the 2022 draft, which used *_canon names and a sparser numbering.Engine support

Encoded across 2 tables:

Properties

0xFB 22:u32ref.cast ht

Description

Tries to convert to a given heap type.

Stack

[(ref null ht′)] → [(ref ht)]

Types: ht′ is any supertype of ht, so the operand may be any reference in the same type hierarchy. Traps if the reference does not match, and on null.

Immediate operands

  1. s33 ht : heaptype — a negative one-byte value is an abstract type (0x70 func, 0x6F extern, 0x6E any, 0x6D eq, 0x6C i31, 0x6B struct, 0x6A array, 0x69 exn, 0x74 noexn, 0x73 nofunc, 0x72 noextern, 0x71 none); a value of 0 or more is a typeidx

Status

Garbage collectionStandardised in WebAssembly 3.0 (2025)Standardised as part of WebAssembly 3.0 and shipping in browsers since late 2023. These encodings replace the 2022 draft, which used *_canon names and a sparser numbering.Engine support

Encoded across 2 tables:

Properties

0xFB 23:u32ref.cast null ht

Description

Tries to convert to a given heap type.

Stack

[(ref null ht′)] → [(ref null ht)]

Types: ht′ is any supertype of ht, so the operand may be any reference in the same type hierarchy. Traps if the reference does not match. Null passes.

Immediate operands

  1. s33 ht : heaptype — a negative one-byte value is an abstract type (0x70 func, 0x6F extern, 0x6E any, 0x6D eq, 0x6C i31, 0x6B struct, 0x6A array, 0x69 exn, 0x74 noexn, 0x73 nofunc, 0x72 noextern, 0x71 none); a value of 0 or more is a typeidx

Status

Garbage collectionStandardised in WebAssembly 3.0 (2025)Standardised as part of WebAssembly 3.0 and shipping in browsers since late 2023. These encodings replace the 2022 draft, which used *_canon names and a sparser numbering.Engine support

Encoded across 2 tables:

Properties

0xFB 24:u32br_on_cast f l ht1 ht2

Description

Branches if a reference has a given heap type.

Stack

[t* rt1] → [t* rt1\rt2]

rt1 and rt2 are the two immediate heap types, each made nullable or not by a bit of the castflags byte. Branches to l with the reference typed rt2 if it matches; otherwise leaves it on the stack with rt2 subtracted from its type, which is what the backslash means.

Immediate operands

  1. u8 f : castflags — which of the two heap types is nullable
  2. u32 l : labelidx
  3. s33 ht1 : heaptype — a negative one-byte value is an abstract type (0x70 func, 0x6F extern, 0x6E any, 0x6D eq, 0x6C i31, 0x6B struct, 0x6A array, 0x69 exn, 0x74 noexn, 0x73 nofunc, 0x72 noextern, 0x71 none); a value of 0 or more is a typeidx — the source type
  4. s33 ht2 : heaptype — a negative one-byte value is an abstract type (0x70 func, 0x6F extern, 0x6E any, 0x6D eq, 0x6C i31, 0x6B struct, 0x6A array, 0x69 exn, 0x74 noexn, 0x73 nofunc, 0x72 noextern, 0x71 none); a value of 0 or more is a typeidx — the type being tested for

Status

Garbage collectionStandardised in WebAssembly 3.0 (2025)Standardised as part of WebAssembly 3.0 and shipping in browsers since late 2023. These encodings replace the 2022 draft, which used *_canon names and a sparser numbering.Engine support

Encoded across 2 tables:

Properties

0xFB 25:u32br_on_cast_fail f l ht1 ht2

Description

Branches if a reference does not have a given heap type.

Stack

[t* rt1] → [t* rt2]

rt1 and rt2 are the two immediate heap types, each made nullable or not by a bit of the castflags byte. The mirror of br_on_cast: branches when the reference does not match.

Immediate operands

  1. u8 f : castflags — which of the two heap types is nullable
  2. u32 l : labelidx
  3. s33 ht1 : heaptype — a negative one-byte value is an abstract type (0x70 func, 0x6F extern, 0x6E any, 0x6D eq, 0x6C i31, 0x6B struct, 0x6A array, 0x69 exn, 0x74 noexn, 0x73 nofunc, 0x72 noextern, 0x71 none); a value of 0 or more is a typeidx — the source type
  4. s33 ht2 : heaptype — a negative one-byte value is an abstract type (0x70 func, 0x6F extern, 0x6E any, 0x6D eq, 0x6C i31, 0x6B struct, 0x6A array, 0x69 exn, 0x74 noexn, 0x73 nofunc, 0x72 noextern, 0x71 none); a value of 0 or more is a typeidx — the type being tested for

Status

Garbage collectionStandardised in WebAssembly 3.0 (2025)Standardised as part of WebAssembly 3.0 and shipping in browsers since late 2023. These encodings replace the 2022 draft, which used *_canon names and a sparser numbering.Engine support

Encoded across 2 tables:

Properties

0xFB 26:u32any.convert_extern

integer to floating point

Description

Converts an external value into the internal representation.

Stack

[externref] → [anyref]

Nullability is carried through: a non-null operand gives a non-null result, and null converts to null.

Status

Garbage collectionStandardised in WebAssembly 3.0 (2025)Standardised as part of WebAssembly 3.0 and shipping in browsers since late 2023. These encodings replace the 2022 draft, which used *_canon names and a sparser numbering.Engine support

Encoded across 2 tables:

Properties

0xFB 27:u32extern.convert_any

integer to floating point

Description

Converts an internal value into the external representation.

Stack

[anyref] → [externref]

Nullability is carried through: a non-null operand gives a non-null result, and null converts to null.

Status

Garbage collectionStandardised in WebAssembly 3.0 (2025)Standardised as part of WebAssembly 3.0 and shipping in browsers since late 2023. These encodings replace the 2022 draft, which used *_canon names and a sparser numbering.Engine support

Encoded across 2 tables:

Properties

0xFB 28:u32ref.i31

Description

Creates an i31ref from a 32 bit value, truncating high bit.

Stack

[i32] → [(ref i31)]

Only the low 31 bits are kept; the value is not boxed on the heap.

Status

Garbage collectionStandardised in WebAssembly 3.0 (2025)Standardised as part of WebAssembly 3.0 and shipping in browsers since late 2023. These encodings replace the 2022 draft, which used *_canon names and a sparser numbering.Engine support

Encoded across 2 tables:

Properties

0xFB 29:u32i31.get_s

Description

Extracts the value, sign-extending.

Stack

[(ref null i31)] → [i32]

Sign-extends the 31-bit value to i32. Traps on a null reference.

Status

Garbage collectionStandardised in WebAssembly 3.0 (2025)Standardised as part of WebAssembly 3.0 and shipping in browsers since late 2023. These encodings replace the 2022 draft, which used *_canon names and a sparser numbering.Engine support

Encoded across 2 tables:

Properties

0xFB 30:u32i31.get_u

Description

Extracts the value, zero-extending.

Stack

[(ref null i31)] → [i32]

Zero-extends the 31-bit value to i32. Traps on a null reference.

Status

Garbage collectionStandardised in WebAssembly 3.0 (2025)Standardised as part of WebAssembly 3.0 and shipping in browsers since late 2023. These encodings replace the 2022 draft, which used *_canon names and a sparser numbering.Engine support

Encoded across 2 tables:

Properties

0xFB 31:u32ref.i31_shared

Description

Creates a shared i31ref from a 32-bit value, truncating the high bit.

Stack

[i32] → [(ref (shared i31))]

As ref.i31, but the result may be passed between threads.

Status

Shared-everything threads

Proposal: Phase 1 (2023)

Implemented behind a flag in V8, but still an early proposal. Extends atomics from linear memory to globals, tables and GC objects. Encoding not final.

Encoded across 2 tables:

Properties

0xFB 32:u32struct.new_desc x

Description

Allocates a struct with an explicit descriptor, taking the descriptor and the field values.

The 2022 draft of the GC proposal used this byte for i31.new; that draft was replaced before it was standardised, and the byte is being assigned again.

Stack

[t* (ref null (exact y))] → [(ref (exact x))]

The field values, then the descriptor on top. y is the descriptor type declared for x.

Immediate operands

  1. u32 x : typeidx

Status

Custom descriptors

Proposal: Phase 3 (2026)

Attaches a value of your own choosing to each GC type, which is what a language needs to put a prototype or vtable on an object. Encoding not final.

Properties

0xFB 33:u32struct.new_default_desc x

Description

Allocates a struct with an explicit descriptor, its fields set to their defaults.

The 2022 draft of the GC proposal used this byte for i31.get_s; that draft was replaced before it was standardised, and the byte is being assigned again.

Stack

[(ref null (exact y))] → [(ref (exact x))]

The descriptor. Every field gets the default value for its type.

Immediate operands

  1. u32 x : typeidx

Status

Custom descriptors

Proposal: Phase 3 (2026)

Attaches a value of your own choosing to each GC type, which is what a language needs to put a prototype or vtable on an object. Encoding not final.

Properties

0xFB 34:u32ref.get_desc x

Description

Reads the descriptor a reference was allocated with.

The 2022 draft of the GC proposal used this byte for i31.get_u; that draft was replaced before it was standardised, and the byte is being assigned again.

Stack

[(ref null (exact x))] → [(ref (exact y))]

y is the descriptor type declared for x. Traps on a null reference.

Immediate operands

  1. u32 x : typeidx

Status

Custom descriptors

Proposal: Phase 3 (2026)

Attaches a value of your own choosing to each GC type, which is what a language needs to put a prototype or vtable on an object. Encoding not final.

Properties

0xFB 35:u32ref.cast_desc_eq ht

Description

Casts a reference, checking that its descriptor is the one given rather than checking its type.

Stack

[(ref null ht) (ref null (exact y))] → [(ref (exact x))]

Types: x is the type named by the immediate and y its declared descriptor type. The reference to cast comes first, then the descriptor to compare it against; the cast succeeds where the reference’s own descriptor is that same object. Traps on a mismatch, and on null.

Immediate operands

  1. s33 ht : heaptype — a negative one-byte value is an abstract type (0x70 func, 0x6F extern, 0x6E any, 0x6D eq, 0x6C i31, 0x6B struct, 0x6A array, 0x69 exn, 0x74 noexn, 0x73 nofunc, 0x72 noextern, 0x71 none); a value of 0 or more is a typeidx

Status

Custom descriptors

Proposal: Phase 3 (2026)

Attaches a value of your own choosing to each GC type, which is what a language needs to put a prototype or vtable on an object. Encoding not final.

Properties

0xFB 36:u32ref.cast_desc_eq null ht

Description

Casts a reference, checking that its descriptor is the one given rather than checking its type. The nullable form.

Stack

[(ref null ht) (ref null (exact y))] → [(ref null (exact x))]

Types: x is the type named by the immediate and y its declared descriptor type. The reference to cast comes first, then the descriptor to compare it against; the cast succeeds where the reference’s own descriptor is that same object. Traps on a mismatch. Null passes.

Immediate operands

  1. s33 ht : heaptype — a negative one-byte value is an abstract type (0x70 func, 0x6F extern, 0x6E any, 0x6D eq, 0x6C i31, 0x6B struct, 0x6A array, 0x69 exn, 0x74 noexn, 0x73 nofunc, 0x72 noextern, 0x71 none); a value of 0 or more is a typeidx

Status

Custom descriptors

Proposal: Phase 3 (2026)

Attaches a value of your own choosing to each GC type, which is what a language needs to put a prototype or vtable on an object. Encoding not final.

Properties

0xFB 37:u32br_on_cast_desc_eq f l ht1 ht2

Description

Branches if a reference’s descriptor is the one given.

Stack

[t* rt1 (ref null (exact y))] → [t* rt1\rt2]

Types: rt1 and rt2 are the two immediate heap types, each made nullable or not by a bit of the castflags byte. Matches on descriptor identity rather than on the type alone. Branches to l with the reference typed rt2 if it matches; otherwise leaves it with rt2 subtracted from its type, which is what the backslash means.

Immediate operands

  1. u8 f : castflags — which of the two heap types is nullable
  2. u32 l : labelidx
  3. s33 ht1 : heaptype — a negative one-byte value is an abstract type (0x70 func, 0x6F extern, 0x6E any, 0x6D eq, 0x6C i31, 0x6B struct, 0x6A array, 0x69 exn, 0x74 noexn, 0x73 nofunc, 0x72 noextern, 0x71 none); a value of 0 or more is a typeidx — the source type
  4. s33 ht2 : heaptype — a negative one-byte value is an abstract type (0x70 func, 0x6F extern, 0x6E any, 0x6D eq, 0x6C i31, 0x6B struct, 0x6A array, 0x69 exn, 0x74 noexn, 0x73 nofunc, 0x72 noextern, 0x71 none); a value of 0 or more is a typeidx — the type being tested for

Status

Custom descriptors

Proposal: Phase 3 (2026)

Attaches a value of your own choosing to each GC type, which is what a language needs to put a prototype or vtable on an object. Encoding not final.

Properties

0xFB 38:u32br_on_cast_desc_eq_fail f l ht1 ht2

Description

Branches if a reference’s descriptor is not the one given.

Stack

[t* rt1 (ref null (exact y))] → [t* rt2]

Types: rt1 and rt2 are the two immediate heap types, each made nullable or not by a bit of the castflags byte. The mirror of br_on_cast_desc_eq: branches when the reference does not match.

Immediate operands

  1. u8 f : castflags — which of the two heap types is nullable
  2. u32 l : labelidx
  3. s33 ht1 : heaptype — a negative one-byte value is an abstract type (0x70 func, 0x6F extern, 0x6E any, 0x6D eq, 0x6C i31, 0x6B struct, 0x6A array, 0x69 exn, 0x74 noexn, 0x73 nofunc, 0x72 noextern, 0x71 none); a value of 0 or more is a typeidx — the source type
  4. s33 ht2 : heaptype — a negative one-byte value is an abstract type (0x70 func, 0x6F extern, 0x6E any, 0x6D eq, 0x6C i31, 0x6B struct, 0x6A array, 0x69 exn, 0x74 noexn, 0x73 nofunc, 0x72 noextern, 0x71 none); a value of 0 or more is a typeidx — the type being tested for

Status

Custom descriptors

Proposal: Phase 3 (2026)

Attaches a value of your own choosing to each GC type, which is what a language needs to put a prototype or vtable on an object. Encoding not final.

Properties

0xFB 64:u32ref.test ht

Description

An encoding from the 2022 draft of the GC proposal. The final encoding, standardised in 2023, has this as ref.test (0xFB 20).

Stack

[(ref null ht′)] → [i32]

2022 draft: a draft encoding, abandoned before the proposal was finished. The instruction it became is typed the same way.

Immediate operands

  1. s33 ht : heaptype — a negative one-byte value is an abstract type (0x70 func, 0x6F extern, 0x6E any, 0x6D eq, 0x6C i31, 0x6B struct, 0x6A array, 0x69 exn, 0x74 noexn, 0x73 nofunc, 0x72 noextern, 0x71 none); a value of 0 or more is a typeidx

Status

GC, 2022 draft

Withdrawn (2023)Replaced by ref.test (0xFB 20)

An encoding from the draft of the garbage collection proposal, replaced before it was standardised. These slots are unassigned today; the entries are here because old modules and old tools may still use them.

Properties

0xFB 65:u32ref.cast ht

Description

An encoding from the 2022 draft of the GC proposal. The final encoding, standardised in 2023, has this as ref.cast (0xFB 22).

Stack

[(ref null ht′)] → [(ref ht)]

2022 draft: a draft encoding, abandoned before the proposal was finished. The instruction it became is typed the same way.

Immediate operands

  1. s33 ht : heaptype — a negative one-byte value is an abstract type (0x70 func, 0x6F extern, 0x6E any, 0x6D eq, 0x6C i31, 0x6B struct, 0x6A array, 0x69 exn, 0x74 noexn, 0x73 nofunc, 0x72 noextern, 0x71 none); a value of 0 or more is a typeidx

Status

GC, 2022 draft

Withdrawn (2023)Replaced by ref.cast (0xFB 22)

An encoding from the draft of the garbage collection proposal, replaced before it was standardised. These slots are unassigned today; the entries are here because old modules and old tools may still use them.

Properties

0xFB 66:u32br_on_cast f l ht1 ht2

Description

An encoding from the 2022 draft of the GC proposal. The final encoding, standardised in 2023, has this as br_on_cast (0xFB 24).

Stack

[t* rt1] → [t* rt1]

2022 draft: a draft encoding, abandoned before the proposal was finished. It took only a labelidx and a single heaptype, with no castflags byte.

Immediate operands

  1. u8 f : castflags — which of the two heap types is nullable
  2. u32 l : labelidx
  3. s33 ht1 : heaptype — a negative one-byte value is an abstract type (0x70 func, 0x6F extern, 0x6E any, 0x6D eq, 0x6C i31, 0x6B struct, 0x6A array, 0x69 exn, 0x74 noexn, 0x73 nofunc, 0x72 noextern, 0x71 none); a value of 0 or more is a typeidx — the source type
  4. s33 ht2 : heaptype — a negative one-byte value is an abstract type (0x70 func, 0x6F extern, 0x6E any, 0x6D eq, 0x6C i31, 0x6B struct, 0x6A array, 0x69 exn, 0x74 noexn, 0x73 nofunc, 0x72 noextern, 0x71 none); a value of 0 or more is a typeidx — the type being tested for

Status

GC, 2022 draft

Withdrawn (2023)Replaced by br_on_cast (0xFB 24)

An encoding from the draft of the garbage collection proposal, replaced before it was standardised. These slots are unassigned today; the entries are here because old modules and old tools may still use them.

Properties

0xFB 67:u32br_on_cast_fail f l ht1 ht2

Description

An encoding from the 2022 draft of the GC proposal. The final encoding, standardised in 2023, has this as br_on_cast_fail (0xFB 25).

Stack

[t* rt1] → [t* rt2]

2022 draft: a draft encoding, abandoned before the proposal was finished. It took only a labelidx and a single heaptype, with no castflags byte.

Immediate operands

  1. u8 f : castflags — which of the two heap types is nullable
  2. u32 l : labelidx
  3. s33 ht1 : heaptype — a negative one-byte value is an abstract type (0x70 func, 0x6F extern, 0x6E any, 0x6D eq, 0x6C i31, 0x6B struct, 0x6A array, 0x69 exn, 0x74 noexn, 0x73 nofunc, 0x72 noextern, 0x71 none); a value of 0 or more is a typeidx — the source type
  4. s33 ht2 : heaptype — a negative one-byte value is an abstract type (0x70 func, 0x6F extern, 0x6E any, 0x6D eq, 0x6C i31, 0x6B struct, 0x6A array, 0x69 exn, 0x74 noexn, 0x73 nofunc, 0x72 noextern, 0x71 none); a value of 0 or more is a typeidx — the type being tested for

Status

GC, 2022 draft

Withdrawn (2023)Replaced by br_on_cast_fail (0xFB 25)

An encoding from the draft of the garbage collection proposal, replaced before it was standardised. These slots are unassigned today; the entries are here because old modules and old tools may still use them.

Properties

0xFB 72:u32ref.test ht

Description

An encoding from the 2022 draft of the GC proposal. The final encoding, standardised in 2023, has this as ref.test null (0xFB 21).

Stack

[(ref null ht′)] → [i32]

2022 draft: a draft encoding, abandoned before the proposal was finished. The instruction it became is typed the same way.

Immediate operands

  1. s33 ht : heaptype — a negative one-byte value is an abstract type (0x70 func, 0x6F extern, 0x6E any, 0x6D eq, 0x6C i31, 0x6B struct, 0x6A array, 0x69 exn, 0x74 noexn, 0x73 nofunc, 0x72 noextern, 0x71 none); a value of 0 or more is a typeidx

Status

GC, 2022 draft

Withdrawn (2023)Replaced by ref.test null (0xFB 21)

An encoding from the draft of the garbage collection proposal, replaced before it was standardised. These slots are unassigned today; the entries are here because old modules and old tools may still use them.

Properties

0xFB 73:u32ref.cast ht

Description

An encoding from the 2022 draft of the GC proposal. The final encoding, standardised in 2023, has this as ref.cast null (0xFB 23).

Stack

[(ref null ht′)] → [(ref null ht)]

2022 draft: a draft encoding, abandoned before the proposal was finished. The instruction it became is typed the same way.

Immediate operands

  1. s33 ht : heaptype — a negative one-byte value is an abstract type (0x70 func, 0x6F extern, 0x6E any, 0x6D eq, 0x6C i31, 0x6B struct, 0x6A array, 0x69 exn, 0x74 noexn, 0x73 nofunc, 0x72 noextern, 0x71 none); a value of 0 or more is a typeidx

Status

GC, 2022 draft

Withdrawn (2023)Replaced by ref.cast null (0xFB 23)

An encoding from the draft of the garbage collection proposal, replaced before it was standardised. These slots are unassigned today; the entries are here because old modules and old tools may still use them.

Properties

0xFB 74:u32br_on_cast f l ht1 ht2

Description

An encoding from the 2022 draft of the GC proposal. The final encoding, standardised in 2023, has this as br_on_cast (0xFB 24).

Stack

[t* rt1] → [t* rt1]

2022 draft: a draft encoding, abandoned before the proposal was finished. It took only a labelidx and a single heaptype, with no castflags byte.

Immediate operands

  1. u8 f : castflags — which of the two heap types is nullable
  2. u32 l : labelidx
  3. s33 ht1 : heaptype — a negative one-byte value is an abstract type (0x70 func, 0x6F extern, 0x6E any, 0x6D eq, 0x6C i31, 0x6B struct, 0x6A array, 0x69 exn, 0x74 noexn, 0x73 nofunc, 0x72 noextern, 0x71 none); a value of 0 or more is a typeidx — the source type
  4. s33 ht2 : heaptype — a negative one-byte value is an abstract type (0x70 func, 0x6F extern, 0x6E any, 0x6D eq, 0x6C i31, 0x6B struct, 0x6A array, 0x69 exn, 0x74 noexn, 0x73 nofunc, 0x72 noextern, 0x71 none); a value of 0 or more is a typeidx — the type being tested for

Status

GC, 2022 draft

Withdrawn (2023)Replaced by br_on_cast (0xFB 24)

An encoding from the draft of the garbage collection proposal, replaced before it was standardised. These slots are unassigned today; the entries are here because old modules and old tools may still use them.

Properties

0xFB 75:u32br_on_cast_fail f l ht1 ht2

Description

An encoding from the 2022 draft of the GC proposal. The final encoding, standardised in 2023, has this as br_on_cast_fail (0xFB 25).

Stack

[t* rt1] → [t* rt2]

2022 draft: a draft encoding, abandoned before the proposal was finished. It took only a labelidx and a single heaptype, with no castflags byte.

Immediate operands

  1. u8 f : castflags — which of the two heap types is nullable
  2. u32 l : labelidx
  3. s33 ht1 : heaptype — a negative one-byte value is an abstract type (0x70 func, 0x6F extern, 0x6E any, 0x6D eq, 0x6C i31, 0x6B struct, 0x6A array, 0x69 exn, 0x74 noexn, 0x73 nofunc, 0x72 noextern, 0x71 none); a value of 0 or more is a typeidx — the source type
  4. s33 ht2 : heaptype — a negative one-byte value is an abstract type (0x70 func, 0x6F extern, 0x6E any, 0x6D eq, 0x6C i31, 0x6B struct, 0x6A array, 0x69 exn, 0x74 noexn, 0x73 nofunc, 0x72 noextern, 0x71 none); a value of 0 or more is a typeidx — the type being tested for

Status

GC, 2022 draft

Withdrawn (2023)Replaced by br_on_cast_fail (0xFB 25)

An encoding from the draft of the garbage collection proposal, replaced before it was standardised. These slots are unassigned today; the entries are here because old modules and old tools may still use them.

Properties

0xFB 112:u32extern.internalize

Description

An encoding from the 2022 draft of the GC proposal. The final encoding, standardised in 2023, has this as any.convert_extern (0xFB 26).

Stack

[externref] → [anyref]

2022 draft: a draft encoding, abandoned before the proposal was finished. The instruction it became is typed the same way.

Status

GC, 2022 draft

Withdrawn (2023)Replaced by any.convert_extern (0xFB 26)

An encoding from the draft of the garbage collection proposal, replaced before it was standardised. These slots are unassigned today; the entries are here because old modules and old tools may still use them.

Properties

0xFB 113:u32extern.externalize

Description

An encoding from the 2022 draft of the GC proposal. The final encoding, standardised in 2023, has this as extern.convert_any (0xFB 27).

Stack

[anyref] → [externref]

2022 draft: a draft encoding, abandoned before the proposal was finished. The instruction it became is typed the same way.

Status

GC, 2022 draft

Withdrawn (2023)Replaced by extern.convert_any (0xFB 27)

An encoding from the draft of the garbage collection proposal, replaced before it was standardised. These slots are unassigned today; the entries are here because old modules and old tools may still use them.

Properties

0xFB 128:u32string.new_utf8 x

Description

Reads UTF-8 bytes from memory and returns a new string. Traps if they are not valid UTF-8.

Stack

[i32 i32] → [stringref]

Address in memory x, then how many code units to read.

Immediate operands

  1. u32 x : memidx

Addresses: an i32 for a 32-bit memory, an i64 for a 64-bit memory (memory64). The signatures here show the 32-bit case, which is what almost every module uses.

Status

Reference-typed strings

Dormant: Phase 1 (2023)

No engine implements it, and the encoding may still change. Included for reference rather than for use.Engine support

Properties

0xFB 129:u32string.new_wtf16 x

Description

Reads 16-bit code units from memory and returns a new string.

WTF-16: UTF-16 extended to allow isolated surrogates, which is exactly what a JavaScript string is.

Stack

[i32 i32] → [stringref]

Address in memory x, then how many 16-bit code units to read.

Immediate operands

  1. u32 x : memidx

Addresses: an i32 for a 32-bit memory, an i64 for a 64-bit memory (memory64). The signatures here show the 32-bit case, which is what almost every module uses.

Status

Reference-typed strings

Dormant: Phase 1 (2023)

No engine implements it, and the encoding may still change. Included for reference rather than for use.Engine support

Properties

0xFB 130:u32string.const x

Description

Pushes a string named by the immediate, from the module’s strings section.

Nothing is built at run time, so this is a constant instruction and can be used in a global’s initialiser.

Stack

[] → [stringref]

Immediate operands

  1. u32 x : stringidx — index into the module’s strings custom section

Status

Reference-typed strings

Dormant: Phase 1 (2023)

No engine implements it, and the encoding may still change. Included for reference rather than for use.Engine support

Properties

0xFB 131:u32string.measure_utf8

Description

Measures the string without encoding it, so a caller can allocate before calling string.encode_utf8.

Stack

[stringref] → [i32]

How many bytes the string would take as UTF-8, or −1 if it contains an isolated surrogate, which UTF-8 cannot represent.

Status

Reference-typed strings

Dormant: Phase 1 (2023)

No engine implements it, and the encoding may still change. Included for reference rather than for use.Engine support

Properties

0xFB 132:u32string.measure_wtf8

Description

Measures the string in WTF-8, which is also what a lossy UTF-8 encoding would need: an isolated surrogate takes three bytes in WTF-8, and so does the U+FFFD that replaces it.

WTF-8: UTF-8 extended to allow isolated surrogates, the lone halves of surrogate pairs that a JavaScript string can hold and UTF-8 cannot encode.

Stack

[stringref] → [i32]

How many bytes the string takes in this encoding.

Status

Reference-typed strings

Dormant: Phase 1 (2023)

No engine implements it, and the encoding may still change. Included for reference rather than for use.Engine support

Properties

0xFB 133:u32string.measure_wtf16

Description

Measures the string in WTF-16, so a caller can allocate before calling string.encode_wtf16.

WTF-16: UTF-16 extended to allow isolated surrogates, which is exactly what a JavaScript string is.

Stack

[stringref] → [i32]

How many 16-bit code units the string takes in this encoding.

Status

Reference-typed strings

Dormant: Phase 1 (2023)

No engine implements it, and the encoding may still change. Included for reference rather than for use.Engine support

Properties

0xFB 134:u32string.encode_utf8 x

Description

Writes the string to memory as UTF-8. Traps on an isolated surrogate, which UTF-8 cannot encode.

Nothing bounds the write but the memory itself, so measure first.

Stack

[stringref i32] → [i32]

The string, then the destination address in memory x. Pushes how many code units were written.

Immediate operands

  1. u32 x : memidx

Addresses: an i32 for a 32-bit memory, an i64 for a 64-bit memory (memory64). The signatures here show the 32-bit case, which is what almost every module uses.

Status

Reference-typed strings

Dormant: Phase 1 (2023)

No engine implements it, and the encoding may still change. Included for reference rather than for use.Engine support

Properties

0xFB 135:u32string.encode_wtf16 x

Description

Writes the string to memory as 16-bit code units, little-endian.

WTF-16: UTF-16 extended to allow isolated surrogates, which is exactly what a JavaScript string is.

Stack

[stringref i32] → [i32]

The string, then the destination address in memory x. Pushes how many code units were written.

Immediate operands

  1. u32 x : memidx

Addresses: an i32 for a 32-bit memory, an i64 for a 64-bit memory (memory64). The signatures here show the 32-bit case, which is what almost every module uses.

Status

Reference-typed strings

Dormant: Phase 1 (2023)

No engine implements it, and the encoding may still change. Included for reference rather than for use.Engine support

Properties

0xFB 136:u32string.concat

Description

Returns a new string: the first followed by the second.

Stack

[stringref stringref] → [stringref]

Status

Reference-typed strings

Dormant: Phase 1 (2023)

No engine implements it, and the encoding may still change. Included for reference rather than for use.Engine support

Properties

0xFB 137:u32string.eq

equal

Description

Compares two strings by contents, not by identity.

Stack

[stringref stringref] → [i32]

1 if the two strings have the same contents, 0 if not. Two nulls are equal and one null is not: this is the only string instruction that accepts a null reference, and the rest trap on one.

Status

Reference-typed strings

Dormant: Phase 1 (2023)

No engine implements it, and the encoding may still change. Included for reference rather than for use.Engine support

Properties

0xFB 138:u32string.is_usv_sequence

Description

Tests whether the string can be encoded as UTF-8 at all. A 0 means it holds an isolated surrogate, so string.encode_utf8 would trap on it.

Stack

[stringref] → [i32]

1 if the string is a sequence of Unicode scalar values, with no isolated surrogates, and 0 if not.

Status

Reference-typed strings

Dormant: Phase 1 (2023)

No engine implements it, and the encoding may still change. Included for reference rather than for use.Engine support

Properties

0xFB 139:u32string.new_lossy_utf8 x

Description

Reads UTF-8 bytes from memory and returns a new string, putting U+FFFD in place of anything invalid. Never traps on the contents.

Stack

[i32 i32] → [stringref]

Address in memory x, then how many code units to read.

Immediate operands

  1. u32 x : memidx

Addresses: an i32 for a 32-bit memory, an i64 for a 64-bit memory (memory64). The signatures here show the 32-bit case, which is what almost every module uses.

Status

Reference-typed strings

Dormant: Phase 1 (2023)

No engine implements it, and the encoding may still change. Included for reference rather than for use.Engine support

Properties

0xFB 140:u32string.new_wtf8 x

Description

Reads WTF-8 bytes from memory and returns a new string. Traps if they are not valid WTF-8.

WTF-8: UTF-8 extended to allow isolated surrogates, the lone halves of surrogate pairs that a JavaScript string can hold and UTF-8 cannot encode.

Stack

[i32 i32] → [stringref]

Address in memory x, then how many code units to read.

Immediate operands

  1. u32 x : memidx

Addresses: an i32 for a 32-bit memory, an i64 for a 64-bit memory (memory64). The signatures here show the 32-bit case, which is what almost every module uses.

Status

Reference-typed strings

Dormant: Phase 1 (2023)

No engine implements it, and the encoding may still change. Included for reference rather than for use.Engine support

Properties

0xFB 141:u32string.encode_lossy_utf8 x

Description

Writes the string to memory as UTF-8, putting U+FFFD in place of any isolated surrogate. Never traps on the contents.

Nothing bounds the write but the memory itself, so measure first.

Stack

[stringref i32] → [i32]

The string, then the destination address in memory x. Pushes how many code units were written.

Immediate operands

  1. u32 x : memidx

Addresses: an i32 for a 32-bit memory, an i64 for a 64-bit memory (memory64). The signatures here show the 32-bit case, which is what almost every module uses.

Status

Reference-typed strings

Dormant: Phase 1 (2023)

No engine implements it, and the encoding may still change. Included for reference rather than for use.Engine support

Properties

0xFB 142:u32string.encode_wtf8 x

Description

Writes the string to memory as WTF-8, which holds anything a string can contain, so it never traps on the contents.

WTF-8: UTF-8 extended to allow isolated surrogates, the lone halves of surrogate pairs that a JavaScript string can hold and UTF-8 cannot encode.

Stack

[stringref i32] → [i32]

The string, then the destination address in memory x. Pushes how many code units were written.

Immediate operands

  1. u32 x : memidx

Addresses: an i32 for a 32-bit memory, an i64 for a 64-bit memory (memory64). The signatures here show the 32-bit case, which is what almost every module uses.

Status

Reference-typed strings

Dormant: Phase 1 (2023)

No engine implements it, and the encoding may still change. Included for reference rather than for use.Engine support

Properties

0xFB 144:u32string.as_wtf8

Description

Returns a view that reads the string as WTF-8 bytes, for code that works in byte offsets.

WTF-8: UTF-8 extended to allow isolated surrogates, the lone halves of surrogate pairs that a JavaScript string can hold and UTF-8 cannot encode.

Stack

[stringref] → [stringview_wtf8]

View: shares the string’s contents rather than copying them.

Status

Reference-typed strings

Dormant: Phase 1 (2023)

No engine implements it, and the encoding may still change. Included for reference rather than for use.Engine support

Properties

0xFB 145:u32stringview_wtf8.advance

Description

Moves a byte offset forward through the view by at most the given number of bytes, and returns where it reached.

The result is the highest offset that is not past the sum of the two, so it lands between code points and never inside one.

WTF-8: UTF-8 extended to allow isolated surrogates, the lone halves of surrogate pairs that a JavaScript string can hold and UTF-8 cannot encode.

Stack

[stringview_wtf8 i32 i32] → [i32]

The view, the byte offset to start at, then how many bytes to move on. Pushes the offset it reached.

Status

Reference-typed strings

Dormant: Phase 1 (2023)

No engine implements it, and the encoding may still change. Included for reference rather than for use.Engine support

Properties

0xFB 146:u32stringview_wtf8.encode_utf8 x

Description

Writes part of the view to memory as UTF-8, up to a byte count. Traps on an isolated surrogate.

WTF-8: UTF-8 extended to allow isolated surrogates, the lone halves of surrogate pairs that a JavaScript string can hold and UTF-8 cannot encode.

Stack

[stringview_wtf8 i32 i32 i32] → [i32 i32]

The view, the destination address in memory x, the byte offset to start at, then how many bytes to write at most. Pushes the offset it reached, then how many bytes it wrote.

Immediate operands

  1. u32 x : memidx

Addresses: an i32 for a 32-bit memory, an i64 for a 64-bit memory (memory64). The signatures here show the 32-bit case, which is what almost every module uses.

Status

Reference-typed strings

Dormant: Phase 1 (2023)

No engine implements it, and the encoding may still change. Included for reference rather than for use.Engine support

Properties

0xFB 147:u32stringview_wtf8.slice

Description

Returns a new string: the part of the view between two byte offsets, not including the second.

WTF-8: UTF-8 extended to allow isolated surrogates, the lone halves of surrogate pairs that a JavaScript string can hold and UTF-8 cannot encode.

Stack

[stringview_wtf8 i32 i32] → [stringref]

The view, then the start and end byte offsets.

Status

Reference-typed strings

Dormant: Phase 1 (2023)

No engine implements it, and the encoding may still change. Included for reference rather than for use.Engine support

Properties

0xFB 148:u32stringview_wtf8.encode_lossy_utf8 x

Description

Writes part of the view to memory as UTF-8, up to a byte count, putting U+FFFD in place of any isolated surrogate.

WTF-8: UTF-8 extended to allow isolated surrogates, the lone halves of surrogate pairs that a JavaScript string can hold and UTF-8 cannot encode.

Stack

[stringview_wtf8 i32 i32 i32] → [i32 i32]

The view, the destination address in memory x, the byte offset to start at, then how many bytes to write at most. Pushes the offset it reached, then how many bytes it wrote.

Immediate operands

  1. u32 x : memidx

Addresses: an i32 for a 32-bit memory, an i64 for a 64-bit memory (memory64). The signatures here show the 32-bit case, which is what almost every module uses.

Status

Reference-typed strings

Dormant: Phase 1 (2023)

No engine implements it, and the encoding may still change. Included for reference rather than for use.Engine support

Properties

0xFB 149:u32stringview_wtf8.encode_wtf8 x

Description

Writes part of the view to memory as WTF-8, up to a byte count.

WTF-8: UTF-8 extended to allow isolated surrogates, the lone halves of surrogate pairs that a JavaScript string can hold and UTF-8 cannot encode.

Stack

[stringview_wtf8 i32 i32 i32] → [i32 i32]

The view, the destination address in memory x, the byte offset to start at, then how many bytes to write at most. Pushes the offset it reached, then how many bytes it wrote.

Immediate operands

  1. u32 x : memidx

Addresses: an i32 for a 32-bit memory, an i64 for a 64-bit memory (memory64). The signatures here show the 32-bit case, which is what almost every module uses.

Status

Reference-typed strings

Dormant: Phase 1 (2023)

No engine implements it, and the encoding may still change. Included for reference rather than for use.Engine support

Properties

0xFB 152:u32string.as_wtf16

Description

Returns a view that reads the string as 16-bit code units, which is how a JavaScript string is indexed.

WTF-16: UTF-16 extended to allow isolated surrogates, which is exactly what a JavaScript string is.

Stack

[stringref] → [stringview_wtf16]

View: shares the string’s contents rather than copying them.

Status

Reference-typed strings

Dormant: Phase 1 (2023)

No engine implements it, and the encoding may still change. Included for reference rather than for use.Engine support

Properties

0xFB 153:u32stringview_wtf16.length

Description

Returns how many 16-bit code units the string has, which is what a JavaScript string reports as its length.

WTF-16: UTF-16 extended to allow isolated surrogates, which is exactly what a JavaScript string is.

Stack

[stringview_wtf16] → [i32]

Status

Reference-typed strings

Dormant: Phase 1 (2023)

No engine implements it, and the encoding may still change. Included for reference rather than for use.Engine support

Properties

0xFB 154:u32stringview_wtf16.get_codeunit

Description

Reads one 16-bit code unit from the view, by index. Traps at or past the end.

WTF-16: UTF-16 extended to allow isolated surrogates, which is exactly what a JavaScript string is.

Stack

[stringview_wtf16 i32] → [i32]

The view, then the index of the code unit to read.

Status

Reference-typed strings

Dormant: Phase 1 (2023)

No engine implements it, and the encoding may still change. Included for reference rather than for use.Engine support

Properties

0xFB 155:u32stringview_wtf16.encode x

Description

Writes part of the view to memory as 16-bit code units, up to a given count.

WTF-16: UTF-16 extended to allow isolated surrogates, which is exactly what a JavaScript string is.

Stack

[stringview_wtf16 i32 i32 i32] → [i32]

The view, the destination address in memory x, the code-unit offset to start at, then how many code units to write at most. Pushes how many it wrote.

Immediate operands

  1. u32 x : memidx

Addresses: an i32 for a 32-bit memory, an i64 for a 64-bit memory (memory64). The signatures here show the 32-bit case, which is what almost every module uses.

Status

Reference-typed strings

Dormant: Phase 1 (2023)

No engine implements it, and the encoding may still change. Included for reference rather than for use.Engine support

Properties

0xFB 156:u32stringview_wtf16.slice

Description

Returns a new string: the part of the view between two code-unit offsets, not including the second.

WTF-16: UTF-16 extended to allow isolated surrogates, which is exactly what a JavaScript string is.

Stack

[stringview_wtf16 i32 i32] → [stringref]

The view, then the start and end code-unit offsets.

Status

Reference-typed strings

Dormant: Phase 1 (2023)

No engine implements it, and the encoding may still change. Included for reference rather than for use.Engine support

Properties

0xFB 160:u32string.as_iter

Description

Returns a view that walks the string one code point at a time, starting at the beginning.

Unlike the other two views this one carries a position. stringview_iter.next, advance and rewind move it; nothing else does.

Stack

[stringref] → [stringview_iter]

View: shares the string’s contents rather than copying them.

Status

Reference-typed strings

Dormant: Phase 1 (2023)

No engine implements it, and the encoding may still change. Included for reference rather than for use.Engine support

Properties

0xFB 161:u32stringview_iter.next

Description

Returns the code point at the view’s position and moves past it, or −1 if the position is already at the end.

Stack

[stringview_iter] → [i32]

Status

Reference-typed strings

Dormant: Phase 1 (2023)

No engine implements it, and the encoding may still change. Included for reference rather than for use.Engine support

Properties

0xFB 162:u32stringview_iter.advance

Description

Moves the view forward by up to the given number of code points, and returns how many it passed.

Stack

[stringview_iter i32] → [i32]

The view, then how many code points to move. Pushes how many it moved, which is fewer at the end of the string.

Status

Reference-typed strings

Dormant: Phase 1 (2023)

No engine implements it, and the encoding may still change. Included for reference rather than for use.Engine support

Properties

0xFB 163:u32stringview_iter.rewind

Description

Moves the view back by up to the given number of code points, and returns how many it passed.

Stack

[stringview_iter i32] → [i32]

The view, then how many code points to move. Pushes how many it moved, which is fewer at the start of the string.

Status

Reference-typed strings

Dormant: Phase 1 (2023)

No engine implements it, and the encoding may still change. Included for reference rather than for use.Engine support

Properties

0xFB 164:u32stringview_iter.slice

Description

Returns a new string: up to the given number of code points from the view’s position.

Stack

[stringview_iter i32] → [stringref]

The view, then how many code points to take.

Status

Reference-typed strings

Dormant: Phase 1 (2023)

No engine implements it, and the encoding may still change. Included for reference rather than for use.Engine support

Properties

0xFB 176:u32string.new_utf8_array

Description

Reads UTF-8 bytes from an array of i8 and returns a new string. Traps if they are not valid UTF-8.

This form uses a GC array in place of linear memory, for modules that have none.

Stack

[(ref null array) i32 i32] → [stringref]

An array of i8, then the start and end index into it.

Status

Reference-typed strings

Dormant: Phase 1 (2023)

No engine implements it, and the encoding may still change. Included for reference rather than for use.Engine support

Properties

0xFB 177:u32string.new_wtf16_array

Description

Reads 16-bit code units from an array of i16 and returns a new string.

This form uses a GC array in place of linear memory, for modules that have none.

WTF-16: UTF-16 extended to allow isolated surrogates, which is exactly what a JavaScript string is.

Stack

[(ref null array) i32 i32] → [stringref]

An array of i16, then the start and end index into it.

Status

Reference-typed strings

Dormant: Phase 1 (2023)

No engine implements it, and the encoding may still change. Included for reference rather than for use.Engine support

Properties

0xFB 178:u32string.encode_utf8_array

Description

Writes the string into an array of i8 as UTF-8. Traps on an isolated surrogate.

This form uses a GC array in place of linear memory, for modules that have none.

Stack

[stringref (ref null array) i32] → [i32]

The string, a mutable array of i8, then the index to start writing at. Pushes how many code units were written.

Status

Reference-typed strings

Dormant: Phase 1 (2023)

No engine implements it, and the encoding may still change. Included for reference rather than for use.Engine support

Properties

0xFB 179:u32string.encode_wtf16_array

Description

Writes the string into an array of i16.

This form uses a GC array in place of linear memory, for modules that have none.

WTF-16: UTF-16 extended to allow isolated surrogates, which is exactly what a JavaScript string is.

Stack

[stringref (ref null array) i32] → [i32]

The string, a mutable array of i16, then the index to start writing at. Pushes how many code units were written.

Status

Reference-typed strings

Dormant: Phase 1 (2023)

No engine implements it, and the encoding may still change. Included for reference rather than for use.Engine support

Properties

0xFB 180:u32string.new_lossy_utf8_array

Description

Reads UTF-8 bytes from an array of i8 and returns a new string, putting U+FFFD in place of anything invalid.

This form uses a GC array in place of linear memory, for modules that have none.

Stack

[(ref null array) i32 i32] → [stringref]

An array of i8, then the start and end index into it.

Status

Reference-typed strings

Dormant: Phase 1 (2023)

No engine implements it, and the encoding may still change. Included for reference rather than for use.Engine support

Properties

0xFB 181:u32string.new_wtf8_array

Description

Reads WTF-8 bytes from an array of i8 and returns a new string. Traps if they are not valid WTF-8.

This form uses a GC array in place of linear memory, for modules that have none.

WTF-8: UTF-8 extended to allow isolated surrogates, the lone halves of surrogate pairs that a JavaScript string can hold and UTF-8 cannot encode.

Stack

[(ref null array) i32 i32] → [stringref]

An array of i8, then the start and end index into it.

Status

Reference-typed strings

Dormant: Phase 1 (2023)

No engine implements it, and the encoding may still change. Included for reference rather than for use.Engine support

Properties

0xFB 182:u32string.encode_lossy_utf8_array

Description

Writes the string into an array of i8 as UTF-8, putting U+FFFD in place of any isolated surrogate.

This form uses a GC array in place of linear memory, for modules that have none.

Stack

[stringref (ref null array) i32] → [i32]

The string, a mutable array of i8, then the index to start writing at. Pushes how many code units were written.

Status

Reference-typed strings

Dormant: Phase 1 (2023)

No engine implements it, and the encoding may still change. Included for reference rather than for use.Engine support

Properties

0xFB 183:u32string.encode_wtf8_array

Description

Writes the string into an array of i8 as WTF-8.

This form uses a GC array in place of linear memory, for modules that have none.

WTF-8: UTF-8 extended to allow isolated surrogates, the lone halves of surrogate pairs that a JavaScript string can hold and UTF-8 cannot encode.

Stack

[stringref (ref null array) i32] → [i32]

The string, a mutable array of i8, then the index to start writing at. Pushes how many code units were written.

Status

Reference-typed strings

Dormant: Phase 1 (2023)

No engine implements it, and the encoding may still change. Included for reference rather than for use.Engine support

Properties

0xFC 0:u32i32.trunc_sat_f32_s

float to integer, clamped to the range, signed

Description

Saturating form of i32.trunc_f32_s.

Stack

[f32] → [i32]

Status

Non-trapping float-to-int conversionsStandardised in WebAssembly 2.0 (2022)Standardised and supported by every current engine.Engine support

Properties

0xFC 1:u32i32.trunc_sat_f32_u

float to integer, clamped to the range, unsigned

Description

Saturating form of i32.trunc_f32_u.

Stack

[f32] → [i32]

Status

Non-trapping float-to-int conversionsStandardised in WebAssembly 2.0 (2022)Standardised and supported by every current engine.Engine support

Properties

0xFC 2:u32i32.trunc_sat_f64_s

float to integer, clamped to the range, signed

Description

Saturating form of i32.trunc_f64_s.

Stack

[f64] → [i32]

Status

Non-trapping float-to-int conversionsStandardised in WebAssembly 2.0 (2022)Standardised and supported by every current engine.Engine support

Properties

0xFC 3:u32i32.trunc_sat_f64_u

float to integer, clamped to the range, unsigned

Description

Saturating form of i32.trunc_f64_u.

Stack

[f64] → [i32]

Status

Non-trapping float-to-int conversionsStandardised in WebAssembly 2.0 (2022)Standardised and supported by every current engine.Engine support

Properties

0xFC 4:u32i64.trunc_sat_f32_s

float to integer, clamped to the range, signed

Description

Saturating form of i64.trunc_f32_s.

Stack

[f32] → [i64]

Status

Non-trapping float-to-int conversionsStandardised in WebAssembly 2.0 (2022)Standardised and supported by every current engine.Engine support

Properties

0xFC 5:u32i64.trunc_sat_f32_u

float to integer, clamped to the range, unsigned

Description

Saturating form of i64.trunc_f32_u.

Stack

[f32] → [i64]

Status

Non-trapping float-to-int conversionsStandardised in WebAssembly 2.0 (2022)Standardised and supported by every current engine.Engine support

Properties

0xFC 6:u32i64.trunc_sat_f64_s

float to integer, clamped to the range, signed

Description

Saturating form of i64.trunc_f64_s.

Stack

[f64] → [i64]

Status

Non-trapping float-to-int conversionsStandardised in WebAssembly 2.0 (2022)Standardised and supported by every current engine.Engine support

Properties

0xFC 7:u32i64.trunc_sat_f64_u

float to integer, clamped to the range, unsigned

Description

Saturating form of i64.trunc_f64_u.

Stack

[f64] → [i64]

Status

Non-trapping float-to-int conversionsStandardised in WebAssembly 2.0 (2022)Standardised and supported by every current engine.Engine support

Properties

0xFC 8:u32memory.init y x

Description

Copy from a passive data segment to linear memory.

Bulk Memory Operations.

Stack

[i32 i32 i32] → []

Immediate operands

  1. u32 y : dataidx
  2. u32 x : memidx

Addresses: an i32 for a 32-bit memory, an i64 for a 64-bit memory (memory64). The signatures here show the 32-bit case, which is what almost every module uses.

Status

Bulk memory operationsStandardised in WebAssembly 2.0 (2022)Standardised and supported by every current engine.Engine support

Properties

0xFC 9:u32data.drop x

discard the top of the stack

Description

Prevent further use of passive data segment.

Bulk Memory Operations.

Stack

[] → []

Frees the segment’s contents. The segment cannot be used again.

Immediate operands

  1. u32 x : dataidx

Status

Bulk memory operationsStandardised in WebAssembly 2.0 (2022)Standardised and supported by every current engine.Engine support

Properties

0xFC 10:u32memory.copy x y

Description

Copy from one region of linear memory to another region.

Bulk Memory Operations.

Stack

[i32 i32 i32] → []

Immediate operands

  1. u32 x : memidx
  2. u32 y : memidx

Addresses: an i32 for a 32-bit memory, an i64 for a 64-bit memory (memory64). The signatures here show the 32-bit case, which is what almost every module uses.

Status

Bulk memory operationsStandardised in WebAssembly 2.0 (2022)Standardised and supported by every current engine.Engine support

Properties

0xFC 11:u32memory.fill x

Description

Fill a region of linear memory with a given byte value.

Bulk Memory Operations.

Stack

[i32 i32 i32] → []

Immediate operands

  1. u32 x : memidx

Addresses: an i32 for a 32-bit memory, an i64 for a 64-bit memory (memory64). The signatures here show the 32-bit case, which is what almost every module uses.

Status

Bulk memory operationsStandardised in WebAssembly 2.0 (2022)Standardised and supported by every current engine.Engine support

Properties

0xFC 12:u32table.init y x

Description

Copy from a passive element segment to a table.

Bulk Memory Operations.

Stack

[i32 i32 i32] → []

Immediate operands

  1. u32 y : elemidx
  2. u32 x : tableidx

Status

Reference typesStandardised in WebAssembly 2.0 (2022)Standardised and supported by every current engine.Engine support

Encoded across 2 tables:

Properties

0xFC 13:u32elem.drop x

discard the top of the stack

Description

Prevent further use of a passive element segment.

Bulk Memory Operations.

Stack

[] → []

Frees the segment’s contents. The segment cannot be used again.

Immediate operands

  1. u32 x : elemidx

Status

Reference typesStandardised in WebAssembly 2.0 (2022)Standardised and supported by every current engine.Engine support

Encoded across 2 tables:

Properties

0xFC 14:u32table.copy x y

Description

Copy from one region of a table to another region.

Bulk Memory Operations.

Stack

[i32 i32 i32] → []

Immediate operands

  1. u32 x : tableidx
  2. u32 y : tableidx

Status

Reference typesStandardised in WebAssembly 2.0 (2022)Standardised and supported by every current engine.Engine support

Encoded across 2 tables:

Properties

0xFC 15:u32table.grow x

Description

Manipulate the size of a table.

Stack

[i32] → []

Immediate operands

  1. u32 x : tableidx

Status

Reference typesStandardised in WebAssembly 2.0 (2022)Standardised and supported by every current engine.Engine support

Encoded across 2 tables:

Properties

0xFC 16:u32table.size x

Description

Manipulate the size of a table.

Stack

[] → [i32]

Immediate operands

  1. u32 x : tableidx

Status

Reference typesStandardised in WebAssembly 2.0 (2022)Standardised and supported by every current engine.Engine support

Encoded across 2 tables:

Properties

0xFC 17:u32table.fill x

Description

Fills a range in a table with a value.

Stack

[i32 i32] → []

Immediate operands

  1. u32 x : tableidx

Status

Reference typesStandardised in WebAssembly 2.0 (2022)Standardised and supported by every current engine.Engine support

Encoded across 2 tables:

Properties

0xFC 19:u32i64.add128

add

Description

Adds two 128-bit integers, each held in a pair of i64 values. Overflow wraps.

WebAssembly has no 128-bit integer type, so without this an addition has to be built from an add and a separate carry calculation.

Stack

[i64 i64 i64 i64] → [i64 i64]

Each 128-bit value is two operands, low half first, so the four operands are the low and high halves of the first value then those of the second. The results are in the same order: low half, then high half.

Status

Wide arithmetic

Proposal: Phase 3 (2025)

Implemented in some engines; the encoding is unlikely to change but is not final.Engine support

Properties

0xFC 20:u32i64.sub128

subtract

Description

Subtracts the second 128-bit integer from the first, each held in a pair of i64 values. Underflow wraps.

WebAssembly has no 128-bit integer type, so without this a subtraction has to be built from a subtract and a separate borrow calculation.

Stack

[i64 i64 i64 i64] → [i64 i64]

Each 128-bit value is two operands, low half first, so the four operands are the low and high halves of the first value then those of the second. The results are in the same order: low half, then high half.

Status

Wide arithmetic

Proposal: Phase 3 (2025)

Implemented in some engines; the encoding is unlikely to change but is not final.Engine support

Properties

0xFC 21:u32i64.mul_wide_s

multiply

Description

Multiplies two signed 64-bit integers and keeps the whole 128-bit product, where i64.mul keeps only the low half.

i64.mul needs no signed and unsigned form because the low half of the product is the same either way. The high half is not, which is why these two exist.

Stack

[i64 i64] → [i64 i64]

The results are the low 64 bits of the product, then the high 64 bits.

Status

Wide arithmetic

Proposal: Phase 3 (2025)

Implemented in some engines; the encoding is unlikely to change but is not final.Engine support

Properties

0xFC 22:u32i64.mul_wide_u

multiply

Description

Multiplies two unsigned 64-bit integers and keeps the whole 128-bit product, where i64.mul keeps only the low half.

i64.mul needs no signed and unsigned form because the low half of the product is the same either way. The high half is not, which is why these two exist.

Stack

[i64 i64] → [i64 i64]

The results are the low 64 bits of the product, then the high 64 bits.

Status

Wide arithmetic

Proposal: Phase 3 (2025)

Implemented in some engines; the encoding is unlikely to change but is not final.Engine support

Properties

0xFC 48:u32f32.load_f16 m

read from memory

Description

Part of the half-precision proposal, which adds the 16-bit float type f16 and a f16x8 vector shape.

Loads two bytes as an f16 and promotes the result to f32.

Stack

[i32] → [f32]

Half precision: f16 is not a WebAssembly value type. The scalar operand and result are f32, rounded to half precision.

Immediate operands

  1. m : memarg — u32 align, then u64 offset

Alignment

  • align is the base-2 logarithm of the assumed alignment in bytes: 0 for 1 byte, 1 for 2, 2 for 4, 3 for 8, 4 for 16.
  • A value larger than the width of the access is rejected when the module is validated. A smaller one is allowed, and only tells the engine not to assume alignment.
  • Bit 6 (0x40) is not part of the number. When it is set, a u32 memory index follows align, before the offset, and the alignment is what is left after subtracting 64. When it is clear, the instruction uses memory 0.

Addresses: an i32 for a 32-bit memory, an i64 for a 64-bit memory (memory64). The signatures here show the 32-bit case, which is what almost every module uses.

Status

Half precision

Proposal: Phase 1 (2024)

Adds the f16 type. Early: no engine ships it and the encoding may still change.Engine support

Encoded across 2 tables:

Properties

0xFC 49:u32f32.store_f16 m

write to memory

Description

Part of the half-precision proposal, which adds the 16-bit float type f16 and a f16x8 vector shape.

Demotes an f32 to f16 and stores it as two bytes.

Stack

[i32 f32] → []

Half precision: f16 is not a WebAssembly value type. The scalar operand and result are f32, rounded to half precision.

Immediate operands

  1. m : memarg — u32 align, then u64 offset

Alignment

  • align is the base-2 logarithm of the assumed alignment in bytes: 0 for 1 byte, 1 for 2, 2 for 4, 3 for 8, 4 for 16.
  • A value larger than the width of the access is rejected when the module is validated. A smaller one is allowed, and only tells the engine not to assume alignment.
  • Bit 6 (0x40) is not part of the number. When it is set, a u32 memory index follows align, before the offset, and the alignment is what is left after subtracting 64. When it is clear, the instruction uses memory 0.

Addresses: an i32 for a 32-bit memory, an i64 for a 64-bit memory (memory64). The signatures here show the 32-bit case, which is what almost every module uses.

Status

Half precision

Proposal: Phase 1 (2024)

Adds the f16 type. Early: no engine ships it and the encoding may still change.Engine support

Encoded across 2 tables:

Properties

0xFD 0:u32v128.load m

read from memory

Description

Loads a v128 vector from the given heap address.

Stack

[i32] → [v128]

Immediate operands

  1. m : memarg — u32 align, then u64 offset

Alignment

  • align is the base-2 logarithm of the assumed alignment in bytes: 0 for 1 byte, 1 for 2, 2 for 4, 3 for 8, 4 for 16.
  • A value larger than the width of the access is rejected when the module is validated. A smaller one is allowed, and only tells the engine not to assume alignment.
  • Bit 6 (0x40) is not part of the number. When it is set, a u32 memory index follows align, before the offset, and the alignment is what is left after subtracting 64. When it is clear, the instruction uses memory 0.

Addresses: an i32 for a 32-bit memory, an i64 for a 64-bit memory (memory64). The signatures here show the 32-bit case, which is what almost every module uses.

Status

Fixed-width SIMDStandardised in WebAssembly 2.0 (2022)Standardised and supported by every current engine.Engine support

Properties

0xFD 1:u32v128.load8x8_s m

read from memory, signed

Description

Reads eight bytes and sign-extends each to 16 bits, giving an i16x8 vector.

Stack

[i32] → [v128]

Immediate operands

  1. m : memarg — u32 align, then u64 offset

Alignment

  • align is the base-2 logarithm of the assumed alignment in bytes: 0 for 1 byte, 1 for 2, 2 for 4, 3 for 8, 4 for 16.
  • A value larger than the width of the access is rejected when the module is validated. A smaller one is allowed, and only tells the engine not to assume alignment.
  • Bit 6 (0x40) is not part of the number. When it is set, a u32 memory index follows align, before the offset, and the alignment is what is left after subtracting 64. When it is clear, the instruction uses memory 0.

Addresses: an i32 for a 32-bit memory, an i64 for a 64-bit memory (memory64). The signatures here show the 32-bit case, which is what almost every module uses.

Status

Fixed-width SIMDStandardised in WebAssembly 2.0 (2022)Standardised and supported by every current engine.Engine support

Properties

0xFD 2:u32v128.load8x8_u m

read from memory, unsigned

Description

Reads eight bytes and zero-extends each to 16 bits, giving an i16x8 vector.

Stack

[i32] → [v128]

Immediate operands

  1. m : memarg — u32 align, then u64 offset

Alignment

  • align is the base-2 logarithm of the assumed alignment in bytes: 0 for 1 byte, 1 for 2, 2 for 4, 3 for 8, 4 for 16.
  • A value larger than the width of the access is rejected when the module is validated. A smaller one is allowed, and only tells the engine not to assume alignment.
  • Bit 6 (0x40) is not part of the number. When it is set, a u32 memory index follows align, before the offset, and the alignment is what is left after subtracting 64. When it is clear, the instruction uses memory 0.

Addresses: an i32 for a 32-bit memory, an i64 for a 64-bit memory (memory64). The signatures here show the 32-bit case, which is what almost every module uses.

Status

Fixed-width SIMDStandardised in WebAssembly 2.0 (2022)Standardised and supported by every current engine.Engine support

Properties

0xFD 3:u32v128.load16x4_s m

read from memory, signed

Description

Reads eight bytes as four 16-bit values and sign-extends each to 32 bits, giving an i32x4 vector.

Stack

[i32] → [v128]

Immediate operands

  1. m : memarg — u32 align, then u64 offset

Alignment

  • align is the base-2 logarithm of the assumed alignment in bytes: 0 for 1 byte, 1 for 2, 2 for 4, 3 for 8, 4 for 16.
  • A value larger than the width of the access is rejected when the module is validated. A smaller one is allowed, and only tells the engine not to assume alignment.
  • Bit 6 (0x40) is not part of the number. When it is set, a u32 memory index follows align, before the offset, and the alignment is what is left after subtracting 64. When it is clear, the instruction uses memory 0.

Addresses: an i32 for a 32-bit memory, an i64 for a 64-bit memory (memory64). The signatures here show the 32-bit case, which is what almost every module uses.

Status

Fixed-width SIMDStandardised in WebAssembly 2.0 (2022)Standardised and supported by every current engine.Engine support

Properties

0xFD 4:u32v128.load16x4_u m

read from memory, unsigned

Description

Reads eight bytes as four 16-bit values and zero-extends each to 32 bits, giving an i32x4 vector.

Stack

[i32] → [v128]

Immediate operands

  1. m : memarg — u32 align, then u64 offset

Alignment

  • align is the base-2 logarithm of the assumed alignment in bytes: 0 for 1 byte, 1 for 2, 2 for 4, 3 for 8, 4 for 16.
  • A value larger than the width of the access is rejected when the module is validated. A smaller one is allowed, and only tells the engine not to assume alignment.
  • Bit 6 (0x40) is not part of the number. When it is set, a u32 memory index follows align, before the offset, and the alignment is what is left after subtracting 64. When it is clear, the instruction uses memory 0.

Addresses: an i32 for a 32-bit memory, an i64 for a 64-bit memory (memory64). The signatures here show the 32-bit case, which is what almost every module uses.

Status

Fixed-width SIMDStandardised in WebAssembly 2.0 (2022)Standardised and supported by every current engine.Engine support

Properties

0xFD 5:u32v128.load32x2_s m

read from memory, signed

Description

Reads eight bytes as two 32-bit values and sign-extends each to 64 bits, giving an i64x2 vector.

Stack

[i32] → [v128]

Immediate operands

  1. m : memarg — u32 align, then u64 offset

Alignment

  • align is the base-2 logarithm of the assumed alignment in bytes: 0 for 1 byte, 1 for 2, 2 for 4, 3 for 8, 4 for 16.
  • A value larger than the width of the access is rejected when the module is validated. A smaller one is allowed, and only tells the engine not to assume alignment.
  • Bit 6 (0x40) is not part of the number. When it is set, a u32 memory index follows align, before the offset, and the alignment is what is left after subtracting 64. When it is clear, the instruction uses memory 0.

Addresses: an i32 for a 32-bit memory, an i64 for a 64-bit memory (memory64). The signatures here show the 32-bit case, which is what almost every module uses.

Status

Fixed-width SIMDStandardised in WebAssembly 2.0 (2022)Standardised and supported by every current engine.Engine support

Properties

0xFD 6:u32v128.load32x2_u m

read from memory, unsigned

Description

Reads eight bytes as two 32-bit values and zero-extends each to 64 bits, giving an i64x2 vector.

Stack

[i32] → [v128]

Immediate operands

  1. m : memarg — u32 align, then u64 offset

Alignment

  • align is the base-2 logarithm of the assumed alignment in bytes: 0 for 1 byte, 1 for 2, 2 for 4, 3 for 8, 4 for 16.
  • A value larger than the width of the access is rejected when the module is validated. A smaller one is allowed, and only tells the engine not to assume alignment.
  • Bit 6 (0x40) is not part of the number. When it is set, a u32 memory index follows align, before the offset, and the alignment is what is left after subtracting 64. When it is clear, the instruction uses memory 0.

Addresses: an i32 for a 32-bit memory, an i64 for a 64-bit memory (memory64). The signatures here show the 32-bit case, which is what almost every module uses.

Status

Fixed-width SIMDStandardised in WebAssembly 2.0 (2022)Standardised and supported by every current engine.Engine support

Properties

0xFD 7:u32v128.load8_splat m

read 1 byte from memory

Description

Load a single element and splat to all lanes of a v128 vector.

Stack

[i32] → [v128]

Immediate operands

  1. m : memarg — u32 align, then u64 offset

Alignment

  • align is the base-2 logarithm of the assumed alignment in bytes: 0 for 1 byte, 1 for 2, 2 for 4, 3 for 8, 4 for 16.
  • A value larger than the width of the access is rejected when the module is validated. A smaller one is allowed, and only tells the engine not to assume alignment.
  • Bit 6 (0x40) is not part of the number. When it is set, a u32 memory index follows align, before the offset, and the alignment is what is left after subtracting 64. When it is clear, the instruction uses memory 0.

Addresses: an i32 for a 32-bit memory, an i64 for a 64-bit memory (memory64). The signatures here show the 32-bit case, which is what almost every module uses.

Status

Fixed-width SIMDStandardised in WebAssembly 2.0 (2022)Standardised and supported by every current engine.Engine support

Properties

0xFD 8:u32v128.load16_splat m

read 2 bytes from memory

Description

Load a single element and splat to all lanes of a v128 vector.

Stack

[i32] → [v128]

Immediate operands

  1. m : memarg — u32 align, then u64 offset

Alignment

  • align is the base-2 logarithm of the assumed alignment in bytes: 0 for 1 byte, 1 for 2, 2 for 4, 3 for 8, 4 for 16.
  • A value larger than the width of the access is rejected when the module is validated. A smaller one is allowed, and only tells the engine not to assume alignment.
  • Bit 6 (0x40) is not part of the number. When it is set, a u32 memory index follows align, before the offset, and the alignment is what is left after subtracting 64. When it is clear, the instruction uses memory 0.

Addresses: an i32 for a 32-bit memory, an i64 for a 64-bit memory (memory64). The signatures here show the 32-bit case, which is what almost every module uses.

Status

Fixed-width SIMDStandardised in WebAssembly 2.0 (2022)Standardised and supported by every current engine.Engine support

Properties

0xFD 9:u32v128.load32_splat m

read 4 bytes from memory

Description

Load a single element and splat to all lanes of a v128 vector.

Stack

[i32] → [v128]

Immediate operands

  1. m : memarg — u32 align, then u64 offset

Alignment

  • align is the base-2 logarithm of the assumed alignment in bytes: 0 for 1 byte, 1 for 2, 2 for 4, 3 for 8, 4 for 16.
  • A value larger than the width of the access is rejected when the module is validated. A smaller one is allowed, and only tells the engine not to assume alignment.
  • Bit 6 (0x40) is not part of the number. When it is set, a u32 memory index follows align, before the offset, and the alignment is what is left after subtracting 64. When it is clear, the instruction uses memory 0.

Addresses: an i32 for a 32-bit memory, an i64 for a 64-bit memory (memory64). The signatures here show the 32-bit case, which is what almost every module uses.

Status

Fixed-width SIMDStandardised in WebAssembly 2.0 (2022)Standardised and supported by every current engine.Engine support

Properties

0xFD 10:u32v128.load64_splat m

read 8 bytes from memory

Description

Load a single element and splat to all lanes of a v128 vector.

Stack

[i32] → [v128]

Immediate operands

  1. m : memarg — u32 align, then u64 offset

Alignment

  • align is the base-2 logarithm of the assumed alignment in bytes: 0 for 1 byte, 1 for 2, 2 for 4, 3 for 8, 4 for 16.
  • A value larger than the width of the access is rejected when the module is validated. A smaller one is allowed, and only tells the engine not to assume alignment.
  • Bit 6 (0x40) is not part of the number. When it is set, a u32 memory index follows align, before the offset, and the alignment is what is left after subtracting 64. When it is clear, the instruction uses memory 0.

Addresses: an i32 for a 32-bit memory, an i64 for a 64-bit memory (memory64). The signatures here show the 32-bit case, which is what almost every module uses.

Status

Fixed-width SIMDStandardised in WebAssembly 2.0 (2022)Standardised and supported by every current engine.Engine support

Properties

0xFD 11:u32v128.store m

write to memory

Description

Stores a v128 vector to the given heap address.

Stack

[i32 v128] → []

Immediate operands

  1. m : memarg — u32 align, then u64 offset

Alignment

  • align is the base-2 logarithm of the assumed alignment in bytes: 0 for 1 byte, 1 for 2, 2 for 4, 3 for 8, 4 for 16.
  • A value larger than the width of the access is rejected when the module is validated. A smaller one is allowed, and only tells the engine not to assume alignment.
  • Bit 6 (0x40) is not part of the number. When it is set, a u32 memory index follows align, before the offset, and the alignment is what is left after subtracting 64. When it is clear, the instruction uses memory 0.

Addresses: an i32 for a 32-bit memory, an i64 for a 64-bit memory (memory64). The signatures here show the 32-bit case, which is what almost every module uses.

Status

Fixed-width SIMDStandardised in WebAssembly 2.0 (2022)Standardised and supported by every current engine.Engine support

Properties

0xFD 12:u32v128.const b*

Description

Pushes a 128-bit constant, given by the sixteen bytes that follow.

A v128 has no lane shape of its own: the bytes are the vector’s bits in memory order, and the shape comes from whichever instruction reads it.

Stack

[] → [v128]

Immediate operands

  1. u8[16] b* — the 128-bit value, little-endian

Status

Fixed-width SIMDStandardised in WebAssembly 2.0 (2022)Standardised and supported by every current engine.Engine support

Properties

0xFD 13:u32i8x16.shuffle l*

build a vector from lanes of two others

Description

Builds a new vector one byte at a time, each byte picked from the two operands by an immediate index.

Stack

[v128 v128] → [v128]

Immediate operands

  1. u8[16] l* : laneidx — one per result lane, each 0–31 selecting a byte of the two inputs

Lane index: counts from 0. A value at or past the number of lanes is rejected when the module is validated, so it can never be out of range at run time.

Status

Fixed-width SIMDStandardised in WebAssembly 2.0 (2022)Standardised and supported by every current engine.Engine support

Properties

0xFD 14:u32i8x16.swizzle

rearrange lanes by an index vector

Description

Builds a new vector one byte at a time, each byte picked from the first operand by an index taken from the second.

An index of 0 to 15 selects that byte of the first operand. Anything larger gives 0.

Stack

[v128 v128] → [v128]

Status

Fixed-width SIMDStandardised in WebAssembly 2.0 (2022)Standardised and supported by every current engine.Engine support

Properties

0xFD 15:u32i8x16.splat

copy one value into every lane

Description

Creates a vector with identical lanes.

Constructs a vector with x replicated to all 16 lanes.

Stack

[i32] → [v128]

Status

Fixed-width SIMDStandardised in WebAssembly 2.0 (2022)Standardised and supported by every current engine.Engine support

Properties

0xFD 16:u32i16x8.splat

copy one value into every lane

Description

Creates a vector with identical lanes.

Stack

[i32] → [v128]

Status

Fixed-width SIMDStandardised in WebAssembly 2.0 (2022)Standardised and supported by every current engine.Engine support

Properties

0xFD 17:u32i32x4.splat

copy one value into every lane

Description

Creates a vector with identical lanes.

Stack

[i32] → [v128]

Status

Fixed-width SIMDStandardised in WebAssembly 2.0 (2022)Standardised and supported by every current engine.Engine support

Properties

0xFD 18:u32i64x2.splat

copy one value into every lane

Description

Creates a vector with identical lanes.

Stack

[i64] → [v128]

Status

Fixed-width SIMDStandardised in WebAssembly 2.0 (2022)Standardised and supported by every current engine.Engine support

Properties

0xFD 19:u32f32x4.splat

copy one value into every lane

Description

Creates a vector with identical lanes.

Constructs a vector with x replicated to all 4 lanes.

Stack

[f32] → [v128]

Status

Fixed-width SIMDStandardised in WebAssembly 2.0 (2022)Standardised and supported by every current engine.Engine support

Properties

0xFD 20:u32f64x2.splat

copy one value into every lane

Description

Creates a vector with identical lanes.

Constructs a vector with x replicated to all 2 lanes.

Stack

[f64] → [v128]

Status

Fixed-width SIMDStandardised in WebAssembly 2.0 (2022)Standardised and supported by every current engine.Engine support

Properties

0xFD 21:u32i8x16.extract_lane_s l

Description

Extracts one lane from a 128-bit vector read as 16 packed i8 numbers.

Stack

[v128] → [i32]

Immediate operands

  1. u8 l : laneidx

Lane index: counts from 0. A value at or past the number of lanes is rejected when the module is validated, so it can never be out of range at run time.

Status

Fixed-width SIMDStandardised in WebAssembly 2.0 (2022)Standardised and supported by every current engine.Engine support

Properties

0xFD 22:u32i8x16.extract_lane_u l

Description

Extracts a lane from a 128-bit vector interpreted as 16 packed u8 numbers.

Stack

[v128] → [i32]

Immediate operands

  1. u8 l : laneidx

Lane index: counts from 0. A value at or past the number of lanes is rejected when the module is validated, so it can never be out of range at run time.

Status

Fixed-width SIMDStandardised in WebAssembly 2.0 (2022)Standardised and supported by every current engine.Engine support

Properties

0xFD 23:u32i8x16.replace_lane l

Description

Replaces one lane of a 128-bit vector read as 16 packed i8 numbers, leaving the others unchanged.

Stack

[v128 i32] → [v128]

Immediate operands

  1. u8 l : laneidx

Lane index: counts from 0. A value at or past the number of lanes is rejected when the module is validated, so it can never be out of range at run time.

Status

Fixed-width SIMDStandardised in WebAssembly 2.0 (2022)Standardised and supported by every current engine.Engine support

Properties

0xFD 24:u32i16x8.extract_lane_s l

Description

Extracts a lane from a 128-bit vector interpreted as 8 packed i16 numbers.

Stack

[v128] → [i32]

Immediate operands

  1. u8 l : laneidx

Lane index: counts from 0. A value at or past the number of lanes is rejected when the module is validated, so it can never be out of range at run time.

Status

Fixed-width SIMDStandardised in WebAssembly 2.0 (2022)Standardised and supported by every current engine.Engine support

Properties

0xFD 25:u32i16x8.extract_lane_u l

Description

Extracts a lane from a 128-bit vector interpreted as 8 packed u16 numbers.

Stack

[v128] → [i32]

Immediate operands

  1. u8 l : laneidx

Lane index: counts from 0. A value at or past the number of lanes is rejected when the module is validated, so it can never be out of range at run time.

Status

Fixed-width SIMDStandardised in WebAssembly 2.0 (2022)Standardised and supported by every current engine.Engine support

Properties

0xFD 26:u32i16x8.replace_lane l

Description

Replaces a lane from a 128-bit vector interpreted as 8 packed i16 numbers.

Stack

[v128 i32] → [v128]

Immediate operands

  1. u8 l : laneidx

Lane index: counts from 0. A value at or past the number of lanes is rejected when the module is validated, so it can never be out of range at run time.

Status

Fixed-width SIMDStandardised in WebAssembly 2.0 (2022)Standardised and supported by every current engine.Engine support

Properties

0xFD 27:u32i32x4.extract_lane l

Description

Extracts a lane from a 128-bit vector interpreted as 4 packed i32 numbers.

Stack

[v128] → [i32]

Immediate operands

  1. u8 l : laneidx

Lane index: counts from 0. A value at or past the number of lanes is rejected when the module is validated, so it can never be out of range at run time.

Status

Fixed-width SIMDStandardised in WebAssembly 2.0 (2022)Standardised and supported by every current engine.Engine support

Properties

0xFD 28:u32i32x4.replace_lane l

Description

Replaces a lane from a 128-bit vector interpreted as 4 packed i32 numbers.

Stack

[v128 i32] → [v128]

Immediate operands

  1. u8 l : laneidx

Lane index: counts from 0. A value at or past the number of lanes is rejected when the module is validated, so it can never be out of range at run time.

Status

Fixed-width SIMDStandardised in WebAssembly 2.0 (2022)Standardised and supported by every current engine.Engine support

Properties

0xFD 29:u32i64x2.extract_lane l

Description

Extracts a lane from a 128-bit vector interpreted as 2 packed i64 numbers.

Stack

[v128] → [i64]

Immediate operands

  1. u8 l : laneidx

Lane index: counts from 0. A value at or past the number of lanes is rejected when the module is validated, so it can never be out of range at run time.

Status

Fixed-width SIMDStandardised in WebAssembly 2.0 (2022)Standardised and supported by every current engine.Engine support

Properties

0xFD 30:u32i64x2.replace_lane l

Description

Replaces a lane from a 128-bit vector interpreted as 2 packed i64 numbers.

Stack

[v128 i64] → [v128]

Immediate operands

  1. u8 l : laneidx

Lane index: counts from 0. A value at or past the number of lanes is rejected when the module is validated, so it can never be out of range at run time.

Status

Fixed-width SIMDStandardised in WebAssembly 2.0 (2022)Standardised and supported by every current engine.Engine support

Properties

0xFD 31:u32f32x4.extract_lane l

Description

Extracts one lane from a 128-bit vector read as 4 packed f32 numbers.

Stack

[v128] → [f32]

Immediate operands

  1. u8 l : laneidx

Lane index: counts from 0. A value at or past the number of lanes is rejected when the module is validated, so it can never be out of range at run time.

Status

Fixed-width SIMDStandardised in WebAssembly 2.0 (2022)Standardised and supported by every current engine.Engine support

Properties

0xFD 32:u32f32x4.replace_lane l

Description

Replaces one lane of a 128-bit vector read as 4 packed f32 numbers, leaving the others unchanged.

Stack

[v128 f32] → [v128]

Immediate operands

  1. u8 l : laneidx

Lane index: counts from 0. A value at or past the number of lanes is rejected when the module is validated, so it can never be out of range at run time.

Status

Fixed-width SIMDStandardised in WebAssembly 2.0 (2022)Standardised and supported by every current engine.Engine support

Properties

0xFD 33:u32f64x2.extract_lane l

Description

Extracts one lane from a 128-bit vector read as 2 packed f64 numbers.

Stack

[v128] → [f64]

Immediate operands

  1. u8 l : laneidx

Lane index: counts from 0. A value at or past the number of lanes is rejected when the module is validated, so it can never be out of range at run time.

Status

Fixed-width SIMDStandardised in WebAssembly 2.0 (2022)Standardised and supported by every current engine.Engine support

Properties

0xFD 34:u32f64x2.replace_lane l

Description

Replaces one lane of a 128-bit vector read as 2 packed f64 numbers, leaving the others unchanged.

Stack

[v128 f64] → [v128]

Immediate operands

  1. u8 l : laneidx

Lane index: counts from 0. A value at or past the number of lanes is rejected when the module is validated, so it can never be out of range at run time.

Status

Fixed-width SIMDStandardised in WebAssembly 2.0 (2022)Standardised and supported by every current engine.Engine support

Properties

0xFD 35:u32i8x16.eq

equal

Description

==

Lane-wise comparison of sixteen 8-bit integers.

Signedness does not affect equality, so there is one form rather than a signed and an unsigned one.

Result: a lane is all ones where the comparison is true and all zeros where it is false, not 1 and 0.

Stack

[v128 v128] → [v128]

Status

Fixed-width SIMDStandardised in WebAssembly 2.0 (2022)Standardised and supported by every current engine.Engine support

Properties

0xFD 36:u32i8x16.ne

not equal

Description

Lane-wise comparison of sixteen 8-bit integers.

Signedness does not affect equality, so there is one form rather than a signed and an unsigned one.

Result: a lane is all ones where the comparison is true and all zeros where it is false, not 1 and 0.

Stack

[v128 v128] → [v128]

Status

Fixed-width SIMDStandardised in WebAssembly 2.0 (2022)Standardised and supported by every current engine.Engine support

Properties

0xFD 37:u32i8x16.lt_s

less than, signed

Description

<

Lane-wise comparison of sixteen 8-bit signed integers.

Result: a lane is all ones where the comparison is true and all zeros where it is false, not 1 and 0.

Stack

[v128 v128] → [v128]

Status

Fixed-width SIMDStandardised in WebAssembly 2.0 (2022)Standardised and supported by every current engine.Engine support

Properties

0xFD 38:u32i8x16.lt_u

less than, unsigned

Description

<

Lane-wise comparison of sixteen 8-bit unsigned integers.

Result: a lane is all ones where the comparison is true and all zeros where it is false, not 1 and 0.

Stack

[v128 v128] → [v128]

Status

Fixed-width SIMDStandardised in WebAssembly 2.0 (2022)Standardised and supported by every current engine.Engine support

Properties

0xFD 39:u32i8x16.gt_s

greater than, signed

Description

>

Lane-wise comparison of sixteen 8-bit signed integers.

Result: a lane is all ones where the comparison is true and all zeros where it is false, not 1 and 0.

Stack

[v128 v128] → [v128]

Status

Fixed-width SIMDStandardised in WebAssembly 2.0 (2022)Standardised and supported by every current engine.Engine support

Properties

0xFD 40:u32i8x16.gt_u

greater than, unsigned

Description

>

Lane-wise comparison of sixteen 8-bit unsigned integers.

Result: a lane is all ones where the comparison is true and all zeros where it is false, not 1 and 0.

Stack

[v128 v128] → [v128]

Status

Fixed-width SIMDStandardised in WebAssembly 2.0 (2022)Standardised and supported by every current engine.Engine support

Properties

0xFD 41:u32i8x16.le_s

less than or equal, signed

Description

Lane-wise comparison of sixteen 8-bit signed integers.

Result: a lane is all ones where the comparison is true and all zeros where it is false, not 1 and 0.

Stack

[v128 v128] → [v128]

Status

Fixed-width SIMDStandardised in WebAssembly 2.0 (2022)Standardised and supported by every current engine.Engine support

Properties

0xFD 42:u32i8x16.le_u

less than or equal, unsigned

Description

Lane-wise comparison of sixteen 8-bit unsigned integers.

Result: a lane is all ones where the comparison is true and all zeros where it is false, not 1 and 0.

Stack

[v128 v128] → [v128]

Status

Fixed-width SIMDStandardised in WebAssembly 2.0 (2022)Standardised and supported by every current engine.Engine support

Properties

0xFD 43:u32i8x16.ge_s

greater than or equal, signed

Description

Lane-wise comparison of sixteen 8-bit signed integers.

Result: a lane is all ones where the comparison is true and all zeros where it is false, not 1 and 0.

Stack

[v128 v128] → [v128]

Status

Fixed-width SIMDStandardised in WebAssembly 2.0 (2022)Standardised and supported by every current engine.Engine support

Properties

0xFD 44:u32i8x16.ge_u

greater than or equal, unsigned

Description

Lane-wise comparison of sixteen 8-bit unsigned integers.

Result: a lane is all ones where the comparison is true and all zeros where it is false, not 1 and 0.

Stack

[v128 v128] → [v128]

Status

Fixed-width SIMDStandardised in WebAssembly 2.0 (2022)Standardised and supported by every current engine.Engine support

Properties

0xFD 45:u32i16x8.eq

equal

Description

==

Lane-wise comparison of eight 16-bit integers.

Signedness does not affect equality, so there is one form rather than a signed and an unsigned one.

Result: a lane is all ones where the comparison is true and all zeros where it is false, not 1 and 0.

Stack

[v128 v128] → [v128]

Status

Fixed-width SIMDStandardised in WebAssembly 2.0 (2022)Standardised and supported by every current engine.Engine support

Properties

0xFD 46:u32i16x8.ne

not equal

Description

Lane-wise comparison of eight 16-bit integers.

Signedness does not affect equality, so there is one form rather than a signed and an unsigned one.

Result: a lane is all ones where the comparison is true and all zeros where it is false, not 1 and 0.

Stack

[v128 v128] → [v128]

Status

Fixed-width SIMDStandardised in WebAssembly 2.0 (2022)Standardised and supported by every current engine.Engine support

Properties

0xFD 47:u32i16x8.lt_s

less than, signed

Description

<

Lane-wise comparison of eight 16-bit signed integers.

Result: a lane is all ones where the comparison is true and all zeros where it is false, not 1 and 0.

Stack

[v128 v128] → [v128]

Status

Fixed-width SIMDStandardised in WebAssembly 2.0 (2022)Standardised and supported by every current engine.Engine support

Properties

0xFD 48:u32i16x8.lt_u

less than, unsigned

Description

<

Lane-wise comparison of eight 16-bit unsigned integers.

Result: a lane is all ones where the comparison is true and all zeros where it is false, not 1 and 0.

Stack

[v128 v128] → [v128]

Status

Fixed-width SIMDStandardised in WebAssembly 2.0 (2022)Standardised and supported by every current engine.Engine support

Properties

0xFD 49:u32i16x8.gt_s

greater than, signed

Description

>

Lane-wise comparison of eight 16-bit signed integers.

Result: a lane is all ones where the comparison is true and all zeros where it is false, not 1 and 0.

Stack

[v128 v128] → [v128]

Status

Fixed-width SIMDStandardised in WebAssembly 2.0 (2022)Standardised and supported by every current engine.Engine support

Properties

0xFD 50:u32i16x8.gt_u

greater than, unsigned

Description

>

Lane-wise comparison of eight 16-bit unsigned integers.

Result: a lane is all ones where the comparison is true and all zeros where it is false, not 1 and 0.

Stack

[v128 v128] → [v128]

Status

Fixed-width SIMDStandardised in WebAssembly 2.0 (2022)Standardised and supported by every current engine.Engine support

Properties

0xFD 51:u32i16x8.le_s

less than or equal, signed

Description

Lane-wise comparison of eight 16-bit signed integers.

Result: a lane is all ones where the comparison is true and all zeros where it is false, not 1 and 0.

Stack

[v128 v128] → [v128]

Status

Fixed-width SIMDStandardised in WebAssembly 2.0 (2022)Standardised and supported by every current engine.Engine support

Properties

0xFD 52:u32i16x8.le_u

less than or equal, unsigned

Description

Lane-wise comparison of eight 16-bit unsigned integers.

Result: a lane is all ones where the comparison is true and all zeros where it is false, not 1 and 0.

Stack

[v128 v128] → [v128]

Status

Fixed-width SIMDStandardised in WebAssembly 2.0 (2022)Standardised and supported by every current engine.Engine support

Properties

0xFD 53:u32i16x8.ge_s

greater than or equal, signed

Description

Lane-wise comparison of eight 16-bit signed integers.

Result: a lane is all ones where the comparison is true and all zeros where it is false, not 1 and 0.

Stack

[v128 v128] → [v128]

Status

Fixed-width SIMDStandardised in WebAssembly 2.0 (2022)Standardised and supported by every current engine.Engine support

Properties

0xFD 54:u32i16x8.ge_u

greater than or equal, unsigned

Description

Lane-wise comparison of eight 16-bit unsigned integers.

Result: a lane is all ones where the comparison is true and all zeros where it is false, not 1 and 0.

Stack

[v128 v128] → [v128]

Status

Fixed-width SIMDStandardised in WebAssembly 2.0 (2022)Standardised and supported by every current engine.Engine support

Properties

0xFD 55:u32i32x4.eq

equal

Description

==

Lane-wise comparison of four 32-bit integers.

Signedness does not affect equality, so there is one form rather than a signed and an unsigned one.

Result: a lane is all ones where the comparison is true and all zeros where it is false, not 1 and 0.

Stack

[v128 v128] → [v128]

Status

Fixed-width SIMDStandardised in WebAssembly 2.0 (2022)Standardised and supported by every current engine.Engine support

Properties

0xFD 56:u32i32x4.ne

not equal

Description

Lane-wise comparison of four 32-bit integers.

Signedness does not affect equality, so there is one form rather than a signed and an unsigned one.

Result: a lane is all ones where the comparison is true and all zeros where it is false, not 1 and 0.

Stack

[v128 v128] → [v128]

Status

Fixed-width SIMDStandardised in WebAssembly 2.0 (2022)Standardised and supported by every current engine.Engine support

Properties

0xFD 57:u32i32x4.lt_s

less than, signed

Description

<

Lane-wise comparison of four 32-bit signed integers.

Result: a lane is all ones where the comparison is true and all zeros where it is false, not 1 and 0.

Stack

[v128 v128] → [v128]

Status

Fixed-width SIMDStandardised in WebAssembly 2.0 (2022)Standardised and supported by every current engine.Engine support

Properties

0xFD 58:u32i32x4.lt_u

less than, unsigned

Description

<

Lane-wise comparison of four 32-bit unsigned integers.

Result: a lane is all ones where the comparison is true and all zeros where it is false, not 1 and 0.

Stack

[v128 v128] → [v128]

Status

Fixed-width SIMDStandardised in WebAssembly 2.0 (2022)Standardised and supported by every current engine.Engine support

Properties

0xFD 59:u32i32x4.gt_s

greater than, signed

Description

>

Lane-wise comparison of four 32-bit signed integers.

Result: a lane is all ones where the comparison is true and all zeros where it is false, not 1 and 0.

Stack

[v128 v128] → [v128]

Status

Fixed-width SIMDStandardised in WebAssembly 2.0 (2022)Standardised and supported by every current engine.Engine support

Properties

0xFD 60:u32i32x4.gt_u

greater than, unsigned

Description

>

Lane-wise comparison of four 32-bit unsigned integers.

Result: a lane is all ones where the comparison is true and all zeros where it is false, not 1 and 0.

Stack

[v128 v128] → [v128]

Status

Fixed-width SIMDStandardised in WebAssembly 2.0 (2022)Standardised and supported by every current engine.Engine support

Properties

0xFD 61:u32i32x4.le_s

less than or equal, signed

Description

Lane-wise comparison of four 32-bit signed integers.

Result: a lane is all ones where the comparison is true and all zeros where it is false, not 1 and 0.

Stack

[v128 v128] → [v128]

Status

Fixed-width SIMDStandardised in WebAssembly 2.0 (2022)Standardised and supported by every current engine.Engine support

Properties

0xFD 62:u32i32x4.le_u

less than or equal, unsigned

Description

Lane-wise comparison of four 32-bit unsigned integers.

Result: a lane is all ones where the comparison is true and all zeros where it is false, not 1 and 0.

Stack

[v128 v128] → [v128]

Status

Fixed-width SIMDStandardised in WebAssembly 2.0 (2022)Standardised and supported by every current engine.Engine support

Properties

0xFD 63:u32i32x4.ge_s

greater than or equal, signed

Description

Lane-wise comparison of four 32-bit signed integers.

Result: a lane is all ones where the comparison is true and all zeros where it is false, not 1 and 0.

Stack

[v128 v128] → [v128]

Status

Fixed-width SIMDStandardised in WebAssembly 2.0 (2022)Standardised and supported by every current engine.Engine support

Properties

0xFD 64:u32i32x4.ge_u

greater than or equal, unsigned

Description

Lane-wise comparison of four 32-bit unsigned integers.

Result: a lane is all ones where the comparison is true and all zeros where it is false, not 1 and 0.

Stack

[v128 v128] → [v128]

Status

Fixed-width SIMDStandardised in WebAssembly 2.0 (2022)Standardised and supported by every current engine.Engine support

Properties

0xFD 65:u32f32x4.eq

equal

Description

==

Lane-wise comparison of four single-precision floats.

Result: a lane is all ones where the comparison is true and all zeros where it is false, not 1 and 0.

A comparison with NaN is false, so a NaN in either lane gives all zeros. +0 and −0 compare equal.

Stack

[v128 v128] → [v128]

Status

Fixed-width SIMDStandardised in WebAssembly 2.0 (2022)Standardised and supported by every current engine.Engine support

Properties

0xFD 66:u32f32x4.ne

not equal

Description

Lane-wise comparison of four single-precision floats.

Result: a lane is all ones where the comparison is true and all zeros where it is false, not 1 and 0.

A comparison with NaN is false and this is its negation, so a NaN in either lane gives all ones. +0 and −0 compare equal.

Stack

[v128 v128] → [v128]

Status

Fixed-width SIMDStandardised in WebAssembly 2.0 (2022)Standardised and supported by every current engine.Engine support

Properties

0xFD 67:u32f32x4.lt

less than

Description

<

Lane-wise comparison of four single-precision floats.

Result: a lane is all ones where the comparison is true and all zeros where it is false, not 1 and 0.

A comparison with NaN is false, so a NaN in either lane gives all zeros. +0 and −0 compare equal.

Stack

[v128 v128] → [v128]

Status

Fixed-width SIMDStandardised in WebAssembly 2.0 (2022)Standardised and supported by every current engine.Engine support

Properties

0xFD 68:u32f32x4.gt

greater than

Description

>

Lane-wise comparison of four single-precision floats.

Result: a lane is all ones where the comparison is true and all zeros where it is false, not 1 and 0.

A comparison with NaN is false, so a NaN in either lane gives all zeros. +0 and −0 compare equal.

Stack

[v128 v128] → [v128]

Status

Fixed-width SIMDStandardised in WebAssembly 2.0 (2022)Standardised and supported by every current engine.Engine support

Properties

0xFD 69:u32f32x4.le

less than or equal

Description

Lane-wise comparison of four single-precision floats.

Result: a lane is all ones where the comparison is true and all zeros where it is false, not 1 and 0.

A comparison with NaN is false, so a NaN in either lane gives all zeros. +0 and −0 compare equal.

Stack

[v128 v128] → [v128]

Status

Fixed-width SIMDStandardised in WebAssembly 2.0 (2022)Standardised and supported by every current engine.Engine support

Properties

0xFD 70:u32f32x4.ge

greater than or equal

Description

Lane-wise comparison of four single-precision floats.

Result: a lane is all ones where the comparison is true and all zeros where it is false, not 1 and 0.

A comparison with NaN is false, so a NaN in either lane gives all zeros. +0 and −0 compare equal.

Stack

[v128 v128] → [v128]

Status

Fixed-width SIMDStandardised in WebAssembly 2.0 (2022)Standardised and supported by every current engine.Engine support

Properties

0xFD 71:u32f64x2.eq

equal

Description

==

Lane-wise comparison of two double-precision floats.

Result: a lane is all ones where the comparison is true and all zeros where it is false, not 1 and 0.

A comparison with NaN is false, so a NaN in either lane gives all zeros. +0 and −0 compare equal.

Stack

[v128 v128] → [v128]

Status

Fixed-width SIMDStandardised in WebAssembly 2.0 (2022)Standardised and supported by every current engine.Engine support

Properties

0xFD 72:u32f64x2.ne

not equal

Description

Lane-wise comparison of two double-precision floats.

Result: a lane is all ones where the comparison is true and all zeros where it is false, not 1 and 0.

A comparison with NaN is false and this is its negation, so a NaN in either lane gives all ones. +0 and −0 compare equal.

Stack

[v128 v128] → [v128]

Status

Fixed-width SIMDStandardised in WebAssembly 2.0 (2022)Standardised and supported by every current engine.Engine support

Properties

0xFD 73:u32f64x2.lt

less than

Description

<

Lane-wise comparison of two double-precision floats.

Result: a lane is all ones where the comparison is true and all zeros where it is false, not 1 and 0.

A comparison with NaN is false, so a NaN in either lane gives all zeros. +0 and −0 compare equal.

Stack

[v128 v128] → [v128]

Status

Fixed-width SIMDStandardised in WebAssembly 2.0 (2022)Standardised and supported by every current engine.Engine support

Properties

0xFD 74:u32f64x2.gt

greater than

Description

>

Lane-wise comparison of two double-precision floats.

Result: a lane is all ones where the comparison is true and all zeros where it is false, not 1 and 0.

A comparison with NaN is false, so a NaN in either lane gives all zeros. +0 and −0 compare equal.

Stack

[v128 v128] → [v128]

Status

Fixed-width SIMDStandardised in WebAssembly 2.0 (2022)Standardised and supported by every current engine.Engine support

Properties

0xFD 75:u32f64x2.le

less than or equal

Description

Lane-wise comparison of two double-precision floats.

Result: a lane is all ones where the comparison is true and all zeros where it is false, not 1 and 0.

A comparison with NaN is false, so a NaN in either lane gives all zeros. +0 and −0 compare equal.

Stack

[v128 v128] → [v128]

Status

Fixed-width SIMDStandardised in WebAssembly 2.0 (2022)Standardised and supported by every current engine.Engine support

Properties

0xFD 76:u32f64x2.ge

greater than or equal

Description

Lane-wise comparison of two double-precision floats.

Result: a lane is all ones where the comparison is true and all zeros where it is false, not 1 and 0.

A comparison with NaN is false, so a NaN in either lane gives all zeros. +0 and −0 compare equal.

Stack

[v128 v128] → [v128]

Status

Fixed-width SIMDStandardised in WebAssembly 2.0 (2022)Standardised and supported by every current engine.Engine support

Properties

0xFD 77:u32v128.not

Description

Flips each bit of the 128-bit input vector.

Stack

[v128] → [v128]

Status

Fixed-width SIMDStandardised in WebAssembly 2.0 (2022)Standardised and supported by every current engine.Engine support

Properties

0xFD 78:u32v128.and

bitwise and

Description

Bitwise AND of the two 128-bit operands.

Stack

[v128 v128] → [v128]

Status

Fixed-width SIMDStandardised in WebAssembly 2.0 (2022)Standardised and supported by every current engine.Engine support

Properties

0xFD 79:u32v128.andnot

Description

Bitwise AND of the first operand with the bitwise inverse of the second.

Stack

[v128 v128] → [v128]

Status

Fixed-width SIMDStandardised in WebAssembly 2.0 (2022)Standardised and supported by every current engine.Engine support

Properties

0xFD 80:u32v128.or

bitwise or

Description

Bitwise inclusive OR of the two 128-bit operands.

Stack

[v128 v128] → [v128]

Status

Fixed-width SIMDStandardised in WebAssembly 2.0 (2022)Standardised and supported by every current engine.Engine support

Properties

0xFD 81:u32v128.xor

bitwise exclusive or

Description

Bitwise exclusive OR (XOR) of the two 128-bit operands.

Stack

[v128 v128] → [v128]

Status

Fixed-width SIMDStandardised in WebAssembly 2.0 (2022)Standardised and supported by every current engine.Engine support

Properties

0xFD 82:u32v128.bitselect

pick bits from two vectors by a mask

Description

Uses the third operand as a bitmask: where a bit is 1 the result takes that bit from the first operand, where it is 0 from the second.

Stack

[v128 v128 v128] → [v128]

Status

Fixed-width SIMDStandardised in WebAssembly 2.0 (2022)Standardised and supported by every current engine.Engine support

Properties

0xFD 83:u32v128.any_true

Description

Pushes 1 if any lane is non-zero, and 0 if every lane is zero.

Stack

[v128] → [i32]

Status

Fixed-width SIMDStandardised in WebAssembly 2.0 (2022)Standardised and supported by every current engine.Engine support

Properties

0xFD 84:u32v128.load8_lane m l

read 1 byte from memory

Description

Loads 8 bits from memory into lane l of the vector operand. Every other lane is copied through unchanged.

Stack

[i32 v128] → [v128]

Immediate operands

  1. m : memarg — u32 align, then u64 offset
  2. u8 l : laneidx

Alignment

  • align is the base-2 logarithm of the assumed alignment in bytes: 0 for 1 byte, 1 for 2, 2 for 4, 3 for 8, 4 for 16.
  • A value larger than the width of the access is rejected when the module is validated. A smaller one is allowed, and only tells the engine not to assume alignment.
  • Bit 6 (0x40) is not part of the number. When it is set, a u32 memory index follows align, before the offset, and the alignment is what is left after subtracting 64. When it is clear, the instruction uses memory 0.

Addresses: an i32 for a 32-bit memory, an i64 for a 64-bit memory (memory64). The signatures here show the 32-bit case, which is what almost every module uses.

Lane index: counts from 0. A value at or past the number of lanes is rejected when the module is validated, so it can never be out of range at run time.

Status

Fixed-width SIMDStandardised in WebAssembly 2.0 (2022)Standardised and supported by every current engine.Engine support

Properties

0xFD 85:u32v128.load16_lane m l

read 2 bytes from memory

Description

Loads 16 bits from memory into lane l of the vector operand. Every other lane is copied through unchanged.

Stack

[i32 v128] → [v128]

Immediate operands

  1. m : memarg — u32 align, then u64 offset
  2. u8 l : laneidx

Alignment

  • align is the base-2 logarithm of the assumed alignment in bytes: 0 for 1 byte, 1 for 2, 2 for 4, 3 for 8, 4 for 16.
  • A value larger than the width of the access is rejected when the module is validated. A smaller one is allowed, and only tells the engine not to assume alignment.
  • Bit 6 (0x40) is not part of the number. When it is set, a u32 memory index follows align, before the offset, and the alignment is what is left after subtracting 64. When it is clear, the instruction uses memory 0.

Addresses: an i32 for a 32-bit memory, an i64 for a 64-bit memory (memory64). The signatures here show the 32-bit case, which is what almost every module uses.

Lane index: counts from 0. A value at or past the number of lanes is rejected when the module is validated, so it can never be out of range at run time.

Status

Fixed-width SIMDStandardised in WebAssembly 2.0 (2022)Standardised and supported by every current engine.Engine support

Properties

0xFD 86:u32v128.load32_lane m l

read 4 bytes from memory

Description

Loads 32 bits from memory into lane l of the vector operand. Every other lane is copied through unchanged.

Stack

[i32 v128] → [v128]

Immediate operands

  1. m : memarg — u32 align, then u64 offset
  2. u8 l : laneidx

Alignment

  • align is the base-2 logarithm of the assumed alignment in bytes: 0 for 1 byte, 1 for 2, 2 for 4, 3 for 8, 4 for 16.
  • A value larger than the width of the access is rejected when the module is validated. A smaller one is allowed, and only tells the engine not to assume alignment.
  • Bit 6 (0x40) is not part of the number. When it is set, a u32 memory index follows align, before the offset, and the alignment is what is left after subtracting 64. When it is clear, the instruction uses memory 0.

Addresses: an i32 for a 32-bit memory, an i64 for a 64-bit memory (memory64). The signatures here show the 32-bit case, which is what almost every module uses.

Lane index: counts from 0. A value at or past the number of lanes is rejected when the module is validated, so it can never be out of range at run time.

Status

Fixed-width SIMDStandardised in WebAssembly 2.0 (2022)Standardised and supported by every current engine.Engine support

Properties

0xFD 87:u32v128.load64_lane m l

read 8 bytes from memory

Description

Loads 64 bits from memory into lane l of the vector operand. Every other lane is copied through unchanged.

Stack

[i32 v128] → [v128]

Immediate operands

  1. m : memarg — u32 align, then u64 offset
  2. u8 l : laneidx

Alignment

  • align is the base-2 logarithm of the assumed alignment in bytes: 0 for 1 byte, 1 for 2, 2 for 4, 3 for 8, 4 for 16.
  • A value larger than the width of the access is rejected when the module is validated. A smaller one is allowed, and only tells the engine not to assume alignment.
  • Bit 6 (0x40) is not part of the number. When it is set, a u32 memory index follows align, before the offset, and the alignment is what is left after subtracting 64. When it is clear, the instruction uses memory 0.

Addresses: an i32 for a 32-bit memory, an i64 for a 64-bit memory (memory64). The signatures here show the 32-bit case, which is what almost every module uses.

Lane index: counts from 0. A value at or past the number of lanes is rejected when the module is validated, so it can never be out of range at run time.

Status

Fixed-width SIMDStandardised in WebAssembly 2.0 (2022)Standardised and supported by every current engine.Engine support

Properties

0xFD 88:u32v128.store8_lane m l

write the low 1 byte to memory

Description

Stores the 8 bits in lane l of the vector operand to memory.

Stack

[i32 v128] → []

Immediate operands

  1. m : memarg — u32 align, then u64 offset
  2. u8 l : laneidx

Alignment

  • align is the base-2 logarithm of the assumed alignment in bytes: 0 for 1 byte, 1 for 2, 2 for 4, 3 for 8, 4 for 16.
  • A value larger than the width of the access is rejected when the module is validated. A smaller one is allowed, and only tells the engine not to assume alignment.
  • Bit 6 (0x40) is not part of the number. When it is set, a u32 memory index follows align, before the offset, and the alignment is what is left after subtracting 64. When it is clear, the instruction uses memory 0.

Addresses: an i32 for a 32-bit memory, an i64 for a 64-bit memory (memory64). The signatures here show the 32-bit case, which is what almost every module uses.

Lane index: counts from 0. A value at or past the number of lanes is rejected when the module is validated, so it can never be out of range at run time.

Status

Fixed-width SIMDStandardised in WebAssembly 2.0 (2022)Standardised and supported by every current engine.Engine support

Properties

0xFD 89:u32v128.store16_lane m l

write the low 2 bytes to memory

Description

Stores the 16 bits in lane l of the vector operand to memory.

Stack

[i32 v128] → []

Immediate operands

  1. m : memarg — u32 align, then u64 offset
  2. u8 l : laneidx

Alignment

  • align is the base-2 logarithm of the assumed alignment in bytes: 0 for 1 byte, 1 for 2, 2 for 4, 3 for 8, 4 for 16.
  • A value larger than the width of the access is rejected when the module is validated. A smaller one is allowed, and only tells the engine not to assume alignment.
  • Bit 6 (0x40) is not part of the number. When it is set, a u32 memory index follows align, before the offset, and the alignment is what is left after subtracting 64. When it is clear, the instruction uses memory 0.

Addresses: an i32 for a 32-bit memory, an i64 for a 64-bit memory (memory64). The signatures here show the 32-bit case, which is what almost every module uses.

Lane index: counts from 0. A value at or past the number of lanes is rejected when the module is validated, so it can never be out of range at run time.

Status

Fixed-width SIMDStandardised in WebAssembly 2.0 (2022)Standardised and supported by every current engine.Engine support

Properties

0xFD 90:u32v128.store32_lane m l

write the low 4 bytes to memory

Description

Stores the 32 bits in lane l of the vector operand to memory.

Stack

[i32 v128] → []

Immediate operands

  1. m : memarg — u32 align, then u64 offset
  2. u8 l : laneidx

Alignment

  • align is the base-2 logarithm of the assumed alignment in bytes: 0 for 1 byte, 1 for 2, 2 for 4, 3 for 8, 4 for 16.
  • A value larger than the width of the access is rejected when the module is validated. A smaller one is allowed, and only tells the engine not to assume alignment.
  • Bit 6 (0x40) is not part of the number. When it is set, a u32 memory index follows align, before the offset, and the alignment is what is left after subtracting 64. When it is clear, the instruction uses memory 0.

Addresses: an i32 for a 32-bit memory, an i64 for a 64-bit memory (memory64). The signatures here show the 32-bit case, which is what almost every module uses.

Lane index: counts from 0. A value at or past the number of lanes is rejected when the module is validated, so it can never be out of range at run time.

Status

Fixed-width SIMDStandardised in WebAssembly 2.0 (2022)Standardised and supported by every current engine.Engine support

Properties

0xFD 91:u32v128.store64_lane m l

write the low 8 bytes to memory

Description

Stores the 64 bits in lane l of the vector operand to memory.

Stack

[i32 v128] → []

Immediate operands

  1. m : memarg — u32 align, then u64 offset
  2. u8 l : laneidx

Alignment

  • align is the base-2 logarithm of the assumed alignment in bytes: 0 for 1 byte, 1 for 2, 2 for 4, 3 for 8, 4 for 16.
  • A value larger than the width of the access is rejected when the module is validated. A smaller one is allowed, and only tells the engine not to assume alignment.
  • Bit 6 (0x40) is not part of the number. When it is set, a u32 memory index follows align, before the offset, and the alignment is what is left after subtracting 64. When it is clear, the instruction uses memory 0.

Addresses: an i32 for a 32-bit memory, an i64 for a 64-bit memory (memory64). The signatures here show the 32-bit case, which is what almost every module uses.

Lane index: counts from 0. A value at or past the number of lanes is rejected when the module is validated, so it can never be out of range at run time.

Status

Fixed-width SIMDStandardised in WebAssembly 2.0 (2022)Standardised and supported by every current engine.Engine support

Properties

0xFD 92:u32v128.load32_zero m

read 4 bytes from memory

Description

Load a 32-bit element into the low bits of the vector and sets all other bits to zero.

Stack

[i32] → [v128]

Immediate operands

  1. m : memarg — u32 align, then u64 offset

Alignment

  • align is the base-2 logarithm of the assumed alignment in bytes: 0 for 1 byte, 1 for 2, 2 for 4, 3 for 8, 4 for 16.
  • A value larger than the width of the access is rejected when the module is validated. A smaller one is allowed, and only tells the engine not to assume alignment.
  • Bit 6 (0x40) is not part of the number. When it is set, a u32 memory index follows align, before the offset, and the alignment is what is left after subtracting 64. When it is clear, the instruction uses memory 0.

Addresses: an i32 for a 32-bit memory, an i64 for a 64-bit memory (memory64). The signatures here show the 32-bit case, which is what almost every module uses.

Status

Fixed-width SIMDStandardised in WebAssembly 2.0 (2022)Standardised and supported by every current engine.Engine support

Properties

0xFD 93:u32v128.load64_zero m

read 8 bytes from memory

Description

Load a 64-bit element into the low bits of the vector and sets all other bits to zero.

Stack

[i32] → [v128]

Immediate operands

  1. m : memarg — u32 align, then u64 offset

Alignment

  • align is the base-2 logarithm of the assumed alignment in bytes: 0 for 1 byte, 1 for 2, 2 for 4, 3 for 8, 4 for 16.
  • A value larger than the width of the access is rejected when the module is validated. A smaller one is allowed, and only tells the engine not to assume alignment.
  • Bit 6 (0x40) is not part of the number. When it is set, a u32 memory index follows align, before the offset, and the alignment is what is left after subtracting 64. When it is clear, the instruction uses memory 0.

Addresses: an i32 for a 32-bit memory, an i64 for a 64-bit memory (memory64). The signatures here show the 32-bit case, which is what almost every module uses.

Status

Fixed-width SIMDStandardised in WebAssembly 2.0 (2022)Standardised and supported by every current engine.Engine support

Properties

0xFD 94:u32f32x4.demote_f64x2_zero

to the narrower float type

Description

Conversion of the two double-precision floating point lanes to two lower single-precision lanes of the result. The two higher lanes of the result are initialized to zero. If the conversion result is not representable as a single-precision floating point number, it is rounded to the nearest-even representable number.

Stack

[v128] → [v128]

Status

Fixed-width SIMDStandardised in WebAssembly 2.0 (2022)Standardised and supported by every current engine.Engine support

Properties

0xFD 95:u32f64x2.promote_low_f32x4

to the wider float type

Description

Conversion of the two lower single-precision floating point lanes to the two double-precision lanes of the result.

Stack

[v128] → [v128]

Status

Fixed-width SIMDStandardised in WebAssembly 2.0 (2022)Standardised and supported by every current engine.Engine support

Properties

0xFD 96:u32i8x16.abs

absolute value

Description

Lane-wise wrapping absolute value.

Stack

[v128] → [v128]

Status

Fixed-width SIMDStandardised in WebAssembly 2.0 (2022)Standardised and supported by every current engine.Engine support

Properties

0xFD 97:u32i8x16.neg

negate

Description

Negates a 128-bit vectors interpreted as sixteen 8-bit signed integers.

Stack

[v128] → [v128]

Status

Fixed-width SIMDStandardised in WebAssembly 2.0 (2022)Standardised and supported by every current engine.Engine support

Properties

0xFD 98:u32i8x16.popcnt

count one bits

Description

Count the number of bits set to one within each lane.

Stack

[v128] → [v128]

Status

Fixed-width SIMDStandardised in WebAssembly 2.0 (2022)Standardised and supported by every current engine.Engine support

Properties

0xFD 99:u32i8x16.all_true

Description

Pushes 1 if every lane is non-zero, and 0 if any lane is zero.

Stack

[v128] → [i32]

Status

Fixed-width SIMDStandardised in WebAssembly 2.0 (2022)Standardised and supported by every current engine.Engine support

Properties

0xFD 100:u32i8x16.bitmask

Description

Takes the high bit of each of the 16 lanes and packs them into the low 16 bits of an i32, lane 0 in bit 0. The bits above them are zero.

Stack

[v128] → [i32]

Status

Fixed-width SIMDStandardised in WebAssembly 2.0 (2022)Standardised and supported by every current engine.Engine support

Properties

0xFD 101:u32i8x16.narrow_i16x8_s

Description

Converts two input vectors into a smaller lane vector by narrowing each lane.

Signed saturation to 0x7F or 0x80 is used and the input lanes are always interpreted as signed integers.

Stack

[v128 v128] → [v128]

Status

Fixed-width SIMDStandardised in WebAssembly 2.0 (2022)Standardised and supported by every current engine.Engine support

Properties

0xFD 102:u32i8x16.narrow_i16x8_u

Description

Converts two input vectors into a smaller lane vector by narrowing each lane.

Stack

[v128 v128] → [v128]

Status

Fixed-width SIMDStandardised in WebAssembly 2.0 (2022)Standardised and supported by every current engine.Engine support

Properties

0xFD 103:u32f32x4.ceil

round up to the nearest integer

Description

Lane-wise rounding to the nearest integral value not smaller than the input.

Stack

[v128] → [v128]

Status

Fixed-width SIMDStandardised in WebAssembly 2.0 (2022)Standardised and supported by every current engine.Engine support

Properties

0xFD 104:u32f32x4.floor

round down to the nearest integer

Description

Lane-wise rounding to the nearest integral value not greater than the input.

Stack

[v128] → [v128]

Status

Fixed-width SIMDStandardised in WebAssembly 2.0 (2022)Standardised and supported by every current engine.Engine support

Properties

0xFD 105:u32f32x4.trunc

round toward zero

Description

Lane-wise rounding to the nearest integral value with the magnitude not larger than the input.

Stack

[v128] → [v128]

Status

Fixed-width SIMDStandardised in WebAssembly 2.0 (2022)Standardised and supported by every current engine.Engine support

Properties

0xFD 106:u32f32x4.nearest

round to the nearest integer, ties to even

Description

Lane-wise rounding to the nearest integral value; if two values are equally near, rounds to the even one.

Stack

[v128] → [v128]

Status

Fixed-width SIMDStandardised in WebAssembly 2.0 (2022)Standardised and supported by every current engine.Engine support

Properties

0xFD 107:u32i8x16.shl

shift left

Description

Shifts each lane to the left by the specified number of bits.

Only the low bits of the shift amount are used if the shift amount is greater than the lane width.

Stack

[v128 i32] → [v128]

Status

Fixed-width SIMDStandardised in WebAssembly 2.0 (2022)Standardised and supported by every current engine.Engine support

Properties

0xFD 108:u32i8x16.shr_s

shift right, signed

Description

Shifts each lane to the right by the specified number of bits, sign extending.

Only the low bits of the shift amount are used if the shift amount is greater than the lane width.

Stack

[v128 i32] → [v128]

Status

Fixed-width SIMDStandardised in WebAssembly 2.0 (2022)Standardised and supported by every current engine.Engine support

Properties

0xFD 109:u32i8x16.shr_u

shift right, unsigned

Description

Shifts each lane to the right by the specified number of bits, shifting in zeros.

Stack

[v128 i32] → [v128]

Status

Fixed-width SIMDStandardised in WebAssembly 2.0 (2022)Standardised and supported by every current engine.Engine support

Properties

0xFD 110:u32i8x16.add

add

Description

Adds two 128-bit vectors as if they were two packed sixteen 8-bit integers.

Stack

[v128 v128] → [v128]

Status

Fixed-width SIMDStandardised in WebAssembly 2.0 (2022)Standardised and supported by every current engine.Engine support

Properties

0xFD 111:u32i8x16.add_sat_s

add, signed

Description

Adds two 128-bit vectors as if they were two packed sixteen 8-bit signed integers, saturating on overflow to i8::MAX.

Stack

[v128 v128] → [v128]

Status

Fixed-width SIMDStandardised in WebAssembly 2.0 (2022)Standardised and supported by every current engine.Engine support

Properties

0xFD 112:u32i8x16.add_sat_u

add, unsigned

Description

Adds two 128-bit vectors as if they were two packed sixteen 8-bit unsigned integers, saturating on overflow to u8::MAX.

Stack

[v128 v128] → [v128]

Status

Fixed-width SIMDStandardised in WebAssembly 2.0 (2022)Standardised and supported by every current engine.Engine support

Properties

0xFD 113:u32i8x16.sub

subtract

Description

Subtracts two 128-bit vectors as if they were two packed sixteen 8-bit integers.

Stack

[v128 v128] → [v128]

Status

Fixed-width SIMDStandardised in WebAssembly 2.0 (2022)Standardised and supported by every current engine.Engine support

Properties

0xFD 114:u32i8x16.sub_sat_s

subtract, signed

Description

Subtracts two 128-bit vectors as if they were two packed sixteen 8-bit signed integers, saturating on overflow to i8::MIN.

Stack

[v128 v128] → [v128]

Status

Fixed-width SIMDStandardised in WebAssembly 2.0 (2022)Standardised and supported by every current engine.Engine support

Properties

0xFD 115:u32i8x16.sub_sat_u

subtract, unsigned

Description

Subtracts two 128-bit vectors as if they were two packed sixteen 8-bit unsigned integers, saturating on overflow to 0.

Stack

[v128 v128] → [v128]

Status

Fixed-width SIMDStandardised in WebAssembly 2.0 (2022)Standardised and supported by every current engine.Engine support

Properties

0xFD 116:u32f64x2.ceil

round up to the nearest integer

Description

Lane-wise rounding to the nearest integral value not smaller than the input.

Stack

[v128] → [v128]

Status

Fixed-width SIMDStandardised in WebAssembly 2.0 (2022)Standardised and supported by every current engine.Engine support

Properties

0xFD 117:u32f64x2.floor

round down to the nearest integer

Description

Lane-wise rounding to the nearest integral value not greater than the input.

Stack

[v128] → [v128]

Status

Fixed-width SIMDStandardised in WebAssembly 2.0 (2022)Standardised and supported by every current engine.Engine support

Properties

0xFD 118:u32i8x16.min_s

smaller of the two, signed

Description

Compares lane-wise signed integers, and returns the minimum of each pair.

Stack

[v128 v128] → [v128]

Status

Fixed-width SIMDStandardised in WebAssembly 2.0 (2022)Standardised and supported by every current engine.Engine support

Properties

0xFD 119:u32i8x16.min_u

smaller of the two, unsigned

Description

Compares lane-wise unsigned integers, and returns the minimum of each pair.

Stack

[v128 v128] → [v128]

Status

Fixed-width SIMDStandardised in WebAssembly 2.0 (2022)Standardised and supported by every current engine.Engine support

Properties

0xFD 120:u32i8x16.max_s

larger of the two, signed

Description

Compares lane-wise signed integers, and returns the maximum of each pair.

Stack

[v128 v128] → [v128]

Status

Fixed-width SIMDStandardised in WebAssembly 2.0 (2022)Standardised and supported by every current engine.Engine support

Properties

0xFD 121:u32i8x16.max_u

larger of the two, unsigned

Description

Compares lane-wise unsigned integers, and returns the maximum of each pair.

Stack

[v128 v128] → [v128]

Status

Fixed-width SIMDStandardised in WebAssembly 2.0 (2022)Standardised and supported by every current engine.Engine support

Properties

0xFD 122:u32f64x2.trunc

round toward zero

Description

Lane-wise rounding to the nearest integral value with the magnitude not larger than the input.

Stack

[v128] → [v128]

Status

Fixed-width SIMDStandardised in WebAssembly 2.0 (2022)Standardised and supported by every current engine.Engine support

Properties

0xFD 123:u32i8x16.avgr_u

Description

Lane-wise rounding average.

Stack

[v128 v128] → [v128]

Status

Fixed-width SIMDStandardised in WebAssembly 2.0 (2022)Standardised and supported by every current engine.Engine support

Properties

0xFD 124:u32i16x8.extadd_pairwise_i8x16_s

Description

Integer extended pairwise addition producing extended results (twice wider results than the inputs).

Stack

[v128] → [v128]

Status

Fixed-width SIMDStandardised in WebAssembly 2.0 (2022)Standardised and supported by every current engine.Engine support

Properties

0xFD 125:u32i16x8.extadd_pairwise_i8x16_u

Description

Integer extended pairwise addition producing extended results (twice wider results than the inputs).

Stack

[v128] → [v128]

Status

Fixed-width SIMDStandardised in WebAssembly 2.0 (2022)Standardised and supported by every current engine.Engine support

Properties

0xFD 126:u32i32x4.extadd_pairwise_i16x8_s

Description

Integer extended pairwise addition producing extended results (twice wider results than the inputs).

Stack

[v128] → [v128]

Status

Fixed-width SIMDStandardised in WebAssembly 2.0 (2022)Standardised and supported by every current engine.Engine support

Properties

0xFD 127:u32i32x4.extadd_pairwise_i16x8_u

Description

Integer extended pairwise addition producing extended results (twice wider results than the inputs).

Stack

[v128] → [v128]

Status

Fixed-width SIMDStandardised in WebAssembly 2.0 (2022)Standardised and supported by every current engine.Engine support

Properties

0xFD 128:u32i16x8.abs

absolute value

Description

Lane-wise wrapping absolute value.

Stack

[v128] → [v128]

Status

Fixed-width SIMDStandardised in WebAssembly 2.0 (2022)Standardised and supported by every current engine.Engine support

Properties

0xFD 129:u32i16x8.neg

negate

Description

Negates a 128-bit vectors interpreted as eight 16-bit signed integers.

Stack

[v128] → [v128]

Status

Fixed-width SIMDStandardised in WebAssembly 2.0 (2022)Standardised and supported by every current engine.Engine support

Properties

0xFD 130:u32i16x8.q15mulr_sat_s

Description

Lane-wise saturating rounding multiplication in Q15 fixed-point format.

Stack

[v128 v128] → [v128]

Status

Fixed-width SIMDStandardised in WebAssembly 2.0 (2022)Standardised and supported by every current engine.Engine support

Properties

0xFD 131:u32i16x8.all_true

Description

Pushes 1 if every lane is non-zero, and 0 if any lane is zero.

Stack

[v128] → [i32]

Status

Fixed-width SIMDStandardised in WebAssembly 2.0 (2022)Standardised and supported by every current engine.Engine support

Properties

0xFD 132:u32i16x8.bitmask

Description

Takes the high bit of each of the 8 lanes and packs them into the low 8 bits of an i32, lane 0 in bit 0. The bits above them are zero.

Stack

[v128] → [i32]

Status

Fixed-width SIMDStandardised in WebAssembly 2.0 (2022)Standardised and supported by every current engine.Engine support

Properties

0xFD 133:u32i16x8.narrow_i32x4_s

Description

Converts two input vectors into a smaller lane vector by narrowing each lane.

Stack

[v128 v128] → [v128]

Status

Fixed-width SIMDStandardised in WebAssembly 2.0 (2022)Standardised and supported by every current engine.Engine support

Properties

0xFD 134:u32i16x8.narrow_i32x4_u

Description

Converts two input vectors into a smaller lane vector by narrowing each lane.

Stack

[v128 v128] → [v128]

Status

Fixed-width SIMDStandardised in WebAssembly 2.0 (2022)Standardised and supported by every current engine.Engine support

Properties

0xFD 135:u32i16x8.extend_low_i8x16_s

widen, keeping the value, signed

Description

Converts low half of the smaller lane vector to a larger lane vector, sign extended.

Stack

[v128] → [v128]

Status

Fixed-width SIMDStandardised in WebAssembly 2.0 (2022)Standardised and supported by every current engine.Engine support

Properties

0xFD 136:u32i16x8.extend_high_i8x16_s

widen, keeping the value, signed

Description

Converts high half of the smaller lane vector to a larger lane vector, sign extended.

Stack

[v128] → [v128]

Status

Fixed-width SIMDStandardised in WebAssembly 2.0 (2022)Standardised and supported by every current engine.Engine support

Properties

0xFD 137:u32i16x8.extend_low_i8x16_u

widen, keeping the value, unsigned

Description

Converts low half of the smaller lane vector to a larger lane vector, zero extended.

Stack

[v128] → [v128]

Status

Fixed-width SIMDStandardised in WebAssembly 2.0 (2022)Standardised and supported by every current engine.Engine support

Properties

0xFD 138:u32i16x8.extend_high_i8x16_u

widen, keeping the value, unsigned

Description

Converts high half of the smaller lane vector to a larger lane vector, zero extended.

Stack

[v128] → [v128]

Status

Fixed-width SIMDStandardised in WebAssembly 2.0 (2022)Standardised and supported by every current engine.Engine support

Properties

0xFD 139:u32i16x8.shl

shift left

Description

Shifts each lane to the left by the specified number of bits.

Stack

[v128 i32] → [v128]

Status

Fixed-width SIMDStandardised in WebAssembly 2.0 (2022)Standardised and supported by every current engine.Engine support

Properties

0xFD 140:u32i16x8.shr_s

shift right, signed

Description

Shifts each lane to the right by the specified number of bits, sign extending.

Stack

[v128 i32] → [v128]

Status

Fixed-width SIMDStandardised in WebAssembly 2.0 (2022)Standardised and supported by every current engine.Engine support

Properties

0xFD 141:u32i16x8.shr_u

shift right, unsigned

Description

Shifts each lane to the right by the specified number of bits, shifting in zeros.

Stack

[v128 i32] → [v128]

Status

Fixed-width SIMDStandardised in WebAssembly 2.0 (2022)Standardised and supported by every current engine.Engine support

Properties

0xFD 142:u32i16x8.add

add

Description

Adds two 128-bit vectors as if they were two packed eight 16-bit integers.

Stack

[v128 v128] → [v128]

Status

Fixed-width SIMDStandardised in WebAssembly 2.0 (2022)Standardised and supported by every current engine.Engine support

Properties

0xFD 143:u32i16x8.add_sat_s

add, signed

Description

Adds two 128-bit vectors as if they were two packed eight 16-bit signed integers, saturating on overflow to i16::MAX.

Stack

[v128 v128] → [v128]

Status

Fixed-width SIMDStandardised in WebAssembly 2.0 (2022)Standardised and supported by every current engine.Engine support

Properties

0xFD 144:u32i16x8.add_sat_u

add, unsigned

Description

Adds two 128-bit vectors as if they were two packed eight 16-bit unsigned integers, saturating on overflow to u16::MAX.

Stack

[v128 v128] → [v128]

Status

Fixed-width SIMDStandardised in WebAssembly 2.0 (2022)Standardised and supported by every current engine.Engine support

Properties

0xFD 145:u32i16x8.sub

subtract

Description

Subtracts two 128-bit vectors as if they were two packed eight 16-bit integers.

Stack

[v128 v128] → [v128]

Status

Fixed-width SIMDStandardised in WebAssembly 2.0 (2022)Standardised and supported by every current engine.Engine support

Properties

0xFD 146:u32i16x8.sub_sat_s

subtract, signed

Description

Subtracts two 128-bit vectors as if they were two packed eight 16-bit signed integers, saturating on overflow to i16::MIN.

Stack

[v128 v128] → [v128]

Status

Fixed-width SIMDStandardised in WebAssembly 2.0 (2022)Standardised and supported by every current engine.Engine support

Properties

0xFD 147:u32i16x8.sub_sat_u

subtract, unsigned

Description

Subtracts two 128-bit vectors as if they were two packed eight 16-bit unsigned integers, saturating on overflow to 0.

Stack

[v128 v128] → [v128]

Status

Fixed-width SIMDStandardised in WebAssembly 2.0 (2022)Standardised and supported by every current engine.Engine support

Properties

0xFD 148:u32f64x2.nearest

round to the nearest integer, ties to even

Description

Lane-wise rounding to the nearest integral value; if two values are equally near, rounds to the even one.

Stack

[v128] → [v128]

Status

Fixed-width SIMDStandardised in WebAssembly 2.0 (2022)Standardised and supported by every current engine.Engine support

Properties

0xFD 149:u32i16x8.mul

multiply

Description

Multiplies two 128-bit vectors as if they were two packed eight 16-bit integers.

Stack

[v128 v128] → [v128]

Status

Fixed-width SIMDStandardised in WebAssembly 2.0 (2022)Standardised and supported by every current engine.Engine support

Properties

0xFD 150:u32i16x8.min_s

smaller of the two, signed

Description

Compares lane-wise signed integers, and returns the minimum of each pair.

Stack

[v128 v128] → [v128]

Status

Fixed-width SIMDStandardised in WebAssembly 2.0 (2022)Standardised and supported by every current engine.Engine support

Properties

0xFD 151:u32i16x8.min_u

smaller of the two, unsigned

Description

Compares lane-wise unsigned integers, and returns the minimum of each pair.

Stack

[v128 v128] → [v128]

Status

Fixed-width SIMDStandardised in WebAssembly 2.0 (2022)Standardised and supported by every current engine.Engine support

Properties

0xFD 152:u32i16x8.max_s

larger of the two, signed

Description

Compares lane-wise signed integers, and returns the maximum of each pair.

Stack

[v128 v128] → [v128]

Status

Fixed-width SIMDStandardised in WebAssembly 2.0 (2022)Standardised and supported by every current engine.Engine support

Properties

0xFD 153:u32i16x8.max_u

larger of the two, unsigned

Description

Compares lane-wise unsigned integers, and returns the maximum of each pair.

Stack

[v128 v128] → [v128]

Status

Fixed-width SIMDStandardised in WebAssembly 2.0 (2022)Standardised and supported by every current engine.Engine support

Properties

0xFD 155:u32i16x8.avgr_u

Description

Lane-wise rounding average.

Stack

[v128 v128] → [v128]

Status

Fixed-width SIMDStandardised in WebAssembly 2.0 (2022)Standardised and supported by every current engine.Engine support

Properties

0xFD 156:u32i16x8.extmul_low_i8x16_s

Description

Lane-wise integer extended multiplication producing twice wider result than the inputs.

Stack

[v128 v128] → [v128]

Status

Fixed-width SIMDStandardised in WebAssembly 2.0 (2022)Standardised and supported by every current engine.Engine support

Properties

0xFD 157:u32i16x8.extmul_high_i8x16_s

Description

Lane-wise integer extended multiplication producing twice wider result than the inputs.

Stack

[v128 v128] → [v128]

Status

Fixed-width SIMDStandardised in WebAssembly 2.0 (2022)Standardised and supported by every current engine.Engine support

Properties

0xFD 158:u32i16x8.extmul_low_i8x16_u

Description

Lane-wise integer extended multiplication producing twice wider result than the inputs.

Stack

[v128 v128] → [v128]

Status

Fixed-width SIMDStandardised in WebAssembly 2.0 (2022)Standardised and supported by every current engine.Engine support

Properties

0xFD 159:u32i16x8.extmul_high_i8x16_u

Description

Lane-wise integer extended multiplication producing twice wider result than the inputs.

Stack

[v128 v128] → [v128]

Status

Fixed-width SIMDStandardised in WebAssembly 2.0 (2022)Standardised and supported by every current engine.Engine support

Properties

0xFD 160:u32i32x4.abs

absolute value

Description

Lane-wise wrapping absolute value.

Stack

[v128] → [v128]

Status

Fixed-width SIMDStandardised in WebAssembly 2.0 (2022)Standardised and supported by every current engine.Engine support

Properties

0xFD 161:u32i32x4.neg

negate

Description

Negates a 128-bit vectors interpreted as four 32-bit signed integers.

Stack

[v128] → [v128]

Status

Fixed-width SIMDStandardised in WebAssembly 2.0 (2022)Standardised and supported by every current engine.Engine support

Properties

0xFD 162:u32i8x16.relaxed_swizzle

Description

An encoding used while relaxed SIMD was being prototyped. Relaxed SIMD was standardised in the 0xFD 256 and above range, and this slot is unassigned again.

Stack

[v128 v128] → [v128]

Relaxed: an engine may pick among several permitted results for the same input. The deterministic profile fixes one choice.

Status

Relaxed SIMD, prototype encoding

Withdrawn (2022)Replaced by the standardised relaxed SIMD range at 0xFD 256+

An encoding used while relaxed SIMD was being prototyped, abandoned when it moved to the 0xFD 256 and above range. These slots are unassigned today.

Properties

0xFD 163:u32i32x4.all_true

Description

Pushes 1 if every lane is non-zero, and 0 if any lane is zero.

Stack

[v128] → [i32]

Status

Fixed-width SIMDStandardised in WebAssembly 2.0 (2022)Standardised and supported by every current engine.Engine support

Properties

0xFD 164:u32i32x4.bitmask

Description

Takes the high bit of each of the 4 lanes and packs them into the low 4 bits of an i32, lane 0 in bit 0. The bits above them are zero.

Stack

[v128] → [i32]

Status

Fixed-width SIMDStandardised in WebAssembly 2.0 (2022)Standardised and supported by every current engine.Engine support

Properties

0xFD 165:u32i32x4.relaxed_trunc_f32x4_s

Description

An encoding used while relaxed SIMD was being prototyped. Relaxed SIMD was standardised in the 0xFD 256 and above range, and this slot is unassigned again.

Stack

[v128] → [v128]

Relaxed: an engine may pick among several permitted results for the same input. The deterministic profile fixes one choice.

Status

Relaxed SIMD, prototype encoding

Withdrawn (2022)Replaced by the standardised relaxed SIMD range at 0xFD 256+

An encoding used while relaxed SIMD was being prototyped, abandoned when it moved to the 0xFD 256 and above range. These slots are unassigned today.

Properties

0xFD 166:u32i32x4.relaxed_trunc_f32x4_u

Description

An encoding used while relaxed SIMD was being prototyped. Relaxed SIMD was standardised in the 0xFD 256 and above range, and this slot is unassigned again.

Stack

[v128] → [v128]

Relaxed: an engine may pick among several permitted results for the same input. The deterministic profile fixes one choice.

Status

Relaxed SIMD, prototype encoding

Withdrawn (2022)Replaced by the standardised relaxed SIMD range at 0xFD 256+

An encoding used while relaxed SIMD was being prototyped, abandoned when it moved to the 0xFD 256 and above range. These slots are unassigned today.

Properties

0xFD 167:u32i32x4.extend_low_i16x8_s

widen, keeping the value, signed

Description

Converts low half of the smaller lane vector to a larger lane vector, sign extended.

Stack

[v128] → [v128]

Status

Fixed-width SIMDStandardised in WebAssembly 2.0 (2022)Standardised and supported by every current engine.Engine support

Properties

0xFD 168:u32i32x4.extend_high_i16x8_s

widen, keeping the value, signed

Description

Converts high half of the smaller lane vector to a larger lane vector, sign extended.

Stack

[v128] → [v128]

Status

Fixed-width SIMDStandardised in WebAssembly 2.0 (2022)Standardised and supported by every current engine.Engine support

Properties

0xFD 169:u32i32x4.extend_low_i16x8_u

widen, keeping the value, unsigned

Description

Converts low half of the smaller lane vector to a larger lane vector, zero extended.

Stack

[v128] → [v128]

Status

Fixed-width SIMDStandardised in WebAssembly 2.0 (2022)Standardised and supported by every current engine.Engine support

Properties

0xFD 170:u32i32x4.extend_high_i16x8_u

widen, keeping the value, unsigned

Description

Converts high half of the smaller lane vector to a larger lane vector, zero extended.

Stack

[v128] → [v128]

Status

Fixed-width SIMDStandardised in WebAssembly 2.0 (2022)Standardised and supported by every current engine.Engine support

Properties

0xFD 171:u32i32x4.shl

shift left

Description

Shifts each lane to the left by the specified number of bits.

Stack

[v128 i32] → [v128]

Status

Fixed-width SIMDStandardised in WebAssembly 2.0 (2022)Standardised and supported by every current engine.Engine support

Properties

0xFD 172:u32i32x4.shr_s

shift right, signed

Description

Shifts each lane to the right by the specified number of bits, sign extending.

Stack

[v128 i32] → [v128]

Status

Fixed-width SIMDStandardised in WebAssembly 2.0 (2022)Standardised and supported by every current engine.Engine support

Properties

0xFD 173:u32i32x4.shr_u

shift right, unsigned

Description

Shifts each lane to the right by the specified number of bits, shifting in zeros.

Stack

[v128 i32] → [v128]

Status

Fixed-width SIMDStandardised in WebAssembly 2.0 (2022)Standardised and supported by every current engine.Engine support

Properties

0xFD 174:u32i32x4.add

add

Description

Adds two 128-bit vectors as if they were two packed four 32-bit integers.

Stack

[v128 v128] → [v128]

Status

Fixed-width SIMDStandardised in WebAssembly 2.0 (2022)Standardised and supported by every current engine.Engine support

Properties

0xFD 175:u32f32x4.relaxed_madd

Description

An encoding used while relaxed SIMD was being prototyped. Relaxed SIMD was standardised in the 0xFD 256 and above range, and this slot is unassigned again.

Stack

[v128 v128 v128] → [v128]

Relaxed: an engine may pick among several permitted results for the same input. The deterministic profile fixes one choice.

Status

Relaxed SIMD, prototype encoding

Withdrawn (2022)Replaced by the standardised relaxed SIMD range at 0xFD 256+

An encoding used while relaxed SIMD was being prototyped, abandoned when it moved to the 0xFD 256 and above range. These slots are unassigned today.

Properties

0xFD 176:u32f32x4.relaxed_nmadd

Description

An encoding used while relaxed SIMD was being prototyped. Relaxed SIMD was standardised in the 0xFD 256 and above range, and this slot is unassigned again.

Stack

[v128 v128 v128] → [v128]

Relaxed: an engine may pick among several permitted results for the same input. The deterministic profile fixes one choice.

Status

Relaxed SIMD, prototype encoding

Withdrawn (2022)Replaced by the standardised relaxed SIMD range at 0xFD 256+

An encoding used while relaxed SIMD was being prototyped, abandoned when it moved to the 0xFD 256 and above range. These slots are unassigned today.

Properties

0xFD 177:u32i32x4.sub

subtract

Description

Subtracts two 128-bit vectors as if they were two packed four 32-bit integers.

Stack

[v128 v128] → [v128]

Status

Fixed-width SIMDStandardised in WebAssembly 2.0 (2022)Standardised and supported by every current engine.Engine support

Properties

0xFD 178:u32i8x16.relaxed_laneselect

Description

An encoding used while relaxed SIMD was being prototyped. Relaxed SIMD was standardised in the 0xFD 256 and above range, and this slot is unassigned again.

Stack

[v128 v128 v128] → [v128]

Relaxed: an engine may pick among several permitted results for the same input. The deterministic profile fixes one choice.

Status

Relaxed SIMD, prototype encoding

Withdrawn (2022)Replaced by the standardised relaxed SIMD range at 0xFD 256+

An encoding used while relaxed SIMD was being prototyped, abandoned when it moved to the 0xFD 256 and above range. These slots are unassigned today.

Properties

0xFD 179:u32i16x8.relaxed_laneselect

Description

An encoding used while relaxed SIMD was being prototyped. Relaxed SIMD was standardised in the 0xFD 256 and above range, and this slot is unassigned again.

Stack

[v128 v128 v128] → [v128]

Relaxed: an engine may pick among several permitted results for the same input. The deterministic profile fixes one choice.

Status

Relaxed SIMD, prototype encoding

Withdrawn (2022)Replaced by the standardised relaxed SIMD range at 0xFD 256+

An encoding used while relaxed SIMD was being prototyped, abandoned when it moved to the 0xFD 256 and above range. These slots are unassigned today.

Properties

0xFD 180:u32f32x4.relaxed_min

Description

An encoding used while relaxed SIMD was being prototyped. Relaxed SIMD was standardised in the 0xFD 256 and above range, and this slot is unassigned again.

Stack

[v128 v128] → [v128]

Relaxed: an engine may pick among several permitted results for the same input. The deterministic profile fixes one choice.

Status

Relaxed SIMD, prototype encoding

Withdrawn (2022)Replaced by the standardised relaxed SIMD range at 0xFD 256+

An encoding used while relaxed SIMD was being prototyped, abandoned when it moved to the 0xFD 256 and above range. These slots are unassigned today.

Properties

0xFD 181:u32i32x4.mul

multiply

Description

Multiplies two 128-bit vectors as if they were two packed four 32-bit signed integers.

Stack

[v128 v128] → [v128]

Status

Fixed-width SIMDStandardised in WebAssembly 2.0 (2022)Standardised and supported by every current engine.Engine support

Properties

0xFD 182:u32i32x4.min_s

smaller of the two, signed

Description

Compares lane-wise signed integers, and returns the minimum of each pair.

Stack

[v128 v128] → [v128]

Status

Fixed-width SIMDStandardised in WebAssembly 2.0 (2022)Standardised and supported by every current engine.Engine support

Properties

0xFD 183:u32i32x4.min_u

smaller of the two, unsigned

Description

Compares lane-wise unsigned integers, and returns the minimum of each pair.

Stack

[v128 v128] → [v128]

Status

Fixed-width SIMDStandardised in WebAssembly 2.0 (2022)Standardised and supported by every current engine.Engine support

Properties

0xFD 184:u32i32x4.max_s

larger of the two, signed

Description

Compares lane-wise signed integers, and returns the maximum of each pair.

Stack

[v128 v128] → [v128]

Status

Fixed-width SIMDStandardised in WebAssembly 2.0 (2022)Standardised and supported by every current engine.Engine support

Properties

0xFD 185:u32i32x4.max_u

larger of the two, unsigned

Description

Compares lane-wise unsigned integers, and returns the maximum of each pair.

Stack

[v128 v128] → [v128]

Status

Fixed-width SIMDStandardised in WebAssembly 2.0 (2022)Standardised and supported by every current engine.Engine support

Properties

0xFD 186:u32i32x4.dot_i16x8_s

Description

Lane-wise multiply signed 16-bit integers in the two input vectors and add adjacent pairs of the full 32-bit results.

Stack

[v128 v128] → [v128]

Status

Fixed-width SIMDStandardised in WebAssembly 2.0 (2022)Standardised and supported by every current engine.Engine support

Properties

0xFD 188:u32i32x4.extmul_low_i16x8_s

Description

Lane-wise integer extended multiplication producing twice wider result than the inputs.

Stack

[v128 v128] → [v128]

Status

Fixed-width SIMDStandardised in WebAssembly 2.0 (2022)Standardised and supported by every current engine.Engine support

Properties

0xFD 189:u32i32x4.extmul_high_i16x8_s

Description

Lane-wise integer extended multiplication producing twice wider result than the inputs.

Stack

[v128 v128] → [v128]

Status

Fixed-width SIMDStandardised in WebAssembly 2.0 (2022)Standardised and supported by every current engine.Engine support

Properties

0xFD 190:u32i32x4.extmul_low_i16x8_u

Description

Lane-wise integer extended multiplication producing twice wider result than the inputs.

Stack

[v128 v128] → [v128]

Status

Fixed-width SIMDStandardised in WebAssembly 2.0 (2022)Standardised and supported by every current engine.Engine support

Properties

0xFD 191:u32i32x4.extmul_high_i16x8_u

Description

Lane-wise integer extended multiplication producing twice wider result than the inputs.

Stack

[v128 v128] → [v128]

Status

Fixed-width SIMDStandardised in WebAssembly 2.0 (2022)Standardised and supported by every current engine.Engine support

Properties

0xFD 192:u32i64x2.abs

absolute value

Description

Lane-wise wrapping absolute value.

Stack

[v128] → [v128]

Status

Fixed-width SIMDStandardised in WebAssembly 2.0 (2022)Standardised and supported by every current engine.Engine support

Properties

0xFD 193:u32i64x2.neg

negate

Description

Negates a 128-bit vectors interpreted as two 64-bit signed integers.

Stack

[v128] → [v128]

Status

Fixed-width SIMDStandardised in WebAssembly 2.0 (2022)Standardised and supported by every current engine.Engine support

Properties

0xFD 195:u32i64x2.all_true

Description

Pushes 1 if every lane is non-zero, and 0 if any lane is zero.

Stack

[v128] → [i32]

Status

Fixed-width SIMDStandardised in WebAssembly 2.0 (2022)Standardised and supported by every current engine.Engine support

Properties

0xFD 196:u32i64x2.bitmask

Description

Takes the high bit of each of the 2 lanes and packs them into the low 2 bits of an i32, lane 0 in bit 0. The bits above them are zero.

Stack

[v128] → [i32]

Status

Fixed-width SIMDStandardised in WebAssembly 2.0 (2022)Standardised and supported by every current engine.Engine support

Properties

0xFD 197:u32i32x4.relaxed_trunc_f64x2_s_zero

Description

An encoding used while relaxed SIMD was being prototyped. Relaxed SIMD was standardised in the 0xFD 256 and above range, and this slot is unassigned again.

Stack

[v128] → [v128]

Relaxed: an engine may pick among several permitted results for the same input. The deterministic profile fixes one choice.

Status

Relaxed SIMD, prototype encoding

Withdrawn (2022)Replaced by the standardised relaxed SIMD range at 0xFD 256+

An encoding used while relaxed SIMD was being prototyped, abandoned when it moved to the 0xFD 256 and above range. These slots are unassigned today.

Properties

0xFD 198:u32i32x4.relaxed_trunc_f64x2_u_zero

Description

An encoding used while relaxed SIMD was being prototyped. Relaxed SIMD was standardised in the 0xFD 256 and above range, and this slot is unassigned again.

Stack

[v128] → [v128]

Relaxed: an engine may pick among several permitted results for the same input. The deterministic profile fixes one choice.

Status

Relaxed SIMD, prototype encoding

Withdrawn (2022)Replaced by the standardised relaxed SIMD range at 0xFD 256+

An encoding used while relaxed SIMD was being prototyped, abandoned when it moved to the 0xFD 256 and above range. These slots are unassigned today.

Properties

0xFD 199:u32i64x2.extend_low_i32x4_s

widen, keeping the value, signed

Description

Converts low half of the smaller lane vector to a larger lane vector, sign extended.

Stack

[v128] → [v128]

Status

Fixed-width SIMDStandardised in WebAssembly 2.0 (2022)Standardised and supported by every current engine.Engine support

Properties

0xFD 200:u32i64x2.extend_high_i32x4_s

widen, keeping the value, signed

Description

Converts high half of the smaller lane vector to a larger lane vector, sign extended.

Stack

[v128] → [v128]

Status

Fixed-width SIMDStandardised in WebAssembly 2.0 (2022)Standardised and supported by every current engine.Engine support

Properties

0xFD 201:u32i64x2.extend_low_i32x4_u

widen, keeping the value, unsigned

Description

Converts low half of the smaller lane vector to a larger lane vector, zero extended.

Stack

[v128] → [v128]

Status

Fixed-width SIMDStandardised in WebAssembly 2.0 (2022)Standardised and supported by every current engine.Engine support

Properties

0xFD 202:u32i64x2.extend_high_i32x4_u

widen, keeping the value, unsigned

Description

Converts high half of the smaller lane vector to a larger lane vector, zero extended.

Stack

[v128] → [v128]

Status

Fixed-width SIMDStandardised in WebAssembly 2.0 (2022)Standardised and supported by every current engine.Engine support

Properties

0xFD 203:u32i64x2.shl

shift left

Description

Shifts each lane to the left by the specified number of bits.

Stack

[v128 i32] → [v128]

Status

Fixed-width SIMDStandardised in WebAssembly 2.0 (2022)Standardised and supported by every current engine.Engine support

Properties

0xFD 204:u32i64x2.shr_s

shift right, signed

Description

Shifts each lane to the right by the specified number of bits, sign extending.

Stack

[v128 i32] → [v128]

Status

Fixed-width SIMDStandardised in WebAssembly 2.0 (2022)Standardised and supported by every current engine.Engine support

Properties

0xFD 205:u32i64x2.shr_u

shift right, unsigned

Description

Shifts each lane to the right by the specified number of bits, shifting in zeros.

Stack

[v128 i32] → [v128]

Status

Fixed-width SIMDStandardised in WebAssembly 2.0 (2022)Standardised and supported by every current engine.Engine support

Properties

0xFD 206:u32i64x2.add

add

Description

Adds two 128-bit vectors as if they were two packed two 64-bit integers.

Stack

[v128 v128] → [v128]

Status

Fixed-width SIMDStandardised in WebAssembly 2.0 (2022)Standardised and supported by every current engine.Engine support

Properties

0xFD 207:u32f64x2.relaxed_madd

Description

An encoding used while relaxed SIMD was being prototyped. Relaxed SIMD was standardised in the 0xFD 256 and above range, and this slot is unassigned again.

Stack

[v128 v128 v128] → [v128]

Relaxed: an engine may pick among several permitted results for the same input. The deterministic profile fixes one choice.

Status

Relaxed SIMD, prototype encoding

Withdrawn (2022)Replaced by the standardised relaxed SIMD range at 0xFD 256+

An encoding used while relaxed SIMD was being prototyped, abandoned when it moved to the 0xFD 256 and above range. These slots are unassigned today.

Properties

0xFD 208:u32f64x2.relaxed_nmadd

Description

An encoding used while relaxed SIMD was being prototyped. Relaxed SIMD was standardised in the 0xFD 256 and above range, and this slot is unassigned again.

Stack

[v128 v128 v128] → [v128]

Relaxed: an engine may pick among several permitted results for the same input. The deterministic profile fixes one choice.

Status

Relaxed SIMD, prototype encoding

Withdrawn (2022)Replaced by the standardised relaxed SIMD range at 0xFD 256+

An encoding used while relaxed SIMD was being prototyped, abandoned when it moved to the 0xFD 256 and above range. These slots are unassigned today.

Properties

0xFD 209:u32i64x2.sub

subtract

Description

Subtracts two 128-bit vectors as if they were two packed two 64-bit integers.

Stack

[v128 v128] → [v128]

Status

Fixed-width SIMDStandardised in WebAssembly 2.0 (2022)Standardised and supported by every current engine.Engine support

Properties

0xFD 210:u32i32x4.relaxed_laneselect

Description

An encoding used while relaxed SIMD was being prototyped. Relaxed SIMD was standardised in the 0xFD 256 and above range, and this slot is unassigned again.

Stack

[v128 v128 v128] → [v128]

Relaxed: an engine may pick among several permitted results for the same input. The deterministic profile fixes one choice.

Status

Relaxed SIMD, prototype encoding

Withdrawn (2022)Replaced by the standardised relaxed SIMD range at 0xFD 256+

An encoding used while relaxed SIMD was being prototyped, abandoned when it moved to the 0xFD 256 and above range. These slots are unassigned today.

Properties

0xFD 211:u32i64x2.relaxed_laneselect

Description

An encoding used while relaxed SIMD was being prototyped. Relaxed SIMD was standardised in the 0xFD 256 and above range, and this slot is unassigned again.

Stack

[v128 v128 v128] → [v128]

Relaxed: an engine may pick among several permitted results for the same input. The deterministic profile fixes one choice.

Status

Relaxed SIMD, prototype encoding

Withdrawn (2022)Replaced by the standardised relaxed SIMD range at 0xFD 256+

An encoding used while relaxed SIMD was being prototyped, abandoned when it moved to the 0xFD 256 and above range. These slots are unassigned today.

Properties

0xFD 212:u32f64x2.relaxed_min

Description

An encoding used while relaxed SIMD was being prototyped. Relaxed SIMD was standardised in the 0xFD 256 and above range, and this slot is unassigned again.

Stack

[v128 v128] → [v128]

Relaxed: an engine may pick among several permitted results for the same input. The deterministic profile fixes one choice.

Status

Relaxed SIMD, prototype encoding

Withdrawn (2022)Replaced by the standardised relaxed SIMD range at 0xFD 256+

An encoding used while relaxed SIMD was being prototyped, abandoned when it moved to the 0xFD 256 and above range. These slots are unassigned today.

Properties

0xFD 213:u32i64x2.mul

multiply

Description

Multiplies two 128-bit vectors as if they were two packed two 64-bit integers.

Stack

[v128 v128] → [v128]

Status

Fixed-width SIMDStandardised in WebAssembly 2.0 (2022)Standardised and supported by every current engine.Engine support

Properties

0xFD 214:u32i64x2.eq

equal

Description

==

Lane-wise comparison of two 64-bit integers.

Signedness does not affect equality, so there is one form rather than a signed and an unsigned one.

Result: a lane is all ones where the comparison is true and all zeros where it is false, not 1 and 0.

Stack

[v128 v128] → [v128]

Status

Fixed-width SIMDStandardised in WebAssembly 2.0 (2022)Standardised and supported by every current engine.Engine support

Properties

0xFD 215:u32i64x2.ne

not equal

Description

Lane-wise comparison of two 64-bit integers.

Signedness does not affect equality, so there is one form rather than a signed and an unsigned one.

Result: a lane is all ones where the comparison is true and all zeros where it is false, not 1 and 0.

Stack

[v128 v128] → [v128]

Status

Fixed-width SIMDStandardised in WebAssembly 2.0 (2022)Standardised and supported by every current engine.Engine support

Properties

0xFD 216:u32i64x2.lt_s

less than, signed

Description

<

Lane-wise comparison of two 64-bit signed integers.

Result: a lane is all ones where the comparison is true and all zeros where it is false, not 1 and 0.

Stack

[v128 v128] → [v128]

Status

Fixed-width SIMDStandardised in WebAssembly 2.0 (2022)Standardised and supported by every current engine.Engine support

Properties

0xFD 217:u32i64x2.gt_s

greater than, signed

Description

>

Lane-wise comparison of two 64-bit signed integers.

Result: a lane is all ones where the comparison is true and all zeros where it is false, not 1 and 0.

Stack

[v128 v128] → [v128]

Status

Fixed-width SIMDStandardised in WebAssembly 2.0 (2022)Standardised and supported by every current engine.Engine support

Properties

0xFD 218:u32i64x2.le_s

less than or equal, signed

Description

Lane-wise comparison of two 64-bit signed integers.

Result: a lane is all ones where the comparison is true and all zeros where it is false, not 1 and 0.

Stack

[v128 v128] → [v128]

Status

Fixed-width SIMDStandardised in WebAssembly 2.0 (2022)Standardised and supported by every current engine.Engine support

Properties

0xFD 219:u32i64x2.ge_s

greater than or equal, signed

Description

Lane-wise comparison of two 64-bit signed integers.

Result: a lane is all ones where the comparison is true and all zeros where it is false, not 1 and 0.

Stack

[v128 v128] → [v128]

Status

Fixed-width SIMDStandardised in WebAssembly 2.0 (2022)Standardised and supported by every current engine.Engine support

Properties

0xFD 220:u32i64x2.extmul_low_i32x4_s

Description

Lane-wise integer extended multiplication producing twice wider result than the inputs.

Stack

[v128 v128] → [v128]

Status

Fixed-width SIMDStandardised in WebAssembly 2.0 (2022)Standardised and supported by every current engine.Engine support

Properties

0xFD 221:u32i64x2.extmul_high_i32x4_s

Description

Lane-wise integer extended multiplication producing twice wider result than the inputs.

Stack

[v128 v128] → [v128]

Status

Fixed-width SIMDStandardised in WebAssembly 2.0 (2022)Standardised and supported by every current engine.Engine support

Properties

0xFD 222:u32i64x2.extmul_low_i32x4_u

Description

Lane-wise integer extended multiplication producing twice wider result than the inputs.

Stack

[v128 v128] → [v128]

Status

Fixed-width SIMDStandardised in WebAssembly 2.0 (2022)Standardised and supported by every current engine.Engine support

Properties

0xFD 223:u32i64x2.extmul_high_i32x4_u

Description

Lane-wise integer extended multiplication producing twice wider result than the inputs.

Stack

[v128 v128] → [v128]

Status

Fixed-width SIMDStandardised in WebAssembly 2.0 (2022)Standardised and supported by every current engine.Engine support

Properties

0xFD 224:u32f32x4.abs

absolute value

Description

Calculates the absolute value of each lane of a 128-bit vector interpreted as four 32-bit floating point numbers.

Stack

[v128] → [v128]

Status

Fixed-width SIMDStandardised in WebAssembly 2.0 (2022)Standardised and supported by every current engine.Engine support

Properties

0xFD 225:u32f32x4.neg

negate

Description

Negates each lane of a 128-bit vector interpreted as four 32-bit floating point numbers.

Stack

[v128] → [v128]

Status

Fixed-width SIMDStandardised in WebAssembly 2.0 (2022)Standardised and supported by every current engine.Engine support

Properties

0xFD 226:u32f32x4.relaxed_max

Description

An encoding used while relaxed SIMD was being prototyped. Relaxed SIMD was standardised in the 0xFD 256 and above range, and this slot is unassigned again.

Stack

[v128 v128] → [v128]

Relaxed: an engine may pick among several permitted results for the same input. The deterministic profile fixes one choice.

Status

Relaxed SIMD, prototype encoding

Withdrawn (2022)Replaced by the standardised relaxed SIMD range at 0xFD 256+

An encoding used while relaxed SIMD was being prototyped, abandoned when it moved to the 0xFD 256 and above range. These slots are unassigned today.

Properties

0xFD 227:u32f32x4.sqrt

square root

Description

Calculates the square root of each lane of a 128-bit vector interpreted as four 32-bit floating point numbers.

Stack

[v128] → [v128]

Status

Fixed-width SIMDStandardised in WebAssembly 2.0 (2022)Standardised and supported by every current engine.Engine support

Properties

0xFD 228:u32f32x4.add

add

Description

Lane-wise addition of two 128-bit vectors interpreted as four 32-bit floating point numbers.

Stack

[v128 v128] → [v128]

Status

Fixed-width SIMDStandardised in WebAssembly 2.0 (2022)Standardised and supported by every current engine.Engine support

Properties

0xFD 229:u32f32x4.sub

subtract

Description

Lane-wise subtraction of two 128-bit vectors interpreted as four 32-bit floating point numbers.

Stack

[v128 v128] → [v128]

Status

Fixed-width SIMDStandardised in WebAssembly 2.0 (2022)Standardised and supported by every current engine.Engine support

Properties

0xFD 230:u32f32x4.mul

multiply

Description

Lane-wise multiplication of two 128-bit vectors interpreted as four 32-bit floating point numbers.

Stack

[v128 v128] → [v128]

Status

Fixed-width SIMDStandardised in WebAssembly 2.0 (2022)Standardised and supported by every current engine.Engine support

Properties

0xFD 231:u32f32x4.div

divide

Description

Lane-wise division of two 128-bit vectors interpreted as four 32-bit floating point numbers.

Stack

[v128 v128] → [v128]

Status

Fixed-width SIMDStandardised in WebAssembly 2.0 (2022)Standardised and supported by every current engine.Engine support

Properties

0xFD 232:u32f32x4.min

smaller of the two

Description

Calculates the lane-wise minimum of two 128-bit vectors interpreted as four 32-bit floating point numbers.

Stack

[v128 v128] → [v128]

Status

Fixed-width SIMDStandardised in WebAssembly 2.0 (2022)Standardised and supported by every current engine.Engine support

Properties

0xFD 233:u32f32x4.max

larger of the two

Description

Calculates the lane-wise [maximum] of two 128-bit vectors interpreted as four 32-bit floating point numbers.

Stack

[v128 v128] → [v128]

Status

Fixed-width SIMDStandardised in WebAssembly 2.0 (2022)Standardised and supported by every current engine.Engine support

Properties

0xFD 234:u32f32x4.pmin

Description

Lane-wise pseudo-minimum: takes the second lane where it is less than the first, and the first lane otherwise.

Not the same as min. A comparison against NaN is false, so a NaN in either lane gives the first lane, and +0 and −0 are not distinguished.

Stack

[v128 v128] → [v128]

Status

Fixed-width SIMDStandardised in WebAssembly 2.0 (2022)Standardised and supported by every current engine.Engine support

Properties

0xFD 235:u32f32x4.pmax

Description

Lane-wise pseudo-maximum: takes the second lane where it is greater than the first, and the first lane otherwise.

Not the same as max. A comparison against NaN is false, so a NaN in either lane gives the first lane, and +0 and −0 are not distinguished.

Stack

[v128 v128] → [v128]

Status

Fixed-width SIMDStandardised in WebAssembly 2.0 (2022)Standardised and supported by every current engine.Engine support

Properties

0xFD 236:u32f64x2.abs

absolute value

Description

Calculates the absolute value of each lane of a 128-bit vector interpreted as two 64-bit floating point numbers.

Stack

[v128] → [v128]

Status

Fixed-width SIMDStandardised in WebAssembly 2.0 (2022)Standardised and supported by every current engine.Engine support

Properties

0xFD 237:u32f64x2.neg

negate

Description

Negates each lane of a 128-bit vector interpreted as two 64-bit floating point numbers.

Stack

[v128] → [v128]

Status

Fixed-width SIMDStandardised in WebAssembly 2.0 (2022)Standardised and supported by every current engine.Engine support

Properties

0xFD 238:u32f64x2.relaxed_max

Description

An encoding used while relaxed SIMD was being prototyped. Relaxed SIMD was standardised in the 0xFD 256 and above range, and this slot is unassigned again.

Stack

[v128 v128] → [v128]

Relaxed: an engine may pick among several permitted results for the same input. The deterministic profile fixes one choice.

Status

Relaxed SIMD, prototype encoding

Withdrawn (2022)Replaced by the standardised relaxed SIMD range at 0xFD 256+

An encoding used while relaxed SIMD was being prototyped, abandoned when it moved to the 0xFD 256 and above range. These slots are unassigned today.

Properties

0xFD 239:u32f64x2.sqrt

square root

Description

Calculates the square root of each lane of a 128-bit vector interpreted as two 64-bit floating point numbers.

Stack

[v128] → [v128]

Status

Fixed-width SIMDStandardised in WebAssembly 2.0 (2022)Standardised and supported by every current engine.Engine support

Properties

0xFD 240:u32f64x2.add

add

Description

Lane-wise add of two 128-bit vectors interpreted as two 64-bit floating point numbers.

Stack

[v128 v128] → [v128]

Status

Fixed-width SIMDStandardised in WebAssembly 2.0 (2022)Standardised and supported by every current engine.Engine support

Properties

0xFD 241:u32f64x2.sub

subtract

Description

Lane-wise subtract of two 128-bit vectors interpreted as two 64-bit floating point numbers.

Stack

[v128 v128] → [v128]

Status

Fixed-width SIMDStandardised in WebAssembly 2.0 (2022)Standardised and supported by every current engine.Engine support

Properties

0xFD 242:u32f64x2.mul

multiply

Description

Lane-wise multiply of two 128-bit vectors interpreted as two 64-bit floating point numbers.

Stack

[v128 v128] → [v128]

Status

Fixed-width SIMDStandardised in WebAssembly 2.0 (2022)Standardised and supported by every current engine.Engine support

Properties

0xFD 243:u32f64x2.div

divide

Description

Lane-wise divide of two 128-bit vectors interpreted as two 64-bit floating point numbers.

Stack

[v128 v128] → [v128]

Status

Fixed-width SIMDStandardised in WebAssembly 2.0 (2022)Standardised and supported by every current engine.Engine support

Properties

0xFD 244:u32f64x2.min

smaller of the two

Description

Calculates the lane-wise minimum of two 128-bit vectors interpreted as two 64-bit floating point numbers.

Stack

[v128 v128] → [v128]

Status

Fixed-width SIMDStandardised in WebAssembly 2.0 (2022)Standardised and supported by every current engine.Engine support

Properties

0xFD 245:u32f64x2.max

larger of the two

Description

Calculates the lane-wise maximum of two 128-bit vectors interpreted as two 64-bit floating point numbers.

Stack

[v128 v128] → [v128]

Status

Fixed-width SIMDStandardised in WebAssembly 2.0 (2022)Standardised and supported by every current engine.Engine support

Properties

0xFD 246:u32f64x2.pmin

Description

Lane-wise pseudo-minimum: takes the second lane where it is less than the first, and the first lane otherwise.

Not the same as min. A comparison against NaN is false, so a NaN in either lane gives the first lane, and +0 and −0 are not distinguished.

Stack

[v128 v128] → [v128]

Status

Fixed-width SIMDStandardised in WebAssembly 2.0 (2022)Standardised and supported by every current engine.Engine support

Properties

0xFD 247:u32f64x2.pmax

Description

Lane-wise pseudo-maximum: takes the second lane where it is greater than the first, and the first lane otherwise.

Not the same as max. A comparison against NaN is false, so a NaN in either lane gives the first lane, and +0 and −0 are not distinguished.

Stack

[v128 v128] → [v128]

Status

Fixed-width SIMDStandardised in WebAssembly 2.0 (2022)Standardised and supported by every current engine.Engine support

Properties

0xFD 248:u32i32x4.trunc_sat_f32x4_s

float to integer, clamped to the range, signed

Description

Converts a 128-bit vector interpreted as four 32-bit floating point numbers into a 128-bit vector of four 32-bit signed integers.

Stack

[v128] → [v128]

Status

Fixed-width SIMDStandardised in WebAssembly 2.0 (2022)Standardised and supported by every current engine.Engine support

Properties

0xFD 249:u32i32x4.trunc_sat_f32x4_u

float to integer, clamped to the range, unsigned

Description

Converts a 128-bit vector interpreted as four 32-bit floating point numbers into a 128-bit vector of four 32-bit unsigned integers.

Stack

[v128] → [v128]

Status

Fixed-width SIMDStandardised in WebAssembly 2.0 (2022)Standardised and supported by every current engine.Engine support

Properties

0xFD 250:u32f32x4.convert_i32x4_s

integer to floating point, signed

Description

Converts a 128-bit vector interpreted as four 32-bit signed integers into a 128-bit vector of four 32-bit floating point numbers.

Stack

[v128] → [v128]

Status

Fixed-width SIMDStandardised in WebAssembly 2.0 (2022)Standardised and supported by every current engine.Engine support

Properties

0xFD 251:u32f32x4.convert_i32x4_u

integer to floating point, unsigned

Description

Converts a 128-bit vector interpreted as four 32-bit unsigned integers into a 128-bit vector of four 32-bit floating point numbers.

Stack

[v128] → [v128]

Status

Fixed-width SIMDStandardised in WebAssembly 2.0 (2022)Standardised and supported by every current engine.Engine support

Properties

0xFD 252:u32i32x4.trunc_sat_f64x2_s_zero

float to integer, clamped to the range, signed

Description

Saturating conversion of the two double-precision floating point lanes to two lower integer lanes using the IEEE convertToIntegerTowardZero function.

Stack

[v128] → [v128]

Status

Fixed-width SIMDStandardised in WebAssembly 2.0 (2022)Standardised and supported by every current engine.Engine support

Properties

0xFD 253:u32i32x4.trunc_sat_f64x2_u_zero

float to integer, clamped to the range, unsigned

Description

Saturating conversion of the two double-precision floating point lanes to two lower integer lanes using the IEEE convertToIntegerTowardZero function.

Stack

[v128] → [v128]

Status

Fixed-width SIMDStandardised in WebAssembly 2.0 (2022)Standardised and supported by every current engine.Engine support

Properties

0xFD 254:u32f64x2.convert_low_i32x4_s

integer to floating point, signed

Description

Lane-wise conversion from signed integer to floating point.

Stack

[v128] → [v128]

Status

Fixed-width SIMDStandardised in WebAssembly 2.0 (2022)Standardised and supported by every current engine.Engine support

Properties

0xFD 255:u32f64x2.convert_low_i32x4_u

integer to floating point, unsigned

Description

Lane-wise conversion from unsigned integer to floating point.

Stack

[v128] → [v128]

Status

Fixed-width SIMDStandardised in WebAssembly 2.0 (2022)Standardised and supported by every current engine.Engine support

Properties

0xFD 256:u32i8x16.relaxed_swizzle

Description

As i8x16.swizzle, except that an index outside 0 to 15 gives an implementation-defined result rather than 0.

Stack

[v128 v128] → [v128]

Status

Relaxed SIMDStandardised in WebAssembly 3.0 (2025)Standardised. Results may differ between engines by design — that is the point of the relaxation.Engine support

Properties

0xFD 257:u32i32x4.relaxed_trunc_f32x4_s

Description

Relaxed i32x4.trunc_f32x4_s (relaxed version of i32x4.trunc_sat_f32x4_s).

This instruction has the same behavior as the non-relaxed instruction for lanes that are in the range of an i32 (signed or unsigned depending on the instruction). The result of lanes which contain NaN is implementation defined, either 0 or INT32_MAX for signed and UINT32_MAX for unsigned. The result of lanes which are out of bounds of INT32 or UINT32 is implementation defined, it can be either the saturated result or INT32_MAX for signed and UINT32_MAX for unsigned.

Stack

[v128] → [v128]

Status

Relaxed SIMDStandardised in WebAssembly 3.0 (2025)Standardised. Results may differ between engines by design — that is the point of the relaxation.Engine support

Properties

0xFD 258:u32i32x4.relaxed_trunc_f32x4_u

Description

Relaxed i32x4.trunc_f32x4_u (relaxed version of i32x4.trunc_sat_f32x4_u).

This instruction has the same behavior as the non-relaxed instruction for lanes that are in the range of an i32 (signed or unsigned depending on the instruction). The result of lanes which contain NaN is implementation defined, either 0 or INT32_MAX for signed and UINT32_MAX for unsigned. The result of lanes which are out of bounds of INT32 or UINT32 is implementation defined, it can be either the saturated result or INT32_MAX for signed and UINT32_MAX for unsigned.

Stack

[v128] → [v128]

Status

Relaxed SIMDStandardised in WebAssembly 3.0 (2025)Standardised. Results may differ between engines by design — that is the point of the relaxation.Engine support

Properties

0xFD 259:u32i32x4.relaxed_trunc_f64x2_s_zero

Description

Relaxed i32x4.trunc_f64x2_s_zero (relaxed version of i32x4.trunc_sat_f64x2_s_zero).

This instruction has the same behavior as the non-relaxed instruction for lanes that are in the range of an i32 (signed or unsigned depending on the instruction). The result of lanes which contain NaN is implementation defined, either 0 or INT32_MAX for signed and UINT32_MAX for unsigned. The result of lanes which are out of bounds of INT32 or UINT32 is implementation defined, it can be either the saturated result or INT32_MAX for signed and UINT32_MAX for unsigned.

Stack

[v128] → [v128]

Status

Relaxed SIMDStandardised in WebAssembly 3.0 (2025)Standardised. Results may differ between engines by design — that is the point of the relaxation.Engine support

Properties

0xFD 260:u32i32x4.relaxed_trunc_f64x2_u_zero

Description

Relaxed i32x4.trunc_f64x2_u_zero (relaxed version of i32x4.trunc_sat_f64x2_u_zero).

This instruction has the same behavior as the non-relaxed instruction for lanes that are in the range of an i32 (signed or unsigned depending on the instruction). The result of lanes which contain NaN is implementation defined, either 0 or INT32_MAX for signed and UINT32_MAX for unsigned. The result of lanes which are out of bounds of INT32 or UINT32 is implementation defined, it can be either the saturated result or INT32_MAX for signed and UINT32_MAX for unsigned.

Stack

[v128] → [v128]

Status

Relaxed SIMDStandardised in WebAssembly 3.0 (2025)Standardised. Results may differ between engines by design — that is the point of the relaxation.Engine support

Properties

0xFD 261:u32f32x4.relaxed_madd

Description

Relaxed fused multiply-add.

relaxed f32x4.madd(a, b, c) = a * b + c.

where:

  • the intermediate a * b is be rounded first, and the final result rounded again (for a total of 2 roundings), or
  • the entire expression evaluated with higher precision and then only rounded once (if supported by hardware).

Stack

[v128 v128 v128] → [v128]

Status

Relaxed SIMDStandardised in WebAssembly 3.0 (2025)Standardised. Results may differ between engines by design — that is the point of the relaxation.Engine support

Properties

0xFD 262:u32f32x4.relaxed_nmadd

Description

Relaxed fused negative multiply-add.

relaxed f32x4.nmadd(a, b, c) = -(a * b) + c.

where:

  • the intermediate a * b is be rounded first, and the final result rounded again (for a total of 2 roundings), or
  • the entire expression evaluated with higher precision and then only rounded once (if supported by hardware).

Stack

[v128 v128 v128] → [v128]

Status

Relaxed SIMDStandardised in WebAssembly 3.0 (2025)Standardised. Results may differ between engines by design — that is the point of the relaxation.Engine support

Properties

0xFD 263:u32f64x2.relaxed_madd

Description

Relaxed fused multiply-add.

relaxed f64x2.madd(a, b, c) = a * b + c.

where:

  • the intermediate a * b is be rounded first, and the final result rounded again (for a total of 2 roundings), or
  • the entire expression evaluated with higher precision and then only rounded once (if supported by hardware).

Stack

[v128 v128 v128] → [v128]

Status

Relaxed SIMDStandardised in WebAssembly 3.0 (2025)Standardised. Results may differ between engines by design — that is the point of the relaxation.Engine support

Properties

0xFD 264:u32f64x2.relaxed_nmadd

Description

Relaxed fused negative multiply-add.

relaxed f64x2.nmadd(a, b, c) = -(a * b) + c.

where:

  • the intermediate a * b is be rounded first, and the final result rounded again (for a total of 2 roundings), or
  • the entire expression evaluated with higher precision and then only rounded once (if supported by hardware).

Stack

[v128 v128 v128] → [v128]

Status

Relaxed SIMDStandardised in WebAssembly 3.0 (2025)Standardised. Results may differ between engines by design — that is the point of the relaxation.Engine support

Properties

0xFD 265:u32i8x16.relaxed_laneselect

Description

i8x16.laneselect(a: v128, b: v128, m: v128) -> v128.

Select lanes from a or b based on masks in m. If each lane-sized mask in m has all bits set or all bits unset, these instructions behave the same as v128.bitselect. Otherwise, the result is implementation defined.

Stack

[v128 v128 v128] → [v128]

Status

Relaxed SIMDStandardised in WebAssembly 3.0 (2025)Standardised. Results may differ between engines by design — that is the point of the relaxation.Engine support

Properties

0xFD 266:u32i16x8.relaxed_laneselect

Description

i16x8.laneselect(a: v128, b: v128, m: v128) -> v128.

Select lanes from a or b based on masks in m. If each lane-sized mask in m has all bits set or all bits unset, these instructions behave the same as v128.bitselect. Otherwise, the result is implementation defined.

Stack

[v128 v128 v128] → [v128]

Status

Relaxed SIMDStandardised in WebAssembly 3.0 (2025)Standardised. Results may differ between engines by design — that is the point of the relaxation.Engine support

Properties

0xFD 267:u32i32x4.relaxed_laneselect

Description

i32x4.laneselect(a: v128, b: v128, m: v128) -> v128.

Select lanes from a or b based on masks in m. If each lane-sized mask in m has all bits set or all bits unset, these instructions behave the same as v128.bitselect. Otherwise, the result is implementation defined.

Stack

[v128 v128 v128] → [v128]

Status

Relaxed SIMDStandardised in WebAssembly 3.0 (2025)Standardised. Results may differ between engines by design — that is the point of the relaxation.Engine support

Properties

0xFD 268:u32i64x2.relaxed_laneselect

Description

i64x2.laneselect(a: v128, b: v128, m: v128) -> v128.

Select lanes from a or b based on masks in m. If each lane-sized mask in m has all bits set or all bits unset, these instructions behave the same as v128.bitselect. Otherwise, the result is implementation defined.

Stack

[v128 v128 v128] → [v128]

Status

Relaxed SIMDStandardised in WebAssembly 3.0 (2025)Standardised. Results may differ between engines by design — that is the point of the relaxation.Engine support

Properties

0xFD 269:u32f32x4.relaxed_min

Description

Relaxed min.

f32x4.min(a: v128, b: v128) -> v128.

Return the lane-wise minimum of two values. If either values is NaN, or the values are -0.0 and +0.0, the return value is implementation-defined.

Stack

[v128 v128] → [v128]

Status

Relaxed SIMDStandardised in WebAssembly 3.0 (2025)Standardised. Results may differ between engines by design — that is the point of the relaxation.Engine support

Properties

0xFD 270:u32f32x4.relaxed_max

Description

Relaxed max.

f32x4.max(a: v128, b: v128) -> v128.

Return the lane-wise maximum of two values. If either values is NaN, or the values are -0.0 and +0.0, the return value is implementation-defined.

Stack

[v128 v128] → [v128]

Status

Relaxed SIMDStandardised in WebAssembly 3.0 (2025)Standardised. Results may differ between engines by design — that is the point of the relaxation.Engine support

Properties

0xFD 271:u32f64x2.relaxed_min

Description

Relaxed min.

f64x2.min(a: v128, b: v128) -> v128.

Return the lane-wise minimum of two values. If either values is NaN, or the values are -0.0 and +0.0, the return value is implementation-defined.

Stack

[v128 v128] → [v128]

Status

Relaxed SIMDStandardised in WebAssembly 3.0 (2025)Standardised. Results may differ between engines by design — that is the point of the relaxation.Engine support

Properties

0xFD 272:u32f64x2.relaxed_max

Description

Relaxed max.

f64x2.max(a: v128, b: v128) -> v128.

Return the lane-wise maximum of two values. If either values is NaN, or the values are -0.0 and +0.0, the return value is implementation-defined.

Stack

[v128 v128] → [v128]

Status

Relaxed SIMDStandardised in WebAssembly 3.0 (2025)Standardised. Results may differ between engines by design — that is the point of the relaxation.Engine support

Properties

0xFD 273:u32i16x8.relaxed_q15mulr_s

Description

Relaxed Rounding Q-format Multiplication.

i16x8.q15mulr_s(a: v128, b: v128) -> v128.

Returns the multiplication of 2 fixed-point numbers in Q15 format. If both inputs are INT16_MIN, the result overflows, and the return value is implementation defined (either INT16_MIN or INT16_MAX).

Stack

[v128 v128] → [v128]

Status

Relaxed SIMDStandardised in WebAssembly 3.0 (2025)Standardised. Results may differ between engines by design — that is the point of the relaxation.Engine support

Properties

0xFD 274:u32i16x8.relaxed_dot_i8x16_i7x16_s

Description

Reads the first operand as 16 signed 8-bit integers and the second as 16 unsigned 7-bit integers, multiplies them lane by lane, then adds each adjacent pair of products to give 8 i16 lanes.

If a lane of the second operand has its high bit set, that lane’s result is implementation-defined.

Stack

[v128 v128] → [v128]

Status

Relaxed SIMDStandardised in WebAssembly 3.0 (2025)Standardised. Results may differ between engines by design — that is the point of the relaxation.Engine support

Properties

0xFD 275:u32i32x4.relaxed_dot_i8x16_i7x16_add_s

Description

Reads the first operand as 16 signed 8-bit integers and the second as 16 unsigned 7-bit integers and multiplies them lane by lane, as i16x8.relaxed_dot_i8x16_i7x16_s does. Adds each group of four adjacent products to give 4 i32 lanes, then adds those to the third operand.

If a lane of the second operand has its high bit set, that lane’s result is implementation-defined.

Stack

[v128 v128 v128] → [v128]

Status

Relaxed SIMDStandardised in WebAssembly 3.0 (2025)Standardised. Results may differ between engines by design — that is the point of the relaxation.Engine support

Properties

0xFD 288:u32f16x8.splat

copy one value into every lane

Description

Part of the half-precision proposal, which adds the 16-bit float type f16 and a f16x8 vector shape.

Stack

[f32] → [v128]

Half precision: f16 is not a WebAssembly value type. The scalar operand and result are f32, rounded to half precision.

Status

Half precision

Proposal: Phase 1 (2024)

Adds the f16 type. Early: no engine ships it and the encoding may still change.Engine support

Encoded across 2 tables:

Properties

0xFD 289:u32f16x8.extract_lane l

Description

Part of the half-precision proposal, which adds the 16-bit float type f16 and a f16x8 vector shape.

Stack

[v128] → [f32]

Half precision: f16 is not a WebAssembly value type. The scalar operand and result are f32, rounded to half precision.

Immediate operands

  1. u8 l : laneidx

Lane index: counts from 0. A value at or past the number of lanes is rejected when the module is validated, so it can never be out of range at run time.

Status

Half precision

Proposal: Phase 1 (2024)

Adds the f16 type. Early: no engine ships it and the encoding may still change.Engine support

Encoded across 2 tables:

Properties

0xFD 290:u32f16x8.replace_lane l

Description

Part of the half-precision proposal, which adds the 16-bit float type f16 and a f16x8 vector shape.

Stack

[v128 f32] → [v128]

Half precision: f16 is not a WebAssembly value type. The scalar operand and result are f32, rounded to half precision.

Immediate operands

  1. u8 l : laneidx

Lane index: counts from 0. A value at or past the number of lanes is rejected when the module is validated, so it can never be out of range at run time.

Status

Half precision

Proposal: Phase 1 (2024)

Adds the f16 type. Early: no engine ships it and the encoding may still change.Engine support

Encoded across 2 tables:

Properties

0xFD 304:u32f16x8.abs

absolute value

Description

Part of the half-precision proposal, which adds the 16-bit float type f16 and a f16x8 vector shape.

Stack

[v128] → [v128]

Status

Half precision

Proposal: Phase 1 (2024)

Adds the f16 type. Early: no engine ships it and the encoding may still change.Engine support

Encoded across 2 tables:

Properties

0xFD 305:u32f16x8.neg

negate

Description

Part of the half-precision proposal, which adds the 16-bit float type f16 and a f16x8 vector shape.

Stack

[v128] → [v128]

Status

Half precision

Proposal: Phase 1 (2024)

Adds the f16 type. Early: no engine ships it and the encoding may still change.Engine support

Encoded across 2 tables:

Properties

0xFD 306:u32f16x8.sqrt

square root

Description

Part of the half-precision proposal, which adds the 16-bit float type f16 and a f16x8 vector shape.

Stack

[v128] → [v128]

Status

Half precision

Proposal: Phase 1 (2024)

Adds the f16 type. Early: no engine ships it and the encoding may still change.Engine support

Encoded across 2 tables:

Properties

0xFD 307:u32f16x8.ceil

round up to the nearest integer

Description

Part of the half-precision proposal, which adds the 16-bit float type f16 and a f16x8 vector shape.

Stack

[v128] → [v128]

Status

Half precision

Proposal: Phase 1 (2024)

Adds the f16 type. Early: no engine ships it and the encoding may still change.Engine support

Encoded across 2 tables:

Properties

0xFD 308:u32f16x8.floor

round down to the nearest integer

Description

Part of the half-precision proposal, which adds the 16-bit float type f16 and a f16x8 vector shape.

Stack

[v128] → [v128]

Status

Half precision

Proposal: Phase 1 (2024)

Adds the f16 type. Early: no engine ships it and the encoding may still change.Engine support

Encoded across 2 tables:

Properties

0xFD 309:u32f16x8.trunc

round toward zero

Description

Part of the half-precision proposal, which adds the 16-bit float type f16 and a f16x8 vector shape.

Stack

[v128] → [v128]

Status

Half precision

Proposal: Phase 1 (2024)

Adds the f16 type. Early: no engine ships it and the encoding may still change.Engine support

Encoded across 2 tables:

Properties

0xFD 310:u32f16x8.nearest

round to the nearest integer, ties to even

Description

Part of the half-precision proposal, which adds the 16-bit float type f16 and a f16x8 vector shape.

Stack

[v128] → [v128]

Status

Half precision

Proposal: Phase 1 (2024)

Adds the f16 type. Early: no engine ships it and the encoding may still change.Engine support

Encoded across 2 tables:

Properties

0xFD 311:u32f16x8.eq

equal

Description

==

Lane-wise comparison of eight half-precision floats.

Result: a lane is all ones where the comparison is true and all zeros where it is false, not 1 and 0.

A comparison with NaN is false, so a NaN in either lane gives all zeros. +0 and −0 compare equal.

Stack

[v128 v128] → [v128]

Each result lane is all ones where the comparison holds and all zeros where it does not, not 1 and 0.

Status

Half precision

Proposal: Phase 1 (2024)

Adds the f16 type. Early: no engine ships it and the encoding may still change.Engine support

Encoded across 2 tables:

Properties

0xFD 312:u32f16x8.ne

not equal

Description

Lane-wise comparison of eight half-precision floats.

Result: a lane is all ones where the comparison is true and all zeros where it is false, not 1 and 0.

A comparison with NaN is false and this is its negation, so a NaN in either lane gives all ones. +0 and −0 compare equal.

Stack

[v128 v128] → [v128]

Each result lane is all ones where the comparison holds and all zeros where it does not, not 1 and 0.

Status

Half precision

Proposal: Phase 1 (2024)

Adds the f16 type. Early: no engine ships it and the encoding may still change.Engine support

Encoded across 2 tables:

Properties

0xFD 313:u32f16x8.lt

less than

Description

<

Lane-wise comparison of eight half-precision floats.

Result: a lane is all ones where the comparison is true and all zeros where it is false, not 1 and 0.

A comparison with NaN is false, so a NaN in either lane gives all zeros. +0 and −0 compare equal.

Stack

[v128 v128] → [v128]

Each result lane is all ones where the comparison holds and all zeros where it does not, not 1 and 0.

Status

Half precision

Proposal: Phase 1 (2024)

Adds the f16 type. Early: no engine ships it and the encoding may still change.Engine support

Encoded across 2 tables:

Properties

0xFD 314:u32f16x8.gt

greater than

Description

>

Lane-wise comparison of eight half-precision floats.

Result: a lane is all ones where the comparison is true and all zeros where it is false, not 1 and 0.

A comparison with NaN is false, so a NaN in either lane gives all zeros. +0 and −0 compare equal.

Stack

[v128 v128] → [v128]

Each result lane is all ones where the comparison holds and all zeros where it does not, not 1 and 0.

Status

Half precision

Proposal: Phase 1 (2024)

Adds the f16 type. Early: no engine ships it and the encoding may still change.Engine support

Encoded across 2 tables:

Properties

0xFD 315:u32f16x8.le

less than or equal

Description

Lane-wise comparison of eight half-precision floats.

Result: a lane is all ones where the comparison is true and all zeros where it is false, not 1 and 0.

A comparison with NaN is false, so a NaN in either lane gives all zeros. +0 and −0 compare equal.

Stack

[v128 v128] → [v128]

Each result lane is all ones where the comparison holds and all zeros where it does not, not 1 and 0.

Status

Half precision

Proposal: Phase 1 (2024)

Adds the f16 type. Early: no engine ships it and the encoding may still change.Engine support

Encoded across 2 tables:

Properties

0xFD 316:u32f16x8.ge

greater than or equal

Description

Lane-wise comparison of eight half-precision floats.

Result: a lane is all ones where the comparison is true and all zeros where it is false, not 1 and 0.

A comparison with NaN is false, so a NaN in either lane gives all zeros. +0 and −0 compare equal.

Stack

[v128 v128] → [v128]

Each result lane is all ones where the comparison holds and all zeros where it does not, not 1 and 0.

Status

Half precision

Proposal: Phase 1 (2024)

Adds the f16 type. Early: no engine ships it and the encoding may still change.Engine support

Encoded across 2 tables:

Properties

0xFD 317:u32f16x8.add

add

Description

Part of the half-precision proposal, which adds the 16-bit float type f16 and a f16x8 vector shape.

Stack

[v128 v128] → [v128]

Status

Half precision

Proposal: Phase 1 (2024)

Adds the f16 type. Early: no engine ships it and the encoding may still change.Engine support

Encoded across 2 tables:

Properties

0xFD 318:u32f16x8.sub

subtract

Description

Part of the half-precision proposal, which adds the 16-bit float type f16 and a f16x8 vector shape.

Stack

[v128 v128] → [v128]

Status

Half precision

Proposal: Phase 1 (2024)

Adds the f16 type. Early: no engine ships it and the encoding may still change.Engine support

Encoded across 2 tables:

Properties

0xFD 319:u32f16x8.mul

multiply

Description

Part of the half-precision proposal, which adds the 16-bit float type f16 and a f16x8 vector shape.

Stack

[v128 v128] → [v128]

Status

Half precision

Proposal: Phase 1 (2024)

Adds the f16 type. Early: no engine ships it and the encoding may still change.Engine support

Encoded across 2 tables:

Properties

0xFD 320:u32f16x8.div

divide

Description

Part of the half-precision proposal, which adds the 16-bit float type f16 and a f16x8 vector shape.

Stack

[v128 v128] → [v128]

Status

Half precision

Proposal: Phase 1 (2024)

Adds the f16 type. Early: no engine ships it and the encoding may still change.Engine support

Encoded across 2 tables:

Properties

0xFD 321:u32f16x8.min

smaller of the two

Description

Part of the half-precision proposal, which adds the 16-bit float type f16 and a f16x8 vector shape.

Stack

[v128 v128] → [v128]

Status

Half precision

Proposal: Phase 1 (2024)

Adds the f16 type. Early: no engine ships it and the encoding may still change.Engine support

Encoded across 2 tables:

Properties

0xFD 322:u32f16x8.max

larger of the two

Description

Part of the half-precision proposal, which adds the 16-bit float type f16 and a f16x8 vector shape.

Stack

[v128 v128] → [v128]

Status

Half precision

Proposal: Phase 1 (2024)

Adds the f16 type. Early: no engine ships it and the encoding may still change.Engine support

Encoded across 2 tables:

Properties

0xFD 323:u32f16x8.pmin

Description

Part of the half-precision proposal, which adds the 16-bit float type f16 and a f16x8 vector shape.

Stack

[v128 v128] → [v128]

Status

Half precision

Proposal: Phase 1 (2024)

Adds the f16 type. Early: no engine ships it and the encoding may still change.Engine support

Encoded across 2 tables:

Properties

0xFD 324:u32f16x8.pmax

Description

Part of the half-precision proposal, which adds the 16-bit float type f16 and a f16x8 vector shape.

Stack

[v128 v128] → [v128]

Status

Half precision

Proposal: Phase 1 (2024)

Adds the f16 type. Early: no engine ships it and the encoding may still change.Engine support

Encoded across 2 tables:

Properties

0xFD 325:u32i16x8.trunc_sat_f16x8_s

float to integer, clamped to the range, signed

Description

Part of the half-precision proposal, which adds the 16-bit float type f16 and a f16x8 vector shape.

Stack

[v128] → [v128]

Status

Half precision

Proposal: Phase 1 (2024)

Adds the f16 type. Early: no engine ships it and the encoding may still change.Engine support

Encoded across 2 tables:

Properties

0xFD 326:u32i16x8.trunc_sat_f16x8_u

float to integer, clamped to the range, unsigned

Description

Part of the half-precision proposal, which adds the 16-bit float type f16 and a f16x8 vector shape.

Stack

[v128] → [v128]

Status

Half precision

Proposal: Phase 1 (2024)

Adds the f16 type. Early: no engine ships it and the encoding may still change.Engine support

Encoded across 2 tables:

Properties

0xFD 327:u32f16x8.convert_i16x8_s

integer to floating point, signed

Description

Part of the half-precision proposal, which adds the 16-bit float type f16 and a f16x8 vector shape.

Stack

[v128] → [v128]

Status

Half precision

Proposal: Phase 1 (2024)

Adds the f16 type. Early: no engine ships it and the encoding may still change.Engine support

Encoded across 2 tables:

Properties

0xFD 328:u32f16x8.convert_i16x8_u

integer to floating point, unsigned

Description

Part of the half-precision proposal, which adds the 16-bit float type f16 and a f16x8 vector shape.

Stack

[v128] → [v128]

Status

Half precision

Proposal: Phase 1 (2024)

Adds the f16 type. Early: no engine ships it and the encoding may still change.Engine support

Encoded across 2 tables:

Properties

0xFD 329:u32f16x8.demote_f32x4_zero

to the narrower float type

Description

Part of the half-precision proposal, which adds the 16-bit float type f16 and a f16x8 vector shape.

Stack

[v128] → [v128]

Status

Half precision

Proposal: Phase 1 (2024)

Adds the f16 type. Early: no engine ships it and the encoding may still change.Engine support

Encoded across 2 tables:

Properties

0xFD 330:u32f16x8.demote_f64x2_zero

to the narrower float type

Description

Part of the half-precision proposal, which adds the 16-bit float type f16 and a f16x8 vector shape.

Stack

[v128] → [v128]

Status

Half precision

Proposal: Phase 1 (2024)

Adds the f16 type. Early: no engine ships it and the encoding may still change.Engine support

Encoded across 2 tables:

Properties

0xFD 331:u32f32x4.promote_f16x8_low

to the wider float type

Description

Part of the half-precision proposal, which adds the 16-bit float type f16 and a f16x8 vector shape.

Stack

[v128] → [v128]

Status

Half precision

Proposal: Phase 1 (2024)

Adds the f16 type. Early: no engine ships it and the encoding may still change.Engine support

Encoded across 2 tables:

Properties

0xFD 332:u32i16x8.trunc_f16x8_s

float to integer, trapping out of range, signed

Description

Part of the half-precision proposal, which adds the 16-bit float type f16 and a f16x8 vector shape.

Stack

[v128] → [v128]

Status

Half precision

Proposal: Phase 1 (2024)

Adds the f16 type. Early: no engine ships it and the encoding may still change.Engine support

Encoded across 2 tables:

Properties

0xFD 333:u32i16x8.trunc_f16x8_u

float to integer, trapping out of range, unsigned

Description

Part of the half-precision proposal, which adds the 16-bit float type f16 and a f16x8 vector shape.

Stack

[v128] → [v128]

Status

Half precision

Proposal: Phase 1 (2024)

Adds the f16 type. Early: no engine ships it and the encoding may still change.Engine support

Encoded across 2 tables:

Properties

0xFD 334:u32f16x8.madd

Description

Part of the half-precision proposal, which adds the 16-bit float type f16 and a f16x8 vector shape.

Stack

[v128 v128 v128] → [v128]

Status

Half precision

Proposal: Phase 1 (2024)

Adds the f16 type. Early: no engine ships it and the encoding may still change.Engine support

Encoded across 2 tables:

Properties

0xFD 335:u32f16x8.nmadd

Description

Part of the half-precision proposal, which adds the 16-bit float type f16 and a f16x8 vector shape.

Stack

[v128 v128 v128] → [v128]

Status

Half precision

Proposal: Phase 1 (2024)

Adds the f16 type. Early: no engine ships it and the encoding may still change.Engine support

Encoded across 2 tables:

Properties

0xFE 0:u32memory.atomic.notify m

Description

Wakes agents waiting at an address and returns how many were woken.

Stack

[i32 i32] → [i32]

The operands are the address and the maximum number of agents to wake. Fewer may be woken, and none if none were waiting. Notifying an unshared memory is allowed and wakes nothing, since a wait on one traps.

Immediate operands

  1. m : memarg — u32 align, then u64 offset

Alignment

  • align is the base-2 logarithm of the assumed alignment in bytes: 0 for 1 byte, 1 for 2, 2 for 4, 3 for 8, 4 for 16.
  • A value larger than the width of the access is rejected when the module is validated. A smaller one is allowed, and only tells the engine not to assume alignment.
  • Bit 6 (0x40) is not part of the number. When it is set, a u32 memory index follows align, before the offset, and the alignment is what is left after subtracting 64. When it is clear, the instruction uses memory 0.

Addresses: an i32 for a 32-bit memory, an i64 for a 64-bit memory (memory64). The signatures here show the 32-bit case, which is what almost every module uses.

Status

Threads and atomics

Phase 4 (2023)

Widely implemented, but not yet folded into the specification.Engine support

Properties

0xFE 1:u32memory.atomic.wait32 m

Description

Waits for a notification at an address, if the 32-bit value there is still the expected one. Pushes why the wait ended:

  • 0: woken by memory.atomic.notify.
  • 1: the value at the address was not the expected one, so it did not wait.
  • 2: the timeout expired.

Stack

[i32 i32 i64] → [i32]

The operands are the address, the expected value, then a timeout in nanoseconds; a negative timeout never expires. Traps on an unshared memory. A host can forbid an agent from blocking: in a browser only a worker can wait, not the main thread.

Immediate operands

  1. m : memarg — u32 align, then u64 offset

Alignment

  • align is the base-2 logarithm of the assumed alignment in bytes: 0 for 1 byte, 1 for 2, 2 for 4, 3 for 8, 4 for 16.
  • A value larger than the width of the access is rejected when the module is validated. A smaller one is allowed, and only tells the engine not to assume alignment.
  • Bit 6 (0x40) is not part of the number. When it is set, a u32 memory index follows align, before the offset, and the alignment is what is left after subtracting 64. When it is clear, the instruction uses memory 0.

Addresses: an i32 for a 32-bit memory, an i64 for a 64-bit memory (memory64). The signatures here show the 32-bit case, which is what almost every module uses.

Status

Threads and atomics

Phase 4 (2023)

Widely implemented, but not yet folded into the specification.Engine support

Properties

0xFE 2:u32memory.atomic.wait64 m

Description

Waits for a notification at an address, if the 64-bit value there is still the expected one. Pushes why the wait ended:

  • 0: woken by memory.atomic.notify.
  • 1: the value at the address was not the expected one, so it did not wait.
  • 2: the timeout expired.

Stack

[i32 i64 i64] → [i32]

The operands are the address, the expected value, then a timeout in nanoseconds; a negative timeout never expires. Traps on an unshared memory. A host can forbid an agent from blocking: in a browser only a worker can wait, not the main thread.

Immediate operands

  1. m : memarg — u32 align, then u64 offset

Alignment

  • align is the base-2 logarithm of the assumed alignment in bytes: 0 for 1 byte, 1 for 2, 2 for 4, 3 for 8, 4 for 16.
  • A value larger than the width of the access is rejected when the module is validated. A smaller one is allowed, and only tells the engine not to assume alignment.
  • Bit 6 (0x40) is not part of the number. When it is set, a u32 memory index follows align, before the offset, and the alignment is what is left after subtracting 64. When it is clear, the instruction uses memory 0.

Addresses: an i32 for a 32-bit memory, an i64 for a 64-bit memory (memory64). The signatures here show the 32-bit case, which is what almost every module uses.

Status

Threads and atomics

Phase 4 (2023)

Widely implemented, but not yet folded into the specification.Engine support

Properties

0xFE 3:u32atomic.fence ord

Description

Prevents the atomic accesses before it and the ones after it from being reordered across it. It reads and writes nothing itself.

Alone among the atomic instructions it takes no address and names no memory, so it orders accesses to every memory at once.

Stack

[] → []

Immediate operands

  1. u8 ord — a reserved byte, always 0x00

Status

Threads and atomics

Phase 4 (2023)

Widely implemented, but not yet folded into the specification.Engine support

Properties

0xFE 4:u32pause

Description

Hints that the thread is spinning and the core may back off. Semantically a no-op.

Stack

[] → []

Status

Relaxed atomics

Proposal: Phase 2 (2026)

Mostly a change to what the atomic instructions mean rather than a set of new ones: it gives them an ordering immediate. Adds `pause`. Encoding not final.

Properties

0xFE 16:u32i32.atomic.load m

read from memory

Description

Atomically load 4 bytes as i32.

Atomic load/store memory accesses behave like their non-atomic counterparts, with the exception that the ordering of accesses is sequentially consistent.

Stack

[i32] → [i32]

Immediate operands

  1. m : memarg — u32 align, then u64 offset

Alignment

  • align is the base-2 logarithm of the assumed alignment in bytes: 0 for 1 byte, 1 for 2, 2 for 4, 3 for 8, 4 for 16.
  • A value larger than the width of the access is rejected when the module is validated. A smaller one is allowed, and only tells the engine not to assume alignment.
  • Bit 6 (0x40) is not part of the number. When it is set, a u32 memory index follows align, before the offset, and the alignment is what is left after subtracting 64. When it is clear, the instruction uses memory 0.

Addresses: an i32 for a 32-bit memory, an i64 for a 64-bit memory (memory64). The signatures here show the 32-bit case, which is what almost every module uses.

Status

Threads and atomics

Phase 4 (2023)

Widely implemented, but not yet folded into the specification.Engine support

Properties

0xFE 17:u32i64.atomic.load m

read from memory

Description

Atomically load 8 bytes as i64.

Atomic load/store memory accesses behave like their non-atomic counterparts, with the exception that the ordering of accesses is sequentially consistent.

Stack

[i32] → [i64]

Immediate operands

  1. m : memarg — u32 align, then u64 offset

Alignment

  • align is the base-2 logarithm of the assumed alignment in bytes: 0 for 1 byte, 1 for 2, 2 for 4, 3 for 8, 4 for 16.
  • A value larger than the width of the access is rejected when the module is validated. A smaller one is allowed, and only tells the engine not to assume alignment.
  • Bit 6 (0x40) is not part of the number. When it is set, a u32 memory index follows align, before the offset, and the alignment is what is left after subtracting 64. When it is clear, the instruction uses memory 0.

Addresses: an i32 for a 32-bit memory, an i64 for a 64-bit memory (memory64). The signatures here show the 32-bit case, which is what almost every module uses.

Status

Threads and atomics

Phase 4 (2023)

Widely implemented, but not yet folded into the specification.Engine support

Properties

0xFE 18:u32i32.atomic.load8_u m

read 1 byte from memory, zero-extended

Description

Atomically load 1 byte and zero-extend i8 to i32.

Atomic load/store memory accesses behave like their non-atomic counterparts, with the exception that the ordering of accesses is sequentially consistent.

Stack

[i32] → [i32]

Immediate operands

  1. m : memarg — u32 align, then u64 offset

Alignment

  • align is the base-2 logarithm of the assumed alignment in bytes: 0 for 1 byte, 1 for 2, 2 for 4, 3 for 8, 4 for 16.
  • A value larger than the width of the access is rejected when the module is validated. A smaller one is allowed, and only tells the engine not to assume alignment.
  • Bit 6 (0x40) is not part of the number. When it is set, a u32 memory index follows align, before the offset, and the alignment is what is left after subtracting 64. When it is clear, the instruction uses memory 0.

Addresses: an i32 for a 32-bit memory, an i64 for a 64-bit memory (memory64). The signatures here show the 32-bit case, which is what almost every module uses.

Status

Threads and atomics

Phase 4 (2023)

Widely implemented, but not yet folded into the specification.Engine support

Properties

0xFE 19:u32i32.atomic.load16_u m

read 2 bytes from memory, zero-extended

Description

Atomically load 2 bytes and zero-extend i16 to i32.

Atomic load/store memory accesses behave like their non-atomic counterparts, with the exception that the ordering of accesses is sequentially consistent.

Stack

[i32] → [i32]

Immediate operands

  1. m : memarg — u32 align, then u64 offset

Alignment

  • align is the base-2 logarithm of the assumed alignment in bytes: 0 for 1 byte, 1 for 2, 2 for 4, 3 for 8, 4 for 16.
  • A value larger than the width of the access is rejected when the module is validated. A smaller one is allowed, and only tells the engine not to assume alignment.
  • Bit 6 (0x40) is not part of the number. When it is set, a u32 memory index follows align, before the offset, and the alignment is what is left after subtracting 64. When it is clear, the instruction uses memory 0.

Addresses: an i32 for a 32-bit memory, an i64 for a 64-bit memory (memory64). The signatures here show the 32-bit case, which is what almost every module uses.

Status

Threads and atomics

Phase 4 (2023)

Widely implemented, but not yet folded into the specification.Engine support

Properties

0xFE 20:u32i64.atomic.load8_u m

read 1 byte from memory, zero-extended

Description

Atomically load 1 byte and zero-extend i8 to i64.

Atomic load/store memory accesses behave like their non-atomic counterparts, with the exception that the ordering of accesses is sequentially consistent.

Stack

[i32] → [i64]

Immediate operands

  1. m : memarg — u32 align, then u64 offset

Alignment

  • align is the base-2 logarithm of the assumed alignment in bytes: 0 for 1 byte, 1 for 2, 2 for 4, 3 for 8, 4 for 16.
  • A value larger than the width of the access is rejected when the module is validated. A smaller one is allowed, and only tells the engine not to assume alignment.
  • Bit 6 (0x40) is not part of the number. When it is set, a u32 memory index follows align, before the offset, and the alignment is what is left after subtracting 64. When it is clear, the instruction uses memory 0.

Addresses: an i32 for a 32-bit memory, an i64 for a 64-bit memory (memory64). The signatures here show the 32-bit case, which is what almost every module uses.

Status

Threads and atomics

Phase 4 (2023)

Widely implemented, but not yet folded into the specification.Engine support

Properties

0xFE 21:u32i64.atomic.load16_u m

read 2 bytes from memory, zero-extended

Description

Atomically load 2 bytes and zero-extend i16 to i64.

Atomic load/store memory accesses behave like their non-atomic counterparts, with the exception that the ordering of accesses is sequentially consistent.

Stack

[i32] → [i64]

Immediate operands

  1. m : memarg — u32 align, then u64 offset

Alignment

  • align is the base-2 logarithm of the assumed alignment in bytes: 0 for 1 byte, 1 for 2, 2 for 4, 3 for 8, 4 for 16.
  • A value larger than the width of the access is rejected when the module is validated. A smaller one is allowed, and only tells the engine not to assume alignment.
  • Bit 6 (0x40) is not part of the number. When it is set, a u32 memory index follows align, before the offset, and the alignment is what is left after subtracting 64. When it is clear, the instruction uses memory 0.

Addresses: an i32 for a 32-bit memory, an i64 for a 64-bit memory (memory64). The signatures here show the 32-bit case, which is what almost every module uses.

Status

Threads and atomics

Phase 4 (2023)

Widely implemented, but not yet folded into the specification.Engine support

Properties

0xFE 22:u32i64.atomic.load32_u m

read 4 bytes from memory, zero-extended

Description

Atomically load 4 bytes and zero-extend i32 to i64.

Atomic load/store memory accesses behave like their non-atomic counterparts, with the exception that the ordering of accesses is sequentially consistent.

Stack

[i32] → [i64]

Immediate operands

  1. m : memarg — u32 align, then u64 offset

Alignment

  • align is the base-2 logarithm of the assumed alignment in bytes: 0 for 1 byte, 1 for 2, 2 for 4, 3 for 8, 4 for 16.
  • A value larger than the width of the access is rejected when the module is validated. A smaller one is allowed, and only tells the engine not to assume alignment.
  • Bit 6 (0x40) is not part of the number. When it is set, a u32 memory index follows align, before the offset, and the alignment is what is left after subtracting 64. When it is clear, the instruction uses memory 0.

Addresses: an i32 for a 32-bit memory, an i64 for a 64-bit memory (memory64). The signatures here show the 32-bit case, which is what almost every module uses.

Status

Threads and atomics

Phase 4 (2023)

Widely implemented, but not yet folded into the specification.Engine support

Properties

0xFE 23:u32i32.atomic.store m

write to memory

Description

(no conversion) atomically store 4 bytes.

Atomic load/store memory accesses behave like their non-atomic counterparts, with the exception that the ordering of accesses is sequentially consistent.

Stack

[i32 i32] → []

Immediate operands

  1. m : memarg — u32 align, then u64 offset

Alignment

  • align is the base-2 logarithm of the assumed alignment in bytes: 0 for 1 byte, 1 for 2, 2 for 4, 3 for 8, 4 for 16.
  • A value larger than the width of the access is rejected when the module is validated. A smaller one is allowed, and only tells the engine not to assume alignment.
  • Bit 6 (0x40) is not part of the number. When it is set, a u32 memory index follows align, before the offset, and the alignment is what is left after subtracting 64. When it is clear, the instruction uses memory 0.

Addresses: an i32 for a 32-bit memory, an i64 for a 64-bit memory (memory64). The signatures here show the 32-bit case, which is what almost every module uses.

Status

Threads and atomics

Phase 4 (2023)

Widely implemented, but not yet folded into the specification.Engine support

Properties

0xFE 24:u32i64.atomic.store m

write to memory

Description

(no conversion) atomically store 8 bytes.

Atomic load/store memory accesses behave like their non-atomic counterparts, with the exception that the ordering of accesses is sequentially consistent.

Stack

[i32 i64] → []

Immediate operands

  1. m : memarg — u32 align, then u64 offset

Alignment

  • align is the base-2 logarithm of the assumed alignment in bytes: 0 for 1 byte, 1 for 2, 2 for 4, 3 for 8, 4 for 16.
  • A value larger than the width of the access is rejected when the module is validated. A smaller one is allowed, and only tells the engine not to assume alignment.
  • Bit 6 (0x40) is not part of the number. When it is set, a u32 memory index follows align, before the offset, and the alignment is what is left after subtracting 64. When it is clear, the instruction uses memory 0.

Addresses: an i32 for a 32-bit memory, an i64 for a 64-bit memory (memory64). The signatures here show the 32-bit case, which is what almost every module uses.

Status

Threads and atomics

Phase 4 (2023)

Widely implemented, but not yet folded into the specification.Engine support

Properties

0xFE 25:u32i32.atomic.store8 m

write the low 1 byte to memory

Description

Wrap i32 to i8 and atomically store 1 byte.

Atomic load/store memory accesses behave like their non-atomic counterparts, with the exception that the ordering of accesses is sequentially consistent.

Stack

[i32 i32] → []

Immediate operands

  1. m : memarg — u32 align, then u64 offset

Alignment

  • align is the base-2 logarithm of the assumed alignment in bytes: 0 for 1 byte, 1 for 2, 2 for 4, 3 for 8, 4 for 16.
  • A value larger than the width of the access is rejected when the module is validated. A smaller one is allowed, and only tells the engine not to assume alignment.
  • Bit 6 (0x40) is not part of the number. When it is set, a u32 memory index follows align, before the offset, and the alignment is what is left after subtracting 64. When it is clear, the instruction uses memory 0.

Addresses: an i32 for a 32-bit memory, an i64 for a 64-bit memory (memory64). The signatures here show the 32-bit case, which is what almost every module uses.

Status

Threads and atomics

Phase 4 (2023)

Widely implemented, but not yet folded into the specification.Engine support

Properties

0xFE 26:u32i32.atomic.store16 m

write the low 2 bytes to memory

Description

Wrap i32 to i16 and atomically store 2 bytes.

Atomic load/store memory accesses behave like their non-atomic counterparts, with the exception that the ordering of accesses is sequentially consistent.

Stack

[i32 i32] → []

Immediate operands

  1. m : memarg — u32 align, then u64 offset

Alignment

  • align is the base-2 logarithm of the assumed alignment in bytes: 0 for 1 byte, 1 for 2, 2 for 4, 3 for 8, 4 for 16.
  • A value larger than the width of the access is rejected when the module is validated. A smaller one is allowed, and only tells the engine not to assume alignment.
  • Bit 6 (0x40) is not part of the number. When it is set, a u32 memory index follows align, before the offset, and the alignment is what is left after subtracting 64. When it is clear, the instruction uses memory 0.

Addresses: an i32 for a 32-bit memory, an i64 for a 64-bit memory (memory64). The signatures here show the 32-bit case, which is what almost every module uses.

Status

Threads and atomics

Phase 4 (2023)

Widely implemented, but not yet folded into the specification.Engine support

Properties

0xFE 27:u32i64.atomic.store8 m

write the low 1 byte to memory

Description

Wrap i64 to i8 and atomically store 1 byte.

Atomic load/store memory accesses behave like their non-atomic counterparts, with the exception that the ordering of accesses is sequentially consistent.

Stack

[i32 i64] → []

Immediate operands

  1. m : memarg — u32 align, then u64 offset

Alignment

  • align is the base-2 logarithm of the assumed alignment in bytes: 0 for 1 byte, 1 for 2, 2 for 4, 3 for 8, 4 for 16.
  • A value larger than the width of the access is rejected when the module is validated. A smaller one is allowed, and only tells the engine not to assume alignment.
  • Bit 6 (0x40) is not part of the number. When it is set, a u32 memory index follows align, before the offset, and the alignment is what is left after subtracting 64. When it is clear, the instruction uses memory 0.

Addresses: an i32 for a 32-bit memory, an i64 for a 64-bit memory (memory64). The signatures here show the 32-bit case, which is what almost every module uses.

Status

Threads and atomics

Phase 4 (2023)

Widely implemented, but not yet folded into the specification.Engine support

Properties

0xFE 28:u32i64.atomic.store16 m

write the low 2 bytes to memory

Description

Wrap i64 to i16 and atomically store 2 bytes.

Atomic load/store memory accesses behave like their non-atomic counterparts, with the exception that the ordering of accesses is sequentially consistent.

Stack

[i32 i64] → []

Immediate operands

  1. m : memarg — u32 align, then u64 offset

Alignment

  • align is the base-2 logarithm of the assumed alignment in bytes: 0 for 1 byte, 1 for 2, 2 for 4, 3 for 8, 4 for 16.
  • A value larger than the width of the access is rejected when the module is validated. A smaller one is allowed, and only tells the engine not to assume alignment.
  • Bit 6 (0x40) is not part of the number. When it is set, a u32 memory index follows align, before the offset, and the alignment is what is left after subtracting 64. When it is clear, the instruction uses memory 0.

Addresses: an i32 for a 32-bit memory, an i64 for a 64-bit memory (memory64). The signatures here show the 32-bit case, which is what almost every module uses.

Status

Threads and atomics

Phase 4 (2023)

Widely implemented, but not yet folded into the specification.Engine support

Properties

0xFE 29:u32i64.atomic.store32 m

write the low 4 bytes to memory

Description

Wrap i64 to i32 and atomically store 4 bytes.

Atomic load/store memory accesses behave like their non-atomic counterparts, with the exception that the ordering of accesses is sequentially consistent.

Stack

[i32 i64] → []

Immediate operands

  1. m : memarg — u32 align, then u64 offset

Alignment

  • align is the base-2 logarithm of the assumed alignment in bytes: 0 for 1 byte, 1 for 2, 2 for 4, 3 for 8, 4 for 16.
  • A value larger than the width of the access is rejected when the module is validated. A smaller one is allowed, and only tells the engine not to assume alignment.
  • Bit 6 (0x40) is not part of the number. When it is set, a u32 memory index follows align, before the offset, and the alignment is what is left after subtracting 64. When it is clear, the instruction uses memory 0.

Addresses: an i32 for a 32-bit memory, an i64 for a 64-bit memory (memory64). The signatures here show the 32-bit case, which is what almost every module uses.

Status

Threads and atomics

Phase 4 (2023)

Widely implemented, but not yet folded into the specification.Engine support

Properties

0xFE 30:u32i32.atomic.rmw.add m

add

Description

32-bit sign-agnostic addition.

Read: 4 bytes, Write: 4 bytes

Returns: as i32

Atomic read-modify-write (RMW) operators atomically read a value from an address, modify the value, and store the resulting value to the same address. All RMW operators return the value read from memory before the modify operation was performed.

The RMW operators have two operands, an address and a value used in the modify operation.

Stack

[i32 i32] → [i32]

Immediate operands

  1. m : memarg — u32 align, then u64 offset

Alignment

  • align is the base-2 logarithm of the assumed alignment in bytes: 0 for 1 byte, 1 for 2, 2 for 4, 3 for 8, 4 for 16.
  • A value larger than the width of the access is rejected when the module is validated. A smaller one is allowed, and only tells the engine not to assume alignment.
  • Bit 6 (0x40) is not part of the number. When it is set, a u32 memory index follows align, before the offset, and the alignment is what is left after subtracting 64. When it is clear, the instruction uses memory 0.

Addresses: an i32 for a 32-bit memory, an i64 for a 64-bit memory (memory64). The signatures here show the 32-bit case, which is what almost every module uses.

Status

Threads and atomics

Phase 4 (2023)

Widely implemented, but not yet folded into the specification.Engine support

Properties

0xFE 31:u32i64.atomic.rmw.add m

add

Description

64-bit sign-agnostic addition.

Read: 8 bytes, Write: 8 bytes

Returns: as i64

Atomic read-modify-write (RMW) operators atomically read a value from an address, modify the value, and store the resulting value to the same address. All RMW operators return the value read from memory before the modify operation was performed.

The RMW operators have two operands, an address and a value used in the modify operation.

Stack

[i32 i64] → [i64]

Immediate operands

  1. m : memarg — u32 align, then u64 offset

Alignment

  • align is the base-2 logarithm of the assumed alignment in bytes: 0 for 1 byte, 1 for 2, 2 for 4, 3 for 8, 4 for 16.
  • A value larger than the width of the access is rejected when the module is validated. A smaller one is allowed, and only tells the engine not to assume alignment.
  • Bit 6 (0x40) is not part of the number. When it is set, a u32 memory index follows align, before the offset, and the alignment is what is left after subtracting 64. When it is clear, the instruction uses memory 0.

Addresses: an i32 for a 32-bit memory, an i64 for a 64-bit memory (memory64). The signatures here show the 32-bit case, which is what almost every module uses.

Status

Threads and atomics

Phase 4 (2023)

Widely implemented, but not yet folded into the specification.Engine support

Properties

0xFE 32:u32i32.atomic.rmw8.add_u m

add, unsigned

Description

8-bit sign-agnostic addition.

Read: 1 byte, Write: 1 byte

Returns: zero-extended i8 to i32

Atomic read-modify-write (RMW) operators atomically read a value from an address, modify the value, and store the resulting value to the same address. All RMW operators return the value read from memory before the modify operation was performed.

The RMW operators have two operands, an address and a value used in the modify operation.

Stack

[i32 i32] → [i32]

Immediate operands

  1. m : memarg — u32 align, then u64 offset

Alignment

  • align is the base-2 logarithm of the assumed alignment in bytes: 0 for 1 byte, 1 for 2, 2 for 4, 3 for 8, 4 for 16.
  • A value larger than the width of the access is rejected when the module is validated. A smaller one is allowed, and only tells the engine not to assume alignment.
  • Bit 6 (0x40) is not part of the number. When it is set, a u32 memory index follows align, before the offset, and the alignment is what is left after subtracting 64. When it is clear, the instruction uses memory 0.

Addresses: an i32 for a 32-bit memory, an i64 for a 64-bit memory (memory64). The signatures here show the 32-bit case, which is what almost every module uses.

Status

Threads and atomics

Phase 4 (2023)

Widely implemented, but not yet folded into the specification.Engine support

Properties

0xFE 33:u32i32.atomic.rmw16.add_u m

add, unsigned

Description

16-bit sign-agnostic addition.

Read: 2 bytes, Write: 2 bytes

Returns: zero-extended i16 to i32

Atomic read-modify-write (RMW) operators atomically read a value from an address, modify the value, and store the resulting value to the same address. All RMW operators return the value read from memory before the modify operation was performed.

The RMW operators have two operands, an address and a value used in the modify operation.

Stack

[i32 i32] → [i32]

Immediate operands

  1. m : memarg — u32 align, then u64 offset

Alignment

  • align is the base-2 logarithm of the assumed alignment in bytes: 0 for 1 byte, 1 for 2, 2 for 4, 3 for 8, 4 for 16.
  • A value larger than the width of the access is rejected when the module is validated. A smaller one is allowed, and only tells the engine not to assume alignment.
  • Bit 6 (0x40) is not part of the number. When it is set, a u32 memory index follows align, before the offset, and the alignment is what is left after subtracting 64. When it is clear, the instruction uses memory 0.

Addresses: an i32 for a 32-bit memory, an i64 for a 64-bit memory (memory64). The signatures here show the 32-bit case, which is what almost every module uses.

Status

Threads and atomics

Phase 4 (2023)

Widely implemented, but not yet folded into the specification.Engine support

Properties

0xFE 34:u32i64.atomic.rmw8.add_u m

add, unsigned

Description

8-bit sign-agnostic addition.

Returns: zero-extended i8 to i64

Atomic read-modify-write (RMW) operators atomically read a value from an address, modify the value, and store the resulting value to the same address. All RMW operators return the value read from memory before the modify operation was performed.

The RMW operators have two operands, an address and a value used in the modify operation.

Stack

[i32 i64] → [i64]

Immediate operands

  1. m : memarg — u32 align, then u64 offset

Alignment

  • align is the base-2 logarithm of the assumed alignment in bytes: 0 for 1 byte, 1 for 2, 2 for 4, 3 for 8, 4 for 16.
  • A value larger than the width of the access is rejected when the module is validated. A smaller one is allowed, and only tells the engine not to assume alignment.
  • Bit 6 (0x40) is not part of the number. When it is set, a u32 memory index follows align, before the offset, and the alignment is what is left after subtracting 64. When it is clear, the instruction uses memory 0.

Addresses: an i32 for a 32-bit memory, an i64 for a 64-bit memory (memory64). The signatures here show the 32-bit case, which is what almost every module uses.

Status

Threads and atomics

Phase 4 (2023)

Widely implemented, but not yet folded into the specification.Engine support

Properties

0xFE 35:u32i64.atomic.rmw16.add_u m

add, unsigned

Description

64-bit sign-agnostic addition.

Read: 4 bytes, Write: 4 bytes

Returns: zero-extended i16 to i64

Atomic read-modify-write (RMW) operators atomically read a value from an address, modify the value, and store the resulting value to the same address. All RMW operators return the value read from memory before the modify operation was performed.

The RMW operators have two operands, an address and a value used in the modify operation.

Stack

[i32 i64] → [i64]

Immediate operands

  1. m : memarg — u32 align, then u64 offset

Alignment

  • align is the base-2 logarithm of the assumed alignment in bytes: 0 for 1 byte, 1 for 2, 2 for 4, 3 for 8, 4 for 16.
  • A value larger than the width of the access is rejected when the module is validated. A smaller one is allowed, and only tells the engine not to assume alignment.
  • Bit 6 (0x40) is not part of the number. When it is set, a u32 memory index follows align, before the offset, and the alignment is what is left after subtracting 64. When it is clear, the instruction uses memory 0.

Addresses: an i32 for a 32-bit memory, an i64 for a 64-bit memory (memory64). The signatures here show the 32-bit case, which is what almost every module uses.

Status

Threads and atomics

Phase 4 (2023)

Widely implemented, but not yet folded into the specification.Engine support

Properties

0xFE 36:u32i64.atomic.rmw32.add_u m

add, unsigned

Description

32-bit sign-agnostic addition.

Returns: zero-extended i32 to i64

Atomic read-modify-write (RMW) operators atomically read a value from an address, modify the value, and store the resulting value to the same address. All RMW operators return the value read from memory before the modify operation was performed.

The RMW operators have two operands, an address and a value used in the modify operation.

Stack

[i32 i64] → [i64]

Immediate operands

  1. m : memarg — u32 align, then u64 offset

Alignment

  • align is the base-2 logarithm of the assumed alignment in bytes: 0 for 1 byte, 1 for 2, 2 for 4, 3 for 8, 4 for 16.
  • A value larger than the width of the access is rejected when the module is validated. A smaller one is allowed, and only tells the engine not to assume alignment.
  • Bit 6 (0x40) is not part of the number. When it is set, a u32 memory index follows align, before the offset, and the alignment is what is left after subtracting 64. When it is clear, the instruction uses memory 0.

Addresses: an i32 for a 32-bit memory, an i64 for a 64-bit memory (memory64). The signatures here show the 32-bit case, which is what almost every module uses.

Status

Threads and atomics

Phase 4 (2023)

Widely implemented, but not yet folded into the specification.Engine support

Properties

0xFE 37:u32i32.atomic.rmw.sub m

subtract

Description

32-bit sign-agnostic subtraction.

Read: 4 bytes, Write: 4 bytes

Returns: as i32

Atomic read-modify-write (RMW) operators atomically read a value from an address, modify the value, and store the resulting value to the same address. All RMW operators return the value read from memory before the modify operation was performed.

The RMW operators have two operands, an address and a value used in the modify operation.

Stack

[i32 i32] → [i32]

Immediate operands

  1. m : memarg — u32 align, then u64 offset

Alignment

  • align is the base-2 logarithm of the assumed alignment in bytes: 0 for 1 byte, 1 for 2, 2 for 4, 3 for 8, 4 for 16.
  • A value larger than the width of the access is rejected when the module is validated. A smaller one is allowed, and only tells the engine not to assume alignment.
  • Bit 6 (0x40) is not part of the number. When it is set, a u32 memory index follows align, before the offset, and the alignment is what is left after subtracting 64. When it is clear, the instruction uses memory 0.

Addresses: an i32 for a 32-bit memory, an i64 for a 64-bit memory (memory64). The signatures here show the 32-bit case, which is what almost every module uses.

Status

Threads and atomics

Phase 4 (2023)

Widely implemented, but not yet folded into the specification.Engine support

Properties

0xFE 38:u32i64.atomic.rmw.sub m

subtract

Description

64-bit sign-agnostic subtraction.

Read: 8 bytes, Write: 8 bytes

Returns: as i64

Atomic read-modify-write (RMW) operators atomically read a value from an address, modify the value, and store the resulting value to the same address. All RMW operators return the value read from memory before the modify operation was performed.

The RMW operators have two operands, an address and a value used in the modify operation.

Stack

[i32 i64] → [i64]

Immediate operands

  1. m : memarg — u32 align, then u64 offset

Alignment

  • align is the base-2 logarithm of the assumed alignment in bytes: 0 for 1 byte, 1 for 2, 2 for 4, 3 for 8, 4 for 16.
  • A value larger than the width of the access is rejected when the module is validated. A smaller one is allowed, and only tells the engine not to assume alignment.
  • Bit 6 (0x40) is not part of the number. When it is set, a u32 memory index follows align, before the offset, and the alignment is what is left after subtracting 64. When it is clear, the instruction uses memory 0.

Addresses: an i32 for a 32-bit memory, an i64 for a 64-bit memory (memory64). The signatures here show the 32-bit case, which is what almost every module uses.

Status

Threads and atomics

Phase 4 (2023)

Widely implemented, but not yet folded into the specification.Engine support

Properties

0xFE 39:u32i32.atomic.rmw8.sub_u m

subtract, unsigned

Description

8-bit sign-agnostic subtraction.

Read: 1 byte, Write: 1 byte

Returns: zero-extended i8 to i32

Atomic read-modify-write (RMW) operators atomically read a value from an address, modify the value, and store the resulting value to the same address. All RMW operators return the value read from memory before the modify operation was performed.

The RMW operators have two operands, an address and a value used in the modify operation.

Stack

[i32 i32] → [i32]

Immediate operands

  1. m : memarg — u32 align, then u64 offset

Alignment

  • align is the base-2 logarithm of the assumed alignment in bytes: 0 for 1 byte, 1 for 2, 2 for 4, 3 for 8, 4 for 16.
  • A value larger than the width of the access is rejected when the module is validated. A smaller one is allowed, and only tells the engine not to assume alignment.
  • Bit 6 (0x40) is not part of the number. When it is set, a u32 memory index follows align, before the offset, and the alignment is what is left after subtracting 64. When it is clear, the instruction uses memory 0.

Addresses: an i32 for a 32-bit memory, an i64 for a 64-bit memory (memory64). The signatures here show the 32-bit case, which is what almost every module uses.

Status

Threads and atomics

Phase 4 (2023)

Widely implemented, but not yet folded into the specification.Engine support

Properties

0xFE 40:u32i32.atomic.rmw16.sub_u m

subtract, unsigned

Description

16-bit sign-agnostic subtraction.

Read: 2 bytes, Write: 2 bytes

Returns: zero-extended i16 to i32

Atomic read-modify-write (RMW) operators atomically read a value from an address, modify the value, and store the resulting value to the same address. All RMW operators return the value read from memory before the modify operation was performed.

The RMW operators have two operands, an address and a value used in the modify operation.

Stack

[i32 i32] → [i32]

Immediate operands

  1. m : memarg — u32 align, then u64 offset

Alignment

  • align is the base-2 logarithm of the assumed alignment in bytes: 0 for 1 byte, 1 for 2, 2 for 4, 3 for 8, 4 for 16.
  • A value larger than the width of the access is rejected when the module is validated. A smaller one is allowed, and only tells the engine not to assume alignment.
  • Bit 6 (0x40) is not part of the number. When it is set, a u32 memory index follows align, before the offset, and the alignment is what is left after subtracting 64. When it is clear, the instruction uses memory 0.

Addresses: an i32 for a 32-bit memory, an i64 for a 64-bit memory (memory64). The signatures here show the 32-bit case, which is what almost every module uses.

Status

Threads and atomics

Phase 4 (2023)

Widely implemented, but not yet folded into the specification.Engine support

Properties

0xFE 41:u32i64.atomic.rmw8.sub_u m

subtract, unsigned

Description

8-bit sign-agnostic subtraction.

Read: 1 byte, Write: 1 byte

Returns: zero-extended i8 to i64

Atomic read-modify-write (RMW) operators atomically read a value from an address, modify the value, and store the resulting value to the same address. All RMW operators return the value read from memory before the modify operation was performed.

The RMW operators have two operands, an address and a value used in the modify operation.

Stack

[i32 i64] → [i64]

Immediate operands

  1. m : memarg — u32 align, then u64 offset

Alignment

  • align is the base-2 logarithm of the assumed alignment in bytes: 0 for 1 byte, 1 for 2, 2 for 4, 3 for 8, 4 for 16.
  • A value larger than the width of the access is rejected when the module is validated. A smaller one is allowed, and only tells the engine not to assume alignment.
  • Bit 6 (0x40) is not part of the number. When it is set, a u32 memory index follows align, before the offset, and the alignment is what is left after subtracting 64. When it is clear, the instruction uses memory 0.

Addresses: an i32 for a 32-bit memory, an i64 for a 64-bit memory (memory64). The signatures here show the 32-bit case, which is what almost every module uses.

Status

Threads and atomics

Phase 4 (2023)

Widely implemented, but not yet folded into the specification.Engine support

Properties

0xFE 42:u32i64.atomic.rmw16.sub_u m

subtract, unsigned

Description

16-bit sign-agnostic subtraction.

Read: 2 bytes, Write: 2 bytes

Returns: zero-extended i16 to i64

Atomic read-modify-write (RMW) operators atomically read a value from an address, modify the value, and store the resulting value to the same address. All RMW operators return the value read from memory before the modify operation was performed.

The RMW operators have two operands, an address and a value used in the modify operation.

Stack

[i32 i64] → [i64]

Immediate operands

  1. m : memarg — u32 align, then u64 offset

Alignment

  • align is the base-2 logarithm of the assumed alignment in bytes: 0 for 1 byte, 1 for 2, 2 for 4, 3 for 8, 4 for 16.
  • A value larger than the width of the access is rejected when the module is validated. A smaller one is allowed, and only tells the engine not to assume alignment.
  • Bit 6 (0x40) is not part of the number. When it is set, a u32 memory index follows align, before the offset, and the alignment is what is left after subtracting 64. When it is clear, the instruction uses memory 0.

Addresses: an i32 for a 32-bit memory, an i64 for a 64-bit memory (memory64). The signatures here show the 32-bit case, which is what almost every module uses.

Status

Threads and atomics

Phase 4 (2023)

Widely implemented, but not yet folded into the specification.Engine support

Properties

0xFE 43:u32i64.atomic.rmw32.sub_u m

subtract, unsigned

Description

32-bit sign-agnostic subtraction.

Read: 4 bytes, Write: 4 bytes

Returns: zero-extended i32 to i64

Atomic read-modify-write (RMW) operators atomically read a value from an address, modify the value, and store the resulting value to the same address. All RMW operators return the value read from memory before the modify operation was performed.

The RMW operators have two operands, an address and a value used in the modify operation.

Stack

[i32 i64] → [i64]

Immediate operands

  1. m : memarg — u32 align, then u64 offset

Alignment

  • align is the base-2 logarithm of the assumed alignment in bytes: 0 for 1 byte, 1 for 2, 2 for 4, 3 for 8, 4 for 16.
  • A value larger than the width of the access is rejected when the module is validated. A smaller one is allowed, and only tells the engine not to assume alignment.
  • Bit 6 (0x40) is not part of the number. When it is set, a u32 memory index follows align, before the offset, and the alignment is what is left after subtracting 64. When it is clear, the instruction uses memory 0.

Addresses: an i32 for a 32-bit memory, an i64 for a 64-bit memory (memory64). The signatures here show the 32-bit case, which is what almost every module uses.

Status

Threads and atomics

Phase 4 (2023)

Widely implemented, but not yet folded into the specification.Engine support

Properties

0xFE 44:u32i32.atomic.rmw.and m

bitwise and

Description

32-bit sign-agnostic bitwise AND.

Read: 4 bytes, Write: 4 bytes

Returns: as i32

Atomic read-modify-write (RMW) operators atomically read a value from an address, modify the value, and store the resulting value to the same address. All RMW operators return the value read from memory before the modify operation was performed.

The RMW operators have two operands, an address and a value used in the modify operation.

Stack

[i32 i32] → [i32]

Immediate operands

  1. m : memarg — u32 align, then u64 offset

Alignment

  • align is the base-2 logarithm of the assumed alignment in bytes: 0 for 1 byte, 1 for 2, 2 for 4, 3 for 8, 4 for 16.
  • A value larger than the width of the access is rejected when the module is validated. A smaller one is allowed, and only tells the engine not to assume alignment.
  • Bit 6 (0x40) is not part of the number. When it is set, a u32 memory index follows align, before the offset, and the alignment is what is left after subtracting 64. When it is clear, the instruction uses memory 0.

Addresses: an i32 for a 32-bit memory, an i64 for a 64-bit memory (memory64). The signatures here show the 32-bit case, which is what almost every module uses.

Status

Threads and atomics

Phase 4 (2023)

Widely implemented, but not yet folded into the specification.Engine support

Properties

0xFE 45:u32i64.atomic.rmw.and m

bitwise and

Description

64-bit sign-agnostic bitwise AND.

Read: 8 bytes, Write: 8 bytes

Returns: as i64

Atomic read-modify-write (RMW) operators atomically read a value from an address, modify the value, and store the resulting value to the same address. All RMW operators return the value read from memory before the modify operation was performed.

The RMW operators have two operands, an address and a value used in the modify operation.

Stack

[i32 i64] → [i64]

Immediate operands

  1. m : memarg — u32 align, then u64 offset

Alignment

  • align is the base-2 logarithm of the assumed alignment in bytes: 0 for 1 byte, 1 for 2, 2 for 4, 3 for 8, 4 for 16.
  • A value larger than the width of the access is rejected when the module is validated. A smaller one is allowed, and only tells the engine not to assume alignment.
  • Bit 6 (0x40) is not part of the number. When it is set, a u32 memory index follows align, before the offset, and the alignment is what is left after subtracting 64. When it is clear, the instruction uses memory 0.

Addresses: an i32 for a 32-bit memory, an i64 for a 64-bit memory (memory64). The signatures here show the 32-bit case, which is what almost every module uses.

Status

Threads and atomics

Phase 4 (2023)

Widely implemented, but not yet folded into the specification.Engine support

Properties

0xFE 46:u32i32.atomic.rmw8.and_u m

bitwise and, unsigned

Description

8-bit sign-agnostic bitwise AND.

Read: 1 byte, Write: 1 byte

Returns: zero-extended i8 to i32

Atomic read-modify-write (RMW) operators atomically read a value from an address, modify the value, and store the resulting value to the same address. All RMW operators return the value read from memory before the modify operation was performed.

The RMW operators have two operands, an address and a value used in the modify operation.

Stack

[i32 i32] → [i32]

Immediate operands

  1. m : memarg — u32 align, then u64 offset

Alignment

  • align is the base-2 logarithm of the assumed alignment in bytes: 0 for 1 byte, 1 for 2, 2 for 4, 3 for 8, 4 for 16.
  • A value larger than the width of the access is rejected when the module is validated. A smaller one is allowed, and only tells the engine not to assume alignment.
  • Bit 6 (0x40) is not part of the number. When it is set, a u32 memory index follows align, before the offset, and the alignment is what is left after subtracting 64. When it is clear, the instruction uses memory 0.

Addresses: an i32 for a 32-bit memory, an i64 for a 64-bit memory (memory64). The signatures here show the 32-bit case, which is what almost every module uses.

Status

Threads and atomics

Phase 4 (2023)

Widely implemented, but not yet folded into the specification.Engine support

Properties

0xFE 47:u32i32.atomic.rmw16.and_u m

bitwise and, unsigned

Description

16-bit sign-agnostic bitwise AND.

Read: 2 bytes, Write: 2 bytes

Returns: zero-extended i16 to i32

Atomic read-modify-write (RMW) operators atomically read a value from an address, modify the value, and store the resulting value to the same address. All RMW operators return the value read from memory before the modify operation was performed.

The RMW operators have two operands, an address and a value used in the modify operation.

Stack

[i32 i32] → [i32]

Immediate operands

  1. m : memarg — u32 align, then u64 offset

Alignment

  • align is the base-2 logarithm of the assumed alignment in bytes: 0 for 1 byte, 1 for 2, 2 for 4, 3 for 8, 4 for 16.
  • A value larger than the width of the access is rejected when the module is validated. A smaller one is allowed, and only tells the engine not to assume alignment.
  • Bit 6 (0x40) is not part of the number. When it is set, a u32 memory index follows align, before the offset, and the alignment is what is left after subtracting 64. When it is clear, the instruction uses memory 0.

Addresses: an i32 for a 32-bit memory, an i64 for a 64-bit memory (memory64). The signatures here show the 32-bit case, which is what almost every module uses.

Status

Threads and atomics

Phase 4 (2023)

Widely implemented, but not yet folded into the specification.Engine support

Properties

0xFE 48:u32i64.atomic.rmw8.and_u m

bitwise and, unsigned

Description

8-bit sign-agnostic bitwise AND.

Read: 1 byte, Write: 1 byte

Returns: zero-extended i8 to i64

Atomic read-modify-write (RMW) operators atomically read a value from an address, modify the value, and store the resulting value to the same address. All RMW operators return the value read from memory before the modify operation was performed.

The RMW operators have two operands, an address and a value used in the modify operation.

Stack

[i32 i64] → [i64]

Immediate operands

  1. m : memarg — u32 align, then u64 offset

Alignment

  • align is the base-2 logarithm of the assumed alignment in bytes: 0 for 1 byte, 1 for 2, 2 for 4, 3 for 8, 4 for 16.
  • A value larger than the width of the access is rejected when the module is validated. A smaller one is allowed, and only tells the engine not to assume alignment.
  • Bit 6 (0x40) is not part of the number. When it is set, a u32 memory index follows align, before the offset, and the alignment is what is left after subtracting 64. When it is clear, the instruction uses memory 0.

Addresses: an i32 for a 32-bit memory, an i64 for a 64-bit memory (memory64). The signatures here show the 32-bit case, which is what almost every module uses.

Status

Threads and atomics

Phase 4 (2023)

Widely implemented, but not yet folded into the specification.Engine support

Properties

0xFE 49:u32i64.atomic.rmw16.and_u m

bitwise and, unsigned

Description

16-bit sign-agnostic bitwise AND.

Read: 2 bytes, Write: 2 bytes

Returns: zero-extended i16 to i64

Atomic read-modify-write (RMW) operators atomically read a value from an address, modify the value, and store the resulting value to the same address. All RMW operators return the value read from memory before the modify operation was performed.

The RMW operators have two operands, an address and a value used in the modify operation.

Stack

[i32 i64] → [i64]

Immediate operands

  1. m : memarg — u32 align, then u64 offset

Alignment

  • align is the base-2 logarithm of the assumed alignment in bytes: 0 for 1 byte, 1 for 2, 2 for 4, 3 for 8, 4 for 16.
  • A value larger than the width of the access is rejected when the module is validated. A smaller one is allowed, and only tells the engine not to assume alignment.
  • Bit 6 (0x40) is not part of the number. When it is set, a u32 memory index follows align, before the offset, and the alignment is what is left after subtracting 64. When it is clear, the instruction uses memory 0.

Addresses: an i32 for a 32-bit memory, an i64 for a 64-bit memory (memory64). The signatures here show the 32-bit case, which is what almost every module uses.

Status

Threads and atomics

Phase 4 (2023)

Widely implemented, but not yet folded into the specification.Engine support

Properties

0xFE 50:u32i64.atomic.rmw32.and_u m

bitwise and, unsigned

Description

32-bit sign-agnostic bitwise AND.

Read: 4 bytes, Write: 4 bytes

Returns: zero-extended i32 to i64

Atomic read-modify-write (RMW) operators atomically read a value from an address, modify the value, and store the resulting value to the same address. All RMW operators return the value read from memory before the modify operation was performed.

The RMW operators have two operands, an address and a value used in the modify operation.

Stack

[i32 i64] → [i64]

Immediate operands

  1. m : memarg — u32 align, then u64 offset

Alignment

  • align is the base-2 logarithm of the assumed alignment in bytes: 0 for 1 byte, 1 for 2, 2 for 4, 3 for 8, 4 for 16.
  • A value larger than the width of the access is rejected when the module is validated. A smaller one is allowed, and only tells the engine not to assume alignment.
  • Bit 6 (0x40) is not part of the number. When it is set, a u32 memory index follows align, before the offset, and the alignment is what is left after subtracting 64. When it is clear, the instruction uses memory 0.

Addresses: an i32 for a 32-bit memory, an i64 for a 64-bit memory (memory64). The signatures here show the 32-bit case, which is what almost every module uses.

Status

Threads and atomics

Phase 4 (2023)

Widely implemented, but not yet folded into the specification.Engine support

Properties

0xFE 51:u32i32.atomic.rmw.or m

bitwise or

Description

32-bit sign-agnostic bitwise inclusive OR.

Read: 4 bytes, Write: 4 bytes

Returns: as i32

Atomic read-modify-write (RMW) operators atomically read a value from an address, modify the value, and store the resulting value to the same address. All RMW operators return the value read from memory before the modify operation was performed.

The RMW operators have two operands, an address and a value used in the modify operation.

Stack

[i32 i32] → [i32]

Immediate operands

  1. m : memarg — u32 align, then u64 offset

Alignment

  • align is the base-2 logarithm of the assumed alignment in bytes: 0 for 1 byte, 1 for 2, 2 for 4, 3 for 8, 4 for 16.
  • A value larger than the width of the access is rejected when the module is validated. A smaller one is allowed, and only tells the engine not to assume alignment.
  • Bit 6 (0x40) is not part of the number. When it is set, a u32 memory index follows align, before the offset, and the alignment is what is left after subtracting 64. When it is clear, the instruction uses memory 0.

Addresses: an i32 for a 32-bit memory, an i64 for a 64-bit memory (memory64). The signatures here show the 32-bit case, which is what almost every module uses.

Status

Threads and atomics

Phase 4 (2023)

Widely implemented, but not yet folded into the specification.Engine support

Properties

0xFE 52:u32i64.atomic.rmw.or m

bitwise or

Description

64-bit sign-agnostic bitwise inclusive OR.

Read: 8 bytes, Write: 8 bytes

Returns: as i64

Atomic read-modify-write (RMW) operators atomically read a value from an address, modify the value, and store the resulting value to the same address. All RMW operators return the value read from memory before the modify operation was performed.

The RMW operators have two operands, an address and a value used in the modify operation.

Stack

[i32 i64] → [i64]

Immediate operands

  1. m : memarg — u32 align, then u64 offset

Alignment

  • align is the base-2 logarithm of the assumed alignment in bytes: 0 for 1 byte, 1 for 2, 2 for 4, 3 for 8, 4 for 16.
  • A value larger than the width of the access is rejected when the module is validated. A smaller one is allowed, and only tells the engine not to assume alignment.
  • Bit 6 (0x40) is not part of the number. When it is set, a u32 memory index follows align, before the offset, and the alignment is what is left after subtracting 64. When it is clear, the instruction uses memory 0.

Addresses: an i32 for a 32-bit memory, an i64 for a 64-bit memory (memory64). The signatures here show the 32-bit case, which is what almost every module uses.

Status

Threads and atomics

Phase 4 (2023)

Widely implemented, but not yet folded into the specification.Engine support

Properties

0xFE 53:u32i32.atomic.rmw8.or_u m

bitwise or, unsigned

Description

8-bit sign-agnostic bitwise inclusive OR.

Read: 1 byte, Write: 1 byte

Returns: zero-extended i8 to i32

Atomic read-modify-write (RMW) operators atomically read a value from an address, modify the value, and store the resulting value to the same address. All RMW operators return the value read from memory before the modify operation was performed.

The RMW operators have two operands, an address and a value used in the modify operation.

Stack

[i32 i32] → [i32]

Immediate operands

  1. m : memarg — u32 align, then u64 offset

Alignment

  • align is the base-2 logarithm of the assumed alignment in bytes: 0 for 1 byte, 1 for 2, 2 for 4, 3 for 8, 4 for 16.
  • A value larger than the width of the access is rejected when the module is validated. A smaller one is allowed, and only tells the engine not to assume alignment.
  • Bit 6 (0x40) is not part of the number. When it is set, a u32 memory index follows align, before the offset, and the alignment is what is left after subtracting 64. When it is clear, the instruction uses memory 0.

Addresses: an i32 for a 32-bit memory, an i64 for a 64-bit memory (memory64). The signatures here show the 32-bit case, which is what almost every module uses.

Status

Threads and atomics

Phase 4 (2023)

Widely implemented, but not yet folded into the specification.Engine support

Properties

0xFE 54:u32i32.atomic.rmw16.or_u m

bitwise or, unsigned

Description

16-bit sign-agnostic bitwise inclusive OR.

Read: 2 bytes, Write: 2 bytes

Returns: zero-extended i16 to i32

Atomic read-modify-write (RMW) operators atomically read a value from an address, modify the value, and store the resulting value to the same address. All RMW operators return the value read from memory before the modify operation was performed.

The RMW operators have two operands, an address and a value used in the modify operation.

Stack

[i32 i32] → [i32]

Immediate operands

  1. m : memarg — u32 align, then u64 offset

Alignment

  • align is the base-2 logarithm of the assumed alignment in bytes: 0 for 1 byte, 1 for 2, 2 for 4, 3 for 8, 4 for 16.
  • A value larger than the width of the access is rejected when the module is validated. A smaller one is allowed, and only tells the engine not to assume alignment.
  • Bit 6 (0x40) is not part of the number. When it is set, a u32 memory index follows align, before the offset, and the alignment is what is left after subtracting 64. When it is clear, the instruction uses memory 0.

Addresses: an i32 for a 32-bit memory, an i64 for a 64-bit memory (memory64). The signatures here show the 32-bit case, which is what almost every module uses.

Status

Threads and atomics

Phase 4 (2023)

Widely implemented, but not yet folded into the specification.Engine support

Properties

0xFE 55:u32i64.atomic.rmw8.or_u m

bitwise or, unsigned

Description

8-bit sign-agnostic bitwise inclusive OR.

Read: 1 byte, Write: 1 byte

Returns: zero-extended i8 to i64

Atomic read-modify-write (RMW) operators atomically read a value from an address, modify the value, and store the resulting value to the same address. All RMW operators return the value read from memory before the modify operation was performed.

The RMW operators have two operands, an address and a value used in the modify operation.

Stack

[i32 i64] → [i64]

Immediate operands

  1. m : memarg — u32 align, then u64 offset

Alignment

  • align is the base-2 logarithm of the assumed alignment in bytes: 0 for 1 byte, 1 for 2, 2 for 4, 3 for 8, 4 for 16.
  • A value larger than the width of the access is rejected when the module is validated. A smaller one is allowed, and only tells the engine not to assume alignment.
  • Bit 6 (0x40) is not part of the number. When it is set, a u32 memory index follows align, before the offset, and the alignment is what is left after subtracting 64. When it is clear, the instruction uses memory 0.

Addresses: an i32 for a 32-bit memory, an i64 for a 64-bit memory (memory64). The signatures here show the 32-bit case, which is what almost every module uses.

Status

Threads and atomics

Phase 4 (2023)

Widely implemented, but not yet folded into the specification.Engine support

Properties

0xFE 56:u32i64.atomic.rmw16.or_u m

bitwise or, unsigned

Description

16-bit sign-agnostic bitwise inclusive OR.

Read: 2 bytes, Write: 2 bytes

Returns: zero-extended i16 to i64

Atomic read-modify-write (RMW) operators atomically read a value from an address, modify the value, and store the resulting value to the same address. All RMW operators return the value read from memory before the modify operation was performed.

The RMW operators have two operands, an address and a value used in the modify operation.

Stack

[i32 i64] → [i64]

Immediate operands

  1. m : memarg — u32 align, then u64 offset

Alignment

  • align is the base-2 logarithm of the assumed alignment in bytes: 0 for 1 byte, 1 for 2, 2 for 4, 3 for 8, 4 for 16.
  • A value larger than the width of the access is rejected when the module is validated. A smaller one is allowed, and only tells the engine not to assume alignment.
  • Bit 6 (0x40) is not part of the number. When it is set, a u32 memory index follows align, before the offset, and the alignment is what is left after subtracting 64. When it is clear, the instruction uses memory 0.

Addresses: an i32 for a 32-bit memory, an i64 for a 64-bit memory (memory64). The signatures here show the 32-bit case, which is what almost every module uses.

Status

Threads and atomics

Phase 4 (2023)

Widely implemented, but not yet folded into the specification.Engine support

Properties

0xFE 57:u32i64.atomic.rmw32.or_u m

bitwise or, unsigned

Description

32-bit sign-agnostic bitwise inclusive OR.

Read: 4 bytes, Write: 4 bytes

Returns: zero-extended i32 to i64

Atomic read-modify-write (RMW) operators atomically read a value from an address, modify the value, and store the resulting value to the same address. All RMW operators return the value read from memory before the modify operation was performed.

The RMW operators have two operands, an address and a value used in the modify operation.

Stack

[i32 i64] → [i64]

Immediate operands

  1. m : memarg — u32 align, then u64 offset

Alignment

  • align is the base-2 logarithm of the assumed alignment in bytes: 0 for 1 byte, 1 for 2, 2 for 4, 3 for 8, 4 for 16.
  • A value larger than the width of the access is rejected when the module is validated. A smaller one is allowed, and only tells the engine not to assume alignment.
  • Bit 6 (0x40) is not part of the number. When it is set, a u32 memory index follows align, before the offset, and the alignment is what is left after subtracting 64. When it is clear, the instruction uses memory 0.

Addresses: an i32 for a 32-bit memory, an i64 for a 64-bit memory (memory64). The signatures here show the 32-bit case, which is what almost every module uses.

Status

Threads and atomics

Phase 4 (2023)

Widely implemented, but not yet folded into the specification.Engine support

Properties

0xFE 58:u32i32.atomic.rmw.xor m

bitwise exclusive or

Description

32-bit sign-agnostic bitwise exclusive OR (XOR).

Read: 4 bytes, Write: 4 bytes

Returns: as i32

Atomic read-modify-write (RMW) operators atomically read a value from an address, modify the value, and store the resulting value to the same address. All RMW operators return the value read from memory before the modify operation was performed.

The RMW operators have two operands, an address and a value used in the modify operation.

Stack

[i32 i32] → [i32]

Immediate operands

  1. m : memarg — u32 align, then u64 offset

Alignment

  • align is the base-2 logarithm of the assumed alignment in bytes: 0 for 1 byte, 1 for 2, 2 for 4, 3 for 8, 4 for 16.
  • A value larger than the width of the access is rejected when the module is validated. A smaller one is allowed, and only tells the engine not to assume alignment.
  • Bit 6 (0x40) is not part of the number. When it is set, a u32 memory index follows align, before the offset, and the alignment is what is left after subtracting 64. When it is clear, the instruction uses memory 0.

Addresses: an i32 for a 32-bit memory, an i64 for a 64-bit memory (memory64). The signatures here show the 32-bit case, which is what almost every module uses.

Status

Threads and atomics

Phase 4 (2023)

Widely implemented, but not yet folded into the specification.Engine support

Properties

0xFE 59:u32i64.atomic.rmw.xor m

bitwise exclusive or

Description

64-bit sign-agnostic bitwise exclusive OR (XOR).

Read: 8 bytes, Write: 8 bytes

Returns: as i64

Atomic read-modify-write (RMW) operators atomically read a value from an address, modify the value, and store the resulting value to the same address. All RMW operators return the value read from memory before the modify operation was performed.

The RMW operators have two operands, an address and a value used in the modify operation.

Stack

[i32 i64] → [i64]

Immediate operands

  1. m : memarg — u32 align, then u64 offset

Alignment

  • align is the base-2 logarithm of the assumed alignment in bytes: 0 for 1 byte, 1 for 2, 2 for 4, 3 for 8, 4 for 16.
  • A value larger than the width of the access is rejected when the module is validated. A smaller one is allowed, and only tells the engine not to assume alignment.
  • Bit 6 (0x40) is not part of the number. When it is set, a u32 memory index follows align, before the offset, and the alignment is what is left after subtracting 64. When it is clear, the instruction uses memory 0.

Addresses: an i32 for a 32-bit memory, an i64 for a 64-bit memory (memory64). The signatures here show the 32-bit case, which is what almost every module uses.

Status

Threads and atomics

Phase 4 (2023)

Widely implemented, but not yet folded into the specification.Engine support

Properties

0xFE 60:u32i32.atomic.rmw8.xor_u m

bitwise exclusive or, unsigned

Description

8-bit sign-agnostic bitwise exclusive OR (XOR).

Read: 1 byte, Write: 1 byte

Returns: zero-extended i8 to i32

Atomic read-modify-write (RMW) operators atomically read a value from an address, modify the value, and store the resulting value to the same address. All RMW operators return the value read from memory before the modify operation was performed.

The RMW operators have two operands, an address and a value used in the modify operation.

Stack

[i32 i32] → [i32]

Immediate operands

  1. m : memarg — u32 align, then u64 offset

Alignment

  • align is the base-2 logarithm of the assumed alignment in bytes: 0 for 1 byte, 1 for 2, 2 for 4, 3 for 8, 4 for 16.
  • A value larger than the width of the access is rejected when the module is validated. A smaller one is allowed, and only tells the engine not to assume alignment.
  • Bit 6 (0x40) is not part of the number. When it is set, a u32 memory index follows align, before the offset, and the alignment is what is left after subtracting 64. When it is clear, the instruction uses memory 0.

Addresses: an i32 for a 32-bit memory, an i64 for a 64-bit memory (memory64). The signatures here show the 32-bit case, which is what almost every module uses.

Status

Threads and atomics

Phase 4 (2023)

Widely implemented, but not yet folded into the specification.Engine support

Properties

0xFE 61:u32i32.atomic.rmw16.xor_u m

bitwise exclusive or, unsigned

Description

16-bit sign-agnostic bitwise exclusive OR (XOR).

Read: 2 bytes, Write: 2 bytes

Returns: zero-extended i16 to i32

Atomic read-modify-write (RMW) operators atomically read a value from an address, modify the value, and store the resulting value to the same address. All RMW operators return the value read from memory before the modify operation was performed.

The RMW operators have two operands, an address and a value used in the modify operation.

Stack

[i32 i32] → [i32]

Immediate operands

  1. m : memarg — u32 align, then u64 offset

Alignment

  • align is the base-2 logarithm of the assumed alignment in bytes: 0 for 1 byte, 1 for 2, 2 for 4, 3 for 8, 4 for 16.
  • A value larger than the width of the access is rejected when the module is validated. A smaller one is allowed, and only tells the engine not to assume alignment.
  • Bit 6 (0x40) is not part of the number. When it is set, a u32 memory index follows align, before the offset, and the alignment is what is left after subtracting 64. When it is clear, the instruction uses memory 0.

Addresses: an i32 for a 32-bit memory, an i64 for a 64-bit memory (memory64). The signatures here show the 32-bit case, which is what almost every module uses.

Status

Threads and atomics

Phase 4 (2023)

Widely implemented, but not yet folded into the specification.Engine support

Properties

0xFE 62:u32i64.atomic.rmw8.xor_u m

bitwise exclusive or, unsigned

Description

8-bit sign-agnostic bitwise exclusive OR (XOR).

Read: 1 byte, Write: 1 byte

Returns: zero-extended i8 to i64

Atomic read-modify-write (RMW) operators atomically read a value from an address, modify the value, and store the resulting value to the same address. All RMW operators return the value read from memory before the modify operation was performed.

The RMW operators have two operands, an address and a value used in the modify operation.

Stack

[i32 i64] → [i64]

Immediate operands

  1. m : memarg — u32 align, then u64 offset

Alignment

  • align is the base-2 logarithm of the assumed alignment in bytes: 0 for 1 byte, 1 for 2, 2 for 4, 3 for 8, 4 for 16.
  • A value larger than the width of the access is rejected when the module is validated. A smaller one is allowed, and only tells the engine not to assume alignment.
  • Bit 6 (0x40) is not part of the number. When it is set, a u32 memory index follows align, before the offset, and the alignment is what is left after subtracting 64. When it is clear, the instruction uses memory 0.

Addresses: an i32 for a 32-bit memory, an i64 for a 64-bit memory (memory64). The signatures here show the 32-bit case, which is what almost every module uses.

Status

Threads and atomics

Phase 4 (2023)

Widely implemented, but not yet folded into the specification.Engine support

Properties

0xFE 63:u32i64.atomic.rmw16.xor_u m

bitwise exclusive or, unsigned

Description

16-bit sign-agnostic bitwise exclusive OR (XOR).

Read: 2 bytes, Write: 2 bytes

Returns: zero-extended i16 to i64

Atomic read-modify-write (RMW) operators atomically read a value from an address, modify the value, and store the resulting value to the same address. All RMW operators return the value read from memory before the modify operation was performed.

The RMW operators have two operands, an address and a value used in the modify operation.

Stack

[i32 i64] → [i64]

Immediate operands

  1. m : memarg — u32 align, then u64 offset

Alignment

  • align is the base-2 logarithm of the assumed alignment in bytes: 0 for 1 byte, 1 for 2, 2 for 4, 3 for 8, 4 for 16.
  • A value larger than the width of the access is rejected when the module is validated. A smaller one is allowed, and only tells the engine not to assume alignment.
  • Bit 6 (0x40) is not part of the number. When it is set, a u32 memory index follows align, before the offset, and the alignment is what is left after subtracting 64. When it is clear, the instruction uses memory 0.

Addresses: an i32 for a 32-bit memory, an i64 for a 64-bit memory (memory64). The signatures here show the 32-bit case, which is what almost every module uses.

Status

Threads and atomics

Phase 4 (2023)

Widely implemented, but not yet folded into the specification.Engine support

Properties

0xFE 64:u32i64.atomic.rmw32.xor_u m

bitwise exclusive or, unsigned

Description

32-bit sign-agnostic bitwise exclusive OR (XOR).

Read: 4 bytes, Write: 4 bytes

Returns: zero-extended i32 to i64

Atomic read-modify-write (RMW) operators atomically read a value from an address, modify the value, and store the resulting value to the same address. All RMW operators return the value read from memory before the modify operation was performed.

The RMW operators have two operands, an address and a value used in the modify operation.

Stack

[i32 i64] → [i64]

Immediate operands

  1. m : memarg — u32 align, then u64 offset

Alignment

  • align is the base-2 logarithm of the assumed alignment in bytes: 0 for 1 byte, 1 for 2, 2 for 4, 3 for 8, 4 for 16.
  • A value larger than the width of the access is rejected when the module is validated. A smaller one is allowed, and only tells the engine not to assume alignment.
  • Bit 6 (0x40) is not part of the number. When it is set, a u32 memory index follows align, before the offset, and the alignment is what is left after subtracting 64. When it is clear, the instruction uses memory 0.

Addresses: an i32 for a 32-bit memory, an i64 for a 64-bit memory (memory64). The signatures here show the 32-bit case, which is what almost every module uses.

Status

Threads and atomics

Phase 4 (2023)

Widely implemented, but not yet folded into the specification.Engine support

Properties

0xFE 65:u32i32.atomic.rmw.xchg m

Description

32-bit exchange: writes the operand to the address and returns the value that was there.

Read: 4 bytes, Write: 4 bytes

Returns: as i32

Atomic read-modify-write (RMW) operators atomically read a value from an address, modify the value, and store the resulting value to the same address. All RMW operators return the value read from memory before the modify operation was performed.

The RMW operators have two operands, an address and a value used in the modify operation.

Stack

[i32 i32] → [i32]

Immediate operands

  1. m : memarg — u32 align, then u64 offset

Alignment

  • align is the base-2 logarithm of the assumed alignment in bytes: 0 for 1 byte, 1 for 2, 2 for 4, 3 for 8, 4 for 16.
  • A value larger than the width of the access is rejected when the module is validated. A smaller one is allowed, and only tells the engine not to assume alignment.
  • Bit 6 (0x40) is not part of the number. When it is set, a u32 memory index follows align, before the offset, and the alignment is what is left after subtracting 64. When it is clear, the instruction uses memory 0.

Addresses: an i32 for a 32-bit memory, an i64 for a 64-bit memory (memory64). The signatures here show the 32-bit case, which is what almost every module uses.

Status

Threads and atomics

Phase 4 (2023)

Widely implemented, but not yet folded into the specification.Engine support

Properties

0xFE 66:u32i64.atomic.rmw.xchg m

Description

64-bit exchange: writes the operand to the address and returns the value that was there.

Read: 8 bytes, Write: 8 bytes

Returns: as i64

Atomic read-modify-write (RMW) operators atomically read a value from an address, modify the value, and store the resulting value to the same address. All RMW operators return the value read from memory before the modify operation was performed.

The RMW operators have two operands, an address and a value used in the modify operation.

Stack

[i32 i64] → [i64]

Immediate operands

  1. m : memarg — u32 align, then u64 offset

Alignment

  • align is the base-2 logarithm of the assumed alignment in bytes: 0 for 1 byte, 1 for 2, 2 for 4, 3 for 8, 4 for 16.
  • A value larger than the width of the access is rejected when the module is validated. A smaller one is allowed, and only tells the engine not to assume alignment.
  • Bit 6 (0x40) is not part of the number. When it is set, a u32 memory index follows align, before the offset, and the alignment is what is left after subtracting 64. When it is clear, the instruction uses memory 0.

Addresses: an i32 for a 32-bit memory, an i64 for a 64-bit memory (memory64). The signatures here show the 32-bit case, which is what almost every module uses.

Status

Threads and atomics

Phase 4 (2023)

Widely implemented, but not yet folded into the specification.Engine support

Properties

0xFE 67:u32i32.atomic.rmw8.xchg_u m

Description

8-bit exchange: writes the operand to the address and returns the value that was there.

Read: 1 byte, Write: 1 byte

Returns: zero-extended i8 to i32

Atomic read-modify-write (RMW) operators atomically read a value from an address, modify the value, and store the resulting value to the same address. All RMW operators return the value read from memory before the modify operation was performed.

The RMW operators have two operands, an address and a value used in the modify operation.

Stack

[i32 i32] → [i32]

Immediate operands

  1. m : memarg — u32 align, then u64 offset

Alignment

  • align is the base-2 logarithm of the assumed alignment in bytes: 0 for 1 byte, 1 for 2, 2 for 4, 3 for 8, 4 for 16.
  • A value larger than the width of the access is rejected when the module is validated. A smaller one is allowed, and only tells the engine not to assume alignment.
  • Bit 6 (0x40) is not part of the number. When it is set, a u32 memory index follows align, before the offset, and the alignment is what is left after subtracting 64. When it is clear, the instruction uses memory 0.

Addresses: an i32 for a 32-bit memory, an i64 for a 64-bit memory (memory64). The signatures here show the 32-bit case, which is what almost every module uses.

Status

Threads and atomics

Phase 4 (2023)

Widely implemented, but not yet folded into the specification.Engine support

Properties

0xFE 68:u32i32.atomic.rmw16.xchg_u m

Description

16-bit exchange: writes the operand to the address and returns the value that was there.

Read: 2 bytes, Write: 2 bytes

Returns: zero-extended i16 to i32

Atomic read-modify-write (RMW) operators atomically read a value from an address, modify the value, and store the resulting value to the same address. All RMW operators return the value read from memory before the modify operation was performed.

The RMW operators have two operands, an address and a value used in the modify operation.

Stack

[i32 i32] → [i32]

Immediate operands

  1. m : memarg — u32 align, then u64 offset

Alignment

  • align is the base-2 logarithm of the assumed alignment in bytes: 0 for 1 byte, 1 for 2, 2 for 4, 3 for 8, 4 for 16.
  • A value larger than the width of the access is rejected when the module is validated. A smaller one is allowed, and only tells the engine not to assume alignment.
  • Bit 6 (0x40) is not part of the number. When it is set, a u32 memory index follows align, before the offset, and the alignment is what is left after subtracting 64. When it is clear, the instruction uses memory 0.

Addresses: an i32 for a 32-bit memory, an i64 for a 64-bit memory (memory64). The signatures here show the 32-bit case, which is what almost every module uses.

Status

Threads and atomics

Phase 4 (2023)

Widely implemented, but not yet folded into the specification.Engine support

Properties

0xFE 69:u32i64.atomic.rmw8.xchg_u m

Description

8-bit exchange: writes the operand to the address and returns the value that was there.

Read: 1 byte, Write: 1 byte

Returns: zero-extended i8 to i64

Atomic read-modify-write (RMW) operators atomically read a value from an address, modify the value, and store the resulting value to the same address. All RMW operators return the value read from memory before the modify operation was performed.

The RMW operators have two operands, an address and a value used in the modify operation.

Stack

[i32 i64] → [i64]

Immediate operands

  1. m : memarg — u32 align, then u64 offset

Alignment

  • align is the base-2 logarithm of the assumed alignment in bytes: 0 for 1 byte, 1 for 2, 2 for 4, 3 for 8, 4 for 16.
  • A value larger than the width of the access is rejected when the module is validated. A smaller one is allowed, and only tells the engine not to assume alignment.
  • Bit 6 (0x40) is not part of the number. When it is set, a u32 memory index follows align, before the offset, and the alignment is what is left after subtracting 64. When it is clear, the instruction uses memory 0.

Addresses: an i32 for a 32-bit memory, an i64 for a 64-bit memory (memory64). The signatures here show the 32-bit case, which is what almost every module uses.

Status

Threads and atomics

Phase 4 (2023)

Widely implemented, but not yet folded into the specification.Engine support

Properties

0xFE 70:u32i64.atomic.rmw16.xchg_u m

Description

16-bit exchange: writes the operand to the address and returns the value that was there.

Read: 2 bytes, Write: 2 bytes

Returns: zero-extended i16 to i64

Atomic read-modify-write (RMW) operators atomically read a value from an address, modify the value, and store the resulting value to the same address. All RMW operators return the value read from memory before the modify operation was performed.

The RMW operators have two operands, an address and a value used in the modify operation.

Stack

[i32 i64] → [i64]

Immediate operands

  1. m : memarg — u32 align, then u64 offset

Alignment

  • align is the base-2 logarithm of the assumed alignment in bytes: 0 for 1 byte, 1 for 2, 2 for 4, 3 for 8, 4 for 16.
  • A value larger than the width of the access is rejected when the module is validated. A smaller one is allowed, and only tells the engine not to assume alignment.
  • Bit 6 (0x40) is not part of the number. When it is set, a u32 memory index follows align, before the offset, and the alignment is what is left after subtracting 64. When it is clear, the instruction uses memory 0.

Addresses: an i32 for a 32-bit memory, an i64 for a 64-bit memory (memory64). The signatures here show the 32-bit case, which is what almost every module uses.

Status

Threads and atomics

Phase 4 (2023)

Widely implemented, but not yet folded into the specification.Engine support

Properties

0xFE 71:u32i64.atomic.rmw32.xchg_u m

Description

32-bit exchange: writes the operand to the address and returns the value that was there.

Read: 4 bytes, Write: 4 bytes

Returns: zero-extended i32 to i64

Atomic read-modify-write (RMW) operators atomically read a value from an address, modify the value, and store the resulting value to the same address. All RMW operators return the value read from memory before the modify operation was performed.

The RMW operators have two operands, an address and a value used in the modify operation.

Stack

[i32 i64] → [i64]

Immediate operands

  1. m : memarg — u32 align, then u64 offset

Alignment

  • align is the base-2 logarithm of the assumed alignment in bytes: 0 for 1 byte, 1 for 2, 2 for 4, 3 for 8, 4 for 16.
  • A value larger than the width of the access is rejected when the module is validated. A smaller one is allowed, and only tells the engine not to assume alignment.
  • Bit 6 (0x40) is not part of the number. When it is set, a u32 memory index follows align, before the offset, and the alignment is what is left after subtracting 64. When it is clear, the instruction uses memory 0.

Addresses: an i32 for a 32-bit memory, an i64 for a 64-bit memory (memory64). The signatures here show the 32-bit case, which is what almost every module uses.

Status

Threads and atomics

Phase 4 (2023)

Widely implemented, but not yet folded into the specification.Engine support

Properties

0xFE 72:u32i32.atomic.rmw.cmpxchg m

Description

Load as loaded: 4 bytes.

Compare expected with loaded: 32-bit compare equal.

Conditionally Store replacement: store 4 bytes.

Return loaded: as i32.

Stack

[i32 i32 i32] → [i32]

Immediate operands

  1. m : memarg — u32 align, then u64 offset

Alignment

  • align is the base-2 logarithm of the assumed alignment in bytes: 0 for 1 byte, 1 for 2, 2 for 4, 3 for 8, 4 for 16.
  • A value larger than the width of the access is rejected when the module is validated. A smaller one is allowed, and only tells the engine not to assume alignment.
  • Bit 6 (0x40) is not part of the number. When it is set, a u32 memory index follows align, before the offset, and the alignment is what is left after subtracting 64. When it is clear, the instruction uses memory 0.

Addresses: an i32 for a 32-bit memory, an i64 for a 64-bit memory (memory64). The signatures here show the 32-bit case, which is what almost every module uses.

Status

Threads and atomics

Phase 4 (2023)

Widely implemented, but not yet folded into the specification.Engine support

Properties

0xFE 73:u32i64.atomic.rmw.cmpxchg m

Description

Load as loaded: 8 bytes.

Compare expected with loaded: 64-bit compare equal.

Conditionally Store replacement: 8 bytes.

Return loaded: as i64.

Stack

[i32 i64 i64] → [i64]

Immediate operands

  1. m : memarg — u32 align, then u64 offset

Alignment

  • align is the base-2 logarithm of the assumed alignment in bytes: 0 for 1 byte, 1 for 2, 2 for 4, 3 for 8, 4 for 16.
  • A value larger than the width of the access is rejected when the module is validated. A smaller one is allowed, and only tells the engine not to assume alignment.
  • Bit 6 (0x40) is not part of the number. When it is set, a u32 memory index follows align, before the offset, and the alignment is what is left after subtracting 64. When it is clear, the instruction uses memory 0.

Addresses: an i32 for a 32-bit memory, an i64 for a 64-bit memory (memory64). The signatures here show the 32-bit case, which is what almost every module uses.

Status

Threads and atomics

Phase 4 (2023)

Widely implemented, but not yet folded into the specification.Engine support

Properties

0xFE 74:u32i32.atomic.rmw8.cmpxchg_u m

Description

Load as loaded: 1 byte.

Compare expected with loaded: `expected` wrapped from i32 to i8, 8-bit compare equal.

Conditionally Store replacement: wrapped from i32 to i8, store 1 byte.

Return loaded: zero-extended from i8 to i32.

Stack

[i32 i32 i32] → [i32]

Immediate operands

  1. m : memarg — u32 align, then u64 offset

Alignment

  • align is the base-2 logarithm of the assumed alignment in bytes: 0 for 1 byte, 1 for 2, 2 for 4, 3 for 8, 4 for 16.
  • A value larger than the width of the access is rejected when the module is validated. A smaller one is allowed, and only tells the engine not to assume alignment.
  • Bit 6 (0x40) is not part of the number. When it is set, a u32 memory index follows align, before the offset, and the alignment is what is left after subtracting 64. When it is clear, the instruction uses memory 0.

Addresses: an i32 for a 32-bit memory, an i64 for a 64-bit memory (memory64). The signatures here show the 32-bit case, which is what almost every module uses.

Status

Threads and atomics

Phase 4 (2023)

Widely implemented, but not yet folded into the specification.Engine support

Properties

0xFE 75:u32i32.atomic.rmw16.cmpxchg_u m

Description

Load as loaded: 2 bytes.

Compare expected with loaded: `expected` wrapped from i32 to i16, 16-bit compare equal.

Conditionally Store replacement: wrapped from i32 to i16, store 2 bytes.

Return loaded: zero-extended from i8 to i32.

Stack

[i32 i32 i32] → [i32]

Immediate operands

  1. m : memarg — u32 align, then u64 offset

Alignment

  • align is the base-2 logarithm of the assumed alignment in bytes: 0 for 1 byte, 1 for 2, 2 for 4, 3 for 8, 4 for 16.
  • A value larger than the width of the access is rejected when the module is validated. A smaller one is allowed, and only tells the engine not to assume alignment.
  • Bit 6 (0x40) is not part of the number. When it is set, a u32 memory index follows align, before the offset, and the alignment is what is left after subtracting 64. When it is clear, the instruction uses memory 0.

Addresses: an i32 for a 32-bit memory, an i64 for a 64-bit memory (memory64). The signatures here show the 32-bit case, which is what almost every module uses.

Status

Threads and atomics

Phase 4 (2023)

Widely implemented, but not yet folded into the specification.Engine support

Properties

0xFE 76:u32i64.atomic.rmw8.cmpxchg_u m

Description

Load as loaded: 1 byte.

Compare expected with loaded: `expected` wrapped from i64 to i8, 8-bit compare equal.

Conditionally Store replacement: wrapped from i64 to i8, store 1 byte.

Return loaded: zero-extended from i8 to i64.

Stack

[i32 i64 i64] → [i64]

Immediate operands

  1. m : memarg — u32 align, then u64 offset

Alignment

  • align is the base-2 logarithm of the assumed alignment in bytes: 0 for 1 byte, 1 for 2, 2 for 4, 3 for 8, 4 for 16.
  • A value larger than the width of the access is rejected when the module is validated. A smaller one is allowed, and only tells the engine not to assume alignment.
  • Bit 6 (0x40) is not part of the number. When it is set, a u32 memory index follows align, before the offset, and the alignment is what is left after subtracting 64. When it is clear, the instruction uses memory 0.

Addresses: an i32 for a 32-bit memory, an i64 for a 64-bit memory (memory64). The signatures here show the 32-bit case, which is what almost every module uses.

Status

Threads and atomics

Phase 4 (2023)

Widely implemented, but not yet folded into the specification.Engine support

Properties

0xFE 77:u32i64.atomic.rmw16.cmpxchg_u m

Description

Load as loaded: 2 bytes.

Compare expected with loaded: `expected` wrapped from i64 to i16, 16-bit compare equal.

Conditionally Store replacement: wrapped from i64 to i16, store 2 bytes.

Return loaded: zero-extended from i16 to i64.

Stack

[i32 i64 i64] → [i64]

Immediate operands

  1. m : memarg — u32 align, then u64 offset

Alignment

  • align is the base-2 logarithm of the assumed alignment in bytes: 0 for 1 byte, 1 for 2, 2 for 4, 3 for 8, 4 for 16.
  • A value larger than the width of the access is rejected when the module is validated. A smaller one is allowed, and only tells the engine not to assume alignment.
  • Bit 6 (0x40) is not part of the number. When it is set, a u32 memory index follows align, before the offset, and the alignment is what is left after subtracting 64. When it is clear, the instruction uses memory 0.

Addresses: an i32 for a 32-bit memory, an i64 for a 64-bit memory (memory64). The signatures here show the 32-bit case, which is what almost every module uses.

Status

Threads and atomics

Phase 4 (2023)

Widely implemented, but not yet folded into the specification.Engine support

Properties

0xFE 78:u32i64.atomic.rmw32.cmpxchg_u m

Description

Load as loaded:4 bytes.

Compare expected with loaded: `expected` wrapped from i64 to i32, 32-bit compare equal.

Conditionally Store replacement: wrapped from i64 to i32, store 4 bytes.

Return loaded: zero-extended from i32 to i64.

Stack

[i32 i64 i64] → [i64]

Immediate operands

  1. m : memarg — u32 align, then u64 offset

Alignment

  • align is the base-2 logarithm of the assumed alignment in bytes: 0 for 1 byte, 1 for 2, 2 for 4, 3 for 8, 4 for 16.
  • A value larger than the width of the access is rejected when the module is validated. A smaller one is allowed, and only tells the engine not to assume alignment.
  • Bit 6 (0x40) is not part of the number. When it is set, a u32 memory index follows align, before the offset, and the alignment is what is left after subtracting 64. When it is clear, the instruction uses memory 0.

Addresses: an i32 for a 32-bit memory, an i64 for a 64-bit memory (memory64). The signatures here show the 32-bit case, which is what almost every module uses.

Status

Threads and atomics

Phase 4 (2023)

Widely implemented, but not yet folded into the specification.Engine support

Properties

0xFE 79:u32global.atomic.get ord x

Description

Atomically reads a shared global.

Stack

[] → [t]

t is the type of global x.

Immediate operands

  1. u8 ord : ordering — 0x00 seqcst, 0x01 acqrel
  2. u32 x : globalidx

Status

Shared-everything threads

Proposal: Phase 1 (2023)

Implemented behind a flag in V8, but still an early proposal. Extends atomics from linear memory to globals, tables and GC objects. Encoding not final.

Encoded across 2 tables:

Properties

0xFE 80:u32global.atomic.set ord x

Description

Atomically writes a shared global.

Stack

[t] → []

t is the type of global x.

Immediate operands

  1. u8 ord : ordering — 0x00 seqcst, 0x01 acqrel
  2. u32 x : globalidx

Status

Shared-everything threads

Proposal: Phase 1 (2023)

Implemented behind a flag in V8, but still an early proposal. Extends atomics from linear memory to globals, tables and GC objects. Encoding not final.

Encoded across 2 tables:

Properties

0xFE 81:u32global.atomic.rmw.add ord x

add

Description

Atomically adds to a shared global, returning the value it held before.

Stack

[t] → [t]

t is the type of global x. Pushes the value the global held before the write.

Immediate operands

  1. u8 ord : ordering — 0x00 seqcst, 0x11 acqrel
  2. u32 x : globalidx

Ordering byte: a read-modify-write packs the read ordering into the low four bits and the write ordering into the high four, and the two must match, so no other byte is valid.

Status

Shared-everything threads

Proposal: Phase 1 (2023)

Implemented behind a flag in V8, but still an early proposal. Extends atomics from linear memory to globals, tables and GC objects. Encoding not final.

Encoded across 2 tables:

Properties

0xFE 82:u32global.atomic.rmw.sub ord x

subtract

Description

Atomically subtracts from a shared global, returning the value it held before.

Stack

[t] → [t]

t is the type of global x. Pushes the value the global held before the write.

Immediate operands

  1. u8 ord : ordering — 0x00 seqcst, 0x11 acqrel
  2. u32 x : globalidx

Ordering byte: a read-modify-write packs the read ordering into the low four bits and the write ordering into the high four, and the two must match, so no other byte is valid.

Status

Shared-everything threads

Proposal: Phase 1 (2023)

Implemented behind a flag in V8, but still an early proposal. Extends atomics from linear memory to globals, tables and GC objects. Encoding not final.

Encoded across 2 tables:

Properties

0xFE 83:u32global.atomic.rmw.and ord x

bitwise and

Description

Atomically bitwise-ands a shared global, returning the value it held before.

Stack

[t] → [t]

t is the type of global x. Pushes the value the global held before the write.

Immediate operands

  1. u8 ord : ordering — 0x00 seqcst, 0x11 acqrel
  2. u32 x : globalidx

Ordering byte: a read-modify-write packs the read ordering into the low four bits and the write ordering into the high four, and the two must match, so no other byte is valid.

Status

Shared-everything threads

Proposal: Phase 1 (2023)

Implemented behind a flag in V8, but still an early proposal. Extends atomics from linear memory to globals, tables and GC objects. Encoding not final.

Encoded across 2 tables:

Properties

0xFE 84:u32global.atomic.rmw.or ord x

bitwise or

Description

Atomically bitwise-ors a shared global, returning the value it held before.

Stack

[t] → [t]

t is the type of global x. Pushes the value the global held before the write.

Immediate operands

  1. u8 ord : ordering — 0x00 seqcst, 0x11 acqrel
  2. u32 x : globalidx

Ordering byte: a read-modify-write packs the read ordering into the low four bits and the write ordering into the high four, and the two must match, so no other byte is valid.

Status

Shared-everything threads

Proposal: Phase 1 (2023)

Implemented behind a flag in V8, but still an early proposal. Extends atomics from linear memory to globals, tables and GC objects. Encoding not final.

Encoded across 2 tables:

Properties

0xFE 85:u32global.atomic.rmw.xor ord x

bitwise exclusive or

Description

Atomically bitwise-xors a shared global, returning the value it held before.

Stack

[t] → [t]

t is the type of global x. Pushes the value the global held before the write.

Immediate operands

  1. u8 ord : ordering — 0x00 seqcst, 0x11 acqrel
  2. u32 x : globalidx

Ordering byte: a read-modify-write packs the read ordering into the low four bits and the write ordering into the high four, and the two must match, so no other byte is valid.

Status

Shared-everything threads

Proposal: Phase 1 (2023)

Implemented behind a flag in V8, but still an early proposal. Extends atomics from linear memory to globals, tables and GC objects. Encoding not final.

Encoded across 2 tables:

Properties

0xFE 86:u32global.atomic.rmw.xchg ord x

Description

Atomically replaces a shared global, returning the value it held before.

Stack

[t] → [t]

t is the type of global x. Pushes the value the global held before the write.

Immediate operands

  1. u8 ord : ordering — 0x00 seqcst, 0x11 acqrel
  2. u32 x : globalidx

Ordering byte: a read-modify-write packs the read ordering into the low four bits and the write ordering into the high four, and the two must match, so no other byte is valid.

Status

Shared-everything threads

Proposal: Phase 1 (2023)

Implemented behind a flag in V8, but still an early proposal. Extends atomics from linear memory to globals, tables and GC objects. Encoding not final.

Encoded across 2 tables:

Properties

0xFE 87:u32global.atomic.rmw.cmpxchg ord x

Description

Atomically replaces a shared global, if it holds an expected value, returning the value it held before.

Stack

[t t] → [t]

t is the type of global x. The expected value, then the replacement; pushes the value the global held before.

Immediate operands

  1. u8 ord : ordering — 0x00 seqcst, 0x11 acqrel
  2. u32 x : globalidx

Ordering byte: a read-modify-write packs the read ordering into the low four bits and the write ordering into the high four, and the two must match, so no other byte is valid.

Status

Shared-everything threads

Proposal: Phase 1 (2023)

Implemented behind a flag in V8, but still an early proposal. Extends atomics from linear memory to globals, tables and GC objects. Encoding not final.

Encoded across 2 tables:

Properties

0xFE 88:u32table.atomic.get ord x

Description

Atomically reads a table element.

Stack

[i32] → [t]

t is the element type of table x.

Immediate operands

  1. u8 ord : ordering — 0x00 seqcst, 0x01 acqrel
  2. u32 x : tableidx

Status

Shared-everything threads

Proposal: Phase 1 (2023)

Implemented behind a flag in V8, but still an early proposal. Extends atomics from linear memory to globals, tables and GC objects. Encoding not final.

Encoded across 2 tables:

Properties

0xFE 89:u32table.atomic.set ord x

Description

Atomically writes a table element.

Stack

[i32 t] → []

t is the element type of table x.

Immediate operands

  1. u8 ord : ordering — 0x00 seqcst, 0x01 acqrel
  2. u32 x : tableidx

Status

Shared-everything threads

Proposal: Phase 1 (2023)

Implemented behind a flag in V8, but still an early proposal. Extends atomics from linear memory to globals, tables and GC objects. Encoding not final.

Encoded across 2 tables:

Properties

0xFE 90:u32table.atomic.rmw.xchg ord x

Description

Atomically replaces a table element, returning the reference it held before.

Stack

[i32 t] → [t]

t is the element type of table x. Pushes the element held before the write.

Immediate operands

  1. u8 ord : ordering — 0x00 seqcst, 0x11 acqrel
  2. u32 x : tableidx

Ordering byte: a read-modify-write packs the read ordering into the low four bits and the write ordering into the high four, and the two must match, so no other byte is valid.

Status

Shared-everything threads

Proposal: Phase 1 (2023)

Implemented behind a flag in V8, but still an early proposal. Extends atomics from linear memory to globals, tables and GC objects. Encoding not final.

Encoded across 2 tables:

Properties

0xFE 91:u32table.atomic.rmw.cmpxchg ord x

Description

Atomically replaces a table element, if it matches an expected reference, returning the reference it held before.

Stack

[i32 t t] → [t]

t is the element type of table x. Index, expected value, then the replacement; pushes the element held before.

Immediate operands

  1. u8 ord : ordering — 0x00 seqcst, 0x11 acqrel
  2. u32 x : tableidx

Ordering byte: a read-modify-write packs the read ordering into the low four bits and the write ordering into the high four, and the two must match, so no other byte is valid.

Status

Shared-everything threads

Proposal: Phase 1 (2023)

Implemented behind a flag in V8, but still an early proposal. Extends atomics from linear memory to globals, tables and GC objects. Encoding not final.

Encoded across 2 tables:

Properties

0xFE 92:u32struct.atomic.get ord x y

Description

Atomically reads a struct field.

Stack

[(ref null x)] → [t]

t is the type of field y of struct type x.

Immediate operands

  1. u8 ord : ordering — 0x00 seqcst, 0x01 acqrel
  2. u32 x : typeidx
  3. u32 y : fieldidx

Status

Shared-everything threads

Proposal: Phase 1 (2023)

Implemented behind a flag in V8, but still an early proposal. Extends atomics from linear memory to globals, tables and GC objects. Encoding not final.

Encoded across 2 tables:

Properties

0xFE 93:u32struct.atomic.get_s ord x y

Description

Atomically reads a packed struct field, sign-extending.

Stack

[(ref null x)] → [i32]

Packed field: it is an i8 or an i16, so it is read into an i32: sign-extended by struct.atomic.get_s, zero-extended by struct.atomic.get_u.

Immediate operands

  1. u8 ord : ordering — 0x00 seqcst, 0x01 acqrel
  2. u32 x : typeidx
  3. u32 y : fieldidx

Status

Shared-everything threads

Proposal: Phase 1 (2023)

Implemented behind a flag in V8, but still an early proposal. Extends atomics from linear memory to globals, tables and GC objects. Encoding not final.

Encoded across 2 tables:

Properties

0xFE 94:u32struct.atomic.get_u ord x y

Description

Atomically reads a packed struct field, zero-extending.

Stack

[(ref null x)] → [i32]

Packed field: it is an i8 or an i16, so it is read into an i32: sign-extended by struct.atomic.get_s, zero-extended by struct.atomic.get_u.

Immediate operands

  1. u8 ord : ordering — 0x00 seqcst, 0x01 acqrel
  2. u32 x : typeidx
  3. u32 y : fieldidx

Status

Shared-everything threads

Proposal: Phase 1 (2023)

Implemented behind a flag in V8, but still an early proposal. Extends atomics from linear memory to globals, tables and GC objects. Encoding not final.

Encoded across 2 tables:

Properties

0xFE 95:u32struct.atomic.set ord x y

Description

Atomically writes a struct field.

Stack

[(ref null x) t] → []

t is the type of field y of struct type x.

Immediate operands

  1. u8 ord : ordering — 0x00 seqcst, 0x01 acqrel
  2. u32 x : typeidx
  3. u32 y : fieldidx

Status

Shared-everything threads

Proposal: Phase 1 (2023)

Implemented behind a flag in V8, but still an early proposal. Extends atomics from linear memory to globals, tables and GC objects. Encoding not final.

Encoded across 2 tables:

Properties

0xFE 96:u32struct.atomic.rmw.add ord x y

add

Description

Atomically adds to a struct field, returning the value it held before.

Stack

[(ref null x) t] → [t]

t is the type of field y of struct type x. Pushes the value the field held before the write.

Immediate operands

  1. u8 ord : ordering — 0x00 seqcst, 0x11 acqrel
  2. u32 x : typeidx
  3. u32 y : fieldidx

Ordering byte: a read-modify-write packs the read ordering into the low four bits and the write ordering into the high four, and the two must match, so no other byte is valid.

Status

Shared-everything threads

Proposal: Phase 1 (2023)

Implemented behind a flag in V8, but still an early proposal. Extends atomics from linear memory to globals, tables and GC objects. Encoding not final.

Encoded across 2 tables:

Properties

0xFE 97:u32struct.atomic.rmw.sub ord x y

subtract

Description

Atomically subtracts from a struct field, returning the value it held before.

Stack

[(ref null x) t] → [t]

t is the type of field y of struct type x. Pushes the value the field held before the write.

Immediate operands

  1. u8 ord : ordering — 0x00 seqcst, 0x11 acqrel
  2. u32 x : typeidx
  3. u32 y : fieldidx

Ordering byte: a read-modify-write packs the read ordering into the low four bits and the write ordering into the high four, and the two must match, so no other byte is valid.

Status

Shared-everything threads

Proposal: Phase 1 (2023)

Implemented behind a flag in V8, but still an early proposal. Extends atomics from linear memory to globals, tables and GC objects. Encoding not final.

Encoded across 2 tables:

Properties

0xFE 98:u32struct.atomic.rmw.and ord x y

bitwise and

Description

Atomically bitwise-ands a struct field, returning the value it held before.

Stack

[(ref null x) t] → [t]

t is the type of field y of struct type x. Pushes the value the field held before the write.

Immediate operands

  1. u8 ord : ordering — 0x00 seqcst, 0x11 acqrel
  2. u32 x : typeidx
  3. u32 y : fieldidx

Ordering byte: a read-modify-write packs the read ordering into the low four bits and the write ordering into the high four, and the two must match, so no other byte is valid.

Status

Shared-everything threads

Proposal: Phase 1 (2023)

Implemented behind a flag in V8, but still an early proposal. Extends atomics from linear memory to globals, tables and GC objects. Encoding not final.

Encoded across 2 tables:

Properties

0xFE 99:u32struct.atomic.rmw.or ord x y

bitwise or

Description

Atomically bitwise-ors a struct field, returning the value it held before.

Stack

[(ref null x) t] → [t]

t is the type of field y of struct type x. Pushes the value the field held before the write.

Immediate operands

  1. u8 ord : ordering — 0x00 seqcst, 0x11 acqrel
  2. u32 x : typeidx
  3. u32 y : fieldidx

Ordering byte: a read-modify-write packs the read ordering into the low four bits and the write ordering into the high four, and the two must match, so no other byte is valid.

Status

Shared-everything threads

Proposal: Phase 1 (2023)

Implemented behind a flag in V8, but still an early proposal. Extends atomics from linear memory to globals, tables and GC objects. Encoding not final.

Encoded across 2 tables:

Properties

0xFE 100:u32struct.atomic.rmw.xor ord x y

bitwise exclusive or

Description

Atomically bitwise-xors a struct field, returning the value it held before.

Stack

[(ref null x) t] → [t]

t is the type of field y of struct type x. Pushes the value the field held before the write.

Immediate operands

  1. u8 ord : ordering — 0x00 seqcst, 0x11 acqrel
  2. u32 x : typeidx
  3. u32 y : fieldidx

Ordering byte: a read-modify-write packs the read ordering into the low four bits and the write ordering into the high four, and the two must match, so no other byte is valid.

Status

Shared-everything threads

Proposal: Phase 1 (2023)

Implemented behind a flag in V8, but still an early proposal. Extends atomics from linear memory to globals, tables and GC objects. Encoding not final.

Encoded across 2 tables:

Properties

0xFE 101:u32struct.atomic.rmw.xchg ord x y

Description

Atomically replaces a struct field, returning the value it held before.

Stack

[(ref null x) t] → [t]

t is the type of field y of struct type x. Pushes the value the field held before the write.

Immediate operands

  1. u8 ord : ordering — 0x00 seqcst, 0x11 acqrel
  2. u32 x : typeidx
  3. u32 y : fieldidx

Ordering byte: a read-modify-write packs the read ordering into the low four bits and the write ordering into the high four, and the two must match, so no other byte is valid.

Status

Shared-everything threads

Proposal: Phase 1 (2023)

Implemented behind a flag in V8, but still an early proposal. Extends atomics from linear memory to globals, tables and GC objects. Encoding not final.

Encoded across 2 tables:

Properties

0xFE 102:u32struct.atomic.rmw.cmpxchg ord x y

Description

Atomically replaces a struct field, if it holds an expected value, returning the value it held before.

Stack

[(ref null x) t t] → [t]

t is the type of field y of struct type x. The expected value, then the replacement; pushes the value the field held before.

Immediate operands

  1. u8 ord : ordering — 0x00 seqcst, 0x11 acqrel
  2. u32 x : typeidx
  3. u32 y : fieldidx

Ordering byte: a read-modify-write packs the read ordering into the low four bits and the write ordering into the high four, and the two must match, so no other byte is valid.

Status

Shared-everything threads

Proposal: Phase 1 (2023)

Implemented behind a flag in V8, but still an early proposal. Extends atomics from linear memory to globals, tables and GC objects. Encoding not final.

Encoded across 2 tables:

Properties

0xFE 103:u32array.atomic.get ord x

Description

Atomically reads an array element.

Stack

[(ref null x) i32] → [t]

t is the element type of array type x.

Immediate operands

  1. u8 ord : ordering — 0x00 seqcst, 0x01 acqrel
  2. u32 x : typeidx

Status

Shared-everything threads

Proposal: Phase 1 (2023)

Implemented behind a flag in V8, but still an early proposal. Extends atomics from linear memory to globals, tables and GC objects. Encoding not final.

Encoded across 2 tables:

Properties

0xFE 104:u32array.atomic.get_s ord x

Description

Atomically reads a packed array element, sign-extending.

Stack

[(ref null x) i32] → [i32]

Packed field: it is an i8 or an i16, so it is read into an i32: sign-extended by array.atomic.get_s, zero-extended by array.atomic.get_u.

Immediate operands

  1. u8 ord : ordering — 0x00 seqcst, 0x01 acqrel
  2. u32 x : typeidx

Status

Shared-everything threads

Proposal: Phase 1 (2023)

Implemented behind a flag in V8, but still an early proposal. Extends atomics from linear memory to globals, tables and GC objects. Encoding not final.

Encoded across 2 tables:

Properties

0xFE 105:u32array.atomic.get_u ord x

Description

Atomically reads a packed array element, zero-extending.

Stack

[(ref null x) i32] → [i32]

Packed field: it is an i8 or an i16, so it is read into an i32: sign-extended by array.atomic.get_s, zero-extended by array.atomic.get_u.

Immediate operands

  1. u8 ord : ordering — 0x00 seqcst, 0x01 acqrel
  2. u32 x : typeidx

Status

Shared-everything threads

Proposal: Phase 1 (2023)

Implemented behind a flag in V8, but still an early proposal. Extends atomics from linear memory to globals, tables and GC objects. Encoding not final.

Encoded across 2 tables:

Properties

0xFE 106:u32array.atomic.set ord x

Description

Atomically writes an array element.

Stack

[(ref null x) i32 t] → []

t is the element type of array type x.

Immediate operands

  1. u8 ord : ordering — 0x00 seqcst, 0x01 acqrel
  2. u32 x : typeidx

Status

Shared-everything threads

Proposal: Phase 1 (2023)

Implemented behind a flag in V8, but still an early proposal. Extends atomics from linear memory to globals, tables and GC objects. Encoding not final.

Encoded across 2 tables:

Properties

0xFE 107:u32array.atomic.rmw.add ord x

add

Description

Atomically adds to an array element, returning the value it held before.

Stack

[(ref null x) i32 t] → [t]

t is the element type of array type x. Pushes the element held before the write.

Immediate operands

  1. u8 ord : ordering — 0x00 seqcst, 0x11 acqrel
  2. u32 x : typeidx

Ordering byte: a read-modify-write packs the read ordering into the low four bits and the write ordering into the high four, and the two must match, so no other byte is valid.

Status

Shared-everything threads

Proposal: Phase 1 (2023)

Implemented behind a flag in V8, but still an early proposal. Extends atomics from linear memory to globals, tables and GC objects. Encoding not final.

Encoded across 2 tables:

Properties

0xFE 108:u32array.atomic.rmw.sub ord x

subtract

Description

Atomically subtracts from an array element, returning the value it held before.

Stack

[(ref null x) i32 t] → [t]

t is the element type of array type x. Pushes the element held before the write.

Immediate operands

  1. u8 ord : ordering — 0x00 seqcst, 0x11 acqrel
  2. u32 x : typeidx

Ordering byte: a read-modify-write packs the read ordering into the low four bits and the write ordering into the high four, and the two must match, so no other byte is valid.

Status

Shared-everything threads

Proposal: Phase 1 (2023)

Implemented behind a flag in V8, but still an early proposal. Extends atomics from linear memory to globals, tables and GC objects. Encoding not final.

Encoded across 2 tables:

Properties

0xFE 109:u32array.atomic.rmw.and ord x

bitwise and

Description

Atomically bitwise-ands an array element, returning the value it held before.

Stack

[(ref null x) i32 t] → [t]

t is the element type of array type x. Pushes the element held before the write.

Immediate operands

  1. u8 ord : ordering — 0x00 seqcst, 0x11 acqrel
  2. u32 x : typeidx

Ordering byte: a read-modify-write packs the read ordering into the low four bits and the write ordering into the high four, and the two must match, so no other byte is valid.

Status

Shared-everything threads

Proposal: Phase 1 (2023)

Implemented behind a flag in V8, but still an early proposal. Extends atomics from linear memory to globals, tables and GC objects. Encoding not final.

Encoded across 2 tables:

Properties

0xFE 110:u32array.atomic.rmw.or ord x

bitwise or

Description

Atomically bitwise-ors an array element, returning the value it held before.

Stack

[(ref null x) i32 t] → [t]

t is the element type of array type x. Pushes the element held before the write.

Immediate operands

  1. u8 ord : ordering — 0x00 seqcst, 0x11 acqrel
  2. u32 x : typeidx

Ordering byte: a read-modify-write packs the read ordering into the low four bits and the write ordering into the high four, and the two must match, so no other byte is valid.

Status

Shared-everything threads

Proposal: Phase 1 (2023)

Implemented behind a flag in V8, but still an early proposal. Extends atomics from linear memory to globals, tables and GC objects. Encoding not final.

Encoded across 2 tables:

Properties

0xFE 111:u32array.atomic.rmw.xor ord x

bitwise exclusive or

Description

Atomically bitwise-xors an array element, returning the value it held before.

Stack

[(ref null x) i32 t] → [t]

t is the element type of array type x. Pushes the element held before the write.

Immediate operands

  1. u8 ord : ordering — 0x00 seqcst, 0x11 acqrel
  2. u32 x : typeidx

Ordering byte: a read-modify-write packs the read ordering into the low four bits and the write ordering into the high four, and the two must match, so no other byte is valid.

Status

Shared-everything threads

Proposal: Phase 1 (2023)

Implemented behind a flag in V8, but still an early proposal. Extends atomics from linear memory to globals, tables and GC objects. Encoding not final.

Encoded across 2 tables:

Properties

0xFE 112:u32array.atomic.rmw.xchg ord x

Description

Atomically replaces an array element, returning the value it held before.

Stack

[(ref null x) i32 t] → [t]

t is the element type of array type x. Pushes the element held before the write.

Immediate operands

  1. u8 ord : ordering — 0x00 seqcst, 0x11 acqrel
  2. u32 x : typeidx

Ordering byte: a read-modify-write packs the read ordering into the low four bits and the write ordering into the high four, and the two must match, so no other byte is valid.

Status

Shared-everything threads

Proposal: Phase 1 (2023)

Implemented behind a flag in V8, but still an early proposal. Extends atomics from linear memory to globals, tables and GC objects. Encoding not final.

Encoded across 2 tables:

Properties

0xFE 113:u32array.atomic.rmw.cmpxchg ord x

Description

Atomically replaces an array element, if it holds an expected value, returning the value it held before.

Stack

[(ref null x) i32 t t] → [t]

t is the element type of array type x. Index, expected value, then the replacement; pushes the element held before.

Immediate operands

  1. u8 ord : ordering — 0x00 seqcst, 0x11 acqrel
  2. u32 x : typeidx

Ordering byte: a read-modify-write packs the read ordering into the low four bits and the write ordering into the high four, and the two must match, so no other byte is valid.

Status

Shared-everything threads

Proposal: Phase 1 (2023)

Implemented behind a flag in V8, but still an early proposal. Extends atomics from linear memory to globals, tables and GC objects. Encoding not final.

Encoded across 2 tables:

Properties

About this chart

WebAssembly is an open, industry-wide effort to bring a safe, efficient assembly language to the web. WebAssembly technology is developed collaboratively by major browser vendors including Mozilla, Google, Microsoft, and Apple. WebAssembly modules can be downloaded and executed by the majority of browsers in use today.

Gaps in the byte code ranges for encoding instructions are reserved for future extensions.

Instruction data reviewed July 2026. WebAssembly is still gaining instructions; check the specification if this page is older than you are comfortable with.