From: kub Date: Sat, 5 Oct 2019 09:17:49 +0000 (+0200) Subject: sh2 drc: fix i386 regression X-Git-Tag: v2.00~828 X-Git-Url: https://notaz.gp2x.de/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=c3ebe082d3c26ab4f80b7aa2f0b3a020f0ce45af;p=picodrive.git sh2 drc: fix i386 regression --- diff --git a/cpu/sh2/compiler.c b/cpu/sh2/compiler.c index 449ae0e1..09546634 100644 --- a/cpu/sh2/compiler.c +++ b/cpu/sh2/compiler.c @@ -1682,6 +1682,7 @@ static void rcache_clean_vreg(int x) if (guest_regs[r].flags & (GRF_STATIC|GRF_PINNED)) { if (guest_regs[r].vreg != guest_regs[r].sreg && !cache_regs[guest_regs[r].sreg].locked && + (~rcache_regs_discard & (1 << r)) && !(rns & cache_regs[guest_regs[r].sreg].gregs)) { // statically mapped reg not in its sreg. move back to sreg rcache_evict_vreg(guest_regs[r].sreg); @@ -1820,6 +1821,8 @@ static int rcache_allocate_nontemp(void) static int rcache_allocate_temp(void) { int x = rcache_allocate(-1, 1); + if (x < 0) + x = rcache_allocate(0, 0); return x; } @@ -3404,16 +3407,16 @@ static void REGPARM(2) *sh2_translate(SH2 *sh2, int tcache_id) // regs needed in the next few instructions if (v <= 4) soon = late; - } else { - // upcoming rcache_flush, start writing back unused dirty stuff - rcache_set_usage_discard(write & ~(late|soon|opd[0].source)); - rcache_clean_masked(rcache_dirty_mask() & ~(write|opd[0].dest)); + } else break; - } } rcache_set_usage_now(opd[0].source); // current insn rcache_set_usage_soon(soon); // insns 1-4 rcache_set_usage_late(late & ~soon); // insns 5-9 + rcache_set_usage_discard(write & ~(late|soon|opd[0].source)); + if (v <= 9) + // upcoming rcache_flush, start writing back unused dirty stuff + rcache_clean_masked(rcache_dirty_mask() & ~(write|opd[0].dest)); switch (opd->op) { @@ -3826,6 +3829,7 @@ static void REGPARM(2) *sh2_translate(SH2 *sh2, int tcache_id) emith_tpop_carry(sr, 0); emith_adcf_r_r_r(tmp2, tmp, tmp); emith_tpush_carry(sr, 0); // keep Q1 in T for now + rcache_free(tmp); tmp4 = rcache_get_tmp(); emith_and_r_r_imm(tmp4, sr, M); emith_eor_r_r_lsr(sr, tmp4, M_SHIFT - Q_SHIFT); // Q ^= M