| /** |
| * 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 |
| } |