Commit 255e1fcb5a940fa027475a44c4c1a250a022c725

Authored by blueswir1
1 parent 47ad35f1

Convert most env fields to TCG registers

git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@5176 c046a42c-6fe2-441c-8c8c-71466251a162
Showing 1 changed file with 91 additions and 95 deletions
target-sparc/translate.c
@@ -41,9 +41,17 @@ @@ -41,9 +41,17 @@
41 static TCGv cpu_env, cpu_regwptr; 41 static TCGv cpu_env, cpu_regwptr;
42 static TCGv cpu_cc_src, cpu_cc_src2, cpu_cc_dst; 42 static TCGv cpu_cc_src, cpu_cc_src2, cpu_cc_dst;
43 static TCGv cpu_psr, cpu_fsr, cpu_pc, cpu_npc, cpu_gregs[8]; 43 static TCGv cpu_psr, cpu_fsr, cpu_pc, cpu_npc, cpu_gregs[8];
  44 +static TCGv cpu_y;
  45 +#ifndef CONFIG_USER_ONLY
  46 +static TCGv cpu_tbr;
  47 +#endif
44 static TCGv cpu_cond, cpu_src1, cpu_src2, cpu_dst, cpu_addr, cpu_val; 48 static TCGv cpu_cond, cpu_src1, cpu_src2, cpu_dst, cpu_addr, cpu_val;
45 #ifdef TARGET_SPARC64 49 #ifdef TARGET_SPARC64
46 -static TCGv cpu_xcc; 50 +static TCGv cpu_xcc, cpu_asi, cpu_fprs, cpu_gsr;
  51 +static TCGv cpu_tick_cmpr, cpu_stick_cmpr, cpu_hstick_cmpr;
  52 +static TCGv cpu_hintp, cpu_htba, cpu_hver, cpu_ssr, cpu_ver;
  53 +#else
  54 +static TCGv cpu_wim;
47 #endif 55 #endif
48 /* local register indexes (only used inside old micro ops) */ 56 /* local register indexes (only used inside old micro ops) */
49 static TCGv cpu_tmp0, cpu_tmp32, cpu_tmp64; 57 static TCGv cpu_tmp0, cpu_tmp32, cpu_tmp64;
@@ -724,8 +732,7 @@ static inline void gen_op_mulscc(TCGv dst, TCGv src1, TCGv src2) @@ -724,8 +732,7 @@ static inline void gen_op_mulscc(TCGv dst, TCGv src1, TCGv src2)
724 T1 = 0; 732 T1 = 0;
725 */ 733 */
726 tcg_gen_mov_tl(cpu_cc_src, src1); 734 tcg_gen_mov_tl(cpu_cc_src, src1);
727 - tcg_gen_ld_tl(r_temp, cpu_env, offsetof(CPUSPARCState, y));  
728 - tcg_gen_andi_tl(r_temp, r_temp, 0x1); 735 + tcg_gen_andi_tl(r_temp, cpu_y, 0x1);
729 tcg_gen_mov_tl(cpu_cc_src2, src2); 736 tcg_gen_mov_tl(cpu_cc_src2, src2);
730 tcg_gen_brcondi_tl(TCG_COND_NE, r_temp, 0, l1); 737 tcg_gen_brcondi_tl(TCG_COND_NE, r_temp, 0, l1);
731 tcg_gen_movi_tl(cpu_cc_src2, 0); 738 tcg_gen_movi_tl(cpu_cc_src2, 0);
@@ -735,10 +742,8 @@ static inline void gen_op_mulscc(TCGv dst, TCGv src1, TCGv src2) @@ -735,10 +742,8 @@ static inline void gen_op_mulscc(TCGv dst, TCGv src1, TCGv src2)
735 // env->y = (b2 << 31) | (env->y >> 1); 742 // env->y = (b2 << 31) | (env->y >> 1);
736 tcg_gen_andi_tl(r_temp, cpu_cc_src, 0x1); 743 tcg_gen_andi_tl(r_temp, cpu_cc_src, 0x1);
737 tcg_gen_shli_tl(r_temp, r_temp, 31); 744 tcg_gen_shli_tl(r_temp, r_temp, 31);
738 - tcg_gen_ld_tl(cpu_tmp0, cpu_env, offsetof(CPUSPARCState, y));  
739 - tcg_gen_shri_tl(cpu_tmp0, cpu_tmp0, 1);  
740 - tcg_gen_or_tl(cpu_tmp0, cpu_tmp0, r_temp);  
741 - tcg_gen_st_tl(cpu_tmp0, cpu_env, offsetof(CPUSPARCState, y)); 745 + tcg_gen_shri_tl(cpu_tmp0, cpu_y, 1);
  746 + tcg_gen_or_tl(cpu_y, cpu_tmp0, r_temp);
742 747
743 // b1 = N ^ V; 748 // b1 = N ^ V;
744 gen_mov_reg_N(cpu_tmp0, cpu_psr); 749 gen_mov_reg_N(cpu_tmp0, cpu_psr);
@@ -776,8 +781,7 @@ static inline void gen_op_umul(TCGv dst, TCGv src1, TCGv src2) @@ -776,8 +781,7 @@ static inline void gen_op_umul(TCGv dst, TCGv src1, TCGv src2)
776 tcg_gen_shri_i64(r_temp, r_temp2, 32); 781 tcg_gen_shri_i64(r_temp, r_temp2, 32);
777 tcg_gen_trunc_i64_tl(cpu_tmp0, r_temp); 782 tcg_gen_trunc_i64_tl(cpu_tmp0, r_temp);
778 tcg_temp_free(r_temp); 783 tcg_temp_free(r_temp);
779 - tcg_gen_andi_tl(cpu_tmp0, cpu_tmp0, 0xffffffff);  
780 - tcg_gen_st_tl(cpu_tmp0, cpu_env, offsetof(CPUSPARCState, y)); 784 + tcg_gen_andi_tl(cpu_y, cpu_tmp0, 0xffffffff);
781 #ifdef TARGET_SPARC64 785 #ifdef TARGET_SPARC64
782 tcg_gen_mov_i64(dst, r_temp2); 786 tcg_gen_mov_i64(dst, r_temp2);
783 #else 787 #else
@@ -800,8 +804,7 @@ static inline void gen_op_smul(TCGv dst, TCGv src1, TCGv src2) @@ -800,8 +804,7 @@ static inline void gen_op_smul(TCGv dst, TCGv src1, TCGv src2)
800 tcg_gen_shri_i64(r_temp, r_temp2, 32); 804 tcg_gen_shri_i64(r_temp, r_temp2, 32);
801 tcg_gen_trunc_i64_tl(cpu_tmp0, r_temp); 805 tcg_gen_trunc_i64_tl(cpu_tmp0, r_temp);
802 tcg_temp_free(r_temp); 806 tcg_temp_free(r_temp);
803 - tcg_gen_andi_tl(cpu_tmp0, cpu_tmp0, 0xffffffff);  
804 - tcg_gen_st_tl(cpu_tmp0, cpu_env, offsetof(CPUSPARCState, y)); 807 + tcg_gen_andi_tl(cpu_y, cpu_tmp0, 0xffffffff);
805 #ifdef TARGET_SPARC64 808 #ifdef TARGET_SPARC64
806 tcg_gen_mov_i64(dst, r_temp2); 809 tcg_gen_mov_i64(dst, r_temp2);
807 #else 810 #else
@@ -1645,7 +1648,7 @@ static inline TCGv gen_get_asi(int insn, TCGv r_addr) @@ -1645,7 +1648,7 @@ static inline TCGv gen_get_asi(int insn, TCGv r_addr)
1645 1648
1646 if (IS_IMM) { 1649 if (IS_IMM) {
1647 r_asi = tcg_temp_new(TCG_TYPE_I32); 1650 r_asi = tcg_temp_new(TCG_TYPE_I32);
1648 - tcg_gen_ld_i32(r_asi, cpu_env, offsetof(CPUSPARCState, asi)); 1651 + tcg_gen_mov_i32(r_asi, cpu_asi);
1649 } else { 1652 } else {
1650 asi = GET_FIELD(insn, 19, 26); 1653 asi = GET_FIELD(insn, 19, 26);
1651 r_asi = tcg_const_i32(asi); 1654 r_asi = tcg_const_i32(asi);
@@ -2080,9 +2083,7 @@ static void disas_sparc_insn(DisasContext * dc) @@ -2080,9 +2083,7 @@ static void disas_sparc_insn(DisasContext * dc)
2080 SPARCv8 manual, rdy on the 2083 SPARCv8 manual, rdy on the
2081 microSPARC II */ 2084 microSPARC II */
2082 #endif 2085 #endif
2083 - tcg_gen_ld_tl(cpu_tmp0, cpu_env,  
2084 - offsetof(CPUSPARCState, y));  
2085 - gen_movl_TN_reg(rd, cpu_tmp0); 2086 + gen_movl_TN_reg(rd, cpu_y);
2086 break; 2087 break;
2087 #ifdef TARGET_SPARC64 2088 #ifdef TARGET_SPARC64
2088 case 0x2: /* V9 rdccr */ 2089 case 0x2: /* V9 rdccr */
@@ -2090,9 +2091,7 @@ static void disas_sparc_insn(DisasContext * dc) @@ -2090,9 +2091,7 @@ static void disas_sparc_insn(DisasContext * dc)
2090 gen_movl_TN_reg(rd, cpu_dst); 2091 gen_movl_TN_reg(rd, cpu_dst);
2091 break; 2092 break;
2092 case 0x3: /* V9 rdasi */ 2093 case 0x3: /* V9 rdasi */
2093 - tcg_gen_ld_i32(cpu_tmp32, cpu_env,  
2094 - offsetof(CPUSPARCState, asi));  
2095 - tcg_gen_ext_i32_tl(cpu_dst, cpu_tmp32); 2094 + tcg_gen_ext_i32_tl(cpu_dst, cpu_asi);
2096 gen_movl_TN_reg(rd, cpu_dst); 2095 gen_movl_TN_reg(rd, cpu_dst);
2097 break; 2096 break;
2098 case 0x4: /* V9 rdtick */ 2097 case 0x4: /* V9 rdtick */
@@ -2118,9 +2117,7 @@ static void disas_sparc_insn(DisasContext * dc) @@ -2118,9 +2117,7 @@ static void disas_sparc_insn(DisasContext * dc)
2118 } 2117 }
2119 break; 2118 break;
2120 case 0x6: /* V9 rdfprs */ 2119 case 0x6: /* V9 rdfprs */
2121 - tcg_gen_ld_i32(cpu_tmp32, cpu_env,  
2122 - offsetof(CPUSPARCState, fprs));  
2123 - tcg_gen_ext_i32_tl(cpu_dst, cpu_tmp32); 2120 + tcg_gen_ext_i32_tl(cpu_dst, cpu_fprs);
2124 gen_movl_TN_reg(rd, cpu_dst); 2121 gen_movl_TN_reg(rd, cpu_dst);
2125 break; 2122 break;
2126 case 0xf: /* V9 membar */ 2123 case 0xf: /* V9 membar */
@@ -2128,14 +2125,10 @@ static void disas_sparc_insn(DisasContext * dc) @@ -2128,14 +2125,10 @@ static void disas_sparc_insn(DisasContext * dc)
2128 case 0x13: /* Graphics Status */ 2125 case 0x13: /* Graphics Status */
2129 if (gen_trap_ifnofpu(dc, cpu_cond)) 2126 if (gen_trap_ifnofpu(dc, cpu_cond))
2130 goto jmp_insn; 2127 goto jmp_insn;
2131 - tcg_gen_ld_tl(cpu_tmp0, cpu_env,  
2132 - offsetof(CPUSPARCState, gsr));  
2133 - gen_movl_TN_reg(rd, cpu_tmp0); 2128 + gen_movl_TN_reg(rd, cpu_gsr);
2134 break; 2129 break;
2135 case 0x17: /* Tick compare */ 2130 case 0x17: /* Tick compare */
2136 - tcg_gen_ld_tl(cpu_tmp0, cpu_env,  
2137 - offsetof(CPUSPARCState, tick_cmpr));  
2138 - gen_movl_TN_reg(rd, cpu_tmp0); 2131 + gen_movl_TN_reg(rd, cpu_tick_cmpr);
2139 break; 2132 break;
2140 case 0x18: /* System tick */ 2133 case 0x18: /* System tick */
2141 { 2134 {
@@ -2151,9 +2144,7 @@ static void disas_sparc_insn(DisasContext * dc) @@ -2151,9 +2144,7 @@ static void disas_sparc_insn(DisasContext * dc)
2151 } 2144 }
2152 break; 2145 break;
2153 case 0x19: /* System tick compare */ 2146 case 0x19: /* System tick compare */
2154 - tcg_gen_ld_tl(cpu_tmp0, cpu_env,  
2155 - offsetof(CPUSPARCState, stick_cmpr));  
2156 - gen_movl_TN_reg(rd, cpu_tmp0); 2147 + gen_movl_TN_reg(rd, cpu_stick_cmpr);
2157 break; 2148 break;
2158 case 0x10: /* Performance Control */ 2149 case 0x10: /* Performance Control */
2159 case 0x11: /* Performance Instrumentation Counter */ 2150 case 0x11: /* Performance Instrumentation Counter */
@@ -2184,23 +2175,16 @@ static void disas_sparc_insn(DisasContext * dc) @@ -2184,23 +2175,16 @@ static void disas_sparc_insn(DisasContext * dc)
2184 // gen_op_rdhtstate(); 2175 // gen_op_rdhtstate();
2185 break; 2176 break;
2186 case 3: // hintp 2177 case 3: // hintp
2187 - tcg_gen_ld_i32(cpu_tmp32, cpu_env,  
2188 - offsetof(CPUSPARCState, hintp));  
2189 - tcg_gen_ext_i32_tl(cpu_dst, cpu_tmp32); 2178 + tcg_gen_mov_tl(cpu_dst, cpu_hintp);
2190 break; 2179 break;
2191 case 5: // htba 2180 case 5: // htba
2192 - tcg_gen_ld_i32(cpu_tmp32, cpu_env,  
2193 - offsetof(CPUSPARCState, htba));  
2194 - tcg_gen_ext_i32_tl(cpu_dst, cpu_tmp32); 2181 + tcg_gen_mov_tl(cpu_dst, cpu_htba);
2195 break; 2182 break;
2196 case 6: // hver 2183 case 6: // hver
2197 - tcg_gen_ld_i32(cpu_tmp32, cpu_env,  
2198 - offsetof(CPUSPARCState, hver));  
2199 - tcg_gen_ext_i32_tl(cpu_dst, cpu_tmp32); 2184 + tcg_gen_mov_tl(cpu_dst, cpu_hver);
2200 break; 2185 break;
2201 case 31: // hstick_cmpr 2186 case 31: // hstick_cmpr
2202 - tcg_gen_ld_tl(cpu_dst, cpu_env,  
2203 - offsetof(CPUSPARCState, hstick_cmpr)); 2187 + tcg_gen_mov_tl(cpu_dst, cpu_hstick_cmpr);
2204 break; 2188 break;
2205 default: 2189 default:
2206 goto illegal_insn; 2190 goto illegal_insn;
@@ -2276,8 +2260,7 @@ static void disas_sparc_insn(DisasContext * dc) @@ -2276,8 +2260,7 @@ static void disas_sparc_insn(DisasContext * dc)
2276 } 2260 }
2277 break; 2261 break;
2278 case 5: // tba 2262 case 5: // tba
2279 - tcg_gen_ld_tl(cpu_tmp0, cpu_env,  
2280 - offsetof(CPUSPARCState, tbr)); 2263 + tcg_gen_mov_tl(cpu_tmp0, cpu_tbr);
2281 break; 2264 break;
2282 case 6: // pstate 2265 case 6: // pstate
2283 tcg_gen_ld_i32(cpu_tmp32, cpu_env, 2266 tcg_gen_ld_i32(cpu_tmp32, cpu_env,
@@ -2332,22 +2315,17 @@ static void disas_sparc_insn(DisasContext * dc) @@ -2332,22 +2315,17 @@ static void disas_sparc_insn(DisasContext * dc)
2332 CHECK_IU_FEATURE(dc, HYPV); 2315 CHECK_IU_FEATURE(dc, HYPV);
2333 if (!hypervisor(dc)) 2316 if (!hypervisor(dc))
2334 goto priv_insn; 2317 goto priv_insn;
2335 - tcg_gen_ld_i32(cpu_tmp32, cpu_env,  
2336 - offsetof(CPUSPARCState, ssr));  
2337 - tcg_gen_ext_i32_tl(cpu_tmp0, cpu_tmp32); 2318 + tcg_gen_ext_i32_tl(cpu_tmp0, cpu_ssr);
2338 break; 2319 break;
2339 case 31: // ver 2320 case 31: // ver
2340 - tcg_gen_ld_tl(cpu_tmp0, cpu_env,  
2341 - offsetof(CPUSPARCState, version)); 2321 + tcg_gen_mov_tl(cpu_tmp0, cpu_ver);
2342 break; 2322 break;
2343 case 15: // fq 2323 case 15: // fq
2344 default: 2324 default:
2345 goto illegal_insn; 2325 goto illegal_insn;
2346 } 2326 }
2347 #else 2327 #else
2348 - tcg_gen_ld_i32(cpu_tmp32, cpu_env,  
2349 - offsetof(CPUSPARCState, wim));  
2350 - tcg_gen_ext_i32_tl(cpu_tmp0, cpu_tmp32); 2328 + tcg_gen_ext_i32_tl(cpu_tmp0, cpu_wim);
2351 #endif 2329 #endif
2352 gen_movl_TN_reg(rd, cpu_tmp0); 2330 gen_movl_TN_reg(rd, cpu_tmp0);
2353 break; 2331 break;
@@ -2358,8 +2336,7 @@ static void disas_sparc_insn(DisasContext * dc) @@ -2358,8 +2336,7 @@ static void disas_sparc_insn(DisasContext * dc)
2358 #else 2336 #else
2359 if (!supervisor(dc)) 2337 if (!supervisor(dc))
2360 goto priv_insn; 2338 goto priv_insn;
2361 - tcg_gen_ld_tl(cpu_tmp0, cpu_env, offsetof(CPUSPARCState, tbr));  
2362 - gen_movl_TN_reg(rd, cpu_tmp0); 2339 + gen_movl_TN_reg(rd, cpu_tbr);
2363 #endif 2340 #endif
2364 break; 2341 break;
2365 #endif 2342 #endif
@@ -3152,9 +3129,7 @@ static void disas_sparc_insn(DisasContext * dc) @@ -3152,9 +3129,7 @@ static void disas_sparc_insn(DisasContext * dc)
3152 { 3129 {
3153 switch(rd) { 3130 switch(rd) {
3154 case 0: /* wry */ 3131 case 0: /* wry */
3155 - tcg_gen_xor_tl(cpu_tmp0, cpu_src1, cpu_src2);  
3156 - tcg_gen_st_tl(cpu_tmp0, cpu_env,  
3157 - offsetof(CPUSPARCState, y)); 3132 + tcg_gen_xor_tl(cpu_y, cpu_src1, cpu_src2);
3158 break; 3133 break;
3159 #ifndef TARGET_SPARC64 3134 #ifndef TARGET_SPARC64
3160 case 0x01 ... 0x0f: /* undefined in the 3135 case 0x01 ... 0x0f: /* undefined in the
@@ -3173,15 +3148,11 @@ static void disas_sparc_insn(DisasContext * dc) @@ -3173,15 +3148,11 @@ static void disas_sparc_insn(DisasContext * dc)
3173 break; 3148 break;
3174 case 0x3: /* V9 wrasi */ 3149 case 0x3: /* V9 wrasi */
3175 tcg_gen_xor_tl(cpu_dst, cpu_src1, cpu_src2); 3150 tcg_gen_xor_tl(cpu_dst, cpu_src1, cpu_src2);
3176 - tcg_gen_trunc_tl_i32(cpu_tmp32, cpu_dst);  
3177 - tcg_gen_st_i32(cpu_tmp32, cpu_env,  
3178 - offsetof(CPUSPARCState, asi)); 3151 + tcg_gen_trunc_tl_i32(cpu_asi, cpu_dst);
3179 break; 3152 break;
3180 case 0x6: /* V9 wrfprs */ 3153 case 0x6: /* V9 wrfprs */
3181 tcg_gen_xor_tl(cpu_dst, cpu_src1, cpu_src2); 3154 tcg_gen_xor_tl(cpu_dst, cpu_src1, cpu_src2);
3182 - tcg_gen_trunc_tl_i32(cpu_tmp32, cpu_dst);  
3183 - tcg_gen_st_i32(cpu_tmp32, cpu_env,  
3184 - offsetof(CPUSPARCState, fprs)); 3155 + tcg_gen_trunc_tl_i32(cpu_fprs, cpu_dst);
3185 save_state(dc, cpu_cond); 3156 save_state(dc, cpu_cond);
3186 gen_op_next_insn(); 3157 gen_op_next_insn();
3187 tcg_gen_exit_tb(0); 3158 tcg_gen_exit_tb(0);
@@ -3196,9 +3167,7 @@ static void disas_sparc_insn(DisasContext * dc) @@ -3196,9 +3167,7 @@ static void disas_sparc_insn(DisasContext * dc)
3196 case 0x13: /* Graphics Status */ 3167 case 0x13: /* Graphics Status */
3197 if (gen_trap_ifnofpu(dc, cpu_cond)) 3168 if (gen_trap_ifnofpu(dc, cpu_cond))
3198 goto jmp_insn; 3169 goto jmp_insn;
3199 - tcg_gen_xor_tl(cpu_tmp0, cpu_src1, cpu_src2);  
3200 - tcg_gen_st_tl(cpu_tmp0, cpu_env,  
3201 - offsetof(CPUSPARCState, gsr)); 3170 + tcg_gen_xor_tl(cpu_gsr, cpu_src1, cpu_src2);
3202 break; 3171 break;
3203 case 0x17: /* Tick compare */ 3172 case 0x17: /* Tick compare */
3204 #if !defined(CONFIG_USER_ONLY) 3173 #if !defined(CONFIG_USER_ONLY)
@@ -3208,16 +3177,13 @@ static void disas_sparc_insn(DisasContext * dc) @@ -3208,16 +3177,13 @@ static void disas_sparc_insn(DisasContext * dc)
3208 { 3177 {
3209 TCGv r_tickptr; 3178 TCGv r_tickptr;
3210 3179
3211 - tcg_gen_xor_tl(cpu_tmp0, cpu_src1, 3180 + tcg_gen_xor_tl(cpu_tick_cmpr, cpu_src1,
3212 cpu_src2); 3181 cpu_src2);
3213 - tcg_gen_st_tl(cpu_tmp0, cpu_env,  
3214 - offsetof(CPUSPARCState,  
3215 - tick_cmpr));  
3216 r_tickptr = tcg_temp_new(TCG_TYPE_PTR); 3182 r_tickptr = tcg_temp_new(TCG_TYPE_PTR);
3217 tcg_gen_ld_ptr(r_tickptr, cpu_env, 3183 tcg_gen_ld_ptr(r_tickptr, cpu_env,
3218 offsetof(CPUState, tick)); 3184 offsetof(CPUState, tick));
3219 tcg_gen_helper_0_2(helper_tick_set_limit, 3185 tcg_gen_helper_0_2(helper_tick_set_limit,
3220 - r_tickptr, cpu_tmp0); 3186 + r_tickptr, cpu_tick_cmpr);
3221 tcg_temp_free(r_tickptr); 3187 tcg_temp_free(r_tickptr);
3222 } 3188 }
3223 break; 3189 break;
@@ -3247,16 +3213,13 @@ static void disas_sparc_insn(DisasContext * dc) @@ -3247,16 +3213,13 @@ static void disas_sparc_insn(DisasContext * dc)
3247 { 3213 {
3248 TCGv r_tickptr; 3214 TCGv r_tickptr;
3249 3215
3250 - tcg_gen_xor_tl(cpu_tmp0, cpu_src1, 3216 + tcg_gen_xor_tl(cpu_stick_cmpr, cpu_src1,
3251 cpu_src2); 3217 cpu_src2);
3252 - tcg_gen_st_tl(cpu_tmp0, cpu_env,  
3253 - offsetof(CPUSPARCState,  
3254 - stick_cmpr));  
3255 r_tickptr = tcg_temp_new(TCG_TYPE_PTR); 3218 r_tickptr = tcg_temp_new(TCG_TYPE_PTR);
3256 tcg_gen_ld_ptr(r_tickptr, cpu_env, 3219 tcg_gen_ld_ptr(r_tickptr, cpu_env,
3257 offsetof(CPUState, stick)); 3220 offsetof(CPUState, stick));
3258 tcg_gen_helper_0_2(helper_tick_set_limit, 3221 tcg_gen_helper_0_2(helper_tick_set_limit,
3259 - r_tickptr, cpu_tmp0); 3222 + r_tickptr, cpu_stick_cmpr);
3260 tcg_temp_free(r_tickptr); 3223 tcg_temp_free(r_tickptr);
3261 } 3224 }
3262 break; 3225 break;
@@ -3374,8 +3337,7 @@ static void disas_sparc_insn(DisasContext * dc) @@ -3374,8 +3337,7 @@ static void disas_sparc_insn(DisasContext * dc)
3374 } 3337 }
3375 break; 3338 break;
3376 case 5: // tba 3339 case 5: // tba
3377 - tcg_gen_st_tl(cpu_tmp0, cpu_env,  
3378 - offsetof(CPUSPARCState, tbr)); 3340 + tcg_gen_mov_tl(cpu_tbr, cpu_tmp0);
3379 break; 3341 break;
3380 case 6: // pstate 3342 case 6: // pstate
3381 save_state(dc, cpu_cond); 3343 save_state(dc, cpu_cond);
@@ -3438,9 +3400,7 @@ static void disas_sparc_insn(DisasContext * dc) @@ -3438,9 +3400,7 @@ static void disas_sparc_insn(DisasContext * dc)
3438 CHECK_IU_FEATURE(dc, HYPV); 3400 CHECK_IU_FEATURE(dc, HYPV);
3439 if (!hypervisor(dc)) 3401 if (!hypervisor(dc))
3440 goto priv_insn; 3402 goto priv_insn;
3441 - tcg_gen_trunc_tl_i32(cpu_tmp32, cpu_tmp0);  
3442 - tcg_gen_st_i32(cpu_tmp32, cpu_env,  
3443 - offsetof(CPUSPARCState, ssr)); 3403 + tcg_gen_trunc_tl_i32(cpu_ssr, cpu_tmp0);
3444 break; 3404 break;
3445 default: 3405 default:
3446 goto illegal_insn; 3406 goto illegal_insn;
@@ -3450,8 +3410,7 @@ static void disas_sparc_insn(DisasContext * dc) @@ -3450,8 +3410,7 @@ static void disas_sparc_insn(DisasContext * dc)
3450 if (dc->def->nwindows != 32) 3410 if (dc->def->nwindows != 32)
3451 tcg_gen_andi_tl(cpu_tmp32, cpu_tmp32, 3411 tcg_gen_andi_tl(cpu_tmp32, cpu_tmp32,
3452 (1 << dc->def->nwindows) - 1); 3412 (1 << dc->def->nwindows) - 1);
3453 - tcg_gen_st_i32(cpu_tmp32, cpu_env,  
3454 - offsetof(CPUSPARCState, wim)); 3413 + tcg_gen_mov_i32(cpu_wim, cpu_tmp32);
3455 #endif 3414 #endif
3456 } 3415 }
3457 break; 3416 break;
@@ -3460,9 +3419,7 @@ static void disas_sparc_insn(DisasContext * dc) @@ -3460,9 +3419,7 @@ static void disas_sparc_insn(DisasContext * dc)
3460 #ifndef TARGET_SPARC64 3419 #ifndef TARGET_SPARC64
3461 if (!supervisor(dc)) 3420 if (!supervisor(dc))
3462 goto priv_insn; 3421 goto priv_insn;
3463 - tcg_gen_xor_tl(cpu_tmp0, cpu_src1, cpu_src2);  
3464 - tcg_gen_st_tl(cpu_tmp0, cpu_env,  
3465 - offsetof(CPUSPARCState, tbr)); 3422 + tcg_gen_xor_tl(cpu_tbr, cpu_src1, cpu_src2);
3466 #else 3423 #else
3467 CHECK_IU_FEATURE(dc, HYPV); 3424 CHECK_IU_FEATURE(dc, HYPV);
3468 if (!hypervisor(dc)) 3425 if (!hypervisor(dc))
@@ -3480,27 +3437,21 @@ static void disas_sparc_insn(DisasContext * dc) @@ -3480,27 +3437,21 @@ static void disas_sparc_insn(DisasContext * dc)
3480 // XXX gen_op_wrhtstate(); 3437 // XXX gen_op_wrhtstate();
3481 break; 3438 break;
3482 case 3: // hintp 3439 case 3: // hintp
3483 - tcg_gen_trunc_tl_i32(cpu_tmp32, cpu_tmp0);  
3484 - tcg_gen_st_i32(cpu_tmp32, cpu_env,  
3485 - offsetof(CPUSPARCState, hintp)); 3440 + tcg_gen_mov_tl(cpu_hintp, cpu_tmp0);
3486 break; 3441 break;
3487 case 5: // htba 3442 case 5: // htba
3488 - tcg_gen_trunc_tl_i32(cpu_tmp32, cpu_tmp0);  
3489 - tcg_gen_st_i32(cpu_tmp32, cpu_env,  
3490 - offsetof(CPUSPARCState, htba)); 3443 + tcg_gen_mov_tl(cpu_htba, cpu_tmp0);
3491 break; 3444 break;
3492 case 31: // hstick_cmpr 3445 case 31: // hstick_cmpr
3493 { 3446 {
3494 TCGv r_tickptr; 3447 TCGv r_tickptr;
3495 3448
3496 - tcg_gen_st_tl(cpu_tmp0, cpu_env,  
3497 - offsetof(CPUSPARCState,  
3498 - hstick_cmpr)); 3449 + tcg_gen_mov_tl(cpu_hstick_cmpr, cpu_tmp0);
3499 r_tickptr = tcg_temp_new(TCG_TYPE_PTR); 3450 r_tickptr = tcg_temp_new(TCG_TYPE_PTR);
3500 tcg_gen_ld_ptr(r_tickptr, cpu_env, 3451 tcg_gen_ld_ptr(r_tickptr, cpu_env,
3501 offsetof(CPUState, hstick)); 3452 offsetof(CPUState, hstick));
3502 tcg_gen_helper_0_2(helper_tick_set_limit, 3453 tcg_gen_helper_0_2(helper_tick_set_limit,
3503 - r_tickptr, cpu_tmp0); 3454 + r_tickptr, cpu_hstick_cmpr);
3504 tcg_temp_free(r_tickptr); 3455 tcg_temp_free(r_tickptr);
3505 } 3456 }
3506 break; 3457 break;
@@ -4905,6 +4856,44 @@ void gen_intermediate_code_init(CPUSPARCState *env) @@ -4905,6 +4856,44 @@ void gen_intermediate_code_init(CPUSPARCState *env)
4905 cpu_xcc = tcg_global_mem_new(TCG_TYPE_I32, 4856 cpu_xcc = tcg_global_mem_new(TCG_TYPE_I32,
4906 TCG_AREG0, offsetof(CPUState, xcc), 4857 TCG_AREG0, offsetof(CPUState, xcc),
4907 "xcc"); 4858 "xcc");
  4859 + cpu_asi = tcg_global_mem_new(TCG_TYPE_I32,
  4860 + TCG_AREG0, offsetof(CPUState, asi),
  4861 + "asi");
  4862 + cpu_fprs = tcg_global_mem_new(TCG_TYPE_I32,
  4863 + TCG_AREG0, offsetof(CPUState, fprs),
  4864 + "fprs");
  4865 + cpu_gsr = tcg_global_mem_new(TCG_TYPE_TL,
  4866 + TCG_AREG0, offsetof(CPUState, gsr),
  4867 + "gsr");
  4868 + cpu_tick_cmpr = tcg_global_mem_new(TCG_TYPE_TL,
  4869 + TCG_AREG0,
  4870 + offsetof(CPUState, tick_cmpr),
  4871 + "tick_cmpr");
  4872 + cpu_stick_cmpr = tcg_global_mem_new(TCG_TYPE_TL,
  4873 + TCG_AREG0,
  4874 + offsetof(CPUState, stick_cmpr),
  4875 + "stick_cmpr");
  4876 + cpu_hstick_cmpr = tcg_global_mem_new(TCG_TYPE_TL,
  4877 + TCG_AREG0,
  4878 + offsetof(CPUState, hstick_cmpr),
  4879 + "hstick_cmpr");
  4880 + cpu_hintp = tcg_global_mem_new(TCG_TYPE_TL, TCG_AREG0,
  4881 + offsetof(CPUState, hintp),
  4882 + "hintp");
  4883 + cpu_htba = tcg_global_mem_new(TCG_TYPE_TL, TCG_AREG0,
  4884 + offsetof(CPUState, htba),
  4885 + "htba");
  4886 + cpu_hver = tcg_global_mem_new(TCG_TYPE_TL, TCG_AREG0,
  4887 + offsetof(CPUState, hver),
  4888 + "hver");
  4889 + cpu_ssr = tcg_global_mem_new(TCG_TYPE_TL, TCG_AREG0,
  4890 + offsetof(CPUState, ssr), "ssr");
  4891 + cpu_ver = tcg_global_mem_new(TCG_TYPE_TL, TCG_AREG0,
  4892 + offsetof(CPUState, version), "ver");
  4893 +#else
  4894 + cpu_wim = tcg_global_mem_new(TCG_TYPE_I32,
  4895 + TCG_AREG0, offsetof(CPUState, wim),
  4896 + "wim");
4908 #endif 4897 #endif
4909 cpu_cond = tcg_global_mem_new(TCG_TYPE_TL, 4898 cpu_cond = tcg_global_mem_new(TCG_TYPE_TL,
4910 TCG_AREG0, offsetof(CPUState, cond), 4899 TCG_AREG0, offsetof(CPUState, cond),
@@ -4930,6 +4919,13 @@ void gen_intermediate_code_init(CPUSPARCState *env) @@ -4930,6 +4919,13 @@ void gen_intermediate_code_init(CPUSPARCState *env)
4930 cpu_npc = tcg_global_mem_new(TCG_TYPE_TL, 4919 cpu_npc = tcg_global_mem_new(TCG_TYPE_TL,
4931 TCG_AREG0, offsetof(CPUState, npc), 4920 TCG_AREG0, offsetof(CPUState, npc),
4932 "npc"); 4921 "npc");
  4922 + cpu_y = tcg_global_mem_new(TCG_TYPE_TL,
  4923 + TCG_AREG0, offsetof(CPUState, y), "y");
  4924 +#ifndef CONFIG_USER_ONLY
  4925 + cpu_tbr = tcg_global_mem_new(TCG_TYPE_TL,
  4926 + TCG_AREG0, offsetof(CPUState, tbr),
  4927 + "tbr");
  4928 +#endif
4933 for (i = 1; i < 8; i++) 4929 for (i = 1; i < 8; i++)
4934 cpu_gregs[i] = tcg_global_mem_new(TCG_TYPE_TL, TCG_AREG0, 4930 cpu_gregs[i] = tcg_global_mem_new(TCG_TYPE_TL, TCG_AREG0,
4935 offsetof(CPUState, gregs[i]), 4931 offsetof(CPUState, gregs[i]),