CVS commit: src/sys/arch/m68k/fpe

2021-03-08 Thread Tetsuya Isaki
Module Name:src
Committed By:   isaki
Date:   Mon Mar  8 14:37:55 UTC 2021

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

Log Message:
Remove incorrect byte and word conversions from fpu_explode.
The correct operation here is arithmetic right shift, but nobody calls it.


To generate a diff of this commit:
cvs rdiff -u -r1.15 -r1.16 src/sys/arch/m68k/fpe/fpu_explode.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_explode.c
diff -u src/sys/arch/m68k/fpe/fpu_explode.c:1.15 src/sys/arch/m68k/fpe/fpu_explode.c:1.16
--- src/sys/arch/m68k/fpe/fpu_explode.c:1.15	Thu Feb  5 12:23:27 2015
+++ src/sys/arch/m68k/fpe/fpu_explode.c	Mon Mar  8 14:37:55 2021
@@ -1,4 +1,4 @@
-/*	$NetBSD: fpu_explode.c,v 1.15 2015/02/05 12:23:27 isaki Exp $ */
+/*	$NetBSD: fpu_explode.c,v 1.16 2021/03/08 14:37:55 isaki Exp $ */
 
 /*
  * Copyright (c) 1992, 1993
@@ -46,7 +46,7 @@
  */
 
 #include 
-__KERNEL_RCSID(0, "$NetBSD: fpu_explode.c,v 1.15 2015/02/05 12:23:27 isaki Exp $");
+__KERNEL_RCSID(0, "$NetBSD: fpu_explode.c,v 1.16 2021/03/08 14:37:55 isaki Exp $");
 
 #include 
 #include 
@@ -230,11 +230,6 @@ fpu_explode(struct fpemu *fe, struct fpn
 	fp->fp_sign = s >> 31;
 	fp->fp_sticky = 0;
 	switch (type) {
-
-	case FTYPE_BYT:
-		s >>= 8;
-	case FTYPE_WRD:
-		s >>= 16;
 	case FTYPE_LNG:
 		s = fpu_itof(fp, s);
 		break;
@@ -251,6 +246,10 @@ fpu_explode(struct fpemu *fe, struct fpn
 		s = fpu_xtof(fp, s, space[1], space[2]);
 		break;
 
+	case FTYPE_BYT:
+	case FTYPE_WRD:
+		/* Caller must cast it to signed LNG instead of calling this */
+		/* FALLTHROUGH */
 	default:
 		panic("fpu_explode");
 	}



CVS commit: src/sys/arch/m68k/fpe

2016-12-05 Thread Tetsuya Isaki
Module Name:src
Committed By:   isaki
Date:   Mon Dec  5 15:31:01 UTC 2016

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

Log Message:
Improve the exponential and hyperbolic function's performance
10..100 times faster.
PR port-m68k/51645 from rin@ (and modified by me)


To generate a diff of this commit:
cvs rdiff -u -r1.8 -r1.9 src/sys/arch/m68k/fpe/fpu_exp.c
cvs rdiff -u -r1.16 -r1.17 src/sys/arch/m68k/fpe/fpu_hyperb.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.8 src/sys/arch/m68k/fpe/fpu_exp.c:1.9
--- src/sys/arch/m68k/fpe/fpu_exp.c:1.8	Sat Apr 20 04:54:22 2013
+++ src/sys/arch/m68k/fpe/fpu_exp.c	Mon Dec  5 15:31:01 2016
@@ -1,4 +1,4 @@
-/*	$NetBSD: fpu_exp.c,v 1.8 2013/04/20 04:54:22 isaki Exp $	*/
+/*	$NetBSD: fpu_exp.c,v 1.9 2016/12/05 15:31:01 isaki Exp $	*/
 
 /*
  * Copyright (c) 1995  Ken Nakata
@@ -32,7 +32,7 @@
  */
 
 #include 
-__KERNEL_RCSID(0, "$NetBSD: fpu_exp.c,v 1.8 2013/04/20 04:54:22 isaki Exp $");
+__KERNEL_RCSID(0, "$NetBSD: fpu_exp.c,v 1.9 2016/12/05 15:31:01 isaki Exp $");
 
 #include 
 
@@ -100,12 +100,16 @@ fpu_etox_taylor(struct fpemu *fe)
 }
 
 /*
- * exp(x)
+ * exp(x) = 2^k * exp(r) with k = round(x / ln2) and r = x - k * ln2
+ *
+ * Algorithm partially taken from libm, where exp(r) is approximated by a
+ * rational function of r. We use the Taylor expansion instead.
  */
 struct fpn *
 fpu_etox(struct fpemu *fe)
 {
-	struct fpn *fp;
+	struct fpn x, *fp;
+	int j, k;
 
 	if (ISNAN(&fe->fe_f2))
 		return &fe->fe_f2;
@@ -115,19 +119,47 @@ fpu_etox(struct fpemu *fe)
 		return &fe->fe_f2;
 	}
 
-	if (fe->fe_f2.fp_sign == 0) {
-		/* exp(x) */
-		fp = fpu_etox_taylor(fe);
-	} else {
-		/* 1/exp(-x) */
-		fe->fe_f2.fp_sign = 0;
-		fp = fpu_etox_taylor(fe);
+	CPYFPN(&x, &fe->fe_f2);
 
-		CPYFPN(&fe->fe_f2, fp);
-		fpu_const(&fe->fe_f1, FPU_CONST_1);
-		fp = fpu_div(fe);
+	/* k = round(x / ln2) */
+	CPYFPN(&fe->fe_f1, &fe->fe_f2);
+	fpu_const(&fe->fe_f2, FPU_CONST_LN_2);
+	fp = fpu_div(fe);
+	CPYFPN(&fe->fe_f2, fp);
+	fp = fpu_int(fe);
+	if (ISZERO(fp)) {
+		/* k = 0 */
+		CPYFPN(&fe->fe_f2, &x);
+		fp = fpu_etox_taylor(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 */
+		else
+			fp->fp_class = FPC_INF;			/* k >  2^18 */
+		return fp;
 	}
-	
+	k = fp->fp_mant[0] >> j;
+	if (fp->fp_sign)
+		k *= -1;
+
+	/* exp(r) = exp(x - k * ln2) */
+	CPYFPN(&fe->fe_f1, fp);
+	fpu_const(&fe->fe_f2, FPU_CONST_LN_2);
+	fp = fpu_mul(fe);
+	fp->fp_sign = !fp->fp_sign;
+	CPYFPN(&fe->fe_f1, fp);
+	CPYFPN(&fe->fe_f2, &x);
+	fp = fpu_add(fe);
+	CPYFPN(&fe->fe_f2, fp);
+	fp = fpu_etox_taylor(fe);
+
+	/* 2^k */
+	fp->fp_exp += k;
+
 	return fp;
 }
 

Index: src/sys/arch/m68k/fpe/fpu_hyperb.c
diff -u src/sys/arch/m68k/fpe/fpu_hyperb.c:1.16 src/sys/arch/m68k/fpe/fpu_hyperb.c:1.17
--- src/sys/arch/m68k/fpe/fpu_hyperb.c:1.16	Fri Oct 11 03:37:08 2013
+++ src/sys/arch/m68k/fpe/fpu_hyperb.c	Mon Dec  5 15:31:01 2016
@@ -1,4 +1,4 @@
-/*	$NetBSD: fpu_hyperb.c,v 1.16 2013/10/11 03:37:08 isaki Exp $	*/
+/*	$NetBSD: fpu_hyperb.c,v 1.17 2016/12/05 15:31:01 isaki Exp $	*/
 
 /*
  * Copyright (c) 1995  Ken Nakata
@@ -57,15 +57,12 @@
  */
 
 #include 
-__KERNEL_RCSID(0, "$NetBSD: fpu_hyperb.c,v 1.16 2013/10/11 03:37:08 isaki Exp $");
+__KERNEL_RCSID(0, "$NetBSD: fpu_hyperb.c,v 1.17 2016/12/05 15:31:01 isaki Exp $");
 
 #include 
 
 #include "fpu_emulate.h"
 
-/* The number of items to terminate the Taylor expansion */
-#define MAX_ITEMS	(2000)
-
 /*
  * fpu_hyperb.c: defines the following functions
  *
@@ -137,71 +134,14 @@ fpu_atanh(struct fpemu *fe)
 }
 
 /*
- * taylor expansion used by sinh(), cosh().
+ *exp(x) + exp(-x)
+ * cosh(x) = --
+ *   2
  */
-static struct fpn *
-__fpu_sinhcosh_taylor(struct fpemu *fe, struct fpn *s0, uint32_t f)
-{
-	struct fpn res;
-	struct fpn x2;
-	struct fpn *s1;
-	struct fpn *r;
-	int sign;
-	uint32_t k;
-
-	/* x2 := x * x */
-	CPYFPN(&fe->fe_f1, &fe->fe_f2);
-	r = fpu_mul(fe);
-	CPYFPN(&x2, r);
-
-	/* res := s0 */
-	CPYFPN(&res, s0);
-
-	sign = 1;	/* sign := (-1)^n */
-
-	for (; f < (2 * MAX_ITEMS); ) {
-		/* (f1 :=) s0 * x^2 */
-		CPYFPN(&fe->fe_f1, s0);
-		CPYFPN(&fe->fe_f2, &x2);
-		r = fpu_mul(fe);
-		CPYFPN(&fe->fe_f1, r);
-
-		/*
-		 * for sinh(),  s1 := s0 * x^2 / (2n+1)2n
-		 * for cosh(),  s1 := s0 * x^2 / 2n(2n-1)
-		 */
-		k = f * (f + 1);
-		fpu_explode(fe, &fe->fe_f2, FTYPE_LNG, &k);
-		s1 = fpu_div(fe);
-
-		/* break if s1 is enough small */
-		if (ISZERO(s1))
-			break;
-		if (res.fp_exp - s1->fp_exp >= EXT_FRACBITS)
-			break;
-
-		/* s0 := s1 for next loop */
-		CPYFPN(s0, s1);
-
-		/* res += s1 */
-		CPYFPN(&fe->fe_f2, s1);
-		CPYFPN(&fe->fe_f1, &res);
-		r = fpu_add(fe);
-		CPYFPN(&res, r);
-
-		f +=

CVS commit: src/sys/arch/m68k/fpe

2016-12-05 Thread Tetsuya Isaki
Module Name:src
Committed By:   isaki
Date:   Tue Dec  6 05:58:19 UTC 2016

Modified Files:
src/sys/arch/m68k/fpe: fpu_cordic.c fpu_emulate.h

Log Message:
Remove fpu_cordit2() and atanh_table[] completely.
Since cordit1 (for trigonometric functions) and cordit2 (for
hyperbolic functions) are very similar, so I implemented both
at first, but I didn't use cordit2 after all :(


To generate a diff of this commit:
cvs rdiff -u -r1.3 -r1.4 src/sys/arch/m68k/fpe/fpu_cordic.c
cvs rdiff -u -r1.25 -r1.26 src/sys/arch/m68k/fpe/fpu_emulate.h

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_cordic.c
diff -u src/sys/arch/m68k/fpe/fpu_cordic.c:1.3 src/sys/arch/m68k/fpe/fpu_cordic.c:1.4
--- src/sys/arch/m68k/fpe/fpu_cordic.c:1.3	Thu Aug  4 05:35:18 2016
+++ src/sys/arch/m68k/fpe/fpu_cordic.c	Tue Dec  6 05:58:19 2016
@@ -1,4 +1,4 @@
-/*	$NetBSD: fpu_cordic.c,v 1.3 2016/08/04 05:35:18 isaki Exp $	*/
+/*	$NetBSD: fpu_cordic.c,v 1.4 2016/12/06 05:58:19 isaki Exp $	*/
 
 /*
  * Copyright (c) 2013 Tetsuya Isaki. All rights reserved.
@@ -26,7 +26,7 @@
  */
 
 #include 
-__KERNEL_RCSID(0, "$NetBSD: fpu_cordic.c,v 1.3 2016/08/04 05:35:18 isaki Exp $");
+__KERNEL_RCSID(0, "$NetBSD: fpu_cordic.c,v 1.4 2016/12/06 05:58:19 isaki Exp $");
 
 #include 
 
@@ -46,7 +46,7 @@ struct sfpn {
 #if defined(CORDIC_BOOTSTRAP)
 /*
  * This is a bootstrap code to generate a pre-calculated tables such as
- * atan_table[] and atanh_table[].  However, it's just for reference.
+ * atan_table[].  However, it's just for reference.
  * If you want to run the bootstrap, you will define CORDIC_BOOTSTRAP
  * and modify these files as a userland application.
  */
@@ -58,19 +58,13 @@ struct sfpn {
 
 static void prepare_cordic_const(struct fpemu *);
 static struct fpn *fpu_gain1_cordic(struct fpemu *);
-static struct fpn *fpu_gain2_cordic(struct fpemu *);
 static struct fpn *fpu_atan_taylor(struct fpemu *);
 static void printf_fpn(const struct fpn *);
 static void printf_sfpn(const struct sfpn *);
 static void fpn_to_sfpn(struct sfpn *, const struct fpn *);
 
 static struct sfpn atan_table[EXT_FRACBITS];
-static struct sfpn atanh_table[EXT_FRACBITS];
 static struct fpn inv_gain1;
-static struct fpn inv_gain2;
-
-static void fpu_cordit2(struct fpemu *,
-	struct fpn *, struct fpn *, struct fpn *, const struct fpn *);
 
 int
 main(int argc, char *argv[])
@@ -91,21 +85,9 @@ main(int argc, char *argv[])
 	}
 	printf("};\n\n");
 
-	printf("static const struct sfpn atanh_table[] = {\n");
-	for (i = 0; i < EXT_FRACBITS; i++) {
-		printf("\t");
-		printf_sfpn(&atanh_table[i]);
-		printf(",\n");
-	}
-	printf("};\n\n");
-
 	printf("const struct fpn fpu_cordic_inv_gain1 =\n\t");
 	printf_fpn(&inv_gain1);
 	printf(";\n\n");
-
-	printf("const struct fpn fpu_cordic_inv_gain2 =\n\t");
-	printf_fpn(&inv_gain2);
-	printf(";\n\n");
 }
 
 /*
@@ -120,7 +102,7 @@ prepare_cordic_const(struct fpemu *fe)
 	struct fpn *r;
 	int i;
 
-	/* atan_table and atanh_table */
+	/* atan_table */
 	fpu_const(&t, FPU_CONST_1);
 	for (i = 0; i < EXT_FRACBITS; i++) {
 		/* atan(t) */
@@ -130,32 +112,6 @@ prepare_cordic_const(struct fpemu *fe)
 
 		/* t /= 2 */
 		t.fp_exp--;
-
-		/* (1-t) */
-		fpu_const(&fe->fe_f1, FPU_CONST_1);
-		CPYFPN(&fe->fe_f2, &t);
-		fe->fe_f2.fp_sign = 1;
-		r = fpu_add(fe);
-		CPYFPN(&x, r);
-
-		/* (1+t) */
-		fpu_const(&fe->fe_f1, FPU_CONST_1);
-		CPYFPN(&fe->fe_f2, &t);
-		r = fpu_add(fe);
-
-		/* r = (1+t)/(1-t) */
-		CPYFPN(&fe->fe_f1, r);
-		CPYFPN(&fe->fe_f2, &x);
-		r = fpu_div(fe);
-
-		/* r = log(r) */
-		CPYFPN(&fe->fe_f2, r);
-		r = fpu_logn(fe);
-
-		/* r /= 2 */
-		r->fp_exp--;
-
-		fpn_to_sfpn(&atanh_table[i], r);
 	}
 
 	/* inv_gain1 = 1 / gain1cordic() */
@@ -164,13 +120,6 @@ prepare_cordic_const(struct fpemu *fe)
 	fpu_const(&fe->fe_f1, FPU_CONST_1);
 	r = fpu_div(fe);
 	CPYFPN(&inv_gain1, r);
-
-	/* inv_gain2 = 1 / gain2cordic() */
-	r = fpu_gain2_cordic(fe);
-	CPYFPN(&fe->fe_f2, r);
-	fpu_const(&fe->fe_f1, FPU_CONST_1);
-	r = fpu_div(fe);
-	CPYFPN(&inv_gain2, r);
 }
 
 static struct fpn *
@@ -192,25 +141,6 @@ fpu_gain1_cordic(struct fpemu *fe)
 	return &fe->fe_f2;
 }
 
-static struct fpn *
-fpu_gain2_cordic(struct fpemu *fe)
-{
-	struct fpn x;
-	struct fpn y;
-	struct fpn z;
-	struct fpn v;
-
-	fpu_const(&x, FPU_CONST_1);
-	fpu_const(&y, FPU_CONST_0);
-	fpu_const(&z, FPU_CONST_0);
-	CPYFPN(&v, &x);
-	v.fp_sign = !v.fp_sign;
-
-	fpu_cordit2(fe, &x, &y, &z, &v);
-	CPYFPN(&fe->fe_f2, &x);
-	return &fe->fe_f2;
-}
-
 /*
  * arctan(x) = pi/4 (for |x| = 1)
  *
@@ -373,79 +303,9 @@ static const struct sfpn atan_table[] = 
 	{ 0xc104, 0x, 0x, },
 };
 
-static const struct sfpn atanh_table[] = {
-	{ 0xff0464fa, 0x9eab40c2, 0xa5dc43f6, },
-	{ 0xfe04162b, 0xbea04514, 0x69ca8e4a, },
-	{ 0xfd040562, 0x4727abbd, 0xda654b67, },
-	{ 0xfc040156, 0x22b4dd6b, 0x372a679c, },
-	{ 0xfb040055, 0x62246bb8, 0x92d60b35, },
-	

CVS commit: src/sys/arch/m68k/fpe

2016-12-05 Thread Tetsuya Isaki
Module Name:src
Committed By:   isaki
Date:   Tue Dec  6 06:41:14 UTC 2016

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

Log Message:
Fix sign of NAN.  Found by XM6i.


To generate a diff of this commit:
cvs rdiff -u -r1.8 -r1.9 src/sys/arch/m68k/fpe/fpu_mul.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_mul.c
diff -u src/sys/arch/m68k/fpe/fpu_mul.c:1.8 src/sys/arch/m68k/fpe/fpu_mul.c:1.9
--- src/sys/arch/m68k/fpe/fpu_mul.c:1.8	Tue Mar 26 11:30:21 2013
+++ src/sys/arch/m68k/fpe/fpu_mul.c	Tue Dec  6 06:41:14 2016
@@ -1,4 +1,4 @@
-/*	$NetBSD: fpu_mul.c,v 1.8 2013/03/26 11:30:21 isaki Exp $ */
+/*	$NetBSD: fpu_mul.c,v 1.9 2016/12/06 06:41:14 isaki Exp $ */
 
 /*
  * Copyright (c) 1992, 1993
@@ -45,7 +45,7 @@
  */
 
 #include 
-__KERNEL_RCSID(0, "$NetBSD: fpu_mul.c,v 1.8 2013/03/26 11:30:21 isaki Exp $");
+__KERNEL_RCSID(0, "$NetBSD: fpu_mul.c,v 1.9 2016/12/06 06:41:14 isaki Exp $");
 
 #include 
 
@@ -122,7 +122,6 @@ fpu_mul(struct fpemu *fe)
 	 */
 	ORDER(x, y);
 	if (ISNAN(y)) {
-		y->fp_sign ^= x->fp_sign;
 		return (y);
 	}
 	if (ISINF(y)) {



CVS commit: src/sys/arch/m68k/fpe

2016-12-07 Thread Tetsuya Isaki
Module Name:src
Committed By:   isaki
Date:   Wed Dec  7 11:27:18 UTC 2016

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

Log Message:
Fix sign of zero in case of x > -(2^18).
# By the way, I will modify this case later.


To generate a diff of this commit:
cvs rdiff -u -r1.9 -r1.10 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.9 src/sys/arch/m68k/fpe/fpu_exp.c:1.10
--- src/sys/arch/m68k/fpe/fpu_exp.c:1.9	Mon Dec  5 15:31:01 2016
+++ src/sys/arch/m68k/fpe/fpu_exp.c	Wed Dec  7 11:27:18 2016
@@ -1,4 +1,4 @@
-/*	$NetBSD: fpu_exp.c,v 1.9 2016/12/05 15:31:01 isaki Exp $	*/
+/*	$NetBSD: fpu_exp.c,v 1.10 2016/12/07 11:27:18 isaki Exp $	*/
 
 /*
  * Copyright (c) 1995  Ken Nakata
@@ -32,7 +32,7 @@
  */
 
 #include 
-__KERNEL_RCSID(0, "$NetBSD: fpu_exp.c,v 1.9 2016/12/05 15:31:01 isaki Exp $");
+__KERNEL_RCSID(0, "$NetBSD: fpu_exp.c,v 1.10 2016/12/07 11:27:18 isaki Exp $");
 
 #include 
 
@@ -136,10 +136,12 @@ fpu_etox(struct fpemu *fe)
 	/* extract k as integer format from fpn format */
 	j = FP_LG - fp->fp_exp;
 	if (j < 0) {
-		if (fp->fp_sign)
+		if (fp->fp_sign) {
 			fp->fp_class = FPC_ZERO;		/* k < -2^18 */
-		else
+			fp->fp_sign = 0;
+		} else {
 			fp->fp_class = FPC_INF;			/* k >  2^18 */
+		}
 		return fp;
 	}
 	k = fp->fp_mant[0] >> j;



CVS commit: src/sys/arch/m68k/fpe

2016-08-03 Thread Tetsuya Isaki
Module Name:src
Committed By:   isaki
Date:   Thu Aug  4 05:35:19 UTC 2016

Modified Files:
src/sys/arch/m68k/fpe: fpu_cordic.c fpu_emulate.h

Log Message:
Move fpu_cordit2() to #ifdef CORDIC_BOOTSTRAP section.
This reduces ~2KB text segment.
Reported by Krister Walfridsson on tech-kern two months ago.


To generate a diff of this commit:
cvs rdiff -u -r1.2 -r1.3 src/sys/arch/m68k/fpe/fpu_cordic.c
cvs rdiff -u -r1.24 -r1.25 src/sys/arch/m68k/fpe/fpu_emulate.h

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_cordic.c
diff -u src/sys/arch/m68k/fpe/fpu_cordic.c:1.2 src/sys/arch/m68k/fpe/fpu_cordic.c:1.3
--- src/sys/arch/m68k/fpe/fpu_cordic.c:1.2	Sat Apr 20 01:48:20 2013
+++ src/sys/arch/m68k/fpe/fpu_cordic.c	Thu Aug  4 05:35:18 2016
@@ -1,4 +1,4 @@
-/*	$NetBSD: fpu_cordic.c,v 1.2 2013/04/20 01:48:20 isaki Exp $	*/
+/*	$NetBSD: fpu_cordic.c,v 1.3 2016/08/04 05:35:18 isaki Exp $	*/
 
 /*
  * Copyright (c) 2013 Tetsuya Isaki. All rights reserved.
@@ -26,7 +26,7 @@
  */
 
 #include 
-__KERNEL_RCSID(0, "$NetBSD: fpu_cordic.c,v 1.2 2013/04/20 01:48:20 isaki Exp $");
+__KERNEL_RCSID(0, "$NetBSD: fpu_cordic.c,v 1.3 2016/08/04 05:35:18 isaki Exp $");
 
 #include 
 
@@ -69,6 +69,9 @@ static struct sfpn atanh_table[EXT_FRACB
 static struct fpn inv_gain1;
 static struct fpn inv_gain2;
 
+static void fpu_cordit2(struct fpemu *,
+	struct fpn *, struct fpn *, struct fpn *, const struct fpn *);
+
 int
 main(int argc, char *argv[])
 {
@@ -548,7 +551,8 @@ fpu_cordit1(struct fpemu *fe, struct fpn
 	CPYFPN(z0, &z);
 }
 
-void
+#if defined(CORDIC_BOOTSTRAP)
+static void
 fpu_cordit2(struct fpemu *fe, struct fpn *x0, struct fpn *y0, struct fpn *z0,
 	const struct fpn *vecmode)
 {
@@ -644,3 +648,4 @@ fpu_cordit2(struct fpemu *fe, struct fpn
 	CPYFPN(y0, &y);
 	CPYFPN(z0, &z);
 }
+#endif /* CORDIC_BOOTSTRAP */

Index: src/sys/arch/m68k/fpe/fpu_emulate.h
diff -u src/sys/arch/m68k/fpe/fpu_emulate.h:1.24 src/sys/arch/m68k/fpe/fpu_emulate.h:1.25
--- src/sys/arch/m68k/fpe/fpu_emulate.h:1.24	Fri Apr 19 13:31:11 2013
+++ src/sys/arch/m68k/fpe/fpu_emulate.h	Thu Aug  4 05:35:18 2016
@@ -1,4 +1,4 @@
-/*	$NetBSD: fpu_emulate.h,v 1.24 2013/04/19 13:31:11 isaki Exp $	*/
+/*	$NetBSD: fpu_emulate.h,v 1.25 2016/08/04 05:35:18 isaki Exp $	*/
 
 /*
  * Copyright (c) 1995 Gordon Ross
@@ -251,8 +251,6 @@ extern const struct fpn fpu_cordic_inv_g
 extern const struct fpn fpu_cordic_inv_gain2;
 void fpu_cordit1(struct fpemu *,
 	struct fpn *, struct fpn *, struct fpn *, const struct fpn *);
-void fpu_cordit2(struct fpemu *,
-	struct fpn *, struct fpn *, struct fpn *, const struct fpn *);
 
 /*
  * "helper" functions



CVS commit: src/sys/arch/m68k/fpe

2016-08-05 Thread Tetsuya Isaki
Module Name:src
Committed By:   isaki
Date:   Sat Aug  6 00:58:55 UTC 2016

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

Log Message:
Modify fpu_sin()'s logic to avoid GCC's warning that has been
pointed out in the previous commit.
For fpu_cos() there is no such problem, but sync with fpu_sin().


To generate a diff of this commit:
cvs rdiff -u -r1.16 -r1.17 src/sys/arch/m68k/fpe/fpu_trig.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_trig.c
diff -u src/sys/arch/m68k/fpe/fpu_trig.c:1.16 src/sys/arch/m68k/fpe/fpu_trig.c:1.17
--- src/sys/arch/m68k/fpe/fpu_trig.c:1.16	Wed Mar 23 05:25:51 2016
+++ src/sys/arch/m68k/fpe/fpu_trig.c	Sat Aug  6 00:58:55 2016
@@ -1,4 +1,4 @@
-/*	$NetBSD: fpu_trig.c,v 1.16 2016/03/23 05:25:51 mrg Exp $	*/
+/*	$NetBSD: fpu_trig.c,v 1.17 2016/08/06 00:58:55 isaki Exp $	*/
 
 /*
  * Copyright (c) 1995  Ken Nakata
@@ -57,7 +57,7 @@
  */
 
 #include 
-__KERNEL_RCSID(0, "$NetBSD: fpu_trig.c,v 1.16 2016/03/23 05:25:51 mrg Exp $");
+__KERNEL_RCSID(0, "$NetBSD: fpu_trig.c,v 1.17 2016/08/06 00:58:55 isaki Exp $");
 
 #include "fpu_emulate.h"
 
@@ -229,11 +229,10 @@ fpu_cos(struct fpemu *fe)
 	if (ISINF(&fe->fe_f2))
 		return fpu_newnan(fe);
 
-	CPYFPN(&x, &fe->fe_f2);
-
 	/* x = abs(input) */
-	x.fp_sign = 0;
 	sign = 0;
+	CPYFPN(&x, &fe->fe_f2);
+	x.fp_sign = 0;
 
 	/* p <- 2*pi */
 	fpu_const(&p, FPU_CONST_PI);
@@ -334,13 +333,9 @@ fpu_sin(struct fpemu *fe)
 	if (ISZERO(&fe->fe_f2))
 		return &fe->fe_f2;
 
-#if defined(__GNUC__) && (__GNUC__ >= 5) && defined(__OPTIMIZE__)
-	x.fp_sign = 0;
-#endif
-	CPYFPN(&x, &fe->fe_f2);
-
 	/* x = abs(input) */
-	sign = x.fp_sign;
+	sign = fe->fe_f2.fp_sign;
+	CPYFPN(&x, &fe->fe_f2);
 	x.fp_sign = 0;
 
 	/* p <- 2*pi */



CVS commit: src/sys/arch/m68k/fpe

2017-01-15 Thread Tetsuya Isaki
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 
-__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 
 
@@ -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;
 



CVS commit: src/sys/arch/m68k/fpe

2017-01-16 Thread Tetsuya Isaki
Module Name:src
Committed By:   isaki
Date:   Mon Jan 16 12:05:40 UTC 2017

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

Log Message:
FSINCOS: Fix register address which writes cosine value back.


To generate a diff of this commit:
cvs rdiff -u -r1.17 -r1.18 src/sys/arch/m68k/fpe/fpu_trig.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_trig.c
diff -u src/sys/arch/m68k/fpe/fpu_trig.c:1.17 src/sys/arch/m68k/fpe/fpu_trig.c:1.18
--- src/sys/arch/m68k/fpe/fpu_trig.c:1.17	Sat Aug  6 00:58:55 2016
+++ src/sys/arch/m68k/fpe/fpu_trig.c	Mon Jan 16 12:05:40 2017
@@ -1,4 +1,4 @@
-/*	$NetBSD: fpu_trig.c,v 1.17 2016/08/06 00:58:55 isaki Exp $	*/
+/*	$NetBSD: fpu_trig.c,v 1.18 2017/01/16 12:05:40 isaki Exp $	*/
 
 /*
  * Copyright (c) 1995  Ken Nakata
@@ -57,7 +57,7 @@
  */
 
 #include 
-__KERNEL_RCSID(0, "$NetBSD: fpu_trig.c,v 1.17 2016/08/06 00:58:55 isaki Exp $");
+__KERNEL_RCSID(0, "$NetBSD: fpu_trig.c,v 1.18 2017/01/16 12:05:40 isaki Exp $");
 
 #include "fpu_emulate.h"
 
@@ -438,7 +438,7 @@ fpu_sincos(struct fpemu *fe, int regc)
 	__fpu_sincos_cordic(fe, &fe->fe_f2);
 
 	/* cos(x) */
-	fpu_implode(fe, &fe->fe_f2, FTYPE_EXT, &fe->fe_fpframe->fpf_regs[regc]);
+	fpu_implode(fe, &fe->fe_f2, FTYPE_EXT, &fe->fe_fpframe->fpf_regs[regc * 3]);
 
 	/* sin(x) */
 	return &fe->fe_f1;



CVS commit: src/sys/arch/m68k/fpe

2016-03-22 Thread matthew green
Module Name:src
Committed By:   mrg
Date:   Wed Mar 23 05:25:51 UTC 2016

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

Log Message:
avoid a GCC warning with this:

+#if defined(__GNUC__) && (__GNUC__ >= 5) && defined(__OPTIMIZE__)
+   x.fp_sign = 0;
+#endif

(ridiculous, but seems better than disabling the warning entirely.)


To generate a diff of this commit:
cvs rdiff -u -r1.15 -r1.16 src/sys/arch/m68k/fpe/fpu_trig.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_trig.c
diff -u src/sys/arch/m68k/fpe/fpu_trig.c:1.15 src/sys/arch/m68k/fpe/fpu_trig.c:1.16
--- src/sys/arch/m68k/fpe/fpu_trig.c:1.15	Sat Apr 20 07:32:45 2013
+++ src/sys/arch/m68k/fpe/fpu_trig.c	Wed Mar 23 05:25:51 2016
@@ -1,4 +1,4 @@
-/*	$NetBSD: fpu_trig.c,v 1.15 2013/04/20 07:32:45 isaki Exp $	*/
+/*	$NetBSD: fpu_trig.c,v 1.16 2016/03/23 05:25:51 mrg Exp $	*/
 
 /*
  * Copyright (c) 1995  Ken Nakata
@@ -57,7 +57,7 @@
  */
 
 #include 
-__KERNEL_RCSID(0, "$NetBSD: fpu_trig.c,v 1.15 2013/04/20 07:32:45 isaki Exp $");
+__KERNEL_RCSID(0, "$NetBSD: fpu_trig.c,v 1.16 2016/03/23 05:25:51 mrg Exp $");
 
 #include "fpu_emulate.h"
 
@@ -334,6 +334,9 @@ fpu_sin(struct fpemu *fe)
 	if (ISZERO(&fe->fe_f2))
 		return &fe->fe_f2;
 
+#if defined(__GNUC__) && (__GNUC__ >= 5) && defined(__OPTIMIZE__)
+	x.fp_sign = 0;
+#endif
 	CPYFPN(&x, &fe->fe_f2);
 
 	/* x = abs(input) */



CVS commit: src/sys/arch/m68k/fpe

2013-03-19 Thread Tetsuya Isaki
Module Name:src
Committed By:   isaki
Date:   Tue Mar 19 09:17:17 UTC 2013

Modified Files:
src/sys/arch/m68k/fpe: fpu_add.c fpu_arith.h fpu_div.c fpu_emulate.h
fpu_explode.c fpu_implode.c fpu_int.c fpu_mul.c fpu_sqrt.c
fpu_subr.c

Log Message:
Remove 'register'.


To generate a diff of this commit:
cvs rdiff -u -r1.7 -r1.8 src/sys/arch/m68k/fpe/fpu_add.c
cvs rdiff -u -r1.5 -r1.6 src/sys/arch/m68k/fpe/fpu_arith.h
cvs rdiff -u -r1.6 -r1.7 src/sys/arch/m68k/fpe/fpu_div.c \
src/sys/arch/m68k/fpe/fpu_mul.c src/sys/arch/m68k/fpe/fpu_sqrt.c
cvs rdiff -u -r1.19 -r1.20 src/sys/arch/m68k/fpe/fpu_emulate.h
cvs rdiff -u -r1.11 -r1.12 src/sys/arch/m68k/fpe/fpu_explode.c \
src/sys/arch/m68k/fpe/fpu_int.c
cvs rdiff -u -r1.12 -r1.13 src/sys/arch/m68k/fpe/fpu_implode.c
cvs rdiff -u -r1.8 -r1.9 src/sys/arch/m68k/fpe/fpu_subr.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_add.c
diff -u src/sys/arch/m68k/fpe/fpu_add.c:1.7 src/sys/arch/m68k/fpe/fpu_add.c:1.8
--- src/sys/arch/m68k/fpe/fpu_add.c:1.7	Sat Mar 14 15:36:09 2009
+++ src/sys/arch/m68k/fpe/fpu_add.c	Tue Mar 19 09:17:17 2013
@@ -1,4 +1,4 @@
-/*	$NetBSD: fpu_add.c,v 1.7 2009/03/14 15:36:09 dsl Exp $ */
+/*	$NetBSD: fpu_add.c,v 1.8 2013/03/19 09:17:17 isaki Exp $ */
 
 /*
  * Copyright (c) 1992, 1993
@@ -47,7 +47,7 @@
  */
 
 #include 
-__KERNEL_RCSID(0, "$NetBSD: fpu_add.c,v 1.7 2009/03/14 15:36:09 dsl Exp $");
+__KERNEL_RCSID(0, "$NetBSD: fpu_add.c,v 1.8 2013/03/19 09:17:17 isaki Exp $");
 
 #include 
 #include 
@@ -58,11 +58,11 @@ __KERNEL_RCSID(0, "$NetBSD: fpu_add.c,v 
 #include "fpu_emulate.h"
 
 struct fpn *
-fpu_add(register struct fpemu *fe)
+fpu_add(struct fpemu *fe)
 {
-	register struct fpn *x = &fe->fe_f1, *y = &fe->fe_f2, *r;
-	register u_int r0, r1, r2;
-	register int rd;
+	struct fpn *x = &fe->fe_f1, *y = &fe->fe_f2, *r;
+	u_int r0, r1, r2;
+	int rd;
 
 	/*
 	 * Put the `heavier' operand on the right (see fpu_emu.h).

Index: src/sys/arch/m68k/fpe/fpu_arith.h
diff -u src/sys/arch/m68k/fpe/fpu_arith.h:1.5 src/sys/arch/m68k/fpe/fpu_arith.h:1.6
--- src/sys/arch/m68k/fpe/fpu_arith.h:1.5	Sat Dec 24 22:45:35 2005
+++ src/sys/arch/m68k/fpe/fpu_arith.h	Tue Mar 19 09:17:17 2013
@@ -1,4 +1,4 @@
-/*	$NetBSD: fpu_arith.h,v 1.5 2005/12/24 22:45:35 perry Exp $ */
+/*	$NetBSD: fpu_arith.h,v 1.6 2013/03/19 09:17:17 isaki Exp $ */
 
 /*
  * Copyright (c) 1992, 1993
@@ -110,7 +110,7 @@
 #else
 
 /* set up for extended-precision arithemtic */
-#define	FPU_DECL_CARRY register int fpu_tmp;
+#define	FPU_DECL_CARRY int fpu_tmp;
 
 /*
  * We have three kinds of add:

Index: src/sys/arch/m68k/fpe/fpu_div.c
diff -u src/sys/arch/m68k/fpe/fpu_div.c:1.6 src/sys/arch/m68k/fpe/fpu_div.c:1.7
--- src/sys/arch/m68k/fpe/fpu_div.c:1.6	Sat Mar 14 15:36:09 2009
+++ src/sys/arch/m68k/fpe/fpu_div.c	Tue Mar 19 09:17:17 2013
@@ -1,4 +1,4 @@
-/*	$NetBSD: fpu_div.c,v 1.6 2009/03/14 15:36:09 dsl Exp $ */
+/*	$NetBSD: fpu_div.c,v 1.7 2013/03/19 09:17:17 isaki Exp $ */
 
 /*
  * Copyright (c) 1992, 1993
@@ -45,7 +45,7 @@
  */
 
 #include 
-__KERNEL_RCSID(0, "$NetBSD: fpu_div.c,v 1.6 2009/03/14 15:36:09 dsl Exp $");
+__KERNEL_RCSID(0, "$NetBSD: fpu_div.c,v 1.7 2013/03/19 09:17:17 isaki Exp $");
 
 #include 
 
@@ -150,11 +150,11 @@ __KERNEL_RCSID(0, "$NetBSD: fpu_div.c,v 
  */
 
 struct fpn *
-fpu_div(register struct fpemu *fe)
+fpu_div(struct fpemu *fe)
 {
-	register struct fpn *x = &fe->fe_f1, *y = &fe->fe_f2;
-	register u_int q, bit;
-	register u_int r0, r1, r2, d0, d1, d2, y0, y1, y2;
+	struct fpn *x = &fe->fe_f1, *y = &fe->fe_f2;
+	u_int q, bit;
+	u_int r0, r1, r2, d0, d1, d2, y0, y1, y2;
 	FPU_DECL_CARRY
 
 	fe->fe_fpsr &= ~FPSR_EXCP; /* clear all exceptions */
Index: src/sys/arch/m68k/fpe/fpu_mul.c
diff -u src/sys/arch/m68k/fpe/fpu_mul.c:1.6 src/sys/arch/m68k/fpe/fpu_mul.c:1.7
--- src/sys/arch/m68k/fpe/fpu_mul.c:1.6	Sat Mar 14 15:36:09 2009
+++ src/sys/arch/m68k/fpe/fpu_mul.c	Tue Mar 19 09:17:17 2013
@@ -1,4 +1,4 @@
-/*	$NetBSD: fpu_mul.c,v 1.6 2009/03/14 15:36:09 dsl Exp $ */
+/*	$NetBSD: fpu_mul.c,v 1.7 2013/03/19 09:17:17 isaki Exp $ */
 
 /*
  * Copyright (c) 1992, 1993
@@ -45,7 +45,7 @@
  */
 
 #include 
-__KERNEL_RCSID(0, "$NetBSD: fpu_mul.c,v 1.6 2009/03/14 15:36:09 dsl Exp $");
+__KERNEL_RCSID(0, "$NetBSD: fpu_mul.c,v 1.7 2013/03/19 09:17:17 isaki Exp $");
 
 #include 
 
@@ -77,8 +77,6 @@ __KERNEL_RCSID(0, "$NetBSD: fpu_mul.c,v 
  *
  * Since we do not have efficient multiword arithmetic, we code the
  * accumulator as four separate words, just like any other mantissa.
- * We use local `register' variables in the hope that this is faster
- * than memory.  We keep x->fp_mant in locals for the same reason.
  *
  * In the algorithm above, the bits in y are inspected one at a time.
  * We will pick them up 32 at a time and then deal with those 32, one
@@ -99,11 +97,11 @@ __KERNEL_RCSID(0, "$NetBSD: fpu_mul.c,v 
  * until we rea

CVS commit: src/sys/arch/m68k/fpe

2013-03-19 Thread Tetsuya Isaki
Module Name:src
Committed By:   isaki
Date:   Tue Mar 19 09:28:40 UTC 2013

Modified Files:
src/sys/arch/m68k/fpe: fpu_emulate.h fpu_explode.c

Log Message:
const-ify.


To generate a diff of this commit:
cvs rdiff -u -r1.20 -r1.21 src/sys/arch/m68k/fpe/fpu_emulate.h
cvs rdiff -u -r1.12 -r1.13 src/sys/arch/m68k/fpe/fpu_explode.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_emulate.h
diff -u src/sys/arch/m68k/fpe/fpu_emulate.h:1.20 src/sys/arch/m68k/fpe/fpu_emulate.h:1.21
--- src/sys/arch/m68k/fpe/fpu_emulate.h:1.20	Tue Mar 19 09:17:17 2013
+++ src/sys/arch/m68k/fpe/fpu_emulate.h	Tue Mar 19 09:28:39 2013
@@ -1,4 +1,4 @@
-/*	$NetBSD: fpu_emulate.h,v 1.20 2013/03/19 09:17:17 isaki Exp $	*/
+/*	$NetBSD: fpu_emulate.h,v 1.21 2013/03/19 09:28:39 isaki Exp $	*/
 
 /*
  * Copyright (c) 1995 Gordon Ross
@@ -227,7 +227,7 @@ int	fpu_shr(struct fpn *, int);
 int	fpu_round(struct fpemu *, struct fpn *);
 
 /* type conversion */
-void	fpu_explode(struct fpemu *, struct fpn *, int t, u_int *);
+void	fpu_explode(struct fpemu *, struct fpn *, int t, const u_int *);
 void	fpu_implode(struct fpemu *, struct fpn *, int t, u_int *);
 
 /*

Index: src/sys/arch/m68k/fpe/fpu_explode.c
diff -u src/sys/arch/m68k/fpe/fpu_explode.c:1.12 src/sys/arch/m68k/fpe/fpu_explode.c:1.13
--- src/sys/arch/m68k/fpe/fpu_explode.c:1.12	Tue Mar 19 09:17:17 2013
+++ src/sys/arch/m68k/fpe/fpu_explode.c	Tue Mar 19 09:28:39 2013
@@ -1,4 +1,4 @@
-/*	$NetBSD: fpu_explode.c,v 1.12 2013/03/19 09:17:17 isaki Exp $ */
+/*	$NetBSD: fpu_explode.c,v 1.13 2013/03/19 09:28:39 isaki Exp $ */
 
 /*
  * Copyright (c) 1992, 1993
@@ -46,7 +46,7 @@
  */
 
 #include 
-__KERNEL_RCSID(0, "$NetBSD: fpu_explode.c,v 1.12 2013/03/19 09:17:17 isaki Exp $");
+__KERNEL_RCSID(0, "$NetBSD: fpu_explode.c,v 1.13 2013/03/19 09:28:39 isaki Exp $");
 
 #include 
 #include 
@@ -222,7 +222,7 @@ fpu_xtof(struct fpn *fp, u_int i, u_int 
  * Explode the contents of a memory operand.
  */
 void
-fpu_explode(struct fpemu *fe, struct fpn *fp, int type, u_int *space)
+fpu_explode(struct fpemu *fe, struct fpn *fp, int type, const u_int *space)
 {
 	u_int s;
 



CVS commit: src/sys/arch/m68k/fpe

2012-06-24 Thread Tetsuya Isaki
Module Name:src
Committed By:   isaki
Date:   Mon Jun 25 04:52:23 UTC 2012

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

Log Message:
Rewrite fpu_int().
Especially, remove the special treatment when |x| < 1
because it forgets to consider FPCR round mode.
See PR/46627 for the detail.  Thanks Y.Sugahara for advice.


To generate a diff of this commit:
cvs rdiff -u -r1.10 -r1.11 src/sys/arch/m68k/fpe/fpu_int.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_int.c
diff -u src/sys/arch/m68k/fpe/fpu_int.c:1.10 src/sys/arch/m68k/fpe/fpu_int.c:1.11
--- src/sys/arch/m68k/fpe/fpu_int.c:1.10	Mon Jul 18 14:11:27 2011
+++ src/sys/arch/m68k/fpe/fpu_int.c	Mon Jun 25 04:52:23 2012
@@ -1,4 +1,4 @@
-/*	$NetBSD: fpu_int.c,v 1.10 2011/07/18 14:11:27 isaki Exp $	*/
+/*	$NetBSD: fpu_int.c,v 1.11 2012/06/25 04:52:23 isaki Exp $	*/
 
 /*
  * Copyright (c) 1995 Ken Nakata
@@ -29,7 +29,7 @@
  */
 
 #include 
-__KERNEL_RCSID(0, "$NetBSD: fpu_int.c,v 1.10 2011/07/18 14:11:27 isaki Exp $");
+__KERNEL_RCSID(0, "$NetBSD: fpu_int.c,v 1.11 2012/06/25 04:52:23 isaki Exp $");
 
 #include 
 
@@ -78,50 +78,28 @@ struct fpn *
 fpu_int(struct fpemu *fe)
 {
 	register struct fpn *x = &fe->fe_f2;
-	register int rsh, lsh, wsh, i;
+	register int rsh;
 
 	/* special cases first */
 	if (x->fp_class != FPC_NUM) {
 		return x;
 	}
-	/*
-	 * even if we have exponent == -1, we still have possiblity
-	 * that the result >= 1.0 when mantissa ~= 1.0 and rounded up
-	 */
-	if (x->fp_exp < -1) {
-		x->fp_class = FPC_ZERO;
-		x->fp_mant[0] = x->fp_mant[1] = x->fp_mant[2] = 0;
-		return x;
-	}
 
-	/* real work */
 	rsh = FP_NMANT - 1 - x->fp_exp;
-	if (rsh - FP_NG <= 0) {
+	if (rsh <= FP_NG) {
 		return x;
 	}
 
-	fpu_shr(x, rsh - FP_NG);	/* shift to the right */
+	/* shift to the right */
+	x->fp_exp = 0;
+	fpu_shr(x, rsh - FP_NG);
 
-	if (fpu_round(fe, x) == 1 /* rounded up */ &&
-	x->fp_mant[2 - (FP_NMANT-rsh)/32] & (1 << ((FP_NMANT-rsh)%32))
-	/* x >= 2.0 */) {
-		rsh--;			/* reduce shift count by 1 */
-		x->fp_exp++;		/* adjust exponent */
-	}
+	/* round according to FPCR round mode */
+	fpu_round(fe, x);
 
 	/* shift it back to the left */
-	wsh = rsh / 32;
-	lsh = rsh % 32;
-	rsh = 32 - lsh;
-	for (i = 0; i + wsh < 2; i++) {
-		x->fp_mant[i] = (x->fp_mant[i+wsh] << lsh) |
-		(x->fp_mant[i+wsh+1] >> rsh);
-	}
-	x->fp_mant[i] = (x->fp_mant[i+wsh] << lsh);
-	i++;
-	for (; i < 3; i++) {
-		x->fp_mant[i] = 0;
-	}
+	x->fp_exp = FP_NMANT - 1;
+	fpu_norm(x);
 
 	return x;
 }



CVS commit: src/sys/arch/m68k/fpe

2013-10-10 Thread Tetsuya Isaki
Module Name:src
Committed By:   isaki
Date:   Fri Oct 11 03:37:08 UTC 2013

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

Log Message:
FATANH(-0) is -0, not +0.
This bug was introduced by the mistake of my test program.
Last week, I talked about the probelm (my FATANH(-0) returns +0 ?)
by NetBSD seminar at Open Source Conference 2013 Hiroshima,
and tsutsui@ confirmed that returns -0.


To generate a diff of this commit:
cvs rdiff -u -r1.15 -r1.16 src/sys/arch/m68k/fpe/fpu_hyperb.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_hyperb.c
diff -u src/sys/arch/m68k/fpe/fpu_hyperb.c:1.15 src/sys/arch/m68k/fpe/fpu_hyperb.c:1.16
--- src/sys/arch/m68k/fpe/fpu_hyperb.c:1.15	Sat Apr 20 07:33:05 2013
+++ src/sys/arch/m68k/fpe/fpu_hyperb.c	Fri Oct 11 03:37:08 2013
@@ -1,4 +1,4 @@
-/*	$NetBSD: fpu_hyperb.c,v 1.15 2013/04/20 07:33:05 isaki Exp $	*/
+/*	$NetBSD: fpu_hyperb.c,v 1.16 2013/10/11 03:37:08 isaki Exp $	*/
 
 /*
  * Copyright (c) 1995  Ken Nakata
@@ -57,7 +57,7 @@
  */
 
 #include 
-__KERNEL_RCSID(0, "$NetBSD: fpu_hyperb.c,v 1.15 2013/04/20 07:33:05 isaki Exp $");
+__KERNEL_RCSID(0, "$NetBSD: fpu_hyperb.c,v 1.16 2013/10/11 03:37:08 isaki Exp $");
 
 #include 
 
@@ -89,14 +89,9 @@ fpu_atanh(struct fpemu *fe)
 	if (ISINF(&fe->fe_f2))
 		return fpu_newnan(fe);
 
-	/*
-	 * if x is +0/-0, 68000PRM.pdf says it returns +0/-0 but
-	 * my real 68882 returns +0 for both.
-	 */
-	if (ISZERO(&fe->fe_f2)) {
-		fe->fe_f2.fp_sign = 0;
+	/* if x is +0/-0, return +0/-0 */
+	if (ISZERO(&fe->fe_f2))
 		return &fe->fe_f2;
-	}
 
 	/*
 	 * -INF if x == -1



CVS commit: src/sys/arch/m68k/fpe

2013-10-25 Thread Martin Husemann
Module Name:src
Committed By:   martin
Date:   Fri Oct 25 21:32:46 UTC 2013

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

Log Message:
Comment unused stuff (for documentation purposes)


To generate a diff of this commit:
cvs rdiff -u -r1.37 -r1.38 src/sys/arch/m68k/fpe/fpu_emulate.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_emulate.c
diff -u src/sys/arch/m68k/fpe/fpu_emulate.c:1.37 src/sys/arch/m68k/fpe/fpu_emulate.c:1.38
--- src/sys/arch/m68k/fpe/fpu_emulate.c:1.37	Tue Mar 26 11:30:20 2013
+++ src/sys/arch/m68k/fpe/fpu_emulate.c	Fri Oct 25 21:32:45 2013
@@ -1,4 +1,4 @@
-/*	$NetBSD: fpu_emulate.c,v 1.37 2013/03/26 11:30:20 isaki Exp $	*/
+/*	$NetBSD: fpu_emulate.c,v 1.38 2013/10/25 21:32:45 martin Exp $	*/
 
 /*
  * Copyright (c) 1995 Gordon W. Ross
@@ -37,7 +37,7 @@
  */
 
 #include 
-__KERNEL_RCSID(0, "$NetBSD: fpu_emulate.c,v 1.37 2013/03/26 11:30:20 isaki Exp $");
+__KERNEL_RCSID(0, "$NetBSD: fpu_emulate.c,v 1.38 2013/10/25 21:32:45 martin Exp $");
 
 #include 
 #include 
@@ -421,7 +421,7 @@ fpu_emul_fmovm(struct fpemu *fe, struct 
 	int word1, sig;
 	int reglist, regmask, regnum;
 	int fpu_to_mem, order;
-	int w1_post_incr;
+	/* int w1_post_incr; */
 	int *fpregs;
 
 	insn->is_advance = 4;
@@ -438,7 +438,7 @@ fpu_emul_fmovm(struct fpemu *fe, struct 
 	 * 1,0: Static  reg list, post-incr.
 	 * 1,1: Dynamic reg list, post-incr
 	 */
-	w1_post_incr = word1 & 0x1000;
+	/* w1_post_incr = word1 & 0x1000; */
 	if (word1 & 0x0800) {
 		/* dynamic reg list */
 		reglist = frame->f_regs[(word1 & 0x70) >> 4];



CVS commit: src/sys/arch/m68k/fpe

2013-12-31 Thread Tetsuya Isaki
Module Name:src
Committed By:   isaki
Date:   Wed Jan  1 05:22:22 UTC 2014

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

Log Message:
Fix a sign when a source or destination is either (plus/minus)zero
or (plus/minus)infinity.  Found by XM6i.


To generate a diff of this commit:
cvs rdiff -u -r1.8 -r1.9 src/sys/arch/m68k/fpe/fpu_div.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_div.c
diff -u src/sys/arch/m68k/fpe/fpu_div.c:1.8 src/sys/arch/m68k/fpe/fpu_div.c:1.9
--- src/sys/arch/m68k/fpe/fpu_div.c:1.8	Tue Mar 26 11:30:20 2013
+++ src/sys/arch/m68k/fpe/fpu_div.c	Wed Jan  1 05:22:22 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: fpu_div.c,v 1.8 2013/03/26 11:30:20 isaki Exp $ */
+/*	$NetBSD: fpu_div.c,v 1.9 2014/01/01 05:22:22 isaki Exp $ */
 
 /*
  * Copyright (c) 1992, 1993
@@ -45,7 +45,7 @@
  */
 
 #include 
-__KERNEL_RCSID(0, "$NetBSD: fpu_div.c,v 1.8 2013/03/26 11:30:20 isaki Exp $");
+__KERNEL_RCSID(0, "$NetBSD: fpu_div.c,v 1.9 2014/01/01 05:22:22 isaki Exp $");
 
 #include 
 
@@ -166,10 +166,10 @@ fpu_div(struct fpemu *fe)
 	 * return it.  Otherwise we have the following cases:
 	 *
 	 *	Inf / Inf = NaN, plus NV exception
-	 *	Inf / num = Inf [i.e., return x]
-	 *	Inf / 0   = Inf [i.e., return x]
-	 *	0 / Inf = 0 [i.e., return x]
-	 *	0 / num = 0 [i.e., return x]
+	 *	Inf / num = Inf
+	 *	Inf / 0   = Inf
+	 *	0 / Inf = 0
+	 *	0 / num = 0
 	 *	0 / 0   = NaN, plus NV exception
 	 *	num / Inf = 0
 	 *	num / num = num (do the divide)
@@ -182,6 +182,8 @@ fpu_div(struct fpemu *fe)
 	if (ISINF(x) || ISZERO(x)) {
 		if (x->fp_class == y->fp_class)
 			return (fpu_newnan(fe));
+		/* all results at this point use XOR of operand signs */
+		x->fp_sign ^= y->fp_sign;
 		return (x);
 	}
 



CVS commit: src/sys/arch/m68k/fpe

2013-12-31 Thread Tetsuya Isaki
Module Name:src
Committed By:   isaki
Date:   Wed Jan  1 05:23:40 UTC 2014

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

Log Message:
indent fix in a comment.


To generate a diff of this commit:
cvs rdiff -u -r1.9 -r1.10 src/sys/arch/m68k/fpe/fpu_div.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_div.c
diff -u src/sys/arch/m68k/fpe/fpu_div.c:1.9 src/sys/arch/m68k/fpe/fpu_div.c:1.10
--- src/sys/arch/m68k/fpe/fpu_div.c:1.9	Wed Jan  1 05:22:22 2014
+++ src/sys/arch/m68k/fpe/fpu_div.c	Wed Jan  1 05:23:40 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: fpu_div.c,v 1.9 2014/01/01 05:22:22 isaki Exp $ */
+/*	$NetBSD: fpu_div.c,v 1.10 2014/01/01 05:23:40 isaki Exp $ */
 
 /*
  * Copyright (c) 1992, 1993
@@ -45,7 +45,7 @@
  */
 
 #include 
-__KERNEL_RCSID(0, "$NetBSD: fpu_div.c,v 1.9 2014/01/01 05:22:22 isaki Exp $");
+__KERNEL_RCSID(0, "$NetBSD: fpu_div.c,v 1.10 2014/01/01 05:23:40 isaki Exp $");
 
 #include 
 
@@ -168,9 +168,9 @@ fpu_div(struct fpemu *fe)
 	 *	Inf / Inf = NaN, plus NV exception
 	 *	Inf / num = Inf
 	 *	Inf / 0   = Inf
-	 *	0 / Inf = 0
-	 *	0 / num = 0
-	 *	0 / 0   = NaN, plus NV exception
+	 *	0   / Inf = 0
+	 *	0   / num = 0
+	 *	0   / 0   = NaN, plus NV exception
 	 *	num / Inf = 0
 	 *	num / num = num (do the divide)
 	 *	num / 0   = Inf, plus DZ exception



CVS commit: src/sys/arch/m68k/fpe

2014-01-04 Thread Tetsuya Isaki
Module Name:src
Committed By:   isaki
Date:   Sat Jan  4 13:23:22 UTC 2014

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

Log Message:
FLOGNP1(-0.0) is -0.0, not +0.0.  Found by XM6i.


To generate a diff of this commit:
cvs rdiff -u -r1.17 -r1.18 src/sys/arch/m68k/fpe/fpu_log.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_log.c
diff -u src/sys/arch/m68k/fpe/fpu_log.c:1.17 src/sys/arch/m68k/fpe/fpu_log.c:1.18
--- src/sys/arch/m68k/fpe/fpu_log.c:1.17	Sat Apr 20 05:27:05 2013
+++ src/sys/arch/m68k/fpe/fpu_log.c	Sat Jan  4 13:23:22 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: fpu_log.c,v 1.17 2013/04/20 05:27:05 isaki Exp $	*/
+/*	$NetBSD: fpu_log.c,v 1.18 2014/01/04 13:23:22 isaki Exp $	*/
 
 /*
  * Copyright (c) 1995  Ken Nakata
@@ -32,7 +32,7 @@
  */
 
 #include 
-__KERNEL_RCSID(0, "$NetBSD: fpu_log.c,v 1.17 2013/04/20 05:27:05 isaki Exp $");
+__KERNEL_RCSID(0, "$NetBSD: fpu_log.c,v 1.18 2014/01/04 13:23:22 isaki Exp $");
 
 #include 
 #include 
@@ -593,6 +593,10 @@ fpu_lognp1(struct fpemu *fe)
 {
 	struct fpn *fp;
 
+	/* if src is +0/-0, return +0/-0 */
+	if (ISZERO(&fe->fe_f2))
+		return &fe->fe_f2;
+
 	/* build a 1.0 */
 	fp = fpu_const(&fe->fe_f1, FPU_CONST_1);
 	/* fp = 1.0 + f2 */



CVS commit: src/sys/arch/m68k/fpe

2011-05-23 Thread Izumi Tsutsui
Module Name:src
Committed By:   tsutsui
Date:   Mon May 23 14:52:31 UTC 2011

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

Log Message:
KNF, mostly indent. No binary change.


To generate a diff of this commit:
cvs rdiff -u -r1.31 -r1.32 src/sys/arch/m68k/fpe/fpu_emulate.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_emulate.c
diff -u src/sys/arch/m68k/fpe/fpu_emulate.c:1.31 src/sys/arch/m68k/fpe/fpu_emulate.c:1.32
--- src/sys/arch/m68k/fpe/fpu_emulate.c:1.31	Sat May 14 16:17:55 2011
+++ src/sys/arch/m68k/fpe/fpu_emulate.c	Mon May 23 14:52:31 2011
@@ -1,4 +1,4 @@
-/*	$NetBSD: fpu_emulate.c,v 1.31 2011/05/14 16:17:55 tsutsui Exp $	*/
+/*	$NetBSD: fpu_emulate.c,v 1.32 2011/05/23 14:52:31 tsutsui Exp $	*/
 
 /*
  * Copyright (c) 1995 Gordon W. Ross
@@ -37,7 +37,7 @@
  */
 
 #include 
-__KERNEL_RCSID(0, "$NetBSD: fpu_emulate.c,v 1.31 2011/05/14 16:17:55 tsutsui Exp $");
+__KERNEL_RCSID(0, "$NetBSD: fpu_emulate.c,v 1.32 2011/05/23 14:52:31 tsutsui Exp $");
 
 #include 
 #include 
@@ -51,29 +51,29 @@
 
 #include "fpu_emulate.h"
 
-#define	fpe_abort(tfp, ksi, signo, code) 		\
-do {		\
-	(ksi)->ksi_signo = (signo);			\
-	(ksi)->ksi_code = (code);			\
-	(ksi)->ksi_addr = (void *)(frame)->f_pc;	\
-	return -1;	\
-} while (/*CONSTCOND*/0)
-
-static int fpu_emul_fmovmcr(struct fpemu *fe, struct instruction *insn);
-static int fpu_emul_fmovm(struct fpemu *fe, struct instruction *insn);
-static int fpu_emul_arith(struct fpemu *fe, struct instruction *insn);
-static int fpu_emul_type1(struct fpemu *fe, struct instruction *insn);
-static int fpu_emul_brcc(struct fpemu *fe, struct instruction *insn);
-static int test_cc(struct fpemu *fe, int pred);
-static struct fpn *fpu_cmp(struct fpemu *fe);
-
-#if DEBUG_FPE
-#  define DUMP_INSN(insn)		\
-printf("fpu_emulate: insn={adv=%d,siz=%d,op=%04x,w1=%04x}\n",	\
-	   (insn)->is_advance, (insn)->is_datasize,			\
-	   (insn)->is_opcode, (insn)->is_word1)
+#define	fpe_abort(tfp, ksi, signo, code)			\
+	do {			\
+		(ksi)->ksi_signo = (signo);			\
+		(ksi)->ksi_code = (code);			\
+		(ksi)->ksi_addr = (void *)(frame)->f_pc;	\
+		return -1;	\
+	} while (/* CONSTCOND */ 0)
+
+static int fpu_emul_fmovmcr(struct fpemu *, struct instruction *);
+static int fpu_emul_fmovm(struct fpemu *, struct instruction *);
+static int fpu_emul_arith(struct fpemu *, struct instruction *);
+static int fpu_emul_type1(struct fpemu *, struct instruction *);
+static int fpu_emul_brcc(struct fpemu *, struct instruction *);
+static int test_cc(struct fpemu *, int);
+static struct fpn *fpu_cmp(struct fpemu *);
+
+#if DEBUG_FPE
+#define DUMP_INSN(insn)			\
+	printf("fpu_emulate: insn={adv=%d,siz=%d,op=%04x,w1=%04x}\n",	\
+	(insn)->is_advance, (insn)->is_datasize,			\
+	(insn)->is_opcode, (insn)->is_word1)
 #else
-#  define DUMP_INSN(insn)
+#define DUMP_INSN(insn)
 #endif
 
 /*
@@ -84,370 +84,378 @@
 int
 fpu_emulate(struct frame *frame, struct fpframe *fpf, ksiginfo_t *ksi)
 {
-static struct instruction insn;
-static struct fpemu fe;
-int word, optype, sig;
-
-
-/* initialize insn.is_datasize to tell it is *not* initialized */
-insn.is_datasize = -1;
-
-fe.fe_frame = frame;
-fe.fe_fpframe = fpf;
-fe.fe_fpsr = fpf->fpf_fpsr;
-fe.fe_fpcr = fpf->fpf_fpcr;
-
-#if DEBUG_FPE
-printf("ENTERING fpu_emulate: FPSR=%08x, FPCR=%08x\n",
-	   fe.fe_fpsr, fe.fe_fpcr);
+	static struct instruction insn;
+	static struct fpemu fe;
+	int word, optype, sig;
+
+
+	/* initialize insn.is_datasize to tell it is *not* initialized */
+	insn.is_datasize = -1;
+
+	fe.fe_frame = frame;
+	fe.fe_fpframe = fpf;
+	fe.fe_fpsr = fpf->fpf_fpsr;
+	fe.fe_fpcr = fpf->fpf_fpcr;
+
+#if DEBUG_FPE
+	printf("ENTERING fpu_emulate: FPSR=%08x, FPCR=%08x\n",
+	fe.fe_fpsr, fe.fe_fpcr);
+#endif
+
+	/* always set this (to avoid a warning) */
+	insn.is_pc = frame->f_pc;
+	insn.is_nextpc = 0;
+	if (frame->f_format == 4) {
+		/*
+		 * A format 4 is generated by the 68{EC,LC}040.  The PC is
+		 * already set to the instruction following the faulting
+		 * instruction.  We need to calculate that, anyway.  The
+		 * fslw is the PC of the faulted instruction, which is what
+		 * we expect to be in f_pc.
+		 *
+		 * XXX - This is a hack; it assumes we at least know the
+		 * sizes of all instructions we run across.
+		 * XXX TODO: This may not be true, so we might want to save
+		 * the PC in order to restore it later.
+		 */
+#if 0
+		insn.is_nextpc = frame->f_pc;
 #endif
+		insn.is_pc = frame->f_fmt4.f_fslw;
+		frame->f_pc = insn.is_pc;
+	}
 
-/* always set this (to avoid a warning) */
-insn.is_pc = frame->f_pc;
-insn.is_nextpc = 0;
-if (frame->f_format == 4) {
-	/*
-	 * A format 4 is generated by the 68{EC,LC}040.  The PC is
-	 * already set to the instruction following the faulting
-	 * instruction.  We need 

CVS commit: src/sys/arch/m68k/fpe

2011-05-23 Thread Izumi Tsutsui
Module Name:src
Committed By:   tsutsui
Date:   Mon May 23 15:40:34 UTC 2011

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

Log Message:
- use DPRINTF() style debug printfs
- use __func__ to print function names
- consistently use #ifdef DEBUG_FPE
- add some missing debug messages including \n in error paths


To generate a diff of this commit:
cvs rdiff -u -r1.32 -r1.33 src/sys/arch/m68k/fpe/fpu_emulate.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_emulate.c
diff -u src/sys/arch/m68k/fpe/fpu_emulate.c:1.32 src/sys/arch/m68k/fpe/fpu_emulate.c:1.33
--- src/sys/arch/m68k/fpe/fpu_emulate.c:1.32	Mon May 23 14:52:31 2011
+++ src/sys/arch/m68k/fpe/fpu_emulate.c	Mon May 23 15:40:34 2011
@@ -1,4 +1,4 @@
-/*	$NetBSD: fpu_emulate.c,v 1.32 2011/05/23 14:52:31 tsutsui Exp $	*/
+/*	$NetBSD: fpu_emulate.c,v 1.33 2011/05/23 15:40:34 tsutsui Exp $	*/
 
 /*
  * Copyright (c) 1995 Gordon W. Ross
@@ -37,7 +37,7 @@
  */
 
 #include 
-__KERNEL_RCSID(0, "$NetBSD: fpu_emulate.c,v 1.32 2011/05/23 14:52:31 tsutsui Exp $");
+__KERNEL_RCSID(0, "$NetBSD: fpu_emulate.c,v 1.33 2011/05/23 15:40:34 tsutsui Exp $");
 
 #include 
 #include 
@@ -67,13 +67,16 @@
 static int test_cc(struct fpemu *, int);
 static struct fpn *fpu_cmp(struct fpemu *);
 
-#if DEBUG_FPE
+#ifdef DEBUG_FPE
 #define DUMP_INSN(insn)			\
-	printf("fpu_emulate: insn={adv=%d,siz=%d,op=%04x,w1=%04x}\n",	\
+	printf("%s: insn={adv=%d,siz=%d,op=%04x,w1=%04x}\n",		\
+	__func__,			\
 	(insn)->is_advance, (insn)->is_datasize,			\
 	(insn)->is_opcode, (insn)->is_word1)
+#define DPRINTF(x)	printf x
 #else
-#define DUMP_INSN(insn)
+#define DUMP_INSN(insn)	do {} while (/* CONSTCOND */ 0)
+#define DPRINTF(x)	do {} while (/* CONSTCOND */ 0)
 #endif
 
 /*
@@ -97,10 +100,8 @@
 	fe.fe_fpsr = fpf->fpf_fpsr;
 	fe.fe_fpcr = fpf->fpf_fpcr;
 
-#if DEBUG_FPE
-	printf("ENTERING fpu_emulate: FPSR=%08x, FPCR=%08x\n",
-	fe.fe_fpsr, fe.fe_fpcr);
-#endif
+	DPRINTF(("%s: ENTERING: FPSR=%08x, FPCR=%08x\n",
+	__func__, fe.fe_fpsr, fe.fe_fpcr));
 
 	/* always set this (to avoid a warning) */
 	insn.is_pc = frame->f_pc;
@@ -127,23 +128,18 @@
 
 	word = fusword((void *)(insn.is_pc));
 	if (word < 0) {
-#ifdef DEBUG
-		printf("fpu_emulate: fault reading opcode\n");
-#endif
+		DPRINTF(("%s: fault reading opcode\n", __func__));
 		fpe_abort(frame, ksi, SIGSEGV, SEGV_ACCERR);
 	}
 
 	if ((word & 0xf000) != 0xf000) {
-#ifdef DEBUG
-		printf("fpu_emulate: not coproc. insn.: opcode=0x%x\n", word);
-#endif
+		DPRINTF(("%s: not coproc. insn.: opcode=0x%x\n",
+		__func__, word));
 		fpe_abort(frame, ksi, SIGILL, ILL_ILLOPC);
 	}
 
 	if ((word & 0x0E00) != 0x0200) {
-#ifdef DEBUG
-		printf("fpu_emulate: bad coproc. id: opcode=0x%x\n", word);
-#endif
+		DPRINTF(("%s: bad coproc. id: opcode=0x%x\n", __func__, word));
 		fpe_abort(frame, ksi, SIGILL, ILL_ILLOPC);
 	}
 
@@ -152,9 +148,7 @@
 
 	word = fusword((void *)(insn.is_pc + 2));
 	if (word < 0) {
-#ifdef DEBUG
-		printf("fpu_emulate: fault reading word1\n");
-#endif
+		DPRINTF(("%s: fault reading word1\n", __func__));
 		fpe_abort(frame, ksi, SIGSEGV, SEGV_ACCERR);
 	}
 	insn.is_word1 = word;
@@ -171,68 +165,48 @@
 	if (optype == 0x) {
 		/* type=0: generic */
 		if ((word & 0xc000) == 0xc000) {
-#if DEBUG_FPE
-			printf("fpu_emulate: fmovm FPr\n");
-#endif
+			DPRINTF(("%s: fmovm FPr\n", __func__));
 			sig = fpu_emul_fmovm(&fe, &insn);
 		} else if ((word & 0xc000) == 0x8000) {
-#if DEBUG_FPE
-			printf("fpu_emulate: fmovm FPcr\n");
-#endif
+			DPRINTF(("%s: fmovm FPcr\n", __func__));
 			sig = fpu_emul_fmovmcr(&fe, &insn);
 		} else if ((word & 0xe000) == 0x6000) {
 			/* fstore = fmove FPn,mem */
-#if DEBUG_FPE
-			printf("fpu_emulate: fmove to mem\n");
-#endif
+			DPRINTF(("%s: fmove to mem\n", __func__));
 			sig = fpu_emul_fstore(&fe, &insn);
 		} else if ((word & 0xfc00) == 0x5c00) {
 			/* fmovecr */
-#if DEBUG_FPE
-			printf("fpu_emulate: fmovecr\n");
-#endif
+			DPRINTF(("%s: fmovecr\n", __func__));
 			sig = fpu_emul_fmovecr(&fe, &insn);
 		} else if ((word & 0xa07f) == 0x26) {
 			/* fscale */
-#if DEBUG_FPE
-			printf("fpu_emulate: fscale\n");
-#endif
+			DPRINTF(("%s: fscale\n", __func__));
 			sig = fpu_emul_fscale(&fe, &insn);
 		} else {
-#if DEBUG_FPE
-			printf("fpu_emulate: other type0\n");
-#endif
+			DPRINTF(("%s: other type0\n", __func__));
 			/* all other type0 insns are arithmetic */
 			sig = fpu_emul_arith(&fe, &insn);
 		}
 		if (sig == 0) {
-#if DEBUG_FPE
-			printf("fpu_emulate: type 0 returned 0\n");
-#endif
+			DPRINTF(("%s: type 0 returned 0\n", __func__));
 			sig = fpu_upd_excp(&fe);
 		}
 	} else if (optype == 0x0080 || optype == 0x00C0) {
 		/* type=2 or 3: fbcc, short or long disp. */
-#if DEBUG_FPE
-		printf("fpu_emulate: fbcc %s\n",
-		(optype & 0x40) ? "long" : "short");
-#endif
+		DPRINTF(("%s: fbcc %s\n", __func__,
+		(optype & 0x4

CVS commit: src/sys/arch/m68k/fpe

2011-05-25 Thread Izumi Tsutsui
Module Name:src
Committed By:   tsutsui
Date:   Wed May 25 15:17:21 UTC 2011

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

Log Message:
KNF. No binary change.


To generate a diff of this commit:
cvs rdiff -u -r1.22 -r1.23 src/sys/arch/m68k/fpe/fpu_calcea.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_calcea.c
diff -u src/sys/arch/m68k/fpe/fpu_calcea.c:1.22 src/sys/arch/m68k/fpe/fpu_calcea.c:1.23
--- src/sys/arch/m68k/fpe/fpu_calcea.c:1.22	Sun Jun  6 04:50:07 2010
+++ src/sys/arch/m68k/fpe/fpu_calcea.c	Wed May 25 15:17:21 2011
@@ -1,4 +1,4 @@
-/*	$NetBSD: fpu_calcea.c,v 1.22 2010/06/06 04:50:07 mrg Exp $	*/
+/*	$NetBSD: fpu_calcea.c,v 1.23 2011/05/25 15:17:21 tsutsui Exp $	*/
 
 /*
  * Copyright (c) 1995 Gordon W. Ross
@@ -34,7 +34,7 @@
 #include "opt_m68k_arch.h"
 
 #include 
-__KERNEL_RCSID(0, "$NetBSD: fpu_calcea.c,v 1.22 2010/06/06 04:50:07 mrg Exp $");
+__KERNEL_RCSID(0, "$NetBSD: fpu_calcea.c,v 1.23 2011/05/25 15:17:21 tsutsui Exp $");
 
 #include 
 #include 
@@ -47,13 +47,11 @@
 /*
  * Prototypes of static functions
  */
-static int decode_ea6(struct frame *frame, struct instruction *insn,
-			   struct insn_ea *ea, int modreg);
-static int fetch_immed(struct frame *frame, struct instruction *insn,
-			int *dst);
-static int fetch_disp(struct frame *frame, struct instruction *insn,
-			   int size, int *res);
-static int calc_ea(struct insn_ea *ea, char *ptr, char **eaddr);
+static int decode_ea6(struct frame *, struct instruction *,
+		  struct insn_ea *, int);
+static int fetch_immed(struct frame *, struct instruction *, int *);
+static int fetch_disp(struct frame *, struct instruction *, int, int *);
+static int calc_ea(struct insn_ea *, char *, char **);
 
 /*
  * Helper routines for dealing with "effective address" values.
@@ -64,248 +62,253 @@
  * Returns zero on success, else signal number.
  */
 int
-fpu_decode_ea(struct frame *frame, struct instruction *insn, struct insn_ea *ea, int modreg)
+fpu_decode_ea(struct frame *frame, struct instruction *insn,
+struct insn_ea *ea, int modreg)
 {
-int sig;
+	int sig;
 
 #ifdef DEBUG
-if (insn->is_datasize < 0) {
-	panic("decode_ea: called with uninitialized datasize");
-}
+	if (insn->is_datasize < 0)
+		panic("decode_ea: called with uninitialized datasize");
 #endif
 
-sig = 0;
+	sig = 0;
 
-/* Set the most common value here. */
-ea->ea_regnum = 8 + (modreg & 7);
+	/* Set the most common value here. */
+	ea->ea_regnum = 8 + (modreg & 7);
 
-if ((modreg & 060) == 0) {
-	/* register direct */
-	ea->ea_regnum = modreg & 0xf;
-	ea->ea_flags = EA_DIRECT;
+	if ((modreg & 060) == 0) {
+		/* register direct */
+		ea->ea_regnum = modreg & 0xf;
+		ea->ea_flags = EA_DIRECT;
 #ifdef DEBUG_FPE
-	printf("decode_ea: register direct reg=%d\n", ea->ea_regnum);
+		printf("decode_ea: register direct reg=%d\n", ea->ea_regnum);
 #endif
-} else if ((modreg & 077) == 074) {
-	/* immediate */
-	ea->ea_flags = EA_IMMED;
-	sig = fetch_immed(frame, insn, &ea->ea_immed[0]);
+	} else if ((modreg & 077) == 074) {
+		/* immediate */
+		ea->ea_flags = EA_IMMED;
+		sig = fetch_immed(frame, insn, &ea->ea_immed[0]);
 #ifdef DEBUG_FPE
-	printf("decode_ea: immediate size=%d\n", insn->is_datasize);
+		printf("decode_ea: immediate size=%d\n", insn->is_datasize);
 #endif
-}
-/*
- * rest of the address modes need to be separately
- * handled for the LC040 and the others.
- */
+	}
+	/*
+	 * rest of the address modes need to be separately
+	 * handled for the LC040 and the others.
+	 */
 #if 0 /* XXX */
-else if (frame->f_format == 4 && frame->f_fmt4.f_fa) {
-	/* LC040 */
-	ea->ea_flags = EA_FRAME_EA;
-	ea->ea_fea = frame->f_fmt4.f_fa;
-#ifdef DEBUG_FPE
-	printf("decode_ea: 68LC040 - in-frame EA (%p) size %d\n",
-		(void *)ea->ea_fea, insn->is_datasize);
-#endif
-	if ((modreg & 070) == 030) {
-	/* postincrement mode */
-	ea->ea_flags |= EA_POSTINCR;
-	} else if ((modreg & 070) == 040) {
-	/* predecrement mode */
-	ea->ea_flags |= EA_PREDECR;
+	else if (frame->f_format == 4 && frame->f_fmt4.f_fa) {
+		/* LC040 */
+		ea->ea_flags = EA_FRAME_EA;
+		ea->ea_fea = frame->f_fmt4.f_fa;
+#ifdef DEBUG_FPE
+		printf("decode_ea: 68LC040 - in-frame EA (%p) size %d\n",
+		(void *)ea->ea_fea, insn->is_datasize);
+#endif
+		if ((modreg & 070) == 030) {
+			/* postincrement mode */
+			ea->ea_flags |= EA_POSTINCR;
+		} else if ((modreg & 070) == 040) {
+			/* predecrement mode */
+			ea->ea_flags |= EA_PREDECR;
 #ifdef M68060
 #if defined(M68020) || defined(M68030) || defined(M68040)
-	if (cputype == CPU_68060)
+			if (cputype == CPU_68060)
 #endif
-		if (insn->is_datasize == 12)
-			ea->ea_fea -= 8;
+if (insn->is_datasize == 12)
+	ea->ea_fea -= 8;
 #endif
+		}
 	}
-}
 #endif /* XXX */
-else {
-	/* 020/030 */
-	switch (modreg & 070) {
+	else {
+		/* 020/030 */

CVS commit: src/sys/arch/m68k/fpe

2011-05-25 Thread Izumi Tsutsui
Module Name:src
Committed By:   tsutsui
Date:   Wed May 25 15:47:19 UTC 2011

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

Log Message:
- consistently use #ifdef DEBUG_FPE and #ifdef DIAGNOSTIC
- use DPRINTF() style debug printfs
- use __func__ to print function names


To generate a diff of this commit:
cvs rdiff -u -r1.23 -r1.24 src/sys/arch/m68k/fpe/fpu_calcea.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_calcea.c
diff -u src/sys/arch/m68k/fpe/fpu_calcea.c:1.23 src/sys/arch/m68k/fpe/fpu_calcea.c:1.24
--- src/sys/arch/m68k/fpe/fpu_calcea.c:1.23	Wed May 25 15:17:21 2011
+++ src/sys/arch/m68k/fpe/fpu_calcea.c	Wed May 25 15:47:19 2011
@@ -1,4 +1,4 @@
-/*	$NetBSD: fpu_calcea.c,v 1.23 2011/05/25 15:17:21 tsutsui Exp $	*/
+/*	$NetBSD: fpu_calcea.c,v 1.24 2011/05/25 15:47:19 tsutsui Exp $	*/
 
 /*
  * Copyright (c) 1995 Gordon W. Ross
@@ -34,7 +34,7 @@
 #include "opt_m68k_arch.h"
 
 #include 
-__KERNEL_RCSID(0, "$NetBSD: fpu_calcea.c,v 1.23 2011/05/25 15:17:21 tsutsui Exp $");
+__KERNEL_RCSID(0, "$NetBSD: fpu_calcea.c,v 1.24 2011/05/25 15:47:19 tsutsui Exp $");
 
 #include 
 #include 
@@ -44,6 +44,12 @@
 
 #include "fpu_emulate.h"
 
+#ifdef DEBUG_FPE
+#define DPRINTF(x)	printf x
+#else
+#define DPRINTF(x)	do {} while (/* CONSTCOND */ 0)
+#endif
+
 /*
  * Prototypes of static functions
  */
@@ -67,9 +73,9 @@
 {
 	int sig;
 
-#ifdef DEBUG
+#ifdef DIAGNOSTIC
 	if (insn->is_datasize < 0)
-		panic("decode_ea: called with uninitialized datasize");
+		panic("%s: called with uninitialized datasize", __func__);
 #endif
 
 	sig = 0;
@@ -81,16 +87,14 @@
 		/* register direct */
 		ea->ea_regnum = modreg & 0xf;
 		ea->ea_flags = EA_DIRECT;
-#ifdef DEBUG_FPE
-		printf("decode_ea: register direct reg=%d\n", ea->ea_regnum);
-#endif
+		DPRINTF(("%s: register direct reg=%d\n",
+		__func__, ea->ea_regnum));
 	} else if ((modreg & 077) == 074) {
 		/* immediate */
 		ea->ea_flags = EA_IMMED;
 		sig = fetch_immed(frame, insn, &ea->ea_immed[0]);
-#ifdef DEBUG_FPE
-		printf("decode_ea: immediate size=%d\n", insn->is_datasize);
-#endif
+		DPRINTF(("%s: immediate size=%d\n",
+		__func__, insn->is_datasize));
 	}
 	/*
 	 * rest of the address modes need to be separately
@@ -101,10 +105,8 @@
 		/* LC040 */
 		ea->ea_flags = EA_FRAME_EA;
 		ea->ea_fea = frame->f_fmt4.f_fa;
-#ifdef DEBUG_FPE
-		printf("decode_ea: 68LC040 - in-frame EA (%p) size %d\n",
-		(void *)ea->ea_fea, insn->is_datasize);
-#endif
+		DPRINTF(("%s: 68LC040 - in-frame EA (%p) size %d\n",
+		__func__, (void *)ea->ea_fea, insn->is_datasize));
 		if ((modreg & 070) == 030) {
 			/* postincrement mode */
 			ea->ea_flags |= EA_POSTINCR;
@@ -127,35 +129,27 @@
 
 		case 020:			/* (An) */
 			ea->ea_flags = 0;
-#ifdef DEBUG_FPE
-			printf("decode_ea: register indirect reg=%d\n",
-			ea->ea_regnum);
-#endif
+			DPRINTF(("%s: register indirect reg=%d\n",
+			__func__, ea->ea_regnum));
 			break;
 
 		case 030:			/* (An)+ */
 			ea->ea_flags = EA_POSTINCR;
-#ifdef DEBUG_FPE
-			printf("decode_ea: reg indirect postincrement reg=%d\n",
-			ea->ea_regnum);
-#endif
+			DPRINTF(("%s: reg indirect postincrement reg=%d\n",
+			__func__, ea->ea_regnum));
 			break;
 
 		case 040:			/* -(An) */
 			ea->ea_flags = EA_PREDECR;
-#ifdef DEBUG_FPE
-			printf("decode_ea: reg indirect predecrement reg=%d\n",
-			ea->ea_regnum);
-#endif
+			DPRINTF(("%s: reg indirect predecrement reg=%d\n",
+			__func__, ea->ea_regnum));
 			break;
 
 		case 050:			/* (d16,An) */
 			ea->ea_flags = EA_OFFSET;
 			sig = fetch_disp(frame, insn, 1, &ea->ea_offset);
-#ifdef DEBUG_FPE
-			printf("decode_ea: reg indirect with displacement "
-			"reg=%d\n", ea->ea_regnum);
-#endif
+			DPRINTF(("%s: reg indirect with displacement reg=%d\n",
+			__func__, ea->ea_regnum));
 		break;
 
 		case 060:			/* (d8,An,Xn) */
@@ -171,28 +165,24 @@
 ea->ea_flags = EA_ABS;
 sig = fetch_disp(frame, insn, 1,
 &ea->ea_absaddr);
-#ifdef DEBUG_FPE
-printf("decode_ea: absolute address (word)\n");
-#endif
+DPRINTF(("%s: absolute address (word)\n",
+__func__));
 break;
 
 			case 1:			/* ().L */
 ea->ea_flags = EA_ABS;
 sig = fetch_disp(frame, insn, 2,
 &ea->ea_absaddr);
-#ifdef DEBUG_FPE
-printf("decode_ea: absolute address (long)\n");
-#endif
+DPRINTF(("%s: absolute address (long)\n",
+__func__));
 break;
 
 			case 2:			/* (d16,PC) */
 ea->ea_flags = EA_PC_REL | EA_OFFSET;
 sig = fetch_disp(frame, insn, 1,
 &ea->ea_absaddr);
-#ifdef DEBUG_FPE
-printf("decode_ea: pc relative word "
-"displacement\n");
-#endif
+DPRINTF(("%s: pc relative word displacement\n",
+__func__));
 break;
 
 			case 3:			/* (d8,PC,Xn) */
@@ -203,10 +193,8 @@
 			case 4:			/* #data */
 /* it should have been taken care of earlier */
 			default:
-#ifde

CVS commit: src/sys/arch/m68k/fpe

2011-05-14 Thread Izumi Tsutsui
Module Name:src
Committed By:   tsutsui
Date:   Sat May 14 16:17:55 UTC 2011

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

Log Message:
Fix botch in rev 1.28 that causes wrong results of fcmp and ftst in FPE.
fpu_upd_fpsr() should be called even in discard_result case if an emulated
instruction gets proper result without signal.

Fixes weird behavior of awk(1) seen on /etc/rc.d/postfix on XM6i and
TME emulating sun3 without 68881.

Should be pulled up to all netbsd-4 and netbsd-5 branches.


To generate a diff of this commit:
cvs rdiff -u -r1.30 -r1.31 src/sys/arch/m68k/fpe/fpu_emulate.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_emulate.c
diff -u src/sys/arch/m68k/fpe/fpu_emulate.c:1.30 src/sys/arch/m68k/fpe/fpu_emulate.c:1.31
--- src/sys/arch/m68k/fpe/fpu_emulate.c:1.30	Sat Mar 14 15:36:09 2009
+++ src/sys/arch/m68k/fpe/fpu_emulate.c	Sat May 14 16:17:55 2011
@@ -1,4 +1,4 @@
-/*	$NetBSD: fpu_emulate.c,v 1.30 2009/03/14 15:36:09 dsl Exp $	*/
+/*	$NetBSD: fpu_emulate.c,v 1.31 2011/05/14 16:17:55 tsutsui Exp $	*/
 
 /*
  * Copyright (c) 1995 Gordon W. Ross
@@ -37,7 +37,7 @@
  */
 
 #include 
-__KERNEL_RCSID(0, "$NetBSD: fpu_emulate.c,v 1.30 2009/03/14 15:36:09 dsl Exp $");
+__KERNEL_RCSID(0, "$NetBSD: fpu_emulate.c,v 1.31 2011/05/14 16:17:55 tsutsui Exp $");
 
 #include 
 #include 
@@ -909,27 +909,34 @@
 if (res == NULL)
 	sig = SIGILL;
 
-if (!discard_result && sig == 0) {
-	fpu_implode(fe, res, FTYPE_EXT, &fpregs[regnum * 3]);
+if (sig == 0) {
+	if (!discard_result)
+	fpu_implode(fe, res, FTYPE_EXT, &fpregs[regnum * 3]);
 
 	/* update fpsr according to the result of operation */
 	fpu_upd_fpsr(fe, res);
 #if DEBUG_FPE
-	printf("fpu_emul_arith: %08x,%08x,%08x stored in FP%d\n",
-	   fpregs[regnum*3], fpregs[regnum*3+1],
-	   fpregs[regnum*3+2], regnum);
-} else if (sig == 0) {
-	static const char *class_name[] =
-	{ "SNAN", "QNAN", "ZERO", "NUM", "INF" };
-	printf("fpu_emul_arith: result(%s,%c,%d,%08x,%08x,%08x) discarded\n",
-	   class_name[res->fp_class + 2],
-	   res->fp_sign ? '-' : '+', res->fp_exp,
-	   res->fp_mant[0], res->fp_mant[1],
-	   res->fp_mant[2]);
-} else {
-	printf("fpu_emul_arith: received signal %d\n", sig);
+	if (!discard_result) {
+	printf("fpu_emul_arith: %08x,%08x,%08x stored in FP%d\n",
+		fpregs[regnum*3], fpregs[regnum*3+1],
+		fpregs[regnum*3+2], regnum);
+	} else {
+	static const char *class_name[] =
+		{ "SNAN", "QNAN", "ZERO", "NUM", "INF" };
+	printf("fpu_emul_arith: result(%s,%c,%d,%08x,%08x,%08x)"
+		" discarded\n",
+		class_name[res->fp_class + 2],
+		res->fp_sign ? '-' : '+', res->fp_exp,
+		res->fp_mant[0], res->fp_mant[1],
+		res->fp_mant[2]);
+	}
 #endif
 }
+#if DEBUG_FPE
+else {
+	printf("fpu_emul_arith: received signal %d\n", sig);
+}
+#endif
 
 #if DEBUG_FPE
 printf("fpu_emul_arith: FPSR = %08x, FPCR = %08x\n",



CVS commit: src/sys/arch/m68k/fpe

2011-10-08 Thread Izumi Tsutsui
Module Name:src
Committed By:   tsutsui
Date:   Sun Oct  9 01:34:20 UTC 2011

Modified Files:
src/sys/arch/m68k/fpe: fpu_emulate.h

Log Message:
Use static inline structure assignment for CPYFPN().  From isaki@.
Tested on XM6i.


To generate a diff of this commit:
cvs rdiff -u -r1.16 -r1.17 src/sys/arch/m68k/fpe/fpu_emulate.h

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_emulate.h
diff -u src/sys/arch/m68k/fpe/fpu_emulate.h:1.16 src/sys/arch/m68k/fpe/fpu_emulate.h:1.17
--- src/sys/arch/m68k/fpe/fpu_emulate.h:1.16	Mon Jul 18 07:44:30 2011
+++ src/sys/arch/m68k/fpe/fpu_emulate.h	Sun Oct  9 01:34:19 2011
@@ -1,4 +1,4 @@
-/*	$NetBSD: fpu_emulate.h,v 1.16 2011/07/18 07:44:30 isaki Exp $	*/
+/*	$NetBSD: fpu_emulate.h,v 1.17 2011/10/09 01:34:19 tsutsui Exp $	*/
 
 /*
  * Copyright (c) 1995 Gordon Ross
@@ -91,15 +91,15 @@ struct fpn {
 #define	FP_1		(1 << FP_LG)		/* 1.0 in fp_mant[0] */
 #define	FP_2		(1 << (FP_LG + 1))	/* 2.0 in fp_mant[0] */
 
-#define CPYFPN(dst, src)		\
-if ((dst) != (src)) {			\
-	(dst)->fp_class = (src)->fp_class;\
-	(dst)->fp_sign = (src)->fp_sign;\
-	(dst)->fp_exp = (src)->fp_exp;	\
-	(dst)->fp_sticky = (src)->fp_sticky;\
-	(dst)->fp_mant[0] = (src)->fp_mant[0];\
-	(dst)->fp_mant[1] = (src)->fp_mant[1];\
-	(dst)->fp_mant[2] = (src)->fp_mant[2];\
+static inline void CPYFPN(struct fpn * dst, const struct fpn * src);
+
+static inline void
+CPYFPN(struct fpn * dst, const struct fpn * src)
+{
+
+	if (dst != src) {
+		*dst = *src;
+	}
 }
 
 /*



CVS commit: src/sys/arch/m68k/fpe

2011-10-15 Thread Izumi Tsutsui
Module Name:src
Committed By:   tsutsui
Date:   Sat Oct 15 15:14:30 UTC 2011

Modified Files:
src/sys/arch/m68k/fpe: fpu_emulate.c fpu_emulate.h fpu_hyperb.c
fpu_trig.c

Log Message:
Add hyperboric and trigonometric functions to m68k FPE, written by isaki@.
With these emulations (~4KB text) xeyes on XM6i works better.
Discussed with isaki@ at OSC 2011 Hiroshima.


To generate a diff of this commit:
cvs rdiff -u -r1.35 -r1.36 src/sys/arch/m68k/fpe/fpu_emulate.c
cvs rdiff -u -r1.17 -r1.18 src/sys/arch/m68k/fpe/fpu_emulate.h
cvs rdiff -u -r1.5 -r1.6 src/sys/arch/m68k/fpe/fpu_hyperb.c \
src/sys/arch/m68k/fpe/fpu_trig.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_emulate.c
diff -u src/sys/arch/m68k/fpe/fpu_emulate.c:1.35 src/sys/arch/m68k/fpe/fpu_emulate.c:1.36
--- src/sys/arch/m68k/fpe/fpu_emulate.c:1.35	Mon Jul 18 14:11:27 2011
+++ src/sys/arch/m68k/fpe/fpu_emulate.c	Sat Oct 15 15:14:29 2011
@@ -1,4 +1,4 @@
-/*	$NetBSD: fpu_emulate.c,v 1.35 2011/07/18 14:11:27 isaki Exp $	*/
+/*	$NetBSD: fpu_emulate.c,v 1.36 2011/10/15 15:14:29 tsutsui Exp $	*/
 
 /*
  * Copyright (c) 1995 Gordon W. Ross
@@ -37,7 +37,7 @@
  */
 
 #include 
-__KERNEL_RCSID(0, "$NetBSD: fpu_emulate.c,v 1.35 2011/07/18 14:11:27 isaki Exp $");
+__KERNEL_RCSID(0, "$NetBSD: fpu_emulate.c,v 1.36 2011/10/15 15:14:29 tsutsui Exp $");
 
 #include 
 #include 
@@ -65,7 +65,6 @@ static int fpu_emul_arith(struct fpemu *
 static int fpu_emul_type1(struct fpemu *, struct instruction *);
 static int fpu_emul_brcc(struct fpemu *, struct instruction *);
 static int test_cc(struct fpemu *, int);
-static struct fpn *fpu_cmp(struct fpemu *);
 
 #ifdef DEBUG_FPE
 #define DUMP_INSN(insn)			\
@@ -494,7 +493,7 @@ fpu_emul_fmovm(struct fpemu *fe, struct 
 	return sig;
 }
 
-static struct fpn *
+struct fpn *
 fpu_cmp(struct fpemu *fe)
 {
 	struct fpn *x = &fe->fe_f1, *y = &fe->fe_f2;

Index: src/sys/arch/m68k/fpe/fpu_emulate.h
diff -u src/sys/arch/m68k/fpe/fpu_emulate.h:1.17 src/sys/arch/m68k/fpe/fpu_emulate.h:1.18
--- src/sys/arch/m68k/fpe/fpu_emulate.h:1.17	Sun Oct  9 01:34:19 2011
+++ src/sys/arch/m68k/fpe/fpu_emulate.h	Sat Oct 15 15:14:30 2011
@@ -1,4 +1,4 @@
-/*	$NetBSD: fpu_emulate.h,v 1.17 2011/10/09 01:34:19 tsutsui Exp $	*/
+/*	$NetBSD: fpu_emulate.h,v 1.18 2011/10/15 15:14:30 tsutsui Exp $	*/
 
 /*
  * Copyright (c) 1995 Gordon Ross
@@ -244,6 +244,9 @@ int fpu_emul_fscale(struct fpemu *fe, st
 #include "fpu_arith_proto.h"
 
 int fpu_emulate(struct frame *frame, struct fpframe *fpf, ksiginfo_t *ksi);
+struct fpn *fpu_cmp(struct fpemu *);
+
+struct fpn *fpu_sincos_taylor(struct fpemu *, struct fpn *, u_int, int);
 
 /*
  * "helper" functions

Index: src/sys/arch/m68k/fpe/fpu_hyperb.c
diff -u src/sys/arch/m68k/fpe/fpu_hyperb.c:1.5 src/sys/arch/m68k/fpe/fpu_hyperb.c:1.6
--- src/sys/arch/m68k/fpe/fpu_hyperb.c:1.5	Mon Jul 18 07:44:30 2011
+++ src/sys/arch/m68k/fpe/fpu_hyperb.c	Sat Oct 15 15:14:30 2011
@@ -1,4 +1,4 @@
-/*	$NetBSD: fpu_hyperb.c,v 1.5 2011/07/18 07:44:30 isaki Exp $	*/
+/*	$NetBSD: fpu_hyperb.c,v 1.6 2011/10/15 15:14:30 tsutsui Exp $	*/
 
 /*
  * Copyright (c) 1995  Ken Nakata
@@ -31,8 +31,33 @@
  *	@(#)fpu_hyperb.c	10/24/95
  */
 
+/*
+ * Copyright (c) 2011 Tetsuya Isaki. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *notice, this list of conditions and the following disclaimer in the
+ *documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+ * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
 #include 
-__KERNEL_RCSID(0, "$NetBSD: fpu_hyperb.c,v 1.5 2011/07/18 07:44:30 isaki Exp $");
+__KERNEL_RCSID(0, "$NetBSD: fpu_hyperb.c,v 1.6 2011/10/15 15:14:30 tsutsui Exp $");
 
 #include "fpu_emulate.h"
 
@@ -52,20 +77,87 @@ fpu_atanh(struct fpemu *fe)
 struct fpn *
 fpu_cosh(struct fpemu *fe)
 {
-	/* stub */
+	struct fpn s0;
+	struct fpn *r;
+	in

CVS commit: src/sys/arch/m68k/fpe

2011-10-15 Thread Izumi Tsutsui
Module Name:src
Committed By:   tsutsui
Date:   Sat Oct 15 15:24:28 UTC 2011

Modified Files:
src/sys/arch/m68k/fpe: README

Log Message:
Update implemented/unimplemented FP functions.


To generate a diff of this commit:
cvs rdiff -u -r1.4 -r1.5 src/sys/arch/m68k/fpe/README

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/README
diff -u src/sys/arch/m68k/fpe/README:1.4 src/sys/arch/m68k/fpe/README:1.5
--- src/sys/arch/m68k/fpe/README:1.4	Sun Nov  5 04:23:00 1995
+++ src/sys/arch/m68k/fpe/README	Sat Oct 15 15:24:28 2011
@@ -1,7 +1,7 @@
-* $NetBSD: README,v 1.4 1995/11/05 04:23:00 briggs Exp $
+* $NetBSD: README,v 1.5 2011/10/15 15:24:28 tsutsui Exp $
 * NetBSD/m68k FPE (floating point emulation) README file
 * Created Oct/??/95 by k...@remus.rutgers.edu (Ken Nakata)
-* Last updated Nov/04/95 by kenn
+* Last updated Oct/15/2011 by tsutsui
 
 1. INSTALLATION AND COMPILATION
 
@@ -67,7 +67,8 @@ Type field = bit 8-6 of opcode word
 Type=0: FMOVE (mem->FPr), FINT, FINTRZ, FSQRT, FABS, FNEG, FGETEXP,
 	FGETMAN, FDIV, FADD, FMUL, FSGLDIV(*), FSCALE, FSGLMUL(*), FSUB,
 	FCMP, FTST, FMOVE (FPr->mem), FMOVEM (FPr), FMOVEM (FPcr),
-	FMOVECR, FLOGNP1, FLOGN, FLOG10, FLOG2, FMOD, FREM
+	FMOVECR, FLOGNP1, FLOGN, FLOG10, FLOG2, FMOD, FREM,
+	FCOSH, FSINH, FTANH, FCOS, FSIN, FTAN, FSINCOS
 
 Type=1: FDBcc, FScc, FTRAPcc,
 
@@ -84,8 +85,7 @@ Type=5: none
 
 * Unimplemented Instructions
 
-Type=0: FSINH, FETOXM1, FTANH, FATAN, FASIN, FATANH, FSIN, FTAN,
-	FETOX, FTWOTOX, FTENTOX, FCOSH, FACOS, FCOS, FSINCOS
+Type=0: FETOX, FETOXM1, FTENTOX, FTWOTOX, FATANH, FACOS, FASIN, FATAN
 
 Type=1: none
 



CVS commit: src/sys/arch/m68k/fpe

2011-10-15 Thread Izumi Tsutsui
Module Name:src
Committed By:   tsutsui
Date:   Sat Oct 15 15:34:06 UTC 2011

Modified Files:
src/sys/arch/m68k/fpe: fpu_emulate.h

Log Message:
- remove variable names from function declarations
- some KNF


To generate a diff of this commit:
cvs rdiff -u -r1.18 -r1.19 src/sys/arch/m68k/fpe/fpu_emulate.h

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_emulate.h
diff -u src/sys/arch/m68k/fpe/fpu_emulate.h:1.18 src/sys/arch/m68k/fpe/fpu_emulate.h:1.19
--- src/sys/arch/m68k/fpe/fpu_emulate.h:1.18	Sat Oct 15 15:14:30 2011
+++ src/sys/arch/m68k/fpe/fpu_emulate.h	Sat Oct 15 15:34:06 2011
@@ -1,4 +1,4 @@
-/*	$NetBSD: fpu_emulate.h,v 1.18 2011/10/15 15:14:30 tsutsui Exp $	*/
+/*	$NetBSD: fpu_emulate.h,v 1.19 2011/10/15 15:34:06 tsutsui Exp $	*/
 
 /*
  * Copyright (c) 1995 Gordon Ross
@@ -91,10 +91,10 @@ struct fpn {
 #define	FP_1		(1 << FP_LG)		/* 1.0 in fp_mant[0] */
 #define	FP_2		(1 << (FP_LG + 1))	/* 2.0 in fp_mant[0] */
 
-static inline void CPYFPN(struct fpn * dst, const struct fpn * src);
+static inline void CPYFPN(struct fpn *, const struct fpn *);
 
 static inline void
-CPYFPN(struct fpn * dst, const struct fpn * src)
+CPYFPN(struct fpn *dst, const struct fpn *src)
 {
 
 	if (dst != src) {
@@ -213,37 +213,37 @@ struct instruction {
  */
 
 /* Build a new Quiet NaN (sign=0, frac=all 1's). */
-struct	fpn *fpu_newnan(struct fpemu *fe);
+struct	fpn *fpu_newnan(struct fpemu *);
 
 /*
  * Shift a number right some number of bits, taking care of round/sticky.
  * Note that the result is probably not a well-formed number (it will lack
  * the normal 1-bit mant[0]&FP_1).
  */
-int	fpu_shr(struct fpn * fp, int shr);
+int	fpu_shr(struct fpn *, int);
 /*
  * Round a number according to the round mode in FPCR
  */
-int	fpu_round(register struct fpemu *fe, register struct fpn *fp);
+int	fpu_round(register struct fpemu *, register struct fpn *);
 
 /* type conversion */
-void	fpu_explode(struct fpemu *fe, struct fpn *fp, int t, u_int *src);
-void	fpu_implode(struct fpemu *fe, struct fpn *fp, int t, u_int *dst);
+void	fpu_explode(struct fpemu *, struct fpn *, int t, u_int *);
+void	fpu_implode(struct fpemu *, struct fpn *, int t, u_int *);
 
 /*
  * non-static emulation functions
  */
 /* type 0 */
-int fpu_emul_fmovecr(struct fpemu *fe, struct instruction *insn);
-int fpu_emul_fstore(struct fpemu *fe, struct instruction *insn);
-int fpu_emul_fscale(struct fpemu *fe, struct instruction *insn);
+int fpu_emul_fmovecr(struct fpemu *, struct instruction *);
+int fpu_emul_fstore(struct fpemu *, struct instruction *);
+int fpu_emul_fscale(struct fpemu *, struct instruction *);
 
 /*
  * include function declarations of those which are called by fpu_emul_arith()
  */
 #include "fpu_arith_proto.h"
 
-int fpu_emulate(struct frame *frame, struct fpframe *fpf, ksiginfo_t *ksi);
+int fpu_emulate(struct frame *, struct fpframe *, ksiginfo_t *);
 struct fpn *fpu_cmp(struct fpemu *);
 
 struct fpn *fpu_sincos_taylor(struct fpemu *, struct fpn *, u_int, int);
@@ -252,21 +252,21 @@ struct fpn *fpu_sincos_taylor(struct fpe
  * "helper" functions
  */
 /* return values from constant rom */
-struct fpn *fpu_const(struct fpn *fp, u_int offset);
+struct fpn *fpu_const(struct fpn *, u_int);
 /* update exceptions and FPSR */
-int fpu_upd_excp(struct fpemu *fe);
-u_int fpu_upd_fpsr(struct fpemu *fe, struct fpn *fp);
+int fpu_upd_excp(struct fpemu *);
+u_int fpu_upd_fpsr(struct fpemu *, struct fpn *);
 
 /* address mode decoder, and load/store */
-int fpu_decode_ea(struct frame *frame, struct instruction *insn,
-		   struct insn_ea *ea, int modreg);
-int fpu_load_ea(struct frame *frame, struct instruction *insn,
-		 struct insn_ea *ea, char *dst);
-int fpu_store_ea(struct frame *frame, struct instruction *insn,
-		  struct insn_ea *ea, char *src);
+int fpu_decode_ea(struct frame *, struct instruction *,
+		   struct insn_ea *, int);
+int fpu_load_ea(struct frame *, struct instruction *,
+		 struct insn_ea *, char *);
+int fpu_store_ea(struct frame *, struct instruction *,
+		  struct insn_ea *, char *);
 
 /* fpu_subr.c */
-void fpu_norm(register struct fpn *fp);
+void fpu_norm(register struct fpn *);
 
 #if !defined(FPE_DEBUG)
 #  define FPE_DEBUG 0



CVS commit: src/sys/arch/m68k/fpe

2011-07-18 Thread Tetsuya Isaki
Module Name:src
Committed By:   isaki
Date:   Mon Jul 18 14:11:27 UTC 2011

Modified Files:
src/sys/arch/m68k/fpe: fpu_calcea.c fpu_emulate.c fpu_fmovecr.c
fpu_fscale.c fpu_fstore.c fpu_int.c fpu_log.c fpu_rem.c

Log Message:
fix indent again.
- "Second level indents are four spaces." pointed out by tsutsui@
- fold long line.


To generate a diff of this commit:
cvs rdiff -u -r1.25 -r1.26 src/sys/arch/m68k/fpe/fpu_calcea.c
cvs rdiff -u -r1.34 -r1.35 src/sys/arch/m68k/fpe/fpu_emulate.c
cvs rdiff -u -r1.13 -r1.14 src/sys/arch/m68k/fpe/fpu_fmovecr.c \
src/sys/arch/m68k/fpe/fpu_log.c
cvs rdiff -u -r1.14 -r1.15 src/sys/arch/m68k/fpe/fpu_fscale.c
cvs rdiff -u -r1.12 -r1.13 src/sys/arch/m68k/fpe/fpu_fstore.c
cvs rdiff -u -r1.9 -r1.10 src/sys/arch/m68k/fpe/fpu_int.c
cvs rdiff -u -r1.10 -r1.11 src/sys/arch/m68k/fpe/fpu_rem.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_calcea.c
diff -u src/sys/arch/m68k/fpe/fpu_calcea.c:1.25 src/sys/arch/m68k/fpe/fpu_calcea.c:1.26
--- src/sys/arch/m68k/fpe/fpu_calcea.c:1.25	Mon Jul 18 07:44:30 2011
+++ src/sys/arch/m68k/fpe/fpu_calcea.c	Mon Jul 18 14:11:27 2011
@@ -1,4 +1,4 @@
-/*	$NetBSD: fpu_calcea.c,v 1.25 2011/07/18 07:44:30 isaki Exp $	*/
+/*	$NetBSD: fpu_calcea.c,v 1.26 2011/07/18 14:11:27 isaki Exp $	*/
 
 /*
  * Copyright (c) 1995 Gordon W. Ross
@@ -34,7 +34,7 @@
 #include "opt_m68k_arch.h"
 
 #include 
-__KERNEL_RCSID(0, "$NetBSD: fpu_calcea.c,v 1.25 2011/07/18 07:44:30 isaki Exp $");
+__KERNEL_RCSID(0, "$NetBSD: fpu_calcea.c,v 1.26 2011/07/18 14:11:27 isaki Exp $");
 
 #include 
 #include 
@@ -88,13 +88,13 @@
 		ea->ea_regnum = modreg & 0xf;
 		ea->ea_flags = EA_DIRECT;
 		DPRINTF(("%s: register direct reg=%d\n",
-			__func__, ea->ea_regnum));
+		__func__, ea->ea_regnum));
 	} else if ((modreg & 077) == 074) {
 		/* immediate */
 		ea->ea_flags = EA_IMMED;
 		sig = fetch_immed(frame, insn, &ea->ea_immed[0]);
 		DPRINTF(("%s: immediate size=%d\n",
-			__func__, insn->is_datasize));
+		__func__, insn->is_datasize));
 	}
 	/*
 	 * rest of the address modes need to be separately
@@ -106,7 +106,7 @@
 		ea->ea_flags = EA_FRAME_EA;
 		ea->ea_fea = frame->f_fmt4.f_fa;
 		DPRINTF(("%s: 68LC040 - in-frame EA (%p) size %d\n",
-			__func__, (void *)ea->ea_fea, insn->is_datasize));
+		__func__, (void *)ea->ea_fea, insn->is_datasize));
 		if ((modreg & 070) == 030) {
 			/* postincrement mode */
 			ea->ea_flags |= EA_POSTINCR;
@@ -130,26 +130,26 @@
 		case 020:			/* (An) */
 			ea->ea_flags = 0;
 			DPRINTF(("%s: register indirect reg=%d\n",
-__func__, ea->ea_regnum));
+			__func__, ea->ea_regnum));
 			break;
 
 		case 030:			/* (An)+ */
 			ea->ea_flags = EA_POSTINCR;
 			DPRINTF(("%s: reg indirect postincrement reg=%d\n",
-__func__, ea->ea_regnum));
+			__func__, ea->ea_regnum));
 			break;
 
 		case 040:			/* -(An) */
 			ea->ea_flags = EA_PREDECR;
 			DPRINTF(("%s: reg indirect predecrement reg=%d\n",
-__func__, ea->ea_regnum));
+			__func__, ea->ea_regnum));
 			break;
 
 		case 050:			/* (d16,An) */
 			ea->ea_flags = EA_OFFSET;
 			sig = fetch_disp(frame, insn, 1, &ea->ea_offset);
 			DPRINTF(("%s: reg indirect with displacement reg=%d\n",
-__func__, ea->ea_regnum));
+			__func__, ea->ea_regnum));
 		break;
 
 		case 060:			/* (d8,An,Xn) */
@@ -164,25 +164,25 @@
 			case 0:			/* ().W */
 ea->ea_flags = EA_ABS;
 sig = fetch_disp(frame, insn, 1,
-	&ea->ea_absaddr);
+&ea->ea_absaddr);
 DPRINTF(("%s: absolute address (word)\n",
-	__func__));
+__func__));
 break;
 
 			case 1:			/* ().L */
 ea->ea_flags = EA_ABS;
 sig = fetch_disp(frame, insn, 2,
-	&ea->ea_absaddr);
+&ea->ea_absaddr);
 DPRINTF(("%s: absolute address (long)\n",
-	__func__));
+__func__));
 break;
 
 			case 2:			/* (d16,PC) */
 ea->ea_flags = EA_PC_REL | EA_OFFSET;
 sig = fetch_disp(frame, insn, 1,
-	&ea->ea_absaddr);
+&ea->ea_absaddr);
 DPRINTF(("%s: pc relative word displacement\n",
-	__func__));
+__func__));
 break;
 
 			case 3:			/* (d8,PC,Xn) */
@@ -194,7 +194,7 @@
 /* it should have been taken care of earlier */
 			default:
 DPRINTF(("%s: invalid addr mode (7,%d)\n",
-	__func__, modreg & 7));
+__func__, modreg & 7));
 return SIGILL;
 			}
 			break;
@@ -246,7 +246,7 @@
 		ea->ea_basedisp = idx + basedisp;
 		ea->ea_outerdisp = 0;
 		DPRINTF(("%s: brief ext word idxreg=%d, basedisp=%08x\n",
-			__func__, ea->ea_idxreg, ea->ea_basedisp));
+		__func__, ea->ea_idxreg, ea->ea_basedisp));
 	} else {
 		/* full extension word */
 		if (extword & 0x80) {
@@ -278,16 +278,16 @@
 			break;
 		default:
 			DPRINTF(("%s: invalid indirect mode: ext word %04x\n",
-__func__, extword));
+			__func__, extword));
 			return SIGILL;
 			break;
 		}
 		DPRINTF(("%s: full

CVS commit: src/sys/arch/m68k/fpe

2015-02-05 Thread Tetsuya Isaki
Module Name:src
Committed By:   isaki
Date:   Thu Feb  5 12:22:06 UTC 2015

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

Log Message:
Fix typo in comment.  pointed out by Y.Sugahara.


To generate a diff of this commit:
cvs rdiff -u -r1.16 -r1.17 src/sys/arch/m68k/fpe/fpu_rem.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_rem.c
diff -u src/sys/arch/m68k/fpe/fpu_rem.c:1.16 src/sys/arch/m68k/fpe/fpu_rem.c:1.17
--- src/sys/arch/m68k/fpe/fpu_rem.c:1.16	Sat May 11 12:52:42 2013
+++ src/sys/arch/m68k/fpe/fpu_rem.c	Thu Feb  5 12:22:06 2015
@@ -1,4 +1,4 @@
-/*	$NetBSD: fpu_rem.c,v 1.16 2013/05/11 12:52:42 isaki Exp $	*/
+/*	$NetBSD: fpu_rem.c,v 1.17 2015/02/05 12:22:06 isaki Exp $	*/
 
 /*
  * Copyright (c) 1995  Ken Nakata
@@ -32,7 +32,7 @@
  */
 
 #include 
-__KERNEL_RCSID(0, "$NetBSD: fpu_rem.c,v 1.16 2013/05/11 12:52:42 isaki Exp $");
+__KERNEL_RCSID(0, "$NetBSD: fpu_rem.c,v 1.17 2015/02/05 12:22:06 isaki Exp $");
 
 #include 
 #include 
@@ -56,7 +56,7 @@ __KERNEL_RCSID(0, "$NetBSD: fpu_rem.c,v 
  *endif
  *
  *   Step 3.  Perform MOD(X,Y)
- *3.1 If R = Y, then { Q := Q + 1, R := 0, go to Step 8. }
+ *3.1 If R = Y, then { Q := Q + 1, R := 0, go to Step 7. }
  *3.2 If R > Y, then { R := R - Y, Q := Q + 1}
  *3.3 If j = 0, go to Step 4.
  *3.4 k := k + 1, j := j - 1, Q := 2Q, R := 2R. Go to
@@ -64,7 +64,7 @@ __KERNEL_RCSID(0, "$NetBSD: fpu_rem.c,v 
  *
  *   Step 4.  R := signX*R.
  *
- *   Step 5.  If MOD is requested, go to Step .
+ *   Step 5.  If MOD is requested, go to Step 7.
  *
  *   Step 6.  Now, R = MOD(X,Y), convert to REM(X,Y) is requested.
  *Do banker's rounding.



CVS commit: src/sys/arch/m68k/fpe

2015-02-05 Thread Tetsuya Isaki
Module Name:src
Committed By:   isaki
Date:   Thu Feb  5 12:23:27 UTC 2015

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

Log Message:
For the extended precision, the MSB of the mantissa is an integer
part, and this bit must be ignored at Infinity.
found by tests/lib/libc/stdlib/t_strtod.c::strtold_inf.


To generate a diff of this commit:
cvs rdiff -u -r1.14 -r1.15 src/sys/arch/m68k/fpe/fpu_explode.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_explode.c
diff -u src/sys/arch/m68k/fpe/fpu_explode.c:1.14 src/sys/arch/m68k/fpe/fpu_explode.c:1.15
--- src/sys/arch/m68k/fpe/fpu_explode.c:1.14	Tue Mar 26 11:30:20 2013
+++ src/sys/arch/m68k/fpe/fpu_explode.c	Thu Feb  5 12:23:27 2015
@@ -1,4 +1,4 @@
-/*	$NetBSD: fpu_explode.c,v 1.14 2013/03/26 11:30:20 isaki Exp $ */
+/*	$NetBSD: fpu_explode.c,v 1.15 2015/02/05 12:23:27 isaki Exp $ */
 
 /*
  * Copyright (c) 1992, 1993
@@ -46,7 +46,7 @@
  */
 
 #include 
-__KERNEL_RCSID(0, "$NetBSD: fpu_explode.c,v 1.14 2013/03/26 11:30:20 isaki Exp $");
+__KERNEL_RCSID(0, "$NetBSD: fpu_explode.c,v 1.15 2015/02/05 12:23:27 isaki Exp $");
 
 #include 
 #include 
@@ -183,18 +183,17 @@ static int
 fpu_xtof(struct fpn *fp, uint32_t i, uint32_t j, uint32_t k)
 {
 	int exp;
-	uint32_t frac, f0, f1, f2;
+	uint32_t f0, f1, f2;
 #define EXT_SHIFT (EXT_FRACBITS - 1 - 32 - FP_LG)
 
 	exp = (i >> (32 - 1 - EXT_EXPBITS)) & mask(EXT_EXPBITS);
 	f0 = j >> EXT_SHIFT;
 	f1 = (j << (32 - EXT_SHIFT)) | (k >> EXT_SHIFT);
 	f2 = k << (32 - EXT_SHIFT);
-	frac = j | k;
 
 	/* m68k extended does not imply denormal by exp==0 */
 	if (exp == 0) {
-		if (frac == 0)
+		if ((j | k) == 0)
 			return (FPC_ZERO);
 		fp->fp_exp = - EXT_EXP_BIAS;
 		fp->fp_mant[0] = f0;
@@ -204,7 +203,8 @@ fpu_xtof(struct fpn *fp, uint32_t i, uin
 		return (FPC_NUM);
 	}
 	if (exp == (2 * EXT_EXP_BIAS + 1)) {
-		if (frac == 0)
+		/* MSB is an integer part and don't care */
+		if ((j & 0x7fff) == 0 && k == 0)
 			return (FPC_INF);
 		fp->fp_mant[0] = f0;
 		fp->fp_mant[1] = f1;



CVS commit: src/sys/arch/m68k/fpe

2013-03-22 Thread Tetsuya Isaki
Module Name:src
Committed By:   isaki
Date:   Fri Mar 22 13:46:38 UTC 2013

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

Log Message:
Fix fpu_ftox().
Update not only exponential but also mantissa when an integer part
becomes 2 by rounding up.  Without this fix, the extended precision
value becomes 0.0 because mantissa (including explicit integer bit)
is all-zero.


To generate a diff of this commit:
cvs rdiff -u -r1.13 -r1.14 src/sys/arch/m68k/fpe/fpu_implode.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_implode.c
diff -u src/sys/arch/m68k/fpe/fpu_implode.c:1.13 src/sys/arch/m68k/fpe/fpu_implode.c:1.14
--- src/sys/arch/m68k/fpe/fpu_implode.c:1.13	Tue Mar 19 09:17:17 2013
+++ src/sys/arch/m68k/fpe/fpu_implode.c	Fri Mar 22 13:46:38 2013
@@ -1,4 +1,4 @@
-/*	$NetBSD: fpu_implode.c,v 1.13 2013/03/19 09:17:17 isaki Exp $ */
+/*	$NetBSD: fpu_implode.c,v 1.14 2013/03/22 13:46:38 isaki Exp $ */
 
 /*
  * Copyright (c) 1992, 1993
@@ -46,7 +46,7 @@
  */
 
 #include 
-__KERNEL_RCSID(0, "$NetBSD: fpu_implode.c,v 1.13 2013/03/19 09:17:17 isaki Exp $");
+__KERNEL_RCSID(0, "$NetBSD: fpu_implode.c,v 1.14 2013/03/22 13:46:38 isaki Exp $");
 
 #include 
 #include 
@@ -433,8 +433,10 @@ fpu_ftox(struct fpemu *fe, struct fpn *f
 #if (FP_NMANT - FP_NG - EXT_FRACBITS) > 0
 	(void) fpu_shr(fp, FP_NMANT - FP_NG - EXT_FRACBITS);
 #endif
-	if (fpu_round(fe, fp) && fp->fp_mant[0] == EXT_EXPLICIT2)
+	if (fpu_round(fe, fp) && fp->fp_mant[0] == EXT_EXPLICIT2) {
 		exp++;
+		fpu_shr(fp, 1);
+	}
 	if (exp >= EXT_EXP_INFNAN) {
 		fe->fe_fpsr |= FPSR_OPERR | FPSR_INEX2 | FPSR_OVFL;
 		if (toinf(fe, sign)) {



CVS commit: src/sys/arch/m68k/fpe

2013-03-23 Thread Tetsuya Isaki
Module Name:src
Committed By:   isaki
Date:   Sat Mar 23 12:06:24 UTC 2013

Modified Files:
src/sys/arch/m68k/fpe: fpu_hyperb.c fpu_trig.c

Log Message:
Remove about updating fpsr. It was introduced by me but obviously
duplicated with fpu_emul_arith().


To generate a diff of this commit:
cvs rdiff -u -r1.6 -r1.7 src/sys/arch/m68k/fpe/fpu_hyperb.c \
src/sys/arch/m68k/fpe/fpu_trig.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_hyperb.c
diff -u src/sys/arch/m68k/fpe/fpu_hyperb.c:1.6 src/sys/arch/m68k/fpe/fpu_hyperb.c:1.7
--- src/sys/arch/m68k/fpe/fpu_hyperb.c:1.6	Sat Oct 15 15:14:30 2011
+++ src/sys/arch/m68k/fpe/fpu_hyperb.c	Sat Mar 23 12:06:24 2013
@@ -1,4 +1,4 @@
-/*	$NetBSD: fpu_hyperb.c,v 1.6 2011/10/15 15:14:30 tsutsui Exp $	*/
+/*	$NetBSD: fpu_hyperb.c,v 1.7 2013/03/23 12:06:24 isaki Exp $	*/
 
 /*
  * Copyright (c) 1995  Ken Nakata
@@ -57,7 +57,7 @@
  */
 
 #include 
-__KERNEL_RCSID(0, "$NetBSD: fpu_hyperb.c,v 1.6 2011/10/15 15:14:30 tsutsui Exp $");
+__KERNEL_RCSID(0, "$NetBSD: fpu_hyperb.c,v 1.7 2013/03/23 12:06:24 isaki Exp $");
 
 #include "fpu_emulate.h"
 
@@ -81,8 +81,6 @@ fpu_cosh(struct fpemu *fe)
 	struct fpn *r;
 	int hyperb = 1;
 
-	fe->fe_fpsr &= ~FPSR_EXCP; /* clear all exceptions */
-
 	if (ISNAN(&fe->fe_f2))
 		return &fe->fe_f2;
 
@@ -95,7 +93,6 @@ fpu_cosh(struct fpemu *fe)
 	r = fpu_sincos_taylor(fe, &s0, 1, hyperb);
 	CPYFPN(&fe->fe_f2, r);
 
-	fpu_upd_fpsr(fe, &fe->fe_f2);
 	return &fe->fe_f2;
 }
 
@@ -106,8 +103,6 @@ fpu_sinh(struct fpemu *fe)
 	struct fpn *r;
 	int hyperb = 1;
 
-	fe->fe_fpsr &= ~FPSR_EXCP; /* clear all exceptions */
-
 	if (ISNAN(&fe->fe_f2))
 		return &fe->fe_f2;
 	if (ISINF(&fe->fe_f2))
@@ -117,7 +112,6 @@ fpu_sinh(struct fpemu *fe)
 	r = fpu_sincos_taylor(fe, &s0, 2, hyperb);
 	CPYFPN(&fe->fe_f2, r);
 
-	fpu_upd_fpsr(fe, &fe->fe_f2);
 	return &fe->fe_f2;
 }
 
@@ -129,8 +123,6 @@ fpu_tanh(struct fpemu *fe)
 	struct fpn *r;
 	int sign;
 
-	fe->fe_fpsr &= ~FPSR_EXCP; /* clear all exceptions */
-
 	if (ISNAN(&fe->fe_f2))
 		return &fe->fe_f2;
 
@@ -158,6 +150,5 @@ fpu_tanh(struct fpemu *fe)
 
 	CPYFPN(&fe->fe_f2, r);
 
-	fpu_upd_fpsr(fe, &fe->fe_f2);
 	return &fe->fe_f2;
 }
Index: src/sys/arch/m68k/fpe/fpu_trig.c
diff -u src/sys/arch/m68k/fpe/fpu_trig.c:1.6 src/sys/arch/m68k/fpe/fpu_trig.c:1.7
--- src/sys/arch/m68k/fpe/fpu_trig.c:1.6	Sat Oct 15 15:14:30 2011
+++ src/sys/arch/m68k/fpe/fpu_trig.c	Sat Mar 23 12:06:24 2013
@@ -1,4 +1,4 @@
-/*	$NetBSD: fpu_trig.c,v 1.6 2011/10/15 15:14:30 tsutsui Exp $	*/
+/*	$NetBSD: fpu_trig.c,v 1.7 2013/03/23 12:06:24 isaki Exp $	*/
 
 /*
  * Copyright (c) 1995  Ken Nakata
@@ -57,7 +57,7 @@
  */
 
 #include 
-__KERNEL_RCSID(0, "$NetBSD: fpu_trig.c,v 1.6 2011/10/15 15:14:30 tsutsui Exp $");
+__KERNEL_RCSID(0, "$NetBSD: fpu_trig.c,v 1.7 2013/03/23 12:06:24 isaki Exp $");
 
 #include "fpu_emulate.h"
 
@@ -239,8 +239,6 @@ fpu_cos(struct fpemu *fe)
 	struct fpn *r;
 	int sign;
 
-	fe->fe_fpsr &= ~FPSR_EXCP; /* clear all exceptions */
-
 	if (ISNAN(&fe->fe_f2))
 		return &fe->fe_f2;
 	if (ISINF(&fe->fe_f2))
@@ -319,7 +317,6 @@ fpu_cos(struct fpemu *fe)
 	CPYFPN(&fe->fe_f2, r);
 	fe->fe_f2.fp_sign = sign;
 
-	fpu_upd_fpsr(fe, &fe->fe_f2);
 	return &fe->fe_f2;
 }
 
@@ -354,8 +351,6 @@ fpu_sin(struct fpemu *fe)
 	struct fpn *r;
 	int sign;
 
-	fe->fe_fpsr &= ~FPSR_EXCP; /* clear all exceptions */
-
 	if (ISNAN(&fe->fe_f2))
 		return &fe->fe_f2;
 	if (ISINF(&fe->fe_f2))
@@ -433,7 +428,6 @@ fpu_sin(struct fpemu *fe)
 	CPYFPN(&fe->fe_f2, r);
 	fe->fe_f2.fp_sign = sign;
 
-	fpu_upd_fpsr(fe, &fe->fe_f2);
 	return &fe->fe_f2;
 }
 
@@ -447,8 +441,6 @@ fpu_tan(struct fpemu *fe)
 	struct fpn s;
 	struct fpn *r;
 
-	fe->fe_fpsr &= ~FPSR_EXCP; /* clear all exceptions */
-
 	if (ISNAN(&fe->fe_f2))
 		return &fe->fe_f2;
 	if (ISINF(&fe->fe_f2))
@@ -471,7 +463,6 @@ fpu_tan(struct fpemu *fe)
 
 	CPYFPN(&fe->fe_f2, r);
 
-	fpu_upd_fpsr(fe, &fe->fe_f2);
 	return &fe->fe_f2;
 }
 
@@ -490,6 +481,5 @@ fpu_sincos(struct fpemu *fe, int regc)
 	/* sin(x) */
 	CPYFPN(&fe->fe_f2, &x);
 	r = fpu_sin(fe);
-	fpu_upd_fpsr(fe, r);
 	return r;
 }



CVS commit: src/sys/arch/m68k/fpe

2013-03-23 Thread Tetsuya Isaki
Module Name:src
Committed By:   isaki
Date:   Sat Mar 23 12:08:47 UTC 2013

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

Log Message:
Use the #error directive.


To generate a diff of this commit:
cvs rdiff -u -r1.14 -r1.15 src/sys/arch/m68k/fpe/fpu_fmovecr.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_fmovecr.c
diff -u src/sys/arch/m68k/fpe/fpu_fmovecr.c:1.14 src/sys/arch/m68k/fpe/fpu_fmovecr.c:1.15
--- src/sys/arch/m68k/fpe/fpu_fmovecr.c:1.14	Mon Jul 18 14:11:27 2011
+++ src/sys/arch/m68k/fpe/fpu_fmovecr.c	Sat Mar 23 12:08:47 2013
@@ -1,4 +1,4 @@
-/*	$NetBSD: fpu_fmovecr.c,v 1.14 2011/07/18 14:11:27 isaki Exp $	*/
+/*	$NetBSD: fpu_fmovecr.c,v 1.15 2013/03/23 12:08:47 isaki Exp $	*/
 
 /*
  * Copyright (c) 1995  Ken Nakata
@@ -32,7 +32,7 @@
  */
 
 #include 
-__KERNEL_RCSID(0, "$NetBSD: fpu_fmovecr.c,v 1.14 2011/07/18 14:11:27 isaki Exp $");
+__KERNEL_RCSID(0, "$NetBSD: fpu_fmovecr.c,v 1.15 2013/03/23 12:08:47 isaki Exp $");
 
 #include 
 #include 
@@ -42,7 +42,7 @@ __KERNEL_RCSID(0, "$NetBSD: fpu_fmovecr.
 
 /* XXX: quick consistency check */
 #if (FP_1 != 0x4)
-Error you have to change this table when changing the mantissa size
+#error you have to change this table when changing the mantissa size
 #endif
 
 static struct fpn constrom[] = {



CVS commit: src/sys/arch/m68k/fpe

2013-03-26 Thread Tetsuya Isaki
Module Name:src
Committed By:   isaki
Date:   Tue Mar 26 10:57:13 UTC 2013

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

Log Message:
Fix a wrong "raw" comparison in step3.2.
It should solve a PR kern/47692.


To generate a diff of this commit:
cvs rdiff -u -r1.11 -r1.12 src/sys/arch/m68k/fpe/fpu_rem.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_rem.c
diff -u src/sys/arch/m68k/fpe/fpu_rem.c:1.11 src/sys/arch/m68k/fpe/fpu_rem.c:1.12
--- src/sys/arch/m68k/fpe/fpu_rem.c:1.11	Mon Jul 18 14:11:27 2011
+++ src/sys/arch/m68k/fpe/fpu_rem.c	Tue Mar 26 10:57:13 2013
@@ -1,4 +1,4 @@
-/*	$NetBSD: fpu_rem.c,v 1.11 2011/07/18 14:11:27 isaki Exp $	*/
+/*	$NetBSD: fpu_rem.c,v 1.12 2013/03/26 10:57:13 isaki Exp $	*/
 
 /*
  * Copyright (c) 1995  Ken Nakata
@@ -32,7 +32,7 @@
  */
 
 #include 
-__KERNEL_RCSID(0, "$NetBSD: fpu_rem.c,v 1.11 2011/07/18 14:11:27 isaki Exp $");
+__KERNEL_RCSID(0, "$NetBSD: fpu_rem.c,v 1.12 2013/03/26 10:57:13 isaki Exp $");
 
 #include 
 #include 
@@ -92,6 +92,7 @@ __fpu_modrem(struct fpemu *fe, int modre
 {
 	static struct fpn X, Y;
 	struct fpn *x, *y, *r;
+	struct fpn r_bkup;
 	u_int signX, signY, signQ;
 	int j, k, l, q;
 	int Last_Subtract;
@@ -130,15 +131,15 @@ __fpu_modrem(struct fpemu *fe, int modre
 		   y->fp_mant[2] != r->fp_mant[2]) {
 
 			/* Step 3.2 */
-			if (y->fp_exp < r->fp_exp ||
-			y->fp_mant[0] < r->fp_mant[0] ||
-			y->fp_mant[1] < r->fp_mant[1] ||
-			y->fp_mant[2] < r->fp_mant[2]) {
-CPYFPN(&fe->fe_f1, r);
-CPYFPN(&fe->fe_f2, y);
-fe->fe_f2.fp_sign = 1;
-r = fpu_add(fe);
+			CPYFPN(&r_bkup, r);
+			CPYFPN(&fe->fe_f1, r);
+			CPYFPN(&fe->fe_f2, y);
+			fe->fe_f2.fp_sign = 1;
+			r = fpu_add(fe);
+			if (r->fp_sign == 0) {
 q++;
+			} else {
+CPYFPN(r, &r_bkup);
 			}
 
 			/* Step 3.3 */



CVS commit: src/sys/arch/m68k/fpe

2013-03-26 Thread Tetsuya Isaki
Module Name:src
Committed By:   isaki
Date:   Tue Mar 26 11:30:21 UTC 2013

Modified Files:
src/sys/arch/m68k/fpe: fpu_add.c fpu_arith.h fpu_div.c fpu_emulate.c
fpu_emulate.h fpu_explode.c fpu_fmovecr.c fpu_fscale.c fpu_fstore.c
fpu_implode.c fpu_log.c fpu_mul.c fpu_rem.c fpu_sqrt.c fpu_subr.c
fpu_trig.c

Log Message:
u_int -> uint32_t


To generate a diff of this commit:
cvs rdiff -u -r1.8 -r1.9 src/sys/arch/m68k/fpe/fpu_add.c
cvs rdiff -u -r1.6 -r1.7 src/sys/arch/m68k/fpe/fpu_arith.h
cvs rdiff -u -r1.7 -r1.8 src/sys/arch/m68k/fpe/fpu_div.c \
src/sys/arch/m68k/fpe/fpu_mul.c src/sys/arch/m68k/fpe/fpu_sqrt.c \
src/sys/arch/m68k/fpe/fpu_trig.c
cvs rdiff -u -r1.36 -r1.37 src/sys/arch/m68k/fpe/fpu_emulate.c
cvs rdiff -u -r1.21 -r1.22 src/sys/arch/m68k/fpe/fpu_emulate.h
cvs rdiff -u -r1.13 -r1.14 src/sys/arch/m68k/fpe/fpu_explode.c \
src/sys/arch/m68k/fpe/fpu_fstore.c
cvs rdiff -u -r1.15 -r1.16 src/sys/arch/m68k/fpe/fpu_fmovecr.c \
src/sys/arch/m68k/fpe/fpu_fscale.c
cvs rdiff -u -r1.14 -r1.15 src/sys/arch/m68k/fpe/fpu_implode.c \
src/sys/arch/m68k/fpe/fpu_log.c
cvs rdiff -u -r1.12 -r1.13 src/sys/arch/m68k/fpe/fpu_rem.c
cvs rdiff -u -r1.9 -r1.10 src/sys/arch/m68k/fpe/fpu_subr.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_add.c
diff -u src/sys/arch/m68k/fpe/fpu_add.c:1.8 src/sys/arch/m68k/fpe/fpu_add.c:1.9
--- src/sys/arch/m68k/fpe/fpu_add.c:1.8	Tue Mar 19 09:17:17 2013
+++ src/sys/arch/m68k/fpe/fpu_add.c	Tue Mar 26 11:30:20 2013
@@ -1,4 +1,4 @@
-/*	$NetBSD: fpu_add.c,v 1.8 2013/03/19 09:17:17 isaki Exp $ */
+/*	$NetBSD: fpu_add.c,v 1.9 2013/03/26 11:30:20 isaki Exp $ */
 
 /*
  * Copyright (c) 1992, 1993
@@ -47,7 +47,7 @@
  */
 
 #include 
-__KERNEL_RCSID(0, "$NetBSD: fpu_add.c,v 1.8 2013/03/19 09:17:17 isaki Exp $");
+__KERNEL_RCSID(0, "$NetBSD: fpu_add.c,v 1.9 2013/03/26 11:30:20 isaki Exp $");
 
 #include 
 #include 
@@ -61,7 +61,7 @@ struct fpn *
 fpu_add(struct fpemu *fe)
 {
 	struct fpn *x = &fe->fe_f1, *y = &fe->fe_f2, *r;
-	u_int r0, r1, r2;
+	uint32_t r0, r1, r2;
 	int rd;
 
 	/*

Index: src/sys/arch/m68k/fpe/fpu_arith.h
diff -u src/sys/arch/m68k/fpe/fpu_arith.h:1.6 src/sys/arch/m68k/fpe/fpu_arith.h:1.7
--- src/sys/arch/m68k/fpe/fpu_arith.h:1.6	Tue Mar 19 09:17:17 2013
+++ src/sys/arch/m68k/fpe/fpu_arith.h	Tue Mar 26 11:30:20 2013
@@ -1,4 +1,4 @@
-/*	$NetBSD: fpu_arith.h,v 1.6 2013/03/19 09:17:17 isaki Exp $ */
+/*	$NetBSD: fpu_arith.h,v 1.7 2013/03/26 11:30:20 isaki Exp $ */
 
 /*
  * Copyright (c) 1992, 1993
@@ -80,13 +80,13 @@
 #define	FPU_ADDS(r, x, y) \
 	{ \
 		fpu_tmp = (quad_t)(x) + (quad_t)(y); \
-		(r) = (u_int)fpu_tmp; \
+		(r) = (uint32_t)fpu_tmp; \
 		fpu_carry = ((fpu_tmp & 0xLL) != 0); \
 	}
 #define	FPU_ADDCS(r, x, y) \
 	{ \
 		fpu_tmp = (quad_t)(x) + (quad_t)(y) + (!!fpu_carry); \
-		(r) = (u_int)fpu_tmp; \
+		(r) = (uint32_t)fpu_tmp; \
 		fpu_carry = ((fpu_tmp & 0xLL) != 0); \
 	}
 #define	FPU_SUBC(r, x, y) \
@@ -94,13 +94,13 @@
 #define	FPU_SUBS(r, x, y) \
 	{ \
 		fpu_tmp = (quad_t)(x) - (quad_t)(y); \
-		(r) = (u_int)fpu_tmp; \
+		(r) = (uint32_t)fpu_tmp; \
 		fpu_carry = ((fpu_tmp & 0xLL) != 0); \
 	}
 #define	FPU_SUBCS(r, x, y) \
 	{ \
 		fpu_tmp = (quad_t)(x) - (quad_t)(y) - (!!fpu_carry); \
-		(r) = (u_int)fpu_tmp; \
+		(r) = (uint32_t)fpu_tmp; \
 		fpu_carry = ((fpu_tmp & 0xLL) != 0); \
 	}
 

Index: src/sys/arch/m68k/fpe/fpu_div.c
diff -u src/sys/arch/m68k/fpe/fpu_div.c:1.7 src/sys/arch/m68k/fpe/fpu_div.c:1.8
--- src/sys/arch/m68k/fpe/fpu_div.c:1.7	Tue Mar 19 09:17:17 2013
+++ src/sys/arch/m68k/fpe/fpu_div.c	Tue Mar 26 11:30:20 2013
@@ -1,4 +1,4 @@
-/*	$NetBSD: fpu_div.c,v 1.7 2013/03/19 09:17:17 isaki Exp $ */
+/*	$NetBSD: fpu_div.c,v 1.8 2013/03/26 11:30:20 isaki Exp $ */
 
 /*
  * Copyright (c) 1992, 1993
@@ -45,7 +45,7 @@
  */
 
 #include 
-__KERNEL_RCSID(0, "$NetBSD: fpu_div.c,v 1.7 2013/03/19 09:17:17 isaki Exp $");
+__KERNEL_RCSID(0, "$NetBSD: fpu_div.c,v 1.8 2013/03/26 11:30:20 isaki Exp $");
 
 #include 
 
@@ -153,8 +153,8 @@ struct fpn *
 fpu_div(struct fpemu *fe)
 {
 	struct fpn *x = &fe->fe_f1, *y = &fe->fe_f2;
-	u_int q, bit;
-	u_int r0, r1, r2, d0, d1, d2, y0, y1, y2;
+	uint32_t q, bit;
+	uint32_t r0, r1, r2, d0, d1, d2, y0, y1, y2;
 	FPU_DECL_CARRY
 
 	fe->fe_fpsr &= ~FPSR_EXCP; /* clear all exceptions */
Index: src/sys/arch/m68k/fpe/fpu_mul.c
diff -u src/sys/arch/m68k/fpe/fpu_mul.c:1.7 src/sys/arch/m68k/fpe/fpu_mul.c:1.8
--- src/sys/arch/m68k/fpe/fpu_mul.c:1.7	Tue Mar 19 09:17:17 2013
+++ src/sys/arch/m68k/fpe/fpu_mul.c	Tue Mar 26 11:30:21 2013
@@ -1,4 +1,4 @@
-/*	$NetBSD: fpu_mul.c,v 1.7 2013/03/19 09:17:17 isaki Exp $ */
+/*	$NetBSD: fpu_mul.c,v 1.8 2013/03/26 11:30:21 isaki Exp $ */
 
 /*
  * Copyright (c) 1992, 1993
@@ -45,7 +45,7 @@
  */
 
 #include 
-__KERNEL_RCSID(0, "$NetBSD: fpu_mul.c,v 1.7 2013/0

CVS commit: src/sys/arch/m68k/fpe

2013-04-01 Thread Tetsuya Isaki
Module Name:src
Committed By:   isaki
Date:   Mon Apr  1 13:59:21 UTC 2013

Modified Files:
src/sys/arch/m68k/fpe: fpu_arith.h

Log Message:
quad_t -> uint64_t


To generate a diff of this commit:
cvs rdiff -u -r1.7 -r1.8 src/sys/arch/m68k/fpe/fpu_arith.h

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_arith.h
diff -u src/sys/arch/m68k/fpe/fpu_arith.h:1.7 src/sys/arch/m68k/fpe/fpu_arith.h:1.8
--- src/sys/arch/m68k/fpe/fpu_arith.h:1.7	Tue Mar 26 11:30:20 2013
+++ src/sys/arch/m68k/fpe/fpu_arith.h	Mon Apr  1 13:59:21 2013
@@ -1,4 +1,4 @@
-/*	$NetBSD: fpu_arith.h,v 1.7 2013/03/26 11:30:20 isaki Exp $ */
+/*	$NetBSD: fpu_arith.h,v 1.8 2013/04/01 13:59:21 isaki Exp $ */
 
 /*
  * Copyright (c) 1992, 1993
@@ -57,7 +57,7 @@
 #ifndef FPE_USE_ASM
 
 /* set up for extended-precision arithemtic */
-#define	FPU_DECL_CARRY quad_t fpu_carry, fpu_tmp;
+#define	FPU_DECL_CARRY uint64_t fpu_carry, fpu_tmp;
 
 /*
  * We have three kinds of add:
@@ -79,13 +79,13 @@
 	(r) = (x) + (y) + (!!fpu_carry)
 #define	FPU_ADDS(r, x, y) \
 	{ \
-		fpu_tmp = (quad_t)(x) + (quad_t)(y); \
+		fpu_tmp = (uint64_t)(x) + (uint64_t)(y); \
 		(r) = (uint32_t)fpu_tmp; \
 		fpu_carry = ((fpu_tmp & 0xLL) != 0); \
 	}
 #define	FPU_ADDCS(r, x, y) \
 	{ \
-		fpu_tmp = (quad_t)(x) + (quad_t)(y) + (!!fpu_carry); \
+		fpu_tmp = (uint64_t)(x) + (uint64_t)(y) + (!!fpu_carry); \
 		(r) = (uint32_t)fpu_tmp; \
 		fpu_carry = ((fpu_tmp & 0xLL) != 0); \
 	}
@@ -93,13 +93,13 @@
 	(r) = (x) - (y) - (!!fpu_carry)
 #define	FPU_SUBS(r, x, y) \
 	{ \
-		fpu_tmp = (quad_t)(x) - (quad_t)(y); \
+		fpu_tmp = (uint64_t)(x) - (uint64_t)(y); \
 		(r) = (uint32_t)fpu_tmp; \
 		fpu_carry = ((fpu_tmp & 0xLL) != 0); \
 	}
 #define	FPU_SUBCS(r, x, y) \
 	{ \
-		fpu_tmp = (quad_t)(x) - (quad_t)(y) - (!!fpu_carry); \
+		fpu_tmp = (uint64_t)(x) - (uint64_t)(y) - (!!fpu_carry); \
 		(r) = (uint32_t)fpu_tmp; \
 		fpu_carry = ((fpu_tmp & 0xLL) != 0); \
 	}



CVS commit: src/sys/arch/m68k/fpe

2013-04-11 Thread Tetsuya Isaki
Module Name:src
Committed By:   isaki
Date:   Thu Apr 11 13:27:11 UTC 2013

Modified Files:
src/sys/arch/m68k/fpe: fpu_emulate.h fpu_hyperb.c fpu_log.c fpu_trig.c

Log Message:
Introduce FPU_CONST_* constants to avoid a magic number.


To generate a diff of this commit:
cvs rdiff -u -r1.22 -r1.23 src/sys/arch/m68k/fpe/fpu_emulate.h
cvs rdiff -u -r1.7 -r1.8 src/sys/arch/m68k/fpe/fpu_hyperb.c
cvs rdiff -u -r1.15 -r1.16 src/sys/arch/m68k/fpe/fpu_log.c
cvs rdiff -u -r1.8 -r1.9 src/sys/arch/m68k/fpe/fpu_trig.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_emulate.h
diff -u src/sys/arch/m68k/fpe/fpu_emulate.h:1.22 src/sys/arch/m68k/fpe/fpu_emulate.h:1.23
--- src/sys/arch/m68k/fpe/fpu_emulate.h:1.22	Tue Mar 26 11:30:20 2013
+++ src/sys/arch/m68k/fpe/fpu_emulate.h	Thu Apr 11 13:27:11 2013
@@ -1,4 +1,4 @@
-/*	$NetBSD: fpu_emulate.h,v 1.22 2013/03/26 11:30:20 isaki Exp $	*/
+/*	$NetBSD: fpu_emulate.h,v 1.23 2013/04/11 13:27:11 isaki Exp $	*/
 
 /*
  * Copyright (c) 1995 Gordon Ross
@@ -253,6 +253,11 @@ struct fpn *fpu_sincos_taylor(struct fpe
  */
 /* return values from constant rom */
 struct fpn *fpu_const(struct fpn *, uint32_t);
+#define FPU_CONST_PI	(0x00)	/* pi */
+#define FPU_CONST_LN_2	(0x30)	/* ln(2) */
+#define FPU_CONST_LN_10	(0x31)	/* ln(10) */
+#define FPU_CONST_1 	(0x32)	/* 1.0 */
+
 /* update exceptions and FPSR */
 int fpu_upd_excp(struct fpemu *);
 uint32_t fpu_upd_fpsr(struct fpemu *, struct fpn *);

Index: src/sys/arch/m68k/fpe/fpu_hyperb.c
diff -u src/sys/arch/m68k/fpe/fpu_hyperb.c:1.7 src/sys/arch/m68k/fpe/fpu_hyperb.c:1.8
--- src/sys/arch/m68k/fpe/fpu_hyperb.c:1.7	Sat Mar 23 12:06:24 2013
+++ src/sys/arch/m68k/fpe/fpu_hyperb.c	Thu Apr 11 13:27:11 2013
@@ -1,4 +1,4 @@
-/*	$NetBSD: fpu_hyperb.c,v 1.7 2013/03/23 12:06:24 isaki Exp $	*/
+/*	$NetBSD: fpu_hyperb.c,v 1.8 2013/04/11 13:27:11 isaki Exp $	*/
 
 /*
  * Copyright (c) 1995  Ken Nakata
@@ -57,7 +57,7 @@
  */
 
 #include 
-__KERNEL_RCSID(0, "$NetBSD: fpu_hyperb.c,v 1.7 2013/03/23 12:06:24 isaki Exp $");
+__KERNEL_RCSID(0, "$NetBSD: fpu_hyperb.c,v 1.8 2013/04/11 13:27:11 isaki Exp $");
 
 #include "fpu_emulate.h"
 
@@ -89,7 +89,7 @@ fpu_cosh(struct fpemu *fe)
 		return &fe->fe_f2;
 	}
 
-	fpu_const(&s0, 0x32);	/* 1.0 */
+	fpu_const(&s0, FPU_CONST_1);
 	r = fpu_sincos_taylor(fe, &s0, 1, hyperb);
 	CPYFPN(&fe->fe_f2, r);
 
@@ -128,7 +128,7 @@ fpu_tanh(struct fpemu *fe)
 
 	if (ISINF(&fe->fe_f2)) {
 		sign = fe->fe_f2.fp_sign;
-		fpu_const(&fe->fe_f2, 0x32);
+		fpu_const(&fe->fe_f2, FPU_CONST_1);
 		fe->fe_f2.fp_sign = sign;
 		return &fe->fe_f2;
 	}

Index: src/sys/arch/m68k/fpe/fpu_log.c
diff -u src/sys/arch/m68k/fpe/fpu_log.c:1.15 src/sys/arch/m68k/fpe/fpu_log.c:1.16
--- src/sys/arch/m68k/fpe/fpu_log.c:1.15	Tue Mar 26 11:30:21 2013
+++ src/sys/arch/m68k/fpe/fpu_log.c	Thu Apr 11 13:27:11 2013
@@ -1,4 +1,4 @@
-/*	$NetBSD: fpu_log.c,v 1.15 2013/03/26 11:30:21 isaki Exp $	*/
+/*	$NetBSD: fpu_log.c,v 1.16 2013/04/11 13:27:11 isaki Exp $	*/
 
 /*
  * Copyright (c) 1995  Ken Nakata
@@ -32,7 +32,7 @@
  */
 
 #include 
-__KERNEL_RCSID(0, "$NetBSD: fpu_log.c,v 1.15 2013/03/26 11:30:21 isaki Exp $");
+__KERNEL_RCSID(0, "$NetBSD: fpu_log.c,v 1.16 2013/04/11 13:27:11 isaki Exp $");
 
 #include 
 #include 
@@ -210,13 +210,13 @@ __fpu_logn(struct fpemu *fe)
 		printf("__fpu_logn: log near 1\n");
 #endif
 
-		fpu_const(&fe->fe_f1, 0x32);
+		fpu_const(&fe->fe_f1, FPU_CONST_1);
 		/* X+1 */
 		d = fpu_add(fe);
 		CPYFPN(&V, d);
 
 		CPYFPN(&fe->fe_f1, &X);
-		fpu_const(&fe->fe_f2, 0x32); /* 1.0 */
+		fpu_const(&fe->fe_f2, FPU_CONST_1);
 		fe->fe_f2.fp_sign = 1; /* -1.0 */
 		/* X-1 */
 		d = fpu_add(fe);
@@ -352,7 +352,7 @@ __fpu_logn(struct fpemu *fe)
 		/* KLOG2 = K * ln(2) */
 		/* fe_f1 == (fpn)k */
 		fpu_explode(fe, &fe->fe_f1, FTYPE_LNG, &k);
-		(void)fpu_const(&fe->fe_f2, 0x30 /* ln(2) */);
+		(void)fpu_const(&fe->fe_f2, FPU_CONST_LN_2);
 #if FPE_DEBUG
 		printf("__fpu_logn: fp(k)=(%d,%08x,%08x...)\n",
 		fe->fe_f1.fp_exp,
@@ -491,7 +491,7 @@ fpu_log10(struct fpemu *fe)
 			fp = __fpu_logn(fe);
 			if (fp != &fe->fe_f1)
 CPYFPN(&fe->fe_f1, fp);
-			(void)fpu_const(&fe->fe_f2, 0x31 /* ln(10) */);
+			(void)fpu_const(&fe->fe_f2, FPU_CONST_LN_10);
 			fp = fpu_div(fe);
 		} /* else if fp == +Inf, return +Inf */
 	} else if (fp->fp_class == FPC_ZERO) {
@@ -535,7 +535,7 @@ fpu_log2(struct fpemu *fe)
 fp = __fpu_logn(fe);
 if (fp != &fe->fe_f1)
 	CPYFPN(&fe->fe_f1, fp);
-(void)fpu_const(&fe->fe_f2, 0x30 /* ln(2) */);
+(void)fpu_const(&fe->fe_f2, FPU_CONST_LN_2);
 fp = fpu_div(fe);
 			}
 		} /* else if fp == +Inf, return +Inf */
@@ -594,7 +594,7 @@ fpu_lognp1(struct fpemu *fe)
 	struct fpn *fp;
 
 	/* build a 1.0 */
-	fp = fpu_const(&fe->fe_f1, 0x32); /* get 1.0 */
+	fp = fpu_const(&fe->fe_f1, FPU_CONST_1);
 	/* fp = 1.0 + f2 */
 	fp = fpu_add(fe);
 

Index: src/sys/arch/m68k/fpe/fpu_trig.c
di

CVS commit: src/sys/arch/m68k/fpe

2013-04-18 Thread Tetsuya Isaki
Module Name:src
Committed By:   isaki
Date:   Thu Apr 18 13:40:25 UTC 2013

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

Log Message:
Improve how to use cmp/sub.


To generate a diff of this commit:
cvs rdiff -u -r1.9 -r1.10 src/sys/arch/m68k/fpe/fpu_trig.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_trig.c
diff -u src/sys/arch/m68k/fpe/fpu_trig.c:1.9 src/sys/arch/m68k/fpe/fpu_trig.c:1.10
--- src/sys/arch/m68k/fpe/fpu_trig.c:1.9	Thu Apr 11 13:27:11 2013
+++ src/sys/arch/m68k/fpe/fpu_trig.c	Thu Apr 18 13:40:25 2013
@@ -1,4 +1,4 @@
-/*	$NetBSD: fpu_trig.c,v 1.9 2013/04/11 13:27:11 isaki Exp $	*/
+/*	$NetBSD: fpu_trig.c,v 1.10 2013/04/18 13:40:25 isaki Exp $	*/
 
 /*
  * Copyright (c) 1995  Ken Nakata
@@ -57,7 +57,7 @@
  */
 
 #include 
-__KERNEL_RCSID(0, "$NetBSD: fpu_trig.c,v 1.9 2013/04/11 13:27:11 isaki Exp $");
+__KERNEL_RCSID(0, "$NetBSD: fpu_trig.c,v 1.10 2013/04/18 13:40:25 isaki Exp $");
 
 #include "fpu_emulate.h"
 
@@ -277,14 +277,10 @@ fpu_cos(struct fpemu *fe)
 	 */
 	CPYFPN(&fe->fe_f1, &x);
 	CPYFPN(&fe->fe_f2, &p);
-	r = fpu_cmp(fe);
+	fe->fe_f2.fp_sign = 1;
+	r = fpu_add(fe);
 	if (r->fp_sign == 0) {
-		CPYFPN(&fe->fe_f1, &x);
-		CPYFPN(&fe->fe_f2, &p);
-		fe->fe_f2.fp_sign = 1;
-		r = fpu_add(fe);
 		CPYFPN(&x, r);
-
 		sign ^= 1;
 	}
 
@@ -299,13 +295,9 @@ fpu_cos(struct fpemu *fe)
 	 */
 	CPYFPN(&fe->fe_f1, &x);
 	CPYFPN(&fe->fe_f2, &p);
-	r = fpu_cmp(fe);
+	fe->fe_f2.fp_sign = 1;
+	r = fpu_add(fe);
 	if (r->fp_sign == 0) {
-		CPYFPN(&fe->fe_f1, &x);
-		CPYFPN(&fe->fe_f2, &p);
-		fe->fe_f2.fp_sign = 1;
-		r = fpu_add(fe);
-
 		CPYFPN(&fe->fe_f2, r);
 		r = fpu_sin_halfpi(fe);
 		sign ^= 1;
@@ -389,14 +381,10 @@ fpu_sin(struct fpemu *fe)
 	 */
 	CPYFPN(&fe->fe_f1, &x);
 	CPYFPN(&fe->fe_f2, &p);
-	r = fpu_cmp(fe);
+	fe->fe_f2.fp_sign = 1;
+	r = fpu_add(fe);
 	if (r->fp_sign == 0) {
-		CPYFPN(&fe->fe_f1, &x);
-		CPYFPN(&fe->fe_f2, &p);
-		fe->fe_f2.fp_sign = 1;
-		r = fpu_add(fe);
 		CPYFPN(&x, r);
-
 		sign ^= 1;
 	}
 
@@ -411,13 +399,9 @@ fpu_sin(struct fpemu *fe)
 	 */
 	CPYFPN(&fe->fe_f1, &x);
 	CPYFPN(&fe->fe_f2, &p);
-	r = fpu_cmp(fe);
+	fe->fe_f2.fp_sign = 1;
+	r = fpu_add(fe);
 	if (r->fp_sign == 0) {
-		CPYFPN(&fe->fe_f1, &x);
-		CPYFPN(&fe->fe_f2, &p);
-		fe->fe_f2.fp_sign = 1;
-		r = fpu_add(fe);
-
 		CPYFPN(&fe->fe_f2, r);
 		r = fpu_cos_halfpi(fe);
 	} else {



CVS commit: src/sys/arch/m68k/fpe

2013-04-19 Thread Tetsuya Isaki
Module Name:src
Committed By:   isaki
Date:   Fri Apr 19 13:31:11 UTC 2013

Modified Files:
src/sys/arch/m68k/fpe: files.fpe fpu_emulate.h fpu_hyperb.c fpu_trig.c
Added Files:
src/sys/arch/m68k/fpe: fpu_cordic.c

Log Message:
Introduce the CORDIC algorithm.
o sine and cosine (e.g., FSIN, FCOS and FSINCOS instructions) is now
  calculated in the CORDIC instead of Taylor expansion.
o tangent (FTAN) is not touched from a viewpoint of the code size.
o The CORDIC is applicable for hyperbolic functions (e.g., FSINH,
  FCOSH, FTANH instructions), but I didn't use it because its working
  range is poor.
o The CORDIC is also usable for inverse trigonometric functions,
  I will commit it at next phase.
o The code size becomes a bit big.  I cannot evaluate speed on m68k
  for some reasons, but in test on i386 the CORDIC is approximately
  100 times faster in sin/cos.


To generate a diff of this commit:
cvs rdiff -u -r1.2 -r1.3 src/sys/arch/m68k/fpe/files.fpe
cvs rdiff -u -r0 -r1.1 src/sys/arch/m68k/fpe/fpu_cordic.c
cvs rdiff -u -r1.23 -r1.24 src/sys/arch/m68k/fpe/fpu_emulate.h
cvs rdiff -u -r1.8 -r1.9 src/sys/arch/m68k/fpe/fpu_hyperb.c
cvs rdiff -u -r1.10 -r1.11 src/sys/arch/m68k/fpe/fpu_trig.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/files.fpe
diff -u src/sys/arch/m68k/fpe/files.fpe:1.2 src/sys/arch/m68k/fpe/files.fpe:1.3
--- src/sys/arch/m68k/fpe/files.fpe:1.2	Fri Nov  3 04:51:51 1995
+++ src/sys/arch/m68k/fpe/files.fpe	Fri Apr 19 13:31:11 2013
@@ -1,10 +1,11 @@
-# $NetBSD: files.fpe,v 1.2 1995/11/03 04:51:51 briggs Exp $
+# $NetBSD: files.fpe,v 1.3 2013/04/19 13:31:11 isaki Exp $
 
 # Config(.new) file for m68k floating point emulator.
 # Included by ports that need it.
 
 file	arch/m68k/fpe/fpu_add.c			fpu_emulate
 file	arch/m68k/fpe/fpu_calcea.c		fpu_emulate
+file	arch/m68k/fpe/fpu_cordic.c		fpu_emulate
 file	arch/m68k/fpe/fpu_div.c			fpu_emulate
 file	arch/m68k/fpe/fpu_emulate.c		fpu_emulate
 file	arch/m68k/fpe/fpu_exp.c			fpu_emulate

Index: src/sys/arch/m68k/fpe/fpu_emulate.h
diff -u src/sys/arch/m68k/fpe/fpu_emulate.h:1.23 src/sys/arch/m68k/fpe/fpu_emulate.h:1.24
--- src/sys/arch/m68k/fpe/fpu_emulate.h:1.23	Thu Apr 11 13:27:11 2013
+++ src/sys/arch/m68k/fpe/fpu_emulate.h	Fri Apr 19 13:31:11 2013
@@ -1,4 +1,4 @@
-/*	$NetBSD: fpu_emulate.h,v 1.23 2013/04/11 13:27:11 isaki Exp $	*/
+/*	$NetBSD: fpu_emulate.h,v 1.24 2013/04/19 13:31:11 isaki Exp $	*/
 
 /*
  * Copyright (c) 1995 Gordon Ross
@@ -246,7 +246,13 @@ int fpu_emul_fscale(struct fpemu *, stru
 int fpu_emulate(struct frame *, struct fpframe *, ksiginfo_t *);
 struct fpn *fpu_cmp(struct fpemu *);
 
-struct fpn *fpu_sincos_taylor(struct fpemu *, struct fpn *, uint32_t, int);
+/* fpu_cordic.c */
+extern const struct fpn fpu_cordic_inv_gain1;
+extern const struct fpn fpu_cordic_inv_gain2;
+void fpu_cordit1(struct fpemu *,
+	struct fpn *, struct fpn *, struct fpn *, const struct fpn *);
+void fpu_cordit2(struct fpemu *,
+	struct fpn *, struct fpn *, struct fpn *, const struct fpn *);
 
 /*
  * "helper" functions
@@ -254,6 +260,7 @@ struct fpn *fpu_sincos_taylor(struct fpe
 /* return values from constant rom */
 struct fpn *fpu_const(struct fpn *, uint32_t);
 #define FPU_CONST_PI	(0x00)	/* pi */
+#define FPU_CONST_0 	(0x0f)	/* 0.0 */
 #define FPU_CONST_LN_2	(0x30)	/* ln(2) */
 #define FPU_CONST_LN_10	(0x31)	/* ln(10) */
 #define FPU_CONST_1 	(0x32)	/* 1.0 */

Index: src/sys/arch/m68k/fpe/fpu_hyperb.c
diff -u src/sys/arch/m68k/fpe/fpu_hyperb.c:1.8 src/sys/arch/m68k/fpe/fpu_hyperb.c:1.9
--- src/sys/arch/m68k/fpe/fpu_hyperb.c:1.8	Thu Apr 11 13:27:11 2013
+++ src/sys/arch/m68k/fpe/fpu_hyperb.c	Fri Apr 19 13:31:11 2013
@@ -1,4 +1,4 @@
-/*	$NetBSD: fpu_hyperb.c,v 1.8 2013/04/11 13:27:11 isaki Exp $	*/
+/*	$NetBSD: fpu_hyperb.c,v 1.9 2013/04/19 13:31:11 isaki Exp $	*/
 
 /*
  * Copyright (c) 1995  Ken Nakata
@@ -57,7 +57,7 @@
  */
 
 #include 
-__KERNEL_RCSID(0, "$NetBSD: fpu_hyperb.c,v 1.8 2013/04/11 13:27:11 isaki Exp $");
+__KERNEL_RCSID(0, "$NetBSD: fpu_hyperb.c,v 1.9 2013/04/19 13:31:11 isaki Exp $");
 
 #include "fpu_emulate.h"
 
@@ -74,12 +74,72 @@ fpu_atanh(struct fpemu *fe)
 	return &fe->fe_f2;
 }
 
+/*
+ * taylor expansion used by sinh(), cosh().
+ */
+static struct fpn *
+__fpu_sinhcosh_taylor(struct fpemu *fe, struct fpn *s0, uint32_t f)
+{
+	struct fpn res;
+	struct fpn x2;
+	struct fpn *s1;
+	struct fpn *r;
+	int sign;
+	uint32_t k;
+
+	/* x2 := x * x */
+	CPYFPN(&fe->fe_f1, &fe->fe_f2);
+	r = fpu_mul(fe);
+	CPYFPN(&x2, r);
+
+	/* res := s0 */
+	CPYFPN(&res, s0);
+
+	sign = 1;	/* sign := (-1)^n */
+
+	for (;;) {
+		/* (f1 :=) s0 * x^2 */
+		CPYFPN(&fe->fe_f1, s0);
+		CPYFPN(&fe->fe_f2, &x2);
+		r = fpu_mul(fe);
+		CPYFPN(&fe->fe_f1, r);
+
+		/*
+		 * for sin(),  s1 := s0 * x^2 / (2n+1)2n
+		 * for cos(),  s1 := s0 * x^2 / 2n(2n-1)
+		 */
+		k = f * (f + 1);
+		fpu_explode(fe, &fe->fe_f2, FTYPE_LNG, &k);
+		s1

CVS commit: src/sys/arch/m68k/fpe

2013-04-19 Thread Tetsuya Isaki
Module Name:src
Committed By:   isaki
Date:   Fri Apr 19 13:57:53 UTC 2013

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

Log Message:
Implement inverse trigonometric functions (i.e., FACOS, FASIN, FATAN
instructions).
o arccos is calculated using arcsin.
o arcsin is calculated using arctan.
o arctan is calculated by the CORDIC.


To generate a diff of this commit:
cvs rdiff -u -r1.11 -r1.12 src/sys/arch/m68k/fpe/fpu_trig.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_trig.c
diff -u src/sys/arch/m68k/fpe/fpu_trig.c:1.11 src/sys/arch/m68k/fpe/fpu_trig.c:1.12
--- src/sys/arch/m68k/fpe/fpu_trig.c:1.11	Fri Apr 19 13:31:11 2013
+++ src/sys/arch/m68k/fpe/fpu_trig.c	Fri Apr 19 13:57:52 2013
@@ -1,4 +1,4 @@
-/*	$NetBSD: fpu_trig.c,v 1.11 2013/04/19 13:31:11 isaki Exp $	*/
+/*	$NetBSD: fpu_trig.c,v 1.12 2013/04/19 13:57:52 isaki Exp $	*/
 
 /*
  * Copyright (c) 1995  Ken Nakata
@@ -57,28 +57,120 @@
  */
 
 #include 
-__KERNEL_RCSID(0, "$NetBSD: fpu_trig.c,v 1.11 2013/04/19 13:31:11 isaki Exp $");
+__KERNEL_RCSID(0, "$NetBSD: fpu_trig.c,v 1.12 2013/04/19 13:57:52 isaki Exp $");
 
 #include "fpu_emulate.h"
 
+/*
+ * arccos(x) = pi/2 - arcsin(x)
+ */
 struct fpn *
 fpu_acos(struct fpemu *fe)
 {
-	/* stub */
-	return &fe->fe_f2;
+	struct fpn *r;
+
+	if (ISNAN(&fe->fe_f2))
+		return &fe->fe_f2;
+	if (ISINF(&fe->fe_f2))
+		return fpu_newnan(fe);
+
+	r = fpu_asin(fe);
+	CPYFPN(&fe->fe_f2, r);
+
+	/* pi/2 - asin(x) */
+	fpu_const(&fe->fe_f1, FPU_CONST_PI);
+	fe->fe_f1.fp_exp--;
+	fe->fe_f2.fp_sign = !fe->fe_f2.fp_sign;
+	r = fpu_add(fe);
+
+	return r;
 }
 
+/*
+ *  x
+ * arcsin(x) = arctan(---)
+ * sqrt(1 - x^2) 
+ */
 struct fpn *
 fpu_asin(struct fpemu *fe)
 {
-	/* stub */
-	return &fe->fe_f2;
+	struct fpn x;
+	struct fpn *r;
+
+	if (ISNAN(&fe->fe_f2))
+		return &fe->fe_f2;
+	if (ISZERO(&fe->fe_f2))
+		return &fe->fe_f2;
+
+	if (ISINF(&fe->fe_f2))
+		return fpu_newnan(fe);
+
+	CPYFPN(&x, &fe->fe_f2);
+
+	/* x^2 */
+	CPYFPN(&fe->fe_f1, &fe->fe_f2);
+	r = fpu_mul(fe);
+
+	/* 1 - x^2 */
+	CPYFPN(&fe->fe_f2, r);
+	fe->fe_f2.fp_sign = 1;
+	fpu_const(&fe->fe_f1, FPU_CONST_1);
+	r = fpu_add(fe);
+
+	/* sqrt(1-x^2) */
+	CPYFPN(&fe->fe_f2, r);
+	r = fpu_sqrt(fe);
+
+	/* x/sqrt */
+	CPYFPN(&fe->fe_f2, r);
+	CPYFPN(&fe->fe_f1, &x);
+	r = fpu_div(fe);
+
+	/* arctan */
+	CPYFPN(&fe->fe_f2, r);
+	return fpu_atan(fe);
 }
 
+/*
+ * arctan(x):
+ *
+ *	if (x < 0) {
+ *		x = abs(x);
+ *		sign = 1;
+ *	}
+ *	y = arctan(x);
+ *	if (sign) {
+ *		y = -y;
+ *	}
+ */
 struct fpn *
 fpu_atan(struct fpemu *fe)
 {
-	/* stub */
+	struct fpn a;
+	struct fpn x;
+	struct fpn v;
+
+	if (ISNAN(&fe->fe_f2))
+		return &fe->fe_f2;
+	if (ISZERO(&fe->fe_f2))
+		return &fe->fe_f2;
+
+	CPYFPN(&a, &fe->fe_f2);
+
+	if (ISINF(&fe->fe_f2)) {
+		/* f2 <- pi/2 */
+		fpu_const(&fe->fe_f2, FPU_CONST_PI);
+		fe->fe_f2.fp_exp--;
+
+		fe->fe_f2.fp_sign = a.fp_sign;
+		return &fe->fe_f2;
+	}
+
+	fpu_const(&x, FPU_CONST_1);
+	fpu_const(&fe->fe_f2, FPU_CONST_0);
+	CPYFPN(&v, &fe->fe_f2);
+	fpu_cordit1(fe, &x, &a, &fe->fe_f2, &v);
+
 	return &fe->fe_f2;
 }
 



CVS commit: src/sys/arch/m68k/fpe

2013-04-19 Thread Tetsuya Isaki
Module Name:src
Committed By:   isaki
Date:   Fri Apr 19 14:05:12 UTC 2013

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

Log Message:
Implement a hyperbolic arctangent (FATANH).


To generate a diff of this commit:
cvs rdiff -u -r1.9 -r1.10 src/sys/arch/m68k/fpe/fpu_hyperb.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_hyperb.c
diff -u src/sys/arch/m68k/fpe/fpu_hyperb.c:1.9 src/sys/arch/m68k/fpe/fpu_hyperb.c:1.10
--- src/sys/arch/m68k/fpe/fpu_hyperb.c:1.9	Fri Apr 19 13:31:11 2013
+++ src/sys/arch/m68k/fpe/fpu_hyperb.c	Fri Apr 19 14:05:12 2013
@@ -1,4 +1,4 @@
-/*	$NetBSD: fpu_hyperb.c,v 1.9 2013/04/19 13:31:11 isaki Exp $	*/
+/*	$NetBSD: fpu_hyperb.c,v 1.10 2013/04/19 14:05:12 isaki Exp $	*/
 
 /*
  * Copyright (c) 1995  Ken Nakata
@@ -57,7 +57,7 @@
  */
 
 #include 
-__KERNEL_RCSID(0, "$NetBSD: fpu_hyperb.c,v 1.9 2013/04/19 13:31:11 isaki Exp $");
+__KERNEL_RCSID(0, "$NetBSD: fpu_hyperb.c,v 1.10 2013/04/19 14:05:12 isaki Exp $");
 
 #include "fpu_emulate.h"
 
@@ -67,11 +67,73 @@ __KERNEL_RCSID(0, "$NetBSD: fpu_hyperb.c
  *	fpu_atanh(), fpu_cosh(), fpu_sinh(), and fpu_tanh()
  */
 
+/*
+ * 1   1 + x
+ * atanh(x) = ---*log(---)
+ * 2   1 - x
+ */
 struct fpn *
 fpu_atanh(struct fpemu *fe)
 {
-	/* stub */
-	return &fe->fe_f2;
+	struct fpn x;
+	struct fpn t;
+	struct fpn *r;
+
+	if (ISNAN(&fe->fe_f2))
+		return &fe->fe_f2;
+	if (ISINF(&fe->fe_f2))
+		return fpu_newnan(fe);
+
+	/*
+	 * if x is +0/-0, 68000PRM.pdf says it returns +0/-0 but
+	 * my real 68882 returns +0 for both.
+	 */
+	if (ISZERO(&fe->fe_f2)) {
+		fe->fe_f2.fp_sign = 0;
+		return &fe->fe_f2;
+	}
+
+	/*
+	 * -INF if x == -1
+	 * +INF if x ==  1
+	 */
+	r = &fe->fe_f2;
+	if (r->fp_exp == 0 && r->fp_mant[0] == FP_1 &&
+	r->fp_mant[1] == 0 && r->fp_mant[2] == 0) {
+		r->fp_class = FPC_INF;
+		return r;
+	}
+
+	/* NAN if |x| > 1 */
+	if (fe->fe_f2.fp_exp >= 0)
+		return fpu_newnan(fe);
+
+	CPYFPN(&x, &fe->fe_f2);
+
+	/* t := 1 - x */
+	fpu_const(&fe->fe_f1, FPU_CONST_1);
+	fe->fe_f2.fp_sign = !fe->fe_f2.fp_sign;
+	r = fpu_add(fe);
+	CPYFPN(&t, r);
+
+	/* r := 1 + x */
+	fpu_const(&fe->fe_f1, FPU_CONST_1);
+	CPYFPN(&fe->fe_f2, &x);
+	r = fpu_add(fe);
+
+	/* (1-x)/(1+x) */
+	CPYFPN(&fe->fe_f1, r);
+	CPYFPN(&fe->fe_f2, &t);
+	r = fpu_div(fe);
+
+	/* log((1-x)/(1+x)) */
+	CPYFPN(&fe->fe_f2, r);
+	r = fpu_logn(fe);
+
+	/* r /= 2 */
+	r->fp_exp--;
+
+	return r;
 }
 
 /*



CVS commit: src/sys/arch/m68k/fpe

2013-04-19 Thread Tetsuya Isaki
Module Name:src
Committed By:   isaki
Date:   Sat Apr 20 01:48:20 UTC 2013

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

Log Message:
s/tayler/taylor/. pointed out by christos@


To generate a diff of this commit:
cvs rdiff -u -r1.1 -r1.2 src/sys/arch/m68k/fpe/fpu_cordic.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_cordic.c
diff -u src/sys/arch/m68k/fpe/fpu_cordic.c:1.1 src/sys/arch/m68k/fpe/fpu_cordic.c:1.2
--- src/sys/arch/m68k/fpe/fpu_cordic.c:1.1	Fri Apr 19 13:31:11 2013
+++ src/sys/arch/m68k/fpe/fpu_cordic.c	Sat Apr 20 01:48:20 2013
@@ -1,4 +1,4 @@
-/*	$NetBSD: fpu_cordic.c,v 1.1 2013/04/19 13:31:11 isaki Exp $	*/
+/*	$NetBSD: fpu_cordic.c,v 1.2 2013/04/20 01:48:20 isaki Exp $	*/
 
 /*
  * Copyright (c) 2013 Tetsuya Isaki. All rights reserved.
@@ -26,7 +26,7 @@
  */
 
 #include 
-__KERNEL_RCSID(0, "$NetBSD: fpu_cordic.c,v 1.1 2013/04/19 13:31:11 isaki Exp $");
+__KERNEL_RCSID(0, "$NetBSD: fpu_cordic.c,v 1.2 2013/04/20 01:48:20 isaki Exp $");
 
 #include 
 
@@ -59,7 +59,7 @@ struct sfpn {
 static void prepare_cordic_const(struct fpemu *);
 static struct fpn *fpu_gain1_cordic(struct fpemu *);
 static struct fpn *fpu_gain2_cordic(struct fpemu *);
-static struct fpn *fpu_atan_tayler(struct fpemu *);
+static struct fpn *fpu_atan_taylor(struct fpemu *);
 static void printf_fpn(const struct fpn *);
 static void printf_sfpn(const struct sfpn *);
 static void fpn_to_sfpn(struct sfpn *, const struct fpn *);
@@ -107,7 +107,7 @@ main(int argc, char *argv[])
 
 /*
  * This routine uses fpu_const(), fpu_add(), fpu_div(), fpu_logn()
- * and fpu_atan_tayler() as bootstrap.
+ * and fpu_atan_taylor() as bootstrap.
  */
 static void
 prepare_cordic_const(struct fpemu *fe)
@@ -122,7 +122,7 @@ prepare_cordic_const(struct fpemu *fe)
 	for (i = 0; i < EXT_FRACBITS; i++) {
 		/* atan(t) */
 		CPYFPN(&fe->fe_f2, &t);
-		r = fpu_atan_tayler(fe);
+		r = fpu_atan_taylor(fe);
 		fpn_to_sfpn(&atan_table[i], r);
 
 		/* t /= 2 */
@@ -216,7 +216,7 @@ fpu_gain2_cordic(struct fpemu *fe)
  *  3 5 7
  */
 static struct fpn *
-fpu_atan_tayler(struct fpemu *fe)
+fpu_atan_taylor(struct fpemu *fe)
 {
 	struct fpn res;
 	struct fpn x2;



CVS commit: src/sys/arch/m68k/fpe

2013-04-19 Thread Tetsuya Isaki
Module Name:src
Committed By:   isaki
Date:   Sat Apr 20 03:06:20 UTC 2013

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

Log Message:
Implement exponential and power functions.
o FETOX   .. exp(x)
o FETOXM1 .. exp(x) - 1
o FTENTOX .. 10^x
o FTWOTOX .. 2^x
At last all mathematics functions of FPE were implemented.
Thanks to Yosuke Sugahara.


To generate a diff of this commit:
cvs rdiff -u -r1.5 -r1.6 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.5 src/sys/arch/m68k/fpe/fpu_exp.c:1.6
--- src/sys/arch/m68k/fpe/fpu_exp.c:1.5	Mon Jul 18 07:44:30 2011
+++ src/sys/arch/m68k/fpe/fpu_exp.c	Sat Apr 20 03:06:19 2013
@@ -1,4 +1,4 @@
-/*	$NetBSD: fpu_exp.c,v 1.5 2011/07/18 07:44:30 isaki Exp $	*/
+/*	$NetBSD: fpu_exp.c,v 1.6 2013/04/20 03:06:19 isaki Exp $	*/
 
 /*
  * Copyright (c) 1995  Ken Nakata
@@ -32,7 +32,7 @@
  */
 
 #include 
-__KERNEL_RCSID(0, "$NetBSD: fpu_exp.c,v 1.5 2011/07/18 07:44:30 isaki Exp $");
+__KERNEL_RCSID(0, "$NetBSD: fpu_exp.c,v 1.6 2013/04/20 03:06:19 isaki Exp $");
 
 #include "fpu_emulate.h"
 
@@ -40,30 +40,146 @@ __KERNEL_RCSID(0, "$NetBSD: fpu_exp.c,v 
  * fpu_exp.c: defines fpu_etox(), fpu_etoxm1(), fpu_tentox(), and fpu_twotox();
  */
 
+/*
+ *  x^2   x^3   x^4
+ * exp(x) = 1 + x + --- + --- + --- + ...
+ *   2!3!4!
+ */
+static struct fpn *
+fpu_etox_taylor(struct fpemu *fe)
+{
+	struct fpn res;
+	struct fpn x;
+	struct fpn s0;
+	struct fpn *s1;
+	struct fpn *r;
+	uint32_t k;
+
+	CPYFPN(&x, &fe->fe_f2);
+	CPYFPN(&s0, &fe->fe_f2);
+
+	/* res := 1 + x */
+	fpu_const(&fe->fe_f1, FPU_CONST_1);
+	r = fpu_add(fe);
+	CPYFPN(&res, r);
+
+	k = 2;
+	for (;; k++) {
+		/* s1 = s0 * x / k */
+		CPYFPN(&fe->fe_f1, &s0);
+		CPYFPN(&fe->fe_f2, &x);
+		r = fpu_mul(fe);
+
+		CPYFPN(&fe->fe_f1, r);
+		fpu_explode(fe, &fe->fe_f2, FTYPE_LNG, &k);
+		s1 = fpu_div(fe);
+
+		/* break if s1 is enough small */
+		if (ISZERO(s1))
+			break;
+		if (res.fp_exp - s1->fp_exp >= FP_NMANT)
+			break;
+
+		/* s0 := s1 for next loop */
+		CPYFPN(&s0, s1);
+
+		/* res += s1 */
+		CPYFPN(&fe->fe_f2, s1);
+		CPYFPN(&fe->fe_f1, &res);
+		r = fpu_add(fe);
+		CPYFPN(&res, r);
+	}
+
+	CPYFPN(&fe->fe_f2, &res);
+	return &fe->fe_f2;
+}
+
+/*
+ * exp(x)
+ */
 struct fpn *
 fpu_etox(struct fpemu *fe)
 {
-	/* stub */
-	return &fe->fe_f2;
+	struct fpn *fp;
+
+	if (ISNAN(&fe->fe_f2))
+		return &fe->fe_f2;
+	if (ISINF(&fe->fe_f2)) {
+		if (fe->fe_f2.fp_sign)
+			fpu_const(&fe->fe_f2, FPU_CONST_0);
+		return &fe->fe_f2;
+	}
+
+	if (fe->fe_f2.fp_sign == 0) {
+		/* exp(x) */
+		fp = fpu_etox_taylor(fe);
+	} else {
+		/* 1/exp(-x) */
+		fe->fe_f2.fp_sign = 0;
+		fp = fpu_etox_taylor(fe);
+
+		CPYFPN(&fe->fe_f2, fp);
+		fpu_const(&fe->fe_f1, FPU_CONST_1);
+		fp = fpu_div(fe);
+	}
+	
+	return fp;
 }
 
+/*
+ * exp(x) - 1
+ */
 struct fpn *
 fpu_etoxm1(struct fpemu *fe)
 {
-	/* stub */
-	return &fe->fe_f2;
+	struct fpn *fp;
+
+	fp = fpu_etox(fe);
+
+	CPYFPN(&fe->fe_f1, fp);
+	/* build a 1.0 */
+	fp = fpu_const(&fe->fe_f2, FPU_CONST_1);
+	fe->fe_f2.fp_sign = !fe->fe_f2.fp_sign;
+	/* fp = f2 - 1.0 */
+	fp = fpu_add(fe);
+
+	return fp;
 }
 
+/*
+ * 10^x = exp(x * ln10)
+ */
 struct fpn *
 fpu_tentox(struct fpemu *fe)
 {
-	/* stub */
-	return &fe->fe_f2;
+	struct fpn *fp;
+
+	/* build a ln10 */
+	fp = fpu_const(&fe->fe_f1, FPU_CONST_LN_10);
+	/* fp = ln10 * f2 */
+	fp = fpu_mul(fe);
+
+	/* copy the result to the src opr */
+	CPYFPN(&fe->fe_f2, fp);
+
+	return fpu_etox(fe);
 }
 
+/*
+ * 2^x = exp(x * ln2)
+ */
 struct fpn *
 fpu_twotox(struct fpemu *fe)
 {
-	/* stub */
-	return &fe->fe_f2;
+	struct fpn *fp;
+
+	/* build a ln2 */
+	fp = fpu_const(&fe->fe_f1, FPU_CONST_LN_2);
+	/* fp = ln2 * f2 */
+	fp = fpu_mul(fe);
+
+	/* copy the result to the src opr */
+	CPYFPN(&fe->fe_f2, fp);
+
+	return fpu_etox(fe);
 }



CVS commit: src/sys/arch/m68k/fpe

2013-04-19 Thread Tetsuya Isaki
Module Name:src
Committed By:   isaki
Date:   Sat Apr 20 03:26:12 UTC 2013

Modified Files:
src/sys/arch/m68k/fpe: README

Log Message:
Update a list of implement/unimplement functions.


To generate a diff of this commit:
cvs rdiff -u -r1.5 -r1.6 src/sys/arch/m68k/fpe/README

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/README
diff -u src/sys/arch/m68k/fpe/README:1.5 src/sys/arch/m68k/fpe/README:1.6
--- src/sys/arch/m68k/fpe/README:1.5	Sat Oct 15 15:24:28 2011
+++ src/sys/arch/m68k/fpe/README	Sat Apr 20 03:26:11 2013
@@ -1,4 +1,4 @@
-* $NetBSD: README,v 1.5 2011/10/15 15:24:28 tsutsui Exp $
+* $NetBSD: README,v 1.6 2013/04/20 03:26:11 isaki Exp $
 * NetBSD/m68k FPE (floating point emulation) README file
 * Created Oct/??/95 by k...@remus.rutgers.edu (Ken Nakata)
 * Last updated Oct/15/2011 by tsutsui
@@ -68,7 +68,8 @@ Type=0: FMOVE (mem->FPr), FINT, FINTRZ, 
 	FGETMAN, FDIV, FADD, FMUL, FSGLDIV(*), FSCALE, FSGLMUL(*), FSUB,
 	FCMP, FTST, FMOVE (FPr->mem), FMOVEM (FPr), FMOVEM (FPcr),
 	FMOVECR, FLOGNP1, FLOGN, FLOG10, FLOG2, FMOD, FREM,
-	FCOSH, FSINH, FTANH, FCOS, FSIN, FTAN, FSINCOS
+	FCOSH, FSINH, FTANH, FCOS, FSIN, FTAN, FSINCOS,
+	FETOX, FETOXM1, FTENTOX, FTWOTOX, FATANH, FACOS, FASIN, FATAN
 
 Type=1: FDBcc, FScc, FTRAPcc,
 
@@ -85,7 +86,7 @@ Type=5: none
 
 * Unimplemented Instructions
 
-Type=0: FETOX, FETOXM1, FTENTOX, FTWOTOX, FATANH, FACOS, FASIN, FATAN
+Type=0: none
 
 Type=1: none
 



CVS commit: src/sys/arch/m68k/fpe

2013-04-19 Thread Tetsuya Isaki
Module Name:src
Committed By:   isaki
Date:   Sat Apr 20 04:38:51 UTC 2013

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

Log Message:
Break a loop off to avoid a long loop even if the precision is not enough.


To generate a diff of this commit:
cvs rdiff -u -r1.6 -r1.7 src/sys/arch/m68k/fpe/fpu_exp.c
cvs rdiff -u -r1.10 -r1.11 src/sys/arch/m68k/fpe/fpu_hyperb.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.6 src/sys/arch/m68k/fpe/fpu_exp.c:1.7
--- src/sys/arch/m68k/fpe/fpu_exp.c:1.6	Sat Apr 20 03:06:19 2013
+++ src/sys/arch/m68k/fpe/fpu_exp.c	Sat Apr 20 04:38:51 2013
@@ -1,4 +1,4 @@
-/*	$NetBSD: fpu_exp.c,v 1.6 2013/04/20 03:06:19 isaki Exp $	*/
+/*	$NetBSD: fpu_exp.c,v 1.7 2013/04/20 04:38:51 isaki Exp $	*/
 
 /*
  * Copyright (c) 1995  Ken Nakata
@@ -32,10 +32,13 @@
  */
 
 #include 
-__KERNEL_RCSID(0, "$NetBSD: fpu_exp.c,v 1.6 2013/04/20 03:06:19 isaki Exp $");
+__KERNEL_RCSID(0, "$NetBSD: fpu_exp.c,v 1.7 2013/04/20 04:38:51 isaki Exp $");
 
 #include "fpu_emulate.h"
 
+/* The number of items to terminate the Taylor expansion */
+#define MAX_ITEMS	(2000)
+
 /*
  * fpu_exp.c: defines fpu_etox(), fpu_etoxm1(), fpu_tentox(), and fpu_twotox();
  */
@@ -64,7 +67,7 @@ fpu_etox_taylor(struct fpemu *fe)
 	CPYFPN(&res, r);
 
 	k = 2;
-	for (;; k++) {
+	for (; k < MAX_ITEMS; k++) {
 		/* s1 = s0 * x / k */
 		CPYFPN(&fe->fe_f1, &s0);
 		CPYFPN(&fe->fe_f2, &x);

Index: src/sys/arch/m68k/fpe/fpu_hyperb.c
diff -u src/sys/arch/m68k/fpe/fpu_hyperb.c:1.10 src/sys/arch/m68k/fpe/fpu_hyperb.c:1.11
--- src/sys/arch/m68k/fpe/fpu_hyperb.c:1.10	Fri Apr 19 14:05:12 2013
+++ src/sys/arch/m68k/fpe/fpu_hyperb.c	Sat Apr 20 04:38:51 2013
@@ -1,4 +1,4 @@
-/*	$NetBSD: fpu_hyperb.c,v 1.10 2013/04/19 14:05:12 isaki Exp $	*/
+/*	$NetBSD: fpu_hyperb.c,v 1.11 2013/04/20 04:38:51 isaki Exp $	*/
 
 /*
  * Copyright (c) 1995  Ken Nakata
@@ -57,10 +57,13 @@
  */
 
 #include 
-__KERNEL_RCSID(0, "$NetBSD: fpu_hyperb.c,v 1.10 2013/04/19 14:05:12 isaki Exp $");
+__KERNEL_RCSID(0, "$NetBSD: fpu_hyperb.c,v 1.11 2013/04/20 04:38:51 isaki Exp $");
 
 #include "fpu_emulate.h"
 
+/* The number of items to terminate the Taylor expansion */
+#define MAX_ITEMS	(2000)
+
 /*
  * fpu_hyperb.c: defines the following functions
  *
@@ -159,7 +162,7 @@ __fpu_sinhcosh_taylor(struct fpemu *fe, 
 
 	sign = 1;	/* sign := (-1)^n */
 
-	for (;;) {
+	for (; f < (2 * MAX_ITEMS); ) {
 		/* (f1 :=) s0 * x^2 */
 		CPYFPN(&fe->fe_f1, s0);
 		CPYFPN(&fe->fe_f2, &x2);



CVS commit: src/sys/arch/m68k/fpe

2013-04-19 Thread Tetsuya Isaki
Module Name:src
Committed By:   isaki
Date:   Sat Apr 20 04:54:22 UTC 2013

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

Log Message:
Terminate a loop in EXT_FRACBITS(64bits) instead of FP_NMANT(83bits).
I don't know why the mantissa of the accumulator is 83bits, but 64bits
or more are not affected.


To generate a diff of this commit:
cvs rdiff -u -r1.7 -r1.8 src/sys/arch/m68k/fpe/fpu_exp.c
cvs rdiff -u -r1.11 -r1.12 src/sys/arch/m68k/fpe/fpu_hyperb.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.7 src/sys/arch/m68k/fpe/fpu_exp.c:1.8
--- src/sys/arch/m68k/fpe/fpu_exp.c:1.7	Sat Apr 20 04:38:51 2013
+++ src/sys/arch/m68k/fpe/fpu_exp.c	Sat Apr 20 04:54:22 2013
@@ -1,4 +1,4 @@
-/*	$NetBSD: fpu_exp.c,v 1.7 2013/04/20 04:38:51 isaki Exp $	*/
+/*	$NetBSD: fpu_exp.c,v 1.8 2013/04/20 04:54:22 isaki Exp $	*/
 
 /*
  * Copyright (c) 1995  Ken Nakata
@@ -32,7 +32,9 @@
  */
 
 #include 
-__KERNEL_RCSID(0, "$NetBSD: fpu_exp.c,v 1.7 2013/04/20 04:38:51 isaki Exp $");
+__KERNEL_RCSID(0, "$NetBSD: fpu_exp.c,v 1.8 2013/04/20 04:54:22 isaki Exp $");
+
+#include 
 
 #include "fpu_emulate.h"
 
@@ -80,7 +82,7 @@ fpu_etox_taylor(struct fpemu *fe)
 		/* break if s1 is enough small */
 		if (ISZERO(s1))
 			break;
-		if (res.fp_exp - s1->fp_exp >= FP_NMANT)
+		if (res.fp_exp - s1->fp_exp >= EXT_FRACBITS)
 			break;
 
 		/* s0 := s1 for next loop */

Index: src/sys/arch/m68k/fpe/fpu_hyperb.c
diff -u src/sys/arch/m68k/fpe/fpu_hyperb.c:1.11 src/sys/arch/m68k/fpe/fpu_hyperb.c:1.12
--- src/sys/arch/m68k/fpe/fpu_hyperb.c:1.11	Sat Apr 20 04:38:51 2013
+++ src/sys/arch/m68k/fpe/fpu_hyperb.c	Sat Apr 20 04:54:22 2013
@@ -1,4 +1,4 @@
-/*	$NetBSD: fpu_hyperb.c,v 1.11 2013/04/20 04:38:51 isaki Exp $	*/
+/*	$NetBSD: fpu_hyperb.c,v 1.12 2013/04/20 04:54:22 isaki Exp $	*/
 
 /*
  * Copyright (c) 1995  Ken Nakata
@@ -57,7 +57,9 @@
  */
 
 #include 
-__KERNEL_RCSID(0, "$NetBSD: fpu_hyperb.c,v 1.11 2013/04/20 04:38:51 isaki Exp $");
+__KERNEL_RCSID(0, "$NetBSD: fpu_hyperb.c,v 1.12 2013/04/20 04:54:22 isaki Exp $");
+
+#include 
 
 #include "fpu_emulate.h"
 
@@ -180,7 +182,7 @@ __fpu_sinhcosh_taylor(struct fpemu *fe, 
 		/* break if s1 is enough small */
 		if (ISZERO(s1))
 			break;
-		if (res.fp_exp - s1->fp_exp >= FP_NMANT)
+		if (res.fp_exp - s1->fp_exp >= EXT_FRACBITS)
 			break;
 
 		/* s0 := s1 for next loop */



CVS commit: src/sys/arch/m68k/fpe

2013-04-19 Thread Tetsuya Isaki
Module Name:src
Committed By:   isaki
Date:   Sat Apr 20 04:55:44 UTC 2013

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

Log Message:
Fix typo in comment.


To generate a diff of this commit:
cvs rdiff -u -r1.12 -r1.13 src/sys/arch/m68k/fpe/fpu_hyperb.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_hyperb.c
diff -u src/sys/arch/m68k/fpe/fpu_hyperb.c:1.12 src/sys/arch/m68k/fpe/fpu_hyperb.c:1.13
--- src/sys/arch/m68k/fpe/fpu_hyperb.c:1.12	Sat Apr 20 04:54:22 2013
+++ src/sys/arch/m68k/fpe/fpu_hyperb.c	Sat Apr 20 04:55:44 2013
@@ -1,4 +1,4 @@
-/*	$NetBSD: fpu_hyperb.c,v 1.12 2013/04/20 04:54:22 isaki Exp $	*/
+/*	$NetBSD: fpu_hyperb.c,v 1.13 2013/04/20 04:55:44 isaki Exp $	*/
 
 /*
  * Copyright (c) 1995  Ken Nakata
@@ -57,7 +57,7 @@
  */
 
 #include 
-__KERNEL_RCSID(0, "$NetBSD: fpu_hyperb.c,v 1.12 2013/04/20 04:54:22 isaki Exp $");
+__KERNEL_RCSID(0, "$NetBSD: fpu_hyperb.c,v 1.13 2013/04/20 04:55:44 isaki Exp $");
 
 #include 
 
@@ -172,8 +172,8 @@ __fpu_sinhcosh_taylor(struct fpemu *fe, 
 		CPYFPN(&fe->fe_f1, r);
 
 		/*
-		 * for sin(),  s1 := s0 * x^2 / (2n+1)2n
-		 * for cos(),  s1 := s0 * x^2 / 2n(2n-1)
+		 * for sinh(),  s1 := s0 * x^2 / (2n+1)2n
+		 * for cosh(),  s1 := s0 * x^2 / 2n(2n-1)
 		 */
 		k = f * (f + 1);
 		fpu_explode(fe, &fe->fe_f2, FTYPE_LNG, &k);



CVS commit: src/sys/arch/m68k/fpe

2013-04-19 Thread Tetsuya Isaki
Module Name:src
Committed By:   isaki
Date:   Sat Apr 20 05:09:41 UTC 2013

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

Log Message:
Support tan(-0.0).


To generate a diff of this commit:
cvs rdiff -u -r1.12 -r1.13 src/sys/arch/m68k/fpe/fpu_trig.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_trig.c
diff -u src/sys/arch/m68k/fpe/fpu_trig.c:1.12 src/sys/arch/m68k/fpe/fpu_trig.c:1.13
--- src/sys/arch/m68k/fpe/fpu_trig.c:1.12	Fri Apr 19 13:57:52 2013
+++ src/sys/arch/m68k/fpe/fpu_trig.c	Sat Apr 20 05:09:41 2013
@@ -1,4 +1,4 @@
-/*	$NetBSD: fpu_trig.c,v 1.12 2013/04/19 13:57:52 isaki Exp $	*/
+/*	$NetBSD: fpu_trig.c,v 1.13 2013/04/20 05:09:41 isaki Exp $	*/
 
 /*
  * Copyright (c) 1995  Ken Nakata
@@ -57,7 +57,7 @@
  */
 
 #include 
-__KERNEL_RCSID(0, "$NetBSD: fpu_trig.c,v 1.12 2013/04/19 13:57:52 isaki Exp $");
+__KERNEL_RCSID(0, "$NetBSD: fpu_trig.c,v 1.13 2013/04/20 05:09:41 isaki Exp $");
 
 #include "fpu_emulate.h"
 
@@ -409,6 +409,10 @@ fpu_tan(struct fpemu *fe)
 	if (ISINF(&fe->fe_f2))
 		return fpu_newnan(fe);
 
+	/* if x is +0/-0, return +0/-0 */
+	if (ISZERO(&fe->fe_f2))
+		return &fe->fe_f2;
+
 	CPYFPN(&x, &fe->fe_f2);
 
 	/* sin(x) */



CVS commit: src/sys/arch/m68k/fpe

2013-04-19 Thread Tetsuya Isaki
Module Name:src
Committed By:   isaki
Date:   Sat Apr 20 05:27:05 UTC 2013

Modified Files:
src/sys/arch/m68k/fpe: fpu_hyperb.c fpu_log.c fpu_trig.c

Log Message:
Clean up some useless codes.


To generate a diff of this commit:
cvs rdiff -u -r1.13 -r1.14 src/sys/arch/m68k/fpe/fpu_hyperb.c \
src/sys/arch/m68k/fpe/fpu_trig.c
cvs rdiff -u -r1.16 -r1.17 src/sys/arch/m68k/fpe/fpu_log.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_hyperb.c
diff -u src/sys/arch/m68k/fpe/fpu_hyperb.c:1.13 src/sys/arch/m68k/fpe/fpu_hyperb.c:1.14
--- src/sys/arch/m68k/fpe/fpu_hyperb.c:1.13	Sat Apr 20 04:55:44 2013
+++ src/sys/arch/m68k/fpe/fpu_hyperb.c	Sat Apr 20 05:27:05 2013
@@ -1,4 +1,4 @@
-/*	$NetBSD: fpu_hyperb.c,v 1.13 2013/04/20 04:55:44 isaki Exp $	*/
+/*	$NetBSD: fpu_hyperb.c,v 1.14 2013/04/20 05:27:05 isaki Exp $	*/
 
 /*
  * Copyright (c) 1995  Ken Nakata
@@ -57,7 +57,7 @@
  */
 
 #include 
-__KERNEL_RCSID(0, "$NetBSD: fpu_hyperb.c,v 1.13 2013/04/20 04:55:44 isaki Exp $");
+__KERNEL_RCSID(0, "$NetBSD: fpu_hyperb.c,v 1.14 2013/04/20 05:27:05 isaki Exp $");
 
 #include 
 
@@ -218,9 +218,8 @@ fpu_cosh(struct fpemu *fe)
 
 	fpu_const(&s0, FPU_CONST_1);
 	r = __fpu_sinhcosh_taylor(fe, &s0, 1);
-	CPYFPN(&fe->fe_f2, r);
 
-	return &fe->fe_f2;
+	return r;
 }
 
 struct fpn *
@@ -236,9 +235,8 @@ fpu_sinh(struct fpemu *fe)
 
 	CPYFPN(&s0, &fe->fe_f2);
 	r = __fpu_sinhcosh_taylor(fe, &s0, 2);
-	CPYFPN(&fe->fe_f2, r);
 
-	return &fe->fe_f2;
+	return r;
 }
 
 struct fpn *
@@ -274,7 +272,5 @@ fpu_tanh(struct fpemu *fe)
 	CPYFPN(&fe->fe_f1, &s);
 	r = fpu_div(fe);
 
-	CPYFPN(&fe->fe_f2, r);
-
-	return &fe->fe_f2;
+	return r;
 }
Index: src/sys/arch/m68k/fpe/fpu_trig.c
diff -u src/sys/arch/m68k/fpe/fpu_trig.c:1.13 src/sys/arch/m68k/fpe/fpu_trig.c:1.14
--- src/sys/arch/m68k/fpe/fpu_trig.c:1.13	Sat Apr 20 05:09:41 2013
+++ src/sys/arch/m68k/fpe/fpu_trig.c	Sat Apr 20 05:27:05 2013
@@ -1,4 +1,4 @@
-/*	$NetBSD: fpu_trig.c,v 1.13 2013/04/20 05:09:41 isaki Exp $	*/
+/*	$NetBSD: fpu_trig.c,v 1.14 2013/04/20 05:27:05 isaki Exp $	*/
 
 /*
  * Copyright (c) 1995  Ken Nakata
@@ -57,7 +57,7 @@
  */
 
 #include 
-__KERNEL_RCSID(0, "$NetBSD: fpu_trig.c,v 1.13 2013/04/20 05:09:41 isaki Exp $");
+__KERNEL_RCSID(0, "$NetBSD: fpu_trig.c,v 1.14 2013/04/20 05:27:05 isaki Exp $");
 
 #include "fpu_emulate.h"
 
@@ -427,10 +427,7 @@ fpu_tan(struct fpemu *fe)
 
 	CPYFPN(&fe->fe_f1, &s);
 	r = fpu_div(fe);
-
-	CPYFPN(&fe->fe_f2, r);
-
-	return &fe->fe_f2;
+	return r;
 }
 
 struct fpn *

Index: src/sys/arch/m68k/fpe/fpu_log.c
diff -u src/sys/arch/m68k/fpe/fpu_log.c:1.16 src/sys/arch/m68k/fpe/fpu_log.c:1.17
--- src/sys/arch/m68k/fpe/fpu_log.c:1.16	Thu Apr 11 13:27:11 2013
+++ src/sys/arch/m68k/fpe/fpu_log.c	Sat Apr 20 05:27:05 2013
@@ -1,4 +1,4 @@
-/*	$NetBSD: fpu_log.c,v 1.16 2013/04/11 13:27:11 isaki Exp $	*/
+/*	$NetBSD: fpu_log.c,v 1.17 2013/04/20 05:27:05 isaki Exp $	*/
 
 /*
  * Copyright (c) 1995  Ken Nakata
@@ -32,7 +32,7 @@
  */
 
 #include 
-__KERNEL_RCSID(0, "$NetBSD: fpu_log.c,v 1.16 2013/04/11 13:27:11 isaki Exp $");
+__KERNEL_RCSID(0, "$NetBSD: fpu_log.c,v 1.17 2013/04/20 05:27:05 isaki Exp $");
 
 #include 
 #include 
@@ -599,8 +599,7 @@ fpu_lognp1(struct fpemu *fe)
 	fp = fpu_add(fe);
 
 	/* copy the result to the src opr */
-	if (&fe->fe_f2 != fp)
-		CPYFPN(&fe->fe_f2, fp);
+	CPYFPN(&fe->fe_f2, fp);
 
 	return fpu_logn(fe);
 }



CVS commit: src/sys/arch/m68k/fpe

2013-04-20 Thread Tetsuya Isaki
Module Name:src
Committed By:   isaki
Date:   Sat Apr 20 07:32:45 UTC 2013

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

Log Message:
Support sin(-0.0).


To generate a diff of this commit:
cvs rdiff -u -r1.14 -r1.15 src/sys/arch/m68k/fpe/fpu_trig.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_trig.c
diff -u src/sys/arch/m68k/fpe/fpu_trig.c:1.14 src/sys/arch/m68k/fpe/fpu_trig.c:1.15
--- src/sys/arch/m68k/fpe/fpu_trig.c:1.14	Sat Apr 20 05:27:05 2013
+++ src/sys/arch/m68k/fpe/fpu_trig.c	Sat Apr 20 07:32:45 2013
@@ -1,4 +1,4 @@
-/*	$NetBSD: fpu_trig.c,v 1.14 2013/04/20 05:27:05 isaki Exp $	*/
+/*	$NetBSD: fpu_trig.c,v 1.15 2013/04/20 07:32:45 isaki Exp $	*/
 
 /*
  * Copyright (c) 1995  Ken Nakata
@@ -57,7 +57,7 @@
  */
 
 #include 
-__KERNEL_RCSID(0, "$NetBSD: fpu_trig.c,v 1.14 2013/04/20 05:27:05 isaki Exp $");
+__KERNEL_RCSID(0, "$NetBSD: fpu_trig.c,v 1.15 2013/04/20 07:32:45 isaki Exp $");
 
 #include "fpu_emulate.h"
 
@@ -330,6 +330,10 @@ fpu_sin(struct fpemu *fe)
 	if (ISINF(&fe->fe_f2))
 		return fpu_newnan(fe);
 
+	/* if x is +0/-0, return +0/-0 */
+	if (ISZERO(&fe->fe_f2))
+		return &fe->fe_f2;
+
 	CPYFPN(&x, &fe->fe_f2);
 
 	/* x = abs(input) */



CVS commit: src/sys/arch/m68k/fpe

2013-04-20 Thread Tetsuya Isaki
Module Name:src
Committed By:   isaki
Date:   Sat Apr 20 07:33:06 UTC 2013

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

Log Message:
Support sinh(-0.0) and tanh(-0.0).


To generate a diff of this commit:
cvs rdiff -u -r1.14 -r1.15 src/sys/arch/m68k/fpe/fpu_hyperb.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_hyperb.c
diff -u src/sys/arch/m68k/fpe/fpu_hyperb.c:1.14 src/sys/arch/m68k/fpe/fpu_hyperb.c:1.15
--- src/sys/arch/m68k/fpe/fpu_hyperb.c:1.14	Sat Apr 20 05:27:05 2013
+++ src/sys/arch/m68k/fpe/fpu_hyperb.c	Sat Apr 20 07:33:05 2013
@@ -1,4 +1,4 @@
-/*	$NetBSD: fpu_hyperb.c,v 1.14 2013/04/20 05:27:05 isaki Exp $	*/
+/*	$NetBSD: fpu_hyperb.c,v 1.15 2013/04/20 07:33:05 isaki Exp $	*/
 
 /*
  * Copyright (c) 1995  Ken Nakata
@@ -57,7 +57,7 @@
  */
 
 #include 
-__KERNEL_RCSID(0, "$NetBSD: fpu_hyperb.c,v 1.14 2013/04/20 05:27:05 isaki Exp $");
+__KERNEL_RCSID(0, "$NetBSD: fpu_hyperb.c,v 1.15 2013/04/20 07:33:05 isaki Exp $");
 
 #include 
 
@@ -233,6 +233,10 @@ fpu_sinh(struct fpemu *fe)
 	if (ISINF(&fe->fe_f2))
 		return &fe->fe_f2;
 
+	/* if x is +0/-0, return +0/-0 */
+	if (ISZERO(&fe->fe_f2))
+		return &fe->fe_f2;
+
 	CPYFPN(&s0, &fe->fe_f2);
 	r = __fpu_sinhcosh_taylor(fe, &s0, 2);
 
@@ -250,6 +254,10 @@ fpu_tanh(struct fpemu *fe)
 	if (ISNAN(&fe->fe_f2))
 		return &fe->fe_f2;
 
+	/* if x is +0/-0, return +0/-0 */
+	if (ISZERO(&fe->fe_f2))
+		return &fe->fe_f2;
+
 	if (ISINF(&fe->fe_f2)) {
 		sign = fe->fe_f2.fp_sign;
 		fpu_const(&fe->fe_f2, FPU_CONST_1);



CVS commit: src/sys/arch/m68k/fpe

2013-04-20 Thread Tetsuya Isaki
Module Name:src
Committed By:   isaki
Date:   Sat Apr 20 09:32:28 UTC 2013

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

Log Message:
Rewrite around BFFFO inline asm.
o Prepare C version of BFFFO (from XM6i).
  It is helpful in running FPE on other platforms (for example, for a
  test).  It is also helpful in porting to non-m68k 3rd party :)
o A BFFFO is supported on 68020 or later (though I'm not sure whether
  sun2/68010 uses this FPE correctly or not).


To generate a diff of this commit:
cvs rdiff -u -r1.10 -r1.11 src/sys/arch/m68k/fpe/fpu_subr.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_subr.c
diff -u src/sys/arch/m68k/fpe/fpu_subr.c:1.10 src/sys/arch/m68k/fpe/fpu_subr.c:1.11
--- src/sys/arch/m68k/fpe/fpu_subr.c:1.10	Tue Mar 26 11:30:21 2013
+++ src/sys/arch/m68k/fpe/fpu_subr.c	Sat Apr 20 09:32:28 2013
@@ -1,4 +1,4 @@
-/*	$NetBSD: fpu_subr.c,v 1.10 2013/03/26 11:30:21 isaki Exp $ */
+/*	$NetBSD: fpu_subr.c,v 1.11 2013/04/20 09:32:28 isaki Exp $ */
 
 /*
  * Copyright (c) 1992, 1993
@@ -45,7 +45,7 @@
  */
 
 #include 
-__KERNEL_RCSID(0, "$NetBSD: fpu_subr.c,v 1.10 2013/03/26 11:30:21 isaki Exp $");
+__KERNEL_RCSID(0, "$NetBSD: fpu_subr.c,v 1.11 2013/04/20 09:32:28 isaki Exp $");
 
 #include 
 #include 
@@ -56,6 +56,25 @@ __KERNEL_RCSID(0, "$NetBSD: fpu_subr.c,v
 #include "fpu_arith.h"
 
 /*
+ * m68020 or later has a BFFFO instruction, therefore use it.
+ * Otherwise, use C version.
+ */
+static inline int
+bfffo(uint32_t src)
+{
+	int offset;
+#if defined(__m68k__) && !defined(M68010)
+	__asm volatile("bfffo %1{#0:#32},%0" : "=d"(offset) : "g"(src));
+#else
+	int width = 32;
+	for (offset = 0; width-- > 0 && (int)src >= 0; src <<= 1) {
+		offset++;
+	}
+#endif
+	return offset;
+}
+
+/*
  * Shift the given number right rsh bits.  Any bits that `fall off' will get
  * shoved into the sticky field; we return the resulting sticky.  Note that
  * shifting NaNs is legal (this will never shift all bits out); a NaN's
@@ -165,7 +184,7 @@ fpu_norm(struct fpn *fp)
 		 * We have a supernormal number.  We need to shift it right.
 		 * We may assume m2==0.
 		 */
-		__asm volatile("bfffo %1{#0:#32},%0" : "=d"(rsh) : "g"(m0));
+		rsh = bfffo(m0);
 		rsh = 31 - rsh - FP_LG;
 		exp += rsh;
 		lsh = 32 - rsh;
@@ -177,7 +196,7 @@ fpu_norm(struct fpn *fp)
 		 * We have a regular denorm (a subnormal number), and need
 		 * to shift it left.
 		 */
-		__asm volatile("bfffo %1{#0:#32},%0" : "=d"(lsh) : "g"(m0));
+		lsh = bfffo(m0);
 		lsh = FP_LG - 31 + lsh;
 		exp -= lsh;
 		rsh = 32 - lsh;



CVS commit: src/sys/arch/m68k/fpe

2013-04-20 Thread Tetsuya Isaki
Module Name:src
Committed By:   isaki
Date:   Sun Apr 21 02:50:49 UTC 2013

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

Log Message:
M68010 -> __mc68010__, pointed out by tsutsui@


To generate a diff of this commit:
cvs rdiff -u -r1.11 -r1.12 src/sys/arch/m68k/fpe/fpu_subr.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_subr.c
diff -u src/sys/arch/m68k/fpe/fpu_subr.c:1.11 src/sys/arch/m68k/fpe/fpu_subr.c:1.12
--- src/sys/arch/m68k/fpe/fpu_subr.c:1.11	Sat Apr 20 09:32:28 2013
+++ src/sys/arch/m68k/fpe/fpu_subr.c	Sun Apr 21 02:50:48 2013
@@ -1,4 +1,4 @@
-/*	$NetBSD: fpu_subr.c,v 1.11 2013/04/20 09:32:28 isaki Exp $ */
+/*	$NetBSD: fpu_subr.c,v 1.12 2013/04/21 02:50:48 isaki Exp $ */
 
 /*
  * Copyright (c) 1992, 1993
@@ -45,7 +45,7 @@
  */
 
 #include 
-__KERNEL_RCSID(0, "$NetBSD: fpu_subr.c,v 1.11 2013/04/20 09:32:28 isaki Exp $");
+__KERNEL_RCSID(0, "$NetBSD: fpu_subr.c,v 1.12 2013/04/21 02:50:48 isaki Exp $");
 
 #include 
 #include 
@@ -63,7 +63,7 @@ static inline int
 bfffo(uint32_t src)
 {
 	int offset;
-#if defined(__m68k__) && !defined(M68010)
+#if defined(__m68k__) && !defined(__mc68010__)
 	__asm volatile("bfffo %1{#0:#32},%0" : "=d"(offset) : "g"(src));
 #else
 	int width = 32;



CVS commit: src/sys/arch/m68k/fpe

2013-05-05 Thread Tetsuya Isaki
Module Name:src
Committed By:   isaki
Date:   Sun May  5 13:17:15 UTC 2013

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

Log Message:
Rename modrem -> is_mod for a readability.


To generate a diff of this commit:
cvs rdiff -u -r1.13 -r1.14 src/sys/arch/m68k/fpe/fpu_rem.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_rem.c
diff -u src/sys/arch/m68k/fpe/fpu_rem.c:1.13 src/sys/arch/m68k/fpe/fpu_rem.c:1.14
--- src/sys/arch/m68k/fpe/fpu_rem.c:1.13	Tue Mar 26 11:30:21 2013
+++ src/sys/arch/m68k/fpe/fpu_rem.c	Sun May  5 13:17:15 2013
@@ -1,4 +1,4 @@
-/*	$NetBSD: fpu_rem.c,v 1.13 2013/03/26 11:30:21 isaki Exp $	*/
+/*	$NetBSD: fpu_rem.c,v 1.14 2013/05/05 13:17:15 isaki Exp $	*/
 
 /*
  * Copyright (c) 1995  Ken Nakata
@@ -32,7 +32,7 @@
  */
 
 #include 
-__KERNEL_RCSID(0, "$NetBSD: fpu_rem.c,v 1.13 2013/03/26 11:30:21 isaki Exp $");
+__KERNEL_RCSID(0, "$NetBSD: fpu_rem.c,v 1.14 2013/05/05 13:17:15 isaki Exp $");
 
 #include 
 #include 
@@ -85,10 +85,10 @@ __KERNEL_RCSID(0, "$NetBSD: fpu_rem.c,v 
  *R := 0. Return signQ, last 7 bits of Q, and R.
  */
 
-static struct fpn * __fpu_modrem(struct fpemu *fe, int modrem);
+static struct fpn * __fpu_modrem(struct fpemu *fe, int is_mod);
 
 static struct fpn *
-__fpu_modrem(struct fpemu *fe, int modrem)
+__fpu_modrem(struct fpemu *fe, int is_mod)
 {
 	static struct fpn X, Y;
 	struct fpn *x, *y, *r;
@@ -157,7 +157,7 @@ __fpu_modrem(struct fpemu *fe, int modre
 	}
  Step4:
 	Last_Subtract = 0;
-	if (modrem == 0)
+	if (is_mod)
 		goto Step6;
 
 	/*
@@ -226,11 +226,11 @@ __fpu_modrem(struct fpemu *fe, int modre
 struct fpn *
 fpu_rem(struct fpemu *fe)
 {
-	return __fpu_modrem(fe, 1);
+	return __fpu_modrem(fe, 0);
 }
 
 struct fpn *
 fpu_mod(struct fpemu *fe)
 {
-	return __fpu_modrem(fe, 0);
+	return __fpu_modrem(fe, 1);
 }



CVS commit: src/sys/arch/m68k/fpe

2013-05-05 Thread Tetsuya Isaki
Module Name:src
Committed By:   isaki
Date:   Sun May  5 13:25:20 UTC 2013

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

Log Message:
R := X even if L < 0 in Step2, according to algorithm of the comment.
This solves many cases of |X| < |Y|.


To generate a diff of this commit:
cvs rdiff -u -r1.14 -r1.15 src/sys/arch/m68k/fpe/fpu_rem.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_rem.c
diff -u src/sys/arch/m68k/fpe/fpu_rem.c:1.14 src/sys/arch/m68k/fpe/fpu_rem.c:1.15
--- src/sys/arch/m68k/fpe/fpu_rem.c:1.14	Sun May  5 13:17:15 2013
+++ src/sys/arch/m68k/fpe/fpu_rem.c	Sun May  5 13:25:20 2013
@@ -1,4 +1,4 @@
-/*	$NetBSD: fpu_rem.c,v 1.14 2013/05/05 13:17:15 isaki Exp $	*/
+/*	$NetBSD: fpu_rem.c,v 1.15 2013/05/05 13:25:20 isaki Exp $	*/
 
 /*
  * Copyright (c) 1995  Ken Nakata
@@ -32,7 +32,7 @@
  */
 
 #include 
-__KERNEL_RCSID(0, "$NetBSD: fpu_rem.c,v 1.14 2013/05/05 13:17:15 isaki Exp $");
+__KERNEL_RCSID(0, "$NetBSD: fpu_rem.c,v 1.15 2013/05/05 13:25:20 isaki Exp $");
 
 #include 
 #include 
@@ -117,8 +117,8 @@ __fpu_modrem(struct fpemu *fe, int is_mo
 	l = x->fp_exp - y->fp_exp;
 	k = 0;
 	q = 0;
+	CPYFPN(r, x);
 	if (l >= 0) {
-		CPYFPN(r, x);
 		r->fp_exp -= l;
 		j = l;
 



CVS commit: src/sys/arch/m68k/fpe

2013-05-11 Thread Tetsuya Isaki
Module Name:src
Committed By:   isaki
Date:   Sat May 11 12:52:43 UTC 2013

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

Log Message:
Revise the algorithm after Step3.
almost written by Y.Sugahara and minor modify by me.
This works for all input of FMOD/FREM and of course solves PR/47810.


To generate a diff of this commit:
cvs rdiff -u -r1.15 -r1.16 src/sys/arch/m68k/fpe/fpu_rem.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_rem.c
diff -u src/sys/arch/m68k/fpe/fpu_rem.c:1.15 src/sys/arch/m68k/fpe/fpu_rem.c:1.16
--- src/sys/arch/m68k/fpe/fpu_rem.c:1.15	Sun May  5 13:25:20 2013
+++ src/sys/arch/m68k/fpe/fpu_rem.c	Sat May 11 12:52:42 2013
@@ -1,4 +1,4 @@
-/*	$NetBSD: fpu_rem.c,v 1.15 2013/05/05 13:25:20 isaki Exp $	*/
+/*	$NetBSD: fpu_rem.c,v 1.16 2013/05/11 12:52:42 isaki Exp $	*/
 
 /*
  * Copyright (c) 1995  Ken Nakata
@@ -32,7 +32,7 @@
  */
 
 #include 
-__KERNEL_RCSID(0, "$NetBSD: fpu_rem.c,v 1.15 2013/05/05 13:25:20 isaki Exp $");
+__KERNEL_RCSID(0, "$NetBSD: fpu_rem.c,v 1.16 2013/05/11 12:52:42 isaki Exp $");
 
 #include 
 #include 
@@ -56,51 +56,68 @@ __KERNEL_RCSID(0, "$NetBSD: fpu_rem.c,v 
  *endif
  *
  *   Step 3.  Perform MOD(X,Y)
- *3.1 If R = Y, go to Step 9.
+ *3.1 If R = Y, then { Q := Q + 1, R := 0, go to Step 8. }
  *3.2 If R > Y, then { R := R - Y, Q := Q + 1}
  *3.3 If j = 0, go to Step 4.
  *3.4 k := k + 1, j := j - 1, Q := 2Q, R := 2R. Go to
  *Step 3.1.
  *
- *   Step 4.  At this point, R = X - QY = MOD(X,Y). Set
- *Last_Subtract := false (used in Step 7 below). If
- *MOD is requested, go to Step 6. 
- *
- *   Step 5.  R = MOD(X,Y), but REM(X,Y) is requested.
- *5.1 If R < Y/2, then R = MOD(X,Y) = REM(X,Y). Go to
- *Step 6.
- *5.2 If R > Y/2, then { set Last_Subtract := true,
- *Q := Q + 1, Y := signY*Y }. Go to Step 6.
- *5.3 This is the tricky case of R = Y/2. If Q is odd,
- *then { Q := Q + 1, signX := -signX }.
- *
- *   Step 6.  R := signX*R.
- *
- *   Step 7.  If Last_Subtract = true, R := R - Y.
- *
- *   Step 8.  Return signQ, last 7 bits of Q, and R as required.
- *
- *   Step 9.  At this point, R = 2^(-j)*X - Q Y = Y. Thus,
- *X = 2^(j)*(Q+1)Y. set Q := 2^(j)*(Q+1),
- *R := 0. Return signQ, last 7 bits of Q, and R.
+ *   Step 4.  R := signX*R.
+ *
+ *   Step 5.  If MOD is requested, go to Step .
+ *
+ *   Step 6.  Now, R = MOD(X,Y), convert to REM(X,Y) is requested.
+ *Do banker's rounding.
+ *If   abs(R) > Y/2
+ * || (abs(R) == Y/2 && Q % 2 == 1) then
+ * { Q := Q + 1, R := R - signX * Y }.
+ *
+ *   Step 7.  Return signQ, last 7 bits of Q, and R as required.
  */
 
 static struct fpn * __fpu_modrem(struct fpemu *fe, int is_mod);
+static int abscmp3(const struct fpn *a, const struct fpn *b);
+
+/* Absolute FORTRAN Compare */
+static int
+abscmp3(const struct fpn *a, const struct fpn *b)
+{
+	int i;
+
+	if (a->fp_exp < b->fp_exp) {
+		return -1;
+	} else if (a->fp_exp > b->fp_exp) {
+		return 1;
+	} else {
+		for (i = 0; i < 3; i++) {
+			if (a->fp_mant[i] < b->fp_mant[i])
+return -1;
+			else if (a->fp_mant[i] > b->fp_mant[i])
+return 1;
+		}
+	}
+	return 0;
+}
 
 static struct fpn *
 __fpu_modrem(struct fpemu *fe, int is_mod)
 {
 	static struct fpn X, Y;
 	struct fpn *x, *y, *r;
-	struct fpn r_bkup;
 	uint32_t signX, signY, signQ;
 	int j, k, l, q;
-	int Last_Subtract;
+	int cmp;
+
+	if (ISNAN(&fe->fe_f1) || ISNAN(&fe->fe_f2))
+		return fpu_newnan(fe);
+	if (ISINF(&fe->fe_f1) || ISZERO(&fe->fe_f2))
+		return fpu_newnan(fe);
 
 	CPYFPN(&X, &fe->fe_f1);
 	CPYFPN(&Y, &fe->fe_f2);
 	x = &X;
 	y = &Y;
+	q = 0;
 	r = &fe->fe_f2;
 
 	/*
@@ -111,12 +128,17 @@ __fpu_modrem(struct fpemu *fe, int is_mo
 	signQ = (signX ^ signY);
 	x->fp_sign = y->fp_sign = 0;
 
+	/* Special treatment that just return input value but Q is necessary */
+	if (ISZERO(x) || ISINF(y)) {
+		r = &fe->fe_f1;
+		goto Step7;
+	}
+
 	/*
 	 * Step 2
 	 */
 	l = x->fp_exp - y->fp_exp;
 	k = 0;
-	q = 0;
 	CPYFPN(r, x);
 	if (l >= 0) {
 		r->fp_exp -= l;
@@ -125,21 +147,20 @@ __fpu_modrem(struct fpemu *fe, int is_mo
 		/*
 		 * Step 3
 		 */
-		while (y->fp_exp != r->fp_exp ||
-		   y->fp_mant[0] != r->fp_mant[0] ||
-		   y->fp_mant[1] != r->fp_mant[1] ||
-		   y->fp_mant[2] != r->fp_mant[2]) {
+		for (;;) {
+			cmp = abscmp3(r, y);
+
+			/* Step 3.1 */
+			if (cmp == 0)
+break;
 
 			/* Step 3.2 */
-			CPYFPN(&r_bkup, r);
-			CPYFPN(&fe->fe_f1, r);
-			CPYFPN(&fe->fe_f2, y);
-			fe->fe_f2.fp_sign = 1;
-			r = fpu_add(fe);
-			if (r->fp_sign == 0) {
+			if (cmp > 0) {
+CPYFPN(&fe->fe_f1, r);
+CPYFPN(&f