@@ -110,8 +110,6 @@ unsafe extern "unadjusted" {
110110 fn llvm_i32x4_all_true ( x : simd:: i32x4 ) -> i32 ;
111111 #[ link_name = "llvm.wasm.bitmask.v4i32" ]
112112 fn llvm_bitmask_i32x4 ( a : simd:: i32x4 ) -> i32 ;
113- #[ link_name = "llvm.wasm.dot" ]
114- fn llvm_i32x4_dot_i16x8_s ( a : simd:: i16x8 , b : simd:: i16x8 ) -> simd:: i32x4 ;
115113
116114 #[ link_name = "llvm.wasm.alltrue.v2i64" ]
117115 fn llvm_i64x2_all_true ( x : simd:: i64x2 ) -> i32 ;
@@ -3342,7 +3340,14 @@ pub fn u32x4_max(a: v128, b: v128) -> v128 {
33423340#[ doc( alias( "i32x4.dot_i16x8_s" ) ) ]
33433341#[ stable( feature = "wasm_simd" , since = "1.54.0" ) ]
33443342pub fn i32x4_dot_i16x8 ( a : v128 , b : v128 ) -> v128 {
3345- unsafe { llvm_i32x4_dot_i16x8_s ( a. as_i16x8 ( ) , b. as_i16x8 ( ) ) . v128 ( ) }
3343+ unsafe {
3344+ let prod: i32x8 = simd_mul ( simd_cast ( a. as_i16x8 ( ) ) , simd_cast ( b. as_i16x8 ( ) ) ) ;
3345+
3346+ let evens: simd:: i32x4 = simd_shuffle ! ( prod, prod, [ 0 , 2 , 4 , 6 ] ) ;
3347+ let odds: simd:: i32x4 = simd_shuffle ! ( prod, prod, [ 1 , 3 , 5 , 7 ] ) ;
3348+
3349+ simd_add ( evens, odds) . v128 ( )
3350+ }
33463351}
33473352
33483353/// Lane-wise integer extended multiplication producing twice wider result than
0 commit comments