diff options
Diffstat (limited to 'lib')
-rw-r--r-- | lib/VMCore/Core.cpp | 24 |
1 files changed, 23 insertions, 1 deletions
diff --git a/lib/VMCore/Core.cpp b/lib/VMCore/Core.cpp index 8722785bd3..0c913ffbf7 100644 --- a/lib/VMCore/Core.cpp +++ b/lib/VMCore/Core.cpp @@ -284,8 +284,30 @@ LLVMValueRef LLVMConstInt(LLVMTypeRef IntTy, unsigned long long N, return wrap(ConstantInt::get(unwrap<IntegerType>(IntTy), N, SignExtend != 0)); } +static const fltSemantics &SemanticsForType(Type *Ty) { + assert(Ty->isFloatingPoint() && "Type is not floating point!"); + if (Ty == Type::FloatTy) + return APFloat::IEEEsingle; + if (Ty == Type::DoubleTy) + return APFloat::IEEEdouble; + if (Ty == Type::X86_FP80Ty) + return APFloat::x87DoubleExtended; + if (Ty == Type::FP128Ty) + return APFloat::IEEEquad; + if (Ty == Type::PPC_FP128Ty) + return APFloat::PPCDoubleDouble; + return APFloat::Bogus; +} + LLVMValueRef LLVMConstReal(LLVMTypeRef RealTy, double N) { - return wrap(ConstantFP::get(unwrap(RealTy), APFloat(N))); + APFloat APN(N); + APN.convert(SemanticsForType(unwrap(RealTy)), APFloat::rmNearestTiesToEven); + return wrap(ConstantFP::get(unwrap(RealTy), APN)); +} + +LLVMValueRef LLVMConstRealOfString(LLVMTypeRef RealTy, const char *Text) { + return wrap(ConstantFP::get(unwrap(RealTy), + APFloat(SemanticsForType(unwrap(RealTy)), Text))); } /*--.. Operations on composite constants ...................................--*/ |