From f4bb9525332810f29c25afb654cb844e1d426e23 Mon Sep 17 00:00:00 2001 From: Craig Topper Date: Sat, 24 Dec 2011 03:28:57 +0000 Subject: [PATCH] More AVX2 intrinsics for shift, psign, some shuffles, and psadbw. llvm-svn: 147236 --- clang/include/clang/Basic/BuiltinsX86.def | 23 ++ clang/lib/Headers/avx2intrin.h | 170 +++++++++++++ clang/test/CodeGen/avx2-builtins.c | 289 ++++++++++++++++------ 3 files changed, 400 insertions(+), 82 deletions(-) diff --git a/clang/include/clang/Basic/BuiltinsX86.def b/clang/include/clang/Basic/BuiltinsX86.def index 458c302a9ab6..8c25a7a641a2 100644 --- a/clang/include/clang/Basic/BuiltinsX86.def +++ b/clang/include/clang/Basic/BuiltinsX86.def @@ -532,5 +532,28 @@ BUILTIN(__builtin_ia32_pmulhrsw256, "V16sV16sV16s", "") BUILTIN(__builtin_ia32_pmulhuw256, "V16sV16sV16s", "") BUILTIN(__builtin_ia32_pmulhw256, "V16sV16sV16s", "") BUILTIN(__builtin_ia32_pmuludq256, "V4LLiV8iV8i", "") +BUILTIN(__builtin_ia32_psadbw256, "V4LLiV32cV32c", "") +BUILTIN(__builtin_ia32_pshufb256, "V32cV32cV32c", "") +BUILTIN(__builtin_ia32_psignb256, "V32cV32cV32c", "") +BUILTIN(__builtin_ia32_psignw256, "V16sV16sV16s", "") +BUILTIN(__builtin_ia32_psignd256, "V8iV8iV8i", "") +BUILTIN(__builtin_ia32_pslldqi256, "V4LLiV4LLiIi", "") +BUILTIN(__builtin_ia32_psllwi256, "V16sV16si", "") +BUILTIN(__builtin_ia32_psllw256, "V16sV16sV8s", "") +BUILTIN(__builtin_ia32_pslldi256, "V8iV8ii", "") +BUILTIN(__builtin_ia32_pslld256, "V8iV8iV4i", "") +BUILTIN(__builtin_ia32_psllqi256, "V4LLiV4LLii", "") +BUILTIN(__builtin_ia32_psllq256, "V4LLiV4LLiV2LLi", "") +BUILTIN(__builtin_ia32_psrawi256, "V16sV16si", "") +BUILTIN(__builtin_ia32_psraw256, "V16sV16sV8s", "") +BUILTIN(__builtin_ia32_psradi256, "V8iV8ii", "") +BUILTIN(__builtin_ia32_psrad256, "V8iV8iV4i", "") +BUILTIN(__builtin_ia32_psrldqi256, "V4LLiV4LLiIi", "") +BUILTIN(__builtin_ia32_psrlwi256, "V16sV16si", "") +BUILTIN(__builtin_ia32_psrlw256, "V16sV16sV8s", "") +BUILTIN(__builtin_ia32_psrldi256, "V8iV8ii", "") +BUILTIN(__builtin_ia32_psrld256, "V8iV8iV4i", "") +BUILTIN(__builtin_ia32_psrlqi256, "V4LLiV4LLii", "") +BUILTIN(__builtin_ia32_psrlq256, "V4LLiV4LLiV2LLi", "") #undef BUILTIN diff --git a/clang/lib/Headers/avx2intrin.h b/clang/lib/Headers/avx2intrin.h index a1e991563361..5932f3789533 100644 --- a/clang/lib/Headers/avx2intrin.h +++ b/clang/lib/Headers/avx2intrin.h @@ -453,6 +453,176 @@ _mm256_or_si256(__m256i a, __m256i b) return a | b; } +static __inline__ __m256i __attribute__((__always_inline__, __nodebug__)) +_mm256_sad_epu8(__m256i a, __m256i b) +{ + return __builtin_ia32_psadbw256((__v32qi)a, (__v32qi)b); +} + +static __inline__ __m256i __attribute__((__always_inline__, __nodebug__)) +_mm256_shuffle_epi8(__m256i a, __m256i b) +{ + return (__m256i)__builtin_ia32_pshufb256((__v32qi)a, (__v32qi)b); +} + +#define _mm256_shuffle_epi32(a, imm) __extension__ ({ \ + __m256i __a = (a); \ + (__m256i)__builtin_shufflevector((__v8si)__a, (__v8si)_mm256_set1_epi32(0), \ + (imm) & 0x3, ((imm) & 0xc) >> 2, \ + ((imm) & 0x30) >> 4, ((imm) & 0xc0) >> 6, \ + 4 + (((imm) & 0x03) >> 0), \ + 4 + (((imm) & 0x0c) >> 2), \ + 4 + (((imm) & 0x30) >> 4), \ + 4 + (((imm) & 0xc0) >> 6)); }) + +#define _mm256_shufflehi_epi16(a, imm) __extension__ ({ \ + __m256i __a = (a); \ + (__m256i)__builtin_shufflevector((__v16hi)__a, (__v16hi)_mm256_set1_epi16(0), \ + 0, 1, 2, 3, \ + 4 + (((imm) & 0x03) >> 0), \ + 4 + (((imm) & 0x0c) >> 2), \ + 4 + (((imm) & 0x30) >> 4), \ + 4 + (((imm) & 0xc0) >> 6), \ + 8, 9, 10, 11, \ + 12 + (((imm) & 0x03) >> 0), \ + 12 + (((imm) & 0x0c) >> 2), \ + 12 + (((imm) & 0x30) >> 4), \ + 12 + (((imm) & 0xc0) >> 6)); }) + +#define _mm256_shufflelo_epi16(a, imm) __extension__ ({ \ + __m256i __a = (a); \ + (__m256i)__builtin_shufflevector((__v16hi)__a, (__v16hi)_mm256_set1_epi16(0), \ + (imm) & 0x3,((imm) & 0xc) >> 2, \ + ((imm) & 0x30) >> 4, ((imm) & 0xc0) >> 6, \ + 4, 5, 6, 7, \ + 8 + (((imm) & 0x03) >> 0), \ + 8 + (((imm) & 0x0c) >> 2), \ + 8 + (((imm) & 0x30) >> 4), \ + 8 + (((imm) & 0xc0) >> 6), \ + 12, 13, 14, 15); }) + +static __inline__ __m256i __attribute__((__always_inline__, __nodebug__)) +_mm256_sign_epi8(__m256i a, __m256i b) +{ + return (__m256i)__builtin_ia32_psignb256((__v32qi)a, (__v32qi)b); +} + +static __inline__ __m256i __attribute__((__always_inline__, __nodebug__)) +_mm256_sign_epi16(__m256i a, __m256i b) +{ + return (__m256i)__builtin_ia32_psignw256((__v16hi)a, (__v16hi)b); +} + +static __inline__ __m256i __attribute__((__always_inline__, __nodebug__)) +_mm256_sign_epi32(__m256i a, __m256i b) +{ + return (__m256i)__builtin_ia32_psignd256((__v8si)a, (__v8si)b); +} + +#define _mm256_slli_si256(a, count) __extension__ ({ \ + __m256i __a = (a); \ + (__m256i)__builtin_ia32_pslldqi256(__a, (count)*8); }) + +static __inline__ __m256i __attribute__((__always_inline__, __nodebug__)) +_mm256_slli_epi16(__m256i a, int count) +{ + return (__m256i)__builtin_ia32_psllwi256((__v16hi)a, count); +} + +static __inline__ __m256i __attribute__((__always_inline__, __nodebug__)) +_mm256_sll_epi16(__m256i a, __m128i count) +{ + return (__m256i)__builtin_ia32_psllw256((__v16hi)a, (__v8hi)count); +} + +static __inline__ __m256i __attribute__((__always_inline__, __nodebug__)) +_mm256_slli_epi32(__m256i a, int count) +{ + return (__m256i)__builtin_ia32_pslldi256((__v8si)a, count); +} + +static __inline__ __m256i __attribute__((__always_inline__, __nodebug__)) +_mm256_sll_epi32(__m256i a, __m128i count) +{ + return (__m256i)__builtin_ia32_pslld256((__v8si)a, (__v4si)count); +} + +static __inline__ __m256i __attribute__((__always_inline__, __nodebug__)) +_mm256_slli_epi64(__m256i a, int count) +{ + return __builtin_ia32_psllqi256(a, count); +} + +static __inline__ __m256i __attribute__((__always_inline__, __nodebug__)) +_mm256_sll_epi64(__m256i a, __m128i count) +{ + return __builtin_ia32_psllq256(a, count); +} + +static __inline__ __m256i __attribute__((__always_inline__, __nodebug__)) +_mm256_srai_epi16(__m256i a, int count) +{ + return (__m256i)__builtin_ia32_psrawi256((__v16hi)a, count); +} + +static __inline__ __m256i __attribute__((__always_inline__, __nodebug__)) +_mm256_sra_epi16(__m256i a, __m128i count) +{ + return (__m256i)__builtin_ia32_psraw256((__v16hi)a, (__v8hi)count); +} + +static __inline__ __m256i __attribute__((__always_inline__, __nodebug__)) +_mm256_srai_epi32(__m256i a, int count) +{ + return (__m256i)__builtin_ia32_psradi256((__v8si)a, count); +} + +static __inline__ __m256i __attribute__((__always_inline__, __nodebug__)) +_mm256_sra_epi32(__m256i a, __m128i count) +{ + return (__m256i)__builtin_ia32_psrad256((__v8si)a, (__v4si)count); +} + +#define _mm256_srli_si256(a, count) __extension__ ({ \ + __m256i __a = (a); \ + (__m256i)__builtin_ia32_psrldqi256(__a, (count)*8); }) + +static __inline__ __m256i __attribute__((__always_inline__, __nodebug__)) +_mm256_srli_epi16(__m256i a, int count) +{ + return (__m256i)__builtin_ia32_psrlwi256((__v16hi)a, count); +} + +static __inline__ __m256i __attribute__((__always_inline__, __nodebug__)) +_mm256_srl_epi16(__m256i a, __m128i count) +{ + return (__m256i)__builtin_ia32_psrlw256((__v16hi)a, (__v8hi)count); +} + +static __inline__ __m256i __attribute__((__always_inline__, __nodebug__)) +_mm256_srli_epi32(__m256i a, int count) +{ + return (__m256i)__builtin_ia32_psrldi256((__v8si)a, count); +} + +static __inline__ __m256i __attribute__((__always_inline__, __nodebug__)) +_mm256_srl_epi32(__m256i a, __m128i count) +{ + return (__m256i)__builtin_ia32_psrld256((__v8si)a, (__v4si)count); +} + +static __inline__ __m256i __attribute__((__always_inline__, __nodebug__)) +_mm256_srli_epi64(__m256i a, int count) +{ + return __builtin_ia32_psrlqi256(a, count); +} + +static __inline__ __m256i __attribute__((__always_inline__, __nodebug__)) +_mm256_srl_epi64(__m256i a, __m128i count) +{ + return __builtin_ia32_psrlq256(a, count); +} + static __inline__ __m256i __attribute__((__always_inline__, __nodebug__)) _mm256_sub_epi8(__m256i a, __m256i b) { diff --git a/clang/test/CodeGen/avx2-builtins.c b/clang/test/CodeGen/avx2-builtins.c index bc4a86e00d8f..1f6edc102546 100644 --- a/clang/test/CodeGen/avx2-builtins.c +++ b/clang/test/CodeGen/avx2-builtins.c @@ -5,413 +5,538 @@ #include -__m256 test_mm256_mpsadbw_epu8(__m256 x, __m256 y) { +__m256i test_mm256_mpsadbw_epu8(__m256i x, __m256i y) { // CHECK: @llvm.x86.avx2.mpsadbw({{.*}}, {{.*}}, i32 3) return _mm256_mpsadbw_epu8(x, y, 3); } -__m256 test_mm256_abs_epi8(__m256 a) { +__m256i test_mm256_abs_epi8(__m256i a) { // CHECK: @llvm.x86.avx2.pabs.b return _mm256_abs_epi8(a); } -__m256 test_mm256_abs_epi16(__m256 a) { +__m256i test_mm256_abs_epi16(__m256i a) { // CHECK: @llvm.x86.avx2.pabs.w return _mm256_abs_epi16(a); } -__m256 test_mm256_abs_epi32(__m256 a) { +__m256i test_mm256_abs_epi32(__m256i a) { // CHECK: @llvm.x86.avx2.pabs.d return _mm256_abs_epi32(a); } -__m256 test_mm256_packs_epi16(__m256 a, __m256 b) { +__m256i test_mm256_packs_epi16(__m256i a, __m256i b) { // CHECK: @llvm.x86.avx2.packsswb return _mm256_packs_epi16(a, b); } -__m256 test_mm256_packs_epi32(__m256 a, __m256 b) { +__m256i test_mm256_packs_epi32(__m256i a, __m256i b) { // CHECK: @llvm.x86.avx2.packssdw return _mm256_packs_epi32(a, b); } -__m256 test_mm256_packs_epu16(__m256 a, __m256 b) { +__m256i test_mm256_packs_epu16(__m256i a, __m256i b) { // CHECK: @llvm.x86.avx2.packuswb return _mm256_packus_epi16(a, b); } -__m256 test_mm256_packs_epu32(__m256 a, __m256 b) { +__m256i test_mm256_packs_epu32(__m256i a, __m256i b) { // CHECK: @llvm.x86.avx2.packusdw return _mm256_packus_epi32(a, b); } -__m256 test_mm256_add_epi8(__m256 a, __m256 b) { +__m256i test_mm256_add_epi8(__m256i a, __m256i b) { // CHECK: add <32 x i8> return _mm256_add_epi8(a, b); } -__m256 test_mm256_add_epi16(__m256 a, __m256 b) { +__m256i test_mm256_add_epi16(__m256i a, __m256i b) { // CHECK: add <16 x i16> return _mm256_add_epi16(a, b); } -__m256 test_mm256_add_epi32(__m256 a, __m256 b) { +__m256i test_mm256_add_epi32(__m256i a, __m256i b) { // CHECK: add <8 x i32> return _mm256_add_epi32(a, b); } -__m256 test_mm256_add_epi64(__m256 a, __m256 b) { +__m256i test_mm256_add_epi64(__m256i a, __m256i b) { // CHECK: add <4 x i64> return _mm256_add_epi64(a, b); } -__m256 test_mm256_adds_epi8(__m256 a, __m256 b) { +__m256i test_mm256_adds_epi8(__m256i a, __m256i b) { // CHECK: @llvm.x86.avx2.padds.b return _mm256_adds_epi8(a, b); } -__m256 test_mm256_adds_epi16(__m256 a, __m256 b) { +__m256i test_mm256_adds_epi16(__m256i a, __m256i b) { // CHECK: @llvm.x86.avx2.padds.w return _mm256_adds_epi16(a, b); } -__m256 test_mm256_adds_epu8(__m256 a, __m256 b) { +__m256i test_mm256_adds_epu8(__m256i a, __m256i b) { // CHECK: @llvm.x86.avx2.paddus.b return _mm256_adds_epu8(a, b); } -__m256 test_mm256_adds_epu16(__m256 a, __m256 b) { +__m256i test_mm256_adds_epu16(__m256i a, __m256i b) { // CHECK: @llvm.x86.avx2.paddus.w return _mm256_adds_epu16(a, b); } -__m256 test_mm256_alignr_epi8(__m256 a, __m256 b) { +__m256i test_mm256_alignr_epi8(__m256i a, __m256i b) { // CHECK: shufflevector <32 x i8> %{{.*}}, <32 x i8> %{{.*}}, <32 x i32> return _mm256_alignr_epi8(a, b, 2); } -__m256 test2_mm256_alignr_epi8(__m256 a, __m256 b) { +__m256i test2_mm256_alignr_epi8(__m256i a, __m256i b) { // CHECK: @llvm.x86.avx2.psrl.dq({{.*}}, i32 8) return _mm256_alignr_epi8(a, b, 17); } -__m256 test_mm256_sub_epi8(__m256 a, __m256 b) { +__m256i test_mm256_sub_epi8(__m256i a, __m256i b) { // CHECK: sub <32 x i8> return _mm256_sub_epi8(a, b); } -__m256 test_mm256_sub_epi16(__m256 a, __m256 b) { +__m256i test_mm256_sub_epi16(__m256i a, __m256i b) { // CHECK: sub <16 x i16> return _mm256_sub_epi16(a, b); } -__m256 test_mm256_sub_epi32(__m256 a, __m256 b) { +__m256i test_mm256_sub_epi32(__m256i a, __m256i b) { // CHECK: sub <8 x i32> return _mm256_sub_epi32(a, b); } -__m256 test_mm256_sub_epi64(__m256 a, __m256 b) { +__m256i test_mm256_sub_epi64(__m256i a, __m256i b) { // CHECK: sub <4 x i64> return _mm256_sub_epi64(a, b); } -__m256 test_mm256_subs_epi8(__m256 a, __m256 b) { +__m256i test_mm256_subs_epi8(__m256i a, __m256i b) { // CHECK: @llvm.x86.avx2.psubs.b return _mm256_subs_epi8(a, b); } -__m256 test_mm256_subs_epi16(__m256 a, __m256 b) { +__m256i test_mm256_subs_epi16(__m256i a, __m256i b) { // CHECK: @llvm.x86.avx2.psubs.w return _mm256_subs_epi16(a, b); } -__m256 test_mm256_subs_epu8(__m256 a, __m256 b) { +__m256i test_mm256_subs_epu8(__m256i a, __m256i b) { // CHECK: @llvm.x86.avx2.psubus.b return _mm256_subs_epu8(a, b); } -__m256 test_mm256_subs_epu16(__m256 a, __m256 b) { +__m256i test_mm256_subs_epu16(__m256i a, __m256i b) { // CHECK: @llvm.x86.avx2.psubus.w return _mm256_subs_epu16(a, b); } -__m256 test_mm256_and_si256(__m256 a, __m256 b) { +__m256i test_mm256_and_si256(__m256i a, __m256i b) { // CHECK: and <4 x i64> return _mm256_and_si256(a, b); } -__m256 test_mm256_andnot_si256(__m256 a, __m256 b) { +__m256i test_mm256_andnot_si256(__m256i a, __m256i b) { // CHECK: xor <4 x i64> // CHECK: and <4 x i64> return _mm256_andnot_si256(a, b); } -__m256 test_mm256_or_si256(__m256 a, __m256 b) { +__m256i test_mm256_or_si256(__m256i a, __m256i b) { // CHECK: or <4 x i64> return _mm256_or_si256(a, b); } -__m256 test_mm256_xor_si256(__m256 a, __m256 b) { +__m256i test_mm256_xor_si256(__m256i a, __m256i b) { // CHECK: xor <4 x i64> return _mm256_xor_si256(a, b); } -__m256 test_mm256_avg_epu8(__m256 a, __m256 b) { +__m256i test_mm256_avg_epu8(__m256i a, __m256i b) { // CHECK: @llvm.x86.avx2.pavg.b return _mm256_avg_epu8(a, b); } -__m256 test_mm256_avg_epu16(__m256 a, __m256 b) { +__m256i test_mm256_avg_epu16(__m256i a, __m256i b) { // CHECK: @llvm.x86.avx2.pavg.w return _mm256_avg_epu16(a, b); } -__m256 test_mm256_blendv_epi8(__m256 a, __m256 b, __m256 m) { +__m256i test_mm256_blendv_epi8(__m256i a, __m256i b, __m256i m) { // CHECK: @llvm.x86.avx2.pblendvb return _mm256_blendv_epi8(a, b, m); } -__m256 test_mm256_blend_epi16(__m256 a, __m256 b) { +__m256i test_mm256_blend_epi16(__m256i a, __m256i b) { // CHECK: @llvm.x86.avx2.pblendw(<16 x i16> %{{.*}}, <16 x i16> %{{.*}}, i32 2) return _mm256_blend_epi16(a, b, 2); } -__m256 test_mm256_cmpeq_epi8(__m256 a, __m256 b) { +__m256i test_mm256_cmpeq_epi8(__m256i a, __m256i b) { // CHECK: icmp eq <32 x i8> return _mm256_cmpeq_epi8(a, b); } -__m256 test_mm256_cmpeq_epi16(__m256 a, __m256 b) { +__m256i test_mm256_cmpeq_epi16(__m256i a, __m256i b) { // CHECK: icmp eq <16 x i16> return _mm256_cmpeq_epi16(a, b); } -__m256 test_mm256_cmpeq_epi32(__m256 a, __m256 b) { +__m256i test_mm256_cmpeq_epi32(__m256i a, __m256i b) { // CHECK: icmp eq <8 x i32> return _mm256_cmpeq_epi32(a, b); } -__m256 test_mm256_cmpeq_epi64(__m256 a, __m256 b) { +__m256i test_mm256_cmpeq_epi64(__m256i a, __m256i b) { // CHECK: icmp eq <4 x i64> return _mm256_cmpeq_epi64(a, b); } -__m256 test_mm256_cmpgt_epi8(__m256 a, __m256 b) { +__m256i test_mm256_cmpgt_epi8(__m256i a, __m256i b) { // CHECK: icmp sgt <32 x i8> return _mm256_cmpgt_epi8(a, b); } -__m256 test_mm256_cmpgt_epi16(__m256 a, __m256 b) { +__m256i test_mm256_cmpgt_epi16(__m256i a, __m256i b) { // CHECK: icmp sgt <16 x i16> return _mm256_cmpgt_epi16(a, b); } -__m256 test_mm256_cmpgt_epi32(__m256 a, __m256 b) { +__m256i test_mm256_cmpgt_epi32(__m256i a, __m256i b) { // CHECK: icmp sgt <8 x i32> return _mm256_cmpgt_epi32(a, b); } -__m256 test_mm256_cmpgt_epi64(__m256 a, __m256 b) { +__m256i test_mm256_cmpgt_epi64(__m256i a, __m256i b) { // CHECK: icmp sgt <4 x i64> return _mm256_cmpgt_epi64(a, b); } -__m256 test_mm256_hadd_epi16(__m256 a, __m256 b) { +__m256i test_mm256_hadd_epi16(__m256i a, __m256i b) { // CHECK: @llvm.x86.avx2.phadd.w return _mm256_hadd_epi16(a, b); } -__m256 test_mm256_hadd_epi32(__m256 a, __m256 b) { +__m256i test_mm256_hadd_epi32(__m256i a, __m256i b) { // CHECK: @llvm.x86.avx2.phadd.d return _mm256_hadd_epi32(a, b); } -__m256 test_mm256_hadds_epi16(__m256 a, __m256 b) { +__m256i test_mm256_hadds_epi16(__m256i a, __m256i b) { // CHECK: @llvm.x86.avx2.phadd.sw return _mm256_hadds_epi16(a, b); } -__m256 test_mm256_hsub_epi16(__m256 a, __m256 b) { +__m256i test_mm256_hsub_epi16(__m256i a, __m256i b) { // CHECK: @llvm.x86.avx2.phsub.w return _mm256_hsub_epi16(a, b); } -__m256 test_mm256_hsub_epi32(__m256 a, __m256 b) { +__m256i test_mm256_hsub_epi32(__m256i a, __m256i b) { // CHECK: @llvm.x86.avx2.phsub.d return _mm256_hsub_epi32(a, b); } -__m256 test_mm256_hsubs_epi16(__m256 a, __m256 b) { +__m256i test_mm256_hsubs_epi16(__m256i a, __m256i b) { // CHECK: @llvm.x86.avx2.phsub.sw return _mm256_hsubs_epi16(a, b); } -__m256 test_mm256_maddubs_epi16(__m256 a, __m256 b) { +__m256i test_mm256_maddubs_epi16(__m256i a, __m256i b) { // CHECK: @llvm.x86.avx2.pmadd.ub.sw return _mm256_maddubs_epi16(a, b); } -__m256 test_mm256_madd_epi16(__m256 a, __m256 b) { +__m256i test_mm256_madd_epi16(__m256i a, __m256i b) { // CHECK: @llvm.x86.avx2.pmadd.wd return _mm256_madd_epi16(a, b); } -__m256 test_mm256_max_epi8(__m256 a, __m256 b) { +__m256i test_mm256_max_epi8(__m256i a, __m256i b) { // CHECK: @llvm.x86.avx2.pmaxs.b return _mm256_max_epi8(a, b); } -__m256 test_mm256_max_epi16(__m256 a, __m256 b) { +__m256i test_mm256_max_epi16(__m256i a, __m256i b) { // CHECK: @llvm.x86.avx2.pmaxs.w return _mm256_max_epi16(a, b); } -__m256 test_mm256_max_epi32(__m256 a, __m256 b) { +__m256i test_mm256_max_epi32(__m256i a, __m256i b) { // CHECK: @llvm.x86.avx2.pmaxs.d return _mm256_max_epi32(a, b); } -__m256 test_mm256_max_epu8(__m256 a, __m256 b) { +__m256i test_mm256_max_epu8(__m256i a, __m256i b) { // CHECK: @llvm.x86.avx2.pmaxu.b return _mm256_max_epu8(a, b); } -__m256 test_mm256_max_epu16(__m256 a, __m256 b) { +__m256i test_mm256_max_epu16(__m256i a, __m256i b) { // CHECK: @llvm.x86.avx2.pmaxu.w return _mm256_max_epu16(a, b); } -__m256 test_mm256_max_epu32(__m256 a, __m256 b) { +__m256i test_mm256_max_epu32(__m256i a, __m256i b) { // CHECK: @llvm.x86.avx2.pmaxu.d return _mm256_max_epu32(a, b); } -__m256 test_mm256_min_epi8(__m256 a, __m256 b) { +__m256i test_mm256_min_epi8(__m256i a, __m256i b) { // CHECK: @llvm.x86.avx2.pmins.b return _mm256_min_epi8(a, b); } -__m256 test_mm256_min_epi16(__m256 a, __m256 b) { +__m256i test_mm256_min_epi16(__m256i a, __m256i b) { // CHECK: @llvm.x86.avx2.pmins.w return _mm256_min_epi16(a, b); } -__m256 test_mm256_min_epi32(__m256 a, __m256 b) { +__m256i test_mm256_min_epi32(__m256i a, __m256i b) { // CHECK: @llvm.x86.avx2.pmins.d return _mm256_min_epi32(a, b); } -__m256 test_mm256_min_epu8(__m256 a, __m256 b) { +__m256i test_mm256_min_epu8(__m256i a, __m256i b) { // CHECK: @llvm.x86.avx2.pminu.b return _mm256_min_epu8(a, b); } -__m256 test_mm256_min_epu16(__m256 a, __m256 b) { +__m256i test_mm256_min_epu16(__m256i a, __m256i b) { // CHECK: @llvm.x86.avx2.pminu.w return _mm256_min_epu16(a, b); } -__m256 test_mm256_min_epu32(__m256 a, __m256 b) { +__m256i test_mm256_min_epu32(__m256i a, __m256i b) { // CHECK: @llvm.x86.avx2.pminu.d return _mm256_min_epu32(a, b); } -int test_mm256_movemask_epi8(__m256 a) { +int test_mm256_movemask_epi8(__m256i a) { // CHECK: @llvm.x86.avx2.pmovmskb return _mm256_movemask_epi8(a); } -__m256 test_mm256_cvtepi8_epi16(__m128 a) { +__m256i test_mm256_cvtepi8_epi16(__m128i a) { // CHECK: @llvm.x86.avx2.pmovsxbw return _mm256_cvtepi8_epi16(a); } -__m256 test_mm256_cvtepi8_epi32(__m128 a) { +__m256i test_mm256_cvtepi8_epi32(__m128i a) { // CHECK: @llvm.x86.avx2.pmovsxbd return _mm256_cvtepi8_epi32(a); } -__m256 test_mm256_cvtepi8_epi64(__m128 a) { +__m256i test_mm256_cvtepi8_epi64(__m128i a) { // CHECK: @llvm.x86.avx2.pmovsxbq return _mm256_cvtepi8_epi64(a); } -__m256 test_mm256_cvtepi16_epi32(__m128 a) { +__m256i test_mm256_cvtepi16_epi32(__m128i a) { // CHECK: @llvm.x86.avx2.pmovsxwd return _mm256_cvtepi16_epi32(a); } -__m256 test_mm256_cvtepi16_epi64(__m128 a) { +__m256i test_mm256_cvtepi16_epi64(__m128i a) { // CHECK: @llvm.x86.avx2.pmovsxwq return _mm256_cvtepi16_epi64(a); } -__m256 test_mm256_cvtepi32_epi64(__m128 a) { +__m256i test_mm256_cvtepi32_epi64(__m128i a) { // CHECK: @llvm.x86.avx2.pmovsxdq return _mm256_cvtepi32_epi64(a); } -__m256 test_mm256_cvtepu8_epi16(__m128 a) { +__m256i test_mm256_cvtepu8_epi16(__m128i a) { // CHECK: @llvm.x86.avx2.pmovzxbw return _mm256_cvtepu8_epi16(a); } -__m256 test_mm256_cvtepu8_epi32(__m128 a) { +__m256i test_mm256_cvtepu8_epi32(__m128i a) { // CHECK: @llvm.x86.avx2.pmovzxbd return _mm256_cvtepu8_epi32(a); } -__m256 test_mm256_cvtepu8_epi64(__m128 a) { +__m256i test_mm256_cvtepu8_epi64(__m128i a) { // CHECK: @llvm.x86.avx2.pmovzxbq return _mm256_cvtepu8_epi64(a); } -__m256 test_mm256_cvtepu16_epi32(__m128 a) { +__m256i test_mm256_cvtepu16_epi32(__m128i a) { // CHECK: @llvm.x86.avx2.pmovzxwd return _mm256_cvtepu16_epi32(a); } -__m256 test_mm256_cvtepu16_epi64(__m128 a) { +__m256i test_mm256_cvtepu16_epi64(__m128i a) { // CHECK: @llvm.x86.avx2.pmovzxwq return _mm256_cvtepu16_epi64(a); } -__m256 test_mm256_cvtepu32_epi64(__m128 a) { +__m256i test_mm256_cvtepu32_epi64(__m128i a) { // CHECK: @llvm.x86.avx2.pmovzxdq return _mm256_cvtepu32_epi64(a); } -__m256 test_mm256_mul_epi32(__m256 a, __m256 b) { +__m256i test_mm256_mul_epi32(__m256i a, __m256i b) { // CHECK: @llvm.x86.avx2.pmul.dq return _mm256_mul_epi32(a, b); } -__m256 test_mm256_mulhrs_epi16(__m256 a, __m256 b) { +__m256i test_mm256_mulhrs_epi16(__m256i a, __m256i b) { // CHECK: @llvm.x86.avx2.pmul.hr.sw return _mm256_mulhrs_epi16(a, b); } -__m256 test_mm256_mulhi_epu16(__m256 a, __m256 b) { +__m256i test_mm256_mulhi_epu16(__m256i a, __m256i b) { // CHECK: @llvm.x86.avx2.pmulhu.w return _mm256_mulhi_epu16(a, b); } -__m256 test_mm256_mulhi_epi16(__m256 a, __m256 b) { +__m256i test_mm256_mulhi_epi16(__m256i a, __m256i b) { // CHECK: @llvm.x86.avx2.pmulh.w return _mm256_mulhi_epi16(a, b); } -__m256 test_mm256_mullo_epi16(__m256 a, __m256 b) { +__m256i test_mm256_mullo_epi16(__m256i a, __m256i b) { // CHECK: mul <16 x i16> return _mm256_mullo_epi16(a, b); } -__m256 test_mm256_mullo_epi32(__m256 a, __m256 b) { +__m256i test_mm256_mullo_epi32(__m256i a, __m256i b) { // CHECK: mul <8 x i32> return _mm256_mullo_epi32(a, b); } -__m256 test_mm256_mul_epu32(__m256 a, __m256 b) { +__m256i test_mm256_mul_epu32(__m256i a, __m256i b) { // CHECK: @llvm.x86.avx2.pmulu.dq return _mm256_mul_epu32(a, b); } + +__m256i test_mm256_shuffle_epi8(__m256i a, __m256i b) { + // CHECK: @llvm.x86.avx2.pshuf.b + return _mm256_shuffle_epi8(a, b); +} + +__m256i test_mm256_shuffle_epi32(__m256i a) { + // CHECK: shufflevector <8 x i32> %{{.*}}, <8 x i32> undef, <8 x i32> + return _mm256_shuffle_epi32(a, 15); +} + +__m256i test_mm256_shufflehi_epi16(__m256i a) { + // CHECK: shufflevector <16 x i16> %{{.*}}, <16 x i16> undef, <16 x i32> + return _mm256_shufflehi_epi16(a, 107); +} + +__m256i test_mm256_shufflelo_epi16(__m256i a) { + // CHECK: shufflevector <16 x i16> %{{.*}}, <16 x i16> undef, <16 x i32> + return _mm256_shufflelo_epi16(a, 83); +} + +__m256i test_mm256_sign_epi8(__m256i a, __m256i b) { + // CHECK: @llvm.x86.avx2.psign.b + return _mm256_sign_epi8(a, b); +} + +__m256i test_mm256_sign_epi16(__m256i a, __m256i b) { + // CHECK: @llvm.x86.avx2.psign.w + return _mm256_sign_epi16(a, b); +} + +__m256i test_mm256_sign_epi32(__m256i a, __m256i b) { + // CHECK: @llvm.x86.avx2.psign.d + return _mm256_sign_epi32(a, b); +} + +__m256i test_mm256_slli_si256(__m256i a) { + // CHECK: @llvm.x86.avx2.psll.dq + return _mm256_slli_si256(a, 3); +} + +__m256i test_mm256_slli_epi16(__m256i a) { + // CHECK: @llvm.x86.avx2.pslli.w + return _mm256_slli_epi16(a, 3); +} + +__m256i test_mm256_sll_epi16(__m256i a, __m128i b) { + // CHECK: @llvm.x86.avx2.psll.w + return _mm256_sll_epi16(a, b); +} + +__m256i test_mm256_slli_epi32(__m256i a) { + // CHECK: @llvm.x86.avx2.pslli.d + return _mm256_slli_epi32(a, 3); +} + +__m256i test_mm256_sll_epi32(__m256i a, __m128i b) { + // CHECK: @llvm.x86.avx2.psll.d + return _mm256_sll_epi32(a, b); +} + +__m256i test_mm256_slli_epi64(__m256i a) { + // CHECK: @llvm.x86.avx2.pslli.q + return _mm256_slli_epi64(a, 3); +} + +__m256i test_mm256_sll_epi64(__m256i a, __m128i b) { + // CHECK: @llvm.x86.avx2.psll.q + return _mm256_sll_epi64(a, b); +} + +__m256i test_mm256_srai_epi16(__m256i a) { + // CHECK: @llvm.x86.avx2.psrai.w + return _mm256_srai_epi16(a, 3); +} + +__m256i test_mm256_sra_epi16(__m256i a, __m128i b) { + // CHECK: @llvm.x86.avx2.psra.w + return _mm256_sra_epi16(a, b); +} + +__m256i test_mm256_srai_epi32(__m256i a) { + // CHECK: @llvm.x86.avx2.psrai.d + return _mm256_srai_epi32(a, 3); +} + +__m256i test_mm256_sra_epi32(__m256i a, __m128i b) { + // CHECK: @llvm.x86.avx2.psra.d + return _mm256_sra_epi32(a, b); +} + +__m256i test_mm256_srli_si256(__m256i a) { + // CHECK: @llvm.x86.avx2.psrl.dq + return _mm256_srli_si256(a, 3); +} + +__m256i test_mm256_srli_epi16(__m256i a) { + // CHECK: @llvm.x86.avx2.psrli.w + return _mm256_srli_epi16(a, 3); +} + +__m256i test_mm256_srl_epi16(__m256i a, __m128i b) { + // CHECK: @llvm.x86.avx2.psrl.w + return _mm256_srl_epi16(a, b); +} + +__m256i test_mm256_srli_epi32(__m256i a) { + // CHECK: @llvm.x86.avx2.psrli.d + return _mm256_srli_epi32(a, 3); +} + +__m256i test_mm256_srl_epi32(__m256i a, __m128i b) { + // CHECK: @llvm.x86.avx2.psrl.d + return _mm256_srl_epi32(a, b); +} + +__m256i test_mm256_srli_epi64(__m256i a) { + // CHECK: @llvm.x86.avx2.psrli.q + return _mm256_srli_epi64(a, 3); +} + +__m256i test_mm256_srl_epi64(__m256i a, __m128i b) { + // CHECK: @llvm.x86.avx2.psrl.q + return _mm256_srl_epi64(a, b); +}