1 // Copyright 2006 The Android Open Source Project 2 3 #include <stdio.h> 4 #include <inttypes.h> 5 #include "opcode.h" 6 7 // Note: this array depends on the Opcode enum defined in opcode.h 8 uint32_t opcode_flags[] = { 9 0, // OP_INVALID 10 0, // OP_UNDEFINED 11 kCatAlu, // OP_ADC 12 kCatAlu, // OP_ADD 13 kCatAlu, // OP_AND 14 kCatBranch, // OP_B 15 kCatBranch | kCatBranchLink, // OP_BL 16 kCatAlu, // OP_BIC 17 0, // OP_BKPT 18 kCatBranch | kCatBranchLink | kCatBranchExch, // OP_BLX 19 kCatBranch | kCatBranchExch, // OP_BX 20 kCatCoproc, // OP_CDP 21 kCatAlu, // OP_CLZ 22 kCatAlu, // OP_CMN 23 kCatAlu, // OP_CMP 24 kCatAlu, // OP_EOR 25 kCatCoproc | kCatLoad, // OP_LDC 26 kCatLoad | kCatMultiple, // OP_LDM 27 kCatLoad | kCatWord, // OP_LDR 28 kCatLoad | kCatByte, // OP_LDRB 29 kCatLoad | kCatByte, // OP_LDRBT 30 kCatLoad | kCatHalf, // OP_LDRH 31 kCatLoad | kCatByte | kCatSigned, // OP_LDRSB 32 kCatLoad | kCatHalf | kCatSigned, // OP_LDRSH 33 kCatLoad | kCatWord, // OP_LDRT 34 kCatCoproc, // OP_MCR 35 kCatAlu, // OP_MLA 36 kCatAlu, // OP_MOV 37 kCatCoproc, // OP_MRC 38 0, // OP_MRS 39 0, // OP_MSR 40 kCatAlu, // OP_MUL 41 kCatAlu, // OP_MVN 42 kCatAlu, // OP_ORR 43 0, // OP_PLD 44 kCatAlu, // OP_RSB 45 kCatAlu, // OP_RSC 46 kCatAlu, // OP_SBC 47 kCatAlu, // OP_SMLAL 48 kCatAlu, // OP_SMULL 49 kCatCoproc | kCatStore, // OP_STC 50 kCatStore | kCatMultiple, // OP_STM 51 kCatStore | kCatWord, // OP_STR 52 kCatStore | kCatByte, // OP_STRB 53 kCatStore | kCatByte, // OP_STRBT 54 kCatStore | kCatHalf, // OP_STRH 55 kCatStore | kCatWord, // OP_STRT 56 kCatAlu, // OP_SUB 57 0, // OP_SWI 58 kCatLoad | kCatStore, // OP_SWP 59 kCatLoad | kCatStore | kCatByte, // OP_SWPB 60 kCatAlu, // OP_TEQ 61 kCatAlu, // OP_TST 62 kCatAlu, // OP_UMLAL 63 kCatAlu, // OP_UMULL 64 65 0, // OP_THUMB_UNDEFINED, 66 kCatAlu, // OP_THUMB_ADC, 67 kCatAlu, // OP_THUMB_ADD, 68 kCatAlu, // OP_THUMB_AND, 69 kCatAlu, // OP_THUMB_ASR, 70 kCatBranch, // OP_THUMB_B, 71 kCatAlu, // OP_THUMB_BIC, 72 0, // OP_THUMB_BKPT, 73 kCatBranch | kCatBranchLink, // OP_THUMB_BL, 74 kCatBranch | kCatBranchLink | kCatBranchExch, // OP_THUMB_BLX, 75 kCatBranch | kCatBranchExch, // OP_THUMB_BX, 76 kCatAlu, // OP_THUMB_CMN, 77 kCatAlu, // OP_THUMB_CMP, 78 kCatAlu, // OP_THUMB_EOR, 79 kCatLoad | kCatMultiple, // OP_THUMB_LDMIA, 80 kCatLoad | kCatWord, // OP_THUMB_LDR, 81 kCatLoad | kCatByte, // OP_THUMB_LDRB, 82 kCatLoad | kCatHalf, // OP_THUMB_LDRH, 83 kCatLoad | kCatByte | kCatSigned, // OP_THUMB_LDRSB, 84 kCatLoad | kCatHalf | kCatSigned, // OP_THUMB_LDRSH, 85 kCatAlu, // OP_THUMB_LSL, 86 kCatAlu, // OP_THUMB_LSR, 87 kCatAlu, // OP_THUMB_MOV, 88 kCatAlu, // OP_THUMB_MUL, 89 kCatAlu, // OP_THUMB_MVN, 90 kCatAlu, // OP_THUMB_NEG, 91 kCatAlu, // OP_THUMB_ORR, 92 kCatLoad | kCatMultiple, // OP_THUMB_POP, 93 kCatStore | kCatMultiple, // OP_THUMB_PUSH, 94 kCatAlu, // OP_THUMB_ROR, 95 kCatAlu, // OP_THUMB_SBC, 96 kCatStore | kCatMultiple, // OP_THUMB_STMIA, 97 kCatStore | kCatWord, // OP_THUMB_STR, 98 kCatStore | kCatByte, // OP_THUMB_STRB, 99 kCatStore | kCatHalf, // OP_THUMB_STRH, 100 kCatAlu, // OP_THUMB_SUB, 101 0, // OP_THUMB_SWI, 102 kCatAlu, // OP_THUMB_TST, 103 104 0, // OP_END 105 }; 106 107 const char *opcode_names[] = { 108 "invalid", 109 "undefined", 110 "adc", 111 "add", 112 "and", 113 "b", 114 "bl", 115 "bic", 116 "bkpt", 117 "blx", 118 "bx", 119 "cdp", 120 "clz", 121 "cmn", 122 "cmp", 123 "eor", 124 "ldc", 125 "ldm", 126 "ldr", 127 "ldrb", 128 "ldrbt", 129 "ldrh", 130 "ldrsb", 131 "ldrsh", 132 "ldrt", 133 "mcr", 134 "mla", 135 "mov", 136 "mrc", 137 "mrs", 138 "msr", 139 "mul", 140 "mvn", 141 "orr", 142 "pld", 143 "rsb", 144 "rsc", 145 "sbc", 146 "smlal", 147 "smull", 148 "stc", 149 "stm", 150 "str", 151 "strb", 152 "strbt", 153 "strh", 154 "strt", 155 "sub", 156 "swi", 157 "swp", 158 "swpb", 159 "teq", 160 "tst", 161 "umlal", 162 "umull", 163 164 "undefined", 165 "adc", 166 "add", 167 "and", 168 "asr", 169 "b", 170 "bic", 171 "bkpt", 172 "bl", 173 "blx", 174 "bx", 175 "cmn", 176 "cmp", 177 "eor", 178 "ldmia", 179 "ldr", 180 "ldrb", 181 "ldrh", 182 "ldrsb", 183 "ldrsh", 184 "lsl", 185 "lsr", 186 "mov", 187 "mul", 188 "mvn", 189 "neg", 190 "orr", 191 "pop", 192 "push", 193 "ror", 194 "sbc", 195 "stmia", 196 "str", 197 "strb", 198 "strh", 199 "sub", 200 "swi", 201 "tst", 202 203 NULL 204 }; 205