blob: 2c1c15fbce8520208e81cd09bf51cb25955ee937 [file] [log] [blame]
Carl Shapiro12eb78e2011-06-24 14:51:06 -07001// Copyright 2011 Google Inc. All Rights Reserved.
2
3#ifndef ART_SRC_DEX_INSTRUCTION_H_
4#define ART_SRC_DEX_INSTRUCTION_H_
5
6#include "src/globals.h"
7#include "src/logging.h"
8#include "src/macros.h"
9
10namespace art {
11
12#define DEX_INSTRUCTION_LIST(V) \
13 V(NOP, 0x0) \
14 V(MOVE, 0x1) \
15 V(MOVE_FROM16, 0x2) \
16 V(MOVE_16, 0x3) \
17 V(MOVE_WIDE, 0x4) \
18 V(MOVE_WIDE_FROM16, 0x5) \
19 V(MOVE_WIDE_16, 0x6) \
20 V(MOVE_OBJECT, 0x7) \
21 V(MOVE_OBJECT_FROM16, 0x8) \
22 V(MOVE_OBJECT_16, 0x9) \
23 V(MOVE_RESULT, 0xA) \
24 V(MOVE_RESULT_WIDE, 0xB) \
25 V(MOVE_RESULT_OBJECT, 0xC) \
26 V(MOVE_EXCEPTION, 0xD) \
27 V(RETURN_VOID, 0xE) \
28 V(RETURN, 0xF) \
29 V(RETURN_WIDE, 0x10) \
30 V(RETURN_OBJECT, 0x11) \
31 V(CONST_4, 0x12) \
32 V(CONST_16, 0x13) \
33 V(CONST, 0x14) \
34 V(CONST_HIGH16, 0x15) \
35 V(CONST_WIDE_16, 0x16) \
36 V(CONST_WIDE_32, 0x17) \
37 V(CONST_WIDE, 0x18) \
38 V(CONST_WIDE_HIGH16, 0x19) \
39 V(CONST_STRING, 0x1A) \
40 V(CONST_STRING_JUMBO, 0x1B) \
41 V(CONST_CLASS, 0x1C) \
42 V(MONITOR_ENTER, 0x1D) \
43 V(MONITOR_EXIT, 0x1E) \
44 V(CHECK_CAST, 0x1F) \
45 V(INSTANCE_OF, 0x20) \
46 V(ARRAY_LENGTH, 0x21) \
47 V(NEW_INSTANCE, 0x22) \
48 V(NEW_ARRAY, 0x23) \
49 V(FILLED_NEW_ARRAY, 0x24) \
50 V(FILLED_NEW_ARRAY_RANGE, 0x25) \
51 V(FILL_ARRAY_DATA, 0x26) \
52 V(THROW, 0x27) \
53 V(GOTO, 0x28) \
54 V(GOTO_16, 0x29) \
55 V(GOTO_32, 0x2A) \
56 V(PACKED_SWITCH, 0x2B) \
57 V(SPARSE_SWITCH, 0x2C) \
58 V(CMPL_FLOAT, 0x2D) \
59 V(CMPG_FLOAT, 0x2E) \
60 V(CMPL_DOUBLE, 0x2F) \
61 V(CMPG_DOUBLE, 0x30) \
62 V(CMP_LONG, 0x31) \
63 V(IF_EQ, 0x32) \
64 V(IF_NE, 0x33) \
65 V(IF_LT, 0x34) \
66 V(IF_GE, 0x35) \
67 V(IF_GT, 0x36) \
68 V(IF_LE, 0x37) \
69 V(IF_EQZ, 0x38) \
70 V(IF_NEZ, 0x39) \
71 V(IF_LTZ, 0x3A) \
72 V(IF_GEZ, 0x3B) \
73 V(IF_GTZ, 0x3C) \
74 V(IF_LEZ, 0x3D) \
75 V(AGET, 0x44) \
76 V(AGET_WIDE, 0x45) \
77 V(AGET_OBJECT, 0x46) \
78 V(AGET_BOOLEAN, 0x47) \
79 V(AGET_BYTE, 0x48) \
80 V(AGET_CHAR, 0x49) \
81 V(AGET_SHORT, 0x4A) \
82 V(APUT, 0x4B) \
83 V(APUT_WIDE, 0x4C) \
84 V(APUT_OBJECT, 0x4D) \
85 V(APUT_BOOLEAN, 0x4E) \
86 V(APUT_BYTE, 0x4F) \
87 V(APUT_CHAR, 0x50) \
88 V(APUT_SHORT, 0x51) \
89 V(IGET, 0x52) \
90 V(IGET_WIDE, 0x53) \
91 V(IGET_OBJECT, 0x54) \
92 V(IGET_BOOLEAN, 0x55) \
93 V(IGET_BYTE, 0x56) \
94 V(IGET_CHAR, 0x57) \
95 V(IGET_SHORT, 0x58) \
96 V(IPUT, 0x59) \
97 V(IPUT_WIDE, 0x5A) \
98 V(IPUT_OBJECT, 0x5B) \
99 V(IPUT_BOOLEAN, 0x5C) \
100 V(IPUT_BYTE, 0x5D) \
101 V(IPUT_CHAR, 0x5E) \
102 V(IPUT_SHORT, 0x5F) \
103 V(SGET, 0x60) \
104 V(SGET_WIDE, 0x61) \
105 V(SGET_OBJECT, 0x62) \
106 V(SGET_BOOLEAN, 0x63) \
107 V(SGET_BYTE, 0x64) \
108 V(SGET_CHAR, 0x65) \
109 V(SGET_SHORT, 0x66) \
110 V(SPUT, 0x67) \
111 V(SPUT_WIDE, 0x68) \
112 V(SPUT_OBJECT, 0x69) \
113 V(SPUT_BOOLEAN, 0x6A) \
114 V(SPUT_BYTE, 0x6B) \
115 V(SPUT_CHAR, 0x6C) \
116 V(SPUT_SHORT, 0x6D) \
117 V(INVOKE_VIRTUAL, 0x6E) \
118 V(INVOKE_SUPER, 0x6F) \
119 V(INVOKE_DIRECT, 0x70) \
120 V(INVOKE_STATIC, 0x71) \
121 V(INVOKE_INTERFACE, 0x72) \
122 V(INVOKE_VIRTUAL_RANGE, 0x74) \
123 V(INVOKE_SUPER_RANGE, 0x75) \
124 V(INVOKE_DIRECT_RANGE, 0x76) \
125 V(INVOKE_STATIC_RANGE, 0x77) \
126 V(INVOKE_INTERFACE_RANGE, 0x78) \
127 V(NEG_INT, 0x7B) \
128 V(NOT_INT, 0x7C) \
129 V(NEG_LONG, 0x7D) \
130 V(NOT_LONG, 0x7E) \
131 V(NEG_FLOAT, 0x7F) \
132 V(NEG_DOUBLE, 0x80) \
133 V(INT_TO_LONG, 0x81) \
134 V(INT_TO_FLOAT, 0x82) \
135 V(INT_TO_DOUBLE, 0x83) \
136 V(LONG_TO_INT, 0x84) \
137 V(LONG_TO_FLOAT, 0x85) \
138 V(LONG_TO_DOUBLE, 0x86) \
139 V(FLOAT_TO_INT, 0x87) \
140 V(FLOAT_TO_LONG, 0x88) \
141 V(FLOAT_TO_DOUBLE, 0x89) \
142 V(DOUBLE_TO_INT, 0x8A) \
143 V(DOUBLE_TO_LONG, 0x8B) \
144 V(DOUBLE_TO_FLOAT, 0x8C) \
145 V(INT_TO_BYTE, 0x8D) \
146 V(INT_TO_CHAR, 0x8E) \
147 V(INT_TO_SHORT, 0x8F) \
148 V(ADD_INT, 0x90) \
149 V(SUB_INT, 0x91) \
150 V(MUL_INT, 0x92) \
151 V(DIV_INT, 0x93) \
152 V(REM_INT, 0x94) \
153 V(AND_INT, 0x95) \
154 V(OR_INT, 0x96) \
155 V(XOR_INT, 0x97) \
156 V(SHL_INT, 0x98) \
157 V(SHR_INT, 0x99) \
158 V(USHR_INT, 0x9A) \
159 V(ADD_LONG, 0x9B) \
160 V(SUB_LONG, 0x9C) \
161 V(MUL_LONG, 0x9D) \
162 V(DIV_LONG, 0x9E) \
163 V(REM_LONG, 0x9F) \
164 V(AND_LONG, 0xA0) \
165 V(OR_LONG, 0xA1) \
166 V(XOR_LONG, 0xA2) \
167 V(SHL_LONG, 0xA3) \
168 V(SHR_LONG, 0xA4) \
169 V(USHR_LONG, 0xA5) \
170 V(ADD_FLOAT, 0xA6) \
171 V(SUB_FLOAT, 0xA7) \
172 V(MUL_FLOAT, 0xA8) \
173 V(DIV_FLOAT, 0xA9) \
174 V(REM_FLOAT, 0xAA) \
175 V(ADD_DOUBLE, 0xAB) \
176 V(SUB_DOUBLE, 0xAC) \
177 V(MUL_DOUBLE, 0xAD) \
178 V(DIV_DOUBLE, 0xAE) \
179 V(REM_DOUBLE, 0xAF) \
180 V(ADD_INT_2ADDR, 0xB0) \
181 V(SUB_INT_2ADDR, 0xB1) \
182 V(MUL_INT_2ADDR, 0xB2) \
183 V(DIV_INT_2ADDR, 0xB3) \
184 V(REM_INT_2ADDR, 0xB4) \
185 V(AND_INT_2ADDR, 0xB5) \
186 V(OR_INT_2ADDR, 0xB6) \
187 V(XOR_INT_2ADDR, 0xB7) \
188 V(SHL_INT_2ADDR, 0xB8) \
189 V(SHR_INT_2ADDR, 0xB9) \
190 V(USHR_INT_2ADDR, 0xBA) \
191 V(ADD_LONG_2ADDR, 0xBB) \
192 V(SUB_LONG_2ADDR, 0xBC) \
193 V(MUL_LONG_2ADDR, 0xBD) \
194 V(DIV_LONG_2ADDR, 0xBE) \
195 V(REM_LONG_2ADDR, 0xBF) \
196 V(AND_LONG_2ADDR, 0xC0) \
197 V(OR_LONG_2ADDR, 0xC1) \
198 V(XOR_LONG_2ADDR, 0xC2) \
199 V(SHL_LONG_2ADDR, 0xC3) \
200 V(SHR_LONG_2ADDR, 0xC4) \
201 V(USHR_LONG_2ADDR, 0xC5) \
202 V(ADD_FLOAT_2ADDR, 0xC6) \
203 V(SUB_FLOAT_2ADDR, 0xC7) \
204 V(MUL_FLOAT_2ADDR, 0xC8) \
205 V(DIV_FLOAT_2ADDR, 0xC9) \
206 V(REM_FLOAT_2ADDR, 0xCA) \
207 V(ADD_DOUBLE_2ADDR, 0xCB) \
208 V(SUB_DOUBLE_2ADDR, 0xCC) \
209 V(MUL_DOUBLE_2ADDR, 0xCD) \
210 V(DIV_DOUBLE_2ADDR, 0xCE) \
211 V(REM_DOUBLE_2ADDR, 0xCF) \
212 V(ADD_INT_LIT16, 0xD0) \
213 V(RSUB_INT, 0xD1) \
214 V(MUL_INT_LIT16, 0xD2) \
215 V(DIV_INT_LIT16, 0xD3) \
216 V(REM_INT_LIT16, 0xD4) \
217 V(AND_INT_LIT16, 0xD5) \
218 V(OR_INT_LIT16, 0xD6) \
219 V(XOR_INT_LIT16, 0xD7) \
220 V(ADD_INT_LIT8, 0xD8) \
221 V(RSUB_INT_LIT8, 0xD9) \
222 V(MUL_INT_LIT8, 0xDA) \
223 V(DIV_INT_LIT8, 0xDB) \
224 V(REM_INT_LIT8, 0xDC) \
225 V(AND_INT_LIT8, 0xDD) \
226 V(OR_INT_LIT8, 0xDE) \
227 V(XOR_INT_LIT8, 0xDF) \
228 V(SHL_INT_LIT8, 0xE0) \
229 V(SHR_INT_LIT8, 0xE1) \
230 V(USHR_INT_LIT8, 0xE2)
231
232class Instruction {
233 public:
234#define INSTRUCTION_ENUM(cname, opcode) cname = opcode,
235 enum Code {
236 DEX_INSTRUCTION_LIST(INSTRUCTION_ENUM)
237 };
238#undef INSTRUCTION_ENUM
239
240 // Returns the size in bytes of this instruction.
241 size_t Size();
242
243 // Returns a pointer to the next instruction in the stream.
244 const Instruction* Next();
245
246 // Returns the opcode field of the instruction.
247 Code Opcode();
248
249 // Reads an instruction out of the stream at the specified address.
250 static Instruction* At(byte* code) {
251 CHECK(code != NULL);
252 return reinterpret_cast<Instruction*>(code);
253 }
254
255 private:
256 DISALLOW_IMPLICIT_CONSTRUCTORS(Instruction);
257};
258
259} // namespace art
260
261#endif // ART_SRC_DEX_INSTRUCTION_H_