diff options
-rw-r--r-- | include/clang/Basic/BuiltinsX86.def | 25 | ||||
-rw-r--r-- | lib/Headers/avx2intrin.h | 150 | ||||
-rw-r--r-- | test/CodeGen/avx2-builtins.c | 125 |
3 files changed, 300 insertions, 0 deletions
diff --git a/include/clang/Basic/BuiltinsX86.def b/include/clang/Basic/BuiltinsX86.def index a32a3b8808..b9d5b4fa99 100644 --- a/include/clang/Basic/BuiltinsX86.def +++ b/include/clang/Basic/BuiltinsX86.def @@ -502,5 +502,30 @@ BUILTIN(__builtin_ia32_phsubd256, "V8iV8iV8i", "") BUILTIN(__builtin_ia32_phsubsw256, "V16sV16sV16s", "") BUILTIN(__builtin_ia32_pmaddubsw256, "V16sV32cV32c", "") BUILTIN(__builtin_ia32_pmaddwd256, "V8iV16sV16s", "") +BUILTIN(__builtin_ia32_pmaxub256, "V32cV32cV32c", "") +BUILTIN(__builtin_ia32_pmaxuw256, "V16sV16sV16s", "") +BUILTIN(__builtin_ia32_pmaxud256, "V8iV8iV8i", "") +BUILTIN(__builtin_ia32_pmaxsb256, "V32cV32cV32c", "") +BUILTIN(__builtin_ia32_pmaxsw256, "V16sV16sV16s", "") +BUILTIN(__builtin_ia32_pmaxsd256, "V8iV8iV8i", "") +BUILTIN(__builtin_ia32_pminub256, "V32cV32cV32c", "") +BUILTIN(__builtin_ia32_pminuw256, "V16sV16sV16s", "") +BUILTIN(__builtin_ia32_pminud256, "V8iV8iV8i", "") +BUILTIN(__builtin_ia32_pminsb256, "V32cV32cV32c", "") +BUILTIN(__builtin_ia32_pminsw256, "V16sV16sV16s", "") +BUILTIN(__builtin_ia32_pminsd256, "V8iV8iV8i", "") +BUILTIN(__builtin_ia32_pmovmskb256, "iV32c", "") +BUILTIN(__builtin_ia32_pmovsxbw256, "V16sV16c", "") +BUILTIN(__builtin_ia32_pmovsxbd256, "V8iV16c", "") +BUILTIN(__builtin_ia32_pmovsxbq256, "V4LLiV16c", "") +BUILTIN(__builtin_ia32_pmovsxwd256, "V8iV8s", "") +BUILTIN(__builtin_ia32_pmovsxwq256, "V4LLiV8s", "") +BUILTIN(__builtin_ia32_pmovsxdq256, "V4LLiV4i", "") +BUILTIN(__builtin_ia32_pmovzxbw256, "V16sV16c", "") +BUILTIN(__builtin_ia32_pmovzxbd256, "V8iV16c", "") +BUILTIN(__builtin_ia32_pmovzxbq256, "V4LLiV16c", "") +BUILTIN(__builtin_ia32_pmovzxwd256, "V8iV8s", "") +BUILTIN(__builtin_ia32_pmovzxwq256, "V4LLiV8s", "") +BUILTIN(__builtin_ia32_pmovzxdq256, "V4LLiV4i", "") #undef BUILTIN diff --git a/lib/Headers/avx2intrin.h b/lib/Headers/avx2intrin.h index ce6075388c..fe6137c47c 100644 --- a/lib/Headers/avx2intrin.h +++ b/lib/Headers/avx2intrin.h @@ -256,6 +256,156 @@ _mm256_madd_epi16(__m256i a, __m256i b) } static __inline__ __m256i __attribute__((__always_inline__, __nodebug__)) +_mm256_max_epi8(__m256i a, __m256i b) +{ + return (__m256i)__builtin_ia32_pmaxsb256((__v32qi)a, (__v32qi)b); +} + +static __inline__ __m256i __attribute__((__always_inline__, __nodebug__)) +_mm256_max_epi16(__m256i a, __m256i b) +{ + return (__m256i)__builtin_ia32_pmaxsw256((__v16hi)a, (__v16hi)b); +} + +static __inline__ __m256i __attribute__((__always_inline__, __nodebug__)) +_mm256_max_epi32(__m256i a, __m256i b) +{ + return (__m256i)__builtin_ia32_pmaxsd256((__v8si)a, (__v8si)b); +} + +static __inline__ __m256i __attribute__((__always_inline__, __nodebug__)) +_mm256_max_epu8(__m256i a, __m256i b) +{ + return (__m256i)__builtin_ia32_pmaxub256((__v32qi)a, (__v32qi)b); +} + +static __inline__ __m256i __attribute__((__always_inline__, __nodebug__)) +_mm256_max_epu16(__m256i a, __m256i b) +{ + return (__m256i)__builtin_ia32_pmaxuw256((__v16hi)a, (__v16hi)b); +} + +static __inline__ __m256i __attribute__((__always_inline__, __nodebug__)) +_mm256_max_epu32(__m256i a, __m256i b) +{ + return (__m256i)__builtin_ia32_pmaxud256((__v8si)a, (__v8si)b); +} + +static __inline__ __m256i __attribute__((__always_inline__, __nodebug__)) +_mm256_min_epi8(__m256i a, __m256i b) +{ + return (__m256i)__builtin_ia32_pminsb256((__v32qi)a, (__v32qi)b); +} + +static __inline__ __m256i __attribute__((__always_inline__, __nodebug__)) +_mm256_min_epi16(__m256i a, __m256i b) +{ + return (__m256i)__builtin_ia32_pminsw256((__v16hi)a, (__v16hi)b); +} + +static __inline__ __m256i __attribute__((__always_inline__, __nodebug__)) +_mm256_min_epi32(__m256i a, __m256i b) +{ + return (__m256i)__builtin_ia32_pminsd256((__v8si)a, (__v8si)b); +} + +static __inline__ __m256i __attribute__((__always_inline__, __nodebug__)) +_mm256_min_epu8(__m256i a, __m256i b) +{ + return (__m256i)__builtin_ia32_pminub256((__v32qi)a, (__v32qi)b); +} + +static __inline__ __m256i __attribute__((__always_inline__, __nodebug__)) +_mm256_min_epu16(__m256i a, __m256i b) +{ + return (__m256i)__builtin_ia32_pminuw256 ((__v16hi)a, (__v16hi)b); +} + +static __inline__ __m256i __attribute__((__always_inline__, __nodebug__)) +_mm256_min_epu32(__m256i a, __m256i b) +{ + return (__m256i)__builtin_ia32_pminud256((__v8si)a, (__v8si)b); +} + +static __inline__ int __attribute__((__always_inline__, __nodebug__)) +_mm256_movemask_epi8(__m256i a) +{ + return __builtin_ia32_pmovmskb256((__v32qi)a); +} + +static __inline__ __m256i __attribute__((__always_inline__, __nodebug__)) +_mm256_cvtepi8_epi16(__m128i __V) +{ + return (__m256i)__builtin_ia32_pmovsxbw256((__v16qi)__V); +} + +static __inline__ __m256i __attribute__((__always_inline__, __nodebug__)) +_mm256_cvtepi8_epi32(__m128i __V) +{ + return (__m256i)__builtin_ia32_pmovsxbd256((__v16qi)__V); +} + +static __inline__ __m256i __attribute__((__always_inline__, __nodebug__)) +_mm256_cvtepi8_epi64(__m128i __V) +{ + return (__m256i)__builtin_ia32_pmovsxbq256((__v16qi)__V); +} + +static __inline__ __m256i __attribute__((__always_inline__, __nodebug__)) +_mm256_cvtepi16_epi32(__m128i __V) +{ + return (__m256i)__builtin_ia32_pmovsxwd256((__v8hi)__V); +} + +static __inline__ __m256i __attribute__((__always_inline__, __nodebug__)) +_mm256_cvtepi16_epi64(__m128i __V) +{ + return (__m256i)__builtin_ia32_pmovsxwq256((__v8hi)__V); +} + +static __inline__ __m256i __attribute__((__always_inline__, __nodebug__)) +_mm256_cvtepi32_epi64(__m128i __V) +{ + return (__m256i)__builtin_ia32_pmovsxdq256((__v4si)__V); +} + +static __inline__ __m256i __attribute__((__always_inline__, __nodebug__)) +_mm256_cvtepu8_epi16(__m128i __V) +{ + return (__m256i)__builtin_ia32_pmovzxbw256((__v16qi)__V); +} + +static __inline__ __m256i __attribute__((__always_inline__, __nodebug__)) +_mm256_cvtepu8_epi32(__m128i __V) +{ + return (__m256i)__builtin_ia32_pmovzxbd256((__v16qi)__V); +} + +static __inline__ __m256i __attribute__((__always_inline__, __nodebug__)) +_mm256_cvtepu8_epi64(__m128i __V) +{ + return (__m256i)__builtin_ia32_pmovzxbq256((__v16qi)__V); +} + +static __inline__ __m256i __attribute__((__always_inline__, __nodebug__)) +_mm256_cvtepu16_epi32(__m128i __V) +{ + return (__m256i)__builtin_ia32_pmovzxwd256((__v8hi)__V); +} + +static __inline__ __m256i __attribute__((__always_inline__, __nodebug__)) +_mm256_cvtepu16_epi64(__m128i __V) +{ + return (__m256i)__builtin_ia32_pmovzxwq256((__v8hi)__V); +} + +static __inline__ __m256i __attribute__((__always_inline__, __nodebug__)) +_mm256_cvtepu32_epi64(__m128i __V) +{ + return (__m256i)__builtin_ia32_pmovzxdq256((__v4si)__V); +} + +static __inline__ __m256i __attribute__((__always_inline__, __nodebug__)) _mm256_or_si256(__m256i a, __m256i b) { return a | b; diff --git a/test/CodeGen/avx2-builtins.c b/test/CodeGen/avx2-builtins.c index 592a196dc8..9e8f471252 100644 --- a/test/CodeGen/avx2-builtins.c +++ b/test/CodeGen/avx2-builtins.c @@ -255,3 +255,128 @@ __m256 test_mm256_madd_epi16(__m256 a, __m256 b) { // CHECK: @llvm.x86.avx2.pmadd.wd return _mm256_madd_epi16(a, b); } + +__m256 test_mm256_max_epi8(__m256 a, __m256 b) { + // CHECK: @llvm.x86.avx2.pmaxs.b + return _mm256_max_epi8(a, b); +} + +__m256 test_mm256_max_epi16(__m256 a, __m256 b) { + // CHECK: @llvm.x86.avx2.pmaxs.w + return _mm256_max_epi16(a, b); +} + +__m256 test_mm256_max_epi32(__m256 a, __m256 b) { + // CHECK: @llvm.x86.avx2.pmaxs.d + return _mm256_max_epi32(a, b); +} + +__m256 test_mm256_max_epu8(__m256 a, __m256 b) { + // CHECK: @llvm.x86.avx2.pmaxu.b + return _mm256_max_epu8(a, b); +} + +__m256 test_mm256_max_epu16(__m256 a, __m256 b) { + // CHECK: @llvm.x86.avx2.pmaxu.w + return _mm256_max_epu16(a, b); +} + +__m256 test_mm256_max_epu32(__m256 a, __m256 b) { + // CHECK: @llvm.x86.avx2.pmaxu.d + return _mm256_max_epu32(a, b); +} + +__m256 test_mm256_min_epi8(__m256 a, __m256 b) { + // CHECK: @llvm.x86.avx2.pmins.b + return _mm256_min_epi8(a, b); +} + +__m256 test_mm256_min_epi16(__m256 a, __m256 b) { + // CHECK: @llvm.x86.avx2.pmins.w + return _mm256_min_epi16(a, b); +} + +__m256 test_mm256_min_epi32(__m256 a, __m256 b) { + // CHECK: @llvm.x86.avx2.pmins.d + return _mm256_min_epi32(a, b); +} + +__m256 test_mm256_min_epu8(__m256 a, __m256 b) { + // CHECK: @llvm.x86.avx2.pminu.b + return _mm256_min_epu8(a, b); +} + +__m256 test_mm256_min_epu16(__m256 a, __m256 b) { + // CHECK: @llvm.x86.avx2.pminu.w + return _mm256_min_epu16(a, b); +} + +__m256 test_mm256_min_epu32(__m256 a, __m256 b) { + // CHECK: @llvm.x86.avx2.pminu.d + return _mm256_min_epu32(a, b); +} + +int test_mm256_movemask_epi8(__m256 a) { + // CHECK: @llvm.x86.avx2.pmovmskb + return _mm256_movemask_epi8(a); +} + +__m256 test_mm256_cvtepi8_epi16(__m128 a) { + // CHECK: @llvm.x86.avx2.pmovsxbw + return _mm256_cvtepi8_epi16(a); +} + +__m256 test_mm256_cvtepi8_epi32(__m128 a) { + // CHECK: @llvm.x86.avx2.pmovsxbd + return _mm256_cvtepi8_epi32(a); +} + +__m256 test_mm256_cvtepi8_epi64(__m128 a) { + // CHECK: @llvm.x86.avx2.pmovsxbq + return _mm256_cvtepi8_epi64(a); +} + +__m256 test_mm256_cvtepi16_epi32(__m128 a) { + // CHECK: @llvm.x86.avx2.pmovsxwd + return _mm256_cvtepi16_epi32(a); +} + +__m256 test_mm256_cvtepi16_epi64(__m128 a) { + // CHECK: @llvm.x86.avx2.pmovsxwq + return _mm256_cvtepi16_epi64(a); +} + +__m256 test_mm256_cvtepi32_epi64(__m128 a) { + // CHECK: @llvm.x86.avx2.pmovsxdq + return _mm256_cvtepi32_epi64(a); +} + +__m256 test_mm256_cvtepu8_epi16(__m128 a) { + // CHECK: @llvm.x86.avx2.pmovzxbw + return _mm256_cvtepu8_epi16(a); +} + +__m256 test_mm256_cvtepu8_epi32(__m128 a) { + // CHECK: @llvm.x86.avx2.pmovzxbd + return _mm256_cvtepu8_epi32(a); +} + +__m256 test_mm256_cvtepu8_epi64(__m128 a) { + // CHECK: @llvm.x86.avx2.pmovzxbq + return _mm256_cvtepu8_epi64(a); +} + +__m256 test_mm256_cvtepu16_epi32(__m128 a) { + // CHECK: @llvm.x86.avx2.pmovzxwd + return _mm256_cvtepu16_epi32(a); +} + +__m256 test_mm256_cvtepu16_epi64(__m128 a) { + // CHECK: @llvm.x86.avx2.pmovzxwq + return _mm256_cvtepu16_epi64(a); +} + +__m256 test_mm256_cvtepu32_epi64(__m128 a) { + // CHECK: @llvm.x86.avx2.pmovzxdq + return _mm256_cvtepu32_epi64(a); +} |