diff options
author | Ben Cheng <bccheng@google.com> | 2013-03-11 21:28:49 +0000 |
---|---|---|
committer | Gerrit Code Review <noreply-gerritcodereview@google.com> | 2013-03-11 21:28:49 +0000 |
commit | 14d4abff5b711f14716d6180c6f6ad26c344b726 (patch) | |
tree | 1cba6d16d66cbd48362c96b38cefab918588bb15 | |
parent | 917486bb2d1e7a1fd6588eb35e7e4232e3075a93 (diff) | |
parent | 91b8144359fc6c68fecae099d117372f95144842 (diff) | |
download | valgrind-14d4abff5b711f14716d6180c6f6ad26c344b726.tar.gz |
Merge "Add support for ARM mode smmla instructions."
-rw-r--r-- | main/VEX/priv/guest_arm_toIR.c | 24 |
1 files changed, 24 insertions, 0 deletions
diff --git a/main/VEX/priv/guest_arm_toIR.c b/main/VEX/priv/guest_arm_toIR.c index 220c50f66..4c5cb9630 100644 --- a/main/VEX/priv/guest_arm_toIR.c +++ b/main/VEX/priv/guest_arm_toIR.c @@ -14602,6 +14602,30 @@ DisResult disInstr_ARM_WRK ( } } + /* ------------------- smmla ------------------ */ + if (INSN(27,20) == BITS8(0,1,1,1,0,1,0,1) + && INSN(15,12) != BITS4(1,1,1,1) + && (INSN(7,4) & BITS4(1,1,0,1)) == BITS4(0,0,0,1)) { + UInt bitR = INSN(5,5); + UInt rD = INSN(19,16); + UInt rA = INSN(15,12); + UInt rM = INSN(11,8); + UInt rN = INSN(3,0); + if (rD != 15 && rM != 15 && rN != 15) { + IRExpr* res + = unop(Iop_64HIto32, + binop(Iop_Add64, + binop(Iop_Add64, + binop(Iop_32HLto64, getIRegA(rA), mkU32(0)), + binop(Iop_MullS32, getIRegA(rN), getIRegA(rM))), + mkU64(bitR ? 0x80000000ULL : 0ULL))); + putIRegA(rD, res, condT, Ijk_Boring); + DIP("smmla%s%s r%u, r%u, r%u, r%u\n", + nCC(INSN_COND), bitR ? "r" : "", rD, rN, rM, rA); + goto decode_success; + } + } + /* ------------------- NOP ------------------ */ if (0x0320F000 == (insn & 0x0FFFFFFF)) { DIP("nop%s\n", nCC(INSN_COND)); |