(root)/
gcc-13.2.0/
libquadmath/
math/
logbq.c
       1  /* s_logbl.c -- long double version of s_logb.c.
       2   * Conversion to IEEE quad long double by Jakub Jelinek, jj@ultra.linux.cz.
       3   */
       4  
       5  /*
       6   * ====================================================
       7   * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
       8   *
       9   * Developed at SunPro, a Sun Microsystems, Inc. business.
      10   * Permission to use, copy, modify, and distribute this
      11   * software is freely granted, provided that this notice
      12   * is preserved.
      13   * ====================================================
      14   */
      15  
      16  #if defined(LIBM_SCCS) && !defined(lint)
      17  static char rcsid[] = "$NetBSD: $";
      18  #endif
      19  
      20  /*
      21   * long double logbq(x)
      22   * IEEE 754 logb. Included to pass IEEE test suite. Not recommend.
      23   * Use ilogb instead.
      24   */
      25  
      26  #include "quadmath-imp.h"
      27  
      28  __float128
      29  logbq (__float128 x)
      30  {
      31    int64_t lx, hx, ex;
      32  
      33    GET_FLT128_WORDS64 (hx, lx, x);
      34    hx &= 0x7fffffffffffffffLL;	/* high |x| */
      35    if ((hx | lx) == 0)
      36      return -1.0 / fabsq (x);
      37    if (hx >= 0x7fff000000000000LL)
      38      return x * x;
      39    if ((ex = hx >> 48) == 0)	/* IEEE 754 logb */
      40      {
      41        /* POSIX specifies that denormal number is treated as
      42           though it were normalized.  */
      43        int ma;
      44        if (hx == 0)
      45  	ma = __builtin_clzll (lx) + 64;
      46        else
      47  	ma = __builtin_clzll (hx);
      48        ex -= ma - 16;
      49      }
      50    return (__float128) (ex - 16383);
      51  }