Skip to content

Commit a4cd054

Browse files
authored
Add support for relaxed-simd to wasm-mutate (#1975)
Enables running `wasm-tools shrink` over modules that contain relaxed-simd instructions.
1 parent 787f633 commit a4cd054

File tree

4 files changed

+102
-0
lines changed

4 files changed

+102
-0
lines changed

crates/wasm-mutate/src/mutators/peephole/dfg.rs

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1076,6 +1076,35 @@ impl<'a> DFGBuilder {
10761076
Operator::F32x4DemoteF64x2Zero => self.unop(idx, Lang::F32x4DemoteF64x2Zero),
10771077
Operator::F64x2PromoteLowF32x4 => self.unop(idx, Lang::F64x2PromoteLowF32x4),
10781078

1079+
Operator::I8x16RelaxedSwizzle => self.binop(idx, Lang::I8x16RelaxedSwizzle),
1080+
Operator::I32x4RelaxedTruncF32x4S => self.unop(idx, Lang::I32x4RelaxedTruncF32x4S),
1081+
Operator::I32x4RelaxedTruncF32x4U => self.unop(idx, Lang::I32x4RelaxedTruncF32x4U),
1082+
Operator::I32x4RelaxedTruncF64x2SZero => {
1083+
self.unop(idx, Lang::I32x4RelaxedTruncF64x2SZero)
1084+
}
1085+
Operator::I32x4RelaxedTruncF64x2UZero => {
1086+
self.unop(idx, Lang::I32x4RelaxedTruncF64x2UZero)
1087+
}
1088+
Operator::F32x4RelaxedMadd => self.ternop(idx, Lang::F32x4RelaxedMadd),
1089+
Operator::F32x4RelaxedNmadd => self.ternop(idx, Lang::F32x4RelaxedNmadd),
1090+
Operator::F64x2RelaxedMadd => self.ternop(idx, Lang::F64x2RelaxedMadd),
1091+
Operator::F64x2RelaxedNmadd => self.ternop(idx, Lang::F64x2RelaxedNmadd),
1092+
Operator::I8x16RelaxedLaneselect => self.ternop(idx, Lang::I8x16RelaxedLaneselect),
1093+
Operator::I16x8RelaxedLaneselect => self.ternop(idx, Lang::I16x8RelaxedLaneselect),
1094+
Operator::I32x4RelaxedLaneselect => self.ternop(idx, Lang::I32x4RelaxedLaneselect),
1095+
Operator::I64x2RelaxedLaneselect => self.ternop(idx, Lang::I64x2RelaxedLaneselect),
1096+
Operator::F32x4RelaxedMin => self.binop(idx, Lang::F32x4RelaxedMin),
1097+
Operator::F32x4RelaxedMax => self.binop(idx, Lang::F32x4RelaxedMax),
1098+
Operator::F64x2RelaxedMin => self.binop(idx, Lang::F64x2RelaxedMin),
1099+
Operator::F64x2RelaxedMax => self.binop(idx, Lang::F64x2RelaxedMax),
1100+
Operator::I16x8RelaxedQ15mulrS => self.binop(idx, Lang::I16x8RelaxedQ15mulrS),
1101+
Operator::I16x8RelaxedDotI8x16I7x16S => {
1102+
self.binop(idx, Lang::I16x8RelaxedDotI8x16I7x16S)
1103+
}
1104+
Operator::I32x4RelaxedDotI8x16I7x16AddS => {
1105+
self.ternop(idx, Lang::I32x4RelaxedDotI8x16I7x16AddS)
1106+
}
1107+
10791108
op => {
10801109
// If the operator is not implemented, warn and bail out. We
10811110
// can't use `undef` for these because if we try to rewrite

crates/wasm-mutate/src/mutators/peephole/eggsy/analysis.rs

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -545,6 +545,27 @@ impl PeepholeMutationAnalysis {
545545
Lang::F64x2ConvertLowI32x4U(_) => Ok(PrimitiveTypeInfo::V128),
546546
Lang::F32x4DemoteF64x2Zero(_) => Ok(PrimitiveTypeInfo::V128),
547547
Lang::F64x2PromoteLowF32x4(_) => Ok(PrimitiveTypeInfo::V128),
548+
549+
Lang::I8x16RelaxedSwizzle(_) => Ok(PrimitiveTypeInfo::V128),
550+
Lang::I32x4RelaxedTruncF32x4S(_) => Ok(PrimitiveTypeInfo::V128),
551+
Lang::I32x4RelaxedTruncF32x4U(_) => Ok(PrimitiveTypeInfo::V128),
552+
Lang::I32x4RelaxedTruncF64x2SZero(_) => Ok(PrimitiveTypeInfo::V128),
553+
Lang::I32x4RelaxedTruncF64x2UZero(_) => Ok(PrimitiveTypeInfo::V128),
554+
Lang::F32x4RelaxedMadd(_) => Ok(PrimitiveTypeInfo::V128),
555+
Lang::F32x4RelaxedNmadd(_) => Ok(PrimitiveTypeInfo::V128),
556+
Lang::F64x2RelaxedMadd(_) => Ok(PrimitiveTypeInfo::V128),
557+
Lang::F64x2RelaxedNmadd(_) => Ok(PrimitiveTypeInfo::V128),
558+
Lang::I8x16RelaxedLaneselect(_) => Ok(PrimitiveTypeInfo::V128),
559+
Lang::I16x8RelaxedLaneselect(_) => Ok(PrimitiveTypeInfo::V128),
560+
Lang::I32x4RelaxedLaneselect(_) => Ok(PrimitiveTypeInfo::V128),
561+
Lang::I64x2RelaxedLaneselect(_) => Ok(PrimitiveTypeInfo::V128),
562+
Lang::F32x4RelaxedMin(_) => Ok(PrimitiveTypeInfo::V128),
563+
Lang::F32x4RelaxedMax(_) => Ok(PrimitiveTypeInfo::V128),
564+
Lang::F64x2RelaxedMin(_) => Ok(PrimitiveTypeInfo::V128),
565+
Lang::F64x2RelaxedMax(_) => Ok(PrimitiveTypeInfo::V128),
566+
Lang::I16x8RelaxedQ15mulrS(_) => Ok(PrimitiveTypeInfo::V128),
567+
Lang::I16x8RelaxedDotI8x16I7x16S(_) => Ok(PrimitiveTypeInfo::V128),
568+
Lang::I32x4RelaxedDotI8x16I7x16AddS(_) => Ok(PrimitiveTypeInfo::V128),
548569
}
549570
}
550571
}

crates/wasm-mutate/src/mutators/peephole/eggsy/encoder/expr2wasm.rs

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -733,6 +733,35 @@ pub fn expr2wasm(
733733
Lang::F64x2ConvertLowI32x4U(_) => insn(Instruction::F64x2ConvertLowI32x4U),
734734
Lang::F32x4DemoteF64x2Zero(_) => insn(Instruction::F32x4DemoteF64x2Zero),
735735
Lang::F64x2PromoteLowF32x4(_) => insn(Instruction::F64x2PromoteLowF32x4),
736+
737+
Lang::I8x16RelaxedSwizzle(_) => insn(Instruction::I8x16RelaxedSwizzle),
738+
Lang::I32x4RelaxedTruncF32x4S(_) => insn(Instruction::I32x4RelaxedTruncF32x4S),
739+
Lang::I32x4RelaxedTruncF32x4U(_) => insn(Instruction::I32x4RelaxedTruncF32x4U),
740+
Lang::I32x4RelaxedTruncF64x2SZero(_) => {
741+
insn(Instruction::I32x4RelaxedTruncF64x2SZero)
742+
}
743+
Lang::I32x4RelaxedTruncF64x2UZero(_) => {
744+
insn(Instruction::I32x4RelaxedTruncF64x2UZero)
745+
}
746+
Lang::F32x4RelaxedMadd(_) => insn(Instruction::F32x4RelaxedMadd),
747+
Lang::F32x4RelaxedNmadd(_) => insn(Instruction::F32x4RelaxedNmadd),
748+
Lang::F64x2RelaxedMadd(_) => insn(Instruction::F64x2RelaxedMadd),
749+
Lang::F64x2RelaxedNmadd(_) => insn(Instruction::F64x2RelaxedNmadd),
750+
Lang::I8x16RelaxedLaneselect(_) => insn(Instruction::I8x16RelaxedLaneselect),
751+
Lang::I16x8RelaxedLaneselect(_) => insn(Instruction::I16x8RelaxedLaneselect),
752+
Lang::I32x4RelaxedLaneselect(_) => insn(Instruction::I32x4RelaxedLaneselect),
753+
Lang::I64x2RelaxedLaneselect(_) => insn(Instruction::I64x2RelaxedLaneselect),
754+
Lang::F32x4RelaxedMin(_) => insn(Instruction::F32x4RelaxedMin),
755+
Lang::F32x4RelaxedMax(_) => insn(Instruction::F32x4RelaxedMax),
756+
Lang::F64x2RelaxedMin(_) => insn(Instruction::F64x2RelaxedMin),
757+
Lang::F64x2RelaxedMax(_) => insn(Instruction::F64x2RelaxedMax),
758+
Lang::I16x8RelaxedQ15mulrS(_) => insn(Instruction::I16x8RelaxedQ15mulrS),
759+
Lang::I16x8RelaxedDotI8x16I7x16S(_) => {
760+
insn(Instruction::I16x8RelaxedDotI8x16I7x16S)
761+
}
762+
Lang::I32x4RelaxedDotI8x16I7x16AddS(_) => {
763+
insn(Instruction::I32x4RelaxedDotI8x16I7x16AddS)
764+
}
736765
}
737766
}
738767
}

crates/wasm-mutate/src/mutators/peephole/eggsy/lang.rs

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -919,6 +919,29 @@ lang! {
919919
F32x4DemoteF64x2Zero([Id; 1]) = "f32x4.demote_f64x2_zero",
920920
F64x2PromoteLowF32x4([Id; 1]) = "f64x2.promote_low_f32x4",
921921

922+
// relaxed-simd instructions
923+
924+
I8x16RelaxedSwizzle([Id; 2]) = "i8x16.relaxed_swizzle",
925+
I32x4RelaxedTruncF32x4S([Id; 1]) = "i32x4.relaxed_trunc_f32x4_s",
926+
I32x4RelaxedTruncF32x4U([Id; 1]) = "i32x4.relaxed_trunc_f32x4_u",
927+
I32x4RelaxedTruncF64x2SZero([Id; 1]) = "i32x4.relaxed_trunc_f64x2_s_zero",
928+
I32x4RelaxedTruncF64x2UZero([Id; 1]) = "i32x4.relaxed_trunc_f64x2_u_zero",
929+
F32x4RelaxedMadd([Id; 3]) = "f32x4.relaxed_madd",
930+
F32x4RelaxedNmadd([Id; 3]) = "f32x4.relaxed_nmadd",
931+
F64x2RelaxedMadd([Id; 3]) = "f64x2.relaxed_madd",
932+
F64x2RelaxedNmadd([Id; 3]) = "f64x2.relaxed_nmadd",
933+
I8x16RelaxedLaneselect([Id; 3]) = "i8x16.relaxed_laneselect",
934+
I16x8RelaxedLaneselect([Id; 3]) = "i16x8.relaxed_laneselect",
935+
I32x4RelaxedLaneselect([Id; 3]) = "i32x4.relaxed_laneselect",
936+
I64x2RelaxedLaneselect([Id; 3]) = "i64x2.relaxed_laneselect",
937+
F32x4RelaxedMin([Id; 2]) = "f32x4.relaxed_min",
938+
F32x4RelaxedMax([Id; 2]) = "f32x4.relaxed_max",
939+
F64x2RelaxedMin([Id; 2]) = "f64x2.relaxed_min",
940+
F64x2RelaxedMax([Id; 2]) = "f64x2.relaxed_max",
941+
I16x8RelaxedQ15mulrS([Id; 2]) = "i16x8.relaxed_q15_mulr_s",
942+
I16x8RelaxedDotI8x16I7x16S([Id; 2]) = "i16x8.relaxed_dot_i8x16_i7x16_s",
943+
I32x4RelaxedDotI8x16I7x16AddS([Id; 3]) = "i32x4.relaxed_dot_i8x16_i7x16_add_s",
944+
922945
/// Add custom or others operator nodes below
923946
924947
/// Custom mutation operations and instructions

0 commit comments

Comments
 (0)