(root)/
glibc-2.38/
sysdeps/
sparc/
sparc64/
qp_util.c
       1  /* Software floating-point emulation.
       2     Helper routine for _Qp_* 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  void __Qp_handle_exceptions(int exceptions)
      27  {
      28    if (exceptions & FP_EX_INVALID)
      29      {
      30        float f = 0.0;
      31        __asm__ __volatile__ ("fdivs %0, %0, %0" : "+f" (f));
      32      }
      33    if (exceptions & FP_EX_DIVZERO)
      34      {
      35        float f = 1.0, g = 0.0;
      36        __asm__ __volatile__ ("fdivs %0, %1, %0"
      37  			    : "+f" (f)
      38  			    : "f" (g));
      39      }
      40    if (exceptions & FP_EX_OVERFLOW)
      41      {
      42        float f = FLT_MAX;
      43        __asm__ __volatile__("fmuls %0, %0, %0" : "+f" (f));
      44        exceptions &= ~FP_EX_INEXACT;
      45      }
      46    if (exceptions & FP_EX_UNDERFLOW)
      47      {
      48        float f = FLT_MIN;
      49        __asm__ __volatile__("fmuls %0, %0, %0" : "+f" (f));
      50        exceptions &= ~FP_EX_INEXACT;
      51      }
      52    if (exceptions & FP_EX_INEXACT)
      53      {
      54        double d = 1.0, e = M_PI;
      55        __asm__ __volatile__ ("fdivd %0, %1, %0"
      56  			    : "+f" (d)
      57  			    : "f" (e));
      58      }
      59  }