git subrepo pull --force deps/lightrec
[pcsx_rearmed.git] / deps / lightrec / constprop.c
index bdae0e2..97670bc 100644 (file)
@@ -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;
@@ -733,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);