mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-06-27 14:24:40 +00:00
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
This commit is contained in:
@ -698,15 +698,54 @@ ConstantInt *ConstantInt::get(const Type *Ty, unsigned char V) {
|
|||||||
|
|
||||||
//---- ConstantFP::get() implementation...
|
//---- 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) {
|
ConstantFP *ConstantFP::get(const Type *Ty, double V) {
|
||||||
if (Ty == Type::FloatTy) {
|
if (Ty == Type::FloatTy) {
|
||||||
// Force the value through memory to normalize it.
|
// Force the value through memory to normalize it.
|
||||||
volatile float Tmp = V;
|
union {
|
||||||
V = Tmp;
|
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...
|
//---- ConstantArray::get() implementation...
|
||||||
|
Reference in New Issue
Block a user