diff options
author | Chris Lattner <sabre@nondot.org> | 2004-02-01 22:49:04 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2004-02-01 22:49:04 +0000 |
commit | cfdf2419bcac24b027e81751a439fb61db41231c (patch) | |
tree | fe0da94b512178b603eb6d5c8355983bf975bee4 /lib | |
parent | cf2c4f8ae52d5f0a01ab40eda6d165f91b8de441 (diff) |
Second half of a fix for PR218 & test/Regression/Assembler/2004-02-01-NegativeZero.llx.
Basically we store floating point values as their integral components, instead of relying
on the semantics of floating point < to differentiate between values. This is likely to
make the map search be faster anyway.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@11064 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib')
-rw-r--r-- | lib/VMCore/Constants.cpp | 47 |
1 files changed, 43 insertions, 4 deletions
diff --git a/lib/VMCore/Constants.cpp b/lib/VMCore/Constants.cpp index 8b108c2335..caeb8cd08e 100644 --- a/lib/VMCore/Constants.cpp +++ b/lib/VMCore/Constants.cpp @@ -698,15 +698,54 @@ ConstantInt *ConstantInt::get(const Type *Ty, unsigned char V) { //---- ConstantFP::get() implementation... // -static ValueMap<double, Type, ConstantFP> FPConstants; +namespace llvm { + template<> + struct ConstantCreator<ConstantFP, Type, uint64_t> { + static ConstantFP *create(const Type *Ty, uint64_t V) { + assert(Ty == Type::DoubleTy); + union { + double F; + uint64_t I; + } T; + T.I = V; + return new ConstantFP(Ty, T.F); + } + }; + template<> + struct ConstantCreator<ConstantFP, Type, uint32_t> { + static ConstantFP *create(const Type *Ty, uint32_t V) { + assert(Ty == Type::FloatTy); + union { + float F; + uint32_t I; + } T; + T.I = V; + return new ConstantFP(Ty, T.F); + } + }; +} + +static ValueMap<uint64_t, Type, ConstantFP> DoubleConstants; +static ValueMap<uint32_t, Type, ConstantFP> FloatConstants; ConstantFP *ConstantFP::get(const Type *Ty, double V) { if (Ty == Type::FloatTy) { // Force the value through memory to normalize it. - volatile float Tmp = V; - V = Tmp; + union { + float F; + uint32_t I; + } T; + T.F = (float)V; + return FloatConstants.getOrCreate(Ty, T.I); + } else { + assert(Ty == Type::DoubleTy); + union { + double F; + uint64_t I; + } T; + T.F = V; + return DoubleConstants.getOrCreate(Ty, T.I); } - return FPConstants.getOrCreate(Ty, V); } //---- ConstantArray::get() implementation... |