From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1K1LqI-0007VC-AX for qemu-devel@nongnu.org; Wed, 28 May 2008 09:37:26 -0400 Received: from exim by lists.gnu.org with spam-scanned (Exim 4.43) id 1K1LqG-0007Uv-3Z for qemu-devel@nongnu.org; Wed, 28 May 2008 09:37:25 -0400 Received: from [199.232.76.173] (port=32831 helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1K1LqF-0007Us-UO for qemu-devel@nongnu.org; Wed, 28 May 2008 09:37:23 -0400 Received: from savannah.gnu.org ([199.232.41.3]:48019 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 1K1LqE-0005FP-QN for qemu-devel@nongnu.org; Wed, 28 May 2008 09:37:24 -0400 Received: from cvs.savannah.gnu.org ([199.232.41.69]) by sv.gnu.org with esmtp (Exim 4.63) (envelope-from ) id 1K1LqC-0005Tn-Pf for qemu-devel@nongnu.org; Wed, 28 May 2008 13:37:20 +0000 Received: from ths by cvs.savannah.gnu.org with local (Exim 4.63) (envelope-from ) id 1K1LqC-0005Tj-Es for qemu-devel@nongnu.org; Wed, 28 May 2008 13:37:20 +0000 MIME-Version: 1.0 Errors-To: ths Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit From: Thiemo Seufer Message-Id: Date: Wed, 28 May 2008 13:37:20 +0000 Subject: [Qemu-devel] [4604] Honour current_tc for MIPS M{T, F}{HI, LO}, by Richard Sandiford. 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: 4604 http://svn.sv.gnu.org/viewvc/?view=rev&root=qemu&revision=4604 Author: ths Date: 2008-05-28 13:37:19 +0000 (Wed, 28 May 2008) Log Message: ----------- Honour current_tc for MIPS M{T,F}{HI,LO}, by Richard Sandiford. Modified Paths: -------------- trunk/target-mips/cpu.h trunk/target-mips/translate.c trunk/target-mips/translate_init.c Modified: trunk/target-mips/cpu.h =================================================================== --- trunk/target-mips/cpu.h 2008-05-28 12:51:20 UTC (rev 4603) +++ trunk/target-mips/cpu.h 2008-05-28 13:37:19 UTC (rev 4604) @@ -159,6 +159,7 @@ CPUMIPSFPUContext *fpu; uint32_t current_tc; target_ulong *current_tc_gprs; + target_ulong *current_tc_hi; uint32_t SEGBITS; target_ulong SEGMask; Modified: trunk/target-mips/translate.c =================================================================== --- trunk/target-mips/translate.c 2008-05-28 12:51:20 UTC (rev 4603) +++ trunk/target-mips/translate.c 2008-05-28 13:37:19 UTC (rev 4604) @@ -423,7 +423,7 @@ }; /* global register indices */ -static TCGv cpu_env, current_tc_gprs, cpu_T[2]; +static TCGv cpu_env, current_tc_gprs, current_tc_hi, cpu_T[2]; /* The code generator doesn't like lots of temporaries, so maintain our own cache for reuse within a function. */ @@ -531,6 +531,33 @@ tcg_gen_st_tl(t, current_tc_gprs, sizeof(target_ulong) * reg); } +/* Moves to/from HI and LO registers. */ +static inline void gen_load_LO (TCGv t, int reg) +{ + tcg_gen_ld_tl(t, current_tc_hi, + offsetof(CPUState, LO) + - offsetof(CPUState, HI) + + sizeof(target_ulong) * reg); +} + +static inline void gen_store_LO (TCGv t, int reg) +{ + tcg_gen_st_tl(t, current_tc_hi, + offsetof(CPUState, LO) + - offsetof(CPUState, HI) + + sizeof(target_ulong) * reg); +} + +static inline void gen_load_HI (TCGv t, int reg) +{ + tcg_gen_ld_tl(t, current_tc_hi, sizeof(target_ulong) * reg); +} + +static inline void gen_store_HI (TCGv t, int reg) +{ + tcg_gen_st_tl(t, current_tc_hi, sizeof(target_ulong) * reg); +} + /* Moves to/from shadow registers. */ static inline void gen_load_srsgpr (TCGv t, int reg) { @@ -1834,23 +1861,23 @@ } switch (opc) { case OPC_MFHI: - tcg_gen_ld_tl(cpu_T[0], cpu_env, offsetof(CPUState, HI[0])); + gen_load_HI(cpu_T[0], 0); gen_store_gpr(cpu_T[0], reg); opn = "mfhi"; break; case OPC_MFLO: - tcg_gen_ld_tl(cpu_T[0], cpu_env, offsetof(CPUState, LO[0])); + gen_load_LO(cpu_T[0], 0); gen_store_gpr(cpu_T[0], reg); opn = "mflo"; break; case OPC_MTHI: gen_load_gpr(cpu_T[0], reg); - tcg_gen_st_tl(cpu_T[0], cpu_env, offsetof(CPUState, HI[0])); + gen_store_HI(cpu_T[0], 0); opn = "mthi"; break; case OPC_MTLO: gen_load_gpr(cpu_T[0], reg); - tcg_gen_st_tl(cpu_T[0], cpu_env, offsetof(CPUState, LO[0])); + gen_store_LO(cpu_T[0], 0); opn = "mtlo"; break; default: @@ -1878,9 +1905,6 @@ TCGv r_tmp1 = new_tmp(); TCGv r_tmp2 = new_tmp(); TCGv r_tmp3 = new_tmp(); - TCGv r_tc_off = new_tmp(); - TCGv r_tc_off_tl = tcg_temp_new(TCG_TYPE_TL); - TCGv r_ptr = tcg_temp_new(TCG_TYPE_PTR); tcg_gen_ext_i32_tl(r_tmp1, cpu_T[0]); tcg_gen_ext_i32_tl(r_tmp2, cpu_T[1]); @@ -1888,16 +1912,11 @@ tcg_gen_rem_i32(r_tmp1, r_tmp1, r_tmp2); tcg_gen_trunc_tl_i32(cpu_T[0], r_tmp3); tcg_gen_trunc_tl_i32(cpu_T[1], r_tmp1); + gen_store_LO(cpu_T[0], 0); + gen_store_HI(cpu_T[1], 0); dead_tmp(r_tmp1); dead_tmp(r_tmp2); dead_tmp(r_tmp3); - tcg_gen_ld_i32(r_tc_off, cpu_env, offsetof(CPUState, current_tc)); - tcg_gen_muli_i32(r_tc_off, r_tc_off, sizeof(target_ulong)); - tcg_gen_ext_i32_ptr(r_tc_off_tl, r_tc_off); - tcg_gen_add_ptr(r_ptr, cpu_env, r_tc_off_tl); - tcg_gen_st_tl(cpu_T[0], r_ptr, offsetof(CPUState, LO)); - tcg_gen_st_tl(cpu_T[1], r_ptr, offsetof(CPUState, HI)); - dead_tmp(r_tc_off); } gen_set_label(l1); } @@ -1912,9 +1931,6 @@ TCGv r_tmp1 = new_tmp(); TCGv r_tmp2 = new_tmp(); TCGv r_tmp3 = new_tmp(); - TCGv r_tc_off = new_tmp(); - TCGv r_tc_off_tl = tcg_temp_new(TCG_TYPE_TL); - TCGv r_ptr = tcg_temp_new(TCG_TYPE_PTR); tcg_gen_ext_i32_tl(r_tmp1, cpu_T[0]); tcg_gen_ext_i32_tl(r_tmp2, cpu_T[1]); @@ -1922,16 +1938,11 @@ tcg_gen_remu_i32(r_tmp1, r_tmp1, r_tmp2); tcg_gen_trunc_tl_i32(cpu_T[0], r_tmp3); tcg_gen_trunc_tl_i32(cpu_T[1], r_tmp1); + gen_store_LO(cpu_T[0], 0); + gen_store_HI(cpu_T[1], 0); dead_tmp(r_tmp1); dead_tmp(r_tmp2); dead_tmp(r_tmp3); - tcg_gen_ld_i32(r_tc_off, cpu_env, offsetof(CPUState, current_tc)); - tcg_gen_muli_i32(r_tc_off, r_tc_off, sizeof(target_ulong)); - tcg_gen_ext_i32_ptr(r_tc_off_tl, r_tc_off); - tcg_gen_add_ptr(r_ptr, cpu_env, r_tc_off_tl); - tcg_gen_st_tl(cpu_T[0], r_ptr, offsetof(CPUState, LO)); - tcg_gen_st_tl(cpu_T[1], r_ptr, offsetof(CPUState, HI)); - dead_tmp(r_tc_off); } gen_set_label(l1); } @@ -1952,9 +1963,6 @@ tcg_gen_brcondi_tl(TCG_COND_EQ, cpu_T[1], 0, l1); { - TCGv r_tc_off = new_tmp(); - TCGv r_tc_off_tl = tcg_temp_new(TCG_TYPE_TL); - TCGv r_ptr = tcg_temp_new(TCG_TYPE_PTR); int l2 = gen_new_label(); int l3 = gen_new_label(); @@ -1968,13 +1976,8 @@ tcg_gen_rem_i64(cpu_T[1], cpu_T[0], cpu_T[1]); gen_set_label(l3); - tcg_gen_ld_i32(r_tc_off, cpu_env, offsetof(CPUState, current_tc)); - tcg_gen_muli_i32(r_tc_off, r_tc_off, sizeof(target_ulong)); - tcg_gen_ext_i32_ptr(r_tc_off_tl, r_tc_off); - tcg_gen_add_ptr(r_ptr, cpu_env, r_tc_off_tl); - tcg_gen_st_tl(cpu_T[0], r_ptr, offsetof(CPUState, LO)); - tcg_gen_st_tl(cpu_T[1], r_ptr, offsetof(CPUState, HI)); - dead_tmp(r_tc_off); + gen_store_LO(cpu_T[0], 0); + gen_store_HI(cpu_T[1], 0); } gen_set_label(l1); } @@ -1988,19 +1991,11 @@ { TCGv r_tmp1 = tcg_temp_new(TCG_TYPE_I64); TCGv r_tmp2 = tcg_temp_new(TCG_TYPE_I64); - TCGv r_tc_off = new_tmp(); - TCGv r_tc_off_tl = tcg_temp_new(TCG_TYPE_TL); - TCGv r_ptr = tcg_temp_new(TCG_TYPE_PTR); tcg_gen_divu_i64(r_tmp1, cpu_T[0], cpu_T[1]); tcg_gen_remu_i64(r_tmp2, cpu_T[0], cpu_T[1]); - tcg_gen_ld_i32(r_tc_off, cpu_env, offsetof(CPUState, current_tc)); - tcg_gen_muli_i32(r_tc_off, r_tc_off, sizeof(target_ulong)); - tcg_gen_ext_i32_ptr(r_tc_off_tl, r_tc_off); - tcg_gen_add_ptr(r_ptr, cpu_env, r_tc_off_tl); - tcg_gen_st_tl(r_tmp1, r_ptr, offsetof(CPUState, LO)); - tcg_gen_st_tl(r_tmp2, r_ptr, offsetof(CPUState, HI)); - dead_tmp(r_tc_off); + gen_store_LO(r_tmp1, 0); + gen_store_HI(r_tmp2, 0); } gen_set_label(l1); } @@ -7512,6 +7507,10 @@ TCG_AREG0, offsetof(CPUState, current_tc_gprs), "current_tc_gprs"); + current_tc_hi = tcg_global_mem_new(TCG_TYPE_PTR, + TCG_AREG0, + offsetof(CPUState, current_tc_hi), + "current_tc_hi"); #if TARGET_LONG_BITS > HOST_LONG_BITS cpu_T[0] = tcg_global_mem_new(TCG_TYPE_TL, TCG_AREG0, offsetof(CPUState, t0), "T0"); Modified: trunk/target-mips/translate_init.c =================================================================== --- trunk/target-mips/translate_init.c 2008-05-28 12:51:20 UTC (rev 4603) +++ trunk/target-mips/translate_init.c 2008-05-28 13:37:19 UTC (rev 4604) @@ -547,6 +547,7 @@ env->CP0_SRSCtl = def->CP0_SRSCtl; env->current_tc = 0; env->current_tc_gprs = &env->gpr[env->current_tc][0]; + env->current_tc_hi = &env->HI[env->current_tc][0]; env->SEGBITS = def->SEGBITS; env->SEGMask = (target_ulong)((1ULL << def->SEGBITS) - 1); #if defined(TARGET_MIPS64)