switch (opc1) {
case 0x0B: // cmpi (Compare Immediate, p398)
- DIP("cmpi crf%d,%u,r%d,0x%x\n", crfD, flag_L, Ra_addr, SIMM_16);
EXTS_SIMM = extend_s_16to32(SIMM_16);
+ DIP("cmpi crf%d,%u,r%d,0x%x\n", crfD, flag_L, Ra_addr, EXTS_SIMM);
irx_tst1 = binop(Iop_CmpEQ32, mkexpr(Ra), mkU32(EXTS_SIMM));
irx_tst2 = binop(Iop_CmpLT32S, mkexpr(Ra), mkU32(EXTS_SIMM));
break;
vassert(op1 < 0x40);
vassert(r1 < 0x20);
vassert(r2 < 0x20);
- vassert(imm < 0x10000 || imm >= 0xFFFF0000); // Pos|Neg
+ vassert(imm < 0x10000 || imm >= 0xFFFF8000); // Pos|Neg
+ imm = imm & 0xFFFF;
UInt theInstr = ((op1<<26) | (r1<<21) | (r2<<16) | (imm));
return emit32(p, theInstr);
}