109009c50dd7118ed0bdf97e5c37e23c25e443682Stephen Canon//===-- lib/floatsidf.c - integer -> double-precision conversion --*- C -*-===//
209009c50dd7118ed0bdf97e5c37e23c25e443682Stephen Canon//
309009c50dd7118ed0bdf97e5c37e23c25e443682Stephen Canon//                     The LLVM Compiler Infrastructure
409009c50dd7118ed0bdf97e5c37e23c25e443682Stephen Canon//
59ad441ffec97db647fee3725b3424284fb913e14Howard Hinnant// This file is dual licensed under the MIT and the University of Illinois Open
69ad441ffec97db647fee3725b3424284fb913e14Howard Hinnant// Source Licenses. See LICENSE.TXT for details.
709009c50dd7118ed0bdf97e5c37e23c25e443682Stephen Canon//
809009c50dd7118ed0bdf97e5c37e23c25e443682Stephen Canon//===----------------------------------------------------------------------===//
909009c50dd7118ed0bdf97e5c37e23c25e443682Stephen Canon//
1009009c50dd7118ed0bdf97e5c37e23c25e443682Stephen Canon// This file implements integer to double-precision conversion for the
1109009c50dd7118ed0bdf97e5c37e23c25e443682Stephen Canon// compiler-rt library in the IEEE-754 default round-to-nearest, ties-to-even
1209009c50dd7118ed0bdf97e5c37e23c25e443682Stephen Canon// mode.
1309009c50dd7118ed0bdf97e5c37e23c25e443682Stephen Canon//
1409009c50dd7118ed0bdf97e5c37e23c25e443682Stephen Canon//===----------------------------------------------------------------------===//
1509009c50dd7118ed0bdf97e5c37e23c25e443682Stephen Canon
1609009c50dd7118ed0bdf97e5c37e23c25e443682Stephen Canon#define DOUBLE_PRECISION
1709009c50dd7118ed0bdf97e5c37e23c25e443682Stephen Canon#include "fp_lib.h"
1809009c50dd7118ed0bdf97e5c37e23c25e443682Stephen Canon
1937b97d1cf4501b94347e0b4e880f4b25825a289fAnton Korobeynikov#include "int_lib.h"
2037b97d1cf4501b94347e0b4e880f4b25825a289fAnton Korobeynikov
210193b74976719b8aea4cb8874ba36b75836a8d6eChandler CarruthARM_EABI_FNALIAS(i2d, floatsidf)
2237b97d1cf4501b94347e0b4e880f4b25825a289fAnton Korobeynikov
232d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen HinesCOMPILER_RT_ABI fp_t
242d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines__floatsidf(int a) {
2509009c50dd7118ed0bdf97e5c37e23c25e443682Stephen Canon
2609009c50dd7118ed0bdf97e5c37e23c25e443682Stephen Canon    const int aWidth = sizeof a * CHAR_BIT;
2709009c50dd7118ed0bdf97e5c37e23c25e443682Stephen Canon
2809009c50dd7118ed0bdf97e5c37e23c25e443682Stephen Canon    // Handle zero as a special case to protect clz
2909009c50dd7118ed0bdf97e5c37e23c25e443682Stephen Canon    if (a == 0)
3009009c50dd7118ed0bdf97e5c37e23c25e443682Stephen Canon        return fromRep(0);
3109009c50dd7118ed0bdf97e5c37e23c25e443682Stephen Canon
3209009c50dd7118ed0bdf97e5c37e23c25e443682Stephen Canon    // All other cases begin by extracting the sign and absolute value of a
3309009c50dd7118ed0bdf97e5c37e23c25e443682Stephen Canon    rep_t sign = 0;
3409009c50dd7118ed0bdf97e5c37e23c25e443682Stephen Canon    if (a < 0) {
3509009c50dd7118ed0bdf97e5c37e23c25e443682Stephen Canon        sign = signBit;
3609009c50dd7118ed0bdf97e5c37e23c25e443682Stephen Canon        a = -a;
3709009c50dd7118ed0bdf97e5c37e23c25e443682Stephen Canon    }
3809009c50dd7118ed0bdf97e5c37e23c25e443682Stephen Canon
3909009c50dd7118ed0bdf97e5c37e23c25e443682Stephen Canon    // Exponent of (fp_t)a is the width of abs(a).
4009009c50dd7118ed0bdf97e5c37e23c25e443682Stephen Canon    const int exponent = (aWidth - 1) - __builtin_clz(a);
4109009c50dd7118ed0bdf97e5c37e23c25e443682Stephen Canon    rep_t result;
4209009c50dd7118ed0bdf97e5c37e23c25e443682Stephen Canon
434d055d584cdc9c65e09092238a905c6f20b829ecStephen Canon    // Shift a into the significand field and clear the implicit bit.  Extra
444d055d584cdc9c65e09092238a905c6f20b829ecStephen Canon    // cast to unsigned int is necessary to get the correct behavior for
454d055d584cdc9c65e09092238a905c6f20b829ecStephen Canon    // the input INT_MIN.
464d055d584cdc9c65e09092238a905c6f20b829ecStephen Canon    const int shift = significandBits - exponent;
474d055d584cdc9c65e09092238a905c6f20b829ecStephen Canon    result = (rep_t)(unsigned int)a << shift ^ implicitBit;
4809009c50dd7118ed0bdf97e5c37e23c25e443682Stephen Canon
4909009c50dd7118ed0bdf97e5c37e23c25e443682Stephen Canon    // Insert the exponent
5009009c50dd7118ed0bdf97e5c37e23c25e443682Stephen Canon    result += (rep_t)(exponent + exponentBias) << significandBits;
5109009c50dd7118ed0bdf97e5c37e23c25e443682Stephen Canon    // Insert the sign bit and return
5209009c50dd7118ed0bdf97e5c37e23c25e443682Stephen Canon    return fromRep(result | sign);
5309009c50dd7118ed0bdf97e5c37e23c25e443682Stephen Canon}
54