CVS commit: src/sys/arch/m68k/fpe
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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