1/*
2 * Some debug functions
3 *
4 * MIPS floating point support
5 *
6 * Copyright (C) 1994-2000 Algorithmics Ltd.
7 * http://www.algor.co.uk
8 *
9 *  This program is free software; you can distribute it and/or modify it
10 *  under the terms of the GNU General Public License (Version 2) as
11 *  published by the Free Software Foundation.
12 *
13 *  This program is distributed in the hope it will be useful, but WITHOUT
14 *  ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
15 *  FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
16 *  for more details.
17 *
18 *  You should have received a copy of the GNU General Public License along
19 *  with this program; if not, write to the Free Software Foundation, Inc.,
20 *  59 Temple Place - Suite 330, Boston MA 02111-1307, USA.
21 *
22 *  Nov 7, 2000
23 *  Modified to build and operate in Linux kernel environment.
24 *
25 *  Kevin D. Kissell, kevink@mips.com and Carsten Langgaard, carstenl@mips.com
26 *  Copyright (C) 2000 MIPS Technologies, Inc. All rights reserved.
27 */
28
29#include <linux/kernel.h>
30#include "ieee754.h"
31
32#define DP_EBIAS	1023
33#define DP_EMIN		(-1022)
34#define DP_EMAX		1023
35#define DP_FBITS	52
36
37#define SP_EBIAS	127
38#define SP_EMIN		(-126)
39#define SP_EMAX		127
40#define SP_FBITS	23
41
42#define DP_MBIT(x)	((u64)1 << (x))
43#define DP_HIDDEN_BIT	DP_MBIT(DP_FBITS)
44#define DP_SIGN_BIT	DP_MBIT(63)
45
46
47#define SP_MBIT(x)	((u32)1 << (x))
48#define SP_HIDDEN_BIT	SP_MBIT(SP_FBITS)
49#define SP_SIGN_BIT	SP_MBIT(31)
50
51
52#define SPSIGN(sp)	(sp.parts.sign)
53#define SPBEXP(sp)	(sp.parts.bexp)
54#define SPMANT(sp)	(sp.parts.mant)
55
56#define DPSIGN(dp)	(dp.parts.sign)
57#define DPBEXP(dp)	(dp.parts.bexp)
58#define DPMANT(dp)	(dp.parts.mant)
59
60ieee754dp ieee754dp_dump(char *m, ieee754dp x)
61{
62	int i;
63
64	printk("%s", m);
65	printk("<%08x,%08x>\n", (unsigned) (x.bits >> 32),
66	       (unsigned) x.bits);
67	printk("\t=");
68	switch (ieee754dp_class(x)) {
69	case IEEE754_CLASS_QNAN:
70	case IEEE754_CLASS_SNAN:
71		printk("Nan %c", DPSIGN(x) ? '-' : '+');
72		for (i = DP_FBITS - 1; i >= 0; i--)
73			printk("%c", DPMANT(x) & DP_MBIT(i) ? '1' : '0');
74		break;
75	case IEEE754_CLASS_INF:
76		printk("%cInfinity", DPSIGN(x) ? '-' : '+');
77		break;
78	case IEEE754_CLASS_ZERO:
79		printk("%cZero", DPSIGN(x) ? '-' : '+');
80		break;
81	case IEEE754_CLASS_DNORM:
82		printk("%c0.", DPSIGN(x) ? '-' : '+');
83		for (i = DP_FBITS - 1; i >= 0; i--)
84			printk("%c", DPMANT(x) & DP_MBIT(i) ? '1' : '0');
85		printk("e%d", DPBEXP(x) - DP_EBIAS);
86		break;
87	case IEEE754_CLASS_NORM:
88		printk("%c1.", DPSIGN(x) ? '-' : '+');
89		for (i = DP_FBITS - 1; i >= 0; i--)
90			printk("%c", DPMANT(x) & DP_MBIT(i) ? '1' : '0');
91		printk("e%d", DPBEXP(x) - DP_EBIAS);
92		break;
93	default:
94		printk("Illegal/Unknown IEEE754 value class");
95	}
96	printk("\n");
97	return x;
98}
99
100ieee754sp ieee754sp_dump(char *m, ieee754sp x)
101{
102	int i;
103
104	printk("%s=", m);
105	printk("<%08x>\n", (unsigned) x.bits);
106	printk("\t=");
107	switch (ieee754sp_class(x)) {
108	case IEEE754_CLASS_QNAN:
109	case IEEE754_CLASS_SNAN:
110		printk("Nan %c", SPSIGN(x) ? '-' : '+');
111		for (i = SP_FBITS - 1; i >= 0; i--)
112			printk("%c", SPMANT(x) & SP_MBIT(i) ? '1' : '0');
113		break;
114	case IEEE754_CLASS_INF:
115		printk("%cInfinity", SPSIGN(x) ? '-' : '+');
116		break;
117	case IEEE754_CLASS_ZERO:
118		printk("%cZero", SPSIGN(x) ? '-' : '+');
119		break;
120	case IEEE754_CLASS_DNORM:
121		printk("%c0.", SPSIGN(x) ? '-' : '+');
122		for (i = SP_FBITS - 1; i >= 0; i--)
123			printk("%c", SPMANT(x) & SP_MBIT(i) ? '1' : '0');
124		printk("e%d", SPBEXP(x) - SP_EBIAS);
125		break;
126	case IEEE754_CLASS_NORM:
127		printk("%c1.", SPSIGN(x) ? '-' : '+');
128		for (i = SP_FBITS - 1; i >= 0; i--)
129			printk("%c", SPMANT(x) & SP_MBIT(i) ? '1' : '0');
130		printk("e%d", SPBEXP(x) - SP_EBIAS);
131		break;
132	default:
133		printk("Illegal/Unknown IEEE754 value class");
134	}
135	printk("\n");
136	return x;
137}
138