From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1LBvtp-0004pt-1s for qemu-devel@nongnu.org; Sun, 14 Dec 2008 13:41:05 -0500 Received: from exim by lists.gnu.org with spam-scanned (Exim 4.43) id 1LBvtk-0004oP-Ku for qemu-devel@nongnu.org; Sun, 14 Dec 2008 13:41:01 -0500 Received: from [199.232.76.173] (port=32817 helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1LBvtk-0004oA-4V for qemu-devel@nongnu.org; Sun, 14 Dec 2008 13:41:00 -0500 Received: from savannah.gnu.org ([199.232.41.3]:40297 helo=sv.gnu.org) by monty-python.gnu.org with esmtps (TLS-1.0:RSA_AES_256_CBC_SHA1:32) (Exim 4.60) (envelope-from ) id 1LBvtj-00034B-QW for qemu-devel@nongnu.org; Sun, 14 Dec 2008 13:40:59 -0500 Received: from cvs.savannah.gnu.org ([199.232.41.69]) by sv.gnu.org with esmtp (Exim 4.63) (envelope-from ) id 1LBvtj-00077h-92 for qemu-devel@nongnu.org; Sun, 14 Dec 2008 18:40:59 +0000 Received: from aurel32 by cvs.savannah.gnu.org with local (Exim 4.63) (envelope-from ) id 1LBvti-00077d-Tz for qemu-devel@nongnu.org; Sun, 14 Dec 2008 18:40:59 +0000 MIME-Version: 1.0 Errors-To: aurel32 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit From: Aurelien Jarno Message-Id: Date: Sun, 14 Dec 2008 18:40:58 +0000 Subject: [Qemu-devel] [6032] target-ppc: fix mtfsb0 and mtfsb1 Reply-To: qemu-devel@nongnu.org List-Id: qemu-devel.nongnu.org List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Revision: 6032 http://svn.sv.gnu.org/viewvc/?view=rev&root=qemu&revision=6032 Author: aurel32 Date: 2008-12-14 18:40:58 +0000 (Sun, 14 Dec 2008) Log Message: ----------- target-ppc: fix mtfsb0 and mtfsb1 Signed-off-by: Aurelien Jarno Modified Paths: -------------- trunk/target-ppc/helper.h trunk/target-ppc/op_helper.c trunk/target-ppc/translate.c Modified: trunk/target-ppc/helper.h =================================================================== --- trunk/target-ppc/helper.h 2008-12-14 18:40:49 UTC (rev 6031) +++ trunk/target-ppc/helper.h 2008-12-14 18:40:58 UTC (rev 6032) @@ -58,6 +58,7 @@ #endif DEF_HELPER_2(compute_fprf, i32, i64, i32) DEF_HELPER_2(store_fpscr, void, i64, i32) +DEF_HELPER_1(fpscr_clrbit, void, i32) DEF_HELPER_1(fpscr_setbit, void, i32) DEF_HELPER_1(float64_to_float32, i32, i64) DEF_HELPER_1(float32_to_float64, i64, i32) Modified: trunk/target-ppc/op_helper.c =================================================================== --- trunk/target-ppc/op_helper.c 2008-12-14 18:40:49 UTC (rev 6031) +++ trunk/target-ppc/op_helper.c 2008-12-14 18:40:58 UTC (rev 6032) @@ -843,6 +843,24 @@ set_float_rounding_mode(rnd_type, &env->fp_status); } +void helper_fpscr_clrbit (uint32_t bit) +{ + int prev; + + prev = (env->fpscr >> bit) & 1; + env->fpscr &= ~(1 << bit); + if (prev == 1) { + switch (bit) { + case FPSCR_RN1: + case FPSCR_RN: + fpscr_set_rounding_mode(); + break; + default: + break; + } + } +} + void helper_fpscr_setbit (uint32_t bit) { int prev; Modified: trunk/target-ppc/translate.c =================================================================== --- trunk/target-ppc/translate.c 2008-12-14 18:40:49 UTC (rev 6031) +++ trunk/target-ppc/translate.c 2008-12-14 18:40:58 UTC (rev 6032) @@ -2355,11 +2355,14 @@ gen_exception(ctx, POWERPC_EXCP_FPU); return; } - crb = 32 - (crbD(ctx->opcode) >> 2); + crb = 31 - crbD(ctx->opcode); gen_optimize_fprf(); gen_reset_fpstatus(); - if (likely(crb != 30 && crb != 29)) - tcg_gen_andi_i32(cpu_fpscr, cpu_fpscr, ~(1 << crb)); + if (likely(crb != FPSCR_FEX && crb != FPSCR_VX)) { + TCGv_i32 t0 = tcg_const_i32(crb); + gen_helper_fpscr_clrbit(t0); + tcg_temp_free_i32(t0); + } if (unlikely(Rc(ctx->opcode) != 0)) { tcg_gen_shri_i32(cpu_crf[1], cpu_fpscr, FPSCR_OX); } @@ -2374,7 +2377,7 @@ gen_exception(ctx, POWERPC_EXCP_FPU); return; } - crb = 32 - (crbD(ctx->opcode) >> 2); + crb = 31 - crbD(ctx->opcode); gen_optimize_fprf(); gen_reset_fpstatus(); /* XXX: we pretend we can only do IEEE floating-point computations */