LLVM 19.0.0git
APFloat.h
Go to the documentation of this file.
1//===- llvm/ADT/APFloat.h - Arbitrary Precision Floating Point ---*- C++ -*-==//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8///
9/// \file
10/// This file declares a class to represent arbitrary precision floating point
11/// values and provide a variety of arithmetic operations on them.
12///
13//===----------------------------------------------------------------------===//
14
15#ifndef LLVM_ADT_APFLOAT_H
16#define LLVM_ADT_APFLOAT_H
17
18#include "llvm/ADT/APInt.h"
19#include "llvm/ADT/ArrayRef.h"
23#include <memory>
24
25#define APFLOAT_DISPATCH_ON_SEMANTICS(METHOD_CALL) \
26 do { \
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"); \
32 } while (false)
33
34namespace llvm {
35
36struct fltSemantics;
37class APSInt;
38class StringRef;
39class APFloat;
40class raw_ostream;
41
42template <typename T> class Expected;
43template <typename T> class SmallVectorImpl;
44
45/// Enum that represents what fraction of the LSB truncated bits of an fp number
46/// represent.
47///
48/// This essentially combines the roles of guard and sticky bits.
49enum lostFraction { // Example of truncated bits:
50 lfExactlyZero, // 000000
51 lfLessThanHalf, // 0xxxxx x's not all zero
52 lfExactlyHalf, // 100000
53 lfMoreThanHalf // 1xxxxx x's not all zero
54};
55
56/// A self-contained host- and target-independent arbitrary-precision
57/// floating-point software implementation.
58///
59/// APFloat uses bignum integer arithmetic as provided by static functions in
60/// the APInt class. The library will work with bignum integers whose parts are
61/// any unsigned type at least 16 bits wide, but 64 bits is recommended.
62///
63/// Written for clarity rather than speed, in particular with a view to use in
64/// the front-end of a cross compiler so that target arithmetic can be correctly
65/// performed on the host. Performance should nonetheless be reasonable,
66/// particularly for its intended use. It may be useful as a base
67/// implementation for a run-time library during development of a faster
68/// target-specific one.
69///
70/// All 5 rounding modes in the IEEE-754R draft are handled correctly for all
71/// implemented operations. Currently implemented operations are add, subtract,
72/// multiply, divide, fused-multiply-add, conversion-to-float,
73/// conversion-to-integer and conversion-from-integer. New rounding modes
74/// (e.g. away from zero) can be added with three or four lines of code.
75///
76/// Four formats are built-in: IEEE single precision, double precision,
77/// quadruple precision, and x87 80-bit extended double (when operating with
78/// full extended precision). Adding a new format that obeys IEEE semantics
79/// only requires adding two lines of code: a declaration and definition of the
80/// format.
81///
82/// All operations return the status of that operation as an exception bit-mask,
83/// so multiple operations can be done consecutively with their results or-ed
84/// together. The returned status can be useful for compiler diagnostics; e.g.,
85/// inexact, underflow and overflow can be easily diagnosed on constant folding,
86/// and compiler optimizers can determine what exceptions would be raised by
87/// folding operations and optimize, or perhaps not optimize, accordingly.
88///
89/// At present, underflow tininess is detected after rounding; it should be
90/// straight forward to add support for the before-rounding case too.
91///
92/// The library reads hexadecimal floating point numbers as per C99, and
93/// correctly rounds if necessary according to the specified rounding mode.
94/// Syntax is required to have been validated by the caller. It also converts
95/// floating point numbers to hexadecimal text as per the C99 %a and %A
96/// conversions. The output precision (or alternatively the natural minimal
97/// precision) can be specified; if the requested precision is less than the
98/// natural precision the output is correctly rounded for the specified rounding
99/// mode.
100///
101/// It also reads decimal floating point numbers and correctly rounds according
102/// to the specified rounding mode.
103///
104/// Conversion to decimal text is not currently implemented.
105///
106/// Non-zero finite numbers are represented internally as a sign bit, a 16-bit
107/// signed exponent, and the significand as an array of integer parts. After
108/// normalization of a number of precision P the exponent is within the range of
109/// the format, and if the number is not denormal the P-th bit of the
110/// significand is set as an explicit integer bit. For denormals the most
111/// significant bit is shifted right so that the exponent is maintained at the
112/// format's minimum, so that the smallest denormal has just the least
113/// significant bit of the significand set. The sign of zeroes and infinities
114/// is significant; the exponent and significand of such numbers is not stored,
115/// but has a known implicit (deterministic) value: 0 for the significands, 0
116/// for zero exponent, all 1 bits for infinity exponent. For NaNs the sign and
117/// significand are deterministic, although not really meaningful, and preserved
118/// in non-conversion operations. The exponent is implicitly all 1 bits.
119///
120/// APFloat does not provide any exception handling beyond default exception
121/// handling. We represent Signaling NaNs via IEEE-754R 2008 6.2.1 should clause
122/// by encoding Signaling NaNs with the first bit of its trailing significand as
123/// 0.
124///
125/// TODO
126/// ====
127///
128/// Some features that may or may not be worth adding:
129///
130/// Binary to decimal conversion (hard).
131///
132/// Optional ability to detect underflow tininess before rounding.
133///
134/// New formats: x87 in single and double precision mode (IEEE apart from
135/// extended exponent range) (hard).
136///
137/// New operations: sqrt, IEEE remainder, C90 fmod, nexttoward.
138///
139
140// This is the common type definitions shared by APFloat and its internal
141// implementation classes. This struct should not define any non-static data
142// members.
145 static constexpr unsigned integerPartWidth = APInt::APINT_BITS_PER_WORD;
146
147 /// A signed type to represent a floating point numbers unbiased exponent.
148 typedef int32_t ExponentType;
149
150 /// \name Floating Point Semantics.
151 /// @{
159 // 8-bit floating point number following IEEE-754 conventions with bit
160 // layout S1E5M2 as described in https://arxiv.org/abs/2209.05433.
162 // 8-bit floating point number mostly following IEEE-754 conventions
163 // and bit layout S1E5M2 described in https://arxiv.org/abs/2206.02915,
164 // with expanded range and with no infinity or signed zero.
165 // NaN is represented as negative zero. (FN -> Finite, UZ -> unsigned zero).
166 // This format's exponent bias is 16, instead of the 15 (2 ** (5 - 1) - 1)
167 // that IEEE precedent would imply.
169 // 8-bit floating point number mostly following IEEE-754 conventions with
170 // bit layout S1E4M3 as described in https://arxiv.org/abs/2209.05433.
171 // Unlike IEEE-754 types, there are no infinity values, and NaN is
172 // represented with the exponent and mantissa bits set to all 1s.
174 // 8-bit floating point number mostly following IEEE-754 conventions
175 // and bit layout S1E4M3 described in https://arxiv.org/abs/2206.02915,
176 // with expanded range and with no infinity or signed zero.
177 // NaN is represented as negative zero. (FN -> Finite, UZ -> unsigned zero).
178 // This format's exponent bias is 8, instead of the 7 (2 ** (4 - 1) - 1)
179 // that IEEE precedent would imply.
181 // 8-bit floating point number mostly following IEEE-754 conventions
182 // and bit layout S1E4M3 with expanded range and with no infinity or signed
183 // zero.
184 // NaN is represented as negative zero. (FN -> Finite, UZ -> unsigned zero).
185 // This format's exponent bias is 11, instead of the 7 (2 ** (4 - 1) - 1)
186 // that IEEE precedent would imply.
188 // Floating point number that occupies 32 bits or less of storage, providing
189 // improved range compared to half (16-bit) formats, at (potentially)
190 // greater throughput than single precision (32-bit) formats.
192 // 6-bit floating point number with bit layout S1E3M2. Unlike IEEE-754
193 // types, there are no infinity or NaN values. The format is detailed in
194 // https://www.opencompute.org/documents/ocp-microscaling-formats-mx-v1-0-spec-final-pdf
196 // 6-bit floating point number with bit layout S1E2M3. Unlike IEEE-754
197 // types, there are no infinity or NaN values. The format is detailed in
198 // https://www.opencompute.org/documents/ocp-microscaling-formats-mx-v1-0-spec-final-pdf
200 // 4-bit floating point number with bit layout S1E2M1. Unlike IEEE-754
201 // types, there are no infinity or NaN values. The format is detailed in
202 // https://www.opencompute.org/documents/ocp-microscaling-formats-mx-v1-0-spec-final-pdf
204
207 };
208
211
212 static const fltSemantics &IEEEhalf() LLVM_READNONE;
228
229 /// A Pseudo fltsemantic used to construct APFloats that cannot conflict with
230 /// anything real.
232
233 /// @}
234
235 /// IEEE-754R 5.11: Floating Point Comparison Relations.
241 };
242
243 /// IEEE-754R 4.3: Rounding-direction attributes.
245
253
254 /// IEEE-754R 7: Default exception handling.
255 ///
256 /// opUnderflow or opOverflow are always returned or-ed with opInexact.
257 ///
258 /// APFloat models this behavior specified by IEEE-754:
259 /// "For operations producing results in floating-point format, the default
260 /// result of an operation that signals the invalid operation exception
261 /// shall be a quiet NaN."
262 enum opStatus {
263 opOK = 0x00,
268 opInexact = 0x10
269 };
270
271 /// Category of internally-represented number.
276 fcZero
277 };
278
279 /// Convenience enum used to construct an uninitialized APFloat.
282 };
283
284 /// Enumeration of \c ilogb error results.
286 IEK_Zero = INT_MIN + 1,
287 IEK_NaN = INT_MIN,
288 IEK_Inf = INT_MAX
289 };
290
291 static unsigned int semanticsPrecision(const fltSemantics &);
294 static unsigned int semanticsSizeInBits(const fltSemantics &);
295 static unsigned int semanticsIntSizeInBits(const fltSemantics&, bool);
296
297 // Returns true if any number described by \p Src can be precisely represented
298 // by a normal (not subnormal) value in \p Dst.
299 static bool isRepresentableAsNormalIn(const fltSemantics &Src,
300 const fltSemantics &Dst);
301
302 /// Returns the size of the floating point number (in bits) in the given
303 /// semantics.
304 static unsigned getSizeInBits(const fltSemantics &Sem);
305};
306
307namespace detail {
308
309class IEEEFloat final : public APFloatBase {
310public:
311 /// \name Constructors
312 /// @{
313
314 IEEEFloat(const fltSemantics &); // Default construct to +0.0
317 IEEEFloat(const fltSemantics &, const APInt &);
318 explicit IEEEFloat(double d);
319 explicit IEEEFloat(float f);
320 IEEEFloat(const IEEEFloat &);
322 ~IEEEFloat();
323
324 /// @}
325
326 /// Returns whether this instance allocated memory.
327 bool needsCleanup() const { return partCount() > 1; }
328
329 /// \name Convenience "constructors"
330 /// @{
331
332 /// @}
333
334 /// \name Arithmetic
335 /// @{
336
341 /// IEEE remainder.
343 /// C fmod, or llvm frem.
344 opStatus mod(const IEEEFloat &);
347 /// IEEE-754R 5.3.1: nextUp/nextDown.
348 opStatus next(bool nextDown);
349
350 /// @}
351
352 /// \name Sign operations.
353 /// @{
354
355 void changeSign();
356
357 /// @}
358
359 /// \name Conversions
360 /// @{
361
362 opStatus convert(const fltSemantics &, roundingMode, bool *);
364 roundingMode, bool *) const;
367 bool, roundingMode);
369 bool, roundingMode);
371 APInt bitcastToAPInt() const;
372 double convertToDouble() const;
373#ifdef HAS_IEE754_FLOAT128
374 float128 convertToQuad() const;
375#endif
376 float convertToFloat() const;
377
378 /// @}
379
380 /// The definition of equality is not straightforward for floating point, so
381 /// we won't use operator==. Use one of the following, or write whatever it
382 /// is you really mean.
383 bool operator==(const IEEEFloat &) const = delete;
384
385 /// IEEE comparison with another floating point number (NaNs compare
386 /// unordered, 0==-0).
387 cmpResult compare(const IEEEFloat &) const;
388
389 /// Bitwise comparison for equality (QNaNs compare equal, 0!=-0).
390 bool bitwiseIsEqual(const IEEEFloat &) const;
391
392 /// Write out a hexadecimal representation of the floating point value to DST,
393 /// which must be of sufficient size, in the C99 form [-]0xh.hhhhp[+-]d.
394 /// Return the number of characters written, excluding the terminating NUL.
395 unsigned int convertToHexString(char *dst, unsigned int hexDigits,
396 bool upperCase, roundingMode) const;
397
398 /// \name IEEE-754R 5.7.2 General operations.
399 /// @{
400
401 /// IEEE-754R isSignMinus: Returns true if and only if the current value is
402 /// negative.
403 ///
404 /// This applies to zeros and NaNs as well.
405 bool isNegative() const { return sign; }
406
407 /// IEEE-754R isNormal: Returns true if and only if the current value is normal.
408 ///
409 /// This implies that the current value of the float is not zero, subnormal,
410 /// infinite, or NaN following the definition of normality from IEEE-754R.
411 bool isNormal() const { return !isDenormal() && isFiniteNonZero(); }
412
413 /// Returns true if and only if the current value is zero, subnormal, or
414 /// normal.
415 ///
416 /// This means that the value is not infinite or NaN.
417 bool isFinite() const { return !isNaN() && !isInfinity(); }
418
419 /// Returns true if and only if the float is plus or minus zero.
420 bool isZero() const { return category == fcZero; }
421
422 /// IEEE-754R isSubnormal(): Returns true if and only if the float is a
423 /// denormal.
424 bool isDenormal() const;
425
426 /// IEEE-754R isInfinite(): Returns true if and only if the float is infinity.
427 bool isInfinity() const { return category == fcInfinity; }
428
429 /// Returns true if and only if the float is a quiet or signaling NaN.
430 bool isNaN() const { return category == fcNaN; }
431
432 /// Returns true if and only if the float is a signaling NaN.
433 bool isSignaling() const;
434
435 /// @}
436
437 /// \name Simple Queries
438 /// @{
439
440 fltCategory getCategory() const { return category; }
441 const fltSemantics &getSemantics() const { return *semantics; }
442 bool isNonZero() const { return category != fcZero; }
443 bool isFiniteNonZero() const { return isFinite() && !isZero(); }
444 bool isPosZero() const { return isZero() && !isNegative(); }
445 bool isNegZero() const { return isZero() && isNegative(); }
446
447 /// Returns true if and only if the number has the smallest possible non-zero
448 /// magnitude in the current semantics.
449 bool isSmallest() const;
450
451 /// Returns true if this is the smallest (by magnitude) normalized finite
452 /// number in the given semantics.
453 bool isSmallestNormalized() const;
454
455 /// Returns true if and only if the number has the largest possible finite
456 /// magnitude in the current semantics.
457 bool isLargest() const;
458
459 /// Returns true if and only if the number is an exact integer.
460 bool isInteger() const;
461
462 /// @}
463
464 IEEEFloat &operator=(const IEEEFloat &);
466
467 /// Overload to compute a hash code for an APFloat value.
468 ///
469 /// Note that the use of hash codes for floating point values is in general
470 /// frought with peril. Equality is hard to define for these values. For
471 /// example, should negative and positive zero hash to different codes? Are
472 /// they equal or not? This hash value implementation specifically
473 /// emphasizes producing different codes for different inputs in order to
474 /// be used in canonicalization and memoization. As such, equality is
475 /// bitwiseIsEqual, and 0 != -0.
476 friend hash_code hash_value(const IEEEFloat &Arg);
477
478 /// Converts this value into a decimal string.
479 ///
480 /// \param FormatPrecision The maximum number of digits of
481 /// precision to output. If there are fewer digits available,
482 /// zero padding will not be used unless the value is
483 /// integral and small enough to be expressed in
484 /// FormatPrecision digits. 0 means to use the natural
485 /// precision of the number.
486 /// \param FormatMaxPadding The maximum number of zeros to
487 /// consider inserting before falling back to scientific
488 /// notation. 0 means to always use scientific notation.
489 ///
490 /// \param TruncateZero Indicate whether to remove the trailing zero in
491 /// fraction part or not. Also setting this parameter to false forcing
492 /// producing of output more similar to default printf behavior.
493 /// Specifically the lower e is used as exponent delimiter and exponent
494 /// always contains no less than two digits.
495 ///
496 /// Number Precision MaxPadding Result
497 /// ------ --------- ---------- ------
498 /// 1.01E+4 5 2 10100
499 /// 1.01E+4 4 2 1.01E+4
500 /// 1.01E+4 5 1 1.01E+4
501 /// 1.01E-2 5 2 0.0101
502 /// 1.01E-2 4 2 0.0101
503 /// 1.01E-2 4 1 1.01E-2
504 void toString(SmallVectorImpl<char> &Str, unsigned FormatPrecision = 0,
505 unsigned FormatMaxPadding = 3, bool TruncateZero = true) const;
506
507 /// If this value has an exact multiplicative inverse, store it in inv and
508 /// return true.
509 bool getExactInverse(APFloat *inv) const;
510
511 // If this is an exact power of two, return the exponent while ignoring the
512 // sign bit. If it's not an exact power of 2, return INT_MIN
514 int getExactLog2Abs() const;
515
516 // If this is an exact power of two, return the exponent. If it's not an exact
517 // power of 2, return INT_MIN
519 int getExactLog2() const {
520 return isNegative() ? INT_MIN : getExactLog2Abs();
521 }
522
523 /// Returns the exponent of the internal representation of the APFloat.
524 ///
525 /// Because the radix of APFloat is 2, this is equivalent to floor(log2(x)).
526 /// For special APFloat values, this returns special error codes:
527 ///
528 /// NaN -> \c IEK_NaN
529 /// 0 -> \c IEK_Zero
530 /// Inf -> \c IEK_Inf
531 ///
532 friend int ilogb(const IEEEFloat &Arg);
533
534 /// Returns: X * 2^Exp for integral exponents.
536
537 friend IEEEFloat frexp(const IEEEFloat &X, int &Exp, roundingMode);
538
539 /// \name Special value setters.
540 /// @{
541
542 void makeLargest(bool Neg = false);
543 void makeSmallest(bool Neg = false);
544 void makeNaN(bool SNaN = false, bool Neg = false,
545 const APInt *fill = nullptr);
546 void makeInf(bool Neg = false);
547 void makeZero(bool Neg = false);
548 void makeQuiet();
549
550 /// Returns the smallest (by magnitude) normalized finite number in the given
551 /// semantics.
552 ///
553 /// \param Negative - True iff the number should be negative
554 void makeSmallestNormalized(bool Negative = false);
555
556 /// @}
557
559
560private:
561 /// \name Simple Queries
562 /// @{
563
564 integerPart *significandParts();
565 const integerPart *significandParts() const;
566 unsigned int partCount() const;
567
568 /// @}
569
570 /// \name Significand operations.
571 /// @{
572
573 integerPart addSignificand(const IEEEFloat &);
574 integerPart subtractSignificand(const IEEEFloat &, integerPart);
575 lostFraction addOrSubtractSignificand(const IEEEFloat &, bool subtract);
576 lostFraction multiplySignificand(const IEEEFloat &, IEEEFloat);
577 lostFraction multiplySignificand(const IEEEFloat&);
578 lostFraction divideSignificand(const IEEEFloat &);
579 void incrementSignificand();
580 void initialize(const fltSemantics *);
581 void shiftSignificandLeft(unsigned int);
582 lostFraction shiftSignificandRight(unsigned int);
583 unsigned int significandLSB() const;
584 unsigned int significandMSB() const;
585 void zeroSignificand();
586 /// Return true if the significand excluding the integral bit is all ones.
587 bool isSignificandAllOnes() const;
588 bool isSignificandAllOnesExceptLSB() const;
589 /// Return true if the significand excluding the integral bit is all zeros.
590 bool isSignificandAllZeros() const;
591 bool isSignificandAllZerosExceptMSB() const;
592
593 /// @}
594
595 /// \name Arithmetic on special values.
596 /// @{
597
598 opStatus addOrSubtractSpecials(const IEEEFloat &, bool subtract);
599 opStatus divideSpecials(const IEEEFloat &);
600 opStatus multiplySpecials(const IEEEFloat &);
601 opStatus modSpecials(const IEEEFloat &);
602 opStatus remainderSpecials(const IEEEFloat&);
603
604 /// @}
605
606 /// \name Miscellany
607 /// @{
608
609 bool convertFromStringSpecials(StringRef str);
611 opStatus addOrSubtract(const IEEEFloat &, roundingMode, bool subtract);
612 opStatus handleOverflow(roundingMode);
613 bool roundAwayFromZero(roundingMode, lostFraction, unsigned int) const;
614 opStatus convertToSignExtendedInteger(MutableArrayRef<integerPart>,
615 unsigned int, bool, roundingMode,
616 bool *) const;
617 opStatus convertFromUnsignedParts(const integerPart *, unsigned int,
619 Expected<opStatus> convertFromHexadecimalString(StringRef, roundingMode);
620 Expected<opStatus> convertFromDecimalString(StringRef, roundingMode);
621 char *convertNormalToHexString(char *, unsigned int, bool,
622 roundingMode) const;
623 opStatus roundSignificandWithExponent(const integerPart *, unsigned int, int,
625 ExponentType exponentNaN() const;
626 ExponentType exponentInf() const;
627 ExponentType exponentZero() const;
628
629 /// @}
630
631 template <const fltSemantics &S> APInt convertIEEEFloatToAPInt() const;
632 APInt convertHalfAPFloatToAPInt() const;
633 APInt convertBFloatAPFloatToAPInt() const;
634 APInt convertFloatAPFloatToAPInt() const;
635 APInt convertDoubleAPFloatToAPInt() const;
636 APInt convertQuadrupleAPFloatToAPInt() const;
637 APInt convertF80LongDoubleAPFloatToAPInt() const;
638 APInt convertPPCDoubleDoubleAPFloatToAPInt() const;
639 APInt convertFloat8E5M2APFloatToAPInt() const;
640 APInt convertFloat8E5M2FNUZAPFloatToAPInt() const;
641 APInt convertFloat8E4M3FNAPFloatToAPInt() const;
642 APInt convertFloat8E4M3FNUZAPFloatToAPInt() const;
643 APInt convertFloat8E4M3B11FNUZAPFloatToAPInt() const;
644 APInt convertFloatTF32APFloatToAPInt() const;
645 APInt convertFloat6E3M2FNAPFloatToAPInt() const;
646 APInt convertFloat6E2M3FNAPFloatToAPInt() const;
647 APInt convertFloat4E2M1FNAPFloatToAPInt() const;
648 void initFromAPInt(const fltSemantics *Sem, const APInt &api);
649 template <const fltSemantics &S> void initFromIEEEAPInt(const APInt &api);
650 void initFromHalfAPInt(const APInt &api);
651 void initFromBFloatAPInt(const APInt &api);
652 void initFromFloatAPInt(const APInt &api);
653 void initFromDoubleAPInt(const APInt &api);
654 void initFromQuadrupleAPInt(const APInt &api);
655 void initFromF80LongDoubleAPInt(const APInt &api);
656 void initFromPPCDoubleDoubleAPInt(const APInt &api);
657 void initFromFloat8E5M2APInt(const APInt &api);
658 void initFromFloat8E5M2FNUZAPInt(const APInt &api);
659 void initFromFloat8E4M3FNAPInt(const APInt &api);
660 void initFromFloat8E4M3FNUZAPInt(const APInt &api);
661 void initFromFloat8E4M3B11FNUZAPInt(const APInt &api);
662 void initFromFloatTF32APInt(const APInt &api);
663 void initFromFloat6E3M2FNAPInt(const APInt &api);
664 void initFromFloat6E2M3FNAPInt(const APInt &api);
665 void initFromFloat4E2M1FNAPInt(const APInt &api);
666
667 void assign(const IEEEFloat &);
668 void copySignificand(const IEEEFloat &);
669 void freeSignificand();
670
671 /// Note: this must be the first data member.
672 /// The semantics that this value obeys.
673 const fltSemantics *semantics;
674
675 /// A binary fraction with an explicit integer bit.
676 ///
677 /// The significand must be at least one bit wider than the target precision.
678 union Significand {
679 integerPart part;
680 integerPart *parts;
681 } significand;
682
683 /// The signed unbiased exponent of the value.
684 ExponentType exponent;
685
686 /// What kind of floating point number this is.
687 ///
688 /// Only 2 bits are required, but VisualStudio incorrectly sign extends it.
689 /// Using the extra bit keeps it from failing under VisualStudio.
690 fltCategory category : 3;
691
692 /// Sign bit of the number.
693 unsigned int sign : 1;
694};
695
696hash_code hash_value(const IEEEFloat &Arg);
697int ilogb(const IEEEFloat &Arg);
698IEEEFloat scalbn(IEEEFloat X, int Exp, IEEEFloat::roundingMode);
699IEEEFloat frexp(const IEEEFloat &Val, int &Exp, IEEEFloat::roundingMode RM);
700
701// This mode implements more precise float in terms of two APFloats.
702// The interface and layout is designed for arbitrary underlying semantics,
703// though currently only PPCDoubleDouble semantics are supported, whose
704// corresponding underlying semantics are IEEEdouble.
705class DoubleAPFloat final : public APFloatBase {
706 // Note: this must be the first data member.
707 const fltSemantics *Semantics;
708 std::unique_ptr<APFloat[]> Floats;
709
710 opStatus addImpl(const APFloat &a, const APFloat &aa, const APFloat &c,
711 const APFloat &cc, roundingMode RM);
712
713 opStatus addWithSpecial(const DoubleAPFloat &LHS, const DoubleAPFloat &RHS,
714 DoubleAPFloat &Out, roundingMode RM);
715
716public:
717 DoubleAPFloat(const fltSemantics &S);
720 DoubleAPFloat(const fltSemantics &S, const APInt &I);
721 DoubleAPFloat(const fltSemantics &S, APFloat &&First, APFloat &&Second);
724
727
728 bool needsCleanup() const { return Floats != nullptr; }
729
730 inline APFloat &getFirst();
731 inline const APFloat &getFirst() const;
732 inline APFloat &getSecond();
733 inline const APFloat &getSecond() const;
734
741 opStatus fusedMultiplyAdd(const DoubleAPFloat &Multiplicand,
742 const DoubleAPFloat &Addend, roundingMode RM);
744 void changeSign();
746
747 fltCategory getCategory() const;
748 bool isNegative() const;
749
750 void makeInf(bool Neg);
751 void makeZero(bool Neg);
752 void makeLargest(bool Neg);
753 void makeSmallest(bool Neg);
754 void makeSmallestNormalized(bool Neg);
755 void makeNaN(bool SNaN, bool Neg, const APInt *fill);
756
757 cmpResult compare(const DoubleAPFloat &RHS) const;
758 bool bitwiseIsEqual(const DoubleAPFloat &RHS) const;
759 APInt bitcastToAPInt() const;
761 opStatus next(bool nextDown);
762
764 unsigned int Width, bool IsSigned, roundingMode RM,
765 bool *IsExact) const;
766 opStatus convertFromAPInt(const APInt &Input, bool IsSigned, roundingMode RM);
768 unsigned int InputSize, bool IsSigned,
769 roundingMode RM);
771 unsigned int InputSize, bool IsSigned,
772 roundingMode RM);
773 unsigned int convertToHexString(char *DST, unsigned int HexDigits,
774 bool UpperCase, roundingMode RM) const;
775
776 bool isDenormal() const;
777 bool isSmallest() const;
778 bool isSmallestNormalized() const;
779 bool isLargest() const;
780 bool isInteger() const;
781
782 void toString(SmallVectorImpl<char> &Str, unsigned FormatPrecision,
783 unsigned FormatMaxPadding, bool TruncateZero = true) const;
784
785 bool getExactInverse(APFloat *inv) const;
786
788 int getExactLog2() const;
790 int getExactLog2Abs() const;
791
793 friend DoubleAPFloat frexp(const DoubleAPFloat &X, int &Exp, roundingMode);
794 friend hash_code hash_value(const DoubleAPFloat &Arg);
795};
796
800
801} // End detail namespace
802
803// This is a interface class that is currently forwarding functionalities from
804// detail::IEEEFloat.
805class APFloat : public APFloatBase {
808
809 static_assert(std::is_standard_layout<IEEEFloat>::value);
810
811 union Storage {
812 const fltSemantics *semantics;
814 DoubleAPFloat Double;
815
816 explicit Storage(IEEEFloat F, const fltSemantics &S);
817 explicit Storage(DoubleAPFloat F, const fltSemantics &S)
818 : Double(std::move(F)) {
819 assert(&S == &PPCDoubleDouble());
820 }
821
822 template <typename... ArgTypes>
823 Storage(const fltSemantics &Semantics, ArgTypes &&... Args) {
824 if (usesLayout<IEEEFloat>(Semantics)) {
825 new (&IEEE) IEEEFloat(Semantics, std::forward<ArgTypes>(Args)...);
826 return;
827 }
828 if (usesLayout<DoubleAPFloat>(Semantics)) {
829 new (&Double) DoubleAPFloat(Semantics, std::forward<ArgTypes>(Args)...);
830 return;
831 }
832 llvm_unreachable("Unexpected semantics");
833 }
834
835 ~Storage() {
836 if (usesLayout<IEEEFloat>(*semantics)) {
837 IEEE.~IEEEFloat();
838 return;
839 }
840 if (usesLayout<DoubleAPFloat>(*semantics)) {
841 Double.~DoubleAPFloat();
842 return;
843 }
844 llvm_unreachable("Unexpected semantics");
845 }
846
847 Storage(const Storage &RHS) {
848 if (usesLayout<IEEEFloat>(*RHS.semantics)) {
849 new (this) IEEEFloat(RHS.IEEE);
850 return;
851 }
852 if (usesLayout<DoubleAPFloat>(*RHS.semantics)) {
853 new (this) DoubleAPFloat(RHS.Double);
854 return;
855 }
856 llvm_unreachable("Unexpected semantics");
857 }
858
859 Storage(Storage &&RHS) {
860 if (usesLayout<IEEEFloat>(*RHS.semantics)) {
861 new (this) IEEEFloat(std::move(RHS.IEEE));
862 return;
863 }
864 if (usesLayout<DoubleAPFloat>(*RHS.semantics)) {
865 new (this) DoubleAPFloat(std::move(RHS.Double));
866 return;
867 }
868 llvm_unreachable("Unexpected semantics");
869 }
870
871 Storage &operator=(const Storage &RHS) {
872 if (usesLayout<IEEEFloat>(*semantics) &&
873 usesLayout<IEEEFloat>(*RHS.semantics)) {
874 IEEE = RHS.IEEE;
875 } else if (usesLayout<DoubleAPFloat>(*semantics) &&
876 usesLayout<DoubleAPFloat>(*RHS.semantics)) {
877 Double = RHS.Double;
878 } else if (this != &RHS) {
879 this->~Storage();
880 new (this) Storage(RHS);
881 }
882 return *this;
883 }
884
885 Storage &operator=(Storage &&RHS) {
886 if (usesLayout<IEEEFloat>(*semantics) &&
887 usesLayout<IEEEFloat>(*RHS.semantics)) {
888 IEEE = std::move(RHS.IEEE);
889 } else if (usesLayout<DoubleAPFloat>(*semantics) &&
890 usesLayout<DoubleAPFloat>(*RHS.semantics)) {
891 Double = std::move(RHS.Double);
892 } else if (this != &RHS) {
893 this->~Storage();
894 new (this) Storage(std::move(RHS));
895 }
896 return *this;
897 }
898 } U;
899
900 template <typename T> static bool usesLayout(const fltSemantics &Semantics) {
901 static_assert(std::is_same<T, IEEEFloat>::value ||
902 std::is_same<T, DoubleAPFloat>::value);
903 if (std::is_same<T, DoubleAPFloat>::value) {
904 return &Semantics == &PPCDoubleDouble();
905 }
906 return &Semantics != &PPCDoubleDouble();
907 }
908
909 IEEEFloat &getIEEE() {
910 if (usesLayout<IEEEFloat>(*U.semantics))
911 return U.IEEE;
912 if (usesLayout<DoubleAPFloat>(*U.semantics))
913 return U.Double.getFirst().U.IEEE;
914 llvm_unreachable("Unexpected semantics");
915 }
916
917 const IEEEFloat &getIEEE() const {
918 if (usesLayout<IEEEFloat>(*U.semantics))
919 return U.IEEE;
920 if (usesLayout<DoubleAPFloat>(*U.semantics))
921 return U.Double.getFirst().U.IEEE;
922 llvm_unreachable("Unexpected semantics");
923 }
924
925 void makeZero(bool Neg) { APFLOAT_DISPATCH_ON_SEMANTICS(makeZero(Neg)); }
926
927 void makeInf(bool Neg) { APFLOAT_DISPATCH_ON_SEMANTICS(makeInf(Neg)); }
928
929 void makeNaN(bool SNaN, bool Neg, const APInt *fill) {
930 APFLOAT_DISPATCH_ON_SEMANTICS(makeNaN(SNaN, Neg, fill));
931 }
932
933 void makeLargest(bool Neg) {
934 APFLOAT_DISPATCH_ON_SEMANTICS(makeLargest(Neg));
935 }
936
937 void makeSmallest(bool Neg) {
938 APFLOAT_DISPATCH_ON_SEMANTICS(makeSmallest(Neg));
939 }
940
941 void makeSmallestNormalized(bool Neg) {
942 APFLOAT_DISPATCH_ON_SEMANTICS(makeSmallestNormalized(Neg));
943 }
944
945 explicit APFloat(IEEEFloat F, const fltSemantics &S) : U(std::move(F), S) {}
946 explicit APFloat(DoubleAPFloat F, const fltSemantics &S)
947 : U(std::move(F), S) {}
948
949 cmpResult compareAbsoluteValue(const APFloat &RHS) const {
950 assert(&getSemantics() == &RHS.getSemantics() &&
951 "Should only compare APFloats with the same semantics");
952 if (usesLayout<IEEEFloat>(getSemantics()))
953 return U.IEEE.compareAbsoluteValue(RHS.U.IEEE);
954 if (usesLayout<DoubleAPFloat>(getSemantics()))
955 return U.Double.compareAbsoluteValue(RHS.U.Double);
956 llvm_unreachable("Unexpected semantics");
957 }
958
959public:
963 template <typename T,
964 typename = std::enable_if_t<std::is_floating_point<T>::value>>
965 APFloat(const fltSemantics &Semantics, T V) = delete;
966 // TODO: Remove this constructor. This isn't faster than the first one.
968 : U(Semantics, uninitialized) {}
969 APFloat(const fltSemantics &Semantics, const APInt &I) : U(Semantics, I) {}
970 explicit APFloat(double d) : U(IEEEFloat(d), IEEEdouble()) {}
971 explicit APFloat(float f) : U(IEEEFloat(f), IEEEsingle()) {}
972 APFloat(const APFloat &RHS) = default;
973 APFloat(APFloat &&RHS) = default;
974
975 ~APFloat() = default;
976
978
979 /// Factory for Positive and Negative Zero.
980 ///
981 /// \param Negative True iff the number should be negative.
982 static APFloat getZero(const fltSemantics &Sem, bool Negative = false) {
983 APFloat Val(Sem, uninitialized);
984 Val.makeZero(Negative);
985 return Val;
986 }
987
988 /// Factory for Positive and Negative One.
989 ///
990 /// \param Negative True iff the number should be negative.
991 static APFloat getOne(const fltSemantics &Sem, bool Negative = false) {
992 return APFloat(Sem, Negative ? -1 : 1);
993 }
994
995 /// Factory for Positive and Negative Infinity.
996 ///
997 /// \param Negative True iff the number should be negative.
998 static APFloat getInf(const fltSemantics &Sem, bool Negative = false) {
999 APFloat Val(Sem, uninitialized);
1000 Val.makeInf(Negative);
1001 return Val;
1002 }
1003
1004 /// Factory for NaN values.
1005 ///
1006 /// \param Negative - True iff the NaN generated should be negative.
1007 /// \param payload - The unspecified fill bits for creating the NaN, 0 by
1008 /// default. The value is truncated as necessary.
1009 static APFloat getNaN(const fltSemantics &Sem, bool Negative = false,
1010 uint64_t payload = 0) {
1011 if (payload) {
1012 APInt intPayload(64, payload);
1013 return getQNaN(Sem, Negative, &intPayload);
1014 } else {
1015 return getQNaN(Sem, Negative, nullptr);
1016 }
1017 }
1018
1019 /// Factory for QNaN values.
1020 static APFloat getQNaN(const fltSemantics &Sem, bool Negative = false,
1021 const APInt *payload = nullptr) {
1022 APFloat Val(Sem, uninitialized);
1023 Val.makeNaN(false, Negative, payload);
1024 return Val;
1025 }
1026
1027 /// Factory for SNaN values.
1028 static APFloat getSNaN(const fltSemantics &Sem, bool Negative = false,
1029 const APInt *payload = nullptr) {
1030 APFloat Val(Sem, uninitialized);
1031 Val.makeNaN(true, Negative, payload);
1032 return Val;
1033 }
1034
1035 /// Returns the largest finite number in the given semantics.
1036 ///
1037 /// \param Negative - True iff the number should be negative
1038 static APFloat getLargest(const fltSemantics &Sem, bool Negative = false) {
1039 APFloat Val(Sem, uninitialized);
1040 Val.makeLargest(Negative);
1041 return Val;
1042 }
1043
1044 /// Returns the smallest (by magnitude) finite number in the given semantics.
1045 /// Might be denormalized, which implies a relative loss of precision.
1046 ///
1047 /// \param Negative - True iff the number should be negative
1048 static APFloat getSmallest(const fltSemantics &Sem, bool Negative = false) {
1049 APFloat Val(Sem, uninitialized);
1050 Val.makeSmallest(Negative);
1051 return Val;
1052 }
1053
1054 /// Returns the smallest (by magnitude) normalized finite number in the given
1055 /// semantics.
1056 ///
1057 /// \param Negative - True iff the number should be negative
1059 bool Negative = false) {
1060 APFloat Val(Sem, uninitialized);
1061 Val.makeSmallestNormalized(Negative);
1062 return Val;
1063 }
1064
1065 /// Returns a float which is bitcasted from an all one value int.
1066 ///
1067 /// \param Semantics - type float semantics
1069
1070 static bool hasNanOrInf(const fltSemantics &Sem) {
1071 switch (SemanticsToEnum(Sem)) {
1072 default:
1073 return true;
1074 // Below Semantics do not support {NaN or Inf}
1078 return false;
1079 }
1080 }
1081
1082 /// Used to insert APFloat objects, or objects that contain APFloat objects,
1083 /// into FoldingSets.
1084 void Profile(FoldingSetNodeID &NID) const;
1085
1087 assert(&getSemantics() == &RHS.getSemantics() &&
1088 "Should only call on two APFloats with the same semantics");
1089 if (usesLayout<IEEEFloat>(getSemantics()))
1090 return U.IEEE.add(RHS.U.IEEE, RM);
1091 if (usesLayout<DoubleAPFloat>(getSemantics()))
1092 return U.Double.add(RHS.U.Double, RM);
1093 llvm_unreachable("Unexpected semantics");
1094 }
1096 assert(&getSemantics() == &RHS.getSemantics() &&
1097 "Should only call on two APFloats with the same semantics");
1098 if (usesLayout<IEEEFloat>(getSemantics()))
1099 return U.IEEE.subtract(RHS.U.IEEE, RM);
1100 if (usesLayout<DoubleAPFloat>(getSemantics()))
1101 return U.Double.subtract(RHS.U.Double, RM);
1102 llvm_unreachable("Unexpected semantics");
1103 }
1105 assert(&getSemantics() == &RHS.getSemantics() &&
1106 "Should only call on two APFloats with the same semantics");
1107 if (usesLayout<IEEEFloat>(getSemantics()))
1108 return U.IEEE.multiply(RHS.U.IEEE, RM);
1109 if (usesLayout<DoubleAPFloat>(getSemantics()))
1110 return U.Double.multiply(RHS.U.Double, RM);
1111 llvm_unreachable("Unexpected semantics");
1112 }
1114 assert(&getSemantics() == &RHS.getSemantics() &&
1115 "Should only call on two APFloats with the same semantics");
1116 if (usesLayout<IEEEFloat>(getSemantics()))
1117 return U.IEEE.divide(RHS.U.IEEE, RM);
1118 if (usesLayout<DoubleAPFloat>(getSemantics()))
1119 return U.Double.divide(RHS.U.Double, RM);
1120 llvm_unreachable("Unexpected semantics");
1121 }
1123 assert(&getSemantics() == &RHS.getSemantics() &&
1124 "Should only call on two APFloats with the same semantics");
1125 if (usesLayout<IEEEFloat>(getSemantics()))
1126 return U.IEEE.remainder(RHS.U.IEEE);
1127 if (usesLayout<DoubleAPFloat>(getSemantics()))
1128 return U.Double.remainder(RHS.U.Double);
1129 llvm_unreachable("Unexpected semantics");
1130 }
1132 assert(&getSemantics() == &RHS.getSemantics() &&
1133 "Should only call on two APFloats with the same semantics");
1134 if (usesLayout<IEEEFloat>(getSemantics()))
1135 return U.IEEE.mod(RHS.U.IEEE);
1136 if (usesLayout<DoubleAPFloat>(getSemantics()))
1137 return U.Double.mod(RHS.U.Double);
1138 llvm_unreachable("Unexpected semantics");
1139 }
1140 opStatus fusedMultiplyAdd(const APFloat &Multiplicand, const APFloat &Addend,
1141 roundingMode RM) {
1142 assert(&getSemantics() == &Multiplicand.getSemantics() &&
1143 "Should only call on APFloats with the same semantics");
1144 assert(&getSemantics() == &Addend.getSemantics() &&
1145 "Should only call on APFloats with the same semantics");
1146 if (usesLayout<IEEEFloat>(getSemantics()))
1147 return U.IEEE.fusedMultiplyAdd(Multiplicand.U.IEEE, Addend.U.IEEE, RM);
1148 if (usesLayout<DoubleAPFloat>(getSemantics()))
1149 return U.Double.fusedMultiplyAdd(Multiplicand.U.Double, Addend.U.Double,
1150 RM);
1151 llvm_unreachable("Unexpected semantics");
1152 }
1155 }
1156
1157 // TODO: bool parameters are not readable and a source of bugs.
1158 // Do something.
1159 opStatus next(bool nextDown) {
1161 }
1162
1163 /// Negate an APFloat.
1165 APFloat Result(*this);
1166 Result.changeSign();
1167 return Result;
1168 }
1169
1170 /// Add two APFloats, rounding ties to the nearest even.
1171 /// No error checking.
1173 APFloat Result(*this);
1174 (void)Result.add(RHS, rmNearestTiesToEven);
1175 return Result;
1176 }
1177
1178 /// Subtract two APFloats, rounding ties to the nearest even.
1179 /// No error checking.
1181 APFloat Result(*this);
1182 (void)Result.subtract(RHS, rmNearestTiesToEven);
1183 return Result;
1184 }
1185
1186 /// Multiply two APFloats, rounding ties to the nearest even.
1187 /// No error checking.
1189 APFloat Result(*this);
1190 (void)Result.multiply(RHS, rmNearestTiesToEven);
1191 return Result;
1192 }
1193
1194 /// Divide the first APFloat by the second, rounding ties to the nearest even.
1195 /// No error checking.
1197 APFloat Result(*this);
1198 (void)Result.divide(RHS, rmNearestTiesToEven);
1199 return Result;
1200 }
1201
1203 void clearSign() {
1204 if (isNegative())
1205 changeSign();
1206 }
1207 void copySign(const APFloat &RHS) {
1208 if (isNegative() != RHS.isNegative())
1209 changeSign();
1210 }
1211
1212 /// A static helper to produce a copy of an APFloat value with its sign
1213 /// copied from some other APFloat.
1214 static APFloat copySign(APFloat Value, const APFloat &Sign) {
1215 Value.copySign(Sign);
1216 return Value;
1217 }
1218
1219 /// Assuming this is an IEEE-754 NaN value, quiet its signaling bit.
1220 /// This preserves the sign and payload bits.
1222 APFloat Result(*this);
1223 Result.getIEEE().makeQuiet();
1224 return Result;
1225 }
1226
1227 opStatus convert(const fltSemantics &ToSemantics, roundingMode RM,
1228 bool *losesInfo);
1230 unsigned int Width, bool IsSigned, roundingMode RM,
1231 bool *IsExact) const {
1233 convertToInteger(Input, Width, IsSigned, RM, IsExact));
1234 }
1236 bool *IsExact) const;
1237 opStatus convertFromAPInt(const APInt &Input, bool IsSigned,
1238 roundingMode RM) {
1239 APFLOAT_DISPATCH_ON_SEMANTICS(convertFromAPInt(Input, IsSigned, RM));
1240 }
1242 unsigned int InputSize, bool IsSigned,
1243 roundingMode RM) {
1245 convertFromSignExtendedInteger(Input, InputSize, IsSigned, RM));
1246 }
1248 unsigned int InputSize, bool IsSigned,
1249 roundingMode RM) {
1251 convertFromZeroExtendedInteger(Input, InputSize, IsSigned, RM));
1252 }
1256 }
1257
1258 /// Converts this APFloat to host double value.
1259 ///
1260 /// \pre The APFloat must be built using semantics, that can be represented by
1261 /// the host double type without loss of precision. It can be IEEEdouble and
1262 /// shorter semantics, like IEEEsingle and others.
1263 double convertToDouble() const;
1264
1265 /// Converts this APFloat to host float value.
1266 ///
1267 /// \pre The APFloat must be built using semantics, that can be represented by
1268 /// the host float type without loss of precision. It can be IEEEquad and
1269 /// shorter semantics, like IEEEdouble and others.
1270#ifdef HAS_IEE754_FLOAT128
1271 float128 convertToQuad() const;
1272#endif
1273
1274 /// Converts this APFloat to host float value.
1275 ///
1276 /// \pre The APFloat must be built using semantics, that can be represented by
1277 /// the host float type without loss of precision. It can be IEEEsingle and
1278 /// shorter semantics, like IEEEhalf.
1279 float convertToFloat() const;
1280
1281 bool operator==(const APFloat &RHS) const { return compare(RHS) == cmpEqual; }
1282
1283 bool operator!=(const APFloat &RHS) const { return compare(RHS) != cmpEqual; }
1284
1285 bool operator<(const APFloat &RHS) const {
1286 return compare(RHS) == cmpLessThan;
1287 }
1288
1289 bool operator>(const APFloat &RHS) const {
1290 return compare(RHS) == cmpGreaterThan;
1291 }
1292
1293 bool operator<=(const APFloat &RHS) const {
1294 cmpResult Res = compare(RHS);
1295 return Res == cmpLessThan || Res == cmpEqual;
1296 }
1297
1298 bool operator>=(const APFloat &RHS) const {
1299 cmpResult Res = compare(RHS);
1300 return Res == cmpGreaterThan || Res == cmpEqual;
1301 }
1302
1304 assert(&getSemantics() == &RHS.getSemantics() &&
1305 "Should only compare APFloats with the same semantics");
1306 if (usesLayout<IEEEFloat>(getSemantics()))
1307 return U.IEEE.compare(RHS.U.IEEE);
1308 if (usesLayout<DoubleAPFloat>(getSemantics()))
1309 return U.Double.compare(RHS.U.Double);
1310 llvm_unreachable("Unexpected semantics");
1311 }
1312
1313 bool bitwiseIsEqual(const APFloat &RHS) const {
1314 if (&getSemantics() != &RHS.getSemantics())
1315 return false;
1316 if (usesLayout<IEEEFloat>(getSemantics()))
1317 return U.IEEE.bitwiseIsEqual(RHS.U.IEEE);
1318 if (usesLayout<DoubleAPFloat>(getSemantics()))
1319 return U.Double.bitwiseIsEqual(RHS.U.Double);
1320 llvm_unreachable("Unexpected semantics");
1321 }
1322
1323 /// We don't rely on operator== working on double values, as
1324 /// it returns true for things that are clearly not equal, like -0.0 and 0.0.
1325 /// As such, this method can be used to do an exact bit-for-bit comparison of
1326 /// two floating point values.
1327 ///
1328 /// We leave the version with the double argument here because it's just so
1329 /// convenient to write "2.0" and the like. Without this function we'd
1330 /// have to duplicate its logic everywhere it's called.
1331 bool isExactlyValue(double V) const {
1332 bool ignored;
1333 APFloat Tmp(V);
1335 return bitwiseIsEqual(Tmp);
1336 }
1337
1338 unsigned int convertToHexString(char *DST, unsigned int HexDigits,
1339 bool UpperCase, roundingMode RM) const {
1341 convertToHexString(DST, HexDigits, UpperCase, RM));
1342 }
1343
1344 bool isZero() const { return getCategory() == fcZero; }
1345 bool isInfinity() const { return getCategory() == fcInfinity; }
1346 bool isNaN() const { return getCategory() == fcNaN; }
1347
1348 bool isNegative() const { return getIEEE().isNegative(); }
1350 bool isSignaling() const { return getIEEE().isSignaling(); }
1351
1352 bool isNormal() const { return !isDenormal() && isFiniteNonZero(); }
1353 bool isFinite() const { return !isNaN() && !isInfinity(); }
1354
1355 fltCategory getCategory() const { return getIEEE().getCategory(); }
1356 const fltSemantics &getSemantics() const { return *U.semantics; }
1357 bool isNonZero() const { return !isZero(); }
1358 bool isFiniteNonZero() const { return isFinite() && !isZero(); }
1359 bool isPosZero() const { return isZero() && !isNegative(); }
1360 bool isNegZero() const { return isZero() && isNegative(); }
1361 bool isPosInfinity() const { return isInfinity() && !isNegative(); }
1362 bool isNegInfinity() const { return isInfinity() && isNegative(); }
1366 bool isIEEE() const { return usesLayout<IEEEFloat>(getSemantics()); }
1367
1370 }
1371
1372 /// Return the FPClassTest which will return true for the value.
1373 FPClassTest classify() const;
1374
1375 APFloat &operator=(const APFloat &RHS) = default;
1377
1378 void toString(SmallVectorImpl<char> &Str, unsigned FormatPrecision = 0,
1379 unsigned FormatMaxPadding = 3, bool TruncateZero = true) const {
1381 toString(Str, FormatPrecision, FormatMaxPadding, TruncateZero));
1382 }
1383
1384 void print(raw_ostream &) const;
1385 void dump() const;
1386
1387 bool getExactInverse(APFloat *inv) const {
1389 }
1390
1392 int getExactLog2Abs() const {
1394 }
1395
1397 int getExactLog2() const {
1399 }
1400
1401 friend hash_code hash_value(const APFloat &Arg);
1402 friend int ilogb(const APFloat &Arg) { return ilogb(Arg.getIEEE()); }
1403 friend APFloat scalbn(APFloat X, int Exp, roundingMode RM);
1404 friend APFloat frexp(const APFloat &X, int &Exp, roundingMode RM);
1407};
1408
1409/// See friend declarations above.
1410///
1411/// These additional declarations are required in order to compile LLVM with IBM
1412/// xlC compiler.
1413hash_code hash_value(const APFloat &Arg);
1415 if (APFloat::usesLayout<detail::IEEEFloat>(X.getSemantics()))
1416 return APFloat(scalbn(X.U.IEEE, Exp, RM), X.getSemantics());
1417 if (APFloat::usesLayout<detail::DoubleAPFloat>(X.getSemantics()))
1418 return APFloat(scalbn(X.U.Double, Exp, RM), X.getSemantics());
1419 llvm_unreachable("Unexpected semantics");
1420}
1421
1422/// Equivalent of C standard library function.
1423///
1424/// While the C standard says Exp is an unspecified value for infinity and nan,
1425/// this returns INT_MAX for infinities, and INT_MIN for NaNs.
1426inline APFloat frexp(const APFloat &X, int &Exp, APFloat::roundingMode RM) {
1427 if (APFloat::usesLayout<detail::IEEEFloat>(X.getSemantics()))
1428 return APFloat(frexp(X.U.IEEE, Exp, RM), X.getSemantics());
1429 if (APFloat::usesLayout<detail::DoubleAPFloat>(X.getSemantics()))
1430 return APFloat(frexp(X.U.Double, Exp, RM), X.getSemantics());
1431 llvm_unreachable("Unexpected semantics");
1432}
1433/// Returns the absolute value of the argument.
1435 X.clearSign();
1436 return X;
1437}
1438
1439/// Returns the negated value of the argument.
1441 X.changeSign();
1442 return X;
1443}
1444
1445/// Implements IEEE-754 2019 minimumNumber semantics. Returns the smaller of the
1446/// 2 arguments if both are not NaN. If either argument is a NaN, returns the
1447/// other argument. -0 is treated as ordered less than +0.
1449inline APFloat minnum(const APFloat &A, const APFloat &B) {
1450 if (A.isNaN())
1451 return B;
1452 if (B.isNaN())
1453 return A;
1454 if (A.isZero() && B.isZero() && (A.isNegative() != B.isNegative()))
1455 return A.isNegative() ? A : B;
1456 return B < A ? B : A;
1457}
1458
1459/// Implements IEEE-754 2019 maximumNumber semantics. Returns the larger of the
1460/// 2 arguments if both are not NaN. If either argument is a NaN, returns the
1461/// other argument. +0 is treated as ordered greater than -0.
1463inline APFloat maxnum(const APFloat &A, const APFloat &B) {
1464 if (A.isNaN())
1465 return B;
1466 if (B.isNaN())
1467 return A;
1468 if (A.isZero() && B.isZero() && (A.isNegative() != B.isNegative()))
1469 return A.isNegative() ? B : A;
1470 return A < B ? B : A;
1471}
1472
1473/// Implements IEEE 754-2019 minimum semantics. Returns the smaller of 2
1474/// arguments, propagating NaNs and treating -0 as less than +0.
1476inline APFloat minimum(const APFloat &A, const APFloat &B) {
1477 if (A.isNaN())
1478 return A;
1479 if (B.isNaN())
1480 return B;
1481 if (A.isZero() && B.isZero() && (A.isNegative() != B.isNegative()))
1482 return A.isNegative() ? A : B;
1483 return B < A ? B : A;
1484}
1485
1486/// Implements IEEE 754-2019 minimumNumber semantics. Returns the smaller
1487/// of 2 arguments, not propagating NaNs and treating -0 as less than +0.
1489inline APFloat minimumnum(const APFloat &A, const APFloat &B) {
1490 if (A.isNaN())
1491 return B.isNaN() ? B.makeQuiet() : B;
1492 if (B.isNaN())
1493 return A;
1494 if (A.isZero() && B.isZero() && (A.isNegative() != B.isNegative()))
1495 return A.isNegative() ? A : B;
1496 return B < A ? B : A;
1497}
1498
1499/// Implements IEEE 754-2019 maximum semantics. Returns the larger of 2
1500/// arguments, propagating NaNs and treating -0 as less than +0.
1502inline APFloat maximum(const APFloat &A, const APFloat &B) {
1503 if (A.isNaN())
1504 return A;
1505 if (B.isNaN())
1506 return B;
1507 if (A.isZero() && B.isZero() && (A.isNegative() != B.isNegative()))
1508 return A.isNegative() ? B : A;
1509 return A < B ? B : A;
1510}
1511
1512/// Implements IEEE 754-2019 maximumNumber semantics. Returns the larger
1513/// of 2 arguments, not propagating NaNs and treating -0 as less than +0.
1515inline APFloat maximumnum(const APFloat &A, const APFloat &B) {
1516 if (A.isNaN())
1517 return B.isNaN() ? B.makeQuiet() : B;
1518 if (B.isNaN())
1519 return A;
1520 if (A.isZero() && B.isZero() && (A.isNegative() != B.isNegative()))
1521 return A.isNegative() ? B : A;
1522 return A < B ? B : A;
1523}
1524
1525// We want the following functions to be available in the header for inlining.
1526// We cannot define them inline in the class definition of `DoubleAPFloat`
1527// because doing so would instantiate `std::unique_ptr<APFloat[]>` before
1528// `APFloat` is defined, and that would be undefined behavior.
1529namespace detail {
1530
1532 if (this != &RHS) {
1533 this->~DoubleAPFloat();
1534 new (this) DoubleAPFloat(std::move(RHS));
1535 }
1536 return *this;
1537}
1538
1539APFloat &DoubleAPFloat::getFirst() { return Floats[0]; }
1540const APFloat &DoubleAPFloat::getFirst() const { return Floats[0]; }
1541APFloat &DoubleAPFloat::getSecond() { return Floats[1]; }
1542const APFloat &DoubleAPFloat::getSecond() const { return Floats[1]; }
1543
1544} // namespace detail
1545
1546} // namespace llvm
1547
1548#undef APFLOAT_DISPATCH_ON_SEMANTICS
1549#endif // LLVM_ADT_APFLOAT_H
aarch64 promote const
#define APFLOAT_DISPATCH_ON_SEMANTICS(METHOD_CALL)
Definition: APFloat.h:25
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")
#define LLVM_READNONE
Definition: Compiler.h:220
#define LLVM_READONLY
Definition: Compiler.h:227
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")
expand large fp convert
Utilities for dealing with flags related to floating point properties and mode controls.
#define F(x, y, z)
Definition: MD5.cpp:55
#define I(x, y, z)
Definition: MD5.cpp:58
Load MIR Sample Profile
#define T
assert(ImpDefSCC.getReg()==AMDGPU::SCC &&ImpDefSCC.isDef())
Value * RHS
Value * LHS
static APFloat getQNaN(const fltSemantics &Sem, bool Negative=false, const APInt *payload=nullptr)
Factory for QNaN values.
Definition: APFloat.h:1020
static APFloat getSNaN(const fltSemantics &Sem, bool Negative=false, const APInt *payload=nullptr)
Factory for SNaN values.
Definition: APFloat.h:1028
opStatus divide(const APFloat &RHS, roundingMode RM)
Definition: APFloat.h:1113
bool getExactInverse(APFloat *inv) const
Definition: APFloat.h:1387
APFloat & operator=(APFloat &&RHS)=default
bool isFiniteNonZero() const
Definition: APFloat.h:1358
static bool hasNanOrInf(const fltSemantics &Sem)
Definition: APFloat.h:1070
APFloat(const APFloat &RHS)=default
void copySign(const APFloat &RHS)
Definition: APFloat.h:1207
opStatus convert(const fltSemantics &ToSemantics, roundingMode RM, bool *losesInfo)
Definition: APFloat.cpp:5282
LLVM_READONLY int getExactLog2Abs() const
Definition: APFloat.h:1392
opStatus subtract(const APFloat &RHS, roundingMode RM)
Definition: APFloat.h:1095
bool bitwiseIsEqual(const APFloat &RHS) const
Definition: APFloat.h:1313
bool isNegative() const
Definition: APFloat.h:1348
~APFloat()=default
APFloat operator+(const APFloat &RHS) const
Add two APFloats, rounding ties to the nearest even.
Definition: APFloat.h:1172
friend DoubleAPFloat
Definition: APFloat.h:1406
double convertToDouble() const
Converts this APFloat to host double value.
Definition: APFloat.cpp:5341
bool isPosInfinity() const
Definition: APFloat.h:1361
APFloat(APFloat &&RHS)=default
void toString(SmallVectorImpl< char > &Str, unsigned FormatPrecision=0, unsigned FormatMaxPadding=3, bool TruncateZero=true) const
Definition: APFloat.h:1378
bool isNormal() const
Definition: APFloat.h:1352
bool isDenormal() const
Definition: APFloat.h:1349
bool isExactlyValue(double V) const
We don't rely on operator== working on double values, as it returns true for things that are clearly ...
Definition: APFloat.h:1331
opStatus add(const APFloat &RHS, roundingMode RM)
Definition: APFloat.h:1086
LLVM_READONLY int getExactLog2() const
Definition: APFloat.h:1397
APFloat(double d)
Definition: APFloat.h:970
APFloat & operator=(const APFloat &RHS)=default
static APFloat getAllOnesValue(const fltSemantics &Semantics)
Returns a float which is bitcasted from an all one value int.
Definition: APFloat.cpp:5307
APFloat(const fltSemantics &Semantics, integerPart I)
Definition: APFloat.h:962
bool operator!=(const APFloat &RHS) const
Definition: APFloat.h:1283
APFloat(const fltSemantics &Semantics, T V)=delete
const fltSemantics & getSemantics() const
Definition: APFloat.h:1356
APFloat operator-(const APFloat &RHS) const
Subtract two APFloats, rounding ties to the nearest even.
Definition: APFloat.h:1180
APFloat operator*(const APFloat &RHS) const
Multiply two APFloats, rounding ties to the nearest even.
Definition: APFloat.h:1188
APFloat(const fltSemantics &Semantics)
Definition: APFloat.h:960
bool isNonZero() const
Definition: APFloat.h:1357
void clearSign()
Definition: APFloat.h:1203
opStatus convertFromSignExtendedInteger(const integerPart *Input, unsigned int InputSize, bool IsSigned, roundingMode RM)
Definition: APFloat.h:1241
bool operator<(const APFloat &RHS) const
Definition: APFloat.h:1285
bool isFinite() const
Definition: APFloat.h:1353
APFloat makeQuiet() const
Assuming this is an IEEE-754 NaN value, quiet its signaling bit.
Definition: APFloat.h:1221
bool isNaN() const
Definition: APFloat.h:1346
opStatus convertFromAPInt(const APInt &Input, bool IsSigned, roundingMode RM)
Definition: APFloat.h:1237
static APFloat getOne(const fltSemantics &Sem, bool Negative=false)
Factory for Positive and Negative One.
Definition: APFloat.h:991
unsigned int convertToHexString(char *DST, unsigned int HexDigits, bool UpperCase, roundingMode RM) const
Definition: APFloat.h:1338
opStatus multiply(const APFloat &RHS, roundingMode RM)
Definition: APFloat.h:1104
float convertToFloat() const
Converts this APFloat to host float value.
Definition: APFloat.cpp:5369
bool isSignaling() const
Definition: APFloat.h:1350
bool operator>(const APFloat &RHS) const
Definition: APFloat.h:1289
opStatus fusedMultiplyAdd(const APFloat &Multiplicand, const APFloat &Addend, roundingMode RM)
Definition: APFloat.h:1140
APFloat operator/(const APFloat &RHS) const
Divide the first APFloat by the second, rounding ties to the nearest even.
Definition: APFloat.h:1196
opStatus remainder(const APFloat &RHS)
Definition: APFloat.h:1122
APFloat operator-() const
Negate an APFloat.
Definition: APFloat.h:1164
bool isZero() const
Definition: APFloat.h:1344
static APFloat getSmallestNormalized(const fltSemantics &Sem, bool Negative=false)
Returns the smallest (by magnitude) normalized finite number in the given semantics.
Definition: APFloat.h:1058
APInt bitcastToAPInt() const
Definition: APFloat.h:1254
bool isLargest() const
Definition: APFloat.h:1364
friend APFloat frexp(const APFloat &X, int &Exp, roundingMode RM)
bool isSmallest() const
Definition: APFloat.h:1363
static APFloat getLargest(const fltSemantics &Sem, bool Negative=false)
Returns the largest finite number in the given semantics.
Definition: APFloat.h:1038
opStatus convertToInteger(MutableArrayRef< integerPart > Input, unsigned int Width, bool IsSigned, roundingMode RM, bool *IsExact) const
Definition: APFloat.h:1229
opStatus next(bool nextDown)
Definition: APFloat.h:1159
static APFloat getInf(const fltSemantics &Sem, bool Negative=false)
Factory for Positive and Negative Infinity.
Definition: APFloat.h:998
friend APFloat scalbn(APFloat X, int Exp, roundingMode RM)
bool operator>=(const APFloat &RHS) const
Definition: APFloat.h:1298
bool needsCleanup() const
Definition: APFloat.h:977
static APFloat getSmallest(const fltSemantics &Sem, bool Negative=false)
Returns the smallest (by magnitude) finite number in the given semantics.
Definition: APFloat.h:1048
FPClassTest classify() const
Return the FPClassTest which will return true for the value.
Definition: APFloat.cpp:5269
bool operator==(const APFloat &RHS) const
Definition: APFloat.h:1281
opStatus mod(const APFloat &RHS)
Definition: APFloat.h:1131
bool isPosZero() const
Definition: APFloat.h:1359
friend int ilogb(const APFloat &Arg)
Definition: APFloat.h:1402
Expected< opStatus > convertFromString(StringRef, roundingMode)
Definition: APFloat.cpp:5249
fltCategory getCategory() const
Definition: APFloat.h:1355
APFloat(const fltSemantics &Semantics, uninitializedTag)
Definition: APFloat.h:967
bool isInteger() const
Definition: APFloat.h:1365
bool isNegInfinity() const
Definition: APFloat.h:1362
friend IEEEFloat
Definition: APFloat.h:1405
void dump() const
Definition: APFloat.cpp:5318
bool isNegZero() const
Definition: APFloat.h:1360
void print(raw_ostream &) const
Definition: APFloat.cpp:5311
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.
Definition: APFloat.h:1214
APFloat(float f)
Definition: APFloat.h:971
opStatus roundToIntegral(roundingMode RM)
Definition: APFloat.h:1153
void changeSign()
Definition: APFloat.h:1202
friend hash_code hash_value(const APFloat &Arg)
See friend declarations above.
Definition: APFloat.cpp:5254
static APFloat getNaN(const fltSemantics &Sem, bool Negative=false, uint64_t payload=0)
Factory for NaN values.
Definition: APFloat.h:1009
bool isIEEE() const
Definition: APFloat.h:1366
static APFloat getZero(const fltSemantics &Sem, bool Negative=false)
Factory for Positive and Negative Zero.
Definition: APFloat.h:982
cmpResult compare(const APFloat &RHS) const
Definition: APFloat.h:1303
opStatus convertFromZeroExtendedInteger(const integerPart *Input, unsigned int InputSize, bool IsSigned, roundingMode RM)
Definition: APFloat.h:1247
bool isSmallestNormalized() const
Definition: APFloat.h:1368
APFloat(const fltSemantics &Semantics, const APInt &I)
Definition: APFloat.h:969
bool isInfinity() const
Definition: APFloat.h:1345
bool operator<=(const APFloat &RHS) const
Definition: APFloat.h:1293
Class for arbitrary precision integers.
Definition: APInt.h:77
@ APINT_BITS_PER_WORD
Bits in a word.
Definition: APInt.h:86
An arbitrary precision integer that knows its signedness.
Definition: APSInt.h:23
Tagged union holding either a T or a Error.
Definition: Error.h:481
FoldingSetNodeID - This class is used to gather all the unique data bits of a node.
Definition: FoldingSet.h:327
MutableArrayRef - Represent a mutable reference to an array (0 or more elements consecutively in memo...
Definition: ArrayRef.h:307
This class consists of common code factored out of the SmallVector class to reduce code duplication b...
Definition: SmallVector.h:586
StringRef - Represent a constant reference to a string, i.e.
Definition: StringRef.h:50
LLVM Value Representation.
Definition: Value.h:74
void makeSmallestNormalized(bool Neg)
Definition: APFloat.cpp:5040
DoubleAPFloat & operator=(const DoubleAPFloat &RHS)
Definition: APFloat.cpp:4698
LLVM_READONLY int getExactLog2() const
Definition: APFloat.cpp:5205
opStatus remainder(const DoubleAPFloat &RHS)
Definition: APFloat.cpp:4946
opStatus multiply(const DoubleAPFloat &RHS, roundingMode RM)
Definition: APFloat.cpp:4850
fltCategory getCategory() const
Definition: APFloat.cpp:5010
bool bitwiseIsEqual(const DoubleAPFloat &RHS) const
Definition: APFloat.cpp:5061
LLVM_READONLY int getExactLog2Abs() const
Definition: APFloat.cpp:5210
opStatus convertFromAPInt(const APInt &Input, bool IsSigned, roundingMode RM)
Definition: APFloat.cpp:5107
opStatus convertFromZeroExtendedInteger(const integerPart *Input, unsigned int InputSize, bool IsSigned, roundingMode RM)
Definition: APFloat.cpp:5129
APInt bitcastToAPInt() const
Definition: APFloat.cpp:5072
bool getExactInverse(APFloat *inv) const
Definition: APFloat.cpp:5194
Expected< opStatus > convertFromString(StringRef, roundingMode)
Definition: APFloat.cpp:5081
opStatus subtract(const DoubleAPFloat &RHS, roundingMode RM)
Definition: APFloat.cpp:4842
cmpResult compareAbsoluteValue(const DoubleAPFloat &RHS) const
Definition: APFloat.cpp:4990
opStatus convertToInteger(MutableArrayRef< integerPart > Input, unsigned int Width, bool IsSigned, roundingMode RM, bool *IsExact) const
Definition: APFloat.cpp:5099
void makeSmallest(bool Neg)
Definition: APFloat.cpp:5034
opStatus next(bool nextDown)
Definition: APFloat.cpp:5090
friend DoubleAPFloat scalbn(const DoubleAPFloat &X, int Exp, roundingMode)
opStatus divide(const DoubleAPFloat &RHS, roundingMode RM)
Definition: APFloat.cpp:4936
friend hash_code hash_value(const DoubleAPFloat &Arg)
Definition: APFloat.cpp:5066
bool isSmallestNormalized() const
Definition: APFloat.cpp:5163
opStatus mod(const DoubleAPFloat &RHS)
Definition: APFloat.cpp:4955
void toString(SmallVectorImpl< char > &Str, unsigned FormatPrecision, unsigned FormatMaxPadding, bool TruncateZero=true) const
Definition: APFloat.cpp:5185
void makeLargest(bool Neg)
Definition: APFloat.cpp:5026
cmpResult compare(const DoubleAPFloat &RHS) const
Definition: APFloat.cpp:5053
opStatus roundToIntegral(roundingMode RM)
Definition: APFloat.cpp:4976
opStatus convertFromSignExtendedInteger(const integerPart *Input, unsigned int InputSize, bool IsSigned, roundingMode RM)
Definition: APFloat.cpp:5118
opStatus fusedMultiplyAdd(const DoubleAPFloat &Multiplicand, const DoubleAPFloat &Addend, roundingMode RM)
Definition: APFloat.cpp:4964
unsigned int convertToHexString(char *DST, unsigned int HexDigits, bool UpperCase, roundingMode RM) const
Definition: APFloat.cpp:5139
bool needsCleanup() const
Definition: APFloat.h:728
opStatus add(const DoubleAPFloat &RHS, roundingMode RM)
Definition: APFloat.cpp:4837
friend DoubleAPFloat frexp(const DoubleAPFloat &X, int &Exp, roundingMode)
void makeNaN(bool SNaN, bool Neg, const APInt *fill)
Definition: APFloat.cpp:5048
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...
Definition: APFloat.cpp:3269
fltCategory getCategory() const
Definition: APFloat.h:440
bool isNonZero() const
Definition: APFloat.h:442
bool isFiniteNonZero() const
Definition: APFloat.h:443
opStatus add(const IEEEFloat &, roundingMode)
Definition: APFloat.cpp:2065
bool getExactInverse(APFloat *inv) const
If this value has an exact multiplicative inverse, store it in inv and return true.
Definition: APFloat.cpp:4344
bool needsCleanup() const
Returns whether this instance allocated memory.
Definition: APFloat.h:327
void makeLargest(bool Neg=false)
Make this number the largest magnitude normal number in the given semantics.
Definition: APFloat.cpp:3974
LLVM_READONLY int getExactLog2Abs() const
Definition: APFloat.cpp:4373
opStatus next(bool nextDown)
IEEE-754R 5.3.1: nextUp/nextDown.
Definition: APFloat.cpp:4418
APInt bitcastToAPInt() const
Definition: APFloat.cpp:3659
bool isNegative() const
IEEE-754R isSignMinus: Returns true if and only if the current value is negative.
Definition: APFloat.h:405
opStatus convertFromZeroExtendedInteger(const integerPart *, unsigned int, bool, roundingMode)
Definition: APFloat.cpp:2828
bool isNaN() const
Returns true if and only if the float is a quiet or signaling NaN.
Definition: APFloat.h:430
opStatus convertFromAPInt(const APInt &, bool, roundingMode)
Definition: APFloat.cpp:2784
opStatus roundToIntegral(roundingMode)
Definition: APFloat.cpp:2300
double convertToDouble() const
Definition: APFloat.cpp:3717
float convertToFloat() const
Definition: APFloat.cpp:3710
void toString(SmallVectorImpl< char > &Str, unsigned FormatPrecision=0, unsigned FormatMaxPadding=3, bool TruncateZero=true) const
Converts this value into a decimal string.
Definition: APFloat.cpp:4123
cmpResult compareAbsoluteValue(const IEEEFloat &) const
Definition: APFloat.cpp:1487
opStatus fusedMultiplyAdd(const IEEEFloat &, const IEEEFloat &, roundingMode)
Definition: APFloat.cpp:2254
void makeSmallest(bool Neg=false)
Make this number the smallest magnitude denormal number in the given semantics.
Definition: APFloat.cpp:4003
void makeInf(bool Neg=false)
Definition: APFloat.cpp:4558
bool isNormal() const
IEEE-754R isNormal: Returns true if and only if the current value is normal.
Definition: APFloat.h:411
friend IEEEFloat frexp(const IEEEFloat &X, int &Exp, roundingMode)
Expected< opStatus > convertFromString(StringRef, roundingMode)
Definition: APFloat.cpp:3216
bool isSmallestNormalized() const
Returns true if this is the smallest (by magnitude) normalized finite number in the given semantics.
Definition: APFloat.cpp:1011
bool isLargest() const
Returns true if and only if the number has the largest possible finite magnitude in the current seman...
Definition: APFloat.cpp:1103
bool isFinite() const
Returns true if and only if the current value is zero, subnormal, or normal.
Definition: APFloat.h:417
void makeNaN(bool SNaN=false, bool Neg=false, const APInt *fill=nullptr)
Definition: APFloat.cpp:905
opStatus convertToInteger(MutableArrayRef< integerPart >, unsigned int, bool, roundingMode, bool *) const
Definition: APFloat.cpp:2724
friend int ilogb(const IEEEFloat &Arg)
Returns the exponent of the internal representation of the APFloat.
Definition: APFloat.cpp:4590
opStatus remainder(const IEEEFloat &)
IEEE remainder.
Definition: APFloat.cpp:2117
friend hash_code hash_value(const IEEEFloat &Arg)
Overload to compute a hash code for an APFloat value.
Definition: APFloat.cpp:3418
IEEEFloat & operator=(const IEEEFloat &)
Definition: APFloat.cpp:972
opStatus divide(const IEEEFloat &, roundingMode)
Definition: APFloat.cpp:2097
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).
Definition: APFloat.cpp:1127
void makeSmallestNormalized(bool Negative=false)
Returns the smallest (by magnitude) normalized finite number in the given semantics.
Definition: APFloat.cpp:4014
bool isInteger() const
Returns true if and only if the number is an exact integer.
Definition: APFloat.cpp:1119
bool isPosZero() const
Definition: APFloat.h:444
cmpResult compare(const IEEEFloat &) const
IEEE comparison with another floating point number (NaNs compare unordered, 0==-0).
Definition: APFloat.cpp:2387
opStatus subtract(const IEEEFloat &, roundingMode)
Definition: APFloat.cpp:2071
bool isInfinity() const
IEEE-754R isInfinite(): Returns true if and only if the float is infinity.
Definition: APFloat.h:427
const fltSemantics & getSemantics() const
Definition: APFloat.h:441
bool isZero() const
Returns true if and only if the float is plus or minus zero.
Definition: APFloat.h:420
bool isSignaling() const
Returns true if and only if the float is a signaling NaN.
Definition: APFloat.cpp:4402
opStatus convertFromSignExtendedInteger(const integerPart *, unsigned int, bool, roundingMode)
Definition: APFloat.cpp:2802
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)
Definition: APFloat.cpp:4573
LLVM_READONLY int getExactLog2() const
Definition: APFloat.h:519
bool isDenormal() const
IEEE-754R isSubnormal(): Returns true if and only if the float is a denormal.
Definition: APFloat.cpp:997
bool isSmallest() const
Returns true if and only if the number has the smallest possible non-zero magnitude in the current se...
Definition: APFloat.cpp:1003
opStatus mod(const IEEEFloat &)
C fmod, or llvm frem.
Definition: APFloat.cpp:2227
bool isNegZero() const
Definition: APFloat.h:445
opStatus multiply(const IEEEFloat &, roundingMode)
Definition: APFloat.cpp:2077
An opaque object representing a hash code.
Definition: Hashing.h:75
This class implements an extremely fast bulk output stream that can only output to a stream.
Definition: raw_ostream.h:52
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
IEEEFloat scalbn(IEEEFloat X, int Exp, IEEEFloat::roundingMode)
Definition: APFloat.cpp:4608
hash_code hash_value(const IEEEFloat &Arg)
Definition: APFloat.cpp:3418
IEEEFloat frexp(const IEEEFloat &Val, int &Exp, IEEEFloat::roundingMode RM)
Definition: APFloat.cpp:4629
int ilogb(const IEEEFloat &Arg)
Definition: APFloat.cpp:4590
This is an optimization pass for GlobalISel generic memory operations.
Definition: AddressRanges.h:18
hash_code hash_value(const FixedPointSemantics &Val)
Definition: APFixedPoint.h:128
APFloat abs(APFloat X)
Returns the absolute value of the argument.
Definition: APFloat.h:1434
LLVM_READONLY APFloat maximum(const APFloat &A, const APFloat &B)
Implements IEEE 754-2019 maximum semantics.
Definition: APFloat.h:1502
APFloat frexp(const APFloat &X, int &Exp, APFloat::roundingMode RM)
Equivalent of C standard library function.
Definition: APFloat.h:1426
LLVM_READONLY APFloat maxnum(const APFloat &A, const APFloat &B)
Implements IEEE-754 2019 maximumNumber semantics.
Definition: APFloat.h:1463
lostFraction
Enum that represents what fraction of the LSB truncated bits of an fp number represent.
Definition: APFloat.h:49
@ lfMoreThanHalf
Definition: APFloat.h:53
@ lfLessThanHalf
Definition: APFloat.h:51
@ lfExactlyHalf
Definition: APFloat.h:52
@ lfExactlyZero
Definition: APFloat.h:50
LLVM_READONLY APFloat minimumnum(const APFloat &A, const APFloat &B)
Implements IEEE 754-2019 minimumNumber semantics.
Definition: APFloat.h:1489
FPClassTest
Floating-point class tests, supported by 'is_fpclass' intrinsic.
APFloat scalbn(APFloat X, int Exp, APFloat::roundingMode RM)
Definition: APFloat.h:1414
@ 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.
Definition: APFloat.h:1449
RoundingMode
Rounding mode.
@ TowardZero
roundTowardZero.
@ NearestTiesToEven
roundTiesToEven.
@ TowardPositive
roundTowardPositive.
@ NearestTiesToAway
roundTiesToAway.
@ TowardNegative
roundTowardNegative.
APFloat neg(APFloat X)
Returns the negated value of the argument.
Definition: APFloat.h:1440
LLVM_READONLY APFloat minimum(const APFloat &A, const APFloat &B)
Implements IEEE 754-2019 minimum semantics.
Definition: APFloat.h:1476
LLVM_READONLY APFloat maximumnum(const APFloat &A, const APFloat &B)
Implements IEEE 754-2019 maximumNumber semantics.
Definition: APFloat.h:1515
A self-contained host- and target-independent arbitrary-precision floating-point software implementat...
Definition: APFloat.h:143
static const llvm::fltSemantics & EnumToSemantics(Semantics S)
Definition: APFloat.cpp:193
static const fltSemantics & IEEEsingle() LLVM_READNONE
Definition: APFloat.cpp:271
static const fltSemantics & Float6E3M2FN() LLVM_READNONE
Definition: APFloat.cpp:285
static constexpr roundingMode rmNearestTiesToAway
Definition: APFloat.h:251
cmpResult
IEEE-754R 5.11: Floating Point Comparison Relations.
Definition: APFloat.h:236
static constexpr roundingMode rmTowardNegative
Definition: APFloat.h:249
static ExponentType semanticsMinExponent(const fltSemantics &)
Definition: APFloat.cpp:325
llvm::RoundingMode roundingMode
IEEE-754R 4.3: Rounding-direction attributes.
Definition: APFloat.h:244
static constexpr roundingMode rmNearestTiesToEven
Definition: APFloat.h:246
static unsigned int semanticsSizeInBits(const fltSemantics &)
Definition: APFloat.cpp:328
static unsigned getSizeInBits(const fltSemantics &Sem)
Returns the size of the floating point number (in bits) in the given semantics.
Definition: APFloat.cpp:356
static const fltSemantics & Float8E4M3FN() LLVM_READNONE
Definition: APFloat.cpp:279
static const fltSemantics & PPCDoubleDouble() LLVM_READNONE
Definition: APFloat.cpp:274
static constexpr roundingMode rmTowardZero
Definition: APFloat.h:250
static const fltSemantics & x87DoubleExtended() LLVM_READNONE
Definition: APFloat.cpp:288
uninitializedTag
Convenience enum used to construct an uninitialized APFloat.
Definition: APFloat.h:280
static const fltSemantics & IEEEquad() LLVM_READNONE
Definition: APFloat.cpp:273
static const fltSemantics & Float4E2M1FN() LLVM_READNONE
Definition: APFloat.cpp:287
static const fltSemantics & Float8E4M3B11FNUZ() LLVM_READNONE
Definition: APFloat.cpp:281
static const fltSemantics & Bogus() LLVM_READNONE
A Pseudo fltsemantic used to construct APFloats that cannot conflict with anything real.
Definition: APFloat.cpp:291
static ExponentType semanticsMaxExponent(const fltSemantics &)
Definition: APFloat.cpp:321
static unsigned int semanticsPrecision(const fltSemantics &)
Definition: APFloat.cpp:317
static const fltSemantics & IEEEdouble() LLVM_READNONE
Definition: APFloat.cpp:272
static const fltSemantics & Float8E5M2() LLVM_READNONE
Definition: APFloat.cpp:277
static Semantics SemanticsToEnum(const llvm::fltSemantics &Sem)
Definition: APFloat.cpp:232
static constexpr unsigned integerPartWidth
Definition: APFloat.h:145
static const fltSemantics & IEEEhalf() LLVM_READNONE
Definition: APFloat.cpp:269
APInt::WordType integerPart
Definition: APFloat.h:144
static constexpr roundingMode rmTowardPositive
Definition: APFloat.h:248
static bool isRepresentableAsNormalIn(const fltSemantics &Src, const fltSemantics &Dst)
Definition: APFloat.cpp:342
static const fltSemantics & Float8E4M3FNUZ() LLVM_READNONE
Definition: APFloat.cpp:280
IlogbErrorKinds
Enumeration of ilogb error results.
Definition: APFloat.h:285
static const fltSemantics & BFloat() LLVM_READNONE
Definition: APFloat.cpp:270
static const fltSemantics & FloatTF32() LLVM_READNONE
Definition: APFloat.cpp:284
static const fltSemantics & Float8E5M2FNUZ() LLVM_READNONE
Definition: APFloat.cpp:278
static const fltSemantics & Float6E2M3FN() LLVM_READNONE
Definition: APFloat.cpp:286
fltCategory
Category of internally-represented number.
Definition: APFloat.h:272
opStatus
IEEE-754R 7: Default exception handling.
Definition: APFloat.h:262
int32_t ExponentType
A signed type to represent a floating point numbers unbiased exponent.
Definition: APFloat.h:148
static unsigned int semanticsIntSizeInBits(const fltSemantics &, bool)
Definition: APFloat.cpp:331