diff options
author | Chris Lattner <sabre@nondot.org> | 2008-04-09 06:38:30 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2008-04-09 06:38:30 +0000 |
commit | 288e78fbe7704d01bace67df88002f33c82e7ab5 (patch) | |
tree | 8c7de54c58898036a07388b311615bb2ab57af53 /lib/VMCore/Constants.cpp | |
parent | f20d943bc60551e8e674c0ad53ebc008ed66982e (diff) | |
download | external_llvm-288e78fbe7704d01bace67df88002f33c82e7ab5.zip external_llvm-288e78fbe7704d01bace67df88002f33c82e7ab5.tar.gz external_llvm-288e78fbe7704d01bace67df88002f33c82e7ab5.tar.bz2 |
add a simplified accessor for creating an fp constant of a
particular value but variable type.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@49416 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/VMCore/Constants.cpp')
-rw-r--r-- | lib/VMCore/Constants.cpp | 38 |
1 files changed, 25 insertions, 13 deletions
diff --git a/lib/VMCore/Constants.cpp b/lib/VMCore/Constants.cpp index 74e30f6..0b8fcc4 100644 --- a/lib/VMCore/Constants.cpp +++ b/lib/VMCore/Constants.cpp @@ -246,21 +246,24 @@ ConstantInt *ConstantInt::get(const APInt& V) { // ConstantFP //===----------------------------------------------------------------------===// +static const fltSemantics *TypeToFloatSemantics(const Type *Ty) { + if (Ty == Type::FloatTy) + return &APFloat::IEEEsingle; + if (Ty == Type::DoubleTy) + return &APFloat::IEEEdouble; + if (Ty == Type::X86_FP80Ty) + return &APFloat::x87DoubleExtended; + else if (Ty == Type::FP128Ty) + return &APFloat::IEEEquad; + + assert(Ty == Type::PPC_FP128Ty && "Unknown FP format"); + return &APFloat::PPCDoubleDouble; +} + ConstantFP::ConstantFP(const Type *Ty, const APFloat& V) : Constant(Ty, ConstantFPVal, 0, 0), Val(V) { - // temporary - if (Ty==Type::FloatTy) - assert(&V.getSemantics()==&APFloat::IEEEsingle); - else if (Ty==Type::DoubleTy) - assert(&V.getSemantics()==&APFloat::IEEEdouble); - else if (Ty==Type::X86_FP80Ty) - assert(&V.getSemantics()==&APFloat::x87DoubleExtended); - else if (Ty==Type::FP128Ty) - assert(&V.getSemantics()==&APFloat::IEEEquad); - else if (Ty==Type::PPC_FP128Ty) - assert(&V.getSemantics()==&APFloat::PPCDoubleDouble); - else - assert(0); + assert(&V.getSemantics() == TypeToFloatSemantics(Ty) && + "FP type Mismatch"); } bool ConstantFP::isNullValue() const { @@ -335,6 +338,15 @@ ConstantFP *ConstantFP::get(const APFloat &V) { return Slot = new ConstantFP(Ty, V); } +/// get() - This returns a constant fp for the specified value in the +/// specified type. This should only be used for simple constant values like +/// 2.0/1.0 etc, that are known-valid both as double and as the target format. +ConstantFP *ConstantFP::get(const Type *Ty, double V) { + APFloat FV(V); + FV.convert(*TypeToFloatSemantics(Ty), APFloat::rmNearestTiesToEven); + return get(FV); +} + //===----------------------------------------------------------------------===// // ConstantXXX Classes //===----------------------------------------------------------------------===// |