Module Name:    src
Committed By:   isaki
Date:           Sun Jan 15 11:56:11 UTC 2017

Modified Files:
        src/sys/arch/m68k/fpe: fpu_exp.c

Log Message:
exp(>11356) is +inf even if extended precision.
exp(<-11401) is 0 even if extended precision.


To generate a diff of this commit:
cvs rdiff -u -r1.10 -r1.11 src/sys/arch/m68k/fpe/fpu_exp.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/arch/m68k/fpe/fpu_exp.c
diff -u src/sys/arch/m68k/fpe/fpu_exp.c:1.10 src/sys/arch/m68k/fpe/fpu_exp.c:1.11
--- src/sys/arch/m68k/fpe/fpu_exp.c:1.10	Wed Dec  7 11:27:18 2016
+++ src/sys/arch/m68k/fpe/fpu_exp.c	Sun Jan 15 11:56:11 2017
@@ -1,4 +1,4 @@
-/*	$NetBSD: fpu_exp.c,v 1.10 2016/12/07 11:27:18 isaki Exp $	*/
+/*	$NetBSD: fpu_exp.c,v 1.11 2017/01/15 11:56:11 isaki Exp $	*/
 
 /*
  * Copyright (c) 1995  Ken Nakata
@@ -32,7 +32,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: fpu_exp.c,v 1.10 2016/12/07 11:27:18 isaki Exp $");
+__KERNEL_RCSID(0, "$NetBSD: fpu_exp.c,v 1.11 2017/01/15 11:56:11 isaki Exp $");
 
 #include <machine/ieee.h>
 
@@ -109,7 +109,7 @@ struct fpn *
 fpu_etox(struct fpemu *fe)
 {
 	struct fpn x, *fp;
-	int j, k;
+	int k;
 
 	if (ISNAN(&fe->fe_f2))
 		return &fe->fe_f2;
@@ -119,6 +119,20 @@ fpu_etox(struct fpemu *fe)
 		return &fe->fe_f2;
 	}
 
+	/*
+	 * return inf if x >=  2^14
+	 * return +0  if x <= -2^14
+	 */
+	if (fe->fe_f2.fp_exp >= 14) {
+		if (fe->fe_f2.fp_sign) {
+			fe->fe_f2.fp_class = FPC_ZERO;
+			fe->fe_f2.fp_sign = 0;
+		} else {
+			fe->fe_f2.fp_class = FPC_INF;
+		}
+		return &fe->fe_f2;
+	}
+
 	CPYFPN(&x, &fe->fe_f2);
 
 	/* k = round(x / ln2) */
@@ -134,17 +148,7 @@ fpu_etox(struct fpemu *fe)
 		return fp;
 	}
 	/* extract k as integer format from fpn format */
-	j = FP_LG - fp->fp_exp;
-	if (j < 0) {
-		if (fp->fp_sign) {
-			fp->fp_class = FPC_ZERO;		/* k < -2^18 */
-			fp->fp_sign = 0;
-		} else {
-			fp->fp_class = FPC_INF;			/* k >  2^18 */
-		}
-		return fp;
-	}
-	k = fp->fp_mant[0] >> j;
+	k = fp->fp_mant[0] >> (FP_LG - fp->fp_exp);
 	if (fp->fp_sign)
 		k *= -1;
 

Reply via email to