#include <stdint.h>
int64_t
__fixsfdi (float x)
{
union { float f; uint32_t u; } u = {x};
uint32_t fabsx = u.u & 0x7fffffffU;
uint32_t exp = fabsx >> 23;
int64_t result = 0;
if (exp - (127U + 31U) >= (63U - 31U))
{
if (exp > (127 + 31))
{
if (x == -0x1.0p63f)
return 0x8000000000000000LL;
uint32_t r = (int32_t) x;
result = (int64_t) r << 32;
r = (r << 1) | (r & 1);
result |= r;
return result;
}
result = (int32_t) x;
return result;
}
result = (fabsx & 0x007fffffU) | 0x00800000;
int64_t signMask = (int64_t) u.u << 32;
signMask >>= 63;
int32_t leftShift = exp - (127 + 23);
result <<= leftShift;
result ^= signMask;
result -= signMask;
return result;
}