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//------------------------------------------------------------------------------
2729a2648821ea4d0b5d3aecb9f835822fdfe6faa1Ian Rogersinline bool Instruction::HasVRegA() const {
2829a2648821ea4d0b5d3aecb9f835822fdfe6faa1Ian Rogers  switch (FormatOf(Opcode())) {
2929a2648821ea4d0b5d3aecb9f835822fdfe6faa1Ian Rogers    case k10t: return true;
3029a2648821ea4d0b5d3aecb9f835822fdfe6faa1Ian Rogers    case k10x: return true;
3129a2648821ea4d0b5d3aecb9f835822fdfe6faa1Ian Rogers    case k11n: return true;
3229a2648821ea4d0b5d3aecb9f835822fdfe6faa1Ian Rogers    case k11x: return true;
3329a2648821ea4d0b5d3aecb9f835822fdfe6faa1Ian Rogers    case k12x: return true;
3429a2648821ea4d0b5d3aecb9f835822fdfe6faa1Ian Rogers    case k20t: return true;
3529a2648821ea4d0b5d3aecb9f835822fdfe6faa1Ian Rogers    case k21c: return true;
3629a2648821ea4d0b5d3aecb9f835822fdfe6faa1Ian Rogers    case k21h: return true;
3729a2648821ea4d0b5d3aecb9f835822fdfe6faa1Ian Rogers    case k21s: return true;
3829a2648821ea4d0b5d3aecb9f835822fdfe6faa1Ian Rogers    case k21t: return true;
3929a2648821ea4d0b5d3aecb9f835822fdfe6faa1Ian Rogers    case k22b: return true;
4029a2648821ea4d0b5d3aecb9f835822fdfe6faa1Ian Rogers    case k22c: return true;
4129a2648821ea4d0b5d3aecb9f835822fdfe6faa1Ian Rogers    case k22s: return true;
4229a2648821ea4d0b5d3aecb9f835822fdfe6faa1Ian Rogers    case k22t: return true;
4329a2648821ea4d0b5d3aecb9f835822fdfe6faa1Ian Rogers    case k22x: return true;
4429a2648821ea4d0b5d3aecb9f835822fdfe6faa1Ian Rogers    case k23x: return true;
4529a2648821ea4d0b5d3aecb9f835822fdfe6faa1Ian Rogers    case k30t: return true;
4629a2648821ea4d0b5d3aecb9f835822fdfe6faa1Ian Rogers    case k31c: return true;
4729a2648821ea4d0b5d3aecb9f835822fdfe6faa1Ian Rogers    case k31i: return true;
4829a2648821ea4d0b5d3aecb9f835822fdfe6faa1Ian Rogers    case k31t: return true;
4929a2648821ea4d0b5d3aecb9f835822fdfe6faa1Ian Rogers    case k32x: return true;
5029a2648821ea4d0b5d3aecb9f835822fdfe6faa1Ian Rogers    case k35c: return true;
5129a2648821ea4d0b5d3aecb9f835822fdfe6faa1Ian Rogers    case k3rc: return true;
5229a2648821ea4d0b5d3aecb9f835822fdfe6faa1Ian Rogers    case k51l: return true;
5329a2648821ea4d0b5d3aecb9f835822fdfe6faa1Ian Rogers    default: return false;
5429a2648821ea4d0b5d3aecb9f835822fdfe6faa1Ian Rogers  }
5529a2648821ea4d0b5d3aecb9f835822fdfe6faa1Ian Rogers}
5629a2648821ea4d0b5d3aecb9f835822fdfe6faa1Ian Rogers
5729a2648821ea4d0b5d3aecb9f835822fdfe6faa1Ian Rogersinline int32_t Instruction::VRegA() const {
5829a2648821ea4d0b5d3aecb9f835822fdfe6faa1Ian Rogers  switch (FormatOf(Opcode())) {
5929a2648821ea4d0b5d3aecb9f835822fdfe6faa1Ian Rogers    case k10t: return VRegA_10t();
6029a2648821ea4d0b5d3aecb9f835822fdfe6faa1Ian Rogers    case k10x: return VRegA_10x();
6129a2648821ea4d0b5d3aecb9f835822fdfe6faa1Ian Rogers    case k11n: return VRegA_11n();
6229a2648821ea4d0b5d3aecb9f835822fdfe6faa1Ian Rogers    case k11x: return VRegA_11x();
6329a2648821ea4d0b5d3aecb9f835822fdfe6faa1Ian Rogers    case k12x: return VRegA_12x();
6429a2648821ea4d0b5d3aecb9f835822fdfe6faa1Ian Rogers    case k20t: return VRegA_20t();
6529a2648821ea4d0b5d3aecb9f835822fdfe6faa1Ian Rogers    case k21c: return VRegA_21c();
6629a2648821ea4d0b5d3aecb9f835822fdfe6faa1Ian Rogers    case k21h: return VRegA_21h();
6729a2648821ea4d0b5d3aecb9f835822fdfe6faa1Ian Rogers    case k21s: return VRegA_21s();
6829a2648821ea4d0b5d3aecb9f835822fdfe6faa1Ian Rogers    case k21t: return VRegA_21t();
6929a2648821ea4d0b5d3aecb9f835822fdfe6faa1Ian Rogers    case k22b: return VRegA_22b();
7029a2648821ea4d0b5d3aecb9f835822fdfe6faa1Ian Rogers    case k22c: return VRegA_22c();
7129a2648821ea4d0b5d3aecb9f835822fdfe6faa1Ian Rogers    case k22s: return VRegA_22s();
7229a2648821ea4d0b5d3aecb9f835822fdfe6faa1Ian Rogers    case k22t: return VRegA_22t();
7329a2648821ea4d0b5d3aecb9f835822fdfe6faa1Ian Rogers    case k22x: return VRegA_22x();
7429a2648821ea4d0b5d3aecb9f835822fdfe6faa1Ian Rogers    case k23x: return VRegA_23x();
7529a2648821ea4d0b5d3aecb9f835822fdfe6faa1Ian Rogers    case k30t: return VRegA_30t();
7629a2648821ea4d0b5d3aecb9f835822fdfe6faa1Ian Rogers    case k31c: return VRegA_31c();
7729a2648821ea4d0b5d3aecb9f835822fdfe6faa1Ian Rogers    case k31i: return VRegA_31i();
7829a2648821ea4d0b5d3aecb9f835822fdfe6faa1Ian Rogers    case k31t: return VRegA_31t();
7929a2648821ea4d0b5d3aecb9f835822fdfe6faa1Ian Rogers    case k32x: return VRegA_32x();
8029a2648821ea4d0b5d3aecb9f835822fdfe6faa1Ian Rogers    case k35c: return VRegA_35c();
8129a2648821ea4d0b5d3aecb9f835822fdfe6faa1Ian Rogers    case k3rc: return VRegA_3rc();
8229a2648821ea4d0b5d3aecb9f835822fdfe6faa1Ian Rogers    case k51l: return VRegA_51l();
8329a2648821ea4d0b5d3aecb9f835822fdfe6faa1Ian Rogers    default:
8429a2648821ea4d0b5d3aecb9f835822fdfe6faa1Ian Rogers      LOG(FATAL) << "Tried to access vA of instruction " << Name() << " which has no A operand.";
8529a2648821ea4d0b5d3aecb9f835822fdfe6faa1Ian Rogers      exit(EXIT_FAILURE);
8629a2648821ea4d0b5d3aecb9f835822fdfe6faa1Ian Rogers  }
8729a2648821ea4d0b5d3aecb9f835822fdfe6faa1Ian Rogers}
8829a2648821ea4d0b5d3aecb9f835822fdfe6faa1Ian Rogers
893b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertzinline int8_t Instruction::VRegA_10t(uint16_t inst_data) const {
90807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  DCHECK_EQ(FormatOf(Opcode()), k10t);
913b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz  return static_cast<int8_t>(InstAA(inst_data));
92807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz}
93807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz
943b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertzinline uint8_t Instruction::VRegA_10x(uint16_t inst_data) const {
955243e912875026f99428088db7e80cb11651d64eSebastien Hertz  DCHECK_EQ(FormatOf(Opcode()), k10x);
963b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz  return InstAA(inst_data);
975243e912875026f99428088db7e80cb11651d64eSebastien Hertz}
985243e912875026f99428088db7e80cb11651d64eSebastien Hertz
993b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertzinline uint4_t Instruction::VRegA_11n(uint16_t inst_data) const {
100807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  DCHECK_EQ(FormatOf(Opcode()), k11n);
1013b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz  return InstA(inst_data);
102807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz}
103807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz
1043b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertzinline uint8_t Instruction::VRegA_11x(uint16_t inst_data) const {
105807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  DCHECK_EQ(FormatOf(Opcode()), k11x);
1063b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz  return InstAA(inst_data);
107807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz}
108807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz
1093b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertzinline uint4_t Instruction::VRegA_12x(uint16_t inst_data) const {
110807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  DCHECK_EQ(FormatOf(Opcode()), k12x);
1113b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz  return InstA(inst_data);
112807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz}
113807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz
114807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertzinline int16_t Instruction::VRegA_20t() const {
115807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  DCHECK_EQ(FormatOf(Opcode()), k20t);
116807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  return static_cast<int16_t>(Fetch16(1));
117807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz}
118807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz
1193b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertzinline uint8_t Instruction::VRegA_21c(uint16_t inst_data) const {
120807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  DCHECK_EQ(FormatOf(Opcode()), k21c);
1213b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz  return InstAA(inst_data);
122807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz}
123807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz
1243b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertzinline uint8_t Instruction::VRegA_21h(uint16_t inst_data) const {
125807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  DCHECK_EQ(FormatOf(Opcode()), k21h);
1263b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz  return InstAA(inst_data);
127807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz}
128807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz
1293b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertzinline uint8_t Instruction::VRegA_21s(uint16_t inst_data) const {
130807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  DCHECK_EQ(FormatOf(Opcode()), k21s);
1313b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz  return InstAA(inst_data);
132807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz}
133807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz
1343b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertzinline uint8_t Instruction::VRegA_21t(uint16_t inst_data) const {
135807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  DCHECK_EQ(FormatOf(Opcode()), k21t);
1363b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz  return InstAA(inst_data);
137807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz}
138807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz
1393b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertzinline uint8_t Instruction::VRegA_22b(uint16_t inst_data) const {
140807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  DCHECK_EQ(FormatOf(Opcode()), k22b);
1413b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz  return InstAA(inst_data);
142807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz}
143807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz
1443b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertzinline uint4_t Instruction::VRegA_22c(uint16_t inst_data) const {
145807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  DCHECK_EQ(FormatOf(Opcode()), k22c);
1463b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz  return InstA(inst_data);
147807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz}
148807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz
1493b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertzinline uint4_t Instruction::VRegA_22s(uint16_t inst_data) const {
150807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  DCHECK_EQ(FormatOf(Opcode()), k22s);
1513b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz  return InstA(inst_data);
152807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz}
153807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz
1543b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertzinline uint4_t Instruction::VRegA_22t(uint16_t inst_data) const {
155807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  DCHECK_EQ(FormatOf(Opcode()), k22t);
1563b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz  return InstA(inst_data);
157807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz}
158807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz
1593b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertzinline uint8_t Instruction::VRegA_22x(uint16_t inst_data) const {
160807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  DCHECK_EQ(FormatOf(Opcode()), k22x);
1613b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz  return InstAA(inst_data);
162807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz}
163807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz
1643b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertzinline uint8_t Instruction::VRegA_23x(uint16_t inst_data) const {
165807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  DCHECK_EQ(FormatOf(Opcode()), k23x);
1663b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz  return InstAA(inst_data);
167807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz}
168807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz
169807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertzinline int32_t Instruction::VRegA_30t() const {
170807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  DCHECK_EQ(FormatOf(Opcode()), k30t);
171807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  return static_cast<int32_t>(Fetch32(1));
172807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz}
173807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz
1743b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertzinline uint8_t Instruction::VRegA_31c(uint16_t inst_data) const {
175807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  DCHECK_EQ(FormatOf(Opcode()), k31c);
1763b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz  return InstAA(inst_data);
177807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz}
178807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz
1793b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertzinline uint8_t Instruction::VRegA_31i(uint16_t inst_data) const {
180807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  DCHECK_EQ(FormatOf(Opcode()), k31i);
1813b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz  return InstAA(inst_data);
182807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz}
183807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz
1843b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertzinline uint8_t Instruction::VRegA_31t(uint16_t inst_data) const {
185807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  DCHECK_EQ(FormatOf(Opcode()), k31t);
1863b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz  return InstAA(inst_data);
187807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz}
188807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz
189807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertzinline uint16_t Instruction::VRegA_32x() const {
190807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  DCHECK_EQ(FormatOf(Opcode()), k32x);
191807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  return Fetch16(1);
192807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz}
193807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz
1943b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertzinline uint4_t Instruction::VRegA_35c(uint16_t inst_data) const {
195807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  DCHECK_EQ(FormatOf(Opcode()), k35c);
1963b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz  return InstB(inst_data);  // This is labeled A in the spec.
197807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz}
198807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz
1993b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertzinline uint8_t Instruction::VRegA_3rc(uint16_t inst_data) const {
200807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  DCHECK_EQ(FormatOf(Opcode()), k3rc);
2013b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz  return InstAA(inst_data);
202807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz}
203807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz
2043b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertzinline uint8_t Instruction::VRegA_51l(uint16_t inst_data) const {
205807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  DCHECK_EQ(FormatOf(Opcode()), k51l);
2063b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz  return InstAA(inst_data);
207807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz}
208807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz
209807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz//------------------------------------------------------------------------------
210807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz// VRegB
211807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz//------------------------------------------------------------------------------
21229a2648821ea4d0b5d3aecb9f835822fdfe6faa1Ian Rogersinline bool Instruction::HasVRegB() const {
21329a2648821ea4d0b5d3aecb9f835822fdfe6faa1Ian Rogers  switch (FormatOf(Opcode())) {
21429a2648821ea4d0b5d3aecb9f835822fdfe6faa1Ian Rogers    case k11n: return true;
21529a2648821ea4d0b5d3aecb9f835822fdfe6faa1Ian Rogers    case k12x: return true;
21629a2648821ea4d0b5d3aecb9f835822fdfe6faa1Ian Rogers    case k21c: return true;
21729a2648821ea4d0b5d3aecb9f835822fdfe6faa1Ian Rogers    case k21h: return true;
21829a2648821ea4d0b5d3aecb9f835822fdfe6faa1Ian Rogers    case k21s: return true;
21929a2648821ea4d0b5d3aecb9f835822fdfe6faa1Ian Rogers    case k21t: return true;
22029a2648821ea4d0b5d3aecb9f835822fdfe6faa1Ian Rogers    case k22b: return true;
22129a2648821ea4d0b5d3aecb9f835822fdfe6faa1Ian Rogers    case k22c: return true;
22229a2648821ea4d0b5d3aecb9f835822fdfe6faa1Ian Rogers    case k22s: return true;
22329a2648821ea4d0b5d3aecb9f835822fdfe6faa1Ian Rogers    case k22t: return true;
22429a2648821ea4d0b5d3aecb9f835822fdfe6faa1Ian Rogers    case k22x: return true;
22529a2648821ea4d0b5d3aecb9f835822fdfe6faa1Ian Rogers    case k23x: return true;
22629a2648821ea4d0b5d3aecb9f835822fdfe6faa1Ian Rogers    case k31c: return true;
22729a2648821ea4d0b5d3aecb9f835822fdfe6faa1Ian Rogers    case k31i: return true;
22829a2648821ea4d0b5d3aecb9f835822fdfe6faa1Ian Rogers    case k31t: return true;
22929a2648821ea4d0b5d3aecb9f835822fdfe6faa1Ian Rogers    case k32x: return true;
23029a2648821ea4d0b5d3aecb9f835822fdfe6faa1Ian Rogers    case k35c: return true;
23129a2648821ea4d0b5d3aecb9f835822fdfe6faa1Ian Rogers    case k3rc: return true;
23229a2648821ea4d0b5d3aecb9f835822fdfe6faa1Ian Rogers    case k51l: return true;
23329a2648821ea4d0b5d3aecb9f835822fdfe6faa1Ian Rogers    default: return false;
23429a2648821ea4d0b5d3aecb9f835822fdfe6faa1Ian Rogers  }
23529a2648821ea4d0b5d3aecb9f835822fdfe6faa1Ian Rogers}
23629a2648821ea4d0b5d3aecb9f835822fdfe6faa1Ian Rogers
23729a2648821ea4d0b5d3aecb9f835822fdfe6faa1Ian Rogersinline bool Instruction::HasWideVRegB() const {
23829a2648821ea4d0b5d3aecb9f835822fdfe6faa1Ian Rogers  return FormatOf(Opcode()) == k51l;
23929a2648821ea4d0b5d3aecb9f835822fdfe6faa1Ian Rogers}
24029a2648821ea4d0b5d3aecb9f835822fdfe6faa1Ian Rogers
24129a2648821ea4d0b5d3aecb9f835822fdfe6faa1Ian Rogersinline int32_t Instruction::VRegB() const {
24229a2648821ea4d0b5d3aecb9f835822fdfe6faa1Ian Rogers  switch (FormatOf(Opcode())) {
24329a2648821ea4d0b5d3aecb9f835822fdfe6faa1Ian Rogers    case k11n: return VRegB_11n();
24429a2648821ea4d0b5d3aecb9f835822fdfe6faa1Ian Rogers    case k12x: return VRegB_12x();
24529a2648821ea4d0b5d3aecb9f835822fdfe6faa1Ian Rogers    case k21c: return VRegB_21c();
24629a2648821ea4d0b5d3aecb9f835822fdfe6faa1Ian Rogers    case k21h: return VRegB_21h();
24729a2648821ea4d0b5d3aecb9f835822fdfe6faa1Ian Rogers    case k21s: return VRegB_21s();
24829a2648821ea4d0b5d3aecb9f835822fdfe6faa1Ian Rogers    case k21t: return VRegB_21t();
24929a2648821ea4d0b5d3aecb9f835822fdfe6faa1Ian Rogers    case k22b: return VRegB_22b();
25029a2648821ea4d0b5d3aecb9f835822fdfe6faa1Ian Rogers    case k22c: return VRegB_22c();
25129a2648821ea4d0b5d3aecb9f835822fdfe6faa1Ian Rogers    case k22s: return VRegB_22s();
25229a2648821ea4d0b5d3aecb9f835822fdfe6faa1Ian Rogers    case k22t: return VRegB_22t();
25329a2648821ea4d0b5d3aecb9f835822fdfe6faa1Ian Rogers    case k22x: return VRegB_22x();
25429a2648821ea4d0b5d3aecb9f835822fdfe6faa1Ian Rogers    case k23x: return VRegB_23x();
25529a2648821ea4d0b5d3aecb9f835822fdfe6faa1Ian Rogers    case k31c: return VRegB_31c();
25629a2648821ea4d0b5d3aecb9f835822fdfe6faa1Ian Rogers    case k31i: return VRegB_31i();
25729a2648821ea4d0b5d3aecb9f835822fdfe6faa1Ian Rogers    case k31t: return VRegB_31t();
25829a2648821ea4d0b5d3aecb9f835822fdfe6faa1Ian Rogers    case k32x: return VRegB_32x();
25929a2648821ea4d0b5d3aecb9f835822fdfe6faa1Ian Rogers    case k35c: return VRegB_35c();
26029a2648821ea4d0b5d3aecb9f835822fdfe6faa1Ian Rogers    case k3rc: return VRegB_3rc();
26129a2648821ea4d0b5d3aecb9f835822fdfe6faa1Ian Rogers    case k51l: return VRegB_51l();
26229a2648821ea4d0b5d3aecb9f835822fdfe6faa1Ian Rogers    default:
26329a2648821ea4d0b5d3aecb9f835822fdfe6faa1Ian Rogers      LOG(FATAL) << "Tried to access vB of instruction " << Name() << " which has no B operand.";
26429a2648821ea4d0b5d3aecb9f835822fdfe6faa1Ian Rogers      exit(EXIT_FAILURE);
26529a2648821ea4d0b5d3aecb9f835822fdfe6faa1Ian Rogers  }
26629a2648821ea4d0b5d3aecb9f835822fdfe6faa1Ian Rogers}
26729a2648821ea4d0b5d3aecb9f835822fdfe6faa1Ian Rogers
26829a2648821ea4d0b5d3aecb9f835822fdfe6faa1Ian Rogersinline uint64_t Instruction::WideVRegB() const {
26929a2648821ea4d0b5d3aecb9f835822fdfe6faa1Ian Rogers  return VRegB_51l();
27029a2648821ea4d0b5d3aecb9f835822fdfe6faa1Ian Rogers}
27129a2648821ea4d0b5d3aecb9f835822fdfe6faa1Ian Rogers
2723b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertzinline int4_t Instruction::VRegB_11n(uint16_t inst_data) const {
273807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  DCHECK_EQ(FormatOf(Opcode()), k11n);
2743b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz  return static_cast<int4_t>((InstB(inst_data) << 28) >> 28);
275807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz}
276807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz
2773b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertzinline uint4_t Instruction::VRegB_12x(uint16_t inst_data) const {
278807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  DCHECK_EQ(FormatOf(Opcode()), k12x);
2793b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz  return InstB(inst_data);
280807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz}
281807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz
282807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertzinline uint16_t Instruction::VRegB_21c() const {
283807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  DCHECK_EQ(FormatOf(Opcode()), k21c);
284807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  return Fetch16(1);
285807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz}
286807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz
287807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertzinline uint16_t Instruction::VRegB_21h() const {
288807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  DCHECK_EQ(FormatOf(Opcode()), k21h);
289807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  return Fetch16(1);
290807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz}
291807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz
292807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertzinline int16_t Instruction::VRegB_21s() const {
293807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  DCHECK_EQ(FormatOf(Opcode()), k21s);
294807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  return static_cast<int16_t>(Fetch16(1));
295807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz}
296807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz
297807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertzinline int16_t Instruction::VRegB_21t() const {
298807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  DCHECK_EQ(FormatOf(Opcode()), k21t);
299807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  return static_cast<int16_t>(Fetch16(1));
300807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz}
301807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz
302807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertzinline uint8_t Instruction::VRegB_22b() const {
303807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  DCHECK_EQ(FormatOf(Opcode()), k22b);
304807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  return static_cast<uint8_t>(Fetch16(1) & 0xff);
305807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz}
306807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz
3073b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertzinline uint4_t Instruction::VRegB_22c(uint16_t inst_data) const {
308807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  DCHECK_EQ(FormatOf(Opcode()), k22c);
3093b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz  return InstB(inst_data);
310807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz}
311807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz
3123b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertzinline uint4_t Instruction::VRegB_22s(uint16_t inst_data) const {
313807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  DCHECK_EQ(FormatOf(Opcode()), k22s);
3143b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz  return InstB(inst_data);
315807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz}
316807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz
3173b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertzinline uint4_t Instruction::VRegB_22t(uint16_t inst_data) const {
318807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  DCHECK_EQ(FormatOf(Opcode()), k22t);
3193b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz  return InstB(inst_data);
320807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz}
321807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz
322807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertzinline uint16_t Instruction::VRegB_22x() const {
323807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  DCHECK_EQ(FormatOf(Opcode()), k22x);
324807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  return Fetch16(1);
325807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz}
326807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz
327807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertzinline uint8_t Instruction::VRegB_23x() const {
328807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  DCHECK_EQ(FormatOf(Opcode()), k23x);
329807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  return static_cast<uint8_t>(Fetch16(1) & 0xff);
330807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz}
331807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz
332807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertzinline uint32_t Instruction::VRegB_31c() const {
333807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  DCHECK_EQ(FormatOf(Opcode()), k31c);
334807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  return Fetch32(1);
335807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz}
336807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz
337807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertzinline int32_t Instruction::VRegB_31i() const {
338807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  DCHECK_EQ(FormatOf(Opcode()), k31i);
339807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  return static_cast<int32_t>(Fetch32(1));
340807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz}
341807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz
342807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertzinline int32_t Instruction::VRegB_31t() const {
343807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  DCHECK_EQ(FormatOf(Opcode()), k31t);
344807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  return static_cast<int32_t>(Fetch32(1));
345807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz}
346807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz
347807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertzinline uint16_t Instruction::VRegB_32x() const {
348807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  DCHECK_EQ(FormatOf(Opcode()), k32x);
349807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  return Fetch16(2);
350807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz}
351807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz
352807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertzinline uint16_t Instruction::VRegB_35c() const {
353807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  DCHECK_EQ(FormatOf(Opcode()), k35c);
354807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  return Fetch16(1);
355807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz}
356807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz
357807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertzinline uint16_t Instruction::VRegB_3rc() const {
358807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  DCHECK_EQ(FormatOf(Opcode()), k3rc);
359807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  return Fetch16(1);
360807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz}
361807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz
362807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertzinline uint64_t Instruction::VRegB_51l() const {
363807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  DCHECK_EQ(FormatOf(Opcode()), k51l);
364807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  uint64_t vB_wide = Fetch32(1) | ((uint64_t) Fetch32(3) << 32);
365807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  return vB_wide;
366807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz}
367807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz
368807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz//------------------------------------------------------------------------------
369807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz// VRegC
370807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz//------------------------------------------------------------------------------
37129a2648821ea4d0b5d3aecb9f835822fdfe6faa1Ian Rogersinline bool Instruction::HasVRegC() const {
37229a2648821ea4d0b5d3aecb9f835822fdfe6faa1Ian Rogers  switch (FormatOf(Opcode())) {
37329a2648821ea4d0b5d3aecb9f835822fdfe6faa1Ian Rogers    case k22b: return true;
37429a2648821ea4d0b5d3aecb9f835822fdfe6faa1Ian Rogers    case k22c: return true;
37529a2648821ea4d0b5d3aecb9f835822fdfe6faa1Ian Rogers    case k22s: return true;
37629a2648821ea4d0b5d3aecb9f835822fdfe6faa1Ian Rogers    case k22t: return true;
37729a2648821ea4d0b5d3aecb9f835822fdfe6faa1Ian Rogers    case k23x: return true;
37829a2648821ea4d0b5d3aecb9f835822fdfe6faa1Ian Rogers    case k35c: return true;
37929a2648821ea4d0b5d3aecb9f835822fdfe6faa1Ian Rogers    case k3rc: return true;
38029a2648821ea4d0b5d3aecb9f835822fdfe6faa1Ian Rogers    default: return false;
38129a2648821ea4d0b5d3aecb9f835822fdfe6faa1Ian Rogers  }
38229a2648821ea4d0b5d3aecb9f835822fdfe6faa1Ian Rogers}
38329a2648821ea4d0b5d3aecb9f835822fdfe6faa1Ian Rogers
38429a2648821ea4d0b5d3aecb9f835822fdfe6faa1Ian Rogersinline int32_t Instruction::VRegC() const {
38529a2648821ea4d0b5d3aecb9f835822fdfe6faa1Ian Rogers  switch (FormatOf(Opcode())) {
38629a2648821ea4d0b5d3aecb9f835822fdfe6faa1Ian Rogers    case k22b: return VRegC_22b();
38729a2648821ea4d0b5d3aecb9f835822fdfe6faa1Ian Rogers    case k22c: return VRegC_22c();
38829a2648821ea4d0b5d3aecb9f835822fdfe6faa1Ian Rogers    case k22s: return VRegC_22s();
38929a2648821ea4d0b5d3aecb9f835822fdfe6faa1Ian Rogers    case k22t: return VRegC_22t();
39029a2648821ea4d0b5d3aecb9f835822fdfe6faa1Ian Rogers    case k23x: return VRegC_23x();
39129a2648821ea4d0b5d3aecb9f835822fdfe6faa1Ian Rogers    case k35c: return VRegC_35c();
39229a2648821ea4d0b5d3aecb9f835822fdfe6faa1Ian Rogers    case k3rc: return VRegC_3rc();
39329a2648821ea4d0b5d3aecb9f835822fdfe6faa1Ian Rogers    default:
39429a2648821ea4d0b5d3aecb9f835822fdfe6faa1Ian Rogers      LOG(FATAL) << "Tried to access vC of instruction " << Name() << " which has no C operand.";
39529a2648821ea4d0b5d3aecb9f835822fdfe6faa1Ian Rogers      exit(EXIT_FAILURE);
39629a2648821ea4d0b5d3aecb9f835822fdfe6faa1Ian Rogers  }
39729a2648821ea4d0b5d3aecb9f835822fdfe6faa1Ian Rogers}
39829a2648821ea4d0b5d3aecb9f835822fdfe6faa1Ian Rogers
399807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertzinline int8_t Instruction::VRegC_22b() const {
400807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  DCHECK_EQ(FormatOf(Opcode()), k22b);
401807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  return static_cast<int8_t>(Fetch16(1) >> 8);
402807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz}
403807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz
404807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertzinline uint16_t Instruction::VRegC_22c() const {
405807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  DCHECK_EQ(FormatOf(Opcode()), k22c);
406807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  return Fetch16(1);
407807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz}
408807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz
409807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertzinline int16_t Instruction::VRegC_22s() const {
410807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  DCHECK_EQ(FormatOf(Opcode()), k22s);
411807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  return static_cast<int16_t>(Fetch16(1));
412807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz}
413807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz
414807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertzinline int16_t Instruction::VRegC_22t() const {
415807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  DCHECK_EQ(FormatOf(Opcode()), k22t);
416807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  return static_cast<int16_t>(Fetch16(1));
417807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz}
418807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz
419807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertzinline uint8_t Instruction::VRegC_23x() const {
420807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  DCHECK_EQ(FormatOf(Opcode()), k23x);
421807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  return static_cast<uint8_t>(Fetch16(1) >> 8);
422807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz}
423807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz
424807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertzinline uint4_t Instruction::VRegC_35c() const {
425807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  DCHECK_EQ(FormatOf(Opcode()), k35c);
426807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  return static_cast<uint4_t>(Fetch16(2) & 0x0f);
427807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz}
428807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz
429807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertzinline uint16_t Instruction::VRegC_3rc() const {
430807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  DCHECK_EQ(FormatOf(Opcode()), k3rc);
431807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  return Fetch16(2);
432807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz}
433807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz
43429a2648821ea4d0b5d3aecb9f835822fdfe6faa1Ian Rogersinline bool Instruction::HasVarArgs() const {
43529a2648821ea4d0b5d3aecb9f835822fdfe6faa1Ian Rogers  return FormatOf(Opcode()) == k35c;
43629a2648821ea4d0b5d3aecb9f835822fdfe6faa1Ian Rogers}
43729a2648821ea4d0b5d3aecb9f835822fdfe6faa1Ian Rogers
43829a2648821ea4d0b5d3aecb9f835822fdfe6faa1Ian Rogersinline void Instruction::GetVarArgs(uint32_t arg[5], uint16_t inst_data) const {
439807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  DCHECK_EQ(FormatOf(Opcode()), k35c);
440807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz
441807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  /*
442807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz   * Note that the fields mentioned in the spec don't appear in
443807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz   * their "usual" positions here compared to most formats. This
444807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz   * was done so that the field names for the argument count and
445807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz   * reference index match between this format and the corresponding
446807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz   * range formats (3rc and friends).
447807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz   *
448807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz   * Bottom line: The argument count is always in vA, and the
449807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz   * method constant (or equivalent) is always in vB.
450807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz   */
451807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  uint16_t regList = Fetch16(2);
452c61124bdeaae94f977ffc36ac69535e792c226f2Sebastien Hertz  uint4_t count = InstB(inst_data);  // This is labeled A in the spec.
453c61124bdeaae94f977ffc36ac69535e792c226f2Sebastien Hertz  DCHECK_LE(count, 5U) << "Invalid arg count in 35c (" << count << ")";
454807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz
455807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  /*
456807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz   * Copy the argument registers into the arg[] array, and
457807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz   * also copy the first argument (if any) into vC. (The
458807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz   * DecodedInstruction structure doesn't have separate
459807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz   * fields for {vD, vE, vF, vG}, so there's no need to make
460807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz   * copies of those.) Note that cases 5..2 fall through.
461807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz   */
462807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  switch (count) {
463fc787ecd91127b2c8458afd94e5148e2ae51a1f5Ian Rogers    case 5:
464fc787ecd91127b2c8458afd94e5148e2ae51a1f5Ian Rogers      arg[4] = InstA(inst_data);
465fc787ecd91127b2c8458afd94e5148e2ae51a1f5Ian Rogers      FALLTHROUGH_INTENDED;
466fc787ecd91127b2c8458afd94e5148e2ae51a1f5Ian Rogers    case 4:
467fc787ecd91127b2c8458afd94e5148e2ae51a1f5Ian Rogers      arg[3] = (regList >> 12) & 0x0f;
468fc787ecd91127b2c8458afd94e5148e2ae51a1f5Ian Rogers      FALLTHROUGH_INTENDED;
469fc787ecd91127b2c8458afd94e5148e2ae51a1f5Ian Rogers    case 3:
470fc787ecd91127b2c8458afd94e5148e2ae51a1f5Ian Rogers      arg[2] = (regList >> 8) & 0x0f;
471fc787ecd91127b2c8458afd94e5148e2ae51a1f5Ian Rogers      FALLTHROUGH_INTENDED;
472fc787ecd91127b2c8458afd94e5148e2ae51a1f5Ian Rogers    case 2:
473fc787ecd91127b2c8458afd94e5148e2ae51a1f5Ian Rogers      arg[1] = (regList >> 4) & 0x0f;
474fc787ecd91127b2c8458afd94e5148e2ae51a1f5Ian Rogers      FALLTHROUGH_INTENDED;
475fc787ecd91127b2c8458afd94e5148e2ae51a1f5Ian Rogers    case 1:
476fc787ecd91127b2c8458afd94e5148e2ae51a1f5Ian Rogers      arg[0] = regList & 0x0f;
477fc787ecd91127b2c8458afd94e5148e2ae51a1f5Ian Rogers      break;
478c61124bdeaae94f977ffc36ac69535e792c226f2Sebastien Hertz    default:  // case 0
479c61124bdeaae94f977ffc36ac69535e792c226f2Sebastien Hertz      break;  // Valid, but no need to do anything.
480807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz  }
481807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz}
482807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz
4837934ac288acfb2552bb0b06ec1f61e5820d924a4Brian Carlstrom}  // namespace art
484807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz
485fc0e3219edc9a5bf81b166e82fd5db2796eb6a0dBrian Carlstrom#endif  // ART_RUNTIME_DEX_INSTRUCTION_INL_H_
486