From: Craig Topper Date: Sat, 24 Dec 2011 03:58:43 +0000 (+0000) Subject: Intrinsics for AVX2 unpack instructions. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=7f16caa3c087dbc51585ec4bb6e154c10516944d;p=clang Intrinsics for AVX2 unpack instructions. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@147237 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Headers/avx2intrin.h b/lib/Headers/avx2intrin.h index 5932f37895..e3fc0659e5 100644 --- a/lib/Headers/avx2intrin.h +++ b/lib/Headers/avx2intrin.h @@ -671,6 +671,54 @@ _mm256_subs_epu16(__m256i a, __m256i b) return (__m256i)__builtin_ia32_psubusw256((__v16hi)a, (__v16hi)b); } +static __inline__ __m256i __attribute__((__always_inline__, __nodebug__)) +_mm256_unpackhi_epi8(__m256i a, __m256i b) +{ + return (__m256i)__builtin_shufflevector((__v32qi)a, (__v32qi)b, 8, 32+8, 9, 32+9, 10, 32+10, 11, 32+11, 12, 32+12, 13, 32+13, 14, 32+14, 15, 32+15, 24, 32+24, 25, 32+25, 26, 32+26, 27, 32+27, 28, 32+28, 29, 32+29, 30, 32+30, 31, 32+31); +} + +static __inline__ __m256i __attribute__((__always_inline__, __nodebug__)) +_mm256_unpackhi_epi16(__m256i a, __m256i b) +{ + return (__m256i)__builtin_shufflevector((__v16hi)a, (__v16hi)b, 4, 16+4, 5, 16+5, 6, 16+6, 7, 16+7, 12, 16+12, 13, 16+13, 14, 16+14, 15, 16+15); +} + +static __inline__ __m256i __attribute__((__always_inline__, __nodebug__)) +_mm256_unpackhi_epi32(__m256i a, __m256i b) +{ + return (__m256i)__builtin_shufflevector((__v8si)a, (__v8si)b, 2, 8+2, 3, 8+3, 6, 8+6, 7, 8+7); +} + +static __inline__ __m256i __attribute__((__always_inline__, __nodebug__)) +_mm256_unpackhi_epi64(__m256i a, __m256i b) +{ + return (__m256i)__builtin_shufflevector(a, b, 1, 4+1, 3, 4+3); +} + +static __inline__ __m256i __attribute__((__always_inline__, __nodebug__)) +_mm256_unpacklo_epi8(__m256i a, __m256i b) +{ + return (__m256i)__builtin_shufflevector((__v32qi)a, (__v32qi)b, 0, 32+0, 1, 32+1, 2, 32+2, 3, 32+3, 4, 32+4, 5, 32+5, 6, 32+6, 7, 32+7, 16, 32+16, 17, 32+17, 18, 32+18, 19, 32+19, 20, 32+20, 21, 32+21, 22, 32+22, 23, 32+23); +} + +static __inline__ __m256i __attribute__((__always_inline__, __nodebug__)) +_mm256_unpacklo_epi16(__m256i a, __m256i b) +{ + return (__m256i)__builtin_shufflevector((__v16hi)a, (__v16hi)b, 0, 16+0, 1, 16+1, 2, 16+2, 3, 16+3, 8, 16+8, 9, 16+9, 10, 16+10, 11, 16+11); +} + +static __inline__ __m256i __attribute__((__always_inline__, __nodebug__)) +_mm256_unpacklo_epi32(__m256i a, __m256i b) +{ + return (__m256i)__builtin_shufflevector((__v8si)a, (__v8si)b, 0, 8+0, 1, 8+1, 4, 8+4, 5, 8+5); +} + +static __inline__ __m256i __attribute__((__always_inline__, __nodebug__)) +_mm256_unpacklo_epi64(__m256i a, __m256i b) +{ + return (__m256i)__builtin_shufflevector(a, b, 0, 4+0, 2, 4+2); +} + static __inline__ __m256i __attribute__((__always_inline__, __nodebug__)) _mm256_xor_si256(__m256i a, __m256i b) { diff --git a/test/CodeGen/avx2-builtins.c b/test/CodeGen/avx2-builtins.c index 1f6edc1025..aac2b28301 100644 --- a/test/CodeGen/avx2-builtins.c +++ b/test/CodeGen/avx2-builtins.c @@ -540,3 +540,43 @@ __m256i test_mm256_srl_epi64(__m256i a, __m128i b) { // CHECK: @llvm.x86.avx2.psrl.q return _mm256_srl_epi64(a, b); } + +__m256i test_mm256_unpackhi_epi8(__m256i a, __m256i b) { + // CHECK: shufflevector <32 x i8> %{{.*}}, <32 x i8> %{{.*}}, <32 x i32> + return _mm256_unpackhi_epi8(a, b); +} + +__m256i test_mm256_unpackhi_epi16(__m256i a, __m256i b) { + // CHECK: shufflevector <16 x i16> %{{.*}}, <16 x i16> %{{.*}}, <16 x i32> + return _mm256_unpackhi_epi16(a, b); +} + +__m256i test_mm256_unpackhi_epi32(__m256i a, __m256i b) { + // CHECK: shufflevector <8 x i32> %{{.*}}, <8 x i32> %{{.*}}, <8 x i32> + return _mm256_unpackhi_epi32(a, b); +} + +__m256i test_mm256_unpackhi_epi64(__m256i a, __m256i b) { + // CHECK: shufflevector <4 x i64> %{{.*}}, <4 x i64> %{{.*}}, <4 x i32> + return _mm256_unpackhi_epi64(a, b); +} + +__m256i test_mm256_unpacklo_epi8(__m256i a, __m256i b) { + // CHECK: shufflevector <32 x i8> %{{.*}}, <32 x i8> %{{.*}}, <32 x i32> + return _mm256_unpacklo_epi8(a, b); +} + +__m256i test_mm256_unpacklo_epi16(__m256i a, __m256i b) { + // CHECK: shufflevector <16 x i16> %{{.*}}, <16 x i16> %{{.*}}, <16 x i32> + return _mm256_unpacklo_epi16(a, b); +} + +__m256i test_mm256_unpacklo_epi32(__m256i a, __m256i b) { + // CHECK: shufflevector <8 x i32> %{{.*}}, <8 x i32> %{{.*}}, <8 x i32> + return _mm256_unpacklo_epi32(a, b); +} + +__m256i test_mm256_unpacklo_epi64(__m256i a, __m256i b) { + // CHECK: shufflevector <4 x i64> %{{.*}}, <4 x i64> %{{.*}}, <4 x i32> + return _mm256_unpacklo_epi64(a, b); +}