aboutsummaryrefslogtreecommitdiffstats
path: root/lib/VMCore/Constants.cpp
diff options
context:
space:
mode:
authorChris Lattner <sabre@nondot.org>2008-04-09 06:38:30 +0000
committerChris Lattner <sabre@nondot.org>2008-04-09 06:38:30 +0000
commit288e78fbe7704d01bace67df88002f33c82e7ab5 (patch)
tree8c7de54c58898036a07388b311615bb2ab57af53 /lib/VMCore/Constants.cpp
parentf20d943bc60551e8e674c0ad53ebc008ed66982e (diff)
downloadexternal_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.cpp38
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
//===----------------------------------------------------------------------===//