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