• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /**
2  * This file has no copyright assigned and is placed in the Public Domain.
3  * This file is part of the mingw-w64 runtime package.
4  * No warranty is given; refer to the file DISCLAIMER.PD within this package.
5  */
6 /*
7  * Written by J.T. Conklin <jtc@netbsd.org>.
8  * Changes for long double by Ulrich Drepper <drepper@cygnus.com>
9  * Public domain.
10  */
11 
12 #include <math.h>
13 
14 double
logb(double x)15 logb (double x)
16 {
17 #ifdef __x86_64__
18   __mingw_dbl_type_t hlp;
19   int lx, hx;
20 
21   hlp.x = x;
22   lx = hlp.lh.low;
23   hx = hlp.lh.high & 0x7fffffff; /* high |x| */
24   if ((hx | lx) == 0)
25     return -1.0 / fabs (x);
26   if (hx >= 0x7ff00000)
27     return x * x;
28   if ((hx >>= 20) == 0) {
29     unsigned long long mantissa = hlp.val & 0xfffffffffffffULL;
30     return -1023.0 - (__builtin_clzll(mantissa) - 12);
31   }
32   return (double) (hx - 1023);
33 #else
34   double res = 0.0;
35   asm volatile (
36        "fxtract\n\t"
37        "fstp	%%st" : "=t" (res) : "0" (x));
38   return res;
39 #endif
40 }
41