From: Anders Carlsson Date: Wed, 6 Feb 2008 07:19:27 +0000 (+0000) Subject: Generate code for the various __builtin_ctz functions. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=3a31d60cffedfb7c9e6d129a5c9ba15fa74f179a;p=clang 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 --- 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: