(root)/
gcc-13.2.0/
libgcc/
config/
aarch64/
sfp-exceptions.c
       1  /*
       2   * Copyright (C) 2012-2023 Free Software Foundation, Inc.
       3   *
       4   * This file is free software; you can redistribute it and/or modify it
       5   * under the terms of the GNU General Public License as published by the
       6   * Free Software Foundation; either version 3, or (at your option) any
       7   * later version.
       8   *
       9   * This file is distributed in the hope that it will be useful, but
      10   * WITHOUT ANY WARRANTY; without even the implied warranty of
      11   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
      12   * General Public License for more details.
      13   *
      14   * Under Section 7 of GPL version 3, you are granted additional
      15   * permissions described in the GCC Runtime Library Exception, version
      16   * 3.1, as published by the Free Software Foundation.
      17   *
      18   * You should have received a copy of the GNU General Public License and
      19   * a copy of the GCC Runtime Library Exception along with this program;
      20   * see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
      21   * <http://www.gnu.org/licenses/>.
      22   */
      23  
      24  #include "sfp-machine.h"
      25  
      26  void
      27  __sfp_handle_exceptions (int _fex)
      28  {
      29    const float fp_max = __FLT_MAX__;
      30    const float fp_min = __FLT_MIN__;
      31    const float fp_1e32 = 1.0e32f;
      32    const float fp_zero = 0.0;
      33    const float fp_one = 1.0;
      34    unsigned fpsr;
      35  
      36    if (_fex & FP_EX_INVALID)
      37      {
      38        __asm__ __volatile__ ("fdiv\ts0, %s0, %s0"
      39  			    :
      40  			    : "w" (fp_zero)
      41  			    : "s0");
      42        __asm__ __volatile__ ("mrs\t%0, fpsr" : "=r" (fpsr));
      43      }
      44    if (_fex & FP_EX_DIVZERO)
      45      {
      46        __asm__ __volatile__ ("fdiv\ts0, %s0, %s1"
      47  			    :
      48  			    : "w" (fp_one), "w" (fp_zero)
      49  			    : "s0");
      50        __asm__ __volatile__ ("mrs\t%0, fpsr" : "=r" (fpsr));
      51      }
      52    if (_fex & FP_EX_OVERFLOW)
      53      {
      54        __asm__ __volatile__ ("fadd\ts0, %s0, %s1"
      55  			    :
      56  			    : "w" (fp_max), "w" (fp_1e32)
      57  			    : "s0");
      58        __asm__ __volatile__ ("mrs\t%0, fpsr" : "=r" (fpsr));
      59      }
      60    if (_fex & FP_EX_UNDERFLOW)
      61      {
      62        __asm__ __volatile__ ("fmul\ts0, %s0, %s0"
      63  			    :
      64  			    : "w" (fp_min)
      65  			    : "s0");
      66        __asm__ __volatile__ ("mrs\t%0, fpsr" : "=r" (fpsr));
      67      }
      68    if (_fex & FP_EX_INEXACT)
      69      {
      70        __asm__ __volatile__ ("fsub\ts0, %s0, %s1"
      71  			    :
      72  			    : "w" (fp_max), "w" (fp_one)
      73  			    : "s0");
      74        __asm__ __volatile__ ("mrs\t%0, fpsr" : "=r" (fpsr));
      75      }
      76  }