Module Name: src Committed By: rin Date: Tue Aug 30 10:59:43 UTC 2022
Modified Files: src/sys/arch/powerpc/fpu: fpu_emu.c Log Message: Fix fsel; frB is chosen when frA is negative or NaN. For fpu_emu.c rev 1.41 or prior, wrong register was chosen for NaN with sign bit being cleared. To generate a diff of this commit: cvs rdiff -u -r1.41 -r1.42 src/sys/arch/powerpc/fpu/fpu_emu.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/powerpc/fpu/fpu_emu.c diff -u src/sys/arch/powerpc/fpu/fpu_emu.c:1.41 src/sys/arch/powerpc/fpu/fpu_emu.c:1.42 --- src/sys/arch/powerpc/fpu/fpu_emu.c:1.41 Tue Aug 30 10:55:06 2022 +++ src/sys/arch/powerpc/fpu/fpu_emu.c Tue Aug 30 10:59:43 2022 @@ -1,4 +1,4 @@ -/* $NetBSD: fpu_emu.c,v 1.41 2022/08/30 10:55:06 rin Exp $ */ +/* $NetBSD: fpu_emu.c,v 1.42 2022/08/30 10:59:43 rin Exp $ */ /* * Copyright 2001 Wasabi Systems, Inc. @@ -76,7 +76,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: fpu_emu.c,v 1.41 2022/08/30 10:55:06 rin Exp $"); +__KERNEL_RCSID(0, "$NetBSD: fpu_emu.c,v 1.42 2022/08/30 10:59:43 rin Exp $"); #ifdef _KERNEL_OPT #include "opt_ddb.h" @@ -670,9 +670,13 @@ fpu_execute(struct trapframe *tf, struct FPU_EMU_EVCNT_INCR(fsel); DPRINTF(FPE_INSN, ("fpu_execute: FSEL\n")); a = (int *)&fe->fe_fpstate->fpreg[ra]; - if ((*a & 0x80000000) && (*a & 0x7fffffff)) - /* fra < 0 */ + if ((( a[0] & 0x80000000) && + ((a[0] & 0x7fffffff) | a[1])) || + (( a[0] & 0x7ff00000) && + ((a[0] & 0x000fffff) | a[1]))) { + /* negative/NaN or NaN */ rc = rb; + } DPRINTF(FPE_INSN, ("f%d => f%d\n", rc, rt)); memcpy(&fs->fpreg[rt], &fs->fpreg[rc], sizeof(double));