diff options
author | Anders Carlsson <andersca@mac.com> | 2008-02-06 07:19:27 +0000 |
---|---|---|
committer | Anders Carlsson <andersca@mac.com> | 2008-02-06 07:19:27 +0000 |
commit | 3a31d60cffedfb7c9e6d129a5c9ba15fa74f179a (patch) | |
tree | aebc742f9b7874e40542cf174507051600849c2a /CodeGen | |
parent | 8fb1dd005f4cb530bca11d622362d39727294420 (diff) |
Generate code for the various __builtin_ctz functions.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@46811 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'CodeGen')
-rw-r--r-- | CodeGen/CGBuiltin.cpp | 14 |
1 files changed, 14 insertions, 0 deletions
diff --git a/CodeGen/CGBuiltin.cpp b/CodeGen/CGBuiltin.cpp index 996978e138..661c09d7cd 100644 --- a/CodeGen/CGBuiltin.cpp +++ b/CodeGen/CGBuiltin.cpp @@ -149,6 +149,20 @@ RValue CodeGenFunction::EmitBuiltinExpr(unsigned BuiltinID, const CallExpr *E) { return RValue::get(Result); } + case Builtin::BI__builtin_ctz: + case Builtin::BI__builtin_ctzl: + case Builtin::BI__builtin_ctzll: { + Value *ArgValue = EmitScalarExpr(E->getArg(0)); + + const llvm::Type *ArgType = ArgValue->getType(); + Value *F = CGM.getIntrinsic(Intrinsic::cttz, &ArgType, 1); + + const llvm::Type *ResultType = ConvertType(E->getType()); + Value *Result = Builder.CreateCall(F, ArgValue, "tmp"); + if (Result->getType() != ResultType) + Result = Builder.CreateIntCast(Result, ResultType, "cast"); + return RValue::get(Result); + } case Builtin::BI__builtin_expect: return RValue::get(EmitScalarExpr(E->getArg(0))); case Builtin::BI__builtin_bswap32: |