Skip to content

Commit 63ce56e

Browse files
committed
wasm: use intrinsics::simd for dot product
1 parent ca218e5 commit 63ce56e

File tree

1 file changed

+8
-3
lines changed

1 file changed

+8
-3
lines changed

crates/core_arch/src/wasm32/simd128.rs

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -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")]
33443342
pub 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

Comments
 (0)