/* __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__
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]]
}