floatunsidf.c revision 4d055d584cdc9c65e09092238a905c6f20b829ec
1b6d4e2e3a87eb3c9a6dec0ad21d4c1dec545c137Stephen Canon//===-- lib/floatunsidf.c - uint -> double-precision conversion ---*- C -*-===// 209009c50dd7118ed0bdf97e5c37e23c25e443682Stephen Canon// 309009c50dd7118ed0bdf97e5c37e23c25e443682Stephen Canon// The LLVM Compiler Infrastructure 409009c50dd7118ed0bdf97e5c37e23c25e443682Stephen Canon// 509009c50dd7118ed0bdf97e5c37e23c25e443682Stephen Canon// This file is distributed under the University of Illinois Open Source 609009c50dd7118ed0bdf97e5c37e23c25e443682Stephen Canon// License. See LICENSE.TXT for details. 709009c50dd7118ed0bdf97e5c37e23c25e443682Stephen Canon// 809009c50dd7118ed0bdf97e5c37e23c25e443682Stephen Canon//===----------------------------------------------------------------------===// 909009c50dd7118ed0bdf97e5c37e23c25e443682Stephen Canon// 1009009c50dd7118ed0bdf97e5c37e23c25e443682Stephen Canon// This file implements unsigned 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 19b6d4e2e3a87eb3c9a6dec0ad21d4c1dec545c137Stephen Canonfp_t __floatunsidf(unsigned int a) { 2009009c50dd7118ed0bdf97e5c37e23c25e443682Stephen Canon 2109009c50dd7118ed0bdf97e5c37e23c25e443682Stephen Canon const int aWidth = sizeof a * CHAR_BIT; 2209009c50dd7118ed0bdf97e5c37e23c25e443682Stephen Canon 2309009c50dd7118ed0bdf97e5c37e23c25e443682Stephen Canon // Handle zero as a special case to protect clz 2409009c50dd7118ed0bdf97e5c37e23c25e443682Stephen Canon if (a == 0) return fromRep(0); 2509009c50dd7118ed0bdf97e5c37e23c25e443682Stephen Canon 2609009c50dd7118ed0bdf97e5c37e23c25e443682Stephen Canon // Exponent of (fp_t)a is the width of abs(a). 2709009c50dd7118ed0bdf97e5c37e23c25e443682Stephen Canon const int exponent = (aWidth - 1) - __builtin_clz(a); 2809009c50dd7118ed0bdf97e5c37e23c25e443682Stephen Canon rep_t result; 2909009c50dd7118ed0bdf97e5c37e23c25e443682Stephen Canon 304d055d584cdc9c65e09092238a905c6f20b829ecStephen Canon // Shift a into the significand field and clear the implicit bit. 314d055d584cdc9c65e09092238a905c6f20b829ecStephen Canon const int shift = significandBits - exponent; 324d055d584cdc9c65e09092238a905c6f20b829ecStephen Canon result = (rep_t)a << shift ^ implicitBit; 3309009c50dd7118ed0bdf97e5c37e23c25e443682Stephen Canon 3409009c50dd7118ed0bdf97e5c37e23c25e443682Stephen Canon // Insert the exponent 3509009c50dd7118ed0bdf97e5c37e23c25e443682Stephen Canon result += (rep_t)(exponent + exponentBias) << significandBits; 3609009c50dd7118ed0bdf97e5c37e23c25e443682Stephen Canon return fromRep(result); 3709009c50dd7118ed0bdf97e5c37e23c25e443682Stephen Canon} 38