]> granicus.if.org Git - clang/commitdiff
[immintrin] Reimplement _bit_scan_{forward,reverse}
authorDavid Majnemer <david.majnemer@gmail.com>
Mon, 13 Jun 2016 17:26:16 +0000 (17:26 +0000)
committerDavid Majnemer <david.majnemer@gmail.com>
Mon, 13 Jun 2016 17:26:16 +0000 (17:26 +0000)
There is no need to use a target-specific intrinsic to implement
_bit_scan_forward or _bit_scan_reverse, reimplementing them using
generic intrinsics makes it more likely that the middle end will
understand what's going on.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@272564 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Headers/immintrin.h
test/CodeGen/bitscan-builtins.c

index 7ed2035761db0f7c38e3c39e4d2af1a8a16ed1c0..15c8d750b2fb192b585e87d6cebca57df60ad308 100644 (file)
@@ -172,13 +172,13 @@ _rdrand32_step(unsigned int *__p)
 /* __bit_scan_forward */
 static __inline__ int __attribute__((__always_inline__, __nodebug__))
 _bit_scan_forward(int __A) {
return __builtin_ia32_bit_scan_forward(__A);
 return __builtin_ctz(__A);
 }
 
 /* __bit_scan_reverse */
 static __inline__ int __attribute__((__always_inline__, __nodebug__))
 _bit_scan_reverse(int __A) {
return __builtin_ia32_bit_scan_reverse(__A);
 return 31 - __builtin_clz(__A);
 }
 
 #ifdef __x86_64__
index 85a75426342b07fae057f2c02fefb432992f08e2..451e8f4570c6e646d6471e796c8b28982fab1a82 100644 (file)
@@ -7,11 +7,13 @@
 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
+// CHECK: %[[call:.*]] = call i32 @llvm.cttz.i32(
+// CHECK: ret i32 %[[call]]
 }
 
 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
+// CHECK:  %[[call:.*]] = call i32 @llvm.ctlz.i32(
+// CHECK:  %[[sub:.*]] = sub nsw i32 31, %2
+// CHECK: ret i32 %[[sub]]
 }