17c9150579ed0278492f51cc8434b1d63a44b9bd1Pirama Arumuga Nainar//===-- lib/fixdfsi.c - Double-precision -> integer conversion ----*- C -*-===// 27c9150579ed0278492f51cc8434b1d63a44b9bd1Pirama Arumuga Nainar// 37c9150579ed0278492f51cc8434b1d63a44b9bd1Pirama Arumuga Nainar// The LLVM Compiler Infrastructure 47c9150579ed0278492f51cc8434b1d63a44b9bd1Pirama Arumuga Nainar// 57c9150579ed0278492f51cc8434b1d63a44b9bd1Pirama Arumuga Nainar// This file is dual licensed under the MIT and the University of Illinois Open 67c9150579ed0278492f51cc8434b1d63a44b9bd1Pirama Arumuga Nainar// Source Licenses. See LICENSE.TXT for details. 77c9150579ed0278492f51cc8434b1d63a44b9bd1Pirama Arumuga Nainar// 87c9150579ed0278492f51cc8434b1d63a44b9bd1Pirama Arumuga Nainar//===----------------------------------------------------------------------===// 97c9150579ed0278492f51cc8434b1d63a44b9bd1Pirama Arumuga Nainar// 107c9150579ed0278492f51cc8434b1d63a44b9bd1Pirama Arumuga Nainar// This file implements float to unsigned integer conversion for the 117c9150579ed0278492f51cc8434b1d63a44b9bd1Pirama Arumuga Nainar// compiler-rt library. 127c9150579ed0278492f51cc8434b1d63a44b9bd1Pirama Arumuga Nainar// 137c9150579ed0278492f51cc8434b1d63a44b9bd1Pirama Arumuga Nainar//===----------------------------------------------------------------------===// 147c9150579ed0278492f51cc8434b1d63a44b9bd1Pirama Arumuga Nainar 157c9150579ed0278492f51cc8434b1d63a44b9bd1Pirama Arumuga Nainar#include "fp_lib.h" 167c9150579ed0278492f51cc8434b1d63a44b9bd1Pirama Arumuga Nainar 177c9150579ed0278492f51cc8434b1d63a44b9bd1Pirama Arumuga Nainarstatic inline fixuint_t __fixuint(fp_t a) { 187c9150579ed0278492f51cc8434b1d63a44b9bd1Pirama Arumuga Nainar // Break a into sign, exponent, significand 197c9150579ed0278492f51cc8434b1d63a44b9bd1Pirama Arumuga Nainar const rep_t aRep = toRep(a); 207c9150579ed0278492f51cc8434b1d63a44b9bd1Pirama Arumuga Nainar const rep_t aAbs = aRep & absMask; 217c9150579ed0278492f51cc8434b1d63a44b9bd1Pirama Arumuga Nainar const int sign = aRep & signBit ? -1 : 1; 227c9150579ed0278492f51cc8434b1d63a44b9bd1Pirama Arumuga Nainar const int exponent = (aAbs >> significandBits) - exponentBias; 237c9150579ed0278492f51cc8434b1d63a44b9bd1Pirama Arumuga Nainar const rep_t significand = (aAbs & significandMask) | implicitBit; 247c9150579ed0278492f51cc8434b1d63a44b9bd1Pirama Arumuga Nainar 257c9150579ed0278492f51cc8434b1d63a44b9bd1Pirama Arumuga Nainar // If either the value or the exponent is negative, the result is zero. 267c9150579ed0278492f51cc8434b1d63a44b9bd1Pirama Arumuga Nainar if (sign == -1 || exponent < 0) 277c9150579ed0278492f51cc8434b1d63a44b9bd1Pirama Arumuga Nainar return 0; 287c9150579ed0278492f51cc8434b1d63a44b9bd1Pirama Arumuga Nainar 297c9150579ed0278492f51cc8434b1d63a44b9bd1Pirama Arumuga Nainar // If the value is too large for the integer type, saturate. 307c9150579ed0278492f51cc8434b1d63a44b9bd1Pirama Arumuga Nainar if ((unsigned)exponent > sizeof(fixuint_t) * CHAR_BIT) 317c9150579ed0278492f51cc8434b1d63a44b9bd1Pirama Arumuga Nainar return ~(fixuint_t)0; 327c9150579ed0278492f51cc8434b1d63a44b9bd1Pirama Arumuga Nainar 337c9150579ed0278492f51cc8434b1d63a44b9bd1Pirama Arumuga Nainar // If 0 <= exponent < significandBits, right shift to get the result. 347c9150579ed0278492f51cc8434b1d63a44b9bd1Pirama Arumuga Nainar // Otherwise, shift left. 357c9150579ed0278492f51cc8434b1d63a44b9bd1Pirama Arumuga Nainar if (exponent < significandBits) 367c9150579ed0278492f51cc8434b1d63a44b9bd1Pirama Arumuga Nainar return significand >> (significandBits - exponent); 377c9150579ed0278492f51cc8434b1d63a44b9bd1Pirama Arumuga Nainar else 387c9150579ed0278492f51cc8434b1d63a44b9bd1Pirama Arumuga Nainar return (fixuint_t)significand << (exponent - significandBits); 397c9150579ed0278492f51cc8434b1d63a44b9bd1Pirama Arumuga Nainar} 40