11da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* IEEE754 floating point arithmetic
21da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * double precision: common utilities
31da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */
41da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/*
51da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * MIPS floating point support
61da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Copyright (C) 1994-2000 Algorithmics Ltd.
71da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
81da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *  This program is free software; you can distribute it and/or modify it
91da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *  under the terms of the GNU General Public License (Version 2) as
101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *  published by the Free Software Foundation.
111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *  This program is distributed in the hope it will be useful, but WITHOUT
131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *  ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *  FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *  for more details.
161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *  You should have received a copy of the GNU General Public License along
181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *  with this program; if not, write to the Free Software Foundation, Inc.,
193f7cac416b5e62d37aa693538729c6c23e9b938bRalf Baechle *  51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA.
201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */
211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include "ieee754dp.h"
231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
242209bcb1310ffa9ee1af12573f1413581c712b15Ralf Baechleint ieee754dp_cmp(union ieee754dp x, union ieee754dp y, int cmp, int sig)
251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
263f7cac416b5e62d37aa693538729c6c23e9b938bRalf Baechle	s64 vx;
273f7cac416b5e62d37aa693538729c6c23e9b938bRalf Baechle	s64 vy;
283f7cac416b5e62d37aa693538729c6c23e9b938bRalf Baechle
291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	COMPXDP;
301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	COMPYDP;
311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	EXPLODEXDP;
331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	EXPLODEYDP;
341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	FLUSHXDP;
351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	FLUSHYDP;
369e8bad1f9c0370b2635175b34d6151b90a53da5cRalf Baechle	ieee754_clearcx();	/* Even clear inexact flag here */
371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (ieee754dp_isnan(x) || ieee754dp_isnan(y)) {
391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if (sig || xc == IEEE754_CLASS_SNAN || yc == IEEE754_CLASS_SNAN)
409e8bad1f9c0370b2635175b34d6151b90a53da5cRalf Baechle			ieee754_setcx(IEEE754_INVALID_OPERATION);
411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if (cmp & IEEE754_CUN)
421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			return 1;
431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if (cmp & (IEEE754_CLT | IEEE754_CGT)) {
449e8bad1f9c0370b2635175b34d6151b90a53da5cRalf Baechle			if (sig && ieee754_setandtestcx(IEEE754_INVALID_OPERATION))
4590efba36ed50933c6df92805bd7e5742e9cc0f46Ralf Baechle				return 0;
461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		}
471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		return 0;
481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	} else {
493f7cac416b5e62d37aa693538729c6c23e9b938bRalf Baechle		vx = x.bits;
503f7cac416b5e62d37aa693538729c6c23e9b938bRalf Baechle		vy = y.bits;
511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if (vx < 0)
531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			vx = -vx ^ DP_SIGN_BIT;
541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if (vy < 0)
551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			vy = -vy ^ DP_SIGN_BIT;
561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if (vx < vy)
581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			return (cmp & IEEE754_CLT) != 0;
591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		else if (vx == vy)
601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			return (cmp & IEEE754_CEQ) != 0;
611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		else
621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			return (cmp & IEEE754_CGT) != 0;
631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
65