xref: /openbmc/linux/arch/mips/math-emu/sp_fint.c (revision 75bf465f0bc33e9b776a46d6a1b9b990f5fb7c37)
1*9d5a6349SThomas Gleixner // SPDX-License-Identifier: GPL-2.0-only
21da177e4SLinus Torvalds /* IEEE754 floating point arithmetic
31da177e4SLinus Torvalds  * single precision
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 "ieee754sp.h"
111da177e4SLinus Torvalds 
ieee754sp_fint(int x)122209bcb1SRalf Baechle union ieee754sp ieee754sp_fint(int x)
131da177e4SLinus Torvalds {
14a58f85b5SAleksandar Markovic 	unsigned int xm;
15ecf52d3cSAtsushi Nemoto 	int xe;
16ecf52d3cSAtsushi Nemoto 	int xs;
171da177e4SLinus Torvalds 
189e8bad1fSRalf Baechle 	ieee754_clearcx();
191da177e4SLinus Torvalds 
201da177e4SLinus Torvalds 	if (x == 0)
211da177e4SLinus Torvalds 		return ieee754sp_zero(0);
221da177e4SLinus Torvalds 	if (x == 1 || x == -1)
231da177e4SLinus Torvalds 		return ieee754sp_one(x < 0);
241da177e4SLinus Torvalds 	if (x == 10 || x == -10)
251da177e4SLinus Torvalds 		return ieee754sp_ten(x < 0);
261da177e4SLinus Torvalds 
271da177e4SLinus Torvalds 	xs = (x < 0);
281da177e4SLinus Torvalds 	if (xs) {
291da177e4SLinus Torvalds 		if (x == (1 << 31))
301da177e4SLinus Torvalds 			xm = ((unsigned) 1 << 31);	/* max neg can't be safely negated */
311da177e4SLinus Torvalds 		else
321da177e4SLinus Torvalds 			xm = -x;
331da177e4SLinus Torvalds 	} else {
341da177e4SLinus Torvalds 		xm = x;
351da177e4SLinus Torvalds 	}
36ad8fb553SRalf Baechle 	xe = SP_FBITS + 3;
371da177e4SLinus Torvalds 
38ad8fb553SRalf Baechle 	if (xm >> (SP_FBITS + 1 + 3)) {
391da177e4SLinus Torvalds 		/* shunt out overflow bits
401da177e4SLinus Torvalds 		 */
41ad8fb553SRalf Baechle 		while (xm >> (SP_FBITS + 1 + 3)) {
421da177e4SLinus Torvalds 			SPXSRSX1();
431da177e4SLinus Torvalds 		}
441da177e4SLinus Torvalds 	} else {
451da177e4SLinus Torvalds 		/* normalize in grs extended single precision
461da177e4SLinus Torvalds 		 */
47ad8fb553SRalf Baechle 		while ((xm >> (SP_FBITS + 3)) == 0) {
481da177e4SLinus Torvalds 			xm <<= 1;
491da177e4SLinus Torvalds 			xe--;
501da177e4SLinus Torvalds 		}
511da177e4SLinus Torvalds 	}
5290efba36SRalf Baechle 	return ieee754sp_format(xs, xe, xm);
531da177e4SLinus Torvalds }
54