|
From: <sv...@va...> - 2012-07-11 16:46:58
|
sewardj 2012-07-11 17:46:47 +0100 (Wed, 11 Jul 2012)
New Revision: 2425
Log:
Implement (T1) SMMUL{R}. Fixes #300140. (Evgeniy Stepanov,
eug...@gm...) w/ fixes.
Modified files:
trunk/priv/guest_arm_toIR.c
Modified: trunk/priv/guest_arm_toIR.c (+22 -0)
===================================================================
--- trunk/priv/guest_arm_toIR.c 2012-07-11 14:19:10 +01:00 (rev 2424)
+++ trunk/priv/guest_arm_toIR.c 2012-07-11 17:46:47 +01:00 (rev 2425)
@@ -18324,6 +18324,28 @@
goto decode_success;
}
+ /* ------------------- (T1) SMMUL{R} ------------------ */
+ if (INSN0(15,7) == BITS9(1,1,1,1,1,0,1,1,0)
+ && INSN0(6,4) == BITS3(1,0,1)
+ && INSN1(15,12) == BITS4(1,1,1,1)
+ && INSN1(7,5) == BITS3(0,0,0)) {
+ UInt bitR = INSN1(4,4);
+ UInt rD = INSN1(11,8);
+ UInt rM = INSN1(3,0);
+ UInt rN = INSN0(3,0);
+ if (!isBadRegT(rD) && !isBadRegT(rN) && !isBadRegT(rM)) {
+ IRExpr* res
+ = unop(Iop_64HIto32,
+ binop(Iop_Add64,
+ binop(Iop_MullS32, getIRegT(rN), getIRegT(rM)),
+ mkU64(bitR ? 0x80000000ULL : 0ULL)));
+ putIRegT(rD, res, condT);
+ DIP("smmul%s r%u, r%u, r%u\n",
+ bitR ? "r" : "", rD, rN, rM);
+ goto decode_success;
+ }
+ }
+
/* ----------------------------------------------------------- */
/* -- VFP (CP 10, CP 11) instructions (in Thumb mode) -- */
/* ----------------------------------------------------------- */
|