OSDN Git Service

original
[gb-231r1-is01/Gingerbread_2.3.3_r1_IS01.git] / sdk / emulator / qtools / opcode.h
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
132 inline bool isALU(Opcode op)    { return (opcode_flags[op] & kCatAlu) != 0; }
133 inline bool isBranch(Opcode op) { return (opcode_flags[op] & kCatBranch) != 0; }
134 inline bool isBranchLink(Opcode op) {
135     return (opcode_flags[op] & kCatBranchLink) != 0;
136 }
137 inline bool isBranchExch(Opcode op) {
138     return (opcode_flags[op] & kCatBranchExch) != 0;
139 }
140 inline bool isLoad(Opcode op)   { return (opcode_flags[op] & kCatLoad) != 0; }
141 inline bool isLoadMultiple(Opcode op) {
142     return (opcode_flags[op] & kCatLoadMultiple) == kCatLoadMultiple;
143 }
144 inline bool isStoreMultiple(Opcode op) {
145     return (opcode_flags[op] & kCatStoreMultiple) == kCatStoreMultiple;
146 }
147 inline bool isStore(Opcode op)  { return (opcode_flags[op] & kCatStore) != 0; }
148 inline bool isSigned(Opcode op) { return (opcode_flags[op] & kCatSigned) != 0; }
149 inline bool isMemoryRef(Opcode op) {
150     return (opcode_flags[op] & kCatMemoryRef) != 0;
151 }
152 inline int getAccessSize(Opcode op) { return opcode_flags[op] & kCatNumBytes; }
153 inline bool isCoproc(Opcode op) { return (opcode_flags[op] & kCatCoproc) != 0; }
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