X-Git-Url: https://notaz.gp2x.de/cgi-bin/gitweb.cgi?a=blobdiff_plain;ds=sidebyside;f=deps%2Flightrec%2Fconstprop.c;h=97670bcfca5fd95c99d27939fafdc2cebe9843ed;hb=8afce295870dc97704b0e9e1efe1801b6b56090d;hp=19403a69793f517dda47aa65cda780b9b1357d8a;hpb=2b1b10dd333f8b525b90a15468824aae0ff4eb2f;p=pcsx_rearmed.git diff --git a/deps/lightrec/constprop.c b/deps/lightrec/constprop.c index 19403a69..97670bcf 100644 --- a/deps/lightrec/constprop.c +++ b/deps/lightrec/constprop.c @@ -335,8 +335,9 @@ void lightrec_consts_propagate(const struct block *block, case OP_SPECIAL_SRA: v[c.r.rd].value = (s32)v[c.r.rt].value >> c.r.imm; + v[c.r.rd].sign = (s32)(v[c.r.rt].sign + | (~v[c.r.rt].known & 0x80000000)) >> c.r.imm; v[c.r.rd].known = (s32)v[c.r.rt].known >> c.r.imm; - v[c.r.rd].sign = (s32)v[c.r.rt].sign >> c.r.imm; break; case OP_SPECIAL_SLLV: @@ -370,8 +371,9 @@ void lightrec_consts_propagate(const struct block *block, if ((v[c.r.rs].known & 0x1f) == 0x1f) { imm = v[c.r.rs].value & 0x1f; v[c.r.rd].value = (s32)v[c.r.rt].value >> imm; + v[c.r.rd].sign = (s32)(v[c.r.rt].sign + | (~v[c.r.rt].known & 0x80000000)) >> imm; v[c.r.rd].known = (s32)v[c.r.rt].known >> imm; - v[c.r.rd].sign = (s32)v[c.r.rt].sign >> imm; } else { v[c.r.rd].known = 0; v[c.r.rd].sign = 0; @@ -734,7 +736,7 @@ lightrec_get_constprop_map(const struct lightrec_state *state, if ((min & 0xe0000000) != (max & 0xe0000000)) return PSX_MAP_UNKNOWN; - pr_debug("Min: 0x%08x max: 0x%08x Known: 0x%08x Sign: 0x%08x\n", + pr_debug("Min: "X32_FMT" max: "X32_FMT" Known: "X32_FMT" Sign: "X32_FMT"\n", min, max, v[reg].known, v[reg].sign); min = kunseg(min);