From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([140.186.70.92]:57168) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1QA9Dh-0002RK-S1 for qemu-devel@nongnu.org; Wed, 13 Apr 2011 19:11:34 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1QA9Dg-0005Cb-A3 for qemu-devel@nongnu.org; Wed, 13 Apr 2011 19:11:33 -0400 Received: from hall.aurel32.net ([88.191.126.93]:56714) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1QA9Dg-0004yT-1S for qemu-devel@nongnu.org; Wed, 13 Apr 2011 19:11:32 -0400 From: Aurelien Jarno Date: Thu, 14 Apr 2011 01:11:12 +0200 Message-Id: <1302736274-2908-18-git-send-email-aurelien@aurel32.net> In-Reply-To: <1302736274-2908-1-git-send-email-aurelien@aurel32.net> References: <1302736274-2908-1-git-send-email-aurelien@aurel32.net> Subject: [Qemu-devel] [PATCH v2 17/19] target-mips: don't hardcode softfloat exception bits List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Cc: Aurelien Jarno Reviewed-by: Peter Maydell Signed-off-by: Aurelien Jarno --- target-mips/op_helper.c | 35 ++++++++++++++++++++--------------- 1 files changed, 20 insertions(+), 15 deletions(-) diff --git a/target-mips/op_helper.c b/target-mips/op_helper.c index abcb6eb..0a62361 100644 --- a/target-mips/op_helper.c +++ b/target-mips/op_helper.c @@ -2077,22 +2077,27 @@ void helper_ctc1 (target_ulong arg1, uint32_t reg) helper_raise_exception(EXCP_FPE); } -static inline char ieee_ex_to_mips(char xcpt) +static inline int ieee_ex_to_mips(int xcpt) { - return (xcpt & float_flag_inexact) >> 5 | - (xcpt & float_flag_underflow) >> 3 | - (xcpt & float_flag_overflow) >> 1 | - (xcpt & float_flag_divbyzero) << 1 | - (xcpt & float_flag_invalid) << 4; -} - -static inline char mips_ex_to_ieee(char xcpt) -{ - return (xcpt & FP_INEXACT) << 5 | - (xcpt & FP_UNDERFLOW) << 3 | - (xcpt & FP_OVERFLOW) << 1 | - (xcpt & FP_DIV0) >> 1 | - (xcpt & FP_INVALID) >> 4; + int ret = 0; + if (xcpt) { + if (xcpt & float_flag_invalid) { + ret |= FP_INVALID; + } + if (xcpt & float_flag_overflow) { + ret |= FP_OVERFLOW; + } + if (xcpt & float_flag_underflow) { + ret |= FP_UNDERFLOW; + } + if (xcpt & float_flag_divbyzero) { + ret |= FP_DIV0; + } + if (xcpt & float_flag_inexact) { + ret |= FP_INEXACT; + } + } + return ret; } static inline void update_fcr31(void) -- 1.7.2.3