(root)/
glibc-2.38/
sysdeps/
ieee754/
ldbl-128ibm/
s_floorl.c
       1  /* Round to int long double floating-point values.
       2     IBM extended format long double version.
       3     Copyright (C) 2006-2023 Free Software Foundation, Inc.
       4     This file is part of the GNU C Library.
       5  
       6     The GNU C Library is free software; you can redistribute it and/or
       7     modify it under the terms of the GNU Lesser General Public
       8     License as published by the Free Software Foundation; either
       9     version 2.1 of the License, or (at your option) any later version.
      10  
      11     The GNU C Library is distributed in the hope that it will be useful,
      12     but WITHOUT ANY WARRANTY; without even the implied warranty of
      13     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
      14     Lesser General Public License for more details.
      15  
      16     You should have received a copy of the GNU Lesser General Public
      17     License along with the GNU C Library; if not, see
      18     <https://www.gnu.org/licenses/>.  */
      19  
      20  #define NO_MATH_REDIRECT
      21  #include <math.h>
      22  #include <math_private.h>
      23  #include <math_ldbl_opt.h>
      24  #include <float.h>
      25  #include <ieee754.h>
      26  
      27  double floor (double) asm ("__floor");
      28  
      29  
      30  long double
      31  __floorl (long double x)
      32  {
      33    double xh, xl, hi, lo;
      34  
      35    ldbl_unpack (x, &xh, &xl);
      36  
      37    /* Return Inf, Nan, +/-0 unchanged.  */
      38    if (__builtin_expect (xh != 0.0
      39  			&& __builtin_isless (__builtin_fabs (xh),
      40  					     __builtin_inf ()), 1))
      41      {
      42        hi = floor (xh);
      43        if (hi != xh)
      44  	{
      45  	  /* The high part is not an integer; the low part does not
      46  	     affect the result.  */
      47  	  xh = hi;
      48  	  xl = 0;
      49  	}
      50        else
      51  	{
      52  	  /* The high part is a nonzero integer.  */
      53  	  lo = floor (xl);
      54  	  xh = hi;
      55  	  xl = lo;
      56  	  ldbl_canonicalize_int (&xh, &xl);
      57  	}
      58      }
      59    else
      60      /* Quiet signaling NaN arguments.  */
      61      xh += xh;
      62  
      63    return ldbl_pack (xh, xl);
      64  }
      65  
      66  long_double_symbol (libm, __floorl, floorl);