|
From: <sv...@va...> - 2013-04-27 01:12:33
|
petarj 2013-04-27 02:15:48 +0100 (Sat, 27 Apr 2013)
New Revision: 2715
Log:
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.
Modified files:
trunk/priv/guest_mips_toIR.c
Modified: trunk/priv/guest_mips_toIR.c (+5 -4)
===================================================================
--- trunk/priv/guest_mips_toIR.c 2013-04-26 11:24:31 +01:00 (rev 2714)
+++ trunk/priv/guest_mips_toIR.c 2013-04-27 02:15:48 +01:00 (rev 2715)
@@ -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;
|