diff options
Diffstat (limited to 'ports/sysdeps/m68k/m680x0/fpu/s_cexp.c')
-rw-r--r-- | ports/sysdeps/m68k/m680x0/fpu/s_cexp.c | 136 |
1 files changed, 0 insertions, 136 deletions
diff --git a/ports/sysdeps/m68k/m680x0/fpu/s_cexp.c b/ports/sysdeps/m68k/m680x0/fpu/s_cexp.c deleted file mode 100644 index 79a2ca49c3..0000000000 --- a/ports/sysdeps/m68k/m680x0/fpu/s_cexp.c +++ /dev/null @@ -1,136 +0,0 @@ -/* Complex exponential function. m68k fpu version - Copyright (C) 1997-2014 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Andreas Schwab <schwab@issan.informatik.uni-dortmund.de> - - 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, see - <http://www.gnu.org/licenses/>. */ - -#include <float.h> -#include <complex.h> -#include <math.h> -#include "mathimpl.h" - -#ifndef SUFF -#define SUFF -#endif -#ifndef float_type -#define float_type double -#endif - -#define CONCATX(a,b) __CONCAT(a,b) -#define s(name) CONCATX(name,SUFF) -#define m81(func) __m81_u(s(func)) - -__complex__ float_type -s(__cexp) (__complex__ float_type x) -{ - __complex__ float_type retval; - unsigned long ix_cond; - - ix_cond = __m81_test (__imag__ x); - - if ((ix_cond & (__M81_COND_NAN|__M81_COND_INF)) == 0) - { - /* Imaginary part is finite. */ - unsigned long rx_cond = __m81_test (__real__ x); - - if ((rx_cond & (__M81_COND_NAN|__M81_COND_INF)) == 0) - { - const int t = (int) ((LDBL_MAX_EXP - 1) * M_LN2l); - long double sin_ix, cos_ix, exp_val; - - __m81_u (__sincosl) (__imag__ x, &sin_ix, &cos_ix); - - if (__real__ x > t) - { - long double exp_t = __m81_u(__ieee754_expl) (t); - __real__ x -= t; - sin_ix *= exp_t; - cos_ix *= exp_t; - if (__real__ x > t) - { - __real__ x -= t; - sin_ix *= exp_t; - cos_ix *= exp_t; - } - } - - exp_val = __m81_u(__ieee754_expl) (__real__ x); - __real__ retval = exp_val * cos_ix; - if (ix_cond & __M81_COND_ZERO) - __imag__ retval = __imag__ x; - else - __imag__ retval = exp_val * sin_ix; - } - else - { - /* Compute the sign of the result. */ - long double remainder, pi_2; - int quadrant; - - if ((rx_cond & (__M81_COND_NAN|__M81_COND_NEG)) == __M81_COND_NEG) - __real__ retval = __imag__ retval = 0.0; - else - __real__ retval = __imag__ retval = __real__ x; - __asm ("fmovecr %#0,%0\n\tfscale%.w %#-1,%0" : "=f" (pi_2)); - __asm ("fmod%.x %2,%0\n\tfmove%.l %/fpsr,%1" - : "=f" (remainder), "=dm" (quadrant) - : "f" (pi_2), "0" (__imag__ x)); - quadrant = (quadrant >> 16) & 0x83; - if (quadrant & 0x80) - quadrant ^= 0x83; - switch (quadrant) - { - default: - break; - case 1: - __real__ retval = -__real__ retval; - break; - case 2: - __real__ retval = -__real__ retval; - case 3: - __imag__ retval = -__imag__ retval; - break; - } - if (ix_cond & __M81_COND_ZERO && (rx_cond & __M81_COND_NAN) == 0) - __imag__ retval = __imag__ x; - } - } - else - { - unsigned long rx_cond = __m81_test (__real__ x); - - if (rx_cond & __M81_COND_INF) - { - /* Real part is infinite. */ - if (rx_cond & __M81_COND_NEG) - { - __real__ retval = __imag__ retval = 0.0; - if (ix_cond & __M81_COND_NEG) - __imag__ retval = -__imag__ retval; - } - else - { - __real__ retval = __real__ x; - __imag__ retval = __imag__ x - __imag__ x; - } - } - else - __real__ retval = __imag__ retval = __imag__ x - __imag__ x; - } - - return retval; -} -weak_alias (s(__cexp), s(cexp)) |