fb422e6d31
Merge the projects/clang-sparc64 branch back to head. This brings in several updates from the llvm and clang trunks to make the sparc64 backend fully functional. Apart from one patch to sys/sparc64/include/pcpu.h which is still under discussion, this makes it possible to let clang fully build world and kernel for sparc64. Any assistance with testing this on actual sparc64 hardware is greatly appreciated, as there will unavoidably be bugs left. Many thanks go to Roman Divacky for his upstream work on getting the sparc64 backend into shape. MFC r262985: Repair a few minor mismerges from r262261 in the clang-sparc64 project branch. This is also to minimize differences with upstream.
48 lines
1.3 KiB
C
48 lines
1.3 KiB
C
/* ===-- fixunssfti.c - Implement __fixunssfti -----------------------------===
|
|
*
|
|
* The LLVM Compiler Infrastructure
|
|
*
|
|
* This file is dual licensed under the MIT and the University of Illinois Open
|
|
* Source Licenses. See LICENSE.TXT for details.
|
|
*
|
|
* ===----------------------------------------------------------------------===
|
|
*
|
|
* This file implements __fixunssfti for the compiler_rt library.
|
|
*
|
|
* ===----------------------------------------------------------------------===
|
|
*/
|
|
|
|
#include "int_lib.h"
|
|
|
|
#ifdef CRT_HAS_128BIT
|
|
|
|
/* Returns: convert a to a unsigned long long, rounding toward zero.
|
|
* Negative values all become zero.
|
|
*/
|
|
|
|
/* Assumption: float is a IEEE 32 bit floating point type
|
|
* tu_int is a 64 bit integral type
|
|
* value in float is representable in tu_int or is negative
|
|
* (no range checking performed)
|
|
*/
|
|
|
|
/* seee eeee emmm mmmm mmmm mmmm mmmm mmmm */
|
|
|
|
tu_int
|
|
__fixunssfti(float a)
|
|
{
|
|
float_bits fb;
|
|
fb.f = a;
|
|
int e = ((fb.u & 0x7F800000) >> 23) - 127;
|
|
if (e < 0 || (fb.u & 0x80000000))
|
|
return 0;
|
|
tu_int r = (fb.u & 0x007FFFFF) | 0x00800000;
|
|
if (e > 23)
|
|
r <<= (e - 23);
|
|
else
|
|
r >>= (23 - e);
|
|
return r;
|
|
}
|
|
|
|
#endif /* CRT_HAS_128BIT */
|