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