Carl Shapiro | 12eb78e | 2011-06-24 14:51:06 -0700 | [diff] [blame^] | 1 | // 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 | |
| 10 | namespace 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 | |
| 232 | class 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_ |