1// SPDX-License-Identifier: GPL-2.0-only
2/*
3 * Some debug functions
4 *
5 * MIPS floating point support
6 *
7 * Copyright (C) 1994-2000 Algorithmics Ltd.
8 *
9 *  Nov 7, 2000
10 *  Modified to build and operate in Linux kernel environment.
11 *
12 *  Kevin D. Kissell, kevink@mips.com and Carsten Langgaard, carstenl@mips.com
13 *  Copyright (C) 2000 MIPS Technologies, Inc. All rights reserved.
14 */
15
16#include <linux/types.h>
17#include <linux/printk.h>
18#include "ieee754.h"
19#include "ieee754sp.h"
20#include "ieee754dp.h"
21
22union ieee754dp ieee754dp_dump(char *m, union ieee754dp x)
23{
24	int i;
25
26	printk("%s", m);
27	printk("<%08x,%08x>\n", (unsigned) (x.bits >> 32),
28	       (unsigned) x.bits);
29	printk("\t=");
30	switch (ieee754dp_class(x)) {
31	case IEEE754_CLASS_QNAN:
32	case IEEE754_CLASS_SNAN:
33		printk("Nan %c", DPSIGN(x) ? '-' : '+');
34		for (i = DP_FBITS - 1; i >= 0; i--)
35			printk("%c", DPMANT(x) & DP_MBIT(i) ? '1' : '0');
36		break;
37	case IEEE754_CLASS_INF:
38		printk("%cInfinity", DPSIGN(x) ? '-' : '+');
39		break;
40	case IEEE754_CLASS_ZERO:
41		printk("%cZero", DPSIGN(x) ? '-' : '+');
42		break;
43	case IEEE754_CLASS_DNORM:
44		printk("%c0.", DPSIGN(x) ? '-' : '+');
45		for (i = DP_FBITS - 1; i >= 0; i--)
46			printk("%c", DPMANT(x) & DP_MBIT(i) ? '1' : '0');
47		printk("e%d", DPBEXP(x) - DP_EBIAS);
48		break;
49	case IEEE754_CLASS_NORM:
50		printk("%c1.", DPSIGN(x) ? '-' : '+');
51		for (i = DP_FBITS - 1; i >= 0; i--)
52			printk("%c", DPMANT(x) & DP_MBIT(i) ? '1' : '0');
53		printk("e%d", DPBEXP(x) - DP_EBIAS);
54		break;
55	default:
56		printk("Illegal/Unknown IEEE754 value class");
57	}
58	printk("\n");
59	return x;
60}
61
62union ieee754sp ieee754sp_dump(char *m, union ieee754sp x)
63{
64	int i;
65
66	printk("%s=", m);
67	printk("<%08x>\n", (unsigned) x.bits);
68	printk("\t=");
69	switch (ieee754sp_class(x)) {
70	case IEEE754_CLASS_QNAN:
71	case IEEE754_CLASS_SNAN:
72		printk("Nan %c", SPSIGN(x) ? '-' : '+');
73		for (i = SP_FBITS - 1; i >= 0; i--)
74			printk("%c", SPMANT(x) & SP_MBIT(i) ? '1' : '0');
75		break;
76	case IEEE754_CLASS_INF:
77		printk("%cInfinity", SPSIGN(x) ? '-' : '+');
78		break;
79	case IEEE754_CLASS_ZERO:
80		printk("%cZero", SPSIGN(x) ? '-' : '+');
81		break;
82	case IEEE754_CLASS_DNORM:
83		printk("%c0.", SPSIGN(x) ? '-' : '+');
84		for (i = SP_FBITS - 1; i >= 0; i--)
85			printk("%c", SPMANT(x) & SP_MBIT(i) ? '1' : '0');
86		printk("e%d", SPBEXP(x) - SP_EBIAS);
87		break;
88	case IEEE754_CLASS_NORM:
89		printk("%c1.", SPSIGN(x) ? '-' : '+');
90		for (i = SP_FBITS - 1; i >= 0; i--)
91			printk("%c", SPMANT(x) & SP_MBIT(i) ? '1' : '0');
92		printk("e%d", SPBEXP(x) - SP_EBIAS);
93		break;
94	default:
95		printk("Illegal/Unknown IEEE754 value class");
96	}
97	printk("\n");
98	return x;
99}
100