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