InsnFormat.java revision ab35b50311951feea3782151dd5422ee944685c2
19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/* 29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2007 The Android Open Source Project 39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you may not use this file except in compliance with the License. 69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You may obtain a copy of the License at 79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See the License for the specific language governing permissions and 149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * limitations under the License. 159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpackage com.android.dx.dex.code; 189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 19980a938c1c9a6a5791a8240e5a1e6638ab28dc77Romain Guyimport com.android.dx.rop.code.RegisterSpec; 209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport com.android.dx.rop.code.RegisterSpecList; 219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport com.android.dx.rop.cst.Constant; 22836531b0c4985b0cf6ead247dd2f403f3ec59e37Dianne Hackbornimport com.android.dx.rop.cst.CstInteger; 239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport com.android.dx.rop.cst.CstKnownNull; 249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport com.android.dx.rop.cst.CstLiteral64; 259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport com.android.dx.rop.cst.CstLiteralBits; 26d922ae01ca99a2b6d39a9393f86776a1d10ebd14Dianne Hackbornimport com.android.dx.rop.cst.CstString; 27105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Projectimport com.android.dx.util.AnnotatedOutput; 289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport com.android.dx.util.Hex; 29fbf097732137a32930d151f7ba6816a5b870c32aJeff Brown 309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.BitSet; 319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 324df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project/** 339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Base class for all instruction format handlers. Instruction format 349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * handlers know how to translate {@link DalvInsn} instances into 359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * streams of code units, as well as human-oriented listing strings 369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * representing such translations. 379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic abstract class InsnFormat { 399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * flag to enable/disable the new extended opcode formats; meant as a 419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * temporary measure until VM support for the salient opcodes is 426b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown * added. TODO: Remove this declaration when the VM can deal. 439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static boolean ALLOW_EXTENDED_OPCODES = true; 459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Returns the string form, suitable for inclusion in a listing 489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * dump, of the given instruction. The instruction must be of this 499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * instance's format for proper operation. 509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 51105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project * @param insn {@code non-null;} the instruction 529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param noteIndices whether to include an explicit notation of 538cbb4c6e30cff706a243599634aeb8fd9a818d92Gilles Debunne * constant pool indices 549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return {@code non-null;} the string form 559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final String listingString(DalvInsn insn, boolean noteIndices) { 579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String op = insn.getOpcode().getName(); 589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String arg = insnArgString(insn); 599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String comment = insnCommentString(insn, noteIndices); 60ab751aa085433e9f735d2e7603459c6c7e9d2fb0satok StringBuilder sb = new StringBuilder(100); 619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sb.append(op); 63105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project 64105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project if (arg.length() != 0) { 659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sb.append(' '); 669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sb.append(arg); 679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (comment.length() != 0) { 709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sb.append(" // "); 719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sb.append(comment); 729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return sb.toString(); 759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Returns the string form of the arguments to the given instruction. 799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The instruction must be of this instance's format. If the instruction 809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * has no arguments, then the result should be {@code ""}, not 819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@code null}. 829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Subclasses must override this method.</p> 849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param insn {@code non-null;} the instruction 869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return {@code non-null;} the string form 879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public abstract String insnArgString(DalvInsn insn); 899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Returns the associated comment for the given instruction, if any. 929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The instruction must be of this instance's format. If the instruction 939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * has no comment, then the result should be {@code ""}, not 949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@code null}. 959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Subclasses must override this method.</p> 979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param insn {@code non-null;} the instruction 999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param noteIndices whether to include an explicit notation of 1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * constant pool indices 1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return {@code non-null;} the string form 1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public abstract String insnCommentString(DalvInsn insn, 1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean noteIndices); 1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Gets the code size of instructions that use this format. The 1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * size is a number of 16-bit code units, not bytes. This should 1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * throw an exception if this format is of variable size. 1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return {@code >= 0;} the instruction length in 16-bit code units 1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public abstract int codeSize(); 1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Returns whether or not the given instruction's arguments will 1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * fit in this instance's format. This includes such things as 1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * counting register arguments, checking register ranges, and 1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * making sure that additional arguments are of appropriate types 1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * and are in-range. If this format has a branch target but the 1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * instruction's branch offset is unknown, this method will simply 1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * not check the offset. 1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Subclasses must override this method.</p> 1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param insn {@code non-null;} the instruction to check 1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return {@code true} iff the instruction's arguments are 1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * appropriate for this instance, or {@code false} if not 1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public abstract boolean isCompatible(DalvInsn insn); 1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Returns which of a given instruction's registers will fit in 1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * this instance's format. 1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>The default implementation of this method always returns 1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * an empty BitSet. Subclasses must override this method if they 1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * have registers.</p> 1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param insn {@code non-null;} the instruction to check 1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return {@code non-null;} a BitSet flagging registers in the 1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * register list that are compatible to this format 1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public BitSet compatibleRegs(DalvInsn insn) { 1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return new BitSet(); 1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Returns whether or not the given instruction's branch offset will 1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * fit in this instance's format. This always returns {@code false} 1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * for formats that don't include a branch offset. 1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>The default implementation of this method always returns 1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@code false}. Subclasses must override this method if they 1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * include branch offsets.</p> 1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param insn {@code non-null;} the instruction to check 1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return {@code true} iff the instruction's branch offset is 1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * appropriate for this instance, or {@code false} if not 1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean branchFits(TargetInsn insn) { 1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Writes the code units for the given instruction to the given 1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * output destination. The instruction must be of this instance's format. 1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Subclasses must override this method.</p> 1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param out {@code non-null;} the output destination to write to 1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param insn {@code non-null;} the instruction to write 1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public abstract void writeTo(AnnotatedOutput out, DalvInsn insn); 1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Helper method to return a register list string. 1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param list {@code non-null;} the list of registers 1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return {@code non-null;} the string form 1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected static String regListString(RegisterSpecList list) { 1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int sz = list.size(); 1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project StringBuffer sb = new StringBuffer(sz * 5 + 2); 1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sb.append('{'); 1879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i = 0; i < sz; i++) { 1899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (i != 0) { 1909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sb.append(", "); 1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sb.append(list.get(i).regString()); 1939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sb.append('}'); 1969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return sb.toString(); 1989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Helper method to return a register range string. 2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param list {@code non-null;} the list of registers (which must be 2049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * sequential) 2059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return {@code non-null;} the string form 2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected static String regRangeString(RegisterSpecList list) { 2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int size = list.size(); 2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project StringBuilder sb = new StringBuilder(30); 2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sb.append("{"); 2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project switch (size) { 2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case 0: { 215105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project // Nothing to do. 216105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project break; 217105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 218105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project case 1: { 2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sb.append(list.get(0).regString()); 2209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 2219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project default: { 223857fd9b8562c29913e03ed29288bd1802d37dc60Joe Onorato RegisterSpec lastReg = list.get(size - 1); 224857fd9b8562c29913e03ed29288bd1802d37dc60Joe Onorato if (lastReg.getCategory() == 2) { 225857fd9b8562c29913e03ed29288bd1802d37dc60Joe Onorato /* 226857fd9b8562c29913e03ed29288bd1802d37dc60Joe Onorato * Add one to properly represent a list-final 227857fd9b8562c29913e03ed29288bd1802d37dc60Joe Onorato * category-2 register. 228857fd9b8562c29913e03ed29288bd1802d37dc60Joe Onorato */ 229857fd9b8562c29913e03ed29288bd1802d37dc60Joe Onorato lastReg = lastReg.withOffset(1); 230857fd9b8562c29913e03ed29288bd1802d37dc60Joe Onorato } 231857fd9b8562c29913e03ed29288bd1802d37dc60Joe Onorato 232857fd9b8562c29913e03ed29288bd1802d37dc60Joe Onorato sb.append(list.get(0).regString()); 233857fd9b8562c29913e03ed29288bd1802d37dc60Joe Onorato sb.append(".."); 234857fd9b8562c29913e03ed29288bd1802d37dc60Joe Onorato sb.append(lastReg.regString()); 235857fd9b8562c29913e03ed29288bd1802d37dc60Joe Onorato } 236857fd9b8562c29913e03ed29288bd1802d37dc60Joe Onorato } 237857fd9b8562c29913e03ed29288bd1802d37dc60Joe Onorato 238857fd9b8562c29913e03ed29288bd1802d37dc60Joe Onorato sb.append("}"); 239857fd9b8562c29913e03ed29288bd1802d37dc60Joe Onorato 240857fd9b8562c29913e03ed29288bd1802d37dc60Joe Onorato return sb.toString(); 241857fd9b8562c29913e03ed29288bd1802d37dc60Joe Onorato } 242857fd9b8562c29913e03ed29288bd1802d37dc60Joe Onorato 243857fd9b8562c29913e03ed29288bd1802d37dc60Joe Onorato /** 244857fd9b8562c29913e03ed29288bd1802d37dc60Joe Onorato * Helper method to return a literal bits argument string. 245857fd9b8562c29913e03ed29288bd1802d37dc60Joe Onorato * 246857fd9b8562c29913e03ed29288bd1802d37dc60Joe Onorato * @param value the value 247857fd9b8562c29913e03ed29288bd1802d37dc60Joe Onorato * @return {@code non-null;} the string form 248857fd9b8562c29913e03ed29288bd1802d37dc60Joe Onorato */ 249857fd9b8562c29913e03ed29288bd1802d37dc60Joe Onorato protected static String literalBitsString(CstLiteralBits value) { 250857fd9b8562c29913e03ed29288bd1802d37dc60Joe Onorato StringBuffer sb = new StringBuffer(100); 2519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sb.append('#'); 253d922ae01ca99a2b6d39a9393f86776a1d10ebd14Dianne Hackborn 254836531b0c4985b0cf6ead247dd2f403f3ec59e37Dianne Hackborn if (value instanceof CstKnownNull) { 255105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project sb.append("null"); 2569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 257105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project sb.append(value.typeName()); 2589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sb.append(' '); 2599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sb.append(value.toHuman()); 2609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return sb.toString(); 2639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 264105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project 265105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project /** 266105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project * Helper method to return a literal bits comment string. 2679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 2689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param value the value 2699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param width the width of the constant, in bits (used for displaying 2709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the uninterpreted bits; one of: {@code 4 8 16 32 64} 2719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return {@code non-null;} the comment 2729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected static String literalBitsComment(CstLiteralBits value, 2749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int width) { 2759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project StringBuffer sb = new StringBuffer(20); 2769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sb.append("#"); 2789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long bits; 2809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (value instanceof CstLiteral64) { 2829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project bits = ((CstLiteral64) value).getLongBits(); 2839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 2849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project bits = value.getIntBits(); 2859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project switch (width) { 2889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case 4: sb.append(Hex.uNibble((int) bits)); break; 2899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case 8: sb.append(Hex.u1((int) bits)); break; 2909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case 16: sb.append(Hex.u2((int) bits)); break; 2919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case 32: sb.append(Hex.u4((int) bits)); break; 292105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project case 64: sb.append(Hex.u8(bits)); break; 2939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project default: { 2949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new RuntimeException("shouldn't happen"); 2959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return sb.toString(); 2999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Helper method to return a branch address string. 303857fd9b8562c29913e03ed29288bd1802d37dc60Joe Onorato * 3049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param insn {@code non-null;} the instruction in question 3059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return {@code non-null;} the string form of the instruction's 3069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * branch target 307ab751aa085433e9f735d2e7603459c6c7e9d2fb0satok */ 3089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected static String branchString(DalvInsn insn) { 3099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project TargetInsn ti = (TargetInsn) insn; 3109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int address = ti.getTargetAddress(); 311105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project 312105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project return (address == (char) address) ? Hex.u2(address) : Hex.u4(address); 3139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Helper method to return the comment for a branch. 317fbf097732137a32930d151f7ba6816a5b870c32aJeff Brown * 3189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param insn {@code non-null;} the instruction in question 3199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return {@code non-null;} the comment 3209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected static String branchComment(DalvInsn insn) { 3229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project TargetInsn ti = (TargetInsn) insn; 323fbf097732137a32930d151f7ba6816a5b870c32aJeff Brown int offset = ti.getTargetOffset(); 3249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return (offset == (short) offset) ? Hex.s2(offset) : Hex.s4(offset); 3269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Helper method to return the constant string for a {@link CstInsn} 3309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * in human form. 3319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 3329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param insn {@code non-null;} a constant-bearing instruction 3339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return {@code non-null;} the human string form of the contained 3349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * constant 3359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected static String cstString(DalvInsn insn) { 3379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project CstInsn ci = (CstInsn) insn; 3389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Constant cst = ci.getConstant(); 3399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return cst instanceof CstString ? ((CstString) cst).toQuoted() : cst.toHuman(); 3419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Helper method to return an instruction comment for a constant. 3459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 3469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param insn {@code non-null;} a constant-bearing instruction 3479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return {@code non-null;} comment string representing the constant 3489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected static String cstComment(DalvInsn insn) { 3509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project CstInsn ci = (CstInsn) insn; 3519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (! ci.hasIndex()) { 3539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return ""; 3549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project StringBuilder sb = new StringBuilder(20); 3579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int index = ci.getIndex(); 3589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sb.append(ci.getConstant().typeName()); 3609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sb.append('@'); 3619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (index < 65536) { 3639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sb.append(Hex.u2(index)); 3649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 3659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sb.append(Hex.u4(index)); 3669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return sb.toString(); 3699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Helper method to determine if a signed int value fits in a nibble. 3739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 3749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param value the value in question 3759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return {@code true} iff it's in the range -8..+7 3769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected static boolean signedFitsInNibble(int value) { 3789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return (value >= -8) && (value <= 7); 3799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Helper method to determine if an unsigned int value fits in a nibble. 3839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 3849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param value the value in question 3859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return {@code true} iff it's in the range 0..0xf 3869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected static boolean unsignedFitsInNibble(int value) { 3889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return value == (value & 0xf); 3899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Helper method to determine if a signed int value fits in a byte. 3939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 3949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param value the value in question 3959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return {@code true} iff it's in the range -0x80..+0x7f 3969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected static boolean signedFitsInByte(int value) { 3989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return (byte) value == value; 3999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4014df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project /** 4029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Helper method to determine if an unsigned int value fits in a byte. 4034df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project * 4049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param value the value in question 4059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return {@code true} iff it's in the range 0..0xff 4069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4072f913d951c481edccbefa4d321a76f28740b48d7satok protected static boolean unsignedFitsInByte(int value) { 4084df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project return value == (value & 0xff); 4094df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project } 4104df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project 4114df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project /** 4124df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project * Helper method to determine if a signed int value fits in a short. 4134df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project * 4149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param value the value in question 4159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return {@code true} iff it's in the range -0x8000..+0x7fff 4169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected static boolean signedFitsInShort(int value) { 4189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return (short) value == value; 4194df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project } 4209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4214df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project /** 4229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Helper method to determine if an unsigned int value fits in a short. 4239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 4249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param value the value in question 4259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return {@code true} iff it's in the range 0..0xffff 426865b97761cc58053f45a8b06b531d60d8e482c3asatok */ 427857fd9b8562c29913e03ed29288bd1802d37dc60Joe Onorato protected static boolean unsignedFitsInShort(int value) { 428857fd9b8562c29913e03ed29288bd1802d37dc60Joe Onorato return value == (value & 0xffff); 429857fd9b8562c29913e03ed29288bd1802d37dc60Joe Onorato } 4304df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project 4314df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project /** 4324df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project * Helper method to determine if a list of registers are sequential, 4334df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project * including degenerate cases for empty or single-element lists. 4344df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project * 4354df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project * @param list {@code non-null;} the list of registers 4369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return {@code true} iff the list is sequentially ordered 437ab751aa085433e9f735d2e7603459c6c7e9d2fb0satok */ 438ab751aa085433e9f735d2e7603459c6c7e9d2fb0satok protected static boolean isRegListSequential(RegisterSpecList list) { 439ab751aa085433e9f735d2e7603459c6c7e9d2fb0satok int sz = list.size(); 440ab751aa085433e9f735d2e7603459c6c7e9d2fb0satok 4419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (sz < 2) { 442ab751aa085433e9f735d2e7603459c6c7e9d2fb0satok return true; 4439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int first = list.get(0).getReg(); 4469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int next = first; 4479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i = 0; i < sz; i++) { 4499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project RegisterSpec one = list.get(i); 4509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (one.getReg() != next) { 4519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 4529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project next += one.getCategory(); 4549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return true; 4579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 4609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Helper method to extract the callout-argument index from an 4619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * appropriate instruction. 4629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 4639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param insn {@code non-null;} the instruction 4649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return {@code >= 0;} the callout argument index 4659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected static int argIndex(DalvInsn insn) { 4679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int arg = ((CstInteger) ((CstInsn) insn).getConstant()).getValue(); 4689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (arg < 0) { 4709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new IllegalArgumentException("bogus insn"); 4719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return arg; 4749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 4779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Helper method to combine an opcode and a second byte of data into 4789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the appropriate form for emitting into a code buffer. 4799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 4809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param insn {@code non-null;} the instruction containing the opcode 4819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param arg {@code 0..255;} arbitrary other byte value 4829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return combined value 4839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected static short opcodeUnit(DalvInsn insn, int arg) { 4859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((arg & 0xff) != arg) { 4869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new IllegalArgumentException("arg out of range 0..255"); 4879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int opcode = insn.getOpcode().getOpcode(); 4909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((opcode & 0xff) != opcode) { 4929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new IllegalArgumentException("opcode out of range 0..255"); 493863fcd62171e55bc9f2105d9fb5877df982454d8satok } 494863fcd62171e55bc9f2105d9fb5877df982454d8satok 495863fcd62171e55bc9f2105d9fb5877df982454d8satok return (short) (opcode | (arg << 8)); 496863fcd62171e55bc9f2105d9fb5877df982454d8satok } 497863fcd62171e55bc9f2105d9fb5877df982454d8satok 498863fcd62171e55bc9f2105d9fb5877df982454d8satok /** 499863fcd62171e55bc9f2105d9fb5877df982454d8satok * Helper method to get an extended (16-bit) opcode out of an 500863fcd62171e55bc9f2105d9fb5877df982454d8satok * instruction, returning it as a code unit. The opcode 501863fcd62171e55bc9f2105d9fb5877df982454d8satok * <i>must</i> be an extended opcode. 5029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 5039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param insn {@code non-null;} the instruction containing the 5049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * extended opcode 5059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return the opcode as a code unit 5069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 5079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected static short opcodeUnit(DalvInsn insn) { 5089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int opcode = insn.getOpcode().getOpcode(); 5099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((opcode < 0x100) || (opcode > 0xffff)) { 5119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new IllegalArgumentException("opcode out of range 0..65535"); 5129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return (short) opcode; 5159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 5189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Helper method to combine two bytes into a code unit. 5199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 5209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param low {@code 0..255;} low byte 5219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param high {@code 0..255;} high byte 5229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return combined value 5234df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project */ 5244df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project protected static short codeUnit(int low, int high) { 5254df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project if ((low & 0xff) != low) { 5264df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project throw new IllegalArgumentException("low out of range 0..255"); 5274df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project } 5284df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project 5294df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project if ((high & 0xff) != high) { 5309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new IllegalArgumentException("high out of range 0..255"); 5319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return (short) (low | (high << 8)); 5349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 5379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Helper method to combine four nibbles into a code unit. 5389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 5399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param n0 {@code 0..15;} low nibble 5409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param n1 {@code 0..15;} medium-low nibble 5419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param n2 {@code 0..15;} medium-high nibble 5429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param n3 {@code 0..15;} high nibble 5439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return combined value 5449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 5459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected static short codeUnit(int n0, int n1, int n2, int n3) { 5469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((n0 & 0xf) != n0) { 5479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new IllegalArgumentException("n0 out of range 0..15"); 5489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((n1 & 0xf) != n1) { 5519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new IllegalArgumentException("n1 out of range 0..15"); 5529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((n2 & 0xf) != n2) { 5559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new IllegalArgumentException("n2 out of range 0..15"); 5569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 558fbf097732137a32930d151f7ba6816a5b870c32aJeff Brown if ((n3 & 0xf) != n3) { 559fbf097732137a32930d151f7ba6816a5b870c32aJeff Brown throw new IllegalArgumentException("n3 out of range 0..15"); 560fbf097732137a32930d151f7ba6816a5b870c32aJeff Brown } 561fbf097732137a32930d151f7ba6816a5b870c32aJeff Brown 562fbf097732137a32930d151f7ba6816a5b870c32aJeff Brown return (short) (n0 | (n1 << 4) | (n2 << 8) | (n3 << 12)); 563fbf097732137a32930d151f7ba6816a5b870c32aJeff Brown } 564fbf097732137a32930d151f7ba6816a5b870c32aJeff Brown 565fbf097732137a32930d151f7ba6816a5b870c32aJeff Brown /** 5669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Helper method to combine two nibbles into a byte. 5679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 5689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param low {@code 0..15;} low nibble 5699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param high {@code 0..15;} high nibble 5709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return {@code 0..255;} combined value 5719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 5729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected static int makeByte(int low, int high) { 5739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((low & 0xf) != low) { 5749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new IllegalArgumentException("low out of range 0..15"); 5759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((high & 0xf) != high) { 5789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new IllegalArgumentException("high out of range 0..15"); 5799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return low | (high << 4); 5829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 5859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Writes one code unit to the given output destination. 586fbf097732137a32930d151f7ba6816a5b870c32aJeff Brown * 587fbf097732137a32930d151f7ba6816a5b870c32aJeff Brown * @param out {@code non-null;} where to write to 588fbf097732137a32930d151f7ba6816a5b870c32aJeff Brown * @param c0 code unit to write 589fbf097732137a32930d151f7ba6816a5b870c32aJeff Brown */ 590fbf097732137a32930d151f7ba6816a5b870c32aJeff Brown protected static void write(AnnotatedOutput out, short c0) { 591fbf097732137a32930d151f7ba6816a5b870c32aJeff Brown out.writeShort(c0); 592fbf097732137a32930d151f7ba6816a5b870c32aJeff Brown } 593fbf097732137a32930d151f7ba6816a5b870c32aJeff Brown 5949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 5959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Writes two code units to the given output destination. 5969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 597fbf097732137a32930d151f7ba6816a5b870c32aJeff Brown * @param out {@code non-null;} where to write to 598fbf097732137a32930d151f7ba6816a5b870c32aJeff Brown * @param c0 code unit to write 5999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param c1 code unit to write 6009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 6019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected static void write(AnnotatedOutput out, short c0, short c1) { 602865b97761cc58053f45a8b06b531d60d8e482c3asatok out.writeShort(c0); 603105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project out.writeShort(c1); 604105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 605105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project 606105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project /** 607105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project * Writes three code units to the given output destination. 608105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project * 609105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project * @param out {@code non-null;} where to write to 610105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project * @param c0 code unit to write 611ab751aa085433e9f735d2e7603459c6c7e9d2fb0satok * @param c1 code unit to write 612105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project * @param c2 code unit to write 613105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project */ 614105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project protected static void write(AnnotatedOutput out, short c0, short c1, 615105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project short c2) { 616105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project out.writeShort(c0); 617105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project out.writeShort(c1); 618865b97761cc58053f45a8b06b531d60d8e482c3asatok out.writeShort(c2); 619836531b0c4985b0cf6ead247dd2f403f3ec59e37Dianne Hackborn } 620836531b0c4985b0cf6ead247dd2f403f3ec59e37Dianne Hackborn 621836531b0c4985b0cf6ead247dd2f403f3ec59e37Dianne Hackborn /** 622836531b0c4985b0cf6ead247dd2f403f3ec59e37Dianne Hackborn * Writes four code units to the given output destination. 623836531b0c4985b0cf6ead247dd2f403f3ec59e37Dianne Hackborn * 624836531b0c4985b0cf6ead247dd2f403f3ec59e37Dianne Hackborn * @param out {@code non-null;} where to write to 625836531b0c4985b0cf6ead247dd2f403f3ec59e37Dianne Hackborn * @param c0 code unit to write 626836531b0c4985b0cf6ead247dd2f403f3ec59e37Dianne Hackborn * @param c1 code unit to write 627836531b0c4985b0cf6ead247dd2f403f3ec59e37Dianne Hackborn * @param c2 code unit to write 628836531b0c4985b0cf6ead247dd2f403f3ec59e37Dianne Hackborn * @param c3 code unit to write 629836531b0c4985b0cf6ead247dd2f403f3ec59e37Dianne Hackborn */ 630836531b0c4985b0cf6ead247dd2f403f3ec59e37Dianne Hackborn protected static void write(AnnotatedOutput out, short c0, short c1, 631836531b0c4985b0cf6ead247dd2f403f3ec59e37Dianne Hackborn short c2, short c3) { 63298365d7663cbd82979a5700faf0050220b01084dJeff Brown out.writeShort(c0); 633836531b0c4985b0cf6ead247dd2f403f3ec59e37Dianne Hackborn out.writeShort(c1); 634836531b0c4985b0cf6ead247dd2f403f3ec59e37Dianne Hackborn out.writeShort(c2); 635836531b0c4985b0cf6ead247dd2f403f3ec59e37Dianne Hackborn out.writeShort(c3); 636836531b0c4985b0cf6ead247dd2f403f3ec59e37Dianne Hackborn } 637836531b0c4985b0cf6ead247dd2f403f3ec59e37Dianne Hackborn 638836531b0c4985b0cf6ead247dd2f403f3ec59e37Dianne Hackborn /** 6399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Writes five code units to the given output destination. 640d922ae01ca99a2b6d39a9393f86776a1d10ebd14Dianne Hackborn * 641d922ae01ca99a2b6d39a9393f86776a1d10ebd14Dianne Hackborn * @param out {@code non-null;} where to write to 6426e90a362bc66cc67b1beae27b21d3f0148403b08Adam Powell * @param c0 code unit to write 64336a97e4030010298736928f9b391a390fea6941bAdam Powell * @param c1 code unit to write 6446e90a362bc66cc67b1beae27b21d3f0148403b08Adam Powell * @param c2 code unit to write 645105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project * @param c3 code unit to write 6469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param c4 code unit to write 6479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 6489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected static void write(AnnotatedOutput out, short c0, short c1, 6499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project short c2, short c3, short c4) { 65083fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn out.writeShort(c0); 651836531b0c4985b0cf6ead247dd2f403f3ec59e37Dianne Hackborn out.writeShort(c1); 652836531b0c4985b0cf6ead247dd2f403f3ec59e37Dianne Hackborn out.writeShort(c2); 653836531b0c4985b0cf6ead247dd2f403f3ec59e37Dianne Hackborn out.writeShort(c3); 6549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeShort(c4); 655980a938c1c9a6a5791a8240e5a1e6638ab28dc77Romain Guy } 6569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 657ab751aa085433e9f735d2e7603459c6c7e9d2fb0satok /** 6589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Writes three code units to the given output destination, where the 6599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * second and third are represented as single <code>int</code> and emitted 6609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * in little-endian order. 6619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 6629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param out {@code non-null;} where to write to 6639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param c0 code unit to write 6649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param c1c2 code unit pair to write 66534703b6d304c2bc6f4a39583931c7582d0455b0cGilles Debunne */ 6669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected static void write(AnnotatedOutput out, short c0, int c1c2) { 667ab751aa085433e9f735d2e7603459c6c7e9d2fb0satok write(out, c0, (short) c1c2, (short) (c1c2 >> 16)); 6689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 6719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Writes four code units to the given output destination, where the 6729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * second and third are represented as single <code>int</code> and emitted 6739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * in little-endian order. 674ab751aa085433e9f735d2e7603459c6c7e9d2fb0satok * 6759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param out {@code non-null;} where to write to 6769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param c0 code unit to write 6779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param c1c2 code unit pair to write 6789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param c3 code unit to write 6799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 6809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected static void write(AnnotatedOutput out, short c0, int c1c2, 681105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project short c3) { 6829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project write(out, c0, (short) c1c2, (short) (c1c2 >> 16), c3); 6839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 6866e2bee75cea415621165698fdd9ce857bbb8872eJeff Sharkey * Writes five code units to the given output destination, where the 6876e2bee75cea415621165698fdd9ce857bbb8872eJeff Sharkey * second and third are represented as single <code>int</code> and emitted 6889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * in little-endian order. 6899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 6909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param out {@code non-null;} where to write to 691105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project * @param c0 code unit to write 692105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project * @param c1c2 code unit pair to write 6939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param c3 code unit to write 6949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param c4 code unit to write 6959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 6969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected static void write(AnnotatedOutput out, short c0, int c1c2, 6979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project short c3, short c4) { 6989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project write(out, c0, (short) c1c2, (short) (c1c2 >> 16), c3, c4); 6999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 7029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Writes five code units to the given output destination, where the 7039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * second through fifth are represented as single <code>long</code> 7049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * and emitted in little-endian order. 7059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 7069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param out {@code non-null;} where to write to 7079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param c0 code unit to write 7089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param c1c2c3c4 code unit quad to write 7099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 710ab751aa085433e9f735d2e7603459c6c7e9d2fb0satok protected static void write(AnnotatedOutput out, short c0, long c1c2c3c4) { 7119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project write(out, c0, (short) c1c2c3c4, (short) (c1c2c3c4 >> 16), 7129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project (short) (c1c2c3c4 >> 32), (short) (c1c2c3c4 >> 48)); 7139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 715f17db9f5257011d5331d27a6da7d4e6fddde1e08satok