1
1
//! `x86_64`'s Streaming SIMD Extensions 2 (SSE2)
2
2
3
- use v128:: * ;
3
+ use x86:: * ;
4
+ use simd_llvm:: * ;
4
5
5
6
#[ cfg( test) ]
6
7
use stdsimd_test:: assert_instr;
7
8
8
9
#[ allow( improper_ctypes) ]
9
10
extern "C" {
10
11
#[ link_name = "llvm.x86.sse2.cvtsd2si64" ]
11
- fn cvtsd2si64 ( a : f64x2 ) -> i64 ;
12
+ fn cvtsd2si64 ( a : __m128d ) -> i64 ;
12
13
#[ link_name = "llvm.x86.sse2.cvttsd2si64" ]
13
- fn cvttsd2si64 ( a : f64x2 ) -> i64 ;
14
+ fn cvttsd2si64 ( a : __m128d ) -> i64 ;
14
15
}
15
16
16
17
/// Convert the lower double-precision (64-bit) floating-point element in a to
17
18
/// a 64-bit integer.
18
19
#[ inline( always) ]
19
20
#[ target_feature( enable = "sse2" ) ]
20
21
#[ cfg_attr( test, assert_instr( cvtsd2si) ) ]
21
- pub unsafe fn _mm_cvtsd_si64 ( a : f64x2 ) -> i64 {
22
+ pub unsafe fn _mm_cvtsd_si64 ( a : __m128d ) -> i64 {
22
23
cvtsd2si64 ( a)
23
24
}
24
25
25
26
/// Alias for [`_mm_cvtsd_si64`](fn._mm_cvtsd_si64_ss.html).
26
27
#[ inline( always) ]
27
28
#[ target_feature( enable = "sse2" ) ]
28
29
#[ cfg_attr( test, assert_instr( cvtsd2si) ) ]
29
- pub unsafe fn _mm_cvtsd_si64x ( a : f64x2 ) -> i64 {
30
+ pub unsafe fn _mm_cvtsd_si64x ( a : __m128d ) -> i64 {
30
31
_mm_cvtsd_si64 ( a)
31
32
}
32
33
@@ -35,15 +36,15 @@ pub unsafe fn _mm_cvtsd_si64x(a: f64x2) -> i64 {
35
36
#[ inline( always) ]
36
37
#[ target_feature( enable = "sse2" ) ]
37
38
#[ cfg_attr( test, assert_instr( cvttsd2si) ) ]
38
- pub unsafe fn _mm_cvttsd_si64 ( a : f64x2 ) -> i64 {
39
+ pub unsafe fn _mm_cvttsd_si64 ( a : __m128d ) -> i64 {
39
40
cvttsd2si64 ( a)
40
41
}
41
42
42
43
/// Alias for [`_mm_cvttsd_si64`](fn._mm_cvttsd_si64_ss.html).
43
44
#[ inline( always) ]
44
45
#[ target_feature( enable = "sse2" ) ]
45
46
#[ cfg_attr( test, assert_instr( cvttsd2si) ) ]
46
- pub unsafe fn _mm_cvttsd_si64x ( a : f64x2 ) -> i64 {
47
+ pub unsafe fn _mm_cvttsd_si64x ( a : __m128d ) -> i64 {
47
48
_mm_cvttsd_si64 ( a)
48
49
}
49
50
@@ -63,32 +64,32 @@ pub unsafe fn _mm_stream_si64(mem_addr: *mut i64, a: i64) {
63
64
#[ inline( always) ]
64
65
#[ target_feature( enable = "sse2" ) ]
65
66
#[ cfg_attr( all( test, not( windows) ) , assert_instr( movq) ) ]
66
- pub unsafe fn _mm_cvtsi64_si128 ( a : i64 ) -> i64x2 {
67
- i64x2 :: new ( a , 0 )
67
+ pub unsafe fn _mm_cvtsi64_si128 ( a : i64 ) -> __m128i {
68
+ _mm_set_epi64x ( 0 , a )
68
69
}
69
70
70
71
/// Return a vector whose lowest element is `a` and all higher elements are
71
72
/// `0`.
72
73
#[ inline( always) ]
73
74
#[ target_feature( enable = "sse2" ) ]
74
75
#[ cfg_attr( all( test, not( windows) ) , assert_instr( movq) ) ]
75
- pub unsafe fn _mm_cvtsi64x_si128 ( a : i64 ) -> i64x2 {
76
+ pub unsafe fn _mm_cvtsi64x_si128 ( a : i64 ) -> __m128i {
76
77
_mm_cvtsi64_si128 ( a)
77
78
}
78
79
79
80
/// Return the lowest element of `a`.
80
81
#[ inline( always) ]
81
82
#[ target_feature( enable = "sse2" ) ]
82
83
#[ cfg_attr( all( test, not( windows) ) , assert_instr( movq) ) ]
83
- pub unsafe fn _mm_cvtsi128_si64 ( a : i64x2 ) -> i64 {
84
- a . extract ( 0 )
84
+ pub unsafe fn _mm_cvtsi128_si64 ( a : __m128i ) -> i64 {
85
+ simd_extract ( a , 0 )
85
86
}
86
87
87
88
/// Return the lowest element of `a`.
88
89
#[ inline( always) ]
89
90
#[ target_feature( enable = "sse2" ) ]
90
91
#[ cfg_attr( all( test, not( windows) ) , assert_instr( movq) ) ]
91
- pub unsafe fn _mm_cvtsi128_si64x ( a : i64x2 ) -> i64 {
92
+ pub unsafe fn _mm_cvtsi128_si64x ( a : __m128i ) -> i64 {
92
93
_mm_cvtsi128_si64 ( a)
93
94
}
94
95
@@ -97,85 +98,81 @@ pub unsafe fn _mm_cvtsi128_si64x(a: i64x2) -> i64 {
97
98
#[ inline( always) ]
98
99
#[ target_feature( enable = "sse2" ) ]
99
100
#[ cfg_attr( test, assert_instr( cvtsi2sd) ) ]
100
- pub unsafe fn _mm_cvtsi64_sd ( a : f64x2 , b : i64 ) -> f64x2 {
101
- a . replace ( 0 , b as f64 )
101
+ pub unsafe fn _mm_cvtsi64_sd ( a : __m128d , b : i64 ) -> __m128d {
102
+ simd_insert ( a , 0 , b as f64 )
102
103
}
103
104
104
105
/// Return `a` with its lower element replaced by `b` after converting it to
105
106
/// an `f64`.
106
107
#[ inline( always) ]
107
108
#[ target_feature( enable = "sse2" ) ]
108
109
#[ cfg_attr( test, assert_instr( cvtsi2sd) ) ]
109
- pub unsafe fn _mm_cvtsi64x_sd ( a : f64x2 , b : i64 ) -> f64x2 {
110
+ pub unsafe fn _mm_cvtsi64x_sd ( a : __m128d , b : i64 ) -> __m128d {
110
111
_mm_cvtsi64_sd ( a, b)
111
112
}
112
113
113
114
#[ cfg( test) ]
114
115
mod tests {
116
+ use std:: { f64, i64} ;
117
+
115
118
use stdsimd_test:: simd_test;
116
119
117
- use v128:: * ;
118
- use x86:: x86_64:: sse2;
120
+ use x86:: * ;
119
121
120
122
#[ simd_test = "sse2" ]
121
- unsafe fn _mm_cvtsd_si64 ( ) {
122
- use std:: { f64, i64} ;
123
+ unsafe fn test_mm_cvtsd_si64 ( ) {
123
124
124
- let r = sse2 :: _mm_cvtsd_si64 ( f64x2 :: new ( -2.0 , 5.0 ) ) ;
125
+ let r = _mm_cvtsd_si64 ( _mm_setr_pd ( -2.0 , 5.0 ) ) ;
125
126
assert_eq ! ( r, -2_i64 ) ;
126
127
127
- let r = sse2 :: _mm_cvtsd_si64 ( f64x2 :: new ( f64:: MAX , f64:: MIN ) ) ;
128
+ let r = _mm_cvtsd_si64 ( _mm_setr_pd ( f64:: MAX , f64:: MIN ) ) ;
128
129
assert_eq ! ( r, i64 :: MIN ) ;
129
130
}
130
131
131
132
#[ simd_test = "sse2" ]
132
- unsafe fn _mm_cvtsd_si64x ( ) {
133
- use std:: { f64, i64} ;
134
-
135
- let r = sse2:: _mm_cvtsd_si64x ( f64x2:: new ( f64:: NAN , f64:: NAN ) ) ;
133
+ unsafe fn test_mm_cvtsd_si64x ( ) {
134
+ let r = _mm_cvtsd_si64x ( _mm_setr_pd ( f64:: NAN , f64:: NAN ) ) ;
136
135
assert_eq ! ( r, i64 :: MIN ) ;
137
136
}
138
137
139
138
#[ simd_test = "sse2" ]
140
- unsafe fn _mm_cvttsd_si64 ( ) {
141
- let a = f64x2 :: new ( -1.1 , 2.2 ) ;
142
- let r = sse2 :: _mm_cvttsd_si64 ( a) ;
139
+ unsafe fn test_mm_cvttsd_si64 ( ) {
140
+ let a = _mm_setr_pd ( -1.1 , 2.2 ) ;
141
+ let r = _mm_cvttsd_si64 ( a) ;
143
142
assert_eq ! ( r, -1_i64 ) ;
144
143
}
145
144
146
145
#[ simd_test = "sse2" ]
147
- unsafe fn _mm_cvttsd_si64x ( ) {
148
- use std:: { f64, i64} ;
149
-
150
- let a = f64x2:: new ( f64:: NEG_INFINITY , f64:: NAN ) ;
151
- let r = sse2:: _mm_cvttsd_si64x ( a) ;
146
+ unsafe fn test_mm_cvttsd_si64x ( ) {
147
+ let a = _mm_setr_pd ( f64:: NEG_INFINITY , f64:: NAN ) ;
148
+ let r = _mm_cvttsd_si64x ( a) ;
152
149
assert_eq ! ( r, i64 :: MIN ) ;
153
150
}
154
151
155
152
#[ simd_test = "sse2" ]
156
- unsafe fn _mm_stream_si64 ( ) {
153
+ unsafe fn test_mm_stream_si64 ( ) {
157
154
let a: i64 = 7 ;
158
155
let mut mem = :: std:: boxed:: Box :: < i64 > :: new ( -1 ) ;
159
- sse2 :: _mm_stream_si64 ( & mut * mem as * mut i64 , a) ;
156
+ _mm_stream_si64 ( & mut * mem as * mut i64 , a) ;
160
157
assert_eq ! ( a, * mem) ;
161
158
}
162
159
163
160
#[ simd_test = "sse2" ]
164
- unsafe fn _mm_cvtsi64_si128 ( ) {
165
- let r = sse2 :: _mm_cvtsi64_si128 ( 5 ) ;
166
- assert_eq ! ( r, i64x2 :: new ( 5 , 0 ) ) ;
161
+ unsafe fn test_mm_cvtsi64_si128 ( ) {
162
+ let r = _mm_cvtsi64_si128 ( 5 ) ;
163
+ assert_eq ! ( r, _mm_setr_epi64x ( 5 , 0 ) ) ;
167
164
}
168
165
169
166
#[ simd_test = "sse2" ]
170
- unsafe fn _mm_cvtsi128_si64 ( ) {
171
- let r = sse2 :: _mm_cvtsi128_si64 ( i64x2 :: new ( 5 , 0 ) ) ;
167
+ unsafe fn test_mm_cvtsi128_si64 ( ) {
168
+ let r = _mm_cvtsi128_si64 ( _mm_setr_epi64x ( 5 , 0 ) ) ;
172
169
assert_eq ! ( r, 5 ) ;
173
170
}
174
171
175
172
#[ simd_test = "sse2" ]
176
- unsafe fn _mm_cvtsi64_sd ( ) {
177
- let a = f64x2 :: splat ( 3.5 ) ;
178
- let r = sse2 :: _mm_cvtsi64_sd ( a, 5 ) ;
179
- assert_eq ! ( r, f64x2 :: new ( 5.0 , 3.5 ) ) ;
173
+ unsafe fn test_mm_cvtsi64_sd ( ) {
174
+ let a = _mm_set1_pd ( 3.5 ) ;
175
+ let r = _mm_cvtsi64_sd ( a, 5 ) ;
176
+ assert_eq_m128d ( r, _mm_setr_pd ( 5.0 , 3.5 ) ) ;
180
177
}
181
178
}
0 commit comments