aboutsummaryrefslogtreecommitdiffstats
path: root/arch/mips/math-emu/ieee754sp.h
diff options
context:
space:
mode:
Diffstat (limited to 'arch/mips/math-emu/ieee754sp.h')
-rw-r--r--arch/mips/math-emu/ieee754sp.h79
1 files changed, 39 insertions, 40 deletions
diff --git a/arch/mips/math-emu/ieee754sp.h b/arch/mips/math-emu/ieee754sp.h
index 754fd54649b5..ad268e332318 100644
--- a/arch/mips/math-emu/ieee754sp.h
+++ b/arch/mips/math-emu/ieee754sp.h
@@ -6,8 +6,6 @@
6 * MIPS floating point support 6 * MIPS floating point support
7 * Copyright (C) 1994-2000 Algorithmics Ltd. 7 * Copyright (C) 1994-2000 Algorithmics Ltd.
8 * 8 *
9 * ########################################################################
10 *
11 * This program is free software; you can distribute it and/or modify it 9 * This program is free software; you can distribute it and/or modify it
12 * under the terms of the GNU General Public License (Version 2) as 10 * under the terms of the GNU General Public License (Version 2) as
13 * published by the Free Software Foundation. 11 * published by the Free Software Foundation.
@@ -19,70 +17,71 @@
19 * 17 *
20 * You should have received a copy of the GNU General Public License along 18 * You should have received a copy of the GNU General Public License along
21 * with this program; if not, write to the Free Software Foundation, Inc., 19 * with this program; if not, write to the Free Software Foundation, Inc.,
22 * 59 Temple Place - Suite 330, Boston MA 02111-1307, USA. 20 * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
23 *
24 * ########################################################################
25 */ 21 */
26 22
23#include <linux/compiler.h>
27 24
28#include "ieee754int.h" 25#include "ieee754int.h"
29 26
30#define assert(expr) ((void)0) 27#define assert(expr) ((void)0)
31 28
29#define SP_EBIAS 127
30#define SP_EMIN (-126)
31#define SP_EMAX 127
32#define SP_FBITS 23
33#define SP_MBITS 23
34
35#define SP_MBIT(x) ((u32)1 << (x))
36#define SP_HIDDEN_BIT SP_MBIT(SP_FBITS)
37#define SP_SIGN_BIT SP_MBIT(31)
38
39#define SPSIGN(sp) (sp.sign)
40#define SPBEXP(sp) (sp.bexp)
41#define SPMANT(sp) (sp.mant)
42
43static inline int ieee754sp_finite(union ieee754sp x)
44{
45 return SPBEXP(x) != SP_EMAX + 1 + SP_EBIAS;
46}
47
32/* 3bit extended single precision sticky right shift */ 48/* 3bit extended single precision sticky right shift */
33#define SPXSRSXn(rs) \ 49#define SPXSRSXn(rs) \
34 (xe += rs, \ 50 (xe += rs, \
35 xm = (rs > (SP_MBITS+3))?1:((xm) >> (rs)) | ((xm) << (32-(rs)) != 0)) 51 xm = (rs > (SP_FBITS+3))?1:((xm) >> (rs)) | ((xm) << (32-(rs)) != 0))
36 52
37#define SPXSRSX1() \ 53#define SPXSRSX1() \
38 (xe++, (xm = (xm >> 1) | (xm & 1))) 54 (xe++, (xm = (xm >> 1) | (xm & 1)))
39 55
40#define SPXSRSYn(rs) \ 56#define SPXSRSYn(rs) \
41 (ye+=rs, \ 57 (ye+=rs, \
42 ym = (rs > (SP_MBITS+3))?1:((ym) >> (rs)) | ((ym) << (32-(rs)) != 0)) 58 ym = (rs > (SP_FBITS+3))?1:((ym) >> (rs)) | ((ym) << (32-(rs)) != 0))
43 59
44#define SPXSRSY1() \ 60#define SPXSRSY1() \
45 (ye++, (ym = (ym >> 1) | (ym & 1))) 61 (ye++, (ym = (ym >> 1) | (ym & 1)))
46 62
47/* convert denormal to normalized with extended exponent */ 63/* convert denormal to normalized with extended exponent */
48#define SPDNORMx(m,e) \ 64#define SPDNORMx(m,e) \
49 while( (m >> SP_MBITS) == 0) { m <<= 1; e--; } 65 while ((m >> SP_FBITS) == 0) { m <<= 1; e--; }
50#define SPDNORMX SPDNORMx(xm, xe) 66#define SPDNORMX SPDNORMx(xm, xe)
51#define SPDNORMY SPDNORMx(ym, ye) 67#define SPDNORMY SPDNORMx(ym, ye)
52 68
53static inline ieee754sp buildsp(int s, int bx, unsigned m) 69static inline union ieee754sp buildsp(int s, int bx, unsigned m)
54{ 70{
55 ieee754sp r; 71 union ieee754sp r;
56 72
57 assert((s) == 0 || (s) == 1); 73 assert((s) == 0 || (s) == 1);
58 assert((bx) >= SP_EMIN - 1 + SP_EBIAS 74 assert((bx) >= SP_EMIN - 1 + SP_EBIAS
59 && (bx) <= SP_EMAX + 1 + SP_EBIAS); 75 && (bx) <= SP_EMAX + 1 + SP_EBIAS);
60 assert(((m) >> SP_MBITS) == 0); 76 assert(((m) >> SP_FBITS) == 0);
61 77
62 r.parts.sign = s; 78 r.sign = s;
63 r.parts.bexp = bx; 79 r.bexp = bx;
64 r.parts.mant = m; 80 r.mant = m;
65 81
66 return r; 82 return r;
67} 83}
68 84
69extern int ieee754sp_isnan(ieee754sp); 85extern int ieee754sp_isnan(union ieee754sp);
70extern int ieee754sp_issnan(ieee754sp); 86extern union ieee754sp __cold ieee754sp_nanxcpt(union ieee754sp);
71extern int ieee754si_xcpt(int, const char *, ...); 87extern union ieee754sp ieee754sp_format(int, int, unsigned);
72extern s64 ieee754di_xcpt(s64, const char *, ...);
73extern ieee754sp ieee754sp_xcpt(ieee754sp, const char *, ...);
74extern ieee754sp ieee754sp_nanxcpt(ieee754sp, const char *, ...);
75extern ieee754sp ieee754sp_bestnan(ieee754sp, ieee754sp);
76extern ieee754sp ieee754sp_format(int, int, unsigned);
77
78
79#define SPNORMRET2(s, e, m, name, a0, a1) \
80{ \
81 ieee754sp V = ieee754sp_format(s, e, m); \
82 if(TSTX()) \
83 return ieee754sp_xcpt(V, name, a0, a1); \
84 else \
85 return V; \
86}
87
88#define SPNORMRET1(s, e, m, name, a0) SPNORMRET2(s, e, m, name, a0, a0)