1 /*
2  * Copyright (C) 2007 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 package com.android.dx.dex.code;
18 
19 import com.android.dx.dex.DexOptions;
20 import com.android.dx.dex.code.form.Form10t;
21 import com.android.dx.dex.code.form.Form10x;
22 import com.android.dx.dex.code.form.Form11n;
23 import com.android.dx.dex.code.form.Form11x;
24 import com.android.dx.dex.code.form.Form12x;
25 import com.android.dx.dex.code.form.Form20t;
26 import com.android.dx.dex.code.form.Form21c;
27 import com.android.dx.dex.code.form.Form21h;
28 import com.android.dx.dex.code.form.Form21s;
29 import com.android.dx.dex.code.form.Form21t;
30 import com.android.dx.dex.code.form.Form22b;
31 import com.android.dx.dex.code.form.Form22c;
32 import com.android.dx.dex.code.form.Form22s;
33 import com.android.dx.dex.code.form.Form22t;
34 import com.android.dx.dex.code.form.Form22x;
35 import com.android.dx.dex.code.form.Form23x;
36 import com.android.dx.dex.code.form.Form30t;
37 import com.android.dx.dex.code.form.Form31c;
38 import com.android.dx.dex.code.form.Form31i;
39 import com.android.dx.dex.code.form.Form31t;
40 import com.android.dx.dex.code.form.Form32x;
41 import com.android.dx.dex.code.form.Form35c;
42 import com.android.dx.dex.code.form.Form3rc;
43 import com.android.dx.dex.code.form.Form51l;
44 import com.android.dx.dex.code.form.SpecialFormat;
45 import com.android.dx.io.Opcodes;
46 
47 /**
48  * Standard instances of {@link Dop} and utility methods for getting
49  * them.
50  */
51 public final class Dops {
52     /** {@code non-null;} array containing all the standard instances */
53     private static final Dop[] DOPS;
54 
55     /**
56      * pseudo-opcode used for nonstandard formatted "instructions"
57      * (which are mostly not actually instructions, though they do
58      * appear in instruction lists). TODO: Retire the usage of this
59      * constant.
60      */
61     public static final Dop SPECIAL_FORMAT =
62         new Dop(Opcodes.SPECIAL_FORMAT, Opcodes.SPECIAL_FORMAT,
63                 Opcodes.NO_NEXT, SpecialFormat.THE_ONE, false);
64 
65     // BEGIN(dops); GENERATED AUTOMATICALLY BY opcode-gen
66     public static final Dop NOP =
67         new Dop(Opcodes.NOP, Opcodes.NOP,
68             Opcodes.NO_NEXT, Form10x.THE_ONE, false);
69 
70     public static final Dop MOVE =
71         new Dop(Opcodes.MOVE, Opcodes.MOVE,
72             Opcodes.MOVE_FROM16, Form12x.THE_ONE, true);
73 
74     public static final Dop MOVE_FROM16 =
75         new Dop(Opcodes.MOVE_FROM16, Opcodes.MOVE,
76             Opcodes.MOVE_16, Form22x.THE_ONE, true);
77 
78     public static final Dop MOVE_16 =
79         new Dop(Opcodes.MOVE_16, Opcodes.MOVE,
80             Opcodes.NO_NEXT, Form32x.THE_ONE, true);
81 
82     public static final Dop MOVE_WIDE =
83         new Dop(Opcodes.MOVE_WIDE, Opcodes.MOVE_WIDE,
84             Opcodes.MOVE_WIDE_FROM16, Form12x.THE_ONE, true);
85 
86     public static final Dop MOVE_WIDE_FROM16 =
87         new Dop(Opcodes.MOVE_WIDE_FROM16, Opcodes.MOVE_WIDE,
88             Opcodes.MOVE_WIDE_16, Form22x.THE_ONE, true);
89 
90     public static final Dop MOVE_WIDE_16 =
91         new Dop(Opcodes.MOVE_WIDE_16, Opcodes.MOVE_WIDE,
92             Opcodes.NO_NEXT, Form32x.THE_ONE, true);
93 
94     public static final Dop MOVE_OBJECT =
95         new Dop(Opcodes.MOVE_OBJECT, Opcodes.MOVE_OBJECT,
96             Opcodes.MOVE_OBJECT_FROM16, Form12x.THE_ONE, true);
97 
98     public static final Dop MOVE_OBJECT_FROM16 =
99         new Dop(Opcodes.MOVE_OBJECT_FROM16, Opcodes.MOVE_OBJECT,
100             Opcodes.MOVE_OBJECT_16, Form22x.THE_ONE, true);
101 
102     public static final Dop MOVE_OBJECT_16 =
103         new Dop(Opcodes.MOVE_OBJECT_16, Opcodes.MOVE_OBJECT,
104             Opcodes.NO_NEXT, Form32x.THE_ONE, true);
105 
106     public static final Dop MOVE_RESULT =
107         new Dop(Opcodes.MOVE_RESULT, Opcodes.MOVE_RESULT,
108             Opcodes.NO_NEXT, Form11x.THE_ONE, true);
109 
110     public static final Dop MOVE_RESULT_WIDE =
111         new Dop(Opcodes.MOVE_RESULT_WIDE, Opcodes.MOVE_RESULT_WIDE,
112             Opcodes.NO_NEXT, Form11x.THE_ONE, true);
113 
114     public static final Dop MOVE_RESULT_OBJECT =
115         new Dop(Opcodes.MOVE_RESULT_OBJECT, Opcodes.MOVE_RESULT_OBJECT,
116             Opcodes.NO_NEXT, Form11x.THE_ONE, true);
117 
118     public static final Dop MOVE_EXCEPTION =
119         new Dop(Opcodes.MOVE_EXCEPTION, Opcodes.MOVE_EXCEPTION,
120             Opcodes.NO_NEXT, Form11x.THE_ONE, true);
121 
122     public static final Dop RETURN_VOID =
123         new Dop(Opcodes.RETURN_VOID, Opcodes.RETURN_VOID,
124             Opcodes.NO_NEXT, Form10x.THE_ONE, false);
125 
126     public static final Dop RETURN =
127         new Dop(Opcodes.RETURN, Opcodes.RETURN,
128             Opcodes.NO_NEXT, Form11x.THE_ONE, false);
129 
130     public static final Dop RETURN_WIDE =
131         new Dop(Opcodes.RETURN_WIDE, Opcodes.RETURN_WIDE,
132             Opcodes.NO_NEXT, Form11x.THE_ONE, false);
133 
134     public static final Dop RETURN_OBJECT =
135         new Dop(Opcodes.RETURN_OBJECT, Opcodes.RETURN_OBJECT,
136             Opcodes.NO_NEXT, Form11x.THE_ONE, false);
137 
138     public static final Dop CONST_4 =
139         new Dop(Opcodes.CONST_4, Opcodes.CONST,
140             Opcodes.CONST_16, Form11n.THE_ONE, true);
141 
142     public static final Dop CONST_16 =
143         new Dop(Opcodes.CONST_16, Opcodes.CONST,
144             Opcodes.CONST_HIGH16, Form21s.THE_ONE, true);
145 
146     public static final Dop CONST =
147         new Dop(Opcodes.CONST, Opcodes.CONST,
148             Opcodes.NO_NEXT, Form31i.THE_ONE, true);
149 
150     public static final Dop CONST_HIGH16 =
151         new Dop(Opcodes.CONST_HIGH16, Opcodes.CONST,
152             Opcodes.CONST, Form21h.THE_ONE, true);
153 
154     public static final Dop CONST_WIDE_16 =
155         new Dop(Opcodes.CONST_WIDE_16, Opcodes.CONST_WIDE,
156             Opcodes.CONST_WIDE_HIGH16, Form21s.THE_ONE, true);
157 
158     public static final Dop CONST_WIDE_32 =
159         new Dop(Opcodes.CONST_WIDE_32, Opcodes.CONST_WIDE,
160             Opcodes.CONST_WIDE, Form31i.THE_ONE, true);
161 
162     public static final Dop CONST_WIDE =
163         new Dop(Opcodes.CONST_WIDE, Opcodes.CONST_WIDE,
164             Opcodes.NO_NEXT, Form51l.THE_ONE, true);
165 
166     public static final Dop CONST_WIDE_HIGH16 =
167         new Dop(Opcodes.CONST_WIDE_HIGH16, Opcodes.CONST_WIDE,
168             Opcodes.CONST_WIDE_32, Form21h.THE_ONE, true);
169 
170     public static final Dop CONST_STRING =
171         new Dop(Opcodes.CONST_STRING, Opcodes.CONST_STRING,
172             Opcodes.CONST_STRING_JUMBO, Form21c.THE_ONE, true);
173 
174     public static final Dop CONST_STRING_JUMBO =
175         new Dop(Opcodes.CONST_STRING_JUMBO, Opcodes.CONST_STRING,
176             Opcodes.NO_NEXT, Form31c.THE_ONE, true);
177 
178     public static final Dop CONST_CLASS =
179         new Dop(Opcodes.CONST_CLASS, Opcodes.CONST_CLASS,
180             Opcodes.NO_NEXT, Form21c.THE_ONE, true);
181 
182     public static final Dop MONITOR_ENTER =
183         new Dop(Opcodes.MONITOR_ENTER, Opcodes.MONITOR_ENTER,
184             Opcodes.NO_NEXT, Form11x.THE_ONE, false);
185 
186     public static final Dop MONITOR_EXIT =
187         new Dop(Opcodes.MONITOR_EXIT, Opcodes.MONITOR_EXIT,
188             Opcodes.NO_NEXT, Form11x.THE_ONE, false);
189 
190     public static final Dop CHECK_CAST =
191         new Dop(Opcodes.CHECK_CAST, Opcodes.CHECK_CAST,
192             Opcodes.NO_NEXT, Form21c.THE_ONE, true);
193 
194     public static final Dop INSTANCE_OF =
195         new Dop(Opcodes.INSTANCE_OF, Opcodes.INSTANCE_OF,
196             Opcodes.NO_NEXT, Form22c.THE_ONE, true);
197 
198     public static final Dop ARRAY_LENGTH =
199         new Dop(Opcodes.ARRAY_LENGTH, Opcodes.ARRAY_LENGTH,
200             Opcodes.NO_NEXT, Form12x.THE_ONE, true);
201 
202     public static final Dop NEW_INSTANCE =
203         new Dop(Opcodes.NEW_INSTANCE, Opcodes.NEW_INSTANCE,
204             Opcodes.NO_NEXT, Form21c.THE_ONE, true);
205 
206     public static final Dop NEW_ARRAY =
207         new Dop(Opcodes.NEW_ARRAY, Opcodes.NEW_ARRAY,
208             Opcodes.NO_NEXT, Form22c.THE_ONE, true);
209 
210     public static final Dop FILLED_NEW_ARRAY =
211         new Dop(Opcodes.FILLED_NEW_ARRAY, Opcodes.FILLED_NEW_ARRAY,
212             Opcodes.FILLED_NEW_ARRAY_RANGE, Form35c.THE_ONE, false);
213 
214     public static final Dop FILLED_NEW_ARRAY_RANGE =
215         new Dop(Opcodes.FILLED_NEW_ARRAY_RANGE, Opcodes.FILLED_NEW_ARRAY,
216             Opcodes.NO_NEXT, Form3rc.THE_ONE, false);
217 
218     public static final Dop FILL_ARRAY_DATA =
219         new Dop(Opcodes.FILL_ARRAY_DATA, Opcodes.FILL_ARRAY_DATA,
220             Opcodes.NO_NEXT, Form31t.THE_ONE, false);
221 
222     public static final Dop THROW =
223         new Dop(Opcodes.THROW, Opcodes.THROW,
224             Opcodes.NO_NEXT, Form11x.THE_ONE, false);
225 
226     public static final Dop GOTO =
227         new Dop(Opcodes.GOTO, Opcodes.GOTO,
228             Opcodes.GOTO_16, Form10t.THE_ONE, false);
229 
230     public static final Dop GOTO_16 =
231         new Dop(Opcodes.GOTO_16, Opcodes.GOTO,
232             Opcodes.GOTO_32, Form20t.THE_ONE, false);
233 
234     public static final Dop GOTO_32 =
235         new Dop(Opcodes.GOTO_32, Opcodes.GOTO,
236             Opcodes.NO_NEXT, Form30t.THE_ONE, false);
237 
238     public static final Dop PACKED_SWITCH =
239         new Dop(Opcodes.PACKED_SWITCH, Opcodes.PACKED_SWITCH,
240             Opcodes.NO_NEXT, Form31t.THE_ONE, false);
241 
242     public static final Dop SPARSE_SWITCH =
243         new Dop(Opcodes.SPARSE_SWITCH, Opcodes.SPARSE_SWITCH,
244             Opcodes.NO_NEXT, Form31t.THE_ONE, false);
245 
246     public static final Dop CMPL_FLOAT =
247         new Dop(Opcodes.CMPL_FLOAT, Opcodes.CMPL_FLOAT,
248             Opcodes.NO_NEXT, Form23x.THE_ONE, true);
249 
250     public static final Dop CMPG_FLOAT =
251         new Dop(Opcodes.CMPG_FLOAT, Opcodes.CMPG_FLOAT,
252             Opcodes.NO_NEXT, Form23x.THE_ONE, true);
253 
254     public static final Dop CMPL_DOUBLE =
255         new Dop(Opcodes.CMPL_DOUBLE, Opcodes.CMPL_DOUBLE,
256             Opcodes.NO_NEXT, Form23x.THE_ONE, true);
257 
258     public static final Dop CMPG_DOUBLE =
259         new Dop(Opcodes.CMPG_DOUBLE, Opcodes.CMPG_DOUBLE,
260             Opcodes.NO_NEXT, Form23x.THE_ONE, true);
261 
262     public static final Dop CMP_LONG =
263         new Dop(Opcodes.CMP_LONG, Opcodes.CMP_LONG,
264             Opcodes.NO_NEXT, Form23x.THE_ONE, true);
265 
266     public static final Dop IF_EQ =
267         new Dop(Opcodes.IF_EQ, Opcodes.IF_EQ,
268             Opcodes.NO_NEXT, Form22t.THE_ONE, false);
269 
270     public static final Dop IF_NE =
271         new Dop(Opcodes.IF_NE, Opcodes.IF_NE,
272             Opcodes.NO_NEXT, Form22t.THE_ONE, false);
273 
274     public static final Dop IF_LT =
275         new Dop(Opcodes.IF_LT, Opcodes.IF_LT,
276             Opcodes.NO_NEXT, Form22t.THE_ONE, false);
277 
278     public static final Dop IF_GE =
279         new Dop(Opcodes.IF_GE, Opcodes.IF_GE,
280             Opcodes.NO_NEXT, Form22t.THE_ONE, false);
281 
282     public static final Dop IF_GT =
283         new Dop(Opcodes.IF_GT, Opcodes.IF_GT,
284             Opcodes.NO_NEXT, Form22t.THE_ONE, false);
285 
286     public static final Dop IF_LE =
287         new Dop(Opcodes.IF_LE, Opcodes.IF_LE,
288             Opcodes.NO_NEXT, Form22t.THE_ONE, false);
289 
290     public static final Dop IF_EQZ =
291         new Dop(Opcodes.IF_EQZ, Opcodes.IF_EQZ,
292             Opcodes.NO_NEXT, Form21t.THE_ONE, false);
293 
294     public static final Dop IF_NEZ =
295         new Dop(Opcodes.IF_NEZ, Opcodes.IF_NEZ,
296             Opcodes.NO_NEXT, Form21t.THE_ONE, false);
297 
298     public static final Dop IF_LTZ =
299         new Dop(Opcodes.IF_LTZ, Opcodes.IF_LTZ,
300             Opcodes.NO_NEXT, Form21t.THE_ONE, false);
301 
302     public static final Dop IF_GEZ =
303         new Dop(Opcodes.IF_GEZ, Opcodes.IF_GEZ,
304             Opcodes.NO_NEXT, Form21t.THE_ONE, false);
305 
306     public static final Dop IF_GTZ =
307         new Dop(Opcodes.IF_GTZ, Opcodes.IF_GTZ,
308             Opcodes.NO_NEXT, Form21t.THE_ONE, false);
309 
310     public static final Dop IF_LEZ =
311         new Dop(Opcodes.IF_LEZ, Opcodes.IF_LEZ,
312             Opcodes.NO_NEXT, Form21t.THE_ONE, false);
313 
314     public static final Dop AGET =
315         new Dop(Opcodes.AGET, Opcodes.AGET,
316             Opcodes.NO_NEXT, Form23x.THE_ONE, true);
317 
318     public static final Dop AGET_WIDE =
319         new Dop(Opcodes.AGET_WIDE, Opcodes.AGET_WIDE,
320             Opcodes.NO_NEXT, Form23x.THE_ONE, true);
321 
322     public static final Dop AGET_OBJECT =
323         new Dop(Opcodes.AGET_OBJECT, Opcodes.AGET_OBJECT,
324             Opcodes.NO_NEXT, Form23x.THE_ONE, true);
325 
326     public static final Dop AGET_BOOLEAN =
327         new Dop(Opcodes.AGET_BOOLEAN, Opcodes.AGET_BOOLEAN,
328             Opcodes.NO_NEXT, Form23x.THE_ONE, true);
329 
330     public static final Dop AGET_BYTE =
331         new Dop(Opcodes.AGET_BYTE, Opcodes.AGET_BYTE,
332             Opcodes.NO_NEXT, Form23x.THE_ONE, true);
333 
334     public static final Dop AGET_CHAR =
335         new Dop(Opcodes.AGET_CHAR, Opcodes.AGET_CHAR,
336             Opcodes.NO_NEXT, Form23x.THE_ONE, true);
337 
338     public static final Dop AGET_SHORT =
339         new Dop(Opcodes.AGET_SHORT, Opcodes.AGET_SHORT,
340             Opcodes.NO_NEXT, Form23x.THE_ONE, true);
341 
342     public static final Dop APUT =
343         new Dop(Opcodes.APUT, Opcodes.APUT,
344             Opcodes.NO_NEXT, Form23x.THE_ONE, false);
345 
346     public static final Dop APUT_WIDE =
347         new Dop(Opcodes.APUT_WIDE, Opcodes.APUT_WIDE,
348             Opcodes.NO_NEXT, Form23x.THE_ONE, false);
349 
350     public static final Dop APUT_OBJECT =
351         new Dop(Opcodes.APUT_OBJECT, Opcodes.APUT_OBJECT,
352             Opcodes.NO_NEXT, Form23x.THE_ONE, false);
353 
354     public static final Dop APUT_BOOLEAN =
355         new Dop(Opcodes.APUT_BOOLEAN, Opcodes.APUT_BOOLEAN,
356             Opcodes.NO_NEXT, Form23x.THE_ONE, false);
357 
358     public static final Dop APUT_BYTE =
359         new Dop(Opcodes.APUT_BYTE, Opcodes.APUT_BYTE,
360             Opcodes.NO_NEXT, Form23x.THE_ONE, false);
361 
362     public static final Dop APUT_CHAR =
363         new Dop(Opcodes.APUT_CHAR, Opcodes.APUT_CHAR,
364             Opcodes.NO_NEXT, Form23x.THE_ONE, false);
365 
366     public static final Dop APUT_SHORT =
367         new Dop(Opcodes.APUT_SHORT, Opcodes.APUT_SHORT,
368             Opcodes.NO_NEXT, Form23x.THE_ONE, false);
369 
370     public static final Dop IGET =
371         new Dop(Opcodes.IGET, Opcodes.IGET,
372             Opcodes.NO_NEXT, Form22c.THE_ONE, true);
373 
374     public static final Dop IGET_WIDE =
375         new Dop(Opcodes.IGET_WIDE, Opcodes.IGET_WIDE,
376             Opcodes.NO_NEXT, Form22c.THE_ONE, true);
377 
378     public static final Dop IGET_OBJECT =
379         new Dop(Opcodes.IGET_OBJECT, Opcodes.IGET_OBJECT,
380             Opcodes.NO_NEXT, Form22c.THE_ONE, true);
381 
382     public static final Dop IGET_BOOLEAN =
383         new Dop(Opcodes.IGET_BOOLEAN, Opcodes.IGET_BOOLEAN,
384             Opcodes.NO_NEXT, Form22c.THE_ONE, true);
385 
386     public static final Dop IGET_BYTE =
387         new Dop(Opcodes.IGET_BYTE, Opcodes.IGET_BYTE,
388             Opcodes.NO_NEXT, Form22c.THE_ONE, true);
389 
390     public static final Dop IGET_CHAR =
391         new Dop(Opcodes.IGET_CHAR, Opcodes.IGET_CHAR,
392             Opcodes.NO_NEXT, Form22c.THE_ONE, true);
393 
394     public static final Dop IGET_SHORT =
395         new Dop(Opcodes.IGET_SHORT, Opcodes.IGET_SHORT,
396             Opcodes.NO_NEXT, Form22c.THE_ONE, true);
397 
398     public static final Dop IPUT =
399         new Dop(Opcodes.IPUT, Opcodes.IPUT,
400             Opcodes.NO_NEXT, Form22c.THE_ONE, false);
401 
402     public static final Dop IPUT_WIDE =
403         new Dop(Opcodes.IPUT_WIDE, Opcodes.IPUT_WIDE,
404             Opcodes.NO_NEXT, Form22c.THE_ONE, false);
405 
406     public static final Dop IPUT_OBJECT =
407         new Dop(Opcodes.IPUT_OBJECT, Opcodes.IPUT_OBJECT,
408             Opcodes.NO_NEXT, Form22c.THE_ONE, false);
409 
410     public static final Dop IPUT_BOOLEAN =
411         new Dop(Opcodes.IPUT_BOOLEAN, Opcodes.IPUT_BOOLEAN,
412             Opcodes.NO_NEXT, Form22c.THE_ONE, false);
413 
414     public static final Dop IPUT_BYTE =
415         new Dop(Opcodes.IPUT_BYTE, Opcodes.IPUT_BYTE,
416             Opcodes.NO_NEXT, Form22c.THE_ONE, false);
417 
418     public static final Dop IPUT_CHAR =
419         new Dop(Opcodes.IPUT_CHAR, Opcodes.IPUT_CHAR,
420             Opcodes.NO_NEXT, Form22c.THE_ONE, false);
421 
422     public static final Dop IPUT_SHORT =
423         new Dop(Opcodes.IPUT_SHORT, Opcodes.IPUT_SHORT,
424             Opcodes.NO_NEXT, Form22c.THE_ONE, false);
425 
426     public static final Dop SGET =
427         new Dop(Opcodes.SGET, Opcodes.SGET,
428             Opcodes.NO_NEXT, Form21c.THE_ONE, true);
429 
430     public static final Dop SGET_WIDE =
431         new Dop(Opcodes.SGET_WIDE, Opcodes.SGET_WIDE,
432             Opcodes.NO_NEXT, Form21c.THE_ONE, true);
433 
434     public static final Dop SGET_OBJECT =
435         new Dop(Opcodes.SGET_OBJECT, Opcodes.SGET_OBJECT,
436             Opcodes.NO_NEXT, Form21c.THE_ONE, true);
437 
438     public static final Dop SGET_BOOLEAN =
439         new Dop(Opcodes.SGET_BOOLEAN, Opcodes.SGET_BOOLEAN,
440             Opcodes.NO_NEXT, Form21c.THE_ONE, true);
441 
442     public static final Dop SGET_BYTE =
443         new Dop(Opcodes.SGET_BYTE, Opcodes.SGET_BYTE,
444             Opcodes.NO_NEXT, Form21c.THE_ONE, true);
445 
446     public static final Dop SGET_CHAR =
447         new Dop(Opcodes.SGET_CHAR, Opcodes.SGET_CHAR,
448             Opcodes.NO_NEXT, Form21c.THE_ONE, true);
449 
450     public static final Dop SGET_SHORT =
451         new Dop(Opcodes.SGET_SHORT, Opcodes.SGET_SHORT,
452             Opcodes.NO_NEXT, Form21c.THE_ONE, true);
453 
454     public static final Dop SPUT =
455         new Dop(Opcodes.SPUT, Opcodes.SPUT,
456             Opcodes.NO_NEXT, Form21c.THE_ONE, false);
457 
458     public static final Dop SPUT_WIDE =
459         new Dop(Opcodes.SPUT_WIDE, Opcodes.SPUT_WIDE,
460             Opcodes.NO_NEXT, Form21c.THE_ONE, false);
461 
462     public static final Dop SPUT_OBJECT =
463         new Dop(Opcodes.SPUT_OBJECT, Opcodes.SPUT_OBJECT,
464             Opcodes.NO_NEXT, Form21c.THE_ONE, false);
465 
466     public static final Dop SPUT_BOOLEAN =
467         new Dop(Opcodes.SPUT_BOOLEAN, Opcodes.SPUT_BOOLEAN,
468             Opcodes.NO_NEXT, Form21c.THE_ONE, false);
469 
470     public static final Dop SPUT_BYTE =
471         new Dop(Opcodes.SPUT_BYTE, Opcodes.SPUT_BYTE,
472             Opcodes.NO_NEXT, Form21c.THE_ONE, false);
473 
474     public static final Dop SPUT_CHAR =
475         new Dop(Opcodes.SPUT_CHAR, Opcodes.SPUT_CHAR,
476             Opcodes.NO_NEXT, Form21c.THE_ONE, false);
477 
478     public static final Dop SPUT_SHORT =
479         new Dop(Opcodes.SPUT_SHORT, Opcodes.SPUT_SHORT,
480             Opcodes.NO_NEXT, Form21c.THE_ONE, false);
481 
482     public static final Dop INVOKE_VIRTUAL =
483         new Dop(Opcodes.INVOKE_VIRTUAL, Opcodes.INVOKE_VIRTUAL,
484             Opcodes.INVOKE_VIRTUAL_RANGE, Form35c.THE_ONE, false);
485 
486     public static final Dop INVOKE_SUPER =
487         new Dop(Opcodes.INVOKE_SUPER, Opcodes.INVOKE_SUPER,
488             Opcodes.INVOKE_SUPER_RANGE, Form35c.THE_ONE, false);
489 
490     public static final Dop INVOKE_DIRECT =
491         new Dop(Opcodes.INVOKE_DIRECT, Opcodes.INVOKE_DIRECT,
492             Opcodes.INVOKE_DIRECT_RANGE, Form35c.THE_ONE, false);
493 
494     public static final Dop INVOKE_STATIC =
495         new Dop(Opcodes.INVOKE_STATIC, Opcodes.INVOKE_STATIC,
496             Opcodes.INVOKE_STATIC_RANGE, Form35c.THE_ONE, false);
497 
498     public static final Dop INVOKE_INTERFACE =
499         new Dop(Opcodes.INVOKE_INTERFACE, Opcodes.INVOKE_INTERFACE,
500             Opcodes.INVOKE_INTERFACE_RANGE, Form35c.THE_ONE, false);
501 
502     public static final Dop INVOKE_VIRTUAL_RANGE =
503         new Dop(Opcodes.INVOKE_VIRTUAL_RANGE, Opcodes.INVOKE_VIRTUAL,
504             Opcodes.NO_NEXT, Form3rc.THE_ONE, false);
505 
506     public static final Dop INVOKE_SUPER_RANGE =
507         new Dop(Opcodes.INVOKE_SUPER_RANGE, Opcodes.INVOKE_SUPER,
508             Opcodes.NO_NEXT, Form3rc.THE_ONE, false);
509 
510     public static final Dop INVOKE_DIRECT_RANGE =
511         new Dop(Opcodes.INVOKE_DIRECT_RANGE, Opcodes.INVOKE_DIRECT,
512             Opcodes.NO_NEXT, Form3rc.THE_ONE, false);
513 
514     public static final Dop INVOKE_STATIC_RANGE =
515         new Dop(Opcodes.INVOKE_STATIC_RANGE, Opcodes.INVOKE_STATIC,
516             Opcodes.NO_NEXT, Form3rc.THE_ONE, false);
517 
518     public static final Dop INVOKE_INTERFACE_RANGE =
519         new Dop(Opcodes.INVOKE_INTERFACE_RANGE, Opcodes.INVOKE_INTERFACE,
520             Opcodes.NO_NEXT, Form3rc.THE_ONE, false);
521 
522     public static final Dop NEG_INT =
523         new Dop(Opcodes.NEG_INT, Opcodes.NEG_INT,
524             Opcodes.NO_NEXT, Form12x.THE_ONE, true);
525 
526     public static final Dop NOT_INT =
527         new Dop(Opcodes.NOT_INT, Opcodes.NOT_INT,
528             Opcodes.NO_NEXT, Form12x.THE_ONE, true);
529 
530     public static final Dop NEG_LONG =
531         new Dop(Opcodes.NEG_LONG, Opcodes.NEG_LONG,
532             Opcodes.NO_NEXT, Form12x.THE_ONE, true);
533 
534     public static final Dop NOT_LONG =
535         new Dop(Opcodes.NOT_LONG, Opcodes.NOT_LONG,
536             Opcodes.NO_NEXT, Form12x.THE_ONE, true);
537 
538     public static final Dop NEG_FLOAT =
539         new Dop(Opcodes.NEG_FLOAT, Opcodes.NEG_FLOAT,
540             Opcodes.NO_NEXT, Form12x.THE_ONE, true);
541 
542     public static final Dop NEG_DOUBLE =
543         new Dop(Opcodes.NEG_DOUBLE, Opcodes.NEG_DOUBLE,
544             Opcodes.NO_NEXT, Form12x.THE_ONE, true);
545 
546     public static final Dop INT_TO_LONG =
547         new Dop(Opcodes.INT_TO_LONG, Opcodes.INT_TO_LONG,
548             Opcodes.NO_NEXT, Form12x.THE_ONE, true);
549 
550     public static final Dop INT_TO_FLOAT =
551         new Dop(Opcodes.INT_TO_FLOAT, Opcodes.INT_TO_FLOAT,
552             Opcodes.NO_NEXT, Form12x.THE_ONE, true);
553 
554     public static final Dop INT_TO_DOUBLE =
555         new Dop(Opcodes.INT_TO_DOUBLE, Opcodes.INT_TO_DOUBLE,
556             Opcodes.NO_NEXT, Form12x.THE_ONE, true);
557 
558     public static final Dop LONG_TO_INT =
559         new Dop(Opcodes.LONG_TO_INT, Opcodes.LONG_TO_INT,
560             Opcodes.NO_NEXT, Form12x.THE_ONE, true);
561 
562     public static final Dop LONG_TO_FLOAT =
563         new Dop(Opcodes.LONG_TO_FLOAT, Opcodes.LONG_TO_FLOAT,
564             Opcodes.NO_NEXT, Form12x.THE_ONE, true);
565 
566     public static final Dop LONG_TO_DOUBLE =
567         new Dop(Opcodes.LONG_TO_DOUBLE, Opcodes.LONG_TO_DOUBLE,
568             Opcodes.NO_NEXT, Form12x.THE_ONE, true);
569 
570     public static final Dop FLOAT_TO_INT =
571         new Dop(Opcodes.FLOAT_TO_INT, Opcodes.FLOAT_TO_INT,
572             Opcodes.NO_NEXT, Form12x.THE_ONE, true);
573 
574     public static final Dop FLOAT_TO_LONG =
575         new Dop(Opcodes.FLOAT_TO_LONG, Opcodes.FLOAT_TO_LONG,
576             Opcodes.NO_NEXT, Form12x.THE_ONE, true);
577 
578     public static final Dop FLOAT_TO_DOUBLE =
579         new Dop(Opcodes.FLOAT_TO_DOUBLE, Opcodes.FLOAT_TO_DOUBLE,
580             Opcodes.NO_NEXT, Form12x.THE_ONE, true);
581 
582     public static final Dop DOUBLE_TO_INT =
583         new Dop(Opcodes.DOUBLE_TO_INT, Opcodes.DOUBLE_TO_INT,
584             Opcodes.NO_NEXT, Form12x.THE_ONE, true);
585 
586     public static final Dop DOUBLE_TO_LONG =
587         new Dop(Opcodes.DOUBLE_TO_LONG, Opcodes.DOUBLE_TO_LONG,
588             Opcodes.NO_NEXT, Form12x.THE_ONE, true);
589 
590     public static final Dop DOUBLE_TO_FLOAT =
591         new Dop(Opcodes.DOUBLE_TO_FLOAT, Opcodes.DOUBLE_TO_FLOAT,
592             Opcodes.NO_NEXT, Form12x.THE_ONE, true);
593 
594     public static final Dop INT_TO_BYTE =
595         new Dop(Opcodes.INT_TO_BYTE, Opcodes.INT_TO_BYTE,
596             Opcodes.NO_NEXT, Form12x.THE_ONE, true);
597 
598     public static final Dop INT_TO_CHAR =
599         new Dop(Opcodes.INT_TO_CHAR, Opcodes.INT_TO_CHAR,
600             Opcodes.NO_NEXT, Form12x.THE_ONE, true);
601 
602     public static final Dop INT_TO_SHORT =
603         new Dop(Opcodes.INT_TO_SHORT, Opcodes.INT_TO_SHORT,
604             Opcodes.NO_NEXT, Form12x.THE_ONE, true);
605 
606     public static final Dop ADD_INT =
607         new Dop(Opcodes.ADD_INT, Opcodes.ADD_INT,
608             Opcodes.NO_NEXT, Form23x.THE_ONE, true);
609 
610     public static final Dop SUB_INT =
611         new Dop(Opcodes.SUB_INT, Opcodes.SUB_INT,
612             Opcodes.NO_NEXT, Form23x.THE_ONE, true);
613 
614     public static final Dop MUL_INT =
615         new Dop(Opcodes.MUL_INT, Opcodes.MUL_INT,
616             Opcodes.NO_NEXT, Form23x.THE_ONE, true);
617 
618     public static final Dop DIV_INT =
619         new Dop(Opcodes.DIV_INT, Opcodes.DIV_INT,
620             Opcodes.NO_NEXT, Form23x.THE_ONE, true);
621 
622     public static final Dop REM_INT =
623         new Dop(Opcodes.REM_INT, Opcodes.REM_INT,
624             Opcodes.NO_NEXT, Form23x.THE_ONE, true);
625 
626     public static final Dop AND_INT =
627         new Dop(Opcodes.AND_INT, Opcodes.AND_INT,
628             Opcodes.NO_NEXT, Form23x.THE_ONE, true);
629 
630     public static final Dop OR_INT =
631         new Dop(Opcodes.OR_INT, Opcodes.OR_INT,
632             Opcodes.NO_NEXT, Form23x.THE_ONE, true);
633 
634     public static final Dop XOR_INT =
635         new Dop(Opcodes.XOR_INT, Opcodes.XOR_INT,
636             Opcodes.NO_NEXT, Form23x.THE_ONE, true);
637 
638     public static final Dop SHL_INT =
639         new Dop(Opcodes.SHL_INT, Opcodes.SHL_INT,
640             Opcodes.NO_NEXT, Form23x.THE_ONE, true);
641 
642     public static final Dop SHR_INT =
643         new Dop(Opcodes.SHR_INT, Opcodes.SHR_INT,
644             Opcodes.NO_NEXT, Form23x.THE_ONE, true);
645 
646     public static final Dop USHR_INT =
647         new Dop(Opcodes.USHR_INT, Opcodes.USHR_INT,
648             Opcodes.NO_NEXT, Form23x.THE_ONE, true);
649 
650     public static final Dop ADD_LONG =
651         new Dop(Opcodes.ADD_LONG, Opcodes.ADD_LONG,
652             Opcodes.NO_NEXT, Form23x.THE_ONE, true);
653 
654     public static final Dop SUB_LONG =
655         new Dop(Opcodes.SUB_LONG, Opcodes.SUB_LONG,
656             Opcodes.NO_NEXT, Form23x.THE_ONE, true);
657 
658     public static final Dop MUL_LONG =
659         new Dop(Opcodes.MUL_LONG, Opcodes.MUL_LONG,
660             Opcodes.NO_NEXT, Form23x.THE_ONE, true);
661 
662     public static final Dop DIV_LONG =
663         new Dop(Opcodes.DIV_LONG, Opcodes.DIV_LONG,
664             Opcodes.NO_NEXT, Form23x.THE_ONE, true);
665 
666     public static final Dop REM_LONG =
667         new Dop(Opcodes.REM_LONG, Opcodes.REM_LONG,
668             Opcodes.NO_NEXT, Form23x.THE_ONE, true);
669 
670     public static final Dop AND_LONG =
671         new Dop(Opcodes.AND_LONG, Opcodes.AND_LONG,
672             Opcodes.NO_NEXT, Form23x.THE_ONE, true);
673 
674     public static final Dop OR_LONG =
675         new Dop(Opcodes.OR_LONG, Opcodes.OR_LONG,
676             Opcodes.NO_NEXT, Form23x.THE_ONE, true);
677 
678     public static final Dop XOR_LONG =
679         new Dop(Opcodes.XOR_LONG, Opcodes.XOR_LONG,
680             Opcodes.NO_NEXT, Form23x.THE_ONE, true);
681 
682     public static final Dop SHL_LONG =
683         new Dop(Opcodes.SHL_LONG, Opcodes.SHL_LONG,
684             Opcodes.NO_NEXT, Form23x.THE_ONE, true);
685 
686     public static final Dop SHR_LONG =
687         new Dop(Opcodes.SHR_LONG, Opcodes.SHR_LONG,
688             Opcodes.NO_NEXT, Form23x.THE_ONE, true);
689 
690     public static final Dop USHR_LONG =
691         new Dop(Opcodes.USHR_LONG, Opcodes.USHR_LONG,
692             Opcodes.NO_NEXT, Form23x.THE_ONE, true);
693 
694     public static final Dop ADD_FLOAT =
695         new Dop(Opcodes.ADD_FLOAT, Opcodes.ADD_FLOAT,
696             Opcodes.NO_NEXT, Form23x.THE_ONE, true);
697 
698     public static final Dop SUB_FLOAT =
699         new Dop(Opcodes.SUB_FLOAT, Opcodes.SUB_FLOAT,
700             Opcodes.NO_NEXT, Form23x.THE_ONE, true);
701 
702     public static final Dop MUL_FLOAT =
703         new Dop(Opcodes.MUL_FLOAT, Opcodes.MUL_FLOAT,
704             Opcodes.NO_NEXT, Form23x.THE_ONE, true);
705 
706     public static final Dop DIV_FLOAT =
707         new Dop(Opcodes.DIV_FLOAT, Opcodes.DIV_FLOAT,
708             Opcodes.NO_NEXT, Form23x.THE_ONE, true);
709 
710     public static final Dop REM_FLOAT =
711         new Dop(Opcodes.REM_FLOAT, Opcodes.REM_FLOAT,
712             Opcodes.NO_NEXT, Form23x.THE_ONE, true);
713 
714     public static final Dop ADD_DOUBLE =
715         new Dop(Opcodes.ADD_DOUBLE, Opcodes.ADD_DOUBLE,
716             Opcodes.NO_NEXT, Form23x.THE_ONE, true);
717 
718     public static final Dop SUB_DOUBLE =
719         new Dop(Opcodes.SUB_DOUBLE, Opcodes.SUB_DOUBLE,
720             Opcodes.NO_NEXT, Form23x.THE_ONE, true);
721 
722     public static final Dop MUL_DOUBLE =
723         new Dop(Opcodes.MUL_DOUBLE, Opcodes.MUL_DOUBLE,
724             Opcodes.NO_NEXT, Form23x.THE_ONE, true);
725 
726     public static final Dop DIV_DOUBLE =
727         new Dop(Opcodes.DIV_DOUBLE, Opcodes.DIV_DOUBLE,
728             Opcodes.NO_NEXT, Form23x.THE_ONE, true);
729 
730     public static final Dop REM_DOUBLE =
731         new Dop(Opcodes.REM_DOUBLE, Opcodes.REM_DOUBLE,
732             Opcodes.NO_NEXT, Form23x.THE_ONE, true);
733 
734     public static final Dop ADD_INT_2ADDR =
735         new Dop(Opcodes.ADD_INT_2ADDR, Opcodes.ADD_INT,
736             Opcodes.ADD_INT, Form12x.THE_ONE, true);
737 
738     public static final Dop SUB_INT_2ADDR =
739         new Dop(Opcodes.SUB_INT_2ADDR, Opcodes.SUB_INT,
740             Opcodes.SUB_INT, Form12x.THE_ONE, true);
741 
742     public static final Dop MUL_INT_2ADDR =
743         new Dop(Opcodes.MUL_INT_2ADDR, Opcodes.MUL_INT,
744             Opcodes.MUL_INT, Form12x.THE_ONE, true);
745 
746     public static final Dop DIV_INT_2ADDR =
747         new Dop(Opcodes.DIV_INT_2ADDR, Opcodes.DIV_INT,
748             Opcodes.DIV_INT, Form12x.THE_ONE, true);
749 
750     public static final Dop REM_INT_2ADDR =
751         new Dop(Opcodes.REM_INT_2ADDR, Opcodes.REM_INT,
752             Opcodes.REM_INT, Form12x.THE_ONE, true);
753 
754     public static final Dop AND_INT_2ADDR =
755         new Dop(Opcodes.AND_INT_2ADDR, Opcodes.AND_INT,
756             Opcodes.AND_INT, Form12x.THE_ONE, true);
757 
758     public static final Dop OR_INT_2ADDR =
759         new Dop(Opcodes.OR_INT_2ADDR, Opcodes.OR_INT,
760             Opcodes.OR_INT, Form12x.THE_ONE, true);
761 
762     public static final Dop XOR_INT_2ADDR =
763         new Dop(Opcodes.XOR_INT_2ADDR, Opcodes.XOR_INT,
764             Opcodes.XOR_INT, Form12x.THE_ONE, true);
765 
766     public static final Dop SHL_INT_2ADDR =
767         new Dop(Opcodes.SHL_INT_2ADDR, Opcodes.SHL_INT,
768             Opcodes.SHL_INT, Form12x.THE_ONE, true);
769 
770     public static final Dop SHR_INT_2ADDR =
771         new Dop(Opcodes.SHR_INT_2ADDR, Opcodes.SHR_INT,
772             Opcodes.SHR_INT, Form12x.THE_ONE, true);
773 
774     public static final Dop USHR_INT_2ADDR =
775         new Dop(Opcodes.USHR_INT_2ADDR, Opcodes.USHR_INT,
776             Opcodes.USHR_INT, Form12x.THE_ONE, true);
777 
778     public static final Dop ADD_LONG_2ADDR =
779         new Dop(Opcodes.ADD_LONG_2ADDR, Opcodes.ADD_LONG,
780             Opcodes.ADD_LONG, Form12x.THE_ONE, true);
781 
782     public static final Dop SUB_LONG_2ADDR =
783         new Dop(Opcodes.SUB_LONG_2ADDR, Opcodes.SUB_LONG,
784             Opcodes.SUB_LONG, Form12x.THE_ONE, true);
785 
786     public static final Dop MUL_LONG_2ADDR =
787         new Dop(Opcodes.MUL_LONG_2ADDR, Opcodes.MUL_LONG,
788             Opcodes.MUL_LONG, Form12x.THE_ONE, true);
789 
790     public static final Dop DIV_LONG_2ADDR =
791         new Dop(Opcodes.DIV_LONG_2ADDR, Opcodes.DIV_LONG,
792             Opcodes.DIV_LONG, Form12x.THE_ONE, true);
793 
794     public static final Dop REM_LONG_2ADDR =
795         new Dop(Opcodes.REM_LONG_2ADDR, Opcodes.REM_LONG,
796             Opcodes.REM_LONG, Form12x.THE_ONE, true);
797 
798     public static final Dop AND_LONG_2ADDR =
799         new Dop(Opcodes.AND_LONG_2ADDR, Opcodes.AND_LONG,
800             Opcodes.AND_LONG, Form12x.THE_ONE, true);
801 
802     public static final Dop OR_LONG_2ADDR =
803         new Dop(Opcodes.OR_LONG_2ADDR, Opcodes.OR_LONG,
804             Opcodes.OR_LONG, Form12x.THE_ONE, true);
805 
806     public static final Dop XOR_LONG_2ADDR =
807         new Dop(Opcodes.XOR_LONG_2ADDR, Opcodes.XOR_LONG,
808             Opcodes.XOR_LONG, Form12x.THE_ONE, true);
809 
810     public static final Dop SHL_LONG_2ADDR =
811         new Dop(Opcodes.SHL_LONG_2ADDR, Opcodes.SHL_LONG,
812             Opcodes.SHL_LONG, Form12x.THE_ONE, true);
813 
814     public static final Dop SHR_LONG_2ADDR =
815         new Dop(Opcodes.SHR_LONG_2ADDR, Opcodes.SHR_LONG,
816             Opcodes.SHR_LONG, Form12x.THE_ONE, true);
817 
818     public static final Dop USHR_LONG_2ADDR =
819         new Dop(Opcodes.USHR_LONG_2ADDR, Opcodes.USHR_LONG,
820             Opcodes.USHR_LONG, Form12x.THE_ONE, true);
821 
822     public static final Dop ADD_FLOAT_2ADDR =
823         new Dop(Opcodes.ADD_FLOAT_2ADDR, Opcodes.ADD_FLOAT,
824             Opcodes.ADD_FLOAT, Form12x.THE_ONE, true);
825 
826     public static final Dop SUB_FLOAT_2ADDR =
827         new Dop(Opcodes.SUB_FLOAT_2ADDR, Opcodes.SUB_FLOAT,
828             Opcodes.SUB_FLOAT, Form12x.THE_ONE, true);
829 
830     public static final Dop MUL_FLOAT_2ADDR =
831         new Dop(Opcodes.MUL_FLOAT_2ADDR, Opcodes.MUL_FLOAT,
832             Opcodes.MUL_FLOAT, Form12x.THE_ONE, true);
833 
834     public static final Dop DIV_FLOAT_2ADDR =
835         new Dop(Opcodes.DIV_FLOAT_2ADDR, Opcodes.DIV_FLOAT,
836             Opcodes.DIV_FLOAT, Form12x.THE_ONE, true);
837 
838     public static final Dop REM_FLOAT_2ADDR =
839         new Dop(Opcodes.REM_FLOAT_2ADDR, Opcodes.REM_FLOAT,
840             Opcodes.REM_FLOAT, Form12x.THE_ONE, true);
841 
842     public static final Dop ADD_DOUBLE_2ADDR =
843         new Dop(Opcodes.ADD_DOUBLE_2ADDR, Opcodes.ADD_DOUBLE,
844             Opcodes.ADD_DOUBLE, Form12x.THE_ONE, true);
845 
846     public static final Dop SUB_DOUBLE_2ADDR =
847         new Dop(Opcodes.SUB_DOUBLE_2ADDR, Opcodes.SUB_DOUBLE,
848             Opcodes.SUB_DOUBLE, Form12x.THE_ONE, true);
849 
850     public static final Dop MUL_DOUBLE_2ADDR =
851         new Dop(Opcodes.MUL_DOUBLE_2ADDR, Opcodes.MUL_DOUBLE,
852             Opcodes.MUL_DOUBLE, Form12x.THE_ONE, true);
853 
854     public static final Dop DIV_DOUBLE_2ADDR =
855         new Dop(Opcodes.DIV_DOUBLE_2ADDR, Opcodes.DIV_DOUBLE,
856             Opcodes.DIV_DOUBLE, Form12x.THE_ONE, true);
857 
858     public static final Dop REM_DOUBLE_2ADDR =
859         new Dop(Opcodes.REM_DOUBLE_2ADDR, Opcodes.REM_DOUBLE,
860             Opcodes.REM_DOUBLE, Form12x.THE_ONE, true);
861 
862     public static final Dop ADD_INT_LIT16 =
863         new Dop(Opcodes.ADD_INT_LIT16, Opcodes.ADD_INT,
864             Opcodes.NO_NEXT, Form22s.THE_ONE, true);
865 
866     public static final Dop RSUB_INT =
867         new Dop(Opcodes.RSUB_INT, Opcodes.RSUB_INT,
868             Opcodes.NO_NEXT, Form22s.THE_ONE, true);
869 
870     public static final Dop MUL_INT_LIT16 =
871         new Dop(Opcodes.MUL_INT_LIT16, Opcodes.MUL_INT,
872             Opcodes.NO_NEXT, Form22s.THE_ONE, true);
873 
874     public static final Dop DIV_INT_LIT16 =
875         new Dop(Opcodes.DIV_INT_LIT16, Opcodes.DIV_INT,
876             Opcodes.NO_NEXT, Form22s.THE_ONE, true);
877 
878     public static final Dop REM_INT_LIT16 =
879         new Dop(Opcodes.REM_INT_LIT16, Opcodes.REM_INT,
880             Opcodes.NO_NEXT, Form22s.THE_ONE, true);
881 
882     public static final Dop AND_INT_LIT16 =
883         new Dop(Opcodes.AND_INT_LIT16, Opcodes.AND_INT,
884             Opcodes.NO_NEXT, Form22s.THE_ONE, true);
885 
886     public static final Dop OR_INT_LIT16 =
887         new Dop(Opcodes.OR_INT_LIT16, Opcodes.OR_INT,
888             Opcodes.NO_NEXT, Form22s.THE_ONE, true);
889 
890     public static final Dop XOR_INT_LIT16 =
891         new Dop(Opcodes.XOR_INT_LIT16, Opcodes.XOR_INT,
892             Opcodes.NO_NEXT, Form22s.THE_ONE, true);
893 
894     public static final Dop ADD_INT_LIT8 =
895         new Dop(Opcodes.ADD_INT_LIT8, Opcodes.ADD_INT,
896             Opcodes.ADD_INT_LIT16, Form22b.THE_ONE, true);
897 
898     public static final Dop RSUB_INT_LIT8 =
899         new Dop(Opcodes.RSUB_INT_LIT8, Opcodes.RSUB_INT,
900             Opcodes.RSUB_INT, Form22b.THE_ONE, true);
901 
902     public static final Dop MUL_INT_LIT8 =
903         new Dop(Opcodes.MUL_INT_LIT8, Opcodes.MUL_INT,
904             Opcodes.MUL_INT_LIT16, Form22b.THE_ONE, true);
905 
906     public static final Dop DIV_INT_LIT8 =
907         new Dop(Opcodes.DIV_INT_LIT8, Opcodes.DIV_INT,
908             Opcodes.DIV_INT_LIT16, Form22b.THE_ONE, true);
909 
910     public static final Dop REM_INT_LIT8 =
911         new Dop(Opcodes.REM_INT_LIT8, Opcodes.REM_INT,
912             Opcodes.REM_INT_LIT16, Form22b.THE_ONE, true);
913 
914     public static final Dop AND_INT_LIT8 =
915         new Dop(Opcodes.AND_INT_LIT8, Opcodes.AND_INT,
916             Opcodes.AND_INT_LIT16, Form22b.THE_ONE, true);
917 
918     public static final Dop OR_INT_LIT8 =
919         new Dop(Opcodes.OR_INT_LIT8, Opcodes.OR_INT,
920             Opcodes.OR_INT_LIT16, Form22b.THE_ONE, true);
921 
922     public static final Dop XOR_INT_LIT8 =
923         new Dop(Opcodes.XOR_INT_LIT8, Opcodes.XOR_INT,
924             Opcodes.XOR_INT_LIT16, Form22b.THE_ONE, true);
925 
926     public static final Dop SHL_INT_LIT8 =
927         new Dop(Opcodes.SHL_INT_LIT8, Opcodes.SHL_INT,
928             Opcodes.NO_NEXT, Form22b.THE_ONE, true);
929 
930     public static final Dop SHR_INT_LIT8 =
931         new Dop(Opcodes.SHR_INT_LIT8, Opcodes.SHR_INT,
932             Opcodes.NO_NEXT, Form22b.THE_ONE, true);
933 
934     public static final Dop USHR_INT_LIT8 =
935         new Dop(Opcodes.USHR_INT_LIT8, Opcodes.USHR_INT,
936             Opcodes.NO_NEXT, Form22b.THE_ONE, true);
937 
938     // END(dops)
939 
940     // Static initialization.
941     static {
942         DOPS = new Dop[Opcodes.MAX_VALUE - Opcodes.MIN_VALUE + 1];
943 
944         set(SPECIAL_FORMAT);
945 
946         // BEGIN(dops-init); GENERATED AUTOMATICALLY BY opcode-gen
947         set(NOP);
948         set(MOVE);
949         set(MOVE_FROM16);
950         set(MOVE_16);
951         set(MOVE_WIDE);
952         set(MOVE_WIDE_FROM16);
953         set(MOVE_WIDE_16);
954         set(MOVE_OBJECT);
955         set(MOVE_OBJECT_FROM16);
956         set(MOVE_OBJECT_16);
957         set(MOVE_RESULT);
958         set(MOVE_RESULT_WIDE);
959         set(MOVE_RESULT_OBJECT);
960         set(MOVE_EXCEPTION);
961         set(RETURN_VOID);
962         set(RETURN);
963         set(RETURN_WIDE);
964         set(RETURN_OBJECT);
965         set(CONST_4);
966         set(CONST_16);
967         set(CONST);
968         set(CONST_HIGH16);
969         set(CONST_WIDE_16);
970         set(CONST_WIDE_32);
971         set(CONST_WIDE);
972         set(CONST_WIDE_HIGH16);
973         set(CONST_STRING);
974         set(CONST_STRING_JUMBO);
975         set(CONST_CLASS);
976         set(MONITOR_ENTER);
977         set(MONITOR_EXIT);
978         set(CHECK_CAST);
979         set(INSTANCE_OF);
980         set(ARRAY_LENGTH);
981         set(NEW_INSTANCE);
982         set(NEW_ARRAY);
983         set(FILLED_NEW_ARRAY);
984         set(FILLED_NEW_ARRAY_RANGE);
985         set(FILL_ARRAY_DATA);
986         set(THROW);
987         set(GOTO);
988         set(GOTO_16);
989         set(GOTO_32);
990         set(PACKED_SWITCH);
991         set(SPARSE_SWITCH);
992         set(CMPL_FLOAT);
993         set(CMPG_FLOAT);
994         set(CMPL_DOUBLE);
995         set(CMPG_DOUBLE);
996         set(CMP_LONG);
997         set(IF_EQ);
998         set(IF_NE);
999         set(IF_LT);
1000         set(IF_GE);
1001         set(IF_GT);
1002         set(IF_LE);
1003         set(IF_EQZ);
1004         set(IF_NEZ);
1005         set(IF_LTZ);
1006         set(IF_GEZ);
1007         set(IF_GTZ);
1008         set(IF_LEZ);
1009         set(AGET);
1010         set(AGET_WIDE);
1011         set(AGET_OBJECT);
1012         set(AGET_BOOLEAN);
1013         set(AGET_BYTE);
1014         set(AGET_CHAR);
1015         set(AGET_SHORT);
1016         set(APUT);
1017         set(APUT_WIDE);
1018         set(APUT_OBJECT);
1019         set(APUT_BOOLEAN);
1020         set(APUT_BYTE);
1021         set(APUT_CHAR);
1022         set(APUT_SHORT);
1023         set(IGET);
1024         set(IGET_WIDE);
1025         set(IGET_OBJECT);
1026         set(IGET_BOOLEAN);
1027         set(IGET_BYTE);
1028         set(IGET_CHAR);
1029         set(IGET_SHORT);
1030         set(IPUT);
1031         set(IPUT_WIDE);
1032         set(IPUT_OBJECT);
1033         set(IPUT_BOOLEAN);
1034         set(IPUT_BYTE);
1035         set(IPUT_CHAR);
1036         set(IPUT_SHORT);
1037         set(SGET);
1038         set(SGET_WIDE);
1039         set(SGET_OBJECT);
1040         set(SGET_BOOLEAN);
1041         set(SGET_BYTE);
1042         set(SGET_CHAR);
1043         set(SGET_SHORT);
1044         set(SPUT);
1045         set(SPUT_WIDE);
1046         set(SPUT_OBJECT);
1047         set(SPUT_BOOLEAN);
1048         set(SPUT_BYTE);
1049         set(SPUT_CHAR);
1050         set(SPUT_SHORT);
1051         set(INVOKE_VIRTUAL);
1052         set(INVOKE_SUPER);
1053         set(INVOKE_DIRECT);
1054         set(INVOKE_STATIC);
1055         set(INVOKE_INTERFACE);
1056         set(INVOKE_VIRTUAL_RANGE);
1057         set(INVOKE_SUPER_RANGE);
1058         set(INVOKE_DIRECT_RANGE);
1059         set(INVOKE_STATIC_RANGE);
1060         set(INVOKE_INTERFACE_RANGE);
1061         set(NEG_INT);
1062         set(NOT_INT);
1063         set(NEG_LONG);
1064         set(NOT_LONG);
1065         set(NEG_FLOAT);
1066         set(NEG_DOUBLE);
1067         set(INT_TO_LONG);
1068         set(INT_TO_FLOAT);
1069         set(INT_TO_DOUBLE);
1070         set(LONG_TO_INT);
1071         set(LONG_TO_FLOAT);
1072         set(LONG_TO_DOUBLE);
1073         set(FLOAT_TO_INT);
1074         set(FLOAT_TO_LONG);
1075         set(FLOAT_TO_DOUBLE);
1076         set(DOUBLE_TO_INT);
1077         set(DOUBLE_TO_LONG);
1078         set(DOUBLE_TO_FLOAT);
1079         set(INT_TO_BYTE);
1080         set(INT_TO_CHAR);
1081         set(INT_TO_SHORT);
1082         set(ADD_INT);
1083         set(SUB_INT);
1084         set(MUL_INT);
1085         set(DIV_INT);
1086         set(REM_INT);
1087         set(AND_INT);
1088         set(OR_INT);
1089         set(XOR_INT);
1090         set(SHL_INT);
1091         set(SHR_INT);
1092         set(USHR_INT);
1093         set(ADD_LONG);
1094         set(SUB_LONG);
1095         set(MUL_LONG);
1096         set(DIV_LONG);
1097         set(REM_LONG);
1098         set(AND_LONG);
1099         set(OR_LONG);
1100         set(XOR_LONG);
1101         set(SHL_LONG);
1102         set(SHR_LONG);
1103         set(USHR_LONG);
1104         set(ADD_FLOAT);
1105         set(SUB_FLOAT);
1106         set(MUL_FLOAT);
1107         set(DIV_FLOAT);
1108         set(REM_FLOAT);
1109         set(ADD_DOUBLE);
1110         set(SUB_DOUBLE);
1111         set(MUL_DOUBLE);
1112         set(DIV_DOUBLE);
1113         set(REM_DOUBLE);
1114         set(ADD_INT_2ADDR);
1115         set(SUB_INT_2ADDR);
1116         set(MUL_INT_2ADDR);
1117         set(DIV_INT_2ADDR);
1118         set(REM_INT_2ADDR);
1119         set(AND_INT_2ADDR);
1120         set(OR_INT_2ADDR);
1121         set(XOR_INT_2ADDR);
1122         set(SHL_INT_2ADDR);
1123         set(SHR_INT_2ADDR);
1124         set(USHR_INT_2ADDR);
1125         set(ADD_LONG_2ADDR);
1126         set(SUB_LONG_2ADDR);
1127         set(MUL_LONG_2ADDR);
1128         set(DIV_LONG_2ADDR);
1129         set(REM_LONG_2ADDR);
1130         set(AND_LONG_2ADDR);
1131         set(OR_LONG_2ADDR);
1132         set(XOR_LONG_2ADDR);
1133         set(SHL_LONG_2ADDR);
1134         set(SHR_LONG_2ADDR);
1135         set(USHR_LONG_2ADDR);
1136         set(ADD_FLOAT_2ADDR);
1137         set(SUB_FLOAT_2ADDR);
1138         set(MUL_FLOAT_2ADDR);
1139         set(DIV_FLOAT_2ADDR);
1140         set(REM_FLOAT_2ADDR);
1141         set(ADD_DOUBLE_2ADDR);
1142         set(SUB_DOUBLE_2ADDR);
1143         set(MUL_DOUBLE_2ADDR);
1144         set(DIV_DOUBLE_2ADDR);
1145         set(REM_DOUBLE_2ADDR);
1146         set(ADD_INT_LIT16);
1147         set(RSUB_INT);
1148         set(MUL_INT_LIT16);
1149         set(DIV_INT_LIT16);
1150         set(REM_INT_LIT16);
1151         set(AND_INT_LIT16);
1152         set(OR_INT_LIT16);
1153         set(XOR_INT_LIT16);
1154         set(ADD_INT_LIT8);
1155         set(RSUB_INT_LIT8);
1156         set(MUL_INT_LIT8);
1157         set(DIV_INT_LIT8);
1158         set(REM_INT_LIT8);
1159         set(AND_INT_LIT8);
1160         set(OR_INT_LIT8);
1161         set(XOR_INT_LIT8);
1162         set(SHL_INT_LIT8);
1163         set(SHR_INT_LIT8);
1164         set(USHR_INT_LIT8);
1165         // END(dops-init)
1166     }
1167 
1168     /**
1169      * This class is uninstantiable.
1170      */
Dops()1171     private Dops() {
1172         // This space intentionally left blank.
1173     }
1174 
1175     /**
1176      * Gets the {@link Dop} for the given opcode value.
1177      *
1178      * @param opcode {@code Opcodes.MIN_VALUE..Opcodes.MAX_VALUE;} the
1179      * opcode value
1180      * @return {@code non-null;} the associated opcode instance
1181      */
get(int opcode)1182     public static Dop get(int opcode) {
1183         int idx = opcode - Opcodes.MIN_VALUE;
1184 
1185         try {
1186             Dop result = DOPS[idx];
1187             if (result != null) {
1188                 return result;
1189             }
1190         } catch (ArrayIndexOutOfBoundsException ex) {
1191             // Fall through.
1192         }
1193 
1194         throw new IllegalArgumentException("bogus opcode");
1195     }
1196 
1197     /**
1198      * Gets the next {@link Dop} in the instruction fitting chain after the
1199      * given instance, if any.
1200      *
1201      * @param opcode {@code non-null;} the opcode
1202      * @param options {@code non-null;} options, used to determine
1203      * which opcodes are potentially off-limits
1204      * @return {@code null-ok;} the next opcode in the same family, in the
1205      * chain of opcodes to try, or {@code null} if the given opcode is
1206      * the last in its chain
1207      */
getNextOrNull(Dop opcode, DexOptions options)1208     public static Dop getNextOrNull(Dop opcode, DexOptions options) {
1209       int nextOpcode = opcode.getNextOpcode();
1210 
1211       if (nextOpcode == Opcodes.NO_NEXT) {
1212         return null;
1213       }
1214 
1215       opcode = get(nextOpcode);
1216 
1217       return opcode;
1218     }
1219 
1220     /**
1221      * Puts the given opcode into the table of all ops.
1222      *
1223      * @param opcode {@code non-null;} the opcode
1224      */
set(Dop opcode)1225     private static void set(Dop opcode) {
1226         int idx = opcode.getOpcode() - Opcodes.MIN_VALUE;
1227         DOPS[idx] = opcode;
1228     }
1229 }
1230