X-Git-Url: https://notaz.gp2x.de/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=deps%2Flightrec%2Foptimizer.c;h=10067a7d082d72d42ece4487a41445c6e87903c6;hb=aeb8209980cab1c6e30f4d05a50c2b3c2a366d6a;hp=2eba60ed2ea9ec7f0313897417d2b2351dad7ff1;hpb=ba3814c189d3bd2332b66fb6c633a7d028e618fe;p=pcsx_rearmed.git diff --git a/deps/lightrec/optimizer.c b/deps/lightrec/optimizer.c index 2eba60ed..10067a7d 100644 --- a/deps/lightrec/optimizer.c +++ b/deps/lightrec/optimizer.c @@ -181,6 +181,8 @@ static u64 opcode_write_mask(union code op) case OP_LBU: case OP_LHU: case OP_LWR: + case OP_META_EXTC: + case OP_META_EXTS: return BIT(op.i.rt); case OP_JAL: return BIT(31); @@ -635,6 +637,10 @@ static u32 lightrec_propagate_consts(const struct opcode *op, if (OPT_FLAG_MULT_DIV && c.r.imm) known &= ~BIT(c.r.imm); break; + case OP_SPECIAL_MFLO: + case OP_SPECIAL_MFHI: + known &= ~BIT(c.r.rd); + break; default: break; } @@ -759,6 +765,22 @@ static u32 lightrec_propagate_consts(const struct opcode *op, known &= ~BIT(c.r.rd); } break; + case OP_META_EXTC: + if (known & BIT(c.i.rs)) { + known |= BIT(c.i.rt); + v[c.i.rt] = (s32)(s8)v[c.i.rs]; + } else { + known &= ~BIT(c.i.rt); + } + break; + case OP_META_EXTS: + if (known & BIT(c.i.rs)) { + known |= BIT(c.i.rt); + v[c.i.rt] = (s32)(s16)v[c.i.rs]; + } else { + known &= ~BIT(c.i.rt); + } + break; default: break; } @@ -1090,7 +1112,7 @@ static int lightrec_transform_ops(struct lightrec_state *state, struct block *bl else op->i.op = OP_META_MULTU2; - op->r.op = ffs32(values[op->r.rt]); + op->r.op = ctz32(values[op->r.rt]); break; case OP_SPECIAL_OR: case OP_SPECIAL_ADD: @@ -1645,6 +1667,9 @@ static int lightrec_flag_io(struct lightrec_state *state, struct block *block) pr_debug("Flagging opcode %u as direct I/O access\n", i); list->flags |= LIGHTREC_IO_MODE(LIGHTREC_IO_DIRECT_HW); + + if (no_mask) + list->flags |= LIGHTREC_NO_MASK; break; } fallthrough;