1*795d594fSAndroid Build Coastguard Worker /*
2*795d594fSAndroid Build Coastguard Worker * Copyright (C) 2011 The Android Open Source Project
3*795d594fSAndroid Build Coastguard Worker *
4*795d594fSAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License");
5*795d594fSAndroid Build Coastguard Worker * you may not use this file except in compliance with the License.
6*795d594fSAndroid Build Coastguard Worker * You may obtain a copy of the License at
7*795d594fSAndroid Build Coastguard Worker *
8*795d594fSAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0
9*795d594fSAndroid Build Coastguard Worker *
10*795d594fSAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software
11*795d594fSAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS,
12*795d594fSAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*795d594fSAndroid Build Coastguard Worker * See the License for the specific language governing permissions and
14*795d594fSAndroid Build Coastguard Worker * limitations under the License.
15*795d594fSAndroid Build Coastguard Worker */
16*795d594fSAndroid Build Coastguard Worker
17*795d594fSAndroid Build Coastguard Worker #ifndef ART_LIBDEXFILE_DEX_DEX_INSTRUCTION_INL_H_
18*795d594fSAndroid Build Coastguard Worker #define ART_LIBDEXFILE_DEX_DEX_INSTRUCTION_INL_H_
19*795d594fSAndroid Build Coastguard Worker
20*795d594fSAndroid Build Coastguard Worker #include "dex_instruction.h"
21*795d594fSAndroid Build Coastguard Worker
22*795d594fSAndroid Build Coastguard Worker namespace art {
23*795d594fSAndroid Build Coastguard Worker
SizeInCodeUnits(Format format)24*795d594fSAndroid Build Coastguard Worker inline constexpr size_t Instruction::SizeInCodeUnits(Format format) {
25*795d594fSAndroid Build Coastguard Worker switch (format) {
26*795d594fSAndroid Build Coastguard Worker case k10x:
27*795d594fSAndroid Build Coastguard Worker case k12x:
28*795d594fSAndroid Build Coastguard Worker case k11n:
29*795d594fSAndroid Build Coastguard Worker case k11x:
30*795d594fSAndroid Build Coastguard Worker case k10t: return 1;
31*795d594fSAndroid Build Coastguard Worker case k20t:
32*795d594fSAndroid Build Coastguard Worker case k22x:
33*795d594fSAndroid Build Coastguard Worker case k21t:
34*795d594fSAndroid Build Coastguard Worker case k21s:
35*795d594fSAndroid Build Coastguard Worker case k21h:
36*795d594fSAndroid Build Coastguard Worker case k21c:
37*795d594fSAndroid Build Coastguard Worker case k23x:
38*795d594fSAndroid Build Coastguard Worker case k22b:
39*795d594fSAndroid Build Coastguard Worker case k22t:
40*795d594fSAndroid Build Coastguard Worker case k22s:
41*795d594fSAndroid Build Coastguard Worker case k22c: return 2;
42*795d594fSAndroid Build Coastguard Worker case k32x:
43*795d594fSAndroid Build Coastguard Worker case k30t:
44*795d594fSAndroid Build Coastguard Worker case k31t:
45*795d594fSAndroid Build Coastguard Worker case k31i:
46*795d594fSAndroid Build Coastguard Worker case k31c:
47*795d594fSAndroid Build Coastguard Worker case k35c:
48*795d594fSAndroid Build Coastguard Worker case k3rc: return 3;
49*795d594fSAndroid Build Coastguard Worker case k45cc:
50*795d594fSAndroid Build Coastguard Worker case k4rcc: return 4;
51*795d594fSAndroid Build Coastguard Worker case k51l: return 5;
52*795d594fSAndroid Build Coastguard Worker case kInvalidFormat: return 0;
53*795d594fSAndroid Build Coastguard Worker }
54*795d594fSAndroid Build Coastguard Worker }
55*795d594fSAndroid Build Coastguard Worker
56*795d594fSAndroid Build Coastguard Worker //------------------------------------------------------------------------------
57*795d594fSAndroid Build Coastguard Worker // VRegA
58*795d594fSAndroid Build Coastguard Worker //------------------------------------------------------------------------------
HasVRegA()59*795d594fSAndroid Build Coastguard Worker inline bool Instruction::HasVRegA() const {
60*795d594fSAndroid Build Coastguard Worker switch (FormatOf(Opcode())) {
61*795d594fSAndroid Build Coastguard Worker case k10t: return true;
62*795d594fSAndroid Build Coastguard Worker case k10x: return true;
63*795d594fSAndroid Build Coastguard Worker case k11n: return true;
64*795d594fSAndroid Build Coastguard Worker case k11x: return true;
65*795d594fSAndroid Build Coastguard Worker case k12x: return true;
66*795d594fSAndroid Build Coastguard Worker case k20t: return true;
67*795d594fSAndroid Build Coastguard Worker case k21c: return true;
68*795d594fSAndroid Build Coastguard Worker case k21h: return true;
69*795d594fSAndroid Build Coastguard Worker case k21s: return true;
70*795d594fSAndroid Build Coastguard Worker case k21t: return true;
71*795d594fSAndroid Build Coastguard Worker case k22b: return true;
72*795d594fSAndroid Build Coastguard Worker case k22c: return true;
73*795d594fSAndroid Build Coastguard Worker case k22s: return true;
74*795d594fSAndroid Build Coastguard Worker case k22t: return true;
75*795d594fSAndroid Build Coastguard Worker case k22x: return true;
76*795d594fSAndroid Build Coastguard Worker case k23x: return true;
77*795d594fSAndroid Build Coastguard Worker case k30t: return true;
78*795d594fSAndroid Build Coastguard Worker case k31c: return true;
79*795d594fSAndroid Build Coastguard Worker case k31i: return true;
80*795d594fSAndroid Build Coastguard Worker case k31t: return true;
81*795d594fSAndroid Build Coastguard Worker case k32x: return true;
82*795d594fSAndroid Build Coastguard Worker case k35c: return true;
83*795d594fSAndroid Build Coastguard Worker case k3rc: return true;
84*795d594fSAndroid Build Coastguard Worker case k45cc: return true;
85*795d594fSAndroid Build Coastguard Worker case k4rcc: return true;
86*795d594fSAndroid Build Coastguard Worker case k51l: return true;
87*795d594fSAndroid Build Coastguard Worker default: return false;
88*795d594fSAndroid Build Coastguard Worker }
89*795d594fSAndroid Build Coastguard Worker }
90*795d594fSAndroid Build Coastguard Worker
VRegA()91*795d594fSAndroid Build Coastguard Worker inline int32_t Instruction::VRegA() const {
92*795d594fSAndroid Build Coastguard Worker return VRegA(FormatOf(Opcode()), Fetch16(0));
93*795d594fSAndroid Build Coastguard Worker }
94*795d594fSAndroid Build Coastguard Worker
VRegA(Format format,uint16_t inst_data)95*795d594fSAndroid Build Coastguard Worker inline int32_t Instruction::VRegA(Format format, uint16_t inst_data) const {
96*795d594fSAndroid Build Coastguard Worker DCHECK_EQ(format, FormatOf(Opcode()));
97*795d594fSAndroid Build Coastguard Worker switch (format) {
98*795d594fSAndroid Build Coastguard Worker case k10t: return VRegA_10t(inst_data);
99*795d594fSAndroid Build Coastguard Worker case k10x: return VRegA_10x(inst_data);
100*795d594fSAndroid Build Coastguard Worker case k11n: return VRegA_11n(inst_data);
101*795d594fSAndroid Build Coastguard Worker case k11x: return VRegA_11x(inst_data);
102*795d594fSAndroid Build Coastguard Worker case k12x: return VRegA_12x(inst_data);
103*795d594fSAndroid Build Coastguard Worker case k20t: return VRegA_20t();
104*795d594fSAndroid Build Coastguard Worker case k21c: return VRegA_21c(inst_data);
105*795d594fSAndroid Build Coastguard Worker case k21h: return VRegA_21h(inst_data);
106*795d594fSAndroid Build Coastguard Worker case k21s: return VRegA_21s(inst_data);
107*795d594fSAndroid Build Coastguard Worker case k21t: return VRegA_21t(inst_data);
108*795d594fSAndroid Build Coastguard Worker case k22b: return VRegA_22b(inst_data);
109*795d594fSAndroid Build Coastguard Worker case k22c: return VRegA_22c(inst_data);
110*795d594fSAndroid Build Coastguard Worker case k22s: return VRegA_22s(inst_data);
111*795d594fSAndroid Build Coastguard Worker case k22t: return VRegA_22t(inst_data);
112*795d594fSAndroid Build Coastguard Worker case k22x: return VRegA_22x(inst_data);
113*795d594fSAndroid Build Coastguard Worker case k23x: return VRegA_23x(inst_data);
114*795d594fSAndroid Build Coastguard Worker case k30t: return VRegA_30t();
115*795d594fSAndroid Build Coastguard Worker case k31c: return VRegA_31c(inst_data);
116*795d594fSAndroid Build Coastguard Worker case k31i: return VRegA_31i(inst_data);
117*795d594fSAndroid Build Coastguard Worker case k31t: return VRegA_31t(inst_data);
118*795d594fSAndroid Build Coastguard Worker case k32x: return VRegA_32x();
119*795d594fSAndroid Build Coastguard Worker case k35c: return VRegA_35c(inst_data);
120*795d594fSAndroid Build Coastguard Worker case k3rc: return VRegA_3rc(inst_data);
121*795d594fSAndroid Build Coastguard Worker case k45cc: return VRegA_45cc(inst_data);
122*795d594fSAndroid Build Coastguard Worker case k4rcc: return VRegA_4rcc(inst_data);
123*795d594fSAndroid Build Coastguard Worker case k51l: return VRegA_51l(inst_data);
124*795d594fSAndroid Build Coastguard Worker default:
125*795d594fSAndroid Build Coastguard Worker LOG(FATAL) << "Tried to access vA of instruction " << Name() << " which has no A operand.";
126*795d594fSAndroid Build Coastguard Worker exit(EXIT_FAILURE);
127*795d594fSAndroid Build Coastguard Worker }
128*795d594fSAndroid Build Coastguard Worker }
129*795d594fSAndroid Build Coastguard Worker
VRegA_10t(uint16_t inst_data)130*795d594fSAndroid Build Coastguard Worker inline int8_t Instruction::VRegA_10t(uint16_t inst_data) const {
131*795d594fSAndroid Build Coastguard Worker DCHECK_EQ(FormatOf(Opcode()), k10t);
132*795d594fSAndroid Build Coastguard Worker return static_cast<int8_t>(InstAA(inst_data));
133*795d594fSAndroid Build Coastguard Worker }
134*795d594fSAndroid Build Coastguard Worker
VRegA_10x(uint16_t inst_data)135*795d594fSAndroid Build Coastguard Worker inline uint8_t Instruction::VRegA_10x(uint16_t inst_data) const {
136*795d594fSAndroid Build Coastguard Worker DCHECK_EQ(FormatOf(Opcode()), k10x);
137*795d594fSAndroid Build Coastguard Worker return InstAA(inst_data);
138*795d594fSAndroid Build Coastguard Worker }
139*795d594fSAndroid Build Coastguard Worker
VRegA_11n(uint16_t inst_data)140*795d594fSAndroid Build Coastguard Worker inline uint4_t Instruction::VRegA_11n(uint16_t inst_data) const {
141*795d594fSAndroid Build Coastguard Worker DCHECK_EQ(FormatOf(Opcode()), k11n);
142*795d594fSAndroid Build Coastguard Worker return InstA(inst_data);
143*795d594fSAndroid Build Coastguard Worker }
144*795d594fSAndroid Build Coastguard Worker
VRegA_11x(uint16_t inst_data)145*795d594fSAndroid Build Coastguard Worker inline uint8_t Instruction::VRegA_11x(uint16_t inst_data) const {
146*795d594fSAndroid Build Coastguard Worker DCHECK_EQ(FormatOf(Opcode()), k11x);
147*795d594fSAndroid Build Coastguard Worker return InstAA(inst_data);
148*795d594fSAndroid Build Coastguard Worker }
149*795d594fSAndroid Build Coastguard Worker
VRegA_12x(uint16_t inst_data)150*795d594fSAndroid Build Coastguard Worker inline uint4_t Instruction::VRegA_12x(uint16_t inst_data) const {
151*795d594fSAndroid Build Coastguard Worker DCHECK_EQ(FormatOf(Opcode()), k12x);
152*795d594fSAndroid Build Coastguard Worker return InstA(inst_data);
153*795d594fSAndroid Build Coastguard Worker }
154*795d594fSAndroid Build Coastguard Worker
VRegA_20t()155*795d594fSAndroid Build Coastguard Worker inline int16_t Instruction::VRegA_20t() const {
156*795d594fSAndroid Build Coastguard Worker DCHECK_EQ(FormatOf(Opcode()), k20t);
157*795d594fSAndroid Build Coastguard Worker return static_cast<int16_t>(Fetch16(1));
158*795d594fSAndroid Build Coastguard Worker }
159*795d594fSAndroid Build Coastguard Worker
VRegA_21c(uint16_t inst_data)160*795d594fSAndroid Build Coastguard Worker inline uint8_t Instruction::VRegA_21c(uint16_t inst_data) const {
161*795d594fSAndroid Build Coastguard Worker DCHECK_EQ(FormatOf(Opcode()), k21c);
162*795d594fSAndroid Build Coastguard Worker return InstAA(inst_data);
163*795d594fSAndroid Build Coastguard Worker }
164*795d594fSAndroid Build Coastguard Worker
VRegA_21h(uint16_t inst_data)165*795d594fSAndroid Build Coastguard Worker inline uint8_t Instruction::VRegA_21h(uint16_t inst_data) const {
166*795d594fSAndroid Build Coastguard Worker DCHECK_EQ(FormatOf(Opcode()), k21h);
167*795d594fSAndroid Build Coastguard Worker return InstAA(inst_data);
168*795d594fSAndroid Build Coastguard Worker }
169*795d594fSAndroid Build Coastguard Worker
VRegA_21s(uint16_t inst_data)170*795d594fSAndroid Build Coastguard Worker inline uint8_t Instruction::VRegA_21s(uint16_t inst_data) const {
171*795d594fSAndroid Build Coastguard Worker DCHECK_EQ(FormatOf(Opcode()), k21s);
172*795d594fSAndroid Build Coastguard Worker return InstAA(inst_data);
173*795d594fSAndroid Build Coastguard Worker }
174*795d594fSAndroid Build Coastguard Worker
VRegA_21t(uint16_t inst_data)175*795d594fSAndroid Build Coastguard Worker inline uint8_t Instruction::VRegA_21t(uint16_t inst_data) const {
176*795d594fSAndroid Build Coastguard Worker DCHECK_EQ(FormatOf(Opcode()), k21t);
177*795d594fSAndroid Build Coastguard Worker return InstAA(inst_data);
178*795d594fSAndroid Build Coastguard Worker }
179*795d594fSAndroid Build Coastguard Worker
VRegA_22b(uint16_t inst_data)180*795d594fSAndroid Build Coastguard Worker inline uint8_t Instruction::VRegA_22b(uint16_t inst_data) const {
181*795d594fSAndroid Build Coastguard Worker DCHECK_EQ(FormatOf(Opcode()), k22b);
182*795d594fSAndroid Build Coastguard Worker return InstAA(inst_data);
183*795d594fSAndroid Build Coastguard Worker }
184*795d594fSAndroid Build Coastguard Worker
VRegA_22c(uint16_t inst_data)185*795d594fSAndroid Build Coastguard Worker inline uint4_t Instruction::VRegA_22c(uint16_t inst_data) const {
186*795d594fSAndroid Build Coastguard Worker DCHECK_EQ(FormatOf(Opcode()), k22c);
187*795d594fSAndroid Build Coastguard Worker return InstA(inst_data);
188*795d594fSAndroid Build Coastguard Worker }
189*795d594fSAndroid Build Coastguard Worker
VRegA_22s(uint16_t inst_data)190*795d594fSAndroid Build Coastguard Worker inline uint4_t Instruction::VRegA_22s(uint16_t inst_data) const {
191*795d594fSAndroid Build Coastguard Worker DCHECK_EQ(FormatOf(Opcode()), k22s);
192*795d594fSAndroid Build Coastguard Worker return InstA(inst_data);
193*795d594fSAndroid Build Coastguard Worker }
194*795d594fSAndroid Build Coastguard Worker
VRegA_22t(uint16_t inst_data)195*795d594fSAndroid Build Coastguard Worker inline uint4_t Instruction::VRegA_22t(uint16_t inst_data) const {
196*795d594fSAndroid Build Coastguard Worker DCHECK_EQ(FormatOf(Opcode()), k22t);
197*795d594fSAndroid Build Coastguard Worker return InstA(inst_data);
198*795d594fSAndroid Build Coastguard Worker }
199*795d594fSAndroid Build Coastguard Worker
VRegA_22x(uint16_t inst_data)200*795d594fSAndroid Build Coastguard Worker inline uint8_t Instruction::VRegA_22x(uint16_t inst_data) const {
201*795d594fSAndroid Build Coastguard Worker DCHECK_EQ(FormatOf(Opcode()), k22x);
202*795d594fSAndroid Build Coastguard Worker return InstAA(inst_data);
203*795d594fSAndroid Build Coastguard Worker }
204*795d594fSAndroid Build Coastguard Worker
VRegA_23x(uint16_t inst_data)205*795d594fSAndroid Build Coastguard Worker inline uint8_t Instruction::VRegA_23x(uint16_t inst_data) const {
206*795d594fSAndroid Build Coastguard Worker DCHECK_EQ(FormatOf(Opcode()), k23x);
207*795d594fSAndroid Build Coastguard Worker return InstAA(inst_data);
208*795d594fSAndroid Build Coastguard Worker }
209*795d594fSAndroid Build Coastguard Worker
VRegA_30t()210*795d594fSAndroid Build Coastguard Worker inline int32_t Instruction::VRegA_30t() const {
211*795d594fSAndroid Build Coastguard Worker DCHECK_EQ(FormatOf(Opcode()), k30t);
212*795d594fSAndroid Build Coastguard Worker return static_cast<int32_t>(Fetch32(1));
213*795d594fSAndroid Build Coastguard Worker }
214*795d594fSAndroid Build Coastguard Worker
VRegA_31c(uint16_t inst_data)215*795d594fSAndroid Build Coastguard Worker inline uint8_t Instruction::VRegA_31c(uint16_t inst_data) const {
216*795d594fSAndroid Build Coastguard Worker DCHECK_EQ(FormatOf(Opcode()), k31c);
217*795d594fSAndroid Build Coastguard Worker return InstAA(inst_data);
218*795d594fSAndroid Build Coastguard Worker }
219*795d594fSAndroid Build Coastguard Worker
VRegA_31i(uint16_t inst_data)220*795d594fSAndroid Build Coastguard Worker inline uint8_t Instruction::VRegA_31i(uint16_t inst_data) const {
221*795d594fSAndroid Build Coastguard Worker DCHECK_EQ(FormatOf(Opcode()), k31i);
222*795d594fSAndroid Build Coastguard Worker return InstAA(inst_data);
223*795d594fSAndroid Build Coastguard Worker }
224*795d594fSAndroid Build Coastguard Worker
VRegA_31t(uint16_t inst_data)225*795d594fSAndroid Build Coastguard Worker inline uint8_t Instruction::VRegA_31t(uint16_t inst_data) const {
226*795d594fSAndroid Build Coastguard Worker DCHECK_EQ(FormatOf(Opcode()), k31t);
227*795d594fSAndroid Build Coastguard Worker return InstAA(inst_data);
228*795d594fSAndroid Build Coastguard Worker }
229*795d594fSAndroid Build Coastguard Worker
VRegA_32x()230*795d594fSAndroid Build Coastguard Worker inline uint16_t Instruction::VRegA_32x() const {
231*795d594fSAndroid Build Coastguard Worker DCHECK_EQ(FormatOf(Opcode()), k32x);
232*795d594fSAndroid Build Coastguard Worker return Fetch16(1);
233*795d594fSAndroid Build Coastguard Worker }
234*795d594fSAndroid Build Coastguard Worker
VRegA_35c(uint16_t inst_data)235*795d594fSAndroid Build Coastguard Worker inline uint4_t Instruction::VRegA_35c(uint16_t inst_data) const {
236*795d594fSAndroid Build Coastguard Worker DCHECK_EQ(FormatOf(Opcode()), k35c);
237*795d594fSAndroid Build Coastguard Worker return InstB(inst_data); // This is labeled A in the spec.
238*795d594fSAndroid Build Coastguard Worker }
239*795d594fSAndroid Build Coastguard Worker
VRegA_3rc(uint16_t inst_data)240*795d594fSAndroid Build Coastguard Worker inline uint8_t Instruction::VRegA_3rc(uint16_t inst_data) const {
241*795d594fSAndroid Build Coastguard Worker DCHECK_EQ(FormatOf(Opcode()), k3rc);
242*795d594fSAndroid Build Coastguard Worker return InstAA(inst_data);
243*795d594fSAndroid Build Coastguard Worker }
244*795d594fSAndroid Build Coastguard Worker
VRegA_51l(uint16_t inst_data)245*795d594fSAndroid Build Coastguard Worker inline uint8_t Instruction::VRegA_51l(uint16_t inst_data) const {
246*795d594fSAndroid Build Coastguard Worker DCHECK_EQ(FormatOf(Opcode()), k51l);
247*795d594fSAndroid Build Coastguard Worker return InstAA(inst_data);
248*795d594fSAndroid Build Coastguard Worker }
249*795d594fSAndroid Build Coastguard Worker
VRegA_45cc(uint16_t inst_data)250*795d594fSAndroid Build Coastguard Worker inline uint4_t Instruction::VRegA_45cc(uint16_t inst_data) const {
251*795d594fSAndroid Build Coastguard Worker DCHECK_EQ(FormatOf(Opcode()), k45cc);
252*795d594fSAndroid Build Coastguard Worker return InstB(inst_data); // This is labeled A in the spec.
253*795d594fSAndroid Build Coastguard Worker }
254*795d594fSAndroid Build Coastguard Worker
VRegA_4rcc(uint16_t inst_data)255*795d594fSAndroid Build Coastguard Worker inline uint8_t Instruction::VRegA_4rcc(uint16_t inst_data) const {
256*795d594fSAndroid Build Coastguard Worker DCHECK_EQ(FormatOf(Opcode()), k4rcc);
257*795d594fSAndroid Build Coastguard Worker return InstAA(inst_data);
258*795d594fSAndroid Build Coastguard Worker }
259*795d594fSAndroid Build Coastguard Worker
260*795d594fSAndroid Build Coastguard Worker //------------------------------------------------------------------------------
261*795d594fSAndroid Build Coastguard Worker // VRegB
262*795d594fSAndroid Build Coastguard Worker //------------------------------------------------------------------------------
HasVRegB()263*795d594fSAndroid Build Coastguard Worker inline bool Instruction::HasVRegB() const {
264*795d594fSAndroid Build Coastguard Worker switch (FormatOf(Opcode())) {
265*795d594fSAndroid Build Coastguard Worker case k11n: return true;
266*795d594fSAndroid Build Coastguard Worker case k12x: return true;
267*795d594fSAndroid Build Coastguard Worker case k21c: return true;
268*795d594fSAndroid Build Coastguard Worker case k21h: return true;
269*795d594fSAndroid Build Coastguard Worker case k21s: return true;
270*795d594fSAndroid Build Coastguard Worker case k21t: return true;
271*795d594fSAndroid Build Coastguard Worker case k22b: return true;
272*795d594fSAndroid Build Coastguard Worker case k22c: return true;
273*795d594fSAndroid Build Coastguard Worker case k22s: return true;
274*795d594fSAndroid Build Coastguard Worker case k22t: return true;
275*795d594fSAndroid Build Coastguard Worker case k22x: return true;
276*795d594fSAndroid Build Coastguard Worker case k23x: return true;
277*795d594fSAndroid Build Coastguard Worker case k31c: return true;
278*795d594fSAndroid Build Coastguard Worker case k31i: return true;
279*795d594fSAndroid Build Coastguard Worker case k31t: return true;
280*795d594fSAndroid Build Coastguard Worker case k32x: return true;
281*795d594fSAndroid Build Coastguard Worker case k35c: return true;
282*795d594fSAndroid Build Coastguard Worker case k3rc: return true;
283*795d594fSAndroid Build Coastguard Worker case k45cc: return true;
284*795d594fSAndroid Build Coastguard Worker case k4rcc: return true;
285*795d594fSAndroid Build Coastguard Worker case k51l: return true;
286*795d594fSAndroid Build Coastguard Worker default: return false;
287*795d594fSAndroid Build Coastguard Worker }
288*795d594fSAndroid Build Coastguard Worker }
289*795d594fSAndroid Build Coastguard Worker
HasWideVRegB()290*795d594fSAndroid Build Coastguard Worker inline bool Instruction::HasWideVRegB() const {
291*795d594fSAndroid Build Coastguard Worker return FormatOf(Opcode()) == k51l;
292*795d594fSAndroid Build Coastguard Worker }
293*795d594fSAndroid Build Coastguard Worker
VRegB()294*795d594fSAndroid Build Coastguard Worker inline int32_t Instruction::VRegB() const {
295*795d594fSAndroid Build Coastguard Worker return VRegB(FormatOf(Opcode()), Fetch16(0));
296*795d594fSAndroid Build Coastguard Worker }
297*795d594fSAndroid Build Coastguard Worker
VRegB(Format format,uint16_t inst_data)298*795d594fSAndroid Build Coastguard Worker inline int32_t Instruction::VRegB(Format format, uint16_t inst_data) const {
299*795d594fSAndroid Build Coastguard Worker DCHECK_EQ(format, FormatOf(Opcode()));
300*795d594fSAndroid Build Coastguard Worker switch (format) {
301*795d594fSAndroid Build Coastguard Worker case k11n: return VRegB_11n(inst_data);
302*795d594fSAndroid Build Coastguard Worker case k12x: return VRegB_12x(inst_data);
303*795d594fSAndroid Build Coastguard Worker case k21c: return VRegB_21c();
304*795d594fSAndroid Build Coastguard Worker case k21h: return VRegB_21h();
305*795d594fSAndroid Build Coastguard Worker case k21s: return VRegB_21s();
306*795d594fSAndroid Build Coastguard Worker case k21t: return VRegB_21t();
307*795d594fSAndroid Build Coastguard Worker case k22b: return VRegB_22b();
308*795d594fSAndroid Build Coastguard Worker case k22c: return VRegB_22c(inst_data);
309*795d594fSAndroid Build Coastguard Worker case k22s: return VRegB_22s(inst_data);
310*795d594fSAndroid Build Coastguard Worker case k22t: return VRegB_22t(inst_data);
311*795d594fSAndroid Build Coastguard Worker case k22x: return VRegB_22x();
312*795d594fSAndroid Build Coastguard Worker case k23x: return VRegB_23x();
313*795d594fSAndroid Build Coastguard Worker case k31c: return VRegB_31c();
314*795d594fSAndroid Build Coastguard Worker case k31i: return VRegB_31i();
315*795d594fSAndroid Build Coastguard Worker case k31t: return VRegB_31t();
316*795d594fSAndroid Build Coastguard Worker case k32x: return VRegB_32x();
317*795d594fSAndroid Build Coastguard Worker case k35c: return VRegB_35c();
318*795d594fSAndroid Build Coastguard Worker case k3rc: return VRegB_3rc();
319*795d594fSAndroid Build Coastguard Worker case k45cc: return VRegB_45cc();
320*795d594fSAndroid Build Coastguard Worker case k4rcc: return VRegB_4rcc();
321*795d594fSAndroid Build Coastguard Worker case k51l: return VRegB_51l();
322*795d594fSAndroid Build Coastguard Worker default:
323*795d594fSAndroid Build Coastguard Worker LOG(FATAL) << "Tried to access vB of instruction " << Name() << " which has no B operand.";
324*795d594fSAndroid Build Coastguard Worker exit(EXIT_FAILURE);
325*795d594fSAndroid Build Coastguard Worker }
326*795d594fSAndroid Build Coastguard Worker }
327*795d594fSAndroid Build Coastguard Worker
WideVRegB()328*795d594fSAndroid Build Coastguard Worker inline uint64_t Instruction::WideVRegB() const {
329*795d594fSAndroid Build Coastguard Worker return VRegB_51l();
330*795d594fSAndroid Build Coastguard Worker }
331*795d594fSAndroid Build Coastguard Worker
VRegB_11n(uint16_t inst_data)332*795d594fSAndroid Build Coastguard Worker inline int4_t Instruction::VRegB_11n(uint16_t inst_data) const {
333*795d594fSAndroid Build Coastguard Worker DCHECK_EQ(FormatOf(Opcode()), k11n);
334*795d594fSAndroid Build Coastguard Worker return static_cast<int4_t>((InstB(inst_data) << 28) >> 28);
335*795d594fSAndroid Build Coastguard Worker }
336*795d594fSAndroid Build Coastguard Worker
VRegB_12x(uint16_t inst_data)337*795d594fSAndroid Build Coastguard Worker inline uint4_t Instruction::VRegB_12x(uint16_t inst_data) const {
338*795d594fSAndroid Build Coastguard Worker DCHECK_EQ(FormatOf(Opcode()), k12x);
339*795d594fSAndroid Build Coastguard Worker return InstB(inst_data);
340*795d594fSAndroid Build Coastguard Worker }
341*795d594fSAndroid Build Coastguard Worker
VRegB_21c()342*795d594fSAndroid Build Coastguard Worker inline uint16_t Instruction::VRegB_21c() const {
343*795d594fSAndroid Build Coastguard Worker DCHECK_EQ(FormatOf(Opcode()), k21c);
344*795d594fSAndroid Build Coastguard Worker return Fetch16(1);
345*795d594fSAndroid Build Coastguard Worker }
346*795d594fSAndroid Build Coastguard Worker
VRegB_21h()347*795d594fSAndroid Build Coastguard Worker inline uint16_t Instruction::VRegB_21h() const {
348*795d594fSAndroid Build Coastguard Worker DCHECK_EQ(FormatOf(Opcode()), k21h);
349*795d594fSAndroid Build Coastguard Worker return Fetch16(1);
350*795d594fSAndroid Build Coastguard Worker }
351*795d594fSAndroid Build Coastguard Worker
VRegB_21s()352*795d594fSAndroid Build Coastguard Worker inline int16_t Instruction::VRegB_21s() const {
353*795d594fSAndroid Build Coastguard Worker DCHECK_EQ(FormatOf(Opcode()), k21s);
354*795d594fSAndroid Build Coastguard Worker return static_cast<int16_t>(Fetch16(1));
355*795d594fSAndroid Build Coastguard Worker }
356*795d594fSAndroid Build Coastguard Worker
VRegB_21t()357*795d594fSAndroid Build Coastguard Worker inline int16_t Instruction::VRegB_21t() const {
358*795d594fSAndroid Build Coastguard Worker DCHECK_EQ(FormatOf(Opcode()), k21t);
359*795d594fSAndroid Build Coastguard Worker return static_cast<int16_t>(Fetch16(1));
360*795d594fSAndroid Build Coastguard Worker }
361*795d594fSAndroid Build Coastguard Worker
VRegB_22b()362*795d594fSAndroid Build Coastguard Worker inline uint8_t Instruction::VRegB_22b() const {
363*795d594fSAndroid Build Coastguard Worker DCHECK_EQ(FormatOf(Opcode()), k22b);
364*795d594fSAndroid Build Coastguard Worker return static_cast<uint8_t>(Fetch16(1) & 0xff);
365*795d594fSAndroid Build Coastguard Worker }
366*795d594fSAndroid Build Coastguard Worker
VRegB_22c(uint16_t inst_data)367*795d594fSAndroid Build Coastguard Worker inline uint4_t Instruction::VRegB_22c(uint16_t inst_data) const {
368*795d594fSAndroid Build Coastguard Worker DCHECK_EQ(FormatOf(Opcode()), k22c);
369*795d594fSAndroid Build Coastguard Worker return InstB(inst_data);
370*795d594fSAndroid Build Coastguard Worker }
371*795d594fSAndroid Build Coastguard Worker
VRegB_22s(uint16_t inst_data)372*795d594fSAndroid Build Coastguard Worker inline uint4_t Instruction::VRegB_22s(uint16_t inst_data) const {
373*795d594fSAndroid Build Coastguard Worker DCHECK_EQ(FormatOf(Opcode()), k22s);
374*795d594fSAndroid Build Coastguard Worker return InstB(inst_data);
375*795d594fSAndroid Build Coastguard Worker }
376*795d594fSAndroid Build Coastguard Worker
VRegB_22t(uint16_t inst_data)377*795d594fSAndroid Build Coastguard Worker inline uint4_t Instruction::VRegB_22t(uint16_t inst_data) const {
378*795d594fSAndroid Build Coastguard Worker DCHECK_EQ(FormatOf(Opcode()), k22t);
379*795d594fSAndroid Build Coastguard Worker return InstB(inst_data);
380*795d594fSAndroid Build Coastguard Worker }
381*795d594fSAndroid Build Coastguard Worker
VRegB_22x()382*795d594fSAndroid Build Coastguard Worker inline uint16_t Instruction::VRegB_22x() const {
383*795d594fSAndroid Build Coastguard Worker DCHECK_EQ(FormatOf(Opcode()), k22x);
384*795d594fSAndroid Build Coastguard Worker return Fetch16(1);
385*795d594fSAndroid Build Coastguard Worker }
386*795d594fSAndroid Build Coastguard Worker
VRegB_23x()387*795d594fSAndroid Build Coastguard Worker inline uint8_t Instruction::VRegB_23x() const {
388*795d594fSAndroid Build Coastguard Worker DCHECK_EQ(FormatOf(Opcode()), k23x);
389*795d594fSAndroid Build Coastguard Worker return static_cast<uint8_t>(Fetch16(1) & 0xff);
390*795d594fSAndroid Build Coastguard Worker }
391*795d594fSAndroid Build Coastguard Worker
VRegB_31c()392*795d594fSAndroid Build Coastguard Worker inline uint32_t Instruction::VRegB_31c() const {
393*795d594fSAndroid Build Coastguard Worker DCHECK_EQ(FormatOf(Opcode()), k31c);
394*795d594fSAndroid Build Coastguard Worker return Fetch32(1);
395*795d594fSAndroid Build Coastguard Worker }
396*795d594fSAndroid Build Coastguard Worker
VRegB_31i()397*795d594fSAndroid Build Coastguard Worker inline int32_t Instruction::VRegB_31i() const {
398*795d594fSAndroid Build Coastguard Worker DCHECK_EQ(FormatOf(Opcode()), k31i);
399*795d594fSAndroid Build Coastguard Worker return static_cast<int32_t>(Fetch32(1));
400*795d594fSAndroid Build Coastguard Worker }
401*795d594fSAndroid Build Coastguard Worker
VRegB_31t()402*795d594fSAndroid Build Coastguard Worker inline int32_t Instruction::VRegB_31t() const {
403*795d594fSAndroid Build Coastguard Worker DCHECK_EQ(FormatOf(Opcode()), k31t);
404*795d594fSAndroid Build Coastguard Worker return static_cast<int32_t>(Fetch32(1));
405*795d594fSAndroid Build Coastguard Worker }
406*795d594fSAndroid Build Coastguard Worker
VRegB_32x()407*795d594fSAndroid Build Coastguard Worker inline uint16_t Instruction::VRegB_32x() const {
408*795d594fSAndroid Build Coastguard Worker DCHECK_EQ(FormatOf(Opcode()), k32x);
409*795d594fSAndroid Build Coastguard Worker return Fetch16(2);
410*795d594fSAndroid Build Coastguard Worker }
411*795d594fSAndroid Build Coastguard Worker
VRegB_35c()412*795d594fSAndroid Build Coastguard Worker inline uint16_t Instruction::VRegB_35c() const {
413*795d594fSAndroid Build Coastguard Worker DCHECK_EQ(FormatOf(Opcode()), k35c);
414*795d594fSAndroid Build Coastguard Worker return Fetch16(1);
415*795d594fSAndroid Build Coastguard Worker }
416*795d594fSAndroid Build Coastguard Worker
VRegB_3rc()417*795d594fSAndroid Build Coastguard Worker inline uint16_t Instruction::VRegB_3rc() const {
418*795d594fSAndroid Build Coastguard Worker DCHECK_EQ(FormatOf(Opcode()), k3rc);
419*795d594fSAndroid Build Coastguard Worker return Fetch16(1);
420*795d594fSAndroid Build Coastguard Worker }
421*795d594fSAndroid Build Coastguard Worker
VRegB_45cc()422*795d594fSAndroid Build Coastguard Worker inline uint16_t Instruction::VRegB_45cc() const {
423*795d594fSAndroid Build Coastguard Worker DCHECK_EQ(FormatOf(Opcode()), k45cc);
424*795d594fSAndroid Build Coastguard Worker return Fetch16(1);
425*795d594fSAndroid Build Coastguard Worker }
426*795d594fSAndroid Build Coastguard Worker
VRegB_4rcc()427*795d594fSAndroid Build Coastguard Worker inline uint16_t Instruction::VRegB_4rcc() const {
428*795d594fSAndroid Build Coastguard Worker DCHECK_EQ(FormatOf(Opcode()), k4rcc);
429*795d594fSAndroid Build Coastguard Worker return Fetch16(1);
430*795d594fSAndroid Build Coastguard Worker }
431*795d594fSAndroid Build Coastguard Worker
VRegB_51l()432*795d594fSAndroid Build Coastguard Worker inline uint64_t Instruction::VRegB_51l() const {
433*795d594fSAndroid Build Coastguard Worker DCHECK_EQ(FormatOf(Opcode()), k51l);
434*795d594fSAndroid Build Coastguard Worker uint64_t vB_wide = Fetch32(1) | ((uint64_t) Fetch32(3) << 32);
435*795d594fSAndroid Build Coastguard Worker return vB_wide;
436*795d594fSAndroid Build Coastguard Worker }
437*795d594fSAndroid Build Coastguard Worker
438*795d594fSAndroid Build Coastguard Worker //------------------------------------------------------------------------------
439*795d594fSAndroid Build Coastguard Worker // VRegC
440*795d594fSAndroid Build Coastguard Worker //------------------------------------------------------------------------------
HasVRegC()441*795d594fSAndroid Build Coastguard Worker inline bool Instruction::HasVRegC() const {
442*795d594fSAndroid Build Coastguard Worker switch (FormatOf(Opcode())) {
443*795d594fSAndroid Build Coastguard Worker case k22b: return true;
444*795d594fSAndroid Build Coastguard Worker case k22c: return true;
445*795d594fSAndroid Build Coastguard Worker case k22s: return true;
446*795d594fSAndroid Build Coastguard Worker case k22t: return true;
447*795d594fSAndroid Build Coastguard Worker case k23x: return true;
448*795d594fSAndroid Build Coastguard Worker case k35c: return true;
449*795d594fSAndroid Build Coastguard Worker case k3rc: return true;
450*795d594fSAndroid Build Coastguard Worker case k45cc: return true;
451*795d594fSAndroid Build Coastguard Worker case k4rcc: return true;
452*795d594fSAndroid Build Coastguard Worker default: return false;
453*795d594fSAndroid Build Coastguard Worker }
454*795d594fSAndroid Build Coastguard Worker }
455*795d594fSAndroid Build Coastguard Worker
VRegC()456*795d594fSAndroid Build Coastguard Worker inline int32_t Instruction::VRegC() const {
457*795d594fSAndroid Build Coastguard Worker return VRegC(FormatOf(Opcode()));
458*795d594fSAndroid Build Coastguard Worker }
459*795d594fSAndroid Build Coastguard Worker
VRegC(Format format)460*795d594fSAndroid Build Coastguard Worker inline int32_t Instruction::VRegC(Format format) const {
461*795d594fSAndroid Build Coastguard Worker DCHECK_EQ(format, FormatOf(Opcode()));
462*795d594fSAndroid Build Coastguard Worker switch (format) {
463*795d594fSAndroid Build Coastguard Worker case k22b: return VRegC_22b();
464*795d594fSAndroid Build Coastguard Worker case k22c: return VRegC_22c();
465*795d594fSAndroid Build Coastguard Worker case k22s: return VRegC_22s();
466*795d594fSAndroid Build Coastguard Worker case k22t: return VRegC_22t();
467*795d594fSAndroid Build Coastguard Worker case k23x: return VRegC_23x();
468*795d594fSAndroid Build Coastguard Worker case k35c: return VRegC_35c();
469*795d594fSAndroid Build Coastguard Worker case k3rc: return VRegC_3rc();
470*795d594fSAndroid Build Coastguard Worker case k45cc: return VRegC_45cc();
471*795d594fSAndroid Build Coastguard Worker case k4rcc: return VRegC_4rcc();
472*795d594fSAndroid Build Coastguard Worker default:
473*795d594fSAndroid Build Coastguard Worker LOG(FATAL) << "Tried to access vC of instruction " << Name() << " which has no C operand.";
474*795d594fSAndroid Build Coastguard Worker exit(EXIT_FAILURE);
475*795d594fSAndroid Build Coastguard Worker }
476*795d594fSAndroid Build Coastguard Worker }
477*795d594fSAndroid Build Coastguard Worker
VRegC_22b()478*795d594fSAndroid Build Coastguard Worker inline int8_t Instruction::VRegC_22b() const {
479*795d594fSAndroid Build Coastguard Worker DCHECK_EQ(FormatOf(Opcode()), k22b);
480*795d594fSAndroid Build Coastguard Worker return static_cast<int8_t>(Fetch16(1) >> 8);
481*795d594fSAndroid Build Coastguard Worker }
482*795d594fSAndroid Build Coastguard Worker
VRegC_22c()483*795d594fSAndroid Build Coastguard Worker inline uint16_t Instruction::VRegC_22c() const {
484*795d594fSAndroid Build Coastguard Worker DCHECK_EQ(FormatOf(Opcode()), k22c);
485*795d594fSAndroid Build Coastguard Worker return Fetch16(1);
486*795d594fSAndroid Build Coastguard Worker }
487*795d594fSAndroid Build Coastguard Worker
VRegC_22s()488*795d594fSAndroid Build Coastguard Worker inline int16_t Instruction::VRegC_22s() const {
489*795d594fSAndroid Build Coastguard Worker DCHECK_EQ(FormatOf(Opcode()), k22s);
490*795d594fSAndroid Build Coastguard Worker return static_cast<int16_t>(Fetch16(1));
491*795d594fSAndroid Build Coastguard Worker }
492*795d594fSAndroid Build Coastguard Worker
VRegC_22t()493*795d594fSAndroid Build Coastguard Worker inline int16_t Instruction::VRegC_22t() const {
494*795d594fSAndroid Build Coastguard Worker DCHECK_EQ(FormatOf(Opcode()), k22t);
495*795d594fSAndroid Build Coastguard Worker return static_cast<int16_t>(Fetch16(1));
496*795d594fSAndroid Build Coastguard Worker }
497*795d594fSAndroid Build Coastguard Worker
VRegC_23x()498*795d594fSAndroid Build Coastguard Worker inline uint8_t Instruction::VRegC_23x() const {
499*795d594fSAndroid Build Coastguard Worker DCHECK_EQ(FormatOf(Opcode()), k23x);
500*795d594fSAndroid Build Coastguard Worker return static_cast<uint8_t>(Fetch16(1) >> 8);
501*795d594fSAndroid Build Coastguard Worker }
502*795d594fSAndroid Build Coastguard Worker
VRegC_35c()503*795d594fSAndroid Build Coastguard Worker inline uint4_t Instruction::VRegC_35c() const {
504*795d594fSAndroid Build Coastguard Worker DCHECK_EQ(FormatOf(Opcode()), k35c);
505*795d594fSAndroid Build Coastguard Worker return static_cast<uint4_t>(Fetch16(2) & 0x0f);
506*795d594fSAndroid Build Coastguard Worker }
507*795d594fSAndroid Build Coastguard Worker
VRegC_3rc()508*795d594fSAndroid Build Coastguard Worker inline uint16_t Instruction::VRegC_3rc() const {
509*795d594fSAndroid Build Coastguard Worker DCHECK_EQ(FormatOf(Opcode()), k3rc);
510*795d594fSAndroid Build Coastguard Worker return Fetch16(2);
511*795d594fSAndroid Build Coastguard Worker }
512*795d594fSAndroid Build Coastguard Worker
VRegC_45cc()513*795d594fSAndroid Build Coastguard Worker inline uint4_t Instruction::VRegC_45cc() const {
514*795d594fSAndroid Build Coastguard Worker DCHECK_EQ(FormatOf(Opcode()), k45cc);
515*795d594fSAndroid Build Coastguard Worker return static_cast<uint4_t>(Fetch16(2) & 0x0f);
516*795d594fSAndroid Build Coastguard Worker }
517*795d594fSAndroid Build Coastguard Worker
VRegC_4rcc()518*795d594fSAndroid Build Coastguard Worker inline uint16_t Instruction::VRegC_4rcc() const {
519*795d594fSAndroid Build Coastguard Worker DCHECK_EQ(FormatOf(Opcode()), k4rcc);
520*795d594fSAndroid Build Coastguard Worker return Fetch16(2);
521*795d594fSAndroid Build Coastguard Worker }
522*795d594fSAndroid Build Coastguard Worker
523*795d594fSAndroid Build Coastguard Worker //------------------------------------------------------------------------------
524*795d594fSAndroid Build Coastguard Worker // VRegH
525*795d594fSAndroid Build Coastguard Worker //------------------------------------------------------------------------------
HasVRegH()526*795d594fSAndroid Build Coastguard Worker inline bool Instruction::HasVRegH() const {
527*795d594fSAndroid Build Coastguard Worker switch (FormatOf(Opcode())) {
528*795d594fSAndroid Build Coastguard Worker case k45cc: return true;
529*795d594fSAndroid Build Coastguard Worker case k4rcc: return true;
530*795d594fSAndroid Build Coastguard Worker default : return false;
531*795d594fSAndroid Build Coastguard Worker }
532*795d594fSAndroid Build Coastguard Worker }
533*795d594fSAndroid Build Coastguard Worker
VRegH()534*795d594fSAndroid Build Coastguard Worker inline int32_t Instruction::VRegH() const {
535*795d594fSAndroid Build Coastguard Worker return VRegH(FormatOf(Opcode()));
536*795d594fSAndroid Build Coastguard Worker }
537*795d594fSAndroid Build Coastguard Worker
VRegH(Format format)538*795d594fSAndroid Build Coastguard Worker inline int32_t Instruction::VRegH(Format format) const {
539*795d594fSAndroid Build Coastguard Worker DCHECK_EQ(format, FormatOf(Opcode()));
540*795d594fSAndroid Build Coastguard Worker switch (format) {
541*795d594fSAndroid Build Coastguard Worker case k45cc: return VRegH_45cc();
542*795d594fSAndroid Build Coastguard Worker case k4rcc: return VRegH_4rcc();
543*795d594fSAndroid Build Coastguard Worker default :
544*795d594fSAndroid Build Coastguard Worker LOG(FATAL) << "Tried to access vH of instruction " << Name() << " which has no H operand.";
545*795d594fSAndroid Build Coastguard Worker exit(EXIT_FAILURE);
546*795d594fSAndroid Build Coastguard Worker }
547*795d594fSAndroid Build Coastguard Worker }
548*795d594fSAndroid Build Coastguard Worker
VRegH_45cc()549*795d594fSAndroid Build Coastguard Worker inline uint16_t Instruction::VRegH_45cc() const {
550*795d594fSAndroid Build Coastguard Worker DCHECK_EQ(FormatOf(Opcode()), k45cc);
551*795d594fSAndroid Build Coastguard Worker return Fetch16(3);
552*795d594fSAndroid Build Coastguard Worker }
553*795d594fSAndroid Build Coastguard Worker
VRegH_4rcc()554*795d594fSAndroid Build Coastguard Worker inline uint16_t Instruction::VRegH_4rcc() const {
555*795d594fSAndroid Build Coastguard Worker DCHECK_EQ(FormatOf(Opcode()), k4rcc);
556*795d594fSAndroid Build Coastguard Worker return Fetch16(3);
557*795d594fSAndroid Build Coastguard Worker }
558*795d594fSAndroid Build Coastguard Worker
HasVarArgs()559*795d594fSAndroid Build Coastguard Worker inline bool Instruction::HasVarArgs() const {
560*795d594fSAndroid Build Coastguard Worker return (FormatOf(Opcode()) == k35c) || (FormatOf(Opcode()) == k45cc);
561*795d594fSAndroid Build Coastguard Worker }
562*795d594fSAndroid Build Coastguard Worker
GetVarArgs(uint32_t arg[kMaxVarArgRegs],uint16_t inst_data)563*795d594fSAndroid Build Coastguard Worker inline uint32_t Instruction::GetVarArgs(uint32_t arg[kMaxVarArgRegs], uint16_t inst_data) const {
564*795d594fSAndroid Build Coastguard Worker DCHECK(HasVarArgs());
565*795d594fSAndroid Build Coastguard Worker
566*795d594fSAndroid Build Coastguard Worker /*
567*795d594fSAndroid Build Coastguard Worker * Note that the fields mentioned in the spec don't appear in
568*795d594fSAndroid Build Coastguard Worker * their "usual" positions here compared to most formats. This
569*795d594fSAndroid Build Coastguard Worker * was done so that the field names for the argument count and
570*795d594fSAndroid Build Coastguard Worker * reference index match between this format and the corresponding
571*795d594fSAndroid Build Coastguard Worker * range formats (3rc and friends).
572*795d594fSAndroid Build Coastguard Worker *
573*795d594fSAndroid Build Coastguard Worker * Bottom line: The argument count is always in vA, and the
574*795d594fSAndroid Build Coastguard Worker * method constant (or equivalent) is always in vB.
575*795d594fSAndroid Build Coastguard Worker */
576*795d594fSAndroid Build Coastguard Worker uint16_t regList = Fetch16(2);
577*795d594fSAndroid Build Coastguard Worker uint4_t count = InstB(inst_data); // This is labeled A in the spec.
578*795d594fSAndroid Build Coastguard Worker DCHECK_LE(count, 5U) << "Invalid arg count in 35c (" << count << ")";
579*795d594fSAndroid Build Coastguard Worker
580*795d594fSAndroid Build Coastguard Worker /*
581*795d594fSAndroid Build Coastguard Worker * Copy the argument registers into the arg[] array, and
582*795d594fSAndroid Build Coastguard Worker * also copy the first argument (if any) into vC. (The
583*795d594fSAndroid Build Coastguard Worker * DecodedInstruction structure doesn't have separate
584*795d594fSAndroid Build Coastguard Worker * fields for {vD, vE, vF, vG}, so there's no need to make
585*795d594fSAndroid Build Coastguard Worker * copies of those.) Note that cases 5..2 fall through.
586*795d594fSAndroid Build Coastguard Worker */
587*795d594fSAndroid Build Coastguard Worker switch (count) {
588*795d594fSAndroid Build Coastguard Worker case 5:
589*795d594fSAndroid Build Coastguard Worker arg[4] = InstA(inst_data);
590*795d594fSAndroid Build Coastguard Worker FALLTHROUGH_INTENDED;
591*795d594fSAndroid Build Coastguard Worker case 4:
592*795d594fSAndroid Build Coastguard Worker arg[3] = (regList >> 12) & 0x0f;
593*795d594fSAndroid Build Coastguard Worker FALLTHROUGH_INTENDED;
594*795d594fSAndroid Build Coastguard Worker case 3:
595*795d594fSAndroid Build Coastguard Worker arg[2] = (regList >> 8) & 0x0f;
596*795d594fSAndroid Build Coastguard Worker FALLTHROUGH_INTENDED;
597*795d594fSAndroid Build Coastguard Worker case 2:
598*795d594fSAndroid Build Coastguard Worker arg[1] = (regList >> 4) & 0x0f;
599*795d594fSAndroid Build Coastguard Worker FALLTHROUGH_INTENDED;
600*795d594fSAndroid Build Coastguard Worker case 1:
601*795d594fSAndroid Build Coastguard Worker arg[0] = regList & 0x0f;
602*795d594fSAndroid Build Coastguard Worker break;
603*795d594fSAndroid Build Coastguard Worker default: // case 0
604*795d594fSAndroid Build Coastguard Worker break; // Valid, but no need to do anything.
605*795d594fSAndroid Build Coastguard Worker }
606*795d594fSAndroid Build Coastguard Worker return count;
607*795d594fSAndroid Build Coastguard Worker }
608*795d594fSAndroid Build Coastguard Worker
609*795d594fSAndroid Build Coastguard Worker } // namespace art
610*795d594fSAndroid Build Coastguard Worker
611*795d594fSAndroid Build Coastguard Worker #endif // ART_LIBDEXFILE_DEX_DEX_INSTRUCTION_INL_H_
612