dex_instruction.cc revision 7aca91db1571594cdb7e0a9ee704530b09c066e4
12faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes/* 22faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes * Copyright (C) 2011 The Android Open Source Project 32faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes * 42faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes * Licensed under the Apache License, Version 2.0 (the "License"); 52faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes * you may not use this file except in compliance with the License. 62faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes * You may obtain a copy of the License at 72faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes * 82faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes * http://www.apache.org/licenses/LICENSE-2.0 92faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes * 102faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes * Unless required by applicable law or agreed to in writing, software 112faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes * distributed under the License is distributed on an "AS IS" BASIS, 122faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 132faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes * See the License for the specific language governing permissions and 142faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes * limitations under the License. 152faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes */ 1612eb78e651f13f2c1f0c2c922048a5a213253adfCarl Shapiro 17807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz#include "dex_instruction-inl.h" 1812eb78e651f13f2c1f0c2c922048a5a213253adfCarl Shapiro 19b574c1816c7a2f160b267cd100f36f157a9abcf6Ian Rogers#include <inttypes.h> 20b574c1816c7a2f160b267cd100f36f157a9abcf6Ian Rogers 21b574c1816c7a2f160b267cd100f36f157a9abcf6Ian Rogers#include <iomanip> 22b574c1816c7a2f160b267cd100f36f157a9abcf6Ian Rogers 234f6ad8ab428038129b2d0d6c40b7fd625cca15e1Ian Rogers#include "dex_file-inl.h" 242dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers#include "utils.h" 25d81871cbbaa34c649e488f94f61a981db33123e5Ian Rogers 2612eb78e651f13f2c1f0c2c922048a5a213253adfCarl Shapironamespace art { 2712eb78e651f13f2c1f0c2c922048a5a213253adfCarl Shapiro 28e4c1ce498f7933b91696caa4a527e6556128a8e2Carl Shapiroconst char* const Instruction::kInstructionNames[] = { 29ba5ebb944b7c5c6a1b754b6dd47eed96f39aea29jeffhao#define INSTRUCTION_NAME(o, c, pname, f, r, i, a, v) pname, 30578bbdc684db8ed68e9fedbc678669d27fa68b6eBrian Carlstrom#include "dex_instruction_list.h" 31e4c1ce498f7933b91696caa4a527e6556128a8e2Carl Shapiro DEX_INSTRUCTION_LIST(INSTRUCTION_NAME) 32e4c1ce498f7933b91696caa4a527e6556128a8e2Carl Shapiro#undef DEX_INSTRUCTION_LIST 33e4c1ce498f7933b91696caa4a527e6556128a8e2Carl Shapiro#undef INSTRUCTION_NAME 34e4c1ce498f7933b91696caa4a527e6556128a8e2Carl Shapiro}; 35e4c1ce498f7933b91696caa4a527e6556128a8e2Carl Shapiro 36adb8c67f6d87a160d4e3a8afea7cb93f6c14568bElliott HughesInstruction::Format const Instruction::kInstructionFormats[] = { 37ba5ebb944b7c5c6a1b754b6dd47eed96f39aea29jeffhao#define INSTRUCTION_FORMAT(o, c, p, format, r, i, a, v) format, 38578bbdc684db8ed68e9fedbc678669d27fa68b6eBrian Carlstrom#include "dex_instruction_list.h" 39e4c1ce498f7933b91696caa4a527e6556128a8e2Carl Shapiro DEX_INSTRUCTION_LIST(INSTRUCTION_FORMAT) 40e4c1ce498f7933b91696caa4a527e6556128a8e2Carl Shapiro#undef DEX_INSTRUCTION_LIST 41e4c1ce498f7933b91696caa4a527e6556128a8e2Carl Shapiro#undef INSTRUCTION_FORMAT 42e4c1ce498f7933b91696caa4a527e6556128a8e2Carl Shapiro}; 43e4c1ce498f7933b91696caa4a527e6556128a8e2Carl Shapiro 44e4c1ce498f7933b91696caa4a527e6556128a8e2Carl Shapiroint const Instruction::kInstructionFlags[] = { 45ba5ebb944b7c5c6a1b754b6dd47eed96f39aea29jeffhao#define INSTRUCTION_FLAGS(o, c, p, f, r, i, flags, v) flags, 46578bbdc684db8ed68e9fedbc678669d27fa68b6eBrian Carlstrom#include "dex_instruction_list.h" 47e4c1ce498f7933b91696caa4a527e6556128a8e2Carl Shapiro DEX_INSTRUCTION_LIST(INSTRUCTION_FLAGS) 48e4c1ce498f7933b91696caa4a527e6556128a8e2Carl Shapiro#undef DEX_INSTRUCTION_LIST 49e4c1ce498f7933b91696caa4a527e6556128a8e2Carl Shapiro#undef INSTRUCTION_FLAGS 50e4c1ce498f7933b91696caa4a527e6556128a8e2Carl Shapiro}; 51e4c1ce498f7933b91696caa4a527e6556128a8e2Carl Shapiro 52ba5ebb944b7c5c6a1b754b6dd47eed96f39aea29jeffhaoint const Instruction::kInstructionVerifyFlags[] = { 53ba5ebb944b7c5c6a1b754b6dd47eed96f39aea29jeffhao#define INSTRUCTION_VERIFY_FLAGS(o, c, p, f, r, i, a, vflags) vflags, 54ba5ebb944b7c5c6a1b754b6dd47eed96f39aea29jeffhao#include "dex_instruction_list.h" 55ba5ebb944b7c5c6a1b754b6dd47eed96f39aea29jeffhao DEX_INSTRUCTION_LIST(INSTRUCTION_VERIFY_FLAGS) 56ba5ebb944b7c5c6a1b754b6dd47eed96f39aea29jeffhao#undef DEX_INSTRUCTION_LIST 57ba5ebb944b7c5c6a1b754b6dd47eed96f39aea29jeffhao#undef INSTRUCTION_VERIFY_FLAGS 58ba5ebb944b7c5c6a1b754b6dd47eed96f39aea29jeffhao}; 59ba5ebb944b7c5c6a1b754b6dd47eed96f39aea29jeffhao 60a75a01313e801c53145df00bad1842d9f643c0a1Ian Rogersint const Instruction::kInstructionSizeInCodeUnits[] = { 61a75a01313e801c53145df00bad1842d9f643c0a1Ian Rogers#define INSTRUCTION_SIZE(opcode, c, p, format, r, i, a, v) \ 626f485c62b9cfce3ab71020c646ab9f48d9d29d6dBrian Carlstrom ((opcode == NOP) ? -1 : \ 636f485c62b9cfce3ab71020c646ab9f48d9d29d6dBrian Carlstrom ((format >= k10x) && (format <= k10t)) ? 1 : \ 646f485c62b9cfce3ab71020c646ab9f48d9d29d6dBrian Carlstrom ((format >= k20t) && (format <= k22c)) ? 2 : \ 656f485c62b9cfce3ab71020c646ab9f48d9d29d6dBrian Carlstrom ((format >= k32x) && (format <= k3rc)) ? 3 : \ 666f485c62b9cfce3ab71020c646ab9f48d9d29d6dBrian Carlstrom (format == k51l) ? 5 : -1), 67a75a01313e801c53145df00bad1842d9f643c0a1Ian Rogers#include "dex_instruction_list.h" 68a75a01313e801c53145df00bad1842d9f643c0a1Ian Rogers DEX_INSTRUCTION_LIST(INSTRUCTION_SIZE) 69a75a01313e801c53145df00bad1842d9f643c0a1Ian Rogers#undef DEX_INSTRUCTION_LIST 70a75a01313e801c53145df00bad1842d9f643c0a1Ian Rogers#undef INSTRUCTION_SIZE 71a75a01313e801c53145df00bad1842d9f643c0a1Ian Rogers}; 72a75a01313e801c53145df00bad1842d9f643c0a1Ian Rogers 73ba5ebb944b7c5c6a1b754b6dd47eed96f39aea29jeffhao/* 74ba5ebb944b7c5c6a1b754b6dd47eed96f39aea29jeffhao * Handy macros for helping decode instructions. 75ba5ebb944b7c5c6a1b754b6dd47eed96f39aea29jeffhao */ 76ba5ebb944b7c5c6a1b754b6dd47eed96f39aea29jeffhao#define FETCH(_offset) (insns[(_offset)]) 77807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz#define FETCH_uint32(_offset) (fetch_uint32_impl((_offset), insns)) 78ba5ebb944b7c5c6a1b754b6dd47eed96f39aea29jeffhao#define INST_A(_insn) (((uint16_t)(_insn) >> 8) & 0x0f) 79ba5ebb944b7c5c6a1b754b6dd47eed96f39aea29jeffhao#define INST_B(_insn) ((uint16_t)(_insn) >> 12) 80ba5ebb944b7c5c6a1b754b6dd47eed96f39aea29jeffhao#define INST_AA(_insn) ((_insn) >> 8) 81ba5ebb944b7c5c6a1b754b6dd47eed96f39aea29jeffhao 82807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz/* Helper for FETCH_uint32, above. */ 83807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertzstatic inline uint32_t fetch_uint32_impl(uint32_t offset, const uint16_t* insns) { 84ba5ebb944b7c5c6a1b754b6dd47eed96f39aea29jeffhao return insns[offset] | ((uint32_t) insns[offset+1] << 16); 85ba5ebb944b7c5c6a1b754b6dd47eed96f39aea29jeffhao} 86ba5ebb944b7c5c6a1b754b6dd47eed96f39aea29jeffhao 878cc5162f19d64eb6414e7e421cea4413debe671eDragos Sbirlea 888cc5162f19d64eb6414e7e421cea4413debe671eDragos Sbirleabool Instruction::HasVRegC() const { 898cc5162f19d64eb6414e7e421cea4413debe671eDragos Sbirlea switch (FormatOf(Opcode())) { 908cc5162f19d64eb6414e7e421cea4413debe671eDragos Sbirlea case k23x: return true; 918cc5162f19d64eb6414e7e421cea4413debe671eDragos Sbirlea case k35c: return true; 928cc5162f19d64eb6414e7e421cea4413debe671eDragos Sbirlea case k3rc: return true; 938cc5162f19d64eb6414e7e421cea4413debe671eDragos Sbirlea default: return false; 948cc5162f19d64eb6414e7e421cea4413debe671eDragos Sbirlea } 958cc5162f19d64eb6414e7e421cea4413debe671eDragos Sbirlea} 968cc5162f19d64eb6414e7e421cea4413debe671eDragos Sbirlea 978cc5162f19d64eb6414e7e421cea4413debe671eDragos Sbirleabool Instruction::HasVRegB() const { 988cc5162f19d64eb6414e7e421cea4413debe671eDragos Sbirlea switch (FormatOf(Opcode())) { 998cc5162f19d64eb6414e7e421cea4413debe671eDragos Sbirlea case k12x: return true; 1008cc5162f19d64eb6414e7e421cea4413debe671eDragos Sbirlea case k22b: return true; 1018cc5162f19d64eb6414e7e421cea4413debe671eDragos Sbirlea case k22c: return true; 1028cc5162f19d64eb6414e7e421cea4413debe671eDragos Sbirlea case k22s: return true; 1038cc5162f19d64eb6414e7e421cea4413debe671eDragos Sbirlea case k22t: return true; 1048cc5162f19d64eb6414e7e421cea4413debe671eDragos Sbirlea case k22x: return true; 1050e260a32601fb1178e11837c460807071d489f82Dragos Sbirlea case k23x: return true; 1068cc5162f19d64eb6414e7e421cea4413debe671eDragos Sbirlea case k32x: return true; 1078cc5162f19d64eb6414e7e421cea4413debe671eDragos Sbirlea default: return false; 1088cc5162f19d64eb6414e7e421cea4413debe671eDragos Sbirlea } 1098cc5162f19d64eb6414e7e421cea4413debe671eDragos Sbirlea} 1108cc5162f19d64eb6414e7e421cea4413debe671eDragos Sbirlea 1118cc5162f19d64eb6414e7e421cea4413debe671eDragos Sbirleabool Instruction::HasVRegA() const { 1128cc5162f19d64eb6414e7e421cea4413debe671eDragos Sbirlea switch (FormatOf(Opcode())) { 1138cc5162f19d64eb6414e7e421cea4413debe671eDragos Sbirlea case k11n: return true; 1148cc5162f19d64eb6414e7e421cea4413debe671eDragos Sbirlea case k11x: return true; 1158cc5162f19d64eb6414e7e421cea4413debe671eDragos Sbirlea case k12x: return true; 1168cc5162f19d64eb6414e7e421cea4413debe671eDragos Sbirlea case k21c: return true; 1178cc5162f19d64eb6414e7e421cea4413debe671eDragos Sbirlea case k21h: return true; 1188cc5162f19d64eb6414e7e421cea4413debe671eDragos Sbirlea case k21s: return true; 1198cc5162f19d64eb6414e7e421cea4413debe671eDragos Sbirlea case k21t: return true; 1208cc5162f19d64eb6414e7e421cea4413debe671eDragos Sbirlea case k22b: return true; 1218cc5162f19d64eb6414e7e421cea4413debe671eDragos Sbirlea case k22c: return true; 1228cc5162f19d64eb6414e7e421cea4413debe671eDragos Sbirlea case k22s: return true; 1238cc5162f19d64eb6414e7e421cea4413debe671eDragos Sbirlea case k22t: return true; 1248cc5162f19d64eb6414e7e421cea4413debe671eDragos Sbirlea case k22x: return true; 1258cc5162f19d64eb6414e7e421cea4413debe671eDragos Sbirlea case k23x: return true; 1268cc5162f19d64eb6414e7e421cea4413debe671eDragos Sbirlea case k31c: return true; 1278cc5162f19d64eb6414e7e421cea4413debe671eDragos Sbirlea case k31i: return true; 1288cc5162f19d64eb6414e7e421cea4413debe671eDragos Sbirlea case k31t: return true; 1298cc5162f19d64eb6414e7e421cea4413debe671eDragos Sbirlea case k32x: return true; 1308cc5162f19d64eb6414e7e421cea4413debe671eDragos Sbirlea case k51l: return true; 1318cc5162f19d64eb6414e7e421cea4413debe671eDragos Sbirlea default: return false; 1328cc5162f19d64eb6414e7e421cea4413debe671eDragos Sbirlea } 1338cc5162f19d64eb6414e7e421cea4413debe671eDragos Sbirlea} 1348cc5162f19d64eb6414e7e421cea4413debe671eDragos Sbirlea 13539f992750ac1eb7e51955d3e52bddc32b37c370fDragos Sbirleaint32_t Instruction::VRegC() const { 13639f992750ac1eb7e51955d3e52bddc32b37c370fDragos Sbirlea switch (FormatOf(Opcode())) { 13739f992750ac1eb7e51955d3e52bddc32b37c370fDragos Sbirlea case k23x: return VRegC_23x(); 13839f992750ac1eb7e51955d3e52bddc32b37c370fDragos Sbirlea case k35c: return VRegC_35c(); 13939f992750ac1eb7e51955d3e52bddc32b37c370fDragos Sbirlea case k3rc: return VRegC_3rc(); 14039f992750ac1eb7e51955d3e52bddc32b37c370fDragos Sbirlea default: LOG(FATAL) << "Tried to access vC of instruction " << Name() << 14139f992750ac1eb7e51955d3e52bddc32b37c370fDragos Sbirlea " which has no C operand."; 14239f992750ac1eb7e51955d3e52bddc32b37c370fDragos Sbirlea } 1438cc5162f19d64eb6414e7e421cea4413debe671eDragos Sbirlea return -1; 14439f992750ac1eb7e51955d3e52bddc32b37c370fDragos Sbirlea} 14539f992750ac1eb7e51955d3e52bddc32b37c370fDragos Sbirlea 14639f992750ac1eb7e51955d3e52bddc32b37c370fDragos Sbirleaint32_t Instruction::VRegB() const { 14739f992750ac1eb7e51955d3e52bddc32b37c370fDragos Sbirlea switch (FormatOf(Opcode())) { 14839f992750ac1eb7e51955d3e52bddc32b37c370fDragos Sbirlea case k12x: return VRegB_12x(); 14939f992750ac1eb7e51955d3e52bddc32b37c370fDragos Sbirlea case k22b: return VRegB_22b(); 15039f992750ac1eb7e51955d3e52bddc32b37c370fDragos Sbirlea case k22c: return VRegB_22c(); 15139f992750ac1eb7e51955d3e52bddc32b37c370fDragos Sbirlea case k22s: return VRegB_22s(); 15239f992750ac1eb7e51955d3e52bddc32b37c370fDragos Sbirlea case k22t: return VRegB_22t(); 15339f992750ac1eb7e51955d3e52bddc32b37c370fDragos Sbirlea case k22x: return VRegB_22x(); 1540e260a32601fb1178e11837c460807071d489f82Dragos Sbirlea case k23x: return VRegB_23x(); 15539f992750ac1eb7e51955d3e52bddc32b37c370fDragos Sbirlea case k32x: return VRegB_32x(); 15639f992750ac1eb7e51955d3e52bddc32b37c370fDragos Sbirlea default: LOG(FATAL) << "Tried to access vB of instruction " << Name() << 15739f992750ac1eb7e51955d3e52bddc32b37c370fDragos Sbirlea " which has no B operand."; 15839f992750ac1eb7e51955d3e52bddc32b37c370fDragos Sbirlea } 1598cc5162f19d64eb6414e7e421cea4413debe671eDragos Sbirlea return -1; 16039f992750ac1eb7e51955d3e52bddc32b37c370fDragos Sbirlea} 16139f992750ac1eb7e51955d3e52bddc32b37c370fDragos Sbirlea 162d25de7a7c5f3c9462654a572e28cca73909520b0Dragos Sbirleaint32_t Instruction::VRegA() const { 163d25de7a7c5f3c9462654a572e28cca73909520b0Dragos Sbirlea switch (FormatOf(Opcode())) { 164d25de7a7c5f3c9462654a572e28cca73909520b0Dragos Sbirlea case k11n: return VRegA_11n(); 165d25de7a7c5f3c9462654a572e28cca73909520b0Dragos Sbirlea case k11x: return VRegA_11x(); 166d25de7a7c5f3c9462654a572e28cca73909520b0Dragos Sbirlea case k12x: return VRegA_12x(); 167d25de7a7c5f3c9462654a572e28cca73909520b0Dragos Sbirlea case k21c: return VRegA_21c(); 168d25de7a7c5f3c9462654a572e28cca73909520b0Dragos Sbirlea case k21h: return VRegA_21h(); 169d25de7a7c5f3c9462654a572e28cca73909520b0Dragos Sbirlea case k21s: return VRegA_21s(); 170d25de7a7c5f3c9462654a572e28cca73909520b0Dragos Sbirlea case k21t: return VRegA_21t(); 171d25de7a7c5f3c9462654a572e28cca73909520b0Dragos Sbirlea case k22b: return VRegA_22b(); 172d25de7a7c5f3c9462654a572e28cca73909520b0Dragos Sbirlea case k22c: return VRegA_22c(); 173d25de7a7c5f3c9462654a572e28cca73909520b0Dragos Sbirlea case k22s: return VRegA_22s(); 174d25de7a7c5f3c9462654a572e28cca73909520b0Dragos Sbirlea case k22t: return VRegA_22t(); 175d25de7a7c5f3c9462654a572e28cca73909520b0Dragos Sbirlea case k22x: return VRegA_22x(); 176d25de7a7c5f3c9462654a572e28cca73909520b0Dragos Sbirlea case k23x: return VRegA_23x(); 177d25de7a7c5f3c9462654a572e28cca73909520b0Dragos Sbirlea case k31c: return VRegA_31c(); 178d25de7a7c5f3c9462654a572e28cca73909520b0Dragos Sbirlea case k31i: return VRegA_31i(); 179d25de7a7c5f3c9462654a572e28cca73909520b0Dragos Sbirlea case k31t: return VRegA_31t(); 180d25de7a7c5f3c9462654a572e28cca73909520b0Dragos Sbirlea case k32x: return VRegA_32x(); 181d25de7a7c5f3c9462654a572e28cca73909520b0Dragos Sbirlea case k51l: return VRegA_51l(); 1828cc5162f19d64eb6414e7e421cea4413debe671eDragos Sbirlea default: LOG(FATAL) << "Tried to access vA of instruction " << Name() << 183d25de7a7c5f3c9462654a572e28cca73909520b0Dragos Sbirlea " which has no A operand."; 184d25de7a7c5f3c9462654a572e28cca73909520b0Dragos Sbirlea } 1858cc5162f19d64eb6414e7e421cea4413debe671eDragos Sbirlea return -1; 186d25de7a7c5f3c9462654a572e28cca73909520b0Dragos Sbirlea} 187d25de7a7c5f3c9462654a572e28cca73909520b0Dragos Sbirlea 18839f992750ac1eb7e51955d3e52bddc32b37c370fDragos Sbirleaint32_t Instruction::GetTargetOffset() const { 18939f992750ac1eb7e51955d3e52bddc32b37c370fDragos Sbirlea switch (FormatOf(Opcode())) { 19039f992750ac1eb7e51955d3e52bddc32b37c370fDragos Sbirlea // Cases for conditional branches follow. 19139f992750ac1eb7e51955d3e52bddc32b37c370fDragos Sbirlea case k22t: return VRegC_22t(); 19239f992750ac1eb7e51955d3e52bddc32b37c370fDragos Sbirlea case k21t: return VRegB_21t(); 19339f992750ac1eb7e51955d3e52bddc32b37c370fDragos Sbirlea // Cases for unconditional branches follow. 19439f992750ac1eb7e51955d3e52bddc32b37c370fDragos Sbirlea case k10t: return VRegA_10t(); 19539f992750ac1eb7e51955d3e52bddc32b37c370fDragos Sbirlea case k20t: return VRegA_20t(); 19639f992750ac1eb7e51955d3e52bddc32b37c370fDragos Sbirlea case k30t: return VRegA_30t(); 19739f992750ac1eb7e51955d3e52bddc32b37c370fDragos Sbirlea default: LOG(FATAL) << "Tried to access the branch offset of an instruction " << Name() << 19839f992750ac1eb7e51955d3e52bddc32b37c370fDragos Sbirlea " which does not have a target operand."; 19939f992750ac1eb7e51955d3e52bddc32b37c370fDragos Sbirlea } 20039f992750ac1eb7e51955d3e52bddc32b37c370fDragos Sbirlea return 0; 20139f992750ac1eb7e51955d3e52bddc32b37c370fDragos Sbirlea} 20239f992750ac1eb7e51955d3e52bddc32b37c370fDragos Sbirlea 20339f992750ac1eb7e51955d3e52bddc32b37c370fDragos Sbirleabool Instruction::CanFlowThrough() const { 20439f992750ac1eb7e51955d3e52bddc32b37c370fDragos Sbirlea const uint16_t* insns = reinterpret_cast<const uint16_t*>(this); 20539f992750ac1eb7e51955d3e52bddc32b37c370fDragos Sbirlea uint16_t insn = *insns; 20639f992750ac1eb7e51955d3e52bddc32b37c370fDragos Sbirlea Code opcode = static_cast<Code>(insn & 0xFF); 20739f992750ac1eb7e51955d3e52bddc32b37c370fDragos Sbirlea return FlagsOf(opcode) & Instruction::kContinue; 20839f992750ac1eb7e51955d3e52bddc32b37c370fDragos Sbirlea} 20939f992750ac1eb7e51955d3e52bddc32b37c370fDragos Sbirlea 210ba5ebb944b7c5c6a1b754b6dd47eed96f39aea29jeffhaovoid Instruction::Decode(uint32_t &vA, uint32_t &vB, uint64_t &vB_wide, uint32_t &vC, uint32_t arg[]) const { 211ba5ebb944b7c5c6a1b754b6dd47eed96f39aea29jeffhao const uint16_t* insns = reinterpret_cast<const uint16_t*>(this); 212ba5ebb944b7c5c6a1b754b6dd47eed96f39aea29jeffhao uint16_t insn = *insns; 213a75a01313e801c53145df00bad1842d9f643c0a1Ian Rogers Code opcode = static_cast<Code>(insn & 0xFF); 214ba5ebb944b7c5c6a1b754b6dd47eed96f39aea29jeffhao 215a75a01313e801c53145df00bad1842d9f643c0a1Ian Rogers switch (FormatOf(opcode)) { 216ba5ebb944b7c5c6a1b754b6dd47eed96f39aea29jeffhao case k10x: // op 217ba5ebb944b7c5c6a1b754b6dd47eed96f39aea29jeffhao /* nothing to do; copy the AA bits out for the verifier */ 218ba5ebb944b7c5c6a1b754b6dd47eed96f39aea29jeffhao vA = INST_AA(insn); 219ba5ebb944b7c5c6a1b754b6dd47eed96f39aea29jeffhao break; 220ba5ebb944b7c5c6a1b754b6dd47eed96f39aea29jeffhao case k12x: // op vA, vB 221ba5ebb944b7c5c6a1b754b6dd47eed96f39aea29jeffhao vA = INST_A(insn); 222ba5ebb944b7c5c6a1b754b6dd47eed96f39aea29jeffhao vB = INST_B(insn); 223ba5ebb944b7c5c6a1b754b6dd47eed96f39aea29jeffhao break; 224ba5ebb944b7c5c6a1b754b6dd47eed96f39aea29jeffhao case k11n: // op vA, #+B 225ba5ebb944b7c5c6a1b754b6dd47eed96f39aea29jeffhao vA = INST_A(insn); 2267934ac288acfb2552bb0b06ec1f61e5820d924a4Brian Carlstrom vB = (int32_t) (INST_B(insn) << 28) >> 28; // sign extend 4-bit value 227ba5ebb944b7c5c6a1b754b6dd47eed96f39aea29jeffhao break; 228ba5ebb944b7c5c6a1b754b6dd47eed96f39aea29jeffhao case k11x: // op vAA 229ba5ebb944b7c5c6a1b754b6dd47eed96f39aea29jeffhao vA = INST_AA(insn); 230ba5ebb944b7c5c6a1b754b6dd47eed96f39aea29jeffhao break; 231ba5ebb944b7c5c6a1b754b6dd47eed96f39aea29jeffhao case k10t: // op +AA 232ba5ebb944b7c5c6a1b754b6dd47eed96f39aea29jeffhao vA = (int8_t) INST_AA(insn); // sign-extend 8-bit value 233ba5ebb944b7c5c6a1b754b6dd47eed96f39aea29jeffhao break; 234ba5ebb944b7c5c6a1b754b6dd47eed96f39aea29jeffhao case k20t: // op +AAAA 235ba5ebb944b7c5c6a1b754b6dd47eed96f39aea29jeffhao vA = (int16_t) FETCH(1); // sign-extend 16-bit value 236ba5ebb944b7c5c6a1b754b6dd47eed96f39aea29jeffhao break; 237ba5ebb944b7c5c6a1b754b6dd47eed96f39aea29jeffhao case k21c: // op vAA, thing@BBBB 238ba5ebb944b7c5c6a1b754b6dd47eed96f39aea29jeffhao case k22x: // op vAA, vBBBB 239ba5ebb944b7c5c6a1b754b6dd47eed96f39aea29jeffhao vA = INST_AA(insn); 240ba5ebb944b7c5c6a1b754b6dd47eed96f39aea29jeffhao vB = FETCH(1); 241ba5ebb944b7c5c6a1b754b6dd47eed96f39aea29jeffhao break; 242ba5ebb944b7c5c6a1b754b6dd47eed96f39aea29jeffhao case k21s: // op vAA, #+BBBB 243ba5ebb944b7c5c6a1b754b6dd47eed96f39aea29jeffhao case k21t: // op vAA, +BBBB 244ba5ebb944b7c5c6a1b754b6dd47eed96f39aea29jeffhao vA = INST_AA(insn); 245ba5ebb944b7c5c6a1b754b6dd47eed96f39aea29jeffhao vB = (int16_t) FETCH(1); // sign-extend 16-bit value 246ba5ebb944b7c5c6a1b754b6dd47eed96f39aea29jeffhao break; 247ba5ebb944b7c5c6a1b754b6dd47eed96f39aea29jeffhao case k21h: // op vAA, #+BBBB0000[00000000] 248ba5ebb944b7c5c6a1b754b6dd47eed96f39aea29jeffhao vA = INST_AA(insn); 249ba5ebb944b7c5c6a1b754b6dd47eed96f39aea29jeffhao /* 250ba5ebb944b7c5c6a1b754b6dd47eed96f39aea29jeffhao * The value should be treated as right-zero-extended, but we don't 251ba5ebb944b7c5c6a1b754b6dd47eed96f39aea29jeffhao * actually do that here. Among other things, we don't know if it's 252ba5ebb944b7c5c6a1b754b6dd47eed96f39aea29jeffhao * the top bits of a 32- or 64-bit value. 253ba5ebb944b7c5c6a1b754b6dd47eed96f39aea29jeffhao */ 254ba5ebb944b7c5c6a1b754b6dd47eed96f39aea29jeffhao vB = FETCH(1); 255ba5ebb944b7c5c6a1b754b6dd47eed96f39aea29jeffhao break; 256ba5ebb944b7c5c6a1b754b6dd47eed96f39aea29jeffhao case k23x: // op vAA, vBB, vCC 257ba5ebb944b7c5c6a1b754b6dd47eed96f39aea29jeffhao vA = INST_AA(insn); 258ba5ebb944b7c5c6a1b754b6dd47eed96f39aea29jeffhao vB = FETCH(1) & 0xff; 259ba5ebb944b7c5c6a1b754b6dd47eed96f39aea29jeffhao vC = FETCH(1) >> 8; 260ba5ebb944b7c5c6a1b754b6dd47eed96f39aea29jeffhao break; 261ba5ebb944b7c5c6a1b754b6dd47eed96f39aea29jeffhao case k22b: // op vAA, vBB, #+CC 262ba5ebb944b7c5c6a1b754b6dd47eed96f39aea29jeffhao vA = INST_AA(insn); 263ba5ebb944b7c5c6a1b754b6dd47eed96f39aea29jeffhao vB = FETCH(1) & 0xff; 264ba5ebb944b7c5c6a1b754b6dd47eed96f39aea29jeffhao vC = (int8_t) (FETCH(1) >> 8); // sign-extend 8-bit value 265ba5ebb944b7c5c6a1b754b6dd47eed96f39aea29jeffhao break; 266ba5ebb944b7c5c6a1b754b6dd47eed96f39aea29jeffhao case k22s: // op vA, vB, #+CCCC 267ba5ebb944b7c5c6a1b754b6dd47eed96f39aea29jeffhao case k22t: // op vA, vB, +CCCC 268ba5ebb944b7c5c6a1b754b6dd47eed96f39aea29jeffhao vA = INST_A(insn); 269ba5ebb944b7c5c6a1b754b6dd47eed96f39aea29jeffhao vB = INST_B(insn); 270ba5ebb944b7c5c6a1b754b6dd47eed96f39aea29jeffhao vC = (int16_t) FETCH(1); // sign-extend 16-bit value 271ba5ebb944b7c5c6a1b754b6dd47eed96f39aea29jeffhao break; 272ba5ebb944b7c5c6a1b754b6dd47eed96f39aea29jeffhao case k22c: // op vA, vB, thing@CCCC 273ba5ebb944b7c5c6a1b754b6dd47eed96f39aea29jeffhao vA = INST_A(insn); 274ba5ebb944b7c5c6a1b754b6dd47eed96f39aea29jeffhao vB = INST_B(insn); 275ba5ebb944b7c5c6a1b754b6dd47eed96f39aea29jeffhao vC = FETCH(1); 276ba5ebb944b7c5c6a1b754b6dd47eed96f39aea29jeffhao break; 277ba5ebb944b7c5c6a1b754b6dd47eed96f39aea29jeffhao case k30t: // op +AAAAAAAA 278807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz vA = FETCH_uint32(1); // signed 32-bit value 279ba5ebb944b7c5c6a1b754b6dd47eed96f39aea29jeffhao break; 280ba5ebb944b7c5c6a1b754b6dd47eed96f39aea29jeffhao case k31t: // op vAA, +BBBBBBBB 281ba5ebb944b7c5c6a1b754b6dd47eed96f39aea29jeffhao case k31c: // op vAA, string@BBBBBBBB 282ba5ebb944b7c5c6a1b754b6dd47eed96f39aea29jeffhao vA = INST_AA(insn); 283807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz vB = FETCH_uint32(1); // 32-bit value 284ba5ebb944b7c5c6a1b754b6dd47eed96f39aea29jeffhao break; 285ba5ebb944b7c5c6a1b754b6dd47eed96f39aea29jeffhao case k32x: // op vAAAA, vBBBB 286ba5ebb944b7c5c6a1b754b6dd47eed96f39aea29jeffhao vA = FETCH(1); 287ba5ebb944b7c5c6a1b754b6dd47eed96f39aea29jeffhao vB = FETCH(2); 288ba5ebb944b7c5c6a1b754b6dd47eed96f39aea29jeffhao break; 289ba5ebb944b7c5c6a1b754b6dd47eed96f39aea29jeffhao case k31i: // op vAA, #+BBBBBBBB 290ba5ebb944b7c5c6a1b754b6dd47eed96f39aea29jeffhao vA = INST_AA(insn); 291807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz vB = FETCH_uint32(1); // signed 32-bit value 292ba5ebb944b7c5c6a1b754b6dd47eed96f39aea29jeffhao break; 293ba5ebb944b7c5c6a1b754b6dd47eed96f39aea29jeffhao case k35c: // op {vC, vD, vE, vF, vG}, thing@BBBB 294ba5ebb944b7c5c6a1b754b6dd47eed96f39aea29jeffhao { 295ba5ebb944b7c5c6a1b754b6dd47eed96f39aea29jeffhao /* 296ba5ebb944b7c5c6a1b754b6dd47eed96f39aea29jeffhao * Note that the fields mentioned in the spec don't appear in 297ba5ebb944b7c5c6a1b754b6dd47eed96f39aea29jeffhao * their "usual" positions here compared to most formats. This 298ba5ebb944b7c5c6a1b754b6dd47eed96f39aea29jeffhao * was done so that the field names for the argument count and 299ba5ebb944b7c5c6a1b754b6dd47eed96f39aea29jeffhao * reference index match between this format and the corresponding 300ba5ebb944b7c5c6a1b754b6dd47eed96f39aea29jeffhao * range formats (3rc and friends). 301ba5ebb944b7c5c6a1b754b6dd47eed96f39aea29jeffhao * 302ba5ebb944b7c5c6a1b754b6dd47eed96f39aea29jeffhao * Bottom line: The argument count is always in vA, and the 303ba5ebb944b7c5c6a1b754b6dd47eed96f39aea29jeffhao * method constant (or equivalent) is always in vB. 304ba5ebb944b7c5c6a1b754b6dd47eed96f39aea29jeffhao */ 305ba5ebb944b7c5c6a1b754b6dd47eed96f39aea29jeffhao uint16_t regList; 306ba5ebb944b7c5c6a1b754b6dd47eed96f39aea29jeffhao int count; 307ba5ebb944b7c5c6a1b754b6dd47eed96f39aea29jeffhao 3087934ac288acfb2552bb0b06ec1f61e5820d924a4Brian Carlstrom vA = INST_B(insn); // This is labeled A in the spec. 309ba5ebb944b7c5c6a1b754b6dd47eed96f39aea29jeffhao vB = FETCH(1); 310ba5ebb944b7c5c6a1b754b6dd47eed96f39aea29jeffhao regList = FETCH(2); 311ba5ebb944b7c5c6a1b754b6dd47eed96f39aea29jeffhao 312ba5ebb944b7c5c6a1b754b6dd47eed96f39aea29jeffhao count = vA; 313ba5ebb944b7c5c6a1b754b6dd47eed96f39aea29jeffhao 314ba5ebb944b7c5c6a1b754b6dd47eed96f39aea29jeffhao /* 315ba5ebb944b7c5c6a1b754b6dd47eed96f39aea29jeffhao * Copy the argument registers into the arg[] array, and 316ba5ebb944b7c5c6a1b754b6dd47eed96f39aea29jeffhao * also copy the first argument (if any) into vC. (The 317ba5ebb944b7c5c6a1b754b6dd47eed96f39aea29jeffhao * DecodedInstruction structure doesn't have separate 318ba5ebb944b7c5c6a1b754b6dd47eed96f39aea29jeffhao * fields for {vD, vE, vF, vG}, so there's no need to make 319ba5ebb944b7c5c6a1b754b6dd47eed96f39aea29jeffhao * copies of those.) Note that cases 5..2 fall through. 320ba5ebb944b7c5c6a1b754b6dd47eed96f39aea29jeffhao */ 321ba5ebb944b7c5c6a1b754b6dd47eed96f39aea29jeffhao switch (count) { 322ba5ebb944b7c5c6a1b754b6dd47eed96f39aea29jeffhao case 5: arg[4] = INST_A(insn); 323ba5ebb944b7c5c6a1b754b6dd47eed96f39aea29jeffhao case 4: arg[3] = (regList >> 12) & 0x0f; 324ba5ebb944b7c5c6a1b754b6dd47eed96f39aea29jeffhao case 3: arg[2] = (regList >> 8) & 0x0f; 325ba5ebb944b7c5c6a1b754b6dd47eed96f39aea29jeffhao case 2: arg[1] = (regList >> 4) & 0x0f; 326ba5ebb944b7c5c6a1b754b6dd47eed96f39aea29jeffhao case 1: vC = arg[0] = regList & 0x0f; break; 3277934ac288acfb2552bb0b06ec1f61e5820d924a4Brian Carlstrom case 0: break; // Valid, but no need to do anything. 328ba5ebb944b7c5c6a1b754b6dd47eed96f39aea29jeffhao default: 329ba5ebb944b7c5c6a1b754b6dd47eed96f39aea29jeffhao LOG(ERROR) << "Invalid arg count in 35c (" << count << ")"; 330ba5ebb944b7c5c6a1b754b6dd47eed96f39aea29jeffhao return; 331ba5ebb944b7c5c6a1b754b6dd47eed96f39aea29jeffhao } 332ba5ebb944b7c5c6a1b754b6dd47eed96f39aea29jeffhao } 333ba5ebb944b7c5c6a1b754b6dd47eed96f39aea29jeffhao break; 334ba5ebb944b7c5c6a1b754b6dd47eed96f39aea29jeffhao case k3rc: // op {vCCCC .. v(CCCC+AA-1)}, meth@BBBB 335ba5ebb944b7c5c6a1b754b6dd47eed96f39aea29jeffhao vA = INST_AA(insn); 336ba5ebb944b7c5c6a1b754b6dd47eed96f39aea29jeffhao vB = FETCH(1); 337ba5ebb944b7c5c6a1b754b6dd47eed96f39aea29jeffhao vC = FETCH(2); 338ba5ebb944b7c5c6a1b754b6dd47eed96f39aea29jeffhao break; 339ba5ebb944b7c5c6a1b754b6dd47eed96f39aea29jeffhao case k51l: // op vAA, #+BBBBBBBBBBBBBBBB 340ba5ebb944b7c5c6a1b754b6dd47eed96f39aea29jeffhao vA = INST_AA(insn); 341807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz vB_wide = FETCH_uint32(1) | ((uint64_t) FETCH_uint32(3) << 32); 342ba5ebb944b7c5c6a1b754b6dd47eed96f39aea29jeffhao break; 343ba5ebb944b7c5c6a1b754b6dd47eed96f39aea29jeffhao default: 344a75a01313e801c53145df00bad1842d9f643c0a1Ian Rogers LOG(ERROR) << "Can't decode unexpected format " << FormatOf(opcode) << " (op=" << opcode << ")"; 345ba5ebb944b7c5c6a1b754b6dd47eed96f39aea29jeffhao return; 346ba5ebb944b7c5c6a1b754b6dd47eed96f39aea29jeffhao } 347ba5ebb944b7c5c6a1b754b6dd47eed96f39aea29jeffhao} 348ba5ebb944b7c5c6a1b754b6dd47eed96f39aea29jeffhao 349a75a01313e801c53145df00bad1842d9f643c0a1Ian Rogerssize_t Instruction::SizeInCodeUnitsComplexOpcode() const { 35012eb78e651f13f2c1f0c2c922048a5a213253adfCarl Shapiro const uint16_t* insns = reinterpret_cast<const uint16_t*>(this); 351a75a01313e801c53145df00bad1842d9f643c0a1Ian Rogers // Handle special NOP encoded variable length sequences. 352a75a01313e801c53145df00bad1842d9f643c0a1Ian Rogers switch (*insns) { 353a75a01313e801c53145df00bad1842d9f643c0a1Ian Rogers case kPackedSwitchSignature: 354a75a01313e801c53145df00bad1842d9f643c0a1Ian Rogers return (4 + insns[1] * 2); 355a75a01313e801c53145df00bad1842d9f643c0a1Ian Rogers case kSparseSwitchSignature: 356a75a01313e801c53145df00bad1842d9f643c0a1Ian Rogers return (2 + insns[1] * 4); 357a75a01313e801c53145df00bad1842d9f643c0a1Ian Rogers case kArrayDataSignature: { 358a75a01313e801c53145df00bad1842d9f643c0a1Ian Rogers uint16_t element_size = insns[1]; 359a75a01313e801c53145df00bad1842d9f643c0a1Ian Rogers uint32_t length = insns[2] | (((uint32_t)insns[3]) << 16); 360a75a01313e801c53145df00bad1842d9f643c0a1Ian Rogers // The plus 1 is to round up for odd size and width. 361a75a01313e801c53145df00bad1842d9f643c0a1Ian Rogers return (4 + (element_size * length + 1) / 2); 362e4c1ce498f7933b91696caa4a527e6556128a8e2Carl Shapiro } 363a75a01313e801c53145df00bad1842d9f643c0a1Ian Rogers default: 364a75a01313e801c53145df00bad1842d9f643c0a1Ian Rogers if ((*insns & 0xFF) == 0) { 365a75a01313e801c53145df00bad1842d9f643c0a1Ian Rogers return 1; // NOP. 366a75a01313e801c53145df00bad1842d9f643c0a1Ian Rogers } else { 367a75a01313e801c53145df00bad1842d9f643c0a1Ian Rogers LOG(FATAL) << "Unreachable: " << DumpString(NULL); 368a75a01313e801c53145df00bad1842d9f643c0a1Ian Rogers return 0; 369a75a01313e801c53145df00bad1842d9f643c0a1Ian Rogers } 370e4c1ce498f7933b91696caa4a527e6556128a8e2Carl Shapiro } 371d81871cbbaa34c649e488f94f61a981db33123e5Ian Rogers} 372d81871cbbaa34c649e488f94f61a981db33123e5Ian Rogers 3732c8a857708fc86a5b555d1eb782b56516f3b1a72Ian Rogersstd::string Instruction::DumpHex(size_t code_units) const { 374d81871cbbaa34c649e488f94f61a981db33123e5Ian Rogers size_t inst_length = SizeInCodeUnits(); 375d81871cbbaa34c649e488f94f61a981db33123e5Ian Rogers if (inst_length > code_units) { 376d81871cbbaa34c649e488f94f61a981db33123e5Ian Rogers inst_length = code_units; 377d81871cbbaa34c649e488f94f61a981db33123e5Ian Rogers } 3782c8a857708fc86a5b555d1eb782b56516f3b1a72Ian Rogers std::ostringstream os; 379d81871cbbaa34c649e488f94f61a981db33123e5Ian Rogers const uint16_t* insn = reinterpret_cast<const uint16_t*>(this); 380d81871cbbaa34c649e488f94f61a981db33123e5Ian Rogers for (size_t i = 0; i < inst_length; i++) { 3812c8a857708fc86a5b555d1eb782b56516f3b1a72Ian Rogers os << StringPrintf("0x%04x", insn[i]) << " "; 382d81871cbbaa34c649e488f94f61a981db33123e5Ian Rogers } 383d81871cbbaa34c649e488f94f61a981db33123e5Ian Rogers for (size_t i = inst_length; i < code_units; i++) { 384d81871cbbaa34c649e488f94f61a981db33123e5Ian Rogers os << " "; 385d81871cbbaa34c649e488f94f61a981db33123e5Ian Rogers } 3862c8a857708fc86a5b555d1eb782b56516f3b1a72Ian Rogers return os.str(); 387d81871cbbaa34c649e488f94f61a981db33123e5Ian Rogers} 388d81871cbbaa34c649e488f94f61a981db33123e5Ian Rogers 3892c8a857708fc86a5b555d1eb782b56516f3b1a72Ian Rogersstd::string Instruction::DumpString(const DexFile* file) const { 3902c8a857708fc86a5b555d1eb782b56516f3b1a72Ian Rogers std::ostringstream os; 39175b2a4abea8a608d7aec3e417498b69b31026a74Sebastien Hertz const char* opcode = kInstructionNames[Opcode()]; 392adb8c67f6d87a160d4e3a8afea7cb93f6c14568bElliott Hughes switch (FormatOf(Opcode())) { 393e3c845cdb5884e770287a5c0c65c8bb64733c388Elliott Hughes case k10x: os << opcode; break; 39475b2a4abea8a608d7aec3e417498b69b31026a74Sebastien Hertz case k12x: os << StringPrintf("%s v%d, v%d", opcode, VRegA_12x(), VRegB_12x()); break; 39575b2a4abea8a608d7aec3e417498b69b31026a74Sebastien Hertz case k11n: os << StringPrintf("%s v%d, #%+d", opcode, VRegA_11n(), VRegB_11n()); break; 39675b2a4abea8a608d7aec3e417498b69b31026a74Sebastien Hertz case k11x: os << StringPrintf("%s v%d", opcode, VRegA_11x()); break; 39775b2a4abea8a608d7aec3e417498b69b31026a74Sebastien Hertz case k10t: os << StringPrintf("%s %+d", opcode, VRegA_10t()); break; 39875b2a4abea8a608d7aec3e417498b69b31026a74Sebastien Hertz case k20t: os << StringPrintf("%s %+d", opcode, VRegA_20t()); break; 39975b2a4abea8a608d7aec3e417498b69b31026a74Sebastien Hertz case k22x: os << StringPrintf("%s v%d, v%d", opcode, VRegA_22x(), VRegB_22x()); break; 40075b2a4abea8a608d7aec3e417498b69b31026a74Sebastien Hertz case k21t: os << StringPrintf("%s v%d, %+d", opcode, VRegA_21t(), VRegB_21t()); break; 40175b2a4abea8a608d7aec3e417498b69b31026a74Sebastien Hertz case k21s: os << StringPrintf("%s v%d, #%+d", opcode, VRegA_21s(), VRegB_21s()); break; 4021b3d6ca46d9594dbdec66b11f184e6483b007483Elliott Hughes case k21h: { 4031b3d6ca46d9594dbdec66b11f184e6483b007483Elliott Hughes // op vAA, #+BBBB0000[00000000] 40475b2a4abea8a608d7aec3e417498b69b31026a74Sebastien Hertz if (Opcode() == CONST_HIGH16) { 40575b2a4abea8a608d7aec3e417498b69b31026a74Sebastien Hertz uint32_t value = VRegB_21h() << 16; 40675b2a4abea8a608d7aec3e417498b69b31026a74Sebastien Hertz os << StringPrintf("%s v%d, #int %+d // 0x%x", opcode, VRegA_21h(), value, value); 4071b3d6ca46d9594dbdec66b11f184e6483b007483Elliott Hughes } else { 40875b2a4abea8a608d7aec3e417498b69b31026a74Sebastien Hertz uint64_t value = static_cast<uint64_t>(VRegB_21h()) << 48; 409b574c1816c7a2f160b267cd100f36f157a9abcf6Ian Rogers os << StringPrintf("%s v%d, #long %+" PRId64 " // 0x%" PRIx64, opcode, VRegA_21h(), 410b574c1816c7a2f160b267cd100f36f157a9abcf6Ian Rogers value, value); 4111b3d6ca46d9594dbdec66b11f184e6483b007483Elliott Hughes } 4121b3d6ca46d9594dbdec66b11f184e6483b007483Elliott Hughes } 4131b3d6ca46d9594dbdec66b11f184e6483b007483Elliott Hughes break; 41490334e5586ada4772229ded6f7acb85de524a704Ian Rogers case k21c: { 41575b2a4abea8a608d7aec3e417498b69b31026a74Sebastien Hertz switch (Opcode()) { 41690334e5586ada4772229ded6f7acb85de524a704Ian Rogers case CONST_STRING: 41790334e5586ada4772229ded6f7acb85de524a704Ian Rogers if (file != NULL) { 41875b2a4abea8a608d7aec3e417498b69b31026a74Sebastien Hertz uint32_t string_idx = VRegB_21c(); 41975b2a4abea8a608d7aec3e417498b69b31026a74Sebastien Hertz os << StringPrintf("const-string v%d, %s // string@%d", VRegA_21c(), 42075b2a4abea8a608d7aec3e417498b69b31026a74Sebastien Hertz PrintableString(file->StringDataByIdx(string_idx)).c_str(), string_idx); 42190334e5586ada4772229ded6f7acb85de524a704Ian Rogers break; 42290334e5586ada4772229ded6f7acb85de524a704Ian Rogers } // else fall-through 42318c24b6e05e7591069f1a2ac9c614b28fc0853acMathieu Chartier case CHECK_CAST: 42418c24b6e05e7591069f1a2ac9c614b28fc0853acMathieu Chartier case CONST_CLASS: 42590334e5586ada4772229ded6f7acb85de524a704Ian Rogers case NEW_INSTANCE: 42690334e5586ada4772229ded6f7acb85de524a704Ian Rogers if (file != NULL) { 42775b2a4abea8a608d7aec3e417498b69b31026a74Sebastien Hertz uint32_t type_idx = VRegB_21c(); 428b43cef30fa7171f5b33c5f94853ad8474ed08022Dragos Sbirlea os << opcode << " v" << static_cast<int>(VRegA_21c()) << ", " << PrettyType(type_idx, *file) 42975b2a4abea8a608d7aec3e417498b69b31026a74Sebastien Hertz << " // type@" << type_idx; 43090334e5586ada4772229ded6f7acb85de524a704Ian Rogers break; 43190334e5586ada4772229ded6f7acb85de524a704Ian Rogers } // else fall-through 43290334e5586ada4772229ded6f7acb85de524a704Ian Rogers case SGET: 43390334e5586ada4772229ded6f7acb85de524a704Ian Rogers case SGET_WIDE: 43490334e5586ada4772229ded6f7acb85de524a704Ian Rogers case SGET_OBJECT: 43590334e5586ada4772229ded6f7acb85de524a704Ian Rogers case SGET_BOOLEAN: 43690334e5586ada4772229ded6f7acb85de524a704Ian Rogers case SGET_BYTE: 43790334e5586ada4772229ded6f7acb85de524a704Ian Rogers case SGET_CHAR: 43890334e5586ada4772229ded6f7acb85de524a704Ian Rogers case SGET_SHORT: 43990334e5586ada4772229ded6f7acb85de524a704Ian Rogers if (file != NULL) { 44075b2a4abea8a608d7aec3e417498b69b31026a74Sebastien Hertz uint32_t field_idx = VRegB_21c(); 441b43cef30fa7171f5b33c5f94853ad8474ed08022Dragos Sbirlea os << opcode << " v" << static_cast<int>(VRegA_21c()) << ", " << PrettyField(field_idx, *file, true) 44275b2a4abea8a608d7aec3e417498b69b31026a74Sebastien Hertz << " // field@" << field_idx; 44390334e5586ada4772229ded6f7acb85de524a704Ian Rogers break; 44490334e5586ada4772229ded6f7acb85de524a704Ian Rogers } // else fall-through 44590334e5586ada4772229ded6f7acb85de524a704Ian Rogers case SPUT: 44690334e5586ada4772229ded6f7acb85de524a704Ian Rogers case SPUT_WIDE: 44790334e5586ada4772229ded6f7acb85de524a704Ian Rogers case SPUT_OBJECT: 44890334e5586ada4772229ded6f7acb85de524a704Ian Rogers case SPUT_BOOLEAN: 44990334e5586ada4772229ded6f7acb85de524a704Ian Rogers case SPUT_BYTE: 45090334e5586ada4772229ded6f7acb85de524a704Ian Rogers case SPUT_CHAR: 45190334e5586ada4772229ded6f7acb85de524a704Ian Rogers case SPUT_SHORT: 45290334e5586ada4772229ded6f7acb85de524a704Ian Rogers if (file != NULL) { 45375b2a4abea8a608d7aec3e417498b69b31026a74Sebastien Hertz uint32_t field_idx = VRegB_21c(); 454b43cef30fa7171f5b33c5f94853ad8474ed08022Dragos Sbirlea os << opcode << " v" << static_cast<int>(VRegA_21c()) << ", " << PrettyField(field_idx, *file, true) 45575b2a4abea8a608d7aec3e417498b69b31026a74Sebastien Hertz << " // field@" << field_idx; 45690334e5586ada4772229ded6f7acb85de524a704Ian Rogers break; 45790334e5586ada4772229ded6f7acb85de524a704Ian Rogers } // else fall-through 45890334e5586ada4772229ded6f7acb85de524a704Ian Rogers default: 45975b2a4abea8a608d7aec3e417498b69b31026a74Sebastien Hertz os << StringPrintf("%s v%d, thing@%d", opcode, VRegA_21c(), VRegB_21c()); 46090334e5586ada4772229ded6f7acb85de524a704Ian Rogers break; 46190334e5586ada4772229ded6f7acb85de524a704Ian Rogers } 46290334e5586ada4772229ded6f7acb85de524a704Ian Rogers break; 46390334e5586ada4772229ded6f7acb85de524a704Ian Rogers } 46475b2a4abea8a608d7aec3e417498b69b31026a74Sebastien Hertz case k23x: os << StringPrintf("%s v%d, v%d, v%d", opcode, VRegA_23x(), VRegB_23x(), VRegC_23x()); break; 46575b2a4abea8a608d7aec3e417498b69b31026a74Sebastien Hertz case k22b: os << StringPrintf("%s v%d, v%d, #%+d", opcode, VRegA_22b(), VRegB_22b(), VRegC_22b()); break; 46675b2a4abea8a608d7aec3e417498b69b31026a74Sebastien Hertz case k22t: os << StringPrintf("%s v%d, v%d, %+d", opcode, VRegA_22t(), VRegB_22t(), VRegC_22t()); break; 46775b2a4abea8a608d7aec3e417498b69b31026a74Sebastien Hertz case k22s: os << StringPrintf("%s v%d, v%d, #%+d", opcode, VRegA_22s(), VRegB_22s(), VRegC_22s()); break; 46890334e5586ada4772229ded6f7acb85de524a704Ian Rogers case k22c: { 46975b2a4abea8a608d7aec3e417498b69b31026a74Sebastien Hertz switch (Opcode()) { 47090334e5586ada4772229ded6f7acb85de524a704Ian Rogers case IGET: 47190334e5586ada4772229ded6f7acb85de524a704Ian Rogers case IGET_WIDE: 47290334e5586ada4772229ded6f7acb85de524a704Ian Rogers case IGET_OBJECT: 47390334e5586ada4772229ded6f7acb85de524a704Ian Rogers case IGET_BOOLEAN: 47490334e5586ada4772229ded6f7acb85de524a704Ian Rogers case IGET_BYTE: 47590334e5586ada4772229ded6f7acb85de524a704Ian Rogers case IGET_CHAR: 47690334e5586ada4772229ded6f7acb85de524a704Ian Rogers case IGET_SHORT: 47790334e5586ada4772229ded6f7acb85de524a704Ian Rogers if (file != NULL) { 47875b2a4abea8a608d7aec3e417498b69b31026a74Sebastien Hertz uint32_t field_idx = VRegC_22c(); 479b43cef30fa7171f5b33c5f94853ad8474ed08022Dragos Sbirlea os << opcode << " v" << static_cast<int>(VRegA_22c()) << ", v" << static_cast<int>(VRegB_22c()) << ", " 48075b2a4abea8a608d7aec3e417498b69b31026a74Sebastien Hertz << PrettyField(field_idx, *file, true) << " // field@" << field_idx; 48190334e5586ada4772229ded6f7acb85de524a704Ian Rogers break; 48290334e5586ada4772229ded6f7acb85de524a704Ian Rogers } // else fall-through 4832d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz case IGET_QUICK: 4842d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz case IGET_OBJECT_QUICK: 4852d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz if (file != NULL) { 4862d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz uint32_t field_idx = VRegC_22c(); 4872d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz os << opcode << " v" << static_cast<int>(VRegA_22c()) << ", v" << static_cast<int>(VRegB_22c()) << ", " 4882d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz << "// offset@" << field_idx; 4892d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz break; 4902d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz } // else fall-through 49190334e5586ada4772229ded6f7acb85de524a704Ian Rogers case IPUT: 49290334e5586ada4772229ded6f7acb85de524a704Ian Rogers case IPUT_WIDE: 49390334e5586ada4772229ded6f7acb85de524a704Ian Rogers case IPUT_OBJECT: 49490334e5586ada4772229ded6f7acb85de524a704Ian Rogers case IPUT_BOOLEAN: 49590334e5586ada4772229ded6f7acb85de524a704Ian Rogers case IPUT_BYTE: 49690334e5586ada4772229ded6f7acb85de524a704Ian Rogers case IPUT_CHAR: 49790334e5586ada4772229ded6f7acb85de524a704Ian Rogers case IPUT_SHORT: 49890334e5586ada4772229ded6f7acb85de524a704Ian Rogers if (file != NULL) { 49975b2a4abea8a608d7aec3e417498b69b31026a74Sebastien Hertz uint32_t field_idx = VRegC_22c(); 500b43cef30fa7171f5b33c5f94853ad8474ed08022Dragos Sbirlea os << opcode << " v" << static_cast<int>(VRegA_22c()) << ", v" << static_cast<int>(VRegB_22c()) << ", " 50175b2a4abea8a608d7aec3e417498b69b31026a74Sebastien Hertz << PrettyField(field_idx, *file, true) << " // field@" << field_idx; 50290334e5586ada4772229ded6f7acb85de524a704Ian Rogers break; 50390334e5586ada4772229ded6f7acb85de524a704Ian Rogers } // else fall-through 5042d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz case IPUT_QUICK: 5052d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz case IPUT_OBJECT_QUICK: 5062d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz if (file != NULL) { 5072d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz uint32_t field_idx = VRegC_22c(); 5082d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz os << opcode << " v" << static_cast<int>(VRegA_22c()) << ", v" << static_cast<int>(VRegB_22c()) << ", " 5092d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz << "// offset@" << field_idx; 5102d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz break; 5112d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz } // else fall-through 51290334e5586ada4772229ded6f7acb85de524a704Ian Rogers case INSTANCE_OF: 51390334e5586ada4772229ded6f7acb85de524a704Ian Rogers if (file != NULL) { 51475b2a4abea8a608d7aec3e417498b69b31026a74Sebastien Hertz uint32_t type_idx = VRegC_22c(); 515d4e868a25128e31c92b2779e7d2e15f9afdf4fffDragos Sbirlea os << opcode << " v" << static_cast<int>(VRegA_22c()) << ", v" << static_cast<int>(VRegB_22c()) << ", " 51675b2a4abea8a608d7aec3e417498b69b31026a74Sebastien Hertz << PrettyType(type_idx, *file) << " // type@" << type_idx; 51718c24b6e05e7591069f1a2ac9c614b28fc0853acMathieu Chartier break; 51818c24b6e05e7591069f1a2ac9c614b28fc0853acMathieu Chartier } 51918c24b6e05e7591069f1a2ac9c614b28fc0853acMathieu Chartier case NEW_ARRAY: 52018c24b6e05e7591069f1a2ac9c614b28fc0853acMathieu Chartier if (file != NULL) { 52175b2a4abea8a608d7aec3e417498b69b31026a74Sebastien Hertz uint32_t type_idx = VRegC_22c(); 522b43cef30fa7171f5b33c5f94853ad8474ed08022Dragos Sbirlea os << opcode << " v" << static_cast<int>(VRegA_22c()) << ", v" << static_cast<int>(VRegB_22c()) << ", " 52375b2a4abea8a608d7aec3e417498b69b31026a74Sebastien Hertz << PrettyType(type_idx, *file) << " // type@" << type_idx; 52490334e5586ada4772229ded6f7acb85de524a704Ian Rogers break; 52590334e5586ada4772229ded6f7acb85de524a704Ian Rogers } // else fall-through 52690334e5586ada4772229ded6f7acb85de524a704Ian Rogers default: 52775b2a4abea8a608d7aec3e417498b69b31026a74Sebastien Hertz os << StringPrintf("%s v%d, v%d, thing@%d", opcode, VRegA_22c(), VRegB_22c(), VRegC_22c()); 52890334e5586ada4772229ded6f7acb85de524a704Ian Rogers break; 52990334e5586ada4772229ded6f7acb85de524a704Ian Rogers } 53090334e5586ada4772229ded6f7acb85de524a704Ian Rogers break; 53190334e5586ada4772229ded6f7acb85de524a704Ian Rogers } 53275b2a4abea8a608d7aec3e417498b69b31026a74Sebastien Hertz case k32x: os << StringPrintf("%s v%d, v%d", opcode, VRegA_32x(), VRegB_32x()); break; 53375b2a4abea8a608d7aec3e417498b69b31026a74Sebastien Hertz case k30t: os << StringPrintf("%s %+d", opcode, VRegA_30t()); break; 53475b2a4abea8a608d7aec3e417498b69b31026a74Sebastien Hertz case k31t: os << StringPrintf("%s v%d, %+d", opcode, VRegA_31t(), VRegB_31t()); break; 53575b2a4abea8a608d7aec3e417498b69b31026a74Sebastien Hertz case k31i: os << StringPrintf("%s v%d, #%+d", opcode, VRegA_31i(), VRegB_31i()); break; 5367dfb28c066159e6cde8181720f0c451a700ef966Ian Rogers case k31c: 5377dfb28c066159e6cde8181720f0c451a700ef966Ian Rogers if (Opcode() == CONST_STRING_JUMBO) { 5387dfb28c066159e6cde8181720f0c451a700ef966Ian Rogers uint32_t string_idx = VRegB_31c(); 5397dfb28c066159e6cde8181720f0c451a700ef966Ian Rogers if (file != NULL) { 5407dfb28c066159e6cde8181720f0c451a700ef966Ian Rogers os << StringPrintf("%s v%d, %s // string@%d", opcode, VRegA_31c(), 5417dfb28c066159e6cde8181720f0c451a700ef966Ian Rogers PrintableString(file->StringDataByIdx(string_idx)).c_str(), 5427dfb28c066159e6cde8181720f0c451a700ef966Ian Rogers string_idx); 5437dfb28c066159e6cde8181720f0c451a700ef966Ian Rogers } else { 5447dfb28c066159e6cde8181720f0c451a700ef966Ian Rogers os << StringPrintf("%s v%d, string@%d", opcode, VRegA_31c(), string_idx); 5457dfb28c066159e6cde8181720f0c451a700ef966Ian Rogers } 5467dfb28c066159e6cde8181720f0c451a700ef966Ian Rogers } else { 5477dfb28c066159e6cde8181720f0c451a700ef966Ian Rogers os << StringPrintf("%s v%d, thing@%d", opcode, VRegA_31c(), VRegB_31c()); break; 5487dfb28c066159e6cde8181720f0c451a700ef966Ian Rogers } 5497dfb28c066159e6cde8181720f0c451a700ef966Ian Rogers break; 550d81871cbbaa34c649e488f94f61a981db33123e5Ian Rogers case k35c: { 55175b2a4abea8a608d7aec3e417498b69b31026a74Sebastien Hertz uint32_t arg[5]; 55275b2a4abea8a608d7aec3e417498b69b31026a74Sebastien Hertz GetArgs(arg); 55375b2a4abea8a608d7aec3e417498b69b31026a74Sebastien Hertz switch (Opcode()) { 5547aca91db1571594cdb7e0a9ee704530b09c066e4Andreas Gampe case FILLED_NEW_ARRAY: 5557aca91db1571594cdb7e0a9ee704530b09c066e4Andreas Gampe { 5567aca91db1571594cdb7e0a9ee704530b09c066e4Andreas Gampe const int32_t a = VRegA_35c(); 5577aca91db1571594cdb7e0a9ee704530b09c066e4Andreas Gampe os << opcode << " {"; 5587aca91db1571594cdb7e0a9ee704530b09c066e4Andreas Gampe for (int i = 0; i < a; ++i) { 5597aca91db1571594cdb7e0a9ee704530b09c066e4Andreas Gampe if (i > 0) { 5607aca91db1571594cdb7e0a9ee704530b09c066e4Andreas Gampe os << ", "; 5617aca91db1571594cdb7e0a9ee704530b09c066e4Andreas Gampe } 5627aca91db1571594cdb7e0a9ee704530b09c066e4Andreas Gampe os << "v" << arg[i]; 5637aca91db1571594cdb7e0a9ee704530b09c066e4Andreas Gampe } 5647aca91db1571594cdb7e0a9ee704530b09c066e4Andreas Gampe os << "}, type@" << VRegB_35c(); 5657aca91db1571594cdb7e0a9ee704530b09c066e4Andreas Gampe } 5667aca91db1571594cdb7e0a9ee704530b09c066e4Andreas Gampe break; 5677aca91db1571594cdb7e0a9ee704530b09c066e4Andreas Gampe 568d81871cbbaa34c649e488f94f61a981db33123e5Ian Rogers case INVOKE_VIRTUAL: 569d81871cbbaa34c649e488f94f61a981db33123e5Ian Rogers case INVOKE_SUPER: 570d81871cbbaa34c649e488f94f61a981db33123e5Ian Rogers case INVOKE_DIRECT: 571d81871cbbaa34c649e488f94f61a981db33123e5Ian Rogers case INVOKE_STATIC: 572d81871cbbaa34c649e488f94f61a981db33123e5Ian Rogers case INVOKE_INTERFACE: 573d81871cbbaa34c649e488f94f61a981db33123e5Ian Rogers if (file != NULL) { 574e3c845cdb5884e770287a5c0c65c8bb64733c388Elliott Hughes os << opcode << " {"; 57575b2a4abea8a608d7aec3e417498b69b31026a74Sebastien Hertz uint32_t method_idx = VRegB_35c(); 57675b2a4abea8a608d7aec3e417498b69b31026a74Sebastien Hertz for (size_t i = 0; i < VRegA_35c(); ++i) { 577e3c845cdb5884e770287a5c0c65c8bb64733c388Elliott Hughes if (i != 0) { 578e3c845cdb5884e770287a5c0c65c8bb64733c388Elliott Hughes os << ", "; 579e3c845cdb5884e770287a5c0c65c8bb64733c388Elliott Hughes } 58075b2a4abea8a608d7aec3e417498b69b31026a74Sebastien Hertz os << "v" << arg[i]; 581e3c845cdb5884e770287a5c0c65c8bb64733c388Elliott Hughes } 58275b2a4abea8a608d7aec3e417498b69b31026a74Sebastien Hertz os << "}, " << PrettyMethod(method_idx, *file) << " // method@" << method_idx; 583d81871cbbaa34c649e488f94f61a981db33123e5Ian Rogers break; 584d81871cbbaa34c649e488f94f61a981db33123e5Ian Rogers } // else fall-through 5852d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz case INVOKE_VIRTUAL_QUICK: 5862d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz if (file != NULL) { 5872d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz os << opcode << " {"; 5882d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz uint32_t method_idx = VRegB_35c(); 5892d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz for (size_t i = 0; i < VRegA_35c(); ++i) { 5902d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz if (i != 0) { 5912d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz os << ", "; 5922d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz } 5932d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz os << "v" << arg[i]; 5942d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz } 5957934ac288acfb2552bb0b06ec1f61e5820d924a4Brian Carlstrom os << "}, // vtable@" << method_idx; 5962d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz break; 5972d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz } // else fall-through 598d81871cbbaa34c649e488f94f61a981db33123e5Ian Rogers default: 59975b2a4abea8a608d7aec3e417498b69b31026a74Sebastien Hertz os << opcode << " {v" << arg[0] << ", v" << arg[1] << ", v" << arg[2] 60075b2a4abea8a608d7aec3e417498b69b31026a74Sebastien Hertz << ", v" << arg[3] << ", v" << arg[4] << "}, thing@" << VRegB_35c(); 601d81871cbbaa34c649e488f94f61a981db33123e5Ian Rogers break; 602d81871cbbaa34c649e488f94f61a981db33123e5Ian Rogers } 603d81871cbbaa34c649e488f94f61a981db33123e5Ian Rogers break; 604d81871cbbaa34c649e488f94f61a981db33123e5Ian Rogers } 6054c5dd5aa7a2cdbec8c298569c5a84d0ef5357363Ian Rogers case k3rc: { 60675b2a4abea8a608d7aec3e417498b69b31026a74Sebastien Hertz switch (Opcode()) { 6074c5dd5aa7a2cdbec8c298569c5a84d0ef5357363Ian Rogers case INVOKE_VIRTUAL_RANGE: 6084c5dd5aa7a2cdbec8c298569c5a84d0ef5357363Ian Rogers case INVOKE_SUPER_RANGE: 6094c5dd5aa7a2cdbec8c298569c5a84d0ef5357363Ian Rogers case INVOKE_DIRECT_RANGE: 6104c5dd5aa7a2cdbec8c298569c5a84d0ef5357363Ian Rogers case INVOKE_STATIC_RANGE: 6114c5dd5aa7a2cdbec8c298569c5a84d0ef5357363Ian Rogers case INVOKE_INTERFACE_RANGE: 6124c5dd5aa7a2cdbec8c298569c5a84d0ef5357363Ian Rogers if (file != NULL) { 61375b2a4abea8a608d7aec3e417498b69b31026a74Sebastien Hertz uint32_t method_idx = VRegB_3rc(); 61475b2a4abea8a608d7aec3e417498b69b31026a74Sebastien Hertz os << StringPrintf("%s, {v%d .. v%d}, ", opcode, VRegC_3rc(), (VRegC_3rc() + VRegA_3rc() - 1)) 61575b2a4abea8a608d7aec3e417498b69b31026a74Sebastien Hertz << PrettyMethod(method_idx, *file) << " // method@" << method_idx; 6164c5dd5aa7a2cdbec8c298569c5a84d0ef5357363Ian Rogers break; 6174c5dd5aa7a2cdbec8c298569c5a84d0ef5357363Ian Rogers } // else fall-through 6182d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz case INVOKE_VIRTUAL_RANGE_QUICK: 6192d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz if (file != NULL) { 6202d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz uint32_t method_idx = VRegB_3rc(); 6212d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz os << StringPrintf("%s, {v%d .. v%d}, ", opcode, VRegC_3rc(), (VRegC_3rc() + VRegA_3rc() - 1)) 6222d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz << "// vtable@" << method_idx; 6232d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz break; 6242d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz } // else fall-through 6254c5dd5aa7a2cdbec8c298569c5a84d0ef5357363Ian Rogers default: 62675b2a4abea8a608d7aec3e417498b69b31026a74Sebastien Hertz os << StringPrintf("%s, {v%d .. v%d}, thing@%d", opcode, VRegC_3rc(), 62775b2a4abea8a608d7aec3e417498b69b31026a74Sebastien Hertz (VRegC_3rc() + VRegA_3rc() - 1), VRegB_3rc()); 6284c5dd5aa7a2cdbec8c298569c5a84d0ef5357363Ian Rogers break; 6294c5dd5aa7a2cdbec8c298569c5a84d0ef5357363Ian Rogers } 6304c5dd5aa7a2cdbec8c298569c5a84d0ef5357363Ian Rogers break; 6314c5dd5aa7a2cdbec8c298569c5a84d0ef5357363Ian Rogers } 632b574c1816c7a2f160b267cd100f36f157a9abcf6Ian Rogers case k51l: os << StringPrintf("%s v%d, #%+" PRId64, opcode, VRegA_51l(), VRegB_51l()); break; 6332c8a857708fc86a5b555d1eb782b56516f3b1a72Ian Rogers default: os << " unknown format (" << DumpHex(5) << ")"; break; 634d81871cbbaa34c649e488f94f61a981db33123e5Ian Rogers } 6352c8a857708fc86a5b555d1eb782b56516f3b1a72Ian Rogers return os.str(); 63612eb78e651f13f2c1f0c2c922048a5a213253adfCarl Shapiro} 63712eb78e651f13f2c1f0c2c922048a5a213253adfCarl Shapiro 638a75a01313e801c53145df00bad1842d9f643c0a1Ian Rogersstd::ostream& operator<<(std::ostream& os, const Instruction::Code& code) { 639a75a01313e801c53145df00bad1842d9f643c0a1Ian Rogers return os << Instruction::Name(code); 640adb8c67f6d87a160d4e3a8afea7cb93f6c14568bElliott Hughes} 641adb8c67f6d87a160d4e3a8afea7cb93f6c14568bElliott Hughes 64212eb78e651f13f2c1f0c2c922048a5a213253adfCarl Shapiro} // namespace art 643