@@ -324,15 +324,19 @@ instructions! {
324324 ( Some ( simd_v128_f32_on_stack) , f32x4_replace_lane) ,
325325 ( Some ( simd_v128_on_stack) , f64x2_extract_lane) ,
326326 ( Some ( simd_v128_f64_on_stack) , f64x2_replace_lane) ,
327- ( Some ( simd_v128_v128_on_stack) , i8x16_swizzle) ,
328327 ( Some ( simd_i32_on_stack) , i8x16_splat) ,
329328 ( Some ( simd_i32_on_stack) , i16x8_splat) ,
330329 ( Some ( simd_i32_on_stack) , i32x4_splat) ,
331330 ( Some ( simd_i64_on_stack) , i64x2_splat) ,
332331 ( Some ( simd_f32_on_stack) , f32x4_splat) ,
333332 ( Some ( simd_f64_on_stack) , f64x2_splat) ,
334333 ( Some ( simd_v128_v128_on_stack) , i8x16_swizzle) ,
334+ ( Some ( simd_v128_v128_on_stack_relaxed) , i8x16_swizzle_relaxed) ,
335335 ( Some ( simd_v128_v128_v128_on_stack) , v128_bitselect) ,
336+ ( Some ( simd_v128_v128_v128_on_stack_relaxed) , i8x16_laneselect) ,
337+ ( Some ( simd_v128_v128_v128_on_stack_relaxed) , i16x8_laneselect) ,
338+ ( Some ( simd_v128_v128_v128_on_stack_relaxed) , i32x4_laneselect) ,
339+ ( Some ( simd_v128_v128_v128_on_stack_relaxed) , i64x2_laneselect) ,
336340 ( Some ( simd_v128_v128_on_stack) , i8x16_eq) ,
337341 ( Some ( simd_v128_v128_on_stack) , i8x16_ne) ,
338342 ( Some ( simd_v128_v128_on_stack) , i8x16_lt_s) ,
@@ -523,6 +527,18 @@ instructions! {
523527 ( Some ( simd_v128_on_stack) , f64x2_convert_low_i32x4u) ,
524528 ( Some ( simd_v128_on_stack) , f32x4_demote_f64x2_zero) ,
525529 ( Some ( simd_v128_on_stack) , f64x2_promote_low_f32x4) ,
530+ ( Some ( simd_v128_on_stack_relaxed) , i32x4_trunc_sat_f32x4s_relaxed) ,
531+ ( Some ( simd_v128_on_stack_relaxed) , i32x4_trunc_sat_f32x4u_relaxed) ,
532+ ( Some ( simd_v128_on_stack_relaxed) , i32x4_trunc_sat_f64x2s_zero_relaxed) ,
533+ ( Some ( simd_v128_on_stack_relaxed) , i32x4_trunc_sat_f64x2u_zero_relaxed) ,
534+ ( Some ( simd_v128_v128_on_stack_relaxed) , f32x4_fma_relaxed) ,
535+ ( Some ( simd_v128_v128_on_stack_relaxed) , f32x4_fms_relaxed) ,
536+ ( Some ( simd_v128_v128_on_stack_relaxed) , f64x2_fma_relaxed) ,
537+ ( Some ( simd_v128_v128_on_stack_relaxed) , f64x2_fms_relaxed) ,
538+ ( Some ( simd_v128_v128_on_stack_relaxed) , f32x4_min_relaxed) ,
539+ ( Some ( simd_v128_v128_on_stack_relaxed) , f32x4_max_relaxed) ,
540+ ( Some ( simd_v128_v128_on_stack_relaxed) , f64x2_min_relaxed) ,
541+ ( Some ( simd_v128_v128_on_stack_relaxed) , f64x2_max_relaxed) ,
526542}
527543
528544pub ( crate ) struct CodeBuilderAllocations {
@@ -3420,17 +3436,33 @@ fn simd_v128_on_stack(module: &Module, builder: &mut CodeBuilder) -> bool {
34203436 module. config . simd_enabled ( ) && builder. types_on_stack ( & [ ValType :: V128 ] )
34213437}
34223438
3439+ #[ inline]
3440+ fn simd_v128_on_stack_relaxed ( module : & Module , builder : & mut CodeBuilder ) -> bool {
3441+ module. config . relaxed_simd_enabled ( ) && builder. types_on_stack ( & [ ValType :: V128 ] )
3442+ }
3443+
34233444#[ inline]
34243445fn simd_v128_v128_on_stack ( module : & Module , builder : & mut CodeBuilder ) -> bool {
34253446 module. config . simd_enabled ( ) && builder. types_on_stack ( & [ ValType :: V128 , ValType :: V128 ] )
34263447}
34273448
3449+ #[ inline]
3450+ fn simd_v128_v128_on_stack_relaxed ( module : & Module , builder : & mut CodeBuilder ) -> bool {
3451+ module. config . relaxed_simd_enabled ( ) && builder. types_on_stack ( & [ ValType :: V128 , ValType :: V128 ] )
3452+ }
3453+
34283454#[ inline]
34293455fn simd_v128_v128_v128_on_stack ( module : & Module , builder : & mut CodeBuilder ) -> bool {
34303456 module. config . simd_enabled ( )
34313457 && builder. types_on_stack ( & [ ValType :: V128 , ValType :: V128 , ValType :: V128 ] )
34323458}
34333459
3460+ #[ inline]
3461+ fn simd_v128_v128_v128_on_stack_relaxed ( module : & Module , builder : & mut CodeBuilder ) -> bool {
3462+ module. config . relaxed_simd_enabled ( )
3463+ && builder. types_on_stack ( & [ ValType :: V128 , ValType :: V128 , ValType :: V128 ] )
3464+ }
3465+
34343466#[ inline]
34353467fn simd_v128_i32_on_stack ( module : & Module , builder : & mut CodeBuilder ) -> bool {
34363468 module. config . simd_enabled ( ) && builder. types_on_stack ( & [ ValType :: V128 , ValType :: I32 ] )
@@ -3657,6 +3689,20 @@ macro_rules! simd_unop {
36573689 } ;
36583690}
36593691
3692+ macro_rules! simd_ternop {
3693+ ( $instruction: ident, $generator_fn_name: ident) => {
3694+ fn $generator_fn_name(
3695+ _: & mut Unstructured ,
3696+ _: & Module ,
3697+ builder: & mut CodeBuilder ,
3698+ ) -> Result <Instruction > {
3699+ builder. pop_operands( & [ ValType :: V128 , ValType :: V128 , ValType :: V128 ] ) ;
3700+ builder. push_operands( & [ ValType :: V128 ] ) ;
3701+ Ok ( Instruction :: $instruction)
3702+ }
3703+ } ;
3704+ }
3705+
36603706macro_rules! simd_shift {
36613707 ( $instruction: ident, $generator_fn_name: ident) => {
36623708 fn $generator_fn_name(
@@ -3868,13 +3914,27 @@ simd_unop!(F64x2ConvertLowI32x4S, f64x2_convert_low_i32x4s);
38683914simd_unop ! ( F64x2ConvertLowI32x4U , f64x2_convert_low_i32x4u) ;
38693915simd_unop ! ( F32x4DemoteF64x2Zero , f32x4_demote_f64x2_zero) ;
38703916simd_unop ! ( F64x2PromoteLowF32x4 , f64x2_promote_low_f32x4) ;
3871-
3872- fn v128_bitselect (
3873- _: & mut Unstructured ,
3874- _: & Module ,
3875- builder : & mut CodeBuilder ,
3876- ) -> Result < Instruction > {
3877- builder. pop_operands ( & [ ValType :: V128 , ValType :: V128 , ValType :: V128 ] ) ;
3878- builder. push_operands ( & [ ValType :: V128 ] ) ;
3879- Ok ( Instruction :: V128Bitselect )
3880- }
3917+ simd_ternop ! ( V128Bitselect , v128_bitselect) ;
3918+ simd_binop ! ( I8x16SwizzleRelaxed , i8x16_swizzle_relaxed) ;
3919+ simd_unop ! ( I32x4TruncSatF32x4SRelaxed , i32x4_trunc_sat_f32x4s_relaxed) ;
3920+ simd_unop ! ( I32x4TruncSatF32x4URelaxed , i32x4_trunc_sat_f32x4u_relaxed) ;
3921+ simd_unop ! (
3922+ I32x4TruncSatF64x2SZeroRelaxed ,
3923+ i32x4_trunc_sat_f64x2s_zero_relaxed
3924+ ) ;
3925+ simd_unop ! (
3926+ I32x4TruncSatF64x2UZeroRelaxed ,
3927+ i32x4_trunc_sat_f64x2u_zero_relaxed
3928+ ) ;
3929+ simd_binop ! ( F32x4FmaRelaxed , f32x4_fma_relaxed) ;
3930+ simd_binop ! ( F32x4FmsRelaxed , f32x4_fms_relaxed) ;
3931+ simd_binop ! ( F64x2FmaRelaxed , f64x2_fma_relaxed) ;
3932+ simd_binop ! ( F64x2FmsRelaxed , f64x2_fms_relaxed) ;
3933+ simd_ternop ! ( I8x16LaneSelect , i8x16_laneselect) ;
3934+ simd_ternop ! ( I16x8LaneSelect , i16x8_laneselect) ;
3935+ simd_ternop ! ( I32x4LaneSelect , i32x4_laneselect) ;
3936+ simd_ternop ! ( I64x2LaneSelect , i64x2_laneselect) ;
3937+ simd_binop ! ( F32x4MinRelaxed , f32x4_min_relaxed) ;
3938+ simd_binop ! ( F32x4MaxRelaxed , f32x4_max_relaxed) ;
3939+ simd_binop ! ( F64x2MinRelaxed , f64x2_min_relaxed) ;
3940+ simd_binop ! ( F64x2MaxRelaxed , f64x2_max_relaxed) ;
0 commit comments