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;
459#ifdef HAS_IEE754_FLOAT128
460 float128 convertToQuad()
const;
506 bool isZero()
const {
return category == fltCategory::fcZero; }
528 bool isNonZero()
const {
return category != fltCategory::fcZero; }
591 unsigned FormatMaxPadding = 3,
bool TruncateZero =
true)
const;
630 void makeNaN(
bool SNaN =
false,
bool Neg =
false,
631 const APInt *fill =
nullptr);
632 void makeInf(
bool Neg =
false);
652 unsigned int partCount()
const;
663 bool ignoreAddend =
false);
666 void incrementSignificand();
668 void shiftSignificandLeft(
unsigned int);
670 unsigned int significandLSB()
const;
671 unsigned int significandMSB()
const;
672 void zeroSignificand();
673 unsigned int getNumHighBits()
const;
675 bool isSignificandAllOnes()
const;
676 bool isSignificandAllOnesExceptLSB()
const;
678 bool isSignificandAllZeros()
const;
679 bool isSignificandAllZerosExceptMSB()
const;
697 bool convertFromStringSpecials(
StringRef str);
709 char *convertNormalToHexString(
char *,
unsigned int,
bool,
719 template <const fltSemantics &S>
APInt convertIEEEFloatToAPInt()
const;
720 APInt convertHalfAPFloatToAPInt()
const;
721 APInt convertBFloatAPFloatToAPInt()
const;
722 APInt convertFloatAPFloatToAPInt()
const;
723 APInt convertDoubleAPFloatToAPInt()
const;
724 APInt convertQuadrupleAPFloatToAPInt()
const;
725 APInt convertF80LongDoubleAPFloatToAPInt()
const;
726 APInt convertPPCDoubleDoubleLegacyAPFloatToAPInt()
const;
727 APInt convertFloat8E5M2APFloatToAPInt()
const;
728 APInt convertFloat8E5M2FNUZAPFloatToAPInt()
const;
729 APInt convertFloat8E4M3APFloatToAPInt()
const;
730 APInt convertFloat8E4M3FNAPFloatToAPInt()
const;
731 APInt convertFloat8E4M3FNUZAPFloatToAPInt()
const;
732 APInt convertFloat8E4M3B11FNUZAPFloatToAPInt()
const;
733 APInt convertFloat8E3M4APFloatToAPInt()
const;
734 APInt convertFloatTF32APFloatToAPInt()
const;
735 APInt convertFloat8E8M0FNUAPFloatToAPInt()
const;
736 APInt convertFloat6E3M2FNAPFloatToAPInt()
const;
737 APInt convertFloat6E2M3FNAPFloatToAPInt()
const;
738 APInt convertFloat4E2M1FNAPFloatToAPInt()
const;
740 template <const fltSemantics &S>
void initFromIEEEAPInt(
const APInt &api);
741 void initFromHalfAPInt(
const APInt &api);
742 void initFromBFloatAPInt(
const APInt &api);
743 void initFromFloatAPInt(
const APInt &api);
744 void initFromDoubleAPInt(
const APInt &api);
745 void initFromQuadrupleAPInt(
const APInt &api);
746 void initFromF80LongDoubleAPInt(
const APInt &api);
747 void initFromPPCDoubleDoubleLegacyAPInt(
const APInt &api);
748 void initFromFloat8E5M2APInt(
const APInt &api);
749 void initFromFloat8E5M2FNUZAPInt(
const APInt &api);
750 void initFromFloat8E4M3APInt(
const APInt &api);
751 void initFromFloat8E4M3FNAPInt(
const APInt &api);
752 void initFromFloat8E4M3FNUZAPInt(
const APInt &api);
753 void initFromFloat8E4M3B11FNUZAPInt(
const APInt &api);
754 void initFromFloat8E3M4APInt(
const APInt &api);
755 void initFromFloatTF32APInt(
const APInt &api);
756 void initFromFloat8E8M0FNUAPInt(
const APInt &api);
757 void initFromFloat6E3M2FNAPInt(
const APInt &api);
758 void initFromFloat6E2M3FNAPInt(
const APInt &api);
759 void initFromFloat4E2M1FNAPInt(
const APInt &api);
763 void freeSignificand();
787 unsigned int sign : 1;
791int ilogb(
const IEEEFloat &Arg);
802 std::unique_ptr<APFloat[]> Floats;
859 bool *IsExact)
const;
862 unsigned int InputSize,
bool IsSigned,
865 unsigned int InputSize,
bool IsSigned,
877 unsigned FormatMaxPadding,
bool TruncateZero =
true)
const;
903 static_assert(std::is_standard_layout<IEEEFloat>::value);
912 : Double(std::move(
F)) {
916 template <
typename... ArgTypes>
922 if (usesLayout<DoubleAPFloat>(
Semantics)) {
930 if (usesLayout<IEEEFloat>(*semantics)) {
934 if (usesLayout<DoubleAPFloat>(*semantics)) {
935 Double.~DoubleAPFloat();
941 Storage(
const Storage &
RHS) {
942 if (usesLayout<IEEEFloat>(*
RHS.semantics)) {
946 if (usesLayout<DoubleAPFloat>(*
RHS.semantics)) {
953 Storage(Storage &&
RHS) {
954 if (usesLayout<IEEEFloat>(*
RHS.semantics)) {
958 if (usesLayout<DoubleAPFloat>(*
RHS.semantics)) {
965 Storage &operator=(
const Storage &
RHS) {
966 if (usesLayout<IEEEFloat>(*semantics) &&
967 usesLayout<IEEEFloat>(*
RHS.semantics)) {
969 }
else if (usesLayout<DoubleAPFloat>(*semantics) &&
970 usesLayout<DoubleAPFloat>(*
RHS.semantics)) {
972 }
else if (
this != &
RHS) {
974 new (
this) Storage(
RHS);
979 Storage &operator=(Storage &&
RHS) {
980 if (usesLayout<IEEEFloat>(*semantics) &&
981 usesLayout<IEEEFloat>(*
RHS.semantics)) {
983 }
else if (usesLayout<DoubleAPFloat>(*semantics) &&
984 usesLayout<DoubleAPFloat>(*
RHS.semantics)) {
985 Double = std::move(
RHS.Double);
986 }
else if (
this != &
RHS) {
988 new (
this) Storage(std::move(
RHS));
995 static_assert(std::is_same<T, IEEEFloat>::value ||
996 std::is_same<T, DoubleAPFloat>::value);
997 if (std::is_same<T, DoubleAPFloat>::value) {
1004 if (usesLayout<IEEEFloat>(*U.semantics))
1006 if (usesLayout<DoubleAPFloat>(*U.semantics))
1007 return U.Double.getFirst().U.IEEE;
1012 if (usesLayout<IEEEFloat>(*U.semantics))
1014 if (usesLayout<DoubleAPFloat>(*U.semantics))
1015 return U.Double.getFirst().U.IEEE;
1023 void makeNaN(
bool SNaN,
bool Neg,
const APInt *fill) {
1027 void makeLargest(
bool Neg) {
1031 void makeSmallest(
bool Neg) {
1035 void makeSmallestNormalized(
bool Neg) {
1041 : U(std::move(
F), S) {}
1045 "Should only compare APFloats with the same semantics");
1047 return U.IEEE.compareAbsoluteValue(
RHS.U.IEEE);
1049 return U.Double.compareAbsoluteValue(
RHS.U.Double);
1057 template <
typename T,
1058 typename = std::enable_if_t<std::is_floating_point<T>::value>>
1078 Val.makeZero(Negative);
1097 Val.makeInf(Negative);
1109 APInt intPayload(64, payload);
1110 return getQNaN(Sem, Negative, &intPayload);
1112 return getQNaN(Sem, Negative,
nullptr);
1118 const APInt *payload =
nullptr) {
1120 Val.makeNaN(
false, Negative, payload);
1126 const APInt *payload =
nullptr) {
1128 Val.makeNaN(
true, Negative, payload);
1137 Val.makeLargest(Negative);
1147 Val.makeSmallest(Negative);
1156 bool Negative =
false) {
1158 Val.makeSmallestNormalized(Negative);
1180 "Should only call on two APFloats with the same semantics");
1182 return U.IEEE.add(
RHS.U.IEEE, RM);
1184 return U.Double.add(
RHS.U.Double, RM);
1189 "Should only call on two APFloats with the same semantics");
1191 return U.IEEE.subtract(
RHS.U.IEEE, RM);
1193 return U.Double.subtract(
RHS.U.Double, RM);
1198 "Should only call on two APFloats with the same semantics");
1200 return U.IEEE.multiply(
RHS.U.IEEE, RM);
1202 return U.Double.multiply(
RHS.U.Double, RM);
1207 "Should only call on two APFloats with the same semantics");
1209 return U.IEEE.divide(
RHS.U.IEEE, RM);
1211 return U.Double.divide(
RHS.U.Double, RM);
1216 "Should only call on two APFloats with the same semantics");
1218 return U.IEEE.remainder(
RHS.U.IEEE);
1220 return U.Double.remainder(
RHS.U.Double);
1225 "Should only call on two APFloats with the same semantics");
1227 return U.IEEE.mod(
RHS.U.IEEE);
1229 return U.Double.mod(
RHS.U.Double);
1235 "Should only call on APFloats with the same semantics");
1237 "Should only call on APFloats with the same semantics");
1239 return U.IEEE.fusedMultiplyAdd(Multiplicand.U.IEEE, Addend.U.IEEE, RM);
1241 return U.Double.fusedMultiplyAdd(Multiplicand.U.Double, Addend.U.Double,
1258 Result.changeSign();
1307 Value.copySign(Sign);
1315 Result.getIEEE().makeQuiet();
1323 bool *IsExact)
const {
1328 bool *IsExact)
const;
1334 unsigned int InputSize,
bool IsSigned,
1340 unsigned int InputSize,
bool IsSigned,
1362#ifdef HAS_IEE754_FLOAT128
1363 float128 convertToQuad()
const;
1397 "Should only compare APFloats with the same semantics");
1399 return U.IEEE.compare(
RHS.U.IEEE);
1401 return U.Double.compare(
RHS.U.Double);
1409 return U.IEEE.bitwiseIsEqual(
RHS.U.IEEE);
1411 return U.Double.bitwiseIsEqual(
RHS.U.Double);
1471 unsigned FormatMaxPadding = 3,
bool TruncateZero =
true)
const {
1473 toString(Str, FormatPrecision, FormatMaxPadding, TruncateZero));
1502 "Empty base class optimization is not performed.");
1510 if (APFloat::usesLayout<detail::IEEEFloat>(
X.getSemantics()))
1512 if (APFloat::usesLayout<detail::DoubleAPFloat>(
X.getSemantics()))
1522 if (APFloat::usesLayout<detail::IEEEFloat>(
X.getSemantics()))
1524 if (APFloat::usesLayout<detail::DoubleAPFloat>(
X.getSemantics()))
1549 if (
A.isZero() &&
B.isZero() && (
A.isNegative() !=
B.isNegative()))
1550 return A.isNegative() ?
A :
B;
1551 return B <
A ?
B :
A;
1563 if (
A.isZero() &&
B.isZero() && (
A.isNegative() !=
B.isNegative()))
1564 return A.isNegative() ?
B :
A;
1565 return A <
B ?
B :
A;
1574 return A.makeQuiet();
1576 return B.makeQuiet();
1577 if (
A.isZero() &&
B.isZero() && (
A.isNegative() !=
B.isNegative()))
1578 return A.isNegative() ?
A :
B;
1579 return B <
A ?
B :
A;
1587 return B.isNaN() ?
B.makeQuiet() :
B;
1590 if (
A.isZero() &&
B.isZero() && (
A.isNegative() !=
B.isNegative()))
1591 return A.isNegative() ?
A :
B;
1592 return B <
A ?
B :
A;
1601 return A.makeQuiet();
1603 return B.makeQuiet();
1604 if (
A.isZero() &&
B.isZero() && (
A.isNegative() !=
B.isNegative()))
1605 return A.isNegative() ?
B :
A;
1606 return A <
B ?
B :
A;
1614 return B.isNaN() ?
B.makeQuiet() :
B;
1617 if (
A.isZero() &&
B.isZero() && (
A.isNegative() !=
B.isNegative()))
1618 return A.isNegative() ?
B :
A;
1619 return A <
B ?
B :
A;
1650#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 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)