fix bit masking hack in ilogbl
[libm] / src / math / ilogbl.c
1 #include <limits.h>
2 #include "libm.h"
3 #if LD64
4 int ilogbl(long double x)
5 {
6         return ilogb(x);
7 }
8 #elif LD80
9 int ilogbl(long double x)
10 {
11         union ldshape u = {x};
12         uint64_t m = u.bits.m;
13         int e = u.bits.exp;
14
15         if (!e) {
16                 if (m == 0)
17                         return FP_ILOGB0;
18                 /* subnormal x */
19                 for (e = -0x3fff+1; m < (uint64_t)1<<63; e--, m<<=1);
20                 return e;
21         }
22         if (e == 0x7fff)
23                 /* in ld80 msb is set in inf */
24                 return m & ~((uint64_t)1<<63) ? FP_ILOGBNAN : INT_MAX;
25         return e - 0x3fff;
26 }
27 #endif