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 199f7f6a92ebec8dd12e310901301d857e2ee323daDan Bornsteinimport 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.cst.Constant; 22f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport com.android.dx.rop.cst.CstInteger; 23f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport com.android.dx.rop.cst.CstKnownNull; 24f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport com.android.dx.rop.cst.CstLiteral64; 25f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport com.android.dx.rop.cst.CstLiteralBits; 26333201833d506a3accdeac6ceb7caba8d4b95797Jesse Wilsonimport com.android.dx.rop.cst.CstString; 27f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport com.android.dx.util.AnnotatedOutput; 28f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport com.android.dx.util.Hex; 29dd79e4e11fa20d6677b70ce6618a8653a1f3520djeffhaoimport java.util.BitSet; 30dd79e4e11fa20d6677b70ce6618a8653a1f3520djeffhao 31f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/** 32f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Base class for all instruction format handlers. Instruction format 33f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * handlers know how to translate {@link DalvInsn} instances into 340bc9fdeeea3c08f66e34bcc90401b334f75e30e7Dan Bornstein * streams of code units, as well as human-oriented listing strings 35f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * representing such translations. 36f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 37f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectpublic abstract class InsnFormat { 38f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 39737fac2604600f92a47156a7f15a1f008996a7dfDan Bornstein * flag to enable/disable the new extended opcode formats; meant as a 40737fac2604600f92a47156a7f15a1f008996a7dfDan Bornstein * temporary measure until VM support for the salient opcodes is 41737fac2604600f92a47156a7f15a1f008996a7dfDan Bornstein * added. TODO: Remove this declaration when the VM can deal. 42737fac2604600f92a47156a7f15a1f008996a7dfDan Bornstein */ 43cfb32121210a260fab1c010e134738d1e32c567eDan Bornstein public static boolean ALLOW_EXTENDED_OPCODES = true; 44737fac2604600f92a47156a7f15a1f008996a7dfDan Bornstein 45737fac2604600f92a47156a7f15a1f008996a7dfDan Bornstein /** 46f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Returns the string form, suitable for inclusion in a listing 47f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * dump, of the given instruction. The instruction must be of this 48f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * instance's format for proper operation. 49f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 5099409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project * @param insn {@code non-null;} the instruction 51f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @param noteIndices whether to include an explicit notation of 52f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * constant pool indices 5399409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project * @return {@code non-null;} the string form 54f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 55f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public final String listingString(DalvInsn insn, boolean noteIndices) { 56f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project String op = insn.getOpcode().getName(); 57f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project String arg = insnArgString(insn); 58f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project String comment = insnCommentString(insn, noteIndices); 59f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project StringBuilder sb = new StringBuilder(100); 60f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 61f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project sb.append(op); 62f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 63f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (arg.length() != 0) { 64f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project sb.append(' '); 65f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project sb.append(arg); 66f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 67f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 68f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (comment.length() != 0) { 69f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project sb.append(" // "); 70f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project sb.append(comment); 71f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 72f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 73f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return sb.toString(); 74f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 75f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 76f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 77f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Returns the string form of the arguments to the given instruction. 78f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * The instruction must be of this instance's format. If the instruction 7999409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project * has no arguments, then the result should be {@code ""}, not 8099409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project * {@code null}. 81f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 82f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * <p>Subclasses must override this method.</p> 83f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 8499409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project * @param insn {@code non-null;} the instruction 8599409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project * @return {@code non-null;} the string form 86f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 87f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public abstract String insnArgString(DalvInsn insn); 88f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 89f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 90f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Returns the associated comment for the given instruction, if any. 91f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * The instruction must be of this instance's format. If the instruction 9299409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project * has no comment, then the result should be {@code ""}, not 9399409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project * {@code null}. 94f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 95f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * <p>Subclasses must override this method.</p> 96f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 9799409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project * @param insn {@code non-null;} the instruction 98f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @param noteIndices whether to include an explicit notation of 99f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * constant pool indices 10099409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project * @return {@code non-null;} the string form 101f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 102f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public abstract String insnCommentString(DalvInsn insn, 103f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project boolean noteIndices); 104f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 105f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 106f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Gets the code size of instructions that use this format. The 107f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * size is a number of 16-bit code units, not bytes. This should 108f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * throw an exception if this format is of variable size. 109f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 11099409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project * @return {@code >= 0;} the instruction length in 16-bit code units 111f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 112f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public abstract int codeSize(); 113f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 114f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 115f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Returns whether or not the given instruction's arguments will 116f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * fit in this instance's format. This includes such things as 117f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * counting register arguments, checking register ranges, and 118f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * making sure that additional arguments are of appropriate types 119f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * and are in-range. If this format has a branch target but the 120f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * instruction's branch offset is unknown, this method will simply 121f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * not check the offset. 122f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 123f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * <p>Subclasses must override this method.</p> 124f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 12599409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project * @param insn {@code non-null;} the instruction to check 12699409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project * @return {@code true} iff the instruction's arguments are 12799409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project * appropriate for this instance, or {@code false} if not 128f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 129f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public abstract boolean isCompatible(DalvInsn insn); 130f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 131f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 132dd79e4e11fa20d6677b70ce6618a8653a1f3520djeffhao * Returns which of a given instruction's registers will fit in 133dd79e4e11fa20d6677b70ce6618a8653a1f3520djeffhao * this instance's format. 134dd79e4e11fa20d6677b70ce6618a8653a1f3520djeffhao * 135dd79e4e11fa20d6677b70ce6618a8653a1f3520djeffhao * <p>The default implementation of this method always returns 136dd79e4e11fa20d6677b70ce6618a8653a1f3520djeffhao * an empty BitSet. Subclasses must override this method if they 137dd79e4e11fa20d6677b70ce6618a8653a1f3520djeffhao * have registers.</p> 138dd79e4e11fa20d6677b70ce6618a8653a1f3520djeffhao * 139dd79e4e11fa20d6677b70ce6618a8653a1f3520djeffhao * @param insn {@code non-null;} the instruction to check 140dd79e4e11fa20d6677b70ce6618a8653a1f3520djeffhao * @return {@code non-null;} a BitSet flagging registers in the 141dd79e4e11fa20d6677b70ce6618a8653a1f3520djeffhao * register list that are compatible to this format 142dd79e4e11fa20d6677b70ce6618a8653a1f3520djeffhao */ 143dd79e4e11fa20d6677b70ce6618a8653a1f3520djeffhao public BitSet compatibleRegs(DalvInsn insn) { 144dd79e4e11fa20d6677b70ce6618a8653a1f3520djeffhao return new BitSet(); 145dd79e4e11fa20d6677b70ce6618a8653a1f3520djeffhao } 146dd79e4e11fa20d6677b70ce6618a8653a1f3520djeffhao 147dd79e4e11fa20d6677b70ce6618a8653a1f3520djeffhao /** 148f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Returns whether or not the given instruction's branch offset will 14999409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project * fit in this instance's format. This always returns {@code false} 150f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * for formats that don't include a branch offset. 151f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 152f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * <p>The default implementation of this method always returns 15399409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project * {@code false}. Subclasses must override this method if they 154f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * include branch offsets.</p> 155f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 15699409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project * @param insn {@code non-null;} the instruction to check 15799409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project * @return {@code true} iff the instruction's branch offset is 15899409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project * appropriate for this instance, or {@code false} if not 159f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 160f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public boolean branchFits(TargetInsn insn) { 161f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return false; 162f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 163f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 164f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 165f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Writes the code units for the given instruction to the given 166f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * output destination. The instruction must be of this instance's format. 167f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 168f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * <p>Subclasses must override this method.</p> 169f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 17099409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project * @param out {@code non-null;} the output destination to write to 17199409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project * @param insn {@code non-null;} the instruction to write 172f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 173f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public abstract void writeTo(AnnotatedOutput out, DalvInsn insn); 174f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 175f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 176f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Helper method to return a register list string. 177f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 17899409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project * @param list {@code non-null;} the list of registers 17999409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project * @return {@code non-null;} the string form 180f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 181f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project protected static String regListString(RegisterSpecList list) { 182f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project int sz = list.size(); 183f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project StringBuffer sb = new StringBuffer(sz * 5 + 2); 184f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 185f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project sb.append('{'); 186f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 187f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project for (int i = 0; i < sz; i++) { 188f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (i != 0) { 189f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project sb.append(", "); 190f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 191f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project sb.append(list.get(i).regString()); 192f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 193f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 194f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project sb.append('}'); 195f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 196f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return sb.toString(); 197f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 198f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 199f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 2009f7f6a92ebec8dd12e310901301d857e2ee323daDan Bornstein * Helper method to return a register range string. 2019f7f6a92ebec8dd12e310901301d857e2ee323daDan Bornstein * 2029f7f6a92ebec8dd12e310901301d857e2ee323daDan Bornstein * @param list {@code non-null;} the list of registers (which must be 2039f7f6a92ebec8dd12e310901301d857e2ee323daDan Bornstein * sequential) 2049f7f6a92ebec8dd12e310901301d857e2ee323daDan Bornstein * @return {@code non-null;} the string form 2059f7f6a92ebec8dd12e310901301d857e2ee323daDan Bornstein */ 2069f7f6a92ebec8dd12e310901301d857e2ee323daDan Bornstein protected static String regRangeString(RegisterSpecList list) { 2079f7f6a92ebec8dd12e310901301d857e2ee323daDan Bornstein int size = list.size(); 2089f7f6a92ebec8dd12e310901301d857e2ee323daDan Bornstein StringBuilder sb = new StringBuilder(30); 2099f7f6a92ebec8dd12e310901301d857e2ee323daDan Bornstein 2109f7f6a92ebec8dd12e310901301d857e2ee323daDan Bornstein sb.append("{"); 2119f7f6a92ebec8dd12e310901301d857e2ee323daDan Bornstein 2129f7f6a92ebec8dd12e310901301d857e2ee323daDan Bornstein switch (size) { 2139f7f6a92ebec8dd12e310901301d857e2ee323daDan Bornstein case 0: { 2149f7f6a92ebec8dd12e310901301d857e2ee323daDan Bornstein // Nothing to do. 2159f7f6a92ebec8dd12e310901301d857e2ee323daDan Bornstein break; 2169f7f6a92ebec8dd12e310901301d857e2ee323daDan Bornstein } 2179f7f6a92ebec8dd12e310901301d857e2ee323daDan Bornstein case 1: { 2189f7f6a92ebec8dd12e310901301d857e2ee323daDan Bornstein sb.append(list.get(0).regString()); 2199f7f6a92ebec8dd12e310901301d857e2ee323daDan Bornstein break; 2209f7f6a92ebec8dd12e310901301d857e2ee323daDan Bornstein } 2219f7f6a92ebec8dd12e310901301d857e2ee323daDan Bornstein default: { 2229f7f6a92ebec8dd12e310901301d857e2ee323daDan Bornstein RegisterSpec lastReg = list.get(size - 1); 2239f7f6a92ebec8dd12e310901301d857e2ee323daDan Bornstein if (lastReg.getCategory() == 2) { 2249f7f6a92ebec8dd12e310901301d857e2ee323daDan Bornstein /* 2259f7f6a92ebec8dd12e310901301d857e2ee323daDan Bornstein * Add one to properly represent a list-final 2269f7f6a92ebec8dd12e310901301d857e2ee323daDan Bornstein * category-2 register. 2279f7f6a92ebec8dd12e310901301d857e2ee323daDan Bornstein */ 2289f7f6a92ebec8dd12e310901301d857e2ee323daDan Bornstein lastReg = lastReg.withOffset(1); 2299f7f6a92ebec8dd12e310901301d857e2ee323daDan Bornstein } 2309f7f6a92ebec8dd12e310901301d857e2ee323daDan Bornstein 2319f7f6a92ebec8dd12e310901301d857e2ee323daDan Bornstein sb.append(list.get(0).regString()); 2329f7f6a92ebec8dd12e310901301d857e2ee323daDan Bornstein sb.append(".."); 2339f7f6a92ebec8dd12e310901301d857e2ee323daDan Bornstein sb.append(lastReg.regString()); 2349f7f6a92ebec8dd12e310901301d857e2ee323daDan Bornstein } 2359f7f6a92ebec8dd12e310901301d857e2ee323daDan Bornstein } 2369f7f6a92ebec8dd12e310901301d857e2ee323daDan Bornstein 2379f7f6a92ebec8dd12e310901301d857e2ee323daDan Bornstein sb.append("}"); 2389f7f6a92ebec8dd12e310901301d857e2ee323daDan Bornstein 2399f7f6a92ebec8dd12e310901301d857e2ee323daDan Bornstein return sb.toString(); 2409f7f6a92ebec8dd12e310901301d857e2ee323daDan Bornstein } 2419f7f6a92ebec8dd12e310901301d857e2ee323daDan Bornstein 2429f7f6a92ebec8dd12e310901301d857e2ee323daDan Bornstein /** 243f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Helper method to return a literal bits argument string. 244f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 245f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @param value the value 24699409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project * @return {@code non-null;} the string form 247f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 248f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project protected static String literalBitsString(CstLiteralBits value) { 249f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project StringBuffer sb = new StringBuffer(100); 250f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 251f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project sb.append('#'); 252f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 253f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (value instanceof CstKnownNull) { 254f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project sb.append("null"); 255f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } else { 256f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project sb.append(value.typeName()); 257f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project sb.append(' '); 258f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project sb.append(value.toHuman()); 259f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 260f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 261f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return sb.toString(); 262f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 263f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 264f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 265f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Helper method to return a literal bits comment string. 266f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 267f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @param value the value 268f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @param width the width of the constant, in bits (used for displaying 26999409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project * the uninterpreted bits; one of: {@code 4 8 16 32 64} 27099409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project * @return {@code non-null;} the comment 271f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 272f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project protected static String literalBitsComment(CstLiteralBits value, 273f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project int width) { 274f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project StringBuffer sb = new StringBuffer(20); 275f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 276f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project sb.append("#"); 277f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 278f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project long bits; 279f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 280f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (value instanceof CstLiteral64) { 281f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bits = ((CstLiteral64) value).getLongBits(); 282f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } else { 283f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bits = value.getIntBits(); 284f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 285f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 286f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project switch (width) { 287f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project case 4: sb.append(Hex.uNibble((int) bits)); break; 288f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project case 8: sb.append(Hex.u1((int) bits)); break; 289f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project case 16: sb.append(Hex.u2((int) bits)); break; 290f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project case 32: sb.append(Hex.u4((int) bits)); break; 291f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project case 64: sb.append(Hex.u8(bits)); break; 292f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project default: { 293f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project throw new RuntimeException("shouldn't happen"); 294f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 295f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 296f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 297f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return sb.toString(); 298f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 299f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 300f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 301f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Helper method to return a branch address string. 302f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 30399409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project * @param insn {@code non-null;} the instruction in question 3040bc9fdeeea3c08f66e34bcc90401b334f75e30e7Dan Bornstein * @return {@code non-null;} the string form of the instruction's 3050bc9fdeeea3c08f66e34bcc90401b334f75e30e7Dan Bornstein * branch target 306f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 307f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project protected static String branchString(DalvInsn insn) { 308f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project TargetInsn ti = (TargetInsn) insn; 309f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project int address = ti.getTargetAddress(); 310f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 311f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return (address == (char) address) ? Hex.u2(address) : Hex.u4(address); 312f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 313f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 314f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 315f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Helper method to return the comment for a branch. 316f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 31799409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project * @param insn {@code non-null;} the instruction in question 31899409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project * @return {@code non-null;} the comment 319f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 320f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project protected static String branchComment(DalvInsn insn) { 321f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project TargetInsn ti = (TargetInsn) insn; 322f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project int offset = ti.getTargetOffset(); 323f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 324f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return (offset == (short) offset) ? Hex.s2(offset) : Hex.s4(offset); 325f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 326f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 327f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 3280bc9fdeeea3c08f66e34bcc90401b334f75e30e7Dan Bornstein * Helper method to return the constant string for a {@link CstInsn} 3290bc9fdeeea3c08f66e34bcc90401b334f75e30e7Dan Bornstein * in human form. 330f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 33199409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project * @param insn {@code non-null;} a constant-bearing instruction 3320bc9fdeeea3c08f66e34bcc90401b334f75e30e7Dan Bornstein * @return {@code non-null;} the human string form of the contained 3330bc9fdeeea3c08f66e34bcc90401b334f75e30e7Dan Bornstein * constant 334f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 335f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project protected static String cstString(DalvInsn insn) { 336f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CstInsn ci = (CstInsn) insn; 337f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Constant cst = ci.getConstant(); 338f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 339333201833d506a3accdeac6ceb7caba8d4b95797Jesse Wilson return cst instanceof CstString ? ((CstString) cst).toQuoted() : cst.toHuman(); 340f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 341f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 342f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 343f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Helper method to return an instruction comment for a constant. 344f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 34599409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project * @param insn {@code non-null;} a constant-bearing instruction 34699409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project * @return {@code non-null;} comment string representing the constant 347f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 348f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project protected static String cstComment(DalvInsn insn) { 349f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CstInsn ci = (CstInsn) insn; 350f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 351f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (! ci.hasIndex()) { 352f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return ""; 353f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 354de75089fb7216d19e9c22cce4dc62a49513477d3Carl Shapiro 355f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project StringBuilder sb = new StringBuilder(20); 356f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project int index = ci.getIndex(); 357f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 358f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project sb.append(ci.getConstant().typeName()); 359f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project sb.append('@'); 360f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 361f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (index < 65536) { 362f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project sb.append(Hex.u2(index)); 363f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } else { 364f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project sb.append(Hex.u4(index)); 365f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 366de75089fb7216d19e9c22cce4dc62a49513477d3Carl Shapiro 367f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return sb.toString(); 368f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 369f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 370f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 371f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Helper method to determine if a signed int value fits in a nibble. 372f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 373f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @param value the value in question 37499409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project * @return {@code true} iff it's in the range -8..+7 375f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 376f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project protected static boolean signedFitsInNibble(int value) { 377f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return (value >= -8) && (value <= 7); 378f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 379f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 380f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 381f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Helper method to determine if an unsigned int value fits in a nibble. 382f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 383f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @param value the value in question 38499409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project * @return {@code true} iff it's in the range 0..0xf 385f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 386f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project protected static boolean unsignedFitsInNibble(int value) { 387f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return value == (value & 0xf); 388f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 389f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 390f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 391f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Helper method to determine if a signed int value fits in a byte. 392f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 393f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @param value the value in question 39499409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project * @return {@code true} iff it's in the range -0x80..+0x7f 395f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 396f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project protected static boolean signedFitsInByte(int value) { 397f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return (byte) value == value; 398f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 399f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 400f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 401f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Helper method to determine if an unsigned int value fits in a byte. 402f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 403f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @param value the value in question 40499409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project * @return {@code true} iff it's in the range 0..0xff 405f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 406f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project protected static boolean unsignedFitsInByte(int value) { 407f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return value == (value & 0xff); 408f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 409f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 410f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 411f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Helper method to determine if a signed int value fits in a short. 412f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 413f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @param value the value in question 41499409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project * @return {@code true} iff it's in the range -0x8000..+0x7fff 415f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 416f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project protected static boolean signedFitsInShort(int value) { 417f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return (short) value == value; 418f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 419f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 420f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 421f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Helper method to determine if an unsigned int value fits in a short. 422f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 423f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @param value the value in question 42499409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project * @return {@code true} iff it's in the range 0..0xffff 425f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 426f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project protected static boolean unsignedFitsInShort(int value) { 427f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return value == (value & 0xffff); 428f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 429f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 430f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 4319f7f6a92ebec8dd12e310901301d857e2ee323daDan Bornstein * Helper method to determine if a list of registers are sequential, 4329f7f6a92ebec8dd12e310901301d857e2ee323daDan Bornstein * including degenerate cases for empty or single-element lists. 4339f7f6a92ebec8dd12e310901301d857e2ee323daDan Bornstein * 4349f7f6a92ebec8dd12e310901301d857e2ee323daDan Bornstein * @param list {@code non-null;} the list of registers 4359f7f6a92ebec8dd12e310901301d857e2ee323daDan Bornstein * @return {@code true} iff the list is sequentially ordered 4369f7f6a92ebec8dd12e310901301d857e2ee323daDan Bornstein */ 4379f7f6a92ebec8dd12e310901301d857e2ee323daDan Bornstein protected static boolean isRegListSequential(RegisterSpecList list) { 4389f7f6a92ebec8dd12e310901301d857e2ee323daDan Bornstein int sz = list.size(); 4399f7f6a92ebec8dd12e310901301d857e2ee323daDan Bornstein 4409f7f6a92ebec8dd12e310901301d857e2ee323daDan Bornstein if (sz < 2) { 4419f7f6a92ebec8dd12e310901301d857e2ee323daDan Bornstein return true; 4429f7f6a92ebec8dd12e310901301d857e2ee323daDan Bornstein } 4439f7f6a92ebec8dd12e310901301d857e2ee323daDan Bornstein 4449f7f6a92ebec8dd12e310901301d857e2ee323daDan Bornstein int first = list.get(0).getReg(); 4459f7f6a92ebec8dd12e310901301d857e2ee323daDan Bornstein int next = first; 4469f7f6a92ebec8dd12e310901301d857e2ee323daDan Bornstein 4479f7f6a92ebec8dd12e310901301d857e2ee323daDan Bornstein for (int i = 0; i < sz; i++) { 4489f7f6a92ebec8dd12e310901301d857e2ee323daDan Bornstein RegisterSpec one = list.get(i); 4499f7f6a92ebec8dd12e310901301d857e2ee323daDan Bornstein if (one.getReg() != next) { 4509f7f6a92ebec8dd12e310901301d857e2ee323daDan Bornstein return false; 4519f7f6a92ebec8dd12e310901301d857e2ee323daDan Bornstein } 4529f7f6a92ebec8dd12e310901301d857e2ee323daDan Bornstein next += one.getCategory(); 4539f7f6a92ebec8dd12e310901301d857e2ee323daDan Bornstein } 4549f7f6a92ebec8dd12e310901301d857e2ee323daDan Bornstein 4559f7f6a92ebec8dd12e310901301d857e2ee323daDan Bornstein return true; 4569f7f6a92ebec8dd12e310901301d857e2ee323daDan Bornstein } 4579f7f6a92ebec8dd12e310901301d857e2ee323daDan Bornstein 4589f7f6a92ebec8dd12e310901301d857e2ee323daDan Bornstein /** 459f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Helper method to extract the callout-argument index from an 460f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * appropriate instruction. 461f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 46299409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project * @param insn {@code non-null;} the instruction 46399409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project * @return {@code >= 0;} the callout argument index 464f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 465f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project protected static int argIndex(DalvInsn insn) { 466f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project int arg = ((CstInteger) ((CstInsn) insn).getConstant()).getValue(); 467f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 468f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (arg < 0) { 469f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project throw new IllegalArgumentException("bogus insn"); 470f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 471f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 472f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return arg; 473f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 474f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 475f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 476f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Helper method to combine an opcode and a second byte of data into 477f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * the appropriate form for emitting into a code buffer. 478f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 47999409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project * @param insn {@code non-null;} the instruction containing the opcode 48099409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project * @param arg {@code 0..255;} arbitrary other byte value 481f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @return combined value 482f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 483f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project protected static short opcodeUnit(DalvInsn insn, int arg) { 484f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if ((arg & 0xff) != arg) { 485f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project throw new IllegalArgumentException("arg out of range 0..255"); 486f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 487f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 488f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project int opcode = insn.getOpcode().getOpcode(); 489f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 490f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if ((opcode & 0xff) != opcode) { 491f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project throw new IllegalArgumentException("opcode out of range 0..255"); 492f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 493f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 494f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return (short) (opcode | (arg << 8)); 495f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 496f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 497f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 4980bc9fdeeea3c08f66e34bcc90401b334f75e30e7Dan Bornstein * Helper method to get an extended (16-bit) opcode out of an 4990bc9fdeeea3c08f66e34bcc90401b334f75e30e7Dan Bornstein * instruction, returning it as a code unit. The opcode 5000bc9fdeeea3c08f66e34bcc90401b334f75e30e7Dan Bornstein * <i>must</i> be an extended opcode. 5010bc9fdeeea3c08f66e34bcc90401b334f75e30e7Dan Bornstein * 5020bc9fdeeea3c08f66e34bcc90401b334f75e30e7Dan Bornstein * @param insn {@code non-null;} the instruction containing the 5030bc9fdeeea3c08f66e34bcc90401b334f75e30e7Dan Bornstein * extended opcode 5040bc9fdeeea3c08f66e34bcc90401b334f75e30e7Dan Bornstein * @return the opcode as a code unit 5050bc9fdeeea3c08f66e34bcc90401b334f75e30e7Dan Bornstein */ 5060bc9fdeeea3c08f66e34bcc90401b334f75e30e7Dan Bornstein protected static short opcodeUnit(DalvInsn insn) { 5070bc9fdeeea3c08f66e34bcc90401b334f75e30e7Dan Bornstein int opcode = insn.getOpcode().getOpcode(); 5080bc9fdeeea3c08f66e34bcc90401b334f75e30e7Dan Bornstein 509ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes if ((opcode < 0x100) || (opcode > 0xffff)) { 510ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes throw new IllegalArgumentException("opcode out of range 0..65535"); 5110bc9fdeeea3c08f66e34bcc90401b334f75e30e7Dan Bornstein } 5120bc9fdeeea3c08f66e34bcc90401b334f75e30e7Dan Bornstein 5130bc9fdeeea3c08f66e34bcc90401b334f75e30e7Dan Bornstein return (short) opcode; 5140bc9fdeeea3c08f66e34bcc90401b334f75e30e7Dan Bornstein } 5150bc9fdeeea3c08f66e34bcc90401b334f75e30e7Dan Bornstein 5160bc9fdeeea3c08f66e34bcc90401b334f75e30e7Dan Bornstein /** 517f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Helper method to combine two bytes into a code unit. 518f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 51999409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project * @param low {@code 0..255;} low byte 52099409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project * @param high {@code 0..255;} high byte 521f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @return combined value 522f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 523f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project protected static short codeUnit(int low, int high) { 524f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if ((low & 0xff) != low) { 525f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project throw new IllegalArgumentException("low out of range 0..255"); 526f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 527f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 528f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if ((high & 0xff) != high) { 529f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project throw new IllegalArgumentException("high out of range 0..255"); 530f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 531f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 532f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return (short) (low | (high << 8)); 533f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 534f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 535f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 536f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Helper method to combine four nibbles into a code unit. 537f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 53899409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project * @param n0 {@code 0..15;} low nibble 53999409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project * @param n1 {@code 0..15;} medium-low nibble 54099409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project * @param n2 {@code 0..15;} medium-high nibble 54199409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project * @param n3 {@code 0..15;} high nibble 542f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @return combined value 543f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 544f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project protected static short codeUnit(int n0, int n1, int n2, int n3) { 545f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if ((n0 & 0xf) != n0) { 546f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project throw new IllegalArgumentException("n0 out of range 0..15"); 547f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 548f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 549f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if ((n1 & 0xf) != n1) { 550f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project throw new IllegalArgumentException("n1 out of range 0..15"); 551f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 552f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 553f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if ((n2 & 0xf) != n2) { 554f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project throw new IllegalArgumentException("n2 out of range 0..15"); 555f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 556f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 557f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if ((n3 & 0xf) != n3) { 558f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project throw new IllegalArgumentException("n3 out of range 0..15"); 559f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 560f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 561f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return (short) (n0 | (n1 << 4) | (n2 << 8) | (n3 << 12)); 562f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 563f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 564f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 565f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Helper method to combine two nibbles into a byte. 566f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 56799409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project * @param low {@code 0..15;} low nibble 56899409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project * @param high {@code 0..15;} high nibble 56999409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project * @return {@code 0..255;} combined value 570f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 571f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project protected static int makeByte(int low, int high) { 572f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if ((low & 0xf) != low) { 573f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project throw new IllegalArgumentException("low out of range 0..15"); 574f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 575f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 576f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if ((high & 0xf) != high) { 577f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project throw new IllegalArgumentException("high out of range 0..15"); 578f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 579f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 580f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return low | (high << 4); 581f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 582f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 583f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 584f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Writes one code unit to the given output destination. 585de75089fb7216d19e9c22cce4dc62a49513477d3Carl Shapiro * 58699409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project * @param out {@code non-null;} where to write to 587f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @param c0 code unit to write 588f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 589f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project protected static void write(AnnotatedOutput out, short c0) { 590f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project out.writeShort(c0); 591f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 592f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 593f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 594f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Writes two code units to the given output destination. 595de75089fb7216d19e9c22cce4dc62a49513477d3Carl Shapiro * 59699409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project * @param out {@code non-null;} where to write to 597f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @param c0 code unit to write 598f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @param c1 code unit to write 599f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 600f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project protected static void write(AnnotatedOutput out, short c0, short c1) { 601f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project out.writeShort(c0); 602f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project out.writeShort(c1); 603f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 604f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 605f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 606f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Writes three code units to the given output destination. 607de75089fb7216d19e9c22cce4dc62a49513477d3Carl Shapiro * 60899409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project * @param out {@code non-null;} where to write to 609f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @param c0 code unit to write 610f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @param c1 code unit to write 611f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @param c2 code unit to write 612f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 613f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project protected static void write(AnnotatedOutput out, short c0, short c1, 6140bc9fdeeea3c08f66e34bcc90401b334f75e30e7Dan Bornstein short c2) { 615f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project out.writeShort(c0); 616f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project out.writeShort(c1); 617f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project out.writeShort(c2); 618f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 619f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 620f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 621f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Writes four code units to the given output destination. 622de75089fb7216d19e9c22cce4dc62a49513477d3Carl Shapiro * 62399409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project * @param out {@code non-null;} where to write to 624f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @param c0 code unit to write 625f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @param c1 code unit to write 626f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @param c2 code unit to write 627f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @param c3 code unit to write 628f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 629f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project protected static void write(AnnotatedOutput out, short c0, short c1, 6300bc9fdeeea3c08f66e34bcc90401b334f75e30e7Dan Bornstein short c2, short c3) { 631f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project out.writeShort(c0); 632f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project out.writeShort(c1); 633f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project out.writeShort(c2); 634f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project out.writeShort(c3); 635f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 636f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 637f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 638f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Writes five code units to the given output destination. 639de75089fb7216d19e9c22cce4dc62a49513477d3Carl Shapiro * 64099409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project * @param out {@code non-null;} where to write to 641f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @param c0 code unit to write 642f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @param c1 code unit to write 643f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @param c2 code unit to write 644f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @param c3 code unit to write 645f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @param c4 code unit to write 646f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 647f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project protected static void write(AnnotatedOutput out, short c0, short c1, 6480bc9fdeeea3c08f66e34bcc90401b334f75e30e7Dan Bornstein short c2, short c3, short c4) { 649f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project out.writeShort(c0); 650f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project out.writeShort(c1); 651f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project out.writeShort(c2); 652f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project out.writeShort(c3); 653f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project out.writeShort(c4); 654f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 655f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 656f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 6570bc9fdeeea3c08f66e34bcc90401b334f75e30e7Dan Bornstein * Writes three code units to the given output destination, where the 6580bc9fdeeea3c08f66e34bcc90401b334f75e30e7Dan Bornstein * second and third are represented as single <code>int</code> and emitted 6590bc9fdeeea3c08f66e34bcc90401b334f75e30e7Dan Bornstein * in little-endian order. 660de75089fb7216d19e9c22cce4dc62a49513477d3Carl Shapiro * 66199409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project * @param out {@code non-null;} where to write to 662f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @param c0 code unit to write 6630bc9fdeeea3c08f66e34bcc90401b334f75e30e7Dan Bornstein * @param c1c2 code unit pair to write 6640bc9fdeeea3c08f66e34bcc90401b334f75e30e7Dan Bornstein */ 6650bc9fdeeea3c08f66e34bcc90401b334f75e30e7Dan Bornstein protected static void write(AnnotatedOutput out, short c0, int c1c2) { 6660bc9fdeeea3c08f66e34bcc90401b334f75e30e7Dan Bornstein write(out, c0, (short) c1c2, (short) (c1c2 >> 16)); 6670bc9fdeeea3c08f66e34bcc90401b334f75e30e7Dan Bornstein } 6680bc9fdeeea3c08f66e34bcc90401b334f75e30e7Dan Bornstein 6690bc9fdeeea3c08f66e34bcc90401b334f75e30e7Dan Bornstein /** 6700bc9fdeeea3c08f66e34bcc90401b334f75e30e7Dan Bornstein * Writes four code units to the given output destination, where the 6710bc9fdeeea3c08f66e34bcc90401b334f75e30e7Dan Bornstein * second and third are represented as single <code>int</code> and emitted 6720bc9fdeeea3c08f66e34bcc90401b334f75e30e7Dan Bornstein * in little-endian order. 6730bc9fdeeea3c08f66e34bcc90401b334f75e30e7Dan Bornstein * 6740bc9fdeeea3c08f66e34bcc90401b334f75e30e7Dan Bornstein * @param out {@code non-null;} where to write to 6750bc9fdeeea3c08f66e34bcc90401b334f75e30e7Dan Bornstein * @param c0 code unit to write 6760bc9fdeeea3c08f66e34bcc90401b334f75e30e7Dan Bornstein * @param c1c2 code unit pair to write 6770bc9fdeeea3c08f66e34bcc90401b334f75e30e7Dan Bornstein * @param c3 code unit to write 6780bc9fdeeea3c08f66e34bcc90401b334f75e30e7Dan Bornstein */ 6790bc9fdeeea3c08f66e34bcc90401b334f75e30e7Dan Bornstein protected static void write(AnnotatedOutput out, short c0, int c1c2, 6800bc9fdeeea3c08f66e34bcc90401b334f75e30e7Dan Bornstein short c3) { 6810bc9fdeeea3c08f66e34bcc90401b334f75e30e7Dan Bornstein write(out, c0, (short) c1c2, (short) (c1c2 >> 16), c3); 6820bc9fdeeea3c08f66e34bcc90401b334f75e30e7Dan Bornstein } 6830bc9fdeeea3c08f66e34bcc90401b334f75e30e7Dan Bornstein 6840bc9fdeeea3c08f66e34bcc90401b334f75e30e7Dan Bornstein /** 6850bc9fdeeea3c08f66e34bcc90401b334f75e30e7Dan Bornstein * Writes five code units to the given output destination, where the 6860bc9fdeeea3c08f66e34bcc90401b334f75e30e7Dan Bornstein * second and third are represented as single <code>int</code> and emitted 6870bc9fdeeea3c08f66e34bcc90401b334f75e30e7Dan Bornstein * in little-endian order. 6880bc9fdeeea3c08f66e34bcc90401b334f75e30e7Dan Bornstein * 6890bc9fdeeea3c08f66e34bcc90401b334f75e30e7Dan Bornstein * @param out {@code non-null;} where to write to 6900bc9fdeeea3c08f66e34bcc90401b334f75e30e7Dan Bornstein * @param c0 code unit to write 6910bc9fdeeea3c08f66e34bcc90401b334f75e30e7Dan Bornstein * @param c1c2 code unit pair to write 692f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @param c3 code unit to write 693f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @param c4 code unit to write 694f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 6950bc9fdeeea3c08f66e34bcc90401b334f75e30e7Dan Bornstein protected static void write(AnnotatedOutput out, short c0, int c1c2, 6960bc9fdeeea3c08f66e34bcc90401b334f75e30e7Dan Bornstein short c3, short c4) { 6970bc9fdeeea3c08f66e34bcc90401b334f75e30e7Dan Bornstein write(out, c0, (short) c1c2, (short) (c1c2 >> 16), c3, c4); 6980bc9fdeeea3c08f66e34bcc90401b334f75e30e7Dan Bornstein } 6990bc9fdeeea3c08f66e34bcc90401b334f75e30e7Dan Bornstein 7000bc9fdeeea3c08f66e34bcc90401b334f75e30e7Dan Bornstein /** 7010bc9fdeeea3c08f66e34bcc90401b334f75e30e7Dan Bornstein * Writes five code units to the given output destination, where the 7020bc9fdeeea3c08f66e34bcc90401b334f75e30e7Dan Bornstein * second through fifth are represented as single <code>long</code> 7030bc9fdeeea3c08f66e34bcc90401b334f75e30e7Dan Bornstein * and emitted in little-endian order. 7040bc9fdeeea3c08f66e34bcc90401b334f75e30e7Dan Bornstein * 7050bc9fdeeea3c08f66e34bcc90401b334f75e30e7Dan Bornstein * @param out {@code non-null;} where to write to 7060bc9fdeeea3c08f66e34bcc90401b334f75e30e7Dan Bornstein * @param c0 code unit to write 7070bc9fdeeea3c08f66e34bcc90401b334f75e30e7Dan Bornstein * @param c1c2c3c4 code unit quad to write 7080bc9fdeeea3c08f66e34bcc90401b334f75e30e7Dan Bornstein */ 7090bc9fdeeea3c08f66e34bcc90401b334f75e30e7Dan Bornstein protected static void write(AnnotatedOutput out, short c0, long c1c2c3c4) { 7100bc9fdeeea3c08f66e34bcc90401b334f75e30e7Dan Bornstein write(out, c0, (short) c1c2c3c4, (short) (c1c2c3c4 >> 16), 7110bc9fdeeea3c08f66e34bcc90401b334f75e30e7Dan Bornstein (short) (c1c2c3c4 >> 32), (short) (c1c2c3c4 >> 48)); 712f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 713f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 714