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