1799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar//===-- lib/floatditf.c - integer -> quad-precision conversion ----*- C -*-===// 2799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar// 3799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar// The LLVM Compiler Infrastructure 4799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar// 5799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar// This file is dual licensed under the MIT and the University of Illinois Open 6799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar// Source Licenses. See LICENSE.TXT for details. 7799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar// 8799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar//===----------------------------------------------------------------------===// 9799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar// 10799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar// This file implements di_int to quad-precision conversion for the 11799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar// compiler-rt library in the IEEE-754 default round-to-nearest, ties-to-even 12799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar// mode. 13799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar// 14799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar//===----------------------------------------------------------------------===// 15799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar 16799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar#define QUAD_PRECISION 17799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar#include "fp_lib.h" 18799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar 19799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar#if defined(CRT_HAS_128BIT) && defined(CRT_LDBL_128BIT) 20799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga NainarCOMPILER_RT_ABI fp_t __floatditf(di_int a) { 21799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar 22799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar const int aWidth = sizeof a * CHAR_BIT; 23799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar 24799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar // Handle zero as a special case to protect clz 25799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar if (a == 0) 26799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar return fromRep(0); 27799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar 28799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar // All other cases begin by extracting the sign and absolute value of a 29799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar rep_t sign = 0; 30799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar du_int aAbs = (du_int)a; 31799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar if (a < 0) { 32799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar sign = signBit; 33799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar aAbs = ~(du_int)a + 1U; 34799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar } 35799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar 36799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar // Exponent of (fp_t)a is the width of abs(a). 37799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar const int exponent = (aWidth - 1) - __builtin_clzll(aAbs); 38799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar rep_t result; 39799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar 40799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar // Shift a into the significand field, rounding if it is a right-shift 41799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar const int shift = significandBits - exponent; 42799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar result = (rep_t)aAbs << shift ^ implicitBit; 43799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar 44799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar // Insert the exponent 45799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar result += (rep_t)(exponent + exponentBias) << significandBits; 46799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar // Insert the sign bit and return 47799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar return fromRep(result | sign); 48799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar} 49799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar 50799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar#endif 51