dex_instruction.cc revision e4c1ce498f7933b91696caa4a527e6556128a8e2
112eb78e651f13f2c1f0c2c922048a5a213253adfCarl Shapiro// Copyright 2011 Google Inc. All Rights Reserved.
212eb78e651f13f2c1f0c2c922048a5a213253adfCarl Shapiro
312eb78e651f13f2c1f0c2c922048a5a213253adfCarl Shapiro#include "src/dex_instruction.h"
412eb78e651f13f2c1f0c2c922048a5a213253adfCarl Shapiro
512eb78e651f13f2c1f0c2c922048a5a213253adfCarl Shapironamespace art {
612eb78e651f13f2c1f0c2c922048a5a213253adfCarl Shapiro
7e4c1ce498f7933b91696caa4a527e6556128a8e2Carl Shapiroconst char* const Instruction::kInstructionNames[] = {
8e4c1ce498f7933b91696caa4a527e6556128a8e2Carl Shapiro#define INSTRUCTION_NAME(o, c, pname, f, r, i, a) pname,
9e4c1ce498f7933b91696caa4a527e6556128a8e2Carl Shapiro#include "src/dex_instruction_list.h"
10e4c1ce498f7933b91696caa4a527e6556128a8e2Carl Shapiro  DEX_INSTRUCTION_LIST(INSTRUCTION_NAME)
11e4c1ce498f7933b91696caa4a527e6556128a8e2Carl Shapiro#undef DEX_INSTRUCTION_LIST
12e4c1ce498f7933b91696caa4a527e6556128a8e2Carl Shapiro#undef INSTRUCTION_NAME
13e4c1ce498f7933b91696caa4a527e6556128a8e2Carl Shapiro};
14e4c1ce498f7933b91696caa4a527e6556128a8e2Carl Shapiro
15e4c1ce498f7933b91696caa4a527e6556128a8e2Carl ShapiroInstruction::InstructionFormat const Instruction::kInstructionFormats[] = {
16e4c1ce498f7933b91696caa4a527e6556128a8e2Carl Shapiro#define INSTRUCTION_FORMAT(o, c, p, format, r, i, a) format,
17e4c1ce498f7933b91696caa4a527e6556128a8e2Carl Shapiro#include "src/dex_instruction_list.h"
18e4c1ce498f7933b91696caa4a527e6556128a8e2Carl Shapiro  DEX_INSTRUCTION_LIST(INSTRUCTION_FORMAT)
19e4c1ce498f7933b91696caa4a527e6556128a8e2Carl Shapiro#undef DEX_INSTRUCTION_LIST
20e4c1ce498f7933b91696caa4a527e6556128a8e2Carl Shapiro#undef INSTRUCTION_FORMAT
21e4c1ce498f7933b91696caa4a527e6556128a8e2Carl Shapiro};
22e4c1ce498f7933b91696caa4a527e6556128a8e2Carl Shapiro
23e4c1ce498f7933b91696caa4a527e6556128a8e2Carl Shapiroint const Instruction::kInstructionFlags[] = {
24e4c1ce498f7933b91696caa4a527e6556128a8e2Carl Shapiro#define INSTRUCTION_FLAGS(o, c, p, f, r, i, flags) flags,
25e4c1ce498f7933b91696caa4a527e6556128a8e2Carl Shapiro#include "src/dex_instruction_list.h"
26e4c1ce498f7933b91696caa4a527e6556128a8e2Carl Shapiro  DEX_INSTRUCTION_LIST(INSTRUCTION_FLAGS)
27e4c1ce498f7933b91696caa4a527e6556128a8e2Carl Shapiro#undef DEX_INSTRUCTION_LIST
28e4c1ce498f7933b91696caa4a527e6556128a8e2Carl Shapiro#undef INSTRUCTION_FLAGS
29e4c1ce498f7933b91696caa4a527e6556128a8e2Carl Shapiro};
30e4c1ce498f7933b91696caa4a527e6556128a8e2Carl Shapiro
31e4c1ce498f7933b91696caa4a527e6556128a8e2Carl Shapirosize_t Instruction::Size() const {
3212eb78e651f13f2c1f0c2c922048a5a213253adfCarl Shapiro  const uint16_t* insns = reinterpret_cast<const uint16_t*>(this);
33e4c1ce498f7933b91696caa4a527e6556128a8e2Carl Shapiro  size_t size = 0;
34e4c1ce498f7933b91696caa4a527e6556128a8e2Carl Shapiro  if (*insns == kPackedSwitchSignature) {
35e4c1ce498f7933b91696caa4a527e6556128a8e2Carl Shapiro    size = 4 + insns[1] * 2;
36e4c1ce498f7933b91696caa4a527e6556128a8e2Carl Shapiro  } else if (*insns == kSparseSwitchSignature) {
37e4c1ce498f7933b91696caa4a527e6556128a8e2Carl Shapiro    size = 2 + insns[1] * 4;
38e4c1ce498f7933b91696caa4a527e6556128a8e2Carl Shapiro  } else if (*insns == kArrayDataSignature) {
39e4c1ce498f7933b91696caa4a527e6556128a8e2Carl Shapiro    uint16_t element_size = insns[1];
40e4c1ce498f7933b91696caa4a527e6556128a8e2Carl Shapiro    uint32_t length = insns[2] | (((uint32_t)insns[3]) << 16);
41e4c1ce498f7933b91696caa4a527e6556128a8e2Carl Shapiro    // The plus 1 is to round up for odd size and width.
42e4c1ce498f7933b91696caa4a527e6556128a8e2Carl Shapiro    return 4 + (element_size * length + 1) / 2;
43e4c1ce498f7933b91696caa4a527e6556128a8e2Carl Shapiro  } else {
44e4c1ce498f7933b91696caa4a527e6556128a8e2Carl Shapiro    switch (Format()) {
45e4c1ce498f7933b91696caa4a527e6556128a8e2Carl Shapiro      case k10x:
46e4c1ce498f7933b91696caa4a527e6556128a8e2Carl Shapiro      case k12x:
47e4c1ce498f7933b91696caa4a527e6556128a8e2Carl Shapiro      case k11n:
48e4c1ce498f7933b91696caa4a527e6556128a8e2Carl Shapiro      case k11x:
49e4c1ce498f7933b91696caa4a527e6556128a8e2Carl Shapiro      case k10t:
50e4c1ce498f7933b91696caa4a527e6556128a8e2Carl Shapiro        size = 1;
51e4c1ce498f7933b91696caa4a527e6556128a8e2Carl Shapiro        break;
52e4c1ce498f7933b91696caa4a527e6556128a8e2Carl Shapiro      case k20t:
53e4c1ce498f7933b91696caa4a527e6556128a8e2Carl Shapiro      case k22x:
54e4c1ce498f7933b91696caa4a527e6556128a8e2Carl Shapiro      case k21t:
55e4c1ce498f7933b91696caa4a527e6556128a8e2Carl Shapiro      case k21s:
56e4c1ce498f7933b91696caa4a527e6556128a8e2Carl Shapiro      case k21h:
57e4c1ce498f7933b91696caa4a527e6556128a8e2Carl Shapiro      case k21c:
58e4c1ce498f7933b91696caa4a527e6556128a8e2Carl Shapiro      case k23x:
59e4c1ce498f7933b91696caa4a527e6556128a8e2Carl Shapiro      case k22b:
60e4c1ce498f7933b91696caa4a527e6556128a8e2Carl Shapiro      case k22t:
61e4c1ce498f7933b91696caa4a527e6556128a8e2Carl Shapiro      case k22s:
62e4c1ce498f7933b91696caa4a527e6556128a8e2Carl Shapiro      case k22c:
63e4c1ce498f7933b91696caa4a527e6556128a8e2Carl Shapiro        size = 2;
64e4c1ce498f7933b91696caa4a527e6556128a8e2Carl Shapiro        break;
65e4c1ce498f7933b91696caa4a527e6556128a8e2Carl Shapiro      case k32x:
66e4c1ce498f7933b91696caa4a527e6556128a8e2Carl Shapiro      case k30t:
67e4c1ce498f7933b91696caa4a527e6556128a8e2Carl Shapiro      case k31t:
68e4c1ce498f7933b91696caa4a527e6556128a8e2Carl Shapiro      case k31i:
69e4c1ce498f7933b91696caa4a527e6556128a8e2Carl Shapiro      case k31c:
70e4c1ce498f7933b91696caa4a527e6556128a8e2Carl Shapiro      case k35c:
71e4c1ce498f7933b91696caa4a527e6556128a8e2Carl Shapiro      case k3rc:
72e4c1ce498f7933b91696caa4a527e6556128a8e2Carl Shapiro        size = 3;
73e4c1ce498f7933b91696caa4a527e6556128a8e2Carl Shapiro        break;
74e4c1ce498f7933b91696caa4a527e6556128a8e2Carl Shapiro      case k51l:
75e4c1ce498f7933b91696caa4a527e6556128a8e2Carl Shapiro        size = 5;
76e4c1ce498f7933b91696caa4a527e6556128a8e2Carl Shapiro        break;
77e4c1ce498f7933b91696caa4a527e6556128a8e2Carl Shapiro      default:
78e4c1ce498f7933b91696caa4a527e6556128a8e2Carl Shapiro        LOG(FATAL) << "Unreachable";
79e4c1ce498f7933b91696caa4a527e6556128a8e2Carl Shapiro    }
80e4c1ce498f7933b91696caa4a527e6556128a8e2Carl Shapiro  }
81e4c1ce498f7933b91696caa4a527e6556128a8e2Carl Shapiro  size *= sizeof(uint16_t);
82e4c1ce498f7933b91696caa4a527e6556128a8e2Carl Shapiro  return size;
8312eb78e651f13f2c1f0c2c922048a5a213253adfCarl Shapiro}
8412eb78e651f13f2c1f0c2c922048a5a213253adfCarl Shapiro
85e4c1ce498f7933b91696caa4a527e6556128a8e2Carl ShapiroInstruction::Code Instruction::Opcode() const {
8612eb78e651f13f2c1f0c2c922048a5a213253adfCarl Shapiro  const uint16_t* insns = reinterpret_cast<const uint16_t*>(this);
87e4c1ce498f7933b91696caa4a527e6556128a8e2Carl Shapiro  int opcode = *insns & 0xFF;
88e4c1ce498f7933b91696caa4a527e6556128a8e2Carl Shapiro  return static_cast<Code>(opcode);
8912eb78e651f13f2c1f0c2c922048a5a213253adfCarl Shapiro}
9012eb78e651f13f2c1f0c2c922048a5a213253adfCarl Shapiro
91e4c1ce498f7933b91696caa4a527e6556128a8e2Carl Shapiroconst Instruction* Instruction::Next() const {
9212eb78e651f13f2c1f0c2c922048a5a213253adfCarl Shapiro  size_t current_size = Size();
9312eb78e651f13f2c1f0c2c922048a5a213253adfCarl Shapiro  const uint8_t* ptr = reinterpret_cast<const uint8_t*>(this);
9412eb78e651f13f2c1f0c2c922048a5a213253adfCarl Shapiro  return reinterpret_cast<const Instruction*>(ptr + current_size);
9512eb78e651f13f2c1f0c2c922048a5a213253adfCarl Shapiro}
9612eb78e651f13f2c1f0c2c922048a5a213253adfCarl Shapiro
9712eb78e651f13f2c1f0c2c922048a5a213253adfCarl Shapiro}  // namespace art
98