10ef6213cf2363ad443b92a2a7396e7c3fb32c630Stephen Canon//===-- lib/fixdfsi.c - Double-precision -> integer conversion ----*- C -*-===// 20ef6213cf2363ad443b92a2a7396e7c3fb32c630Stephen Canon// 30ef6213cf2363ad443b92a2a7396e7c3fb32c630Stephen Canon// The LLVM Compiler Infrastructure 40ef6213cf2363ad443b92a2a7396e7c3fb32c630Stephen 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. 70ef6213cf2363ad443b92a2a7396e7c3fb32c630Stephen Canon// 80ef6213cf2363ad443b92a2a7396e7c3fb32c630Stephen Canon//===----------------------------------------------------------------------===// 90ef6213cf2363ad443b92a2a7396e7c3fb32c630Stephen Canon// 100ef6213cf2363ad443b92a2a7396e7c3fb32c630Stephen Canon// This file implements double-precision to integer conversion for the 110ef6213cf2363ad443b92a2a7396e7c3fb32c630Stephen Canon// compiler-rt library. No range checking is performed; the behavior of this 120ef6213cf2363ad443b92a2a7396e7c3fb32c630Stephen Canon// conversion is undefined for out of range values in the C standard. 130ef6213cf2363ad443b92a2a7396e7c3fb32c630Stephen Canon// 140ef6213cf2363ad443b92a2a7396e7c3fb32c630Stephen Canon//===----------------------------------------------------------------------===// 150ef6213cf2363ad443b92a2a7396e7c3fb32c630Stephen Canon 160ef6213cf2363ad443b92a2a7396e7c3fb32c630Stephen Canon#define DOUBLE_PRECISION 170ef6213cf2363ad443b92a2a7396e7c3fb32c630Stephen Canon#include "fp_lib.h" 180ef6213cf2363ad443b92a2a7396e7c3fb32c630Stephen Canon 1937b97d1cf4501b94347e0b4e880f4b25825a289fAnton Korobeynikov#include "int_lib.h" 2037b97d1cf4501b94347e0b4e880f4b25825a289fAnton Korobeynikov 210193b74976719b8aea4cb8874ba36b75836a8d6eChandler CarruthARM_EABI_FNALIAS(d2iz, fixdfsi) 2237b97d1cf4501b94347e0b4e880f4b25825a289fAnton Korobeynikov 232d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen HinesCOMPILER_RT_ABI int 242d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines__fixdfsi(fp_t a) { 250ef6213cf2363ad443b92a2a7396e7c3fb32c630Stephen Canon 260ef6213cf2363ad443b92a2a7396e7c3fb32c630Stephen Canon // Break a into sign, exponent, significand 270ef6213cf2363ad443b92a2a7396e7c3fb32c630Stephen Canon const rep_t aRep = toRep(a); 280ef6213cf2363ad443b92a2a7396e7c3fb32c630Stephen Canon const rep_t aAbs = aRep & absMask; 290ef6213cf2363ad443b92a2a7396e7c3fb32c630Stephen Canon const int sign = aRep & signBit ? -1 : 1; 300ef6213cf2363ad443b92a2a7396e7c3fb32c630Stephen Canon const int exponent = (aAbs >> significandBits) - exponentBias; 310ef6213cf2363ad443b92a2a7396e7c3fb32c630Stephen Canon const rep_t significand = (aAbs & significandMask) | implicitBit; 320ef6213cf2363ad443b92a2a7396e7c3fb32c630Stephen Canon 330ef6213cf2363ad443b92a2a7396e7c3fb32c630Stephen Canon // If 0 < exponent < significandBits, right shift to get the result. 340ef6213cf2363ad443b92a2a7396e7c3fb32c630Stephen Canon if ((unsigned int)exponent < significandBits) { 350ef6213cf2363ad443b92a2a7396e7c3fb32c630Stephen Canon return sign * (significand >> (significandBits - exponent)); 360ef6213cf2363ad443b92a2a7396e7c3fb32c630Stephen Canon } 370ef6213cf2363ad443b92a2a7396e7c3fb32c630Stephen Canon 380ef6213cf2363ad443b92a2a7396e7c3fb32c630Stephen Canon // If exponent is negative, the result is zero. 390ef6213cf2363ad443b92a2a7396e7c3fb32c630Stephen Canon else if (exponent < 0) { 400ef6213cf2363ad443b92a2a7396e7c3fb32c630Stephen Canon return 0; 410ef6213cf2363ad443b92a2a7396e7c3fb32c630Stephen Canon } 420ef6213cf2363ad443b92a2a7396e7c3fb32c630Stephen Canon 430ef6213cf2363ad443b92a2a7396e7c3fb32c630Stephen Canon // If significandBits < exponent, left shift to get the result. This shift 440ef6213cf2363ad443b92a2a7396e7c3fb32c630Stephen Canon // may end up being larger than the type width, which incurs undefined 450ef6213cf2363ad443b92a2a7396e7c3fb32c630Stephen Canon // behavior, but the conversion itself is undefined in that case, so 460ef6213cf2363ad443b92a2a7396e7c3fb32c630Stephen Canon // whatever the compiler decides to do is fine. 470ef6213cf2363ad443b92a2a7396e7c3fb32c630Stephen Canon else { 480ef6213cf2363ad443b92a2a7396e7c3fb32c630Stephen Canon return sign * (significand << (exponent - significandBits)); 490ef6213cf2363ad443b92a2a7396e7c3fb32c630Stephen Canon } 500ef6213cf2363ad443b92a2a7396e7c3fb32c630Stephen Canon} 51