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