1f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
2f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Copyright (C) 2007 The Android Open Source Project
3f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
4f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
5f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * you may not use this file except in compliance with the License.
6f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * You may obtain a copy of the License at
7f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
8f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
9f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
10f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Unless required by applicable law or agreed to in writing, software
11f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
12f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * See the License for the specific language governing permissions and
14f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * limitations under the License.
15f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
16f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
17f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectpackage com.android.dx.dex.code;
18f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
19f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport com.android.dx.rop.code.Insn;
20f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport com.android.dx.rop.code.RegOps;
21f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport com.android.dx.rop.code.Rop;
22f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport com.android.dx.rop.code.Rops;
23f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport com.android.dx.rop.code.ThrowingCstInsn;
24f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport com.android.dx.rop.code.RegisterSpec;
25f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport com.android.dx.rop.cst.Constant;
26f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport com.android.dx.rop.cst.CstFieldRef;
27f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport com.android.dx.rop.cst.CstType;
28333201833d506a3accdeac6ceb7caba8d4b95797Jesse Wilsonimport com.android.dx.rop.cst.CstString;
29f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport com.android.dx.rop.type.Type;
30f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
31f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.util.HashMap;
32f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
33f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/**
34f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Translator from rop-level {@link Insn} instances to corresponding
35f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * {@link Dop} instances.
36f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
37f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectpublic final class RopToDop {
3899409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project    /** {@code non-null;} map from all the common rops to dalvik opcodes */
39f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    private static final HashMap<Rop, Dop> MAP;
40f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
41f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
42f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This class is uninstantiable.
43f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
44f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    private RopToDop() {
45f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        // This space intentionally left blank.
46f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
47f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4812209c24903959d41f887c05e6a04e0b08367463Dan Bornstein    /*
4912209c24903959d41f887c05e6a04e0b08367463Dan Bornstein     * The following comment lists each opcode that should be considered
5012209c24903959d41f887c05e6a04e0b08367463Dan Bornstein     * the "head" of an opcode chain, in terms of the process of fitting
5112209c24903959d41f887c05e6a04e0b08367463Dan Bornstein     * an instruction's arguments to an actual opcode. This list is
5212209c24903959d41f887c05e6a04e0b08367463Dan Bornstein     * automatically generated and may be of use in double-checking the
5312209c24903959d41f887c05e6a04e0b08367463Dan Bornstein     * manually-generated static initialization code for this class.
5412209c24903959d41f887c05e6a04e0b08367463Dan Bornstein     *
5512209c24903959d41f887c05e6a04e0b08367463Dan Bornstein     * TODO: Make opcode-gen produce useful code in this case instead
5612209c24903959d41f887c05e6a04e0b08367463Dan Bornstein     * of just a comment.
5712209c24903959d41f887c05e6a04e0b08367463Dan Bornstein     */
5812209c24903959d41f887c05e6a04e0b08367463Dan Bornstein
5912209c24903959d41f887c05e6a04e0b08367463Dan Bornstein    // BEGIN(first-opcodes); GENERATED AUTOMATICALLY BY opcode-gen
607ba91291bb6ce64691398a8751656207e8e3e98dDan Bornstein    //     Opcodes.NOP
617ba91291bb6ce64691398a8751656207e8e3e98dDan Bornstein    //     Opcodes.MOVE
627ba91291bb6ce64691398a8751656207e8e3e98dDan Bornstein    //     Opcodes.MOVE_WIDE
637ba91291bb6ce64691398a8751656207e8e3e98dDan Bornstein    //     Opcodes.MOVE_OBJECT
647ba91291bb6ce64691398a8751656207e8e3e98dDan Bornstein    //     Opcodes.MOVE_RESULT
657ba91291bb6ce64691398a8751656207e8e3e98dDan Bornstein    //     Opcodes.MOVE_RESULT_WIDE
667ba91291bb6ce64691398a8751656207e8e3e98dDan Bornstein    //     Opcodes.MOVE_RESULT_OBJECT
677ba91291bb6ce64691398a8751656207e8e3e98dDan Bornstein    //     Opcodes.MOVE_EXCEPTION
687ba91291bb6ce64691398a8751656207e8e3e98dDan Bornstein    //     Opcodes.RETURN_VOID
697ba91291bb6ce64691398a8751656207e8e3e98dDan Bornstein    //     Opcodes.RETURN
707ba91291bb6ce64691398a8751656207e8e3e98dDan Bornstein    //     Opcodes.RETURN_WIDE
717ba91291bb6ce64691398a8751656207e8e3e98dDan Bornstein    //     Opcodes.RETURN_OBJECT
727ba91291bb6ce64691398a8751656207e8e3e98dDan Bornstein    //     Opcodes.CONST_4
737ba91291bb6ce64691398a8751656207e8e3e98dDan Bornstein    //     Opcodes.CONST_WIDE_16
747ba91291bb6ce64691398a8751656207e8e3e98dDan Bornstein    //     Opcodes.CONST_STRING
757ba91291bb6ce64691398a8751656207e8e3e98dDan Bornstein    //     Opcodes.CONST_CLASS
767ba91291bb6ce64691398a8751656207e8e3e98dDan Bornstein    //     Opcodes.MONITOR_ENTER
777ba91291bb6ce64691398a8751656207e8e3e98dDan Bornstein    //     Opcodes.MONITOR_EXIT
787ba91291bb6ce64691398a8751656207e8e3e98dDan Bornstein    //     Opcodes.CHECK_CAST
797ba91291bb6ce64691398a8751656207e8e3e98dDan Bornstein    //     Opcodes.INSTANCE_OF
807ba91291bb6ce64691398a8751656207e8e3e98dDan Bornstein    //     Opcodes.ARRAY_LENGTH
817ba91291bb6ce64691398a8751656207e8e3e98dDan Bornstein    //     Opcodes.NEW_INSTANCE
827ba91291bb6ce64691398a8751656207e8e3e98dDan Bornstein    //     Opcodes.NEW_ARRAY
837ba91291bb6ce64691398a8751656207e8e3e98dDan Bornstein    //     Opcodes.FILLED_NEW_ARRAY
847ba91291bb6ce64691398a8751656207e8e3e98dDan Bornstein    //     Opcodes.FILL_ARRAY_DATA
857ba91291bb6ce64691398a8751656207e8e3e98dDan Bornstein    //     Opcodes.THROW
867ba91291bb6ce64691398a8751656207e8e3e98dDan Bornstein    //     Opcodes.GOTO
877ba91291bb6ce64691398a8751656207e8e3e98dDan Bornstein    //     Opcodes.PACKED_SWITCH
887ba91291bb6ce64691398a8751656207e8e3e98dDan Bornstein    //     Opcodes.SPARSE_SWITCH
897ba91291bb6ce64691398a8751656207e8e3e98dDan Bornstein    //     Opcodes.CMPL_FLOAT
907ba91291bb6ce64691398a8751656207e8e3e98dDan Bornstein    //     Opcodes.CMPG_FLOAT
917ba91291bb6ce64691398a8751656207e8e3e98dDan Bornstein    //     Opcodes.CMPL_DOUBLE
927ba91291bb6ce64691398a8751656207e8e3e98dDan Bornstein    //     Opcodes.CMPG_DOUBLE
937ba91291bb6ce64691398a8751656207e8e3e98dDan Bornstein    //     Opcodes.CMP_LONG
947ba91291bb6ce64691398a8751656207e8e3e98dDan Bornstein    //     Opcodes.IF_EQ
957ba91291bb6ce64691398a8751656207e8e3e98dDan Bornstein    //     Opcodes.IF_NE
967ba91291bb6ce64691398a8751656207e8e3e98dDan Bornstein    //     Opcodes.IF_LT
977ba91291bb6ce64691398a8751656207e8e3e98dDan Bornstein    //     Opcodes.IF_GE
987ba91291bb6ce64691398a8751656207e8e3e98dDan Bornstein    //     Opcodes.IF_GT
997ba91291bb6ce64691398a8751656207e8e3e98dDan Bornstein    //     Opcodes.IF_LE
1007ba91291bb6ce64691398a8751656207e8e3e98dDan Bornstein    //     Opcodes.IF_EQZ
1017ba91291bb6ce64691398a8751656207e8e3e98dDan Bornstein    //     Opcodes.IF_NEZ
1027ba91291bb6ce64691398a8751656207e8e3e98dDan Bornstein    //     Opcodes.IF_LTZ
1037ba91291bb6ce64691398a8751656207e8e3e98dDan Bornstein    //     Opcodes.IF_GEZ
1047ba91291bb6ce64691398a8751656207e8e3e98dDan Bornstein    //     Opcodes.IF_GTZ
1057ba91291bb6ce64691398a8751656207e8e3e98dDan Bornstein    //     Opcodes.IF_LEZ
1067ba91291bb6ce64691398a8751656207e8e3e98dDan Bornstein    //     Opcodes.AGET
1077ba91291bb6ce64691398a8751656207e8e3e98dDan Bornstein    //     Opcodes.AGET_WIDE
1087ba91291bb6ce64691398a8751656207e8e3e98dDan Bornstein    //     Opcodes.AGET_OBJECT
1097ba91291bb6ce64691398a8751656207e8e3e98dDan Bornstein    //     Opcodes.AGET_BOOLEAN
1107ba91291bb6ce64691398a8751656207e8e3e98dDan Bornstein    //     Opcodes.AGET_BYTE
1117ba91291bb6ce64691398a8751656207e8e3e98dDan Bornstein    //     Opcodes.AGET_CHAR
1127ba91291bb6ce64691398a8751656207e8e3e98dDan Bornstein    //     Opcodes.AGET_SHORT
1137ba91291bb6ce64691398a8751656207e8e3e98dDan Bornstein    //     Opcodes.APUT
1147ba91291bb6ce64691398a8751656207e8e3e98dDan Bornstein    //     Opcodes.APUT_WIDE
1157ba91291bb6ce64691398a8751656207e8e3e98dDan Bornstein    //     Opcodes.APUT_OBJECT
1167ba91291bb6ce64691398a8751656207e8e3e98dDan Bornstein    //     Opcodes.APUT_BOOLEAN
1177ba91291bb6ce64691398a8751656207e8e3e98dDan Bornstein    //     Opcodes.APUT_BYTE
1187ba91291bb6ce64691398a8751656207e8e3e98dDan Bornstein    //     Opcodes.APUT_CHAR
1197ba91291bb6ce64691398a8751656207e8e3e98dDan Bornstein    //     Opcodes.APUT_SHORT
1207ba91291bb6ce64691398a8751656207e8e3e98dDan Bornstein    //     Opcodes.IGET
1217ba91291bb6ce64691398a8751656207e8e3e98dDan Bornstein    //     Opcodes.IGET_WIDE
1227ba91291bb6ce64691398a8751656207e8e3e98dDan Bornstein    //     Opcodes.IGET_OBJECT
1237ba91291bb6ce64691398a8751656207e8e3e98dDan Bornstein    //     Opcodes.IGET_BOOLEAN
1247ba91291bb6ce64691398a8751656207e8e3e98dDan Bornstein    //     Opcodes.IGET_BYTE
1257ba91291bb6ce64691398a8751656207e8e3e98dDan Bornstein    //     Opcodes.IGET_CHAR
1267ba91291bb6ce64691398a8751656207e8e3e98dDan Bornstein    //     Opcodes.IGET_SHORT
1277ba91291bb6ce64691398a8751656207e8e3e98dDan Bornstein    //     Opcodes.IPUT
1287ba91291bb6ce64691398a8751656207e8e3e98dDan Bornstein    //     Opcodes.IPUT_WIDE
1297ba91291bb6ce64691398a8751656207e8e3e98dDan Bornstein    //     Opcodes.IPUT_OBJECT
1307ba91291bb6ce64691398a8751656207e8e3e98dDan Bornstein    //     Opcodes.IPUT_BOOLEAN
1317ba91291bb6ce64691398a8751656207e8e3e98dDan Bornstein    //     Opcodes.IPUT_BYTE
1327ba91291bb6ce64691398a8751656207e8e3e98dDan Bornstein    //     Opcodes.IPUT_CHAR
1337ba91291bb6ce64691398a8751656207e8e3e98dDan Bornstein    //     Opcodes.IPUT_SHORT
1347ba91291bb6ce64691398a8751656207e8e3e98dDan Bornstein    //     Opcodes.SGET
1357ba91291bb6ce64691398a8751656207e8e3e98dDan Bornstein    //     Opcodes.SGET_WIDE
1367ba91291bb6ce64691398a8751656207e8e3e98dDan Bornstein    //     Opcodes.SGET_OBJECT
1377ba91291bb6ce64691398a8751656207e8e3e98dDan Bornstein    //     Opcodes.SGET_BOOLEAN
1387ba91291bb6ce64691398a8751656207e8e3e98dDan Bornstein    //     Opcodes.SGET_BYTE
1397ba91291bb6ce64691398a8751656207e8e3e98dDan Bornstein    //     Opcodes.SGET_CHAR
1407ba91291bb6ce64691398a8751656207e8e3e98dDan Bornstein    //     Opcodes.SGET_SHORT
1417ba91291bb6ce64691398a8751656207e8e3e98dDan Bornstein    //     Opcodes.SPUT
1427ba91291bb6ce64691398a8751656207e8e3e98dDan Bornstein    //     Opcodes.SPUT_WIDE
1437ba91291bb6ce64691398a8751656207e8e3e98dDan Bornstein    //     Opcodes.SPUT_OBJECT
1447ba91291bb6ce64691398a8751656207e8e3e98dDan Bornstein    //     Opcodes.SPUT_BOOLEAN
1457ba91291bb6ce64691398a8751656207e8e3e98dDan Bornstein    //     Opcodes.SPUT_BYTE
1467ba91291bb6ce64691398a8751656207e8e3e98dDan Bornstein    //     Opcodes.SPUT_CHAR
1477ba91291bb6ce64691398a8751656207e8e3e98dDan Bornstein    //     Opcodes.SPUT_SHORT
1487ba91291bb6ce64691398a8751656207e8e3e98dDan Bornstein    //     Opcodes.INVOKE_VIRTUAL
1497ba91291bb6ce64691398a8751656207e8e3e98dDan Bornstein    //     Opcodes.INVOKE_SUPER
1507ba91291bb6ce64691398a8751656207e8e3e98dDan Bornstein    //     Opcodes.INVOKE_DIRECT
1517ba91291bb6ce64691398a8751656207e8e3e98dDan Bornstein    //     Opcodes.INVOKE_STATIC
1527ba91291bb6ce64691398a8751656207e8e3e98dDan Bornstein    //     Opcodes.INVOKE_INTERFACE
1537ba91291bb6ce64691398a8751656207e8e3e98dDan Bornstein    //     Opcodes.NEG_INT
1547ba91291bb6ce64691398a8751656207e8e3e98dDan Bornstein    //     Opcodes.NOT_INT
1557ba91291bb6ce64691398a8751656207e8e3e98dDan Bornstein    //     Opcodes.NEG_LONG
1567ba91291bb6ce64691398a8751656207e8e3e98dDan Bornstein    //     Opcodes.NOT_LONG
1577ba91291bb6ce64691398a8751656207e8e3e98dDan Bornstein    //     Opcodes.NEG_FLOAT
1587ba91291bb6ce64691398a8751656207e8e3e98dDan Bornstein    //     Opcodes.NEG_DOUBLE
1597ba91291bb6ce64691398a8751656207e8e3e98dDan Bornstein    //     Opcodes.INT_TO_LONG
1607ba91291bb6ce64691398a8751656207e8e3e98dDan Bornstein    //     Opcodes.INT_TO_FLOAT
1617ba91291bb6ce64691398a8751656207e8e3e98dDan Bornstein    //     Opcodes.INT_TO_DOUBLE
1627ba91291bb6ce64691398a8751656207e8e3e98dDan Bornstein    //     Opcodes.LONG_TO_INT
1637ba91291bb6ce64691398a8751656207e8e3e98dDan Bornstein    //     Opcodes.LONG_TO_FLOAT
1647ba91291bb6ce64691398a8751656207e8e3e98dDan Bornstein    //     Opcodes.LONG_TO_DOUBLE
1657ba91291bb6ce64691398a8751656207e8e3e98dDan Bornstein    //     Opcodes.FLOAT_TO_INT
1667ba91291bb6ce64691398a8751656207e8e3e98dDan Bornstein    //     Opcodes.FLOAT_TO_LONG
1677ba91291bb6ce64691398a8751656207e8e3e98dDan Bornstein    //     Opcodes.FLOAT_TO_DOUBLE
1687ba91291bb6ce64691398a8751656207e8e3e98dDan Bornstein    //     Opcodes.DOUBLE_TO_INT
1697ba91291bb6ce64691398a8751656207e8e3e98dDan Bornstein    //     Opcodes.DOUBLE_TO_LONG
1707ba91291bb6ce64691398a8751656207e8e3e98dDan Bornstein    //     Opcodes.DOUBLE_TO_FLOAT
1717ba91291bb6ce64691398a8751656207e8e3e98dDan Bornstein    //     Opcodes.INT_TO_BYTE
1727ba91291bb6ce64691398a8751656207e8e3e98dDan Bornstein    //     Opcodes.INT_TO_CHAR
1737ba91291bb6ce64691398a8751656207e8e3e98dDan Bornstein    //     Opcodes.INT_TO_SHORT
1747ba91291bb6ce64691398a8751656207e8e3e98dDan Bornstein    //     Opcodes.ADD_INT_2ADDR
1757ba91291bb6ce64691398a8751656207e8e3e98dDan Bornstein    //     Opcodes.SUB_INT_2ADDR
1767ba91291bb6ce64691398a8751656207e8e3e98dDan Bornstein    //     Opcodes.MUL_INT_2ADDR
1777ba91291bb6ce64691398a8751656207e8e3e98dDan Bornstein    //     Opcodes.DIV_INT_2ADDR
1787ba91291bb6ce64691398a8751656207e8e3e98dDan Bornstein    //     Opcodes.REM_INT_2ADDR
1797ba91291bb6ce64691398a8751656207e8e3e98dDan Bornstein    //     Opcodes.AND_INT_2ADDR
1807ba91291bb6ce64691398a8751656207e8e3e98dDan Bornstein    //     Opcodes.OR_INT_2ADDR
1817ba91291bb6ce64691398a8751656207e8e3e98dDan Bornstein    //     Opcodes.XOR_INT_2ADDR
1827ba91291bb6ce64691398a8751656207e8e3e98dDan Bornstein    //     Opcodes.SHL_INT_2ADDR
1837ba91291bb6ce64691398a8751656207e8e3e98dDan Bornstein    //     Opcodes.SHR_INT_2ADDR
1847ba91291bb6ce64691398a8751656207e8e3e98dDan Bornstein    //     Opcodes.USHR_INT_2ADDR
1857ba91291bb6ce64691398a8751656207e8e3e98dDan Bornstein    //     Opcodes.ADD_LONG_2ADDR
1867ba91291bb6ce64691398a8751656207e8e3e98dDan Bornstein    //     Opcodes.SUB_LONG_2ADDR
1877ba91291bb6ce64691398a8751656207e8e3e98dDan Bornstein    //     Opcodes.MUL_LONG_2ADDR
1887ba91291bb6ce64691398a8751656207e8e3e98dDan Bornstein    //     Opcodes.DIV_LONG_2ADDR
1897ba91291bb6ce64691398a8751656207e8e3e98dDan Bornstein    //     Opcodes.REM_LONG_2ADDR
1907ba91291bb6ce64691398a8751656207e8e3e98dDan Bornstein    //     Opcodes.AND_LONG_2ADDR
1917ba91291bb6ce64691398a8751656207e8e3e98dDan Bornstein    //     Opcodes.OR_LONG_2ADDR
1927ba91291bb6ce64691398a8751656207e8e3e98dDan Bornstein    //     Opcodes.XOR_LONG_2ADDR
1937ba91291bb6ce64691398a8751656207e8e3e98dDan Bornstein    //     Opcodes.SHL_LONG_2ADDR
1947ba91291bb6ce64691398a8751656207e8e3e98dDan Bornstein    //     Opcodes.SHR_LONG_2ADDR
1957ba91291bb6ce64691398a8751656207e8e3e98dDan Bornstein    //     Opcodes.USHR_LONG_2ADDR
1967ba91291bb6ce64691398a8751656207e8e3e98dDan Bornstein    //     Opcodes.ADD_FLOAT_2ADDR
1977ba91291bb6ce64691398a8751656207e8e3e98dDan Bornstein    //     Opcodes.SUB_FLOAT_2ADDR
1987ba91291bb6ce64691398a8751656207e8e3e98dDan Bornstein    //     Opcodes.MUL_FLOAT_2ADDR
1997ba91291bb6ce64691398a8751656207e8e3e98dDan Bornstein    //     Opcodes.DIV_FLOAT_2ADDR
2007ba91291bb6ce64691398a8751656207e8e3e98dDan Bornstein    //     Opcodes.REM_FLOAT_2ADDR
2017ba91291bb6ce64691398a8751656207e8e3e98dDan Bornstein    //     Opcodes.ADD_DOUBLE_2ADDR
2027ba91291bb6ce64691398a8751656207e8e3e98dDan Bornstein    //     Opcodes.SUB_DOUBLE_2ADDR
2037ba91291bb6ce64691398a8751656207e8e3e98dDan Bornstein    //     Opcodes.MUL_DOUBLE_2ADDR
2047ba91291bb6ce64691398a8751656207e8e3e98dDan Bornstein    //     Opcodes.DIV_DOUBLE_2ADDR
2057ba91291bb6ce64691398a8751656207e8e3e98dDan Bornstein    //     Opcodes.REM_DOUBLE_2ADDR
2067ba91291bb6ce64691398a8751656207e8e3e98dDan Bornstein    //     Opcodes.ADD_INT_LIT8
2077ba91291bb6ce64691398a8751656207e8e3e98dDan Bornstein    //     Opcodes.RSUB_INT_LIT8
2087ba91291bb6ce64691398a8751656207e8e3e98dDan Bornstein    //     Opcodes.MUL_INT_LIT8
2097ba91291bb6ce64691398a8751656207e8e3e98dDan Bornstein    //     Opcodes.DIV_INT_LIT8
2107ba91291bb6ce64691398a8751656207e8e3e98dDan Bornstein    //     Opcodes.REM_INT_LIT8
2117ba91291bb6ce64691398a8751656207e8e3e98dDan Bornstein    //     Opcodes.AND_INT_LIT8
2127ba91291bb6ce64691398a8751656207e8e3e98dDan Bornstein    //     Opcodes.OR_INT_LIT8
2137ba91291bb6ce64691398a8751656207e8e3e98dDan Bornstein    //     Opcodes.XOR_INT_LIT8
2147ba91291bb6ce64691398a8751656207e8e3e98dDan Bornstein    //     Opcodes.SHL_INT_LIT8
2157ba91291bb6ce64691398a8751656207e8e3e98dDan Bornstein    //     Opcodes.SHR_INT_LIT8
2167ba91291bb6ce64691398a8751656207e8e3e98dDan Bornstein    //     Opcodes.USHR_INT_LIT8
21712209c24903959d41f887c05e6a04e0b08367463Dan Bornstein    // END(first-opcodes)
21812209c24903959d41f887c05e6a04e0b08367463Dan Bornstein
219f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    static {
220f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        /*
221f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         * Note: The choices made here are to pick the optimistically
222f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         * smallest Dalvik opcode, and leave it to later processing to
22312209c24903959d41f887c05e6a04e0b08367463Dan Bornstein         * pessimize. See the automatically-generated comment above
22412209c24903959d41f887c05e6a04e0b08367463Dan Bornstein         * for reference.
225f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         */
226f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        MAP = new HashMap<Rop, Dop>(400);
227f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        MAP.put(Rops.NOP,               Dops.NOP);
228f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        MAP.put(Rops.MOVE_INT,          Dops.MOVE);
229f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        MAP.put(Rops.MOVE_LONG,         Dops.MOVE_WIDE);
230f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        MAP.put(Rops.MOVE_FLOAT,        Dops.MOVE);
231f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        MAP.put(Rops.MOVE_DOUBLE,       Dops.MOVE_WIDE);
232f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        MAP.put(Rops.MOVE_OBJECT,       Dops.MOVE_OBJECT);
233f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        MAP.put(Rops.MOVE_PARAM_INT,    Dops.MOVE);
234f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        MAP.put(Rops.MOVE_PARAM_LONG,   Dops.MOVE_WIDE);
235f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        MAP.put(Rops.MOVE_PARAM_FLOAT,  Dops.MOVE);
236f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        MAP.put(Rops.MOVE_PARAM_DOUBLE, Dops.MOVE_WIDE);
237f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        MAP.put(Rops.MOVE_PARAM_OBJECT, Dops.MOVE_OBJECT);
238f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
239f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        /*
240f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         * Note: No entry for MOVE_EXCEPTION, since it varies by
241f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         * exception type. (That is, there is no unique instance to
242f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         * add to the map.)
243f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         */
244f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
245f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        MAP.put(Rops.CONST_INT,         Dops.CONST_4);
246f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        MAP.put(Rops.CONST_LONG,        Dops.CONST_WIDE_16);
247f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        MAP.put(Rops.CONST_FLOAT,       Dops.CONST_4);
248f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        MAP.put(Rops.CONST_DOUBLE,      Dops.CONST_WIDE_16);
249f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
250f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        /*
251f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         * Note: No entry for CONST_OBJECT, since it needs to turn
252f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         * into either CONST_STRING or CONST_CLASS.
253f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         */
254f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
255f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        /*
256f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         * TODO: I think the only case of this is for null, and
257f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         * const/4 should cover that.
258f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         */
259f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        MAP.put(Rops.CONST_OBJECT_NOTHROW, Dops.CONST_4);
260f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
261f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        MAP.put(Rops.GOTO,                 Dops.GOTO);
262f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        MAP.put(Rops.IF_EQZ_INT,           Dops.IF_EQZ);
263f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        MAP.put(Rops.IF_NEZ_INT,           Dops.IF_NEZ);
264f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        MAP.put(Rops.IF_LTZ_INT,           Dops.IF_LTZ);
265f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        MAP.put(Rops.IF_GEZ_INT,           Dops.IF_GEZ);
266f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        MAP.put(Rops.IF_LEZ_INT,           Dops.IF_LEZ);
267f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        MAP.put(Rops.IF_GTZ_INT,           Dops.IF_GTZ);
268f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        MAP.put(Rops.IF_EQZ_OBJECT,        Dops.IF_EQZ);
269f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        MAP.put(Rops.IF_NEZ_OBJECT,        Dops.IF_NEZ);
270f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        MAP.put(Rops.IF_EQ_INT,            Dops.IF_EQ);
271f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        MAP.put(Rops.IF_NE_INT,            Dops.IF_NE);
272f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        MAP.put(Rops.IF_LT_INT,            Dops.IF_LT);
273f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        MAP.put(Rops.IF_GE_INT,            Dops.IF_GE);
274f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        MAP.put(Rops.IF_LE_INT,            Dops.IF_LE);
275f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        MAP.put(Rops.IF_GT_INT,            Dops.IF_GT);
276f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        MAP.put(Rops.IF_EQ_OBJECT,         Dops.IF_EQ);
277f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        MAP.put(Rops.IF_NE_OBJECT,         Dops.IF_NE);
278f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        MAP.put(Rops.SWITCH,               Dops.SPARSE_SWITCH);
279f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        MAP.put(Rops.ADD_INT,              Dops.ADD_INT_2ADDR);
280f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        MAP.put(Rops.ADD_LONG,             Dops.ADD_LONG_2ADDR);
281f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        MAP.put(Rops.ADD_FLOAT,            Dops.ADD_FLOAT_2ADDR);
282f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        MAP.put(Rops.ADD_DOUBLE,           Dops.ADD_DOUBLE_2ADDR);
283f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        MAP.put(Rops.SUB_INT,              Dops.SUB_INT_2ADDR);
284f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        MAP.put(Rops.SUB_LONG,             Dops.SUB_LONG_2ADDR);
285f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        MAP.put(Rops.SUB_FLOAT,            Dops.SUB_FLOAT_2ADDR);
286f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        MAP.put(Rops.SUB_DOUBLE,           Dops.SUB_DOUBLE_2ADDR);
287f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        MAP.put(Rops.MUL_INT,              Dops.MUL_INT_2ADDR);
288f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        MAP.put(Rops.MUL_LONG,             Dops.MUL_LONG_2ADDR);
289f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        MAP.put(Rops.MUL_FLOAT,            Dops.MUL_FLOAT_2ADDR);
290f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        MAP.put(Rops.MUL_DOUBLE,           Dops.MUL_DOUBLE_2ADDR);
291f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        MAP.put(Rops.DIV_INT,              Dops.DIV_INT_2ADDR);
292f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        MAP.put(Rops.DIV_LONG,             Dops.DIV_LONG_2ADDR);
293f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        MAP.put(Rops.DIV_FLOAT,            Dops.DIV_FLOAT_2ADDR);
294f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        MAP.put(Rops.DIV_DOUBLE,           Dops.DIV_DOUBLE_2ADDR);
295f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        MAP.put(Rops.REM_INT,              Dops.REM_INT_2ADDR);
296f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        MAP.put(Rops.REM_LONG,             Dops.REM_LONG_2ADDR);
297f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        MAP.put(Rops.REM_FLOAT,            Dops.REM_FLOAT_2ADDR);
298f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        MAP.put(Rops.REM_DOUBLE,           Dops.REM_DOUBLE_2ADDR);
299f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        MAP.put(Rops.NEG_INT,              Dops.NEG_INT);
300f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        MAP.put(Rops.NEG_LONG,             Dops.NEG_LONG);
301f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        MAP.put(Rops.NEG_FLOAT,            Dops.NEG_FLOAT);
302f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        MAP.put(Rops.NEG_DOUBLE,           Dops.NEG_DOUBLE);
303f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        MAP.put(Rops.AND_INT,              Dops.AND_INT_2ADDR);
304f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        MAP.put(Rops.AND_LONG,             Dops.AND_LONG_2ADDR);
305f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        MAP.put(Rops.OR_INT,               Dops.OR_INT_2ADDR);
306f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        MAP.put(Rops.OR_LONG,              Dops.OR_LONG_2ADDR);
307f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        MAP.put(Rops.XOR_INT,              Dops.XOR_INT_2ADDR);
308f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        MAP.put(Rops.XOR_LONG,             Dops.XOR_LONG_2ADDR);
309f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        MAP.put(Rops.SHL_INT,              Dops.SHL_INT_2ADDR);
310f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        MAP.put(Rops.SHL_LONG,             Dops.SHL_LONG_2ADDR);
311f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        MAP.put(Rops.SHR_INT,              Dops.SHR_INT_2ADDR);
312f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        MAP.put(Rops.SHR_LONG,             Dops.SHR_LONG_2ADDR);
313f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        MAP.put(Rops.USHR_INT,             Dops.USHR_INT_2ADDR);
314f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        MAP.put(Rops.USHR_LONG,            Dops.USHR_LONG_2ADDR);
315f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        MAP.put(Rops.NOT_INT,              Dops.NOT_INT);
316f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        MAP.put(Rops.NOT_LONG,             Dops.NOT_LONG);
317f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
318f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        MAP.put(Rops.ADD_CONST_INT,        Dops.ADD_INT_LIT8);
319f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        // Note: No dalvik ops for other types of add_const.
320f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3214596322b12a72cdeea8deba1242d9b74da5ba12ajeffhao        MAP.put(Rops.SUB_CONST_INT,        Dops.RSUB_INT_LIT8);
322f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        /*
3234596322b12a72cdeea8deba1242d9b74da5ba12ajeffhao         * Note: No dalvik ops for any type of sub_const; instead
3244596322b12a72cdeea8deba1242d9b74da5ba12ajeffhao         * there's a *reverse* sub (constant - reg) for ints only.
325f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         */
326f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
327f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        MAP.put(Rops.MUL_CONST_INT,        Dops.MUL_INT_LIT8);
328f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        // Note: No dalvik ops for other types of mul_const.
329f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
330f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        MAP.put(Rops.DIV_CONST_INT,        Dops.DIV_INT_LIT8);
331f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        // Note: No dalvik ops for other types of div_const.
332f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
333f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        MAP.put(Rops.REM_CONST_INT,        Dops.REM_INT_LIT8);
334f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        // Note: No dalvik ops for other types of rem_const.
335f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
336f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        MAP.put(Rops.AND_CONST_INT,        Dops.AND_INT_LIT8);
337f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        // Note: No dalvik op for and_const_long.
338f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
339f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        MAP.put(Rops.OR_CONST_INT,         Dops.OR_INT_LIT8);
340f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        // Note: No dalvik op for or_const_long.
341f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
342f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        MAP.put(Rops.XOR_CONST_INT,        Dops.XOR_INT_LIT8);
343f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        // Note: No dalvik op for xor_const_long.
344f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
345f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        MAP.put(Rops.SHL_CONST_INT,        Dops.SHL_INT_LIT8);
346f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        // Note: No dalvik op for shl_const_long.
347f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
348f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        MAP.put(Rops.SHR_CONST_INT,        Dops.SHR_INT_LIT8);
349f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        // Note: No dalvik op for shr_const_long.
350f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
351f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        MAP.put(Rops.USHR_CONST_INT,       Dops.USHR_INT_LIT8);
352f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        // Note: No dalvik op for shr_const_long.
353f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
354f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        MAP.put(Rops.CMPL_LONG,            Dops.CMP_LONG);
355f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        MAP.put(Rops.CMPL_FLOAT,           Dops.CMPL_FLOAT);
356f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        MAP.put(Rops.CMPL_DOUBLE,          Dops.CMPL_DOUBLE);
357f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        MAP.put(Rops.CMPG_FLOAT,           Dops.CMPG_FLOAT);
358f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        MAP.put(Rops.CMPG_DOUBLE,          Dops.CMPG_DOUBLE);
359f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        MAP.put(Rops.CONV_L2I,             Dops.LONG_TO_INT);
360f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        MAP.put(Rops.CONV_F2I,             Dops.FLOAT_TO_INT);
361f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        MAP.put(Rops.CONV_D2I,             Dops.DOUBLE_TO_INT);
362f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        MAP.put(Rops.CONV_I2L,             Dops.INT_TO_LONG);
363f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        MAP.put(Rops.CONV_F2L,             Dops.FLOAT_TO_LONG);
364f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        MAP.put(Rops.CONV_D2L,             Dops.DOUBLE_TO_LONG);
365f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        MAP.put(Rops.CONV_I2F,             Dops.INT_TO_FLOAT);
366f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        MAP.put(Rops.CONV_L2F,             Dops.LONG_TO_FLOAT);
367f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        MAP.put(Rops.CONV_D2F,             Dops.DOUBLE_TO_FLOAT);
368f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        MAP.put(Rops.CONV_I2D,             Dops.INT_TO_DOUBLE);
369f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        MAP.put(Rops.CONV_L2D,             Dops.LONG_TO_DOUBLE);
370f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        MAP.put(Rops.CONV_F2D,             Dops.FLOAT_TO_DOUBLE);
371f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        MAP.put(Rops.TO_BYTE,              Dops.INT_TO_BYTE);
372f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        MAP.put(Rops.TO_CHAR,              Dops.INT_TO_CHAR);
373f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        MAP.put(Rops.TO_SHORT,             Dops.INT_TO_SHORT);
374f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        MAP.put(Rops.RETURN_VOID,          Dops.RETURN_VOID);
375f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        MAP.put(Rops.RETURN_INT,           Dops.RETURN);
376f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        MAP.put(Rops.RETURN_LONG,          Dops.RETURN_WIDE);
377f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        MAP.put(Rops.RETURN_FLOAT,         Dops.RETURN);
378f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        MAP.put(Rops.RETURN_DOUBLE,        Dops.RETURN_WIDE);
379f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        MAP.put(Rops.RETURN_OBJECT,        Dops.RETURN_OBJECT);
380f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        MAP.put(Rops.ARRAY_LENGTH,         Dops.ARRAY_LENGTH);
381f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        MAP.put(Rops.THROW,                Dops.THROW);
382f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        MAP.put(Rops.MONITOR_ENTER,        Dops.MONITOR_ENTER);
383f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        MAP.put(Rops.MONITOR_EXIT,         Dops.MONITOR_EXIT);
384f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        MAP.put(Rops.AGET_INT,             Dops.AGET);
385f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        MAP.put(Rops.AGET_LONG,            Dops.AGET_WIDE);
386f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        MAP.put(Rops.AGET_FLOAT,           Dops.AGET);
387f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        MAP.put(Rops.AGET_DOUBLE,          Dops.AGET_WIDE);
388f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        MAP.put(Rops.AGET_OBJECT,          Dops.AGET_OBJECT);
389f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        MAP.put(Rops.AGET_BOOLEAN,         Dops.AGET_BOOLEAN);
390f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        MAP.put(Rops.AGET_BYTE,            Dops.AGET_BYTE);
391f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        MAP.put(Rops.AGET_CHAR,            Dops.AGET_CHAR);
392f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        MAP.put(Rops.AGET_SHORT,           Dops.AGET_SHORT);
393f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        MAP.put(Rops.APUT_INT,             Dops.APUT);
394f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        MAP.put(Rops.APUT_LONG,            Dops.APUT_WIDE);
395f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        MAP.put(Rops.APUT_FLOAT,           Dops.APUT);
396f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        MAP.put(Rops.APUT_DOUBLE,          Dops.APUT_WIDE);
397f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        MAP.put(Rops.APUT_OBJECT,          Dops.APUT_OBJECT);
398f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        MAP.put(Rops.APUT_BOOLEAN,         Dops.APUT_BOOLEAN);
399f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        MAP.put(Rops.APUT_BYTE,            Dops.APUT_BYTE);
400f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        MAP.put(Rops.APUT_CHAR,            Dops.APUT_CHAR);
401f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        MAP.put(Rops.APUT_SHORT,           Dops.APUT_SHORT);
402f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        MAP.put(Rops.NEW_INSTANCE,         Dops.NEW_INSTANCE);
403f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        MAP.put(Rops.CHECK_CAST,           Dops.CHECK_CAST);
404f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        MAP.put(Rops.INSTANCE_OF,          Dops.INSTANCE_OF);
405f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
406f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        MAP.put(Rops.GET_FIELD_LONG,       Dops.IGET_WIDE);
407f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        MAP.put(Rops.GET_FIELD_FLOAT,      Dops.IGET);
408f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        MAP.put(Rops.GET_FIELD_DOUBLE,     Dops.IGET_WIDE);
409f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        MAP.put(Rops.GET_FIELD_OBJECT,     Dops.IGET_OBJECT);
410f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        /*
411f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         * Note: No map entries for get_field_* for non-long integral types,
412f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         * since they need to be handled specially (see dopFor() below).
413f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         */
414f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
415f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        MAP.put(Rops.GET_STATIC_LONG,      Dops.SGET_WIDE);
416f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        MAP.put(Rops.GET_STATIC_FLOAT,     Dops.SGET);
417f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        MAP.put(Rops.GET_STATIC_DOUBLE,    Dops.SGET_WIDE);
418f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        MAP.put(Rops.GET_STATIC_OBJECT,    Dops.SGET_OBJECT);
419f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        /*
420f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         * Note: No map entries for get_static* for non-long integral types,
421f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         * since they need to be handled specially (see dopFor() below).
422f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         */
423f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
424f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        MAP.put(Rops.PUT_FIELD_LONG,       Dops.IPUT_WIDE);
425f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        MAP.put(Rops.PUT_FIELD_FLOAT,      Dops.IPUT);
426f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        MAP.put(Rops.PUT_FIELD_DOUBLE,     Dops.IPUT_WIDE);
427f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        MAP.put(Rops.PUT_FIELD_OBJECT,     Dops.IPUT_OBJECT);
428f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        /*
429f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         * Note: No map entries for put_field_* for non-long integral types,
430f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         * since they need to be handled specially (see dopFor() below).
431f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         */
432f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
433f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        MAP.put(Rops.PUT_STATIC_LONG,      Dops.SPUT_WIDE);
434f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        MAP.put(Rops.PUT_STATIC_FLOAT,     Dops.SPUT);
435f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        MAP.put(Rops.PUT_STATIC_DOUBLE,    Dops.SPUT_WIDE);
436f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        MAP.put(Rops.PUT_STATIC_OBJECT,    Dops.SPUT_OBJECT);
437f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        /*
438f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         * Note: No map entries for put_static* for non-long integral types,
439f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         * since they need to be handled specially (see dopFor() below).
440f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         */
441f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
442f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        /*
443f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         * Note: No map entries for invoke*, new_array, and
444f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         * filled_new_array, since they need to be handled specially
445f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         * (see dopFor() below).
446f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         */
447f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
448f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
449f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
450f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Returns the dalvik opcode appropriate for the given register-based
451f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * instruction.
452de75089fb7216d19e9c22cce4dc62a49513477d3Carl Shapiro     *
45399409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project     * @param insn {@code non-null;} the original instruction
454f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @return the corresponding dalvik opcode; one of the constants in
455f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * {@link Dops}
456f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
457f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public static Dop dopFor(Insn insn) {
458f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        Rop rop = insn.getOpcode();
459f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
460f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        /*
461f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         * First, just try looking up the rop in the MAP of easy
462f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         * cases.
463f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         */
464f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        Dop result = MAP.get(rop);
465f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (result != null) {
466f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return result;
467f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
468f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
469f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        /*
470f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         * There was no easy case for the rop, so look up the opcode, and
471f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         * do something special for each:
472de75089fb7216d19e9c22cce4dc62a49513477d3Carl Shapiro         *
473f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         * The move_exception, new_array, filled_new_array, and
474f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         * invoke* opcodes won't be found in MAP, since they'll each
475f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         * have different source and/or result register types / lists.
476de75089fb7216d19e9c22cce4dc62a49513477d3Carl Shapiro         *
477f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         * The get* and put* opcodes for (non-long) integral types
478f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         * aren't in the map, since the type signatures aren't
479f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         * sufficient to distinguish between the types (the salient
480f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         * source or result will always be just "int").
481de75089fb7216d19e9c22cce4dc62a49513477d3Carl Shapiro         *
482f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         * And const instruction need to distinguish between strings and
483f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         * classes.
484f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         */
485f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
486f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        switch (rop.getOpcode()) {
487f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            case RegOps.MOVE_EXCEPTION:   return Dops.MOVE_EXCEPTION;
488f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            case RegOps.INVOKE_STATIC:    return Dops.INVOKE_STATIC;
489f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            case RegOps.INVOKE_VIRTUAL:   return Dops.INVOKE_VIRTUAL;
490f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            case RegOps.INVOKE_SUPER:     return Dops.INVOKE_SUPER;
491f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            case RegOps.INVOKE_DIRECT:    return Dops.INVOKE_DIRECT;
492f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            case RegOps.INVOKE_INTERFACE: return Dops.INVOKE_INTERFACE;
493f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            case RegOps.NEW_ARRAY:        return Dops.NEW_ARRAY;
494f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            case RegOps.FILLED_NEW_ARRAY: return Dops.FILLED_NEW_ARRAY;
495de75089fb7216d19e9c22cce4dc62a49513477d3Carl Shapiro            case RegOps.FILL_ARRAY_DATA:  return Dops.FILL_ARRAY_DATA;
496f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            case RegOps.MOVE_RESULT: {
497f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                RegisterSpec resultReg = insn.getResult();
498f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
499f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                if (resultReg == null) {
500f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    return Dops.NOP;
501f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                } else {
502f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    switch (resultReg.getBasicType()) {
503f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                        case Type.BT_INT:
504f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                        case Type.BT_FLOAT:
505f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                        case Type.BT_BOOLEAN:
506f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                        case Type.BT_BYTE:
507f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                        case Type.BT_CHAR:
508f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                        case Type.BT_SHORT:
509f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                            return Dops.MOVE_RESULT;
510f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                        case Type.BT_LONG:
511f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                        case Type.BT_DOUBLE:
512f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                            return Dops.MOVE_RESULT_WIDE;
513f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                        case Type.BT_OBJECT:
514f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                            return Dops.MOVE_RESULT_OBJECT;
515f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                        default: {
516f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                            throw new RuntimeException("Unexpected basic type");
517f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                        }
518f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    }
519f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                }
520f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
521f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
522f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            case RegOps.GET_FIELD: {
523f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                CstFieldRef ref =
524f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    (CstFieldRef) ((ThrowingCstInsn) insn).getConstant();
525f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                int basicType = ref.getBasicType();
526f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                switch (basicType) {
527f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    case Type.BT_BOOLEAN: return Dops.IGET_BOOLEAN;
528f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    case Type.BT_BYTE:    return Dops.IGET_BYTE;
529f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    case Type.BT_CHAR:    return Dops.IGET_CHAR;
530f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    case Type.BT_SHORT:   return Dops.IGET_SHORT;
531f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    case Type.BT_INT:     return Dops.IGET;
532f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                }
533f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                break;
534f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
535f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            case RegOps.PUT_FIELD: {
536f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                CstFieldRef ref =
537f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    (CstFieldRef) ((ThrowingCstInsn) insn).getConstant();
538f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                int basicType = ref.getBasicType();
539f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                switch (basicType) {
540f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    case Type.BT_BOOLEAN: return Dops.IPUT_BOOLEAN;
541f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    case Type.BT_BYTE:    return Dops.IPUT_BYTE;
542f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    case Type.BT_CHAR:    return Dops.IPUT_CHAR;
543f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    case Type.BT_SHORT:   return Dops.IPUT_SHORT;
544f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    case Type.BT_INT:     return Dops.IPUT;
545f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                }
546f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                break;
547f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
548f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            case RegOps.GET_STATIC: {
549f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                CstFieldRef ref =
550f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    (CstFieldRef) ((ThrowingCstInsn) insn).getConstant();
551f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                int basicType = ref.getBasicType();
552f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                switch (basicType) {
553f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    case Type.BT_BOOLEAN: return Dops.SGET_BOOLEAN;
554f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    case Type.BT_BYTE:    return Dops.SGET_BYTE;
555f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    case Type.BT_CHAR:    return Dops.SGET_CHAR;
556f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    case Type.BT_SHORT:   return Dops.SGET_SHORT;
557f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    case Type.BT_INT:     return Dops.SGET;
558f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                }
559f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                break;
560f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
561f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            case RegOps.PUT_STATIC: {
562f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                CstFieldRef ref =
563f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    (CstFieldRef) ((ThrowingCstInsn) insn).getConstant();
564f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                int basicType = ref.getBasicType();
565f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                switch (basicType) {
566f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    case Type.BT_BOOLEAN: return Dops.SPUT_BOOLEAN;
567f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    case Type.BT_BYTE:    return Dops.SPUT_BYTE;
568f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    case Type.BT_CHAR:    return Dops.SPUT_CHAR;
569f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    case Type.BT_SHORT:   return Dops.SPUT_SHORT;
570f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    case Type.BT_INT:     return Dops.SPUT;
571f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                }
572f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                break;
573f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
574f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            case RegOps.CONST: {
575f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                Constant cst = ((ThrowingCstInsn) insn).getConstant();
576f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                if (cst instanceof CstType) {
577f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    return Dops.CONST_CLASS;
578f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                } else if (cst instanceof CstString) {
579f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    return Dops.CONST_STRING;
580f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                }
581f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                break;
582f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
583f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
584f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
585f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        throw new RuntimeException("unknown rop: " + rop);
586f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
587f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project}
588