diff --git a/include/clang/Basic/BuiltinsX86.def b/include/clang/Basic/BuiltinsX86.def index a5580612ff95c95b723ad6aeb9aa45e9e3ed13ef..b4c44437d907cfb34b6a323383f02400f5fbf23f 100644 --- a/include/clang/Basic/BuiltinsX86.def +++ b/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/lib/Headers/avxintrin.h b/lib/Headers/avxintrin.h index 8bb1b55e1e4b5143dba652700c379dd8ec4b075c..6a7a4b903a6f87d4a4e201c88becfc82cdc82fc1 100644 --- a/lib/Headers/avxintrin.h +++ b/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/lib/Headers/ia32intrin.h b/lib/Headers/ia32intrin.h index b2f82bb59e38a3c95c0bd868595679a6b89aade7..397f3fd13e010d3cd869af09a67a0c10b08fbe2c 100644 --- a/lib/Headers/ia32intrin.h +++ b/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/lib/Headers/immintrin.h b/lib/Headers/immintrin.h index d6c6ae5e4c57ffe379f5850e30cc1732735941ba..7ed2035761db0f7c38e3c39e4d2af1a8a16ed1c0 100644 --- a/lib/Headers/immintrin.h +++ b/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/test/CodeGen/avx-builtins.c b/test/CodeGen/avx-builtins.c index e15e22a2ed6f3c043b638dabae8c101e909f2a4d..c1b8cf2c919aa11074e10cf74274abff319479f9 100644 --- a/test/CodeGen/avx-builtins.c +++ b/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/test/CodeGen/bitscan-builtins.c b/test/CodeGen/bitscan-builtins.c new file mode 100644 index 0000000000000000000000000000000000000000..85a75426342b07fae057f2c02fefb432992f08e2 --- /dev/null +++ b/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/test/CodeGen/rd-builtins.c b/test/CodeGen/rd-builtins.c new file mode 100644 index 0000000000000000000000000000000000000000..5cad903909419c6665ddaab7501b96fc49830882 --- /dev/null +++ b/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 +}