linux/arch/mips/math-emu/ieee754int.h
<<
>>
Prefs
   1/*
   2 * IEEE754 floating point
   3 * common internal header file
   4 */
   5/*
   6 * MIPS floating point support
   7 * Copyright (C) 1994-2000 Algorithmics Ltd.
   8 *
   9 * ########################################################################
  10 *
  11 *  This program is free software; you can distribute it and/or modify it
  12 *  under the terms of the GNU General Public License (Version 2) as
  13 *  published by the Free Software Foundation.
  14 *
  15 *  This program is distributed in the hope it will be useful, but WITHOUT
  16 *  ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  17 *  FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
  18 *  for more details.
  19 *
  20 *  You should have received a copy of the GNU General Public License along
  21 *  with this program; if not, write to the Free Software Foundation, Inc.,
  22 *  59 Temple Place - Suite 330, Boston MA 02111-1307, USA.
  23 *
  24 * ########################################################################
  25 */
  26
  27
  28#include "ieee754.h"
  29
  30#define DP_EBIAS        1023
  31#define DP_EMIN         (-1022)
  32#define DP_EMAX         1023
  33#define DP_MBITS        52
  34
  35#define SP_EBIAS        127
  36#define SP_EMIN         (-126)
  37#define SP_EMAX         127
  38#define SP_MBITS        23
  39
  40#define DP_MBIT(x)      ((u64)1 << (x))
  41#define DP_HIDDEN_BIT   DP_MBIT(DP_MBITS)
  42#define DP_SIGN_BIT     DP_MBIT(63)
  43
  44#define SP_MBIT(x)      ((u32)1 << (x))
  45#define SP_HIDDEN_BIT   SP_MBIT(SP_MBITS)
  46#define SP_SIGN_BIT     SP_MBIT(31)
  47
  48
  49#define SPSIGN(sp)      (sp.parts.sign)
  50#define SPBEXP(sp)      (sp.parts.bexp)
  51#define SPMANT(sp)      (sp.parts.mant)
  52
  53#define DPSIGN(dp)      (dp.parts.sign)
  54#define DPBEXP(dp)      (dp.parts.bexp)
  55#define DPMANT(dp)      (dp.parts.mant)
  56
  57#define CLPAIR(x, y)    ((x)*6+(y))
  58
  59#define CLEARCX \
  60  (ieee754_csr.cx = 0)
  61
  62#define SETCX(x) \
  63  (ieee754_csr.cx |= (x), ieee754_csr.sx |= (x))
  64
  65#define SETANDTESTCX(x) \
  66  (SETCX(x), ieee754_csr.mx & (x))
  67
  68#define TSTX()  \
  69        (ieee754_csr.cx & ieee754_csr.mx)
  70
  71
  72#define COMPXSP \
  73  unsigned xm; int xe; int xs __maybe_unused; int xc
  74
  75#define COMPYSP \
  76  unsigned ym; int ye; int ys; int yc
  77
  78#define EXPLODESP(v, vc, vs, ve, vm) \
  79{\
  80    vs = SPSIGN(v);\
  81    ve = SPBEXP(v);\
  82    vm = SPMANT(v);\
  83    if(ve == SP_EMAX+1+SP_EBIAS){\
  84        if(vm == 0)\
  85          vc = IEEE754_CLASS_INF;\
  86        else if(vm & SP_MBIT(SP_MBITS-1)) \
  87          vc = IEEE754_CLASS_SNAN;\
  88        else \
  89          vc = IEEE754_CLASS_QNAN;\
  90    } else if(ve == SP_EMIN-1+SP_EBIAS) {\
  91        if(vm) {\
  92            ve = SP_EMIN;\
  93            vc = IEEE754_CLASS_DNORM;\
  94        } else\
  95          vc = IEEE754_CLASS_ZERO;\
  96    } else {\
  97        ve -= SP_EBIAS;\
  98        vm |= SP_HIDDEN_BIT;\
  99        vc = IEEE754_CLASS_NORM;\
 100    }\
 101}
 102#define EXPLODEXSP EXPLODESP(x, xc, xs, xe, xm)
 103#define EXPLODEYSP EXPLODESP(y, yc, ys, ye, ym)
 104
 105
 106#define COMPXDP \
 107u64 xm; int xe; int xs __maybe_unused; int xc
 108
 109#define COMPYDP \
 110u64 ym; int ye; int ys; int yc
 111
 112#define EXPLODEDP(v, vc, vs, ve, vm) \
 113{\
 114    vm = DPMANT(v);\
 115    vs = DPSIGN(v);\
 116    ve = DPBEXP(v);\
 117    if(ve == DP_EMAX+1+DP_EBIAS){\
 118        if(vm == 0)\
 119          vc = IEEE754_CLASS_INF;\
 120        else if(vm & DP_MBIT(DP_MBITS-1)) \
 121          vc = IEEE754_CLASS_SNAN;\
 122        else \
 123          vc = IEEE754_CLASS_QNAN;\
 124    } else if(ve == DP_EMIN-1+DP_EBIAS) {\
 125        if(vm) {\
 126            ve = DP_EMIN;\
 127            vc = IEEE754_CLASS_DNORM;\
 128        } else\
 129          vc = IEEE754_CLASS_ZERO;\
 130    } else {\
 131        ve -= DP_EBIAS;\
 132        vm |= DP_HIDDEN_BIT;\
 133        vc = IEEE754_CLASS_NORM;\
 134    }\
 135}
 136#define EXPLODEXDP EXPLODEDP(x, xc, xs, xe, xm)
 137#define EXPLODEYDP EXPLODEDP(y, yc, ys, ye, ym)
 138
 139#define FLUSHDP(v, vc, vs, ve, vm) \
 140        if(vc==IEEE754_CLASS_DNORM) {\
 141            if(ieee754_csr.nod) {\
 142                SETCX(IEEE754_INEXACT);\
 143                vc = IEEE754_CLASS_ZERO;\
 144                ve = DP_EMIN-1+DP_EBIAS;\
 145                vm = 0;\
 146                v = ieee754dp_zero(vs);\
 147            }\
 148        }
 149
 150#define FLUSHSP(v, vc, vs, ve, vm) \
 151        if(vc==IEEE754_CLASS_DNORM) {\
 152            if(ieee754_csr.nod) {\
 153                SETCX(IEEE754_INEXACT);\
 154                vc = IEEE754_CLASS_ZERO;\
 155                ve = SP_EMIN-1+SP_EBIAS;\
 156                vm = 0;\
 157                v = ieee754sp_zero(vs);\
 158            }\
 159        }
 160
 161#define FLUSHXDP FLUSHDP(x, xc, xs, xe, xm)
 162#define FLUSHYDP FLUSHDP(y, yc, ys, ye, ym)
 163#define FLUSHXSP FLUSHSP(x, xc, xs, xe, xm)
 164#define FLUSHYSP FLUSHSP(y, yc, ys, ye, ym)
 165