Commit 3a8a44c4a8b31cc4e84a277e4e08faafa022de5e
1 parent
829337a6
SH4: convert a few control or system register functions to TCG
Signed-off-by: Aurelien Jarno <aurelien@aurel32.net> git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@5107 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
2 changed files
with
46 additions
and
69 deletions
target-sh4/op.c
... | ... | @@ -107,42 +107,12 @@ void OPPROTO op_rts(void) |
107 | 107 | RETURN(); |
108 | 108 | } |
109 | 109 | |
110 | -void OPPROTO op_clrmac(void) | |
111 | -{ | |
112 | - env->mach = env->macl = 0; | |
113 | - RETURN(); | |
114 | -} | |
115 | - | |
116 | -void OPPROTO op_clrs(void) | |
117 | -{ | |
118 | - env->sr &= ~SR_S; | |
119 | - RETURN(); | |
120 | -} | |
121 | - | |
122 | -void OPPROTO op_clrt(void) | |
123 | -{ | |
124 | - env->sr &= ~SR_T; | |
125 | - RETURN(); | |
126 | -} | |
127 | - | |
128 | 110 | void OPPROTO op_ldtlb(void) |
129 | 111 | { |
130 | 112 | helper_ldtlb(); |
131 | 113 | RETURN(); |
132 | 114 | } |
133 | 115 | |
134 | -void OPPROTO op_sets(void) | |
135 | -{ | |
136 | - env->sr |= SR_S; | |
137 | - RETURN(); | |
138 | -} | |
139 | - | |
140 | -void OPPROTO op_sett(void) | |
141 | -{ | |
142 | - env->sr |= SR_T; | |
143 | - RETURN(); | |
144 | -} | |
145 | - | |
146 | 116 | void OPPROTO op_frchg(void) |
147 | 117 | { |
148 | 118 | env->fpscr ^= FPSCR_FR; |
... | ... | @@ -233,12 +203,6 @@ void OPPROTO op_div0s_T0_T1(void) |
233 | 203 | RETURN(); |
234 | 204 | } |
235 | 205 | |
236 | -void OPPROTO op_div0u(void) | |
237 | -{ | |
238 | - env->sr &= ~(SR_M | SR_Q | SR_T); | |
239 | - RETURN(); | |
240 | -} | |
241 | - | |
242 | 206 | void OPPROTO op_div1_T0_T1(void) |
243 | 207 | { |
244 | 208 | helper_div1_T0_T1(); |
... | ... | @@ -406,12 +370,6 @@ void OPPROTO op_sts_fpscr_T0(void) |
406 | 370 | RETURN(); |
407 | 371 | } |
408 | 372 | |
409 | -void OPPROTO op_movt_rN(void) | |
410 | -{ | |
411 | - env->gregs[PARAM1] = env->sr & SR_T; | |
412 | - RETURN(); | |
413 | -} | |
414 | - | |
415 | 373 | void OPPROTO op_rotcl_Rn(void) |
416 | 374 | { |
417 | 375 | helper_rotcl(&env->gregs[PARAM1]); |
... | ... | @@ -676,12 +634,6 @@ void OPPROTO op_movl_FT0_fpul(void) |
676 | 634 | RETURN(); |
677 | 635 | } |
678 | 636 | |
679 | -void OPPROTO op_movl_imm_PC(void) | |
680 | -{ | |
681 | - env->pc = PARAM1; | |
682 | - RETURN(); | |
683 | -} | |
684 | - | |
685 | 637 | void OPPROTO op_jT(void) |
686 | 638 | { |
687 | 639 | if (env->sr & SR_T) |
... | ... | @@ -704,12 +656,6 @@ void OPPROTO op_movl_delayed_pc_PC(void) |
704 | 656 | RETURN(); |
705 | 657 | } |
706 | 658 | |
707 | -void OPPROTO op_addl_GBR_T0(void) | |
708 | -{ | |
709 | - T0 += env->gbr; | |
710 | - RETURN(); | |
711 | -} | |
712 | - | |
713 | 659 | void OPPROTO op_tst_imm_T0(void) |
714 | 660 | { |
715 | 661 | cond_t((T0 & PARAM1) == 0); | ... | ... |
target-sh4/translate.c
... | ... | @@ -60,6 +60,9 @@ enum { |
60 | 60 | /* global register indexes */ |
61 | 61 | static TCGv cpu_env; |
62 | 62 | static TCGv cpu_gregs[24]; |
63 | +static TCGv cpu_pc, cpu_sr, cpu_ssr, cpu_spc, cpu_gbr; | |
64 | +static TCGv cpu_vbr, cpu_sgr, cpu_dbr, cpu_mach, cpu_macl; | |
65 | +static TCGv cpu_pr, cpu_fpscr, cpu_fpul; | |
63 | 66 | |
64 | 67 | /* dyngen register indexes */ |
65 | 68 | static TCGv cpu_T[2]; |
... | ... | @@ -90,6 +93,33 @@ static void sh4_translate_init(void) |
90 | 93 | offsetof(CPUState, gregs[i]), |
91 | 94 | gregnames[i]); |
92 | 95 | |
96 | + cpu_pc = tcg_global_mem_new(TCG_TYPE_I32, TCG_AREG0, | |
97 | + offsetof(CPUState, pc), "PC"); | |
98 | + cpu_sr = tcg_global_mem_new(TCG_TYPE_I32, TCG_AREG0, | |
99 | + offsetof(CPUState, sr), "SR"); | |
100 | + cpu_ssr = tcg_global_mem_new(TCG_TYPE_I32, TCG_AREG0, | |
101 | + offsetof(CPUState, ssr), "SSR"); | |
102 | + cpu_spc = tcg_global_mem_new(TCG_TYPE_I32, TCG_AREG0, | |
103 | + offsetof(CPUState, spc), "SPC"); | |
104 | + cpu_gbr = tcg_global_mem_new(TCG_TYPE_I32, TCG_AREG0, | |
105 | + offsetof(CPUState, gbr), "GBR"); | |
106 | + cpu_vbr = tcg_global_mem_new(TCG_TYPE_I32, TCG_AREG0, | |
107 | + offsetof(CPUState, vbr), "VBR"); | |
108 | + cpu_sgr = tcg_global_mem_new(TCG_TYPE_I32, TCG_AREG0, | |
109 | + offsetof(CPUState, sgr), "SGR"); | |
110 | + cpu_dbr = tcg_global_mem_new(TCG_TYPE_I32, TCG_AREG0, | |
111 | + offsetof(CPUState, dbr), "DBR"); | |
112 | + cpu_mach = tcg_global_mem_new(TCG_TYPE_I32, TCG_AREG0, | |
113 | + offsetof(CPUState, mach), "MACH"); | |
114 | + cpu_macl = tcg_global_mem_new(TCG_TYPE_I32, TCG_AREG0, | |
115 | + offsetof(CPUState, macl), "MACL"); | |
116 | + cpu_pr = tcg_global_mem_new(TCG_TYPE_I32, TCG_AREG0, | |
117 | + offsetof(CPUState, pr), "PR"); | |
118 | + cpu_fpscr = tcg_global_mem_new(TCG_TYPE_I32, TCG_AREG0, | |
119 | + offsetof(CPUState, fpscr), "FPSCR"); | |
120 | + cpu_fpul = tcg_global_mem_new(TCG_TYPE_I32, TCG_AREG0, | |
121 | + offsetof(CPUState, fpul), "FPUL"); | |
122 | + | |
93 | 123 | /* register helpers */ |
94 | 124 | #undef DEF_HELPER |
95 | 125 | #define DEF_HELPER(ret, name, params) tcg_register_helper(name, #name); |
... | ... | @@ -204,10 +234,10 @@ static void gen_goto_tb(DisasContext * ctx, int n, target_ulong dest) |
204 | 234 | !ctx->singlestep_enabled) { |
205 | 235 | /* Use a direct jump if in same page and singlestep not enabled */ |
206 | 236 | tcg_gen_goto_tb(n); |
207 | - gen_op_movl_imm_PC(dest); | |
237 | + tcg_gen_movi_i32(cpu_pc, dest); | |
208 | 238 | tcg_gen_exit_tb((long) tb + n); |
209 | 239 | } else { |
210 | - gen_op_movl_imm_PC(dest); | |
240 | + tcg_gen_movi_i32(cpu_pc, dest); | |
211 | 241 | if (ctx->singlestep_enabled) |
212 | 242 | gen_op_debug(); |
213 | 243 | tcg_gen_exit_tb(0); |
... | ... | @@ -286,7 +316,7 @@ void _decode_opc(DisasContext * ctx) |
286 | 316 | #endif |
287 | 317 | switch (ctx->opcode) { |
288 | 318 | case 0x0019: /* div0u */ |
289 | - gen_op_div0u(); | |
319 | + tcg_gen_andi_i32(cpu_sr, cpu_sr, ~(SR_M | SR_Q | SR_T)); | |
290 | 320 | return; |
291 | 321 | case 0x000b: /* rts */ |
292 | 322 | CHECK_NOT_DELAY_SLOT gen_op_rts(); |
... | ... | @@ -294,13 +324,14 @@ void _decode_opc(DisasContext * ctx) |
294 | 324 | ctx->delayed_pc = (uint32_t) - 1; |
295 | 325 | return; |
296 | 326 | case 0x0028: /* clrmac */ |
297 | - gen_op_clrmac(); | |
327 | + tcg_gen_movi_i32(cpu_mach, 0); | |
328 | + tcg_gen_movi_i32(cpu_macl, 0); | |
298 | 329 | return; |
299 | 330 | case 0x0048: /* clrs */ |
300 | - gen_op_clrs(); | |
331 | + tcg_gen_andi_i32(cpu_sr, cpu_sr, ~SR_S); | |
301 | 332 | return; |
302 | 333 | case 0x0008: /* clrt */ |
303 | - gen_op_clrt(); | |
334 | + tcg_gen_andi_i32(cpu_sr, cpu_sr, ~SR_T); | |
304 | 335 | return; |
305 | 336 | case 0x0038: /* ldtlb */ |
306 | 337 | #if defined(CONFIG_USER_ONLY) |
... | ... | @@ -315,10 +346,10 @@ void _decode_opc(DisasContext * ctx) |
315 | 346 | ctx->delayed_pc = (uint32_t) - 1; |
316 | 347 | return; |
317 | 348 | case 0x0058: /* sets */ |
318 | - gen_op_sets(); | |
349 | + tcg_gen_ori_i32(cpu_sr, cpu_sr, SR_S); | |
319 | 350 | return; |
320 | 351 | case 0x0018: /* sett */ |
321 | - gen_op_sett(); | |
352 | + tcg_gen_ori_i32(cpu_sr, cpu_sr, SR_T); | |
322 | 353 | return; |
323 | 354 | case 0xfbfd: /* frchg */ |
324 | 355 | gen_op_frchg(); |
... | ... | @@ -850,7 +881,7 @@ void _decode_opc(DisasContext * ctx) |
850 | 881 | return; |
851 | 882 | case 0xcd00: /* and.b #imm,@(R0,GBR) */ |
852 | 883 | tcg_gen_mov_i32(cpu_T[0], cpu_gregs[REG(0)]); |
853 | - gen_op_addl_GBR_T0(); | |
884 | + tcg_gen_add_i32(cpu_T[0], cpu_T[0], cpu_gbr); | |
854 | 885 | tcg_gen_mov_i32(cpu_T[1], cpu_T[0]); |
855 | 886 | gen_op_ldub_T0_T0(ctx); |
856 | 887 | tcg_gen_andi_i32(cpu_T[0], cpu_T[0], B7_0); |
... | ... | @@ -954,14 +985,14 @@ void _decode_opc(DisasContext * ctx) |
954 | 985 | return; |
955 | 986 | case 0xcf00: /* or.b #imm,@(R0,GBR) */ |
956 | 987 | tcg_gen_mov_i32(cpu_T[0], cpu_gregs[REG(0)]); |
957 | - gen_op_addl_GBR_T0(); | |
988 | + tcg_gen_add_i32(cpu_T[0], cpu_T[0], cpu_gbr); | |
958 | 989 | tcg_gen_mov_i32(cpu_T[0], cpu_T[1]); |
959 | 990 | gen_op_ldub_T0_T0(ctx); |
960 | 991 | tcg_gen_ori_i32(cpu_T[0], cpu_T[0], B7_0); |
961 | 992 | gen_op_stb_T0_T1(ctx); |
962 | 993 | return; |
963 | 994 | case 0xc300: /* trapa #imm */ |
964 | - CHECK_NOT_DELAY_SLOT gen_op_movl_imm_PC(ctx->pc); | |
995 | + CHECK_NOT_DELAY_SLOT tcg_gen_movi_i32(cpu_pc, ctx->pc); | |
965 | 996 | gen_op_trapa(B7_0); |
966 | 997 | ctx->bstate = BS_BRANCH; |
967 | 998 | return; |
... | ... | @@ -970,7 +1001,7 @@ void _decode_opc(DisasContext * ctx) |
970 | 1001 | return; |
971 | 1002 | case 0xcc00: /* tst.b #imm,@(R0,GBR) */ |
972 | 1003 | tcg_gen_mov_i32(cpu_T[0], cpu_gregs[REG(0)]); |
973 | - gen_op_addl_GBR_T0(); | |
1004 | + tcg_gen_add_i32(cpu_T[0], cpu_T[0], cpu_gbr); | |
974 | 1005 | gen_op_ldub_T0_T0(ctx); |
975 | 1006 | gen_op_tst_imm_T0(B7_0); |
976 | 1007 | return; |
... | ... | @@ -979,7 +1010,7 @@ void _decode_opc(DisasContext * ctx) |
979 | 1010 | return; |
980 | 1011 | case 0xce00: /* xor.b #imm,@(R0,GBR) */ |
981 | 1012 | tcg_gen_mov_i32(cpu_T[0], cpu_gregs[REG(0)]); |
982 | - gen_op_addl_GBR_T0(); | |
1013 | + tcg_gen_add_i32(cpu_T[0], cpu_T[0], cpu_gbr); | |
983 | 1014 | tcg_gen_mov_i32(cpu_T[1], cpu_T[0]); |
984 | 1015 | gen_op_ldub_T0_T0(ctx); |
985 | 1016 | tcg_gen_xori_i32(cpu_T[0], cpu_T[0], B7_0); |
... | ... | @@ -1096,7 +1127,7 @@ void _decode_opc(DisasContext * ctx) |
1096 | 1127 | gen_op_stl_T0_T1(ctx); |
1097 | 1128 | return; |
1098 | 1129 | case 0x0029: /* movt Rn */ |
1099 | - gen_op_movt_rN(REG(B11_8)); | |
1130 | + tcg_gen_andi_i32(cpu_gregs[REG(B11_8)], cpu_sr, SR_T); | |
1100 | 1131 | return; |
1101 | 1132 | case 0x0093: /* ocbi @Rn */ |
1102 | 1133 | tcg_gen_mov_i32(cpu_T[0], cpu_gregs[REG(B11_8)]); |
... | ... | @@ -1329,7 +1360,7 @@ gen_intermediate_code_internal(CPUState * env, TranslationBlock * tb, |
1329 | 1360 | for (i = 0; i < env->nb_breakpoints; i++) { |
1330 | 1361 | if (ctx.pc == env->breakpoints[i]) { |
1331 | 1362 | /* We have hit a breakpoint - make sure PC is up-to-date */ |
1332 | - gen_op_movl_imm_PC(ctx.pc); | |
1363 | + tcg_gen_movi_i32(cpu_pc, ctx.pc); | |
1333 | 1364 | gen_op_debug(); |
1334 | 1365 | ctx.bstate = BS_EXCP; |
1335 | 1366 | break; | ... | ... |