root/arch/mips/math-emu/ieee754.c

/* [<][>][^][v][top][bottom][index][help] */
   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 };

/* [<][>][^][v][top][bottom][index][help] */