1156cd587Sjoerg /* ===-- fixunssfdi.c - Implement __fixunssfdi -----------------------------=== 2156cd587Sjoerg * 3156cd587Sjoerg * The LLVM Compiler Infrastructure 4156cd587Sjoerg * 5156cd587Sjoerg * This file is dual licensed under the MIT and the University of Illinois Open 6156cd587Sjoerg * Source Licenses. See LICENSE.TXT for details. 7156cd587Sjoerg * 8156cd587Sjoerg * ===----------------------------------------------------------------------=== 9156cd587Sjoerg */ 10156cd587Sjoerg 11ef84fd3bSjoerg #define SINGLE_PRECISION 12ef84fd3bSjoerg #include "fp_lib.h" 13156cd587Sjoerg 14ef84fd3bSjoerg #ifndef __SOFT_FP__ 15ef84fd3bSjoerg /* Support for systems that have hardware floating-point; can set the invalid 16ef84fd3bSjoerg * flag as a side-effect of computation. 17ef84fd3bSjoerg */ 18ef84fd3bSjoerg 19156cd587Sjoerg COMPILER_RT_ABI du_int __fixunssfdi(float a)20156cd587Sjoerg__fixunssfdi(float a) 21156cd587Sjoerg { 22ef84fd3bSjoerg if (a <= 0.0f) return 0; 23ef84fd3bSjoerg double da = a; 24ef84fd3bSjoerg su_int high = da / 4294967296.f; /* da / 0x1p32f; */ 25ef84fd3bSjoerg su_int low = da - (double)high * 4294967296.f; /* high * 0x1p32f; */ 26ef84fd3bSjoerg return ((du_int)high << 32) | low; 27156cd587Sjoerg } 28ef84fd3bSjoerg 29ef84fd3bSjoerg #else 30ef84fd3bSjoerg /* Support for systems that don't have hardware floating-point; there are no 31ef84fd3bSjoerg * flags to set, and we don't want to code-gen to an unknown soft-float 32ef84fd3bSjoerg * implementation. 33ef84fd3bSjoerg */ 34ef84fd3bSjoerg 35ef84fd3bSjoerg typedef du_int fixuint_t; 36ef84fd3bSjoerg #include "fp_fixuint_impl.inc" 37ef84fd3bSjoerg 38ef84fd3bSjoerg COMPILER_RT_ABI du_int __fixunssfdi(fp_t a)39ef84fd3bSjoerg__fixunssfdi(fp_t a) { 40ef84fd3bSjoerg return __fixuint(a); 41ef84fd3bSjoerg } 42ef84fd3bSjoerg 43ef84fd3bSjoerg #endif 443044ee7eSrin 453044ee7eSrin #if defined(__ARM_EABI__) 46*d3143459Srin #if defined(COMPILER_RT_ARMHF_TARGET) __aeabi_f2ulz(fp_t a)47*d3143459SrinAEABI_RTABI du_int __aeabi_f2ulz(fp_t a) { 483044ee7eSrin return __fixunssfdi(a); 493044ee7eSrin } 50*d3143459Srin #else 51*d3143459Srin AEABI_RTABI du_int __aeabi_f2ulz(fp_t a) COMPILER_RT_ALIAS(__fixunssfdi); 523044ee7eSrin #endif 53*d3143459Srin #endif 54