Please implement _bit_scan_forward and _bit_scan_reverse in terms of __builtin_ctz and __builtin_clz.
On Wed, Jun 1, 2016 at 5:21 AM, Michael Zuckerman via cfe-commits < cfe-commits@lists.llvm.org> wrote: > Author: mzuckerm > Date: Wed Jun 1 07:21:00 2016 > New Revision: 271387 > > URL: http://llvm.org/viewvc/llvm-project?rev=271387&view=rev > Log: > Adding front-end support to several intrinsics (bit scanning, conversion > and state reading intrinsics) > > > Adding LLVM front-end support to two intrinsics dealing with bit scan: > _bit_scan_forward and _bit_scan_reverse. > Their functionality is as described in Intel intrinsics guide: > > https://software.intel.com/sites/landingpage/IntrinsicsGuide/#text=_bit_scan_forward&expand=371,370 > > https://software.intel.com/sites/landingpage/IntrinsicsGuide/#text=_bit_scan_reverse&expand=371,370 > > Furthermore, adding clang front-end support to these conversion > intrinsics: _mm256_cvtsd_f64, _mm256_cvtsi256_si32 and _mm256_cvtss_f32. > > Finally, adding tests to all of the above, as well as to the state > reading intrinsics _rdpmc and _rdtsc. > Their functionality is also specified in the Intel intrinsics guide. > > > Commit on behalf of Omer Paparo Bivas > > > Added: > cfe/trunk/test/CodeGen/bitscan-builtins.c > cfe/trunk/test/CodeGen/rd-builtins.c > Modified: > cfe/trunk/include/clang/Basic/BuiltinsX86.def > cfe/trunk/lib/Headers/avxintrin.h > cfe/trunk/lib/Headers/ia32intrin.h > cfe/trunk/lib/Headers/immintrin.h > cfe/trunk/test/CodeGen/avx-builtins.c > > Modified: cfe/trunk/include/clang/Basic/BuiltinsX86.def > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/BuiltinsX86.def?rev=271387&r1=271386&r2=271387&view=diff > > ============================================================================== > --- cfe/trunk/include/clang/Basic/BuiltinsX86.def (original) > +++ cfe/trunk/include/clang/Basic/BuiltinsX86.def Wed Jun 1 07:21:00 2016 > @@ -35,6 +35,10 @@ BUILTIN(__builtin_ms_va_start, "vc*&.", > 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", "") > > Modified: cfe/trunk/lib/Headers/avxintrin.h > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Headers/avxintrin.h?rev=271387&r1=271386&r2=271387&view=diff > > ============================================================================== > --- cfe/trunk/lib/Headers/avxintrin.h (original) > +++ cfe/trunk/lib/Headers/avxintrin.h Wed Jun 1 07:21:00 2016 > @@ -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) > > Modified: cfe/trunk/lib/Headers/ia32intrin.h > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Headers/ia32intrin.h?rev=271387&r1=271386&r2=271387&view=diff > > ============================================================================== > --- cfe/trunk/lib/Headers/ia32intrin.h (original) > +++ cfe/trunk/lib/Headers/ia32intrin.h Wed Jun 1 07:21:00 2016 > @@ -74,4 +74,6 @@ __rdtscp(unsigned int *__A) { > > #define _rdtsc() __rdtsc() > > +#define _rdpmc(A) __rdpmc(A) > + > #endif /* __IA32INTRIN_H */ > > Modified: cfe/trunk/lib/Headers/immintrin.h > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Headers/immintrin.h?rev=271387&r1=271386&r2=271387&view=diff > > ============================================================================== > --- cfe/trunk/lib/Headers/immintrin.h (original) > +++ cfe/trunk/lib/Headers/immintrin.h Wed Jun 1 07:21:00 2016 > @@ -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__ */ > > > Modified: cfe/trunk/test/CodeGen/avx-builtins.c > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGen/avx-builtins.c?rev=271387&r1=271386&r2=271387&view=diff > > ============================================================================== > --- cfe/trunk/test/CodeGen/avx-builtins.c (original) > +++ cfe/trunk/test/CodeGen/avx-builtins.c Wed Jun 1 07:21:00 2016 > @@ -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); > +} > > Added: cfe/trunk/test/CodeGen/bitscan-builtins.c > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGen/bitscan-builtins.c?rev=271387&view=auto > > ============================================================================== > --- cfe/trunk/test/CodeGen/bitscan-builtins.c (added) > +++ cfe/trunk/test/CodeGen/bitscan-builtins.c Wed Jun 1 07:21:00 2016 > @@ -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 > +} > > Added: cfe/trunk/test/CodeGen/rd-builtins.c > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGen/rd-builtins.c?rev=271387&view=auto > > ============================================================================== > --- cfe/trunk/test/CodeGen/rd-builtins.c (added) > +++ cfe/trunk/test/CodeGen/rd-builtins.c Wed Jun 1 07:21:00 2016 > @@ -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 > +} > > > _______________________________________________ > cfe-commits mailing list > cfe-commits@lists.llvm.org > http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits >
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits