Revision d2856f1a
b/exec-all.h | ||
---|---|---|
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, |
b/target-alpha/translate.c | ||
---|---|---|
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 |
} |
b/target-arm/translate.c | ||
---|---|---|
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 |
} |
b/target-cris/translate.c | ||
---|---|---|
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 |
} |
b/target-i386/translate.c | ||
---|---|---|
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 |
} |
b/target-m68k/translate.c | ||
---|---|---|
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 |
} |
b/target-mips/translate.c | ||
---|---|---|
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 |
} |
b/target-ppc/translate.c | ||
---|---|---|
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 |
} |
b/target-sh4/translate.c | ||
---|---|---|
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 |
} |
b/target-sparc/translate.c | ||
---|---|---|
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 |
} |
b/translate-all.c | ||
---|---|---|
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; |
Also available in: Unified diff