diff --git a/clang/CodeGen/CGBuiltin.cpp b/clang/CodeGen/CGBuiltin.cpp index 8cdf0685ca8d..803d89ee5423 100644 --- a/clang/CodeGen/CGBuiltin.cpp +++ b/clang/CodeGen/CGBuiltin.cpp @@ -85,6 +85,18 @@ RValue CodeGenFunction::EmitBuiltinExpr(unsigned BuiltinID, const CallExpr *E) { return RValue::get(llvm::ConstantInt::get(Result)); } + case Builtin::BI__builtin_abs: { + llvm::Value *ArgValue = EmitScalarExpr(E->getArg(0)); + + llvm::BinaryOperator *NegOp = + Builder.CreateNeg(ArgValue, (ArgValue->getName() + "neg").c_str()); + llvm::Value *CmpResult = + Builder.CreateICmpSGE(ArgValue, NegOp->getOperand(0), "abscond"); + llvm::Value *Result = + Builder.CreateSelect(CmpResult, ArgValue, NegOp, "abs"); + + return RValue::get(Result); + } } return RValue::get(0); diff --git a/clang/include/clang/AST/Builtins.def b/clang/include/clang/AST/Builtins.def index 546c8cf3e9e1..f0107e585972 100644 --- a/clang/include/clang/AST/Builtins.def +++ b/clang/include/clang/AST/Builtins.def @@ -55,6 +55,7 @@ BUILTIN(__builtin_inf , "d" , "ncF") BUILTIN(__builtin_inff , "f" , "ncF") BUILTIN(__builtin_infl , "Ld" , "ncF") +BUILTIN(__builtin_abs , "ii" , "ncF") BUILTIN(__builtin_fabs , "dd" , "ncF") BUILTIN(__builtin_fabsf, "ff" , "ncF") BUILTIN(__builtin_fabsl, "LdLd", "ncF")