linux/arch/mips/math-emu/ieee754.c
<<
>>
Prefs
   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};
  84