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 230ef6213cf2363ad443b92a2a7396e7c3fb32c630Stephen Canonint __fixdfsi(fp_t a) { 240ef6213cf2363ad443b92a2a7396e7c3fb32c630Stephen Canon 250ef6213cf2363ad443b92a2a7396e7c3fb32c630Stephen Canon // Break a into sign, exponent, significand 260ef6213cf2363ad443b92a2a7396e7c3fb32c630Stephen Canon const rep_t aRep = toRep(a); 270ef6213cf2363ad443b92a2a7396e7c3fb32c630Stephen Canon const rep_t aAbs = aRep & absMask; 280ef6213cf2363ad443b92a2a7396e7c3fb32c630Stephen Canon const int sign = aRep & signBit ? -1 : 1; 290ef6213cf2363ad443b92a2a7396e7c3fb32c630Stephen Canon const int exponent = (aAbs >> significandBits) - exponentBias; 300ef6213cf2363ad443b92a2a7396e7c3fb32c630Stephen Canon const rep_t significand = (aAbs & significandMask) | implicitBit; 310ef6213cf2363ad443b92a2a7396e7c3fb32c630Stephen Canon 320ef6213cf2363ad443b92a2a7396e7c3fb32c630Stephen Canon // If 0 < exponent < significandBits, right shift to get the result. 330ef6213cf2363ad443b92a2a7396e7c3fb32c630Stephen Canon if ((unsigned int)exponent < significandBits) { 340ef6213cf2363ad443b92a2a7396e7c3fb32c630Stephen Canon return sign * (significand >> (significandBits - exponent)); 350ef6213cf2363ad443b92a2a7396e7c3fb32c630Stephen Canon } 360ef6213cf2363ad443b92a2a7396e7c3fb32c630Stephen Canon 370ef6213cf2363ad443b92a2a7396e7c3fb32c630Stephen Canon // If exponent is negative, the result is zero. 380ef6213cf2363ad443b92a2a7396e7c3fb32c630Stephen Canon else if (exponent < 0) { 390ef6213cf2363ad443b92a2a7396e7c3fb32c630Stephen Canon return 0; 400ef6213cf2363ad443b92a2a7396e7c3fb32c630Stephen Canon } 410ef6213cf2363ad443b92a2a7396e7c3fb32c630Stephen Canon 420ef6213cf2363ad443b92a2a7396e7c3fb32c630Stephen Canon // If significandBits < exponent, left shift to get the result. This shift 430ef6213cf2363ad443b92a2a7396e7c3fb32c630Stephen Canon // may end up being larger than the type width, which incurs undefined 440ef6213cf2363ad443b92a2a7396e7c3fb32c630Stephen Canon // behavior, but the conversion itself is undefined in that case, so 450ef6213cf2363ad443b92a2a7396e7c3fb32c630Stephen Canon // whatever the compiler decides to do is fine. 460ef6213cf2363ad443b92a2a7396e7c3fb32c630Stephen Canon else { 470ef6213cf2363ad443b92a2a7396e7c3fb32c630Stephen Canon return sign * (significand << (exponent - significandBits)); 480ef6213cf2363ad443b92a2a7396e7c3fb32c630Stephen Canon } 490ef6213cf2363ad443b92a2a7396e7c3fb32c630Stephen Canon} 50