r271387 - Adding front-end support to several intrinsics (bit scanning, conversion and state reading intrinsics)

David Majnemer via cfe-commits cfe-commits at lists.llvm.org
Wed Jun 1 12:48:03 PDT 2016


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 at 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 at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20160601/ec946259/attachment-0001.html>


More information about the cfe-commits mailing list