Skip to content

Commit efb9316

Browse files
authored
Update support for the relaxed-simd proposal (#944)
This wasm proposal is almost phase 4 so now seemed like a reasonable time to sync the implementation here in `wasm-tools` with the upstream specification. The changes here are: * The "sat" in the float-to-int intrinsics naming was removed since it's not present in the upstream instruction. * Dot-product instructions now have "relaxed" in their name. Additionally the float-based dot-product instruction has been removed from the upstream proposal. * Opcodes were audited to ensure they match the latest upstream proposal. * The "fma" and "fnma" naming was updated to "madd" and "nmadd" * Generators in `wasm-smith` were updated to match the name of the instruction. * The validator was reorganized to put all the relaxed simd instructions next to each other. The upstream spec test suite was also updated which brought in some BLESS=1 snapshot updates as well along with a minor tweak to an error message.
1 parent 56cdbdd commit efb9316

File tree

24 files changed

+335
-287
lines changed

24 files changed

+335
-287
lines changed

crates/wasm-encoder/src/core/code.rs

Lines changed: 22 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -769,15 +769,17 @@ pub enum Instruction<'a> {
769769
F64x2ConvertLowI32x4U,
770770
F32x4DemoteF64x2Zero,
771771
F64x2PromoteLowF32x4,
772+
773+
// Relaxed simd proposal
772774
I8x16RelaxedSwizzle,
773-
I32x4RelaxedTruncSatF32x4S,
774-
I32x4RelaxedTruncSatF32x4U,
775-
I32x4RelaxedTruncSatF64x2SZero,
776-
I32x4RelaxedTruncSatF64x2UZero,
777-
F32x4RelaxedFma,
778-
F32x4RelaxedFnma,
779-
F64x2RelaxedFma,
780-
F64x2RelaxedFnma,
775+
I32x4RelaxedTruncF32x4S,
776+
I32x4RelaxedTruncF32x4U,
777+
I32x4RelaxedTruncF64x2SZero,
778+
I32x4RelaxedTruncF64x2UZero,
779+
F32x4RelaxedMadd,
780+
F32x4RelaxedNmadd,
781+
F64x2RelaxedMadd,
782+
F64x2RelaxedNmadd,
781783
I8x16RelaxedLaneselect,
782784
I16x8RelaxedLaneselect,
783785
I32x4RelaxedLaneselect,
@@ -787,9 +789,8 @@ pub enum Instruction<'a> {
787789
F64x2RelaxedMin,
788790
F64x2RelaxedMax,
789791
I16x8RelaxedQ15mulrS,
790-
I16x8DotI8x16I7x16S,
791-
I32x4DotI8x16I7x16AddS,
792-
F32x4RelaxedDotBf16x8AddF32x4,
792+
I16x8RelaxedDotI8x16I7x16S,
793+
I32x4RelaxedDotI8x16I7x16AddS,
793794

794795
// Atomic instructions (the threads proposal)
795796
MemoryAtomicNotify(MemArg),
@@ -2370,35 +2371,35 @@ impl Encode for Instruction<'_> {
23702371
sink.push(0xFD);
23712372
0x100u32.encode(sink);
23722373
}
2373-
Instruction::I32x4RelaxedTruncSatF32x4S => {
2374+
Instruction::I32x4RelaxedTruncF32x4S => {
23742375
sink.push(0xFD);
23752376
0x101u32.encode(sink);
23762377
}
2377-
Instruction::I32x4RelaxedTruncSatF32x4U => {
2378+
Instruction::I32x4RelaxedTruncF32x4U => {
23782379
sink.push(0xFD);
23792380
0x102u32.encode(sink);
23802381
}
2381-
Instruction::I32x4RelaxedTruncSatF64x2SZero => {
2382+
Instruction::I32x4RelaxedTruncF64x2SZero => {
23822383
sink.push(0xFD);
23832384
0x103u32.encode(sink);
23842385
}
2385-
Instruction::I32x4RelaxedTruncSatF64x2UZero => {
2386+
Instruction::I32x4RelaxedTruncF64x2UZero => {
23862387
sink.push(0xFD);
23872388
0x104u32.encode(sink);
23882389
}
2389-
Instruction::F32x4RelaxedFma => {
2390+
Instruction::F32x4RelaxedMadd => {
23902391
sink.push(0xFD);
23912392
0x105u32.encode(sink);
23922393
}
2393-
Instruction::F32x4RelaxedFnma => {
2394+
Instruction::F32x4RelaxedNmadd => {
23942395
sink.push(0xFD);
23952396
0x106u32.encode(sink);
23962397
}
2397-
Instruction::F64x2RelaxedFma => {
2398+
Instruction::F64x2RelaxedMadd => {
23982399
sink.push(0xFD);
23992400
0x107u32.encode(sink);
24002401
}
2401-
Instruction::F64x2RelaxedFnma => {
2402+
Instruction::F64x2RelaxedNmadd => {
24022403
sink.push(0xFD);
24032404
0x108u32.encode(sink);
24042405
}
@@ -2438,18 +2439,14 @@ impl Encode for Instruction<'_> {
24382439
sink.push(0xFD);
24392440
0x111u32.encode(sink);
24402441
}
2441-
Instruction::I16x8DotI8x16I7x16S => {
2442+
Instruction::I16x8RelaxedDotI8x16I7x16S => {
24422443
sink.push(0xFD);
24432444
0x112u32.encode(sink);
24442445
}
2445-
Instruction::I32x4DotI8x16I7x16AddS => {
2446+
Instruction::I32x4RelaxedDotI8x16I7x16AddS => {
24462447
sink.push(0xFD);
24472448
0x113u32.encode(sink);
24482449
}
2449-
Instruction::F32x4RelaxedDotBf16x8AddF32x4 => {
2450-
sink.push(0xFD);
2451-
0x114u32.encode(sink);
2452-
}
24532450

24542451
// Atmoic instructions from the thread proposal
24552452
Instruction::MemoryAtomicNotify(memarg) => {

crates/wasm-smith/src/core/code_builder.rs

Lines changed: 29 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -350,10 +350,10 @@ instructions! {
350350
(Some(simd_v128_v128_on_stack), i8x16_swizzle, Vector),
351351
(Some(simd_v128_v128_on_stack_relaxed), i8x16_relaxed_swizzle, Vector),
352352
(Some(simd_v128_v128_v128_on_stack), v128_bitselect, Vector),
353-
(Some(simd_v128_v128_v128_on_stack_relaxed), i8x16_laneselect, Vector),
354-
(Some(simd_v128_v128_v128_on_stack_relaxed), i16x8_laneselect, Vector),
355-
(Some(simd_v128_v128_v128_on_stack_relaxed), i32x4_laneselect, Vector),
356-
(Some(simd_v128_v128_v128_on_stack_relaxed), i64x2_laneselect, Vector),
353+
(Some(simd_v128_v128_v128_on_stack_relaxed), i8x16_relaxed_laneselect, Vector),
354+
(Some(simd_v128_v128_v128_on_stack_relaxed), i16x8_relaxed_laneselect, Vector),
355+
(Some(simd_v128_v128_v128_on_stack_relaxed), i32x4_relaxed_laneselect, Vector),
356+
(Some(simd_v128_v128_v128_on_stack_relaxed), i64x2_relaxed_laneselect, Vector),
357357
(Some(simd_v128_v128_on_stack), i8x16_eq, Vector),
358358
(Some(simd_v128_v128_on_stack), i8x16_ne, Vector),
359359
(Some(simd_v128_v128_on_stack), i8x16_lt_s, Vector),
@@ -544,22 +544,21 @@ instructions! {
544544
(Some(simd_v128_on_stack), f64x2_convert_low_i32x4u, Vector),
545545
(Some(simd_v128_on_stack), f32x4_demote_f64x2_zero, Vector),
546546
(Some(simd_v128_on_stack), f64x2_promote_low_f32x4, Vector),
547-
(Some(simd_v128_on_stack_relaxed), i32x4_relaxed_trunc_sat_f32x4s, Vector),
548-
(Some(simd_v128_on_stack_relaxed), i32x4_relaxed_trunc_sat_f32x4u, Vector),
549-
(Some(simd_v128_on_stack_relaxed), i32x4_relaxed_trunc_sat_f64x2s_zero, Vector),
550-
(Some(simd_v128_on_stack_relaxed), i32x4_relaxed_trunc_sat_f64x2u_zero, Vector),
551-
(Some(simd_v128_v128_v128_on_stack_relaxed), f32x4_fma, Vector),
552-
(Some(simd_v128_v128_v128_on_stack_relaxed), f32x4_fnma, Vector),
553-
(Some(simd_v128_v128_v128_on_stack_relaxed), f64x2_fma, Vector),
554-
(Some(simd_v128_v128_v128_on_stack_relaxed), f64x2_fnma, Vector),
547+
(Some(simd_v128_on_stack_relaxed), i32x4_relaxed_trunc_f32x4s, Vector),
548+
(Some(simd_v128_on_stack_relaxed), i32x4_relaxed_trunc_f32x4u, Vector),
549+
(Some(simd_v128_on_stack_relaxed), i32x4_relaxed_trunc_f64x2s_zero, Vector),
550+
(Some(simd_v128_on_stack_relaxed), i32x4_relaxed_trunc_f64x2u_zero, Vector),
551+
(Some(simd_v128_v128_v128_on_stack_relaxed), f32x4_relaxed_madd, Vector),
552+
(Some(simd_v128_v128_v128_on_stack_relaxed), f32x4_relaxed_nmadd, Vector),
553+
(Some(simd_v128_v128_v128_on_stack_relaxed), f64x2_relaxed_madd, Vector),
554+
(Some(simd_v128_v128_v128_on_stack_relaxed), f64x2_relaxed_nmadd, Vector),
555555
(Some(simd_v128_v128_on_stack_relaxed), f32x4_relaxed_min, Vector),
556556
(Some(simd_v128_v128_on_stack_relaxed), f32x4_relaxed_max, Vector),
557557
(Some(simd_v128_v128_on_stack_relaxed), f64x2_relaxed_min, Vector),
558558
(Some(simd_v128_v128_on_stack_relaxed), f64x2_relaxed_max, Vector),
559559
(Some(simd_v128_v128_on_stack_relaxed), i16x8_relaxed_q15mulr_s, Vector),
560-
(Some(simd_v128_v128_on_stack_relaxed), i16x8_dot_i8x16_i7x16_s, Vector),
561-
(Some(simd_v128_v128_v128_on_stack_relaxed), i32x4_dot_i8x16_i7x16_add_s, Vector),
562-
(Some(simd_v128_v128_v128_on_stack_relaxed), f32x4_relaxed_dot_bf16x8_add_f32x4, Vector),
560+
(Some(simd_v128_v128_on_stack_relaxed), i16x8_relaxed_dot_i8x16_i7x16_s, Vector),
561+
(Some(simd_v128_v128_v128_on_stack_relaxed), i32x4_relaxed_dot_i8x16_i7x16_add_s, Vector),
563562
}
564563

565564
pub(crate) struct CodeBuilderAllocations {
@@ -5332,32 +5331,25 @@ simd_unop!(F32x4DemoteF64x2Zero, f32x4_demote_f64x2_zero);
53325331
simd_unop!(F64x2PromoteLowF32x4, f64x2_promote_low_f32x4);
53335332
simd_ternop!(V128Bitselect, v128_bitselect);
53345333
simd_binop!(I8x16RelaxedSwizzle, i8x16_relaxed_swizzle);
5335-
simd_unop!(I32x4RelaxedTruncSatF32x4S, i32x4_relaxed_trunc_sat_f32x4s);
5336-
simd_unop!(I32x4RelaxedTruncSatF32x4U, i32x4_relaxed_trunc_sat_f32x4u);
5337-
simd_unop!(
5338-
I32x4RelaxedTruncSatF64x2SZero,
5339-
i32x4_relaxed_trunc_sat_f64x2s_zero
5340-
);
5341-
simd_unop!(
5342-
I32x4RelaxedTruncSatF64x2UZero,
5343-
i32x4_relaxed_trunc_sat_f64x2u_zero
5344-
);
5345-
simd_ternop!(F32x4RelaxedFma, f32x4_fma);
5346-
simd_ternop!(F32x4RelaxedFnma, f32x4_fnma);
5347-
simd_ternop!(F64x2RelaxedFma, f64x2_fma);
5348-
simd_ternop!(F64x2RelaxedFnma, f64x2_fnma);
5349-
simd_ternop!(I8x16RelaxedLaneselect, i8x16_laneselect);
5350-
simd_ternop!(I16x8RelaxedLaneselect, i16x8_laneselect);
5351-
simd_ternop!(I32x4RelaxedLaneselect, i32x4_laneselect);
5352-
simd_ternop!(I64x2RelaxedLaneselect, i64x2_laneselect);
5334+
simd_unop!(I32x4RelaxedTruncF32x4S, i32x4_relaxed_trunc_f32x4s);
5335+
simd_unop!(I32x4RelaxedTruncF32x4U, i32x4_relaxed_trunc_f32x4u);
5336+
simd_unop!(I32x4RelaxedTruncF64x2SZero, i32x4_relaxed_trunc_f64x2s_zero);
5337+
simd_unop!(I32x4RelaxedTruncF64x2UZero, i32x4_relaxed_trunc_f64x2u_zero);
5338+
simd_ternop!(F32x4RelaxedMadd, f32x4_relaxed_madd);
5339+
simd_ternop!(F32x4RelaxedNmadd, f32x4_relaxed_nmadd);
5340+
simd_ternop!(F64x2RelaxedMadd, f64x2_relaxed_madd);
5341+
simd_ternop!(F64x2RelaxedNmadd, f64x2_relaxed_nmadd);
5342+
simd_ternop!(I8x16RelaxedLaneselect, i8x16_relaxed_laneselect);
5343+
simd_ternop!(I16x8RelaxedLaneselect, i16x8_relaxed_laneselect);
5344+
simd_ternop!(I32x4RelaxedLaneselect, i32x4_relaxed_laneselect);
5345+
simd_ternop!(I64x2RelaxedLaneselect, i64x2_relaxed_laneselect);
53535346
simd_binop!(F32x4RelaxedMin, f32x4_relaxed_min);
53545347
simd_binop!(F32x4RelaxedMax, f32x4_relaxed_max);
53555348
simd_binop!(F64x2RelaxedMin, f64x2_relaxed_min);
53565349
simd_binop!(F64x2RelaxedMax, f64x2_relaxed_max);
53575350
simd_binop!(I16x8RelaxedQ15mulrS, i16x8_relaxed_q15mulr_s);
5358-
simd_binop!(I16x8DotI8x16I7x16S, i16x8_dot_i8x16_i7x16_s);
5359-
simd_ternop!(I32x4DotI8x16I7x16AddS, i32x4_dot_i8x16_i7x16_add_s);
5351+
simd_binop!(I16x8RelaxedDotI8x16I7x16S, i16x8_relaxed_dot_i8x16_i7x16_s);
53605352
simd_ternop!(
5361-
F32x4RelaxedDotBf16x8AddF32x4,
5362-
f32x4_relaxed_dot_bf16x8_add_f32x4
5353+
I32x4RelaxedDotI8x16I7x16AddS,
5354+
i32x4_relaxed_dot_i8x16_i7x16_add_s
53635355
);

crates/wasmparser/src/binary_reader.rs

Lines changed: 10 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1352,14 +1352,14 @@ impl<'a> BinaryReader<'a> {
13521352
0xfe => visitor.visit_f64x2_convert_low_i32x4_s(),
13531353
0xff => visitor.visit_f64x2_convert_low_i32x4_u(),
13541354
0x100 => visitor.visit_i8x16_relaxed_swizzle(),
1355-
0x101 => visitor.visit_i32x4_relaxed_trunc_sat_f32x4_s(),
1356-
0x102 => visitor.visit_i32x4_relaxed_trunc_sat_f32x4_u(),
1357-
0x103 => visitor.visit_i32x4_relaxed_trunc_sat_f64x2_s_zero(),
1358-
0x104 => visitor.visit_i32x4_relaxed_trunc_sat_f64x2_u_zero(),
1359-
0x105 => visitor.visit_f32x4_relaxed_fma(),
1360-
0x106 => visitor.visit_f32x4_relaxed_fnma(),
1361-
0x107 => visitor.visit_f64x2_relaxed_fma(),
1362-
0x108 => visitor.visit_f64x2_relaxed_fnma(),
1355+
0x101 => visitor.visit_i32x4_relaxed_trunc_f32x4_s(),
1356+
0x102 => visitor.visit_i32x4_relaxed_trunc_f32x4_u(),
1357+
0x103 => visitor.visit_i32x4_relaxed_trunc_f64x2_s_zero(),
1358+
0x104 => visitor.visit_i32x4_relaxed_trunc_f64x2_u_zero(),
1359+
0x105 => visitor.visit_f32x4_relaxed_madd(),
1360+
0x106 => visitor.visit_f32x4_relaxed_nmadd(),
1361+
0x107 => visitor.visit_f64x2_relaxed_madd(),
1362+
0x108 => visitor.visit_f64x2_relaxed_nmadd(),
13631363
0x109 => visitor.visit_i8x16_relaxed_laneselect(),
13641364
0x10a => visitor.visit_i16x8_relaxed_laneselect(),
13651365
0x10b => visitor.visit_i32x4_relaxed_laneselect(),
@@ -1369,9 +1369,8 @@ impl<'a> BinaryReader<'a> {
13691369
0x10f => visitor.visit_f64x2_relaxed_min(),
13701370
0x110 => visitor.visit_f64x2_relaxed_max(),
13711371
0x111 => visitor.visit_i16x8_relaxed_q15mulr_s(),
1372-
0x112 => visitor.visit_i16x8_dot_i8x16_i7x16_s(),
1373-
0x113 => visitor.visit_i32x4_dot_i8x16_i7x16_add_s(),
1374-
0x114 => visitor.visit_f32x4_relaxed_dot_bf16x8_add_f32x4(),
1372+
0x112 => visitor.visit_i16x8_relaxed_dot_i8x16_i7x16_s(),
1373+
0x113 => visitor.visit_i32x4_relaxed_dot_i8x16_i7x16_add_s(),
13751374

13761375
_ => bail!(pos, "unknown 0xfd subopcode: 0x{code:x}"),
13771376
})

crates/wasmparser/src/lib.rs

Lines changed: 10 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -658,14 +658,14 @@ macro_rules! for_each_operator {
658658
// Relaxed SIMD operators
659659
// https://github.com/WebAssembly/relaxed-simd
660660
@relaxed_simd I8x16RelaxedSwizzle => visit_i8x16_relaxed_swizzle
661-
@relaxed_simd I32x4RelaxedTruncSatF32x4S => visit_i32x4_relaxed_trunc_sat_f32x4_s
662-
@relaxed_simd I32x4RelaxedTruncSatF32x4U => visit_i32x4_relaxed_trunc_sat_f32x4_u
663-
@relaxed_simd I32x4RelaxedTruncSatF64x2SZero => visit_i32x4_relaxed_trunc_sat_f64x2_s_zero
664-
@relaxed_simd I32x4RelaxedTruncSatF64x2UZero => visit_i32x4_relaxed_trunc_sat_f64x2_u_zero
665-
@relaxed_simd F32x4RelaxedFma => visit_f32x4_relaxed_fma
666-
@relaxed_simd F32x4RelaxedFnma => visit_f32x4_relaxed_fnma
667-
@relaxed_simd F64x2RelaxedFma => visit_f64x2_relaxed_fma
668-
@relaxed_simd F64x2RelaxedFnma => visit_f64x2_relaxed_fnma
661+
@relaxed_simd I32x4RelaxedTruncF32x4S => visit_i32x4_relaxed_trunc_f32x4_s
662+
@relaxed_simd I32x4RelaxedTruncF32x4U => visit_i32x4_relaxed_trunc_f32x4_u
663+
@relaxed_simd I32x4RelaxedTruncF64x2SZero => visit_i32x4_relaxed_trunc_f64x2_s_zero
664+
@relaxed_simd I32x4RelaxedTruncF64x2UZero => visit_i32x4_relaxed_trunc_f64x2_u_zero
665+
@relaxed_simd F32x4RelaxedMadd => visit_f32x4_relaxed_madd
666+
@relaxed_simd F32x4RelaxedNmadd => visit_f32x4_relaxed_nmadd
667+
@relaxed_simd F64x2RelaxedMadd => visit_f64x2_relaxed_madd
668+
@relaxed_simd F64x2RelaxedNmadd => visit_f64x2_relaxed_nmadd
669669
@relaxed_simd I8x16RelaxedLaneselect => visit_i8x16_relaxed_laneselect
670670
@relaxed_simd I16x8RelaxedLaneselect => visit_i16x8_relaxed_laneselect
671671
@relaxed_simd I32x4RelaxedLaneselect => visit_i32x4_relaxed_laneselect
@@ -675,9 +675,8 @@ macro_rules! for_each_operator {
675675
@relaxed_simd F64x2RelaxedMin => visit_f64x2_relaxed_min
676676
@relaxed_simd F64x2RelaxedMax => visit_f64x2_relaxed_max
677677
@relaxed_simd I16x8RelaxedQ15mulrS => visit_i16x8_relaxed_q15mulr_s
678-
@relaxed_simd I16x8DotI8x16I7x16S => visit_i16x8_dot_i8x16_i7x16_s
679-
@relaxed_simd I32x4DotI8x16I7x16AddS => visit_i32x4_dot_i8x16_i7x16_add_s
680-
@relaxed_simd F32x4RelaxedDotBf16x8AddF32x4 => visit_f32x4_relaxed_dot_bf16x8_add_f32x4
678+
@relaxed_simd I16x8RelaxedDotI8x16I7x16S => visit_i16x8_relaxed_dot_i8x16_i7x16_s
679+
@relaxed_simd I32x4RelaxedDotI8x16I7x16AddS => visit_i32x4_relaxed_dot_i8x16_i7x16_add_s
681680

682681
// Typed Function references
683682
@function_references CallRef { hty: $crate::HeapType } => visit_call_ref

crates/wasmparser/src/validator/core.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -214,7 +214,7 @@ impl ModuleState {
214214
{
215215
return Err(BinaryReaderError::new(
216216
format!(
217-
"invalid element type `{}` for table type `{}`",
217+
"type mismatch: invalid element type `{}` for table type `{}`",
218218
ty_to_str(e.ty.into()),
219219
ty_to_str(table.element_type.into()),
220220
),

0 commit comments

Comments
 (0)