1  | 
     | 
     | 
    /* ===-- floattidf.c - Implement __floattidf -------------------------------===  | 
    
    
    2  | 
     | 
     | 
     *  | 
    
    
    3  | 
     | 
     | 
     *                    The LLVM Compiler Infrastructure  | 
    
    
    4  | 
     | 
     | 
     *  | 
    
    
    5  | 
     | 
     | 
     * This file is dual licensed under the MIT and the University of Illinois Open  | 
    
    
    6  | 
     | 
     | 
     * Source Licenses. See LICENSE.TXT for details.  | 
    
    
    7  | 
     | 
     | 
     *  | 
    
    
    8  | 
     | 
     | 
     * ===----------------------------------------------------------------------===  | 
    
    
    9  | 
     | 
     | 
     *  | 
    
    
    10  | 
     | 
     | 
     * This file implements __floattidf for the compiler_rt library.  | 
    
    
    11  | 
     | 
     | 
     *  | 
    
    
    12  | 
     | 
     | 
     * ===----------------------------------------------------------------------===  | 
    
    
    13  | 
     | 
     | 
     */  | 
    
    
    14  | 
     | 
     | 
     | 
    
    
    15  | 
     | 
     | 
    #include "int_lib.h"  | 
    
    
    16  | 
     | 
     | 
     | 
    
    
    17  | 
     | 
     | 
    #ifdef CRT_HAS_128BIT  | 
    
    
    18  | 
     | 
     | 
     | 
    
    
    19  | 
     | 
     | 
    /* Returns: convert a to a double, rounding toward even.*/  | 
    
    
    20  | 
     | 
     | 
     | 
    
    
    21  | 
     | 
     | 
    /* Assumption: double is a IEEE 64 bit floating point type  | 
    
    
    22  | 
     | 
     | 
     *            ti_int is a 128 bit integral type  | 
    
    
    23  | 
     | 
     | 
     */  | 
    
    
    24  | 
     | 
     | 
     | 
    
    
    25  | 
     | 
     | 
    /* seee eeee eeee mmmm mmmm mmmm mmmm mmmm | mmmm mmmm mmmm mmmm mmmm mmmm mmmm mmmm */  | 
    
    
    26  | 
     | 
     | 
     | 
    
    
    27  | 
     | 
     | 
    COMPILER_RT_ABI double  | 
    
    
    28  | 
     | 
     | 
    __floattidf(ti_int a)  | 
    
    
    29  | 
     | 
     | 
    { | 
    
    
    30  | 
     | 
     | 
        if (a == 0)  | 
    
    
    31  | 
     | 
     | 
            return 0.0;  | 
    
    
    32  | 
     | 
     | 
        const unsigned N = sizeof(ti_int) * CHAR_BIT;  | 
    
    
    33  | 
     | 
     | 
        const ti_int s = a >> (N-1);  | 
    
    
    34  | 
     | 
     | 
        a = (a ^ s) - s;  | 
    
    
    35  | 
     | 
     | 
        int sd = N - __clzti2(a);  /* number of significant digits */  | 
    
    
    36  | 
     | 
     | 
        int e = sd - 1;             /* exponent */  | 
    
    
    37  | 
     | 
     | 
        if (sd > DBL_MANT_DIG)  | 
    
    
    38  | 
     | 
     | 
        { | 
    
    
    39  | 
     | 
     | 
            /* start:  0000000000000000000001xxxxxxxxxxxxxxxxxxxxxxPQxxxxxxxxxxxxxxxxxx  | 
    
    
    40  | 
     | 
     | 
             *  finish: 000000000000000000000000000000000000001xxxxxxxxxxxxxxxxxxxxxxPQR  | 
    
    
    41  | 
     | 
     | 
             *                                               12345678901234567890123456  | 
    
    
    42  | 
     | 
     | 
             * 1 = msb 1 bit  | 
    
    
    43  | 
     | 
     | 
             * P = bit DBL_MANT_DIG-1 bits to the right of 1  | 
    
    
    44  | 
     | 
     | 
             * Q = bit DBL_MANT_DIG bits to the right of 1  | 
    
    
    45  | 
     | 
     | 
             * R = "or" of all bits to the right of Q  | 
    
    
    46  | 
     | 
     | 
             */  | 
    
    
    47  | 
     | 
     | 
            switch (sd)  | 
    
    
    48  | 
     | 
     | 
            { | 
    
    
    49  | 
     | 
     | 
            case DBL_MANT_DIG + 1:  | 
    
    
    50  | 
     | 
     | 
                a <<= 1;  | 
    
    
    51  | 
     | 
     | 
                break;  | 
    
    
    52  | 
     | 
     | 
            case DBL_MANT_DIG + 2:  | 
    
    
    53  | 
     | 
     | 
                break;  | 
    
    
    54  | 
     | 
     | 
            default:  | 
    
    
    55  | 
     | 
     | 
                a = ((tu_int)a >> (sd - (DBL_MANT_DIG+2))) |  | 
    
    
    56  | 
     | 
     | 
                    ((a & ((tu_int)(-1) >> ((N + DBL_MANT_DIG+2) - sd))) != 0);  | 
    
    
    57  | 
     | 
     | 
            };  | 
    
    
    58  | 
     | 
     | 
            /* finish: */  | 
    
    
    59  | 
     | 
     | 
            a |= (a & 4) != 0;  /* Or P into R */  | 
    
    
    60  | 
     | 
     | 
            ++a;  /* round - this step may add a significant bit */  | 
    
    
    61  | 
     | 
     | 
            a >>= 2;  /* dump Q and R */  | 
    
    
    62  | 
     | 
     | 
            /* a is now rounded to DBL_MANT_DIG or DBL_MANT_DIG+1 bits */  | 
    
    
    63  | 
     | 
     | 
            if (a & ((tu_int)1 << DBL_MANT_DIG))  | 
    
    
    64  | 
     | 
     | 
            { | 
    
    
    65  | 
     | 
     | 
                a >>= 1;  | 
    
    
    66  | 
     | 
     | 
                ++e;  | 
    
    
    67  | 
     | 
     | 
            }  | 
    
    
    68  | 
     | 
     | 
            /* a is now rounded to DBL_MANT_DIG bits */  | 
    
    
    69  | 
     | 
     | 
        }  | 
    
    
    70  | 
     | 
     | 
        else  | 
    
    
    71  | 
     | 
     | 
        { | 
    
    
    72  | 
     | 
     | 
            a <<= (DBL_MANT_DIG - sd);  | 
    
    
    73  | 
     | 
     | 
            /* a is now rounded to DBL_MANT_DIG bits */  | 
    
    
    74  | 
     | 
     | 
        }  | 
    
    
    75  | 
     | 
     | 
        double_bits fb;  | 
    
    
    76  | 
     | 
     | 
        fb.u.s.high = ((su_int)s & 0x80000000) |        /* sign */  | 
    
    
    77  | 
     | 
     | 
                    ((e + 1023) << 20)      |        /* exponent */  | 
    
    
    78  | 
     | 
     | 
                    ((su_int)(a >> 32) & 0x000FFFFF); /* mantissa-high */  | 
    
    
    79  | 
     | 
     | 
        fb.u.s.low = (su_int)a;                         /* mantissa-low */  | 
    
    
    80  | 
     | 
     | 
        return fb.f;  | 
    
    
    81  | 
     | 
     | 
    }  | 
    
    
    82  | 
     | 
     | 
     | 
    
    
    83  | 
     | 
     | 
    #endif /* CRT_HAS_128BIT */  |