15#ifndef LLVM_ADT_APFLOAT_H
16#define LLVM_ADT_APFLOAT_H
25#define APFLOAT_DISPATCH_ON_SEMANTICS(METHOD_CALL) \
27 if (usesLayout<IEEEFloat>(getSemantics())) \
28 return U.IEEE.METHOD_CALL; \
29 if (usesLayout<DoubleAPFloat>(getSemantics())) \
30 return U.Double.METHOD_CALL; \
31 llvm_unreachable("Unexpected semantics"); \
42template <
typename T>
class Expected;
43template <
typename T>
class SmallVectorImpl;
464#ifdef HAS_IEE754_FLOAT128
465 float128 convertToQuad()
const;
511 bool isZero()
const {
return category == fltCategory::fcZero; }
533 bool isNonZero()
const {
return category != fltCategory::fcZero; }
596 unsigned FormatMaxPadding = 3,
bool TruncateZero =
true)
const;
635 void makeNaN(
bool SNaN =
false,
bool Neg =
false,
636 const APInt *fill =
nullptr);
637 void makeInf(
bool Neg =
false);
657 unsigned int partCount()
const;
668 bool ignoreAddend =
false);
671 void incrementSignificand();
673 void shiftSignificandLeft(
unsigned int);
675 unsigned int significandLSB()
const;
676 unsigned int significandMSB()
const;
677 void zeroSignificand();
678 unsigned int getNumHighBits()
const;
680 bool isSignificandAllOnes()
const;
681 bool isSignificandAllOnesExceptLSB()
const;
683 bool isSignificandAllZeros()
const;
684 bool isSignificandAllZerosExceptMSB()
const;
702 bool convertFromStringSpecials(
StringRef str);
714 char *convertNormalToHexString(
char *,
unsigned int,
bool,
724 template <const fltSemantics &S>
APInt convertIEEEFloatToAPInt()
const;
725 APInt convertHalfAPFloatToAPInt()
const;
726 APInt convertBFloatAPFloatToAPInt()
const;
727 APInt convertFloatAPFloatToAPInt()
const;
728 APInt convertDoubleAPFloatToAPInt()
const;
729 APInt convertQuadrupleAPFloatToAPInt()
const;
730 APInt convertF80LongDoubleAPFloatToAPInt()
const;
731 APInt convertPPCDoubleDoubleLegacyAPFloatToAPInt()
const;
732 APInt convertFloat8E5M2APFloatToAPInt()
const;
733 APInt convertFloat8E5M2FNUZAPFloatToAPInt()
const;
734 APInt convertFloat8E4M3APFloatToAPInt()
const;
735 APInt convertFloat8E4M3FNAPFloatToAPInt()
const;
736 APInt convertFloat8E4M3FNUZAPFloatToAPInt()
const;
737 APInt convertFloat8E4M3B11FNUZAPFloatToAPInt()
const;
738 APInt convertFloat8E3M4APFloatToAPInt()
const;
739 APInt convertFloatTF32APFloatToAPInt()
const;
740 APInt convertFloat8E8M0FNUAPFloatToAPInt()
const;
741 APInt convertFloat6E3M2FNAPFloatToAPInt()
const;
742 APInt convertFloat6E2M3FNAPFloatToAPInt()
const;
743 APInt convertFloat4E2M1FNAPFloatToAPInt()
const;
745 template <const fltSemantics &S>
void initFromIEEEAPInt(
const APInt &api);
746 void initFromHalfAPInt(
const APInt &api);
747 void initFromBFloatAPInt(
const APInt &api);
748 void initFromFloatAPInt(
const APInt &api);
749 void initFromDoubleAPInt(
const APInt &api);
750 void initFromQuadrupleAPInt(
const APInt &api);
751 void initFromF80LongDoubleAPInt(
const APInt &api);
752 void initFromPPCDoubleDoubleLegacyAPInt(
const APInt &api);
753 void initFromFloat8E5M2APInt(
const APInt &api);
754 void initFromFloat8E5M2FNUZAPInt(
const APInt &api);
755 void initFromFloat8E4M3APInt(
const APInt &api);
756 void initFromFloat8E4M3FNAPInt(
const APInt &api);
757 void initFromFloat8E4M3FNUZAPInt(
const APInt &api);
758 void initFromFloat8E4M3B11FNUZAPInt(
const APInt &api);
759 void initFromFloat8E3M4APInt(
const APInt &api);
760 void initFromFloatTF32APInt(
const APInt &api);
761 void initFromFloat8E8M0FNUAPInt(
const APInt &api);
762 void initFromFloat6E3M2FNAPInt(
const APInt &api);
763 void initFromFloat6E2M3FNAPInt(
const APInt &api);
764 void initFromFloat4E2M1FNAPInt(
const APInt &api);
768 void freeSignificand();
792 unsigned int sign : 1;
796int ilogb(
const IEEEFloat &Arg);
807 std::unique_ptr<APFloat[]> Floats;
864 bool *IsExact)
const;
867 unsigned int InputSize,
bool IsSigned,
870 unsigned int InputSize,
bool IsSigned,
882 unsigned FormatMaxPadding,
bool TruncateZero =
true)
const;
908 static_assert(std::is_standard_layout<IEEEFloat>::value);
917 : Double(std::move(
F)) {
921 template <
typename... ArgTypes>
927 if (usesLayout<DoubleAPFloat>(
Semantics)) {
935 if (usesLayout<IEEEFloat>(*semantics)) {
939 if (usesLayout<DoubleAPFloat>(*semantics)) {
940 Double.~DoubleAPFloat();
946 Storage(
const Storage &
RHS) {
947 if (usesLayout<IEEEFloat>(*
RHS.semantics)) {
951 if (usesLayout<DoubleAPFloat>(*
RHS.semantics)) {
958 Storage(Storage &&
RHS) {
959 if (usesLayout<IEEEFloat>(*
RHS.semantics)) {
963 if (usesLayout<DoubleAPFloat>(*
RHS.semantics)) {
970 Storage &operator=(
const Storage &
RHS) {
971 if (usesLayout<IEEEFloat>(*semantics) &&
972 usesLayout<IEEEFloat>(*
RHS.semantics)) {
974 }
else if (usesLayout<DoubleAPFloat>(*semantics) &&
975 usesLayout<DoubleAPFloat>(*
RHS.semantics)) {
977 }
else if (
this != &
RHS) {
979 new (
this) Storage(
RHS);
984 Storage &operator=(Storage &&
RHS) {
985 if (usesLayout<IEEEFloat>(*semantics) &&
986 usesLayout<IEEEFloat>(*
RHS.semantics)) {
988 }
else if (usesLayout<DoubleAPFloat>(*semantics) &&
989 usesLayout<DoubleAPFloat>(*
RHS.semantics)) {
990 Double = std::move(
RHS.Double);
991 }
else if (
this != &
RHS) {
993 new (
this) Storage(std::move(
RHS));
1000 static_assert(std::is_same<T, IEEEFloat>::value ||
1001 std::is_same<T, DoubleAPFloat>::value);
1002 if (std::is_same<T, DoubleAPFloat>::value) {
1009 if (usesLayout<IEEEFloat>(*U.semantics))
1011 if (usesLayout<DoubleAPFloat>(*U.semantics))
1012 return U.Double.getFirst().U.IEEE;
1017 if (usesLayout<IEEEFloat>(*U.semantics))
1019 if (usesLayout<DoubleAPFloat>(*U.semantics))
1020 return U.Double.getFirst().U.IEEE;
1028 void makeNaN(
bool SNaN,
bool Neg,
const APInt *fill) {
1032 void makeLargest(
bool Neg) {
1036 void makeSmallest(
bool Neg) {
1040 void makeSmallestNormalized(
bool Neg) {
1046 : U(std::move(
F), S) {}
1050 "Should only compare APFloats with the same semantics");
1052 return U.IEEE.compareAbsoluteValue(
RHS.U.IEEE);
1054 return U.Double.compareAbsoluteValue(
RHS.U.Double);
1062 template <
typename T,
1063 typename = std::enable_if_t<std::is_floating_point<T>::value>>
1083 Val.makeZero(Negative);
1102 Val.makeInf(Negative);
1114 APInt intPayload(64, payload);
1115 return getQNaN(Sem, Negative, &intPayload);
1117 return getQNaN(Sem, Negative,
nullptr);
1123 const APInt *payload =
nullptr) {
1125 Val.makeNaN(
false, Negative, payload);
1131 const APInt *payload =
nullptr) {
1133 Val.makeNaN(
true, Negative, payload);
1142 Val.makeLargest(Negative);
1152 Val.makeSmallest(Negative);
1161 bool Negative =
false) {
1163 Val.makeSmallestNormalized(Negative);
1185 "Should only call on two APFloats with the same semantics");
1187 return U.IEEE.add(
RHS.U.IEEE, RM);
1189 return U.Double.add(
RHS.U.Double, RM);
1194 "Should only call on two APFloats with the same semantics");
1196 return U.IEEE.subtract(
RHS.U.IEEE, RM);
1198 return U.Double.subtract(
RHS.U.Double, RM);
1203 "Should only call on two APFloats with the same semantics");
1205 return U.IEEE.multiply(
RHS.U.IEEE, RM);
1207 return U.Double.multiply(
RHS.U.Double, RM);
1212 "Should only call on two APFloats with the same semantics");
1214 return U.IEEE.divide(
RHS.U.IEEE, RM);
1216 return U.Double.divide(
RHS.U.Double, RM);
1221 "Should only call on two APFloats with the same semantics");
1223 return U.IEEE.remainder(
RHS.U.IEEE);
1225 return U.Double.remainder(
RHS.U.Double);
1230 "Should only call on two APFloats with the same semantics");
1232 return U.IEEE.mod(
RHS.U.IEEE);
1234 return U.Double.mod(
RHS.U.Double);
1240 "Should only call on APFloats with the same semantics");
1242 "Should only call on APFloats with the same semantics");
1244 return U.IEEE.fusedMultiplyAdd(Multiplicand.U.IEEE, Addend.U.IEEE, RM);
1246 return U.Double.fusedMultiplyAdd(Multiplicand.U.Double, Addend.U.Double,
1263 Result.changeSign();
1312 Value.copySign(Sign);
1320 Result.getIEEE().makeQuiet();
1328 bool *IsExact)
const {
1333 bool *IsExact)
const;
1339 unsigned int InputSize,
bool IsSigned,
1345 unsigned int InputSize,
bool IsSigned,
1367#ifdef HAS_IEE754_FLOAT128
1368 float128 convertToQuad()
const;
1402 "Should only compare APFloats with the same semantics");
1404 return U.IEEE.compare(
RHS.U.IEEE);
1406 return U.Double.compare(
RHS.U.Double);
1414 return U.IEEE.bitwiseIsEqual(
RHS.U.IEEE);
1416 return U.Double.bitwiseIsEqual(
RHS.U.Double);
1476 unsigned FormatMaxPadding = 3,
bool TruncateZero =
true)
const {
1478 toString(Str, FormatPrecision, FormatMaxPadding, TruncateZero));
1507 "Empty base class optimization is not performed.");
1515 if (APFloat::usesLayout<detail::IEEEFloat>(
X.getSemantics()))
1517 if (APFloat::usesLayout<detail::DoubleAPFloat>(
X.getSemantics()))
1527 if (APFloat::usesLayout<detail::IEEEFloat>(
X.getSemantics()))
1529 if (APFloat::usesLayout<detail::DoubleAPFloat>(
X.getSemantics()))
1554 if (
A.isZero() &&
B.isZero() && (
A.isNegative() !=
B.isNegative()))
1555 return A.isNegative() ?
A :
B;
1556 return B <
A ?
B :
A;
1568 if (
A.isZero() &&
B.isZero() && (
A.isNegative() !=
B.isNegative()))
1569 return A.isNegative() ?
B :
A;
1570 return A <
B ?
B :
A;
1579 return A.makeQuiet();
1581 return B.makeQuiet();
1582 if (
A.isZero() &&
B.isZero() && (
A.isNegative() !=
B.isNegative()))
1583 return A.isNegative() ?
A :
B;
1584 return B <
A ?
B :
A;
1592 return B.isNaN() ?
B.makeQuiet() :
B;
1595 if (
A.isZero() &&
B.isZero() && (
A.isNegative() !=
B.isNegative()))
1596 return A.isNegative() ?
A :
B;
1597 return B <
A ?
B :
A;
1606 return A.makeQuiet();
1608 return B.makeQuiet();
1609 if (
A.isZero() &&
B.isZero() && (
A.isNegative() !=
B.isNegative()))
1610 return A.isNegative() ?
B :
A;
1611 return A <
B ?
B :
A;
1619 return B.isNaN() ?
B.makeQuiet() :
B;
1622 if (
A.isZero() &&
B.isZero() && (
A.isNegative() !=
B.isNegative()))
1623 return A.isNegative() ?
B :
A;
1624 return A <
B ?
B :
A;
1655#undef APFLOAT_DISPATCH_ON_SEMANTICS
#define APFLOAT_DISPATCH_ON_SEMANTICS(METHOD_CALL)
This file implements a class to represent arbitrary precision integral constant values and operations...
static GCRegistry::Add< OcamlGC > B("ocaml", "ocaml 3.10-compatible GC")
static GCRegistry::Add< ErlangGC > A("erlang", "erlang-compatible garbage collector")
Looks at all the uses of the given value Returns the Liveness deduced from the uses of this value Adds all uses that cause the result to be MaybeLive to MaybeLiveRetUses If the result is MaybeLiveUses might be modified but its content should be ignored(since it might not be complete). DeadArgumentEliminationPass
static GCMetadataPrinterRegistry::Add< ErlangGCPrinter > X("erlang", "erlang-compatible garbage collector")
Utilities for dealing with flags related to floating point properties and mode controls.
assert(ImpDefSCC.getReg()==AMDGPU::SCC &&ImpDefSCC.isDef())
static APFloat getQNaN(const fltSemantics &Sem, bool Negative=false, const APInt *payload=nullptr)
Factory for QNaN values.
static APFloat getSNaN(const fltSemantics &Sem, bool Negative=false, const APInt *payload=nullptr)
Factory for SNaN values.
opStatus divide(const APFloat &RHS, roundingMode RM)
bool getExactInverse(APFloat *inv) const
APFloat & operator=(APFloat &&RHS)=default
bool isFiniteNonZero() const
APFloat(const APFloat &RHS)=default
void copySign(const APFloat &RHS)
opStatus convert(const fltSemantics &ToSemantics, roundingMode RM, bool *losesInfo)
LLVM_READONLY int getExactLog2Abs() const
opStatus subtract(const APFloat &RHS, roundingMode RM)
bool bitwiseIsEqual(const APFloat &RHS) const
APFloat operator+(const APFloat &RHS) const
Add two APFloats, rounding ties to the nearest even.
double convertToDouble() const
Converts this APFloat to host double value.
bool isPosInfinity() const
APFloat(APFloat &&RHS)=default
void toString(SmallVectorImpl< char > &Str, unsigned FormatPrecision=0, unsigned FormatMaxPadding=3, bool TruncateZero=true) const
bool isExactlyValue(double V) const
We don't rely on operator== working on double values, as it returns true for things that are clearly ...
opStatus add(const APFloat &RHS, roundingMode RM)
LLVM_READONLY int getExactLog2() const
APFloat & operator=(const APFloat &RHS)=default
static APFloat getAllOnesValue(const fltSemantics &Semantics)
Returns a float which is bitcasted from an all one value int.
APFloat(const fltSemantics &Semantics, integerPart I)
bool operator!=(const APFloat &RHS) const
APFloat(const fltSemantics &Semantics, T V)=delete
const fltSemantics & getSemantics() const
APFloat operator-(const APFloat &RHS) const
Subtract two APFloats, rounding ties to the nearest even.
APFloat operator*(const APFloat &RHS) const
Multiply two APFloats, rounding ties to the nearest even.
APFloat(const fltSemantics &Semantics)
opStatus convertFromSignExtendedInteger(const integerPart *Input, unsigned int InputSize, bool IsSigned, roundingMode RM)
bool operator<(const APFloat &RHS) const
APFloat makeQuiet() const
Assuming this is an IEEE-754 NaN value, quiet its signaling bit.
opStatus convertFromAPInt(const APInt &Input, bool IsSigned, roundingMode RM)
static APFloat getOne(const fltSemantics &Sem, bool Negative=false)
Factory for Positive and Negative One.
unsigned int convertToHexString(char *DST, unsigned int HexDigits, bool UpperCase, roundingMode RM) const
opStatus multiply(const APFloat &RHS, roundingMode RM)
float convertToFloat() const
Converts this APFloat to host float value.
bool operator>(const APFloat &RHS) const
opStatus fusedMultiplyAdd(const APFloat &Multiplicand, const APFloat &Addend, roundingMode RM)
APFloat operator/(const APFloat &RHS) const
Divide the first APFloat by the second, rounding ties to the nearest even.
opStatus remainder(const APFloat &RHS)
APFloat operator-() const
Negate an APFloat.
static APFloat getSmallestNormalized(const fltSemantics &Sem, bool Negative=false)
Returns the smallest (by magnitude) normalized finite number in the given semantics.
APInt bitcastToAPInt() const
friend APFloat frexp(const APFloat &X, int &Exp, roundingMode RM)
static APFloat getLargest(const fltSemantics &Sem, bool Negative=false)
Returns the largest finite number in the given semantics.
opStatus convertToInteger(MutableArrayRef< integerPart > Input, unsigned int Width, bool IsSigned, roundingMode RM, bool *IsExact) const
opStatus next(bool nextDown)
static APFloat getInf(const fltSemantics &Sem, bool Negative=false)
Factory for Positive and Negative Infinity.
friend APFloat scalbn(APFloat X, int Exp, roundingMode RM)
bool operator>=(const APFloat &RHS) const
bool needsCleanup() const
static APFloat getSmallest(const fltSemantics &Sem, bool Negative=false)
Returns the smallest (by magnitude) finite number in the given semantics.
FPClassTest classify() const
Return the FPClassTest which will return true for the value.
bool operator==(const APFloat &RHS) const
opStatus mod(const APFloat &RHS)
friend int ilogb(const APFloat &Arg)
Expected< opStatus > convertFromString(StringRef, roundingMode)
fltCategory getCategory() const
APFloat(const fltSemantics &Semantics, uninitializedTag)
bool isNegInfinity() const
void print(raw_ostream &) const
static APFloat copySign(APFloat Value, const APFloat &Sign)
A static helper to produce a copy of an APFloat value with its sign copied from some other APFloat.
opStatus roundToIntegral(roundingMode RM)
friend hash_code hash_value(const APFloat &Arg)
See friend declarations above.
static APFloat getNaN(const fltSemantics &Sem, bool Negative=false, uint64_t payload=0)
Factory for NaN values.
static bool hasSignificand(const fltSemantics &Sem)
Returns true if the given semantics has actual significand.
static APFloat getZero(const fltSemantics &Sem, bool Negative=false)
Factory for Positive and Negative Zero.
cmpResult compare(const APFloat &RHS) const
opStatus convertFromZeroExtendedInteger(const integerPart *Input, unsigned int InputSize, bool IsSigned, roundingMode RM)
bool isSmallestNormalized() const
APFloat(const fltSemantics &Semantics, const APInt &I)
bool operator<=(const APFloat &RHS) const
Class for arbitrary precision integers.
static constexpr unsigned APINT_BITS_PER_WORD
Bits in a word.
An arbitrary precision integer that knows its signedness.
Tagged union holding either a T or a Error.
FoldingSetNodeID - This class is used to gather all the unique data bits of a node.
MutableArrayRef - Represent a mutable reference to an array (0 or more elements consecutively in memo...
This class consists of common code factored out of the SmallVector class to reduce code duplication b...
StringRef - Represent a constant reference to a string, i.e.
LLVM Value Representation.
void makeSmallestNormalized(bool Neg)
DoubleAPFloat & operator=(const DoubleAPFloat &RHS)
LLVM_READONLY int getExactLog2() const
opStatus remainder(const DoubleAPFloat &RHS)
opStatus multiply(const DoubleAPFloat &RHS, roundingMode RM)
fltCategory getCategory() const
bool bitwiseIsEqual(const DoubleAPFloat &RHS) const
LLVM_READONLY int getExactLog2Abs() const
opStatus convertFromAPInt(const APInt &Input, bool IsSigned, roundingMode RM)
opStatus convertFromZeroExtendedInteger(const integerPart *Input, unsigned int InputSize, bool IsSigned, roundingMode RM)
APInt bitcastToAPInt() const
bool getExactInverse(APFloat *inv) const
Expected< opStatus > convertFromString(StringRef, roundingMode)
opStatus subtract(const DoubleAPFloat &RHS, roundingMode RM)
cmpResult compareAbsoluteValue(const DoubleAPFloat &RHS) const
opStatus convertToInteger(MutableArrayRef< integerPart > Input, unsigned int Width, bool IsSigned, roundingMode RM, bool *IsExact) const
void makeSmallest(bool Neg)
opStatus next(bool nextDown)
friend DoubleAPFloat scalbn(const DoubleAPFloat &X, int Exp, roundingMode)
opStatus divide(const DoubleAPFloat &RHS, roundingMode RM)
friend hash_code hash_value(const DoubleAPFloat &Arg)
bool isSmallestNormalized() const
opStatus mod(const DoubleAPFloat &RHS)
void toString(SmallVectorImpl< char > &Str, unsigned FormatPrecision, unsigned FormatMaxPadding, bool TruncateZero=true) const
void makeLargest(bool Neg)
cmpResult compare(const DoubleAPFloat &RHS) const
opStatus roundToIntegral(roundingMode RM)
opStatus convertFromSignExtendedInteger(const integerPart *Input, unsigned int InputSize, bool IsSigned, roundingMode RM)
opStatus fusedMultiplyAdd(const DoubleAPFloat &Multiplicand, const DoubleAPFloat &Addend, roundingMode RM)
unsigned int convertToHexString(char *DST, unsigned int HexDigits, bool UpperCase, roundingMode RM) const
bool needsCleanup() const
opStatus add(const DoubleAPFloat &RHS, roundingMode RM)
friend DoubleAPFloat frexp(const DoubleAPFloat &X, int &Exp, roundingMode)
void makeNaN(bool SNaN, bool Neg, const APInt *fill)
unsigned int convertToHexString(char *dst, unsigned int hexDigits, bool upperCase, roundingMode) const
Write out a hexadecimal representation of the floating point value to DST, which must be of sufficien...
cmpResult compareAbsoluteValue(const IEEEFloat &) const
opStatus mod(const IEEEFloat &)
C fmod, or llvm frem.
fltCategory getCategory() const
opStatus convertFromAPInt(const APInt &, bool, roundingMode)
bool isFiniteNonZero() const
bool getExactInverse(APFloat *inv) const
If this value has an exact multiplicative inverse, store it in inv and return true.
bool needsCleanup() const
Returns whether this instance allocated memory.
void makeLargest(bool Neg=false)
Make this number the largest magnitude normal number in the given semantics.
LLVM_READONLY int getExactLog2Abs() const
APInt bitcastToAPInt() const
cmpResult compare(const IEEEFloat &) const
IEEE comparison with another floating point number (NaNs compare unordered, 0==-0).
bool isNegative() const
IEEE-754R isSignMinus: Returns true if and only if the current value is negative.
opStatus divide(const IEEEFloat &, roundingMode)
bool isNaN() const
Returns true if and only if the float is a quiet or signaling NaN.
opStatus remainder(const IEEEFloat &)
IEEE remainder.
double convertToDouble() const
opStatus convertFromSignExtendedInteger(const integerPart *, unsigned int, bool, roundingMode)
float convertToFloat() const
opStatus subtract(const IEEEFloat &, roundingMode)
void toString(SmallVectorImpl< char > &Str, unsigned FormatPrecision=0, unsigned FormatMaxPadding=3, bool TruncateZero=true) const
Converts this value into a decimal string.
void makeSmallest(bool Neg=false)
Make this number the smallest magnitude denormal number in the given semantics.
void makeInf(bool Neg=false)
opStatus convertFromZeroExtendedInteger(const integerPart *, unsigned int, bool, roundingMode)
bool isNormal() const
IEEE-754R isNormal: Returns true if and only if the current value is normal.
friend IEEEFloat frexp(const IEEEFloat &X, int &Exp, roundingMode)
bool isSmallestNormalized() const
Returns true if this is the smallest (by magnitude) normalized finite number in the given semantics.
bool isLargest() const
Returns true if and only if the number has the largest possible finite magnitude in the current seman...
opStatus add(const IEEEFloat &, roundingMode)
bool isFinite() const
Returns true if and only if the current value is zero, subnormal, or normal.
Expected< opStatus > convertFromString(StringRef, roundingMode)
void makeNaN(bool SNaN=false, bool Neg=false, const APInt *fill=nullptr)
friend int ilogb(const IEEEFloat &Arg)
Returns the exponent of the internal representation of the APFloat.
opStatus multiply(const IEEEFloat &, roundingMode)
friend hash_code hash_value(const IEEEFloat &Arg)
Overload to compute a hash code for an APFloat value.
opStatus roundToIntegral(roundingMode)
IEEEFloat & operator=(const IEEEFloat &)
friend IEEEFloat scalbn(IEEEFloat X, int Exp, roundingMode)
Returns: X * 2^Exp for integral exponents.
bool bitwiseIsEqual(const IEEEFloat &) const
Bitwise comparison for equality (QNaNs compare equal, 0!=-0).
void makeSmallestNormalized(bool Negative=false)
Returns the smallest (by magnitude) normalized finite number in the given semantics.
bool isInteger() const
Returns true if and only if the number is an exact integer.
opStatus fusedMultiplyAdd(const IEEEFloat &, const IEEEFloat &, roundingMode)
opStatus next(bool nextDown)
IEEE-754R 5.3.1: nextUp/nextDown.
bool isInfinity() const
IEEE-754R isInfinite(): Returns true if and only if the float is infinity.
const fltSemantics & getSemantics() const
bool isZero() const
Returns true if and only if the float is plus or minus zero.
bool isSignaling() const
Returns true if and only if the float is a signaling NaN.
bool operator==(const IEEEFloat &) const =delete
The definition of equality is not straightforward for floating point, so we won't use operator==.
void makeZero(bool Neg=false)
LLVM_READONLY int getExactLog2() const
bool isDenormal() const
IEEE-754R isSubnormal(): Returns true if and only if the float is a denormal.
opStatus convertToInteger(MutableArrayRef< integerPart >, unsigned int, bool, roundingMode, bool *) const
bool isSmallest() const
Returns true if and only if the number has the smallest possible non-zero magnitude in the current se...
An opaque object representing a hash code.
This class implements an extremely fast bulk output stream that can only output to a stream.
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
static constexpr opStatus opInexact
APFloatBase::roundingMode roundingMode
static constexpr fltCategory fcNaN
static constexpr opStatus opDivByZero
static constexpr opStatus opOverflow
static constexpr cmpResult cmpLessThan
static constexpr roundingMode rmTowardPositive
static constexpr uninitializedTag uninitialized
static constexpr fltCategory fcZero
static constexpr opStatus opOK
static constexpr cmpResult cmpGreaterThan
static constexpr unsigned integerPartWidth
APFloatBase::ExponentType ExponentType
hash_code hash_value(const IEEEFloat &Arg)
static constexpr fltCategory fcNormal
static constexpr opStatus opInvalidOp
IEEEFloat scalbn(IEEEFloat X, int Exp, roundingMode)
APFloatBase::fltCategory fltCategory
IEEEFloat frexp(const IEEEFloat &Val, int &Exp, roundingMode RM)
static constexpr cmpResult cmpUnordered
static constexpr roundingMode rmTowardNegative
static constexpr fltCategory fcInfinity
static constexpr roundingMode rmNearestTiesToAway
static constexpr roundingMode rmTowardZero
static constexpr opStatus opUnderflow
static constexpr roundingMode rmNearestTiesToEven
int ilogb(const IEEEFloat &Arg)
static constexpr cmpResult cmpEqual
This is an optimization pass for GlobalISel generic memory operations.
hash_code hash_value(const FixedPointSemantics &Val)
APFloat abs(APFloat X)
Returns the absolute value of the argument.
LLVM_READONLY APFloat maximum(const APFloat &A, const APFloat &B)
Implements IEEE 754-2019 maximum semantics.
APFloat frexp(const APFloat &X, int &Exp, APFloat::roundingMode RM)
Equivalent of C standard library function.
LLVM_READONLY APFloat maxnum(const APFloat &A, const APFloat &B)
Implements IEEE-754 2019 maximumNumber semantics.
lostFraction
Enum that represents what fraction of the LSB truncated bits of an fp number represent.
LLVM_READONLY APFloat minimumnum(const APFloat &A, const APFloat &B)
Implements IEEE 754-2019 minimumNumber semantics.
FPClassTest
Floating-point class tests, supported by 'is_fpclass' intrinsic.
APFloat scalbn(APFloat X, int Exp, APFloat::roundingMode RM)
@ First
Helpers to iterate all locations in the MemoryEffectsBase class.
LLVM_READONLY APFloat minnum(const APFloat &A, const APFloat &B)
Implements IEEE-754 2019 minimumNumber semantics.
RoundingMode
Rounding mode.
@ TowardZero
roundTowardZero.
@ NearestTiesToEven
roundTiesToEven.
@ TowardPositive
roundTowardPositive.
@ NearestTiesToAway
roundTiesToAway.
@ TowardNegative
roundTowardNegative.
raw_ostream & operator<<(raw_ostream &OS, const APFixedPoint &FX)
APFloat neg(APFloat X)
Returns the negated value of the argument.
LLVM_READONLY APFloat minimum(const APFloat &A, const APFloat &B)
Implements IEEE 754-2019 minimum semantics.
LLVM_READONLY APFloat maximumnum(const APFloat &A, const APFloat &B)
Implements IEEE 754-2019 maximumNumber semantics.
A self-contained host- and target-independent arbitrary-precision floating-point software implementat...
static const llvm::fltSemantics & EnumToSemantics(Semantics S)
static const fltSemantics & IEEEsingle() LLVM_READNONE
static bool semanticsHasInf(const fltSemantics &)
static const fltSemantics & Float6E3M2FN() LLVM_READNONE
static constexpr roundingMode rmNearestTiesToAway
cmpResult
IEEE-754R 5.11: Floating Point Comparison Relations.
static const fltSemantics & PPCDoubleDoubleLegacy() LLVM_READNONE
static constexpr roundingMode rmTowardNegative
static ExponentType semanticsMinExponent(const fltSemantics &)
llvm::RoundingMode roundingMode
IEEE-754R 4.3: Rounding-direction attributes.
static constexpr roundingMode rmNearestTiesToEven
static unsigned int semanticsSizeInBits(const fltSemantics &)
static bool semanticsHasSignedRepr(const fltSemantics &)
static const fltSemantics & Float8E4M3() LLVM_READNONE
static unsigned getSizeInBits(const fltSemantics &Sem)
Returns the size of the floating point number (in bits) in the given semantics.
static const fltSemantics & Float8E4M3FN() LLVM_READNONE
static const fltSemantics & PPCDoubleDouble() LLVM_READNONE
static constexpr roundingMode rmTowardZero
static const fltSemantics & x87DoubleExtended() LLVM_READNONE
uninitializedTag
Convenience enum used to construct an uninitialized APFloat.
static const fltSemantics & IEEEquad() LLVM_READNONE
static const fltSemantics & Float4E2M1FN() LLVM_READNONE
static const fltSemantics & Float8E8M0FNU() LLVM_READNONE
static const fltSemantics & Float8E4M3B11FNUZ() LLVM_READNONE
static const fltSemantics & Bogus() LLVM_READNONE
A Pseudo fltsemantic used to construct APFloats that cannot conflict with anything real.
static ExponentType semanticsMaxExponent(const fltSemantics &)
static unsigned int semanticsPrecision(const fltSemantics &)
static const fltSemantics & IEEEdouble() LLVM_READNONE
static bool semanticsHasNaN(const fltSemantics &)
static const fltSemantics & Float8E5M2() LLVM_READNONE
static Semantics SemanticsToEnum(const llvm::fltSemantics &Sem)
static constexpr unsigned integerPartWidth
static const fltSemantics & IEEEhalf() LLVM_READNONE
APInt::WordType integerPart
static constexpr roundingMode rmTowardPositive
static bool semanticsHasZero(const fltSemantics &)
static bool isRepresentableAsNormalIn(const fltSemantics &Src, const fltSemantics &Dst)
static const fltSemantics & Float8E4M3FNUZ() LLVM_READNONE
IlogbErrorKinds
Enumeration of ilogb error results.
static const fltSemantics & BFloat() LLVM_READNONE
static const fltSemantics & FloatTF32() LLVM_READNONE
static bool isRepresentableBy(const fltSemantics &A, const fltSemantics &B)
static const fltSemantics & Float8E5M2FNUZ() LLVM_READNONE
static const fltSemantics & Float6E2M3FN() LLVM_READNONE
fltCategory
Category of internally-represented number.
@ S_PPCDoubleDoubleLegacy
static const fltSemantics & Float8E3M4() LLVM_READNONE
opStatus
IEEE-754R 7: Default exception handling.
int32_t ExponentType
A signed type to represent a floating point numbers unbiased exponent.
static unsigned int semanticsIntSizeInBits(const fltSemantics &, bool)