1use crate::core_arch::x86::*;
2#[cfg(test)]
3use stdarch_test::assert_instr;
4
5#[inline]
11#[target_feature(enable = "avx512fp16")]
12#[cfg_attr(test, assert_instr(vcvtsi2sh))]
13#[unstable(feature = "stdarch_x86_avx512_f16", issue = "127213")]
14pub unsafe fn _mm_cvti64_sh(a: __m128h, b: i64) -> __m128h {
15 vcvtsi642sh(a, b, _MM_FROUND_CUR_DIRECTION)
16}
17
18#[inline]
32#[target_feature(enable = "avx512fp16")]
33#[cfg_attr(test, assert_instr(vcvtsi2sh, ROUNDING = 8))]
34#[rustc_legacy_const_generics(2)]
35#[unstable(feature = "stdarch_x86_avx512_f16", issue = "127213")]
36pub unsafe fn _mm_cvt_roundi64_sh<const ROUNDING: i32>(a: __m128h, b: i64) -> __m128h {
37 static_assert_rounding!(ROUNDING);
38 vcvtsi642sh(a, b, ROUNDING)
39}
40
41#[inline]
47#[target_feature(enable = "avx512fp16")]
48#[cfg_attr(test, assert_instr(vcvtusi2sh))]
49#[unstable(feature = "stdarch_x86_avx512_f16", issue = "127213")]
50pub unsafe fn _mm_cvtu64_sh(a: __m128h, b: u64) -> __m128h {
51 vcvtusi642sh(a, b, _MM_FROUND_CUR_DIRECTION)
52}
53
54#[inline]
68#[target_feature(enable = "avx512fp16")]
69#[cfg_attr(test, assert_instr(vcvtusi2sh, ROUNDING = 8))]
70#[rustc_legacy_const_generics(2)]
71#[unstable(feature = "stdarch_x86_avx512_f16", issue = "127213")]
72pub unsafe fn _mm_cvt_roundu64_sh<const ROUNDING: i32>(a: __m128h, b: u64) -> __m128h {
73 static_assert_rounding!(ROUNDING);
74 vcvtusi642sh(a, b, ROUNDING)
75}
76
77#[inline]
82#[target_feature(enable = "avx512fp16")]
83#[cfg_attr(test, assert_instr(vcvtsh2si))]
84#[unstable(feature = "stdarch_x86_avx512_f16", issue = "127213")]
85pub unsafe fn _mm_cvtsh_i64(a: __m128h) -> i64 {
86 vcvtsh2si64(a, _MM_FROUND_CUR_DIRECTION)
87}
88
89#[inline]
102#[target_feature(enable = "avx512fp16")]
103#[cfg_attr(test, assert_instr(vcvtsh2si, ROUNDING = 8))]
104#[rustc_legacy_const_generics(1)]
105#[unstable(feature = "stdarch_x86_avx512_f16", issue = "127213")]
106pub unsafe fn _mm_cvt_roundsh_i64<const ROUNDING: i32>(a: __m128h) -> i64 {
107 static_assert_rounding!(ROUNDING);
108 vcvtsh2si64(a, ROUNDING)
109}
110
111#[inline]
116#[target_feature(enable = "avx512fp16")]
117#[cfg_attr(test, assert_instr(vcvtsh2usi))]
118#[unstable(feature = "stdarch_x86_avx512_f16", issue = "127213")]
119pub unsafe fn _mm_cvtsh_u64(a: __m128h) -> u64 {
120 vcvtsh2usi64(a, _MM_FROUND_CUR_DIRECTION)
121}
122
123#[inline]
136#[target_feature(enable = "avx512fp16")]
137#[cfg_attr(test, assert_instr(vcvtsh2usi, ROUNDING = 8))]
138#[rustc_legacy_const_generics(1)]
139#[unstable(feature = "stdarch_x86_avx512_f16", issue = "127213")]
140pub unsafe fn _mm_cvt_roundsh_u64<const ROUNDING: i32>(a: __m128h) -> u64 {
141 static_assert_rounding!(ROUNDING);
142 vcvtsh2usi64(a, ROUNDING)
143}
144
145#[inline]
150#[target_feature(enable = "avx512fp16")]
151#[cfg_attr(test, assert_instr(vcvttsh2si))]
152#[unstable(feature = "stdarch_x86_avx512_f16", issue = "127213")]
153pub unsafe fn _mm_cvttsh_i64(a: __m128h) -> i64 {
154 vcvttsh2si64(a, _MM_FROUND_CUR_DIRECTION)
155}
156
157#[inline]
164#[target_feature(enable = "avx512fp16")]
165#[cfg_attr(test, assert_instr(vcvttsh2si, SAE = 8))]
166#[rustc_legacy_const_generics(1)]
167#[unstable(feature = "stdarch_x86_avx512_f16", issue = "127213")]
168pub unsafe fn _mm_cvtt_roundsh_i64<const SAE: i32>(a: __m128h) -> i64 {
169 static_assert_sae!(SAE);
170 vcvttsh2si64(a, SAE)
171}
172
173#[inline]
178#[target_feature(enable = "avx512fp16")]
179#[cfg_attr(test, assert_instr(vcvttsh2usi))]
180#[unstable(feature = "stdarch_x86_avx512_f16", issue = "127213")]
181pub unsafe fn _mm_cvttsh_u64(a: __m128h) -> u64 {
182 vcvttsh2usi64(a, _MM_FROUND_CUR_DIRECTION)
183}
184
185#[inline]
192#[target_feature(enable = "avx512fp16")]
193#[cfg_attr(test, assert_instr(vcvttsh2usi, SAE = 8))]
194#[rustc_legacy_const_generics(1)]
195#[unstable(feature = "stdarch_x86_avx512_f16", issue = "127213")]
196pub unsafe fn _mm_cvtt_roundsh_u64<const SAE: i32>(a: __m128h) -> u64 {
197 static_assert_sae!(SAE);
198 vcvttsh2usi64(a, SAE)
199}
200
201#[allow(improper_ctypes)]
202extern "C" {
203 #[link_name = "llvm.x86.avx512fp16.vcvtsi642sh"]
204 fn vcvtsi642sh(a: __m128h, b: i64, rounding: i32) -> __m128h;
205 #[link_name = "llvm.x86.avx512fp16.vcvtusi642sh"]
206 fn vcvtusi642sh(a: __m128h, b: u64, rounding: i32) -> __m128h;
207 #[link_name = "llvm.x86.avx512fp16.vcvtsh2si64"]
208 fn vcvtsh2si64(a: __m128h, rounding: i32) -> i64;
209 #[link_name = "llvm.x86.avx512fp16.vcvtsh2usi64"]
210 fn vcvtsh2usi64(a: __m128h, rounding: i32) -> u64;
211 #[link_name = "llvm.x86.avx512fp16.vcvttsh2si64"]
212 fn vcvttsh2si64(a: __m128h, sae: i32) -> i64;
213 #[link_name = "llvm.x86.avx512fp16.vcvttsh2usi64"]
214 fn vcvttsh2usi64(a: __m128h, sae: i32) -> u64;
215}
216
217#[cfg(test)]
218mod tests {
219 use crate::core_arch::{x86::*, x86_64::*};
220 use stdarch_test::simd_test;
221
222 #[simd_test(enable = "avx512fp16")]
223 unsafe fn test_mm_cvti64_sh() {
224 let a = _mm_setr_ph(1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0);
225 let r = _mm_cvti64_sh(a, 10);
226 let e = _mm_setr_ph(10.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0);
227 assert_eq_m128h(r, e);
228 }
229
230 #[simd_test(enable = "avx512fp16")]
231 unsafe fn test_mm_cvt_roundi64_sh() {
232 let a = _mm_setr_ph(1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0);
233 let r = _mm_cvt_roundi64_sh::<{ _MM_FROUND_TO_NEAREST_INT | _MM_FROUND_NO_EXC }>(a, 10);
234 let e = _mm_setr_ph(10.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0);
235 assert_eq_m128h(r, e);
236 }
237
238 #[simd_test(enable = "avx512fp16")]
239 unsafe fn test_mm_cvtu64_sh() {
240 let a = _mm_setr_ph(1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0);
241 let r = _mm_cvtu64_sh(a, 10);
242 let e = _mm_setr_ph(10.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0);
243 assert_eq_m128h(r, e);
244 }
245
246 #[simd_test(enable = "avx512fp16")]
247 unsafe fn test_mm_cvt_roundu64_sh() {
248 let a = _mm_setr_ph(1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0);
249 let r = _mm_cvt_roundu64_sh::<{ _MM_FROUND_TO_NEAREST_INT | _MM_FROUND_NO_EXC }>(a, 10);
250 let e = _mm_setr_ph(10.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0);
251 assert_eq_m128h(r, e);
252 }
253
254 #[simd_test(enable = "avx512fp16")]
255 unsafe fn test_mm_cvtsh_i64() {
256 let a = _mm_setr_ph(1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0);
257 let r = _mm_cvtsh_i64(a);
258 assert_eq!(r, 1);
259 }
260
261 #[simd_test(enable = "avx512fp16")]
262 unsafe fn test_mm_cvt_roundsh_i64() {
263 let a = _mm_setr_ph(1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0);
264 let r = _mm_cvt_roundsh_i64::<{ _MM_FROUND_TO_NEAREST_INT | _MM_FROUND_NO_EXC }>(a);
265 assert_eq!(r, 1);
266 }
267
268 #[simd_test(enable = "avx512fp16")]
269 unsafe fn test_mm_cvtsh_u64() {
270 let a = _mm_setr_ph(1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0);
271 let r = _mm_cvtsh_u64(a);
272 assert_eq!(r, 1);
273 }
274
275 #[simd_test(enable = "avx512fp16")]
276 unsafe fn test_mm_cvt_roundsh_u64() {
277 let a = _mm_setr_ph(1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0);
278 let r = _mm_cvt_roundsh_u64::<{ _MM_FROUND_TO_NEAREST_INT | _MM_FROUND_NO_EXC }>(a);
279 assert_eq!(r, 1);
280 }
281
282 #[simd_test(enable = "avx512fp16")]
283 unsafe fn test_mm_cvttsh_i64() {
284 let a = _mm_setr_ph(1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0);
285 let r = _mm_cvttsh_i64(a);
286 assert_eq!(r, 1);
287 }
288
289 #[simd_test(enable = "avx512fp16")]
290 unsafe fn test_mm_cvtt_roundsh_i64() {
291 let a = _mm_setr_ph(1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0);
292 let r = _mm_cvtt_roundsh_i64::<{ _MM_FROUND_TO_NEAREST_INT | _MM_FROUND_NO_EXC }>(a);
293 assert_eq!(r, 1);
294 }
295
296 #[simd_test(enable = "avx512fp16")]
297 unsafe fn test_mm_cvttsh_u64() {
298 let a = _mm_setr_ph(1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0);
299 let r = _mm_cvttsh_u64(a);
300 assert_eq!(r, 1);
301 }
302
303 #[simd_test(enable = "avx512fp16")]
304 unsafe fn test_mm_cvtt_roundsh_u64() {
305 let a = _mm_setr_ph(1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0);
306 let r = _mm_cvtt_roundsh_u64::<_MM_FROUND_NO_EXC>(a);
307 assert_eq!(r, 1);
308 }
309}