dex_instruction-inl.h revision 3b588e09eac6fb2aff64595e2232e479703850fc
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
17fc0e3219edc9a5bf81b166e82fd5db2796eb6a0dBrian Carlstrom#ifndef ART_RUNTIME_DEX_INSTRUCTION_INL_H_
18fc0e3219edc9a5bf81b166e82fd5db2796eb6a0dBrian Carlstrom#define ART_RUNTIME_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//------------------------------------------------------------------------------
273b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertzinline int8_t Instruction::VRegA_10t(uint16_t inst_data) const {
28807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  DCHECK_EQ(FormatOf(Opcode()), k10t);
293b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz  return static_cast<int8_t>(InstAA(inst_data));
30807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz}
31807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz
323b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertzinline uint8_t Instruction::VRegA_10x(uint16_t inst_data) const {
335243e912875026f99428088db7e80cb11651d64eSebastien Hertz  DCHECK_EQ(FormatOf(Opcode()), k10x);
343b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz  return InstAA(inst_data);
355243e912875026f99428088db7e80cb11651d64eSebastien Hertz}
365243e912875026f99428088db7e80cb11651d64eSebastien Hertz
373b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertzinline uint4_t Instruction::VRegA_11n(uint16_t inst_data) const {
38807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  DCHECK_EQ(FormatOf(Opcode()), k11n);
393b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz  return InstA(inst_data);
40807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz}
41807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz
423b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertzinline uint8_t Instruction::VRegA_11x(uint16_t inst_data) const {
43807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  DCHECK_EQ(FormatOf(Opcode()), k11x);
443b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz  return InstAA(inst_data);
45807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz}
46807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz
473b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertzinline uint4_t Instruction::VRegA_12x(uint16_t inst_data) const {
48807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  DCHECK_EQ(FormatOf(Opcode()), k12x);
493b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz  return InstA(inst_data);
50807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz}
51807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz
52807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertzinline int16_t Instruction::VRegA_20t() const {
53807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  DCHECK_EQ(FormatOf(Opcode()), k20t);
54807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  return static_cast<int16_t>(Fetch16(1));
55807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz}
56807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz
573b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertzinline uint8_t Instruction::VRegA_21c(uint16_t inst_data) const {
58807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  DCHECK_EQ(FormatOf(Opcode()), k21c);
593b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz  return InstAA(inst_data);
60807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz}
61807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz
623b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertzinline uint8_t Instruction::VRegA_21h(uint16_t inst_data) const {
63807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  DCHECK_EQ(FormatOf(Opcode()), k21h);
643b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz  return InstAA(inst_data);
65807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz}
66807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz
673b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertzinline uint8_t Instruction::VRegA_21s(uint16_t inst_data) const {
68807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  DCHECK_EQ(FormatOf(Opcode()), k21s);
693b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz  return InstAA(inst_data);
70807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz}
71807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz
723b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertzinline uint8_t Instruction::VRegA_21t(uint16_t inst_data) const {
73807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  DCHECK_EQ(FormatOf(Opcode()), k21t);
743b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz  return InstAA(inst_data);
75807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz}
76807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz
773b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertzinline uint8_t Instruction::VRegA_22b(uint16_t inst_data) const {
78807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  DCHECK_EQ(FormatOf(Opcode()), k22b);
793b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz  return InstAA(inst_data);
80807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz}
81807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz
823b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertzinline uint4_t Instruction::VRegA_22c(uint16_t inst_data) const {
83807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  DCHECK_EQ(FormatOf(Opcode()), k22c);
843b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz  return InstA(inst_data);
85807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz}
86807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz
873b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertzinline uint4_t Instruction::VRegA_22s(uint16_t inst_data) const {
88807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  DCHECK_EQ(FormatOf(Opcode()), k22s);
893b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz  return InstA(inst_data);
90807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz}
91807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz
923b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertzinline uint4_t Instruction::VRegA_22t(uint16_t inst_data) const {
93807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  DCHECK_EQ(FormatOf(Opcode()), k22t);
943b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz  return InstA(inst_data);
95807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz}
96807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz
973b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertzinline uint8_t Instruction::VRegA_22x(uint16_t inst_data) const {
98807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  DCHECK_EQ(FormatOf(Opcode()), k22x);
993b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz  return InstAA(inst_data);
100807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz}
101807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz
1023b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertzinline uint8_t Instruction::VRegA_23x(uint16_t inst_data) const {
103807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  DCHECK_EQ(FormatOf(Opcode()), k23x);
1043b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz  return InstAA(inst_data);
105807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz}
106807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz
107807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertzinline int32_t Instruction::VRegA_30t() const {
108807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  DCHECK_EQ(FormatOf(Opcode()), k30t);
109807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  return static_cast<int32_t>(Fetch32(1));
110807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz}
111807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz
1123b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertzinline uint8_t Instruction::VRegA_31c(uint16_t inst_data) const {
113807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  DCHECK_EQ(FormatOf(Opcode()), k31c);
1143b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz  return InstAA(inst_data);
115807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz}
116807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz
1173b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertzinline uint8_t Instruction::VRegA_31i(uint16_t inst_data) const {
118807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  DCHECK_EQ(FormatOf(Opcode()), k31i);
1193b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz  return InstAA(inst_data);
120807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz}
121807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz
1223b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertzinline uint8_t Instruction::VRegA_31t(uint16_t inst_data) const {
123807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  DCHECK_EQ(FormatOf(Opcode()), k31t);
1243b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz  return InstAA(inst_data);
125807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz}
126807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz
127807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertzinline uint16_t Instruction::VRegA_32x() const {
128807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  DCHECK_EQ(FormatOf(Opcode()), k32x);
129807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  return Fetch16(1);
130807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz}
131807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz
1323b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertzinline uint4_t Instruction::VRegA_35c(uint16_t inst_data) const {
133807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  DCHECK_EQ(FormatOf(Opcode()), k35c);
1343b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz  return InstB(inst_data);  // This is labeled A in the spec.
135807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz}
136807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz
1373b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertzinline uint8_t Instruction::VRegA_3rc(uint16_t inst_data) const {
138807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  DCHECK_EQ(FormatOf(Opcode()), k3rc);
1393b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz  return InstAA(inst_data);
140807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz}
141807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz
1423b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertzinline uint8_t Instruction::VRegA_51l(uint16_t inst_data) const {
143807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  DCHECK_EQ(FormatOf(Opcode()), k51l);
1443b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz  return InstAA(inst_data);
145807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz}
146807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz
147807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz//------------------------------------------------------------------------------
148807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz// VRegB
149807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz//------------------------------------------------------------------------------
1503b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertzinline int4_t Instruction::VRegB_11n(uint16_t inst_data) const {
151807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  DCHECK_EQ(FormatOf(Opcode()), k11n);
1523b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz  return static_cast<int4_t>((InstB(inst_data) << 28) >> 28);
153807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz}
154807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz
1553b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertzinline uint4_t Instruction::VRegB_12x(uint16_t inst_data) const {
156807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  DCHECK_EQ(FormatOf(Opcode()), k12x);
1573b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz  return InstB(inst_data);
158807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz}
159807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz
160807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertzinline uint16_t Instruction::VRegB_21c() const {
161807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  DCHECK_EQ(FormatOf(Opcode()), k21c);
162807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  return Fetch16(1);
163807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz}
164807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz
165807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertzinline uint16_t Instruction::VRegB_21h() const {
166807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  DCHECK_EQ(FormatOf(Opcode()), k21h);
167807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  return Fetch16(1);
168807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz}
169807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz
170807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertzinline int16_t Instruction::VRegB_21s() const {
171807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  DCHECK_EQ(FormatOf(Opcode()), k21s);
172807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  return static_cast<int16_t>(Fetch16(1));
173807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz}
174807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz
175807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertzinline int16_t Instruction::VRegB_21t() const {
176807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  DCHECK_EQ(FormatOf(Opcode()), k21t);
177807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  return static_cast<int16_t>(Fetch16(1));
178807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz}
179807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz
180807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertzinline uint8_t Instruction::VRegB_22b() const {
181807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  DCHECK_EQ(FormatOf(Opcode()), k22b);
182807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  return static_cast<uint8_t>(Fetch16(1) & 0xff);
183807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz}
184807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz
1853b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertzinline uint4_t Instruction::VRegB_22c(uint16_t inst_data) const {
186807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  DCHECK_EQ(FormatOf(Opcode()), k22c);
1873b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz  return InstB(inst_data);
188807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz}
189807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz
1903b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertzinline uint4_t Instruction::VRegB_22s(uint16_t inst_data) const {
191807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  DCHECK_EQ(FormatOf(Opcode()), k22s);
1923b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz  return InstB(inst_data);
193807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz}
194807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz
1953b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertzinline uint4_t Instruction::VRegB_22t(uint16_t inst_data) const {
196807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  DCHECK_EQ(FormatOf(Opcode()), k22t);
1973b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz  return InstB(inst_data);
198807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz}
199807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz
200807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertzinline uint16_t Instruction::VRegB_22x() const {
201807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  DCHECK_EQ(FormatOf(Opcode()), k22x);
202807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  return Fetch16(1);
203807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz}
204807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz
205807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertzinline uint8_t Instruction::VRegB_23x() const {
206807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  DCHECK_EQ(FormatOf(Opcode()), k23x);
207807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  return static_cast<uint8_t>(Fetch16(1) & 0xff);
208807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz}
209807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz
210807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertzinline uint32_t Instruction::VRegB_31c() const {
211807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  DCHECK_EQ(FormatOf(Opcode()), k31c);
212807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  return Fetch32(1);
213807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz}
214807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz
215807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertzinline int32_t Instruction::VRegB_31i() const {
216807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  DCHECK_EQ(FormatOf(Opcode()), k31i);
217807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  return static_cast<int32_t>(Fetch32(1));
218807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz}
219807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz
220807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertzinline int32_t Instruction::VRegB_31t() const {
221807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  DCHECK_EQ(FormatOf(Opcode()), k31t);
222807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  return static_cast<int32_t>(Fetch32(1));
223807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz}
224807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz
225807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertzinline uint16_t Instruction::VRegB_32x() const {
226807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  DCHECK_EQ(FormatOf(Opcode()), k32x);
227807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  return Fetch16(2);
228807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz}
229807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz
230807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertzinline uint16_t Instruction::VRegB_35c() const {
231807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  DCHECK_EQ(FormatOf(Opcode()), k35c);
232807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  return Fetch16(1);
233807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz}
234807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz
235807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertzinline uint16_t Instruction::VRegB_3rc() const {
236807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  DCHECK_EQ(FormatOf(Opcode()), k3rc);
237807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  return Fetch16(1);
238807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz}
239807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz
240807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertzinline uint64_t Instruction::VRegB_51l() const {
241807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  DCHECK_EQ(FormatOf(Opcode()), k51l);
242807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  uint64_t vB_wide = Fetch32(1) | ((uint64_t) Fetch32(3) << 32);
243807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  return vB_wide;
244807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz}
245807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz
246807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz//------------------------------------------------------------------------------
247807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz// VRegC
248807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz//------------------------------------------------------------------------------
249807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertzinline int8_t Instruction::VRegC_22b() const {
250807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  DCHECK_EQ(FormatOf(Opcode()), k22b);
251807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  return static_cast<int8_t>(Fetch16(1) >> 8);
252807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz}
253807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz
254807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertzinline uint16_t Instruction::VRegC_22c() const {
255807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  DCHECK_EQ(FormatOf(Opcode()), k22c);
256807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  return Fetch16(1);
257807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz}
258807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz
259807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertzinline int16_t Instruction::VRegC_22s() const {
260807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  DCHECK_EQ(FormatOf(Opcode()), k22s);
261807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  return static_cast<int16_t>(Fetch16(1));
262807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz}
263807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz
264807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertzinline int16_t Instruction::VRegC_22t() const {
265807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  DCHECK_EQ(FormatOf(Opcode()), k22t);
266807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  return static_cast<int16_t>(Fetch16(1));
267807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz}
268807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz
269807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertzinline uint8_t Instruction::VRegC_23x() const {
270807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  DCHECK_EQ(FormatOf(Opcode()), k23x);
271807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  return static_cast<uint8_t>(Fetch16(1) >> 8);
272807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz}
273807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz
274807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertzinline uint4_t Instruction::VRegC_35c() const {
275807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  DCHECK_EQ(FormatOf(Opcode()), k35c);
276807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  return static_cast<uint4_t>(Fetch16(2) & 0x0f);
277807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz}
278807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz
279807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertzinline uint16_t Instruction::VRegC_3rc() const {
280807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  DCHECK_EQ(FormatOf(Opcode()), k3rc);
281807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  return Fetch16(2);
282807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz}
283807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz
284807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertzinline void Instruction::GetArgs(uint32_t arg[5]) const {
285807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  DCHECK_EQ(FormatOf(Opcode()), k35c);
286807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz
287807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  /*
288807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz   * Note that the fields mentioned in the spec don't appear in
289807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz   * their "usual" positions here compared to most formats. This
290807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz   * was done so that the field names for the argument count and
291807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz   * reference index match between this format and the corresponding
292807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz   * range formats (3rc and friends).
293807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz   *
294807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz   * Bottom line: The argument count is always in vA, and the
295807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz   * method constant (or equivalent) is always in vB.
296807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz   */
297807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  uint16_t regList = Fetch16(2);
2987934ac288acfb2552bb0b06ec1f61e5820d924a4Brian Carlstrom  uint4_t count = InstB();  // This is labeled A in the spec.
299807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz
300807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  /*
301807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz   * Copy the argument registers into the arg[] array, and
302807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz   * also copy the first argument (if any) into vC. (The
303807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz   * DecodedInstruction structure doesn't have separate
304807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz   * fields for {vD, vE, vF, vG}, so there's no need to make
305807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz   * copies of those.) Note that cases 5..2 fall through.
306807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz   */
307807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  switch (count) {
308807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz    case 5: arg[4] = InstA();
309807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz    case 4: arg[3] = (regList >> 12) & 0x0f;
310807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz    case 3: arg[2] = (regList >> 8) & 0x0f;
311807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz    case 2: arg[1] = (regList >> 4) & 0x0f;
312807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz    case 1: arg[0] = regList & 0x0f; break;
3137934ac288acfb2552bb0b06ec1f61e5820d924a4Brian Carlstrom    case 0: break;  // Valid, but no need to do anything.
314807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz    default:
315807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz      LOG(ERROR) << "Invalid arg count in 35c (" << count << ")";
316807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz      return;
317807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  }
318807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz}
319807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz
3207934ac288acfb2552bb0b06ec1f61e5820d924a4Brian Carlstrom}  // namespace art
321807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz
322fc0e3219edc9a5bf81b166e82fd5db2796eb6a0dBrian Carlstrom#endif  // ART_RUNTIME_DEX_INSTRUCTION_INL_H_
323