dex_instruction-inl.h revision 5243e912875026f99428088db7e80cb11651d64e
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 17807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz#ifndef ART_SRC_DEX_INSTRUCTION_INL_H_ 18807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz#define ART_SRC_DEX_INSTRUCTION_INL_H_ 19807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz 20807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz#include "dex_instruction.h" 21807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz 22807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertznamespace art { 23807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz 249cec247849c248f6c45a14eae5414b69eb8fc67dJeff Haoinline const Instruction* Instruction::Next_51l() const { 259cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao DCHECK_EQ(FormatOf(Opcode()), k51l); 269cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao size_t current_size_in_bytes = 5 * sizeof(uint16_t); 279cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao const uint8_t* ptr = reinterpret_cast<const uint8_t*>(this); 289cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao return reinterpret_cast<const Instruction*>(ptr + current_size_in_bytes); 299cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao} 309cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao 31807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz//------------------------------------------------------------------------------ 32807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz// VRegA 33807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz//------------------------------------------------------------------------------ 34807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertzinline int8_t Instruction::VRegA_10t() const { 35807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz DCHECK_EQ(FormatOf(Opcode()), k10t); 36807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz return static_cast<int8_t>(InstAA()); 37807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz} 38807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz 395243e912875026f99428088db7e80cb11651d64eSebastien Hertzinline uint8_t Instruction::VRegA_10x() const { 405243e912875026f99428088db7e80cb11651d64eSebastien Hertz DCHECK_EQ(FormatOf(Opcode()), k10x); 415243e912875026f99428088db7e80cb11651d64eSebastien Hertz return InstAA(); 425243e912875026f99428088db7e80cb11651d64eSebastien Hertz} 435243e912875026f99428088db7e80cb11651d64eSebastien Hertz 44807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertzinline uint4_t Instruction::VRegA_11n() const { 45807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz DCHECK_EQ(FormatOf(Opcode()), k11n); 46807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz return InstA(); 47807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz} 48807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz 49807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertzinline uint8_t Instruction::VRegA_11x() const { 50807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz DCHECK_EQ(FormatOf(Opcode()), k11x); 51807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz return InstAA(); 52807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz} 53807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz 54807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertzinline uint4_t Instruction::VRegA_12x() const { 55807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz DCHECK_EQ(FormatOf(Opcode()), k12x); 56807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz return InstA(); 57807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz} 58807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz 59807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertzinline int16_t Instruction::VRegA_20t() const { 60807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz DCHECK_EQ(FormatOf(Opcode()), k20t); 61807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz return static_cast<int16_t>(Fetch16(1)); 62807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz} 63807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz 64807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertzinline uint8_t Instruction::VRegA_21c() const { 65807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz DCHECK_EQ(FormatOf(Opcode()), k21c); 66807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz return InstAA(); 67807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz} 68807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz 69807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertzinline uint8_t Instruction::VRegA_21h() const { 70807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz DCHECK_EQ(FormatOf(Opcode()), k21h); 71807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz return InstAA(); 72807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz} 73807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz 74807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertzinline uint8_t Instruction::VRegA_21s() const { 75807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz DCHECK_EQ(FormatOf(Opcode()), k21s); 76807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz return InstAA(); 77807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz} 78807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz 79807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertzinline uint8_t Instruction::VRegA_21t() const { 80807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz DCHECK_EQ(FormatOf(Opcode()), k21t); 81807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz return InstAA(); 82807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz} 83807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz 84807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertzinline uint8_t Instruction::VRegA_22b() const { 85807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz DCHECK_EQ(FormatOf(Opcode()), k22b); 86807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz return InstAA(); 87807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz} 88807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz 89807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertzinline uint4_t Instruction::VRegA_22c() const { 90807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz DCHECK_EQ(FormatOf(Opcode()), k22c); 91807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz return InstA(); 92807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz} 93807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz 94807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertzinline uint4_t Instruction::VRegA_22s() const { 95807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz DCHECK_EQ(FormatOf(Opcode()), k22s); 96807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz return InstA(); 97807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz} 98807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz 99807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertzinline uint4_t Instruction::VRegA_22t() const { 100807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz DCHECK_EQ(FormatOf(Opcode()), k22t); 101807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz return InstA(); 102807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz} 103807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz 104807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertzinline uint8_t Instruction::VRegA_22x() const { 105807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz DCHECK_EQ(FormatOf(Opcode()), k22x); 106807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz return InstAA(); 107807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz} 108807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz 109807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertzinline uint8_t Instruction::VRegA_23x() const { 110807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz DCHECK_EQ(FormatOf(Opcode()), k23x); 111807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz return InstAA(); 112807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz} 113807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz 114807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertzinline int32_t Instruction::VRegA_30t() const { 115807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz DCHECK_EQ(FormatOf(Opcode()), k30t); 116807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz return static_cast<int32_t>(Fetch32(1)); 117807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz} 118807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz 119807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertzinline uint8_t Instruction::VRegA_31c() const { 120807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz DCHECK_EQ(FormatOf(Opcode()), k31c); 121807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz return InstAA(); 122807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz} 123807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz 124807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertzinline uint8_t Instruction::VRegA_31i() const { 125807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz DCHECK_EQ(FormatOf(Opcode()), k31i); 126807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz return InstAA(); 127807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz} 128807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz 129807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertzinline uint8_t Instruction::VRegA_31t() const { 130807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz DCHECK_EQ(FormatOf(Opcode()), k31t); 131807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz return InstAA(); 132807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz} 133807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz 134807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertzinline uint16_t Instruction::VRegA_32x() const { 135807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz DCHECK_EQ(FormatOf(Opcode()), k32x); 136807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz return Fetch16(1); 137807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz} 138807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz 139807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertzinline uint4_t Instruction::VRegA_35c() const { 140807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz DCHECK_EQ(FormatOf(Opcode()), k35c); 141807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz return InstB(); // This is labeled A in the spec. 142807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz} 143807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz 144807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertzinline uint8_t Instruction::VRegA_3rc() const { 145807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz DCHECK_EQ(FormatOf(Opcode()), k3rc); 146807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz return InstAA(); 147807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz} 148807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz 149807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertzinline uint8_t Instruction::VRegA_51l() const { 150807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz DCHECK_EQ(FormatOf(Opcode()), k51l); 151807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz return InstAA(); 152807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz} 153807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz 154807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz//------------------------------------------------------------------------------ 155807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz// VRegB 156807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz//------------------------------------------------------------------------------ 157807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertzinline int4_t Instruction::VRegB_11n() const { 158807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz DCHECK_EQ(FormatOf(Opcode()), k11n); 159807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz return static_cast<int4_t>((InstB() << 28) >> 28); 160807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz} 161807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz 162807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertzinline uint4_t Instruction::VRegB_12x() const { 163807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz DCHECK_EQ(FormatOf(Opcode()), k12x); 164807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz return InstB(); 165807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz} 166807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz 167807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertzinline uint16_t Instruction::VRegB_21c() const { 168807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz DCHECK_EQ(FormatOf(Opcode()), k21c); 169807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz return Fetch16(1); 170807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz} 171807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz 172807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertzinline uint16_t Instruction::VRegB_21h() const { 173807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz DCHECK_EQ(FormatOf(Opcode()), k21h); 174807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz return Fetch16(1); 175807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz} 176807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz 177807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertzinline int16_t Instruction::VRegB_21s() const { 178807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz DCHECK_EQ(FormatOf(Opcode()), k21s); 179807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz return static_cast<int16_t>(Fetch16(1)); 180807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz} 181807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz 182807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertzinline int16_t Instruction::VRegB_21t() const { 183807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz DCHECK_EQ(FormatOf(Opcode()), k21t); 184807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz return static_cast<int16_t>(Fetch16(1)); 185807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz} 186807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz 187807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertzinline uint8_t Instruction::VRegB_22b() const { 188807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz DCHECK_EQ(FormatOf(Opcode()), k22b); 189807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz return static_cast<uint8_t>(Fetch16(1) & 0xff); 190807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz} 191807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz 192807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertzinline uint4_t Instruction::VRegB_22c() const { 193807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz DCHECK_EQ(FormatOf(Opcode()), k22c); 194807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz return InstB(); 195807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz} 196807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz 197807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertzinline uint4_t Instruction::VRegB_22s() const { 198807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz DCHECK_EQ(FormatOf(Opcode()), k22s); 199807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz return InstB(); 200807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz} 201807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz 202807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertzinline uint4_t Instruction::VRegB_22t() const { 203807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz DCHECK_EQ(FormatOf(Opcode()), k22t); 204807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz return InstB(); 205807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz} 206807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz 207807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertzinline uint16_t Instruction::VRegB_22x() const { 208807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz DCHECK_EQ(FormatOf(Opcode()), k22x); 209807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz return Fetch16(1); 210807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz} 211807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz 212807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertzinline uint8_t Instruction::VRegB_23x() const { 213807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz DCHECK_EQ(FormatOf(Opcode()), k23x); 214807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz return static_cast<uint8_t>(Fetch16(1) & 0xff); 215807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz} 216807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz 217807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertzinline uint32_t Instruction::VRegB_31c() const { 218807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz DCHECK_EQ(FormatOf(Opcode()), k31c); 219807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz return Fetch32(1); 220807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz} 221807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz 222807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertzinline int32_t Instruction::VRegB_31i() const { 223807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz DCHECK_EQ(FormatOf(Opcode()), k31i); 224807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz return static_cast<int32_t>(Fetch32(1)); 225807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz} 226807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz 227807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertzinline int32_t Instruction::VRegB_31t() const { 228807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz DCHECK_EQ(FormatOf(Opcode()), k31t); 229807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz return static_cast<int32_t>(Fetch32(1)); 230807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz} 231807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz 232807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertzinline uint16_t Instruction::VRegB_32x() const { 233807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz DCHECK_EQ(FormatOf(Opcode()), k32x); 234807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz return Fetch16(2); 235807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz} 236807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz 237807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertzinline uint16_t Instruction::VRegB_35c() const { 238807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz DCHECK_EQ(FormatOf(Opcode()), k35c); 239807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz return Fetch16(1); 240807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz} 241807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz 242807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertzinline uint16_t Instruction::VRegB_3rc() const { 243807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz DCHECK_EQ(FormatOf(Opcode()), k3rc); 244807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz return Fetch16(1); 245807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz} 246807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz 247807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertzinline uint64_t Instruction::VRegB_51l() const { 248807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz DCHECK_EQ(FormatOf(Opcode()), k51l); 249807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz uint64_t vB_wide = Fetch32(1) | ((uint64_t) Fetch32(3) << 32); 250807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz return vB_wide; 251807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz} 252807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz 253807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz//------------------------------------------------------------------------------ 254807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz// VRegC 255807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz//------------------------------------------------------------------------------ 256807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertzinline int8_t Instruction::VRegC_22b() const { 257807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz DCHECK_EQ(FormatOf(Opcode()), k22b); 258807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz return static_cast<int8_t>(Fetch16(1) >> 8); 259807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz} 260807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz 261807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertzinline uint16_t Instruction::VRegC_22c() const { 262807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz DCHECK_EQ(FormatOf(Opcode()), k22c); 263807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz return Fetch16(1); 264807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz} 265807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz 266807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertzinline int16_t Instruction::VRegC_22s() const { 267807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz DCHECK_EQ(FormatOf(Opcode()), k22s); 268807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz return static_cast<int16_t>(Fetch16(1)); 269807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz} 270807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz 271807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertzinline int16_t Instruction::VRegC_22t() const { 272807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz DCHECK_EQ(FormatOf(Opcode()), k22t); 273807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz return static_cast<int16_t>(Fetch16(1)); 274807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz} 275807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz 276807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertzinline uint8_t Instruction::VRegC_23x() const { 277807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz DCHECK_EQ(FormatOf(Opcode()), k23x); 278807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz return static_cast<uint8_t>(Fetch16(1) >> 8); 279807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz} 280807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz 281807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertzinline uint4_t Instruction::VRegC_35c() const { 282807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz DCHECK_EQ(FormatOf(Opcode()), k35c); 283807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz return static_cast<uint4_t>(Fetch16(2) & 0x0f); 284807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz} 285807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz 286807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertzinline uint16_t Instruction::VRegC_3rc() const { 287807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz DCHECK_EQ(FormatOf(Opcode()), k3rc); 288807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz return Fetch16(2); 289807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz} 290807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz 291807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertzinline void Instruction::GetArgs(uint32_t arg[5]) const { 292807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz DCHECK_EQ(FormatOf(Opcode()), k35c); 293807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz 294807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz /* 295807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz * Note that the fields mentioned in the spec don't appear in 296807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz * their "usual" positions here compared to most formats. This 297807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz * was done so that the field names for the argument count and 298807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz * reference index match between this format and the corresponding 299807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz * range formats (3rc and friends). 300807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz * 301807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz * Bottom line: The argument count is always in vA, and the 302807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz * method constant (or equivalent) is always in vB. 303807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz */ 304807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz uint16_t regList = Fetch16(2); 305807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz uint4_t count = InstB(); // This is labeled A in the spec. 306807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz 307807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz /* 308807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz * Copy the argument registers into the arg[] array, and 309807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz * also copy the first argument (if any) into vC. (The 310807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz * DecodedInstruction structure doesn't have separate 311807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz * fields for {vD, vE, vF, vG}, so there's no need to make 312807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz * copies of those.) Note that cases 5..2 fall through. 313807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz */ 314807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz switch (count) { 315807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz case 5: arg[4] = InstA(); 316807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz case 4: arg[3] = (regList >> 12) & 0x0f; 317807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz case 3: arg[2] = (regList >> 8) & 0x0f; 318807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz case 2: arg[1] = (regList >> 4) & 0x0f; 319807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz case 1: arg[0] = regList & 0x0f; break; 320807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz case 0: break; // Valid, but no need to do anything. 321807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz default: 322807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz LOG(ERROR) << "Invalid arg count in 35c (" << count << ")"; 323807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz return; 324807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz } 325807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz} 326807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz 327807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz} // namespace art 328807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz 329807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz#endif // ART_SRC_DEX_INSTRUCTION_INL_H_ 330