diff options
Diffstat (limited to 'arch/mips/math-emu/dp_div.c')
| -rw-r--r-- | arch/mips/math-emu/dp_div.c | 94 | 
1 files changed, 46 insertions, 48 deletions
diff --git a/arch/mips/math-emu/dp_div.c b/arch/mips/math-emu/dp_div.c index a1bce1b7c09..bef0e55e593 100644 --- a/arch/mips/math-emu/dp_div.c +++ b/arch/mips/math-emu/dp_div.c @@ -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. @@ -18,23 +16,24 @@   *   *  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_div(ieee754dp x, ieee754dp y) +union ieee754dp ieee754dp_div(union ieee754dp x, union ieee754dp y)  { +	u64 rm; +	int re; +	u64 bm; +  	COMPXDP;  	COMPYDP;  	EXPLODEXDP;  	EXPLODEYDP; -	CLEARCX; +	ieee754_clearcx();  	FLUSHXDP;  	FLUSHYDP; @@ -51,8 +50,8 @@ ieee754dp ieee754dp_div(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(), "div", 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,12 +67,12 @@ ieee754dp ieee754dp_div(ieee754dp x, ieee754dp y)  		return x; -		/* Infinity handling -		 */ - +	/* +	 * Infinity handling +	 */  	case CLPAIR(IEEE754_CLASS_INF, IEEE754_CLASS_INF): -		SETCX(IEEE754_INVALID_OPERATION); -		return ieee754dp_xcpt(ieee754dp_indef(), "div", x, y); +		ieee754_setcx(IEEE754_INVALID_OPERATION); +		return ieee754dp_indef();  	case CLPAIR(IEEE754_CLASS_NORM, IEEE754_CLASS_INF):  	case CLPAIR(IEEE754_CLASS_ZERO, IEEE754_CLASS_INF): @@ -85,17 +84,17 @@ ieee754dp ieee754dp_div(ieee754dp x, ieee754dp y)  	case CLPAIR(IEEE754_CLASS_INF, IEEE754_CLASS_DNORM):  		return ieee754dp_inf(xs ^ ys); -		/* Zero handling -		 */ - +	/* +	 * Zero handling +	 */  	case CLPAIR(IEEE754_CLASS_ZERO, IEEE754_CLASS_ZERO): -		SETCX(IEEE754_INVALID_OPERATION); -		return ieee754dp_xcpt(ieee754dp_indef(), "div", x, y); +		ieee754_setcx(IEEE754_INVALID_OPERATION); +		return ieee754dp_indef();  	case CLPAIR(IEEE754_CLASS_NORM, IEEE754_CLASS_ZERO):  	case CLPAIR(IEEE754_CLASS_DNORM, IEEE754_CLASS_ZERO): -		SETCX(IEEE754_ZERO_DIVIDE); -		return ieee754dp_xcpt(ieee754dp_inf(xs ^ ys), "div", x, y); +		ieee754_setcx(IEEE754_ZERO_DIVIDE); +		return ieee754dp_inf(xs ^ ys);  	case CLPAIR(IEEE754_CLASS_ZERO, IEEE754_CLASS_NORM):  	case CLPAIR(IEEE754_CLASS_ZERO, IEEE754_CLASS_DNORM): @@ -122,35 +121,34 @@ ieee754dp ieee754dp_div(ieee754dp x, ieee754dp y)  	xm <<= 3;  	ym <<= 3; -	{ -		/* now the dirty work */ - -		u64 rm = 0; -		int re = xe - ye; -		u64 bm; - -		for (bm = DP_MBIT(DP_MBITS + 2); bm; bm >>= 1) { -			if (xm >= ym) { -				xm -= ym; -				rm |= bm; -				if (xm == 0) -					break; -			} -			xm <<= 1; -		} -		rm <<= 1; -		if (xm) -			rm |= 1;	/* have remainder, set sticky */ +	/* now the dirty work */ -		assert(rm); +	rm = 0; +	re = xe - ye; -		/* normalise rm to rounding precision ? -		 */ -		while ((rm >> (DP_MBITS + 3)) == 0) { -			rm <<= 1; -			re--; +	for (bm = DP_MBIT(DP_FBITS + 2); bm; bm >>= 1) { +		if (xm >= ym) { +			xm -= ym; +			rm |= bm; +			if (xm == 0) +				break;  		} +		xm <<= 1; +	} + +	rm <<= 1; +	if (xm) +		rm |= 1;	/* have remainder, set sticky */ -		DPNORMRET2(xs == ys ? 0 : 1, re, rm, "div", x, y); +	assert(rm); + +	/* +	 * Normalise rm to rounding precision ? +	 */ +	while ((rm >> (DP_FBITS + 3)) == 0) { +		rm <<= 1; +		re--;  	} + +	return ieee754dp_format(xs == ys ? 0 : 1, re, rm);  }  | 
