linux/arch/mips/math-emu/dp_simple.c
<<
>>
Prefs
   1/* IEEE754 floating point arithmetic
   2 * double precision: common utilities
   3 */
   4/*
   5 * MIPS floating point support
   6 * Copyright (C) 1994-2000 Algorithmics Ltd.
   7 *
   8 * ########################################################################
   9 *
  10 *  This program is free software; you can distribute it and/or modify it
  11 *  under the terms of the GNU General Public License (Version 2) as
  12 *  published by the Free Software Foundation.
  13 *
  14 *  This program is distributed in the hope it will be useful, but WITHOUT
  15 *  ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  16 *  FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
  17 *  for more details.
  18 *
  19 *  You should have received a copy of the GNU General Public License along
  20 *  with this program; if not, write to the Free Software Foundation, Inc.,
  21 *  59 Temple Place - Suite 330, Boston MA 02111-1307, USA.
  22 *
  23 * ########################################################################
  24 */
  25
  26
  27#include "ieee754dp.h"
  28
  29int ieee754dp_finite(ieee754dp x)
  30{
  31        return DPBEXP(x) != DP_EMAX + 1 + DP_EBIAS;
  32}
  33
  34ieee754dp ieee754dp_copysign(ieee754dp x, ieee754dp y)
  35{
  36        CLEARCX;
  37        DPSIGN(x) = DPSIGN(y);
  38        return x;
  39}
  40
  41
  42ieee754dp ieee754dp_neg(ieee754dp x)
  43{
  44        COMPXDP;
  45
  46        EXPLODEXDP;
  47        CLEARCX;
  48        FLUSHXDP;
  49
  50        /*
  51         * Invert the sign ALWAYS to prevent an endless recursion on
  52         * pow() in libc.
  53         */
  54        /* quick fix up */
  55        DPSIGN(x) ^= 1;
  56
  57        if (xc == IEEE754_CLASS_SNAN) {
  58                ieee754dp y = ieee754dp_indef();
  59                SETCX(IEEE754_INVALID_OPERATION);
  60                DPSIGN(y) = DPSIGN(x);
  61                return ieee754dp_nanxcpt(y, "neg");
  62        }
  63
  64        return x;
  65}
  66
  67
  68ieee754dp ieee754dp_abs(ieee754dp x)
  69{
  70        COMPXDP;
  71
  72        EXPLODEXDP;
  73        CLEARCX;
  74        FLUSHXDP;
  75
  76        /* Clear sign ALWAYS, irrespective of NaN */
  77        DPSIGN(x) = 0;
  78
  79        if (xc == IEEE754_CLASS_SNAN) {
  80                SETCX(IEEE754_INVALID_OPERATION);
  81                return ieee754dp_nanxcpt(ieee754dp_indef(), "abs");
  82        }
  83
  84        return x;
  85}
  86