1a9769988556ce9ea87a866666053b155984e9f2cJoerg Sonnenberger//===----- lib/fp_add_impl.inc - floaing point addition -----------*- C -*-===// 2a9769988556ce9ea87a866666053b155984e9f2cJoerg Sonnenberger// 3a9769988556ce9ea87a866666053b155984e9f2cJoerg Sonnenberger// The LLVM Compiler Infrastructure 4a9769988556ce9ea87a866666053b155984e9f2cJoerg Sonnenberger// 5a9769988556ce9ea87a866666053b155984e9f2cJoerg Sonnenberger// This file is dual licensed under the MIT and the University of Illinois Open 6a9769988556ce9ea87a866666053b155984e9f2cJoerg Sonnenberger// Source Licenses. See LICENSE.TXT for details. 7a9769988556ce9ea87a866666053b155984e9f2cJoerg Sonnenberger// 8a9769988556ce9ea87a866666053b155984e9f2cJoerg Sonnenberger//===----------------------------------------------------------------------===// 9a9769988556ce9ea87a866666053b155984e9f2cJoerg Sonnenberger// 10a9769988556ce9ea87a866666053b155984e9f2cJoerg Sonnenberger// This file implements soft-float addition with the IEEE-754 default rounding 11a9769988556ce9ea87a866666053b155984e9f2cJoerg Sonnenberger// (to nearest, ties to even). 12a9769988556ce9ea87a866666053b155984e9f2cJoerg Sonnenberger// 13a9769988556ce9ea87a866666053b155984e9f2cJoerg Sonnenberger//===----------------------------------------------------------------------===// 14a9769988556ce9ea87a866666053b155984e9f2cJoerg Sonnenberger 15a9769988556ce9ea87a866666053b155984e9f2cJoerg Sonnenberger#include "fp_lib.h" 16a9769988556ce9ea87a866666053b155984e9f2cJoerg Sonnenberger 17a9769988556ce9ea87a866666053b155984e9f2cJoerg Sonnenbergerstatic inline fp_t __addXf3__(fp_t a, fp_t b) { 18a9769988556ce9ea87a866666053b155984e9f2cJoerg Sonnenberger rep_t aRep = toRep(a); 19a9769988556ce9ea87a866666053b155984e9f2cJoerg Sonnenberger rep_t bRep = toRep(b); 20a9769988556ce9ea87a866666053b155984e9f2cJoerg Sonnenberger const rep_t aAbs = aRep & absMask; 21a9769988556ce9ea87a866666053b155984e9f2cJoerg Sonnenberger const rep_t bAbs = bRep & absMask; 22a9769988556ce9ea87a866666053b155984e9f2cJoerg Sonnenberger 23a9769988556ce9ea87a866666053b155984e9f2cJoerg Sonnenberger // Detect if a or b is zero, infinity, or NaN. 24a9769988556ce9ea87a866666053b155984e9f2cJoerg Sonnenberger if (aAbs - REP_C(1) >= infRep - REP_C(1) || 25a9769988556ce9ea87a866666053b155984e9f2cJoerg Sonnenberger bAbs - REP_C(1) >= infRep - REP_C(1)) { 26a9769988556ce9ea87a866666053b155984e9f2cJoerg Sonnenberger // NaN + anything = qNaN 27a9769988556ce9ea87a866666053b155984e9f2cJoerg Sonnenberger if (aAbs > infRep) return fromRep(toRep(a) | quietBit); 28a9769988556ce9ea87a866666053b155984e9f2cJoerg Sonnenberger // anything + NaN = qNaN 29a9769988556ce9ea87a866666053b155984e9f2cJoerg Sonnenberger if (bAbs > infRep) return fromRep(toRep(b) | quietBit); 30a9769988556ce9ea87a866666053b155984e9f2cJoerg Sonnenberger 31a9769988556ce9ea87a866666053b155984e9f2cJoerg Sonnenberger if (aAbs == infRep) { 32a9769988556ce9ea87a866666053b155984e9f2cJoerg Sonnenberger // +/-infinity + -/+infinity = qNaN 33a9769988556ce9ea87a866666053b155984e9f2cJoerg Sonnenberger if ((toRep(a) ^ toRep(b)) == signBit) return fromRep(qnanRep); 34a9769988556ce9ea87a866666053b155984e9f2cJoerg Sonnenberger // +/-infinity + anything remaining = +/- infinity 35a9769988556ce9ea87a866666053b155984e9f2cJoerg Sonnenberger else return a; 36a9769988556ce9ea87a866666053b155984e9f2cJoerg Sonnenberger } 37a9769988556ce9ea87a866666053b155984e9f2cJoerg Sonnenberger 38a9769988556ce9ea87a866666053b155984e9f2cJoerg Sonnenberger // anything remaining + +/-infinity = +/-infinity 39a9769988556ce9ea87a866666053b155984e9f2cJoerg Sonnenberger if (bAbs == infRep) return b; 40a9769988556ce9ea87a866666053b155984e9f2cJoerg Sonnenberger 41a9769988556ce9ea87a866666053b155984e9f2cJoerg Sonnenberger // zero + anything = anything 42a9769988556ce9ea87a866666053b155984e9f2cJoerg Sonnenberger if (!aAbs) { 43a9769988556ce9ea87a866666053b155984e9f2cJoerg Sonnenberger // but we need to get the sign right for zero + zero 44a9769988556ce9ea87a866666053b155984e9f2cJoerg Sonnenberger if (!bAbs) return fromRep(toRep(a) & toRep(b)); 45a9769988556ce9ea87a866666053b155984e9f2cJoerg Sonnenberger else return b; 46a9769988556ce9ea87a866666053b155984e9f2cJoerg Sonnenberger } 47a9769988556ce9ea87a866666053b155984e9f2cJoerg Sonnenberger 48a9769988556ce9ea87a866666053b155984e9f2cJoerg Sonnenberger // anything + zero = anything 49a9769988556ce9ea87a866666053b155984e9f2cJoerg Sonnenberger if (!bAbs) return a; 50a9769988556ce9ea87a866666053b155984e9f2cJoerg Sonnenberger } 51a9769988556ce9ea87a866666053b155984e9f2cJoerg Sonnenberger 52a9769988556ce9ea87a866666053b155984e9f2cJoerg Sonnenberger // Swap a and b if necessary so that a has the larger absolute value. 53a9769988556ce9ea87a866666053b155984e9f2cJoerg Sonnenberger if (bAbs > aAbs) { 54a9769988556ce9ea87a866666053b155984e9f2cJoerg Sonnenberger const rep_t temp = aRep; 55a9769988556ce9ea87a866666053b155984e9f2cJoerg Sonnenberger aRep = bRep; 56a9769988556ce9ea87a866666053b155984e9f2cJoerg Sonnenberger bRep = temp; 57a9769988556ce9ea87a866666053b155984e9f2cJoerg Sonnenberger } 58a9769988556ce9ea87a866666053b155984e9f2cJoerg Sonnenberger 59a9769988556ce9ea87a866666053b155984e9f2cJoerg Sonnenberger // Extract the exponent and significand from the (possibly swapped) a and b. 60a9769988556ce9ea87a866666053b155984e9f2cJoerg Sonnenberger int aExponent = aRep >> significandBits & maxExponent; 61a9769988556ce9ea87a866666053b155984e9f2cJoerg Sonnenberger int bExponent = bRep >> significandBits & maxExponent; 62a9769988556ce9ea87a866666053b155984e9f2cJoerg Sonnenberger rep_t aSignificand = aRep & significandMask; 63a9769988556ce9ea87a866666053b155984e9f2cJoerg Sonnenberger rep_t bSignificand = bRep & significandMask; 64a9769988556ce9ea87a866666053b155984e9f2cJoerg Sonnenberger 65a9769988556ce9ea87a866666053b155984e9f2cJoerg Sonnenberger // Normalize any denormals, and adjust the exponent accordingly. 66a9769988556ce9ea87a866666053b155984e9f2cJoerg Sonnenberger if (aExponent == 0) aExponent = normalize(&aSignificand); 67a9769988556ce9ea87a866666053b155984e9f2cJoerg Sonnenberger if (bExponent == 0) bExponent = normalize(&bSignificand); 68a9769988556ce9ea87a866666053b155984e9f2cJoerg Sonnenberger 69a9769988556ce9ea87a866666053b155984e9f2cJoerg Sonnenberger // The sign of the result is the sign of the larger operand, a. If they 70a9769988556ce9ea87a866666053b155984e9f2cJoerg Sonnenberger // have opposite signs, we are performing a subtraction; otherwise addition. 71a9769988556ce9ea87a866666053b155984e9f2cJoerg Sonnenberger const rep_t resultSign = aRep & signBit; 72a9769988556ce9ea87a866666053b155984e9f2cJoerg Sonnenberger const bool subtraction = (aRep ^ bRep) & signBit; 73a9769988556ce9ea87a866666053b155984e9f2cJoerg Sonnenberger 74a9769988556ce9ea87a866666053b155984e9f2cJoerg Sonnenberger // Shift the significands to give us round, guard and sticky, and or in the 75a9769988556ce9ea87a866666053b155984e9f2cJoerg Sonnenberger // implicit significand bit. (If we fell through from the denormal path it 76a9769988556ce9ea87a866666053b155984e9f2cJoerg Sonnenberger // was already set by normalize( ), but setting it twice won't hurt 77a9769988556ce9ea87a866666053b155984e9f2cJoerg Sonnenberger // anything.) 78a9769988556ce9ea87a866666053b155984e9f2cJoerg Sonnenberger aSignificand = (aSignificand | implicitBit) << 3; 79a9769988556ce9ea87a866666053b155984e9f2cJoerg Sonnenberger bSignificand = (bSignificand | implicitBit) << 3; 80a9769988556ce9ea87a866666053b155984e9f2cJoerg Sonnenberger 81a9769988556ce9ea87a866666053b155984e9f2cJoerg Sonnenberger // Shift the significand of b by the difference in exponents, with a sticky 82a9769988556ce9ea87a866666053b155984e9f2cJoerg Sonnenberger // bottom bit to get rounding correct. 83a9769988556ce9ea87a866666053b155984e9f2cJoerg Sonnenberger const unsigned int align = aExponent - bExponent; 84a9769988556ce9ea87a866666053b155984e9f2cJoerg Sonnenberger if (align) { 85a9769988556ce9ea87a866666053b155984e9f2cJoerg Sonnenberger if (align < typeWidth) { 86a9769988556ce9ea87a866666053b155984e9f2cJoerg Sonnenberger const bool sticky = bSignificand << (typeWidth - align); 87a9769988556ce9ea87a866666053b155984e9f2cJoerg Sonnenberger bSignificand = bSignificand >> align | sticky; 88a9769988556ce9ea87a866666053b155984e9f2cJoerg Sonnenberger } else { 89a9769988556ce9ea87a866666053b155984e9f2cJoerg Sonnenberger bSignificand = 1; // sticky; b is known to be non-zero. 90a9769988556ce9ea87a866666053b155984e9f2cJoerg Sonnenberger } 91a9769988556ce9ea87a866666053b155984e9f2cJoerg Sonnenberger } 92a9769988556ce9ea87a866666053b155984e9f2cJoerg Sonnenberger if (subtraction) { 93a9769988556ce9ea87a866666053b155984e9f2cJoerg Sonnenberger aSignificand -= bSignificand; 94a9769988556ce9ea87a866666053b155984e9f2cJoerg Sonnenberger // If a == -b, return +zero. 95a9769988556ce9ea87a866666053b155984e9f2cJoerg Sonnenberger if (aSignificand == 0) return fromRep(0); 96a9769988556ce9ea87a866666053b155984e9f2cJoerg Sonnenberger 97a9769988556ce9ea87a866666053b155984e9f2cJoerg Sonnenberger // If partial cancellation occured, we need to left-shift the result 98a9769988556ce9ea87a866666053b155984e9f2cJoerg Sonnenberger // and adjust the exponent: 99a9769988556ce9ea87a866666053b155984e9f2cJoerg Sonnenberger if (aSignificand < implicitBit << 3) { 100a9769988556ce9ea87a866666053b155984e9f2cJoerg Sonnenberger const int shift = rep_clz(aSignificand) - rep_clz(implicitBit << 3); 101a9769988556ce9ea87a866666053b155984e9f2cJoerg Sonnenberger aSignificand <<= shift; 102a9769988556ce9ea87a866666053b155984e9f2cJoerg Sonnenberger aExponent -= shift; 103a9769988556ce9ea87a866666053b155984e9f2cJoerg Sonnenberger } 104a9769988556ce9ea87a866666053b155984e9f2cJoerg Sonnenberger } 105a9769988556ce9ea87a866666053b155984e9f2cJoerg Sonnenberger else /* addition */ { 106a9769988556ce9ea87a866666053b155984e9f2cJoerg Sonnenberger aSignificand += bSignificand; 107a9769988556ce9ea87a866666053b155984e9f2cJoerg Sonnenberger 108a9769988556ce9ea87a866666053b155984e9f2cJoerg Sonnenberger // If the addition carried up, we need to right-shift the result and 109a9769988556ce9ea87a866666053b155984e9f2cJoerg Sonnenberger // adjust the exponent: 110a9769988556ce9ea87a866666053b155984e9f2cJoerg Sonnenberger if (aSignificand & implicitBit << 4) { 111a9769988556ce9ea87a866666053b155984e9f2cJoerg Sonnenberger const bool sticky = aSignificand & 1; 112a9769988556ce9ea87a866666053b155984e9f2cJoerg Sonnenberger aSignificand = aSignificand >> 1 | sticky; 113a9769988556ce9ea87a866666053b155984e9f2cJoerg Sonnenberger aExponent += 1; 114a9769988556ce9ea87a866666053b155984e9f2cJoerg Sonnenberger } 115a9769988556ce9ea87a866666053b155984e9f2cJoerg Sonnenberger } 116a9769988556ce9ea87a866666053b155984e9f2cJoerg Sonnenberger 117a9769988556ce9ea87a866666053b155984e9f2cJoerg Sonnenberger // If we have overflowed the type, return +/- infinity: 118a9769988556ce9ea87a866666053b155984e9f2cJoerg Sonnenberger if (aExponent >= maxExponent) return fromRep(infRep | resultSign); 119a9769988556ce9ea87a866666053b155984e9f2cJoerg Sonnenberger 120a9769988556ce9ea87a866666053b155984e9f2cJoerg Sonnenberger if (aExponent <= 0) { 121a9769988556ce9ea87a866666053b155984e9f2cJoerg Sonnenberger // Result is denormal before rounding; the exponent is zero and we 122a9769988556ce9ea87a866666053b155984e9f2cJoerg Sonnenberger // need to shift the significand. 123a9769988556ce9ea87a866666053b155984e9f2cJoerg Sonnenberger const int shift = 1 - aExponent; 124a9769988556ce9ea87a866666053b155984e9f2cJoerg Sonnenberger const bool sticky = aSignificand << (typeWidth - shift); 125a9769988556ce9ea87a866666053b155984e9f2cJoerg Sonnenberger aSignificand = aSignificand >> shift | sticky; 126a9769988556ce9ea87a866666053b155984e9f2cJoerg Sonnenberger aExponent = 0; 127a9769988556ce9ea87a866666053b155984e9f2cJoerg Sonnenberger } 128a9769988556ce9ea87a866666053b155984e9f2cJoerg Sonnenberger 129a9769988556ce9ea87a866666053b155984e9f2cJoerg Sonnenberger // Low three bits are round, guard, and sticky. 130a9769988556ce9ea87a866666053b155984e9f2cJoerg Sonnenberger const int roundGuardSticky = aSignificand & 0x7; 131a9769988556ce9ea87a866666053b155984e9f2cJoerg Sonnenberger 132a9769988556ce9ea87a866666053b155984e9f2cJoerg Sonnenberger // Shift the significand into place, and mask off the implicit bit. 133a9769988556ce9ea87a866666053b155984e9f2cJoerg Sonnenberger rep_t result = aSignificand >> 3 & significandMask; 134a9769988556ce9ea87a866666053b155984e9f2cJoerg Sonnenberger 135a9769988556ce9ea87a866666053b155984e9f2cJoerg Sonnenberger // Insert the exponent and sign. 136a9769988556ce9ea87a866666053b155984e9f2cJoerg Sonnenberger result |= (rep_t)aExponent << significandBits; 137a9769988556ce9ea87a866666053b155984e9f2cJoerg Sonnenberger result |= resultSign; 138a9769988556ce9ea87a866666053b155984e9f2cJoerg Sonnenberger 139a9769988556ce9ea87a866666053b155984e9f2cJoerg Sonnenberger // Final rounding. The result may overflow to infinity, but that is the 140a9769988556ce9ea87a866666053b155984e9f2cJoerg Sonnenberger // correct result in that case. 141a9769988556ce9ea87a866666053b155984e9f2cJoerg Sonnenberger if (roundGuardSticky > 0x4) result++; 142a9769988556ce9ea87a866666053b155984e9f2cJoerg Sonnenberger if (roundGuardSticky == 0x4) result += result & 1; 143a9769988556ce9ea87a866666053b155984e9f2cJoerg Sonnenberger return fromRep(result); 144a9769988556ce9ea87a866666053b155984e9f2cJoerg Sonnenberger} 145