blob: 8913dd6def56dbe252d2af2cc154ac643c6020ab [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"
Jeffrey Yasskin3d42bfb2011-07-15 07:04:56 +000016#include "llvm/ADT/APSInt.h"
Erick Tryzelaara15d8902009-08-16 23:36:19 +000017#include "llvm/ADT/StringRef.h"
Ted Kremenek1f801fa2008-02-11 17:24:50 +000018#include "llvm/ADT/FoldingSet.h"
Torok Edwinc25e7582009-07-11 20:10:48 +000019#include "llvm/Support/ErrorHandling.h"
Dale Johannesend3b51fd2007-08-24 05:08:11 +000020#include "llvm/Support/MathExtras.h"
John McCall8b3f3302010-02-26 22:20:41 +000021#include <limits.h>
Chris Lattnerfad86b02008-08-17 07:19:36 +000022#include <cstring>
Chris Lattnerb39cdde2007-08-20 22:49:32 +000023
24using namespace llvm;
25
26#define convolve(lhs, rhs) ((lhs) * 4 + (rhs))
27
Neil Bootha30b0ee2007-10-03 22:26:02 +000028/* Assumed in hexadecimal significand parsing, and conversion to
29 hexadecimal strings. */
Chris Lattner9f17eb02008-08-17 04:58:58 +000030#define COMPILE_TIME_ASSERT(cond) extern int CTAssert[(cond) ? 1 : -1]
Chris Lattnerb39cdde2007-08-20 22:49:32 +000031COMPILE_TIME_ASSERT(integerPartWidth % 4 == 0);
32
33namespace llvm {
34
35 /* Represents floating point arithmetic semantics. */
36 struct fltSemantics {
37 /* The largest E such that 2^E is representable; this matches the
38 definition of IEEE 754. */
39 exponent_t maxExponent;
40
41 /* The smallest E such that 2^E is a normalized number; this
42 matches the definition of IEEE 754. */
43 exponent_t minExponent;
44
45 /* Number of bits in the significand. This includes the integer
46 bit. */
Neil Booth7a951ca2007-10-12 15:33:27 +000047 unsigned int precision;
Neil Boothcaf19d72007-10-14 10:29:28 +000048
49 /* True if arithmetic is supported. */
50 unsigned int arithmeticOK;
Chris Lattnerb39cdde2007-08-20 22:49:32 +000051 };
52
Chris Lattnercc4287a2009-10-16 02:13:51 +000053 const fltSemantics APFloat::IEEEhalf = { 15, -14, 11, true };
Neil Boothcaf19d72007-10-14 10:29:28 +000054 const fltSemantics APFloat::IEEEsingle = { 127, -126, 24, true };
55 const fltSemantics APFloat::IEEEdouble = { 1023, -1022, 53, true };
56 const fltSemantics APFloat::IEEEquad = { 16383, -16382, 113, true };
57 const fltSemantics APFloat::x87DoubleExtended = { 16383, -16382, 64, true };
58 const fltSemantics APFloat::Bogus = { 0, 0, 0, true };
Dale Johannesena471c2e2007-10-11 18:07:22 +000059
60 // The PowerPC format consists of two doubles. It does not map cleanly
61 // onto the usual format above. For now only storage of constants of
62 // this type is supported, no arithmetic.
Neil Boothcaf19d72007-10-14 10:29:28 +000063 const fltSemantics APFloat::PPCDoubleDouble = { 1023, -1022, 106, false };
Neil Booth96c74712007-10-12 16:02:31 +000064
65 /* A tight upper bound on number of parts required to hold the value
66 pow(5, power) is
67
Neil Booth686700e2007-10-15 15:00:55 +000068 power * 815 / (351 * integerPartWidth) + 1
Dan Gohman16e02092010-03-24 19:38:02 +000069
Neil Booth96c74712007-10-12 16:02:31 +000070 However, whilst the result may require only this many parts,
71 because we are multiplying two values to get it, the
72 multiplication may require an extra part with the excess part
73 being zero (consider the trivial case of 1 * 1, tcFullMultiply
74 requires two parts to hold the single-part result). So we add an
75 extra one to guarantee enough space whilst multiplying. */
76 const unsigned int maxExponent = 16383;
77 const unsigned int maxPrecision = 113;
78 const unsigned int maxPowerOfFiveExponent = maxExponent + maxPrecision - 1;
Neil Booth686700e2007-10-15 15:00:55 +000079 const unsigned int maxPowerOfFiveParts = 2 + ((maxPowerOfFiveExponent * 815)
80 / (351 * integerPartWidth));
Chris Lattnerb39cdde2007-08-20 22:49:32 +000081}
82
Chris Lattnere213f3f2009-03-12 23:59:55 +000083/* A bunch of private, handy routines. */
Chris Lattnerb39cdde2007-08-20 22:49:32 +000084
Chris Lattnere213f3f2009-03-12 23:59:55 +000085static inline unsigned int
86partCountForBits(unsigned int bits)
87{
88 return ((bits) + integerPartWidth - 1) / integerPartWidth;
89}
Chris Lattnerb39cdde2007-08-20 22:49:32 +000090
Chris Lattnere213f3f2009-03-12 23:59:55 +000091/* Returns 0U-9U. Return values >= 10U are not digits. */
92static inline unsigned int
93decDigitValue(unsigned int c)
94{
95 return c - '0';
96}
Chris Lattnerb39cdde2007-08-20 22:49:32 +000097
Chris Lattnere213f3f2009-03-12 23:59:55 +000098static unsigned int
99hexDigitValue(unsigned int c)
100{
101 unsigned int r;
Chris Lattnerb39cdde2007-08-20 22:49:32 +0000102
Chris Lattnere213f3f2009-03-12 23:59:55 +0000103 r = c - '0';
Dan Gohman16e02092010-03-24 19:38:02 +0000104 if (r <= 9)
Chris Lattnere213f3f2009-03-12 23:59:55 +0000105 return r;
Chris Lattnerb39cdde2007-08-20 22:49:32 +0000106
Chris Lattnere213f3f2009-03-12 23:59:55 +0000107 r = c - 'A';
Dan Gohman16e02092010-03-24 19:38:02 +0000108 if (r <= 5)
Chris Lattnere213f3f2009-03-12 23:59:55 +0000109 return r + 10;
Chris Lattnerb39cdde2007-08-20 22:49:32 +0000110
Chris Lattnere213f3f2009-03-12 23:59:55 +0000111 r = c - 'a';
Dan Gohman16e02092010-03-24 19:38:02 +0000112 if (r <= 5)
Chris Lattnere213f3f2009-03-12 23:59:55 +0000113 return r + 10;
Chris Lattnerb39cdde2007-08-20 22:49:32 +0000114
Chris Lattnere213f3f2009-03-12 23:59:55 +0000115 return -1U;
116}
Chris Lattnerb39cdde2007-08-20 22:49:32 +0000117
Chris Lattnere213f3f2009-03-12 23:59:55 +0000118static inline void
119assertArithmeticOK(const llvm::fltSemantics &semantics) {
Dan Gohman16e02092010-03-24 19:38:02 +0000120 assert(semantics.arithmeticOK &&
121 "Compile-time arithmetic does not support these semantics");
Chris Lattnere213f3f2009-03-12 23:59:55 +0000122}
Neil Boothcaf19d72007-10-14 10:29:28 +0000123
Chris Lattnere213f3f2009-03-12 23:59:55 +0000124/* Return the value of a decimal exponent of the form
125 [+-]ddddddd.
Neil Booth1870f292007-10-14 10:16:12 +0000126
Chris Lattnere213f3f2009-03-12 23:59:55 +0000127 If the exponent overflows, returns a large exponent with the
128 appropriate sign. */
129static int
Erick Tryzelaara15d8902009-08-16 23:36:19 +0000130readExponent(StringRef::iterator begin, StringRef::iterator end)
Chris Lattnere213f3f2009-03-12 23:59:55 +0000131{
132 bool isNegative;
133 unsigned int absExponent;
134 const unsigned int overlargeExponent = 24000; /* FIXME. */
Erick Tryzelaara15d8902009-08-16 23:36:19 +0000135 StringRef::iterator p = begin;
136
137 assert(p != end && "Exponent has no digits");
Neil Booth1870f292007-10-14 10:16:12 +0000138
Chris Lattnere213f3f2009-03-12 23:59:55 +0000139 isNegative = (*p == '-');
Erick Tryzelaara15d8902009-08-16 23:36:19 +0000140 if (*p == '-' || *p == '+') {
Chris Lattnerb39cdde2007-08-20 22:49:32 +0000141 p++;
Erick Tryzelaara15d8902009-08-16 23:36:19 +0000142 assert(p != end && "Exponent has no digits");
143 }
Chris Lattnerb39cdde2007-08-20 22:49:32 +0000144
Chris Lattnere213f3f2009-03-12 23:59:55 +0000145 absExponent = decDigitValue(*p++);
Erick Tryzelaara15d8902009-08-16 23:36:19 +0000146 assert(absExponent < 10U && "Invalid character in exponent");
Chris Lattnerb39cdde2007-08-20 22:49:32 +0000147
Erick Tryzelaara15d8902009-08-16 23:36:19 +0000148 for (; p != end; ++p) {
Chris Lattnere213f3f2009-03-12 23:59:55 +0000149 unsigned int value;
Chris Lattnerb39cdde2007-08-20 22:49:32 +0000150
Chris Lattnere213f3f2009-03-12 23:59:55 +0000151 value = decDigitValue(*p);
Erick Tryzelaara15d8902009-08-16 23:36:19 +0000152 assert(value < 10U && "Invalid character in exponent");
Chris Lattnere213f3f2009-03-12 23:59:55 +0000153
Chris Lattnere213f3f2009-03-12 23:59:55 +0000154 value += absExponent * 10;
155 if (absExponent >= overlargeExponent) {
156 absExponent = overlargeExponent;
Dale Johannesenb1508d12010-08-19 17:58:35 +0000157 p = end; /* outwit assert below */
Chris Lattnere213f3f2009-03-12 23:59:55 +0000158 break;
Chris Lattnerb39cdde2007-08-20 22:49:32 +0000159 }
Chris Lattnere213f3f2009-03-12 23:59:55 +0000160 absExponent = value;
161 }
Chris Lattnerb39cdde2007-08-20 22:49:32 +0000162
Erick Tryzelaara15d8902009-08-16 23:36:19 +0000163 assert(p == end && "Invalid exponent in exponent");
164
Chris Lattnere213f3f2009-03-12 23:59:55 +0000165 if (isNegative)
166 return -(int) absExponent;
167 else
168 return (int) absExponent;
169}
170
171/* This is ugly and needs cleaning up, but I don't immediately see
172 how whilst remaining safe. */
173static int
Erick Tryzelaara15d8902009-08-16 23:36:19 +0000174totalExponent(StringRef::iterator p, StringRef::iterator end,
175 int exponentAdjustment)
Chris Lattnere213f3f2009-03-12 23:59:55 +0000176{
177 int unsignedExponent;
178 bool negative, overflow;
Ted Kremenek584520e2011-01-23 17:05:06 +0000179 int exponent = 0;
Chris Lattnere213f3f2009-03-12 23:59:55 +0000180
Erick Tryzelaarc78b33b2009-08-20 23:30:43 +0000181 assert(p != end && "Exponent has no digits");
182
Chris Lattnere213f3f2009-03-12 23:59:55 +0000183 negative = *p == '-';
Dan Gohman16e02092010-03-24 19:38:02 +0000184 if (*p == '-' || *p == '+') {
Chris Lattnere213f3f2009-03-12 23:59:55 +0000185 p++;
Erick Tryzelaarc78b33b2009-08-20 23:30:43 +0000186 assert(p != end && "Exponent has no digits");
187 }
Chris Lattnere213f3f2009-03-12 23:59:55 +0000188
189 unsignedExponent = 0;
190 overflow = false;
Dan Gohman16e02092010-03-24 19:38:02 +0000191 for (; p != end; ++p) {
Chris Lattnere213f3f2009-03-12 23:59:55 +0000192 unsigned int value;
193
194 value = decDigitValue(*p);
Erick Tryzelaara15d8902009-08-16 23:36:19 +0000195 assert(value < 10U && "Invalid character in exponent");
Chris Lattnere213f3f2009-03-12 23:59:55 +0000196
Chris Lattnere213f3f2009-03-12 23:59:55 +0000197 unsignedExponent = unsignedExponent * 10 + value;
Abramo Bagnara4bb46f42011-01-06 16:55:14 +0000198 if (unsignedExponent > 32767)
Chris Lattnerb39cdde2007-08-20 22:49:32 +0000199 overflow = true;
Chris Lattnerb39cdde2007-08-20 22:49:32 +0000200 }
201
Abramo Bagnara4bb46f42011-01-06 16:55:14 +0000202 if (exponentAdjustment > 32767 || exponentAdjustment < -32768)
Chris Lattnere213f3f2009-03-12 23:59:55 +0000203 overflow = true;
204
Dan Gohman16e02092010-03-24 19:38:02 +0000205 if (!overflow) {
Chris Lattnere213f3f2009-03-12 23:59:55 +0000206 exponent = unsignedExponent;
Dan Gohman16e02092010-03-24 19:38:02 +0000207 if (negative)
Chris Lattnere213f3f2009-03-12 23:59:55 +0000208 exponent = -exponent;
209 exponent += exponentAdjustment;
Abramo Bagnara4bb46f42011-01-06 16:55:14 +0000210 if (exponent > 32767 || exponent < -32768)
Chris Lattnere213f3f2009-03-12 23:59:55 +0000211 overflow = true;
212 }
213
Dan Gohman16e02092010-03-24 19:38:02 +0000214 if (overflow)
Abramo Bagnara4bb46f42011-01-06 16:55:14 +0000215 exponent = negative ? -32768: 32767;
Chris Lattnere213f3f2009-03-12 23:59:55 +0000216
217 return exponent;
218}
219
Erick Tryzelaara15d8902009-08-16 23:36:19 +0000220static StringRef::iterator
221skipLeadingZeroesAndAnyDot(StringRef::iterator begin, StringRef::iterator end,
222 StringRef::iterator *dot)
Chris Lattnere213f3f2009-03-12 23:59:55 +0000223{
Erick Tryzelaara15d8902009-08-16 23:36:19 +0000224 StringRef::iterator p = begin;
225 *dot = end;
Dan Gohman16e02092010-03-24 19:38:02 +0000226 while (*p == '0' && p != end)
Chris Lattnere213f3f2009-03-12 23:59:55 +0000227 p++;
228
Dan Gohman16e02092010-03-24 19:38:02 +0000229 if (*p == '.') {
Chris Lattnere213f3f2009-03-12 23:59:55 +0000230 *dot = p++;
Erick Tryzelaara15d8902009-08-16 23:36:19 +0000231
Erick Tryzelaarc78b33b2009-08-20 23:30:43 +0000232 assert(end - begin != 1 && "Significand has no digits");
Erick Tryzelaara15d8902009-08-16 23:36:19 +0000233
Dan Gohman16e02092010-03-24 19:38:02 +0000234 while (*p == '0' && p != end)
Chris Lattnerb39cdde2007-08-20 22:49:32 +0000235 p++;
Chris Lattnerb39cdde2007-08-20 22:49:32 +0000236 }
237
Chris Lattnere213f3f2009-03-12 23:59:55 +0000238 return p;
239}
Neil Booth1870f292007-10-14 10:16:12 +0000240
Chris Lattnere213f3f2009-03-12 23:59:55 +0000241/* Given a normal decimal floating point number of the form
Neil Booth1870f292007-10-14 10:16:12 +0000242
Chris Lattnere213f3f2009-03-12 23:59:55 +0000243 dddd.dddd[eE][+-]ddd
Neil Booth686700e2007-10-15 15:00:55 +0000244
Chris Lattnere213f3f2009-03-12 23:59:55 +0000245 where the decimal point and exponent are optional, fill out the
246 structure D. Exponent is appropriate if the significand is
247 treated as an integer, and normalizedExponent if the significand
248 is taken to have the decimal point after a single leading
249 non-zero digit.
Neil Booth1870f292007-10-14 10:16:12 +0000250
Chris Lattnere213f3f2009-03-12 23:59:55 +0000251 If the value is zero, V->firstSigDigit points to a non-digit, and
252 the return exponent is zero.
253*/
254struct decimalInfo {
255 const char *firstSigDigit;
256 const char *lastSigDigit;
257 int exponent;
258 int normalizedExponent;
259};
Neil Booth1870f292007-10-14 10:16:12 +0000260
Chris Lattnere213f3f2009-03-12 23:59:55 +0000261static void
Erick Tryzelaara15d8902009-08-16 23:36:19 +0000262interpretDecimal(StringRef::iterator begin, StringRef::iterator end,
263 decimalInfo *D)
Chris Lattnere213f3f2009-03-12 23:59:55 +0000264{
Erick Tryzelaara15d8902009-08-16 23:36:19 +0000265 StringRef::iterator dot = end;
266 StringRef::iterator p = skipLeadingZeroesAndAnyDot (begin, end, &dot);
Neil Booth1870f292007-10-14 10:16:12 +0000267
Chris Lattnere213f3f2009-03-12 23:59:55 +0000268 D->firstSigDigit = p;
269 D->exponent = 0;
270 D->normalizedExponent = 0;
271
Erick Tryzelaara15d8902009-08-16 23:36:19 +0000272 for (; p != end; ++p) {
Chris Lattnere213f3f2009-03-12 23:59:55 +0000273 if (*p == '.') {
Erick Tryzelaarc78b33b2009-08-20 23:30:43 +0000274 assert(dot == end && "String contains multiple dots");
Chris Lattnere213f3f2009-03-12 23:59:55 +0000275 dot = p++;
Erick Tryzelaara15d8902009-08-16 23:36:19 +0000276 if (p == end)
277 break;
Neil Booth1870f292007-10-14 10:16:12 +0000278 }
Chris Lattnere213f3f2009-03-12 23:59:55 +0000279 if (decDigitValue(*p) >= 10U)
280 break;
Chris Lattnere213f3f2009-03-12 23:59:55 +0000281 }
Neil Booth1870f292007-10-14 10:16:12 +0000282
Erick Tryzelaara15d8902009-08-16 23:36:19 +0000283 if (p != end) {
Erick Tryzelaarc78b33b2009-08-20 23:30:43 +0000284 assert((*p == 'e' || *p == 'E') && "Invalid character in significand");
285 assert(p != begin && "Significand has no digits");
286 assert((dot == end || p - begin != 1) && "Significand has no digits");
Erick Tryzelaara15d8902009-08-16 23:36:19 +0000287
288 /* p points to the first non-digit in the string */
Erick Tryzelaarc78b33b2009-08-20 23:30:43 +0000289 D->exponent = readExponent(p + 1, end);
Neil Booth1870f292007-10-14 10:16:12 +0000290
Chris Lattnere213f3f2009-03-12 23:59:55 +0000291 /* Implied decimal point? */
Erick Tryzelaara15d8902009-08-16 23:36:19 +0000292 if (dot == end)
Chris Lattnere213f3f2009-03-12 23:59:55 +0000293 dot = p;
Erick Tryzelaara15d8902009-08-16 23:36:19 +0000294 }
Neil Booth1870f292007-10-14 10:16:12 +0000295
Erick Tryzelaara15d8902009-08-16 23:36:19 +0000296 /* If number is all zeroes accept any exponent. */
297 if (p != D->firstSigDigit) {
Chris Lattnere213f3f2009-03-12 23:59:55 +0000298 /* Drop insignificant trailing zeroes. */
Erick Tryzelaara15d8902009-08-16 23:36:19 +0000299 if (p != begin) {
Neil Booth1870f292007-10-14 10:16:12 +0000300 do
Erick Tryzelaara15d8902009-08-16 23:36:19 +0000301 do
302 p--;
303 while (p != begin && *p == '0');
304 while (p != begin && *p == '.');
305 }
Neil Booth1870f292007-10-14 10:16:12 +0000306
Chris Lattnere213f3f2009-03-12 23:59:55 +0000307 /* Adjust the exponents for any decimal point. */
308 D->exponent += static_cast<exponent_t>((dot - p) - (dot > p));
309 D->normalizedExponent = (D->exponent +
310 static_cast<exponent_t>((p - D->firstSigDigit)
311 - (dot > D->firstSigDigit && dot < p)));
Neil Booth1870f292007-10-14 10:16:12 +0000312 }
313
Chris Lattnere213f3f2009-03-12 23:59:55 +0000314 D->lastSigDigit = p;
315}
Chris Lattnerb39cdde2007-08-20 22:49:32 +0000316
Chris Lattnere213f3f2009-03-12 23:59:55 +0000317/* Return the trailing fraction of a hexadecimal number.
318 DIGITVALUE is the first hex digit of the fraction, P points to
319 the next digit. */
320static lostFraction
Erick Tryzelaara15d8902009-08-16 23:36:19 +0000321trailingHexadecimalFraction(StringRef::iterator p, StringRef::iterator end,
322 unsigned int digitValue)
Chris Lattnere213f3f2009-03-12 23:59:55 +0000323{
324 unsigned int hexDigit;
Chris Lattnerb39cdde2007-08-20 22:49:32 +0000325
Chris Lattnere213f3f2009-03-12 23:59:55 +0000326 /* If the first trailing digit isn't 0 or 8 we can work out the
327 fraction immediately. */
Dan Gohman16e02092010-03-24 19:38:02 +0000328 if (digitValue > 8)
Chris Lattnere213f3f2009-03-12 23:59:55 +0000329 return lfMoreThanHalf;
Dan Gohman16e02092010-03-24 19:38:02 +0000330 else if (digitValue < 8 && digitValue > 0)
Chris Lattnerb39cdde2007-08-20 22:49:32 +0000331 return lfLessThanHalf;
Chris Lattnere213f3f2009-03-12 23:59:55 +0000332
333 /* Otherwise we need to find the first non-zero digit. */
Dan Gohman16e02092010-03-24 19:38:02 +0000334 while (*p == '0')
Chris Lattnere213f3f2009-03-12 23:59:55 +0000335 p++;
336
Erick Tryzelaara15d8902009-08-16 23:36:19 +0000337 assert(p != end && "Invalid trailing hexadecimal fraction!");
338
Chris Lattnere213f3f2009-03-12 23:59:55 +0000339 hexDigit = hexDigitValue(*p);
340
341 /* If we ran off the end it is exactly zero or one-half, otherwise
342 a little more. */
Dan Gohman16e02092010-03-24 19:38:02 +0000343 if (hexDigit == -1U)
Chris Lattnere213f3f2009-03-12 23:59:55 +0000344 return digitValue == 0 ? lfExactlyZero: lfExactlyHalf;
345 else
346 return digitValue == 0 ? lfLessThanHalf: lfMoreThanHalf;
347}
348
349/* Return the fraction lost were a bignum truncated losing the least
350 significant BITS bits. */
351static lostFraction
352lostFractionThroughTruncation(const integerPart *parts,
353 unsigned int partCount,
354 unsigned int bits)
355{
356 unsigned int lsb;
357
358 lsb = APInt::tcLSB(parts, partCount);
359
360 /* Note this is guaranteed true if bits == 0, or LSB == -1U. */
Dan Gohman16e02092010-03-24 19:38:02 +0000361 if (bits <= lsb)
Chris Lattnere213f3f2009-03-12 23:59:55 +0000362 return lfExactlyZero;
Dan Gohman16e02092010-03-24 19:38:02 +0000363 if (bits == lsb + 1)
Chris Lattnere213f3f2009-03-12 23:59:55 +0000364 return lfExactlyHalf;
Dan Gohman16e02092010-03-24 19:38:02 +0000365 if (bits <= partCount * integerPartWidth &&
366 APInt::tcExtractBit(parts, bits - 1))
Chris Lattnere213f3f2009-03-12 23:59:55 +0000367 return lfMoreThanHalf;
368
369 return lfLessThanHalf;
370}
371
372/* Shift DST right BITS bits noting lost fraction. */
373static lostFraction
374shiftRight(integerPart *dst, unsigned int parts, unsigned int bits)
375{
376 lostFraction lost_fraction;
377
378 lost_fraction = lostFractionThroughTruncation(dst, parts, bits);
379
380 APInt::tcShiftRight(dst, parts, bits);
381
382 return lost_fraction;
383}
384
385/* Combine the effect of two lost fractions. */
386static lostFraction
387combineLostFractions(lostFraction moreSignificant,
388 lostFraction lessSignificant)
389{
Dan Gohman16e02092010-03-24 19:38:02 +0000390 if (lessSignificant != lfExactlyZero) {
391 if (moreSignificant == lfExactlyZero)
Chris Lattnere213f3f2009-03-12 23:59:55 +0000392 moreSignificant = lfLessThanHalf;
Dan Gohman16e02092010-03-24 19:38:02 +0000393 else if (moreSignificant == lfExactlyHalf)
Chris Lattnere213f3f2009-03-12 23:59:55 +0000394 moreSignificant = lfMoreThanHalf;
Chris Lattnerb39cdde2007-08-20 22:49:32 +0000395 }
396
Chris Lattnere213f3f2009-03-12 23:59:55 +0000397 return moreSignificant;
398}
Chris Lattnerb39cdde2007-08-20 22:49:32 +0000399
Chris Lattnere213f3f2009-03-12 23:59:55 +0000400/* The error from the true value, in half-ulps, on multiplying two
401 floating point numbers, which differ from the value they
402 approximate by at most HUE1 and HUE2 half-ulps, is strictly less
403 than the returned value.
Chris Lattnerb39cdde2007-08-20 22:49:32 +0000404
Chris Lattnere213f3f2009-03-12 23:59:55 +0000405 See "How to Read Floating Point Numbers Accurately" by William D
406 Clinger. */
407static unsigned int
408HUerrBound(bool inexactMultiply, unsigned int HUerr1, unsigned int HUerr2)
409{
410 assert(HUerr1 < 2 || HUerr2 < 2 || (HUerr1 + HUerr2 < 8));
Chris Lattnerb39cdde2007-08-20 22:49:32 +0000411
Chris Lattnere213f3f2009-03-12 23:59:55 +0000412 if (HUerr1 + HUerr2 == 0)
413 return inexactMultiply * 2; /* <= inexactMultiply half-ulps. */
414 else
415 return inexactMultiply + 2 * (HUerr1 + HUerr2);
416}
Neil Bootha30b0ee2007-10-03 22:26:02 +0000417
Chris Lattnere213f3f2009-03-12 23:59:55 +0000418/* The number of ulps from the boundary (zero, or half if ISNEAREST)
419 when the least significant BITS are truncated. BITS cannot be
420 zero. */
421static integerPart
422ulpsFromBoundary(const integerPart *parts, unsigned int bits, bool isNearest)
423{
424 unsigned int count, partBits;
425 integerPart part, boundary;
Neil Booth33d4c922007-10-07 08:51:21 +0000426
Evan Cheng99ebfa52009-10-27 21:35:42 +0000427 assert(bits != 0);
Neil Bootha30b0ee2007-10-03 22:26:02 +0000428
Chris Lattnere213f3f2009-03-12 23:59:55 +0000429 bits--;
430 count = bits / integerPartWidth;
431 partBits = bits % integerPartWidth + 1;
Neil Booth96c74712007-10-12 16:02:31 +0000432
Chris Lattnere213f3f2009-03-12 23:59:55 +0000433 part = parts[count] & (~(integerPart) 0 >> (integerPartWidth - partBits));
Neil Booth96c74712007-10-12 16:02:31 +0000434
Chris Lattnere213f3f2009-03-12 23:59:55 +0000435 if (isNearest)
436 boundary = (integerPart) 1 << (partBits - 1);
437 else
438 boundary = 0;
439
440 if (count == 0) {
441 if (part - boundary <= boundary - part)
442 return part - boundary;
Neil Booth96c74712007-10-12 16:02:31 +0000443 else
Chris Lattnere213f3f2009-03-12 23:59:55 +0000444 return boundary - part;
Neil Booth96c74712007-10-12 16:02:31 +0000445 }
446
Chris Lattnere213f3f2009-03-12 23:59:55 +0000447 if (part == boundary) {
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 } else if (part == boundary - 1) {
454 while (--count)
455 if (~parts[count])
456 return ~(integerPart) 0; /* A lot. */
Neil Booth96c74712007-10-12 16:02:31 +0000457
Chris Lattnere213f3f2009-03-12 23:59:55 +0000458 return -parts[0];
459 }
Neil Booth96c74712007-10-12 16:02:31 +0000460
Chris Lattnere213f3f2009-03-12 23:59:55 +0000461 return ~(integerPart) 0; /* A lot. */
462}
Neil Booth96c74712007-10-12 16:02:31 +0000463
Chris Lattnere213f3f2009-03-12 23:59:55 +0000464/* Place pow(5, power) in DST, and return the number of parts used.
465 DST must be at least one part larger than size of the answer. */
466static unsigned int
467powerOf5(integerPart *dst, unsigned int power)
468{
469 static const integerPart firstEightPowers[] = { 1, 5, 25, 125, 625, 3125,
470 15625, 78125 };
Chris Lattneree167a72009-03-13 00:24:01 +0000471 integerPart pow5s[maxPowerOfFiveParts * 2 + 5];
472 pow5s[0] = 78125 * 5;
Dan Gohman16e02092010-03-24 19:38:02 +0000473
Chris Lattner807926a2009-03-13 00:03:51 +0000474 unsigned int partsCount[16] = { 1 };
Chris Lattnere213f3f2009-03-12 23:59:55 +0000475 integerPart scratch[maxPowerOfFiveParts], *p1, *p2, *pow5;
476 unsigned int result;
Chris Lattnere213f3f2009-03-12 23:59:55 +0000477 assert(power <= maxExponent);
478
479 p1 = dst;
480 p2 = scratch;
481
482 *p1 = firstEightPowers[power & 7];
483 power >>= 3;
484
485 result = 1;
486 pow5 = pow5s;
487
488 for (unsigned int n = 0; power; power >>= 1, n++) {
489 unsigned int pc;
490
491 pc = partsCount[n];
492
493 /* Calculate pow(5,pow(2,n+3)) if we haven't yet. */
494 if (pc == 0) {
495 pc = partsCount[n - 1];
496 APInt::tcFullMultiply(pow5, pow5 - pc, pow5 - pc, pc, pc);
497 pc *= 2;
498 if (pow5[pc - 1] == 0)
499 pc--;
500 partsCount[n] = pc;
Neil Booth96c74712007-10-12 16:02:31 +0000501 }
502
Chris Lattnere213f3f2009-03-12 23:59:55 +0000503 if (power & 1) {
504 integerPart *tmp;
Neil Booth96c74712007-10-12 16:02:31 +0000505
Chris Lattnere213f3f2009-03-12 23:59:55 +0000506 APInt::tcFullMultiply(p2, p1, pow5, result, pc);
507 result += pc;
508 if (p2[result - 1] == 0)
509 result--;
Neil Booth96c74712007-10-12 16:02:31 +0000510
Chris Lattnere213f3f2009-03-12 23:59:55 +0000511 /* Now result is in p1 with partsCount parts and p2 is scratch
512 space. */
513 tmp = p1, p1 = p2, p2 = tmp;
Neil Booth96c74712007-10-12 16:02:31 +0000514 }
515
Chris Lattnere213f3f2009-03-12 23:59:55 +0000516 pow5 += pc;
Neil Booth96c74712007-10-12 16:02:31 +0000517 }
518
Chris Lattnere213f3f2009-03-12 23:59:55 +0000519 if (p1 != dst)
520 APInt::tcAssign(dst, p1, result);
Neil Booth96c74712007-10-12 16:02:31 +0000521
Chris Lattnere213f3f2009-03-12 23:59:55 +0000522 return result;
523}
Neil Booth96c74712007-10-12 16:02:31 +0000524
Chris Lattnere213f3f2009-03-12 23:59:55 +0000525/* Zero at the end to avoid modular arithmetic when adding one; used
526 when rounding up during hexadecimal output. */
527static const char hexDigitsLower[] = "0123456789abcdef0";
528static const char hexDigitsUpper[] = "0123456789ABCDEF0";
529static const char infinityL[] = "infinity";
530static const char infinityU[] = "INFINITY";
531static const char NaNL[] = "nan";
532static const char NaNU[] = "NAN";
Neil Booth96c74712007-10-12 16:02:31 +0000533
Chris Lattnere213f3f2009-03-12 23:59:55 +0000534/* Write out an integerPart in hexadecimal, starting with the most
535 significant nibble. Write out exactly COUNT hexdigits, return
536 COUNT. */
537static unsigned int
538partAsHex (char *dst, integerPart part, unsigned int count,
539 const char *hexDigitChars)
540{
541 unsigned int result = count;
Neil Booth96c74712007-10-12 16:02:31 +0000542
Evan Cheng99ebfa52009-10-27 21:35:42 +0000543 assert(count != 0 && count <= integerPartWidth / 4);
Neil Booth96c74712007-10-12 16:02:31 +0000544
Chris Lattnere213f3f2009-03-12 23:59:55 +0000545 part >>= (integerPartWidth - 4 * count);
546 while (count--) {
547 dst[count] = hexDigitChars[part & 0xf];
548 part >>= 4;
Neil Booth96c74712007-10-12 16:02:31 +0000549 }
550
Chris Lattnere213f3f2009-03-12 23:59:55 +0000551 return result;
552}
Neil Bootha30b0ee2007-10-03 22:26:02 +0000553
Chris Lattnere213f3f2009-03-12 23:59:55 +0000554/* Write out an unsigned decimal integer. */
555static char *
556writeUnsignedDecimal (char *dst, unsigned int n)
557{
558 char buff[40], *p;
Neil Bootha30b0ee2007-10-03 22:26:02 +0000559
Chris Lattnere213f3f2009-03-12 23:59:55 +0000560 p = buff;
561 do
562 *p++ = '0' + n % 10;
563 while (n /= 10);
Neil Bootha30b0ee2007-10-03 22:26:02 +0000564
Chris Lattnere213f3f2009-03-12 23:59:55 +0000565 do
566 *dst++ = *--p;
567 while (p != buff);
Neil Bootha30b0ee2007-10-03 22:26:02 +0000568
Chris Lattnere213f3f2009-03-12 23:59:55 +0000569 return dst;
570}
Neil Bootha30b0ee2007-10-03 22:26:02 +0000571
Chris Lattnere213f3f2009-03-12 23:59:55 +0000572/* Write out a signed decimal integer. */
573static char *
574writeSignedDecimal (char *dst, int value)
575{
576 if (value < 0) {
577 *dst++ = '-';
578 dst = writeUnsignedDecimal(dst, -(unsigned) value);
579 } else
580 dst = writeUnsignedDecimal(dst, value);
Neil Bootha30b0ee2007-10-03 22:26:02 +0000581
Chris Lattnere213f3f2009-03-12 23:59:55 +0000582 return dst;
Chris Lattnerb39cdde2007-08-20 22:49:32 +0000583}
584
585/* Constructors. */
586void
587APFloat::initialize(const fltSemantics *ourSemantics)
588{
589 unsigned int count;
590
591 semantics = ourSemantics;
592 count = partCount();
Dan Gohman16e02092010-03-24 19:38:02 +0000593 if (count > 1)
Chris Lattnerb39cdde2007-08-20 22:49:32 +0000594 significand.parts = new integerPart[count];
595}
596
597void
598APFloat::freeSignificand()
599{
Dan Gohman16e02092010-03-24 19:38:02 +0000600 if (partCount() > 1)
Chris Lattnerb39cdde2007-08-20 22:49:32 +0000601 delete [] significand.parts;
602}
603
604void
605APFloat::assign(const APFloat &rhs)
606{
607 assert(semantics == rhs.semantics);
608
609 sign = rhs.sign;
610 category = rhs.category;
611 exponent = rhs.exponent;
Dale Johannesena471c2e2007-10-11 18:07:22 +0000612 sign2 = rhs.sign2;
613 exponent2 = rhs.exponent2;
Dan Gohman16e02092010-03-24 19:38:02 +0000614 if (category == fcNormal || category == fcNaN)
Chris Lattnerb39cdde2007-08-20 22:49:32 +0000615 copySignificand(rhs);
616}
617
618void
619APFloat::copySignificand(const APFloat &rhs)
620{
Dale Johanneseneaf08942007-08-31 04:03:46 +0000621 assert(category == fcNormal || category == fcNaN);
Chris Lattnerb39cdde2007-08-20 22:49:32 +0000622 assert(rhs.partCount() >= partCount());
623
624 APInt::tcAssign(significandParts(), rhs.significandParts(),
Neil Booth4f881702007-09-26 21:33:42 +0000625 partCount());
Chris Lattnerb39cdde2007-08-20 22:49:32 +0000626}
627
Neil Boothe5e01942007-10-14 10:39:51 +0000628/* Make this number a NaN, with an arbitrary but deterministic value
Dale Johannesen541ed9f2009-01-21 20:32:55 +0000629 for the significand. If double or longer, this is a signalling NaN,
Mike Stumpc5ca7132009-05-30 03:49:43 +0000630 which may not be ideal. If float, this is QNaN(0). */
John McCalle12b7382010-02-28 02:51:25 +0000631void APFloat::makeNaN(bool SNaN, bool Negative, const APInt *fill)
Neil Boothe5e01942007-10-14 10:39:51 +0000632{
633 category = fcNaN;
John McCalle12b7382010-02-28 02:51:25 +0000634 sign = Negative;
635
John McCall165e96b2010-02-28 12:49:50 +0000636 integerPart *significand = significandParts();
637 unsigned numParts = partCount();
638
John McCalle12b7382010-02-28 02:51:25 +0000639 // Set the significand bits to the fill.
John McCall165e96b2010-02-28 12:49:50 +0000640 if (!fill || fill->getNumWords() < numParts)
641 APInt::tcSet(significand, 0, numParts);
642 if (fill) {
John McCalld44c6cc2010-03-01 18:38:45 +0000643 APInt::tcAssign(significand, fill->getRawData(),
644 std::min(fill->getNumWords(), numParts));
John McCall165e96b2010-02-28 12:49:50 +0000645
646 // Zero out the excess bits of the significand.
647 unsigned bitsToPreserve = semantics->precision - 1;
648 unsigned part = bitsToPreserve / 64;
649 bitsToPreserve %= 64;
650 significand[part] &= ((1ULL << bitsToPreserve) - 1);
651 for (part++; part != numParts; ++part)
652 significand[part] = 0;
653 }
654
655 unsigned QNaNBit = semantics->precision - 2;
John McCalle12b7382010-02-28 02:51:25 +0000656
657 if (SNaN) {
658 // We always have to clear the QNaN bit to make it an SNaN.
John McCall165e96b2010-02-28 12:49:50 +0000659 APInt::tcClearBit(significand, QNaNBit);
John McCalle12b7382010-02-28 02:51:25 +0000660
661 // If there are no bits set in the payload, we have to set
662 // *something* to make it a NaN instead of an infinity;
663 // conventionally, this is the next bit down from the QNaN bit.
John McCall165e96b2010-02-28 12:49:50 +0000664 if (APInt::tcIsZero(significand, numParts))
665 APInt::tcSetBit(significand, QNaNBit - 1);
John McCalle12b7382010-02-28 02:51:25 +0000666 } else {
667 // We always have to set the QNaN bit to make it a QNaN.
John McCall165e96b2010-02-28 12:49:50 +0000668 APInt::tcSetBit(significand, QNaNBit);
John McCalle12b7382010-02-28 02:51:25 +0000669 }
John McCall165e96b2010-02-28 12:49:50 +0000670
671 // For x87 extended precision, we want to make a NaN, not a
672 // pseudo-NaN. Maybe we should expose the ability to make
673 // pseudo-NaNs?
674 if (semantics == &APFloat::x87DoubleExtended)
675 APInt::tcSetBit(significand, QNaNBit + 1);
John McCalle12b7382010-02-28 02:51:25 +0000676}
677
678APFloat APFloat::makeNaN(const fltSemantics &Sem, bool SNaN, bool Negative,
679 const APInt *fill) {
680 APFloat value(Sem, uninitialized);
681 value.makeNaN(SNaN, Negative, fill);
682 return value;
Neil Boothe5e01942007-10-14 10:39:51 +0000683}
684
Chris Lattnerb39cdde2007-08-20 22:49:32 +0000685APFloat &
686APFloat::operator=(const APFloat &rhs)
687{
Dan Gohman16e02092010-03-24 19:38:02 +0000688 if (this != &rhs) {
689 if (semantics != rhs.semantics) {
Chris Lattnerb39cdde2007-08-20 22:49:32 +0000690 freeSignificand();
691 initialize(rhs.semantics);
692 }
693 assign(rhs);
694 }
695
696 return *this;
697}
698
Dale Johannesen343e7702007-08-24 00:56:33 +0000699bool
Dale Johannesen12595d72007-08-24 22:09:56 +0000700APFloat::bitwiseIsEqual(const APFloat &rhs) const {
Dale Johannesen343e7702007-08-24 00:56:33 +0000701 if (this == &rhs)
702 return true;
703 if (semantics != rhs.semantics ||
Dale Johanneseneaf08942007-08-31 04:03:46 +0000704 category != rhs.category ||
705 sign != rhs.sign)
Dale Johannesen343e7702007-08-24 00:56:33 +0000706 return false;
Dan Gohmanb10abe12008-01-29 12:08:20 +0000707 if (semantics==(const llvm::fltSemantics*)&PPCDoubleDouble &&
Dale Johannesena471c2e2007-10-11 18:07:22 +0000708 sign2 != rhs.sign2)
709 return false;
Dale Johanneseneaf08942007-08-31 04:03:46 +0000710 if (category==fcZero || category==fcInfinity)
Dale Johannesen343e7702007-08-24 00:56:33 +0000711 return true;
Dale Johanneseneaf08942007-08-31 04:03:46 +0000712 else if (category==fcNormal && exponent!=rhs.exponent)
713 return false;
Dan Gohmanb10abe12008-01-29 12:08:20 +0000714 else if (semantics==(const llvm::fltSemantics*)&PPCDoubleDouble &&
Dale Johannesena471c2e2007-10-11 18:07:22 +0000715 exponent2!=rhs.exponent2)
716 return false;
Dale Johannesen343e7702007-08-24 00:56:33 +0000717 else {
Dale Johannesen343e7702007-08-24 00:56:33 +0000718 int i= partCount();
719 const integerPart* p=significandParts();
720 const integerPart* q=rhs.significandParts();
721 for (; i>0; i--, p++, q++) {
722 if (*p != *q)
723 return false;
724 }
725 return true;
726 }
727}
728
Chris Lattnerb39cdde2007-08-20 22:49:32 +0000729APFloat::APFloat(const fltSemantics &ourSemantics, integerPart value)
Bill Wendlingf09a8b52011-03-18 09:09:44 +0000730 : exponent2(0), sign2(0) {
Neil Boothcaf19d72007-10-14 10:29:28 +0000731 assertArithmeticOK(ourSemantics);
Chris Lattnerb39cdde2007-08-20 22:49:32 +0000732 initialize(&ourSemantics);
733 sign = 0;
734 zeroSignificand();
735 exponent = ourSemantics.precision - 1;
736 significandParts()[0] = value;
737 normalize(rmNearestTiesToEven, lfExactlyZero);
738}
739
Bill Wendlingf09a8b52011-03-18 09:09:44 +0000740APFloat::APFloat(const fltSemantics &ourSemantics) : exponent2(0), sign2(0) {
Chris Lattnerd7bd78e2009-09-17 01:08:43 +0000741 assertArithmeticOK(ourSemantics);
742 initialize(&ourSemantics);
743 category = fcZero;
744 sign = false;
745}
746
Bill Wendlingf09a8b52011-03-18 09:09:44 +0000747APFloat::APFloat(const fltSemantics &ourSemantics, uninitializedTag tag)
748 : exponent2(0), sign2(0) {
John McCalle12b7382010-02-28 02:51:25 +0000749 assertArithmeticOK(ourSemantics);
750 // Allocates storage if necessary but does not initialize it.
751 initialize(&ourSemantics);
752}
Chris Lattnerd7bd78e2009-09-17 01:08:43 +0000753
Chris Lattnerb39cdde2007-08-20 22:49:32 +0000754APFloat::APFloat(const fltSemantics &ourSemantics,
John McCalle12b7382010-02-28 02:51:25 +0000755 fltCategory ourCategory, bool negative)
Bill Wendlingf09a8b52011-03-18 09:09:44 +0000756 : exponent2(0), sign2(0) {
Neil Boothcaf19d72007-10-14 10:29:28 +0000757 assertArithmeticOK(ourSemantics);
Chris Lattnerb39cdde2007-08-20 22:49:32 +0000758 initialize(&ourSemantics);
759 category = ourCategory;
760 sign = negative;
Mike Stumpc5ca7132009-05-30 03:49:43 +0000761 if (category == fcNormal)
Chris Lattnerb39cdde2007-08-20 22:49:32 +0000762 category = fcZero;
Neil Boothe5e01942007-10-14 10:39:51 +0000763 else if (ourCategory == fcNaN)
John McCalle12b7382010-02-28 02:51:25 +0000764 makeNaN();
Chris Lattnerb39cdde2007-08-20 22:49:32 +0000765}
766
Benjamin Kramer38e59892010-07-14 22:38:02 +0000767APFloat::APFloat(const fltSemantics &ourSemantics, StringRef text)
Bill Wendlingf09a8b52011-03-18 09:09:44 +0000768 : exponent2(0), sign2(0) {
Neil Boothcaf19d72007-10-14 10:29:28 +0000769 assertArithmeticOK(ourSemantics);
Chris Lattnerb39cdde2007-08-20 22:49:32 +0000770 initialize(&ourSemantics);
771 convertFromString(text, rmNearestTiesToEven);
772}
773
Bill Wendlingf09a8b52011-03-18 09:09:44 +0000774APFloat::APFloat(const APFloat &rhs) : exponent2(0), sign2(0) {
Chris Lattnerb39cdde2007-08-20 22:49:32 +0000775 initialize(rhs.semantics);
776 assign(rhs);
777}
778
779APFloat::~APFloat()
780{
781 freeSignificand();
782}
783
Ted Kremenek1f801fa2008-02-11 17:24:50 +0000784// Profile - This method 'profiles' an APFloat for use with FoldingSet.
785void APFloat::Profile(FoldingSetNodeID& ID) const {
Dale Johannesen7111b022008-10-09 18:53:47 +0000786 ID.Add(bitcastToAPInt());
Ted Kremenek1f801fa2008-02-11 17:24:50 +0000787}
788
Chris Lattnerb39cdde2007-08-20 22:49:32 +0000789unsigned int
790APFloat::partCount() const
791{
Dale Johannesena72a5a02007-09-20 23:47:58 +0000792 return partCountForBits(semantics->precision + 1);
Chris Lattnerb39cdde2007-08-20 22:49:32 +0000793}
794
795unsigned int
796APFloat::semanticsPrecision(const fltSemantics &semantics)
797{
798 return semantics.precision;
799}
800
801const integerPart *
802APFloat::significandParts() const
803{
804 return const_cast<APFloat *>(this)->significandParts();
805}
806
807integerPart *
808APFloat::significandParts()
809{
Dale Johanneseneaf08942007-08-31 04:03:46 +0000810 assert(category == fcNormal || category == fcNaN);
Chris Lattnerb39cdde2007-08-20 22:49:32 +0000811
Evan Cheng99ebfa52009-10-27 21:35:42 +0000812 if (partCount() > 1)
Chris Lattnerb39cdde2007-08-20 22:49:32 +0000813 return significand.parts;
814 else
815 return &significand.part;
816}
817
Chris Lattnerb39cdde2007-08-20 22:49:32 +0000818void
819APFloat::zeroSignificand()
820{
821 category = fcNormal;
822 APInt::tcSet(significandParts(), 0, partCount());
823}
824
825/* Increment an fcNormal floating point number's significand. */
826void
827APFloat::incrementSignificand()
828{
829 integerPart carry;
830
831 carry = APInt::tcIncrement(significandParts(), partCount());
832
833 /* Our callers should never cause us to overflow. */
834 assert(carry == 0);
Duncan Sands1f6a3292011-08-12 14:54:45 +0000835 (void)carry;
Chris Lattnerb39cdde2007-08-20 22:49:32 +0000836}
837
838/* Add the significand of the RHS. Returns the carry flag. */
839integerPart
840APFloat::addSignificand(const APFloat &rhs)
841{
842 integerPart *parts;
843
844 parts = significandParts();
845
846 assert(semantics == rhs.semantics);
847 assert(exponent == rhs.exponent);
848
849 return APInt::tcAdd(parts, rhs.significandParts(), 0, partCount());
850}
851
852/* Subtract the significand of the RHS with a borrow flag. Returns
853 the borrow flag. */
854integerPart
855APFloat::subtractSignificand(const APFloat &rhs, integerPart borrow)
856{
857 integerPart *parts;
858
859 parts = significandParts();
860
861 assert(semantics == rhs.semantics);
862 assert(exponent == rhs.exponent);
863
864 return APInt::tcSubtract(parts, rhs.significandParts(), borrow,
Neil Booth4f881702007-09-26 21:33:42 +0000865 partCount());
Chris Lattnerb39cdde2007-08-20 22:49:32 +0000866}
867
868/* Multiply the significand of the RHS. If ADDEND is non-NULL, add it
869 on to the full-precision result of the multiplication. Returns the
870 lost fraction. */
871lostFraction
872APFloat::multiplySignificand(const APFloat &rhs, const APFloat *addend)
873{
Neil Booth4f881702007-09-26 21:33:42 +0000874 unsigned int omsb; // One, not zero, based MSB.
Chris Lattnerb39cdde2007-08-20 22:49:32 +0000875 unsigned int partsCount, newPartsCount, precision;
876 integerPart *lhsSignificand;
877 integerPart scratch[4];
878 integerPart *fullSignificand;
879 lostFraction lost_fraction;
Dale Johannesen23a98552008-10-09 23:00:39 +0000880 bool ignored;
Chris Lattnerb39cdde2007-08-20 22:49:32 +0000881
882 assert(semantics == rhs.semantics);
883
884 precision = semantics->precision;
885 newPartsCount = partCountForBits(precision * 2);
886
Dan Gohman16e02092010-03-24 19:38:02 +0000887 if (newPartsCount > 4)
Chris Lattnerb39cdde2007-08-20 22:49:32 +0000888 fullSignificand = new integerPart[newPartsCount];
889 else
890 fullSignificand = scratch;
891
892 lhsSignificand = significandParts();
893 partsCount = partCount();
894
895 APInt::tcFullMultiply(fullSignificand, lhsSignificand,
Neil Booth978661d2007-10-06 00:24:48 +0000896 rhs.significandParts(), partsCount, partsCount);
Chris Lattnerb39cdde2007-08-20 22:49:32 +0000897
898 lost_fraction = lfExactlyZero;
899 omsb = APInt::tcMSB(fullSignificand, newPartsCount) + 1;
900 exponent += rhs.exponent;
901
Dan Gohman16e02092010-03-24 19:38:02 +0000902 if (addend) {
Chris Lattnerb39cdde2007-08-20 22:49:32 +0000903 Significand savedSignificand = significand;
904 const fltSemantics *savedSemantics = semantics;
905 fltSemantics extendedSemantics;
906 opStatus status;
907 unsigned int extendedPrecision;
908
909 /* Normalize our MSB. */
910 extendedPrecision = precision + precision - 1;
Dan Gohman16e02092010-03-24 19:38:02 +0000911 if (omsb != extendedPrecision) {
912 APInt::tcShiftLeft(fullSignificand, newPartsCount,
913 extendedPrecision - omsb);
914 exponent -= extendedPrecision - omsb;
915 }
Chris Lattnerb39cdde2007-08-20 22:49:32 +0000916
917 /* Create new semantics. */
918 extendedSemantics = *semantics;
919 extendedSemantics.precision = extendedPrecision;
920
Dan Gohman16e02092010-03-24 19:38:02 +0000921 if (newPartsCount == 1)
Chris Lattnerb39cdde2007-08-20 22:49:32 +0000922 significand.part = fullSignificand[0];
923 else
924 significand.parts = fullSignificand;
925 semantics = &extendedSemantics;
926
927 APFloat extendedAddend(*addend);
Dale Johannesen23a98552008-10-09 23:00:39 +0000928 status = extendedAddend.convert(extendedSemantics, rmTowardZero, &ignored);
Chris Lattnerb39cdde2007-08-20 22:49:32 +0000929 assert(status == opOK);
Duncan Sands1f6a3292011-08-12 14:54:45 +0000930 (void)status;
Chris Lattnerb39cdde2007-08-20 22:49:32 +0000931 lost_fraction = addOrSubtractSignificand(extendedAddend, false);
932
933 /* Restore our state. */
Dan Gohman16e02092010-03-24 19:38:02 +0000934 if (newPartsCount == 1)
Chris Lattnerb39cdde2007-08-20 22:49:32 +0000935 fullSignificand[0] = significand.part;
936 significand = savedSignificand;
937 semantics = savedSemantics;
938
939 omsb = APInt::tcMSB(fullSignificand, newPartsCount) + 1;
940 }
941
942 exponent -= (precision - 1);
943
Dan Gohman16e02092010-03-24 19:38:02 +0000944 if (omsb > precision) {
Chris Lattnerb39cdde2007-08-20 22:49:32 +0000945 unsigned int bits, significantParts;
946 lostFraction lf;
947
948 bits = omsb - precision;
949 significantParts = partCountForBits(omsb);
950 lf = shiftRight(fullSignificand, significantParts, bits);
951 lost_fraction = combineLostFractions(lf, lost_fraction);
952 exponent += bits;
953 }
954
955 APInt::tcAssign(lhsSignificand, fullSignificand, partsCount);
956
Dan Gohman16e02092010-03-24 19:38:02 +0000957 if (newPartsCount > 4)
Chris Lattnerb39cdde2007-08-20 22:49:32 +0000958 delete [] fullSignificand;
959
960 return lost_fraction;
961}
962
963/* Multiply the significands of LHS and RHS to DST. */
964lostFraction
965APFloat::divideSignificand(const APFloat &rhs)
966{
967 unsigned int bit, i, partsCount;
968 const integerPart *rhsSignificand;
969 integerPart *lhsSignificand, *dividend, *divisor;
970 integerPart scratch[4];
971 lostFraction lost_fraction;
972
973 assert(semantics == rhs.semantics);
974
975 lhsSignificand = significandParts();
976 rhsSignificand = rhs.significandParts();
977 partsCount = partCount();
978
Dan Gohman16e02092010-03-24 19:38:02 +0000979 if (partsCount > 2)
Chris Lattnerb39cdde2007-08-20 22:49:32 +0000980 dividend = new integerPart[partsCount * 2];
981 else
982 dividend = scratch;
983
984 divisor = dividend + partsCount;
985
986 /* Copy the dividend and divisor as they will be modified in-place. */
Dan Gohman16e02092010-03-24 19:38:02 +0000987 for (i = 0; i < partsCount; i++) {
Chris Lattnerb39cdde2007-08-20 22:49:32 +0000988 dividend[i] = lhsSignificand[i];
989 divisor[i] = rhsSignificand[i];
990 lhsSignificand[i] = 0;
991 }
992
993 exponent -= rhs.exponent;
994
995 unsigned int precision = semantics->precision;
996
997 /* Normalize the divisor. */
998 bit = precision - APInt::tcMSB(divisor, partsCount) - 1;
Dan Gohman16e02092010-03-24 19:38:02 +0000999 if (bit) {
Chris Lattnerb39cdde2007-08-20 22:49:32 +00001000 exponent += bit;
1001 APInt::tcShiftLeft(divisor, partsCount, bit);
1002 }
1003
1004 /* Normalize the dividend. */
1005 bit = precision - APInt::tcMSB(dividend, partsCount) - 1;
Dan Gohman16e02092010-03-24 19:38:02 +00001006 if (bit) {
Chris Lattnerb39cdde2007-08-20 22:49:32 +00001007 exponent -= bit;
1008 APInt::tcShiftLeft(dividend, partsCount, bit);
1009 }
1010
Neil Booth96c74712007-10-12 16:02:31 +00001011 /* Ensure the dividend >= divisor initially for the loop below.
1012 Incidentally, this means that the division loop below is
1013 guaranteed to set the integer bit to one. */
Dan Gohman16e02092010-03-24 19:38:02 +00001014 if (APInt::tcCompare(dividend, divisor, partsCount) < 0) {
Chris Lattnerb39cdde2007-08-20 22:49:32 +00001015 exponent--;
1016 APInt::tcShiftLeft(dividend, partsCount, 1);
1017 assert(APInt::tcCompare(dividend, divisor, partsCount) >= 0);
1018 }
1019
1020 /* Long division. */
Dan Gohman16e02092010-03-24 19:38:02 +00001021 for (bit = precision; bit; bit -= 1) {
1022 if (APInt::tcCompare(dividend, divisor, partsCount) >= 0) {
Chris Lattnerb39cdde2007-08-20 22:49:32 +00001023 APInt::tcSubtract(dividend, divisor, 0, partsCount);
1024 APInt::tcSetBit(lhsSignificand, bit - 1);
1025 }
1026
1027 APInt::tcShiftLeft(dividend, partsCount, 1);
1028 }
1029
1030 /* Figure out the lost fraction. */
1031 int cmp = APInt::tcCompare(dividend, divisor, partsCount);
1032
Dan Gohman16e02092010-03-24 19:38:02 +00001033 if (cmp > 0)
Chris Lattnerb39cdde2007-08-20 22:49:32 +00001034 lost_fraction = lfMoreThanHalf;
Dan Gohman16e02092010-03-24 19:38:02 +00001035 else if (cmp == 0)
Chris Lattnerb39cdde2007-08-20 22:49:32 +00001036 lost_fraction = lfExactlyHalf;
Dan Gohman16e02092010-03-24 19:38:02 +00001037 else if (APInt::tcIsZero(dividend, partsCount))
Chris Lattnerb39cdde2007-08-20 22:49:32 +00001038 lost_fraction = lfExactlyZero;
1039 else
1040 lost_fraction = lfLessThanHalf;
1041
Dan Gohman16e02092010-03-24 19:38:02 +00001042 if (partsCount > 2)
Chris Lattnerb39cdde2007-08-20 22:49:32 +00001043 delete [] dividend;
1044
1045 return lost_fraction;
1046}
1047
1048unsigned int
1049APFloat::significandMSB() const
1050{
1051 return APInt::tcMSB(significandParts(), partCount());
1052}
1053
1054unsigned int
1055APFloat::significandLSB() const
1056{
1057 return APInt::tcLSB(significandParts(), partCount());
1058}
1059
1060/* Note that a zero result is NOT normalized to fcZero. */
1061lostFraction
1062APFloat::shiftSignificandRight(unsigned int bits)
1063{
1064 /* Our exponent should not overflow. */
1065 assert((exponent_t) (exponent + bits) >= exponent);
1066
1067 exponent += bits;
1068
1069 return shiftRight(significandParts(), partCount(), bits);
1070}
1071
1072/* Shift the significand left BITS bits, subtract BITS from its exponent. */
1073void
1074APFloat::shiftSignificandLeft(unsigned int bits)
1075{
1076 assert(bits < semantics->precision);
1077
Dan Gohman16e02092010-03-24 19:38:02 +00001078 if (bits) {
Chris Lattnerb39cdde2007-08-20 22:49:32 +00001079 unsigned int partsCount = partCount();
1080
1081 APInt::tcShiftLeft(significandParts(), partsCount, bits);
1082 exponent -= bits;
1083
1084 assert(!APInt::tcIsZero(significandParts(), partsCount));
1085 }
1086}
1087
1088APFloat::cmpResult
1089APFloat::compareAbsoluteValue(const APFloat &rhs) const
1090{
1091 int compare;
1092
1093 assert(semantics == rhs.semantics);
1094 assert(category == fcNormal);
1095 assert(rhs.category == fcNormal);
1096
1097 compare = exponent - rhs.exponent;
1098
1099 /* If exponents are equal, do an unsigned bignum comparison of the
1100 significands. */
Dan Gohman16e02092010-03-24 19:38:02 +00001101 if (compare == 0)
Chris Lattnerb39cdde2007-08-20 22:49:32 +00001102 compare = APInt::tcCompare(significandParts(), rhs.significandParts(),
Neil Booth4f881702007-09-26 21:33:42 +00001103 partCount());
Chris Lattnerb39cdde2007-08-20 22:49:32 +00001104
Dan Gohman16e02092010-03-24 19:38:02 +00001105 if (compare > 0)
Chris Lattnerb39cdde2007-08-20 22:49:32 +00001106 return cmpGreaterThan;
Dan Gohman16e02092010-03-24 19:38:02 +00001107 else if (compare < 0)
Chris Lattnerb39cdde2007-08-20 22:49:32 +00001108 return cmpLessThan;
1109 else
1110 return cmpEqual;
1111}
1112
1113/* Handle overflow. Sign is preserved. We either become infinity or
1114 the largest finite number. */
1115APFloat::opStatus
1116APFloat::handleOverflow(roundingMode rounding_mode)
1117{
1118 /* Infinity? */
Dan Gohman16e02092010-03-24 19:38:02 +00001119 if (rounding_mode == rmNearestTiesToEven ||
1120 rounding_mode == rmNearestTiesToAway ||
1121 (rounding_mode == rmTowardPositive && !sign) ||
1122 (rounding_mode == rmTowardNegative && sign)) {
1123 category = fcInfinity;
1124 return (opStatus) (opOverflow | opInexact);
1125 }
Chris Lattnerb39cdde2007-08-20 22:49:32 +00001126
1127 /* Otherwise we become the largest finite number. */
1128 category = fcNormal;
1129 exponent = semantics->maxExponent;
1130 APInt::tcSetLeastSignificantBits(significandParts(), partCount(),
Neil Booth4f881702007-09-26 21:33:42 +00001131 semantics->precision);
Chris Lattnerb39cdde2007-08-20 22:49:32 +00001132
1133 return opInexact;
1134}
1135
Neil Boothb7dea4c2007-10-03 15:16:41 +00001136/* Returns TRUE if, when truncating the current number, with BIT the
1137 new LSB, with the given lost fraction and rounding mode, the result
1138 would need to be rounded away from zero (i.e., by increasing the
1139 signficand). This routine must work for fcZero of both signs, and
1140 fcNormal numbers. */
Chris Lattnerb39cdde2007-08-20 22:49:32 +00001141bool
1142APFloat::roundAwayFromZero(roundingMode rounding_mode,
Neil Boothb7dea4c2007-10-03 15:16:41 +00001143 lostFraction lost_fraction,
1144 unsigned int bit) const
Chris Lattnerb39cdde2007-08-20 22:49:32 +00001145{
Dale Johanneseneaf08942007-08-31 04:03:46 +00001146 /* NaNs and infinities should not have lost fractions. */
Chris Lattnerb39cdde2007-08-20 22:49:32 +00001147 assert(category == fcNormal || category == fcZero);
1148
Neil Boothb7dea4c2007-10-03 15:16:41 +00001149 /* Current callers never pass this so we don't handle it. */
Chris Lattnerb39cdde2007-08-20 22:49:32 +00001150 assert(lost_fraction != lfExactlyZero);
1151
Mike Stumpf3dc0c02009-05-13 23:23:20 +00001152 switch (rounding_mode) {
Chris Lattnerb39cdde2007-08-20 22:49:32 +00001153 case rmNearestTiesToAway:
1154 return lost_fraction == lfExactlyHalf || lost_fraction == lfMoreThanHalf;
1155
1156 case rmNearestTiesToEven:
Dan Gohman16e02092010-03-24 19:38:02 +00001157 if (lost_fraction == lfMoreThanHalf)
Chris Lattnerb39cdde2007-08-20 22:49:32 +00001158 return true;
1159
1160 /* Our zeroes don't have a significand to test. */
Dan Gohman16e02092010-03-24 19:38:02 +00001161 if (lost_fraction == lfExactlyHalf && category != fcZero)
Neil Boothb7dea4c2007-10-03 15:16:41 +00001162 return APInt::tcExtractBit(significandParts(), bit);
Chris Lattnerb39cdde2007-08-20 22:49:32 +00001163
1164 return false;
1165
1166 case rmTowardZero:
1167 return false;
1168
1169 case rmTowardPositive:
1170 return sign == false;
1171
1172 case rmTowardNegative:
1173 return sign == true;
1174 }
Chandler Carruth732f05c2012-01-10 18:08:01 +00001175 llvm_unreachable("Invalid rounding mode found");
Chris Lattnerb39cdde2007-08-20 22:49:32 +00001176}
1177
1178APFloat::opStatus
1179APFloat::normalize(roundingMode rounding_mode,
Neil Booth4f881702007-09-26 21:33:42 +00001180 lostFraction lost_fraction)
Chris Lattnerb39cdde2007-08-20 22:49:32 +00001181{
Neil Booth4f881702007-09-26 21:33:42 +00001182 unsigned int omsb; /* One, not zero, based MSB. */
Chris Lattnerb39cdde2007-08-20 22:49:32 +00001183 int exponentChange;
1184
Dan Gohman16e02092010-03-24 19:38:02 +00001185 if (category != fcNormal)
Chris Lattnerb39cdde2007-08-20 22:49:32 +00001186 return opOK;
1187
1188 /* Before rounding normalize the exponent of fcNormal numbers. */
1189 omsb = significandMSB() + 1;
1190
Dan Gohman16e02092010-03-24 19:38:02 +00001191 if (omsb) {
Chris Lattnerb39cdde2007-08-20 22:49:32 +00001192 /* OMSB is numbered from 1. We want to place it in the integer
Nick Lewycky03dd4e82011-10-03 21:30:08 +00001193 bit numbered PRECISION if possible, with a compensating change in
Chris Lattnerb39cdde2007-08-20 22:49:32 +00001194 the exponent. */
1195 exponentChange = omsb - semantics->precision;
1196
1197 /* If the resulting exponent is too high, overflow according to
1198 the rounding mode. */
Dan Gohman16e02092010-03-24 19:38:02 +00001199 if (exponent + exponentChange > semantics->maxExponent)
Chris Lattnerb39cdde2007-08-20 22:49:32 +00001200 return handleOverflow(rounding_mode);
1201
1202 /* Subnormal numbers have exponent minExponent, and their MSB
1203 is forced based on that. */
Dan Gohman16e02092010-03-24 19:38:02 +00001204 if (exponent + exponentChange < semantics->minExponent)
Chris Lattnerb39cdde2007-08-20 22:49:32 +00001205 exponentChange = semantics->minExponent - exponent;
1206
1207 /* Shifting left is easy as we don't lose precision. */
Dan Gohman16e02092010-03-24 19:38:02 +00001208 if (exponentChange < 0) {
Chris Lattnerb39cdde2007-08-20 22:49:32 +00001209 assert(lost_fraction == lfExactlyZero);
1210
1211 shiftSignificandLeft(-exponentChange);
1212
1213 return opOK;
1214 }
1215
Dan Gohman16e02092010-03-24 19:38:02 +00001216 if (exponentChange > 0) {
Chris Lattnerb39cdde2007-08-20 22:49:32 +00001217 lostFraction lf;
1218
1219 /* Shift right and capture any new lost fraction. */
1220 lf = shiftSignificandRight(exponentChange);
1221
1222 lost_fraction = combineLostFractions(lf, lost_fraction);
1223
1224 /* Keep OMSB up-to-date. */
Dan Gohman16e02092010-03-24 19:38:02 +00001225 if (omsb > (unsigned) exponentChange)
Neil Booth96c74712007-10-12 16:02:31 +00001226 omsb -= exponentChange;
Chris Lattnerb39cdde2007-08-20 22:49:32 +00001227 else
Neil Booth4f881702007-09-26 21:33:42 +00001228 omsb = 0;
Chris Lattnerb39cdde2007-08-20 22:49:32 +00001229 }
1230 }
1231
1232 /* Now round the number according to rounding_mode given the lost
1233 fraction. */
1234
1235 /* As specified in IEEE 754, since we do not trap we do not report
1236 underflow for exact results. */
Dan Gohman16e02092010-03-24 19:38:02 +00001237 if (lost_fraction == lfExactlyZero) {
Chris Lattnerb39cdde2007-08-20 22:49:32 +00001238 /* Canonicalize zeroes. */
Dan Gohman16e02092010-03-24 19:38:02 +00001239 if (omsb == 0)
Chris Lattnerb39cdde2007-08-20 22:49:32 +00001240 category = fcZero;
1241
1242 return opOK;
1243 }
1244
1245 /* Increment the significand if we're rounding away from zero. */
Dan Gohman16e02092010-03-24 19:38:02 +00001246 if (roundAwayFromZero(rounding_mode, lost_fraction, 0)) {
1247 if (omsb == 0)
Chris Lattnerb39cdde2007-08-20 22:49:32 +00001248 exponent = semantics->minExponent;
1249
1250 incrementSignificand();
1251 omsb = significandMSB() + 1;
1252
1253 /* Did the significand increment overflow? */
Dan Gohman16e02092010-03-24 19:38:02 +00001254 if (omsb == (unsigned) semantics->precision + 1) {
Chris Lattnerb39cdde2007-08-20 22:49:32 +00001255 /* Renormalize by incrementing the exponent and shifting our
Neil Booth4f881702007-09-26 21:33:42 +00001256 significand right one. However if we already have the
1257 maximum exponent we overflow to infinity. */
Dan Gohman16e02092010-03-24 19:38:02 +00001258 if (exponent == semantics->maxExponent) {
Neil Booth4f881702007-09-26 21:33:42 +00001259 category = fcInfinity;
Chris Lattnerb39cdde2007-08-20 22:49:32 +00001260
Neil Booth4f881702007-09-26 21:33:42 +00001261 return (opStatus) (opOverflow | opInexact);
Chris Lattnerb39cdde2007-08-20 22:49:32 +00001262 }
1263
1264 shiftSignificandRight(1);
1265
1266 return opInexact;
1267 }
1268 }
1269
1270 /* The normal case - we were and are not denormal, and any
1271 significand increment above didn't overflow. */
Dan Gohman16e02092010-03-24 19:38:02 +00001272 if (omsb == semantics->precision)
Chris Lattnerb39cdde2007-08-20 22:49:32 +00001273 return opInexact;
1274
1275 /* We have a non-zero denormal. */
1276 assert(omsb < semantics->precision);
Chris Lattnerb39cdde2007-08-20 22:49:32 +00001277
1278 /* Canonicalize zeroes. */
Dan Gohman16e02092010-03-24 19:38:02 +00001279 if (omsb == 0)
Chris Lattnerb39cdde2007-08-20 22:49:32 +00001280 category = fcZero;
1281
1282 /* The fcZero case is a denormal that underflowed to zero. */
1283 return (opStatus) (opUnderflow | opInexact);
1284}
1285
1286APFloat::opStatus
1287APFloat::addOrSubtractSpecials(const APFloat &rhs, bool subtract)
1288{
Mike Stumpf3dc0c02009-05-13 23:23:20 +00001289 switch (convolve(category, rhs.category)) {
Chris Lattnerb39cdde2007-08-20 22:49:32 +00001290 default:
Torok Edwinc23197a2009-07-14 16:55:14 +00001291 llvm_unreachable(0);
Chris Lattnerb39cdde2007-08-20 22:49:32 +00001292
Dale Johanneseneaf08942007-08-31 04:03:46 +00001293 case convolve(fcNaN, fcZero):
1294 case convolve(fcNaN, fcNormal):
1295 case convolve(fcNaN, fcInfinity):
1296 case convolve(fcNaN, fcNaN):
Chris Lattnerb39cdde2007-08-20 22:49:32 +00001297 case convolve(fcNormal, fcZero):
1298 case convolve(fcInfinity, fcNormal):
1299 case convolve(fcInfinity, fcZero):
1300 return opOK;
1301
Dale Johanneseneaf08942007-08-31 04:03:46 +00001302 case convolve(fcZero, fcNaN):
1303 case convolve(fcNormal, fcNaN):
1304 case convolve(fcInfinity, fcNaN):
1305 category = fcNaN;
1306 copySignificand(rhs);
Chris Lattnerb39cdde2007-08-20 22:49:32 +00001307 return opOK;
1308
1309 case convolve(fcNormal, fcInfinity):
1310 case convolve(fcZero, fcInfinity):
1311 category = fcInfinity;
1312 sign = rhs.sign ^ subtract;
1313 return opOK;
1314
1315 case convolve(fcZero, fcNormal):
1316 assign(rhs);
1317 sign = rhs.sign ^ subtract;
1318 return opOK;
1319
1320 case convolve(fcZero, fcZero):
1321 /* Sign depends on rounding mode; handled by caller. */
1322 return opOK;
1323
1324 case convolve(fcInfinity, fcInfinity):
1325 /* Differently signed infinities can only be validly
1326 subtracted. */
Dan Gohman16e02092010-03-24 19:38:02 +00001327 if (((sign ^ rhs.sign)!=0) != subtract) {
Neil Boothe5e01942007-10-14 10:39:51 +00001328 makeNaN();
Chris Lattnerb39cdde2007-08-20 22:49:32 +00001329 return opInvalidOp;
1330 }
1331
1332 return opOK;
1333
1334 case convolve(fcNormal, fcNormal):
1335 return opDivByZero;
1336 }
1337}
1338
1339/* Add or subtract two normal numbers. */
1340lostFraction
1341APFloat::addOrSubtractSignificand(const APFloat &rhs, bool subtract)
1342{
1343 integerPart carry;
1344 lostFraction lost_fraction;
1345 int bits;
1346
1347 /* Determine if the operation on the absolute values is effectively
1348 an addition or subtraction. */
Hartmut Kaiser8df77a92007-10-25 23:15:31 +00001349 subtract ^= (sign ^ rhs.sign) ? true : false;
Chris Lattnerb39cdde2007-08-20 22:49:32 +00001350
1351 /* Are we bigger exponent-wise than the RHS? */
1352 bits = exponent - rhs.exponent;
1353
1354 /* Subtraction is more subtle than one might naively expect. */
Dan Gohman16e02092010-03-24 19:38:02 +00001355 if (subtract) {
Chris Lattnerb39cdde2007-08-20 22:49:32 +00001356 APFloat temp_rhs(rhs);
1357 bool reverse;
1358
Chris Lattnerada530b2007-08-24 03:02:34 +00001359 if (bits == 0) {
Chris Lattnerb39cdde2007-08-20 22:49:32 +00001360 reverse = compareAbsoluteValue(temp_rhs) == cmpLessThan;
1361 lost_fraction = lfExactlyZero;
Chris Lattnerada530b2007-08-24 03:02:34 +00001362 } else if (bits > 0) {
Chris Lattnerb39cdde2007-08-20 22:49:32 +00001363 lost_fraction = temp_rhs.shiftSignificandRight(bits - 1);
1364 shiftSignificandLeft(1);
1365 reverse = false;
Chris Lattnerada530b2007-08-24 03:02:34 +00001366 } else {
Chris Lattnerb39cdde2007-08-20 22:49:32 +00001367 lost_fraction = shiftSignificandRight(-bits - 1);
1368 temp_rhs.shiftSignificandLeft(1);
1369 reverse = true;
1370 }
1371
Chris Lattnerada530b2007-08-24 03:02:34 +00001372 if (reverse) {
Chris Lattnerb39cdde2007-08-20 22:49:32 +00001373 carry = temp_rhs.subtractSignificand
Neil Booth4f881702007-09-26 21:33:42 +00001374 (*this, lost_fraction != lfExactlyZero);
Chris Lattnerb39cdde2007-08-20 22:49:32 +00001375 copySignificand(temp_rhs);
1376 sign = !sign;
1377 } else {
1378 carry = subtractSignificand
Neil Booth4f881702007-09-26 21:33:42 +00001379 (temp_rhs, lost_fraction != lfExactlyZero);
Chris Lattnerb39cdde2007-08-20 22:49:32 +00001380 }
1381
1382 /* Invert the lost fraction - it was on the RHS and
1383 subtracted. */
Dan Gohman16e02092010-03-24 19:38:02 +00001384 if (lost_fraction == lfLessThanHalf)
Chris Lattnerb39cdde2007-08-20 22:49:32 +00001385 lost_fraction = lfMoreThanHalf;
Dan Gohman16e02092010-03-24 19:38:02 +00001386 else if (lost_fraction == lfMoreThanHalf)
Chris Lattnerb39cdde2007-08-20 22:49:32 +00001387 lost_fraction = lfLessThanHalf;
1388
1389 /* The code above is intended to ensure that no borrow is
1390 necessary. */
1391 assert(!carry);
Duncan Sands1f6a3292011-08-12 14:54:45 +00001392 (void)carry;
Chris Lattnerb39cdde2007-08-20 22:49:32 +00001393 } else {
Dan Gohman16e02092010-03-24 19:38:02 +00001394 if (bits > 0) {
Chris Lattnerb39cdde2007-08-20 22:49:32 +00001395 APFloat temp_rhs(rhs);
1396
1397 lost_fraction = temp_rhs.shiftSignificandRight(bits);
1398 carry = addSignificand(temp_rhs);
1399 } else {
1400 lost_fraction = shiftSignificandRight(-bits);
1401 carry = addSignificand(rhs);
1402 }
1403
1404 /* We have a guard bit; generating a carry cannot happen. */
1405 assert(!carry);
Duncan Sands1f6a3292011-08-12 14:54:45 +00001406 (void)carry;
Chris Lattnerb39cdde2007-08-20 22:49:32 +00001407 }
1408
1409 return lost_fraction;
1410}
1411
1412APFloat::opStatus
1413APFloat::multiplySpecials(const APFloat &rhs)
1414{
Mike Stumpf3dc0c02009-05-13 23:23:20 +00001415 switch (convolve(category, rhs.category)) {
Chris Lattnerb39cdde2007-08-20 22:49:32 +00001416 default:
Torok Edwinc23197a2009-07-14 16:55:14 +00001417 llvm_unreachable(0);
Chris Lattnerb39cdde2007-08-20 22:49:32 +00001418
Dale Johanneseneaf08942007-08-31 04:03:46 +00001419 case convolve(fcNaN, fcZero):
1420 case convolve(fcNaN, fcNormal):
1421 case convolve(fcNaN, fcInfinity):
1422 case convolve(fcNaN, fcNaN):
1423 return opOK;
1424
1425 case convolve(fcZero, fcNaN):
1426 case convolve(fcNormal, fcNaN):
1427 case convolve(fcInfinity, fcNaN):
1428 category = fcNaN;
1429 copySignificand(rhs);
Chris Lattnerb39cdde2007-08-20 22:49:32 +00001430 return opOK;
1431
1432 case convolve(fcNormal, fcInfinity):
1433 case convolve(fcInfinity, fcNormal):
1434 case convolve(fcInfinity, fcInfinity):
1435 category = fcInfinity;
1436 return opOK;
1437
1438 case convolve(fcZero, fcNormal):
1439 case convolve(fcNormal, fcZero):
1440 case convolve(fcZero, fcZero):
1441 category = fcZero;
1442 return opOK;
1443
1444 case convolve(fcZero, fcInfinity):
1445 case convolve(fcInfinity, fcZero):
Neil Boothe5e01942007-10-14 10:39:51 +00001446 makeNaN();
Chris Lattnerb39cdde2007-08-20 22:49:32 +00001447 return opInvalidOp;
1448
1449 case convolve(fcNormal, fcNormal):
1450 return opOK;
1451 }
1452}
1453
1454APFloat::opStatus
1455APFloat::divideSpecials(const APFloat &rhs)
1456{
Mike Stumpf3dc0c02009-05-13 23:23:20 +00001457 switch (convolve(category, rhs.category)) {
Chris Lattnerb39cdde2007-08-20 22:49:32 +00001458 default:
Torok Edwinc23197a2009-07-14 16:55:14 +00001459 llvm_unreachable(0);
Chris Lattnerb39cdde2007-08-20 22:49:32 +00001460
Dale Johanneseneaf08942007-08-31 04:03:46 +00001461 case convolve(fcNaN, fcZero):
1462 case convolve(fcNaN, fcNormal):
1463 case convolve(fcNaN, fcInfinity):
1464 case convolve(fcNaN, fcNaN):
Chris Lattnerb39cdde2007-08-20 22:49:32 +00001465 case convolve(fcInfinity, fcZero):
1466 case convolve(fcInfinity, fcNormal):
1467 case convolve(fcZero, fcInfinity):
1468 case convolve(fcZero, fcNormal):
1469 return opOK;
1470
Dale Johanneseneaf08942007-08-31 04:03:46 +00001471 case convolve(fcZero, fcNaN):
1472 case convolve(fcNormal, fcNaN):
1473 case convolve(fcInfinity, fcNaN):
1474 category = fcNaN;
1475 copySignificand(rhs);
Chris Lattnerb39cdde2007-08-20 22:49:32 +00001476 return opOK;
1477
1478 case convolve(fcNormal, fcInfinity):
1479 category = fcZero;
1480 return opOK;
1481
1482 case convolve(fcNormal, fcZero):
1483 category = fcInfinity;
1484 return opDivByZero;
1485
1486 case convolve(fcInfinity, fcInfinity):
1487 case convolve(fcZero, fcZero):
Neil Boothe5e01942007-10-14 10:39:51 +00001488 makeNaN();
Chris Lattnerb39cdde2007-08-20 22:49:32 +00001489 return opInvalidOp;
1490
1491 case convolve(fcNormal, fcNormal):
1492 return opOK;
1493 }
1494}
1495
Dale Johannesened6af242009-01-21 00:35:19 +00001496APFloat::opStatus
1497APFloat::modSpecials(const APFloat &rhs)
1498{
Mike Stumpf3dc0c02009-05-13 23:23:20 +00001499 switch (convolve(category, rhs.category)) {
Dale Johannesened6af242009-01-21 00:35:19 +00001500 default:
Torok Edwinc23197a2009-07-14 16:55:14 +00001501 llvm_unreachable(0);
Dale Johannesened6af242009-01-21 00:35:19 +00001502
1503 case convolve(fcNaN, fcZero):
1504 case convolve(fcNaN, fcNormal):
1505 case convolve(fcNaN, fcInfinity):
1506 case convolve(fcNaN, fcNaN):
1507 case convolve(fcZero, fcInfinity):
1508 case convolve(fcZero, fcNormal):
1509 case convolve(fcNormal, fcInfinity):
1510 return opOK;
1511
1512 case convolve(fcZero, fcNaN):
1513 case convolve(fcNormal, fcNaN):
1514 case convolve(fcInfinity, fcNaN):
1515 category = fcNaN;
1516 copySignificand(rhs);
1517 return opOK;
1518
1519 case convolve(fcNormal, fcZero):
1520 case convolve(fcInfinity, fcZero):
1521 case convolve(fcInfinity, fcNormal):
1522 case convolve(fcInfinity, fcInfinity):
1523 case convolve(fcZero, fcZero):
1524 makeNaN();
1525 return opInvalidOp;
1526
1527 case convolve(fcNormal, fcNormal):
1528 return opOK;
1529 }
1530}
1531
Chris Lattnerb39cdde2007-08-20 22:49:32 +00001532/* Change sign. */
1533void
1534APFloat::changeSign()
1535{
1536 /* Look mummy, this one's easy. */
1537 sign = !sign;
1538}
1539
Dale Johannesene15c2db2007-08-31 23:35:31 +00001540void
1541APFloat::clearSign()
1542{
1543 /* So is this one. */
1544 sign = 0;
1545}
1546
1547void
1548APFloat::copySign(const APFloat &rhs)
1549{
1550 /* And this one. */
1551 sign = rhs.sign;
1552}
1553
Chris Lattnerb39cdde2007-08-20 22:49:32 +00001554/* Normalized addition or subtraction. */
1555APFloat::opStatus
1556APFloat::addOrSubtract(const APFloat &rhs, roundingMode rounding_mode,
Neil Booth4f881702007-09-26 21:33:42 +00001557 bool subtract)
Chris Lattnerb39cdde2007-08-20 22:49:32 +00001558{
1559 opStatus fs;
1560
Neil Boothcaf19d72007-10-14 10:29:28 +00001561 assertArithmeticOK(*semantics);
1562
Chris Lattnerb39cdde2007-08-20 22:49:32 +00001563 fs = addOrSubtractSpecials(rhs, subtract);
1564
1565 /* This return code means it was not a simple case. */
Dan Gohman16e02092010-03-24 19:38:02 +00001566 if (fs == opDivByZero) {
Chris Lattnerb39cdde2007-08-20 22:49:32 +00001567 lostFraction lost_fraction;
1568
1569 lost_fraction = addOrSubtractSignificand(rhs, subtract);
1570 fs = normalize(rounding_mode, lost_fraction);
1571
1572 /* Can only be zero if we lost no fraction. */
1573 assert(category != fcZero || lost_fraction == lfExactlyZero);
1574 }
1575
1576 /* If two numbers add (exactly) to zero, IEEE 754 decrees it is a
1577 positive zero unless rounding to minus infinity, except that
1578 adding two like-signed zeroes gives that zero. */
Dan Gohman16e02092010-03-24 19:38:02 +00001579 if (category == fcZero) {
1580 if (rhs.category != fcZero || (sign == rhs.sign) == subtract)
Chris Lattnerb39cdde2007-08-20 22:49:32 +00001581 sign = (rounding_mode == rmTowardNegative);
1582 }
1583
1584 return fs;
1585}
1586
1587/* Normalized addition. */
1588APFloat::opStatus
1589APFloat::add(const APFloat &rhs, roundingMode rounding_mode)
1590{
1591 return addOrSubtract(rhs, rounding_mode, false);
1592}
1593
1594/* Normalized subtraction. */
1595APFloat::opStatus
1596APFloat::subtract(const APFloat &rhs, roundingMode rounding_mode)
1597{
1598 return addOrSubtract(rhs, rounding_mode, true);
1599}
1600
1601/* Normalized multiply. */
1602APFloat::opStatus
1603APFloat::multiply(const APFloat &rhs, roundingMode rounding_mode)
1604{
1605 opStatus fs;
1606
Neil Boothcaf19d72007-10-14 10:29:28 +00001607 assertArithmeticOK(*semantics);
Chris Lattnerb39cdde2007-08-20 22:49:32 +00001608 sign ^= rhs.sign;
1609 fs = multiplySpecials(rhs);
1610
Dan Gohman16e02092010-03-24 19:38:02 +00001611 if (category == fcNormal) {
Chris Lattnerb39cdde2007-08-20 22:49:32 +00001612 lostFraction lost_fraction = multiplySignificand(rhs, 0);
1613 fs = normalize(rounding_mode, lost_fraction);
Dan Gohman16e02092010-03-24 19:38:02 +00001614 if (lost_fraction != lfExactlyZero)
Chris Lattnerb39cdde2007-08-20 22:49:32 +00001615 fs = (opStatus) (fs | opInexact);
1616 }
1617
1618 return fs;
1619}
1620
1621/* Normalized divide. */
1622APFloat::opStatus
1623APFloat::divide(const APFloat &rhs, roundingMode rounding_mode)
1624{
1625 opStatus fs;
1626
Neil Boothcaf19d72007-10-14 10:29:28 +00001627 assertArithmeticOK(*semantics);
Chris Lattnerb39cdde2007-08-20 22:49:32 +00001628 sign ^= rhs.sign;
1629 fs = divideSpecials(rhs);
1630
Dan Gohman16e02092010-03-24 19:38:02 +00001631 if (category == fcNormal) {
Chris Lattnerb39cdde2007-08-20 22:49:32 +00001632 lostFraction lost_fraction = divideSignificand(rhs);
1633 fs = normalize(rounding_mode, lost_fraction);
Dan Gohman16e02092010-03-24 19:38:02 +00001634 if (lost_fraction != lfExactlyZero)
Chris Lattnerb39cdde2007-08-20 22:49:32 +00001635 fs = (opStatus) (fs | opInexact);
1636 }
1637
1638 return fs;
1639}
1640
Dale Johannesen24b66a82009-01-20 18:35:05 +00001641/* Normalized remainder. This is not currently correct in all cases. */
1642APFloat::opStatus
1643APFloat::remainder(const APFloat &rhs)
1644{
1645 opStatus fs;
1646 APFloat V = *this;
1647 unsigned int origSign = sign;
1648
1649 assertArithmeticOK(*semantics);
1650 fs = V.divide(rhs, rmNearestTiesToEven);
1651 if (fs == opDivByZero)
1652 return fs;
1653
1654 int parts = partCount();
1655 integerPart *x = new integerPart[parts];
1656 bool ignored;
1657 fs = V.convertToInteger(x, parts * integerPartWidth, true,
1658 rmNearestTiesToEven, &ignored);
1659 if (fs==opInvalidOp)
1660 return fs;
1661
1662 fs = V.convertFromZeroExtendedInteger(x, parts * integerPartWidth, true,
1663 rmNearestTiesToEven);
1664 assert(fs==opOK); // should always work
1665
1666 fs = V.multiply(rhs, rmNearestTiesToEven);
1667 assert(fs==opOK || fs==opInexact); // should not overflow or underflow
1668
1669 fs = subtract(V, rmNearestTiesToEven);
1670 assert(fs==opOK || fs==opInexact); // likewise
1671
1672 if (isZero())
1673 sign = origSign; // IEEE754 requires this
1674 delete[] x;
1675 return fs;
1676}
1677
Dan Gohman16e02092010-03-24 19:38:02 +00001678/* Normalized llvm frem (C fmod).
Dale Johannesen24b66a82009-01-20 18:35:05 +00001679 This is not currently correct in all cases. */
Dale Johannesene15c2db2007-08-31 23:35:31 +00001680APFloat::opStatus
1681APFloat::mod(const APFloat &rhs, roundingMode rounding_mode)
1682{
1683 opStatus fs;
Neil Boothcaf19d72007-10-14 10:29:28 +00001684 assertArithmeticOK(*semantics);
Dale Johannesened6af242009-01-21 00:35:19 +00001685 fs = modSpecials(rhs);
Dale Johannesene15c2db2007-08-31 23:35:31 +00001686
Dale Johannesened6af242009-01-21 00:35:19 +00001687 if (category == fcNormal && rhs.category == fcNormal) {
1688 APFloat V = *this;
1689 unsigned int origSign = sign;
Dale Johannesene15c2db2007-08-31 23:35:31 +00001690
Dale Johannesened6af242009-01-21 00:35:19 +00001691 fs = V.divide(rhs, rmNearestTiesToEven);
1692 if (fs == opDivByZero)
1693 return fs;
Dale Johannesen58c2e4c2007-09-05 20:39:49 +00001694
Dale Johannesened6af242009-01-21 00:35:19 +00001695 int parts = partCount();
1696 integerPart *x = new integerPart[parts];
1697 bool ignored;
1698 fs = V.convertToInteger(x, parts * integerPartWidth, true,
1699 rmTowardZero, &ignored);
1700 if (fs==opInvalidOp)
1701 return fs;
Dale Johannesen58c2e4c2007-09-05 20:39:49 +00001702
Dale Johannesened6af242009-01-21 00:35:19 +00001703 fs = V.convertFromZeroExtendedInteger(x, parts * integerPartWidth, true,
1704 rmNearestTiesToEven);
1705 assert(fs==opOK); // should always work
Dale Johannesen58c2e4c2007-09-05 20:39:49 +00001706
Dale Johannesened6af242009-01-21 00:35:19 +00001707 fs = V.multiply(rhs, rounding_mode);
1708 assert(fs==opOK || fs==opInexact); // should not overflow or underflow
1709
1710 fs = subtract(V, rounding_mode);
1711 assert(fs==opOK || fs==opInexact); // likewise
1712
1713 if (isZero())
1714 sign = origSign; // IEEE754 requires this
1715 delete[] x;
1716 }
Dale Johannesene15c2db2007-08-31 23:35:31 +00001717 return fs;
1718}
1719
Chris Lattnerb39cdde2007-08-20 22:49:32 +00001720/* Normalized fused-multiply-add. */
1721APFloat::opStatus
1722APFloat::fusedMultiplyAdd(const APFloat &multiplicand,
Neil Booth4f881702007-09-26 21:33:42 +00001723 const APFloat &addend,
1724 roundingMode rounding_mode)
Chris Lattnerb39cdde2007-08-20 22:49:32 +00001725{
1726 opStatus fs;
1727
Neil Boothcaf19d72007-10-14 10:29:28 +00001728 assertArithmeticOK(*semantics);
1729
Chris Lattnerb39cdde2007-08-20 22:49:32 +00001730 /* Post-multiplication sign, before addition. */
1731 sign ^= multiplicand.sign;
1732
1733 /* If and only if all arguments are normal do we need to do an
1734 extended-precision calculation. */
Dan Gohman16e02092010-03-24 19:38:02 +00001735 if (category == fcNormal &&
1736 multiplicand.category == fcNormal &&
1737 addend.category == fcNormal) {
Chris Lattnerb39cdde2007-08-20 22:49:32 +00001738 lostFraction lost_fraction;
1739
1740 lost_fraction = multiplySignificand(multiplicand, &addend);
1741 fs = normalize(rounding_mode, lost_fraction);
Dan Gohman16e02092010-03-24 19:38:02 +00001742 if (lost_fraction != lfExactlyZero)
Chris Lattnerb39cdde2007-08-20 22:49:32 +00001743 fs = (opStatus) (fs | opInexact);
1744
1745 /* If two numbers add (exactly) to zero, IEEE 754 decrees it is a
1746 positive zero unless rounding to minus infinity, except that
1747 adding two like-signed zeroes gives that zero. */
Dan Gohman16e02092010-03-24 19:38:02 +00001748 if (category == fcZero && sign != addend.sign)
Chris Lattnerb39cdde2007-08-20 22:49:32 +00001749 sign = (rounding_mode == rmTowardNegative);
1750 } else {
1751 fs = multiplySpecials(multiplicand);
1752
1753 /* FS can only be opOK or opInvalidOp. There is no more work
1754 to do in the latter case. The IEEE-754R standard says it is
1755 implementation-defined in this case whether, if ADDEND is a
Dale Johanneseneaf08942007-08-31 04:03:46 +00001756 quiet NaN, we raise invalid op; this implementation does so.
Chris Lattnerb39cdde2007-08-20 22:49:32 +00001757
1758 If we need to do the addition we can do so with normal
1759 precision. */
Dan Gohman16e02092010-03-24 19:38:02 +00001760 if (fs == opOK)
Chris Lattnerb39cdde2007-08-20 22:49:32 +00001761 fs = addOrSubtract(addend, rounding_mode, false);
1762 }
1763
1764 return fs;
1765}
1766
1767/* Comparison requires normalized numbers. */
1768APFloat::cmpResult
1769APFloat::compare(const APFloat &rhs) const
1770{
1771 cmpResult result;
1772
Neil Boothcaf19d72007-10-14 10:29:28 +00001773 assertArithmeticOK(*semantics);
Chris Lattnerb39cdde2007-08-20 22:49:32 +00001774 assert(semantics == rhs.semantics);
1775
Mike Stumpf3dc0c02009-05-13 23:23:20 +00001776 switch (convolve(category, rhs.category)) {
Chris Lattnerb39cdde2007-08-20 22:49:32 +00001777 default:
Torok Edwinc23197a2009-07-14 16:55:14 +00001778 llvm_unreachable(0);
Chris Lattnerb39cdde2007-08-20 22:49:32 +00001779
Dale Johanneseneaf08942007-08-31 04:03:46 +00001780 case convolve(fcNaN, fcZero):
1781 case convolve(fcNaN, fcNormal):
1782 case convolve(fcNaN, fcInfinity):
1783 case convolve(fcNaN, fcNaN):
1784 case convolve(fcZero, fcNaN):
1785 case convolve(fcNormal, fcNaN):
1786 case convolve(fcInfinity, fcNaN):
Chris Lattnerb39cdde2007-08-20 22:49:32 +00001787 return cmpUnordered;
1788
1789 case convolve(fcInfinity, fcNormal):
1790 case convolve(fcInfinity, fcZero):
1791 case convolve(fcNormal, fcZero):
Dan Gohman16e02092010-03-24 19:38:02 +00001792 if (sign)
Chris Lattnerb39cdde2007-08-20 22:49:32 +00001793 return cmpLessThan;
1794 else
1795 return cmpGreaterThan;
1796
1797 case convolve(fcNormal, fcInfinity):
1798 case convolve(fcZero, fcInfinity):
1799 case convolve(fcZero, fcNormal):
Dan Gohman16e02092010-03-24 19:38:02 +00001800 if (rhs.sign)
Chris Lattnerb39cdde2007-08-20 22:49:32 +00001801 return cmpGreaterThan;
1802 else
1803 return cmpLessThan;
1804
1805 case convolve(fcInfinity, fcInfinity):
Dan Gohman16e02092010-03-24 19:38:02 +00001806 if (sign == rhs.sign)
Chris Lattnerb39cdde2007-08-20 22:49:32 +00001807 return cmpEqual;
Dan Gohman16e02092010-03-24 19:38:02 +00001808 else if (sign)
Chris Lattnerb39cdde2007-08-20 22:49:32 +00001809 return cmpLessThan;
1810 else
1811 return cmpGreaterThan;
1812
1813 case convolve(fcZero, fcZero):
1814 return cmpEqual;
1815
1816 case convolve(fcNormal, fcNormal):
1817 break;
1818 }
1819
1820 /* Two normal numbers. Do they have the same sign? */
Dan Gohman16e02092010-03-24 19:38:02 +00001821 if (sign != rhs.sign) {
1822 if (sign)
Chris Lattnerb39cdde2007-08-20 22:49:32 +00001823 result = cmpLessThan;
1824 else
1825 result = cmpGreaterThan;
1826 } else {
1827 /* Compare absolute values; invert result if negative. */
1828 result = compareAbsoluteValue(rhs);
1829
Dan Gohman16e02092010-03-24 19:38:02 +00001830 if (sign) {
1831 if (result == cmpLessThan)
Neil Booth4f881702007-09-26 21:33:42 +00001832 result = cmpGreaterThan;
Dan Gohman16e02092010-03-24 19:38:02 +00001833 else if (result == cmpGreaterThan)
Neil Booth4f881702007-09-26 21:33:42 +00001834 result = cmpLessThan;
Chris Lattnerb39cdde2007-08-20 22:49:32 +00001835 }
1836 }
1837
1838 return result;
1839}
1840
Dale Johannesen23a98552008-10-09 23:00:39 +00001841/// APFloat::convert - convert a value of one floating point type to another.
1842/// The return value corresponds to the IEEE754 exceptions. *losesInfo
1843/// records whether the transformation lost information, i.e. whether
1844/// converting the result back to the original type will produce the
1845/// original value (this is almost the same as return value==fsOK, but there
1846/// are edge cases where this is not so).
1847
Chris Lattnerb39cdde2007-08-20 22:49:32 +00001848APFloat::opStatus
1849APFloat::convert(const fltSemantics &toSemantics,
Dale Johannesen23a98552008-10-09 23:00:39 +00001850 roundingMode rounding_mode, bool *losesInfo)
Chris Lattnerb39cdde2007-08-20 22:49:32 +00001851{
Neil Boothc8db43d2007-09-22 02:56:19 +00001852 lostFraction lostFraction;
1853 unsigned int newPartCount, oldPartCount;
Chris Lattnerb39cdde2007-08-20 22:49:32 +00001854 opStatus fs;
Eli Friedman44551422011-11-26 03:38:02 +00001855 int shift;
1856 const fltSemantics &fromSemantics = *semantics;
Neil Booth4f881702007-09-26 21:33:42 +00001857
Eli Friedman44551422011-11-26 03:38:02 +00001858 assertArithmeticOK(fromSemantics);
Dale Johannesen79f82f92008-04-20 01:34:03 +00001859 assertArithmeticOK(toSemantics);
Neil Boothc8db43d2007-09-22 02:56:19 +00001860 lostFraction = lfExactlyZero;
Chris Lattnerb39cdde2007-08-20 22:49:32 +00001861 newPartCount = partCountForBits(toSemantics.precision + 1);
Neil Boothc8db43d2007-09-22 02:56:19 +00001862 oldPartCount = partCount();
Eli Friedman44551422011-11-26 03:38:02 +00001863 shift = toSemantics.precision - fromSemantics.precision;
Chris Lattnerb39cdde2007-08-20 22:49:32 +00001864
Eli Friedman44551422011-11-26 03:38:02 +00001865 bool X86SpecialNan = false;
1866 if (&fromSemantics == &APFloat::x87DoubleExtended &&
1867 &toSemantics != &APFloat::x87DoubleExtended && category == fcNaN &&
1868 (!(*significandParts() & 0x8000000000000000ULL) ||
1869 !(*significandParts() & 0x4000000000000000ULL))) {
1870 // x86 has some unusual NaNs which cannot be represented in any other
1871 // format; note them here.
1872 X86SpecialNan = true;
1873 }
1874
1875 // If this is a truncation, perform the shift before we narrow the storage.
1876 if (shift < 0 && (category==fcNormal || category==fcNaN))
1877 lostFraction = shiftRight(significandParts(), oldPartCount, -shift);
1878
1879 // Fix the storage so it can hold to new value.
Neil Boothc8db43d2007-09-22 02:56:19 +00001880 if (newPartCount > oldPartCount) {
Eli Friedman44551422011-11-26 03:38:02 +00001881 // The new type requires more storage; make it available.
Chris Lattnerb39cdde2007-08-20 22:49:32 +00001882 integerPart *newParts;
Chris Lattnerb39cdde2007-08-20 22:49:32 +00001883 newParts = new integerPart[newPartCount];
1884 APInt::tcSet(newParts, 0, newPartCount);
Dale Johannesen902ff942007-09-25 17:25:00 +00001885 if (category==fcNormal || category==fcNaN)
1886 APInt::tcAssign(newParts, significandParts(), oldPartCount);
Chris Lattnerb39cdde2007-08-20 22:49:32 +00001887 freeSignificand();
1888 significand.parts = newParts;
Eli Friedman44551422011-11-26 03:38:02 +00001889 } else if (newPartCount == 1 && oldPartCount != 1) {
1890 // Switch to built-in storage for a single part.
1891 integerPart newPart = 0;
1892 if (category==fcNormal || category==fcNaN)
1893 newPart = significandParts()[0];
1894 freeSignificand();
1895 significand.part = newPart;
Chris Lattnerb39cdde2007-08-20 22:49:32 +00001896 }
1897
Eli Friedman44551422011-11-26 03:38:02 +00001898 // Now that we have the right storage, switch the semantics.
1899 semantics = &toSemantics;
1900
1901 // If this is an extension, perform the shift now that the storage is
1902 // available.
1903 if (shift > 0 && (category==fcNormal || category==fcNaN))
1904 APInt::tcShiftLeft(significandParts(), newPartCount, shift);
1905
Dan Gohman16e02092010-03-24 19:38:02 +00001906 if (category == fcNormal) {
Neil Boothc8db43d2007-09-22 02:56:19 +00001907 fs = normalize(rounding_mode, lostFraction);
Dale Johannesen23a98552008-10-09 23:00:39 +00001908 *losesInfo = (fs != opOK);
Dale Johannesen902ff942007-09-25 17:25:00 +00001909 } else if (category == fcNaN) {
Eli Friedman44551422011-11-26 03:38:02 +00001910 *losesInfo = lostFraction != lfExactlyZero || X86SpecialNan;
Dale Johannesen902ff942007-09-25 17:25:00 +00001911 // gcc forces the Quiet bit on, which means (float)(double)(float_sNan)
1912 // does not give you back the same bits. This is dubious, and we
1913 // don't currently do it. You're really supposed to get
1914 // an invalid operation signal at runtime, but nobody does that.
Dale Johannesen23a98552008-10-09 23:00:39 +00001915 fs = opOK;
Chris Lattnerb39cdde2007-08-20 22:49:32 +00001916 } else {
Dale Johannesen23a98552008-10-09 23:00:39 +00001917 *losesInfo = false;
Eli Friedmanf9b1cd02011-11-28 18:50:37 +00001918 fs = opOK;
Chris Lattnerb39cdde2007-08-20 22:49:32 +00001919 }
1920
1921 return fs;
1922}
1923
1924/* Convert a floating point number to an integer according to the
1925 rounding mode. If the rounded integer value is out of range this
Neil Boothee7ae382007-11-01 22:43:37 +00001926 returns an invalid operation exception and the contents of the
1927 destination parts are unspecified. If the rounded value is in
Chris Lattnerb39cdde2007-08-20 22:49:32 +00001928 range but the floating point number is not the exact integer, the C
1929 standard doesn't require an inexact exception to be raised. IEEE
1930 854 does require it so we do that.
1931
1932 Note that for conversions to integer type the C standard requires
1933 round-to-zero to always be used. */
1934APFloat::opStatus
Neil Boothee7ae382007-11-01 22:43:37 +00001935APFloat::convertToSignExtendedInteger(integerPart *parts, unsigned int width,
1936 bool isSigned,
Dale Johannesen23a98552008-10-09 23:00:39 +00001937 roundingMode rounding_mode,
1938 bool *isExact) const
Neil Boothee7ae382007-11-01 22:43:37 +00001939{
1940 lostFraction lost_fraction;
1941 const integerPart *src;
1942 unsigned int dstPartsCount, truncatedBits;
1943
Evan Cheng794a7db2008-11-26 01:11:57 +00001944 assertArithmeticOK(*semantics);
Neil Boothe3d936a2007-11-02 15:10:05 +00001945
Dale Johannesen23a98552008-10-09 23:00:39 +00001946 *isExact = false;
1947
Neil Boothee7ae382007-11-01 22:43:37 +00001948 /* Handle the three special cases first. */
Dan Gohman16e02092010-03-24 19:38:02 +00001949 if (category == fcInfinity || category == fcNaN)
Neil Boothee7ae382007-11-01 22:43:37 +00001950 return opInvalidOp;
1951
1952 dstPartsCount = partCountForBits(width);
1953
Dan Gohman16e02092010-03-24 19:38:02 +00001954 if (category == fcZero) {
Neil Boothee7ae382007-11-01 22:43:37 +00001955 APInt::tcSet(parts, 0, dstPartsCount);
Dale Johannesene4a42452008-10-07 00:40:01 +00001956 // Negative zero can't be represented as an int.
Dale Johannesen23a98552008-10-09 23:00:39 +00001957 *isExact = !sign;
1958 return opOK;
Neil Boothee7ae382007-11-01 22:43:37 +00001959 }
1960
1961 src = significandParts();
1962
1963 /* Step 1: place our absolute value, with any fraction truncated, in
1964 the destination. */
1965 if (exponent < 0) {
1966 /* Our absolute value is less than one; truncate everything. */
1967 APInt::tcSet(parts, 0, dstPartsCount);
Dale Johannesen1f54f582009-01-19 21:17:05 +00001968 /* For exponent -1 the integer bit represents .5, look at that.
1969 For smaller exponents leftmost truncated bit is 0. */
1970 truncatedBits = semantics->precision -1U - exponent;
Neil Boothee7ae382007-11-01 22:43:37 +00001971 } else {
1972 /* We want the most significant (exponent + 1) bits; the rest are
1973 truncated. */
1974 unsigned int bits = exponent + 1U;
1975
1976 /* Hopelessly large in magnitude? */
1977 if (bits > width)
1978 return opInvalidOp;
1979
1980 if (bits < semantics->precision) {
1981 /* We truncate (semantics->precision - bits) bits. */
1982 truncatedBits = semantics->precision - bits;
1983 APInt::tcExtract(parts, dstPartsCount, src, bits, truncatedBits);
1984 } else {
1985 /* We want at least as many bits as are available. */
1986 APInt::tcExtract(parts, dstPartsCount, src, semantics->precision, 0);
1987 APInt::tcShiftLeft(parts, dstPartsCount, bits - semantics->precision);
1988 truncatedBits = 0;
1989 }
1990 }
1991
1992 /* Step 2: work out any lost fraction, and increment the absolute
1993 value if we would round away from zero. */
1994 if (truncatedBits) {
1995 lost_fraction = lostFractionThroughTruncation(src, partCount(),
1996 truncatedBits);
Dan Gohman16e02092010-03-24 19:38:02 +00001997 if (lost_fraction != lfExactlyZero &&
1998 roundAwayFromZero(rounding_mode, lost_fraction, truncatedBits)) {
Neil Boothee7ae382007-11-01 22:43:37 +00001999 if (APInt::tcIncrement(parts, dstPartsCount))
2000 return opInvalidOp; /* Overflow. */
2001 }
2002 } else {
2003 lost_fraction = lfExactlyZero;
2004 }
2005
2006 /* Step 3: check if we fit in the destination. */
2007 unsigned int omsb = APInt::tcMSB(parts, dstPartsCount) + 1;
2008
2009 if (sign) {
2010 if (!isSigned) {
2011 /* Negative numbers cannot be represented as unsigned. */
2012 if (omsb != 0)
2013 return opInvalidOp;
2014 } else {
2015 /* It takes omsb bits to represent the unsigned integer value.
2016 We lose a bit for the sign, but care is needed as the
2017 maximally negative integer is a special case. */
2018 if (omsb == width && APInt::tcLSB(parts, dstPartsCount) + 1 != omsb)
2019 return opInvalidOp;
2020
2021 /* This case can happen because of rounding. */
2022 if (omsb > width)
2023 return opInvalidOp;
2024 }
2025
2026 APInt::tcNegate (parts, dstPartsCount);
2027 } else {
2028 if (omsb >= width + !isSigned)
2029 return opInvalidOp;
2030 }
2031
Dale Johannesen23a98552008-10-09 23:00:39 +00002032 if (lost_fraction == lfExactlyZero) {
2033 *isExact = true;
Neil Boothee7ae382007-11-01 22:43:37 +00002034 return opOK;
Dale Johannesen23a98552008-10-09 23:00:39 +00002035 } else
Neil Boothee7ae382007-11-01 22:43:37 +00002036 return opInexact;
2037}
2038
2039/* Same as convertToSignExtendedInteger, except we provide
2040 deterministic values in case of an invalid operation exception,
2041 namely zero for NaNs and the minimal or maximal value respectively
Dale Johannesen23a98552008-10-09 23:00:39 +00002042 for underflow or overflow.
2043 The *isExact output tells whether the result is exact, in the sense
2044 that converting it back to the original floating point type produces
2045 the original value. This is almost equivalent to result==opOK,
2046 except for negative zeroes.
2047*/
Neil Boothee7ae382007-11-01 22:43:37 +00002048APFloat::opStatus
Chris Lattnerb39cdde2007-08-20 22:49:32 +00002049APFloat::convertToInteger(integerPart *parts, unsigned int width,
Neil Booth4f881702007-09-26 21:33:42 +00002050 bool isSigned,
Dale Johannesen23a98552008-10-09 23:00:39 +00002051 roundingMode rounding_mode, bool *isExact) const
Chris Lattnerb39cdde2007-08-20 22:49:32 +00002052{
Neil Boothee7ae382007-11-01 22:43:37 +00002053 opStatus fs;
Chris Lattnerb39cdde2007-08-20 22:49:32 +00002054
Dan Gohman16e02092010-03-24 19:38:02 +00002055 fs = convertToSignExtendedInteger(parts, width, isSigned, rounding_mode,
Dale Johannesen23a98552008-10-09 23:00:39 +00002056 isExact);
Chris Lattnerb39cdde2007-08-20 22:49:32 +00002057
Neil Boothee7ae382007-11-01 22:43:37 +00002058 if (fs == opInvalidOp) {
2059 unsigned int bits, dstPartsCount;
2060
2061 dstPartsCount = partCountForBits(width);
2062
2063 if (category == fcNaN)
2064 bits = 0;
2065 else if (sign)
2066 bits = isSigned;
2067 else
2068 bits = width - isSigned;
2069
2070 APInt::tcSetLeastSignificantBits(parts, dstPartsCount, bits);
2071 if (sign && isSigned)
2072 APInt::tcShiftLeft(parts, dstPartsCount, width - 1);
Chris Lattnerb39cdde2007-08-20 22:49:32 +00002073 }
2074
Neil Boothee7ae382007-11-01 22:43:37 +00002075 return fs;
Chris Lattnerb39cdde2007-08-20 22:49:32 +00002076}
2077
Jeffrey Yasskin3d42bfb2011-07-15 07:04:56 +00002078/* Same as convertToInteger(integerPart*, ...), except the result is returned in
2079 an APSInt, whose initial bit-width and signed-ness are used to determine the
2080 precision of the conversion.
2081 */
2082APFloat::opStatus
2083APFloat::convertToInteger(APSInt &result,
2084 roundingMode rounding_mode, bool *isExact) const
2085{
2086 unsigned bitWidth = result.getBitWidth();
2087 SmallVector<uint64_t, 4> parts(result.getNumWords());
2088 opStatus status = convertToInteger(
2089 parts.data(), bitWidth, result.isSigned(), rounding_mode, isExact);
2090 // Keeps the original signed-ness.
Jeffrey Yasskin3ba292d2011-07-18 21:45:40 +00002091 result = APInt(bitWidth, parts);
Jeffrey Yasskin3d42bfb2011-07-15 07:04:56 +00002092 return status;
2093}
2094
Neil Booth643ce592007-10-07 12:07:53 +00002095/* Convert an unsigned integer SRC to a floating point number,
2096 rounding according to ROUNDING_MODE. The sign of the floating
2097 point number is not modified. */
Chris Lattnerb39cdde2007-08-20 22:49:32 +00002098APFloat::opStatus
Neil Booth643ce592007-10-07 12:07:53 +00002099APFloat::convertFromUnsignedParts(const integerPart *src,
2100 unsigned int srcCount,
2101 roundingMode rounding_mode)
Chris Lattnerb39cdde2007-08-20 22:49:32 +00002102{
Neil Booth5477f852007-10-08 14:39:42 +00002103 unsigned int omsb, precision, dstCount;
Neil Booth643ce592007-10-07 12:07:53 +00002104 integerPart *dst;
Neil Booth5477f852007-10-08 14:39:42 +00002105 lostFraction lost_fraction;
Chris Lattnerb39cdde2007-08-20 22:49:32 +00002106
Neil Boothcaf19d72007-10-14 10:29:28 +00002107 assertArithmeticOK(*semantics);
Chris Lattnerb39cdde2007-08-20 22:49:32 +00002108 category = fcNormal;
Neil Booth5477f852007-10-08 14:39:42 +00002109 omsb = APInt::tcMSB(src, srcCount) + 1;
Neil Booth643ce592007-10-07 12:07:53 +00002110 dst = significandParts();
2111 dstCount = partCount();
Neil Booth5477f852007-10-08 14:39:42 +00002112 precision = semantics->precision;
Neil Booth643ce592007-10-07 12:07:53 +00002113
Nick Lewycky03dd4e82011-10-03 21:30:08 +00002114 /* We want the most significant PRECISION bits of SRC. There may not
Neil Booth5477f852007-10-08 14:39:42 +00002115 be that many; extract what we can. */
2116 if (precision <= omsb) {
2117 exponent = omsb - 1;
Neil Booth643ce592007-10-07 12:07:53 +00002118 lost_fraction = lostFractionThroughTruncation(src, srcCount,
Neil Booth5477f852007-10-08 14:39:42 +00002119 omsb - precision);
2120 APInt::tcExtract(dst, dstCount, src, precision, omsb - precision);
2121 } else {
2122 exponent = precision - 1;
2123 lost_fraction = lfExactlyZero;
2124 APInt::tcExtract(dst, dstCount, src, omsb, 0);
Neil Booth643ce592007-10-07 12:07:53 +00002125 }
Chris Lattnerb39cdde2007-08-20 22:49:32 +00002126
2127 return normalize(rounding_mode, lost_fraction);
2128}
2129
Dan Gohman93c276e2008-02-29 01:26:11 +00002130APFloat::opStatus
2131APFloat::convertFromAPInt(const APInt &Val,
2132 bool isSigned,
2133 roundingMode rounding_mode)
2134{
2135 unsigned int partCount = Val.getNumWords();
2136 APInt api = Val;
2137
2138 sign = false;
2139 if (isSigned && api.isNegative()) {
2140 sign = true;
2141 api = -api;
2142 }
2143
2144 return convertFromUnsignedParts(api.getRawData(), partCount, rounding_mode);
2145}
2146
Neil Boothf16c5952007-10-07 12:15:41 +00002147/* Convert a two's complement integer SRC to a floating point number,
2148 rounding according to ROUNDING_MODE. ISSIGNED is true if the
2149 integer is signed, in which case it must be sign-extended. */
2150APFloat::opStatus
2151APFloat::convertFromSignExtendedInteger(const integerPart *src,
2152 unsigned int srcCount,
2153 bool isSigned,
2154 roundingMode rounding_mode)
2155{
2156 opStatus status;
2157
Neil Boothcaf19d72007-10-14 10:29:28 +00002158 assertArithmeticOK(*semantics);
Dan Gohman16e02092010-03-24 19:38:02 +00002159 if (isSigned &&
2160 APInt::tcExtractBit(src, srcCount * integerPartWidth - 1)) {
Neil Boothf16c5952007-10-07 12:15:41 +00002161 integerPart *copy;
2162
2163 /* If we're signed and negative negate a copy. */
2164 sign = true;
2165 copy = new integerPart[srcCount];
2166 APInt::tcAssign(copy, src, srcCount);
2167 APInt::tcNegate(copy, srcCount);
2168 status = convertFromUnsignedParts(copy, srcCount, rounding_mode);
2169 delete [] copy;
2170 } else {
2171 sign = false;
2172 status = convertFromUnsignedParts(src, srcCount, rounding_mode);
2173 }
2174
2175 return status;
2176}
2177
Neil Boothccf596a2007-10-07 11:45:55 +00002178/* FIXME: should this just take a const APInt reference? */
Chris Lattnerb39cdde2007-08-20 22:49:32 +00002179APFloat::opStatus
Neil Boothccf596a2007-10-07 11:45:55 +00002180APFloat::convertFromZeroExtendedInteger(const integerPart *parts,
2181 unsigned int width, bool isSigned,
2182 roundingMode rounding_mode)
Chris Lattnerb39cdde2007-08-20 22:49:32 +00002183{
Dale Johannesen910993e2007-09-21 22:09:37 +00002184 unsigned int partCount = partCountForBits(width);
Jeffrey Yasskin3ba292d2011-07-18 21:45:40 +00002185 APInt api = APInt(width, makeArrayRef(parts, partCount));
Chris Lattnerb39cdde2007-08-20 22:49:32 +00002186
2187 sign = false;
Dan Gohman16e02092010-03-24 19:38:02 +00002188 if (isSigned && APInt::tcExtractBit(parts, width - 1)) {
Dale Johannesencce23a42007-09-30 18:17:01 +00002189 sign = true;
2190 api = -api;
Chris Lattnerb39cdde2007-08-20 22:49:32 +00002191 }
2192
Neil Booth7a7bc0f2007-10-07 12:10:57 +00002193 return convertFromUnsignedParts(api.getRawData(), partCount, rounding_mode);
Chris Lattnerb39cdde2007-08-20 22:49:32 +00002194}
2195
2196APFloat::opStatus
Benjamin Kramer38e59892010-07-14 22:38:02 +00002197APFloat::convertFromHexadecimalString(StringRef s, roundingMode rounding_mode)
Chris Lattnerb39cdde2007-08-20 22:49:32 +00002198{
Erick Tryzelaarf8bc8012009-08-18 18:20:37 +00002199 lostFraction lost_fraction = lfExactlyZero;
Chris Lattnerb39cdde2007-08-20 22:49:32 +00002200 integerPart *significand;
2201 unsigned int bitPos, partsCount;
Erick Tryzelaara15d8902009-08-16 23:36:19 +00002202 StringRef::iterator dot, firstSignificantDigit;
Chris Lattnerb39cdde2007-08-20 22:49:32 +00002203
2204 zeroSignificand();
2205 exponent = 0;
2206 category = fcNormal;
2207
2208 significand = significandParts();
2209 partsCount = partCount();
2210 bitPos = partsCount * integerPartWidth;
2211
Neil Booth33d4c922007-10-07 08:51:21 +00002212 /* Skip leading zeroes and any (hexa)decimal point. */
Erick Tryzelaarc78b33b2009-08-20 23:30:43 +00002213 StringRef::iterator begin = s.begin();
2214 StringRef::iterator end = s.end();
2215 StringRef::iterator p = skipLeadingZeroesAndAnyDot(begin, end, &dot);
Chris Lattnerb39cdde2007-08-20 22:49:32 +00002216 firstSignificantDigit = p;
2217
Dan Gohman16e02092010-03-24 19:38:02 +00002218 for (; p != end;) {
Dale Johannesen386f3e92008-05-14 22:53:25 +00002219 integerPart hex_value;
Chris Lattnerb39cdde2007-08-20 22:49:32 +00002220
Dan Gohman16e02092010-03-24 19:38:02 +00002221 if (*p == '.') {
Erick Tryzelaarc78b33b2009-08-20 23:30:43 +00002222 assert(dot == end && "String contains multiple dots");
Chris Lattnerb39cdde2007-08-20 22:49:32 +00002223 dot = p++;
Erick Tryzelaarc78b33b2009-08-20 23:30:43 +00002224 if (p == end) {
2225 break;
2226 }
Chris Lattnerb39cdde2007-08-20 22:49:32 +00002227 }
2228
2229 hex_value = hexDigitValue(*p);
Dan Gohman16e02092010-03-24 19:38:02 +00002230 if (hex_value == -1U) {
Chris Lattnerb39cdde2007-08-20 22:49:32 +00002231 break;
2232 }
2233
2234 p++;
2235
Erick Tryzelaarc78b33b2009-08-20 23:30:43 +00002236 if (p == end) {
Chris Lattnerb39cdde2007-08-20 22:49:32 +00002237 break;
Erick Tryzelaara15d8902009-08-16 23:36:19 +00002238 } else {
2239 /* Store the number whilst 4-bit nibbles remain. */
Dan Gohman16e02092010-03-24 19:38:02 +00002240 if (bitPos) {
Erick Tryzelaara15d8902009-08-16 23:36:19 +00002241 bitPos -= 4;
2242 hex_value <<= bitPos % integerPartWidth;
2243 significand[bitPos / integerPartWidth] |= hex_value;
2244 } else {
Erick Tryzelaarc78b33b2009-08-20 23:30:43 +00002245 lost_fraction = trailingHexadecimalFraction(p, end, hex_value);
Dan Gohman16e02092010-03-24 19:38:02 +00002246 while (p != end && hexDigitValue(*p) != -1U)
Erick Tryzelaara15d8902009-08-16 23:36:19 +00002247 p++;
2248 break;
2249 }
Chris Lattnerb39cdde2007-08-20 22:49:32 +00002250 }
2251 }
2252
2253 /* Hex floats require an exponent but not a hexadecimal point. */
Erick Tryzelaarc78b33b2009-08-20 23:30:43 +00002254 assert(p != end && "Hex strings require an exponent");
2255 assert((*p == 'p' || *p == 'P') && "Invalid character in significand");
2256 assert(p != begin && "Significand has no digits");
2257 assert((dot == end || p - begin != 1) && "Significand has no digits");
Chris Lattnerb39cdde2007-08-20 22:49:32 +00002258
2259 /* Ignore the exponent if we are zero. */
Dan Gohman16e02092010-03-24 19:38:02 +00002260 if (p != firstSignificantDigit) {
Chris Lattnerb39cdde2007-08-20 22:49:32 +00002261 int expAdjustment;
2262
2263 /* Implicit hexadecimal point? */
Erick Tryzelaarc78b33b2009-08-20 23:30:43 +00002264 if (dot == end)
Chris Lattnerb39cdde2007-08-20 22:49:32 +00002265 dot = p;
2266
2267 /* Calculate the exponent adjustment implicit in the number of
2268 significant digits. */
Evan Cheng48e8c802008-05-02 21:15:08 +00002269 expAdjustment = static_cast<int>(dot - firstSignificantDigit);
Dan Gohman16e02092010-03-24 19:38:02 +00002270 if (expAdjustment < 0)
Chris Lattnerb39cdde2007-08-20 22:49:32 +00002271 expAdjustment++;
2272 expAdjustment = expAdjustment * 4 - 1;
2273
2274 /* Adjust for writing the significand starting at the most
2275 significant nibble. */
2276 expAdjustment += semantics->precision;
2277 expAdjustment -= partsCount * integerPartWidth;
2278
2279 /* Adjust for the given exponent. */
Erick Tryzelaarc78b33b2009-08-20 23:30:43 +00002280 exponent = totalExponent(p + 1, end, expAdjustment);
Chris Lattnerb39cdde2007-08-20 22:49:32 +00002281 }
2282
2283 return normalize(rounding_mode, lost_fraction);
2284}
2285
2286APFloat::opStatus
Neil Booth96c74712007-10-12 16:02:31 +00002287APFloat::roundSignificandWithExponent(const integerPart *decSigParts,
2288 unsigned sigPartCount, int exp,
2289 roundingMode rounding_mode)
2290{
2291 unsigned int parts, pow5PartCount;
Neil Boothcaf19d72007-10-14 10:29:28 +00002292 fltSemantics calcSemantics = { 32767, -32767, 0, true };
Neil Booth96c74712007-10-12 16:02:31 +00002293 integerPart pow5Parts[maxPowerOfFiveParts];
2294 bool isNearest;
2295
Dan Gohman16e02092010-03-24 19:38:02 +00002296 isNearest = (rounding_mode == rmNearestTiesToEven ||
2297 rounding_mode == rmNearestTiesToAway);
Neil Booth96c74712007-10-12 16:02:31 +00002298
2299 parts = partCountForBits(semantics->precision + 11);
2300
2301 /* Calculate pow(5, abs(exp)). */
2302 pow5PartCount = powerOf5(pow5Parts, exp >= 0 ? exp: -exp);
2303
2304 for (;; parts *= 2) {
2305 opStatus sigStatus, powStatus;
2306 unsigned int excessPrecision, truncatedBits;
2307
2308 calcSemantics.precision = parts * integerPartWidth - 1;
2309 excessPrecision = calcSemantics.precision - semantics->precision;
2310 truncatedBits = excessPrecision;
2311
2312 APFloat decSig(calcSemantics, fcZero, sign);
2313 APFloat pow5(calcSemantics, fcZero, false);
2314
2315 sigStatus = decSig.convertFromUnsignedParts(decSigParts, sigPartCount,
2316 rmNearestTiesToEven);
2317 powStatus = pow5.convertFromUnsignedParts(pow5Parts, pow5PartCount,
2318 rmNearestTiesToEven);
2319 /* Add exp, as 10^n = 5^n * 2^n. */
2320 decSig.exponent += exp;
2321
2322 lostFraction calcLostFraction;
Evan Cheng48e8c802008-05-02 21:15:08 +00002323 integerPart HUerr, HUdistance;
2324 unsigned int powHUerr;
Neil Booth96c74712007-10-12 16:02:31 +00002325
2326 if (exp >= 0) {
2327 /* multiplySignificand leaves the precision-th bit set to 1. */
2328 calcLostFraction = decSig.multiplySignificand(pow5, NULL);
2329 powHUerr = powStatus != opOK;
2330 } else {
2331 calcLostFraction = decSig.divideSignificand(pow5);
2332 /* Denormal numbers have less precision. */
2333 if (decSig.exponent < semantics->minExponent) {
2334 excessPrecision += (semantics->minExponent - decSig.exponent);
2335 truncatedBits = excessPrecision;
2336 if (excessPrecision > calcSemantics.precision)
2337 excessPrecision = calcSemantics.precision;
2338 }
2339 /* Extra half-ulp lost in reciprocal of exponent. */
Evan Cheng48e8c802008-05-02 21:15:08 +00002340 powHUerr = (powStatus == opOK && calcLostFraction == lfExactlyZero) ? 0:2;
Neil Booth96c74712007-10-12 16:02:31 +00002341 }
2342
2343 /* Both multiplySignificand and divideSignificand return the
2344 result with the integer bit set. */
Evan Cheng99ebfa52009-10-27 21:35:42 +00002345 assert(APInt::tcExtractBit
2346 (decSig.significandParts(), calcSemantics.precision - 1) == 1);
Neil Booth96c74712007-10-12 16:02:31 +00002347
2348 HUerr = HUerrBound(calcLostFraction != lfExactlyZero, sigStatus != opOK,
2349 powHUerr);
2350 HUdistance = 2 * ulpsFromBoundary(decSig.significandParts(),
2351 excessPrecision, isNearest);
2352
2353 /* Are we guaranteed to round correctly if we truncate? */
2354 if (HUdistance >= HUerr) {
2355 APInt::tcExtract(significandParts(), partCount(), decSig.significandParts(),
2356 calcSemantics.precision - excessPrecision,
2357 excessPrecision);
2358 /* Take the exponent of decSig. If we tcExtract-ed less bits
2359 above we must adjust our exponent to compensate for the
2360 implicit right shift. */
2361 exponent = (decSig.exponent + semantics->precision
2362 - (calcSemantics.precision - excessPrecision));
2363 calcLostFraction = lostFractionThroughTruncation(decSig.significandParts(),
2364 decSig.partCount(),
2365 truncatedBits);
2366 return normalize(rounding_mode, calcLostFraction);
2367 }
2368 }
2369}
2370
2371APFloat::opStatus
Benjamin Kramer38e59892010-07-14 22:38:02 +00002372APFloat::convertFromDecimalString(StringRef str, roundingMode rounding_mode)
Neil Booth96c74712007-10-12 16:02:31 +00002373{
Neil Booth1870f292007-10-14 10:16:12 +00002374 decimalInfo D;
Neil Booth96c74712007-10-12 16:02:31 +00002375 opStatus fs;
2376
Neil Booth1870f292007-10-14 10:16:12 +00002377 /* Scan the text. */
Erick Tryzelaara15d8902009-08-16 23:36:19 +00002378 StringRef::iterator p = str.begin();
2379 interpretDecimal(p, str.end(), &D);
Neil Booth96c74712007-10-12 16:02:31 +00002380
Neil Booth686700e2007-10-15 15:00:55 +00002381 /* Handle the quick cases. First the case of no significant digits,
2382 i.e. zero, and then exponents that are obviously too large or too
2383 small. Writing L for log 10 / log 2, a number d.ddddd*10^exp
2384 definitely overflows if
2385
2386 (exp - 1) * L >= maxExponent
2387
2388 and definitely underflows to zero where
2389
2390 (exp + 1) * L <= minExponent - precision
2391
2392 With integer arithmetic the tightest bounds for L are
2393
2394 93/28 < L < 196/59 [ numerator <= 256 ]
2395 42039/12655 < L < 28738/8651 [ numerator <= 65536 ]
2396 */
2397
Neil Boothcc233592007-12-05 13:06:04 +00002398 if (decDigitValue(*D.firstSigDigit) >= 10U) {
Neil Booth96c74712007-10-12 16:02:31 +00002399 category = fcZero;
2400 fs = opOK;
John McCall8b3f3302010-02-26 22:20:41 +00002401
2402 /* Check whether the normalized exponent is high enough to overflow
2403 max during the log-rebasing in the max-exponent check below. */
2404 } else if (D.normalizedExponent - 1 > INT_MAX / 42039) {
2405 fs = handleOverflow(rounding_mode);
2406
2407 /* If it wasn't, then it also wasn't high enough to overflow max
2408 during the log-rebasing in the min-exponent check. Check that it
2409 won't overflow min in either check, then perform the min-exponent
2410 check. */
2411 } else if (D.normalizedExponent - 1 < INT_MIN / 42039 ||
2412 (D.normalizedExponent + 1) * 28738 <=
2413 8651 * (semantics->minExponent - (int) semantics->precision)) {
Neil Booth686700e2007-10-15 15:00:55 +00002414 /* Underflow to zero and round. */
2415 zeroSignificand();
2416 fs = normalize(rounding_mode, lfLessThanHalf);
John McCall8b3f3302010-02-26 22:20:41 +00002417
2418 /* We can finally safely perform the max-exponent check. */
Neil Booth686700e2007-10-15 15:00:55 +00002419 } else if ((D.normalizedExponent - 1) * 42039
2420 >= 12655 * semantics->maxExponent) {
2421 /* Overflow and round. */
2422 fs = handleOverflow(rounding_mode);
Neil Booth96c74712007-10-12 16:02:31 +00002423 } else {
Neil Booth1870f292007-10-14 10:16:12 +00002424 integerPart *decSignificand;
2425 unsigned int partCount;
Neil Booth96c74712007-10-12 16:02:31 +00002426
Neil Booth1870f292007-10-14 10:16:12 +00002427 /* A tight upper bound on number of bits required to hold an
Neil Booth686700e2007-10-15 15:00:55 +00002428 N-digit decimal integer is N * 196 / 59. Allocate enough space
Neil Booth1870f292007-10-14 10:16:12 +00002429 to hold the full significand, and an extra part required by
2430 tcMultiplyPart. */
Evan Cheng48e8c802008-05-02 21:15:08 +00002431 partCount = static_cast<unsigned int>(D.lastSigDigit - D.firstSigDigit) + 1;
Neil Booth686700e2007-10-15 15:00:55 +00002432 partCount = partCountForBits(1 + 196 * partCount / 59);
Neil Booth1870f292007-10-14 10:16:12 +00002433 decSignificand = new integerPart[partCount + 1];
2434 partCount = 0;
Neil Booth96c74712007-10-12 16:02:31 +00002435
Neil Booth1870f292007-10-14 10:16:12 +00002436 /* Convert to binary efficiently - we do almost all multiplication
2437 in an integerPart. When this would overflow do we do a single
2438 bignum multiplication, and then revert again to multiplication
2439 in an integerPart. */
2440 do {
2441 integerPart decValue, val, multiplier;
2442
2443 val = 0;
2444 multiplier = 1;
2445
2446 do {
Erick Tryzelaara15d8902009-08-16 23:36:19 +00002447 if (*p == '.') {
Neil Booth1870f292007-10-14 10:16:12 +00002448 p++;
Erick Tryzelaara15d8902009-08-16 23:36:19 +00002449 if (p == str.end()) {
2450 break;
2451 }
2452 }
Neil Booth1870f292007-10-14 10:16:12 +00002453 decValue = decDigitValue(*p++);
Erick Tryzelaarc78b33b2009-08-20 23:30:43 +00002454 assert(decValue < 10U && "Invalid character in significand");
Neil Booth1870f292007-10-14 10:16:12 +00002455 multiplier *= 10;
2456 val = val * 10 + decValue;
2457 /* The maximum number that can be multiplied by ten with any
2458 digit added without overflowing an integerPart. */
2459 } while (p <= D.lastSigDigit && multiplier <= (~ (integerPart) 0 - 9) / 10);
2460
2461 /* Multiply out the current part. */
2462 APInt::tcMultiplyPart(decSignificand, decSignificand, multiplier, val,
2463 partCount, partCount + 1, false);
2464
2465 /* If we used another part (likely but not guaranteed), increase
2466 the count. */
2467 if (decSignificand[partCount])
2468 partCount++;
2469 } while (p <= D.lastSigDigit);
Neil Booth96c74712007-10-12 16:02:31 +00002470
Neil Booth43a4b282007-11-01 22:51:07 +00002471 category = fcNormal;
Neil Booth96c74712007-10-12 16:02:31 +00002472 fs = roundSignificandWithExponent(decSignificand, partCount,
Neil Booth1870f292007-10-14 10:16:12 +00002473 D.exponent, rounding_mode);
Neil Booth96c74712007-10-12 16:02:31 +00002474
Neil Booth1870f292007-10-14 10:16:12 +00002475 delete [] decSignificand;
2476 }
Neil Booth96c74712007-10-12 16:02:31 +00002477
2478 return fs;
2479}
2480
2481APFloat::opStatus
Benjamin Kramer38e59892010-07-14 22:38:02 +00002482APFloat::convertFromString(StringRef str, roundingMode rounding_mode)
Neil Booth4f881702007-09-26 21:33:42 +00002483{
Neil Boothcaf19d72007-10-14 10:29:28 +00002484 assertArithmeticOK(*semantics);
Erick Tryzelaara15d8902009-08-16 23:36:19 +00002485 assert(!str.empty() && "Invalid string length");
Neil Boothcaf19d72007-10-14 10:29:28 +00002486
Chris Lattnerb39cdde2007-08-20 22:49:32 +00002487 /* Handle a leading minus sign. */
Erick Tryzelaara15d8902009-08-16 23:36:19 +00002488 StringRef::iterator p = str.begin();
2489 size_t slen = str.size();
Erick Tryzelaarc78b33b2009-08-20 23:30:43 +00002490 sign = *p == '-' ? 1 : 0;
Dan Gohman16e02092010-03-24 19:38:02 +00002491 if (*p == '-' || *p == '+') {
Erick Tryzelaara15d8902009-08-16 23:36:19 +00002492 p++;
2493 slen--;
Erick Tryzelaarc78b33b2009-08-20 23:30:43 +00002494 assert(slen && "String has no digits");
Erick Tryzelaara15d8902009-08-16 23:36:19 +00002495 }
Chris Lattnerb39cdde2007-08-20 22:49:32 +00002496
Dan Gohman16e02092010-03-24 19:38:02 +00002497 if (slen >= 2 && p[0] == '0' && (p[1] == 'x' || p[1] == 'X')) {
Erick Tryzelaara15d8902009-08-16 23:36:19 +00002498 assert(slen - 2 && "Invalid string");
Erick Tryzelaarc78b33b2009-08-20 23:30:43 +00002499 return convertFromHexadecimalString(StringRef(p + 2, slen - 2),
Erick Tryzelaara15d8902009-08-16 23:36:19 +00002500 rounding_mode);
2501 }
Bill Wendlingb7c0d942008-11-27 08:00:12 +00002502
Erick Tryzelaarc78b33b2009-08-20 23:30:43 +00002503 return convertFromDecimalString(StringRef(p, slen), rounding_mode);
Chris Lattnerb39cdde2007-08-20 22:49:32 +00002504}
Dale Johannesen343e7702007-08-24 00:56:33 +00002505
Neil Bootha30b0ee2007-10-03 22:26:02 +00002506/* Write out a hexadecimal representation of the floating point value
2507 to DST, which must be of sufficient size, in the C99 form
2508 [-]0xh.hhhhp[+-]d. Return the number of characters written,
2509 excluding the terminating NUL.
2510
2511 If UPPERCASE, the output is in upper case, otherwise in lower case.
2512
2513 HEXDIGITS digits appear altogether, rounding the value if
2514 necessary. If HEXDIGITS is 0, the minimal precision to display the
2515 number precisely is used instead. If nothing would appear after
2516 the decimal point it is suppressed.
2517
2518 The decimal exponent is always printed and has at least one digit.
2519 Zero values display an exponent of zero. Infinities and NaNs
2520 appear as "infinity" or "nan" respectively.
2521
2522 The above rules are as specified by C99. There is ambiguity about
2523 what the leading hexadecimal digit should be. This implementation
2524 uses whatever is necessary so that the exponent is displayed as
2525 stored. This implies the exponent will fall within the IEEE format
2526 range, and the leading hexadecimal digit will be 0 (for denormals),
2527 1 (normal numbers) or 2 (normal numbers rounded-away-from-zero with
2528 any other digits zero).
2529*/
2530unsigned int
2531APFloat::convertToHexString(char *dst, unsigned int hexDigits,
2532 bool upperCase, roundingMode rounding_mode) const
2533{
2534 char *p;
2535
Neil Boothcaf19d72007-10-14 10:29:28 +00002536 assertArithmeticOK(*semantics);
2537
Neil Bootha30b0ee2007-10-03 22:26:02 +00002538 p = dst;
2539 if (sign)
2540 *dst++ = '-';
2541
2542 switch (category) {
2543 case fcInfinity:
2544 memcpy (dst, upperCase ? infinityU: infinityL, sizeof infinityU - 1);
2545 dst += sizeof infinityL - 1;
2546 break;
2547
2548 case fcNaN:
2549 memcpy (dst, upperCase ? NaNU: NaNL, sizeof NaNU - 1);
2550 dst += sizeof NaNU - 1;
2551 break;
2552
2553 case fcZero:
2554 *dst++ = '0';
2555 *dst++ = upperCase ? 'X': 'x';
2556 *dst++ = '0';
2557 if (hexDigits > 1) {
2558 *dst++ = '.';
2559 memset (dst, '0', hexDigits - 1);
2560 dst += hexDigits - 1;
2561 }
2562 *dst++ = upperCase ? 'P': 'p';
2563 *dst++ = '0';
2564 break;
2565
2566 case fcNormal:
2567 dst = convertNormalToHexString (dst, hexDigits, upperCase, rounding_mode);
2568 break;
2569 }
2570
2571 *dst = 0;
2572
Evan Cheng48e8c802008-05-02 21:15:08 +00002573 return static_cast<unsigned int>(dst - p);
Neil Bootha30b0ee2007-10-03 22:26:02 +00002574}
2575
2576/* Does the hard work of outputting the correctly rounded hexadecimal
2577 form of a normal floating point number with the specified number of
2578 hexadecimal digits. If HEXDIGITS is zero the minimum number of
2579 digits necessary to print the value precisely is output. */
2580char *
2581APFloat::convertNormalToHexString(char *dst, unsigned int hexDigits,
2582 bool upperCase,
2583 roundingMode rounding_mode) const
2584{
2585 unsigned int count, valueBits, shift, partsCount, outputDigits;
2586 const char *hexDigitChars;
2587 const integerPart *significand;
2588 char *p;
2589 bool roundUp;
2590
2591 *dst++ = '0';
2592 *dst++ = upperCase ? 'X': 'x';
2593
2594 roundUp = false;
2595 hexDigitChars = upperCase ? hexDigitsUpper: hexDigitsLower;
2596
2597 significand = significandParts();
2598 partsCount = partCount();
2599
2600 /* +3 because the first digit only uses the single integer bit, so
2601 we have 3 virtual zero most-significant-bits. */
2602 valueBits = semantics->precision + 3;
2603 shift = integerPartWidth - valueBits % integerPartWidth;
2604
2605 /* The natural number of digits required ignoring trailing
2606 insignificant zeroes. */
2607 outputDigits = (valueBits - significandLSB () + 3) / 4;
2608
2609 /* hexDigits of zero means use the required number for the
2610 precision. Otherwise, see if we are truncating. If we are,
Neil Booth978661d2007-10-06 00:24:48 +00002611 find out if we need to round away from zero. */
Neil Bootha30b0ee2007-10-03 22:26:02 +00002612 if (hexDigits) {
2613 if (hexDigits < outputDigits) {
2614 /* We are dropping non-zero bits, so need to check how to round.
2615 "bits" is the number of dropped bits. */
2616 unsigned int bits;
2617 lostFraction fraction;
2618
2619 bits = valueBits - hexDigits * 4;
2620 fraction = lostFractionThroughTruncation (significand, partsCount, bits);
2621 roundUp = roundAwayFromZero(rounding_mode, fraction, bits);
2622 }
2623 outputDigits = hexDigits;
2624 }
2625
2626 /* Write the digits consecutively, and start writing in the location
2627 of the hexadecimal point. We move the most significant digit
2628 left and add the hexadecimal point later. */
2629 p = ++dst;
2630
2631 count = (valueBits + integerPartWidth - 1) / integerPartWidth;
2632
2633 while (outputDigits && count) {
2634 integerPart part;
2635
2636 /* Put the most significant integerPartWidth bits in "part". */
2637 if (--count == partsCount)
2638 part = 0; /* An imaginary higher zero part. */
2639 else
2640 part = significand[count] << shift;
2641
2642 if (count && shift)
2643 part |= significand[count - 1] >> (integerPartWidth - shift);
2644
2645 /* Convert as much of "part" to hexdigits as we can. */
2646 unsigned int curDigits = integerPartWidth / 4;
2647
2648 if (curDigits > outputDigits)
2649 curDigits = outputDigits;
2650 dst += partAsHex (dst, part, curDigits, hexDigitChars);
2651 outputDigits -= curDigits;
2652 }
2653
2654 if (roundUp) {
2655 char *q = dst;
2656
2657 /* Note that hexDigitChars has a trailing '0'. */
2658 do {
2659 q--;
2660 *q = hexDigitChars[hexDigitValue (*q) + 1];
Neil Booth978661d2007-10-06 00:24:48 +00002661 } while (*q == '0');
Evan Cheng99ebfa52009-10-27 21:35:42 +00002662 assert(q >= p);
Neil Bootha30b0ee2007-10-03 22:26:02 +00002663 } else {
2664 /* Add trailing zeroes. */
2665 memset (dst, '0', outputDigits);
2666 dst += outputDigits;
2667 }
2668
2669 /* Move the most significant digit to before the point, and if there
2670 is something after the decimal point add it. This must come
2671 after rounding above. */
2672 p[-1] = p[0];
2673 if (dst -1 == p)
2674 dst--;
2675 else
2676 p[0] = '.';
2677
2678 /* Finally output the exponent. */
2679 *dst++ = upperCase ? 'P': 'p';
2680
Neil Booth92f7e8d2007-10-06 07:29:25 +00002681 return writeSignedDecimal (dst, exponent);
Neil Bootha30b0ee2007-10-03 22:26:02 +00002682}
2683
Dale Johannesen343e7702007-08-24 00:56:33 +00002684// For good performance it is desirable for different APFloats
2685// to produce different integers.
2686uint32_t
Neil Booth4f881702007-09-26 21:33:42 +00002687APFloat::getHashValue() const
2688{
Dale Johannesen343e7702007-08-24 00:56:33 +00002689 if (category==fcZero) return sign<<8 | semantics->precision ;
2690 else if (category==fcInfinity) return sign<<9 | semantics->precision;
Dale Johanneseneaf08942007-08-31 04:03:46 +00002691 else if (category==fcNaN) return 1<<10 | semantics->precision;
Dale Johannesen343e7702007-08-24 00:56:33 +00002692 else {
2693 uint32_t hash = sign<<11 | semantics->precision | exponent<<12;
2694 const integerPart* p = significandParts();
2695 for (int i=partCount(); i>0; i--, p++)
Evan Cheng48e8c802008-05-02 21:15:08 +00002696 hash ^= ((uint32_t)*p) ^ (uint32_t)((*p)>>32);
Dale Johannesen343e7702007-08-24 00:56:33 +00002697 return hash;
2698 }
2699}
2700
2701// Conversion from APFloat to/from host float/double. It may eventually be
2702// possible to eliminate these and have everybody deal with APFloats, but that
2703// will take a while. This approach will not easily extend to long double.
Dale Johannesena72a5a02007-09-20 23:47:58 +00002704// Current implementation requires integerPartWidth==64, which is correct at
2705// the moment but could be made more general.
Dale Johannesen343e7702007-08-24 00:56:33 +00002706
Dale Johannesen58c2e4c2007-09-05 20:39:49 +00002707// Denormals have exponent minExponent in APFloat, but minExponent-1 in
Dale Johannesena72a5a02007-09-20 23:47:58 +00002708// the actual IEEE respresentations. We compensate for that here.
Dale Johannesen58c2e4c2007-09-05 20:39:49 +00002709
Dale Johannesen3f6eb742007-09-11 18:32:33 +00002710APInt
Neil Booth4f881702007-09-26 21:33:42 +00002711APFloat::convertF80LongDoubleAPFloatToAPInt() const
2712{
Dan Gohmanb10abe12008-01-29 12:08:20 +00002713 assert(semantics == (const llvm::fltSemantics*)&x87DoubleExtended);
Evan Cheng99ebfa52009-10-27 21:35:42 +00002714 assert(partCount()==2);
Dale Johannesen3f6eb742007-09-11 18:32:33 +00002715
2716 uint64_t myexponent, mysignificand;
2717
2718 if (category==fcNormal) {
2719 myexponent = exponent+16383; //bias
Dale Johannesena72a5a02007-09-20 23:47:58 +00002720 mysignificand = significandParts()[0];
Dale Johannesen3f6eb742007-09-11 18:32:33 +00002721 if (myexponent==1 && !(mysignificand & 0x8000000000000000ULL))
2722 myexponent = 0; // denormal
2723 } else if (category==fcZero) {
2724 myexponent = 0;
2725 mysignificand = 0;
2726 } else if (category==fcInfinity) {
2727 myexponent = 0x7fff;
2728 mysignificand = 0x8000000000000000ULL;
Chris Lattnera11ef822007-10-06 06:13:42 +00002729 } else {
2730 assert(category == fcNaN && "Unknown category");
Dale Johannesen3f6eb742007-09-11 18:32:33 +00002731 myexponent = 0x7fff;
Dale Johannesena72a5a02007-09-20 23:47:58 +00002732 mysignificand = significandParts()[0];
Chris Lattnera11ef822007-10-06 06:13:42 +00002733 }
Dale Johannesen3f6eb742007-09-11 18:32:33 +00002734
2735 uint64_t words[2];
Dale Johannesen1b25cb22009-03-23 21:16:53 +00002736 words[0] = mysignificand;
2737 words[1] = ((uint64_t)(sign & 1) << 15) |
2738 (myexponent & 0x7fffLL);
Jeffrey Yasskin3ba292d2011-07-18 21:45:40 +00002739 return APInt(80, words);
Dale Johannesen3f6eb742007-09-11 18:32:33 +00002740}
2741
2742APInt
Dale Johannesena471c2e2007-10-11 18:07:22 +00002743APFloat::convertPPCDoubleDoubleAPFloatToAPInt() const
2744{
Dan Gohmanb10abe12008-01-29 12:08:20 +00002745 assert(semantics == (const llvm::fltSemantics*)&PPCDoubleDouble);
Evan Cheng99ebfa52009-10-27 21:35:42 +00002746 assert(partCount()==2);
Dale Johannesena471c2e2007-10-11 18:07:22 +00002747
2748 uint64_t myexponent, mysignificand, myexponent2, mysignificand2;
2749
2750 if (category==fcNormal) {
2751 myexponent = exponent + 1023; //bias
2752 myexponent2 = exponent2 + 1023;
2753 mysignificand = significandParts()[0];
2754 mysignificand2 = significandParts()[1];
2755 if (myexponent==1 && !(mysignificand & 0x10000000000000LL))
2756 myexponent = 0; // denormal
2757 if (myexponent2==1 && !(mysignificand2 & 0x10000000000000LL))
2758 myexponent2 = 0; // denormal
2759 } else if (category==fcZero) {
2760 myexponent = 0;
2761 mysignificand = 0;
2762 myexponent2 = 0;
2763 mysignificand2 = 0;
2764 } else if (category==fcInfinity) {
2765 myexponent = 0x7ff;
2766 myexponent2 = 0;
2767 mysignificand = 0;
2768 mysignificand2 = 0;
2769 } else {
2770 assert(category == fcNaN && "Unknown category");
2771 myexponent = 0x7ff;
2772 mysignificand = significandParts()[0];
2773 myexponent2 = exponent2;
2774 mysignificand2 = significandParts()[1];
2775 }
2776
2777 uint64_t words[2];
Evan Cheng48e8c802008-05-02 21:15:08 +00002778 words[0] = ((uint64_t)(sign & 1) << 63) |
Dale Johannesena471c2e2007-10-11 18:07:22 +00002779 ((myexponent & 0x7ff) << 52) |
2780 (mysignificand & 0xfffffffffffffLL);
Evan Cheng48e8c802008-05-02 21:15:08 +00002781 words[1] = ((uint64_t)(sign2 & 1) << 63) |
Dale Johannesena471c2e2007-10-11 18:07:22 +00002782 ((myexponent2 & 0x7ff) << 52) |
2783 (mysignificand2 & 0xfffffffffffffLL);
Jeffrey Yasskin3ba292d2011-07-18 21:45:40 +00002784 return APInt(128, words);
Dale Johannesena471c2e2007-10-11 18:07:22 +00002785}
2786
2787APInt
Anton Korobeynikov7e844f12009-08-21 22:10:30 +00002788APFloat::convertQuadrupleAPFloatToAPInt() const
2789{
2790 assert(semantics == (const llvm::fltSemantics*)&IEEEquad);
Evan Cheng99ebfa52009-10-27 21:35:42 +00002791 assert(partCount()==2);
Anton Korobeynikov7e844f12009-08-21 22:10:30 +00002792
2793 uint64_t myexponent, mysignificand, mysignificand2;
2794
2795 if (category==fcNormal) {
2796 myexponent = exponent+16383; //bias
2797 mysignificand = significandParts()[0];
2798 mysignificand2 = significandParts()[1];
2799 if (myexponent==1 && !(mysignificand2 & 0x1000000000000LL))
2800 myexponent = 0; // denormal
2801 } else if (category==fcZero) {
2802 myexponent = 0;
2803 mysignificand = mysignificand2 = 0;
2804 } else if (category==fcInfinity) {
2805 myexponent = 0x7fff;
2806 mysignificand = mysignificand2 = 0;
2807 } else {
2808 assert(category == fcNaN && "Unknown category!");
2809 myexponent = 0x7fff;
2810 mysignificand = significandParts()[0];
2811 mysignificand2 = significandParts()[1];
2812 }
2813
2814 uint64_t words[2];
2815 words[0] = mysignificand;
2816 words[1] = ((uint64_t)(sign & 1) << 63) |
2817 ((myexponent & 0x7fff) << 48) |
Anton Korobeynikov4755e992009-08-21 23:09:47 +00002818 (mysignificand2 & 0xffffffffffffLL);
Anton Korobeynikov7e844f12009-08-21 22:10:30 +00002819
Jeffrey Yasskin3ba292d2011-07-18 21:45:40 +00002820 return APInt(128, words);
Anton Korobeynikov7e844f12009-08-21 22:10:30 +00002821}
2822
2823APInt
Neil Booth4f881702007-09-26 21:33:42 +00002824APFloat::convertDoubleAPFloatToAPInt() const
2825{
Dan Gohmancb648f92007-09-14 20:08:19 +00002826 assert(semantics == (const llvm::fltSemantics*)&IEEEdouble);
Evan Cheng99ebfa52009-10-27 21:35:42 +00002827 assert(partCount()==1);
Dale Johannesen343e7702007-08-24 00:56:33 +00002828
Dale Johanneseneaf08942007-08-31 04:03:46 +00002829 uint64_t myexponent, mysignificand;
Dale Johannesen343e7702007-08-24 00:56:33 +00002830
2831 if (category==fcNormal) {
Dale Johannesen343e7702007-08-24 00:56:33 +00002832 myexponent = exponent+1023; //bias
Dale Johannesen58c2e4c2007-09-05 20:39:49 +00002833 mysignificand = *significandParts();
2834 if (myexponent==1 && !(mysignificand & 0x10000000000000LL))
2835 myexponent = 0; // denormal
Dale Johannesen343e7702007-08-24 00:56:33 +00002836 } else if (category==fcZero) {
Dale Johannesen343e7702007-08-24 00:56:33 +00002837 myexponent = 0;
2838 mysignificand = 0;
2839 } else if (category==fcInfinity) {
Dale Johannesen343e7702007-08-24 00:56:33 +00002840 myexponent = 0x7ff;
2841 mysignificand = 0;
Chris Lattnera11ef822007-10-06 06:13:42 +00002842 } else {
2843 assert(category == fcNaN && "Unknown category!");
Dale Johannesen343e7702007-08-24 00:56:33 +00002844 myexponent = 0x7ff;
Dale Johanneseneaf08942007-08-31 04:03:46 +00002845 mysignificand = *significandParts();
Chris Lattnera11ef822007-10-06 06:13:42 +00002846 }
Dale Johannesen343e7702007-08-24 00:56:33 +00002847
Evan Cheng48e8c802008-05-02 21:15:08 +00002848 return APInt(64, ((((uint64_t)(sign & 1) << 63) |
Chris Lattnera11ef822007-10-06 06:13:42 +00002849 ((myexponent & 0x7ff) << 52) |
2850 (mysignificand & 0xfffffffffffffLL))));
Dale Johannesen343e7702007-08-24 00:56:33 +00002851}
2852
Dale Johannesen3f6eb742007-09-11 18:32:33 +00002853APInt
Neil Booth4f881702007-09-26 21:33:42 +00002854APFloat::convertFloatAPFloatToAPInt() const
2855{
Dan Gohmancb648f92007-09-14 20:08:19 +00002856 assert(semantics == (const llvm::fltSemantics*)&IEEEsingle);
Evan Cheng99ebfa52009-10-27 21:35:42 +00002857 assert(partCount()==1);
Neil Booth4f881702007-09-26 21:33:42 +00002858
Dale Johanneseneaf08942007-08-31 04:03:46 +00002859 uint32_t myexponent, mysignificand;
Dale Johannesen343e7702007-08-24 00:56:33 +00002860
2861 if (category==fcNormal) {
Dale Johannesen343e7702007-08-24 00:56:33 +00002862 myexponent = exponent+127; //bias
Evan Cheng48e8c802008-05-02 21:15:08 +00002863 mysignificand = (uint32_t)*significandParts();
Dale Johannesend0763b92007-11-17 01:02:27 +00002864 if (myexponent == 1 && !(mysignificand & 0x800000))
Dale Johannesen58c2e4c2007-09-05 20:39:49 +00002865 myexponent = 0; // denormal
Dale Johannesen343e7702007-08-24 00:56:33 +00002866 } else if (category==fcZero) {
Dale Johannesen343e7702007-08-24 00:56:33 +00002867 myexponent = 0;
2868 mysignificand = 0;
2869 } else if (category==fcInfinity) {
Dale Johannesen343e7702007-08-24 00:56:33 +00002870 myexponent = 0xff;
2871 mysignificand = 0;
Chris Lattnera11ef822007-10-06 06:13:42 +00002872 } else {
2873 assert(category == fcNaN && "Unknown category!");
Dale Johannesen58c2e4c2007-09-05 20:39:49 +00002874 myexponent = 0xff;
Evan Cheng48e8c802008-05-02 21:15:08 +00002875 mysignificand = (uint32_t)*significandParts();
Chris Lattnera11ef822007-10-06 06:13:42 +00002876 }
Dale Johannesen343e7702007-08-24 00:56:33 +00002877
Chris Lattnera11ef822007-10-06 06:13:42 +00002878 return APInt(32, (((sign&1) << 31) | ((myexponent&0xff) << 23) |
2879 (mysignificand & 0x7fffff)));
Dale Johannesen343e7702007-08-24 00:56:33 +00002880}
2881
Chris Lattnercc4287a2009-10-16 02:13:51 +00002882APInt
2883APFloat::convertHalfAPFloatToAPInt() const
2884{
2885 assert(semantics == (const llvm::fltSemantics*)&IEEEhalf);
Evan Cheng99ebfa52009-10-27 21:35:42 +00002886 assert(partCount()==1);
Chris Lattnercc4287a2009-10-16 02:13:51 +00002887
2888 uint32_t myexponent, mysignificand;
2889
2890 if (category==fcNormal) {
2891 myexponent = exponent+15; //bias
2892 mysignificand = (uint32_t)*significandParts();
2893 if (myexponent == 1 && !(mysignificand & 0x400))
2894 myexponent = 0; // denormal
2895 } else if (category==fcZero) {
2896 myexponent = 0;
2897 mysignificand = 0;
2898 } else if (category==fcInfinity) {
Dale Johannesena223aed2009-10-23 04:02:51 +00002899 myexponent = 0x1f;
Chris Lattnercc4287a2009-10-16 02:13:51 +00002900 mysignificand = 0;
2901 } else {
2902 assert(category == fcNaN && "Unknown category!");
Dale Johannesena223aed2009-10-23 04:02:51 +00002903 myexponent = 0x1f;
Chris Lattnercc4287a2009-10-16 02:13:51 +00002904 mysignificand = (uint32_t)*significandParts();
2905 }
2906
2907 return APInt(16, (((sign&1) << 15) | ((myexponent&0x1f) << 10) |
2908 (mysignificand & 0x3ff)));
2909}
2910
Dale Johannesena471c2e2007-10-11 18:07:22 +00002911// This function creates an APInt that is just a bit map of the floating
2912// point constant as it would appear in memory. It is not a conversion,
2913// and treating the result as a normal integer is unlikely to be useful.
2914
Dale Johannesen3f6eb742007-09-11 18:32:33 +00002915APInt
Dale Johannesen7111b022008-10-09 18:53:47 +00002916APFloat::bitcastToAPInt() const
Neil Booth4f881702007-09-26 21:33:42 +00002917{
Chris Lattnercc4287a2009-10-16 02:13:51 +00002918 if (semantics == (const llvm::fltSemantics*)&IEEEhalf)
2919 return convertHalfAPFloatToAPInt();
2920
Dan Gohmanb10abe12008-01-29 12:08:20 +00002921 if (semantics == (const llvm::fltSemantics*)&IEEEsingle)
Dale Johannesen3f6eb742007-09-11 18:32:33 +00002922 return convertFloatAPFloatToAPInt();
Anton Korobeynikov7e844f12009-08-21 22:10:30 +00002923
Dan Gohmanb10abe12008-01-29 12:08:20 +00002924 if (semantics == (const llvm::fltSemantics*)&IEEEdouble)
Dale Johannesen3f6eb742007-09-11 18:32:33 +00002925 return convertDoubleAPFloatToAPInt();
Neil Booth4f881702007-09-26 21:33:42 +00002926
Anton Korobeynikov7e844f12009-08-21 22:10:30 +00002927 if (semantics == (const llvm::fltSemantics*)&IEEEquad)
2928 return convertQuadrupleAPFloatToAPInt();
2929
Dan Gohmanb10abe12008-01-29 12:08:20 +00002930 if (semantics == (const llvm::fltSemantics*)&PPCDoubleDouble)
Dale Johannesena471c2e2007-10-11 18:07:22 +00002931 return convertPPCDoubleDoubleAPFloatToAPInt();
2932
Dan Gohmanb10abe12008-01-29 12:08:20 +00002933 assert(semantics == (const llvm::fltSemantics*)&x87DoubleExtended &&
Chris Lattnera11ef822007-10-06 06:13:42 +00002934 "unknown format!");
2935 return convertF80LongDoubleAPFloatToAPInt();
Dale Johannesen3f6eb742007-09-11 18:32:33 +00002936}
2937
Neil Booth4f881702007-09-26 21:33:42 +00002938float
2939APFloat::convertToFloat() const
2940{
Chris Lattnerad785002009-09-24 21:44:20 +00002941 assert(semantics == (const llvm::fltSemantics*)&IEEEsingle &&
2942 "Float semantics are not IEEEsingle");
Dale Johannesen7111b022008-10-09 18:53:47 +00002943 APInt api = bitcastToAPInt();
Dale Johannesen3f6eb742007-09-11 18:32:33 +00002944 return api.bitsToFloat();
2945}
2946
Neil Booth4f881702007-09-26 21:33:42 +00002947double
2948APFloat::convertToDouble() const
2949{
Chris Lattnerad785002009-09-24 21:44:20 +00002950 assert(semantics == (const llvm::fltSemantics*)&IEEEdouble &&
2951 "Float semantics are not IEEEdouble");
Dale Johannesen7111b022008-10-09 18:53:47 +00002952 APInt api = bitcastToAPInt();
Dale Johannesen3f6eb742007-09-11 18:32:33 +00002953 return api.bitsToDouble();
2954}
2955
Dale Johannesend3d8ce32008-10-06 18:22:29 +00002956/// Integer bit is explicit in this format. Intel hardware (387 and later)
2957/// does not support these bit patterns:
2958/// exponent = all 1's, integer bit 0, significand 0 ("pseudoinfinity")
2959/// exponent = all 1's, integer bit 0, significand nonzero ("pseudoNaN")
2960/// exponent = 0, integer bit 1 ("pseudodenormal")
2961/// exponent!=0 nor all 1's, integer bit 0 ("unnormal")
2962/// At the moment, the first two are treated as NaNs, the second two as Normal.
Dale Johannesen3f6eb742007-09-11 18:32:33 +00002963void
Neil Booth4f881702007-09-26 21:33:42 +00002964APFloat::initFromF80LongDoubleAPInt(const APInt &api)
2965{
Dale Johannesen3f6eb742007-09-11 18:32:33 +00002966 assert(api.getBitWidth()==80);
2967 uint64_t i1 = api.getRawData()[0];
2968 uint64_t i2 = api.getRawData()[1];
Dale Johannesen1b25cb22009-03-23 21:16:53 +00002969 uint64_t myexponent = (i2 & 0x7fff);
2970 uint64_t mysignificand = i1;
Dale Johannesen3f6eb742007-09-11 18:32:33 +00002971
2972 initialize(&APFloat::x87DoubleExtended);
Dale Johannesena72a5a02007-09-20 23:47:58 +00002973 assert(partCount()==2);
Dale Johannesen3f6eb742007-09-11 18:32:33 +00002974
Dale Johannesen1b25cb22009-03-23 21:16:53 +00002975 sign = static_cast<unsigned int>(i2>>15);
Dale Johannesen3f6eb742007-09-11 18:32:33 +00002976 if (myexponent==0 && mysignificand==0) {
2977 // exponent, significand meaningless
2978 category = fcZero;
2979 } else if (myexponent==0x7fff && mysignificand==0x8000000000000000ULL) {
2980 // exponent, significand meaningless
2981 category = fcInfinity;
2982 } else if (myexponent==0x7fff && mysignificand!=0x8000000000000000ULL) {
2983 // exponent meaningless
2984 category = fcNaN;
Dale Johannesena72a5a02007-09-20 23:47:58 +00002985 significandParts()[0] = mysignificand;
2986 significandParts()[1] = 0;
Dale Johannesen3f6eb742007-09-11 18:32:33 +00002987 } else {
2988 category = fcNormal;
2989 exponent = myexponent - 16383;
Dale Johannesena72a5a02007-09-20 23:47:58 +00002990 significandParts()[0] = mysignificand;
2991 significandParts()[1] = 0;
Dale Johannesen3f6eb742007-09-11 18:32:33 +00002992 if (myexponent==0) // denormal
2993 exponent = -16382;
Neil Booth4f881702007-09-26 21:33:42 +00002994 }
Dale Johannesen3f6eb742007-09-11 18:32:33 +00002995}
2996
2997void
Dale Johannesena471c2e2007-10-11 18:07:22 +00002998APFloat::initFromPPCDoubleDoubleAPInt(const APInt &api)
2999{
3000 assert(api.getBitWidth()==128);
3001 uint64_t i1 = api.getRawData()[0];
3002 uint64_t i2 = api.getRawData()[1];
3003 uint64_t myexponent = (i1 >> 52) & 0x7ff;
3004 uint64_t mysignificand = i1 & 0xfffffffffffffLL;
3005 uint64_t myexponent2 = (i2 >> 52) & 0x7ff;
3006 uint64_t mysignificand2 = i2 & 0xfffffffffffffLL;
3007
3008 initialize(&APFloat::PPCDoubleDouble);
3009 assert(partCount()==2);
3010
Evan Cheng48e8c802008-05-02 21:15:08 +00003011 sign = static_cast<unsigned int>(i1>>63);
3012 sign2 = static_cast<unsigned int>(i2>>63);
Dale Johannesena471c2e2007-10-11 18:07:22 +00003013 if (myexponent==0 && mysignificand==0) {
3014 // exponent, significand meaningless
3015 // exponent2 and significand2 are required to be 0; we don't check
3016 category = fcZero;
3017 } else if (myexponent==0x7ff && mysignificand==0) {
3018 // exponent, significand meaningless
3019 // exponent2 and significand2 are required to be 0; we don't check
3020 category = fcInfinity;
3021 } else if (myexponent==0x7ff && mysignificand!=0) {
Dan Gohman16e02092010-03-24 19:38:02 +00003022 // exponent meaningless. So is the whole second word, but keep it
Dale Johannesena471c2e2007-10-11 18:07:22 +00003023 // for determinism.
3024 category = fcNaN;
3025 exponent2 = myexponent2;
3026 significandParts()[0] = mysignificand;
3027 significandParts()[1] = mysignificand2;
3028 } else {
3029 category = fcNormal;
3030 // Note there is no category2; the second word is treated as if it is
3031 // fcNormal, although it might be something else considered by itself.
3032 exponent = myexponent - 1023;
3033 exponent2 = myexponent2 - 1023;
3034 significandParts()[0] = mysignificand;
3035 significandParts()[1] = mysignificand2;
3036 if (myexponent==0) // denormal
3037 exponent = -1022;
3038 else
3039 significandParts()[0] |= 0x10000000000000LL; // integer bit
Dan Gohman16e02092010-03-24 19:38:02 +00003040 if (myexponent2==0)
Dale Johannesena471c2e2007-10-11 18:07:22 +00003041 exponent2 = -1022;
3042 else
3043 significandParts()[1] |= 0x10000000000000LL; // integer bit
3044 }
3045}
3046
3047void
Anton Korobeynikov7e844f12009-08-21 22:10:30 +00003048APFloat::initFromQuadrupleAPInt(const APInt &api)
3049{
3050 assert(api.getBitWidth()==128);
3051 uint64_t i1 = api.getRawData()[0];
3052 uint64_t i2 = api.getRawData()[1];
3053 uint64_t myexponent = (i2 >> 48) & 0x7fff;
3054 uint64_t mysignificand = i1;
3055 uint64_t mysignificand2 = i2 & 0xffffffffffffLL;
3056
3057 initialize(&APFloat::IEEEquad);
3058 assert(partCount()==2);
3059
3060 sign = static_cast<unsigned int>(i2>>63);
3061 if (myexponent==0 &&
3062 (mysignificand==0 && mysignificand2==0)) {
3063 // exponent, significand meaningless
3064 category = fcZero;
3065 } else if (myexponent==0x7fff &&
3066 (mysignificand==0 && mysignificand2==0)) {
3067 // exponent, significand meaningless
3068 category = fcInfinity;
3069 } else if (myexponent==0x7fff &&
3070 (mysignificand!=0 || mysignificand2 !=0)) {
3071 // exponent meaningless
3072 category = fcNaN;
3073 significandParts()[0] = mysignificand;
3074 significandParts()[1] = mysignificand2;
3075 } else {
3076 category = fcNormal;
3077 exponent = myexponent - 16383;
3078 significandParts()[0] = mysignificand;
3079 significandParts()[1] = mysignificand2;
3080 if (myexponent==0) // denormal
3081 exponent = -16382;
3082 else
3083 significandParts()[1] |= 0x1000000000000LL; // integer bit
3084 }
3085}
3086
3087void
Neil Booth4f881702007-09-26 21:33:42 +00003088APFloat::initFromDoubleAPInt(const APInt &api)
3089{
Dale Johannesen3f6eb742007-09-11 18:32:33 +00003090 assert(api.getBitWidth()==64);
3091 uint64_t i = *api.getRawData();
Dale Johannesend3b51fd2007-08-24 05:08:11 +00003092 uint64_t myexponent = (i >> 52) & 0x7ff;
3093 uint64_t mysignificand = i & 0xfffffffffffffLL;
3094
Dale Johannesen343e7702007-08-24 00:56:33 +00003095 initialize(&APFloat::IEEEdouble);
Dale Johannesen343e7702007-08-24 00:56:33 +00003096 assert(partCount()==1);
3097
Evan Cheng48e8c802008-05-02 21:15:08 +00003098 sign = static_cast<unsigned int>(i>>63);
Dale Johannesen343e7702007-08-24 00:56:33 +00003099 if (myexponent==0 && mysignificand==0) {
3100 // exponent, significand meaningless
3101 category = fcZero;
Dale Johannesen343e7702007-08-24 00:56:33 +00003102 } else if (myexponent==0x7ff && mysignificand==0) {
3103 // exponent, significand meaningless
3104 category = fcInfinity;
Dale Johanneseneaf08942007-08-31 04:03:46 +00003105 } else if (myexponent==0x7ff && mysignificand!=0) {
3106 // exponent meaningless
3107 category = fcNaN;
3108 *significandParts() = mysignificand;
Dale Johannesen343e7702007-08-24 00:56:33 +00003109 } else {
Dale Johannesen343e7702007-08-24 00:56:33 +00003110 category = fcNormal;
3111 exponent = myexponent - 1023;
Dale Johannesen58c2e4c2007-09-05 20:39:49 +00003112 *significandParts() = mysignificand;
3113 if (myexponent==0) // denormal
3114 exponent = -1022;
3115 else
3116 *significandParts() |= 0x10000000000000LL; // integer bit
Neil Booth4f881702007-09-26 21:33:42 +00003117 }
Dale Johannesen343e7702007-08-24 00:56:33 +00003118}
3119
Dale Johannesen3f6eb742007-09-11 18:32:33 +00003120void
Neil Booth4f881702007-09-26 21:33:42 +00003121APFloat::initFromFloatAPInt(const APInt & api)
3122{
Dale Johannesen3f6eb742007-09-11 18:32:33 +00003123 assert(api.getBitWidth()==32);
3124 uint32_t i = (uint32_t)*api.getRawData();
Dale Johannesend3b51fd2007-08-24 05:08:11 +00003125 uint32_t myexponent = (i >> 23) & 0xff;
3126 uint32_t mysignificand = i & 0x7fffff;
3127
Dale Johannesen343e7702007-08-24 00:56:33 +00003128 initialize(&APFloat::IEEEsingle);
Dale Johannesen343e7702007-08-24 00:56:33 +00003129 assert(partCount()==1);
3130
Dale Johanneseneaf08942007-08-31 04:03:46 +00003131 sign = i >> 31;
Dale Johannesen343e7702007-08-24 00:56:33 +00003132 if (myexponent==0 && mysignificand==0) {
3133 // exponent, significand meaningless
3134 category = fcZero;
Dale Johannesen343e7702007-08-24 00:56:33 +00003135 } else if (myexponent==0xff && mysignificand==0) {
3136 // exponent, significand meaningless
3137 category = fcInfinity;
Dale Johannesen902ff942007-09-25 17:25:00 +00003138 } else if (myexponent==0xff && mysignificand!=0) {
Dale Johannesen343e7702007-08-24 00:56:33 +00003139 // sign, exponent, significand meaningless
Dale Johanneseneaf08942007-08-31 04:03:46 +00003140 category = fcNaN;
3141 *significandParts() = mysignificand;
Dale Johannesen343e7702007-08-24 00:56:33 +00003142 } else {
3143 category = fcNormal;
Dale Johannesen343e7702007-08-24 00:56:33 +00003144 exponent = myexponent - 127; //bias
Dale Johannesen58c2e4c2007-09-05 20:39:49 +00003145 *significandParts() = mysignificand;
3146 if (myexponent==0) // denormal
3147 exponent = -126;
3148 else
3149 *significandParts() |= 0x800000; // integer bit
Dale Johannesen343e7702007-08-24 00:56:33 +00003150 }
3151}
Dale Johannesen3f6eb742007-09-11 18:32:33 +00003152
Chris Lattnercc4287a2009-10-16 02:13:51 +00003153void
3154APFloat::initFromHalfAPInt(const APInt & api)
3155{
3156 assert(api.getBitWidth()==16);
3157 uint32_t i = (uint32_t)*api.getRawData();
Dale Johannesena223aed2009-10-23 04:02:51 +00003158 uint32_t myexponent = (i >> 10) & 0x1f;
Chris Lattnercc4287a2009-10-16 02:13:51 +00003159 uint32_t mysignificand = i & 0x3ff;
3160
3161 initialize(&APFloat::IEEEhalf);
3162 assert(partCount()==1);
3163
3164 sign = i >> 15;
3165 if (myexponent==0 && mysignificand==0) {
3166 // exponent, significand meaningless
3167 category = fcZero;
3168 } else if (myexponent==0x1f && mysignificand==0) {
3169 // exponent, significand meaningless
3170 category = fcInfinity;
3171 } else if (myexponent==0x1f && mysignificand!=0) {
3172 // sign, exponent, significand meaningless
3173 category = fcNaN;
3174 *significandParts() = mysignificand;
3175 } else {
3176 category = fcNormal;
3177 exponent = myexponent - 15; //bias
3178 *significandParts() = mysignificand;
3179 if (myexponent==0) // denormal
3180 exponent = -14;
3181 else
3182 *significandParts() |= 0x400; // integer bit
3183 }
3184}
3185
Dale Johannesen3f6eb742007-09-11 18:32:33 +00003186/// Treat api as containing the bits of a floating point number. Currently
Dale Johannesena471c2e2007-10-11 18:07:22 +00003187/// we infer the floating point type from the size of the APInt. The
3188/// isIEEE argument distinguishes between PPC128 and IEEE128 (not meaningful
3189/// when the size is anything else).
Dale Johannesen3f6eb742007-09-11 18:32:33 +00003190void
Dale Johannesena471c2e2007-10-11 18:07:22 +00003191APFloat::initFromAPInt(const APInt& api, bool isIEEE)
Neil Booth4f881702007-09-26 21:33:42 +00003192{
Chris Lattnercc4287a2009-10-16 02:13:51 +00003193 if (api.getBitWidth() == 16)
3194 return initFromHalfAPInt(api);
3195 else if (api.getBitWidth() == 32)
Dale Johannesen3f6eb742007-09-11 18:32:33 +00003196 return initFromFloatAPInt(api);
3197 else if (api.getBitWidth()==64)
3198 return initFromDoubleAPInt(api);
3199 else if (api.getBitWidth()==80)
3200 return initFromF80LongDoubleAPInt(api);
Anton Korobeynikov7e844f12009-08-21 22:10:30 +00003201 else if (api.getBitWidth()==128)
3202 return (isIEEE ?
3203 initFromQuadrupleAPInt(api) : initFromPPCDoubleDoubleAPInt(api));
Dale Johannesen3f6eb742007-09-11 18:32:33 +00003204 else
Torok Edwinc23197a2009-07-14 16:55:14 +00003205 llvm_unreachable(0);
Dale Johannesen3f6eb742007-09-11 18:32:33 +00003206}
3207
Nadav Rotem093399c2011-02-17 21:22:27 +00003208APFloat
3209APFloat::getAllOnesValue(unsigned BitWidth, bool isIEEE)
3210{
3211 return APFloat(APInt::getAllOnesValue(BitWidth), isIEEE);
3212}
3213
John McCall00e65de2009-12-24 08:56:26 +00003214APFloat APFloat::getLargest(const fltSemantics &Sem, bool Negative) {
3215 APFloat Val(Sem, fcNormal, Negative);
3216
3217 // We want (in interchange format):
3218 // sign = {Negative}
3219 // exponent = 1..10
3220 // significand = 1..1
3221
3222 Val.exponent = Sem.maxExponent; // unbiased
3223
3224 // 1-initialize all bits....
3225 Val.zeroSignificand();
3226 integerPart *significand = Val.significandParts();
3227 unsigned N = partCountForBits(Sem.precision);
3228 for (unsigned i = 0; i != N; ++i)
3229 significand[i] = ~((integerPart) 0);
3230
3231 // ...and then clear the top bits for internal consistency.
Eli Friedman7247a5f2011-10-12 21:51:36 +00003232 if (Sem.precision % integerPartWidth != 0)
3233 significand[N-1] &=
3234 (((integerPart) 1) << (Sem.precision % integerPartWidth)) - 1;
John McCall00e65de2009-12-24 08:56:26 +00003235
3236 return Val;
3237}
3238
3239APFloat APFloat::getSmallest(const fltSemantics &Sem, bool Negative) {
3240 APFloat Val(Sem, fcNormal, Negative);
3241
3242 // We want (in interchange format):
3243 // sign = {Negative}
3244 // exponent = 0..0
3245 // significand = 0..01
3246
3247 Val.exponent = Sem.minExponent; // unbiased
3248 Val.zeroSignificand();
3249 Val.significandParts()[0] = 1;
3250 return Val;
3251}
3252
3253APFloat APFloat::getSmallestNormalized(const fltSemantics &Sem, bool Negative) {
3254 APFloat Val(Sem, fcNormal, Negative);
3255
3256 // We want (in interchange format):
3257 // sign = {Negative}
3258 // exponent = 0..0
3259 // significand = 10..0
3260
3261 Val.exponent = Sem.minExponent;
3262 Val.zeroSignificand();
Dan Gohman16e02092010-03-24 19:38:02 +00003263 Val.significandParts()[partCountForBits(Sem.precision)-1] |=
Eli Friedman90196fc2011-10-12 21:56:19 +00003264 (((integerPart) 1) << ((Sem.precision - 1) % integerPartWidth));
John McCall00e65de2009-12-24 08:56:26 +00003265
3266 return Val;
3267}
3268
Bill Wendlingf09a8b52011-03-18 09:09:44 +00003269APFloat::APFloat(const APInt& api, bool isIEEE) : exponent2(0), sign2(0) {
Dale Johannesena471c2e2007-10-11 18:07:22 +00003270 initFromAPInt(api, isIEEE);
Dale Johannesen3f6eb742007-09-11 18:32:33 +00003271}
3272
Bill Wendlingf09a8b52011-03-18 09:09:44 +00003273APFloat::APFloat(float f) : exponent2(0), sign2(0) {
Jay Foade4d19c92010-11-28 21:04:48 +00003274 initFromAPInt(APInt::floatToBits(f));
Dale Johannesen3f6eb742007-09-11 18:32:33 +00003275}
3276
Bill Wendlingf09a8b52011-03-18 09:09:44 +00003277APFloat::APFloat(double d) : exponent2(0), sign2(0) {
Jay Foade4d19c92010-11-28 21:04:48 +00003278 initFromAPInt(APInt::doubleToBits(d));
Dale Johannesen3f6eb742007-09-11 18:32:33 +00003279}
John McCall00e65de2009-12-24 08:56:26 +00003280
3281namespace {
3282 static void append(SmallVectorImpl<char> &Buffer,
3283 unsigned N, const char *Str) {
3284 unsigned Start = Buffer.size();
3285 Buffer.set_size(Start + N);
3286 memcpy(&Buffer[Start], Str, N);
3287 }
3288
3289 template <unsigned N>
3290 void append(SmallVectorImpl<char> &Buffer, const char (&Str)[N]) {
3291 append(Buffer, N, Str);
3292 }
3293
John McCall003a09c2009-12-24 12:16:56 +00003294 /// Removes data from the given significand until it is no more
3295 /// precise than is required for the desired precision.
3296 void AdjustToPrecision(APInt &significand,
3297 int &exp, unsigned FormatPrecision) {
3298 unsigned bits = significand.getActiveBits();
3299
3300 // 196/59 is a very slight overestimate of lg_2(10).
3301 unsigned bitsRequired = (FormatPrecision * 196 + 58) / 59;
3302
3303 if (bits <= bitsRequired) return;
3304
3305 unsigned tensRemovable = (bits - bitsRequired) * 59 / 196;
3306 if (!tensRemovable) return;
3307
3308 exp += tensRemovable;
3309
3310 APInt divisor(significand.getBitWidth(), 1);
3311 APInt powten(significand.getBitWidth(), 10);
3312 while (true) {
3313 if (tensRemovable & 1)
3314 divisor *= powten;
3315 tensRemovable >>= 1;
3316 if (!tensRemovable) break;
3317 powten *= powten;
3318 }
3319
3320 significand = significand.udiv(divisor);
3321
3322 // Truncate the significand down to its active bit count, but
3323 // don't try to drop below 32.
John McCall6a09aff2009-12-24 23:18:09 +00003324 unsigned newPrecision = std::max(32U, significand.getActiveBits());
Jay Foad40f8f622010-12-07 08:25:19 +00003325 significand = significand.trunc(newPrecision);
John McCall003a09c2009-12-24 12:16:56 +00003326 }
3327
3328
John McCall00e65de2009-12-24 08:56:26 +00003329 void AdjustToPrecision(SmallVectorImpl<char> &buffer,
3330 int &exp, unsigned FormatPrecision) {
3331 unsigned N = buffer.size();
3332 if (N <= FormatPrecision) return;
3333
3334 // The most significant figures are the last ones in the buffer.
3335 unsigned FirstSignificant = N - FormatPrecision;
3336
3337 // Round.
3338 // FIXME: this probably shouldn't use 'round half up'.
3339
3340 // Rounding down is just a truncation, except we also want to drop
3341 // trailing zeros from the new result.
3342 if (buffer[FirstSignificant - 1] < '5') {
3343 while (buffer[FirstSignificant] == '0')
3344 FirstSignificant++;
3345
3346 exp += FirstSignificant;
3347 buffer.erase(&buffer[0], &buffer[FirstSignificant]);
3348 return;
3349 }
3350
3351 // Rounding up requires a decimal add-with-carry. If we continue
3352 // the carry, the newly-introduced zeros will just be truncated.
3353 for (unsigned I = FirstSignificant; I != N; ++I) {
3354 if (buffer[I] == '9') {
3355 FirstSignificant++;
3356 } else {
3357 buffer[I]++;
3358 break;
3359 }
3360 }
3361
3362 // If we carried through, we have exactly one digit of precision.
3363 if (FirstSignificant == N) {
3364 exp += FirstSignificant;
3365 buffer.clear();
3366 buffer.push_back('1');
3367 return;
3368 }
3369
3370 exp += FirstSignificant;
3371 buffer.erase(&buffer[0], &buffer[FirstSignificant]);
3372 }
3373}
3374
3375void APFloat::toString(SmallVectorImpl<char> &Str,
3376 unsigned FormatPrecision,
Chris Lattner0ddda3b2010-03-06 19:20:13 +00003377 unsigned FormatMaxPadding) const {
John McCall00e65de2009-12-24 08:56:26 +00003378 switch (category) {
3379 case fcInfinity:
3380 if (isNegative())
3381 return append(Str, "-Inf");
3382 else
3383 return append(Str, "+Inf");
3384
3385 case fcNaN: return append(Str, "NaN");
3386
3387 case fcZero:
3388 if (isNegative())
3389 Str.push_back('-');
3390
3391 if (!FormatMaxPadding)
3392 append(Str, "0.0E+0");
3393 else
3394 Str.push_back('0');
3395 return;
3396
3397 case fcNormal:
3398 break;
3399 }
3400
3401 if (isNegative())
3402 Str.push_back('-');
3403
3404 // Decompose the number into an APInt and an exponent.
3405 int exp = exponent - ((int) semantics->precision - 1);
3406 APInt significand(semantics->precision,
Jeffrey Yasskin3ba292d2011-07-18 21:45:40 +00003407 makeArrayRef(significandParts(),
3408 partCountForBits(semantics->precision)));
John McCall00e65de2009-12-24 08:56:26 +00003409
John McCall6a09aff2009-12-24 23:18:09 +00003410 // Set FormatPrecision if zero. We want to do this before we
3411 // truncate trailing zeros, as those are part of the precision.
3412 if (!FormatPrecision) {
3413 // It's an interesting question whether to use the nominal
3414 // precision or the active precision here for denormals.
3415
3416 // FormatPrecision = ceil(significandBits / lg_2(10))
3417 FormatPrecision = (semantics->precision * 59 + 195) / 196;
3418 }
3419
John McCall00e65de2009-12-24 08:56:26 +00003420 // Ignore trailing binary zeros.
3421 int trailingZeros = significand.countTrailingZeros();
3422 exp += trailingZeros;
3423 significand = significand.lshr(trailingZeros);
3424
3425 // Change the exponent from 2^e to 10^e.
3426 if (exp == 0) {
3427 // Nothing to do.
3428 } else if (exp > 0) {
3429 // Just shift left.
Jay Foad40f8f622010-12-07 08:25:19 +00003430 significand = significand.zext(semantics->precision + exp);
John McCall00e65de2009-12-24 08:56:26 +00003431 significand <<= exp;
3432 exp = 0;
3433 } else { /* exp < 0 */
3434 int texp = -exp;
3435
3436 // We transform this using the identity:
3437 // (N)(2^-e) == (N)(5^e)(10^-e)
3438 // This means we have to multiply N (the significand) by 5^e.
3439 // To avoid overflow, we have to operate on numbers large
3440 // enough to store N * 5^e:
3441 // log2(N * 5^e) == log2(N) + e * log2(5)
John McCall6a09aff2009-12-24 23:18:09 +00003442 // <= semantics->precision + e * 137 / 59
3443 // (log_2(5) ~ 2.321928 < 2.322034 ~ 137/59)
Dan Gohman16e02092010-03-24 19:38:02 +00003444
Eli Friedman9eb6b4d2011-10-07 23:40:49 +00003445 unsigned precision = semantics->precision + (137 * texp + 136) / 59;
John McCall00e65de2009-12-24 08:56:26 +00003446
3447 // Multiply significand by 5^e.
3448 // N * 5^0101 == N * 5^(1*1) * 5^(0*2) * 5^(1*4) * 5^(0*8)
Jay Foad40f8f622010-12-07 08:25:19 +00003449 significand = significand.zext(precision);
John McCall00e65de2009-12-24 08:56:26 +00003450 APInt five_to_the_i(precision, 5);
3451 while (true) {
3452 if (texp & 1) significand *= five_to_the_i;
Dan Gohman16e02092010-03-24 19:38:02 +00003453
John McCall00e65de2009-12-24 08:56:26 +00003454 texp >>= 1;
3455 if (!texp) break;
3456 five_to_the_i *= five_to_the_i;
3457 }
3458 }
3459
John McCall003a09c2009-12-24 12:16:56 +00003460 AdjustToPrecision(significand, exp, FormatPrecision);
3461
John McCall00e65de2009-12-24 08:56:26 +00003462 llvm::SmallVector<char, 256> buffer;
3463
3464 // Fill the buffer.
3465 unsigned precision = significand.getBitWidth();
3466 APInt ten(precision, 10);
3467 APInt digit(precision, 0);
3468
3469 bool inTrail = true;
3470 while (significand != 0) {
3471 // digit <- significand % 10
3472 // significand <- significand / 10
3473 APInt::udivrem(significand, ten, significand, digit);
3474
3475 unsigned d = digit.getZExtValue();
3476
3477 // Drop trailing zeros.
3478 if (inTrail && !d) exp++;
3479 else {
3480 buffer.push_back((char) ('0' + d));
3481 inTrail = false;
3482 }
3483 }
3484
3485 assert(!buffer.empty() && "no characters in buffer!");
3486
3487 // Drop down to FormatPrecision.
3488 // TODO: don't do more precise calculations above than are required.
3489 AdjustToPrecision(buffer, exp, FormatPrecision);
3490
3491 unsigned NDigits = buffer.size();
3492
John McCall6a09aff2009-12-24 23:18:09 +00003493 // Check whether we should use scientific notation.
John McCall00e65de2009-12-24 08:56:26 +00003494 bool FormatScientific;
3495 if (!FormatMaxPadding)
3496 FormatScientific = true;
3497 else {
John McCall00e65de2009-12-24 08:56:26 +00003498 if (exp >= 0) {
John McCall6a09aff2009-12-24 23:18:09 +00003499 // 765e3 --> 765000
3500 // ^^^
3501 // But we shouldn't make the number look more precise than it is.
3502 FormatScientific = ((unsigned) exp > FormatMaxPadding ||
3503 NDigits + (unsigned) exp > FormatPrecision);
John McCall00e65de2009-12-24 08:56:26 +00003504 } else {
John McCall6a09aff2009-12-24 23:18:09 +00003505 // Power of the most significant digit.
3506 int MSD = exp + (int) (NDigits - 1);
3507 if (MSD >= 0) {
John McCall00e65de2009-12-24 08:56:26 +00003508 // 765e-2 == 7.65
John McCall6a09aff2009-12-24 23:18:09 +00003509 FormatScientific = false;
John McCall00e65de2009-12-24 08:56:26 +00003510 } else {
3511 // 765e-5 == 0.00765
3512 // ^ ^^
John McCall6a09aff2009-12-24 23:18:09 +00003513 FormatScientific = ((unsigned) -MSD) > FormatMaxPadding;
John McCall00e65de2009-12-24 08:56:26 +00003514 }
3515 }
John McCall00e65de2009-12-24 08:56:26 +00003516 }
3517
3518 // Scientific formatting is pretty straightforward.
3519 if (FormatScientific) {
3520 exp += (NDigits - 1);
3521
3522 Str.push_back(buffer[NDigits-1]);
3523 Str.push_back('.');
3524 if (NDigits == 1)
3525 Str.push_back('0');
3526 else
3527 for (unsigned I = 1; I != NDigits; ++I)
3528 Str.push_back(buffer[NDigits-1-I]);
3529 Str.push_back('E');
3530
3531 Str.push_back(exp >= 0 ? '+' : '-');
3532 if (exp < 0) exp = -exp;
3533 SmallVector<char, 6> expbuf;
3534 do {
3535 expbuf.push_back((char) ('0' + (exp % 10)));
3536 exp /= 10;
3537 } while (exp);
3538 for (unsigned I = 0, E = expbuf.size(); I != E; ++I)
3539 Str.push_back(expbuf[E-1-I]);
3540 return;
3541 }
3542
3543 // Non-scientific, positive exponents.
3544 if (exp >= 0) {
3545 for (unsigned I = 0; I != NDigits; ++I)
3546 Str.push_back(buffer[NDigits-1-I]);
3547 for (unsigned I = 0; I != (unsigned) exp; ++I)
3548 Str.push_back('0');
3549 return;
3550 }
3551
3552 // Non-scientific, negative exponents.
3553
3554 // The number of digits to the left of the decimal point.
3555 int NWholeDigits = exp + (int) NDigits;
3556
3557 unsigned I = 0;
3558 if (NWholeDigits > 0) {
3559 for (; I != (unsigned) NWholeDigits; ++I)
3560 Str.push_back(buffer[NDigits-I-1]);
3561 Str.push_back('.');
3562 } else {
3563 unsigned NZeros = 1 + (unsigned) -NWholeDigits;
3564
3565 Str.push_back('0');
3566 Str.push_back('.');
3567 for (unsigned Z = 1; Z != NZeros; ++Z)
3568 Str.push_back('0');
3569 }
3570
3571 for (; I != NDigits; ++I)
3572 Str.push_back(buffer[NDigits-I-1]);
3573}
Benjamin Kramer27460002011-03-30 15:42:27 +00003574
3575bool APFloat::getExactInverse(APFloat *inv) const {
Chris Lattner7a2bdde2011-04-15 05:18:47 +00003576 // We can only guarantee the existence of an exact inverse for IEEE floats.
Benjamin Kramer27460002011-03-30 15:42:27 +00003577 if (semantics != &IEEEhalf && semantics != &IEEEsingle &&
3578 semantics != &IEEEdouble && semantics != &IEEEquad)
3579 return false;
3580
3581 // Special floats and denormals have no exact inverse.
3582 if (category != fcNormal)
3583 return false;
3584
3585 // Check that the number is a power of two by making sure that only the
3586 // integer bit is set in the significand.
3587 if (significandLSB() != semantics->precision - 1)
3588 return false;
3589
3590 // Get the inverse.
3591 APFloat reciprocal(*semantics, 1ULL);
3592 if (reciprocal.divide(*this, rmNearestTiesToEven) != opOK)
3593 return false;
3594
Benjamin Kramer83985122011-03-30 17:02:54 +00003595 // Avoid multiplication with a denormal, it is not safe on all platforms and
3596 // may be slower than a normal division.
3597 if (reciprocal.significandMSB() + 1 < reciprocal.semantics->precision)
3598 return false;
3599
3600 assert(reciprocal.category == fcNormal &&
3601 reciprocal.significandLSB() == reciprocal.semantics->precision - 1);
3602
Benjamin Kramer27460002011-03-30 15:42:27 +00003603 if (inv)
3604 *inv = reciprocal;
3605
3606 return true;
3607}