]>
git.proxmox.com Git - rustc.git/blob - src/stdsimd/crates/core_arch/src/x86/mmx.rs
1 //! `i586` MMX instruction set.
3 //! The intrinsics here roughly correspond to those in the `mmintrin.h` C
6 //! The reference is [Intel 64 and IA-32 Architectures Software Developer's
7 //! Manual Volume 2: Instruction Set Reference, A-Z][intel64_ref].
9 //! [intel64_ref]: http://www.intel.de/content/dam/www/public/us/en/documents/manuals/64-ia-32-architectures-software-developer-instruction-set-reference-manual-325383.pdf
11 use core_arch
::simd
::*;
12 use core_arch
::x86
::*;
16 use stdsimd_test
::assert_instr
;
18 /// Constructs a 64-bit integer vector initialized to zero.
20 #[target_feature(enable = "mmx")]
21 // FIXME: this produces a movl instead of xorps on x86
22 // FIXME: this produces a xor intrinsic instead of xorps on x86_64
23 #[cfg_attr(all(test, target_arch = "x86_64"), assert_instr(xor))]
24 pub unsafe fn _mm_setzero_si64() -> __m64
{
28 /// Add packed 8-bit integers in `a` and `b`.
30 #[target_feature(enable = "mmx")]
31 #[cfg_attr(test, assert_instr(paddb))]
32 pub unsafe fn _mm_add_pi8(a
: __m64
, b
: __m64
) -> __m64
{
36 /// Add packed 8-bit integers in `a` and `b`.
38 #[target_feature(enable = "mmx")]
39 #[cfg_attr(test, assert_instr(paddb))]
40 pub unsafe fn _m_paddb(a
: __m64
, b
: __m64
) -> __m64
{
44 /// Add packed 16-bit integers in `a` and `b`.
46 #[target_feature(enable = "mmx")]
47 #[cfg_attr(test, assert_instr(paddw))]
48 pub unsafe fn _mm_add_pi16(a
: __m64
, b
: __m64
) -> __m64
{
52 /// Add packed 16-bit integers in `a` and `b`.
54 #[target_feature(enable = "mmx")]
55 #[cfg_attr(test, assert_instr(paddw))]
56 pub unsafe fn _m_paddw(a
: __m64
, b
: __m64
) -> __m64
{
60 /// Add packed 32-bit integers in `a` and `b`.
62 #[target_feature(enable = "mmx")]
63 #[cfg_attr(test, assert_instr(paddd))]
64 pub unsafe fn _mm_add_pi32(a
: __m64
, b
: __m64
) -> __m64
{
68 /// Add packed 32-bit integers in `a` and `b`.
70 #[target_feature(enable = "mmx")]
71 #[cfg_attr(test, assert_instr(paddd))]
72 pub unsafe fn _m_paddd(a
: __m64
, b
: __m64
) -> __m64
{
76 /// Add packed 8-bit integers in `a` and `b` using saturation.
78 #[target_feature(enable = "mmx")]
79 #[cfg_attr(test, assert_instr(paddsb))]
80 pub unsafe fn _mm_adds_pi8(a
: __m64
, b
: __m64
) -> __m64
{
84 /// Add packed 8-bit integers in `a` and `b` using saturation.
86 #[target_feature(enable = "mmx")]
87 #[cfg_attr(test, assert_instr(paddsb))]
88 pub unsafe fn _m_paddsb(a
: __m64
, b
: __m64
) -> __m64
{
92 /// Add packed 16-bit integers in `a` and `b` using saturation.
94 #[target_feature(enable = "mmx")]
95 #[cfg_attr(test, assert_instr(paddsw))]
96 pub unsafe fn _mm_adds_pi16(a
: __m64
, b
: __m64
) -> __m64
{
100 /// Add packed 16-bit integers in `a` and `b` using saturation.
102 #[target_feature(enable = "mmx")]
103 #[cfg_attr(test, assert_instr(paddsw))]
104 pub unsafe fn _m_paddsw(a
: __m64
, b
: __m64
) -> __m64
{
108 /// Add packed unsigned 8-bit integers in `a` and `b` using saturation.
110 #[target_feature(enable = "mmx")]
111 #[cfg_attr(test, assert_instr(paddusb))]
112 pub unsafe fn _mm_adds_pu8(a
: __m64
, b
: __m64
) -> __m64
{
116 /// Add packed unsigned 8-bit integers in `a` and `b` using saturation.
118 #[target_feature(enable = "mmx")]
119 #[cfg_attr(test, assert_instr(paddusb))]
120 pub unsafe fn _m_paddusb(a
: __m64
, b
: __m64
) -> __m64
{
124 /// Add packed unsigned 16-bit integers in `a` and `b` using saturation.
126 #[target_feature(enable = "mmx")]
127 #[cfg_attr(test, assert_instr(paddusw))]
128 pub unsafe fn _mm_adds_pu16(a
: __m64
, b
: __m64
) -> __m64
{
132 /// Add packed unsigned 16-bit integers in `a` and `b` using saturation.
134 #[target_feature(enable = "mmx")]
135 #[cfg_attr(test, assert_instr(paddusw))]
136 pub unsafe fn _m_paddusw(a
: __m64
, b
: __m64
) -> __m64
{
140 /// Subtract packed 8-bit integers in `b` from packed 8-bit integers in `a`.
142 #[target_feature(enable = "mmx")]
143 #[cfg_attr(test, assert_instr(psubb))]
144 pub unsafe fn _mm_sub_pi8(a
: __m64
, b
: __m64
) -> __m64
{
148 /// Subtract packed 8-bit integers in `b` from packed 8-bit integers in `a`.
150 #[target_feature(enable = "mmx")]
151 #[cfg_attr(test, assert_instr(psubb))]
152 pub unsafe fn _m_psubb(a
: __m64
, b
: __m64
) -> __m64
{
156 /// Subtract packed 16-bit integers in `b` from packed 16-bit integers in `a`.
158 #[target_feature(enable = "mmx")]
159 #[cfg_attr(test, assert_instr(psubw))]
160 pub unsafe fn _mm_sub_pi16(a
: __m64
, b
: __m64
) -> __m64
{
164 /// Subtract packed 16-bit integers in `b` from packed 16-bit integers in `a`.
166 #[target_feature(enable = "mmx")]
167 #[cfg_attr(test, assert_instr(psubw))]
168 pub unsafe fn _m_psubw(a
: __m64
, b
: __m64
) -> __m64
{
172 /// Subtract packed 32-bit integers in `b` from packed 32-bit integers in `a`.
174 #[target_feature(enable = "mmx")]
175 #[cfg_attr(test, assert_instr(psubd))]
176 pub unsafe fn _mm_sub_pi32(a
: __m64
, b
: __m64
) -> __m64
{
180 /// Subtract packed 32-bit integers in `b` from packed 32-bit integers in `a`.
182 #[target_feature(enable = "mmx")]
183 #[cfg_attr(test, assert_instr(psubd))]
184 pub unsafe fn _m_psubd(a
: __m64
, b
: __m64
) -> __m64
{
188 /// Subtract packed 8-bit integers in `b` from packed 8-bit integers in `a`
189 /// using saturation.
191 #[target_feature(enable = "mmx")]
192 #[cfg_attr(test, assert_instr(psubsb))]
193 pub unsafe fn _mm_subs_pi8(a
: __m64
, b
: __m64
) -> __m64
{
197 /// Subtract packed 8-bit integers in `b` from packed 8-bit integers in `a`
198 /// using saturation.
200 #[target_feature(enable = "mmx")]
201 #[cfg_attr(test, assert_instr(psubsb))]
202 pub unsafe fn _m_psubsb(a
: __m64
, b
: __m64
) -> __m64
{
206 /// Subtract packed 16-bit integers in `b` from packed 16-bit integers in `a`
207 /// using saturation.
209 #[target_feature(enable = "mmx")]
210 #[cfg_attr(test, assert_instr(psubsw))]
211 pub unsafe fn _mm_subs_pi16(a
: __m64
, b
: __m64
) -> __m64
{
215 /// Subtract packed 16-bit integers in `b` from packed 16-bit integers in `a`
216 /// using saturation.
218 #[target_feature(enable = "mmx")]
219 #[cfg_attr(test, assert_instr(psubsw))]
220 pub unsafe fn _m_psubsw(a
: __m64
, b
: __m64
) -> __m64
{
224 /// Subtract packed unsigned 8-bit integers in `b` from packed unsigned 8-bit
225 /// integers in `a` using saturation.
227 #[target_feature(enable = "mmx")]
228 #[cfg_attr(test, assert_instr(psubusb))]
229 pub unsafe fn _mm_subs_pu8(a
: __m64
, b
: __m64
) -> __m64
{
233 /// Subtract packed unsigned 8-bit integers in `b` from packed unsigned 8-bit
234 /// integers in `a` using saturation.
236 #[target_feature(enable = "mmx")]
237 #[cfg_attr(test, assert_instr(psubusb))]
238 pub unsafe fn _m_psubusb(a
: __m64
, b
: __m64
) -> __m64
{
242 /// Subtract packed unsigned 16-bit integers in `b` from packed unsigned
243 /// 16-bit integers in `a` using saturation.
245 #[target_feature(enable = "mmx")]
246 #[cfg_attr(test, assert_instr(psubusw))]
247 pub unsafe fn _mm_subs_pu16(a
: __m64
, b
: __m64
) -> __m64
{
251 /// Subtract packed unsigned 16-bit integers in `b` from packed unsigned
252 /// 16-bit integers in `a` using saturation.
254 #[target_feature(enable = "mmx")]
255 #[cfg_attr(test, assert_instr(psubusw))]
256 pub unsafe fn _m_psubusw(a
: __m64
, b
: __m64
) -> __m64
{
260 /// Convert packed 16-bit integers from `a` and `b` to packed 8-bit integers
261 /// using signed saturation.
263 /// Positive values greater than 0x7F are saturated to 0x7F. Negative values
264 /// less than 0x80 are saturated to 0x80.
266 #[target_feature(enable = "mmx")]
267 #[cfg_attr(test, assert_instr(packsswb))]
268 pub unsafe fn _mm_packs_pi16(a
: __m64
, b
: __m64
) -> __m64
{
272 /// Convert packed 32-bit integers from `a` and `b` to packed 16-bit integers
273 /// using signed saturation.
275 /// Positive values greater than 0x7F are saturated to 0x7F. Negative values
276 /// less than 0x80 are saturated to 0x80.
278 #[target_feature(enable = "mmx")]
279 #[cfg_attr(test, assert_instr(packssdw))]
280 pub unsafe fn _mm_packs_pi32(a
: __m64
, b
: __m64
) -> __m64
{
284 /// Compares whether each element of `a` is greater than the corresponding
285 /// element of `b` returning `0` for `false` and `-1` for `true`.
287 #[target_feature(enable = "mmx")]
288 #[cfg_attr(test, assert_instr(pcmpgtb))]
289 pub unsafe fn _mm_cmpgt_pi8(a
: __m64
, b
: __m64
) -> __m64
{
293 /// Compares whether each element of `a` is greater than the corresponding
294 /// element of `b` returning `0` for `false` and `-1` for `true`.
296 #[target_feature(enable = "mmx")]
297 #[cfg_attr(test, assert_instr(pcmpgtw))]
298 pub unsafe fn _mm_cmpgt_pi16(a
: __m64
, b
: __m64
) -> __m64
{
302 /// Compares whether each element of `a` is greater than the corresponding
303 /// element of `b` returning `0` for `false` and `-1` for `true`.
305 #[target_feature(enable = "mmx")]
306 #[cfg_attr(test, assert_instr(pcmpgtd))]
307 pub unsafe fn _mm_cmpgt_pi32(a
: __m64
, b
: __m64
) -> __m64
{
311 /// Unpacks the upper two elements from two `i16x4` vectors and interleaves
312 /// them into the result: `[a.2, b.2, a.3, b.3]`.
314 #[target_feature(enable = "mmx")]
315 #[cfg_attr(test, assert_instr(punpckhwd))] // FIXME punpcklbw expected
316 pub unsafe fn _mm_unpackhi_pi16(a
: __m64
, b
: __m64
) -> __m64
{
320 /// Unpacks the upper four elements from two `i8x8` vectors and interleaves
321 /// them into the result: `[a.4, b.4, a.5, b.5, a.6, b.6, a.7, b.7]`.
323 #[target_feature(enable = "mmx")]
324 #[cfg_attr(test, assert_instr(punpckhbw))]
325 pub unsafe fn _mm_unpackhi_pi8(a
: __m64
, b
: __m64
) -> __m64
{
329 /// Unpacks the lower four elements from two `i8x8` vectors and interleaves
330 /// them into the result: `[a.0, b.0, a.1, b.1, a.2, b.2, a.3, b.3]`.
332 #[target_feature(enable = "mmx")]
333 #[cfg_attr(test, assert_instr(punpcklbw))]
334 pub unsafe fn _mm_unpacklo_pi8(a
: __m64
, b
: __m64
) -> __m64
{
338 /// Unpacks the lower two elements from two `i16x4` vectors and interleaves
339 /// them into the result: `[a.0 b.0 a.1 b.1]`.
341 #[target_feature(enable = "mmx")]
342 #[cfg_attr(test, assert_instr(punpcklwd))]
343 pub unsafe fn _mm_unpacklo_pi16(a
: __m64
, b
: __m64
) -> __m64
{
347 /// Unpacks the upper element from two `i32x2` vectors and interleaves them
348 /// into the result: `[a.1, b.1]`.
350 #[target_feature(enable = "mmx")]
351 #[cfg_attr(test, assert_instr(punpckhdq))]
352 pub unsafe fn _mm_unpackhi_pi32(a
: __m64
, b
: __m64
) -> __m64
{
356 /// Unpacks the lower element from two `i32x2` vectors and interleaves them
357 /// into the result: `[a.0, b.0]`.
359 #[target_feature(enable = "mmx")]
360 #[cfg_attr(test, assert_instr(punpckldq))]
361 pub unsafe fn _mm_unpacklo_pi32(a
: __m64
, b
: __m64
) -> __m64
{
365 /// Set packed 16-bit integers in dst with the supplied values.
367 #[target_feature(enable = "mmx")]
368 pub unsafe fn _mm_set_pi16(e3
: i16, e2
: i16, e1
: i16, e0
: i16) -> __m64
{
369 _mm_setr_pi16(e0
, e1
, e2
, e3
)
372 /// Set packed 32-bit integers in dst with the supplied values.
374 #[target_feature(enable = "mmx")]
375 pub unsafe fn _mm_set_pi32(e1
: i32, e0
: i32) -> __m64
{
376 _mm_setr_pi32(e0
, e1
)
379 /// Set packed 8-bit integers in dst with the supplied values.
381 #[target_feature(enable = "mmx")]
382 pub unsafe fn _mm_set_pi8(e7
: i8, e6
: i8, e5
: i8, e4
: i8, e3
: i8, e2
: i8, e1
: i8, e0
: i8) -> __m64
{
383 _mm_setr_pi8(e0
, e1
, e2
, e3
, e4
, e5
, e6
, e7
)
386 /// Broadcast 16-bit integer a to all all elements of dst.
388 #[target_feature(enable = "mmx")]
389 pub unsafe fn _mm_set1_pi16(a
: i16) -> __m64
{
390 _mm_setr_pi16(a
, a
, a
, a
)
393 /// Broadcast 32-bit integer a to all all elements of dst.
395 #[target_feature(enable = "mmx")]
396 pub unsafe fn _mm_set1_pi32(a
: i32) -> __m64
{
400 /// Broadcast 8-bit integer a to all all elements of dst.
402 #[target_feature(enable = "mmx")]
403 pub unsafe fn _mm_set1_pi8(a
: i8) -> __m64
{
404 _mm_setr_pi8(a
, a
, a
, a
, a
, a
, a
, a
)
407 /// Set packed 16-bit integers in dst with the supplied values in reverse
410 #[target_feature(enable = "mmx")]
411 pub unsafe fn _mm_setr_pi16(e0
: i16, e1
: i16, e2
: i16, e3
: i16) -> __m64
{
412 mem
::transmute(i16x4
::new(e0
, e1
, e2
, e3
))
415 /// Set packed 32-bit integers in dst with the supplied values in reverse
418 #[target_feature(enable = "mmx")]
419 pub unsafe fn _mm_setr_pi32(e0
: i32, e1
: i32) -> __m64
{
420 mem
::transmute(i32x2
::new(e0
, e1
))
423 /// Set packed 8-bit integers in dst with the supplied values in reverse order.
425 #[target_feature(enable = "mmx")]
426 pub unsafe fn _mm_setr_pi8(
436 mem
::transmute(i8x8
::new(e0
, e1
, e2
, e3
, e4
, e5
, e6
, e7
))
439 /// Empty the MMX state, which marks the x87 FPU registers as available for use
440 /// by x87 instructions. This instruction must be used at the end of all MMX
441 /// technology procedures.
443 #[target_feature(enable = "mmx")]
444 #[cfg_attr(test, assert_instr(emms))]
445 pub unsafe fn _mm_empty() {
449 /// Empty the MMX state, which marks the x87 FPU registers as available for use
450 /// by x87 instructions. This instruction must be used at the end of all MMX
451 /// technology procedures.
453 #[target_feature(enable = "mmx")]
454 #[cfg_attr(test, assert_instr(emms))]
455 pub unsafe fn _m_empty() {
459 /// Copy 32-bit integer `a` to the lower elements of the return value, and zero
460 /// the upper element of the return value.
462 #[target_feature(enable = "mmx")]
463 pub unsafe fn _mm_cvtsi32_si64(a
: i32) -> __m64
{
464 mem
::transmute(i32x2
::new(a
, 0))
467 /// Return the lower 32-bit integer in `a`.
469 #[target_feature(enable = "mmx")]
470 pub unsafe fn _mm_cvtsi64_si32(a
: __m64
) -> i32 {
471 let r
: i32x2
= mem
::transmute(a
);
475 #[allow(improper_ctypes)]
477 #[link_name = "llvm.x86.mmx.padd.b"]
478 fn paddb(a
: __m64
, b
: __m64
) -> __m64
;
479 #[link_name = "llvm.x86.mmx.padd.w"]
480 fn paddw(a
: __m64
, b
: __m64
) -> __m64
;
481 #[link_name = "llvm.x86.mmx.padd.d"]
482 fn paddd(a
: __m64
, b
: __m64
) -> __m64
;
483 #[link_name = "llvm.x86.mmx.padds.b"]
484 fn paddsb(a
: __m64
, b
: __m64
) -> __m64
;
485 #[link_name = "llvm.x86.mmx.padds.w"]
486 fn paddsw(a
: __m64
, b
: __m64
) -> __m64
;
487 #[link_name = "llvm.x86.mmx.paddus.b"]
488 fn paddusb(a
: __m64
, b
: __m64
) -> __m64
;
489 #[link_name = "llvm.x86.mmx.paddus.w"]
490 fn paddusw(a
: __m64
, b
: __m64
) -> __m64
;
491 #[link_name = "llvm.x86.mmx.psub.b"]
492 fn psubb(a
: __m64
, b
: __m64
) -> __m64
;
493 #[link_name = "llvm.x86.mmx.psub.w"]
494 fn psubw(a
: __m64
, b
: __m64
) -> __m64
;
495 #[link_name = "llvm.x86.mmx.psub.d"]
496 fn psubd(a
: __m64
, b
: __m64
) -> __m64
;
497 #[link_name = "llvm.x86.mmx.psubs.b"]
498 fn psubsb(a
: __m64
, b
: __m64
) -> __m64
;
499 #[link_name = "llvm.x86.mmx.psubs.w"]
500 fn psubsw(a
: __m64
, b
: __m64
) -> __m64
;
501 #[link_name = "llvm.x86.mmx.psubus.b"]
502 fn psubusb(a
: __m64
, b
: __m64
) -> __m64
;
503 #[link_name = "llvm.x86.mmx.psubus.w"]
504 fn psubusw(a
: __m64
, b
: __m64
) -> __m64
;
505 #[link_name = "llvm.x86.mmx.packsswb"]
506 fn packsswb(a
: __m64
, b
: __m64
) -> __m64
;
507 #[link_name = "llvm.x86.mmx.packssdw"]
508 fn packssdw(a
: __m64
, b
: __m64
) -> __m64
;
509 #[link_name = "llvm.x86.mmx.pcmpgt.b"]
510 fn pcmpgtb(a
: __m64
, b
: __m64
) -> __m64
;
511 #[link_name = "llvm.x86.mmx.pcmpgt.w"]
512 fn pcmpgtw(a
: __m64
, b
: __m64
) -> __m64
;
513 #[link_name = "llvm.x86.mmx.pcmpgt.d"]
514 fn pcmpgtd(a
: __m64
, b
: __m64
) -> __m64
;
515 #[link_name = "llvm.x86.mmx.punpckhwd"]
516 fn punpckhwd(a
: __m64
, b
: __m64
) -> __m64
;
517 #[link_name = "llvm.x86.mmx.punpcklwd"]
518 fn punpcklwd(a
: __m64
, b
: __m64
) -> __m64
;
519 #[link_name = "llvm.x86.mmx.punpckhbw"]
520 fn punpckhbw(a
: __m64
, b
: __m64
) -> __m64
;
521 #[link_name = "llvm.x86.mmx.punpcklbw"]
522 fn punpcklbw(a
: __m64
, b
: __m64
) -> __m64
;
523 #[link_name = "llvm.x86.mmx.punpckhdq"]
524 fn punpckhdq(a
: __m64
, b
: __m64
) -> __m64
;
525 #[link_name = "llvm.x86.mmx.punpckldq"]
526 fn punpckldq(a
: __m64
, b
: __m64
) -> __m64
;
527 #[link_name = "llvm.x86.mmx.emms"]
533 use core_arch
::x86
::*;
534 use stdsimd_test
::simd_test
;
536 #[simd_test(enable = "mmx")]
537 unsafe fn test_mm_setzero_si64() {
538 let r
: __m64
= ::std
::mem
::transmute(0_i64);
539 assert_eq_m64(r
, _mm_setzero_si64());
542 #[simd_test(enable = "mmx")]
543 unsafe fn test_mm_add_pi8() {
544 let a
= _mm_setr_pi8(-1, -1, 1, 1, -1, 0, 1, 0);
545 let b
= _mm_setr_pi8(-127, 101, 99, 126, 0, -1, 0, 1);
546 let e
= _mm_setr_pi8(-128, 100, 100, 127, -1, -1, 1, 1);
547 assert_eq_m64(e
, _mm_add_pi8(a
, b
));
548 assert_eq_m64(e
, _m_paddb(a
, b
));
551 #[simd_test(enable = "mmx")]
552 unsafe fn test_mm_add_pi16() {
553 let a
= _mm_setr_pi16(-1, -1, 1, 1);
554 let b
= _mm_setr_pi16(i16::min_value() + 1, 30001, -30001, i16::max_value() - 1);
555 let e
= _mm_setr_pi16(i16::min_value(), 30000, -30000, i16::max_value());
556 assert_eq_m64(e
, _mm_add_pi16(a
, b
));
557 assert_eq_m64(e
, _m_paddw(a
, b
));
560 #[simd_test(enable = "mmx")]
561 unsafe fn test_mm_add_pi32() {
562 let a
= _mm_setr_pi32(1, -1);
563 let b
= _mm_setr_pi32(i32::max_value() - 1, i32::min_value() + 1);
564 let e
= _mm_setr_pi32(i32::max_value(), i32::min_value());
565 assert_eq_m64(e
, _mm_add_pi32(a
, b
));
566 assert_eq_m64(e
, _m_paddd(a
, b
));
569 #[simd_test(enable = "mmx")]
570 unsafe fn test_mm_adds_pi8() {
571 let a
= _mm_setr_pi8(-100, -1, 1, 100, -1, 0, 1, 0);
572 let b
= _mm_setr_pi8(-100, 1, -1, 100, 0, -1, 0, 1);
573 let e
= _mm_setr_pi8(i8::min_value(), 0, 0, i8::max_value(), -1, -1, 1, 1);
574 assert_eq_m64(e
, _mm_adds_pi8(a
, b
));
575 assert_eq_m64(e
, _m_paddsb(a
, b
));
578 #[simd_test(enable = "mmx")]
579 unsafe fn test_mm_adds_pi16() {
580 let a
= _mm_setr_pi16(-32000, 32000, 4, 0);
581 let b
= _mm_setr_pi16(-32000, 32000, -5, 1);
582 let e
= _mm_setr_pi16(i16::min_value(), i16::max_value(), -1, 1);
583 assert_eq_m64(e
, _mm_adds_pi16(a
, b
));
584 assert_eq_m64(e
, _m_paddsw(a
, b
));
587 #[simd_test(enable = "mmx")]
588 unsafe fn test_mm_adds_pu8() {
589 let a
= _mm_setr_pi8(0, 1, 2, 3, 4, 5, 6, 200u8 as i8);
590 let b
= _mm_setr_pi8(0, 10, 20, 30, 40, 50, 60, 200u8 as i8);
591 let e
= _mm_setr_pi8(0, 11, 22, 33, 44, 55, 66, u8::max_value() as i8);
592 assert_eq_m64(e
, _mm_adds_pu8(a
, b
));
593 assert_eq_m64(e
, _m_paddusb(a
, b
));
596 #[simd_test(enable = "mmx")]
597 unsafe fn test_mm_adds_pu16() {
598 let a
= _mm_setr_pi16(0, 1, 2, 60000u16 as i16);
599 let b
= _mm_setr_pi16(0, 10, 20, 60000u16 as i16);
600 let e
= _mm_setr_pi16(0, 11, 22, u16::max_value() as i16);
601 assert_eq_m64(e
, _mm_adds_pu16(a
, b
));
602 assert_eq_m64(e
, _m_paddusw(a
, b
));
605 #[simd_test(enable = "mmx")]
606 unsafe fn test_mm_sub_pi8() {
607 let a
= _mm_setr_pi8(0, 0, 1, 1, -1, -1, 0, 0);
608 let b
= _mm_setr_pi8(-1, 1, -2, 2, 100, -100, -127, 127);
609 let e
= _mm_setr_pi8(1, -1, 3, -1, -101, 99, 127, -127);
610 assert_eq_m64(e
, _mm_sub_pi8(a
, b
));
611 assert_eq_m64(e
, _m_psubb(a
, b
));
614 #[simd_test(enable = "mmx")]
615 unsafe fn test_mm_sub_pi16() {
616 let a
= _mm_setr_pi16(-20000, -20000, 20000, 30000);
617 let b
= _mm_setr_pi16(-10000, 10000, -10000, 30000);
618 let e
= _mm_setr_pi16(-10000, -30000, 30000, 0);
619 assert_eq_m64(e
, _mm_sub_pi16(a
, b
));
620 assert_eq_m64(e
, _m_psubw(a
, b
));
623 #[simd_test(enable = "mmx")]
624 unsafe fn test_mm_sub_pi32() {
625 let a
= _mm_setr_pi32(500_000, -500_000);
626 let b
= _mm_setr_pi32(500_000, 500_000);
627 let e
= _mm_setr_pi32(0, -1_000_000);
628 assert_eq_m64(e
, _mm_sub_pi32(a
, b
));
629 assert_eq_m64(e
, _m_psubd(a
, b
));
632 #[simd_test(enable = "mmx")]
633 unsafe fn test_mm_subs_pi8() {
634 let a
= _mm_setr_pi8(-100, 100, 0, 0, 0, 0, -5, 5);
635 let b
= _mm_setr_pi8(100, -100, i8::min_value(), 127, -1, 1, 3, -3);
636 let e
= _mm_setr_pi8(
646 assert_eq_m64(e
, _mm_subs_pi8(a
, b
));
647 assert_eq_m64(e
, _m_psubsb(a
, b
));
650 #[simd_test(enable = "mmx")]
651 unsafe fn test_mm_subs_pi16() {
652 let a
= _mm_setr_pi16(-20000, 20000, 0, 0);
653 let b
= _mm_setr_pi16(20000, -20000, -1, 1);
654 let e
= _mm_setr_pi16(i16::min_value(), i16::max_value(), 1, -1);
655 assert_eq_m64(e
, _mm_subs_pi16(a
, b
));
656 assert_eq_m64(e
, _m_psubsw(a
, b
));
659 #[simd_test(enable = "mmx")]
660 unsafe fn test_mm_subs_pu8() {
661 let a
= _mm_setr_pi8(50, 10, 20, 30, 40, 60, 70, 80);
662 let b
= _mm_setr_pi8(60, 20, 30, 40, 30, 20, 10, 0);
663 let e
= _mm_setr_pi8(0, 0, 0, 0, 10, 40, 60, 80);
664 assert_eq_m64(e
, _mm_subs_pu8(a
, b
));
665 assert_eq_m64(e
, _m_psubusb(a
, b
));
668 #[simd_test(enable = "mmx")]
669 unsafe fn test_mm_subs_pu16() {
670 let a
= _mm_setr_pi16(10000, 200, 0, 44444u16 as i16);
671 let b
= _mm_setr_pi16(20000, 300, 1, 11111);
672 let e
= _mm_setr_pi16(0, 0, 0, 33333u16 as i16);
673 assert_eq_m64(e
, _mm_subs_pu16(a
, b
));
674 assert_eq_m64(e
, _m_psubusw(a
, b
));
677 #[simd_test(enable = "mmx")]
678 unsafe fn test_mm_packs_pi16() {
679 let a
= _mm_setr_pi16(-1, 2, -3, 4);
680 let b
= _mm_setr_pi16(-5, 6, -7, 8);
681 let r
= _mm_setr_pi8(-1, 2, -3, 4, -5, 6, -7, 8);
682 assert_eq_m64(r
, _mm_packs_pi16(a
, b
));
685 #[simd_test(enable = "mmx")]
686 unsafe fn test_mm_packs_pi32() {
687 let a
= _mm_setr_pi32(-1, 2);
688 let b
= _mm_setr_pi32(-5, 6);
689 let r
= _mm_setr_pi16(-1, 2, -5, 6);
690 assert_eq_m64(r
, _mm_packs_pi32(a
, b
));
693 #[simd_test(enable = "mmx")]
694 unsafe fn test_mm_cmpgt_pi8() {
695 let a
= _mm_setr_pi8(0, 1, 2, 3, 4, 5, 6, 7);
696 let b
= _mm_setr_pi8(8, 7, 6, 5, 4, 3, 2, 1);
697 let r
= _mm_setr_pi8(0, 0, 0, 0, 0, -1, -1, -1);
698 assert_eq_m64(r
, _mm_cmpgt_pi8(a
, b
));
701 #[simd_test(enable = "mmx")]
702 unsafe fn test_mm_cmpgt_pi16() {
703 let a
= _mm_setr_pi16(0, 1, 2, 3);
704 let b
= _mm_setr_pi16(4, 3, 2, 1);
705 let r
= _mm_setr_pi16(0, 0, 0, -1);
706 assert_eq_m64(r
, _mm_cmpgt_pi16(a
, b
));
709 #[simd_test(enable = "mmx")]
710 unsafe fn test_mm_cmpgt_pi32() {
711 let a
= _mm_setr_pi32(0, 3);
712 let b
= _mm_setr_pi32(1, 2);
713 let r0
= _mm_setr_pi32(0, -1);
714 let r1
= _mm_setr_pi32(-1, 0);
716 assert_eq_m64(r0
, _mm_cmpgt_pi32(a
, b
));
717 assert_eq_m64(r1
, _mm_cmpgt_pi32(b
, a
));
720 #[simd_test(enable = "mmx")]
721 unsafe fn test_mm_unpackhi_pi8() {
722 let a
= _mm_setr_pi8(0, 3, 4, 7, 8, 11, 12, 15);
723 let b
= _mm_setr_pi8(1, 2, 5, 6, 9, 10, 13, 14);
724 let r
= _mm_setr_pi8(8, 9, 11, 10, 12, 13, 15, 14);
726 assert_eq_m64(r
, _mm_unpackhi_pi8(a
, b
));
729 #[simd_test(enable = "mmx")]
730 unsafe fn test_mm_unpacklo_pi8() {
731 let a
= _mm_setr_pi8(0, 1, 2, 3, 4, 5, 6, 7);
732 let b
= _mm_setr_pi8(8, 9, 10, 11, 12, 13, 14, 15);
733 let r
= _mm_setr_pi8(0, 8, 1, 9, 2, 10, 3, 11);
734 assert_eq_m64(r
, _mm_unpacklo_pi8(a
, b
));
737 #[simd_test(enable = "mmx")]
738 unsafe fn test_mm_unpackhi_pi16() {
739 let a
= _mm_setr_pi16(0, 1, 2, 3);
740 let b
= _mm_setr_pi16(4, 5, 6, 7);
741 let r
= _mm_setr_pi16(2, 6, 3, 7);
742 assert_eq_m64(r
, _mm_unpackhi_pi16(a
, b
));
745 #[simd_test(enable = "mmx")]
746 unsafe fn test_mm_unpacklo_pi16() {
747 let a
= _mm_setr_pi16(0, 1, 2, 3);
748 let b
= _mm_setr_pi16(4, 5, 6, 7);
749 let r
= _mm_setr_pi16(0, 4, 1, 5);
750 assert_eq_m64(r
, _mm_unpacklo_pi16(a
, b
));
753 #[simd_test(enable = "mmx")]
754 unsafe fn test_mm_unpackhi_pi32() {
755 let a
= _mm_setr_pi32(0, 3);
756 let b
= _mm_setr_pi32(1, 2);
757 let r
= _mm_setr_pi32(3, 2);
759 assert_eq_m64(r
, _mm_unpackhi_pi32(a
, b
));
762 #[simd_test(enable = "mmx")]
763 unsafe fn test_mm_unpacklo_pi32() {
764 let a
= _mm_setr_pi32(0, 3);
765 let b
= _mm_setr_pi32(1, 2);
766 let r
= _mm_setr_pi32(0, 1);
768 assert_eq_m64(r
, _mm_unpacklo_pi32(a
, b
));
771 #[simd_test(enable = "mmx")]
772 unsafe fn test_mm_empty() {
776 #[simd_test(enable = "mmx")]
777 unsafe fn test_m_empty() {
781 #[simd_test(enable = "mmx")]
782 unsafe fn test_mm_cvtsi32_si64() {
783 let a
= _mm_cvtsi32_si64(42);
784 let b
= _mm_setr_pi32(42, 0);
788 #[simd_test(enable = "mmx")]
789 unsafe fn test_mm_cvtsi64_si32() {
790 let a
= _mm_setr_pi32(42, 666);
791 let b
= _mm_cvtsi64_si32(a
);