X-Git-Url: https://notaz.gp2x.de/cgi-bin/gitweb.cgi?a=blobdiff_plain;ds=sidebyside;f=deps%2Flightrec%2Fconstprop.c;h=b21339aa59c2aebc4e847d4f59b89a361243016d;hb=878e6cda26bbf4af5090a01709db026d42c233b4;hp=bdae0e2f5904d56bff58fb808dfe4713cc6c1773;hpb=03b78a3bf48813202e01149ae0b3c5c1f01efb4c;p=pcsx_rearmed.git diff --git a/deps/lightrec/constprop.c b/deps/lightrec/constprop.c index bdae0e2f..b21339aa 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; @@ -662,6 +664,7 @@ void lightrec_consts_propagate(const struct block *block, } fallthrough; case OP_LW: + case OP_META_LWU: v[c.i.rt].known = 0; v[c.i.rt].sign = 0; break;