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