10ef6213cf2363ad443b92a2a7396e7c3fb32c630Stephen Canon//===-- lib/fixsfsi.c - Single-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 single-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 SINGLE_PRECISION 170ef6213cf2363ad443b92a2a7396e7c3fb32c630Stephen Canon#include "fp_lib.h" 180ef6213cf2363ad443b92a2a7396e7c3fb32c630Stephen Canon 190193b74976719b8aea4cb8874ba36b75836a8d6eChandler CarruthARM_EABI_FNALIAS(f2iz, fixsfsi) 2037b97d1cf4501b94347e0b4e880f4b25825a289fAnton Korobeynikov 211c5f89b1dd741135a4007ab577723d422f421eecAnton KorobeynikovCOMPILER_RT_ABI int 221c5f89b1dd741135a4007ab577723d422f421eecAnton Korobeynikov__fixsfsi(fp_t a) { 230ef6213cf2363ad443b92a2a7396e7c3fb32c630Stephen Canon // Break a into sign, exponent, significand 240ef6213cf2363ad443b92a2a7396e7c3fb32c630Stephen Canon const rep_t aRep = toRep(a); 250ef6213cf2363ad443b92a2a7396e7c3fb32c630Stephen Canon const rep_t aAbs = aRep & absMask; 260ef6213cf2363ad443b92a2a7396e7c3fb32c630Stephen Canon const int sign = aRep & signBit ? -1 : 1; 270ef6213cf2363ad443b92a2a7396e7c3fb32c630Stephen Canon const int exponent = (aAbs >> significandBits) - exponentBias; 280ef6213cf2363ad443b92a2a7396e7c3fb32c630Stephen Canon const rep_t significand = (aAbs & significandMask) | implicitBit; 290ef6213cf2363ad443b92a2a7396e7c3fb32c630Stephen Canon 300ef6213cf2363ad443b92a2a7396e7c3fb32c630Stephen Canon // If 0 < exponent < significandBits, right shift to get the result. 310ef6213cf2363ad443b92a2a7396e7c3fb32c630Stephen Canon if ((unsigned int)exponent < significandBits) { 320ef6213cf2363ad443b92a2a7396e7c3fb32c630Stephen Canon return sign * (significand >> (significandBits - exponent)); 330ef6213cf2363ad443b92a2a7396e7c3fb32c630Stephen Canon } 340ef6213cf2363ad443b92a2a7396e7c3fb32c630Stephen Canon 350ef6213cf2363ad443b92a2a7396e7c3fb32c630Stephen Canon // If exponent is negative, the result is zero. 360ef6213cf2363ad443b92a2a7396e7c3fb32c630Stephen Canon else if (exponent < 0) { 370ef6213cf2363ad443b92a2a7396e7c3fb32c630Stephen Canon return 0; 380ef6213cf2363ad443b92a2a7396e7c3fb32c630Stephen Canon } 390ef6213cf2363ad443b92a2a7396e7c3fb32c630Stephen Canon 400ef6213cf2363ad443b92a2a7396e7c3fb32c630Stephen Canon // If significandBits < exponent, left shift to get the result. This shift 410ef6213cf2363ad443b92a2a7396e7c3fb32c630Stephen Canon // may end up being larger than the type width, which incurs undefined 420ef6213cf2363ad443b92a2a7396e7c3fb32c630Stephen Canon // behavior, but the conversion itself is undefined in that case, so 430ef6213cf2363ad443b92a2a7396e7c3fb32c630Stephen Canon // whatever the compiler decides to do is fine. 440ef6213cf2363ad443b92a2a7396e7c3fb32c630Stephen Canon else { 450ef6213cf2363ad443b92a2a7396e7c3fb32c630Stephen Canon return sign * (significand << (exponent - significandBits)); 460ef6213cf2363ad443b92a2a7396e7c3fb32c630Stephen Canon } 470ef6213cf2363ad443b92a2a7396e7c3fb32c630Stephen Canon} 48