1959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle/* 2959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle * Copyright (C) 2014 The Android Open Source Project 3959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle * 4959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle * Licensed under the Apache License, Version 2.0 (the "License"); 5959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle * you may not use this file except in compliance with the License. 6959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle * You may obtain a copy of the License at 7959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle * 8959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle * http://www.apache.org/licenses/LICENSE-2.0 9959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle * 10959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle * Unless required by applicable law or agreed to in writing, software 11959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle * distributed under the License is distributed on an "AS IS" BASIS, 12959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle * See the License for the specific language governing permissions and 14959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle * limitations under the License. 15959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle */ 16959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle 17959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kylepackage dexfuzz.rawdex; 18959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle 19959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyleimport dexfuzz.Log; 20959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyleimport dexfuzz.rawdex.formats.AbstractFormat; 21959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyleimport dexfuzz.rawdex.formats.ContainsConst; 22959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyleimport dexfuzz.rawdex.formats.ContainsPoolIndex; 23959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyleimport dexfuzz.rawdex.formats.ContainsTarget; 24959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyleimport dexfuzz.rawdex.formats.ContainsVRegs; 25959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyleimport dexfuzz.rawdex.formats.Format10t; 26959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyleimport dexfuzz.rawdex.formats.Format10x; 27959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyleimport dexfuzz.rawdex.formats.Format11n; 28959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyleimport dexfuzz.rawdex.formats.Format11x; 29959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyleimport dexfuzz.rawdex.formats.Format12x; 30959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyleimport dexfuzz.rawdex.formats.Format20t; 31959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyleimport dexfuzz.rawdex.formats.Format21c; 32959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyleimport dexfuzz.rawdex.formats.Format21h; 33959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyleimport dexfuzz.rawdex.formats.Format21s; 34959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyleimport dexfuzz.rawdex.formats.Format21t; 35959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyleimport dexfuzz.rawdex.formats.Format22b; 36959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyleimport dexfuzz.rawdex.formats.Format22c; 37959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyleimport dexfuzz.rawdex.formats.Format22s; 38959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyleimport dexfuzz.rawdex.formats.Format22t; 39959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyleimport dexfuzz.rawdex.formats.Format22x; 40959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyleimport dexfuzz.rawdex.formats.Format23x; 41959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyleimport dexfuzz.rawdex.formats.Format30t; 42959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyleimport dexfuzz.rawdex.formats.Format31c; 43959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyleimport dexfuzz.rawdex.formats.Format31i; 44959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyleimport dexfuzz.rawdex.formats.Format31t; 45959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyleimport dexfuzz.rawdex.formats.Format32x; 46959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyleimport dexfuzz.rawdex.formats.Format35c; 47959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyleimport dexfuzz.rawdex.formats.Format3rc; 48959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyleimport dexfuzz.rawdex.formats.Format51l; 49959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle 50959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyleimport java.io.IOException; 51959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyleimport java.util.HashMap; 52959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyleimport java.util.Map; 53959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle 54959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kylepublic class Instruction implements RawDexObject { 55959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle // Only used by Format35* instructions 56959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle public static class InvokeFormatInfo { 57959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle public byte vregD; 58959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle public byte vregE; 59959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle public byte vregF; 60959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle public byte vregG; 61959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle } 62959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle 63959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle // Immutable information about this class of instruction. 64959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle public OpcodeInfo info; 65959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle 66959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle // The raw bytes of the instruction. 67959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle // Only used during reading, and writing out is done from the decoded instruction data. 68959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle // Except in the case of the 3 "data" instructions. 69959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle public byte[] rawBytes; 70959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle 71959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle public static final int RAW_TYPE_PACKED_SWITCH_DATA = 1; 72959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle public static final int RAW_TYPE_SPARSE_SWITCH_DATA = 2; 73959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle public static final int RAW_TYPE_FILL_ARRAY_DATA_DATA = 3; 74959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle 75959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle public int rawType; 76959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle public boolean justRaw; 77959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle public int rawSize; 78959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle 79959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle public long vregA = 0; 80959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle public long vregB = 0; 81959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle public long vregC = 0; 82959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle 83959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle public InvokeFormatInfo invokeFormatInfo; 84959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle 85959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle /** 86959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle * Clone an instruction. 87959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle */ 88959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle public Instruction clone() { 89959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle Instruction newInsn = new Instruction(); 90959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle // If we've generated a new instruction, we won't have calculated its raw array. 91959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle if (newInsn.rawBytes != null) { 92959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle newInsn.rawBytes = new byte[rawBytes.length]; 93959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle for (int i = 0; i < rawBytes.length; i++) { 94959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle newInsn.rawBytes[i] = rawBytes[i]; 95959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle } 96959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle } 97959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle newInsn.justRaw = justRaw; 98959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle newInsn.rawType = rawType; 99959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle newInsn.rawSize = rawSize; 100959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle 101959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle newInsn.vregA = vregA; 102959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle newInsn.vregB = vregB; 103959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle newInsn.vregC = vregC; 104959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle newInsn.info = info; 105959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle if (invokeFormatInfo != null) { 106959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle newInsn.invokeFormatInfo = new InvokeFormatInfo(); 107959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle newInsn.invokeFormatInfo.vregD = invokeFormatInfo.vregD; 108959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle newInsn.invokeFormatInfo.vregE = invokeFormatInfo.vregE; 109959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle newInsn.invokeFormatInfo.vregF = invokeFormatInfo.vregF; 110959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle newInsn.invokeFormatInfo.vregG = invokeFormatInfo.vregG; 111959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle } 112959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle return newInsn; 113959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle } 114959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle 115959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle @Override 116959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle public void read(DexRandomAccessFile file) throws IOException { 117959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle // Remember the offset, so after reading the opcode, we can read the whole 118959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle // insn into raw_bytes. 119959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle long offset = file.getFilePointer(); 120959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle int opcodeValue = readOpcode(file); 121959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle info = getOpcodeInfo(opcodeValue); 122959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle if (info == null) { 123959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle Log.errorAndQuit("Couldn't find OpcodeInfo for opcode with value: " 124959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle + opcodeValue); 125959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle } 126959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle 127959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle rawBytes = new byte[2 * getSize()]; 128959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle file.seek(offset); 129959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle file.read(rawBytes); 130959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle 131959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle vregA = info.format.getA(rawBytes); 132959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle vregB = info.format.getB(rawBytes); 133959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle vregC = info.format.getC(rawBytes); 134959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle 135959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle // Special case for 35* formats. 136959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle if (info.format.needsInvokeFormatInfo()) { 137959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle invokeFormatInfo = new InvokeFormatInfo(); 138959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle invokeFormatInfo.vregD = (byte) (rawBytes[4] >> 4); 139959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle invokeFormatInfo.vregE = (byte) (rawBytes[5] & 0xf); 140959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle invokeFormatInfo.vregF = (byte) (rawBytes[5] >> 4); 141959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle invokeFormatInfo.vregG = (byte) (rawBytes[1] & 0xf); 142959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle } 143959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle } 144959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle 145959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle @Override 146959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle public void write(DexRandomAccessFile file) throws IOException { 147959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle if (justRaw) { 148959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle // It is the responsibility of the CodeTranslator to make 149959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle // sure the raw bytes have been updated. 150959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle file.write(rawBytes); 151959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle } else { 152959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle info.format.writeToFile(file, this); 153959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle } 154959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle } 155959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle 156959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle /** 157959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle * Get the size of an instruction, in code-words. (Code-words are 16-bits.) 158959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle */ 159959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle public int getSize() { 160959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle if (justRaw) { 161959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle // It is the responsibility of the CodeTranslator to make sure 162959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle // the raw size has been updated. 163959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle return rawSize; 164959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle } 165959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle return info.format.getSize(); 166959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle } 167959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle 168959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle private int readOpcode(DexRandomAccessFile file) throws IOException { 169959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle short firstCodeWord = file.readUShort(); 170959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle int opcode = (firstCodeWord & 0xff); 171959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle int upperBits = (firstCodeWord & 0xff00) >> 8; 172959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle if (opcode == 0x0 && upperBits != 0x0) { 173959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle justRaw = true; 174959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle rawType = upperBits; 175959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle // Need to calculate special sizes. 176959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle switch (rawType) { 177959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle case RAW_TYPE_PACKED_SWITCH_DATA: 178959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle rawSize = (file.readUShort() * 2) + 4; 179959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle break; 180959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle case RAW_TYPE_SPARSE_SWITCH_DATA: 181959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle rawSize = (file.readUShort() * 4) + 2; 182959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle break; 183959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle case RAW_TYPE_FILL_ARRAY_DATA_DATA: 184959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle { 185959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle int elementWidth = file.readUShort(); 186959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle rawSize = ((file.readUInt() * elementWidth + 1) / 2) + 4; 187959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle break; 188959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle } 189959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle default: 190959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle Log.errorAndQuit("Unrecognised ident in data-payload instruction: " + rawType); 191959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle } 192959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle } 193959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle return opcode; 194959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle } 195959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle 196959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle @Override 197959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle public String toString() { 198959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle if (justRaw) { 199959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle switch (rawType) { 200959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle case RAW_TYPE_PACKED_SWITCH_DATA: 201959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle return "PACKED SWITCH DATA"; 202959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle case RAW_TYPE_SPARSE_SWITCH_DATA: 203959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle return "SPARSE SWITCH DATA"; 204959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle case RAW_TYPE_FILL_ARRAY_DATA_DATA: 205959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle return "FILL ARRAY DATA DATA"; 206959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle default: 207959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle } 208959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle 209959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle } 210959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle 211959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle String repr = info.name; 212959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle 213959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle AbstractFormat format = info.format; 214959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle 215959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle if (invokeFormatInfo != null) { 216959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle String vregs = ""; 217959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle 218959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle int numVregs = (int) vregA; 219959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle 220959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle if (numVregs > 5) { 221959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle Log.debug("vA in an 35c invoke was greater than 5? Assuming 5."); 222959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle numVregs = 5; 223959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle } else if (numVregs < 0) { 224959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle Log.debug("vA in an 35c invoke was less than 0? Assuming 0."); 225959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle numVregs = 0; 226959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle } 227959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle 228959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle switch (numVregs) { 229959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle case 5: 230959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle vregs = ", v" + invokeFormatInfo.vregG; 231959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle // fallthrough 232959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle case 4: 233959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle vregs = ", v" + invokeFormatInfo.vregF + vregs; 234959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle // fallthrough 235959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle case 3: 236959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle vregs = ", v" + invokeFormatInfo.vregE + vregs; 237959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle // fallthrough 238959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle case 2: 239959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle vregs = ", v" + invokeFormatInfo.vregD + vregs; 240959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle // fallthrough 241959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle case 1: 242959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle vregs = "v" + vregC + vregs; 243959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle break; 244959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle default: 245959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle } 246959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle 247959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle repr += "(" + vregs + ")"; 248959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle 249959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle long poolIndex = ((ContainsPoolIndex)format).getPoolIndex(this); 250959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle repr += " meth@" + poolIndex; 251959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle 252959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle return repr; 253959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle } 254959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle 255959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle 256959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle 257959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle if (format instanceof ContainsVRegs) { 258959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle String vregs = ""; 259959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle switch (((ContainsVRegs)format).getVRegCount()) { 260959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle case 3: 261959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle vregs = ", v" + vregC; 262959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle // fallthrough 263959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle case 2: 264959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle vregs = ", v" + vregB + vregs; 265959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle // fallthrough 266959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle case 1: 267959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle vregs = "v" + vregA + vregs; 268959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle break; 269959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle default: 270959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle Log.errorAndQuit("Invalid number of vregs reported by a Format."); 271959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle } 272959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle 273959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle repr += " " + vregs; 274959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle } 275959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle if (format instanceof ContainsConst) { 276959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle long constant = ((ContainsConst)format).getConst(this); 277959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle repr += " #" + constant; 278959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle } 279959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle if (format instanceof ContainsPoolIndex) { 280959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle long poolIndex = ((ContainsPoolIndex)format).getPoolIndex(this); 281959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle repr += " pool@" + poolIndex; 282959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle } 283959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle if (format instanceof ContainsTarget) { 284959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle long target = ((ContainsTarget)format).getTarget(this); 285959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle repr += " +" + target; 286959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle } 287959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle 288959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle return repr; 289959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle } 290959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle 291959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle @Override 292959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle public void incrementIndex(IndexUpdateKind kind, int insertedIdx) { 293959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle // Do nothing. 294959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle } 295959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle 296959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle // STATIC INSTRUCTION CODE 297959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle private static Map<Integer,OpcodeInfo> opcode_map_by_int = new HashMap<Integer,OpcodeInfo>(); 298959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle private static Map<Opcode,OpcodeInfo> opcode_map_by_enum = new HashMap<Opcode,OpcodeInfo>(); 299959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle 300959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle public static OpcodeInfo getOpcodeInfo(Opcode opcode) { 301959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle return opcode_map_by_enum.get(opcode); 302959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle } 303959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle 304959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle public static OpcodeInfo getOpcodeInfo(int opcodeValue) { 305959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle return opcode_map_by_int.get(opcodeValue); 306959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle } 307959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle 308959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle private static void addOpcodeInfo(Opcode opcode, String name, 309959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle int opcodeValue, AbstractFormat fmt) { 310959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle OpcodeInfo info = new OpcodeInfo(opcode, name, opcodeValue, fmt); 311959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle if (opcode.ordinal() != opcodeValue) { 312959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle Log.errorAndQuit(String.format("Opcode: %s (enum ordinal 0x%x) != (value 0x%x)", 313959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle opcode.toString(), opcode.ordinal(), opcodeValue)); 314959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle } 315959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle opcode_map_by_int.put(opcodeValue, info); 316959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle opcode_map_by_enum.put(opcode, info); 317959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle } 318959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle 319959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle static { 320959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle addOpcodeInfo(Opcode.NOP, "nop", 0x00, new Format10x()); 321959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle addOpcodeInfo(Opcode.MOVE, "move", 0x01, new Format12x()); 322959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle addOpcodeInfo(Opcode.MOVE_FROM16, "move/from16", 0x02, new Format22x()); 323959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle addOpcodeInfo(Opcode.MOVE_16, "move/16", 0x03, new Format32x()); 324959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle addOpcodeInfo(Opcode.MOVE_WIDE, "move-wide", 0x04, new Format12x()); 325959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle addOpcodeInfo(Opcode.MOVE_WIDE_FROM16, "move-wide/from16", 0x05, new Format22x()); 326959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle addOpcodeInfo(Opcode.MOVE_WIDE_16, "move-wide/16", 0x06, new Format32x()); 327959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle addOpcodeInfo(Opcode.MOVE_OBJECT, "move-object", 0x07, new Format12x()); 328959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle addOpcodeInfo(Opcode.MOVE_OBJECT_FROM16, "move-object/from16", 0x08, new Format22x()); 329959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle addOpcodeInfo(Opcode.MOVE_OBJECT_16, "move-object/16", 0x09, new Format32x()); 330959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle addOpcodeInfo(Opcode.MOVE_RESULT, "move-result", 0x0a, new Format11x()); 331959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle addOpcodeInfo(Opcode.MOVE_RESULT_WIDE, "move-result-wide", 0x0b, new Format11x()); 332959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle addOpcodeInfo(Opcode.MOVE_RESULT_OBJECT, "move-result-object", 0x0c, new Format11x()); 333959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle addOpcodeInfo(Opcode.MOVE_EXCEPTION, "move-exception", 0x0d, new Format11x()); 334959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle addOpcodeInfo(Opcode.RETURN_VOID, "return-void", 0x0e, new Format10x()); 335959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle addOpcodeInfo(Opcode.RETURN, "return", 0x0f, new Format11x()); 336959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle addOpcodeInfo(Opcode.RETURN_WIDE, "return-wide", 0x10, new Format11x()); 337959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle addOpcodeInfo(Opcode.RETURN_OBJECT, "return-object", 0x11, new Format11x()); 338959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle addOpcodeInfo(Opcode.CONST_4, "const/4", 0x12, new Format11n()); 339959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle addOpcodeInfo(Opcode.CONST_16, "const/16", 0x13, new Format21s()); 340959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle addOpcodeInfo(Opcode.CONST, "const", 0x14, new Format31i()); 341959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle addOpcodeInfo(Opcode.CONST_HIGH16, "const/high16", 0x15, new Format21h()); 342959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle addOpcodeInfo(Opcode.CONST_WIDE_16, "const-wide/16", 0x16, new Format21s()); 343959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle addOpcodeInfo(Opcode.CONST_WIDE_32, "const-wide/32", 0x17, new Format31i()); 344959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle addOpcodeInfo(Opcode.CONST_WIDE, "const-wide", 0x18, new Format51l()); 345959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle addOpcodeInfo(Opcode.CONST_WIDE_HIGH16, "const-wide/high16", 0x19, new Format21h()); 346959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle addOpcodeInfo(Opcode.CONST_STRING, "const-string", 0x1a, new Format21c()); 347959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle addOpcodeInfo(Opcode.CONST_STRING_JUMBO, "const-string/jumbo", 0x1b, new Format31c()); 348959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle addOpcodeInfo(Opcode.CONST_CLASS, "const-class", 0x1c, new Format21c()); 349959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle addOpcodeInfo(Opcode.MONITOR_ENTER, "monitor-enter", 0x1d, new Format11x()); 350959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle addOpcodeInfo(Opcode.MONITOR_EXIT, "monitor-exit", 0x1e, new Format11x()); 351959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle addOpcodeInfo(Opcode.CHECK_CAST, "check-cast", 0x1f, new Format21c()); 352959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle addOpcodeInfo(Opcode.INSTANCE_OF, "instance-of", 0x20, new Format22c()); 353959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle addOpcodeInfo(Opcode.ARRAY_LENGTH, "array-length", 0x21, new Format12x()); 354959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle addOpcodeInfo(Opcode.NEW_INSTANCE, "new-instance", 0x22, new Format21c()); 355959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle addOpcodeInfo(Opcode.NEW_ARRAY, "new-array", 0x23, new Format22c()); 356959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle addOpcodeInfo(Opcode.FILLED_NEW_ARRAY, "filled-new-array", 0x24, new Format35c()); 357959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle addOpcodeInfo(Opcode.FILLED_NEW_ARRAY_RANGE, "filled-new-array/range", 358959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle 0x25, new Format3rc()); 359959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle addOpcodeInfo(Opcode.FILL_ARRAY_DATA, "fill-array-data", 0x26, new Format31t()); 360959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle addOpcodeInfo(Opcode.THROW, "throw", 0x27, new Format11x()); 361959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle addOpcodeInfo(Opcode.GOTO, "goto", 0x28, new Format10t()); 362959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle addOpcodeInfo(Opcode.GOTO_16, "goto/16", 0x29, new Format20t()); 363959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle addOpcodeInfo(Opcode.GOTO_32, "goto/32", 0x2a, new Format30t()); 364959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle addOpcodeInfo(Opcode.PACKED_SWITCH, "packed-switch", 0x2b, new Format31t()); 365959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle addOpcodeInfo(Opcode.SPARSE_SWITCH, "sparse-switch", 0x2c, new Format31t()); 366959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle addOpcodeInfo(Opcode.CMPL_FLOAT, "cmpl-float", 0x2d, new Format23x()); 367959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle addOpcodeInfo(Opcode.CMPG_FLOAT, "cmpg-float", 0x2e, new Format23x()); 368959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle addOpcodeInfo(Opcode.CMPL_DOUBLE, "cmpl-double", 0x2f, new Format23x()); 369959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle addOpcodeInfo(Opcode.CMPG_DOUBLE, "cmpg-double", 0x30, new Format23x()); 370959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle addOpcodeInfo(Opcode.CMP_LONG, "cmp-long", 0x31, new Format23x()); 371959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle addOpcodeInfo(Opcode.IF_EQ, "if-eq", 0x32, new Format22t()); 372959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle addOpcodeInfo(Opcode.IF_NE, "if-ne", 0x33, new Format22t()); 373959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle addOpcodeInfo(Opcode.IF_LT, "if-lt", 0x34, new Format22t()); 374959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle addOpcodeInfo(Opcode.IF_GE, "if-ge", 0x35, new Format22t()); 375959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle addOpcodeInfo(Opcode.IF_GT, "if-gt", 0x36, new Format22t()); 376959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle addOpcodeInfo(Opcode.IF_LE, "if-le", 0x37, new Format22t()); 377959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle addOpcodeInfo(Opcode.IF_EQZ, "if-eqz", 0x38, new Format21t()); 378959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle addOpcodeInfo(Opcode.IF_NEZ, "if-nez", 0x39, new Format21t()); 379959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle addOpcodeInfo(Opcode.IF_LTZ, "if-ltz", 0x3a, new Format21t()); 380959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle addOpcodeInfo(Opcode.IF_GEZ, "if-gez", 0x3b, new Format21t()); 381959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle addOpcodeInfo(Opcode.IF_GTZ, "if-gtz", 0x3c, new Format21t()); 382959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle addOpcodeInfo(Opcode.IF_LEZ, "if-lez", 0x3d, new Format21t()); 383959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle addOpcodeInfo(Opcode.UNUSED_3E, "unused-3e", 0x3e, new Format10x()); 384959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle addOpcodeInfo(Opcode.UNUSED_3F, "unused-3f", 0x3f, new Format10x()); 385959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle addOpcodeInfo(Opcode.UNUSED_40, "unused-40", 0x40, new Format10x()); 386959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle addOpcodeInfo(Opcode.UNUSED_41, "unused-41", 0x41, new Format10x()); 387959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle addOpcodeInfo(Opcode.UNUSED_42, "unused-42", 0x42, new Format10x()); 388959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle addOpcodeInfo(Opcode.UNUSED_43, "unused-43", 0x43, new Format10x()); 389959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle addOpcodeInfo(Opcode.AGET, "aget", 0x44, new Format23x()); 390959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle addOpcodeInfo(Opcode.AGET_WIDE, "aget-wide", 0x45, new Format23x()); 391959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle addOpcodeInfo(Opcode.AGET_WIDE, "aget-wide", 0x45, new Format23x()); 392959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle addOpcodeInfo(Opcode.AGET_OBJECT, "aget-object", 0x46, new Format23x()); 393959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle addOpcodeInfo(Opcode.AGET_BOOLEAN, "aget-boolean", 0x47, new Format23x()); 394959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle addOpcodeInfo(Opcode.AGET_BYTE, "aget-byte", 0x48, new Format23x()); 395959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle addOpcodeInfo(Opcode.AGET_CHAR, "aget-char", 0x49, new Format23x()); 396959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle addOpcodeInfo(Opcode.AGET_SHORT, "aget-short", 0x4a, new Format23x()); 397959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle addOpcodeInfo(Opcode.APUT, "aput", 0x4b, new Format23x()); 398959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle addOpcodeInfo(Opcode.APUT_WIDE, "aput-wide", 0x4c, new Format23x()); 399959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle addOpcodeInfo(Opcode.APUT_OBJECT, "aput-object", 0x4d, new Format23x()); 400959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle addOpcodeInfo(Opcode.APUT_BOOLEAN, "aput-boolean", 0x4e, new Format23x()); 401959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle addOpcodeInfo(Opcode.APUT_BYTE, "aput-byte", 0x4f, new Format23x()); 402959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle addOpcodeInfo(Opcode.APUT_CHAR, "aput-char", 0x50, new Format23x()); 403959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle addOpcodeInfo(Opcode.APUT_SHORT, "aput-short", 0x51, new Format23x()); 404959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle addOpcodeInfo(Opcode.IGET, "iget", 0x52, new Format22c()); 405959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle addOpcodeInfo(Opcode.IGET_WIDE, "iget-wide", 0x53, new Format22c()); 406959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle addOpcodeInfo(Opcode.IGET_OBJECT, "iget-object", 0x54, new Format22c()); 407959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle addOpcodeInfo(Opcode.IGET_BOOLEAN, "iget-boolean", 0x55, new Format22c()); 408959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle addOpcodeInfo(Opcode.IGET_BYTE, "iget-byte", 0x56, new Format22c()); 409959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle addOpcodeInfo(Opcode.IGET_CHAR, "iget-char", 0x57, new Format22c()); 410959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle addOpcodeInfo(Opcode.IGET_SHORT, "iget-short", 0x58, new Format22c()); 411959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle addOpcodeInfo(Opcode.IPUT, "iput", 0x59, new Format22c()); 412959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle addOpcodeInfo(Opcode.IPUT_WIDE, "iput-wide", 0x5a, new Format22c()); 413959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle addOpcodeInfo(Opcode.IPUT_OBJECT, "iput-object", 0x5b, new Format22c()); 414959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle addOpcodeInfo(Opcode.IPUT_BOOLEAN, "iput-boolean", 0x5c, new Format22c()); 415959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle addOpcodeInfo(Opcode.IPUT_BYTE, "iput-byte", 0x5d, new Format22c()); 416959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle addOpcodeInfo(Opcode.IPUT_CHAR, "iput-char", 0x5e, new Format22c()); 417959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle addOpcodeInfo(Opcode.IPUT_SHORT, "iput-short", 0x5f, new Format22c()); 418959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle addOpcodeInfo(Opcode.SGET, "sget", 0x60, new Format21c()); 419959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle addOpcodeInfo(Opcode.SGET_WIDE, "sget-wide", 0x61, new Format21c()); 420959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle addOpcodeInfo(Opcode.SGET_OBJECT, "sget-object", 0x62, new Format21c()); 421959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle addOpcodeInfo(Opcode.SGET_BOOLEAN, "sget-boolean", 0x63, new Format21c()); 422959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle addOpcodeInfo(Opcode.SGET_BYTE, "sget-byte", 0x64, new Format21c()); 423959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle addOpcodeInfo(Opcode.SGET_CHAR, "sget-char", 0x65, new Format21c()); 424959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle addOpcodeInfo(Opcode.SGET_SHORT, "sget-short", 0x66, new Format21c()); 425959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle addOpcodeInfo(Opcode.SPUT, "sput", 0x67, new Format21c()); 426959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle addOpcodeInfo(Opcode.SPUT_WIDE, "sput-wide", 0x68, new Format21c()); 427959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle addOpcodeInfo(Opcode.SPUT_OBJECT, "sput-object", 0x69, new Format21c()); 428959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle addOpcodeInfo(Opcode.SPUT_BOOLEAN, "sput-boolean", 0x6a, new Format21c()); 429959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle addOpcodeInfo(Opcode.SPUT_BYTE, "sput-byte", 0x6b, new Format21c()); 430959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle addOpcodeInfo(Opcode.SPUT_CHAR, "sput-char", 0x6c, new Format21c()); 431959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle addOpcodeInfo(Opcode.SPUT_SHORT, "sput-short", 0x6d, new Format21c()); 432959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle addOpcodeInfo(Opcode.INVOKE_VIRTUAL, "invoke-virtual", 0x6e, new Format35c()); 433959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle addOpcodeInfo(Opcode.INVOKE_SUPER, "invoke-super", 0x6f, new Format35c()); 434959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle addOpcodeInfo(Opcode.INVOKE_DIRECT, "invoke-direct", 0x70, new Format35c()); 435959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle addOpcodeInfo(Opcode.INVOKE_STATIC, "invoke-static", 0x71, new Format35c()); 436959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle addOpcodeInfo(Opcode.INVOKE_INTERFACE, "invoke-interface", 0x72, new Format35c()); 437d7cbf8a6629942e7bd315ffae7e1c77b082f3e11Mathieu Chartier addOpcodeInfo(Opcode.RETURN_VOID_NO_BARRIER, "return-void-no-barrier", 0x73, new Format10x()); 438959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle addOpcodeInfo(Opcode.INVOKE_VIRTUAL_RANGE, "invoke-virtual/range", 0x74, new Format3rc()); 439959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle addOpcodeInfo(Opcode.INVOKE_SUPER_RANGE, "invoke-super/range", 0x75, new Format3rc()); 440959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle addOpcodeInfo(Opcode.INVOKE_DIRECT_RANGE, "invoke-direct/range", 0x76, new Format3rc()); 441959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle addOpcodeInfo(Opcode.INVOKE_STATIC_RANGE, "invoke-static/range", 0x77, new Format3rc()); 442959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle addOpcodeInfo(Opcode.INVOKE_INTERFACE_RANGE, "invoke-interface/range", 443959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle 0x78, new Format3rc()); 444959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle addOpcodeInfo(Opcode.UNUSED_79, "unused-79", 0x79, new Format10x()); 445959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle addOpcodeInfo(Opcode.UNUSED_7A, "unused-7a", 0x7a, new Format10x()); 446959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle addOpcodeInfo(Opcode.NEG_INT, "neg-int", 0x7b, new Format12x()); 447959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle addOpcodeInfo(Opcode.NOT_INT, "not-int", 0x7c, new Format12x()); 448959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle addOpcodeInfo(Opcode.NEG_LONG, "neg-long", 0x7d, new Format12x()); 449959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle addOpcodeInfo(Opcode.NOT_LONG, "not-long", 0x7e, new Format12x()); 450959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle addOpcodeInfo(Opcode.NEG_FLOAT, "neg-float", 0x7f, new Format12x()); 451959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle addOpcodeInfo(Opcode.NEG_DOUBLE, "neg-double", 0x80, new Format12x()); 452959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle addOpcodeInfo(Opcode.INT_TO_LONG, "int-to-long", 0x81, new Format12x()); 453959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle addOpcodeInfo(Opcode.INT_TO_FLOAT, "int-to-float", 0x82, new Format12x()); 454959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle addOpcodeInfo(Opcode.INT_TO_DOUBLE, "int-to-double", 0x83, new Format12x()); 455959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle addOpcodeInfo(Opcode.LONG_TO_INT, "long-to-int", 0x84, new Format12x()); 456959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle addOpcodeInfo(Opcode.LONG_TO_FLOAT, "long-to-float", 0x85, new Format12x()); 457959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle addOpcodeInfo(Opcode.LONG_TO_DOUBLE, "long-to-double", 0x86, new Format12x()); 458959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle addOpcodeInfo(Opcode.FLOAT_TO_INT, "float-to-int", 0x87, new Format12x()); 459959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle addOpcodeInfo(Opcode.FLOAT_TO_LONG, "float-to-long", 0x88, new Format12x()); 460959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle addOpcodeInfo(Opcode.FLOAT_TO_DOUBLE, "float-to-double", 0x89, new Format12x()); 461959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle addOpcodeInfo(Opcode.DOUBLE_TO_INT, "double-to-int", 0x8a, new Format12x()); 462959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle addOpcodeInfo(Opcode.DOUBLE_TO_LONG, "double-to-long", 0x8b, new Format12x()); 463959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle addOpcodeInfo(Opcode.DOUBLE_TO_FLOAT, "double-to-float", 0x8c, new Format12x()); 464959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle addOpcodeInfo(Opcode.INT_TO_BYTE, "int-to-byte", 0x8d, new Format12x()); 465959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle addOpcodeInfo(Opcode.INT_TO_CHAR, "int-to-char", 0x8e, new Format12x()); 466959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle addOpcodeInfo(Opcode.INT_TO_SHORT, "int-to-short", 0x8f, new Format12x()); 467959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle addOpcodeInfo(Opcode.ADD_INT, "add-int", 0x90, new Format23x()); 468959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle addOpcodeInfo(Opcode.SUB_INT, "sub-int", 0x91, new Format23x()); 469959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle addOpcodeInfo(Opcode.MUL_INT, "mul-int", 0x92, new Format23x()); 470959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle addOpcodeInfo(Opcode.DIV_INT, "div-int", 0x93, new Format23x()); 471959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle addOpcodeInfo(Opcode.REM_INT, "rem-int", 0x94, new Format23x()); 472959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle addOpcodeInfo(Opcode.AND_INT, "and-int", 0x95, new Format23x()); 473959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle addOpcodeInfo(Opcode.OR_INT, "or-int", 0x96, new Format23x()); 474959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle addOpcodeInfo(Opcode.XOR_INT, "xor-int", 0x97, new Format23x()); 475959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle addOpcodeInfo(Opcode.SHL_INT, "shl-int", 0x98, new Format23x()); 476959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle addOpcodeInfo(Opcode.SHR_INT, "shr-int", 0x99, new Format23x()); 477959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle addOpcodeInfo(Opcode.USHR_INT, "ushr-int", 0x9a, new Format23x()); 478959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle addOpcodeInfo(Opcode.ADD_LONG, "add-long", 0x9b, new Format23x()); 479959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle addOpcodeInfo(Opcode.SUB_LONG, "sub-long", 0x9c, new Format23x()); 480959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle addOpcodeInfo(Opcode.MUL_LONG, "mul-long", 0x9d, new Format23x()); 481959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle addOpcodeInfo(Opcode.DIV_LONG, "div-long", 0x9e, new Format23x()); 482959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle addOpcodeInfo(Opcode.REM_LONG, "rem-long", 0x9f, new Format23x()); 483959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle addOpcodeInfo(Opcode.AND_LONG, "and-long", 0xa0, new Format23x()); 484959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle addOpcodeInfo(Opcode.OR_LONG, "or-long", 0xa1, new Format23x()); 485959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle addOpcodeInfo(Opcode.XOR_LONG, "xor-long", 0xa2, new Format23x()); 486959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle addOpcodeInfo(Opcode.SHL_LONG, "shl-long", 0xa3, new Format23x()); 487959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle addOpcodeInfo(Opcode.SHR_LONG, "shr-long", 0xa4, new Format23x()); 488959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle addOpcodeInfo(Opcode.USHR_LONG, "ushr-long", 0xa5, new Format23x()); 489959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle addOpcodeInfo(Opcode.ADD_FLOAT, "add-float", 0xa6, new Format23x()); 490959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle addOpcodeInfo(Opcode.SUB_FLOAT, "sub-float", 0xa7, new Format23x()); 491959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle addOpcodeInfo(Opcode.MUL_FLOAT, "mul-float", 0xa8, new Format23x()); 492959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle addOpcodeInfo(Opcode.DIV_FLOAT, "div-float", 0xa9, new Format23x()); 493959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle addOpcodeInfo(Opcode.REM_FLOAT, "rem-float", 0xaa, new Format23x()); 494959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle addOpcodeInfo(Opcode.ADD_DOUBLE, "add-double", 0xab, new Format23x()); 495959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle addOpcodeInfo(Opcode.SUB_DOUBLE, "sub-double", 0xac, new Format23x()); 496959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle addOpcodeInfo(Opcode.MUL_DOUBLE, "mul-double", 0xad, new Format23x()); 497959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle addOpcodeInfo(Opcode.DIV_DOUBLE, "div-double", 0xae, new Format23x()); 498959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle addOpcodeInfo(Opcode.REM_DOUBLE, "rem-double", 0xaf, new Format23x()); 499959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle addOpcodeInfo(Opcode.ADD_INT_2ADDR, "add-int/2addr", 0xb0, new Format12x()); 500959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle addOpcodeInfo(Opcode.SUB_INT_2ADDR, "sub-int/2addr", 0xb1, new Format12x()); 501959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle addOpcodeInfo(Opcode.MUL_INT_2ADDR, "mul-int/2addr", 0xb2, new Format12x()); 502959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle addOpcodeInfo(Opcode.DIV_INT_2ADDR, "div-int/2addr", 0xb3, new Format12x()); 503959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle addOpcodeInfo(Opcode.REM_INT_2ADDR, "rem-int/2addr", 0xb4, new Format12x()); 504959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle addOpcodeInfo(Opcode.AND_INT_2ADDR, "and-int/2addr", 0xb5, new Format12x()); 505959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle addOpcodeInfo(Opcode.OR_INT_2ADDR, "or-int/2addr", 0xb6, new Format12x()); 506959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle addOpcodeInfo(Opcode.XOR_INT_2ADDR, "xor-int/2addr", 0xb7, new Format12x()); 507959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle addOpcodeInfo(Opcode.SHL_INT_2ADDR, "shl-int/2addr", 0xb8, new Format12x()); 508959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle addOpcodeInfo(Opcode.SHR_INT_2ADDR, "shr-int/2addr", 0xb9, new Format12x()); 509959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle addOpcodeInfo(Opcode.USHR_INT_2ADDR, "ushr-int/2addr", 0xba, new Format12x()); 510959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle addOpcodeInfo(Opcode.ADD_LONG_2ADDR, "add-long/2addr", 0xbb, new Format12x()); 511959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle addOpcodeInfo(Opcode.SUB_LONG_2ADDR, "sub-long/2addr", 0xbc, new Format12x()); 512959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle addOpcodeInfo(Opcode.MUL_LONG_2ADDR, "mul-long/2addr", 0xbd, new Format12x()); 513959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle addOpcodeInfo(Opcode.DIV_LONG_2ADDR, "div-long/2addr", 0xbe, new Format12x()); 514959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle addOpcodeInfo(Opcode.REM_LONG_2ADDR, "rem-long/2addr", 0xbf, new Format12x()); 515959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle addOpcodeInfo(Opcode.AND_LONG_2ADDR, "and-long/2addr", 0xc0, new Format12x()); 516959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle addOpcodeInfo(Opcode.OR_LONG_2ADDR, "or-long/2addr", 0xc1, new Format12x()); 517959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle addOpcodeInfo(Opcode.XOR_LONG_2ADDR, "xor-long/2addr", 0xc2, new Format12x()); 518959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle addOpcodeInfo(Opcode.SHL_LONG_2ADDR, "shl-long/2addr", 0xc3, new Format12x()); 519959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle addOpcodeInfo(Opcode.SHR_LONG_2ADDR, "shr-long/2addr", 0xc4, new Format12x()); 520959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle addOpcodeInfo(Opcode.USHR_LONG_2ADDR, "ushr-long/2addr", 0xc5, new Format12x()); 521959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle addOpcodeInfo(Opcode.ADD_FLOAT_2ADDR, "add-float/2addr", 0xc6, new Format12x()); 522959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle addOpcodeInfo(Opcode.SUB_FLOAT_2ADDR, "sub-float/2addr", 0xc7, new Format12x()); 523959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle addOpcodeInfo(Opcode.MUL_FLOAT_2ADDR, "mul-float/2addr", 0xc8, new Format12x()); 524959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle addOpcodeInfo(Opcode.DIV_FLOAT_2ADDR, "div-float/2addr", 0xc9, new Format12x()); 525959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle addOpcodeInfo(Opcode.REM_FLOAT_2ADDR, "rem-float/2addr", 0xca, new Format12x()); 526959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle addOpcodeInfo(Opcode.ADD_DOUBLE_2ADDR, "add-double/2addr", 0xcb, new Format12x()); 527959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle addOpcodeInfo(Opcode.SUB_DOUBLE_2ADDR, "sub-double/2addr", 0xcc, new Format12x()); 528959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle addOpcodeInfo(Opcode.MUL_DOUBLE_2ADDR, "mul-double/2addr", 0xcd, new Format12x()); 529959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle addOpcodeInfo(Opcode.DIV_DOUBLE_2ADDR, "div-double/2addr", 0xce, new Format12x()); 530959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle addOpcodeInfo(Opcode.REM_DOUBLE_2ADDR, "rem-double/2addr", 0xcf, new Format12x()); 531959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle addOpcodeInfo(Opcode.ADD_INT_LIT16, "add-int/lit16", 0xd0, new Format22s()); 532959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle addOpcodeInfo(Opcode.RSUB_INT, "rsub-int", 0xd1, new Format22s()); 533959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle addOpcodeInfo(Opcode.MUL_INT_LIT16, "mul-int/lit16", 0xd2, new Format22s()); 534959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle addOpcodeInfo(Opcode.DIV_INT_LIT16, "div-int/lit16", 0xd3, new Format22s()); 535959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle addOpcodeInfo(Opcode.REM_INT_LIT16, "rem-int/lit16", 0xd4, new Format22s()); 536959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle addOpcodeInfo(Opcode.AND_INT_LIT16, "and-int/lit16", 0xd5, new Format22s()); 537959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle addOpcodeInfo(Opcode.OR_INT_LIT16, "or-int/lit16", 0xd6, new Format22s()); 538959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle addOpcodeInfo(Opcode.XOR_INT_LIT16, "xor-int/lit16", 0xd7, new Format22s()); 539959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle addOpcodeInfo(Opcode.ADD_INT_LIT8, "add-int/lit8", 0xd8, new Format22b()); 540959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle addOpcodeInfo(Opcode.RSUB_INT_LIT8, "rsub-int/lit8", 0xd9, new Format22b()); 541959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle addOpcodeInfo(Opcode.MUL_INT_LIT8, "mul-int/lit8", 0xda, new Format22b()); 542959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle addOpcodeInfo(Opcode.DIV_INT_LIT8, "div-int/lit8", 0xdb, new Format22b()); 543959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle addOpcodeInfo(Opcode.REM_INT_LIT8, "rem-int/lit8", 0xdc, new Format22b()); 544959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle addOpcodeInfo(Opcode.AND_INT_LIT8, "and-int/lit8", 0xdd, new Format22b()); 545959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle addOpcodeInfo(Opcode.OR_INT_LIT8, "or-int/lit8", 0xde, new Format22b()); 546959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle addOpcodeInfo(Opcode.XOR_INT_LIT8, "xor-int/lit8", 0xdf, new Format22b()); 547959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle addOpcodeInfo(Opcode.SHL_INT_LIT8, "shl-int/lit8", 0xe0, new Format22b()); 548959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle addOpcodeInfo(Opcode.SHR_INT_LIT8, "shr-int/lit8", 0xe1, new Format22b()); 549959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle addOpcodeInfo(Opcode.USHR_INT_LIT8, "ushr-int/lit8", 0xe2, new Format22b()); 550959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle addOpcodeInfo(Opcode.IGET_QUICK, "+iget-quick", 0xe3, new Format22c()); 551959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle addOpcodeInfo(Opcode.IGET_WIDE_QUICK, "+iget-wide-quick", 0xe4, new Format22c()); 552959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle addOpcodeInfo(Opcode.IGET_OBJECT_QUICK, "+iget-object-quick", 0xe5, new Format22c()); 553959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle addOpcodeInfo(Opcode.IPUT_QUICK, "+iput-quick", 0xe6, new Format22c()); 554959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle addOpcodeInfo(Opcode.IPUT_WIDE_QUICK, "+iput-wide-quick", 0xe7, new Format22c()); 555959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle addOpcodeInfo(Opcode.IPUT_OBJECT_QUICK, "+iput-object-quick", 0xe8, new Format22c()); 556959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle addOpcodeInfo(Opcode.INVOKE_VIRTUAL_QUICK, "+invoke-virtual-quick", 0xe9, new Format35c()); 557959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle addOpcodeInfo(Opcode.INVOKE_VIRTUAL_QUICK_RANGE, "+invoke-virtual-quick/range", 558959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle 0xea, new Format3rc()); 559959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle addOpcodeInfo(Opcode.IPUT_BOOLEAN_QUICK, "+iput-boolean-quick", 0xeb, new Format22c()); 560959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle addOpcodeInfo(Opcode.IPUT_BYTE_QUICK, "+iput-byte-quick", 0xec, new Format22c()); 561959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle addOpcodeInfo(Opcode.IPUT_CHAR_QUICK, "+iput-char-quick", 0xed, new Format22c()); 562959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle addOpcodeInfo(Opcode.IPUT_SHORT_QUICK, "+iput-short-quick", 0xee, new Format22c()); 563959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle addOpcodeInfo(Opcode.UNUSED_EF, "unused-ef", 0xef, new Format10x()); 564959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle addOpcodeInfo(Opcode.UNUSED_F0, "unused-f0", 0xf0, new Format10x()); 565959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle addOpcodeInfo(Opcode.UNUSED_F1, "unused-f1", 0xf1, new Format10x()); 566959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle addOpcodeInfo(Opcode.UNUSED_F2, "unused-f2", 0xf2, new Format10x()); 567959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle addOpcodeInfo(Opcode.UNUSED_F3, "unused-f3", 0xf3, new Format10x()); 568959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle addOpcodeInfo(Opcode.UNUSED_F4, "unused-f4", 0xf4, new Format10x()); 569959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle addOpcodeInfo(Opcode.UNUSED_F5, "unused-f5", 0xf5, new Format10x()); 570959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle addOpcodeInfo(Opcode.UNUSED_F6, "unused-f6", 0xf6, new Format10x()); 571959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle addOpcodeInfo(Opcode.UNUSED_F7, "unused-f7", 0xf7, new Format10x()); 572959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle addOpcodeInfo(Opcode.UNUSED_F8, "unused-f8", 0xf8, new Format10x()); 573959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle addOpcodeInfo(Opcode.UNUSED_F9, "unused-f9", 0xf9, new Format10x()); 574959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle addOpcodeInfo(Opcode.UNUSED_FA, "unused-fa", 0xfa, new Format10x()); 575959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle addOpcodeInfo(Opcode.UNUSED_FB, "unused-fb", 0xfb, new Format10x()); 576959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle addOpcodeInfo(Opcode.UNUSED_FC, "unused-fc", 0xfc, new Format10x()); 577959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle addOpcodeInfo(Opcode.UNUSED_FD, "unused-fd", 0xfd, new Format10x()); 578959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle addOpcodeInfo(Opcode.UNUSED_FE, "unused-fe", 0xfe, new Format10x()); 579959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle addOpcodeInfo(Opcode.UNUSED_FF, "unused-ff", 0xff, new Format10x()); 580959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle if (opcode_map_by_int.size() != 256) { 581959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle Log.errorAndQuit("Incorrect number of bytecodes defined."); 582959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle } 583959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle } 584959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle} 585