1 /* Software floating-point emulation. 2 Helper routine for _Q_* routines. 3 Simulate exceptions using double arithmetics. 4 Copyright (C) 1999 Free Software Foundation, Inc. 5 This file is part of the GNU C Library. 6 Contributed by Jakub Jelinek (jj@ultra.linux.cz). 7 8 The GNU C Library is free software; you can redistribute it and/or 9 modify it under the terms of the GNU Lesser General Public 10 License as published by the Free Software Foundation; either 11 version 2.1 of the License, or (at your option) any later version. 12 13 The GNU C Library is distributed in the hope that it will be useful, 14 but WITHOUT ANY WARRANTY; without even the implied warranty of 15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 16 Lesser General Public License for more details. 17 18 You should have received a copy of the GNU Lesser General Public 19 License along with the GNU C Library; if not, see 20 <http://www.gnu.org/licenses/>. */ 21 22 #include "soft-fp.h" 23 24 unsigned long long ___Q_numbers [] = { 25 0x0000000000000000ULL, /* Zero */ 26 0x0010100000000000ULL, /* Very tiny number */ 27 0x0010000000000000ULL, /* Minimum normalized number */ 28 0x7fef000000000000ULL, /* A huge double number */ 29 }; 30 ___Q_simulate_exceptions(int exceptions)31double ___Q_simulate_exceptions(int exceptions) 32 { 33 double d, *p = (double *)___Q_numbers; 34 if (exceptions & FP_EX_INVALID) 35 d = p[0]/p[0]; 36 if (exceptions & FP_EX_OVERFLOW) 37 { 38 d = p[3] + p[3]; 39 exceptions &= ~FP_EX_INEXACT; 40 } 41 if (exceptions & FP_EX_UNDERFLOW) 42 { 43 if (exceptions & FP_EX_INEXACT) 44 { 45 d = p[2] * p[2]; 46 exceptions &= ~FP_EX_INEXACT; 47 } 48 else 49 d = p[1] - p[2]; 50 } 51 if (exceptions & FP_EX_DIVZERO) 52 d = 1.0/p[0]; 53 if (exceptions & FP_EX_INEXACT) 54 d = p[3] - p[2]; 55 return d; 56 } 57