xref: /aosp_15_r20/external/llvm/lib/Support/APFloat.cpp (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker //===-- APFloat.cpp - Implement APFloat class -----------------------------===//
2*9880d681SAndroid Build Coastguard Worker //
3*9880d681SAndroid Build Coastguard Worker //                     The LLVM Compiler Infrastructure
4*9880d681SAndroid Build Coastguard Worker //
5*9880d681SAndroid Build Coastguard Worker // This file is distributed under the University of Illinois Open Source
6*9880d681SAndroid Build Coastguard Worker // License. See LICENSE.TXT for details.
7*9880d681SAndroid Build Coastguard Worker //
8*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
9*9880d681SAndroid Build Coastguard Worker //
10*9880d681SAndroid Build Coastguard Worker // This file implements a class to represent arbitrary precision floating
11*9880d681SAndroid Build Coastguard Worker // point values and provide a variety of arithmetic operations on them.
12*9880d681SAndroid Build Coastguard Worker //
13*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
14*9880d681SAndroid Build Coastguard Worker 
15*9880d681SAndroid Build Coastguard Worker #include "llvm/ADT/APFloat.h"
16*9880d681SAndroid Build Coastguard Worker #include "llvm/ADT/APSInt.h"
17*9880d681SAndroid Build Coastguard Worker #include "llvm/ADT/ArrayRef.h"
18*9880d681SAndroid Build Coastguard Worker #include "llvm/ADT/FoldingSet.h"
19*9880d681SAndroid Build Coastguard Worker #include "llvm/ADT/Hashing.h"
20*9880d681SAndroid Build Coastguard Worker #include "llvm/ADT/StringExtras.h"
21*9880d681SAndroid Build Coastguard Worker #include "llvm/ADT/StringRef.h"
22*9880d681SAndroid Build Coastguard Worker #include "llvm/Support/ErrorHandling.h"
23*9880d681SAndroid Build Coastguard Worker #include "llvm/Support/MathExtras.h"
24*9880d681SAndroid Build Coastguard Worker #include <cstring>
25*9880d681SAndroid Build Coastguard Worker #include <limits.h>
26*9880d681SAndroid Build Coastguard Worker 
27*9880d681SAndroid Build Coastguard Worker using namespace llvm;
28*9880d681SAndroid Build Coastguard Worker 
29*9880d681SAndroid Build Coastguard Worker /// A macro used to combine two fcCategory enums into one key which can be used
30*9880d681SAndroid Build Coastguard Worker /// in a switch statement to classify how the interaction of two APFloat's
31*9880d681SAndroid Build Coastguard Worker /// categories affects an operation.
32*9880d681SAndroid Build Coastguard Worker ///
33*9880d681SAndroid Build Coastguard Worker /// TODO: If clang source code is ever allowed to use constexpr in its own
34*9880d681SAndroid Build Coastguard Worker /// codebase, change this into a static inline function.
35*9880d681SAndroid Build Coastguard Worker #define PackCategoriesIntoKey(_lhs, _rhs) ((_lhs) * 4 + (_rhs))
36*9880d681SAndroid Build Coastguard Worker 
37*9880d681SAndroid Build Coastguard Worker /* Assumed in hexadecimal significand parsing, and conversion to
38*9880d681SAndroid Build Coastguard Worker    hexadecimal strings.  */
39*9880d681SAndroid Build Coastguard Worker static_assert(integerPartWidth % 4 == 0, "Part width must be divisible by 4!");
40*9880d681SAndroid Build Coastguard Worker 
41*9880d681SAndroid Build Coastguard Worker namespace llvm {
42*9880d681SAndroid Build Coastguard Worker 
43*9880d681SAndroid Build Coastguard Worker   /* Represents floating point arithmetic semantics.  */
44*9880d681SAndroid Build Coastguard Worker   struct fltSemantics {
45*9880d681SAndroid Build Coastguard Worker     /* The largest E such that 2^E is representable; this matches the
46*9880d681SAndroid Build Coastguard Worker        definition of IEEE 754.  */
47*9880d681SAndroid Build Coastguard Worker     APFloat::ExponentType maxExponent;
48*9880d681SAndroid Build Coastguard Worker 
49*9880d681SAndroid Build Coastguard Worker     /* The smallest E such that 2^E is a normalized number; this
50*9880d681SAndroid Build Coastguard Worker        matches the definition of IEEE 754.  */
51*9880d681SAndroid Build Coastguard Worker     APFloat::ExponentType minExponent;
52*9880d681SAndroid Build Coastguard Worker 
53*9880d681SAndroid Build Coastguard Worker     /* Number of bits in the significand.  This includes the integer
54*9880d681SAndroid Build Coastguard Worker        bit.  */
55*9880d681SAndroid Build Coastguard Worker     unsigned int precision;
56*9880d681SAndroid Build Coastguard Worker 
57*9880d681SAndroid Build Coastguard Worker     /* Number of bits actually used in the semantics. */
58*9880d681SAndroid Build Coastguard Worker     unsigned int sizeInBits;
59*9880d681SAndroid Build Coastguard Worker   };
60*9880d681SAndroid Build Coastguard Worker 
61*9880d681SAndroid Build Coastguard Worker   const fltSemantics APFloat::IEEEhalf = { 15, -14, 11, 16 };
62*9880d681SAndroid Build Coastguard Worker   const fltSemantics APFloat::IEEEsingle = { 127, -126, 24, 32 };
63*9880d681SAndroid Build Coastguard Worker   const fltSemantics APFloat::IEEEdouble = { 1023, -1022, 53, 64 };
64*9880d681SAndroid Build Coastguard Worker   const fltSemantics APFloat::IEEEquad = { 16383, -16382, 113, 128 };
65*9880d681SAndroid Build Coastguard Worker   const fltSemantics APFloat::x87DoubleExtended = { 16383, -16382, 64, 80 };
66*9880d681SAndroid Build Coastguard Worker   const fltSemantics APFloat::Bogus = { 0, 0, 0, 0 };
67*9880d681SAndroid Build Coastguard Worker 
68*9880d681SAndroid Build Coastguard Worker   /* The PowerPC format consists of two doubles.  It does not map cleanly
69*9880d681SAndroid Build Coastguard Worker      onto the usual format above.  It is approximated using twice the
70*9880d681SAndroid Build Coastguard Worker      mantissa bits.  Note that for exponents near the double minimum,
71*9880d681SAndroid Build Coastguard Worker      we no longer can represent the full 106 mantissa bits, so those
72*9880d681SAndroid Build Coastguard Worker      will be treated as denormal numbers.
73*9880d681SAndroid Build Coastguard Worker 
74*9880d681SAndroid Build Coastguard Worker      FIXME: While this approximation is equivalent to what GCC uses for
75*9880d681SAndroid Build Coastguard Worker      compile-time arithmetic on PPC double-double numbers, it is not able
76*9880d681SAndroid Build Coastguard Worker      to represent all possible values held by a PPC double-double number,
77*9880d681SAndroid Build Coastguard Worker      for example: (long double) 1.0 + (long double) 0x1p-106
78*9880d681SAndroid Build Coastguard Worker      Should this be replaced by a full emulation of PPC double-double?  */
79*9880d681SAndroid Build Coastguard Worker   const fltSemantics APFloat::PPCDoubleDouble = { 1023, -1022 + 53, 53 + 53, 128 };
80*9880d681SAndroid Build Coastguard Worker 
81*9880d681SAndroid Build Coastguard Worker   /* A tight upper bound on number of parts required to hold the value
82*9880d681SAndroid Build Coastguard Worker      pow(5, power) is
83*9880d681SAndroid Build Coastguard Worker 
84*9880d681SAndroid Build Coastguard Worker        power * 815 / (351 * integerPartWidth) + 1
85*9880d681SAndroid Build Coastguard Worker 
86*9880d681SAndroid Build Coastguard Worker      However, whilst the result may require only this many parts,
87*9880d681SAndroid Build Coastguard Worker      because we are multiplying two values to get it, the
88*9880d681SAndroid Build Coastguard Worker      multiplication may require an extra part with the excess part
89*9880d681SAndroid Build Coastguard Worker      being zero (consider the trivial case of 1 * 1, tcFullMultiply
90*9880d681SAndroid Build Coastguard Worker      requires two parts to hold the single-part result).  So we add an
91*9880d681SAndroid Build Coastguard Worker      extra one to guarantee enough space whilst multiplying.  */
92*9880d681SAndroid Build Coastguard Worker   const unsigned int maxExponent = 16383;
93*9880d681SAndroid Build Coastguard Worker   const unsigned int maxPrecision = 113;
94*9880d681SAndroid Build Coastguard Worker   const unsigned int maxPowerOfFiveExponent = maxExponent + maxPrecision - 1;
95*9880d681SAndroid Build Coastguard Worker   const unsigned int maxPowerOfFiveParts = 2 + ((maxPowerOfFiveExponent * 815)
96*9880d681SAndroid Build Coastguard Worker                                                 / (351 * integerPartWidth));
97*9880d681SAndroid Build Coastguard Worker }
98*9880d681SAndroid Build Coastguard Worker 
99*9880d681SAndroid Build Coastguard Worker /* A bunch of private, handy routines.  */
100*9880d681SAndroid Build Coastguard Worker 
101*9880d681SAndroid Build Coastguard Worker static inline unsigned int
partCountForBits(unsigned int bits)102*9880d681SAndroid Build Coastguard Worker partCountForBits(unsigned int bits)
103*9880d681SAndroid Build Coastguard Worker {
104*9880d681SAndroid Build Coastguard Worker   return ((bits) + integerPartWidth - 1) / integerPartWidth;
105*9880d681SAndroid Build Coastguard Worker }
106*9880d681SAndroid Build Coastguard Worker 
107*9880d681SAndroid Build Coastguard Worker /* Returns 0U-9U.  Return values >= 10U are not digits.  */
108*9880d681SAndroid Build Coastguard Worker static inline unsigned int
decDigitValue(unsigned int c)109*9880d681SAndroid Build Coastguard Worker decDigitValue(unsigned int c)
110*9880d681SAndroid Build Coastguard Worker {
111*9880d681SAndroid Build Coastguard Worker   return c - '0';
112*9880d681SAndroid Build Coastguard Worker }
113*9880d681SAndroid Build Coastguard Worker 
114*9880d681SAndroid Build Coastguard Worker /* Return the value of a decimal exponent of the form
115*9880d681SAndroid Build Coastguard Worker    [+-]ddddddd.
116*9880d681SAndroid Build Coastguard Worker 
117*9880d681SAndroid Build Coastguard Worker    If the exponent overflows, returns a large exponent with the
118*9880d681SAndroid Build Coastguard Worker    appropriate sign.  */
119*9880d681SAndroid Build Coastguard Worker static int
readExponent(StringRef::iterator begin,StringRef::iterator end)120*9880d681SAndroid Build Coastguard Worker readExponent(StringRef::iterator begin, StringRef::iterator end)
121*9880d681SAndroid Build Coastguard Worker {
122*9880d681SAndroid Build Coastguard Worker   bool isNegative;
123*9880d681SAndroid Build Coastguard Worker   unsigned int absExponent;
124*9880d681SAndroid Build Coastguard Worker   const unsigned int overlargeExponent = 24000;  /* FIXME.  */
125*9880d681SAndroid Build Coastguard Worker   StringRef::iterator p = begin;
126*9880d681SAndroid Build Coastguard Worker 
127*9880d681SAndroid Build Coastguard Worker   assert(p != end && "Exponent has no digits");
128*9880d681SAndroid Build Coastguard Worker 
129*9880d681SAndroid Build Coastguard Worker   isNegative = (*p == '-');
130*9880d681SAndroid Build Coastguard Worker   if (*p == '-' || *p == '+') {
131*9880d681SAndroid Build Coastguard Worker     p++;
132*9880d681SAndroid Build Coastguard Worker     assert(p != end && "Exponent has no digits");
133*9880d681SAndroid Build Coastguard Worker   }
134*9880d681SAndroid Build Coastguard Worker 
135*9880d681SAndroid Build Coastguard Worker   absExponent = decDigitValue(*p++);
136*9880d681SAndroid Build Coastguard Worker   assert(absExponent < 10U && "Invalid character in exponent");
137*9880d681SAndroid Build Coastguard Worker 
138*9880d681SAndroid Build Coastguard Worker   for (; p != end; ++p) {
139*9880d681SAndroid Build Coastguard Worker     unsigned int value;
140*9880d681SAndroid Build Coastguard Worker 
141*9880d681SAndroid Build Coastguard Worker     value = decDigitValue(*p);
142*9880d681SAndroid Build Coastguard Worker     assert(value < 10U && "Invalid character in exponent");
143*9880d681SAndroid Build Coastguard Worker 
144*9880d681SAndroid Build Coastguard Worker     value += absExponent * 10;
145*9880d681SAndroid Build Coastguard Worker     if (absExponent >= overlargeExponent) {
146*9880d681SAndroid Build Coastguard Worker       absExponent = overlargeExponent;
147*9880d681SAndroid Build Coastguard Worker       p = end;  /* outwit assert below */
148*9880d681SAndroid Build Coastguard Worker       break;
149*9880d681SAndroid Build Coastguard Worker     }
150*9880d681SAndroid Build Coastguard Worker     absExponent = value;
151*9880d681SAndroid Build Coastguard Worker   }
152*9880d681SAndroid Build Coastguard Worker 
153*9880d681SAndroid Build Coastguard Worker   assert(p == end && "Invalid exponent in exponent");
154*9880d681SAndroid Build Coastguard Worker 
155*9880d681SAndroid Build Coastguard Worker   if (isNegative)
156*9880d681SAndroid Build Coastguard Worker     return -(int) absExponent;
157*9880d681SAndroid Build Coastguard Worker   else
158*9880d681SAndroid Build Coastguard Worker     return (int) absExponent;
159*9880d681SAndroid Build Coastguard Worker }
160*9880d681SAndroid Build Coastguard Worker 
161*9880d681SAndroid Build Coastguard Worker /* This is ugly and needs cleaning up, but I don't immediately see
162*9880d681SAndroid Build Coastguard Worker    how whilst remaining safe.  */
163*9880d681SAndroid Build Coastguard Worker static int
totalExponent(StringRef::iterator p,StringRef::iterator end,int exponentAdjustment)164*9880d681SAndroid Build Coastguard Worker totalExponent(StringRef::iterator p, StringRef::iterator end,
165*9880d681SAndroid Build Coastguard Worker               int exponentAdjustment)
166*9880d681SAndroid Build Coastguard Worker {
167*9880d681SAndroid Build Coastguard Worker   int unsignedExponent;
168*9880d681SAndroid Build Coastguard Worker   bool negative, overflow;
169*9880d681SAndroid Build Coastguard Worker   int exponent = 0;
170*9880d681SAndroid Build Coastguard Worker 
171*9880d681SAndroid Build Coastguard Worker   assert(p != end && "Exponent has no digits");
172*9880d681SAndroid Build Coastguard Worker 
173*9880d681SAndroid Build Coastguard Worker   negative = *p == '-';
174*9880d681SAndroid Build Coastguard Worker   if (*p == '-' || *p == '+') {
175*9880d681SAndroid Build Coastguard Worker     p++;
176*9880d681SAndroid Build Coastguard Worker     assert(p != end && "Exponent has no digits");
177*9880d681SAndroid Build Coastguard Worker   }
178*9880d681SAndroid Build Coastguard Worker 
179*9880d681SAndroid Build Coastguard Worker   unsignedExponent = 0;
180*9880d681SAndroid Build Coastguard Worker   overflow = false;
181*9880d681SAndroid Build Coastguard Worker   for (; p != end; ++p) {
182*9880d681SAndroid Build Coastguard Worker     unsigned int value;
183*9880d681SAndroid Build Coastguard Worker 
184*9880d681SAndroid Build Coastguard Worker     value = decDigitValue(*p);
185*9880d681SAndroid Build Coastguard Worker     assert(value < 10U && "Invalid character in exponent");
186*9880d681SAndroid Build Coastguard Worker 
187*9880d681SAndroid Build Coastguard Worker     unsignedExponent = unsignedExponent * 10 + value;
188*9880d681SAndroid Build Coastguard Worker     if (unsignedExponent > 32767) {
189*9880d681SAndroid Build Coastguard Worker       overflow = true;
190*9880d681SAndroid Build Coastguard Worker       break;
191*9880d681SAndroid Build Coastguard Worker     }
192*9880d681SAndroid Build Coastguard Worker   }
193*9880d681SAndroid Build Coastguard Worker 
194*9880d681SAndroid Build Coastguard Worker   if (exponentAdjustment > 32767 || exponentAdjustment < -32768)
195*9880d681SAndroid Build Coastguard Worker     overflow = true;
196*9880d681SAndroid Build Coastguard Worker 
197*9880d681SAndroid Build Coastguard Worker   if (!overflow) {
198*9880d681SAndroid Build Coastguard Worker     exponent = unsignedExponent;
199*9880d681SAndroid Build Coastguard Worker     if (negative)
200*9880d681SAndroid Build Coastguard Worker       exponent = -exponent;
201*9880d681SAndroid Build Coastguard Worker     exponent += exponentAdjustment;
202*9880d681SAndroid Build Coastguard Worker     if (exponent > 32767 || exponent < -32768)
203*9880d681SAndroid Build Coastguard Worker       overflow = true;
204*9880d681SAndroid Build Coastguard Worker   }
205*9880d681SAndroid Build Coastguard Worker 
206*9880d681SAndroid Build Coastguard Worker   if (overflow)
207*9880d681SAndroid Build Coastguard Worker     exponent = negative ? -32768: 32767;
208*9880d681SAndroid Build Coastguard Worker 
209*9880d681SAndroid Build Coastguard Worker   return exponent;
210*9880d681SAndroid Build Coastguard Worker }
211*9880d681SAndroid Build Coastguard Worker 
212*9880d681SAndroid Build Coastguard Worker static StringRef::iterator
skipLeadingZeroesAndAnyDot(StringRef::iterator begin,StringRef::iterator end,StringRef::iterator * dot)213*9880d681SAndroid Build Coastguard Worker skipLeadingZeroesAndAnyDot(StringRef::iterator begin, StringRef::iterator end,
214*9880d681SAndroid Build Coastguard Worker                            StringRef::iterator *dot)
215*9880d681SAndroid Build Coastguard Worker {
216*9880d681SAndroid Build Coastguard Worker   StringRef::iterator p = begin;
217*9880d681SAndroid Build Coastguard Worker   *dot = end;
218*9880d681SAndroid Build Coastguard Worker   while (p != end && *p == '0')
219*9880d681SAndroid Build Coastguard Worker     p++;
220*9880d681SAndroid Build Coastguard Worker 
221*9880d681SAndroid Build Coastguard Worker   if (p != end && *p == '.') {
222*9880d681SAndroid Build Coastguard Worker     *dot = p++;
223*9880d681SAndroid Build Coastguard Worker 
224*9880d681SAndroid Build Coastguard Worker     assert(end - begin != 1 && "Significand has no digits");
225*9880d681SAndroid Build Coastguard Worker 
226*9880d681SAndroid Build Coastguard Worker     while (p != end && *p == '0')
227*9880d681SAndroid Build Coastguard Worker       p++;
228*9880d681SAndroid Build Coastguard Worker   }
229*9880d681SAndroid Build Coastguard Worker 
230*9880d681SAndroid Build Coastguard Worker   return p;
231*9880d681SAndroid Build Coastguard Worker }
232*9880d681SAndroid Build Coastguard Worker 
233*9880d681SAndroid Build Coastguard Worker /* Given a normal decimal floating point number of the form
234*9880d681SAndroid Build Coastguard Worker 
235*9880d681SAndroid Build Coastguard Worker      dddd.dddd[eE][+-]ddd
236*9880d681SAndroid Build Coastguard Worker 
237*9880d681SAndroid Build Coastguard Worker    where the decimal point and exponent are optional, fill out the
238*9880d681SAndroid Build Coastguard Worker    structure D.  Exponent is appropriate if the significand is
239*9880d681SAndroid Build Coastguard Worker    treated as an integer, and normalizedExponent if the significand
240*9880d681SAndroid Build Coastguard Worker    is taken to have the decimal point after a single leading
241*9880d681SAndroid Build Coastguard Worker    non-zero digit.
242*9880d681SAndroid Build Coastguard Worker 
243*9880d681SAndroid Build Coastguard Worker    If the value is zero, V->firstSigDigit points to a non-digit, and
244*9880d681SAndroid Build Coastguard Worker    the return exponent is zero.
245*9880d681SAndroid Build Coastguard Worker */
246*9880d681SAndroid Build Coastguard Worker struct decimalInfo {
247*9880d681SAndroid Build Coastguard Worker   const char *firstSigDigit;
248*9880d681SAndroid Build Coastguard Worker   const char *lastSigDigit;
249*9880d681SAndroid Build Coastguard Worker   int exponent;
250*9880d681SAndroid Build Coastguard Worker   int normalizedExponent;
251*9880d681SAndroid Build Coastguard Worker };
252*9880d681SAndroid Build Coastguard Worker 
253*9880d681SAndroid Build Coastguard Worker static void
interpretDecimal(StringRef::iterator begin,StringRef::iterator end,decimalInfo * D)254*9880d681SAndroid Build Coastguard Worker interpretDecimal(StringRef::iterator begin, StringRef::iterator end,
255*9880d681SAndroid Build Coastguard Worker                  decimalInfo *D)
256*9880d681SAndroid Build Coastguard Worker {
257*9880d681SAndroid Build Coastguard Worker   StringRef::iterator dot = end;
258*9880d681SAndroid Build Coastguard Worker   StringRef::iterator p = skipLeadingZeroesAndAnyDot (begin, end, &dot);
259*9880d681SAndroid Build Coastguard Worker 
260*9880d681SAndroid Build Coastguard Worker   D->firstSigDigit = p;
261*9880d681SAndroid Build Coastguard Worker   D->exponent = 0;
262*9880d681SAndroid Build Coastguard Worker   D->normalizedExponent = 0;
263*9880d681SAndroid Build Coastguard Worker 
264*9880d681SAndroid Build Coastguard Worker   for (; p != end; ++p) {
265*9880d681SAndroid Build Coastguard Worker     if (*p == '.') {
266*9880d681SAndroid Build Coastguard Worker       assert(dot == end && "String contains multiple dots");
267*9880d681SAndroid Build Coastguard Worker       dot = p++;
268*9880d681SAndroid Build Coastguard Worker       if (p == end)
269*9880d681SAndroid Build Coastguard Worker         break;
270*9880d681SAndroid Build Coastguard Worker     }
271*9880d681SAndroid Build Coastguard Worker     if (decDigitValue(*p) >= 10U)
272*9880d681SAndroid Build Coastguard Worker       break;
273*9880d681SAndroid Build Coastguard Worker   }
274*9880d681SAndroid Build Coastguard Worker 
275*9880d681SAndroid Build Coastguard Worker   if (p != end) {
276*9880d681SAndroid Build Coastguard Worker     assert((*p == 'e' || *p == 'E') && "Invalid character in significand");
277*9880d681SAndroid Build Coastguard Worker     assert(p != begin && "Significand has no digits");
278*9880d681SAndroid Build Coastguard Worker     assert((dot == end || p - begin != 1) && "Significand has no digits");
279*9880d681SAndroid Build Coastguard Worker 
280*9880d681SAndroid Build Coastguard Worker     /* p points to the first non-digit in the string */
281*9880d681SAndroid Build Coastguard Worker     D->exponent = readExponent(p + 1, end);
282*9880d681SAndroid Build Coastguard Worker 
283*9880d681SAndroid Build Coastguard Worker     /* Implied decimal point?  */
284*9880d681SAndroid Build Coastguard Worker     if (dot == end)
285*9880d681SAndroid Build Coastguard Worker       dot = p;
286*9880d681SAndroid Build Coastguard Worker   }
287*9880d681SAndroid Build Coastguard Worker 
288*9880d681SAndroid Build Coastguard Worker   /* If number is all zeroes accept any exponent.  */
289*9880d681SAndroid Build Coastguard Worker   if (p != D->firstSigDigit) {
290*9880d681SAndroid Build Coastguard Worker     /* Drop insignificant trailing zeroes.  */
291*9880d681SAndroid Build Coastguard Worker     if (p != begin) {
292*9880d681SAndroid Build Coastguard Worker       do
293*9880d681SAndroid Build Coastguard Worker         do
294*9880d681SAndroid Build Coastguard Worker           p--;
295*9880d681SAndroid Build Coastguard Worker         while (p != begin && *p == '0');
296*9880d681SAndroid Build Coastguard Worker       while (p != begin && *p == '.');
297*9880d681SAndroid Build Coastguard Worker     }
298*9880d681SAndroid Build Coastguard Worker 
299*9880d681SAndroid Build Coastguard Worker     /* Adjust the exponents for any decimal point.  */
300*9880d681SAndroid Build Coastguard Worker     D->exponent += static_cast<APFloat::ExponentType>((dot - p) - (dot > p));
301*9880d681SAndroid Build Coastguard Worker     D->normalizedExponent = (D->exponent +
302*9880d681SAndroid Build Coastguard Worker               static_cast<APFloat::ExponentType>((p - D->firstSigDigit)
303*9880d681SAndroid Build Coastguard Worker                                       - (dot > D->firstSigDigit && dot < p)));
304*9880d681SAndroid Build Coastguard Worker   }
305*9880d681SAndroid Build Coastguard Worker 
306*9880d681SAndroid Build Coastguard Worker   D->lastSigDigit = p;
307*9880d681SAndroid Build Coastguard Worker }
308*9880d681SAndroid Build Coastguard Worker 
309*9880d681SAndroid Build Coastguard Worker /* Return the trailing fraction of a hexadecimal number.
310*9880d681SAndroid Build Coastguard Worker    DIGITVALUE is the first hex digit of the fraction, P points to
311*9880d681SAndroid Build Coastguard Worker    the next digit.  */
312*9880d681SAndroid Build Coastguard Worker static lostFraction
trailingHexadecimalFraction(StringRef::iterator p,StringRef::iterator end,unsigned int digitValue)313*9880d681SAndroid Build Coastguard Worker trailingHexadecimalFraction(StringRef::iterator p, StringRef::iterator end,
314*9880d681SAndroid Build Coastguard Worker                             unsigned int digitValue)
315*9880d681SAndroid Build Coastguard Worker {
316*9880d681SAndroid Build Coastguard Worker   unsigned int hexDigit;
317*9880d681SAndroid Build Coastguard Worker 
318*9880d681SAndroid Build Coastguard Worker   /* If the first trailing digit isn't 0 or 8 we can work out the
319*9880d681SAndroid Build Coastguard Worker      fraction immediately.  */
320*9880d681SAndroid Build Coastguard Worker   if (digitValue > 8)
321*9880d681SAndroid Build Coastguard Worker     return lfMoreThanHalf;
322*9880d681SAndroid Build Coastguard Worker   else if (digitValue < 8 && digitValue > 0)
323*9880d681SAndroid Build Coastguard Worker     return lfLessThanHalf;
324*9880d681SAndroid Build Coastguard Worker 
325*9880d681SAndroid Build Coastguard Worker   // Otherwise we need to find the first non-zero digit.
326*9880d681SAndroid Build Coastguard Worker   while (p != end && (*p == '0' || *p == '.'))
327*9880d681SAndroid Build Coastguard Worker     p++;
328*9880d681SAndroid Build Coastguard Worker 
329*9880d681SAndroid Build Coastguard Worker   assert(p != end && "Invalid trailing hexadecimal fraction!");
330*9880d681SAndroid Build Coastguard Worker 
331*9880d681SAndroid Build Coastguard Worker   hexDigit = hexDigitValue(*p);
332*9880d681SAndroid Build Coastguard Worker 
333*9880d681SAndroid Build Coastguard Worker   /* If we ran off the end it is exactly zero or one-half, otherwise
334*9880d681SAndroid Build Coastguard Worker      a little more.  */
335*9880d681SAndroid Build Coastguard Worker   if (hexDigit == -1U)
336*9880d681SAndroid Build Coastguard Worker     return digitValue == 0 ? lfExactlyZero: lfExactlyHalf;
337*9880d681SAndroid Build Coastguard Worker   else
338*9880d681SAndroid Build Coastguard Worker     return digitValue == 0 ? lfLessThanHalf: lfMoreThanHalf;
339*9880d681SAndroid Build Coastguard Worker }
340*9880d681SAndroid Build Coastguard Worker 
341*9880d681SAndroid Build Coastguard Worker /* Return the fraction lost were a bignum truncated losing the least
342*9880d681SAndroid Build Coastguard Worker    significant BITS bits.  */
343*9880d681SAndroid Build Coastguard Worker static lostFraction
lostFractionThroughTruncation(const integerPart * parts,unsigned int partCount,unsigned int bits)344*9880d681SAndroid Build Coastguard Worker lostFractionThroughTruncation(const integerPart *parts,
345*9880d681SAndroid Build Coastguard Worker                               unsigned int partCount,
346*9880d681SAndroid Build Coastguard Worker                               unsigned int bits)
347*9880d681SAndroid Build Coastguard Worker {
348*9880d681SAndroid Build Coastguard Worker   unsigned int lsb;
349*9880d681SAndroid Build Coastguard Worker 
350*9880d681SAndroid Build Coastguard Worker   lsb = APInt::tcLSB(parts, partCount);
351*9880d681SAndroid Build Coastguard Worker 
352*9880d681SAndroid Build Coastguard Worker   /* Note this is guaranteed true if bits == 0, or LSB == -1U.  */
353*9880d681SAndroid Build Coastguard Worker   if (bits <= lsb)
354*9880d681SAndroid Build Coastguard Worker     return lfExactlyZero;
355*9880d681SAndroid Build Coastguard Worker   if (bits == lsb + 1)
356*9880d681SAndroid Build Coastguard Worker     return lfExactlyHalf;
357*9880d681SAndroid Build Coastguard Worker   if (bits <= partCount * integerPartWidth &&
358*9880d681SAndroid Build Coastguard Worker       APInt::tcExtractBit(parts, bits - 1))
359*9880d681SAndroid Build Coastguard Worker     return lfMoreThanHalf;
360*9880d681SAndroid Build Coastguard Worker 
361*9880d681SAndroid Build Coastguard Worker   return lfLessThanHalf;
362*9880d681SAndroid Build Coastguard Worker }
363*9880d681SAndroid Build Coastguard Worker 
364*9880d681SAndroid Build Coastguard Worker /* Shift DST right BITS bits noting lost fraction.  */
365*9880d681SAndroid Build Coastguard Worker static lostFraction
shiftRight(integerPart * dst,unsigned int parts,unsigned int bits)366*9880d681SAndroid Build Coastguard Worker shiftRight(integerPart *dst, unsigned int parts, unsigned int bits)
367*9880d681SAndroid Build Coastguard Worker {
368*9880d681SAndroid Build Coastguard Worker   lostFraction lost_fraction;
369*9880d681SAndroid Build Coastguard Worker 
370*9880d681SAndroid Build Coastguard Worker   lost_fraction = lostFractionThroughTruncation(dst, parts, bits);
371*9880d681SAndroid Build Coastguard Worker 
372*9880d681SAndroid Build Coastguard Worker   APInt::tcShiftRight(dst, parts, bits);
373*9880d681SAndroid Build Coastguard Worker 
374*9880d681SAndroid Build Coastguard Worker   return lost_fraction;
375*9880d681SAndroid Build Coastguard Worker }
376*9880d681SAndroid Build Coastguard Worker 
377*9880d681SAndroid Build Coastguard Worker /* Combine the effect of two lost fractions.  */
378*9880d681SAndroid Build Coastguard Worker static lostFraction
combineLostFractions(lostFraction moreSignificant,lostFraction lessSignificant)379*9880d681SAndroid Build Coastguard Worker combineLostFractions(lostFraction moreSignificant,
380*9880d681SAndroid Build Coastguard Worker                      lostFraction lessSignificant)
381*9880d681SAndroid Build Coastguard Worker {
382*9880d681SAndroid Build Coastguard Worker   if (lessSignificant != lfExactlyZero) {
383*9880d681SAndroid Build Coastguard Worker     if (moreSignificant == lfExactlyZero)
384*9880d681SAndroid Build Coastguard Worker       moreSignificant = lfLessThanHalf;
385*9880d681SAndroid Build Coastguard Worker     else if (moreSignificant == lfExactlyHalf)
386*9880d681SAndroid Build Coastguard Worker       moreSignificant = lfMoreThanHalf;
387*9880d681SAndroid Build Coastguard Worker   }
388*9880d681SAndroid Build Coastguard Worker 
389*9880d681SAndroid Build Coastguard Worker   return moreSignificant;
390*9880d681SAndroid Build Coastguard Worker }
391*9880d681SAndroid Build Coastguard Worker 
392*9880d681SAndroid Build Coastguard Worker /* The error from the true value, in half-ulps, on multiplying two
393*9880d681SAndroid Build Coastguard Worker    floating point numbers, which differ from the value they
394*9880d681SAndroid Build Coastguard Worker    approximate by at most HUE1 and HUE2 half-ulps, is strictly less
395*9880d681SAndroid Build Coastguard Worker    than the returned value.
396*9880d681SAndroid Build Coastguard Worker 
397*9880d681SAndroid Build Coastguard Worker    See "How to Read Floating Point Numbers Accurately" by William D
398*9880d681SAndroid Build Coastguard Worker    Clinger.  */
399*9880d681SAndroid Build Coastguard Worker static unsigned int
HUerrBound(bool inexactMultiply,unsigned int HUerr1,unsigned int HUerr2)400*9880d681SAndroid Build Coastguard Worker HUerrBound(bool inexactMultiply, unsigned int HUerr1, unsigned int HUerr2)
401*9880d681SAndroid Build Coastguard Worker {
402*9880d681SAndroid Build Coastguard Worker   assert(HUerr1 < 2 || HUerr2 < 2 || (HUerr1 + HUerr2 < 8));
403*9880d681SAndroid Build Coastguard Worker 
404*9880d681SAndroid Build Coastguard Worker   if (HUerr1 + HUerr2 == 0)
405*9880d681SAndroid Build Coastguard Worker     return inexactMultiply * 2;  /* <= inexactMultiply half-ulps.  */
406*9880d681SAndroid Build Coastguard Worker   else
407*9880d681SAndroid Build Coastguard Worker     return inexactMultiply + 2 * (HUerr1 + HUerr2);
408*9880d681SAndroid Build Coastguard Worker }
409*9880d681SAndroid Build Coastguard Worker 
410*9880d681SAndroid Build Coastguard Worker /* The number of ulps from the boundary (zero, or half if ISNEAREST)
411*9880d681SAndroid Build Coastguard Worker    when the least significant BITS are truncated.  BITS cannot be
412*9880d681SAndroid Build Coastguard Worker    zero.  */
413*9880d681SAndroid Build Coastguard Worker static integerPart
ulpsFromBoundary(const integerPart * parts,unsigned int bits,bool isNearest)414*9880d681SAndroid Build Coastguard Worker ulpsFromBoundary(const integerPart *parts, unsigned int bits, bool isNearest)
415*9880d681SAndroid Build Coastguard Worker {
416*9880d681SAndroid Build Coastguard Worker   unsigned int count, partBits;
417*9880d681SAndroid Build Coastguard Worker   integerPart part, boundary;
418*9880d681SAndroid Build Coastguard Worker 
419*9880d681SAndroid Build Coastguard Worker   assert(bits != 0);
420*9880d681SAndroid Build Coastguard Worker 
421*9880d681SAndroid Build Coastguard Worker   bits--;
422*9880d681SAndroid Build Coastguard Worker   count = bits / integerPartWidth;
423*9880d681SAndroid Build Coastguard Worker   partBits = bits % integerPartWidth + 1;
424*9880d681SAndroid Build Coastguard Worker 
425*9880d681SAndroid Build Coastguard Worker   part = parts[count] & (~(integerPart) 0 >> (integerPartWidth - partBits));
426*9880d681SAndroid Build Coastguard Worker 
427*9880d681SAndroid Build Coastguard Worker   if (isNearest)
428*9880d681SAndroid Build Coastguard Worker     boundary = (integerPart) 1 << (partBits - 1);
429*9880d681SAndroid Build Coastguard Worker   else
430*9880d681SAndroid Build Coastguard Worker     boundary = 0;
431*9880d681SAndroid Build Coastguard Worker 
432*9880d681SAndroid Build Coastguard Worker   if (count == 0) {
433*9880d681SAndroid Build Coastguard Worker     if (part - boundary <= boundary - part)
434*9880d681SAndroid Build Coastguard Worker       return part - boundary;
435*9880d681SAndroid Build Coastguard Worker     else
436*9880d681SAndroid Build Coastguard Worker       return boundary - part;
437*9880d681SAndroid Build Coastguard Worker   }
438*9880d681SAndroid Build Coastguard Worker 
439*9880d681SAndroid Build Coastguard Worker   if (part == boundary) {
440*9880d681SAndroid Build Coastguard Worker     while (--count)
441*9880d681SAndroid Build Coastguard Worker       if (parts[count])
442*9880d681SAndroid Build Coastguard Worker         return ~(integerPart) 0; /* A lot.  */
443*9880d681SAndroid Build Coastguard Worker 
444*9880d681SAndroid Build Coastguard Worker     return parts[0];
445*9880d681SAndroid Build Coastguard Worker   } else if (part == boundary - 1) {
446*9880d681SAndroid Build Coastguard Worker     while (--count)
447*9880d681SAndroid Build Coastguard Worker       if (~parts[count])
448*9880d681SAndroid Build Coastguard Worker         return ~(integerPart) 0; /* A lot.  */
449*9880d681SAndroid Build Coastguard Worker 
450*9880d681SAndroid Build Coastguard Worker     return -parts[0];
451*9880d681SAndroid Build Coastguard Worker   }
452*9880d681SAndroid Build Coastguard Worker 
453*9880d681SAndroid Build Coastguard Worker   return ~(integerPart) 0; /* A lot.  */
454*9880d681SAndroid Build Coastguard Worker }
455*9880d681SAndroid Build Coastguard Worker 
456*9880d681SAndroid Build Coastguard Worker /* Place pow(5, power) in DST, and return the number of parts used.
457*9880d681SAndroid Build Coastguard Worker    DST must be at least one part larger than size of the answer.  */
458*9880d681SAndroid Build Coastguard Worker static unsigned int
powerOf5(integerPart * dst,unsigned int power)459*9880d681SAndroid Build Coastguard Worker powerOf5(integerPart *dst, unsigned int power)
460*9880d681SAndroid Build Coastguard Worker {
461*9880d681SAndroid Build Coastguard Worker   static const integerPart firstEightPowers[] = { 1, 5, 25, 125, 625, 3125,
462*9880d681SAndroid Build Coastguard Worker                                                   15625, 78125 };
463*9880d681SAndroid Build Coastguard Worker   integerPart pow5s[maxPowerOfFiveParts * 2 + 5];
464*9880d681SAndroid Build Coastguard Worker   pow5s[0] = 78125 * 5;
465*9880d681SAndroid Build Coastguard Worker 
466*9880d681SAndroid Build Coastguard Worker   unsigned int partsCount[16] = { 1 };
467*9880d681SAndroid Build Coastguard Worker   integerPart scratch[maxPowerOfFiveParts], *p1, *p2, *pow5;
468*9880d681SAndroid Build Coastguard Worker   unsigned int result;
469*9880d681SAndroid Build Coastguard Worker   assert(power <= maxExponent);
470*9880d681SAndroid Build Coastguard Worker 
471*9880d681SAndroid Build Coastguard Worker   p1 = dst;
472*9880d681SAndroid Build Coastguard Worker   p2 = scratch;
473*9880d681SAndroid Build Coastguard Worker 
474*9880d681SAndroid Build Coastguard Worker   *p1 = firstEightPowers[power & 7];
475*9880d681SAndroid Build Coastguard Worker   power >>= 3;
476*9880d681SAndroid Build Coastguard Worker 
477*9880d681SAndroid Build Coastguard Worker   result = 1;
478*9880d681SAndroid Build Coastguard Worker   pow5 = pow5s;
479*9880d681SAndroid Build Coastguard Worker 
480*9880d681SAndroid Build Coastguard Worker   for (unsigned int n = 0; power; power >>= 1, n++) {
481*9880d681SAndroid Build Coastguard Worker     unsigned int pc;
482*9880d681SAndroid Build Coastguard Worker 
483*9880d681SAndroid Build Coastguard Worker     pc = partsCount[n];
484*9880d681SAndroid Build Coastguard Worker 
485*9880d681SAndroid Build Coastguard Worker     /* Calculate pow(5,pow(2,n+3)) if we haven't yet.  */
486*9880d681SAndroid Build Coastguard Worker     if (pc == 0) {
487*9880d681SAndroid Build Coastguard Worker       pc = partsCount[n - 1];
488*9880d681SAndroid Build Coastguard Worker       APInt::tcFullMultiply(pow5, pow5 - pc, pow5 - pc, pc, pc);
489*9880d681SAndroid Build Coastguard Worker       pc *= 2;
490*9880d681SAndroid Build Coastguard Worker       if (pow5[pc - 1] == 0)
491*9880d681SAndroid Build Coastguard Worker         pc--;
492*9880d681SAndroid Build Coastguard Worker       partsCount[n] = pc;
493*9880d681SAndroid Build Coastguard Worker     }
494*9880d681SAndroid Build Coastguard Worker 
495*9880d681SAndroid Build Coastguard Worker     if (power & 1) {
496*9880d681SAndroid Build Coastguard Worker       integerPart *tmp;
497*9880d681SAndroid Build Coastguard Worker 
498*9880d681SAndroid Build Coastguard Worker       APInt::tcFullMultiply(p2, p1, pow5, result, pc);
499*9880d681SAndroid Build Coastguard Worker       result += pc;
500*9880d681SAndroid Build Coastguard Worker       if (p2[result - 1] == 0)
501*9880d681SAndroid Build Coastguard Worker         result--;
502*9880d681SAndroid Build Coastguard Worker 
503*9880d681SAndroid Build Coastguard Worker       /* Now result is in p1 with partsCount parts and p2 is scratch
504*9880d681SAndroid Build Coastguard Worker          space.  */
505*9880d681SAndroid Build Coastguard Worker       tmp = p1;
506*9880d681SAndroid Build Coastguard Worker       p1 = p2;
507*9880d681SAndroid Build Coastguard Worker       p2 = tmp;
508*9880d681SAndroid Build Coastguard Worker     }
509*9880d681SAndroid Build Coastguard Worker 
510*9880d681SAndroid Build Coastguard Worker     pow5 += pc;
511*9880d681SAndroid Build Coastguard Worker   }
512*9880d681SAndroid Build Coastguard Worker 
513*9880d681SAndroid Build Coastguard Worker   if (p1 != dst)
514*9880d681SAndroid Build Coastguard Worker     APInt::tcAssign(dst, p1, result);
515*9880d681SAndroid Build Coastguard Worker 
516*9880d681SAndroid Build Coastguard Worker   return result;
517*9880d681SAndroid Build Coastguard Worker }
518*9880d681SAndroid Build Coastguard Worker 
519*9880d681SAndroid Build Coastguard Worker /* Zero at the end to avoid modular arithmetic when adding one; used
520*9880d681SAndroid Build Coastguard Worker    when rounding up during hexadecimal output.  */
521*9880d681SAndroid Build Coastguard Worker static const char hexDigitsLower[] = "0123456789abcdef0";
522*9880d681SAndroid Build Coastguard Worker static const char hexDigitsUpper[] = "0123456789ABCDEF0";
523*9880d681SAndroid Build Coastguard Worker static const char infinityL[] = "infinity";
524*9880d681SAndroid Build Coastguard Worker static const char infinityU[] = "INFINITY";
525*9880d681SAndroid Build Coastguard Worker static const char NaNL[] = "nan";
526*9880d681SAndroid Build Coastguard Worker static const char NaNU[] = "NAN";
527*9880d681SAndroid Build Coastguard Worker 
528*9880d681SAndroid Build Coastguard Worker /* Write out an integerPart in hexadecimal, starting with the most
529*9880d681SAndroid Build Coastguard Worker    significant nibble.  Write out exactly COUNT hexdigits, return
530*9880d681SAndroid Build Coastguard Worker    COUNT.  */
531*9880d681SAndroid Build Coastguard Worker static unsigned int
partAsHex(char * dst,integerPart part,unsigned int count,const char * hexDigitChars)532*9880d681SAndroid Build Coastguard Worker partAsHex (char *dst, integerPart part, unsigned int count,
533*9880d681SAndroid Build Coastguard Worker            const char *hexDigitChars)
534*9880d681SAndroid Build Coastguard Worker {
535*9880d681SAndroid Build Coastguard Worker   unsigned int result = count;
536*9880d681SAndroid Build Coastguard Worker 
537*9880d681SAndroid Build Coastguard Worker   assert(count != 0 && count <= integerPartWidth / 4);
538*9880d681SAndroid Build Coastguard Worker 
539*9880d681SAndroid Build Coastguard Worker   part >>= (integerPartWidth - 4 * count);
540*9880d681SAndroid Build Coastguard Worker   while (count--) {
541*9880d681SAndroid Build Coastguard Worker     dst[count] = hexDigitChars[part & 0xf];
542*9880d681SAndroid Build Coastguard Worker     part >>= 4;
543*9880d681SAndroid Build Coastguard Worker   }
544*9880d681SAndroid Build Coastguard Worker 
545*9880d681SAndroid Build Coastguard Worker   return result;
546*9880d681SAndroid Build Coastguard Worker }
547*9880d681SAndroid Build Coastguard Worker 
548*9880d681SAndroid Build Coastguard Worker /* Write out an unsigned decimal integer.  */
549*9880d681SAndroid Build Coastguard Worker static char *
writeUnsignedDecimal(char * dst,unsigned int n)550*9880d681SAndroid Build Coastguard Worker writeUnsignedDecimal (char *dst, unsigned int n)
551*9880d681SAndroid Build Coastguard Worker {
552*9880d681SAndroid Build Coastguard Worker   char buff[40], *p;
553*9880d681SAndroid Build Coastguard Worker 
554*9880d681SAndroid Build Coastguard Worker   p = buff;
555*9880d681SAndroid Build Coastguard Worker   do
556*9880d681SAndroid Build Coastguard Worker     *p++ = '0' + n % 10;
557*9880d681SAndroid Build Coastguard Worker   while (n /= 10);
558*9880d681SAndroid Build Coastguard Worker 
559*9880d681SAndroid Build Coastguard Worker   do
560*9880d681SAndroid Build Coastguard Worker     *dst++ = *--p;
561*9880d681SAndroid Build Coastguard Worker   while (p != buff);
562*9880d681SAndroid Build Coastguard Worker 
563*9880d681SAndroid Build Coastguard Worker   return dst;
564*9880d681SAndroid Build Coastguard Worker }
565*9880d681SAndroid Build Coastguard Worker 
566*9880d681SAndroid Build Coastguard Worker /* Write out a signed decimal integer.  */
567*9880d681SAndroid Build Coastguard Worker static char *
writeSignedDecimal(char * dst,int value)568*9880d681SAndroid Build Coastguard Worker writeSignedDecimal (char *dst, int value)
569*9880d681SAndroid Build Coastguard Worker {
570*9880d681SAndroid Build Coastguard Worker   if (value < 0) {
571*9880d681SAndroid Build Coastguard Worker     *dst++ = '-';
572*9880d681SAndroid Build Coastguard Worker     dst = writeUnsignedDecimal(dst, -(unsigned) value);
573*9880d681SAndroid Build Coastguard Worker   } else
574*9880d681SAndroid Build Coastguard Worker     dst = writeUnsignedDecimal(dst, value);
575*9880d681SAndroid Build Coastguard Worker 
576*9880d681SAndroid Build Coastguard Worker   return dst;
577*9880d681SAndroid Build Coastguard Worker }
578*9880d681SAndroid Build Coastguard Worker 
579*9880d681SAndroid Build Coastguard Worker /* Constructors.  */
580*9880d681SAndroid Build Coastguard Worker void
initialize(const fltSemantics * ourSemantics)581*9880d681SAndroid Build Coastguard Worker APFloat::initialize(const fltSemantics *ourSemantics)
582*9880d681SAndroid Build Coastguard Worker {
583*9880d681SAndroid Build Coastguard Worker   unsigned int count;
584*9880d681SAndroid Build Coastguard Worker 
585*9880d681SAndroid Build Coastguard Worker   semantics = ourSemantics;
586*9880d681SAndroid Build Coastguard Worker   count = partCount();
587*9880d681SAndroid Build Coastguard Worker   if (count > 1)
588*9880d681SAndroid Build Coastguard Worker     significand.parts = new integerPart[count];
589*9880d681SAndroid Build Coastguard Worker }
590*9880d681SAndroid Build Coastguard Worker 
591*9880d681SAndroid Build Coastguard Worker void
freeSignificand()592*9880d681SAndroid Build Coastguard Worker APFloat::freeSignificand()
593*9880d681SAndroid Build Coastguard Worker {
594*9880d681SAndroid Build Coastguard Worker   if (needsCleanup())
595*9880d681SAndroid Build Coastguard Worker     delete [] significand.parts;
596*9880d681SAndroid Build Coastguard Worker }
597*9880d681SAndroid Build Coastguard Worker 
598*9880d681SAndroid Build Coastguard Worker void
assign(const APFloat & rhs)599*9880d681SAndroid Build Coastguard Worker APFloat::assign(const APFloat &rhs)
600*9880d681SAndroid Build Coastguard Worker {
601*9880d681SAndroid Build Coastguard Worker   assert(semantics == rhs.semantics);
602*9880d681SAndroid Build Coastguard Worker 
603*9880d681SAndroid Build Coastguard Worker   sign = rhs.sign;
604*9880d681SAndroid Build Coastguard Worker   category = rhs.category;
605*9880d681SAndroid Build Coastguard Worker   exponent = rhs.exponent;
606*9880d681SAndroid Build Coastguard Worker   if (isFiniteNonZero() || category == fcNaN)
607*9880d681SAndroid Build Coastguard Worker     copySignificand(rhs);
608*9880d681SAndroid Build Coastguard Worker }
609*9880d681SAndroid Build Coastguard Worker 
610*9880d681SAndroid Build Coastguard Worker void
copySignificand(const APFloat & rhs)611*9880d681SAndroid Build Coastguard Worker APFloat::copySignificand(const APFloat &rhs)
612*9880d681SAndroid Build Coastguard Worker {
613*9880d681SAndroid Build Coastguard Worker   assert(isFiniteNonZero() || category == fcNaN);
614*9880d681SAndroid Build Coastguard Worker   assert(rhs.partCount() >= partCount());
615*9880d681SAndroid Build Coastguard Worker 
616*9880d681SAndroid Build Coastguard Worker   APInt::tcAssign(significandParts(), rhs.significandParts(),
617*9880d681SAndroid Build Coastguard Worker                   partCount());
618*9880d681SAndroid Build Coastguard Worker }
619*9880d681SAndroid Build Coastguard Worker 
620*9880d681SAndroid Build Coastguard Worker /* Make this number a NaN, with an arbitrary but deterministic value
621*9880d681SAndroid Build Coastguard Worker    for the significand.  If double or longer, this is a signalling NaN,
622*9880d681SAndroid Build Coastguard Worker    which may not be ideal.  If float, this is QNaN(0).  */
makeNaN(bool SNaN,bool Negative,const APInt * fill)623*9880d681SAndroid Build Coastguard Worker void APFloat::makeNaN(bool SNaN, bool Negative, const APInt *fill)
624*9880d681SAndroid Build Coastguard Worker {
625*9880d681SAndroid Build Coastguard Worker   category = fcNaN;
626*9880d681SAndroid Build Coastguard Worker   sign = Negative;
627*9880d681SAndroid Build Coastguard Worker 
628*9880d681SAndroid Build Coastguard Worker   integerPart *significand = significandParts();
629*9880d681SAndroid Build Coastguard Worker   unsigned numParts = partCount();
630*9880d681SAndroid Build Coastguard Worker 
631*9880d681SAndroid Build Coastguard Worker   // Set the significand bits to the fill.
632*9880d681SAndroid Build Coastguard Worker   if (!fill || fill->getNumWords() < numParts)
633*9880d681SAndroid Build Coastguard Worker     APInt::tcSet(significand, 0, numParts);
634*9880d681SAndroid Build Coastguard Worker   if (fill) {
635*9880d681SAndroid Build Coastguard Worker     APInt::tcAssign(significand, fill->getRawData(),
636*9880d681SAndroid Build Coastguard Worker                     std::min(fill->getNumWords(), numParts));
637*9880d681SAndroid Build Coastguard Worker 
638*9880d681SAndroid Build Coastguard Worker     // Zero out the excess bits of the significand.
639*9880d681SAndroid Build Coastguard Worker     unsigned bitsToPreserve = semantics->precision - 1;
640*9880d681SAndroid Build Coastguard Worker     unsigned part = bitsToPreserve / 64;
641*9880d681SAndroid Build Coastguard Worker     bitsToPreserve %= 64;
642*9880d681SAndroid Build Coastguard Worker     significand[part] &= ((1ULL << bitsToPreserve) - 1);
643*9880d681SAndroid Build Coastguard Worker     for (part++; part != numParts; ++part)
644*9880d681SAndroid Build Coastguard Worker       significand[part] = 0;
645*9880d681SAndroid Build Coastguard Worker   }
646*9880d681SAndroid Build Coastguard Worker 
647*9880d681SAndroid Build Coastguard Worker   unsigned QNaNBit = semantics->precision - 2;
648*9880d681SAndroid Build Coastguard Worker 
649*9880d681SAndroid Build Coastguard Worker   if (SNaN) {
650*9880d681SAndroid Build Coastguard Worker     // We always have to clear the QNaN bit to make it an SNaN.
651*9880d681SAndroid Build Coastguard Worker     APInt::tcClearBit(significand, QNaNBit);
652*9880d681SAndroid Build Coastguard Worker 
653*9880d681SAndroid Build Coastguard Worker     // If there are no bits set in the payload, we have to set
654*9880d681SAndroid Build Coastguard Worker     // *something* to make it a NaN instead of an infinity;
655*9880d681SAndroid Build Coastguard Worker     // conventionally, this is the next bit down from the QNaN bit.
656*9880d681SAndroid Build Coastguard Worker     if (APInt::tcIsZero(significand, numParts))
657*9880d681SAndroid Build Coastguard Worker       APInt::tcSetBit(significand, QNaNBit - 1);
658*9880d681SAndroid Build Coastguard Worker   } else {
659*9880d681SAndroid Build Coastguard Worker     // We always have to set the QNaN bit to make it a QNaN.
660*9880d681SAndroid Build Coastguard Worker     APInt::tcSetBit(significand, QNaNBit);
661*9880d681SAndroid Build Coastguard Worker   }
662*9880d681SAndroid Build Coastguard Worker 
663*9880d681SAndroid Build Coastguard Worker   // For x87 extended precision, we want to make a NaN, not a
664*9880d681SAndroid Build Coastguard Worker   // pseudo-NaN.  Maybe we should expose the ability to make
665*9880d681SAndroid Build Coastguard Worker   // pseudo-NaNs?
666*9880d681SAndroid Build Coastguard Worker   if (semantics == &APFloat::x87DoubleExtended)
667*9880d681SAndroid Build Coastguard Worker     APInt::tcSetBit(significand, QNaNBit + 1);
668*9880d681SAndroid Build Coastguard Worker }
669*9880d681SAndroid Build Coastguard Worker 
makeNaN(const fltSemantics & Sem,bool SNaN,bool Negative,const APInt * fill)670*9880d681SAndroid Build Coastguard Worker APFloat APFloat::makeNaN(const fltSemantics &Sem, bool SNaN, bool Negative,
671*9880d681SAndroid Build Coastguard Worker                          const APInt *fill) {
672*9880d681SAndroid Build Coastguard Worker   APFloat value(Sem, uninitialized);
673*9880d681SAndroid Build Coastguard Worker   value.makeNaN(SNaN, Negative, fill);
674*9880d681SAndroid Build Coastguard Worker   return value;
675*9880d681SAndroid Build Coastguard Worker }
676*9880d681SAndroid Build Coastguard Worker 
677*9880d681SAndroid Build Coastguard Worker APFloat &
operator =(const APFloat & rhs)678*9880d681SAndroid Build Coastguard Worker APFloat::operator=(const APFloat &rhs)
679*9880d681SAndroid Build Coastguard Worker {
680*9880d681SAndroid Build Coastguard Worker   if (this != &rhs) {
681*9880d681SAndroid Build Coastguard Worker     if (semantics != rhs.semantics) {
682*9880d681SAndroid Build Coastguard Worker       freeSignificand();
683*9880d681SAndroid Build Coastguard Worker       initialize(rhs.semantics);
684*9880d681SAndroid Build Coastguard Worker     }
685*9880d681SAndroid Build Coastguard Worker     assign(rhs);
686*9880d681SAndroid Build Coastguard Worker   }
687*9880d681SAndroid Build Coastguard Worker 
688*9880d681SAndroid Build Coastguard Worker   return *this;
689*9880d681SAndroid Build Coastguard Worker }
690*9880d681SAndroid Build Coastguard Worker 
691*9880d681SAndroid Build Coastguard Worker APFloat &
operator =(APFloat && rhs)692*9880d681SAndroid Build Coastguard Worker APFloat::operator=(APFloat &&rhs) {
693*9880d681SAndroid Build Coastguard Worker   freeSignificand();
694*9880d681SAndroid Build Coastguard Worker 
695*9880d681SAndroid Build Coastguard Worker   semantics = rhs.semantics;
696*9880d681SAndroid Build Coastguard Worker   significand = rhs.significand;
697*9880d681SAndroid Build Coastguard Worker   exponent = rhs.exponent;
698*9880d681SAndroid Build Coastguard Worker   category = rhs.category;
699*9880d681SAndroid Build Coastguard Worker   sign = rhs.sign;
700*9880d681SAndroid Build Coastguard Worker 
701*9880d681SAndroid Build Coastguard Worker   rhs.semantics = &Bogus;
702*9880d681SAndroid Build Coastguard Worker   return *this;
703*9880d681SAndroid Build Coastguard Worker }
704*9880d681SAndroid Build Coastguard Worker 
705*9880d681SAndroid Build Coastguard Worker bool
isDenormal() const706*9880d681SAndroid Build Coastguard Worker APFloat::isDenormal() const {
707*9880d681SAndroid Build Coastguard Worker   return isFiniteNonZero() && (exponent == semantics->minExponent) &&
708*9880d681SAndroid Build Coastguard Worker          (APInt::tcExtractBit(significandParts(),
709*9880d681SAndroid Build Coastguard Worker                               semantics->precision - 1) == 0);
710*9880d681SAndroid Build Coastguard Worker }
711*9880d681SAndroid Build Coastguard Worker 
712*9880d681SAndroid Build Coastguard Worker bool
isSmallest() const713*9880d681SAndroid Build Coastguard Worker APFloat::isSmallest() const {
714*9880d681SAndroid Build Coastguard Worker   // The smallest number by magnitude in our format will be the smallest
715*9880d681SAndroid Build Coastguard Worker   // denormal, i.e. the floating point number with exponent being minimum
716*9880d681SAndroid Build Coastguard Worker   // exponent and significand bitwise equal to 1 (i.e. with MSB equal to 0).
717*9880d681SAndroid Build Coastguard Worker   return isFiniteNonZero() && exponent == semantics->minExponent &&
718*9880d681SAndroid Build Coastguard Worker     significandMSB() == 0;
719*9880d681SAndroid Build Coastguard Worker }
720*9880d681SAndroid Build Coastguard Worker 
isSignificandAllOnes() const721*9880d681SAndroid Build Coastguard Worker bool APFloat::isSignificandAllOnes() const {
722*9880d681SAndroid Build Coastguard Worker   // Test if the significand excluding the integral bit is all ones. This allows
723*9880d681SAndroid Build Coastguard Worker   // us to test for binade boundaries.
724*9880d681SAndroid Build Coastguard Worker   const integerPart *Parts = significandParts();
725*9880d681SAndroid Build Coastguard Worker   const unsigned PartCount = partCount();
726*9880d681SAndroid Build Coastguard Worker   for (unsigned i = 0; i < PartCount - 1; i++)
727*9880d681SAndroid Build Coastguard Worker     if (~Parts[i])
728*9880d681SAndroid Build Coastguard Worker       return false;
729*9880d681SAndroid Build Coastguard Worker 
730*9880d681SAndroid Build Coastguard Worker   // Set the unused high bits to all ones when we compare.
731*9880d681SAndroid Build Coastguard Worker   const unsigned NumHighBits =
732*9880d681SAndroid Build Coastguard Worker     PartCount*integerPartWidth - semantics->precision + 1;
733*9880d681SAndroid Build Coastguard Worker   assert(NumHighBits <= integerPartWidth && "Can not have more high bits to "
734*9880d681SAndroid Build Coastguard Worker          "fill than integerPartWidth");
735*9880d681SAndroid Build Coastguard Worker   const integerPart HighBitFill =
736*9880d681SAndroid Build Coastguard Worker     ~integerPart(0) << (integerPartWidth - NumHighBits);
737*9880d681SAndroid Build Coastguard Worker   if (~(Parts[PartCount - 1] | HighBitFill))
738*9880d681SAndroid Build Coastguard Worker     return false;
739*9880d681SAndroid Build Coastguard Worker 
740*9880d681SAndroid Build Coastguard Worker   return true;
741*9880d681SAndroid Build Coastguard Worker }
742*9880d681SAndroid Build Coastguard Worker 
isSignificandAllZeros() const743*9880d681SAndroid Build Coastguard Worker bool APFloat::isSignificandAllZeros() const {
744*9880d681SAndroid Build Coastguard Worker   // Test if the significand excluding the integral bit is all zeros. This
745*9880d681SAndroid Build Coastguard Worker   // allows us to test for binade boundaries.
746*9880d681SAndroid Build Coastguard Worker   const integerPart *Parts = significandParts();
747*9880d681SAndroid Build Coastguard Worker   const unsigned PartCount = partCount();
748*9880d681SAndroid Build Coastguard Worker 
749*9880d681SAndroid Build Coastguard Worker   for (unsigned i = 0; i < PartCount - 1; i++)
750*9880d681SAndroid Build Coastguard Worker     if (Parts[i])
751*9880d681SAndroid Build Coastguard Worker       return false;
752*9880d681SAndroid Build Coastguard Worker 
753*9880d681SAndroid Build Coastguard Worker   const unsigned NumHighBits =
754*9880d681SAndroid Build Coastguard Worker     PartCount*integerPartWidth - semantics->precision + 1;
755*9880d681SAndroid Build Coastguard Worker   assert(NumHighBits <= integerPartWidth && "Can not have more high bits to "
756*9880d681SAndroid Build Coastguard Worker          "clear than integerPartWidth");
757*9880d681SAndroid Build Coastguard Worker   const integerPart HighBitMask = ~integerPart(0) >> NumHighBits;
758*9880d681SAndroid Build Coastguard Worker 
759*9880d681SAndroid Build Coastguard Worker   if (Parts[PartCount - 1] & HighBitMask)
760*9880d681SAndroid Build Coastguard Worker     return false;
761*9880d681SAndroid Build Coastguard Worker 
762*9880d681SAndroid Build Coastguard Worker   return true;
763*9880d681SAndroid Build Coastguard Worker }
764*9880d681SAndroid Build Coastguard Worker 
765*9880d681SAndroid Build Coastguard Worker bool
isLargest() const766*9880d681SAndroid Build Coastguard Worker APFloat::isLargest() const {
767*9880d681SAndroid Build Coastguard Worker   // The largest number by magnitude in our format will be the floating point
768*9880d681SAndroid Build Coastguard Worker   // number with maximum exponent and with significand that is all ones.
769*9880d681SAndroid Build Coastguard Worker   return isFiniteNonZero() && exponent == semantics->maxExponent
770*9880d681SAndroid Build Coastguard Worker     && isSignificandAllOnes();
771*9880d681SAndroid Build Coastguard Worker }
772*9880d681SAndroid Build Coastguard Worker 
773*9880d681SAndroid Build Coastguard Worker bool
isInteger() const774*9880d681SAndroid Build Coastguard Worker APFloat::isInteger() const {
775*9880d681SAndroid Build Coastguard Worker   // This could be made more efficient; I'm going for obviously correct.
776*9880d681SAndroid Build Coastguard Worker   if (!isFinite()) return false;
777*9880d681SAndroid Build Coastguard Worker   APFloat truncated = *this;
778*9880d681SAndroid Build Coastguard Worker   truncated.roundToIntegral(rmTowardZero);
779*9880d681SAndroid Build Coastguard Worker   return compare(truncated) == cmpEqual;
780*9880d681SAndroid Build Coastguard Worker }
781*9880d681SAndroid Build Coastguard Worker 
782*9880d681SAndroid Build Coastguard Worker bool
bitwiseIsEqual(const APFloat & rhs) const783*9880d681SAndroid Build Coastguard Worker APFloat::bitwiseIsEqual(const APFloat &rhs) const {
784*9880d681SAndroid Build Coastguard Worker   if (this == &rhs)
785*9880d681SAndroid Build Coastguard Worker     return true;
786*9880d681SAndroid Build Coastguard Worker   if (semantics != rhs.semantics ||
787*9880d681SAndroid Build Coastguard Worker       category != rhs.category ||
788*9880d681SAndroid Build Coastguard Worker       sign != rhs.sign)
789*9880d681SAndroid Build Coastguard Worker     return false;
790*9880d681SAndroid Build Coastguard Worker   if (category==fcZero || category==fcInfinity)
791*9880d681SAndroid Build Coastguard Worker     return true;
792*9880d681SAndroid Build Coastguard Worker 
793*9880d681SAndroid Build Coastguard Worker   if (isFiniteNonZero() && exponent != rhs.exponent)
794*9880d681SAndroid Build Coastguard Worker     return false;
795*9880d681SAndroid Build Coastguard Worker 
796*9880d681SAndroid Build Coastguard Worker   return std::equal(significandParts(), significandParts() + partCount(),
797*9880d681SAndroid Build Coastguard Worker                     rhs.significandParts());
798*9880d681SAndroid Build Coastguard Worker }
799*9880d681SAndroid Build Coastguard Worker 
APFloat(const fltSemantics & ourSemantics,integerPart value)800*9880d681SAndroid Build Coastguard Worker APFloat::APFloat(const fltSemantics &ourSemantics, integerPart value) {
801*9880d681SAndroid Build Coastguard Worker   initialize(&ourSemantics);
802*9880d681SAndroid Build Coastguard Worker   sign = 0;
803*9880d681SAndroid Build Coastguard Worker   category = fcNormal;
804*9880d681SAndroid Build Coastguard Worker   zeroSignificand();
805*9880d681SAndroid Build Coastguard Worker   exponent = ourSemantics.precision - 1;
806*9880d681SAndroid Build Coastguard Worker   significandParts()[0] = value;
807*9880d681SAndroid Build Coastguard Worker   normalize(rmNearestTiesToEven, lfExactlyZero);
808*9880d681SAndroid Build Coastguard Worker }
809*9880d681SAndroid Build Coastguard Worker 
APFloat(const fltSemantics & ourSemantics)810*9880d681SAndroid Build Coastguard Worker APFloat::APFloat(const fltSemantics &ourSemantics) {
811*9880d681SAndroid Build Coastguard Worker   initialize(&ourSemantics);
812*9880d681SAndroid Build Coastguard Worker   category = fcZero;
813*9880d681SAndroid Build Coastguard Worker   sign = false;
814*9880d681SAndroid Build Coastguard Worker }
815*9880d681SAndroid Build Coastguard Worker 
APFloat(const fltSemantics & ourSemantics,uninitializedTag tag)816*9880d681SAndroid Build Coastguard Worker APFloat::APFloat(const fltSemantics &ourSemantics, uninitializedTag tag) {
817*9880d681SAndroid Build Coastguard Worker   // Allocates storage if necessary but does not initialize it.
818*9880d681SAndroid Build Coastguard Worker   initialize(&ourSemantics);
819*9880d681SAndroid Build Coastguard Worker }
820*9880d681SAndroid Build Coastguard Worker 
APFloat(const fltSemantics & ourSemantics,StringRef text)821*9880d681SAndroid Build Coastguard Worker APFloat::APFloat(const fltSemantics &ourSemantics, StringRef text) {
822*9880d681SAndroid Build Coastguard Worker   initialize(&ourSemantics);
823*9880d681SAndroid Build Coastguard Worker   convertFromString(text, rmNearestTiesToEven);
824*9880d681SAndroid Build Coastguard Worker }
825*9880d681SAndroid Build Coastguard Worker 
APFloat(const APFloat & rhs)826*9880d681SAndroid Build Coastguard Worker APFloat::APFloat(const APFloat &rhs) {
827*9880d681SAndroid Build Coastguard Worker   initialize(rhs.semantics);
828*9880d681SAndroid Build Coastguard Worker   assign(rhs);
829*9880d681SAndroid Build Coastguard Worker }
830*9880d681SAndroid Build Coastguard Worker 
APFloat(APFloat && rhs)831*9880d681SAndroid Build Coastguard Worker APFloat::APFloat(APFloat &&rhs) : semantics(&Bogus) {
832*9880d681SAndroid Build Coastguard Worker   *this = std::move(rhs);
833*9880d681SAndroid Build Coastguard Worker }
834*9880d681SAndroid Build Coastguard Worker 
~APFloat()835*9880d681SAndroid Build Coastguard Worker APFloat::~APFloat()
836*9880d681SAndroid Build Coastguard Worker {
837*9880d681SAndroid Build Coastguard Worker   freeSignificand();
838*9880d681SAndroid Build Coastguard Worker }
839*9880d681SAndroid Build Coastguard Worker 
840*9880d681SAndroid Build Coastguard Worker // Profile - This method 'profiles' an APFloat for use with FoldingSet.
Profile(FoldingSetNodeID & ID) const841*9880d681SAndroid Build Coastguard Worker void APFloat::Profile(FoldingSetNodeID& ID) const {
842*9880d681SAndroid Build Coastguard Worker   ID.Add(bitcastToAPInt());
843*9880d681SAndroid Build Coastguard Worker }
844*9880d681SAndroid Build Coastguard Worker 
845*9880d681SAndroid Build Coastguard Worker unsigned int
partCount() const846*9880d681SAndroid Build Coastguard Worker APFloat::partCount() const
847*9880d681SAndroid Build Coastguard Worker {
848*9880d681SAndroid Build Coastguard Worker   return partCountForBits(semantics->precision + 1);
849*9880d681SAndroid Build Coastguard Worker }
850*9880d681SAndroid Build Coastguard Worker 
851*9880d681SAndroid Build Coastguard Worker unsigned int
semanticsPrecision(const fltSemantics & semantics)852*9880d681SAndroid Build Coastguard Worker APFloat::semanticsPrecision(const fltSemantics &semantics)
853*9880d681SAndroid Build Coastguard Worker {
854*9880d681SAndroid Build Coastguard Worker   return semantics.precision;
855*9880d681SAndroid Build Coastguard Worker }
856*9880d681SAndroid Build Coastguard Worker APFloat::ExponentType
semanticsMaxExponent(const fltSemantics & semantics)857*9880d681SAndroid Build Coastguard Worker APFloat::semanticsMaxExponent(const fltSemantics &semantics)
858*9880d681SAndroid Build Coastguard Worker {
859*9880d681SAndroid Build Coastguard Worker   return semantics.maxExponent;
860*9880d681SAndroid Build Coastguard Worker }
861*9880d681SAndroid Build Coastguard Worker APFloat::ExponentType
semanticsMinExponent(const fltSemantics & semantics)862*9880d681SAndroid Build Coastguard Worker APFloat::semanticsMinExponent(const fltSemantics &semantics)
863*9880d681SAndroid Build Coastguard Worker {
864*9880d681SAndroid Build Coastguard Worker   return semantics.minExponent;
865*9880d681SAndroid Build Coastguard Worker }
866*9880d681SAndroid Build Coastguard Worker unsigned int
semanticsSizeInBits(const fltSemantics & semantics)867*9880d681SAndroid Build Coastguard Worker APFloat::semanticsSizeInBits(const fltSemantics &semantics)
868*9880d681SAndroid Build Coastguard Worker {
869*9880d681SAndroid Build Coastguard Worker   return semantics.sizeInBits;
870*9880d681SAndroid Build Coastguard Worker }
871*9880d681SAndroid Build Coastguard Worker 
872*9880d681SAndroid Build Coastguard Worker const integerPart *
significandParts() const873*9880d681SAndroid Build Coastguard Worker APFloat::significandParts() const
874*9880d681SAndroid Build Coastguard Worker {
875*9880d681SAndroid Build Coastguard Worker   return const_cast<APFloat *>(this)->significandParts();
876*9880d681SAndroid Build Coastguard Worker }
877*9880d681SAndroid Build Coastguard Worker 
878*9880d681SAndroid Build Coastguard Worker integerPart *
significandParts()879*9880d681SAndroid Build Coastguard Worker APFloat::significandParts()
880*9880d681SAndroid Build Coastguard Worker {
881*9880d681SAndroid Build Coastguard Worker   if (partCount() > 1)
882*9880d681SAndroid Build Coastguard Worker     return significand.parts;
883*9880d681SAndroid Build Coastguard Worker   else
884*9880d681SAndroid Build Coastguard Worker     return &significand.part;
885*9880d681SAndroid Build Coastguard Worker }
886*9880d681SAndroid Build Coastguard Worker 
887*9880d681SAndroid Build Coastguard Worker void
zeroSignificand()888*9880d681SAndroid Build Coastguard Worker APFloat::zeroSignificand()
889*9880d681SAndroid Build Coastguard Worker {
890*9880d681SAndroid Build Coastguard Worker   APInt::tcSet(significandParts(), 0, partCount());
891*9880d681SAndroid Build Coastguard Worker }
892*9880d681SAndroid Build Coastguard Worker 
893*9880d681SAndroid Build Coastguard Worker /* Increment an fcNormal floating point number's significand.  */
894*9880d681SAndroid Build Coastguard Worker void
incrementSignificand()895*9880d681SAndroid Build Coastguard Worker APFloat::incrementSignificand()
896*9880d681SAndroid Build Coastguard Worker {
897*9880d681SAndroid Build Coastguard Worker   integerPart carry;
898*9880d681SAndroid Build Coastguard Worker 
899*9880d681SAndroid Build Coastguard Worker   carry = APInt::tcIncrement(significandParts(), partCount());
900*9880d681SAndroid Build Coastguard Worker 
901*9880d681SAndroid Build Coastguard Worker   /* Our callers should never cause us to overflow.  */
902*9880d681SAndroid Build Coastguard Worker   assert(carry == 0);
903*9880d681SAndroid Build Coastguard Worker   (void)carry;
904*9880d681SAndroid Build Coastguard Worker }
905*9880d681SAndroid Build Coastguard Worker 
906*9880d681SAndroid Build Coastguard Worker /* Add the significand of the RHS.  Returns the carry flag.  */
907*9880d681SAndroid Build Coastguard Worker integerPart
addSignificand(const APFloat & rhs)908*9880d681SAndroid Build Coastguard Worker APFloat::addSignificand(const APFloat &rhs)
909*9880d681SAndroid Build Coastguard Worker {
910*9880d681SAndroid Build Coastguard Worker   integerPart *parts;
911*9880d681SAndroid Build Coastguard Worker 
912*9880d681SAndroid Build Coastguard Worker   parts = significandParts();
913*9880d681SAndroid Build Coastguard Worker 
914*9880d681SAndroid Build Coastguard Worker   assert(semantics == rhs.semantics);
915*9880d681SAndroid Build Coastguard Worker   assert(exponent == rhs.exponent);
916*9880d681SAndroid Build Coastguard Worker 
917*9880d681SAndroid Build Coastguard Worker   return APInt::tcAdd(parts, rhs.significandParts(), 0, partCount());
918*9880d681SAndroid Build Coastguard Worker }
919*9880d681SAndroid Build Coastguard Worker 
920*9880d681SAndroid Build Coastguard Worker /* Subtract the significand of the RHS with a borrow flag.  Returns
921*9880d681SAndroid Build Coastguard Worker    the borrow flag.  */
922*9880d681SAndroid Build Coastguard Worker integerPart
subtractSignificand(const APFloat & rhs,integerPart borrow)923*9880d681SAndroid Build Coastguard Worker APFloat::subtractSignificand(const APFloat &rhs, integerPart borrow)
924*9880d681SAndroid Build Coastguard Worker {
925*9880d681SAndroid Build Coastguard Worker   integerPart *parts;
926*9880d681SAndroid Build Coastguard Worker 
927*9880d681SAndroid Build Coastguard Worker   parts = significandParts();
928*9880d681SAndroid Build Coastguard Worker 
929*9880d681SAndroid Build Coastguard Worker   assert(semantics == rhs.semantics);
930*9880d681SAndroid Build Coastguard Worker   assert(exponent == rhs.exponent);
931*9880d681SAndroid Build Coastguard Worker 
932*9880d681SAndroid Build Coastguard Worker   return APInt::tcSubtract(parts, rhs.significandParts(), borrow,
933*9880d681SAndroid Build Coastguard Worker                            partCount());
934*9880d681SAndroid Build Coastguard Worker }
935*9880d681SAndroid Build Coastguard Worker 
936*9880d681SAndroid Build Coastguard Worker /* Multiply the significand of the RHS.  If ADDEND is non-NULL, add it
937*9880d681SAndroid Build Coastguard Worker    on to the full-precision result of the multiplication.  Returns the
938*9880d681SAndroid Build Coastguard Worker    lost fraction.  */
939*9880d681SAndroid Build Coastguard Worker lostFraction
multiplySignificand(const APFloat & rhs,const APFloat * addend)940*9880d681SAndroid Build Coastguard Worker APFloat::multiplySignificand(const APFloat &rhs, const APFloat *addend)
941*9880d681SAndroid Build Coastguard Worker {
942*9880d681SAndroid Build Coastguard Worker   unsigned int omsb;        // One, not zero, based MSB.
943*9880d681SAndroid Build Coastguard Worker   unsigned int partsCount, newPartsCount, precision;
944*9880d681SAndroid Build Coastguard Worker   integerPart *lhsSignificand;
945*9880d681SAndroid Build Coastguard Worker   integerPart scratch[4];
946*9880d681SAndroid Build Coastguard Worker   integerPart *fullSignificand;
947*9880d681SAndroid Build Coastguard Worker   lostFraction lost_fraction;
948*9880d681SAndroid Build Coastguard Worker   bool ignored;
949*9880d681SAndroid Build Coastguard Worker 
950*9880d681SAndroid Build Coastguard Worker   assert(semantics == rhs.semantics);
951*9880d681SAndroid Build Coastguard Worker 
952*9880d681SAndroid Build Coastguard Worker   precision = semantics->precision;
953*9880d681SAndroid Build Coastguard Worker 
954*9880d681SAndroid Build Coastguard Worker   // Allocate space for twice as many bits as the original significand, plus one
955*9880d681SAndroid Build Coastguard Worker   // extra bit for the addition to overflow into.
956*9880d681SAndroid Build Coastguard Worker   newPartsCount = partCountForBits(precision * 2 + 1);
957*9880d681SAndroid Build Coastguard Worker 
958*9880d681SAndroid Build Coastguard Worker   if (newPartsCount > 4)
959*9880d681SAndroid Build Coastguard Worker     fullSignificand = new integerPart[newPartsCount];
960*9880d681SAndroid Build Coastguard Worker   else
961*9880d681SAndroid Build Coastguard Worker     fullSignificand = scratch;
962*9880d681SAndroid Build Coastguard Worker 
963*9880d681SAndroid Build Coastguard Worker   lhsSignificand = significandParts();
964*9880d681SAndroid Build Coastguard Worker   partsCount = partCount();
965*9880d681SAndroid Build Coastguard Worker 
966*9880d681SAndroid Build Coastguard Worker   APInt::tcFullMultiply(fullSignificand, lhsSignificand,
967*9880d681SAndroid Build Coastguard Worker                         rhs.significandParts(), partsCount, partsCount);
968*9880d681SAndroid Build Coastguard Worker 
969*9880d681SAndroid Build Coastguard Worker   lost_fraction = lfExactlyZero;
970*9880d681SAndroid Build Coastguard Worker   omsb = APInt::tcMSB(fullSignificand, newPartsCount) + 1;
971*9880d681SAndroid Build Coastguard Worker   exponent += rhs.exponent;
972*9880d681SAndroid Build Coastguard Worker 
973*9880d681SAndroid Build Coastguard Worker   // Assume the operands involved in the multiplication are single-precision
974*9880d681SAndroid Build Coastguard Worker   // FP, and the two multiplicants are:
975*9880d681SAndroid Build Coastguard Worker   //   *this = a23 . a22 ... a0 * 2^e1
976*9880d681SAndroid Build Coastguard Worker   //     rhs = b23 . b22 ... b0 * 2^e2
977*9880d681SAndroid Build Coastguard Worker   // the result of multiplication is:
978*9880d681SAndroid Build Coastguard Worker   //   *this = c48 c47 c46 . c45 ... c0 * 2^(e1+e2)
979*9880d681SAndroid Build Coastguard Worker   // Note that there are three significant bits at the left-hand side of the
980*9880d681SAndroid Build Coastguard Worker   // radix point: two for the multiplication, and an overflow bit for the
981*9880d681SAndroid Build Coastguard Worker   // addition (that will always be zero at this point). Move the radix point
982*9880d681SAndroid Build Coastguard Worker   // toward left by two bits, and adjust exponent accordingly.
983*9880d681SAndroid Build Coastguard Worker   exponent += 2;
984*9880d681SAndroid Build Coastguard Worker 
985*9880d681SAndroid Build Coastguard Worker   if (addend && addend->isNonZero()) {
986*9880d681SAndroid Build Coastguard Worker     // The intermediate result of the multiplication has "2 * precision"
987*9880d681SAndroid Build Coastguard Worker     // signicant bit; adjust the addend to be consistent with mul result.
988*9880d681SAndroid Build Coastguard Worker     //
989*9880d681SAndroid Build Coastguard Worker     Significand savedSignificand = significand;
990*9880d681SAndroid Build Coastguard Worker     const fltSemantics *savedSemantics = semantics;
991*9880d681SAndroid Build Coastguard Worker     fltSemantics extendedSemantics;
992*9880d681SAndroid Build Coastguard Worker     opStatus status;
993*9880d681SAndroid Build Coastguard Worker     unsigned int extendedPrecision;
994*9880d681SAndroid Build Coastguard Worker 
995*9880d681SAndroid Build Coastguard Worker     // Normalize our MSB to one below the top bit to allow for overflow.
996*9880d681SAndroid Build Coastguard Worker     extendedPrecision = 2 * precision + 1;
997*9880d681SAndroid Build Coastguard Worker     if (omsb != extendedPrecision - 1) {
998*9880d681SAndroid Build Coastguard Worker       assert(extendedPrecision > omsb);
999*9880d681SAndroid Build Coastguard Worker       APInt::tcShiftLeft(fullSignificand, newPartsCount,
1000*9880d681SAndroid Build Coastguard Worker                          (extendedPrecision - 1) - omsb);
1001*9880d681SAndroid Build Coastguard Worker       exponent -= (extendedPrecision - 1) - omsb;
1002*9880d681SAndroid Build Coastguard Worker     }
1003*9880d681SAndroid Build Coastguard Worker 
1004*9880d681SAndroid Build Coastguard Worker     /* Create new semantics.  */
1005*9880d681SAndroid Build Coastguard Worker     extendedSemantics = *semantics;
1006*9880d681SAndroid Build Coastguard Worker     extendedSemantics.precision = extendedPrecision;
1007*9880d681SAndroid Build Coastguard Worker 
1008*9880d681SAndroid Build Coastguard Worker     if (newPartsCount == 1)
1009*9880d681SAndroid Build Coastguard Worker       significand.part = fullSignificand[0];
1010*9880d681SAndroid Build Coastguard Worker     else
1011*9880d681SAndroid Build Coastguard Worker       significand.parts = fullSignificand;
1012*9880d681SAndroid Build Coastguard Worker     semantics = &extendedSemantics;
1013*9880d681SAndroid Build Coastguard Worker 
1014*9880d681SAndroid Build Coastguard Worker     APFloat extendedAddend(*addend);
1015*9880d681SAndroid Build Coastguard Worker     status = extendedAddend.convert(extendedSemantics, rmTowardZero, &ignored);
1016*9880d681SAndroid Build Coastguard Worker     assert(status == opOK);
1017*9880d681SAndroid Build Coastguard Worker     (void)status;
1018*9880d681SAndroid Build Coastguard Worker 
1019*9880d681SAndroid Build Coastguard Worker     // Shift the significand of the addend right by one bit. This guarantees
1020*9880d681SAndroid Build Coastguard Worker     // that the high bit of the significand is zero (same as fullSignificand),
1021*9880d681SAndroid Build Coastguard Worker     // so the addition will overflow (if it does overflow at all) into the top bit.
1022*9880d681SAndroid Build Coastguard Worker     lost_fraction = extendedAddend.shiftSignificandRight(1);
1023*9880d681SAndroid Build Coastguard Worker     assert(lost_fraction == lfExactlyZero &&
1024*9880d681SAndroid Build Coastguard Worker            "Lost precision while shifting addend for fused-multiply-add.");
1025*9880d681SAndroid Build Coastguard Worker 
1026*9880d681SAndroid Build Coastguard Worker     lost_fraction = addOrSubtractSignificand(extendedAddend, false);
1027*9880d681SAndroid Build Coastguard Worker 
1028*9880d681SAndroid Build Coastguard Worker     /* Restore our state.  */
1029*9880d681SAndroid Build Coastguard Worker     if (newPartsCount == 1)
1030*9880d681SAndroid Build Coastguard Worker       fullSignificand[0] = significand.part;
1031*9880d681SAndroid Build Coastguard Worker     significand = savedSignificand;
1032*9880d681SAndroid Build Coastguard Worker     semantics = savedSemantics;
1033*9880d681SAndroid Build Coastguard Worker 
1034*9880d681SAndroid Build Coastguard Worker     omsb = APInt::tcMSB(fullSignificand, newPartsCount) + 1;
1035*9880d681SAndroid Build Coastguard Worker   }
1036*9880d681SAndroid Build Coastguard Worker 
1037*9880d681SAndroid Build Coastguard Worker   // Convert the result having "2 * precision" significant-bits back to the one
1038*9880d681SAndroid Build Coastguard Worker   // having "precision" significant-bits. First, move the radix point from
1039*9880d681SAndroid Build Coastguard Worker   // poision "2*precision - 1" to "precision - 1". The exponent need to be
1040*9880d681SAndroid Build Coastguard Worker   // adjusted by "2*precision - 1" - "precision - 1" = "precision".
1041*9880d681SAndroid Build Coastguard Worker   exponent -= precision + 1;
1042*9880d681SAndroid Build Coastguard Worker 
1043*9880d681SAndroid Build Coastguard Worker   // In case MSB resides at the left-hand side of radix point, shift the
1044*9880d681SAndroid Build Coastguard Worker   // mantissa right by some amount to make sure the MSB reside right before
1045*9880d681SAndroid Build Coastguard Worker   // the radix point (i.e. "MSB . rest-significant-bits").
1046*9880d681SAndroid Build Coastguard Worker   //
1047*9880d681SAndroid Build Coastguard Worker   // Note that the result is not normalized when "omsb < precision". So, the
1048*9880d681SAndroid Build Coastguard Worker   // caller needs to call APFloat::normalize() if normalized value is expected.
1049*9880d681SAndroid Build Coastguard Worker   if (omsb > precision) {
1050*9880d681SAndroid Build Coastguard Worker     unsigned int bits, significantParts;
1051*9880d681SAndroid Build Coastguard Worker     lostFraction lf;
1052*9880d681SAndroid Build Coastguard Worker 
1053*9880d681SAndroid Build Coastguard Worker     bits = omsb - precision;
1054*9880d681SAndroid Build Coastguard Worker     significantParts = partCountForBits(omsb);
1055*9880d681SAndroid Build Coastguard Worker     lf = shiftRight(fullSignificand, significantParts, bits);
1056*9880d681SAndroid Build Coastguard Worker     lost_fraction = combineLostFractions(lf, lost_fraction);
1057*9880d681SAndroid Build Coastguard Worker     exponent += bits;
1058*9880d681SAndroid Build Coastguard Worker   }
1059*9880d681SAndroid Build Coastguard Worker 
1060*9880d681SAndroid Build Coastguard Worker   APInt::tcAssign(lhsSignificand, fullSignificand, partsCount);
1061*9880d681SAndroid Build Coastguard Worker 
1062*9880d681SAndroid Build Coastguard Worker   if (newPartsCount > 4)
1063*9880d681SAndroid Build Coastguard Worker     delete [] fullSignificand;
1064*9880d681SAndroid Build Coastguard Worker 
1065*9880d681SAndroid Build Coastguard Worker   return lost_fraction;
1066*9880d681SAndroid Build Coastguard Worker }
1067*9880d681SAndroid Build Coastguard Worker 
1068*9880d681SAndroid Build Coastguard Worker /* Multiply the significands of LHS and RHS to DST.  */
1069*9880d681SAndroid Build Coastguard Worker lostFraction
divideSignificand(const APFloat & rhs)1070*9880d681SAndroid Build Coastguard Worker APFloat::divideSignificand(const APFloat &rhs)
1071*9880d681SAndroid Build Coastguard Worker {
1072*9880d681SAndroid Build Coastguard Worker   unsigned int bit, i, partsCount;
1073*9880d681SAndroid Build Coastguard Worker   const integerPart *rhsSignificand;
1074*9880d681SAndroid Build Coastguard Worker   integerPart *lhsSignificand, *dividend, *divisor;
1075*9880d681SAndroid Build Coastguard Worker   integerPart scratch[4];
1076*9880d681SAndroid Build Coastguard Worker   lostFraction lost_fraction;
1077*9880d681SAndroid Build Coastguard Worker 
1078*9880d681SAndroid Build Coastguard Worker   assert(semantics == rhs.semantics);
1079*9880d681SAndroid Build Coastguard Worker 
1080*9880d681SAndroid Build Coastguard Worker   lhsSignificand = significandParts();
1081*9880d681SAndroid Build Coastguard Worker   rhsSignificand = rhs.significandParts();
1082*9880d681SAndroid Build Coastguard Worker   partsCount = partCount();
1083*9880d681SAndroid Build Coastguard Worker 
1084*9880d681SAndroid Build Coastguard Worker   if (partsCount > 2)
1085*9880d681SAndroid Build Coastguard Worker     dividend = new integerPart[partsCount * 2];
1086*9880d681SAndroid Build Coastguard Worker   else
1087*9880d681SAndroid Build Coastguard Worker     dividend = scratch;
1088*9880d681SAndroid Build Coastguard Worker 
1089*9880d681SAndroid Build Coastguard Worker   divisor = dividend + partsCount;
1090*9880d681SAndroid Build Coastguard Worker 
1091*9880d681SAndroid Build Coastguard Worker   /* Copy the dividend and divisor as they will be modified in-place.  */
1092*9880d681SAndroid Build Coastguard Worker   for (i = 0; i < partsCount; i++) {
1093*9880d681SAndroid Build Coastguard Worker     dividend[i] = lhsSignificand[i];
1094*9880d681SAndroid Build Coastguard Worker     divisor[i] = rhsSignificand[i];
1095*9880d681SAndroid Build Coastguard Worker     lhsSignificand[i] = 0;
1096*9880d681SAndroid Build Coastguard Worker   }
1097*9880d681SAndroid Build Coastguard Worker 
1098*9880d681SAndroid Build Coastguard Worker   exponent -= rhs.exponent;
1099*9880d681SAndroid Build Coastguard Worker 
1100*9880d681SAndroid Build Coastguard Worker   unsigned int precision = semantics->precision;
1101*9880d681SAndroid Build Coastguard Worker 
1102*9880d681SAndroid Build Coastguard Worker   /* Normalize the divisor.  */
1103*9880d681SAndroid Build Coastguard Worker   bit = precision - APInt::tcMSB(divisor, partsCount) - 1;
1104*9880d681SAndroid Build Coastguard Worker   if (bit) {
1105*9880d681SAndroid Build Coastguard Worker     exponent += bit;
1106*9880d681SAndroid Build Coastguard Worker     APInt::tcShiftLeft(divisor, partsCount, bit);
1107*9880d681SAndroid Build Coastguard Worker   }
1108*9880d681SAndroid Build Coastguard Worker 
1109*9880d681SAndroid Build Coastguard Worker   /* Normalize the dividend.  */
1110*9880d681SAndroid Build Coastguard Worker   bit = precision - APInt::tcMSB(dividend, partsCount) - 1;
1111*9880d681SAndroid Build Coastguard Worker   if (bit) {
1112*9880d681SAndroid Build Coastguard Worker     exponent -= bit;
1113*9880d681SAndroid Build Coastguard Worker     APInt::tcShiftLeft(dividend, partsCount, bit);
1114*9880d681SAndroid Build Coastguard Worker   }
1115*9880d681SAndroid Build Coastguard Worker 
1116*9880d681SAndroid Build Coastguard Worker   /* Ensure the dividend >= divisor initially for the loop below.
1117*9880d681SAndroid Build Coastguard Worker      Incidentally, this means that the division loop below is
1118*9880d681SAndroid Build Coastguard Worker      guaranteed to set the integer bit to one.  */
1119*9880d681SAndroid Build Coastguard Worker   if (APInt::tcCompare(dividend, divisor, partsCount) < 0) {
1120*9880d681SAndroid Build Coastguard Worker     exponent--;
1121*9880d681SAndroid Build Coastguard Worker     APInt::tcShiftLeft(dividend, partsCount, 1);
1122*9880d681SAndroid Build Coastguard Worker     assert(APInt::tcCompare(dividend, divisor, partsCount) >= 0);
1123*9880d681SAndroid Build Coastguard Worker   }
1124*9880d681SAndroid Build Coastguard Worker 
1125*9880d681SAndroid Build Coastguard Worker   /* Long division.  */
1126*9880d681SAndroid Build Coastguard Worker   for (bit = precision; bit; bit -= 1) {
1127*9880d681SAndroid Build Coastguard Worker     if (APInt::tcCompare(dividend, divisor, partsCount) >= 0) {
1128*9880d681SAndroid Build Coastguard Worker       APInt::tcSubtract(dividend, divisor, 0, partsCount);
1129*9880d681SAndroid Build Coastguard Worker       APInt::tcSetBit(lhsSignificand, bit - 1);
1130*9880d681SAndroid Build Coastguard Worker     }
1131*9880d681SAndroid Build Coastguard Worker 
1132*9880d681SAndroid Build Coastguard Worker     APInt::tcShiftLeft(dividend, partsCount, 1);
1133*9880d681SAndroid Build Coastguard Worker   }
1134*9880d681SAndroid Build Coastguard Worker 
1135*9880d681SAndroid Build Coastguard Worker   /* Figure out the lost fraction.  */
1136*9880d681SAndroid Build Coastguard Worker   int cmp = APInt::tcCompare(dividend, divisor, partsCount);
1137*9880d681SAndroid Build Coastguard Worker 
1138*9880d681SAndroid Build Coastguard Worker   if (cmp > 0)
1139*9880d681SAndroid Build Coastguard Worker     lost_fraction = lfMoreThanHalf;
1140*9880d681SAndroid Build Coastguard Worker   else if (cmp == 0)
1141*9880d681SAndroid Build Coastguard Worker     lost_fraction = lfExactlyHalf;
1142*9880d681SAndroid Build Coastguard Worker   else if (APInt::tcIsZero(dividend, partsCount))
1143*9880d681SAndroid Build Coastguard Worker     lost_fraction = lfExactlyZero;
1144*9880d681SAndroid Build Coastguard Worker   else
1145*9880d681SAndroid Build Coastguard Worker     lost_fraction = lfLessThanHalf;
1146*9880d681SAndroid Build Coastguard Worker 
1147*9880d681SAndroid Build Coastguard Worker   if (partsCount > 2)
1148*9880d681SAndroid Build Coastguard Worker     delete [] dividend;
1149*9880d681SAndroid Build Coastguard Worker 
1150*9880d681SAndroid Build Coastguard Worker   return lost_fraction;
1151*9880d681SAndroid Build Coastguard Worker }
1152*9880d681SAndroid Build Coastguard Worker 
1153*9880d681SAndroid Build Coastguard Worker unsigned int
significandMSB() const1154*9880d681SAndroid Build Coastguard Worker APFloat::significandMSB() const
1155*9880d681SAndroid Build Coastguard Worker {
1156*9880d681SAndroid Build Coastguard Worker   return APInt::tcMSB(significandParts(), partCount());
1157*9880d681SAndroid Build Coastguard Worker }
1158*9880d681SAndroid Build Coastguard Worker 
1159*9880d681SAndroid Build Coastguard Worker unsigned int
significandLSB() const1160*9880d681SAndroid Build Coastguard Worker APFloat::significandLSB() const
1161*9880d681SAndroid Build Coastguard Worker {
1162*9880d681SAndroid Build Coastguard Worker   return APInt::tcLSB(significandParts(), partCount());
1163*9880d681SAndroid Build Coastguard Worker }
1164*9880d681SAndroid Build Coastguard Worker 
1165*9880d681SAndroid Build Coastguard Worker /* Note that a zero result is NOT normalized to fcZero.  */
1166*9880d681SAndroid Build Coastguard Worker lostFraction
shiftSignificandRight(unsigned int bits)1167*9880d681SAndroid Build Coastguard Worker APFloat::shiftSignificandRight(unsigned int bits)
1168*9880d681SAndroid Build Coastguard Worker {
1169*9880d681SAndroid Build Coastguard Worker   /* Our exponent should not overflow.  */
1170*9880d681SAndroid Build Coastguard Worker   assert((ExponentType) (exponent + bits) >= exponent);
1171*9880d681SAndroid Build Coastguard Worker 
1172*9880d681SAndroid Build Coastguard Worker   exponent += bits;
1173*9880d681SAndroid Build Coastguard Worker 
1174*9880d681SAndroid Build Coastguard Worker   return shiftRight(significandParts(), partCount(), bits);
1175*9880d681SAndroid Build Coastguard Worker }
1176*9880d681SAndroid Build Coastguard Worker 
1177*9880d681SAndroid Build Coastguard Worker /* Shift the significand left BITS bits, subtract BITS from its exponent.  */
1178*9880d681SAndroid Build Coastguard Worker void
shiftSignificandLeft(unsigned int bits)1179*9880d681SAndroid Build Coastguard Worker APFloat::shiftSignificandLeft(unsigned int bits)
1180*9880d681SAndroid Build Coastguard Worker {
1181*9880d681SAndroid Build Coastguard Worker   assert(bits < semantics->precision);
1182*9880d681SAndroid Build Coastguard Worker 
1183*9880d681SAndroid Build Coastguard Worker   if (bits) {
1184*9880d681SAndroid Build Coastguard Worker     unsigned int partsCount = partCount();
1185*9880d681SAndroid Build Coastguard Worker 
1186*9880d681SAndroid Build Coastguard Worker     APInt::tcShiftLeft(significandParts(), partsCount, bits);
1187*9880d681SAndroid Build Coastguard Worker     exponent -= bits;
1188*9880d681SAndroid Build Coastguard Worker 
1189*9880d681SAndroid Build Coastguard Worker     assert(!APInt::tcIsZero(significandParts(), partsCount));
1190*9880d681SAndroid Build Coastguard Worker   }
1191*9880d681SAndroid Build Coastguard Worker }
1192*9880d681SAndroid Build Coastguard Worker 
1193*9880d681SAndroid Build Coastguard Worker APFloat::cmpResult
compareAbsoluteValue(const APFloat & rhs) const1194*9880d681SAndroid Build Coastguard Worker APFloat::compareAbsoluteValue(const APFloat &rhs) const
1195*9880d681SAndroid Build Coastguard Worker {
1196*9880d681SAndroid Build Coastguard Worker   int compare;
1197*9880d681SAndroid Build Coastguard Worker 
1198*9880d681SAndroid Build Coastguard Worker   assert(semantics == rhs.semantics);
1199*9880d681SAndroid Build Coastguard Worker   assert(isFiniteNonZero());
1200*9880d681SAndroid Build Coastguard Worker   assert(rhs.isFiniteNonZero());
1201*9880d681SAndroid Build Coastguard Worker 
1202*9880d681SAndroid Build Coastguard Worker   compare = exponent - rhs.exponent;
1203*9880d681SAndroid Build Coastguard Worker 
1204*9880d681SAndroid Build Coastguard Worker   /* If exponents are equal, do an unsigned bignum comparison of the
1205*9880d681SAndroid Build Coastguard Worker      significands.  */
1206*9880d681SAndroid Build Coastguard Worker   if (compare == 0)
1207*9880d681SAndroid Build Coastguard Worker     compare = APInt::tcCompare(significandParts(), rhs.significandParts(),
1208*9880d681SAndroid Build Coastguard Worker                                partCount());
1209*9880d681SAndroid Build Coastguard Worker 
1210*9880d681SAndroid Build Coastguard Worker   if (compare > 0)
1211*9880d681SAndroid Build Coastguard Worker     return cmpGreaterThan;
1212*9880d681SAndroid Build Coastguard Worker   else if (compare < 0)
1213*9880d681SAndroid Build Coastguard Worker     return cmpLessThan;
1214*9880d681SAndroid Build Coastguard Worker   else
1215*9880d681SAndroid Build Coastguard Worker     return cmpEqual;
1216*9880d681SAndroid Build Coastguard Worker }
1217*9880d681SAndroid Build Coastguard Worker 
1218*9880d681SAndroid Build Coastguard Worker /* Handle overflow.  Sign is preserved.  We either become infinity or
1219*9880d681SAndroid Build Coastguard Worker    the largest finite number.  */
1220*9880d681SAndroid Build Coastguard Worker APFloat::opStatus
handleOverflow(roundingMode rounding_mode)1221*9880d681SAndroid Build Coastguard Worker APFloat::handleOverflow(roundingMode rounding_mode)
1222*9880d681SAndroid Build Coastguard Worker {
1223*9880d681SAndroid Build Coastguard Worker   /* Infinity?  */
1224*9880d681SAndroid Build Coastguard Worker   if (rounding_mode == rmNearestTiesToEven ||
1225*9880d681SAndroid Build Coastguard Worker       rounding_mode == rmNearestTiesToAway ||
1226*9880d681SAndroid Build Coastguard Worker       (rounding_mode == rmTowardPositive && !sign) ||
1227*9880d681SAndroid Build Coastguard Worker       (rounding_mode == rmTowardNegative && sign)) {
1228*9880d681SAndroid Build Coastguard Worker     category = fcInfinity;
1229*9880d681SAndroid Build Coastguard Worker     return (opStatus) (opOverflow | opInexact);
1230*9880d681SAndroid Build Coastguard Worker   }
1231*9880d681SAndroid Build Coastguard Worker 
1232*9880d681SAndroid Build Coastguard Worker   /* Otherwise we become the largest finite number.  */
1233*9880d681SAndroid Build Coastguard Worker   category = fcNormal;
1234*9880d681SAndroid Build Coastguard Worker   exponent = semantics->maxExponent;
1235*9880d681SAndroid Build Coastguard Worker   APInt::tcSetLeastSignificantBits(significandParts(), partCount(),
1236*9880d681SAndroid Build Coastguard Worker                                    semantics->precision);
1237*9880d681SAndroid Build Coastguard Worker 
1238*9880d681SAndroid Build Coastguard Worker   return opInexact;
1239*9880d681SAndroid Build Coastguard Worker }
1240*9880d681SAndroid Build Coastguard Worker 
1241*9880d681SAndroid Build Coastguard Worker /* Returns TRUE if, when truncating the current number, with BIT the
1242*9880d681SAndroid Build Coastguard Worker    new LSB, with the given lost fraction and rounding mode, the result
1243*9880d681SAndroid Build Coastguard Worker    would need to be rounded away from zero (i.e., by increasing the
1244*9880d681SAndroid Build Coastguard Worker    signficand).  This routine must work for fcZero of both signs, and
1245*9880d681SAndroid Build Coastguard Worker    fcNormal numbers.  */
1246*9880d681SAndroid Build Coastguard Worker bool
roundAwayFromZero(roundingMode rounding_mode,lostFraction lost_fraction,unsigned int bit) const1247*9880d681SAndroid Build Coastguard Worker APFloat::roundAwayFromZero(roundingMode rounding_mode,
1248*9880d681SAndroid Build Coastguard Worker                            lostFraction lost_fraction,
1249*9880d681SAndroid Build Coastguard Worker                            unsigned int bit) const
1250*9880d681SAndroid Build Coastguard Worker {
1251*9880d681SAndroid Build Coastguard Worker   /* NaNs and infinities should not have lost fractions.  */
1252*9880d681SAndroid Build Coastguard Worker   assert(isFiniteNonZero() || category == fcZero);
1253*9880d681SAndroid Build Coastguard Worker 
1254*9880d681SAndroid Build Coastguard Worker   /* Current callers never pass this so we don't handle it.  */
1255*9880d681SAndroid Build Coastguard Worker   assert(lost_fraction != lfExactlyZero);
1256*9880d681SAndroid Build Coastguard Worker 
1257*9880d681SAndroid Build Coastguard Worker   switch (rounding_mode) {
1258*9880d681SAndroid Build Coastguard Worker   case rmNearestTiesToAway:
1259*9880d681SAndroid Build Coastguard Worker     return lost_fraction == lfExactlyHalf || lost_fraction == lfMoreThanHalf;
1260*9880d681SAndroid Build Coastguard Worker 
1261*9880d681SAndroid Build Coastguard Worker   case rmNearestTiesToEven:
1262*9880d681SAndroid Build Coastguard Worker     if (lost_fraction == lfMoreThanHalf)
1263*9880d681SAndroid Build Coastguard Worker       return true;
1264*9880d681SAndroid Build Coastguard Worker 
1265*9880d681SAndroid Build Coastguard Worker     /* Our zeroes don't have a significand to test.  */
1266*9880d681SAndroid Build Coastguard Worker     if (lost_fraction == lfExactlyHalf && category != fcZero)
1267*9880d681SAndroid Build Coastguard Worker       return APInt::tcExtractBit(significandParts(), bit);
1268*9880d681SAndroid Build Coastguard Worker 
1269*9880d681SAndroid Build Coastguard Worker     return false;
1270*9880d681SAndroid Build Coastguard Worker 
1271*9880d681SAndroid Build Coastguard Worker   case rmTowardZero:
1272*9880d681SAndroid Build Coastguard Worker     return false;
1273*9880d681SAndroid Build Coastguard Worker 
1274*9880d681SAndroid Build Coastguard Worker   case rmTowardPositive:
1275*9880d681SAndroid Build Coastguard Worker     return !sign;
1276*9880d681SAndroid Build Coastguard Worker 
1277*9880d681SAndroid Build Coastguard Worker   case rmTowardNegative:
1278*9880d681SAndroid Build Coastguard Worker     return sign;
1279*9880d681SAndroid Build Coastguard Worker   }
1280*9880d681SAndroid Build Coastguard Worker   llvm_unreachable("Invalid rounding mode found");
1281*9880d681SAndroid Build Coastguard Worker }
1282*9880d681SAndroid Build Coastguard Worker 
1283*9880d681SAndroid Build Coastguard Worker APFloat::opStatus
normalize(roundingMode rounding_mode,lostFraction lost_fraction)1284*9880d681SAndroid Build Coastguard Worker APFloat::normalize(roundingMode rounding_mode,
1285*9880d681SAndroid Build Coastguard Worker                    lostFraction lost_fraction)
1286*9880d681SAndroid Build Coastguard Worker {
1287*9880d681SAndroid Build Coastguard Worker   unsigned int omsb;                /* One, not zero, based MSB.  */
1288*9880d681SAndroid Build Coastguard Worker   int exponentChange;
1289*9880d681SAndroid Build Coastguard Worker 
1290*9880d681SAndroid Build Coastguard Worker   if (!isFiniteNonZero())
1291*9880d681SAndroid Build Coastguard Worker     return opOK;
1292*9880d681SAndroid Build Coastguard Worker 
1293*9880d681SAndroid Build Coastguard Worker   /* Before rounding normalize the exponent of fcNormal numbers.  */
1294*9880d681SAndroid Build Coastguard Worker   omsb = significandMSB() + 1;
1295*9880d681SAndroid Build Coastguard Worker 
1296*9880d681SAndroid Build Coastguard Worker   if (omsb) {
1297*9880d681SAndroid Build Coastguard Worker     /* OMSB is numbered from 1.  We want to place it in the integer
1298*9880d681SAndroid Build Coastguard Worker        bit numbered PRECISION if possible, with a compensating change in
1299*9880d681SAndroid Build Coastguard Worker        the exponent.  */
1300*9880d681SAndroid Build Coastguard Worker     exponentChange = omsb - semantics->precision;
1301*9880d681SAndroid Build Coastguard Worker 
1302*9880d681SAndroid Build Coastguard Worker     /* If the resulting exponent is too high, overflow according to
1303*9880d681SAndroid Build Coastguard Worker        the rounding mode.  */
1304*9880d681SAndroid Build Coastguard Worker     if (exponent + exponentChange > semantics->maxExponent)
1305*9880d681SAndroid Build Coastguard Worker       return handleOverflow(rounding_mode);
1306*9880d681SAndroid Build Coastguard Worker 
1307*9880d681SAndroid Build Coastguard Worker     /* Subnormal numbers have exponent minExponent, and their MSB
1308*9880d681SAndroid Build Coastguard Worker        is forced based on that.  */
1309*9880d681SAndroid Build Coastguard Worker     if (exponent + exponentChange < semantics->minExponent)
1310*9880d681SAndroid Build Coastguard Worker       exponentChange = semantics->minExponent - exponent;
1311*9880d681SAndroid Build Coastguard Worker 
1312*9880d681SAndroid Build Coastguard Worker     /* Shifting left is easy as we don't lose precision.  */
1313*9880d681SAndroid Build Coastguard Worker     if (exponentChange < 0) {
1314*9880d681SAndroid Build Coastguard Worker       assert(lost_fraction == lfExactlyZero);
1315*9880d681SAndroid Build Coastguard Worker 
1316*9880d681SAndroid Build Coastguard Worker       shiftSignificandLeft(-exponentChange);
1317*9880d681SAndroid Build Coastguard Worker 
1318*9880d681SAndroid Build Coastguard Worker       return opOK;
1319*9880d681SAndroid Build Coastguard Worker     }
1320*9880d681SAndroid Build Coastguard Worker 
1321*9880d681SAndroid Build Coastguard Worker     if (exponentChange > 0) {
1322*9880d681SAndroid Build Coastguard Worker       lostFraction lf;
1323*9880d681SAndroid Build Coastguard Worker 
1324*9880d681SAndroid Build Coastguard Worker       /* Shift right and capture any new lost fraction.  */
1325*9880d681SAndroid Build Coastguard Worker       lf = shiftSignificandRight(exponentChange);
1326*9880d681SAndroid Build Coastguard Worker 
1327*9880d681SAndroid Build Coastguard Worker       lost_fraction = combineLostFractions(lf, lost_fraction);
1328*9880d681SAndroid Build Coastguard Worker 
1329*9880d681SAndroid Build Coastguard Worker       /* Keep OMSB up-to-date.  */
1330*9880d681SAndroid Build Coastguard Worker       if (omsb > (unsigned) exponentChange)
1331*9880d681SAndroid Build Coastguard Worker         omsb -= exponentChange;
1332*9880d681SAndroid Build Coastguard Worker       else
1333*9880d681SAndroid Build Coastguard Worker         omsb = 0;
1334*9880d681SAndroid Build Coastguard Worker     }
1335*9880d681SAndroid Build Coastguard Worker   }
1336*9880d681SAndroid Build Coastguard Worker 
1337*9880d681SAndroid Build Coastguard Worker   /* Now round the number according to rounding_mode given the lost
1338*9880d681SAndroid Build Coastguard Worker      fraction.  */
1339*9880d681SAndroid Build Coastguard Worker 
1340*9880d681SAndroid Build Coastguard Worker   /* As specified in IEEE 754, since we do not trap we do not report
1341*9880d681SAndroid Build Coastguard Worker      underflow for exact results.  */
1342*9880d681SAndroid Build Coastguard Worker   if (lost_fraction == lfExactlyZero) {
1343*9880d681SAndroid Build Coastguard Worker     /* Canonicalize zeroes.  */
1344*9880d681SAndroid Build Coastguard Worker     if (omsb == 0)
1345*9880d681SAndroid Build Coastguard Worker       category = fcZero;
1346*9880d681SAndroid Build Coastguard Worker 
1347*9880d681SAndroid Build Coastguard Worker     return opOK;
1348*9880d681SAndroid Build Coastguard Worker   }
1349*9880d681SAndroid Build Coastguard Worker 
1350*9880d681SAndroid Build Coastguard Worker   /* Increment the significand if we're rounding away from zero.  */
1351*9880d681SAndroid Build Coastguard Worker   if (roundAwayFromZero(rounding_mode, lost_fraction, 0)) {
1352*9880d681SAndroid Build Coastguard Worker     if (omsb == 0)
1353*9880d681SAndroid Build Coastguard Worker       exponent = semantics->minExponent;
1354*9880d681SAndroid Build Coastguard Worker 
1355*9880d681SAndroid Build Coastguard Worker     incrementSignificand();
1356*9880d681SAndroid Build Coastguard Worker     omsb = significandMSB() + 1;
1357*9880d681SAndroid Build Coastguard Worker 
1358*9880d681SAndroid Build Coastguard Worker     /* Did the significand increment overflow?  */
1359*9880d681SAndroid Build Coastguard Worker     if (omsb == (unsigned) semantics->precision + 1) {
1360*9880d681SAndroid Build Coastguard Worker       /* Renormalize by incrementing the exponent and shifting our
1361*9880d681SAndroid Build Coastguard Worker          significand right one.  However if we already have the
1362*9880d681SAndroid Build Coastguard Worker          maximum exponent we overflow to infinity.  */
1363*9880d681SAndroid Build Coastguard Worker       if (exponent == semantics->maxExponent) {
1364*9880d681SAndroid Build Coastguard Worker         category = fcInfinity;
1365*9880d681SAndroid Build Coastguard Worker 
1366*9880d681SAndroid Build Coastguard Worker         return (opStatus) (opOverflow | opInexact);
1367*9880d681SAndroid Build Coastguard Worker       }
1368*9880d681SAndroid Build Coastguard Worker 
1369*9880d681SAndroid Build Coastguard Worker       shiftSignificandRight(1);
1370*9880d681SAndroid Build Coastguard Worker 
1371*9880d681SAndroid Build Coastguard Worker       return opInexact;
1372*9880d681SAndroid Build Coastguard Worker     }
1373*9880d681SAndroid Build Coastguard Worker   }
1374*9880d681SAndroid Build Coastguard Worker 
1375*9880d681SAndroid Build Coastguard Worker   /* The normal case - we were and are not denormal, and any
1376*9880d681SAndroid Build Coastguard Worker      significand increment above didn't overflow.  */
1377*9880d681SAndroid Build Coastguard Worker   if (omsb == semantics->precision)
1378*9880d681SAndroid Build Coastguard Worker     return opInexact;
1379*9880d681SAndroid Build Coastguard Worker 
1380*9880d681SAndroid Build Coastguard Worker   /* We have a non-zero denormal.  */
1381*9880d681SAndroid Build Coastguard Worker   assert(omsb < semantics->precision);
1382*9880d681SAndroid Build Coastguard Worker 
1383*9880d681SAndroid Build Coastguard Worker   /* Canonicalize zeroes.  */
1384*9880d681SAndroid Build Coastguard Worker   if (omsb == 0)
1385*9880d681SAndroid Build Coastguard Worker     category = fcZero;
1386*9880d681SAndroid Build Coastguard Worker 
1387*9880d681SAndroid Build Coastguard Worker   /* The fcZero case is a denormal that underflowed to zero.  */
1388*9880d681SAndroid Build Coastguard Worker   return (opStatus) (opUnderflow | opInexact);
1389*9880d681SAndroid Build Coastguard Worker }
1390*9880d681SAndroid Build Coastguard Worker 
1391*9880d681SAndroid Build Coastguard Worker APFloat::opStatus
addOrSubtractSpecials(const APFloat & rhs,bool subtract)1392*9880d681SAndroid Build Coastguard Worker APFloat::addOrSubtractSpecials(const APFloat &rhs, bool subtract)
1393*9880d681SAndroid Build Coastguard Worker {
1394*9880d681SAndroid Build Coastguard Worker   switch (PackCategoriesIntoKey(category, rhs.category)) {
1395*9880d681SAndroid Build Coastguard Worker   default:
1396*9880d681SAndroid Build Coastguard Worker     llvm_unreachable(nullptr);
1397*9880d681SAndroid Build Coastguard Worker 
1398*9880d681SAndroid Build Coastguard Worker   case PackCategoriesIntoKey(fcNaN, fcZero):
1399*9880d681SAndroid Build Coastguard Worker   case PackCategoriesIntoKey(fcNaN, fcNormal):
1400*9880d681SAndroid Build Coastguard Worker   case PackCategoriesIntoKey(fcNaN, fcInfinity):
1401*9880d681SAndroid Build Coastguard Worker   case PackCategoriesIntoKey(fcNaN, fcNaN):
1402*9880d681SAndroid Build Coastguard Worker   case PackCategoriesIntoKey(fcNormal, fcZero):
1403*9880d681SAndroid Build Coastguard Worker   case PackCategoriesIntoKey(fcInfinity, fcNormal):
1404*9880d681SAndroid Build Coastguard Worker   case PackCategoriesIntoKey(fcInfinity, fcZero):
1405*9880d681SAndroid Build Coastguard Worker     return opOK;
1406*9880d681SAndroid Build Coastguard Worker 
1407*9880d681SAndroid Build Coastguard Worker   case PackCategoriesIntoKey(fcZero, fcNaN):
1408*9880d681SAndroid Build Coastguard Worker   case PackCategoriesIntoKey(fcNormal, fcNaN):
1409*9880d681SAndroid Build Coastguard Worker   case PackCategoriesIntoKey(fcInfinity, fcNaN):
1410*9880d681SAndroid Build Coastguard Worker     // We need to be sure to flip the sign here for subtraction because we
1411*9880d681SAndroid Build Coastguard Worker     // don't have a separate negate operation so -NaN becomes 0 - NaN here.
1412*9880d681SAndroid Build Coastguard Worker     sign = rhs.sign ^ subtract;
1413*9880d681SAndroid Build Coastguard Worker     category = fcNaN;
1414*9880d681SAndroid Build Coastguard Worker     copySignificand(rhs);
1415*9880d681SAndroid Build Coastguard Worker     return opOK;
1416*9880d681SAndroid Build Coastguard Worker 
1417*9880d681SAndroid Build Coastguard Worker   case PackCategoriesIntoKey(fcNormal, fcInfinity):
1418*9880d681SAndroid Build Coastguard Worker   case PackCategoriesIntoKey(fcZero, fcInfinity):
1419*9880d681SAndroid Build Coastguard Worker     category = fcInfinity;
1420*9880d681SAndroid Build Coastguard Worker     sign = rhs.sign ^ subtract;
1421*9880d681SAndroid Build Coastguard Worker     return opOK;
1422*9880d681SAndroid Build Coastguard Worker 
1423*9880d681SAndroid Build Coastguard Worker   case PackCategoriesIntoKey(fcZero, fcNormal):
1424*9880d681SAndroid Build Coastguard Worker     assign(rhs);
1425*9880d681SAndroid Build Coastguard Worker     sign = rhs.sign ^ subtract;
1426*9880d681SAndroid Build Coastguard Worker     return opOK;
1427*9880d681SAndroid Build Coastguard Worker 
1428*9880d681SAndroid Build Coastguard Worker   case PackCategoriesIntoKey(fcZero, fcZero):
1429*9880d681SAndroid Build Coastguard Worker     /* Sign depends on rounding mode; handled by caller.  */
1430*9880d681SAndroid Build Coastguard Worker     return opOK;
1431*9880d681SAndroid Build Coastguard Worker 
1432*9880d681SAndroid Build Coastguard Worker   case PackCategoriesIntoKey(fcInfinity, fcInfinity):
1433*9880d681SAndroid Build Coastguard Worker     /* Differently signed infinities can only be validly
1434*9880d681SAndroid Build Coastguard Worker        subtracted.  */
1435*9880d681SAndroid Build Coastguard Worker     if (((sign ^ rhs.sign)!=0) != subtract) {
1436*9880d681SAndroid Build Coastguard Worker       makeNaN();
1437*9880d681SAndroid Build Coastguard Worker       return opInvalidOp;
1438*9880d681SAndroid Build Coastguard Worker     }
1439*9880d681SAndroid Build Coastguard Worker 
1440*9880d681SAndroid Build Coastguard Worker     return opOK;
1441*9880d681SAndroid Build Coastguard Worker 
1442*9880d681SAndroid Build Coastguard Worker   case PackCategoriesIntoKey(fcNormal, fcNormal):
1443*9880d681SAndroid Build Coastguard Worker     return opDivByZero;
1444*9880d681SAndroid Build Coastguard Worker   }
1445*9880d681SAndroid Build Coastguard Worker }
1446*9880d681SAndroid Build Coastguard Worker 
1447*9880d681SAndroid Build Coastguard Worker /* Add or subtract two normal numbers.  */
1448*9880d681SAndroid Build Coastguard Worker lostFraction
addOrSubtractSignificand(const APFloat & rhs,bool subtract)1449*9880d681SAndroid Build Coastguard Worker APFloat::addOrSubtractSignificand(const APFloat &rhs, bool subtract)
1450*9880d681SAndroid Build Coastguard Worker {
1451*9880d681SAndroid Build Coastguard Worker   integerPart carry;
1452*9880d681SAndroid Build Coastguard Worker   lostFraction lost_fraction;
1453*9880d681SAndroid Build Coastguard Worker   int bits;
1454*9880d681SAndroid Build Coastguard Worker 
1455*9880d681SAndroid Build Coastguard Worker   /* Determine if the operation on the absolute values is effectively
1456*9880d681SAndroid Build Coastguard Worker      an addition or subtraction.  */
1457*9880d681SAndroid Build Coastguard Worker   subtract ^= static_cast<bool>(sign ^ rhs.sign);
1458*9880d681SAndroid Build Coastguard Worker 
1459*9880d681SAndroid Build Coastguard Worker   /* Are we bigger exponent-wise than the RHS?  */
1460*9880d681SAndroid Build Coastguard Worker   bits = exponent - rhs.exponent;
1461*9880d681SAndroid Build Coastguard Worker 
1462*9880d681SAndroid Build Coastguard Worker   /* Subtraction is more subtle than one might naively expect.  */
1463*9880d681SAndroid Build Coastguard Worker   if (subtract) {
1464*9880d681SAndroid Build Coastguard Worker     APFloat temp_rhs(rhs);
1465*9880d681SAndroid Build Coastguard Worker     bool reverse;
1466*9880d681SAndroid Build Coastguard Worker 
1467*9880d681SAndroid Build Coastguard Worker     if (bits == 0) {
1468*9880d681SAndroid Build Coastguard Worker       reverse = compareAbsoluteValue(temp_rhs) == cmpLessThan;
1469*9880d681SAndroid Build Coastguard Worker       lost_fraction = lfExactlyZero;
1470*9880d681SAndroid Build Coastguard Worker     } else if (bits > 0) {
1471*9880d681SAndroid Build Coastguard Worker       lost_fraction = temp_rhs.shiftSignificandRight(bits - 1);
1472*9880d681SAndroid Build Coastguard Worker       shiftSignificandLeft(1);
1473*9880d681SAndroid Build Coastguard Worker       reverse = false;
1474*9880d681SAndroid Build Coastguard Worker     } else {
1475*9880d681SAndroid Build Coastguard Worker       lost_fraction = shiftSignificandRight(-bits - 1);
1476*9880d681SAndroid Build Coastguard Worker       temp_rhs.shiftSignificandLeft(1);
1477*9880d681SAndroid Build Coastguard Worker       reverse = true;
1478*9880d681SAndroid Build Coastguard Worker     }
1479*9880d681SAndroid Build Coastguard Worker 
1480*9880d681SAndroid Build Coastguard Worker     if (reverse) {
1481*9880d681SAndroid Build Coastguard Worker       carry = temp_rhs.subtractSignificand
1482*9880d681SAndroid Build Coastguard Worker         (*this, lost_fraction != lfExactlyZero);
1483*9880d681SAndroid Build Coastguard Worker       copySignificand(temp_rhs);
1484*9880d681SAndroid Build Coastguard Worker       sign = !sign;
1485*9880d681SAndroid Build Coastguard Worker     } else {
1486*9880d681SAndroid Build Coastguard Worker       carry = subtractSignificand
1487*9880d681SAndroid Build Coastguard Worker         (temp_rhs, lost_fraction != lfExactlyZero);
1488*9880d681SAndroid Build Coastguard Worker     }
1489*9880d681SAndroid Build Coastguard Worker 
1490*9880d681SAndroid Build Coastguard Worker     /* Invert the lost fraction - it was on the RHS and
1491*9880d681SAndroid Build Coastguard Worker        subtracted.  */
1492*9880d681SAndroid Build Coastguard Worker     if (lost_fraction == lfLessThanHalf)
1493*9880d681SAndroid Build Coastguard Worker       lost_fraction = lfMoreThanHalf;
1494*9880d681SAndroid Build Coastguard Worker     else if (lost_fraction == lfMoreThanHalf)
1495*9880d681SAndroid Build Coastguard Worker       lost_fraction = lfLessThanHalf;
1496*9880d681SAndroid Build Coastguard Worker 
1497*9880d681SAndroid Build Coastguard Worker     /* The code above is intended to ensure that no borrow is
1498*9880d681SAndroid Build Coastguard Worker        necessary.  */
1499*9880d681SAndroid Build Coastguard Worker     assert(!carry);
1500*9880d681SAndroid Build Coastguard Worker     (void)carry;
1501*9880d681SAndroid Build Coastguard Worker   } else {
1502*9880d681SAndroid Build Coastguard Worker     if (bits > 0) {
1503*9880d681SAndroid Build Coastguard Worker       APFloat temp_rhs(rhs);
1504*9880d681SAndroid Build Coastguard Worker 
1505*9880d681SAndroid Build Coastguard Worker       lost_fraction = temp_rhs.shiftSignificandRight(bits);
1506*9880d681SAndroid Build Coastguard Worker       carry = addSignificand(temp_rhs);
1507*9880d681SAndroid Build Coastguard Worker     } else {
1508*9880d681SAndroid Build Coastguard Worker       lost_fraction = shiftSignificandRight(-bits);
1509*9880d681SAndroid Build Coastguard Worker       carry = addSignificand(rhs);
1510*9880d681SAndroid Build Coastguard Worker     }
1511*9880d681SAndroid Build Coastguard Worker 
1512*9880d681SAndroid Build Coastguard Worker     /* We have a guard bit; generating a carry cannot happen.  */
1513*9880d681SAndroid Build Coastguard Worker     assert(!carry);
1514*9880d681SAndroid Build Coastguard Worker     (void)carry;
1515*9880d681SAndroid Build Coastguard Worker   }
1516*9880d681SAndroid Build Coastguard Worker 
1517*9880d681SAndroid Build Coastguard Worker   return lost_fraction;
1518*9880d681SAndroid Build Coastguard Worker }
1519*9880d681SAndroid Build Coastguard Worker 
1520*9880d681SAndroid Build Coastguard Worker APFloat::opStatus
multiplySpecials(const APFloat & rhs)1521*9880d681SAndroid Build Coastguard Worker APFloat::multiplySpecials(const APFloat &rhs)
1522*9880d681SAndroid Build Coastguard Worker {
1523*9880d681SAndroid Build Coastguard Worker   switch (PackCategoriesIntoKey(category, rhs.category)) {
1524*9880d681SAndroid Build Coastguard Worker   default:
1525*9880d681SAndroid Build Coastguard Worker     llvm_unreachable(nullptr);
1526*9880d681SAndroid Build Coastguard Worker 
1527*9880d681SAndroid Build Coastguard Worker   case PackCategoriesIntoKey(fcNaN, fcZero):
1528*9880d681SAndroid Build Coastguard Worker   case PackCategoriesIntoKey(fcNaN, fcNormal):
1529*9880d681SAndroid Build Coastguard Worker   case PackCategoriesIntoKey(fcNaN, fcInfinity):
1530*9880d681SAndroid Build Coastguard Worker   case PackCategoriesIntoKey(fcNaN, fcNaN):
1531*9880d681SAndroid Build Coastguard Worker     sign = false;
1532*9880d681SAndroid Build Coastguard Worker     return opOK;
1533*9880d681SAndroid Build Coastguard Worker 
1534*9880d681SAndroid Build Coastguard Worker   case PackCategoriesIntoKey(fcZero, fcNaN):
1535*9880d681SAndroid Build Coastguard Worker   case PackCategoriesIntoKey(fcNormal, fcNaN):
1536*9880d681SAndroid Build Coastguard Worker   case PackCategoriesIntoKey(fcInfinity, fcNaN):
1537*9880d681SAndroid Build Coastguard Worker     sign = false;
1538*9880d681SAndroid Build Coastguard Worker     category = fcNaN;
1539*9880d681SAndroid Build Coastguard Worker     copySignificand(rhs);
1540*9880d681SAndroid Build Coastguard Worker     return opOK;
1541*9880d681SAndroid Build Coastguard Worker 
1542*9880d681SAndroid Build Coastguard Worker   case PackCategoriesIntoKey(fcNormal, fcInfinity):
1543*9880d681SAndroid Build Coastguard Worker   case PackCategoriesIntoKey(fcInfinity, fcNormal):
1544*9880d681SAndroid Build Coastguard Worker   case PackCategoriesIntoKey(fcInfinity, fcInfinity):
1545*9880d681SAndroid Build Coastguard Worker     category = fcInfinity;
1546*9880d681SAndroid Build Coastguard Worker     return opOK;
1547*9880d681SAndroid Build Coastguard Worker 
1548*9880d681SAndroid Build Coastguard Worker   case PackCategoriesIntoKey(fcZero, fcNormal):
1549*9880d681SAndroid Build Coastguard Worker   case PackCategoriesIntoKey(fcNormal, fcZero):
1550*9880d681SAndroid Build Coastguard Worker   case PackCategoriesIntoKey(fcZero, fcZero):
1551*9880d681SAndroid Build Coastguard Worker     category = fcZero;
1552*9880d681SAndroid Build Coastguard Worker     return opOK;
1553*9880d681SAndroid Build Coastguard Worker 
1554*9880d681SAndroid Build Coastguard Worker   case PackCategoriesIntoKey(fcZero, fcInfinity):
1555*9880d681SAndroid Build Coastguard Worker   case PackCategoriesIntoKey(fcInfinity, fcZero):
1556*9880d681SAndroid Build Coastguard Worker     makeNaN();
1557*9880d681SAndroid Build Coastguard Worker     return opInvalidOp;
1558*9880d681SAndroid Build Coastguard Worker 
1559*9880d681SAndroid Build Coastguard Worker   case PackCategoriesIntoKey(fcNormal, fcNormal):
1560*9880d681SAndroid Build Coastguard Worker     return opOK;
1561*9880d681SAndroid Build Coastguard Worker   }
1562*9880d681SAndroid Build Coastguard Worker }
1563*9880d681SAndroid Build Coastguard Worker 
1564*9880d681SAndroid Build Coastguard Worker APFloat::opStatus
divideSpecials(const APFloat & rhs)1565*9880d681SAndroid Build Coastguard Worker APFloat::divideSpecials(const APFloat &rhs)
1566*9880d681SAndroid Build Coastguard Worker {
1567*9880d681SAndroid Build Coastguard Worker   switch (PackCategoriesIntoKey(category, rhs.category)) {
1568*9880d681SAndroid Build Coastguard Worker   default:
1569*9880d681SAndroid Build Coastguard Worker     llvm_unreachable(nullptr);
1570*9880d681SAndroid Build Coastguard Worker 
1571*9880d681SAndroid Build Coastguard Worker   case PackCategoriesIntoKey(fcZero, fcNaN):
1572*9880d681SAndroid Build Coastguard Worker   case PackCategoriesIntoKey(fcNormal, fcNaN):
1573*9880d681SAndroid Build Coastguard Worker   case PackCategoriesIntoKey(fcInfinity, fcNaN):
1574*9880d681SAndroid Build Coastguard Worker     category = fcNaN;
1575*9880d681SAndroid Build Coastguard Worker     copySignificand(rhs);
1576*9880d681SAndroid Build Coastguard Worker   case PackCategoriesIntoKey(fcNaN, fcZero):
1577*9880d681SAndroid Build Coastguard Worker   case PackCategoriesIntoKey(fcNaN, fcNormal):
1578*9880d681SAndroid Build Coastguard Worker   case PackCategoriesIntoKey(fcNaN, fcInfinity):
1579*9880d681SAndroid Build Coastguard Worker   case PackCategoriesIntoKey(fcNaN, fcNaN):
1580*9880d681SAndroid Build Coastguard Worker     sign = false;
1581*9880d681SAndroid Build Coastguard Worker   case PackCategoriesIntoKey(fcInfinity, fcZero):
1582*9880d681SAndroid Build Coastguard Worker   case PackCategoriesIntoKey(fcInfinity, fcNormal):
1583*9880d681SAndroid Build Coastguard Worker   case PackCategoriesIntoKey(fcZero, fcInfinity):
1584*9880d681SAndroid Build Coastguard Worker   case PackCategoriesIntoKey(fcZero, fcNormal):
1585*9880d681SAndroid Build Coastguard Worker     return opOK;
1586*9880d681SAndroid Build Coastguard Worker 
1587*9880d681SAndroid Build Coastguard Worker   case PackCategoriesIntoKey(fcNormal, fcInfinity):
1588*9880d681SAndroid Build Coastguard Worker     category = fcZero;
1589*9880d681SAndroid Build Coastguard Worker     return opOK;
1590*9880d681SAndroid Build Coastguard Worker 
1591*9880d681SAndroid Build Coastguard Worker   case PackCategoriesIntoKey(fcNormal, fcZero):
1592*9880d681SAndroid Build Coastguard Worker     category = fcInfinity;
1593*9880d681SAndroid Build Coastguard Worker     return opDivByZero;
1594*9880d681SAndroid Build Coastguard Worker 
1595*9880d681SAndroid Build Coastguard Worker   case PackCategoriesIntoKey(fcInfinity, fcInfinity):
1596*9880d681SAndroid Build Coastguard Worker   case PackCategoriesIntoKey(fcZero, fcZero):
1597*9880d681SAndroid Build Coastguard Worker     makeNaN();
1598*9880d681SAndroid Build Coastguard Worker     return opInvalidOp;
1599*9880d681SAndroid Build Coastguard Worker 
1600*9880d681SAndroid Build Coastguard Worker   case PackCategoriesIntoKey(fcNormal, fcNormal):
1601*9880d681SAndroid Build Coastguard Worker     return opOK;
1602*9880d681SAndroid Build Coastguard Worker   }
1603*9880d681SAndroid Build Coastguard Worker }
1604*9880d681SAndroid Build Coastguard Worker 
1605*9880d681SAndroid Build Coastguard Worker APFloat::opStatus
modSpecials(const APFloat & rhs)1606*9880d681SAndroid Build Coastguard Worker APFloat::modSpecials(const APFloat &rhs)
1607*9880d681SAndroid Build Coastguard Worker {
1608*9880d681SAndroid Build Coastguard Worker   switch (PackCategoriesIntoKey(category, rhs.category)) {
1609*9880d681SAndroid Build Coastguard Worker   default:
1610*9880d681SAndroid Build Coastguard Worker     llvm_unreachable(nullptr);
1611*9880d681SAndroid Build Coastguard Worker 
1612*9880d681SAndroid Build Coastguard Worker   case PackCategoriesIntoKey(fcNaN, fcZero):
1613*9880d681SAndroid Build Coastguard Worker   case PackCategoriesIntoKey(fcNaN, fcNormal):
1614*9880d681SAndroid Build Coastguard Worker   case PackCategoriesIntoKey(fcNaN, fcInfinity):
1615*9880d681SAndroid Build Coastguard Worker   case PackCategoriesIntoKey(fcNaN, fcNaN):
1616*9880d681SAndroid Build Coastguard Worker   case PackCategoriesIntoKey(fcZero, fcInfinity):
1617*9880d681SAndroid Build Coastguard Worker   case PackCategoriesIntoKey(fcZero, fcNormal):
1618*9880d681SAndroid Build Coastguard Worker   case PackCategoriesIntoKey(fcNormal, fcInfinity):
1619*9880d681SAndroid Build Coastguard Worker     return opOK;
1620*9880d681SAndroid Build Coastguard Worker 
1621*9880d681SAndroid Build Coastguard Worker   case PackCategoriesIntoKey(fcZero, fcNaN):
1622*9880d681SAndroid Build Coastguard Worker   case PackCategoriesIntoKey(fcNormal, fcNaN):
1623*9880d681SAndroid Build Coastguard Worker   case PackCategoriesIntoKey(fcInfinity, fcNaN):
1624*9880d681SAndroid Build Coastguard Worker     sign = false;
1625*9880d681SAndroid Build Coastguard Worker     category = fcNaN;
1626*9880d681SAndroid Build Coastguard Worker     copySignificand(rhs);
1627*9880d681SAndroid Build Coastguard Worker     return opOK;
1628*9880d681SAndroid Build Coastguard Worker 
1629*9880d681SAndroid Build Coastguard Worker   case PackCategoriesIntoKey(fcNormal, fcZero):
1630*9880d681SAndroid Build Coastguard Worker   case PackCategoriesIntoKey(fcInfinity, fcZero):
1631*9880d681SAndroid Build Coastguard Worker   case PackCategoriesIntoKey(fcInfinity, fcNormal):
1632*9880d681SAndroid Build Coastguard Worker   case PackCategoriesIntoKey(fcInfinity, fcInfinity):
1633*9880d681SAndroid Build Coastguard Worker   case PackCategoriesIntoKey(fcZero, fcZero):
1634*9880d681SAndroid Build Coastguard Worker     makeNaN();
1635*9880d681SAndroid Build Coastguard Worker     return opInvalidOp;
1636*9880d681SAndroid Build Coastguard Worker 
1637*9880d681SAndroid Build Coastguard Worker   case PackCategoriesIntoKey(fcNormal, fcNormal):
1638*9880d681SAndroid Build Coastguard Worker     return opOK;
1639*9880d681SAndroid Build Coastguard Worker   }
1640*9880d681SAndroid Build Coastguard Worker }
1641*9880d681SAndroid Build Coastguard Worker 
1642*9880d681SAndroid Build Coastguard Worker /* Change sign.  */
1643*9880d681SAndroid Build Coastguard Worker void
changeSign()1644*9880d681SAndroid Build Coastguard Worker APFloat::changeSign()
1645*9880d681SAndroid Build Coastguard Worker {
1646*9880d681SAndroid Build Coastguard Worker   /* Look mummy, this one's easy.  */
1647*9880d681SAndroid Build Coastguard Worker   sign = !sign;
1648*9880d681SAndroid Build Coastguard Worker }
1649*9880d681SAndroid Build Coastguard Worker 
1650*9880d681SAndroid Build Coastguard Worker void
clearSign()1651*9880d681SAndroid Build Coastguard Worker APFloat::clearSign()
1652*9880d681SAndroid Build Coastguard Worker {
1653*9880d681SAndroid Build Coastguard Worker   /* So is this one. */
1654*9880d681SAndroid Build Coastguard Worker   sign = 0;
1655*9880d681SAndroid Build Coastguard Worker }
1656*9880d681SAndroid Build Coastguard Worker 
1657*9880d681SAndroid Build Coastguard Worker void
copySign(const APFloat & rhs)1658*9880d681SAndroid Build Coastguard Worker APFloat::copySign(const APFloat &rhs)
1659*9880d681SAndroid Build Coastguard Worker {
1660*9880d681SAndroid Build Coastguard Worker   /* And this one. */
1661*9880d681SAndroid Build Coastguard Worker   sign = rhs.sign;
1662*9880d681SAndroid Build Coastguard Worker }
1663*9880d681SAndroid Build Coastguard Worker 
1664*9880d681SAndroid Build Coastguard Worker /* Normalized addition or subtraction.  */
1665*9880d681SAndroid Build Coastguard Worker APFloat::opStatus
addOrSubtract(const APFloat & rhs,roundingMode rounding_mode,bool subtract)1666*9880d681SAndroid Build Coastguard Worker APFloat::addOrSubtract(const APFloat &rhs, roundingMode rounding_mode,
1667*9880d681SAndroid Build Coastguard Worker                        bool subtract)
1668*9880d681SAndroid Build Coastguard Worker {
1669*9880d681SAndroid Build Coastguard Worker   opStatus fs;
1670*9880d681SAndroid Build Coastguard Worker 
1671*9880d681SAndroid Build Coastguard Worker   fs = addOrSubtractSpecials(rhs, subtract);
1672*9880d681SAndroid Build Coastguard Worker 
1673*9880d681SAndroid Build Coastguard Worker   /* This return code means it was not a simple case.  */
1674*9880d681SAndroid Build Coastguard Worker   if (fs == opDivByZero) {
1675*9880d681SAndroid Build Coastguard Worker     lostFraction lost_fraction;
1676*9880d681SAndroid Build Coastguard Worker 
1677*9880d681SAndroid Build Coastguard Worker     lost_fraction = addOrSubtractSignificand(rhs, subtract);
1678*9880d681SAndroid Build Coastguard Worker     fs = normalize(rounding_mode, lost_fraction);
1679*9880d681SAndroid Build Coastguard Worker 
1680*9880d681SAndroid Build Coastguard Worker     /* Can only be zero if we lost no fraction.  */
1681*9880d681SAndroid Build Coastguard Worker     assert(category != fcZero || lost_fraction == lfExactlyZero);
1682*9880d681SAndroid Build Coastguard Worker   }
1683*9880d681SAndroid Build Coastguard Worker 
1684*9880d681SAndroid Build Coastguard Worker   /* If two numbers add (exactly) to zero, IEEE 754 decrees it is a
1685*9880d681SAndroid Build Coastguard Worker      positive zero unless rounding to minus infinity, except that
1686*9880d681SAndroid Build Coastguard Worker      adding two like-signed zeroes gives that zero.  */
1687*9880d681SAndroid Build Coastguard Worker   if (category == fcZero) {
1688*9880d681SAndroid Build Coastguard Worker     if (rhs.category != fcZero || (sign == rhs.sign) == subtract)
1689*9880d681SAndroid Build Coastguard Worker       sign = (rounding_mode == rmTowardNegative);
1690*9880d681SAndroid Build Coastguard Worker   }
1691*9880d681SAndroid Build Coastguard Worker 
1692*9880d681SAndroid Build Coastguard Worker   return fs;
1693*9880d681SAndroid Build Coastguard Worker }
1694*9880d681SAndroid Build Coastguard Worker 
1695*9880d681SAndroid Build Coastguard Worker /* Normalized addition.  */
1696*9880d681SAndroid Build Coastguard Worker APFloat::opStatus
add(const APFloat & rhs,roundingMode rounding_mode)1697*9880d681SAndroid Build Coastguard Worker APFloat::add(const APFloat &rhs, roundingMode rounding_mode)
1698*9880d681SAndroid Build Coastguard Worker {
1699*9880d681SAndroid Build Coastguard Worker   return addOrSubtract(rhs, rounding_mode, false);
1700*9880d681SAndroid Build Coastguard Worker }
1701*9880d681SAndroid Build Coastguard Worker 
1702*9880d681SAndroid Build Coastguard Worker /* Normalized subtraction.  */
1703*9880d681SAndroid Build Coastguard Worker APFloat::opStatus
subtract(const APFloat & rhs,roundingMode rounding_mode)1704*9880d681SAndroid Build Coastguard Worker APFloat::subtract(const APFloat &rhs, roundingMode rounding_mode)
1705*9880d681SAndroid Build Coastguard Worker {
1706*9880d681SAndroid Build Coastguard Worker   return addOrSubtract(rhs, rounding_mode, true);
1707*9880d681SAndroid Build Coastguard Worker }
1708*9880d681SAndroid Build Coastguard Worker 
1709*9880d681SAndroid Build Coastguard Worker /* Normalized multiply.  */
1710*9880d681SAndroid Build Coastguard Worker APFloat::opStatus
multiply(const APFloat & rhs,roundingMode rounding_mode)1711*9880d681SAndroid Build Coastguard Worker APFloat::multiply(const APFloat &rhs, roundingMode rounding_mode)
1712*9880d681SAndroid Build Coastguard Worker {
1713*9880d681SAndroid Build Coastguard Worker   opStatus fs;
1714*9880d681SAndroid Build Coastguard Worker 
1715*9880d681SAndroid Build Coastguard Worker   sign ^= rhs.sign;
1716*9880d681SAndroid Build Coastguard Worker   fs = multiplySpecials(rhs);
1717*9880d681SAndroid Build Coastguard Worker 
1718*9880d681SAndroid Build Coastguard Worker   if (isFiniteNonZero()) {
1719*9880d681SAndroid Build Coastguard Worker     lostFraction lost_fraction = multiplySignificand(rhs, nullptr);
1720*9880d681SAndroid Build Coastguard Worker     fs = normalize(rounding_mode, lost_fraction);
1721*9880d681SAndroid Build Coastguard Worker     if (lost_fraction != lfExactlyZero)
1722*9880d681SAndroid Build Coastguard Worker       fs = (opStatus) (fs | opInexact);
1723*9880d681SAndroid Build Coastguard Worker   }
1724*9880d681SAndroid Build Coastguard Worker 
1725*9880d681SAndroid Build Coastguard Worker   return fs;
1726*9880d681SAndroid Build Coastguard Worker }
1727*9880d681SAndroid Build Coastguard Worker 
1728*9880d681SAndroid Build Coastguard Worker /* Normalized divide.  */
1729*9880d681SAndroid Build Coastguard Worker APFloat::opStatus
divide(const APFloat & rhs,roundingMode rounding_mode)1730*9880d681SAndroid Build Coastguard Worker APFloat::divide(const APFloat &rhs, roundingMode rounding_mode)
1731*9880d681SAndroid Build Coastguard Worker {
1732*9880d681SAndroid Build Coastguard Worker   opStatus fs;
1733*9880d681SAndroid Build Coastguard Worker 
1734*9880d681SAndroid Build Coastguard Worker   sign ^= rhs.sign;
1735*9880d681SAndroid Build Coastguard Worker   fs = divideSpecials(rhs);
1736*9880d681SAndroid Build Coastguard Worker 
1737*9880d681SAndroid Build Coastguard Worker   if (isFiniteNonZero()) {
1738*9880d681SAndroid Build Coastguard Worker     lostFraction lost_fraction = divideSignificand(rhs);
1739*9880d681SAndroid Build Coastguard Worker     fs = normalize(rounding_mode, lost_fraction);
1740*9880d681SAndroid Build Coastguard Worker     if (lost_fraction != lfExactlyZero)
1741*9880d681SAndroid Build Coastguard Worker       fs = (opStatus) (fs | opInexact);
1742*9880d681SAndroid Build Coastguard Worker   }
1743*9880d681SAndroid Build Coastguard Worker 
1744*9880d681SAndroid Build Coastguard Worker   return fs;
1745*9880d681SAndroid Build Coastguard Worker }
1746*9880d681SAndroid Build Coastguard Worker 
1747*9880d681SAndroid Build Coastguard Worker /* Normalized remainder.  This is not currently correct in all cases.  */
1748*9880d681SAndroid Build Coastguard Worker APFloat::opStatus
remainder(const APFloat & rhs)1749*9880d681SAndroid Build Coastguard Worker APFloat::remainder(const APFloat &rhs)
1750*9880d681SAndroid Build Coastguard Worker {
1751*9880d681SAndroid Build Coastguard Worker   opStatus fs;
1752*9880d681SAndroid Build Coastguard Worker   APFloat V = *this;
1753*9880d681SAndroid Build Coastguard Worker   unsigned int origSign = sign;
1754*9880d681SAndroid Build Coastguard Worker 
1755*9880d681SAndroid Build Coastguard Worker   fs = V.divide(rhs, rmNearestTiesToEven);
1756*9880d681SAndroid Build Coastguard Worker   if (fs == opDivByZero)
1757*9880d681SAndroid Build Coastguard Worker     return fs;
1758*9880d681SAndroid Build Coastguard Worker 
1759*9880d681SAndroid Build Coastguard Worker   int parts = partCount();
1760*9880d681SAndroid Build Coastguard Worker   integerPart *x = new integerPart[parts];
1761*9880d681SAndroid Build Coastguard Worker   bool ignored;
1762*9880d681SAndroid Build Coastguard Worker   fs = V.convertToInteger(x, parts * integerPartWidth, true,
1763*9880d681SAndroid Build Coastguard Worker                           rmNearestTiesToEven, &ignored);
1764*9880d681SAndroid Build Coastguard Worker   if (fs==opInvalidOp)
1765*9880d681SAndroid Build Coastguard Worker     return fs;
1766*9880d681SAndroid Build Coastguard Worker 
1767*9880d681SAndroid Build Coastguard Worker   fs = V.convertFromZeroExtendedInteger(x, parts * integerPartWidth, true,
1768*9880d681SAndroid Build Coastguard Worker                                         rmNearestTiesToEven);
1769*9880d681SAndroid Build Coastguard Worker   assert(fs==opOK);   // should always work
1770*9880d681SAndroid Build Coastguard Worker 
1771*9880d681SAndroid Build Coastguard Worker   fs = V.multiply(rhs, rmNearestTiesToEven);
1772*9880d681SAndroid Build Coastguard Worker   assert(fs==opOK || fs==opInexact);   // should not overflow or underflow
1773*9880d681SAndroid Build Coastguard Worker 
1774*9880d681SAndroid Build Coastguard Worker   fs = subtract(V, rmNearestTiesToEven);
1775*9880d681SAndroid Build Coastguard Worker   assert(fs==opOK || fs==opInexact);   // likewise
1776*9880d681SAndroid Build Coastguard Worker 
1777*9880d681SAndroid Build Coastguard Worker   if (isZero())
1778*9880d681SAndroid Build Coastguard Worker     sign = origSign;    // IEEE754 requires this
1779*9880d681SAndroid Build Coastguard Worker   delete[] x;
1780*9880d681SAndroid Build Coastguard Worker   return fs;
1781*9880d681SAndroid Build Coastguard Worker }
1782*9880d681SAndroid Build Coastguard Worker 
1783*9880d681SAndroid Build Coastguard Worker /* Normalized llvm frem (C fmod).
1784*9880d681SAndroid Build Coastguard Worker    This is not currently correct in all cases.  */
1785*9880d681SAndroid Build Coastguard Worker APFloat::opStatus
mod(const APFloat & rhs)1786*9880d681SAndroid Build Coastguard Worker APFloat::mod(const APFloat &rhs)
1787*9880d681SAndroid Build Coastguard Worker {
1788*9880d681SAndroid Build Coastguard Worker   opStatus fs;
1789*9880d681SAndroid Build Coastguard Worker   fs = modSpecials(rhs);
1790*9880d681SAndroid Build Coastguard Worker 
1791*9880d681SAndroid Build Coastguard Worker   if (isFiniteNonZero() && rhs.isFiniteNonZero()) {
1792*9880d681SAndroid Build Coastguard Worker     APFloat V = *this;
1793*9880d681SAndroid Build Coastguard Worker     unsigned int origSign = sign;
1794*9880d681SAndroid Build Coastguard Worker 
1795*9880d681SAndroid Build Coastguard Worker     fs = V.divide(rhs, rmNearestTiesToEven);
1796*9880d681SAndroid Build Coastguard Worker     if (fs == opDivByZero)
1797*9880d681SAndroid Build Coastguard Worker       return fs;
1798*9880d681SAndroid Build Coastguard Worker 
1799*9880d681SAndroid Build Coastguard Worker     int parts = partCount();
1800*9880d681SAndroid Build Coastguard Worker     integerPart *x = new integerPart[parts];
1801*9880d681SAndroid Build Coastguard Worker     bool ignored;
1802*9880d681SAndroid Build Coastguard Worker     fs = V.convertToInteger(x, parts * integerPartWidth, true,
1803*9880d681SAndroid Build Coastguard Worker                             rmTowardZero, &ignored);
1804*9880d681SAndroid Build Coastguard Worker     if (fs==opInvalidOp)
1805*9880d681SAndroid Build Coastguard Worker       return fs;
1806*9880d681SAndroid Build Coastguard Worker 
1807*9880d681SAndroid Build Coastguard Worker     fs = V.convertFromZeroExtendedInteger(x, parts * integerPartWidth, true,
1808*9880d681SAndroid Build Coastguard Worker                                           rmNearestTiesToEven);
1809*9880d681SAndroid Build Coastguard Worker     assert(fs==opOK);   // should always work
1810*9880d681SAndroid Build Coastguard Worker 
1811*9880d681SAndroid Build Coastguard Worker     fs = V.multiply(rhs, rmNearestTiesToEven);
1812*9880d681SAndroid Build Coastguard Worker     assert(fs==opOK || fs==opInexact);   // should not overflow or underflow
1813*9880d681SAndroid Build Coastguard Worker 
1814*9880d681SAndroid Build Coastguard Worker     fs = subtract(V, rmNearestTiesToEven);
1815*9880d681SAndroid Build Coastguard Worker     assert(fs==opOK || fs==opInexact);   // likewise
1816*9880d681SAndroid Build Coastguard Worker 
1817*9880d681SAndroid Build Coastguard Worker     if (isZero())
1818*9880d681SAndroid Build Coastguard Worker       sign = origSign;    // IEEE754 requires this
1819*9880d681SAndroid Build Coastguard Worker     delete[] x;
1820*9880d681SAndroid Build Coastguard Worker   }
1821*9880d681SAndroid Build Coastguard Worker   return fs;
1822*9880d681SAndroid Build Coastguard Worker }
1823*9880d681SAndroid Build Coastguard Worker 
1824*9880d681SAndroid Build Coastguard Worker /* Normalized fused-multiply-add.  */
1825*9880d681SAndroid Build Coastguard Worker APFloat::opStatus
fusedMultiplyAdd(const APFloat & multiplicand,const APFloat & addend,roundingMode rounding_mode)1826*9880d681SAndroid Build Coastguard Worker APFloat::fusedMultiplyAdd(const APFloat &multiplicand,
1827*9880d681SAndroid Build Coastguard Worker                           const APFloat &addend,
1828*9880d681SAndroid Build Coastguard Worker                           roundingMode rounding_mode)
1829*9880d681SAndroid Build Coastguard Worker {
1830*9880d681SAndroid Build Coastguard Worker   opStatus fs;
1831*9880d681SAndroid Build Coastguard Worker 
1832*9880d681SAndroid Build Coastguard Worker   /* Post-multiplication sign, before addition.  */
1833*9880d681SAndroid Build Coastguard Worker   sign ^= multiplicand.sign;
1834*9880d681SAndroid Build Coastguard Worker 
1835*9880d681SAndroid Build Coastguard Worker   /* If and only if all arguments are normal do we need to do an
1836*9880d681SAndroid Build Coastguard Worker      extended-precision calculation.  */
1837*9880d681SAndroid Build Coastguard Worker   if (isFiniteNonZero() &&
1838*9880d681SAndroid Build Coastguard Worker       multiplicand.isFiniteNonZero() &&
1839*9880d681SAndroid Build Coastguard Worker       addend.isFinite()) {
1840*9880d681SAndroid Build Coastguard Worker     lostFraction lost_fraction;
1841*9880d681SAndroid Build Coastguard Worker 
1842*9880d681SAndroid Build Coastguard Worker     lost_fraction = multiplySignificand(multiplicand, &addend);
1843*9880d681SAndroid Build Coastguard Worker     fs = normalize(rounding_mode, lost_fraction);
1844*9880d681SAndroid Build Coastguard Worker     if (lost_fraction != lfExactlyZero)
1845*9880d681SAndroid Build Coastguard Worker       fs = (opStatus) (fs | opInexact);
1846*9880d681SAndroid Build Coastguard Worker 
1847*9880d681SAndroid Build Coastguard Worker     /* If two numbers add (exactly) to zero, IEEE 754 decrees it is a
1848*9880d681SAndroid Build Coastguard Worker        positive zero unless rounding to minus infinity, except that
1849*9880d681SAndroid Build Coastguard Worker        adding two like-signed zeroes gives that zero.  */
1850*9880d681SAndroid Build Coastguard Worker     if (category == fcZero && !(fs & opUnderflow) && sign != addend.sign)
1851*9880d681SAndroid Build Coastguard Worker       sign = (rounding_mode == rmTowardNegative);
1852*9880d681SAndroid Build Coastguard Worker   } else {
1853*9880d681SAndroid Build Coastguard Worker     fs = multiplySpecials(multiplicand);
1854*9880d681SAndroid Build Coastguard Worker 
1855*9880d681SAndroid Build Coastguard Worker     /* FS can only be opOK or opInvalidOp.  There is no more work
1856*9880d681SAndroid Build Coastguard Worker        to do in the latter case.  The IEEE-754R standard says it is
1857*9880d681SAndroid Build Coastguard Worker        implementation-defined in this case whether, if ADDEND is a
1858*9880d681SAndroid Build Coastguard Worker        quiet NaN, we raise invalid op; this implementation does so.
1859*9880d681SAndroid Build Coastguard Worker 
1860*9880d681SAndroid Build Coastguard Worker        If we need to do the addition we can do so with normal
1861*9880d681SAndroid Build Coastguard Worker        precision.  */
1862*9880d681SAndroid Build Coastguard Worker     if (fs == opOK)
1863*9880d681SAndroid Build Coastguard Worker       fs = addOrSubtract(addend, rounding_mode, false);
1864*9880d681SAndroid Build Coastguard Worker   }
1865*9880d681SAndroid Build Coastguard Worker 
1866*9880d681SAndroid Build Coastguard Worker   return fs;
1867*9880d681SAndroid Build Coastguard Worker }
1868*9880d681SAndroid Build Coastguard Worker 
1869*9880d681SAndroid Build Coastguard Worker /* Rounding-mode corrrect round to integral value.  */
roundToIntegral(roundingMode rounding_mode)1870*9880d681SAndroid Build Coastguard Worker APFloat::opStatus APFloat::roundToIntegral(roundingMode rounding_mode) {
1871*9880d681SAndroid Build Coastguard Worker   opStatus fs;
1872*9880d681SAndroid Build Coastguard Worker 
1873*9880d681SAndroid Build Coastguard Worker   // If the exponent is large enough, we know that this value is already
1874*9880d681SAndroid Build Coastguard Worker   // integral, and the arithmetic below would potentially cause it to saturate
1875*9880d681SAndroid Build Coastguard Worker   // to +/-Inf.  Bail out early instead.
1876*9880d681SAndroid Build Coastguard Worker   if (isFiniteNonZero() && exponent+1 >= (int)semanticsPrecision(*semantics))
1877*9880d681SAndroid Build Coastguard Worker     return opOK;
1878*9880d681SAndroid Build Coastguard Worker 
1879*9880d681SAndroid Build Coastguard Worker   // The algorithm here is quite simple: we add 2^(p-1), where p is the
1880*9880d681SAndroid Build Coastguard Worker   // precision of our format, and then subtract it back off again.  The choice
1881*9880d681SAndroid Build Coastguard Worker   // of rounding modes for the addition/subtraction determines the rounding mode
1882*9880d681SAndroid Build Coastguard Worker   // for our integral rounding as well.
1883*9880d681SAndroid Build Coastguard Worker   // NOTE: When the input value is negative, we do subtraction followed by
1884*9880d681SAndroid Build Coastguard Worker   // addition instead.
1885*9880d681SAndroid Build Coastguard Worker   APInt IntegerConstant(NextPowerOf2(semanticsPrecision(*semantics)), 1);
1886*9880d681SAndroid Build Coastguard Worker   IntegerConstant <<= semanticsPrecision(*semantics)-1;
1887*9880d681SAndroid Build Coastguard Worker   APFloat MagicConstant(*semantics);
1888*9880d681SAndroid Build Coastguard Worker   fs = MagicConstant.convertFromAPInt(IntegerConstant, false,
1889*9880d681SAndroid Build Coastguard Worker                                       rmNearestTiesToEven);
1890*9880d681SAndroid Build Coastguard Worker   MagicConstant.copySign(*this);
1891*9880d681SAndroid Build Coastguard Worker 
1892*9880d681SAndroid Build Coastguard Worker   if (fs != opOK)
1893*9880d681SAndroid Build Coastguard Worker     return fs;
1894*9880d681SAndroid Build Coastguard Worker 
1895*9880d681SAndroid Build Coastguard Worker   // Preserve the input sign so that we can handle 0.0/-0.0 cases correctly.
1896*9880d681SAndroid Build Coastguard Worker   bool inputSign = isNegative();
1897*9880d681SAndroid Build Coastguard Worker 
1898*9880d681SAndroid Build Coastguard Worker   fs = add(MagicConstant, rounding_mode);
1899*9880d681SAndroid Build Coastguard Worker   if (fs != opOK && fs != opInexact)
1900*9880d681SAndroid Build Coastguard Worker     return fs;
1901*9880d681SAndroid Build Coastguard Worker 
1902*9880d681SAndroid Build Coastguard Worker   fs = subtract(MagicConstant, rounding_mode);
1903*9880d681SAndroid Build Coastguard Worker 
1904*9880d681SAndroid Build Coastguard Worker   // Restore the input sign.
1905*9880d681SAndroid Build Coastguard Worker   if (inputSign != isNegative())
1906*9880d681SAndroid Build Coastguard Worker     changeSign();
1907*9880d681SAndroid Build Coastguard Worker 
1908*9880d681SAndroid Build Coastguard Worker   return fs;
1909*9880d681SAndroid Build Coastguard Worker }
1910*9880d681SAndroid Build Coastguard Worker 
1911*9880d681SAndroid Build Coastguard Worker 
1912*9880d681SAndroid Build Coastguard Worker /* Comparison requires normalized numbers.  */
1913*9880d681SAndroid Build Coastguard Worker APFloat::cmpResult
compare(const APFloat & rhs) const1914*9880d681SAndroid Build Coastguard Worker APFloat::compare(const APFloat &rhs) const
1915*9880d681SAndroid Build Coastguard Worker {
1916*9880d681SAndroid Build Coastguard Worker   cmpResult result;
1917*9880d681SAndroid Build Coastguard Worker 
1918*9880d681SAndroid Build Coastguard Worker   assert(semantics == rhs.semantics);
1919*9880d681SAndroid Build Coastguard Worker 
1920*9880d681SAndroid Build Coastguard Worker   switch (PackCategoriesIntoKey(category, rhs.category)) {
1921*9880d681SAndroid Build Coastguard Worker   default:
1922*9880d681SAndroid Build Coastguard Worker     llvm_unreachable(nullptr);
1923*9880d681SAndroid Build Coastguard Worker 
1924*9880d681SAndroid Build Coastguard Worker   case PackCategoriesIntoKey(fcNaN, fcZero):
1925*9880d681SAndroid Build Coastguard Worker   case PackCategoriesIntoKey(fcNaN, fcNormal):
1926*9880d681SAndroid Build Coastguard Worker   case PackCategoriesIntoKey(fcNaN, fcInfinity):
1927*9880d681SAndroid Build Coastguard Worker   case PackCategoriesIntoKey(fcNaN, fcNaN):
1928*9880d681SAndroid Build Coastguard Worker   case PackCategoriesIntoKey(fcZero, fcNaN):
1929*9880d681SAndroid Build Coastguard Worker   case PackCategoriesIntoKey(fcNormal, fcNaN):
1930*9880d681SAndroid Build Coastguard Worker   case PackCategoriesIntoKey(fcInfinity, fcNaN):
1931*9880d681SAndroid Build Coastguard Worker     return cmpUnordered;
1932*9880d681SAndroid Build Coastguard Worker 
1933*9880d681SAndroid Build Coastguard Worker   case PackCategoriesIntoKey(fcInfinity, fcNormal):
1934*9880d681SAndroid Build Coastguard Worker   case PackCategoriesIntoKey(fcInfinity, fcZero):
1935*9880d681SAndroid Build Coastguard Worker   case PackCategoriesIntoKey(fcNormal, fcZero):
1936*9880d681SAndroid Build Coastguard Worker     if (sign)
1937*9880d681SAndroid Build Coastguard Worker       return cmpLessThan;
1938*9880d681SAndroid Build Coastguard Worker     else
1939*9880d681SAndroid Build Coastguard Worker       return cmpGreaterThan;
1940*9880d681SAndroid Build Coastguard Worker 
1941*9880d681SAndroid Build Coastguard Worker   case PackCategoriesIntoKey(fcNormal, fcInfinity):
1942*9880d681SAndroid Build Coastguard Worker   case PackCategoriesIntoKey(fcZero, fcInfinity):
1943*9880d681SAndroid Build Coastguard Worker   case PackCategoriesIntoKey(fcZero, fcNormal):
1944*9880d681SAndroid Build Coastguard Worker     if (rhs.sign)
1945*9880d681SAndroid Build Coastguard Worker       return cmpGreaterThan;
1946*9880d681SAndroid Build Coastguard Worker     else
1947*9880d681SAndroid Build Coastguard Worker       return cmpLessThan;
1948*9880d681SAndroid Build Coastguard Worker 
1949*9880d681SAndroid Build Coastguard Worker   case PackCategoriesIntoKey(fcInfinity, fcInfinity):
1950*9880d681SAndroid Build Coastguard Worker     if (sign == rhs.sign)
1951*9880d681SAndroid Build Coastguard Worker       return cmpEqual;
1952*9880d681SAndroid Build Coastguard Worker     else if (sign)
1953*9880d681SAndroid Build Coastguard Worker       return cmpLessThan;
1954*9880d681SAndroid Build Coastguard Worker     else
1955*9880d681SAndroid Build Coastguard Worker       return cmpGreaterThan;
1956*9880d681SAndroid Build Coastguard Worker 
1957*9880d681SAndroid Build Coastguard Worker   case PackCategoriesIntoKey(fcZero, fcZero):
1958*9880d681SAndroid Build Coastguard Worker     return cmpEqual;
1959*9880d681SAndroid Build Coastguard Worker 
1960*9880d681SAndroid Build Coastguard Worker   case PackCategoriesIntoKey(fcNormal, fcNormal):
1961*9880d681SAndroid Build Coastguard Worker     break;
1962*9880d681SAndroid Build Coastguard Worker   }
1963*9880d681SAndroid Build Coastguard Worker 
1964*9880d681SAndroid Build Coastguard Worker   /* Two normal numbers.  Do they have the same sign?  */
1965*9880d681SAndroid Build Coastguard Worker   if (sign != rhs.sign) {
1966*9880d681SAndroid Build Coastguard Worker     if (sign)
1967*9880d681SAndroid Build Coastguard Worker       result = cmpLessThan;
1968*9880d681SAndroid Build Coastguard Worker     else
1969*9880d681SAndroid Build Coastguard Worker       result = cmpGreaterThan;
1970*9880d681SAndroid Build Coastguard Worker   } else {
1971*9880d681SAndroid Build Coastguard Worker     /* Compare absolute values; invert result if negative.  */
1972*9880d681SAndroid Build Coastguard Worker     result = compareAbsoluteValue(rhs);
1973*9880d681SAndroid Build Coastguard Worker 
1974*9880d681SAndroid Build Coastguard Worker     if (sign) {
1975*9880d681SAndroid Build Coastguard Worker       if (result == cmpLessThan)
1976*9880d681SAndroid Build Coastguard Worker         result = cmpGreaterThan;
1977*9880d681SAndroid Build Coastguard Worker       else if (result == cmpGreaterThan)
1978*9880d681SAndroid Build Coastguard Worker         result = cmpLessThan;
1979*9880d681SAndroid Build Coastguard Worker     }
1980*9880d681SAndroid Build Coastguard Worker   }
1981*9880d681SAndroid Build Coastguard Worker 
1982*9880d681SAndroid Build Coastguard Worker   return result;
1983*9880d681SAndroid Build Coastguard Worker }
1984*9880d681SAndroid Build Coastguard Worker 
1985*9880d681SAndroid Build Coastguard Worker /// APFloat::convert - convert a value of one floating point type to another.
1986*9880d681SAndroid Build Coastguard Worker /// The return value corresponds to the IEEE754 exceptions.  *losesInfo
1987*9880d681SAndroid Build Coastguard Worker /// records whether the transformation lost information, i.e. whether
1988*9880d681SAndroid Build Coastguard Worker /// converting the result back to the original type will produce the
1989*9880d681SAndroid Build Coastguard Worker /// original value (this is almost the same as return value==fsOK, but there
1990*9880d681SAndroid Build Coastguard Worker /// are edge cases where this is not so).
1991*9880d681SAndroid Build Coastguard Worker 
1992*9880d681SAndroid Build Coastguard Worker APFloat::opStatus
convert(const fltSemantics & toSemantics,roundingMode rounding_mode,bool * losesInfo)1993*9880d681SAndroid Build Coastguard Worker APFloat::convert(const fltSemantics &toSemantics,
1994*9880d681SAndroid Build Coastguard Worker                  roundingMode rounding_mode, bool *losesInfo)
1995*9880d681SAndroid Build Coastguard Worker {
1996*9880d681SAndroid Build Coastguard Worker   lostFraction lostFraction;
1997*9880d681SAndroid Build Coastguard Worker   unsigned int newPartCount, oldPartCount;
1998*9880d681SAndroid Build Coastguard Worker   opStatus fs;
1999*9880d681SAndroid Build Coastguard Worker   int shift;
2000*9880d681SAndroid Build Coastguard Worker   const fltSemantics &fromSemantics = *semantics;
2001*9880d681SAndroid Build Coastguard Worker 
2002*9880d681SAndroid Build Coastguard Worker   lostFraction = lfExactlyZero;
2003*9880d681SAndroid Build Coastguard Worker   newPartCount = partCountForBits(toSemantics.precision + 1);
2004*9880d681SAndroid Build Coastguard Worker   oldPartCount = partCount();
2005*9880d681SAndroid Build Coastguard Worker   shift = toSemantics.precision - fromSemantics.precision;
2006*9880d681SAndroid Build Coastguard Worker 
2007*9880d681SAndroid Build Coastguard Worker   bool X86SpecialNan = false;
2008*9880d681SAndroid Build Coastguard Worker   if (&fromSemantics == &APFloat::x87DoubleExtended &&
2009*9880d681SAndroid Build Coastguard Worker       &toSemantics != &APFloat::x87DoubleExtended && category == fcNaN &&
2010*9880d681SAndroid Build Coastguard Worker       (!(*significandParts() & 0x8000000000000000ULL) ||
2011*9880d681SAndroid Build Coastguard Worker        !(*significandParts() & 0x4000000000000000ULL))) {
2012*9880d681SAndroid Build Coastguard Worker     // x86 has some unusual NaNs which cannot be represented in any other
2013*9880d681SAndroid Build Coastguard Worker     // format; note them here.
2014*9880d681SAndroid Build Coastguard Worker     X86SpecialNan = true;
2015*9880d681SAndroid Build Coastguard Worker   }
2016*9880d681SAndroid Build Coastguard Worker 
2017*9880d681SAndroid Build Coastguard Worker   // If this is a truncation of a denormal number, and the target semantics
2018*9880d681SAndroid Build Coastguard Worker   // has larger exponent range than the source semantics (this can happen
2019*9880d681SAndroid Build Coastguard Worker   // when truncating from PowerPC double-double to double format), the
2020*9880d681SAndroid Build Coastguard Worker   // right shift could lose result mantissa bits.  Adjust exponent instead
2021*9880d681SAndroid Build Coastguard Worker   // of performing excessive shift.
2022*9880d681SAndroid Build Coastguard Worker   if (shift < 0 && isFiniteNonZero()) {
2023*9880d681SAndroid Build Coastguard Worker     int exponentChange = significandMSB() + 1 - fromSemantics.precision;
2024*9880d681SAndroid Build Coastguard Worker     if (exponent + exponentChange < toSemantics.minExponent)
2025*9880d681SAndroid Build Coastguard Worker       exponentChange = toSemantics.minExponent - exponent;
2026*9880d681SAndroid Build Coastguard Worker     if (exponentChange < shift)
2027*9880d681SAndroid Build Coastguard Worker       exponentChange = shift;
2028*9880d681SAndroid Build Coastguard Worker     if (exponentChange < 0) {
2029*9880d681SAndroid Build Coastguard Worker       shift -= exponentChange;
2030*9880d681SAndroid Build Coastguard Worker       exponent += exponentChange;
2031*9880d681SAndroid Build Coastguard Worker     }
2032*9880d681SAndroid Build Coastguard Worker   }
2033*9880d681SAndroid Build Coastguard Worker 
2034*9880d681SAndroid Build Coastguard Worker   // If this is a truncation, perform the shift before we narrow the storage.
2035*9880d681SAndroid Build Coastguard Worker   if (shift < 0 && (isFiniteNonZero() || category==fcNaN))
2036*9880d681SAndroid Build Coastguard Worker     lostFraction = shiftRight(significandParts(), oldPartCount, -shift);
2037*9880d681SAndroid Build Coastguard Worker 
2038*9880d681SAndroid Build Coastguard Worker   // Fix the storage so it can hold to new value.
2039*9880d681SAndroid Build Coastguard Worker   if (newPartCount > oldPartCount) {
2040*9880d681SAndroid Build Coastguard Worker     // The new type requires more storage; make it available.
2041*9880d681SAndroid Build Coastguard Worker     integerPart *newParts;
2042*9880d681SAndroid Build Coastguard Worker     newParts = new integerPart[newPartCount];
2043*9880d681SAndroid Build Coastguard Worker     APInt::tcSet(newParts, 0, newPartCount);
2044*9880d681SAndroid Build Coastguard Worker     if (isFiniteNonZero() || category==fcNaN)
2045*9880d681SAndroid Build Coastguard Worker       APInt::tcAssign(newParts, significandParts(), oldPartCount);
2046*9880d681SAndroid Build Coastguard Worker     freeSignificand();
2047*9880d681SAndroid Build Coastguard Worker     significand.parts = newParts;
2048*9880d681SAndroid Build Coastguard Worker   } else if (newPartCount == 1 && oldPartCount != 1) {
2049*9880d681SAndroid Build Coastguard Worker     // Switch to built-in storage for a single part.
2050*9880d681SAndroid Build Coastguard Worker     integerPart newPart = 0;
2051*9880d681SAndroid Build Coastguard Worker     if (isFiniteNonZero() || category==fcNaN)
2052*9880d681SAndroid Build Coastguard Worker       newPart = significandParts()[0];
2053*9880d681SAndroid Build Coastguard Worker     freeSignificand();
2054*9880d681SAndroid Build Coastguard Worker     significand.part = newPart;
2055*9880d681SAndroid Build Coastguard Worker   }
2056*9880d681SAndroid Build Coastguard Worker 
2057*9880d681SAndroid Build Coastguard Worker   // Now that we have the right storage, switch the semantics.
2058*9880d681SAndroid Build Coastguard Worker   semantics = &toSemantics;
2059*9880d681SAndroid Build Coastguard Worker 
2060*9880d681SAndroid Build Coastguard Worker   // If this is an extension, perform the shift now that the storage is
2061*9880d681SAndroid Build Coastguard Worker   // available.
2062*9880d681SAndroid Build Coastguard Worker   if (shift > 0 && (isFiniteNonZero() || category==fcNaN))
2063*9880d681SAndroid Build Coastguard Worker     APInt::tcShiftLeft(significandParts(), newPartCount, shift);
2064*9880d681SAndroid Build Coastguard Worker 
2065*9880d681SAndroid Build Coastguard Worker   if (isFiniteNonZero()) {
2066*9880d681SAndroid Build Coastguard Worker     fs = normalize(rounding_mode, lostFraction);
2067*9880d681SAndroid Build Coastguard Worker     *losesInfo = (fs != opOK);
2068*9880d681SAndroid Build Coastguard Worker   } else if (category == fcNaN) {
2069*9880d681SAndroid Build Coastguard Worker     *losesInfo = lostFraction != lfExactlyZero || X86SpecialNan;
2070*9880d681SAndroid Build Coastguard Worker 
2071*9880d681SAndroid Build Coastguard Worker     // For x87 extended precision, we want to make a NaN, not a special NaN if
2072*9880d681SAndroid Build Coastguard Worker     // the input wasn't special either.
2073*9880d681SAndroid Build Coastguard Worker     if (!X86SpecialNan && semantics == &APFloat::x87DoubleExtended)
2074*9880d681SAndroid Build Coastguard Worker       APInt::tcSetBit(significandParts(), semantics->precision - 1);
2075*9880d681SAndroid Build Coastguard Worker 
2076*9880d681SAndroid Build Coastguard Worker     // gcc forces the Quiet bit on, which means (float)(double)(float_sNan)
2077*9880d681SAndroid Build Coastguard Worker     // does not give you back the same bits.  This is dubious, and we
2078*9880d681SAndroid Build Coastguard Worker     // don't currently do it.  You're really supposed to get
2079*9880d681SAndroid Build Coastguard Worker     // an invalid operation signal at runtime, but nobody does that.
2080*9880d681SAndroid Build Coastguard Worker     fs = opOK;
2081*9880d681SAndroid Build Coastguard Worker   } else {
2082*9880d681SAndroid Build Coastguard Worker     *losesInfo = false;
2083*9880d681SAndroid Build Coastguard Worker     fs = opOK;
2084*9880d681SAndroid Build Coastguard Worker   }
2085*9880d681SAndroid Build Coastguard Worker 
2086*9880d681SAndroid Build Coastguard Worker   return fs;
2087*9880d681SAndroid Build Coastguard Worker }
2088*9880d681SAndroid Build Coastguard Worker 
2089*9880d681SAndroid Build Coastguard Worker /* Convert a floating point number to an integer according to the
2090*9880d681SAndroid Build Coastguard Worker    rounding mode.  If the rounded integer value is out of range this
2091*9880d681SAndroid Build Coastguard Worker    returns an invalid operation exception and the contents of the
2092*9880d681SAndroid Build Coastguard Worker    destination parts are unspecified.  If the rounded value is in
2093*9880d681SAndroid Build Coastguard Worker    range but the floating point number is not the exact integer, the C
2094*9880d681SAndroid Build Coastguard Worker    standard doesn't require an inexact exception to be raised.  IEEE
2095*9880d681SAndroid Build Coastguard Worker    854 does require it so we do that.
2096*9880d681SAndroid Build Coastguard Worker 
2097*9880d681SAndroid Build Coastguard Worker    Note that for conversions to integer type the C standard requires
2098*9880d681SAndroid Build Coastguard Worker    round-to-zero to always be used.  */
2099*9880d681SAndroid Build Coastguard Worker APFloat::opStatus
convertToSignExtendedInteger(integerPart * parts,unsigned int width,bool isSigned,roundingMode rounding_mode,bool * isExact) const2100*9880d681SAndroid Build Coastguard Worker APFloat::convertToSignExtendedInteger(integerPart *parts, unsigned int width,
2101*9880d681SAndroid Build Coastguard Worker                                       bool isSigned,
2102*9880d681SAndroid Build Coastguard Worker                                       roundingMode rounding_mode,
2103*9880d681SAndroid Build Coastguard Worker                                       bool *isExact) const
2104*9880d681SAndroid Build Coastguard Worker {
2105*9880d681SAndroid Build Coastguard Worker   lostFraction lost_fraction;
2106*9880d681SAndroid Build Coastguard Worker   const integerPart *src;
2107*9880d681SAndroid Build Coastguard Worker   unsigned int dstPartsCount, truncatedBits;
2108*9880d681SAndroid Build Coastguard Worker 
2109*9880d681SAndroid Build Coastguard Worker   *isExact = false;
2110*9880d681SAndroid Build Coastguard Worker 
2111*9880d681SAndroid Build Coastguard Worker   /* Handle the three special cases first.  */
2112*9880d681SAndroid Build Coastguard Worker   if (category == fcInfinity || category == fcNaN)
2113*9880d681SAndroid Build Coastguard Worker     return opInvalidOp;
2114*9880d681SAndroid Build Coastguard Worker 
2115*9880d681SAndroid Build Coastguard Worker   dstPartsCount = partCountForBits(width);
2116*9880d681SAndroid Build Coastguard Worker 
2117*9880d681SAndroid Build Coastguard Worker   if (category == fcZero) {
2118*9880d681SAndroid Build Coastguard Worker     APInt::tcSet(parts, 0, dstPartsCount);
2119*9880d681SAndroid Build Coastguard Worker     // Negative zero can't be represented as an int.
2120*9880d681SAndroid Build Coastguard Worker     *isExact = !sign;
2121*9880d681SAndroid Build Coastguard Worker     return opOK;
2122*9880d681SAndroid Build Coastguard Worker   }
2123*9880d681SAndroid Build Coastguard Worker 
2124*9880d681SAndroid Build Coastguard Worker   src = significandParts();
2125*9880d681SAndroid Build Coastguard Worker 
2126*9880d681SAndroid Build Coastguard Worker   /* Step 1: place our absolute value, with any fraction truncated, in
2127*9880d681SAndroid Build Coastguard Worker      the destination.  */
2128*9880d681SAndroid Build Coastguard Worker   if (exponent < 0) {
2129*9880d681SAndroid Build Coastguard Worker     /* Our absolute value is less than one; truncate everything.  */
2130*9880d681SAndroid Build Coastguard Worker     APInt::tcSet(parts, 0, dstPartsCount);
2131*9880d681SAndroid Build Coastguard Worker     /* For exponent -1 the integer bit represents .5, look at that.
2132*9880d681SAndroid Build Coastguard Worker        For smaller exponents leftmost truncated bit is 0. */
2133*9880d681SAndroid Build Coastguard Worker     truncatedBits = semantics->precision -1U - exponent;
2134*9880d681SAndroid Build Coastguard Worker   } else {
2135*9880d681SAndroid Build Coastguard Worker     /* We want the most significant (exponent + 1) bits; the rest are
2136*9880d681SAndroid Build Coastguard Worker        truncated.  */
2137*9880d681SAndroid Build Coastguard Worker     unsigned int bits = exponent + 1U;
2138*9880d681SAndroid Build Coastguard Worker 
2139*9880d681SAndroid Build Coastguard Worker     /* Hopelessly large in magnitude?  */
2140*9880d681SAndroid Build Coastguard Worker     if (bits > width)
2141*9880d681SAndroid Build Coastguard Worker       return opInvalidOp;
2142*9880d681SAndroid Build Coastguard Worker 
2143*9880d681SAndroid Build Coastguard Worker     if (bits < semantics->precision) {
2144*9880d681SAndroid Build Coastguard Worker       /* We truncate (semantics->precision - bits) bits.  */
2145*9880d681SAndroid Build Coastguard Worker       truncatedBits = semantics->precision - bits;
2146*9880d681SAndroid Build Coastguard Worker       APInt::tcExtract(parts, dstPartsCount, src, bits, truncatedBits);
2147*9880d681SAndroid Build Coastguard Worker     } else {
2148*9880d681SAndroid Build Coastguard Worker       /* We want at least as many bits as are available.  */
2149*9880d681SAndroid Build Coastguard Worker       APInt::tcExtract(parts, dstPartsCount, src, semantics->precision, 0);
2150*9880d681SAndroid Build Coastguard Worker       APInt::tcShiftLeft(parts, dstPartsCount, bits - semantics->precision);
2151*9880d681SAndroid Build Coastguard Worker       truncatedBits = 0;
2152*9880d681SAndroid Build Coastguard Worker     }
2153*9880d681SAndroid Build Coastguard Worker   }
2154*9880d681SAndroid Build Coastguard Worker 
2155*9880d681SAndroid Build Coastguard Worker   /* Step 2: work out any lost fraction, and increment the absolute
2156*9880d681SAndroid Build Coastguard Worker      value if we would round away from zero.  */
2157*9880d681SAndroid Build Coastguard Worker   if (truncatedBits) {
2158*9880d681SAndroid Build Coastguard Worker     lost_fraction = lostFractionThroughTruncation(src, partCount(),
2159*9880d681SAndroid Build Coastguard Worker                                                   truncatedBits);
2160*9880d681SAndroid Build Coastguard Worker     if (lost_fraction != lfExactlyZero &&
2161*9880d681SAndroid Build Coastguard Worker         roundAwayFromZero(rounding_mode, lost_fraction, truncatedBits)) {
2162*9880d681SAndroid Build Coastguard Worker       if (APInt::tcIncrement(parts, dstPartsCount))
2163*9880d681SAndroid Build Coastguard Worker         return opInvalidOp;     /* Overflow.  */
2164*9880d681SAndroid Build Coastguard Worker     }
2165*9880d681SAndroid Build Coastguard Worker   } else {
2166*9880d681SAndroid Build Coastguard Worker     lost_fraction = lfExactlyZero;
2167*9880d681SAndroid Build Coastguard Worker   }
2168*9880d681SAndroid Build Coastguard Worker 
2169*9880d681SAndroid Build Coastguard Worker   /* Step 3: check if we fit in the destination.  */
2170*9880d681SAndroid Build Coastguard Worker   unsigned int omsb = APInt::tcMSB(parts, dstPartsCount) + 1;
2171*9880d681SAndroid Build Coastguard Worker 
2172*9880d681SAndroid Build Coastguard Worker   if (sign) {
2173*9880d681SAndroid Build Coastguard Worker     if (!isSigned) {
2174*9880d681SAndroid Build Coastguard Worker       /* Negative numbers cannot be represented as unsigned.  */
2175*9880d681SAndroid Build Coastguard Worker       if (omsb != 0)
2176*9880d681SAndroid Build Coastguard Worker         return opInvalidOp;
2177*9880d681SAndroid Build Coastguard Worker     } else {
2178*9880d681SAndroid Build Coastguard Worker       /* It takes omsb bits to represent the unsigned integer value.
2179*9880d681SAndroid Build Coastguard Worker          We lose a bit for the sign, but care is needed as the
2180*9880d681SAndroid Build Coastguard Worker          maximally negative integer is a special case.  */
2181*9880d681SAndroid Build Coastguard Worker       if (omsb == width && APInt::tcLSB(parts, dstPartsCount) + 1 != omsb)
2182*9880d681SAndroid Build Coastguard Worker         return opInvalidOp;
2183*9880d681SAndroid Build Coastguard Worker 
2184*9880d681SAndroid Build Coastguard Worker       /* This case can happen because of rounding.  */
2185*9880d681SAndroid Build Coastguard Worker       if (omsb > width)
2186*9880d681SAndroid Build Coastguard Worker         return opInvalidOp;
2187*9880d681SAndroid Build Coastguard Worker     }
2188*9880d681SAndroid Build Coastguard Worker 
2189*9880d681SAndroid Build Coastguard Worker     APInt::tcNegate (parts, dstPartsCount);
2190*9880d681SAndroid Build Coastguard Worker   } else {
2191*9880d681SAndroid Build Coastguard Worker     if (omsb >= width + !isSigned)
2192*9880d681SAndroid Build Coastguard Worker       return opInvalidOp;
2193*9880d681SAndroid Build Coastguard Worker   }
2194*9880d681SAndroid Build Coastguard Worker 
2195*9880d681SAndroid Build Coastguard Worker   if (lost_fraction == lfExactlyZero) {
2196*9880d681SAndroid Build Coastguard Worker     *isExact = true;
2197*9880d681SAndroid Build Coastguard Worker     return opOK;
2198*9880d681SAndroid Build Coastguard Worker   } else
2199*9880d681SAndroid Build Coastguard Worker     return opInexact;
2200*9880d681SAndroid Build Coastguard Worker }
2201*9880d681SAndroid Build Coastguard Worker 
2202*9880d681SAndroid Build Coastguard Worker /* Same as convertToSignExtendedInteger, except we provide
2203*9880d681SAndroid Build Coastguard Worker    deterministic values in case of an invalid operation exception,
2204*9880d681SAndroid Build Coastguard Worker    namely zero for NaNs and the minimal or maximal value respectively
2205*9880d681SAndroid Build Coastguard Worker    for underflow or overflow.
2206*9880d681SAndroid Build Coastguard Worker    The *isExact output tells whether the result is exact, in the sense
2207*9880d681SAndroid Build Coastguard Worker    that converting it back to the original floating point type produces
2208*9880d681SAndroid Build Coastguard Worker    the original value.  This is almost equivalent to result==opOK,
2209*9880d681SAndroid Build Coastguard Worker    except for negative zeroes.
2210*9880d681SAndroid Build Coastguard Worker */
2211*9880d681SAndroid Build Coastguard Worker APFloat::opStatus
convertToInteger(integerPart * parts,unsigned int width,bool isSigned,roundingMode rounding_mode,bool * isExact) const2212*9880d681SAndroid Build Coastguard Worker APFloat::convertToInteger(integerPart *parts, unsigned int width,
2213*9880d681SAndroid Build Coastguard Worker                           bool isSigned,
2214*9880d681SAndroid Build Coastguard Worker                           roundingMode rounding_mode, bool *isExact) const
2215*9880d681SAndroid Build Coastguard Worker {
2216*9880d681SAndroid Build Coastguard Worker   opStatus fs;
2217*9880d681SAndroid Build Coastguard Worker 
2218*9880d681SAndroid Build Coastguard Worker   fs = convertToSignExtendedInteger(parts, width, isSigned, rounding_mode,
2219*9880d681SAndroid Build Coastguard Worker                                     isExact);
2220*9880d681SAndroid Build Coastguard Worker 
2221*9880d681SAndroid Build Coastguard Worker   if (fs == opInvalidOp) {
2222*9880d681SAndroid Build Coastguard Worker     unsigned int bits, dstPartsCount;
2223*9880d681SAndroid Build Coastguard Worker 
2224*9880d681SAndroid Build Coastguard Worker     dstPartsCount = partCountForBits(width);
2225*9880d681SAndroid Build Coastguard Worker 
2226*9880d681SAndroid Build Coastguard Worker     if (category == fcNaN)
2227*9880d681SAndroid Build Coastguard Worker       bits = 0;
2228*9880d681SAndroid Build Coastguard Worker     else if (sign)
2229*9880d681SAndroid Build Coastguard Worker       bits = isSigned;
2230*9880d681SAndroid Build Coastguard Worker     else
2231*9880d681SAndroid Build Coastguard Worker       bits = width - isSigned;
2232*9880d681SAndroid Build Coastguard Worker 
2233*9880d681SAndroid Build Coastguard Worker     APInt::tcSetLeastSignificantBits(parts, dstPartsCount, bits);
2234*9880d681SAndroid Build Coastguard Worker     if (sign && isSigned)
2235*9880d681SAndroid Build Coastguard Worker       APInt::tcShiftLeft(parts, dstPartsCount, width - 1);
2236*9880d681SAndroid Build Coastguard Worker   }
2237*9880d681SAndroid Build Coastguard Worker 
2238*9880d681SAndroid Build Coastguard Worker   return fs;
2239*9880d681SAndroid Build Coastguard Worker }
2240*9880d681SAndroid Build Coastguard Worker 
2241*9880d681SAndroid Build Coastguard Worker /* Same as convertToInteger(integerPart*, ...), except the result is returned in
2242*9880d681SAndroid Build Coastguard Worker    an APSInt, whose initial bit-width and signed-ness are used to determine the
2243*9880d681SAndroid Build Coastguard Worker    precision of the conversion.
2244*9880d681SAndroid Build Coastguard Worker  */
2245*9880d681SAndroid Build Coastguard Worker APFloat::opStatus
convertToInteger(APSInt & result,roundingMode rounding_mode,bool * isExact) const2246*9880d681SAndroid Build Coastguard Worker APFloat::convertToInteger(APSInt &result,
2247*9880d681SAndroid Build Coastguard Worker                           roundingMode rounding_mode, bool *isExact) const
2248*9880d681SAndroid Build Coastguard Worker {
2249*9880d681SAndroid Build Coastguard Worker   unsigned bitWidth = result.getBitWidth();
2250*9880d681SAndroid Build Coastguard Worker   SmallVector<uint64_t, 4> parts(result.getNumWords());
2251*9880d681SAndroid Build Coastguard Worker   opStatus status = convertToInteger(
2252*9880d681SAndroid Build Coastguard Worker     parts.data(), bitWidth, result.isSigned(), rounding_mode, isExact);
2253*9880d681SAndroid Build Coastguard Worker   // Keeps the original signed-ness.
2254*9880d681SAndroid Build Coastguard Worker   result = APInt(bitWidth, parts);
2255*9880d681SAndroid Build Coastguard Worker   return status;
2256*9880d681SAndroid Build Coastguard Worker }
2257*9880d681SAndroid Build Coastguard Worker 
2258*9880d681SAndroid Build Coastguard Worker /* Convert an unsigned integer SRC to a floating point number,
2259*9880d681SAndroid Build Coastguard Worker    rounding according to ROUNDING_MODE.  The sign of the floating
2260*9880d681SAndroid Build Coastguard Worker    point number is not modified.  */
2261*9880d681SAndroid Build Coastguard Worker APFloat::opStatus
convertFromUnsignedParts(const integerPart * src,unsigned int srcCount,roundingMode rounding_mode)2262*9880d681SAndroid Build Coastguard Worker APFloat::convertFromUnsignedParts(const integerPart *src,
2263*9880d681SAndroid Build Coastguard Worker                                   unsigned int srcCount,
2264*9880d681SAndroid Build Coastguard Worker                                   roundingMode rounding_mode)
2265*9880d681SAndroid Build Coastguard Worker {
2266*9880d681SAndroid Build Coastguard Worker   unsigned int omsb, precision, dstCount;
2267*9880d681SAndroid Build Coastguard Worker   integerPart *dst;
2268*9880d681SAndroid Build Coastguard Worker   lostFraction lost_fraction;
2269*9880d681SAndroid Build Coastguard Worker 
2270*9880d681SAndroid Build Coastguard Worker   category = fcNormal;
2271*9880d681SAndroid Build Coastguard Worker   omsb = APInt::tcMSB(src, srcCount) + 1;
2272*9880d681SAndroid Build Coastguard Worker   dst = significandParts();
2273*9880d681SAndroid Build Coastguard Worker   dstCount = partCount();
2274*9880d681SAndroid Build Coastguard Worker   precision = semantics->precision;
2275*9880d681SAndroid Build Coastguard Worker 
2276*9880d681SAndroid Build Coastguard Worker   /* We want the most significant PRECISION bits of SRC.  There may not
2277*9880d681SAndroid Build Coastguard Worker      be that many; extract what we can.  */
2278*9880d681SAndroid Build Coastguard Worker   if (precision <= omsb) {
2279*9880d681SAndroid Build Coastguard Worker     exponent = omsb - 1;
2280*9880d681SAndroid Build Coastguard Worker     lost_fraction = lostFractionThroughTruncation(src, srcCount,
2281*9880d681SAndroid Build Coastguard Worker                                                   omsb - precision);
2282*9880d681SAndroid Build Coastguard Worker     APInt::tcExtract(dst, dstCount, src, precision, omsb - precision);
2283*9880d681SAndroid Build Coastguard Worker   } else {
2284*9880d681SAndroid Build Coastguard Worker     exponent = precision - 1;
2285*9880d681SAndroid Build Coastguard Worker     lost_fraction = lfExactlyZero;
2286*9880d681SAndroid Build Coastguard Worker     APInt::tcExtract(dst, dstCount, src, omsb, 0);
2287*9880d681SAndroid Build Coastguard Worker   }
2288*9880d681SAndroid Build Coastguard Worker 
2289*9880d681SAndroid Build Coastguard Worker   return normalize(rounding_mode, lost_fraction);
2290*9880d681SAndroid Build Coastguard Worker }
2291*9880d681SAndroid Build Coastguard Worker 
2292*9880d681SAndroid Build Coastguard Worker APFloat::opStatus
convertFromAPInt(const APInt & Val,bool isSigned,roundingMode rounding_mode)2293*9880d681SAndroid Build Coastguard Worker APFloat::convertFromAPInt(const APInt &Val,
2294*9880d681SAndroid Build Coastguard Worker                           bool isSigned,
2295*9880d681SAndroid Build Coastguard Worker                           roundingMode rounding_mode)
2296*9880d681SAndroid Build Coastguard Worker {
2297*9880d681SAndroid Build Coastguard Worker   unsigned int partCount = Val.getNumWords();
2298*9880d681SAndroid Build Coastguard Worker   APInt api = Val;
2299*9880d681SAndroid Build Coastguard Worker 
2300*9880d681SAndroid Build Coastguard Worker   sign = false;
2301*9880d681SAndroid Build Coastguard Worker   if (isSigned && api.isNegative()) {
2302*9880d681SAndroid Build Coastguard Worker     sign = true;
2303*9880d681SAndroid Build Coastguard Worker     api = -api;
2304*9880d681SAndroid Build Coastguard Worker   }
2305*9880d681SAndroid Build Coastguard Worker 
2306*9880d681SAndroid Build Coastguard Worker   return convertFromUnsignedParts(api.getRawData(), partCount, rounding_mode);
2307*9880d681SAndroid Build Coastguard Worker }
2308*9880d681SAndroid Build Coastguard Worker 
2309*9880d681SAndroid Build Coastguard Worker /* Convert a two's complement integer SRC to a floating point number,
2310*9880d681SAndroid Build Coastguard Worker    rounding according to ROUNDING_MODE.  ISSIGNED is true if the
2311*9880d681SAndroid Build Coastguard Worker    integer is signed, in which case it must be sign-extended.  */
2312*9880d681SAndroid Build Coastguard Worker APFloat::opStatus
convertFromSignExtendedInteger(const integerPart * src,unsigned int srcCount,bool isSigned,roundingMode rounding_mode)2313*9880d681SAndroid Build Coastguard Worker APFloat::convertFromSignExtendedInteger(const integerPart *src,
2314*9880d681SAndroid Build Coastguard Worker                                         unsigned int srcCount,
2315*9880d681SAndroid Build Coastguard Worker                                         bool isSigned,
2316*9880d681SAndroid Build Coastguard Worker                                         roundingMode rounding_mode)
2317*9880d681SAndroid Build Coastguard Worker {
2318*9880d681SAndroid Build Coastguard Worker   opStatus status;
2319*9880d681SAndroid Build Coastguard Worker 
2320*9880d681SAndroid Build Coastguard Worker   if (isSigned &&
2321*9880d681SAndroid Build Coastguard Worker       APInt::tcExtractBit(src, srcCount * integerPartWidth - 1)) {
2322*9880d681SAndroid Build Coastguard Worker     integerPart *copy;
2323*9880d681SAndroid Build Coastguard Worker 
2324*9880d681SAndroid Build Coastguard Worker     /* If we're signed and negative negate a copy.  */
2325*9880d681SAndroid Build Coastguard Worker     sign = true;
2326*9880d681SAndroid Build Coastguard Worker     copy = new integerPart[srcCount];
2327*9880d681SAndroid Build Coastguard Worker     APInt::tcAssign(copy, src, srcCount);
2328*9880d681SAndroid Build Coastguard Worker     APInt::tcNegate(copy, srcCount);
2329*9880d681SAndroid Build Coastguard Worker     status = convertFromUnsignedParts(copy, srcCount, rounding_mode);
2330*9880d681SAndroid Build Coastguard Worker     delete [] copy;
2331*9880d681SAndroid Build Coastguard Worker   } else {
2332*9880d681SAndroid Build Coastguard Worker     sign = false;
2333*9880d681SAndroid Build Coastguard Worker     status = convertFromUnsignedParts(src, srcCount, rounding_mode);
2334*9880d681SAndroid Build Coastguard Worker   }
2335*9880d681SAndroid Build Coastguard Worker 
2336*9880d681SAndroid Build Coastguard Worker   return status;
2337*9880d681SAndroid Build Coastguard Worker }
2338*9880d681SAndroid Build Coastguard Worker 
2339*9880d681SAndroid Build Coastguard Worker /* FIXME: should this just take a const APInt reference?  */
2340*9880d681SAndroid Build Coastguard Worker APFloat::opStatus
convertFromZeroExtendedInteger(const integerPart * parts,unsigned int width,bool isSigned,roundingMode rounding_mode)2341*9880d681SAndroid Build Coastguard Worker APFloat::convertFromZeroExtendedInteger(const integerPart *parts,
2342*9880d681SAndroid Build Coastguard Worker                                         unsigned int width, bool isSigned,
2343*9880d681SAndroid Build Coastguard Worker                                         roundingMode rounding_mode)
2344*9880d681SAndroid Build Coastguard Worker {
2345*9880d681SAndroid Build Coastguard Worker   unsigned int partCount = partCountForBits(width);
2346*9880d681SAndroid Build Coastguard Worker   APInt api = APInt(width, makeArrayRef(parts, partCount));
2347*9880d681SAndroid Build Coastguard Worker 
2348*9880d681SAndroid Build Coastguard Worker   sign = false;
2349*9880d681SAndroid Build Coastguard Worker   if (isSigned && APInt::tcExtractBit(parts, width - 1)) {
2350*9880d681SAndroid Build Coastguard Worker     sign = true;
2351*9880d681SAndroid Build Coastguard Worker     api = -api;
2352*9880d681SAndroid Build Coastguard Worker   }
2353*9880d681SAndroid Build Coastguard Worker 
2354*9880d681SAndroid Build Coastguard Worker   return convertFromUnsignedParts(api.getRawData(), partCount, rounding_mode);
2355*9880d681SAndroid Build Coastguard Worker }
2356*9880d681SAndroid Build Coastguard Worker 
2357*9880d681SAndroid Build Coastguard Worker APFloat::opStatus
convertFromHexadecimalString(StringRef s,roundingMode rounding_mode)2358*9880d681SAndroid Build Coastguard Worker APFloat::convertFromHexadecimalString(StringRef s, roundingMode rounding_mode)
2359*9880d681SAndroid Build Coastguard Worker {
2360*9880d681SAndroid Build Coastguard Worker   lostFraction lost_fraction = lfExactlyZero;
2361*9880d681SAndroid Build Coastguard Worker 
2362*9880d681SAndroid Build Coastguard Worker   category = fcNormal;
2363*9880d681SAndroid Build Coastguard Worker   zeroSignificand();
2364*9880d681SAndroid Build Coastguard Worker   exponent = 0;
2365*9880d681SAndroid Build Coastguard Worker 
2366*9880d681SAndroid Build Coastguard Worker   integerPart *significand = significandParts();
2367*9880d681SAndroid Build Coastguard Worker   unsigned partsCount = partCount();
2368*9880d681SAndroid Build Coastguard Worker   unsigned bitPos = partsCount * integerPartWidth;
2369*9880d681SAndroid Build Coastguard Worker   bool computedTrailingFraction = false;
2370*9880d681SAndroid Build Coastguard Worker 
2371*9880d681SAndroid Build Coastguard Worker   // Skip leading zeroes and any (hexa)decimal point.
2372*9880d681SAndroid Build Coastguard Worker   StringRef::iterator begin = s.begin();
2373*9880d681SAndroid Build Coastguard Worker   StringRef::iterator end = s.end();
2374*9880d681SAndroid Build Coastguard Worker   StringRef::iterator dot;
2375*9880d681SAndroid Build Coastguard Worker   StringRef::iterator p = skipLeadingZeroesAndAnyDot(begin, end, &dot);
2376*9880d681SAndroid Build Coastguard Worker   StringRef::iterator firstSignificantDigit = p;
2377*9880d681SAndroid Build Coastguard Worker 
2378*9880d681SAndroid Build Coastguard Worker   while (p != end) {
2379*9880d681SAndroid Build Coastguard Worker     integerPart hex_value;
2380*9880d681SAndroid Build Coastguard Worker 
2381*9880d681SAndroid Build Coastguard Worker     if (*p == '.') {
2382*9880d681SAndroid Build Coastguard Worker       assert(dot == end && "String contains multiple dots");
2383*9880d681SAndroid Build Coastguard Worker       dot = p++;
2384*9880d681SAndroid Build Coastguard Worker       continue;
2385*9880d681SAndroid Build Coastguard Worker     }
2386*9880d681SAndroid Build Coastguard Worker 
2387*9880d681SAndroid Build Coastguard Worker     hex_value = hexDigitValue(*p);
2388*9880d681SAndroid Build Coastguard Worker     if (hex_value == -1U)
2389*9880d681SAndroid Build Coastguard Worker       break;
2390*9880d681SAndroid Build Coastguard Worker 
2391*9880d681SAndroid Build Coastguard Worker     p++;
2392*9880d681SAndroid Build Coastguard Worker 
2393*9880d681SAndroid Build Coastguard Worker     // Store the number while we have space.
2394*9880d681SAndroid Build Coastguard Worker     if (bitPos) {
2395*9880d681SAndroid Build Coastguard Worker       bitPos -= 4;
2396*9880d681SAndroid Build Coastguard Worker       hex_value <<= bitPos % integerPartWidth;
2397*9880d681SAndroid Build Coastguard Worker       significand[bitPos / integerPartWidth] |= hex_value;
2398*9880d681SAndroid Build Coastguard Worker     } else if (!computedTrailingFraction) {
2399*9880d681SAndroid Build Coastguard Worker       lost_fraction = trailingHexadecimalFraction(p, end, hex_value);
2400*9880d681SAndroid Build Coastguard Worker       computedTrailingFraction = true;
2401*9880d681SAndroid Build Coastguard Worker     }
2402*9880d681SAndroid Build Coastguard Worker   }
2403*9880d681SAndroid Build Coastguard Worker 
2404*9880d681SAndroid Build Coastguard Worker   /* Hex floats require an exponent but not a hexadecimal point.  */
2405*9880d681SAndroid Build Coastguard Worker   assert(p != end && "Hex strings require an exponent");
2406*9880d681SAndroid Build Coastguard Worker   assert((*p == 'p' || *p == 'P') && "Invalid character in significand");
2407*9880d681SAndroid Build Coastguard Worker   assert(p != begin && "Significand has no digits");
2408*9880d681SAndroid Build Coastguard Worker   assert((dot == end || p - begin != 1) && "Significand has no digits");
2409*9880d681SAndroid Build Coastguard Worker 
2410*9880d681SAndroid Build Coastguard Worker   /* Ignore the exponent if we are zero.  */
2411*9880d681SAndroid Build Coastguard Worker   if (p != firstSignificantDigit) {
2412*9880d681SAndroid Build Coastguard Worker     int expAdjustment;
2413*9880d681SAndroid Build Coastguard Worker 
2414*9880d681SAndroid Build Coastguard Worker     /* Implicit hexadecimal point?  */
2415*9880d681SAndroid Build Coastguard Worker     if (dot == end)
2416*9880d681SAndroid Build Coastguard Worker       dot = p;
2417*9880d681SAndroid Build Coastguard Worker 
2418*9880d681SAndroid Build Coastguard Worker     /* Calculate the exponent adjustment implicit in the number of
2419*9880d681SAndroid Build Coastguard Worker        significant digits.  */
2420*9880d681SAndroid Build Coastguard Worker     expAdjustment = static_cast<int>(dot - firstSignificantDigit);
2421*9880d681SAndroid Build Coastguard Worker     if (expAdjustment < 0)
2422*9880d681SAndroid Build Coastguard Worker       expAdjustment++;
2423*9880d681SAndroid Build Coastguard Worker     expAdjustment = expAdjustment * 4 - 1;
2424*9880d681SAndroid Build Coastguard Worker 
2425*9880d681SAndroid Build Coastguard Worker     /* Adjust for writing the significand starting at the most
2426*9880d681SAndroid Build Coastguard Worker        significant nibble.  */
2427*9880d681SAndroid Build Coastguard Worker     expAdjustment += semantics->precision;
2428*9880d681SAndroid Build Coastguard Worker     expAdjustment -= partsCount * integerPartWidth;
2429*9880d681SAndroid Build Coastguard Worker 
2430*9880d681SAndroid Build Coastguard Worker     /* Adjust for the given exponent.  */
2431*9880d681SAndroid Build Coastguard Worker     exponent = totalExponent(p + 1, end, expAdjustment);
2432*9880d681SAndroid Build Coastguard Worker   }
2433*9880d681SAndroid Build Coastguard Worker 
2434*9880d681SAndroid Build Coastguard Worker   return normalize(rounding_mode, lost_fraction);
2435*9880d681SAndroid Build Coastguard Worker }
2436*9880d681SAndroid Build Coastguard Worker 
2437*9880d681SAndroid Build Coastguard Worker APFloat::opStatus
roundSignificandWithExponent(const integerPart * decSigParts,unsigned sigPartCount,int exp,roundingMode rounding_mode)2438*9880d681SAndroid Build Coastguard Worker APFloat::roundSignificandWithExponent(const integerPart *decSigParts,
2439*9880d681SAndroid Build Coastguard Worker                                       unsigned sigPartCount, int exp,
2440*9880d681SAndroid Build Coastguard Worker                                       roundingMode rounding_mode)
2441*9880d681SAndroid Build Coastguard Worker {
2442*9880d681SAndroid Build Coastguard Worker   unsigned int parts, pow5PartCount;
2443*9880d681SAndroid Build Coastguard Worker   fltSemantics calcSemantics = { 32767, -32767, 0, 0 };
2444*9880d681SAndroid Build Coastguard Worker   integerPart pow5Parts[maxPowerOfFiveParts];
2445*9880d681SAndroid Build Coastguard Worker   bool isNearest;
2446*9880d681SAndroid Build Coastguard Worker 
2447*9880d681SAndroid Build Coastguard Worker   isNearest = (rounding_mode == rmNearestTiesToEven ||
2448*9880d681SAndroid Build Coastguard Worker                rounding_mode == rmNearestTiesToAway);
2449*9880d681SAndroid Build Coastguard Worker 
2450*9880d681SAndroid Build Coastguard Worker   parts = partCountForBits(semantics->precision + 11);
2451*9880d681SAndroid Build Coastguard Worker 
2452*9880d681SAndroid Build Coastguard Worker   /* Calculate pow(5, abs(exp)).  */
2453*9880d681SAndroid Build Coastguard Worker   pow5PartCount = powerOf5(pow5Parts, exp >= 0 ? exp: -exp);
2454*9880d681SAndroid Build Coastguard Worker 
2455*9880d681SAndroid Build Coastguard Worker   for (;; parts *= 2) {
2456*9880d681SAndroid Build Coastguard Worker     opStatus sigStatus, powStatus;
2457*9880d681SAndroid Build Coastguard Worker     unsigned int excessPrecision, truncatedBits;
2458*9880d681SAndroid Build Coastguard Worker 
2459*9880d681SAndroid Build Coastguard Worker     calcSemantics.precision = parts * integerPartWidth - 1;
2460*9880d681SAndroid Build Coastguard Worker     excessPrecision = calcSemantics.precision - semantics->precision;
2461*9880d681SAndroid Build Coastguard Worker     truncatedBits = excessPrecision;
2462*9880d681SAndroid Build Coastguard Worker 
2463*9880d681SAndroid Build Coastguard Worker     APFloat decSig = APFloat::getZero(calcSemantics, sign);
2464*9880d681SAndroid Build Coastguard Worker     APFloat pow5(calcSemantics);
2465*9880d681SAndroid Build Coastguard Worker 
2466*9880d681SAndroid Build Coastguard Worker     sigStatus = decSig.convertFromUnsignedParts(decSigParts, sigPartCount,
2467*9880d681SAndroid Build Coastguard Worker                                                 rmNearestTiesToEven);
2468*9880d681SAndroid Build Coastguard Worker     powStatus = pow5.convertFromUnsignedParts(pow5Parts, pow5PartCount,
2469*9880d681SAndroid Build Coastguard Worker                                               rmNearestTiesToEven);
2470*9880d681SAndroid Build Coastguard Worker     /* Add exp, as 10^n = 5^n * 2^n.  */
2471*9880d681SAndroid Build Coastguard Worker     decSig.exponent += exp;
2472*9880d681SAndroid Build Coastguard Worker 
2473*9880d681SAndroid Build Coastguard Worker     lostFraction calcLostFraction;
2474*9880d681SAndroid Build Coastguard Worker     integerPart HUerr, HUdistance;
2475*9880d681SAndroid Build Coastguard Worker     unsigned int powHUerr;
2476*9880d681SAndroid Build Coastguard Worker 
2477*9880d681SAndroid Build Coastguard Worker     if (exp >= 0) {
2478*9880d681SAndroid Build Coastguard Worker       /* multiplySignificand leaves the precision-th bit set to 1.  */
2479*9880d681SAndroid Build Coastguard Worker       calcLostFraction = decSig.multiplySignificand(pow5, nullptr);
2480*9880d681SAndroid Build Coastguard Worker       powHUerr = powStatus != opOK;
2481*9880d681SAndroid Build Coastguard Worker     } else {
2482*9880d681SAndroid Build Coastguard Worker       calcLostFraction = decSig.divideSignificand(pow5);
2483*9880d681SAndroid Build Coastguard Worker       /* Denormal numbers have less precision.  */
2484*9880d681SAndroid Build Coastguard Worker       if (decSig.exponent < semantics->minExponent) {
2485*9880d681SAndroid Build Coastguard Worker         excessPrecision += (semantics->minExponent - decSig.exponent);
2486*9880d681SAndroid Build Coastguard Worker         truncatedBits = excessPrecision;
2487*9880d681SAndroid Build Coastguard Worker         if (excessPrecision > calcSemantics.precision)
2488*9880d681SAndroid Build Coastguard Worker           excessPrecision = calcSemantics.precision;
2489*9880d681SAndroid Build Coastguard Worker       }
2490*9880d681SAndroid Build Coastguard Worker       /* Extra half-ulp lost in reciprocal of exponent.  */
2491*9880d681SAndroid Build Coastguard Worker       powHUerr = (powStatus == opOK && calcLostFraction == lfExactlyZero) ? 0:2;
2492*9880d681SAndroid Build Coastguard Worker     }
2493*9880d681SAndroid Build Coastguard Worker 
2494*9880d681SAndroid Build Coastguard Worker     /* Both multiplySignificand and divideSignificand return the
2495*9880d681SAndroid Build Coastguard Worker        result with the integer bit set.  */
2496*9880d681SAndroid Build Coastguard Worker     assert(APInt::tcExtractBit
2497*9880d681SAndroid Build Coastguard Worker            (decSig.significandParts(), calcSemantics.precision - 1) == 1);
2498*9880d681SAndroid Build Coastguard Worker 
2499*9880d681SAndroid Build Coastguard Worker     HUerr = HUerrBound(calcLostFraction != lfExactlyZero, sigStatus != opOK,
2500*9880d681SAndroid Build Coastguard Worker                        powHUerr);
2501*9880d681SAndroid Build Coastguard Worker     HUdistance = 2 * ulpsFromBoundary(decSig.significandParts(),
2502*9880d681SAndroid Build Coastguard Worker                                       excessPrecision, isNearest);
2503*9880d681SAndroid Build Coastguard Worker 
2504*9880d681SAndroid Build Coastguard Worker     /* Are we guaranteed to round correctly if we truncate?  */
2505*9880d681SAndroid Build Coastguard Worker     if (HUdistance >= HUerr) {
2506*9880d681SAndroid Build Coastguard Worker       APInt::tcExtract(significandParts(), partCount(), decSig.significandParts(),
2507*9880d681SAndroid Build Coastguard Worker                        calcSemantics.precision - excessPrecision,
2508*9880d681SAndroid Build Coastguard Worker                        excessPrecision);
2509*9880d681SAndroid Build Coastguard Worker       /* Take the exponent of decSig.  If we tcExtract-ed less bits
2510*9880d681SAndroid Build Coastguard Worker          above we must adjust our exponent to compensate for the
2511*9880d681SAndroid Build Coastguard Worker          implicit right shift.  */
2512*9880d681SAndroid Build Coastguard Worker       exponent = (decSig.exponent + semantics->precision
2513*9880d681SAndroid Build Coastguard Worker                   - (calcSemantics.precision - excessPrecision));
2514*9880d681SAndroid Build Coastguard Worker       calcLostFraction = lostFractionThroughTruncation(decSig.significandParts(),
2515*9880d681SAndroid Build Coastguard Worker                                                        decSig.partCount(),
2516*9880d681SAndroid Build Coastguard Worker                                                        truncatedBits);
2517*9880d681SAndroid Build Coastguard Worker       return normalize(rounding_mode, calcLostFraction);
2518*9880d681SAndroid Build Coastguard Worker     }
2519*9880d681SAndroid Build Coastguard Worker   }
2520*9880d681SAndroid Build Coastguard Worker }
2521*9880d681SAndroid Build Coastguard Worker 
2522*9880d681SAndroid Build Coastguard Worker APFloat::opStatus
convertFromDecimalString(StringRef str,roundingMode rounding_mode)2523*9880d681SAndroid Build Coastguard Worker APFloat::convertFromDecimalString(StringRef str, roundingMode rounding_mode)
2524*9880d681SAndroid Build Coastguard Worker {
2525*9880d681SAndroid Build Coastguard Worker   decimalInfo D;
2526*9880d681SAndroid Build Coastguard Worker   opStatus fs;
2527*9880d681SAndroid Build Coastguard Worker 
2528*9880d681SAndroid Build Coastguard Worker   /* Scan the text.  */
2529*9880d681SAndroid Build Coastguard Worker   StringRef::iterator p = str.begin();
2530*9880d681SAndroid Build Coastguard Worker   interpretDecimal(p, str.end(), &D);
2531*9880d681SAndroid Build Coastguard Worker 
2532*9880d681SAndroid Build Coastguard Worker   /* Handle the quick cases.  First the case of no significant digits,
2533*9880d681SAndroid Build Coastguard Worker      i.e. zero, and then exponents that are obviously too large or too
2534*9880d681SAndroid Build Coastguard Worker      small.  Writing L for log 10 / log 2, a number d.ddddd*10^exp
2535*9880d681SAndroid Build Coastguard Worker      definitely overflows if
2536*9880d681SAndroid Build Coastguard Worker 
2537*9880d681SAndroid Build Coastguard Worker            (exp - 1) * L >= maxExponent
2538*9880d681SAndroid Build Coastguard Worker 
2539*9880d681SAndroid Build Coastguard Worker      and definitely underflows to zero where
2540*9880d681SAndroid Build Coastguard Worker 
2541*9880d681SAndroid Build Coastguard Worker            (exp + 1) * L <= minExponent - precision
2542*9880d681SAndroid Build Coastguard Worker 
2543*9880d681SAndroid Build Coastguard Worker      With integer arithmetic the tightest bounds for L are
2544*9880d681SAndroid Build Coastguard Worker 
2545*9880d681SAndroid Build Coastguard Worker            93/28 < L < 196/59            [ numerator <= 256 ]
2546*9880d681SAndroid Build Coastguard Worker            42039/12655 < L < 28738/8651  [ numerator <= 65536 ]
2547*9880d681SAndroid Build Coastguard Worker   */
2548*9880d681SAndroid Build Coastguard Worker 
2549*9880d681SAndroid Build Coastguard Worker   // Test if we have a zero number allowing for strings with no null terminators
2550*9880d681SAndroid Build Coastguard Worker   // and zero decimals with non-zero exponents.
2551*9880d681SAndroid Build Coastguard Worker   //
2552*9880d681SAndroid Build Coastguard Worker   // We computed firstSigDigit by ignoring all zeros and dots. Thus if
2553*9880d681SAndroid Build Coastguard Worker   // D->firstSigDigit equals str.end(), every digit must be a zero and there can
2554*9880d681SAndroid Build Coastguard Worker   // be at most one dot. On the other hand, if we have a zero with a non-zero
2555*9880d681SAndroid Build Coastguard Worker   // exponent, then we know that D.firstSigDigit will be non-numeric.
2556*9880d681SAndroid Build Coastguard Worker   if (D.firstSigDigit == str.end() || decDigitValue(*D.firstSigDigit) >= 10U) {
2557*9880d681SAndroid Build Coastguard Worker     category = fcZero;
2558*9880d681SAndroid Build Coastguard Worker     fs = opOK;
2559*9880d681SAndroid Build Coastguard Worker 
2560*9880d681SAndroid Build Coastguard Worker   /* Check whether the normalized exponent is high enough to overflow
2561*9880d681SAndroid Build Coastguard Worker      max during the log-rebasing in the max-exponent check below. */
2562*9880d681SAndroid Build Coastguard Worker   } else if (D.normalizedExponent - 1 > INT_MAX / 42039) {
2563*9880d681SAndroid Build Coastguard Worker     fs = handleOverflow(rounding_mode);
2564*9880d681SAndroid Build Coastguard Worker 
2565*9880d681SAndroid Build Coastguard Worker   /* If it wasn't, then it also wasn't high enough to overflow max
2566*9880d681SAndroid Build Coastguard Worker      during the log-rebasing in the min-exponent check.  Check that it
2567*9880d681SAndroid Build Coastguard Worker      won't overflow min in either check, then perform the min-exponent
2568*9880d681SAndroid Build Coastguard Worker      check. */
2569*9880d681SAndroid Build Coastguard Worker   } else if (D.normalizedExponent - 1 < INT_MIN / 42039 ||
2570*9880d681SAndroid Build Coastguard Worker              (D.normalizedExponent + 1) * 28738 <=
2571*9880d681SAndroid Build Coastguard Worker                8651 * (semantics->minExponent - (int) semantics->precision)) {
2572*9880d681SAndroid Build Coastguard Worker     /* Underflow to zero and round.  */
2573*9880d681SAndroid Build Coastguard Worker     category = fcNormal;
2574*9880d681SAndroid Build Coastguard Worker     zeroSignificand();
2575*9880d681SAndroid Build Coastguard Worker     fs = normalize(rounding_mode, lfLessThanHalf);
2576*9880d681SAndroid Build Coastguard Worker 
2577*9880d681SAndroid Build Coastguard Worker   /* We can finally safely perform the max-exponent check. */
2578*9880d681SAndroid Build Coastguard Worker   } else if ((D.normalizedExponent - 1) * 42039
2579*9880d681SAndroid Build Coastguard Worker              >= 12655 * semantics->maxExponent) {
2580*9880d681SAndroid Build Coastguard Worker     /* Overflow and round.  */
2581*9880d681SAndroid Build Coastguard Worker     fs = handleOverflow(rounding_mode);
2582*9880d681SAndroid Build Coastguard Worker   } else {
2583*9880d681SAndroid Build Coastguard Worker     integerPart *decSignificand;
2584*9880d681SAndroid Build Coastguard Worker     unsigned int partCount;
2585*9880d681SAndroid Build Coastguard Worker 
2586*9880d681SAndroid Build Coastguard Worker     /* A tight upper bound on number of bits required to hold an
2587*9880d681SAndroid Build Coastguard Worker        N-digit decimal integer is N * 196 / 59.  Allocate enough space
2588*9880d681SAndroid Build Coastguard Worker        to hold the full significand, and an extra part required by
2589*9880d681SAndroid Build Coastguard Worker        tcMultiplyPart.  */
2590*9880d681SAndroid Build Coastguard Worker     partCount = static_cast<unsigned int>(D.lastSigDigit - D.firstSigDigit) + 1;
2591*9880d681SAndroid Build Coastguard Worker     partCount = partCountForBits(1 + 196 * partCount / 59);
2592*9880d681SAndroid Build Coastguard Worker     decSignificand = new integerPart[partCount + 1];
2593*9880d681SAndroid Build Coastguard Worker     partCount = 0;
2594*9880d681SAndroid Build Coastguard Worker 
2595*9880d681SAndroid Build Coastguard Worker     /* Convert to binary efficiently - we do almost all multiplication
2596*9880d681SAndroid Build Coastguard Worker        in an integerPart.  When this would overflow do we do a single
2597*9880d681SAndroid Build Coastguard Worker        bignum multiplication, and then revert again to multiplication
2598*9880d681SAndroid Build Coastguard Worker        in an integerPart.  */
2599*9880d681SAndroid Build Coastguard Worker     do {
2600*9880d681SAndroid Build Coastguard Worker       integerPart decValue, val, multiplier;
2601*9880d681SAndroid Build Coastguard Worker 
2602*9880d681SAndroid Build Coastguard Worker       val = 0;
2603*9880d681SAndroid Build Coastguard Worker       multiplier = 1;
2604*9880d681SAndroid Build Coastguard Worker 
2605*9880d681SAndroid Build Coastguard Worker       do {
2606*9880d681SAndroid Build Coastguard Worker         if (*p == '.') {
2607*9880d681SAndroid Build Coastguard Worker           p++;
2608*9880d681SAndroid Build Coastguard Worker           if (p == str.end()) {
2609*9880d681SAndroid Build Coastguard Worker             break;
2610*9880d681SAndroid Build Coastguard Worker           }
2611*9880d681SAndroid Build Coastguard Worker         }
2612*9880d681SAndroid Build Coastguard Worker         decValue = decDigitValue(*p++);
2613*9880d681SAndroid Build Coastguard Worker         assert(decValue < 10U && "Invalid character in significand");
2614*9880d681SAndroid Build Coastguard Worker         multiplier *= 10;
2615*9880d681SAndroid Build Coastguard Worker         val = val * 10 + decValue;
2616*9880d681SAndroid Build Coastguard Worker         /* The maximum number that can be multiplied by ten with any
2617*9880d681SAndroid Build Coastguard Worker            digit added without overflowing an integerPart.  */
2618*9880d681SAndroid Build Coastguard Worker       } while (p <= D.lastSigDigit && multiplier <= (~ (integerPart) 0 - 9) / 10);
2619*9880d681SAndroid Build Coastguard Worker 
2620*9880d681SAndroid Build Coastguard Worker       /* Multiply out the current part.  */
2621*9880d681SAndroid Build Coastguard Worker       APInt::tcMultiplyPart(decSignificand, decSignificand, multiplier, val,
2622*9880d681SAndroid Build Coastguard Worker                             partCount, partCount + 1, false);
2623*9880d681SAndroid Build Coastguard Worker 
2624*9880d681SAndroid Build Coastguard Worker       /* If we used another part (likely but not guaranteed), increase
2625*9880d681SAndroid Build Coastguard Worker          the count.  */
2626*9880d681SAndroid Build Coastguard Worker       if (decSignificand[partCount])
2627*9880d681SAndroid Build Coastguard Worker         partCount++;
2628*9880d681SAndroid Build Coastguard Worker     } while (p <= D.lastSigDigit);
2629*9880d681SAndroid Build Coastguard Worker 
2630*9880d681SAndroid Build Coastguard Worker     category = fcNormal;
2631*9880d681SAndroid Build Coastguard Worker     fs = roundSignificandWithExponent(decSignificand, partCount,
2632*9880d681SAndroid Build Coastguard Worker                                       D.exponent, rounding_mode);
2633*9880d681SAndroid Build Coastguard Worker 
2634*9880d681SAndroid Build Coastguard Worker     delete [] decSignificand;
2635*9880d681SAndroid Build Coastguard Worker   }
2636*9880d681SAndroid Build Coastguard Worker 
2637*9880d681SAndroid Build Coastguard Worker   return fs;
2638*9880d681SAndroid Build Coastguard Worker }
2639*9880d681SAndroid Build Coastguard Worker 
2640*9880d681SAndroid Build Coastguard Worker bool
convertFromStringSpecials(StringRef str)2641*9880d681SAndroid Build Coastguard Worker APFloat::convertFromStringSpecials(StringRef str) {
2642*9880d681SAndroid Build Coastguard Worker   if (str.equals("inf") || str.equals("INFINITY")) {
2643*9880d681SAndroid Build Coastguard Worker     makeInf(false);
2644*9880d681SAndroid Build Coastguard Worker     return true;
2645*9880d681SAndroid Build Coastguard Worker   }
2646*9880d681SAndroid Build Coastguard Worker 
2647*9880d681SAndroid Build Coastguard Worker   if (str.equals("-inf") || str.equals("-INFINITY")) {
2648*9880d681SAndroid Build Coastguard Worker     makeInf(true);
2649*9880d681SAndroid Build Coastguard Worker     return true;
2650*9880d681SAndroid Build Coastguard Worker   }
2651*9880d681SAndroid Build Coastguard Worker 
2652*9880d681SAndroid Build Coastguard Worker   if (str.equals("nan") || str.equals("NaN")) {
2653*9880d681SAndroid Build Coastguard Worker     makeNaN(false, false);
2654*9880d681SAndroid Build Coastguard Worker     return true;
2655*9880d681SAndroid Build Coastguard Worker   }
2656*9880d681SAndroid Build Coastguard Worker 
2657*9880d681SAndroid Build Coastguard Worker   if (str.equals("-nan") || str.equals("-NaN")) {
2658*9880d681SAndroid Build Coastguard Worker     makeNaN(false, true);
2659*9880d681SAndroid Build Coastguard Worker     return true;
2660*9880d681SAndroid Build Coastguard Worker   }
2661*9880d681SAndroid Build Coastguard Worker 
2662*9880d681SAndroid Build Coastguard Worker   return false;
2663*9880d681SAndroid Build Coastguard Worker }
2664*9880d681SAndroid Build Coastguard Worker 
2665*9880d681SAndroid Build Coastguard Worker APFloat::opStatus
convertFromString(StringRef str,roundingMode rounding_mode)2666*9880d681SAndroid Build Coastguard Worker APFloat::convertFromString(StringRef str, roundingMode rounding_mode)
2667*9880d681SAndroid Build Coastguard Worker {
2668*9880d681SAndroid Build Coastguard Worker   assert(!str.empty() && "Invalid string length");
2669*9880d681SAndroid Build Coastguard Worker 
2670*9880d681SAndroid Build Coastguard Worker   // Handle special cases.
2671*9880d681SAndroid Build Coastguard Worker   if (convertFromStringSpecials(str))
2672*9880d681SAndroid Build Coastguard Worker     return opOK;
2673*9880d681SAndroid Build Coastguard Worker 
2674*9880d681SAndroid Build Coastguard Worker   /* Handle a leading minus sign.  */
2675*9880d681SAndroid Build Coastguard Worker   StringRef::iterator p = str.begin();
2676*9880d681SAndroid Build Coastguard Worker   size_t slen = str.size();
2677*9880d681SAndroid Build Coastguard Worker   sign = *p == '-' ? 1 : 0;
2678*9880d681SAndroid Build Coastguard Worker   if (*p == '-' || *p == '+') {
2679*9880d681SAndroid Build Coastguard Worker     p++;
2680*9880d681SAndroid Build Coastguard Worker     slen--;
2681*9880d681SAndroid Build Coastguard Worker     assert(slen && "String has no digits");
2682*9880d681SAndroid Build Coastguard Worker   }
2683*9880d681SAndroid Build Coastguard Worker 
2684*9880d681SAndroid Build Coastguard Worker   if (slen >= 2 && p[0] == '0' && (p[1] == 'x' || p[1] == 'X')) {
2685*9880d681SAndroid Build Coastguard Worker     assert(slen - 2 && "Invalid string");
2686*9880d681SAndroid Build Coastguard Worker     return convertFromHexadecimalString(StringRef(p + 2, slen - 2),
2687*9880d681SAndroid Build Coastguard Worker                                         rounding_mode);
2688*9880d681SAndroid Build Coastguard Worker   }
2689*9880d681SAndroid Build Coastguard Worker 
2690*9880d681SAndroid Build Coastguard Worker   return convertFromDecimalString(StringRef(p, slen), rounding_mode);
2691*9880d681SAndroid Build Coastguard Worker }
2692*9880d681SAndroid Build Coastguard Worker 
2693*9880d681SAndroid Build Coastguard Worker /* Write out a hexadecimal representation of the floating point value
2694*9880d681SAndroid Build Coastguard Worker    to DST, which must be of sufficient size, in the C99 form
2695*9880d681SAndroid Build Coastguard Worker    [-]0xh.hhhhp[+-]d.  Return the number of characters written,
2696*9880d681SAndroid Build Coastguard Worker    excluding the terminating NUL.
2697*9880d681SAndroid Build Coastguard Worker 
2698*9880d681SAndroid Build Coastguard Worker    If UPPERCASE, the output is in upper case, otherwise in lower case.
2699*9880d681SAndroid Build Coastguard Worker 
2700*9880d681SAndroid Build Coastguard Worker    HEXDIGITS digits appear altogether, rounding the value if
2701*9880d681SAndroid Build Coastguard Worker    necessary.  If HEXDIGITS is 0, the minimal precision to display the
2702*9880d681SAndroid Build Coastguard Worker    number precisely is used instead.  If nothing would appear after
2703*9880d681SAndroid Build Coastguard Worker    the decimal point it is suppressed.
2704*9880d681SAndroid Build Coastguard Worker 
2705*9880d681SAndroid Build Coastguard Worker    The decimal exponent is always printed and has at least one digit.
2706*9880d681SAndroid Build Coastguard Worker    Zero values display an exponent of zero.  Infinities and NaNs
2707*9880d681SAndroid Build Coastguard Worker    appear as "infinity" or "nan" respectively.
2708*9880d681SAndroid Build Coastguard Worker 
2709*9880d681SAndroid Build Coastguard Worker    The above rules are as specified by C99.  There is ambiguity about
2710*9880d681SAndroid Build Coastguard Worker    what the leading hexadecimal digit should be.  This implementation
2711*9880d681SAndroid Build Coastguard Worker    uses whatever is necessary so that the exponent is displayed as
2712*9880d681SAndroid Build Coastguard Worker    stored.  This implies the exponent will fall within the IEEE format
2713*9880d681SAndroid Build Coastguard Worker    range, and the leading hexadecimal digit will be 0 (for denormals),
2714*9880d681SAndroid Build Coastguard Worker    1 (normal numbers) or 2 (normal numbers rounded-away-from-zero with
2715*9880d681SAndroid Build Coastguard Worker    any other digits zero).
2716*9880d681SAndroid Build Coastguard Worker */
2717*9880d681SAndroid Build Coastguard Worker unsigned int
convertToHexString(char * dst,unsigned int hexDigits,bool upperCase,roundingMode rounding_mode) const2718*9880d681SAndroid Build Coastguard Worker APFloat::convertToHexString(char *dst, unsigned int hexDigits,
2719*9880d681SAndroid Build Coastguard Worker                             bool upperCase, roundingMode rounding_mode) const
2720*9880d681SAndroid Build Coastguard Worker {
2721*9880d681SAndroid Build Coastguard Worker   char *p;
2722*9880d681SAndroid Build Coastguard Worker 
2723*9880d681SAndroid Build Coastguard Worker   p = dst;
2724*9880d681SAndroid Build Coastguard Worker   if (sign)
2725*9880d681SAndroid Build Coastguard Worker     *dst++ = '-';
2726*9880d681SAndroid Build Coastguard Worker 
2727*9880d681SAndroid Build Coastguard Worker   switch (category) {
2728*9880d681SAndroid Build Coastguard Worker   case fcInfinity:
2729*9880d681SAndroid Build Coastguard Worker     memcpy (dst, upperCase ? infinityU: infinityL, sizeof infinityU - 1);
2730*9880d681SAndroid Build Coastguard Worker     dst += sizeof infinityL - 1;
2731*9880d681SAndroid Build Coastguard Worker     break;
2732*9880d681SAndroid Build Coastguard Worker 
2733*9880d681SAndroid Build Coastguard Worker   case fcNaN:
2734*9880d681SAndroid Build Coastguard Worker     memcpy (dst, upperCase ? NaNU: NaNL, sizeof NaNU - 1);
2735*9880d681SAndroid Build Coastguard Worker     dst += sizeof NaNU - 1;
2736*9880d681SAndroid Build Coastguard Worker     break;
2737*9880d681SAndroid Build Coastguard Worker 
2738*9880d681SAndroid Build Coastguard Worker   case fcZero:
2739*9880d681SAndroid Build Coastguard Worker     *dst++ = '0';
2740*9880d681SAndroid Build Coastguard Worker     *dst++ = upperCase ? 'X': 'x';
2741*9880d681SAndroid Build Coastguard Worker     *dst++ = '0';
2742*9880d681SAndroid Build Coastguard Worker     if (hexDigits > 1) {
2743*9880d681SAndroid Build Coastguard Worker       *dst++ = '.';
2744*9880d681SAndroid Build Coastguard Worker       memset (dst, '0', hexDigits - 1);
2745*9880d681SAndroid Build Coastguard Worker       dst += hexDigits - 1;
2746*9880d681SAndroid Build Coastguard Worker     }
2747*9880d681SAndroid Build Coastguard Worker     *dst++ = upperCase ? 'P': 'p';
2748*9880d681SAndroid Build Coastguard Worker     *dst++ = '0';
2749*9880d681SAndroid Build Coastguard Worker     break;
2750*9880d681SAndroid Build Coastguard Worker 
2751*9880d681SAndroid Build Coastguard Worker   case fcNormal:
2752*9880d681SAndroid Build Coastguard Worker     dst = convertNormalToHexString (dst, hexDigits, upperCase, rounding_mode);
2753*9880d681SAndroid Build Coastguard Worker     break;
2754*9880d681SAndroid Build Coastguard Worker   }
2755*9880d681SAndroid Build Coastguard Worker 
2756*9880d681SAndroid Build Coastguard Worker   *dst = 0;
2757*9880d681SAndroid Build Coastguard Worker 
2758*9880d681SAndroid Build Coastguard Worker   return static_cast<unsigned int>(dst - p);
2759*9880d681SAndroid Build Coastguard Worker }
2760*9880d681SAndroid Build Coastguard Worker 
2761*9880d681SAndroid Build Coastguard Worker /* Does the hard work of outputting the correctly rounded hexadecimal
2762*9880d681SAndroid Build Coastguard Worker    form of a normal floating point number with the specified number of
2763*9880d681SAndroid Build Coastguard Worker    hexadecimal digits.  If HEXDIGITS is zero the minimum number of
2764*9880d681SAndroid Build Coastguard Worker    digits necessary to print the value precisely is output.  */
2765*9880d681SAndroid Build Coastguard Worker char *
convertNormalToHexString(char * dst,unsigned int hexDigits,bool upperCase,roundingMode rounding_mode) const2766*9880d681SAndroid Build Coastguard Worker APFloat::convertNormalToHexString(char *dst, unsigned int hexDigits,
2767*9880d681SAndroid Build Coastguard Worker                                   bool upperCase,
2768*9880d681SAndroid Build Coastguard Worker                                   roundingMode rounding_mode) const
2769*9880d681SAndroid Build Coastguard Worker {
2770*9880d681SAndroid Build Coastguard Worker   unsigned int count, valueBits, shift, partsCount, outputDigits;
2771*9880d681SAndroid Build Coastguard Worker   const char *hexDigitChars;
2772*9880d681SAndroid Build Coastguard Worker   const integerPart *significand;
2773*9880d681SAndroid Build Coastguard Worker   char *p;
2774*9880d681SAndroid Build Coastguard Worker   bool roundUp;
2775*9880d681SAndroid Build Coastguard Worker 
2776*9880d681SAndroid Build Coastguard Worker   *dst++ = '0';
2777*9880d681SAndroid Build Coastguard Worker   *dst++ = upperCase ? 'X': 'x';
2778*9880d681SAndroid Build Coastguard Worker 
2779*9880d681SAndroid Build Coastguard Worker   roundUp = false;
2780*9880d681SAndroid Build Coastguard Worker   hexDigitChars = upperCase ? hexDigitsUpper: hexDigitsLower;
2781*9880d681SAndroid Build Coastguard Worker 
2782*9880d681SAndroid Build Coastguard Worker   significand = significandParts();
2783*9880d681SAndroid Build Coastguard Worker   partsCount = partCount();
2784*9880d681SAndroid Build Coastguard Worker 
2785*9880d681SAndroid Build Coastguard Worker   /* +3 because the first digit only uses the single integer bit, so
2786*9880d681SAndroid Build Coastguard Worker      we have 3 virtual zero most-significant-bits.  */
2787*9880d681SAndroid Build Coastguard Worker   valueBits = semantics->precision + 3;
2788*9880d681SAndroid Build Coastguard Worker   shift = integerPartWidth - valueBits % integerPartWidth;
2789*9880d681SAndroid Build Coastguard Worker 
2790*9880d681SAndroid Build Coastguard Worker   /* The natural number of digits required ignoring trailing
2791*9880d681SAndroid Build Coastguard Worker      insignificant zeroes.  */
2792*9880d681SAndroid Build Coastguard Worker   outputDigits = (valueBits - significandLSB () + 3) / 4;
2793*9880d681SAndroid Build Coastguard Worker 
2794*9880d681SAndroid Build Coastguard Worker   /* hexDigits of zero means use the required number for the
2795*9880d681SAndroid Build Coastguard Worker      precision.  Otherwise, see if we are truncating.  If we are,
2796*9880d681SAndroid Build Coastguard Worker      find out if we need to round away from zero.  */
2797*9880d681SAndroid Build Coastguard Worker   if (hexDigits) {
2798*9880d681SAndroid Build Coastguard Worker     if (hexDigits < outputDigits) {
2799*9880d681SAndroid Build Coastguard Worker       /* We are dropping non-zero bits, so need to check how to round.
2800*9880d681SAndroid Build Coastguard Worker          "bits" is the number of dropped bits.  */
2801*9880d681SAndroid Build Coastguard Worker       unsigned int bits;
2802*9880d681SAndroid Build Coastguard Worker       lostFraction fraction;
2803*9880d681SAndroid Build Coastguard Worker 
2804*9880d681SAndroid Build Coastguard Worker       bits = valueBits - hexDigits * 4;
2805*9880d681SAndroid Build Coastguard Worker       fraction = lostFractionThroughTruncation (significand, partsCount, bits);
2806*9880d681SAndroid Build Coastguard Worker       roundUp = roundAwayFromZero(rounding_mode, fraction, bits);
2807*9880d681SAndroid Build Coastguard Worker     }
2808*9880d681SAndroid Build Coastguard Worker     outputDigits = hexDigits;
2809*9880d681SAndroid Build Coastguard Worker   }
2810*9880d681SAndroid Build Coastguard Worker 
2811*9880d681SAndroid Build Coastguard Worker   /* Write the digits consecutively, and start writing in the location
2812*9880d681SAndroid Build Coastguard Worker      of the hexadecimal point.  We move the most significant digit
2813*9880d681SAndroid Build Coastguard Worker      left and add the hexadecimal point later.  */
2814*9880d681SAndroid Build Coastguard Worker   p = ++dst;
2815*9880d681SAndroid Build Coastguard Worker 
2816*9880d681SAndroid Build Coastguard Worker   count = (valueBits + integerPartWidth - 1) / integerPartWidth;
2817*9880d681SAndroid Build Coastguard Worker 
2818*9880d681SAndroid Build Coastguard Worker   while (outputDigits && count) {
2819*9880d681SAndroid Build Coastguard Worker     integerPart part;
2820*9880d681SAndroid Build Coastguard Worker 
2821*9880d681SAndroid Build Coastguard Worker     /* Put the most significant integerPartWidth bits in "part".  */
2822*9880d681SAndroid Build Coastguard Worker     if (--count == partsCount)
2823*9880d681SAndroid Build Coastguard Worker       part = 0;  /* An imaginary higher zero part.  */
2824*9880d681SAndroid Build Coastguard Worker     else
2825*9880d681SAndroid Build Coastguard Worker       part = significand[count] << shift;
2826*9880d681SAndroid Build Coastguard Worker 
2827*9880d681SAndroid Build Coastguard Worker     if (count && shift)
2828*9880d681SAndroid Build Coastguard Worker       part |= significand[count - 1] >> (integerPartWidth - shift);
2829*9880d681SAndroid Build Coastguard Worker 
2830*9880d681SAndroid Build Coastguard Worker     /* Convert as much of "part" to hexdigits as we can.  */
2831*9880d681SAndroid Build Coastguard Worker     unsigned int curDigits = integerPartWidth / 4;
2832*9880d681SAndroid Build Coastguard Worker 
2833*9880d681SAndroid Build Coastguard Worker     if (curDigits > outputDigits)
2834*9880d681SAndroid Build Coastguard Worker       curDigits = outputDigits;
2835*9880d681SAndroid Build Coastguard Worker     dst += partAsHex (dst, part, curDigits, hexDigitChars);
2836*9880d681SAndroid Build Coastguard Worker     outputDigits -= curDigits;
2837*9880d681SAndroid Build Coastguard Worker   }
2838*9880d681SAndroid Build Coastguard Worker 
2839*9880d681SAndroid Build Coastguard Worker   if (roundUp) {
2840*9880d681SAndroid Build Coastguard Worker     char *q = dst;
2841*9880d681SAndroid Build Coastguard Worker 
2842*9880d681SAndroid Build Coastguard Worker     /* Note that hexDigitChars has a trailing '0'.  */
2843*9880d681SAndroid Build Coastguard Worker     do {
2844*9880d681SAndroid Build Coastguard Worker       q--;
2845*9880d681SAndroid Build Coastguard Worker       *q = hexDigitChars[hexDigitValue (*q) + 1];
2846*9880d681SAndroid Build Coastguard Worker     } while (*q == '0');
2847*9880d681SAndroid Build Coastguard Worker     assert(q >= p);
2848*9880d681SAndroid Build Coastguard Worker   } else {
2849*9880d681SAndroid Build Coastguard Worker     /* Add trailing zeroes.  */
2850*9880d681SAndroid Build Coastguard Worker     memset (dst, '0', outputDigits);
2851*9880d681SAndroid Build Coastguard Worker     dst += outputDigits;
2852*9880d681SAndroid Build Coastguard Worker   }
2853*9880d681SAndroid Build Coastguard Worker 
2854*9880d681SAndroid Build Coastguard Worker   /* Move the most significant digit to before the point, and if there
2855*9880d681SAndroid Build Coastguard Worker      is something after the decimal point add it.  This must come
2856*9880d681SAndroid Build Coastguard Worker      after rounding above.  */
2857*9880d681SAndroid Build Coastguard Worker   p[-1] = p[0];
2858*9880d681SAndroid Build Coastguard Worker   if (dst -1 == p)
2859*9880d681SAndroid Build Coastguard Worker     dst--;
2860*9880d681SAndroid Build Coastguard Worker   else
2861*9880d681SAndroid Build Coastguard Worker     p[0] = '.';
2862*9880d681SAndroid Build Coastguard Worker 
2863*9880d681SAndroid Build Coastguard Worker   /* Finally output the exponent.  */
2864*9880d681SAndroid Build Coastguard Worker   *dst++ = upperCase ? 'P': 'p';
2865*9880d681SAndroid Build Coastguard Worker 
2866*9880d681SAndroid Build Coastguard Worker   return writeSignedDecimal (dst, exponent);
2867*9880d681SAndroid Build Coastguard Worker }
2868*9880d681SAndroid Build Coastguard Worker 
hash_value(const APFloat & Arg)2869*9880d681SAndroid Build Coastguard Worker hash_code llvm::hash_value(const APFloat &Arg) {
2870*9880d681SAndroid Build Coastguard Worker   if (!Arg.isFiniteNonZero())
2871*9880d681SAndroid Build Coastguard Worker     return hash_combine((uint8_t)Arg.category,
2872*9880d681SAndroid Build Coastguard Worker                         // NaN has no sign, fix it at zero.
2873*9880d681SAndroid Build Coastguard Worker                         Arg.isNaN() ? (uint8_t)0 : (uint8_t)Arg.sign,
2874*9880d681SAndroid Build Coastguard Worker                         Arg.semantics->precision);
2875*9880d681SAndroid Build Coastguard Worker 
2876*9880d681SAndroid Build Coastguard Worker   // Normal floats need their exponent and significand hashed.
2877*9880d681SAndroid Build Coastguard Worker   return hash_combine((uint8_t)Arg.category, (uint8_t)Arg.sign,
2878*9880d681SAndroid Build Coastguard Worker                       Arg.semantics->precision, Arg.exponent,
2879*9880d681SAndroid Build Coastguard Worker                       hash_combine_range(
2880*9880d681SAndroid Build Coastguard Worker                         Arg.significandParts(),
2881*9880d681SAndroid Build Coastguard Worker                         Arg.significandParts() + Arg.partCount()));
2882*9880d681SAndroid Build Coastguard Worker }
2883*9880d681SAndroid Build Coastguard Worker 
2884*9880d681SAndroid Build Coastguard Worker // Conversion from APFloat to/from host float/double.  It may eventually be
2885*9880d681SAndroid Build Coastguard Worker // possible to eliminate these and have everybody deal with APFloats, but that
2886*9880d681SAndroid Build Coastguard Worker // will take a while.  This approach will not easily extend to long double.
2887*9880d681SAndroid Build Coastguard Worker // Current implementation requires integerPartWidth==64, which is correct at
2888*9880d681SAndroid Build Coastguard Worker // the moment but could be made more general.
2889*9880d681SAndroid Build Coastguard Worker 
2890*9880d681SAndroid Build Coastguard Worker // Denormals have exponent minExponent in APFloat, but minExponent-1 in
2891*9880d681SAndroid Build Coastguard Worker // the actual IEEE respresentations.  We compensate for that here.
2892*9880d681SAndroid Build Coastguard Worker 
2893*9880d681SAndroid Build Coastguard Worker APInt
convertF80LongDoubleAPFloatToAPInt() const2894*9880d681SAndroid Build Coastguard Worker APFloat::convertF80LongDoubleAPFloatToAPInt() const
2895*9880d681SAndroid Build Coastguard Worker {
2896*9880d681SAndroid Build Coastguard Worker   assert(semantics == (const llvm::fltSemantics*)&x87DoubleExtended);
2897*9880d681SAndroid Build Coastguard Worker   assert(partCount()==2);
2898*9880d681SAndroid Build Coastguard Worker 
2899*9880d681SAndroid Build Coastguard Worker   uint64_t myexponent, mysignificand;
2900*9880d681SAndroid Build Coastguard Worker 
2901*9880d681SAndroid Build Coastguard Worker   if (isFiniteNonZero()) {
2902*9880d681SAndroid Build Coastguard Worker     myexponent = exponent+16383; //bias
2903*9880d681SAndroid Build Coastguard Worker     mysignificand = significandParts()[0];
2904*9880d681SAndroid Build Coastguard Worker     if (myexponent==1 && !(mysignificand & 0x8000000000000000ULL))
2905*9880d681SAndroid Build Coastguard Worker       myexponent = 0;   // denormal
2906*9880d681SAndroid Build Coastguard Worker   } else if (category==fcZero) {
2907*9880d681SAndroid Build Coastguard Worker     myexponent = 0;
2908*9880d681SAndroid Build Coastguard Worker     mysignificand = 0;
2909*9880d681SAndroid Build Coastguard Worker   } else if (category==fcInfinity) {
2910*9880d681SAndroid Build Coastguard Worker     myexponent = 0x7fff;
2911*9880d681SAndroid Build Coastguard Worker     mysignificand = 0x8000000000000000ULL;
2912*9880d681SAndroid Build Coastguard Worker   } else {
2913*9880d681SAndroid Build Coastguard Worker     assert(category == fcNaN && "Unknown category");
2914*9880d681SAndroid Build Coastguard Worker     myexponent = 0x7fff;
2915*9880d681SAndroid Build Coastguard Worker     mysignificand = significandParts()[0];
2916*9880d681SAndroid Build Coastguard Worker   }
2917*9880d681SAndroid Build Coastguard Worker 
2918*9880d681SAndroid Build Coastguard Worker   uint64_t words[2];
2919*9880d681SAndroid Build Coastguard Worker   words[0] = mysignificand;
2920*9880d681SAndroid Build Coastguard Worker   words[1] =  ((uint64_t)(sign & 1) << 15) |
2921*9880d681SAndroid Build Coastguard Worker               (myexponent & 0x7fffLL);
2922*9880d681SAndroid Build Coastguard Worker   return APInt(80, words);
2923*9880d681SAndroid Build Coastguard Worker }
2924*9880d681SAndroid Build Coastguard Worker 
2925*9880d681SAndroid Build Coastguard Worker APInt
convertPPCDoubleDoubleAPFloatToAPInt() const2926*9880d681SAndroid Build Coastguard Worker APFloat::convertPPCDoubleDoubleAPFloatToAPInt() const
2927*9880d681SAndroid Build Coastguard Worker {
2928*9880d681SAndroid Build Coastguard Worker   assert(semantics == (const llvm::fltSemantics*)&PPCDoubleDouble);
2929*9880d681SAndroid Build Coastguard Worker   assert(partCount()==2);
2930*9880d681SAndroid Build Coastguard Worker 
2931*9880d681SAndroid Build Coastguard Worker   uint64_t words[2];
2932*9880d681SAndroid Build Coastguard Worker   opStatus fs;
2933*9880d681SAndroid Build Coastguard Worker   bool losesInfo;
2934*9880d681SAndroid Build Coastguard Worker 
2935*9880d681SAndroid Build Coastguard Worker   // Convert number to double.  To avoid spurious underflows, we re-
2936*9880d681SAndroid Build Coastguard Worker   // normalize against the "double" minExponent first, and only *then*
2937*9880d681SAndroid Build Coastguard Worker   // truncate the mantissa.  The result of that second conversion
2938*9880d681SAndroid Build Coastguard Worker   // may be inexact, but should never underflow.
2939*9880d681SAndroid Build Coastguard Worker   // Declare fltSemantics before APFloat that uses it (and
2940*9880d681SAndroid Build Coastguard Worker   // saves pointer to it) to ensure correct destruction order.
2941*9880d681SAndroid Build Coastguard Worker   fltSemantics extendedSemantics = *semantics;
2942*9880d681SAndroid Build Coastguard Worker   extendedSemantics.minExponent = IEEEdouble.minExponent;
2943*9880d681SAndroid Build Coastguard Worker   APFloat extended(*this);
2944*9880d681SAndroid Build Coastguard Worker   fs = extended.convert(extendedSemantics, rmNearestTiesToEven, &losesInfo);
2945*9880d681SAndroid Build Coastguard Worker   assert(fs == opOK && !losesInfo);
2946*9880d681SAndroid Build Coastguard Worker   (void)fs;
2947*9880d681SAndroid Build Coastguard Worker 
2948*9880d681SAndroid Build Coastguard Worker   APFloat u(extended);
2949*9880d681SAndroid Build Coastguard Worker   fs = u.convert(IEEEdouble, rmNearestTiesToEven, &losesInfo);
2950*9880d681SAndroid Build Coastguard Worker   assert(fs == opOK || fs == opInexact);
2951*9880d681SAndroid Build Coastguard Worker   (void)fs;
2952*9880d681SAndroid Build Coastguard Worker   words[0] = *u.convertDoubleAPFloatToAPInt().getRawData();
2953*9880d681SAndroid Build Coastguard Worker 
2954*9880d681SAndroid Build Coastguard Worker   // If conversion was exact or resulted in a special case, we're done;
2955*9880d681SAndroid Build Coastguard Worker   // just set the second double to zero.  Otherwise, re-convert back to
2956*9880d681SAndroid Build Coastguard Worker   // the extended format and compute the difference.  This now should
2957*9880d681SAndroid Build Coastguard Worker   // convert exactly to double.
2958*9880d681SAndroid Build Coastguard Worker   if (u.isFiniteNonZero() && losesInfo) {
2959*9880d681SAndroid Build Coastguard Worker     fs = u.convert(extendedSemantics, rmNearestTiesToEven, &losesInfo);
2960*9880d681SAndroid Build Coastguard Worker     assert(fs == opOK && !losesInfo);
2961*9880d681SAndroid Build Coastguard Worker     (void)fs;
2962*9880d681SAndroid Build Coastguard Worker 
2963*9880d681SAndroid Build Coastguard Worker     APFloat v(extended);
2964*9880d681SAndroid Build Coastguard Worker     v.subtract(u, rmNearestTiesToEven);
2965*9880d681SAndroid Build Coastguard Worker     fs = v.convert(IEEEdouble, rmNearestTiesToEven, &losesInfo);
2966*9880d681SAndroid Build Coastguard Worker     assert(fs == opOK && !losesInfo);
2967*9880d681SAndroid Build Coastguard Worker     (void)fs;
2968*9880d681SAndroid Build Coastguard Worker     words[1] = *v.convertDoubleAPFloatToAPInt().getRawData();
2969*9880d681SAndroid Build Coastguard Worker   } else {
2970*9880d681SAndroid Build Coastguard Worker     words[1] = 0;
2971*9880d681SAndroid Build Coastguard Worker   }
2972*9880d681SAndroid Build Coastguard Worker 
2973*9880d681SAndroid Build Coastguard Worker   return APInt(128, words);
2974*9880d681SAndroid Build Coastguard Worker }
2975*9880d681SAndroid Build Coastguard Worker 
2976*9880d681SAndroid Build Coastguard Worker APInt
convertQuadrupleAPFloatToAPInt() const2977*9880d681SAndroid Build Coastguard Worker APFloat::convertQuadrupleAPFloatToAPInt() const
2978*9880d681SAndroid Build Coastguard Worker {
2979*9880d681SAndroid Build Coastguard Worker   assert(semantics == (const llvm::fltSemantics*)&IEEEquad);
2980*9880d681SAndroid Build Coastguard Worker   assert(partCount()==2);
2981*9880d681SAndroid Build Coastguard Worker 
2982*9880d681SAndroid Build Coastguard Worker   uint64_t myexponent, mysignificand, mysignificand2;
2983*9880d681SAndroid Build Coastguard Worker 
2984*9880d681SAndroid Build Coastguard Worker   if (isFiniteNonZero()) {
2985*9880d681SAndroid Build Coastguard Worker     myexponent = exponent+16383; //bias
2986*9880d681SAndroid Build Coastguard Worker     mysignificand = significandParts()[0];
2987*9880d681SAndroid Build Coastguard Worker     mysignificand2 = significandParts()[1];
2988*9880d681SAndroid Build Coastguard Worker     if (myexponent==1 && !(mysignificand2 & 0x1000000000000LL))
2989*9880d681SAndroid Build Coastguard Worker       myexponent = 0;   // denormal
2990*9880d681SAndroid Build Coastguard Worker   } else if (category==fcZero) {
2991*9880d681SAndroid Build Coastguard Worker     myexponent = 0;
2992*9880d681SAndroid Build Coastguard Worker     mysignificand = mysignificand2 = 0;
2993*9880d681SAndroid Build Coastguard Worker   } else if (category==fcInfinity) {
2994*9880d681SAndroid Build Coastguard Worker     myexponent = 0x7fff;
2995*9880d681SAndroid Build Coastguard Worker     mysignificand = mysignificand2 = 0;
2996*9880d681SAndroid Build Coastguard Worker   } else {
2997*9880d681SAndroid Build Coastguard Worker     assert(category == fcNaN && "Unknown category!");
2998*9880d681SAndroid Build Coastguard Worker     myexponent = 0x7fff;
2999*9880d681SAndroid Build Coastguard Worker     mysignificand = significandParts()[0];
3000*9880d681SAndroid Build Coastguard Worker     mysignificand2 = significandParts()[1];
3001*9880d681SAndroid Build Coastguard Worker   }
3002*9880d681SAndroid Build Coastguard Worker 
3003*9880d681SAndroid Build Coastguard Worker   uint64_t words[2];
3004*9880d681SAndroid Build Coastguard Worker   words[0] = mysignificand;
3005*9880d681SAndroid Build Coastguard Worker   words[1] = ((uint64_t)(sign & 1) << 63) |
3006*9880d681SAndroid Build Coastguard Worker              ((myexponent & 0x7fff) << 48) |
3007*9880d681SAndroid Build Coastguard Worker              (mysignificand2 & 0xffffffffffffLL);
3008*9880d681SAndroid Build Coastguard Worker 
3009*9880d681SAndroid Build Coastguard Worker   return APInt(128, words);
3010*9880d681SAndroid Build Coastguard Worker }
3011*9880d681SAndroid Build Coastguard Worker 
3012*9880d681SAndroid Build Coastguard Worker APInt
convertDoubleAPFloatToAPInt() const3013*9880d681SAndroid Build Coastguard Worker APFloat::convertDoubleAPFloatToAPInt() const
3014*9880d681SAndroid Build Coastguard Worker {
3015*9880d681SAndroid Build Coastguard Worker   assert(semantics == (const llvm::fltSemantics*)&IEEEdouble);
3016*9880d681SAndroid Build Coastguard Worker   assert(partCount()==1);
3017*9880d681SAndroid Build Coastguard Worker 
3018*9880d681SAndroid Build Coastguard Worker   uint64_t myexponent, mysignificand;
3019*9880d681SAndroid Build Coastguard Worker 
3020*9880d681SAndroid Build Coastguard Worker   if (isFiniteNonZero()) {
3021*9880d681SAndroid Build Coastguard Worker     myexponent = exponent+1023; //bias
3022*9880d681SAndroid Build Coastguard Worker     mysignificand = *significandParts();
3023*9880d681SAndroid Build Coastguard Worker     if (myexponent==1 && !(mysignificand & 0x10000000000000LL))
3024*9880d681SAndroid Build Coastguard Worker       myexponent = 0;   // denormal
3025*9880d681SAndroid Build Coastguard Worker   } else if (category==fcZero) {
3026*9880d681SAndroid Build Coastguard Worker     myexponent = 0;
3027*9880d681SAndroid Build Coastguard Worker     mysignificand = 0;
3028*9880d681SAndroid Build Coastguard Worker   } else if (category==fcInfinity) {
3029*9880d681SAndroid Build Coastguard Worker     myexponent = 0x7ff;
3030*9880d681SAndroid Build Coastguard Worker     mysignificand = 0;
3031*9880d681SAndroid Build Coastguard Worker   } else {
3032*9880d681SAndroid Build Coastguard Worker     assert(category == fcNaN && "Unknown category!");
3033*9880d681SAndroid Build Coastguard Worker     myexponent = 0x7ff;
3034*9880d681SAndroid Build Coastguard Worker     mysignificand = *significandParts();
3035*9880d681SAndroid Build Coastguard Worker   }
3036*9880d681SAndroid Build Coastguard Worker 
3037*9880d681SAndroid Build Coastguard Worker   return APInt(64, ((((uint64_t)(sign & 1) << 63) |
3038*9880d681SAndroid Build Coastguard Worker                      ((myexponent & 0x7ff) <<  52) |
3039*9880d681SAndroid Build Coastguard Worker                      (mysignificand & 0xfffffffffffffLL))));
3040*9880d681SAndroid Build Coastguard Worker }
3041*9880d681SAndroid Build Coastguard Worker 
3042*9880d681SAndroid Build Coastguard Worker APInt
convertFloatAPFloatToAPInt() const3043*9880d681SAndroid Build Coastguard Worker APFloat::convertFloatAPFloatToAPInt() const
3044*9880d681SAndroid Build Coastguard Worker {
3045*9880d681SAndroid Build Coastguard Worker   assert(semantics == (const llvm::fltSemantics*)&IEEEsingle);
3046*9880d681SAndroid Build Coastguard Worker   assert(partCount()==1);
3047*9880d681SAndroid Build Coastguard Worker 
3048*9880d681SAndroid Build Coastguard Worker   uint32_t myexponent, mysignificand;
3049*9880d681SAndroid Build Coastguard Worker 
3050*9880d681SAndroid Build Coastguard Worker   if (isFiniteNonZero()) {
3051*9880d681SAndroid Build Coastguard Worker     myexponent = exponent+127; //bias
3052*9880d681SAndroid Build Coastguard Worker     mysignificand = (uint32_t)*significandParts();
3053*9880d681SAndroid Build Coastguard Worker     if (myexponent == 1 && !(mysignificand & 0x800000))
3054*9880d681SAndroid Build Coastguard Worker       myexponent = 0;   // denormal
3055*9880d681SAndroid Build Coastguard Worker   } else if (category==fcZero) {
3056*9880d681SAndroid Build Coastguard Worker     myexponent = 0;
3057*9880d681SAndroid Build Coastguard Worker     mysignificand = 0;
3058*9880d681SAndroid Build Coastguard Worker   } else if (category==fcInfinity) {
3059*9880d681SAndroid Build Coastguard Worker     myexponent = 0xff;
3060*9880d681SAndroid Build Coastguard Worker     mysignificand = 0;
3061*9880d681SAndroid Build Coastguard Worker   } else {
3062*9880d681SAndroid Build Coastguard Worker     assert(category == fcNaN && "Unknown category!");
3063*9880d681SAndroid Build Coastguard Worker     myexponent = 0xff;
3064*9880d681SAndroid Build Coastguard Worker     mysignificand = (uint32_t)*significandParts();
3065*9880d681SAndroid Build Coastguard Worker   }
3066*9880d681SAndroid Build Coastguard Worker 
3067*9880d681SAndroid Build Coastguard Worker   return APInt(32, (((sign&1) << 31) | ((myexponent&0xff) << 23) |
3068*9880d681SAndroid Build Coastguard Worker                     (mysignificand & 0x7fffff)));
3069*9880d681SAndroid Build Coastguard Worker }
3070*9880d681SAndroid Build Coastguard Worker 
3071*9880d681SAndroid Build Coastguard Worker APInt
convertHalfAPFloatToAPInt() const3072*9880d681SAndroid Build Coastguard Worker APFloat::convertHalfAPFloatToAPInt() const
3073*9880d681SAndroid Build Coastguard Worker {
3074*9880d681SAndroid Build Coastguard Worker   assert(semantics == (const llvm::fltSemantics*)&IEEEhalf);
3075*9880d681SAndroid Build Coastguard Worker   assert(partCount()==1);
3076*9880d681SAndroid Build Coastguard Worker 
3077*9880d681SAndroid Build Coastguard Worker   uint32_t myexponent, mysignificand;
3078*9880d681SAndroid Build Coastguard Worker 
3079*9880d681SAndroid Build Coastguard Worker   if (isFiniteNonZero()) {
3080*9880d681SAndroid Build Coastguard Worker     myexponent = exponent+15; //bias
3081*9880d681SAndroid Build Coastguard Worker     mysignificand = (uint32_t)*significandParts();
3082*9880d681SAndroid Build Coastguard Worker     if (myexponent == 1 && !(mysignificand & 0x400))
3083*9880d681SAndroid Build Coastguard Worker       myexponent = 0;   // denormal
3084*9880d681SAndroid Build Coastguard Worker   } else if (category==fcZero) {
3085*9880d681SAndroid Build Coastguard Worker     myexponent = 0;
3086*9880d681SAndroid Build Coastguard Worker     mysignificand = 0;
3087*9880d681SAndroid Build Coastguard Worker   } else if (category==fcInfinity) {
3088*9880d681SAndroid Build Coastguard Worker     myexponent = 0x1f;
3089*9880d681SAndroid Build Coastguard Worker     mysignificand = 0;
3090*9880d681SAndroid Build Coastguard Worker   } else {
3091*9880d681SAndroid Build Coastguard Worker     assert(category == fcNaN && "Unknown category!");
3092*9880d681SAndroid Build Coastguard Worker     myexponent = 0x1f;
3093*9880d681SAndroid Build Coastguard Worker     mysignificand = (uint32_t)*significandParts();
3094*9880d681SAndroid Build Coastguard Worker   }
3095*9880d681SAndroid Build Coastguard Worker 
3096*9880d681SAndroid Build Coastguard Worker   return APInt(16, (((sign&1) << 15) | ((myexponent&0x1f) << 10) |
3097*9880d681SAndroid Build Coastguard Worker                     (mysignificand & 0x3ff)));
3098*9880d681SAndroid Build Coastguard Worker }
3099*9880d681SAndroid Build Coastguard Worker 
3100*9880d681SAndroid Build Coastguard Worker // This function creates an APInt that is just a bit map of the floating
3101*9880d681SAndroid Build Coastguard Worker // point constant as it would appear in memory.  It is not a conversion,
3102*9880d681SAndroid Build Coastguard Worker // and treating the result as a normal integer is unlikely to be useful.
3103*9880d681SAndroid Build Coastguard Worker 
3104*9880d681SAndroid Build Coastguard Worker APInt
bitcastToAPInt() const3105*9880d681SAndroid Build Coastguard Worker APFloat::bitcastToAPInt() const
3106*9880d681SAndroid Build Coastguard Worker {
3107*9880d681SAndroid Build Coastguard Worker   if (semantics == (const llvm::fltSemantics*)&IEEEhalf)
3108*9880d681SAndroid Build Coastguard Worker     return convertHalfAPFloatToAPInt();
3109*9880d681SAndroid Build Coastguard Worker 
3110*9880d681SAndroid Build Coastguard Worker   if (semantics == (const llvm::fltSemantics*)&IEEEsingle)
3111*9880d681SAndroid Build Coastguard Worker     return convertFloatAPFloatToAPInt();
3112*9880d681SAndroid Build Coastguard Worker 
3113*9880d681SAndroid Build Coastguard Worker   if (semantics == (const llvm::fltSemantics*)&IEEEdouble)
3114*9880d681SAndroid Build Coastguard Worker     return convertDoubleAPFloatToAPInt();
3115*9880d681SAndroid Build Coastguard Worker 
3116*9880d681SAndroid Build Coastguard Worker   if (semantics == (const llvm::fltSemantics*)&IEEEquad)
3117*9880d681SAndroid Build Coastguard Worker     return convertQuadrupleAPFloatToAPInt();
3118*9880d681SAndroid Build Coastguard Worker 
3119*9880d681SAndroid Build Coastguard Worker   if (semantics == (const llvm::fltSemantics*)&PPCDoubleDouble)
3120*9880d681SAndroid Build Coastguard Worker     return convertPPCDoubleDoubleAPFloatToAPInt();
3121*9880d681SAndroid Build Coastguard Worker 
3122*9880d681SAndroid Build Coastguard Worker   assert(semantics == (const llvm::fltSemantics*)&x87DoubleExtended &&
3123*9880d681SAndroid Build Coastguard Worker          "unknown format!");
3124*9880d681SAndroid Build Coastguard Worker   return convertF80LongDoubleAPFloatToAPInt();
3125*9880d681SAndroid Build Coastguard Worker }
3126*9880d681SAndroid Build Coastguard Worker 
3127*9880d681SAndroid Build Coastguard Worker float
convertToFloat() const3128*9880d681SAndroid Build Coastguard Worker APFloat::convertToFloat() const
3129*9880d681SAndroid Build Coastguard Worker {
3130*9880d681SAndroid Build Coastguard Worker   assert(semantics == (const llvm::fltSemantics*)&IEEEsingle &&
3131*9880d681SAndroid Build Coastguard Worker          "Float semantics are not IEEEsingle");
3132*9880d681SAndroid Build Coastguard Worker   APInt api = bitcastToAPInt();
3133*9880d681SAndroid Build Coastguard Worker   return api.bitsToFloat();
3134*9880d681SAndroid Build Coastguard Worker }
3135*9880d681SAndroid Build Coastguard Worker 
3136*9880d681SAndroid Build Coastguard Worker double
convertToDouble() const3137*9880d681SAndroid Build Coastguard Worker APFloat::convertToDouble() const
3138*9880d681SAndroid Build Coastguard Worker {
3139*9880d681SAndroid Build Coastguard Worker   assert(semantics == (const llvm::fltSemantics*)&IEEEdouble &&
3140*9880d681SAndroid Build Coastguard Worker          "Float semantics are not IEEEdouble");
3141*9880d681SAndroid Build Coastguard Worker   APInt api = bitcastToAPInt();
3142*9880d681SAndroid Build Coastguard Worker   return api.bitsToDouble();
3143*9880d681SAndroid Build Coastguard Worker }
3144*9880d681SAndroid Build Coastguard Worker 
3145*9880d681SAndroid Build Coastguard Worker /// Integer bit is explicit in this format.  Intel hardware (387 and later)
3146*9880d681SAndroid Build Coastguard Worker /// does not support these bit patterns:
3147*9880d681SAndroid Build Coastguard Worker ///  exponent = all 1's, integer bit 0, significand 0 ("pseudoinfinity")
3148*9880d681SAndroid Build Coastguard Worker ///  exponent = all 1's, integer bit 0, significand nonzero ("pseudoNaN")
3149*9880d681SAndroid Build Coastguard Worker ///  exponent = 0, integer bit 1 ("pseudodenormal")
3150*9880d681SAndroid Build Coastguard Worker ///  exponent!=0 nor all 1's, integer bit 0 ("unnormal")
3151*9880d681SAndroid Build Coastguard Worker /// At the moment, the first two are treated as NaNs, the second two as Normal.
3152*9880d681SAndroid Build Coastguard Worker void
initFromF80LongDoubleAPInt(const APInt & api)3153*9880d681SAndroid Build Coastguard Worker APFloat::initFromF80LongDoubleAPInt(const APInt &api)
3154*9880d681SAndroid Build Coastguard Worker {
3155*9880d681SAndroid Build Coastguard Worker   assert(api.getBitWidth()==80);
3156*9880d681SAndroid Build Coastguard Worker   uint64_t i1 = api.getRawData()[0];
3157*9880d681SAndroid Build Coastguard Worker   uint64_t i2 = api.getRawData()[1];
3158*9880d681SAndroid Build Coastguard Worker   uint64_t myexponent = (i2 & 0x7fff);
3159*9880d681SAndroid Build Coastguard Worker   uint64_t mysignificand = i1;
3160*9880d681SAndroid Build Coastguard Worker 
3161*9880d681SAndroid Build Coastguard Worker   initialize(&APFloat::x87DoubleExtended);
3162*9880d681SAndroid Build Coastguard Worker   assert(partCount()==2);
3163*9880d681SAndroid Build Coastguard Worker 
3164*9880d681SAndroid Build Coastguard Worker   sign = static_cast<unsigned int>(i2>>15);
3165*9880d681SAndroid Build Coastguard Worker   if (myexponent==0 && mysignificand==0) {
3166*9880d681SAndroid Build Coastguard Worker     // exponent, significand meaningless
3167*9880d681SAndroid Build Coastguard Worker     category = fcZero;
3168*9880d681SAndroid Build Coastguard Worker   } else if (myexponent==0x7fff && mysignificand==0x8000000000000000ULL) {
3169*9880d681SAndroid Build Coastguard Worker     // exponent, significand meaningless
3170*9880d681SAndroid Build Coastguard Worker     category = fcInfinity;
3171*9880d681SAndroid Build Coastguard Worker   } else if (myexponent==0x7fff && mysignificand!=0x8000000000000000ULL) {
3172*9880d681SAndroid Build Coastguard Worker     // exponent meaningless
3173*9880d681SAndroid Build Coastguard Worker     category = fcNaN;
3174*9880d681SAndroid Build Coastguard Worker     significandParts()[0] = mysignificand;
3175*9880d681SAndroid Build Coastguard Worker     significandParts()[1] = 0;
3176*9880d681SAndroid Build Coastguard Worker   } else {
3177*9880d681SAndroid Build Coastguard Worker     category = fcNormal;
3178*9880d681SAndroid Build Coastguard Worker     exponent = myexponent - 16383;
3179*9880d681SAndroid Build Coastguard Worker     significandParts()[0] = mysignificand;
3180*9880d681SAndroid Build Coastguard Worker     significandParts()[1] = 0;
3181*9880d681SAndroid Build Coastguard Worker     if (myexponent==0)          // denormal
3182*9880d681SAndroid Build Coastguard Worker       exponent = -16382;
3183*9880d681SAndroid Build Coastguard Worker   }
3184*9880d681SAndroid Build Coastguard Worker }
3185*9880d681SAndroid Build Coastguard Worker 
3186*9880d681SAndroid Build Coastguard Worker void
initFromPPCDoubleDoubleAPInt(const APInt & api)3187*9880d681SAndroid Build Coastguard Worker APFloat::initFromPPCDoubleDoubleAPInt(const APInt &api)
3188*9880d681SAndroid Build Coastguard Worker {
3189*9880d681SAndroid Build Coastguard Worker   assert(api.getBitWidth()==128);
3190*9880d681SAndroid Build Coastguard Worker   uint64_t i1 = api.getRawData()[0];
3191*9880d681SAndroid Build Coastguard Worker   uint64_t i2 = api.getRawData()[1];
3192*9880d681SAndroid Build Coastguard Worker   opStatus fs;
3193*9880d681SAndroid Build Coastguard Worker   bool losesInfo;
3194*9880d681SAndroid Build Coastguard Worker 
3195*9880d681SAndroid Build Coastguard Worker   // Get the first double and convert to our format.
3196*9880d681SAndroid Build Coastguard Worker   initFromDoubleAPInt(APInt(64, i1));
3197*9880d681SAndroid Build Coastguard Worker   fs = convert(PPCDoubleDouble, rmNearestTiesToEven, &losesInfo);
3198*9880d681SAndroid Build Coastguard Worker   assert(fs == opOK && !losesInfo);
3199*9880d681SAndroid Build Coastguard Worker   (void)fs;
3200*9880d681SAndroid Build Coastguard Worker 
3201*9880d681SAndroid Build Coastguard Worker   // Unless we have a special case, add in second double.
3202*9880d681SAndroid Build Coastguard Worker   if (isFiniteNonZero()) {
3203*9880d681SAndroid Build Coastguard Worker     APFloat v(IEEEdouble, APInt(64, i2));
3204*9880d681SAndroid Build Coastguard Worker     fs = v.convert(PPCDoubleDouble, rmNearestTiesToEven, &losesInfo);
3205*9880d681SAndroid Build Coastguard Worker     assert(fs == opOK && !losesInfo);
3206*9880d681SAndroid Build Coastguard Worker     (void)fs;
3207*9880d681SAndroid Build Coastguard Worker 
3208*9880d681SAndroid Build Coastguard Worker     add(v, rmNearestTiesToEven);
3209*9880d681SAndroid Build Coastguard Worker   }
3210*9880d681SAndroid Build Coastguard Worker }
3211*9880d681SAndroid Build Coastguard Worker 
3212*9880d681SAndroid Build Coastguard Worker void
initFromQuadrupleAPInt(const APInt & api)3213*9880d681SAndroid Build Coastguard Worker APFloat::initFromQuadrupleAPInt(const APInt &api)
3214*9880d681SAndroid Build Coastguard Worker {
3215*9880d681SAndroid Build Coastguard Worker   assert(api.getBitWidth()==128);
3216*9880d681SAndroid Build Coastguard Worker   uint64_t i1 = api.getRawData()[0];
3217*9880d681SAndroid Build Coastguard Worker   uint64_t i2 = api.getRawData()[1];
3218*9880d681SAndroid Build Coastguard Worker   uint64_t myexponent = (i2 >> 48) & 0x7fff;
3219*9880d681SAndroid Build Coastguard Worker   uint64_t mysignificand  = i1;
3220*9880d681SAndroid Build Coastguard Worker   uint64_t mysignificand2 = i2 & 0xffffffffffffLL;
3221*9880d681SAndroid Build Coastguard Worker 
3222*9880d681SAndroid Build Coastguard Worker   initialize(&APFloat::IEEEquad);
3223*9880d681SAndroid Build Coastguard Worker   assert(partCount()==2);
3224*9880d681SAndroid Build Coastguard Worker 
3225*9880d681SAndroid Build Coastguard Worker   sign = static_cast<unsigned int>(i2>>63);
3226*9880d681SAndroid Build Coastguard Worker   if (myexponent==0 &&
3227*9880d681SAndroid Build Coastguard Worker       (mysignificand==0 && mysignificand2==0)) {
3228*9880d681SAndroid Build Coastguard Worker     // exponent, significand meaningless
3229*9880d681SAndroid Build Coastguard Worker     category = fcZero;
3230*9880d681SAndroid Build Coastguard Worker   } else if (myexponent==0x7fff &&
3231*9880d681SAndroid Build Coastguard Worker              (mysignificand==0 && mysignificand2==0)) {
3232*9880d681SAndroid Build Coastguard Worker     // exponent, significand meaningless
3233*9880d681SAndroid Build Coastguard Worker     category = fcInfinity;
3234*9880d681SAndroid Build Coastguard Worker   } else if (myexponent==0x7fff &&
3235*9880d681SAndroid Build Coastguard Worker              (mysignificand!=0 || mysignificand2 !=0)) {
3236*9880d681SAndroid Build Coastguard Worker     // exponent meaningless
3237*9880d681SAndroid Build Coastguard Worker     category = fcNaN;
3238*9880d681SAndroid Build Coastguard Worker     significandParts()[0] = mysignificand;
3239*9880d681SAndroid Build Coastguard Worker     significandParts()[1] = mysignificand2;
3240*9880d681SAndroid Build Coastguard Worker   } else {
3241*9880d681SAndroid Build Coastguard Worker     category = fcNormal;
3242*9880d681SAndroid Build Coastguard Worker     exponent = myexponent - 16383;
3243*9880d681SAndroid Build Coastguard Worker     significandParts()[0] = mysignificand;
3244*9880d681SAndroid Build Coastguard Worker     significandParts()[1] = mysignificand2;
3245*9880d681SAndroid Build Coastguard Worker     if (myexponent==0)          // denormal
3246*9880d681SAndroid Build Coastguard Worker       exponent = -16382;
3247*9880d681SAndroid Build Coastguard Worker     else
3248*9880d681SAndroid Build Coastguard Worker       significandParts()[1] |= 0x1000000000000LL;  // integer bit
3249*9880d681SAndroid Build Coastguard Worker   }
3250*9880d681SAndroid Build Coastguard Worker }
3251*9880d681SAndroid Build Coastguard Worker 
3252*9880d681SAndroid Build Coastguard Worker void
initFromDoubleAPInt(const APInt & api)3253*9880d681SAndroid Build Coastguard Worker APFloat::initFromDoubleAPInt(const APInt &api)
3254*9880d681SAndroid Build Coastguard Worker {
3255*9880d681SAndroid Build Coastguard Worker   assert(api.getBitWidth()==64);
3256*9880d681SAndroid Build Coastguard Worker   uint64_t i = *api.getRawData();
3257*9880d681SAndroid Build Coastguard Worker   uint64_t myexponent = (i >> 52) & 0x7ff;
3258*9880d681SAndroid Build Coastguard Worker   uint64_t mysignificand = i & 0xfffffffffffffLL;
3259*9880d681SAndroid Build Coastguard Worker 
3260*9880d681SAndroid Build Coastguard Worker   initialize(&APFloat::IEEEdouble);
3261*9880d681SAndroid Build Coastguard Worker   assert(partCount()==1);
3262*9880d681SAndroid Build Coastguard Worker 
3263*9880d681SAndroid Build Coastguard Worker   sign = static_cast<unsigned int>(i>>63);
3264*9880d681SAndroid Build Coastguard Worker   if (myexponent==0 && mysignificand==0) {
3265*9880d681SAndroid Build Coastguard Worker     // exponent, significand meaningless
3266*9880d681SAndroid Build Coastguard Worker     category = fcZero;
3267*9880d681SAndroid Build Coastguard Worker   } else if (myexponent==0x7ff && mysignificand==0) {
3268*9880d681SAndroid Build Coastguard Worker     // exponent, significand meaningless
3269*9880d681SAndroid Build Coastguard Worker     category = fcInfinity;
3270*9880d681SAndroid Build Coastguard Worker   } else if (myexponent==0x7ff && mysignificand!=0) {
3271*9880d681SAndroid Build Coastguard Worker     // exponent meaningless
3272*9880d681SAndroid Build Coastguard Worker     category = fcNaN;
3273*9880d681SAndroid Build Coastguard Worker     *significandParts() = mysignificand;
3274*9880d681SAndroid Build Coastguard Worker   } else {
3275*9880d681SAndroid Build Coastguard Worker     category = fcNormal;
3276*9880d681SAndroid Build Coastguard Worker     exponent = myexponent - 1023;
3277*9880d681SAndroid Build Coastguard Worker     *significandParts() = mysignificand;
3278*9880d681SAndroid Build Coastguard Worker     if (myexponent==0)          // denormal
3279*9880d681SAndroid Build Coastguard Worker       exponent = -1022;
3280*9880d681SAndroid Build Coastguard Worker     else
3281*9880d681SAndroid Build Coastguard Worker       *significandParts() |= 0x10000000000000LL;  // integer bit
3282*9880d681SAndroid Build Coastguard Worker   }
3283*9880d681SAndroid Build Coastguard Worker }
3284*9880d681SAndroid Build Coastguard Worker 
3285*9880d681SAndroid Build Coastguard Worker void
initFromFloatAPInt(const APInt & api)3286*9880d681SAndroid Build Coastguard Worker APFloat::initFromFloatAPInt(const APInt & api)
3287*9880d681SAndroid Build Coastguard Worker {
3288*9880d681SAndroid Build Coastguard Worker   assert(api.getBitWidth()==32);
3289*9880d681SAndroid Build Coastguard Worker   uint32_t i = (uint32_t)*api.getRawData();
3290*9880d681SAndroid Build Coastguard Worker   uint32_t myexponent = (i >> 23) & 0xff;
3291*9880d681SAndroid Build Coastguard Worker   uint32_t mysignificand = i & 0x7fffff;
3292*9880d681SAndroid Build Coastguard Worker 
3293*9880d681SAndroid Build Coastguard Worker   initialize(&APFloat::IEEEsingle);
3294*9880d681SAndroid Build Coastguard Worker   assert(partCount()==1);
3295*9880d681SAndroid Build Coastguard Worker 
3296*9880d681SAndroid Build Coastguard Worker   sign = i >> 31;
3297*9880d681SAndroid Build Coastguard Worker   if (myexponent==0 && mysignificand==0) {
3298*9880d681SAndroid Build Coastguard Worker     // exponent, significand meaningless
3299*9880d681SAndroid Build Coastguard Worker     category = fcZero;
3300*9880d681SAndroid Build Coastguard Worker   } else if (myexponent==0xff && mysignificand==0) {
3301*9880d681SAndroid Build Coastguard Worker     // exponent, significand meaningless
3302*9880d681SAndroid Build Coastguard Worker     category = fcInfinity;
3303*9880d681SAndroid Build Coastguard Worker   } else if (myexponent==0xff && mysignificand!=0) {
3304*9880d681SAndroid Build Coastguard Worker     // sign, exponent, significand meaningless
3305*9880d681SAndroid Build Coastguard Worker     category = fcNaN;
3306*9880d681SAndroid Build Coastguard Worker     *significandParts() = mysignificand;
3307*9880d681SAndroid Build Coastguard Worker   } else {
3308*9880d681SAndroid Build Coastguard Worker     category = fcNormal;
3309*9880d681SAndroid Build Coastguard Worker     exponent = myexponent - 127;  //bias
3310*9880d681SAndroid Build Coastguard Worker     *significandParts() = mysignificand;
3311*9880d681SAndroid Build Coastguard Worker     if (myexponent==0)    // denormal
3312*9880d681SAndroid Build Coastguard Worker       exponent = -126;
3313*9880d681SAndroid Build Coastguard Worker     else
3314*9880d681SAndroid Build Coastguard Worker       *significandParts() |= 0x800000; // integer bit
3315*9880d681SAndroid Build Coastguard Worker   }
3316*9880d681SAndroid Build Coastguard Worker }
3317*9880d681SAndroid Build Coastguard Worker 
3318*9880d681SAndroid Build Coastguard Worker void
initFromHalfAPInt(const APInt & api)3319*9880d681SAndroid Build Coastguard Worker APFloat::initFromHalfAPInt(const APInt & api)
3320*9880d681SAndroid Build Coastguard Worker {
3321*9880d681SAndroid Build Coastguard Worker   assert(api.getBitWidth()==16);
3322*9880d681SAndroid Build Coastguard Worker   uint32_t i = (uint32_t)*api.getRawData();
3323*9880d681SAndroid Build Coastguard Worker   uint32_t myexponent = (i >> 10) & 0x1f;
3324*9880d681SAndroid Build Coastguard Worker   uint32_t mysignificand = i & 0x3ff;
3325*9880d681SAndroid Build Coastguard Worker 
3326*9880d681SAndroid Build Coastguard Worker   initialize(&APFloat::IEEEhalf);
3327*9880d681SAndroid Build Coastguard Worker   assert(partCount()==1);
3328*9880d681SAndroid Build Coastguard Worker 
3329*9880d681SAndroid Build Coastguard Worker   sign = i >> 15;
3330*9880d681SAndroid Build Coastguard Worker   if (myexponent==0 && mysignificand==0) {
3331*9880d681SAndroid Build Coastguard Worker     // exponent, significand meaningless
3332*9880d681SAndroid Build Coastguard Worker     category = fcZero;
3333*9880d681SAndroid Build Coastguard Worker   } else if (myexponent==0x1f && mysignificand==0) {
3334*9880d681SAndroid Build Coastguard Worker     // exponent, significand meaningless
3335*9880d681SAndroid Build Coastguard Worker     category = fcInfinity;
3336*9880d681SAndroid Build Coastguard Worker   } else if (myexponent==0x1f && mysignificand!=0) {
3337*9880d681SAndroid Build Coastguard Worker     // sign, exponent, significand meaningless
3338*9880d681SAndroid Build Coastguard Worker     category = fcNaN;
3339*9880d681SAndroid Build Coastguard Worker     *significandParts() = mysignificand;
3340*9880d681SAndroid Build Coastguard Worker   } else {
3341*9880d681SAndroid Build Coastguard Worker     category = fcNormal;
3342*9880d681SAndroid Build Coastguard Worker     exponent = myexponent - 15;  //bias
3343*9880d681SAndroid Build Coastguard Worker     *significandParts() = mysignificand;
3344*9880d681SAndroid Build Coastguard Worker     if (myexponent==0)    // denormal
3345*9880d681SAndroid Build Coastguard Worker       exponent = -14;
3346*9880d681SAndroid Build Coastguard Worker     else
3347*9880d681SAndroid Build Coastguard Worker       *significandParts() |= 0x400; // integer bit
3348*9880d681SAndroid Build Coastguard Worker   }
3349*9880d681SAndroid Build Coastguard Worker }
3350*9880d681SAndroid Build Coastguard Worker 
3351*9880d681SAndroid Build Coastguard Worker /// Treat api as containing the bits of a floating point number.  Currently
3352*9880d681SAndroid Build Coastguard Worker /// we infer the floating point type from the size of the APInt.  The
3353*9880d681SAndroid Build Coastguard Worker /// isIEEE argument distinguishes between PPC128 and IEEE128 (not meaningful
3354*9880d681SAndroid Build Coastguard Worker /// when the size is anything else).
3355*9880d681SAndroid Build Coastguard Worker void
initFromAPInt(const fltSemantics * Sem,const APInt & api)3356*9880d681SAndroid Build Coastguard Worker APFloat::initFromAPInt(const fltSemantics* Sem, const APInt& api)
3357*9880d681SAndroid Build Coastguard Worker {
3358*9880d681SAndroid Build Coastguard Worker   if (Sem == &IEEEhalf)
3359*9880d681SAndroid Build Coastguard Worker     return initFromHalfAPInt(api);
3360*9880d681SAndroid Build Coastguard Worker   if (Sem == &IEEEsingle)
3361*9880d681SAndroid Build Coastguard Worker     return initFromFloatAPInt(api);
3362*9880d681SAndroid Build Coastguard Worker   if (Sem == &IEEEdouble)
3363*9880d681SAndroid Build Coastguard Worker     return initFromDoubleAPInt(api);
3364*9880d681SAndroid Build Coastguard Worker   if (Sem == &x87DoubleExtended)
3365*9880d681SAndroid Build Coastguard Worker     return initFromF80LongDoubleAPInt(api);
3366*9880d681SAndroid Build Coastguard Worker   if (Sem == &IEEEquad)
3367*9880d681SAndroid Build Coastguard Worker     return initFromQuadrupleAPInt(api);
3368*9880d681SAndroid Build Coastguard Worker   if (Sem == &PPCDoubleDouble)
3369*9880d681SAndroid Build Coastguard Worker     return initFromPPCDoubleDoubleAPInt(api);
3370*9880d681SAndroid Build Coastguard Worker 
3371*9880d681SAndroid Build Coastguard Worker   llvm_unreachable(nullptr);
3372*9880d681SAndroid Build Coastguard Worker }
3373*9880d681SAndroid Build Coastguard Worker 
3374*9880d681SAndroid Build Coastguard Worker APFloat
getAllOnesValue(unsigned BitWidth,bool isIEEE)3375*9880d681SAndroid Build Coastguard Worker APFloat::getAllOnesValue(unsigned BitWidth, bool isIEEE)
3376*9880d681SAndroid Build Coastguard Worker {
3377*9880d681SAndroid Build Coastguard Worker   switch (BitWidth) {
3378*9880d681SAndroid Build Coastguard Worker   case 16:
3379*9880d681SAndroid Build Coastguard Worker     return APFloat(IEEEhalf, APInt::getAllOnesValue(BitWidth));
3380*9880d681SAndroid Build Coastguard Worker   case 32:
3381*9880d681SAndroid Build Coastguard Worker     return APFloat(IEEEsingle, APInt::getAllOnesValue(BitWidth));
3382*9880d681SAndroid Build Coastguard Worker   case 64:
3383*9880d681SAndroid Build Coastguard Worker     return APFloat(IEEEdouble, APInt::getAllOnesValue(BitWidth));
3384*9880d681SAndroid Build Coastguard Worker   case 80:
3385*9880d681SAndroid Build Coastguard Worker     return APFloat(x87DoubleExtended, APInt::getAllOnesValue(BitWidth));
3386*9880d681SAndroid Build Coastguard Worker   case 128:
3387*9880d681SAndroid Build Coastguard Worker     if (isIEEE)
3388*9880d681SAndroid Build Coastguard Worker       return APFloat(IEEEquad, APInt::getAllOnesValue(BitWidth));
3389*9880d681SAndroid Build Coastguard Worker     return APFloat(PPCDoubleDouble, APInt::getAllOnesValue(BitWidth));
3390*9880d681SAndroid Build Coastguard Worker   default:
3391*9880d681SAndroid Build Coastguard Worker     llvm_unreachable("Unknown floating bit width");
3392*9880d681SAndroid Build Coastguard Worker   }
3393*9880d681SAndroid Build Coastguard Worker }
3394*9880d681SAndroid Build Coastguard Worker 
getSizeInBits(const fltSemantics & Sem)3395*9880d681SAndroid Build Coastguard Worker unsigned APFloat::getSizeInBits(const fltSemantics &Sem) {
3396*9880d681SAndroid Build Coastguard Worker   return Sem.sizeInBits;
3397*9880d681SAndroid Build Coastguard Worker }
3398*9880d681SAndroid Build Coastguard Worker 
3399*9880d681SAndroid Build Coastguard Worker /// Make this number the largest magnitude normal number in the given
3400*9880d681SAndroid Build Coastguard Worker /// semantics.
makeLargest(bool Negative)3401*9880d681SAndroid Build Coastguard Worker void APFloat::makeLargest(bool Negative) {
3402*9880d681SAndroid Build Coastguard Worker   // We want (in interchange format):
3403*9880d681SAndroid Build Coastguard Worker   //   sign = {Negative}
3404*9880d681SAndroid Build Coastguard Worker   //   exponent = 1..10
3405*9880d681SAndroid Build Coastguard Worker   //   significand = 1..1
3406*9880d681SAndroid Build Coastguard Worker   category = fcNormal;
3407*9880d681SAndroid Build Coastguard Worker   sign = Negative;
3408*9880d681SAndroid Build Coastguard Worker   exponent = semantics->maxExponent;
3409*9880d681SAndroid Build Coastguard Worker 
3410*9880d681SAndroid Build Coastguard Worker   // Use memset to set all but the highest integerPart to all ones.
3411*9880d681SAndroid Build Coastguard Worker   integerPart *significand = significandParts();
3412*9880d681SAndroid Build Coastguard Worker   unsigned PartCount = partCount();
3413*9880d681SAndroid Build Coastguard Worker   memset(significand, 0xFF, sizeof(integerPart)*(PartCount - 1));
3414*9880d681SAndroid Build Coastguard Worker 
3415*9880d681SAndroid Build Coastguard Worker   // Set the high integerPart especially setting all unused top bits for
3416*9880d681SAndroid Build Coastguard Worker   // internal consistency.
3417*9880d681SAndroid Build Coastguard Worker   const unsigned NumUnusedHighBits =
3418*9880d681SAndroid Build Coastguard Worker     PartCount*integerPartWidth - semantics->precision;
3419*9880d681SAndroid Build Coastguard Worker   significand[PartCount - 1] = (NumUnusedHighBits < integerPartWidth)
3420*9880d681SAndroid Build Coastguard Worker                                    ? (~integerPart(0) >> NumUnusedHighBits)
3421*9880d681SAndroid Build Coastguard Worker                                    : 0;
3422*9880d681SAndroid Build Coastguard Worker }
3423*9880d681SAndroid Build Coastguard Worker 
3424*9880d681SAndroid Build Coastguard Worker /// Make this number the smallest magnitude denormal number in the given
3425*9880d681SAndroid Build Coastguard Worker /// semantics.
makeSmallest(bool Negative)3426*9880d681SAndroid Build Coastguard Worker void APFloat::makeSmallest(bool Negative) {
3427*9880d681SAndroid Build Coastguard Worker   // We want (in interchange format):
3428*9880d681SAndroid Build Coastguard Worker   //   sign = {Negative}
3429*9880d681SAndroid Build Coastguard Worker   //   exponent = 0..0
3430*9880d681SAndroid Build Coastguard Worker   //   significand = 0..01
3431*9880d681SAndroid Build Coastguard Worker   category = fcNormal;
3432*9880d681SAndroid Build Coastguard Worker   sign = Negative;
3433*9880d681SAndroid Build Coastguard Worker   exponent = semantics->minExponent;
3434*9880d681SAndroid Build Coastguard Worker   APInt::tcSet(significandParts(), 1, partCount());
3435*9880d681SAndroid Build Coastguard Worker }
3436*9880d681SAndroid Build Coastguard Worker 
3437*9880d681SAndroid Build Coastguard Worker 
getLargest(const fltSemantics & Sem,bool Negative)3438*9880d681SAndroid Build Coastguard Worker APFloat APFloat::getLargest(const fltSemantics &Sem, bool Negative) {
3439*9880d681SAndroid Build Coastguard Worker   // We want (in interchange format):
3440*9880d681SAndroid Build Coastguard Worker   //   sign = {Negative}
3441*9880d681SAndroid Build Coastguard Worker   //   exponent = 1..10
3442*9880d681SAndroid Build Coastguard Worker   //   significand = 1..1
3443*9880d681SAndroid Build Coastguard Worker   APFloat Val(Sem, uninitialized);
3444*9880d681SAndroid Build Coastguard Worker   Val.makeLargest(Negative);
3445*9880d681SAndroid Build Coastguard Worker   return Val;
3446*9880d681SAndroid Build Coastguard Worker }
3447*9880d681SAndroid Build Coastguard Worker 
getSmallest(const fltSemantics & Sem,bool Negative)3448*9880d681SAndroid Build Coastguard Worker APFloat APFloat::getSmallest(const fltSemantics &Sem, bool Negative) {
3449*9880d681SAndroid Build Coastguard Worker   // We want (in interchange format):
3450*9880d681SAndroid Build Coastguard Worker   //   sign = {Negative}
3451*9880d681SAndroid Build Coastguard Worker   //   exponent = 0..0
3452*9880d681SAndroid Build Coastguard Worker   //   significand = 0..01
3453*9880d681SAndroid Build Coastguard Worker   APFloat Val(Sem, uninitialized);
3454*9880d681SAndroid Build Coastguard Worker   Val.makeSmallest(Negative);
3455*9880d681SAndroid Build Coastguard Worker   return Val;
3456*9880d681SAndroid Build Coastguard Worker }
3457*9880d681SAndroid Build Coastguard Worker 
getSmallestNormalized(const fltSemantics & Sem,bool Negative)3458*9880d681SAndroid Build Coastguard Worker APFloat APFloat::getSmallestNormalized(const fltSemantics &Sem, bool Negative) {
3459*9880d681SAndroid Build Coastguard Worker   APFloat Val(Sem, uninitialized);
3460*9880d681SAndroid Build Coastguard Worker 
3461*9880d681SAndroid Build Coastguard Worker   // We want (in interchange format):
3462*9880d681SAndroid Build Coastguard Worker   //   sign = {Negative}
3463*9880d681SAndroid Build Coastguard Worker   //   exponent = 0..0
3464*9880d681SAndroid Build Coastguard Worker   //   significand = 10..0
3465*9880d681SAndroid Build Coastguard Worker 
3466*9880d681SAndroid Build Coastguard Worker   Val.category = fcNormal;
3467*9880d681SAndroid Build Coastguard Worker   Val.zeroSignificand();
3468*9880d681SAndroid Build Coastguard Worker   Val.sign = Negative;
3469*9880d681SAndroid Build Coastguard Worker   Val.exponent = Sem.minExponent;
3470*9880d681SAndroid Build Coastguard Worker   Val.significandParts()[partCountForBits(Sem.precision)-1] |=
3471*9880d681SAndroid Build Coastguard Worker     (((integerPart) 1) << ((Sem.precision - 1) % integerPartWidth));
3472*9880d681SAndroid Build Coastguard Worker 
3473*9880d681SAndroid Build Coastguard Worker   return Val;
3474*9880d681SAndroid Build Coastguard Worker }
3475*9880d681SAndroid Build Coastguard Worker 
APFloat(const fltSemantics & Sem,const APInt & API)3476*9880d681SAndroid Build Coastguard Worker APFloat::APFloat(const fltSemantics &Sem, const APInt &API) {
3477*9880d681SAndroid Build Coastguard Worker   initFromAPInt(&Sem, API);
3478*9880d681SAndroid Build Coastguard Worker }
3479*9880d681SAndroid Build Coastguard Worker 
APFloat(float f)3480*9880d681SAndroid Build Coastguard Worker APFloat::APFloat(float f) {
3481*9880d681SAndroid Build Coastguard Worker   initFromAPInt(&IEEEsingle, APInt::floatToBits(f));
3482*9880d681SAndroid Build Coastguard Worker }
3483*9880d681SAndroid Build Coastguard Worker 
APFloat(double d)3484*9880d681SAndroid Build Coastguard Worker APFloat::APFloat(double d) {
3485*9880d681SAndroid Build Coastguard Worker   initFromAPInt(&IEEEdouble, APInt::doubleToBits(d));
3486*9880d681SAndroid Build Coastguard Worker }
3487*9880d681SAndroid Build Coastguard Worker 
3488*9880d681SAndroid Build Coastguard Worker namespace {
append(SmallVectorImpl<char> & Buffer,StringRef Str)3489*9880d681SAndroid Build Coastguard Worker   void append(SmallVectorImpl<char> &Buffer, StringRef Str) {
3490*9880d681SAndroid Build Coastguard Worker     Buffer.append(Str.begin(), Str.end());
3491*9880d681SAndroid Build Coastguard Worker   }
3492*9880d681SAndroid Build Coastguard Worker 
3493*9880d681SAndroid Build Coastguard Worker   /// Removes data from the given significand until it is no more
3494*9880d681SAndroid Build Coastguard Worker   /// precise than is required for the desired precision.
AdjustToPrecision(APInt & significand,int & exp,unsigned FormatPrecision)3495*9880d681SAndroid Build Coastguard Worker   void AdjustToPrecision(APInt &significand,
3496*9880d681SAndroid Build Coastguard Worker                          int &exp, unsigned FormatPrecision) {
3497*9880d681SAndroid Build Coastguard Worker     unsigned bits = significand.getActiveBits();
3498*9880d681SAndroid Build Coastguard Worker 
3499*9880d681SAndroid Build Coastguard Worker     // 196/59 is a very slight overestimate of lg_2(10).
3500*9880d681SAndroid Build Coastguard Worker     unsigned bitsRequired = (FormatPrecision * 196 + 58) / 59;
3501*9880d681SAndroid Build Coastguard Worker 
3502*9880d681SAndroid Build Coastguard Worker     if (bits <= bitsRequired) return;
3503*9880d681SAndroid Build Coastguard Worker 
3504*9880d681SAndroid Build Coastguard Worker     unsigned tensRemovable = (bits - bitsRequired) * 59 / 196;
3505*9880d681SAndroid Build Coastguard Worker     if (!tensRemovable) return;
3506*9880d681SAndroid Build Coastguard Worker 
3507*9880d681SAndroid Build Coastguard Worker     exp += tensRemovable;
3508*9880d681SAndroid Build Coastguard Worker 
3509*9880d681SAndroid Build Coastguard Worker     APInt divisor(significand.getBitWidth(), 1);
3510*9880d681SAndroid Build Coastguard Worker     APInt powten(significand.getBitWidth(), 10);
3511*9880d681SAndroid Build Coastguard Worker     while (true) {
3512*9880d681SAndroid Build Coastguard Worker       if (tensRemovable & 1)
3513*9880d681SAndroid Build Coastguard Worker         divisor *= powten;
3514*9880d681SAndroid Build Coastguard Worker       tensRemovable >>= 1;
3515*9880d681SAndroid Build Coastguard Worker       if (!tensRemovable) break;
3516*9880d681SAndroid Build Coastguard Worker       powten *= powten;
3517*9880d681SAndroid Build Coastguard Worker     }
3518*9880d681SAndroid Build Coastguard Worker 
3519*9880d681SAndroid Build Coastguard Worker     significand = significand.udiv(divisor);
3520*9880d681SAndroid Build Coastguard Worker 
3521*9880d681SAndroid Build Coastguard Worker     // Truncate the significand down to its active bit count.
3522*9880d681SAndroid Build Coastguard Worker     significand = significand.trunc(significand.getActiveBits());
3523*9880d681SAndroid Build Coastguard Worker   }
3524*9880d681SAndroid Build Coastguard Worker 
3525*9880d681SAndroid Build Coastguard Worker 
AdjustToPrecision(SmallVectorImpl<char> & buffer,int & exp,unsigned FormatPrecision)3526*9880d681SAndroid Build Coastguard Worker   void AdjustToPrecision(SmallVectorImpl<char> &buffer,
3527*9880d681SAndroid Build Coastguard Worker                          int &exp, unsigned FormatPrecision) {
3528*9880d681SAndroid Build Coastguard Worker     unsigned N = buffer.size();
3529*9880d681SAndroid Build Coastguard Worker     if (N <= FormatPrecision) return;
3530*9880d681SAndroid Build Coastguard Worker 
3531*9880d681SAndroid Build Coastguard Worker     // The most significant figures are the last ones in the buffer.
3532*9880d681SAndroid Build Coastguard Worker     unsigned FirstSignificant = N - FormatPrecision;
3533*9880d681SAndroid Build Coastguard Worker 
3534*9880d681SAndroid Build Coastguard Worker     // Round.
3535*9880d681SAndroid Build Coastguard Worker     // FIXME: this probably shouldn't use 'round half up'.
3536*9880d681SAndroid Build Coastguard Worker 
3537*9880d681SAndroid Build Coastguard Worker     // Rounding down is just a truncation, except we also want to drop
3538*9880d681SAndroid Build Coastguard Worker     // trailing zeros from the new result.
3539*9880d681SAndroid Build Coastguard Worker     if (buffer[FirstSignificant - 1] < '5') {
3540*9880d681SAndroid Build Coastguard Worker       while (FirstSignificant < N && buffer[FirstSignificant] == '0')
3541*9880d681SAndroid Build Coastguard Worker         FirstSignificant++;
3542*9880d681SAndroid Build Coastguard Worker 
3543*9880d681SAndroid Build Coastguard Worker       exp += FirstSignificant;
3544*9880d681SAndroid Build Coastguard Worker       buffer.erase(&buffer[0], &buffer[FirstSignificant]);
3545*9880d681SAndroid Build Coastguard Worker       return;
3546*9880d681SAndroid Build Coastguard Worker     }
3547*9880d681SAndroid Build Coastguard Worker 
3548*9880d681SAndroid Build Coastguard Worker     // Rounding up requires a decimal add-with-carry.  If we continue
3549*9880d681SAndroid Build Coastguard Worker     // the carry, the newly-introduced zeros will just be truncated.
3550*9880d681SAndroid Build Coastguard Worker     for (unsigned I = FirstSignificant; I != N; ++I) {
3551*9880d681SAndroid Build Coastguard Worker       if (buffer[I] == '9') {
3552*9880d681SAndroid Build Coastguard Worker         FirstSignificant++;
3553*9880d681SAndroid Build Coastguard Worker       } else {
3554*9880d681SAndroid Build Coastguard Worker         buffer[I]++;
3555*9880d681SAndroid Build Coastguard Worker         break;
3556*9880d681SAndroid Build Coastguard Worker       }
3557*9880d681SAndroid Build Coastguard Worker     }
3558*9880d681SAndroid Build Coastguard Worker 
3559*9880d681SAndroid Build Coastguard Worker     // If we carried through, we have exactly one digit of precision.
3560*9880d681SAndroid Build Coastguard Worker     if (FirstSignificant == N) {
3561*9880d681SAndroid Build Coastguard Worker       exp += FirstSignificant;
3562*9880d681SAndroid Build Coastguard Worker       buffer.clear();
3563*9880d681SAndroid Build Coastguard Worker       buffer.push_back('1');
3564*9880d681SAndroid Build Coastguard Worker       return;
3565*9880d681SAndroid Build Coastguard Worker     }
3566*9880d681SAndroid Build Coastguard Worker 
3567*9880d681SAndroid Build Coastguard Worker     exp += FirstSignificant;
3568*9880d681SAndroid Build Coastguard Worker     buffer.erase(&buffer[0], &buffer[FirstSignificant]);
3569*9880d681SAndroid Build Coastguard Worker   }
3570*9880d681SAndroid Build Coastguard Worker }
3571*9880d681SAndroid Build Coastguard Worker 
toString(SmallVectorImpl<char> & Str,unsigned FormatPrecision,unsigned FormatMaxPadding) const3572*9880d681SAndroid Build Coastguard Worker void APFloat::toString(SmallVectorImpl<char> &Str,
3573*9880d681SAndroid Build Coastguard Worker                        unsigned FormatPrecision,
3574*9880d681SAndroid Build Coastguard Worker                        unsigned FormatMaxPadding) const {
3575*9880d681SAndroid Build Coastguard Worker   switch (category) {
3576*9880d681SAndroid Build Coastguard Worker   case fcInfinity:
3577*9880d681SAndroid Build Coastguard Worker     if (isNegative())
3578*9880d681SAndroid Build Coastguard Worker       return append(Str, "-Inf");
3579*9880d681SAndroid Build Coastguard Worker     else
3580*9880d681SAndroid Build Coastguard Worker       return append(Str, "+Inf");
3581*9880d681SAndroid Build Coastguard Worker 
3582*9880d681SAndroid Build Coastguard Worker   case fcNaN: return append(Str, "NaN");
3583*9880d681SAndroid Build Coastguard Worker 
3584*9880d681SAndroid Build Coastguard Worker   case fcZero:
3585*9880d681SAndroid Build Coastguard Worker     if (isNegative())
3586*9880d681SAndroid Build Coastguard Worker       Str.push_back('-');
3587*9880d681SAndroid Build Coastguard Worker 
3588*9880d681SAndroid Build Coastguard Worker     if (!FormatMaxPadding)
3589*9880d681SAndroid Build Coastguard Worker       append(Str, "0.0E+0");
3590*9880d681SAndroid Build Coastguard Worker     else
3591*9880d681SAndroid Build Coastguard Worker       Str.push_back('0');
3592*9880d681SAndroid Build Coastguard Worker     return;
3593*9880d681SAndroid Build Coastguard Worker 
3594*9880d681SAndroid Build Coastguard Worker   case fcNormal:
3595*9880d681SAndroid Build Coastguard Worker     break;
3596*9880d681SAndroid Build Coastguard Worker   }
3597*9880d681SAndroid Build Coastguard Worker 
3598*9880d681SAndroid Build Coastguard Worker   if (isNegative())
3599*9880d681SAndroid Build Coastguard Worker     Str.push_back('-');
3600*9880d681SAndroid Build Coastguard Worker 
3601*9880d681SAndroid Build Coastguard Worker   // Decompose the number into an APInt and an exponent.
3602*9880d681SAndroid Build Coastguard Worker   int exp = exponent - ((int) semantics->precision - 1);
3603*9880d681SAndroid Build Coastguard Worker   APInt significand(semantics->precision,
3604*9880d681SAndroid Build Coastguard Worker                     makeArrayRef(significandParts(),
3605*9880d681SAndroid Build Coastguard Worker                                  partCountForBits(semantics->precision)));
3606*9880d681SAndroid Build Coastguard Worker 
3607*9880d681SAndroid Build Coastguard Worker   // Set FormatPrecision if zero.  We want to do this before we
3608*9880d681SAndroid Build Coastguard Worker   // truncate trailing zeros, as those are part of the precision.
3609*9880d681SAndroid Build Coastguard Worker   if (!FormatPrecision) {
3610*9880d681SAndroid Build Coastguard Worker     // We use enough digits so the number can be round-tripped back to an
3611*9880d681SAndroid Build Coastguard Worker     // APFloat. The formula comes from "How to Print Floating-Point Numbers
3612*9880d681SAndroid Build Coastguard Worker     // Accurately" by Steele and White.
3613*9880d681SAndroid Build Coastguard Worker     // FIXME: Using a formula based purely on the precision is conservative;
3614*9880d681SAndroid Build Coastguard Worker     // we can print fewer digits depending on the actual value being printed.
3615*9880d681SAndroid Build Coastguard Worker 
3616*9880d681SAndroid Build Coastguard Worker     // FormatPrecision = 2 + floor(significandBits / lg_2(10))
3617*9880d681SAndroid Build Coastguard Worker     FormatPrecision = 2 + semantics->precision * 59 / 196;
3618*9880d681SAndroid Build Coastguard Worker   }
3619*9880d681SAndroid Build Coastguard Worker 
3620*9880d681SAndroid Build Coastguard Worker   // Ignore trailing binary zeros.
3621*9880d681SAndroid Build Coastguard Worker   int trailingZeros = significand.countTrailingZeros();
3622*9880d681SAndroid Build Coastguard Worker   exp += trailingZeros;
3623*9880d681SAndroid Build Coastguard Worker   significand = significand.lshr(trailingZeros);
3624*9880d681SAndroid Build Coastguard Worker 
3625*9880d681SAndroid Build Coastguard Worker   // Change the exponent from 2^e to 10^e.
3626*9880d681SAndroid Build Coastguard Worker   if (exp == 0) {
3627*9880d681SAndroid Build Coastguard Worker     // Nothing to do.
3628*9880d681SAndroid Build Coastguard Worker   } else if (exp > 0) {
3629*9880d681SAndroid Build Coastguard Worker     // Just shift left.
3630*9880d681SAndroid Build Coastguard Worker     significand = significand.zext(semantics->precision + exp);
3631*9880d681SAndroid Build Coastguard Worker     significand <<= exp;
3632*9880d681SAndroid Build Coastguard Worker     exp = 0;
3633*9880d681SAndroid Build Coastguard Worker   } else { /* exp < 0 */
3634*9880d681SAndroid Build Coastguard Worker     int texp = -exp;
3635*9880d681SAndroid Build Coastguard Worker 
3636*9880d681SAndroid Build Coastguard Worker     // We transform this using the identity:
3637*9880d681SAndroid Build Coastguard Worker     //   (N)(2^-e) == (N)(5^e)(10^-e)
3638*9880d681SAndroid Build Coastguard Worker     // This means we have to multiply N (the significand) by 5^e.
3639*9880d681SAndroid Build Coastguard Worker     // To avoid overflow, we have to operate on numbers large
3640*9880d681SAndroid Build Coastguard Worker     // enough to store N * 5^e:
3641*9880d681SAndroid Build Coastguard Worker     //   log2(N * 5^e) == log2(N) + e * log2(5)
3642*9880d681SAndroid Build Coastguard Worker     //                 <= semantics->precision + e * 137 / 59
3643*9880d681SAndroid Build Coastguard Worker     //   (log_2(5) ~ 2.321928 < 2.322034 ~ 137/59)
3644*9880d681SAndroid Build Coastguard Worker 
3645*9880d681SAndroid Build Coastguard Worker     unsigned precision = semantics->precision + (137 * texp + 136) / 59;
3646*9880d681SAndroid Build Coastguard Worker 
3647*9880d681SAndroid Build Coastguard Worker     // Multiply significand by 5^e.
3648*9880d681SAndroid Build Coastguard Worker     //   N * 5^0101 == N * 5^(1*1) * 5^(0*2) * 5^(1*4) * 5^(0*8)
3649*9880d681SAndroid Build Coastguard Worker     significand = significand.zext(precision);
3650*9880d681SAndroid Build Coastguard Worker     APInt five_to_the_i(precision, 5);
3651*9880d681SAndroid Build Coastguard Worker     while (true) {
3652*9880d681SAndroid Build Coastguard Worker       if (texp & 1) significand *= five_to_the_i;
3653*9880d681SAndroid Build Coastguard Worker 
3654*9880d681SAndroid Build Coastguard Worker       texp >>= 1;
3655*9880d681SAndroid Build Coastguard Worker       if (!texp) break;
3656*9880d681SAndroid Build Coastguard Worker       five_to_the_i *= five_to_the_i;
3657*9880d681SAndroid Build Coastguard Worker     }
3658*9880d681SAndroid Build Coastguard Worker   }
3659*9880d681SAndroid Build Coastguard Worker 
3660*9880d681SAndroid Build Coastguard Worker   AdjustToPrecision(significand, exp, FormatPrecision);
3661*9880d681SAndroid Build Coastguard Worker 
3662*9880d681SAndroid Build Coastguard Worker   SmallVector<char, 256> buffer;
3663*9880d681SAndroid Build Coastguard Worker 
3664*9880d681SAndroid Build Coastguard Worker   // Fill the buffer.
3665*9880d681SAndroid Build Coastguard Worker   unsigned precision = significand.getBitWidth();
3666*9880d681SAndroid Build Coastguard Worker   APInt ten(precision, 10);
3667*9880d681SAndroid Build Coastguard Worker   APInt digit(precision, 0);
3668*9880d681SAndroid Build Coastguard Worker 
3669*9880d681SAndroid Build Coastguard Worker   bool inTrail = true;
3670*9880d681SAndroid Build Coastguard Worker   while (significand != 0) {
3671*9880d681SAndroid Build Coastguard Worker     // digit <- significand % 10
3672*9880d681SAndroid Build Coastguard Worker     // significand <- significand / 10
3673*9880d681SAndroid Build Coastguard Worker     APInt::udivrem(significand, ten, significand, digit);
3674*9880d681SAndroid Build Coastguard Worker 
3675*9880d681SAndroid Build Coastguard Worker     unsigned d = digit.getZExtValue();
3676*9880d681SAndroid Build Coastguard Worker 
3677*9880d681SAndroid Build Coastguard Worker     // Drop trailing zeros.
3678*9880d681SAndroid Build Coastguard Worker     if (inTrail && !d) exp++;
3679*9880d681SAndroid Build Coastguard Worker     else {
3680*9880d681SAndroid Build Coastguard Worker       buffer.push_back((char) ('0' + d));
3681*9880d681SAndroid Build Coastguard Worker       inTrail = false;
3682*9880d681SAndroid Build Coastguard Worker     }
3683*9880d681SAndroid Build Coastguard Worker   }
3684*9880d681SAndroid Build Coastguard Worker 
3685*9880d681SAndroid Build Coastguard Worker   assert(!buffer.empty() && "no characters in buffer!");
3686*9880d681SAndroid Build Coastguard Worker 
3687*9880d681SAndroid Build Coastguard Worker   // Drop down to FormatPrecision.
3688*9880d681SAndroid Build Coastguard Worker   // TODO: don't do more precise calculations above than are required.
3689*9880d681SAndroid Build Coastguard Worker   AdjustToPrecision(buffer, exp, FormatPrecision);
3690*9880d681SAndroid Build Coastguard Worker 
3691*9880d681SAndroid Build Coastguard Worker   unsigned NDigits = buffer.size();
3692*9880d681SAndroid Build Coastguard Worker 
3693*9880d681SAndroid Build Coastguard Worker   // Check whether we should use scientific notation.
3694*9880d681SAndroid Build Coastguard Worker   bool FormatScientific;
3695*9880d681SAndroid Build Coastguard Worker   if (!FormatMaxPadding)
3696*9880d681SAndroid Build Coastguard Worker     FormatScientific = true;
3697*9880d681SAndroid Build Coastguard Worker   else {
3698*9880d681SAndroid Build Coastguard Worker     if (exp >= 0) {
3699*9880d681SAndroid Build Coastguard Worker       // 765e3 --> 765000
3700*9880d681SAndroid Build Coastguard Worker       //              ^^^
3701*9880d681SAndroid Build Coastguard Worker       // But we shouldn't make the number look more precise than it is.
3702*9880d681SAndroid Build Coastguard Worker       FormatScientific = ((unsigned) exp > FormatMaxPadding ||
3703*9880d681SAndroid Build Coastguard Worker                           NDigits + (unsigned) exp > FormatPrecision);
3704*9880d681SAndroid Build Coastguard Worker     } else {
3705*9880d681SAndroid Build Coastguard Worker       // Power of the most significant digit.
3706*9880d681SAndroid Build Coastguard Worker       int MSD = exp + (int) (NDigits - 1);
3707*9880d681SAndroid Build Coastguard Worker       if (MSD >= 0) {
3708*9880d681SAndroid Build Coastguard Worker         // 765e-2 == 7.65
3709*9880d681SAndroid Build Coastguard Worker         FormatScientific = false;
3710*9880d681SAndroid Build Coastguard Worker       } else {
3711*9880d681SAndroid Build Coastguard Worker         // 765e-5 == 0.00765
3712*9880d681SAndroid Build Coastguard Worker         //           ^ ^^
3713*9880d681SAndroid Build Coastguard Worker         FormatScientific = ((unsigned) -MSD) > FormatMaxPadding;
3714*9880d681SAndroid Build Coastguard Worker       }
3715*9880d681SAndroid Build Coastguard Worker     }
3716*9880d681SAndroid Build Coastguard Worker   }
3717*9880d681SAndroid Build Coastguard Worker 
3718*9880d681SAndroid Build Coastguard Worker   // Scientific formatting is pretty straightforward.
3719*9880d681SAndroid Build Coastguard Worker   if (FormatScientific) {
3720*9880d681SAndroid Build Coastguard Worker     exp += (NDigits - 1);
3721*9880d681SAndroid Build Coastguard Worker 
3722*9880d681SAndroid Build Coastguard Worker     Str.push_back(buffer[NDigits-1]);
3723*9880d681SAndroid Build Coastguard Worker     Str.push_back('.');
3724*9880d681SAndroid Build Coastguard Worker     if (NDigits == 1)
3725*9880d681SAndroid Build Coastguard Worker       Str.push_back('0');
3726*9880d681SAndroid Build Coastguard Worker     else
3727*9880d681SAndroid Build Coastguard Worker       for (unsigned I = 1; I != NDigits; ++I)
3728*9880d681SAndroid Build Coastguard Worker         Str.push_back(buffer[NDigits-1-I]);
3729*9880d681SAndroid Build Coastguard Worker     Str.push_back('E');
3730*9880d681SAndroid Build Coastguard Worker 
3731*9880d681SAndroid Build Coastguard Worker     Str.push_back(exp >= 0 ? '+' : '-');
3732*9880d681SAndroid Build Coastguard Worker     if (exp < 0) exp = -exp;
3733*9880d681SAndroid Build Coastguard Worker     SmallVector<char, 6> expbuf;
3734*9880d681SAndroid Build Coastguard Worker     do {
3735*9880d681SAndroid Build Coastguard Worker       expbuf.push_back((char) ('0' + (exp % 10)));
3736*9880d681SAndroid Build Coastguard Worker       exp /= 10;
3737*9880d681SAndroid Build Coastguard Worker     } while (exp);
3738*9880d681SAndroid Build Coastguard Worker     for (unsigned I = 0, E = expbuf.size(); I != E; ++I)
3739*9880d681SAndroid Build Coastguard Worker       Str.push_back(expbuf[E-1-I]);
3740*9880d681SAndroid Build Coastguard Worker     return;
3741*9880d681SAndroid Build Coastguard Worker   }
3742*9880d681SAndroid Build Coastguard Worker 
3743*9880d681SAndroid Build Coastguard Worker   // Non-scientific, positive exponents.
3744*9880d681SAndroid Build Coastguard Worker   if (exp >= 0) {
3745*9880d681SAndroid Build Coastguard Worker     for (unsigned I = 0; I != NDigits; ++I)
3746*9880d681SAndroid Build Coastguard Worker       Str.push_back(buffer[NDigits-1-I]);
3747*9880d681SAndroid Build Coastguard Worker     for (unsigned I = 0; I != (unsigned) exp; ++I)
3748*9880d681SAndroid Build Coastguard Worker       Str.push_back('0');
3749*9880d681SAndroid Build Coastguard Worker     return;
3750*9880d681SAndroid Build Coastguard Worker   }
3751*9880d681SAndroid Build Coastguard Worker 
3752*9880d681SAndroid Build Coastguard Worker   // Non-scientific, negative exponents.
3753*9880d681SAndroid Build Coastguard Worker 
3754*9880d681SAndroid Build Coastguard Worker   // The number of digits to the left of the decimal point.
3755*9880d681SAndroid Build Coastguard Worker   int NWholeDigits = exp + (int) NDigits;
3756*9880d681SAndroid Build Coastguard Worker 
3757*9880d681SAndroid Build Coastguard Worker   unsigned I = 0;
3758*9880d681SAndroid Build Coastguard Worker   if (NWholeDigits > 0) {
3759*9880d681SAndroid Build Coastguard Worker     for (; I != (unsigned) NWholeDigits; ++I)
3760*9880d681SAndroid Build Coastguard Worker       Str.push_back(buffer[NDigits-I-1]);
3761*9880d681SAndroid Build Coastguard Worker     Str.push_back('.');
3762*9880d681SAndroid Build Coastguard Worker   } else {
3763*9880d681SAndroid Build Coastguard Worker     unsigned NZeros = 1 + (unsigned) -NWholeDigits;
3764*9880d681SAndroid Build Coastguard Worker 
3765*9880d681SAndroid Build Coastguard Worker     Str.push_back('0');
3766*9880d681SAndroid Build Coastguard Worker     Str.push_back('.');
3767*9880d681SAndroid Build Coastguard Worker     for (unsigned Z = 1; Z != NZeros; ++Z)
3768*9880d681SAndroid Build Coastguard Worker       Str.push_back('0');
3769*9880d681SAndroid Build Coastguard Worker   }
3770*9880d681SAndroid Build Coastguard Worker 
3771*9880d681SAndroid Build Coastguard Worker   for (; I != NDigits; ++I)
3772*9880d681SAndroid Build Coastguard Worker     Str.push_back(buffer[NDigits-I-1]);
3773*9880d681SAndroid Build Coastguard Worker }
3774*9880d681SAndroid Build Coastguard Worker 
getExactInverse(APFloat * inv) const3775*9880d681SAndroid Build Coastguard Worker bool APFloat::getExactInverse(APFloat *inv) const {
3776*9880d681SAndroid Build Coastguard Worker   // Special floats and denormals have no exact inverse.
3777*9880d681SAndroid Build Coastguard Worker   if (!isFiniteNonZero())
3778*9880d681SAndroid Build Coastguard Worker     return false;
3779*9880d681SAndroid Build Coastguard Worker 
3780*9880d681SAndroid Build Coastguard Worker   // Check that the number is a power of two by making sure that only the
3781*9880d681SAndroid Build Coastguard Worker   // integer bit is set in the significand.
3782*9880d681SAndroid Build Coastguard Worker   if (significandLSB() != semantics->precision - 1)
3783*9880d681SAndroid Build Coastguard Worker     return false;
3784*9880d681SAndroid Build Coastguard Worker 
3785*9880d681SAndroid Build Coastguard Worker   // Get the inverse.
3786*9880d681SAndroid Build Coastguard Worker   APFloat reciprocal(*semantics, 1ULL);
3787*9880d681SAndroid Build Coastguard Worker   if (reciprocal.divide(*this, rmNearestTiesToEven) != opOK)
3788*9880d681SAndroid Build Coastguard Worker     return false;
3789*9880d681SAndroid Build Coastguard Worker 
3790*9880d681SAndroid Build Coastguard Worker   // Avoid multiplication with a denormal, it is not safe on all platforms and
3791*9880d681SAndroid Build Coastguard Worker   // may be slower than a normal division.
3792*9880d681SAndroid Build Coastguard Worker   if (reciprocal.isDenormal())
3793*9880d681SAndroid Build Coastguard Worker     return false;
3794*9880d681SAndroid Build Coastguard Worker 
3795*9880d681SAndroid Build Coastguard Worker   assert(reciprocal.isFiniteNonZero() &&
3796*9880d681SAndroid Build Coastguard Worker          reciprocal.significandLSB() == reciprocal.semantics->precision - 1);
3797*9880d681SAndroid Build Coastguard Worker 
3798*9880d681SAndroid Build Coastguard Worker   if (inv)
3799*9880d681SAndroid Build Coastguard Worker     *inv = reciprocal;
3800*9880d681SAndroid Build Coastguard Worker 
3801*9880d681SAndroid Build Coastguard Worker   return true;
3802*9880d681SAndroid Build Coastguard Worker }
3803*9880d681SAndroid Build Coastguard Worker 
isSignaling() const3804*9880d681SAndroid Build Coastguard Worker bool APFloat::isSignaling() const {
3805*9880d681SAndroid Build Coastguard Worker   if (!isNaN())
3806*9880d681SAndroid Build Coastguard Worker     return false;
3807*9880d681SAndroid Build Coastguard Worker 
3808*9880d681SAndroid Build Coastguard Worker   // IEEE-754R 2008 6.2.1: A signaling NaN bit string should be encoded with the
3809*9880d681SAndroid Build Coastguard Worker   // first bit of the trailing significand being 0.
3810*9880d681SAndroid Build Coastguard Worker   return !APInt::tcExtractBit(significandParts(), semantics->precision - 2);
3811*9880d681SAndroid Build Coastguard Worker }
3812*9880d681SAndroid Build Coastguard Worker 
3813*9880d681SAndroid Build Coastguard Worker /// IEEE-754R 2008 5.3.1: nextUp/nextDown.
3814*9880d681SAndroid Build Coastguard Worker ///
3815*9880d681SAndroid Build Coastguard Worker /// *NOTE* since nextDown(x) = -nextUp(-x), we only implement nextUp with
3816*9880d681SAndroid Build Coastguard Worker /// appropriate sign switching before/after the computation.
next(bool nextDown)3817*9880d681SAndroid Build Coastguard Worker APFloat::opStatus APFloat::next(bool nextDown) {
3818*9880d681SAndroid Build Coastguard Worker   // If we are performing nextDown, swap sign so we have -x.
3819*9880d681SAndroid Build Coastguard Worker   if (nextDown)
3820*9880d681SAndroid Build Coastguard Worker     changeSign();
3821*9880d681SAndroid Build Coastguard Worker 
3822*9880d681SAndroid Build Coastguard Worker   // Compute nextUp(x)
3823*9880d681SAndroid Build Coastguard Worker   opStatus result = opOK;
3824*9880d681SAndroid Build Coastguard Worker 
3825*9880d681SAndroid Build Coastguard Worker   // Handle each float category separately.
3826*9880d681SAndroid Build Coastguard Worker   switch (category) {
3827*9880d681SAndroid Build Coastguard Worker   case fcInfinity:
3828*9880d681SAndroid Build Coastguard Worker     // nextUp(+inf) = +inf
3829*9880d681SAndroid Build Coastguard Worker     if (!isNegative())
3830*9880d681SAndroid Build Coastguard Worker       break;
3831*9880d681SAndroid Build Coastguard Worker     // nextUp(-inf) = -getLargest()
3832*9880d681SAndroid Build Coastguard Worker     makeLargest(true);
3833*9880d681SAndroid Build Coastguard Worker     break;
3834*9880d681SAndroid Build Coastguard Worker   case fcNaN:
3835*9880d681SAndroid Build Coastguard Worker     // IEEE-754R 2008 6.2 Par 2: nextUp(sNaN) = qNaN. Set Invalid flag.
3836*9880d681SAndroid Build Coastguard Worker     // IEEE-754R 2008 6.2: nextUp(qNaN) = qNaN. Must be identity so we do not
3837*9880d681SAndroid Build Coastguard Worker     //                     change the payload.
3838*9880d681SAndroid Build Coastguard Worker     if (isSignaling()) {
3839*9880d681SAndroid Build Coastguard Worker       result = opInvalidOp;
3840*9880d681SAndroid Build Coastguard Worker       // For consistency, propagate the sign of the sNaN to the qNaN.
3841*9880d681SAndroid Build Coastguard Worker       makeNaN(false, isNegative(), nullptr);
3842*9880d681SAndroid Build Coastguard Worker     }
3843*9880d681SAndroid Build Coastguard Worker     break;
3844*9880d681SAndroid Build Coastguard Worker   case fcZero:
3845*9880d681SAndroid Build Coastguard Worker     // nextUp(pm 0) = +getSmallest()
3846*9880d681SAndroid Build Coastguard Worker     makeSmallest(false);
3847*9880d681SAndroid Build Coastguard Worker     break;
3848*9880d681SAndroid Build Coastguard Worker   case fcNormal:
3849*9880d681SAndroid Build Coastguard Worker     // nextUp(-getSmallest()) = -0
3850*9880d681SAndroid Build Coastguard Worker     if (isSmallest() && isNegative()) {
3851*9880d681SAndroid Build Coastguard Worker       APInt::tcSet(significandParts(), 0, partCount());
3852*9880d681SAndroid Build Coastguard Worker       category = fcZero;
3853*9880d681SAndroid Build Coastguard Worker       exponent = 0;
3854*9880d681SAndroid Build Coastguard Worker       break;
3855*9880d681SAndroid Build Coastguard Worker     }
3856*9880d681SAndroid Build Coastguard Worker 
3857*9880d681SAndroid Build Coastguard Worker     // nextUp(getLargest()) == INFINITY
3858*9880d681SAndroid Build Coastguard Worker     if (isLargest() && !isNegative()) {
3859*9880d681SAndroid Build Coastguard Worker       APInt::tcSet(significandParts(), 0, partCount());
3860*9880d681SAndroid Build Coastguard Worker       category = fcInfinity;
3861*9880d681SAndroid Build Coastguard Worker       exponent = semantics->maxExponent + 1;
3862*9880d681SAndroid Build Coastguard Worker       break;
3863*9880d681SAndroid Build Coastguard Worker     }
3864*9880d681SAndroid Build Coastguard Worker 
3865*9880d681SAndroid Build Coastguard Worker     // nextUp(normal) == normal + inc.
3866*9880d681SAndroid Build Coastguard Worker     if (isNegative()) {
3867*9880d681SAndroid Build Coastguard Worker       // If we are negative, we need to decrement the significand.
3868*9880d681SAndroid Build Coastguard Worker 
3869*9880d681SAndroid Build Coastguard Worker       // We only cross a binade boundary that requires adjusting the exponent
3870*9880d681SAndroid Build Coastguard Worker       // if:
3871*9880d681SAndroid Build Coastguard Worker       //   1. exponent != semantics->minExponent. This implies we are not in the
3872*9880d681SAndroid Build Coastguard Worker       //   smallest binade or are dealing with denormals.
3873*9880d681SAndroid Build Coastguard Worker       //   2. Our significand excluding the integral bit is all zeros.
3874*9880d681SAndroid Build Coastguard Worker       bool WillCrossBinadeBoundary =
3875*9880d681SAndroid Build Coastguard Worker         exponent != semantics->minExponent && isSignificandAllZeros();
3876*9880d681SAndroid Build Coastguard Worker 
3877*9880d681SAndroid Build Coastguard Worker       // Decrement the significand.
3878*9880d681SAndroid Build Coastguard Worker       //
3879*9880d681SAndroid Build Coastguard Worker       // We always do this since:
3880*9880d681SAndroid Build Coastguard Worker       //   1. If we are dealing with a non-binade decrement, by definition we
3881*9880d681SAndroid Build Coastguard Worker       //   just decrement the significand.
3882*9880d681SAndroid Build Coastguard Worker       //   2. If we are dealing with a normal -> normal binade decrement, since
3883*9880d681SAndroid Build Coastguard Worker       //   we have an explicit integral bit the fact that all bits but the
3884*9880d681SAndroid Build Coastguard Worker       //   integral bit are zero implies that subtracting one will yield a
3885*9880d681SAndroid Build Coastguard Worker       //   significand with 0 integral bit and 1 in all other spots. Thus we
3886*9880d681SAndroid Build Coastguard Worker       //   must just adjust the exponent and set the integral bit to 1.
3887*9880d681SAndroid Build Coastguard Worker       //   3. If we are dealing with a normal -> denormal binade decrement,
3888*9880d681SAndroid Build Coastguard Worker       //   since we set the integral bit to 0 when we represent denormals, we
3889*9880d681SAndroid Build Coastguard Worker       //   just decrement the significand.
3890*9880d681SAndroid Build Coastguard Worker       integerPart *Parts = significandParts();
3891*9880d681SAndroid Build Coastguard Worker       APInt::tcDecrement(Parts, partCount());
3892*9880d681SAndroid Build Coastguard Worker 
3893*9880d681SAndroid Build Coastguard Worker       if (WillCrossBinadeBoundary) {
3894*9880d681SAndroid Build Coastguard Worker         // Our result is a normal number. Do the following:
3895*9880d681SAndroid Build Coastguard Worker         // 1. Set the integral bit to 1.
3896*9880d681SAndroid Build Coastguard Worker         // 2. Decrement the exponent.
3897*9880d681SAndroid Build Coastguard Worker         APInt::tcSetBit(Parts, semantics->precision - 1);
3898*9880d681SAndroid Build Coastguard Worker         exponent--;
3899*9880d681SAndroid Build Coastguard Worker       }
3900*9880d681SAndroid Build Coastguard Worker     } else {
3901*9880d681SAndroid Build Coastguard Worker       // If we are positive, we need to increment the significand.
3902*9880d681SAndroid Build Coastguard Worker 
3903*9880d681SAndroid Build Coastguard Worker       // We only cross a binade boundary that requires adjusting the exponent if
3904*9880d681SAndroid Build Coastguard Worker       // the input is not a denormal and all of said input's significand bits
3905*9880d681SAndroid Build Coastguard Worker       // are set. If all of said conditions are true: clear the significand, set
3906*9880d681SAndroid Build Coastguard Worker       // the integral bit to 1, and increment the exponent. If we have a
3907*9880d681SAndroid Build Coastguard Worker       // denormal always increment since moving denormals and the numbers in the
3908*9880d681SAndroid Build Coastguard Worker       // smallest normal binade have the same exponent in our representation.
3909*9880d681SAndroid Build Coastguard Worker       bool WillCrossBinadeBoundary = !isDenormal() && isSignificandAllOnes();
3910*9880d681SAndroid Build Coastguard Worker 
3911*9880d681SAndroid Build Coastguard Worker       if (WillCrossBinadeBoundary) {
3912*9880d681SAndroid Build Coastguard Worker         integerPart *Parts = significandParts();
3913*9880d681SAndroid Build Coastguard Worker         APInt::tcSet(Parts, 0, partCount());
3914*9880d681SAndroid Build Coastguard Worker         APInt::tcSetBit(Parts, semantics->precision - 1);
3915*9880d681SAndroid Build Coastguard Worker         assert(exponent != semantics->maxExponent &&
3916*9880d681SAndroid Build Coastguard Worker                "We can not increment an exponent beyond the maxExponent allowed"
3917*9880d681SAndroid Build Coastguard Worker                " by the given floating point semantics.");
3918*9880d681SAndroid Build Coastguard Worker         exponent++;
3919*9880d681SAndroid Build Coastguard Worker       } else {
3920*9880d681SAndroid Build Coastguard Worker         incrementSignificand();
3921*9880d681SAndroid Build Coastguard Worker       }
3922*9880d681SAndroid Build Coastguard Worker     }
3923*9880d681SAndroid Build Coastguard Worker     break;
3924*9880d681SAndroid Build Coastguard Worker   }
3925*9880d681SAndroid Build Coastguard Worker 
3926*9880d681SAndroid Build Coastguard Worker   // If we are performing nextDown, swap sign so we have -nextUp(-x)
3927*9880d681SAndroid Build Coastguard Worker   if (nextDown)
3928*9880d681SAndroid Build Coastguard Worker     changeSign();
3929*9880d681SAndroid Build Coastguard Worker 
3930*9880d681SAndroid Build Coastguard Worker   return result;
3931*9880d681SAndroid Build Coastguard Worker }
3932*9880d681SAndroid Build Coastguard Worker 
3933*9880d681SAndroid Build Coastguard Worker void
makeInf(bool Negative)3934*9880d681SAndroid Build Coastguard Worker APFloat::makeInf(bool Negative) {
3935*9880d681SAndroid Build Coastguard Worker   category = fcInfinity;
3936*9880d681SAndroid Build Coastguard Worker   sign = Negative;
3937*9880d681SAndroid Build Coastguard Worker   exponent = semantics->maxExponent + 1;
3938*9880d681SAndroid Build Coastguard Worker   APInt::tcSet(significandParts(), 0, partCount());
3939*9880d681SAndroid Build Coastguard Worker }
3940*9880d681SAndroid Build Coastguard Worker 
3941*9880d681SAndroid Build Coastguard Worker void
makeZero(bool Negative)3942*9880d681SAndroid Build Coastguard Worker APFloat::makeZero(bool Negative) {
3943*9880d681SAndroid Build Coastguard Worker   category = fcZero;
3944*9880d681SAndroid Build Coastguard Worker   sign = Negative;
3945*9880d681SAndroid Build Coastguard Worker   exponent = semantics->minExponent-1;
3946*9880d681SAndroid Build Coastguard Worker   APInt::tcSet(significandParts(), 0, partCount());
3947*9880d681SAndroid Build Coastguard Worker }
3948*9880d681SAndroid Build Coastguard Worker 
makeQuiet()3949*9880d681SAndroid Build Coastguard Worker void APFloat::makeQuiet() {
3950*9880d681SAndroid Build Coastguard Worker   assert(isNaN());
3951*9880d681SAndroid Build Coastguard Worker   APInt::tcSetBit(significandParts(), semantics->precision - 2);
3952*9880d681SAndroid Build Coastguard Worker }
3953*9880d681SAndroid Build Coastguard Worker 
ilogb(const APFloat & Arg)3954*9880d681SAndroid Build Coastguard Worker int llvm::ilogb(const APFloat &Arg) {
3955*9880d681SAndroid Build Coastguard Worker   if (Arg.isNaN())
3956*9880d681SAndroid Build Coastguard Worker     return APFloat::IEK_NaN;
3957*9880d681SAndroid Build Coastguard Worker   if (Arg.isZero())
3958*9880d681SAndroid Build Coastguard Worker     return APFloat::IEK_Zero;
3959*9880d681SAndroid Build Coastguard Worker   if (Arg.isInfinity())
3960*9880d681SAndroid Build Coastguard Worker     return APFloat::IEK_Inf;
3961*9880d681SAndroid Build Coastguard Worker   if (!Arg.isDenormal())
3962*9880d681SAndroid Build Coastguard Worker     return Arg.exponent;
3963*9880d681SAndroid Build Coastguard Worker 
3964*9880d681SAndroid Build Coastguard Worker   APFloat Normalized(Arg);
3965*9880d681SAndroid Build Coastguard Worker   int SignificandBits = Arg.getSemantics().precision - 1;
3966*9880d681SAndroid Build Coastguard Worker 
3967*9880d681SAndroid Build Coastguard Worker   Normalized.exponent += SignificandBits;
3968*9880d681SAndroid Build Coastguard Worker   Normalized.normalize(APFloat::rmNearestTiesToEven, lfExactlyZero);
3969*9880d681SAndroid Build Coastguard Worker   return Normalized.exponent - SignificandBits;
3970*9880d681SAndroid Build Coastguard Worker }
3971*9880d681SAndroid Build Coastguard Worker 
scalbn(APFloat X,int Exp,APFloat::roundingMode RoundingMode)3972*9880d681SAndroid Build Coastguard Worker APFloat llvm::scalbn(APFloat X, int Exp, APFloat::roundingMode RoundingMode) {
3973*9880d681SAndroid Build Coastguard Worker   auto MaxExp = X.getSemantics().maxExponent;
3974*9880d681SAndroid Build Coastguard Worker   auto MinExp = X.getSemantics().minExponent;
3975*9880d681SAndroid Build Coastguard Worker 
3976*9880d681SAndroid Build Coastguard Worker   // If Exp is wildly out-of-scale, simply adding it to X.exponent will
3977*9880d681SAndroid Build Coastguard Worker   // overflow; clamp it to a safe range before adding, but ensure that the range
3978*9880d681SAndroid Build Coastguard Worker   // is large enough that the clamp does not change the result. The range we
3979*9880d681SAndroid Build Coastguard Worker   // need to support is the difference between the largest possible exponent and
3980*9880d681SAndroid Build Coastguard Worker   // the normalized exponent of half the smallest denormal.
3981*9880d681SAndroid Build Coastguard Worker 
3982*9880d681SAndroid Build Coastguard Worker   int SignificandBits = X.getSemantics().precision - 1;
3983*9880d681SAndroid Build Coastguard Worker   int MaxIncrement = MaxExp - (MinExp - SignificandBits) + 1;
3984*9880d681SAndroid Build Coastguard Worker 
3985*9880d681SAndroid Build Coastguard Worker   // Clamp to one past the range ends to let normalize handle overlflow.
3986*9880d681SAndroid Build Coastguard Worker   X.exponent += std::min(std::max(Exp, -MaxIncrement - 1), MaxIncrement);
3987*9880d681SAndroid Build Coastguard Worker   X.normalize(RoundingMode, lfExactlyZero);
3988*9880d681SAndroid Build Coastguard Worker   if (X.isNaN())
3989*9880d681SAndroid Build Coastguard Worker     X.makeQuiet();
3990*9880d681SAndroid Build Coastguard Worker   return X;
3991*9880d681SAndroid Build Coastguard Worker }
3992*9880d681SAndroid Build Coastguard Worker 
frexp(const APFloat & Val,int & Exp,APFloat::roundingMode RM)3993*9880d681SAndroid Build Coastguard Worker APFloat llvm::frexp(const APFloat &Val, int &Exp, APFloat::roundingMode RM) {
3994*9880d681SAndroid Build Coastguard Worker   Exp = ilogb(Val);
3995*9880d681SAndroid Build Coastguard Worker 
3996*9880d681SAndroid Build Coastguard Worker   // Quiet signalling nans.
3997*9880d681SAndroid Build Coastguard Worker   if (Exp == APFloat::IEK_NaN) {
3998*9880d681SAndroid Build Coastguard Worker     APFloat Quiet(Val);
3999*9880d681SAndroid Build Coastguard Worker     Quiet.makeQuiet();
4000*9880d681SAndroid Build Coastguard Worker     return Quiet;
4001*9880d681SAndroid Build Coastguard Worker   }
4002*9880d681SAndroid Build Coastguard Worker 
4003*9880d681SAndroid Build Coastguard Worker   if (Exp == APFloat::IEK_Inf)
4004*9880d681SAndroid Build Coastguard Worker     return Val;
4005*9880d681SAndroid Build Coastguard Worker 
4006*9880d681SAndroid Build Coastguard Worker   // 1 is added because frexp is defined to return a normalized fraction in
4007*9880d681SAndroid Build Coastguard Worker   // +/-[0.5, 1.0), rather than the usual +/-[1.0, 2.0).
4008*9880d681SAndroid Build Coastguard Worker   Exp = Exp == APFloat::IEK_Zero ? 0 : Exp + 1;
4009*9880d681SAndroid Build Coastguard Worker   return scalbn(Val, -Exp, RM);
4010*9880d681SAndroid Build Coastguard Worker }
4011