xref: /linux/arch/mips/math-emu/ieee754sp.h (revision 75bf465f0bc33e9b776a46d6a1b9b990f5fb7c37)
1*9d5a6349SThomas Gleixner /* SPDX-License-Identifier: GPL-2.0-only */
21da177e4SLinus Torvalds /*
31da177e4SLinus Torvalds  * IEEE754 floating point
41da177e4SLinus Torvalds  * double precision internal header file
51da177e4SLinus Torvalds  */
61da177e4SLinus Torvalds /*
71da177e4SLinus Torvalds  * MIPS floating point support
81da177e4SLinus Torvalds  * Copyright (C) 1994-2000 Algorithmics Ltd.
91da177e4SLinus Torvalds  */
101da177e4SLinus Torvalds 
11cae55066SRalf Baechle #include <linux/compiler.h>
121da177e4SLinus Torvalds 
131da177e4SLinus Torvalds #include "ieee754int.h"
141da177e4SLinus Torvalds 
151da177e4SLinus Torvalds #define assert(expr) ((void)0)
161da177e4SLinus Torvalds 
17b3a7ad2bSRalf Baechle #define SP_EBIAS	127
18b3a7ad2bSRalf Baechle #define SP_EMIN		(-126)
19b3a7ad2bSRalf Baechle #define SP_EMAX		127
20b3a7ad2bSRalf Baechle #define SP_FBITS	23
21b3a7ad2bSRalf Baechle #define SP_MBITS	23
22b3a7ad2bSRalf Baechle 
23b3a7ad2bSRalf Baechle #define SP_MBIT(x)	((u32)1 << (x))
24b3a7ad2bSRalf Baechle #define SP_HIDDEN_BIT	SP_MBIT(SP_FBITS)
25b3a7ad2bSRalf Baechle #define SP_SIGN_BIT	SP_MBIT(31)
26b3a7ad2bSRalf Baechle 
2749548b09SRalf Baechle #define SPSIGN(sp)	(sp.sign)
2849548b09SRalf Baechle #define SPBEXP(sp)	(sp.bexp)
2949548b09SRalf Baechle #define SPMANT(sp)	(sp.mant)
30b3a7ad2bSRalf Baechle 
ieee754sp_finite(union ieee754sp x)313a33db23SRalf Baechle static inline int ieee754sp_finite(union ieee754sp x)
323a33db23SRalf Baechle {
333a33db23SRalf Baechle 	return SPBEXP(x) != SP_EMAX + 1 + SP_EBIAS;
343a33db23SRalf Baechle }
353a33db23SRalf Baechle 
36b3b8e1ebSDouglas Leung /* 64 bit right shift with rounding */
37b3b8e1ebSDouglas Leung #define XSPSRS64(v, rs)						\
38b3b8e1ebSDouglas Leung 	(((rs) >= 64) ? ((v) != 0) : ((v) >> (rs)) | ((v) << (64-(rs)) != 0))
39b3b8e1ebSDouglas Leung 
401da177e4SLinus Torvalds /* 3bit extended single precision sticky right shift */
41db57f29dSPaul Burton #define XSPSRS(v, rs)						\
42db57f29dSPaul Burton 	((rs > (SP_FBITS+3))?1:((v) >> (rs)) | ((v) << (32-(rs)) != 0))
43db57f29dSPaul Burton 
44db57f29dSPaul Burton #define XSPSRS1(m) \
45db57f29dSPaul Burton 	((m >> 1) | (m & 1))
461da177e4SLinus Torvalds 
471da177e4SLinus Torvalds #define SPXSRSX1() \
48db57f29dSPaul Burton 	(xe++, (xm = XSPSRS1(xm)))
491da177e4SLinus Torvalds 
501da177e4SLinus Torvalds #define SPXSRSY1() \
51db57f29dSPaul Burton 	(ye++, (ym = XSPSRS1(ym)))
521da177e4SLinus Torvalds 
531da177e4SLinus Torvalds /* convert denormal to normalized with extended exponent */
541da177e4SLinus Torvalds #define SPDNORMx(m,e) \
55ad8fb553SRalf Baechle 	while ((m >> SP_FBITS) == 0) { m <<= 1; e--; }
561da177e4SLinus Torvalds #define SPDNORMX	SPDNORMx(xm, xe)
571da177e4SLinus Torvalds #define SPDNORMY	SPDNORMx(ym, ye)
58e2d11e1aSPaul Burton #define SPDNORMZ	SPDNORMx(zm, ze)
591da177e4SLinus Torvalds 
buildsp(int s,int bx,unsigned int m)60a58f85b5SAleksandar Markovic static inline union ieee754sp buildsp(int s, int bx, unsigned int m)
611da177e4SLinus Torvalds {
622209bcb1SRalf Baechle 	union ieee754sp r;
631da177e4SLinus Torvalds 
641da177e4SLinus Torvalds 	assert((s) == 0 || (s) == 1);
651da177e4SLinus Torvalds 	assert((bx) >= SP_EMIN - 1 + SP_EBIAS
661da177e4SLinus Torvalds 	       && (bx) <= SP_EMAX + 1 + SP_EBIAS);
67ad8fb553SRalf Baechle 	assert(((m) >> SP_FBITS) == 0);
681da177e4SLinus Torvalds 
6949548b09SRalf Baechle 	r.sign = s;
7049548b09SRalf Baechle 	r.bexp = bx;
7149548b09SRalf Baechle 	r.mant = m;
721da177e4SLinus Torvalds 
731da177e4SLinus Torvalds 	return r;
741da177e4SLinus Torvalds }
751da177e4SLinus Torvalds 
7690efba36SRalf Baechle extern union ieee754sp __cold ieee754sp_nanxcpt(union ieee754sp);
772209bcb1SRalf Baechle extern union ieee754sp ieee754sp_format(int, int, unsigned);
78