From ad1944c89634e870ab1cae4ba3903d3609702bb2 Mon Sep 17 00:00:00 2001 From: David Majnemer <david.majnemer@gmail.com> Date: Mon, 13 Jun 2016 17:26:16 +0000 Subject: [PATCH] [immintrin] Reimplement _bit_scan_{forward,reverse} 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 | 4 ++-- test/CodeGen/bitscan-builtins.c | 8 +++++--- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/lib/Headers/immintrin.h b/lib/Headers/immintrin.h index 7ed2035761d..15c8d750b2f 100644 --- a/lib/Headers/immintrin.h +++ b/lib/Headers/immintrin.h @@ -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__ diff --git a/test/CodeGen/bitscan-builtins.c b/test/CodeGen/bitscan-builtins.c index 85a75426342..451e8f4570c 100644 --- a/test/CodeGen/bitscan-builtins.c +++ b/test/CodeGen/bitscan-builtins.c @@ -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]] } -- GitLab