dex_instruction.cc revision fc787ecd91127b2c8458afd94e5148e2ae51a1f5
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
23576ca0cd692c0b6ae70e776de91015b8ff000a08Ian Rogers#include "base/stringprintf.h"
244f6ad8ab428038129b2d0d6c40b7fd625cca15e1Ian Rogers#include "dex_file-inl.h"
252dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers#include "utils.h"
26d81871cbbaa34c649e488f94f61a981db33123e5Ian Rogers
2712eb78e651f13f2c1f0c2c922048a5a213253adfCarl Shapironamespace art {
2812eb78e651f13f2c1f0c2c922048a5a213253adfCarl Shapiro
29e4c1ce498f7933b91696caa4a527e6556128a8e2Carl Shapiroconst char* const Instruction::kInstructionNames[] = {
30ba5ebb944b7c5c6a1b754b6dd47eed96f39aea29jeffhao#define INSTRUCTION_NAME(o, c, pname, f, r, i, a, v) pname,
31578bbdc684db8ed68e9fedbc678669d27fa68b6eBrian Carlstrom#include "dex_instruction_list.h"
32e4c1ce498f7933b91696caa4a527e6556128a8e2Carl Shapiro  DEX_INSTRUCTION_LIST(INSTRUCTION_NAME)
33e4c1ce498f7933b91696caa4a527e6556128a8e2Carl Shapiro#undef DEX_INSTRUCTION_LIST
34e4c1ce498f7933b91696caa4a527e6556128a8e2Carl Shapiro#undef INSTRUCTION_NAME
35e4c1ce498f7933b91696caa4a527e6556128a8e2Carl Shapiro};
36e4c1ce498f7933b91696caa4a527e6556128a8e2Carl Shapiro
37adb8c67f6d87a160d4e3a8afea7cb93f6c14568bElliott HughesInstruction::Format const Instruction::kInstructionFormats[] = {
38ba5ebb944b7c5c6a1b754b6dd47eed96f39aea29jeffhao#define INSTRUCTION_FORMAT(o, c, p, format, r, i, a, v) format,
39578bbdc684db8ed68e9fedbc678669d27fa68b6eBrian Carlstrom#include "dex_instruction_list.h"
40e4c1ce498f7933b91696caa4a527e6556128a8e2Carl Shapiro  DEX_INSTRUCTION_LIST(INSTRUCTION_FORMAT)
41e4c1ce498f7933b91696caa4a527e6556128a8e2Carl Shapiro#undef DEX_INSTRUCTION_LIST
42e4c1ce498f7933b91696caa4a527e6556128a8e2Carl Shapiro#undef INSTRUCTION_FORMAT
43e4c1ce498f7933b91696caa4a527e6556128a8e2Carl Shapiro};
44e4c1ce498f7933b91696caa4a527e6556128a8e2Carl Shapiro
45e4c1ce498f7933b91696caa4a527e6556128a8e2Carl Shapiroint const Instruction::kInstructionFlags[] = {
46ba5ebb944b7c5c6a1b754b6dd47eed96f39aea29jeffhao#define INSTRUCTION_FLAGS(o, c, p, f, r, i, flags, v) flags,
47578bbdc684db8ed68e9fedbc678669d27fa68b6eBrian Carlstrom#include "dex_instruction_list.h"
48e4c1ce498f7933b91696caa4a527e6556128a8e2Carl Shapiro  DEX_INSTRUCTION_LIST(INSTRUCTION_FLAGS)
49e4c1ce498f7933b91696caa4a527e6556128a8e2Carl Shapiro#undef DEX_INSTRUCTION_LIST
50e4c1ce498f7933b91696caa4a527e6556128a8e2Carl Shapiro#undef INSTRUCTION_FLAGS
51e4c1ce498f7933b91696caa4a527e6556128a8e2Carl Shapiro};
52e4c1ce498f7933b91696caa4a527e6556128a8e2Carl Shapiro
53ba5ebb944b7c5c6a1b754b6dd47eed96f39aea29jeffhaoint const Instruction::kInstructionVerifyFlags[] = {
54ba5ebb944b7c5c6a1b754b6dd47eed96f39aea29jeffhao#define INSTRUCTION_VERIFY_FLAGS(o, c, p, f, r, i, a, vflags) vflags,
55ba5ebb944b7c5c6a1b754b6dd47eed96f39aea29jeffhao#include "dex_instruction_list.h"
56ba5ebb944b7c5c6a1b754b6dd47eed96f39aea29jeffhao  DEX_INSTRUCTION_LIST(INSTRUCTION_VERIFY_FLAGS)
57ba5ebb944b7c5c6a1b754b6dd47eed96f39aea29jeffhao#undef DEX_INSTRUCTION_LIST
58ba5ebb944b7c5c6a1b754b6dd47eed96f39aea29jeffhao#undef INSTRUCTION_VERIFY_FLAGS
59ba5ebb944b7c5c6a1b754b6dd47eed96f39aea29jeffhao};
60ba5ebb944b7c5c6a1b754b6dd47eed96f39aea29jeffhao
61a75a01313e801c53145df00bad1842d9f643c0a1Ian Rogersint const Instruction::kInstructionSizeInCodeUnits[] = {
62a75a01313e801c53145df00bad1842d9f643c0a1Ian Rogers#define INSTRUCTION_SIZE(opcode, c, p, format, r, i, a, v) \
636f485c62b9cfce3ab71020c646ab9f48d9d29d6dBrian Carlstrom    ((opcode == NOP)                        ? -1 : \
646f485c62b9cfce3ab71020c646ab9f48d9d29d6dBrian Carlstrom     ((format >= k10x) && (format <= k10t)) ?  1 : \
656f485c62b9cfce3ab71020c646ab9f48d9d29d6dBrian Carlstrom     ((format >= k20t) && (format <= k22c)) ?  2 : \
666f485c62b9cfce3ab71020c646ab9f48d9d29d6dBrian Carlstrom     ((format >= k32x) && (format <= k3rc)) ?  3 : \
676f485c62b9cfce3ab71020c646ab9f48d9d29d6dBrian Carlstrom      (format == k51l)                      ?  5 : -1),
68a75a01313e801c53145df00bad1842d9f643c0a1Ian Rogers#include "dex_instruction_list.h"
69a75a01313e801c53145df00bad1842d9f643c0a1Ian Rogers  DEX_INSTRUCTION_LIST(INSTRUCTION_SIZE)
70a75a01313e801c53145df00bad1842d9f643c0a1Ian Rogers#undef DEX_INSTRUCTION_LIST
71a75a01313e801c53145df00bad1842d9f643c0a1Ian Rogers#undef INSTRUCTION_SIZE
72a75a01313e801c53145df00bad1842d9f643c0a1Ian Rogers};
73a75a01313e801c53145df00bad1842d9f643c0a1Ian Rogers
7439f992750ac1eb7e51955d3e52bddc32b37c370fDragos Sbirleaint32_t Instruction::GetTargetOffset() const {
7539f992750ac1eb7e51955d3e52bddc32b37c370fDragos Sbirlea  switch (FormatOf(Opcode())) {
7639f992750ac1eb7e51955d3e52bddc32b37c370fDragos Sbirlea    // Cases for conditional branches follow.
7739f992750ac1eb7e51955d3e52bddc32b37c370fDragos Sbirlea    case k22t: return VRegC_22t();
7839f992750ac1eb7e51955d3e52bddc32b37c370fDragos Sbirlea    case k21t: return VRegB_21t();
7939f992750ac1eb7e51955d3e52bddc32b37c370fDragos Sbirlea    // Cases for unconditional branches follow.
8039f992750ac1eb7e51955d3e52bddc32b37c370fDragos Sbirlea    case k10t: return VRegA_10t();
8139f992750ac1eb7e51955d3e52bddc32b37c370fDragos Sbirlea    case k20t: return VRegA_20t();
8239f992750ac1eb7e51955d3e52bddc32b37c370fDragos Sbirlea    case k30t: return VRegA_30t();
8339f992750ac1eb7e51955d3e52bddc32b37c370fDragos Sbirlea    default: LOG(FATAL) << "Tried to access the branch offset of an instruction " << Name() <<
8439f992750ac1eb7e51955d3e52bddc32b37c370fDragos Sbirlea        " which does not have a target operand.";
8539f992750ac1eb7e51955d3e52bddc32b37c370fDragos Sbirlea  }
8639f992750ac1eb7e51955d3e52bddc32b37c370fDragos Sbirlea  return 0;
8739f992750ac1eb7e51955d3e52bddc32b37c370fDragos Sbirlea}
8839f992750ac1eb7e51955d3e52bddc32b37c370fDragos Sbirlea
8939f992750ac1eb7e51955d3e52bddc32b37c370fDragos Sbirleabool Instruction::CanFlowThrough() const {
9039f992750ac1eb7e51955d3e52bddc32b37c370fDragos Sbirlea  const uint16_t* insns = reinterpret_cast<const uint16_t*>(this);
9139f992750ac1eb7e51955d3e52bddc32b37c370fDragos Sbirlea  uint16_t insn = *insns;
9239f992750ac1eb7e51955d3e52bddc32b37c370fDragos Sbirlea  Code opcode = static_cast<Code>(insn & 0xFF);
9339f992750ac1eb7e51955d3e52bddc32b37c370fDragos Sbirlea  return  FlagsOf(opcode) & Instruction::kContinue;
9439f992750ac1eb7e51955d3e52bddc32b37c370fDragos Sbirlea}
9539f992750ac1eb7e51955d3e52bddc32b37c370fDragos Sbirlea
96a75a01313e801c53145df00bad1842d9f643c0a1Ian Rogerssize_t Instruction::SizeInCodeUnitsComplexOpcode() const {
9712eb78e651f13f2c1f0c2c922048a5a213253adfCarl Shapiro  const uint16_t* insns = reinterpret_cast<const uint16_t*>(this);
98a75a01313e801c53145df00bad1842d9f643c0a1Ian Rogers  // Handle special NOP encoded variable length sequences.
99a75a01313e801c53145df00bad1842d9f643c0a1Ian Rogers  switch (*insns) {
100a75a01313e801c53145df00bad1842d9f643c0a1Ian Rogers    case kPackedSwitchSignature:
101a75a01313e801c53145df00bad1842d9f643c0a1Ian Rogers      return (4 + insns[1] * 2);
102a75a01313e801c53145df00bad1842d9f643c0a1Ian Rogers    case kSparseSwitchSignature:
103a75a01313e801c53145df00bad1842d9f643c0a1Ian Rogers      return (2 + insns[1] * 4);
104a75a01313e801c53145df00bad1842d9f643c0a1Ian Rogers    case kArrayDataSignature: {
105a75a01313e801c53145df00bad1842d9f643c0a1Ian Rogers      uint16_t element_size = insns[1];
106a75a01313e801c53145df00bad1842d9f643c0a1Ian Rogers      uint32_t length = insns[2] | (((uint32_t)insns[3]) << 16);
107a75a01313e801c53145df00bad1842d9f643c0a1Ian Rogers      // The plus 1 is to round up for odd size and width.
108a75a01313e801c53145df00bad1842d9f643c0a1Ian Rogers      return (4 + (element_size * length + 1) / 2);
109e4c1ce498f7933b91696caa4a527e6556128a8e2Carl Shapiro    }
110a75a01313e801c53145df00bad1842d9f643c0a1Ian Rogers    default:
111a75a01313e801c53145df00bad1842d9f643c0a1Ian Rogers      if ((*insns & 0xFF) == 0) {
112a75a01313e801c53145df00bad1842d9f643c0a1Ian Rogers        return 1;  // NOP.
113a75a01313e801c53145df00bad1842d9f643c0a1Ian Rogers      } else {
114fc787ecd91127b2c8458afd94e5148e2ae51a1f5Ian Rogers        LOG(FATAL) << "Unreachable: " << DumpString(nullptr);
115a75a01313e801c53145df00bad1842d9f643c0a1Ian Rogers        return 0;
116a75a01313e801c53145df00bad1842d9f643c0a1Ian Rogers      }
117e4c1ce498f7933b91696caa4a527e6556128a8e2Carl Shapiro  }
118d81871cbbaa34c649e488f94f61a981db33123e5Ian Rogers}
119d81871cbbaa34c649e488f94f61a981db33123e5Ian Rogers
1202c8a857708fc86a5b555d1eb782b56516f3b1a72Ian Rogersstd::string Instruction::DumpHex(size_t code_units) const {
121d81871cbbaa34c649e488f94f61a981db33123e5Ian Rogers  size_t inst_length = SizeInCodeUnits();
122d81871cbbaa34c649e488f94f61a981db33123e5Ian Rogers  if (inst_length > code_units) {
123d81871cbbaa34c649e488f94f61a981db33123e5Ian Rogers    inst_length = code_units;
124d81871cbbaa34c649e488f94f61a981db33123e5Ian Rogers  }
1252c8a857708fc86a5b555d1eb782b56516f3b1a72Ian Rogers  std::ostringstream os;
126d81871cbbaa34c649e488f94f61a981db33123e5Ian Rogers  const uint16_t* insn = reinterpret_cast<const uint16_t*>(this);
127d81871cbbaa34c649e488f94f61a981db33123e5Ian Rogers  for (size_t i = 0; i < inst_length; i++) {
1282c8a857708fc86a5b555d1eb782b56516f3b1a72Ian Rogers    os << StringPrintf("0x%04x", insn[i]) << " ";
129d81871cbbaa34c649e488f94f61a981db33123e5Ian Rogers  }
130d81871cbbaa34c649e488f94f61a981db33123e5Ian Rogers  for (size_t i = inst_length; i < code_units; i++) {
131d81871cbbaa34c649e488f94f61a981db33123e5Ian Rogers    os << "       ";
132d81871cbbaa34c649e488f94f61a981db33123e5Ian Rogers  }
1332c8a857708fc86a5b555d1eb782b56516f3b1a72Ian Rogers  return os.str();
134d81871cbbaa34c649e488f94f61a981db33123e5Ian Rogers}
135d81871cbbaa34c649e488f94f61a981db33123e5Ian Rogers
1362c8a857708fc86a5b555d1eb782b56516f3b1a72Ian Rogersstd::string Instruction::DumpString(const DexFile* file) const {
1372c8a857708fc86a5b555d1eb782b56516f3b1a72Ian Rogers  std::ostringstream os;
13875b2a4abea8a608d7aec3e417498b69b31026a74Sebastien Hertz  const char* opcode = kInstructionNames[Opcode()];
139adb8c67f6d87a160d4e3a8afea7cb93f6c14568bElliott Hughes  switch (FormatOf(Opcode())) {
140e3c845cdb5884e770287a5c0c65c8bb64733c388Elliott Hughes    case k10x:  os << opcode; break;
14175b2a4abea8a608d7aec3e417498b69b31026a74Sebastien Hertz    case k12x:  os << StringPrintf("%s v%d, v%d", opcode, VRegA_12x(), VRegB_12x()); break;
14275b2a4abea8a608d7aec3e417498b69b31026a74Sebastien Hertz    case k11n:  os << StringPrintf("%s v%d, #%+d", opcode, VRegA_11n(), VRegB_11n()); break;
14375b2a4abea8a608d7aec3e417498b69b31026a74Sebastien Hertz    case k11x:  os << StringPrintf("%s v%d", opcode, VRegA_11x()); break;
14475b2a4abea8a608d7aec3e417498b69b31026a74Sebastien Hertz    case k10t:  os << StringPrintf("%s %+d", opcode, VRegA_10t()); break;
14575b2a4abea8a608d7aec3e417498b69b31026a74Sebastien Hertz    case k20t:  os << StringPrintf("%s %+d", opcode, VRegA_20t()); break;
14675b2a4abea8a608d7aec3e417498b69b31026a74Sebastien Hertz    case k22x:  os << StringPrintf("%s v%d, v%d", opcode, VRegA_22x(), VRegB_22x()); break;
14775b2a4abea8a608d7aec3e417498b69b31026a74Sebastien Hertz    case k21t:  os << StringPrintf("%s v%d, %+d", opcode, VRegA_21t(), VRegB_21t()); break;
14875b2a4abea8a608d7aec3e417498b69b31026a74Sebastien Hertz    case k21s:  os << StringPrintf("%s v%d, #%+d", opcode, VRegA_21s(), VRegB_21s()); break;
1491b3d6ca46d9594dbdec66b11f184e6483b007483Elliott Hughes    case k21h: {
1501b3d6ca46d9594dbdec66b11f184e6483b007483Elliott Hughes        // op vAA, #+BBBB0000[00000000]
15175b2a4abea8a608d7aec3e417498b69b31026a74Sebastien Hertz        if (Opcode() == CONST_HIGH16) {
15275b2a4abea8a608d7aec3e417498b69b31026a74Sebastien Hertz          uint32_t value = VRegB_21h() << 16;
15375b2a4abea8a608d7aec3e417498b69b31026a74Sebastien Hertz          os << StringPrintf("%s v%d, #int %+d // 0x%x", opcode, VRegA_21h(), value, value);
1541b3d6ca46d9594dbdec66b11f184e6483b007483Elliott Hughes        } else {
15575b2a4abea8a608d7aec3e417498b69b31026a74Sebastien Hertz          uint64_t value = static_cast<uint64_t>(VRegB_21h()) << 48;
156b574c1816c7a2f160b267cd100f36f157a9abcf6Ian Rogers          os << StringPrintf("%s v%d, #long %+" PRId64 " // 0x%" PRIx64, opcode, VRegA_21h(),
157b574c1816c7a2f160b267cd100f36f157a9abcf6Ian Rogers                             value, value);
1581b3d6ca46d9594dbdec66b11f184e6483b007483Elliott Hughes        }
1591b3d6ca46d9594dbdec66b11f184e6483b007483Elliott Hughes      }
1601b3d6ca46d9594dbdec66b11f184e6483b007483Elliott Hughes      break;
16190334e5586ada4772229ded6f7acb85de524a704Ian Rogers    case k21c: {
16275b2a4abea8a608d7aec3e417498b69b31026a74Sebastien Hertz      switch (Opcode()) {
16390334e5586ada4772229ded6f7acb85de524a704Ian Rogers        case CONST_STRING:
164fc787ecd91127b2c8458afd94e5148e2ae51a1f5Ian Rogers          if (file != nullptr) {
16575b2a4abea8a608d7aec3e417498b69b31026a74Sebastien Hertz            uint32_t string_idx = VRegB_21c();
16675b2a4abea8a608d7aec3e417498b69b31026a74Sebastien Hertz            os << StringPrintf("const-string v%d, %s // string@%d", VRegA_21c(),
16775b2a4abea8a608d7aec3e417498b69b31026a74Sebastien Hertz                               PrintableString(file->StringDataByIdx(string_idx)).c_str(), string_idx);
16890334e5586ada4772229ded6f7acb85de524a704Ian Rogers            break;
169fc787ecd91127b2c8458afd94e5148e2ae51a1f5Ian Rogers          }
170fc787ecd91127b2c8458afd94e5148e2ae51a1f5Ian Rogers          FALLTHROUGH_INTENDED;
17118c24b6e05e7591069f1a2ac9c614b28fc0853acMathieu Chartier        case CHECK_CAST:
17218c24b6e05e7591069f1a2ac9c614b28fc0853acMathieu Chartier        case CONST_CLASS:
17390334e5586ada4772229ded6f7acb85de524a704Ian Rogers        case NEW_INSTANCE:
174fc787ecd91127b2c8458afd94e5148e2ae51a1f5Ian Rogers          if (file != nullptr) {
17575b2a4abea8a608d7aec3e417498b69b31026a74Sebastien Hertz            uint32_t type_idx = VRegB_21c();
176b43cef30fa7171f5b33c5f94853ad8474ed08022Dragos Sbirlea            os << opcode << " v" << static_cast<int>(VRegA_21c()) << ", " << PrettyType(type_idx, *file)
17775b2a4abea8a608d7aec3e417498b69b31026a74Sebastien Hertz               << " // type@" << type_idx;
17890334e5586ada4772229ded6f7acb85de524a704Ian Rogers            break;
179fc787ecd91127b2c8458afd94e5148e2ae51a1f5Ian Rogers          }
180fc787ecd91127b2c8458afd94e5148e2ae51a1f5Ian Rogers          FALLTHROUGH_INTENDED;
18190334e5586ada4772229ded6f7acb85de524a704Ian Rogers        case SGET:
18290334e5586ada4772229ded6f7acb85de524a704Ian Rogers        case SGET_WIDE:
18390334e5586ada4772229ded6f7acb85de524a704Ian Rogers        case SGET_OBJECT:
18490334e5586ada4772229ded6f7acb85de524a704Ian Rogers        case SGET_BOOLEAN:
18590334e5586ada4772229ded6f7acb85de524a704Ian Rogers        case SGET_BYTE:
18690334e5586ada4772229ded6f7acb85de524a704Ian Rogers        case SGET_CHAR:
18790334e5586ada4772229ded6f7acb85de524a704Ian Rogers        case SGET_SHORT:
188fc787ecd91127b2c8458afd94e5148e2ae51a1f5Ian Rogers          if (file != nullptr) {
18975b2a4abea8a608d7aec3e417498b69b31026a74Sebastien Hertz            uint32_t field_idx = VRegB_21c();
190b43cef30fa7171f5b33c5f94853ad8474ed08022Dragos Sbirlea            os << opcode << "  v" << static_cast<int>(VRegA_21c()) << ", " << PrettyField(field_idx, *file, true)
19175b2a4abea8a608d7aec3e417498b69b31026a74Sebastien Hertz               << " // field@" << field_idx;
19290334e5586ada4772229ded6f7acb85de524a704Ian Rogers            break;
193fc787ecd91127b2c8458afd94e5148e2ae51a1f5Ian Rogers          }
194fc787ecd91127b2c8458afd94e5148e2ae51a1f5Ian Rogers          FALLTHROUGH_INTENDED;
19590334e5586ada4772229ded6f7acb85de524a704Ian Rogers        case SPUT:
19690334e5586ada4772229ded6f7acb85de524a704Ian Rogers        case SPUT_WIDE:
19790334e5586ada4772229ded6f7acb85de524a704Ian Rogers        case SPUT_OBJECT:
19890334e5586ada4772229ded6f7acb85de524a704Ian Rogers        case SPUT_BOOLEAN:
19990334e5586ada4772229ded6f7acb85de524a704Ian Rogers        case SPUT_BYTE:
20090334e5586ada4772229ded6f7acb85de524a704Ian Rogers        case SPUT_CHAR:
20190334e5586ada4772229ded6f7acb85de524a704Ian Rogers        case SPUT_SHORT:
202fc787ecd91127b2c8458afd94e5148e2ae51a1f5Ian Rogers          if (file != nullptr) {
20375b2a4abea8a608d7aec3e417498b69b31026a74Sebastien Hertz            uint32_t field_idx = VRegB_21c();
204b43cef30fa7171f5b33c5f94853ad8474ed08022Dragos Sbirlea            os << opcode << " v" << static_cast<int>(VRegA_21c()) << ", " << PrettyField(field_idx, *file, true)
20575b2a4abea8a608d7aec3e417498b69b31026a74Sebastien Hertz               << " // field@" << field_idx;
20690334e5586ada4772229ded6f7acb85de524a704Ian Rogers            break;
207fc787ecd91127b2c8458afd94e5148e2ae51a1f5Ian Rogers          }
208fc787ecd91127b2c8458afd94e5148e2ae51a1f5Ian Rogers          FALLTHROUGH_INTENDED;
20990334e5586ada4772229ded6f7acb85de524a704Ian Rogers        default:
21075b2a4abea8a608d7aec3e417498b69b31026a74Sebastien Hertz          os << StringPrintf("%s v%d, thing@%d", opcode, VRegA_21c(), VRegB_21c());
21190334e5586ada4772229ded6f7acb85de524a704Ian Rogers          break;
21290334e5586ada4772229ded6f7acb85de524a704Ian Rogers      }
21390334e5586ada4772229ded6f7acb85de524a704Ian Rogers      break;
21490334e5586ada4772229ded6f7acb85de524a704Ian Rogers    }
21575b2a4abea8a608d7aec3e417498b69b31026a74Sebastien Hertz    case k23x:  os << StringPrintf("%s v%d, v%d, v%d", opcode, VRegA_23x(), VRegB_23x(), VRegC_23x()); break;
21675b2a4abea8a608d7aec3e417498b69b31026a74Sebastien Hertz    case k22b:  os << StringPrintf("%s v%d, v%d, #%+d", opcode, VRegA_22b(), VRegB_22b(), VRegC_22b()); break;
21775b2a4abea8a608d7aec3e417498b69b31026a74Sebastien Hertz    case k22t:  os << StringPrintf("%s v%d, v%d, %+d", opcode, VRegA_22t(), VRegB_22t(), VRegC_22t()); break;
21875b2a4abea8a608d7aec3e417498b69b31026a74Sebastien Hertz    case k22s:  os << StringPrintf("%s v%d, v%d, #%+d", opcode, VRegA_22s(), VRegB_22s(), VRegC_22s()); break;
21990334e5586ada4772229ded6f7acb85de524a704Ian Rogers    case k22c: {
22075b2a4abea8a608d7aec3e417498b69b31026a74Sebastien Hertz      switch (Opcode()) {
22190334e5586ada4772229ded6f7acb85de524a704Ian Rogers        case IGET:
22290334e5586ada4772229ded6f7acb85de524a704Ian Rogers        case IGET_WIDE:
22390334e5586ada4772229ded6f7acb85de524a704Ian Rogers        case IGET_OBJECT:
22490334e5586ada4772229ded6f7acb85de524a704Ian Rogers        case IGET_BOOLEAN:
22590334e5586ada4772229ded6f7acb85de524a704Ian Rogers        case IGET_BYTE:
22690334e5586ada4772229ded6f7acb85de524a704Ian Rogers        case IGET_CHAR:
22790334e5586ada4772229ded6f7acb85de524a704Ian Rogers        case IGET_SHORT:
228fc787ecd91127b2c8458afd94e5148e2ae51a1f5Ian Rogers          if (file != nullptr) {
22975b2a4abea8a608d7aec3e417498b69b31026a74Sebastien Hertz            uint32_t field_idx = VRegC_22c();
230b43cef30fa7171f5b33c5f94853ad8474ed08022Dragos Sbirlea            os << opcode << " v" << static_cast<int>(VRegA_22c()) << ", v" << static_cast<int>(VRegB_22c()) << ", "
23175b2a4abea8a608d7aec3e417498b69b31026a74Sebastien Hertz               << PrettyField(field_idx, *file, true) << " // field@" << field_idx;
23290334e5586ada4772229ded6f7acb85de524a704Ian Rogers            break;
233fc787ecd91127b2c8458afd94e5148e2ae51a1f5Ian Rogers          }
234fc787ecd91127b2c8458afd94e5148e2ae51a1f5Ian Rogers          FALLTHROUGH_INTENDED;
2352d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz        case IGET_QUICK:
2362d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz        case IGET_OBJECT_QUICK:
237fc787ecd91127b2c8458afd94e5148e2ae51a1f5Ian Rogers          if (file != nullptr) {
2382d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz            uint32_t field_idx = VRegC_22c();
2392d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz            os << opcode << " v" << static_cast<int>(VRegA_22c()) << ", v" << static_cast<int>(VRegB_22c()) << ", "
2402d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz               << "// offset@" << field_idx;
2412d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz            break;
242fc787ecd91127b2c8458afd94e5148e2ae51a1f5Ian Rogers          }
243fc787ecd91127b2c8458afd94e5148e2ae51a1f5Ian Rogers          FALLTHROUGH_INTENDED;
24490334e5586ada4772229ded6f7acb85de524a704Ian Rogers        case IPUT:
24590334e5586ada4772229ded6f7acb85de524a704Ian Rogers        case IPUT_WIDE:
24690334e5586ada4772229ded6f7acb85de524a704Ian Rogers        case IPUT_OBJECT:
24790334e5586ada4772229ded6f7acb85de524a704Ian Rogers        case IPUT_BOOLEAN:
24890334e5586ada4772229ded6f7acb85de524a704Ian Rogers        case IPUT_BYTE:
24990334e5586ada4772229ded6f7acb85de524a704Ian Rogers        case IPUT_CHAR:
25090334e5586ada4772229ded6f7acb85de524a704Ian Rogers        case IPUT_SHORT:
251fc787ecd91127b2c8458afd94e5148e2ae51a1f5Ian Rogers          if (file != nullptr) {
25275b2a4abea8a608d7aec3e417498b69b31026a74Sebastien Hertz            uint32_t field_idx = VRegC_22c();
253b43cef30fa7171f5b33c5f94853ad8474ed08022Dragos Sbirlea            os << opcode << " v" << static_cast<int>(VRegA_22c()) << ", v" << static_cast<int>(VRegB_22c()) << ", "
25475b2a4abea8a608d7aec3e417498b69b31026a74Sebastien Hertz               << PrettyField(field_idx, *file, true) << " // field@" << field_idx;
25590334e5586ada4772229ded6f7acb85de524a704Ian Rogers            break;
256fc787ecd91127b2c8458afd94e5148e2ae51a1f5Ian Rogers          }
257fc787ecd91127b2c8458afd94e5148e2ae51a1f5Ian Rogers          FALLTHROUGH_INTENDED;
2582d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz        case IPUT_QUICK:
2592d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz        case IPUT_OBJECT_QUICK:
260fc787ecd91127b2c8458afd94e5148e2ae51a1f5Ian Rogers          if (file != nullptr) {
2612d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz            uint32_t field_idx = VRegC_22c();
2622d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz            os << opcode << " v" << static_cast<int>(VRegA_22c()) << ", v" << static_cast<int>(VRegB_22c()) << ", "
2632d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz               << "// offset@" << field_idx;
2642d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz            break;
265fc787ecd91127b2c8458afd94e5148e2ae51a1f5Ian Rogers          }
266fc787ecd91127b2c8458afd94e5148e2ae51a1f5Ian Rogers          FALLTHROUGH_INTENDED;
26790334e5586ada4772229ded6f7acb85de524a704Ian Rogers        case INSTANCE_OF:
268fc787ecd91127b2c8458afd94e5148e2ae51a1f5Ian Rogers          if (file != nullptr) {
26975b2a4abea8a608d7aec3e417498b69b31026a74Sebastien Hertz            uint32_t type_idx = VRegC_22c();
270d4e868a25128e31c92b2779e7d2e15f9afdf4fffDragos Sbirlea            os << opcode << " v" << static_cast<int>(VRegA_22c()) << ", v" << static_cast<int>(VRegB_22c()) << ", "
27175b2a4abea8a608d7aec3e417498b69b31026a74Sebastien Hertz               << PrettyType(type_idx, *file) << " // type@" << type_idx;
27218c24b6e05e7591069f1a2ac9c614b28fc0853acMathieu Chartier            break;
27318c24b6e05e7591069f1a2ac9c614b28fc0853acMathieu Chartier          }
274fc787ecd91127b2c8458afd94e5148e2ae51a1f5Ian Rogers          FALLTHROUGH_INTENDED;
27518c24b6e05e7591069f1a2ac9c614b28fc0853acMathieu Chartier        case NEW_ARRAY:
276fc787ecd91127b2c8458afd94e5148e2ae51a1f5Ian Rogers          if (file != nullptr) {
27775b2a4abea8a608d7aec3e417498b69b31026a74Sebastien Hertz            uint32_t type_idx = VRegC_22c();
278b43cef30fa7171f5b33c5f94853ad8474ed08022Dragos Sbirlea            os << opcode << " v" << static_cast<int>(VRegA_22c()) << ", v" << static_cast<int>(VRegB_22c()) << ", "
27975b2a4abea8a608d7aec3e417498b69b31026a74Sebastien Hertz               << PrettyType(type_idx, *file) << " // type@" << type_idx;
28090334e5586ada4772229ded6f7acb85de524a704Ian Rogers            break;
281fc787ecd91127b2c8458afd94e5148e2ae51a1f5Ian Rogers          }
282fc787ecd91127b2c8458afd94e5148e2ae51a1f5Ian Rogers          FALLTHROUGH_INTENDED;
28390334e5586ada4772229ded6f7acb85de524a704Ian Rogers        default:
28475b2a4abea8a608d7aec3e417498b69b31026a74Sebastien Hertz          os << StringPrintf("%s v%d, v%d, thing@%d", opcode, VRegA_22c(), VRegB_22c(), VRegC_22c());
28590334e5586ada4772229ded6f7acb85de524a704Ian Rogers          break;
28690334e5586ada4772229ded6f7acb85de524a704Ian Rogers      }
28790334e5586ada4772229ded6f7acb85de524a704Ian Rogers      break;
28890334e5586ada4772229ded6f7acb85de524a704Ian Rogers    }
28975b2a4abea8a608d7aec3e417498b69b31026a74Sebastien Hertz    case k32x:  os << StringPrintf("%s v%d, v%d", opcode, VRegA_32x(), VRegB_32x()); break;
29075b2a4abea8a608d7aec3e417498b69b31026a74Sebastien Hertz    case k30t:  os << StringPrintf("%s %+d", opcode, VRegA_30t()); break;
29175b2a4abea8a608d7aec3e417498b69b31026a74Sebastien Hertz    case k31t:  os << StringPrintf("%s v%d, %+d", opcode, VRegA_31t(), VRegB_31t()); break;
29275b2a4abea8a608d7aec3e417498b69b31026a74Sebastien Hertz    case k31i:  os << StringPrintf("%s v%d, #%+d", opcode, VRegA_31i(), VRegB_31i()); break;
2937dfb28c066159e6cde8181720f0c451a700ef966Ian Rogers    case k31c:
2947dfb28c066159e6cde8181720f0c451a700ef966Ian Rogers      if (Opcode() == CONST_STRING_JUMBO) {
2957dfb28c066159e6cde8181720f0c451a700ef966Ian Rogers        uint32_t string_idx = VRegB_31c();
296fc787ecd91127b2c8458afd94e5148e2ae51a1f5Ian Rogers        if (file != nullptr) {
2977dfb28c066159e6cde8181720f0c451a700ef966Ian Rogers          os << StringPrintf("%s v%d, %s // string@%d", opcode, VRegA_31c(),
2987dfb28c066159e6cde8181720f0c451a700ef966Ian Rogers                             PrintableString(file->StringDataByIdx(string_idx)).c_str(),
2997dfb28c066159e6cde8181720f0c451a700ef966Ian Rogers                             string_idx);
3007dfb28c066159e6cde8181720f0c451a700ef966Ian Rogers        } else {
3017dfb28c066159e6cde8181720f0c451a700ef966Ian Rogers          os << StringPrintf("%s v%d, string@%d", opcode, VRegA_31c(), string_idx);
3027dfb28c066159e6cde8181720f0c451a700ef966Ian Rogers        }
3037dfb28c066159e6cde8181720f0c451a700ef966Ian Rogers      } else {
3047dfb28c066159e6cde8181720f0c451a700ef966Ian Rogers        os << StringPrintf("%s v%d, thing@%d", opcode, VRegA_31c(), VRegB_31c()); break;
3057dfb28c066159e6cde8181720f0c451a700ef966Ian Rogers      }
3067dfb28c066159e6cde8181720f0c451a700ef966Ian Rogers      break;
307d81871cbbaa34c649e488f94f61a981db33123e5Ian Rogers    case k35c: {
30875b2a4abea8a608d7aec3e417498b69b31026a74Sebastien Hertz      uint32_t arg[5];
30929a2648821ea4d0b5d3aecb9f835822fdfe6faa1Ian Rogers      GetVarArgs(arg);
31075b2a4abea8a608d7aec3e417498b69b31026a74Sebastien Hertz      switch (Opcode()) {
3117aca91db1571594cdb7e0a9ee704530b09c066e4Andreas Gampe        case FILLED_NEW_ARRAY:
3127aca91db1571594cdb7e0a9ee704530b09c066e4Andreas Gampe        {
3137aca91db1571594cdb7e0a9ee704530b09c066e4Andreas Gampe          const int32_t a = VRegA_35c();
3147aca91db1571594cdb7e0a9ee704530b09c066e4Andreas Gampe          os << opcode << " {";
3157aca91db1571594cdb7e0a9ee704530b09c066e4Andreas Gampe          for (int i = 0; i < a; ++i) {
3167aca91db1571594cdb7e0a9ee704530b09c066e4Andreas Gampe            if (i > 0) {
3177aca91db1571594cdb7e0a9ee704530b09c066e4Andreas Gampe              os << ", ";
3187aca91db1571594cdb7e0a9ee704530b09c066e4Andreas Gampe            }
3197aca91db1571594cdb7e0a9ee704530b09c066e4Andreas Gampe            os << "v" << arg[i];
3207aca91db1571594cdb7e0a9ee704530b09c066e4Andreas Gampe          }
3217aca91db1571594cdb7e0a9ee704530b09c066e4Andreas Gampe          os << "}, type@" << VRegB_35c();
3227aca91db1571594cdb7e0a9ee704530b09c066e4Andreas Gampe        }
3237aca91db1571594cdb7e0a9ee704530b09c066e4Andreas Gampe        break;
3247aca91db1571594cdb7e0a9ee704530b09c066e4Andreas Gampe
325d81871cbbaa34c649e488f94f61a981db33123e5Ian Rogers        case INVOKE_VIRTUAL:
326d81871cbbaa34c649e488f94f61a981db33123e5Ian Rogers        case INVOKE_SUPER:
327d81871cbbaa34c649e488f94f61a981db33123e5Ian Rogers        case INVOKE_DIRECT:
328d81871cbbaa34c649e488f94f61a981db33123e5Ian Rogers        case INVOKE_STATIC:
329d81871cbbaa34c649e488f94f61a981db33123e5Ian Rogers        case INVOKE_INTERFACE:
330fc787ecd91127b2c8458afd94e5148e2ae51a1f5Ian Rogers          if (file != nullptr) {
331e3c845cdb5884e770287a5c0c65c8bb64733c388Elliott Hughes            os << opcode << " {";
33275b2a4abea8a608d7aec3e417498b69b31026a74Sebastien Hertz            uint32_t method_idx = VRegB_35c();
33375b2a4abea8a608d7aec3e417498b69b31026a74Sebastien Hertz            for (size_t i = 0; i < VRegA_35c(); ++i) {
334e3c845cdb5884e770287a5c0c65c8bb64733c388Elliott Hughes              if (i != 0) {
335e3c845cdb5884e770287a5c0c65c8bb64733c388Elliott Hughes                os << ", ";
336e3c845cdb5884e770287a5c0c65c8bb64733c388Elliott Hughes              }
33775b2a4abea8a608d7aec3e417498b69b31026a74Sebastien Hertz              os << "v" << arg[i];
338e3c845cdb5884e770287a5c0c65c8bb64733c388Elliott Hughes            }
33975b2a4abea8a608d7aec3e417498b69b31026a74Sebastien Hertz            os << "}, " << PrettyMethod(method_idx, *file) << " // method@" << method_idx;
340d81871cbbaa34c649e488f94f61a981db33123e5Ian Rogers            break;
341fc787ecd91127b2c8458afd94e5148e2ae51a1f5Ian Rogers          }
342fc787ecd91127b2c8458afd94e5148e2ae51a1f5Ian Rogers          FALLTHROUGH_INTENDED;
3432d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz        case INVOKE_VIRTUAL_QUICK:
344fc787ecd91127b2c8458afd94e5148e2ae51a1f5Ian Rogers          if (file != nullptr) {
3452d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz            os << opcode << " {";
3462d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz            uint32_t method_idx = VRegB_35c();
3472d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz            for (size_t i = 0; i < VRegA_35c(); ++i) {
3482d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz              if (i != 0) {
3492d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz                os << ", ";
3502d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz              }
3512d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz              os << "v" << arg[i];
3522d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz            }
3537934ac288acfb2552bb0b06ec1f61e5820d924a4Brian Carlstrom            os << "},  // vtable@" << method_idx;
3542d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz            break;
355fc787ecd91127b2c8458afd94e5148e2ae51a1f5Ian Rogers          }
356fc787ecd91127b2c8458afd94e5148e2ae51a1f5Ian Rogers          FALLTHROUGH_INTENDED;
357d81871cbbaa34c649e488f94f61a981db33123e5Ian Rogers        default:
35875b2a4abea8a608d7aec3e417498b69b31026a74Sebastien Hertz          os << opcode << " {v" << arg[0] << ", v" << arg[1] << ", v" << arg[2]
35975b2a4abea8a608d7aec3e417498b69b31026a74Sebastien Hertz                       << ", v" << arg[3] << ", v" << arg[4] << "}, thing@" << VRegB_35c();
360d81871cbbaa34c649e488f94f61a981db33123e5Ian Rogers          break;
361d81871cbbaa34c649e488f94f61a981db33123e5Ian Rogers      }
362d81871cbbaa34c649e488f94f61a981db33123e5Ian Rogers      break;
363d81871cbbaa34c649e488f94f61a981db33123e5Ian Rogers    }
3644c5dd5aa7a2cdbec8c298569c5a84d0ef5357363Ian Rogers    case k3rc: {
36575b2a4abea8a608d7aec3e417498b69b31026a74Sebastien Hertz      switch (Opcode()) {
3664c5dd5aa7a2cdbec8c298569c5a84d0ef5357363Ian Rogers        case INVOKE_VIRTUAL_RANGE:
3674c5dd5aa7a2cdbec8c298569c5a84d0ef5357363Ian Rogers        case INVOKE_SUPER_RANGE:
3684c5dd5aa7a2cdbec8c298569c5a84d0ef5357363Ian Rogers        case INVOKE_DIRECT_RANGE:
3694c5dd5aa7a2cdbec8c298569c5a84d0ef5357363Ian Rogers        case INVOKE_STATIC_RANGE:
3704c5dd5aa7a2cdbec8c298569c5a84d0ef5357363Ian Rogers        case INVOKE_INTERFACE_RANGE:
371fc787ecd91127b2c8458afd94e5148e2ae51a1f5Ian Rogers          if (file != nullptr) {
37275b2a4abea8a608d7aec3e417498b69b31026a74Sebastien Hertz            uint32_t method_idx = VRegB_3rc();
37375b2a4abea8a608d7aec3e417498b69b31026a74Sebastien Hertz            os << StringPrintf("%s, {v%d .. v%d}, ", opcode, VRegC_3rc(), (VRegC_3rc() + VRegA_3rc() - 1))
37475b2a4abea8a608d7aec3e417498b69b31026a74Sebastien Hertz               << PrettyMethod(method_idx, *file) << " // method@" << method_idx;
3754c5dd5aa7a2cdbec8c298569c5a84d0ef5357363Ian Rogers            break;
376fc787ecd91127b2c8458afd94e5148e2ae51a1f5Ian Rogers          }
377fc787ecd91127b2c8458afd94e5148e2ae51a1f5Ian Rogers          FALLTHROUGH_INTENDED;
3782d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz        case INVOKE_VIRTUAL_RANGE_QUICK:
379fc787ecd91127b2c8458afd94e5148e2ae51a1f5Ian Rogers          if (file != nullptr) {
3802d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz            uint32_t method_idx = VRegB_3rc();
3812d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz            os << StringPrintf("%s, {v%d .. v%d}, ", opcode, VRegC_3rc(), (VRegC_3rc() + VRegA_3rc() - 1))
3822d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz               << "// vtable@" << method_idx;
3832d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz            break;
384fc787ecd91127b2c8458afd94e5148e2ae51a1f5Ian Rogers          }
385fc787ecd91127b2c8458afd94e5148e2ae51a1f5Ian Rogers          FALLTHROUGH_INTENDED;
3864c5dd5aa7a2cdbec8c298569c5a84d0ef5357363Ian Rogers        default:
38775b2a4abea8a608d7aec3e417498b69b31026a74Sebastien Hertz          os << StringPrintf("%s, {v%d .. v%d}, thing@%d", opcode, VRegC_3rc(),
38875b2a4abea8a608d7aec3e417498b69b31026a74Sebastien Hertz                             (VRegC_3rc() + VRegA_3rc() - 1), VRegB_3rc());
3894c5dd5aa7a2cdbec8c298569c5a84d0ef5357363Ian Rogers          break;
3904c5dd5aa7a2cdbec8c298569c5a84d0ef5357363Ian Rogers      }
3914c5dd5aa7a2cdbec8c298569c5a84d0ef5357363Ian Rogers      break;
3924c5dd5aa7a2cdbec8c298569c5a84d0ef5357363Ian Rogers    }
393b574c1816c7a2f160b267cd100f36f157a9abcf6Ian Rogers    case k51l: os << StringPrintf("%s v%d, #%+" PRId64, opcode, VRegA_51l(), VRegB_51l()); break;
3942c8a857708fc86a5b555d1eb782b56516f3b1a72Ian Rogers    default: os << " unknown format (" << DumpHex(5) << ")"; break;
395d81871cbbaa34c649e488f94f61a981db33123e5Ian Rogers  }
3962c8a857708fc86a5b555d1eb782b56516f3b1a72Ian Rogers  return os.str();
39712eb78e651f13f2c1f0c2c922048a5a213253adfCarl Shapiro}
39812eb78e651f13f2c1f0c2c922048a5a213253adfCarl Shapiro
399a75a01313e801c53145df00bad1842d9f643c0a1Ian Rogersstd::ostream& operator<<(std::ostream& os, const Instruction::Code& code) {
400a75a01313e801c53145df00bad1842d9f643c0a1Ian Rogers  return os << Instruction::Name(code);
401adb8c67f6d87a160d4e3a8afea7cb93f6c14568bElliott Hughes}
402adb8c67f6d87a160d4e3a8afea7cb93f6c14568bElliott Hughes
40312eb78e651f13f2c1f0c2c922048a5a213253adfCarl Shapiro}  // namespace art
404