(root)/
glibc-2.38/
sysdeps/
m68k/
m680x0/
fpu/
e_scalb.c
       1  /* Copyright (C) 1997-2023 Free Software Foundation, Inc.
       2     This file is part of the GNU C Library.
       3  
       4     The GNU C Library is free software; you can redistribute it and/or
       5     modify it under the terms of the GNU Lesser General Public
       6     License as published by the Free Software Foundation; either
       7     version 2.1 of the License, or (at your option) any later version.
       8  
       9     The GNU C Library is distributed in the hope that it will be useful,
      10     but WITHOUT ANY WARRANTY; without even the implied warranty of
      11     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
      12     Lesser General Public License for more details.
      13  
      14     You should have received a copy of the GNU Lesser General Public
      15     License along with the GNU C Library.  If not, see
      16     <https://www.gnu.org/licenses/>.  */
      17  
      18  #include <math.h>
      19  #include <math_private.h>
      20  #include "mathimpl.h"
      21  #include <libm-alias-finite.h>
      22  
      23  #ifndef SUFF
      24  #define SUFF
      25  #endif
      26  #ifndef float_type
      27  #define float_type double
      28  #endif
      29  
      30  #define CONCATX(a,b) __CONCAT(a,b)
      31  #define s(name) CONCATX(name,SUFF)
      32  #define m81(func) __m81_u(s(func))
      33  
      34  float_type
      35  s(__ieee754_scalb) (float_type x, float_type fn)
      36  {
      37    float_type retval;
      38    unsigned long x_cond = __m81_test (x);
      39    unsigned long fn_cond = __m81_test (fn);
      40  
      41    if ((x_cond | fn_cond) & __M81_COND_NAN)
      42      return x * fn;
      43  
      44    if (fn_cond & __M81_COND_INF)
      45      {
      46        if (!(fn_cond & __M81_COND_NEG))
      47  	return x * fn;
      48        else if (x_cond & __M81_COND_ZERO)
      49  	return x;
      50        else
      51  	return x / -fn;
      52      }
      53  
      54    if (m81(__rint) (fn) != fn)
      55      return (x - x) / (x - x);
      56  
      57    __asm ("fscale%.x %1, %0" : "=f" (retval) : "f" (fn), "0" (x));
      58    return retval;
      59  }
      60  libm_alias_finite (s(__ieee754_scalb), s (__scalb))