1 /* IEEE754 floating point arithmetic 2 * single precision 3 */ 4 /* 5 * MIPS floating point support 6 * Copyright (C) 1994-2000 Algorithmics Ltd. 7 * http://www.algor.co.uk 8 * 9 * ######################################################################## 10 * 11 * This program is free software; you can distribute it and/or modify it 12 * under the terms of the GNU General Public License (Version 2) as 13 * published by the Free Software Foundation. 14 * 15 * This program is distributed in the hope it will be useful, but WITHOUT 16 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 17 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 18 * for more details. 19 * 20 * You should have received a copy of the GNU General Public License along 21 * with this program; if not, write to the Free Software Foundation, Inc., 22 * 59 Temple Place - Suite 330, Boston MA 02111-1307, USA. 23 * 24 * ######################################################################## 25 */ 26 27 28 #include "ieee754sp.h" 29 30 int ieee754sp_finite(ieee754sp x) 31 { 32 return SPBEXP(x) != SP_EMAX + 1 + SP_EBIAS; 33 } 34 35 ieee754sp ieee754sp_copysign(ieee754sp x, ieee754sp y) 36 { 37 CLEARCX; 38 SPSIGN(x) = SPSIGN(y); 39 return x; 40 } 41 42 43 ieee754sp ieee754sp_neg(ieee754sp x) 44 { 45 COMPXSP; 46 47 EXPLODEXSP; 48 CLEARCX; 49 FLUSHXSP; 50 51 /* 52 * Invert the sign ALWAYS to prevent an endless recursion on 53 * pow() in libc. 54 */ 55 /* quick fix up */ 56 SPSIGN(x) ^= 1; 57 58 if (xc == IEEE754_CLASS_SNAN) { 59 ieee754sp y = ieee754sp_indef(); 60 SETCX(IEEE754_INVALID_OPERATION); 61 SPSIGN(y) = SPSIGN(x); 62 return ieee754sp_nanxcpt(y, "neg"); 63 } 64 65 return x; 66 } 67 68 69 ieee754sp ieee754sp_abs(ieee754sp x) 70 { 71 COMPXSP; 72 73 EXPLODEXSP; 74 CLEARCX; 75 FLUSHXSP; 76 77 /* Clear sign ALWAYS, irrespective of NaN */ 78 SPSIGN(x) = 0; 79 80 if (xc == IEEE754_CLASS_SNAN) { 81 return ieee754sp_nanxcpt(ieee754sp_indef(), "abs"); 82 } 83 84 return x; 85 } 86