dex_instruction-inl.h revision 7934ac288acfb2552bb0b06ec1f61e5820d924a4
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//------------------------------------------------------------------------------
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
325243e912875026f99428088db7e80cb11651d64eSebastien Hertzinline uint8_t Instruction::VRegA_10x() const {
335243e912875026f99428088db7e80cb11651d64eSebastien Hertz  DCHECK_EQ(FormatOf(Opcode()), k10x);
345243e912875026f99428088db7e80cb11651d64eSebastien Hertz  return InstAA();
355243e912875026f99428088db7e80cb11651d64eSebastien Hertz}
365243e912875026f99428088db7e80cb11651d64eSebastien Hertz
37807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertzinline uint4_t Instruction::VRegA_11n() const {
38807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  DCHECK_EQ(FormatOf(Opcode()), k11n);
39807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  return InstA();
40807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz}
41807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz
42807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertzinline uint8_t Instruction::VRegA_11x() const {
43807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  DCHECK_EQ(FormatOf(Opcode()), k11x);
44807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  return InstAA();
45807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz}
46807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz
47807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertzinline uint4_t Instruction::VRegA_12x() const {
48807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  DCHECK_EQ(FormatOf(Opcode()), k12x);
49807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  return InstA();
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
57807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertzinline uint8_t Instruction::VRegA_21c() const {
58807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  DCHECK_EQ(FormatOf(Opcode()), k21c);
59807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  return InstAA();
60807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz}
61807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz
62807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertzinline uint8_t Instruction::VRegA_21h() const {
63807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  DCHECK_EQ(FormatOf(Opcode()), k21h);
64807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  return InstAA();
65807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz}
66807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz
67807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertzinline uint8_t Instruction::VRegA_21s() const {
68807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  DCHECK_EQ(FormatOf(Opcode()), k21s);
69807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  return InstAA();
70807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz}
71807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz
72807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertzinline uint8_t Instruction::VRegA_21t() const {
73807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  DCHECK_EQ(FormatOf(Opcode()), k21t);
74807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  return InstAA();
75807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz}
76807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz
77807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertzinline uint8_t Instruction::VRegA_22b() const {
78807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  DCHECK_EQ(FormatOf(Opcode()), k22b);
79807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  return InstAA();
80807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz}
81807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz
82807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertzinline uint4_t Instruction::VRegA_22c() const {
83807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  DCHECK_EQ(FormatOf(Opcode()), k22c);
84807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  return InstA();
85807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz}
86807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz
87807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertzinline uint4_t Instruction::VRegA_22s() const {
88807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  DCHECK_EQ(FormatOf(Opcode()), k22s);
89807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  return InstA();
90807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz}
91807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz
92807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertzinline uint4_t Instruction::VRegA_22t() const {
93807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  DCHECK_EQ(FormatOf(Opcode()), k22t);
94807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  return InstA();
95807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz}
96807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz
97807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertzinline uint8_t Instruction::VRegA_22x() const {
98807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  DCHECK_EQ(FormatOf(Opcode()), k22x);
99807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  return InstAA();
100807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz}
101807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz
102807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertzinline uint8_t Instruction::VRegA_23x() const {
103807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  DCHECK_EQ(FormatOf(Opcode()), k23x);
104807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  return InstAA();
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
112807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertzinline uint8_t Instruction::VRegA_31c() const {
113807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  DCHECK_EQ(FormatOf(Opcode()), k31c);
114807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  return InstAA();
115807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz}
116807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz
117807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertzinline uint8_t Instruction::VRegA_31i() const {
118807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  DCHECK_EQ(FormatOf(Opcode()), k31i);
119807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  return InstAA();
120807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz}
121807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz
122807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertzinline uint8_t Instruction::VRegA_31t() const {
123807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  DCHECK_EQ(FormatOf(Opcode()), k31t);
124807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  return InstAA();
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
132807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertzinline uint4_t Instruction::VRegA_35c() const {
133807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  DCHECK_EQ(FormatOf(Opcode()), k35c);
1347934ac288acfb2552bb0b06ec1f61e5820d924a4Brian Carlstrom  return InstB();  // This is labeled A in the spec.
135807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz}
136807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz
137807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertzinline uint8_t Instruction::VRegA_3rc() const {
138807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  DCHECK_EQ(FormatOf(Opcode()), k3rc);
139807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  return InstAA();
140807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz}
141807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz
142807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertzinline uint8_t Instruction::VRegA_51l() const {
143807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  DCHECK_EQ(FormatOf(Opcode()), k51l);
144807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  return InstAA();
145807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz}
146807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz
147807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz//------------------------------------------------------------------------------
148807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz// VRegB
149807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz//------------------------------------------------------------------------------
150807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertzinline int4_t Instruction::VRegB_11n() const {
151807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  DCHECK_EQ(FormatOf(Opcode()), k11n);
152807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  return static_cast<int4_t>((InstB() << 28) >> 28);
153807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz}
154807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz
155807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertzinline uint4_t Instruction::VRegB_12x() const {
156807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  DCHECK_EQ(FormatOf(Opcode()), k12x);
157807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  return InstB();
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
185807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertzinline uint4_t Instruction::VRegB_22c() const {
186807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  DCHECK_EQ(FormatOf(Opcode()), k22c);
187807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  return InstB();
188807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz}
189807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz
190807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertzinline uint4_t Instruction::VRegB_22s() const {
191807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  DCHECK_EQ(FormatOf(Opcode()), k22s);
192807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  return InstB();
193807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz}
194807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz
195807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertzinline uint4_t Instruction::VRegB_22t() const {
196807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  DCHECK_EQ(FormatOf(Opcode()), k22t);
197807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  return InstB();
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