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    double d;
      30  
      31    if (_fex & FP_EX_INVALID)
      32      {
      33        asm volatile ("frcpa.s0 %0, p1 = f0, f0" : "=f" (d) : : "p1");
      34      }
      35    if (_fex & FP_EX_DIVZERO)
      36      {
      37        asm volatile ("frcpa.s0 %0, p1 = f1, f0" : "=f" (d) : : "p1");
      38      }
      39    if (_fex & FP_EX_OVERFLOW)
      40      {
      41        d = __DBL_MAX__;
      42        asm volatile ("fadd.d.s0 %0 = %0, %0" : "+f" (d));
      43      }
      44    if (_fex & FP_EX_UNDERFLOW)
      45      {
      46        d = __DBL_MIN__;
      47        asm volatile ("fnma.d.s0 %0 = %0, %0, f0" : "+f" (d));
      48      }
      49    if (_fex & FP_EX_INEXACT)
      50      {
      51        d = __DBL_MAX__;
      52        asm volatile ("fsub.d.s0 %0 = %0, f1" : "+f" (d));
      53      }
      54  }