xref: /linux/arch/mips/math-emu/ieee754sp.h (revision 1da177e4c3f41524e886b7f1b8a0c1fc7321cac2)
1*1da177e4SLinus Torvalds /*
2*1da177e4SLinus Torvalds  * IEEE754 floating point
3*1da177e4SLinus Torvalds  * double precision internal header file
4*1da177e4SLinus Torvalds  */
5*1da177e4SLinus Torvalds /*
6*1da177e4SLinus Torvalds  * MIPS floating point support
7*1da177e4SLinus Torvalds  * Copyright (C) 1994-2000 Algorithmics Ltd.
8*1da177e4SLinus Torvalds  * http://www.algor.co.uk
9*1da177e4SLinus Torvalds  *
10*1da177e4SLinus Torvalds  * ########################################################################
11*1da177e4SLinus Torvalds  *
12*1da177e4SLinus Torvalds  *  This program is free software; you can distribute it and/or modify it
13*1da177e4SLinus Torvalds  *  under the terms of the GNU General Public License (Version 2) as
14*1da177e4SLinus Torvalds  *  published by the Free Software Foundation.
15*1da177e4SLinus Torvalds  *
16*1da177e4SLinus Torvalds  *  This program is distributed in the hope it will be useful, but WITHOUT
17*1da177e4SLinus Torvalds  *  ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
18*1da177e4SLinus Torvalds  *  FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
19*1da177e4SLinus Torvalds  *  for more details.
20*1da177e4SLinus Torvalds  *
21*1da177e4SLinus Torvalds  *  You should have received a copy of the GNU General Public License along
22*1da177e4SLinus Torvalds  *  with this program; if not, write to the Free Software Foundation, Inc.,
23*1da177e4SLinus Torvalds  *  59 Temple Place - Suite 330, Boston MA 02111-1307, USA.
24*1da177e4SLinus Torvalds  *
25*1da177e4SLinus Torvalds  * ########################################################################
26*1da177e4SLinus Torvalds  */
27*1da177e4SLinus Torvalds 
28*1da177e4SLinus Torvalds 
29*1da177e4SLinus Torvalds #include "ieee754int.h"
30*1da177e4SLinus Torvalds 
31*1da177e4SLinus Torvalds #define assert(expr) ((void)0)
32*1da177e4SLinus Torvalds 
33*1da177e4SLinus Torvalds /* 3bit extended single precision sticky right shift */
34*1da177e4SLinus Torvalds #define SPXSRSXn(rs) \
35*1da177e4SLinus Torvalds   (xe += rs, \
36*1da177e4SLinus Torvalds    xm = (rs > (SP_MBITS+3))?1:((xm) >> (rs)) | ((xm) << (32-(rs)) != 0))
37*1da177e4SLinus Torvalds 
38*1da177e4SLinus Torvalds #define SPXSRSX1() \
39*1da177e4SLinus Torvalds   (xe++, (xm = (xm >> 1) | (xm & 1)))
40*1da177e4SLinus Torvalds 
41*1da177e4SLinus Torvalds #define SPXSRSYn(rs) \
42*1da177e4SLinus Torvalds    (ye+=rs, \
43*1da177e4SLinus Torvalds     ym = (rs > (SP_MBITS+3))?1:((ym) >> (rs)) | ((ym) << (32-(rs)) != 0))
44*1da177e4SLinus Torvalds 
45*1da177e4SLinus Torvalds #define SPXSRSY1() \
46*1da177e4SLinus Torvalds    (ye++, (ym = (ym >> 1) | (ym & 1)))
47*1da177e4SLinus Torvalds 
48*1da177e4SLinus Torvalds /* convert denormal to normalized with extended exponent */
49*1da177e4SLinus Torvalds #define SPDNORMx(m,e) \
50*1da177e4SLinus Torvalds   while( (m >> SP_MBITS) == 0) { m <<= 1; e--; }
51*1da177e4SLinus Torvalds #define SPDNORMX	SPDNORMx(xm,xe)
52*1da177e4SLinus Torvalds #define SPDNORMY	SPDNORMx(ym,ye)
53*1da177e4SLinus Torvalds 
54*1da177e4SLinus Torvalds static __inline ieee754sp buildsp(int s, int bx, unsigned m)
55*1da177e4SLinus Torvalds {
56*1da177e4SLinus Torvalds 	ieee754sp r;
57*1da177e4SLinus Torvalds 
58*1da177e4SLinus Torvalds 	assert((s) == 0 || (s) == 1);
59*1da177e4SLinus Torvalds 	assert((bx) >= SP_EMIN - 1 + SP_EBIAS
60*1da177e4SLinus Torvalds 	       && (bx) <= SP_EMAX + 1 + SP_EBIAS);
61*1da177e4SLinus Torvalds 	assert(((m) >> SP_MBITS) == 0);
62*1da177e4SLinus Torvalds 
63*1da177e4SLinus Torvalds 	r.parts.sign = s;
64*1da177e4SLinus Torvalds 	r.parts.bexp = bx;
65*1da177e4SLinus Torvalds 	r.parts.mant = m;
66*1da177e4SLinus Torvalds 
67*1da177e4SLinus Torvalds 	return r;
68*1da177e4SLinus Torvalds }
69*1da177e4SLinus Torvalds 
70*1da177e4SLinus Torvalds extern int ieee754sp_isnan(ieee754sp);
71*1da177e4SLinus Torvalds extern int ieee754sp_issnan(ieee754sp);
72*1da177e4SLinus Torvalds extern int ieee754si_xcpt(int, const char *, ...);
73*1da177e4SLinus Torvalds extern s64 ieee754di_xcpt(s64, const char *, ...);
74*1da177e4SLinus Torvalds extern ieee754sp ieee754sp_xcpt(ieee754sp, const char *, ...);
75*1da177e4SLinus Torvalds extern ieee754sp ieee754sp_nanxcpt(ieee754sp, const char *, ...);
76*1da177e4SLinus Torvalds extern ieee754sp ieee754sp_bestnan(ieee754sp, ieee754sp);
77*1da177e4SLinus Torvalds extern ieee754sp ieee754sp_format(int, int, unsigned);
78*1da177e4SLinus Torvalds 
79*1da177e4SLinus Torvalds 
80*1da177e4SLinus Torvalds #define SPNORMRET2(s,e,m,name,a0,a1) \
81*1da177e4SLinus Torvalds { \
82*1da177e4SLinus Torvalds     ieee754sp V = ieee754sp_format(s,e,m); \
83*1da177e4SLinus Torvalds     if(TSTX()) \
84*1da177e4SLinus Torvalds       return ieee754sp_xcpt(V,name,a0,a1); \
85*1da177e4SLinus Torvalds     else \
86*1da177e4SLinus Torvalds       return V; \
87*1da177e4SLinus Torvalds }
88*1da177e4SLinus Torvalds 
89*1da177e4SLinus Torvalds #define SPNORMRET1(s,e,m,name,a0)  SPNORMRET2(s,e,m,name,a0,a0)
90