60d1a25d64b9c912e38aa19a38e5876436328583
1 /* Copyright (C) 2002-2021 Free Software Foundation, Inc.
3 This file is part of GCC.
5 GCC is free software; you can redistribute it and/or modify
6 it under the terms of the GNU General Public License as published by
7 the Free Software Foundation; either version 3, or (at your option)
10 GCC is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 GNU General Public License for more details.
15 Under Section 7 of GPL version 3, you are granted additional
16 permissions described in the GCC Runtime Library Exception, version
17 3.1, as published by the Free Software Foundation.
19 You should have received a copy of the GNU General Public License and
20 a copy of the GCC Runtime Library Exception along with this program;
21 see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
22 <http://www.gnu.org/licenses/>. */
24 /* Implemented from the specification included in the Intel C++ Compiler
25 User Guide and Reference, version 9.0. */
27 #ifndef NO_WARN_X86_INTRINSICS
28 /* This header is distributed to simplify porting x86_64 code that
29 makes explicit use of Intel intrinsics to powerpc64le.
30 It is the user's responsibility to determine if the results are
31 acceptable and make additional changes as necessary.
32 Note that much code that uses Intel intrinsics can be rewritten in
33 standard C or GNU C extensions, which are more portable and better
34 optimized across multiple targets.
36 In the specific case of X86 MMX (__m64) intrinsics, the PowerPC
37 target does not support a native __vector_size__ (8) type. Instead
38 we typedef __m64 to a 64-bit unsigned long long, which is natively
39 supported in 64-bit mode. This works well for the _si64 and some
40 _pi32 operations, but starts to generate long sequences for _pi16
41 and _pi8 operations. For those cases it better (faster and
42 smaller code) to transfer __m64 data to the PowerPC vector 128-bit
43 unit, perform the operation, and then transfer the result back to
44 the __m64 type. This implies that the direct register move
45 instructions, introduced with power8, are available for efficient
46 implementation of these transfers.
48 Most MMX intrinsic operations can be performed efficiently as
49 C language 64-bit scalar operation or optimized to use the newer
50 128-bit SSE/Altivec operations. We recomend this for new
52 #error "Please read comment above. Use -DNO_WARN_X86_INTRINSICS to disable this error."
55 #ifndef _MMINTRIN_H_INCLUDED
56 #define _MMINTRIN_H_INCLUDED
59 /* The Intel API is flexible enough that we must allow aliasing with other
60 vector types, and their scalar components. */
61 typedef __attribute__ ((__aligned__ (8))) unsigned long long __m64
;
63 typedef __attribute__ ((__aligned__ (8)))
68 signed char as_signed_char
[8];
71 long long as_long_long
;
76 /* Empty the multimedia state. */
77 extern __inline
void __attribute__((__gnu_inline__
, __always_inline__
, __artificial__
))
80 /* nothing to do on PowerPC. */
83 extern __inline
void __attribute__((__gnu_inline__
, __always_inline__
, __artificial__
))
86 /* nothing to do on PowerPC. */
89 /* Convert I to a __m64 object. The integer is zero-extended to 64-bits. */
90 extern __inline __m64
__attribute__((__gnu_inline__
, __always_inline__
, __artificial__
))
91 _mm_cvtsi32_si64 (int __i
)
93 return (__m64
) (unsigned int) __i
;
96 extern __inline __m64
__attribute__((__gnu_inline__
, __always_inline__
, __artificial__
))
99 return _mm_cvtsi32_si64 (__i
);
102 /* Convert the lower 32 bits of the __m64 object into an integer. */
103 extern __inline
int __attribute__((__gnu_inline__
, __always_inline__
, __artificial__
))
104 _mm_cvtsi64_si32 (__m64 __i
)
109 extern __inline
int __attribute__((__gnu_inline__
, __always_inline__
, __artificial__
))
110 _m_to_int (__m64 __i
)
112 return _mm_cvtsi64_si32 (__i
);
115 /* Convert I to a __m64 object. */
117 /* Intel intrinsic. */
118 extern __inline __m64
__attribute__((__gnu_inline__
, __always_inline__
, __artificial__
))
119 _m_from_int64 (long long __i
)
124 extern __inline __m64
__attribute__((__gnu_inline__
, __always_inline__
, __artificial__
))
125 _mm_cvtsi64_m64 (long long __i
)
130 /* Microsoft intrinsic. */
131 extern __inline __m64
__attribute__((__gnu_inline__
, __always_inline__
, __artificial__
))
132 _mm_cvtsi64x_si64 (long long __i
)
137 extern __inline __m64
__attribute__((__gnu_inline__
, __always_inline__
, __artificial__
))
138 _mm_set_pi64x (long long __i
)
143 /* Convert the __m64 object to a 64bit integer. */
145 /* Intel intrinsic. */
146 extern __inline
long long __attribute__((__gnu_inline__
, __always_inline__
, __artificial__
))
147 _m_to_int64 (__m64 __i
)
149 return (long long)__i
;
152 extern __inline
long long __attribute__((__gnu_inline__
, __always_inline__
, __artificial__
))
153 _mm_cvtm64_si64 (__m64 __i
)
155 return (long long) __i
;
158 /* Microsoft intrinsic. */
159 extern __inline
long long __attribute__((__gnu_inline__
, __always_inline__
, __artificial__
))
160 _mm_cvtsi64_si64x (__m64 __i
)
162 return (long long) __i
;
166 /* Pack the four 16-bit values from M1 into the lower four 8-bit values of
167 the result, and the four 16-bit values from M2 into the upper four 8-bit
168 values of the result, all with signed saturation. */
169 extern __inline __m64
__attribute__((__gnu_inline__
, __always_inline__
, __artificial__
))
170 _mm_packs_pi16 (__m64 __m1
, __m64 __m2
)
172 __vector
signed short vm1
;
173 __vector
signed char vresult
;
175 vm1
= (__vector
signed short) (__vector
unsigned long long)
176 #ifdef __LITTLE_ENDIAN__
181 vresult
= vec_packs (vm1
, vm1
);
182 return (__m64
) ((__vector
long long) vresult
)[0];
185 extern __inline __m64
__attribute__((__gnu_inline__
, __always_inline__
, __artificial__
))
186 _m_packsswb (__m64 __m1
, __m64 __m2
)
188 return _mm_packs_pi16 (__m1
, __m2
);
191 /* Pack the two 32-bit values from M1 in to the lower two 16-bit values of
192 the result, and the two 32-bit values from M2 into the upper two 16-bit
193 values of the result, all with signed saturation. */
194 extern __inline __m64
__attribute__((__gnu_inline__
, __always_inline__
, __artificial__
))
195 _mm_packs_pi32 (__m64 __m1
, __m64 __m2
)
197 __vector
signed int vm1
;
198 __vector
signed short vresult
;
200 vm1
= (__vector
signed int) (__vector
unsigned long long)
201 #ifdef __LITTLE_ENDIAN__
206 vresult
= vec_packs (vm1
, vm1
);
207 return (__m64
) ((__vector
long long) vresult
)[0];
210 extern __inline __m64
__attribute__((__gnu_inline__
, __always_inline__
, __artificial__
))
211 _m_packssdw (__m64 __m1
, __m64 __m2
)
213 return _mm_packs_pi32 (__m1
, __m2
);
216 /* Pack the four 16-bit values from M1 into the lower four 8-bit values of
217 the result, and the four 16-bit values from M2 into the upper four 8-bit
218 values of the result, all with unsigned saturation. */
219 extern __inline __m64
__attribute__((__gnu_inline__
, __always_inline__
, __artificial__
))
220 _mm_packs_pu16 (__m64 __m1
, __m64 __m2
)
222 __vector
unsigned char r
;
223 __vector
signed short vm1
= (__vector
signed short) (__vector
long long)
224 #ifdef __LITTLE_ENDIAN__
229 const __vector
signed short __zero
= { 0 };
230 __vector __bool
short __select
= vec_cmplt (vm1
, __zero
);
231 r
= vec_packs ((__vector
unsigned short) vm1
, (__vector
unsigned short) vm1
);
232 __vector __bool
char packsel
= vec_pack (__select
, __select
);
233 r
= vec_sel (r
, (const __vector
unsigned char) __zero
, packsel
);
234 return (__m64
) ((__vector
long long) r
)[0];
237 extern __inline __m64
__attribute__((__gnu_inline__
, __always_inline__
, __artificial__
))
238 _m_packuswb (__m64 __m1
, __m64 __m2
)
240 return _mm_packs_pu16 (__m1
, __m2
);
242 #endif /* end ARCH_PWR8 */
244 /* Interleave the four 8-bit values from the high half of M1 with the four
245 8-bit values from the high half of M2. */
246 extern __inline __m64
__attribute__((__gnu_inline__
, __always_inline__
, __artificial__
))
247 _mm_unpackhi_pi8 (__m64 __m1
, __m64 __m2
)
250 __vector
unsigned char a
, b
, c
;
252 a
= (__vector
unsigned char)vec_splats (__m1
);
253 b
= (__vector
unsigned char)vec_splats (__m2
);
254 c
= vec_mergel (a
, b
);
255 return (__m64
) ((__vector
long long) c
)[1];
257 __m64_union m1
, m2
, res
;
262 res
.as_char
[0] = m1
.as_char
[4];
263 res
.as_char
[1] = m2
.as_char
[4];
264 res
.as_char
[2] = m1
.as_char
[5];
265 res
.as_char
[3] = m2
.as_char
[5];
266 res
.as_char
[4] = m1
.as_char
[6];
267 res
.as_char
[5] = m2
.as_char
[6];
268 res
.as_char
[6] = m1
.as_char
[7];
269 res
.as_char
[7] = m2
.as_char
[7];
271 return (__m64
) res
.as_m64
;
275 extern __inline __m64
__attribute__((__gnu_inline__
, __always_inline__
, __artificial__
))
276 _m_punpckhbw (__m64 __m1
, __m64 __m2
)
278 return _mm_unpackhi_pi8 (__m1
, __m2
);
281 /* Interleave the two 16-bit values from the high half of M1 with the two
282 16-bit values from the high half of M2. */
283 extern __inline __m64
__attribute__((__gnu_inline__
, __always_inline__
, __artificial__
))
284 _mm_unpackhi_pi16 (__m64 __m1
, __m64 __m2
)
286 __m64_union m1
, m2
, res
;
291 res
.as_short
[0] = m1
.as_short
[2];
292 res
.as_short
[1] = m2
.as_short
[2];
293 res
.as_short
[2] = m1
.as_short
[3];
294 res
.as_short
[3] = m2
.as_short
[3];
296 return (__m64
) res
.as_m64
;
299 extern __inline __m64
__attribute__((__gnu_inline__
, __always_inline__
, __artificial__
))
300 _m_punpckhwd (__m64 __m1
, __m64 __m2
)
302 return _mm_unpackhi_pi16 (__m1
, __m2
);
304 /* Interleave the 32-bit value from the high half of M1 with the 32-bit
305 value from the high half of M2. */
306 extern __inline __m64
__attribute__((__gnu_inline__
, __always_inline__
, __artificial__
))
307 _mm_unpackhi_pi32 (__m64 __m1
, __m64 __m2
)
309 __m64_union m1
, m2
, res
;
314 res
.as_int
[0] = m1
.as_int
[1];
315 res
.as_int
[1] = m2
.as_int
[1];
317 return (__m64
) res
.as_m64
;
320 extern __inline __m64
__attribute__((__gnu_inline__
, __always_inline__
, __artificial__
))
321 _m_punpckhdq (__m64 __m1
, __m64 __m2
)
323 return _mm_unpackhi_pi32 (__m1
, __m2
);
325 /* Interleave the four 8-bit values from the low half of M1 with the four
326 8-bit values from the low half of M2. */
327 extern __inline __m64
__attribute__((__gnu_inline__
, __always_inline__
, __artificial__
))
328 _mm_unpacklo_pi8 (__m64 __m1
, __m64 __m2
)
331 __vector
unsigned char a
, b
, c
;
333 a
= (__vector
unsigned char)vec_splats (__m1
);
334 b
= (__vector
unsigned char)vec_splats (__m2
);
335 c
= vec_mergel (a
, b
);
336 return (__m64
) ((__vector
long long) c
)[0];
338 __m64_union m1
, m2
, res
;
343 res
.as_char
[0] = m1
.as_char
[0];
344 res
.as_char
[1] = m2
.as_char
[0];
345 res
.as_char
[2] = m1
.as_char
[1];
346 res
.as_char
[3] = m2
.as_char
[1];
347 res
.as_char
[4] = m1
.as_char
[2];
348 res
.as_char
[5] = m2
.as_char
[2];
349 res
.as_char
[6] = m1
.as_char
[3];
350 res
.as_char
[7] = m2
.as_char
[3];
352 return (__m64
) res
.as_m64
;
356 extern __inline __m64
__attribute__((__gnu_inline__
, __always_inline__
, __artificial__
))
357 _m_punpcklbw (__m64 __m1
, __m64 __m2
)
359 return _mm_unpacklo_pi8 (__m1
, __m2
);
361 /* Interleave the two 16-bit values from the low half of M1 with the two
362 16-bit values from the low half of M2. */
363 extern __inline __m64
__attribute__((__gnu_inline__
, __always_inline__
, __artificial__
))
364 _mm_unpacklo_pi16 (__m64 __m1
, __m64 __m2
)
366 __m64_union m1
, m2
, res
;
371 res
.as_short
[0] = m1
.as_short
[0];
372 res
.as_short
[1] = m2
.as_short
[0];
373 res
.as_short
[2] = m1
.as_short
[1];
374 res
.as_short
[3] = m2
.as_short
[1];
376 return (__m64
) res
.as_m64
;
379 extern __inline __m64
__attribute__((__gnu_inline__
, __always_inline__
, __artificial__
))
380 _m_punpcklwd (__m64 __m1
, __m64 __m2
)
382 return _mm_unpacklo_pi16 (__m1
, __m2
);
385 /* Interleave the 32-bit value from the low half of M1 with the 32-bit
386 value from the low half of M2. */
387 extern __inline __m64
__attribute__((__gnu_inline__
, __always_inline__
, __artificial__
))
388 _mm_unpacklo_pi32 (__m64 __m1
, __m64 __m2
)
390 __m64_union m1
, m2
, res
;
395 res
.as_int
[0] = m1
.as_int
[0];
396 res
.as_int
[1] = m2
.as_int
[0];
398 return (__m64
) res
.as_m64
;
401 extern __inline __m64
__attribute__((__gnu_inline__
, __always_inline__
, __artificial__
))
402 _m_punpckldq (__m64 __m1
, __m64 __m2
)
404 return _mm_unpacklo_pi32 (__m1
, __m2
);
407 /* Add the 8-bit values in M1 to the 8-bit values in M2. */
408 extern __inline __m64
__attribute__((__gnu_inline__
, __always_inline__
, __artificial__
))
409 _mm_add_pi8 (__m64 __m1
, __m64 __m2
)
412 __vector
signed char a
, b
, c
;
414 a
= (__vector
signed char)vec_splats (__m1
);
415 b
= (__vector
signed char)vec_splats (__m2
);
417 return (__m64
) ((__vector
long long) c
)[0];
419 __m64_union m1
, m2
, res
;
424 res
.as_char
[0] = m1
.as_char
[0] + m2
.as_char
[0];
425 res
.as_char
[1] = m1
.as_char
[1] + m2
.as_char
[1];
426 res
.as_char
[2] = m1
.as_char
[2] + m2
.as_char
[2];
427 res
.as_char
[3] = m1
.as_char
[3] + m2
.as_char
[3];
428 res
.as_char
[4] = m1
.as_char
[4] + m2
.as_char
[4];
429 res
.as_char
[5] = m1
.as_char
[5] + m2
.as_char
[5];
430 res
.as_char
[6] = m1
.as_char
[6] + m2
.as_char
[6];
431 res
.as_char
[7] = m1
.as_char
[7] + m2
.as_char
[7];
433 return (__m64
) res
.as_m64
;
437 extern __inline __m64
__attribute__((__gnu_inline__
, __always_inline__
, __artificial__
))
438 _m_paddb (__m64 __m1
, __m64 __m2
)
440 return _mm_add_pi8 (__m1
, __m2
);
443 /* Add the 16-bit values in M1 to the 16-bit values in M2. */
444 extern __inline __m64
__attribute__((__gnu_inline__
, __always_inline__
, __artificial__
))
445 _mm_add_pi16 (__m64 __m1
, __m64 __m2
)
448 __vector
signed short a
, b
, c
;
450 a
= (__vector
signed short)vec_splats (__m1
);
451 b
= (__vector
signed short)vec_splats (__m2
);
453 return (__m64
) ((__vector
long long) c
)[0];
455 __m64_union m1
, m2
, res
;
460 res
.as_short
[0] = m1
.as_short
[0] + m2
.as_short
[0];
461 res
.as_short
[1] = m1
.as_short
[1] + m2
.as_short
[1];
462 res
.as_short
[2] = m1
.as_short
[2] + m2
.as_short
[2];
463 res
.as_short
[3] = m1
.as_short
[3] + m2
.as_short
[3];
465 return (__m64
) res
.as_m64
;
469 extern __inline __m64
__attribute__((__gnu_inline__
, __always_inline__
, __artificial__
))
470 _m_paddw (__m64 __m1
, __m64 __m2
)
472 return _mm_add_pi16 (__m1
, __m2
);
475 /* Add the 32-bit values in M1 to the 32-bit values in M2. */
476 extern __inline __m64
__attribute__((__gnu_inline__
, __always_inline__
, __artificial__
))
477 _mm_add_pi32 (__m64 __m1
, __m64 __m2
)
480 __vector
signed int a
, b
, c
;
482 a
= (__vector
signed int)vec_splats (__m1
);
483 b
= (__vector
signed int)vec_splats (__m2
);
485 return (__m64
) ((__vector
long long) c
)[0];
487 __m64_union m1
, m2
, res
;
492 res
.as_int
[0] = m1
.as_int
[0] + m2
.as_int
[0];
493 res
.as_int
[1] = m1
.as_int
[1] + m2
.as_int
[1];
495 return (__m64
) res
.as_m64
;
499 extern __inline __m64
__attribute__((__gnu_inline__
, __always_inline__
, __artificial__
))
500 _m_paddd (__m64 __m1
, __m64 __m2
)
502 return _mm_add_pi32 (__m1
, __m2
);
505 /* Subtract the 8-bit values in M2 from the 8-bit values in M1. */
506 extern __inline __m64
__attribute__((__gnu_inline__
, __always_inline__
, __artificial__
))
507 _mm_sub_pi8 (__m64 __m1
, __m64 __m2
)
510 __vector
signed char a
, b
, c
;
512 a
= (__vector
signed char)vec_splats (__m1
);
513 b
= (__vector
signed char)vec_splats (__m2
);
515 return (__m64
) ((__vector
long long) c
)[0];
517 __m64_union m1
, m2
, res
;
522 res
.as_char
[0] = m1
.as_char
[0] - m2
.as_char
[0];
523 res
.as_char
[1] = m1
.as_char
[1] - m2
.as_char
[1];
524 res
.as_char
[2] = m1
.as_char
[2] - m2
.as_char
[2];
525 res
.as_char
[3] = m1
.as_char
[3] - m2
.as_char
[3];
526 res
.as_char
[4] = m1
.as_char
[4] - m2
.as_char
[4];
527 res
.as_char
[5] = m1
.as_char
[5] - m2
.as_char
[5];
528 res
.as_char
[6] = m1
.as_char
[6] - m2
.as_char
[6];
529 res
.as_char
[7] = m1
.as_char
[7] - m2
.as_char
[7];
531 return (__m64
) res
.as_m64
;
535 extern __inline __m64
__attribute__((__gnu_inline__
, __always_inline__
, __artificial__
))
536 _m_psubb (__m64 __m1
, __m64 __m2
)
538 return _mm_sub_pi8 (__m1
, __m2
);
541 /* Subtract the 16-bit values in M2 from the 16-bit values in M1. */
542 extern __inline __m64
__attribute__((__gnu_inline__
, __always_inline__
, __artificial__
))
543 _mm_sub_pi16 (__m64 __m1
, __m64 __m2
)
546 __vector
signed short a
, b
, c
;
548 a
= (__vector
signed short)vec_splats (__m1
);
549 b
= (__vector
signed short)vec_splats (__m2
);
551 return (__m64
) ((__vector
long long) c
)[0];
553 __m64_union m1
, m2
, res
;
558 res
.as_short
[0] = m1
.as_short
[0] - m2
.as_short
[0];
559 res
.as_short
[1] = m1
.as_short
[1] - m2
.as_short
[1];
560 res
.as_short
[2] = m1
.as_short
[2] - m2
.as_short
[2];
561 res
.as_short
[3] = m1
.as_short
[3] - m2
.as_short
[3];
563 return (__m64
) res
.as_m64
;
567 extern __inline __m64
__attribute__((__gnu_inline__
, __always_inline__
, __artificial__
))
568 _m_psubw (__m64 __m1
, __m64 __m2
)
570 return _mm_sub_pi16 (__m1
, __m2
);
573 /* Subtract the 32-bit values in M2 from the 32-bit values in M1. */
574 extern __inline __m64
__attribute__((__gnu_inline__
, __always_inline__
, __artificial__
))
575 _mm_sub_pi32 (__m64 __m1
, __m64 __m2
)
578 __vector
signed int a
, b
, c
;
580 a
= (__vector
signed int)vec_splats (__m1
);
581 b
= (__vector
signed int)vec_splats (__m2
);
583 return (__m64
) ((__vector
long long) c
)[0];
585 __m64_union m1
, m2
, res
;
590 res
.as_int
[0] = m1
.as_int
[0] - m2
.as_int
[0];
591 res
.as_int
[1] = m1
.as_int
[1] - m2
.as_int
[1];
593 return (__m64
) res
.as_m64
;
597 extern __inline __m64
__attribute__((__gnu_inline__
, __always_inline__
, __artificial__
))
598 _m_psubd (__m64 __m1
, __m64 __m2
)
600 return _mm_sub_pi32 (__m1
, __m2
);
603 extern __inline __m64
__attribute__((__gnu_inline__
, __always_inline__
, __artificial__
))
604 _mm_add_si64 (__m64 __m1
, __m64 __m2
)
606 return (__m1
+ __m2
);
609 extern __inline __m64
__attribute__((__gnu_inline__
, __always_inline__
, __artificial__
))
610 _mm_sub_si64 (__m64 __m1
, __m64 __m2
)
612 return (__m1
- __m2
);
615 /* Shift the 64-bit value in M left by COUNT. */
616 extern __inline __m64
__attribute__((__gnu_inline__
, __always_inline__
, __artificial__
))
617 _mm_sll_si64 (__m64 __m
, __m64 __count
)
619 return (__m
<< __count
);
622 extern __inline __m64
__attribute__((__gnu_inline__
, __always_inline__
, __artificial__
))
623 _m_psllq (__m64 __m
, __m64 __count
)
625 return _mm_sll_si64 (__m
, __count
);
628 extern __inline __m64
__attribute__((__gnu_inline__
, __always_inline__
, __artificial__
))
629 _mm_slli_si64 (__m64 __m
, const int __count
)
631 return (__m
<< __count
);
634 extern __inline __m64
__attribute__((__gnu_inline__
, __always_inline__
, __artificial__
))
635 _m_psllqi (__m64 __m
, const int __count
)
637 return _mm_slli_si64 (__m
, __count
);
640 /* Shift the 64-bit value in M left by COUNT; shift in zeros. */
641 extern __inline __m64
__attribute__((__gnu_inline__
, __always_inline__
, __artificial__
))
642 _mm_srl_si64 (__m64 __m
, __m64 __count
)
644 return (__m
>> __count
);
647 extern __inline __m64
__attribute__((__gnu_inline__
, __always_inline__
, __artificial__
))
648 _m_psrlq (__m64 __m
, __m64 __count
)
650 return _mm_srl_si64 (__m
, __count
);
653 extern __inline __m64
__attribute__((__gnu_inline__
, __always_inline__
, __artificial__
))
654 _mm_srli_si64 (__m64 __m
, const int __count
)
656 return (__m
>> __count
);
659 extern __inline __m64
__attribute__((__gnu_inline__
, __always_inline__
, __artificial__
))
660 _m_psrlqi (__m64 __m
, const int __count
)
662 return _mm_srli_si64 (__m
, __count
);
665 /* Bit-wise AND the 64-bit values in M1 and M2. */
666 extern __inline __m64
__attribute__((__gnu_inline__
, __always_inline__
, __artificial__
))
667 _mm_and_si64 (__m64 __m1
, __m64 __m2
)
669 return (__m1
& __m2
);
672 extern __inline __m64
__attribute__((__gnu_inline__
, __always_inline__
, __artificial__
))
673 _m_pand (__m64 __m1
, __m64 __m2
)
675 return _mm_and_si64 (__m1
, __m2
);
678 /* Bit-wise complement the 64-bit value in M1 and bit-wise AND it with the
679 64-bit value in M2. */
680 extern __inline __m64
__attribute__((__gnu_inline__
, __always_inline__
, __artificial__
))
681 _mm_andnot_si64 (__m64 __m1
, __m64 __m2
)
683 return (~__m1
& __m2
);
686 extern __inline __m64
__attribute__((__gnu_inline__
, __always_inline__
, __artificial__
))
687 _m_pandn (__m64 __m1
, __m64 __m2
)
689 return _mm_andnot_si64 (__m1
, __m2
);
692 /* Bit-wise inclusive OR the 64-bit values in M1 and M2. */
693 extern __inline __m64
__attribute__((__gnu_inline__
, __always_inline__
, __artificial__
))
694 _mm_or_si64 (__m64 __m1
, __m64 __m2
)
696 return (__m1
| __m2
);
699 extern __inline __m64
__attribute__((__gnu_inline__
, __always_inline__
, __artificial__
))
700 _m_por (__m64 __m1
, __m64 __m2
)
702 return _mm_or_si64 (__m1
, __m2
);
705 /* Bit-wise exclusive OR the 64-bit values in M1 and M2. */
706 extern __inline __m64
__attribute__((__gnu_inline__
, __always_inline__
, __artificial__
))
707 _mm_xor_si64 (__m64 __m1
, __m64 __m2
)
709 return (__m1
^ __m2
);
712 extern __inline __m64
__attribute__((__gnu_inline__
, __always_inline__
, __artificial__
))
713 _m_pxor (__m64 __m1
, __m64 __m2
)
715 return _mm_xor_si64 (__m1
, __m2
);
718 /* Creates a 64-bit zero. */
719 extern __inline __m64
__attribute__((__gnu_inline__
, __always_inline__
, __artificial__
))
720 _mm_setzero_si64 (void)
725 /* Compare eight 8-bit values. The result of the comparison is 0xFF if the
726 test is true and zero if false. */
727 extern __inline __m64
__attribute__((__gnu_inline__
, __always_inline__
, __artificial__
))
728 _mm_cmpeq_pi8 (__m64 __m1
, __m64 __m2
)
730 #if defined(_ARCH_PWR6) && defined(__powerpc64__)
740 __m64_union m1
, m2
, res
;
745 res
.as_char
[0] = (m1
.as_char
[0] == m2
.as_char
[0])? -1: 0;
746 res
.as_char
[1] = (m1
.as_char
[1] == m2
.as_char
[1])? -1: 0;
747 res
.as_char
[2] = (m1
.as_char
[2] == m2
.as_char
[2])? -1: 0;
748 res
.as_char
[3] = (m1
.as_char
[3] == m2
.as_char
[3])? -1: 0;
749 res
.as_char
[4] = (m1
.as_char
[4] == m2
.as_char
[4])? -1: 0;
750 res
.as_char
[5] = (m1
.as_char
[5] == m2
.as_char
[5])? -1: 0;
751 res
.as_char
[6] = (m1
.as_char
[6] == m2
.as_char
[6])? -1: 0;
752 res
.as_char
[7] = (m1
.as_char
[7] == m2
.as_char
[7])? -1: 0;
754 return (__m64
) res
.as_m64
;
758 extern __inline __m64
__attribute__((__gnu_inline__
, __always_inline__
, __artificial__
))
759 _m_pcmpeqb (__m64 __m1
, __m64 __m2
)
761 return _mm_cmpeq_pi8 (__m1
, __m2
);
764 extern __inline __m64
__attribute__((__gnu_inline__
, __always_inline__
, __artificial__
))
765 _mm_cmpgt_pi8 (__m64 __m1
, __m64 __m2
)
768 __vector
signed char a
, b
, c
;
770 a
= (__vector
signed char)vec_splats (__m1
);
771 b
= (__vector
signed char)vec_splats (__m2
);
772 c
= (__vector
signed char)vec_cmpgt (a
, b
);
773 return (__m64
) ((__vector
long long) c
)[0];
775 __m64_union m1
, m2
, res
;
780 res
.as_char
[0] = (m1
.as_char
[0] > m2
.as_char
[0])? -1: 0;
781 res
.as_char
[1] = (m1
.as_char
[1] > m2
.as_char
[1])? -1: 0;
782 res
.as_char
[2] = (m1
.as_char
[2] > m2
.as_char
[2])? -1: 0;
783 res
.as_char
[3] = (m1
.as_char
[3] > m2
.as_char
[3])? -1: 0;
784 res
.as_char
[4] = (m1
.as_char
[4] > m2
.as_char
[4])? -1: 0;
785 res
.as_char
[5] = (m1
.as_char
[5] > m2
.as_char
[5])? -1: 0;
786 res
.as_char
[6] = (m1
.as_char
[6] > m2
.as_char
[6])? -1: 0;
787 res
.as_char
[7] = (m1
.as_char
[7] > m2
.as_char
[7])? -1: 0;
789 return (__m64
) res
.as_m64
;
793 extern __inline __m64
__attribute__((__gnu_inline__
, __always_inline__
, __artificial__
))
794 _m_pcmpgtb (__m64 __m1
, __m64 __m2
)
796 return _mm_cmpgt_pi8 (__m1
, __m2
);
799 /* Compare four 16-bit values. The result of the comparison is 0xFFFF if
800 the test is true and zero if false. */
801 extern __inline __m64
__attribute__((__gnu_inline__
, __always_inline__
, __artificial__
))
802 _mm_cmpeq_pi16 (__m64 __m1
, __m64 __m2
)
805 __vector
signed short a
, b
, c
;
807 a
= (__vector
signed short)vec_splats (__m1
);
808 b
= (__vector
signed short)vec_splats (__m2
);
809 c
= (__vector
signed short)vec_cmpeq (a
, b
);
810 return (__m64
) ((__vector
long long) c
)[0];
812 __m64_union m1
, m2
, res
;
817 res
.as_short
[0] = (m1
.as_short
[0] == m2
.as_short
[0])? -1: 0;
818 res
.as_short
[1] = (m1
.as_short
[1] == m2
.as_short
[1])? -1: 0;
819 res
.as_short
[2] = (m1
.as_short
[2] == m2
.as_short
[2])? -1: 0;
820 res
.as_short
[3] = (m1
.as_short
[3] == m2
.as_short
[3])? -1: 0;
822 return (__m64
) res
.as_m64
;
826 extern __inline __m64
__attribute__((__gnu_inline__
, __always_inline__
, __artificial__
))
827 _m_pcmpeqw (__m64 __m1
, __m64 __m2
)
829 return _mm_cmpeq_pi16 (__m1
, __m2
);
832 extern __inline __m64
__attribute__((__gnu_inline__
, __always_inline__
, __artificial__
))
833 _mm_cmpgt_pi16 (__m64 __m1
, __m64 __m2
)
836 __vector
signed short a
, b
, c
;
838 a
= (__vector
signed short)vec_splats (__m1
);
839 b
= (__vector
signed short)vec_splats (__m2
);
840 c
= (__vector
signed short)vec_cmpgt (a
, b
);
841 return (__m64
) ((__vector
long long) c
)[0];
843 __m64_union m1
, m2
, res
;
848 res
.as_short
[0] = (m1
.as_short
[0] > m2
.as_short
[0])? -1: 0;
849 res
.as_short
[1] = (m1
.as_short
[1] > m2
.as_short
[1])? -1: 0;
850 res
.as_short
[2] = (m1
.as_short
[2] > m2
.as_short
[2])? -1: 0;
851 res
.as_short
[3] = (m1
.as_short
[3] > m2
.as_short
[3])? -1: 0;
853 return (__m64
) res
.as_m64
;
857 extern __inline __m64
__attribute__((__gnu_inline__
, __always_inline__
, __artificial__
))
858 _m_pcmpgtw (__m64 __m1
, __m64 __m2
)
860 return _mm_cmpgt_pi16 (__m1
, __m2
);
863 /* Compare two 32-bit values. The result of the comparison is 0xFFFFFFFF if
864 the test is true and zero if false. */
865 extern __inline __m64
__attribute__((__gnu_inline__
, __always_inline__
, __artificial__
))
866 _mm_cmpeq_pi32 (__m64 __m1
, __m64 __m2
)
869 __vector
signed int a
, b
, c
;
871 a
= (__vector
signed int)vec_splats (__m1
);
872 b
= (__vector
signed int)vec_splats (__m2
);
873 c
= (__vector
signed int)vec_cmpeq (a
, b
);
874 return (__m64
) ((__vector
long long) c
)[0];
876 __m64_union m1
, m2
, res
;
881 res
.as_int
[0] = (m1
.as_int
[0] == m2
.as_int
[0])? -1: 0;
882 res
.as_int
[1] = (m1
.as_int
[1] == m2
.as_int
[1])? -1: 0;
884 return (__m64
) res
.as_m64
;
888 extern __inline __m64
__attribute__((__gnu_inline__
, __always_inline__
, __artificial__
))
889 _m_pcmpeqd (__m64 __m1
, __m64 __m2
)
891 return _mm_cmpeq_pi32 (__m1
, __m2
);
894 extern __inline __m64
__attribute__((__gnu_inline__
, __always_inline__
, __artificial__
))
895 _mm_cmpgt_pi32 (__m64 __m1
, __m64 __m2
)
898 __vector
signed int a
, b
, c
;
900 a
= (__vector
signed int)vec_splats (__m1
);
901 b
= (__vector
signed int)vec_splats (__m2
);
902 c
= (__vector
signed int)vec_cmpgt (a
, b
);
903 return (__m64
) ((__vector
long long) c
)[0];
905 __m64_union m1
, m2
, res
;
910 res
.as_int
[0] = (m1
.as_int
[0] > m2
.as_int
[0])? -1: 0;
911 res
.as_int
[1] = (m1
.as_int
[1] > m2
.as_int
[1])? -1: 0;
913 return (__m64
) res
.as_m64
;
917 extern __inline __m64
__attribute__((__gnu_inline__
, __always_inline__
, __artificial__
))
918 _m_pcmpgtd (__m64 __m1
, __m64 __m2
)
920 return _mm_cmpgt_pi32 (__m1
, __m2
);
924 /* Add the 8-bit values in M1 to the 8-bit values in M2 using signed
925 saturated arithmetic. */
926 extern __inline __m64
__attribute__((__gnu_inline__
, __always_inline__
, __artificial__
))
927 _mm_adds_pi8 (__m64 __m1
, __m64 __m2
)
929 __vector
signed char a
, b
, c
;
931 a
= (__vector
signed char)vec_splats (__m1
);
932 b
= (__vector
signed char)vec_splats (__m2
);
934 return (__m64
) ((__vector
long long) c
)[0];
937 extern __inline __m64
__attribute__((__gnu_inline__
, __always_inline__
, __artificial__
))
938 _m_paddsb (__m64 __m1
, __m64 __m2
)
940 return _mm_adds_pi8 (__m1
, __m2
);
942 /* Add the 16-bit values in M1 to the 16-bit values in M2 using signed
943 saturated arithmetic. */
944 extern __inline __m64
__attribute__((__gnu_inline__
, __always_inline__
, __artificial__
))
945 _mm_adds_pi16 (__m64 __m1
, __m64 __m2
)
947 __vector
signed short a
, b
, c
;
949 a
= (__vector
signed short)vec_splats (__m1
);
950 b
= (__vector
signed short)vec_splats (__m2
);
952 return (__m64
) ((__vector
long long) c
)[0];
955 extern __inline __m64
__attribute__((__gnu_inline__
, __always_inline__
, __artificial__
))
956 _m_paddsw (__m64 __m1
, __m64 __m2
)
958 return _mm_adds_pi16 (__m1
, __m2
);
960 /* Add the 8-bit values in M1 to the 8-bit values in M2 using unsigned
961 saturated arithmetic. */
962 extern __inline __m64
__attribute__((__gnu_inline__
, __always_inline__
, __artificial__
))
963 _mm_adds_pu8 (__m64 __m1
, __m64 __m2
)
965 __vector
unsigned char a
, b
, c
;
967 a
= (__vector
unsigned char)vec_splats (__m1
);
968 b
= (__vector
unsigned char)vec_splats (__m2
);
970 return (__m64
) ((__vector
long long) c
)[0];
973 extern __inline __m64
__attribute__((__gnu_inline__
, __always_inline__
, __artificial__
))
974 _m_paddusb (__m64 __m1
, __m64 __m2
)
976 return _mm_adds_pu8 (__m1
, __m2
);
979 /* Add the 16-bit values in M1 to the 16-bit values in M2 using unsigned
980 saturated arithmetic. */
981 extern __inline __m64
__attribute__((__gnu_inline__
, __always_inline__
, __artificial__
))
982 _mm_adds_pu16 (__m64 __m1
, __m64 __m2
)
984 __vector
unsigned short a
, b
, c
;
986 a
= (__vector
unsigned short)vec_splats (__m1
);
987 b
= (__vector
unsigned short)vec_splats (__m2
);
989 return (__m64
) ((__vector
long long) c
)[0];
992 extern __inline __m64
__attribute__((__gnu_inline__
, __always_inline__
, __artificial__
))
993 _m_paddusw (__m64 __m1
, __m64 __m2
)
995 return _mm_adds_pu16 (__m1
, __m2
);
998 /* Subtract the 8-bit values in M2 from the 8-bit values in M1 using signed
999 saturating arithmetic. */
1000 extern __inline __m64
__attribute__((__gnu_inline__
, __always_inline__
, __artificial__
))
1001 _mm_subs_pi8 (__m64 __m1
, __m64 __m2
)
1003 __vector
signed char a
, b
, c
;
1005 a
= (__vector
signed char)vec_splats (__m1
);
1006 b
= (__vector
signed char)vec_splats (__m2
);
1007 c
= vec_subs (a
, b
);
1008 return (__m64
) ((__vector
long long) c
)[0];
1011 extern __inline __m64
__attribute__((__gnu_inline__
, __always_inline__
, __artificial__
))
1012 _m_psubsb (__m64 __m1
, __m64 __m2
)
1014 return _mm_subs_pi8 (__m1
, __m2
);
1017 /* Subtract the 16-bit values in M2 from the 16-bit values in M1 using
1018 signed saturating arithmetic. */
1019 extern __inline __m64
__attribute__((__gnu_inline__
, __always_inline__
, __artificial__
))
1020 _mm_subs_pi16 (__m64 __m1
, __m64 __m2
)
1022 __vector
signed short a
, b
, c
;
1024 a
= (__vector
signed short)vec_splats (__m1
);
1025 b
= (__vector
signed short)vec_splats (__m2
);
1026 c
= vec_subs (a
, b
);
1027 return (__m64
) ((__vector
long long) c
)[0];
1030 extern __inline __m64
__attribute__((__gnu_inline__
, __always_inline__
, __artificial__
))
1031 _m_psubsw (__m64 __m1
, __m64 __m2
)
1033 return _mm_subs_pi16 (__m1
, __m2
);
1036 /* Subtract the 8-bit values in M2 from the 8-bit values in M1 using
1037 unsigned saturating arithmetic. */
1038 extern __inline __m64
__attribute__((__gnu_inline__
, __always_inline__
, __artificial__
))
1039 _mm_subs_pu8 (__m64 __m1
, __m64 __m2
)
1041 __vector
unsigned char a
, b
, c
;
1043 a
= (__vector
unsigned char)vec_splats (__m1
);
1044 b
= (__vector
unsigned char)vec_splats (__m2
);
1045 c
= vec_subs (a
, b
);
1046 return (__m64
) ((__vector
long long) c
)[0];
1049 extern __inline __m64
__attribute__((__gnu_inline__
, __always_inline__
, __artificial__
))
1050 _m_psubusb (__m64 __m1
, __m64 __m2
)
1052 return _mm_subs_pu8 (__m1
, __m2
);
1055 /* Subtract the 16-bit values in M2 from the 16-bit values in M1 using
1056 unsigned saturating arithmetic. */
1057 extern __inline __m64
__attribute__((__gnu_inline__
, __always_inline__
, __artificial__
))
1058 _mm_subs_pu16 (__m64 __m1
, __m64 __m2
)
1060 __vector
unsigned short a
, b
, c
;
1062 a
= (__vector
unsigned short)vec_splats (__m1
);
1063 b
= (__vector
unsigned short)vec_splats (__m2
);
1064 c
= vec_subs (a
, b
);
1065 return (__m64
) ((__vector
long long) c
)[0];
1068 extern __inline __m64
__attribute__((__gnu_inline__
, __always_inline__
, __artificial__
))
1069 _m_psubusw (__m64 __m1
, __m64 __m2
)
1071 return _mm_subs_pu16 (__m1
, __m2
);
1074 /* Multiply four 16-bit values in M1 by four 16-bit values in M2 producing
1075 four 32-bit intermediate results, which are then summed by pairs to
1076 produce two 32-bit results. */
1077 extern __inline __m64
__attribute__((__gnu_inline__
, __always_inline__
, __artificial__
))
1078 _mm_madd_pi16 (__m64 __m1
, __m64 __m2
)
1080 __vector
signed short a
, b
;
1081 __vector
signed int c
;
1082 __vector
signed int zero
= {0, 0, 0, 0};
1084 a
= (__vector
signed short)vec_splats (__m1
);
1085 b
= (__vector
signed short)vec_splats (__m2
);
1086 c
= vec_vmsumshm (a
, b
, zero
);
1087 return (__m64
) ((__vector
long long) c
)[0];
1090 extern __inline __m64
__attribute__((__gnu_inline__
, __always_inline__
, __artificial__
))
1091 _m_pmaddwd (__m64 __m1
, __m64 __m2
)
1093 return _mm_madd_pi16 (__m1
, __m2
);
1095 /* Multiply four signed 16-bit values in M1 by four signed 16-bit values in
1096 M2 and produce the high 16 bits of the 32-bit results. */
1097 extern __inline __m64
__attribute__((__gnu_inline__
, __always_inline__
, __artificial__
))
1098 _mm_mulhi_pi16 (__m64 __m1
, __m64 __m2
)
1100 __vector
signed short a
, b
;
1101 __vector
signed short c
;
1102 __vector
signed int w0
, w1
;
1103 __vector
unsigned char xform1
= {
1104 #ifdef __LITTLE_ENDIAN__
1105 0x02, 0x03, 0x12, 0x13, 0x06, 0x07, 0x16, 0x17,
1106 0x0A, 0x0B, 0x1A, 0x1B, 0x0E, 0x0F, 0x1E, 0x1F
1108 0x00, 0x01, 0x10, 0x11, 0x04, 0x05, 0x14, 0x15,
1109 0x00, 0x01, 0x10, 0x11, 0x04, 0x05, 0x14, 0x15
1113 a
= (__vector
signed short)vec_splats (__m1
);
1114 b
= (__vector
signed short)vec_splats (__m2
);
1116 w0
= vec_vmulesh (a
, b
);
1117 w1
= vec_vmulosh (a
, b
);
1118 c
= (__vector
signed short)vec_perm (w0
, w1
, xform1
);
1120 return (__m64
) ((__vector
long long) c
)[0];
1123 extern __inline __m64
__attribute__((__gnu_inline__
, __always_inline__
, __artificial__
))
1124 _m_pmulhw (__m64 __m1
, __m64 __m2
)
1126 return _mm_mulhi_pi16 (__m1
, __m2
);
1129 /* Multiply four 16-bit values in M1 by four 16-bit values in M2 and produce
1130 the low 16 bits of the results. */
1131 extern __inline __m64
__attribute__((__gnu_inline__
, __always_inline__
, __artificial__
))
1132 _mm_mullo_pi16 (__m64 __m1
, __m64 __m2
)
1134 __vector
signed short a
, b
, c
;
1136 a
= (__vector
signed short)vec_splats (__m1
);
1137 b
= (__vector
signed short)vec_splats (__m2
);
1139 return (__m64
) ((__vector
long long) c
)[0];
1142 extern __inline __m64
__attribute__((__gnu_inline__
, __always_inline__
, __artificial__
))
1143 _m_pmullw (__m64 __m1
, __m64 __m2
)
1145 return _mm_mullo_pi16 (__m1
, __m2
);
1148 /* Shift four 16-bit values in M left by COUNT. */
1149 extern __inline __m64
__attribute__((__gnu_inline__
, __always_inline__
, __artificial__
))
1150 _mm_sll_pi16 (__m64 __m
, __m64 __count
)
1152 __vector
signed short m
, r
;
1153 __vector
unsigned short c
;
1157 m
= (__vector
signed short)vec_splats (__m
);
1158 c
= (__vector
unsigned short)vec_splats ((unsigned short)__count
);
1159 r
= vec_sl (m
, (__vector
unsigned short)c
);
1160 return (__m64
) ((__vector
long long) r
)[0];
1166 extern __inline __m64
__attribute__((__gnu_inline__
, __always_inline__
, __artificial__
))
1167 _m_psllw (__m64 __m
, __m64 __count
)
1169 return _mm_sll_pi16 (__m
, __count
);
1172 extern __inline __m64
__attribute__((__gnu_inline__
, __always_inline__
, __artificial__
))
1173 _mm_slli_pi16 (__m64 __m
, int __count
)
1175 /* Promote int to long then invoke mm_sll_pi16. */
1176 return _mm_sll_pi16 (__m
, __count
);
1179 extern __inline __m64
__attribute__((__gnu_inline__
, __always_inline__
, __artificial__
))
1180 _m_psllwi (__m64 __m
, int __count
)
1182 return _mm_slli_pi16 (__m
, __count
);
1185 /* Shift two 32-bit values in M left by COUNT. */
1186 extern __inline __m64
__attribute__((__gnu_inline__
, __always_inline__
, __artificial__
))
1187 _mm_sll_pi32 (__m64 __m
, __m64 __count
)
1193 res
.as_int
[0] = m
.as_int
[0] << __count
;
1194 res
.as_int
[1] = m
.as_int
[1] << __count
;
1195 return (res
.as_m64
);
1198 extern __inline __m64
__attribute__((__gnu_inline__
, __always_inline__
, __artificial__
))
1199 _m_pslld (__m64 __m
, __m64 __count
)
1201 return _mm_sll_pi32 (__m
, __count
);
1204 extern __inline __m64
__attribute__((__gnu_inline__
, __always_inline__
, __artificial__
))
1205 _mm_slli_pi32 (__m64 __m
, int __count
)
1207 /* Promote int to long then invoke mm_sll_pi32. */
1208 return _mm_sll_pi32 (__m
, __count
);
1211 extern __inline __m64
__attribute__((__gnu_inline__
, __always_inline__
, __artificial__
))
1212 _m_pslldi (__m64 __m
, int __count
)
1214 return _mm_slli_pi32 (__m
, __count
);
1217 /* Shift four 16-bit values in M right by COUNT; shift in the sign bit. */
1218 extern __inline __m64
__attribute__((__gnu_inline__
, __always_inline__
, __artificial__
))
1219 _mm_sra_pi16 (__m64 __m
, __m64 __count
)
1221 __vector
signed short m
, r
;
1222 __vector
unsigned short c
;
1226 m
= (__vector
signed short)vec_splats (__m
);
1227 c
= (__vector
unsigned short)vec_splats ((unsigned short)__count
);
1228 r
= vec_sra (m
, (__vector
unsigned short)c
);
1229 return (__m64
) ((__vector
long long) r
)[0];
1235 extern __inline __m64
__attribute__((__gnu_inline__
, __always_inline__
, __artificial__
))
1236 _m_psraw (__m64 __m
, __m64 __count
)
1238 return _mm_sra_pi16 (__m
, __count
);
1241 extern __inline __m64
__attribute__((__gnu_inline__
, __always_inline__
, __artificial__
))
1242 _mm_srai_pi16 (__m64 __m
, int __count
)
1244 /* Promote int to long then invoke mm_sra_pi32. */
1245 return _mm_sra_pi16 (__m
, __count
);
1248 extern __inline __m64
__attribute__((__gnu_inline__
, __always_inline__
, __artificial__
))
1249 _m_psrawi (__m64 __m
, int __count
)
1251 return _mm_srai_pi16 (__m
, __count
);
1254 /* Shift two 32-bit values in M right by COUNT; shift in the sign bit. */
1255 extern __inline __m64
__attribute__((__gnu_inline__
, __always_inline__
, __artificial__
))
1256 _mm_sra_pi32 (__m64 __m
, __m64 __count
)
1262 res
.as_int
[0] = m
.as_int
[0] >> __count
;
1263 res
.as_int
[1] = m
.as_int
[1] >> __count
;
1264 return (res
.as_m64
);
1267 extern __inline __m64
__attribute__((__gnu_inline__
, __always_inline__
, __artificial__
))
1268 _m_psrad (__m64 __m
, __m64 __count
)
1270 return _mm_sra_pi32 (__m
, __count
);
1273 extern __inline __m64
__attribute__((__gnu_inline__
, __always_inline__
, __artificial__
))
1274 _mm_srai_pi32 (__m64 __m
, int __count
)
1276 /* Promote int to long then invoke mm_sra_pi32. */
1277 return _mm_sra_pi32 (__m
, __count
);
1280 extern __inline __m64
__attribute__((__gnu_inline__
, __always_inline__
, __artificial__
))
1281 _m_psradi (__m64 __m
, int __count
)
1283 return _mm_srai_pi32 (__m
, __count
);
1286 /* Shift four 16-bit values in M right by COUNT; shift in zeros. */
1287 extern __inline __m64
__attribute__((__gnu_inline__
, __always_inline__
, __artificial__
))
1288 _mm_srl_pi16 (__m64 __m
, __m64 __count
)
1290 __vector
unsigned short m
, r
;
1291 __vector
unsigned short c
;
1295 m
= (__vector
unsigned short)vec_splats (__m
);
1296 c
= (__vector
unsigned short)vec_splats ((unsigned short)__count
);
1297 r
= vec_sr (m
, (__vector
unsigned short)c
);
1298 return (__m64
) ((__vector
long long) r
)[0];
1304 extern __inline __m64
__attribute__((__gnu_inline__
, __always_inline__
, __artificial__
))
1305 _m_psrlw (__m64 __m
, __m64 __count
)
1307 return _mm_srl_pi16 (__m
, __count
);
1310 extern __inline __m64
__attribute__((__gnu_inline__
, __always_inline__
, __artificial__
))
1311 _mm_srli_pi16 (__m64 __m
, int __count
)
1313 /* Promote int to long then invoke mm_sra_pi32. */
1314 return _mm_srl_pi16 (__m
, __count
);
1317 extern __inline __m64
__attribute__((__gnu_inline__
, __always_inline__
, __artificial__
))
1318 _m_psrlwi (__m64 __m
, int __count
)
1320 return _mm_srli_pi16 (__m
, __count
);
1323 /* Shift two 32-bit values in M right by COUNT; shift in zeros. */
1324 extern __inline __m64
__attribute__((__gnu_inline__
, __always_inline__
, __artificial__
))
1325 _mm_srl_pi32 (__m64 __m
, __m64 __count
)
1331 res
.as_int
[0] = (unsigned int)m
.as_int
[0] >> __count
;
1332 res
.as_int
[1] = (unsigned int)m
.as_int
[1] >> __count
;
1333 return (res
.as_m64
);
1336 extern __inline __m64
__attribute__((__gnu_inline__
, __always_inline__
, __artificial__
))
1337 _m_psrld (__m64 __m
, __m64 __count
)
1339 return _mm_srl_pi32 (__m
, __count
);
1342 extern __inline __m64
__attribute__((__gnu_inline__
, __always_inline__
, __artificial__
))
1343 _mm_srli_pi32 (__m64 __m
, int __count
)
1345 /* Promote int to long then invoke mm_srl_pi32. */
1346 return _mm_srl_pi32 (__m
, __count
);
1349 extern __inline __m64
__attribute__((__gnu_inline__
, __always_inline__
, __artificial__
))
1350 _m_psrldi (__m64 __m
, int __count
)
1352 return _mm_srli_pi32 (__m
, __count
);
1354 #endif /* _ARCH_PWR8 */
1356 /* Creates a vector of two 32-bit values; I0 is least significant. */
1357 extern __inline __m64
__attribute__((__gnu_inline__
, __always_inline__
, __artificial__
))
1358 _mm_set_pi32 (int __i1
, int __i0
)
1362 res
.as_int
[0] = __i0
;
1363 res
.as_int
[1] = __i1
;
1364 return (res
.as_m64
);
1367 /* Creates a vector of four 16-bit values; W0 is least significant. */
1368 extern __inline __m64
__attribute__((__gnu_inline__
, __always_inline__
, __artificial__
))
1369 _mm_set_pi16 (short __w3
, short __w2
, short __w1
, short __w0
)
1373 res
.as_short
[0] = __w0
;
1374 res
.as_short
[1] = __w1
;
1375 res
.as_short
[2] = __w2
;
1376 res
.as_short
[3] = __w3
;
1377 return (res
.as_m64
);
1380 /* Creates a vector of eight 8-bit values; B0 is least significant. */
1381 extern __inline __m64
__attribute__((__gnu_inline__
, __always_inline__
, __artificial__
))
1382 _mm_set_pi8 (char __b7
, char __b6
, char __b5
, char __b4
,
1383 char __b3
, char __b2
, char __b1
, char __b0
)
1387 res
.as_char
[0] = __b0
;
1388 res
.as_char
[1] = __b1
;
1389 res
.as_char
[2] = __b2
;
1390 res
.as_char
[3] = __b3
;
1391 res
.as_char
[4] = __b4
;
1392 res
.as_char
[5] = __b5
;
1393 res
.as_char
[6] = __b6
;
1394 res
.as_char
[7] = __b7
;
1395 return (res
.as_m64
);
1398 /* Similar, but with the arguments in reverse order. */
1399 extern __inline __m64
__attribute__((__gnu_inline__
, __always_inline__
, __artificial__
))
1400 _mm_setr_pi32 (int __i0
, int __i1
)
1404 res
.as_int
[0] = __i0
;
1405 res
.as_int
[1] = __i1
;
1406 return (res
.as_m64
);
1409 extern __inline __m64
__attribute__((__gnu_inline__
, __always_inline__
, __artificial__
))
1410 _mm_setr_pi16 (short __w0
, short __w1
, short __w2
, short __w3
)
1412 return _mm_set_pi16 (__w3
, __w2
, __w1
, __w0
);
1415 extern __inline __m64
__attribute__((__gnu_inline__
, __always_inline__
, __artificial__
))
1416 _mm_setr_pi8 (char __b0
, char __b1
, char __b2
, char __b3
,
1417 char __b4
, char __b5
, char __b6
, char __b7
)
1419 return _mm_set_pi8 (__b7
, __b6
, __b5
, __b4
, __b3
, __b2
, __b1
, __b0
);
1422 /* Creates a vector of two 32-bit values, both elements containing I. */
1423 extern __inline __m64
__attribute__((__gnu_inline__
, __always_inline__
, __artificial__
))
1424 _mm_set1_pi32 (int __i
)
1428 res
.as_int
[0] = __i
;
1429 res
.as_int
[1] = __i
;
1430 return (res
.as_m64
);
1433 /* Creates a vector of four 16-bit values, all elements containing W. */
1434 extern __inline __m64
__attribute__((__gnu_inline__
, __always_inline__
, __artificial__
))
1435 _mm_set1_pi16 (short __w
)
1438 __vector
signed short w
;
1440 w
= (__vector
signed short)vec_splats (__w
);
1441 return (__m64
) ((__vector
long long) w
)[0];
1445 res
.as_short
[0] = __w
;
1446 res
.as_short
[1] = __w
;
1447 res
.as_short
[2] = __w
;
1448 res
.as_short
[3] = __w
;
1449 return (res
.as_m64
);
1453 /* Creates a vector of eight 8-bit values, all elements containing B. */
1454 extern __inline __m64
__attribute__((__gnu_inline__
, __always_inline__
, __artificial__
))
1455 _mm_set1_pi8 (signed char __b
)
1458 __vector
signed char b
;
1460 b
= (__vector
signed char)vec_splats (__b
);
1461 return (__m64
) ((__vector
long long) b
)[0];
1465 res
.as_char
[0] = __b
;
1466 res
.as_char
[1] = __b
;
1467 res
.as_char
[2] = __b
;
1468 res
.as_char
[3] = __b
;
1469 res
.as_char
[4] = __b
;
1470 res
.as_char
[5] = __b
;
1471 res
.as_char
[6] = __b
;
1472 res
.as_char
[7] = __b
;
1473 return (res
.as_m64
);
1476 #endif /* _MMINTRIN_H_INCLUDED */