Use 'if' to make sure the real msb greater than the lsb. As the compiler may not do this.
Signed-off-by: Dongxue Zhang <[email protected]> --- target-mips/translate.c | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/target-mips/translate.c b/target-mips/translate.c index c381366..e2cce31 100644 --- a/target-mips/translate.c +++ b/target-mips/translate.c @@ -3946,14 +3946,23 @@ static void gen_bitops (DisasContext *ctx, uint32_t opc, int rt, break; #if defined(TARGET_MIPS64) case OPC_DINSM: + if (lsb > (msb + 32)) { + goto fail; + } gen_load_gpr(t0, rt); tcg_gen_deposit_tl(t0, t0, t1, lsb, msb + 32 - lsb + 1); break; case OPC_DINSU: + if (lsb > msb) { + goto fail; + } gen_load_gpr(t0, rt); tcg_gen_deposit_tl(t0, t0, t1, lsb + 32, msb - lsb + 1); break; case OPC_DINS: + if (lsb > msb) { + goto fail; + } gen_load_gpr(t0, rt); tcg_gen_deposit_tl(t0, t0, t1, lsb, msb - lsb + 1); break; -- 1.8.1.2
