From 925be547b163675b312e3cac0cc7f37f31d787c1 Mon Sep 17 00:00:00 2001 From: Craig Topper <craig.topper@gmail.com> Date: Mon, 19 Dec 2011 05:04:33 +0000 Subject: [PATCH] Begin adding AVX2 intrinsics. Necessitated increasing the number of bits used to store builtinID when serializing identifier table. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@146855 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/clang/Basic/BuiltinsX86.def | 16 +++- lib/Headers/CMakeLists.txt | 1 + lib/Headers/avx2intrin.h | 119 ++++++++++++++++++++++++++++ lib/Headers/immintrin.h | 4 + lib/Serialization/ASTReader.cpp | 4 +- lib/Serialization/ASTWriter.cpp | 1 + test/CodeGen/avx2-builtins.c | 86 ++++++++++++++++++++ 7 files changed, 226 insertions(+), 5 deletions(-) create mode 100644 lib/Headers/avx2intrin.h create mode 100644 test/CodeGen/avx2-builtins.c diff --git a/include/clang/Basic/BuiltinsX86.def b/include/clang/Basic/BuiltinsX86.def index 2a733109547..a67de2d8668 100644 --- a/include/clang/Basic/BuiltinsX86.def +++ b/include/clang/Basic/BuiltinsX86.def @@ -220,9 +220,9 @@ BUILTIN(__builtin_ia32_pmaxub128, "V16cV16cV16c", "") BUILTIN(__builtin_ia32_pmaxsw128, "V8sV8sV8s", "") BUILTIN(__builtin_ia32_pminub128, "V16cV16cV16c", "") BUILTIN(__builtin_ia32_pminsw128, "V8sV8sV8s", "") -BUILTIN(__builtin_ia32_packsswb128, "V8sV8sV8s", "") -BUILTIN(__builtin_ia32_packssdw128, "V4iV4iV4i", "") -BUILTIN(__builtin_ia32_packuswb128, "V8sV8sV8s", "") +BUILTIN(__builtin_ia32_packsswb128, "V16cV8sV8s", "") +BUILTIN(__builtin_ia32_packssdw128, "V8sV4iV4i", "") +BUILTIN(__builtin_ia32_packuswb128, "V16cV8sV8s", "") BUILTIN(__builtin_ia32_pmulhuw128, "V8sV8sV8s", "") BUILTIN(__builtin_ia32_addsubps, "V4fV4fV4f", "") BUILTIN(__builtin_ia32_addsubpd, "V2dV2dV2d", "") @@ -481,4 +481,14 @@ BUILTIN(__builtin_ia32_maskstoreps, "vV4f*V4fV4f", "") BUILTIN(__builtin_ia32_maskstorepd256, "vV4d*V4dV4d", "") BUILTIN(__builtin_ia32_maskstoreps256, "vV8f*V8fV8f", "") +// AVX2 +BUILTIN(__builtin_ia32_mpsadbw256, "V32cV32cV32ci", "") +BUILTIN(__builtin_ia32_pabsb256, "V32cV32c", "") +BUILTIN(__builtin_ia32_pabsw256, "V16sV16s", "") +BUILTIN(__builtin_ia32_pabsd256, "V8iV8i", "") +BUILTIN(__builtin_ia32_packsswb256, "V32cV16sV16s", "") +BUILTIN(__builtin_ia32_packssdw256, "V16sV8iV8i", "") +BUILTIN(__builtin_ia32_packuswb256, "V32cV16sV16s", "") +BUILTIN(__builtin_ia32_packusdw256, "V16sV8iV8i", "") + #undef BUILTIN diff --git a/lib/Headers/CMakeLists.txt b/lib/Headers/CMakeLists.txt index af038301635..b3fb6058d46 100644 --- a/lib/Headers/CMakeLists.txt +++ b/lib/Headers/CMakeLists.txt @@ -1,6 +1,7 @@ set(files altivec.h avxintrin.h + avx2intrin.h emmintrin.h float.h immintrin.h diff --git a/lib/Headers/avx2intrin.h b/lib/Headers/avx2intrin.h new file mode 100644 index 00000000000..1cfcac5c296 --- /dev/null +++ b/lib/Headers/avx2intrin.h @@ -0,0 +1,119 @@ +/*===---- avx2intrin.h - AVX2 intrinsics -----------------------------------=== + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + * + *===-----------------------------------------------------------------------=== + */ + +#ifndef __IMMINTRIN_H +#error "Never use <avx2intrin.h> directly; include <immintrin.h> instead." +#endif + +/* SSE4 Multiple Packed Sums of Absolute Difference. */ +#define _mm256_mpsadbw_epu8(X, Y, M) __builtin_ia32_mpsadbw256((X), (Y), (M)) + +static __inline__ __m256i __attribute__((__always_inline__, __nodebug__)) +_mm256_abs_epi8(__m256i a) +{ + return (__m256i)__builtin_ia32_pabsb256((__v32qi)a); +} + +static __inline__ __m256i __attribute__((__always_inline__, __nodebug__)) +_mm256_abs_epi16(__m256i a) +{ + return (__m256i)__builtin_ia32_pabsw256((__v16hi)a); +} + +static __inline__ __m256i __attribute__((__always_inline__, __nodebug__)) +_mm256_abs_epi32(__m256i a) +{ + return (__m256i)__builtin_ia32_pabsd256((__v8si)a); +} + +static __inline__ __m256i __attribute__((__always_inline__, __nodebug__)) +_mm256_packs_epi16(__m256i a, __m256i b) +{ + return (__m256i)__builtin_ia32_packsswb256((__v16hi)a, (__v16hi)b); +} + +static __inline__ __m256i __attribute__((__always_inline__, __nodebug__)) +_mm256_packs_epi32(__m256i a, __m256i b) +{ + return (__m256i)__builtin_ia32_packssdw256((__v8si)a, (__v8si)b); +} + +static __inline__ __m256i __attribute__((__always_inline__, __nodebug__)) +_mm256_packus_epi16(__m256i a, __m256i b) +{ + return (__m256i)__builtin_ia32_packuswb256((__v16hi)a, (__v16hi)b); +} + +static __inline__ __m256i __attribute__((__always_inline__, __nodebug__)) +_mm256_packus_epi32(__m256i __V1, __m256i __V2) +{ + return (__m256i) __builtin_ia32_packusdw256((__v8si)__V1, (__v8si)__V2); +} + +static __inline__ __m256i __attribute__((__always_inline__, __nodebug__)) +_mm256_add_epi8(__m256i a, __m256i b) +{ + return (__m256i)((__v32qi)a + (__v32qi)b); +} + +static __inline__ __m256i __attribute__((__always_inline__, __nodebug__)) +_mm256_add_epi16(__m256i a, __m256i b) +{ + return (__m256i)((__v16hi)a + (__v16hi)b); +} + +static __inline__ __m256i __attribute__((__always_inline__, __nodebug__)) +_mm256_add_epi32(__m256i a, __m256i b) +{ + return (__m256i)((__v8si)a + (__v8si)b); +} + +static __inline__ __m256i __attribute__((__always_inline__, __nodebug__)) +_mm256_add_epi64(__m256i a, __m256i b) +{ + return a + b; +} + +static __inline__ __m256i __attribute__((__always_inline__, __nodebug__)) +_mm256_sub_epi8(__m256i a, __m256i b) +{ + return (__m256i)((__v32qi)a - (__v32qi)b); +} + +static __inline__ __m256i __attribute__((__always_inline__, __nodebug__)) +_mm256_sub_epi16(__m256i a, __m256i b) +{ + return (__m256i)((__v16hi)a - (__v16hi)b); +} + +static __inline__ __m256i __attribute__((__always_inline__, __nodebug__)) +_mm256_sub_epi32(__m256i a, __m256i b) +{ + return (__m256i)((__v8si)a - (__v8si)b); +} + +static __inline__ __m256i __attribute__((__always_inline__, __nodebug__)) +_mm256_sub_epi64(__m256i a, __m256i b) +{ + return a - b; +} diff --git a/lib/Headers/immintrin.h b/lib/Headers/immintrin.h index a19deaac6db..80b24484a63 100644 --- a/lib/Headers/immintrin.h +++ b/lib/Headers/immintrin.h @@ -56,4 +56,8 @@ #include <avxintrin.h> #endif +#ifdef __AVX2__ +#include <avx2intrin.h> +#endif + #endif /* __IMMINTRIN_H */ diff --git a/lib/Serialization/ASTReader.cpp b/lib/Serialization/ASTReader.cpp index 64414c91675..b782c184b96 100644 --- a/lib/Serialization/ASTReader.cpp +++ b/lib/Serialization/ASTReader.cpp @@ -529,8 +529,8 @@ IdentifierInfo *ASTIdentifierLookupTrait::ReadData(const internal_key_type& k, Bits >>= 1; bool hasMacroDefinition = Bits & 0x01; Bits >>= 1; - unsigned ObjCOrBuiltinID = Bits & 0x3FF; - Bits >>= 10; + unsigned ObjCOrBuiltinID = Bits & 0x7FF; + Bits >>= 11; assert(Bits == 0 && "Extra bits in the identifier?"); DataLen -= 6; diff --git a/lib/Serialization/ASTWriter.cpp b/lib/Serialization/ASTWriter.cpp index bb2b1cb5b08..e1af601614d 100644 --- a/lib/Serialization/ASTWriter.cpp +++ b/lib/Serialization/ASTWriter.cpp @@ -2519,6 +2519,7 @@ public: uint32_t Bits = 0; bool HasMacroDefinition = hasMacroDefinition(II, Macro); Bits = (uint32_t)II->getObjCOrBuiltinID(); + assert((Bits & 0x7ff) == Bits && "ObjCOrBuiltinID too big for ASTReader."); Bits = (Bits << 1) | unsigned(HasMacroDefinition); Bits = (Bits << 1) | unsigned(II->isExtensionToken()); Bits = (Bits << 1) | unsigned(II->isPoisoned()); diff --git a/test/CodeGen/avx2-builtins.c b/test/CodeGen/avx2-builtins.c new file mode 100644 index 00000000000..0d9a1a76444 --- /dev/null +++ b/test/CodeGen/avx2-builtins.c @@ -0,0 +1,86 @@ +// RUN: %clang_cc1 %s -O3 -triple=x86_64-apple-darwin -target-feature +avx2 -emit-llvm -o - | FileCheck %s + +// Don't include mm_malloc.h, it's system specific. +#define __MM_MALLOC_H + +#include <immintrin.h> + +__m256 test_mm256_mpsadbw_epu8(__m256 x, __m256 y) { + // CHECK: @llvm.x86.avx2.mpsadbw({{.*}}, {{.*}}, i32 3) + return _mm256_mpsadbw_epu8(x, y, 3); +} + +__m256 test_mm256_abs_epi8(__m256 a) { + // CHECK: @llvm.x86.avx2.pabs.b + return _mm256_abs_epi8(a); +} + +__m256 test_mm256_abs_epi16(__m256 a) { + // CHECK: @llvm.x86.avx2.pabs.w + return _mm256_abs_epi16(a); +} + +__m256 test_mm256_abs_epi32(__m256 a) { + // CHECK: @llvm.x86.avx2.pabs.d + return _mm256_abs_epi32(a); +} + +__m256 test_mm256_packs_epi16(__m256 a, __m256 b) { + // CHECK: @llvm.x86.avx2.packsswb + return _mm256_packs_epi16(a, b); +} + +__m256 test_mm256_packs_epi32(__m256 a, __m256 b) { + // CHECK: @llvm.x86.avx2.packssdw + return _mm256_packs_epi32(a, b); +} + +__m256 test_mm256_packs_epu16(__m256 a, __m256 b) { + // CHECK: @llvm.x86.avx2.packuswb + return _mm256_packus_epi16(a, b); +} + +__m256 test_mm256_packs_epu32(__m256 a, __m256 b) { + // CHECK: @llvm.x86.avx2.packusdw + return _mm256_packus_epi32(a, b); +} + +__m256 test_mm256_add_epi8(__m256 a, __m256 b) { + // CHECK: add <32 x i8> + return _mm256_add_epi8(a, b); +} + +__m256 test_mm256_add_epi16(__m256 a, __m256 b) { + // CHECK: add <16 x i16> + return _mm256_add_epi16(a, b); +} + +__m256 test_mm256_add_epi32(__m256 a, __m256 b) { + // CHECK: add <8 x i32> + return _mm256_add_epi32(a, b); +} + +__m256 test_mm256_add_epi64(__m256 a, __m256 b) { + // CHECK: add <4 x i64> + return _mm256_add_epi64(a, b); +} + +__m256 test_mm256_sub_epi8(__m256 a, __m256 b) { + // CHECK: sub <32 x i8> + return _mm256_sub_epi8(a, b); +} + +__m256 test_mm256_sub_epi16(__m256 a, __m256 b) { + // CHECK: sub <16 x i16> + return _mm256_sub_epi16(a, b); +} + +__m256 test_mm256_sub_epi32(__m256 a, __m256 b) { + // CHECK: sub <8 x i32> + return _mm256_sub_epi32(a, b); +} + +__m256 test_mm256_sub_epi64(__m256 a, __m256 b) { + // CHECK: sub <4 x i64> + return _mm256_sub_epi64(a, b); +} -- GitLab