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.program.mutators; 18959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle 19959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyleimport dexfuzz.Log; 20959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyleimport dexfuzz.MutationStats; 21959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyleimport dexfuzz.program.MInsn; 22959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyleimport dexfuzz.program.MutatableCode; 23959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyleimport dexfuzz.program.Mutation; 24959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyleimport dexfuzz.rawdex.Instruction; 25959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyleimport dexfuzz.rawdex.Opcode; 26959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyleimport dexfuzz.rawdex.OpcodeInfo; 27959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle 28959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyleimport java.util.ArrayList; 29959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyleimport java.util.List; 30959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyleimport java.util.Random; 31959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle 32959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kylepublic class ArithOpChanger extends CodeMutator { 33959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle /** 34959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle * Every CodeMutator has an AssociatedMutation, representing the 35959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle * mutation that this CodeMutator can perform, to allow separate 36959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle * generateMutation() and applyMutation() phases, allowing serialization. 37959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle */ 38959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle public static class AssociatedMutation extends Mutation { 39959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle public int arithmeticInsnIdx; 40959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle public int newOpcode; 41959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle 42959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle @Override 43959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle public String getString() { 44959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle StringBuilder builder = new StringBuilder(); 45959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle builder.append(arithmeticInsnIdx).append(" "); 46959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle builder.append(newOpcode); 47959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle return builder.toString(); 48959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle } 49959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle 50959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle @Override 51959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle public void parseString(String[] elements) { 52959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle arithmeticInsnIdx = Integer.parseInt(elements[2]); 53959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle newOpcode = Integer.parseInt(elements[3]); 54959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle } 55959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle } 56959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle 57959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle // The following two methods are here for the benefit of MutationSerializer, 58959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle // so it can create a CodeMutator and get the correct associated Mutation, as it 59959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle // reads in mutations from a dump of mutations. 60959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle @Override 61959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle public Mutation getNewMutation() { 62959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle return new AssociatedMutation(); 63959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle } 64959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle 65959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle public ArithOpChanger() { } 66959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle 67959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle public ArithOpChanger(Random rng, MutationStats stats, List<Mutation> mutations) { 68959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle super(rng, stats, mutations); 69959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle likelihood = 75; 70959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle } 71959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle 72959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle // A cache that should only exist between generateMutation() and applyMutation(), 73959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle // or be created at the start of applyMutation(), if we're reading in mutations from 74959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle // a file. 75959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle private List<MInsn> arithmeticInsns = null; 76959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle 77959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle private void generateCachedArithmeticInsns(MutatableCode mutatableCode) { 78959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle if (arithmeticInsns != null) { 79959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle return; 80959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle } 81959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle 82959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle arithmeticInsns = new ArrayList<MInsn>(); 83959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle 84959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle for (MInsn mInsn : mutatableCode.getInstructions()) { 85959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle if (isArithmeticOperation(mInsn)) { 86959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle arithmeticInsns.add(mInsn); 87959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle } 88959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle } 89959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle } 90959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle 91959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle @Override 92959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle protected boolean canMutate(MutatableCode mutatableCode) { 93959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle for (MInsn mInsn : mutatableCode.getInstructions()) { 94959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle if (isArithmeticOperation(mInsn)) { 95959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle return true; 96959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle } 97959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle } 98959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle 99959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle Log.debug("No arithmetic operations in method, skipping..."); 100959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle return false; 101959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle } 102959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle 103959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle @Override 104959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle protected Mutation generateMutation(MutatableCode mutatableCode) { 105959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle generateCachedArithmeticInsns(mutatableCode); 106959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle 107959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle int arithmeticInsnIdx = rng.nextInt(arithmeticInsns.size()); 108959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle 109959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle MInsn randomInsn = arithmeticInsns.get(arithmeticInsnIdx); 110959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle 111959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle OpcodeInfo oldOpcodeInfo = randomInsn.insn.info; 112959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle 113959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle OpcodeInfo newOpcodeInfo = oldOpcodeInfo; 114959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle 115959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle while (newOpcodeInfo.value == oldOpcodeInfo.value) { 116959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle newOpcodeInfo = Instruction.getOpcodeInfo(getLegalDifferentOpcode(randomInsn)); 117959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle } 118959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle 119959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle AssociatedMutation mutation = new AssociatedMutation(); 120959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle mutation.setup(this.getClass(), mutatableCode); 121959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle mutation.arithmeticInsnIdx = arithmeticInsnIdx; 122959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle mutation.newOpcode = newOpcodeInfo.value; 123959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle return mutation; 124959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle } 125959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle 126959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle @Override 127959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle protected void applyMutation(Mutation uncastMutation) { 128959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle // Cast the Mutation to our AssociatedMutation, so we can access its fields. 129959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle AssociatedMutation mutation = (AssociatedMutation) uncastMutation; 130959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle MutatableCode mutatableCode = mutation.mutatableCode; 131959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle 132959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle generateCachedArithmeticInsns(mutatableCode); 133959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle 134959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle MInsn randomInsn = arithmeticInsns.get(mutation.arithmeticInsnIdx); 135959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle 136959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle String oldInsnString = randomInsn.toString(); 137959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle 138959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle OpcodeInfo newOpcodeInfo = Instruction.getOpcodeInfo(mutation.newOpcode); 139959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle 140959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle randomInsn.insn.info = newOpcodeInfo; 141959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle 142959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle Log.info("Changed " + oldInsnString + " to " + randomInsn); 143959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle 144959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle stats.incrementStat("Changed arithmetic opcode"); 145959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle 146959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle // Clear the cache. 147959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle arithmeticInsns = null; 148959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle } 149959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle 150959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle private boolean isArithmeticOperation(MInsn mInsn) { 151959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle Opcode opcode = mInsn.insn.info.opcode; 152959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle if (Opcode.isBetween(opcode, Opcode.ADD_INT, Opcode.USHR_INT_LIT8)) { 153959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle return true; 154959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle } 155959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle return false; 156959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle } 157959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle 158959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle private Opcode getLegalDifferentOpcode(MInsn mInsn) { 159959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle Opcode opcode = mInsn.insn.info.opcode; 160959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle 161959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle for (List<Opcode> opcodeList : opcodeLists) { 162959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle Opcode first = opcodeList.get(0); 163959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle Opcode last = opcodeList.get(opcodeList.size() - 1); 164959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle if (Opcode.isBetween(opcode, first, last)) { 165959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle int newOpcodeIdx = rng.nextInt(opcodeList.size()); 166959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle return opcodeList.get(newOpcodeIdx); 167959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle } 168959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle } 169959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle 170959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle return opcode; 171959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle } 172959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle 173959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle private static List<Opcode> intOpcodes = new ArrayList<Opcode>(); 174959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle private static List<Opcode> int2addrOpcodes = new ArrayList<Opcode>(); 175959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle private static List<Opcode> longOpcodes = new ArrayList<Opcode>(); 176959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle private static List<Opcode> long2addrOpcodes = new ArrayList<Opcode>(); 177959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle private static List<Opcode> floatOpcodes = new ArrayList<Opcode>(); 178959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle private static List<Opcode> float2addrOpcodes = new ArrayList<Opcode>(); 179959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle private static List<Opcode> doubleOpcodes = new ArrayList<Opcode>(); 180959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle private static List<Opcode> double2addrOpcodes = new ArrayList<Opcode>(); 181959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle private static List<Opcode> intLit8Opcodes = new ArrayList<Opcode>(); 182959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle private static List<Opcode> intLit16Opcodes = new ArrayList<Opcode>(); 183959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle private static List<List<Opcode>> opcodeLists = new ArrayList<List<Opcode>>(); 184959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle 185959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle static { 186959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle intOpcodes.add(Opcode.ADD_INT); 187959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle intOpcodes.add(Opcode.SUB_INT); 188959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle intOpcodes.add(Opcode.MUL_INT); 189959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle intOpcodes.add(Opcode.DIV_INT); 190959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle intOpcodes.add(Opcode.REM_INT); 191959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle intOpcodes.add(Opcode.AND_INT); 192959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle intOpcodes.add(Opcode.OR_INT); 193959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle intOpcodes.add(Opcode.XOR_INT); 194959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle intOpcodes.add(Opcode.SHL_INT); 195959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle intOpcodes.add(Opcode.SHR_INT); 196959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle intOpcodes.add(Opcode.USHR_INT); 197959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle 198959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle int2addrOpcodes.add(Opcode.ADD_INT_2ADDR); 199959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle int2addrOpcodes.add(Opcode.SUB_INT_2ADDR); 200959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle int2addrOpcodes.add(Opcode.MUL_INT_2ADDR); 201959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle int2addrOpcodes.add(Opcode.DIV_INT_2ADDR); 202959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle int2addrOpcodes.add(Opcode.REM_INT_2ADDR); 203959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle int2addrOpcodes.add(Opcode.AND_INT_2ADDR); 204959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle int2addrOpcodes.add(Opcode.OR_INT_2ADDR); 205959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle int2addrOpcodes.add(Opcode.XOR_INT_2ADDR); 206959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle int2addrOpcodes.add(Opcode.SHL_INT_2ADDR); 207959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle int2addrOpcodes.add(Opcode.SHR_INT_2ADDR); 208959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle int2addrOpcodes.add(Opcode.USHR_INT_2ADDR); 209959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle 210959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle longOpcodes.add(Opcode.ADD_LONG); 211959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle longOpcodes.add(Opcode.SUB_LONG); 212959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle longOpcodes.add(Opcode.MUL_LONG); 213959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle longOpcodes.add(Opcode.DIV_LONG); 214959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle longOpcodes.add(Opcode.REM_LONG); 215959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle longOpcodes.add(Opcode.AND_LONG); 216959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle longOpcodes.add(Opcode.OR_LONG); 217959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle longOpcodes.add(Opcode.XOR_LONG); 218959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle longOpcodes.add(Opcode.SHL_LONG); 219959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle longOpcodes.add(Opcode.SHR_LONG); 220959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle longOpcodes.add(Opcode.USHR_LONG); 221959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle 222959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle long2addrOpcodes.add(Opcode.ADD_LONG_2ADDR); 223959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle long2addrOpcodes.add(Opcode.SUB_LONG_2ADDR); 224959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle long2addrOpcodes.add(Opcode.MUL_LONG_2ADDR); 225959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle long2addrOpcodes.add(Opcode.DIV_LONG_2ADDR); 226959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle long2addrOpcodes.add(Opcode.REM_LONG_2ADDR); 227959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle long2addrOpcodes.add(Opcode.AND_LONG_2ADDR); 228959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle long2addrOpcodes.add(Opcode.OR_LONG_2ADDR); 229959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle long2addrOpcodes.add(Opcode.XOR_LONG_2ADDR); 230959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle long2addrOpcodes.add(Opcode.SHL_LONG_2ADDR); 231959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle long2addrOpcodes.add(Opcode.SHR_LONG_2ADDR); 232959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle long2addrOpcodes.add(Opcode.USHR_LONG_2ADDR); 233959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle 234959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle floatOpcodes.add(Opcode.ADD_FLOAT); 235959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle floatOpcodes.add(Opcode.SUB_FLOAT); 236959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle floatOpcodes.add(Opcode.MUL_FLOAT); 237959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle floatOpcodes.add(Opcode.DIV_FLOAT); 238959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle floatOpcodes.add(Opcode.REM_FLOAT); 239959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle 240959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle float2addrOpcodes.add(Opcode.ADD_FLOAT_2ADDR); 241959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle float2addrOpcodes.add(Opcode.SUB_FLOAT_2ADDR); 242959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle float2addrOpcodes.add(Opcode.MUL_FLOAT_2ADDR); 243959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle float2addrOpcodes.add(Opcode.DIV_FLOAT_2ADDR); 244959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle float2addrOpcodes.add(Opcode.REM_FLOAT_2ADDR); 245959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle 246959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle doubleOpcodes.add(Opcode.ADD_DOUBLE); 247959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle doubleOpcodes.add(Opcode.SUB_DOUBLE); 248959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle doubleOpcodes.add(Opcode.MUL_DOUBLE); 249959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle doubleOpcodes.add(Opcode.DIV_DOUBLE); 250959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle doubleOpcodes.add(Opcode.REM_DOUBLE); 251959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle 252959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle double2addrOpcodes.add(Opcode.ADD_DOUBLE_2ADDR); 253959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle double2addrOpcodes.add(Opcode.SUB_DOUBLE_2ADDR); 254959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle double2addrOpcodes.add(Opcode.MUL_DOUBLE_2ADDR); 255959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle double2addrOpcodes.add(Opcode.DIV_DOUBLE_2ADDR); 256959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle double2addrOpcodes.add(Opcode.REM_DOUBLE_2ADDR); 257959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle 258959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle intLit8Opcodes.add(Opcode.ADD_INT_LIT8); 259959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle intLit8Opcodes.add(Opcode.RSUB_INT_LIT8); 260959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle intLit8Opcodes.add(Opcode.MUL_INT_LIT8); 261959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle intLit8Opcodes.add(Opcode.DIV_INT_LIT8); 262959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle intLit8Opcodes.add(Opcode.REM_INT_LIT8); 263959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle intLit8Opcodes.add(Opcode.AND_INT_LIT8); 264959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle intLit8Opcodes.add(Opcode.OR_INT_LIT8); 265959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle intLit8Opcodes.add(Opcode.XOR_INT_LIT8); 266959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle intLit8Opcodes.add(Opcode.SHL_INT_LIT8); 267959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle intLit8Opcodes.add(Opcode.SHR_INT_LIT8); 268959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle intLit8Opcodes.add(Opcode.USHR_INT_LIT8); 269959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle 270959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle intLit16Opcodes.add(Opcode.ADD_INT_LIT16); 271959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle intLit16Opcodes.add(Opcode.RSUB_INT); 272959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle intLit16Opcodes.add(Opcode.MUL_INT_LIT16); 273959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle intLit16Opcodes.add(Opcode.DIV_INT_LIT16); 274959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle intLit16Opcodes.add(Opcode.REM_INT_LIT16); 275959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle intLit16Opcodes.add(Opcode.AND_INT_LIT16); 276959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle intLit16Opcodes.add(Opcode.OR_INT_LIT16); 277959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle intLit16Opcodes.add(Opcode.XOR_INT_LIT16); 278959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle 279959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle opcodeLists.add(intOpcodes); 280959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle opcodeLists.add(longOpcodes); 281959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle opcodeLists.add(floatOpcodes); 282959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle opcodeLists.add(doubleOpcodes); 283959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle opcodeLists.add(int2addrOpcodes); 284959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle opcodeLists.add(long2addrOpcodes); 285959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle opcodeLists.add(float2addrOpcodes); 286959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle opcodeLists.add(double2addrOpcodes); 287959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle opcodeLists.add(intLit8Opcodes); 288959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle opcodeLists.add(intLit16Opcodes); 289959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle } 290959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle} 291