diff options
Diffstat (limited to 'clang')
-rw-r--r-- | clang/include/clang/Basic/BuiltinsX86.def | 3 | ||||
-rw-r--r-- | clang/lib/Headers/smmintrin.h | 23 |
2 files changed, 26 insertions, 0 deletions
diff --git a/clang/include/clang/Basic/BuiltinsX86.def b/clang/include/clang/Basic/BuiltinsX86.def index 880b4bab6e2..55a8e1537fd 100644 --- a/clang/include/clang/Basic/BuiltinsX86.def +++ b/clang/include/clang/Basic/BuiltinsX86.def @@ -287,6 +287,9 @@ BUILTIN(__builtin_ia32_roundpd, "V2dV2di", "") BUILTIN(__builtin_ia32_dpps, "V4fV4fV4fi", "") BUILTIN(__builtin_ia32_dppd, "V2dV2dV2di", "") BUILTIN(__builtin_ia32_movntdqa, "V2LLiV2LLi*", "") +BUILTIN(__builtin_ia32_ptestz128, "iV2LLiV2LLi", "") +BUILTIN(__builtin_ia32_ptestc128, "iV2LLiV2LLi", "") +BUILTIN(__builtin_ia32_ptestnzc128, "iV2LLiV2LLi", "") #undef BUILTIN diff --git a/clang/lib/Headers/smmintrin.h b/clang/lib/Headers/smmintrin.h index 29a9c37b45e..7eab8182eb4 100644 --- a/clang/lib/Headers/smmintrin.h +++ b/clang/lib/Headers/smmintrin.h @@ -223,6 +223,29 @@ _mm_max_epu32 (__m128i __V1, __m128i __V2) __a[N];})) #endif /* __x86_64 */ +/* SSE4 128-bit Packed Integer Comparisons. */ +static inline int __attribute__((__always_inline__, __nodebug__)) +_mm_testz_si128(__m128i __M, __m128i __V) +{ + return __builtin_ia32_ptestz128((__v2di)__M, (__v2di)__V); +} + +static inline int __attribute__((__always_inline__, __nodebug__)) +_mm_testc_si128(__m128i __M, __m128i __V) +{ + return __builtin_ia32_ptestc128((__v2di)__M, (__v2di)__V); +} + +static inline int __attribute__((__always_inline__, __nodebug__)) +_mm_testnzc_si128(__m128i __M, __m128i __V) +{ + return __builtin_ia32_ptestnzc128((__v2di)__M, (__v2di)__V); +} + +#define _mm_test_all_ones(V) _mm_testc_si128((V), _mm_cmpeq_epi32((V), (V))) +#define _mm_test_mix_ones_zeros(M, V) _mm_testnzc_si128((M), (V)) +#define _mm_test_all_zeros(M, V) _mm_testz_si128 ((V), (V)) + #endif /* __SSE4_1__ */ #endif /* _SMMINTRIN_H */ |