| ... | ... | @@ -237,6 +237,277 @@ pub const PrefixedOpcode = enum(u8) { |
| 237 | 237 | _, |
| 238 | 238 | }; |
| 239 | 239 | |
| 240 | /// Simd opcodes that require a prefix `0xFD`. |
| 241 | /// Each opcode represents a varuint32, meaning |
| 242 | /// they are encoded as leb128 in binary. |
| 243 | pub const SimdOpcode = enum(u32) { |
| 244 | v128_load = 0x00, |
| 245 | v128_load8x8_s = 0x01, |
| 246 | v128_load8x8_u = 0x02, |
| 247 | v128_load16x4_s = 0x03, |
| 248 | v128_load16x4_u = 0x04, |
| 249 | v128_load32x2_s = 0x05, |
| 250 | v128_load32x2_u = 0x06, |
| 251 | v128_load8_splat = 0x07, |
| 252 | v128_load16_splat = 0x08, |
| 253 | v128_load32_splat = 0x09, |
| 254 | v128_load64_splat = 0x0A, |
| 255 | v128_store = 0x0B, |
| 256 | v128_const = 0x0C, |
| 257 | i8x16_shuffle = 0x0D, |
| 258 | i8x16_swizzle = 0x0E, |
| 259 | @"8x16_splat" = 0x0F, |
| 260 | i16x8_splat = 0x10, |
| 261 | i32x4_splat = 0x11, |
| 262 | i64x2_splat = 0x12, |
| 263 | f32x4_splat = 0x13, |
| 264 | f64x2_splat = 0x14, |
| 265 | @"8x16_extract_lane_s" = 0x15, |
| 266 | i8x16_extract_lane_u = 0x16, |
| 267 | i8x16_replace_lane = 0x17, |
| 268 | i16x8_extract_lane_s = 0x18, |
| 269 | i16x8_extract_lane_u = 0x19, |
| 270 | i16x8_replace_lane = 0x1A, |
| 271 | i32x4_extract_lane = 0x1B, |
| 272 | i32x4_replace_lane = 0x1C, |
| 273 | i64x2_extract_lane = 0x1D, |
| 274 | i64x2_replace_lane = 0x1E, |
| 275 | f32x4_extract_lane = 0x1F, |
| 276 | f32x4_replace_lane = 0x20, |
| 277 | f64x2_extract_lane = 0x21, |
| 278 | f64x2_replace_lane = 0x22, |
| 279 | i8x16_eq = 0x23, |
| 280 | i16x8_eq = 0x2D, |
| 281 | i32x4_eq = 0x37, |
| 282 | i8x16_ne = 0x24, |
| 283 | i16x8_ne = 0x2E, |
| 284 | i32x4_ne = 0x38, |
| 285 | i8x16_lt_s = 0x25, |
| 286 | i16x8_lt_s = 0x2F, |
| 287 | i32x4_lt_s = 0x39, |
| 288 | i8x16_lt_u = 0x26, |
| 289 | i16x8_lt_u = 0x30, |
| 290 | i32x4_lt_u = 0x3A, |
| 291 | i8x16_gt_s = 0x27, |
| 292 | i16x8_gt_s = 0x31, |
| 293 | i32x4_gt_s = 0x3B, |
| 294 | i8x16_gt_u = 0x28, |
| 295 | i16x8_gt_u = 0x32, |
| 296 | i32x4_gt_u = 0x3C, |
| 297 | i8x16_le_s = 0x29, |
| 298 | i16x8_le_s = 0x33, |
| 299 | i32x4_le_s = 0x3D, |
| 300 | i8x16_le_u = 0x2A, |
| 301 | i16x8_le_u = 0x34, |
| 302 | i32x4_le_u = 0x3E, |
| 303 | i8x16_ge_s = 0x2B, |
| 304 | i16x8_ge_s = 0x35, |
| 305 | i32x4_ge_s = 0x3F, |
| 306 | i8x16_ge_u = 0x2C, |
| 307 | i16x8_ge_u = 0x36, |
| 308 | i32x4_ge_u = 0x40, |
| 309 | f32x4_eq = 0x41, |
| 310 | f64x2_eq = 0x47, |
| 311 | f32x4_ne = 0x42, |
| 312 | f64x2_ne = 0x48, |
| 313 | f32x4_lt = 0x43, |
| 314 | f64x2_lt = 0x49, |
| 315 | f32x4_gt = 0x44, |
| 316 | f64x2_gt = 0x4A, |
| 317 | f32x4_le = 0x45, |
| 318 | f64x2_le = 0x4B, |
| 319 | f32x4_ge = 0x46, |
| 320 | f64x2_ge = 0x4C, |
| 321 | v128_not = 0x4D, |
| 322 | v128_and = 0x4E, |
| 323 | v128_andnot = 0x4F, |
| 324 | v128_or = 0x50, |
| 325 | v128_xor = 0x51, |
| 326 | v128_bitselect = 0x52, |
| 327 | v128_any_true = 0x53, |
| 328 | v128_load8_lane = 0x54, |
| 329 | v128_load16_lane = 0x55, |
| 330 | v128_load32_lane = 0x56, |
| 331 | v128_load64_lane = 0x57, |
| 332 | v128_store8_lane = 0x58, |
| 333 | v128_store16_lane = 0x59, |
| 334 | v128_store32_lane = 0x5A, |
| 335 | v128_store64_lane = 0x5B, |
| 336 | v128_load32_zero = 0x5C, |
| 337 | v128_load64_zero = 0x5D, |
| 338 | f32x4_demote_f64x2_zero = 0x5E, |
| 339 | f64x2_promote_low_f32x4 = 0x5F, |
| 340 | i8x16_abs = 0x60, |
| 341 | i16x8_abs = 0x80, |
| 342 | i32x4_abs = 0xA0, |
| 343 | i64x2_abs = 0xC0, |
| 344 | i8x16_neg = 0x61, |
| 345 | i16x8_neg = 0x81, |
| 346 | i32x4_neg = 0xA1, |
| 347 | i64x2_neg = 0xC1, |
| 348 | i8x16_popcnt = 0x62, |
| 349 | i16x8_q15mulr_sat_s = 0x82, |
| 350 | i8x16_all_true = 0x63, |
| 351 | i16x8_all_true = 0x83, |
| 352 | i32x4_all_true = 0xA3, |
| 353 | i64x2_all_true = 0xC3, |
| 354 | i8x16_bitmask = 0x64, |
| 355 | i16x8_bitmask = 0x84, |
| 356 | i32x4_bitmask = 0xA4, |
| 357 | i64x2_bitmask = 0xC4, |
| 358 | i8x16_narrow_i16x8_s = 0x65, |
| 359 | i16x8_narrow_i32x4_s = 0x85, |
| 360 | i8x16_narrow_i16x8_u = 0x66, |
| 361 | i16x8_narrow_i32x4_u = 0x86, |
| 362 | f32x4_ceil = 0x67, |
| 363 | i16x8_extend_low_i8x16_s = 0x87, |
| 364 | i32x4_extend_low_i16x8_s = 0xA7, |
| 365 | i64x2_extend_low_i32x4_s = 0xC7, |
| 366 | f32x4_floor = 0x68, |
| 367 | i16x8_extend_high_i8x16_s = 0x88, |
| 368 | i32x4_extend_high_i16x8_s = 0xA8, |
| 369 | i64x2_extend_high_i32x4_s = 0xC8, |
| 370 | f32x4_trunc = 0x69, |
| 371 | i16x8_extend_low_i8x16_u = 0x89, |
| 372 | i32x4_extend_low_i16x8_u = 0xA9, |
| 373 | i64x2_extend_low_i32x4_u = 0xC9, |
| 374 | f32x4_nearest = 0x6A, |
| 375 | i16x8_extend_high_i8x16_u = 0x8A, |
| 376 | i32x4_extend_high_i16x8_u = 0xAA, |
| 377 | i64x2_extend_high_i32x4_u = 0xCA, |
| 378 | i8x16_shl = 0x6B, |
| 379 | i16x8_shl = 0x8B, |
| 380 | i32x4_shl = 0xAB, |
| 381 | i64x2_shl = 0xCB, |
| 382 | i8x16_shr_s = 0x6C, |
| 383 | i16x8_shr_s = 0x8C, |
| 384 | i32x4_shr_s = 0xAC, |
| 385 | i64x2_shr_s = 0xCC, |
| 386 | i8x16_shr_u = 0x6D, |
| 387 | i16x8_shr_u = 0x8D, |
| 388 | i32x4_shr_u = 0xAD, |
| 389 | i64x2_shr_u = 0xCD, |
| 390 | i8x16_add = 0x6E, |
| 391 | i16x8_add = 0x8E, |
| 392 | i32x4_add = 0xAE, |
| 393 | i64x2_add = 0xCE, |
| 394 | i8x16_add_sat_s = 0x6F, |
| 395 | i16x8_add_sat_s = 0x8F, |
| 396 | i8x16_add_sat_u = 0x70, |
| 397 | i16x8_add_sat_u = 0x90, |
| 398 | i8x16_sub = 0x71, |
| 399 | i16x8_sub = 0x91, |
| 400 | i32x4_sub = 0xB1, |
| 401 | i64x2_sub = 0xD1, |
| 402 | i8x16_sub_sat_s = 0x72, |
| 403 | i16x8_sub_sat_s = 0x92, |
| 404 | i8x16_sub_sat_u = 0x73, |
| 405 | i16x8_sub_sat_u = 0x93, |
| 406 | f64x2_ceil = 0x74, |
| 407 | f64x2_nearest = 0x94, |
| 408 | f64x2_floor = 0x75, |
| 409 | i16x8_mul = 0x95, |
| 410 | i32x4_mul = 0xB5, |
| 411 | i64x2_mul = 0xD5, |
| 412 | i8x16_min_s = 0x76, |
| 413 | i16x8_min_s = 0x96, |
| 414 | i32x4_min_s = 0xB6, |
| 415 | i64x2_eq = 0xD6, |
| 416 | i8x16_min_u = 0x77, |
| 417 | i16x8_min_u = 0x97, |
| 418 | i32x4_min_u = 0xB7, |
| 419 | i64x2_ne = 0xD7, |
| 420 | i8x16_max_s = 0x78, |
| 421 | i16x8_max_s = 0x98, |
| 422 | i32x4_max_s = 0xB8, |
| 423 | i64x2_lt_s = 0xD8, |
| 424 | i8x16_max_u = 0x79, |
| 425 | i16x8_max_u = 0x99, |
| 426 | i32x4_max_u = 0xB9, |
| 427 | i64x2_gt_s = 0xD9, |
| 428 | f64x2_trunc = 0x7A, |
| 429 | i32x4_dot_i16x8_s = 0xBA, |
| 430 | i64x2_le_s = 0xDA, |
| 431 | i8x16_avgr_u = 0x7B, |
| 432 | i16x8_avgr_u = 0x9B, |
| 433 | i64x2_ge_s = 0xDB, |
| 434 | i16x8_extadd_pairwise_i8x16_s = 0x7C, |
| 435 | i16x8_extmul_low_i8x16_s = 0x9C, |
| 436 | i32x4_extmul_low_i16x8_s = 0xBC, |
| 437 | i64x2_extmul_low_i32x4_s = 0xDC, |
| 438 | i16x8_extadd_pairwise_i8x16_u = 0x7D, |
| 439 | i16x8_extmul_high_i8x16_s = 0x9D, |
| 440 | i32x4_extmul_high_i16x8_s = 0xBD, |
| 441 | i64x2_extmul_high_i32x4_s = 0xDD, |
| 442 | i32x4_extadd_pairwise_i16x8_s = 0x7E, |
| 443 | i16x8_extmul_low_i8x16_u = 0x9E, |
| 444 | i32x4_extmul_low_i16x8_u = 0xBE, |
| 445 | i64x2_extmul_low_i32x4_u = 0xDE, |
| 446 | i32x4_extadd_pairwise_i16x8_u = 0x7F, |
| 447 | i16x8_extmul_high_i8x16_u = 0x9F, |
| 448 | i32x4_extmul_high_i16x8_u = 0xBF, |
| 449 | i64x2_extmul_high_i32x4_u = 0xDF, |
| 450 | f32x4_abs = 0xE0, |
| 451 | f64x2_abs = 0xEC, |
| 452 | f32x4_neg = 0xE1, |
| 453 | f64x2_neg = 0xED, |
| 454 | f32x4_sqrt = 0xE3, |
| 455 | f64x2_sqrt = 0xEF, |
| 456 | f32x4_add = 0xE4, |
| 457 | f64x2_add = 0xF0, |
| 458 | f32x4_sub = 0xE5, |
| 459 | f64x2_sub = 0xF1, |
| 460 | f32x4_mul = 0xE6, |
| 461 | f64x2_mul = 0xF2, |
| 462 | f32x4_div = 0xE7, |
| 463 | f64x2_div = 0xF3, |
| 464 | f32x4_min = 0xE8, |
| 465 | f64x2_min = 0xF4, |
| 466 | f32x4_max = 0xE9, |
| 467 | f64x2_max = 0xF5, |
| 468 | f32x4_pmin = 0xEA, |
| 469 | f64x2_pmin = 0xF6, |
| 470 | f32x4_pmax = 0xEB, |
| 471 | f64x2_pmax = 0xF7, |
| 472 | i32x4_trunc_sat_f32x4_s = 0xF8, |
| 473 | i32x4_trunc_sat_f32x4_u = 0xF9, |
| 474 | f32x4_convert_i32x4_s = 0xFA, |
| 475 | f32x4_convert_i32x4_u = 0xFB, |
| 476 | i32x4_trunc_sat_f64x2_s_zero = 0xFC, |
| 477 | i32x4_trunc_sat_f64x2_u_zero = 0xFD, |
| 478 | f64x2_convert_low_i32x4_s = 0xFE, |
| 479 | f64x2_convert_low_i32x4_u = 0xFF, |
| 480 | |
| 481 | // relaxed-simd opcodes |
| 482 | i8x16_relaxed_swizzle = 0x100, |
| 483 | i32x4_relaxed_trunc_f32x4_s = 0x101, |
| 484 | i32x4_relaxed_trunc_f32x4_u = 0x102, |
| 485 | i32x4_relaxed_trunc_f64x2_s_zero = 0x103, |
| 486 | i32x4_relaxed_trunc_f64x2_u_zero = 0x104, |
| 487 | f32x4_relaxed_madd = 0x105, |
| 488 | f32x4_relaxed_nmadd = 0x106, |
| 489 | f64x2_relaxed_madd = 0x107, |
| 490 | f64x2_relaxed_nmadd = 0x108, |
| 491 | i8x16_relaxed_laneselect = 0x109, |
| 492 | i16x8_relaxed_laneselect = 0x10a, |
| 493 | i32x4_relaxed_laneselect = 0x10b, |
| 494 | i64x2_relaxed_laneselect = 0x10c, |
| 495 | f32x4_relaxed_min = 0x10d, |
| 496 | f32x4_relaxed_max = 0x10e, |
| 497 | f64x2_relaxed_min = 0x10f, |
| 498 | f64x2_relaxed_max = 0x110, |
| 499 | i16x8_relaxed_q15mulr_s = 0x111, |
| 500 | i16x8_relaxed_dot_i8x16_i7x16_s = 0x112, |
| 501 | i32x4_relaxed_dot_i8x16_i7x16_add_s = 0x113, |
| 502 | f32x4_relaxed_dot_bf16x8_add_f32x4 = 0x114, |
| 503 | }; |
| 504 | |
| 505 | /// Returns the integer value of an `SimdOpcode`. Used by the Zig compiler |
| 506 | /// to write instructions to the wasm binary file |
| 507 | pub fn simdOpcode(op: SimdOpcode) u32 { |
| 508 | return @enumToInt(op); |
| 509 | } |
| 510 | |
| 240 | 511 | /// Enum representing all Wasm value types as per spec: |
| 241 | 512 | /// https://webassembly.github.io/spec/core/binary/types.html |
| 242 | 513 | pub const Valtype = enum(u8) { |
| ... | ... | @@ -244,6 +515,7 @@ pub const Valtype = enum(u8) { |
| 244 | 515 | i64 = 0x7E, |
| 245 | 516 | f32 = 0x7D, |
| 246 | 517 | f64 = 0x7C, |
| 518 | v128 = 0x7B, |
| 247 | 519 | }; |
| 248 | 520 | |
| 249 | 521 | /// Returns the integer value of a `Valtype` |