Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
awilliam
GitHub Repository: awilliam/linux-vfio
Path: blob/master/arch/mips/math-emu/ieee754.c
10820 views
1
/* ieee754 floating point arithmetic
2
* single and double precision
3
*
4
* BUGS
5
* not much dp done
6
* doesn't generate IEEE754_INEXACT
7
*
8
*/
9
/*
10
* MIPS floating point support
11
* Copyright (C) 1994-2000 Algorithmics Ltd.
12
*
13
* ########################################################################
14
*
15
* This program is free software; you can distribute it and/or modify it
16
* under the terms of the GNU General Public License (Version 2) as
17
* published by the Free Software Foundation.
18
*
19
* This program is distributed in the hope it will be useful, but WITHOUT
20
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
21
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
22
* for more details.
23
*
24
* You should have received a copy of the GNU General Public License along
25
* with this program; if not, write to the Free Software Foundation, Inc.,
26
* 59 Temple Place - Suite 330, Boston MA 02111-1307, USA.
27
*
28
* ########################################################################
29
*/
30
31
32
#include "ieee754int.h"
33
#include "ieee754sp.h"
34
#include "ieee754dp.h"
35
36
#define DP_EBIAS 1023
37
#define DP_EMIN (-1022)
38
#define DP_EMAX 1023
39
40
#define SP_EBIAS 127
41
#define SP_EMIN (-126)
42
#define SP_EMAX 127
43
44
/* special constants
45
*/
46
47
48
#if (defined(BYTE_ORDER) && BYTE_ORDER == LITTLE_ENDIAN) || defined(__MIPSEL__)
49
#define SPSTR(s, b, m) {m, b, s}
50
#define DPSTR(s, b, mh, ml) {ml, mh, b, s}
51
#endif
52
53
#ifdef __MIPSEB__
54
#define SPSTR(s, b, m) {s, b, m}
55
#define DPSTR(s, b, mh, ml) {s, b, mh, ml}
56
#endif
57
58
const struct ieee754dp_konst __ieee754dp_spcvals[] = {
59
DPSTR(0, DP_EMIN - 1 + DP_EBIAS, 0, 0), /* + zero */
60
DPSTR(1, DP_EMIN - 1 + DP_EBIAS, 0, 0), /* - zero */
61
DPSTR(0, DP_EBIAS, 0, 0), /* + 1.0 */
62
DPSTR(1, DP_EBIAS, 0, 0), /* - 1.0 */
63
DPSTR(0, 3 + DP_EBIAS, 0x40000, 0), /* + 10.0 */
64
DPSTR(1, 3 + DP_EBIAS, 0x40000, 0), /* - 10.0 */
65
DPSTR(0, DP_EMAX + 1 + DP_EBIAS, 0, 0), /* + infinity */
66
DPSTR(1, DP_EMAX + 1 + DP_EBIAS, 0, 0), /* - infinity */
67
DPSTR(0, DP_EMAX+1+DP_EBIAS, 0x7FFFF, 0xFFFFFFFF), /* + indef quiet Nan */
68
DPSTR(0, DP_EMAX + DP_EBIAS, 0xFFFFF, 0xFFFFFFFF), /* + max */
69
DPSTR(1, DP_EMAX + DP_EBIAS, 0xFFFFF, 0xFFFFFFFF), /* - max */
70
DPSTR(0, DP_EMIN + DP_EBIAS, 0, 0), /* + min normal */
71
DPSTR(1, DP_EMIN + DP_EBIAS, 0, 0), /* - min normal */
72
DPSTR(0, DP_EMIN - 1 + DP_EBIAS, 0, 1), /* + min denormal */
73
DPSTR(1, DP_EMIN - 1 + DP_EBIAS, 0, 1), /* - min denormal */
74
DPSTR(0, 31 + DP_EBIAS, 0, 0), /* + 1.0e31 */
75
DPSTR(0, 63 + DP_EBIAS, 0, 0), /* + 1.0e63 */
76
};
77
78
const struct ieee754sp_konst __ieee754sp_spcvals[] = {
79
SPSTR(0, SP_EMIN - 1 + SP_EBIAS, 0), /* + zero */
80
SPSTR(1, SP_EMIN - 1 + SP_EBIAS, 0), /* - zero */
81
SPSTR(0, SP_EBIAS, 0), /* + 1.0 */
82
SPSTR(1, SP_EBIAS, 0), /* - 1.0 */
83
SPSTR(0, 3 + SP_EBIAS, 0x200000), /* + 10.0 */
84
SPSTR(1, 3 + SP_EBIAS, 0x200000), /* - 10.0 */
85
SPSTR(0, SP_EMAX + 1 + SP_EBIAS, 0), /* + infinity */
86
SPSTR(1, SP_EMAX + 1 + SP_EBIAS, 0), /* - infinity */
87
SPSTR(0, SP_EMAX+1+SP_EBIAS, 0x3FFFFF), /* + indef quiet Nan */
88
SPSTR(0, SP_EMAX + SP_EBIAS, 0x7FFFFF), /* + max normal */
89
SPSTR(1, SP_EMAX + SP_EBIAS, 0x7FFFFF), /* - max normal */
90
SPSTR(0, SP_EMIN + SP_EBIAS, 0), /* + min normal */
91
SPSTR(1, SP_EMIN + SP_EBIAS, 0), /* - min normal */
92
SPSTR(0, SP_EMIN - 1 + SP_EBIAS, 1), /* + min denormal */
93
SPSTR(1, SP_EMIN - 1 + SP_EBIAS, 1), /* - min denormal */
94
SPSTR(0, 31 + SP_EBIAS, 0), /* + 1.0e31 */
95
SPSTR(0, 63 + SP_EBIAS, 0), /* + 1.0e63 */
96
};
97
98
99
int ieee754si_xcpt(int r, const char *op, ...)
100
{
101
struct ieee754xctx ax;
102
103
if (!TSTX())
104
return r;
105
ax.op = op;
106
ax.rt = IEEE754_RT_SI;
107
ax.rv.si = r;
108
va_start(ax.ap, op);
109
ieee754_xcpt(&ax);
110
va_end(ax.ap);
111
return ax.rv.si;
112
}
113
114
s64 ieee754di_xcpt(s64 r, const char *op, ...)
115
{
116
struct ieee754xctx ax;
117
118
if (!TSTX())
119
return r;
120
ax.op = op;
121
ax.rt = IEEE754_RT_DI;
122
ax.rv.di = r;
123
va_start(ax.ap, op);
124
ieee754_xcpt(&ax);
125
va_end(ax.ap);
126
return ax.rv.di;
127
}
128
129