<div dir="ltr"><span style="font-size:12.8px">Please implement _bit_scan_forward and _bit_scan_reverse in terms of __builtin_ctz and __builtin_clz.</span></div><div class="gmail_extra"><br><div class="gmail_quote">On Wed, Jun 1, 2016 at 5:21 AM, Michael Zuckerman via cfe-commits <span dir="ltr"><<a href="mailto:cfe-commits@lists.llvm.org" target="_blank">cfe-commits@lists.llvm.org</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Author: mzuckerm<br>
Date: Wed Jun  1 07:21:00 2016<br>
New Revision: 271387<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=271387&view=rev" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project?rev=271387&view=rev</a><br>
Log:<br>
Adding front-end support to several intrinsics (bit scanning, conversion and state reading intrinsics)<br>
<br>
<br>
Adding LLVM front-end support to two intrinsics dealing with bit scan: _bit_scan_forward and _bit_scan_reverse.<br>
 Their functionality is as described in Intel intrinsics guide:<br>
 <a href="https://software.intel.com/sites/landingpage/IntrinsicsGuide/#text=_bit_scan_forward&expand=371,370" rel="noreferrer" target="_blank">https://software.intel.com/sites/landingpage/IntrinsicsGuide/#text=_bit_scan_forward&expand=371,370</a><br>
 <a href="https://software.intel.com/sites/landingpage/IntrinsicsGuide/#text=_bit_scan_reverse&expand=371,370" rel="noreferrer" target="_blank">https://software.intel.com/sites/landingpage/IntrinsicsGuide/#text=_bit_scan_reverse&expand=371,370</a><br>
<br>
 Furthermore, adding clang front-end support to these conversion intrinsics: _mm256_cvtsd_f64, _mm256_cvtsi256_si32 and _mm256_cvtss_f32.<br>
<br>
 Finally, adding tests to all of the above, as well as to the state reading intrinsics _rdpmc and _rdtsc.<br>
  Their functionality is also specified in the Intel intrinsics guide.<br>
<br>
<br>
Commit on behalf of Omer Paparo Bivas<br>
<br>
<br>
Added:<br>
    cfe/trunk/test/CodeGen/bitscan-builtins.c<br>
    cfe/trunk/test/CodeGen/rd-builtins.c<br>
Modified:<br>
    cfe/trunk/include/clang/Basic/BuiltinsX86.def<br>
    cfe/trunk/lib/Headers/avxintrin.h<br>
    cfe/trunk/lib/Headers/ia32intrin.h<br>
    cfe/trunk/lib/Headers/immintrin.h<br>
    cfe/trunk/test/CodeGen/avx-builtins.c<br>
<br>
Modified: cfe/trunk/include/clang/Basic/BuiltinsX86.def<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/BuiltinsX86.def?rev=271387&r1=271386&r2=271387&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/BuiltinsX86.def?rev=271387&r1=271386&r2=271387&view=diff</a><br>
==============================================================================<br>
--- cfe/trunk/include/clang/Basic/BuiltinsX86.def (original)<br>
+++ cfe/trunk/include/clang/Basic/BuiltinsX86.def Wed Jun  1 07:21:00 2016<br>
@@ -35,6 +35,10 @@ BUILTIN(__builtin_ms_va_start, "vc*&.",<br>
 BUILTIN(__builtin_ms_va_end, "vc*&", "n")<br>
 BUILTIN(__builtin_ms_va_copy, "vc*&c*&", "n")<br>
<br>
+// Bit scan<br>
+TARGET_BUILTIN(__builtin_ia32_bit_scan_forward, "ii", "", "")<br>
+TARGET_BUILTIN(__builtin_ia32_bit_scan_reverse, "ii", "", "")<br>
+<br>
 // Undefined Values<br>
 //<br>
 TARGET_BUILTIN(__builtin_ia32_undef128, "V2d", "nc", "")<br>
<br>
Modified: cfe/trunk/lib/Headers/avxintrin.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Headers/avxintrin.h?rev=271387&r1=271386&r2=271387&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Headers/avxintrin.h?rev=271387&r1=271386&r2=271387&view=diff</a><br>
==============================================================================<br>
--- cfe/trunk/lib/Headers/avxintrin.h (original)<br>
+++ cfe/trunk/lib/Headers/avxintrin.h Wed Jun  1 07:21:00 2016<br>
@@ -2123,6 +2123,25 @@ _mm256_cvttps_epi32(__m256 __a)<br>
   return (__m256i)__builtin_ia32_cvttps2dq256((__v8sf) __a);<br>
 }<br>
<br>
+static __inline double __DEFAULT_FN_ATTRS<br>
+_mm256_cvtsd_f64(__m256d __a)<br>
+{<br>
+ return __a[0];<br>
+}<br>
+<br>
+static __inline int __DEFAULT_FN_ATTRS<br>
+_mm256_cvtsi256_si32(__m256i __a)<br>
+{<br>
+ __v8si __b = (__v8si)__a;<br>
+ return __b[0];<br>
+}<br>
+<br>
+static __inline float __DEFAULT_FN_ATTRS<br>
+_mm256_cvtss_f32(__m256 __a)<br>
+{<br>
+ return __a[0];<br>
+}<br>
+<br>
 /* Vector replicate */<br>
 static __inline __m256 __DEFAULT_FN_ATTRS<br>
 _mm256_movehdup_ps(__m256 __a)<br>
<br>
Modified: cfe/trunk/lib/Headers/ia32intrin.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Headers/ia32intrin.h?rev=271387&r1=271386&r2=271387&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Headers/ia32intrin.h?rev=271387&r1=271386&r2=271387&view=diff</a><br>
==============================================================================<br>
--- cfe/trunk/lib/Headers/ia32intrin.h (original)<br>
+++ cfe/trunk/lib/Headers/ia32intrin.h Wed Jun  1 07:21:00 2016<br>
@@ -74,4 +74,6 @@ __rdtscp(unsigned int *__A) {<br>
<br>
 #define _rdtsc() __rdtsc()<br>
<br>
+#define _rdpmc(A) __rdpmc(A)<br>
+<br>
 #endif /* __IA32INTRIN_H */<br>
<br>
Modified: cfe/trunk/lib/Headers/immintrin.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Headers/immintrin.h?rev=271387&r1=271386&r2=271387&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Headers/immintrin.h?rev=271387&r1=271386&r2=271387&view=diff</a><br>
==============================================================================<br>
--- cfe/trunk/lib/Headers/immintrin.h (original)<br>
+++ cfe/trunk/lib/Headers/immintrin.h Wed Jun  1 07:21:00 2016<br>
@@ -169,6 +169,18 @@ _rdrand32_step(unsigned int *__p)<br>
   return __builtin_ia32_rdrand32_step(__p);<br>
 }<br>
<br>
+/* __bit_scan_forward */<br>
+static __inline__ int __attribute__((__always_inline__, __nodebug__))<br>
+_bit_scan_forward(int __A) {<br>
+ return __builtin_ia32_bit_scan_forward(__A);<br>
+}<br>
+<br>
+/* __bit_scan_reverse */<br>
+static __inline__ int __attribute__((__always_inline__, __nodebug__))<br>
+_bit_scan_reverse(int __A) {<br>
+ return __builtin_ia32_bit_scan_reverse(__A);<br>
+}<br>
+<br>
 #ifdef __x86_64__<br>
 static __inline__ int __attribute__((__always_inline__, __nodebug__, __target__("rdrnd")))<br>
 _rdrand64_step(unsigned long long *__p)<br>
@@ -227,6 +239,7 @@ _writegsbase_u64(unsigned long long __V)<br>
 {<br>
   return __builtin_ia32_wrgsbase64(__V);<br>
 }<br>
+<br>
 #endif<br>
 #endif /* __FSGSBASE__ */<br>
<br>
<br>
Modified: cfe/trunk/test/CodeGen/avx-builtins.c<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGen/avx-builtins.c?rev=271387&r1=271386&r2=271387&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGen/avx-builtins.c?rev=271387&r1=271386&r2=271387&view=diff</a><br>
==============================================================================<br>
--- cfe/trunk/test/CodeGen/avx-builtins.c (original)<br>
+++ cfe/trunk/test/CodeGen/avx-builtins.c Wed Jun  1 07:21:00 2016<br>
@@ -1385,3 +1385,24 @@ void test_mm256_zeroupper() {<br>
   // CHECK: call void @llvm.x86.avx.vzeroupper()<br>
   return _mm256_zeroupper();<br>
 }<br>
+<br>
+double test_mm256_cvtsd_f64(__m256d __a)<br>
+{<br>
+ // CHECK-LABEL: @test_mm256_cvtsd_f64<br>
+ // CHECK: extractelement <4 x double> %{{.*}}, i32 0<br>
+ return _mm256_cvtsd_f64(__a);<br>
+}<br>
+<br>
+int test_mm256_cvtsi256_si32(__m256i __a)<br>
+{<br>
+ // CHECK-LABEL: @test_mm256_cvtsi256_si32<br>
+ // CHECK: extractelement <8 x i32> %{{.*}}, i32 0<br>
+ return _mm256_cvtsi256_si32(__a);<br>
+}<br>
+<br>
+float test_mm256_cvtss_f32(__m256 __a)<br>
+{<br>
+ // CHECK-LABEL: @test_mm256_cvtss_f32<br>
+ // CHECK: extractelement <8 x float> %{{.*}}, i32 0<br>
+ return _mm256_cvtss_f32(__a);<br>
+}<br>
<br>
Added: cfe/trunk/test/CodeGen/bitscan-builtins.c<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGen/bitscan-builtins.c?rev=271387&view=auto" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGen/bitscan-builtins.c?rev=271387&view=auto</a><br>
==============================================================================<br>
--- cfe/trunk/test/CodeGen/bitscan-builtins.c (added)<br>
+++ cfe/trunk/test/CodeGen/bitscan-builtins.c Wed Jun  1 07:21:00 2016<br>
@@ -0,0 +1,17 @@<br>
+// RUN: %clang_cc1 -triple x86_64-unknown-unknown -emit-llvm -o - %s | FileCheck %s<br>
+<br>
+// Don't include mm_malloc.h, it's system specific.<br>
+#define __MM_MALLOC_H<br>
+#include <immintrin.h><br>
+<br>
+int test_bit_scan_forward(int a) {<br>
+  return _bit_scan_forward(a);<br>
+// CHECK: @test_bit_scan_forward<br>
+// CHECK: call i32 @llvm.x86.bit.scan.forward<br>
+}<br>
+<br>
+int test_bit_scan_reverse(int a) {<br>
+  return _bit_scan_reverse(a);<br>
+// CHECK: @test_bit_scan_reverse<br>
+// CHECK: call i32 @llvm.x86.bit.scan.reverse<br>
+}<br>
<br>
Added: cfe/trunk/test/CodeGen/rd-builtins.c<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGen/rd-builtins.c?rev=271387&view=auto" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGen/rd-builtins.c?rev=271387&view=auto</a><br>
==============================================================================<br>
--- cfe/trunk/test/CodeGen/rd-builtins.c (added)<br>
+++ cfe/trunk/test/CodeGen/rd-builtins.c Wed Jun  1 07:21:00 2016<br>
@@ -0,0 +1,18 @@<br>
+// RUN: %clang_cc1 -triple x86_64-unknown-unknown -emit-llvm -o - %s | FileCheck %s<br>
+<br>
+// Don't include mm_malloc.h, it's system specific.<br>
+#define __MM_MALLOC_H<br>
+<br>
+#include <x86intrin.h><br>
+<br>
+unsigned long long test_rdpmc(int a) {<br>
+  return _rdpmc(a);<br>
+// CHECK: @test_rdpmc<br>
+// CHECK: call i64 @llvm.x86.rdpmc<br>
+}<br>
+<br>
+int test_rdtsc() {<br>
+  return _rdtsc();<br>
+// CHECK: @test_rdtsc<br>
+// CHECK: call i64 @llvm.x86.rdtsc<br>
+}<br>
<br>
<br>
_______________________________________________<br>
cfe-commits mailing list<br>
<a href="mailto:cfe-commits@lists.llvm.org">cfe-commits@lists.llvm.org</a><br>
<a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits" rel="noreferrer" target="_blank">http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits</a><br>
</blockquote></div><br></div>