diff options
author | Benjamin Kramer <benny.kra@googlemail.com> | 2014-01-18 16:43:06 +0000 |
---|---|---|
committer | Benjamin Kramer <benny.kra@googlemail.com> | 2014-01-18 16:43:06 +0000 |
commit | bedf842b78d00dc481a83edf7f1a3ca5f21a3805 (patch) | |
tree | a749411316292363928b814cc2a4a51de54f021d /lib/IR | |
parent | 4bd80f02d6891e7718e0d53f3e89640edeea5371 (diff) | |
download | llvm-bedf842b78d00dc481a83edf7f1a3ca5f21a3805.tar.gz llvm-bedf842b78d00dc481a83edf7f1a3ca5f21a3805.tar.bz2 llvm-bedf842b78d00dc481a83edf7f1a3ca5f21a3805.tar.xz |
Upgrade ConstantFP's negative zero and infinity getters to handle vector types.
Will be used soon.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@199552 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/IR')
-rw-r--r-- | lib/IR/Constants.cpp | 34 |
1 files changed, 18 insertions, 16 deletions
diff --git a/lib/IR/Constants.cpp b/lib/IR/Constants.cpp index 690ac597b0..dbb3495583 100644 --- a/lib/IR/Constants.cpp +++ b/lib/IR/Constants.cpp @@ -584,23 +584,21 @@ Constant *ConstantFP::get(Type *Ty, StringRef Str) { return C; } +Constant *ConstantFP::getNegativeZero(Type *Ty) { + const fltSemantics &Semantics = *TypeToFloatSemantics(Ty->getScalarType()); + APFloat NegZero = APFloat::getZero(Semantics, /*Negative=*/true); + Constant *C = get(Ty->getContext(), NegZero); -ConstantFP *ConstantFP::getNegativeZero(Type *Ty) { - LLVMContext &Context = Ty->getContext(); - APFloat apf = cast<ConstantFP>(Constant::getNullValue(Ty))->getValueAPF(); - apf.changeSign(); - return get(Context, apf); + if (VectorType *VTy = dyn_cast<VectorType>(Ty)) + return ConstantVector::getSplat(VTy->getNumElements(), C); + + return C; } Constant *ConstantFP::getZeroValueForNegation(Type *Ty) { - Type *ScalarTy = Ty->getScalarType(); - if (ScalarTy->isFloatingPointTy()) { - Constant *C = getNegativeZero(ScalarTy); - if (VectorType *VTy = dyn_cast<VectorType>(Ty)) - return ConstantVector::getSplat(VTy->getNumElements(), C); - return C; - } + if (Ty->isFPOrFPVectorTy()) + return getNegativeZero(Ty); return Constant::getNullValue(Ty); } @@ -635,10 +633,14 @@ ConstantFP* ConstantFP::get(LLVMContext &Context, const APFloat& V) { return Slot; } -ConstantFP *ConstantFP::getInfinity(Type *Ty, bool Negative) { - const fltSemantics &Semantics = *TypeToFloatSemantics(Ty); - return ConstantFP::get(Ty->getContext(), - APFloat::getInf(Semantics, Negative)); +Constant *ConstantFP::getInfinity(Type *Ty, bool Negative) { + const fltSemantics &Semantics = *TypeToFloatSemantics(Ty->getScalarType()); + Constant *C = get(Ty->getContext(), APFloat::getInf(Semantics, Negative)); + + if (VectorType *VTy = dyn_cast<VectorType>(Ty)) + return ConstantVector::getSplat(VTy->getNumElements(), C); + + return C; } ConstantFP::ConstantFP(Type *Ty, const APFloat& V) |