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