| /** | |
| * 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> | |
| float | |
| logbf (float x) | |
| { | |
| #ifdef __x86_64__ | |
| int v; | |
| __mingw_flt_type_t hlp; | |
| hlp.x = x; | |
| v = hlp.val & 0x7fffffff; /* high |x| */ | |
| if (!v) | |
| return (float)-1.0 / fabsf (x); | |
| if (v >= 0x7f800000) | |
| return x * x; | |
| if ((v >>= 23) == 0) | |
| return -127.0 - (__builtin_clzl(hlp.val & 0x7fffff) - 9); | |
| return (float) (v - 127); | |
| #else | |
| float res = 0.0F; | |
| asm volatile ( | |
| "fxtract\n\t" | |
| "fstp %%st" : "=t" (res) : "0" (x)); | |
| return res; | |
| #endif | |
| } |