linux/arch/mips/math-emu/sp_simple.c
<<
>>
Prefs
   1/* IEEE754 floating point arithmetic
   2 * single precision
   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 "ieee754sp.h"
  28
  29int ieee754sp_finite(ieee754sp x)
  30{
  31        return SPBEXP(x) != SP_EMAX + 1 + SP_EBIAS;
  32}
  33
  34ieee754sp ieee754sp_copysign(ieee754sp x, ieee754sp y)
  35{
  36        CLEARCX;
  37        SPSIGN(x) = SPSIGN(y);
  38        return x;
  39}
  40
  41
  42ieee754sp ieee754sp_neg(ieee754sp x)
  43{
  44        COMPXSP;
  45
  46        EXPLODEXSP;
  47        CLEARCX;
  48        FLUSHXSP;
  49
  50        /*
  51         * Invert the sign ALWAYS to prevent an endless recursion on
  52         * pow() in libc.
  53         */
  54        /* quick fix up */
  55        SPSIGN(x) ^= 1;
  56
  57        if (xc == IEEE754_CLASS_SNAN) {
  58                ieee754sp y = ieee754sp_indef();
  59                SETCX(IEEE754_INVALID_OPERATION);
  60                SPSIGN(y) = SPSIGN(x);
  61                return ieee754sp_nanxcpt(y, "neg");
  62        }
  63
  64        return x;
  65}
  66
  67
  68ieee754sp ieee754sp_abs(ieee754sp x)
  69{
  70        COMPXSP;
  71
  72        EXPLODEXSP;
  73        CLEARCX;
  74        FLUSHXSP;
  75
  76        /* Clear sign ALWAYS, irrespective of NaN */
  77        SPSIGN(x) = 0;
  78
  79        if (xc == IEEE754_CLASS_SNAN) {
  80                SETCX(IEEE754_INVALID_OPERATION);
  81                return ieee754sp_nanxcpt(ieee754sp_indef(), "abs");
  82        }
  83
  84        return x;
  85}
  86