core/stdarch/crates/core_arch/src/x86_64/
sse2.rs1use crate::core_arch::x86::*;
4
5#[cfg(test)]
6use stdarch_test::assert_instr;
7
8#[allow(improper_ctypes)]
9unsafe extern "C" {
10 #[link_name = "llvm.x86.sse2.cvtsd2si64"]
11 fn cvtsd2si64(a: __m128d) -> i64;
12 #[link_name = "llvm.x86.sse2.cvttsd2si64"]
13 fn cvttsd2si64(a: __m128d) -> i64;
14}
15
16#[inline]
21#[target_feature(enable = "sse2")]
22#[cfg_attr(test, assert_instr(cvtsd2si))]
23#[stable(feature = "simd_x86", since = "1.27.0")]
24pub fn _mm_cvtsd_si64(a: __m128d) -> i64 {
25 unsafe { cvtsd2si64(a) }
26}
27
28#[inline]
32#[target_feature(enable = "sse2")]
33#[cfg_attr(test, assert_instr(cvtsd2si))]
34#[stable(feature = "simd_x86", since = "1.27.0")]
35pub fn _mm_cvtsd_si64x(a: __m128d) -> i64 {
36 _mm_cvtsd_si64(a)
37}
38
39#[inline]
44#[target_feature(enable = "sse2")]
45#[cfg_attr(test, assert_instr(cvttsd2si))]
46#[stable(feature = "simd_x86", since = "1.27.0")]
47pub fn _mm_cvttsd_si64(a: __m128d) -> i64 {
48 unsafe { cvttsd2si64(a) }
49}
50
51#[inline]
55#[target_feature(enable = "sse2")]
56#[cfg_attr(test, assert_instr(cvttsd2si))]
57#[stable(feature = "simd_x86", since = "1.27.0")]
58pub fn _mm_cvttsd_si64x(a: __m128d) -> i64 {
59 _mm_cvttsd_si64(a)
60}
61
62#[inline]
77#[target_feature(enable = "sse2")]
78#[cfg_attr(test, assert_instr(movnti))]
79#[stable(feature = "simd_x86", since = "1.27.0")]
80pub unsafe fn _mm_stream_si64(mem_addr: *mut i64, a: i64) {
81 crate::arch::asm!(
83 vps!("movnti", ",{a}"),
84 p = in(reg) mem_addr,
85 a = in(reg) a,
86 options(nostack, preserves_flags),
87 );
88}
89
90#[inline]
95#[target_feature(enable = "sse2")]
96#[cfg_attr(test, assert_instr(movq))]
97#[stable(feature = "simd_x86", since = "1.27.0")]
98#[rustc_const_unstable(feature = "stdarch_const_x86", issue = "149298")]
99pub const fn _mm_cvtsi64_si128(a: i64) -> __m128i {
100 _mm_set_epi64x(0, a)
101}
102
103#[inline]
108#[target_feature(enable = "sse2")]
109#[cfg_attr(test, assert_instr(movq))]
110#[stable(feature = "simd_x86", since = "1.27.0")]
111#[rustc_const_unstable(feature = "stdarch_const_x86", issue = "149298")]
112pub const fn _mm_cvtsi64x_si128(a: i64) -> __m128i {
113 _mm_cvtsi64_si128(a)
114}
115
116#[inline]
120#[target_feature(enable = "sse2")]
121#[cfg_attr(test, assert_instr(movq))]
122#[stable(feature = "simd_x86", since = "1.27.0")]
123#[rustc_const_unstable(feature = "stdarch_const_x86", issue = "149298")]
124pub const fn _mm_cvtsi128_si64(a: __m128i) -> i64 {
125 unsafe { simd_extract!(a.as_i64x2(), 0) }
126}
127
128#[inline]
132#[target_feature(enable = "sse2")]
133#[cfg_attr(test, assert_instr(movq))]
134#[stable(feature = "simd_x86", since = "1.27.0")]
135#[rustc_const_unstable(feature = "stdarch_const_x86", issue = "149298")]
136pub const fn _mm_cvtsi128_si64x(a: __m128i) -> i64 {
137 _mm_cvtsi128_si64(a)
138}
139
140#[inline]
145#[target_feature(enable = "sse2")]
146#[cfg_attr(test, assert_instr(cvtsi2sd))]
147#[stable(feature = "simd_x86", since = "1.27.0")]
148#[rustc_const_unstable(feature = "stdarch_const_x86", issue = "149298")]
149pub const fn _mm_cvtsi64_sd(a: __m128d, b: i64) -> __m128d {
150 unsafe { simd_insert!(a, 0, b as f64) }
151}
152
153#[inline]
158#[target_feature(enable = "sse2")]
159#[cfg_attr(test, assert_instr(cvtsi2sd))]
160#[stable(feature = "simd_x86", since = "1.27.0")]
161#[rustc_const_unstable(feature = "stdarch_const_x86", issue = "149298")]
162pub const fn _mm_cvtsi64x_sd(a: __m128d, b: i64) -> __m128d {
163 _mm_cvtsi64_sd(a, b)
164}
165
166#[cfg(test)]
167mod tests {
168 use crate::core_arch::arch::x86_64::*;
169 use crate::core_arch::assert_eq_const as assert_eq;
170 use std::boxed;
171 use std::ptr;
172 use stdarch_test::simd_test;
173
174 #[simd_test(enable = "sse2")]
175 fn test_mm_cvtsd_si64() {
176 let r = _mm_cvtsd_si64(_mm_setr_pd(-2.0, 5.0));
177 assert_eq!(r, -2_i64);
178
179 let r = _mm_cvtsd_si64(_mm_setr_pd(f64::MAX, f64::MIN));
180 assert_eq!(r, i64::MIN);
181 }
182
183 #[simd_test(enable = "sse2")]
184 fn test_mm_cvtsd_si64x() {
185 let r = _mm_cvtsd_si64x(_mm_setr_pd(f64::NAN, f64::NAN));
186 assert_eq!(r, i64::MIN);
187 }
188
189 #[simd_test(enable = "sse2")]
190 fn test_mm_cvttsd_si64() {
191 let a = _mm_setr_pd(-1.1, 2.2);
192 let r = _mm_cvttsd_si64(a);
193 assert_eq!(r, -1_i64);
194 }
195
196 #[simd_test(enable = "sse2")]
197 fn test_mm_cvttsd_si64x() {
198 let a = _mm_setr_pd(f64::NEG_INFINITY, f64::NAN);
199 let r = _mm_cvttsd_si64x(a);
200 assert_eq!(r, i64::MIN);
201 }
202
203 #[simd_test(enable = "sse2")]
204 #[cfg_attr(miri, ignore)]
207 fn test_mm_stream_si64() {
208 let a: i64 = 7;
209 let mut mem = boxed::Box::<i64>::new(-1);
210 unsafe {
211 _mm_stream_si64(ptr::addr_of_mut!(*mem), a);
212 }
213 _mm_sfence();
214 assert_eq!(a, *mem);
215 }
216
217 #[simd_test(enable = "sse2")]
218 const fn test_mm_cvtsi64_si128() {
219 let r = _mm_cvtsi64_si128(5);
220 assert_eq_m128i(r, _mm_setr_epi64x(5, 0));
221 }
222
223 #[simd_test(enable = "sse2")]
224 const fn test_mm_cvtsi128_si64() {
225 let r = _mm_cvtsi128_si64(_mm_setr_epi64x(5, 0));
226 assert_eq!(r, 5);
227 }
228
229 #[simd_test(enable = "sse2")]
230 const fn test_mm_cvtsi64_sd() {
231 let a = _mm_set1_pd(3.5);
232 let r = _mm_cvtsi64_sd(a, 5);
233 assert_eq_m128d(r, _mm_setr_pd(5.0, 3.5));
234 }
235}