/* Return an arbitrary integer value usable for hashing. */
uint32_t getHashValue() const;
- /// getIEEEFloatParts / getIEEEDoubleParts - Return exponent, significant,
- /// and sign bit of an IEEE float / IEEE double value.
- void getIEEEFloatParts(bool &Sign, uint32_t &Exp,
- uint32_t &Significant) const;
- void getIEEEDoubleParts(bool &Sign, uint64_t &Exp,
- uint64_t &Significant) const;
-
private:
/* Trivial queries. */
}
}
-void APFloat::getIEEEFloatParts(bool &Sign, uint32_t &Exp,
- uint32_t &Significand) const {
- assert(semantics == (const llvm::fltSemantics*)&IEEEsingle &&
- "Float semantics are not IEEEsingle");
- assert(partCount()==1);
-
- if (category == fcNormal) {
- Exp = exponent+127; // bias
- Significand = (uint32_t)*significandParts();
- if (Exp == 1 && !(Significand & 0x800000))
- Exp = 0; // denormal
- } else if (category==fcZero) {
- Exp = 0;
- Significand = 0;
- } else if (category==fcInfinity) {
- Exp = 0xff;
- Significand = 0;
- } else {
- assert(category == fcNaN && "Unknown category!");
- Exp = 0xff;
- Significand = (uint32_t)*significandParts();
- }
- Sign = sign;
-}
-
-void APFloat::getIEEEDoubleParts(bool &Sign, uint64_t &Exp,
- uint64_t &Significand) const {
- assert(semantics == (const llvm::fltSemantics*)&IEEEdouble &&
- "Float semantics are not IEEEdouble");
- assert(partCount()==1);
-
- if (category == fcNormal) {
- Exp = exponent+1023; // bias
- Significand = *significandParts();
- if (Exp == 1 && !(Significand & 0x10000000000000LL))
- Exp = 0; // denormal
- } else if (category==fcZero) {
- Exp = 0;
- Significand = 0;
- } else if (category==fcInfinity) {
- Exp = 0x7ff;
- Significand = 0;
- } else {
- assert(category == fcNaN && "Unknown category!");
- Exp = 0x7ff;
- Significand = *significandParts();
- }
- Sign = sign;
-}
-
// Conversion from APFloat to/from host float/double. It may eventually be
// possible to eliminate these and have everybody deal with APFloats, but that
// will take a while. This approach will not easily extend to long double.