Coverage Report

Created: 2025-12-12 07:27

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