blob: 5760d26ecb416e8687ad3862b7f3d743c0d5d1b2 [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) /* IEEE 754 logb */
return -1022.0;
return (double) (hx - 1023);
#else
double res = 0.0;
asm ("fxtract\n\t"
"fstp %%st" : "=t" (res) : "0" (x));
return res;
#endif
}