diff options
author | Robert Khasanov <rob.khasanov@gmail.com> | 2014-09-19 10:17:06 +0000 |
---|---|---|
committer | Robert Khasanov <rob.khasanov@gmail.com> | 2014-09-19 10:17:06 +0000 |
commit | e78020210a782def1570f7e2adef94b2b647cc0d (patch) | |
tree | e848245289ded9468fd4a7ceef8bebe4e33fa6b2 | |
parent | 4a280f638538a6db1fc311eab5eaf7c761db4eae (diff) | |
download | clang-e78020210a782def1570f7e2adef94b2b647cc0d.tar.gz |
[x86] Added _addcarryx_u32, _addcarryx_u64 intrinsics
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@218117 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | include/clang/Basic/BuiltinsX86.def | 4 | ||||
-rw-r--r-- | lib/Headers/CMakeLists.txt | 1 | ||||
-rw-r--r-- | lib/Headers/adxintrin.h | 49 | ||||
-rw-r--r-- | lib/Headers/immintrin.h | 4 | ||||
-rw-r--r-- | test/CodeGen/adx-builtins.c | 17 |
5 files changed, 75 insertions, 0 deletions
diff --git a/include/clang/Basic/BuiltinsX86.def b/include/clang/Basic/BuiltinsX86.def index 4180dbe348..0cced4cfbd 100644 --- a/include/clang/Basic/BuiltinsX86.def +++ b/include/clang/Basic/BuiltinsX86.def @@ -625,6 +625,10 @@ BUILTIN(__builtin_ia32_rdrand16_step, "UiUs*", "") BUILTIN(__builtin_ia32_rdrand32_step, "UiUi*", "") BUILTIN(__builtin_ia32_rdrand64_step, "UiULLi*", "") +// ADX +BUILTIN(__builtin_ia32_addcarryx_u32, "UcUcUiUiUi*", "") +BUILTIN(__builtin_ia32_addcarryx_u64, "UcUcULLiULLiULLi*", "") + // RDSEED BUILTIN(__builtin_ia32_rdseed16_step, "UiUs*", "") BUILTIN(__builtin_ia32_rdseed32_step, "UiUi*", "") diff --git a/lib/Headers/CMakeLists.txt b/lib/Headers/CMakeLists.txt index 5b3b49f9ad..d23e2122e3 100644 --- a/lib/Headers/CMakeLists.txt +++ b/lib/Headers/CMakeLists.txt @@ -1,4 +1,5 @@ set(files + adxintrin.h altivec.h ammintrin.h arm_acle.h diff --git a/lib/Headers/adxintrin.h b/lib/Headers/adxintrin.h new file mode 100644 index 0000000000..650279e8f7 --- /dev/null +++ b/lib/Headers/adxintrin.h @@ -0,0 +1,49 @@ +/*===---- adxintrin.h - ADX 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 <adxintrin.h> directly; include <immintrin.h> instead." +#endif + +#ifndef __ADXINTRIN_H +#define __ADXINTRIN_H + +#ifdef __ADX__ +static __inline unsigned char __attribute__((__always_inline__, __nodebug__)) +_addcarryx_u32(unsigned char __cf, unsigned int __x, unsigned int __y, + unsigned int *__p) +{ + return __builtin_ia32_addcarryx_u32(__cf, __x, __y, __p); +} + +#ifdef __x86_64__ +static __inline unsigned char __attribute__((__always_inline__, __nodebug__)) +_addcarryx_u64(unsigned char __cf, unsigned long __x, unsigned long __y, + unsigned long long *__p) +{ + return __builtin_ia32_addcarryx_u64(__cf, __x, __y, __p); +} +#endif +#endif + +#endif /* __ADXINTRIN_H */ diff --git a/lib/Headers/immintrin.h b/lib/Headers/immintrin.h index 00121f4856..38c020604a 100644 --- a/lib/Headers/immintrin.h +++ b/lib/Headers/immintrin.h @@ -123,4 +123,8 @@ _xtest(void) #include <shaintrin.h> #endif +/* Some intrinsics inside adxintrin.h are available only if __ADX__ defined, + * whereas others are also available if __ADX__ undefined */ +#include <adxintrin.h> + #endif /* __IMMINTRIN_H */ diff --git a/test/CodeGen/adx-builtins.c b/test/CodeGen/adx-builtins.c new file mode 100644 index 0000000000..65b4dfd5f5 --- /dev/null +++ b/test/CodeGen/adx-builtins.c @@ -0,0 +1,17 @@ +// RUN: %clang_cc1 -triple x86_64-unknown-unknown -ffreestanding -target-feature +adx -emit-llvm -o - %s | FileCheck %s + +#include <x86intrin.h> + +unsigned char test_addcarryx_u32(unsigned char __cf, unsigned int __x, + unsigned int __y, unsigned int *__p) { +// CHECK-LABEL: test_addcarryx_u32 +// CHECK: call i8 @llvm.x86.addcarryx.u32 + return _addcarryx_u32(__cf, __x, __y, __p); +} + +unsigned char test_addcarryx_u64(unsigned char __cf, unsigned long __x, + unsigned long __y, unsigned long long *__p) { +// CHECK-LABEL: test_addcarryx_u64 +// CHECK: call i8 @llvm.x86.addcarryx.u64 + return _addcarryx_u64(__cf, __x, __y, __p); +} |