From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1LeGo3-0005re-CT for qemu-devel@nongnu.org; Mon, 02 Mar 2009 17:40:15 -0500 Received: from exim by lists.gnu.org with spam-scanned (Exim 4.43) id 1LeGo1-0005r1-5k for qemu-devel@nongnu.org; Mon, 02 Mar 2009 17:40:13 -0500 Received: from [199.232.76.173] (port=41021 helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1LeGo0-0005qm-N0 for qemu-devel@nongnu.org; Mon, 02 Mar 2009 17:40:12 -0500 Received: from savannah.gnu.org ([199.232.41.3]:40743 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 1LeGo0-0005cK-DR for qemu-devel@nongnu.org; Mon, 02 Mar 2009 17:40:12 -0500 Received: from cvs.savannah.gnu.org ([199.232.41.69]) by sv.gnu.org with esmtp (Exim 4.69) (envelope-from ) id 1LeGnV-0005MO-1c for qemu-devel@nongnu.org; Mon, 02 Mar 2009 22:39:41 +0000 Received: from malc by cvs.savannah.gnu.org with local (Exim 4.69) (envelope-from ) id 1LeGnU-0005MJ-6V for qemu-devel@nongnu.org; Mon, 02 Mar 2009 22:39:40 +0000 MIME-Version: 1.0 Errors-To: malc Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit From: malc Message-Id: Date: Mon, 02 Mar 2009 22:39:40 +0000 Subject: [Qemu-devel] [6667] Fix mtcrf/mfcr 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: 6667 http://svn.sv.gnu.org/viewvc/?view=rev&root=qemu&revision=6667 Author: malc Date: 2009-03-02 22:39:39 +0000 (Mon, 02 Mar 2009) Log Message: ----------- Fix mtcrf/mfcr Noticed by Alexander Graf Modified Paths: -------------- trunk/target-ppc/translate.c Modified: trunk/target-ppc/translate.c =================================================================== --- trunk/target-ppc/translate.c 2009-03-02 17:13:21 UTC (rev 6666) +++ trunk/target-ppc/translate.c 2009-03-02 22:39:39 UTC (rev 6667) @@ -3843,9 +3843,11 @@ if (likely(ctx->opcode & 0x00100000)) { crm = CRM(ctx->opcode); - if (likely((crm ^ (crm - 1)) == 0)) { - crn = ffs(crm); + if (likely(crm && ((crm & (crm - 1)) == 0))) { + crn = ffs (crm) - 1; tcg_gen_extu_i32_tl(cpu_gpr[rD(ctx->opcode)], cpu_crf[7 - crn]); + tcg_gen_shli_i32(cpu_gpr[rD(ctx->opcode)], + cpu_gpr[rD(ctx->opcode)], crn * 4); } } else { gen_helper_load_cr(cpu_gpr[rD(ctx->opcode)]); @@ -3935,13 +3937,15 @@ uint32_t crm, crn; crm = CRM(ctx->opcode); - if (likely((ctx->opcode & 0x00100000) || (crm ^ (crm - 1)) == 0)) { - TCGv_i32 temp = tcg_temp_new_i32(); - crn = ffs(crm); - tcg_gen_trunc_tl_i32(temp, cpu_gpr[rS(ctx->opcode)]); - tcg_gen_shri_i32(cpu_crf[7 - crn], temp, crn * 4); - tcg_gen_andi_i32(cpu_crf[7 - crn], cpu_crf[7 - crn], 0xf); - tcg_temp_free_i32(temp); + if (likely((ctx->opcode & 0x00100000))) { + if (crm && ((crm & (crm - 1)) == 0)) { + TCGv_i32 temp = tcg_temp_new_i32(); + crn = ffs (crm) - 1; + tcg_gen_trunc_tl_i32(temp, cpu_gpr[rS(ctx->opcode)]); + tcg_gen_shri_i32(cpu_crf[7 - crn], temp, crn * 4); + tcg_gen_andi_i32(cpu_crf[7 - crn], cpu_crf[7 - crn], 0xf); + tcg_temp_free_i32(temp); + } } else { TCGv_i32 temp = tcg_const_i32(crm); gen_helper_store_cr(cpu_gpr[rS(ctx->opcode)], temp);