[PATCH] D75723: [X86] Make intrinsics _BitScan* not limited to Windows
skan marked an inline comment as done. skan added inline comments. Comment at: clang/include/clang/Basic/BuiltinsX86.def:1904 +// BITSCAN +TARGET_BUILTIN(_BitScanForward, "UcUNi*UNi", "n", "") +TARGET_BUILTIN(_BitScanReverse, "UcUNi*UNi", "n", "") rnk wrote: > craig.topper wrote: > > skan wrote: > > > craig.topper wrote: > > > > The N specifier here is sort of MSVC mode specific. I need to think > > > > about this. > > > > > > > > This also makes this available without including a header file which > > > > isn't good if it doesn't start with __builtin. > > > I think we can define a new builtin `__builtin_ia32_BitScanForward` in > > > BuiltinsX86.def. And when macro `_MSC_VER` is not defined, define > > > `_BitScanForward` in ia32intrin.h by calling the > > > `__builtin_ia32_BitScanForward`. Then we can avoid the N specifier and > > > the name issue. Do you think it's appropriate? > > Instead of new builtins, can we use __builtin_clz, __builtin_clzl, > > __builin_ctz, __builtin_ctzl? > Right, even though _BitScan* is in the implementers namespace, we want to be > careful about adding builtins that don't start with `__builtin_`. Unless we > set some dramatically new direction of making all the implementer's namespace > MSVC builtins available everywhere, I don't see why we would do this when we > already have equivalent builtins. > > Is there some particular motivation as to why you want to make these > available everywhere? `-fms-extensions` is kind of already available > everywhere. This compiles on Linux with `-fms-extensions`: > ``` > extern unsigned char _BitScanReverse64(unsigned int *, unsigned long long); > unsigned char test_BitScanReverse64(unsigned int *index, unsigned long long > mask) { > return _BitScanReverse64(index, mask); > } > ``` My thought is that the page [[ https://software.intel.com/sites/landingpage/IntrinsicsGuide/#expand=408,410,404,460,404,405,408&text=BitScan | intel intrinsic guide ]] says we can use the intrinsics _BitScan* as long as we include the header file immintrin.h, so we need support them on linux for user convenience even though similar intrinsics _bit_scan_* are available. Since the purpose is to support **intrinsics** _BitScan* on linux rather than **builtin** _BitScan*, I think we can wrap the intrinsiscs with existing builtin as craig suggested. Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D75723/new/ https://reviews.llvm.org/D75723 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D75723: [X86] Make intrinsics _BitScan* not limited to Windows
rnk added inline comments. Comment at: clang/include/clang/Basic/BuiltinsX86.def:1904 +// BITSCAN +TARGET_BUILTIN(_BitScanForward, "UcUNi*UNi", "n", "") +TARGET_BUILTIN(_BitScanReverse, "UcUNi*UNi", "n", "") craig.topper wrote: > skan wrote: > > craig.topper wrote: > > > The N specifier here is sort of MSVC mode specific. I need to think about > > > this. > > > > > > This also makes this available without including a header file which > > > isn't good if it doesn't start with __builtin. > > I think we can define a new builtin `__builtin_ia32_BitScanForward` in > > BuiltinsX86.def. And when macro `_MSC_VER` is not defined, define > > `_BitScanForward` in ia32intrin.h by calling the > > `__builtin_ia32_BitScanForward`. Then we can avoid the N specifier and the > > name issue. Do you think it's appropriate? > Instead of new builtins, can we use __builtin_clz, __builtin_clzl, > __builin_ctz, __builtin_ctzl? Right, even though _BitScan* is in the implementers namespace, we want to be careful about adding builtins that don't start with `__builtin_`. Unless we set some dramatically new direction of making all the implementer's namespace MSVC builtins available everywhere, I don't see why we would do this when we already have equivalent builtins. Is there some particular motivation as to why you want to make these available everywhere? `-fms-extensions` is kind of already available everywhere. This compiles on Linux with `-fms-extensions`: ``` extern unsigned char _BitScanReverse64(unsigned int *, unsigned long long); unsigned char test_BitScanReverse64(unsigned int *index, unsigned long long mask) { return _BitScanReverse64(index, mask); } ``` Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D75723/new/ https://reviews.llvm.org/D75723 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D75723: [X86] Make intrinsics _BitScan* not limited to Windows
craig.topper added inline comments. Comment at: clang/include/clang/Basic/BuiltinsX86.def:1904 +// BITSCAN +TARGET_BUILTIN(_BitScanForward, "UcUNi*UNi", "n", "") +TARGET_BUILTIN(_BitScanReverse, "UcUNi*UNi", "n", "") skan wrote: > craig.topper wrote: > > The N specifier here is sort of MSVC mode specific. I need to think about > > this. > > > > This also makes this available without including a header file which isn't > > good if it doesn't start with __builtin. > I think we can define a new builtin `__builtin_ia32_BitScanForward` in > BuiltinsX86.def. And when macro `_MSC_VER` is not defined, define > `_BitScanForward` in ia32intrin.h by calling the > `__builtin_ia32_BitScanForward`. Then we can avoid the N specifier and the > name issue. Do you think it's appropriate? Instead of new builtins, can we use __builtin_clz, __builtin_clzl, __builin_ctz, __builtin_ctzl? Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D75723/new/ https://reviews.llvm.org/D75723 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D75723: [X86] Make intrinsics _BitScan* not limited to Windows
skan marked an inline comment as done. skan added inline comments. Comment at: clang/include/clang/Basic/BuiltinsX86.def:1904 +// BITSCAN +TARGET_BUILTIN(_BitScanForward, "UcUNi*UNi", "n", "") +TARGET_BUILTIN(_BitScanReverse, "UcUNi*UNi", "n", "") craig.topper wrote: > The N specifier here is sort of MSVC mode specific. I need to think about > this. > > This also makes this available without including a header file which isn't > good if it doesn't start with __builtin. I think we can define a new builtin `__builtin_ia32_BitScanForward` in BuiltinsX86.def. And when macro `_MSC_VER` is not defined, define `_BitScanForward` in ia32intrin.h by calling the `__builtin_ia32_BitScanForward`. Then we can avoid the N specifier and the name issue. Do you think it's appropriate? Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D75723/new/ https://reviews.llvm.org/D75723 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D75723: [X86] Make intrinsics _BitScan* not limited to Windows
craig.topper added inline comments. Comment at: clang/include/clang/Basic/BuiltinsX86.def:1904 +// BITSCAN +TARGET_BUILTIN(_BitScanForward, "UcUNi*UNi", "n", "") +TARGET_BUILTIN(_BitScanReverse, "UcUNi*UNi", "n", "") The N specifier here is sort of MSVC mode specific. I need to think about this. This also makes this available without including a header file which isn't good if it doesn't start with __builtin. Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D75723/new/ https://reviews.llvm.org/D75723 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D75723: [X86] Make intrinsics _BitScan* not limited to Windows
skan updated this revision to Diff 248652. skan added a comment. Format the patch due to the warning given by pre-merge check Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D75723/new/ https://reviews.llvm.org/D75723 Files: clang/include/clang/Basic/BuiltinsX86.def clang/include/clang/Basic/BuiltinsX86_64.def 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 @@ -3,6 +3,46 @@ // PR33722 // RUN: %clang_cc1 -ffreestanding -triple x86_64-unknown-unknown -fms-extensions -fms-compatibility-version=19.00 -emit-llvm -o - %s | FileCheck %s +// Using _BitScan* intrinsics should not need any header file, so the tests for +// them are placed before any include directive intentionally. +unsigned char test_BitScanForward(unsigned *index, unsigned mask) { + return _BitScanForward(index, mask); + // CHECK: @test_BitScanForward + // CHECK: br i1 %{{.*}}, label %{{.*}}, label %{{.*}} + // CHECK: %[[result:.*]] = phi i8 [ 0, %{{.*}} ], [ 1, %{{.*}} ] + // CHECK: ret i8 %[[result]] + // CHECK: %{{.*}} = call i32 @llvm.cttz.i32(i32 %{{.*}}, i1 true) +} + +unsigned char test_BitScanForward64(unsigned *index, unsigned long long mask) { + return _BitScanForward64(index, mask); + // CHECK: @test_BitScanForward64 + // CHECK: br i1 %{{.*}}, label %{{.*}}, label %{{.*}} + // CHECK: %[[result:.*]] = phi i8 [ 0, %{{.*}} ], [ 1, %{{.*}} ] + // CHECK: ret i8 %[[result]] + // CHECK: %{{.*}} = call i64 @llvm.cttz.i64(i64 %{{.*}}, i1 true) +} + +unsigned char test_BitScanReverse(unsigned *index, unsigned mask) { + return _BitScanReverse(index, mask); + // CHECK: @test_BitScanReverse + // CHECK: br i1 %{{.*}}, label %{{.*}}, label %{{.*}} + // CHECK: %[[result:.*]] = phi i8 [ 0, %{{.*}} ], [ 1, %{{.*}} ] + // CHECK: ret i8 %[[result]] + // CHECK: %[[call:.*]] = call i32 @llvm.ctlz.i32(i32 %{{.*}}, i1 true) + // CHECK: %[[sub:.*]] = sub nsw i32 31, %[[call]] +} + +unsigned char test_BitScanReverse64(unsigned *index, unsigned long long mask) { + return _BitScanReverse64(index, mask); + // CHECK: @test_BitScanReverse64 + // CHECK: br i1 %{{.*}}, label %{{.*}}, label %{{.*}} + // CHECK: %[[result:.*]] = phi i8 [ 0, %{{.*}} ], [ 1, %{{.*}} ] + // CHECK: ret i8 %[[result]] + // CHECK: %{{.*}} = call i64 @llvm.ctlz.i64(i64 %{{.*}}, i1 true) + // CHECK: %{{.*}} = sub nsw i32 63, %{{.*}} +} + #include int test_bit_scan_forward(int a) { Index: clang/include/clang/Basic/BuiltinsX86_64.def === --- clang/include/clang/Basic/BuiltinsX86_64.def +++ clang/include/clang/Basic/BuiltinsX86_64.def @@ -21,9 +21,6 @@ # define TARGET_HEADER_BUILTIN(ID, TYPE, ATTRS, HEADER, LANG, FEATURE) BUILTIN(ID, TYPE, ATTRS) #endif -TARGET_HEADER_BUILTIN(_BitScanForward64, "UcUNi*ULLi", "nh", "intrin.h", ALL_MS_LANGUAGES, "") -TARGET_HEADER_BUILTIN(_BitScanReverse64, "UcUNi*ULLi", "nh", "intrin.h", ALL_MS_LANGUAGES, "") - TARGET_HEADER_BUILTIN(__mulh, "LLiLLiLLi","nch", "intrin.h", ALL_MS_LANGUAGES, "") TARGET_HEADER_BUILTIN(__umulh, "ULLiULLiULLi", "nch", "intrin.h", ALL_MS_LANGUAGES, "") TARGET_HEADER_BUILTIN(_mul128, "LLiLLiLLiLLi*", "nch", "intrin.h", ALL_MS_LANGUAGES, "") @@ -43,6 +40,10 @@ TARGET_HEADER_BUILTIN(_InterlockedXor64, "LLiLLiD*LLi", "nh", "intrin.h", ALL_MS_LANGUAGES, "") TARGET_HEADER_BUILTIN(_InterlockedCompareExchange128, "UcLLiD*LLiLLiLLi*", "nh", "intrin.h", ALL_MS_LANGUAGES, "cx16") +// BITSCAN +TARGET_BUILTIN(_BitScanForward64, "UcUNi*ULLi", "n", "") +TARGET_BUILTIN(_BitScanReverse64, "UcUNi*ULLi", "n", "") + TARGET_BUILTIN(__builtin_ia32_readeflags_u64, "UOi", "n", "") TARGET_BUILTIN(__builtin_ia32_writeeflags_u64, "vUOi", "n", "") TARGET_BUILTIN(__builtin_ia32_cvtss2si64, "OiV4f", "ncV:128:", "sse") Index: clang/include/clang/Basic/BuiltinsX86.def === --- clang/include/clang/Basic/BuiltinsX86.def +++ clang/include/clang/Basic/BuiltinsX86.def @@ -1900,10 +1900,11 @@ TARGET_BUILTIN(__builtin_ia32_enqcmd, "Ucv*vC*", "n", "enqcmd") TARGET_BUILTIN(__builtin_ia32_enqcmds, "Ucv*vC*", "n", "enqcmd") -// MSVC -TARGET_HEADER_BUILTIN(_BitScanForward, "UcUNi*UNi", "nh", "intrin.h", ALL_MS_LANGUAGES, "") -TARGET_HEADER_BUILTIN(_BitScanReverse, "UcUNi*UNi", "nh", "intrin.h", ALL_MS_LANGUAGES, "") +// BITSCAN +TARGET_BUILTIN(_BitScanForward, "UcUNi*UNi", "n", "") +TARGET_BUILTIN(_BitScanReverse, "UcUNi*UNi", "n", "") +// MSVC TARGET_HEADER_BUILTIN(_ReadWriteBarrier, "v", "nh", "intrin.h", ALL_MS_LANGUAGES, "") TARGET_HEADER_BUILTIN(_ReadBarrier, "v", "nh", "intrin.h", ALL_MS_LANGUAGES, "") TARGET_HEADER_BUILTIN(_WriteBarrier, "v", "nh", "intrin.h", ALL_MS_LANGUAGES, "") Index: clang/test/CodeGe
[PATCH] D75723: [X86] Make intrinsics _BitScan* not limited to Windows
skan updated this revision to Diff 248650. skan added a comment. Fix typo Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D75723/new/ https://reviews.llvm.org/D75723 Files: clang/include/clang/Basic/BuiltinsX86.def clang/include/clang/Basic/BuiltinsX86_64.def 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 @@ -3,6 +3,45 @@ // PR33722 // RUN: %clang_cc1 -ffreestanding -triple x86_64-unknown-unknown -fms-extensions -fms-compatibility-version=19.00 -emit-llvm -o - %s | FileCheck %s +// Using _BitScan* intrinsics should not need any header file, so the tests for +// them are placed before any include directive intentionally. +unsigned char test_BitScanForward(unsigned *index, unsigned mask) { + return _BitScanForward(index, mask); +// CHECK: @test_BitScanForward +// CHECK: br i1 %{{.*}}, label %{{.*}}, label %{{.*}} +// CHECK: %[[result:.*]] = phi i8 [ 0, %{{.*}} ], [ 1, %{{.*}} ] +// CHECK: ret i8 %[[result]] +// CHECK: %{{.*}} = call i32 @llvm.cttz.i32(i32 %{{.*}}, i1 true) +} + +unsigned char test_BitScanForward64(unsigned *index, unsigned long long mask) { + return _BitScanForward64(index, mask); +// CHECK: @test_BitScanForward64 +// CHECK: br i1 %{{.*}}, label %{{.*}}, label %{{.*}} +// CHECK: %[[result:.*]] = phi i8 [ 0, %{{.*}} ], [ 1, %{{.*}} ] +// CHECK: ret i8 %[[result]] +// CHECK: %{{.*}} = call i64 @llvm.cttz.i64(i64 %{{.*}}, i1 true) +} + +unsigned char test_BitScanReverse(unsigned *index, unsigned mask) { + return _BitScanReverse(index, mask); +// CHECK: @test_BitScanReverse +// CHECK: br i1 %{{.*}}, label %{{.*}}, label %{{.*}} +// CHECK: %[[result:.*]] = phi i8 [ 0, %{{.*}} ], [ 1, %{{.*}} ] +// CHECK: ret i8 %[[result]] +// CHECK: %[[call:.*]] = call i32 @llvm.ctlz.i32(i32 %{{.*}}, i1 true) +// CHECK: %[[sub:.*]] = sub nsw i32 31, %[[call]] +} + +unsigned char test_BitScanReverse64(unsigned *index, unsigned long long mask) { + return _BitScanReverse64(index, mask); +// CHECK: @test_BitScanReverse64 +// CHECK: br i1 %{{.*}}, label %{{.*}}, label %{{.*}} +// CHECK: %[[result:.*]] = phi i8 [ 0, %{{.*}} ], [ 1, %{{.*}} ] +// CHECK: ret i8 %[[result]] +// CHECK: %{{.*}} = call i64 @llvm.ctlz.i64(i64 %{{.*}}, i1 true) +// CHECK: %{{.*}} = sub nsw i32 63, %{{.*}} +} #include int test_bit_scan_forward(int a) { Index: clang/include/clang/Basic/BuiltinsX86_64.def === --- clang/include/clang/Basic/BuiltinsX86_64.def +++ clang/include/clang/Basic/BuiltinsX86_64.def @@ -21,9 +21,6 @@ # define TARGET_HEADER_BUILTIN(ID, TYPE, ATTRS, HEADER, LANG, FEATURE) BUILTIN(ID, TYPE, ATTRS) #endif -TARGET_HEADER_BUILTIN(_BitScanForward64, "UcUNi*ULLi", "nh", "intrin.h", ALL_MS_LANGUAGES, "") -TARGET_HEADER_BUILTIN(_BitScanReverse64, "UcUNi*ULLi", "nh", "intrin.h", ALL_MS_LANGUAGES, "") - TARGET_HEADER_BUILTIN(__mulh, "LLiLLiLLi","nch", "intrin.h", ALL_MS_LANGUAGES, "") TARGET_HEADER_BUILTIN(__umulh, "ULLiULLiULLi", "nch", "intrin.h", ALL_MS_LANGUAGES, "") TARGET_HEADER_BUILTIN(_mul128, "LLiLLiLLiLLi*", "nch", "intrin.h", ALL_MS_LANGUAGES, "") @@ -43,6 +40,10 @@ TARGET_HEADER_BUILTIN(_InterlockedXor64, "LLiLLiD*LLi", "nh", "intrin.h", ALL_MS_LANGUAGES, "") TARGET_HEADER_BUILTIN(_InterlockedCompareExchange128, "UcLLiD*LLiLLiLLi*", "nh", "intrin.h", ALL_MS_LANGUAGES, "cx16") +// BITSCAN +TARGET_BUILTIN(_BitScanForward64, "UcUNi*ULLi", "n", "") +TARGET_BUILTIN(_BitScanReverse64, "UcUNi*ULLi", "n", "") + TARGET_BUILTIN(__builtin_ia32_readeflags_u64, "UOi", "n", "") TARGET_BUILTIN(__builtin_ia32_writeeflags_u64, "vUOi", "n", "") TARGET_BUILTIN(__builtin_ia32_cvtss2si64, "OiV4f", "ncV:128:", "sse") Index: clang/include/clang/Basic/BuiltinsX86.def === --- clang/include/clang/Basic/BuiltinsX86.def +++ clang/include/clang/Basic/BuiltinsX86.def @@ -1900,10 +1900,11 @@ TARGET_BUILTIN(__builtin_ia32_enqcmd, "Ucv*vC*", "n", "enqcmd") TARGET_BUILTIN(__builtin_ia32_enqcmds, "Ucv*vC*", "n", "enqcmd") -// MSVC -TARGET_HEADER_BUILTIN(_BitScanForward, "UcUNi*UNi", "nh", "intrin.h", ALL_MS_LANGUAGES, "") -TARGET_HEADER_BUILTIN(_BitScanReverse, "UcUNi*UNi", "nh", "intrin.h", ALL_MS_LANGUAGES, "") +// BITSCAN +TARGET_BUILTIN(_BitScanForward, "UcUNi*UNi", "n", "") +TARGET_BUILTIN(_BitScanReverse, "UcUNi*UNi", "n", "") +// MSVC TARGET_HEADER_BUILTIN(_ReadWriteBarrier, "v", "nh", "intrin.h", ALL_MS_LANGUAGES, "") TARGET_HEADER_BUILTIN(_ReadBarrier, "v", "nh", "intrin.h", ALL_MS_LANGUAGES, "") TARGET_HEADER_BUILTIN(_WriteBarrier, "v", "nh", "intrin.h", ALL_MS_LANGUAGES, "") Index: clang/test/CodeGen/bitscan-builtins.c === --- clang
[PATCH] D75723: [X86] Make intrinsics _BitScan* not limited to Windows
skan created this revision. Herald added a project: clang. Herald added a subscriber: cfe-commits. Currently if we want to use _BitScan*, we have to include intrin.h, which can only be included on Windows. Intrinsics _BitScan* are implemented by LLVM IR, so the restriction doesn't make sense. Repository: rG LLVM Github Monorepo https://reviews.llvm.org/D75723 Files: clang/include/clang/Basic/BuiltinsX86.def clang/include/clang/Basic/BuiltinsX86_64.def 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 @@ -3,6 +3,45 @@ // PR33722 // RUN: %clang_cc1 -ffreestanding -triple x86_64-unknown-unknown -fms-extensions -fms-compatibility-version=19.00 -emit-llvm -o - %s | FileCheck %s +// Using _BitScan* intrinsics should not need any header file, so the tests for +// them are put placed before any include directive intentionally. +unsigned char test_BitScanForward(unsigned *index, unsigned mask) { + return _BitScanForward(index, mask); +// CHECK: @test_BitScanForward +// CHECK: br i1 %{{.*}}, label %{{.*}}, label %{{.*}} +// CHECK: %[[result:.*]] = phi i8 [ 0, %{{.*}} ], [ 1, %{{.*}} ] +// CHECK: ret i8 %[[result]] +// CHECK: %{{.*}} = call i32 @llvm.cttz.i32(i32 %{{.*}}, i1 true) +} + +unsigned char test_BitScanForward64(unsigned *index, unsigned long long mask) { + return _BitScanForward64(index, mask); +// CHECK: @test_BitScanForward64 +// CHECK: br i1 %{{.*}}, label %{{.*}}, label %{{.*}} +// CHECK: %[[result:.*]] = phi i8 [ 0, %{{.*}} ], [ 1, %{{.*}} ] +// CHECK: ret i8 %[[result]] +// CHECK: %{{.*}} = call i64 @llvm.cttz.i64(i64 %{{.*}}, i1 true) +} + +unsigned char test_BitScanReverse(unsigned *index, unsigned mask) { + return _BitScanReverse(index, mask); +// CHECK: @test_BitScanReverse +// CHECK: br i1 %{{.*}}, label %{{.*}}, label %{{.*}} +// CHECK: %[[result:.*]] = phi i8 [ 0, %{{.*}} ], [ 1, %{{.*}} ] +// CHECK: ret i8 %[[result]] +// CHECK: %[[call:.*]] = call i32 @llvm.ctlz.i32(i32 %{{.*}}, i1 true) +// CHECK: %[[sub:.*]] = sub nsw i32 31, %[[call]] +} + +unsigned char test_BitScanReverse64(unsigned *index, unsigned long long mask) { + return _BitScanReverse64(index, mask); +// CHECK: @test_BitScanReverse64 +// CHECK: br i1 %{{.*}}, label %{{.*}}, label %{{.*}} +// CHECK: %[[result:.*]] = phi i8 [ 0, %{{.*}} ], [ 1, %{{.*}} ] +// CHECK: ret i8 %[[result]] +// CHECK: %{{.*}} = call i64 @llvm.ctlz.i64(i64 %{{.*}}, i1 true) +// CHECK: %{{.*}} = sub nsw i32 63, %{{.*}} +} #include int test_bit_scan_forward(int a) { Index: clang/include/clang/Basic/BuiltinsX86_64.def === --- clang/include/clang/Basic/BuiltinsX86_64.def +++ clang/include/clang/Basic/BuiltinsX86_64.def @@ -21,9 +21,6 @@ # define TARGET_HEADER_BUILTIN(ID, TYPE, ATTRS, HEADER, LANG, FEATURE) BUILTIN(ID, TYPE, ATTRS) #endif -TARGET_HEADER_BUILTIN(_BitScanForward64, "UcUNi*ULLi", "nh", "intrin.h", ALL_MS_LANGUAGES, "") -TARGET_HEADER_BUILTIN(_BitScanReverse64, "UcUNi*ULLi", "nh", "intrin.h", ALL_MS_LANGUAGES, "") - TARGET_HEADER_BUILTIN(__mulh, "LLiLLiLLi","nch", "intrin.h", ALL_MS_LANGUAGES, "") TARGET_HEADER_BUILTIN(__umulh, "ULLiULLiULLi", "nch", "intrin.h", ALL_MS_LANGUAGES, "") TARGET_HEADER_BUILTIN(_mul128, "LLiLLiLLiLLi*", "nch", "intrin.h", ALL_MS_LANGUAGES, "") @@ -43,6 +40,10 @@ TARGET_HEADER_BUILTIN(_InterlockedXor64, "LLiLLiD*LLi", "nh", "intrin.h", ALL_MS_LANGUAGES, "") TARGET_HEADER_BUILTIN(_InterlockedCompareExchange128, "UcLLiD*LLiLLiLLi*", "nh", "intrin.h", ALL_MS_LANGUAGES, "cx16") +// BITSCAN +TARGET_BUILTIN(_BitScanForward64, "UcUNi*ULLi", "n", "") +TARGET_BUILTIN(_BitScanReverse64, "UcUNi*ULLi", "n", "") + TARGET_BUILTIN(__builtin_ia32_readeflags_u64, "UOi", "n", "") TARGET_BUILTIN(__builtin_ia32_writeeflags_u64, "vUOi", "n", "") TARGET_BUILTIN(__builtin_ia32_cvtss2si64, "OiV4f", "ncV:128:", "sse") Index: clang/include/clang/Basic/BuiltinsX86.def === --- clang/include/clang/Basic/BuiltinsX86.def +++ clang/include/clang/Basic/BuiltinsX86.def @@ -1900,10 +1900,11 @@ TARGET_BUILTIN(__builtin_ia32_enqcmd, "Ucv*vC*", "n", "enqcmd") TARGET_BUILTIN(__builtin_ia32_enqcmds, "Ucv*vC*", "n", "enqcmd") -// MSVC -TARGET_HEADER_BUILTIN(_BitScanForward, "UcUNi*UNi", "nh", "intrin.h", ALL_MS_LANGUAGES, "") -TARGET_HEADER_BUILTIN(_BitScanReverse, "UcUNi*UNi", "nh", "intrin.h", ALL_MS_LANGUAGES, "") +// BITSCAN +TARGET_BUILTIN(_BitScanForward, "UcUNi*UNi", "n", "") +TARGET_BUILTIN(_BitScanReverse, "UcUNi*UNi", "n", "") +// MSVC TARGET_HEADER_BUILTIN(_ReadWriteBarrier, "v", "nh", "intrin.h", ALL_MS_LANGUAGES, "") TARGET_HEADER_BUILTIN(_ReadBarrier, "v", "nh", "intrin.h", ALL_MS_LANGUAGES, "") TARGET_HEADER_BUILTIN(_WriteBarrier, "v", "nh", "