Disassembly of Thumb2 data processing instructions.

Change-Id: I7e7dbf1fdac7335b01035d35c9fd950176d2d400
diff --git a/src/disassembler_arm.cc b/src/disassembler_arm.cc
index e147c81..79123e5 100644
--- a/src/disassembler_arm.cc
+++ b/src/disassembler_arm.cc
@@ -94,6 +94,11 @@
   "tst", "teq", "cmp", "cmn", "orr", "mov", "bic", "mvn",
 };
 
+static const char* kThumbDataProcessingOperations[] = {
+  "and", "eor", "lsl", "lsr", "asr", "adc", "sbc", "ror",
+  "tst", "rsb", "cmp", "cmn", "orr", "mul", "bic", "mvn",
+};
+
 struct ArmRegister {
   ArmRegister(uint32_t r) : r(r) { CHECK_LE(r, 15U); }
   uint32_t r;
@@ -691,6 +696,15 @@
         default:
           break;
       }
+    } else if (opcode1 == 0x10) {
+      // Data-processing
+      uint16_t opcode2 = (instr >> 6) & 0xF;
+      uint16_t rm = (instr >> 3) & 0x7;
+      uint16_t rdn = instr & 7;
+      opcode << kThumbDataProcessingOperations[opcode2];
+      DumpReg(args, rdn);
+      args << ", ";
+      DumpReg(args, rm);
     } else if (opcode1 == 0x11) {
       // Special data instructions and branch and exchange
       uint16_t opcode2 = (instr >> 6) & 0x0F;