mirror of
https://github.com/jart/cosmopolitan.git
synced 2025-01-31 11:37:35 +00:00
7e0a09feec
This change ports APE Loader to Linux AARCH64, so that Raspberry Pi users can run programs like redbean, without the executable needing to modify itself. Progress has also slipped into this change on the issue of making progress better conforming to user expectations and industry standards regarding which symbols we're allowed to declare
53 lines
1.6 KiB
C
53 lines
1.6 KiB
C
/* clang-format off */
|
|
//===-- lib/floatunsidf.c - uint -> double-precision conversion ---*- C -*-===//
|
|
//
|
|
// 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 unsigned integer to double-precision conversion for the
|
|
// compiler-rt library in the IEEE-754 default round-to-nearest, ties-to-even
|
|
// mode.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
__static_yoink("huge_compiler_rt_license");
|
|
|
|
#define DOUBLE_PRECISION
|
|
#include "third_party/compiler_rt/fp_lib.inc"
|
|
|
|
#include "third_party/compiler_rt/int_lib.h"
|
|
|
|
COMPILER_RT_ABI fp_t
|
|
__floatunsidf(unsigned int a) {
|
|
|
|
const int aWidth = sizeof a * CHAR_BIT;
|
|
|
|
// Handle zero as a special case to protect clz
|
|
if (a == 0) return fromRep(0);
|
|
|
|
// Exponent of (fp_t)a is the width of abs(a).
|
|
const int exponent = (aWidth - 1) - __builtin_clz(a);
|
|
rep_t result;
|
|
|
|
// Shift a into the significand field and clear the implicit bit.
|
|
const int shift = significandBits - exponent;
|
|
result = (rep_t)a << shift ^ implicitBit;
|
|
|
|
// Insert the exponent
|
|
result += (rep_t)(exponent + exponentBias) << significandBits;
|
|
return fromRep(result);
|
|
}
|
|
|
|
#if defined(__ARM_EABI__)
|
|
#if defined(COMPILER_RT_ARMHF_TARGET)
|
|
AEABI_RTABI fp_t __aeabi_ui2d(unsigned int a) {
|
|
return __floatunsidf(a);
|
|
}
|
|
#else
|
|
AEABI_RTABI fp_t __aeabi_ui2d(unsigned int a) COMPILER_RT_ALIAS(__floatunsidf);
|
|
#endif
|
|
#endif
|