r284060 - Implement MS _BitScan intrinsics

Saleem Abdulrasool via cfe-commits cfe-commits at lists.llvm.org
Wed Jun 7 19:31:45 PDT 2017


I'm worried about changing this signature all the time.  I suspect that it
will cause the following to be emitted for valid code:

warning: incompatible pointer types passing 'unsigned long *' to parameter
of type 'unsigned int *' [-Wincompatible-pointer-types]

Switching the signature on LP64 sounds much better to me.

On Wed, Jun 7, 2017 at 2:56 PM, Duncan P. N. Exon Smith via cfe-commits <
cfe-commits at lists.llvm.org> wrote:

> [... excuse the necromancy...]
>
> Hi Albert (and Reid and David),
>
> 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.
>
> One idea we've had for fixing this is to use "int" instead of "long" for
> these intrinsics, either:
> - all the time, or
> - when in LP64 mode (e.g., Darwin + -fms-extensions).
>
> Any other ideas?
>
> Thanks,
> Duncan
>
> > On Oct 12, 2016, at 15:01, Albert Gutowski via cfe-commits <
> cfe-commits at lists.llvm.org> wrote:
> >
> > Author: agutowski
> > Date: Wed Oct 12 17:01:05 2016
> > New Revision: 284060
> >
> > URL: http://llvm.org/viewvc/llvm-project?rev=284060&view=rev
> > Log:
> > Implement MS _BitScan intrinsics
> >
> > 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.
> >
> > Reviewers: hans, thakis, rnk, majnemer
> >
> > Subscribers: RKSimon, cfe-commits, aemerson
> >
> > Differential Revision: https://reviews.llvm.org/D25264
> >
> > Modified:
> >    cfe/trunk/include/clang/Basic/BuiltinsARM.def
> >    cfe/trunk/include/clang/Basic/BuiltinsX86.def
> >    cfe/trunk/include/clang/Basic/BuiltinsX86_64.def
> >    cfe/trunk/lib/Basic/Targets.cpp
> >    cfe/trunk/lib/CodeGen/CGBuiltin.cpp
> >    cfe/trunk/lib/CodeGen/CodeGenFunction.h
> >    cfe/trunk/lib/Headers/intrin.h
> >    cfe/trunk/test/CodeGen/ms-intrinsics.c
> >
> > Modified: cfe/trunk/include/clang/Basic/BuiltinsARM.def
> > URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/
> clang/Basic/BuiltinsARM.def?rev=284060&r1=284059&r2=284060&view=diff
> > ============================================================
> ==================
> > --- cfe/trunk/include/clang/Basic/BuiltinsARM.def (original)
> > +++ cfe/trunk/include/clang/Basic/BuiltinsARM.def Wed Oct 12 17:01:05
> 2016
> > @@ -18,6 +18,10 @@
> > #   define LANGBUILTIN(ID, TYPE, ATTRS, BUILTIN_LANG) BUILTIN(ID, TYPE,
> ATTRS)
> > #endif
> >
> > +#if defined(BUILTIN) && !defined(TARGET_HEADER_BUILTIN)
> > +#  define TARGET_HEADER_BUILTIN(ID, TYPE, ATTRS, HEADER, LANG, FEATURE)
> BUILTIN(ID, TYPE, ATTRS)
> > +#endif
> > +
> > // In libgcc
> > BUILTIN(__clear_cache, "vv*v*", "i")
> >
> > @@ -129,5 +133,11 @@ LANGBUILTIN(_MoveFromCoprocessor2, "UiIU
> > LANGBUILTIN(_MoveToCoprocessor, "vUiIUiIUiIUiIUiIUi", "",
> ALL_MS_LANGUAGES)
> > LANGBUILTIN(_MoveToCoprocessor2, "vUiIUiIUiIUiIUiIUi", "",
> ALL_MS_LANGUAGES)
> >
> > +TARGET_HEADER_BUILTIN(_BitScanForward, "UcULi*ULi", "n", "intrin.h",
> ALL_MS_LANGUAGES, "")
> > +TARGET_HEADER_BUILTIN(_BitScanReverse, "UcULi*ULi", "n", "intrin.h",
> ALL_MS_LANGUAGES, "")
> > +TARGET_HEADER_BUILTIN(_BitScanForward64, "UcULi*ULLi", "n",
> "intrin.h", ALL_MS_LANGUAGES, "")
> > +TARGET_HEADER_BUILTIN(_BitScanReverse64, "UcULi*ULLi", "n",
> "intrin.h", ALL_MS_LANGUAGES, "")
> > +
> > #undef BUILTIN
> > #undef LANGBUILTIN
> > +#undef TARGET_HEADER_BUILTIN
> >
> > Modified: cfe/trunk/include/clang/Basic/BuiltinsX86.def
> > URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/
> clang/Basic/BuiltinsX86.def?rev=284060&r1=284059&r2=284060&view=diff
> > ============================================================
> ==================
> > --- cfe/trunk/include/clang/Basic/BuiltinsX86.def (original)
> > +++ cfe/trunk/include/clang/Basic/BuiltinsX86.def Wed Oct 12 17:01:05
> 2016
> > @@ -2028,6 +2028,10 @@ TARGET_BUILTIN(__builtin_ia32_selectpd_5
> > TARGET_BUILTIN(__builtin_ia32_monitorx, "vv*UiUi", "", "mwaitx")
> > TARGET_BUILTIN(__builtin_ia32_mwaitx, "vUiUiUi", "", "mwaitx")
> >
> > +// MSVC
> > +TARGET_HEADER_BUILTIN(_BitScanForward, "UcULi*ULi", "n", "intrin.h",
> ALL_MS_LANGUAGES, "")
> > +TARGET_HEADER_BUILTIN(_BitScanReverse, "UcULi*ULi", "n", "intrin.h",
> ALL_MS_LANGUAGES, "")
> > +
> > 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, "")
> >
> > Modified: cfe/trunk/include/clang/Basic/BuiltinsX86_64.def
> > URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/
> clang/Basic/BuiltinsX86_64.def?rev=284060&r1=284059&r2=284060&view=diff
> > ============================================================
> ==================
> > --- cfe/trunk/include/clang/Basic/BuiltinsX86_64.def (original)
> > +++ cfe/trunk/include/clang/Basic/BuiltinsX86_64.def Wed Oct 12
> 17:01:05 2016
> > @@ -22,6 +22,9 @@
> > #  define TARGET_HEADER_BUILTIN(ID, TYPE, ATTRS, HEADER, LANG, FEATURE)
> BUILTIN(ID, TYPE, ATTRS)
> > #endif
> >
> > +TARGET_HEADER_BUILTIN(_BitScanForward64, "UcULi*ULLi", "n",
> "intrin.h", ALL_MS_LANGUAGES, "")
> > +TARGET_HEADER_BUILTIN(_BitScanReverse64, "UcULi*ULLi", "n",
> "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*",      "nh",   "intrin.h",
> ALL_MS_LANGUAGES, "")
> >
> > Modified: cfe/trunk/lib/Basic/Targets.cpp
> > URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Basic/
> Targets.cpp?rev=284060&r1=284059&r2=284060&view=diff
> > ============================================================
> ==================
> > --- cfe/trunk/lib/Basic/Targets.cpp (original)
> > +++ cfe/trunk/lib/Basic/Targets.cpp Wed Oct 12 17:01:05 2016
> > @@ -5588,6 +5588,8 @@ const Builtin::Info ARMTargetInfo::Built
> >   { #ID, TYPE, ATTRS, nullptr, LANG, nullptr },
> > #define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
> >   { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
> > +#define TARGET_HEADER_BUILTIN(ID, TYPE, ATTRS, HEADER, LANGS, FEATURE) \
> > +  { #ID, TYPE, ATTRS, HEADER, LANGS, FEATURE },
> > #include "clang/Basic/BuiltinsARM.def"
> > };
> >
> >
> > Modified: cfe/trunk/lib/CodeGen/CGBuiltin.cpp
> > URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/
> CGBuiltin.cpp?rev=284060&r1=284059&r2=284060&view=diff
> > ============================================================
> ==================
> > --- cfe/trunk/lib/CodeGen/CGBuiltin.cpp (original)
> > +++ cfe/trunk/lib/CodeGen/CGBuiltin.cpp Wed Oct 12 17:01:05 2016
> > @@ -2637,6 +2637,68 @@ static Value *EmitTargetArchBuiltinExpr(
> >   }
> > }
> >
> > +// Many of MSVC builtins are on both x64 and ARM; to avoid repeating
> code, we
> > +// handle them here.
> > +enum class CodeGenFunction::MSVCIntrin {
> > +  _BitScanForward,
> > +  _BitScanReverse
> > +};
> > +
> > +Value *CodeGenFunction::EmitMSVCBuiltinExpr(MSVCIntrin BuiltinID,
> > +                                            const CallExpr *E) {
> > +  switch (BuiltinID) {
> > +  case MSVCIntrin::_BitScanForward:
> > +  case MSVCIntrin::_BitScanReverse: {
> > +    Value *ArgValue = EmitScalarExpr(E->getArg(1));
> > +
> > +    llvm::Type *ArgType = ArgValue->getType();
> > +    llvm::Type *IndexType =
> > +        EmitScalarExpr(E->getArg(0))->getType()->
> getPointerElementType();
> > +    llvm::Type *ResultType = ConvertType(E->getType());
> > +
> > +    Value *ArgZero = llvm::Constant::getNullValue(ArgType);
> > +    Value *ResZero = llvm::Constant::getNullValue(ResultType);
> > +    Value *ResOne = llvm::ConstantInt::get(ResultType, 1);
> > +
> > +    BasicBlock *Begin = Builder.GetInsertBlock();
> > +    BasicBlock *End = createBasicBlock("bitscan_end", this->CurFn);
> > +    Builder.SetInsertPoint(End);
> > +    PHINode *Result = Builder.CreatePHI(ResultType, 2,
> "bitscan_result");
> > +
> > +    Builder.SetInsertPoint(Begin);
> > +    Value *IsZero = Builder.CreateICmpEQ(ArgValue, ArgZero);
> > +    BasicBlock *NotZero = createBasicBlock("bitscan_not_zero",
> this->CurFn);
> > +    Builder.CreateCondBr(IsZero, End, NotZero);
> > +    Result->addIncoming(ResZero, Begin);
> > +
> > +    Builder.SetInsertPoint(NotZero);
> > +    Address IndexAddress = EmitPointerWithAlignment(E->getArg(0));
> > +
> > +    if (BuiltinID == MSVCIntrin::_BitScanForward) {
> > +      Value *F = CGM.getIntrinsic(Intrinsic::cttz, ArgType);
> > +      Value *ZeroCount = Builder.CreateCall(F, {ArgValue,
> Builder.getTrue()});
> > +      ZeroCount = Builder.CreateIntCast(ZeroCount, IndexType, false);
> > +      Builder.CreateStore(ZeroCount, IndexAddress, false);
> > +    } else {
> > +      unsigned ArgWidth = cast<llvm::IntegerType>(
> ArgType)->getBitWidth();
> > +      Value *ArgTypeLastIndex = llvm::ConstantInt::get(IndexType,
> ArgWidth - 1);
> > +
> > +      Value *F = CGM.getIntrinsic(Intrinsic::ctlz, ArgType);
> > +      Value *ZeroCount = Builder.CreateCall(F, {ArgValue,
> Builder.getTrue()});
> > +      ZeroCount = Builder.CreateIntCast(ZeroCount, IndexType, false);
> > +      Value *Index = Builder.CreateNSWSub(ArgTypeLastIndex, ZeroCount);
> > +      Builder.CreateStore(Index, IndexAddress, false);
> > +    }
> > +    Builder.CreateBr(End);
> > +    Result->addIncoming(ResOne, NotZero);
> > +
> > +    Builder.SetInsertPoint(End);
> > +    return Result;
> > +  }
> > +  }
> > +  llvm_unreachable("Incorrect MSVC intrinsic!");
> > +}
> > +
> > Value *CodeGenFunction::EmitTargetBuiltinExpr(unsigned BuiltinID,
> >                                               const CallExpr *E) {
> >   if (getContext().BuiltinInfo.isAuxBuiltinID(BuiltinID)) {
> > @@ -4561,6 +4623,12 @@ Value *CodeGenFunction::EmitARMBuiltinEx
> >     return Builder.CreateCall(F, {Ops[1], Ops[2], Ops[0],
> >                                   Ops[3], Ops[4], Ops[5]});
> >   }
> > +  case ARM::BI_BitScanForward:
> > +  case ARM::BI_BitScanForward64:
> > +    return EmitMSVCBuiltinExpr(MSVCIntrin::_BitScanForward, E);
> > +  case ARM::BI_BitScanReverse:
> > +  case ARM::BI_BitScanReverse64:
> > +    return EmitMSVCBuiltinExpr(MSVCIntrin::_BitScanReverse, E);
> >   }
> >
> >   // Get the last argument, which specifies the vector type.
> > @@ -7623,6 +7691,12 @@ Value *CodeGenFunction::EmitX86BuiltinEx
> >     return Builder.CreateFence(llvm::AtomicOrdering::
> SequentiallyConsistent,
> >                                llvm::SingleThread);
> >   }
> > +  case X86::BI_BitScanForward:
> > +  case X86::BI_BitScanForward64:
> > +    return EmitMSVCBuiltinExpr(MSVCIntrin::_BitScanForward, E);
> > +  case X86::BI_BitScanReverse:
> > +  case X86::BI_BitScanReverse64:
> > +    return EmitMSVCBuiltinExpr(MSVCIntrin::_BitScanReverse, E);
> >   }
> > }
> >
> >
> > Modified: cfe/trunk/lib/CodeGen/CodeGenFunction.h
> > URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/
> CodeGenFunction.h?rev=284060&r1=284059&r2=284060&view=diff
> > ============================================================
> ==================
> > --- cfe/trunk/lib/CodeGen/CodeGenFunction.h (original)
> > +++ cfe/trunk/lib/CodeGen/CodeGenFunction.h Wed Oct 12 17:01:05 2016
> > @@ -2961,6 +2961,12 @@ public:
> >   llvm::Value *EmitWebAssemblyBuiltinExpr(unsigned BuiltinID,
> >                                           const CallExpr *E);
> >
> > +private:
> > +  enum class MSVCIntrin;
> > +
> > +public:
> > +  llvm::Value *EmitMSVCBuiltinExpr(MSVCIntrin BuiltinID, const
> CallExpr *E);
> > +
> >   llvm::Value *EmitObjCProtocolExpr(const ObjCProtocolExpr *E);
> >   llvm::Value *EmitObjCStringLiteral(const ObjCStringLiteral *E);
> >   llvm::Value *EmitObjCBoxedExpr(const ObjCBoxedExpr *E);
> >
> > Modified: cfe/trunk/lib/Headers/intrin.h
> > URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Headers/
> intrin.h?rev=284060&r1=284059&r2=284060&view=diff
> > ============================================================
> ==================
> > --- cfe/trunk/lib/Headers/intrin.h (original)
> > +++ cfe/trunk/lib/Headers/intrin.h Wed Oct 12 17:01:05 2016
> > @@ -432,20 +432,6 @@ unsigned __int64 _umul128(unsigned __int
> > |* Bit Counting and Testing
> > \*----------------------------------------------------------
> ------------------*/
> > static __inline__ unsigned char __DEFAULT_FN_ATTRS
> > -_BitScanForward(unsigned long *_Index, unsigned long _Mask) {
> > -  if (!_Mask)
> > -    return 0;
> > -  *_Index = __builtin_ctzl(_Mask);
> > -  return 1;
> > -}
> > -static __inline__ unsigned char __DEFAULT_FN_ATTRS
> > -_BitScanReverse(unsigned long *_Index, unsigned long _Mask) {
> > -  if (!_Mask)
> > -    return 0;
> > -  *_Index = 31 - __builtin_clzl(_Mask);
> > -  return 1;
> > -}
> > -static __inline__ unsigned char __DEFAULT_FN_ATTRS
> > _bittest(long const *_BitBase, long _BitPos) {
> >   return (*_BitBase >> _BitPos) & 1;
> > }
> > @@ -491,20 +477,6 @@ _interlockedbittestandset_rel(long volat
> > #endif
> > #ifdef __x86_64__
> > static __inline__ unsigned char __DEFAULT_FN_ATTRS
> > -_BitScanForward64(unsigned long *_Index, unsigned __int64 _Mask) {
> > -  if (!_Mask)
> > -    return 0;
> > -  *_Index = __builtin_ctzll(_Mask);
> > -  return 1;
> > -}
> > -static __inline__ unsigned char __DEFAULT_FN_ATTRS
> > -_BitScanReverse64(unsigned long *_Index, unsigned __int64 _Mask) {
> > -  if (!_Mask)
> > -    return 0;
> > -  *_Index = 63 - __builtin_clzll(_Mask);
> > -  return 1;
> > -}
> > -static __inline__ unsigned char __DEFAULT_FN_ATTRS
> > _bittest64(__int64 const *_BitBase, __int64 _BitPos) {
> >   return (*_BitBase >> _BitPos) & 1;
> > }
> >
> > Modified: cfe/trunk/test/CodeGen/ms-intrinsics.c
> > URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/
> CodeGen/ms-intrinsics.c?rev=284060&r1=284059&r2=284060&view=diff
> > ============================================================
> ==================
> > --- cfe/trunk/test/CodeGen/ms-intrinsics.c (original)
> > +++ cfe/trunk/test/CodeGen/ms-intrinsics.c Wed Oct 12 17:01:05 2016
> > @@ -1,12 +1,12 @@
> > // RUN: %clang_cc1 -ffreestanding -fms-extensions -fms-compatibility
> -fms-compatibility-version=17.00 \
> > // RUN:         -triple i686--windows -Oz -emit-llvm %s -o - \
> > -// RUN:         | FileCheck %s -check-prefix CHECK -check-prefix
> CHECK-I386
> > +// RUN:         | FileCheck %s -check-prefix=CHECK
> -check-prefix=CHECK-I386
> > // RUN: %clang_cc1 -ffreestanding -fms-extensions -fms-compatibility
> -fms-compatibility-version=17.00 \
> > // RUN:         -triple thumbv7--windows -Oz -emit-llvm %s -o - \
> > -// RUN:         | FileCheck %s
> > +// RUN:         | FileCheck %s --check-prefix=CHECK
> --check-prefix=CHECK-ARM-X64
> > // RUN: %clang_cc1 -ffreestanding -fms-extensions -fms-compatibility
> -fms-compatibility-version=17.00 \
> > // RUN:         -triple x86_64--windows -Oz -emit-llvm %s -o - \
> > -// RUN:         | FileCheck %s --check-prefix=CHECK
> --check-prefix=CHECK-X64
> > +// RUN:         | FileCheck %s --check-prefix=CHECK
> --check-prefix=CHECK-X64 --check-prefix=CHECK-ARM-X64
> >
> > // intrin.h needs size_t, but -ffreestanding prevents us from getting it
> from
> > // stddef.h.  Work around it with this typedef.
> > @@ -14,6 +14,68 @@ typedef __SIZE_TYPE__ size_t;
> >
> > #include <intrin.h>
> >
> > +unsigned char test_BitScanForward(unsigned long *Index, unsigned long
> Mask) {
> > +  return _BitScanForward(Index, Mask);
> > +}
> > +// CHECK: define{{.*}}i8 @test_BitScanForward(i32* {{[a-z_ ]*}}%Index,
> i32 {{[a-z_ ]*}}%Mask){{.*}}{
> > +// CHECK:   [[ISNOTZERO:%[a-z0-9._]+]] = icmp eq i32 %Mask, 0
> > +// CHECK:   br i1 [[ISNOTZERO]], label %[[END_LABEL:[a-z0-9.]+]], label
> %[[ISNOTZERO_LABEL:[0-9]+]]
> > +// CHECK: ; <label>:[[END_LABEL]]:
> > +// CHECK:   [[RESULT:%[a-z0-9._]+]] = phi i8 [ 0,
> %[[ISZERO_LABEL:[0-9]+]] ], [ 1, %[[ISNOTZERO_LABEL]] ]
> > +// CHECK:   ret i8 [[RESULT]]
> > +// CHECK: ; <label>:[[ISNOTZERO_LABEL]]:
> > +// CHECK:   [[INDEX:%[0-9]+]] = tail call i32 @llvm.cttz.i32(i32 %Mask,
> i1 true)
> > +// CHECK:   store i32 [[INDEX]], i32* %Index, align 4
> > +// CHECK:   br label %[[END_LABEL]]
> > +
> > +unsigned char test_BitScanReverse(unsigned long *Index, unsigned long
> Mask) {
> > +  return _BitScanReverse(Index, Mask);
> > +}
> > +// CHECK: define{{.*}}i8 @test_BitScanReverse(i32* {{[a-z_ ]*}}%Index,
> i32 {{[a-z_ ]*}}%Mask){{.*}}{
> > +// CHECK:   [[ISNOTZERO:%[0-9]+]] = icmp eq i32 %Mask, 0
> > +// CHECK:   br i1 [[ISNOTZERO]], label %[[END_LABEL:[a-z0-9.]+]], label
> %[[ISNOTZERO_LABEL:[0-9]+]]
> > +// CHECK: ; <label>:[[END_LABEL]]:
> > +// CHECK:   [[RESULT:%[a-z0-9._]+]] = phi i8 [ 0,
> %[[ISZERO_LABEL:[0-9]+]] ], [ 1, %[[ISNOTZERO_LABEL]] ]
> > +// CHECK:   ret i8 [[RESULT]]
> > +// CHECK: ; <label>:[[ISNOTZERO_LABEL]]:
> > +// CHECK:   [[REVINDEX:%[0-9]+]] = tail call i32 @llvm.ctlz.i32(i32
> %Mask, i1 true)
> > +// CHECK:   [[INDEX:%[0-9]+]] = xor i32 [[REVINDEX]], 31
> > +// CHECK:   store i32 [[INDEX]], i32* %Index, align 4
> > +// CHECK:   br label %[[END_LABEL]]
> > +
> > +#if defined(__x86_64__) || defined(__arm__)
> > +unsigned char test_BitScanForward64(unsigned long *Index, unsigned
> __int64 Mask) {
> > +  return _BitScanForward64(Index, Mask);
> > +}
> > +// CHECK-ARM-X64: define{{.*}}i8 @test_BitScanForward64(i32* {{[a-z_
> ]*}}%Index, i64 {{[a-z_ ]*}}%Mask){{.*}}{
> > +// CHECK-ARM-X64:   [[ISNOTZERO:%[a-z0-9._]+]] = icmp eq i64 %Mask, 0
> > +// CHECK-ARM-X64:   br i1 [[ISNOTZERO]], label
> %[[END_LABEL:[a-z0-9.]+]], label %[[ISNOTZERO_LABEL:[0-9]+]]
> > +// CHECK-ARM-X64: ; <label>:[[END_LABEL]]:
> > +// CHECK-ARM-X64:   [[RESULT:%[a-z0-9._]+]] = phi i8 [ 0,
> %[[ISZERO_LABEL:[0-9]+]] ], [ 1, %[[ISNOTZERO_LABEL]] ]
> > +// CHECK-ARM-X64:   ret i8 [[RESULT]]
> > +// CHECK-ARM-X64: ; <label>:[[ISNOTZERO_LABEL]]:
> > +// CHECK-ARM-X64:   [[INDEX:%[0-9]+]] = tail call i64
> @llvm.cttz.i64(i64 %Mask, i1 true)
> > +// CHECK-ARM-X64:   [[TRUNC_INDEX:%[0-9]+]] = trunc i64 [[INDEX]] to i32
> > +// CHECK-ARM-X64:   store i32 [[TRUNC_INDEX]], i32* %Index, align 4
> > +// CHECK-ARM-X64:   br label %[[END_LABEL]]
> > +
> > +unsigned char test_BitScanReverse64(unsigned long *Index, unsigned
> __int64 Mask) {
> > +  return _BitScanReverse64(Index, Mask);
> > +}
> > +// CHECK-ARM-X64: define{{.*}}i8 @test_BitScanReverse64(i32* {{[a-z_
> ]*}}%Index, i64 {{[a-z_ ]*}}%Mask){{.*}}{
> > +// CHECK-ARM-X64:   [[ISNOTZERO:%[0-9]+]] = icmp eq i64 %Mask, 0
> > +// CHECK-ARM-X64:   br i1 [[ISNOTZERO]], label
> %[[END_LABEL:[a-z0-9.]+]], label %[[ISNOTZERO_LABEL:[0-9]+]]
> > +// CHECK-ARM-X64: ; <label>:[[END_LABEL]]:
> > +// CHECK-ARM-X64:   [[RESULT:%[a-z0-9._]+]] = phi i8 [ 0,
> %[[ISZERO_LABEL:[0-9]+]] ], [ 1, %[[ISNOTZERO_LABEL]] ]
> > +// CHECK-ARM-X64:   ret i8 [[RESULT]]
> > +// CHECK-ARM-X64: ; <label>:[[ISNOTZERO_LABEL]]:
> > +// CHECK-ARM-X64:   [[REVINDEX:%[0-9]+]] = tail call i64
> @llvm.ctlz.i64(i64 %Mask, i1 true)
> > +// CHECK-ARM-X64:   [[TRUNC_REVINDEX:%[0-9]+]] = trunc i64 [[REVINDEX]]
> to i32
> > +// CHECK-ARM-X64:   [[INDEX:%[0-9]+]] = xor i32 [[TRUNC_REVINDEX]], 63
> > +// CHECK-ARM-X64:   store i32 [[INDEX]], i32* %Index, align 4
> > +// CHECK-ARM-X64:   br label %[[END_LABEL]]
> > +#endif
> > +
> > void *test_InterlockedExchangePointer(void * volatile *Target, void
> *Value) {
> >   return _InterlockedExchangePointer(Target, Value);
> > }
> >
> >
> > _______________________________________________
> > cfe-commits mailing list
> > cfe-commits at lists.llvm.org
> > http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
>
> _______________________________________________
> cfe-commits mailing list
> cfe-commits at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
>



-- 
Saleem Abdulrasool
compnerd (at) compnerd (dot) org
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20170607/f2a76952/attachment-0001.html>


More information about the cfe-commits mailing list