xref: /linux/arch/mips/math-emu/dp_fsp.c (revision f7af616c632ee2ac3af0876fe33bf9e0232e665a)
1 // SPDX-License-Identifier: GPL-2.0-only
2 /* IEEE754 floating point arithmetic
3  * double precision: common utilities
4  */
5 /*
6  * MIPS floating point support
7  * Copyright (C) 1994-2000 Algorithmics Ltd.
8  */
9 
10 #include "ieee754sp.h"
11 #include "ieee754dp.h"
12 
13 static inline union ieee754dp ieee754dp_nan_fsp(int xs, u64 xm)
14 {
15 	return builddp(xs, DP_EMAX + 1 + DP_EBIAS,
16 		       xm << (DP_FBITS - SP_FBITS));
17 }
18 
19 union ieee754dp ieee754dp_fsp(union ieee754sp x)
20 {
21 	COMPXSP;
22 
23 	EXPLODEXSP;
24 
25 	ieee754_clearcx();
26 
27 	FLUSHXSP;
28 
29 	switch (xc) {
30 	case IEEE754_CLASS_SNAN:
31 		return ieee754dp_nanxcpt(ieee754dp_nan_fsp(xs, xm));
32 
33 	case IEEE754_CLASS_QNAN:
34 		return ieee754dp_nan_fsp(xs, xm);
35 
36 	case IEEE754_CLASS_INF:
37 		return ieee754dp_inf(xs);
38 
39 	case IEEE754_CLASS_ZERO:
40 		return ieee754dp_zero(xs);
41 
42 	case IEEE754_CLASS_DNORM:
43 		/* normalize */
44 		while ((xm >> SP_FBITS) == 0) {
45 			xm <<= 1;
46 			xe--;
47 		}
48 		break;
49 
50 	case IEEE754_CLASS_NORM:
51 		break;
52 	}
53 
54 	/*
55 	 * Can't possibly overflow,underflow, or need rounding
56 	 */
57 
58 	/* drop the hidden bit */
59 	xm &= ~SP_HIDDEN_BIT;
60 
61 	return builddp(xs, xe + DP_EBIAS,
62 		       (u64) xm << (DP_FBITS - SP_FBITS));
63 }
64