brintos

brintos / llvm-project-archived public Read only

0
0
Text · 1.6 KiB · 957c263 Raw
51 lines · c
1//===-- fixunsxfdi.c - Implement __fixunsxfdi -----------------------------===//2//3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.4// See https://llvm.org/LICENSE.txt for license information.5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception6//7//===----------------------------------------------------------------------===//8//9// This file implements __fixunsxfdi for the compiler_rt library.10//11//===----------------------------------------------------------------------===//12 13#if !_ARCH_PPC14 15#include "int_lib.h"16 17// Returns: convert a to a unsigned long long, rounding toward zero.18//          Negative values all become zero.19 20// Assumption: long double is an intel 80 bit floating point type padded with 621// bytes du_int is a 64 bit integral type value in long double is representable22// in du_int or is negative (no range checking performed)23 24// gggg gggg gggg gggg gggg gggg gggg gggg | gggg gggg gggg gggg seee eeee eeee25// eeee | 1mmm mmmm mmmm mmmm mmmm mmmm mmmm mmmm | mmmm mmmm mmmm mmmm mmmm26// mmmm mmmm mmmm27 28#if defined(_MSC_VER) && !defined(__clang__)29// MSVC throws a warning about 'uninitialized variable use' here,30// disable it for builds that warn-as-error31#pragma warning(push)32#pragma warning(disable : 4700)33#endif34 35COMPILER_RT_ABI du_int __fixunsxfdi(xf_float a) {36  xf_bits fb;37  fb.f = a;38  int e = (fb.u.high.s.low & 0x00007FFF) - 16383;39  if (e < 0 || (fb.u.high.s.low & 0x00008000))40    return 0;41  if ((unsigned)e > sizeof(du_int) * CHAR_BIT)42    return ~(du_int)0;43  return fb.u.low.all >> (63 - e);44}45 46#if defined(_MSC_VER) && !defined(__clang__)47#pragma warning(pop)48#endif49 50#endif //!_ARCH_PPC51