Loading...
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
40const 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
64const 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};
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
40const 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
64const 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};