blob: 2d62233ed5d1582398e3f18390f73bd6eec2a59e [file] [log] [blame]
/**
* 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
}