diff options
Diffstat (limited to 'arch/mips/math-emu/ieee754.c')
-rw-r--r-- | arch/mips/math-emu/ieee754.c | 83 |
1 files changed, 83 insertions, 0 deletions
diff --git a/arch/mips/math-emu/ieee754.c b/arch/mips/math-emu/ieee754.c new file mode 100644 index 000000000..0ba5dfbd4 --- /dev/null +++ b/arch/mips/math-emu/ieee754.c | |||
@@ -0,0 +1,83 @@ | |||
1 | // SPDX-License-Identifier: GPL-2.0-only | ||
2 | /* ieee754 floating point arithmetic | ||
3 | * single and double precision | ||
4 | * | ||
5 | * BUGS | ||
6 | * not much dp done | ||
7 | * doesn't generate IEEE754_INEXACT | ||
8 | */ | ||
9 | /* | ||
10 | * MIPS floating point support | ||
11 | * Copyright (C) 1994-2000 Algorithmics Ltd. | ||
12 | */ | ||
13 | |||
14 | #include <linux/compiler.h> | ||
15 | |||
16 | #include "ieee754.h" | ||
17 | #include "ieee754sp.h" | ||
18 | #include "ieee754dp.h" | ||
19 | |||
20 | /* | ||
21 | * Special constants | ||
22 | */ | ||
23 | |||
24 | /* | ||
25 | * Older GCC requires the inner braces for initialization of union ieee754dp's | ||
26 | * anonymous struct member. Without an error will result. | ||
27 | */ | ||
28 | #define xPCNST(s, b, m, ebias) \ | ||
29 | { \ | ||
30 | { \ | ||
31 | .sign = (s), \ | ||
32 | .bexp = (b) + ebias, \ | ||
33 | .mant = (m) \ | ||
34 | } \ | ||
35 | } | ||
36 | |||
37 | #define DPCNST(s, b, m) \ | ||
38 | xPCNST(s, b, m, DP_EBIAS) | ||
39 | |||
40 | const union ieee754dp __ieee754dp_spcvals[] = { | ||
41 | DPCNST(0, DP_EMIN - 1, 0x0000000000000ULL), /* + zero */ | ||
42 | DPCNST(1, DP_EMIN - 1, 0x0000000000000ULL), /* - zero */ | ||
43 | DPCNST(0, 0, 0x0000000000000ULL), /* + 1.0 */ | ||
44 | DPCNST(1, 0, 0x0000000000000ULL), /* - 1.0 */ | ||
45 | DPCNST(0, 3, 0x4000000000000ULL), /* + 10.0 */ | ||
46 | DPCNST(1, 3, 0x4000000000000ULL), /* - 10.0 */ | ||
47 | DPCNST(0, DP_EMAX + 1, 0x0000000000000ULL), /* + infinity */ | ||
48 | DPCNST(1, DP_EMAX + 1, 0x0000000000000ULL), /* - infinity */ | ||
49 | DPCNST(0, DP_EMAX + 1, 0x7FFFFFFFFFFFFULL), /* + ind legacy qNaN */ | ||
50 | DPCNST(0, DP_EMAX + 1, 0x8000000000000ULL), /* + indef 2008 qNaN */ | ||
51 | DPCNST(0, DP_EMAX, 0xFFFFFFFFFFFFFULL), /* + max */ | ||
52 | DPCNST(1, DP_EMAX, 0xFFFFFFFFFFFFFULL), /* - max */ | ||
53 | DPCNST(0, DP_EMIN, 0x0000000000000ULL), /* + min normal */ | ||
54 | DPCNST(1, DP_EMIN, 0x0000000000000ULL), /* - min normal */ | ||
55 | DPCNST(0, DP_EMIN - 1, 0x0000000000001ULL), /* + min denormal */ | ||
56 | DPCNST(1, DP_EMIN - 1, 0x0000000000001ULL), /* - min denormal */ | ||
57 | DPCNST(0, 31, 0x0000000000000ULL), /* + 1.0e31 */ | ||
58 | DPCNST(0, 63, 0x0000000000000ULL), /* + 1.0e63 */ | ||
59 | }; | ||
60 | |||
61 | #define SPCNST(s, b, m) \ | ||
62 | xPCNST(s, b, m, SP_EBIAS) | ||
63 | |||
64 | const union ieee754sp __ieee754sp_spcvals[] = { | ||
65 | SPCNST(0, SP_EMIN - 1, 0x000000), /* + zero */ | ||
66 | SPCNST(1, SP_EMIN - 1, 0x000000), /* - zero */ | ||
67 | SPCNST(0, 0, 0x000000), /* + 1.0 */ | ||
68 | SPCNST(1, 0, 0x000000), /* - 1.0 */ | ||
69 | SPCNST(0, 3, 0x200000), /* + 10.0 */ | ||
70 | SPCNST(1, 3, 0x200000), /* - 10.0 */ | ||
71 | SPCNST(0, SP_EMAX + 1, 0x000000), /* + infinity */ | ||
72 | SPCNST(1, SP_EMAX + 1, 0x000000), /* - infinity */ | ||
73 | SPCNST(0, SP_EMAX + 1, 0x3FFFFF), /* + indef legacy quiet NaN */ | ||
74 | SPCNST(0, SP_EMAX + 1, 0x400000), /* + indef 2008 quiet NaN */ | ||
75 | SPCNST(0, SP_EMAX, 0x7FFFFF), /* + max normal */ | ||
76 | SPCNST(1, SP_EMAX, 0x7FFFFF), /* - max normal */ | ||
77 | SPCNST(0, SP_EMIN, 0x000000), /* + min normal */ | ||
78 | SPCNST(1, SP_EMIN, 0x000000), /* - min normal */ | ||
79 | SPCNST(0, SP_EMIN - 1, 0x000001), /* + min denormal */ | ||
80 | SPCNST(1, SP_EMIN - 1, 0x000001), /* - min denormal */ | ||
81 | SPCNST(0, 31, 0x000000), /* + 1.0e31 */ | ||
82 | SPCNST(0, 63, 0x000000), /* + 1.0e63 */ | ||
83 | }; | ||