dex_instruction-inl.h revision 807a25640d4f4de8143b160b3bb8f552ffbf6f4a
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
24807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz//------------------------------------------------------------------------------
25807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz// VRegA
26807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz//------------------------------------------------------------------------------
27807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertzinline int8_t Instruction::VRegA_10t() const {
28807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  DCHECK_EQ(FormatOf(Opcode()), k10t);
29807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  return static_cast<int8_t>(InstAA());
30807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz}
31807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz
32807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertzinline uint4_t Instruction::VRegA_11n() const {
33807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  DCHECK_EQ(FormatOf(Opcode()), k11n);
34807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  return InstA();
35807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz}
36807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz
37807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertzinline uint8_t Instruction::VRegA_11x() const {
38807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  DCHECK_EQ(FormatOf(Opcode()), k11x);
39807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  return InstAA();
40807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz}
41807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz
42807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertzinline uint4_t Instruction::VRegA_12x() const {
43807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  DCHECK_EQ(FormatOf(Opcode()), k12x);
44807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  return InstA();
45807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz}
46807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz
47807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertzinline int16_t Instruction::VRegA_20t() const {
48807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  DCHECK_EQ(FormatOf(Opcode()), k20t);
49807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  return static_cast<int16_t>(Fetch16(1));
50807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz}
51807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz
52807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertzinline uint8_t Instruction::VRegA_21c() const {
53807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  DCHECK_EQ(FormatOf(Opcode()), k21c);
54807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  return InstAA();
55807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz}
56807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz
57807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertzinline uint8_t Instruction::VRegA_21h() const {
58807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  DCHECK_EQ(FormatOf(Opcode()), k21h);
59807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  return InstAA();
60807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz}
61807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz
62807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertzinline uint8_t Instruction::VRegA_21s() const {
63807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  DCHECK_EQ(FormatOf(Opcode()), k21s);
64807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  return InstAA();
65807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz}
66807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz
67807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertzinline uint8_t Instruction::VRegA_21t() const {
68807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  DCHECK_EQ(FormatOf(Opcode()), k21t);
69807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  return InstAA();
70807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz}
71807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz
72807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertzinline uint8_t Instruction::VRegA_22b() const {
73807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  DCHECK_EQ(FormatOf(Opcode()), k22b);
74807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  return InstAA();
75807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz}
76807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz
77807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertzinline uint4_t Instruction::VRegA_22c() const {
78807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  DCHECK_EQ(FormatOf(Opcode()), k22c);
79807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  return InstA();
80807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz}
81807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz
82807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertzinline uint4_t Instruction::VRegA_22s() const {
83807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  DCHECK_EQ(FormatOf(Opcode()), k22s);
84807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  return InstA();
85807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz}
86807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz
87807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertzinline uint4_t Instruction::VRegA_22t() const {
88807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  DCHECK_EQ(FormatOf(Opcode()), k22t);
89807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  return InstA();
90807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz}
91807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz
92807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertzinline uint8_t Instruction::VRegA_22x() const {
93807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  DCHECK_EQ(FormatOf(Opcode()), k22x);
94807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  return InstAA();
95807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz}
96807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz
97807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertzinline uint8_t Instruction::VRegA_23x() const {
98807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  DCHECK_EQ(FormatOf(Opcode()), k23x);
99807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  return InstAA();
100807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz}
101807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz
102807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertzinline int32_t Instruction::VRegA_30t() const {
103807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  DCHECK_EQ(FormatOf(Opcode()), k30t);
104807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  return static_cast<int32_t>(Fetch32(1));
105807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz}
106807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz
107807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertzinline uint8_t Instruction::VRegA_31c() const {
108807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  DCHECK_EQ(FormatOf(Opcode()), k31c);
109807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  return InstAA();
110807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz}
111807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz
112807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertzinline uint8_t Instruction::VRegA_31i() const {
113807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  DCHECK_EQ(FormatOf(Opcode()), k31i);
114807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  return InstAA();
115807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz}
116807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz
117807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertzinline uint8_t Instruction::VRegA_31t() const {
118807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  DCHECK_EQ(FormatOf(Opcode()), k31t);
119807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  return InstAA();
120807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz}
121807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz
122807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertzinline uint16_t Instruction::VRegA_32x() const {
123807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  DCHECK_EQ(FormatOf(Opcode()), k32x);
124807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  return Fetch16(1);
125807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz}
126807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz
127807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertzinline uint4_t Instruction::VRegA_35c() const {
128807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  DCHECK_EQ(FormatOf(Opcode()), k35c);
129807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  return InstB(); // This is labeled A in the spec.
130807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz}
131807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz
132807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertzinline uint8_t Instruction::VRegA_3rc() const {
133807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  DCHECK_EQ(FormatOf(Opcode()), k3rc);
134807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  return InstAA();
135807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz}
136807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz
137807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertzinline uint8_t Instruction::VRegA_51l() const {
138807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  DCHECK_EQ(FormatOf(Opcode()), k51l);
139807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  return InstAA();
140807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz}
141807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz
142807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz//------------------------------------------------------------------------------
143807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz// VRegB
144807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz//------------------------------------------------------------------------------
145807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertzinline int4_t Instruction::VRegB_11n() const {
146807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  DCHECK_EQ(FormatOf(Opcode()), k11n);
147807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  return static_cast<int4_t>((InstB() << 28) >> 28);
148807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz}
149807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz
150807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertzinline uint4_t Instruction::VRegB_12x() const {
151807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  DCHECK_EQ(FormatOf(Opcode()), k12x);
152807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  return InstB();
153807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz}
154807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz
155807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertzinline uint16_t Instruction::VRegB_21c() const {
156807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  DCHECK_EQ(FormatOf(Opcode()), k21c);
157807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  return Fetch16(1);
158807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz}
159807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz
160807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertzinline uint16_t Instruction::VRegB_21h() const {
161807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  DCHECK_EQ(FormatOf(Opcode()), k21h);
162807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  return Fetch16(1);
163807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz}
164807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz
165807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertzinline int16_t Instruction::VRegB_21s() const {
166807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  DCHECK_EQ(FormatOf(Opcode()), k21s);
167807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  return static_cast<int16_t>(Fetch16(1));
168807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz}
169807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz
170807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertzinline int16_t Instruction::VRegB_21t() const {
171807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  DCHECK_EQ(FormatOf(Opcode()), k21t);
172807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  return static_cast<int16_t>(Fetch16(1));
173807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz}
174807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz
175807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertzinline uint8_t Instruction::VRegB_22b() const {
176807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  DCHECK_EQ(FormatOf(Opcode()), k22b);
177807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  return static_cast<uint8_t>(Fetch16(1) & 0xff);
178807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz}
179807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz
180807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertzinline uint4_t Instruction::VRegB_22c() const {
181807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  DCHECK_EQ(FormatOf(Opcode()), k22c);
182807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  return InstB();
183807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz}
184807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz
185807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertzinline uint4_t Instruction::VRegB_22s() const {
186807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  DCHECK_EQ(FormatOf(Opcode()), k22s);
187807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  return InstB();
188807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz}
189807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz
190807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertzinline uint4_t Instruction::VRegB_22t() const {
191807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  DCHECK_EQ(FormatOf(Opcode()), k22t);
192807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  return InstB();
193807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz}
194807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz
195807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertzinline uint16_t Instruction::VRegB_22x() const {
196807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  DCHECK_EQ(FormatOf(Opcode()), k22x);
197807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  return Fetch16(1);
198807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz}
199807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz
200807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertzinline uint8_t Instruction::VRegB_23x() const {
201807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  DCHECK_EQ(FormatOf(Opcode()), k23x);
202807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  return static_cast<uint8_t>(Fetch16(1) & 0xff);
203807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz}
204807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz
205807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertzinline uint32_t Instruction::VRegB_31c() const {
206807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  DCHECK_EQ(FormatOf(Opcode()), k31c);
207807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  return Fetch32(1);
208807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz}
209807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz
210807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertzinline int32_t Instruction::VRegB_31i() const {
211807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  DCHECK_EQ(FormatOf(Opcode()), k31i);
212807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  return static_cast<int32_t>(Fetch32(1));
213807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz}
214807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz
215807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertzinline int32_t Instruction::VRegB_31t() const {
216807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  DCHECK_EQ(FormatOf(Opcode()), k31t);
217807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  return static_cast<int32_t>(Fetch32(1));
218807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz}
219807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz
220807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertzinline uint16_t Instruction::VRegB_32x() const {
221807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  DCHECK_EQ(FormatOf(Opcode()), k32x);
222807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  return Fetch16(2);
223807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz}
224807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz
225807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertzinline uint16_t Instruction::VRegB_35c() const {
226807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  DCHECK_EQ(FormatOf(Opcode()), k35c);
227807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  return Fetch16(1);
228807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz}
229807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz
230807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertzinline uint16_t Instruction::VRegB_3rc() const {
231807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  DCHECK_EQ(FormatOf(Opcode()), k3rc);
232807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  return Fetch16(1);
233807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz}
234807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz
235807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertzinline uint64_t Instruction::VRegB_51l() const {
236807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  DCHECK_EQ(FormatOf(Opcode()), k51l);
237807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  uint64_t vB_wide = Fetch32(1) | ((uint64_t) Fetch32(3) << 32);
238807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  return vB_wide;
239807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz}
240807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz
241807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz//------------------------------------------------------------------------------
242807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz// VRegC
243807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz//------------------------------------------------------------------------------
244807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertzinline int8_t Instruction::VRegC_22b() const {
245807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  DCHECK_EQ(FormatOf(Opcode()), k22b);
246807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  return static_cast<int8_t>(Fetch16(1) >> 8);
247807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz}
248807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz
249807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertzinline uint16_t Instruction::VRegC_22c() const {
250807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  DCHECK_EQ(FormatOf(Opcode()), k22c);
251807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  return Fetch16(1);
252807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz}
253807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz
254807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertzinline int16_t Instruction::VRegC_22s() const {
255807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  DCHECK_EQ(FormatOf(Opcode()), k22s);
256807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  return static_cast<int16_t>(Fetch16(1));
257807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz}
258807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz
259807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertzinline int16_t Instruction::VRegC_22t() const {
260807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  DCHECK_EQ(FormatOf(Opcode()), k22t);
261807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  return static_cast<int16_t>(Fetch16(1));
262807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz}
263807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz
264807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertzinline uint8_t Instruction::VRegC_23x() const {
265807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  DCHECK_EQ(FormatOf(Opcode()), k23x);
266807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  return static_cast<uint8_t>(Fetch16(1) >> 8);
267807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz}
268807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz
269807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertzinline uint4_t Instruction::VRegC_35c() const {
270807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  DCHECK_EQ(FormatOf(Opcode()), k35c);
271807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  return static_cast<uint4_t>(Fetch16(2) & 0x0f);
272807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz}
273807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz
274807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertzinline uint16_t Instruction::VRegC_3rc() const {
275807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  DCHECK_EQ(FormatOf(Opcode()), k3rc);
276807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  return Fetch16(2);
277807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz}
278807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz
279807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertzinline void Instruction::GetArgs(uint32_t arg[5]) const {
280807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  DCHECK_EQ(FormatOf(Opcode()), k35c);
281807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz
282807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  /*
283807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz   * Note that the fields mentioned in the spec don't appear in
284807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz   * their "usual" positions here compared to most formats. This
285807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz   * was done so that the field names for the argument count and
286807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz   * reference index match between this format and the corresponding
287807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz   * range formats (3rc and friends).
288807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz   *
289807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz   * Bottom line: The argument count is always in vA, and the
290807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz   * method constant (or equivalent) is always in vB.
291807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz   */
292807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  uint16_t regList = Fetch16(2);
293807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  uint4_t count = InstB(); // This is labeled A in the spec.
294807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz
295807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  /*
296807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz   * Copy the argument registers into the arg[] array, and
297807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz   * also copy the first argument (if any) into vC. (The
298807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz   * DecodedInstruction structure doesn't have separate
299807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz   * fields for {vD, vE, vF, vG}, so there's no need to make
300807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz   * copies of those.) Note that cases 5..2 fall through.
301807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz   */
302807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  switch (count) {
303807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz    case 5: arg[4] = InstA();
304807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz    case 4: arg[3] = (regList >> 12) & 0x0f;
305807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz    case 3: arg[2] = (regList >> 8) & 0x0f;
306807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz    case 2: arg[1] = (regList >> 4) & 0x0f;
307807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz    case 1: arg[0] = regList & 0x0f; break;
308807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz    case 0: break; // Valid, but no need to do anything.
309807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz    default:
310807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz      LOG(ERROR) << "Invalid arg count in 35c (" << count << ")";
311807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz      return;
312807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  }
313807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz}
314807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz
315807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz} // namespace art
316807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz
317807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz#endif // ART_SRC_DEX_INSTRUCTION_INL_H_
318