]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - contrib/llvm/tools/clang/lib/Headers/smmintrin.h
Merge lldb trunk r300422 and resolve conflicts.
[FreeBSD/FreeBSD.git] / contrib / llvm / tools / clang / lib / Headers / smmintrin.h
1 /*===---- smmintrin.h - SSE4 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 _SMMINTRIN_H
25 #define _SMMINTRIN_H
26
27 #include <tmmintrin.h>
28
29 /* Define the default attributes for the functions in this file. */
30 #define __DEFAULT_FN_ATTRS __attribute__((__always_inline__, __nodebug__, __target__("sse4.1")))
31
32 /* SSE4 Rounding macros. */
33 #define _MM_FROUND_TO_NEAREST_INT    0x00
34 #define _MM_FROUND_TO_NEG_INF        0x01
35 #define _MM_FROUND_TO_POS_INF        0x02
36 #define _MM_FROUND_TO_ZERO           0x03
37 #define _MM_FROUND_CUR_DIRECTION     0x04
38
39 #define _MM_FROUND_RAISE_EXC         0x00
40 #define _MM_FROUND_NO_EXC            0x08
41
42 #define _MM_FROUND_NINT      (_MM_FROUND_RAISE_EXC | _MM_FROUND_TO_NEAREST_INT)
43 #define _MM_FROUND_FLOOR     (_MM_FROUND_RAISE_EXC | _MM_FROUND_TO_NEG_INF)
44 #define _MM_FROUND_CEIL      (_MM_FROUND_RAISE_EXC | _MM_FROUND_TO_POS_INF)
45 #define _MM_FROUND_TRUNC     (_MM_FROUND_RAISE_EXC | _MM_FROUND_TO_ZERO)
46 #define _MM_FROUND_RINT      (_MM_FROUND_RAISE_EXC | _MM_FROUND_CUR_DIRECTION)
47 #define _MM_FROUND_NEARBYINT (_MM_FROUND_NO_EXC | _MM_FROUND_CUR_DIRECTION)
48
49 /// \brief Rounds up each element of the 128-bit vector of [4 x float] to an
50 ///    integer and returns the rounded values in a 128-bit vector of
51 ///    [4 x float].
52 ///
53 /// \headerfile <x86intrin.h>
54 ///
55 /// \code
56 /// __m128 _mm_ceil_ps(__m128 X);
57 /// \endcode
58 ///
59 /// This intrinsic corresponds to the <c> <i> VROUNDPS / ROUNDPS </i> </c>
60 /// instruction.
61 ///
62 /// \param X
63 ///    A 128-bit vector of [4 x float] values to be rounded up.
64 /// \returns A 128-bit vector of [4 x float] containing the rounded values.
65 #define _mm_ceil_ps(X)       _mm_round_ps((X), _MM_FROUND_CEIL)
66
67 /// \brief Rounds up each element of the 128-bit vector of [2 x double] to an
68 ///    integer and returns the rounded values in a 128-bit vector of
69 ///    [2 x double].
70 ///
71 /// \headerfile <x86intrin.h>
72 ///
73 /// \code
74 /// __m128d _mm_ceil_pd(__m128d X);
75 /// \endcode
76 ///
77 /// This intrinsic corresponds to the <c> <i> VROUNDPD / ROUNDPD </i> </c>
78 /// instruction.
79 ///
80 /// \param X
81 ///    A 128-bit vector of [2 x double] values to be rounded up.
82 /// \returns A 128-bit vector of [2 x double] containing the rounded values.
83 #define _mm_ceil_pd(X)       _mm_round_pd((X), _MM_FROUND_CEIL)
84
85 /// \brief Copies three upper elements of the first 128-bit vector operand to
86 ///    the corresponding three upper elements of the 128-bit result vector of
87 ///    [4 x float]. Rounds up the lowest element of the second 128-bit vector
88 ///    operand to an integer and copies it to the lowest element of the 128-bit
89 ///    result vector of [4 x float].
90 ///
91 /// \headerfile <x86intrin.h>
92 ///
93 /// \code
94 /// __m128 _mm_ceil_ss(__m128 X, __m128 Y);
95 /// \endcode
96 ///
97 /// This intrinsic corresponds to the <c> <i> VROUNDSS / ROUNDSS </i> </c>
98 /// instruction.
99 ///
100 /// \param X
101 ///    A 128-bit vector of [4 x float]. The values stored in bits [127:32] are
102 ///    copied to the corresponding bits of the result.
103 /// \param Y
104 ///    A 128-bit vector of [4 x float]. The value stored in bits [31:0] is
105 ///    rounded up to the nearest integer and copied to the corresponding bits
106 ///    of the result.
107 /// \returns A 128-bit vector of [4 x float] containing the copied and rounded
108 ///    values.
109 #define _mm_ceil_ss(X, Y)    _mm_round_ss((X), (Y), _MM_FROUND_CEIL)
110
111 /// \brief Copies the upper element of the first 128-bit vector operand to the
112 ///    corresponding upper element of the 128-bit result vector of [2 x double].
113 ///    Rounds up the lower element of the second 128-bit vector operand to an
114 ///    integer and copies it to the lower element of the 128-bit result vector
115 ///    of [2 x double].
116 ///
117 /// \headerfile <x86intrin.h>
118 ///
119 /// \code
120 /// __m128d _mm_ceil_sd(__m128d X, __m128d Y);
121 /// \endcode
122 ///
123 /// This intrinsic corresponds to the <c> <i> VROUNDSD / ROUNDSD </i> </c>
124 /// instruction.
125 ///
126 /// \param X
127 ///    A 128-bit vector of [2 x double]. The value stored in bits [127:64] is
128 ///    copied to the corresponding bits of the result.
129 /// \param Y
130 ///    A 128-bit vector of [2 x double]. The value stored in bits [63:0] is
131 ///    rounded up to the nearest integer and copied to the corresponding bits
132 ///    of the result.
133 /// \returns A 128-bit vector of [2 x double] containing the copied and rounded
134 ///    values.
135 #define _mm_ceil_sd(X, Y)    _mm_round_sd((X), (Y), _MM_FROUND_CEIL)
136
137 /// \brief Rounds down each element of the 128-bit vector of [4 x float] to an
138 ///    an integer and returns the rounded values in a 128-bit vector of
139 ///    [4 x float].
140 ///
141 /// \headerfile <x86intrin.h>
142 ///
143 /// \code
144 /// __m128 _mm_floor_ps(__m128 X);
145 /// \endcode
146 ///
147 /// This intrinsic corresponds to the <c> <i> VROUNDPS / ROUNDPS </i> </c>
148 /// instruction.
149 ///
150 /// \param X
151 ///    A 128-bit vector of [4 x float] values to be rounded down.
152 /// \returns A 128-bit vector of [4 x float] containing the rounded values.
153 #define _mm_floor_ps(X)      _mm_round_ps((X), _MM_FROUND_FLOOR)
154
155 /// \brief Rounds down each element of the 128-bit vector of [2 x double] to an
156 ///    integer and returns the rounded values in a 128-bit vector of
157 ///    [2 x double].
158 ///
159 /// \headerfile <x86intrin.h>
160 ///
161 /// \code
162 /// __m128d _mm_floor_pd(__m128d X);
163 /// \endcode
164 ///
165 /// This intrinsic corresponds to the <c> <i> VROUNDPD / ROUNDPD </i> </c>
166 /// instruction.
167 ///
168 /// \param X
169 ///    A 128-bit vector of [2 x double].
170 /// \returns A 128-bit vector of [2 x double] containing the rounded values.
171 #define _mm_floor_pd(X)      _mm_round_pd((X), _MM_FROUND_FLOOR)
172
173 /// \brief Copies three upper elements of the first 128-bit vector operand to
174 ///    the corresponding three upper elements of the 128-bit result vector of
175 ///    [4 x float]. Rounds down the lowest element of the second 128-bit vector
176 ///    operand to an integer and copies it to the lowest element of the 128-bit
177 ///    result vector of [4 x float].
178 ///
179 /// \headerfile <x86intrin.h>
180 ///
181 /// \code
182 /// __m128 _mm_floor_ss(__m128 X, __m128 Y);
183 /// \endcode
184 ///
185 /// This intrinsic corresponds to the <c> <i> VROUNDSS / ROUNDSS </i> </c>
186 /// instruction.
187 ///
188 /// \param X
189 ///    A 128-bit vector of [4 x float]. The values stored in bits [127:32] are
190 ///    copied to the corresponding bits of the result.
191 /// \param Y
192 ///    A 128-bit vector of [4 x float]. The value stored in bits [31:0] is
193 ///    rounded down to the nearest integer and copied to the corresponding bits
194 ///    of the result.
195 /// \returns A 128-bit vector of [4 x float] containing the copied and rounded
196 ///    values.
197 #define _mm_floor_ss(X, Y)   _mm_round_ss((X), (Y), _MM_FROUND_FLOOR)
198
199 /// \brief Copies the upper element of the first 128-bit vector operand to the
200 ///    corresponding upper element of the 128-bit result vector of [2 x double].
201 ///    Rounds down the lower element of the second 128-bit vector operand to an
202 ///    integer and copies it to the lower element of the 128-bit result vector
203 ///    of [2 x double].
204 ///
205 /// \headerfile <x86intrin.h>
206 ///
207 /// \code
208 /// __m128d _mm_floor_sd(__m128d X, __m128d Y);
209 /// \endcode
210 ///
211 /// This intrinsic corresponds to the <c> <i> VROUNDSD / ROUNDSD </i> </c>
212 /// instruction.
213 ///
214 /// \param X
215 ///    A 128-bit vector of [2 x double]. The value stored in bits [127:64] is
216 ///    copied to the corresponding bits of the result.
217 /// \param Y
218 ///    A 128-bit vector of [2 x double]. The value stored in bits [63:0] is
219 ///    rounded down to the nearest integer and copied to the corresponding bits
220 ///    of the result.
221 /// \returns A 128-bit vector of [2 x double] containing the copied and rounded
222 ///    values.
223 #define _mm_floor_sd(X, Y)   _mm_round_sd((X), (Y), _MM_FROUND_FLOOR)
224
225 /// \brief Rounds each element of the 128-bit vector of [4 x float] to an
226 ///    integer value according to the rounding control specified by the second
227 ///    argument and returns the rounded values in a 128-bit vector of
228 ///    [4 x float].
229 ///
230 /// \headerfile <x86intrin.h>
231 ///
232 /// \code
233 /// __m128 _mm_round_ps(__m128 X, const int M);
234 /// \endcode
235 ///
236 /// This intrinsic corresponds to the <c> <i> VROUNDPS / ROUNDPS </i> </c>
237 /// instruction.
238 ///
239 /// \param X
240 ///    A 128-bit vector of [4 x float].
241 /// \param M
242 ///    An integer value that specifies the rounding operation. \n
243 ///    Bits [7:4] are reserved. \n
244 ///    Bit [3] is a precision exception value: \n
245 ///      0: A normal PE exception is used \n
246 ///      1: The PE field is not updated \n
247 ///    Bit [2] is the rounding control source: \n
248 ///      0: Use bits [1:0] of \a M \n
249 ///      1: Use the current MXCSR setting \n
250 ///    Bits [1:0] contain the rounding control definition: \n
251 ///      00: Nearest \n
252 ///      01: Downward (toward negative infinity) \n
253 ///      10: Upward (toward positive infinity) \n
254 ///      11: Truncated
255 /// \returns A 128-bit vector of [4 x float] containing the rounded values.
256 #define _mm_round_ps(X, M) __extension__ ({ \
257   (__m128)__builtin_ia32_roundps((__v4sf)(__m128)(X), (M)); })
258
259 /// \brief Copies three upper elements of the first 128-bit vector operand to
260 ///    the corresponding three upper elements of the 128-bit result vector of
261 ///    [4 x float]. Rounds the lowest element of the second 128-bit vector
262 ///    operand to an integer value according to the rounding control specified
263 ///    by the third argument and copies it to the lowest element of the 128-bit
264 ///    result vector of [4 x float].
265 ///
266 /// \headerfile <x86intrin.h>
267 ///
268 /// \code
269 /// __m128 _mm_round_ss(__m128 X, __m128 Y, const int M);
270 /// \endcode
271 ///
272 /// This intrinsic corresponds to the <c> <i> VROUNDSS / ROUNDSS </i> </c>
273 /// instruction.
274 ///
275 /// \param X
276 ///    A 128-bit vector of [4 x float]. The values stored in bits [127:32] are
277 ///    copied to the corresponding bits of the result.
278 /// \param Y
279 ///    A 128-bit vector of [4 x float]. The value stored in bits [31:0] is
280 ///    rounded to the nearest integer using the specified rounding control and
281 ///    copied to the corresponding bits of the result.
282 /// \param M
283 ///    An integer value that specifies the rounding operation. \n
284 ///    Bits [7:4] are reserved. \n
285 ///    Bit [3] is a precision exception value: \n
286 ///      0: A normal PE exception is used \n
287 ///      1: The PE field is not updated \n
288 ///    Bit [2] is the rounding control source: \n
289 ///      0: Use bits [1:0] of \a M \n
290 ///      1: Use the current MXCSR setting \n
291 ///    Bits [1:0] contain the rounding control definition: \n
292 ///      00: Nearest \n
293 ///      01: Downward (toward negative infinity) \n
294 ///      10: Upward (toward positive infinity) \n
295 ///      11: Truncated
296 /// \returns A 128-bit vector of [4 x float] containing the copied and rounded
297 ///    values.
298 #define _mm_round_ss(X, Y, M) __extension__ ({ \
299   (__m128)__builtin_ia32_roundss((__v4sf)(__m128)(X), \
300                                  (__v4sf)(__m128)(Y), (M)); })
301
302 /// \brief Rounds each element of the 128-bit vector of [2 x double] to an
303 ///    integer value according to the rounding control specified by the second
304 ///    argument and returns the rounded values in a 128-bit vector of
305 ///    [2 x double].
306 ///
307 /// \headerfile <x86intrin.h>
308 ///
309 /// \code
310 /// __m128d _mm_round_pd(__m128d X, const int M);
311 /// \endcode
312 ///
313 /// This intrinsic corresponds to the <c> <i> VROUNDPD / ROUNDPD </i> </c>
314 /// instruction.
315 ///
316 /// \param X
317 ///    A 128-bit vector of [2 x double].
318 /// \param M
319 ///    An integer value that specifies the rounding operation. \n
320 ///    Bits [7:4] are reserved. \n
321 ///    Bit [3] is a precision exception value: \n
322 ///      0: A normal PE exception is used \n
323 ///      1: The PE field is not updated \n
324 ///    Bit [2] is the rounding control source: \n
325 ///      0: Use bits [1:0] of \a M \n
326 ///      1: Use the current MXCSR setting \n
327 ///    Bits [1:0] contain the rounding control definition: \n
328 ///      00: Nearest \n
329 ///      01: Downward (toward negative infinity) \n
330 ///      10: Upward (toward positive infinity) \n
331 ///      11: Truncated
332 /// \returns A 128-bit vector of [2 x double] containing the rounded values.
333 #define _mm_round_pd(X, M) __extension__ ({ \
334   (__m128d)__builtin_ia32_roundpd((__v2df)(__m128d)(X), (M)); })
335
336
337 /// \brief Copies the upper element of the first 128-bit vector operand to the
338 ///    corresponding upper element of the 128-bit result vector of [2 x double].
339 ///    Rounds the lower element of the second 128-bit vector operand to an
340 ///    integer value according to the rounding control specified by the third
341 ///    argument and copies it to the lower element of the 128-bit result vector
342 ///    of [2 x double].
343 ///
344 /// \headerfile <x86intrin.h>
345 ///
346 /// \code
347 /// __m128d _mm_round_sd(__m128d X, __m128d Y, const int M);
348 /// \endcode
349 ///
350 /// This intrinsic corresponds to the <c> <i> VROUNDSD / ROUNDSD </i> </c>
351 /// instruction.
352 ///
353 /// \param X
354 ///    A 128-bit vector of [2 x double]. The value stored in bits [127:64] is
355 ///    copied to the corresponding bits of the result.
356 /// \param Y
357 ///    A 128-bit vector of [2 x double]. The value stored in bits [63:0] is
358 ///    rounded to the nearest integer using the specified rounding control and
359 ///    copied to the corresponding bits of the result.
360 /// \param M
361 ///    An integer value that specifies the rounding operation. \n
362 ///    Bits [7:4] are reserved. \n
363 ///    Bit [3] is a precision exception value: \n
364 ///      0: A normal PE exception is used \n
365 ///      1: The PE field is not updated \n
366 ///    Bit [2] is the rounding control source: \n
367 ///      0: Use bits [1:0] of \a M \n
368 ///      1: Use the current MXCSR setting \n
369 ///    Bits [1:0] contain the rounding control definition: \n
370 ///      00: Nearest \n
371 ///      01: Downward (toward negative infinity) \n
372 ///      10: Upward (toward positive infinity) \n
373 ///      11: Truncated
374 /// \returns A 128-bit vector of [2 x double] containing the copied and rounded
375 ///    values.
376 #define _mm_round_sd(X, Y, M) __extension__ ({ \
377   (__m128d)__builtin_ia32_roundsd((__v2df)(__m128d)(X), \
378                                   (__v2df)(__m128d)(Y), (M)); })
379
380 /* SSE4 Packed Blending Intrinsics.  */
381 /// \brief Returns a 128-bit vector of [2 x double] where the values are
382 ///    selected from either the first or second operand as specified by the
383 ///    third operand, the control mask.
384 ///
385 /// \headerfile <x86intrin.h>
386 ///
387 /// \code
388 /// __m128d _mm_blend_pd(__m128d V1, __m128d V2, const int M);
389 /// \endcode
390 ///
391 /// This intrinsic corresponds to the <c> <i> VBLENDPD / BLENDPD </i> </c>
392 /// instruction.
393 ///
394 /// \param V1
395 ///    A 128-bit vector of [2 x double].
396 /// \param V2
397 ///    A 128-bit vector of [2 x double].
398 /// \param M
399 ///    An immediate integer operand, with mask bits [1:0] specifying how the
400 ///    values are to be copied. The position of the mask bit corresponds to the
401 ///    index of a copied value. When a mask bit is 0, the corresponding 64-bit
402 ///    element in operand \a V1 is copied to the same position in the result.
403 ///    When a mask bit is 1, the corresponding 64-bit element in operand \a V2
404 ///    is copied to the same position in the result.
405 /// \returns A 128-bit vector of [2 x double] containing the copied values.
406 #define _mm_blend_pd(V1, V2, M) __extension__ ({ \
407   (__m128d)__builtin_shufflevector((__v2df)(__m128d)(V1), \
408                                    (__v2df)(__m128d)(V2), \
409                                    (((M) & 0x01) ? 2 : 0), \
410                                    (((M) & 0x02) ? 3 : 1)); })
411
412 /// \brief Returns a 128-bit vector of [4 x float] where the values are selected
413 ///    from either the first or second operand as specified by the third
414 ///    operand, the control mask.
415 ///
416 /// \headerfile <x86intrin.h>
417 ///
418 /// \code
419 /// __m128 _mm_blend_ps(__m128 V1, __m128 V2, const int M);
420 /// \endcode
421 ///
422 /// This intrinsic corresponds to the <c> <i> VBLENDPS / BLENDPS </i> </c>
423 /// instruction.
424 ///
425 /// \param V1
426 ///    A 128-bit vector of [4 x float].
427 /// \param V2
428 ///    A 128-bit vector of [4 x float].
429 /// \param M
430 ///    An immediate integer operand, with mask bits [3:0] specifying how the
431 ///    values are to be copied. The position of the mask bit corresponds to the
432 ///    index of a copied value. When a mask bit is 0, the corresponding 32-bit
433 ///    element in operand \a V1 is copied to the same position in the result.
434 ///    When a mask bit is 1, the corresponding 32-bit element in operand \a V2
435 ///    is copied to the same position in the result.
436 /// \returns A 128-bit vector of [4 x float] containing the copied values.
437 #define _mm_blend_ps(V1, V2, M) __extension__ ({ \
438   (__m128)__builtin_shufflevector((__v4sf)(__m128)(V1), (__v4sf)(__m128)(V2), \
439                                   (((M) & 0x01) ? 4 : 0), \
440                                   (((M) & 0x02) ? 5 : 1), \
441                                   (((M) & 0x04) ? 6 : 2), \
442                                   (((M) & 0x08) ? 7 : 3)); })
443
444 /// \brief Returns a 128-bit vector of [2 x double] where the values are
445 ///    selected from either the first or second operand as specified by the
446 ///    third operand, the control mask.
447 ///
448 /// \headerfile <x86intrin.h>
449 ///
450 /// This intrinsic corresponds to the <c> <i> VBLENDVPD / BLENDVPD </i> </c>
451 /// instruction.
452 ///
453 /// \param __V1
454 ///    A 128-bit vector of [2 x double].
455 /// \param __V2
456 ///    A 128-bit vector of [2 x double].
457 /// \param __M
458 ///    A 128-bit vector operand, with mask bits 127 and 63 specifying how the
459 ///    values are to be copied. The position of the mask bit corresponds to the
460 ///    most significant bit of a copied value. When a mask bit is 0, the
461 ///    corresponding 64-bit element in operand \a __V1 is copied to the same
462 ///    position in the result. When a mask bit is 1, the corresponding 64-bit
463 ///    element in operand \a __V2 is copied to the same position in the result.
464 /// \returns A 128-bit vector of [2 x double] containing the copied values.
465 static __inline__ __m128d __DEFAULT_FN_ATTRS
466 _mm_blendv_pd (__m128d __V1, __m128d __V2, __m128d __M)
467 {
468   return (__m128d) __builtin_ia32_blendvpd ((__v2df)__V1, (__v2df)__V2,
469                                             (__v2df)__M);
470 }
471
472 /// \brief Returns a 128-bit vector of [4 x float] where the values are
473 ///    selected from either the first or second operand as specified by the
474 ///    third operand, the control mask.
475 ///
476 /// \headerfile <x86intrin.h>
477 ///
478 /// This intrinsic corresponds to the <c> <i> VBLENDVPS / BLENDVPS </i> </c>
479 /// instruction.
480 ///
481 /// \param __V1
482 ///    A 128-bit vector of [4 x float].
483 /// \param __V2
484 ///    A 128-bit vector of [4 x float].
485 /// \param __M
486 ///    A 128-bit vector operand, with mask bits 127, 95, 63, and 31 specifying
487 ///    how the values are to be copied. The position of the mask bit corresponds
488 ///    to the most significant bit of a copied value. When a mask bit is 0, the
489 ///    corresponding 32-bit element in operand \a __V1 is copied to the same
490 ///    position in the result. When a mask bit is 1, the corresponding 32-bit
491 ///    element in operand \a __V2 is copied to the same position in the result.
492 /// \returns A 128-bit vector of [4 x float] containing the copied values.
493 static __inline__ __m128 __DEFAULT_FN_ATTRS
494 _mm_blendv_ps (__m128 __V1, __m128 __V2, __m128 __M)
495 {
496   return (__m128) __builtin_ia32_blendvps ((__v4sf)__V1, (__v4sf)__V2,
497                                            (__v4sf)__M);
498 }
499
500 /// \brief Returns a 128-bit vector of [16 x i8] where the values are selected
501 ///    from either of the first or second operand as specified by the third
502 ///    operand, the control mask.
503 ///
504 /// \headerfile <x86intrin.h>
505 ///
506 /// This intrinsic corresponds to the <c> <i> VPBLENDVB / PBLENDVB </i> </c>
507 /// instruction.
508 ///
509 /// \param __V1
510 ///    A 128-bit vector of [16 x i8].
511 /// \param __V2
512 ///    A 128-bit vector of [16 x i8].
513 /// \param __M
514 ///    A 128-bit vector operand, with mask bits 127, 119, 111 ... 7 specifying
515 ///    how the values are to be copied. The position of the mask bit corresponds
516 ///    to the most significant bit of a copied value. When a mask bit is 0, the
517 ///    corresponding 8-bit element in operand \a __V1 is copied to the same
518 ///    position in the result. When a mask bit is 1, the corresponding 8-bit
519 ///    element in operand \a __V2 is copied to the same position in the result.
520 /// \returns A 128-bit vector of [16 x i8] containing the copied values.
521 static __inline__ __m128i __DEFAULT_FN_ATTRS
522 _mm_blendv_epi8 (__m128i __V1, __m128i __V2, __m128i __M)
523 {
524   return (__m128i) __builtin_ia32_pblendvb128 ((__v16qi)__V1, (__v16qi)__V2,
525                                                (__v16qi)__M);
526 }
527
528 /// \brief Returns a 128-bit vector of [8 x i16] where the values are selected
529 ///    from either of the first or second operand as specified by the third
530 ///    operand, the control mask.
531 ///
532 /// \headerfile <x86intrin.h>
533 ///
534 /// \code
535 /// __m128i _mm_blend_epi16(__m128i V1, __m128i V2, const int M);
536 /// \endcode
537 ///
538 /// This intrinsic corresponds to the <c> <i> VPBLENDW / PBLENDW </i> </c>
539 /// instruction.
540 ///
541 /// \param V1
542 ///    A 128-bit vector of [8 x i16].
543 /// \param V2
544 ///    A 128-bit vector of [8 x i16].
545 /// \param M
546 ///    An immediate integer operand, with mask bits [7:0] specifying how the
547 ///    values are to be copied. The position of the mask bit corresponds to the
548 ///    index of a copied value. When a mask bit is 0, the corresponding 16-bit
549 ///    element in operand \a V1 is copied to the same position in the result.
550 ///    When a mask bit is 1, the corresponding 16-bit element in operand \a V2
551 ///    is copied to the same position in the result.
552 /// \returns A 128-bit vector of [8 x i16] containing the copied values.
553 #define _mm_blend_epi16(V1, V2, M) __extension__ ({ \
554   (__m128i)__builtin_shufflevector((__v8hi)(__m128i)(V1), \
555                                    (__v8hi)(__m128i)(V2), \
556                                    (((M) & 0x01) ?  8 : 0), \
557                                    (((M) & 0x02) ?  9 : 1), \
558                                    (((M) & 0x04) ? 10 : 2), \
559                                    (((M) & 0x08) ? 11 : 3), \
560                                    (((M) & 0x10) ? 12 : 4), \
561                                    (((M) & 0x20) ? 13 : 5), \
562                                    (((M) & 0x40) ? 14 : 6), \
563                                    (((M) & 0x80) ? 15 : 7)); })
564
565 /* SSE4 Dword Multiply Instructions.  */
566 /// \brief Multiples corresponding elements of two 128-bit vectors of [4 x i32]
567 ///    and returns the lower 32 bits of the each product in a 128-bit vector of
568 ///    [4 x i32].
569 ///
570 /// \headerfile <x86intrin.h>
571 ///
572 /// This intrinsic corresponds to the <c> <i> VPMULLD / PMULLD </i> </c>
573 /// instruction.
574 ///
575 /// \param __V1
576 ///    A 128-bit integer vector.
577 /// \param __V2
578 ///    A 128-bit integer vector.
579 /// \returns A 128-bit integer vector containing the products of both operands.
580 static __inline__  __m128i __DEFAULT_FN_ATTRS
581 _mm_mullo_epi32 (__m128i __V1, __m128i __V2)
582 {
583   return (__m128i) ((__v4su)__V1 * (__v4su)__V2);
584 }
585
586 /// \brief Multiplies corresponding even-indexed elements of two 128-bit
587 ///    vectors of [4 x i32] and returns a 128-bit vector of [2 x i64]
588 ///    containing the products.
589 ///
590 /// \headerfile <x86intrin.h>
591 ///
592 /// This intrinsic corresponds to the <c> <i> VPMULDQ / PMULDQ </i> </c>
593 /// instruction.
594 ///
595 /// \param __V1
596 ///    A 128-bit vector of [4 x i32].
597 /// \param __V2
598 ///    A 128-bit vector of [4 x i32].
599 /// \returns A 128-bit vector of [2 x i64] containing the products of both
600 ///    operands.
601 static __inline__  __m128i __DEFAULT_FN_ATTRS
602 _mm_mul_epi32 (__m128i __V1, __m128i __V2)
603 {
604   return (__m128i) __builtin_ia32_pmuldq128 ((__v4si)__V1, (__v4si)__V2);
605 }
606
607 /* SSE4 Floating Point Dot Product Instructions.  */
608 /// \brief Computes the dot product of the two 128-bit vectors of [4 x float]
609 ///    and returns it in the elements of the 128-bit result vector of
610 ///    [4 x float]. The immediate integer operand controls which input elements
611 ///    will contribute to the dot product, and where the final results are
612 ///    returned.
613 ///
614 /// \headerfile <x86intrin.h>
615 ///
616 /// \code
617 /// __m128 _mm_dp_ps(__m128 X, __m128 Y, const int M);
618 /// \endcode
619 ///
620 /// This intrinsic corresponds to the <c> <i> VDPPS / DPPS </i> </c>
621 /// instruction.
622 ///
623 /// \param X
624 ///    A 128-bit vector of [4 x float].
625 /// \param Y
626 ///    A 128-bit vector of [4 x float].
627 /// \param M
628 ///    An immediate integer operand. Mask bits [7:4] determine which elements
629 ///    of the input vectors are used, with bit [4] corresponding to the lowest
630 ///    element and bit [7] corresponding to the highest element of each [4 x
631 ///    float] vector. If a bit is set, the corresponding elements from the two
632 ///    input vectors are used as an input for dot product; otherwise that input
633 ///    is treated as zero. Bits [3:0] determine which elements of the result
634 ///    will receive a copy of the final dot product, with bit [0] corresponding
635 ///    to the lowest element and bit [3] corresponding to the highest element of
636 ///    each [4 x float] subvector. If a bit is set, the dot product is returned
637 ///    in the corresponding element; otherwise that element is set to zero.
638 /// \returns A 128-bit vector of [4 x float] containing the dot product.
639 #define _mm_dp_ps(X, Y, M) __extension__ ({ \
640   (__m128) __builtin_ia32_dpps((__v4sf)(__m128)(X), \
641                                (__v4sf)(__m128)(Y), (M)); })
642
643 /// \brief Computes the dot product of the two 128-bit vectors of [2 x double]
644 ///    and returns it in the elements of the 128-bit result vector of
645 ///    [2 x double]. The immediate integer operand controls which input
646 ///    elements will contribute to the dot product, and where the final results
647 ///    are returned.
648 ///
649 /// \headerfile <x86intrin.h>
650 ///
651 /// \code
652 /// __m128d _mm_dp_pd(__m128d X, __m128d Y, const int M);
653 /// \endcode
654 ///
655 /// This intrinsic corresponds to the <c> <i> VDPPD / DPPD </i> </c>
656 /// instruction.
657 ///
658 /// \param X
659 ///    A 128-bit vector of [2 x double].
660 /// \param Y
661 ///    A 128-bit vector of [2 x double].
662 /// \param M
663 ///    An immediate integer operand. Mask bits [5:4] determine which elements
664 ///    of the input vectors are used, with bit [4] corresponding to the lowest
665 ///    element and bit [5] corresponding to the highest element of each of [2 x
666 ///    double] vector. If a bit is set, the corresponding elements from the two
667 ///    input vectors are used as an input for dot product; otherwise that input
668 ///    is treated as zero. Bits [1:0] determine which elements of the result
669 ///    will receive a copy of the final dot product, with bit [0] corresponding
670 ///    to the lowest element and bit [3] corresponding to the highest element of
671 ///    each [2 x double] vector. If a bit is set, the dot product is returned in
672 ///    the corresponding element; otherwise that element is set to zero.
673 #define _mm_dp_pd(X, Y, M) __extension__ ({\
674   (__m128d) __builtin_ia32_dppd((__v2df)(__m128d)(X), \
675                                 (__v2df)(__m128d)(Y), (M)); })
676
677 /* SSE4 Streaming Load Hint Instruction.  */
678 /// \brief Loads integer values from a 128-bit aligned memory location to a
679 ///    128-bit integer vector.
680 ///
681 /// \headerfile <x86intrin.h>
682 ///
683 /// This intrinsic corresponds to the <c> <i> VMOVNTDQA / MOVNTDQA </i> </c>
684 /// instruction.
685 ///
686 /// \param __V
687 ///    A pointer to a 128-bit aligned memory location that contains the integer
688 ///    values.
689 /// \returns A 128-bit integer vector containing the data stored at the
690 ///    specified memory location.
691 static __inline__  __m128i __DEFAULT_FN_ATTRS
692 _mm_stream_load_si128 (__m128i const *__V)
693 {
694   return (__m128i) __builtin_nontemporal_load ((const __v2di *) __V);
695 }
696
697 /* SSE4 Packed Integer Min/Max Instructions.  */
698 /// \brief Compares the corresponding elements of two 128-bit vectors of
699 ///    [16 x i8] and returns a 128-bit vector of [16 x i8] containing the lesser
700 ///    of the two values.
701 ///
702 /// \headerfile <x86intrin.h>
703 ///
704 /// This intrinsic corresponds to the <c> <i> VPMINSB / PMINSB </i> </c>
705 /// instruction.
706 ///
707 /// \param __V1
708 ///    A 128-bit vector of [16 x i8].
709 /// \param __V2
710 ///    A 128-bit vector of [16 x i8]
711 /// \returns A 128-bit vector of [16 x i8] containing the lesser values.
712 static __inline__  __m128i __DEFAULT_FN_ATTRS
713 _mm_min_epi8 (__m128i __V1, __m128i __V2)
714 {
715   return (__m128i) __builtin_ia32_pminsb128 ((__v16qi) __V1, (__v16qi) __V2);
716 }
717
718 /// \brief Compares the corresponding elements of two 128-bit vectors of
719 ///    [16 x i8] and returns a 128-bit vector of [16 x i8] containing the
720 ///    greater value of the two.
721 ///
722 /// \headerfile <x86intrin.h>
723 ///
724 /// This intrinsic corresponds to the <c> <i> VPMAXSB / PMAXSB </i> </c>
725 /// instruction.
726 ///
727 /// \param __V1
728 ///    A 128-bit vector of [16 x i8].
729 /// \param __V2
730 ///    A 128-bit vector of [16 x i8].
731 /// \returns A 128-bit vector of [16 x i8] containing the greater values.
732 static __inline__  __m128i __DEFAULT_FN_ATTRS
733 _mm_max_epi8 (__m128i __V1, __m128i __V2)
734 {
735   return (__m128i) __builtin_ia32_pmaxsb128 ((__v16qi) __V1, (__v16qi) __V2);
736 }
737
738 /// \brief Compares the corresponding elements of two 128-bit vectors of
739 ///    [8 x u16] and returns a 128-bit vector of [8 x u16] containing the lesser
740 ///    value of the two.
741 ///
742 /// \headerfile <x86intrin.h>
743 ///
744 /// This intrinsic corresponds to the <c> <i> VPMINUW / PMINUW </i> </c>
745 /// instruction.
746 ///
747 /// \param __V1
748 ///    A 128-bit vector of [8 x u16].
749 /// \param __V2
750 ///    A 128-bit vector of [8 x u16].
751 /// \returns A 128-bit vector of [8 x u16] containing the lesser values.
752 static __inline__  __m128i __DEFAULT_FN_ATTRS
753 _mm_min_epu16 (__m128i __V1, __m128i __V2)
754 {
755   return (__m128i) __builtin_ia32_pminuw128 ((__v8hi) __V1, (__v8hi) __V2);
756 }
757
758 /// \brief Compares the corresponding elements of two 128-bit vectors of
759 ///    [8 x u16] and returns a 128-bit vector of [8 x u16] containing the
760 ///    greater value of the two.
761 ///
762 /// \headerfile <x86intrin.h>
763 ///
764 /// This intrinsic corresponds to the <c> <i> VPMAXUW / PMAXUW </i> </c>
765 /// instruction.
766 ///
767 /// \param __V1
768 ///    A 128-bit vector of [8 x u16].
769 /// \param __V2
770 ///    A 128-bit vector of [8 x u16].
771 /// \returns A 128-bit vector of [8 x u16] containing the greater values.
772 static __inline__  __m128i __DEFAULT_FN_ATTRS
773 _mm_max_epu16 (__m128i __V1, __m128i __V2)
774 {
775   return (__m128i) __builtin_ia32_pmaxuw128 ((__v8hi) __V1, (__v8hi) __V2);
776 }
777
778 /// \brief Compares the corresponding elements of two 128-bit vectors of
779 ///    [4 x i32] and returns a 128-bit vector of [4 x i32] containing the lesser
780 ///    value of the two.
781 ///
782 /// \headerfile <x86intrin.h>
783 ///
784 /// This intrinsic corresponds to the <c> <i> VPMINSD / PMINSD </i> </c>
785 /// instruction.
786 ///
787 /// \param __V1
788 ///    A 128-bit vector of [4 x i32].
789 /// \param __V2
790 ///    A 128-bit vector of [4 x i32].
791 /// \returns A 128-bit vector of [4 x i32] containing the lesser values.
792 static __inline__  __m128i __DEFAULT_FN_ATTRS
793 _mm_min_epi32 (__m128i __V1, __m128i __V2)
794 {
795   return (__m128i) __builtin_ia32_pminsd128 ((__v4si) __V1, (__v4si) __V2);
796 }
797
798 /// \brief Compares the corresponding elements of two 128-bit vectors of
799 ///    [4 x i32] and returns a 128-bit vector of [4 x i32] containing the
800 ///    greater value of the two.
801 ///
802 /// \headerfile <x86intrin.h>
803 ///
804 /// This intrinsic corresponds to the <c> <i> VPMAXSD / PMAXSD </i> </c>
805 /// instruction.
806 ///
807 /// \param __V1
808 ///    A 128-bit vector of [4 x i32].
809 /// \param __V2
810 ///    A 128-bit vector of [4 x i32].
811 /// \returns A 128-bit vector of [4 x i32] containing the greater values.
812 static __inline__  __m128i __DEFAULT_FN_ATTRS
813 _mm_max_epi32 (__m128i __V1, __m128i __V2)
814 {
815   return (__m128i) __builtin_ia32_pmaxsd128 ((__v4si) __V1, (__v4si) __V2);
816 }
817
818 /// \brief Compares the corresponding elements of two 128-bit vectors of
819 ///    [4 x u32] and returns a 128-bit vector of [4 x u32] containing the lesser
820 ///    value of the two.
821 ///
822 /// \headerfile <x86intrin.h>
823 ///
824 /// This intrinsic corresponds to the <c> <i> VPMINUD / PMINUD </i> </c>
825 /// instruction.
826 ///
827 /// \param __V1
828 ///    A 128-bit vector of [4 x u32].
829 /// \param __V2
830 ///    A 128-bit vector of [4 x u32].
831 /// \returns A 128-bit vector of [4 x u32] containing the lesser values.
832 static __inline__  __m128i __DEFAULT_FN_ATTRS
833 _mm_min_epu32 (__m128i __V1, __m128i __V2)
834 {
835   return (__m128i) __builtin_ia32_pminud128((__v4si) __V1, (__v4si) __V2);
836 }
837
838 /// \brief Compares the corresponding elements of two 128-bit vectors of
839 ///    [4 x u32] and returns a 128-bit vector of [4 x u32] containing the
840 ///    greater value of the two.
841 ///
842 /// \headerfile <x86intrin.h>
843 ///
844 /// This intrinsic corresponds to the <c> <i> VPMAXUD / PMAXUD </i> </c>
845 /// instruction.
846 ///
847 /// \param __V1
848 ///    A 128-bit vector of [4 x u32].
849 /// \param __V2
850 ///    A 128-bit vector of [4 x u32].
851 /// \returns A 128-bit vector of [4 x u32] containing the greater values.
852 static __inline__  __m128i __DEFAULT_FN_ATTRS
853 _mm_max_epu32 (__m128i __V1, __m128i __V2)
854 {
855   return (__m128i) __builtin_ia32_pmaxud128((__v4si) __V1, (__v4si) __V2);
856 }
857
858 /* SSE4 Insertion and Extraction from XMM Register Instructions.  */
859 /// \brief Takes the first argument \a X and inserts an element from the second
860 ///    argument \a Y as selected by the third argument \a N. That result then
861 ///    has elements zeroed out also as selected by the third argument \a N. The
862 ///    resulting 128-bit vector of [4 x float] is then returned.
863 ///
864 /// \headerfile <x86intrin.h>
865 ///
866 /// \code
867 /// __m128 _mm_insert_ps(__m128 X, __m128 Y, const int N);
868 /// \endcode
869 ///
870 /// This intrinsic corresponds to the <c> <i> VINSERTPS </i> </c> instruction.
871 ///
872 /// \param X
873 ///    A 128-bit vector source operand of [4 x float]. With the exception of
874 ///    those bits in the result copied from parameter \a Y and zeroed by bits
875 ///    [3:0] of \a N, all bits from this parameter are copied to the result.
876 /// \param Y
877 ///    A 128-bit vector source operand of [4 x float]. One single-precision
878 ///    floating-point element from this source, as determined by the immediate
879 ///    parameter, is copied to the result.
880 /// \param N
881 ///    Specifies which bits from operand \a Y will be copied, which bits in the
882 ///    result they will be be copied to, and which bits in the result will be
883 ///    cleared. The following assignments are made: \n
884 ///    Bits [7:6] specify the bits to copy from operand \a Y: \n
885 ///      00: Selects bits [31:0] from operand \a Y. \n
886 ///      01: Selects bits [63:32] from operand \a Y. \n
887 ///      10: Selects bits [95:64] from operand \a Y. \n
888 ///      11: Selects bits [127:96] from operand \a Y. \n
889 ///    Bits [5:4] specify the bits in the result to which the selected bits
890 ///    from operand \a Y are copied: \n
891 ///      00: Copies the selected bits from \a Y to result bits [31:0]. \n
892 ///      01: Copies the selected bits from \a Y to result bits [63:32]. \n
893 ///      10: Copies the selected bits from \a Y to result bits [95:64]. \n
894 ///      11: Copies the selected bits from \a Y to result bits [127:96]. \n
895 ///    Bits[3:0]: If any of these bits are set, the corresponding result
896 ///    element is cleared.
897 /// \returns A 128-bit vector of [4 x float] containing the copied single-
898 ///    precision floating point elements from the operands.
899 #define _mm_insert_ps(X, Y, N) __builtin_ia32_insertps128((X), (Y), (N))
900
901 /// \brief Extracts a 32-bit integer from a 128-bit vector of [4 x float] and
902 ///    returns it, using the immediate value parameter \a N as a selector.
903 ///
904 /// \headerfile <x86intrin.h>
905 ///
906 /// \code
907 /// int _mm_extract_ps(__m128 X, const int N);
908 /// \endcode
909 ///
910 /// This intrinsic corresponds to the <c> <i> VEXTRACTPS / EXTRACTPS </i> </c>
911 /// instruction.
912 ///
913 /// \param X
914 ///    A 128-bit vector of [4 x float].
915 /// \param N
916 ///    An immediate value. Bits [1:0] determines which bits from the argument
917 ///    \a X are extracted and returned: \n
918 ///    00: Bits [31:0] of parameter \a X are returned. \n
919 ///    01: Bits [63:32] of parameter \a X are returned. \n
920 ///    10: Bits [95:64] of parameter \a X are returned. \n
921 ///    11: Bits [127:96] of parameter \a X are returned.
922 /// \returns A 32-bit integer containing the extracted 32 bits of float data.
923 #define _mm_extract_ps(X, N) (__extension__                      \
924                               ({ union { int __i; float __f; } __t;  \
925                                  __v4sf __a = (__v4sf)(__m128)(X);       \
926                                  __t.__f = __a[(N) & 3];                 \
927                                  __t.__i;}))
928
929 /* Miscellaneous insert and extract macros.  */
930 /* Extract a single-precision float from X at index N into D.  */
931 #define _MM_EXTRACT_FLOAT(D, X, N) (__extension__ ({ __v4sf __a = (__v4sf)(X); \
932                                                     (D) = __a[N]; }))
933
934 /* Or together 2 sets of indexes (X and Y) with the zeroing bits (Z) to create
935    an index suitable for _mm_insert_ps.  */
936 #define _MM_MK_INSERTPS_NDX(X, Y, Z) (((X) << 6) | ((Y) << 4) | (Z))
937
938 /* Extract a float from X at index N into the first index of the return.  */
939 #define _MM_PICK_OUT_PS(X, N) _mm_insert_ps (_mm_setzero_ps(), (X),   \
940                                              _MM_MK_INSERTPS_NDX((N), 0, 0x0e))
941
942 /* Insert int into packed integer array at index.  */
943 /// \brief Constructs a 128-bit vector of [16 x i8] by first making a copy of
944 ///    the 128-bit integer vector parameter, and then inserting the lower 8 bits
945 ///    of an integer parameter \a I into an offset specified by the immediate
946 ///    value parameter \a N.
947 ///
948 /// \headerfile <x86intrin.h>
949 ///
950 /// \code
951 /// __m128i _mm_insert_epi8(__m128i X, int I, const int N);
952 /// \endcode
953 ///
954 /// This intrinsic corresponds to the <c> <i> VPINSRB / PINSRB </i> </c>
955 /// instruction.
956 ///
957 /// \param X
958 ///    A 128-bit integer vector of [16 x i8]. This vector is copied to the
959 ///    result and then one of the sixteen elements in the result vector is
960 ///    replaced by the lower 8 bits of \a I.
961 /// \param I
962 ///    An integer. The lower 8 bits of this operand are written to the result
963 ///    beginning at the offset specified by \a N.
964 /// \param N
965 ///    An immediate value. Bits [3:0] specify the bit offset in the result at
966 ///    which the lower 8 bits of \a I are written. \n
967 ///    0000: Bits [7:0] of the result are used for insertion. \n
968 ///    0001: Bits [15:8] of the result are used for insertion. \n
969 ///    0010: Bits [23:16] of the result are used for insertion. \n
970 ///    0011: Bits [31:24] of the result are used for insertion. \n
971 ///    0100: Bits [39:32] of the result are used for insertion. \n
972 ///    0101: Bits [47:40] of the result are used for insertion. \n
973 ///    0110: Bits [55:48] of the result are used for insertion. \n
974 ///    0111: Bits [63:56] of the result are used for insertion. \n
975 ///    1000: Bits [71:64] of the result are used for insertion. \n
976 ///    1001: Bits [79:72] of the result are used for insertion. \n
977 ///    1010: Bits [87:80] of the result are used for insertion. \n
978 ///    1011: Bits [95:88] of the result are used for insertion. \n
979 ///    1100: Bits [103:96] of the result are used for insertion. \n
980 ///    1101: Bits [111:104] of the result are used for insertion. \n
981 ///    1110: Bits [119:112] of the result are used for insertion. \n
982 ///    1111: Bits [127:120] of the result are used for insertion.
983 /// \returns A 128-bit integer vector containing the constructed values.
984 #define _mm_insert_epi8(X, I, N) (__extension__                           \
985                                   ({ __v16qi __a = (__v16qi)(__m128i)(X); \
986                                      __a[(N) & 15] = (I);                 \
987                                      (__m128i)__a;}))
988
989 /// \brief Constructs a 128-bit vector of [4 x i32] by first making a copy of
990 ///    the 128-bit integer vector parameter, and then inserting the 32-bit
991 ///    integer parameter \a I at the offset specified by the immediate value
992 ///    parameter \a N.
993 ///
994 /// \headerfile <x86intrin.h>
995 ///
996 /// \code
997 /// __m128i _mm_insert_epi32(__m128i X, int I, const int N);
998 /// \endcode
999 ///
1000 /// This intrinsic corresponds to the <c> <i> VPINSRD / PINSRD </i> </c>
1001 /// instruction.
1002 ///
1003 /// \param X
1004 ///    A 128-bit integer vector of [4 x i32]. This vector is copied to the
1005 ///    result and then one of the four elements in the result vector is
1006 ///    replaced by \a I.
1007 /// \param I
1008 ///    A 32-bit integer that is written to the result beginning at the offset
1009 ///    specified by \a N.
1010 /// \param N
1011 ///    An immediate value. Bits [1:0] specify the bit offset in the result at
1012 ///    which the integer \a I is written.
1013 ///    00: Bits [31:0] of the result are used for insertion. \n
1014 ///    01: Bits [63:32] of the result are used for insertion. \n
1015 ///    10: Bits [95:64] of the result are used for insertion. \n
1016 ///    11: Bits [127:96] of the result are used for insertion.
1017 /// \returns A 128-bit integer vector containing the constructed values.
1018 #define _mm_insert_epi32(X, I, N) (__extension__                         \
1019                                    ({ __v4si __a = (__v4si)(__m128i)(X); \
1020                                       __a[(N) & 3] = (I);                \
1021                                       (__m128i)__a;}))
1022 #ifdef __x86_64__
1023 /// \brief Constructs a 128-bit vector of [2 x i64] by first making a copy of
1024 ///    the 128-bit integer vector parameter, and then inserting the 64-bit
1025 ///    integer parameter \a I, using the immediate value parameter \a N as an
1026 ///    insertion location selector.
1027 ///
1028 /// \headerfile <x86intrin.h>
1029 ///
1030 /// \code
1031 /// __m128i _mm_insert_epi64(__m128i X, long long I, const int N);
1032 /// \endcode
1033 ///
1034 /// This intrinsic corresponds to the <c> <i> VPINSRQ / PINSRQ </i> </c>
1035 /// instruction.
1036 ///
1037 /// \param X
1038 ///    A 128-bit integer vector of [2 x i64]. This vector is copied to the
1039 ///    result and then one of the two elements in the result vector is replaced
1040 ///    by \a I.
1041 /// \param I
1042 ///    A 64-bit integer that is written to the result beginning at the offset
1043 ///    specified by \a N.
1044 /// \param N
1045 ///    An immediate value. Bit [0] specifies the bit offset in the result at
1046 ///    which the integer \a I is written.
1047 ///    0: Bits [63:0] of the result are used for insertion. \n
1048 ///    1: Bits [127:64] of the result are used for insertion. \n
1049 /// \returns A 128-bit integer vector containing the constructed values.
1050 #define _mm_insert_epi64(X, I, N) (__extension__                         \
1051                                    ({ __v2di __a = (__v2di)(__m128i)(X); \
1052                                       __a[(N) & 1] = (I);                \
1053                                       (__m128i)__a;}))
1054 #endif /* __x86_64__ */
1055
1056 /* Extract int from packed integer array at index.  This returns the element
1057  * as a zero extended value, so it is unsigned.
1058  */
1059 /// \brief Extracts an 8-bit element from the 128-bit integer vector of
1060 ///    [16 x i8], using the immediate value parameter \a N as a selector.
1061 ///
1062 /// \headerfile <x86intrin.h>
1063 ///
1064 /// \code
1065 /// int _mm_extract_epi8(__m128i X, const int N);
1066 /// \endcode
1067 ///
1068 /// This intrinsic corresponds to the <c> <i> VPEXTRB / PEXTRB </i> </c>
1069 /// instruction.
1070 ///
1071 /// \param X
1072 ///    A 128-bit integer vector.
1073 /// \param N
1074 ///    An immediate value. Bits [3:0] specify which 8-bit vector element
1075 ///    from the argument \a X to extract and copy to the result. \n
1076 ///    0000: Bits [7:0] of parameter \a X are extracted. \n
1077 ///    0001: Bits [15:8] of the parameter \a X are extracted. \n
1078 ///    0010: Bits [23:16] of the parameter \a X are extracted. \n
1079 ///    0011: Bits [31:24] of the parameter \a X are extracted. \n
1080 ///    0100: Bits [39:32] of the parameter \a X are extracted. \n
1081 ///    0101: Bits [47:40] of the parameter \a X are extracted. \n
1082 ///    0110: Bits [55:48] of the parameter \a X are extracted. \n
1083 ///    0111: Bits [63:56] of the parameter \a X are extracted. \n
1084 ///    1000: Bits [71:64] of the parameter \a X are extracted. \n
1085 ///    1001: Bits [79:72] of the parameter \a X are extracted. \n
1086 ///    1010: Bits [87:80] of the parameter \a X are extracted. \n
1087 ///    1011: Bits [95:88] of the parameter \a X are extracted. \n
1088 ///    1100: Bits [103:96] of the parameter \a X are extracted. \n
1089 ///    1101: Bits [111:104] of the parameter \a X are extracted. \n
1090 ///    1110: Bits [119:112] of the parameter \a X are extracted. \n
1091 ///    1111: Bits [127:120] of the parameter \a X are extracted.
1092 /// \returns  An unsigned integer, whose lower 8 bits are selected from the
1093 ///    128-bit integer vector parameter and the remaining bits are assigned
1094 ///    zeros.
1095 #define _mm_extract_epi8(X, N) (__extension__                           \
1096                                 ({ __v16qi __a = (__v16qi)(__m128i)(X); \
1097                                    (int)(unsigned char) __a[(N) & 15];}))
1098
1099 /// \brief Extracts a 32-bit element from the 128-bit integer vector of
1100 ///    [4 x i32], using the immediate value parameter \a N as a selector.
1101 ///
1102 /// \headerfile <x86intrin.h>
1103 ///
1104 /// \code
1105 /// int _mm_extract_epi32(__m128i X, const int N);
1106 /// \endcode
1107 ///
1108 /// This intrinsic corresponds to the <c> <i> VPEXTRD / PEXTRD </i> </c>
1109 /// instruction.
1110 ///
1111 /// \param X
1112 ///    A 128-bit integer vector.
1113 /// \param N
1114 ///    An immediate value. Bits [1:0] specify which 32-bit vector element
1115 ///    from the argument \a X to extract and copy to the result. \n
1116 ///    00: Bits [31:0] of the parameter \a X are extracted. \n
1117 ///    01: Bits [63:32] of the parameter \a X are extracted. \n
1118 ///    10: Bits [95:64] of the parameter \a X are extracted. \n
1119 ///    11: Bits [127:96] of the parameter \a X are exracted.
1120 /// \returns  An integer, whose lower 32 bits are selected from the 128-bit
1121 ///    integer vector parameter and the remaining bits are assigned zeros.
1122 #define _mm_extract_epi32(X, N) (__extension__                         \
1123                                  ({ __v4si __a = (__v4si)(__m128i)(X); \
1124                                     (int)__a[(N) & 3];}))
1125 #ifdef __x86_64__
1126 /// \brief Extracts a 64-bit element from the 128-bit integer vector of
1127 ///    [2 x i64], using the immediate value parameter \a N as a selector.
1128 ///
1129 /// \headerfile <x86intrin.h>
1130 ///
1131 /// \code
1132 /// long long _mm_extract_epi64(__m128i X, const int N);
1133 /// \endcode
1134 ///
1135 /// This intrinsic corresponds to the <c> <i> VPEXTRQ / PEXTRQ </i> </c>
1136 /// instruction.
1137 ///
1138 /// \param X
1139 ///    A 128-bit integer vector.
1140 /// \param N
1141 ///    An immediate value. Bit [0] specifies which 64-bit vector element
1142 ///    from the argument \a X to return. \n
1143 ///    0: Bits [63:0] are returned. \n
1144 ///    1: Bits [127:64] are returned. \n
1145 /// \returns  A 64-bit integer.
1146 #define _mm_extract_epi64(X, N) (__extension__                         \
1147                                  ({ __v2di __a = (__v2di)(__m128i)(X); \
1148                                     (long long)__a[(N) & 1];}))
1149 #endif /* __x86_64 */
1150
1151 /* SSE4 128-bit Packed Integer Comparisons.  */
1152 /// \brief Tests whether the specified bits in a 128-bit integer vector are all
1153 ///    zeros.
1154 ///
1155 /// \headerfile <x86intrin.h>
1156 ///
1157 /// This intrinsic corresponds to the <c> <i> VPTEST / PTEST </i> </c>
1158 /// instruction.
1159 ///
1160 /// \param __M
1161 ///    A 128-bit integer vector containing the bits to be tested.
1162 /// \param __V
1163 ///    A 128-bit integer vector selecting which bits to test in operand \a __M.
1164 /// \returns TRUE if the specified bits are all zeros; FALSE otherwise.
1165 static __inline__ int __DEFAULT_FN_ATTRS
1166 _mm_testz_si128(__m128i __M, __m128i __V)
1167 {
1168   return __builtin_ia32_ptestz128((__v2di)__M, (__v2di)__V);
1169 }
1170
1171 /// \brief Tests whether the specified bits in a 128-bit integer vector are all
1172 ///    ones.
1173 ///
1174 /// \headerfile <x86intrin.h>
1175 ///
1176 /// This intrinsic corresponds to the <c> <i> VPTEST / PTEST </i> </c>
1177 /// instruction.
1178 ///
1179 /// \param __M
1180 ///    A 128-bit integer vector containing the bits to be tested.
1181 /// \param __V
1182 ///    A 128-bit integer vector selecting which bits to test in operand \a __M.
1183 /// \returns TRUE if the specified bits are all ones; FALSE otherwise.
1184 static __inline__ int __DEFAULT_FN_ATTRS
1185 _mm_testc_si128(__m128i __M, __m128i __V)
1186 {
1187   return __builtin_ia32_ptestc128((__v2di)__M, (__v2di)__V);
1188 }
1189
1190 /// \brief Tests whether the specified bits in a 128-bit integer vector are
1191 ///    neither all zeros nor all ones.
1192 ///
1193 /// \headerfile <x86intrin.h>
1194 ///
1195 /// This intrinsic corresponds to the <c> <i> VPTEST / PTEST </i> </c>
1196 /// instruction.
1197 ///
1198 /// \param __M
1199 ///    A 128-bit integer vector containing the bits to be tested.
1200 /// \param __V
1201 ///    A 128-bit integer vector selecting which bits to test in operand \a __M.
1202 /// \returns TRUE if the specified bits are neither all zeros nor all ones;
1203 ///    FALSE otherwise.
1204 static __inline__ int __DEFAULT_FN_ATTRS
1205 _mm_testnzc_si128(__m128i __M, __m128i __V)
1206 {
1207   return __builtin_ia32_ptestnzc128((__v2di)__M, (__v2di)__V);
1208 }
1209
1210 /// \brief Tests whether the specified bits in a 128-bit integer vector are all
1211 ///    ones.
1212 ///
1213 /// \headerfile <x86intrin.h>
1214 ///
1215 /// \code
1216 /// int _mm_test_all_ones(__m128i V);
1217 /// \endcode
1218 ///
1219 /// This intrinsic corresponds to the <c> <i> VPTEST / PTEST </i> </c>
1220 /// instruction.
1221 ///
1222 /// \param V
1223 ///    A 128-bit integer vector containing the bits to be tested.
1224 /// \returns TRUE if the bits specified in the operand are all set to 1; FALSE
1225 ///    otherwise.
1226 #define _mm_test_all_ones(V) _mm_testc_si128((V), _mm_cmpeq_epi32((V), (V)))
1227
1228 /// \brief Tests whether the specified bits in a 128-bit integer vector are
1229 ///    neither all zeros nor all ones.
1230 ///
1231 /// \headerfile <x86intrin.h>
1232 ///
1233 /// \code
1234 /// int _mm_test_mix_ones_zeros(__m128i M, __m128i V);
1235 /// \endcode
1236 ///
1237 /// This intrinsic corresponds to the <c> <i> VPTEST / PTEST </i> </c>
1238 /// instruction.
1239 ///
1240 /// \param M
1241 ///    A 128-bit integer vector containing the bits to be tested.
1242 /// \param V
1243 ///    A 128-bit integer vector selecting which bits to test in operand \a M.
1244 /// \returns TRUE if the specified bits are neither all zeros nor all ones;
1245 ///    FALSE otherwise.
1246 #define _mm_test_mix_ones_zeros(M, V) _mm_testnzc_si128((M), (V))
1247
1248 /// \brief Tests whether the specified bits in a 128-bit integer vector are all
1249 ///    zeros.
1250 ///
1251 /// \headerfile <x86intrin.h>
1252 ///
1253 /// \code
1254 /// int _mm_test_all_zeros(__m128i M, __m128i V);
1255 /// \endcode
1256 ///
1257 /// This intrinsic corresponds to the <c> <i> VPTEST / PTEST </i> </c>
1258 /// instruction.
1259 ///
1260 /// \param M
1261 ///    A 128-bit integer vector containing the bits to be tested.
1262 /// \param V
1263 ///    A 128-bit integer vector selecting which bits to test in operand \a M.
1264 /// \returns TRUE if the specified bits are all zeros; FALSE otherwise.
1265 #define _mm_test_all_zeros(M, V) _mm_testz_si128 ((M), (V))
1266
1267 /* SSE4 64-bit Packed Integer Comparisons.  */
1268 /// \brief Compares each of the corresponding 64-bit values of the 128-bit
1269 ///    integer vectors for equality.
1270 ///
1271 /// \headerfile <x86intrin.h>
1272 ///
1273 /// This intrinsic corresponds to the <c> <i> VPCMPEQQ / PCMPEQQ </i> </c>
1274 /// instruction.
1275 ///
1276 /// \param __V1
1277 ///    A 128-bit integer vector.
1278 /// \param __V2
1279 ///    A 128-bit integer vector.
1280 /// \returns A 128-bit integer vector containing the comparison results.
1281 static __inline__ __m128i __DEFAULT_FN_ATTRS
1282 _mm_cmpeq_epi64(__m128i __V1, __m128i __V2)
1283 {
1284   return (__m128i)((__v2di)__V1 == (__v2di)__V2);
1285 }
1286
1287 /* SSE4 Packed Integer Sign-Extension.  */
1288 /// \brief Sign-extends each of the lower eight 8-bit integer elements of a
1289 ///    128-bit vector of [16 x i8] to 16-bit values and returns them in a
1290 ///    128-bit vector of [8 x i16]. The upper eight elements of the input vector
1291 ///    are unused.
1292 ///
1293 /// \headerfile <x86intrin.h>
1294 ///
1295 /// This intrinsic corresponds to the <c> <i> VPMOVSXBW / PMOVSXBW </i> </c>
1296 /// instruction.
1297 ///
1298 /// \param __V
1299 ///    A 128-bit vector of [16 x i8]. The lower eight 8-bit elements are sign-
1300 ///    extended to 16-bit values.
1301 /// \returns A 128-bit vector of [8 x i16] containing the sign-extended values.
1302 static __inline__ __m128i __DEFAULT_FN_ATTRS
1303 _mm_cvtepi8_epi16(__m128i __V)
1304 {
1305   /* This function always performs a signed extension, but __v16qi is a char
1306      which may be signed or unsigned, so use __v16qs. */
1307   return (__m128i)__builtin_convertvector(__builtin_shufflevector((__v16qs)__V, (__v16qs)__V, 0, 1, 2, 3, 4, 5, 6, 7), __v8hi);
1308 }
1309
1310 /// \brief Sign-extends each of the lower four 8-bit integer elements of a
1311 ///    128-bit vector of [16 x i8] to 32-bit values and returns them in a
1312 ///    128-bit vector of [4 x i32]. The upper twelve elements of the input
1313 ///    vector are unused.
1314 ///
1315 /// \headerfile <x86intrin.h>
1316 ///
1317 /// This intrinsic corresponds to the <c> <i> VPMOVSXBD / PMOVSXBD </i> </c>
1318 /// instruction.
1319 ///
1320 /// \param __V
1321 ///    A 128-bit vector of [16 x i8]. The lower four 8-bit elements are sign-
1322 ///    extended to 32-bit values.
1323 /// \returns A 128-bit vector of [4 x i32] containing the sign-extended values.
1324 static __inline__ __m128i __DEFAULT_FN_ATTRS
1325 _mm_cvtepi8_epi32(__m128i __V)
1326 {
1327   /* This function always performs a signed extension, but __v16qi is a char
1328      which may be signed or unsigned, so use __v16qs. */
1329   return (__m128i)__builtin_convertvector(__builtin_shufflevector((__v16qs)__V, (__v16qs)__V, 0, 1, 2, 3), __v4si);
1330 }
1331
1332 /// \brief Sign-extends each of the lower two 8-bit integer elements of a
1333 ///    128-bit integer vector of [16 x i8] to 64-bit values and returns them in
1334 ///    a 128-bit vector of [2 x i64]. The upper fourteen elements of the input
1335 ///    vector are unused.
1336 ///
1337 /// \headerfile <x86intrin.h>
1338 ///
1339 /// This intrinsic corresponds to the <c> <i> VPMOVSXBQ / PMOVSXBQ </i> </c>
1340 /// instruction.
1341 ///
1342 /// \param __V
1343 ///    A 128-bit vector of [16 x i8]. The lower two 8-bit elements are sign-
1344 ///    extended to 64-bit values.
1345 /// \returns A 128-bit vector of [2 x i64] containing the sign-extended values.
1346 static __inline__ __m128i __DEFAULT_FN_ATTRS
1347 _mm_cvtepi8_epi64(__m128i __V)
1348 {
1349   /* This function always performs a signed extension, but __v16qi is a char
1350      which may be signed or unsigned, so use __v16qs. */
1351   return (__m128i)__builtin_convertvector(__builtin_shufflevector((__v16qs)__V, (__v16qs)__V, 0, 1), __v2di);
1352 }
1353
1354 /// \brief Sign-extends each of the lower four 16-bit integer elements of a
1355 ///    128-bit integer vector of [8 x i16] to 32-bit values and returns them in
1356 ///    a 128-bit vector of [4 x i32]. The upper four elements of the input
1357 ///    vector are unused.
1358 ///
1359 /// \headerfile <x86intrin.h>
1360 ///
1361 /// This intrinsic corresponds to the <c> <i> VPMOVSXWD / PMOVSXWD </i> </c>
1362 /// instruction.
1363 ///
1364 /// \param __V
1365 ///    A 128-bit vector of [8 x i16]. The lower four 16-bit elements are sign-
1366 ///    extended to 32-bit values.
1367 /// \returns A 128-bit vector of [4 x i32] containing the sign-extended values.
1368 static __inline__ __m128i __DEFAULT_FN_ATTRS
1369 _mm_cvtepi16_epi32(__m128i __V)
1370 {
1371   return (__m128i)__builtin_convertvector(__builtin_shufflevector((__v8hi)__V, (__v8hi)__V, 0, 1, 2, 3), __v4si);
1372 }
1373
1374 /// \brief Sign-extends each of the lower two 16-bit integer elements of a
1375 ///    128-bit integer vector of [8 x i16] to 64-bit values and returns them in
1376 ///    a 128-bit vector of [2 x i64]. The upper six elements of the input
1377 ///    vector are unused.
1378 ///
1379 /// \headerfile <x86intrin.h>
1380 ///
1381 /// This intrinsic corresponds to the <c> <i> VPMOVSXWQ / PMOVSXWQ </i> </c>
1382 /// instruction.
1383 ///
1384 /// \param __V
1385 ///    A 128-bit vector of [8 x i16]. The lower two 16-bit elements are sign-
1386 ///    extended to 64-bit values.
1387 /// \returns A 128-bit vector of [2 x i64] containing the sign-extended values.
1388 static __inline__ __m128i __DEFAULT_FN_ATTRS
1389 _mm_cvtepi16_epi64(__m128i __V)
1390 {
1391   return (__m128i)__builtin_convertvector(__builtin_shufflevector((__v8hi)__V, (__v8hi)__V, 0, 1), __v2di);
1392 }
1393
1394 /// \brief Sign-extends each of the lower two 32-bit integer elements of a
1395 ///    128-bit integer vector of [4 x i32] to 64-bit values and returns them in
1396 ///    a 128-bit vector of [2 x i64]. The upper two elements of the input vector
1397 ///    are unused.
1398 ///
1399 /// \headerfile <x86intrin.h>
1400 ///
1401 /// This intrinsic corresponds to the <c> <i> VPMOVSXDQ / PMOVSXDQ </i> </c>
1402 /// instruction.
1403 ///
1404 /// \param __V
1405 ///    A 128-bit vector of [4 x i32]. The lower two 32-bit elements are sign-
1406 ///    extended to 64-bit values.
1407 /// \returns A 128-bit vector of [2 x i64] containing the sign-extended values.
1408 static __inline__ __m128i __DEFAULT_FN_ATTRS
1409 _mm_cvtepi32_epi64(__m128i __V)
1410 {
1411   return (__m128i)__builtin_convertvector(__builtin_shufflevector((__v4si)__V, (__v4si)__V, 0, 1), __v2di);
1412 }
1413
1414 /* SSE4 Packed Integer Zero-Extension.  */
1415 /// \brief Zero-extends each of the lower eight 8-bit integer elements of a
1416 ///    128-bit vector of [16 x i8] to 16-bit values and returns them in a
1417 ///    128-bit vector of [8 x i16]. The upper eight elements of the input vector
1418 ///    are unused.
1419 ///
1420 /// \headerfile <x86intrin.h>
1421 ///
1422 /// This intrinsic corresponds to the <c> <i> VPMOVZXBW / PMOVZXBW </i> </c>
1423 /// instruction.
1424 ///
1425 /// \param __V
1426 ///    A 128-bit vector of [16 x i8]. The lower eight 8-bit elements are zero-
1427 ///    extended to 16-bit values.
1428 /// \returns A 128-bit vector of [8 x i16] containing the zero-extended values.
1429 static __inline__ __m128i __DEFAULT_FN_ATTRS
1430 _mm_cvtepu8_epi16(__m128i __V)
1431 {
1432   return (__m128i)__builtin_convertvector(__builtin_shufflevector((__v16qu)__V, (__v16qu)__V, 0, 1, 2, 3, 4, 5, 6, 7), __v8hi);
1433 }
1434
1435 /// \brief Zero-extends each of the lower four 8-bit integer elements of a
1436 ///    128-bit vector of [16 x i8] to 32-bit values and returns them in a
1437 ///    128-bit vector of [4 x i32]. The upper twelve elements of the input
1438 ///    vector are unused.
1439 ///
1440 /// \headerfile <x86intrin.h>
1441 ///
1442 /// This intrinsic corresponds to the <c> <i> VPMOVZXBD / PMOVZXBD </i> </c>
1443 /// instruction.
1444 ///
1445 /// \param __V
1446 ///    A 128-bit vector of [16 x i8]. The lower four 8-bit elements are zero-
1447 ///    extended to 32-bit values.
1448 /// \returns A 128-bit vector of [4 x i32] containing the zero-extended values.
1449 static __inline__ __m128i __DEFAULT_FN_ATTRS
1450 _mm_cvtepu8_epi32(__m128i __V)
1451 {
1452   return (__m128i)__builtin_convertvector(__builtin_shufflevector((__v16qu)__V, (__v16qu)__V, 0, 1, 2, 3), __v4si);
1453 }
1454
1455 /// \brief Zero-extends each of the lower two 8-bit integer elements of a
1456 ///    128-bit integer vector of [16 x i8] to 64-bit values and returns them in
1457 ///    a 128-bit vector of [2 x i64]. The upper fourteen elements of the input
1458 ///    vector are unused.
1459 ///
1460 /// \headerfile <x86intrin.h>
1461 ///
1462 /// This intrinsic corresponds to the <c> <i> VPMOVZXBQ / PMOVZXBQ </i> </c>
1463 /// instruction.
1464 ///
1465 /// \param __V
1466 ///    A 128-bit vector of [16 x i8]. The lower two 8-bit elements are zero-
1467 ///    extended to 64-bit values.
1468 /// \returns A 128-bit vector of [2 x i64] containing the zero-extended values.
1469 static __inline__ __m128i __DEFAULT_FN_ATTRS
1470 _mm_cvtepu8_epi64(__m128i __V)
1471 {
1472   return (__m128i)__builtin_convertvector(__builtin_shufflevector((__v16qu)__V, (__v16qu)__V, 0, 1), __v2di);
1473 }
1474
1475 /// \brief Zero-extends each of the lower four 16-bit integer elements of a
1476 ///    128-bit integer vector of [8 x i16] to 32-bit values and returns them in
1477 ///    a 128-bit vector of [4 x i32]. The upper four elements of the input
1478 ///    vector are unused.
1479 ///
1480 /// \headerfile <x86intrin.h>
1481 ///
1482 /// This intrinsic corresponds to the <c> <i> VPMOVZXWD / PMOVZXWD </i> </c>
1483 /// instruction.
1484 ///
1485 /// \param __V
1486 ///    A 128-bit vector of [8 x i16]. The lower four 16-bit elements are zero-
1487 ///    extended to 32-bit values.
1488 /// \returns A 128-bit vector of [4 x i32] containing the zero-extended values.
1489 static __inline__ __m128i __DEFAULT_FN_ATTRS
1490 _mm_cvtepu16_epi32(__m128i __V)
1491 {
1492   return (__m128i)__builtin_convertvector(__builtin_shufflevector((__v8hu)__V, (__v8hu)__V, 0, 1, 2, 3), __v4si);
1493 }
1494
1495 /// \brief Zero-extends each of the lower two 16-bit integer elements of a
1496 ///    128-bit integer vector of [8 x i16] to 64-bit values and returns them in
1497 ///    a 128-bit vector of [2 x i64]. The upper six elements of the input vector
1498 ///    are unused.
1499 ///
1500 /// \headerfile <x86intrin.h>
1501 ///
1502 /// This intrinsic corresponds to the <c> <i> VPMOVZXWQ / PMOVZXWQ </i> </c>
1503 /// instruction.
1504 ///
1505 /// \param __V
1506 ///    A 128-bit vector of [8 x i16]. The lower two 16-bit elements are zero-
1507 ///    extended to 64-bit values.
1508 /// \returns A 128-bit vector of [2 x i64] containing the zero-extended values.
1509 static __inline__ __m128i __DEFAULT_FN_ATTRS
1510 _mm_cvtepu16_epi64(__m128i __V)
1511 {
1512   return (__m128i)__builtin_convertvector(__builtin_shufflevector((__v8hu)__V, (__v8hu)__V, 0, 1), __v2di);
1513 }
1514
1515 /// \brief Zero-extends each of the lower two 32-bit integer elements of a
1516 ///    128-bit integer vector of [4 x i32] to 64-bit values and returns them in
1517 ///    a 128-bit vector of [2 x i64]. The upper two elements of the input vector
1518 ///    are unused.
1519 ///
1520 /// \headerfile <x86intrin.h>
1521 ///
1522 /// This intrinsic corresponds to the <c> <i> VPMOVZXDQ / PMOVZXDQ </i> </c>
1523 /// instruction.
1524 ///
1525 /// \param __V
1526 ///    A 128-bit vector of [4 x i32]. The lower two 32-bit elements are zero-
1527 ///    extended to 64-bit values.
1528 /// \returns A 128-bit vector of [2 x i64] containing the zero-extended values.
1529 static __inline__ __m128i __DEFAULT_FN_ATTRS
1530 _mm_cvtepu32_epi64(__m128i __V)
1531 {
1532   return (__m128i)__builtin_convertvector(__builtin_shufflevector((__v4su)__V, (__v4su)__V, 0, 1), __v2di);
1533 }
1534
1535 /* SSE4 Pack with Unsigned Saturation.  */
1536 /// \brief Converts 32-bit signed integers from both 128-bit integer vector
1537 ///    operands into 16-bit unsigned integers, and returns the packed result.
1538 ///    Values greater than 0xFFFF are saturated to 0xFFFF. Values less than
1539 ///    0x0000 are saturated to 0x0000.
1540 ///
1541 /// \headerfile <x86intrin.h>
1542 ///
1543 /// This intrinsic corresponds to the <c> <i> VPACKUSDW / PACKUSDW </i> </c>
1544 /// instruction.
1545 ///
1546 /// \param __V1
1547 ///    A 128-bit vector of [4 x i32]. Each 32-bit element is treated as a
1548 ///    signed integer and is converted to a 16-bit unsigned integer with
1549 ///    saturation. Values greater than 0xFFFF are saturated to 0xFFFF. Values
1550 ///    less than 0x0000 are saturated to 0x0000. The converted [4 x i16] values
1551 ///    are written to the lower 64 bits of the result.
1552 /// \param __V2
1553 ///    A 128-bit vector of [4 x i32]. Each 32-bit element is treated as a
1554 ///    signed integer and is converted to a 16-bit unsigned integer with
1555 ///    saturation. Values greater than 0xFFFF are saturated to 0xFFFF. Values
1556 ///    less than 0x0000 are saturated to 0x0000. The converted [4 x i16] values
1557 ///    are written to the higher 64 bits of the result.
1558 /// \returns A 128-bit vector of [8 x i16] containing the converted values.
1559 static __inline__ __m128i __DEFAULT_FN_ATTRS
1560 _mm_packus_epi32(__m128i __V1, __m128i __V2)
1561 {
1562   return (__m128i) __builtin_ia32_packusdw128((__v4si)__V1, (__v4si)__V2);
1563 }
1564
1565 /* SSE4 Multiple Packed Sums of Absolute Difference.  */
1566 /// \brief Subtracts 8-bit unsigned integer values and computes the absolute
1567 ///    values of the differences to the corresponding bits in the destination.
1568 ///    Then sums of the absolute differences are returned according to the bit
1569 ///    fields in the immediate operand.
1570 ///
1571 /// \headerfile <x86intrin.h>
1572 ///
1573 /// \code
1574 /// __m128i _mm_mpsadbw_epu8(__m128i X, __m128i Y, const int M);
1575 /// \endcode
1576 ///
1577 /// This intrinsic corresponds to the <c> <i> VMPSADBW / MPSADBW </i> </c>
1578 /// instruction.
1579 ///
1580 /// \param X
1581 ///    A 128-bit vector of [16 x i8].
1582 /// \param Y
1583 ///    A 128-bit vector of [16 x i8].
1584 /// \param M
1585 ///    An 8-bit immediate operand specifying how the absolute differences are to
1586 ///    be calculated, according to the following algorithm:
1587 ///    \code
1588 ///    // M2 represents bit 2 of the immediate operand
1589 ///    // M10 represents bits [1:0] of the immediate operand
1590 ///    i = M2 * 4
1591 ///    j = M10 * 4
1592 ///    for (k = 0; k < 8; k = k + 1) {
1593 ///      d0 = abs(X[i + k + 0] - Y[j + 0])
1594 ///      d1 = abs(X[i + k + 1] - Y[j + 1])
1595 ///      d2 = abs(X[i + k + 2] - Y[j + 2])
1596 ///      d3 = abs(X[i + k + 3] - Y[j + 3])
1597 ///      r[k] = d0 + d1 + d2 + d3
1598 ///    }
1599 ///    \endcode
1600 /// \returns A 128-bit integer vector containing the sums of the sets of
1601 ///    absolute differences between both operands.
1602 #define _mm_mpsadbw_epu8(X, Y, M) __extension__ ({ \
1603   (__m128i) __builtin_ia32_mpsadbw128((__v16qi)(__m128i)(X), \
1604                                       (__v16qi)(__m128i)(Y), (M)); })
1605
1606 /// \brief Finds the minimum unsigned 16-bit element in the input 128-bit
1607 ///    vector of [8 x u16] and returns it and along with its index.
1608 ///
1609 /// \headerfile <x86intrin.h>
1610 ///
1611 /// This intrinsic corresponds to the <c> <i> VPHMINPOSUW / PHMINPOSUW </i> </c>
1612 /// instruction.
1613 ///
1614 /// \param __V
1615 ///    A 128-bit vector of [8 x u16].
1616 /// \returns A 128-bit value where bits [15:0] contain the minimum value found
1617 ///    in parameter \a __V, bits [18:16] contain the index of the minimum value
1618 ///    and the remaining bits are set to 0.
1619 static __inline__ __m128i __DEFAULT_FN_ATTRS
1620 _mm_minpos_epu16(__m128i __V)
1621 {
1622   return (__m128i) __builtin_ia32_phminposuw128((__v8hi)__V);
1623 }
1624
1625 /* Handle the sse4.2 definitions here. */
1626
1627 /* These definitions are normally in nmmintrin.h, but gcc puts them in here
1628    so we'll do the same.  */
1629
1630 #undef __DEFAULT_FN_ATTRS
1631 #define __DEFAULT_FN_ATTRS __attribute__((__always_inline__, __nodebug__, __target__("sse4.2")))
1632
1633 /* These specify the type of data that we're comparing.  */
1634 #define _SIDD_UBYTE_OPS                 0x00
1635 #define _SIDD_UWORD_OPS                 0x01
1636 #define _SIDD_SBYTE_OPS                 0x02
1637 #define _SIDD_SWORD_OPS                 0x03
1638
1639 /* These specify the type of comparison operation.  */
1640 #define _SIDD_CMP_EQUAL_ANY             0x00
1641 #define _SIDD_CMP_RANGES                0x04
1642 #define _SIDD_CMP_EQUAL_EACH            0x08
1643 #define _SIDD_CMP_EQUAL_ORDERED         0x0c
1644
1645 /* These macros specify the polarity of the operation.  */
1646 #define _SIDD_POSITIVE_POLARITY         0x00
1647 #define _SIDD_NEGATIVE_POLARITY         0x10
1648 #define _SIDD_MASKED_POSITIVE_POLARITY  0x20
1649 #define _SIDD_MASKED_NEGATIVE_POLARITY  0x30
1650
1651 /* These macros are used in _mm_cmpXstri() to specify the return.  */
1652 #define _SIDD_LEAST_SIGNIFICANT         0x00
1653 #define _SIDD_MOST_SIGNIFICANT          0x40
1654
1655 /* These macros are used in _mm_cmpXstri() to specify the return.  */
1656 #define _SIDD_BIT_MASK                  0x00
1657 #define _SIDD_UNIT_MASK                 0x40
1658
1659 /* SSE4.2 Packed Comparison Intrinsics.  */
1660 /// \brief Uses the immediate operand \a M to perform a comparison of string
1661 ///    data with implicitly defined lengths that is contained in source operands
1662 ///    \a A and \a B. Returns a 128-bit integer vector representing the result
1663 ///    mask of the comparison.
1664 ///
1665 /// \headerfile <x86intrin.h>
1666 ///
1667 /// \code
1668 /// __m128i _mm_cmpistrm(__m128i A, __m128i B, const int M);
1669 /// \endcode
1670 ///
1671 /// This intrinsic corresponds to the <c> <i> VPCMPISTRM / PCMPISTRM </i> </c>
1672 /// instruction.
1673 ///
1674 /// \param A
1675 ///    A 128-bit integer vector containing one of the source operands to be
1676 ///    compared.
1677 /// \param B
1678 ///    A 128-bit integer vector containing one of the source operands to be
1679 ///    compared.
1680 /// \param M
1681 ///    An 8-bit immediate operand specifying whether the characters are bytes or
1682 ///    words, the type of comparison to perform, and the format of the return
1683 ///    value. \n
1684 ///    Bits [1:0]: Determine source data format. \n
1685 ///      00: 16 unsigned bytes \n
1686 ///      01: 8 unsigned words \n
1687 ///      10: 16 signed bytes \n
1688 ///      11: 8 signed words \n
1689 ///    Bits [3:2]: Determine comparison type and aggregation method. \n
1690 ///      00: Subset: Each character in \a B is compared for equality with all
1691 ///          the characters in \a A. \n
1692 ///      01: Ranges: Each character in \a B is compared to \a A. The comparison
1693 ///          basis is greater than or equal for even-indexed elements in \a A,
1694 ///          and less than or equal for odd-indexed elements in \a A. \n
1695 ///      10: Match: Compare each pair of corresponding characters in \a A and
1696 ///          \a B for equality. \n
1697 ///      11: Substring: Search \a B for substring matches of \a A. \n
1698 ///    Bits [5:4]: Determine whether to perform a one's complement on the bit
1699 ///                mask of the comparison results. \n
1700 ///      00: No effect. \n
1701 ///      01: Negate the bit mask. \n
1702 ///      10: No effect. \n
1703 ///      11: Negate the bit mask only for bits with an index less than or equal
1704 ///          to the size of \a A or \a B. \n
1705 ///    Bit [6]: Determines whether the result is zero-extended or expanded to 16
1706 ///             bytes. \n
1707 ///      0: The result is zero-extended to 16 bytes. \n
1708 ///      1: The result is expanded to 16 bytes (this expansion is performed by
1709 ///         repeating each bit 8 or 16 times).
1710 /// \returns Returns a 128-bit integer vector representing the result mask of
1711 ///    the comparison.
1712 #define _mm_cmpistrm(A, B, M) \
1713   (__m128i)__builtin_ia32_pcmpistrm128((__v16qi)(__m128i)(A), \
1714                                        (__v16qi)(__m128i)(B), (int)(M))
1715
1716 /// \brief Uses the immediate operand \a M to perform a comparison of string
1717 ///    data with implicitly defined lengths that is contained in source operands
1718 ///    \a A and \a B. Returns an integer representing the result index of the
1719 ///    comparison.
1720 ///
1721 /// \headerfile <x86intrin.h>
1722 ///
1723 /// \code
1724 /// int _mm_cmpistri(__m128i A, __m128i B, const int M);
1725 /// \endcode
1726 ///
1727 /// This intrinsic corresponds to the <c> <i> VPCMPISTRI / PCMPISTRI </i> </c>
1728 /// instruction.
1729 ///
1730 /// \param A
1731 ///    A 128-bit integer vector containing one of the source operands to be
1732 ///    compared.
1733 /// \param B
1734 ///    A 128-bit integer vector containing one of the source operands to be
1735 ///    compared.
1736 /// \param M
1737 ///    An 8-bit immediate operand specifying whether the characters are bytes or
1738 ///    words, the type of comparison to perform, and the format of the return
1739 ///    value. \n
1740 ///    Bits [1:0]: Determine source data format. \n
1741 ///      00: 16 unsigned bytes \n
1742 ///      01: 8 unsigned words \n
1743 ///      10: 16 signed bytes \n
1744 ///      11: 8 signed words \n
1745 ///    Bits [3:2]: Determine comparison type and aggregation method. \n
1746 ///      00: Subset: Each character in \a B is compared for equality with all
1747 ///          the characters in \a A. \n
1748 ///      01: Ranges: Each character in \a B is compared to \a A. The comparison
1749 ///          basis is greater than or equal for even-indexed elements in \a A,
1750 ///          and less than or equal for odd-indexed elements in \a A. \n
1751 ///      10: Match: Compare each pair of corresponding characters in \a A and
1752 ///          \a B for equality. \n
1753 ///      11: Substring: Search B for substring matches of \a A. \n
1754 ///    Bits [5:4]: Determine whether to perform a one's complement on the bit
1755 ///                mask of the comparison results. \n
1756 ///      00: No effect. \n
1757 ///      01: Negate the bit mask. \n
1758 ///      10: No effect. \n
1759 ///      11: Negate the bit mask only for bits with an index less than or equal
1760 ///          to the size of \a A or \a B. \n
1761 ///    Bit [6]: Determines whether the index of the lowest set bit or the
1762 ///             highest set bit is returned. \n
1763 ///      0: The index of the least significant set bit. \n
1764 ///      1: The index of the most significant set bit. \n
1765 /// \returns Returns an integer representing the result index of the comparison.
1766 #define _mm_cmpistri(A, B, M) \
1767   (int)__builtin_ia32_pcmpistri128((__v16qi)(__m128i)(A), \
1768                                    (__v16qi)(__m128i)(B), (int)(M))
1769
1770 /// \brief Uses the immediate operand \a M to perform a comparison of string
1771 ///    data with explicitly defined lengths that is contained in source operands
1772 ///    \a A and \a B. Returns a 128-bit integer vector representing the result
1773 ///    mask of the comparison.
1774 ///
1775 /// \headerfile <x86intrin.h>
1776 ///
1777 /// \code
1778 /// __m128i _mm_cmpestrm(__m128i A, int LA, __m128i B, int LB, const int M);
1779 /// \endcode
1780 ///
1781 /// This intrinsic corresponds to the <c> <i> VPCMPESTRM / PCMPESTRM </i> </c>
1782 /// instruction.
1783 ///
1784 /// \param A
1785 ///    A 128-bit integer vector containing one of the source operands to be
1786 ///    compared.
1787 /// \param LA
1788 ///    An integer that specifies the length of the string in \a A.
1789 /// \param B
1790 ///    A 128-bit integer vector containing one of the source operands to be
1791 ///    compared.
1792 /// \param LB
1793 ///    An integer that specifies the length of the string in \a B.
1794 /// \param M
1795 ///    An 8-bit immediate operand specifying whether the characters are bytes or
1796 ///    words, the type of comparison to perform, and the format of the return
1797 ///    value. \n
1798 ///    Bits [1:0]: Determine source data format. \n
1799 ///      00: 16 unsigned bytes \n
1800 ///      01: 8 unsigned words \n
1801 ///      10: 16 signed bytes \n
1802 ///      11: 8 signed words \n
1803 ///    Bits [3:2]: Determine comparison type and aggregation method. \n
1804 ///      00: Subset: Each character in \a B is compared for equality with all
1805 ///          the characters in \a A. \n
1806 ///      01: Ranges: Each character in \a B is compared to \a A. The comparison
1807 ///          basis is greater than or equal for even-indexed elements in \a A,
1808 ///          and less than or equal for odd-indexed elements in \a A. \n
1809 ///      10: Match: Compare each pair of corresponding characters in \a A and
1810 ///          \a B for equality. \n
1811 ///      11: Substring: Search \a B for substring matches of \a A. \n
1812 ///    Bits [5:4]: Determine whether to perform a one's complement on the bit
1813 ///                mask of the comparison results. \n
1814 ///      00: No effect. \n
1815 ///      01: Negate the bit mask. \n
1816 ///      10: No effect. \n
1817 ///      11: Negate the bit mask only for bits with an index less than or equal
1818 ///          to the size of \a A or \a B. \n
1819 ///    Bit [6]: Determines whether the result is zero-extended or expanded to 16
1820 ///             bytes. \n
1821 ///      0: The result is zero-extended to 16 bytes. \n
1822 ///      1: The result is expanded to 16 bytes (this expansion is performed by
1823 ///         repeating each bit 8 or 16 times). \n
1824 /// \returns Returns a 128-bit integer vector representing the result mask of
1825 ///    the comparison.
1826 #define _mm_cmpestrm(A, LA, B, LB, M) \
1827   (__m128i)__builtin_ia32_pcmpestrm128((__v16qi)(__m128i)(A), (int)(LA), \
1828                                        (__v16qi)(__m128i)(B), (int)(LB), \
1829                                        (int)(M))
1830
1831 /// \brief Uses the immediate operand \a M to perform a comparison of string
1832 ///    data with explicitly defined lengths that is contained in source operands
1833 ///    \a A and \a B. Returns an integer representing the result index of the
1834 ///    comparison.
1835 ///
1836 /// \headerfile <x86intrin.h>
1837 ///
1838 /// \code
1839 /// int _mm_cmpestri(__m128i A, int LA, __m128i B, int LB, const int M);
1840 /// \endcode
1841 ///
1842 /// This intrinsic corresponds to the <c> <i> VPCMPESTRI / PCMPESTRI </i> </c>
1843 /// instruction.
1844 ///
1845 /// \param A
1846 ///    A 128-bit integer vector containing one of the source operands to be
1847 ///    compared.
1848 /// \param LA
1849 ///    An integer that specifies the length of the string in \a A.
1850 /// \param B
1851 ///    A 128-bit integer vector containing one of the source operands to be
1852 ///    compared.
1853 /// \param LB
1854 ///    An integer that specifies the length of the string in \a B.
1855 /// \param M
1856 ///    An 8-bit immediate operand specifying whether the characters are bytes or
1857 ///    words, the type of comparison to perform, and the format of the return
1858 ///    value. \n
1859 ///    Bits [1:0]: Determine source data format. \n
1860 ///      00: 16 unsigned bytes \n
1861 ///      01: 8 unsigned words \n
1862 ///      10: 16 signed bytes \n
1863 ///      11: 8 signed words \n
1864 ///    Bits [3:2]: Determine comparison type and aggregation method. \n
1865 ///      00: Subset: Each character in \a B is compared for equality with all
1866 ///          the characters in \a A. \n
1867 ///      01: Ranges: Each character in \a B is compared to \a A. The comparison
1868 ///          basis is greater than or equal for even-indexed elements in \a A,
1869 ///          and less than or equal for odd-indexed elements in \a A. \n
1870 ///      10: Match: Compare each pair of corresponding characters in \a A and
1871 ///          \a B for equality. \n
1872 ///      11: Substring: Search B for substring matches of \a A. \n
1873 ///    Bits [5:4]: Determine whether to perform a one's complement on the bit
1874 ///                mask of the comparison results. \n
1875 ///      00: No effect. \n
1876 ///      01: Negate the bit mask. \n
1877 ///      10: No effect. \n
1878 ///      11: Negate the bit mask only for bits with an index less than or equal
1879 ///          to the size of \a A or \a B. \n
1880 ///    Bit [6]: Determines whether the index of the lowest set bit or the
1881 ///             highest set bit is returned. \n
1882 ///      0: The index of the least significant set bit. \n
1883 ///      1: The index of the most significant set bit. \n
1884 /// \returns Returns an integer representing the result index of the comparison.
1885 #define _mm_cmpestri(A, LA, B, LB, M) \
1886   (int)__builtin_ia32_pcmpestri128((__v16qi)(__m128i)(A), (int)(LA), \
1887                                    (__v16qi)(__m128i)(B), (int)(LB), \
1888                                    (int)(M))
1889
1890 /* SSE4.2 Packed Comparison Intrinsics and EFlag Reading.  */
1891 /// \brief Uses the immediate operand \a M to perform a comparison of string
1892 ///    data with implicitly defined lengths that is contained in source operands
1893 ///    \a A and \a B. Returns 1 if the bit mask is zero and the length of the
1894 ///    string in \a B is the maximum, otherwise, returns 0.
1895 ///
1896 /// \headerfile <x86intrin.h>
1897 ///
1898 /// \code
1899 /// int _mm_cmpistra(__m128i A, __m128i B, const int M);
1900 /// \endcode
1901 ///
1902 /// This intrinsic corresponds to the <c> <i> VPCMPISTRI / PCMPISTRI </i> </c>
1903 /// instruction.
1904 ///
1905 /// \param A
1906 ///    A 128-bit integer vector containing one of the source operands to be
1907 ///    compared.
1908 /// \param B
1909 ///    A 128-bit integer vector containing one of the source operands to be
1910 ///    compared.
1911 /// \param M
1912 ///    An 8-bit immediate operand specifying whether the characters are bytes or
1913 ///    words and the type of comparison to perform. \n
1914 ///    Bits [1:0]: Determine source data format. \n
1915 ///      00: 16 unsigned bytes \n
1916 ///      01: 8 unsigned words \n
1917 ///      10: 16 signed bytes \n
1918 ///      11: 8 signed words \n
1919 ///    Bits [3:2]: Determine comparison type and aggregation method. \n
1920 ///      00: Subset: Each character in \a B is compared for equality with all
1921 ///          the characters in \a A. \n
1922 ///      01: Ranges: Each character in \a B is compared to \a A. The comparison
1923 ///          basis is greater than or equal for even-indexed elements in \a A,
1924 ///          and less than or equal for odd-indexed elements in \a A. \n
1925 ///      10: Match: Compare each pair of corresponding characters in \a A and
1926 ///          \a B for equality. \n
1927 ///      11: Substring: Search \a B for substring matches of \a A. \n
1928 ///    Bits [5:4]: Determine whether to perform a one's complement on the bit
1929 ///                mask of the comparison results. \n
1930 ///      00: No effect. \n
1931 ///      01: Negate the bit mask. \n
1932 ///      10: No effect. \n
1933 ///      11: Negate the bit mask only for bits with an index less than or equal
1934 ///          to the size of \a A or \a B. \n
1935 /// \returns Returns 1 if the bit mask is zero and the length of the string in
1936 ///    \a B is the maximum; otherwise, returns 0.
1937 #define _mm_cmpistra(A, B, M) \
1938   (int)__builtin_ia32_pcmpistria128((__v16qi)(__m128i)(A), \
1939                                     (__v16qi)(__m128i)(B), (int)(M))
1940
1941 /// \brief Uses the immediate operand \a M to perform a comparison of string
1942 ///    data with implicitly defined lengths that is contained in source operands
1943 ///    \a A and \a B. Returns 1 if the bit mask is non-zero, otherwise, returns
1944 ///    0.
1945 ///
1946 /// \headerfile <x86intrin.h>
1947 ///
1948 /// \code
1949 /// int _mm_cmpistrc(__m128i A, __m128i B, const int M);
1950 /// \endcode
1951 ///
1952 /// This intrinsic corresponds to the <c> <i> VPCMPISTRI / PCMPISTRI </i> </c>
1953 /// instruction.
1954 ///
1955 /// \param A
1956 ///    A 128-bit integer vector containing one of the source operands to be
1957 ///    compared.
1958 /// \param B
1959 ///    A 128-bit integer vector containing one of the source operands to be
1960 ///    compared.
1961 /// \param M
1962 ///    An 8-bit immediate operand specifying whether the characters are bytes or
1963 ///    words and the type of comparison to perform. \n
1964 ///    Bits [1:0]: Determine source data format. \n
1965 ///      00: 16 unsigned bytes \n
1966 ///      01: 8 unsigned words \n
1967 ///      10: 16 signed bytes \n
1968 ///      11: 8 signed words \n
1969 ///    Bits [3:2]: Determine comparison type and aggregation method. \n
1970 ///      00: Subset: Each character in \a B is compared for equality with all
1971 ///          the characters in \a A. \n
1972 ///      01: Ranges: Each character in \a B is compared to \a A. The comparison
1973 ///          basis is greater than or equal for even-indexed elements in \a A,
1974 ///          and less than or equal for odd-indexed elements in \a A. \n
1975 ///      10: Match: Compare each pair of corresponding characters in \a A and
1976 ///          \a B for equality. \n
1977 ///      11: Substring: Search B for substring matches of \a A. \n
1978 ///    Bits [5:4]: Determine whether to perform a one's complement on the bit
1979 ///                mask of the comparison results. \n
1980 ///      00: No effect. \n
1981 ///      01: Negate the bit mask. \n
1982 ///      10: No effect. \n
1983 ///      11: Negate the bit mask only for bits with an index less than or equal
1984 ///          to the size of \a A or \a B.
1985 /// \returns Returns 1 if the bit mask is non-zero, otherwise, returns 0.
1986 #define _mm_cmpistrc(A, B, M) \
1987   (int)__builtin_ia32_pcmpistric128((__v16qi)(__m128i)(A), \
1988                                     (__v16qi)(__m128i)(B), (int)(M))
1989
1990 /// \brief Uses the immediate operand \a M to perform a comparison of string
1991 ///    data with implicitly defined lengths that is contained in source operands
1992 ///    \a A and \a B. Returns bit 0 of the resulting bit mask.
1993 ///
1994 /// \headerfile <x86intrin.h>
1995 ///
1996 /// \code
1997 /// int _mm_cmpistro(__m128i A, __m128i B, const int M);
1998 /// \endcode
1999 ///
2000 /// This intrinsic corresponds to the <c> <i> VPCMPISTRI / PCMPISTRI </i> </c>
2001 /// instruction.
2002 ///
2003 /// \param A
2004 ///    A 128-bit integer vector containing one of the source operands to be
2005 ///    compared.
2006 /// \param B
2007 ///    A 128-bit integer vector containing one of the source operands to be
2008 ///    compared.
2009 /// \param M
2010 ///    An 8-bit immediate operand specifying whether the characters are bytes or
2011 ///    words and the type of comparison to perform. \n
2012 ///    Bits [1:0]: Determine source data format. \n
2013 ///      00: 16 unsigned bytes \n
2014 ///      01: 8 unsigned words \n
2015 ///      10: 16 signed bytes \n
2016 ///      11: 8 signed words \n
2017 ///    Bits [3:2]: Determine comparison type and aggregation method. \n
2018 ///      00: Subset: Each character in \a B is compared for equality with all
2019 ///          the characters in \a A. \n
2020 ///      01: Ranges: Each character in \a B is compared to \a A. The comparison
2021 ///          basis is greater than or equal for even-indexed elements in \a A,
2022 ///          and less than or equal for odd-indexed elements in \a A. \n
2023 ///      10: Match: Compare each pair of corresponding characters in \a A and
2024 ///          \a B for equality. \n
2025 ///      11: Substring: Search B for substring matches of \a A. \n
2026 ///    Bits [5:4]: Determine whether to perform a one's complement on the bit
2027 ///                mask of the comparison results. \n
2028 ///      00: No effect. \n
2029 ///      01: Negate the bit mask. \n
2030 ///      10: No effect. \n
2031 ///      11: Negate the bit mask only for bits with an index less than or equal
2032 ///          to the size of \a A or \a B. \n
2033 /// \returns Returns bit 0 of the resulting bit mask.
2034 #define _mm_cmpistro(A, B, M) \
2035   (int)__builtin_ia32_pcmpistrio128((__v16qi)(__m128i)(A), \
2036                                     (__v16qi)(__m128i)(B), (int)(M))
2037
2038 /// \brief Uses the immediate operand \a M to perform a comparison of string
2039 ///    data with implicitly defined lengths that is contained in source operands
2040 ///    \a A and \a B. Returns 1 if the length of the string in \a A is less than
2041 ///    the maximum, otherwise, returns 0.
2042 ///
2043 /// \headerfile <x86intrin.h>
2044 ///
2045 /// \code
2046 /// int _mm_cmpistrs(__m128i A, __m128i B, const int M);
2047 /// \endcode
2048 ///
2049 /// This intrinsic corresponds to the <c> <i> VPCMPISTRI / PCMPISTRI </i> </c>
2050 /// instruction.
2051 ///
2052 /// \param A
2053 ///    A 128-bit integer vector containing one of the source operands to be
2054 ///    compared.
2055 /// \param B
2056 ///    A 128-bit integer vector containing one of the source operands to be
2057 ///    compared.
2058 /// \param M
2059 ///    An 8-bit immediate operand specifying whether the characters are bytes or
2060 ///    words and the type of comparison to perform. \n
2061 ///    Bits [1:0]: Determine source data format. \n
2062 ///      00: 16 unsigned bytes \n
2063 ///      01: 8 unsigned words \n
2064 ///      10: 16 signed bytes \n
2065 ///      11: 8 signed words \n
2066 ///    Bits [3:2]: Determine comparison type and aggregation method. \n
2067 ///      00: Subset: Each character in \a B is compared for equality with all
2068 ///          the characters in \a A. \n
2069 ///      01: Ranges: Each character in \a B is compared to \a A. The comparison
2070 ///          basis is greater than or equal for even-indexed elements in \a A,
2071 ///          and less than or equal for odd-indexed elements in \a A. \n
2072 ///      10: Match: Compare each pair of corresponding characters in \a A and
2073 ///          \a B for equality. \n
2074 ///      11: Substring: Search \a B for substring matches of \a A. \n
2075 ///    Bits [5:4]: Determine whether to perform a one's complement on the bit
2076 ///                mask of the comparison results. \n
2077 ///      00: No effect. \n
2078 ///      01: Negate the bit mask. \n
2079 ///      10: No effect. \n
2080 ///      11: Negate the bit mask only for bits with an index less than or equal
2081 ///          to the size of \a A or \a B. \n
2082 /// \returns Returns 1 if the length of the string in \a A is less than the
2083 ///    maximum, otherwise, returns 0.
2084 #define _mm_cmpistrs(A, B, M) \
2085   (int)__builtin_ia32_pcmpistris128((__v16qi)(__m128i)(A), \
2086                                     (__v16qi)(__m128i)(B), (int)(M))
2087
2088 /// \brief Uses the immediate operand \a M to perform a comparison of string
2089 ///    data with implicitly defined lengths that is contained in source operands
2090 ///    \a A and \a B. Returns 1 if the length of the string in \a B is less than
2091 ///    the maximum, otherwise, returns 0.
2092 ///
2093 /// \headerfile <x86intrin.h>
2094 ///
2095 /// \code
2096 /// int _mm_cmpistrz(__m128i A, __m128i B, const int M);
2097 /// \endcode
2098 ///
2099 /// This intrinsic corresponds to the <c> <i> VPCMPISTRI / PCMPISTRI </i> </c>
2100 /// instruction.
2101 ///
2102 /// \param A
2103 ///    A 128-bit integer vector containing one of the source operands to be
2104 ///    compared.
2105 /// \param B
2106 ///    A 128-bit integer vector containing one of the source operands to be
2107 ///    compared.
2108 /// \param M
2109 ///    An 8-bit immediate operand specifying whether the characters are bytes or
2110 ///    words and the type of comparison to perform. \n
2111 ///    Bits [1:0]: Determine source data format. \n
2112 ///      00: 16 unsigned bytes \n
2113 ///      01: 8 unsigned words \n
2114 ///      10: 16 signed bytes \n
2115 ///      11: 8 signed words \n
2116 ///    Bits [3:2]: Determine comparison type and aggregation method. \n
2117 ///      00: Subset: Each character in \a B is compared for equality with all
2118 ///          the characters in \a A. \n
2119 ///      01: Ranges: Each character in \a B is compared to \a A. The comparison
2120 ///          basis is greater than or equal for even-indexed elements in \a A,
2121 ///          and less than or equal for odd-indexed elements in \a A. \n
2122 ///      10: Match: Compare each pair of corresponding characters in \a A and
2123 ///          \a B for equality. \n
2124 ///      11: Substring: Search \a B for substring matches of \a A. \n
2125 ///    Bits [5:4]: Determine whether to perform a one's complement on the bit
2126 ///                mask of the comparison results. \n
2127 ///      00: No effect. \n
2128 ///      01: Negate the bit mask. \n
2129 ///      10: No effect. \n
2130 ///      11: Negate the bit mask only for bits with an index less than or equal
2131 ///          to the size of \a A or \a B.
2132 /// \returns Returns 1 if the length of the string in \a B is less than the
2133 ///    maximum, otherwise, returns 0.
2134 #define _mm_cmpistrz(A, B, M) \
2135   (int)__builtin_ia32_pcmpistriz128((__v16qi)(__m128i)(A), \
2136                                     (__v16qi)(__m128i)(B), (int)(M))
2137
2138 /// \brief Uses the immediate operand \a M to perform a comparison of string
2139 ///    data with explicitly defined lengths that is contained in source operands
2140 ///    \a A and \a B. Returns 1 if the bit mask is zero and the length of the
2141 ///    string in \a B is the maximum, otherwise, returns 0.
2142 ///
2143 /// \headerfile <x86intrin.h>
2144 ///
2145 /// \code
2146 /// int _mm_cmpestra(__m128i A, int LA, __m128i B, int LB, const int M);
2147 /// \endcode
2148 ///
2149 /// This intrinsic corresponds to the <c> <i> VPCMPESTRI / PCMPESTRI </i> </c>
2150 /// instruction.
2151 ///
2152 /// \param A
2153 ///    A 128-bit integer vector containing one of the source operands to be
2154 ///    compared.
2155 /// \param LA
2156 ///    An integer that specifies the length of the string in \a A.
2157 /// \param B
2158 ///    A 128-bit integer vector containing one of the source operands to be
2159 ///    compared.
2160 /// \param LB
2161 ///    An integer that specifies the length of the string in \a B.
2162 /// \param M
2163 ///    An 8-bit immediate operand specifying whether the characters are bytes or
2164 ///    words and the type of comparison to perform. \n
2165 ///    Bits [1:0]: Determine source data format. \n
2166 ///      00: 16 unsigned bytes \n
2167 ///      01: 8 unsigned words \n
2168 ///      10: 16 signed bytes \n
2169 ///      11: 8 signed words \n
2170 ///    Bits [3:2]: Determine comparison type and aggregation method. \n
2171 ///      00: Subset: Each character in \a B is compared for equality with all
2172 ///          the characters in \a A. \n
2173 ///      01: Ranges: Each character in \a B is compared to \a A. The comparison
2174 ///          basis is greater than or equal for even-indexed elements in \a A,
2175 ///          and less than or equal for odd-indexed elements in \a A. \n
2176 ///      10: Match: Compare each pair of corresponding characters in \a A and
2177 ///          \a B for equality. \n
2178 ///      11: Substring: Search \a B for substring matches of \a A. \n
2179 ///    Bits [5:4]: Determine whether to perform a one's complement on the bit
2180 ///                mask of the comparison results. \n
2181 ///      00: No effect. \n
2182 ///      01: Negate the bit mask. \n
2183 ///      10: No effect. \n
2184 ///      11: Negate the bit mask only for bits with an index less than or equal
2185 ///          to the size of \a A or \a B.
2186 /// \returns Returns 1 if the bit mask is zero and the length of the string in
2187 ///    \a B is the maximum, otherwise, returns 0.
2188 #define _mm_cmpestra(A, LA, B, LB, M) \
2189   (int)__builtin_ia32_pcmpestria128((__v16qi)(__m128i)(A), (int)(LA), \
2190                                     (__v16qi)(__m128i)(B), (int)(LB), \
2191                                     (int)(M))
2192
2193 /// \brief Uses the immediate operand \a M to perform a comparison of string
2194 ///    data with explicitly defined lengths that is contained in source operands
2195 ///    \a A and \a B. Returns 1 if the resulting mask is non-zero, otherwise,
2196 ///    returns 0.
2197 ///
2198 /// \headerfile <x86intrin.h>
2199 ///
2200 /// \code
2201 /// int _mm_cmpestrc(__m128i A, int LA, __m128i B, int LB, const int M);
2202 /// \endcode
2203 ///
2204 /// This intrinsic corresponds to the <c> <i> VPCMPESTRI / PCMPESTRI </i> </c>
2205 /// instruction.
2206 ///
2207 /// \param A
2208 ///    A 128-bit integer vector containing one of the source operands to be
2209 ///    compared.
2210 /// \param LA
2211 ///    An integer that specifies the length of the string in \a A.
2212 /// \param B
2213 ///    A 128-bit integer vector containing one of the source operands to be
2214 ///    compared.
2215 /// \param LB
2216 ///    An integer that specifies the length of the string in \a B.
2217 /// \param M
2218 ///    An 8-bit immediate operand specifying whether the characters are bytes or
2219 ///    words and the type of comparison to perform. \n
2220 ///    Bits [1:0]: Determine source data format. \n
2221 ///      00: 16 unsigned bytes \n
2222 ///      01: 8 unsigned words \n
2223 ///      10: 16 signed bytes \n
2224 ///      11: 8 signed words \n
2225 ///    Bits [3:2]: Determine comparison type and aggregation method. \n
2226 ///      00: Subset: Each character in \a B is compared for equality with all
2227 ///          the characters in \a A. \n
2228 ///      01: Ranges: Each character in \a B is compared to \a A. The comparison
2229 ///          basis is greater than or equal for even-indexed elements in \a A,
2230 ///          and less than or equal for odd-indexed elements in \a A. \n
2231 ///      10: Match: Compare each pair of corresponding characters in \a A and
2232 ///          \a B for equality. \n
2233 ///      11: Substring: Search \a B for substring matches of \a A. \n
2234 ///    Bits [5:4]: Determine whether to perform a one's complement on the bit
2235 ///                mask of the comparison results. \n
2236 ///      00: No effect. \n
2237 ///      01: Negate the bit mask. \n
2238 ///      10: No effect. \n
2239 ///      11: Negate the bit mask only for bits with an index less than or equal
2240 ///          to the size of \a A or \a B. \n
2241 /// \returns Returns 1 if the resulting mask is non-zero, otherwise, returns 0.
2242 #define _mm_cmpestrc(A, LA, B, LB, M) \
2243   (int)__builtin_ia32_pcmpestric128((__v16qi)(__m128i)(A), (int)(LA), \
2244                                     (__v16qi)(__m128i)(B), (int)(LB), \
2245                                     (int)(M))
2246 /// \brief Uses the immediate operand \a M to perform a comparison of string
2247 ///    data with explicitly defined lengths that is contained in source operands
2248 ///    \a A and \a B. Returns bit 0 of the resulting bit mask.
2249 ///
2250 /// \headerfile <x86intrin.h>
2251 ///
2252 /// \code
2253 /// int _mm_cmpestro(__m128i A, int LA, __m128i B, int LB, const int M);
2254 /// \endcode
2255 ///
2256 /// This intrinsic corresponds to the <c> <i> VPCMPESTRI / PCMPESTRI </i> </c>
2257 /// instruction.
2258 ///
2259 /// \param A
2260 ///    A 128-bit integer vector containing one of the source operands to be
2261 ///    compared.
2262 /// \param LA
2263 ///    An integer that specifies the length of the string in \a A.
2264 /// \param B
2265 ///    A 128-bit integer vector containing one of the source operands to be
2266 ///    compared.
2267 /// \param LB
2268 ///    An integer that specifies the length of the string in \a B.
2269 /// \param M
2270 ///    An 8-bit immediate operand specifying whether the characters are bytes or
2271 ///    words and the type of comparison to perform. \n
2272 ///    Bits [1:0]: Determine source data format. \n
2273 ///      00: 16 unsigned bytes \n
2274 ///      01: 8 unsigned words \n
2275 ///      10: 16 signed bytes \n
2276 ///      11: 8 signed words \n
2277 ///    Bits [3:2]: Determine comparison type and aggregation method. \n
2278 ///      00: Subset: Each character in \a B is compared for equality with all
2279 ///          the characters in \a A. \n
2280 ///      01: Ranges: Each character in \a B is compared to \a A. The comparison
2281 ///          basis is greater than or equal for even-indexed elements in \a A,
2282 ///          and less than or equal for odd-indexed elements in \a A. \n
2283 ///      10: Match: Compare each pair of corresponding characters in \a A and
2284 ///          \a B for equality. \n
2285 ///      11: Substring: Search \a B for substring matches of \a A. \n
2286 ///    Bits [5:4]: Determine whether to perform a one's complement on the bit
2287 ///                mask of the comparison results. \n
2288 ///      00: No effect. \n
2289 ///      01: Negate the bit mask. \n
2290 ///      10: No effect. \n
2291 ///      11: Negate the bit mask only for bits with an index less than or equal
2292 ///          to the size of \a A or \a B.
2293 /// \returns Returns bit 0 of the resulting bit mask.
2294 #define _mm_cmpestro(A, LA, B, LB, M) \
2295   (int)__builtin_ia32_pcmpestrio128((__v16qi)(__m128i)(A), (int)(LA), \
2296                                     (__v16qi)(__m128i)(B), (int)(LB), \
2297                                     (int)(M))
2298
2299 /// \brief Uses the immediate operand \a M to perform a comparison of string
2300 ///    data with explicitly defined lengths that is contained in source operands
2301 ///    \a A and \a B. Returns 1 if the length of the string in \a A is less than
2302 ///    the maximum, otherwise, returns 0.
2303 ///
2304 /// \headerfile <x86intrin.h>
2305 ///
2306 /// \code
2307 /// int _mm_cmpestrs(__m128i A, int LA, __m128i B, int LB, const int M);
2308 /// \endcode
2309 ///
2310 /// This intrinsic corresponds to the <c> <i> VPCMPESTRI / PCMPESTRI </i> </c>
2311 /// instruction.
2312 ///
2313 /// \param A
2314 ///    A 128-bit integer vector containing one of the source operands to be
2315 ///    compared.
2316 /// \param LA
2317 ///    An integer that specifies the length of the string in \a A.
2318 /// \param B
2319 ///    A 128-bit integer vector containing one of the source operands to be
2320 ///    compared.
2321 /// \param LB
2322 ///    An integer that specifies the length of the string in \a B.
2323 /// \param M
2324 ///    An 8-bit immediate operand specifying whether the characters are bytes or
2325 ///    words and the type of comparison to perform. \n
2326 ///    Bits [1:0]: Determine source data format. \n
2327 ///      00: 16 unsigned bytes \n
2328 ///      01: 8 unsigned words \n
2329 ///      10: 16 signed bytes \n
2330 ///      11: 8 signed words \n
2331 ///    Bits [3:2]: Determine comparison type and aggregation method. \n
2332 ///      00: Subset: Each character in \a B is compared for equality with all
2333 ///          the characters in \a A. \n
2334 ///      01: Ranges: Each character in \a B is compared to \a A. The comparison
2335 ///          basis is greater than or equal for even-indexed elements in \a A,
2336 ///          and less than or equal for odd-indexed elements in \a A. \n
2337 ///      10: Match: Compare each pair of corresponding characters in \a A and
2338 ///          \a B for equality. \n
2339 ///      11: Substring: Search \a B for substring matches of \a A. \n
2340 ///    Bits [5:4]: Determine whether to perform a one's complement in the bit
2341 ///                mask of the comparison results. \n
2342 ///      00: No effect. \n
2343 ///      01: Negate the bit mask. \n
2344 ///      10: No effect. \n
2345 ///      11: Negate the bit mask only for bits with an index less than or equal
2346 ///          to the size of \a A or \a B. \n
2347 /// \returns Returns 1 if the length of the string in \a A is less than the
2348 ///    maximum, otherwise, returns 0.
2349 #define _mm_cmpestrs(A, LA, B, LB, M) \
2350   (int)__builtin_ia32_pcmpestris128((__v16qi)(__m128i)(A), (int)(LA), \
2351                                     (__v16qi)(__m128i)(B), (int)(LB), \
2352                                     (int)(M))
2353
2354 /// \brief Uses the immediate operand \a M to perform a comparison of string
2355 ///    data with explicitly defined lengths that is contained in source operands
2356 ///    \a A and \a B. Returns 1 if the length of the string in \a B is less than
2357 ///    the maximum, otherwise, returns 0.
2358 ///
2359 /// \headerfile <x86intrin.h>
2360 ///
2361 /// \code
2362 /// int _mm_cmpestrz(__m128i A, int LA, __m128i B, int LB, const int M);
2363 /// \endcode
2364 ///
2365 /// This intrinsic corresponds to the <c> <i> VPCMPESTRI </i> </c> instruction.
2366 ///
2367 /// \param A
2368 ///    A 128-bit integer vector containing one of the source operands to be
2369 ///    compared.
2370 /// \param LA
2371 ///    An integer that specifies the length of the string in \a A.
2372 /// \param B
2373 ///    A 128-bit integer vector containing one of the source operands to be
2374 ///    compared.
2375 /// \param LB
2376 ///    An integer that specifies the length of the string in \a B.
2377 /// \param M
2378 ///    An 8-bit immediate operand specifying whether the characters are bytes or
2379 ///    words and the type of comparison to perform. \n
2380 ///    Bits [1:0]: Determine source data format. \n
2381 ///      00: 16 unsigned bytes  \n
2382 ///      01: 8 unsigned words \n
2383 ///      10: 16 signed bytes \n
2384 ///      11: 8 signed words \n
2385 ///    Bits [3:2]: Determine comparison type and aggregation method. \n
2386 ///      00: Subset: Each character in \a B is compared for equality with all
2387 ///          the characters in \a A. \n
2388 ///      01: Ranges: Each character in \a B is compared to \a A. The comparison
2389 ///          basis is greater than or equal for even-indexed elements in \a A,
2390 ///          and less than or equal for odd-indexed elements in \a A. \n
2391 ///      10: Match: Compare each pair of corresponding characters in \a A and
2392 ///          \a B for equality. \n
2393 ///      11: Substring: Search \a B for substring matches of \a A. \n
2394 ///    Bits [5:4]: Determine whether to perform a one's complement on the bit
2395 ///                mask of the comparison results. \n
2396 ///      00: No effect. \n
2397 ///      01: Negate the bit mask. \n
2398 ///      10: No effect. \n
2399 ///      11: Negate the bit mask only for bits with an index less than or equal
2400 ///          to the size of \a A or \a B.
2401 /// \returns Returns 1 if the length of the string in \a B is less than the
2402 ///    maximum, otherwise, returns 0.
2403 #define _mm_cmpestrz(A, LA, B, LB, M) \
2404   (int)__builtin_ia32_pcmpestriz128((__v16qi)(__m128i)(A), (int)(LA), \
2405                                     (__v16qi)(__m128i)(B), (int)(LB), \
2406                                     (int)(M))
2407
2408 /* SSE4.2 Compare Packed Data -- Greater Than.  */
2409 /// \brief Compares each of the corresponding 64-bit values of the 128-bit
2410 ///    integer vectors to determine if the values in the first operand are
2411 ///    greater than those in the second operand.
2412 ///
2413 /// \headerfile <x86intrin.h>
2414 ///
2415 /// This intrinsic corresponds to the <c> <i> VPCMPGTQ / PCMPGTQ </i> </c>
2416 /// instruction.
2417 ///
2418 /// \param __V1
2419 ///    A 128-bit integer vector.
2420 /// \param __V2
2421 ///    A 128-bit integer vector.
2422 /// \returns A 128-bit integer vector containing the comparison results.
2423 static __inline__ __m128i __DEFAULT_FN_ATTRS
2424 _mm_cmpgt_epi64(__m128i __V1, __m128i __V2)
2425 {
2426   return (__m128i)((__v2di)__V1 > (__v2di)__V2);
2427 }
2428
2429 /* SSE4.2 Accumulate CRC32.  */
2430 /// \brief Adds the unsigned integer operand to the CRC-32C checksum of the
2431 ///    unsigned char operand.
2432 ///
2433 /// \headerfile <x86intrin.h>
2434 ///
2435 /// This intrinsic corresponds to the <c> <i> CRC32B </i> </c> instruction.
2436 ///
2437 /// \param __C
2438 ///    An unsigned integer operand to add to the CRC-32C checksum of operand
2439 ///    \a  __D.
2440 /// \param __D
2441 ///    An unsigned 8-bit integer operand used to compute the CRC-32C checksum.
2442 /// \returns The result of adding operand \a __C to the CRC-32C checksum of
2443 ///    operand \a __D.
2444 static __inline__ unsigned int __DEFAULT_FN_ATTRS
2445 _mm_crc32_u8(unsigned int __C, unsigned char __D)
2446 {
2447   return __builtin_ia32_crc32qi(__C, __D);
2448 }
2449
2450 /// \brief Adds the unsigned integer operand to the CRC-32C checksum of the
2451 ///    unsigned short operand.
2452 ///
2453 /// \headerfile <x86intrin.h>
2454 ///
2455 /// This intrinsic corresponds to the <c> <i> CRC32W </i> </c> instruction.
2456 ///
2457 /// \param __C
2458 ///    An unsigned integer operand to add to the CRC-32C checksum of operand
2459 ///    \a __D.
2460 /// \param __D
2461 ///    An unsigned 16-bit integer operand used to compute the CRC-32C checksum.
2462 /// \returns The result of adding operand \a __C to the CRC-32C checksum of
2463 ///    operand \a __D.
2464 static __inline__ unsigned int __DEFAULT_FN_ATTRS
2465 _mm_crc32_u16(unsigned int __C, unsigned short __D)
2466 {
2467   return __builtin_ia32_crc32hi(__C, __D);
2468 }
2469
2470 /// \brief Adds the first unsigned integer operand to the CRC-32C checksum of
2471 ///    the second unsigned integer operand.
2472 ///
2473 /// \headerfile <x86intrin.h>
2474 ///
2475 /// This intrinsic corresponds to the <c> <i> CRC32L </i> </c> instruction.
2476 ///
2477 /// \param __C
2478 ///    An unsigned integer operand to add to the CRC-32C checksum of operand
2479 ///    \a __D.
2480 /// \param __D
2481 ///    An unsigned 32-bit integer operand used to compute the CRC-32C checksum.
2482 /// \returns The result of adding operand \a __C to the CRC-32C checksum of
2483 ///    operand \a __D.
2484 static __inline__ unsigned int __DEFAULT_FN_ATTRS
2485 _mm_crc32_u32(unsigned int __C, unsigned int __D)
2486 {
2487   return __builtin_ia32_crc32si(__C, __D);
2488 }
2489
2490 #ifdef __x86_64__
2491 /// \brief Adds the unsigned integer operand to the CRC-32C checksum of the
2492 ///    unsigned 64-bit integer operand.
2493 ///
2494 /// \headerfile <x86intrin.h>
2495 ///
2496 /// This intrinsic corresponds to the <c> <i> CRC32Q </i> </c> instruction.
2497 ///
2498 /// \param __C
2499 ///    An unsigned integer operand to add to the CRC-32C checksum of operand
2500 ///    \a __D.
2501 /// \param __D
2502 ///    An unsigned 64-bit integer operand used to compute the CRC-32C checksum.
2503 /// \returns The result of adding operand \a __C to the CRC-32C checksum of
2504 ///    operand \a __D.
2505 static __inline__ unsigned long long __DEFAULT_FN_ATTRS
2506 _mm_crc32_u64(unsigned long long __C, unsigned long long __D)
2507 {
2508   return __builtin_ia32_crc32di(__C, __D);
2509 }
2510 #endif /* __x86_64__ */
2511
2512 #undef __DEFAULT_FN_ATTRS
2513
2514 #ifdef __POPCNT__
2515 #include <popcntintrin.h>
2516 #endif
2517
2518 #endif /* _SMMINTRIN_H */