19d5a6349SThomas Gleixner // SPDX-License-Identifier: GPL-2.0-only 21da177e4SLinus Torvalds /* ieee754 floating point arithmetic 31da177e4SLinus Torvalds * single and double precision 41da177e4SLinus Torvalds * 51da177e4SLinus Torvalds * BUGS 61da177e4SLinus Torvalds * not much dp done 71da177e4SLinus Torvalds * doesn't generate IEEE754_INEXACT 81da177e4SLinus Torvalds */ 91da177e4SLinus Torvalds /* 101da177e4SLinus Torvalds * MIPS floating point support 111da177e4SLinus Torvalds * Copyright (C) 1994-2000 Algorithmics Ltd. 121da177e4SLinus Torvalds */ 131da177e4SLinus Torvalds 14cae55066SRalf Baechle #include <linux/compiler.h> 151da177e4SLinus Torvalds 1649548b09SRalf Baechle #include "ieee754.h" 17efec3c4eSRalf Baechle #include "ieee754sp.h" 18efec3c4eSRalf Baechle #include "ieee754dp.h" 191da177e4SLinus Torvalds 203f7cac41SRalf Baechle /* 213f7cac41SRalf Baechle * Special constants 221da177e4SLinus Torvalds */ 231da177e4SLinus Torvalds 2491496ea9SRalf Baechle /* 2591496ea9SRalf Baechle * Older GCC requires the inner braces for initialization of union ieee754dp's 2691496ea9SRalf Baechle * anonymous struct member. Without an error will result. 2791496ea9SRalf Baechle */ 28fb738f85SRalf Baechle #define xPCNST(s, b, m, ebias) \ 2990efba36SRalf Baechle { \ 3091496ea9SRalf Baechle { \ 3190efba36SRalf Baechle .sign = (s), \ 32fb738f85SRalf Baechle .bexp = (b) + ebias, \ 3390efba36SRalf Baechle .mant = (m) \ 3491496ea9SRalf Baechle } \ 3590efba36SRalf Baechle } 3690efba36SRalf Baechle 37fb738f85SRalf Baechle #define DPCNST(s, b, m) \ 38fb738f85SRalf Baechle xPCNST(s, b, m, DP_EBIAS) 39fb738f85SRalf Baechle 4049548b09SRalf Baechle const union ieee754dp __ieee754dp_spcvals[] = { 4149548b09SRalf Baechle DPCNST(0, DP_EMIN - 1, 0x0000000000000ULL), /* + zero */ 4249548b09SRalf Baechle DPCNST(1, DP_EMIN - 1, 0x0000000000000ULL), /* - zero */ 4349548b09SRalf Baechle DPCNST(0, 0, 0x0000000000000ULL), /* + 1.0 */ 4449548b09SRalf Baechle DPCNST(1, 0, 0x0000000000000ULL), /* - 1.0 */ 4549548b09SRalf Baechle DPCNST(0, 3, 0x4000000000000ULL), /* + 10.0 */ 4649548b09SRalf Baechle DPCNST(1, 3, 0x4000000000000ULL), /* - 10.0 */ 4749548b09SRalf Baechle DPCNST(0, DP_EMAX + 1, 0x0000000000000ULL), /* + infinity */ 4849548b09SRalf Baechle DPCNST(1, DP_EMAX + 1, 0x0000000000000ULL), /* - infinity */ 4990d53a91SMaciej W. Rozycki DPCNST(0, DP_EMAX + 1, 0x7FFFFFFFFFFFFULL), /* + ind legacy qNaN */ 5090d53a91SMaciej W. Rozycki DPCNST(0, DP_EMAX + 1, 0x8000000000000ULL), /* + indef 2008 qNaN */ 5149548b09SRalf Baechle DPCNST(0, DP_EMAX, 0xFFFFFFFFFFFFFULL), /* + max */ 5249548b09SRalf Baechle DPCNST(1, DP_EMAX, 0xFFFFFFFFFFFFFULL), /* - max */ 5349548b09SRalf Baechle DPCNST(0, DP_EMIN, 0x0000000000000ULL), /* + min normal */ 5449548b09SRalf Baechle DPCNST(1, DP_EMIN, 0x0000000000000ULL), /* - min normal */ 5549548b09SRalf Baechle DPCNST(0, DP_EMIN - 1, 0x0000000000001ULL), /* + min denormal */ 5649548b09SRalf Baechle DPCNST(1, DP_EMIN - 1, 0x0000000000001ULL), /* - min denormal */ 5749548b09SRalf Baechle DPCNST(0, 31, 0x0000000000000ULL), /* + 1.0e31 */ 5849548b09SRalf Baechle DPCNST(0, 63, 0x0000000000000ULL), /* + 1.0e63 */ 5949548b09SRalf Baechle }; 6049548b09SRalf Baechle 6149548b09SRalf Baechle #define SPCNST(s, b, m) \ 62fb738f85SRalf Baechle xPCNST(s, b, m, SP_EBIAS) 6349548b09SRalf Baechle 6449548b09SRalf Baechle const union ieee754sp __ieee754sp_spcvals[] = { 6549548b09SRalf Baechle SPCNST(0, SP_EMIN - 1, 0x000000), /* + zero */ 6649548b09SRalf Baechle SPCNST(1, SP_EMIN - 1, 0x000000), /* - zero */ 6749548b09SRalf Baechle SPCNST(0, 0, 0x000000), /* + 1.0 */ 6849548b09SRalf Baechle SPCNST(1, 0, 0x000000), /* - 1.0 */ 6949548b09SRalf Baechle SPCNST(0, 3, 0x200000), /* + 10.0 */ 7049548b09SRalf Baechle SPCNST(1, 3, 0x200000), /* - 10.0 */ 7149548b09SRalf Baechle SPCNST(0, SP_EMAX + 1, 0x000000), /* + infinity */ 7249548b09SRalf Baechle SPCNST(1, SP_EMAX + 1, 0x000000), /* - infinity */ 7390d53a91SMaciej W. Rozycki SPCNST(0, SP_EMAX + 1, 0x3FFFFF), /* + indef legacy quiet NaN */ 7490d53a91SMaciej W. Rozycki SPCNST(0, SP_EMAX + 1, 0x400000), /* + indef 2008 quiet NaN */ 7549548b09SRalf Baechle SPCNST(0, SP_EMAX, 0x7FFFFF), /* + max normal */ 7649548b09SRalf Baechle SPCNST(1, SP_EMAX, 0x7FFFFF), /* - max normal */ 7749548b09SRalf Baechle SPCNST(0, SP_EMIN, 0x000000), /* + min normal */ 7849548b09SRalf Baechle SPCNST(1, SP_EMIN, 0x000000), /* - min normal */ 7949548b09SRalf Baechle SPCNST(0, SP_EMIN - 1, 0x000001), /* + min denormal */ 8049548b09SRalf Baechle SPCNST(1, SP_EMIN - 1, 0x000001), /* - min denormal */ 8149548b09SRalf Baechle SPCNST(0, 31, 0x000000), /* + 1.0e31 */ 8249548b09SRalf Baechle SPCNST(0, 63, 0x000000), /* + 1.0e63 */ 831da177e4SLinus Torvalds }; 84