Merge tag 'locking-urgent-2020-12-27' of git://git.kernel.org/pub/scm/linux/kernel...
[linux/fpc-iii.git] / arch / mips / math-emu / ieee754.c
blob0ba5dfbd481423e49a008b9bea324bb776e1b8d4
1 // SPDX-License-Identifier: GPL-2.0-only
2 /* ieee754 floating point arithmetic
3 * single and double precision
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.
14 #include <linux/compiler.h>
16 #include "ieee754.h"
17 #include "ieee754sp.h"
18 #include "ieee754dp.h"
21 * Special constants
25 * Older GCC requires the inner braces for initialization of union ieee754dp's
26 * anonymous struct member. Without an error will result.
28 #define xPCNST(s, b, m, ebias) \
29 { \
30 { \
31 .sign = (s), \
32 .bexp = (b) + ebias, \
33 .mant = (m) \
34 } \
37 #define DPCNST(s, b, m) \
38 xPCNST(s, b, m, DP_EBIAS)
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 */
61 #define SPCNST(s, b, m) \
62 xPCNST(s, b, m, SP_EBIAS)
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 */