skan updated this revision to Diff 249550. skan marked an inline comment as done. skan added a comment.
Make the variale name in macro start with 2 underscores 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,58 @@ #ifndef _MSC_VER /* These are already provided as builtins for MSVC. */ +#define _BitScanForward(a, b) \ + __extension__({ \ + int __c = (int)(b); \ + unsigned char __d; \ + if (__c != 0) { \ + *(a) = (unsigned)__bsfd(__c); \ + __d = 1; \ + } else { \ + __d = 0; \ + } \ + __d; \ + }) +#define _BitScanReverse(a, b) \ + __extension__({ \ + int __c = (int)(b); \ + unsigned char __d; \ + if (__c != 0) { \ + *(a) = (unsigned)__bsrd(__c); \ + __d = 1; \ + } else { \ + __d = 0; \ + } \ + __d; \ + }) + +#ifdef __x86_64__ +#define _BitScanForward64(a, b) \ + __extension__({ \ + long long __c = (long long)(b); \ + unsigned char __d; \ + if (__c != 0) { \ + *(a) = (unsigned)__bsfq(__c); \ + __d = 1; \ + } else { \ + __d = 0; \ + } \ + __d; \ + }) +#define _BitScanReverse64(a, b) \ + __extension__({ \ + long long __c = (long long)(b); \ + unsigned char __d; \ + if (__c != 0) { \ + *(a) = (unsigned)__bsrq(__c); \ + __d = 1; \ + } else { \ + __d = 0; \ + } \ + __d; \ + }) +#endif /* __x86_64__ */ + /* 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,58 @@ #ifndef _MSC_VER /* These are already provided as builtins for MSVC. */ +#define _BitScanForward(a, b) \ + __extension__({ \ + int __c = (int)(b); \ + unsigned char __d; \ + if (__c != 0) { \ + *(a) = (unsigned)__bsfd(__c); \ + __d = 1; \ + } else { \ + __d = 0; \ + } \ + __d; \ + }) +#define _BitScanReverse(a, b) \ + __extension__({ \ + int __c = (int)(b); \ + unsigned char __d; \ + if (__c != 0) { \ + *(a) = (unsigned)__bsrd(__c); \ + __d = 1; \ + } else { \ + __d = 0; \ + } \ + __d; \ + }) + +#ifdef __x86_64__ +#define _BitScanForward64(a, b) \ + __extension__({ \ + long long __c = (long long)(b); \ + unsigned char __d; \ + if (__c != 0) { \ + *(a) = (unsigned)__bsfq(__c); \ + __d = 1; \ + } else { \ + __d = 0; \ + } \ + __d; \ + }) +#define _BitScanReverse64(a, b) \ + __extension__({ \ + long long __c = (long long)(b); \ + unsigned char __d; \ + if (__c != 0) { \ + *(a) = (unsigned)__bsrq(__c); \ + __d = 1; \ + } else { \ + __d = 0; \ + } \ + __d; \ + }) +#endif /* __x86_64__ */ + /* 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