<div dir="ltr"><div>I'm worried about changing this signature all the time.  I suspect that it will cause the following to be emitted for valid code:</div><div><br></div><div>warning: incompatible pointer types passing 'unsigned long *' to parameter of type 'unsigned int *' [-Wincompatible-pointer-types]</div><div class="gmail_extra"><br></div><div class="gmail_extra">Switching the signature on LP64 sounds much better to me.</div><div class="gmail_extra"><br><div class="gmail_quote">On Wed, Jun 7, 2017 at 2:56 PM, Duncan P. N. Exon Smith via cfe-commits <span dir="ltr"><<a href="mailto:cfe-commits@lists.llvm.org" target="_blank">cfe-commits@lists.llvm.org</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-style:solid;border-left-color:rgb(204,204,204);padding-left:1ex">[... excuse the necromancy...]<br>
<br>
Hi Albert (and Reid and David),<br>
<br>
This commit is breaking some uses of -fms-extensions on Apple platforms.  In particular, Brian and Erik (CC'ed) build against a version of the Windows SDK on Apple platforms.  _BitScanReverse is expected to be 32-bit, matching Windows/LLP64, even though long is 64-bit on Darwin/LP64.<br>
<br>
One idea we've had for fixing this is to use "int" instead of "long" for these intrinsics, either:<br>
- all the time, or<br>
- when in LP64 mode (e.g., Darwin + -fms-extensions).<br>
<br>
Any other ideas?<br>
<br>
Thanks,<br>
Duncan<br>
<div class="gmail-HOEnZb"><div class="gmail-h5"><br>
> On Oct 12, 2016, at 15:01, Albert Gutowski via cfe-commits <<a href="mailto:cfe-commits@lists.llvm.org">cfe-commits@lists.llvm.org</a>> wrote:<br>
><br>
> Author: agutowski<br>
> Date: Wed Oct 12 17:01:05 2016<br>
> New Revision: 284060<br>
><br>
> URL: <a href="http://llvm.org/viewvc/llvm-project?rev=284060&view=rev" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project?rev=284060&view=rev</a><br>
> Log:<br>
> Implement MS _BitScan intrinsics<br>
><br>
> Summary: _BitScan intrinsics (and some others, for example _Interlocked and _bittest) are supposed to work on both ARM and x86. This is an attempt to isolate them, avoiding repeating their code or writing separate function for each builtin.<br>
><br>
> Reviewers: hans, thakis, rnk, majnemer<br>
><br>
> Subscribers: RKSimon, cfe-commits, aemerson<br>
><br>
> Differential Revision: <a href="https://reviews.llvm.org/D25264" rel="noreferrer" target="_blank">https://reviews.llvm.org/<wbr>D25264</a><br>
><br>
> Modified:<br>
>    cfe/trunk/include/clang/Basic/<wbr>BuiltinsARM.def<br>
>    cfe/trunk/include/clang/Basic/<wbr>BuiltinsX86.def<br>
>    cfe/trunk/include/clang/Basic/<wbr>BuiltinsX86_64.def<br>
>    cfe/trunk/lib/Basic/Targets.<wbr>cpp<br>
>    cfe/trunk/lib/CodeGen/<wbr>CGBuiltin.cpp<br>
>    cfe/trunk/lib/CodeGen/<wbr>CodeGenFunction.h<br>
>    cfe/trunk/lib/Headers/intrin.h<br>
>    cfe/trunk/test/CodeGen/ms-<wbr>intrinsics.c<br>
><br>
> Modified: cfe/trunk/include/clang/Basic/<wbr>BuiltinsARM.def<br>
> URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/BuiltinsARM.def?rev=284060&r1=284059&r2=284060&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/cfe/trunk/include/<wbr>clang/Basic/BuiltinsARM.def?<wbr>rev=284060&r1=284059&r2=<wbr>284060&view=diff</a><br>
> ==============================<wbr>==============================<wbr>==================<br>
> --- cfe/trunk/include/clang/Basic/<wbr>BuiltinsARM.def (original)<br>
> +++ cfe/trunk/include/clang/Basic/<wbr>BuiltinsARM.def Wed Oct 12 17:01:05 2016<br>
> @@ -18,6 +18,10 @@<br>
> #   define LANGBUILTIN(ID, TYPE, ATTRS, BUILTIN_LANG) BUILTIN(ID, TYPE, ATTRS)<br>
> #endif<br>
><br>
> +#if defined(BUILTIN) && !defined(TARGET_HEADER_<wbr>BUILTIN)<br>
> +#  define TARGET_HEADER_BUILTIN(ID, TYPE, ATTRS, HEADER, LANG, FEATURE) BUILTIN(ID, TYPE, ATTRS)<br>
> +#endif<br>
> +<br>
> // In libgcc<br>
> BUILTIN(__clear_cache, "vv*v*", "i")<br>
><br>
> @@ -129,5 +133,11 @@ LANGBUILTIN(_<wbr>MoveFromCoprocessor2, "UiIU<br>
> LANGBUILTIN(_<wbr>MoveToCoprocessor, "vUiIUiIUiIUiIUiIUi", "", ALL_MS_LANGUAGES)<br>
> LANGBUILTIN(_<wbr>MoveToCoprocessor2, "vUiIUiIUiIUiIUiIUi", "", ALL_MS_LANGUAGES)<br>
><br>
> +TARGET_HEADER_BUILTIN(_<wbr>BitScanForward, "UcULi*ULi", "n", "intrin.h", ALL_MS_LANGUAGES, "")<br>
> +TARGET_HEADER_BUILTIN(_<wbr>BitScanReverse, "UcULi*ULi", "n", "intrin.h", ALL_MS_LANGUAGES, "")<br>
> +TARGET_HEADER_BUILTIN(_<wbr>BitScanForward64, "UcULi*ULLi", "n", "intrin.h", ALL_MS_LANGUAGES, "")<br>
> +TARGET_HEADER_BUILTIN(_<wbr>BitScanReverse64, "UcULi*ULLi", "n", "intrin.h", ALL_MS_LANGUAGES, "")<br>
> +<br>
> #undef BUILTIN<br>
> #undef LANGBUILTIN<br>
> +#undef TARGET_HEADER_BUILTIN<br>
><br>
> Modified: cfe/trunk/include/clang/Basic/<wbr>BuiltinsX86.def<br>
> URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/BuiltinsX86.def?rev=284060&r1=284059&r2=284060&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/cfe/trunk/include/<wbr>clang/Basic/BuiltinsX86.def?<wbr>rev=284060&r1=284059&r2=<wbr>284060&view=diff</a><br>
> ==============================<wbr>==============================<wbr>==================<br>
> --- cfe/trunk/include/clang/Basic/<wbr>BuiltinsX86.def (original)<br>
> +++ cfe/trunk/include/clang/Basic/<wbr>BuiltinsX86.def Wed Oct 12 17:01:05 2016<br>
> @@ -2028,6 +2028,10 @@ TARGET_BUILTIN(__builtin_ia32_<wbr>selectpd_5<br>
> TARGET_BUILTIN(__builtin_ia32_<wbr>monitorx, "vv*UiUi", "", "mwaitx")<br>
> TARGET_BUILTIN(__builtin_ia32_<wbr>mwaitx, "vUiUiUi", "", "mwaitx")<br>
><br>
> +// MSVC<br>
> +TARGET_HEADER_BUILTIN(_<wbr>BitScanForward, "UcULi*ULi", "n", "intrin.h", ALL_MS_LANGUAGES, "")<br>
> +TARGET_HEADER_BUILTIN(_<wbr>BitScanReverse, "UcULi*ULi", "n", "intrin.h", ALL_MS_LANGUAGES, "")<br>
> +<br>
> TARGET_HEADER_BUILTIN(_<wbr>ReadWriteBarrier, "v", "nh", "intrin.h", ALL_MS_LANGUAGES, "")<br>
> TARGET_HEADER_BUILTIN(_<wbr>ReadBarrier,      "v", "nh", "intrin.h", ALL_MS_LANGUAGES, "")<br>
> TARGET_HEADER_BUILTIN(_<wbr>WriteBarrier,     "v", "nh", "intrin.h", ALL_MS_LANGUAGES, "")<br>
><br>
> Modified: cfe/trunk/include/clang/Basic/<wbr>BuiltinsX86_64.def<br>
> URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/BuiltinsX86_64.def?rev=284060&r1=284059&r2=284060&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/cfe/trunk/include/<wbr>clang/Basic/BuiltinsX86_64.<wbr>def?rev=284060&r1=284059&r2=<wbr>284060&view=diff</a><br>
> ==============================<wbr>==============================<wbr>==================<br>
> --- cfe/trunk/include/clang/Basic/<wbr>BuiltinsX86_64.def (original)<br>
> +++ cfe/trunk/include/clang/Basic/<wbr>BuiltinsX86_64.def Wed Oct 12 17:01:05 2016<br>
> @@ -22,6 +22,9 @@<br>
> #  define TARGET_HEADER_BUILTIN(ID, TYPE, ATTRS, HEADER, LANG, FEATURE) BUILTIN(ID, TYPE, ATTRS)<br>
> #endif<br>
><br>
> +TARGET_HEADER_BUILTIN(_<wbr>BitScanForward64, "UcULi*ULLi", "n", "intrin.h", ALL_MS_LANGUAGES, "")<br>
> +TARGET_HEADER_BUILTIN(_<wbr>BitScanReverse64, "UcULi*ULLi", "n", "intrin.h", ALL_MS_LANGUAGES, "")<br>
> +<br>
> TARGET_HEADER_BUILTIN(__mulh,  "LLiLLiLLi",    "nch", "intrin.h", ALL_MS_LANGUAGES, "")<br>
> TARGET_HEADER_BUILTIN(__umulh, "ULLiULLiULLi", "nch", "intrin.h", ALL_MS_LANGUAGES, "")<br>
> TARGET_HEADER_BUILTIN(_mul128, "LLiLLiLLiLLi*",      "nh",   "intrin.h", ALL_MS_LANGUAGES, "")<br>
><br>
> Modified: cfe/trunk/lib/Basic/Targets.<wbr>cpp<br>
> URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Basic/Targets.cpp?rev=284060&r1=284059&r2=284060&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/cfe/trunk/lib/Basic/<wbr>Targets.cpp?rev=284060&r1=<wbr>284059&r2=284060&view=diff</a><br>
> ==============================<wbr>==============================<wbr>==================<br>
> --- cfe/trunk/lib/Basic/Targets.<wbr>cpp (original)<br>
> +++ cfe/trunk/lib/Basic/Targets.<wbr>cpp Wed Oct 12 17:01:05 2016<br>
> @@ -5588,6 +5588,8 @@ const Builtin::Info ARMTargetInfo::Built<br>
>   { #ID, TYPE, ATTRS, nullptr, LANG, nullptr },<br>
> #define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \<br>
>   { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },<br>
> +#define TARGET_HEADER_BUILTIN(ID, TYPE, ATTRS, HEADER, LANGS, FEATURE) \<br>
> +  { #ID, TYPE, ATTRS, HEADER, LANGS, FEATURE },<br>
> #include "clang/Basic/BuiltinsARM.def"<br>
> };<br>
><br>
><br>
> Modified: cfe/trunk/lib/CodeGen/<wbr>CGBuiltin.cpp<br>
> URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGBuiltin.cpp?rev=284060&r1=284059&r2=284060&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/cfe/trunk/lib/CodeGen/<wbr>CGBuiltin.cpp?rev=284060&r1=<wbr>284059&r2=284060&view=diff</a><br>
> ==============================<wbr>==============================<wbr>==================<br>
> --- cfe/trunk/lib/CodeGen/<wbr>CGBuiltin.cpp (original)<br>
> +++ cfe/trunk/lib/CodeGen/<wbr>CGBuiltin.cpp Wed Oct 12 17:01:05 2016<br>
> @@ -2637,6 +2637,68 @@ static Value *EmitTargetArchBuiltinExpr(<br>
>   }<br>
> }<br>
><br>
> +// Many of MSVC builtins are on both x64 and ARM; to avoid repeating code, we<br>
> +// handle them here.<br>
> +enum class CodeGenFunction::MSVCIntrin {<br>
> +  _BitScanForward,<br>
> +  _BitScanReverse<br>
> +};<br>
> +<br>
> +Value *CodeGenFunction::<wbr>EmitMSVCBuiltinExpr(MSVCIntrin BuiltinID,<br>
> +                                            const CallExpr *E) {<br>
> +  switch (BuiltinID) {<br>
> +  case MSVCIntrin::_BitScanForward:<br>
> +  case MSVCIntrin::_BitScanReverse: {<br>
> +    Value *ArgValue = EmitScalarExpr(E->getArg(1));<br>
> +<br>
> +    llvm::Type *ArgType = ArgValue->getType();<br>
> +    llvm::Type *IndexType =<br>
> +        EmitScalarExpr(E->getArg(0))-><wbr>getType()-><wbr>getPointerElementType();<br>
> +    llvm::Type *ResultType = ConvertType(E->getType());<br>
> +<br>
> +    Value *ArgZero = llvm::Constant::getNullValue(<wbr>ArgType);<br>
> +    Value *ResZero = llvm::Constant::getNullValue(<wbr>ResultType);<br>
> +    Value *ResOne = llvm::ConstantInt::get(<wbr>ResultType, 1);<br>
> +<br>
> +    BasicBlock *Begin = Builder.GetInsertBlock();<br>
> +    BasicBlock *End = createBasicBlock("bitscan_end"<wbr>, this->CurFn);<br>
> +    Builder.SetInsertPoint(End);<br>
> +    PHINode *Result = Builder.CreatePHI(ResultType, 2, "bitscan_result");<br>
> +<br>
> +    Builder.SetInsertPoint(Begin);<br>
> +    Value *IsZero = Builder.CreateICmpEQ(ArgValue, ArgZero);<br>
> +    BasicBlock *NotZero = createBasicBlock("bitscan_not_<wbr>zero", this->CurFn);<br>
> +    Builder.CreateCondBr(IsZero, End, NotZero);<br>
> +    Result->addIncoming(ResZero, Begin);<br>
> +<br>
> +    Builder.SetInsertPoint(<wbr>NotZero);<br>
> +    Address IndexAddress = EmitPointerWithAlignment(E-><wbr>getArg(0));<br>
> +<br>
> +    if (BuiltinID == MSVCIntrin::_BitScanForward) {<br>
> +      Value *F = CGM.getIntrinsic(Intrinsic::<wbr>cttz, ArgType);<br>
> +      Value *ZeroCount = Builder.CreateCall(F, {ArgValue, Builder.getTrue()});<br>
> +      ZeroCount = Builder.CreateIntCast(<wbr>ZeroCount, IndexType, false);<br>
> +      Builder.CreateStore(ZeroCount, IndexAddress, false);<br>
> +    } else {<br>
> +      unsigned ArgWidth = cast<llvm::IntegerType>(<wbr>ArgType)->getBitWidth();<br>
> +      Value *ArgTypeLastIndex = llvm::ConstantInt::get(<wbr>IndexType, ArgWidth - 1);<br>
> +<br>
> +      Value *F = CGM.getIntrinsic(Intrinsic::<wbr>ctlz, ArgType);<br>
> +      Value *ZeroCount = Builder.CreateCall(F, {ArgValue, Builder.getTrue()});<br>
> +      ZeroCount = Builder.CreateIntCast(<wbr>ZeroCount, IndexType, false);<br>
> +      Value *Index = Builder.CreateNSWSub(<wbr>ArgTypeLastIndex, ZeroCount);<br>
> +      Builder.CreateStore(Index, IndexAddress, false);<br>
> +    }<br>
> +    Builder.CreateBr(End);<br>
> +    Result->addIncoming(ResOne, NotZero);<br>
> +<br>
> +    Builder.SetInsertPoint(End);<br>
> +    return Result;<br>
> +  }<br>
> +  }<br>
> +  llvm_unreachable("Incorrect MSVC intrinsic!");<br>
> +}<br>
> +<br>
> Value *CodeGenFunction::<wbr>EmitTargetBuiltinExpr(unsigned BuiltinID,<br>
>                                               const CallExpr *E) {<br>
>   if (getContext().BuiltinInfo.<wbr>isAuxBuiltinID(BuiltinID)) {<br>
> @@ -4561,6 +4623,12 @@ Value *CodeGenFunction::<wbr>EmitARMBuiltinEx<br>
>     return Builder.CreateCall(F, {Ops[1], Ops[2], Ops[0],<br>
>                                   Ops[3], Ops[4], Ops[5]});<br>
>   }<br>
> +  case ARM::BI_BitScanForward:<br>
> +  case ARM::BI_BitScanForward64:<br>
> +    return EmitMSVCBuiltinExpr(<wbr>MSVCIntrin::_BitScanForward, E);<br>
> +  case ARM::BI_BitScanReverse:<br>
> +  case ARM::BI_BitScanReverse64:<br>
> +    return EmitMSVCBuiltinExpr(<wbr>MSVCIntrin::_BitScanReverse, E);<br>
>   }<br>
><br>
>   // Get the last argument, which specifies the vector type.<br>
> @@ -7623,6 +7691,12 @@ Value *CodeGenFunction::<wbr>EmitX86BuiltinEx<br>
>     return Builder.CreateFence(llvm::<wbr>AtomicOrdering::<wbr>SequentiallyConsistent,<br>
>                                llvm::SingleThread);<br>
>   }<br>
> +  case X86::BI_BitScanForward:<br>
> +  case X86::BI_BitScanForward64:<br>
> +    return EmitMSVCBuiltinExpr(<wbr>MSVCIntrin::_BitScanForward, E);<br>
> +  case X86::BI_BitScanReverse:<br>
> +  case X86::BI_BitScanReverse64:<br>
> +    return EmitMSVCBuiltinExpr(<wbr>MSVCIntrin::_BitScanReverse, E);<br>
>   }<br>
> }<br>
><br>
><br>
> Modified: cfe/trunk/lib/CodeGen/<wbr>CodeGenFunction.h<br>
> URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CodeGenFunction.h?rev=284060&r1=284059&r2=284060&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/cfe/trunk/lib/CodeGen/<wbr>CodeGenFunction.h?rev=284060&<wbr>r1=284059&r2=284060&view=diff</a><br>
> ==============================<wbr>==============================<wbr>==================<br>
> --- cfe/trunk/lib/CodeGen/<wbr>CodeGenFunction.h (original)<br>
> +++ cfe/trunk/lib/CodeGen/<wbr>CodeGenFunction.h Wed Oct 12 17:01:05 2016<br>
> @@ -2961,6 +2961,12 @@ public:<br>
>   llvm::Value *EmitWebAssemblyBuiltinExpr(<wbr>unsigned BuiltinID,<br>
>                                           const CallExpr *E);<br>
><br>
> +private:<br>
> +  enum class MSVCIntrin;<br>
> +<br>
> +public:<br>
> +  llvm::Value *EmitMSVCBuiltinExpr(<wbr>MSVCIntrin BuiltinID, const CallExpr *E);<br>
> +<br>
>   llvm::Value *EmitObjCProtocolExpr(const ObjCProtocolExpr *E);<br>
>   llvm::Value *EmitObjCStringLiteral(const ObjCStringLiteral *E);<br>
>   llvm::Value *EmitObjCBoxedExpr(const ObjCBoxedExpr *E);<br>
><br>
> Modified: cfe/trunk/lib/Headers/intrin.h<br>
> URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Headers/intrin.h?rev=284060&r1=284059&r2=284060&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/cfe/trunk/lib/Headers/<wbr>intrin.h?rev=284060&r1=284059&<wbr>r2=284060&view=diff</a><br>
> ==============================<wbr>==============================<wbr>==================<br>
> --- cfe/trunk/lib/Headers/intrin.h (original)<br>
> +++ cfe/trunk/lib/Headers/intrin.h Wed Oct 12 17:01:05 2016<br>
> @@ -432,20 +432,6 @@ unsigned __int64 _umul128(unsigned __int<br>
> |* Bit Counting and Testing<br>
> \*----------------------------<wbr>------------------------------<wbr>------------------*/<br>
> static __inline__ unsigned char __DEFAULT_FN_ATTRS<br>
> -_BitScanForward(unsigned long *_Index, unsigned long _Mask) {<br>
> -  if (!_Mask)<br>
> -    return 0;<br>
> -  *_Index = __builtin_ctzl(_Mask);<br>
> -  return 1;<br>
> -}<br>
> -static __inline__ unsigned char __DEFAULT_FN_ATTRS<br>
> -_BitScanReverse(unsigned long *_Index, unsigned long _Mask) {<br>
> -  if (!_Mask)<br>
> -    return 0;<br>
> -  *_Index = 31 - __builtin_clzl(_Mask);<br>
> -  return 1;<br>
> -}<br>
> -static __inline__ unsigned char __DEFAULT_FN_ATTRS<br>
> _bittest(long const *_BitBase, long _BitPos) {<br>
>   return (*_BitBase >> _BitPos) & 1;<br>
> }<br>
> @@ -491,20 +477,6 @@ _interlockedbittestandset_rel(<wbr>long volat<br>
> #endif<br>
> #ifdef __x86_64__<br>
> static __inline__ unsigned char __DEFAULT_FN_ATTRS<br>
> -_BitScanForward64(unsigned long *_Index, unsigned __int64 _Mask) {<br>
> -  if (!_Mask)<br>
> -    return 0;<br>
> -  *_Index = __builtin_ctzll(_Mask);<br>
> -  return 1;<br>
> -}<br>
> -static __inline__ unsigned char __DEFAULT_FN_ATTRS<br>
> -_BitScanReverse64(unsigned long *_Index, unsigned __int64 _Mask) {<br>
> -  if (!_Mask)<br>
> -    return 0;<br>
> -  *_Index = 63 - __builtin_clzll(_Mask);<br>
> -  return 1;<br>
> -}<br>
> -static __inline__ unsigned char __DEFAULT_FN_ATTRS<br>
> _bittest64(__int64 const *_BitBase, __int64 _BitPos) {<br>
>   return (*_BitBase >> _BitPos) & 1;<br>
> }<br>
><br>
> Modified: cfe/trunk/test/CodeGen/ms-<wbr>intrinsics.c<br>
> URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGen/ms-intrinsics.c?rev=284060&r1=284059&r2=284060&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/cfe/trunk/test/<wbr>CodeGen/ms-intrinsics.c?rev=<wbr>284060&r1=284059&r2=284060&<wbr>view=diff</a><br>
> ==============================<wbr>==============================<wbr>==================<br>
> --- cfe/trunk/test/CodeGen/ms-<wbr>intrinsics.c (original)<br>
> +++ cfe/trunk/test/CodeGen/ms-<wbr>intrinsics.c Wed Oct 12 17:01:05 2016<br>
> @@ -1,12 +1,12 @@<br>
> // RUN: %clang_cc1 -ffreestanding -fms-extensions -fms-compatibility -fms-compatibility-version=17.<wbr>00 \<br>
> // RUN:         -triple i686--windows -Oz -emit-llvm %s -o - \<br>
> -// RUN:         | FileCheck %s -check-prefix CHECK -check-prefix CHECK-I386<br>
> +// RUN:         | FileCheck %s -check-prefix=CHECK -check-prefix=CHECK-I386<br>
> // RUN: %clang_cc1 -ffreestanding -fms-extensions -fms-compatibility -fms-compatibility-version=17.<wbr>00 \<br>
> // RUN:         -triple thumbv7--windows -Oz -emit-llvm %s -o - \<br>
> -// RUN:         | FileCheck %s<br>
> +// RUN:         | FileCheck %s --check-prefix=CHECK --check-prefix=CHECK-ARM-X64<br>
> // RUN: %clang_cc1 -ffreestanding -fms-extensions -fms-compatibility -fms-compatibility-version=17.<wbr>00 \<br>
> // RUN:         -triple x86_64--windows -Oz -emit-llvm %s -o - \<br>
> -// RUN:         | FileCheck %s --check-prefix=CHECK --check-prefix=CHECK-X64<br>
> +// RUN:         | FileCheck %s --check-prefix=CHECK --check-prefix=CHECK-X64 --check-prefix=CHECK-ARM-X64<br>
><br>
> // intrin.h needs size_t, but -ffreestanding prevents us from getting it from<br>
> // stddef.h.  Work around it with this typedef.<br>
> @@ -14,6 +14,68 @@ typedef __SIZE_TYPE__ size_t;<br>
><br>
> #include <intrin.h><br>
><br>
> +unsigned char test_BitScanForward(unsigned long *Index, unsigned long Mask) {<br>
> +  return _BitScanForward(Index, Mask);<br>
> +}<br>
> +// CHECK: define{{.*}}i8 @test_BitScanForward(i32* {{[a-z_ ]*}}%Index, i32 {{[a-z_ ]*}}%Mask){{.*}}{<br>
> +// CHECK:   [[ISNOTZERO:%[a-z0-9._]+]] = icmp eq i32 %Mask, 0<br>
> +// CHECK:   br i1 [[ISNOTZERO]], label %[[END_LABEL:[a-z0-9.]+]], label %[[ISNOTZERO_LABEL:[0-9]+]]<br>
> +// CHECK: ; <label>:[[END_LABEL]]:<br>
> +// CHECK:   [[RESULT:%[a-z0-9._]+]] = phi i8 [ 0, %[[ISZERO_LABEL:[0-9]+]] ], [ 1, %[[ISNOTZERO_LABEL]] ]<br>
> +// CHECK:   ret i8 [[RESULT]]<br>
> +// CHECK: ; <label>:[[ISNOTZERO_LABEL]]:<br>
> +// CHECK:   [[INDEX:%[0-9]+]] = tail call i32 @llvm.cttz.i32(i32 %Mask, i1 true)<br>
> +// CHECK:   store i32 [[INDEX]], i32* %Index, align 4<br>
> +// CHECK:   br label %[[END_LABEL]]<br>
> +<br>
> +unsigned char test_BitScanReverse(unsigned long *Index, unsigned long Mask) {<br>
> +  return _BitScanReverse(Index, Mask);<br>
> +}<br>
> +// CHECK: define{{.*}}i8 @test_BitScanReverse(i32* {{[a-z_ ]*}}%Index, i32 {{[a-z_ ]*}}%Mask){{.*}}{<br>
> +// CHECK:   [[ISNOTZERO:%[0-9]+]] = icmp eq i32 %Mask, 0<br>
> +// CHECK:   br i1 [[ISNOTZERO]], label %[[END_LABEL:[a-z0-9.]+]], label %[[ISNOTZERO_LABEL:[0-9]+]]<br>
> +// CHECK: ; <label>:[[END_LABEL]]:<br>
> +// CHECK:   [[RESULT:%[a-z0-9._]+]] = phi i8 [ 0, %[[ISZERO_LABEL:[0-9]+]] ], [ 1, %[[ISNOTZERO_LABEL]] ]<br>
> +// CHECK:   ret i8 [[RESULT]]<br>
> +// CHECK: ; <label>:[[ISNOTZERO_LABEL]]:<br>
> +// CHECK:   [[REVINDEX:%[0-9]+]] = tail call i32 @llvm.ctlz.i32(i32 %Mask, i1 true)<br>
> +// CHECK:   [[INDEX:%[0-9]+]] = xor i32 [[REVINDEX]], 31<br>
> +// CHECK:   store i32 [[INDEX]], i32* %Index, align 4<br>
> +// CHECK:   br label %[[END_LABEL]]<br>
> +<br>
> +#if defined(__x86_64__) || defined(__arm__)<br>
> +unsigned char test_BitScanForward64(unsigned long *Index, unsigned __int64 Mask) {<br>
> +  return _BitScanForward64(Index, Mask);<br>
> +}<br>
> +// CHECK-ARM-X64: define{{.*}}i8 @test_BitScanForward64(i32* {{[a-z_ ]*}}%Index, i64 {{[a-z_ ]*}}%Mask){{.*}}{<br>
> +// CHECK-ARM-X64:   [[ISNOTZERO:%[a-z0-9._]+]] = icmp eq i64 %Mask, 0<br>
> +// CHECK-ARM-X64:   br i1 [[ISNOTZERO]], label %[[END_LABEL:[a-z0-9.]+]], label %[[ISNOTZERO_LABEL:[0-9]+]]<br>
> +// CHECK-ARM-X64: ; <label>:[[END_LABEL]]:<br>
> +// CHECK-ARM-X64:   [[RESULT:%[a-z0-9._]+]] = phi i8 [ 0, %[[ISZERO_LABEL:[0-9]+]] ], [ 1, %[[ISNOTZERO_LABEL]] ]<br>
> +// CHECK-ARM-X64:   ret i8 [[RESULT]]<br>
> +// CHECK-ARM-X64: ; <label>:[[ISNOTZERO_LABEL]]:<br>
> +// CHECK-ARM-X64:   [[INDEX:%[0-9]+]] = tail call i64 @llvm.cttz.i64(i64 %Mask, i1 true)<br>
> +// CHECK-ARM-X64:   [[TRUNC_INDEX:%[0-9]+]] = trunc i64 [[INDEX]] to i32<br>
> +// CHECK-ARM-X64:   store i32 [[TRUNC_INDEX]], i32* %Index, align 4<br>
> +// CHECK-ARM-X64:   br label %[[END_LABEL]]<br>
> +<br>
> +unsigned char test_BitScanReverse64(unsigned long *Index, unsigned __int64 Mask) {<br>
> +  return _BitScanReverse64(Index, Mask);<br>
> +}<br>
> +// CHECK-ARM-X64: define{{.*}}i8 @test_BitScanReverse64(i32* {{[a-z_ ]*}}%Index, i64 {{[a-z_ ]*}}%Mask){{.*}}{<br>
> +// CHECK-ARM-X64:   [[ISNOTZERO:%[0-9]+]] = icmp eq i64 %Mask, 0<br>
> +// CHECK-ARM-X64:   br i1 [[ISNOTZERO]], label %[[END_LABEL:[a-z0-9.]+]], label %[[ISNOTZERO_LABEL:[0-9]+]]<br>
> +// CHECK-ARM-X64: ; <label>:[[END_LABEL]]:<br>
> +// CHECK-ARM-X64:   [[RESULT:%[a-z0-9._]+]] = phi i8 [ 0, %[[ISZERO_LABEL:[0-9]+]] ], [ 1, %[[ISNOTZERO_LABEL]] ]<br>
> +// CHECK-ARM-X64:   ret i8 [[RESULT]]<br>
> +// CHECK-ARM-X64: ; <label>:[[ISNOTZERO_LABEL]]:<br>
> +// CHECK-ARM-X64:   [[REVINDEX:%[0-9]+]] = tail call i64 @llvm.ctlz.i64(i64 %Mask, i1 true)<br>
> +// CHECK-ARM-X64:   [[TRUNC_REVINDEX:%[0-9]+]] = trunc i64 [[REVINDEX]] to i32<br>
> +// CHECK-ARM-X64:   [[INDEX:%[0-9]+]] = xor i32 [[TRUNC_REVINDEX]], 63<br>
> +// CHECK-ARM-X64:   store i32 [[INDEX]], i32* %Index, align 4<br>
> +// CHECK-ARM-X64:   br label %[[END_LABEL]]<br>
> +#endif<br>
> +<br>
> void *test_<wbr>InterlockedExchangePointer(<wbr>void * volatile *Target, void *Value) {<br>
>   return _InterlockedExchangePointer(<wbr>Target, Value);<br>
> }<br>
><br>
><br>
> ______________________________<wbr>_________________<br>
> cfe-commits mailing list<br>
> <a href="mailto:cfe-commits@lists.llvm.org">cfe-commits@lists.llvm.org</a><br>
> <a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits" rel="noreferrer" target="_blank">http://lists.llvm.org/cgi-bin/<wbr>mailman/listinfo/cfe-commits</a><br>
<br>
______________________________<wbr>_________________<br>
cfe-commits mailing list<br>
<a href="mailto:cfe-commits@lists.llvm.org">cfe-commits@lists.llvm.org</a><br>
<a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits" rel="noreferrer" target="_blank">http://lists.llvm.org/cgi-bin/<wbr>mailman/listinfo/cfe-commits</a><br>
</div></div></blockquote></div><br><br clear="all"><div><br></div>-- <br><div class="gmail_signature">Saleem Abdulrasool<br>compnerd (at) compnerd (dot) org</div>
</div></div>