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