]> git.ipfire.org Git - thirdparty/valgrind.git/commitdiff
Implement (T1) SMMUL{R}. Fixes #300140. (Evgeniy Stepanov,
authorJulian Seward <jseward@acm.org>
Wed, 11 Jul 2012 16:46:47 +0000 (16:46 +0000)
committerJulian Seward <jseward@acm.org>
Wed, 11 Jul 2012 16:46:47 +0000 (16:46 +0000)
eugeni.stepanov@gmail.com) w/ fixes.

git-svn-id: svn://svn.valgrind.org/vex/trunk@2425

VEX/priv/guest_arm_toIR.c

index 0426b40e172ca4909011619af46f3dd0b8790864..af1202cda61080ef78a0466032812349b7399fb5 100644 (file)
@@ -18324,6 +18324,28 @@ DisResult disInstr_THUMB_WRK (
       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)       -- */
    /* ----------------------------------------------------------- */