r284060 - Implement MS _BitScan intrinsics
Erik Schwiebert via cfe-commits
cfe-commits at lists.llvm.org
Thu Jun 8 12:21:40 PDT 2017
It’s probably also better to not try to infer our weird desired behavior. It should probably be controlled by a specific driver directive, like “-fms-extensions-lp64-intrinsics” or something like that. Using a new directive means that nobody can accidentally get this behavior if they for some reason do want LLP64 behavior with Windows intrinsics.
Schwieb
From: Erik Schwiebert
Sent: Thursday, June 8, 2017 10:29 AM
To: 'Saleem Abdulrasool' <compnerd at compnerd.org>; Duncan P. N. Exon Smith <dexonsmith at apple.com>
Cc: Albert Gutowski <agutowski at google.com>; Reid Kleckner <rnk at google.com>; David Majnemer <david.majnemer at gmail.com>; cfe-commits <cfe-commits at lists.llvm.org>
Subject: RE: r284060 - Implement MS _BitScan intrinsics
Yes, we definitely do not want to introduce pointer-type incompatibility warnings. Predicating the behavior change on LP64 vs LLP64 seems better.
What’s the best way to do that? Brian and I can hack on clang a bit, but we’re certainly not experts.
Schwieb
From: Saleem Abdulrasool [mailto:compnerd at compnerd.org]
Sent: Wednesday, June 7, 2017 7:32 PM
To: Duncan P. N. Exon Smith <dexonsmith at apple.com<mailto:dexonsmith at apple.com>>
Cc: Albert Gutowski <agutowski at google.com<mailto:agutowski at google.com>>; Reid Kleckner <rnk at google.com<mailto:rnk at google.com>>; David Majnemer <david.majnemer at gmail.com<mailto:david.majnemer at gmail.com>>; cfe-commits <cfe-commits at lists.llvm.org<mailto:cfe-commits at lists.llvm.org>>; Erik Schwiebert <eriksc at microsoft.com<mailto:eriksc at microsoft.com>>
Subject: Re: r284060 - Implement MS _BitScan intrinsics
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<mailto: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<mailto: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<https://na01.safelinks.protection.outlook.com/?url=http%3A%2F%2Fllvm.org%2Fviewvc%2Fllvm-project%3Frev%3D284060%26view%3Drev&data=02%7C01%7Ceriksc%40microsoft.com%7C2a2522c4af134940d62708d4ae16832e%7C72f988bf86f141af91ab2d7cd011db47%7C1%7C0%7C636324859101456322&sdata=uIMEYcgjFKByhB81x%2FX7%2B0Wm3HMK3hURS4yN7AsKbbI%3D&reserved=0>
> 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<https://na01.safelinks.protection.outlook.com/?url=https%3A%2F%2Freviews.llvm.org%2FD25264&data=02%7C01%7Ceriksc%40microsoft.com%7C2a2522c4af134940d62708d4ae16832e%7C72f988bf86f141af91ab2d7cd011db47%7C1%7C0%7C636324859101456322&sdata=Gwet6%2FKOIUgc03VtXdmk%2BTah9VXUrLReutN36lw3caw%3D&reserved=0>
>
> 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<https://na01.safelinks.protection.outlook.com/?url=http%3A%2F%2Fllvm.org%2Fviewvc%2Fllvm-project%2Fcfe%2Ftrunk%2Finclude%2Fclang%2FBasic%2FBuiltinsARM.def%3Frev%3D284060%26r1%3D284059%26r2%3D284060%26view%3Ddiff&data=02%7C01%7Ceriksc%40microsoft.com%7C2a2522c4af134940d62708d4ae16832e%7C72f988bf86f141af91ab2d7cd011db47%7C1%7C0%7C636324859101456322&sdata=cse0wyDrNGXlbDkfKXjTS3NKWVc01xiwMFfvoBCzAXw%3D&reserved=0>
> ==============================================================================
> --- 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<https://na01.safelinks.protection.outlook.com/?url=http%3A%2F%2Fllvm.org%2Fviewvc%2Fllvm-project%2Fcfe%2Ftrunk%2Finclude%2Fclang%2FBasic%2FBuiltinsX86.def%3Frev%3D284060%26r1%3D284059%26r2%3D284060%26view%3Ddiff&data=02%7C01%7Ceriksc%40microsoft.com%7C2a2522c4af134940d62708d4ae16832e%7C72f988bf86f141af91ab2d7cd011db47%7C1%7C0%7C636324859101456322&sdata=GkXN7tOyVzhOiBSf7dGELrISc9Nm1NpFz99AQuldYWo%3D&reserved=0>
> ==============================================================================
> --- 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<https://na01.safelinks.protection.outlook.com/?url=http%3A%2F%2Fllvm.org%2Fviewvc%2Fllvm-project%2Fcfe%2Ftrunk%2Finclude%2Fclang%2FBasic%2FBuiltinsX86_64.def%3Frev%3D284060%26r1%3D284059%26r2%3D284060%26view%3Ddiff&data=02%7C01%7Ceriksc%40microsoft.com%7C2a2522c4af134940d62708d4ae16832e%7C72f988bf86f141af91ab2d7cd011db47%7C1%7C0%7C636324859101456322&sdata=8t%2Bp8phv4rnfI5pxyM87UKrqJo1UT%2FTTQ09b5rX6LZ4%3D&reserved=0>
> ==============================================================================
> --- 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<https://na01.safelinks.protection.outlook.com/?url=http%3A%2F%2Fllvm.org%2Fviewvc%2Fllvm-project%2Fcfe%2Ftrunk%2Flib%2FBasic%2FTargets.cpp%3Frev%3D284060%26r1%3D284059%26r2%3D284060%26view%3Ddiff&data=02%7C01%7Ceriksc%40microsoft.com%7C2a2522c4af134940d62708d4ae16832e%7C72f988bf86f141af91ab2d7cd011db47%7C1%7C0%7C636324859101456322&sdata=4BduCWaMgnMrn8%2BX%2B3%2F0KIPFo8zEZOhqRHO7%2FFtWB9c%3D&reserved=0>
> ==============================================================================
> --- 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<https://na01.safelinks.protection.outlook.com/?url=http%3A%2F%2Fllvm.org%2Fviewvc%2Fllvm-project%2Fcfe%2Ftrunk%2Flib%2FCodeGen%2FCGBuiltin.cpp%3Frev%3D284060%26r1%3D284059%26r2%3D284060%26view%3Ddiff&data=02%7C01%7Ceriksc%40microsoft.com%7C2a2522c4af134940d62708d4ae16832e%7C72f988bf86f141af91ab2d7cd011db47%7C1%7C0%7C636324859101456322&sdata=VR5Jgc%2Bp4C9UOC58q9HBq7FW%2BGrM1W8BIWsRKHleWQw%3D&reserved=0>
> ==============================================================================
> --- 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<https://na01.safelinks.protection.outlook.com/?url=http%3A%2F%2Fllvm.org%2Fviewvc%2Fllvm-project%2Fcfe%2Ftrunk%2Flib%2FCodeGen%2FCodeGenFunction.h%3Frev%3D284060%26r1%3D284059%26r2%3D284060%26view%3Ddiff&data=02%7C01%7Ceriksc%40microsoft.com%7C2a2522c4af134940d62708d4ae16832e%7C72f988bf86f141af91ab2d7cd011db47%7C1%7C0%7C636324859101456322&sdata=wr2agvaXcUk71Lrl3FRJnZzGOB7gy9yRkkFoIAaa1gY%3D&reserved=0>
> ==============================================================================
> --- 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<https://na01.safelinks.protection.outlook.com/?url=http%3A%2F%2Fllvm.org%2Fviewvc%2Fllvm-project%2Fcfe%2Ftrunk%2Flib%2FHeaders%2Fintrin.h%3Frev%3D284060%26r1%3D284059%26r2%3D284060%26view%3Ddiff&data=02%7C01%7Ceriksc%40microsoft.com%7C2a2522c4af134940d62708d4ae16832e%7C72f988bf86f141af91ab2d7cd011db47%7C1%7C0%7C636324859101456322&sdata=wDfn%2BWeW0rZMc%2BltQ8On3qniNRoeApcEzOQqCRL3Kmo%3D&reserved=0>
> ==============================================================================
> --- 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<https://na01.safelinks.protection.outlook.com/?url=http%3A%2F%2Fllvm.org%2Fviewvc%2Fllvm-project%2Fcfe%2Ftrunk%2Ftest%2FCodeGen%2Fms-intrinsics.c%3Frev%3D284060%26r1%3D284059%26r2%3D284060%26view%3Ddiff&data=02%7C01%7Ceriksc%40microsoft.com%7C2a2522c4af134940d62708d4ae16832e%7C72f988bf86f141af91ab2d7cd011db47%7C1%7C0%7C636324859101456322&sdata=A3LnOO3Wxc%2BqThHP2Rpo8tJr01tKTRzQFwYdoSqs56w%3D&reserved=0>
> ==============================================================================
> --- 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<mailto:cfe-commits at lists.llvm.org>
> http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits<https://na01.safelinks.protection.outlook.com/?url=http%3A%2F%2Flists.llvm.org%2Fcgi-bin%2Fmailman%2Flistinfo%2Fcfe-commits&data=02%7C01%7Ceriksc%40microsoft.com%7C2a2522c4af134940d62708d4ae16832e%7C72f988bf86f141af91ab2d7cd011db47%7C1%7C0%7C636324859101456322&sdata=J53dFPlzSTUjgLz2YyI0h3LDD80rWcc3CahkORS1stk%3D&reserved=0>
_______________________________________________
cfe-commits mailing list
cfe-commits at lists.llvm.org<mailto:cfe-commits at lists.llvm.org>
http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits<https://na01.safelinks.protection.outlook.com/?url=http%3A%2F%2Flists.llvm.org%2Fcgi-bin%2Fmailman%2Flistinfo%2Fcfe-commits&data=02%7C01%7Ceriksc%40microsoft.com%7C2a2522c4af134940d62708d4ae16832e%7C72f988bf86f141af91ab2d7cd011db47%7C1%7C0%7C636324859101456322&sdata=J53dFPlzSTUjgLz2YyI0h3LDD80rWcc3CahkORS1stk%3D&reserved=0>
--
Saleem Abdulrasool
compnerd (at) compnerd (dot) org
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20170608/11f32fdc/attachment-0001.html>
More information about the cfe-commits
mailing list