Merge drm/drm-next into drm-intel-next-queued
[sfrench/cifs-2.6.git] / arch / mips / math-emu / dp_fsp.c
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 }