blob: c13231d3fe10ffc2f51ca60a1280e77d4d7b0451 [file] [log] [blame]
Chris Lattnerb39cdde2007-08-20 22:49:32 +00001//===-- APFloat.cpp - Implement APFloat class -----------------------------===//
2//
3// The LLVM Compiler Infrastructure
4//
Chris Lattner4ee451d2007-12-29 20:36:04 +00005// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
Chris Lattnerb39cdde2007-08-20 22:49:32 +00007//
8//===----------------------------------------------------------------------===//
9//
10// This file implements a class to represent arbitrary precision floating
11// point values and provide a variety of arithmetic operations on them.
12//
13//===----------------------------------------------------------------------===//
14
Chris Lattner36d26c22007-12-08 19:00:03 +000015#include "llvm/ADT/APFloat.h"
Erick Tryzelaara15d8902009-08-16 23:36:19 +000016#include "llvm/ADT/StringRef.h"
Ted Kremenek1f801fa2008-02-11 17:24:50 +000017#include "llvm/ADT/FoldingSet.h"
Torok Edwinc25e7582009-07-11 20:10:48 +000018#include "llvm/Support/ErrorHandling.h"
Dale Johannesend3b51fd2007-08-24 05:08:11 +000019#include "llvm/Support/MathExtras.h"
Chris Lattnerfad86b02008-08-17 07:19:36 +000020#include <cstring>
Chris Lattnerb39cdde2007-08-20 22:49:32 +000021
22using namespace llvm;
23
24#define convolve(lhs, rhs) ((lhs) * 4 + (rhs))
25
Neil Bootha30b0ee2007-10-03 22:26:02 +000026/* Assumed in hexadecimal significand parsing, and conversion to
27 hexadecimal strings. */
Chris Lattner9f17eb02008-08-17 04:58:58 +000028#define COMPILE_TIME_ASSERT(cond) extern int CTAssert[(cond) ? 1 : -1]
Chris Lattnerb39cdde2007-08-20 22:49:32 +000029COMPILE_TIME_ASSERT(integerPartWidth % 4 == 0);
30
31namespace llvm {
32
33 /* Represents floating point arithmetic semantics. */
34 struct fltSemantics {
35 /* The largest E such that 2^E is representable; this matches the
36 definition of IEEE 754. */
37 exponent_t maxExponent;
38
39 /* The smallest E such that 2^E is a normalized number; this
40 matches the definition of IEEE 754. */
41 exponent_t minExponent;
42
43 /* Number of bits in the significand. This includes the integer
44 bit. */
Neil Booth7a951ca2007-10-12 15:33:27 +000045 unsigned int precision;
Neil Boothcaf19d72007-10-14 10:29:28 +000046
47 /* True if arithmetic is supported. */
48 unsigned int arithmeticOK;
Chris Lattnerb39cdde2007-08-20 22:49:32 +000049 };
50
Neil Boothcaf19d72007-10-14 10:29:28 +000051 const fltSemantics APFloat::IEEEsingle = { 127, -126, 24, true };
52 const fltSemantics APFloat::IEEEdouble = { 1023, -1022, 53, true };
53 const fltSemantics APFloat::IEEEquad = { 16383, -16382, 113, true };
54 const fltSemantics APFloat::x87DoubleExtended = { 16383, -16382, 64, true };
55 const fltSemantics APFloat::Bogus = { 0, 0, 0, true };
Dale Johannesena471c2e2007-10-11 18:07:22 +000056
57 // The PowerPC format consists of two doubles. It does not map cleanly
58 // onto the usual format above. For now only storage of constants of
59 // this type is supported, no arithmetic.
Neil Boothcaf19d72007-10-14 10:29:28 +000060 const fltSemantics APFloat::PPCDoubleDouble = { 1023, -1022, 106, false };
Neil Booth96c74712007-10-12 16:02:31 +000061
62 /* A tight upper bound on number of parts required to hold the value
63 pow(5, power) is
64
Neil Booth686700e2007-10-15 15:00:55 +000065 power * 815 / (351 * integerPartWidth) + 1
Neil Booth96c74712007-10-12 16:02:31 +000066
67 However, whilst the result may require only this many parts,
68 because we are multiplying two values to get it, the
69 multiplication may require an extra part with the excess part
70 being zero (consider the trivial case of 1 * 1, tcFullMultiply
71 requires two parts to hold the single-part result). So we add an
72 extra one to guarantee enough space whilst multiplying. */
73 const unsigned int maxExponent = 16383;
74 const unsigned int maxPrecision = 113;
75 const unsigned int maxPowerOfFiveExponent = maxExponent + maxPrecision - 1;
Neil Booth686700e2007-10-15 15:00:55 +000076 const unsigned int maxPowerOfFiveParts = 2 + ((maxPowerOfFiveExponent * 815)
77 / (351 * integerPartWidth));
Chris Lattnerb39cdde2007-08-20 22:49:32 +000078}
79
Chris Lattnere213f3f2009-03-12 23:59:55 +000080/* A bunch of private, handy routines. */
Chris Lattnerb39cdde2007-08-20 22:49:32 +000081
Chris Lattnere213f3f2009-03-12 23:59:55 +000082static inline unsigned int
83partCountForBits(unsigned int bits)
84{
85 return ((bits) + integerPartWidth - 1) / integerPartWidth;
86}
Chris Lattnerb39cdde2007-08-20 22:49:32 +000087
Chris Lattnere213f3f2009-03-12 23:59:55 +000088/* Returns 0U-9U. Return values >= 10U are not digits. */
89static inline unsigned int
90decDigitValue(unsigned int c)
91{
92 return c - '0';
93}
Chris Lattnerb39cdde2007-08-20 22:49:32 +000094
Chris Lattnere213f3f2009-03-12 23:59:55 +000095static unsigned int
96hexDigitValue(unsigned int c)
97{
98 unsigned int r;
Chris Lattnerb39cdde2007-08-20 22:49:32 +000099
Chris Lattnere213f3f2009-03-12 23:59:55 +0000100 r = c - '0';
101 if(r <= 9)
102 return r;
Chris Lattnerb39cdde2007-08-20 22:49:32 +0000103
Chris Lattnere213f3f2009-03-12 23:59:55 +0000104 r = c - 'A';
105 if(r <= 5)
106 return r + 10;
Chris Lattnerb39cdde2007-08-20 22:49:32 +0000107
Chris Lattnere213f3f2009-03-12 23:59:55 +0000108 r = c - 'a';
109 if(r <= 5)
110 return r + 10;
Chris Lattnerb39cdde2007-08-20 22:49:32 +0000111
Chris Lattnere213f3f2009-03-12 23:59:55 +0000112 return -1U;
113}
Chris Lattnerb39cdde2007-08-20 22:49:32 +0000114
Chris Lattnere213f3f2009-03-12 23:59:55 +0000115static inline void
116assertArithmeticOK(const llvm::fltSemantics &semantics) {
117 assert(semantics.arithmeticOK
118 && "Compile-time arithmetic does not support these semantics");
119}
Neil Boothcaf19d72007-10-14 10:29:28 +0000120
Chris Lattnere213f3f2009-03-12 23:59:55 +0000121/* Return the value of a decimal exponent of the form
122 [+-]ddddddd.
Neil Booth1870f292007-10-14 10:16:12 +0000123
Chris Lattnere213f3f2009-03-12 23:59:55 +0000124 If the exponent overflows, returns a large exponent with the
125 appropriate sign. */
126static int
Erick Tryzelaara15d8902009-08-16 23:36:19 +0000127readExponent(StringRef::iterator begin, StringRef::iterator end)
Chris Lattnere213f3f2009-03-12 23:59:55 +0000128{
129 bool isNegative;
130 unsigned int absExponent;
131 const unsigned int overlargeExponent = 24000; /* FIXME. */
Erick Tryzelaara15d8902009-08-16 23:36:19 +0000132 StringRef::iterator p = begin;
133
134 assert(p != end && "Exponent has no digits");
Neil Booth1870f292007-10-14 10:16:12 +0000135
Chris Lattnere213f3f2009-03-12 23:59:55 +0000136 isNegative = (*p == '-');
Erick Tryzelaara15d8902009-08-16 23:36:19 +0000137 if (*p == '-' || *p == '+') {
Chris Lattnerb39cdde2007-08-20 22:49:32 +0000138 p++;
Erick Tryzelaara15d8902009-08-16 23:36:19 +0000139 assert(p != end && "Exponent has no digits");
140 }
Chris Lattnerb39cdde2007-08-20 22:49:32 +0000141
Chris Lattnere213f3f2009-03-12 23:59:55 +0000142 absExponent = decDigitValue(*p++);
Erick Tryzelaara15d8902009-08-16 23:36:19 +0000143 assert(absExponent < 10U && "Invalid character in exponent");
Chris Lattnerb39cdde2007-08-20 22:49:32 +0000144
Erick Tryzelaara15d8902009-08-16 23:36:19 +0000145 for (; p != end; ++p) {
Chris Lattnere213f3f2009-03-12 23:59:55 +0000146 unsigned int value;
Chris Lattnerb39cdde2007-08-20 22:49:32 +0000147
Chris Lattnere213f3f2009-03-12 23:59:55 +0000148 value = decDigitValue(*p);
Erick Tryzelaara15d8902009-08-16 23:36:19 +0000149 assert(value < 10U && "Invalid character in exponent");
Chris Lattnere213f3f2009-03-12 23:59:55 +0000150
Chris Lattnere213f3f2009-03-12 23:59:55 +0000151 value += absExponent * 10;
152 if (absExponent >= overlargeExponent) {
153 absExponent = overlargeExponent;
154 break;
Chris Lattnerb39cdde2007-08-20 22:49:32 +0000155 }
Chris Lattnere213f3f2009-03-12 23:59:55 +0000156 absExponent = value;
157 }
Chris Lattnerb39cdde2007-08-20 22:49:32 +0000158
Erick Tryzelaara15d8902009-08-16 23:36:19 +0000159 assert(p == end && "Invalid exponent in exponent");
160
Chris Lattnere213f3f2009-03-12 23:59:55 +0000161 if (isNegative)
162 return -(int) absExponent;
163 else
164 return (int) absExponent;
165}
166
167/* This is ugly and needs cleaning up, but I don't immediately see
168 how whilst remaining safe. */
169static int
Erick Tryzelaara15d8902009-08-16 23:36:19 +0000170totalExponent(StringRef::iterator p, StringRef::iterator end,
171 int exponentAdjustment)
Chris Lattnere213f3f2009-03-12 23:59:55 +0000172{
173 int unsignedExponent;
174 bool negative, overflow;
175 int exponent;
176
177 /* Move past the exponent letter and sign to the digits. */
178 p++;
179 negative = *p == '-';
180 if(*p == '-' || *p == '+')
181 p++;
182
183 unsignedExponent = 0;
184 overflow = false;
Erick Tryzelaara15d8902009-08-16 23:36:19 +0000185 for(; p != end; ++p) {
Chris Lattnere213f3f2009-03-12 23:59:55 +0000186 unsigned int value;
187
188 value = decDigitValue(*p);
Erick Tryzelaara15d8902009-08-16 23:36:19 +0000189 assert(value < 10U && "Invalid character in exponent");
Chris Lattnere213f3f2009-03-12 23:59:55 +0000190
Chris Lattnere213f3f2009-03-12 23:59:55 +0000191 unsignedExponent = unsignedExponent * 10 + value;
192 if(unsignedExponent > 65535)
Chris Lattnerb39cdde2007-08-20 22:49:32 +0000193 overflow = true;
Chris Lattnerb39cdde2007-08-20 22:49:32 +0000194 }
195
Chris Lattnere213f3f2009-03-12 23:59:55 +0000196 if(exponentAdjustment > 65535 || exponentAdjustment < -65536)
197 overflow = true;
198
199 if(!overflow) {
200 exponent = unsignedExponent;
201 if(negative)
202 exponent = -exponent;
203 exponent += exponentAdjustment;
204 if(exponent > 65535 || exponent < -65536)
205 overflow = true;
206 }
207
208 if(overflow)
209 exponent = negative ? -65536: 65535;
210
211 return exponent;
212}
213
Erick Tryzelaara15d8902009-08-16 23:36:19 +0000214static StringRef::iterator
215skipLeadingZeroesAndAnyDot(StringRef::iterator begin, StringRef::iterator end,
216 StringRef::iterator *dot)
Chris Lattnere213f3f2009-03-12 23:59:55 +0000217{
Erick Tryzelaara15d8902009-08-16 23:36:19 +0000218 StringRef::iterator p = begin;
219 *dot = end;
220 while(*p == '0' && p != end)
Chris Lattnere213f3f2009-03-12 23:59:55 +0000221 p++;
222
223 if(*p == '.') {
224 *dot = p++;
Erick Tryzelaara15d8902009-08-16 23:36:19 +0000225
226 assert(end - begin != 1 && "String cannot be just a dot");
227
228 while(*p == '0' && p != end)
Chris Lattnerb39cdde2007-08-20 22:49:32 +0000229 p++;
Chris Lattnerb39cdde2007-08-20 22:49:32 +0000230 }
231
Chris Lattnere213f3f2009-03-12 23:59:55 +0000232 return p;
233}
Neil Booth1870f292007-10-14 10:16:12 +0000234
Chris Lattnere213f3f2009-03-12 23:59:55 +0000235/* Given a normal decimal floating point number of the form
Neil Booth1870f292007-10-14 10:16:12 +0000236
Chris Lattnere213f3f2009-03-12 23:59:55 +0000237 dddd.dddd[eE][+-]ddd
Neil Booth686700e2007-10-15 15:00:55 +0000238
Chris Lattnere213f3f2009-03-12 23:59:55 +0000239 where the decimal point and exponent are optional, fill out the
240 structure D. Exponent is appropriate if the significand is
241 treated as an integer, and normalizedExponent if the significand
242 is taken to have the decimal point after a single leading
243 non-zero digit.
Neil Booth1870f292007-10-14 10:16:12 +0000244
Chris Lattnere213f3f2009-03-12 23:59:55 +0000245 If the value is zero, V->firstSigDigit points to a non-digit, and
246 the return exponent is zero.
247*/
248struct decimalInfo {
249 const char *firstSigDigit;
250 const char *lastSigDigit;
251 int exponent;
252 int normalizedExponent;
253};
Neil Booth1870f292007-10-14 10:16:12 +0000254
Chris Lattnere213f3f2009-03-12 23:59:55 +0000255static void
Erick Tryzelaara15d8902009-08-16 23:36:19 +0000256interpretDecimal(StringRef::iterator begin, StringRef::iterator end,
257 decimalInfo *D)
Chris Lattnere213f3f2009-03-12 23:59:55 +0000258{
Erick Tryzelaara15d8902009-08-16 23:36:19 +0000259 StringRef::iterator dot = end;
260 StringRef::iterator p = skipLeadingZeroesAndAnyDot (begin, end, &dot);
Neil Booth1870f292007-10-14 10:16:12 +0000261
Chris Lattnere213f3f2009-03-12 23:59:55 +0000262 D->firstSigDigit = p;
263 D->exponent = 0;
264 D->normalizedExponent = 0;
265
Erick Tryzelaara15d8902009-08-16 23:36:19 +0000266 for (; p != end; ++p) {
Chris Lattnere213f3f2009-03-12 23:59:55 +0000267 if (*p == '.') {
Erick Tryzelaara15d8902009-08-16 23:36:19 +0000268 assert(dot == end && "Multiple dots in float");
Chris Lattnere213f3f2009-03-12 23:59:55 +0000269 dot = p++;
Erick Tryzelaara15d8902009-08-16 23:36:19 +0000270 if (p == end)
271 break;
Neil Booth1870f292007-10-14 10:16:12 +0000272 }
Chris Lattnere213f3f2009-03-12 23:59:55 +0000273 if (decDigitValue(*p) >= 10U)
274 break;
Chris Lattnere213f3f2009-03-12 23:59:55 +0000275 }
Neil Booth1870f292007-10-14 10:16:12 +0000276
Erick Tryzelaara15d8902009-08-16 23:36:19 +0000277 if (p != end) {
278 assert((*p == 'e' || *p == 'E') && "Invalid character in digit string");
279
280 /* p points to the first non-digit in the string */
281 if (*p == 'e' || *p == 'E') {
282 D->exponent = readExponent(p + 1, end);
283 }
Neil Booth1870f292007-10-14 10:16:12 +0000284
Chris Lattnere213f3f2009-03-12 23:59:55 +0000285 /* Implied decimal point? */
Erick Tryzelaara15d8902009-08-16 23:36:19 +0000286 if (dot == end)
Chris Lattnere213f3f2009-03-12 23:59:55 +0000287 dot = p;
Erick Tryzelaara15d8902009-08-16 23:36:19 +0000288 }
Neil Booth1870f292007-10-14 10:16:12 +0000289
Erick Tryzelaara15d8902009-08-16 23:36:19 +0000290 /* If number is all zeroes accept any exponent. */
291 if (p != D->firstSigDigit) {
Chris Lattnere213f3f2009-03-12 23:59:55 +0000292 /* Drop insignificant trailing zeroes. */
Erick Tryzelaara15d8902009-08-16 23:36:19 +0000293 if (p != begin) {
Neil Booth1870f292007-10-14 10:16:12 +0000294 do
Erick Tryzelaara15d8902009-08-16 23:36:19 +0000295 do
296 p--;
297 while (p != begin && *p == '0');
298 while (p != begin && *p == '.');
299 }
Neil Booth1870f292007-10-14 10:16:12 +0000300
Chris Lattnere213f3f2009-03-12 23:59:55 +0000301 /* Adjust the exponents for any decimal point. */
302 D->exponent += static_cast<exponent_t>((dot - p) - (dot > p));
303 D->normalizedExponent = (D->exponent +
304 static_cast<exponent_t>((p - D->firstSigDigit)
305 - (dot > D->firstSigDigit && dot < p)));
Neil Booth1870f292007-10-14 10:16:12 +0000306 }
307
Chris Lattnere213f3f2009-03-12 23:59:55 +0000308 D->lastSigDigit = p;
309}
Chris Lattnerb39cdde2007-08-20 22:49:32 +0000310
Chris Lattnere213f3f2009-03-12 23:59:55 +0000311/* Return the trailing fraction of a hexadecimal number.
312 DIGITVALUE is the first hex digit of the fraction, P points to
313 the next digit. */
314static lostFraction
Erick Tryzelaara15d8902009-08-16 23:36:19 +0000315trailingHexadecimalFraction(StringRef::iterator p, StringRef::iterator end,
316 unsigned int digitValue)
Chris Lattnere213f3f2009-03-12 23:59:55 +0000317{
318 unsigned int hexDigit;
Chris Lattnerb39cdde2007-08-20 22:49:32 +0000319
Chris Lattnere213f3f2009-03-12 23:59:55 +0000320 /* If the first trailing digit isn't 0 or 8 we can work out the
321 fraction immediately. */
322 if(digitValue > 8)
323 return lfMoreThanHalf;
324 else if(digitValue < 8 && digitValue > 0)
Chris Lattnerb39cdde2007-08-20 22:49:32 +0000325 return lfLessThanHalf;
Chris Lattnere213f3f2009-03-12 23:59:55 +0000326
327 /* Otherwise we need to find the first non-zero digit. */
328 while(*p == '0')
329 p++;
330
Erick Tryzelaara15d8902009-08-16 23:36:19 +0000331 assert(p != end && "Invalid trailing hexadecimal fraction!");
332
Chris Lattnere213f3f2009-03-12 23:59:55 +0000333 hexDigit = hexDigitValue(*p);
334
335 /* If we ran off the end it is exactly zero or one-half, otherwise
336 a little more. */
337 if(hexDigit == -1U)
338 return digitValue == 0 ? lfExactlyZero: lfExactlyHalf;
339 else
340 return digitValue == 0 ? lfLessThanHalf: lfMoreThanHalf;
341}
342
343/* Return the fraction lost were a bignum truncated losing the least
344 significant BITS bits. */
345static lostFraction
346lostFractionThroughTruncation(const integerPart *parts,
347 unsigned int partCount,
348 unsigned int bits)
349{
350 unsigned int lsb;
351
352 lsb = APInt::tcLSB(parts, partCount);
353
354 /* Note this is guaranteed true if bits == 0, or LSB == -1U. */
355 if(bits <= lsb)
356 return lfExactlyZero;
357 if(bits == lsb + 1)
358 return lfExactlyHalf;
359 if(bits <= partCount * integerPartWidth
360 && APInt::tcExtractBit(parts, bits - 1))
361 return lfMoreThanHalf;
362
363 return lfLessThanHalf;
364}
365
366/* Shift DST right BITS bits noting lost fraction. */
367static lostFraction
368shiftRight(integerPart *dst, unsigned int parts, unsigned int bits)
369{
370 lostFraction lost_fraction;
371
372 lost_fraction = lostFractionThroughTruncation(dst, parts, bits);
373
374 APInt::tcShiftRight(dst, parts, bits);
375
376 return lost_fraction;
377}
378
379/* Combine the effect of two lost fractions. */
380static lostFraction
381combineLostFractions(lostFraction moreSignificant,
382 lostFraction lessSignificant)
383{
384 if(lessSignificant != lfExactlyZero) {
385 if(moreSignificant == lfExactlyZero)
386 moreSignificant = lfLessThanHalf;
387 else if(moreSignificant == lfExactlyHalf)
388 moreSignificant = lfMoreThanHalf;
Chris Lattnerb39cdde2007-08-20 22:49:32 +0000389 }
390
Chris Lattnere213f3f2009-03-12 23:59:55 +0000391 return moreSignificant;
392}
Chris Lattnerb39cdde2007-08-20 22:49:32 +0000393
Chris Lattnere213f3f2009-03-12 23:59:55 +0000394/* The error from the true value, in half-ulps, on multiplying two
395 floating point numbers, which differ from the value they
396 approximate by at most HUE1 and HUE2 half-ulps, is strictly less
397 than the returned value.
Chris Lattnerb39cdde2007-08-20 22:49:32 +0000398
Chris Lattnere213f3f2009-03-12 23:59:55 +0000399 See "How to Read Floating Point Numbers Accurately" by William D
400 Clinger. */
401static unsigned int
402HUerrBound(bool inexactMultiply, unsigned int HUerr1, unsigned int HUerr2)
403{
404 assert(HUerr1 < 2 || HUerr2 < 2 || (HUerr1 + HUerr2 < 8));
Chris Lattnerb39cdde2007-08-20 22:49:32 +0000405
Chris Lattnere213f3f2009-03-12 23:59:55 +0000406 if (HUerr1 + HUerr2 == 0)
407 return inexactMultiply * 2; /* <= inexactMultiply half-ulps. */
408 else
409 return inexactMultiply + 2 * (HUerr1 + HUerr2);
410}
Neil Bootha30b0ee2007-10-03 22:26:02 +0000411
Chris Lattnere213f3f2009-03-12 23:59:55 +0000412/* The number of ulps from the boundary (zero, or half if ISNEAREST)
413 when the least significant BITS are truncated. BITS cannot be
414 zero. */
415static integerPart
416ulpsFromBoundary(const integerPart *parts, unsigned int bits, bool isNearest)
417{
418 unsigned int count, partBits;
419 integerPart part, boundary;
Neil Booth33d4c922007-10-07 08:51:21 +0000420
Chris Lattnere213f3f2009-03-12 23:59:55 +0000421 assert (bits != 0);
Neil Bootha30b0ee2007-10-03 22:26:02 +0000422
Chris Lattnere213f3f2009-03-12 23:59:55 +0000423 bits--;
424 count = bits / integerPartWidth;
425 partBits = bits % integerPartWidth + 1;
Neil Booth96c74712007-10-12 16:02:31 +0000426
Chris Lattnere213f3f2009-03-12 23:59:55 +0000427 part = parts[count] & (~(integerPart) 0 >> (integerPartWidth - partBits));
Neil Booth96c74712007-10-12 16:02:31 +0000428
Chris Lattnere213f3f2009-03-12 23:59:55 +0000429 if (isNearest)
430 boundary = (integerPart) 1 << (partBits - 1);
431 else
432 boundary = 0;
433
434 if (count == 0) {
435 if (part - boundary <= boundary - part)
436 return part - boundary;
Neil Booth96c74712007-10-12 16:02:31 +0000437 else
Chris Lattnere213f3f2009-03-12 23:59:55 +0000438 return boundary - part;
Neil Booth96c74712007-10-12 16:02:31 +0000439 }
440
Chris Lattnere213f3f2009-03-12 23:59:55 +0000441 if (part == boundary) {
442 while (--count)
443 if (parts[count])
444 return ~(integerPart) 0; /* A lot. */
Neil Booth96c74712007-10-12 16:02:31 +0000445
Chris Lattnere213f3f2009-03-12 23:59:55 +0000446 return parts[0];
447 } else if (part == boundary - 1) {
448 while (--count)
449 if (~parts[count])
450 return ~(integerPart) 0; /* A lot. */
Neil Booth96c74712007-10-12 16:02:31 +0000451
Chris Lattnere213f3f2009-03-12 23:59:55 +0000452 return -parts[0];
453 }
Neil Booth96c74712007-10-12 16:02:31 +0000454
Chris Lattnere213f3f2009-03-12 23:59:55 +0000455 return ~(integerPart) 0; /* A lot. */
456}
Neil Booth96c74712007-10-12 16:02:31 +0000457
Chris Lattnere213f3f2009-03-12 23:59:55 +0000458/* Place pow(5, power) in DST, and return the number of parts used.
459 DST must be at least one part larger than size of the answer. */
460static unsigned int
461powerOf5(integerPart *dst, unsigned int power)
462{
463 static const integerPart firstEightPowers[] = { 1, 5, 25, 125, 625, 3125,
464 15625, 78125 };
Chris Lattneree167a72009-03-13 00:24:01 +0000465 integerPart pow5s[maxPowerOfFiveParts * 2 + 5];
466 pow5s[0] = 78125 * 5;
467
Chris Lattner807926a2009-03-13 00:03:51 +0000468 unsigned int partsCount[16] = { 1 };
Chris Lattnere213f3f2009-03-12 23:59:55 +0000469 integerPart scratch[maxPowerOfFiveParts], *p1, *p2, *pow5;
470 unsigned int result;
Chris Lattnere213f3f2009-03-12 23:59:55 +0000471 assert(power <= maxExponent);
472
473 p1 = dst;
474 p2 = scratch;
475
476 *p1 = firstEightPowers[power & 7];
477 power >>= 3;
478
479 result = 1;
480 pow5 = pow5s;
481
482 for (unsigned int n = 0; power; power >>= 1, n++) {
483 unsigned int pc;
484
485 pc = partsCount[n];
486
487 /* Calculate pow(5,pow(2,n+3)) if we haven't yet. */
488 if (pc == 0) {
489 pc = partsCount[n - 1];
490 APInt::tcFullMultiply(pow5, pow5 - pc, pow5 - pc, pc, pc);
491 pc *= 2;
492 if (pow5[pc - 1] == 0)
493 pc--;
494 partsCount[n] = pc;
Neil Booth96c74712007-10-12 16:02:31 +0000495 }
496
Chris Lattnere213f3f2009-03-12 23:59:55 +0000497 if (power & 1) {
498 integerPart *tmp;
Neil Booth96c74712007-10-12 16:02:31 +0000499
Chris Lattnere213f3f2009-03-12 23:59:55 +0000500 APInt::tcFullMultiply(p2, p1, pow5, result, pc);
501 result += pc;
502 if (p2[result - 1] == 0)
503 result--;
Neil Booth96c74712007-10-12 16:02:31 +0000504
Chris Lattnere213f3f2009-03-12 23:59:55 +0000505 /* Now result is in p1 with partsCount parts and p2 is scratch
506 space. */
507 tmp = p1, p1 = p2, p2 = tmp;
Neil Booth96c74712007-10-12 16:02:31 +0000508 }
509
Chris Lattnere213f3f2009-03-12 23:59:55 +0000510 pow5 += pc;
Neil Booth96c74712007-10-12 16:02:31 +0000511 }
512
Chris Lattnere213f3f2009-03-12 23:59:55 +0000513 if (p1 != dst)
514 APInt::tcAssign(dst, p1, result);
Neil Booth96c74712007-10-12 16:02:31 +0000515
Chris Lattnere213f3f2009-03-12 23:59:55 +0000516 return result;
517}
Neil Booth96c74712007-10-12 16:02:31 +0000518
Chris Lattnere213f3f2009-03-12 23:59:55 +0000519/* Zero at the end to avoid modular arithmetic when adding one; used
520 when rounding up during hexadecimal output. */
521static const char hexDigitsLower[] = "0123456789abcdef0";
522static const char hexDigitsUpper[] = "0123456789ABCDEF0";
523static const char infinityL[] = "infinity";
524static const char infinityU[] = "INFINITY";
525static const char NaNL[] = "nan";
526static const char NaNU[] = "NAN";
Neil Booth96c74712007-10-12 16:02:31 +0000527
Chris Lattnere213f3f2009-03-12 23:59:55 +0000528/* Write out an integerPart in hexadecimal, starting with the most
529 significant nibble. Write out exactly COUNT hexdigits, return
530 COUNT. */
531static unsigned int
532partAsHex (char *dst, integerPart part, unsigned int count,
533 const char *hexDigitChars)
534{
535 unsigned int result = count;
Neil Booth96c74712007-10-12 16:02:31 +0000536
Chris Lattnere213f3f2009-03-12 23:59:55 +0000537 assert (count != 0 && count <= integerPartWidth / 4);
Neil Booth96c74712007-10-12 16:02:31 +0000538
Chris Lattnere213f3f2009-03-12 23:59:55 +0000539 part >>= (integerPartWidth - 4 * count);
540 while (count--) {
541 dst[count] = hexDigitChars[part & 0xf];
542 part >>= 4;
Neil Booth96c74712007-10-12 16:02:31 +0000543 }
544
Chris Lattnere213f3f2009-03-12 23:59:55 +0000545 return result;
546}
Neil Bootha30b0ee2007-10-03 22:26:02 +0000547
Chris Lattnere213f3f2009-03-12 23:59:55 +0000548/* Write out an unsigned decimal integer. */
549static char *
550writeUnsignedDecimal (char *dst, unsigned int n)
551{
552 char buff[40], *p;
Neil Bootha30b0ee2007-10-03 22:26:02 +0000553
Chris Lattnere213f3f2009-03-12 23:59:55 +0000554 p = buff;
555 do
556 *p++ = '0' + n % 10;
557 while (n /= 10);
Neil Bootha30b0ee2007-10-03 22:26:02 +0000558
Chris Lattnere213f3f2009-03-12 23:59:55 +0000559 do
560 *dst++ = *--p;
561 while (p != buff);
Neil Bootha30b0ee2007-10-03 22:26:02 +0000562
Chris Lattnere213f3f2009-03-12 23:59:55 +0000563 return dst;
564}
Neil Bootha30b0ee2007-10-03 22:26:02 +0000565
Chris Lattnere213f3f2009-03-12 23:59:55 +0000566/* Write out a signed decimal integer. */
567static char *
568writeSignedDecimal (char *dst, int value)
569{
570 if (value < 0) {
571 *dst++ = '-';
572 dst = writeUnsignedDecimal(dst, -(unsigned) value);
573 } else
574 dst = writeUnsignedDecimal(dst, value);
Neil Bootha30b0ee2007-10-03 22:26:02 +0000575
Chris Lattnere213f3f2009-03-12 23:59:55 +0000576 return dst;
Chris Lattnerb39cdde2007-08-20 22:49:32 +0000577}
578
579/* Constructors. */
580void
581APFloat::initialize(const fltSemantics *ourSemantics)
582{
583 unsigned int count;
584
585 semantics = ourSemantics;
586 count = partCount();
587 if(count > 1)
588 significand.parts = new integerPart[count];
589}
590
591void
592APFloat::freeSignificand()
593{
594 if(partCount() > 1)
595 delete [] significand.parts;
596}
597
598void
599APFloat::assign(const APFloat &rhs)
600{
601 assert(semantics == rhs.semantics);
602
603 sign = rhs.sign;
604 category = rhs.category;
605 exponent = rhs.exponent;
Dale Johannesena471c2e2007-10-11 18:07:22 +0000606 sign2 = rhs.sign2;
607 exponent2 = rhs.exponent2;
Dale Johanneseneaf08942007-08-31 04:03:46 +0000608 if(category == fcNormal || category == fcNaN)
Chris Lattnerb39cdde2007-08-20 22:49:32 +0000609 copySignificand(rhs);
610}
611
612void
613APFloat::copySignificand(const APFloat &rhs)
614{
Dale Johanneseneaf08942007-08-31 04:03:46 +0000615 assert(category == fcNormal || category == fcNaN);
Chris Lattnerb39cdde2007-08-20 22:49:32 +0000616 assert(rhs.partCount() >= partCount());
617
618 APInt::tcAssign(significandParts(), rhs.significandParts(),
Neil Booth4f881702007-09-26 21:33:42 +0000619 partCount());
Chris Lattnerb39cdde2007-08-20 22:49:32 +0000620}
621
Neil Boothe5e01942007-10-14 10:39:51 +0000622/* Make this number a NaN, with an arbitrary but deterministic value
Dale Johannesen541ed9f2009-01-21 20:32:55 +0000623 for the significand. If double or longer, this is a signalling NaN,
Mike Stumpc5ca7132009-05-30 03:49:43 +0000624 which may not be ideal. If float, this is QNaN(0). */
Neil Boothe5e01942007-10-14 10:39:51 +0000625void
Mike Stumpc5ca7132009-05-30 03:49:43 +0000626APFloat::makeNaN(unsigned type)
Neil Boothe5e01942007-10-14 10:39:51 +0000627{
628 category = fcNaN;
Mike Stumpc5ca7132009-05-30 03:49:43 +0000629 // FIXME: Add double and long double support for QNaN(0).
630 if (semantics->precision == 24 && semantics->maxExponent == 127) {
631 type |= 0x7fc00000U;
632 type &= ~0x80000000U;
633 } else
634 type = ~0U;
635 APInt::tcSet(significandParts(), type, partCount());
Neil Boothe5e01942007-10-14 10:39:51 +0000636}
637
Chris Lattnerb39cdde2007-08-20 22:49:32 +0000638APFloat &
639APFloat::operator=(const APFloat &rhs)
640{
641 if(this != &rhs) {
642 if(semantics != rhs.semantics) {
643 freeSignificand();
644 initialize(rhs.semantics);
645 }
646 assign(rhs);
647 }
648
649 return *this;
650}
651
Dale Johannesen343e7702007-08-24 00:56:33 +0000652bool
Dale Johannesen12595d72007-08-24 22:09:56 +0000653APFloat::bitwiseIsEqual(const APFloat &rhs) const {
Dale Johannesen343e7702007-08-24 00:56:33 +0000654 if (this == &rhs)
655 return true;
656 if (semantics != rhs.semantics ||
Dale Johanneseneaf08942007-08-31 04:03:46 +0000657 category != rhs.category ||
658 sign != rhs.sign)
Dale Johannesen343e7702007-08-24 00:56:33 +0000659 return false;
Dan Gohmanb10abe12008-01-29 12:08:20 +0000660 if (semantics==(const llvm::fltSemantics*)&PPCDoubleDouble &&
Dale Johannesena471c2e2007-10-11 18:07:22 +0000661 sign2 != rhs.sign2)
662 return false;
Dale Johanneseneaf08942007-08-31 04:03:46 +0000663 if (category==fcZero || category==fcInfinity)
Dale Johannesen343e7702007-08-24 00:56:33 +0000664 return true;
Dale Johanneseneaf08942007-08-31 04:03:46 +0000665 else if (category==fcNormal && exponent!=rhs.exponent)
666 return false;
Dan Gohmanb10abe12008-01-29 12:08:20 +0000667 else if (semantics==(const llvm::fltSemantics*)&PPCDoubleDouble &&
Dale Johannesena471c2e2007-10-11 18:07:22 +0000668 exponent2!=rhs.exponent2)
669 return false;
Dale Johannesen343e7702007-08-24 00:56:33 +0000670 else {
Dale Johannesen343e7702007-08-24 00:56:33 +0000671 int i= partCount();
672 const integerPart* p=significandParts();
673 const integerPart* q=rhs.significandParts();
674 for (; i>0; i--, p++, q++) {
675 if (*p != *q)
676 return false;
677 }
678 return true;
679 }
680}
681
Chris Lattnerb39cdde2007-08-20 22:49:32 +0000682APFloat::APFloat(const fltSemantics &ourSemantics, integerPart value)
683{
Neil Boothcaf19d72007-10-14 10:29:28 +0000684 assertArithmeticOK(ourSemantics);
Chris Lattnerb39cdde2007-08-20 22:49:32 +0000685 initialize(&ourSemantics);
686 sign = 0;
687 zeroSignificand();
688 exponent = ourSemantics.precision - 1;
689 significandParts()[0] = value;
690 normalize(rmNearestTiesToEven, lfExactlyZero);
691}
692
693APFloat::APFloat(const fltSemantics &ourSemantics,
Mike Stumpc5ca7132009-05-30 03:49:43 +0000694 fltCategory ourCategory, bool negative, unsigned type)
Chris Lattnerb39cdde2007-08-20 22:49:32 +0000695{
Neil Boothcaf19d72007-10-14 10:29:28 +0000696 assertArithmeticOK(ourSemantics);
Chris Lattnerb39cdde2007-08-20 22:49:32 +0000697 initialize(&ourSemantics);
698 category = ourCategory;
699 sign = negative;
Mike Stumpc5ca7132009-05-30 03:49:43 +0000700 if (category == fcNormal)
Chris Lattnerb39cdde2007-08-20 22:49:32 +0000701 category = fcZero;
Neil Boothe5e01942007-10-14 10:39:51 +0000702 else if (ourCategory == fcNaN)
Mike Stumpc5ca7132009-05-30 03:49:43 +0000703 makeNaN(type);
Chris Lattnerb39cdde2007-08-20 22:49:32 +0000704}
705
Erick Tryzelaara15d8902009-08-16 23:36:19 +0000706APFloat::APFloat(const fltSemantics &ourSemantics, const StringRef& text)
Chris Lattnerb39cdde2007-08-20 22:49:32 +0000707{
Neil Boothcaf19d72007-10-14 10:29:28 +0000708 assertArithmeticOK(ourSemantics);
Chris Lattnerb39cdde2007-08-20 22:49:32 +0000709 initialize(&ourSemantics);
710 convertFromString(text, rmNearestTiesToEven);
711}
712
713APFloat::APFloat(const APFloat &rhs)
714{
715 initialize(rhs.semantics);
716 assign(rhs);
717}
718
719APFloat::~APFloat()
720{
721 freeSignificand();
722}
723
Ted Kremenek1f801fa2008-02-11 17:24:50 +0000724// Profile - This method 'profiles' an APFloat for use with FoldingSet.
725void APFloat::Profile(FoldingSetNodeID& ID) const {
Dale Johannesen7111b022008-10-09 18:53:47 +0000726 ID.Add(bitcastToAPInt());
Ted Kremenek1f801fa2008-02-11 17:24:50 +0000727}
728
Chris Lattnerb39cdde2007-08-20 22:49:32 +0000729unsigned int
730APFloat::partCount() const
731{
Dale Johannesena72a5a02007-09-20 23:47:58 +0000732 return partCountForBits(semantics->precision + 1);
Chris Lattnerb39cdde2007-08-20 22:49:32 +0000733}
734
735unsigned int
736APFloat::semanticsPrecision(const fltSemantics &semantics)
737{
738 return semantics.precision;
739}
740
741const integerPart *
742APFloat::significandParts() const
743{
744 return const_cast<APFloat *>(this)->significandParts();
745}
746
747integerPart *
748APFloat::significandParts()
749{
Dale Johanneseneaf08942007-08-31 04:03:46 +0000750 assert(category == fcNormal || category == fcNaN);
Chris Lattnerb39cdde2007-08-20 22:49:32 +0000751
752 if(partCount() > 1)
753 return significand.parts;
754 else
755 return &significand.part;
756}
757
Chris Lattnerb39cdde2007-08-20 22:49:32 +0000758void
759APFloat::zeroSignificand()
760{
761 category = fcNormal;
762 APInt::tcSet(significandParts(), 0, partCount());
763}
764
765/* Increment an fcNormal floating point number's significand. */
766void
767APFloat::incrementSignificand()
768{
769 integerPart carry;
770
771 carry = APInt::tcIncrement(significandParts(), partCount());
772
773 /* Our callers should never cause us to overflow. */
774 assert(carry == 0);
775}
776
777/* Add the significand of the RHS. Returns the carry flag. */
778integerPart
779APFloat::addSignificand(const APFloat &rhs)
780{
781 integerPart *parts;
782
783 parts = significandParts();
784
785 assert(semantics == rhs.semantics);
786 assert(exponent == rhs.exponent);
787
788 return APInt::tcAdd(parts, rhs.significandParts(), 0, partCount());
789}
790
791/* Subtract the significand of the RHS with a borrow flag. Returns
792 the borrow flag. */
793integerPart
794APFloat::subtractSignificand(const APFloat &rhs, integerPart borrow)
795{
796 integerPart *parts;
797
798 parts = significandParts();
799
800 assert(semantics == rhs.semantics);
801 assert(exponent == rhs.exponent);
802
803 return APInt::tcSubtract(parts, rhs.significandParts(), borrow,
Neil Booth4f881702007-09-26 21:33:42 +0000804 partCount());
Chris Lattnerb39cdde2007-08-20 22:49:32 +0000805}
806
807/* Multiply the significand of the RHS. If ADDEND is non-NULL, add it
808 on to the full-precision result of the multiplication. Returns the
809 lost fraction. */
810lostFraction
811APFloat::multiplySignificand(const APFloat &rhs, const APFloat *addend)
812{
Neil Booth4f881702007-09-26 21:33:42 +0000813 unsigned int omsb; // One, not zero, based MSB.
Chris Lattnerb39cdde2007-08-20 22:49:32 +0000814 unsigned int partsCount, newPartsCount, precision;
815 integerPart *lhsSignificand;
816 integerPart scratch[4];
817 integerPart *fullSignificand;
818 lostFraction lost_fraction;
Dale Johannesen23a98552008-10-09 23:00:39 +0000819 bool ignored;
Chris Lattnerb39cdde2007-08-20 22:49:32 +0000820
821 assert(semantics == rhs.semantics);
822
823 precision = semantics->precision;
824 newPartsCount = partCountForBits(precision * 2);
825
826 if(newPartsCount > 4)
827 fullSignificand = new integerPart[newPartsCount];
828 else
829 fullSignificand = scratch;
830
831 lhsSignificand = significandParts();
832 partsCount = partCount();
833
834 APInt::tcFullMultiply(fullSignificand, lhsSignificand,
Neil Booth978661d2007-10-06 00:24:48 +0000835 rhs.significandParts(), partsCount, partsCount);
Chris Lattnerb39cdde2007-08-20 22:49:32 +0000836
837 lost_fraction = lfExactlyZero;
838 omsb = APInt::tcMSB(fullSignificand, newPartsCount) + 1;
839 exponent += rhs.exponent;
840
841 if(addend) {
842 Significand savedSignificand = significand;
843 const fltSemantics *savedSemantics = semantics;
844 fltSemantics extendedSemantics;
845 opStatus status;
846 unsigned int extendedPrecision;
847
848 /* Normalize our MSB. */
849 extendedPrecision = precision + precision - 1;
850 if(omsb != extendedPrecision)
851 {
Neil Booth4f881702007-09-26 21:33:42 +0000852 APInt::tcShiftLeft(fullSignificand, newPartsCount,
853 extendedPrecision - omsb);
854 exponent -= extendedPrecision - omsb;
Chris Lattnerb39cdde2007-08-20 22:49:32 +0000855 }
856
857 /* Create new semantics. */
858 extendedSemantics = *semantics;
859 extendedSemantics.precision = extendedPrecision;
860
861 if(newPartsCount == 1)
862 significand.part = fullSignificand[0];
863 else
864 significand.parts = fullSignificand;
865 semantics = &extendedSemantics;
866
867 APFloat extendedAddend(*addend);
Dale Johannesen23a98552008-10-09 23:00:39 +0000868 status = extendedAddend.convert(extendedSemantics, rmTowardZero, &ignored);
Chris Lattnerb39cdde2007-08-20 22:49:32 +0000869 assert(status == opOK);
870 lost_fraction = addOrSubtractSignificand(extendedAddend, false);
871
872 /* Restore our state. */
873 if(newPartsCount == 1)
874 fullSignificand[0] = significand.part;
875 significand = savedSignificand;
876 semantics = savedSemantics;
877
878 omsb = APInt::tcMSB(fullSignificand, newPartsCount) + 1;
879 }
880
881 exponent -= (precision - 1);
882
883 if(omsb > precision) {
884 unsigned int bits, significantParts;
885 lostFraction lf;
886
887 bits = omsb - precision;
888 significantParts = partCountForBits(omsb);
889 lf = shiftRight(fullSignificand, significantParts, bits);
890 lost_fraction = combineLostFractions(lf, lost_fraction);
891 exponent += bits;
892 }
893
894 APInt::tcAssign(lhsSignificand, fullSignificand, partsCount);
895
896 if(newPartsCount > 4)
897 delete [] fullSignificand;
898
899 return lost_fraction;
900}
901
902/* Multiply the significands of LHS and RHS to DST. */
903lostFraction
904APFloat::divideSignificand(const APFloat &rhs)
905{
906 unsigned int bit, i, partsCount;
907 const integerPart *rhsSignificand;
908 integerPart *lhsSignificand, *dividend, *divisor;
909 integerPart scratch[4];
910 lostFraction lost_fraction;
911
912 assert(semantics == rhs.semantics);
913
914 lhsSignificand = significandParts();
915 rhsSignificand = rhs.significandParts();
916 partsCount = partCount();
917
918 if(partsCount > 2)
919 dividend = new integerPart[partsCount * 2];
920 else
921 dividend = scratch;
922
923 divisor = dividend + partsCount;
924
925 /* Copy the dividend and divisor as they will be modified in-place. */
926 for(i = 0; i < partsCount; i++) {
927 dividend[i] = lhsSignificand[i];
928 divisor[i] = rhsSignificand[i];
929 lhsSignificand[i] = 0;
930 }
931
932 exponent -= rhs.exponent;
933
934 unsigned int precision = semantics->precision;
935
936 /* Normalize the divisor. */
937 bit = precision - APInt::tcMSB(divisor, partsCount) - 1;
938 if(bit) {
939 exponent += bit;
940 APInt::tcShiftLeft(divisor, partsCount, bit);
941 }
942
943 /* Normalize the dividend. */
944 bit = precision - APInt::tcMSB(dividend, partsCount) - 1;
945 if(bit) {
946 exponent -= bit;
947 APInt::tcShiftLeft(dividend, partsCount, bit);
948 }
949
Neil Booth96c74712007-10-12 16:02:31 +0000950 /* Ensure the dividend >= divisor initially for the loop below.
951 Incidentally, this means that the division loop below is
952 guaranteed to set the integer bit to one. */
Chris Lattnerb39cdde2007-08-20 22:49:32 +0000953 if(APInt::tcCompare(dividend, divisor, partsCount) < 0) {
954 exponent--;
955 APInt::tcShiftLeft(dividend, partsCount, 1);
956 assert(APInt::tcCompare(dividend, divisor, partsCount) >= 0);
957 }
958
959 /* Long division. */
960 for(bit = precision; bit; bit -= 1) {
961 if(APInt::tcCompare(dividend, divisor, partsCount) >= 0) {
962 APInt::tcSubtract(dividend, divisor, 0, partsCount);
963 APInt::tcSetBit(lhsSignificand, bit - 1);
964 }
965
966 APInt::tcShiftLeft(dividend, partsCount, 1);
967 }
968
969 /* Figure out the lost fraction. */
970 int cmp = APInt::tcCompare(dividend, divisor, partsCount);
971
972 if(cmp > 0)
973 lost_fraction = lfMoreThanHalf;
974 else if(cmp == 0)
975 lost_fraction = lfExactlyHalf;
976 else if(APInt::tcIsZero(dividend, partsCount))
977 lost_fraction = lfExactlyZero;
978 else
979 lost_fraction = lfLessThanHalf;
980
981 if(partsCount > 2)
982 delete [] dividend;
983
984 return lost_fraction;
985}
986
987unsigned int
988APFloat::significandMSB() const
989{
990 return APInt::tcMSB(significandParts(), partCount());
991}
992
993unsigned int
994APFloat::significandLSB() const
995{
996 return APInt::tcLSB(significandParts(), partCount());
997}
998
999/* Note that a zero result is NOT normalized to fcZero. */
1000lostFraction
1001APFloat::shiftSignificandRight(unsigned int bits)
1002{
1003 /* Our exponent should not overflow. */
1004 assert((exponent_t) (exponent + bits) >= exponent);
1005
1006 exponent += bits;
1007
1008 return shiftRight(significandParts(), partCount(), bits);
1009}
1010
1011/* Shift the significand left BITS bits, subtract BITS from its exponent. */
1012void
1013APFloat::shiftSignificandLeft(unsigned int bits)
1014{
1015 assert(bits < semantics->precision);
1016
1017 if(bits) {
1018 unsigned int partsCount = partCount();
1019
1020 APInt::tcShiftLeft(significandParts(), partsCount, bits);
1021 exponent -= bits;
1022
1023 assert(!APInt::tcIsZero(significandParts(), partsCount));
1024 }
1025}
1026
1027APFloat::cmpResult
1028APFloat::compareAbsoluteValue(const APFloat &rhs) const
1029{
1030 int compare;
1031
1032 assert(semantics == rhs.semantics);
1033 assert(category == fcNormal);
1034 assert(rhs.category == fcNormal);
1035
1036 compare = exponent - rhs.exponent;
1037
1038 /* If exponents are equal, do an unsigned bignum comparison of the
1039 significands. */
1040 if(compare == 0)
1041 compare = APInt::tcCompare(significandParts(), rhs.significandParts(),
Neil Booth4f881702007-09-26 21:33:42 +00001042 partCount());
Chris Lattnerb39cdde2007-08-20 22:49:32 +00001043
1044 if(compare > 0)
1045 return cmpGreaterThan;
1046 else if(compare < 0)
1047 return cmpLessThan;
1048 else
1049 return cmpEqual;
1050}
1051
1052/* Handle overflow. Sign is preserved. We either become infinity or
1053 the largest finite number. */
1054APFloat::opStatus
1055APFloat::handleOverflow(roundingMode rounding_mode)
1056{
1057 /* Infinity? */
1058 if(rounding_mode == rmNearestTiesToEven
1059 || rounding_mode == rmNearestTiesToAway
1060 || (rounding_mode == rmTowardPositive && !sign)
1061 || (rounding_mode == rmTowardNegative && sign))
1062 {
1063 category = fcInfinity;
1064 return (opStatus) (opOverflow | opInexact);
1065 }
1066
1067 /* Otherwise we become the largest finite number. */
1068 category = fcNormal;
1069 exponent = semantics->maxExponent;
1070 APInt::tcSetLeastSignificantBits(significandParts(), partCount(),
Neil Booth4f881702007-09-26 21:33:42 +00001071 semantics->precision);
Chris Lattnerb39cdde2007-08-20 22:49:32 +00001072
1073 return opInexact;
1074}
1075
Neil Boothb7dea4c2007-10-03 15:16:41 +00001076/* Returns TRUE if, when truncating the current number, with BIT the
1077 new LSB, with the given lost fraction and rounding mode, the result
1078 would need to be rounded away from zero (i.e., by increasing the
1079 signficand). This routine must work for fcZero of both signs, and
1080 fcNormal numbers. */
Chris Lattnerb39cdde2007-08-20 22:49:32 +00001081bool
1082APFloat::roundAwayFromZero(roundingMode rounding_mode,
Neil Boothb7dea4c2007-10-03 15:16:41 +00001083 lostFraction lost_fraction,
1084 unsigned int bit) const
Chris Lattnerb39cdde2007-08-20 22:49:32 +00001085{
Dale Johanneseneaf08942007-08-31 04:03:46 +00001086 /* NaNs and infinities should not have lost fractions. */
Chris Lattnerb39cdde2007-08-20 22:49:32 +00001087 assert(category == fcNormal || category == fcZero);
1088
Neil Boothb7dea4c2007-10-03 15:16:41 +00001089 /* Current callers never pass this so we don't handle it. */
Chris Lattnerb39cdde2007-08-20 22:49:32 +00001090 assert(lost_fraction != lfExactlyZero);
1091
Mike Stumpf3dc0c02009-05-13 23:23:20 +00001092 switch (rounding_mode) {
Chris Lattnerb39cdde2007-08-20 22:49:32 +00001093 default:
Torok Edwinc23197a2009-07-14 16:55:14 +00001094 llvm_unreachable(0);
Chris Lattnerb39cdde2007-08-20 22:49:32 +00001095
1096 case rmNearestTiesToAway:
1097 return lost_fraction == lfExactlyHalf || lost_fraction == lfMoreThanHalf;
1098
1099 case rmNearestTiesToEven:
1100 if(lost_fraction == lfMoreThanHalf)
1101 return true;
1102
1103 /* Our zeroes don't have a significand to test. */
1104 if(lost_fraction == lfExactlyHalf && category != fcZero)
Neil Boothb7dea4c2007-10-03 15:16:41 +00001105 return APInt::tcExtractBit(significandParts(), bit);
Chris Lattnerb39cdde2007-08-20 22:49:32 +00001106
1107 return false;
1108
1109 case rmTowardZero:
1110 return false;
1111
1112 case rmTowardPositive:
1113 return sign == false;
1114
1115 case rmTowardNegative:
1116 return sign == true;
1117 }
1118}
1119
1120APFloat::opStatus
1121APFloat::normalize(roundingMode rounding_mode,
Neil Booth4f881702007-09-26 21:33:42 +00001122 lostFraction lost_fraction)
Chris Lattnerb39cdde2007-08-20 22:49:32 +00001123{
Neil Booth4f881702007-09-26 21:33:42 +00001124 unsigned int omsb; /* One, not zero, based MSB. */
Chris Lattnerb39cdde2007-08-20 22:49:32 +00001125 int exponentChange;
1126
1127 if(category != fcNormal)
1128 return opOK;
1129
1130 /* Before rounding normalize the exponent of fcNormal numbers. */
1131 omsb = significandMSB() + 1;
1132
1133 if(omsb) {
1134 /* OMSB is numbered from 1. We want to place it in the integer
1135 bit numbered PRECISON if possible, with a compensating change in
1136 the exponent. */
1137 exponentChange = omsb - semantics->precision;
1138
1139 /* If the resulting exponent is too high, overflow according to
1140 the rounding mode. */
1141 if(exponent + exponentChange > semantics->maxExponent)
1142 return handleOverflow(rounding_mode);
1143
1144 /* Subnormal numbers have exponent minExponent, and their MSB
1145 is forced based on that. */
1146 if(exponent + exponentChange < semantics->minExponent)
1147 exponentChange = semantics->minExponent - exponent;
1148
1149 /* Shifting left is easy as we don't lose precision. */
1150 if(exponentChange < 0) {
1151 assert(lost_fraction == lfExactlyZero);
1152
1153 shiftSignificandLeft(-exponentChange);
1154
1155 return opOK;
1156 }
1157
1158 if(exponentChange > 0) {
1159 lostFraction lf;
1160
1161 /* Shift right and capture any new lost fraction. */
1162 lf = shiftSignificandRight(exponentChange);
1163
1164 lost_fraction = combineLostFractions(lf, lost_fraction);
1165
1166 /* Keep OMSB up-to-date. */
1167 if(omsb > (unsigned) exponentChange)
Neil Booth96c74712007-10-12 16:02:31 +00001168 omsb -= exponentChange;
Chris Lattnerb39cdde2007-08-20 22:49:32 +00001169 else
Neil Booth4f881702007-09-26 21:33:42 +00001170 omsb = 0;
Chris Lattnerb39cdde2007-08-20 22:49:32 +00001171 }
1172 }
1173
1174 /* Now round the number according to rounding_mode given the lost
1175 fraction. */
1176
1177 /* As specified in IEEE 754, since we do not trap we do not report
1178 underflow for exact results. */
1179 if(lost_fraction == lfExactlyZero) {
1180 /* Canonicalize zeroes. */
1181 if(omsb == 0)
1182 category = fcZero;
1183
1184 return opOK;
1185 }
1186
1187 /* Increment the significand if we're rounding away from zero. */
Neil Boothb7dea4c2007-10-03 15:16:41 +00001188 if(roundAwayFromZero(rounding_mode, lost_fraction, 0)) {
Chris Lattnerb39cdde2007-08-20 22:49:32 +00001189 if(omsb == 0)
1190 exponent = semantics->minExponent;
1191
1192 incrementSignificand();
1193 omsb = significandMSB() + 1;
1194
1195 /* Did the significand increment overflow? */
1196 if(omsb == (unsigned) semantics->precision + 1) {
1197 /* Renormalize by incrementing the exponent and shifting our
Neil Booth4f881702007-09-26 21:33:42 +00001198 significand right one. However if we already have the
1199 maximum exponent we overflow to infinity. */
Chris Lattnerb39cdde2007-08-20 22:49:32 +00001200 if(exponent == semantics->maxExponent) {
Neil Booth4f881702007-09-26 21:33:42 +00001201 category = fcInfinity;
Chris Lattnerb39cdde2007-08-20 22:49:32 +00001202
Neil Booth4f881702007-09-26 21:33:42 +00001203 return (opStatus) (opOverflow | opInexact);
Chris Lattnerb39cdde2007-08-20 22:49:32 +00001204 }
1205
1206 shiftSignificandRight(1);
1207
1208 return opInexact;
1209 }
1210 }
1211
1212 /* The normal case - we were and are not denormal, and any
1213 significand increment above didn't overflow. */
1214 if(omsb == semantics->precision)
1215 return opInexact;
1216
1217 /* We have a non-zero denormal. */
1218 assert(omsb < semantics->precision);
Chris Lattnerb39cdde2007-08-20 22:49:32 +00001219
1220 /* Canonicalize zeroes. */
1221 if(omsb == 0)
1222 category = fcZero;
1223
1224 /* The fcZero case is a denormal that underflowed to zero. */
1225 return (opStatus) (opUnderflow | opInexact);
1226}
1227
1228APFloat::opStatus
1229APFloat::addOrSubtractSpecials(const APFloat &rhs, bool subtract)
1230{
Mike Stumpf3dc0c02009-05-13 23:23:20 +00001231 switch (convolve(category, rhs.category)) {
Chris Lattnerb39cdde2007-08-20 22:49:32 +00001232 default:
Torok Edwinc23197a2009-07-14 16:55:14 +00001233 llvm_unreachable(0);
Chris Lattnerb39cdde2007-08-20 22:49:32 +00001234
Dale Johanneseneaf08942007-08-31 04:03:46 +00001235 case convolve(fcNaN, fcZero):
1236 case convolve(fcNaN, fcNormal):
1237 case convolve(fcNaN, fcInfinity):
1238 case convolve(fcNaN, fcNaN):
Chris Lattnerb39cdde2007-08-20 22:49:32 +00001239 case convolve(fcNormal, fcZero):
1240 case convolve(fcInfinity, fcNormal):
1241 case convolve(fcInfinity, fcZero):
1242 return opOK;
1243
Dale Johanneseneaf08942007-08-31 04:03:46 +00001244 case convolve(fcZero, fcNaN):
1245 case convolve(fcNormal, fcNaN):
1246 case convolve(fcInfinity, fcNaN):
1247 category = fcNaN;
1248 copySignificand(rhs);
Chris Lattnerb39cdde2007-08-20 22:49:32 +00001249 return opOK;
1250
1251 case convolve(fcNormal, fcInfinity):
1252 case convolve(fcZero, fcInfinity):
1253 category = fcInfinity;
1254 sign = rhs.sign ^ subtract;
1255 return opOK;
1256
1257 case convolve(fcZero, fcNormal):
1258 assign(rhs);
1259 sign = rhs.sign ^ subtract;
1260 return opOK;
1261
1262 case convolve(fcZero, fcZero):
1263 /* Sign depends on rounding mode; handled by caller. */
1264 return opOK;
1265
1266 case convolve(fcInfinity, fcInfinity):
1267 /* Differently signed infinities can only be validly
1268 subtracted. */
Cedric Venetaff9c272009-02-14 16:06:42 +00001269 if(((sign ^ rhs.sign)!=0) != subtract) {
Neil Boothe5e01942007-10-14 10:39:51 +00001270 makeNaN();
Chris Lattnerb39cdde2007-08-20 22:49:32 +00001271 return opInvalidOp;
1272 }
1273
1274 return opOK;
1275
1276 case convolve(fcNormal, fcNormal):
1277 return opDivByZero;
1278 }
1279}
1280
1281/* Add or subtract two normal numbers. */
1282lostFraction
1283APFloat::addOrSubtractSignificand(const APFloat &rhs, bool subtract)
1284{
1285 integerPart carry;
1286 lostFraction lost_fraction;
1287 int bits;
1288
1289 /* Determine if the operation on the absolute values is effectively
1290 an addition or subtraction. */
Hartmut Kaiser8df77a92007-10-25 23:15:31 +00001291 subtract ^= (sign ^ rhs.sign) ? true : false;
Chris Lattnerb39cdde2007-08-20 22:49:32 +00001292
1293 /* Are we bigger exponent-wise than the RHS? */
1294 bits = exponent - rhs.exponent;
1295
1296 /* Subtraction is more subtle than one might naively expect. */
1297 if(subtract) {
1298 APFloat temp_rhs(rhs);
1299 bool reverse;
1300
Chris Lattnerada530b2007-08-24 03:02:34 +00001301 if (bits == 0) {
Chris Lattnerb39cdde2007-08-20 22:49:32 +00001302 reverse = compareAbsoluteValue(temp_rhs) == cmpLessThan;
1303 lost_fraction = lfExactlyZero;
Chris Lattnerada530b2007-08-24 03:02:34 +00001304 } else if (bits > 0) {
Chris Lattnerb39cdde2007-08-20 22:49:32 +00001305 lost_fraction = temp_rhs.shiftSignificandRight(bits - 1);
1306 shiftSignificandLeft(1);
1307 reverse = false;
Chris Lattnerada530b2007-08-24 03:02:34 +00001308 } else {
Chris Lattnerb39cdde2007-08-20 22:49:32 +00001309 lost_fraction = shiftSignificandRight(-bits - 1);
1310 temp_rhs.shiftSignificandLeft(1);
1311 reverse = true;
1312 }
1313
Chris Lattnerada530b2007-08-24 03:02:34 +00001314 if (reverse) {
Chris Lattnerb39cdde2007-08-20 22:49:32 +00001315 carry = temp_rhs.subtractSignificand
Neil Booth4f881702007-09-26 21:33:42 +00001316 (*this, lost_fraction != lfExactlyZero);
Chris Lattnerb39cdde2007-08-20 22:49:32 +00001317 copySignificand(temp_rhs);
1318 sign = !sign;
1319 } else {
1320 carry = subtractSignificand
Neil Booth4f881702007-09-26 21:33:42 +00001321 (temp_rhs, lost_fraction != lfExactlyZero);
Chris Lattnerb39cdde2007-08-20 22:49:32 +00001322 }
1323
1324 /* Invert the lost fraction - it was on the RHS and
1325 subtracted. */
1326 if(lost_fraction == lfLessThanHalf)
1327 lost_fraction = lfMoreThanHalf;
1328 else if(lost_fraction == lfMoreThanHalf)
1329 lost_fraction = lfLessThanHalf;
1330
1331 /* The code above is intended to ensure that no borrow is
1332 necessary. */
1333 assert(!carry);
1334 } else {
1335 if(bits > 0) {
1336 APFloat temp_rhs(rhs);
1337
1338 lost_fraction = temp_rhs.shiftSignificandRight(bits);
1339 carry = addSignificand(temp_rhs);
1340 } else {
1341 lost_fraction = shiftSignificandRight(-bits);
1342 carry = addSignificand(rhs);
1343 }
1344
1345 /* We have a guard bit; generating a carry cannot happen. */
1346 assert(!carry);
1347 }
1348
1349 return lost_fraction;
1350}
1351
1352APFloat::opStatus
1353APFloat::multiplySpecials(const APFloat &rhs)
1354{
Mike Stumpf3dc0c02009-05-13 23:23:20 +00001355 switch (convolve(category, rhs.category)) {
Chris Lattnerb39cdde2007-08-20 22:49:32 +00001356 default:
Torok Edwinc23197a2009-07-14 16:55:14 +00001357 llvm_unreachable(0);
Chris Lattnerb39cdde2007-08-20 22:49:32 +00001358
Dale Johanneseneaf08942007-08-31 04:03:46 +00001359 case convolve(fcNaN, fcZero):
1360 case convolve(fcNaN, fcNormal):
1361 case convolve(fcNaN, fcInfinity):
1362 case convolve(fcNaN, fcNaN):
1363 return opOK;
1364
1365 case convolve(fcZero, fcNaN):
1366 case convolve(fcNormal, fcNaN):
1367 case convolve(fcInfinity, fcNaN):
1368 category = fcNaN;
1369 copySignificand(rhs);
Chris Lattnerb39cdde2007-08-20 22:49:32 +00001370 return opOK;
1371
1372 case convolve(fcNormal, fcInfinity):
1373 case convolve(fcInfinity, fcNormal):
1374 case convolve(fcInfinity, fcInfinity):
1375 category = fcInfinity;
1376 return opOK;
1377
1378 case convolve(fcZero, fcNormal):
1379 case convolve(fcNormal, fcZero):
1380 case convolve(fcZero, fcZero):
1381 category = fcZero;
1382 return opOK;
1383
1384 case convolve(fcZero, fcInfinity):
1385 case convolve(fcInfinity, fcZero):
Neil Boothe5e01942007-10-14 10:39:51 +00001386 makeNaN();
Chris Lattnerb39cdde2007-08-20 22:49:32 +00001387 return opInvalidOp;
1388
1389 case convolve(fcNormal, fcNormal):
1390 return opOK;
1391 }
1392}
1393
1394APFloat::opStatus
1395APFloat::divideSpecials(const APFloat &rhs)
1396{
Mike Stumpf3dc0c02009-05-13 23:23:20 +00001397 switch (convolve(category, rhs.category)) {
Chris Lattnerb39cdde2007-08-20 22:49:32 +00001398 default:
Torok Edwinc23197a2009-07-14 16:55:14 +00001399 llvm_unreachable(0);
Chris Lattnerb39cdde2007-08-20 22:49:32 +00001400
Dale Johanneseneaf08942007-08-31 04:03:46 +00001401 case convolve(fcNaN, fcZero):
1402 case convolve(fcNaN, fcNormal):
1403 case convolve(fcNaN, fcInfinity):
1404 case convolve(fcNaN, fcNaN):
Chris Lattnerb39cdde2007-08-20 22:49:32 +00001405 case convolve(fcInfinity, fcZero):
1406 case convolve(fcInfinity, fcNormal):
1407 case convolve(fcZero, fcInfinity):
1408 case convolve(fcZero, fcNormal):
1409 return opOK;
1410
Dale Johanneseneaf08942007-08-31 04:03:46 +00001411 case convolve(fcZero, fcNaN):
1412 case convolve(fcNormal, fcNaN):
1413 case convolve(fcInfinity, fcNaN):
1414 category = fcNaN;
1415 copySignificand(rhs);
Chris Lattnerb39cdde2007-08-20 22:49:32 +00001416 return opOK;
1417
1418 case convolve(fcNormal, fcInfinity):
1419 category = fcZero;
1420 return opOK;
1421
1422 case convolve(fcNormal, fcZero):
1423 category = fcInfinity;
1424 return opDivByZero;
1425
1426 case convolve(fcInfinity, fcInfinity):
1427 case convolve(fcZero, fcZero):
Neil Boothe5e01942007-10-14 10:39:51 +00001428 makeNaN();
Chris Lattnerb39cdde2007-08-20 22:49:32 +00001429 return opInvalidOp;
1430
1431 case convolve(fcNormal, fcNormal):
1432 return opOK;
1433 }
1434}
1435
Dale Johannesened6af242009-01-21 00:35:19 +00001436APFloat::opStatus
1437APFloat::modSpecials(const APFloat &rhs)
1438{
Mike Stumpf3dc0c02009-05-13 23:23:20 +00001439 switch (convolve(category, rhs.category)) {
Dale Johannesened6af242009-01-21 00:35:19 +00001440 default:
Torok Edwinc23197a2009-07-14 16:55:14 +00001441 llvm_unreachable(0);
Dale Johannesened6af242009-01-21 00:35:19 +00001442
1443 case convolve(fcNaN, fcZero):
1444 case convolve(fcNaN, fcNormal):
1445 case convolve(fcNaN, fcInfinity):
1446 case convolve(fcNaN, fcNaN):
1447 case convolve(fcZero, fcInfinity):
1448 case convolve(fcZero, fcNormal):
1449 case convolve(fcNormal, fcInfinity):
1450 return opOK;
1451
1452 case convolve(fcZero, fcNaN):
1453 case convolve(fcNormal, fcNaN):
1454 case convolve(fcInfinity, fcNaN):
1455 category = fcNaN;
1456 copySignificand(rhs);
1457 return opOK;
1458
1459 case convolve(fcNormal, fcZero):
1460 case convolve(fcInfinity, fcZero):
1461 case convolve(fcInfinity, fcNormal):
1462 case convolve(fcInfinity, fcInfinity):
1463 case convolve(fcZero, fcZero):
1464 makeNaN();
1465 return opInvalidOp;
1466
1467 case convolve(fcNormal, fcNormal):
1468 return opOK;
1469 }
1470}
1471
Chris Lattnerb39cdde2007-08-20 22:49:32 +00001472/* Change sign. */
1473void
1474APFloat::changeSign()
1475{
1476 /* Look mummy, this one's easy. */
1477 sign = !sign;
1478}
1479
Dale Johannesene15c2db2007-08-31 23:35:31 +00001480void
1481APFloat::clearSign()
1482{
1483 /* So is this one. */
1484 sign = 0;
1485}
1486
1487void
1488APFloat::copySign(const APFloat &rhs)
1489{
1490 /* And this one. */
1491 sign = rhs.sign;
1492}
1493
Chris Lattnerb39cdde2007-08-20 22:49:32 +00001494/* Normalized addition or subtraction. */
1495APFloat::opStatus
1496APFloat::addOrSubtract(const APFloat &rhs, roundingMode rounding_mode,
Neil Booth4f881702007-09-26 21:33:42 +00001497 bool subtract)
Chris Lattnerb39cdde2007-08-20 22:49:32 +00001498{
1499 opStatus fs;
1500
Neil Boothcaf19d72007-10-14 10:29:28 +00001501 assertArithmeticOK(*semantics);
1502
Chris Lattnerb39cdde2007-08-20 22:49:32 +00001503 fs = addOrSubtractSpecials(rhs, subtract);
1504
1505 /* This return code means it was not a simple case. */
1506 if(fs == opDivByZero) {
1507 lostFraction lost_fraction;
1508
1509 lost_fraction = addOrSubtractSignificand(rhs, subtract);
1510 fs = normalize(rounding_mode, lost_fraction);
1511
1512 /* Can only be zero if we lost no fraction. */
1513 assert(category != fcZero || lost_fraction == lfExactlyZero);
1514 }
1515
1516 /* If two numbers add (exactly) to zero, IEEE 754 decrees it is a
1517 positive zero unless rounding to minus infinity, except that
1518 adding two like-signed zeroes gives that zero. */
1519 if(category == fcZero) {
1520 if(rhs.category != fcZero || (sign == rhs.sign) == subtract)
1521 sign = (rounding_mode == rmTowardNegative);
1522 }
1523
1524 return fs;
1525}
1526
1527/* Normalized addition. */
1528APFloat::opStatus
1529APFloat::add(const APFloat &rhs, roundingMode rounding_mode)
1530{
1531 return addOrSubtract(rhs, rounding_mode, false);
1532}
1533
1534/* Normalized subtraction. */
1535APFloat::opStatus
1536APFloat::subtract(const APFloat &rhs, roundingMode rounding_mode)
1537{
1538 return addOrSubtract(rhs, rounding_mode, true);
1539}
1540
1541/* Normalized multiply. */
1542APFloat::opStatus
1543APFloat::multiply(const APFloat &rhs, roundingMode rounding_mode)
1544{
1545 opStatus fs;
1546
Neil Boothcaf19d72007-10-14 10:29:28 +00001547 assertArithmeticOK(*semantics);
Chris Lattnerb39cdde2007-08-20 22:49:32 +00001548 sign ^= rhs.sign;
1549 fs = multiplySpecials(rhs);
1550
1551 if(category == fcNormal) {
1552 lostFraction lost_fraction = multiplySignificand(rhs, 0);
1553 fs = normalize(rounding_mode, lost_fraction);
1554 if(lost_fraction != lfExactlyZero)
1555 fs = (opStatus) (fs | opInexact);
1556 }
1557
1558 return fs;
1559}
1560
1561/* Normalized divide. */
1562APFloat::opStatus
1563APFloat::divide(const APFloat &rhs, roundingMode rounding_mode)
1564{
1565 opStatus fs;
1566
Neil Boothcaf19d72007-10-14 10:29:28 +00001567 assertArithmeticOK(*semantics);
Chris Lattnerb39cdde2007-08-20 22:49:32 +00001568 sign ^= rhs.sign;
1569 fs = divideSpecials(rhs);
1570
1571 if(category == fcNormal) {
1572 lostFraction lost_fraction = divideSignificand(rhs);
1573 fs = normalize(rounding_mode, lost_fraction);
1574 if(lost_fraction != lfExactlyZero)
1575 fs = (opStatus) (fs | opInexact);
1576 }
1577
1578 return fs;
1579}
1580
Dale Johannesen24b66a82009-01-20 18:35:05 +00001581/* Normalized remainder. This is not currently correct in all cases. */
1582APFloat::opStatus
1583APFloat::remainder(const APFloat &rhs)
1584{
1585 opStatus fs;
1586 APFloat V = *this;
1587 unsigned int origSign = sign;
1588
1589 assertArithmeticOK(*semantics);
1590 fs = V.divide(rhs, rmNearestTiesToEven);
1591 if (fs == opDivByZero)
1592 return fs;
1593
1594 int parts = partCount();
1595 integerPart *x = new integerPart[parts];
1596 bool ignored;
1597 fs = V.convertToInteger(x, parts * integerPartWidth, true,
1598 rmNearestTiesToEven, &ignored);
1599 if (fs==opInvalidOp)
1600 return fs;
1601
1602 fs = V.convertFromZeroExtendedInteger(x, parts * integerPartWidth, true,
1603 rmNearestTiesToEven);
1604 assert(fs==opOK); // should always work
1605
1606 fs = V.multiply(rhs, rmNearestTiesToEven);
1607 assert(fs==opOK || fs==opInexact); // should not overflow or underflow
1608
1609 fs = subtract(V, rmNearestTiesToEven);
1610 assert(fs==opOK || fs==opInexact); // likewise
1611
1612 if (isZero())
1613 sign = origSign; // IEEE754 requires this
1614 delete[] x;
1615 return fs;
1616}
1617
1618/* Normalized llvm frem (C fmod).
1619 This is not currently correct in all cases. */
Dale Johannesene15c2db2007-08-31 23:35:31 +00001620APFloat::opStatus
1621APFloat::mod(const APFloat &rhs, roundingMode rounding_mode)
1622{
1623 opStatus fs;
Neil Boothcaf19d72007-10-14 10:29:28 +00001624 assertArithmeticOK(*semantics);
Dale Johannesened6af242009-01-21 00:35:19 +00001625 fs = modSpecials(rhs);
Dale Johannesene15c2db2007-08-31 23:35:31 +00001626
Dale Johannesened6af242009-01-21 00:35:19 +00001627 if (category == fcNormal && rhs.category == fcNormal) {
1628 APFloat V = *this;
1629 unsigned int origSign = sign;
Dale Johannesene15c2db2007-08-31 23:35:31 +00001630
Dale Johannesened6af242009-01-21 00:35:19 +00001631 fs = V.divide(rhs, rmNearestTiesToEven);
1632 if (fs == opDivByZero)
1633 return fs;
Dale Johannesen58c2e4c2007-09-05 20:39:49 +00001634
Dale Johannesened6af242009-01-21 00:35:19 +00001635 int parts = partCount();
1636 integerPart *x = new integerPart[parts];
1637 bool ignored;
1638 fs = V.convertToInteger(x, parts * integerPartWidth, true,
1639 rmTowardZero, &ignored);
1640 if (fs==opInvalidOp)
1641 return fs;
Dale Johannesen58c2e4c2007-09-05 20:39:49 +00001642
Dale Johannesened6af242009-01-21 00:35:19 +00001643 fs = V.convertFromZeroExtendedInteger(x, parts * integerPartWidth, true,
1644 rmNearestTiesToEven);
1645 assert(fs==opOK); // should always work
Dale Johannesen58c2e4c2007-09-05 20:39:49 +00001646
Dale Johannesened6af242009-01-21 00:35:19 +00001647 fs = V.multiply(rhs, rounding_mode);
1648 assert(fs==opOK || fs==opInexact); // should not overflow or underflow
1649
1650 fs = subtract(V, rounding_mode);
1651 assert(fs==opOK || fs==opInexact); // likewise
1652
1653 if (isZero())
1654 sign = origSign; // IEEE754 requires this
1655 delete[] x;
1656 }
Dale Johannesene15c2db2007-08-31 23:35:31 +00001657 return fs;
1658}
1659
Chris Lattnerb39cdde2007-08-20 22:49:32 +00001660/* Normalized fused-multiply-add. */
1661APFloat::opStatus
1662APFloat::fusedMultiplyAdd(const APFloat &multiplicand,
Neil Booth4f881702007-09-26 21:33:42 +00001663 const APFloat &addend,
1664 roundingMode rounding_mode)
Chris Lattnerb39cdde2007-08-20 22:49:32 +00001665{
1666 opStatus fs;
1667
Neil Boothcaf19d72007-10-14 10:29:28 +00001668 assertArithmeticOK(*semantics);
1669
Chris Lattnerb39cdde2007-08-20 22:49:32 +00001670 /* Post-multiplication sign, before addition. */
1671 sign ^= multiplicand.sign;
1672
1673 /* If and only if all arguments are normal do we need to do an
1674 extended-precision calculation. */
1675 if(category == fcNormal
1676 && multiplicand.category == fcNormal
1677 && addend.category == fcNormal) {
1678 lostFraction lost_fraction;
1679
1680 lost_fraction = multiplySignificand(multiplicand, &addend);
1681 fs = normalize(rounding_mode, lost_fraction);
1682 if(lost_fraction != lfExactlyZero)
1683 fs = (opStatus) (fs | opInexact);
1684
1685 /* If two numbers add (exactly) to zero, IEEE 754 decrees it is a
1686 positive zero unless rounding to minus infinity, except that
1687 adding two like-signed zeroes gives that zero. */
1688 if(category == fcZero && sign != addend.sign)
1689 sign = (rounding_mode == rmTowardNegative);
1690 } else {
1691 fs = multiplySpecials(multiplicand);
1692
1693 /* FS can only be opOK or opInvalidOp. There is no more work
1694 to do in the latter case. The IEEE-754R standard says it is
1695 implementation-defined in this case whether, if ADDEND is a
Dale Johanneseneaf08942007-08-31 04:03:46 +00001696 quiet NaN, we raise invalid op; this implementation does so.
Chris Lattnerb39cdde2007-08-20 22:49:32 +00001697
1698 If we need to do the addition we can do so with normal
1699 precision. */
1700 if(fs == opOK)
1701 fs = addOrSubtract(addend, rounding_mode, false);
1702 }
1703
1704 return fs;
1705}
1706
1707/* Comparison requires normalized numbers. */
1708APFloat::cmpResult
1709APFloat::compare(const APFloat &rhs) const
1710{
1711 cmpResult result;
1712
Neil Boothcaf19d72007-10-14 10:29:28 +00001713 assertArithmeticOK(*semantics);
Chris Lattnerb39cdde2007-08-20 22:49:32 +00001714 assert(semantics == rhs.semantics);
1715
Mike Stumpf3dc0c02009-05-13 23:23:20 +00001716 switch (convolve(category, rhs.category)) {
Chris Lattnerb39cdde2007-08-20 22:49:32 +00001717 default:
Torok Edwinc23197a2009-07-14 16:55:14 +00001718 llvm_unreachable(0);
Chris Lattnerb39cdde2007-08-20 22:49:32 +00001719
Dale Johanneseneaf08942007-08-31 04:03:46 +00001720 case convolve(fcNaN, fcZero):
1721 case convolve(fcNaN, fcNormal):
1722 case convolve(fcNaN, fcInfinity):
1723 case convolve(fcNaN, fcNaN):
1724 case convolve(fcZero, fcNaN):
1725 case convolve(fcNormal, fcNaN):
1726 case convolve(fcInfinity, fcNaN):
Chris Lattnerb39cdde2007-08-20 22:49:32 +00001727 return cmpUnordered;
1728
1729 case convolve(fcInfinity, fcNormal):
1730 case convolve(fcInfinity, fcZero):
1731 case convolve(fcNormal, fcZero):
1732 if(sign)
1733 return cmpLessThan;
1734 else
1735 return cmpGreaterThan;
1736
1737 case convolve(fcNormal, fcInfinity):
1738 case convolve(fcZero, fcInfinity):
1739 case convolve(fcZero, fcNormal):
1740 if(rhs.sign)
1741 return cmpGreaterThan;
1742 else
1743 return cmpLessThan;
1744
1745 case convolve(fcInfinity, fcInfinity):
1746 if(sign == rhs.sign)
1747 return cmpEqual;
1748 else if(sign)
1749 return cmpLessThan;
1750 else
1751 return cmpGreaterThan;
1752
1753 case convolve(fcZero, fcZero):
1754 return cmpEqual;
1755
1756 case convolve(fcNormal, fcNormal):
1757 break;
1758 }
1759
1760 /* Two normal numbers. Do they have the same sign? */
1761 if(sign != rhs.sign) {
1762 if(sign)
1763 result = cmpLessThan;
1764 else
1765 result = cmpGreaterThan;
1766 } else {
1767 /* Compare absolute values; invert result if negative. */
1768 result = compareAbsoluteValue(rhs);
1769
1770 if(sign) {
1771 if(result == cmpLessThan)
Neil Booth4f881702007-09-26 21:33:42 +00001772 result = cmpGreaterThan;
Chris Lattnerb39cdde2007-08-20 22:49:32 +00001773 else if(result == cmpGreaterThan)
Neil Booth4f881702007-09-26 21:33:42 +00001774 result = cmpLessThan;
Chris Lattnerb39cdde2007-08-20 22:49:32 +00001775 }
1776 }
1777
1778 return result;
1779}
1780
Dale Johannesen23a98552008-10-09 23:00:39 +00001781/// APFloat::convert - convert a value of one floating point type to another.
1782/// The return value corresponds to the IEEE754 exceptions. *losesInfo
1783/// records whether the transformation lost information, i.e. whether
1784/// converting the result back to the original type will produce the
1785/// original value (this is almost the same as return value==fsOK, but there
1786/// are edge cases where this is not so).
1787
Chris Lattnerb39cdde2007-08-20 22:49:32 +00001788APFloat::opStatus
1789APFloat::convert(const fltSemantics &toSemantics,
Dale Johannesen23a98552008-10-09 23:00:39 +00001790 roundingMode rounding_mode, bool *losesInfo)
Chris Lattnerb39cdde2007-08-20 22:49:32 +00001791{
Neil Boothc8db43d2007-09-22 02:56:19 +00001792 lostFraction lostFraction;
1793 unsigned int newPartCount, oldPartCount;
Chris Lattnerb39cdde2007-08-20 22:49:32 +00001794 opStatus fs;
Neil Booth4f881702007-09-26 21:33:42 +00001795
Neil Boothcaf19d72007-10-14 10:29:28 +00001796 assertArithmeticOK(*semantics);
Dale Johannesen79f82f92008-04-20 01:34:03 +00001797 assertArithmeticOK(toSemantics);
Neil Boothc8db43d2007-09-22 02:56:19 +00001798 lostFraction = lfExactlyZero;
Chris Lattnerb39cdde2007-08-20 22:49:32 +00001799 newPartCount = partCountForBits(toSemantics.precision + 1);
Neil Boothc8db43d2007-09-22 02:56:19 +00001800 oldPartCount = partCount();
Chris Lattnerb39cdde2007-08-20 22:49:32 +00001801
Neil Boothc8db43d2007-09-22 02:56:19 +00001802 /* Handle storage complications. If our new form is wider,
1803 re-allocate our bit pattern into wider storage. If it is
1804 narrower, we ignore the excess parts, but if narrowing to a
Dale Johannesen902ff942007-09-25 17:25:00 +00001805 single part we need to free the old storage.
1806 Be careful not to reference significandParts for zeroes
1807 and infinities, since it aborts. */
Neil Boothc8db43d2007-09-22 02:56:19 +00001808 if (newPartCount > oldPartCount) {
Chris Lattnerb39cdde2007-08-20 22:49:32 +00001809 integerPart *newParts;
Chris Lattnerb39cdde2007-08-20 22:49:32 +00001810 newParts = new integerPart[newPartCount];
1811 APInt::tcSet(newParts, 0, newPartCount);
Dale Johannesen902ff942007-09-25 17:25:00 +00001812 if (category==fcNormal || category==fcNaN)
1813 APInt::tcAssign(newParts, significandParts(), oldPartCount);
Chris Lattnerb39cdde2007-08-20 22:49:32 +00001814 freeSignificand();
1815 significand.parts = newParts;
Neil Boothc8db43d2007-09-22 02:56:19 +00001816 } else if (newPartCount < oldPartCount) {
1817 /* Capture any lost fraction through truncation of parts so we get
1818 correct rounding whilst normalizing. */
Dale Johannesen902ff942007-09-25 17:25:00 +00001819 if (category==fcNormal)
1820 lostFraction = lostFractionThroughTruncation
1821 (significandParts(), oldPartCount, toSemantics.precision);
1822 if (newPartCount == 1) {
1823 integerPart newPart = 0;
Neil Booth4f881702007-09-26 21:33:42 +00001824 if (category==fcNormal || category==fcNaN)
Dale Johannesen902ff942007-09-25 17:25:00 +00001825 newPart = significandParts()[0];
1826 freeSignificand();
1827 significand.part = newPart;
1828 }
Chris Lattnerb39cdde2007-08-20 22:49:32 +00001829 }
1830
1831 if(category == fcNormal) {
1832 /* Re-interpret our bit-pattern. */
1833 exponent += toSemantics.precision - semantics->precision;
1834 semantics = &toSemantics;
Neil Boothc8db43d2007-09-22 02:56:19 +00001835 fs = normalize(rounding_mode, lostFraction);
Dale Johannesen23a98552008-10-09 23:00:39 +00001836 *losesInfo = (fs != opOK);
Dale Johannesen902ff942007-09-25 17:25:00 +00001837 } else if (category == fcNaN) {
1838 int shift = toSemantics.precision - semantics->precision;
Dale Johannesenb63fa052008-01-31 18:34:01 +00001839 // Do this now so significandParts gets the right answer
Dale Johannesen2df5eec2008-10-06 22:59:10 +00001840 const fltSemantics *oldSemantics = semantics;
Dale Johannesenb63fa052008-01-31 18:34:01 +00001841 semantics = &toSemantics;
Dale Johannesen23a98552008-10-09 23:00:39 +00001842 *losesInfo = false;
Dale Johannesen902ff942007-09-25 17:25:00 +00001843 // No normalization here, just truncate
1844 if (shift>0)
1845 APInt::tcShiftLeft(significandParts(), newPartCount, shift);
Dale Johannesen2df5eec2008-10-06 22:59:10 +00001846 else if (shift < 0) {
1847 unsigned ushift = -shift;
Dale Johannesen23a98552008-10-09 23:00:39 +00001848 // Figure out if we are losing information. This happens
Dale Johannesen2df5eec2008-10-06 22:59:10 +00001849 // if are shifting out something other than 0s, or if the x87 long
1850 // double input did not have its integer bit set (pseudo-NaN), or if the
1851 // x87 long double input did not have its QNan bit set (because the x87
1852 // hardware sets this bit when converting a lower-precision NaN to
1853 // x87 long double).
1854 if (APInt::tcLSB(significandParts(), newPartCount) < ushift)
Dale Johannesen23a98552008-10-09 23:00:39 +00001855 *losesInfo = true;
Dale Johannesen2df5eec2008-10-06 22:59:10 +00001856 if (oldSemantics == &APFloat::x87DoubleExtended &&
1857 (!(*significandParts() & 0x8000000000000000ULL) ||
1858 !(*significandParts() & 0x4000000000000000ULL)))
Dale Johannesen23a98552008-10-09 23:00:39 +00001859 *losesInfo = true;
Dale Johannesen2df5eec2008-10-06 22:59:10 +00001860 APInt::tcShiftRight(significandParts(), newPartCount, ushift);
1861 }
Dale Johannesen902ff942007-09-25 17:25:00 +00001862 // gcc forces the Quiet bit on, which means (float)(double)(float_sNan)
1863 // does not give you back the same bits. This is dubious, and we
1864 // don't currently do it. You're really supposed to get
1865 // an invalid operation signal at runtime, but nobody does that.
Dale Johannesen23a98552008-10-09 23:00:39 +00001866 fs = opOK;
Chris Lattnerb39cdde2007-08-20 22:49:32 +00001867 } else {
1868 semantics = &toSemantics;
1869 fs = opOK;
Dale Johannesen23a98552008-10-09 23:00:39 +00001870 *losesInfo = false;
Chris Lattnerb39cdde2007-08-20 22:49:32 +00001871 }
1872
1873 return fs;
1874}
1875
1876/* Convert a floating point number to an integer according to the
1877 rounding mode. If the rounded integer value is out of range this
Neil Boothee7ae382007-11-01 22:43:37 +00001878 returns an invalid operation exception and the contents of the
1879 destination parts are unspecified. If the rounded value is in
Chris Lattnerb39cdde2007-08-20 22:49:32 +00001880 range but the floating point number is not the exact integer, the C
1881 standard doesn't require an inexact exception to be raised. IEEE
1882 854 does require it so we do that.
1883
1884 Note that for conversions to integer type the C standard requires
1885 round-to-zero to always be used. */
1886APFloat::opStatus
Neil Boothee7ae382007-11-01 22:43:37 +00001887APFloat::convertToSignExtendedInteger(integerPart *parts, unsigned int width,
1888 bool isSigned,
Dale Johannesen23a98552008-10-09 23:00:39 +00001889 roundingMode rounding_mode,
1890 bool *isExact) const
Neil Boothee7ae382007-11-01 22:43:37 +00001891{
1892 lostFraction lost_fraction;
1893 const integerPart *src;
1894 unsigned int dstPartsCount, truncatedBits;
1895
Evan Cheng794a7db2008-11-26 01:11:57 +00001896 assertArithmeticOK(*semantics);
Neil Boothe3d936a2007-11-02 15:10:05 +00001897
Dale Johannesen23a98552008-10-09 23:00:39 +00001898 *isExact = false;
1899
Neil Boothee7ae382007-11-01 22:43:37 +00001900 /* Handle the three special cases first. */
1901 if(category == fcInfinity || category == fcNaN)
1902 return opInvalidOp;
1903
1904 dstPartsCount = partCountForBits(width);
1905
1906 if(category == fcZero) {
1907 APInt::tcSet(parts, 0, dstPartsCount);
Dale Johannesene4a42452008-10-07 00:40:01 +00001908 // Negative zero can't be represented as an int.
Dale Johannesen23a98552008-10-09 23:00:39 +00001909 *isExact = !sign;
1910 return opOK;
Neil Boothee7ae382007-11-01 22:43:37 +00001911 }
1912
1913 src = significandParts();
1914
1915 /* Step 1: place our absolute value, with any fraction truncated, in
1916 the destination. */
1917 if (exponent < 0) {
1918 /* Our absolute value is less than one; truncate everything. */
1919 APInt::tcSet(parts, 0, dstPartsCount);
Dale Johannesen1f54f582009-01-19 21:17:05 +00001920 /* For exponent -1 the integer bit represents .5, look at that.
1921 For smaller exponents leftmost truncated bit is 0. */
1922 truncatedBits = semantics->precision -1U - exponent;
Neil Boothee7ae382007-11-01 22:43:37 +00001923 } else {
1924 /* We want the most significant (exponent + 1) bits; the rest are
1925 truncated. */
1926 unsigned int bits = exponent + 1U;
1927
1928 /* Hopelessly large in magnitude? */
1929 if (bits > width)
1930 return opInvalidOp;
1931
1932 if (bits < semantics->precision) {
1933 /* We truncate (semantics->precision - bits) bits. */
1934 truncatedBits = semantics->precision - bits;
1935 APInt::tcExtract(parts, dstPartsCount, src, bits, truncatedBits);
1936 } else {
1937 /* We want at least as many bits as are available. */
1938 APInt::tcExtract(parts, dstPartsCount, src, semantics->precision, 0);
1939 APInt::tcShiftLeft(parts, dstPartsCount, bits - semantics->precision);
1940 truncatedBits = 0;
1941 }
1942 }
1943
1944 /* Step 2: work out any lost fraction, and increment the absolute
1945 value if we would round away from zero. */
1946 if (truncatedBits) {
1947 lost_fraction = lostFractionThroughTruncation(src, partCount(),
1948 truncatedBits);
1949 if (lost_fraction != lfExactlyZero
1950 && roundAwayFromZero(rounding_mode, lost_fraction, truncatedBits)) {
1951 if (APInt::tcIncrement(parts, dstPartsCount))
1952 return opInvalidOp; /* Overflow. */
1953 }
1954 } else {
1955 lost_fraction = lfExactlyZero;
1956 }
1957
1958 /* Step 3: check if we fit in the destination. */
1959 unsigned int omsb = APInt::tcMSB(parts, dstPartsCount) + 1;
1960
1961 if (sign) {
1962 if (!isSigned) {
1963 /* Negative numbers cannot be represented as unsigned. */
1964 if (omsb != 0)
1965 return opInvalidOp;
1966 } else {
1967 /* It takes omsb bits to represent the unsigned integer value.
1968 We lose a bit for the sign, but care is needed as the
1969 maximally negative integer is a special case. */
1970 if (omsb == width && APInt::tcLSB(parts, dstPartsCount) + 1 != omsb)
1971 return opInvalidOp;
1972
1973 /* This case can happen because of rounding. */
1974 if (omsb > width)
1975 return opInvalidOp;
1976 }
1977
1978 APInt::tcNegate (parts, dstPartsCount);
1979 } else {
1980 if (omsb >= width + !isSigned)
1981 return opInvalidOp;
1982 }
1983
Dale Johannesen23a98552008-10-09 23:00:39 +00001984 if (lost_fraction == lfExactlyZero) {
1985 *isExact = true;
Neil Boothee7ae382007-11-01 22:43:37 +00001986 return opOK;
Dale Johannesen23a98552008-10-09 23:00:39 +00001987 } else
Neil Boothee7ae382007-11-01 22:43:37 +00001988 return opInexact;
1989}
1990
1991/* Same as convertToSignExtendedInteger, except we provide
1992 deterministic values in case of an invalid operation exception,
1993 namely zero for NaNs and the minimal or maximal value respectively
Dale Johannesen23a98552008-10-09 23:00:39 +00001994 for underflow or overflow.
1995 The *isExact output tells whether the result is exact, in the sense
1996 that converting it back to the original floating point type produces
1997 the original value. This is almost equivalent to result==opOK,
1998 except for negative zeroes.
1999*/
Neil Boothee7ae382007-11-01 22:43:37 +00002000APFloat::opStatus
Chris Lattnerb39cdde2007-08-20 22:49:32 +00002001APFloat::convertToInteger(integerPart *parts, unsigned int width,
Neil Booth4f881702007-09-26 21:33:42 +00002002 bool isSigned,
Dale Johannesen23a98552008-10-09 23:00:39 +00002003 roundingMode rounding_mode, bool *isExact) const
Chris Lattnerb39cdde2007-08-20 22:49:32 +00002004{
Neil Boothee7ae382007-11-01 22:43:37 +00002005 opStatus fs;
Chris Lattnerb39cdde2007-08-20 22:49:32 +00002006
Dale Johannesen23a98552008-10-09 23:00:39 +00002007 fs = convertToSignExtendedInteger(parts, width, isSigned, rounding_mode,
2008 isExact);
Chris Lattnerb39cdde2007-08-20 22:49:32 +00002009
Neil Boothee7ae382007-11-01 22:43:37 +00002010 if (fs == opInvalidOp) {
2011 unsigned int bits, dstPartsCount;
2012
2013 dstPartsCount = partCountForBits(width);
2014
2015 if (category == fcNaN)
2016 bits = 0;
2017 else if (sign)
2018 bits = isSigned;
2019 else
2020 bits = width - isSigned;
2021
2022 APInt::tcSetLeastSignificantBits(parts, dstPartsCount, bits);
2023 if (sign && isSigned)
2024 APInt::tcShiftLeft(parts, dstPartsCount, width - 1);
Chris Lattnerb39cdde2007-08-20 22:49:32 +00002025 }
2026
Neil Boothee7ae382007-11-01 22:43:37 +00002027 return fs;
Chris Lattnerb39cdde2007-08-20 22:49:32 +00002028}
2029
Neil Booth643ce592007-10-07 12:07:53 +00002030/* Convert an unsigned integer SRC to a floating point number,
2031 rounding according to ROUNDING_MODE. The sign of the floating
2032 point number is not modified. */
Chris Lattnerb39cdde2007-08-20 22:49:32 +00002033APFloat::opStatus
Neil Booth643ce592007-10-07 12:07:53 +00002034APFloat::convertFromUnsignedParts(const integerPart *src,
2035 unsigned int srcCount,
2036 roundingMode rounding_mode)
Chris Lattnerb39cdde2007-08-20 22:49:32 +00002037{
Neil Booth5477f852007-10-08 14:39:42 +00002038 unsigned int omsb, precision, dstCount;
Neil Booth643ce592007-10-07 12:07:53 +00002039 integerPart *dst;
Neil Booth5477f852007-10-08 14:39:42 +00002040 lostFraction lost_fraction;
Chris Lattnerb39cdde2007-08-20 22:49:32 +00002041
Neil Boothcaf19d72007-10-14 10:29:28 +00002042 assertArithmeticOK(*semantics);
Chris Lattnerb39cdde2007-08-20 22:49:32 +00002043 category = fcNormal;
Neil Booth5477f852007-10-08 14:39:42 +00002044 omsb = APInt::tcMSB(src, srcCount) + 1;
Neil Booth643ce592007-10-07 12:07:53 +00002045 dst = significandParts();
2046 dstCount = partCount();
Neil Booth5477f852007-10-08 14:39:42 +00002047 precision = semantics->precision;
Neil Booth643ce592007-10-07 12:07:53 +00002048
Neil Booth5477f852007-10-08 14:39:42 +00002049 /* We want the most significant PRECISON bits of SRC. There may not
2050 be that many; extract what we can. */
2051 if (precision <= omsb) {
2052 exponent = omsb - 1;
Neil Booth643ce592007-10-07 12:07:53 +00002053 lost_fraction = lostFractionThroughTruncation(src, srcCount,
Neil Booth5477f852007-10-08 14:39:42 +00002054 omsb - precision);
2055 APInt::tcExtract(dst, dstCount, src, precision, omsb - precision);
2056 } else {
2057 exponent = precision - 1;
2058 lost_fraction = lfExactlyZero;
2059 APInt::tcExtract(dst, dstCount, src, omsb, 0);
Neil Booth643ce592007-10-07 12:07:53 +00002060 }
Chris Lattnerb39cdde2007-08-20 22:49:32 +00002061
2062 return normalize(rounding_mode, lost_fraction);
2063}
2064
Dan Gohman93c276e2008-02-29 01:26:11 +00002065APFloat::opStatus
2066APFloat::convertFromAPInt(const APInt &Val,
2067 bool isSigned,
2068 roundingMode rounding_mode)
2069{
2070 unsigned int partCount = Val.getNumWords();
2071 APInt api = Val;
2072
2073 sign = false;
2074 if (isSigned && api.isNegative()) {
2075 sign = true;
2076 api = -api;
2077 }
2078
2079 return convertFromUnsignedParts(api.getRawData(), partCount, rounding_mode);
2080}
2081
Neil Boothf16c5952007-10-07 12:15:41 +00002082/* Convert a two's complement integer SRC to a floating point number,
2083 rounding according to ROUNDING_MODE. ISSIGNED is true if the
2084 integer is signed, in which case it must be sign-extended. */
2085APFloat::opStatus
2086APFloat::convertFromSignExtendedInteger(const integerPart *src,
2087 unsigned int srcCount,
2088 bool isSigned,
2089 roundingMode rounding_mode)
2090{
2091 opStatus status;
2092
Neil Boothcaf19d72007-10-14 10:29:28 +00002093 assertArithmeticOK(*semantics);
Neil Boothf16c5952007-10-07 12:15:41 +00002094 if (isSigned
2095 && APInt::tcExtractBit(src, srcCount * integerPartWidth - 1)) {
2096 integerPart *copy;
2097
2098 /* If we're signed and negative negate a copy. */
2099 sign = true;
2100 copy = new integerPart[srcCount];
2101 APInt::tcAssign(copy, src, srcCount);
2102 APInt::tcNegate(copy, srcCount);
2103 status = convertFromUnsignedParts(copy, srcCount, rounding_mode);
2104 delete [] copy;
2105 } else {
2106 sign = false;
2107 status = convertFromUnsignedParts(src, srcCount, rounding_mode);
2108 }
2109
2110 return status;
2111}
2112
Neil Boothccf596a2007-10-07 11:45:55 +00002113/* FIXME: should this just take a const APInt reference? */
Chris Lattnerb39cdde2007-08-20 22:49:32 +00002114APFloat::opStatus
Neil Boothccf596a2007-10-07 11:45:55 +00002115APFloat::convertFromZeroExtendedInteger(const integerPart *parts,
2116 unsigned int width, bool isSigned,
2117 roundingMode rounding_mode)
Chris Lattnerb39cdde2007-08-20 22:49:32 +00002118{
Dale Johannesen910993e2007-09-21 22:09:37 +00002119 unsigned int partCount = partCountForBits(width);
Dale Johannesen910993e2007-09-21 22:09:37 +00002120 APInt api = APInt(width, partCount, parts);
Chris Lattnerb39cdde2007-08-20 22:49:32 +00002121
2122 sign = false;
Dale Johannesencce23a42007-09-30 18:17:01 +00002123 if(isSigned && APInt::tcExtractBit(parts, width - 1)) {
2124 sign = true;
2125 api = -api;
Chris Lattnerb39cdde2007-08-20 22:49:32 +00002126 }
2127
Neil Booth7a7bc0f2007-10-07 12:10:57 +00002128 return convertFromUnsignedParts(api.getRawData(), partCount, rounding_mode);
Chris Lattnerb39cdde2007-08-20 22:49:32 +00002129}
2130
2131APFloat::opStatus
Erick Tryzelaara15d8902009-08-16 23:36:19 +00002132APFloat::convertFromHexadecimalString(const StringRef &s,
Neil Booth4f881702007-09-26 21:33:42 +00002133 roundingMode rounding_mode)
Chris Lattnerb39cdde2007-08-20 22:49:32 +00002134{
Erick Tryzelaarf8bc8012009-08-18 18:20:37 +00002135 lostFraction lost_fraction = lfExactlyZero;
Chris Lattnerb39cdde2007-08-20 22:49:32 +00002136 integerPart *significand;
2137 unsigned int bitPos, partsCount;
Erick Tryzelaara15d8902009-08-16 23:36:19 +00002138 StringRef::iterator dot, firstSignificantDigit;
Chris Lattnerb39cdde2007-08-20 22:49:32 +00002139
2140 zeroSignificand();
2141 exponent = 0;
2142 category = fcNormal;
2143
2144 significand = significandParts();
2145 partsCount = partCount();
2146 bitPos = partsCount * integerPartWidth;
2147
Neil Booth33d4c922007-10-07 08:51:21 +00002148 /* Skip leading zeroes and any (hexa)decimal point. */
Erick Tryzelaara15d8902009-08-16 23:36:19 +00002149 StringRef::iterator p = skipLeadingZeroesAndAnyDot(s.begin(), s.end(), &dot);
Chris Lattnerb39cdde2007-08-20 22:49:32 +00002150 firstSignificantDigit = p;
2151
Erick Tryzelaara15d8902009-08-16 23:36:19 +00002152 for(; p != s.end();) {
Dale Johannesen386f3e92008-05-14 22:53:25 +00002153 integerPart hex_value;
Chris Lattnerb39cdde2007-08-20 22:49:32 +00002154
2155 if(*p == '.') {
Daniel Dunbarcdd93d82009-08-20 17:12:33 +00002156 assert(dot == s.end());
Chris Lattnerb39cdde2007-08-20 22:49:32 +00002157 dot = p++;
2158 }
2159
2160 hex_value = hexDigitValue(*p);
2161 if(hex_value == -1U) {
Chris Lattnerb39cdde2007-08-20 22:49:32 +00002162 break;
2163 }
2164
2165 p++;
2166
Erick Tryzelaara15d8902009-08-16 23:36:19 +00002167 if (p == s.end()) {
Chris Lattnerb39cdde2007-08-20 22:49:32 +00002168 break;
Erick Tryzelaara15d8902009-08-16 23:36:19 +00002169 } else {
2170 /* Store the number whilst 4-bit nibbles remain. */
2171 if(bitPos) {
2172 bitPos -= 4;
2173 hex_value <<= bitPos % integerPartWidth;
2174 significand[bitPos / integerPartWidth] |= hex_value;
2175 } else {
2176 lost_fraction = trailingHexadecimalFraction(p, s.end(), hex_value);
2177 while(p != s.end() && hexDigitValue(*p) != -1U)
2178 p++;
2179 break;
2180 }
Chris Lattnerb39cdde2007-08-20 22:49:32 +00002181 }
2182 }
2183
2184 /* Hex floats require an exponent but not a hexadecimal point. */
Erick Tryzelaara15d8902009-08-16 23:36:19 +00002185 assert(p != s.end() && (*p == 'p' || *p == 'P') &&
2186 "Hex strings require an exponent");
Chris Lattnerb39cdde2007-08-20 22:49:32 +00002187
2188 /* Ignore the exponent if we are zero. */
2189 if(p != firstSignificantDigit) {
2190 int expAdjustment;
2191
2192 /* Implicit hexadecimal point? */
Daniel Dunbarcdd93d82009-08-20 17:12:33 +00002193 if (dot == s.end())
Chris Lattnerb39cdde2007-08-20 22:49:32 +00002194 dot = p;
2195
2196 /* Calculate the exponent adjustment implicit in the number of
2197 significant digits. */
Evan Cheng48e8c802008-05-02 21:15:08 +00002198 expAdjustment = static_cast<int>(dot - firstSignificantDigit);
Chris Lattnerb39cdde2007-08-20 22:49:32 +00002199 if(expAdjustment < 0)
2200 expAdjustment++;
2201 expAdjustment = expAdjustment * 4 - 1;
2202
2203 /* Adjust for writing the significand starting at the most
2204 significant nibble. */
2205 expAdjustment += semantics->precision;
2206 expAdjustment -= partsCount * integerPartWidth;
2207
2208 /* Adjust for the given exponent. */
Erick Tryzelaara15d8902009-08-16 23:36:19 +00002209 exponent = totalExponent(p, s.end(), expAdjustment);
Chris Lattnerb39cdde2007-08-20 22:49:32 +00002210 }
2211
2212 return normalize(rounding_mode, lost_fraction);
2213}
2214
2215APFloat::opStatus
Neil Booth96c74712007-10-12 16:02:31 +00002216APFloat::roundSignificandWithExponent(const integerPart *decSigParts,
2217 unsigned sigPartCount, int exp,
2218 roundingMode rounding_mode)
2219{
2220 unsigned int parts, pow5PartCount;
Neil Boothcaf19d72007-10-14 10:29:28 +00002221 fltSemantics calcSemantics = { 32767, -32767, 0, true };
Neil Booth96c74712007-10-12 16:02:31 +00002222 integerPart pow5Parts[maxPowerOfFiveParts];
2223 bool isNearest;
2224
2225 isNearest = (rounding_mode == rmNearestTiesToEven
2226 || rounding_mode == rmNearestTiesToAway);
2227
2228 parts = partCountForBits(semantics->precision + 11);
2229
2230 /* Calculate pow(5, abs(exp)). */
2231 pow5PartCount = powerOf5(pow5Parts, exp >= 0 ? exp: -exp);
2232
2233 for (;; parts *= 2) {
2234 opStatus sigStatus, powStatus;
2235 unsigned int excessPrecision, truncatedBits;
2236
2237 calcSemantics.precision = parts * integerPartWidth - 1;
2238 excessPrecision = calcSemantics.precision - semantics->precision;
2239 truncatedBits = excessPrecision;
2240
2241 APFloat decSig(calcSemantics, fcZero, sign);
2242 APFloat pow5(calcSemantics, fcZero, false);
2243
2244 sigStatus = decSig.convertFromUnsignedParts(decSigParts, sigPartCount,
2245 rmNearestTiesToEven);
2246 powStatus = pow5.convertFromUnsignedParts(pow5Parts, pow5PartCount,
2247 rmNearestTiesToEven);
2248 /* Add exp, as 10^n = 5^n * 2^n. */
2249 decSig.exponent += exp;
2250
2251 lostFraction calcLostFraction;
Evan Cheng48e8c802008-05-02 21:15:08 +00002252 integerPart HUerr, HUdistance;
2253 unsigned int powHUerr;
Neil Booth96c74712007-10-12 16:02:31 +00002254
2255 if (exp >= 0) {
2256 /* multiplySignificand leaves the precision-th bit set to 1. */
2257 calcLostFraction = decSig.multiplySignificand(pow5, NULL);
2258 powHUerr = powStatus != opOK;
2259 } else {
2260 calcLostFraction = decSig.divideSignificand(pow5);
2261 /* Denormal numbers have less precision. */
2262 if (decSig.exponent < semantics->minExponent) {
2263 excessPrecision += (semantics->minExponent - decSig.exponent);
2264 truncatedBits = excessPrecision;
2265 if (excessPrecision > calcSemantics.precision)
2266 excessPrecision = calcSemantics.precision;
2267 }
2268 /* Extra half-ulp lost in reciprocal of exponent. */
Evan Cheng48e8c802008-05-02 21:15:08 +00002269 powHUerr = (powStatus == opOK && calcLostFraction == lfExactlyZero) ? 0:2;
Neil Booth96c74712007-10-12 16:02:31 +00002270 }
2271
2272 /* Both multiplySignificand and divideSignificand return the
2273 result with the integer bit set. */
2274 assert (APInt::tcExtractBit
2275 (decSig.significandParts(), calcSemantics.precision - 1) == 1);
2276
2277 HUerr = HUerrBound(calcLostFraction != lfExactlyZero, sigStatus != opOK,
2278 powHUerr);
2279 HUdistance = 2 * ulpsFromBoundary(decSig.significandParts(),
2280 excessPrecision, isNearest);
2281
2282 /* Are we guaranteed to round correctly if we truncate? */
2283 if (HUdistance >= HUerr) {
2284 APInt::tcExtract(significandParts(), partCount(), decSig.significandParts(),
2285 calcSemantics.precision - excessPrecision,
2286 excessPrecision);
2287 /* Take the exponent of decSig. If we tcExtract-ed less bits
2288 above we must adjust our exponent to compensate for the
2289 implicit right shift. */
2290 exponent = (decSig.exponent + semantics->precision
2291 - (calcSemantics.precision - excessPrecision));
2292 calcLostFraction = lostFractionThroughTruncation(decSig.significandParts(),
2293 decSig.partCount(),
2294 truncatedBits);
2295 return normalize(rounding_mode, calcLostFraction);
2296 }
2297 }
2298}
2299
2300APFloat::opStatus
Erick Tryzelaara15d8902009-08-16 23:36:19 +00002301APFloat::convertFromDecimalString(const StringRef &str, roundingMode rounding_mode)
Neil Booth96c74712007-10-12 16:02:31 +00002302{
Neil Booth1870f292007-10-14 10:16:12 +00002303 decimalInfo D;
Neil Booth96c74712007-10-12 16:02:31 +00002304 opStatus fs;
2305
Neil Booth1870f292007-10-14 10:16:12 +00002306 /* Scan the text. */
Erick Tryzelaara15d8902009-08-16 23:36:19 +00002307 StringRef::iterator p = str.begin();
2308 interpretDecimal(p, str.end(), &D);
Neil Booth96c74712007-10-12 16:02:31 +00002309
Neil Booth686700e2007-10-15 15:00:55 +00002310 /* Handle the quick cases. First the case of no significant digits,
2311 i.e. zero, and then exponents that are obviously too large or too
2312 small. Writing L for log 10 / log 2, a number d.ddddd*10^exp
2313 definitely overflows if
2314
2315 (exp - 1) * L >= maxExponent
2316
2317 and definitely underflows to zero where
2318
2319 (exp + 1) * L <= minExponent - precision
2320
2321 With integer arithmetic the tightest bounds for L are
2322
2323 93/28 < L < 196/59 [ numerator <= 256 ]
2324 42039/12655 < L < 28738/8651 [ numerator <= 65536 ]
2325 */
2326
Neil Boothcc233592007-12-05 13:06:04 +00002327 if (decDigitValue(*D.firstSigDigit) >= 10U) {
Neil Booth96c74712007-10-12 16:02:31 +00002328 category = fcZero;
2329 fs = opOK;
Neil Booth686700e2007-10-15 15:00:55 +00002330 } else if ((D.normalizedExponent + 1) * 28738
2331 <= 8651 * (semantics->minExponent - (int) semantics->precision)) {
2332 /* Underflow to zero and round. */
2333 zeroSignificand();
2334 fs = normalize(rounding_mode, lfLessThanHalf);
2335 } else if ((D.normalizedExponent - 1) * 42039
2336 >= 12655 * semantics->maxExponent) {
2337 /* Overflow and round. */
2338 fs = handleOverflow(rounding_mode);
Neil Booth96c74712007-10-12 16:02:31 +00002339 } else {
Neil Booth1870f292007-10-14 10:16:12 +00002340 integerPart *decSignificand;
2341 unsigned int partCount;
Neil Booth96c74712007-10-12 16:02:31 +00002342
Neil Booth1870f292007-10-14 10:16:12 +00002343 /* A tight upper bound on number of bits required to hold an
Neil Booth686700e2007-10-15 15:00:55 +00002344 N-digit decimal integer is N * 196 / 59. Allocate enough space
Neil Booth1870f292007-10-14 10:16:12 +00002345 to hold the full significand, and an extra part required by
2346 tcMultiplyPart. */
Evan Cheng48e8c802008-05-02 21:15:08 +00002347 partCount = static_cast<unsigned int>(D.lastSigDigit - D.firstSigDigit) + 1;
Neil Booth686700e2007-10-15 15:00:55 +00002348 partCount = partCountForBits(1 + 196 * partCount / 59);
Neil Booth1870f292007-10-14 10:16:12 +00002349 decSignificand = new integerPart[partCount + 1];
2350 partCount = 0;
Neil Booth96c74712007-10-12 16:02:31 +00002351
Neil Booth1870f292007-10-14 10:16:12 +00002352 /* Convert to binary efficiently - we do almost all multiplication
2353 in an integerPart. When this would overflow do we do a single
2354 bignum multiplication, and then revert again to multiplication
2355 in an integerPart. */
2356 do {
2357 integerPart decValue, val, multiplier;
2358
2359 val = 0;
2360 multiplier = 1;
2361
2362 do {
Erick Tryzelaara15d8902009-08-16 23:36:19 +00002363 if (*p == '.') {
Neil Booth1870f292007-10-14 10:16:12 +00002364 p++;
Erick Tryzelaara15d8902009-08-16 23:36:19 +00002365 if (p == str.end()) {
2366 break;
2367 }
2368 }
Neil Booth1870f292007-10-14 10:16:12 +00002369 decValue = decDigitValue(*p++);
Erick Tryzelaara15d8902009-08-16 23:36:19 +00002370 assert(decValue < 10U && "Invalid character in digit string");
Neil Booth1870f292007-10-14 10:16:12 +00002371 multiplier *= 10;
2372 val = val * 10 + decValue;
2373 /* The maximum number that can be multiplied by ten with any
2374 digit added without overflowing an integerPart. */
2375 } while (p <= D.lastSigDigit && multiplier <= (~ (integerPart) 0 - 9) / 10);
2376
2377 /* Multiply out the current part. */
2378 APInt::tcMultiplyPart(decSignificand, decSignificand, multiplier, val,
2379 partCount, partCount + 1, false);
2380
2381 /* If we used another part (likely but not guaranteed), increase
2382 the count. */
2383 if (decSignificand[partCount])
2384 partCount++;
2385 } while (p <= D.lastSigDigit);
Neil Booth96c74712007-10-12 16:02:31 +00002386
Neil Booth43a4b282007-11-01 22:51:07 +00002387 category = fcNormal;
Neil Booth96c74712007-10-12 16:02:31 +00002388 fs = roundSignificandWithExponent(decSignificand, partCount,
Neil Booth1870f292007-10-14 10:16:12 +00002389 D.exponent, rounding_mode);
Neil Booth96c74712007-10-12 16:02:31 +00002390
Neil Booth1870f292007-10-14 10:16:12 +00002391 delete [] decSignificand;
2392 }
Neil Booth96c74712007-10-12 16:02:31 +00002393
2394 return fs;
2395}
2396
2397APFloat::opStatus
Erick Tryzelaara15d8902009-08-16 23:36:19 +00002398APFloat::convertFromString(const StringRef &str, roundingMode rounding_mode)
Neil Booth4f881702007-09-26 21:33:42 +00002399{
Neil Boothcaf19d72007-10-14 10:29:28 +00002400 assertArithmeticOK(*semantics);
Erick Tryzelaara15d8902009-08-16 23:36:19 +00002401 assert(!str.empty() && "Invalid string length");
Neil Boothcaf19d72007-10-14 10:29:28 +00002402
Chris Lattnerb39cdde2007-08-20 22:49:32 +00002403 /* Handle a leading minus sign. */
Erick Tryzelaara15d8902009-08-16 23:36:19 +00002404 StringRef::iterator p = str.begin();
2405 size_t slen = str.size();
2406 unsigned isNegative = str.front() == '-';
2407 if(isNegative) {
2408 sign = 1;
2409 p++;
2410 slen--;
2411 assert(slen && "String is only a minus!");
2412 } else {
Chris Lattnerb39cdde2007-08-20 22:49:32 +00002413 sign = 0;
Erick Tryzelaara15d8902009-08-16 23:36:19 +00002414 }
Chris Lattnerb39cdde2007-08-20 22:49:32 +00002415
Erick Tryzelaara15d8902009-08-16 23:36:19 +00002416 if(slen >= 2 && p[0] == '0' && (p[1] == 'x' || p[1] == 'X')) {
2417 assert(slen - 2 && "Invalid string");
2418 return convertFromHexadecimalString(str.substr(isNegative + 2),
2419 rounding_mode);
2420 }
Bill Wendlingb7c0d942008-11-27 08:00:12 +00002421
Erick Tryzelaara15d8902009-08-16 23:36:19 +00002422 return convertFromDecimalString(str.substr(isNegative), rounding_mode);
Chris Lattnerb39cdde2007-08-20 22:49:32 +00002423}
Dale Johannesen343e7702007-08-24 00:56:33 +00002424
Neil Bootha30b0ee2007-10-03 22:26:02 +00002425/* Write out a hexadecimal representation of the floating point value
2426 to DST, which must be of sufficient size, in the C99 form
2427 [-]0xh.hhhhp[+-]d. Return the number of characters written,
2428 excluding the terminating NUL.
2429
2430 If UPPERCASE, the output is in upper case, otherwise in lower case.
2431
2432 HEXDIGITS digits appear altogether, rounding the value if
2433 necessary. If HEXDIGITS is 0, the minimal precision to display the
2434 number precisely is used instead. If nothing would appear after
2435 the decimal point it is suppressed.
2436
2437 The decimal exponent is always printed and has at least one digit.
2438 Zero values display an exponent of zero. Infinities and NaNs
2439 appear as "infinity" or "nan" respectively.
2440
2441 The above rules are as specified by C99. There is ambiguity about
2442 what the leading hexadecimal digit should be. This implementation
2443 uses whatever is necessary so that the exponent is displayed as
2444 stored. This implies the exponent will fall within the IEEE format
2445 range, and the leading hexadecimal digit will be 0 (for denormals),
2446 1 (normal numbers) or 2 (normal numbers rounded-away-from-zero with
2447 any other digits zero).
2448*/
2449unsigned int
2450APFloat::convertToHexString(char *dst, unsigned int hexDigits,
2451 bool upperCase, roundingMode rounding_mode) const
2452{
2453 char *p;
2454
Neil Boothcaf19d72007-10-14 10:29:28 +00002455 assertArithmeticOK(*semantics);
2456
Neil Bootha30b0ee2007-10-03 22:26:02 +00002457 p = dst;
2458 if (sign)
2459 *dst++ = '-';
2460
2461 switch (category) {
2462 case fcInfinity:
2463 memcpy (dst, upperCase ? infinityU: infinityL, sizeof infinityU - 1);
2464 dst += sizeof infinityL - 1;
2465 break;
2466
2467 case fcNaN:
2468 memcpy (dst, upperCase ? NaNU: NaNL, sizeof NaNU - 1);
2469 dst += sizeof NaNU - 1;
2470 break;
2471
2472 case fcZero:
2473 *dst++ = '0';
2474 *dst++ = upperCase ? 'X': 'x';
2475 *dst++ = '0';
2476 if (hexDigits > 1) {
2477 *dst++ = '.';
2478 memset (dst, '0', hexDigits - 1);
2479 dst += hexDigits - 1;
2480 }
2481 *dst++ = upperCase ? 'P': 'p';
2482 *dst++ = '0';
2483 break;
2484
2485 case fcNormal:
2486 dst = convertNormalToHexString (dst, hexDigits, upperCase, rounding_mode);
2487 break;
2488 }
2489
2490 *dst = 0;
2491
Evan Cheng48e8c802008-05-02 21:15:08 +00002492 return static_cast<unsigned int>(dst - p);
Neil Bootha30b0ee2007-10-03 22:26:02 +00002493}
2494
2495/* Does the hard work of outputting the correctly rounded hexadecimal
2496 form of a normal floating point number with the specified number of
2497 hexadecimal digits. If HEXDIGITS is zero the minimum number of
2498 digits necessary to print the value precisely is output. */
2499char *
2500APFloat::convertNormalToHexString(char *dst, unsigned int hexDigits,
2501 bool upperCase,
2502 roundingMode rounding_mode) const
2503{
2504 unsigned int count, valueBits, shift, partsCount, outputDigits;
2505 const char *hexDigitChars;
2506 const integerPart *significand;
2507 char *p;
2508 bool roundUp;
2509
2510 *dst++ = '0';
2511 *dst++ = upperCase ? 'X': 'x';
2512
2513 roundUp = false;
2514 hexDigitChars = upperCase ? hexDigitsUpper: hexDigitsLower;
2515
2516 significand = significandParts();
2517 partsCount = partCount();
2518
2519 /* +3 because the first digit only uses the single integer bit, so
2520 we have 3 virtual zero most-significant-bits. */
2521 valueBits = semantics->precision + 3;
2522 shift = integerPartWidth - valueBits % integerPartWidth;
2523
2524 /* The natural number of digits required ignoring trailing
2525 insignificant zeroes. */
2526 outputDigits = (valueBits - significandLSB () + 3) / 4;
2527
2528 /* hexDigits of zero means use the required number for the
2529 precision. Otherwise, see if we are truncating. If we are,
Neil Booth978661d2007-10-06 00:24:48 +00002530 find out if we need to round away from zero. */
Neil Bootha30b0ee2007-10-03 22:26:02 +00002531 if (hexDigits) {
2532 if (hexDigits < outputDigits) {
2533 /* We are dropping non-zero bits, so need to check how to round.
2534 "bits" is the number of dropped bits. */
2535 unsigned int bits;
2536 lostFraction fraction;
2537
2538 bits = valueBits - hexDigits * 4;
2539 fraction = lostFractionThroughTruncation (significand, partsCount, bits);
2540 roundUp = roundAwayFromZero(rounding_mode, fraction, bits);
2541 }
2542 outputDigits = hexDigits;
2543 }
2544
2545 /* Write the digits consecutively, and start writing in the location
2546 of the hexadecimal point. We move the most significant digit
2547 left and add the hexadecimal point later. */
2548 p = ++dst;
2549
2550 count = (valueBits + integerPartWidth - 1) / integerPartWidth;
2551
2552 while (outputDigits && count) {
2553 integerPart part;
2554
2555 /* Put the most significant integerPartWidth bits in "part". */
2556 if (--count == partsCount)
2557 part = 0; /* An imaginary higher zero part. */
2558 else
2559 part = significand[count] << shift;
2560
2561 if (count && shift)
2562 part |= significand[count - 1] >> (integerPartWidth - shift);
2563
2564 /* Convert as much of "part" to hexdigits as we can. */
2565 unsigned int curDigits = integerPartWidth / 4;
2566
2567 if (curDigits > outputDigits)
2568 curDigits = outputDigits;
2569 dst += partAsHex (dst, part, curDigits, hexDigitChars);
2570 outputDigits -= curDigits;
2571 }
2572
2573 if (roundUp) {
2574 char *q = dst;
2575
2576 /* Note that hexDigitChars has a trailing '0'. */
2577 do {
2578 q--;
2579 *q = hexDigitChars[hexDigitValue (*q) + 1];
Neil Booth978661d2007-10-06 00:24:48 +00002580 } while (*q == '0');
2581 assert (q >= p);
Neil Bootha30b0ee2007-10-03 22:26:02 +00002582 } else {
2583 /* Add trailing zeroes. */
2584 memset (dst, '0', outputDigits);
2585 dst += outputDigits;
2586 }
2587
2588 /* Move the most significant digit to before the point, and if there
2589 is something after the decimal point add it. This must come
2590 after rounding above. */
2591 p[-1] = p[0];
2592 if (dst -1 == p)
2593 dst--;
2594 else
2595 p[0] = '.';
2596
2597 /* Finally output the exponent. */
2598 *dst++ = upperCase ? 'P': 'p';
2599
Neil Booth92f7e8d2007-10-06 07:29:25 +00002600 return writeSignedDecimal (dst, exponent);
Neil Bootha30b0ee2007-10-03 22:26:02 +00002601}
2602
Dale Johannesen343e7702007-08-24 00:56:33 +00002603// For good performance it is desirable for different APFloats
2604// to produce different integers.
2605uint32_t
Neil Booth4f881702007-09-26 21:33:42 +00002606APFloat::getHashValue() const
2607{
Dale Johannesen343e7702007-08-24 00:56:33 +00002608 if (category==fcZero) return sign<<8 | semantics->precision ;
2609 else if (category==fcInfinity) return sign<<9 | semantics->precision;
Dale Johanneseneaf08942007-08-31 04:03:46 +00002610 else if (category==fcNaN) return 1<<10 | semantics->precision;
Dale Johannesen343e7702007-08-24 00:56:33 +00002611 else {
2612 uint32_t hash = sign<<11 | semantics->precision | exponent<<12;
2613 const integerPart* p = significandParts();
2614 for (int i=partCount(); i>0; i--, p++)
Evan Cheng48e8c802008-05-02 21:15:08 +00002615 hash ^= ((uint32_t)*p) ^ (uint32_t)((*p)>>32);
Dale Johannesen343e7702007-08-24 00:56:33 +00002616 return hash;
2617 }
2618}
2619
2620// Conversion from APFloat to/from host float/double. It may eventually be
2621// possible to eliminate these and have everybody deal with APFloats, but that
2622// will take a while. This approach will not easily extend to long double.
Dale Johannesena72a5a02007-09-20 23:47:58 +00002623// Current implementation requires integerPartWidth==64, which is correct at
2624// the moment but could be made more general.
Dale Johannesen343e7702007-08-24 00:56:33 +00002625
Dale Johannesen58c2e4c2007-09-05 20:39:49 +00002626// Denormals have exponent minExponent in APFloat, but minExponent-1 in
Dale Johannesena72a5a02007-09-20 23:47:58 +00002627// the actual IEEE respresentations. We compensate for that here.
Dale Johannesen58c2e4c2007-09-05 20:39:49 +00002628
Dale Johannesen3f6eb742007-09-11 18:32:33 +00002629APInt
Neil Booth4f881702007-09-26 21:33:42 +00002630APFloat::convertF80LongDoubleAPFloatToAPInt() const
2631{
Dan Gohmanb10abe12008-01-29 12:08:20 +00002632 assert(semantics == (const llvm::fltSemantics*)&x87DoubleExtended);
Dale Johannesena72a5a02007-09-20 23:47:58 +00002633 assert (partCount()==2);
Dale Johannesen3f6eb742007-09-11 18:32:33 +00002634
2635 uint64_t myexponent, mysignificand;
2636
2637 if (category==fcNormal) {
2638 myexponent = exponent+16383; //bias
Dale Johannesena72a5a02007-09-20 23:47:58 +00002639 mysignificand = significandParts()[0];
Dale Johannesen3f6eb742007-09-11 18:32:33 +00002640 if (myexponent==1 && !(mysignificand & 0x8000000000000000ULL))
2641 myexponent = 0; // denormal
2642 } else if (category==fcZero) {
2643 myexponent = 0;
2644 mysignificand = 0;
2645 } else if (category==fcInfinity) {
2646 myexponent = 0x7fff;
2647 mysignificand = 0x8000000000000000ULL;
Chris Lattnera11ef822007-10-06 06:13:42 +00002648 } else {
2649 assert(category == fcNaN && "Unknown category");
Dale Johannesen3f6eb742007-09-11 18:32:33 +00002650 myexponent = 0x7fff;
Dale Johannesena72a5a02007-09-20 23:47:58 +00002651 mysignificand = significandParts()[0];
Chris Lattnera11ef822007-10-06 06:13:42 +00002652 }
Dale Johannesen3f6eb742007-09-11 18:32:33 +00002653
2654 uint64_t words[2];
Dale Johannesen1b25cb22009-03-23 21:16:53 +00002655 words[0] = mysignificand;
2656 words[1] = ((uint64_t)(sign & 1) << 15) |
2657 (myexponent & 0x7fffLL);
Chris Lattnera11ef822007-10-06 06:13:42 +00002658 return APInt(80, 2, words);
Dale Johannesen3f6eb742007-09-11 18:32:33 +00002659}
2660
2661APInt
Dale Johannesena471c2e2007-10-11 18:07:22 +00002662APFloat::convertPPCDoubleDoubleAPFloatToAPInt() const
2663{
Dan Gohmanb10abe12008-01-29 12:08:20 +00002664 assert(semantics == (const llvm::fltSemantics*)&PPCDoubleDouble);
Dale Johannesena471c2e2007-10-11 18:07:22 +00002665 assert (partCount()==2);
2666
2667 uint64_t myexponent, mysignificand, myexponent2, mysignificand2;
2668
2669 if (category==fcNormal) {
2670 myexponent = exponent + 1023; //bias
2671 myexponent2 = exponent2 + 1023;
2672 mysignificand = significandParts()[0];
2673 mysignificand2 = significandParts()[1];
2674 if (myexponent==1 && !(mysignificand & 0x10000000000000LL))
2675 myexponent = 0; // denormal
2676 if (myexponent2==1 && !(mysignificand2 & 0x10000000000000LL))
2677 myexponent2 = 0; // denormal
2678 } else if (category==fcZero) {
2679 myexponent = 0;
2680 mysignificand = 0;
2681 myexponent2 = 0;
2682 mysignificand2 = 0;
2683 } else if (category==fcInfinity) {
2684 myexponent = 0x7ff;
2685 myexponent2 = 0;
2686 mysignificand = 0;
2687 mysignificand2 = 0;
2688 } else {
2689 assert(category == fcNaN && "Unknown category");
2690 myexponent = 0x7ff;
2691 mysignificand = significandParts()[0];
2692 myexponent2 = exponent2;
2693 mysignificand2 = significandParts()[1];
2694 }
2695
2696 uint64_t words[2];
Evan Cheng48e8c802008-05-02 21:15:08 +00002697 words[0] = ((uint64_t)(sign & 1) << 63) |
Dale Johannesena471c2e2007-10-11 18:07:22 +00002698 ((myexponent & 0x7ff) << 52) |
2699 (mysignificand & 0xfffffffffffffLL);
Evan Cheng48e8c802008-05-02 21:15:08 +00002700 words[1] = ((uint64_t)(sign2 & 1) << 63) |
Dale Johannesena471c2e2007-10-11 18:07:22 +00002701 ((myexponent2 & 0x7ff) << 52) |
2702 (mysignificand2 & 0xfffffffffffffLL);
2703 return APInt(128, 2, words);
2704}
2705
2706APInt
Neil Booth4f881702007-09-26 21:33:42 +00002707APFloat::convertDoubleAPFloatToAPInt() const
2708{
Dan Gohmancb648f92007-09-14 20:08:19 +00002709 assert(semantics == (const llvm::fltSemantics*)&IEEEdouble);
Dale Johannesen343e7702007-08-24 00:56:33 +00002710 assert (partCount()==1);
2711
Dale Johanneseneaf08942007-08-31 04:03:46 +00002712 uint64_t myexponent, mysignificand;
Dale Johannesen343e7702007-08-24 00:56:33 +00002713
2714 if (category==fcNormal) {
Dale Johannesen343e7702007-08-24 00:56:33 +00002715 myexponent = exponent+1023; //bias
Dale Johannesen58c2e4c2007-09-05 20:39:49 +00002716 mysignificand = *significandParts();
2717 if (myexponent==1 && !(mysignificand & 0x10000000000000LL))
2718 myexponent = 0; // denormal
Dale Johannesen343e7702007-08-24 00:56:33 +00002719 } else if (category==fcZero) {
Dale Johannesen343e7702007-08-24 00:56:33 +00002720 myexponent = 0;
2721 mysignificand = 0;
2722 } else if (category==fcInfinity) {
Dale Johannesen343e7702007-08-24 00:56:33 +00002723 myexponent = 0x7ff;
2724 mysignificand = 0;
Chris Lattnera11ef822007-10-06 06:13:42 +00002725 } else {
2726 assert(category == fcNaN && "Unknown category!");
Dale Johannesen343e7702007-08-24 00:56:33 +00002727 myexponent = 0x7ff;
Dale Johanneseneaf08942007-08-31 04:03:46 +00002728 mysignificand = *significandParts();
Chris Lattnera11ef822007-10-06 06:13:42 +00002729 }
Dale Johannesen343e7702007-08-24 00:56:33 +00002730
Evan Cheng48e8c802008-05-02 21:15:08 +00002731 return APInt(64, ((((uint64_t)(sign & 1) << 63) |
Chris Lattnera11ef822007-10-06 06:13:42 +00002732 ((myexponent & 0x7ff) << 52) |
2733 (mysignificand & 0xfffffffffffffLL))));
Dale Johannesen343e7702007-08-24 00:56:33 +00002734}
2735
Dale Johannesen3f6eb742007-09-11 18:32:33 +00002736APInt
Neil Booth4f881702007-09-26 21:33:42 +00002737APFloat::convertFloatAPFloatToAPInt() const
2738{
Dan Gohmancb648f92007-09-14 20:08:19 +00002739 assert(semantics == (const llvm::fltSemantics*)&IEEEsingle);
Dale Johannesen343e7702007-08-24 00:56:33 +00002740 assert (partCount()==1);
Neil Booth4f881702007-09-26 21:33:42 +00002741
Dale Johanneseneaf08942007-08-31 04:03:46 +00002742 uint32_t myexponent, mysignificand;
Dale Johannesen343e7702007-08-24 00:56:33 +00002743
2744 if (category==fcNormal) {
Dale Johannesen343e7702007-08-24 00:56:33 +00002745 myexponent = exponent+127; //bias
Evan Cheng48e8c802008-05-02 21:15:08 +00002746 mysignificand = (uint32_t)*significandParts();
Dale Johannesend0763b92007-11-17 01:02:27 +00002747 if (myexponent == 1 && !(mysignificand & 0x800000))
Dale Johannesen58c2e4c2007-09-05 20:39:49 +00002748 myexponent = 0; // denormal
Dale Johannesen343e7702007-08-24 00:56:33 +00002749 } else if (category==fcZero) {
Dale Johannesen343e7702007-08-24 00:56:33 +00002750 myexponent = 0;
2751 mysignificand = 0;
2752 } else if (category==fcInfinity) {
Dale Johannesen343e7702007-08-24 00:56:33 +00002753 myexponent = 0xff;
2754 mysignificand = 0;
Chris Lattnera11ef822007-10-06 06:13:42 +00002755 } else {
2756 assert(category == fcNaN && "Unknown category!");
Dale Johannesen58c2e4c2007-09-05 20:39:49 +00002757 myexponent = 0xff;
Evan Cheng48e8c802008-05-02 21:15:08 +00002758 mysignificand = (uint32_t)*significandParts();
Chris Lattnera11ef822007-10-06 06:13:42 +00002759 }
Dale Johannesen343e7702007-08-24 00:56:33 +00002760
Chris Lattnera11ef822007-10-06 06:13:42 +00002761 return APInt(32, (((sign&1) << 31) | ((myexponent&0xff) << 23) |
2762 (mysignificand & 0x7fffff)));
Dale Johannesen343e7702007-08-24 00:56:33 +00002763}
2764
Dale Johannesena471c2e2007-10-11 18:07:22 +00002765// This function creates an APInt that is just a bit map of the floating
2766// point constant as it would appear in memory. It is not a conversion,
2767// and treating the result as a normal integer is unlikely to be useful.
2768
Dale Johannesen3f6eb742007-09-11 18:32:33 +00002769APInt
Dale Johannesen7111b022008-10-09 18:53:47 +00002770APFloat::bitcastToAPInt() const
Neil Booth4f881702007-09-26 21:33:42 +00002771{
Dan Gohmanb10abe12008-01-29 12:08:20 +00002772 if (semantics == (const llvm::fltSemantics*)&IEEEsingle)
Dale Johannesen3f6eb742007-09-11 18:32:33 +00002773 return convertFloatAPFloatToAPInt();
Chris Lattnera11ef822007-10-06 06:13:42 +00002774
Dan Gohmanb10abe12008-01-29 12:08:20 +00002775 if (semantics == (const llvm::fltSemantics*)&IEEEdouble)
Dale Johannesen3f6eb742007-09-11 18:32:33 +00002776 return convertDoubleAPFloatToAPInt();
Neil Booth4f881702007-09-26 21:33:42 +00002777
Dan Gohmanb10abe12008-01-29 12:08:20 +00002778 if (semantics == (const llvm::fltSemantics*)&PPCDoubleDouble)
Dale Johannesena471c2e2007-10-11 18:07:22 +00002779 return convertPPCDoubleDoubleAPFloatToAPInt();
2780
Dan Gohmanb10abe12008-01-29 12:08:20 +00002781 assert(semantics == (const llvm::fltSemantics*)&x87DoubleExtended &&
Chris Lattnera11ef822007-10-06 06:13:42 +00002782 "unknown format!");
2783 return convertF80LongDoubleAPFloatToAPInt();
Dale Johannesen3f6eb742007-09-11 18:32:33 +00002784}
2785
Neil Booth4f881702007-09-26 21:33:42 +00002786float
2787APFloat::convertToFloat() const
2788{
Erick Tryzelaara15d8902009-08-16 23:36:19 +00002789 assert(semantics == (const llvm::fltSemantics*)&IEEEsingle && "Float semantics are not IEEEsingle");
Dale Johannesen7111b022008-10-09 18:53:47 +00002790 APInt api = bitcastToAPInt();
Dale Johannesen3f6eb742007-09-11 18:32:33 +00002791 return api.bitsToFloat();
2792}
2793
Neil Booth4f881702007-09-26 21:33:42 +00002794double
2795APFloat::convertToDouble() const
2796{
Erick Tryzelaara15d8902009-08-16 23:36:19 +00002797 assert(semantics == (const llvm::fltSemantics*)&IEEEdouble && "Float semantics are not IEEEdouble");
Dale Johannesen7111b022008-10-09 18:53:47 +00002798 APInt api = bitcastToAPInt();
Dale Johannesen3f6eb742007-09-11 18:32:33 +00002799 return api.bitsToDouble();
2800}
2801
Dale Johannesend3d8ce32008-10-06 18:22:29 +00002802/// Integer bit is explicit in this format. Intel hardware (387 and later)
2803/// does not support these bit patterns:
2804/// exponent = all 1's, integer bit 0, significand 0 ("pseudoinfinity")
2805/// exponent = all 1's, integer bit 0, significand nonzero ("pseudoNaN")
2806/// exponent = 0, integer bit 1 ("pseudodenormal")
2807/// exponent!=0 nor all 1's, integer bit 0 ("unnormal")
2808/// At the moment, the first two are treated as NaNs, the second two as Normal.
Dale Johannesen3f6eb742007-09-11 18:32:33 +00002809void
Neil Booth4f881702007-09-26 21:33:42 +00002810APFloat::initFromF80LongDoubleAPInt(const APInt &api)
2811{
Dale Johannesen3f6eb742007-09-11 18:32:33 +00002812 assert(api.getBitWidth()==80);
2813 uint64_t i1 = api.getRawData()[0];
2814 uint64_t i2 = api.getRawData()[1];
Dale Johannesen1b25cb22009-03-23 21:16:53 +00002815 uint64_t myexponent = (i2 & 0x7fff);
2816 uint64_t mysignificand = i1;
Dale Johannesen3f6eb742007-09-11 18:32:33 +00002817
2818 initialize(&APFloat::x87DoubleExtended);
Dale Johannesena72a5a02007-09-20 23:47:58 +00002819 assert(partCount()==2);
Dale Johannesen3f6eb742007-09-11 18:32:33 +00002820
Dale Johannesen1b25cb22009-03-23 21:16:53 +00002821 sign = static_cast<unsigned int>(i2>>15);
Dale Johannesen3f6eb742007-09-11 18:32:33 +00002822 if (myexponent==0 && mysignificand==0) {
2823 // exponent, significand meaningless
2824 category = fcZero;
2825 } else if (myexponent==0x7fff && mysignificand==0x8000000000000000ULL) {
2826 // exponent, significand meaningless
2827 category = fcInfinity;
2828 } else if (myexponent==0x7fff && mysignificand!=0x8000000000000000ULL) {
2829 // exponent meaningless
2830 category = fcNaN;
Dale Johannesena72a5a02007-09-20 23:47:58 +00002831 significandParts()[0] = mysignificand;
2832 significandParts()[1] = 0;
Dale Johannesen3f6eb742007-09-11 18:32:33 +00002833 } else {
2834 category = fcNormal;
2835 exponent = myexponent - 16383;
Dale Johannesena72a5a02007-09-20 23:47:58 +00002836 significandParts()[0] = mysignificand;
2837 significandParts()[1] = 0;
Dale Johannesen3f6eb742007-09-11 18:32:33 +00002838 if (myexponent==0) // denormal
2839 exponent = -16382;
Neil Booth4f881702007-09-26 21:33:42 +00002840 }
Dale Johannesen3f6eb742007-09-11 18:32:33 +00002841}
2842
2843void
Dale Johannesena471c2e2007-10-11 18:07:22 +00002844APFloat::initFromPPCDoubleDoubleAPInt(const APInt &api)
2845{
2846 assert(api.getBitWidth()==128);
2847 uint64_t i1 = api.getRawData()[0];
2848 uint64_t i2 = api.getRawData()[1];
2849 uint64_t myexponent = (i1 >> 52) & 0x7ff;
2850 uint64_t mysignificand = i1 & 0xfffffffffffffLL;
2851 uint64_t myexponent2 = (i2 >> 52) & 0x7ff;
2852 uint64_t mysignificand2 = i2 & 0xfffffffffffffLL;
2853
2854 initialize(&APFloat::PPCDoubleDouble);
2855 assert(partCount()==2);
2856
Evan Cheng48e8c802008-05-02 21:15:08 +00002857 sign = static_cast<unsigned int>(i1>>63);
2858 sign2 = static_cast<unsigned int>(i2>>63);
Dale Johannesena471c2e2007-10-11 18:07:22 +00002859 if (myexponent==0 && mysignificand==0) {
2860 // exponent, significand meaningless
2861 // exponent2 and significand2 are required to be 0; we don't check
2862 category = fcZero;
2863 } else if (myexponent==0x7ff && mysignificand==0) {
2864 // exponent, significand meaningless
2865 // exponent2 and significand2 are required to be 0; we don't check
2866 category = fcInfinity;
2867 } else if (myexponent==0x7ff && mysignificand!=0) {
2868 // exponent meaningless. So is the whole second word, but keep it
2869 // for determinism.
2870 category = fcNaN;
2871 exponent2 = myexponent2;
2872 significandParts()[0] = mysignificand;
2873 significandParts()[1] = mysignificand2;
2874 } else {
2875 category = fcNormal;
2876 // Note there is no category2; the second word is treated as if it is
2877 // fcNormal, although it might be something else considered by itself.
2878 exponent = myexponent - 1023;
2879 exponent2 = myexponent2 - 1023;
2880 significandParts()[0] = mysignificand;
2881 significandParts()[1] = mysignificand2;
2882 if (myexponent==0) // denormal
2883 exponent = -1022;
2884 else
2885 significandParts()[0] |= 0x10000000000000LL; // integer bit
2886 if (myexponent2==0)
2887 exponent2 = -1022;
2888 else
2889 significandParts()[1] |= 0x10000000000000LL; // integer bit
2890 }
2891}
2892
2893void
Neil Booth4f881702007-09-26 21:33:42 +00002894APFloat::initFromDoubleAPInt(const APInt &api)
2895{
Dale Johannesen3f6eb742007-09-11 18:32:33 +00002896 assert(api.getBitWidth()==64);
2897 uint64_t i = *api.getRawData();
Dale Johannesend3b51fd2007-08-24 05:08:11 +00002898 uint64_t myexponent = (i >> 52) & 0x7ff;
2899 uint64_t mysignificand = i & 0xfffffffffffffLL;
2900
Dale Johannesen343e7702007-08-24 00:56:33 +00002901 initialize(&APFloat::IEEEdouble);
Dale Johannesen343e7702007-08-24 00:56:33 +00002902 assert(partCount()==1);
2903
Evan Cheng48e8c802008-05-02 21:15:08 +00002904 sign = static_cast<unsigned int>(i>>63);
Dale Johannesen343e7702007-08-24 00:56:33 +00002905 if (myexponent==0 && mysignificand==0) {
2906 // exponent, significand meaningless
2907 category = fcZero;
Dale Johannesen343e7702007-08-24 00:56:33 +00002908 } else if (myexponent==0x7ff && mysignificand==0) {
2909 // exponent, significand meaningless
2910 category = fcInfinity;
Dale Johanneseneaf08942007-08-31 04:03:46 +00002911 } else if (myexponent==0x7ff && mysignificand!=0) {
2912 // exponent meaningless
2913 category = fcNaN;
2914 *significandParts() = mysignificand;
Dale Johannesen343e7702007-08-24 00:56:33 +00002915 } else {
Dale Johannesen343e7702007-08-24 00:56:33 +00002916 category = fcNormal;
2917 exponent = myexponent - 1023;
Dale Johannesen58c2e4c2007-09-05 20:39:49 +00002918 *significandParts() = mysignificand;
2919 if (myexponent==0) // denormal
2920 exponent = -1022;
2921 else
2922 *significandParts() |= 0x10000000000000LL; // integer bit
Neil Booth4f881702007-09-26 21:33:42 +00002923 }
Dale Johannesen343e7702007-08-24 00:56:33 +00002924}
2925
Dale Johannesen3f6eb742007-09-11 18:32:33 +00002926void
Neil Booth4f881702007-09-26 21:33:42 +00002927APFloat::initFromFloatAPInt(const APInt & api)
2928{
Dale Johannesen3f6eb742007-09-11 18:32:33 +00002929 assert(api.getBitWidth()==32);
2930 uint32_t i = (uint32_t)*api.getRawData();
Dale Johannesend3b51fd2007-08-24 05:08:11 +00002931 uint32_t myexponent = (i >> 23) & 0xff;
2932 uint32_t mysignificand = i & 0x7fffff;
2933
Dale Johannesen343e7702007-08-24 00:56:33 +00002934 initialize(&APFloat::IEEEsingle);
Dale Johannesen343e7702007-08-24 00:56:33 +00002935 assert(partCount()==1);
2936
Dale Johanneseneaf08942007-08-31 04:03:46 +00002937 sign = i >> 31;
Dale Johannesen343e7702007-08-24 00:56:33 +00002938 if (myexponent==0 && mysignificand==0) {
2939 // exponent, significand meaningless
2940 category = fcZero;
Dale Johannesen343e7702007-08-24 00:56:33 +00002941 } else if (myexponent==0xff && mysignificand==0) {
2942 // exponent, significand meaningless
2943 category = fcInfinity;
Dale Johannesen902ff942007-09-25 17:25:00 +00002944 } else if (myexponent==0xff && mysignificand!=0) {
Dale Johannesen343e7702007-08-24 00:56:33 +00002945 // sign, exponent, significand meaningless
Dale Johanneseneaf08942007-08-31 04:03:46 +00002946 category = fcNaN;
2947 *significandParts() = mysignificand;
Dale Johannesen343e7702007-08-24 00:56:33 +00002948 } else {
2949 category = fcNormal;
Dale Johannesen343e7702007-08-24 00:56:33 +00002950 exponent = myexponent - 127; //bias
Dale Johannesen58c2e4c2007-09-05 20:39:49 +00002951 *significandParts() = mysignificand;
2952 if (myexponent==0) // denormal
2953 exponent = -126;
2954 else
2955 *significandParts() |= 0x800000; // integer bit
Dale Johannesen343e7702007-08-24 00:56:33 +00002956 }
2957}
Dale Johannesen3f6eb742007-09-11 18:32:33 +00002958
2959/// Treat api as containing the bits of a floating point number. Currently
Dale Johannesena471c2e2007-10-11 18:07:22 +00002960/// we infer the floating point type from the size of the APInt. The
2961/// isIEEE argument distinguishes between PPC128 and IEEE128 (not meaningful
2962/// when the size is anything else).
Dale Johannesen3f6eb742007-09-11 18:32:33 +00002963void
Dale Johannesena471c2e2007-10-11 18:07:22 +00002964APFloat::initFromAPInt(const APInt& api, bool isIEEE)
Neil Booth4f881702007-09-26 21:33:42 +00002965{
Dale Johannesen3f6eb742007-09-11 18:32:33 +00002966 if (api.getBitWidth() == 32)
2967 return initFromFloatAPInt(api);
2968 else if (api.getBitWidth()==64)
2969 return initFromDoubleAPInt(api);
2970 else if (api.getBitWidth()==80)
2971 return initFromF80LongDoubleAPInt(api);
Dale Johannesena471c2e2007-10-11 18:07:22 +00002972 else if (api.getBitWidth()==128 && !isIEEE)
2973 return initFromPPCDoubleDoubleAPInt(api);
Dale Johannesen3f6eb742007-09-11 18:32:33 +00002974 else
Torok Edwinc23197a2009-07-14 16:55:14 +00002975 llvm_unreachable(0);
Dale Johannesen3f6eb742007-09-11 18:32:33 +00002976}
2977
Dale Johannesena471c2e2007-10-11 18:07:22 +00002978APFloat::APFloat(const APInt& api, bool isIEEE)
Neil Booth4f881702007-09-26 21:33:42 +00002979{
Dale Johannesena471c2e2007-10-11 18:07:22 +00002980 initFromAPInt(api, isIEEE);
Dale Johannesen3f6eb742007-09-11 18:32:33 +00002981}
2982
Neil Booth4f881702007-09-26 21:33:42 +00002983APFloat::APFloat(float f)
2984{
Dale Johannesen3f6eb742007-09-11 18:32:33 +00002985 APInt api = APInt(32, 0);
2986 initFromAPInt(api.floatToBits(f));
2987}
2988
Neil Booth4f881702007-09-26 21:33:42 +00002989APFloat::APFloat(double d)
2990{
Dale Johannesen3f6eb742007-09-11 18:32:33 +00002991 APInt api = APInt(64, 0);
2992 initFromAPInt(api.doubleToBits(d));
2993}