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
17package com.android.dx.dex.code;
18
19import com.android.dx.dex.DexOptions;
20import com.android.dx.dex.code.form.Form10t;
21import com.android.dx.dex.code.form.Form10x;
22import com.android.dx.dex.code.form.Form11n;
23import com.android.dx.dex.code.form.Form11x;
24import com.android.dx.dex.code.form.Form12x;
25import com.android.dx.dex.code.form.Form20t;
26import com.android.dx.dex.code.form.Form21c;
27import com.android.dx.dex.code.form.Form21h;
28import com.android.dx.dex.code.form.Form21s;
29import com.android.dx.dex.code.form.Form21t;
30import com.android.dx.dex.code.form.Form22b;
31import com.android.dx.dex.code.form.Form22c;
32import com.android.dx.dex.code.form.Form22s;
33import com.android.dx.dex.code.form.Form22t;
34import com.android.dx.dex.code.form.Form22x;
35import com.android.dx.dex.code.form.Form23x;
36import com.android.dx.dex.code.form.Form30t;
37import com.android.dx.dex.code.form.Form31c;
38import com.android.dx.dex.code.form.Form31i;
39import com.android.dx.dex.code.form.Form31t;
40import com.android.dx.dex.code.form.Form32x;
41import com.android.dx.dex.code.form.Form35c;
42import com.android.dx.dex.code.form.Form3rc;
43import com.android.dx.dex.code.form.Form51l;
44import com.android.dx.dex.code.form.SpecialFormat;
45import com.android.dx.io.Opcodes;
46
47/**
48 * Standard instances of {@link Dop} and utility methods for getting
49 * them.
50 */
51public 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     */
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     */
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     */
1208    public static Dop getNextOrNull(Dop opcode, DexOptions options) {
1209        boolean suppressExtendedOpcodes = !options.canUseExtendedOpcodes();
1210
1211        for (;;) {
1212            int nextOpcode = opcode.getNextOpcode();
1213
1214            if (nextOpcode == Opcodes.NO_NEXT) {
1215                return null;
1216            }
1217
1218            opcode = get(nextOpcode);
1219
1220            if (suppressExtendedOpcodes && Opcodes.isExtended(nextOpcode)) {
1221                /*
1222                 * Continuing rather than just returning null here
1223                 * protects against the possibility that an
1224                 * instruction fitting chain might list non-extended
1225                 * opcodes after extended ones.
1226                 */
1227                continue;
1228            }
1229
1230            return opcode;
1231        }
1232    }
1233
1234    /**
1235     * Puts the given opcode into the table of all ops.
1236     *
1237     * @param opcode {@code non-null;} the opcode
1238     */
1239    private static void set(Dop opcode) {
1240        int idx = opcode.getOpcode() - Opcodes.MIN_VALUE;
1241        DOPS[idx] = opcode;
1242    }
1243}
1244