• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright 2006 The Android Open Source Project
2 
3 #ifndef OPCODE_H
4 #define OPCODE_H
5 
6 #include <inttypes.h>
7 
8 // Note: this list of opcodes must match the list used to initialize
9 // the opflags[] array in opcode.cpp.
10 enum Opcode {
11     OP_INVALID,
12     OP_UNDEFINED,
13     OP_ADC,
14     OP_ADD,
15     OP_AND,
16     OP_B,
17     OP_BL,
18     OP_BIC,
19     OP_BKPT,
20     OP_BLX,
21     OP_BX,
22     OP_CDP,
23     OP_CLZ,
24     OP_CMN,
25     OP_CMP,
26     OP_EOR,
27     OP_LDC,
28     OP_LDM,
29     OP_LDR,
30     OP_LDRB,
31     OP_LDRBT,
32     OP_LDRH,
33     OP_LDRSB,
34     OP_LDRSH,
35     OP_LDRT,
36     OP_MCR,
37     OP_MLA,
38     OP_MOV,
39     OP_MRC,
40     OP_MRS,
41     OP_MSR,
42     OP_MUL,
43     OP_MVN,
44     OP_ORR,
45     OP_PLD,
46     OP_RSB,
47     OP_RSC,
48     OP_SBC,
49     OP_SMLAL,
50     OP_SMULL,
51     OP_STC,
52     OP_STM,
53     OP_STR,
54     OP_STRB,
55     OP_STRBT,
56     OP_STRH,
57     OP_STRT,
58     OP_SUB,
59     OP_SWI,
60     OP_SWP,
61     OP_SWPB,
62     OP_TEQ,
63     OP_TST,
64     OP_UMLAL,
65     OP_UMULL,
66 
67     // Define thumb opcodes
68     OP_THUMB_UNDEFINED,
69     OP_THUMB_ADC,
70     OP_THUMB_ADD,
71     OP_THUMB_AND,
72     OP_THUMB_ASR,
73     OP_THUMB_B,
74     OP_THUMB_BIC,
75     OP_THUMB_BKPT,
76     OP_THUMB_BL,
77     OP_THUMB_BLX,
78     OP_THUMB_BX,
79     OP_THUMB_CMN,
80     OP_THUMB_CMP,
81     OP_THUMB_EOR,
82     OP_THUMB_LDMIA,
83     OP_THUMB_LDR,
84     OP_THUMB_LDRB,
85     OP_THUMB_LDRH,
86     OP_THUMB_LDRSB,
87     OP_THUMB_LDRSH,
88     OP_THUMB_LSL,
89     OP_THUMB_LSR,
90     OP_THUMB_MOV,
91     OP_THUMB_MUL,
92     OP_THUMB_MVN,
93     OP_THUMB_NEG,
94     OP_THUMB_ORR,
95     OP_THUMB_POP,
96     OP_THUMB_PUSH,
97     OP_THUMB_ROR,
98     OP_THUMB_SBC,
99     OP_THUMB_STMIA,
100     OP_THUMB_STR,
101     OP_THUMB_STRB,
102     OP_THUMB_STRH,
103     OP_THUMB_SUB,
104     OP_THUMB_SWI,
105     OP_THUMB_TST,
106 
107     OP_END                // must be last
108 };
109 
110 extern uint32_t opcode_flags[];
111 extern const char *opcode_names[];
112 
113 // Define bit flags for the opcode categories
114 static const uint32_t kCatByte          = 0x0001;
115 static const uint32_t kCatHalf          = 0x0002;
116 static const uint32_t kCatWord          = 0x0004;
117 static const uint32_t kCatLong          = 0x0008;
118 static const uint32_t kCatNumBytes      = (kCatByte | kCatHalf | kCatWord | kCatLong);
119 static const uint32_t kCatMultiple      = 0x0010;
120 static const uint32_t kCatSigned        = 0x0020;
121 static const uint32_t kCatLoad          = 0x0040;
122 static const uint32_t kCatStore         = 0x0080;
123 static const uint32_t kCatMemoryRef     = (kCatLoad | kCatStore);
124 static const uint32_t kCatAlu           = 0x0100;
125 static const uint32_t kCatBranch        = 0x0200;
126 static const uint32_t kCatBranchLink    = 0x0400;
127 static const uint32_t kCatBranchExch    = 0x0800;
128 static const uint32_t kCatCoproc        = 0x1000;
129 static const uint32_t kCatLoadMultiple  = (kCatLoad | kCatMultiple);
130 static const uint32_t kCatStoreMultiple = (kCatStore | kCatMultiple);
131 
isALU(Opcode op)132 inline bool isALU(Opcode op)    { return (opcode_flags[op] & kCatAlu) != 0; }
isBranch(Opcode op)133 inline bool isBranch(Opcode op) { return (opcode_flags[op] & kCatBranch) != 0; }
isBranchLink(Opcode op)134 inline bool isBranchLink(Opcode op) {
135     return (opcode_flags[op] & kCatBranchLink) != 0;
136 }
isBranchExch(Opcode op)137 inline bool isBranchExch(Opcode op) {
138     return (opcode_flags[op] & kCatBranchExch) != 0;
139 }
isLoad(Opcode op)140 inline bool isLoad(Opcode op)   { return (opcode_flags[op] & kCatLoad) != 0; }
isLoadMultiple(Opcode op)141 inline bool isLoadMultiple(Opcode op) {
142     return (opcode_flags[op] & kCatLoadMultiple) == kCatLoadMultiple;
143 }
isStoreMultiple(Opcode op)144 inline bool isStoreMultiple(Opcode op) {
145     return (opcode_flags[op] & kCatStoreMultiple) == kCatStoreMultiple;
146 }
isStore(Opcode op)147 inline bool isStore(Opcode op)  { return (opcode_flags[op] & kCatStore) != 0; }
isSigned(Opcode op)148 inline bool isSigned(Opcode op) { return (opcode_flags[op] & kCatSigned) != 0; }
isMemoryRef(Opcode op)149 inline bool isMemoryRef(Opcode op) {
150     return (opcode_flags[op] & kCatMemoryRef) != 0;
151 }
getAccessSize(Opcode op)152 inline int getAccessSize(Opcode op) { return opcode_flags[op] & kCatNumBytes; }
isCoproc(Opcode op)153 inline bool isCoproc(Opcode op) { return (opcode_flags[op] & kCatCoproc) != 0; }
getNumAccesses(Opcode op,uint32_t binary)154 inline int getNumAccesses(Opcode op, uint32_t binary) {
155   extern int num_one_bits[];
156   int num_accesses = 0;
157   if (opcode_flags[op] & kCatNumBytes)
158     num_accesses = 1;
159   else if (opcode_flags[op] & kCatMultiple) {
160     num_accesses = num_one_bits[(binary >> 8) & 0xff]
161                    + num_one_bits[binary & 0xff];
162   }
163   return num_accesses;
164 }
165 
166 #endif  // OPCODE_H
167