]> git.karo-electronics.de Git - karo-tx-linux.git/blobdiff - arch/mips/math-emu/dp_sub.c
Merge branch 'misc' of git://git.kernel.org/pub/scm/linux/kernel/git/mmarek/kbuild
[karo-tx-linux.git] / arch / mips / math-emu / dp_sub.c
index 91e0a4b5cbc76ebad10302781fcf753d09bec6dd..7a174029043a674348619f65de6d5433dd25b283 100644 (file)
@@ -5,8 +5,6 @@
  * MIPS floating point support
  * Copyright (C) 1994-2000 Algorithmics Ltd.
  *
- * ########################################################################
- *
  *  This program is free software; you can distribute it and/or modify it
  *  under the terms of the GNU General Public License (Version 2) as
  *  published by the Free Software Foundation.
  *
  *  You should have received a copy of the GNU General Public License along
  *  with this program; if not, write to the Free Software Foundation, Inc.,
- *  59 Temple Place - Suite 330, Boston MA 02111-1307, USA.
- *
- * ########################################################################
+ *  51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA.
  */
 
-
 #include "ieee754dp.h"
 
-ieee754dp ieee754dp_sub(ieee754dp x, ieee754dp y)
+union ieee754dp ieee754dp_sub(union ieee754dp x, union ieee754dp y)
 {
+       int s;
+
        COMPXDP;
        COMPYDP;
 
        EXPLODEXDP;
        EXPLODEYDP;
 
-       CLEARCX;
+       ieee754_clearcx();
 
        FLUSHXDP;
        FLUSHYDP;
@@ -51,8 +48,8 @@ ieee754dp ieee754dp_sub(ieee754dp x, ieee754dp y)
        case CLPAIR(IEEE754_CLASS_SNAN, IEEE754_CLASS_NORM):
        case CLPAIR(IEEE754_CLASS_SNAN, IEEE754_CLASS_DNORM):
        case CLPAIR(IEEE754_CLASS_SNAN, IEEE754_CLASS_INF):
-               SETCX(IEEE754_INVALID_OPERATION);
-               return ieee754dp_nanxcpt(ieee754dp_indef(), "sub", x, y);
+               ieee754_setcx(IEEE754_INVALID_OPERATION);
+               return ieee754dp_nanxcpt(ieee754dp_indef());
 
        case CLPAIR(IEEE754_CLASS_ZERO, IEEE754_CLASS_QNAN):
        case CLPAIR(IEEE754_CLASS_NORM, IEEE754_CLASS_QNAN):
@@ -68,14 +65,14 @@ ieee754dp ieee754dp_sub(ieee754dp x, ieee754dp y)
                return x;
 
 
-               /* Infinity handling
-                */
-
+       /*
+        * Infinity handling
+        */
        case CLPAIR(IEEE754_CLASS_INF, IEEE754_CLASS_INF):
                if (xs != ys)
                        return x;
-               SETCX(IEEE754_INVALID_OPERATION);
-               return ieee754dp_xcpt(ieee754dp_indef(), "sub", x, y);
+               ieee754_setcx(IEEE754_INVALID_OPERATION);
+               return ieee754dp_indef();
 
        case CLPAIR(IEEE754_CLASS_ZERO, IEEE754_CLASS_INF):
        case CLPAIR(IEEE754_CLASS_DNORM, IEEE754_CLASS_INF):
@@ -87,15 +84,14 @@ ieee754dp ieee754dp_sub(ieee754dp x, ieee754dp y)
        case CLPAIR(IEEE754_CLASS_INF, IEEE754_CLASS_DNORM):
                return x;
 
-               /* Zero handling
-                */
-
+       /*
+        * Zero handling
+        */
        case CLPAIR(IEEE754_CLASS_ZERO, IEEE754_CLASS_ZERO):
                if (xs != ys)
                        return x;
                else
-                       return ieee754dp_zero(ieee754_csr.rm ==
-                                             IEEE754_RD);
+                       return ieee754dp_zero(ieee754_csr.rm == FPU_CSR_RD);
 
        case CLPAIR(IEEE754_CLASS_NORM, IEEE754_CLASS_ZERO):
        case CLPAIR(IEEE754_CLASS_DNORM, IEEE754_CLASS_ZERO):
@@ -136,15 +132,17 @@ ieee754dp ieee754dp_sub(ieee754dp x, ieee754dp y)
        ym <<= 3;
 
        if (xe > ye) {
-               /* have to shift y fraction right to align
+               /*
+                * Have to shift y fraction right to align
                 */
-               int s = xe - ye;
+               s = xe - ye;
                ym = XDPSRS(ym, s);
                ye += s;
        } else if (ye > xe) {
-               /* have to shift x fraction right to align
+               /*
+                * Have to shift x fraction right to align
                 */
-               int s = ye - xe;
+               s = ye - xe;
                xm = XDPSRS(xm, s);
                xe += s;
        }
@@ -158,7 +156,7 @@ ieee754dp ieee754dp_sub(ieee754dp x, ieee754dp y)
                xe = xe;
                xs = xs;
 
-               if (xm >> (DP_MBITS + 1 + 3)) { /* carry out */
+               if (xm >> (DP_FBITS + 1 + 3)) { /* carry out */
                        xm = XDPSRS1(xm);       /* shift preserving sticky */
                        xe++;
                }
@@ -173,7 +171,7 @@ ieee754dp ieee754dp_sub(ieee754dp x, ieee754dp y)
                        xs = ys;
                }
                if (xm == 0) {
-                       if (ieee754_csr.rm == IEEE754_RD)
+                       if (ieee754_csr.rm == FPU_CSR_RD)
                                return ieee754dp_zero(1);       /* round negative inf. => sign = -1 */
                        else
                                return ieee754dp_zero(0);       /* other round modes   => sign = 1 */
@@ -181,10 +179,11 @@ ieee754dp ieee754dp_sub(ieee754dp x, ieee754dp y)
 
                /* normalize to rounding precision
                 */
-               while ((xm >> (DP_MBITS + 3)) == 0) {
+               while ((xm >> (DP_FBITS + 3)) == 0) {
                        xm <<= 1;
                        xe--;
                }
        }
-       DPNORMRET2(xs, xe, xm, "sub", x, y);
+
+       return ieee754dp_format(xs, xe, xm);
 }