1579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson/*
2579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * Copyright (C) 2007 The Android Open Source Project
3579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson *
4579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * Licensed under the Apache License, Version 2.0 (the "License");
5579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * you may not use this file except in compliance with the License.
6579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * You may obtain a copy of the License at
7579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson *
8579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson *      http://www.apache.org/licenses/LICENSE-2.0
9579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson *
10579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * Unless required by applicable law or agreed to in writing, software
11579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * distributed under the License is distributed on an "AS IS" BASIS,
12579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * See the License for the specific language governing permissions and
14579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * limitations under the License.
15579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson */
16579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson
17579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilsonpackage com.android.dx.dex.code;
18579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson
19579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilsonimport com.android.dx.rop.code.Insn;
20579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilsonimport com.android.dx.rop.code.RegOps;
21579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilsonimport com.android.dx.rop.code.Rop;
22579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilsonimport com.android.dx.rop.code.Rops;
23579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilsonimport com.android.dx.rop.code.ThrowingCstInsn;
24579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilsonimport com.android.dx.rop.code.RegisterSpec;
25579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilsonimport com.android.dx.rop.cst.Constant;
26579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilsonimport com.android.dx.rop.cst.CstFieldRef;
27579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilsonimport com.android.dx.rop.cst.CstType;
28579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilsonimport com.android.dx.rop.cst.CstString;
29579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilsonimport com.android.dx.rop.type.Type;
30579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson
31579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilsonimport java.util.HashMap;
32579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson
33579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson/**
34579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * Translator from rop-level {@link Insn} instances to corresponding
35579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * {@link Dop} instances.
36579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson */
37579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilsonpublic final class RopToDop {
38579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson    /** {@code non-null;} map from all the common rops to dalvik opcodes */
39579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson    private static final HashMap<Rop, Dop> MAP;
40579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson
41579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson    /**
42579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson     * This class is uninstantiable.
43579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson     */
44579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson    private RopToDop() {
45579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson        // This space intentionally left blank.
46579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson    }
47579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson
48579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson    /*
49579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson     * The following comment lists each opcode that should be considered
50579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson     * the "head" of an opcode chain, in terms of the process of fitting
51579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson     * an instruction's arguments to an actual opcode. This list is
52579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson     * automatically generated and may be of use in double-checking the
53579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson     * manually-generated static initialization code for this class.
54579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson     *
55579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson     * TODO: Make opcode-gen produce useful code in this case instead
56579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson     * of just a comment.
57579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson     */
58579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson
59579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson    // BEGIN(first-opcodes); GENERATED AUTOMATICALLY BY opcode-gen
60579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson    //     Opcodes.NOP
61579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson    //     Opcodes.MOVE
62579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson    //     Opcodes.MOVE_WIDE
63579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson    //     Opcodes.MOVE_OBJECT
64579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson    //     Opcodes.MOVE_RESULT
65579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson    //     Opcodes.MOVE_RESULT_WIDE
66579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson    //     Opcodes.MOVE_RESULT_OBJECT
67579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson    //     Opcodes.MOVE_EXCEPTION
68579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson    //     Opcodes.RETURN_VOID
69579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson    //     Opcodes.RETURN
70579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson    //     Opcodes.RETURN_WIDE
71579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson    //     Opcodes.RETURN_OBJECT
72579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson    //     Opcodes.CONST_4
73579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson    //     Opcodes.CONST_WIDE_16
74579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson    //     Opcodes.CONST_STRING
75579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson    //     Opcodes.CONST_CLASS
76579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson    //     Opcodes.MONITOR_ENTER
77579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson    //     Opcodes.MONITOR_EXIT
78579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson    //     Opcodes.CHECK_CAST
79579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson    //     Opcodes.INSTANCE_OF
80579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson    //     Opcodes.ARRAY_LENGTH
81579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson    //     Opcodes.NEW_INSTANCE
82579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson    //     Opcodes.NEW_ARRAY
83579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson    //     Opcodes.FILLED_NEW_ARRAY
84579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson    //     Opcodes.FILL_ARRAY_DATA
85579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson    //     Opcodes.THROW
86579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson    //     Opcodes.GOTO
87579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson    //     Opcodes.PACKED_SWITCH
88579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson    //     Opcodes.SPARSE_SWITCH
89579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson    //     Opcodes.CMPL_FLOAT
90579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson    //     Opcodes.CMPG_FLOAT
91579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson    //     Opcodes.CMPL_DOUBLE
92579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson    //     Opcodes.CMPG_DOUBLE
93579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson    //     Opcodes.CMP_LONG
94579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson    //     Opcodes.IF_EQ
95579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson    //     Opcodes.IF_NE
96579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson    //     Opcodes.IF_LT
97579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson    //     Opcodes.IF_GE
98579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson    //     Opcodes.IF_GT
99579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson    //     Opcodes.IF_LE
100579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson    //     Opcodes.IF_EQZ
101579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson    //     Opcodes.IF_NEZ
102579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson    //     Opcodes.IF_LTZ
103579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson    //     Opcodes.IF_GEZ
104579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson    //     Opcodes.IF_GTZ
105579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson    //     Opcodes.IF_LEZ
106579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson    //     Opcodes.AGET
107579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson    //     Opcodes.AGET_WIDE
108579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson    //     Opcodes.AGET_OBJECT
109579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson    //     Opcodes.AGET_BOOLEAN
110579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson    //     Opcodes.AGET_BYTE
111579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson    //     Opcodes.AGET_CHAR
112579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson    //     Opcodes.AGET_SHORT
113579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson    //     Opcodes.APUT
114579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson    //     Opcodes.APUT_WIDE
115579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson    //     Opcodes.APUT_OBJECT
116579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson    //     Opcodes.APUT_BOOLEAN
117579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson    //     Opcodes.APUT_BYTE
118579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson    //     Opcodes.APUT_CHAR
119579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson    //     Opcodes.APUT_SHORT
120579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson    //     Opcodes.IGET
121579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson    //     Opcodes.IGET_WIDE
122579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson    //     Opcodes.IGET_OBJECT
123579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson    //     Opcodes.IGET_BOOLEAN
124579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson    //     Opcodes.IGET_BYTE
125579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson    //     Opcodes.IGET_CHAR
126579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson    //     Opcodes.IGET_SHORT
127579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson    //     Opcodes.IPUT
128579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson    //     Opcodes.IPUT_WIDE
129579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson    //     Opcodes.IPUT_OBJECT
130579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson    //     Opcodes.IPUT_BOOLEAN
131579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson    //     Opcodes.IPUT_BYTE
132579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson    //     Opcodes.IPUT_CHAR
133579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson    //     Opcodes.IPUT_SHORT
134579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson    //     Opcodes.SGET
135579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson    //     Opcodes.SGET_WIDE
136579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson    //     Opcodes.SGET_OBJECT
137579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson    //     Opcodes.SGET_BOOLEAN
138579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson    //     Opcodes.SGET_BYTE
139579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson    //     Opcodes.SGET_CHAR
140579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson    //     Opcodes.SGET_SHORT
141579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson    //     Opcodes.SPUT
142579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson    //     Opcodes.SPUT_WIDE
143579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson    //     Opcodes.SPUT_OBJECT
144579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson    //     Opcodes.SPUT_BOOLEAN
145579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson    //     Opcodes.SPUT_BYTE
146579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson    //     Opcodes.SPUT_CHAR
147579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson    //     Opcodes.SPUT_SHORT
148579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson    //     Opcodes.INVOKE_VIRTUAL
149579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson    //     Opcodes.INVOKE_SUPER
150579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson    //     Opcodes.INVOKE_DIRECT
151579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson    //     Opcodes.INVOKE_STATIC
152579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson    //     Opcodes.INVOKE_INTERFACE
153579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson    //     Opcodes.NEG_INT
154579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson    //     Opcodes.NOT_INT
155579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson    //     Opcodes.NEG_LONG
156579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson    //     Opcodes.NOT_LONG
157579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson    //     Opcodes.NEG_FLOAT
158579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson    //     Opcodes.NEG_DOUBLE
159579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson    //     Opcodes.INT_TO_LONG
160579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson    //     Opcodes.INT_TO_FLOAT
161579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson    //     Opcodes.INT_TO_DOUBLE
162579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson    //     Opcodes.LONG_TO_INT
163579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson    //     Opcodes.LONG_TO_FLOAT
164579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson    //     Opcodes.LONG_TO_DOUBLE
165579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson    //     Opcodes.FLOAT_TO_INT
166579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson    //     Opcodes.FLOAT_TO_LONG
167579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson    //     Opcodes.FLOAT_TO_DOUBLE
168579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson    //     Opcodes.DOUBLE_TO_INT
169579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson    //     Opcodes.DOUBLE_TO_LONG
170579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson    //     Opcodes.DOUBLE_TO_FLOAT
171579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson    //     Opcodes.INT_TO_BYTE
172579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson    //     Opcodes.INT_TO_CHAR
173579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson    //     Opcodes.INT_TO_SHORT
174579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson    //     Opcodes.ADD_INT_2ADDR
175579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson    //     Opcodes.SUB_INT_2ADDR
176579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson    //     Opcodes.MUL_INT_2ADDR
177579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson    //     Opcodes.DIV_INT_2ADDR
178579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson    //     Opcodes.REM_INT_2ADDR
179579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson    //     Opcodes.AND_INT_2ADDR
180579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson    //     Opcodes.OR_INT_2ADDR
181579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson    //     Opcodes.XOR_INT_2ADDR
182579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson    //     Opcodes.SHL_INT_2ADDR
183579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson    //     Opcodes.SHR_INT_2ADDR
184579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson    //     Opcodes.USHR_INT_2ADDR
185579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson    //     Opcodes.ADD_LONG_2ADDR
186579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson    //     Opcodes.SUB_LONG_2ADDR
187579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson    //     Opcodes.MUL_LONG_2ADDR
188579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson    //     Opcodes.DIV_LONG_2ADDR
189579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson    //     Opcodes.REM_LONG_2ADDR
190579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson    //     Opcodes.AND_LONG_2ADDR
191579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson    //     Opcodes.OR_LONG_2ADDR
192579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson    //     Opcodes.XOR_LONG_2ADDR
193579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson    //     Opcodes.SHL_LONG_2ADDR
194579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson    //     Opcodes.SHR_LONG_2ADDR
195579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson    //     Opcodes.USHR_LONG_2ADDR
196579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson    //     Opcodes.ADD_FLOAT_2ADDR
197579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson    //     Opcodes.SUB_FLOAT_2ADDR
198579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson    //     Opcodes.MUL_FLOAT_2ADDR
199579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson    //     Opcodes.DIV_FLOAT_2ADDR
200579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson    //     Opcodes.REM_FLOAT_2ADDR
201579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson    //     Opcodes.ADD_DOUBLE_2ADDR
202579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson    //     Opcodes.SUB_DOUBLE_2ADDR
203579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson    //     Opcodes.MUL_DOUBLE_2ADDR
204579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson    //     Opcodes.DIV_DOUBLE_2ADDR
205579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson    //     Opcodes.REM_DOUBLE_2ADDR
206579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson    //     Opcodes.ADD_INT_LIT8
207579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson    //     Opcodes.RSUB_INT_LIT8
208579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson    //     Opcodes.MUL_INT_LIT8
209579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson    //     Opcodes.DIV_INT_LIT8
210579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson    //     Opcodes.REM_INT_LIT8
211579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson    //     Opcodes.AND_INT_LIT8
212579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson    //     Opcodes.OR_INT_LIT8
213579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson    //     Opcodes.XOR_INT_LIT8
214579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson    //     Opcodes.SHL_INT_LIT8
215579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson    //     Opcodes.SHR_INT_LIT8
216579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson    //     Opcodes.USHR_INT_LIT8
217579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson    // END(first-opcodes)
218579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson
219579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson    static {
220579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson        /*
221579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson         * Note: The choices made here are to pick the optimistically
222579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson         * smallest Dalvik opcode, and leave it to later processing to
223579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson         * pessimize. See the automatically-generated comment above
224579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson         * for reference.
225579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson         */
226579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson        MAP = new HashMap<Rop, Dop>(400);
227579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson        MAP.put(Rops.NOP,               Dops.NOP);
228579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson        MAP.put(Rops.MOVE_INT,          Dops.MOVE);
229579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson        MAP.put(Rops.MOVE_LONG,         Dops.MOVE_WIDE);
230579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson        MAP.put(Rops.MOVE_FLOAT,        Dops.MOVE);
231579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson        MAP.put(Rops.MOVE_DOUBLE,       Dops.MOVE_WIDE);
232579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson        MAP.put(Rops.MOVE_OBJECT,       Dops.MOVE_OBJECT);
233579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson        MAP.put(Rops.MOVE_PARAM_INT,    Dops.MOVE);
234579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson        MAP.put(Rops.MOVE_PARAM_LONG,   Dops.MOVE_WIDE);
235579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson        MAP.put(Rops.MOVE_PARAM_FLOAT,  Dops.MOVE);
236579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson        MAP.put(Rops.MOVE_PARAM_DOUBLE, Dops.MOVE_WIDE);
237579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson        MAP.put(Rops.MOVE_PARAM_OBJECT, Dops.MOVE_OBJECT);
238579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson
239579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson        /*
240579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson         * Note: No entry for MOVE_EXCEPTION, since it varies by
241579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson         * exception type. (That is, there is no unique instance to
242579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson         * add to the map.)
243579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson         */
244579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson
245579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson        MAP.put(Rops.CONST_INT,         Dops.CONST_4);
246579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson        MAP.put(Rops.CONST_LONG,        Dops.CONST_WIDE_16);
247579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson        MAP.put(Rops.CONST_FLOAT,       Dops.CONST_4);
248579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson        MAP.put(Rops.CONST_DOUBLE,      Dops.CONST_WIDE_16);
249579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson
250579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson        /*
251579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson         * Note: No entry for CONST_OBJECT, since it needs to turn
252579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson         * into either CONST_STRING or CONST_CLASS.
253579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson         */
254579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson
255579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson        /*
256579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson         * TODO: I think the only case of this is for null, and
257579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson         * const/4 should cover that.
258579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson         */
259579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson        MAP.put(Rops.CONST_OBJECT_NOTHROW, Dops.CONST_4);
260579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson
261579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson        MAP.put(Rops.GOTO,                 Dops.GOTO);
262579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson        MAP.put(Rops.IF_EQZ_INT,           Dops.IF_EQZ);
263579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson        MAP.put(Rops.IF_NEZ_INT,           Dops.IF_NEZ);
264579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson        MAP.put(Rops.IF_LTZ_INT,           Dops.IF_LTZ);
265579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson        MAP.put(Rops.IF_GEZ_INT,           Dops.IF_GEZ);
266579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson        MAP.put(Rops.IF_LEZ_INT,           Dops.IF_LEZ);
267579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson        MAP.put(Rops.IF_GTZ_INT,           Dops.IF_GTZ);
268579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson        MAP.put(Rops.IF_EQZ_OBJECT,        Dops.IF_EQZ);
269579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson        MAP.put(Rops.IF_NEZ_OBJECT,        Dops.IF_NEZ);
270579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson        MAP.put(Rops.IF_EQ_INT,            Dops.IF_EQ);
271579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson        MAP.put(Rops.IF_NE_INT,            Dops.IF_NE);
272579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson        MAP.put(Rops.IF_LT_INT,            Dops.IF_LT);
273579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson        MAP.put(Rops.IF_GE_INT,            Dops.IF_GE);
274579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson        MAP.put(Rops.IF_LE_INT,            Dops.IF_LE);
275579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson        MAP.put(Rops.IF_GT_INT,            Dops.IF_GT);
276579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson        MAP.put(Rops.IF_EQ_OBJECT,         Dops.IF_EQ);
277579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson        MAP.put(Rops.IF_NE_OBJECT,         Dops.IF_NE);
278579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson        MAP.put(Rops.SWITCH,               Dops.SPARSE_SWITCH);
279579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson        MAP.put(Rops.ADD_INT,              Dops.ADD_INT_2ADDR);
280579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson        MAP.put(Rops.ADD_LONG,             Dops.ADD_LONG_2ADDR);
281579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson        MAP.put(Rops.ADD_FLOAT,            Dops.ADD_FLOAT_2ADDR);
282579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson        MAP.put(Rops.ADD_DOUBLE,           Dops.ADD_DOUBLE_2ADDR);
283579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson        MAP.put(Rops.SUB_INT,              Dops.SUB_INT_2ADDR);
284579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson        MAP.put(Rops.SUB_LONG,             Dops.SUB_LONG_2ADDR);
285579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson        MAP.put(Rops.SUB_FLOAT,            Dops.SUB_FLOAT_2ADDR);
286579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson        MAP.put(Rops.SUB_DOUBLE,           Dops.SUB_DOUBLE_2ADDR);
287579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson        MAP.put(Rops.MUL_INT,              Dops.MUL_INT_2ADDR);
288579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson        MAP.put(Rops.MUL_LONG,             Dops.MUL_LONG_2ADDR);
289579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson        MAP.put(Rops.MUL_FLOAT,            Dops.MUL_FLOAT_2ADDR);
290579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson        MAP.put(Rops.MUL_DOUBLE,           Dops.MUL_DOUBLE_2ADDR);
291579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson        MAP.put(Rops.DIV_INT,              Dops.DIV_INT_2ADDR);
292579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson        MAP.put(Rops.DIV_LONG,             Dops.DIV_LONG_2ADDR);
293579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson        MAP.put(Rops.DIV_FLOAT,            Dops.DIV_FLOAT_2ADDR);
294579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson        MAP.put(Rops.DIV_DOUBLE,           Dops.DIV_DOUBLE_2ADDR);
295579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson        MAP.put(Rops.REM_INT,              Dops.REM_INT_2ADDR);
296579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson        MAP.put(Rops.REM_LONG,             Dops.REM_LONG_2ADDR);
297579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson        MAP.put(Rops.REM_FLOAT,            Dops.REM_FLOAT_2ADDR);
298579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson        MAP.put(Rops.REM_DOUBLE,           Dops.REM_DOUBLE_2ADDR);
299579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson        MAP.put(Rops.NEG_INT,              Dops.NEG_INT);
300579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson        MAP.put(Rops.NEG_LONG,             Dops.NEG_LONG);
301579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson        MAP.put(Rops.NEG_FLOAT,            Dops.NEG_FLOAT);
302579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson        MAP.put(Rops.NEG_DOUBLE,           Dops.NEG_DOUBLE);
303579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson        MAP.put(Rops.AND_INT,              Dops.AND_INT_2ADDR);
304579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson        MAP.put(Rops.AND_LONG,             Dops.AND_LONG_2ADDR);
305579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson        MAP.put(Rops.OR_INT,               Dops.OR_INT_2ADDR);
306579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson        MAP.put(Rops.OR_LONG,              Dops.OR_LONG_2ADDR);
307579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson        MAP.put(Rops.XOR_INT,              Dops.XOR_INT_2ADDR);
308579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson        MAP.put(Rops.XOR_LONG,             Dops.XOR_LONG_2ADDR);
309579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson        MAP.put(Rops.SHL_INT,              Dops.SHL_INT_2ADDR);
310579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson        MAP.put(Rops.SHL_LONG,             Dops.SHL_LONG_2ADDR);
311579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson        MAP.put(Rops.SHR_INT,              Dops.SHR_INT_2ADDR);
312579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson        MAP.put(Rops.SHR_LONG,             Dops.SHR_LONG_2ADDR);
313579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson        MAP.put(Rops.USHR_INT,             Dops.USHR_INT_2ADDR);
314579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson        MAP.put(Rops.USHR_LONG,            Dops.USHR_LONG_2ADDR);
315579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson        MAP.put(Rops.NOT_INT,              Dops.NOT_INT);
316579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson        MAP.put(Rops.NOT_LONG,             Dops.NOT_LONG);
317579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson
318579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson        MAP.put(Rops.ADD_CONST_INT,        Dops.ADD_INT_LIT8);
319579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson        // Note: No dalvik ops for other types of add_const.
320579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson
321579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson        MAP.put(Rops.SUB_CONST_INT,        Dops.RSUB_INT_LIT8);
322579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson        /*
323579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson         * Note: No dalvik ops for any type of sub_const; instead
324579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson         * there's a *reverse* sub (constant - reg) for ints only.
325579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson         */
326579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson
327579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson        MAP.put(Rops.MUL_CONST_INT,        Dops.MUL_INT_LIT8);
328579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson        // Note: No dalvik ops for other types of mul_const.
329579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson
330579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson        MAP.put(Rops.DIV_CONST_INT,        Dops.DIV_INT_LIT8);
331579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson        // Note: No dalvik ops for other types of div_const.
332579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson
333579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson        MAP.put(Rops.REM_CONST_INT,        Dops.REM_INT_LIT8);
334579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson        // Note: No dalvik ops for other types of rem_const.
335579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson
336579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson        MAP.put(Rops.AND_CONST_INT,        Dops.AND_INT_LIT8);
337579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson        // Note: No dalvik op for and_const_long.
338579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson
339579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson        MAP.put(Rops.OR_CONST_INT,         Dops.OR_INT_LIT8);
340579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson        // Note: No dalvik op for or_const_long.
341579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson
342579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson        MAP.put(Rops.XOR_CONST_INT,        Dops.XOR_INT_LIT8);
343579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson        // Note: No dalvik op for xor_const_long.
344579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson
345579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson        MAP.put(Rops.SHL_CONST_INT,        Dops.SHL_INT_LIT8);
346579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson        // Note: No dalvik op for shl_const_long.
347579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson
348579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson        MAP.put(Rops.SHR_CONST_INT,        Dops.SHR_INT_LIT8);
349579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson        // Note: No dalvik op for shr_const_long.
350579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson
351579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson        MAP.put(Rops.USHR_CONST_INT,       Dops.USHR_INT_LIT8);
352579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson        // Note: No dalvik op for shr_const_long.
353579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson
354579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson        MAP.put(Rops.CMPL_LONG,            Dops.CMP_LONG);
355579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson        MAP.put(Rops.CMPL_FLOAT,           Dops.CMPL_FLOAT);
356579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson        MAP.put(Rops.CMPL_DOUBLE,          Dops.CMPL_DOUBLE);
357579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson        MAP.put(Rops.CMPG_FLOAT,           Dops.CMPG_FLOAT);
358579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson        MAP.put(Rops.CMPG_DOUBLE,          Dops.CMPG_DOUBLE);
359579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson        MAP.put(Rops.CONV_L2I,             Dops.LONG_TO_INT);
360579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson        MAP.put(Rops.CONV_F2I,             Dops.FLOAT_TO_INT);
361579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson        MAP.put(Rops.CONV_D2I,             Dops.DOUBLE_TO_INT);
362579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson        MAP.put(Rops.CONV_I2L,             Dops.INT_TO_LONG);
363579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson        MAP.put(Rops.CONV_F2L,             Dops.FLOAT_TO_LONG);
364579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson        MAP.put(Rops.CONV_D2L,             Dops.DOUBLE_TO_LONG);
365579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson        MAP.put(Rops.CONV_I2F,             Dops.INT_TO_FLOAT);
366579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson        MAP.put(Rops.CONV_L2F,             Dops.LONG_TO_FLOAT);
367579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson        MAP.put(Rops.CONV_D2F,             Dops.DOUBLE_TO_FLOAT);
368579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson        MAP.put(Rops.CONV_I2D,             Dops.INT_TO_DOUBLE);
369579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson        MAP.put(Rops.CONV_L2D,             Dops.LONG_TO_DOUBLE);
370579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson        MAP.put(Rops.CONV_F2D,             Dops.FLOAT_TO_DOUBLE);
371579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson        MAP.put(Rops.TO_BYTE,              Dops.INT_TO_BYTE);
372579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson        MAP.put(Rops.TO_CHAR,              Dops.INT_TO_CHAR);
373579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson        MAP.put(Rops.TO_SHORT,             Dops.INT_TO_SHORT);
374579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson        MAP.put(Rops.RETURN_VOID,          Dops.RETURN_VOID);
375579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson        MAP.put(Rops.RETURN_INT,           Dops.RETURN);
376579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson        MAP.put(Rops.RETURN_LONG,          Dops.RETURN_WIDE);
377579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson        MAP.put(Rops.RETURN_FLOAT,         Dops.RETURN);
378579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson        MAP.put(Rops.RETURN_DOUBLE,        Dops.RETURN_WIDE);
379579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson        MAP.put(Rops.RETURN_OBJECT,        Dops.RETURN_OBJECT);
380579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson        MAP.put(Rops.ARRAY_LENGTH,         Dops.ARRAY_LENGTH);
381579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson        MAP.put(Rops.THROW,                Dops.THROW);
382579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson        MAP.put(Rops.MONITOR_ENTER,        Dops.MONITOR_ENTER);
383579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson        MAP.put(Rops.MONITOR_EXIT,         Dops.MONITOR_EXIT);
384579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson        MAP.put(Rops.AGET_INT,             Dops.AGET);
385579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson        MAP.put(Rops.AGET_LONG,            Dops.AGET_WIDE);
386579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson        MAP.put(Rops.AGET_FLOAT,           Dops.AGET);
387579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson        MAP.put(Rops.AGET_DOUBLE,          Dops.AGET_WIDE);
388579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson        MAP.put(Rops.AGET_OBJECT,          Dops.AGET_OBJECT);
389579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson        MAP.put(Rops.AGET_BOOLEAN,         Dops.AGET_BOOLEAN);
390579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson        MAP.put(Rops.AGET_BYTE,            Dops.AGET_BYTE);
391579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson        MAP.put(Rops.AGET_CHAR,            Dops.AGET_CHAR);
392579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson        MAP.put(Rops.AGET_SHORT,           Dops.AGET_SHORT);
393579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson        MAP.put(Rops.APUT_INT,             Dops.APUT);
394579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson        MAP.put(Rops.APUT_LONG,            Dops.APUT_WIDE);
395579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson        MAP.put(Rops.APUT_FLOAT,           Dops.APUT);
396579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson        MAP.put(Rops.APUT_DOUBLE,          Dops.APUT_WIDE);
397579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson        MAP.put(Rops.APUT_OBJECT,          Dops.APUT_OBJECT);
398579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson        MAP.put(Rops.APUT_BOOLEAN,         Dops.APUT_BOOLEAN);
399579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson        MAP.put(Rops.APUT_BYTE,            Dops.APUT_BYTE);
400579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson        MAP.put(Rops.APUT_CHAR,            Dops.APUT_CHAR);
401579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson        MAP.put(Rops.APUT_SHORT,           Dops.APUT_SHORT);
402579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson        MAP.put(Rops.NEW_INSTANCE,         Dops.NEW_INSTANCE);
403579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson        MAP.put(Rops.CHECK_CAST,           Dops.CHECK_CAST);
404579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson        MAP.put(Rops.INSTANCE_OF,          Dops.INSTANCE_OF);
405579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson
406579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson        MAP.put(Rops.GET_FIELD_LONG,       Dops.IGET_WIDE);
407579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson        MAP.put(Rops.GET_FIELD_FLOAT,      Dops.IGET);
408579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson        MAP.put(Rops.GET_FIELD_DOUBLE,     Dops.IGET_WIDE);
409579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson        MAP.put(Rops.GET_FIELD_OBJECT,     Dops.IGET_OBJECT);
410579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson        /*
411579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson         * Note: No map entries for get_field_* for non-long integral types,
412579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson         * since they need to be handled specially (see dopFor() below).
413579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson         */
414579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson
415579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson        MAP.put(Rops.GET_STATIC_LONG,      Dops.SGET_WIDE);
416579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson        MAP.put(Rops.GET_STATIC_FLOAT,     Dops.SGET);
417579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson        MAP.put(Rops.GET_STATIC_DOUBLE,    Dops.SGET_WIDE);
418579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson        MAP.put(Rops.GET_STATIC_OBJECT,    Dops.SGET_OBJECT);
419579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson        /*
420579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson         * Note: No map entries for get_static* for non-long integral types,
421579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson         * since they need to be handled specially (see dopFor() below).
422579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson         */
423579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson
424579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson        MAP.put(Rops.PUT_FIELD_LONG,       Dops.IPUT_WIDE);
425579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson        MAP.put(Rops.PUT_FIELD_FLOAT,      Dops.IPUT);
426579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson        MAP.put(Rops.PUT_FIELD_DOUBLE,     Dops.IPUT_WIDE);
427579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson        MAP.put(Rops.PUT_FIELD_OBJECT,     Dops.IPUT_OBJECT);
428579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson        /*
429579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson         * Note: No map entries for put_field_* for non-long integral types,
430579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson         * since they need to be handled specially (see dopFor() below).
431579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson         */
432579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson
433579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson        MAP.put(Rops.PUT_STATIC_LONG,      Dops.SPUT_WIDE);
434579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson        MAP.put(Rops.PUT_STATIC_FLOAT,     Dops.SPUT);
435579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson        MAP.put(Rops.PUT_STATIC_DOUBLE,    Dops.SPUT_WIDE);
436579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson        MAP.put(Rops.PUT_STATIC_OBJECT,    Dops.SPUT_OBJECT);
437579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson        /*
438579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson         * Note: No map entries for put_static* for non-long integral types,
439579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson         * since they need to be handled specially (see dopFor() below).
440579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson         */
441579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson
442579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson        /*
443579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson         * Note: No map entries for invoke*, new_array, and
444579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson         * filled_new_array, since they need to be handled specially
445579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson         * (see dopFor() below).
446579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson         */
447579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson    }
448579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson
449579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson    /**
450579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson     * Returns the dalvik opcode appropriate for the given register-based
451579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson     * instruction.
452579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson     *
453579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson     * @param insn {@code non-null;} the original instruction
454579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson     * @return the corresponding dalvik opcode; one of the constants in
455579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson     * {@link Dops}
456579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson     */
457579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson    public static Dop dopFor(Insn insn) {
458579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson        Rop rop = insn.getOpcode();
459579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson
460579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson        /*
461579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson         * First, just try looking up the rop in the MAP of easy
462579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson         * cases.
463579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson         */
464579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson        Dop result = MAP.get(rop);
465579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson        if (result != null) {
466579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson            return result;
467579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson        }
468579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson
469579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson        /*
470579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson         * There was no easy case for the rop, so look up the opcode, and
471579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson         * do something special for each:
472579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson         *
473579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson         * The move_exception, new_array, filled_new_array, and
474579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson         * invoke* opcodes won't be found in MAP, since they'll each
475579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson         * have different source and/or result register types / lists.
476579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson         *
477579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson         * The get* and put* opcodes for (non-long) integral types
478579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson         * aren't in the map, since the type signatures aren't
479579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson         * sufficient to distinguish between the types (the salient
480579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson         * source or result will always be just "int").
481579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson         *
482579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson         * And const instruction need to distinguish between strings and
483579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson         * classes.
484579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson         */
485579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson
486579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson        switch (rop.getOpcode()) {
487579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson            case RegOps.MOVE_EXCEPTION:   return Dops.MOVE_EXCEPTION;
488579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson            case RegOps.INVOKE_STATIC:    return Dops.INVOKE_STATIC;
489579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson            case RegOps.INVOKE_VIRTUAL:   return Dops.INVOKE_VIRTUAL;
490579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson            case RegOps.INVOKE_SUPER:     return Dops.INVOKE_SUPER;
491579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson            case RegOps.INVOKE_DIRECT:    return Dops.INVOKE_DIRECT;
492579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson            case RegOps.INVOKE_INTERFACE: return Dops.INVOKE_INTERFACE;
493579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson            case RegOps.NEW_ARRAY:        return Dops.NEW_ARRAY;
494579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson            case RegOps.FILLED_NEW_ARRAY: return Dops.FILLED_NEW_ARRAY;
495579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson            case RegOps.FILL_ARRAY_DATA:  return Dops.FILL_ARRAY_DATA;
496579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson            case RegOps.MOVE_RESULT: {
497579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson                RegisterSpec resultReg = insn.getResult();
498579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson
499579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson                if (resultReg == null) {
500579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson                    return Dops.NOP;
501579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson                } else {
502579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson                    switch (resultReg.getBasicType()) {
503579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson                        case Type.BT_INT:
504579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson                        case Type.BT_FLOAT:
505579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson                        case Type.BT_BOOLEAN:
506579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson                        case Type.BT_BYTE:
507579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson                        case Type.BT_CHAR:
508579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson                        case Type.BT_SHORT:
509579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson                            return Dops.MOVE_RESULT;
510579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson                        case Type.BT_LONG:
511579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson                        case Type.BT_DOUBLE:
512579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson                            return Dops.MOVE_RESULT_WIDE;
513579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson                        case Type.BT_OBJECT:
514579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson                            return Dops.MOVE_RESULT_OBJECT;
515579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson                        default: {
516579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson                            throw new RuntimeException("Unexpected basic type");
517579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson                        }
518579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson                    }
519579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson                }
520579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson            }
521579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson
522579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson            case RegOps.GET_FIELD: {
523579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson                CstFieldRef ref =
524579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson                    (CstFieldRef) ((ThrowingCstInsn) insn).getConstant();
525579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson                int basicType = ref.getBasicType();
526579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson                switch (basicType) {
527579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson                    case Type.BT_BOOLEAN: return Dops.IGET_BOOLEAN;
528579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson                    case Type.BT_BYTE:    return Dops.IGET_BYTE;
529579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson                    case Type.BT_CHAR:    return Dops.IGET_CHAR;
530579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson                    case Type.BT_SHORT:   return Dops.IGET_SHORT;
531579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson                    case Type.BT_INT:     return Dops.IGET;
532579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson                }
533579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson                break;
534579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson            }
535579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson            case RegOps.PUT_FIELD: {
536579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson                CstFieldRef ref =
537579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson                    (CstFieldRef) ((ThrowingCstInsn) insn).getConstant();
538579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson                int basicType = ref.getBasicType();
539579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson                switch (basicType) {
540579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson                    case Type.BT_BOOLEAN: return Dops.IPUT_BOOLEAN;
541579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson                    case Type.BT_BYTE:    return Dops.IPUT_BYTE;
542579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson                    case Type.BT_CHAR:    return Dops.IPUT_CHAR;
543579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson                    case Type.BT_SHORT:   return Dops.IPUT_SHORT;
544579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson                    case Type.BT_INT:     return Dops.IPUT;
545579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson                }
546579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson                break;
547579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson            }
548579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson            case RegOps.GET_STATIC: {
549579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson                CstFieldRef ref =
550579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson                    (CstFieldRef) ((ThrowingCstInsn) insn).getConstant();
551579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson                int basicType = ref.getBasicType();
552579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson                switch (basicType) {
553579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson                    case Type.BT_BOOLEAN: return Dops.SGET_BOOLEAN;
554579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson                    case Type.BT_BYTE:    return Dops.SGET_BYTE;
555579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson                    case Type.BT_CHAR:    return Dops.SGET_CHAR;
556579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson                    case Type.BT_SHORT:   return Dops.SGET_SHORT;
557579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson                    case Type.BT_INT:     return Dops.SGET;
558579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson                }
559579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson                break;
560579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson            }
561579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson            case RegOps.PUT_STATIC: {
562579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson                CstFieldRef ref =
563579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson                    (CstFieldRef) ((ThrowingCstInsn) insn).getConstant();
564579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson                int basicType = ref.getBasicType();
565579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson                switch (basicType) {
566579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson                    case Type.BT_BOOLEAN: return Dops.SPUT_BOOLEAN;
567579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson                    case Type.BT_BYTE:    return Dops.SPUT_BYTE;
568579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson                    case Type.BT_CHAR:    return Dops.SPUT_CHAR;
569579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson                    case Type.BT_SHORT:   return Dops.SPUT_SHORT;
570579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson                    case Type.BT_INT:     return Dops.SPUT;
571579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson                }
572579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson                break;
573579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson            }
574579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson            case RegOps.CONST: {
575579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson                Constant cst = ((ThrowingCstInsn) insn).getConstant();
576579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson                if (cst instanceof CstType) {
577579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson                    return Dops.CONST_CLASS;
578579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson                } else if (cst instanceof CstString) {
579579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson                    return Dops.CONST_STRING;
580579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson                }
581579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson                break;
582579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson            }
583579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson        }
584579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson
585579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson        throw new RuntimeException("unknown rop: " + rop);
586579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson    }
587579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson}
588