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>
22c7dd295a4e0cc1d15c0c96088e55a85389bade74Ian Rogers#include <sstream>
23b574c1816c7a2f160b267cd100f36f157a9abcf6Ian Rogers
24576ca0cd692c0b6ae70e776de91015b8ff000a08Ian Rogers#include "base/stringprintf.h"
254f6ad8ab428038129b2d0d6c40b7fd625cca15e1Ian Rogers#include "dex_file-inl.h"
262dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers#include "utils.h"
27d81871cbbaa34c649e488f94f61a981db33123e5Ian Rogers
2812eb78e651f13f2c1f0c2c922048a5a213253adfCarl Shapironamespace art {
2912eb78e651f13f2c1f0c2c922048a5a213253adfCarl Shapiro
30e4c1ce498f7933b91696caa4a527e6556128a8e2Carl Shapiroconst char* const Instruction::kInstructionNames[] = {
31ba5ebb944b7c5c6a1b754b6dd47eed96f39aea29jeffhao#define INSTRUCTION_NAME(o, c, pname, f, r, i, a, v) pname,
32578bbdc684db8ed68e9fedbc678669d27fa68b6eBrian Carlstrom#include "dex_instruction_list.h"
33e4c1ce498f7933b91696caa4a527e6556128a8e2Carl Shapiro  DEX_INSTRUCTION_LIST(INSTRUCTION_NAME)
34e4c1ce498f7933b91696caa4a527e6556128a8e2Carl Shapiro#undef DEX_INSTRUCTION_LIST
35e4c1ce498f7933b91696caa4a527e6556128a8e2Carl Shapiro#undef INSTRUCTION_NAME
36e4c1ce498f7933b91696caa4a527e6556128a8e2Carl Shapiro};
37e4c1ce498f7933b91696caa4a527e6556128a8e2Carl Shapiro
38adb8c67f6d87a160d4e3a8afea7cb93f6c14568bElliott HughesInstruction::Format const Instruction::kInstructionFormats[] = {
39ba5ebb944b7c5c6a1b754b6dd47eed96f39aea29jeffhao#define INSTRUCTION_FORMAT(o, c, p, format, r, i, a, v) format,
40578bbdc684db8ed68e9fedbc678669d27fa68b6eBrian Carlstrom#include "dex_instruction_list.h"
41e4c1ce498f7933b91696caa4a527e6556128a8e2Carl Shapiro  DEX_INSTRUCTION_LIST(INSTRUCTION_FORMAT)
42e4c1ce498f7933b91696caa4a527e6556128a8e2Carl Shapiro#undef DEX_INSTRUCTION_LIST
43e4c1ce498f7933b91696caa4a527e6556128a8e2Carl Shapiro#undef INSTRUCTION_FORMAT
44e4c1ce498f7933b91696caa4a527e6556128a8e2Carl Shapiro};
45e4c1ce498f7933b91696caa4a527e6556128a8e2Carl Shapiro
46e4c1ce498f7933b91696caa4a527e6556128a8e2Carl Shapiroint const Instruction::kInstructionFlags[] = {
47ba5ebb944b7c5c6a1b754b6dd47eed96f39aea29jeffhao#define INSTRUCTION_FLAGS(o, c, p, f, r, i, flags, v) flags,
48578bbdc684db8ed68e9fedbc678669d27fa68b6eBrian Carlstrom#include "dex_instruction_list.h"
49e4c1ce498f7933b91696caa4a527e6556128a8e2Carl Shapiro  DEX_INSTRUCTION_LIST(INSTRUCTION_FLAGS)
50e4c1ce498f7933b91696caa4a527e6556128a8e2Carl Shapiro#undef DEX_INSTRUCTION_LIST
51e4c1ce498f7933b91696caa4a527e6556128a8e2Carl Shapiro#undef INSTRUCTION_FLAGS
52e4c1ce498f7933b91696caa4a527e6556128a8e2Carl Shapiro};
53e4c1ce498f7933b91696caa4a527e6556128a8e2Carl Shapiro
54ba5ebb944b7c5c6a1b754b6dd47eed96f39aea29jeffhaoint const Instruction::kInstructionVerifyFlags[] = {
55ba5ebb944b7c5c6a1b754b6dd47eed96f39aea29jeffhao#define INSTRUCTION_VERIFY_FLAGS(o, c, p, f, r, i, a, vflags) vflags,
56ba5ebb944b7c5c6a1b754b6dd47eed96f39aea29jeffhao#include "dex_instruction_list.h"
57ba5ebb944b7c5c6a1b754b6dd47eed96f39aea29jeffhao  DEX_INSTRUCTION_LIST(INSTRUCTION_VERIFY_FLAGS)
58ba5ebb944b7c5c6a1b754b6dd47eed96f39aea29jeffhao#undef DEX_INSTRUCTION_LIST
59ba5ebb944b7c5c6a1b754b6dd47eed96f39aea29jeffhao#undef INSTRUCTION_VERIFY_FLAGS
60ba5ebb944b7c5c6a1b754b6dd47eed96f39aea29jeffhao};
61ba5ebb944b7c5c6a1b754b6dd47eed96f39aea29jeffhao
62a75a01313e801c53145df00bad1842d9f643c0a1Ian Rogersint const Instruction::kInstructionSizeInCodeUnits[] = {
63a75a01313e801c53145df00bad1842d9f643c0a1Ian Rogers#define INSTRUCTION_SIZE(opcode, c, p, format, r, i, a, v) \
646f485c62b9cfce3ab71020c646ab9f48d9d29d6dBrian Carlstrom    ((opcode == NOP)                        ? -1 : \
656f485c62b9cfce3ab71020c646ab9f48d9d29d6dBrian Carlstrom     ((format >= k10x) && (format <= k10t)) ?  1 : \
666f485c62b9cfce3ab71020c646ab9f48d9d29d6dBrian Carlstrom     ((format >= k20t) && (format <= k22c)) ?  2 : \
676f485c62b9cfce3ab71020c646ab9f48d9d29d6dBrian Carlstrom     ((format >= k32x) && (format <= k3rc)) ?  3 : \
686f485c62b9cfce3ab71020c646ab9f48d9d29d6dBrian Carlstrom      (format == k51l)                      ?  5 : -1),
69a75a01313e801c53145df00bad1842d9f643c0a1Ian Rogers#include "dex_instruction_list.h"
70a75a01313e801c53145df00bad1842d9f643c0a1Ian Rogers  DEX_INSTRUCTION_LIST(INSTRUCTION_SIZE)
71a75a01313e801c53145df00bad1842d9f643c0a1Ian Rogers#undef DEX_INSTRUCTION_LIST
72a75a01313e801c53145df00bad1842d9f643c0a1Ian Rogers#undef INSTRUCTION_SIZE
73a75a01313e801c53145df00bad1842d9f643c0a1Ian Rogers};
74a75a01313e801c53145df00bad1842d9f643c0a1Ian Rogers
7539f992750ac1eb7e51955d3e52bddc32b37c370fDragos Sbirleaint32_t Instruction::GetTargetOffset() const {
7639f992750ac1eb7e51955d3e52bddc32b37c370fDragos Sbirlea  switch (FormatOf(Opcode())) {
7739f992750ac1eb7e51955d3e52bddc32b37c370fDragos Sbirlea    // Cases for conditional branches follow.
7839f992750ac1eb7e51955d3e52bddc32b37c370fDragos Sbirlea    case k22t: return VRegC_22t();
7939f992750ac1eb7e51955d3e52bddc32b37c370fDragos Sbirlea    case k21t: return VRegB_21t();
8039f992750ac1eb7e51955d3e52bddc32b37c370fDragos Sbirlea    // Cases for unconditional branches follow.
8139f992750ac1eb7e51955d3e52bddc32b37c370fDragos Sbirlea    case k10t: return VRegA_10t();
8239f992750ac1eb7e51955d3e52bddc32b37c370fDragos Sbirlea    case k20t: return VRegA_20t();
8339f992750ac1eb7e51955d3e52bddc32b37c370fDragos Sbirlea    case k30t: return VRegA_30t();
8439f992750ac1eb7e51955d3e52bddc32b37c370fDragos Sbirlea    default: LOG(FATAL) << "Tried to access the branch offset of an instruction " << Name() <<
8539f992750ac1eb7e51955d3e52bddc32b37c370fDragos Sbirlea        " which does not have a target operand.";
8639f992750ac1eb7e51955d3e52bddc32b37c370fDragos Sbirlea  }
8739f992750ac1eb7e51955d3e52bddc32b37c370fDragos Sbirlea  return 0;
8839f992750ac1eb7e51955d3e52bddc32b37c370fDragos Sbirlea}
8939f992750ac1eb7e51955d3e52bddc32b37c370fDragos Sbirlea
9039f992750ac1eb7e51955d3e52bddc32b37c370fDragos Sbirleabool Instruction::CanFlowThrough() const {
9139f992750ac1eb7e51955d3e52bddc32b37c370fDragos Sbirlea  const uint16_t* insns = reinterpret_cast<const uint16_t*>(this);
9239f992750ac1eb7e51955d3e52bddc32b37c370fDragos Sbirlea  uint16_t insn = *insns;
9339f992750ac1eb7e51955d3e52bddc32b37c370fDragos Sbirlea  Code opcode = static_cast<Code>(insn & 0xFF);
9439f992750ac1eb7e51955d3e52bddc32b37c370fDragos Sbirlea  return  FlagsOf(opcode) & Instruction::kContinue;
9539f992750ac1eb7e51955d3e52bddc32b37c370fDragos Sbirlea}
9639f992750ac1eb7e51955d3e52bddc32b37c370fDragos Sbirlea
97a75a01313e801c53145df00bad1842d9f643c0a1Ian Rogerssize_t Instruction::SizeInCodeUnitsComplexOpcode() const {
9812eb78e651f13f2c1f0c2c922048a5a213253adfCarl Shapiro  const uint16_t* insns = reinterpret_cast<const uint16_t*>(this);
99a75a01313e801c53145df00bad1842d9f643c0a1Ian Rogers  // Handle special NOP encoded variable length sequences.
100a75a01313e801c53145df00bad1842d9f643c0a1Ian Rogers  switch (*insns) {
101a75a01313e801c53145df00bad1842d9f643c0a1Ian Rogers    case kPackedSwitchSignature:
102a75a01313e801c53145df00bad1842d9f643c0a1Ian Rogers      return (4 + insns[1] * 2);
103a75a01313e801c53145df00bad1842d9f643c0a1Ian Rogers    case kSparseSwitchSignature:
104a75a01313e801c53145df00bad1842d9f643c0a1Ian Rogers      return (2 + insns[1] * 4);
105a75a01313e801c53145df00bad1842d9f643c0a1Ian Rogers    case kArrayDataSignature: {
106a75a01313e801c53145df00bad1842d9f643c0a1Ian Rogers      uint16_t element_size = insns[1];
107a75a01313e801c53145df00bad1842d9f643c0a1Ian Rogers      uint32_t length = insns[2] | (((uint32_t)insns[3]) << 16);
108a75a01313e801c53145df00bad1842d9f643c0a1Ian Rogers      // The plus 1 is to round up for odd size and width.
109a75a01313e801c53145df00bad1842d9f643c0a1Ian Rogers      return (4 + (element_size * length + 1) / 2);
110e4c1ce498f7933b91696caa4a527e6556128a8e2Carl Shapiro    }
111a75a01313e801c53145df00bad1842d9f643c0a1Ian Rogers    default:
112a75a01313e801c53145df00bad1842d9f643c0a1Ian Rogers      if ((*insns & 0xFF) == 0) {
113a75a01313e801c53145df00bad1842d9f643c0a1Ian Rogers        return 1;  // NOP.
114a75a01313e801c53145df00bad1842d9f643c0a1Ian Rogers      } else {
115fc787ecd91127b2c8458afd94e5148e2ae51a1f5Ian Rogers        LOG(FATAL) << "Unreachable: " << DumpString(nullptr);
1162c4257be8191c5eefde744e8965fcefc80a0a97dIan Rogers        UNREACHABLE();
117a75a01313e801c53145df00bad1842d9f643c0a1Ian Rogers      }
118e4c1ce498f7933b91696caa4a527e6556128a8e2Carl Shapiro  }
119d81871cbbaa34c649e488f94f61a981db33123e5Ian Rogers}
120d81871cbbaa34c649e488f94f61a981db33123e5Ian Rogers
1212c8a857708fc86a5b555d1eb782b56516f3b1a72Ian Rogersstd::string Instruction::DumpHex(size_t code_units) const {
122d81871cbbaa34c649e488f94f61a981db33123e5Ian Rogers  size_t inst_length = SizeInCodeUnits();
123d81871cbbaa34c649e488f94f61a981db33123e5Ian Rogers  if (inst_length > code_units) {
124d81871cbbaa34c649e488f94f61a981db33123e5Ian Rogers    inst_length = code_units;
125d81871cbbaa34c649e488f94f61a981db33123e5Ian Rogers  }
1262c8a857708fc86a5b555d1eb782b56516f3b1a72Ian Rogers  std::ostringstream os;
127d81871cbbaa34c649e488f94f61a981db33123e5Ian Rogers  const uint16_t* insn = reinterpret_cast<const uint16_t*>(this);
128d81871cbbaa34c649e488f94f61a981db33123e5Ian Rogers  for (size_t i = 0; i < inst_length; i++) {
1292c8a857708fc86a5b555d1eb782b56516f3b1a72Ian Rogers    os << StringPrintf("0x%04x", insn[i]) << " ";
130d81871cbbaa34c649e488f94f61a981db33123e5Ian Rogers  }
131d81871cbbaa34c649e488f94f61a981db33123e5Ian Rogers  for (size_t i = inst_length; i < code_units; i++) {
132d81871cbbaa34c649e488f94f61a981db33123e5Ian Rogers    os << "       ";
133d81871cbbaa34c649e488f94f61a981db33123e5Ian Rogers  }
1342c8a857708fc86a5b555d1eb782b56516f3b1a72Ian Rogers  return os.str();
135d81871cbbaa34c649e488f94f61a981db33123e5Ian Rogers}
136d81871cbbaa34c649e488f94f61a981db33123e5Ian Rogers
13732f500daa2c04b1efe946c12c90502736e47d5fcAnestis Bechtsoudisstd::string Instruction::DumpHexLE(size_t instr_code_units) const {
13832f500daa2c04b1efe946c12c90502736e47d5fcAnestis Bechtsoudis  size_t inst_length = SizeInCodeUnits();
13932f500daa2c04b1efe946c12c90502736e47d5fcAnestis Bechtsoudis  if (inst_length > instr_code_units) {
14032f500daa2c04b1efe946c12c90502736e47d5fcAnestis Bechtsoudis    inst_length = instr_code_units;
14132f500daa2c04b1efe946c12c90502736e47d5fcAnestis Bechtsoudis  }
14232f500daa2c04b1efe946c12c90502736e47d5fcAnestis Bechtsoudis  std::ostringstream os;
14332f500daa2c04b1efe946c12c90502736e47d5fcAnestis Bechtsoudis  const uint16_t* insn = reinterpret_cast<const uint16_t*>(this);
14432f500daa2c04b1efe946c12c90502736e47d5fcAnestis Bechtsoudis  for (size_t i = 0; i < inst_length; i++) {
1454f0be4d51f6842ac432ab24c2091b57806837a69Andreas Gampe    os << StringPrintf("%02x%02x", static_cast<uint8_t>(insn[i] & 0x00FF),
1464f0be4d51f6842ac432ab24c2091b57806837a69Andreas Gampe                       static_cast<uint8_t>((insn[i] & 0xFF00) >> 8)) << " ";
14732f500daa2c04b1efe946c12c90502736e47d5fcAnestis Bechtsoudis  }
14832f500daa2c04b1efe946c12c90502736e47d5fcAnestis Bechtsoudis  for (size_t i = inst_length; i < instr_code_units; i++) {
1494f0be4d51f6842ac432ab24c2091b57806837a69Andreas Gampe    os << "     ";
15032f500daa2c04b1efe946c12c90502736e47d5fcAnestis Bechtsoudis  }
15132f500daa2c04b1efe946c12c90502736e47d5fcAnestis Bechtsoudis  return os.str();
15232f500daa2c04b1efe946c12c90502736e47d5fcAnestis Bechtsoudis}
15332f500daa2c04b1efe946c12c90502736e47d5fcAnestis Bechtsoudis
1542c8a857708fc86a5b555d1eb782b56516f3b1a72Ian Rogersstd::string Instruction::DumpString(const DexFile* file) const {
1552c8a857708fc86a5b555d1eb782b56516f3b1a72Ian Rogers  std::ostringstream os;
15675b2a4abea8a608d7aec3e417498b69b31026a74Sebastien Hertz  const char* opcode = kInstructionNames[Opcode()];
157adb8c67f6d87a160d4e3a8afea7cb93f6c14568bElliott Hughes  switch (FormatOf(Opcode())) {
158e3c845cdb5884e770287a5c0c65c8bb64733c388Elliott Hughes    case k10x:  os << opcode; break;
15975b2a4abea8a608d7aec3e417498b69b31026a74Sebastien Hertz    case k12x:  os << StringPrintf("%s v%d, v%d", opcode, VRegA_12x(), VRegB_12x()); break;
16075b2a4abea8a608d7aec3e417498b69b31026a74Sebastien Hertz    case k11n:  os << StringPrintf("%s v%d, #%+d", opcode, VRegA_11n(), VRegB_11n()); break;
16175b2a4abea8a608d7aec3e417498b69b31026a74Sebastien Hertz    case k11x:  os << StringPrintf("%s v%d", opcode, VRegA_11x()); break;
16275b2a4abea8a608d7aec3e417498b69b31026a74Sebastien Hertz    case k10t:  os << StringPrintf("%s %+d", opcode, VRegA_10t()); break;
16375b2a4abea8a608d7aec3e417498b69b31026a74Sebastien Hertz    case k20t:  os << StringPrintf("%s %+d", opcode, VRegA_20t()); break;
16475b2a4abea8a608d7aec3e417498b69b31026a74Sebastien Hertz    case k22x:  os << StringPrintf("%s v%d, v%d", opcode, VRegA_22x(), VRegB_22x()); break;
16575b2a4abea8a608d7aec3e417498b69b31026a74Sebastien Hertz    case k21t:  os << StringPrintf("%s v%d, %+d", opcode, VRegA_21t(), VRegB_21t()); break;
16675b2a4abea8a608d7aec3e417498b69b31026a74Sebastien Hertz    case k21s:  os << StringPrintf("%s v%d, #%+d", opcode, VRegA_21s(), VRegB_21s()); break;
1671b3d6ca46d9594dbdec66b11f184e6483b007483Elliott Hughes    case k21h: {
1681b3d6ca46d9594dbdec66b11f184e6483b007483Elliott Hughes        // op vAA, #+BBBB0000[00000000]
16975b2a4abea8a608d7aec3e417498b69b31026a74Sebastien Hertz        if (Opcode() == CONST_HIGH16) {
17075b2a4abea8a608d7aec3e417498b69b31026a74Sebastien Hertz          uint32_t value = VRegB_21h() << 16;
17175b2a4abea8a608d7aec3e417498b69b31026a74Sebastien Hertz          os << StringPrintf("%s v%d, #int %+d // 0x%x", opcode, VRegA_21h(), value, value);
1721b3d6ca46d9594dbdec66b11f184e6483b007483Elliott Hughes        } else {
17375b2a4abea8a608d7aec3e417498b69b31026a74Sebastien Hertz          uint64_t value = static_cast<uint64_t>(VRegB_21h()) << 48;
174b574c1816c7a2f160b267cd100f36f157a9abcf6Ian Rogers          os << StringPrintf("%s v%d, #long %+" PRId64 " // 0x%" PRIx64, opcode, VRegA_21h(),
175b574c1816c7a2f160b267cd100f36f157a9abcf6Ian Rogers                             value, value);
1761b3d6ca46d9594dbdec66b11f184e6483b007483Elliott Hughes        }
1771b3d6ca46d9594dbdec66b11f184e6483b007483Elliott Hughes      }
1781b3d6ca46d9594dbdec66b11f184e6483b007483Elliott Hughes      break;
17990334e5586ada4772229ded6f7acb85de524a704Ian Rogers    case k21c: {
18075b2a4abea8a608d7aec3e417498b69b31026a74Sebastien Hertz      switch (Opcode()) {
18190334e5586ada4772229ded6f7acb85de524a704Ian Rogers        case CONST_STRING:
182fc787ecd91127b2c8458afd94e5148e2ae51a1f5Ian Rogers          if (file != nullptr) {
18375b2a4abea8a608d7aec3e417498b69b31026a74Sebastien Hertz            uint32_t string_idx = VRegB_21c();
18475b2a4abea8a608d7aec3e417498b69b31026a74Sebastien Hertz            os << StringPrintf("const-string v%d, %s // string@%d", VRegA_21c(),
18575b2a4abea8a608d7aec3e417498b69b31026a74Sebastien Hertz                               PrintableString(file->StringDataByIdx(string_idx)).c_str(), string_idx);
18690334e5586ada4772229ded6f7acb85de524a704Ian Rogers            break;
187fc787ecd91127b2c8458afd94e5148e2ae51a1f5Ian Rogers          }
188fc787ecd91127b2c8458afd94e5148e2ae51a1f5Ian Rogers          FALLTHROUGH_INTENDED;
18918c24b6e05e7591069f1a2ac9c614b28fc0853acMathieu Chartier        case CHECK_CAST:
19018c24b6e05e7591069f1a2ac9c614b28fc0853acMathieu Chartier        case CONST_CLASS:
19190334e5586ada4772229ded6f7acb85de524a704Ian Rogers        case NEW_INSTANCE:
192fc787ecd91127b2c8458afd94e5148e2ae51a1f5Ian Rogers          if (file != nullptr) {
19375b2a4abea8a608d7aec3e417498b69b31026a74Sebastien Hertz            uint32_t type_idx = VRegB_21c();
194b43cef30fa7171f5b33c5f94853ad8474ed08022Dragos Sbirlea            os << opcode << " v" << static_cast<int>(VRegA_21c()) << ", " << PrettyType(type_idx, *file)
19575b2a4abea8a608d7aec3e417498b69b31026a74Sebastien Hertz               << " // type@" << type_idx;
19690334e5586ada4772229ded6f7acb85de524a704Ian Rogers            break;
197fc787ecd91127b2c8458afd94e5148e2ae51a1f5Ian Rogers          }
198fc787ecd91127b2c8458afd94e5148e2ae51a1f5Ian Rogers          FALLTHROUGH_INTENDED;
19990334e5586ada4772229ded6f7acb85de524a704Ian Rogers        case SGET:
20090334e5586ada4772229ded6f7acb85de524a704Ian Rogers        case SGET_WIDE:
20190334e5586ada4772229ded6f7acb85de524a704Ian Rogers        case SGET_OBJECT:
20290334e5586ada4772229ded6f7acb85de524a704Ian Rogers        case SGET_BOOLEAN:
20390334e5586ada4772229ded6f7acb85de524a704Ian Rogers        case SGET_BYTE:
20490334e5586ada4772229ded6f7acb85de524a704Ian Rogers        case SGET_CHAR:
20590334e5586ada4772229ded6f7acb85de524a704Ian Rogers        case SGET_SHORT:
206fc787ecd91127b2c8458afd94e5148e2ae51a1f5Ian Rogers          if (file != nullptr) {
20775b2a4abea8a608d7aec3e417498b69b31026a74Sebastien Hertz            uint32_t field_idx = VRegB_21c();
208b43cef30fa7171f5b33c5f94853ad8474ed08022Dragos Sbirlea            os << opcode << "  v" << static_cast<int>(VRegA_21c()) << ", " << PrettyField(field_idx, *file, true)
20975b2a4abea8a608d7aec3e417498b69b31026a74Sebastien Hertz               << " // field@" << field_idx;
21090334e5586ada4772229ded6f7acb85de524a704Ian Rogers            break;
211fc787ecd91127b2c8458afd94e5148e2ae51a1f5Ian Rogers          }
212fc787ecd91127b2c8458afd94e5148e2ae51a1f5Ian Rogers          FALLTHROUGH_INTENDED;
21390334e5586ada4772229ded6f7acb85de524a704Ian Rogers        case SPUT:
21490334e5586ada4772229ded6f7acb85de524a704Ian Rogers        case SPUT_WIDE:
21590334e5586ada4772229ded6f7acb85de524a704Ian Rogers        case SPUT_OBJECT:
21690334e5586ada4772229ded6f7acb85de524a704Ian Rogers        case SPUT_BOOLEAN:
21790334e5586ada4772229ded6f7acb85de524a704Ian Rogers        case SPUT_BYTE:
21890334e5586ada4772229ded6f7acb85de524a704Ian Rogers        case SPUT_CHAR:
21990334e5586ada4772229ded6f7acb85de524a704Ian Rogers        case SPUT_SHORT:
220fc787ecd91127b2c8458afd94e5148e2ae51a1f5Ian Rogers          if (file != nullptr) {
22175b2a4abea8a608d7aec3e417498b69b31026a74Sebastien Hertz            uint32_t field_idx = VRegB_21c();
222b43cef30fa7171f5b33c5f94853ad8474ed08022Dragos Sbirlea            os << opcode << " v" << static_cast<int>(VRegA_21c()) << ", " << PrettyField(field_idx, *file, true)
22375b2a4abea8a608d7aec3e417498b69b31026a74Sebastien Hertz               << " // field@" << field_idx;
22490334e5586ada4772229ded6f7acb85de524a704Ian Rogers            break;
225fc787ecd91127b2c8458afd94e5148e2ae51a1f5Ian Rogers          }
226fc787ecd91127b2c8458afd94e5148e2ae51a1f5Ian Rogers          FALLTHROUGH_INTENDED;
22790334e5586ada4772229ded6f7acb85de524a704Ian Rogers        default:
22875b2a4abea8a608d7aec3e417498b69b31026a74Sebastien Hertz          os << StringPrintf("%s v%d, thing@%d", opcode, VRegA_21c(), VRegB_21c());
22990334e5586ada4772229ded6f7acb85de524a704Ian Rogers          break;
23090334e5586ada4772229ded6f7acb85de524a704Ian Rogers      }
23190334e5586ada4772229ded6f7acb85de524a704Ian Rogers      break;
23290334e5586ada4772229ded6f7acb85de524a704Ian Rogers    }
23375b2a4abea8a608d7aec3e417498b69b31026a74Sebastien Hertz    case k23x:  os << StringPrintf("%s v%d, v%d, v%d", opcode, VRegA_23x(), VRegB_23x(), VRegC_23x()); break;
23475b2a4abea8a608d7aec3e417498b69b31026a74Sebastien Hertz    case k22b:  os << StringPrintf("%s v%d, v%d, #%+d", opcode, VRegA_22b(), VRegB_22b(), VRegC_22b()); break;
23575b2a4abea8a608d7aec3e417498b69b31026a74Sebastien Hertz    case k22t:  os << StringPrintf("%s v%d, v%d, %+d", opcode, VRegA_22t(), VRegB_22t(), VRegC_22t()); break;
23675b2a4abea8a608d7aec3e417498b69b31026a74Sebastien Hertz    case k22s:  os << StringPrintf("%s v%d, v%d, #%+d", opcode, VRegA_22s(), VRegB_22s(), VRegC_22s()); break;
23790334e5586ada4772229ded6f7acb85de524a704Ian Rogers    case k22c: {
23875b2a4abea8a608d7aec3e417498b69b31026a74Sebastien Hertz      switch (Opcode()) {
23990334e5586ada4772229ded6f7acb85de524a704Ian Rogers        case IGET:
24090334e5586ada4772229ded6f7acb85de524a704Ian Rogers        case IGET_WIDE:
24190334e5586ada4772229ded6f7acb85de524a704Ian Rogers        case IGET_OBJECT:
24290334e5586ada4772229ded6f7acb85de524a704Ian Rogers        case IGET_BOOLEAN:
24390334e5586ada4772229ded6f7acb85de524a704Ian Rogers        case IGET_BYTE:
24490334e5586ada4772229ded6f7acb85de524a704Ian Rogers        case IGET_CHAR:
24590334e5586ada4772229ded6f7acb85de524a704Ian Rogers        case IGET_SHORT:
246fc787ecd91127b2c8458afd94e5148e2ae51a1f5Ian Rogers          if (file != nullptr) {
24775b2a4abea8a608d7aec3e417498b69b31026a74Sebastien Hertz            uint32_t field_idx = VRegC_22c();
248b43cef30fa7171f5b33c5f94853ad8474ed08022Dragos Sbirlea            os << opcode << " v" << static_cast<int>(VRegA_22c()) << ", v" << static_cast<int>(VRegB_22c()) << ", "
24975b2a4abea8a608d7aec3e417498b69b31026a74Sebastien Hertz               << PrettyField(field_idx, *file, true) << " // field@" << field_idx;
25090334e5586ada4772229ded6f7acb85de524a704Ian Rogers            break;
251fc787ecd91127b2c8458afd94e5148e2ae51a1f5Ian Rogers          }
252fc787ecd91127b2c8458afd94e5148e2ae51a1f5Ian Rogers          FALLTHROUGH_INTENDED;
2532d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz        case IGET_QUICK:
2542d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz        case IGET_OBJECT_QUICK:
255fc787ecd91127b2c8458afd94e5148e2ae51a1f5Ian Rogers          if (file != nullptr) {
2562d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz            uint32_t field_idx = VRegC_22c();
2572d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz            os << opcode << " v" << static_cast<int>(VRegA_22c()) << ", v" << static_cast<int>(VRegB_22c()) << ", "
2582d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz               << "// offset@" << field_idx;
2592d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz            break;
260fc787ecd91127b2c8458afd94e5148e2ae51a1f5Ian Rogers          }
261fc787ecd91127b2c8458afd94e5148e2ae51a1f5Ian Rogers          FALLTHROUGH_INTENDED;
26290334e5586ada4772229ded6f7acb85de524a704Ian Rogers        case IPUT:
26390334e5586ada4772229ded6f7acb85de524a704Ian Rogers        case IPUT_WIDE:
26490334e5586ada4772229ded6f7acb85de524a704Ian Rogers        case IPUT_OBJECT:
26590334e5586ada4772229ded6f7acb85de524a704Ian Rogers        case IPUT_BOOLEAN:
26690334e5586ada4772229ded6f7acb85de524a704Ian Rogers        case IPUT_BYTE:
26790334e5586ada4772229ded6f7acb85de524a704Ian Rogers        case IPUT_CHAR:
26890334e5586ada4772229ded6f7acb85de524a704Ian Rogers        case IPUT_SHORT:
269fc787ecd91127b2c8458afd94e5148e2ae51a1f5Ian Rogers          if (file != nullptr) {
27075b2a4abea8a608d7aec3e417498b69b31026a74Sebastien Hertz            uint32_t field_idx = VRegC_22c();
271b43cef30fa7171f5b33c5f94853ad8474ed08022Dragos Sbirlea            os << opcode << " v" << static_cast<int>(VRegA_22c()) << ", v" << static_cast<int>(VRegB_22c()) << ", "
27275b2a4abea8a608d7aec3e417498b69b31026a74Sebastien Hertz               << PrettyField(field_idx, *file, true) << " // field@" << field_idx;
27390334e5586ada4772229ded6f7acb85de524a704Ian Rogers            break;
274fc787ecd91127b2c8458afd94e5148e2ae51a1f5Ian Rogers          }
275fc787ecd91127b2c8458afd94e5148e2ae51a1f5Ian Rogers          FALLTHROUGH_INTENDED;
2762d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz        case IPUT_QUICK:
2772d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz        case IPUT_OBJECT_QUICK:
278fc787ecd91127b2c8458afd94e5148e2ae51a1f5Ian Rogers          if (file != nullptr) {
2792d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz            uint32_t field_idx = VRegC_22c();
2802d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz            os << opcode << " v" << static_cast<int>(VRegA_22c()) << ", v" << static_cast<int>(VRegB_22c()) << ", "
2812d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz               << "// offset@" << field_idx;
2822d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz            break;
283fc787ecd91127b2c8458afd94e5148e2ae51a1f5Ian Rogers          }
284fc787ecd91127b2c8458afd94e5148e2ae51a1f5Ian Rogers          FALLTHROUGH_INTENDED;
28590334e5586ada4772229ded6f7acb85de524a704Ian Rogers        case INSTANCE_OF:
286fc787ecd91127b2c8458afd94e5148e2ae51a1f5Ian Rogers          if (file != nullptr) {
28775b2a4abea8a608d7aec3e417498b69b31026a74Sebastien Hertz            uint32_t type_idx = VRegC_22c();
288d4e868a25128e31c92b2779e7d2e15f9afdf4fffDragos Sbirlea            os << opcode << " v" << static_cast<int>(VRegA_22c()) << ", v" << static_cast<int>(VRegB_22c()) << ", "
28975b2a4abea8a608d7aec3e417498b69b31026a74Sebastien Hertz               << PrettyType(type_idx, *file) << " // type@" << type_idx;
29018c24b6e05e7591069f1a2ac9c614b28fc0853acMathieu Chartier            break;
29118c24b6e05e7591069f1a2ac9c614b28fc0853acMathieu Chartier          }
292fc787ecd91127b2c8458afd94e5148e2ae51a1f5Ian Rogers          FALLTHROUGH_INTENDED;
29318c24b6e05e7591069f1a2ac9c614b28fc0853acMathieu Chartier        case NEW_ARRAY:
294fc787ecd91127b2c8458afd94e5148e2ae51a1f5Ian Rogers          if (file != nullptr) {
29575b2a4abea8a608d7aec3e417498b69b31026a74Sebastien Hertz            uint32_t type_idx = VRegC_22c();
296b43cef30fa7171f5b33c5f94853ad8474ed08022Dragos Sbirlea            os << opcode << " v" << static_cast<int>(VRegA_22c()) << ", v" << static_cast<int>(VRegB_22c()) << ", "
29775b2a4abea8a608d7aec3e417498b69b31026a74Sebastien Hertz               << PrettyType(type_idx, *file) << " // type@" << type_idx;
29890334e5586ada4772229ded6f7acb85de524a704Ian Rogers            break;
299fc787ecd91127b2c8458afd94e5148e2ae51a1f5Ian Rogers          }
300fc787ecd91127b2c8458afd94e5148e2ae51a1f5Ian Rogers          FALLTHROUGH_INTENDED;
30190334e5586ada4772229ded6f7acb85de524a704Ian Rogers        default:
30275b2a4abea8a608d7aec3e417498b69b31026a74Sebastien Hertz          os << StringPrintf("%s v%d, v%d, thing@%d", opcode, VRegA_22c(), VRegB_22c(), VRegC_22c());
30390334e5586ada4772229ded6f7acb85de524a704Ian Rogers          break;
30490334e5586ada4772229ded6f7acb85de524a704Ian Rogers      }
30590334e5586ada4772229ded6f7acb85de524a704Ian Rogers      break;
30690334e5586ada4772229ded6f7acb85de524a704Ian Rogers    }
30775b2a4abea8a608d7aec3e417498b69b31026a74Sebastien Hertz    case k32x:  os << StringPrintf("%s v%d, v%d", opcode, VRegA_32x(), VRegB_32x()); break;
30875b2a4abea8a608d7aec3e417498b69b31026a74Sebastien Hertz    case k30t:  os << StringPrintf("%s %+d", opcode, VRegA_30t()); break;
30975b2a4abea8a608d7aec3e417498b69b31026a74Sebastien Hertz    case k31t:  os << StringPrintf("%s v%d, %+d", opcode, VRegA_31t(), VRegB_31t()); break;
31075b2a4abea8a608d7aec3e417498b69b31026a74Sebastien Hertz    case k31i:  os << StringPrintf("%s v%d, #%+d", opcode, VRegA_31i(), VRegB_31i()); break;
3117dfb28c066159e6cde8181720f0c451a700ef966Ian Rogers    case k31c:
3127dfb28c066159e6cde8181720f0c451a700ef966Ian Rogers      if (Opcode() == CONST_STRING_JUMBO) {
3137dfb28c066159e6cde8181720f0c451a700ef966Ian Rogers        uint32_t string_idx = VRegB_31c();
314fc787ecd91127b2c8458afd94e5148e2ae51a1f5Ian Rogers        if (file != nullptr) {
3157dfb28c066159e6cde8181720f0c451a700ef966Ian Rogers          os << StringPrintf("%s v%d, %s // string@%d", opcode, VRegA_31c(),
3167dfb28c066159e6cde8181720f0c451a700ef966Ian Rogers                             PrintableString(file->StringDataByIdx(string_idx)).c_str(),
3177dfb28c066159e6cde8181720f0c451a700ef966Ian Rogers                             string_idx);
3187dfb28c066159e6cde8181720f0c451a700ef966Ian Rogers        } else {
3197dfb28c066159e6cde8181720f0c451a700ef966Ian Rogers          os << StringPrintf("%s v%d, string@%d", opcode, VRegA_31c(), string_idx);
3207dfb28c066159e6cde8181720f0c451a700ef966Ian Rogers        }
3217dfb28c066159e6cde8181720f0c451a700ef966Ian Rogers      } else {
3227dfb28c066159e6cde8181720f0c451a700ef966Ian Rogers        os << StringPrintf("%s v%d, thing@%d", opcode, VRegA_31c(), VRegB_31c()); break;
3237dfb28c066159e6cde8181720f0c451a700ef966Ian Rogers      }
3247dfb28c066159e6cde8181720f0c451a700ef966Ian Rogers      break;
325d81871cbbaa34c649e488f94f61a981db33123e5Ian Rogers    case k35c: {
32675b2a4abea8a608d7aec3e417498b69b31026a74Sebastien Hertz      uint32_t arg[5];
32729a2648821ea4d0b5d3aecb9f835822fdfe6faa1Ian Rogers      GetVarArgs(arg);
32875b2a4abea8a608d7aec3e417498b69b31026a74Sebastien Hertz      switch (Opcode()) {
3297aca91db1571594cdb7e0a9ee704530b09c066e4Andreas Gampe        case FILLED_NEW_ARRAY:
3307aca91db1571594cdb7e0a9ee704530b09c066e4Andreas Gampe        {
3317aca91db1571594cdb7e0a9ee704530b09c066e4Andreas Gampe          const int32_t a = VRegA_35c();
3327aca91db1571594cdb7e0a9ee704530b09c066e4Andreas Gampe          os << opcode << " {";
3337aca91db1571594cdb7e0a9ee704530b09c066e4Andreas Gampe          for (int i = 0; i < a; ++i) {
3347aca91db1571594cdb7e0a9ee704530b09c066e4Andreas Gampe            if (i > 0) {
3357aca91db1571594cdb7e0a9ee704530b09c066e4Andreas Gampe              os << ", ";
3367aca91db1571594cdb7e0a9ee704530b09c066e4Andreas Gampe            }
3377aca91db1571594cdb7e0a9ee704530b09c066e4Andreas Gampe            os << "v" << arg[i];
3387aca91db1571594cdb7e0a9ee704530b09c066e4Andreas Gampe          }
3397aca91db1571594cdb7e0a9ee704530b09c066e4Andreas Gampe          os << "}, type@" << VRegB_35c();
3407aca91db1571594cdb7e0a9ee704530b09c066e4Andreas Gampe        }
3417aca91db1571594cdb7e0a9ee704530b09c066e4Andreas Gampe        break;
3427aca91db1571594cdb7e0a9ee704530b09c066e4Andreas Gampe
343d81871cbbaa34c649e488f94f61a981db33123e5Ian Rogers        case INVOKE_VIRTUAL:
344d81871cbbaa34c649e488f94f61a981db33123e5Ian Rogers        case INVOKE_SUPER:
345d81871cbbaa34c649e488f94f61a981db33123e5Ian Rogers        case INVOKE_DIRECT:
346d81871cbbaa34c649e488f94f61a981db33123e5Ian Rogers        case INVOKE_STATIC:
347d81871cbbaa34c649e488f94f61a981db33123e5Ian Rogers        case INVOKE_INTERFACE:
348fc787ecd91127b2c8458afd94e5148e2ae51a1f5Ian Rogers          if (file != nullptr) {
349e3c845cdb5884e770287a5c0c65c8bb64733c388Elliott Hughes            os << opcode << " {";
35075b2a4abea8a608d7aec3e417498b69b31026a74Sebastien Hertz            uint32_t method_idx = VRegB_35c();
35175b2a4abea8a608d7aec3e417498b69b31026a74Sebastien Hertz            for (size_t i = 0; i < VRegA_35c(); ++i) {
352e3c845cdb5884e770287a5c0c65c8bb64733c388Elliott Hughes              if (i != 0) {
353e3c845cdb5884e770287a5c0c65c8bb64733c388Elliott Hughes                os << ", ";
354e3c845cdb5884e770287a5c0c65c8bb64733c388Elliott Hughes              }
35575b2a4abea8a608d7aec3e417498b69b31026a74Sebastien Hertz              os << "v" << arg[i];
356e3c845cdb5884e770287a5c0c65c8bb64733c388Elliott Hughes            }
35775b2a4abea8a608d7aec3e417498b69b31026a74Sebastien Hertz            os << "}, " << PrettyMethod(method_idx, *file) << " // method@" << method_idx;
358d81871cbbaa34c649e488f94f61a981db33123e5Ian Rogers            break;
359fc787ecd91127b2c8458afd94e5148e2ae51a1f5Ian Rogers          }
360fc787ecd91127b2c8458afd94e5148e2ae51a1f5Ian Rogers          FALLTHROUGH_INTENDED;
3612d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz        case INVOKE_VIRTUAL_QUICK:
362fc787ecd91127b2c8458afd94e5148e2ae51a1f5Ian Rogers          if (file != nullptr) {
3632d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz            os << opcode << " {";
3642d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz            uint32_t method_idx = VRegB_35c();
3652d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz            for (size_t i = 0; i < VRegA_35c(); ++i) {
3662d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz              if (i != 0) {
3672d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz                os << ", ";
3682d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz              }
3692d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz              os << "v" << arg[i];
3702d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz            }
3717934ac288acfb2552bb0b06ec1f61e5820d924a4Brian Carlstrom            os << "},  // vtable@" << method_idx;
3722d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz            break;
373fc787ecd91127b2c8458afd94e5148e2ae51a1f5Ian Rogers          }
374fc787ecd91127b2c8458afd94e5148e2ae51a1f5Ian Rogers          FALLTHROUGH_INTENDED;
375d81871cbbaa34c649e488f94f61a981db33123e5Ian Rogers        default:
37675b2a4abea8a608d7aec3e417498b69b31026a74Sebastien Hertz          os << opcode << " {v" << arg[0] << ", v" << arg[1] << ", v" << arg[2]
37775b2a4abea8a608d7aec3e417498b69b31026a74Sebastien Hertz                       << ", v" << arg[3] << ", v" << arg[4] << "}, thing@" << VRegB_35c();
378d81871cbbaa34c649e488f94f61a981db33123e5Ian Rogers          break;
379d81871cbbaa34c649e488f94f61a981db33123e5Ian Rogers      }
380d81871cbbaa34c649e488f94f61a981db33123e5Ian Rogers      break;
381d81871cbbaa34c649e488f94f61a981db33123e5Ian Rogers    }
3824c5dd5aa7a2cdbec8c298569c5a84d0ef5357363Ian Rogers    case k3rc: {
38375b2a4abea8a608d7aec3e417498b69b31026a74Sebastien Hertz      switch (Opcode()) {
3844c5dd5aa7a2cdbec8c298569c5a84d0ef5357363Ian Rogers        case INVOKE_VIRTUAL_RANGE:
3854c5dd5aa7a2cdbec8c298569c5a84d0ef5357363Ian Rogers        case INVOKE_SUPER_RANGE:
3864c5dd5aa7a2cdbec8c298569c5a84d0ef5357363Ian Rogers        case INVOKE_DIRECT_RANGE:
3874c5dd5aa7a2cdbec8c298569c5a84d0ef5357363Ian Rogers        case INVOKE_STATIC_RANGE:
3884c5dd5aa7a2cdbec8c298569c5a84d0ef5357363Ian Rogers        case INVOKE_INTERFACE_RANGE:
389fc787ecd91127b2c8458afd94e5148e2ae51a1f5Ian Rogers          if (file != nullptr) {
39075b2a4abea8a608d7aec3e417498b69b31026a74Sebastien Hertz            uint32_t method_idx = VRegB_3rc();
39175b2a4abea8a608d7aec3e417498b69b31026a74Sebastien Hertz            os << StringPrintf("%s, {v%d .. v%d}, ", opcode, VRegC_3rc(), (VRegC_3rc() + VRegA_3rc() - 1))
39275b2a4abea8a608d7aec3e417498b69b31026a74Sebastien Hertz               << PrettyMethod(method_idx, *file) << " // method@" << method_idx;
3934c5dd5aa7a2cdbec8c298569c5a84d0ef5357363Ian Rogers            break;
394fc787ecd91127b2c8458afd94e5148e2ae51a1f5Ian Rogers          }
395fc787ecd91127b2c8458afd94e5148e2ae51a1f5Ian Rogers          FALLTHROUGH_INTENDED;
3962d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz        case INVOKE_VIRTUAL_RANGE_QUICK:
397fc787ecd91127b2c8458afd94e5148e2ae51a1f5Ian Rogers          if (file != nullptr) {
3982d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz            uint32_t method_idx = VRegB_3rc();
3992d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz            os << StringPrintf("%s, {v%d .. v%d}, ", opcode, VRegC_3rc(), (VRegC_3rc() + VRegA_3rc() - 1))
4002d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz               << "// vtable@" << method_idx;
4012d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz            break;
402fc787ecd91127b2c8458afd94e5148e2ae51a1f5Ian Rogers          }
403fc787ecd91127b2c8458afd94e5148e2ae51a1f5Ian Rogers          FALLTHROUGH_INTENDED;
4044c5dd5aa7a2cdbec8c298569c5a84d0ef5357363Ian Rogers        default:
40575b2a4abea8a608d7aec3e417498b69b31026a74Sebastien Hertz          os << StringPrintf("%s, {v%d .. v%d}, thing@%d", opcode, VRegC_3rc(),
40675b2a4abea8a608d7aec3e417498b69b31026a74Sebastien Hertz                             (VRegC_3rc() + VRegA_3rc() - 1), VRegB_3rc());
4074c5dd5aa7a2cdbec8c298569c5a84d0ef5357363Ian Rogers          break;
4084c5dd5aa7a2cdbec8c298569c5a84d0ef5357363Ian Rogers      }
4094c5dd5aa7a2cdbec8c298569c5a84d0ef5357363Ian Rogers      break;
4104c5dd5aa7a2cdbec8c298569c5a84d0ef5357363Ian Rogers    }
411b574c1816c7a2f160b267cd100f36f157a9abcf6Ian Rogers    case k51l: os << StringPrintf("%s v%d, #%+" PRId64, opcode, VRegA_51l(), VRegB_51l()); break;
4122c8a857708fc86a5b555d1eb782b56516f3b1a72Ian Rogers    default: os << " unknown format (" << DumpHex(5) << ")"; break;
413d81871cbbaa34c649e488f94f61a981db33123e5Ian Rogers  }
4142c8a857708fc86a5b555d1eb782b56516f3b1a72Ian Rogers  return os.str();
41512eb78e651f13f2c1f0c2c922048a5a213253adfCarl Shapiro}
41612eb78e651f13f2c1f0c2c922048a5a213253adfCarl Shapiro
417a75a01313e801c53145df00bad1842d9f643c0a1Ian Rogersstd::ostream& operator<<(std::ostream& os, const Instruction::Code& code) {
418a75a01313e801c53145df00bad1842d9f643c0a1Ian Rogers  return os << Instruction::Name(code);
419adb8c67f6d87a160d4e3a8afea7cb93f6c14568bElliott Hughes}
420adb8c67f6d87a160d4e3a8afea7cb93f6c14568bElliott Hughes
42112eb78e651f13f2c1f0c2c922048a5a213253adfCarl Shapiro}  // namespace art
422