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