cdriso: fix up chd for separated subq reads
[pcsx_rearmed.git] / deps / lightrec / optimizer.c
index 0190722..10067a7 100644 (file)
@@ -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);
@@ -763,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;
        }
@@ -1094,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: