╭ wasm.zig ─────────────────────────────────────────────────────╮ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ╰───────────────────────────────────────────────────────────────╯
╭ find file ─ ─ ─ ─ ─ ─ ─ ─ ─ ─╮ ╭────╮ ╭ clone ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ╮ │ │ │http│ ssh │ │ ╰ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─╯ ╰────╯ ╰ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ╯
1 ///! Contains all constants and types representing the wasm 2 ///! binary format, as specified by: 3 ///! https://webassembly.github.io/spec/core/ 4 const std = @import("std.zig"); 5 const testing = std.testing; 6 7 /// Wasm instruction opcodes 8 /// 9 /// All instructions are defined as per spec: 10 /// https://webassembly.github.io/spec/core/appendix/index-instructions.html 11 pub const Opcode = enum(u8) { 12 @"unreachable" = 0x00, 13 nop = 0x01, 14 block = 0x02, 15 loop = 0x03, 16 @"if" = 0x04, 17 @"else" = 0x05, 18 end = 0x0B, 19 br = 0x0C, 20 br_if = 0x0D, 21 br_table = 0x0E, 22 @"return" = 0x0F, 23 call = 0x10, 24 call_indirect = 0x11, 25 drop = 0x1A, 26 select = 0x1B, 27 local_get = 0x20, 28 local_set = 0x21, 29 local_tee = 0x22, 30 global_get = 0x23, 31 global_set = 0x24, 32 i32_load = 0x28, 33 i64_load = 0x29, 34 f32_load = 0x2A, 35 f64_load = 0x2B, 36 i32_load8_s = 0x2C, 37 i32_load8_u = 0x2D, 38 i32_load16_s = 0x2E, 39 i32_load16_u = 0x2F, 40 i64_load8_s = 0x30, 41 i64_load8_u = 0x31, 42 i64_load16_s = 0x32, 43 i64_load16_u = 0x33, 44 i64_load32_s = 0x34, 45 i64_load32_u = 0x35, 46 i32_store = 0x36, 47 i64_store = 0x37, 48 f32_store = 0x38, 49 f64_store = 0x39, 50 i32_store8 = 0x3A, 51 i32_store16 = 0x3B, 52 i64_store8 = 0x3C, 53 i64_store16 = 0x3D, 54 i64_store32 = 0x3E, 55 memory_size = 0x3F, 56 memory_grow = 0x40, 57 i32_const = 0x41, 58 i64_const = 0x42, 59 f32_const = 0x43, 60 f64_const = 0x44, 61 i32_eqz = 0x45, 62 i32_eq = 0x46, 63 i32_ne = 0x47, 64 i32_lt_s = 0x48, 65 i32_lt_u = 0x49, 66 i32_gt_s = 0x4A, 67 i32_gt_u = 0x4B, 68 i32_le_s = 0x4C, 69 i32_le_u = 0x4D, 70 i32_ge_s = 0x4E, 71 i32_ge_u = 0x4F, 72 i64_eqz = 0x50, 73 i64_eq = 0x51, 74 i64_ne = 0x52, 75 i64_lt_s = 0x53, 76 i64_lt_u = 0x54, 77 i64_gt_s = 0x55, 78 i64_gt_u = 0x56, 79 i64_le_s = 0x57, 80 i64_le_u = 0x58, 81 i64_ge_s = 0x59, 82 i64_ge_u = 0x5A, 83 f32_eq = 0x5B, 84 f32_ne = 0x5C, 85 f32_lt = 0x5D, 86 f32_gt = 0x5E, 87 f32_le = 0x5F, 88 f32_ge = 0x60, 89 f64_eq = 0x61, 90 f64_ne = 0x62, 91 f64_lt = 0x63, 92 f64_gt = 0x64, 93 f64_le = 0x65, 94 f64_ge = 0x66, 95 i32_clz = 0x67, 96 i32_ctz = 0x68, 97 i32_popcnt = 0x69, 98 i32_add = 0x6A, 99 i32_sub = 0x6B, 100 i32_mul = 0x6C, 101 i32_div_s = 0x6D, 102 i32_div_u = 0x6E, 103 i32_rem_s = 0x6F, 104 i32_rem_u = 0x70, 105 i32_and = 0x71, 106 i32_or = 0x72, 107 i32_xor = 0x73, 108 i32_shl = 0x74, 109 i32_shr_s = 0x75, 110 i32_shr_u = 0x76, 111 i32_rotl = 0x77, 112 i32_rotr = 0x78, 113 i64_clz = 0x79, 114 i64_ctz = 0x7A, 115 i64_popcnt = 0x7B, 116 i64_add = 0x7C, 117 i64_sub = 0x7D, 118 i64_mul = 0x7E, 119 i64_div_s = 0x7F, 120 i64_div_u = 0x80, 121 i64_rem_s = 0x81, 122 i64_rem_u = 0x82, 123 i64_and = 0x83, 124 i64_or = 0x84, 125 i64_xor = 0x85, 126 i64_shl = 0x86, 127 i64_shr_s = 0x87, 128 i64_shr_u = 0x88, 129 i64_rotl = 0x89, 130 i64_rotr = 0x8A, 131 f32_abs = 0x8B, 132 f32_neg = 0x8C, 133 f32_ceil = 0x8D, 134 f32_floor = 0x8E, 135 f32_trunc = 0x8F, 136 f32_nearest = 0x90, 137 f32_sqrt = 0x91, 138 f32_add = 0x92, 139 f32_sub = 0x93, 140 f32_mul = 0x94, 141 f32_div = 0x95, 142 f32_min = 0x96, 143 f32_max = 0x97, 144 f32_copysign = 0x98, 145 f64_abs = 0x99, 146 f64_neg = 0x9A, 147 f64_ceil = 0x9B, 148 f64_floor = 0x9C, 149 f64_trunc = 0x9D, 150 f64_nearest = 0x9E, 151 f64_sqrt = 0x9F, 152 f64_add = 0xA0, 153 f64_sub = 0xA1, 154 f64_mul = 0xA2, 155 f64_div = 0xA3, 156 f64_min = 0xA4, 157 f64_max = 0xA5, 158 f64_copysign = 0xA6, 159 i32_wrap_i64 = 0xA7, 160 i32_trunc_f32_s = 0xA8, 161 i32_trunc_f32_u = 0xA9, 162 i32_trunc_f64_s = 0xAA, 163 i32_trunc_f64_u = 0xAB, 164 i64_extend_i32_s = 0xAC, 165 i64_extend_i32_u = 0xAD, 166 i64_trunc_f32_s = 0xAE, 167 i64_trunc_f32_u = 0xAF, 168 i64_trunc_f64_s = 0xB0, 169 i64_trunc_f64_u = 0xB1, 170 f32_convert_i32_s = 0xB2, 171 f32_convert_i32_u = 0xB3, 172 f32_convert_i64_s = 0xB4, 173 f32_convert_i64_u = 0xB5, 174 f32_demote_f64 = 0xB6, 175 f64_convert_i32_s = 0xB7, 176 f64_convert_i32_u = 0xB8, 177 f64_convert_i64_s = 0xB9, 178 f64_convert_i64_u = 0xBA, 179 f64_promote_f32 = 0xBB, 180 i32_reinterpret_f32 = 0xBC, 181 i64_reinterpret_f64 = 0xBD, 182 f32_reinterpret_i32 = 0xBE, 183 f64_reinterpret_i64 = 0xBF, 184 i32_extend8_s = 0xC0, 185 i32_extend16_s = 0xC1, 186 i64_extend8_s = 0xC2, 187 i64_extend16_s = 0xC3, 188 i64_extend32_s = 0xC4, 189 190 misc_prefix = 0xFC, 191 simd_prefix = 0xFD, 192 atomics_prefix = 0xFE, 193 _, 194 }; 195 196 /// Opcodes that require a prefix `0xFC`. 197 /// Each opcode represents a varuint32, meaning 198 /// they are encoded as leb128 in binary. 199 pub const MiscOpcode = enum(u32) { 200 i32_trunc_sat_f32_s = 0x00, 201 i32_trunc_sat_f32_u = 0x01, 202 i32_trunc_sat_f64_s = 0x02, 203 i32_trunc_sat_f64_u = 0x03, 204 i64_trunc_sat_f32_s = 0x04, 205 i64_trunc_sat_f32_u = 0x05, 206 i64_trunc_sat_f64_s = 0x06, 207 i64_trunc_sat_f64_u = 0x07, 208 memory_init = 0x08, 209 data_drop = 0x09, 210 memory_copy = 0x0A, 211 memory_fill = 0x0B, 212 table_init = 0x0C, 213 elem_drop = 0x0D, 214 table_copy = 0x0E, 215 table_grow = 0x0F, 216 table_size = 0x10, 217 table_fill = 0x11, 218 _, 219 }; 220 221 /// Simd opcodes that require a prefix `0xFD`. 222 /// Each opcode represents a varuint32, meaning 223 /// they are encoded as leb128 in binary. 224 pub const SimdOpcode = enum(u32) { 225 v128_load = 0x00, 226 v128_load8x8_s = 0x01, 227 v128_load8x8_u = 0x02, 228 v128_load16x4_s = 0x03, 229 v128_load16x4_u = 0x04, 230 v128_load32x2_s = 0x05, 231 v128_load32x2_u = 0x06, 232 v128_load8_splat = 0x07, 233 v128_load16_splat = 0x08, 234 v128_load32_splat = 0x09, 235 v128_load64_splat = 0x0A, 236 v128_store = 0x0B, 237 v128_const = 0x0C, 238 i8x16_shuffle = 0x0D, 239 i8x16_swizzle = 0x0E, 240 i8x16_splat = 0x0F, 241 i16x8_splat = 0x10, 242 i32x4_splat = 0x11, 243 i64x2_splat = 0x12, 244 f32x4_splat = 0x13, 245 f64x2_splat = 0x14, 246 i8x16_extract_lane_s = 0x15, 247 i8x16_extract_lane_u = 0x16, 248 i8x16_replace_lane = 0x17, 249 i16x8_extract_lane_s = 0x18, 250 i16x8_extract_lane_u = 0x19, 251 i16x8_replace_lane = 0x1A, 252 i32x4_extract_lane = 0x1B, 253 i32x4_replace_lane = 0x1C, 254 i64x2_extract_lane = 0x1D, 255 i64x2_replace_lane = 0x1E, 256 f32x4_extract_lane = 0x1F, 257 f32x4_replace_lane = 0x20, 258 f64x2_extract_lane = 0x21, 259 f64x2_replace_lane = 0x22, 260 i8x16_eq = 0x23, 261 i16x8_eq = 0x2D, 262 i32x4_eq = 0x37, 263 i8x16_ne = 0x24, 264 i16x8_ne = 0x2E, 265 i32x4_ne = 0x38, 266 i8x16_lt_s = 0x25, 267 i16x8_lt_s = 0x2F, 268 i32x4_lt_s = 0x39, 269 i8x16_lt_u = 0x26, 270 i16x8_lt_u = 0x30, 271 i32x4_lt_u = 0x3A, 272 i8x16_gt_s = 0x27, 273 i16x8_gt_s = 0x31, 274 i32x4_gt_s = 0x3B, 275 i8x16_gt_u = 0x28, 276 i16x8_gt_u = 0x32, 277 i32x4_gt_u = 0x3C, 278 i8x16_le_s = 0x29, 279 i16x8_le_s = 0x33, 280 i32x4_le_s = 0x3D, 281 i8x16_le_u = 0x2A, 282 i16x8_le_u = 0x34, 283 i32x4_le_u = 0x3E, 284 i8x16_ge_s = 0x2B, 285 i16x8_ge_s = 0x35, 286 i32x4_ge_s = 0x3F, 287 i8x16_ge_u = 0x2C, 288 i16x8_ge_u = 0x36, 289 i32x4_ge_u = 0x40, 290 f32x4_eq = 0x41, 291 f64x2_eq = 0x47, 292 f32x4_ne = 0x42, 293 f64x2_ne = 0x48, 294 f32x4_lt = 0x43, 295 f64x2_lt = 0x49, 296 f32x4_gt = 0x44, 297 f64x2_gt = 0x4A, 298 f32x4_le = 0x45, 299 f64x2_le = 0x4B, 300 f32x4_ge = 0x46, 301 f64x2_ge = 0x4C, 302 v128_not = 0x4D, 303 v128_and = 0x4E, 304 v128_andnot = 0x4F, 305 v128_or = 0x50, 306 v128_xor = 0x51, 307 v128_bitselect = 0x52, 308 v128_any_true = 0x53, 309 v128_load8_lane = 0x54, 310 v128_load16_lane = 0x55, 311 v128_load32_lane = 0x56, 312 v128_load64_lane = 0x57, 313 v128_store8_lane = 0x58, 314 v128_store16_lane = 0x59, 315 v128_store32_lane = 0x5A, 316 v128_store64_lane = 0x5B, 317 v128_load32_zero = 0x5C, 318 v128_load64_zero = 0x5D, 319 f32x4_demote_f64x2_zero = 0x5E, 320 f64x2_promote_low_f32x4 = 0x5F, 321 i8x16_abs = 0x60, 322 i16x8_abs = 0x80, 323 i32x4_abs = 0xA0, 324 i64x2_abs = 0xC0, 325 i8x16_neg = 0x61, 326 i16x8_neg = 0x81, 327 i32x4_neg = 0xA1, 328 i64x2_neg = 0xC1, 329 i8x16_popcnt = 0x62, 330 i16x8_q15mulr_sat_s = 0x82, 331 i8x16_all_true = 0x63, 332 i16x8_all_true = 0x83, 333 i32x4_all_true = 0xA3, 334 i64x2_all_true = 0xC3, 335 i8x16_bitmask = 0x64, 336 i16x8_bitmask = 0x84, 337 i32x4_bitmask = 0xA4, 338 i64x2_bitmask = 0xC4, 339 i8x16_narrow_i16x8_s = 0x65, 340 i16x8_narrow_i32x4_s = 0x85, 341 i8x16_narrow_i16x8_u = 0x66, 342 i16x8_narrow_i32x4_u = 0x86, 343 f32x4_ceil = 0x67, 344 i16x8_extend_low_i8x16_s = 0x87, 345 i32x4_extend_low_i16x8_s = 0xA7, 346 i64x2_extend_low_i32x4_s = 0xC7, 347 f32x4_floor = 0x68, 348 i16x8_extend_high_i8x16_s = 0x88, 349 i32x4_extend_high_i16x8_s = 0xA8, 350 i64x2_extend_high_i32x4_s = 0xC8, 351 f32x4_trunc = 0x69, 352 i16x8_extend_low_i8x16_u = 0x89, 353 i32x4_extend_low_i16x8_u = 0xA9, 354 i64x2_extend_low_i32x4_u = 0xC9, 355 f32x4_nearest = 0x6A, 356 i16x8_extend_high_i8x16_u = 0x8A, 357 i32x4_extend_high_i16x8_u = 0xAA, 358 i64x2_extend_high_i32x4_u = 0xCA, 359 i8x16_shl = 0x6B, 360 i16x8_shl = 0x8B, 361 i32x4_shl = 0xAB, 362 i64x2_shl = 0xCB, 363 i8x16_shr_s = 0x6C, 364 i16x8_shr_s = 0x8C, 365 i32x4_shr_s = 0xAC, 366 i64x2_shr_s = 0xCC, 367 i8x16_shr_u = 0x6D, 368 i16x8_shr_u = 0x8D, 369 i32x4_shr_u = 0xAD, 370 i64x2_shr_u = 0xCD, 371 i8x16_add = 0x6E, 372 i16x8_add = 0x8E, 373 i32x4_add = 0xAE, 374 i64x2_add = 0xCE, 375 i8x16_add_sat_s = 0x6F, 376 i16x8_add_sat_s = 0x8F, 377 i8x16_add_sat_u = 0x70, 378 i16x8_add_sat_u = 0x90, 379 i8x16_sub = 0x71, 380 i16x8_sub = 0x91, 381 i32x4_sub = 0xB1, 382 i64x2_sub = 0xD1, 383 i8x16_sub_sat_s = 0x72, 384 i16x8_sub_sat_s = 0x92, 385 i8x16_sub_sat_u = 0x73, 386 i16x8_sub_sat_u = 0x93, 387 f64x2_ceil = 0x74, 388 f64x2_nearest = 0x94, 389 f64x2_floor = 0x75, 390 i16x8_mul = 0x95, 391 i32x4_mul = 0xB5, 392 i64x2_mul = 0xD5, 393 i8x16_min_s = 0x76, 394 i16x8_min_s = 0x96, 395 i32x4_min_s = 0xB6, 396 i64x2_eq = 0xD6, 397 i8x16_min_u = 0x77, 398 i16x8_min_u = 0x97, 399 i32x4_min_u = 0xB7, 400 i64x2_ne = 0xD7, 401 i8x16_max_s = 0x78, 402 i16x8_max_s = 0x98, 403 i32x4_max_s = 0xB8, 404 i64x2_lt_s = 0xD8, 405 i8x16_max_u = 0x79, 406 i16x8_max_u = 0x99, 407 i32x4_max_u = 0xB9, 408 i64x2_gt_s = 0xD9, 409 f64x2_trunc = 0x7A, 410 i32x4_dot_i16x8_s = 0xBA, 411 i64x2_le_s = 0xDA, 412 i8x16_avgr_u = 0x7B, 413 i16x8_avgr_u = 0x9B, 414 i64x2_ge_s = 0xDB, 415 i16x8_extadd_pairwise_i8x16_s = 0x7C, 416 i16x8_extmul_low_i8x16_s = 0x9C, 417 i32x4_extmul_low_i16x8_s = 0xBC, 418 i64x2_extmul_low_i32x4_s = 0xDC, 419 i16x8_extadd_pairwise_i8x16_u = 0x7D, 420 i16x8_extmul_high_i8x16_s = 0x9D, 421 i32x4_extmul_high_i16x8_s = 0xBD, 422 i64x2_extmul_high_i32x4_s = 0xDD, 423 i32x4_extadd_pairwise_i16x8_s = 0x7E, 424 i16x8_extmul_low_i8x16_u = 0x9E, 425 i32x4_extmul_low_i16x8_u = 0xBE, 426 i64x2_extmul_low_i32x4_u = 0xDE, 427 i32x4_extadd_pairwise_i16x8_u = 0x7F, 428 i16x8_extmul_high_i8x16_u = 0x9F, 429 i32x4_extmul_high_i16x8_u = 0xBF, 430 i64x2_extmul_high_i32x4_u = 0xDF, 431 f32x4_abs = 0xE0, 432 f64x2_abs = 0xEC, 433 f32x4_neg = 0xE1, 434 f64x2_neg = 0xED, 435 f32x4_sqrt = 0xE3, 436 f64x2_sqrt = 0xEF, 437 f32x4_add = 0xE4, 438 f64x2_add = 0xF0, 439 f32x4_sub = 0xE5, 440 f64x2_sub = 0xF1, 441 f32x4_mul = 0xE6, 442 f64x2_mul = 0xF2, 443 f32x4_div = 0xE7, 444 f64x2_div = 0xF3, 445 f32x4_min = 0xE8, 446 f64x2_min = 0xF4, 447 f32x4_max = 0xE9, 448 f64x2_max = 0xF5, 449 f32x4_pmin = 0xEA, 450 f64x2_pmin = 0xF6, 451 f32x4_pmax = 0xEB, 452 f64x2_pmax = 0xF7, 453 i32x4_trunc_sat_f32x4_s = 0xF8, 454 i32x4_trunc_sat_f32x4_u = 0xF9, 455 f32x4_convert_i32x4_s = 0xFA, 456 f32x4_convert_i32x4_u = 0xFB, 457 i32x4_trunc_sat_f64x2_s_zero = 0xFC, 458 i32x4_trunc_sat_f64x2_u_zero = 0xFD, 459 f64x2_convert_low_i32x4_s = 0xFE, 460 f64x2_convert_low_i32x4_u = 0xFF, 461 462 // relaxed-simd opcodes 463 i8x16_relaxed_swizzle = 0x100, 464 i32x4_relaxed_trunc_f32x4_s = 0x101, 465 i32x4_relaxed_trunc_f32x4_u = 0x102, 466 i32x4_relaxed_trunc_f64x2_s_zero = 0x103, 467 i32x4_relaxed_trunc_f64x2_u_zero = 0x104, 468 f32x4_relaxed_madd = 0x105, 469 f32x4_relaxed_nmadd = 0x106, 470 f64x2_relaxed_madd = 0x107, 471 f64x2_relaxed_nmadd = 0x108, 472 i8x16_relaxed_laneselect = 0x109, 473 i16x8_relaxed_laneselect = 0x10a, 474 i32x4_relaxed_laneselect = 0x10b, 475 i64x2_relaxed_laneselect = 0x10c, 476 f32x4_relaxed_min = 0x10d, 477 f32x4_relaxed_max = 0x10e, 478 f64x2_relaxed_min = 0x10f, 479 f64x2_relaxed_max = 0x110, 480 i16x8_relaxed_q15mulr_s = 0x111, 481 i16x8_relaxed_dot_i8x16_i7x16_s = 0x112, 482 i32x4_relaxed_dot_i8x16_i7x16_add_s = 0x113, 483 f32x4_relaxed_dot_bf16x8_add_f32x4 = 0x114, 484 }; 485 486 /// Atomic opcodes that require a prefix `0xFE`. 487 /// Each opcode represents a varuint32, meaning 488 /// they are encoded as leb128 in binary. 489 pub const AtomicsOpcode = enum(u32) { 490 memory_atomic_notify = 0x00, 491 memory_atomic_wait32 = 0x01, 492 memory_atomic_wait64 = 0x02, 493 atomic_fence = 0x03, 494 i32_atomic_load = 0x10, 495 i64_atomic_load = 0x11, 496 i32_atomic_load8_u = 0x12, 497 i32_atomic_load16_u = 0x13, 498 i64_atomic_load8_u = 0x14, 499 i64_atomic_load16_u = 0x15, 500 i64_atomic_load32_u = 0x16, 501 i32_atomic_store = 0x17, 502 i64_atomic_store = 0x18, 503 i32_atomic_store8 = 0x19, 504 i32_atomic_store16 = 0x1A, 505 i64_atomic_store8 = 0x1B, 506 i64_atomic_store16 = 0x1C, 507 i64_atomic_store32 = 0x1D, 508 i32_atomic_rmw_add = 0x1E, 509 i64_atomic_rmw_add = 0x1F, 510 i32_atomic_rmw8_add_u = 0x20, 511 i32_atomic_rmw16_add_u = 0x21, 512 i64_atomic_rmw8_add_u = 0x22, 513 i64_atomic_rmw16_add_u = 0x23, 514 i64_atomic_rmw32_add_u = 0x24, 515 i32_atomic_rmw_sub = 0x25, 516 i64_atomic_rmw_sub = 0x26, 517 i32_atomic_rmw8_sub_u = 0x27A, 518 i32_atomic_rmw16_sub_u = 0x28A, 519 i64_atomic_rmw8_sub_u = 0x29A, 520 i64_atomic_rmw16_sub_u = 0x2A, 521 i64_atomic_rmw32_sub_u = 0x2B, 522 i32_atomic_rmw_and = 0x2C, 523 i64_atomic_rmw_and = 0x2D, 524 i32_atomic_rmw8_and_u = 0x2E, 525 i32_atomic_rmw16_and_u = 0x2F, 526 i64_atomic_rmw8_and_u = 0x30, 527 i64_atomic_rmw16_and_u = 0x31, 528 i64_atomic_rmw32_and_u = 0x32, 529 i32_atomic_rmw_or = 0x33, 530 i64_atomic_rmw_or = 0x34, 531 i32_atomic_rmw8_or_u = 0x35, 532 i32_atomic_rmw16_or_u = 0x36, 533 i64_atomic_rmw8_or_u = 0x37, 534 i64_atomic_rmw16_or_u = 0x38, 535 i64_atomic_rmw32_or_u = 0x39, 536 i32_atomic_rmw_xor = 0x3A, 537 i64_atomic_rmw_xor = 0x3B, 538 i32_atomic_rmw8_xor_u = 0x3C, 539 i32_atomic_rmw16_xor_u = 0x3D, 540 i64_atomic_rmw8_xor_u = 0x3E, 541 i64_atomic_rmw16_xor_u = 0x3F, 542 i64_atomic_rmw32_xor_u = 0x40, 543 i32_atomic_rmw_xchg = 0x41, 544 i64_atomic_rmw_xchg = 0x42, 545 i32_atomic_rmw8_xchg_u = 0x43, 546 i32_atomic_rmw16_xchg_u = 0x44, 547 i64_atomic_rmw8_xchg_u = 0x45, 548 i64_atomic_rmw16_xchg_u = 0x46, 549 i64_atomic_rmw32_xchg_u = 0x47, 550 551 i32_atomic_rmw_cmpxchg = 0x48, 552 i64_atomic_rmw_cmpxchg = 0x49, 553 i32_atomic_rmw8_cmpxchg_u = 0x4A, 554 i32_atomic_rmw16_cmpxchg_u = 0x4B, 555 i64_atomic_rmw8_cmpxchg_u = 0x4C, 556 i64_atomic_rmw16_cmpxchg_u = 0x4D, 557 i64_atomic_rmw32_cmpxchg_u = 0x4E, 558 }; 559 560 /// Enum representing all Wasm value types as per spec: 561 /// https://webassembly.github.io/spec/core/binary/types.html 562 pub const Valtype = enum(u8) { 563 i32 = 0x7F, 564 i64 = 0x7E, 565 f32 = 0x7D, 566 f64 = 0x7C, 567 v128 = 0x7B, 568 }; 569 570 /// Reference types, where the funcref references to a function regardless of its type 571 /// and ref references an object from the embedder. 572 pub const RefType = enum(u8) { 573 funcref = 0x70, 574 externref = 0x6F, 575 }; 576 577 /// Limits classify the size range of resizeable storage associated with memory types and table types. 578 pub const Limits = struct { 579 flags: Flags, 580 min: u32, 581 max: u32, 582 583 pub const Flags = packed struct(u8) { 584 has_max: bool, 585 is_shared: bool, 586 reserved: u6 = 0, 587 }; 588 }; 589 590 /// Initialization expressions are used to set the initial value on an object 591 /// when a wasm module is being loaded. 592 pub const InitExpression = union(enum) { 593 i32_const: i32, 594 i64_const: i64, 595 f32_const: f32, 596 f64_const: f64, 597 global_get: u32, 598 }; 599 600 /// Describes the layout of the memory where `min` represents 601 /// the minimal amount of pages, and the optional `max` represents 602 /// the max pages. When `null` will allow the host to determine the 603 /// amount of pages. 604 pub const Memory = struct { 605 limits: Limits, 606 }; 607 608 /// Wasm module sections as per spec: 609 /// https://webassembly.github.io/spec/core/binary/modules.html 610 pub const Section = enum(u8) { 611 custom, 612 type, 613 import, 614 function, 615 table, 616 memory, 617 global, 618 @"export", 619 start, 620 element, 621 code, 622 data, 623 data_count, 624 _, 625 }; 626 627 /// The kind of the type when importing or exporting to/from the host environment. 628 /// https://webassembly.github.io/spec/core/syntax/modules.html 629 pub const ExternalKind = enum(u8) { 630 function, 631 table, 632 memory, 633 global, 634 }; 635 636 /// Defines the enum values for each subsection id for the "Names" custom section 637 /// as described by: 638 /// https://webassembly.github.io/spec/core/appendix/custom.html?highlight=name#name-section 639 pub const NameSubsection = enum(u8) { 640 module, 641 function, 642 local, 643 label, 644 type, 645 table, 646 memory, 647 global, 648 elem_segment, 649 data_segment, 650 }; 651 652 // type constants 653 pub const element_type: u8 = 0x70; 654 pub const function_type: u8 = 0x60; 655 pub const result_type: u8 = 0x40; 656 657 /// Represents a block which will not return a value 658 pub const BlockType = enum(u8) { 659 empty = 0x40, 660 i32 = 0x7F, 661 i64 = 0x7E, 662 f32 = 0x7D, 663 f64 = 0x7C, 664 v128 = 0x7B, 665 666 pub fn fromValtype(valtype: Valtype) BlockType { 667 return @fromBackingInt(@intCast(@backingInt(valtype))); 668 } 669 }; 670 671 // binary constants 672 pub const magic = [_]u8{ 0x00, 0x61, 0x73, 0x6D }; // \0asm 673 pub const version = [_]u8{ 0x01, 0x00, 0x00, 0x00 }; // version 1 (MVP) 674 675 // Each wasm page size is 64kB 676 pub const page_size = 64 * 1024; 677