(root)/
glibc-2.38/
sysdeps/
sparc/
sparc32/
q_util.c
       1  /* Software floating-point emulation.
       2     Helper routine for _Q_* routines.
       3     Simulate exceptions using double arithmetics.
       4     Copyright (C) 1999-2023 Free Software Foundation, Inc.
       5     This file is part of the GNU C Library.
       6  
       7     The GNU C Library is free software; you can redistribute it and/or
       8     modify it under the terms of the GNU Lesser General Public
       9     License as published by the Free Software Foundation; either
      10     version 2.1 of the License, or (at your option) any later version.
      11  
      12     The GNU C Library is distributed in the hope that it will be useful,
      13     but WITHOUT ANY WARRANTY; without even the implied warranty of
      14     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
      15     Lesser General Public License for more details.
      16  
      17     You should have received a copy of the GNU Lesser General Public
      18     License along with the GNU C Library; if not, see
      19     <https://www.gnu.org/licenses/>.  */
      20  
      21  #include <float.h>
      22  #include <math.h>
      23  #include <assert.h>
      24  #include "soft-fp.h"
      25  
      26  unsigned long long ___Q_zero = 0x0000000000000000ULL;
      27  
      28  void ___Q_simulate_exceptions(int exceptions)
      29  {
      30    if (exceptions & FP_EX_INVALID)
      31      {
      32        float f = 0.0;
      33        __asm__ __volatile__ ("fdivs %0, %0, %0" : "+f" (f));
      34      }
      35    if (exceptions & FP_EX_DIVZERO)
      36      {
      37        float f = 1.0, g = 0.0;
      38        __asm__ __volatile__ ("fdivs %0, %1, %0"
      39  			    : "+f" (f)
      40  			    : "f" (g));
      41      }
      42    if (exceptions & FP_EX_OVERFLOW)
      43      {
      44        float f = FLT_MAX;
      45        __asm__ __volatile__("fmuls %0, %0, %0" : "+f" (f));
      46        exceptions &= ~FP_EX_INEXACT;
      47      }
      48    if (exceptions & FP_EX_UNDERFLOW)
      49      {
      50        float f = FLT_MIN;
      51        __asm__ __volatile__("fmuls %0, %0, %0" : "+f" (f));
      52        exceptions &= ~FP_EX_INEXACT;
      53      }
      54    if (exceptions & FP_EX_INEXACT)
      55      {
      56        double d = 1.0, e = M_PI;
      57        __asm__ __volatile__ ("fdivd %0, %1, %0"
      58  			    : "+f" (d)
      59  			    : "f" (e));
      60      }
      61  }