root/arch/mips/math-emu/ieee754dp.h

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

INCLUDED FROM


DEFINITIONS

This source file includes following definitions.
  1. ieee754dp_finite
  2. builddp

   1 /* SPDX-License-Identifier: GPL-2.0-only */
   2 /*
   3  * IEEE754 floating point
   4  * double precision internal header file
   5  */
   6 /*
   7  * MIPS floating point support
   8  * Copyright (C) 1994-2000 Algorithmics Ltd.
   9  */
  10 
  11 #include <linux/compiler.h>
  12 
  13 #include "ieee754int.h"
  14 
  15 #define assert(expr) ((void)0)
  16 
  17 #define DP_EBIAS        1023
  18 #define DP_EMIN         (-1022)
  19 #define DP_EMAX         1023
  20 #define DP_FBITS        52
  21 #define DP_MBITS        52
  22 
  23 #define DP_MBIT(x)      ((u64)1 << (x))
  24 #define DP_HIDDEN_BIT   DP_MBIT(DP_FBITS)
  25 #define DP_SIGN_BIT     DP_MBIT(63)
  26 
  27 #define DPSIGN(dp)      (dp.sign)
  28 #define DPBEXP(dp)      (dp.bexp)
  29 #define DPMANT(dp)      (dp.mant)
  30 
  31 static inline int ieee754dp_finite(union ieee754dp x)
  32 {
  33         return DPBEXP(x) != DP_EMAX + 1 + DP_EBIAS;
  34 }
  35 
  36 /* 3bit extended double precision sticky right shift */
  37 #define XDPSRS(v,rs)    \
  38         ((rs > (DP_FBITS+3))?1:((v) >> (rs)) | ((v) << (64-(rs)) != 0))
  39 
  40 #define XDPSRSX1() \
  41         (xe++, (xm = (xm >> 1) | (xm & 1)))
  42 
  43 #define XDPSRS1(v)      \
  44         (((v) >> 1) | ((v) & 1))
  45 
  46 /* 32bit * 32bit => 64bit unsigned integer multiplication */
  47 #define DPXMULT(x, y)   ((u64)(x) * (u64)y)
  48 
  49 /* convert denormal to normalized with extended exponent */
  50 #define DPDNORMx(m,e) \
  51         while ((m >> DP_FBITS) == 0) { m <<= 1; e--; }
  52 #define DPDNORMX        DPDNORMx(xm, xe)
  53 #define DPDNORMY        DPDNORMx(ym, ye)
  54 #define DPDNORMZ        DPDNORMx(zm, ze)
  55 
  56 static inline union ieee754dp builddp(int s, int bx, u64 m)
  57 {
  58         union ieee754dp r;
  59 
  60         assert((s) == 0 || (s) == 1);
  61         assert((bx) >= DP_EMIN - 1 + DP_EBIAS
  62                && (bx) <= DP_EMAX + 1 + DP_EBIAS);
  63         assert(((m) >> DP_FBITS) == 0);
  64 
  65         r.sign = s;
  66         r.bexp = bx;
  67         r.mant = m;
  68 
  69         return r;
  70 }
  71 
  72 extern union ieee754dp __cold ieee754dp_nanxcpt(union ieee754dp);
  73 extern union ieee754dp ieee754dp_format(int, int, u64);

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