1 // SPDX-License-Identifier: GPL-2.0-only
2 /* IEEE754 floating point arithmetic
3 * double precision: common utilities
6 * MIPS floating point support
7 * Copyright (C) 1994-2000 Algorithmics Ltd.
10 #include "ieee754dp.h"
12 union ieee754dp
ieee754dp_div(union ieee754dp x
, union ieee754dp 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 ieee754dp_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 ieee754dp_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 ieee754dp_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 ieee754dp_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 ieee754dp_inf(xs
^ ys
);
79 case CLPAIR(IEEE754_CLASS_ZERO
, IEEE754_CLASS_ZERO
):
80 ieee754_setcx(IEEE754_INVALID_OPERATION
);
81 return ieee754dp_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 ieee754dp_inf(xs
^ ys
);
88 case CLPAIR(IEEE754_CLASS_ZERO
, IEEE754_CLASS_NORM
):
89 case CLPAIR(IEEE754_CLASS_ZERO
, IEEE754_CLASS_DNORM
):
90 return ieee754dp_zero(xs
== ys
? 0 : 1);
92 case CLPAIR(IEEE754_CLASS_DNORM
, IEEE754_CLASS_DNORM
):
95 case CLPAIR(IEEE754_CLASS_NORM
, IEEE754_CLASS_DNORM
):
99 case CLPAIR(IEEE754_CLASS_DNORM
, IEEE754_CLASS_NORM
):
103 case CLPAIR(IEEE754_CLASS_NORM
, IEEE754_CLASS_NORM
):
106 assert(xm
& DP_HIDDEN_BIT
);
107 assert(ym
& DP_HIDDEN_BIT
);
109 /* provide rounding space */
113 /* now the dirty work */
118 for (bm
= DP_MBIT(DP_FBITS
+ 2); bm
; bm
>>= 1) {
130 rm
|= 1; /* have remainder, set sticky */
135 * Normalise rm to rounding precision ?
137 while ((rm
>> (DP_FBITS
+ 3)) == 0) {
142 return ieee754dp_format(xs
== ys
? 0 : 1, re
, rm
);