• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 //===- llvm/ADT/APFloat.h - Arbitrary Precision Floating Point ---*- C++ -*-==//
2 //
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 ///
10 /// \file
11 /// \brief
12 /// This file declares a class to represent arbitrary precision floating point
13 /// values and provide a variety of arithmetic operations on them.
14 ///
15 //===----------------------------------------------------------------------===//
16 
17 #ifndef LLVM_ADT_APFLOAT_H
18 #define LLVM_ADT_APFLOAT_H
19 
20 #include "llvm/ADT/APInt.h"
21 #include "llvm/Support/ErrorHandling.h"
22 #include <memory>
23 
24 namespace llvm {
25 
26 struct fltSemantics;
27 class APSInt;
28 class StringRef;
29 class APFloat;
30 class raw_ostream;
31 
32 template <typename T> class SmallVectorImpl;
33 
34 /// Enum that represents what fraction of the LSB truncated bits of an fp number
35 /// represent.
36 ///
37 /// This essentially combines the roles of guard and sticky bits.
38 enum lostFraction { // Example of truncated bits:
39   lfExactlyZero,    // 000000
40   lfLessThanHalf,   // 0xxxxx  x's not all zero
41   lfExactlyHalf,    // 100000
42   lfMoreThanHalf    // 1xxxxx  x's not all zero
43 };
44 
45 /// \brief A self-contained host- and target-independent arbitrary-precision
46 /// floating-point software implementation.
47 ///
48 /// APFloat uses bignum integer arithmetic as provided by static functions in
49 /// the APInt class.  The library will work with bignum integers whose parts are
50 /// any unsigned type at least 16 bits wide, but 64 bits is recommended.
51 ///
52 /// Written for clarity rather than speed, in particular with a view to use in
53 /// the front-end of a cross compiler so that target arithmetic can be correctly
54 /// performed on the host.  Performance should nonetheless be reasonable,
55 /// particularly for its intended use.  It may be useful as a base
56 /// implementation for a run-time library during development of a faster
57 /// target-specific one.
58 ///
59 /// All 5 rounding modes in the IEEE-754R draft are handled correctly for all
60 /// implemented operations.  Currently implemented operations are add, subtract,
61 /// multiply, divide, fused-multiply-add, conversion-to-float,
62 /// conversion-to-integer and conversion-from-integer.  New rounding modes
63 /// (e.g. away from zero) can be added with three or four lines of code.
64 ///
65 /// Four formats are built-in: IEEE single precision, double precision,
66 /// quadruple precision, and x87 80-bit extended double (when operating with
67 /// full extended precision).  Adding a new format that obeys IEEE semantics
68 /// only requires adding two lines of code: a declaration and definition of the
69 /// format.
70 ///
71 /// All operations return the status of that operation as an exception bit-mask,
72 /// so multiple operations can be done consecutively with their results or-ed
73 /// together.  The returned status can be useful for compiler diagnostics; e.g.,
74 /// inexact, underflow and overflow can be easily diagnosed on constant folding,
75 /// and compiler optimizers can determine what exceptions would be raised by
76 /// folding operations and optimize, or perhaps not optimize, accordingly.
77 ///
78 /// At present, underflow tininess is detected after rounding; it should be
79 /// straight forward to add support for the before-rounding case too.
80 ///
81 /// The library reads hexadecimal floating point numbers as per C99, and
82 /// correctly rounds if necessary according to the specified rounding mode.
83 /// Syntax is required to have been validated by the caller.  It also converts
84 /// floating point numbers to hexadecimal text as per the C99 %a and %A
85 /// conversions.  The output precision (or alternatively the natural minimal
86 /// precision) can be specified; if the requested precision is less than the
87 /// natural precision the output is correctly rounded for the specified rounding
88 /// mode.
89 ///
90 /// It also reads decimal floating point numbers and correctly rounds according
91 /// to the specified rounding mode.
92 ///
93 /// Conversion to decimal text is not currently implemented.
94 ///
95 /// Non-zero finite numbers are represented internally as a sign bit, a 16-bit
96 /// signed exponent, and the significand as an array of integer parts.  After
97 /// normalization of a number of precision P the exponent is within the range of
98 /// the format, and if the number is not denormal the P-th bit of the
99 /// significand is set as an explicit integer bit.  For denormals the most
100 /// significant bit is shifted right so that the exponent is maintained at the
101 /// format's minimum, so that the smallest denormal has just the least
102 /// significant bit of the significand set.  The sign of zeroes and infinities
103 /// is significant; the exponent and significand of such numbers is not stored,
104 /// but has a known implicit (deterministic) value: 0 for the significands, 0
105 /// for zero exponent, all 1 bits for infinity exponent.  For NaNs the sign and
106 /// significand are deterministic, although not really meaningful, and preserved
107 /// in non-conversion operations.  The exponent is implicitly all 1 bits.
108 ///
109 /// APFloat does not provide any exception handling beyond default exception
110 /// handling. We represent Signaling NaNs via IEEE-754R 2008 6.2.1 should clause
111 /// by encoding Signaling NaNs with the first bit of its trailing significand as
112 /// 0.
113 ///
114 /// TODO
115 /// ====
116 ///
117 /// Some features that may or may not be worth adding:
118 ///
119 /// Binary to decimal conversion (hard).
120 ///
121 /// Optional ability to detect underflow tininess before rounding.
122 ///
123 /// New formats: x87 in single and double precision mode (IEEE apart from
124 /// extended exponent range) (hard).
125 ///
126 /// New operations: sqrt, IEEE remainder, C90 fmod, nexttoward.
127 ///
128 
129 // This is the common type definitions shared by APFloat and its internal
130 // implementation classes. This struct should not define any non-static data
131 // members.
132 struct APFloatBase {
133   /// A signed type to represent a floating point numbers unbiased exponent.
134   typedef signed short ExponentType;
135 
136   /// \name Floating Point Semantics.
137   /// @{
138 
139   static const fltSemantics &IEEEhalf();
140   static const fltSemantics &IEEEsingle();
141   static const fltSemantics &IEEEdouble();
142   static const fltSemantics &IEEEquad();
143   static const fltSemantics &PPCDoubleDouble();
144   static const fltSemantics &x87DoubleExtended();
145 
146   /// A Pseudo fltsemantic used to construct APFloats that cannot conflict with
147   /// anything real.
148   static const fltSemantics &Bogus();
149 
150   /// @}
151 
152   /// IEEE-754R 5.11: Floating Point Comparison Relations.
153   enum cmpResult {
154     cmpLessThan,
155     cmpEqual,
156     cmpGreaterThan,
157     cmpUnordered
158   };
159 
160   /// IEEE-754R 4.3: Rounding-direction attributes.
161   enum roundingMode {
162     rmNearestTiesToEven,
163     rmTowardPositive,
164     rmTowardNegative,
165     rmTowardZero,
166     rmNearestTiesToAway
167   };
168 
169   /// IEEE-754R 7: Default exception handling.
170   ///
171   /// opUnderflow or opOverflow are always returned or-ed with opInexact.
172   enum opStatus {
173     opOK = 0x00,
174     opInvalidOp = 0x01,
175     opDivByZero = 0x02,
176     opOverflow = 0x04,
177     opUnderflow = 0x08,
178     opInexact = 0x10
179   };
180 
181   /// Category of internally-represented number.
182   enum fltCategory {
183     fcInfinity,
184     fcNaN,
185     fcNormal,
186     fcZero
187   };
188 
189   /// Convenience enum used to construct an uninitialized APFloat.
190   enum uninitializedTag {
191     uninitialized
192   };
193 
194   /// \brief Enumeration of \c ilogb error results.
195   enum IlogbErrorKinds {
196     IEK_Zero = INT_MIN + 1,
197     IEK_NaN = INT_MIN,
198     IEK_Inf = INT_MAX
199   };
200 
201   static unsigned int semanticsPrecision(const fltSemantics &);
202   static ExponentType semanticsMinExponent(const fltSemantics &);
203   static ExponentType semanticsMaxExponent(const fltSemantics &);
204   static unsigned int semanticsSizeInBits(const fltSemantics &);
205 
206   /// Returns the size of the floating point number (in bits) in the given
207   /// semantics.
208   static unsigned getSizeInBits(const fltSemantics &Sem);
209 };
210 
211 namespace detail {
212 
213 class IEEEFloat final : public APFloatBase {
214 public:
215   /// \name Constructors
216   /// @{
217 
218   IEEEFloat(const fltSemantics &); // Default construct to 0.0
219   IEEEFloat(const fltSemantics &, integerPart);
220   IEEEFloat(const fltSemantics &, uninitializedTag);
221   IEEEFloat(const fltSemantics &, const APInt &);
222   explicit IEEEFloat(double d);
223   explicit IEEEFloat(float f);
224   IEEEFloat(const IEEEFloat &);
225   IEEEFloat(IEEEFloat &&);
226   ~IEEEFloat();
227 
228   /// @}
229 
230   /// \brief Returns whether this instance allocated memory.
needsCleanup()231   bool needsCleanup() const { return partCount() > 1; }
232 
233   /// \name Convenience "constructors"
234   /// @{
235 
236   /// @}
237 
238   /// Used to insert APFloat objects, or objects that contain APFloat objects,
239   /// into FoldingSets.
240   void Profile(FoldingSetNodeID &NID) const;
241 
242   /// \name Arithmetic
243   /// @{
244 
245   opStatus add(const IEEEFloat &, roundingMode);
246   opStatus subtract(const IEEEFloat &, roundingMode);
247   opStatus multiply(const IEEEFloat &, roundingMode);
248   opStatus divide(const IEEEFloat &, roundingMode);
249   /// IEEE remainder.
250   opStatus remainder(const IEEEFloat &);
251   /// C fmod, or llvm frem.
252   opStatus mod(const IEEEFloat &);
253   opStatus fusedMultiplyAdd(const IEEEFloat &, const IEEEFloat &, roundingMode);
254   opStatus roundToIntegral(roundingMode);
255   /// IEEE-754R 5.3.1: nextUp/nextDown.
256   opStatus next(bool nextDown);
257 
258   /// \brief Operator+ overload which provides the default
259   /// \c nmNearestTiesToEven rounding mode and *no* error checking.
260   IEEEFloat operator+(const IEEEFloat &RHS) const {
261     IEEEFloat Result = *this;
262     Result.add(RHS, rmNearestTiesToEven);
263     return Result;
264   }
265 
266   /// \brief Operator- overload which provides the default
267   /// \c nmNearestTiesToEven rounding mode and *no* error checking.
268   IEEEFloat operator-(const IEEEFloat &RHS) const {
269     IEEEFloat Result = *this;
270     Result.subtract(RHS, rmNearestTiesToEven);
271     return Result;
272   }
273 
274   /// \brief Operator* overload which provides the default
275   /// \c nmNearestTiesToEven rounding mode and *no* error checking.
276   IEEEFloat operator*(const IEEEFloat &RHS) const {
277     IEEEFloat Result = *this;
278     Result.multiply(RHS, rmNearestTiesToEven);
279     return Result;
280   }
281 
282   /// \brief Operator/ overload which provides the default
283   /// \c nmNearestTiesToEven rounding mode and *no* error checking.
284   IEEEFloat operator/(const IEEEFloat &RHS) const {
285     IEEEFloat Result = *this;
286     Result.divide(RHS, rmNearestTiesToEven);
287     return Result;
288   }
289 
290   /// @}
291 
292   /// \name Sign operations.
293   /// @{
294 
295   void changeSign();
296   void clearSign();
297   void copySign(const IEEEFloat &);
298 
299   /// \brief A static helper to produce a copy of an APFloat value with its sign
300   /// copied from some other APFloat.
copySign(IEEEFloat Value,const IEEEFloat & Sign)301   static IEEEFloat copySign(IEEEFloat Value, const IEEEFloat &Sign) {
302     Value.copySign(Sign);
303     return Value;
304   }
305 
306   /// @}
307 
308   /// \name Conversions
309   /// @{
310 
311   opStatus convert(const fltSemantics &, roundingMode, bool *);
312   opStatus convertToInteger(integerPart *, unsigned int, bool, roundingMode,
313                             bool *) const;
314   opStatus convertToInteger(APSInt &, roundingMode, bool *) const;
315   opStatus convertFromAPInt(const APInt &, bool, roundingMode);
316   opStatus convertFromSignExtendedInteger(const integerPart *, unsigned int,
317                                           bool, roundingMode);
318   opStatus convertFromZeroExtendedInteger(const integerPart *, unsigned int,
319                                           bool, roundingMode);
320   opStatus convertFromString(StringRef, roundingMode);
321   APInt bitcastToAPInt() const;
322   double convertToDouble() const;
323   float convertToFloat() const;
324 
325   /// @}
326 
327   /// The definition of equality is not straightforward for floating point, so
328   /// we won't use operator==.  Use one of the following, or write whatever it
329   /// is you really mean.
330   bool operator==(const IEEEFloat &) const = delete;
331 
332   /// IEEE comparison with another floating point number (NaNs compare
333   /// unordered, 0==-0).
334   cmpResult compare(const IEEEFloat &) const;
335 
336   /// Bitwise comparison for equality (QNaNs compare equal, 0!=-0).
337   bool bitwiseIsEqual(const IEEEFloat &) const;
338 
339   /// Write out a hexadecimal representation of the floating point value to DST,
340   /// which must be of sufficient size, in the C99 form [-]0xh.hhhhp[+-]d.
341   /// Return the number of characters written, excluding the terminating NUL.
342   unsigned int convertToHexString(char *dst, unsigned int hexDigits,
343                                   bool upperCase, roundingMode) const;
344 
345   /// \name IEEE-754R 5.7.2 General operations.
346   /// @{
347 
348   /// IEEE-754R isSignMinus: Returns true if and only if the current value is
349   /// negative.
350   ///
351   /// This applies to zeros and NaNs as well.
isNegative()352   bool isNegative() const { return sign; }
353 
354   /// IEEE-754R isNormal: Returns true if and only if the current value is normal.
355   ///
356   /// This implies that the current value of the float is not zero, subnormal,
357   /// infinite, or NaN following the definition of normality from IEEE-754R.
isNormal()358   bool isNormal() const { return !isDenormal() && isFiniteNonZero(); }
359 
360   /// Returns true if and only if the current value is zero, subnormal, or
361   /// normal.
362   ///
363   /// This means that the value is not infinite or NaN.
isFinite()364   bool isFinite() const { return !isNaN() && !isInfinity(); }
365 
366   /// Returns true if and only if the float is plus or minus zero.
isZero()367   bool isZero() const { return category == fcZero; }
368 
369   /// IEEE-754R isSubnormal(): Returns true if and only if the float is a
370   /// denormal.
371   bool isDenormal() const;
372 
373   /// IEEE-754R isInfinite(): Returns true if and only if the float is infinity.
isInfinity()374   bool isInfinity() const { return category == fcInfinity; }
375 
376   /// Returns true if and only if the float is a quiet or signaling NaN.
isNaN()377   bool isNaN() const { return category == fcNaN; }
378 
379   /// Returns true if and only if the float is a signaling NaN.
380   bool isSignaling() const;
381 
382   /// @}
383 
384   /// \name Simple Queries
385   /// @{
386 
getCategory()387   fltCategory getCategory() const { return category; }
getSemantics()388   const fltSemantics &getSemantics() const { return *semantics; }
isNonZero()389   bool isNonZero() const { return category != fcZero; }
isFiniteNonZero()390   bool isFiniteNonZero() const { return isFinite() && !isZero(); }
isPosZero()391   bool isPosZero() const { return isZero() && !isNegative(); }
isNegZero()392   bool isNegZero() const { return isZero() && isNegative(); }
393 
394   /// Returns true if and only if the number has the smallest possible non-zero
395   /// magnitude in the current semantics.
396   bool isSmallest() const;
397 
398   /// Returns true if and only if the number has the largest possible finite
399   /// magnitude in the current semantics.
400   bool isLargest() const;
401 
402   /// Returns true if and only if the number is an exact integer.
403   bool isInteger() const;
404 
405   /// @}
406 
407   IEEEFloat &operator=(const IEEEFloat &);
408   IEEEFloat &operator=(IEEEFloat &&);
409 
410   /// \brief Overload to compute a hash code for an APFloat value.
411   ///
412   /// Note that the use of hash codes for floating point values is in general
413   /// frought with peril. Equality is hard to define for these values. For
414   /// example, should negative and positive zero hash to different codes? Are
415   /// they equal or not? This hash value implementation specifically
416   /// emphasizes producing different codes for different inputs in order to
417   /// be used in canonicalization and memoization. As such, equality is
418   /// bitwiseIsEqual, and 0 != -0.
419   friend hash_code hash_value(const IEEEFloat &Arg);
420 
421   /// Converts this value into a decimal string.
422   ///
423   /// \param FormatPrecision The maximum number of digits of
424   ///   precision to output.  If there are fewer digits available,
425   ///   zero padding will not be used unless the value is
426   ///   integral and small enough to be expressed in
427   ///   FormatPrecision digits.  0 means to use the natural
428   ///   precision of the number.
429   /// \param FormatMaxPadding The maximum number of zeros to
430   ///   consider inserting before falling back to scientific
431   ///   notation.  0 means to always use scientific notation.
432   ///
433   /// Number       Precision    MaxPadding      Result
434   /// ------       ---------    ----------      ------
435   /// 1.01E+4              5             2       10100
436   /// 1.01E+4              4             2       1.01E+4
437   /// 1.01E+4              5             1       1.01E+4
438   /// 1.01E-2              5             2       0.0101
439   /// 1.01E-2              4             2       0.0101
440   /// 1.01E-2              4             1       1.01E-2
441   void toString(SmallVectorImpl<char> &Str, unsigned FormatPrecision = 0,
442                 unsigned FormatMaxPadding = 3) const;
443 
444   /// If this value has an exact multiplicative inverse, store it in inv and
445   /// return true.
446   bool getExactInverse(IEEEFloat *inv) const;
447 
448   /// \brief Returns the exponent of the internal representation of the APFloat.
449   ///
450   /// Because the radix of APFloat is 2, this is equivalent to floor(log2(x)).
451   /// For special APFloat values, this returns special error codes:
452   ///
453   ///   NaN -> \c IEK_NaN
454   ///   0   -> \c IEK_Zero
455   ///   Inf -> \c IEK_Inf
456   ///
457   friend int ilogb(const IEEEFloat &Arg);
458 
459   /// \brief Returns: X * 2^Exp for integral exponents.
460   friend IEEEFloat scalbn(IEEEFloat X, int Exp, roundingMode);
461 
462   friend IEEEFloat frexp(const IEEEFloat &X, int &Exp, roundingMode);
463 
464   /// \name Special value setters.
465   /// @{
466 
467   void makeLargest(bool Neg = false);
468   void makeSmallest(bool Neg = false);
469   void makeNaN(bool SNaN = false, bool Neg = false,
470                const APInt *fill = nullptr);
471   void makeInf(bool Neg = false);
472   void makeZero(bool Neg = false);
473   void makeQuiet();
474 
475   /// Returns the smallest (by magnitude) normalized finite number in the given
476   /// semantics.
477   ///
478   /// \param Negative - True iff the number should be negative
479   void makeSmallestNormalized(bool Negative = false);
480 
481   /// @}
482 
483   cmpResult compareAbsoluteValue(const IEEEFloat &) const;
484 
485 private:
486   /// \name Simple Queries
487   /// @{
488 
489   integerPart *significandParts();
490   const integerPart *significandParts() const;
491   unsigned int partCount() const;
492 
493   /// @}
494 
495   /// \name Significand operations.
496   /// @{
497 
498   integerPart addSignificand(const IEEEFloat &);
499   integerPart subtractSignificand(const IEEEFloat &, integerPart);
500   lostFraction addOrSubtractSignificand(const IEEEFloat &, bool subtract);
501   lostFraction multiplySignificand(const IEEEFloat &, const IEEEFloat *);
502   lostFraction divideSignificand(const IEEEFloat &);
503   void incrementSignificand();
504   void initialize(const fltSemantics *);
505   void shiftSignificandLeft(unsigned int);
506   lostFraction shiftSignificandRight(unsigned int);
507   unsigned int significandLSB() const;
508   unsigned int significandMSB() const;
509   void zeroSignificand();
510   /// Return true if the significand excluding the integral bit is all ones.
511   bool isSignificandAllOnes() const;
512   /// Return true if the significand excluding the integral bit is all zeros.
513   bool isSignificandAllZeros() const;
514 
515   /// @}
516 
517   /// \name Arithmetic on special values.
518   /// @{
519 
520   opStatus addOrSubtractSpecials(const IEEEFloat &, bool subtract);
521   opStatus divideSpecials(const IEEEFloat &);
522   opStatus multiplySpecials(const IEEEFloat &);
523   opStatus modSpecials(const IEEEFloat &);
524 
525   /// @}
526 
527   /// \name Miscellany
528   /// @{
529 
530   bool convertFromStringSpecials(StringRef str);
531   opStatus normalize(roundingMode, lostFraction);
532   opStatus addOrSubtract(const IEEEFloat &, roundingMode, bool subtract);
533   opStatus handleOverflow(roundingMode);
534   bool roundAwayFromZero(roundingMode, lostFraction, unsigned int) const;
535   opStatus convertToSignExtendedInteger(integerPart *, unsigned int, bool,
536                                         roundingMode, bool *) const;
537   opStatus convertFromUnsignedParts(const integerPart *, unsigned int,
538                                     roundingMode);
539   opStatus convertFromHexadecimalString(StringRef, roundingMode);
540   opStatus convertFromDecimalString(StringRef, roundingMode);
541   char *convertNormalToHexString(char *, unsigned int, bool,
542                                  roundingMode) const;
543   opStatus roundSignificandWithExponent(const integerPart *, unsigned int, int,
544                                         roundingMode);
545 
546   /// @}
547 
548   APInt convertHalfAPFloatToAPInt() const;
549   APInt convertFloatAPFloatToAPInt() const;
550   APInt convertDoubleAPFloatToAPInt() const;
551   APInt convertQuadrupleAPFloatToAPInt() const;
552   APInt convertF80LongDoubleAPFloatToAPInt() const;
553   APInt convertPPCDoubleDoubleAPFloatToAPInt() const;
554   void initFromAPInt(const fltSemantics *Sem, const APInt &api);
555   void initFromHalfAPInt(const APInt &api);
556   void initFromFloatAPInt(const APInt &api);
557   void initFromDoubleAPInt(const APInt &api);
558   void initFromQuadrupleAPInt(const APInt &api);
559   void initFromF80LongDoubleAPInt(const APInt &api);
560   void initFromPPCDoubleDoubleAPInt(const APInt &api);
561 
562   void assign(const IEEEFloat &);
563   void copySignificand(const IEEEFloat &);
564   void freeSignificand();
565 
566   /// Note: this must be the first data member.
567   /// The semantics that this value obeys.
568   const fltSemantics *semantics;
569 
570   /// A binary fraction with an explicit integer bit.
571   ///
572   /// The significand must be at least one bit wider than the target precision.
573   union Significand {
574     integerPart part;
575     integerPart *parts;
576   } significand;
577 
578   /// The signed unbiased exponent of the value.
579   ExponentType exponent;
580 
581   /// What kind of floating point number this is.
582   ///
583   /// Only 2 bits are required, but VisualStudio incorrectly sign extends it.
584   /// Using the extra bit keeps it from failing under VisualStudio.
585   fltCategory category : 3;
586 
587   /// Sign bit of the number.
588   unsigned int sign : 1;
589 };
590 
591 hash_code hash_value(const IEEEFloat &Arg);
592 int ilogb(const IEEEFloat &Arg);
593 IEEEFloat scalbn(IEEEFloat X, int Exp, IEEEFloat::roundingMode);
594 IEEEFloat frexp(const IEEEFloat &Val, int &Exp, IEEEFloat::roundingMode RM);
595 
596 // This mode implements more precise float in terms of two APFloats.
597 // The interface and layout is designed for arbitray underlying semantics,
598 // though currently only PPCDoubleDouble semantics are supported, whose
599 // corresponding underlying semantics are IEEEdouble.
600 class DoubleAPFloat final : public APFloatBase {
601   // Note: this must be the first data member.
602   const fltSemantics *Semantics;
603   std::unique_ptr<APFloat[]> Floats;
604 
605   opStatus addImpl(const APFloat &a, const APFloat &aa, const APFloat &c,
606                    const APFloat &cc, roundingMode RM);
607 
608   opStatus addWithSpecial(const DoubleAPFloat &LHS, const DoubleAPFloat &RHS,
609                           DoubleAPFloat &Out, roundingMode RM);
610 
611 public:
612   DoubleAPFloat(const fltSemantics &S);
613   DoubleAPFloat(const fltSemantics &S, uninitializedTag);
614   DoubleAPFloat(const fltSemantics &S, integerPart);
615   DoubleAPFloat(const fltSemantics &S, const APInt &I);
616   DoubleAPFloat(const fltSemantics &S, APFloat &&First, APFloat &&Second);
617   DoubleAPFloat(const DoubleAPFloat &RHS);
618   DoubleAPFloat(DoubleAPFloat &&RHS);
619 
620   DoubleAPFloat &operator=(const DoubleAPFloat &RHS);
621 
622   DoubleAPFloat &operator=(DoubleAPFloat &&RHS) {
623     if (this != &RHS) {
624       this->~DoubleAPFloat();
625       new (this) DoubleAPFloat(std::move(RHS));
626     }
627     return *this;
628   }
629 
needsCleanup()630   bool needsCleanup() const { return Floats != nullptr; }
631 
getFirst()632   APFloat &getFirst() { return Floats[0]; }
getFirst()633   const APFloat &getFirst() const { return Floats[0]; }
getSecond()634   APFloat &getSecond() { return Floats[1]; }
getSecond()635   const APFloat &getSecond() const { return Floats[1]; }
636 
637   opStatus add(const DoubleAPFloat &RHS, roundingMode RM);
638   opStatus subtract(const DoubleAPFloat &RHS, roundingMode RM);
639   void changeSign();
640   cmpResult compareAbsoluteValue(const DoubleAPFloat &RHS) const;
641 
642   fltCategory getCategory() const;
643   bool isNegative() const;
644 
645   void makeInf(bool Neg);
646   void makeNaN(bool SNaN, bool Neg, const APInt *fill);
647 };
648 
649 } // End detail namespace
650 
651 // This is a interface class that is currently forwarding functionalities from
652 // detail::IEEEFloat.
653 class APFloat : public APFloatBase {
654   typedef detail::IEEEFloat IEEEFloat;
655   typedef detail::DoubleAPFloat DoubleAPFloat;
656 
657   static_assert(std::is_standard_layout<IEEEFloat>::value, "");
658 
659   union Storage {
660     const fltSemantics *semantics;
661     IEEEFloat IEEE;
662     DoubleAPFloat Double;
663 
664     explicit Storage(IEEEFloat F, const fltSemantics &S);
Storage(DoubleAPFloat F,const fltSemantics & S)665     explicit Storage(DoubleAPFloat F, const fltSemantics &S)
666         : Double(std::move(F)) {
667       assert(&S == &PPCDoubleDouble());
668     }
669 
670     template <typename... ArgTypes>
Storage(const fltSemantics & Semantics,ArgTypes &&...Args)671     Storage(const fltSemantics &Semantics, ArgTypes &&... Args) {
672       if (usesLayout<IEEEFloat>(Semantics)) {
673         new (&IEEE) IEEEFloat(Semantics, std::forward<ArgTypes>(Args)...);
674         return;
675       }
676       if (usesLayout<DoubleAPFloat>(Semantics)) {
677         new (&Double) DoubleAPFloat(Semantics, std::forward<ArgTypes>(Args)...);
678         return;
679       }
680       llvm_unreachable("Unexpected semantics");
681     }
682 
~Storage()683     ~Storage() {
684       if (usesLayout<IEEEFloat>(*semantics)) {
685         IEEE.~IEEEFloat();
686         return;
687       }
688       if (usesLayout<DoubleAPFloat>(*semantics)) {
689         Double.~DoubleAPFloat();
690         return;
691       }
692       llvm_unreachable("Unexpected semantics");
693     }
694 
Storage(const Storage & RHS)695     Storage(const Storage &RHS) {
696       if (usesLayout<IEEEFloat>(*RHS.semantics)) {
697         new (this) IEEEFloat(RHS.IEEE);
698         return;
699       }
700       if (usesLayout<DoubleAPFloat>(*RHS.semantics)) {
701         new (this) DoubleAPFloat(RHS.Double);
702         return;
703       }
704       llvm_unreachable("Unexpected semantics");
705     }
706 
Storage(Storage && RHS)707     Storage(Storage &&RHS) {
708       if (usesLayout<IEEEFloat>(*RHS.semantics)) {
709         new (this) IEEEFloat(std::move(RHS.IEEE));
710         return;
711       }
712       if (usesLayout<DoubleAPFloat>(*RHS.semantics)) {
713         new (this) DoubleAPFloat(std::move(RHS.Double));
714         return;
715       }
716       llvm_unreachable("Unexpected semantics");
717     }
718 
719     Storage &operator=(const Storage &RHS) {
720       if (usesLayout<IEEEFloat>(*semantics) &&
721           usesLayout<IEEEFloat>(*RHS.semantics)) {
722         IEEE = RHS.IEEE;
723       } else if (usesLayout<DoubleAPFloat>(*semantics) &&
724                  usesLayout<DoubleAPFloat>(*RHS.semantics)) {
725         Double = RHS.Double;
726       } else if (this != &RHS) {
727         this->~Storage();
728         new (this) Storage(RHS);
729       }
730       return *this;
731     }
732 
733     Storage &operator=(Storage &&RHS) {
734       if (usesLayout<IEEEFloat>(*semantics) &&
735           usesLayout<IEEEFloat>(*RHS.semantics)) {
736         IEEE = std::move(RHS.IEEE);
737       } else if (usesLayout<DoubleAPFloat>(*semantics) &&
738                  usesLayout<DoubleAPFloat>(*RHS.semantics)) {
739         Double = std::move(RHS.Double);
740       } else if (this != &RHS) {
741         this->~Storage();
742         new (this) Storage(std::move(RHS));
743       }
744       return *this;
745     }
746   } U;
747 
usesLayout(const fltSemantics & Semantics)748   template <typename T> static bool usesLayout(const fltSemantics &Semantics) {
749     static_assert(std::is_same<T, IEEEFloat>::value ||
750                   std::is_same<T, DoubleAPFloat>::value, "");
751     if (std::is_same<T, DoubleAPFloat>::value) {
752       return &Semantics == &PPCDoubleDouble();
753     }
754     return &Semantics != &PPCDoubleDouble();
755   }
756 
getIEEE()757   IEEEFloat &getIEEE() {
758     if (usesLayout<IEEEFloat>(*U.semantics))
759       return U.IEEE;
760     if (usesLayout<DoubleAPFloat>(*U.semantics))
761       return U.Double.getFirst().U.IEEE;
762     llvm_unreachable("Unexpected semantics");
763   }
764 
getIEEE()765   const IEEEFloat &getIEEE() const {
766     if (usesLayout<IEEEFloat>(*U.semantics))
767       return U.IEEE;
768     if (usesLayout<DoubleAPFloat>(*U.semantics))
769       return U.Double.getFirst().U.IEEE;
770     llvm_unreachable("Unexpected semantics");
771   }
772 
makeZero(bool Neg)773   void makeZero(bool Neg) { getIEEE().makeZero(Neg); }
774 
makeInf(bool Neg)775   void makeInf(bool Neg) {
776     if (usesLayout<IEEEFloat>(*U.semantics))
777       return U.IEEE.makeInf(Neg);
778     if (usesLayout<DoubleAPFloat>(*U.semantics))
779       return U.Double.makeInf(Neg);
780     llvm_unreachable("Unexpected semantics");
781   }
782 
makeNaN(bool SNaN,bool Neg,const APInt * fill)783   void makeNaN(bool SNaN, bool Neg, const APInt *fill) {
784     getIEEE().makeNaN(SNaN, Neg, fill);
785   }
786 
makeLargest(bool Neg)787   void makeLargest(bool Neg) { getIEEE().makeLargest(Neg); }
788 
makeSmallest(bool Neg)789   void makeSmallest(bool Neg) { getIEEE().makeSmallest(Neg); }
790 
makeSmallestNormalized(bool Neg)791   void makeSmallestNormalized(bool Neg) {
792     getIEEE().makeSmallestNormalized(Neg);
793   }
794 
795   // FIXME: This is due to clang 3.3 (or older version) always checks for the
796   // default constructor in an array aggregate initialization, even if no
797   // elements in the array is default initialized.
APFloat()798   APFloat() : U(IEEEdouble()) {
799     llvm_unreachable("This is a workaround for old clang.");
800   }
801 
APFloat(IEEEFloat F,const fltSemantics & S)802   explicit APFloat(IEEEFloat F, const fltSemantics &S) : U(std::move(F), S) {}
APFloat(DoubleAPFloat F,const fltSemantics & S)803   explicit APFloat(DoubleAPFloat F, const fltSemantics &S)
804       : U(std::move(F), S) {}
805 
compareAbsoluteValue(const APFloat & RHS)806   cmpResult compareAbsoluteValue(const APFloat &RHS) const {
807     assert(&getSemantics() == &RHS.getSemantics());
808     if (usesLayout<IEEEFloat>(getSemantics()))
809       return U.IEEE.compareAbsoluteValue(RHS.U.IEEE);
810     if (usesLayout<DoubleAPFloat>(getSemantics()))
811       return U.Double.compareAbsoluteValue(RHS.U.Double);
812     llvm_unreachable("Unexpected semantics");
813   }
814 
815 public:
APFloat(const fltSemantics & Semantics)816   APFloat(const fltSemantics &Semantics) : U(Semantics) {}
817   APFloat(const fltSemantics &Semantics, StringRef S);
APFloat(const fltSemantics & Semantics,integerPart I)818   APFloat(const fltSemantics &Semantics, integerPart I) : U(Semantics, I) {}
819   // TODO: Remove this constructor. This isn't faster than the first one.
APFloat(const fltSemantics & Semantics,uninitializedTag)820   APFloat(const fltSemantics &Semantics, uninitializedTag)
821       : U(Semantics, uninitialized) {}
APFloat(const fltSemantics & Semantics,const APInt & I)822   APFloat(const fltSemantics &Semantics, const APInt &I) : U(Semantics, I) {}
APFloat(double d)823   explicit APFloat(double d) : U(IEEEFloat(d), IEEEdouble()) {}
APFloat(float f)824   explicit APFloat(float f) : U(IEEEFloat(f), IEEEsingle()) {}
825   APFloat(const APFloat &RHS) = default;
826   APFloat(APFloat &&RHS) = default;
827 
828   ~APFloat() = default;
829 
needsCleanup()830   bool needsCleanup() const {
831     if (usesLayout<IEEEFloat>(getSemantics()))
832       return U.IEEE.needsCleanup();
833     if (usesLayout<DoubleAPFloat>(getSemantics()))
834       return U.Double.needsCleanup();
835     llvm_unreachable("Unexpected semantics");
836   }
837 
838   /// Factory for Positive and Negative Zero.
839   ///
840   /// \param Negative True iff the number should be negative.
841   static APFloat getZero(const fltSemantics &Sem, bool Negative = false) {
842     APFloat Val(Sem, uninitialized);
843     Val.makeZero(Negative);
844     return Val;
845   }
846 
847   /// Factory for Positive and Negative Infinity.
848   ///
849   /// \param Negative True iff the number should be negative.
850   static APFloat getInf(const fltSemantics &Sem, bool Negative = false) {
851     APFloat Val(Sem, uninitialized);
852     Val.makeInf(Negative);
853     return Val;
854   }
855 
856   /// Factory for NaN values.
857   ///
858   /// \param Negative - True iff the NaN generated should be negative.
859   /// \param type - The unspecified fill bits for creating the NaN, 0 by
860   /// default.  The value is truncated as necessary.
861   static APFloat getNaN(const fltSemantics &Sem, bool Negative = false,
862                         unsigned type = 0) {
863     if (type) {
864       APInt fill(64, type);
865       return getQNaN(Sem, Negative, &fill);
866     } else {
867       return getQNaN(Sem, Negative, nullptr);
868     }
869   }
870 
871   /// Factory for QNaN values.
872   static APFloat getQNaN(const fltSemantics &Sem, bool Negative = false,
873                          const APInt *payload = nullptr) {
874     APFloat Val(Sem, uninitialized);
875     Val.makeNaN(false, Negative, payload);
876     return Val;
877   }
878 
879   /// Factory for SNaN values.
880   static APFloat getSNaN(const fltSemantics &Sem, bool Negative = false,
881                          const APInt *payload = nullptr) {
882     APFloat Val(Sem, uninitialized);
883     Val.makeNaN(true, Negative, payload);
884     return Val;
885   }
886 
887   /// Returns the largest finite number in the given semantics.
888   ///
889   /// \param Negative - True iff the number should be negative
890   static APFloat getLargest(const fltSemantics &Sem, bool Negative = false) {
891     APFloat Val(Sem, uninitialized);
892     Val.makeLargest(Negative);
893     return Val;
894   }
895 
896   /// Returns the smallest (by magnitude) finite number in the given semantics.
897   /// Might be denormalized, which implies a relative loss of precision.
898   ///
899   /// \param Negative - True iff the number should be negative
900   static APFloat getSmallest(const fltSemantics &Sem, bool Negative = false) {
901     APFloat Val(Sem, uninitialized);
902     Val.makeSmallest(Negative);
903     return Val;
904   }
905 
906   /// Returns the smallest (by magnitude) normalized finite number in the given
907   /// semantics.
908   ///
909   /// \param Negative - True iff the number should be negative
910   static APFloat getSmallestNormalized(const fltSemantics &Sem,
911                                        bool Negative = false) {
912     APFloat Val(Sem, uninitialized);
913     Val.makeSmallestNormalized(Negative);
914     return Val;
915   }
916 
917   /// Returns a float which is bitcasted from an all one value int.
918   ///
919   /// \param BitWidth - Select float type
920   /// \param isIEEE   - If 128 bit number, select between PPC and IEEE
921   static APFloat getAllOnesValue(unsigned BitWidth, bool isIEEE = false);
922 
Profile(FoldingSetNodeID & NID)923   void Profile(FoldingSetNodeID &NID) const { getIEEE().Profile(NID); }
924 
add(const APFloat & RHS,roundingMode RM)925   opStatus add(const APFloat &RHS, roundingMode RM) {
926     if (usesLayout<IEEEFloat>(getSemantics()))
927       return U.IEEE.add(RHS.U.IEEE, RM);
928     if (usesLayout<DoubleAPFloat>(getSemantics()))
929       return U.Double.add(RHS.U.Double, RM);
930     llvm_unreachable("Unexpected semantics");
931   }
subtract(const APFloat & RHS,roundingMode RM)932   opStatus subtract(const APFloat &RHS, roundingMode RM) {
933     if (usesLayout<IEEEFloat>(getSemantics()))
934       return U.IEEE.subtract(RHS.U.IEEE, RM);
935     if (usesLayout<DoubleAPFloat>(getSemantics()))
936       return U.Double.subtract(RHS.U.Double, RM);
937     llvm_unreachable("Unexpected semantics");
938   }
multiply(const APFloat & RHS,roundingMode RM)939   opStatus multiply(const APFloat &RHS, roundingMode RM) {
940     return getIEEE().multiply(RHS.getIEEE(), RM);
941   }
divide(const APFloat & RHS,roundingMode RM)942   opStatus divide(const APFloat &RHS, roundingMode RM) {
943     return getIEEE().divide(RHS.getIEEE(), RM);
944   }
remainder(const APFloat & RHS)945   opStatus remainder(const APFloat &RHS) {
946     return getIEEE().remainder(RHS.getIEEE());
947   }
mod(const APFloat & RHS)948   opStatus mod(const APFloat &RHS) { return getIEEE().mod(RHS.getIEEE()); }
fusedMultiplyAdd(const APFloat & Multiplicand,const APFloat & Addend,roundingMode RM)949   opStatus fusedMultiplyAdd(const APFloat &Multiplicand, const APFloat &Addend,
950                             roundingMode RM) {
951     return getIEEE().fusedMultiplyAdd(Multiplicand.getIEEE(), Addend.getIEEE(),
952                                       RM);
953   }
roundToIntegral(roundingMode RM)954   opStatus roundToIntegral(roundingMode RM) {
955     return getIEEE().roundToIntegral(RM);
956   }
next(bool nextDown)957   opStatus next(bool nextDown) { return getIEEE().next(nextDown); }
958 
959   APFloat operator+(const APFloat &RHS) const {
960     return APFloat(getIEEE() + RHS.getIEEE(), getSemantics());
961   }
962 
963   APFloat operator-(const APFloat &RHS) const {
964     return APFloat(getIEEE() - RHS.getIEEE(), getSemantics());
965   }
966 
967   APFloat operator*(const APFloat &RHS) const {
968     return APFloat(getIEEE() * RHS.getIEEE(), getSemantics());
969   }
970 
971   APFloat operator/(const APFloat &RHS) const {
972     return APFloat(getIEEE() / RHS.getIEEE(), getSemantics());
973   }
974 
changeSign()975   void changeSign() { getIEEE().changeSign(); }
clearSign()976   void clearSign() { getIEEE().clearSign(); }
copySign(const APFloat & RHS)977   void copySign(const APFloat &RHS) { getIEEE().copySign(RHS.getIEEE()); }
978 
copySign(APFloat Value,const APFloat & Sign)979   static APFloat copySign(APFloat Value, const APFloat &Sign) {
980     return APFloat(IEEEFloat::copySign(Value.getIEEE(), Sign.getIEEE()),
981                    Value.getSemantics());
982   }
983 
984   opStatus convert(const fltSemantics &ToSemantics, roundingMode RM,
985                    bool *losesInfo);
convertToInteger(integerPart * Input,unsigned int Width,bool IsSigned,roundingMode RM,bool * IsExact)986   opStatus convertToInteger(integerPart *Input, unsigned int Width,
987                             bool IsSigned, roundingMode RM,
988                             bool *IsExact) const {
989     return getIEEE().convertToInteger(Input, Width, IsSigned, RM, IsExact);
990   }
convertToInteger(APSInt & Result,roundingMode RM,bool * IsExact)991   opStatus convertToInteger(APSInt &Result, roundingMode RM,
992                             bool *IsExact) const {
993     return getIEEE().convertToInteger(Result, RM, IsExact);
994   }
convertFromAPInt(const APInt & Input,bool IsSigned,roundingMode RM)995   opStatus convertFromAPInt(const APInt &Input, bool IsSigned,
996                             roundingMode RM) {
997     return getIEEE().convertFromAPInt(Input, IsSigned, RM);
998   }
convertFromSignExtendedInteger(const integerPart * Input,unsigned int InputSize,bool IsSigned,roundingMode RM)999   opStatus convertFromSignExtendedInteger(const integerPart *Input,
1000                                           unsigned int InputSize, bool IsSigned,
1001                                           roundingMode RM) {
1002     return getIEEE().convertFromSignExtendedInteger(Input, InputSize, IsSigned,
1003                                                     RM);
1004   }
convertFromZeroExtendedInteger(const integerPart * Input,unsigned int InputSize,bool IsSigned,roundingMode RM)1005   opStatus convertFromZeroExtendedInteger(const integerPart *Input,
1006                                           unsigned int InputSize, bool IsSigned,
1007                                           roundingMode RM) {
1008     return getIEEE().convertFromZeroExtendedInteger(Input, InputSize, IsSigned,
1009                                                     RM);
1010   }
1011   opStatus convertFromString(StringRef, roundingMode);
bitcastToAPInt()1012   APInt bitcastToAPInt() const { return getIEEE().bitcastToAPInt(); }
convertToDouble()1013   double convertToDouble() const { return getIEEE().convertToDouble(); }
convertToFloat()1014   float convertToFloat() const { return getIEEE().convertToFloat(); }
1015 
1016   bool operator==(const APFloat &) const = delete;
1017 
compare(const APFloat & RHS)1018   cmpResult compare(const APFloat &RHS) const {
1019     return getIEEE().compare(RHS.getIEEE());
1020   }
1021 
bitwiseIsEqual(const APFloat & RHS)1022   bool bitwiseIsEqual(const APFloat &RHS) const {
1023     return getIEEE().bitwiseIsEqual(RHS.getIEEE());
1024   }
1025 
convertToHexString(char * DST,unsigned int HexDigits,bool UpperCase,roundingMode RM)1026   unsigned int convertToHexString(char *DST, unsigned int HexDigits,
1027                                   bool UpperCase, roundingMode RM) const {
1028     return getIEEE().convertToHexString(DST, HexDigits, UpperCase, RM);
1029   }
1030 
isZero()1031   bool isZero() const { return getCategory() == fcZero; }
isInfinity()1032   bool isInfinity() const { return getCategory() == fcInfinity; }
isNaN()1033   bool isNaN() const { return getCategory() == fcNaN; }
1034 
isNegative()1035   bool isNegative() const { return getIEEE().isNegative(); }
isDenormal()1036   bool isDenormal() const { return getIEEE().isDenormal(); }
isSignaling()1037   bool isSignaling() const { return getIEEE().isSignaling(); }
1038 
isNormal()1039   bool isNormal() const { return !isDenormal() && isFiniteNonZero(); }
isFinite()1040   bool isFinite() const { return !isNaN() && !isInfinity(); }
1041 
getCategory()1042   fltCategory getCategory() const { return getIEEE().getCategory(); }
getSemantics()1043   const fltSemantics &getSemantics() const { return *U.semantics; }
isNonZero()1044   bool isNonZero() const { return !isZero(); }
isFiniteNonZero()1045   bool isFiniteNonZero() const { return isFinite() && !isZero(); }
isPosZero()1046   bool isPosZero() const { return isZero() && !isNegative(); }
isNegZero()1047   bool isNegZero() const { return isZero() && isNegative(); }
isSmallest()1048   bool isSmallest() const { return getIEEE().isSmallest(); }
isLargest()1049   bool isLargest() const { return getIEEE().isLargest(); }
isInteger()1050   bool isInteger() const { return getIEEE().isInteger(); }
1051 
1052   APFloat &operator=(const APFloat &RHS) = default;
1053   APFloat &operator=(APFloat &&RHS) = default;
1054 
1055   void toString(SmallVectorImpl<char> &Str, unsigned FormatPrecision = 0,
1056                 unsigned FormatMaxPadding = 3) const {
1057     return getIEEE().toString(Str, FormatPrecision, FormatMaxPadding);
1058   }
1059 
1060   void print(raw_ostream &) const;
1061   void dump() const;
1062 
getExactInverse(APFloat * inv)1063   bool getExactInverse(APFloat *inv) const {
1064     return getIEEE().getExactInverse(inv ? &inv->getIEEE() : nullptr);
1065   }
1066 
1067   // This is for internal test only.
1068   // TODO: Remove it after the PPCDoubleDouble transition.
getSecondFloat()1069   const APFloat &getSecondFloat() const {
1070     assert(&getSemantics() == &PPCDoubleDouble());
1071     return U.Double.getSecond();
1072   }
1073 
1074   friend hash_code hash_value(const APFloat &Arg);
ilogb(const APFloat & Arg)1075   friend int ilogb(const APFloat &Arg) { return ilogb(Arg.getIEEE()); }
1076   friend APFloat scalbn(APFloat X, int Exp, roundingMode RM);
1077   friend APFloat frexp(const APFloat &X, int &Exp, roundingMode RM);
1078   friend IEEEFloat;
1079   friend DoubleAPFloat;
1080 };
1081 
1082 /// See friend declarations above.
1083 ///
1084 /// These additional declarations are required in order to compile LLVM with IBM
1085 /// xlC compiler.
1086 hash_code hash_value(const APFloat &Arg);
scalbn(APFloat X,int Exp,APFloat::roundingMode RM)1087 inline APFloat scalbn(APFloat X, int Exp, APFloat::roundingMode RM) {
1088   return APFloat(scalbn(X.getIEEE(), Exp, RM), X.getSemantics());
1089 }
1090 
1091 /// \brief Equivalent of C standard library function.
1092 ///
1093 /// While the C standard says Exp is an unspecified value for infinity and nan,
1094 /// this returns INT_MAX for infinities, and INT_MIN for NaNs.
frexp(const APFloat & X,int & Exp,APFloat::roundingMode RM)1095 inline APFloat frexp(const APFloat &X, int &Exp, APFloat::roundingMode RM) {
1096   return APFloat(frexp(X.getIEEE(), Exp, RM), X.getSemantics());
1097 }
1098 /// \brief Returns the absolute value of the argument.
abs(APFloat X)1099 inline APFloat abs(APFloat X) {
1100   X.clearSign();
1101   return X;
1102 }
1103 
1104 /// Implements IEEE minNum semantics. Returns the smaller of the 2 arguments if
1105 /// both are not NaN. If either argument is a NaN, returns the other argument.
1106 LLVM_READONLY
minnum(const APFloat & A,const APFloat & B)1107 inline APFloat minnum(const APFloat &A, const APFloat &B) {
1108   if (A.isNaN())
1109     return B;
1110   if (B.isNaN())
1111     return A;
1112   return (B.compare(A) == APFloat::cmpLessThan) ? B : A;
1113 }
1114 
1115 /// Implements IEEE maxNum semantics. Returns the larger of the 2 arguments if
1116 /// both are not NaN. If either argument is a NaN, returns the other argument.
1117 LLVM_READONLY
maxnum(const APFloat & A,const APFloat & B)1118 inline APFloat maxnum(const APFloat &A, const APFloat &B) {
1119   if (A.isNaN())
1120     return B;
1121   if (B.isNaN())
1122     return A;
1123   return (A.compare(B) == APFloat::cmpLessThan) ? B : A;
1124 }
1125 
1126 } // namespace llvm
1127 
1128 #endif // LLVM_ADT_APFLOAT_H
1129