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 <sys/cdefs.h> -__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 <sys/types.h> #include <sys/signal.h> @@ -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 */