Commit d2856f1ad4c259e5766847c49acbb4e390731bd4

Authored by aurel32
1 parent 923e5e33

Factorize code in translate.c

(Glauber Costa)


git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@4274 c046a42c-6fe2-441c-8c8c-71466251a162
exec-all.h
... ... @@ -67,6 +67,9 @@ extern int loglevel;
67 67  
68 68 int gen_intermediate_code(CPUState *env, struct TranslationBlock *tb);
69 69 int gen_intermediate_code_pc(CPUState *env, struct TranslationBlock *tb);
  70 +void gen_pc_load(CPUState *env, struct TranslationBlock *tb,
  71 + unsigned long searched_pc, int pc_pos, void *puc);
  72 +
70 73 unsigned long code_gen_max_block_size(void);
71 74 void cpu_gen_init(void);
72 75 int cpu_gen_code(CPUState *env, struct TranslationBlock *tb,
... ...
target-alpha/translate.c
... ... @@ -2109,3 +2109,8 @@ CPUAlphaState * cpu_alpha_init (const char *cpu_model)
2109 2109 return env;
2110 2110 }
2111 2111  
  2112 +void gen_pc_load(CPUState *env, TranslationBlock *tb,
  2113 + unsigned long searched_pc, int pc_pos, void *puc)
  2114 +{
  2115 + env->pc = gen_opc_pc[pc_pos];
  2116 +}
... ...
target-arm/translate.c
... ... @@ -8820,3 +8820,8 @@ void cpu_dump_state(CPUState *env, FILE *f,
8820 8820 #endif
8821 8821 }
8822 8822  
  8823 +void gen_pc_load(CPUState *env, TranslationBlock *tb,
  8824 + unsigned long searched_pc, int pc_pos, void *puc)
  8825 +{
  8826 + env->regs[15] = gen_opc_pc[pc_pos];
  8827 +}
... ...
target-cris/translate.c
... ... @@ -2702,3 +2702,9 @@ void cpu_reset (CPUCRISState *env)
2702 2702 memset(env, 0, offsetof(CPUCRISState, breakpoints));
2703 2703 tlb_flush(env, 1);
2704 2704 }
  2705 +
  2706 +void gen_pc_load(CPUState *env, struct TranslationBlock *tb,
  2707 + unsigned long searched_pc, int pc_pos, void *puc)
  2708 +{
  2709 + env->pregs[PR_ERP] = gen_opc_pc[pc_pos];
  2710 +}
... ...
target-i386/translate.c
... ... @@ -6888,3 +6888,26 @@ int gen_intermediate_code_pc(CPUState *env, TranslationBlock *tb)
6888 6888 return gen_intermediate_code_internal(env, tb, 1);
6889 6889 }
6890 6890  
  6891 +void gen_pc_load(CPUState *env, TranslationBlock *tb,
  6892 + unsigned long searched_pc, int pc_pos, void *puc)
  6893 +{
  6894 + int cc_op;
  6895 +#ifdef DEBUG_DISAS
  6896 + if (loglevel & CPU_LOG_TB_OP) {
  6897 + int i;
  6898 + fprintf(logfile, "RESTORE:\n");
  6899 + for(i = 0;i <= pc_pos; i++) {
  6900 + if (gen_opc_instr_start[i]) {
  6901 + fprintf(logfile, "0x%04x: " TARGET_FMT_lx "\n", i, gen_opc_pc[i]);
  6902 + }
  6903 + }
  6904 + fprintf(logfile, "spc=0x%08lx pc_pos=0x%x eip=" TARGET_FMT_lx " cs_base=%x\n",
  6905 + searched_pc, pc_pos, gen_opc_pc[pc_pos] - tb->cs_base,
  6906 + (uint32_t)tb->cs_base);
  6907 + }
  6908 +#endif
  6909 + env->eip = gen_opc_pc[pc_pos] - tb->cs_base;
  6910 + cc_op = gen_opc_cc_op[pc_pos];
  6911 + if (cc_op != CC_OP_DYNAMIC)
  6912 + env->cc_op = cc_op;
  6913 +}
... ...
target-m68k/translate.c
... ... @@ -3280,3 +3280,8 @@ void cpu_dump_state(CPUState *env, FILE *f,
3280 3280 cpu_fprintf (f, "FPRESULT = %12g\n", *(double *)&env->fp_result);
3281 3281 }
3282 3282  
  3283 +void gen_pc_load(CPUState *env, TranslationBlock *tb,
  3284 + unsigned long searched_pc, int pc_pos, void *puc)
  3285 +{
  3286 + env->pc = gen_opc_pc[pc_pos];
  3287 +}
... ...
target-mips/translate.c
... ... @@ -6943,3 +6943,11 @@ void cpu_reset (CPUMIPSState *env)
6943 6943 #endif
6944 6944 cpu_mips_register(env, env->cpu_model);
6945 6945 }
  6946 +
  6947 +void gen_pc_load(CPUState *env, TranslationBlock *tb,
  6948 + unsigned long searched_pc, int pc_pos, void *puc)
  6949 +{
  6950 + env->PC[env->current_tc] = gen_opc_pc[pc_pos];
  6951 + env->hflags &= ~MIPS_HFLAG_BMASK;
  6952 + env->hflags |= gen_opc_hflags[pc_pos];
  6953 +}
... ...
target-ppc/translate.c
... ... @@ -6345,3 +6345,45 @@ int gen_intermediate_code_pc (CPUState *env, struct TranslationBlock *tb)
6345 6345 {
6346 6346 return gen_intermediate_code_internal(env, tb, 1);
6347 6347 }
  6348 +
  6349 +void gen_pc_load(CPUState *env, TranslationBlock *tb,
  6350 + unsigned long searched_pc, int pc_pos, void *puc)
  6351 +{
  6352 + int type, c;
  6353 + /* for PPC, we need to look at the micro operation to get the
  6354 + * access type */
  6355 + env->nip = gen_opc_pc[pc_pos];
  6356 + c = gen_opc_buf[pc_pos];
  6357 + switch(c) {
  6358 +#if defined(CONFIG_USER_ONLY)
  6359 +#define CASE3(op)\
  6360 + case INDEX_op_ ## op ## _raw
  6361 +#else
  6362 +#define CASE3(op)\
  6363 + case INDEX_op_ ## op ## _user:\
  6364 + case INDEX_op_ ## op ## _kernel:\
  6365 + case INDEX_op_ ## op ## _hypv
  6366 +#endif
  6367 +
  6368 + CASE3(stfd):
  6369 + CASE3(stfs):
  6370 + CASE3(lfd):
  6371 + CASE3(lfs):
  6372 + type = ACCESS_FLOAT;
  6373 + break;
  6374 + CASE3(lwarx):
  6375 + type = ACCESS_RES;
  6376 + break;
  6377 + CASE3(stwcx):
  6378 + type = ACCESS_RES;
  6379 + break;
  6380 + CASE3(eciwx):
  6381 + CASE3(ecowx):
  6382 + type = ACCESS_EXT;
  6383 + break;
  6384 + default:
  6385 + type = ACCESS_INT;
  6386 + break;
  6387 + }
  6388 + env->access_type = type;
  6389 +}
... ...
target-sh4/translate.c
... ... @@ -1303,3 +1303,10 @@ int gen_intermediate_code_pc(CPUState * env, struct TranslationBlock *tb)
1303 1303 {
1304 1304 return gen_intermediate_code_internal(env, tb, 1);
1305 1305 }
  1306 +
  1307 +void gen_pc_load(CPUState *env, TranslationBlock *tb,
  1308 + unsigned long searched_pc, int pc_pos, void *puc)
  1309 +{
  1310 + env->pc = gen_opc_pc[pc_pos];
  1311 + env->flags = gen_opc_hflags[pc_pos];
  1312 +}
... ...
target-sparc/translate.c
... ... @@ -4659,3 +4659,23 @@ void gen_intermediate_code_init(CPUSPARCState *env)
4659 4659 gregnames[i]);
4660 4660 }
4661 4661 }
  4662 +
  4663 +void gen_pc_load(CPUState *env, TranslationBlock *tb,
  4664 + unsigned long searched_pc, int pc_pos, void *puc)
  4665 +{
  4666 + target_ulong npc;
  4667 + env->pc = gen_opc_pc[pc_pos];
  4668 + npc = gen_opc_npc[pc_pos];
  4669 + if (npc == 1) {
  4670 + /* dynamic NPC: already stored */
  4671 + } else if (npc == 2) {
  4672 + target_ulong t2 = (target_ulong)(unsigned long)puc;
  4673 + /* jump PC: use T2 and the jump targets of the translation */
  4674 + if (t2)
  4675 + env->npc = gen_opc_jump_pc[0];
  4676 + else
  4677 + env->npc = gen_opc_jump_pc[1];
  4678 + } else {
  4679 + env->npc = npc;
  4680 + }
  4681 +}
... ...
translate-all.c
... ... @@ -194,102 +194,8 @@ int cpu_restore_state(TranslationBlock *tb,
194 194 /* now find start of instruction before */
195 195 while (gen_opc_instr_start[j] == 0)
196 196 j--;
197   -#if defined(TARGET_I386)
198   - {
199   - int cc_op;
200   -#ifdef DEBUG_DISAS
201   - if (loglevel & CPU_LOG_TB_OP) {
202   - int i;
203   - fprintf(logfile, "RESTORE:\n");
204   - for(i=0;i<=j; i++) {
205   - if (gen_opc_instr_start[i]) {
206   - fprintf(logfile, "0x%04x: " TARGET_FMT_lx "\n", i, gen_opc_pc[i]);
207   - }
208   - }
209   - fprintf(logfile, "spc=0x%08lx j=0x%x eip=" TARGET_FMT_lx " cs_base=%x\n",
210   - searched_pc, j, gen_opc_pc[j] - tb->cs_base,
211   - (uint32_t)tb->cs_base);
212   - }
213   -#endif
214   - env->eip = gen_opc_pc[j] - tb->cs_base;
215   - cc_op = gen_opc_cc_op[j];
216   - if (cc_op != CC_OP_DYNAMIC)
217   - env->cc_op = cc_op;
218   - }
219   -#elif defined(TARGET_ARM)
220   - env->regs[15] = gen_opc_pc[j];
221   -#elif defined(TARGET_SPARC)
222   - {
223   - target_ulong npc;
224   - env->pc = gen_opc_pc[j];
225   - npc = gen_opc_npc[j];
226   - if (npc == 1) {
227   - /* dynamic NPC: already stored */
228   - } else if (npc == 2) {
229   - target_ulong t2 = (target_ulong)(unsigned long)puc;
230   - /* jump PC: use T2 and the jump targets of the translation */
231   - if (t2)
232   - env->npc = gen_opc_jump_pc[0];
233   - else
234   - env->npc = gen_opc_jump_pc[1];
235   - } else {
236   - env->npc = npc;
237   - }
238   - }
239   -#elif defined(TARGET_PPC)
240   - {
241   - int type, c;
242   - /* for PPC, we need to look at the micro operation to get the
243   - access type */
244   - env->nip = gen_opc_pc[j];
245   - c = gen_opc_buf[j];
246   - switch(c) {
247   -#if defined(CONFIG_USER_ONLY)
248   -#define CASE3(op)\
249   - case INDEX_op_ ## op ## _raw
250   -#else
251   -#define CASE3(op)\
252   - case INDEX_op_ ## op ## _user:\
253   - case INDEX_op_ ## op ## _kernel:\
254   - case INDEX_op_ ## op ## _hypv
255   -#endif
256 197  
257   - CASE3(stfd):
258   - CASE3(stfs):
259   - CASE3(lfd):
260   - CASE3(lfs):
261   - type = ACCESS_FLOAT;
262   - break;
263   - CASE3(lwarx):
264   - type = ACCESS_RES;
265   - break;
266   - CASE3(stwcx):
267   - type = ACCESS_RES;
268   - break;
269   - CASE3(eciwx):
270   - CASE3(ecowx):
271   - type = ACCESS_EXT;
272   - break;
273   - default:
274   - type = ACCESS_INT;
275   - break;
276   - }
277   - env->access_type = type;
278   - }
279   -#elif defined(TARGET_M68K)
280   - env->pc = gen_opc_pc[j];
281   -#elif defined(TARGET_MIPS)
282   - env->PC[env->current_tc] = gen_opc_pc[j];
283   - env->hflags &= ~MIPS_HFLAG_BMASK;
284   - env->hflags |= gen_opc_hflags[j];
285   -#elif defined(TARGET_ALPHA)
286   - env->pc = gen_opc_pc[j];
287   -#elif defined(TARGET_SH4)
288   - env->pc = gen_opc_pc[j];
289   - env->flags = gen_opc_hflags[j];
290   -#elif defined(TARGET_CRIS)
291   - env->pregs[PR_ERP] = gen_opc_pc[j];
292   -#endif
  198 + gen_pc_load(env, tb, searched_pc, j, puc);
293 199  
294 200 #ifdef CONFIG_PROFILER
295 201 dyngen_restore_time += profile_getclock() - ti;
... ...