* sysdeps/m68k/fpu/bits/mathinline.h: Don't inline frexp.
* sysdeps/m68k/fpu/s_frexp.c: Put implementation here. * sysdeps/m68k/fpu/s_frexpl.c: Fix to handle unnormalized numbers.
This commit is contained in:
parent
1e2e27fd8b
commit
a2c8310fb0
@ -1,5 +1,6 @@
|
||||
/* Definitions of inline math functions implemented by the m68881/2.
|
||||
Copyright (C) 1991,92,93,94,96,97,98,99,2000,2002 Free Software Foundation, Inc.
|
||||
Copyright (C) 1991,92,93,94,96,97,98,99,2000,2002, 2003
|
||||
Free Software Foundation, Inc.
|
||||
This file is part of the GNU C Library.
|
||||
|
||||
The GNU C Library is free software; you can redistribute it and/or
|
||||
@ -176,28 +177,6 @@ __inline_mathop(trunc, intrz)
|
||||
for the function names. */
|
||||
|
||||
#define __inline_functions(float_type, s) \
|
||||
__m81_inline float_type \
|
||||
__m81_u(__CONCAT(__frexp,s))(float_type __value, int *__expptr) __THROW \
|
||||
{ \
|
||||
float_type __mantissa, __exponent; \
|
||||
int __iexponent; \
|
||||
unsigned long __fpsr; \
|
||||
__asm("ftst%.x %1\n" \
|
||||
"fmove%.l %/fpsr, %0" : "=dm" (__fpsr) : "f" (__value)); \
|
||||
if (__fpsr & (7 << 24)) \
|
||||
{ \
|
||||
/* Not finite or zero. */ \
|
||||
*__expptr = 0; \
|
||||
return __value; \
|
||||
} \
|
||||
__asm("fgetexp%.x %1, %0" : "=f" (__exponent) : "f" (__value)); \
|
||||
__iexponent = (int) __exponent + 1; \
|
||||
*__expptr = __iexponent; \
|
||||
__asm("fscale%.l %2, %0" : "=f" (__mantissa) \
|
||||
: "0" (__value), "dmi" (-__iexponent)); \
|
||||
return __mantissa; \
|
||||
} \
|
||||
\
|
||||
__m81_defun (float_type, __CONCAT(__floor,s), (float_type __x)) __THROW \
|
||||
{ \
|
||||
float_type __result; \
|
||||
@ -386,8 +365,6 @@ extern __inline rettype name args1 __THROW \
|
||||
return __CONCAT(__,name) args2; \
|
||||
}
|
||||
|
||||
__inline_forward(double,frexp, (double __value, int *__expptr),
|
||||
(__value, __expptr))
|
||||
__inline_forward_c(double,floor, (double __x), (__x))
|
||||
__inline_forward_c(double,ceil, (double __x), (__x))
|
||||
# ifdef __USE_MISC
|
||||
@ -416,8 +393,6 @@ __inline_forward(void,sincos, (double __x, double *__sinx, double *__cosx),
|
||||
|
||||
# if defined __USE_MISC || defined __USE_ISOC99
|
||||
|
||||
__inline_forward(float,frexpf, (float __value, int *__expptr),
|
||||
(__value, __expptr))
|
||||
__inline_forward_c(float,floorf, (float __x), (__x))
|
||||
__inline_forward_c(float,ceilf, (float __x), (__x))
|
||||
# ifdef __USE_MISC
|
||||
@ -438,8 +413,6 @@ __inline_forward(void,sincosf, (float __x, float *__sinx, float *__cosx),
|
||||
(__x, __sinx, __cosx))
|
||||
# endif
|
||||
|
||||
__inline_forward(long double,frexpl, (long double __value, int *__expptr),
|
||||
(__value, __expptr))
|
||||
__inline_forward_c(long double,floorl, (long double __x), (__x))
|
||||
__inline_forward_c(long double,ceill, (long double __x), (__x))
|
||||
# ifdef __USE_MISC
|
||||
|
@ -1,4 +1,4 @@
|
||||
/* Copyright (C) 1996, 1997 Free Software Foundation, Inc.
|
||||
/* Copyright (C) 1996, 1997, 2003 Free Software Foundation, Inc.
|
||||
This file is part of the GNU C Library.
|
||||
|
||||
The GNU C Library is free software; you can redistribute it and/or
|
||||
@ -28,11 +28,28 @@
|
||||
#define __CONCATX(a,b) __CONCAT(a,b)
|
||||
|
||||
float_type
|
||||
__CONCATX(__,FUNC) (value, expptr)
|
||||
float_type value;
|
||||
int *expptr;
|
||||
__CONCATX(__,FUNC) (float_type value, int *expptr)
|
||||
{
|
||||
return __m81_u(__CONCATX(__,FUNC))(value, expptr);
|
||||
float_type mantissa, exponent;
|
||||
int iexponent;
|
||||
unsigned long fpsr;
|
||||
|
||||
__asm ("ftst%.x %1\n"
|
||||
"fmove%.l %/fpsr, %0"
|
||||
: "=dm" (fpsr) : "f" (value));
|
||||
if (fpsr & (7 << 24))
|
||||
{
|
||||
/* Not finite or zero. */
|
||||
*expptr = 0;
|
||||
return value;
|
||||
}
|
||||
__asm ("fgetexp%.x %1, %0" : "=f" (exponent) : "f" (value));
|
||||
iexponent = (int) exponent + 1;
|
||||
*expptr = iexponent;
|
||||
__asm ("fscale%.l %2, %0"
|
||||
: "=f" (mantissa)
|
||||
: "0" (value), "dmi" (-iexponent));
|
||||
return mantissa;
|
||||
}
|
||||
|
||||
#define weak_aliasx(a,b) weak_alias(a,b)
|
||||
|
@ -1,3 +1,59 @@
|
||||
#define FUNC frexpl
|
||||
#define float_type long double
|
||||
#include <s_frexp.c>
|
||||
/* Copyright (C) 2003 Free Software Foundation, Inc.
|
||||
This file is part of the GNU C Library.
|
||||
|
||||
The GNU C Library is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU Lesser General Public
|
||||
License as published by the Free Software Foundation; either
|
||||
version 2.1 of the License, or (at your option) any later version.
|
||||
|
||||
The GNU C Library is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
Lesser General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public
|
||||
License along with the GNU C Library; if not, write to the Free
|
||||
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
|
||||
02111-1307 USA. */
|
||||
|
||||
#include <math.h>
|
||||
|
||||
long double
|
||||
__frexpl (long double value, int *expptr)
|
||||
{
|
||||
long double mantissa, exponent;
|
||||
int iexponent;
|
||||
unsigned long fpsr;
|
||||
|
||||
__asm ("ftst%.x %1\n"
|
||||
"fmove%.l %/fpsr, %0"
|
||||
: "=dm" (fpsr) : "f" (value));
|
||||
if (fpsr & (7 << 24))
|
||||
{
|
||||
/* Not finite or zero. */
|
||||
*expptr = 0;
|
||||
return value;
|
||||
}
|
||||
__asm ("fgetexp%.x %1, %0" : "=f" (exponent) : "f" (value));
|
||||
iexponent = (int) exponent + 1;
|
||||
*expptr = iexponent;
|
||||
/* Unnormalized numbers must be handled specially, otherwise fscale
|
||||
results in overflow. */
|
||||
if (iexponent <= -16384)
|
||||
{
|
||||
value *= 0x1p16383L;
|
||||
iexponent += 16383;
|
||||
}
|
||||
else if (iexponent >= 16384)
|
||||
{
|
||||
value *= 0x1p-16383L;
|
||||
iexponent -= 16383;
|
||||
}
|
||||
|
||||
__asm ("fscale%.l %2, %0"
|
||||
: "=f" (mantissa)
|
||||
: "0" (value), "dmi" (-iexponent));
|
||||
return mantissa;
|
||||
}
|
||||
|
||||
weak_alias (__frexpl, frexpl)
|
||||
|
Loading…
Reference in New Issue
Block a user