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