diff options
-rw-r--r-- | clang/include/clang/Basic/BuiltinsX86.def | 4 | ||||
-rw-r--r-- | clang/lib/Headers/avxintrin.h | 19 | ||||
-rw-r--r-- | clang/lib/Headers/ia32intrin.h | 2 | ||||
-rw-r--r-- | clang/lib/Headers/immintrin.h | 13 | ||||
-rw-r--r-- | clang/test/CodeGen/avx-builtins.c | 21 | ||||
-rw-r--r-- | clang/test/CodeGen/bitscan-builtins.c | 17 | ||||
-rw-r--r-- | clang/test/CodeGen/rd-builtins.c | 18 |
7 files changed, 94 insertions, 0 deletions
diff --git a/clang/include/clang/Basic/BuiltinsX86.def b/clang/include/clang/Basic/BuiltinsX86.def index a5580612ff9..b4c44437d90 100644 --- a/clang/include/clang/Basic/BuiltinsX86.def +++ b/clang/include/clang/Basic/BuiltinsX86.def @@ -35,6 +35,10 @@ BUILTIN(__builtin_ms_va_start, "vc*&.", "nt") BUILTIN(__builtin_ms_va_end, "vc*&", "n") BUILTIN(__builtin_ms_va_copy, "vc*&c*&", "n") +// Bit scan +TARGET_BUILTIN(__builtin_ia32_bit_scan_forward, "ii", "", "") +TARGET_BUILTIN(__builtin_ia32_bit_scan_reverse, "ii", "", "") + // Undefined Values // TARGET_BUILTIN(__builtin_ia32_undef128, "V2d", "nc", "") diff --git a/clang/lib/Headers/avxintrin.h b/clang/lib/Headers/avxintrin.h index 8bb1b55e1e4..6a7a4b903a6 100644 --- a/clang/lib/Headers/avxintrin.h +++ b/clang/lib/Headers/avxintrin.h @@ -2123,6 +2123,25 @@ _mm256_cvttps_epi32(__m256 __a) return (__m256i)__builtin_ia32_cvttps2dq256((__v8sf) __a); } +static __inline double __DEFAULT_FN_ATTRS +_mm256_cvtsd_f64(__m256d __a) +{ + return __a[0]; +} + +static __inline int __DEFAULT_FN_ATTRS +_mm256_cvtsi256_si32(__m256i __a) +{ + __v8si __b = (__v8si)__a; + return __b[0]; +} + +static __inline float __DEFAULT_FN_ATTRS +_mm256_cvtss_f32(__m256 __a) +{ + return __a[0]; +} + /* Vector replicate */ static __inline __m256 __DEFAULT_FN_ATTRS _mm256_movehdup_ps(__m256 __a) diff --git a/clang/lib/Headers/ia32intrin.h b/clang/lib/Headers/ia32intrin.h index b2f82bb59e3..397f3fd13e0 100644 --- a/clang/lib/Headers/ia32intrin.h +++ b/clang/lib/Headers/ia32intrin.h @@ -74,4 +74,6 @@ __rdtscp(unsigned int *__A) { #define _rdtsc() __rdtsc() +#define _rdpmc(A) __rdpmc(A) + #endif /* __IA32INTRIN_H */ diff --git a/clang/lib/Headers/immintrin.h b/clang/lib/Headers/immintrin.h index d6c6ae5e4c5..7ed2035761d 100644 --- a/clang/lib/Headers/immintrin.h +++ b/clang/lib/Headers/immintrin.h @@ -169,6 +169,18 @@ _rdrand32_step(unsigned int *__p) return __builtin_ia32_rdrand32_step(__p); } +/* __bit_scan_forward */ +static __inline__ int __attribute__((__always_inline__, __nodebug__)) +_bit_scan_forward(int __A) { + return __builtin_ia32_bit_scan_forward(__A); +} + +/* __bit_scan_reverse */ +static __inline__ int __attribute__((__always_inline__, __nodebug__)) +_bit_scan_reverse(int __A) { + return __builtin_ia32_bit_scan_reverse(__A); +} + #ifdef __x86_64__ static __inline__ int __attribute__((__always_inline__, __nodebug__, __target__("rdrnd"))) _rdrand64_step(unsigned long long *__p) @@ -227,6 +239,7 @@ _writegsbase_u64(unsigned long long __V) { return __builtin_ia32_wrgsbase64(__V); } + #endif #endif /* __FSGSBASE__ */ diff --git a/clang/test/CodeGen/avx-builtins.c b/clang/test/CodeGen/avx-builtins.c index e15e22a2ed6..c1b8cf2c919 100644 --- a/clang/test/CodeGen/avx-builtins.c +++ b/clang/test/CodeGen/avx-builtins.c @@ -1385,3 +1385,24 @@ void test_mm256_zeroupper() { // CHECK: call void @llvm.x86.avx.vzeroupper() return _mm256_zeroupper(); } + +double test_mm256_cvtsd_f64(__m256d __a) +{ + // CHECK-LABEL: @test_mm256_cvtsd_f64 + // CHECK: extractelement <4 x double> %{{.*}}, i32 0 + return _mm256_cvtsd_f64(__a); +} + +int test_mm256_cvtsi256_si32(__m256i __a) +{ + // CHECK-LABEL: @test_mm256_cvtsi256_si32 + // CHECK: extractelement <8 x i32> %{{.*}}, i32 0 + return _mm256_cvtsi256_si32(__a); +} + +float test_mm256_cvtss_f32(__m256 __a) +{ + // CHECK-LABEL: @test_mm256_cvtss_f32 + // CHECK: extractelement <8 x float> %{{.*}}, i32 0 + return _mm256_cvtss_f32(__a); +} diff --git a/clang/test/CodeGen/bitscan-builtins.c b/clang/test/CodeGen/bitscan-builtins.c new file mode 100644 index 00000000000..85a75426342 --- /dev/null +++ b/clang/test/CodeGen/bitscan-builtins.c @@ -0,0 +1,17 @@ +// RUN: %clang_cc1 -triple x86_64-unknown-unknown -emit-llvm -o - %s | FileCheck %s + +// Don't include mm_malloc.h, it's system specific. +#define __MM_MALLOC_H +#include <immintrin.h> + +int test_bit_scan_forward(int a) { + return _bit_scan_forward(a); +// CHECK: @test_bit_scan_forward +// CHECK: call i32 @llvm.x86.bit.scan.forward +} + +int test_bit_scan_reverse(int a) { + return _bit_scan_reverse(a); +// CHECK: @test_bit_scan_reverse +// CHECK: call i32 @llvm.x86.bit.scan.reverse +} diff --git a/clang/test/CodeGen/rd-builtins.c b/clang/test/CodeGen/rd-builtins.c new file mode 100644 index 00000000000..5cad9039094 --- /dev/null +++ b/clang/test/CodeGen/rd-builtins.c @@ -0,0 +1,18 @@ +// RUN: %clang_cc1 -triple x86_64-unknown-unknown -emit-llvm -o - %s | FileCheck %s + +// Don't include mm_malloc.h, it's system specific. +#define __MM_MALLOC_H + +#include <x86intrin.h> + +unsigned long long test_rdpmc(int a) { + return _rdpmc(a); +// CHECK: @test_rdpmc +// CHECK: call i64 @llvm.x86.rdpmc +} + +int test_rdtsc() { + return _rdtsc(); +// CHECK: @test_rdtsc +// CHECK: call i64 @llvm.x86.rdtsc +} |