blob: b61e6220a11201476e7d5c774a5001116c494b96 [file] [log] [blame]
Chris Lattnerb39cdde2007-08-20 22:49:32 +00001//===-- APFloat.cpp - Implement APFloat class -----------------------------===//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file was developed by Neil Booth and is distributed under the
6// University of Illinois Open Source 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 <cassert>
16#include "llvm/ADT/APFloat.h"
Dale Johannesend3b51fd2007-08-24 05:08:11 +000017#include "llvm/Support/MathExtras.h"
Chris Lattnerb39cdde2007-08-20 22:49:32 +000018
19using namespace llvm;
20
21#define convolve(lhs, rhs) ((lhs) * 4 + (rhs))
22
23/* Assumed in hexadecimal significand parsing. */
24COMPILE_TIME_ASSERT(integerPartWidth % 4 == 0);
25
26namespace llvm {
27
28 /* Represents floating point arithmetic semantics. */
29 struct fltSemantics {
30 /* The largest E such that 2^E is representable; this matches the
31 definition of IEEE 754. */
32 exponent_t maxExponent;
33
34 /* The smallest E such that 2^E is a normalized number; this
35 matches the definition of IEEE 754. */
36 exponent_t minExponent;
37
38 /* Number of bits in the significand. This includes the integer
39 bit. */
40 unsigned char precision;
41
42 /* If the target format has an implicit integer bit. */
43 bool implicitIntegerBit;
44 };
45
46 const fltSemantics APFloat::IEEEsingle = { 127, -126, 24, true };
47 const fltSemantics APFloat::IEEEdouble = { 1023, -1022, 53, true };
48 const fltSemantics APFloat::IEEEquad = { 16383, -16382, 113, true };
49 const fltSemantics APFloat::x87DoubleExtended = { 16383, -16382, 64, false };
Dale Johannesen343e7702007-08-24 00:56:33 +000050 const fltSemantics APFloat::Bogus = { 0, 0, 0, false };
Chris Lattnerb39cdde2007-08-20 22:49:32 +000051}
52
53/* Put a bunch of private, handy routines in an anonymous namespace. */
54namespace {
55
56 inline unsigned int
57 partCountForBits(unsigned int bits)
58 {
59 return ((bits) + integerPartWidth - 1) / integerPartWidth;
60 }
61
62 unsigned int
63 digitValue(unsigned int c)
64 {
65 unsigned int r;
66
67 r = c - '0';
68 if(r <= 9)
69 return r;
70
71 return -1U;
72 }
73
74 unsigned int
75 hexDigitValue (unsigned int c)
76 {
77 unsigned int r;
78
79 r = c - '0';
80 if(r <= 9)
81 return r;
82
83 r = c - 'A';
84 if(r <= 5)
85 return r + 10;
86
87 r = c - 'a';
88 if(r <= 5)
89 return r + 10;
90
91 return -1U;
92 }
93
94 /* This is ugly and needs cleaning up, but I don't immediately see
95 how whilst remaining safe. */
96 static int
97 totalExponent(const char *p, int exponentAdjustment)
98 {
99 integerPart unsignedExponent;
100 bool negative, overflow;
101 long exponent;
102
103 /* Move past the exponent letter and sign to the digits. */
104 p++;
105 negative = *p == '-';
106 if(*p == '-' || *p == '+')
107 p++;
108
109 unsignedExponent = 0;
110 overflow = false;
111 for(;;) {
112 unsigned int value;
113
114 value = digitValue(*p);
115 if(value == -1U)
116 break;
117
118 p++;
119 unsignedExponent = unsignedExponent * 10 + value;
120 if(unsignedExponent > 65535)
121 overflow = true;
122 }
123
124 if(exponentAdjustment > 65535 || exponentAdjustment < -65536)
125 overflow = true;
126
127 if(!overflow) {
128 exponent = unsignedExponent;
129 if(negative)
130 exponent = -exponent;
131 exponent += exponentAdjustment;
132 if(exponent > 65535 || exponent < -65536)
133 overflow = true;
134 }
135
136 if(overflow)
137 exponent = negative ? -65536: 65535;
138
139 return exponent;
140 }
141
142 const char *
143 skipLeadingZeroesAndAnyDot(const char *p, const char **dot)
144 {
145 *dot = 0;
146 while(*p == '0')
147 p++;
148
149 if(*p == '.') {
150 *dot = p++;
151 while(*p == '0')
152 p++;
153 }
154
155 return p;
156 }
157
158 /* Return the trailing fraction of a hexadecimal number.
159 DIGITVALUE is the first hex digit of the fraction, P points to
160 the next digit. */
161 lostFraction
162 trailingHexadecimalFraction(const char *p, unsigned int digitValue)
163 {
164 unsigned int hexDigit;
165
166 /* If the first trailing digit isn't 0 or 8 we can work out the
167 fraction immediately. */
168 if(digitValue > 8)
169 return lfMoreThanHalf;
170 else if(digitValue < 8 && digitValue > 0)
171 return lfLessThanHalf;
172
173 /* Otherwise we need to find the first non-zero digit. */
174 while(*p == '0')
175 p++;
176
177 hexDigit = hexDigitValue(*p);
178
179 /* If we ran off the end it is exactly zero or one-half, otherwise
180 a little more. */
181 if(hexDigit == -1U)
182 return digitValue == 0 ? lfExactlyZero: lfExactlyHalf;
183 else
184 return digitValue == 0 ? lfLessThanHalf: lfMoreThanHalf;
185 }
186
187 /* Return the fraction lost were a bignum truncated. */
188 lostFraction
189 lostFractionThroughTruncation(integerPart *parts,
190 unsigned int partCount,
191 unsigned int bits)
192 {
193 unsigned int lsb;
194
195 lsb = APInt::tcLSB(parts, partCount);
196
197 /* Note this is guaranteed true if bits == 0, or LSB == -1U. */
198 if(bits <= lsb)
199 return lfExactlyZero;
200 if(bits == lsb + 1)
201 return lfExactlyHalf;
202 if(bits <= partCount * integerPartWidth
203 && APInt::tcExtractBit(parts, bits - 1))
204 return lfMoreThanHalf;
205
206 return lfLessThanHalf;
207 }
208
209 /* Shift DST right BITS bits noting lost fraction. */
210 lostFraction
211 shiftRight(integerPart *dst, unsigned int parts, unsigned int bits)
212 {
213 lostFraction lost_fraction;
214
215 lost_fraction = lostFractionThroughTruncation(dst, parts, bits);
216
217 APInt::tcShiftRight(dst, parts, bits);
218
219 return lost_fraction;
220 }
221}
222
223/* Constructors. */
224void
225APFloat::initialize(const fltSemantics *ourSemantics)
226{
227 unsigned int count;
228
229 semantics = ourSemantics;
230 count = partCount();
231 if(count > 1)
232 significand.parts = new integerPart[count];
233}
234
235void
236APFloat::freeSignificand()
237{
238 if(partCount() > 1)
239 delete [] significand.parts;
240}
241
242void
243APFloat::assign(const APFloat &rhs)
244{
245 assert(semantics == rhs.semantics);
246
247 sign = rhs.sign;
248 category = rhs.category;
249 exponent = rhs.exponent;
Dale Johanneseneaf08942007-08-31 04:03:46 +0000250 if(category == fcNormal || category == fcNaN)
Chris Lattnerb39cdde2007-08-20 22:49:32 +0000251 copySignificand(rhs);
252}
253
254void
255APFloat::copySignificand(const APFloat &rhs)
256{
Dale Johanneseneaf08942007-08-31 04:03:46 +0000257 assert(category == fcNormal || category == fcNaN);
Chris Lattnerb39cdde2007-08-20 22:49:32 +0000258 assert(rhs.partCount() >= partCount());
259
260 APInt::tcAssign(significandParts(), rhs.significandParts(),
261 partCount());
262}
263
264APFloat &
265APFloat::operator=(const APFloat &rhs)
266{
267 if(this != &rhs) {
268 if(semantics != rhs.semantics) {
269 freeSignificand();
270 initialize(rhs.semantics);
271 }
272 assign(rhs);
273 }
274
275 return *this;
276}
277
Dale Johannesen343e7702007-08-24 00:56:33 +0000278bool
Dale Johannesen12595d72007-08-24 22:09:56 +0000279APFloat::bitwiseIsEqual(const APFloat &rhs) const {
Dale Johannesen343e7702007-08-24 00:56:33 +0000280 if (this == &rhs)
281 return true;
282 if (semantics != rhs.semantics ||
Dale Johanneseneaf08942007-08-31 04:03:46 +0000283 category != rhs.category ||
284 sign != rhs.sign)
Dale Johannesen343e7702007-08-24 00:56:33 +0000285 return false;
Dale Johanneseneaf08942007-08-31 04:03:46 +0000286 if (category==fcZero || category==fcInfinity)
Dale Johannesen343e7702007-08-24 00:56:33 +0000287 return true;
Dale Johanneseneaf08942007-08-31 04:03:46 +0000288 else if (category==fcNormal && exponent!=rhs.exponent)
289 return false;
Dale Johannesen343e7702007-08-24 00:56:33 +0000290 else {
Dale Johannesen343e7702007-08-24 00:56:33 +0000291 int i= partCount();
292 const integerPart* p=significandParts();
293 const integerPart* q=rhs.significandParts();
294 for (; i>0; i--, p++, q++) {
295 if (*p != *q)
296 return false;
297 }
298 return true;
299 }
300}
301
Chris Lattnerb39cdde2007-08-20 22:49:32 +0000302APFloat::APFloat(const fltSemantics &ourSemantics, integerPart value)
303{
304 initialize(&ourSemantics);
305 sign = 0;
306 zeroSignificand();
307 exponent = ourSemantics.precision - 1;
308 significandParts()[0] = value;
309 normalize(rmNearestTiesToEven, lfExactlyZero);
310}
311
312APFloat::APFloat(const fltSemantics &ourSemantics,
313 fltCategory ourCategory, bool negative)
314{
315 initialize(&ourSemantics);
316 category = ourCategory;
317 sign = negative;
318 if(category == fcNormal)
319 category = fcZero;
320}
321
322APFloat::APFloat(const fltSemantics &ourSemantics, const char *text)
323{
324 initialize(&ourSemantics);
325 convertFromString(text, rmNearestTiesToEven);
326}
327
328APFloat::APFloat(const APFloat &rhs)
329{
330 initialize(rhs.semantics);
331 assign(rhs);
332}
333
334APFloat::~APFloat()
335{
336 freeSignificand();
337}
338
339unsigned int
340APFloat::partCount() const
341{
342 return partCountForBits(semantics->precision + 1);
343}
344
345unsigned int
346APFloat::semanticsPrecision(const fltSemantics &semantics)
347{
348 return semantics.precision;
349}
350
351const integerPart *
352APFloat::significandParts() const
353{
354 return const_cast<APFloat *>(this)->significandParts();
355}
356
357integerPart *
358APFloat::significandParts()
359{
Dale Johanneseneaf08942007-08-31 04:03:46 +0000360 assert(category == fcNormal || category == fcNaN);
Chris Lattnerb39cdde2007-08-20 22:49:32 +0000361
362 if(partCount() > 1)
363 return significand.parts;
364 else
365 return &significand.part;
366}
367
368/* Combine the effect of two lost fractions. */
369lostFraction
370APFloat::combineLostFractions(lostFraction moreSignificant,
371 lostFraction lessSignificant)
372{
373 if(lessSignificant != lfExactlyZero) {
374 if(moreSignificant == lfExactlyZero)
375 moreSignificant = lfLessThanHalf;
376 else if(moreSignificant == lfExactlyHalf)
377 moreSignificant = lfMoreThanHalf;
378 }
379
380 return moreSignificant;
381}
382
383void
384APFloat::zeroSignificand()
385{
386 category = fcNormal;
387 APInt::tcSet(significandParts(), 0, partCount());
388}
389
390/* Increment an fcNormal floating point number's significand. */
391void
392APFloat::incrementSignificand()
393{
394 integerPart carry;
395
396 carry = APInt::tcIncrement(significandParts(), partCount());
397
398 /* Our callers should never cause us to overflow. */
399 assert(carry == 0);
400}
401
402/* Add the significand of the RHS. Returns the carry flag. */
403integerPart
404APFloat::addSignificand(const APFloat &rhs)
405{
406 integerPart *parts;
407
408 parts = significandParts();
409
410 assert(semantics == rhs.semantics);
411 assert(exponent == rhs.exponent);
412
413 return APInt::tcAdd(parts, rhs.significandParts(), 0, partCount());
414}
415
416/* Subtract the significand of the RHS with a borrow flag. Returns
417 the borrow flag. */
418integerPart
419APFloat::subtractSignificand(const APFloat &rhs, integerPart borrow)
420{
421 integerPart *parts;
422
423 parts = significandParts();
424
425 assert(semantics == rhs.semantics);
426 assert(exponent == rhs.exponent);
427
428 return APInt::tcSubtract(parts, rhs.significandParts(), borrow,
429 partCount());
430}
431
432/* Multiply the significand of the RHS. If ADDEND is non-NULL, add it
433 on to the full-precision result of the multiplication. Returns the
434 lost fraction. */
435lostFraction
436APFloat::multiplySignificand(const APFloat &rhs, const APFloat *addend)
437{
438 unsigned int omsb; // One, not zero, based MSB.
439 unsigned int partsCount, newPartsCount, precision;
440 integerPart *lhsSignificand;
441 integerPart scratch[4];
442 integerPart *fullSignificand;
443 lostFraction lost_fraction;
444
445 assert(semantics == rhs.semantics);
446
447 precision = semantics->precision;
448 newPartsCount = partCountForBits(precision * 2);
449
450 if(newPartsCount > 4)
451 fullSignificand = new integerPart[newPartsCount];
452 else
453 fullSignificand = scratch;
454
455 lhsSignificand = significandParts();
456 partsCount = partCount();
457
458 APInt::tcFullMultiply(fullSignificand, lhsSignificand,
459 rhs.significandParts(), partsCount);
460
461 lost_fraction = lfExactlyZero;
462 omsb = APInt::tcMSB(fullSignificand, newPartsCount) + 1;
463 exponent += rhs.exponent;
464
465 if(addend) {
466 Significand savedSignificand = significand;
467 const fltSemantics *savedSemantics = semantics;
468 fltSemantics extendedSemantics;
469 opStatus status;
470 unsigned int extendedPrecision;
471
472 /* Normalize our MSB. */
473 extendedPrecision = precision + precision - 1;
474 if(omsb != extendedPrecision)
475 {
476 APInt::tcShiftLeft(fullSignificand, newPartsCount,
477 extendedPrecision - omsb);
478 exponent -= extendedPrecision - omsb;
479 }
480
481 /* Create new semantics. */
482 extendedSemantics = *semantics;
483 extendedSemantics.precision = extendedPrecision;
484
485 if(newPartsCount == 1)
486 significand.part = fullSignificand[0];
487 else
488 significand.parts = fullSignificand;
489 semantics = &extendedSemantics;
490
491 APFloat extendedAddend(*addend);
492 status = extendedAddend.convert(extendedSemantics, rmTowardZero);
493 assert(status == opOK);
494 lost_fraction = addOrSubtractSignificand(extendedAddend, false);
495
496 /* Restore our state. */
497 if(newPartsCount == 1)
498 fullSignificand[0] = significand.part;
499 significand = savedSignificand;
500 semantics = savedSemantics;
501
502 omsb = APInt::tcMSB(fullSignificand, newPartsCount) + 1;
503 }
504
505 exponent -= (precision - 1);
506
507 if(omsb > precision) {
508 unsigned int bits, significantParts;
509 lostFraction lf;
510
511 bits = omsb - precision;
512 significantParts = partCountForBits(omsb);
513 lf = shiftRight(fullSignificand, significantParts, bits);
514 lost_fraction = combineLostFractions(lf, lost_fraction);
515 exponent += bits;
516 }
517
518 APInt::tcAssign(lhsSignificand, fullSignificand, partsCount);
519
520 if(newPartsCount > 4)
521 delete [] fullSignificand;
522
523 return lost_fraction;
524}
525
526/* Multiply the significands of LHS and RHS to DST. */
527lostFraction
528APFloat::divideSignificand(const APFloat &rhs)
529{
530 unsigned int bit, i, partsCount;
531 const integerPart *rhsSignificand;
532 integerPart *lhsSignificand, *dividend, *divisor;
533 integerPart scratch[4];
534 lostFraction lost_fraction;
535
536 assert(semantics == rhs.semantics);
537
538 lhsSignificand = significandParts();
539 rhsSignificand = rhs.significandParts();
540 partsCount = partCount();
541
542 if(partsCount > 2)
543 dividend = new integerPart[partsCount * 2];
544 else
545 dividend = scratch;
546
547 divisor = dividend + partsCount;
548
549 /* Copy the dividend and divisor as they will be modified in-place. */
550 for(i = 0; i < partsCount; i++) {
551 dividend[i] = lhsSignificand[i];
552 divisor[i] = rhsSignificand[i];
553 lhsSignificand[i] = 0;
554 }
555
556 exponent -= rhs.exponent;
557
558 unsigned int precision = semantics->precision;
559
560 /* Normalize the divisor. */
561 bit = precision - APInt::tcMSB(divisor, partsCount) - 1;
562 if(bit) {
563 exponent += bit;
564 APInt::tcShiftLeft(divisor, partsCount, bit);
565 }
566
567 /* Normalize the dividend. */
568 bit = precision - APInt::tcMSB(dividend, partsCount) - 1;
569 if(bit) {
570 exponent -= bit;
571 APInt::tcShiftLeft(dividend, partsCount, bit);
572 }
573
574 if(APInt::tcCompare(dividend, divisor, partsCount) < 0) {
575 exponent--;
576 APInt::tcShiftLeft(dividend, partsCount, 1);
577 assert(APInt::tcCompare(dividend, divisor, partsCount) >= 0);
578 }
579
580 /* Long division. */
581 for(bit = precision; bit; bit -= 1) {
582 if(APInt::tcCompare(dividend, divisor, partsCount) >= 0) {
583 APInt::tcSubtract(dividend, divisor, 0, partsCount);
584 APInt::tcSetBit(lhsSignificand, bit - 1);
585 }
586
587 APInt::tcShiftLeft(dividend, partsCount, 1);
588 }
589
590 /* Figure out the lost fraction. */
591 int cmp = APInt::tcCompare(dividend, divisor, partsCount);
592
593 if(cmp > 0)
594 lost_fraction = lfMoreThanHalf;
595 else if(cmp == 0)
596 lost_fraction = lfExactlyHalf;
597 else if(APInt::tcIsZero(dividend, partsCount))
598 lost_fraction = lfExactlyZero;
599 else
600 lost_fraction = lfLessThanHalf;
601
602 if(partsCount > 2)
603 delete [] dividend;
604
605 return lost_fraction;
606}
607
608unsigned int
609APFloat::significandMSB() const
610{
611 return APInt::tcMSB(significandParts(), partCount());
612}
613
614unsigned int
615APFloat::significandLSB() const
616{
617 return APInt::tcLSB(significandParts(), partCount());
618}
619
620/* Note that a zero result is NOT normalized to fcZero. */
621lostFraction
622APFloat::shiftSignificandRight(unsigned int bits)
623{
624 /* Our exponent should not overflow. */
625 assert((exponent_t) (exponent + bits) >= exponent);
626
627 exponent += bits;
628
629 return shiftRight(significandParts(), partCount(), bits);
630}
631
632/* Shift the significand left BITS bits, subtract BITS from its exponent. */
633void
634APFloat::shiftSignificandLeft(unsigned int bits)
635{
636 assert(bits < semantics->precision);
637
638 if(bits) {
639 unsigned int partsCount = partCount();
640
641 APInt::tcShiftLeft(significandParts(), partsCount, bits);
642 exponent -= bits;
643
644 assert(!APInt::tcIsZero(significandParts(), partsCount));
645 }
646}
647
648APFloat::cmpResult
649APFloat::compareAbsoluteValue(const APFloat &rhs) const
650{
651 int compare;
652
653 assert(semantics == rhs.semantics);
654 assert(category == fcNormal);
655 assert(rhs.category == fcNormal);
656
657 compare = exponent - rhs.exponent;
658
659 /* If exponents are equal, do an unsigned bignum comparison of the
660 significands. */
661 if(compare == 0)
662 compare = APInt::tcCompare(significandParts(), rhs.significandParts(),
663 partCount());
664
665 if(compare > 0)
666 return cmpGreaterThan;
667 else if(compare < 0)
668 return cmpLessThan;
669 else
670 return cmpEqual;
671}
672
673/* Handle overflow. Sign is preserved. We either become infinity or
674 the largest finite number. */
675APFloat::opStatus
676APFloat::handleOverflow(roundingMode rounding_mode)
677{
678 /* Infinity? */
679 if(rounding_mode == rmNearestTiesToEven
680 || rounding_mode == rmNearestTiesToAway
681 || (rounding_mode == rmTowardPositive && !sign)
682 || (rounding_mode == rmTowardNegative && sign))
683 {
684 category = fcInfinity;
685 return (opStatus) (opOverflow | opInexact);
686 }
687
688 /* Otherwise we become the largest finite number. */
689 category = fcNormal;
690 exponent = semantics->maxExponent;
691 APInt::tcSetLeastSignificantBits(significandParts(), partCount(),
692 semantics->precision);
693
694 return opInexact;
695}
696
697/* This routine must work for fcZero of both signs, and fcNormal
698 numbers. */
699bool
700APFloat::roundAwayFromZero(roundingMode rounding_mode,
701 lostFraction lost_fraction)
702{
Dale Johanneseneaf08942007-08-31 04:03:46 +0000703 /* NaNs and infinities should not have lost fractions. */
Chris Lattnerb39cdde2007-08-20 22:49:32 +0000704 assert(category == fcNormal || category == fcZero);
705
706 /* Our caller has already handled this case. */
707 assert(lost_fraction != lfExactlyZero);
708
709 switch(rounding_mode) {
710 default:
711 assert(0);
712
713 case rmNearestTiesToAway:
714 return lost_fraction == lfExactlyHalf || lost_fraction == lfMoreThanHalf;
715
716 case rmNearestTiesToEven:
717 if(lost_fraction == lfMoreThanHalf)
718 return true;
719
720 /* Our zeroes don't have a significand to test. */
721 if(lost_fraction == lfExactlyHalf && category != fcZero)
722 return significandParts()[0] & 1;
723
724 return false;
725
726 case rmTowardZero:
727 return false;
728
729 case rmTowardPositive:
730 return sign == false;
731
732 case rmTowardNegative:
733 return sign == true;
734 }
735}
736
737APFloat::opStatus
738APFloat::normalize(roundingMode rounding_mode,
739 lostFraction lost_fraction)
740{
741 unsigned int omsb; /* One, not zero, based MSB. */
742 int exponentChange;
743
744 if(category != fcNormal)
745 return opOK;
746
747 /* Before rounding normalize the exponent of fcNormal numbers. */
748 omsb = significandMSB() + 1;
749
750 if(omsb) {
751 /* OMSB is numbered from 1. We want to place it in the integer
752 bit numbered PRECISON if possible, with a compensating change in
753 the exponent. */
754 exponentChange = omsb - semantics->precision;
755
756 /* If the resulting exponent is too high, overflow according to
757 the rounding mode. */
758 if(exponent + exponentChange > semantics->maxExponent)
759 return handleOverflow(rounding_mode);
760
761 /* Subnormal numbers have exponent minExponent, and their MSB
762 is forced based on that. */
763 if(exponent + exponentChange < semantics->minExponent)
764 exponentChange = semantics->minExponent - exponent;
765
766 /* Shifting left is easy as we don't lose precision. */
767 if(exponentChange < 0) {
768 assert(lost_fraction == lfExactlyZero);
769
770 shiftSignificandLeft(-exponentChange);
771
772 return opOK;
773 }
774
775 if(exponentChange > 0) {
776 lostFraction lf;
777
778 /* Shift right and capture any new lost fraction. */
779 lf = shiftSignificandRight(exponentChange);
780
781 lost_fraction = combineLostFractions(lf, lost_fraction);
782
783 /* Keep OMSB up-to-date. */
784 if(omsb > (unsigned) exponentChange)
785 omsb -= (unsigned) exponentChange;
786 else
787 omsb = 0;
788 }
789 }
790
791 /* Now round the number according to rounding_mode given the lost
792 fraction. */
793
794 /* As specified in IEEE 754, since we do not trap we do not report
795 underflow for exact results. */
796 if(lost_fraction == lfExactlyZero) {
797 /* Canonicalize zeroes. */
798 if(omsb == 0)
799 category = fcZero;
800
801 return opOK;
802 }
803
804 /* Increment the significand if we're rounding away from zero. */
805 if(roundAwayFromZero(rounding_mode, lost_fraction)) {
806 if(omsb == 0)
807 exponent = semantics->minExponent;
808
809 incrementSignificand();
810 omsb = significandMSB() + 1;
811
812 /* Did the significand increment overflow? */
813 if(omsb == (unsigned) semantics->precision + 1) {
814 /* Renormalize by incrementing the exponent and shifting our
815 significand right one. However if we already have the
816 maximum exponent we overflow to infinity. */
817 if(exponent == semantics->maxExponent) {
818 category = fcInfinity;
819
820 return (opStatus) (opOverflow | opInexact);
821 }
822
823 shiftSignificandRight(1);
824
825 return opInexact;
826 }
827 }
828
829 /* The normal case - we were and are not denormal, and any
830 significand increment above didn't overflow. */
831 if(omsb == semantics->precision)
832 return opInexact;
833
834 /* We have a non-zero denormal. */
835 assert(omsb < semantics->precision);
836 assert(exponent == semantics->minExponent);
837
838 /* Canonicalize zeroes. */
839 if(omsb == 0)
840 category = fcZero;
841
842 /* The fcZero case is a denormal that underflowed to zero. */
843 return (opStatus) (opUnderflow | opInexact);
844}
845
846APFloat::opStatus
847APFloat::addOrSubtractSpecials(const APFloat &rhs, bool subtract)
848{
849 switch(convolve(category, rhs.category)) {
850 default:
851 assert(0);
852
Dale Johanneseneaf08942007-08-31 04:03:46 +0000853 case convolve(fcNaN, fcZero):
854 case convolve(fcNaN, fcNormal):
855 case convolve(fcNaN, fcInfinity):
856 case convolve(fcNaN, fcNaN):
Chris Lattnerb39cdde2007-08-20 22:49:32 +0000857 case convolve(fcNormal, fcZero):
858 case convolve(fcInfinity, fcNormal):
859 case convolve(fcInfinity, fcZero):
860 return opOK;
861
Dale Johanneseneaf08942007-08-31 04:03:46 +0000862 case convolve(fcZero, fcNaN):
863 case convolve(fcNormal, fcNaN):
864 case convolve(fcInfinity, fcNaN):
865 category = fcNaN;
866 copySignificand(rhs);
Chris Lattnerb39cdde2007-08-20 22:49:32 +0000867 return opOK;
868
869 case convolve(fcNormal, fcInfinity):
870 case convolve(fcZero, fcInfinity):
871 category = fcInfinity;
872 sign = rhs.sign ^ subtract;
873 return opOK;
874
875 case convolve(fcZero, fcNormal):
876 assign(rhs);
877 sign = rhs.sign ^ subtract;
878 return opOK;
879
880 case convolve(fcZero, fcZero):
881 /* Sign depends on rounding mode; handled by caller. */
882 return opOK;
883
884 case convolve(fcInfinity, fcInfinity):
885 /* Differently signed infinities can only be validly
886 subtracted. */
887 if(sign ^ rhs.sign != subtract) {
Dale Johanneseneaf08942007-08-31 04:03:46 +0000888 category = fcNaN;
889 // Arbitrary but deterministic value for significand
890 APInt::tcSet(significandParts(), ~0U, partCount());
Chris Lattnerb39cdde2007-08-20 22:49:32 +0000891 return opInvalidOp;
892 }
893
894 return opOK;
895
896 case convolve(fcNormal, fcNormal):
897 return opDivByZero;
898 }
899}
900
901/* Add or subtract two normal numbers. */
902lostFraction
903APFloat::addOrSubtractSignificand(const APFloat &rhs, bool subtract)
904{
905 integerPart carry;
906 lostFraction lost_fraction;
907 int bits;
908
909 /* Determine if the operation on the absolute values is effectively
910 an addition or subtraction. */
911 subtract ^= (sign ^ rhs.sign);
912
913 /* Are we bigger exponent-wise than the RHS? */
914 bits = exponent - rhs.exponent;
915
916 /* Subtraction is more subtle than one might naively expect. */
917 if(subtract) {
918 APFloat temp_rhs(rhs);
919 bool reverse;
920
Chris Lattnerada530b2007-08-24 03:02:34 +0000921 if (bits == 0) {
Chris Lattnerb39cdde2007-08-20 22:49:32 +0000922 reverse = compareAbsoluteValue(temp_rhs) == cmpLessThan;
923 lost_fraction = lfExactlyZero;
Chris Lattnerada530b2007-08-24 03:02:34 +0000924 } else if (bits > 0) {
Chris Lattnerb39cdde2007-08-20 22:49:32 +0000925 lost_fraction = temp_rhs.shiftSignificandRight(bits - 1);
926 shiftSignificandLeft(1);
927 reverse = false;
Chris Lattnerada530b2007-08-24 03:02:34 +0000928 } else {
Chris Lattnerb39cdde2007-08-20 22:49:32 +0000929 lost_fraction = shiftSignificandRight(-bits - 1);
930 temp_rhs.shiftSignificandLeft(1);
931 reverse = true;
932 }
933
Chris Lattnerada530b2007-08-24 03:02:34 +0000934 if (reverse) {
Chris Lattnerb39cdde2007-08-20 22:49:32 +0000935 carry = temp_rhs.subtractSignificand
936 (*this, lost_fraction != lfExactlyZero);
937 copySignificand(temp_rhs);
938 sign = !sign;
939 } else {
940 carry = subtractSignificand
941 (temp_rhs, lost_fraction != lfExactlyZero);
942 }
943
944 /* Invert the lost fraction - it was on the RHS and
945 subtracted. */
946 if(lost_fraction == lfLessThanHalf)
947 lost_fraction = lfMoreThanHalf;
948 else if(lost_fraction == lfMoreThanHalf)
949 lost_fraction = lfLessThanHalf;
950
951 /* The code above is intended to ensure that no borrow is
952 necessary. */
953 assert(!carry);
954 } else {
955 if(bits > 0) {
956 APFloat temp_rhs(rhs);
957
958 lost_fraction = temp_rhs.shiftSignificandRight(bits);
959 carry = addSignificand(temp_rhs);
960 } else {
961 lost_fraction = shiftSignificandRight(-bits);
962 carry = addSignificand(rhs);
963 }
964
965 /* We have a guard bit; generating a carry cannot happen. */
966 assert(!carry);
967 }
968
969 return lost_fraction;
970}
971
972APFloat::opStatus
973APFloat::multiplySpecials(const APFloat &rhs)
974{
975 switch(convolve(category, rhs.category)) {
976 default:
977 assert(0);
978
Dale Johanneseneaf08942007-08-31 04:03:46 +0000979 case convolve(fcNaN, fcZero):
980 case convolve(fcNaN, fcNormal):
981 case convolve(fcNaN, fcInfinity):
982 case convolve(fcNaN, fcNaN):
983 return opOK;
984
985 case convolve(fcZero, fcNaN):
986 case convolve(fcNormal, fcNaN):
987 case convolve(fcInfinity, fcNaN):
988 category = fcNaN;
989 copySignificand(rhs);
Chris Lattnerb39cdde2007-08-20 22:49:32 +0000990 return opOK;
991
992 case convolve(fcNormal, fcInfinity):
993 case convolve(fcInfinity, fcNormal):
994 case convolve(fcInfinity, fcInfinity):
995 category = fcInfinity;
996 return opOK;
997
998 case convolve(fcZero, fcNormal):
999 case convolve(fcNormal, fcZero):
1000 case convolve(fcZero, fcZero):
1001 category = fcZero;
1002 return opOK;
1003
1004 case convolve(fcZero, fcInfinity):
1005 case convolve(fcInfinity, fcZero):
Dale Johanneseneaf08942007-08-31 04:03:46 +00001006 category = fcNaN;
1007 // Arbitrary but deterministic value for significand
1008 APInt::tcSet(significandParts(), ~0U, partCount());
Chris Lattnerb39cdde2007-08-20 22:49:32 +00001009 return opInvalidOp;
1010
1011 case convolve(fcNormal, fcNormal):
1012 return opOK;
1013 }
1014}
1015
1016APFloat::opStatus
1017APFloat::divideSpecials(const APFloat &rhs)
1018{
1019 switch(convolve(category, rhs.category)) {
1020 default:
1021 assert(0);
1022
Dale Johanneseneaf08942007-08-31 04:03:46 +00001023 case convolve(fcNaN, fcZero):
1024 case convolve(fcNaN, fcNormal):
1025 case convolve(fcNaN, fcInfinity):
1026 case convolve(fcNaN, fcNaN):
Chris Lattnerb39cdde2007-08-20 22:49:32 +00001027 case convolve(fcInfinity, fcZero):
1028 case convolve(fcInfinity, fcNormal):
1029 case convolve(fcZero, fcInfinity):
1030 case convolve(fcZero, fcNormal):
1031 return opOK;
1032
Dale Johanneseneaf08942007-08-31 04:03:46 +00001033 case convolve(fcZero, fcNaN):
1034 case convolve(fcNormal, fcNaN):
1035 case convolve(fcInfinity, fcNaN):
1036 category = fcNaN;
1037 copySignificand(rhs);
Chris Lattnerb39cdde2007-08-20 22:49:32 +00001038 return opOK;
1039
1040 case convolve(fcNormal, fcInfinity):
1041 category = fcZero;
1042 return opOK;
1043
1044 case convolve(fcNormal, fcZero):
1045 category = fcInfinity;
1046 return opDivByZero;
1047
1048 case convolve(fcInfinity, fcInfinity):
1049 case convolve(fcZero, fcZero):
Dale Johanneseneaf08942007-08-31 04:03:46 +00001050 category = fcNaN;
1051 // Arbitrary but deterministic value for significand
1052 APInt::tcSet(significandParts(), ~0U, partCount());
Chris Lattnerb39cdde2007-08-20 22:49:32 +00001053 return opInvalidOp;
1054
1055 case convolve(fcNormal, fcNormal):
1056 return opOK;
1057 }
1058}
1059
1060/* Change sign. */
1061void
1062APFloat::changeSign()
1063{
1064 /* Look mummy, this one's easy. */
1065 sign = !sign;
1066}
1067
1068/* Normalized addition or subtraction. */
1069APFloat::opStatus
1070APFloat::addOrSubtract(const APFloat &rhs, roundingMode rounding_mode,
1071 bool subtract)
1072{
1073 opStatus fs;
1074
1075 fs = addOrSubtractSpecials(rhs, subtract);
1076
1077 /* This return code means it was not a simple case. */
1078 if(fs == opDivByZero) {
1079 lostFraction lost_fraction;
1080
1081 lost_fraction = addOrSubtractSignificand(rhs, subtract);
1082 fs = normalize(rounding_mode, lost_fraction);
1083
1084 /* Can only be zero if we lost no fraction. */
1085 assert(category != fcZero || lost_fraction == lfExactlyZero);
1086 }
1087
1088 /* If two numbers add (exactly) to zero, IEEE 754 decrees it is a
1089 positive zero unless rounding to minus infinity, except that
1090 adding two like-signed zeroes gives that zero. */
1091 if(category == fcZero) {
1092 if(rhs.category != fcZero || (sign == rhs.sign) == subtract)
1093 sign = (rounding_mode == rmTowardNegative);
1094 }
1095
1096 return fs;
1097}
1098
1099/* Normalized addition. */
1100APFloat::opStatus
1101APFloat::add(const APFloat &rhs, roundingMode rounding_mode)
1102{
1103 return addOrSubtract(rhs, rounding_mode, false);
1104}
1105
1106/* Normalized subtraction. */
1107APFloat::opStatus
1108APFloat::subtract(const APFloat &rhs, roundingMode rounding_mode)
1109{
1110 return addOrSubtract(rhs, rounding_mode, true);
1111}
1112
1113/* Normalized multiply. */
1114APFloat::opStatus
1115APFloat::multiply(const APFloat &rhs, roundingMode rounding_mode)
1116{
1117 opStatus fs;
1118
1119 sign ^= rhs.sign;
1120 fs = multiplySpecials(rhs);
1121
1122 if(category == fcNormal) {
1123 lostFraction lost_fraction = multiplySignificand(rhs, 0);
1124 fs = normalize(rounding_mode, lost_fraction);
1125 if(lost_fraction != lfExactlyZero)
1126 fs = (opStatus) (fs | opInexact);
1127 }
1128
1129 return fs;
1130}
1131
1132/* Normalized divide. */
1133APFloat::opStatus
1134APFloat::divide(const APFloat &rhs, roundingMode rounding_mode)
1135{
1136 opStatus fs;
1137
1138 sign ^= rhs.sign;
1139 fs = divideSpecials(rhs);
1140
1141 if(category == fcNormal) {
1142 lostFraction lost_fraction = divideSignificand(rhs);
1143 fs = normalize(rounding_mode, lost_fraction);
1144 if(lost_fraction != lfExactlyZero)
1145 fs = (opStatus) (fs | opInexact);
1146 }
1147
1148 return fs;
1149}
1150
1151/* Normalized fused-multiply-add. */
1152APFloat::opStatus
1153APFloat::fusedMultiplyAdd(const APFloat &multiplicand,
1154 const APFloat &addend,
1155 roundingMode rounding_mode)
1156{
1157 opStatus fs;
1158
1159 /* Post-multiplication sign, before addition. */
1160 sign ^= multiplicand.sign;
1161
1162 /* If and only if all arguments are normal do we need to do an
1163 extended-precision calculation. */
1164 if(category == fcNormal
1165 && multiplicand.category == fcNormal
1166 && addend.category == fcNormal) {
1167 lostFraction lost_fraction;
1168
1169 lost_fraction = multiplySignificand(multiplicand, &addend);
1170 fs = normalize(rounding_mode, lost_fraction);
1171 if(lost_fraction != lfExactlyZero)
1172 fs = (opStatus) (fs | opInexact);
1173
1174 /* If two numbers add (exactly) to zero, IEEE 754 decrees it is a
1175 positive zero unless rounding to minus infinity, except that
1176 adding two like-signed zeroes gives that zero. */
1177 if(category == fcZero && sign != addend.sign)
1178 sign = (rounding_mode == rmTowardNegative);
1179 } else {
1180 fs = multiplySpecials(multiplicand);
1181
1182 /* FS can only be opOK or opInvalidOp. There is no more work
1183 to do in the latter case. The IEEE-754R standard says it is
1184 implementation-defined in this case whether, if ADDEND is a
Dale Johanneseneaf08942007-08-31 04:03:46 +00001185 quiet NaN, we raise invalid op; this implementation does so.
Chris Lattnerb39cdde2007-08-20 22:49:32 +00001186
1187 If we need to do the addition we can do so with normal
1188 precision. */
1189 if(fs == opOK)
1190 fs = addOrSubtract(addend, rounding_mode, false);
1191 }
1192
1193 return fs;
1194}
1195
1196/* Comparison requires normalized numbers. */
1197APFloat::cmpResult
1198APFloat::compare(const APFloat &rhs) const
1199{
1200 cmpResult result;
1201
1202 assert(semantics == rhs.semantics);
1203
1204 switch(convolve(category, rhs.category)) {
1205 default:
1206 assert(0);
1207
Dale Johanneseneaf08942007-08-31 04:03:46 +00001208 case convolve(fcNaN, fcZero):
1209 case convolve(fcNaN, fcNormal):
1210 case convolve(fcNaN, fcInfinity):
1211 case convolve(fcNaN, fcNaN):
1212 case convolve(fcZero, fcNaN):
1213 case convolve(fcNormal, fcNaN):
1214 case convolve(fcInfinity, fcNaN):
Chris Lattnerb39cdde2007-08-20 22:49:32 +00001215 return cmpUnordered;
1216
1217 case convolve(fcInfinity, fcNormal):
1218 case convolve(fcInfinity, fcZero):
1219 case convolve(fcNormal, fcZero):
1220 if(sign)
1221 return cmpLessThan;
1222 else
1223 return cmpGreaterThan;
1224
1225 case convolve(fcNormal, fcInfinity):
1226 case convolve(fcZero, fcInfinity):
1227 case convolve(fcZero, fcNormal):
1228 if(rhs.sign)
1229 return cmpGreaterThan;
1230 else
1231 return cmpLessThan;
1232
1233 case convolve(fcInfinity, fcInfinity):
1234 if(sign == rhs.sign)
1235 return cmpEqual;
1236 else if(sign)
1237 return cmpLessThan;
1238 else
1239 return cmpGreaterThan;
1240
1241 case convolve(fcZero, fcZero):
1242 return cmpEqual;
1243
1244 case convolve(fcNormal, fcNormal):
1245 break;
1246 }
1247
1248 /* Two normal numbers. Do they have the same sign? */
1249 if(sign != rhs.sign) {
1250 if(sign)
1251 result = cmpLessThan;
1252 else
1253 result = cmpGreaterThan;
1254 } else {
1255 /* Compare absolute values; invert result if negative. */
1256 result = compareAbsoluteValue(rhs);
1257
1258 if(sign) {
1259 if(result == cmpLessThan)
1260 result = cmpGreaterThan;
1261 else if(result == cmpGreaterThan)
1262 result = cmpLessThan;
1263 }
1264 }
1265
1266 return result;
1267}
1268
1269APFloat::opStatus
1270APFloat::convert(const fltSemantics &toSemantics,
1271 roundingMode rounding_mode)
1272{
1273 unsigned int newPartCount;
1274 opStatus fs;
1275
1276 newPartCount = partCountForBits(toSemantics.precision + 1);
1277
1278 /* If our new form is wider, re-allocate our bit pattern into wider
1279 storage. */
1280 if(newPartCount > partCount()) {
1281 integerPart *newParts;
1282
1283 newParts = new integerPart[newPartCount];
1284 APInt::tcSet(newParts, 0, newPartCount);
1285 APInt::tcAssign(newParts, significandParts(), partCount());
1286 freeSignificand();
1287 significand.parts = newParts;
1288 }
1289
1290 if(category == fcNormal) {
1291 /* Re-interpret our bit-pattern. */
1292 exponent += toSemantics.precision - semantics->precision;
1293 semantics = &toSemantics;
1294 fs = normalize(rounding_mode, lfExactlyZero);
1295 } else {
1296 semantics = &toSemantics;
1297 fs = opOK;
1298 }
1299
1300 return fs;
1301}
1302
1303/* Convert a floating point number to an integer according to the
1304 rounding mode. If the rounded integer value is out of range this
1305 returns an invalid operation exception. If the rounded value is in
1306 range but the floating point number is not the exact integer, the C
1307 standard doesn't require an inexact exception to be raised. IEEE
1308 854 does require it so we do that.
1309
1310 Note that for conversions to integer type the C standard requires
1311 round-to-zero to always be used. */
1312APFloat::opStatus
1313APFloat::convertToInteger(integerPart *parts, unsigned int width,
1314 bool isSigned,
1315 roundingMode rounding_mode) const
1316{
1317 lostFraction lost_fraction;
1318 unsigned int msb, partsCount;
1319 int bits;
1320
1321 /* Handle the three special cases first. */
Dale Johanneseneaf08942007-08-31 04:03:46 +00001322 if(category == fcInfinity || category == fcNaN)
Chris Lattnerb39cdde2007-08-20 22:49:32 +00001323 return opInvalidOp;
1324
1325 partsCount = partCountForBits(width);
1326
1327 if(category == fcZero) {
1328 APInt::tcSet(parts, 0, partsCount);
1329 return opOK;
1330 }
1331
1332 /* Shift the bit pattern so the fraction is lost. */
1333 APFloat tmp(*this);
1334
1335 bits = (int) semantics->precision - 1 - exponent;
1336
1337 if(bits > 0) {
1338 lost_fraction = tmp.shiftSignificandRight(bits);
1339 } else {
1340 tmp.shiftSignificandLeft(-bits);
1341 lost_fraction = lfExactlyZero;
1342 }
1343
1344 if(lost_fraction != lfExactlyZero
1345 && tmp.roundAwayFromZero(rounding_mode, lost_fraction))
1346 tmp.incrementSignificand();
1347
1348 msb = tmp.significandMSB();
1349
1350 /* Negative numbers cannot be represented as unsigned. */
1351 if(!isSigned && tmp.sign && msb != -1U)
1352 return opInvalidOp;
1353
1354 /* It takes exponent + 1 bits to represent the truncated floating
1355 point number without its sign. We lose a bit for the sign, but
1356 the maximally negative integer is a special case. */
1357 if(msb + 1 > width) /* !! Not same as msb >= width !! */
1358 return opInvalidOp;
1359
1360 if(isSigned && msb + 1 == width
1361 && (!tmp.sign || tmp.significandLSB() != msb))
1362 return opInvalidOp;
1363
1364 APInt::tcAssign(parts, tmp.significandParts(), partsCount);
1365
1366 if(tmp.sign)
1367 APInt::tcNegate(parts, partsCount);
1368
1369 if(lost_fraction == lfExactlyZero)
1370 return opOK;
1371 else
1372 return opInexact;
1373}
1374
1375APFloat::opStatus
1376APFloat::convertFromUnsignedInteger(integerPart *parts,
1377 unsigned int partCount,
1378 roundingMode rounding_mode)
1379{
1380 unsigned int msb, precision;
1381 lostFraction lost_fraction;
1382
1383 msb = APInt::tcMSB(parts, partCount) + 1;
1384 precision = semantics->precision;
1385
1386 category = fcNormal;
1387 exponent = precision - 1;
1388
1389 if(msb > precision) {
1390 exponent += (msb - precision);
1391 lost_fraction = shiftRight(parts, partCount, msb - precision);
1392 msb = precision;
1393 } else
1394 lost_fraction = lfExactlyZero;
1395
1396 /* Copy the bit image. */
1397 zeroSignificand();
1398 APInt::tcAssign(significandParts(), parts, partCountForBits(msb));
1399
1400 return normalize(rounding_mode, lost_fraction);
1401}
1402
1403APFloat::opStatus
1404APFloat::convertFromInteger(const integerPart *parts,
1405 unsigned int partCount, bool isSigned,
1406 roundingMode rounding_mode)
1407{
1408 unsigned int width;
1409 opStatus status;
1410 integerPart *copy;
1411
1412 copy = new integerPart[partCount];
1413 APInt::tcAssign(copy, parts, partCount);
1414
1415 width = partCount * integerPartWidth;
1416
1417 sign = false;
1418 if(isSigned && APInt::tcExtractBit(parts, width - 1)) {
1419 sign = true;
1420 APInt::tcNegate(copy, partCount);
1421 }
1422
1423 status = convertFromUnsignedInteger(copy, partCount, rounding_mode);
1424 delete [] copy;
1425
1426 return status;
1427}
1428
1429APFloat::opStatus
1430APFloat::convertFromHexadecimalString(const char *p,
1431 roundingMode rounding_mode)
1432{
1433 lostFraction lost_fraction;
1434 integerPart *significand;
1435 unsigned int bitPos, partsCount;
1436 const char *dot, *firstSignificantDigit;
1437
1438 zeroSignificand();
1439 exponent = 0;
1440 category = fcNormal;
1441
1442 significand = significandParts();
1443 partsCount = partCount();
1444 bitPos = partsCount * integerPartWidth;
1445
1446 /* Skip leading zeroes and any(hexa)decimal point. */
1447 p = skipLeadingZeroesAndAnyDot(p, &dot);
1448 firstSignificantDigit = p;
1449
1450 for(;;) {
1451 integerPart hex_value;
1452
1453 if(*p == '.') {
1454 assert(dot == 0);
1455 dot = p++;
1456 }
1457
1458 hex_value = hexDigitValue(*p);
1459 if(hex_value == -1U) {
1460 lost_fraction = lfExactlyZero;
1461 break;
1462 }
1463
1464 p++;
1465
1466 /* Store the number whilst 4-bit nibbles remain. */
1467 if(bitPos) {
1468 bitPos -= 4;
1469 hex_value <<= bitPos % integerPartWidth;
1470 significand[bitPos / integerPartWidth] |= hex_value;
1471 } else {
1472 lost_fraction = trailingHexadecimalFraction(p, hex_value);
1473 while(hexDigitValue(*p) != -1U)
1474 p++;
1475 break;
1476 }
1477 }
1478
1479 /* Hex floats require an exponent but not a hexadecimal point. */
1480 assert(*p == 'p' || *p == 'P');
1481
1482 /* Ignore the exponent if we are zero. */
1483 if(p != firstSignificantDigit) {
1484 int expAdjustment;
1485
1486 /* Implicit hexadecimal point? */
1487 if(!dot)
1488 dot = p;
1489
1490 /* Calculate the exponent adjustment implicit in the number of
1491 significant digits. */
1492 expAdjustment = dot - firstSignificantDigit;
1493 if(expAdjustment < 0)
1494 expAdjustment++;
1495 expAdjustment = expAdjustment * 4 - 1;
1496
1497 /* Adjust for writing the significand starting at the most
1498 significant nibble. */
1499 expAdjustment += semantics->precision;
1500 expAdjustment -= partsCount * integerPartWidth;
1501
1502 /* Adjust for the given exponent. */
1503 exponent = totalExponent(p, expAdjustment);
1504 }
1505
1506 return normalize(rounding_mode, lost_fraction);
1507}
1508
1509APFloat::opStatus
Chris Lattnerada530b2007-08-24 03:02:34 +00001510APFloat::convertFromString(const char *p, roundingMode rounding_mode) {
Chris Lattnerb39cdde2007-08-20 22:49:32 +00001511 /* Handle a leading minus sign. */
1512 if(*p == '-')
1513 sign = 1, p++;
1514 else
1515 sign = 0;
1516
1517 if(p[0] == '0' && (p[1] == 'x' || p[1] == 'X'))
1518 return convertFromHexadecimalString(p + 2, rounding_mode);
Chris Lattnerada530b2007-08-24 03:02:34 +00001519
1520 assert(0 && "Decimal to binary conversions not yet implemented");
1521 abort();
Chris Lattnerb39cdde2007-08-20 22:49:32 +00001522}
Dale Johannesen343e7702007-08-24 00:56:33 +00001523
1524// For good performance it is desirable for different APFloats
1525// to produce different integers.
1526uint32_t
1527APFloat::getHashValue() const {
1528 if (category==fcZero) return sign<<8 | semantics->precision ;
1529 else if (category==fcInfinity) return sign<<9 | semantics->precision;
Dale Johanneseneaf08942007-08-31 04:03:46 +00001530 else if (category==fcNaN) return 1<<10 | semantics->precision;
Dale Johannesen343e7702007-08-24 00:56:33 +00001531 else {
1532 uint32_t hash = sign<<11 | semantics->precision | exponent<<12;
1533 const integerPart* p = significandParts();
1534 for (int i=partCount(); i>0; i--, p++)
1535 hash ^= ((uint32_t)*p) ^ (*p)>>32;
1536 return hash;
1537 }
1538}
1539
1540// Conversion from APFloat to/from host float/double. It may eventually be
1541// possible to eliminate these and have everybody deal with APFloats, but that
1542// will take a while. This approach will not easily extend to long double.
1543// Current implementation requires partCount()==1, which is correct at the
1544// moment but could be made more general.
1545
1546double
1547APFloat::convertToDouble() const {
Dale Johannesen343e7702007-08-24 00:56:33 +00001548 assert(semantics == (const llvm::fltSemantics* const)&IEEEdouble);
1549 assert (partCount()==1);
1550
Dale Johanneseneaf08942007-08-31 04:03:46 +00001551 uint64_t myexponent, mysignificand;
Dale Johannesen343e7702007-08-24 00:56:33 +00001552
1553 if (category==fcNormal) {
Dale Johannesen343e7702007-08-24 00:56:33 +00001554 mysignificand = *significandParts();
1555 myexponent = exponent+1023; //bias
1556 } else if (category==fcZero) {
Dale Johannesen343e7702007-08-24 00:56:33 +00001557 myexponent = 0;
1558 mysignificand = 0;
1559 } else if (category==fcInfinity) {
Dale Johannesen343e7702007-08-24 00:56:33 +00001560 myexponent = 0x7ff;
1561 mysignificand = 0;
Dale Johanneseneaf08942007-08-31 04:03:46 +00001562 } else if (category==fcNaN) {
Dale Johannesen343e7702007-08-24 00:56:33 +00001563 myexponent = 0x7ff;
Dale Johanneseneaf08942007-08-31 04:03:46 +00001564 mysignificand = *significandParts();
Dale Johannesen343e7702007-08-24 00:56:33 +00001565 } else
1566 assert(0);
1567
Dale Johanneseneaf08942007-08-31 04:03:46 +00001568 return BitsToDouble((((uint64_t)sign & 1) << 63) |
1569 ((myexponent & 0x7ff) << 52) |
Dale Johannesend3b51fd2007-08-24 05:08:11 +00001570 (mysignificand & 0xfffffffffffffLL));
Dale Johannesen343e7702007-08-24 00:56:33 +00001571}
1572
1573float
1574APFloat::convertToFloat() const {
Dale Johannesen343e7702007-08-24 00:56:33 +00001575 assert(semantics == (const llvm::fltSemantics* const)&IEEEsingle);
1576 assert (partCount()==1);
1577
Dale Johanneseneaf08942007-08-31 04:03:46 +00001578 uint32_t myexponent, mysignificand;
Dale Johannesen343e7702007-08-24 00:56:33 +00001579
1580 if (category==fcNormal) {
Dale Johannesen343e7702007-08-24 00:56:33 +00001581 myexponent = exponent+127; //bias
1582 mysignificand = *significandParts();
1583 } else if (category==fcZero) {
Dale Johannesen343e7702007-08-24 00:56:33 +00001584 myexponent = 0;
1585 mysignificand = 0;
1586 } else if (category==fcInfinity) {
Dale Johannesen343e7702007-08-24 00:56:33 +00001587 myexponent = 0xff;
1588 mysignificand = 0;
Dale Johanneseneaf08942007-08-31 04:03:46 +00001589 } else if (category==fcNaN) {
Dale Johannesen343e7702007-08-24 00:56:33 +00001590 myexponent = 0x7ff;
Dale Johanneseneaf08942007-08-31 04:03:46 +00001591 mysignificand = *significandParts();
Dale Johannesen343e7702007-08-24 00:56:33 +00001592 } else
1593 assert(0);
1594
Dale Johanneseneaf08942007-08-31 04:03:46 +00001595 return BitsToFloat(((sign&1) << 31) | ((myexponent&0xff) << 23) |
Dale Johannesend3b51fd2007-08-24 05:08:11 +00001596 (mysignificand & 0x7fffff));
Dale Johannesen343e7702007-08-24 00:56:33 +00001597}
1598
1599APFloat::APFloat(double d) {
Dale Johannesend3b51fd2007-08-24 05:08:11 +00001600 uint64_t i = DoubleToBits(d);
Dale Johannesend3b51fd2007-08-24 05:08:11 +00001601 uint64_t myexponent = (i >> 52) & 0x7ff;
1602 uint64_t mysignificand = i & 0xfffffffffffffLL;
1603
Dale Johannesen343e7702007-08-24 00:56:33 +00001604 initialize(&APFloat::IEEEdouble);
Dale Johannesen343e7702007-08-24 00:56:33 +00001605 assert(partCount()==1);
1606
Dale Johanneseneaf08942007-08-31 04:03:46 +00001607 sign = i>>63;
Dale Johannesen343e7702007-08-24 00:56:33 +00001608 if (myexponent==0 && mysignificand==0) {
1609 // exponent, significand meaningless
1610 category = fcZero;
Dale Johannesen343e7702007-08-24 00:56:33 +00001611 } else if (myexponent==0x7ff && mysignificand==0) {
1612 // exponent, significand meaningless
1613 category = fcInfinity;
Dale Johanneseneaf08942007-08-31 04:03:46 +00001614 } else if (myexponent==0x7ff && mysignificand!=0) {
1615 // exponent meaningless
1616 category = fcNaN;
1617 *significandParts() = mysignificand;
Dale Johannesen343e7702007-08-24 00:56:33 +00001618 } else {
Dale Johannesen343e7702007-08-24 00:56:33 +00001619 category = fcNormal;
1620 exponent = myexponent - 1023;
Dale Johanneseneaf08942007-08-31 04:03:46 +00001621 *significandParts() = mysignificand | 0x10000000000000LL;
1622 }
Dale Johannesen343e7702007-08-24 00:56:33 +00001623}
1624
1625APFloat::APFloat(float f) {
Dale Johannesend3b51fd2007-08-24 05:08:11 +00001626 uint32_t i = FloatToBits(f);
Dale Johannesend3b51fd2007-08-24 05:08:11 +00001627 uint32_t myexponent = (i >> 23) & 0xff;
1628 uint32_t mysignificand = i & 0x7fffff;
1629
Dale Johannesen343e7702007-08-24 00:56:33 +00001630 initialize(&APFloat::IEEEsingle);
Dale Johannesen343e7702007-08-24 00:56:33 +00001631 assert(partCount()==1);
1632
Dale Johanneseneaf08942007-08-31 04:03:46 +00001633 sign = i >> 31;
Dale Johannesen343e7702007-08-24 00:56:33 +00001634 if (myexponent==0 && mysignificand==0) {
1635 // exponent, significand meaningless
1636 category = fcZero;
Dale Johannesen343e7702007-08-24 00:56:33 +00001637 } else if (myexponent==0xff && mysignificand==0) {
1638 // exponent, significand meaningless
1639 category = fcInfinity;
Dale Johannesen343e7702007-08-24 00:56:33 +00001640 } else if (myexponent==0xff && (mysignificand & 0x400000)) {
1641 // sign, exponent, significand meaningless
Dale Johanneseneaf08942007-08-31 04:03:46 +00001642 category = fcNaN;
1643 *significandParts() = mysignificand;
Dale Johannesen343e7702007-08-24 00:56:33 +00001644 } else {
1645 category = fcNormal;
Dale Johannesen343e7702007-08-24 00:56:33 +00001646 exponent = myexponent - 127; //bias
1647 *significandParts() = mysignificand | 0x800000; // integer bit
1648 }
1649}