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