X-Git-Url: https://notaz.gp2x.de/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=cpu%2Fsh2%2Fcompiler.c;h=46acb522b68588f45126240fbdab76d4806571c6;hb=6d7979571d08d7b020022fa169a34a29fc20dfdc;hp=bdf2cea767ed80911d5ae03c16932f608b3a4abe;hpb=bf092a3631694f525c3d1179b21ab8941e87e7d7;p=picodrive.git diff --git a/cpu/sh2/compiler.c b/cpu/sh2/compiler.c index bdf2cea..46acb52 100644 --- a/cpu/sh2/compiler.c +++ b/cpu/sh2/compiler.c @@ -572,7 +572,7 @@ static void *dr_prepare_ext_branch(u32 pc, int is_slave, int tcache_id) break; cnt = i + 1; if (cnt >= block_link_pool_max_counts[tcache_id]) { - dbg(1, "bl overflow for tcache %d\n", tcache_id); + dbg(1, "bl overflow for tcache %d", tcache_id); return NULL; } bl += cnt; @@ -994,6 +994,18 @@ static void rcache_unlock_all(void) reg_temp[i].flags &= ~HRF_LOCKED; } +static inline u32 rcache_used_hreg_mask(void) +{ + u32 mask = 0; + int i; + + for (i = 0; i < ARRAY_SIZE(reg_temp); i++) + if (reg_temp[i].type != HR_FREE) + mask |= 1 << reg_temp[i].hreg; + + return mask; +} + static void rcache_clean(void) { int i; @@ -1477,16 +1489,18 @@ static void REGPARM(2) *sh2_translate(SH2 *sh2, int tcache_id) emit_move_r_imm32(SHR_PC, pc); sr = rcache_get_reg(SHR_SR, RC_GR_RMW); FLUSH_CYCLES(sr); - // rcache_clean(); // FIXME - rcache_flush(); + rcache_clean(); + + tmp = rcache_used_hreg_mask(); + emith_save_caller_regs(tmp); emit_do_static_regs(1, 0); emith_pass_arg_r(0, CONTEXT_REG); emith_call(do_sh2_cmp); + emith_restore_caller_regs(tmp); } #endif pc += 2; - cycles += opd->cycles; if (skip_op > 0) { skip_op--; @@ -2517,6 +2531,8 @@ static void REGPARM(2) *sh2_translate(SH2 *sh2, int tcache_id) end_op: rcache_unlock_all(); + cycles += opd->cycles; + if (op_flags[i+1] & OF_DELAY_OP) { do_host_disasm(tcache_id); continue; @@ -3083,9 +3099,6 @@ int sh2_drc_init(SH2 *sh2) for (i = 1; i < ARRAY_SIZE(tcache_bases); i++) tcache_bases[i] = tcache_ptrs[i] = tcache_bases[i - 1] + tcache_sizes[i - 1]; - // tmp - PicoOpt |= POPT_DIS_VDP_FIFO; - #if (DRC_DEBUG & 4) for (i = 0; i < ARRAY_SIZE(block_tables); i++) tcache_dsm_ptrs[i] = tcache_bases[i];