From 88ddd9e832bb23dc8e03c0aa33ea1e3a3d034322 Mon Sep 17 00:00:00 2001 From: David Schultz Date: Thu, 6 May 2004 09:35:57 +0000 Subject: [PATCH] Don't clear the exception flags after we finish emulating a floating-point instruction in the kernel. The flags are supposed to be cumulative. Thanks to marcel for helping me test this. --- sys/alpha/alpha/fp_emulate.c | 2 +- sys/alpha/include/fpu.h | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/sys/alpha/alpha/fp_emulate.c b/sys/alpha/alpha/fp_emulate.c index e24ce889573..243c1727346 100644 --- a/sys/alpha/alpha/fp_emulate.c +++ b/sys/alpha/alpha/fp_emulate.c @@ -296,7 +296,7 @@ static int fp_emulate(union alpha_instruction ins, struct thread *td) td->td_pcb->pcb_fp_control = control; /* Regenerate the control register */ - fpcr = fpregs->fpr_cr & FPCR_DYN_MASK; + fpcr = fpregs->fpr_cr & (FPCR_DYN_MASK | FPCR_STATUS_MASK); fpcr |= ((control & IEEE_STATUS_MASK) << IEEE_STATUS_TO_FPCR_SHIFT); if (!(control & IEEE_TRAP_ENABLE_INV)) diff --git a/sys/alpha/include/fpu.h b/sys/alpha/include/fpu.h index 9f4800feeea..ad539e90451 100644 --- a/sys/alpha/include/fpu.h +++ b/sys/alpha/include/fpu.h @@ -56,6 +56,8 @@ #define FPCR_INED (1LL << 62) /* Inexact Disable */ #define FPCR_SUM (1LL << 63) /* Summary Bit */ #define FPCR_MASK (~0LL << 49) +#define FPCR_STATUS_MASK (FPCR_INV | FPCR_DZE | FPCR_OVF | \ + FPCR_UNF | FPCR_INE | FPCR_IOV) /* * Exception summary bits.