1 // SPDX-License-Identifier: GPL-2.0-only
2 /* IEEE754 floating point arithmetic
6 * MIPS floating point support
7 * Copyright (C) 1994-2000 Algorithmics Ltd.
10 #include "ieee754sp.h"
12 union ieee754sp
ieee754sp_div(union ieee754sp x
, union ieee754sp y
)
29 switch (CLPAIR(xc
, yc
)) {
30 case CLPAIR(IEEE754_CLASS_QNAN
, IEEE754_CLASS_SNAN
):
31 case CLPAIR(IEEE754_CLASS_ZERO
, IEEE754_CLASS_SNAN
):
32 case CLPAIR(IEEE754_CLASS_NORM
, IEEE754_CLASS_SNAN
):
33 case CLPAIR(IEEE754_CLASS_DNORM
, IEEE754_CLASS_SNAN
):
34 case CLPAIR(IEEE754_CLASS_INF
, IEEE754_CLASS_SNAN
):
35 return ieee754sp_nanxcpt(y
);
37 case CLPAIR(IEEE754_CLASS_SNAN
, IEEE754_CLASS_SNAN
):
38 case CLPAIR(IEEE754_CLASS_SNAN
, IEEE754_CLASS_QNAN
):
39 case CLPAIR(IEEE754_CLASS_SNAN
, IEEE754_CLASS_ZERO
):
40 case CLPAIR(IEEE754_CLASS_SNAN
, IEEE754_CLASS_NORM
):
41 case CLPAIR(IEEE754_CLASS_SNAN
, IEEE754_CLASS_DNORM
):
42 case CLPAIR(IEEE754_CLASS_SNAN
, IEEE754_CLASS_INF
):
43 return ieee754sp_nanxcpt(x
);
45 case CLPAIR(IEEE754_CLASS_ZERO
, IEEE754_CLASS_QNAN
):
46 case CLPAIR(IEEE754_CLASS_NORM
, IEEE754_CLASS_QNAN
):
47 case CLPAIR(IEEE754_CLASS_DNORM
, IEEE754_CLASS_QNAN
):
48 case CLPAIR(IEEE754_CLASS_INF
, IEEE754_CLASS_QNAN
):
51 case CLPAIR(IEEE754_CLASS_QNAN
, IEEE754_CLASS_QNAN
):
52 case CLPAIR(IEEE754_CLASS_QNAN
, IEEE754_CLASS_ZERO
):
53 case CLPAIR(IEEE754_CLASS_QNAN
, IEEE754_CLASS_NORM
):
54 case CLPAIR(IEEE754_CLASS_QNAN
, IEEE754_CLASS_DNORM
):
55 case CLPAIR(IEEE754_CLASS_QNAN
, IEEE754_CLASS_INF
):
62 case CLPAIR(IEEE754_CLASS_INF
, IEEE754_CLASS_INF
):
63 ieee754_setcx(IEEE754_INVALID_OPERATION
);
64 return ieee754sp_indef();
66 case CLPAIR(IEEE754_CLASS_NORM
, IEEE754_CLASS_INF
):
67 case CLPAIR(IEEE754_CLASS_ZERO
, IEEE754_CLASS_INF
):
68 case CLPAIR(IEEE754_CLASS_DNORM
, IEEE754_CLASS_INF
):
69 return ieee754sp_zero(xs
^ ys
);
71 case CLPAIR(IEEE754_CLASS_INF
, IEEE754_CLASS_ZERO
):
72 case CLPAIR(IEEE754_CLASS_INF
, IEEE754_CLASS_NORM
):
73 case CLPAIR(IEEE754_CLASS_INF
, IEEE754_CLASS_DNORM
):
74 return ieee754sp_inf(xs
^ ys
);
79 case CLPAIR(IEEE754_CLASS_ZERO
, IEEE754_CLASS_ZERO
):
80 ieee754_setcx(IEEE754_INVALID_OPERATION
);
81 return ieee754sp_indef();
83 case CLPAIR(IEEE754_CLASS_NORM
, IEEE754_CLASS_ZERO
):
84 case CLPAIR(IEEE754_CLASS_DNORM
, IEEE754_CLASS_ZERO
):
85 ieee754_setcx(IEEE754_ZERO_DIVIDE
);
86 return ieee754sp_inf(xs
^ ys
);
88 case CLPAIR(IEEE754_CLASS_ZERO
, IEEE754_CLASS_NORM
):
89 case CLPAIR(IEEE754_CLASS_ZERO
, IEEE754_CLASS_DNORM
):
90 return ieee754sp_zero(xs
== ys
? 0 : 1);
92 case CLPAIR(IEEE754_CLASS_DNORM
, IEEE754_CLASS_DNORM
):
96 case CLPAIR(IEEE754_CLASS_NORM
, IEEE754_CLASS_DNORM
):
100 case CLPAIR(IEEE754_CLASS_DNORM
, IEEE754_CLASS_NORM
):
104 case CLPAIR(IEEE754_CLASS_NORM
, IEEE754_CLASS_NORM
):
107 assert(xm
& SP_HIDDEN_BIT
);
108 assert(ym
& SP_HIDDEN_BIT
);
110 /* provide rounding space */
114 /* now the dirty work */
119 for (bm
= SP_MBIT(SP_FBITS
+ 2); bm
; bm
>>= 1) {
131 rm
|= 1; /* have remainder, set sticky */
135 /* normalise rm to rounding precision ?
137 while ((rm
>> (SP_FBITS
+ 3)) == 0) {
142 return ieee754sp_format(xs
== ys
? 0 : 1, re
, rm
);