diff options
author | Dale Johannesen <dalej@apple.com> | 2007-08-09 22:51:36 +0000 |
---|---|---|
committer | Dale Johannesen <dalej@apple.com> | 2007-08-09 22:51:36 +0000 |
commit | ebbc95da49c6f4ae09947a9f4ab6a8616ea40e3b (patch) | |
tree | c4a224d84c042e795937f37b988b43f2996bc903 /lib/VMCore | |
parent | a3231ba237b1a5113a71253eab50c6b7a5239132 (diff) | |
download | external_llvm-ebbc95da49c6f4ae09947a9f4ab6a8616ea40e3b.zip external_llvm-ebbc95da49c6f4ae09947a9f4ab6a8616ea40e3b.tar.gz external_llvm-ebbc95da49c6f4ae09947a9f4ab6a8616ea40e3b.tar.bz2 |
Patch 10 for long double. Doing constants right needs expanding ConstantFP
to handle values bigger than double. If we assume host==target and host
long double works correctly, this is not too bad, but we don't want to
have that limitation longterm. I could implement accepting double
constants as long double or something like that, which would lead to
incorrect codegen with no errors; the more I think about that the worse
it seems. Rather than do such a hack that would be backed out later,
I'm settling for giving reasonable error messages, for now.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@40974 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/VMCore')
-rw-r--r-- | lib/VMCore/Constants.cpp | 19 |
1 files changed, 15 insertions, 4 deletions
diff --git a/lib/VMCore/Constants.cpp b/lib/VMCore/Constants.cpp index e171011..eadfe39 100644 --- a/lib/VMCore/Constants.cpp +++ b/lib/VMCore/Constants.cpp @@ -108,6 +108,9 @@ Constant *Constant::getNullValue(const Type *Ty) { return ConstantInt::get(Ty, 0); case Type::FloatTyID: case Type::DoubleTyID: + case Type::X86_FP80TyID: + case Type::PPC_FP128TyID: + case Type::FP128TyID: return ConstantFP::get(Ty, 0.0); case Type::PointerTyID: return ConstantPointerNull::get(cast<PointerType>(Ty)); @@ -288,12 +291,17 @@ ConstantFP *ConstantFP::get(const Type *Ty, double V) { ConstantFP *&Slot = (*FloatConstants)[std::make_pair(IntVal, Ty)]; if (Slot) return Slot; return Slot = new ConstantFP(Ty, (float)V); - } else { - assert(Ty == Type::DoubleTy); + } else if (Ty == Type::DoubleTy) { uint64_t IntVal = DoubleToBits(V); ConstantFP *&Slot = (*DoubleConstants)[std::make_pair(IntVal, Ty)]; if (Slot) return Slot; return Slot = new ConstantFP(Ty, V); + // FIXME: Make long double constants work. + } else if (Ty == Type::X86_FP80Ty || + Ty == Type::PPC_FP128Ty || Ty == Type::FP128Ty) { + assert(0 && "Long double constants not handled yet."); + } else { + assert(0 && "Unknown FP Type!"); } } @@ -696,10 +704,13 @@ bool ConstantFP::isValueValidForType(const Type *Ty, double Val) { default: return false; // These can't be represented as floating point! - // TODO: Figure out how to test if a double can be cast to a float! + // TODO: Figure out how to test if we can use a shorter type instead! case Type::FloatTyID: case Type::DoubleTyID: - return true; // This is the largest type... + case Type::X86_FP80TyID: + case Type::PPC_FP128TyID: + case Type::FP128TyID: + return true; } } |