@@ -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" ) ]
22832275pub 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" ) ]
22972305pub 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" ) ]
25952619pub 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" ) ]
26092645pub 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