1f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 2f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Copyright (C) 2007 The Android Open Source Project 3f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 4f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 5f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * you may not use this file except in compliance with the License. 6f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * You may obtain a copy of the License at 7f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 8f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 9f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 10f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 11f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 12f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * See the License for the specific language governing permissions and 14f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * limitations under the License. 15f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 16f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 17f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectpackage com.android.dx.dex.code; 18f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 19f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport com.android.dx.rop.code.RegisterSpec; 20f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport com.android.dx.rop.code.RegisterSpecList; 21f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport com.android.dx.rop.code.SourcePosition; 2232631e6ee656840701f76e0d736290bfcd4aab7emikaelpeltierimport com.android.dx.ssa.RegisterMapper; 23f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport com.android.dx.util.AnnotatedOutput; 24f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport com.android.dx.util.Hex; 25f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport com.android.dx.util.TwoColumnOutput; 2632631e6ee656840701f76e0d736290bfcd4aab7emikaelpeltier 27dd79e4e11fa20d6677b70ce6618a8653a1f3520djeffhaoimport java.util.BitSet; 28dd79e4e11fa20d6677b70ce6618a8653a1f3520djeffhao 29f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/** 30f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Base class for Dalvik instructions. 31f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 32f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectpublic abstract class DalvInsn { 33f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 34f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * the actual output address of this instance, if known, or 35de75089fb7216d19e9c22cce4dc62a49513477d3Carl Shapiro * {@code -1} if not 36f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 37f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project private int address; 38f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 39f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** the opcode; one of the constants from {@link Dops} */ 40f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project private final Dop opcode; 41f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 4299409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project /** {@code non-null;} source position */ 43f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project private final SourcePosition position; 44f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 4599409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project /** {@code non-null;} list of register arguments */ 46f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project private final RegisterSpecList registers; 47f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 48f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 49f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Makes a move instruction, appropriate and ideal for the given arguments. 50de75089fb7216d19e9c22cce4dc62a49513477d3Carl Shapiro * 5199409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project * @param position {@code non-null;} source position information 5299409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project * @param dest {@code non-null;} destination register 5399409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project * @param src {@code non-null;} source register 5499409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project * @return {@code non-null;} an appropriately-constructed instance 55f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 56f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public static SimpleInsn makeMove(SourcePosition position, 57f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project RegisterSpec dest, RegisterSpec src) { 58f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project boolean category1 = dest.getCategory() == 1; 59f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project boolean reference = dest.getType().isReference(); 60f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project int destReg = dest.getReg(); 61f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project int srcReg = src.getReg(); 62f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Dop opcode; 63f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 64f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if ((srcReg | destReg) < 16) { 65f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project opcode = reference ? Dops.MOVE_OBJECT : 66f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project (category1 ? Dops.MOVE : Dops.MOVE_WIDE); 67f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } else if (destReg < 256) { 68f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project opcode = reference ? Dops.MOVE_OBJECT_FROM16 : 69f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project (category1 ? Dops.MOVE_FROM16 : Dops.MOVE_WIDE_FROM16); 70f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } else { 71f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project opcode = reference ? Dops.MOVE_OBJECT_16 : 72f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project (category1 ? Dops.MOVE_16 : Dops.MOVE_WIDE_16); 73f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 74f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 75f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return new SimpleInsn(opcode, position, 76f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project RegisterSpecList.make(dest, src)); 77f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 78f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 79f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 80f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Constructs an instance. The output address of this instance is initially 8199409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project * unknown ({@code -1}). 82de75089fb7216d19e9c22cce4dc62a49513477d3Carl Shapiro * 83f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * <p><b>Note:</b> In the unlikely event that an instruction takes 8499409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project * absolutely no registers (e.g., a {@code nop} or a 85f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * no-argument no-result static method call), then the given 86f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * register list may be passed as {@link 87f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * RegisterSpecList#EMPTY}.</p> 88de75089fb7216d19e9c22cce4dc62a49513477d3Carl Shapiro * 89f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @param opcode the opcode; one of the constants from {@link Dops} 9099409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project * @param position {@code non-null;} source position 9199409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project * @param registers {@code non-null;} register list, including a 92f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * result register if appropriate (that is, registers may be either 93f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * ins and outs) 94f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 95f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public DalvInsn(Dop opcode, SourcePosition position, 96f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project RegisterSpecList registers) { 97f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (opcode == null) { 98f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project throw new NullPointerException("opcode == null"); 99f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 100f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 101f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (position == null) { 102f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project throw new NullPointerException("position == null"); 103f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 104f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 105f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (registers == null) { 106f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project throw new NullPointerException("registers == null"); 107f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 108f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 109f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project this.address = -1; 110f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project this.opcode = opcode; 111f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project this.position = position; 112f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project this.registers = registers; 113f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 114f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 115f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** {@inheritDoc} */ 116f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @Override 117f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public final String toString() { 118f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project StringBuffer sb = new StringBuffer(100); 119f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 120f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project sb.append(identifierString()); 121f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project sb.append(' '); 122f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project sb.append(position); 123f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 124f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project sb.append(": "); 125f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project sb.append(opcode.getName()); 126f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 127f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project boolean needComma = false; 128f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (registers.size() != 0) { 129f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project sb.append(registers.toHuman(" ", ", ", null)); 130f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project needComma = true; 131f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 132f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 133f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project String extra = argString(); 134f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (extra != null) { 135f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (needComma) { 136f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project sb.append(','); 137f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 138f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project sb.append(' '); 139f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project sb.append(extra); 140f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 141f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 142f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return sb.toString(); 143f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 144f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 145f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 146f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Gets whether the address of this instruction is known. 147de75089fb7216d19e9c22cce4dc62a49513477d3Carl Shapiro * 148f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @see #getAddress 149f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @see #setAddress 150f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 151f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public final boolean hasAddress() { 152f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return (address >= 0); 153f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 154f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 155f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 156f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Gets the output address of this instruction, if it is known. This throws 15799409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project * a {@code RuntimeException} if it has not yet been set. 158de75089fb7216d19e9c22cce4dc62a49513477d3Carl Shapiro * 159f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @see #setAddress 160de75089fb7216d19e9c22cce4dc62a49513477d3Carl Shapiro * 16199409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project * @return {@code >= 0;} the output address 162f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 163f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public final int getAddress() { 164f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (address < 0) { 165f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project throw new RuntimeException("address not yet known"); 166f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 167f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 168f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return address; 169f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 170f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 171f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 172f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Gets the opcode. 173de75089fb7216d19e9c22cce4dc62a49513477d3Carl Shapiro * 17499409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project * @return {@code non-null;} the opcode 175f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 176f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public final Dop getOpcode() { 177f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return opcode; 178f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 179f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 180f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 181f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Gets the source position. 182de75089fb7216d19e9c22cce4dc62a49513477d3Carl Shapiro * 18399409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project * @return {@code non-null;} the source position 184f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 185f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public final SourcePosition getPosition() { 186f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return position; 187f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 188f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 189f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 190f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Gets the register list for this instruction. 191de75089fb7216d19e9c22cce4dc62a49513477d3Carl Shapiro * 19299409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project * @return {@code non-null;} the registers 193f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 194f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public final RegisterSpecList getRegisters() { 195f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return registers; 196f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 197f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 198f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 199f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Returns whether this instance's opcode uses a result register. 200f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * This method is a convenient shorthand for 20199409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project * {@code getOpcode().hasResult()}. 202de75089fb7216d19e9c22cce4dc62a49513477d3Carl Shapiro * 20399409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project * @return {@code true} iff this opcode uses a result register 204f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 205f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public final boolean hasResult() { 206f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return opcode.hasResult(); 207f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 208f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 209f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 210f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Gets the minimum distinct registers required for this instruction. 211dd79e4e11fa20d6677b70ce6618a8653a1f3520djeffhao * Uses the given BitSet to determine which registers require 212dd79e4e11fa20d6677b70ce6618a8653a1f3520djeffhao * replacement, and ignores registers that are already compatible. 213f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * This assumes that the result (if any) can share registers with the 214f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * sources (if any), that each source register is unique, and that 215f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * (to be explicit here) category-2 values take up two consecutive 216f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * registers. 217de75089fb7216d19e9c22cce4dc62a49513477d3Carl Shapiro * 218dd79e4e11fa20d6677b70ce6618a8653a1f3520djeffhao * @param compatRegs {@code non-null;} set of compatible registers 21999409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project * @return {@code >= 0;} the minimum distinct register requirement 220f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 221dd79e4e11fa20d6677b70ce6618a8653a1f3520djeffhao public final int getMinimumRegisterRequirement(BitSet compatRegs) { 222f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project boolean hasResult = hasResult(); 223f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project int regSz = registers.size(); 224dd79e4e11fa20d6677b70ce6618a8653a1f3520djeffhao int resultRequirement = 0; 225f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project int sourceRequirement = 0; 226f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 227dd79e4e11fa20d6677b70ce6618a8653a1f3520djeffhao if (hasResult && !compatRegs.get(0)) { 228dd79e4e11fa20d6677b70ce6618a8653a1f3520djeffhao resultRequirement = registers.get(0).getCategory(); 229dd79e4e11fa20d6677b70ce6618a8653a1f3520djeffhao } 230dd79e4e11fa20d6677b70ce6618a8653a1f3520djeffhao 231f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project for (int i = hasResult ? 1 : 0; i < regSz; i++) { 232dd79e4e11fa20d6677b70ce6618a8653a1f3520djeffhao if (!compatRegs.get(i)) { 233dd79e4e11fa20d6677b70ce6618a8653a1f3520djeffhao sourceRequirement += registers.get(i).getCategory(); 234dd79e4e11fa20d6677b70ce6618a8653a1f3520djeffhao } 235f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 236f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 237f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return Math.max(sourceRequirement, resultRequirement); 238f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 239f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 240f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 241dd79e4e11fa20d6677b70ce6618a8653a1f3520djeffhao * Gets the instruction that is equivalent to this one, except that 242dd79e4e11fa20d6677b70ce6618a8653a1f3520djeffhao * it uses sequential registers starting at {@code 0} (storing 243dd79e4e11fa20d6677b70ce6618a8653a1f3520djeffhao * the result, if any, in register {@code 0} as well). 244de75089fb7216d19e9c22cce4dc62a49513477d3Carl Shapiro * 245dd79e4e11fa20d6677b70ce6618a8653a1f3520djeffhao * @return {@code non-null;} the replacement 246dd79e4e11fa20d6677b70ce6618a8653a1f3520djeffhao */ 247dd79e4e11fa20d6677b70ce6618a8653a1f3520djeffhao public DalvInsn getLowRegVersion() { 248dd79e4e11fa20d6677b70ce6618a8653a1f3520djeffhao RegisterSpecList regs = 249dd79e4e11fa20d6677b70ce6618a8653a1f3520djeffhao registers.withExpandedRegisters(0, hasResult(), null); 250dd79e4e11fa20d6677b70ce6618a8653a1f3520djeffhao return withRegisters(regs); 251dd79e4e11fa20d6677b70ce6618a8653a1f3520djeffhao } 252dd79e4e11fa20d6677b70ce6618a8653a1f3520djeffhao 253dd79e4e11fa20d6677b70ce6618a8653a1f3520djeffhao /** 254dd79e4e11fa20d6677b70ce6618a8653a1f3520djeffhao * Gets the instruction prefix required, if any, to use in an expanded 255dd79e4e11fa20d6677b70ce6618a8653a1f3520djeffhao * version of this instance. Will not generate moves for registers 256dd79e4e11fa20d6677b70ce6618a8653a1f3520djeffhao * marked compatible to the format by the given BitSet. 257dd79e4e11fa20d6677b70ce6618a8653a1f3520djeffhao * 258dd79e4e11fa20d6677b70ce6618a8653a1f3520djeffhao * @see #expandedVersion 259de75089fb7216d19e9c22cce4dc62a49513477d3Carl Shapiro * 260dd79e4e11fa20d6677b70ce6618a8653a1f3520djeffhao * @param compatRegs {@code non-null;} set of compatible registers 26199409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project * @return {@code null-ok;} the prefix, if any 262f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 263dd79e4e11fa20d6677b70ce6618a8653a1f3520djeffhao public DalvInsn expandedPrefix(BitSet compatRegs) { 264f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project RegisterSpecList regs = registers; 265dd79e4e11fa20d6677b70ce6618a8653a1f3520djeffhao boolean firstBit = compatRegs.get(0); 266f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 267dd79e4e11fa20d6677b70ce6618a8653a1f3520djeffhao if (hasResult()) compatRegs.set(0); 268dd79e4e11fa20d6677b70ce6618a8653a1f3520djeffhao 269dd79e4e11fa20d6677b70ce6618a8653a1f3520djeffhao regs = regs.subset(compatRegs); 270dd79e4e11fa20d6677b70ce6618a8653a1f3520djeffhao 271dd79e4e11fa20d6677b70ce6618a8653a1f3520djeffhao if (hasResult()) compatRegs.set(0, firstBit); 272dd79e4e11fa20d6677b70ce6618a8653a1f3520djeffhao 273dd79e4e11fa20d6677b70ce6618a8653a1f3520djeffhao if (regs.size() == 0) return null; 274f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 275f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return new HighRegisterPrefix(position, regs); 276f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 277f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 278f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 279dd79e4e11fa20d6677b70ce6618a8653a1f3520djeffhao * Gets the instruction suffix required, if any, to use in an expanded 280dd79e4e11fa20d6677b70ce6618a8653a1f3520djeffhao * version of this instance. Will not generate a move for a register 281dd79e4e11fa20d6677b70ce6618a8653a1f3520djeffhao * marked compatible to the format by the given BitSet. 282de75089fb7216d19e9c22cce4dc62a49513477d3Carl Shapiro * 283dd79e4e11fa20d6677b70ce6618a8653a1f3520djeffhao * @see #expandedVersion 284de75089fb7216d19e9c22cce4dc62a49513477d3Carl Shapiro * 285dd79e4e11fa20d6677b70ce6618a8653a1f3520djeffhao * @param compatRegs {@code non-null;} set of compatible registers 28699409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project * @return {@code null-ok;} the suffix, if any 287f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 288dd79e4e11fa20d6677b70ce6618a8653a1f3520djeffhao public DalvInsn expandedSuffix(BitSet compatRegs) { 289dd79e4e11fa20d6677b70ce6618a8653a1f3520djeffhao if (hasResult() && !compatRegs.get(0)) { 290f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project RegisterSpec r = registers.get(0); 291f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return makeMove(position, r, r.withReg(0)); 292f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } else { 293f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return null; 294f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 295f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 296f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 297f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 298f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Gets the instruction that is equivalent to this one, except that 299dd79e4e11fa20d6677b70ce6618a8653a1f3520djeffhao * it replaces incompatible registers with sequential registers 300dd79e4e11fa20d6677b70ce6618a8653a1f3520djeffhao * starting at {@code 0} (storing the result, if any, in register 301dd79e4e11fa20d6677b70ce6618a8653a1f3520djeffhao * {@code 0} as well). The sequence of instructions from 302dd79e4e11fa20d6677b70ce6618a8653a1f3520djeffhao * {@link #expandedPrefix} and {@link #expandedSuffix} (if non-null) 303dd79e4e11fa20d6677b70ce6618a8653a1f3520djeffhao * surrounding the result of a call to this method are the expanded 304dd79e4e11fa20d6677b70ce6618a8653a1f3520djeffhao * transformation of this instance, and it is guaranteed that the 305dd79e4e11fa20d6677b70ce6618a8653a1f3520djeffhao * number of low registers used will be the number returned by 306dd79e4e11fa20d6677b70ce6618a8653a1f3520djeffhao * {@link #getMinimumRegisterRequirement}. 307de75089fb7216d19e9c22cce4dc62a49513477d3Carl Shapiro * 308dd79e4e11fa20d6677b70ce6618a8653a1f3520djeffhao * @param compatRegs {@code non-null;} set of compatible registers 30999409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project * @return {@code non-null;} the replacement 310f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 311dd79e4e11fa20d6677b70ce6618a8653a1f3520djeffhao public DalvInsn expandedVersion(BitSet compatRegs) { 312de75089fb7216d19e9c22cce4dc62a49513477d3Carl Shapiro RegisterSpecList regs = 313dd79e4e11fa20d6677b70ce6618a8653a1f3520djeffhao registers.withExpandedRegisters(0, hasResult(), compatRegs); 314f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return withRegisters(regs); 315f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 316f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 317f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 318f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Gets the short identifier for this instruction. This is its 319f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * address, if assigned, or its identity hashcode if not. 320de75089fb7216d19e9c22cce4dc62a49513477d3Carl Shapiro * 32199409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project * @return {@code non-null;} the identifier 322f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 323f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public final String identifierString() { 324f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (address != -1) { 325f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return String.format("%04x", address); 326f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 327f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 328f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return Hex.u4(System.identityHashCode(this)); 329f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 330f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 331f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 332f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Returns the string form of this instance suitable for inclusion in 33399409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project * a human-oriented listing dump. This method will return {@code null} 334f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * if this instance should not appear in a listing. 335de75089fb7216d19e9c22cce4dc62a49513477d3Carl Shapiro * 33699409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project * @param prefix {@code non-null;} prefix before the address; each follow-on 337f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * line will be indented to match as well 338cdef1ee858fde291205f3da685b2720227d2d42fOrion Hodson * @param width {@code width >= 0;} the width of the output or {@code 0} for 339f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * unlimited width 340f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @param noteIndices whether to include an explicit notation of 341f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * constant pool indices 34299409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project * @return {@code null-ok;} the string form or {@code null} if this 343f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * instance should not appear in a listing 344f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 345f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public final String listingString(String prefix, int width, 346f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project boolean noteIndices) { 347f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project String insnPerSe = listingString0(noteIndices); 348f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 349f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (insnPerSe == null) { 350f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return null; 351f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 352f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 353f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project String addr = prefix + identifierString() + ": "; 354f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project int w1 = addr.length(); 355f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project int w2 = (width == 0) ? insnPerSe.length() : (width - w1); 356f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 357f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return TwoColumnOutput.toString(addr, w1, "", insnPerSe, w2); 358f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 359f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 360f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 361f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Sets the output address. 362de75089fb7216d19e9c22cce4dc62a49513477d3Carl Shapiro * 363cdef1ee858fde291205f3da685b2720227d2d42fOrion Hodson * @param address {@code address >= 0;} the output address 364f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 365f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public final void setAddress(int address) { 366f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (address < 0) { 367f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project throw new IllegalArgumentException("address < 0"); 368f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 369f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 370f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project this.address = address; 371f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 372f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 373f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 374f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Gets the address immediately after this instance. This is only 375f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * calculable if this instance's address is known, and it is equal 376f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * to the address plus the length of the instruction format of this 377f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * instance's opcode. 378de75089fb7216d19e9c22cce4dc62a49513477d3Carl Shapiro * 37999409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project * @return {@code >= 0;} the next address 380f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 381f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public final int getNextAddress() { 382f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return getAddress() + codeSize(); 383f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 384f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 385f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 38632631e6ee656840701f76e0d736290bfcd4aab7emikaelpeltier * Returns an instance that is just like this one, except that the 38732631e6ee656840701f76e0d736290bfcd4aab7emikaelpeltier * register list is mapped by using {@code mapper}. 38832631e6ee656840701f76e0d736290bfcd4aab7emikaelpeltier * 38932631e6ee656840701f76e0d736290bfcd4aab7emikaelpeltier * @param mapper {@code non-null;} used to map registers 39032631e6ee656840701f76e0d736290bfcd4aab7emikaelpeltier * @return {@code non-null;} an appropriately-constructed instance 39132631e6ee656840701f76e0d736290bfcd4aab7emikaelpeltier */ 39232631e6ee656840701f76e0d736290bfcd4aab7emikaelpeltier public DalvInsn withMapper(RegisterMapper mapper) { 39332631e6ee656840701f76e0d736290bfcd4aab7emikaelpeltier return withRegisters(mapper.map(getRegisters())); 39432631e6ee656840701f76e0d736290bfcd4aab7emikaelpeltier } 39532631e6ee656840701f76e0d736290bfcd4aab7emikaelpeltier 39632631e6ee656840701f76e0d736290bfcd4aab7emikaelpeltier /** 397f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Gets the size of this instruction, in 16-bit code units. 398de75089fb7216d19e9c22cce4dc62a49513477d3Carl Shapiro * 39999409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project * @return {@code >= 0;} the code size of this instruction 400f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 401f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public abstract int codeSize(); 402f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 403f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 404f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Writes this instance to the given output. This method should 405f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * never annotate the output. 406de75089fb7216d19e9c22cce4dc62a49513477d3Carl Shapiro * 40799409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project * @param out {@code non-null;} where to write to 408f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 409f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public abstract void writeTo(AnnotatedOutput out); 410f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 411f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 412f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Returns an instance that is just like this one, except that its 413f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * opcode is replaced by the one given, and its address is reset. 414de75089fb7216d19e9c22cce4dc62a49513477d3Carl Shapiro * 41599409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project * @param opcode {@code non-null;} the new opcode 41699409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project * @return {@code non-null;} an appropriately-constructed instance 417f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 418f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public abstract DalvInsn withOpcode(Dop opcode); 419f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 420f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 421f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Returns an instance that is just like this one, except that all 422f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * register references have been offset by the given delta, and its 423f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * address is reset. 424de75089fb7216d19e9c22cce4dc62a49513477d3Carl Shapiro * 425f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @param delta the amount to offset register references by 42699409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project * @return {@code non-null;} an appropriately-constructed instance 427f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 428f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public abstract DalvInsn withRegisterOffset(int delta); 429f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 430f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 431f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Returns an instance that is just like this one, except that the 432f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * register list is replaced by the given one, and its address is 433f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * reset. 434de75089fb7216d19e9c22cce4dc62a49513477d3Carl Shapiro * 43599409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project * @param registers {@code non-null;} new register list 43699409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project * @return {@code non-null;} an appropriately-constructed instance 437f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 438f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public abstract DalvInsn withRegisters(RegisterSpecList registers); 439f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 440f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 441f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Gets the string form for any arguments to this instance. Subclasses 442f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * must override this. 443de75089fb7216d19e9c22cce4dc62a49513477d3Carl Shapiro * 44499409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project * @return {@code null-ok;} the string version of any arguments or 44599409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project * {@code null} if there are none 446f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 447f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project protected abstract String argString(); 448f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 449f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 450f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Helper for {@link #listingString}, which returns the string 451f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * form of this instance suitable for inclusion in a 452f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * human-oriented listing dump, not including the instruction 453f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * address and without respect for any output formatting. This 45499409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project * method should return {@code null} if this instance should 455f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * not appear in a listing. 456de75089fb7216d19e9c22cce4dc62a49513477d3Carl Shapiro * 457f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @param noteIndices whether to include an explicit notation of 458f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * constant pool indices 45999409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project * @return {@code null-ok;} the listing string 460f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 461f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project protected abstract String listingString0(boolean noteIndices); 462cdef1ee858fde291205f3da685b2720227d2d42fOrion Hodson 463cdef1ee858fde291205f3da685b2720227d2d42fOrion Hodson /** 464cdef1ee858fde291205f3da685b2720227d2d42fOrion Hodson * Helper which returns the string form of the associated constants 465cdef1ee858fde291205f3da685b2720227d2d42fOrion Hodson * for inclusion in a human oriented listing dump. 466cdef1ee858fde291205f3da685b2720227d2d42fOrion Hodson * 467cdef1ee858fde291205f3da685b2720227d2d42fOrion Hodson * This method is only implemented for instructions with one or more 468cdef1ee858fde291205f3da685b2720227d2d42fOrion Hodson * constants. 469cdef1ee858fde291205f3da685b2720227d2d42fOrion Hodson * 470cdef1ee858fde291205f3da685b2720227d2d42fOrion Hodson * @return the constant as a string. 471cdef1ee858fde291205f3da685b2720227d2d42fOrion Hodson */ 472cdef1ee858fde291205f3da685b2720227d2d42fOrion Hodson public String cstString() { 473cdef1ee858fde291205f3da685b2720227d2d42fOrion Hodson throw new UnsupportedOperationException("Not supported."); 474cdef1ee858fde291205f3da685b2720227d2d42fOrion Hodson } 475cdef1ee858fde291205f3da685b2720227d2d42fOrion Hodson 476cdef1ee858fde291205f3da685b2720227d2d42fOrion Hodson /** 477cdef1ee858fde291205f3da685b2720227d2d42fOrion Hodson * Helper which returns the comment form of the associated constants 478cdef1ee858fde291205f3da685b2720227d2d42fOrion Hodson * for inclusion in a human oriented listing dump. 479cdef1ee858fde291205f3da685b2720227d2d42fOrion Hodson * 480cdef1ee858fde291205f3da685b2720227d2d42fOrion Hodson * This method is only implemented for instructions with one or more 481cdef1ee858fde291205f3da685b2720227d2d42fOrion Hodson * constants. 482cdef1ee858fde291205f3da685b2720227d2d42fOrion Hodson * 483cdef1ee858fde291205f3da685b2720227d2d42fOrion Hodson * @return the comment as a string. 484cdef1ee858fde291205f3da685b2720227d2d42fOrion Hodson */ 485cdef1ee858fde291205f3da685b2720227d2d42fOrion Hodson public String cstComment() { 486cdef1ee858fde291205f3da685b2720227d2d42fOrion Hodson throw new UnsupportedOperationException("Not supported."); 487cdef1ee858fde291205f3da685b2720227d2d42fOrion Hodson } 488f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 489