1
1
//! Streaming SIMD Extensions 3 (SSE3)
2
2
3
3
use crate :: {
4
- core_arch:: { simd:: * , simd_llvm:: simd_shuffle , x86:: * } ,
4
+ core_arch:: { simd:: * , simd_llvm:: * , x86:: * } ,
5
5
mem:: transmute,
6
6
} ;
7
7
@@ -17,7 +17,11 @@ use stdarch_test::assert_instr;
17
17
#[ cfg_attr( test, assert_instr( addsubps) ) ]
18
18
#[ stable( feature = "simd_x86" , since = "1.27.0" ) ]
19
19
pub unsafe fn _mm_addsub_ps ( a : __m128 , b : __m128 ) -> __m128 {
20
- addsubps ( a, b)
20
+ let a = a. as_f32x4 ( ) ;
21
+ let b = b. as_f32x4 ( ) ;
22
+ let add = simd_add ( a, b) ;
23
+ let sub = simd_sub ( a, b) ;
24
+ simd_shuffle ! ( add, sub, [ 4 , 1 , 6 , 3 ] )
21
25
}
22
26
23
27
/// Alternatively add and subtract packed double-precision (64-bit)
@@ -29,7 +33,11 @@ pub unsafe fn _mm_addsub_ps(a: __m128, b: __m128) -> __m128 {
29
33
#[ cfg_attr( test, assert_instr( addsubpd) ) ]
30
34
#[ stable( feature = "simd_x86" , since = "1.27.0" ) ]
31
35
pub unsafe fn _mm_addsub_pd ( a : __m128d , b : __m128d ) -> __m128d {
32
- addsubpd ( a, b)
36
+ let a = a. as_f64x2 ( ) ;
37
+ let b = b. as_f64x2 ( ) ;
38
+ let add = simd_add ( a, b) ;
39
+ let sub = simd_sub ( a, b) ;
40
+ simd_shuffle ! ( add, sub, [ 2 , 1 ] )
33
41
}
34
42
35
43
/// Horizontally adds adjacent pairs of double-precision (64-bit)
@@ -143,10 +151,6 @@ pub unsafe fn _mm_moveldup_ps(a: __m128) -> __m128 {
143
151
144
152
#[ allow( improper_ctypes) ]
145
153
extern "C" {
146
- #[ link_name = "llvm.x86.sse3.addsub.ps" ]
147
- fn addsubps ( a : __m128 , b : __m128 ) -> __m128 ;
148
- #[ link_name = "llvm.x86.sse3.addsub.pd" ]
149
- fn addsubpd ( a : __m128d , b : __m128d ) -> __m128d ;
150
154
#[ link_name = "llvm.x86.sse3.hadd.pd" ]
151
155
fn haddpd ( a : __m128d , b : __m128d ) -> __m128d ;
152
156
#[ link_name = "llvm.x86.sse3.hadd.ps" ]
0 commit comments