xref: /openbmc/linux/arch/mips/math-emu/dp_fint.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_fint(int x)122209bcb1SRalf Baechle union ieee754dp ieee754dp_fint(int x)
131da177e4SLinus Torvalds {
14ecf52d3cSAtsushi Nemoto 	u64 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 ieee754dp_zero(0);
221da177e4SLinus Torvalds 	if (x == 1 || x == -1)
231da177e4SLinus Torvalds 		return ieee754dp_one(x < 0);
241da177e4SLinus Torvalds 	if (x == 10 || x == -10)
251da177e4SLinus Torvalds 		return ieee754dp_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 	}
361da177e4SLinus Torvalds 
371da177e4SLinus Torvalds 	/* normalize - result can never be inexact or overflow */
38ad8fb553SRalf Baechle 	xe = DP_FBITS;
39ad8fb553SRalf Baechle 	while ((xm >> DP_FBITS) == 0) {
401da177e4SLinus Torvalds 		xm <<= 1;
411da177e4SLinus Torvalds 		xe--;
421da177e4SLinus Torvalds 	}
431da177e4SLinus Torvalds 	return builddp(xs, xe + DP_EBIAS, xm & ~DP_HIDDEN_BIT);
441da177e4SLinus Torvalds }
45