]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - contrib/llvm/tools/clang/lib/Headers/tmmintrin.h
Merge ^/head r320398 through r320572.
[FreeBSD/FreeBSD.git] / contrib / llvm / tools / clang / lib / Headers / tmmintrin.h
1 /*===---- tmmintrin.h - SSSE3 intrinsics -----------------------------------===
2  *
3  * Permission is hereby granted, free of charge, to any person obtaining a copy
4  * of this software and associated documentation files (the "Software"), to deal
5  * in the Software without restriction, including without limitation the rights
6  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
7  * copies of the Software, and to permit persons to whom the Software is
8  * furnished to do so, subject to the following conditions:
9  *
10  * The above copyright notice and this permission notice shall be included in
11  * all copies or substantial portions of the Software.
12  *
13  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
15  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
16  * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
17  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
18  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
19  * THE SOFTWARE.
20  *
21  *===-----------------------------------------------------------------------===
22  */
23
24 #ifndef __TMMINTRIN_H
25 #define __TMMINTRIN_H
26
27 #include <pmmintrin.h>
28
29 /* Define the default attributes for the functions in this file. */
30 #define __DEFAULT_FN_ATTRS __attribute__((__always_inline__, __nodebug__, __target__("ssse3")))
31
32 /// \brief Computes the absolute value of each of the packed 8-bit signed
33 ///    integers in the source operand and stores the 8-bit unsigned integer
34 ///    results in the destination.
35 ///
36 /// \headerfile <x86intrin.h>
37 ///
38 /// This intrinsic corresponds to the \c PABSB instruction.
39 ///
40 /// \param __a
41 ///    A 64-bit vector of [8 x i8].
42 /// \returns A 64-bit integer vector containing the absolute values of the
43 ///    elements in the operand.
44 static __inline__ __m64 __DEFAULT_FN_ATTRS
45 _mm_abs_pi8(__m64 __a)
46 {
47     return (__m64)__builtin_ia32_pabsb((__v8qi)__a);
48 }
49
50 /// \brief Computes the absolute value of each of the packed 8-bit signed
51 ///    integers in the source operand and stores the 8-bit unsigned integer
52 ///    results in the destination.
53 ///
54 /// \headerfile <x86intrin.h>
55 ///
56 /// This intrinsic corresponds to the \c VPABSB instruction.
57 ///
58 /// \param __a
59 ///    A 128-bit vector of [16 x i8].
60 /// \returns A 128-bit integer vector containing the absolute values of the
61 ///    elements in the operand.
62 static __inline__ __m128i __DEFAULT_FN_ATTRS
63 _mm_abs_epi8(__m128i __a)
64 {
65     return (__m128i)__builtin_ia32_pabsb128((__v16qi)__a);
66 }
67
68 /// \brief Computes the absolute value of each of the packed 16-bit signed
69 ///    integers in the source operand and stores the 16-bit unsigned integer
70 ///    results in the destination.
71 ///
72 /// \headerfile <x86intrin.h>
73 ///
74 /// This intrinsic corresponds to the \c PABSW instruction.
75 ///
76 /// \param __a
77 ///    A 64-bit vector of [4 x i16].
78 /// \returns A 64-bit integer vector containing the absolute values of the
79 ///    elements in the operand.
80 static __inline__ __m64 __DEFAULT_FN_ATTRS
81 _mm_abs_pi16(__m64 __a)
82 {
83     return (__m64)__builtin_ia32_pabsw((__v4hi)__a);
84 }
85
86 /// \brief Computes the absolute value of each of the packed 16-bit signed
87 ///    integers in the source operand and stores the 16-bit unsigned integer
88 ///    results in the destination.
89 ///
90 /// \headerfile <x86intrin.h>
91 ///
92 /// This intrinsic corresponds to the \c VPABSW instruction.
93 ///
94 /// \param __a
95 ///    A 128-bit vector of [8 x i16].
96 /// \returns A 128-bit integer vector containing the absolute values of the
97 ///    elements in the operand.
98 static __inline__ __m128i __DEFAULT_FN_ATTRS
99 _mm_abs_epi16(__m128i __a)
100 {
101     return (__m128i)__builtin_ia32_pabsw128((__v8hi)__a);
102 }
103
104 /// \brief Computes the absolute value of each of the packed 32-bit signed
105 ///    integers in the source operand and stores the 32-bit unsigned integer
106 ///    results in the destination.
107 ///
108 /// \headerfile <x86intrin.h>
109 ///
110 /// This intrinsic corresponds to the \c PABSD instruction.
111 ///
112 /// \param __a
113 ///    A 64-bit vector of [2 x i32].
114 /// \returns A 64-bit integer vector containing the absolute values of the
115 ///    elements in the operand.
116 static __inline__ __m64 __DEFAULT_FN_ATTRS
117 _mm_abs_pi32(__m64 __a)
118 {
119     return (__m64)__builtin_ia32_pabsd((__v2si)__a);
120 }
121
122 /// \brief Computes the absolute value of each of the packed 32-bit signed
123 ///    integers in the source operand and stores the 32-bit unsigned integer
124 ///    results in the destination.
125 ///
126 /// \headerfile <x86intrin.h>
127 ///
128 /// This intrinsic corresponds to the \c VPABSD instruction.
129 ///
130 /// \param __a
131 ///    A 128-bit vector of [4 x i32].
132 /// \returns A 128-bit integer vector containing the absolute values of the
133 ///    elements in the operand.
134 static __inline__ __m128i __DEFAULT_FN_ATTRS
135 _mm_abs_epi32(__m128i __a)
136 {
137     return (__m128i)__builtin_ia32_pabsd128((__v4si)__a);
138 }
139
140 /// \brief Concatenates the two 128-bit integer vector operands, and
141 ///    right-shifts the result by the number of bytes specified in the immediate
142 ///    operand.
143 ///
144 /// \headerfile <x86intrin.h>
145 ///
146 /// \code
147 /// __m128i _mm_alignr_epi8(__m128i a, __m128i b, const int n);
148 /// \endcode
149 ///
150 /// This intrinsic corresponds to the \c PALIGNR instruction.
151 ///
152 /// \param a
153 ///    A 128-bit vector of [16 x i8] containing one of the source operands.
154 /// \param b
155 ///    A 128-bit vector of [16 x i8] containing one of the source operands.
156 /// \param n
157 ///    An immediate operand specifying how many bytes to right-shift the result.
158 /// \returns A 128-bit integer vector containing the concatenated right-shifted
159 ///    value.
160 #define _mm_alignr_epi8(a, b, n) __extension__ ({ \
161   (__m128i)__builtin_ia32_palignr128((__v16qi)(__m128i)(a), \
162                                      (__v16qi)(__m128i)(b), (n)); })
163
164 /// \brief Concatenates the two 64-bit integer vector operands, and right-shifts
165 ///    the result by the number of bytes specified in the immediate operand.
166 ///
167 /// \headerfile <x86intrin.h>
168 ///
169 /// \code
170 /// __m64 _mm_alignr_pi8(__m64 a, __m64 b, const int n);
171 /// \endcode
172 ///
173 /// This intrinsic corresponds to the \c PALIGNR instruction.
174 ///
175 /// \param a
176 ///    A 64-bit vector of [8 x i8] containing one of the source operands.
177 /// \param b
178 ///    A 64-bit vector of [8 x i8] containing one of the source operands.
179 /// \param n
180 ///    An immediate operand specifying how many bytes to right-shift the result.
181 /// \returns A 64-bit integer vector containing the concatenated right-shifted
182 ///    value.
183 #define _mm_alignr_pi8(a, b, n) __extension__ ({ \
184   (__m64)__builtin_ia32_palignr((__v8qi)(__m64)(a), (__v8qi)(__m64)(b), (n)); })
185
186 /// \brief Horizontally adds the adjacent pairs of values contained in 2 packed
187 ///    128-bit vectors of [8 x i16].
188 ///
189 /// \headerfile <x86intrin.h>
190 ///
191 /// This intrinsic corresponds to the \c VPHADDW instruction.
192 ///
193 /// \param __a
194 ///    A 128-bit vector of [8 x i16] containing one of the source operands. The
195 ///    horizontal sums of the values are stored in the lower bits of the
196 ///    destination.
197 /// \param __b
198 ///    A 128-bit vector of [8 x i16] containing one of the source operands. The
199 ///    horizontal sums of the values are stored in the upper bits of the
200 ///    destination.
201 /// \returns A 128-bit vector of [8 x i16] containing the horizontal sums of
202 ///    both operands.
203 static __inline__ __m128i __DEFAULT_FN_ATTRS
204 _mm_hadd_epi16(__m128i __a, __m128i __b)
205 {
206     return (__m128i)__builtin_ia32_phaddw128((__v8hi)__a, (__v8hi)__b);
207 }
208
209 /// \brief Horizontally adds the adjacent pairs of values contained in 2 packed
210 ///    128-bit vectors of [4 x i32].
211 ///
212 /// \headerfile <x86intrin.h>
213 ///
214 /// This intrinsic corresponds to the \c VPHADDD instruction.
215 ///
216 /// \param __a
217 ///    A 128-bit vector of [4 x i32] containing one of the source operands. The
218 ///    horizontal sums of the values are stored in the lower bits of the
219 ///    destination.
220 /// \param __b
221 ///    A 128-bit vector of [4 x i32] containing one of the source operands. The
222 ///    horizontal sums of the values are stored in the upper bits of the
223 ///    destination.
224 /// \returns A 128-bit vector of [4 x i32] containing the horizontal sums of
225 ///    both operands.
226 static __inline__ __m128i __DEFAULT_FN_ATTRS
227 _mm_hadd_epi32(__m128i __a, __m128i __b)
228 {
229     return (__m128i)__builtin_ia32_phaddd128((__v4si)__a, (__v4si)__b);
230 }
231
232 /// \brief Horizontally adds the adjacent pairs of values contained in 2 packed
233 ///    64-bit vectors of [4 x i16].
234 ///
235 /// \headerfile <x86intrin.h>
236 ///
237 /// This intrinsic corresponds to the \c PHADDW instruction.
238 ///
239 /// \param __a
240 ///    A 64-bit vector of [4 x i16] containing one of the source operands. The
241 ///    horizontal sums of the values are stored in the lower bits of the
242 ///    destination.
243 /// \param __b
244 ///    A 64-bit vector of [4 x i16] containing one of the source operands. The
245 ///    horizontal sums of the values are stored in the upper bits of the
246 ///    destination.
247 /// \returns A 64-bit vector of [4 x i16] containing the horizontal sums of both
248 ///    operands.
249 static __inline__ __m64 __DEFAULT_FN_ATTRS
250 _mm_hadd_pi16(__m64 __a, __m64 __b)
251 {
252     return (__m64)__builtin_ia32_phaddw((__v4hi)__a, (__v4hi)__b);
253 }
254
255 /// \brief Horizontally adds the adjacent pairs of values contained in 2 packed
256 ///    64-bit vectors of [2 x i32].
257 ///
258 /// \headerfile <x86intrin.h>
259 ///
260 /// This intrinsic corresponds to the \c PHADDD instruction.
261 ///
262 /// \param __a
263 ///    A 64-bit vector of [2 x i32] containing one of the source operands. The
264 ///    horizontal sums of the values are stored in the lower bits of the
265 ///    destination.
266 /// \param __b
267 ///    A 64-bit vector of [2 x i32] containing one of the source operands. The
268 ///    horizontal sums of the values are stored in the upper bits of the
269 ///    destination.
270 /// \returns A 64-bit vector of [2 x i32] containing the horizontal sums of both
271 ///    operands.
272 static __inline__ __m64 __DEFAULT_FN_ATTRS
273 _mm_hadd_pi32(__m64 __a, __m64 __b)
274 {
275     return (__m64)__builtin_ia32_phaddd((__v2si)__a, (__v2si)__b);
276 }
277
278 /// \brief Horizontally adds the adjacent pairs of values contained in 2 packed
279 ///    128-bit vectors of [8 x i16]. Positive sums greater than 7FFFh are
280 ///    saturated to 7FFFh. Negative sums less than 8000h are saturated to 8000h.
281 ///
282 /// \headerfile <x86intrin.h>
283 ///
284 /// This intrinsic corresponds to the \c VPHADDSW instruction.
285 ///
286 /// \param __a
287 ///    A 128-bit vector of [8 x i16] containing one of the source operands. The
288 ///    horizontal sums of the values are stored in the lower bits of the
289 ///    destination.
290 /// \param __b
291 ///    A 128-bit vector of [8 x i16] containing one of the source operands. The
292 ///    horizontal sums of the values are stored in the upper bits of the
293 ///    destination.
294 /// \returns A 128-bit vector of [8 x i16] containing the horizontal saturated
295 ///    sums of both operands.
296 static __inline__ __m128i __DEFAULT_FN_ATTRS
297 _mm_hadds_epi16(__m128i __a, __m128i __b)
298 {
299     return (__m128i)__builtin_ia32_phaddsw128((__v8hi)__a, (__v8hi)__b);
300 }
301
302 /// \brief Horizontally adds the adjacent pairs of values contained in 2 packed
303 ///    64-bit vectors of [4 x i16]. Positive sums greater than 7FFFh are
304 ///    saturated to 7FFFh. Negative sums less than 8000h are saturated to 8000h.
305 ///
306 /// \headerfile <x86intrin.h>
307 ///
308 /// This intrinsic corresponds to the \c PHADDSW instruction.
309 ///
310 /// \param __a
311 ///    A 64-bit vector of [4 x i16] containing one of the source operands. The
312 ///    horizontal sums of the values are stored in the lower bits of the
313 ///    destination.
314 /// \param __b
315 ///    A 64-bit vector of [4 x i16] containing one of the source operands. The
316 ///    horizontal sums of the values are stored in the upper bits of the
317 ///    destination.
318 /// \returns A 64-bit vector of [4 x i16] containing the horizontal saturated
319 ///    sums of both operands.
320 static __inline__ __m64 __DEFAULT_FN_ATTRS
321 _mm_hadds_pi16(__m64 __a, __m64 __b)
322 {
323     return (__m64)__builtin_ia32_phaddsw((__v4hi)__a, (__v4hi)__b);
324 }
325
326 /// \brief Horizontally subtracts the adjacent pairs of values contained in 2
327 ///    packed 128-bit vectors of [8 x i16].
328 ///
329 /// \headerfile <x86intrin.h>
330 ///
331 /// This intrinsic corresponds to the \c VPHSUBW instruction.
332 ///
333 /// \param __a
334 ///    A 128-bit vector of [8 x i16] containing one of the source operands. The
335 ///    horizontal differences between the values are stored in the lower bits of
336 ///    the destination.
337 /// \param __b
338 ///    A 128-bit vector of [8 x i16] containing one of the source operands. The
339 ///    horizontal differences between the values are stored in the upper bits of
340 ///    the destination.
341 /// \returns A 128-bit vector of [8 x i16] containing the horizontal differences
342 ///    of both operands.
343 static __inline__ __m128i __DEFAULT_FN_ATTRS
344 _mm_hsub_epi16(__m128i __a, __m128i __b)
345 {
346     return (__m128i)__builtin_ia32_phsubw128((__v8hi)__a, (__v8hi)__b);
347 }
348
349 /// \brief Horizontally subtracts the adjacent pairs of values contained in 2
350 ///    packed 128-bit vectors of [4 x i32].
351 ///
352 /// \headerfile <x86intrin.h>
353 ///
354 /// This intrinsic corresponds to the \c VPHSUBD instruction.
355 ///
356 /// \param __a
357 ///    A 128-bit vector of [4 x i32] containing one of the source operands. The
358 ///    horizontal differences between the values are stored in the lower bits of
359 ///    the destination.
360 /// \param __b
361 ///    A 128-bit vector of [4 x i32] containing one of the source operands. The
362 ///    horizontal differences between the values are stored in the upper bits of
363 ///    the destination.
364 /// \returns A 128-bit vector of [4 x i32] containing the horizontal differences
365 ///    of both operands.
366 static __inline__ __m128i __DEFAULT_FN_ATTRS
367 _mm_hsub_epi32(__m128i __a, __m128i __b)
368 {
369     return (__m128i)__builtin_ia32_phsubd128((__v4si)__a, (__v4si)__b);
370 }
371
372 /// \brief Horizontally subtracts the adjacent pairs of values contained in 2
373 ///    packed 64-bit vectors of [4 x i16].
374 ///
375 /// \headerfile <x86intrin.h>
376 ///
377 /// This intrinsic corresponds to the \c PHSUBW instruction.
378 ///
379 /// \param __a
380 ///    A 64-bit vector of [4 x i16] containing one of the source operands. The
381 ///    horizontal differences between the values are stored in the lower bits of
382 ///    the destination.
383 /// \param __b
384 ///    A 64-bit vector of [4 x i16] containing one of the source operands. The
385 ///    horizontal differences between the values are stored in the upper bits of
386 ///    the destination.
387 /// \returns A 64-bit vector of [4 x i16] containing the horizontal differences
388 ///    of both operands.
389 static __inline__ __m64 __DEFAULT_FN_ATTRS
390 _mm_hsub_pi16(__m64 __a, __m64 __b)
391 {
392     return (__m64)__builtin_ia32_phsubw((__v4hi)__a, (__v4hi)__b);
393 }
394
395 /// \brief Horizontally subtracts the adjacent pairs of values contained in 2
396 ///    packed 64-bit vectors of [2 x i32].
397 ///
398 /// \headerfile <x86intrin.h>
399 ///
400 /// This intrinsic corresponds to the \c PHSUBD instruction.
401 ///
402 /// \param __a
403 ///    A 64-bit vector of [2 x i32] containing one of the source operands. The
404 ///    horizontal differences between the values are stored in the lower bits of
405 ///    the destination.
406 /// \param __b
407 ///    A 64-bit vector of [2 x i32] containing one of the source operands. The
408 ///    horizontal differences between the values are stored in the upper bits of
409 ///    the destination.
410 /// \returns A 64-bit vector of [2 x i32] containing the horizontal differences
411 ///    of both operands.
412 static __inline__ __m64 __DEFAULT_FN_ATTRS
413 _mm_hsub_pi32(__m64 __a, __m64 __b)
414 {
415     return (__m64)__builtin_ia32_phsubd((__v2si)__a, (__v2si)__b);
416 }
417
418 /// \brief Horizontally subtracts the adjacent pairs of values contained in 2
419 ///    packed 128-bit vectors of [8 x i16]. Positive differences greater than
420 ///    7FFFh are saturated to 7FFFh. Negative differences less than 8000h are
421 ///    saturated to 8000h.
422 ///
423 /// \headerfile <x86intrin.h>
424 ///
425 /// This intrinsic corresponds to the \c VPHSUBSW instruction.
426 ///
427 /// \param __a
428 ///    A 128-bit vector of [8 x i16] containing one of the source operands. The
429 ///    horizontal differences between the values are stored in the lower bits of
430 ///    the destination.
431 /// \param __b
432 ///    A 128-bit vector of [8 x i16] containing one of the source operands. The
433 ///    horizontal differences between the values are stored in the upper bits of
434 ///    the destination.
435 /// \returns A 128-bit vector of [8 x i16] containing the horizontal saturated
436 ///    differences of both operands.
437 static __inline__ __m128i __DEFAULT_FN_ATTRS
438 _mm_hsubs_epi16(__m128i __a, __m128i __b)
439 {
440     return (__m128i)__builtin_ia32_phsubsw128((__v8hi)__a, (__v8hi)__b);
441 }
442
443 /// \brief Horizontally subtracts the adjacent pairs of values contained in 2
444 ///    packed 64-bit vectors of [4 x i16]. Positive differences greater than
445 ///    7FFFh are saturated to 7FFFh. Negative differences less than 8000h are
446 ///    saturated to 8000h.
447 ///
448 /// \headerfile <x86intrin.h>
449 ///
450 /// This intrinsic corresponds to the \c PHSUBSW instruction.
451 ///
452 /// \param __a
453 ///    A 64-bit vector of [4 x i16] containing one of the source operands. The
454 ///    horizontal differences between the values are stored in the lower bits of
455 ///    the destination.
456 /// \param __b
457 ///    A 64-bit vector of [4 x i16] containing one of the source operands. The
458 ///    horizontal differences between the values are stored in the upper bits of
459 ///    the destination.
460 /// \returns A 64-bit vector of [4 x i16] containing the horizontal saturated
461 ///    differences of both operands.
462 static __inline__ __m64 __DEFAULT_FN_ATTRS
463 _mm_hsubs_pi16(__m64 __a, __m64 __b)
464 {
465     return (__m64)__builtin_ia32_phsubsw((__v4hi)__a, (__v4hi)__b);
466 }
467
468 /// \brief Multiplies corresponding pairs of packed 8-bit unsigned integer
469 ///    values contained in the first source operand and packed 8-bit signed
470 ///    integer values contained in the second source operand, adds pairs of
471 ///    contiguous products with signed saturation, and writes the 16-bit sums to
472 ///    the corresponding bits in the destination.
473 ///
474 ///    For example, bits [7:0] of both operands are multiplied, bits [15:8] of
475 ///    both operands are multiplied, and the sum of both results is written to
476 ///    bits [15:0] of the destination.
477 ///
478 /// \headerfile <x86intrin.h>
479 ///
480 /// This intrinsic corresponds to the \c VPMADDUBSW instruction.
481 ///
482 /// \param __a
483 ///    A 128-bit integer vector containing the first source operand.
484 /// \param __b
485 ///    A 128-bit integer vector containing the second source operand.
486 /// \returns A 128-bit integer vector containing the sums of products of both
487 ///    operands: \n
488 ///    \a R0 := (\a __a0 * \a __b0) + (\a __a1 * \a __b1) \n
489 ///    \a R1 := (\a __a2 * \a __b2) + (\a __a3 * \a __b3) \n
490 ///    \a R2 := (\a __a4 * \a __b4) + (\a __a5 * \a __b5) \n
491 ///    \a R3 := (\a __a6 * \a __b6) + (\a __a7 * \a __b7) \n
492 ///    \a R4 := (\a __a8 * \a __b8) + (\a __a9 * \a __b9) \n
493 ///    \a R5 := (\a __a10 * \a __b10) + (\a __a11 * \a __b11) \n
494 ///    \a R6 := (\a __a12 * \a __b12) + (\a __a13 * \a __b13) \n
495 ///    \a R7 := (\a __a14 * \a __b14) + (\a __a15 * \a __b15)
496 static __inline__ __m128i __DEFAULT_FN_ATTRS
497 _mm_maddubs_epi16(__m128i __a, __m128i __b)
498 {
499     return (__m128i)__builtin_ia32_pmaddubsw128((__v16qi)__a, (__v16qi)__b);
500 }
501
502 /// \brief Multiplies corresponding pairs of packed 8-bit unsigned integer
503 ///    values contained in the first source operand and packed 8-bit signed
504 ///    integer values contained in the second source operand, adds pairs of
505 ///    contiguous products with signed saturation, and writes the 16-bit sums to
506 ///    the corresponding bits in the destination.
507 ///
508 ///    For example, bits [7:0] of both operands are multiplied, bits [15:8] of
509 ///    both operands are multiplied, and the sum of both results is written to
510 ///    bits [15:0] of the destination.
511 ///
512 /// \headerfile <x86intrin.h>
513 ///
514 /// This intrinsic corresponds to the \c PMADDUBSW instruction.
515 ///
516 /// \param __a
517 ///    A 64-bit integer vector containing the first source operand.
518 /// \param __b
519 ///    A 64-bit integer vector containing the second source operand.
520 /// \returns A 64-bit integer vector containing the sums of products of both
521 ///    operands: \n
522 ///    \a R0 := (\a __a0 * \a __b0) + (\a __a1 * \a __b1) \n
523 ///    \a R1 := (\a __a2 * \a __b2) + (\a __a3 * \a __b3) \n
524 ///    \a R2 := (\a __a4 * \a __b4) + (\a __a5 * \a __b5) \n
525 ///    \a R3 := (\a __a6 * \a __b6) + (\a __a7 * \a __b7)
526 static __inline__ __m64 __DEFAULT_FN_ATTRS
527 _mm_maddubs_pi16(__m64 __a, __m64 __b)
528 {
529     return (__m64)__builtin_ia32_pmaddubsw((__v8qi)__a, (__v8qi)__b);
530 }
531
532 /// \brief Multiplies packed 16-bit signed integer values, truncates the 32-bit
533 ///    products to the 18 most significant bits by right-shifting, rounds the
534 ///    truncated value by adding 1, and writes bits [16:1] to the destination.
535 ///
536 /// \headerfile <x86intrin.h>
537 ///
538 /// This intrinsic corresponds to the \c VPMULHRSW instruction.
539 ///
540 /// \param __a
541 ///    A 128-bit vector of [8 x i16] containing one of the source operands.
542 /// \param __b
543 ///    A 128-bit vector of [8 x i16] containing one of the source operands.
544 /// \returns A 128-bit vector of [8 x i16] containing the rounded and scaled
545 ///    products of both operands.
546 static __inline__ __m128i __DEFAULT_FN_ATTRS
547 _mm_mulhrs_epi16(__m128i __a, __m128i __b)
548 {
549     return (__m128i)__builtin_ia32_pmulhrsw128((__v8hi)__a, (__v8hi)__b);
550 }
551
552 /// \brief Multiplies packed 16-bit signed integer values, truncates the 32-bit
553 ///    products to the 18 most significant bits by right-shifting, rounds the
554 ///    truncated value by adding 1, and writes bits [16:1] to the destination.
555 ///
556 /// \headerfile <x86intrin.h>
557 ///
558 /// This intrinsic corresponds to the \c PMULHRSW instruction.
559 ///
560 /// \param __a
561 ///    A 64-bit vector of [4 x i16] containing one of the source operands.
562 /// \param __b
563 ///    A 64-bit vector of [4 x i16] containing one of the source operands.
564 /// \returns A 64-bit vector of [4 x i16] containing the rounded and scaled
565 ///    products of both operands.
566 static __inline__ __m64 __DEFAULT_FN_ATTRS
567 _mm_mulhrs_pi16(__m64 __a, __m64 __b)
568 {
569     return (__m64)__builtin_ia32_pmulhrsw((__v4hi)__a, (__v4hi)__b);
570 }
571
572 /// \brief Copies the 8-bit integers from a 128-bit integer vector to the
573 ///    destination or clears 8-bit values in the destination, as specified by
574 ///    the second source operand.
575 ///
576 /// \headerfile <x86intrin.h>
577 ///
578 /// This intrinsic corresponds to the \c VPSHUFB instruction.
579 ///
580 /// \param __a
581 ///    A 128-bit integer vector containing the values to be copied.
582 /// \param __b
583 ///    A 128-bit integer vector containing control bytes corresponding to
584 ///    positions in the destination:
585 ///    Bit 7: \n
586 ///    1: Clear the corresponding byte in the destination. \n
587 ///    0: Copy the selected source byte to the corresponding byte in the
588 ///    destination. \n
589 ///    Bits [6:4] Reserved.  \n
590 ///    Bits [3:0] select the source byte to be copied.
591 /// \returns A 128-bit integer vector containing the copied or cleared values.
592 static __inline__ __m128i __DEFAULT_FN_ATTRS
593 _mm_shuffle_epi8(__m128i __a, __m128i __b)
594 {
595     return (__m128i)__builtin_ia32_pshufb128((__v16qi)__a, (__v16qi)__b);
596 }
597
598 /// \brief Copies the 8-bit integers from a 64-bit integer vector to the
599 ///    destination or clears 8-bit values in the destination, as specified by
600 ///    the second source operand.
601 ///
602 /// \headerfile <x86intrin.h>
603 ///
604 /// This intrinsic corresponds to the \c PSHUFB instruction.
605 ///
606 /// \param __a
607 ///    A 64-bit integer vector containing the values to be copied.
608 /// \param __b
609 ///    A 64-bit integer vector containing control bytes corresponding to
610 ///    positions in the destination:
611 ///    Bit 7: \n
612 ///    1: Clear the corresponding byte in the destination. \n
613 ///    0: Copy the selected source byte to the corresponding byte in the
614 ///    destination. \n
615 ///    Bits [3:0] select the source byte to be copied.
616 /// \returns A 64-bit integer vector containing the copied or cleared values.
617 static __inline__ __m64 __DEFAULT_FN_ATTRS
618 _mm_shuffle_pi8(__m64 __a, __m64 __b)
619 {
620     return (__m64)__builtin_ia32_pshufb((__v8qi)__a, (__v8qi)__b);
621 }
622
623 /// \brief For each 8-bit integer in the first source operand, perform one of
624 ///    the following actions as specified by the second source operand.
625 ///
626 ///    If the byte in the second source is negative, calculate the two's
627 ///    complement of the corresponding byte in the first source, and write that
628 ///    value to the destination. If the byte in the second source is positive,
629 ///    copy the corresponding byte from the first source to the destination. If
630 ///    the byte in the second source is zero, clear the corresponding byte in
631 ///    the destination.
632 ///
633 /// \headerfile <x86intrin.h>
634 ///
635 /// This intrinsic corresponds to the \c VPSIGNB instruction.
636 ///
637 /// \param __a
638 ///    A 128-bit integer vector containing the values to be copied.
639 /// \param __b
640 ///    A 128-bit integer vector containing control bytes corresponding to
641 ///    positions in the destination.
642 /// \returns A 128-bit integer vector containing the resultant values.
643 static __inline__ __m128i __DEFAULT_FN_ATTRS
644 _mm_sign_epi8(__m128i __a, __m128i __b)
645 {
646     return (__m128i)__builtin_ia32_psignb128((__v16qi)__a, (__v16qi)__b);
647 }
648
649 /// \brief For each 16-bit integer in the first source operand, perform one of
650 ///    the following actions as specified by the second source operand.
651 ///
652 ///    If the word in the second source is negative, calculate the two's
653 ///    complement of the corresponding word in the first source, and write that
654 ///    value to the destination. If the word in the second source is positive,
655 ///    copy the corresponding word from the first source to the destination. If
656 ///    the word in the second source is zero, clear the corresponding word in
657 ///    the destination.
658 ///
659 /// \headerfile <x86intrin.h>
660 ///
661 /// This intrinsic corresponds to the \c VPSIGNW instruction.
662 ///
663 /// \param __a
664 ///    A 128-bit integer vector containing the values to be copied.
665 /// \param __b
666 ///    A 128-bit integer vector containing control words corresponding to
667 ///    positions in the destination.
668 /// \returns A 128-bit integer vector containing the resultant values.
669 static __inline__ __m128i __DEFAULT_FN_ATTRS
670 _mm_sign_epi16(__m128i __a, __m128i __b)
671 {
672     return (__m128i)__builtin_ia32_psignw128((__v8hi)__a, (__v8hi)__b);
673 }
674
675 /// \brief For each 32-bit integer in the first source operand, perform one of
676 ///    the following actions as specified by the second source operand.
677 ///
678 ///    If the doubleword in the second source is negative, calculate the two's
679 ///    complement of the corresponding word in the first source, and write that
680 ///    value to the destination. If the doubleword in the second source is
681 ///    positive, copy the corresponding word from the first source to the
682 ///    destination. If the doubleword in the second source is zero, clear the
683 ///    corresponding word in the destination.
684 ///
685 /// \headerfile <x86intrin.h>
686 ///
687 /// This intrinsic corresponds to the \c VPSIGND instruction.
688 ///
689 /// \param __a
690 ///    A 128-bit integer vector containing the values to be copied.
691 /// \param __b
692 ///    A 128-bit integer vector containing control doublewords corresponding to
693 ///    positions in the destination.
694 /// \returns A 128-bit integer vector containing the resultant values.
695 static __inline__ __m128i __DEFAULT_FN_ATTRS
696 _mm_sign_epi32(__m128i __a, __m128i __b)
697 {
698     return (__m128i)__builtin_ia32_psignd128((__v4si)__a, (__v4si)__b);
699 }
700
701 /// \brief For each 8-bit integer in the first source operand, perform one of
702 ///    the following actions as specified by the second source operand.
703 ///
704 ///    If the byte in the second source is negative, calculate the two's
705 ///    complement of the corresponding byte in the first source, and write that
706 ///    value to the destination. If the byte in the second source is positive,
707 ///    copy the corresponding byte from the first source to the destination. If
708 ///    the byte in the second source is zero, clear the corresponding byte in
709 ///    the destination.
710 ///
711 /// \headerfile <x86intrin.h>
712 ///
713 /// This intrinsic corresponds to the \c PSIGNB instruction.
714 ///
715 /// \param __a
716 ///    A 64-bit integer vector containing the values to be copied.
717 /// \param __b
718 ///    A 64-bit integer vector containing control bytes corresponding to
719 ///    positions in the destination.
720 /// \returns A 64-bit integer vector containing the resultant values.
721 static __inline__ __m64 __DEFAULT_FN_ATTRS
722 _mm_sign_pi8(__m64 __a, __m64 __b)
723 {
724     return (__m64)__builtin_ia32_psignb((__v8qi)__a, (__v8qi)__b);
725 }
726
727 /// \brief For each 16-bit integer in the first source operand, perform one of
728 ///    the following actions as specified by the second source operand.
729 ///
730 ///    If the word in the second source is negative, calculate the two's
731 ///    complement of the corresponding word in the first source, and write that
732 ///    value to the destination. If the word in the second source is positive,
733 ///    copy the corresponding word from the first source to the destination. If
734 ///    the word in the second source is zero, clear the corresponding word in
735 ///    the destination.
736 ///
737 /// \headerfile <x86intrin.h>
738 ///
739 /// This intrinsic corresponds to the \c PSIGNW instruction.
740 ///
741 /// \param __a
742 ///    A 64-bit integer vector containing the values to be copied.
743 /// \param __b
744 ///    A 64-bit integer vector containing control words corresponding to
745 ///    positions in the destination.
746 /// \returns A 64-bit integer vector containing the resultant values.
747 static __inline__ __m64 __DEFAULT_FN_ATTRS
748 _mm_sign_pi16(__m64 __a, __m64 __b)
749 {
750     return (__m64)__builtin_ia32_psignw((__v4hi)__a, (__v4hi)__b);
751 }
752
753 /// \brief For each 32-bit integer in the first source operand, perform one of
754 ///    the following actions as specified by the second source operand.
755 ///
756 ///    If the doubleword in the second source is negative, calculate the two's
757 ///    complement of the corresponding doubleword in the first source, and
758 ///    write that value to the destination. If the doubleword in the second
759 ///    source is positive, copy the corresponding doubleword from the first
760 ///    source to the destination. If the doubleword in the second source is
761 ///    zero, clear the corresponding doubleword in the destination.
762 ///
763 /// \headerfile <x86intrin.h>
764 ///
765 /// This intrinsic corresponds to the \c PSIGND instruction.
766 ///
767 /// \param __a
768 ///    A 64-bit integer vector containing the values to be copied.
769 /// \param __b
770 ///    A 64-bit integer vector containing two control doublewords corresponding
771 ///    to positions in the destination.
772 /// \returns A 64-bit integer vector containing the resultant values.
773 static __inline__ __m64 __DEFAULT_FN_ATTRS
774 _mm_sign_pi32(__m64 __a, __m64 __b)
775 {
776     return (__m64)__builtin_ia32_psignd((__v2si)__a, (__v2si)__b);
777 }
778
779 #undef __DEFAULT_FN_ATTRS
780
781 #endif /* __TMMINTRIN_H */