1/*
2 * Copyright (C) 2011 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.io;
18
19import com.android.dx.io.instructions.InstructionCodec;
20import com.android.dx.util.Hex;
21
22/**
23 * Information about each Dalvik opcode.
24 */
25public final class OpcodeInfo {
26    /*
27     * TODO: Merge at least most of the info from the Dops class into
28     * this one.
29     */
30
31    /** non-null; array containing all the information */
32    private static final Info[] INFO;
33
34    /**
35     * pseudo-opcode used for nonstandard formatted "instructions"
36     * (which are mostly not actually instructions, though they do
37     * appear in instruction lists). TODO: Retire the usage of this
38     * constant.
39     */
40    public static final Info SPECIAL_FORMAT =
41        new Info(Opcodes.SPECIAL_FORMAT, "<special>",
42                InstructionCodec.FORMAT_00X, IndexType.NONE);
43
44    // TODO: These payload opcodes should be generated by opcode-gen.
45
46    public static final Info PACKED_SWITCH_PAYLOAD =
47        new Info(Opcodes.PACKED_SWITCH_PAYLOAD, "packed-switch-payload",
48                InstructionCodec.FORMAT_PACKED_SWITCH_PAYLOAD,
49                IndexType.NONE);
50
51    public static final Info SPARSE_SWITCH_PAYLOAD =
52        new Info(Opcodes.SPARSE_SWITCH_PAYLOAD, "sparse-switch-payload",
53                InstructionCodec.FORMAT_SPARSE_SWITCH_PAYLOAD,
54                IndexType.NONE);
55
56    public static final Info FILL_ARRAY_DATA_PAYLOAD =
57        new Info(Opcodes.FILL_ARRAY_DATA_PAYLOAD, "fill-array-data-payload",
58                InstructionCodec.FORMAT_FILL_ARRAY_DATA_PAYLOAD,
59                IndexType.NONE);
60
61    // BEGIN(opcode-info-defs); GENERATED AUTOMATICALLY BY opcode-gen
62    public static final Info NOP =
63        new Info(Opcodes.NOP, "nop",
64            InstructionCodec.FORMAT_10X, IndexType.NONE);
65
66    public static final Info MOVE =
67        new Info(Opcodes.MOVE, "move",
68            InstructionCodec.FORMAT_12X, IndexType.NONE);
69
70    public static final Info MOVE_FROM16 =
71        new Info(Opcodes.MOVE_FROM16, "move/from16",
72            InstructionCodec.FORMAT_22X, IndexType.NONE);
73
74    public static final Info MOVE_16 =
75        new Info(Opcodes.MOVE_16, "move/16",
76            InstructionCodec.FORMAT_32X, IndexType.NONE);
77
78    public static final Info MOVE_WIDE =
79        new Info(Opcodes.MOVE_WIDE, "move-wide",
80            InstructionCodec.FORMAT_12X, IndexType.NONE);
81
82    public static final Info MOVE_WIDE_FROM16 =
83        new Info(Opcodes.MOVE_WIDE_FROM16, "move-wide/from16",
84            InstructionCodec.FORMAT_22X, IndexType.NONE);
85
86    public static final Info MOVE_WIDE_16 =
87        new Info(Opcodes.MOVE_WIDE_16, "move-wide/16",
88            InstructionCodec.FORMAT_32X, IndexType.NONE);
89
90    public static final Info MOVE_OBJECT =
91        new Info(Opcodes.MOVE_OBJECT, "move-object",
92            InstructionCodec.FORMAT_12X, IndexType.NONE);
93
94    public static final Info MOVE_OBJECT_FROM16 =
95        new Info(Opcodes.MOVE_OBJECT_FROM16, "move-object/from16",
96            InstructionCodec.FORMAT_22X, IndexType.NONE);
97
98    public static final Info MOVE_OBJECT_16 =
99        new Info(Opcodes.MOVE_OBJECT_16, "move-object/16",
100            InstructionCodec.FORMAT_32X, IndexType.NONE);
101
102    public static final Info MOVE_RESULT =
103        new Info(Opcodes.MOVE_RESULT, "move-result",
104            InstructionCodec.FORMAT_11X, IndexType.NONE);
105
106    public static final Info MOVE_RESULT_WIDE =
107        new Info(Opcodes.MOVE_RESULT_WIDE, "move-result-wide",
108            InstructionCodec.FORMAT_11X, IndexType.NONE);
109
110    public static final Info MOVE_RESULT_OBJECT =
111        new Info(Opcodes.MOVE_RESULT_OBJECT, "move-result-object",
112            InstructionCodec.FORMAT_11X, IndexType.NONE);
113
114    public static final Info MOVE_EXCEPTION =
115        new Info(Opcodes.MOVE_EXCEPTION, "move-exception",
116            InstructionCodec.FORMAT_11X, IndexType.NONE);
117
118    public static final Info RETURN_VOID =
119        new Info(Opcodes.RETURN_VOID, "return-void",
120            InstructionCodec.FORMAT_10X, IndexType.NONE);
121
122    public static final Info RETURN =
123        new Info(Opcodes.RETURN, "return",
124            InstructionCodec.FORMAT_11X, IndexType.NONE);
125
126    public static final Info RETURN_WIDE =
127        new Info(Opcodes.RETURN_WIDE, "return-wide",
128            InstructionCodec.FORMAT_11X, IndexType.NONE);
129
130    public static final Info RETURN_OBJECT =
131        new Info(Opcodes.RETURN_OBJECT, "return-object",
132            InstructionCodec.FORMAT_11X, IndexType.NONE);
133
134    public static final Info CONST_4 =
135        new Info(Opcodes.CONST_4, "const/4",
136            InstructionCodec.FORMAT_11N, IndexType.NONE);
137
138    public static final Info CONST_16 =
139        new Info(Opcodes.CONST_16, "const/16",
140            InstructionCodec.FORMAT_21S, IndexType.NONE);
141
142    public static final Info CONST =
143        new Info(Opcodes.CONST, "const",
144            InstructionCodec.FORMAT_31I, IndexType.NONE);
145
146    public static final Info CONST_HIGH16 =
147        new Info(Opcodes.CONST_HIGH16, "const/high16",
148            InstructionCodec.FORMAT_21H, IndexType.NONE);
149
150    public static final Info CONST_WIDE_16 =
151        new Info(Opcodes.CONST_WIDE_16, "const-wide/16",
152            InstructionCodec.FORMAT_21S, IndexType.NONE);
153
154    public static final Info CONST_WIDE_32 =
155        new Info(Opcodes.CONST_WIDE_32, "const-wide/32",
156            InstructionCodec.FORMAT_31I, IndexType.NONE);
157
158    public static final Info CONST_WIDE =
159        new Info(Opcodes.CONST_WIDE, "const-wide",
160            InstructionCodec.FORMAT_51L, IndexType.NONE);
161
162    public static final Info CONST_WIDE_HIGH16 =
163        new Info(Opcodes.CONST_WIDE_HIGH16, "const-wide/high16",
164            InstructionCodec.FORMAT_21H, IndexType.NONE);
165
166    public static final Info CONST_STRING =
167        new Info(Opcodes.CONST_STRING, "const-string",
168            InstructionCodec.FORMAT_21C, IndexType.STRING_REF);
169
170    public static final Info CONST_STRING_JUMBO =
171        new Info(Opcodes.CONST_STRING_JUMBO, "const-string/jumbo",
172            InstructionCodec.FORMAT_31C, IndexType.STRING_REF);
173
174    public static final Info CONST_CLASS =
175        new Info(Opcodes.CONST_CLASS, "const-class",
176            InstructionCodec.FORMAT_21C, IndexType.TYPE_REF);
177
178    public static final Info MONITOR_ENTER =
179        new Info(Opcodes.MONITOR_ENTER, "monitor-enter",
180            InstructionCodec.FORMAT_11X, IndexType.NONE);
181
182    public static final Info MONITOR_EXIT =
183        new Info(Opcodes.MONITOR_EXIT, "monitor-exit",
184            InstructionCodec.FORMAT_11X, IndexType.NONE);
185
186    public static final Info CHECK_CAST =
187        new Info(Opcodes.CHECK_CAST, "check-cast",
188            InstructionCodec.FORMAT_21C, IndexType.TYPE_REF);
189
190    public static final Info INSTANCE_OF =
191        new Info(Opcodes.INSTANCE_OF, "instance-of",
192            InstructionCodec.FORMAT_22C, IndexType.TYPE_REF);
193
194    public static final Info ARRAY_LENGTH =
195        new Info(Opcodes.ARRAY_LENGTH, "array-length",
196            InstructionCodec.FORMAT_12X, IndexType.NONE);
197
198    public static final Info NEW_INSTANCE =
199        new Info(Opcodes.NEW_INSTANCE, "new-instance",
200            InstructionCodec.FORMAT_21C, IndexType.TYPE_REF);
201
202    public static final Info NEW_ARRAY =
203        new Info(Opcodes.NEW_ARRAY, "new-array",
204            InstructionCodec.FORMAT_22C, IndexType.TYPE_REF);
205
206    public static final Info FILLED_NEW_ARRAY =
207        new Info(Opcodes.FILLED_NEW_ARRAY, "filled-new-array",
208            InstructionCodec.FORMAT_35C, IndexType.TYPE_REF);
209
210    public static final Info FILLED_NEW_ARRAY_RANGE =
211        new Info(Opcodes.FILLED_NEW_ARRAY_RANGE, "filled-new-array/range",
212            InstructionCodec.FORMAT_3RC, IndexType.TYPE_REF);
213
214    public static final Info FILL_ARRAY_DATA =
215        new Info(Opcodes.FILL_ARRAY_DATA, "fill-array-data",
216            InstructionCodec.FORMAT_31T, IndexType.NONE);
217
218    public static final Info THROW =
219        new Info(Opcodes.THROW, "throw",
220            InstructionCodec.FORMAT_11X, IndexType.NONE);
221
222    public static final Info GOTO =
223        new Info(Opcodes.GOTO, "goto",
224            InstructionCodec.FORMAT_10T, IndexType.NONE);
225
226    public static final Info GOTO_16 =
227        new Info(Opcodes.GOTO_16, "goto/16",
228            InstructionCodec.FORMAT_20T, IndexType.NONE);
229
230    public static final Info GOTO_32 =
231        new Info(Opcodes.GOTO_32, "goto/32",
232            InstructionCodec.FORMAT_30T, IndexType.NONE);
233
234    public static final Info PACKED_SWITCH =
235        new Info(Opcodes.PACKED_SWITCH, "packed-switch",
236            InstructionCodec.FORMAT_31T, IndexType.NONE);
237
238    public static final Info SPARSE_SWITCH =
239        new Info(Opcodes.SPARSE_SWITCH, "sparse-switch",
240            InstructionCodec.FORMAT_31T, IndexType.NONE);
241
242    public static final Info CMPL_FLOAT =
243        new Info(Opcodes.CMPL_FLOAT, "cmpl-float",
244            InstructionCodec.FORMAT_23X, IndexType.NONE);
245
246    public static final Info CMPG_FLOAT =
247        new Info(Opcodes.CMPG_FLOAT, "cmpg-float",
248            InstructionCodec.FORMAT_23X, IndexType.NONE);
249
250    public static final Info CMPL_DOUBLE =
251        new Info(Opcodes.CMPL_DOUBLE, "cmpl-double",
252            InstructionCodec.FORMAT_23X, IndexType.NONE);
253
254    public static final Info CMPG_DOUBLE =
255        new Info(Opcodes.CMPG_DOUBLE, "cmpg-double",
256            InstructionCodec.FORMAT_23X, IndexType.NONE);
257
258    public static final Info CMP_LONG =
259        new Info(Opcodes.CMP_LONG, "cmp-long",
260            InstructionCodec.FORMAT_23X, IndexType.NONE);
261
262    public static final Info IF_EQ =
263        new Info(Opcodes.IF_EQ, "if-eq",
264            InstructionCodec.FORMAT_22T, IndexType.NONE);
265
266    public static final Info IF_NE =
267        new Info(Opcodes.IF_NE, "if-ne",
268            InstructionCodec.FORMAT_22T, IndexType.NONE);
269
270    public static final Info IF_LT =
271        new Info(Opcodes.IF_LT, "if-lt",
272            InstructionCodec.FORMAT_22T, IndexType.NONE);
273
274    public static final Info IF_GE =
275        new Info(Opcodes.IF_GE, "if-ge",
276            InstructionCodec.FORMAT_22T, IndexType.NONE);
277
278    public static final Info IF_GT =
279        new Info(Opcodes.IF_GT, "if-gt",
280            InstructionCodec.FORMAT_22T, IndexType.NONE);
281
282    public static final Info IF_LE =
283        new Info(Opcodes.IF_LE, "if-le",
284            InstructionCodec.FORMAT_22T, IndexType.NONE);
285
286    public static final Info IF_EQZ =
287        new Info(Opcodes.IF_EQZ, "if-eqz",
288            InstructionCodec.FORMAT_21T, IndexType.NONE);
289
290    public static final Info IF_NEZ =
291        new Info(Opcodes.IF_NEZ, "if-nez",
292            InstructionCodec.FORMAT_21T, IndexType.NONE);
293
294    public static final Info IF_LTZ =
295        new Info(Opcodes.IF_LTZ, "if-ltz",
296            InstructionCodec.FORMAT_21T, IndexType.NONE);
297
298    public static final Info IF_GEZ =
299        new Info(Opcodes.IF_GEZ, "if-gez",
300            InstructionCodec.FORMAT_21T, IndexType.NONE);
301
302    public static final Info IF_GTZ =
303        new Info(Opcodes.IF_GTZ, "if-gtz",
304            InstructionCodec.FORMAT_21T, IndexType.NONE);
305
306    public static final Info IF_LEZ =
307        new Info(Opcodes.IF_LEZ, "if-lez",
308            InstructionCodec.FORMAT_21T, IndexType.NONE);
309
310    public static final Info AGET =
311        new Info(Opcodes.AGET, "aget",
312            InstructionCodec.FORMAT_23X, IndexType.NONE);
313
314    public static final Info AGET_WIDE =
315        new Info(Opcodes.AGET_WIDE, "aget-wide",
316            InstructionCodec.FORMAT_23X, IndexType.NONE);
317
318    public static final Info AGET_OBJECT =
319        new Info(Opcodes.AGET_OBJECT, "aget-object",
320            InstructionCodec.FORMAT_23X, IndexType.NONE);
321
322    public static final Info AGET_BOOLEAN =
323        new Info(Opcodes.AGET_BOOLEAN, "aget-boolean",
324            InstructionCodec.FORMAT_23X, IndexType.NONE);
325
326    public static final Info AGET_BYTE =
327        new Info(Opcodes.AGET_BYTE, "aget-byte",
328            InstructionCodec.FORMAT_23X, IndexType.NONE);
329
330    public static final Info AGET_CHAR =
331        new Info(Opcodes.AGET_CHAR, "aget-char",
332            InstructionCodec.FORMAT_23X, IndexType.NONE);
333
334    public static final Info AGET_SHORT =
335        new Info(Opcodes.AGET_SHORT, "aget-short",
336            InstructionCodec.FORMAT_23X, IndexType.NONE);
337
338    public static final Info APUT =
339        new Info(Opcodes.APUT, "aput",
340            InstructionCodec.FORMAT_23X, IndexType.NONE);
341
342    public static final Info APUT_WIDE =
343        new Info(Opcodes.APUT_WIDE, "aput-wide",
344            InstructionCodec.FORMAT_23X, IndexType.NONE);
345
346    public static final Info APUT_OBJECT =
347        new Info(Opcodes.APUT_OBJECT, "aput-object",
348            InstructionCodec.FORMAT_23X, IndexType.NONE);
349
350    public static final Info APUT_BOOLEAN =
351        new Info(Opcodes.APUT_BOOLEAN, "aput-boolean",
352            InstructionCodec.FORMAT_23X, IndexType.NONE);
353
354    public static final Info APUT_BYTE =
355        new Info(Opcodes.APUT_BYTE, "aput-byte",
356            InstructionCodec.FORMAT_23X, IndexType.NONE);
357
358    public static final Info APUT_CHAR =
359        new Info(Opcodes.APUT_CHAR, "aput-char",
360            InstructionCodec.FORMAT_23X, IndexType.NONE);
361
362    public static final Info APUT_SHORT =
363        new Info(Opcodes.APUT_SHORT, "aput-short",
364            InstructionCodec.FORMAT_23X, IndexType.NONE);
365
366    public static final Info IGET =
367        new Info(Opcodes.IGET, "iget",
368            InstructionCodec.FORMAT_22C, IndexType.FIELD_REF);
369
370    public static final Info IGET_WIDE =
371        new Info(Opcodes.IGET_WIDE, "iget-wide",
372            InstructionCodec.FORMAT_22C, IndexType.FIELD_REF);
373
374    public static final Info IGET_OBJECT =
375        new Info(Opcodes.IGET_OBJECT, "iget-object",
376            InstructionCodec.FORMAT_22C, IndexType.FIELD_REF);
377
378    public static final Info IGET_BOOLEAN =
379        new Info(Opcodes.IGET_BOOLEAN, "iget-boolean",
380            InstructionCodec.FORMAT_22C, IndexType.FIELD_REF);
381
382    public static final Info IGET_BYTE =
383        new Info(Opcodes.IGET_BYTE, "iget-byte",
384            InstructionCodec.FORMAT_22C, IndexType.FIELD_REF);
385
386    public static final Info IGET_CHAR =
387        new Info(Opcodes.IGET_CHAR, "iget-char",
388            InstructionCodec.FORMAT_22C, IndexType.FIELD_REF);
389
390    public static final Info IGET_SHORT =
391        new Info(Opcodes.IGET_SHORT, "iget-short",
392            InstructionCodec.FORMAT_22C, IndexType.FIELD_REF);
393
394    public static final Info IPUT =
395        new Info(Opcodes.IPUT, "iput",
396            InstructionCodec.FORMAT_22C, IndexType.FIELD_REF);
397
398    public static final Info IPUT_WIDE =
399        new Info(Opcodes.IPUT_WIDE, "iput-wide",
400            InstructionCodec.FORMAT_22C, IndexType.FIELD_REF);
401
402    public static final Info IPUT_OBJECT =
403        new Info(Opcodes.IPUT_OBJECT, "iput-object",
404            InstructionCodec.FORMAT_22C, IndexType.FIELD_REF);
405
406    public static final Info IPUT_BOOLEAN =
407        new Info(Opcodes.IPUT_BOOLEAN, "iput-boolean",
408            InstructionCodec.FORMAT_22C, IndexType.FIELD_REF);
409
410    public static final Info IPUT_BYTE =
411        new Info(Opcodes.IPUT_BYTE, "iput-byte",
412            InstructionCodec.FORMAT_22C, IndexType.FIELD_REF);
413
414    public static final Info IPUT_CHAR =
415        new Info(Opcodes.IPUT_CHAR, "iput-char",
416            InstructionCodec.FORMAT_22C, IndexType.FIELD_REF);
417
418    public static final Info IPUT_SHORT =
419        new Info(Opcodes.IPUT_SHORT, "iput-short",
420            InstructionCodec.FORMAT_22C, IndexType.FIELD_REF);
421
422    public static final Info SGET =
423        new Info(Opcodes.SGET, "sget",
424            InstructionCodec.FORMAT_21C, IndexType.FIELD_REF);
425
426    public static final Info SGET_WIDE =
427        new Info(Opcodes.SGET_WIDE, "sget-wide",
428            InstructionCodec.FORMAT_21C, IndexType.FIELD_REF);
429
430    public static final Info SGET_OBJECT =
431        new Info(Opcodes.SGET_OBJECT, "sget-object",
432            InstructionCodec.FORMAT_21C, IndexType.FIELD_REF);
433
434    public static final Info SGET_BOOLEAN =
435        new Info(Opcodes.SGET_BOOLEAN, "sget-boolean",
436            InstructionCodec.FORMAT_21C, IndexType.FIELD_REF);
437
438    public static final Info SGET_BYTE =
439        new Info(Opcodes.SGET_BYTE, "sget-byte",
440            InstructionCodec.FORMAT_21C, IndexType.FIELD_REF);
441
442    public static final Info SGET_CHAR =
443        new Info(Opcodes.SGET_CHAR, "sget-char",
444            InstructionCodec.FORMAT_21C, IndexType.FIELD_REF);
445
446    public static final Info SGET_SHORT =
447        new Info(Opcodes.SGET_SHORT, "sget-short",
448            InstructionCodec.FORMAT_21C, IndexType.FIELD_REF);
449
450    public static final Info SPUT =
451        new Info(Opcodes.SPUT, "sput",
452            InstructionCodec.FORMAT_21C, IndexType.FIELD_REF);
453
454    public static final Info SPUT_WIDE =
455        new Info(Opcodes.SPUT_WIDE, "sput-wide",
456            InstructionCodec.FORMAT_21C, IndexType.FIELD_REF);
457
458    public static final Info SPUT_OBJECT =
459        new Info(Opcodes.SPUT_OBJECT, "sput-object",
460            InstructionCodec.FORMAT_21C, IndexType.FIELD_REF);
461
462    public static final Info SPUT_BOOLEAN =
463        new Info(Opcodes.SPUT_BOOLEAN, "sput-boolean",
464            InstructionCodec.FORMAT_21C, IndexType.FIELD_REF);
465
466    public static final Info SPUT_BYTE =
467        new Info(Opcodes.SPUT_BYTE, "sput-byte",
468            InstructionCodec.FORMAT_21C, IndexType.FIELD_REF);
469
470    public static final Info SPUT_CHAR =
471        new Info(Opcodes.SPUT_CHAR, "sput-char",
472            InstructionCodec.FORMAT_21C, IndexType.FIELD_REF);
473
474    public static final Info SPUT_SHORT =
475        new Info(Opcodes.SPUT_SHORT, "sput-short",
476            InstructionCodec.FORMAT_21C, IndexType.FIELD_REF);
477
478    public static final Info INVOKE_VIRTUAL =
479        new Info(Opcodes.INVOKE_VIRTUAL, "invoke-virtual",
480            InstructionCodec.FORMAT_35C, IndexType.METHOD_REF);
481
482    public static final Info INVOKE_SUPER =
483        new Info(Opcodes.INVOKE_SUPER, "invoke-super",
484            InstructionCodec.FORMAT_35C, IndexType.METHOD_REF);
485
486    public static final Info INVOKE_DIRECT =
487        new Info(Opcodes.INVOKE_DIRECT, "invoke-direct",
488            InstructionCodec.FORMAT_35C, IndexType.METHOD_REF);
489
490    public static final Info INVOKE_STATIC =
491        new Info(Opcodes.INVOKE_STATIC, "invoke-static",
492            InstructionCodec.FORMAT_35C, IndexType.METHOD_REF);
493
494    public static final Info INVOKE_INTERFACE =
495        new Info(Opcodes.INVOKE_INTERFACE, "invoke-interface",
496            InstructionCodec.FORMAT_35C, IndexType.METHOD_REF);
497
498    public static final Info INVOKE_VIRTUAL_RANGE =
499        new Info(Opcodes.INVOKE_VIRTUAL_RANGE, "invoke-virtual/range",
500            InstructionCodec.FORMAT_3RC, IndexType.METHOD_REF);
501
502    public static final Info INVOKE_SUPER_RANGE =
503        new Info(Opcodes.INVOKE_SUPER_RANGE, "invoke-super/range",
504            InstructionCodec.FORMAT_3RC, IndexType.METHOD_REF);
505
506    public static final Info INVOKE_DIRECT_RANGE =
507        new Info(Opcodes.INVOKE_DIRECT_RANGE, "invoke-direct/range",
508            InstructionCodec.FORMAT_3RC, IndexType.METHOD_REF);
509
510    public static final Info INVOKE_STATIC_RANGE =
511        new Info(Opcodes.INVOKE_STATIC_RANGE, "invoke-static/range",
512            InstructionCodec.FORMAT_3RC, IndexType.METHOD_REF);
513
514    public static final Info INVOKE_INTERFACE_RANGE =
515        new Info(Opcodes.INVOKE_INTERFACE_RANGE, "invoke-interface/range",
516            InstructionCodec.FORMAT_3RC, IndexType.METHOD_REF);
517
518    public static final Info NEG_INT =
519        new Info(Opcodes.NEG_INT, "neg-int",
520            InstructionCodec.FORMAT_12X, IndexType.NONE);
521
522    public static final Info NOT_INT =
523        new Info(Opcodes.NOT_INT, "not-int",
524            InstructionCodec.FORMAT_12X, IndexType.NONE);
525
526    public static final Info NEG_LONG =
527        new Info(Opcodes.NEG_LONG, "neg-long",
528            InstructionCodec.FORMAT_12X, IndexType.NONE);
529
530    public static final Info NOT_LONG =
531        new Info(Opcodes.NOT_LONG, "not-long",
532            InstructionCodec.FORMAT_12X, IndexType.NONE);
533
534    public static final Info NEG_FLOAT =
535        new Info(Opcodes.NEG_FLOAT, "neg-float",
536            InstructionCodec.FORMAT_12X, IndexType.NONE);
537
538    public static final Info NEG_DOUBLE =
539        new Info(Opcodes.NEG_DOUBLE, "neg-double",
540            InstructionCodec.FORMAT_12X, IndexType.NONE);
541
542    public static final Info INT_TO_LONG =
543        new Info(Opcodes.INT_TO_LONG, "int-to-long",
544            InstructionCodec.FORMAT_12X, IndexType.NONE);
545
546    public static final Info INT_TO_FLOAT =
547        new Info(Opcodes.INT_TO_FLOAT, "int-to-float",
548            InstructionCodec.FORMAT_12X, IndexType.NONE);
549
550    public static final Info INT_TO_DOUBLE =
551        new Info(Opcodes.INT_TO_DOUBLE, "int-to-double",
552            InstructionCodec.FORMAT_12X, IndexType.NONE);
553
554    public static final Info LONG_TO_INT =
555        new Info(Opcodes.LONG_TO_INT, "long-to-int",
556            InstructionCodec.FORMAT_12X, IndexType.NONE);
557
558    public static final Info LONG_TO_FLOAT =
559        new Info(Opcodes.LONG_TO_FLOAT, "long-to-float",
560            InstructionCodec.FORMAT_12X, IndexType.NONE);
561
562    public static final Info LONG_TO_DOUBLE =
563        new Info(Opcodes.LONG_TO_DOUBLE, "long-to-double",
564            InstructionCodec.FORMAT_12X, IndexType.NONE);
565
566    public static final Info FLOAT_TO_INT =
567        new Info(Opcodes.FLOAT_TO_INT, "float-to-int",
568            InstructionCodec.FORMAT_12X, IndexType.NONE);
569
570    public static final Info FLOAT_TO_LONG =
571        new Info(Opcodes.FLOAT_TO_LONG, "float-to-long",
572            InstructionCodec.FORMAT_12X, IndexType.NONE);
573
574    public static final Info FLOAT_TO_DOUBLE =
575        new Info(Opcodes.FLOAT_TO_DOUBLE, "float-to-double",
576            InstructionCodec.FORMAT_12X, IndexType.NONE);
577
578    public static final Info DOUBLE_TO_INT =
579        new Info(Opcodes.DOUBLE_TO_INT, "double-to-int",
580            InstructionCodec.FORMAT_12X, IndexType.NONE);
581
582    public static final Info DOUBLE_TO_LONG =
583        new Info(Opcodes.DOUBLE_TO_LONG, "double-to-long",
584            InstructionCodec.FORMAT_12X, IndexType.NONE);
585
586    public static final Info DOUBLE_TO_FLOAT =
587        new Info(Opcodes.DOUBLE_TO_FLOAT, "double-to-float",
588            InstructionCodec.FORMAT_12X, IndexType.NONE);
589
590    public static final Info INT_TO_BYTE =
591        new Info(Opcodes.INT_TO_BYTE, "int-to-byte",
592            InstructionCodec.FORMAT_12X, IndexType.NONE);
593
594    public static final Info INT_TO_CHAR =
595        new Info(Opcodes.INT_TO_CHAR, "int-to-char",
596            InstructionCodec.FORMAT_12X, IndexType.NONE);
597
598    public static final Info INT_TO_SHORT =
599        new Info(Opcodes.INT_TO_SHORT, "int-to-short",
600            InstructionCodec.FORMAT_12X, IndexType.NONE);
601
602    public static final Info ADD_INT =
603        new Info(Opcodes.ADD_INT, "add-int",
604            InstructionCodec.FORMAT_23X, IndexType.NONE);
605
606    public static final Info SUB_INT =
607        new Info(Opcodes.SUB_INT, "sub-int",
608            InstructionCodec.FORMAT_23X, IndexType.NONE);
609
610    public static final Info MUL_INT =
611        new Info(Opcodes.MUL_INT, "mul-int",
612            InstructionCodec.FORMAT_23X, IndexType.NONE);
613
614    public static final Info DIV_INT =
615        new Info(Opcodes.DIV_INT, "div-int",
616            InstructionCodec.FORMAT_23X, IndexType.NONE);
617
618    public static final Info REM_INT =
619        new Info(Opcodes.REM_INT, "rem-int",
620            InstructionCodec.FORMAT_23X, IndexType.NONE);
621
622    public static final Info AND_INT =
623        new Info(Opcodes.AND_INT, "and-int",
624            InstructionCodec.FORMAT_23X, IndexType.NONE);
625
626    public static final Info OR_INT =
627        new Info(Opcodes.OR_INT, "or-int",
628            InstructionCodec.FORMAT_23X, IndexType.NONE);
629
630    public static final Info XOR_INT =
631        new Info(Opcodes.XOR_INT, "xor-int",
632            InstructionCodec.FORMAT_23X, IndexType.NONE);
633
634    public static final Info SHL_INT =
635        new Info(Opcodes.SHL_INT, "shl-int",
636            InstructionCodec.FORMAT_23X, IndexType.NONE);
637
638    public static final Info SHR_INT =
639        new Info(Opcodes.SHR_INT, "shr-int",
640            InstructionCodec.FORMAT_23X, IndexType.NONE);
641
642    public static final Info USHR_INT =
643        new Info(Opcodes.USHR_INT, "ushr-int",
644            InstructionCodec.FORMAT_23X, IndexType.NONE);
645
646    public static final Info ADD_LONG =
647        new Info(Opcodes.ADD_LONG, "add-long",
648            InstructionCodec.FORMAT_23X, IndexType.NONE);
649
650    public static final Info SUB_LONG =
651        new Info(Opcodes.SUB_LONG, "sub-long",
652            InstructionCodec.FORMAT_23X, IndexType.NONE);
653
654    public static final Info MUL_LONG =
655        new Info(Opcodes.MUL_LONG, "mul-long",
656            InstructionCodec.FORMAT_23X, IndexType.NONE);
657
658    public static final Info DIV_LONG =
659        new Info(Opcodes.DIV_LONG, "div-long",
660            InstructionCodec.FORMAT_23X, IndexType.NONE);
661
662    public static final Info REM_LONG =
663        new Info(Opcodes.REM_LONG, "rem-long",
664            InstructionCodec.FORMAT_23X, IndexType.NONE);
665
666    public static final Info AND_LONG =
667        new Info(Opcodes.AND_LONG, "and-long",
668            InstructionCodec.FORMAT_23X, IndexType.NONE);
669
670    public static final Info OR_LONG =
671        new Info(Opcodes.OR_LONG, "or-long",
672            InstructionCodec.FORMAT_23X, IndexType.NONE);
673
674    public static final Info XOR_LONG =
675        new Info(Opcodes.XOR_LONG, "xor-long",
676            InstructionCodec.FORMAT_23X, IndexType.NONE);
677
678    public static final Info SHL_LONG =
679        new Info(Opcodes.SHL_LONG, "shl-long",
680            InstructionCodec.FORMAT_23X, IndexType.NONE);
681
682    public static final Info SHR_LONG =
683        new Info(Opcodes.SHR_LONG, "shr-long",
684            InstructionCodec.FORMAT_23X, IndexType.NONE);
685
686    public static final Info USHR_LONG =
687        new Info(Opcodes.USHR_LONG, "ushr-long",
688            InstructionCodec.FORMAT_23X, IndexType.NONE);
689
690    public static final Info ADD_FLOAT =
691        new Info(Opcodes.ADD_FLOAT, "add-float",
692            InstructionCodec.FORMAT_23X, IndexType.NONE);
693
694    public static final Info SUB_FLOAT =
695        new Info(Opcodes.SUB_FLOAT, "sub-float",
696            InstructionCodec.FORMAT_23X, IndexType.NONE);
697
698    public static final Info MUL_FLOAT =
699        new Info(Opcodes.MUL_FLOAT, "mul-float",
700            InstructionCodec.FORMAT_23X, IndexType.NONE);
701
702    public static final Info DIV_FLOAT =
703        new Info(Opcodes.DIV_FLOAT, "div-float",
704            InstructionCodec.FORMAT_23X, IndexType.NONE);
705
706    public static final Info REM_FLOAT =
707        new Info(Opcodes.REM_FLOAT, "rem-float",
708            InstructionCodec.FORMAT_23X, IndexType.NONE);
709
710    public static final Info ADD_DOUBLE =
711        new Info(Opcodes.ADD_DOUBLE, "add-double",
712            InstructionCodec.FORMAT_23X, IndexType.NONE);
713
714    public static final Info SUB_DOUBLE =
715        new Info(Opcodes.SUB_DOUBLE, "sub-double",
716            InstructionCodec.FORMAT_23X, IndexType.NONE);
717
718    public static final Info MUL_DOUBLE =
719        new Info(Opcodes.MUL_DOUBLE, "mul-double",
720            InstructionCodec.FORMAT_23X, IndexType.NONE);
721
722    public static final Info DIV_DOUBLE =
723        new Info(Opcodes.DIV_DOUBLE, "div-double",
724            InstructionCodec.FORMAT_23X, IndexType.NONE);
725
726    public static final Info REM_DOUBLE =
727        new Info(Opcodes.REM_DOUBLE, "rem-double",
728            InstructionCodec.FORMAT_23X, IndexType.NONE);
729
730    public static final Info ADD_INT_2ADDR =
731        new Info(Opcodes.ADD_INT_2ADDR, "add-int/2addr",
732            InstructionCodec.FORMAT_12X, IndexType.NONE);
733
734    public static final Info SUB_INT_2ADDR =
735        new Info(Opcodes.SUB_INT_2ADDR, "sub-int/2addr",
736            InstructionCodec.FORMAT_12X, IndexType.NONE);
737
738    public static final Info MUL_INT_2ADDR =
739        new Info(Opcodes.MUL_INT_2ADDR, "mul-int/2addr",
740            InstructionCodec.FORMAT_12X, IndexType.NONE);
741
742    public static final Info DIV_INT_2ADDR =
743        new Info(Opcodes.DIV_INT_2ADDR, "div-int/2addr",
744            InstructionCodec.FORMAT_12X, IndexType.NONE);
745
746    public static final Info REM_INT_2ADDR =
747        new Info(Opcodes.REM_INT_2ADDR, "rem-int/2addr",
748            InstructionCodec.FORMAT_12X, IndexType.NONE);
749
750    public static final Info AND_INT_2ADDR =
751        new Info(Opcodes.AND_INT_2ADDR, "and-int/2addr",
752            InstructionCodec.FORMAT_12X, IndexType.NONE);
753
754    public static final Info OR_INT_2ADDR =
755        new Info(Opcodes.OR_INT_2ADDR, "or-int/2addr",
756            InstructionCodec.FORMAT_12X, IndexType.NONE);
757
758    public static final Info XOR_INT_2ADDR =
759        new Info(Opcodes.XOR_INT_2ADDR, "xor-int/2addr",
760            InstructionCodec.FORMAT_12X, IndexType.NONE);
761
762    public static final Info SHL_INT_2ADDR =
763        new Info(Opcodes.SHL_INT_2ADDR, "shl-int/2addr",
764            InstructionCodec.FORMAT_12X, IndexType.NONE);
765
766    public static final Info SHR_INT_2ADDR =
767        new Info(Opcodes.SHR_INT_2ADDR, "shr-int/2addr",
768            InstructionCodec.FORMAT_12X, IndexType.NONE);
769
770    public static final Info USHR_INT_2ADDR =
771        new Info(Opcodes.USHR_INT_2ADDR, "ushr-int/2addr",
772            InstructionCodec.FORMAT_12X, IndexType.NONE);
773
774    public static final Info ADD_LONG_2ADDR =
775        new Info(Opcodes.ADD_LONG_2ADDR, "add-long/2addr",
776            InstructionCodec.FORMAT_12X, IndexType.NONE);
777
778    public static final Info SUB_LONG_2ADDR =
779        new Info(Opcodes.SUB_LONG_2ADDR, "sub-long/2addr",
780            InstructionCodec.FORMAT_12X, IndexType.NONE);
781
782    public static final Info MUL_LONG_2ADDR =
783        new Info(Opcodes.MUL_LONG_2ADDR, "mul-long/2addr",
784            InstructionCodec.FORMAT_12X, IndexType.NONE);
785
786    public static final Info DIV_LONG_2ADDR =
787        new Info(Opcodes.DIV_LONG_2ADDR, "div-long/2addr",
788            InstructionCodec.FORMAT_12X, IndexType.NONE);
789
790    public static final Info REM_LONG_2ADDR =
791        new Info(Opcodes.REM_LONG_2ADDR, "rem-long/2addr",
792            InstructionCodec.FORMAT_12X, IndexType.NONE);
793
794    public static final Info AND_LONG_2ADDR =
795        new Info(Opcodes.AND_LONG_2ADDR, "and-long/2addr",
796            InstructionCodec.FORMAT_12X, IndexType.NONE);
797
798    public static final Info OR_LONG_2ADDR =
799        new Info(Opcodes.OR_LONG_2ADDR, "or-long/2addr",
800            InstructionCodec.FORMAT_12X, IndexType.NONE);
801
802    public static final Info XOR_LONG_2ADDR =
803        new Info(Opcodes.XOR_LONG_2ADDR, "xor-long/2addr",
804            InstructionCodec.FORMAT_12X, IndexType.NONE);
805
806    public static final Info SHL_LONG_2ADDR =
807        new Info(Opcodes.SHL_LONG_2ADDR, "shl-long/2addr",
808            InstructionCodec.FORMAT_12X, IndexType.NONE);
809
810    public static final Info SHR_LONG_2ADDR =
811        new Info(Opcodes.SHR_LONG_2ADDR, "shr-long/2addr",
812            InstructionCodec.FORMAT_12X, IndexType.NONE);
813
814    public static final Info USHR_LONG_2ADDR =
815        new Info(Opcodes.USHR_LONG_2ADDR, "ushr-long/2addr",
816            InstructionCodec.FORMAT_12X, IndexType.NONE);
817
818    public static final Info ADD_FLOAT_2ADDR =
819        new Info(Opcodes.ADD_FLOAT_2ADDR, "add-float/2addr",
820            InstructionCodec.FORMAT_12X, IndexType.NONE);
821
822    public static final Info SUB_FLOAT_2ADDR =
823        new Info(Opcodes.SUB_FLOAT_2ADDR, "sub-float/2addr",
824            InstructionCodec.FORMAT_12X, IndexType.NONE);
825
826    public static final Info MUL_FLOAT_2ADDR =
827        new Info(Opcodes.MUL_FLOAT_2ADDR, "mul-float/2addr",
828            InstructionCodec.FORMAT_12X, IndexType.NONE);
829
830    public static final Info DIV_FLOAT_2ADDR =
831        new Info(Opcodes.DIV_FLOAT_2ADDR, "div-float/2addr",
832            InstructionCodec.FORMAT_12X, IndexType.NONE);
833
834    public static final Info REM_FLOAT_2ADDR =
835        new Info(Opcodes.REM_FLOAT_2ADDR, "rem-float/2addr",
836            InstructionCodec.FORMAT_12X, IndexType.NONE);
837
838    public static final Info ADD_DOUBLE_2ADDR =
839        new Info(Opcodes.ADD_DOUBLE_2ADDR, "add-double/2addr",
840            InstructionCodec.FORMAT_12X, IndexType.NONE);
841
842    public static final Info SUB_DOUBLE_2ADDR =
843        new Info(Opcodes.SUB_DOUBLE_2ADDR, "sub-double/2addr",
844            InstructionCodec.FORMAT_12X, IndexType.NONE);
845
846    public static final Info MUL_DOUBLE_2ADDR =
847        new Info(Opcodes.MUL_DOUBLE_2ADDR, "mul-double/2addr",
848            InstructionCodec.FORMAT_12X, IndexType.NONE);
849
850    public static final Info DIV_DOUBLE_2ADDR =
851        new Info(Opcodes.DIV_DOUBLE_2ADDR, "div-double/2addr",
852            InstructionCodec.FORMAT_12X, IndexType.NONE);
853
854    public static final Info REM_DOUBLE_2ADDR =
855        new Info(Opcodes.REM_DOUBLE_2ADDR, "rem-double/2addr",
856            InstructionCodec.FORMAT_12X, IndexType.NONE);
857
858    public static final Info ADD_INT_LIT16 =
859        new Info(Opcodes.ADD_INT_LIT16, "add-int/lit16",
860            InstructionCodec.FORMAT_22S, IndexType.NONE);
861
862    public static final Info RSUB_INT =
863        new Info(Opcodes.RSUB_INT, "rsub-int",
864            InstructionCodec.FORMAT_22S, IndexType.NONE);
865
866    public static final Info MUL_INT_LIT16 =
867        new Info(Opcodes.MUL_INT_LIT16, "mul-int/lit16",
868            InstructionCodec.FORMAT_22S, IndexType.NONE);
869
870    public static final Info DIV_INT_LIT16 =
871        new Info(Opcodes.DIV_INT_LIT16, "div-int/lit16",
872            InstructionCodec.FORMAT_22S, IndexType.NONE);
873
874    public static final Info REM_INT_LIT16 =
875        new Info(Opcodes.REM_INT_LIT16, "rem-int/lit16",
876            InstructionCodec.FORMAT_22S, IndexType.NONE);
877
878    public static final Info AND_INT_LIT16 =
879        new Info(Opcodes.AND_INT_LIT16, "and-int/lit16",
880            InstructionCodec.FORMAT_22S, IndexType.NONE);
881
882    public static final Info OR_INT_LIT16 =
883        new Info(Opcodes.OR_INT_LIT16, "or-int/lit16",
884            InstructionCodec.FORMAT_22S, IndexType.NONE);
885
886    public static final Info XOR_INT_LIT16 =
887        new Info(Opcodes.XOR_INT_LIT16, "xor-int/lit16",
888            InstructionCodec.FORMAT_22S, IndexType.NONE);
889
890    public static final Info ADD_INT_LIT8 =
891        new Info(Opcodes.ADD_INT_LIT8, "add-int/lit8",
892            InstructionCodec.FORMAT_22B, IndexType.NONE);
893
894    public static final Info RSUB_INT_LIT8 =
895        new Info(Opcodes.RSUB_INT_LIT8, "rsub-int/lit8",
896            InstructionCodec.FORMAT_22B, IndexType.NONE);
897
898    public static final Info MUL_INT_LIT8 =
899        new Info(Opcodes.MUL_INT_LIT8, "mul-int/lit8",
900            InstructionCodec.FORMAT_22B, IndexType.NONE);
901
902    public static final Info DIV_INT_LIT8 =
903        new Info(Opcodes.DIV_INT_LIT8, "div-int/lit8",
904            InstructionCodec.FORMAT_22B, IndexType.NONE);
905
906    public static final Info REM_INT_LIT8 =
907        new Info(Opcodes.REM_INT_LIT8, "rem-int/lit8",
908            InstructionCodec.FORMAT_22B, IndexType.NONE);
909
910    public static final Info AND_INT_LIT8 =
911        new Info(Opcodes.AND_INT_LIT8, "and-int/lit8",
912            InstructionCodec.FORMAT_22B, IndexType.NONE);
913
914    public static final Info OR_INT_LIT8 =
915        new Info(Opcodes.OR_INT_LIT8, "or-int/lit8",
916            InstructionCodec.FORMAT_22B, IndexType.NONE);
917
918    public static final Info XOR_INT_LIT8 =
919        new Info(Opcodes.XOR_INT_LIT8, "xor-int/lit8",
920            InstructionCodec.FORMAT_22B, IndexType.NONE);
921
922    public static final Info SHL_INT_LIT8 =
923        new Info(Opcodes.SHL_INT_LIT8, "shl-int/lit8",
924            InstructionCodec.FORMAT_22B, IndexType.NONE);
925
926    public static final Info SHR_INT_LIT8 =
927        new Info(Opcodes.SHR_INT_LIT8, "shr-int/lit8",
928            InstructionCodec.FORMAT_22B, IndexType.NONE);
929
930    public static final Info USHR_INT_LIT8 =
931        new Info(Opcodes.USHR_INT_LIT8, "ushr-int/lit8",
932            InstructionCodec.FORMAT_22B, IndexType.NONE);
933
934    public static final Info CONST_CLASS_JUMBO =
935        new Info(Opcodes.CONST_CLASS_JUMBO, "const-class/jumbo",
936            InstructionCodec.FORMAT_41C, IndexType.TYPE_REF);
937
938    public static final Info CHECK_CAST_JUMBO =
939        new Info(Opcodes.CHECK_CAST_JUMBO, "check-cast/jumbo",
940            InstructionCodec.FORMAT_41C, IndexType.TYPE_REF);
941
942    public static final Info INSTANCE_OF_JUMBO =
943        new Info(Opcodes.INSTANCE_OF_JUMBO, "instance-of/jumbo",
944            InstructionCodec.FORMAT_52C, IndexType.TYPE_REF);
945
946    public static final Info NEW_INSTANCE_JUMBO =
947        new Info(Opcodes.NEW_INSTANCE_JUMBO, "new-instance/jumbo",
948            InstructionCodec.FORMAT_41C, IndexType.TYPE_REF);
949
950    public static final Info NEW_ARRAY_JUMBO =
951        new Info(Opcodes.NEW_ARRAY_JUMBO, "new-array/jumbo",
952            InstructionCodec.FORMAT_52C, IndexType.TYPE_REF);
953
954    public static final Info FILLED_NEW_ARRAY_JUMBO =
955        new Info(Opcodes.FILLED_NEW_ARRAY_JUMBO, "filled-new-array/jumbo",
956            InstructionCodec.FORMAT_5RC, IndexType.TYPE_REF);
957
958    public static final Info IGET_JUMBO =
959        new Info(Opcodes.IGET_JUMBO, "iget/jumbo",
960            InstructionCodec.FORMAT_52C, IndexType.FIELD_REF);
961
962    public static final Info IGET_WIDE_JUMBO =
963        new Info(Opcodes.IGET_WIDE_JUMBO, "iget-wide/jumbo",
964            InstructionCodec.FORMAT_52C, IndexType.FIELD_REF);
965
966    public static final Info IGET_OBJECT_JUMBO =
967        new Info(Opcodes.IGET_OBJECT_JUMBO, "iget-object/jumbo",
968            InstructionCodec.FORMAT_52C, IndexType.FIELD_REF);
969
970    public static final Info IGET_BOOLEAN_JUMBO =
971        new Info(Opcodes.IGET_BOOLEAN_JUMBO, "iget-boolean/jumbo",
972            InstructionCodec.FORMAT_52C, IndexType.FIELD_REF);
973
974    public static final Info IGET_BYTE_JUMBO =
975        new Info(Opcodes.IGET_BYTE_JUMBO, "iget-byte/jumbo",
976            InstructionCodec.FORMAT_52C, IndexType.FIELD_REF);
977
978    public static final Info IGET_CHAR_JUMBO =
979        new Info(Opcodes.IGET_CHAR_JUMBO, "iget-char/jumbo",
980            InstructionCodec.FORMAT_52C, IndexType.FIELD_REF);
981
982    public static final Info IGET_SHORT_JUMBO =
983        new Info(Opcodes.IGET_SHORT_JUMBO, "iget-short/jumbo",
984            InstructionCodec.FORMAT_52C, IndexType.FIELD_REF);
985
986    public static final Info IPUT_JUMBO =
987        new Info(Opcodes.IPUT_JUMBO, "iput/jumbo",
988            InstructionCodec.FORMAT_52C, IndexType.FIELD_REF);
989
990    public static final Info IPUT_WIDE_JUMBO =
991        new Info(Opcodes.IPUT_WIDE_JUMBO, "iput-wide/jumbo",
992            InstructionCodec.FORMAT_52C, IndexType.FIELD_REF);
993
994    public static final Info IPUT_OBJECT_JUMBO =
995        new Info(Opcodes.IPUT_OBJECT_JUMBO, "iput-object/jumbo",
996            InstructionCodec.FORMAT_52C, IndexType.FIELD_REF);
997
998    public static final Info IPUT_BOOLEAN_JUMBO =
999        new Info(Opcodes.IPUT_BOOLEAN_JUMBO, "iput-boolean/jumbo",
1000            InstructionCodec.FORMAT_52C, IndexType.FIELD_REF);
1001
1002    public static final Info IPUT_BYTE_JUMBO =
1003        new Info(Opcodes.IPUT_BYTE_JUMBO, "iput-byte/jumbo",
1004            InstructionCodec.FORMAT_52C, IndexType.FIELD_REF);
1005
1006    public static final Info IPUT_CHAR_JUMBO =
1007        new Info(Opcodes.IPUT_CHAR_JUMBO, "iput-char/jumbo",
1008            InstructionCodec.FORMAT_52C, IndexType.FIELD_REF);
1009
1010    public static final Info IPUT_SHORT_JUMBO =
1011        new Info(Opcodes.IPUT_SHORT_JUMBO, "iput-short/jumbo",
1012            InstructionCodec.FORMAT_52C, IndexType.FIELD_REF);
1013
1014    public static final Info SGET_JUMBO =
1015        new Info(Opcodes.SGET_JUMBO, "sget/jumbo",
1016            InstructionCodec.FORMAT_41C, IndexType.FIELD_REF);
1017
1018    public static final Info SGET_WIDE_JUMBO =
1019        new Info(Opcodes.SGET_WIDE_JUMBO, "sget-wide/jumbo",
1020            InstructionCodec.FORMAT_41C, IndexType.FIELD_REF);
1021
1022    public static final Info SGET_OBJECT_JUMBO =
1023        new Info(Opcodes.SGET_OBJECT_JUMBO, "sget-object/jumbo",
1024            InstructionCodec.FORMAT_41C, IndexType.FIELD_REF);
1025
1026    public static final Info SGET_BOOLEAN_JUMBO =
1027        new Info(Opcodes.SGET_BOOLEAN_JUMBO, "sget-boolean/jumbo",
1028            InstructionCodec.FORMAT_41C, IndexType.FIELD_REF);
1029
1030    public static final Info SGET_BYTE_JUMBO =
1031        new Info(Opcodes.SGET_BYTE_JUMBO, "sget-byte/jumbo",
1032            InstructionCodec.FORMAT_41C, IndexType.FIELD_REF);
1033
1034    public static final Info SGET_CHAR_JUMBO =
1035        new Info(Opcodes.SGET_CHAR_JUMBO, "sget-char/jumbo",
1036            InstructionCodec.FORMAT_41C, IndexType.FIELD_REF);
1037
1038    public static final Info SGET_SHORT_JUMBO =
1039        new Info(Opcodes.SGET_SHORT_JUMBO, "sget-short/jumbo",
1040            InstructionCodec.FORMAT_41C, IndexType.FIELD_REF);
1041
1042    public static final Info SPUT_JUMBO =
1043        new Info(Opcodes.SPUT_JUMBO, "sput/jumbo",
1044            InstructionCodec.FORMAT_41C, IndexType.FIELD_REF);
1045
1046    public static final Info SPUT_WIDE_JUMBO =
1047        new Info(Opcodes.SPUT_WIDE_JUMBO, "sput-wide/jumbo",
1048            InstructionCodec.FORMAT_41C, IndexType.FIELD_REF);
1049
1050    public static final Info SPUT_OBJECT_JUMBO =
1051        new Info(Opcodes.SPUT_OBJECT_JUMBO, "sput-object/jumbo",
1052            InstructionCodec.FORMAT_41C, IndexType.FIELD_REF);
1053
1054    public static final Info SPUT_BOOLEAN_JUMBO =
1055        new Info(Opcodes.SPUT_BOOLEAN_JUMBO, "sput-boolean/jumbo",
1056            InstructionCodec.FORMAT_41C, IndexType.FIELD_REF);
1057
1058    public static final Info SPUT_BYTE_JUMBO =
1059        new Info(Opcodes.SPUT_BYTE_JUMBO, "sput-byte/jumbo",
1060            InstructionCodec.FORMAT_41C, IndexType.FIELD_REF);
1061
1062    public static final Info SPUT_CHAR_JUMBO =
1063        new Info(Opcodes.SPUT_CHAR_JUMBO, "sput-char/jumbo",
1064            InstructionCodec.FORMAT_41C, IndexType.FIELD_REF);
1065
1066    public static final Info SPUT_SHORT_JUMBO =
1067        new Info(Opcodes.SPUT_SHORT_JUMBO, "sput-short/jumbo",
1068            InstructionCodec.FORMAT_41C, IndexType.FIELD_REF);
1069
1070    public static final Info INVOKE_VIRTUAL_JUMBO =
1071        new Info(Opcodes.INVOKE_VIRTUAL_JUMBO, "invoke-virtual/jumbo",
1072            InstructionCodec.FORMAT_5RC, IndexType.METHOD_REF);
1073
1074    public static final Info INVOKE_SUPER_JUMBO =
1075        new Info(Opcodes.INVOKE_SUPER_JUMBO, "invoke-super/jumbo",
1076            InstructionCodec.FORMAT_5RC, IndexType.METHOD_REF);
1077
1078    public static final Info INVOKE_DIRECT_JUMBO =
1079        new Info(Opcodes.INVOKE_DIRECT_JUMBO, "invoke-direct/jumbo",
1080            InstructionCodec.FORMAT_5RC, IndexType.METHOD_REF);
1081
1082    public static final Info INVOKE_STATIC_JUMBO =
1083        new Info(Opcodes.INVOKE_STATIC_JUMBO, "invoke-static/jumbo",
1084            InstructionCodec.FORMAT_5RC, IndexType.METHOD_REF);
1085
1086    public static final Info INVOKE_INTERFACE_JUMBO =
1087        new Info(Opcodes.INVOKE_INTERFACE_JUMBO, "invoke-interface/jumbo",
1088            InstructionCodec.FORMAT_5RC, IndexType.METHOD_REF);
1089
1090    // END(opcode-info-defs)
1091
1092    // Static initialization.
1093    static {
1094        INFO = new Info[Opcodes.MAX_VALUE - Opcodes.MIN_VALUE + 1];
1095
1096        // TODO: Stop using this constant.
1097        set(SPECIAL_FORMAT);
1098
1099        // TODO: These payload opcodes should be generated by opcode-gen.
1100        set(PACKED_SWITCH_PAYLOAD);
1101        set(SPARSE_SWITCH_PAYLOAD);
1102        set(FILL_ARRAY_DATA_PAYLOAD);
1103
1104        // BEGIN(opcode-info-init); GENERATED AUTOMATICALLY BY opcode-gen
1105        set(NOP);
1106        set(MOVE);
1107        set(MOVE_FROM16);
1108        set(MOVE_16);
1109        set(MOVE_WIDE);
1110        set(MOVE_WIDE_FROM16);
1111        set(MOVE_WIDE_16);
1112        set(MOVE_OBJECT);
1113        set(MOVE_OBJECT_FROM16);
1114        set(MOVE_OBJECT_16);
1115        set(MOVE_RESULT);
1116        set(MOVE_RESULT_WIDE);
1117        set(MOVE_RESULT_OBJECT);
1118        set(MOVE_EXCEPTION);
1119        set(RETURN_VOID);
1120        set(RETURN);
1121        set(RETURN_WIDE);
1122        set(RETURN_OBJECT);
1123        set(CONST_4);
1124        set(CONST_16);
1125        set(CONST);
1126        set(CONST_HIGH16);
1127        set(CONST_WIDE_16);
1128        set(CONST_WIDE_32);
1129        set(CONST_WIDE);
1130        set(CONST_WIDE_HIGH16);
1131        set(CONST_STRING);
1132        set(CONST_STRING_JUMBO);
1133        set(CONST_CLASS);
1134        set(MONITOR_ENTER);
1135        set(MONITOR_EXIT);
1136        set(CHECK_CAST);
1137        set(INSTANCE_OF);
1138        set(ARRAY_LENGTH);
1139        set(NEW_INSTANCE);
1140        set(NEW_ARRAY);
1141        set(FILLED_NEW_ARRAY);
1142        set(FILLED_NEW_ARRAY_RANGE);
1143        set(FILL_ARRAY_DATA);
1144        set(THROW);
1145        set(GOTO);
1146        set(GOTO_16);
1147        set(GOTO_32);
1148        set(PACKED_SWITCH);
1149        set(SPARSE_SWITCH);
1150        set(CMPL_FLOAT);
1151        set(CMPG_FLOAT);
1152        set(CMPL_DOUBLE);
1153        set(CMPG_DOUBLE);
1154        set(CMP_LONG);
1155        set(IF_EQ);
1156        set(IF_NE);
1157        set(IF_LT);
1158        set(IF_GE);
1159        set(IF_GT);
1160        set(IF_LE);
1161        set(IF_EQZ);
1162        set(IF_NEZ);
1163        set(IF_LTZ);
1164        set(IF_GEZ);
1165        set(IF_GTZ);
1166        set(IF_LEZ);
1167        set(AGET);
1168        set(AGET_WIDE);
1169        set(AGET_OBJECT);
1170        set(AGET_BOOLEAN);
1171        set(AGET_BYTE);
1172        set(AGET_CHAR);
1173        set(AGET_SHORT);
1174        set(APUT);
1175        set(APUT_WIDE);
1176        set(APUT_OBJECT);
1177        set(APUT_BOOLEAN);
1178        set(APUT_BYTE);
1179        set(APUT_CHAR);
1180        set(APUT_SHORT);
1181        set(IGET);
1182        set(IGET_WIDE);
1183        set(IGET_OBJECT);
1184        set(IGET_BOOLEAN);
1185        set(IGET_BYTE);
1186        set(IGET_CHAR);
1187        set(IGET_SHORT);
1188        set(IPUT);
1189        set(IPUT_WIDE);
1190        set(IPUT_OBJECT);
1191        set(IPUT_BOOLEAN);
1192        set(IPUT_BYTE);
1193        set(IPUT_CHAR);
1194        set(IPUT_SHORT);
1195        set(SGET);
1196        set(SGET_WIDE);
1197        set(SGET_OBJECT);
1198        set(SGET_BOOLEAN);
1199        set(SGET_BYTE);
1200        set(SGET_CHAR);
1201        set(SGET_SHORT);
1202        set(SPUT);
1203        set(SPUT_WIDE);
1204        set(SPUT_OBJECT);
1205        set(SPUT_BOOLEAN);
1206        set(SPUT_BYTE);
1207        set(SPUT_CHAR);
1208        set(SPUT_SHORT);
1209        set(INVOKE_VIRTUAL);
1210        set(INVOKE_SUPER);
1211        set(INVOKE_DIRECT);
1212        set(INVOKE_STATIC);
1213        set(INVOKE_INTERFACE);
1214        set(INVOKE_VIRTUAL_RANGE);
1215        set(INVOKE_SUPER_RANGE);
1216        set(INVOKE_DIRECT_RANGE);
1217        set(INVOKE_STATIC_RANGE);
1218        set(INVOKE_INTERFACE_RANGE);
1219        set(NEG_INT);
1220        set(NOT_INT);
1221        set(NEG_LONG);
1222        set(NOT_LONG);
1223        set(NEG_FLOAT);
1224        set(NEG_DOUBLE);
1225        set(INT_TO_LONG);
1226        set(INT_TO_FLOAT);
1227        set(INT_TO_DOUBLE);
1228        set(LONG_TO_INT);
1229        set(LONG_TO_FLOAT);
1230        set(LONG_TO_DOUBLE);
1231        set(FLOAT_TO_INT);
1232        set(FLOAT_TO_LONG);
1233        set(FLOAT_TO_DOUBLE);
1234        set(DOUBLE_TO_INT);
1235        set(DOUBLE_TO_LONG);
1236        set(DOUBLE_TO_FLOAT);
1237        set(INT_TO_BYTE);
1238        set(INT_TO_CHAR);
1239        set(INT_TO_SHORT);
1240        set(ADD_INT);
1241        set(SUB_INT);
1242        set(MUL_INT);
1243        set(DIV_INT);
1244        set(REM_INT);
1245        set(AND_INT);
1246        set(OR_INT);
1247        set(XOR_INT);
1248        set(SHL_INT);
1249        set(SHR_INT);
1250        set(USHR_INT);
1251        set(ADD_LONG);
1252        set(SUB_LONG);
1253        set(MUL_LONG);
1254        set(DIV_LONG);
1255        set(REM_LONG);
1256        set(AND_LONG);
1257        set(OR_LONG);
1258        set(XOR_LONG);
1259        set(SHL_LONG);
1260        set(SHR_LONG);
1261        set(USHR_LONG);
1262        set(ADD_FLOAT);
1263        set(SUB_FLOAT);
1264        set(MUL_FLOAT);
1265        set(DIV_FLOAT);
1266        set(REM_FLOAT);
1267        set(ADD_DOUBLE);
1268        set(SUB_DOUBLE);
1269        set(MUL_DOUBLE);
1270        set(DIV_DOUBLE);
1271        set(REM_DOUBLE);
1272        set(ADD_INT_2ADDR);
1273        set(SUB_INT_2ADDR);
1274        set(MUL_INT_2ADDR);
1275        set(DIV_INT_2ADDR);
1276        set(REM_INT_2ADDR);
1277        set(AND_INT_2ADDR);
1278        set(OR_INT_2ADDR);
1279        set(XOR_INT_2ADDR);
1280        set(SHL_INT_2ADDR);
1281        set(SHR_INT_2ADDR);
1282        set(USHR_INT_2ADDR);
1283        set(ADD_LONG_2ADDR);
1284        set(SUB_LONG_2ADDR);
1285        set(MUL_LONG_2ADDR);
1286        set(DIV_LONG_2ADDR);
1287        set(REM_LONG_2ADDR);
1288        set(AND_LONG_2ADDR);
1289        set(OR_LONG_2ADDR);
1290        set(XOR_LONG_2ADDR);
1291        set(SHL_LONG_2ADDR);
1292        set(SHR_LONG_2ADDR);
1293        set(USHR_LONG_2ADDR);
1294        set(ADD_FLOAT_2ADDR);
1295        set(SUB_FLOAT_2ADDR);
1296        set(MUL_FLOAT_2ADDR);
1297        set(DIV_FLOAT_2ADDR);
1298        set(REM_FLOAT_2ADDR);
1299        set(ADD_DOUBLE_2ADDR);
1300        set(SUB_DOUBLE_2ADDR);
1301        set(MUL_DOUBLE_2ADDR);
1302        set(DIV_DOUBLE_2ADDR);
1303        set(REM_DOUBLE_2ADDR);
1304        set(ADD_INT_LIT16);
1305        set(RSUB_INT);
1306        set(MUL_INT_LIT16);
1307        set(DIV_INT_LIT16);
1308        set(REM_INT_LIT16);
1309        set(AND_INT_LIT16);
1310        set(OR_INT_LIT16);
1311        set(XOR_INT_LIT16);
1312        set(ADD_INT_LIT8);
1313        set(RSUB_INT_LIT8);
1314        set(MUL_INT_LIT8);
1315        set(DIV_INT_LIT8);
1316        set(REM_INT_LIT8);
1317        set(AND_INT_LIT8);
1318        set(OR_INT_LIT8);
1319        set(XOR_INT_LIT8);
1320        set(SHL_INT_LIT8);
1321        set(SHR_INT_LIT8);
1322        set(USHR_INT_LIT8);
1323        set(CONST_CLASS_JUMBO);
1324        set(CHECK_CAST_JUMBO);
1325        set(INSTANCE_OF_JUMBO);
1326        set(NEW_INSTANCE_JUMBO);
1327        set(NEW_ARRAY_JUMBO);
1328        set(FILLED_NEW_ARRAY_JUMBO);
1329        set(IGET_JUMBO);
1330        set(IGET_WIDE_JUMBO);
1331        set(IGET_OBJECT_JUMBO);
1332        set(IGET_BOOLEAN_JUMBO);
1333        set(IGET_BYTE_JUMBO);
1334        set(IGET_CHAR_JUMBO);
1335        set(IGET_SHORT_JUMBO);
1336        set(IPUT_JUMBO);
1337        set(IPUT_WIDE_JUMBO);
1338        set(IPUT_OBJECT_JUMBO);
1339        set(IPUT_BOOLEAN_JUMBO);
1340        set(IPUT_BYTE_JUMBO);
1341        set(IPUT_CHAR_JUMBO);
1342        set(IPUT_SHORT_JUMBO);
1343        set(SGET_JUMBO);
1344        set(SGET_WIDE_JUMBO);
1345        set(SGET_OBJECT_JUMBO);
1346        set(SGET_BOOLEAN_JUMBO);
1347        set(SGET_BYTE_JUMBO);
1348        set(SGET_CHAR_JUMBO);
1349        set(SGET_SHORT_JUMBO);
1350        set(SPUT_JUMBO);
1351        set(SPUT_WIDE_JUMBO);
1352        set(SPUT_OBJECT_JUMBO);
1353        set(SPUT_BOOLEAN_JUMBO);
1354        set(SPUT_BYTE_JUMBO);
1355        set(SPUT_CHAR_JUMBO);
1356        set(SPUT_SHORT_JUMBO);
1357        set(INVOKE_VIRTUAL_JUMBO);
1358        set(INVOKE_SUPER_JUMBO);
1359        set(INVOKE_DIRECT_JUMBO);
1360        set(INVOKE_STATIC_JUMBO);
1361        set(INVOKE_INTERFACE_JUMBO);
1362        // END(opcode-info-init)
1363    }
1364
1365    /**
1366     * This class is uninstantiable.
1367     */
1368    private OpcodeInfo() {
1369        // This space intentionally left blank.
1370    }
1371
1372    /**
1373     * Gets the {@link @Info} for the given opcode value.
1374     *
1375     * @param opcode {@code Opcodes.MIN_VALUE..Opcodes.MAX_VALUE;} the
1376     * opcode value
1377     * @return non-null; the associated opcode information instance
1378     */
1379    public static Info get(int opcode) {
1380        int idx = opcode - Opcodes.MIN_VALUE;
1381
1382        try {
1383            Info result = INFO[idx];
1384            if (result != null) {
1385                return result;
1386            }
1387        } catch (ArrayIndexOutOfBoundsException ex) {
1388            // Fall through.
1389        }
1390
1391        throw new IllegalArgumentException("bogus opcode: "
1392                + Hex.u2or4(opcode));
1393    }
1394
1395    /**
1396     * Gets the name of the given opcode.
1397     */
1398    public static String getName(int opcode) {
1399        return get(opcode).getName();
1400    }
1401
1402    /**
1403     * Gets the format (an {@link InstructionCodec}) for the given opcode
1404     * value.
1405     */
1406    public static InstructionCodec getFormat(int opcode) {
1407        return get(opcode).getFormat();
1408    }
1409
1410    /**
1411     * Gets the {@link IndexType} for the given opcode value.
1412     */
1413    public static IndexType getIndexType(int opcode) {
1414        return get(opcode).getIndexType();
1415    }
1416
1417    /**
1418     * Puts the given opcode into the table of all ops.
1419     *
1420     * @param opcode non-null; the opcode
1421     */
1422    private static void set(Info opcode) {
1423        int idx = opcode.getOpcode() - Opcodes.MIN_VALUE;
1424        INFO[idx] = opcode;
1425    }
1426
1427    /**
1428     * Information about an opcode.
1429     */
1430    public static class Info {
1431        private final int opcode;
1432        private final String name;
1433        private final InstructionCodec format;
1434        private final IndexType indexType;
1435
1436        public Info(int opcode, String name, InstructionCodec format,
1437                IndexType indexType) {
1438            this.opcode = opcode;
1439            this.name = name;
1440            this.format = format;
1441            this.indexType = indexType;
1442        }
1443
1444        public int getOpcode() {
1445            return opcode;
1446        }
1447
1448        public String getName() {
1449            return name;
1450        }
1451
1452        public InstructionCodec getFormat() {
1453            return format;
1454        }
1455
1456        public IndexType getIndexType() {
1457            return indexType;
1458        }
1459    }
1460}
1461