1 /* IEEE754 floating point arithmetic 2 * double precision: common utilities 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 "ieee754dp.h" 29 30 int ieee754dp_cmp(ieee754dp x, ieee754dp y, int cmp, int sig) 31 { 32 COMPXDP; 33 COMPYDP; 34 35 EXPLODEXDP; 36 EXPLODEYDP; 37 FLUSHXDP; 38 FLUSHYDP; 39 CLEARCX; /* Even clear inexact flag here */ 40 41 if (ieee754dp_isnan(x) || ieee754dp_isnan(y)) { 42 if (sig || xc == IEEE754_CLASS_SNAN || yc == IEEE754_CLASS_SNAN) 43 SETCX(IEEE754_INVALID_OPERATION); 44 if (cmp & IEEE754_CUN) 45 return 1; 46 if (cmp & (IEEE754_CLT | IEEE754_CGT)) { 47 if (sig && SETANDTESTCX(IEEE754_INVALID_OPERATION)) 48 return ieee754si_xcpt(0, "fcmpf", x); 49 } 50 return 0; 51 } else { 52 s64 vx = x.bits; 53 s64 vy = y.bits; 54 55 if (vx < 0) 56 vx = -vx ^ DP_SIGN_BIT; 57 if (vy < 0) 58 vy = -vy ^ DP_SIGN_BIT; 59 60 if (vx < vy) 61 return (cmp & IEEE754_CLT) != 0; 62 else if (vx == vy) 63 return (cmp & IEEE754_CEQ) != 0; 64 else 65 return (cmp & IEEE754_CGT) != 0; 66 } 67 } 68