mips: fix corner case for INS instruction
This change fixes corner case for INS instruction when lsb = 0.
The test in none/tests/mips32/MIPS32int.c will be extended to include
additional test cases that trigger this condition.
git-svn-id: svn://svn.valgrind.org/vex/trunk@2715 8f6e269a-dfd6-0310-a8e1-e2731360e62c
diff --git a/priv/guest_mips_toIR.c b/priv/guest_mips_toIR.c
index 62f67f1..02632d0 100644
--- a/priv/guest_mips_toIR.c
+++ b/priv/guest_mips_toIR.c
@@ -4614,7 +4614,8 @@
assign(t2, binop(Iop_Shl32, mkNarrowTo32(ty, getIReg(rt)),
mkU8(32 - lsb)));
assign(t3, binop(Iop_Shr32, mkexpr(t2), mkU8(32 - lsb)));
- }
+ } else
+ assign(t3, mkU32(0));
if (msb < 31) {
t4 = newTemp(Ity_I32);
@@ -4629,14 +4630,14 @@
t6 = newTemp(Ity_I32);
assign(t6, binop(Iop_Or32, mkexpr(t5), mkexpr(t1)));
putIReg(rt, mkWidenFrom32(ty, binop(Iop_Or32, mkexpr(t6),
- mkexpr(t3)), False));
+ mkexpr(t3)), True));
} else {
putIReg(rt, mkWidenFrom32(ty, binop(Iop_Or32, mkexpr(t1),
- mkexpr(t5)), False));
+ mkexpr(t5)), True));
}
} else {
putIReg(rt, mkWidenFrom32(ty, binop(Iop_Or32, mkexpr(t1),
- mkexpr(t3)), False));
+ mkexpr(t3)), True));
}
break;