blob: d522110e2a832e3b62ca1e932cb56ae15ccc8ec2 [file] [log] [blame]
/**
* This file has no copyright assigned and is placed in the Public Domain.
* This file is part of the mingw-w64 runtime package.
* No warranty is given; refer to the file DISCLAIMER.PD within this package.
*/
/*
* Written by J.T. Conklin <jtc@netbsd.org>.
* Changes for long double by Ulrich Drepper <drepper@cygnus.com>
* Public domain.
*/
#include <math.h>
double
logb (double x)
{
#ifdef __x86_64__
__mingw_dbl_type_t hlp;
int lx, hx;
hlp.x = x;
lx = hlp.lh.low;
hx = hlp.lh.high & 0x7fffffff; /* high |x| */
if ((hx | lx) == 0)
return -1.0 / fabs (x);
if (hx >= 0x7ff00000)
return x * x;
if ((hx >>= 20) == 0) {
unsigned long long mantissa = hlp.val & 0xfffffffffffffULL;
return -1023.0 - (__builtin_clzll(mantissa) - 12);
}
return (double) (hx - 1023);
#else
double res = 0.0;
asm volatile (
"fxtract\n\t"
"fstp %%st" : "=t" (res) : "0" (x));
return res;
#endif
}