skan updated this revision to Diff 249282. skan added a comment. Enable _BitScan* as intrinsics rather than builtin on linux
Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D75723/new/ https://reviews.llvm.org/D75723 Files: clang/lib/Headers/ia32intrin.h clang/test/CodeGen/bitscan-builtins.c Index: clang/test/CodeGen/bitscan-builtins.c =================================================================== --- clang/test/CodeGen/bitscan-builtins.c +++ clang/test/CodeGen/bitscan-builtins.c @@ -5,6 +5,32 @@ #include <x86intrin.h> +unsigned char test_BitScanForward(unsigned *index, unsigned mask) { + return _BitScanForward(index, mask); + // CHECK: @test_BitScanForward + // CHECK: %{{.*}} = call i32 @llvm.cttz.i32(i32 %{{.*}}, i1 true) +} + +unsigned char test_BitScanReverse(unsigned *index, unsigned mask) { + return _BitScanReverse(index, mask); + // CHECK: @test_BitScanReverse + // CHECK: %[[call:.*]] = call i32 @llvm.ctlz.i32(i32 %{{.*}}, i1 true) + // CHECK: %{{.*}} = sub nsw i32 31, %[[call]] +} + +unsigned char test_BitScanForward64(unsigned *index, unsigned long long mask) { + return _BitScanForward64(index, mask); + // CHECK: @test_BitScanForward64 + // CHECK: %{{.*}} = call i64 @llvm.cttz.i64(i64 %{{.*}}, i1 true) +} + +unsigned char test_BitScanReverse64(unsigned *index, unsigned long long mask) { + return _BitScanReverse64(index, mask); + // CHECK: @test_BitScanReverse64 + // CHECK: %{{.*}} = call i64 @llvm.ctlz.i64(i64 %{{.*}}, i1 true) + // CHECK: %{{.*}} = sub nsw i32 63, %{{.*}} +} + int test_bit_scan_forward(int a) { return _bit_scan_forward(a); // CHECK: @test_bit_scan_forward Index: clang/lib/Headers/ia32intrin.h =================================================================== --- clang/lib/Headers/ia32intrin.h +++ clang/lib/Headers/ia32intrin.h @@ -413,6 +413,26 @@ #ifndef _MSC_VER /* These are already provided as builtins for MSVC. */ +#define _BitScanForward(a, b) \ + __extension__({ \ + *(a) = (unsigned)__bsfd((int)(b)); \ + (unsigned char)((b) != 0); \ + }) +#define _BitScanReverse(a, b) \ + __extension__({ \ + *(a) = (unsigned)__bsrd((int)(b)); \ + (unsigned char)((b) != 0); \ + }) +#define _BitScanForward64(a, b) \ + __extension__({ \ + *(a) = (unsigned)__bsfq((long long)(b)); \ + (unsigned char)((b) != 0); \ + }) +#define _BitScanReverse64(a, b) \ + __extension__({ \ + *(a) = (unsigned)__bsrq((long long)(b)); \ + (unsigned char)((b) != 0); \ + }) /* Select the correct function based on the size of long. */ #ifdef __LP64__ #define _lrotl(a,b) __rolq((a), (b))
Index: clang/test/CodeGen/bitscan-builtins.c =================================================================== --- clang/test/CodeGen/bitscan-builtins.c +++ clang/test/CodeGen/bitscan-builtins.c @@ -5,6 +5,32 @@ #include <x86intrin.h> +unsigned char test_BitScanForward(unsigned *index, unsigned mask) { + return _BitScanForward(index, mask); + // CHECK: @test_BitScanForward + // CHECK: %{{.*}} = call i32 @llvm.cttz.i32(i32 %{{.*}}, i1 true) +} + +unsigned char test_BitScanReverse(unsigned *index, unsigned mask) { + return _BitScanReverse(index, mask); + // CHECK: @test_BitScanReverse + // CHECK: %[[call:.*]] = call i32 @llvm.ctlz.i32(i32 %{{.*}}, i1 true) + // CHECK: %{{.*}} = sub nsw i32 31, %[[call]] +} + +unsigned char test_BitScanForward64(unsigned *index, unsigned long long mask) { + return _BitScanForward64(index, mask); + // CHECK: @test_BitScanForward64 + // CHECK: %{{.*}} = call i64 @llvm.cttz.i64(i64 %{{.*}}, i1 true) +} + +unsigned char test_BitScanReverse64(unsigned *index, unsigned long long mask) { + return _BitScanReverse64(index, mask); + // CHECK: @test_BitScanReverse64 + // CHECK: %{{.*}} = call i64 @llvm.ctlz.i64(i64 %{{.*}}, i1 true) + // CHECK: %{{.*}} = sub nsw i32 63, %{{.*}} +} + int test_bit_scan_forward(int a) { return _bit_scan_forward(a); // CHECK: @test_bit_scan_forward Index: clang/lib/Headers/ia32intrin.h =================================================================== --- clang/lib/Headers/ia32intrin.h +++ clang/lib/Headers/ia32intrin.h @@ -413,6 +413,26 @@ #ifndef _MSC_VER /* These are already provided as builtins for MSVC. */ +#define _BitScanForward(a, b) \ + __extension__({ \ + *(a) = (unsigned)__bsfd((int)(b)); \ + (unsigned char)((b) != 0); \ + }) +#define _BitScanReverse(a, b) \ + __extension__({ \ + *(a) = (unsigned)__bsrd((int)(b)); \ + (unsigned char)((b) != 0); \ + }) +#define _BitScanForward64(a, b) \ + __extension__({ \ + *(a) = (unsigned)__bsfq((long long)(b)); \ + (unsigned char)((b) != 0); \ + }) +#define _BitScanReverse64(a, b) \ + __extension__({ \ + *(a) = (unsigned)__bsrq((long long)(b)); \ + (unsigned char)((b) != 0); \ + }) /* Select the correct function based on the size of long. */ #ifdef __LP64__ #define _lrotl(a,b) __rolq((a), (b))
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits