Skip to content

Commit 982e213

Browse files
committed
wasm: use intrinsics::simd for the narrow functions
1 parent 9040e2f commit 982e213

1 file changed

Lines changed: 60 additions & 12 deletions

File tree

crates/core_arch/src/wasm32/simd128.rs

Lines changed: 60 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -86,10 +86,6 @@ unsafe extern "unadjusted" {
8686
fn llvm_i8x16_all_true(x: simd::i8x16) -> i32;
8787
#[link_name = "llvm.wasm.bitmask.v16i8"]
8888
fn llvm_bitmask_i8x16(a: simd::i8x16) -> i32;
89-
#[link_name = "llvm.wasm.narrow.signed.v16i8.v8i16"]
90-
fn llvm_narrow_i8x16_s(a: simd::i16x8, b: simd::i16x8) -> simd::i8x16;
91-
#[link_name = "llvm.wasm.narrow.unsigned.v16i8.v8i16"]
92-
fn llvm_narrow_i8x16_u(a: simd::i16x8, b: simd::i16x8) -> simd::i8x16;
9389
#[link_name = "llvm.wasm.avgr.unsigned.v16i8"]
9490
fn llvm_avgr_u_i8x16(a: simd::i8x16, b: simd::i8x16) -> simd::i8x16;
9591

@@ -103,10 +99,6 @@ unsafe extern "unadjusted" {
10399
fn llvm_i16x8_all_true(x: simd::i16x8) -> i32;
104100
#[link_name = "llvm.wasm.bitmask.v8i16"]
105101
fn llvm_bitmask_i16x8(a: simd::i16x8) -> i32;
106-
#[link_name = "llvm.wasm.narrow.signed.v8i16.v4i32"]
107-
fn llvm_narrow_i16x8_s(a: simd::i32x4, b: simd::i32x4) -> simd::i16x8;
108-
#[link_name = "llvm.wasm.narrow.unsigned.v8i16.v4i32"]
109-
fn llvm_narrow_i16x8_u(a: simd::i32x4, b: simd::i32x4) -> simd::i16x8;
110102
#[link_name = "llvm.wasm.avgr.unsigned.v8i16"]
111103
fn llvm_avgr_u_i16x8(a: simd::i16x8, b: simd::i16x8) -> simd::i16x8;
112104

@@ -2281,7 +2273,23 @@ pub use i8x16_bitmask as u8x16_bitmask;
22812273
#[doc(alias("i8x16.narrow_i16x8_s"))]
22822274
#[stable(feature = "wasm_simd", since = "1.54.0")]
22832275
pub fn i8x16_narrow_i16x8(a: v128, b: v128) -> v128 {
2284-
unsafe { llvm_narrow_i8x16_s(a.as_i16x8(), b.as_i16x8()).v128() }
2276+
unsafe {
2277+
let v: simd::i16x16 = simd_shuffle!(
2278+
a.as_i16x8(),
2279+
b.as_i16x8(),
2280+
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]
2281+
);
2282+
2283+
let max = simd_splat(i16::from(i8::MAX));
2284+
let min = simd_splat(i16::from(i8::MIN));
2285+
2286+
let v = simd_select(simd_gt::<_, simd::i16x16>(v, max), max, v);
2287+
let v = simd_select(simd_lt::<_, simd::i16x16>(v, min), min, v);
2288+
2289+
let v: simd::i8x16 = simd_cast(v);
2290+
2291+
v.v128()
2292+
}
22852293
}
22862294

22872295
/// Converts two input vectors into a smaller lane vector by narrowing each
@@ -2295,7 +2303,23 @@ pub fn i8x16_narrow_i16x8(a: v128, b: v128) -> v128 {
22952303
#[doc(alias("i8x16.narrow_i16x8_u"))]
22962304
#[stable(feature = "wasm_simd", since = "1.54.0")]
22972305
pub fn u8x16_narrow_i16x8(a: v128, b: v128) -> v128 {
2298-
unsafe { llvm_narrow_i8x16_u(a.as_i16x8(), b.as_i16x8()).v128() }
2306+
unsafe {
2307+
let v: simd::i16x16 = simd_shuffle!(
2308+
a.as_i16x8(),
2309+
b.as_i16x8(),
2310+
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]
2311+
);
2312+
2313+
let max = simd_splat(i16::from(u8::MAX));
2314+
let min = simd_splat(i16::from(u8::MIN));
2315+
2316+
let v = simd_select(simd_gt::<_, simd::i16x16>(v, max), max, v);
2317+
let v = simd_select(simd_lt::<_, simd::i16x16>(v, min), min, v);
2318+
2319+
let v: simd::u8x16 = simd_cast(v);
2320+
2321+
v.v128()
2322+
}
22992323
}
23002324

23012325
/// Shifts each lane to the left by the specified number of bits.
@@ -2593,7 +2617,19 @@ pub use i16x8_bitmask as u16x8_bitmask;
25932617
#[doc(alias("i16x8.narrow_i32x4_s"))]
25942618
#[stable(feature = "wasm_simd", since = "1.54.0")]
25952619
pub fn i16x8_narrow_i32x4(a: v128, b: v128) -> v128 {
2596-
unsafe { llvm_narrow_i16x8_s(a.as_i32x4(), b.as_i32x4()).v128() }
2620+
unsafe {
2621+
let v: simd::i32x8 = simd_shuffle!(a, b, [0, 1, 2, 3, 4, 5, 6, 7]);
2622+
2623+
let max = simd_splat(i32::from(i16::MAX));
2624+
let min = simd_splat(i32::from(i16::MIN));
2625+
2626+
let v = simd_select(simd_gt::<_, simd::i32x8>(v, max), max, v);
2627+
let v = simd_select(simd_lt::<_, simd::i32x8>(v, min), min, v);
2628+
2629+
let v: simd::i16x8 = simd_cast(v);
2630+
2631+
v.v128()
2632+
}
25972633
}
25982634

25992635
/// Converts two input vectors into a smaller lane vector by narrowing each
@@ -2607,7 +2643,19 @@ pub fn i16x8_narrow_i32x4(a: v128, b: v128) -> v128 {
26072643
#[doc(alias("i16x8.narrow_i32x4_u"))]
26082644
#[stable(feature = "wasm_simd", since = "1.54.0")]
26092645
pub fn u16x8_narrow_i32x4(a: v128, b: v128) -> v128 {
2610-
unsafe { llvm_narrow_i16x8_u(a.as_i32x4(), b.as_i32x4()).v128() }
2646+
unsafe {
2647+
let v: simd::i32x8 = simd_shuffle!(a, b, [0, 1, 2, 3, 4, 5, 6, 7]);
2648+
2649+
let max = simd_splat(i32::from(u16::MAX));
2650+
let min = simd_splat(i32::from(u16::MIN));
2651+
2652+
let v = simd_select(simd_gt::<_, simd::i32x8>(v, max), max, v);
2653+
let v = simd_select(simd_lt::<_, simd::i32x8>(v, min), min, v);
2654+
2655+
let v: simd::u16x8 = simd_cast(v);
2656+
2657+
v.v128()
2658+
}
26112659
}
26122660

26132661
/// Converts low half of the smaller lane vector to a larger lane

0 commit comments

Comments
 (0)