dex_instruction-inl.h revision 5243e912875026f99428088db7e80cb11651d64e
1807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz/*
2807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz * Copyright (C) 2011 The Android Open Source Project
3807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz *
4807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz * Licensed under the Apache License, Version 2.0 (the "License");
5807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz * you may not use this file except in compliance with the License.
6807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz * You may obtain a copy of the License at
7807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz *
8807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz *      http://www.apache.org/licenses/LICENSE-2.0
9807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz *
10807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz * Unless required by applicable law or agreed to in writing, software
11807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz * distributed under the License is distributed on an "AS IS" BASIS,
12807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz * See the License for the specific language governing permissions and
14807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz * limitations under the License.
15807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz */
16807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz
17807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz#ifndef ART_SRC_DEX_INSTRUCTION_INL_H_
18807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz#define ART_SRC_DEX_INSTRUCTION_INL_H_
19807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz
20807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz#include "dex_instruction.h"
21807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz
22807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertznamespace art {
23807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz
249cec247849c248f6c45a14eae5414b69eb8fc67dJeff Haoinline const Instruction* Instruction::Next_51l() const {
259cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao  DCHECK_EQ(FormatOf(Opcode()), k51l);
269cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao  size_t current_size_in_bytes = 5 * sizeof(uint16_t);
279cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao  const uint8_t* ptr = reinterpret_cast<const uint8_t*>(this);
289cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao  return reinterpret_cast<const Instruction*>(ptr + current_size_in_bytes);
299cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao}
309cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao
31807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz//------------------------------------------------------------------------------
32807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz// VRegA
33807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz//------------------------------------------------------------------------------
34807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertzinline int8_t Instruction::VRegA_10t() const {
35807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  DCHECK_EQ(FormatOf(Opcode()), k10t);
36807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  return static_cast<int8_t>(InstAA());
37807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz}
38807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz
395243e912875026f99428088db7e80cb11651d64eSebastien Hertzinline uint8_t Instruction::VRegA_10x() const {
405243e912875026f99428088db7e80cb11651d64eSebastien Hertz  DCHECK_EQ(FormatOf(Opcode()), k10x);
415243e912875026f99428088db7e80cb11651d64eSebastien Hertz  return InstAA();
425243e912875026f99428088db7e80cb11651d64eSebastien Hertz}
435243e912875026f99428088db7e80cb11651d64eSebastien Hertz
44807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertzinline uint4_t Instruction::VRegA_11n() const {
45807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  DCHECK_EQ(FormatOf(Opcode()), k11n);
46807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  return InstA();
47807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz}
48807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz
49807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertzinline uint8_t Instruction::VRegA_11x() const {
50807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  DCHECK_EQ(FormatOf(Opcode()), k11x);
51807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  return InstAA();
52807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz}
53807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz
54807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertzinline uint4_t Instruction::VRegA_12x() const {
55807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  DCHECK_EQ(FormatOf(Opcode()), k12x);
56807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  return InstA();
57807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz}
58807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz
59807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertzinline int16_t Instruction::VRegA_20t() const {
60807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  DCHECK_EQ(FormatOf(Opcode()), k20t);
61807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  return static_cast<int16_t>(Fetch16(1));
62807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz}
63807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz
64807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertzinline uint8_t Instruction::VRegA_21c() const {
65807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  DCHECK_EQ(FormatOf(Opcode()), k21c);
66807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  return InstAA();
67807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz}
68807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz
69807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertzinline uint8_t Instruction::VRegA_21h() const {
70807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  DCHECK_EQ(FormatOf(Opcode()), k21h);
71807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  return InstAA();
72807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz}
73807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz
74807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertzinline uint8_t Instruction::VRegA_21s() const {
75807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  DCHECK_EQ(FormatOf(Opcode()), k21s);
76807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  return InstAA();
77807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz}
78807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz
79807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertzinline uint8_t Instruction::VRegA_21t() const {
80807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  DCHECK_EQ(FormatOf(Opcode()), k21t);
81807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  return InstAA();
82807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz}
83807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz
84807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertzinline uint8_t Instruction::VRegA_22b() const {
85807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  DCHECK_EQ(FormatOf(Opcode()), k22b);
86807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  return InstAA();
87807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz}
88807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz
89807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertzinline uint4_t Instruction::VRegA_22c() const {
90807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  DCHECK_EQ(FormatOf(Opcode()), k22c);
91807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  return InstA();
92807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz}
93807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz
94807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertzinline uint4_t Instruction::VRegA_22s() const {
95807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  DCHECK_EQ(FormatOf(Opcode()), k22s);
96807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  return InstA();
97807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz}
98807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz
99807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertzinline uint4_t Instruction::VRegA_22t() const {
100807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  DCHECK_EQ(FormatOf(Opcode()), k22t);
101807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  return InstA();
102807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz}
103807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz
104807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertzinline uint8_t Instruction::VRegA_22x() const {
105807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  DCHECK_EQ(FormatOf(Opcode()), k22x);
106807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  return InstAA();
107807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz}
108807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz
109807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertzinline uint8_t Instruction::VRegA_23x() const {
110807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  DCHECK_EQ(FormatOf(Opcode()), k23x);
111807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  return InstAA();
112807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz}
113807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz
114807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertzinline int32_t Instruction::VRegA_30t() const {
115807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  DCHECK_EQ(FormatOf(Opcode()), k30t);
116807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  return static_cast<int32_t>(Fetch32(1));
117807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz}
118807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz
119807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertzinline uint8_t Instruction::VRegA_31c() const {
120807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  DCHECK_EQ(FormatOf(Opcode()), k31c);
121807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  return InstAA();
122807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz}
123807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz
124807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertzinline uint8_t Instruction::VRegA_31i() const {
125807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  DCHECK_EQ(FormatOf(Opcode()), k31i);
126807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  return InstAA();
127807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz}
128807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz
129807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertzinline uint8_t Instruction::VRegA_31t() const {
130807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  DCHECK_EQ(FormatOf(Opcode()), k31t);
131807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  return InstAA();
132807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz}
133807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz
134807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertzinline uint16_t Instruction::VRegA_32x() const {
135807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  DCHECK_EQ(FormatOf(Opcode()), k32x);
136807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  return Fetch16(1);
137807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz}
138807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz
139807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertzinline uint4_t Instruction::VRegA_35c() const {
140807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  DCHECK_EQ(FormatOf(Opcode()), k35c);
141807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  return InstB(); // This is labeled A in the spec.
142807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz}
143807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz
144807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertzinline uint8_t Instruction::VRegA_3rc() const {
145807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  DCHECK_EQ(FormatOf(Opcode()), k3rc);
146807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  return InstAA();
147807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz}
148807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz
149807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertzinline uint8_t Instruction::VRegA_51l() const {
150807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  DCHECK_EQ(FormatOf(Opcode()), k51l);
151807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  return InstAA();
152807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz}
153807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz
154807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz//------------------------------------------------------------------------------
155807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz// VRegB
156807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz//------------------------------------------------------------------------------
157807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertzinline int4_t Instruction::VRegB_11n() const {
158807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  DCHECK_EQ(FormatOf(Opcode()), k11n);
159807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  return static_cast<int4_t>((InstB() << 28) >> 28);
160807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz}
161807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz
162807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertzinline uint4_t Instruction::VRegB_12x() const {
163807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  DCHECK_EQ(FormatOf(Opcode()), k12x);
164807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  return InstB();
165807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz}
166807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz
167807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertzinline uint16_t Instruction::VRegB_21c() const {
168807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  DCHECK_EQ(FormatOf(Opcode()), k21c);
169807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  return Fetch16(1);
170807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz}
171807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz
172807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertzinline uint16_t Instruction::VRegB_21h() const {
173807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  DCHECK_EQ(FormatOf(Opcode()), k21h);
174807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  return Fetch16(1);
175807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz}
176807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz
177807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertzinline int16_t Instruction::VRegB_21s() const {
178807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  DCHECK_EQ(FormatOf(Opcode()), k21s);
179807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  return static_cast<int16_t>(Fetch16(1));
180807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz}
181807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz
182807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertzinline int16_t Instruction::VRegB_21t() const {
183807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  DCHECK_EQ(FormatOf(Opcode()), k21t);
184807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  return static_cast<int16_t>(Fetch16(1));
185807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz}
186807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz
187807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertzinline uint8_t Instruction::VRegB_22b() const {
188807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  DCHECK_EQ(FormatOf(Opcode()), k22b);
189807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  return static_cast<uint8_t>(Fetch16(1) & 0xff);
190807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz}
191807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz
192807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertzinline uint4_t Instruction::VRegB_22c() const {
193807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  DCHECK_EQ(FormatOf(Opcode()), k22c);
194807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  return InstB();
195807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz}
196807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz
197807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertzinline uint4_t Instruction::VRegB_22s() const {
198807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  DCHECK_EQ(FormatOf(Opcode()), k22s);
199807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  return InstB();
200807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz}
201807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz
202807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertzinline uint4_t Instruction::VRegB_22t() const {
203807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  DCHECK_EQ(FormatOf(Opcode()), k22t);
204807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  return InstB();
205807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz}
206807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz
207807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertzinline uint16_t Instruction::VRegB_22x() const {
208807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  DCHECK_EQ(FormatOf(Opcode()), k22x);
209807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  return Fetch16(1);
210807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz}
211807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz
212807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertzinline uint8_t Instruction::VRegB_23x() const {
213807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  DCHECK_EQ(FormatOf(Opcode()), k23x);
214807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  return static_cast<uint8_t>(Fetch16(1) & 0xff);
215807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz}
216807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz
217807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertzinline uint32_t Instruction::VRegB_31c() const {
218807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  DCHECK_EQ(FormatOf(Opcode()), k31c);
219807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  return Fetch32(1);
220807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz}
221807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz
222807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertzinline int32_t Instruction::VRegB_31i() const {
223807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  DCHECK_EQ(FormatOf(Opcode()), k31i);
224807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  return static_cast<int32_t>(Fetch32(1));
225807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz}
226807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz
227807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertzinline int32_t Instruction::VRegB_31t() const {
228807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  DCHECK_EQ(FormatOf(Opcode()), k31t);
229807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  return static_cast<int32_t>(Fetch32(1));
230807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz}
231807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz
232807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertzinline uint16_t Instruction::VRegB_32x() const {
233807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  DCHECK_EQ(FormatOf(Opcode()), k32x);
234807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  return Fetch16(2);
235807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz}
236807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz
237807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertzinline uint16_t Instruction::VRegB_35c() const {
238807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  DCHECK_EQ(FormatOf(Opcode()), k35c);
239807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  return Fetch16(1);
240807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz}
241807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz
242807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertzinline uint16_t Instruction::VRegB_3rc() const {
243807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  DCHECK_EQ(FormatOf(Opcode()), k3rc);
244807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  return Fetch16(1);
245807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz}
246807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz
247807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertzinline uint64_t Instruction::VRegB_51l() const {
248807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  DCHECK_EQ(FormatOf(Opcode()), k51l);
249807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  uint64_t vB_wide = Fetch32(1) | ((uint64_t) Fetch32(3) << 32);
250807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  return vB_wide;
251807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz}
252807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz
253807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz//------------------------------------------------------------------------------
254807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz// VRegC
255807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz//------------------------------------------------------------------------------
256807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertzinline int8_t Instruction::VRegC_22b() const {
257807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  DCHECK_EQ(FormatOf(Opcode()), k22b);
258807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  return static_cast<int8_t>(Fetch16(1) >> 8);
259807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz}
260807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz
261807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertzinline uint16_t Instruction::VRegC_22c() const {
262807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  DCHECK_EQ(FormatOf(Opcode()), k22c);
263807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  return Fetch16(1);
264807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz}
265807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz
266807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertzinline int16_t Instruction::VRegC_22s() const {
267807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  DCHECK_EQ(FormatOf(Opcode()), k22s);
268807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  return static_cast<int16_t>(Fetch16(1));
269807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz}
270807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz
271807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertzinline int16_t Instruction::VRegC_22t() const {
272807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  DCHECK_EQ(FormatOf(Opcode()), k22t);
273807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  return static_cast<int16_t>(Fetch16(1));
274807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz}
275807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz
276807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertzinline uint8_t Instruction::VRegC_23x() const {
277807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  DCHECK_EQ(FormatOf(Opcode()), k23x);
278807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  return static_cast<uint8_t>(Fetch16(1) >> 8);
279807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz}
280807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz
281807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertzinline uint4_t Instruction::VRegC_35c() const {
282807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  DCHECK_EQ(FormatOf(Opcode()), k35c);
283807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  return static_cast<uint4_t>(Fetch16(2) & 0x0f);
284807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz}
285807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz
286807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertzinline uint16_t Instruction::VRegC_3rc() const {
287807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  DCHECK_EQ(FormatOf(Opcode()), k3rc);
288807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  return Fetch16(2);
289807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz}
290807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz
291807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertzinline void Instruction::GetArgs(uint32_t arg[5]) const {
292807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  DCHECK_EQ(FormatOf(Opcode()), k35c);
293807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz
294807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  /*
295807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz   * Note that the fields mentioned in the spec don't appear in
296807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz   * their "usual" positions here compared to most formats. This
297807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz   * was done so that the field names for the argument count and
298807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz   * reference index match between this format and the corresponding
299807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz   * range formats (3rc and friends).
300807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz   *
301807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz   * Bottom line: The argument count is always in vA, and the
302807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz   * method constant (or equivalent) is always in vB.
303807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz   */
304807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  uint16_t regList = Fetch16(2);
305807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  uint4_t count = InstB(); // This is labeled A in the spec.
306807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz
307807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  /*
308807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz   * Copy the argument registers into the arg[] array, and
309807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz   * also copy the first argument (if any) into vC. (The
310807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz   * DecodedInstruction structure doesn't have separate
311807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz   * fields for {vD, vE, vF, vG}, so there's no need to make
312807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz   * copies of those.) Note that cases 5..2 fall through.
313807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz   */
314807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  switch (count) {
315807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz    case 5: arg[4] = InstA();
316807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz    case 4: arg[3] = (regList >> 12) & 0x0f;
317807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz    case 3: arg[2] = (regList >> 8) & 0x0f;
318807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz    case 2: arg[1] = (regList >> 4) & 0x0f;
319807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz    case 1: arg[0] = regList & 0x0f; break;
320807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz    case 0: break; // Valid, but no need to do anything.
321807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz    default:
322807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz      LOG(ERROR) << "Invalid arg count in 35c (" << count << ")";
323807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz      return;
324807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  }
325807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz}
326807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz
327807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz} // namespace art
328807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz
329807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz#endif // ART_SRC_DEX_INSTRUCTION_INL_H_
330