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