RegOps.java revision f6c387128427e121477c1b32ad35cdcaa5101ba3
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.rop.code;
18f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
19f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport com.android.dx.util.Hex;
20f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
21f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/**
22f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * All the register-based opcodes, and related utilities.
23f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
24f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * <p><b>Note:</b> Opcode descriptions use a rough pseudocode. <code>r</code>
25f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * is the result register, <code>x</code> is the first argument,
26f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * <code>y</code> is the second argument, and <code>z</code> is the
27f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * third argument. The expression which describes
28f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * the operation uses Java-ish syntax but is preceded by type indicators for
29f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * each of the values.
30f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
31f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectpublic final class RegOps {
32f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /** <code>nop()</code> */
33f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public static final int NOP = 1;
34f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
35f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /** <code>T: any type; r,x: T :: r = x;</code> */
36f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public static final int MOVE = 2;
37f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
38f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /** <code>T: any type; r,param(x): T :: r = param(x)</code> */
39f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public static final int MOVE_PARAM = 3;
40f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
41f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
42f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * <code>T: Throwable; r: T :: r = caught_exception</code>.
43f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * <b>Note:</b> This opcode should only ever be used in the
44f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * first instruction of a block, and such blocks must be
45f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * the start of an exception handler.
46f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
47f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public static final int MOVE_EXCEPTION = 4;
48f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
49f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /** <code>T: any type; r, literal: T :: r = literal;</code> */
50f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public static final int CONST = 5;
51f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
52f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /** <code>goto <i>label</i></code> */
53f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public static final int GOTO = 6;
54f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
55f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
56f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * <code>T: int or Object; x,y: T :: if (x == y) goto
57f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * <i>label</i></code>
58f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
59f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public static final int IF_EQ = 7;
60f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
61f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
62f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * <code>T: int or Object; x,y: T :: if (x != y) goto
63f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * <i>label</i></code>
64f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
65f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public static final int IF_NE = 8;
66f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
67f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /** <code>x,y: int :: if (x &lt; y) goto <i>label</i></code> */
68f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public static final int IF_LT = 9;
69f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
70f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /** <code>x,y: int :: if (x &gt;= y) goto <i>label</i></code> */
71f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public static final int IF_GE = 10;
72f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
73f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /** <code>x,y: int :: if (x &lt;= y) goto <i>label</i></code> */
74f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public static final int IF_LE = 11;
75f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
76f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /** <code>x,y: int :: if (x &gt; y) goto <i>label</i></code> */
77f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public static final int IF_GT = 12;
78f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
79f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /** <code>x: int :: goto <i>table[x]</i></code> */
80f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public static final int SWITCH = 13;
81f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
82f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /** <code>T: any numeric type; r,x,y: T :: r = x + y</code> */
83f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public static final int ADD = 14;
84f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
85f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /** <code>T: any numeric type; r,x,y: T :: r = x - y</code> */
86f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public static final int SUB = 15;
87f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
88f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /** <code>T: any numeric type; r,x,y: T :: r = x * y</code> */
89f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public static final int MUL = 16;
90f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
91f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /** <code>T: any numeric type; r,x,y: T :: r = x / y</code> */
92f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public static final int DIV = 17;
93f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
94f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
95f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * <code>T: any numeric type; r,x,y: T :: r = x % y</code>
96f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * (Java-style remainder)
97f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
98f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public static final int REM = 18;
99f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
100f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /** <code>T: any numeric type; r,x: T :: r = -x</code> */
101f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public static final int NEG = 19;
102f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
103f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /** <code>T: any integral type; r,x,y: T :: r = x &amp; y</code> */
104f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public static final int AND = 20;
105f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
106f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /** <code>T: any integral type; r,x,y: T :: r = x | y</code> */
107f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public static final int OR = 21;
108f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
109f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /** <code>T: any integral type; r,x,y: T :: r = x ^ y</code> */
110f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public static final int XOR = 22;
111f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
112f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
113f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * <code>T: any integral type; r,x: T; y: int :: r = x &lt;&lt;
114f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * y</code>
115f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
116f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public static final int SHL = 23;
117f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
118f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
119f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * <code>T: any integral type; r,x: T; y: int :: r = x &gt;&gt;
120f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * y</code> (signed right-shift)
121f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
122f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public static final int SHR = 24;
123f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
124f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
125f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * <code>T: any integral type; r,x: T; y: int :: r = x
126f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * &gt;&gt;&gt; y</code> (unsigned right-shift)
127f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
128f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public static final int USHR = 25;
129f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
130f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /** <code>T: any integral type; r,x: T :: r = ~x</code> */
131f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public static final int NOT = 26;
132f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
133f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
134f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * <code>T: any numeric type; r: int; x,y: T :: r = (x == y) ? 0
135f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * : (x &gt; y) ? 1 : -1</code> (Java-style "cmpl" where a NaN is
136f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * considered "less than" all other values; also used for integral
137f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comparisons)
138f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
139f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public static final int CMPL = 27;
140f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
141f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
142f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * <code>T: any floating point type; r: int; x,y: T :: r = (x == y) ? 0
143f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * : (x &lt; y) ? -1 : 1</code> (Java-style "cmpg" where a NaN is
144f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * considered "greater than" all other values)
145f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
146f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public static final int CMPG = 28;
147f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
148f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
149f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * <code>T: any numeric type; U: any numeric type; r: T; x: U ::
150f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * r = (T) x</code> (numeric type conversion between the four
151f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * "real" numeric types)
152f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
153f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public static final int CONV = 29;
154f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
155f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
156f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * <code>r,x: int :: r = (x &lt;&lt; 24) &gt;&gt; 24</code> (Java-style
157f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * convert int to byte)
158f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
159f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public static final int TO_BYTE = 30;
160f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
161f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
162f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * <code>r,x: int :: r = x &amp; 0xffff</code> (Java-style
163f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * convert int to char)
164f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
165f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public static final int TO_CHAR = 31;
166f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
167f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
168f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * <code>r,x: int :: r = (x &lt;&lt; 16) &gt;&gt; 16</code> (Java-style
169f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * convert int to short)
170f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
171f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public static final int TO_SHORT = 32;
172f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
173f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /** <code>T: return type for the method; x: T; return x</code> */
174f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public static final int RETURN = 33;
175f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
176f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /** <code>T: any type; r: int; x: T[]; :: r = x.length</code> */
177f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public static final int ARRAY_LENGTH = 34;
178f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
179f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /** <code>x: Throwable :: throw(x)</code> */
180f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public static final int THROW = 35;
181f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
182f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /** <code>x: Object :: monitorenter(x)</code> */
183f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public static final int MONITOR_ENTER = 36;
184f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
185f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /** <code>x: Object :: monitorexit(x)</code> */
186f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public static final int MONITOR_EXIT = 37;
187f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
188f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /** <code>T: any type; r: T; x: T[]; y: int :: r = x[y]</code> */
189f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public static final int AGET = 38;
190f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
191f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /** <code>T: any type; x: T; y: T[]; z: int :: x[y] = z</code> */
192f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public static final int APUT = 39;
193f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
194f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
195f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * <code>T: any non-array object type :: r =
196f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * alloc(T)</code> (allocate heap space for an object)
197f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
198f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public static final int NEW_INSTANCE = 40;
199f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
200f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /** <code>T: any array type; r: T; x: int :: r = new T[x]</code> */
201f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public static final int NEW_ARRAY = 41;
202f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
203f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
204f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * <code>T: any array type; r: T; x: int; v0..vx: T :: r = new T[x]
205f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * {v0, ..., vx}</code>
206f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
207f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public static final int FILLED_NEW_ARRAY = 42;
208f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
209f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
210f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * <code>T: any object type; x: Object :: (T) x</code> (can
211f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * throw <code>ClassCastException</code>)
212f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
213f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public static final int CHECK_CAST = 43;
214f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
215f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
216f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * <code>T: any object type; x: Object :: x instanceof
217f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * T</code>
218f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
219f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public static final int INSTANCE_OF = 44;
220f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
221f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
222f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * <code>T: any type; r: T; x: Object; f: instance field spec of
223f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * type T :: r = x.f</code>
224f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
225f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public static final int GET_FIELD = 45;
226f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
227f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
228f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * <code>T: any type; r: T; f: static field spec of type T :: r =
229f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * f</code>
230f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
231f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public static final int GET_STATIC = 46;
232f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
233f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
234f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * <code>T: any type; x: T; y: Object; f: instance field spec of type
235f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * T :: y.f = x</code>
236f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
237f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public static final int PUT_FIELD = 47;
238f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
239f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
240f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * <code>T: any type; f: static field spec of type T; x: T :: f =
241f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * x</code>
242f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
243f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public static final int PUT_STATIC = 48;
244f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
245f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
246f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * <code>Tr, T0, T1...: any types; r: Tr; m: static method spec;
247f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * y0: T0; y1: T1 ... :: r = m(y0, y1, ...)</code> (call static
248f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * method)
249f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
250f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public static final int INVOKE_STATIC = 49;
251f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
252f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
253f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * <code>Tr, T0, T1...: any types; r: Tr; x: Object; m: instance method
254f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * spec; y0: T0; y1: T1 ... :: r = x.m(y0, y1, ...)</code> (call normal
255f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * virtual method)
256f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
257f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public static final int INVOKE_VIRTUAL = 50;
258f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
259f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
260f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * <code>Tr, T0, T1...: any types; r: Tr; x: Object; m: instance method
261f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * spec; y0: T0; y1: T1 ... :: r = x.m(y0, y1, ...)</code> (call
262f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * superclass virtual method)
263f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
264f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public static final int INVOKE_SUPER = 51;
265f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
266f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
267f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * <code>Tr, T0, T1...: any types; r: Tr; x: Object; m: instance method
268f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * spec; y0: T0; y1: T1 ... :: r = x.m(y0, y1, ...)</code> (call
269f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * direct/special method)
270f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
271f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public static final int INVOKE_DIRECT = 52;
272f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
273f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
274f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * <code>Tr, T0, T1...: any types; r: Tr; x: Object; m: interface
275f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * (instance) method spec; y0: T0; y1: T1 ... :: r = x.m(y0, y1,
276f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * ...)</code> (call interface method)
277f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
278f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public static final int INVOKE_INTERFACE = 53;
279f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
280f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
281f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * <code> T0: any type; </code> (mark beginning or end of local variable
282f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * name
283f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
284f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public static final int MARK_LOCAL = 54;
285f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
286f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
287f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * <code>T: Any type; r: T :: r = return_type</code>.
288f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * <b>Note:</b> This opcode should only ever be used in the
289f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * first instruction of a block following an invoke-*.
290f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
291f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public static final int MOVE_RESULT = 55;
292f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
293f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
294f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * <code>T: Any type; r: T :: r = return_type</code>.
295f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * <b>Note:</b> This opcode should only ever be used in the
296f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * first instruction of a block following a non-invoke throwing insn
297f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
298f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public static final int MOVE_RESULT_PSEUDO = 56;
299f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
300f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /** <code>T: Any primitive type; v0..vx: T :: {v0, ..., vx}</code> */
301f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public static final int FILL_ARRAY_DATA = 57;
302f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
303f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
304f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This class is uninstantiable.
305f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
306f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    private RegOps() {
307f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        // This space intentionally left blank.
308f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
309f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
310f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
311f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Gets the name of the given opcode.
312f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
313f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param opcode &gt;= 0, &lt;= 255; the opcode
314f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @return non-null; its name
315f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
316f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public static String opName(int opcode) {
317f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        switch (opcode) {
318f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            case NOP: return "nop";
319f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            case MOVE: return "move";
320f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            case MOVE_PARAM: return "move-param";
321f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            case MOVE_EXCEPTION: return "move-exception";
322f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            case CONST: return "const";
323f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            case GOTO: return "goto";
324f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            case IF_EQ: return "if-eq";
325f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            case IF_NE: return "if-ne";
326f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            case IF_LT: return "if-lt";
327f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            case IF_GE: return "if-ge";
328f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            case IF_LE: return "if-le";
329f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            case IF_GT: return "if-gt";
330f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            case SWITCH: return "switch";
331f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            case ADD: return "add";
332f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            case SUB: return "sub";
333f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            case MUL: return "mul";
334f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            case DIV: return "div";
335f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            case REM: return "rem";
336f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            case NEG: return "neg";
337f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            case AND: return "and";
338f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            case OR: return "or";
339f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            case XOR: return "xor";
340f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            case SHL: return "shl";
341f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            case SHR: return "shr";
342f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            case USHR: return "ushr";
343f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            case NOT: return "not";
344f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            case CMPL: return "cmpl";
345f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            case CMPG: return "cmpg";
346f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            case CONV: return "conv";
347f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            case TO_BYTE: return "to-byte";
348f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            case TO_CHAR: return "to-char";
349f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            case TO_SHORT: return "to-short";
350f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            case RETURN: return "return";
351f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            case ARRAY_LENGTH: return "array-length";
352f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            case THROW: return "throw";
353f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            case MONITOR_ENTER: return "monitor-enter";
354f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            case MONITOR_EXIT: return "monitor-exit";
355f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            case AGET: return "aget";
356f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            case APUT: return "aput";
357f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            case NEW_INSTANCE: return "new-instance";
358f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            case NEW_ARRAY: return "new-array";
359f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            case FILLED_NEW_ARRAY: return "filled-new-array";
360f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            case CHECK_CAST: return "check-cast";
361f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            case INSTANCE_OF: return "instance-of";
362f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            case GET_FIELD: return "get-field";
363f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            case GET_STATIC: return "get-static";
364f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            case PUT_FIELD: return "put-field";
365f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            case PUT_STATIC: return "put-static";
366f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            case INVOKE_STATIC: return "invoke-static";
367f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            case INVOKE_VIRTUAL: return "invoke-virtual";
368f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            case INVOKE_SUPER: return "invoke-super";
369f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            case INVOKE_DIRECT: return "invoke-direct";
370f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            case INVOKE_INTERFACE: return "invoke-interface";
371f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            case MOVE_RESULT: return "move-result";
372f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            case MOVE_RESULT_PSEUDO: return "move-result-pseudo";
373f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            case FILL_ARRAY_DATA: return "fill-array-data";
374f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
375f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
376f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return "unknown-" + Hex.u1(opcode);
377f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
378f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
379f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
380f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Given an IF_* RegOp, returns the right-to-left flipped version. For
381f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * example, IF_GT becomes IF_LT.
382f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
383f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param opcode An IF_* RegOp
384f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @return flipped IF Regop
385f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
386f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public static int flippedIfOpcode(final int opcode) {
387f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        switch (opcode) {
388f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            case RegOps.IF_EQ:
389f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            case RegOps.IF_NE:
390f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                return opcode;
391f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            case RegOps.IF_LT:
392f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                return RegOps.IF_GT;
393f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            case RegOps.IF_GE:
394f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                return RegOps.IF_LE;
395f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            case RegOps.IF_LE:
396f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                return RegOps.IF_GE;
397f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            case RegOps.IF_GT:
398f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                return RegOps.IF_LT;
399f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            default:
400f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                throw new RuntimeException("Unrecognized IF regop: " + opcode);
401f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
402f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
403f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project}
404