10b57cec5SDimitry Andric /*===---- xopintrin.h - XOP intrinsics -------------------------------------===
20b57cec5SDimitry Andric  *
30b57cec5SDimitry Andric  * Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
40b57cec5SDimitry Andric  * See https://llvm.org/LICENSE.txt for license information.
50b57cec5SDimitry Andric  * SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
60b57cec5SDimitry Andric  *
70b57cec5SDimitry Andric  *===-----------------------------------------------------------------------===
80b57cec5SDimitry Andric  */
90b57cec5SDimitry Andric 
100b57cec5SDimitry Andric #ifndef __X86INTRIN_H
110b57cec5SDimitry Andric #error "Never use <xopintrin.h> directly; include <x86intrin.h> instead."
120b57cec5SDimitry Andric #endif
130b57cec5SDimitry Andric 
140b57cec5SDimitry Andric #ifndef __XOPINTRIN_H
150b57cec5SDimitry Andric #define __XOPINTRIN_H
160b57cec5SDimitry Andric 
170b57cec5SDimitry Andric #include <fma4intrin.h>
180b57cec5SDimitry Andric 
190b57cec5SDimitry Andric /* Define the default attributes for the functions in this file. */
200b57cec5SDimitry Andric #define __DEFAULT_FN_ATTRS __attribute__((__always_inline__, __nodebug__, __target__("xop"), __min_vector_width__(128)))
210b57cec5SDimitry Andric #define __DEFAULT_FN_ATTRS256 __attribute__((__always_inline__, __nodebug__, __target__("xop"), __min_vector_width__(256)))
220b57cec5SDimitry Andric 
230b57cec5SDimitry Andric static __inline__ __m128i __DEFAULT_FN_ATTRS
_mm_maccs_epi16(__m128i __A,__m128i __B,__m128i __C)240b57cec5SDimitry Andric _mm_maccs_epi16(__m128i __A, __m128i __B, __m128i __C)
250b57cec5SDimitry Andric {
260b57cec5SDimitry Andric   return (__m128i)__builtin_ia32_vpmacssww((__v8hi)__A, (__v8hi)__B, (__v8hi)__C);
270b57cec5SDimitry Andric }
280b57cec5SDimitry Andric 
290b57cec5SDimitry Andric static __inline__ __m128i __DEFAULT_FN_ATTRS
_mm_macc_epi16(__m128i __A,__m128i __B,__m128i __C)300b57cec5SDimitry Andric _mm_macc_epi16(__m128i __A, __m128i __B, __m128i __C)
310b57cec5SDimitry Andric {
320b57cec5SDimitry Andric   return (__m128i)__builtin_ia32_vpmacsww((__v8hi)__A, (__v8hi)__B, (__v8hi)__C);
330b57cec5SDimitry Andric }
340b57cec5SDimitry Andric 
350b57cec5SDimitry Andric static __inline__ __m128i __DEFAULT_FN_ATTRS
_mm_maccsd_epi16(__m128i __A,__m128i __B,__m128i __C)360b57cec5SDimitry Andric _mm_maccsd_epi16(__m128i __A, __m128i __B, __m128i __C)
370b57cec5SDimitry Andric {
380b57cec5SDimitry Andric   return (__m128i)__builtin_ia32_vpmacsswd((__v8hi)__A, (__v8hi)__B, (__v4si)__C);
390b57cec5SDimitry Andric }
400b57cec5SDimitry Andric 
410b57cec5SDimitry Andric static __inline__ __m128i __DEFAULT_FN_ATTRS
_mm_maccd_epi16(__m128i __A,__m128i __B,__m128i __C)420b57cec5SDimitry Andric _mm_maccd_epi16(__m128i __A, __m128i __B, __m128i __C)
430b57cec5SDimitry Andric {
440b57cec5SDimitry Andric   return (__m128i)__builtin_ia32_vpmacswd((__v8hi)__A, (__v8hi)__B, (__v4si)__C);
450b57cec5SDimitry Andric }
460b57cec5SDimitry Andric 
470b57cec5SDimitry Andric static __inline__ __m128i __DEFAULT_FN_ATTRS
_mm_maccs_epi32(__m128i __A,__m128i __B,__m128i __C)480b57cec5SDimitry Andric _mm_maccs_epi32(__m128i __A, __m128i __B, __m128i __C)
490b57cec5SDimitry Andric {
500b57cec5SDimitry Andric   return (__m128i)__builtin_ia32_vpmacssdd((__v4si)__A, (__v4si)__B, (__v4si)__C);
510b57cec5SDimitry Andric }
520b57cec5SDimitry Andric 
530b57cec5SDimitry Andric static __inline__ __m128i __DEFAULT_FN_ATTRS
_mm_macc_epi32(__m128i __A,__m128i __B,__m128i __C)540b57cec5SDimitry Andric _mm_macc_epi32(__m128i __A, __m128i __B, __m128i __C)
550b57cec5SDimitry Andric {
560b57cec5SDimitry Andric   return (__m128i)__builtin_ia32_vpmacsdd((__v4si)__A, (__v4si)__B, (__v4si)__C);
570b57cec5SDimitry Andric }
580b57cec5SDimitry Andric 
590b57cec5SDimitry Andric static __inline__ __m128i __DEFAULT_FN_ATTRS
_mm_maccslo_epi32(__m128i __A,__m128i __B,__m128i __C)600b57cec5SDimitry Andric _mm_maccslo_epi32(__m128i __A, __m128i __B, __m128i __C)
610b57cec5SDimitry Andric {
620b57cec5SDimitry Andric   return (__m128i)__builtin_ia32_vpmacssdql((__v4si)__A, (__v4si)__B, (__v2di)__C);
630b57cec5SDimitry Andric }
640b57cec5SDimitry Andric 
650b57cec5SDimitry Andric static __inline__ __m128i __DEFAULT_FN_ATTRS
_mm_macclo_epi32(__m128i __A,__m128i __B,__m128i __C)660b57cec5SDimitry Andric _mm_macclo_epi32(__m128i __A, __m128i __B, __m128i __C)
670b57cec5SDimitry Andric {
680b57cec5SDimitry Andric   return (__m128i)__builtin_ia32_vpmacsdql((__v4si)__A, (__v4si)__B, (__v2di)__C);
690b57cec5SDimitry Andric }
700b57cec5SDimitry Andric 
710b57cec5SDimitry Andric static __inline__ __m128i __DEFAULT_FN_ATTRS
_mm_maccshi_epi32(__m128i __A,__m128i __B,__m128i __C)720b57cec5SDimitry Andric _mm_maccshi_epi32(__m128i __A, __m128i __B, __m128i __C)
730b57cec5SDimitry Andric {
740b57cec5SDimitry Andric   return (__m128i)__builtin_ia32_vpmacssdqh((__v4si)__A, (__v4si)__B, (__v2di)__C);
750b57cec5SDimitry Andric }
760b57cec5SDimitry Andric 
770b57cec5SDimitry Andric static __inline__ __m128i __DEFAULT_FN_ATTRS
_mm_macchi_epi32(__m128i __A,__m128i __B,__m128i __C)780b57cec5SDimitry Andric _mm_macchi_epi32(__m128i __A, __m128i __B, __m128i __C)
790b57cec5SDimitry Andric {
800b57cec5SDimitry Andric   return (__m128i)__builtin_ia32_vpmacsdqh((__v4si)__A, (__v4si)__B, (__v2di)__C);
810b57cec5SDimitry Andric }
820b57cec5SDimitry Andric 
830b57cec5SDimitry Andric static __inline__ __m128i __DEFAULT_FN_ATTRS
_mm_maddsd_epi16(__m128i __A,__m128i __B,__m128i __C)840b57cec5SDimitry Andric _mm_maddsd_epi16(__m128i __A, __m128i __B, __m128i __C)
850b57cec5SDimitry Andric {
860b57cec5SDimitry Andric   return (__m128i)__builtin_ia32_vpmadcsswd((__v8hi)__A, (__v8hi)__B, (__v4si)__C);
870b57cec5SDimitry Andric }
880b57cec5SDimitry Andric 
890b57cec5SDimitry Andric static __inline__ __m128i __DEFAULT_FN_ATTRS
_mm_maddd_epi16(__m128i __A,__m128i __B,__m128i __C)900b57cec5SDimitry Andric _mm_maddd_epi16(__m128i __A, __m128i __B, __m128i __C)
910b57cec5SDimitry Andric {
920b57cec5SDimitry Andric   return (__m128i)__builtin_ia32_vpmadcswd((__v8hi)__A, (__v8hi)__B, (__v4si)__C);
930b57cec5SDimitry Andric }
940b57cec5SDimitry Andric 
950b57cec5SDimitry Andric static __inline__ __m128i __DEFAULT_FN_ATTRS
_mm_haddw_epi8(__m128i __A)960b57cec5SDimitry Andric _mm_haddw_epi8(__m128i __A)
970b57cec5SDimitry Andric {
980b57cec5SDimitry Andric   return (__m128i)__builtin_ia32_vphaddbw((__v16qi)__A);
990b57cec5SDimitry Andric }
1000b57cec5SDimitry Andric 
1010b57cec5SDimitry Andric static __inline__ __m128i __DEFAULT_FN_ATTRS
_mm_haddd_epi8(__m128i __A)1020b57cec5SDimitry Andric _mm_haddd_epi8(__m128i __A)
1030b57cec5SDimitry Andric {
1040b57cec5SDimitry Andric   return (__m128i)__builtin_ia32_vphaddbd((__v16qi)__A);
1050b57cec5SDimitry Andric }
1060b57cec5SDimitry Andric 
1070b57cec5SDimitry Andric static __inline__ __m128i __DEFAULT_FN_ATTRS
_mm_haddq_epi8(__m128i __A)1080b57cec5SDimitry Andric _mm_haddq_epi8(__m128i __A)
1090b57cec5SDimitry Andric {
1100b57cec5SDimitry Andric   return (__m128i)__builtin_ia32_vphaddbq((__v16qi)__A);
1110b57cec5SDimitry Andric }
1120b57cec5SDimitry Andric 
1130b57cec5SDimitry Andric static __inline__ __m128i __DEFAULT_FN_ATTRS
_mm_haddd_epi16(__m128i __A)1140b57cec5SDimitry Andric _mm_haddd_epi16(__m128i __A)
1150b57cec5SDimitry Andric {
1160b57cec5SDimitry Andric   return (__m128i)__builtin_ia32_vphaddwd((__v8hi)__A);
1170b57cec5SDimitry Andric }
1180b57cec5SDimitry Andric 
1190b57cec5SDimitry Andric static __inline__ __m128i __DEFAULT_FN_ATTRS
_mm_haddq_epi16(__m128i __A)1200b57cec5SDimitry Andric _mm_haddq_epi16(__m128i __A)
1210b57cec5SDimitry Andric {
1220b57cec5SDimitry Andric   return (__m128i)__builtin_ia32_vphaddwq((__v8hi)__A);
1230b57cec5SDimitry Andric }
1240b57cec5SDimitry Andric 
1250b57cec5SDimitry Andric static __inline__ __m128i __DEFAULT_FN_ATTRS
_mm_haddq_epi32(__m128i __A)1260b57cec5SDimitry Andric _mm_haddq_epi32(__m128i __A)
1270b57cec5SDimitry Andric {
1280b57cec5SDimitry Andric   return (__m128i)__builtin_ia32_vphadddq((__v4si)__A);
1290b57cec5SDimitry Andric }
1300b57cec5SDimitry Andric 
1310b57cec5SDimitry Andric static __inline__ __m128i __DEFAULT_FN_ATTRS
_mm_haddw_epu8(__m128i __A)1320b57cec5SDimitry Andric _mm_haddw_epu8(__m128i __A)
1330b57cec5SDimitry Andric {
1340b57cec5SDimitry Andric   return (__m128i)__builtin_ia32_vphaddubw((__v16qi)__A);
1350b57cec5SDimitry Andric }
1360b57cec5SDimitry Andric 
1370b57cec5SDimitry Andric static __inline__ __m128i __DEFAULT_FN_ATTRS
_mm_haddd_epu8(__m128i __A)1380b57cec5SDimitry Andric _mm_haddd_epu8(__m128i __A)
1390b57cec5SDimitry Andric {
1400b57cec5SDimitry Andric   return (__m128i)__builtin_ia32_vphaddubd((__v16qi)__A);
1410b57cec5SDimitry Andric }
1420b57cec5SDimitry Andric 
1430b57cec5SDimitry Andric static __inline__ __m128i __DEFAULT_FN_ATTRS
_mm_haddq_epu8(__m128i __A)1440b57cec5SDimitry Andric _mm_haddq_epu8(__m128i __A)
1450b57cec5SDimitry Andric {
1460b57cec5SDimitry Andric   return (__m128i)__builtin_ia32_vphaddubq((__v16qi)__A);
1470b57cec5SDimitry Andric }
1480b57cec5SDimitry Andric 
1490b57cec5SDimitry Andric static __inline__ __m128i __DEFAULT_FN_ATTRS
_mm_haddd_epu16(__m128i __A)1500b57cec5SDimitry Andric _mm_haddd_epu16(__m128i __A)
1510b57cec5SDimitry Andric {
1520b57cec5SDimitry Andric   return (__m128i)__builtin_ia32_vphadduwd((__v8hi)__A);
1530b57cec5SDimitry Andric }
1540b57cec5SDimitry Andric 
1550b57cec5SDimitry Andric static __inline__ __m128i __DEFAULT_FN_ATTRS
_mm_haddq_epu16(__m128i __A)1560b57cec5SDimitry Andric _mm_haddq_epu16(__m128i __A)
1570b57cec5SDimitry Andric {
1580b57cec5SDimitry Andric   return (__m128i)__builtin_ia32_vphadduwq((__v8hi)__A);
1590b57cec5SDimitry Andric }
1600b57cec5SDimitry Andric 
1610b57cec5SDimitry Andric static __inline__ __m128i __DEFAULT_FN_ATTRS
_mm_haddq_epu32(__m128i __A)1620b57cec5SDimitry Andric _mm_haddq_epu32(__m128i __A)
1630b57cec5SDimitry Andric {
1640b57cec5SDimitry Andric   return (__m128i)__builtin_ia32_vphaddudq((__v4si)__A);
1650b57cec5SDimitry Andric }
1660b57cec5SDimitry Andric 
1670b57cec5SDimitry Andric static __inline__ __m128i __DEFAULT_FN_ATTRS
_mm_hsubw_epi8(__m128i __A)1680b57cec5SDimitry Andric _mm_hsubw_epi8(__m128i __A)
1690b57cec5SDimitry Andric {
1700b57cec5SDimitry Andric   return (__m128i)__builtin_ia32_vphsubbw((__v16qi)__A);
1710b57cec5SDimitry Andric }
1720b57cec5SDimitry Andric 
1730b57cec5SDimitry Andric static __inline__ __m128i __DEFAULT_FN_ATTRS
_mm_hsubd_epi16(__m128i __A)1740b57cec5SDimitry Andric _mm_hsubd_epi16(__m128i __A)
1750b57cec5SDimitry Andric {
1760b57cec5SDimitry Andric   return (__m128i)__builtin_ia32_vphsubwd((__v8hi)__A);
1770b57cec5SDimitry Andric }
1780b57cec5SDimitry Andric 
1790b57cec5SDimitry Andric static __inline__ __m128i __DEFAULT_FN_ATTRS
_mm_hsubq_epi32(__m128i __A)1800b57cec5SDimitry Andric _mm_hsubq_epi32(__m128i __A)
1810b57cec5SDimitry Andric {
1820b57cec5SDimitry Andric   return (__m128i)__builtin_ia32_vphsubdq((__v4si)__A);
1830b57cec5SDimitry Andric }
1840b57cec5SDimitry Andric 
1850b57cec5SDimitry Andric static __inline__ __m128i __DEFAULT_FN_ATTRS
_mm_cmov_si128(__m128i __A,__m128i __B,__m128i __C)1860b57cec5SDimitry Andric _mm_cmov_si128(__m128i __A, __m128i __B, __m128i __C)
1870b57cec5SDimitry Andric {
1880b57cec5SDimitry Andric   return (__m128i)(((__v2du)__A & (__v2du)__C) | ((__v2du)__B & ~(__v2du)__C));
1890b57cec5SDimitry Andric }
1900b57cec5SDimitry Andric 
1910b57cec5SDimitry Andric static __inline__ __m256i __DEFAULT_FN_ATTRS256
_mm256_cmov_si256(__m256i __A,__m256i __B,__m256i __C)1920b57cec5SDimitry Andric _mm256_cmov_si256(__m256i __A, __m256i __B, __m256i __C)
1930b57cec5SDimitry Andric {
1940b57cec5SDimitry Andric   return (__m256i)(((__v4du)__A & (__v4du)__C) | ((__v4du)__B & ~(__v4du)__C));
1950b57cec5SDimitry Andric }
1960b57cec5SDimitry Andric 
1970b57cec5SDimitry Andric static __inline__ __m128i __DEFAULT_FN_ATTRS
_mm_perm_epi8(__m128i __A,__m128i __B,__m128i __C)1980b57cec5SDimitry Andric _mm_perm_epi8(__m128i __A, __m128i __B, __m128i __C)
1990b57cec5SDimitry Andric {
2000b57cec5SDimitry Andric   return (__m128i)__builtin_ia32_vpperm((__v16qi)__A, (__v16qi)__B, (__v16qi)__C);
2010b57cec5SDimitry Andric }
2020b57cec5SDimitry Andric 
2030b57cec5SDimitry Andric static __inline__ __m128i __DEFAULT_FN_ATTRS
_mm_rot_epi8(__m128i __A,__m128i __B)2040b57cec5SDimitry Andric _mm_rot_epi8(__m128i __A, __m128i __B)
2050b57cec5SDimitry Andric {
2060b57cec5SDimitry Andric   return (__m128i)__builtin_ia32_vprotb((__v16qi)__A, (__v16qi)__B);
2070b57cec5SDimitry Andric }
2080b57cec5SDimitry Andric 
2090b57cec5SDimitry Andric static __inline__ __m128i __DEFAULT_FN_ATTRS
_mm_rot_epi16(__m128i __A,__m128i __B)2100b57cec5SDimitry Andric _mm_rot_epi16(__m128i __A, __m128i __B)
2110b57cec5SDimitry Andric {
2120b57cec5SDimitry Andric   return (__m128i)__builtin_ia32_vprotw((__v8hi)__A, (__v8hi)__B);
2130b57cec5SDimitry Andric }
2140b57cec5SDimitry Andric 
2150b57cec5SDimitry Andric static __inline__ __m128i __DEFAULT_FN_ATTRS
_mm_rot_epi32(__m128i __A,__m128i __B)2160b57cec5SDimitry Andric _mm_rot_epi32(__m128i __A, __m128i __B)
2170b57cec5SDimitry Andric {
2180b57cec5SDimitry Andric   return (__m128i)__builtin_ia32_vprotd((__v4si)__A, (__v4si)__B);
2190b57cec5SDimitry Andric }
2200b57cec5SDimitry Andric 
2210b57cec5SDimitry Andric static __inline__ __m128i __DEFAULT_FN_ATTRS
_mm_rot_epi64(__m128i __A,__m128i __B)2220b57cec5SDimitry Andric _mm_rot_epi64(__m128i __A, __m128i __B)
2230b57cec5SDimitry Andric {
2240b57cec5SDimitry Andric   return (__m128i)__builtin_ia32_vprotq((__v2di)__A, (__v2di)__B);
2250b57cec5SDimitry Andric }
2260b57cec5SDimitry Andric 
2270b57cec5SDimitry Andric #define _mm_roti_epi8(A, N) \
228349cc55cSDimitry Andric   ((__m128i)__builtin_ia32_vprotbi((__v16qi)(__m128i)(A), (N)))
2290b57cec5SDimitry Andric 
2300b57cec5SDimitry Andric #define _mm_roti_epi16(A, N) \
231349cc55cSDimitry Andric   ((__m128i)__builtin_ia32_vprotwi((__v8hi)(__m128i)(A), (N)))
2320b57cec5SDimitry Andric 
2330b57cec5SDimitry Andric #define _mm_roti_epi32(A, N) \
234349cc55cSDimitry Andric   ((__m128i)__builtin_ia32_vprotdi((__v4si)(__m128i)(A), (N)))
2350b57cec5SDimitry Andric 
2360b57cec5SDimitry Andric #define _mm_roti_epi64(A, N) \
237349cc55cSDimitry Andric   ((__m128i)__builtin_ia32_vprotqi((__v2di)(__m128i)(A), (N)))
2380b57cec5SDimitry Andric 
2390b57cec5SDimitry Andric static __inline__ __m128i __DEFAULT_FN_ATTRS
_mm_shl_epi8(__m128i __A,__m128i __B)2400b57cec5SDimitry Andric _mm_shl_epi8(__m128i __A, __m128i __B)
2410b57cec5SDimitry Andric {
2420b57cec5SDimitry Andric   return (__m128i)__builtin_ia32_vpshlb((__v16qi)__A, (__v16qi)__B);
2430b57cec5SDimitry Andric }
2440b57cec5SDimitry Andric 
2450b57cec5SDimitry Andric static __inline__ __m128i __DEFAULT_FN_ATTRS
_mm_shl_epi16(__m128i __A,__m128i __B)2460b57cec5SDimitry Andric _mm_shl_epi16(__m128i __A, __m128i __B)
2470b57cec5SDimitry Andric {
2480b57cec5SDimitry Andric   return (__m128i)__builtin_ia32_vpshlw((__v8hi)__A, (__v8hi)__B);
2490b57cec5SDimitry Andric }
2500b57cec5SDimitry Andric 
2510b57cec5SDimitry Andric static __inline__ __m128i __DEFAULT_FN_ATTRS
_mm_shl_epi32(__m128i __A,__m128i __B)2520b57cec5SDimitry Andric _mm_shl_epi32(__m128i __A, __m128i __B)
2530b57cec5SDimitry Andric {
2540b57cec5SDimitry Andric   return (__m128i)__builtin_ia32_vpshld((__v4si)__A, (__v4si)__B);
2550b57cec5SDimitry Andric }
2560b57cec5SDimitry Andric 
2570b57cec5SDimitry Andric static __inline__ __m128i __DEFAULT_FN_ATTRS
_mm_shl_epi64(__m128i __A,__m128i __B)2580b57cec5SDimitry Andric _mm_shl_epi64(__m128i __A, __m128i __B)
2590b57cec5SDimitry Andric {
2600b57cec5SDimitry Andric   return (__m128i)__builtin_ia32_vpshlq((__v2di)__A, (__v2di)__B);
2610b57cec5SDimitry Andric }
2620b57cec5SDimitry Andric 
2630b57cec5SDimitry Andric static __inline__ __m128i __DEFAULT_FN_ATTRS
_mm_sha_epi8(__m128i __A,__m128i __B)2640b57cec5SDimitry Andric _mm_sha_epi8(__m128i __A, __m128i __B)
2650b57cec5SDimitry Andric {
2660b57cec5SDimitry Andric   return (__m128i)__builtin_ia32_vpshab((__v16qi)__A, (__v16qi)__B);
2670b57cec5SDimitry Andric }
2680b57cec5SDimitry Andric 
2690b57cec5SDimitry Andric static __inline__ __m128i __DEFAULT_FN_ATTRS
_mm_sha_epi16(__m128i __A,__m128i __B)2700b57cec5SDimitry Andric _mm_sha_epi16(__m128i __A, __m128i __B)
2710b57cec5SDimitry Andric {
2720b57cec5SDimitry Andric   return (__m128i)__builtin_ia32_vpshaw((__v8hi)__A, (__v8hi)__B);
2730b57cec5SDimitry Andric }
2740b57cec5SDimitry Andric 
2750b57cec5SDimitry Andric static __inline__ __m128i __DEFAULT_FN_ATTRS
_mm_sha_epi32(__m128i __A,__m128i __B)2760b57cec5SDimitry Andric _mm_sha_epi32(__m128i __A, __m128i __B)
2770b57cec5SDimitry Andric {
2780b57cec5SDimitry Andric   return (__m128i)__builtin_ia32_vpshad((__v4si)__A, (__v4si)__B);
2790b57cec5SDimitry Andric }
2800b57cec5SDimitry Andric 
2810b57cec5SDimitry Andric static __inline__ __m128i __DEFAULT_FN_ATTRS
_mm_sha_epi64(__m128i __A,__m128i __B)2820b57cec5SDimitry Andric _mm_sha_epi64(__m128i __A, __m128i __B)
2830b57cec5SDimitry Andric {
2840b57cec5SDimitry Andric   return (__m128i)__builtin_ia32_vpshaq((__v2di)__A, (__v2di)__B);
2850b57cec5SDimitry Andric }
2860b57cec5SDimitry Andric 
2870b57cec5SDimitry Andric #define _mm_com_epu8(A, B, N) \
288349cc55cSDimitry Andric   ((__m128i)__builtin_ia32_vpcomub((__v16qi)(__m128i)(A), \
289349cc55cSDimitry Andric                                    (__v16qi)(__m128i)(B), (N)))
2900b57cec5SDimitry Andric 
2910b57cec5SDimitry Andric #define _mm_com_epu16(A, B, N) \
292349cc55cSDimitry Andric   ((__m128i)__builtin_ia32_vpcomuw((__v8hi)(__m128i)(A), \
293349cc55cSDimitry Andric                                    (__v8hi)(__m128i)(B), (N)))
2940b57cec5SDimitry Andric 
2950b57cec5SDimitry Andric #define _mm_com_epu32(A, B, N) \
296349cc55cSDimitry Andric   ((__m128i)__builtin_ia32_vpcomud((__v4si)(__m128i)(A), \
297349cc55cSDimitry Andric                                    (__v4si)(__m128i)(B), (N)))
2980b57cec5SDimitry Andric 
2990b57cec5SDimitry Andric #define _mm_com_epu64(A, B, N) \
300349cc55cSDimitry Andric   ((__m128i)__builtin_ia32_vpcomuq((__v2di)(__m128i)(A), \
301349cc55cSDimitry Andric                                    (__v2di)(__m128i)(B), (N)))
3020b57cec5SDimitry Andric 
3030b57cec5SDimitry Andric #define _mm_com_epi8(A, B, N) \
304349cc55cSDimitry Andric   ((__m128i)__builtin_ia32_vpcomb((__v16qi)(__m128i)(A), \
305349cc55cSDimitry Andric                                   (__v16qi)(__m128i)(B), (N)))
3060b57cec5SDimitry Andric 
3070b57cec5SDimitry Andric #define _mm_com_epi16(A, B, N) \
308349cc55cSDimitry Andric   ((__m128i)__builtin_ia32_vpcomw((__v8hi)(__m128i)(A), \
309349cc55cSDimitry Andric                                   (__v8hi)(__m128i)(B), (N)))
3100b57cec5SDimitry Andric 
3110b57cec5SDimitry Andric #define _mm_com_epi32(A, B, N) \
312349cc55cSDimitry Andric   ((__m128i)__builtin_ia32_vpcomd((__v4si)(__m128i)(A), \
313349cc55cSDimitry Andric                                   (__v4si)(__m128i)(B), (N)))
3140b57cec5SDimitry Andric 
3150b57cec5SDimitry Andric #define _mm_com_epi64(A, B, N) \
316349cc55cSDimitry Andric   ((__m128i)__builtin_ia32_vpcomq((__v2di)(__m128i)(A), \
317349cc55cSDimitry Andric                                   (__v2di)(__m128i)(B), (N)))
3180b57cec5SDimitry Andric 
3190b57cec5SDimitry Andric #define _MM_PCOMCTRL_LT    0
3200b57cec5SDimitry Andric #define _MM_PCOMCTRL_LE    1
3210b57cec5SDimitry Andric #define _MM_PCOMCTRL_GT    2
3220b57cec5SDimitry Andric #define _MM_PCOMCTRL_GE    3
3230b57cec5SDimitry Andric #define _MM_PCOMCTRL_EQ    4
3240b57cec5SDimitry Andric #define _MM_PCOMCTRL_NEQ   5
3250b57cec5SDimitry Andric #define _MM_PCOMCTRL_FALSE 6
3260b57cec5SDimitry Andric #define _MM_PCOMCTRL_TRUE  7
3270b57cec5SDimitry Andric 
3280b57cec5SDimitry Andric static __inline__ __m128i __DEFAULT_FN_ATTRS
_mm_comlt_epu8(__m128i __A,__m128i __B)3290b57cec5SDimitry Andric _mm_comlt_epu8(__m128i __A, __m128i __B)
3300b57cec5SDimitry Andric {
3310b57cec5SDimitry Andric   return _mm_com_epu8(__A, __B, _MM_PCOMCTRL_LT);
3320b57cec5SDimitry Andric }
3330b57cec5SDimitry Andric 
3340b57cec5SDimitry Andric static __inline__ __m128i __DEFAULT_FN_ATTRS
_mm_comle_epu8(__m128i __A,__m128i __B)3350b57cec5SDimitry Andric _mm_comle_epu8(__m128i __A, __m128i __B)
3360b57cec5SDimitry Andric {
3370b57cec5SDimitry Andric   return _mm_com_epu8(__A, __B, _MM_PCOMCTRL_LE);
3380b57cec5SDimitry Andric }
3390b57cec5SDimitry Andric 
3400b57cec5SDimitry Andric static __inline__ __m128i __DEFAULT_FN_ATTRS
_mm_comgt_epu8(__m128i __A,__m128i __B)3410b57cec5SDimitry Andric _mm_comgt_epu8(__m128i __A, __m128i __B)
3420b57cec5SDimitry Andric {
3430b57cec5SDimitry Andric   return _mm_com_epu8(__A, __B, _MM_PCOMCTRL_GT);
3440b57cec5SDimitry Andric }
3450b57cec5SDimitry Andric 
3460b57cec5SDimitry Andric static __inline__ __m128i __DEFAULT_FN_ATTRS
_mm_comge_epu8(__m128i __A,__m128i __B)3470b57cec5SDimitry Andric _mm_comge_epu8(__m128i __A, __m128i __B)
3480b57cec5SDimitry Andric {
3490b57cec5SDimitry Andric   return _mm_com_epu8(__A, __B, _MM_PCOMCTRL_GE);
3500b57cec5SDimitry Andric }
3510b57cec5SDimitry Andric 
3520b57cec5SDimitry Andric static __inline__ __m128i __DEFAULT_FN_ATTRS
_mm_comeq_epu8(__m128i __A,__m128i __B)3530b57cec5SDimitry Andric _mm_comeq_epu8(__m128i __A, __m128i __B)
3540b57cec5SDimitry Andric {
3550b57cec5SDimitry Andric   return _mm_com_epu8(__A, __B, _MM_PCOMCTRL_EQ);
3560b57cec5SDimitry Andric }
3570b57cec5SDimitry Andric 
3580b57cec5SDimitry Andric static __inline__ __m128i __DEFAULT_FN_ATTRS
_mm_comneq_epu8(__m128i __A,__m128i __B)3590b57cec5SDimitry Andric _mm_comneq_epu8(__m128i __A, __m128i __B)
3600b57cec5SDimitry Andric {
3610b57cec5SDimitry Andric   return _mm_com_epu8(__A, __B, _MM_PCOMCTRL_NEQ);
3620b57cec5SDimitry Andric }
3630b57cec5SDimitry Andric 
3640b57cec5SDimitry Andric static __inline__ __m128i __DEFAULT_FN_ATTRS
_mm_comfalse_epu8(__m128i __A,__m128i __B)3650b57cec5SDimitry Andric _mm_comfalse_epu8(__m128i __A, __m128i __B)
3660b57cec5SDimitry Andric {
3670b57cec5SDimitry Andric   return _mm_com_epu8(__A, __B, _MM_PCOMCTRL_FALSE);
3680b57cec5SDimitry Andric }
3690b57cec5SDimitry Andric 
3700b57cec5SDimitry Andric static __inline__ __m128i __DEFAULT_FN_ATTRS
_mm_comtrue_epu8(__m128i __A,__m128i __B)3710b57cec5SDimitry Andric _mm_comtrue_epu8(__m128i __A, __m128i __B)
3720b57cec5SDimitry Andric {
3730b57cec5SDimitry Andric   return _mm_com_epu8(__A, __B, _MM_PCOMCTRL_TRUE);
3740b57cec5SDimitry Andric }
3750b57cec5SDimitry Andric 
3760b57cec5SDimitry Andric static __inline__ __m128i __DEFAULT_FN_ATTRS
_mm_comlt_epu16(__m128i __A,__m128i __B)3770b57cec5SDimitry Andric _mm_comlt_epu16(__m128i __A, __m128i __B)
3780b57cec5SDimitry Andric {
3790b57cec5SDimitry Andric   return _mm_com_epu16(__A, __B, _MM_PCOMCTRL_LT);
3800b57cec5SDimitry Andric }
3810b57cec5SDimitry Andric 
3820b57cec5SDimitry Andric static __inline__ __m128i __DEFAULT_FN_ATTRS
_mm_comle_epu16(__m128i __A,__m128i __B)3830b57cec5SDimitry Andric _mm_comle_epu16(__m128i __A, __m128i __B)
3840b57cec5SDimitry Andric {
3850b57cec5SDimitry Andric   return _mm_com_epu16(__A, __B, _MM_PCOMCTRL_LE);
3860b57cec5SDimitry Andric }
3870b57cec5SDimitry Andric 
3880b57cec5SDimitry Andric static __inline__ __m128i __DEFAULT_FN_ATTRS
_mm_comgt_epu16(__m128i __A,__m128i __B)3890b57cec5SDimitry Andric _mm_comgt_epu16(__m128i __A, __m128i __B)
3900b57cec5SDimitry Andric {
3910b57cec5SDimitry Andric   return _mm_com_epu16(__A, __B, _MM_PCOMCTRL_GT);
3920b57cec5SDimitry Andric }
3930b57cec5SDimitry Andric 
3940b57cec5SDimitry Andric static __inline__ __m128i __DEFAULT_FN_ATTRS
_mm_comge_epu16(__m128i __A,__m128i __B)3950b57cec5SDimitry Andric _mm_comge_epu16(__m128i __A, __m128i __B)
3960b57cec5SDimitry Andric {
3970b57cec5SDimitry Andric   return _mm_com_epu16(__A, __B, _MM_PCOMCTRL_GE);
3980b57cec5SDimitry Andric }
3990b57cec5SDimitry Andric 
4000b57cec5SDimitry Andric static __inline__ __m128i __DEFAULT_FN_ATTRS
_mm_comeq_epu16(__m128i __A,__m128i __B)4010b57cec5SDimitry Andric _mm_comeq_epu16(__m128i __A, __m128i __B)
4020b57cec5SDimitry Andric {
4030b57cec5SDimitry Andric   return _mm_com_epu16(__A, __B, _MM_PCOMCTRL_EQ);
4040b57cec5SDimitry Andric }
4050b57cec5SDimitry Andric 
4060b57cec5SDimitry Andric static __inline__ __m128i __DEFAULT_FN_ATTRS
_mm_comneq_epu16(__m128i __A,__m128i __B)4070b57cec5SDimitry Andric _mm_comneq_epu16(__m128i __A, __m128i __B)
4080b57cec5SDimitry Andric {
4090b57cec5SDimitry Andric   return _mm_com_epu16(__A, __B, _MM_PCOMCTRL_NEQ);
4100b57cec5SDimitry Andric }
4110b57cec5SDimitry Andric 
4120b57cec5SDimitry Andric static __inline__ __m128i __DEFAULT_FN_ATTRS
_mm_comfalse_epu16(__m128i __A,__m128i __B)4130b57cec5SDimitry Andric _mm_comfalse_epu16(__m128i __A, __m128i __B)
4140b57cec5SDimitry Andric {
4150b57cec5SDimitry Andric   return _mm_com_epu16(__A, __B, _MM_PCOMCTRL_FALSE);
4160b57cec5SDimitry Andric }
4170b57cec5SDimitry Andric 
4180b57cec5SDimitry Andric static __inline__ __m128i __DEFAULT_FN_ATTRS
_mm_comtrue_epu16(__m128i __A,__m128i __B)4190b57cec5SDimitry Andric _mm_comtrue_epu16(__m128i __A, __m128i __B)
4200b57cec5SDimitry Andric {
4210b57cec5SDimitry Andric   return _mm_com_epu16(__A, __B, _MM_PCOMCTRL_TRUE);
4220b57cec5SDimitry Andric }
4230b57cec5SDimitry Andric 
4240b57cec5SDimitry Andric static __inline__ __m128i __DEFAULT_FN_ATTRS
_mm_comlt_epu32(__m128i __A,__m128i __B)4250b57cec5SDimitry Andric _mm_comlt_epu32(__m128i __A, __m128i __B)
4260b57cec5SDimitry Andric {
4270b57cec5SDimitry Andric   return _mm_com_epu32(__A, __B, _MM_PCOMCTRL_LT);
4280b57cec5SDimitry Andric }
4290b57cec5SDimitry Andric 
4300b57cec5SDimitry Andric static __inline__ __m128i __DEFAULT_FN_ATTRS
_mm_comle_epu32(__m128i __A,__m128i __B)4310b57cec5SDimitry Andric _mm_comle_epu32(__m128i __A, __m128i __B)
4320b57cec5SDimitry Andric {
4330b57cec5SDimitry Andric   return _mm_com_epu32(__A, __B, _MM_PCOMCTRL_LE);
4340b57cec5SDimitry Andric }
4350b57cec5SDimitry Andric 
4360b57cec5SDimitry Andric static __inline__ __m128i __DEFAULT_FN_ATTRS
_mm_comgt_epu32(__m128i __A,__m128i __B)4370b57cec5SDimitry Andric _mm_comgt_epu32(__m128i __A, __m128i __B)
4380b57cec5SDimitry Andric {
4390b57cec5SDimitry Andric   return _mm_com_epu32(__A, __B, _MM_PCOMCTRL_GT);
4400b57cec5SDimitry Andric }
4410b57cec5SDimitry Andric 
4420b57cec5SDimitry Andric static __inline__ __m128i __DEFAULT_FN_ATTRS
_mm_comge_epu32(__m128i __A,__m128i __B)4430b57cec5SDimitry Andric _mm_comge_epu32(__m128i __A, __m128i __B)
4440b57cec5SDimitry Andric {
4450b57cec5SDimitry Andric   return _mm_com_epu32(__A, __B, _MM_PCOMCTRL_GE);
4460b57cec5SDimitry Andric }
4470b57cec5SDimitry Andric 
4480b57cec5SDimitry Andric static __inline__ __m128i __DEFAULT_FN_ATTRS
_mm_comeq_epu32(__m128i __A,__m128i __B)4490b57cec5SDimitry Andric _mm_comeq_epu32(__m128i __A, __m128i __B)
4500b57cec5SDimitry Andric {
4510b57cec5SDimitry Andric   return _mm_com_epu32(__A, __B, _MM_PCOMCTRL_EQ);
4520b57cec5SDimitry Andric }
4530b57cec5SDimitry Andric 
4540b57cec5SDimitry Andric static __inline__ __m128i __DEFAULT_FN_ATTRS
_mm_comneq_epu32(__m128i __A,__m128i __B)4550b57cec5SDimitry Andric _mm_comneq_epu32(__m128i __A, __m128i __B)
4560b57cec5SDimitry Andric {
4570b57cec5SDimitry Andric   return _mm_com_epu32(__A, __B, _MM_PCOMCTRL_NEQ);
4580b57cec5SDimitry Andric }
4590b57cec5SDimitry Andric 
4600b57cec5SDimitry Andric static __inline__ __m128i __DEFAULT_FN_ATTRS
_mm_comfalse_epu32(__m128i __A,__m128i __B)4610b57cec5SDimitry Andric _mm_comfalse_epu32(__m128i __A, __m128i __B)
4620b57cec5SDimitry Andric {
4630b57cec5SDimitry Andric   return _mm_com_epu32(__A, __B, _MM_PCOMCTRL_FALSE);
4640b57cec5SDimitry Andric }
4650b57cec5SDimitry Andric 
4660b57cec5SDimitry Andric static __inline__ __m128i __DEFAULT_FN_ATTRS
_mm_comtrue_epu32(__m128i __A,__m128i __B)4670b57cec5SDimitry Andric _mm_comtrue_epu32(__m128i __A, __m128i __B)
4680b57cec5SDimitry Andric {
4690b57cec5SDimitry Andric   return _mm_com_epu32(__A, __B, _MM_PCOMCTRL_TRUE);
4700b57cec5SDimitry Andric }
4710b57cec5SDimitry Andric 
4720b57cec5SDimitry Andric static __inline__ __m128i __DEFAULT_FN_ATTRS
_mm_comlt_epu64(__m128i __A,__m128i __B)4730b57cec5SDimitry Andric _mm_comlt_epu64(__m128i __A, __m128i __B)
4740b57cec5SDimitry Andric {
4750b57cec5SDimitry Andric   return _mm_com_epu64(__A, __B, _MM_PCOMCTRL_LT);
4760b57cec5SDimitry Andric }
4770b57cec5SDimitry Andric 
4780b57cec5SDimitry Andric static __inline__ __m128i __DEFAULT_FN_ATTRS
_mm_comle_epu64(__m128i __A,__m128i __B)4790b57cec5SDimitry Andric _mm_comle_epu64(__m128i __A, __m128i __B)
4800b57cec5SDimitry Andric {
4810b57cec5SDimitry Andric   return _mm_com_epu64(__A, __B, _MM_PCOMCTRL_LE);
4820b57cec5SDimitry Andric }
4830b57cec5SDimitry Andric 
4840b57cec5SDimitry Andric static __inline__ __m128i __DEFAULT_FN_ATTRS
_mm_comgt_epu64(__m128i __A,__m128i __B)4850b57cec5SDimitry Andric _mm_comgt_epu64(__m128i __A, __m128i __B)
4860b57cec5SDimitry Andric {
4870b57cec5SDimitry Andric   return _mm_com_epu64(__A, __B, _MM_PCOMCTRL_GT);
4880b57cec5SDimitry Andric }
4890b57cec5SDimitry Andric 
4900b57cec5SDimitry Andric static __inline__ __m128i __DEFAULT_FN_ATTRS
_mm_comge_epu64(__m128i __A,__m128i __B)4910b57cec5SDimitry Andric _mm_comge_epu64(__m128i __A, __m128i __B)
4920b57cec5SDimitry Andric {
4930b57cec5SDimitry Andric   return _mm_com_epu64(__A, __B, _MM_PCOMCTRL_GE);
4940b57cec5SDimitry Andric }
4950b57cec5SDimitry Andric 
4960b57cec5SDimitry Andric static __inline__ __m128i __DEFAULT_FN_ATTRS
_mm_comeq_epu64(__m128i __A,__m128i __B)4970b57cec5SDimitry Andric _mm_comeq_epu64(__m128i __A, __m128i __B)
4980b57cec5SDimitry Andric {
4990b57cec5SDimitry Andric   return _mm_com_epu64(__A, __B, _MM_PCOMCTRL_EQ);
5000b57cec5SDimitry Andric }
5010b57cec5SDimitry Andric 
5020b57cec5SDimitry Andric static __inline__ __m128i __DEFAULT_FN_ATTRS
_mm_comneq_epu64(__m128i __A,__m128i __B)5030b57cec5SDimitry Andric _mm_comneq_epu64(__m128i __A, __m128i __B)
5040b57cec5SDimitry Andric {
5050b57cec5SDimitry Andric   return _mm_com_epu64(__A, __B, _MM_PCOMCTRL_NEQ);
5060b57cec5SDimitry Andric }
5070b57cec5SDimitry Andric 
5080b57cec5SDimitry Andric static __inline__ __m128i __DEFAULT_FN_ATTRS
_mm_comfalse_epu64(__m128i __A,__m128i __B)5090b57cec5SDimitry Andric _mm_comfalse_epu64(__m128i __A, __m128i __B)
5100b57cec5SDimitry Andric {
5110b57cec5SDimitry Andric   return _mm_com_epu64(__A, __B, _MM_PCOMCTRL_FALSE);
5120b57cec5SDimitry Andric }
5130b57cec5SDimitry Andric 
5140b57cec5SDimitry Andric static __inline__ __m128i __DEFAULT_FN_ATTRS
_mm_comtrue_epu64(__m128i __A,__m128i __B)5150b57cec5SDimitry Andric _mm_comtrue_epu64(__m128i __A, __m128i __B)
5160b57cec5SDimitry Andric {
5170b57cec5SDimitry Andric   return _mm_com_epu64(__A, __B, _MM_PCOMCTRL_TRUE);
5180b57cec5SDimitry Andric }
5190b57cec5SDimitry Andric 
5200b57cec5SDimitry Andric static __inline__ __m128i __DEFAULT_FN_ATTRS
_mm_comlt_epi8(__m128i __A,__m128i __B)5210b57cec5SDimitry Andric _mm_comlt_epi8(__m128i __A, __m128i __B)
5220b57cec5SDimitry Andric {
5230b57cec5SDimitry Andric   return _mm_com_epi8(__A, __B, _MM_PCOMCTRL_LT);
5240b57cec5SDimitry Andric }
5250b57cec5SDimitry Andric 
5260b57cec5SDimitry Andric static __inline__ __m128i __DEFAULT_FN_ATTRS
_mm_comle_epi8(__m128i __A,__m128i __B)5270b57cec5SDimitry Andric _mm_comle_epi8(__m128i __A, __m128i __B)
5280b57cec5SDimitry Andric {
5290b57cec5SDimitry Andric   return _mm_com_epi8(__A, __B, _MM_PCOMCTRL_LE);
5300b57cec5SDimitry Andric }
5310b57cec5SDimitry Andric 
5320b57cec5SDimitry Andric static __inline__ __m128i __DEFAULT_FN_ATTRS
_mm_comgt_epi8(__m128i __A,__m128i __B)5330b57cec5SDimitry Andric _mm_comgt_epi8(__m128i __A, __m128i __B)
5340b57cec5SDimitry Andric {
5350b57cec5SDimitry Andric   return _mm_com_epi8(__A, __B, _MM_PCOMCTRL_GT);
5360b57cec5SDimitry Andric }
5370b57cec5SDimitry Andric 
5380b57cec5SDimitry Andric static __inline__ __m128i __DEFAULT_FN_ATTRS
_mm_comge_epi8(__m128i __A,__m128i __B)5390b57cec5SDimitry Andric _mm_comge_epi8(__m128i __A, __m128i __B)
5400b57cec5SDimitry Andric {
5410b57cec5SDimitry Andric   return _mm_com_epi8(__A, __B, _MM_PCOMCTRL_GE);
5420b57cec5SDimitry Andric }
5430b57cec5SDimitry Andric 
5440b57cec5SDimitry Andric static __inline__ __m128i __DEFAULT_FN_ATTRS
_mm_comeq_epi8(__m128i __A,__m128i __B)5450b57cec5SDimitry Andric _mm_comeq_epi8(__m128i __A, __m128i __B)
5460b57cec5SDimitry Andric {
5470b57cec5SDimitry Andric   return _mm_com_epi8(__A, __B, _MM_PCOMCTRL_EQ);
5480b57cec5SDimitry Andric }
5490b57cec5SDimitry Andric 
5500b57cec5SDimitry Andric static __inline__ __m128i __DEFAULT_FN_ATTRS
_mm_comneq_epi8(__m128i __A,__m128i __B)5510b57cec5SDimitry Andric _mm_comneq_epi8(__m128i __A, __m128i __B)
5520b57cec5SDimitry Andric {
5530b57cec5SDimitry Andric   return _mm_com_epi8(__A, __B, _MM_PCOMCTRL_NEQ);
5540b57cec5SDimitry Andric }
5550b57cec5SDimitry Andric 
5560b57cec5SDimitry Andric static __inline__ __m128i __DEFAULT_FN_ATTRS
_mm_comfalse_epi8(__m128i __A,__m128i __B)5570b57cec5SDimitry Andric _mm_comfalse_epi8(__m128i __A, __m128i __B)
5580b57cec5SDimitry Andric {
5590b57cec5SDimitry Andric   return _mm_com_epi8(__A, __B, _MM_PCOMCTRL_FALSE);
5600b57cec5SDimitry Andric }
5610b57cec5SDimitry Andric 
5620b57cec5SDimitry Andric static __inline__ __m128i __DEFAULT_FN_ATTRS
_mm_comtrue_epi8(__m128i __A,__m128i __B)5630b57cec5SDimitry Andric _mm_comtrue_epi8(__m128i __A, __m128i __B)
5640b57cec5SDimitry Andric {
5650b57cec5SDimitry Andric   return _mm_com_epi8(__A, __B, _MM_PCOMCTRL_TRUE);
5660b57cec5SDimitry Andric }
5670b57cec5SDimitry Andric 
5680b57cec5SDimitry Andric static __inline__ __m128i __DEFAULT_FN_ATTRS
_mm_comlt_epi16(__m128i __A,__m128i __B)5690b57cec5SDimitry Andric _mm_comlt_epi16(__m128i __A, __m128i __B)
5700b57cec5SDimitry Andric {
5710b57cec5SDimitry Andric   return _mm_com_epi16(__A, __B, _MM_PCOMCTRL_LT);
5720b57cec5SDimitry Andric }
5730b57cec5SDimitry Andric 
5740b57cec5SDimitry Andric static __inline__ __m128i __DEFAULT_FN_ATTRS
_mm_comle_epi16(__m128i __A,__m128i __B)5750b57cec5SDimitry Andric _mm_comle_epi16(__m128i __A, __m128i __B)
5760b57cec5SDimitry Andric {
5770b57cec5SDimitry Andric   return _mm_com_epi16(__A, __B, _MM_PCOMCTRL_LE);
5780b57cec5SDimitry Andric }
5790b57cec5SDimitry Andric 
5800b57cec5SDimitry Andric static __inline__ __m128i __DEFAULT_FN_ATTRS
_mm_comgt_epi16(__m128i __A,__m128i __B)5810b57cec5SDimitry Andric _mm_comgt_epi16(__m128i __A, __m128i __B)
5820b57cec5SDimitry Andric {
5830b57cec5SDimitry Andric   return _mm_com_epi16(__A, __B, _MM_PCOMCTRL_GT);
5840b57cec5SDimitry Andric }
5850b57cec5SDimitry Andric 
5860b57cec5SDimitry Andric static __inline__ __m128i __DEFAULT_FN_ATTRS
_mm_comge_epi16(__m128i __A,__m128i __B)5870b57cec5SDimitry Andric _mm_comge_epi16(__m128i __A, __m128i __B)
5880b57cec5SDimitry Andric {
5890b57cec5SDimitry Andric   return _mm_com_epi16(__A, __B, _MM_PCOMCTRL_GE);
5900b57cec5SDimitry Andric }
5910b57cec5SDimitry Andric 
5920b57cec5SDimitry Andric static __inline__ __m128i __DEFAULT_FN_ATTRS
_mm_comeq_epi16(__m128i __A,__m128i __B)5930b57cec5SDimitry Andric _mm_comeq_epi16(__m128i __A, __m128i __B)
5940b57cec5SDimitry Andric {
5950b57cec5SDimitry Andric   return _mm_com_epi16(__A, __B, _MM_PCOMCTRL_EQ);
5960b57cec5SDimitry Andric }
5970b57cec5SDimitry Andric 
5980b57cec5SDimitry Andric static __inline__ __m128i __DEFAULT_FN_ATTRS
_mm_comneq_epi16(__m128i __A,__m128i __B)5990b57cec5SDimitry Andric _mm_comneq_epi16(__m128i __A, __m128i __B)
6000b57cec5SDimitry Andric {
6010b57cec5SDimitry Andric   return _mm_com_epi16(__A, __B, _MM_PCOMCTRL_NEQ);
6020b57cec5SDimitry Andric }
6030b57cec5SDimitry Andric 
6040b57cec5SDimitry Andric static __inline__ __m128i __DEFAULT_FN_ATTRS
_mm_comfalse_epi16(__m128i __A,__m128i __B)6050b57cec5SDimitry Andric _mm_comfalse_epi16(__m128i __A, __m128i __B)
6060b57cec5SDimitry Andric {
6070b57cec5SDimitry Andric   return _mm_com_epi16(__A, __B, _MM_PCOMCTRL_FALSE);
6080b57cec5SDimitry Andric }
6090b57cec5SDimitry Andric 
6100b57cec5SDimitry Andric static __inline__ __m128i __DEFAULT_FN_ATTRS
_mm_comtrue_epi16(__m128i __A,__m128i __B)6110b57cec5SDimitry Andric _mm_comtrue_epi16(__m128i __A, __m128i __B)
6120b57cec5SDimitry Andric {
6130b57cec5SDimitry Andric   return _mm_com_epi16(__A, __B, _MM_PCOMCTRL_TRUE);
6140b57cec5SDimitry Andric }
6150b57cec5SDimitry Andric 
6160b57cec5SDimitry Andric static __inline__ __m128i __DEFAULT_FN_ATTRS
_mm_comlt_epi32(__m128i __A,__m128i __B)6170b57cec5SDimitry Andric _mm_comlt_epi32(__m128i __A, __m128i __B)
6180b57cec5SDimitry Andric {
6190b57cec5SDimitry Andric   return _mm_com_epi32(__A, __B, _MM_PCOMCTRL_LT);
6200b57cec5SDimitry Andric }
6210b57cec5SDimitry Andric 
6220b57cec5SDimitry Andric static __inline__ __m128i __DEFAULT_FN_ATTRS
_mm_comle_epi32(__m128i __A,__m128i __B)6230b57cec5SDimitry Andric _mm_comle_epi32(__m128i __A, __m128i __B)
6240b57cec5SDimitry Andric {
6250b57cec5SDimitry Andric   return _mm_com_epi32(__A, __B, _MM_PCOMCTRL_LE);
6260b57cec5SDimitry Andric }
6270b57cec5SDimitry Andric 
6280b57cec5SDimitry Andric static __inline__ __m128i __DEFAULT_FN_ATTRS
_mm_comgt_epi32(__m128i __A,__m128i __B)6290b57cec5SDimitry Andric _mm_comgt_epi32(__m128i __A, __m128i __B)
6300b57cec5SDimitry Andric {
6310b57cec5SDimitry Andric   return _mm_com_epi32(__A, __B, _MM_PCOMCTRL_GT);
6320b57cec5SDimitry Andric }
6330b57cec5SDimitry Andric 
6340b57cec5SDimitry Andric static __inline__ __m128i __DEFAULT_FN_ATTRS
_mm_comge_epi32(__m128i __A,__m128i __B)6350b57cec5SDimitry Andric _mm_comge_epi32(__m128i __A, __m128i __B)
6360b57cec5SDimitry Andric {
6370b57cec5SDimitry Andric   return _mm_com_epi32(__A, __B, _MM_PCOMCTRL_GE);
6380b57cec5SDimitry Andric }
6390b57cec5SDimitry Andric 
6400b57cec5SDimitry Andric static __inline__ __m128i __DEFAULT_FN_ATTRS
_mm_comeq_epi32(__m128i __A,__m128i __B)6410b57cec5SDimitry Andric _mm_comeq_epi32(__m128i __A, __m128i __B)
6420b57cec5SDimitry Andric {
6430b57cec5SDimitry Andric   return _mm_com_epi32(__A, __B, _MM_PCOMCTRL_EQ);
6440b57cec5SDimitry Andric }
6450b57cec5SDimitry Andric 
6460b57cec5SDimitry Andric static __inline__ __m128i __DEFAULT_FN_ATTRS
_mm_comneq_epi32(__m128i __A,__m128i __B)6470b57cec5SDimitry Andric _mm_comneq_epi32(__m128i __A, __m128i __B)
6480b57cec5SDimitry Andric {
6490b57cec5SDimitry Andric   return _mm_com_epi32(__A, __B, _MM_PCOMCTRL_NEQ);
6500b57cec5SDimitry Andric }
6510b57cec5SDimitry Andric 
6520b57cec5SDimitry Andric static __inline__ __m128i __DEFAULT_FN_ATTRS
_mm_comfalse_epi32(__m128i __A,__m128i __B)6530b57cec5SDimitry Andric _mm_comfalse_epi32(__m128i __A, __m128i __B)
6540b57cec5SDimitry Andric {
6550b57cec5SDimitry Andric   return _mm_com_epi32(__A, __B, _MM_PCOMCTRL_FALSE);
6560b57cec5SDimitry Andric }
6570b57cec5SDimitry Andric 
6580b57cec5SDimitry Andric static __inline__ __m128i __DEFAULT_FN_ATTRS
_mm_comtrue_epi32(__m128i __A,__m128i __B)6590b57cec5SDimitry Andric _mm_comtrue_epi32(__m128i __A, __m128i __B)
6600b57cec5SDimitry Andric {
6610b57cec5SDimitry Andric   return _mm_com_epi32(__A, __B, _MM_PCOMCTRL_TRUE);
6620b57cec5SDimitry Andric }
6630b57cec5SDimitry Andric 
6640b57cec5SDimitry Andric static __inline__ __m128i __DEFAULT_FN_ATTRS
_mm_comlt_epi64(__m128i __A,__m128i __B)6650b57cec5SDimitry Andric _mm_comlt_epi64(__m128i __A, __m128i __B)
6660b57cec5SDimitry Andric {
6670b57cec5SDimitry Andric   return _mm_com_epi64(__A, __B, _MM_PCOMCTRL_LT);
6680b57cec5SDimitry Andric }
6690b57cec5SDimitry Andric 
6700b57cec5SDimitry Andric static __inline__ __m128i __DEFAULT_FN_ATTRS
_mm_comle_epi64(__m128i __A,__m128i __B)6710b57cec5SDimitry Andric _mm_comle_epi64(__m128i __A, __m128i __B)
6720b57cec5SDimitry Andric {
6730b57cec5SDimitry Andric   return _mm_com_epi64(__A, __B, _MM_PCOMCTRL_LE);
6740b57cec5SDimitry Andric }
6750b57cec5SDimitry Andric 
6760b57cec5SDimitry Andric static __inline__ __m128i __DEFAULT_FN_ATTRS
_mm_comgt_epi64(__m128i __A,__m128i __B)6770b57cec5SDimitry Andric _mm_comgt_epi64(__m128i __A, __m128i __B)
6780b57cec5SDimitry Andric {
6790b57cec5SDimitry Andric   return _mm_com_epi64(__A, __B, _MM_PCOMCTRL_GT);
6800b57cec5SDimitry Andric }
6810b57cec5SDimitry Andric 
6820b57cec5SDimitry Andric static __inline__ __m128i __DEFAULT_FN_ATTRS
_mm_comge_epi64(__m128i __A,__m128i __B)6830b57cec5SDimitry Andric _mm_comge_epi64(__m128i __A, __m128i __B)
6840b57cec5SDimitry Andric {
6850b57cec5SDimitry Andric   return _mm_com_epi64(__A, __B, _MM_PCOMCTRL_GE);
6860b57cec5SDimitry Andric }
6870b57cec5SDimitry Andric 
6880b57cec5SDimitry Andric static __inline__ __m128i __DEFAULT_FN_ATTRS
_mm_comeq_epi64(__m128i __A,__m128i __B)6890b57cec5SDimitry Andric _mm_comeq_epi64(__m128i __A, __m128i __B)
6900b57cec5SDimitry Andric {
6910b57cec5SDimitry Andric   return _mm_com_epi64(__A, __B, _MM_PCOMCTRL_EQ);
6920b57cec5SDimitry Andric }
6930b57cec5SDimitry Andric 
6940b57cec5SDimitry Andric static __inline__ __m128i __DEFAULT_FN_ATTRS
_mm_comneq_epi64(__m128i __A,__m128i __B)6950b57cec5SDimitry Andric _mm_comneq_epi64(__m128i __A, __m128i __B)
6960b57cec5SDimitry Andric {
6970b57cec5SDimitry Andric   return _mm_com_epi64(__A, __B, _MM_PCOMCTRL_NEQ);
6980b57cec5SDimitry Andric }
6990b57cec5SDimitry Andric 
7000b57cec5SDimitry Andric static __inline__ __m128i __DEFAULT_FN_ATTRS
_mm_comfalse_epi64(__m128i __A,__m128i __B)7010b57cec5SDimitry Andric _mm_comfalse_epi64(__m128i __A, __m128i __B)
7020b57cec5SDimitry Andric {
7030b57cec5SDimitry Andric   return _mm_com_epi64(__A, __B, _MM_PCOMCTRL_FALSE);
7040b57cec5SDimitry Andric }
7050b57cec5SDimitry Andric 
7060b57cec5SDimitry Andric static __inline__ __m128i __DEFAULT_FN_ATTRS
_mm_comtrue_epi64(__m128i __A,__m128i __B)7070b57cec5SDimitry Andric _mm_comtrue_epi64(__m128i __A, __m128i __B)
7080b57cec5SDimitry Andric {
7090b57cec5SDimitry Andric   return _mm_com_epi64(__A, __B, _MM_PCOMCTRL_TRUE);
7100b57cec5SDimitry Andric }
7110b57cec5SDimitry Andric 
7120b57cec5SDimitry Andric #define _mm_permute2_pd(X, Y, C, I) \
713349cc55cSDimitry Andric   ((__m128d)__builtin_ia32_vpermil2pd((__v2df)(__m128d)(X), \
7140b57cec5SDimitry Andric                                       (__v2df)(__m128d)(Y), \
715349cc55cSDimitry Andric                                       (__v2di)(__m128i)(C), (I)))
7160b57cec5SDimitry Andric 
7170b57cec5SDimitry Andric #define _mm256_permute2_pd(X, Y, C, I) \
718349cc55cSDimitry Andric   ((__m256d)__builtin_ia32_vpermil2pd256((__v4df)(__m256d)(X), \
7190b57cec5SDimitry Andric                                          (__v4df)(__m256d)(Y), \
720349cc55cSDimitry Andric                                          (__v4di)(__m256i)(C), (I)))
7210b57cec5SDimitry Andric 
7220b57cec5SDimitry Andric #define _mm_permute2_ps(X, Y, C, I) \
723349cc55cSDimitry Andric   ((__m128)__builtin_ia32_vpermil2ps((__v4sf)(__m128)(X), (__v4sf)(__m128)(Y), \
724349cc55cSDimitry Andric                                      (__v4si)(__m128i)(C), (I)))
7250b57cec5SDimitry Andric 
7260b57cec5SDimitry Andric #define _mm256_permute2_ps(X, Y, C, I) \
727349cc55cSDimitry Andric   ((__m256)__builtin_ia32_vpermil2ps256((__v8sf)(__m256)(X), \
7280b57cec5SDimitry Andric                                         (__v8sf)(__m256)(Y), \
729349cc55cSDimitry Andric                                         (__v8si)(__m256i)(C), (I)))
7300b57cec5SDimitry Andric 
7310b57cec5SDimitry Andric static __inline__ __m128 __DEFAULT_FN_ATTRS
_mm_frcz_ss(__m128 __A)7320b57cec5SDimitry Andric _mm_frcz_ss(__m128 __A)
7330b57cec5SDimitry Andric {
7340b57cec5SDimitry Andric   return (__m128)__builtin_ia32_vfrczss((__v4sf)__A);
7350b57cec5SDimitry Andric }
7360b57cec5SDimitry Andric 
7370b57cec5SDimitry Andric static __inline__ __m128d __DEFAULT_FN_ATTRS
_mm_frcz_sd(__m128d __A)7380b57cec5SDimitry Andric _mm_frcz_sd(__m128d __A)
7390b57cec5SDimitry Andric {
7400b57cec5SDimitry Andric   return (__m128d)__builtin_ia32_vfrczsd((__v2df)__A);
7410b57cec5SDimitry Andric }
7420b57cec5SDimitry Andric 
7430b57cec5SDimitry Andric static __inline__ __m128 __DEFAULT_FN_ATTRS
_mm_frcz_ps(__m128 __A)7440b57cec5SDimitry Andric _mm_frcz_ps(__m128 __A)
7450b57cec5SDimitry Andric {
7460b57cec5SDimitry Andric   return (__m128)__builtin_ia32_vfrczps((__v4sf)__A);
7470b57cec5SDimitry Andric }
7480b57cec5SDimitry Andric 
7490b57cec5SDimitry Andric static __inline__ __m128d __DEFAULT_FN_ATTRS
_mm_frcz_pd(__m128d __A)7500b57cec5SDimitry Andric _mm_frcz_pd(__m128d __A)
7510b57cec5SDimitry Andric {
7520b57cec5SDimitry Andric   return (__m128d)__builtin_ia32_vfrczpd((__v2df)__A);
7530b57cec5SDimitry Andric }
7540b57cec5SDimitry Andric 
7550b57cec5SDimitry Andric static __inline__ __m256 __DEFAULT_FN_ATTRS256
_mm256_frcz_ps(__m256 __A)7560b57cec5SDimitry Andric _mm256_frcz_ps(__m256 __A)
7570b57cec5SDimitry Andric {
7580b57cec5SDimitry Andric   return (__m256)__builtin_ia32_vfrczps256((__v8sf)__A);
7590b57cec5SDimitry Andric }
7600b57cec5SDimitry Andric 
7610b57cec5SDimitry Andric static __inline__ __m256d __DEFAULT_FN_ATTRS256
_mm256_frcz_pd(__m256d __A)7620b57cec5SDimitry Andric _mm256_frcz_pd(__m256d __A)
7630b57cec5SDimitry Andric {
7640b57cec5SDimitry Andric   return (__m256d)__builtin_ia32_vfrczpd256((__v4df)__A);
7650b57cec5SDimitry Andric }
7660b57cec5SDimitry Andric 
7670b57cec5SDimitry Andric #undef __DEFAULT_FN_ATTRS
7680b57cec5SDimitry Andric #undef __DEFAULT_FN_ATTRS256
7690b57cec5SDimitry Andric 
7700b57cec5SDimitry Andric #endif /* __XOPINTRIN_H */
771