xref: /openbmc/linux/arch/mips/math-emu/dp_cmp.c (revision 75bf465f0bc33e9b776a46d6a1b9b990f5fb7c37)
1*9d5a6349SThomas Gleixner // SPDX-License-Identifier: GPL-2.0-only
21da177e4SLinus Torvalds /* IEEE754 floating point arithmetic
31da177e4SLinus Torvalds  * double precision: common utilities
41da177e4SLinus Torvalds  */
51da177e4SLinus Torvalds /*
61da177e4SLinus Torvalds  * MIPS floating point support
71da177e4SLinus Torvalds  * Copyright (C) 1994-2000 Algorithmics Ltd.
81da177e4SLinus Torvalds  */
91da177e4SLinus Torvalds 
101da177e4SLinus Torvalds #include "ieee754dp.h"
111da177e4SLinus Torvalds 
ieee754dp_cmp(union ieee754dp x,union ieee754dp y,int cmp,int sig)122209bcb1SRalf Baechle int ieee754dp_cmp(union ieee754dp x, union ieee754dp y, int cmp, int sig)
131da177e4SLinus Torvalds {
143f7cac41SRalf Baechle 	s64 vx;
153f7cac41SRalf Baechle 	s64 vy;
163f7cac41SRalf Baechle 
171da177e4SLinus Torvalds 	COMPXDP;
181da177e4SLinus Torvalds 	COMPYDP;
191da177e4SLinus Torvalds 
201da177e4SLinus Torvalds 	EXPLODEXDP;
211da177e4SLinus Torvalds 	EXPLODEYDP;
221da177e4SLinus Torvalds 	FLUSHXDP;
231da177e4SLinus Torvalds 	FLUSHYDP;
249e8bad1fSRalf Baechle 	ieee754_clearcx();	/* Even clear inexact flag here */
251da177e4SLinus Torvalds 
26c9a10845SMaciej W. Rozycki 	if (ieee754_class_nan(xc) || ieee754_class_nan(yc)) {
27b844bc78SMaciej W. Rozycki 		if (sig ||
28b844bc78SMaciej W. Rozycki 		    xc == IEEE754_CLASS_SNAN || yc == IEEE754_CLASS_SNAN)
299e8bad1fSRalf Baechle 			ieee754_setcx(IEEE754_INVALID_OPERATION);
30bd267a53SMaciej W. Rozycki 		return (cmp & IEEE754_CUN) != 0;
311da177e4SLinus Torvalds 	} else {
323f7cac41SRalf Baechle 		vx = x.bits;
333f7cac41SRalf Baechle 		vy = y.bits;
341da177e4SLinus Torvalds 
351da177e4SLinus Torvalds 		if (vx < 0)
361da177e4SLinus Torvalds 			vx = -vx ^ DP_SIGN_BIT;
371da177e4SLinus Torvalds 		if (vy < 0)
381da177e4SLinus Torvalds 			vy = -vy ^ DP_SIGN_BIT;
391da177e4SLinus Torvalds 
401da177e4SLinus Torvalds 		if (vx < vy)
411da177e4SLinus Torvalds 			return (cmp & IEEE754_CLT) != 0;
421da177e4SLinus Torvalds 		else if (vx == vy)
431da177e4SLinus Torvalds 			return (cmp & IEEE754_CEQ) != 0;
441da177e4SLinus Torvalds 		else
451da177e4SLinus Torvalds 			return (cmp & IEEE754_CGT) != 0;
461da177e4SLinus Torvalds 	}
471da177e4SLinus Torvalds }
48