1/*
2 * ProGuard -- shrinking, optimization, obfuscation, and preverification
3 *             of Java bytecode.
4 *
5 * Copyright (c) 2002-2013 Eric Lafortune (eric@graphics.cornell.edu)
6 *
7 * This program is free software; you can redistribute it and/or modify it
8 * under the terms of the GNU General Public License as published by the Free
9 * Software Foundation; either version 2 of the License, or (at your option)
10 * any later version.
11 *
12 * This program is distributed in the hope that it will be useful, but WITHOUT
13 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
14 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
15 * more details.
16 *
17 * You should have received a copy of the GNU General Public License along
18 * with this program; if not, write to the Free Software Foundation, Inc.,
19 * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
20 */
21package proguard.optimize.peephole;
22
23import proguard.classfile.*;
24import proguard.classfile.constant.*;
25import proguard.classfile.instruction.*;
26import proguard.classfile.visitor.ClassPrinter;
27
28/**
29 * This class contains a set of instruction sequences and their suggested
30 * replacements.
31 *
32 * @see InstructionSequencesReplacer
33 * @see InstructionSequenceReplacer
34 * @author Eric Lafortune
35 */
36public class InstructionSequenceConstants
37{
38    private static final int X = InstructionSequenceReplacer.X;
39    private static final int Y = InstructionSequenceReplacer.Y;
40    private static final int Z = InstructionSequenceReplacer.Z;
41
42    private static final int A = InstructionSequenceReplacer.A;
43    private static final int B = InstructionSequenceReplacer.B;
44    private static final int C = InstructionSequenceReplacer.C;
45    private static final int D = InstructionSequenceReplacer.D;
46
47    private static final int STRING_A_LENGTH  = InstructionSequenceReplacer.STRING_A_LENGTH;
48    private static final int BOOLEAN_A_STRING = InstructionSequenceReplacer.BOOLEAN_A_STRING;
49    private static final int CHAR_A_STRING    = InstructionSequenceReplacer.CHAR_A_STRING;
50    private static final int INT_A_STRING     = InstructionSequenceReplacer.INT_A_STRING;
51    private static final int LONG_A_STRING    = InstructionSequenceReplacer.LONG_A_STRING;
52    private static final int FLOAT_A_STRING   = InstructionSequenceReplacer.FLOAT_A_STRING;
53    private static final int DOUBLE_A_STRING  = InstructionSequenceReplacer.DOUBLE_A_STRING;
54    private static final int STRING_A_STRING  = InstructionSequenceReplacer.STRING_A_STRING;
55    private static final int BOOLEAN_B_STRING = InstructionSequenceReplacer.BOOLEAN_B_STRING;
56    private static final int CHAR_B_STRING    = InstructionSequenceReplacer.CHAR_B_STRING;
57    private static final int INT_B_STRING     = InstructionSequenceReplacer.INT_B_STRING;
58    private static final int LONG_B_STRING    = InstructionSequenceReplacer.LONG_B_STRING;
59    private static final int FLOAT_B_STRING   = InstructionSequenceReplacer.FLOAT_B_STRING;
60    private static final int DOUBLE_B_STRING  = InstructionSequenceReplacer.DOUBLE_B_STRING;
61    private static final int STRING_B_STRING  = InstructionSequenceReplacer.STRING_B_STRING;
62
63    private static final int I_32768                                   =   0;
64    private static final int I_65536                                   =   1;
65    private static final int I_16777216                                =   2;
66
67//  private static final int I_0x000000ff
68    private static final int I_0x0000ff00                              =   3;
69    private static final int I_0x00ff0000                              =   4;
70    private static final int I_0xff000000                              =   5;
71    private static final int I_0x0000ffff                              =   6;
72    private static final int I_0xffff0000                              =   7;
73
74    private static final int L_M1                                      =   8;
75    private static final int L_2                                       =   9;
76    private static final int L_4                                       =  10;
77    private static final int L_8                                       =  11;
78    private static final int L_16                                      =  12;
79    private static final int L_32                                      =  13;
80    private static final int L_64                                      =  14;
81    private static final int L_128                                     =  15;
82    private static final int L_256                                     =  16;
83    private static final int L_512                                     =  17;
84    private static final int L_1024                                    =  18;
85    private static final int L_2048                                    =  19;
86    private static final int L_4096                                    =  20;
87    private static final int L_8192                                    =  21;
88    private static final int L_16384                                   =  22;
89    private static final int L_32768                                   =  23;
90    private static final int L_65536                                   =  24;
91    private static final int L_16777216                                =  25;
92    private static final int L_4294967296                              =  26;
93
94    private static final int L_0x00000000ffffffff                      =  27;
95    private static final int L_0xffffffff00000000                      =  28;
96
97    private static final int F_M1                                      =  29;
98
99    private static final int D_M1                                      =  30;
100
101    private static final int STRING_EMPTY                              =  31;
102
103    private static final int FIELD_I                                   =  32; // Implicitly uses X and Y.
104    private static final int FIELD_L                                   =  33; // Implicitly uses X and Y.
105    private static final int FIELD_F                                   =  34; // Implicitly uses X and Y.
106    private static final int FIELD_D                                   =  35; // Implicitly uses X and Y.
107
108    private static final int METHOD_STRING_EQUALS                      =  36;
109    private static final int METHOD_STRING_LENGTH                      =  37;
110    private static final int METHOD_STRING_VALUEOF_Z                   =  38;
111    private static final int METHOD_STRING_VALUEOF_C                   =  39;
112    private static final int METHOD_STRING_VALUEOF_I                   =  40;
113    private static final int METHOD_STRING_VALUEOF_J                   =  41;
114    private static final int METHOD_STRING_VALUEOF_F                   =  42;
115    private static final int METHOD_STRING_VALUEOF_D                   =  43;
116    private static final int METHOD_STRING_VALUEOF_OBJECT              =  44;
117    private static final int METHOD_STRINGBUFFER_INIT                  =  45;
118    private static final int METHOD_STRINGBUFFER_INIT_STRING           =  46;
119    private static final int METHOD_STRINGBUFFER_APPEND_Z              =  47;
120    private static final int METHOD_STRINGBUFFER_APPEND_C              =  48;
121    private static final int METHOD_STRINGBUFFER_APPEND_I              =  49;
122    private static final int METHOD_STRINGBUFFER_APPEND_J              =  50;
123    private static final int METHOD_STRINGBUFFER_APPEND_F              =  51;
124    private static final int METHOD_STRINGBUFFER_APPEND_D              =  52;
125    private static final int METHOD_STRINGBUFFER_APPEND_STRING         =  53;
126    private static final int METHOD_STRINGBUFFER_APPEND_OBJECT         =  54;
127    private static final int METHOD_STRINGBUFFER_LENGTH                =  55;
128    private static final int METHOD_STRINGBUFFER_TOSTRING              =  56;
129    private static final int METHOD_STRINGBUILDER_INIT                 =  57;
130    private static final int METHOD_STRINGBUILDER_INIT_STRING          =  58;
131    private static final int METHOD_STRINGBUILDER_APPEND_Z             =  59;
132    private static final int METHOD_STRINGBUILDER_APPEND_C             =  60;
133    private static final int METHOD_STRINGBUILDER_APPEND_I             =  61;
134    private static final int METHOD_STRINGBUILDER_APPEND_J             =  62;
135    private static final int METHOD_STRINGBUILDER_APPEND_F             =  63;
136    private static final int METHOD_STRINGBUILDER_APPEND_D             =  64;
137    private static final int METHOD_STRINGBUILDER_APPEND_STRING        =  65;
138    private static final int METHOD_STRINGBUILDER_APPEND_OBJECT        =  66;
139    private static final int METHOD_STRINGBUILDER_LENGTH               =  67;
140    private static final int METHOD_STRINGBUILDER_TOSTRING             =  68;
141
142    private static final int CLASS_STRING                              =  69;
143    private static final int CLASS_STRINGBUFFER                        =  70;
144    private static final int CLASS_STRINGBUILDER                       =  71;
145
146    private static final int NAME_AND_TYPE_I                           =  72; // Implicitly uses Y.
147    private static final int NAME_AND_TYPE_L                           =  73; // Implicitly uses Y.
148    private static final int NAME_AND_TYPE_F                           =  74; // Implicitly uses Y.
149    private static final int NAME_AND_TYPE_D                           =  75; // Implicitly uses Y.
150
151    private static final int NAME_AND_TYPE_EQUALS                      =  76;
152    private static final int NAME_AND_TYPE_LENGTH                      =  77;
153    private static final int NAME_AND_TYPE_VALUEOF_Z                   =  78;
154    private static final int NAME_AND_TYPE_VALUEOF_C                   =  79;
155    private static final int NAME_AND_TYPE_VALUEOF_I                   =  80;
156    private static final int NAME_AND_TYPE_VALUEOF_J                   =  81;
157    private static final int NAME_AND_TYPE_VALUEOF_F                   =  82;
158    private static final int NAME_AND_TYPE_VALUEOF_D                   =  83;
159    private static final int NAME_AND_TYPE_VALUEOF_OBJECT              =  84;
160    private static final int NAME_AND_TYPE_INIT                        =  85;
161    private static final int NAME_AND_TYPE_INIT_STRING                 =  86;
162    private static final int NAME_AND_TYPE_APPEND_Z_STRINGBUFFER       =  87;
163    private static final int NAME_AND_TYPE_APPEND_C_STRINGBUFFER       =  88;
164    private static final int NAME_AND_TYPE_APPEND_I_STRINGBUFFER       =  89;
165    private static final int NAME_AND_TYPE_APPEND_J_STRINGBUFFER       =  90;
166    private static final int NAME_AND_TYPE_APPEND_F_STRINGBUFFER       =  91;
167    private static final int NAME_AND_TYPE_APPEND_D_STRINGBUFFER       =  92;
168    private static final int NAME_AND_TYPE_APPEND_STRING_STRINGBUFFER  =  93;
169    private static final int NAME_AND_TYPE_APPEND_OBJECT_STRINGBUFFER  =  94;
170    private static final int NAME_AND_TYPE_APPEND_Z_STRINGBUILDER      =  95;
171    private static final int NAME_AND_TYPE_APPEND_C_STRINGBUILDER      =  96;
172    private static final int NAME_AND_TYPE_APPEND_I_STRINGBUILDER      =  97;
173    private static final int NAME_AND_TYPE_APPEND_J_STRINGBUILDER      =  98;
174    private static final int NAME_AND_TYPE_APPEND_F_STRINGBUILDER      =  99;
175    private static final int NAME_AND_TYPE_APPEND_D_STRINGBUILDER      = 100;
176    private static final int NAME_AND_TYPE_APPEND_STRING_STRINGBUILDER = 101;
177    private static final int NAME_AND_TYPE_APPEND_OBJECT_STRINGBUILDER = 102;
178    private static final int NAME_AND_TYPE_TOSTRING                    = 103;
179
180    private static final int UTF8_EMPTY                                = 104;
181    private static final int UTF8_I                                    = 105;
182    private static final int UTF8_L                                    = 106;
183    private static final int UTF8_F                                    = 107;
184    private static final int UTF8_D                                    = 108;
185    private static final int UTF8_STRING                               = 109;
186    private static final int UTF8_STRINGBUFFER                         = 110;
187    private static final int UTF8_STRINGBUILDER                        = 111;
188    private static final int UTF8_EQUALS                               = 112;
189    private static final int UTF8_OBJECT_Z                             = 113;
190    private static final int UTF8_LENGTH                               = 114;
191    private static final int UTF8__I                                   = 115;
192    private static final int UTF8_VALUEOF                              = 116;
193    private static final int UTF8_Z_STRING                             = 117;
194    private static final int UTF8_C_STRING                             = 118;
195    private static final int UTF8_I_STRING                             = 119;
196    private static final int UTF8_J_STRING                             = 120;
197    private static final int UTF8_F_STRING                             = 121;
198    private static final int UTF8_D_STRING                             = 122;
199    private static final int UTF8_OBJECT_STRING                        = 123;
200    private static final int UTF8_INIT                                 = 124;
201    private static final int UTF8__VOID                                = 125;
202    private static final int UTF8_STRING_VOID                          = 126;
203    private static final int UTF8_TOSTRING                             = 127;
204    private static final int UTF8__STRING                              = 128;
205    private static final int UTF8_APPEND                               = 129;
206    private static final int UTF8_Z_STRINGBUFFER                       = 130;
207    private static final int UTF8_C_STRINGBUFFER                       = 131;
208    private static final int UTF8_I_STRINGBUFFER                       = 132;
209    private static final int UTF8_J_STRINGBUFFER                       = 133;
210    private static final int UTF8_F_STRINGBUFFER                       = 134;
211    private static final int UTF8_D_STRINGBUFFER                       = 135;
212    private static final int UTF8_STRING_STRINGBUFFER                  = 136;
213    private static final int UTF8_OBJECT_STRINGBUFFER                  = 137;
214    private static final int UTF8_Z_STRINGBUILDER                      = 138;
215    private static final int UTF8_C_STRINGBUILDER                      = 139;
216    private static final int UTF8_I_STRINGBUILDER                      = 140;
217    private static final int UTF8_J_STRINGBUILDER                      = 141;
218    private static final int UTF8_F_STRINGBUILDER                      = 142;
219    private static final int UTF8_D_STRINGBUILDER                      = 143;
220    private static final int UTF8_STRING_STRINGBUILDER                 = 144;
221    private static final int UTF8_OBJECT_STRINGBUILDER                 = 145;
222
223    private static final int SENTINEL                                  = 146;
224
225
226    public static final Constant[] CONSTANTS = new Constant[]
227    {
228        new IntegerConstant(32768),
229        new IntegerConstant(65536),
230        new IntegerConstant(16777216),
231
232        new IntegerConstant(0x0000ff00),
233        new IntegerConstant(0x00ff0000),
234        new IntegerConstant(0xff000000),
235        new IntegerConstant(0x0000ffff),
236        new IntegerConstant(0xffff0000),
237
238        new LongConstant(-1L),
239        new LongConstant(2L),
240        new LongConstant(4L),
241        new LongConstant(8L),
242        new LongConstant(16L),
243        new LongConstant(32L),
244        new LongConstant(64L),
245        new LongConstant(128L),
246        new LongConstant(256L),
247        new LongConstant(512L),
248        new LongConstant(1024L),
249        new LongConstant(2048L),
250        new LongConstant(4096L),
251        new LongConstant(8192L),
252        new LongConstant(16384L),
253        new LongConstant(32768L),
254        new LongConstant(65536L),
255        new LongConstant(16777216L),
256        new LongConstant(4294967296L),
257
258        new LongConstant(0x00000000ffffffffL),
259        new LongConstant(0xffffffff00000000L),
260
261        new FloatConstant(-1f),
262
263        new DoubleConstant(-1d),
264
265        new StringConstant(UTF8_EMPTY, null, null),
266
267        new FieldrefConstant(X, NAME_AND_TYPE_I, null, null),
268        new FieldrefConstant(X, NAME_AND_TYPE_L, null, null),
269        new FieldrefConstant(X, NAME_AND_TYPE_F, null, null),
270        new FieldrefConstant(X, NAME_AND_TYPE_D, null, null),
271
272        new MethodrefConstant(CLASS_STRING,        NAME_AND_TYPE_EQUALS, null, null),
273        new MethodrefConstant(CLASS_STRING,        NAME_AND_TYPE_LENGTH, null, null),
274        new MethodrefConstant(CLASS_STRING,        NAME_AND_TYPE_VALUEOF_Z, null, null),
275        new MethodrefConstant(CLASS_STRING,        NAME_AND_TYPE_VALUEOF_C, null, null),
276        new MethodrefConstant(CLASS_STRING,        NAME_AND_TYPE_VALUEOF_I, null, null),
277        new MethodrefConstant(CLASS_STRING,        NAME_AND_TYPE_VALUEOF_J, null, null),
278        new MethodrefConstant(CLASS_STRING,        NAME_AND_TYPE_VALUEOF_F, null, null),
279        new MethodrefConstant(CLASS_STRING,        NAME_AND_TYPE_VALUEOF_D, null, null),
280        new MethodrefConstant(CLASS_STRING,        NAME_AND_TYPE_VALUEOF_OBJECT, null, null),
281        new MethodrefConstant(CLASS_STRINGBUFFER,  NAME_AND_TYPE_INIT, null, null),
282        new MethodrefConstant(CLASS_STRINGBUFFER,  NAME_AND_TYPE_INIT_STRING, null, null),
283        new MethodrefConstant(CLASS_STRINGBUFFER,  NAME_AND_TYPE_APPEND_Z_STRINGBUFFER, null, null),
284        new MethodrefConstant(CLASS_STRINGBUFFER,  NAME_AND_TYPE_APPEND_C_STRINGBUFFER, null, null),
285        new MethodrefConstant(CLASS_STRINGBUFFER,  NAME_AND_TYPE_APPEND_I_STRINGBUFFER, null, null),
286        new MethodrefConstant(CLASS_STRINGBUFFER,  NAME_AND_TYPE_APPEND_J_STRINGBUFFER, null, null),
287        new MethodrefConstant(CLASS_STRINGBUFFER,  NAME_AND_TYPE_APPEND_F_STRINGBUFFER, null, null),
288        new MethodrefConstant(CLASS_STRINGBUFFER,  NAME_AND_TYPE_APPEND_D_STRINGBUFFER, null, null),
289        new MethodrefConstant(CLASS_STRINGBUFFER,  NAME_AND_TYPE_APPEND_STRING_STRINGBUFFER, null, null),
290        new MethodrefConstant(CLASS_STRINGBUFFER,  NAME_AND_TYPE_APPEND_OBJECT_STRINGBUFFER, null, null),
291        new MethodrefConstant(CLASS_STRINGBUFFER,  NAME_AND_TYPE_LENGTH, null, null),
292        new MethodrefConstant(CLASS_STRINGBUFFER,  NAME_AND_TYPE_TOSTRING, null, null),
293        new MethodrefConstant(CLASS_STRINGBUILDER, NAME_AND_TYPE_INIT, null, null),
294        new MethodrefConstant(CLASS_STRINGBUILDER, NAME_AND_TYPE_INIT_STRING, null, null),
295        new MethodrefConstant(CLASS_STRINGBUILDER, NAME_AND_TYPE_APPEND_Z_STRINGBUILDER, null, null),
296        new MethodrefConstant(CLASS_STRINGBUILDER, NAME_AND_TYPE_APPEND_C_STRINGBUILDER, null, null),
297        new MethodrefConstant(CLASS_STRINGBUILDER, NAME_AND_TYPE_APPEND_I_STRINGBUILDER, null, null),
298        new MethodrefConstant(CLASS_STRINGBUILDER, NAME_AND_TYPE_APPEND_J_STRINGBUILDER, null, null),
299        new MethodrefConstant(CLASS_STRINGBUILDER, NAME_AND_TYPE_APPEND_F_STRINGBUILDER, null, null),
300        new MethodrefConstant(CLASS_STRINGBUILDER, NAME_AND_TYPE_APPEND_D_STRINGBUILDER, null, null),
301        new MethodrefConstant(CLASS_STRINGBUILDER, NAME_AND_TYPE_APPEND_STRING_STRINGBUILDER, null, null),
302        new MethodrefConstant(CLASS_STRINGBUILDER, NAME_AND_TYPE_APPEND_OBJECT_STRINGBUILDER, null, null),
303        new MethodrefConstant(CLASS_STRINGBUILDER, NAME_AND_TYPE_LENGTH, null, null),
304        new MethodrefConstant(CLASS_STRINGBUILDER, NAME_AND_TYPE_TOSTRING, null, null),
305
306        new ClassConstant(UTF8_STRING,  null),
307        new ClassConstant(UTF8_STRINGBUFFER,  null),
308        new ClassConstant(UTF8_STRINGBUILDER, null),
309
310        new NameAndTypeConstant(Y, UTF8_I),
311        new NameAndTypeConstant(Y, UTF8_L),
312        new NameAndTypeConstant(Y, UTF8_F),
313        new NameAndTypeConstant(Y, UTF8_D),
314        new NameAndTypeConstant(UTF8_EQUALS, UTF8_OBJECT_Z),
315        new NameAndTypeConstant(UTF8_LENGTH, UTF8__I),
316        new NameAndTypeConstant(UTF8_VALUEOF, UTF8_Z_STRING),
317        new NameAndTypeConstant(UTF8_VALUEOF, UTF8_C_STRING),
318        new NameAndTypeConstant(UTF8_VALUEOF, UTF8_I_STRING),
319        new NameAndTypeConstant(UTF8_VALUEOF, UTF8_J_STRING),
320        new NameAndTypeConstant(UTF8_VALUEOF, UTF8_F_STRING),
321        new NameAndTypeConstant(UTF8_VALUEOF, UTF8_D_STRING),
322        new NameAndTypeConstant(UTF8_VALUEOF, UTF8_OBJECT_STRING),
323        new NameAndTypeConstant(UTF8_INIT, UTF8__VOID),
324        new NameAndTypeConstant(UTF8_INIT, UTF8_STRING_VOID),
325        new NameAndTypeConstant(UTF8_APPEND, UTF8_Z_STRINGBUFFER),
326        new NameAndTypeConstant(UTF8_APPEND, UTF8_C_STRINGBUFFER),
327        new NameAndTypeConstant(UTF8_APPEND, UTF8_I_STRINGBUFFER),
328        new NameAndTypeConstant(UTF8_APPEND, UTF8_J_STRINGBUFFER),
329        new NameAndTypeConstant(UTF8_APPEND, UTF8_F_STRINGBUFFER),
330        new NameAndTypeConstant(UTF8_APPEND, UTF8_D_STRINGBUFFER),
331        new NameAndTypeConstant(UTF8_APPEND, UTF8_STRING_STRINGBUFFER),
332        new NameAndTypeConstant(UTF8_APPEND, UTF8_OBJECT_STRINGBUFFER),
333        new NameAndTypeConstant(UTF8_APPEND, UTF8_Z_STRINGBUILDER),
334        new NameAndTypeConstant(UTF8_APPEND, UTF8_C_STRINGBUILDER),
335        new NameAndTypeConstant(UTF8_APPEND, UTF8_I_STRINGBUILDER),
336        new NameAndTypeConstant(UTF8_APPEND, UTF8_J_STRINGBUILDER),
337        new NameAndTypeConstant(UTF8_APPEND, UTF8_F_STRINGBUILDER),
338        new NameAndTypeConstant(UTF8_APPEND, UTF8_D_STRINGBUILDER),
339        new NameAndTypeConstant(UTF8_APPEND, UTF8_STRING_STRINGBUILDER),
340        new NameAndTypeConstant(UTF8_APPEND, UTF8_OBJECT_STRINGBUILDER),
341        new NameAndTypeConstant(UTF8_TOSTRING, UTF8__STRING),
342
343        new Utf8Constant(""),
344        new Utf8Constant("I"),
345        new Utf8Constant("J"),
346        new Utf8Constant("F"),
347        new Utf8Constant("D"),
348        new Utf8Constant(ClassConstants.INTERNAL_NAME_JAVA_LANG_STRING),
349        new Utf8Constant(ClassConstants.INTERNAL_NAME_JAVA_LANG_STRING_BUFFER),
350        new Utf8Constant(ClassConstants.INTERNAL_NAME_JAVA_LANG_STRING_BUILDER),
351        new Utf8Constant(ClassConstants.INTERNAL_METHOD_NAME_EQUALS),
352        new Utf8Constant(ClassConstants.INTERNAL_METHOD_TYPE_EQUALS),
353        new Utf8Constant(ClassConstants.INTERNAL_METHOD_NAME_LENGTH),
354        new Utf8Constant(ClassConstants.INTERNAL_METHOD_TYPE_LENGTH),
355        new Utf8Constant(ClassConstants.INTERNAL_METHOD_NAME_VALUEOF),
356        new Utf8Constant(ClassConstants.INTERNAL_METHOD_TYPE_VALUEOF_BOOLEAN),
357        new Utf8Constant(ClassConstants.INTERNAL_METHOD_TYPE_VALUEOF_CHAR),
358        new Utf8Constant(ClassConstants.INTERNAL_METHOD_TYPE_VALUEOF_INT),
359        new Utf8Constant(ClassConstants.INTERNAL_METHOD_TYPE_VALUEOF_LONG),
360        new Utf8Constant(ClassConstants.INTERNAL_METHOD_TYPE_VALUEOF_FLOAT),
361        new Utf8Constant(ClassConstants.INTERNAL_METHOD_TYPE_VALUEOF_DOUBLE),
362        new Utf8Constant(ClassConstants.INTERNAL_METHOD_TYPE_VALUEOF_OBJECT),
363        new Utf8Constant(ClassConstants.INTERNAL_METHOD_NAME_INIT),
364        new Utf8Constant(ClassConstants.INTERNAL_METHOD_TYPE_INIT),
365        new Utf8Constant(ClassConstants.INTERNAL_METHOD_TYPE_STRING_VOID),
366        new Utf8Constant(ClassConstants.INTERNAL_METHOD_NAME_TOSTRING),
367        new Utf8Constant(ClassConstants.INTERNAL_METHOD_TYPE_TOSTRING),
368        new Utf8Constant(ClassConstants.INTERNAL_METHOD_NAME_APPEND),
369        new Utf8Constant(ClassConstants.INTERNAL_METHOD_TYPE_BOOLEAN_STRING_BUFFER),
370        new Utf8Constant(ClassConstants.INTERNAL_METHOD_TYPE_CHAR_STRING_BUFFER),
371        new Utf8Constant(ClassConstants.INTERNAL_METHOD_TYPE_INT_STRING_BUFFER),
372        new Utf8Constant(ClassConstants.INTERNAL_METHOD_TYPE_LONG_STRING_BUFFER),
373        new Utf8Constant(ClassConstants.INTERNAL_METHOD_TYPE_FLOAT_STRING_BUFFER),
374        new Utf8Constant(ClassConstants.INTERNAL_METHOD_TYPE_DOUBLE_STRING_BUFFER),
375        new Utf8Constant(ClassConstants.INTERNAL_METHOD_TYPE_STRING_STRING_BUFFER),
376        new Utf8Constant(ClassConstants.INTERNAL_METHOD_TYPE_OBJECT_STRING_BUFFER),
377        new Utf8Constant(ClassConstants.INTERNAL_METHOD_TYPE_BOOLEAN_STRING_BUILDER),
378        new Utf8Constant(ClassConstants.INTERNAL_METHOD_TYPE_CHAR_STRING_BUILDER),
379        new Utf8Constant(ClassConstants.INTERNAL_METHOD_TYPE_INT_STRING_BUILDER),
380        new Utf8Constant(ClassConstants.INTERNAL_METHOD_TYPE_LONG_STRING_BUILDER),
381        new Utf8Constant(ClassConstants.INTERNAL_METHOD_TYPE_FLOAT_STRING_BUILDER),
382        new Utf8Constant(ClassConstants.INTERNAL_METHOD_TYPE_DOUBLE_STRING_BUILDER),
383        new Utf8Constant(ClassConstants.INTERNAL_METHOD_TYPE_STRING_STRING_BUILDER),
384        new Utf8Constant(ClassConstants.INTERNAL_METHOD_TYPE_OBJECT_STRING_BUILDER),
385    };
386
387    public static final Instruction[][][] VARIABLE = new Instruction[][][]
388    {
389        {   // nop = nothing
390            {
391                new SimpleInstruction(InstructionConstants.OP_NOP),
392            },{
393                // Nothing.
394            },
395        },
396        {   // iload/pop = nothing
397            {
398                new VariableInstruction(InstructionConstants.OP_ILOAD, X),
399                new SimpleInstruction(InstructionConstants.OP_POP),
400            },{
401                // Nothing.
402            },
403        },
404        {   // lload/pop2 = nothing
405            {
406                new VariableInstruction(InstructionConstants.OP_LLOAD, X),
407                new SimpleInstruction(InstructionConstants.OP_POP2),
408            },{
409                // Nothing.
410            },
411        },
412        {   // fload/pop = nothing
413            {
414                new VariableInstruction(InstructionConstants.OP_FLOAD, X),
415                new SimpleInstruction(InstructionConstants.OP_POP),
416            },{
417                // Nothing.
418            },
419        },
420        {   // dload/pop2 = nothing
421            {
422                new VariableInstruction(InstructionConstants.OP_DLOAD, X),
423                new SimpleInstruction(InstructionConstants.OP_POP2),
424            },{
425                // Nothing.
426            },
427        },
428        {   // aload/pop = nothing
429            {
430                new VariableInstruction(InstructionConstants.OP_ALOAD, X),
431                new SimpleInstruction(InstructionConstants.OP_POP),
432            },{
433                // Nothing.
434            },
435        },
436        {   // i = i = nothing
437            {
438                new VariableInstruction(InstructionConstants.OP_ILOAD, X),
439                new VariableInstruction(InstructionConstants.OP_ISTORE, X),
440            },{
441                // Nothing.
442            },
443        },
444        {   // l = l = nothing
445            {
446                new VariableInstruction(InstructionConstants.OP_LLOAD, X),
447                new VariableInstruction(InstructionConstants.OP_LSTORE, X),
448            },{
449                // Nothing.
450            },
451        },
452        {   // f = f = nothing
453            {
454                new VariableInstruction(InstructionConstants.OP_FLOAD, X),
455                new VariableInstruction(InstructionConstants.OP_FSTORE, X),
456            },{
457                // Nothing.
458            },
459        },
460        {   // d = d = nothing
461            {
462                new VariableInstruction(InstructionConstants.OP_DLOAD, X),
463                new VariableInstruction(InstructionConstants.OP_DSTORE, X),
464            },{
465                // Nothing.
466            },
467        },
468        {   // a = a = nothing
469            {
470                new VariableInstruction(InstructionConstants.OP_ALOAD, X),
471                new VariableInstruction(InstructionConstants.OP_ASTORE, X),
472            },{
473                // Nothing.
474            },
475        },
476        {   // istore/istore = pop/istore
477            {
478                new VariableInstruction(InstructionConstants.OP_ISTORE, X),
479                new VariableInstruction(InstructionConstants.OP_ISTORE, X),
480            },{
481                new SimpleInstruction(InstructionConstants.OP_POP),
482                new VariableInstruction(InstructionConstants.OP_ISTORE, X),
483            },
484        },
485        {   // lstore/lstore = pop2/lstore
486            {
487                new VariableInstruction(InstructionConstants.OP_LSTORE, X),
488                new VariableInstruction(InstructionConstants.OP_LSTORE, X),
489            },{
490                new SimpleInstruction(InstructionConstants.OP_POP2),
491                new VariableInstruction(InstructionConstants.OP_LSTORE, X),
492            },
493        },
494        {   // fstore/fstore = pop/fstore
495            {
496                new VariableInstruction(InstructionConstants.OP_FSTORE, X),
497                new VariableInstruction(InstructionConstants.OP_FSTORE, X),
498            },{
499                new SimpleInstruction(InstructionConstants.OP_POP),
500                new VariableInstruction(InstructionConstants.OP_FSTORE, X),
501            },
502        },
503        {   // dstore/dstore = pop2/dstore
504            {
505                new VariableInstruction(InstructionConstants.OP_DSTORE, X),
506                new VariableInstruction(InstructionConstants.OP_DSTORE, X),
507            },{
508                new SimpleInstruction(InstructionConstants.OP_POP2),
509                new VariableInstruction(InstructionConstants.OP_DSTORE, X),
510            },
511        },
512        {   // astore/astore = pop/astore
513            {
514                new VariableInstruction(InstructionConstants.OP_ASTORE, X),
515                new VariableInstruction(InstructionConstants.OP_ASTORE, X),
516            },{
517                new SimpleInstruction(InstructionConstants.OP_POP),
518                new VariableInstruction(InstructionConstants.OP_ASTORE, X),
519            },
520        },
521        {   // istore/iload = dup/istore
522            {
523                new VariableInstruction(InstructionConstants.OP_ISTORE, X),
524                new VariableInstruction(InstructionConstants.OP_ILOAD, X),
525            },{
526                new SimpleInstruction(InstructionConstants.OP_DUP),
527                new VariableInstruction(InstructionConstants.OP_ISTORE, X),
528            },
529        },
530        {   // lstore/lload = dup2/lstore
531            {
532                new VariableInstruction(InstructionConstants.OP_LSTORE, X),
533                new VariableInstruction(InstructionConstants.OP_LLOAD, X),
534            },{
535                new SimpleInstruction(InstructionConstants.OP_DUP2),
536                new VariableInstruction(InstructionConstants.OP_LSTORE, X),
537            },
538        },
539        {   // fstore/fload = dup/fstore
540            {
541                new VariableInstruction(InstructionConstants.OP_FSTORE, X),
542                new VariableInstruction(InstructionConstants.OP_FLOAD, X),
543            },{
544                new SimpleInstruction(InstructionConstants.OP_DUP),
545                new VariableInstruction(InstructionConstants.OP_FSTORE, X),
546            },
547        },
548        {   // dstore/dload = dup2/dstore
549            {
550                new VariableInstruction(InstructionConstants.OP_DSTORE, X),
551                new VariableInstruction(InstructionConstants.OP_DLOAD, X),
552            },{
553                new SimpleInstruction(InstructionConstants.OP_DUP2),
554                new VariableInstruction(InstructionConstants.OP_DSTORE, X),
555            },
556        },
557        {   // astore/aload = dup/astore
558            {
559                new VariableInstruction(InstructionConstants.OP_ASTORE, X),
560                new VariableInstruction(InstructionConstants.OP_ALOAD, X),
561            },{
562                new SimpleInstruction(InstructionConstants.OP_DUP),
563                new VariableInstruction(InstructionConstants.OP_ASTORE, X),
564            },
565        },
566    };
567
568    public static final Instruction[][][] ARITHMETIC = new Instruction[][][]
569    {
570        {   // c + i = i + c
571            {
572                new SimpleInstruction(InstructionConstants.OP_ICONST_0, A),
573                new VariableInstruction(InstructionConstants.OP_ILOAD, X),
574                new SimpleInstruction(InstructionConstants.OP_IADD),
575            },{
576                new VariableInstruction(InstructionConstants.OP_ILOAD, X),
577                new SimpleInstruction(InstructionConstants.OP_ICONST_0, A),
578                new SimpleInstruction(InstructionConstants.OP_IADD),
579            },
580        },
581        {   // b + i = i + b
582            {
583                new SimpleInstruction(InstructionConstants.OP_BIPUSH, A),
584                new VariableInstruction(InstructionConstants.OP_ILOAD, X),
585                new SimpleInstruction(InstructionConstants.OP_IADD),
586            },{
587                new VariableInstruction(InstructionConstants.OP_ILOAD, X),
588                new SimpleInstruction(InstructionConstants.OP_BIPUSH, A),
589                new SimpleInstruction(InstructionConstants.OP_IADD),
590            },
591        },
592        {   // s + i = i + s
593            {
594                new SimpleInstruction(InstructionConstants.OP_SIPUSH, A),
595                new VariableInstruction(InstructionConstants.OP_ILOAD, X),
596                new SimpleInstruction(InstructionConstants.OP_IADD),
597            },{
598                new VariableInstruction(InstructionConstants.OP_ILOAD, X),
599                new SimpleInstruction(InstructionConstants.OP_SIPUSH, A),
600                new SimpleInstruction(InstructionConstants.OP_IADD),
601            },
602        },
603        {   // c + i = i + c
604            {
605                new ConstantInstruction(InstructionConstants.OP_LDC, A),
606                new VariableInstruction(InstructionConstants.OP_ILOAD, X),
607                new SimpleInstruction(InstructionConstants.OP_IADD),
608            },{
609                new VariableInstruction(InstructionConstants.OP_ILOAD, X),
610                new ConstantInstruction(InstructionConstants.OP_LDC, A),
611                new SimpleInstruction(InstructionConstants.OP_IADD),
612            },
613        },
614        {   // c * i = i * c
615            {
616                new SimpleInstruction(InstructionConstants.OP_SIPUSH, A),
617                new VariableInstruction(InstructionConstants.OP_ILOAD, X),
618                new SimpleInstruction(InstructionConstants.OP_IMUL),
619            },{
620                new VariableInstruction(InstructionConstants.OP_ILOAD, X),
621                new SimpleInstruction(InstructionConstants.OP_SIPUSH, A),
622                new SimpleInstruction(InstructionConstants.OP_IMUL),
623            },
624        },
625        {   // b * i = i * b
626            {
627                new SimpleInstruction(InstructionConstants.OP_BIPUSH, A),
628                new VariableInstruction(InstructionConstants.OP_ILOAD, X),
629                new SimpleInstruction(InstructionConstants.OP_IMUL),
630            },{
631                new VariableInstruction(InstructionConstants.OP_ILOAD, X),
632                new SimpleInstruction(InstructionConstants.OP_BIPUSH, A),
633                new SimpleInstruction(InstructionConstants.OP_IMUL),
634            },
635        },
636        {   // s * i = i * s
637            {
638                new SimpleInstruction(InstructionConstants.OP_SIPUSH, A),
639                new VariableInstruction(InstructionConstants.OP_ILOAD, X),
640                new SimpleInstruction(InstructionConstants.OP_IMUL),
641            },{
642                new VariableInstruction(InstructionConstants.OP_ILOAD, X),
643                new SimpleInstruction(InstructionConstants.OP_SIPUSH, A),
644                new SimpleInstruction(InstructionConstants.OP_IMUL),
645            },
646        },
647        {   // c * i = i * c
648            {
649                new ConstantInstruction(InstructionConstants.OP_LDC, A),
650                new VariableInstruction(InstructionConstants.OP_ILOAD, X),
651                new SimpleInstruction(InstructionConstants.OP_IMUL),
652            },{
653                new VariableInstruction(InstructionConstants.OP_ILOAD, X),
654                new ConstantInstruction(InstructionConstants.OP_LDC, A),
655                new SimpleInstruction(InstructionConstants.OP_IMUL),
656            },
657        },
658        {   // c + l = l + c
659            {
660                new SimpleInstruction(InstructionConstants.OP_LCONST_0, A),
661                new VariableInstruction(InstructionConstants.OP_LLOAD, X),
662                new SimpleInstruction(InstructionConstants.OP_LADD),
663            },{
664                new VariableInstruction(InstructionConstants.OP_LLOAD, X),
665                new SimpleInstruction(InstructionConstants.OP_LCONST_0, A),
666                new SimpleInstruction(InstructionConstants.OP_LADD),
667            },
668        },
669        {   // c + l = l + c
670            {
671                new ConstantInstruction(InstructionConstants.OP_LDC2_W, A),
672                new VariableInstruction(InstructionConstants.OP_LLOAD, X),
673                new SimpleInstruction(InstructionConstants.OP_LADD),
674            },{
675                new VariableInstruction(InstructionConstants.OP_LLOAD, X),
676                new ConstantInstruction(InstructionConstants.OP_LDC2_W, A),
677                new SimpleInstruction(InstructionConstants.OP_LADD),
678            },
679        },
680        {   // c * l = l * c
681            {
682                new SimpleInstruction(InstructionConstants.OP_LCONST_0, A),
683                new VariableInstruction(InstructionConstants.OP_LLOAD, X),
684                new SimpleInstruction(InstructionConstants.OP_LMUL),
685            },{
686                new VariableInstruction(InstructionConstants.OP_LLOAD, X),
687                new SimpleInstruction(InstructionConstants.OP_LCONST_0, A),
688                new SimpleInstruction(InstructionConstants.OP_LMUL),
689            },
690        },
691        {   // c + f = f + c
692            {
693                new SimpleInstruction(InstructionConstants.OP_FCONST_0, A),
694                new VariableInstruction(InstructionConstants.OP_FLOAD, X),
695                new SimpleInstruction(InstructionConstants.OP_FADD),
696            },{
697                new VariableInstruction(InstructionConstants.OP_FLOAD, X),
698                new SimpleInstruction(InstructionConstants.OP_FCONST_0, A),
699                new SimpleInstruction(InstructionConstants.OP_FADD),
700            },
701        },
702        {   // c + f = f + c
703            {
704                new ConstantInstruction(InstructionConstants.OP_LDC, A),
705                new VariableInstruction(InstructionConstants.OP_FLOAD, X),
706                new SimpleInstruction(InstructionConstants.OP_FADD),
707            },{
708                new VariableInstruction(InstructionConstants.OP_FLOAD, X),
709                new ConstantInstruction(InstructionConstants.OP_LDC, A),
710                new SimpleInstruction(InstructionConstants.OP_FADD),
711            },
712        },
713        {   // c * f = f * c
714            {
715                new SimpleInstruction(InstructionConstants.OP_FCONST_0, A),
716                new VariableInstruction(InstructionConstants.OP_FLOAD, X),
717                new SimpleInstruction(InstructionConstants.OP_FMUL),
718            },{
719                new VariableInstruction(InstructionConstants.OP_FLOAD, X),
720                new SimpleInstruction(InstructionConstants.OP_FCONST_0, A),
721                new SimpleInstruction(InstructionConstants.OP_FMUL),
722            },
723        },
724        {   // c * f = f * c
725            {
726                new ConstantInstruction(InstructionConstants.OP_LDC, A),
727                new VariableInstruction(InstructionConstants.OP_FLOAD, X),
728                new SimpleInstruction(InstructionConstants.OP_LMUL),
729            },{
730                new VariableInstruction(InstructionConstants.OP_FLOAD, X),
731                new ConstantInstruction(InstructionConstants.OP_LDC, A),
732                new SimpleInstruction(InstructionConstants.OP_LMUL),
733            },
734        },
735        {   // c + d = d + c
736            {
737                new SimpleInstruction(InstructionConstants.OP_DCONST_0, A),
738                new VariableInstruction(InstructionConstants.OP_DLOAD, X),
739                new SimpleInstruction(InstructionConstants.OP_DADD),
740            },{
741                new VariableInstruction(InstructionConstants.OP_DLOAD, X),
742                new SimpleInstruction(InstructionConstants.OP_DCONST_0, A),
743                new SimpleInstruction(InstructionConstants.OP_DADD),
744            },
745        },
746        {   // c + d = d + c
747            {
748                new ConstantInstruction(InstructionConstants.OP_LDC2_W, A),
749                new VariableInstruction(InstructionConstants.OP_DLOAD, X),
750                new SimpleInstruction(InstructionConstants.OP_DADD),
751            },{
752                new VariableInstruction(InstructionConstants.OP_DLOAD, X),
753                new ConstantInstruction(InstructionConstants.OP_LDC2_W, A),
754                new SimpleInstruction(InstructionConstants.OP_DADD),
755            },
756        },
757        {   // c * d = d * c
758            {
759                new SimpleInstruction(InstructionConstants.OP_DCONST_0, A),
760                new VariableInstruction(InstructionConstants.OP_DLOAD, X),
761                new SimpleInstruction(InstructionConstants.OP_DMUL),
762            },{
763                new VariableInstruction(InstructionConstants.OP_DLOAD, X),
764                new SimpleInstruction(InstructionConstants.OP_DCONST_0, A),
765                new SimpleInstruction(InstructionConstants.OP_DMUL),
766            },
767        },
768        {   // c * d = d * c
769            {
770                new ConstantInstruction(InstructionConstants.OP_LDC2_W, A),
771                new VariableInstruction(InstructionConstants.OP_DLOAD, X),
772                new SimpleInstruction(InstructionConstants.OP_DMUL),
773            },{
774                new VariableInstruction(InstructionConstants.OP_DLOAD, X),
775                new ConstantInstruction(InstructionConstants.OP_LDC2_W, A),
776                new SimpleInstruction(InstructionConstants.OP_DMUL),
777            },
778        },
779        {   // i = i + c = i += c
780            {
781                new VariableInstruction(InstructionConstants.OP_ILOAD, X),
782                new SimpleInstruction(InstructionConstants.OP_SIPUSH, A),
783                new SimpleInstruction(InstructionConstants.OP_IADD),
784                new VariableInstruction(InstructionConstants.OP_ISTORE, X),
785            },{
786                new VariableInstruction(InstructionConstants.OP_IINC, X, A),
787            },
788        },
789        {   // i = i + b = i += b
790            {
791                new VariableInstruction(InstructionConstants.OP_ILOAD, X),
792                new SimpleInstruction(InstructionConstants.OP_BIPUSH, A),
793                new SimpleInstruction(InstructionConstants.OP_IADD),
794                new VariableInstruction(InstructionConstants.OP_ISTORE, X),
795            },{
796                new VariableInstruction(InstructionConstants.OP_IINC, X, A),
797            },
798        },
799        {   // i = i + s = i += s
800            {
801                new VariableInstruction(InstructionConstants.OP_ILOAD, X),
802                new SimpleInstruction(InstructionConstants.OP_SIPUSH, A),
803                new SimpleInstruction(InstructionConstants.OP_IADD),
804                new VariableInstruction(InstructionConstants.OP_ISTORE, X),
805            },{
806                new VariableInstruction(InstructionConstants.OP_IINC, X, A),
807            },
808        },
809        {   // i = i - -1 = i++
810            {
811                new VariableInstruction(InstructionConstants.OP_ILOAD, X),
812                new SimpleInstruction(InstructionConstants.OP_ICONST_M1),
813                new SimpleInstruction(InstructionConstants.OP_ISUB),
814                new VariableInstruction(InstructionConstants.OP_ISTORE, X),
815            },{
816                new VariableInstruction(InstructionConstants.OP_IINC, X, 1),
817            },
818        },
819        {   // i = i - 1 = i--
820            {
821                new VariableInstruction(InstructionConstants.OP_ILOAD, X),
822                new SimpleInstruction(InstructionConstants.OP_ICONST_1),
823                new SimpleInstruction(InstructionConstants.OP_ISUB),
824                new VariableInstruction(InstructionConstants.OP_ISTORE, X),
825            },{
826                new VariableInstruction(InstructionConstants.OP_IINC, X, -1),
827            },
828        },
829        {   // i = i - 2 = i -= 2
830            {
831                new VariableInstruction(InstructionConstants.OP_ILOAD, X),
832                new SimpleInstruction(InstructionConstants.OP_ICONST_2),
833                new SimpleInstruction(InstructionConstants.OP_ISUB),
834                new VariableInstruction(InstructionConstants.OP_ISTORE, X),
835            },{
836                new VariableInstruction(InstructionConstants.OP_IINC, X, -2),
837            },
838        },
839        {   // i = i - 3 = i -= 3
840            {
841                new VariableInstruction(InstructionConstants.OP_ILOAD, X),
842                new SimpleInstruction(InstructionConstants.OP_ICONST_3),
843                new SimpleInstruction(InstructionConstants.OP_ISUB),
844                new VariableInstruction(InstructionConstants.OP_ISTORE, X),
845            },{
846                new VariableInstruction(InstructionConstants.OP_IINC, X, -3),
847            },
848        },
849        {   // i = i - 4 = i -= 4
850            {
851                new VariableInstruction(InstructionConstants.OP_ILOAD, X),
852                new SimpleInstruction(InstructionConstants.OP_ICONST_4),
853                new SimpleInstruction(InstructionConstants.OP_ISUB),
854                new VariableInstruction(InstructionConstants.OP_ISTORE, X),
855            },{
856                new VariableInstruction(InstructionConstants.OP_IINC, X, -4),
857            },
858        },
859        {   // i = i - 5 = i -= 5
860            {
861                new VariableInstruction(InstructionConstants.OP_ILOAD, X),
862                new SimpleInstruction(InstructionConstants.OP_ICONST_5),
863                new SimpleInstruction(InstructionConstants.OP_ISUB),
864                new VariableInstruction(InstructionConstants.OP_ISTORE, X),
865            },{
866                new VariableInstruction(InstructionConstants.OP_IINC, X, -5),
867            },
868        },
869        {   // ... + 0 = ...
870            {
871                new SimpleInstruction(InstructionConstants.OP_ICONST_0),
872                new SimpleInstruction(InstructionConstants.OP_IADD),
873            },{
874                // Nothing.
875            },
876        },
877        {   // ... + 0L = ...
878            {
879                new SimpleInstruction(InstructionConstants.OP_LCONST_0),
880                new SimpleInstruction(InstructionConstants.OP_LADD),
881            },{
882                // Nothing.
883            },
884        },
885        // Not valid for -0.0.
886//        {   // ... + 0f = ...
887//            {
888//                new SimpleInstruction(InstructionConstants.OP_FCONST_0),
889//                new SimpleInstruction(InstructionConstants.OP_FADD),
890//            },{
891//                // Nothing.
892//            },
893//        },
894//        {   // ... + 0d = ...
895//            {
896//                new SimpleInstruction(InstructionConstants.OP_DCONST_0),
897//                new SimpleInstruction(InstructionConstants.OP_DADD),
898//            },{
899//                // Nothing.
900//            },
901//        },
902        {   // ... - 0 = ...
903            {
904                new SimpleInstruction(InstructionConstants.OP_ICONST_0),
905                new SimpleInstruction(InstructionConstants.OP_ISUB),
906            },{
907                // Nothing.
908            },
909        },
910        {   // ... - 0L = ...
911            {
912                new SimpleInstruction(InstructionConstants.OP_LCONST_0),
913                new SimpleInstruction(InstructionConstants.OP_LSUB),
914            },{
915                // Nothing.
916            },
917        },
918        {   // ... - 0f = ...
919            {
920                new SimpleInstruction(InstructionConstants.OP_FCONST_0),
921                new SimpleInstruction(InstructionConstants.OP_FSUB),
922            },{
923                // Nothing.
924            },
925        },
926        {   // ... - 0d = ...
927            {
928                new SimpleInstruction(InstructionConstants.OP_DCONST_0),
929                new SimpleInstruction(InstructionConstants.OP_DSUB),
930            },{
931                // Nothing.
932            },
933        },
934        {   // ... * -1 = -...
935            {
936                new SimpleInstruction(InstructionConstants.OP_ICONST_M1),
937                new SimpleInstruction(InstructionConstants.OP_IMUL),
938            },{
939                new SimpleInstruction(InstructionConstants.OP_INEG),
940            },
941        },
942        {   // ... * 0 = 0
943            {
944                new SimpleInstruction(InstructionConstants.OP_ICONST_0),
945                new SimpleInstruction(InstructionConstants.OP_IMUL),
946            },{
947                new SimpleInstruction(InstructionConstants.OP_POP),
948                new SimpleInstruction(InstructionConstants.OP_ICONST_0),
949            },
950        },
951        {   // ... * 1 = ...
952            {
953                new SimpleInstruction(InstructionConstants.OP_ICONST_1),
954                new SimpleInstruction(InstructionConstants.OP_IMUL),
955            },{
956                // Nothing.
957            },
958        },
959        {   // ... * 2 = ... << 1
960            {
961                new SimpleInstruction(InstructionConstants.OP_ICONST_2),
962                new SimpleInstruction(InstructionConstants.OP_IMUL),
963            },{
964                new SimpleInstruction(InstructionConstants.OP_ICONST_1),
965                new SimpleInstruction(InstructionConstants.OP_ISHL),
966            },
967        },
968        {   // ... * 4 = ... << 2
969            {
970                new SimpleInstruction(InstructionConstants.OP_ICONST_4),
971                new SimpleInstruction(InstructionConstants.OP_IMUL),
972            },{
973                new SimpleInstruction(InstructionConstants.OP_ICONST_2),
974                new SimpleInstruction(InstructionConstants.OP_ISHL),
975            },
976        },
977        {   // ... * 8 = ... << 3
978            {
979                new SimpleInstruction(InstructionConstants.OP_BIPUSH, 8),
980                new SimpleInstruction(InstructionConstants.OP_IMUL),
981            },{
982                new SimpleInstruction(InstructionConstants.OP_ICONST_3),
983                new SimpleInstruction(InstructionConstants.OP_ISHL),
984            },
985        },
986        {   // ... * 16 = ... << 4
987            {
988                new SimpleInstruction(InstructionConstants.OP_BIPUSH, 16),
989                new SimpleInstruction(InstructionConstants.OP_IMUL),
990            },{
991                new SimpleInstruction(InstructionConstants.OP_BIPUSH, 4),
992                new SimpleInstruction(InstructionConstants.OP_ISHL),
993            },
994        },
995        {   // ... * 32 = ... << 5
996            {
997                new SimpleInstruction(InstructionConstants.OP_BIPUSH, 32),
998                new SimpleInstruction(InstructionConstants.OP_IMUL),
999            },{
1000                new SimpleInstruction(InstructionConstants.OP_BIPUSH, 5),
1001                new SimpleInstruction(InstructionConstants.OP_ISHL),
1002            },
1003        },
1004        {   // ... * 64 = ... << 6
1005            {
1006                new SimpleInstruction(InstructionConstants.OP_BIPUSH, 64),
1007                new SimpleInstruction(InstructionConstants.OP_IMUL),
1008            },{
1009                new SimpleInstruction(InstructionConstants.OP_BIPUSH, 6),
1010                new SimpleInstruction(InstructionConstants.OP_ISHL),
1011            },
1012        },
1013        {   // ... * 128 = ... << 7
1014            {
1015                new SimpleInstruction(InstructionConstants.OP_SIPUSH, 128),
1016                new SimpleInstruction(InstructionConstants.OP_IMUL),
1017            },{
1018                new SimpleInstruction(InstructionConstants.OP_BIPUSH, 7),
1019                new SimpleInstruction(InstructionConstants.OP_ISHL),
1020            },
1021        },
1022        {   // ... * 256 = ... << 8
1023            {
1024                new SimpleInstruction(InstructionConstants.OP_SIPUSH, 256),
1025                new SimpleInstruction(InstructionConstants.OP_IMUL),
1026            },{
1027                new SimpleInstruction(InstructionConstants.OP_BIPUSH, 8),
1028                new SimpleInstruction(InstructionConstants.OP_ISHL),
1029            },
1030        },
1031        {   // ... * 512 = ... << 9
1032            {
1033                new SimpleInstruction(InstructionConstants.OP_SIPUSH, 512),
1034                new SimpleInstruction(InstructionConstants.OP_IMUL),
1035            },{
1036                new SimpleInstruction(InstructionConstants.OP_BIPUSH, 9),
1037                new SimpleInstruction(InstructionConstants.OP_ISHL),
1038            },
1039        },
1040        {   // ... * 1024 = ... << 10
1041            {
1042                new SimpleInstruction(InstructionConstants.OP_SIPUSH, 1024),
1043                new SimpleInstruction(InstructionConstants.OP_IMUL),
1044            },{
1045                new SimpleInstruction(InstructionConstants.OP_BIPUSH, 10),
1046                new SimpleInstruction(InstructionConstants.OP_ISHL),
1047            },
1048        },
1049        {   // ... * 2048 = ... << 11
1050            {
1051                new SimpleInstruction(InstructionConstants.OP_SIPUSH, 2048),
1052                new SimpleInstruction(InstructionConstants.OP_IMUL),
1053            },{
1054                new SimpleInstruction(InstructionConstants.OP_BIPUSH, 11),
1055                new SimpleInstruction(InstructionConstants.OP_ISHL),
1056            },
1057        },
1058        {   // ... * 4096 = ... << 12
1059            {
1060                new SimpleInstruction(InstructionConstants.OP_SIPUSH, 4096),
1061                new SimpleInstruction(InstructionConstants.OP_IMUL),
1062            },{
1063                new SimpleInstruction(InstructionConstants.OP_BIPUSH, 12),
1064                new SimpleInstruction(InstructionConstants.OP_ISHL),
1065            },
1066        },
1067        {   // ... * 8192 = ... << 13
1068            {
1069                new SimpleInstruction(InstructionConstants.OP_SIPUSH, 8192),
1070                new SimpleInstruction(InstructionConstants.OP_IMUL),
1071            },{
1072                new SimpleInstruction(InstructionConstants.OP_BIPUSH, 13),
1073                new SimpleInstruction(InstructionConstants.OP_ISHL),
1074            },
1075        },
1076        {   // ... * 16384 = ... << 14
1077            {
1078                new SimpleInstruction(InstructionConstants.OP_SIPUSH, 16384),
1079                new SimpleInstruction(InstructionConstants.OP_IMUL),
1080            },{
1081                new SimpleInstruction(InstructionConstants.OP_BIPUSH, 14),
1082                new SimpleInstruction(InstructionConstants.OP_ISHL),
1083            },
1084        },
1085        {   // ... * 32768 = ... << 15
1086            {
1087                new ConstantInstruction(InstructionConstants.OP_LDC, I_32768),
1088                new SimpleInstruction(InstructionConstants.OP_IMUL),
1089            },{
1090                new SimpleInstruction(InstructionConstants.OP_BIPUSH, 15),
1091                new SimpleInstruction(InstructionConstants.OP_ISHL),
1092            },
1093        },
1094        {   // ... * 65536 = ... << 16
1095            {
1096                new ConstantInstruction(InstructionConstants.OP_LDC, I_65536),
1097                new SimpleInstruction(InstructionConstants.OP_IMUL),
1098            },{
1099                new SimpleInstruction(InstructionConstants.OP_BIPUSH, 16),
1100                new SimpleInstruction(InstructionConstants.OP_ISHL),
1101            },
1102        },
1103        {   // ... * 16777216 = ... << 24
1104            {
1105                new ConstantInstruction(InstructionConstants.OP_LDC, I_16777216),
1106                new SimpleInstruction(InstructionConstants.OP_IMUL),
1107            },{
1108                new SimpleInstruction(InstructionConstants.OP_BIPUSH, 24),
1109                new SimpleInstruction(InstructionConstants.OP_ISHL),
1110            },
1111        },
1112        {   // ... * -1L = -...
1113            {
1114                new ConstantInstruction(InstructionConstants.OP_LDC2_W, L_M1),
1115                new SimpleInstruction(InstructionConstants.OP_LMUL),
1116            },{
1117                new SimpleInstruction(InstructionConstants.OP_LNEG),
1118            },
1119        },
1120        {   // ... * 0L = 0L
1121            {
1122                new SimpleInstruction(InstructionConstants.OP_LCONST_0),
1123                new SimpleInstruction(InstructionConstants.OP_LMUL),
1124            },{
1125                new SimpleInstruction(InstructionConstants.OP_POP2),
1126                new SimpleInstruction(InstructionConstants.OP_LCONST_0),
1127            },
1128        },
1129        {   // ... * 1L = ...
1130            {
1131                new SimpleInstruction(InstructionConstants.OP_LCONST_1),
1132                new SimpleInstruction(InstructionConstants.OP_LMUL),
1133            },{
1134                // Nothing.
1135            },
1136        },
1137        {   // ... * 2L = ... << 1
1138            {
1139                new ConstantInstruction(InstructionConstants.OP_LDC2_W, L_2),
1140                new SimpleInstruction(InstructionConstants.OP_LMUL),
1141            },{
1142                new SimpleInstruction(InstructionConstants.OP_ICONST_1),
1143                new SimpleInstruction(InstructionConstants.OP_LSHL),
1144            },
1145        },
1146        {   // ... * 4L = ... << 2
1147            {
1148                new ConstantInstruction(InstructionConstants.OP_LDC2_W, L_4),
1149                new SimpleInstruction(InstructionConstants.OP_LMUL),
1150            },{
1151                new SimpleInstruction(InstructionConstants.OP_ICONST_2),
1152                new SimpleInstruction(InstructionConstants.OP_LSHL),
1153            },
1154        },
1155        {   // ... * 8L = ... << 3
1156            {
1157                new ConstantInstruction(InstructionConstants.OP_LDC2_W, L_8),
1158                new SimpleInstruction(InstructionConstants.OP_LMUL),
1159            },{
1160                new SimpleInstruction(InstructionConstants.OP_ICONST_3),
1161                new SimpleInstruction(InstructionConstants.OP_LSHL),
1162            },
1163        },
1164        {   // ... * 16L = ... << 4
1165            {
1166                new ConstantInstruction(InstructionConstants.OP_LDC2_W, L_16),
1167                new SimpleInstruction(InstructionConstants.OP_LMUL),
1168            },{
1169                new SimpleInstruction(InstructionConstants.OP_BIPUSH, 4),
1170                new SimpleInstruction(InstructionConstants.OP_LSHL),
1171            },
1172        },
1173        {   // ... * 32L = ... << 5
1174            {
1175                new ConstantInstruction(InstructionConstants.OP_LDC2_W, L_32),
1176                new SimpleInstruction(InstructionConstants.OP_LMUL),
1177            },{
1178                new SimpleInstruction(InstructionConstants.OP_BIPUSH, 5),
1179                new SimpleInstruction(InstructionConstants.OP_LSHL),
1180            },
1181        },
1182        {   // ... * 64L = ... << 6
1183            {
1184                new ConstantInstruction(InstructionConstants.OP_LDC2_W, L_64),
1185                new SimpleInstruction(InstructionConstants.OP_LMUL),
1186            },{
1187                new SimpleInstruction(InstructionConstants.OP_BIPUSH, 6),
1188                new SimpleInstruction(InstructionConstants.OP_LSHL),
1189            },
1190        },
1191        {   // ... * 128L = ... << 7
1192            {
1193                new ConstantInstruction(InstructionConstants.OP_LDC2_W, L_128),
1194                new SimpleInstruction(InstructionConstants.OP_LMUL),
1195            },{
1196                new SimpleInstruction(InstructionConstants.OP_BIPUSH, 7),
1197                new SimpleInstruction(InstructionConstants.OP_LSHL),
1198            },
1199        },
1200        {   // ... * 256L = ... << 8
1201            {
1202                new ConstantInstruction(InstructionConstants.OP_LDC2_W, L_256),
1203                new SimpleInstruction(InstructionConstants.OP_LMUL),
1204            },{
1205                new SimpleInstruction(InstructionConstants.OP_BIPUSH, 8),
1206                new SimpleInstruction(InstructionConstants.OP_LSHL),
1207            },
1208        },
1209        {   // ... * 512L = ... << 9
1210            {
1211                new ConstantInstruction(InstructionConstants.OP_LDC2_W, L_512),
1212                new SimpleInstruction(InstructionConstants.OP_LMUL),
1213            },{
1214                new SimpleInstruction(InstructionConstants.OP_BIPUSH, 9),
1215                new SimpleInstruction(InstructionConstants.OP_LSHL),
1216            },
1217        },
1218        {   // ... * 1024L = ... << 10
1219            {
1220                new ConstantInstruction(InstructionConstants.OP_LDC2_W, L_1024),
1221                new SimpleInstruction(InstructionConstants.OP_LMUL),
1222            },{
1223                new SimpleInstruction(InstructionConstants.OP_BIPUSH, 10),
1224                new SimpleInstruction(InstructionConstants.OP_LSHL),
1225            },
1226        },
1227        {   // ... * 2048L = ... << 11
1228            {
1229                new ConstantInstruction(InstructionConstants.OP_LDC2_W, L_2048),
1230                new SimpleInstruction(InstructionConstants.OP_LMUL),
1231            },{
1232                new SimpleInstruction(InstructionConstants.OP_BIPUSH, 11),
1233                new SimpleInstruction(InstructionConstants.OP_LSHL),
1234            },
1235        },
1236        {   // ... * 4096L = ... << 12
1237            {
1238                new ConstantInstruction(InstructionConstants.OP_LDC2_W, L_4096),
1239                new SimpleInstruction(InstructionConstants.OP_LMUL),
1240            },{
1241                new SimpleInstruction(InstructionConstants.OP_BIPUSH, 12),
1242                new SimpleInstruction(InstructionConstants.OP_LSHL),
1243            },
1244        },
1245        {   // ... * 8192L = ... << 13
1246            {
1247                new ConstantInstruction(InstructionConstants.OP_LDC2_W, L_8192),
1248                new SimpleInstruction(InstructionConstants.OP_LMUL),
1249            },{
1250                new SimpleInstruction(InstructionConstants.OP_BIPUSH, 13),
1251                new SimpleInstruction(InstructionConstants.OP_LSHL),
1252            },
1253        },
1254        {   // ... * 16384L = ... << 14
1255            {
1256                new ConstantInstruction(InstructionConstants.OP_LDC2_W, L_16384),
1257                new SimpleInstruction(InstructionConstants.OP_LMUL),
1258            },{
1259                new SimpleInstruction(InstructionConstants.OP_BIPUSH, 14),
1260                new SimpleInstruction(InstructionConstants.OP_LSHL),
1261            },
1262        },
1263        {   // ... * 32768L = ... << 15
1264            {
1265                new ConstantInstruction(InstructionConstants.OP_LDC2_W, L_32768),
1266                new SimpleInstruction(InstructionConstants.OP_LMUL),
1267            },{
1268                new SimpleInstruction(InstructionConstants.OP_BIPUSH, 15),
1269                new SimpleInstruction(InstructionConstants.OP_LSHL),
1270            },
1271        },
1272        {   // ... * 65536LL = ... << 16
1273            {
1274                new ConstantInstruction(InstructionConstants.OP_LDC2_W, L_65536),
1275                new SimpleInstruction(InstructionConstants.OP_LMUL),
1276            },{
1277                new SimpleInstruction(InstructionConstants.OP_BIPUSH, 16),
1278                new SimpleInstruction(InstructionConstants.OP_LSHL),
1279            },
1280        },
1281        {   // ... * 16777216L = ... << 24
1282            {
1283                new ConstantInstruction(InstructionConstants.OP_LDC2_W, L_16777216),
1284                new SimpleInstruction(InstructionConstants.OP_LMUL),
1285            },{
1286                new SimpleInstruction(InstructionConstants.OP_BIPUSH, 24),
1287                new SimpleInstruction(InstructionConstants.OP_LSHL),
1288            },
1289        },
1290        {   // ... * 4294967296L = ... << 32
1291            {
1292                new ConstantInstruction(InstructionConstants.OP_LDC2_W, L_4294967296),
1293                new SimpleInstruction(InstructionConstants.OP_LMUL),
1294            },{
1295                new SimpleInstruction(InstructionConstants.OP_BIPUSH, 32),
1296                new SimpleInstruction(InstructionConstants.OP_LSHL),
1297            },
1298        },
1299        {   // ... * -1f = -...
1300            {
1301                new ConstantInstruction(InstructionConstants.OP_LDC, F_M1),
1302                new SimpleInstruction(InstructionConstants.OP_FMUL),
1303            },{
1304                new SimpleInstruction(InstructionConstants.OP_FNEG),
1305            },
1306        },
1307        // Not valid for -0.0 and for NaN.
1308//        {   // ... * 0f = 0f
1309//            {
1310//                new SimpleInstruction(InstructionConstants.OP_FCONST_0),
1311//                new SimpleInstruction(InstructionConstants.OP_FMUL),
1312//            },{
1313//                new SimpleInstruction(InstructionConstants.OP_POP),
1314//                new SimpleInstruction(InstructionConstants.OP_FCONST_0),
1315//            },
1316//        },
1317        {   // ... * 1f = ...
1318            {
1319                new SimpleInstruction(InstructionConstants.OP_FCONST_1),
1320                new SimpleInstruction(InstructionConstants.OP_FMUL),
1321            },{
1322                // Nothing.
1323            },
1324        },
1325        {   // ... * -1d = -...
1326            {
1327                new ConstantInstruction(InstructionConstants.OP_LDC2_W, D_M1),
1328                new SimpleInstruction(InstructionConstants.OP_DMUL),
1329            },{
1330                new SimpleInstruction(InstructionConstants.OP_DNEG),
1331            },
1332        },
1333        // Not valid for -0.0 and for NaN.
1334//        {   // ... * 0d = 0d
1335//            {
1336//                new SimpleInstruction(InstructionConstants.OP_DCONST_0),
1337//                new SimpleInstruction(InstructionConstants.OP_DMUL),
1338//            },{
1339//                new SimpleInstruction(InstructionConstants.OP_POP2),
1340//                new SimpleInstruction(InstructionConstants.OP_DCONST_0),
1341//            },
1342//        },
1343        {   // ... * 1d = ...
1344            {
1345                new SimpleInstruction(InstructionConstants.OP_DCONST_1),
1346                new SimpleInstruction(InstructionConstants.OP_DMUL),
1347            },{
1348                // Nothing.
1349            },
1350        },
1351        {   // ... / -1 = -...
1352            {
1353                new SimpleInstruction(InstructionConstants.OP_ICONST_M1),
1354                new SimpleInstruction(InstructionConstants.OP_IDIV),
1355            },{
1356                new SimpleInstruction(InstructionConstants.OP_INEG),
1357            },
1358        },
1359        {   // ... / 1 = ...
1360            {
1361                new SimpleInstruction(InstructionConstants.OP_ICONST_1),
1362                new SimpleInstruction(InstructionConstants.OP_IDIV),
1363            },{
1364                // Nothing.
1365            },
1366        },
1367        // Not valid for negative values.
1368//        {   // ... / 2 = ... >> 1
1369//            {
1370//                new SimpleInstruction(InstructionConstants.OP_ICONST_2),
1371//                new SimpleInstruction(InstructionConstants.OP_IDIV),
1372//            },{
1373//                new SimpleInstruction(InstructionConstants.OP_ICONST_1),
1374//                new SimpleInstruction(InstructionConstants.OP_ISHR),
1375//            },
1376//        },
1377//        {   // ... / 4 = ... >> 2
1378//            {
1379//                new SimpleInstruction(InstructionConstants.OP_ICONST_4),
1380//                new SimpleInstruction(InstructionConstants.OP_IDIV),
1381//            },{
1382//                new SimpleInstruction(InstructionConstants.OP_ICONST_2),
1383//                new SimpleInstruction(InstructionConstants.OP_ISHR),
1384//            },
1385//        },
1386//        {   // ... / 8 = ... >> 3
1387//            {
1388//                new SimpleInstruction(InstructionConstants.OP_BIPUSH, 8),
1389//                new SimpleInstruction(InstructionConstants.OP_IDIV),
1390//            },{
1391//                new SimpleInstruction(InstructionConstants.OP_ICONST_3),
1392//                new SimpleInstruction(InstructionConstants.OP_ISHR),
1393//            },
1394//        },
1395//        {   // ... / 16 = ... >> 4
1396//            {
1397//                new SimpleInstruction(InstructionConstants.OP_BIPUSH, 16),
1398//                new SimpleInstruction(InstructionConstants.OP_IDIV),
1399//            },{
1400//                new SimpleInstruction(InstructionConstants.OP_BIPUSH, 4),
1401//                new SimpleInstruction(InstructionConstants.OP_ISHR),
1402//            },
1403//        },
1404//        {   // ... / 32 = ... >> 5
1405//            {
1406//                new SimpleInstruction(InstructionConstants.OP_BIPUSH, 32),
1407//                new SimpleInstruction(InstructionConstants.OP_IDIV),
1408//            },{
1409//                new SimpleInstruction(InstructionConstants.OP_BIPUSH, 5),
1410//                new SimpleInstruction(InstructionConstants.OP_ISHR),
1411//            },
1412//        },
1413//        {   // ... / 64 = ... >> 6
1414//            {
1415//                new SimpleInstruction(InstructionConstants.OP_BIPUSH, 64),
1416//                new SimpleInstruction(InstructionConstants.OP_IDIV),
1417//            },{
1418//                new SimpleInstruction(InstructionConstants.OP_BIPUSH, 6),
1419//                new SimpleInstruction(InstructionConstants.OP_ISHR),
1420//            },
1421//        },
1422//        {   // ... / 128 = ... >> 7
1423//            {
1424//                new SimpleInstruction(InstructionConstants.OP_SIPUSH, 128),
1425//                new SimpleInstruction(InstructionConstants.OP_IDIV),
1426//            },{
1427//                new SimpleInstruction(InstructionConstants.OP_BIPUSH, 7),
1428//                new SimpleInstruction(InstructionConstants.OP_ISHR),
1429//            },
1430//        },
1431//        {   // ... / 256 = ... >> 8
1432//            {
1433//                new SimpleInstruction(InstructionConstants.OP_SIPUSH, 256),
1434//                new SimpleInstruction(InstructionConstants.OP_IDIV),
1435//            },{
1436//                new SimpleInstruction(InstructionConstants.OP_BIPUSH, 8),
1437//                new SimpleInstruction(InstructionConstants.OP_ISHR),
1438//            },
1439//        },
1440//        {   // ... / 512 = ... >> 9
1441//            {
1442//                new SimpleInstruction(InstructionConstants.OP_SIPUSH, 512),
1443//                new SimpleInstruction(InstructionConstants.OP_IDIV),
1444//            },{
1445//                new SimpleInstruction(InstructionConstants.OP_BIPUSH, 9),
1446//                new SimpleInstruction(InstructionConstants.OP_ISHR),
1447//            },
1448//        },
1449//        {   // ... / 1024 = ... >> 10
1450//            {
1451//                new SimpleInstruction(InstructionConstants.OP_SIPUSH, 1024),
1452//                new SimpleInstruction(InstructionConstants.OP_IDIV),
1453//            },{
1454//                new SimpleInstruction(InstructionConstants.OP_BIPUSH, 10),
1455//                new SimpleInstruction(InstructionConstants.OP_ISHR),
1456//            },
1457//        },
1458//        {   // ... / 2048 = ... >> 11
1459//            {
1460//                new SimpleInstruction(InstructionConstants.OP_SIPUSH, 2048),
1461//                new SimpleInstruction(InstructionConstants.OP_IDIV),
1462//            },{
1463//                new SimpleInstruction(InstructionConstants.OP_BIPUSH, 11),
1464//                new SimpleInstruction(InstructionConstants.OP_ISHR),
1465//            },
1466//        },
1467//        {   // ... / 4096 = ... >> 12
1468//            {
1469//                new SimpleInstruction(InstructionConstants.OP_SIPUSH, 4096),
1470//                new SimpleInstruction(InstructionConstants.OP_IDIV),
1471//            },{
1472//                new SimpleInstruction(InstructionConstants.OP_BIPUSH, 12),
1473//                new SimpleInstruction(InstructionConstants.OP_ISHR),
1474//            },
1475//        },
1476//        {   // ... / 8192 = ... >> 13
1477//            {
1478//                new SimpleInstruction(InstructionConstants.OP_SIPUSH, 8192),
1479//                new SimpleInstruction(InstructionConstants.OP_IDIV),
1480//            },{
1481//                new SimpleInstruction(InstructionConstants.OP_BIPUSH, 13),
1482//                new SimpleInstruction(InstructionConstants.OP_ISHR),
1483//            },
1484//        },
1485//        {   // ... / 16384 = ... >> 14
1486//            {
1487//                new SimpleInstruction(InstructionConstants.OP_SIPUSH, 16384),
1488//                new SimpleInstruction(InstructionConstants.OP_IDIV),
1489//            },{
1490//                new SimpleInstruction(InstructionConstants.OP_BIPUSH, 14),
1491//                new SimpleInstruction(InstructionConstants.OP_ISHR),
1492//            },
1493//        },
1494//        {   // ... / 32768 = ... >> 15
1495//            {
1496//                new ConstantInstruction(InstructionConstants.OP_LDC, I_32768),
1497//                new SimpleInstruction(InstructionConstants.OP_IDIV),
1498//            },{
1499//                new SimpleInstruction(InstructionConstants.OP_BIPUSH, 15),
1500//                new SimpleInstruction(InstructionConstants.OP_ISHR),
1501//            },
1502//        },
1503//        {   // ... / 65536 = ... >> 16
1504//            {
1505//                new ConstantInstruction(InstructionConstants.OP_LDC, I_65536),
1506//                new SimpleInstruction(InstructionConstants.OP_IDIV),
1507//            },{
1508//                new SimpleInstruction(InstructionConstants.OP_BIPUSH, 16),
1509//                new SimpleInstruction(InstructionConstants.OP_ISHR),
1510//            },
1511//        },
1512//        {   // ... / 16777216 = ... >> 24
1513//            {
1514//                new ConstantInstruction(InstructionConstants.OP_LDC, I_16777216),
1515//                new SimpleInstruction(InstructionConstants.OP_IDIV),
1516//            },{
1517//                new SimpleInstruction(InstructionConstants.OP_BIPUSH, 24),
1518//                new SimpleInstruction(InstructionConstants.OP_ISHR),
1519//            },
1520//        },
1521        {   // ... / -1L = -...
1522            {
1523                new ConstantInstruction(InstructionConstants.OP_LDC2_W, L_M1),
1524                new SimpleInstruction(InstructionConstants.OP_LDIV),
1525            },{
1526                new SimpleInstruction(InstructionConstants.OP_LNEG),
1527            },
1528        },
1529        {   // ... / 1L = ...
1530            {
1531                new SimpleInstruction(InstructionConstants.OP_LCONST_1),
1532                new SimpleInstruction(InstructionConstants.OP_LDIV),
1533            },{
1534                // Nothing.
1535            },
1536        },
1537        // Not valid for negative values.
1538//        {   // ... / 2L = ... >> 1
1539//            {
1540//                new ConstantInstruction(InstructionConstants.OP_LDC2_W, L_2),
1541//                new SimpleInstruction(InstructionConstants.OP_LDIV),
1542//            },{
1543//                new SimpleInstruction(InstructionConstants.OP_ICONST_1),
1544//                new SimpleInstruction(InstructionConstants.OP_LSHR),
1545//            },
1546//        },
1547//        {   // ... / 4L = ... >> 2
1548//            {
1549//                new ConstantInstruction(InstructionConstants.OP_LDC2_W, L_4),
1550//                new SimpleInstruction(InstructionConstants.OP_LDIV),
1551//            },{
1552//                new SimpleInstruction(InstructionConstants.OP_ICONST_2),
1553//                new SimpleInstruction(InstructionConstants.OP_LSHR),
1554//            },
1555//        },
1556//        {   // ... / 8L = ... >> 3
1557//            {
1558//                new ConstantInstruction(InstructionConstants.OP_LDC2_W, L_8),
1559//                new SimpleInstruction(InstructionConstants.OP_LDIV),
1560//            },{
1561//                new SimpleInstruction(InstructionConstants.OP_ICONST_3),
1562//                new SimpleInstruction(InstructionConstants.OP_LSHR),
1563//            },
1564//        },
1565//        {   // ... / 16L = ... >> 4
1566//            {
1567//                new ConstantInstruction(InstructionConstants.OP_LDC2_W, L_16),
1568//                new SimpleInstruction(InstructionConstants.OP_LDIV),
1569//            },{
1570//                new SimpleInstruction(InstructionConstants.OP_BIPUSH, 4),
1571//                new SimpleInstruction(InstructionConstants.OP_LSHR),
1572//            },
1573//        },
1574//        {   // ... / 32L = ... >> 5
1575//            {
1576//                new ConstantInstruction(InstructionConstants.OP_LDC2_W, L_32),
1577//                new SimpleInstruction(InstructionConstants.OP_LDIV),
1578//            },{
1579//                new SimpleInstruction(InstructionConstants.OP_BIPUSH, 5),
1580//                new SimpleInstruction(InstructionConstants.OP_LSHR),
1581//            },
1582//        },
1583//        {   // ... / 64L = ... >> 6
1584//            {
1585//                new ConstantInstruction(InstructionConstants.OP_LDC2_W, L_64),
1586//                new SimpleInstruction(InstructionConstants.OP_LDIV),
1587//            },{
1588//                new SimpleInstruction(InstructionConstants.OP_BIPUSH, 6),
1589//                new SimpleInstruction(InstructionConstants.OP_LSHR),
1590//            },
1591//        },
1592//        {   // ... / 128L = ... >> 7
1593//            {
1594//                new ConstantInstruction(InstructionConstants.OP_LDC2_W, L_128),
1595//                new SimpleInstruction(InstructionConstants.OP_LDIV),
1596//            },{
1597//                new SimpleInstruction(InstructionConstants.OP_BIPUSH, 7),
1598//                new SimpleInstruction(InstructionConstants.OP_LSHR),
1599//            },
1600//        },
1601//        {   // ... / 256L = ... >> 8
1602//            {
1603//                new ConstantInstruction(InstructionConstants.OP_LDC2_W, L_256),
1604//                new SimpleInstruction(InstructionConstants.OP_LDIV),
1605//            },{
1606//                new SimpleInstruction(InstructionConstants.OP_BIPUSH, 8),
1607//                new SimpleInstruction(InstructionConstants.OP_LSHR),
1608//            },
1609//        },
1610//        {   // ... / 512L = ... >> 9
1611//            {
1612//                new ConstantInstruction(InstructionConstants.OP_LDC2_W, L_512),
1613//                new SimpleInstruction(InstructionConstants.OP_LDIV),
1614//            },{
1615//                new SimpleInstruction(InstructionConstants.OP_BIPUSH, 9),
1616//                new SimpleInstruction(InstructionConstants.OP_LSHR),
1617//            },
1618//        },
1619//        {   // ... / 1024L = ... >> 10
1620//            {
1621//                new ConstantInstruction(InstructionConstants.OP_LDC2_W, L_1024),
1622//                new SimpleInstruction(InstructionConstants.OP_LDIV),
1623//            },{
1624//                new SimpleInstruction(InstructionConstants.OP_BIPUSH, 10),
1625//                new SimpleInstruction(InstructionConstants.OP_LSHR),
1626//            },
1627//        },
1628//        {   // ... / 2048L = ... >> 11
1629//            {
1630//                new ConstantInstruction(InstructionConstants.OP_LDC2_W, L_2048),
1631//                new SimpleInstruction(InstructionConstants.OP_LDIV),
1632//            },{
1633//                new SimpleInstruction(InstructionConstants.OP_BIPUSH, 11),
1634//                new SimpleInstruction(InstructionConstants.OP_LSHR),
1635//            },
1636//        },
1637//        {   // ... / 4096L = ... >> 12
1638//            {
1639//                new ConstantInstruction(InstructionConstants.OP_LDC2_W, L_4096),
1640//                new SimpleInstruction(InstructionConstants.OP_LDIV),
1641//            },{
1642//                new SimpleInstruction(InstructionConstants.OP_BIPUSH, 12),
1643//                new SimpleInstruction(InstructionConstants.OP_LSHR),
1644//            },
1645//        },
1646//        {   // ... / 8192L = ... >> 13
1647//            {
1648//                new ConstantInstruction(InstructionConstants.OP_LDC2_W, L_8192),
1649//                new SimpleInstruction(InstructionConstants.OP_LDIV),
1650//            },{
1651//                new SimpleInstruction(InstructionConstants.OP_BIPUSH, 13),
1652//                new SimpleInstruction(InstructionConstants.OP_LSHR),
1653//            },
1654//        },
1655//        {   // ... / 16384L = ... >> 14
1656//            {
1657//                new ConstantInstruction(InstructionConstants.OP_LDC2_W, L_16384),
1658//                new SimpleInstruction(InstructionConstants.OP_LDIV),
1659//            },{
1660//                new SimpleInstruction(InstructionConstants.OP_BIPUSH, 14),
1661//                new SimpleInstruction(InstructionConstants.OP_LSHR),
1662//            },
1663//        },
1664//        {   // ... / 32768L = ... >> 15
1665//            {
1666//                new ConstantInstruction(InstructionConstants.OP_LDC2_W, L_32768),
1667//                new SimpleInstruction(InstructionConstants.OP_LDIV),
1668//            },{
1669//                new SimpleInstruction(InstructionConstants.OP_BIPUSH, 15),
1670//                new SimpleInstruction(InstructionConstants.OP_LSHR),
1671//            },
1672//        },
1673//        {   // ... / 65536LL = ... >> 16
1674//            {
1675//                new ConstantInstruction(InstructionConstants.OP_LDC2_W, L_65536),
1676//                new SimpleInstruction(InstructionConstants.OP_LDIV),
1677//            },{
1678//                new SimpleInstruction(InstructionConstants.OP_BIPUSH, 16),
1679//                new SimpleInstruction(InstructionConstants.OP_LSHR),
1680//            },
1681//        },
1682//        {   // ... / 16777216L = ... >> 24
1683//            {
1684//                new ConstantInstruction(InstructionConstants.OP_LDC2_W, L_16777216),
1685//                new SimpleInstruction(InstructionConstants.OP_LDIV),
1686//            },{
1687//                new SimpleInstruction(InstructionConstants.OP_BIPUSH, 24),
1688//                new SimpleInstruction(InstructionConstants.OP_LSHR),
1689//            },
1690//        },
1691//        {   // ... / 4294967296L = ... >> 32
1692//            {
1693//                new ConstantInstruction(InstructionConstants.OP_LDC2_W, L_4294967296),
1694//                new SimpleInstruction(InstructionConstants.OP_LDIV),
1695//            },{
1696//                new SimpleInstruction(InstructionConstants.OP_BIPUSH, 32),
1697//                new SimpleInstruction(InstructionConstants.OP_LSHR),
1698//            },
1699//        },
1700        {   // ... / -1f = -...
1701            {
1702                new ConstantInstruction(InstructionConstants.OP_LDC, F_M1),
1703                new SimpleInstruction(InstructionConstants.OP_FDIV),
1704            },{
1705                new SimpleInstruction(InstructionConstants.OP_FNEG),
1706            },
1707        },
1708        {   // ... / 1f = ...
1709            {
1710                new SimpleInstruction(InstructionConstants.OP_FCONST_1),
1711                new SimpleInstruction(InstructionConstants.OP_FDIV),
1712            },{
1713                // Nothing.
1714            },
1715        },
1716        {   // ... / -1d = -...
1717            {
1718                new ConstantInstruction(InstructionConstants.OP_LDC2_W, D_M1),
1719                new SimpleInstruction(InstructionConstants.OP_DDIV),
1720            },{
1721                new SimpleInstruction(InstructionConstants.OP_DNEG),
1722            },
1723        },
1724        {   // ... / 1d = ...
1725            {
1726                new SimpleInstruction(InstructionConstants.OP_DCONST_1),
1727                new SimpleInstruction(InstructionConstants.OP_DDIV),
1728            },{
1729                // Nothing.
1730            },
1731        },
1732        {   // ... % 1 = 0
1733            {
1734                new SimpleInstruction(InstructionConstants.OP_ICONST_1),
1735                new SimpleInstruction(InstructionConstants.OP_IREM),
1736            },{
1737                new SimpleInstruction(InstructionConstants.OP_POP),
1738                new SimpleInstruction(InstructionConstants.OP_ICONST_0),
1739            },
1740        },
1741        // Not valid for negative values.
1742//        {   // ... % 2 = ... & 0x1
1743//            {
1744//                new SimpleInstruction(InstructionConstants.OP_ICONST_2),
1745//                new SimpleInstruction(InstructionConstants.OP_IREM),
1746//            },{
1747//                new SimpleInstruction(InstructionConstants.OP_ICONST_1),
1748//                new SimpleInstruction(InstructionConstants.OP_IAND),
1749//            },
1750//        },
1751//        {   // ... % 4 = ... & 0x3
1752//            {
1753//                new SimpleInstruction(InstructionConstants.OP_ICONST_4),
1754//                new SimpleInstruction(InstructionConstants.OP_IREM),
1755//            },{
1756//                new SimpleInstruction(InstructionConstants.OP_ICONST_3),
1757//                new SimpleInstruction(InstructionConstants.OP_IAND),
1758//            },
1759//        },
1760//        {   // ... % 8 = ... & 0x07
1761//            {
1762//                new SimpleInstruction(InstructionConstants.OP_BIPUSH, 8),
1763//                new SimpleInstruction(InstructionConstants.OP_IREM),
1764//            },{
1765//                new SimpleInstruction(InstructionConstants.OP_BIPUSH, 0x07),
1766//                new SimpleInstruction(InstructionConstants.OP_IAND),
1767//            },
1768//        },
1769//        {   // ... % 16 = ... & 0x0f
1770//            {
1771//                new SimpleInstruction(InstructionConstants.OP_BIPUSH, 16),
1772//                new SimpleInstruction(InstructionConstants.OP_IREM),
1773//            },{
1774//                new SimpleInstruction(InstructionConstants.OP_BIPUSH, 0x0f),
1775//                new SimpleInstruction(InstructionConstants.OP_IAND),
1776//            },
1777//        },
1778//        {   // ... % 32 = ... & 0x1f
1779//            {
1780//                new SimpleInstruction(InstructionConstants.OP_BIPUSH, 32),
1781//                new SimpleInstruction(InstructionConstants.OP_IREM),
1782//            },{
1783//                new SimpleInstruction(InstructionConstants.OP_BIPUSH, 0x1f),
1784//                new SimpleInstruction(InstructionConstants.OP_IAND),
1785//            },
1786//        },
1787//        {   // ... % 64 = ... & 0x3f
1788//            {
1789//                new SimpleInstruction(InstructionConstants.OP_BIPUSH, 64),
1790//                new SimpleInstruction(InstructionConstants.OP_IREM),
1791//            },{
1792//                new SimpleInstruction(InstructionConstants.OP_BIPUSH, 0x3f),
1793//                new SimpleInstruction(InstructionConstants.OP_IAND),
1794//            },
1795//        },
1796//        {   // ... % 128 = ... & 0x7f
1797//            {
1798//                new SimpleInstruction(InstructionConstants.OP_SIPUSH, 128),
1799//                new SimpleInstruction(InstructionConstants.OP_IREM),
1800//            },{
1801//                new SimpleInstruction(InstructionConstants.OP_BIPUSH, 0x7f),
1802//                new SimpleInstruction(InstructionConstants.OP_IAND),
1803//            },
1804//        },
1805//        {   // ... % 256 = ... & 0x00ff
1806//            {
1807//                new SimpleInstruction(InstructionConstants.OP_SIPUSH, 256),
1808//                new SimpleInstruction(InstructionConstants.OP_IREM),
1809//            },{
1810//                new SimpleInstruction(InstructionConstants.OP_SIPUSH, 0x00ff),
1811//                new SimpleInstruction(InstructionConstants.OP_IAND),
1812//            },
1813//        },
1814//        {   // ... % 512 = ... & 0x01ff
1815//            {
1816//                new SimpleInstruction(InstructionConstants.OP_SIPUSH, 512),
1817//                new SimpleInstruction(InstructionConstants.OP_IREM),
1818//            },{
1819//                new SimpleInstruction(InstructionConstants.OP_SIPUSH, 0x01ff),
1820//                new SimpleInstruction(InstructionConstants.OP_IAND),
1821//            },
1822//        },
1823//        {   // ... % 1024 = ... & 0x03ff
1824//            {
1825//                new SimpleInstruction(InstructionConstants.OP_SIPUSH, 1024),
1826//                new SimpleInstruction(InstructionConstants.OP_IREM),
1827//            },{
1828//                new SimpleInstruction(InstructionConstants.OP_SIPUSH, 0x03ff),
1829//                new SimpleInstruction(InstructionConstants.OP_IAND),
1830//            },
1831//        },
1832//        {   // ... % 2048 = ... & 0x07ff
1833//            {
1834//                new SimpleInstruction(InstructionConstants.OP_SIPUSH, 2048),
1835//                new SimpleInstruction(InstructionConstants.OP_IREM),
1836//            },{
1837//                new SimpleInstruction(InstructionConstants.OP_SIPUSH, 0x07ff),
1838//                new SimpleInstruction(InstructionConstants.OP_IAND),
1839//            },
1840//        },
1841//        {   // ... % 4096 = ... & 0x0fff
1842//            {
1843//                new SimpleInstruction(InstructionConstants.OP_SIPUSH, 4096),
1844//                new SimpleInstruction(InstructionConstants.OP_IREM),
1845//            },{
1846//                new SimpleInstruction(InstructionConstants.OP_SIPUSH, 0x0fff),
1847//                new SimpleInstruction(InstructionConstants.OP_IAND),
1848//            },
1849//        },
1850//        {   // ... % 8192 = ... & 0x1fff
1851//            {
1852//                new SimpleInstruction(InstructionConstants.OP_SIPUSH, 8192),
1853//                new SimpleInstruction(InstructionConstants.OP_IREM),
1854//            },{
1855//                new SimpleInstruction(InstructionConstants.OP_SIPUSH, 0x1fff),
1856//                new SimpleInstruction(InstructionConstants.OP_IAND),
1857//            },
1858//        },
1859//        {   // ... % 16384 = ... & 0x3fff
1860//            {
1861//                new SimpleInstruction(InstructionConstants.OP_SIPUSH, 16384),
1862//                new SimpleInstruction(InstructionConstants.OP_IREM),
1863//            },{
1864//                new SimpleInstruction(InstructionConstants.OP_SIPUSH, 0x3fff),
1865//                new SimpleInstruction(InstructionConstants.OP_IAND),
1866//            },
1867//        },
1868        {   // ... % 1L = 0L
1869            {
1870                new SimpleInstruction(InstructionConstants.OP_LCONST_1),
1871                new SimpleInstruction(InstructionConstants.OP_LREM),
1872            },{
1873                new SimpleInstruction(InstructionConstants.OP_POP2),
1874                new SimpleInstruction(InstructionConstants.OP_LCONST_0),
1875            },
1876        },
1877//        {   // ... % 1f = 0f
1878//            {
1879//                new SimpleInstruction(InstructionConstants.OP_FCONST_1),
1880//                new SimpleInstruction(InstructionConstants.OP_FREM),
1881//            },{
1882//                new SimpleInstruction(InstructionConstants.OP_POP),
1883//                new SimpleInstruction(InstructionConstants.OP_FCONST_0),
1884//            },
1885//        },
1886//        {   // ... % 1d = 0d
1887//            {
1888//                new SimpleInstruction(InstructionConstants.OP_DCONST_1),
1889//                new SimpleInstruction(InstructionConstants.OP_DREM),
1890//            },{
1891//                new SimpleInstruction(InstructionConstants.OP_POP2),
1892//                new SimpleInstruction(InstructionConstants.OP_DCONST_0),
1893//            },
1894//        },
1895        {   // -(-...) = ...
1896            {
1897                new SimpleInstruction(InstructionConstants.OP_INEG),
1898                new SimpleInstruction(InstructionConstants.OP_INEG),
1899            },{
1900                // Nothing.
1901            },
1902        },
1903        {   // -(-...) = ...
1904            {
1905                new SimpleInstruction(InstructionConstants.OP_LNEG),
1906                new SimpleInstruction(InstructionConstants.OP_LNEG),
1907            },{
1908                // Nothing.
1909            },
1910        },
1911        {   // -(-...) = ...
1912            {
1913                new SimpleInstruction(InstructionConstants.OP_FNEG),
1914                new SimpleInstruction(InstructionConstants.OP_FNEG),
1915            },{
1916                // Nothing.
1917            },
1918        },
1919        {   // -(-...) = ...
1920            {
1921                new SimpleInstruction(InstructionConstants.OP_DNEG),
1922                new SimpleInstruction(InstructionConstants.OP_DNEG),
1923            },{
1924                // Nothing.
1925            },
1926        },
1927        {   // +(-...) = -...
1928            {
1929                new SimpleInstruction(InstructionConstants.OP_INEG),
1930                new SimpleInstruction(InstructionConstants.OP_IADD),
1931            },{
1932                new SimpleInstruction(InstructionConstants.OP_ISUB),
1933            },
1934        },
1935        {   // +(-...) = -...
1936            {
1937                new SimpleInstruction(InstructionConstants.OP_LNEG),
1938                new SimpleInstruction(InstructionConstants.OP_LADD),
1939            },{
1940                new SimpleInstruction(InstructionConstants.OP_LSUB),
1941            },
1942        },
1943        {   // +(-...) = -...
1944            {
1945                new SimpleInstruction(InstructionConstants.OP_FNEG),
1946                new SimpleInstruction(InstructionConstants.OP_FADD),
1947            },{
1948                new SimpleInstruction(InstructionConstants.OP_FSUB),
1949            },
1950        },
1951        {   // +(-...) = -...
1952            {
1953                new SimpleInstruction(InstructionConstants.OP_DNEG),
1954                new SimpleInstruction(InstructionConstants.OP_DADD),
1955            },{
1956                new SimpleInstruction(InstructionConstants.OP_DSUB),
1957            },
1958        },
1959        {   // ... << 0 = ...
1960            {
1961                new SimpleInstruction(InstructionConstants.OP_ICONST_0),
1962                new SimpleInstruction(InstructionConstants.OP_ISHL),
1963            },{
1964                // Nothing.
1965            },
1966        },
1967        {   // ... << 0 = ...
1968            {
1969                new SimpleInstruction(InstructionConstants.OP_ICONST_0),
1970                new SimpleInstruction(InstructionConstants.OP_LSHL),
1971            },{
1972                // Nothing.
1973            },
1974        },
1975        {   // ... >> 0 = ...
1976            {
1977                new SimpleInstruction(InstructionConstants.OP_ICONST_0),
1978                new SimpleInstruction(InstructionConstants.OP_ISHR),
1979            },{
1980                // Nothing.
1981            },
1982        },
1983        {   // ... >> 0 = ...
1984            {
1985                new SimpleInstruction(InstructionConstants.OP_ICONST_0),
1986                new SimpleInstruction(InstructionConstants.OP_LSHR),
1987            },{
1988                // Nothing.
1989            },
1990        },
1991        {   // ... >>> 0 = ...
1992            {
1993                new SimpleInstruction(InstructionConstants.OP_ICONST_0),
1994                new SimpleInstruction(InstructionConstants.OP_IUSHR),
1995            },{
1996                // Nothing.
1997            },
1998        },
1999        {   // ... >>> 0 = ...
2000            {
2001                new SimpleInstruction(InstructionConstants.OP_ICONST_0),
2002                new SimpleInstruction(InstructionConstants.OP_LUSHR),
2003            },{
2004                // Nothing.
2005            },
2006        },
2007        {   // ... & -1 = ...
2008            {
2009                new SimpleInstruction(InstructionConstants.OP_ICONST_M1),
2010                new SimpleInstruction(InstructionConstants.OP_IAND),
2011            },{
2012                // Nothing.
2013            },
2014        },
2015        {   // ... & 0 = 0
2016            {
2017                new SimpleInstruction(InstructionConstants.OP_ICONST_0),
2018                new SimpleInstruction(InstructionConstants.OP_IAND),
2019            },{
2020                new SimpleInstruction(InstructionConstants.OP_POP),
2021                new SimpleInstruction(InstructionConstants.OP_ICONST_0),
2022            },
2023        },
2024        {   // ... & -1L = ...
2025            {
2026                new ConstantInstruction(InstructionConstants.OP_LDC2_W, L_M1),
2027                new SimpleInstruction(InstructionConstants.OP_LAND),
2028            },{
2029                // Nothing.
2030            },
2031        },
2032        {   // ... & 0L = 0L
2033            {
2034                new SimpleInstruction(InstructionConstants.OP_LCONST_0),
2035                new SimpleInstruction(InstructionConstants.OP_LAND),
2036            },{
2037                new SimpleInstruction(InstructionConstants.OP_POP2),
2038                new SimpleInstruction(InstructionConstants.OP_LCONST_0),
2039            },
2040        },
2041        {   // ... | -1 = -1
2042            {
2043                new SimpleInstruction(InstructionConstants.OP_ICONST_M1),
2044                new SimpleInstruction(InstructionConstants.OP_IOR),
2045            },{
2046                new SimpleInstruction(InstructionConstants.OP_POP),
2047                new SimpleInstruction(InstructionConstants.OP_ICONST_M1),
2048            },
2049        },
2050        {   // ... | 0 = ...
2051            {
2052               new SimpleInstruction(InstructionConstants.OP_ICONST_0),
2053               new SimpleInstruction(InstructionConstants.OP_IOR),
2054           },{
2055                // Nothing.
2056            },
2057        },
2058        {   // ... | -1L = -1L
2059            {
2060                new ConstantInstruction(InstructionConstants.OP_LDC2_W, L_M1),
2061                new SimpleInstruction(InstructionConstants.OP_LAND),
2062            },{
2063                new SimpleInstruction(InstructionConstants.OP_POP2),
2064                new ConstantInstruction(InstructionConstants.OP_LDC2_W, L_M1),
2065            },
2066        },
2067        {   // ... | 0L = ...
2068            {
2069                new SimpleInstruction(InstructionConstants.OP_LCONST_0),
2070                new SimpleInstruction(InstructionConstants.OP_LOR),
2071            },{
2072                // Nothing.
2073            },
2074        },
2075        {   // ... ^ 0 = ...
2076            {
2077                new SimpleInstruction(InstructionConstants.OP_ICONST_0),
2078                new SimpleInstruction(InstructionConstants.OP_IXOR),
2079            },{
2080                // Nothing.
2081            },
2082        },
2083        {   // ... ^ 0L = ...
2084            {
2085                new SimpleInstruction(InstructionConstants.OP_LCONST_0),
2086                new SimpleInstruction(InstructionConstants.OP_LXOR),
2087            },{
2088                // Nothing.
2089            },
2090        },
2091        {   // (... & 0x0000ff00) >> 8 = (... >> 8) & 0xff
2092            {
2093                new ConstantInstruction(InstructionConstants.OP_LDC, I_0x0000ff00),
2094                new SimpleInstruction(InstructionConstants.OP_IAND),
2095                new SimpleInstruction(InstructionConstants.OP_BIPUSH, 8),
2096                new SimpleInstruction(InstructionConstants.OP_ISHR),
2097            },{
2098                new SimpleInstruction(InstructionConstants.OP_BIPUSH, 8),
2099                new SimpleInstruction(InstructionConstants.OP_ISHR),
2100                new SimpleInstruction(InstructionConstants.OP_SIPUSH, 0xff),
2101                new SimpleInstruction(InstructionConstants.OP_IAND),
2102            },
2103        },
2104        {   // (... & 0x0000ff00) >>> 8 = (... >>> 8) & 0xff
2105            {
2106                new ConstantInstruction(InstructionConstants.OP_LDC, I_0x0000ff00),
2107                new SimpleInstruction(InstructionConstants.OP_IAND),
2108                new SimpleInstruction(InstructionConstants.OP_BIPUSH, 8),
2109                new SimpleInstruction(InstructionConstants.OP_IUSHR),
2110            },{
2111                new SimpleInstruction(InstructionConstants.OP_BIPUSH, 8),
2112                new SimpleInstruction(InstructionConstants.OP_IUSHR),
2113                new SimpleInstruction(InstructionConstants.OP_SIPUSH, 0xff),
2114                new SimpleInstruction(InstructionConstants.OP_IAND),
2115            },
2116        },
2117        {   // (... & 0x00ff0000) >> 16 = (... >> 16) & 0xff
2118            {
2119                new ConstantInstruction(InstructionConstants.OP_LDC, I_0x00ff0000),
2120                new SimpleInstruction(InstructionConstants.OP_IAND),
2121                new SimpleInstruction(InstructionConstants.OP_BIPUSH, 16),
2122                new SimpleInstruction(InstructionConstants.OP_ISHR),
2123            },{
2124                new SimpleInstruction(InstructionConstants.OP_BIPUSH, 16),
2125                new SimpleInstruction(InstructionConstants.OP_ISHR),
2126                new SimpleInstruction(InstructionConstants.OP_SIPUSH, 0xff),
2127                new SimpleInstruction(InstructionConstants.OP_IAND),
2128            },
2129        },
2130        {   // (... & 0x00ff0000) >>> 16 = (... >>> 16) & 0xff
2131            {
2132                new ConstantInstruction(InstructionConstants.OP_LDC, I_0x00ff0000),
2133                new SimpleInstruction(InstructionConstants.OP_IAND),
2134                new SimpleInstruction(InstructionConstants.OP_BIPUSH, 16),
2135                new SimpleInstruction(InstructionConstants.OP_IUSHR),
2136            },{
2137                new SimpleInstruction(InstructionConstants.OP_BIPUSH, 16),
2138                new SimpleInstruction(InstructionConstants.OP_IUSHR),
2139                new SimpleInstruction(InstructionConstants.OP_SIPUSH, 0xff),
2140                new SimpleInstruction(InstructionConstants.OP_IAND),
2141            },
2142        },
2143        {   // (... & 0xff000000) >> 24 = ... >> 24
2144            {
2145                new ConstantInstruction(InstructionConstants.OP_LDC, I_0xff000000),
2146                new SimpleInstruction(InstructionConstants.OP_IAND),
2147                new SimpleInstruction(InstructionConstants.OP_BIPUSH, 24),
2148                new SimpleInstruction(InstructionConstants.OP_ISHR),
2149            },{
2150                new SimpleInstruction(InstructionConstants.OP_BIPUSH, 24),
2151                new SimpleInstruction(InstructionConstants.OP_ISHR),
2152            },
2153        },
2154        {   // (... & 0xffff0000) >> 16 = ... >> 16
2155            {
2156                new ConstantInstruction(InstructionConstants.OP_LDC, I_0xffff0000),
2157                new SimpleInstruction(InstructionConstants.OP_IAND),
2158                new SimpleInstruction(InstructionConstants.OP_BIPUSH, 16),
2159                new SimpleInstruction(InstructionConstants.OP_ISHR),
2160            },{
2161                new SimpleInstruction(InstructionConstants.OP_BIPUSH, 16),
2162                new SimpleInstruction(InstructionConstants.OP_ISHR),
2163            },
2164        },
2165        {   // (... & 0xffff0000) >>> 16 = ... >>> 16
2166            {
2167                new ConstantInstruction(InstructionConstants.OP_LDC, I_0xffff0000),
2168                new SimpleInstruction(InstructionConstants.OP_IAND),
2169                new SimpleInstruction(InstructionConstants.OP_BIPUSH, 16),
2170                new SimpleInstruction(InstructionConstants.OP_IUSHR),
2171            },{
2172                new SimpleInstruction(InstructionConstants.OP_BIPUSH, 16),
2173                new SimpleInstruction(InstructionConstants.OP_IUSHR),
2174            },
2175        },
2176        {   // (... >> 24) & 0xff = ... >>> 24
2177            {
2178                new SimpleInstruction(InstructionConstants.OP_BIPUSH, 24),
2179                new SimpleInstruction(InstructionConstants.OP_ISHR),
2180                new SimpleInstruction(InstructionConstants.OP_SIPUSH, 0xff),
2181                new SimpleInstruction(InstructionConstants.OP_IAND),
2182            },{
2183                new SimpleInstruction(InstructionConstants.OP_BIPUSH, 24),
2184                new SimpleInstruction(InstructionConstants.OP_IUSHR),
2185            },
2186        },
2187        {   // (... >>> 24) & 0xff = ... >>> 24
2188            {
2189                new SimpleInstruction(InstructionConstants.OP_BIPUSH, 24),
2190                new SimpleInstruction(InstructionConstants.OP_IUSHR),
2191                new SimpleInstruction(InstructionConstants.OP_SIPUSH, 0xff),
2192                new SimpleInstruction(InstructionConstants.OP_IAND),
2193            },{
2194                new SimpleInstruction(InstructionConstants.OP_BIPUSH, 24),
2195                new SimpleInstruction(InstructionConstants.OP_IUSHR),
2196            },
2197        },
2198        {   // (byte)(... & 0x000000ff) = (byte)...
2199            {
2200                new SimpleInstruction(InstructionConstants.OP_SIPUSH, 0xff),
2201                new SimpleInstruction(InstructionConstants.OP_IAND),
2202                new SimpleInstruction(InstructionConstants.OP_I2B),
2203            },{
2204                new SimpleInstruction(InstructionConstants.OP_I2B),
2205            },
2206        },
2207        {   // (char)(... & 0x0000ffff) = (char)...
2208            {
2209                new ConstantInstruction(InstructionConstants.OP_LDC, I_0x0000ffff),
2210                new SimpleInstruction(InstructionConstants.OP_IAND),
2211                new SimpleInstruction(InstructionConstants.OP_I2C),
2212            },{
2213                new SimpleInstruction(InstructionConstants.OP_I2C),
2214            },
2215        },
2216        {   // (short)(... & 0x0000ffff) = (short)...
2217            {
2218                new ConstantInstruction(InstructionConstants.OP_LDC, I_0x0000ffff),
2219                new SimpleInstruction(InstructionConstants.OP_IAND),
2220                new SimpleInstruction(InstructionConstants.OP_I2S),
2221            },{
2222                new SimpleInstruction(InstructionConstants.OP_I2S),
2223            },
2224        },
2225        {   // (byte)(... >> 24) = ... >> 24
2226            {
2227                new SimpleInstruction(InstructionConstants.OP_BIPUSH, 24),
2228                new SimpleInstruction(InstructionConstants.OP_ISHR),
2229                new SimpleInstruction(InstructionConstants.OP_I2B),
2230            },{
2231                new SimpleInstruction(InstructionConstants.OP_BIPUSH, 24),
2232                new SimpleInstruction(InstructionConstants.OP_ISHR),
2233            },
2234        },
2235        {   // (byte)(... >>> 24) = ... >> 24
2236            {
2237                new SimpleInstruction(InstructionConstants.OP_BIPUSH, 24),
2238                new SimpleInstruction(InstructionConstants.OP_IUSHR),
2239                new SimpleInstruction(InstructionConstants.OP_I2B),
2240            },{
2241                new SimpleInstruction(InstructionConstants.OP_BIPUSH, 24),
2242                new SimpleInstruction(InstructionConstants.OP_ISHR),
2243            },
2244        },
2245        {   // (char)(... >> 16) = ... >>> 16
2246            {
2247                new SimpleInstruction(InstructionConstants.OP_BIPUSH, 16),
2248                new SimpleInstruction(InstructionConstants.OP_ISHR),
2249                new SimpleInstruction(InstructionConstants.OP_I2C),
2250            },{
2251                new SimpleInstruction(InstructionConstants.OP_BIPUSH, 16),
2252                new SimpleInstruction(InstructionConstants.OP_IUSHR),
2253            },
2254        },
2255        {   // (char)(... >>> 16) = ... >>> 16
2256            {
2257                new SimpleInstruction(InstructionConstants.OP_BIPUSH, 16),
2258                new SimpleInstruction(InstructionConstants.OP_IUSHR),
2259                new SimpleInstruction(InstructionConstants.OP_I2C),
2260            },{
2261                new SimpleInstruction(InstructionConstants.OP_BIPUSH, 16),
2262                new SimpleInstruction(InstructionConstants.OP_IUSHR),
2263            },
2264        },
2265        {   // (short)(... >> 16) = ... >> 16
2266            {
2267                new SimpleInstruction(InstructionConstants.OP_BIPUSH, 16),
2268                new SimpleInstruction(InstructionConstants.OP_ISHR),
2269                new SimpleInstruction(InstructionConstants.OP_I2S),
2270            },{
2271                new SimpleInstruction(InstructionConstants.OP_BIPUSH, 16),
2272                new SimpleInstruction(InstructionConstants.OP_ISHR),
2273            },
2274        },
2275        {   // (short)(... >>> 16) = ... >> 16
2276            {
2277                new SimpleInstruction(InstructionConstants.OP_BIPUSH, 16),
2278                new SimpleInstruction(InstructionConstants.OP_IUSHR),
2279                new SimpleInstruction(InstructionConstants.OP_I2S),
2280            },{
2281                new SimpleInstruction(InstructionConstants.OP_BIPUSH, 16),
2282                new SimpleInstruction(InstructionConstants.OP_ISHR),
2283            },
2284        },
2285        {   // ... << 24 >> 24 = (byte)...
2286            {
2287                new SimpleInstruction(InstructionConstants.OP_BIPUSH, 24),
2288                new SimpleInstruction(InstructionConstants.OP_ISHL),
2289                new SimpleInstruction(InstructionConstants.OP_BIPUSH, 24),
2290                new SimpleInstruction(InstructionConstants.OP_ISHR),
2291            },{
2292                new SimpleInstruction(InstructionConstants.OP_I2B),
2293            },
2294        },
2295        {   // ... << 16 >>> 16 = (char)...
2296            {
2297                new SimpleInstruction(InstructionConstants.OP_BIPUSH, 16),
2298                new SimpleInstruction(InstructionConstants.OP_ISHL),
2299                new SimpleInstruction(InstructionConstants.OP_BIPUSH, 16),
2300                new SimpleInstruction(InstructionConstants.OP_IUSHR),
2301            },{
2302                new SimpleInstruction(InstructionConstants.OP_I2C),
2303            },
2304        },
2305        {   // ... << 16 >> 16 = (short)...
2306            {
2307                new SimpleInstruction(InstructionConstants.OP_BIPUSH, 16),
2308                new SimpleInstruction(InstructionConstants.OP_ISHL),
2309                new SimpleInstruction(InstructionConstants.OP_BIPUSH, 16),
2310                new SimpleInstruction(InstructionConstants.OP_ISHR),
2311            },{
2312                new SimpleInstruction(InstructionConstants.OP_I2S),
2313            },
2314        },
2315        {   // ... << 32 >> 32 = (long)(int)...
2316            {
2317                new SimpleInstruction(InstructionConstants.OP_BIPUSH, 32),
2318                new SimpleInstruction(InstructionConstants.OP_LSHL),
2319                new SimpleInstruction(InstructionConstants.OP_BIPUSH, 32),
2320                new SimpleInstruction(InstructionConstants.OP_LSHR),
2321            },{
2322                new SimpleInstruction(InstructionConstants.OP_L2I),
2323                new SimpleInstruction(InstructionConstants.OP_I2L),
2324            },
2325        },
2326        {   // (int)(... & 0x00000000ffffffffL) = (int)...
2327            {
2328                new ConstantInstruction(InstructionConstants.OP_LDC2_W, L_0x00000000ffffffff),
2329                new SimpleInstruction(InstructionConstants.OP_LAND),
2330                new SimpleInstruction(InstructionConstants.OP_L2I),
2331            },{
2332                new SimpleInstruction(InstructionConstants.OP_L2I),
2333            },
2334        },
2335        {   // (... & 0xffffffff00000000L) >> 32 = ... >> 32
2336            {
2337                new ConstantInstruction(InstructionConstants.OP_LDC2_W, L_0xffffffff00000000),
2338                new SimpleInstruction(InstructionConstants.OP_LAND),
2339                new SimpleInstruction(InstructionConstants.OP_BIPUSH, 32),
2340                new SimpleInstruction(InstructionConstants.OP_LSHR),
2341            },{
2342                new SimpleInstruction(InstructionConstants.OP_BIPUSH, 32),
2343                new SimpleInstruction(InstructionConstants.OP_LSHR),
2344            },
2345        },
2346        {   // (... & 0xffffffff00000000L) >>> 32 = ... >>> 32
2347            {
2348                new ConstantInstruction(InstructionConstants.OP_LDC2_W, L_0xffffffff00000000),
2349                new SimpleInstruction(InstructionConstants.OP_LAND),
2350                new SimpleInstruction(InstructionConstants.OP_BIPUSH, 32),
2351                new SimpleInstruction(InstructionConstants.OP_LUSHR),
2352            },{
2353                new SimpleInstruction(InstructionConstants.OP_BIPUSH, 32),
2354                new SimpleInstruction(InstructionConstants.OP_LUSHR),
2355            },
2356        },
2357        {   // ... += 0 = nothing
2358            {
2359                new VariableInstruction(InstructionConstants.OP_IINC, X, 0),
2360            },{
2361                // Nothing.
2362            },
2363        },
2364    };
2365
2366    public static final Instruction[][][] FIELD = new Instruction[][][]
2367    {
2368        {   // getfield/putfield = nothing
2369            {
2370                new VariableInstruction(InstructionConstants.OP_ALOAD, X),
2371                new VariableInstruction(InstructionConstants.OP_ALOAD, X),
2372                new ConstantInstruction(InstructionConstants.OP_GETFIELD, Y),
2373                new ConstantInstruction(InstructionConstants.OP_PUTFIELD, Y),
2374            },{
2375                // Nothing.
2376            },
2377        },
2378//        {   // putfield_L/putfield_L = pop2_x1/putfield
2379//            {
2380//                new VariableInstruction(InstructionConstants.OP_ALOAD, X),
2381//                // ...
2382//                new ConstantInstruction(InstructionConstants.OP_PUTFIELD, FIELD_L),
2383//                new VariableInstruction(InstructionConstants.OP_ALOAD, X),
2384//                // ...
2385//                new ConstantInstruction(InstructionConstants.OP_PUTFIELD, FIELD_L),
2386//            },{
2387//                new VariableInstruction(InstructionConstants.OP_ALOAD, X),
2388//                // ...
2389//                new SimpleInstruction(InstructionConstants.OP_POP2),
2390//                // ...
2391//                new ConstantInstruction(InstructionConstants.OP_PUTFIELD, FIELD_L),
2392//            },
2393//        },
2394//        {   // putfield_D/putfield_D = pop2_x1/putfield
2395//            {
2396//                new VariableInstruction(InstructionConstants.OP_ALOAD, X),
2397//                // ...
2398//                new ConstantInstruction(InstructionConstants.OP_PUTFIELD, FIELD_D),
2399//                new VariableInstruction(InstructionConstants.OP_ALOAD, X),
2400//                // ...
2401//                new ConstantInstruction(InstructionConstants.OP_PUTFIELD, FIELD_D),
2402//            },{
2403//                new VariableInstruction(InstructionConstants.OP_ALOAD, X),
2404//                // ...
2405//                new SimpleInstruction(InstructionConstants.OP_POP2),
2406//                // ...
2407//                new ConstantInstruction(InstructionConstants.OP_PUTFIELD, FIELD_D),
2408//            },
2409//        },
2410//        {   // putfield/putfield = pop_x1/putfield
2411//            {
2412//                new VariableInstruction(InstructionConstants.OP_ALOAD, X),
2413//                // ...
2414//                new ConstantInstruction(InstructionConstants.OP_PUTFIELD, Y),
2415//                new VariableInstruction(InstructionConstants.OP_ALOAD, X),
2416//                // ...
2417//                new ConstantInstruction(InstructionConstants.OP_PUTFIELD, Y),
2418//            },{
2419//                new VariableInstruction(InstructionConstants.OP_ALOAD, X),
2420//                // ...
2421//                new SimpleInstruction(InstructionConstants.OP_POP),
2422//                // ...
2423//                new ConstantInstruction(InstructionConstants.OP_PUTFIELD, Y),
2424//            },
2425//        },
2426//        {   // putfield_L/getfield_L = dup2_x1/putfield
2427//            {
2428//                new VariableInstruction(InstructionConstants.OP_ALOAD, X),
2429//                // ...
2430//                new ConstantInstruction(InstructionConstants.OP_PUTFIELD, FIELD_L),
2431//                new VariableInstruction(InstructionConstants.OP_ALOAD, X),
2432//                new ConstantInstruction(InstructionConstants.OP_GETFIELD, FIELD_L),
2433//            },{
2434//                new VariableInstruction(InstructionConstants.OP_ALOAD, X),
2435//                // ...
2436//                new SimpleInstruction(InstructionConstants.OP_DUP2_X1),
2437//                new ConstantInstruction(InstructionConstants.OP_PUTFIELD, FIELD_L),
2438//            },
2439//        },
2440//        {   // putfield_D/getfield_D = dup2_x1/putfield
2441//            {
2442//                new VariableInstruction(InstructionConstants.OP_ALOAD, X),
2443//                // ...
2444//                new ConstantInstruction(InstructionConstants.OP_PUTFIELD, FIELD_D),
2445//                new VariableInstruction(InstructionConstants.OP_ALOAD, X),
2446//                new ConstantInstruction(InstructionConstants.OP_GETFIELD, FIELD_D),
2447//            },{
2448//                new VariableInstruction(InstructionConstants.OP_ALOAD, X),
2449//                // ...
2450//                new SimpleInstruction(InstructionConstants.OP_DUP2_X1),
2451//                new ConstantInstruction(InstructionConstants.OP_PUTFIELD, FIELD_D),
2452//            },
2453//        },
2454//        {   // putfield/getfield = dup_x1/putfield
2455//            {
2456//                new VariableInstruction(InstructionConstants.OP_ALOAD, X),
2457//                // ...
2458//                new ConstantInstruction(InstructionConstants.OP_PUTFIELD, Y),
2459//                new VariableInstruction(InstructionConstants.OP_ALOAD, X),
2460//                new ConstantInstruction(InstructionConstants.OP_GETFIELD, Y),
2461//            },{
2462//                new VariableInstruction(InstructionConstants.OP_ALOAD, X),
2463//                // ...
2464//                new SimpleInstruction(InstructionConstants.OP_DUP_X1),
2465//                new ConstantInstruction(InstructionConstants.OP_PUTFIELD, Y),
2466//            },
2467//        },
2468        {   // getstatic/putstatic = nothing
2469            {
2470                new ConstantInstruction(InstructionConstants.OP_GETSTATIC, X),
2471                new ConstantInstruction(InstructionConstants.OP_PUTSTATIC, X),
2472            },{
2473                // Nothing.
2474            },
2475        },
2476        {   // putstatic_L/putstatic_L = pop2/putstatic
2477            {
2478                new ConstantInstruction(InstructionConstants.OP_PUTSTATIC, FIELD_L),
2479                new ConstantInstruction(InstructionConstants.OP_PUTSTATIC, FIELD_L),
2480            },{
2481                new SimpleInstruction(InstructionConstants.OP_POP2),
2482                new ConstantInstruction(InstructionConstants.OP_PUTSTATIC, FIELD_L),
2483            },
2484        },
2485        {   // putstatic_D/putstatic_D = pop2/putstatic
2486            {
2487                new ConstantInstruction(InstructionConstants.OP_PUTSTATIC, FIELD_D),
2488                new ConstantInstruction(InstructionConstants.OP_PUTSTATIC, FIELD_D),
2489            },{
2490                new SimpleInstruction(InstructionConstants.OP_POP2),
2491                new ConstantInstruction(InstructionConstants.OP_PUTSTATIC, FIELD_D),
2492            },
2493        },
2494        {   // putstatic/putstatic = pop/putstatic
2495            {
2496                new ConstantInstruction(InstructionConstants.OP_PUTSTATIC, X),
2497                new ConstantInstruction(InstructionConstants.OP_PUTSTATIC, X),
2498            },{
2499                new SimpleInstruction(InstructionConstants.OP_POP),
2500                new ConstantInstruction(InstructionConstants.OP_PUTSTATIC, X),
2501            },
2502        },
2503        {   // putstatic_L/getstatic_L = dup2/putstatic
2504            {
2505                new ConstantInstruction(InstructionConstants.OP_PUTSTATIC, FIELD_L),
2506                new ConstantInstruction(InstructionConstants.OP_GETSTATIC, FIELD_L),
2507            },{
2508                new SimpleInstruction(InstructionConstants.OP_DUP2),
2509                new ConstantInstruction(InstructionConstants.OP_PUTSTATIC, FIELD_L),
2510            },
2511        },
2512        {   // putstatic_D/getstatic_D = dup2/putstatic
2513            {
2514                new ConstantInstruction(InstructionConstants.OP_PUTSTATIC, FIELD_D),
2515                new ConstantInstruction(InstructionConstants.OP_GETSTATIC, FIELD_D),
2516            },{
2517                new SimpleInstruction(InstructionConstants.OP_DUP2),
2518                new ConstantInstruction(InstructionConstants.OP_PUTSTATIC, FIELD_D),
2519            },
2520        },
2521        {   // putstatic/getstatic = dup/putstatic
2522            {
2523                new ConstantInstruction(InstructionConstants.OP_PUTSTATIC, X),
2524                new ConstantInstruction(InstructionConstants.OP_GETSTATIC, X),
2525            },{
2526                new SimpleInstruction(InstructionConstants.OP_DUP),
2527                new ConstantInstruction(InstructionConstants.OP_PUTSTATIC, X),
2528            },
2529        },
2530    };
2531
2532    public static final Instruction[][][] CAST = new Instruction[][][]
2533    {
2534        {   // (byte)(byte)... = (byte)...
2535            {
2536                new SimpleInstruction(InstructionConstants.OP_I2B),
2537                new SimpleInstruction(InstructionConstants.OP_I2B),
2538            },{
2539                new SimpleInstruction(InstructionConstants.OP_I2B),
2540            },
2541        },
2542        {   // (byte)(char)... = (byte)...
2543            {
2544                new SimpleInstruction(InstructionConstants.OP_I2C),
2545                new SimpleInstruction(InstructionConstants.OP_I2B),
2546            },{
2547                new SimpleInstruction(InstructionConstants.OP_I2B),
2548            },
2549        },
2550        {   // (byte)(short)... = (byte)...
2551            {
2552                new SimpleInstruction(InstructionConstants.OP_I2S),
2553                new SimpleInstruction(InstructionConstants.OP_I2B),
2554            },{
2555                new SimpleInstruction(InstructionConstants.OP_I2B),
2556            },
2557        },
2558        {   // (char)(char)... = (char)...
2559            {
2560                new SimpleInstruction(InstructionConstants.OP_I2C),
2561                new SimpleInstruction(InstructionConstants.OP_I2C),
2562            },{
2563                new SimpleInstruction(InstructionConstants.OP_I2C),
2564            },
2565        },
2566        {   // (char)(short)... = (char)...
2567            {
2568                new SimpleInstruction(InstructionConstants.OP_I2S),
2569                new SimpleInstruction(InstructionConstants.OP_I2C),
2570            },{
2571                new SimpleInstruction(InstructionConstants.OP_I2C),
2572            },
2573        },
2574        {   // (short)(byte)... = (byte)...
2575            {
2576                new SimpleInstruction(InstructionConstants.OP_I2B),
2577                new SimpleInstruction(InstructionConstants.OP_I2S),
2578            },{
2579                new SimpleInstruction(InstructionConstants.OP_I2B),
2580            },
2581        },
2582        {   // (short)(char)... = (short)...
2583            {
2584                new SimpleInstruction(InstructionConstants.OP_I2C),
2585                new SimpleInstruction(InstructionConstants.OP_I2S),
2586            },{
2587                new SimpleInstruction(InstructionConstants.OP_I2S),
2588            },
2589        },
2590        {   // (short)(short)... = (short)...
2591            {
2592                new SimpleInstruction(InstructionConstants.OP_I2S),
2593                new SimpleInstruction(InstructionConstants.OP_I2S),
2594            },{
2595                new SimpleInstruction(InstructionConstants.OP_I2S),
2596            },
2597        },
2598        {   // (int)(long)... = ...
2599            {
2600                new SimpleInstruction(InstructionConstants.OP_I2L),
2601                new SimpleInstruction(InstructionConstants.OP_L2I),
2602            },{
2603                // Nothing.
2604            },
2605        },
2606        {   // (X)(X)... = (X)...
2607            {
2608                new ConstantInstruction(InstructionConstants.OP_CHECKCAST, X),
2609                new ConstantInstruction(InstructionConstants.OP_CHECKCAST, X),
2610            },{
2611                new ConstantInstruction(InstructionConstants.OP_CHECKCAST, X),
2612            },
2613        },
2614        // Not handled correctly in all cases by VMs prior to Java 6...
2615//        {   // (byte)bytes[...] = bytes[...]
2616//            {
2617//                new SimpleInstruction(InstructionConstants.OP_BALOAD),
2618//                new SimpleInstruction(InstructionConstants.OP_I2B),
2619//            },{
2620//                new SimpleInstruction(InstructionConstants.OP_BALOAD),
2621//            },
2622//        },
2623//        {   // (short)bytes[...] = bytes[...]
2624//            {
2625//                 new SimpleInstruction(InstructionConstants.OP_BALOAD),
2626//                 new SimpleInstruction(InstructionConstants.OP_I2S),
2627//             },{
2628//                new SimpleInstruction(InstructionConstants.OP_BALOAD),
2629//            },
2630//        },
2631//        {   // (char)chars[...] = chars[...]
2632//            {
2633//                new SimpleInstruction(InstructionConstants.OP_CALOAD),
2634//                new SimpleInstruction(InstructionConstants.OP_I2C),
2635//            },{
2636//                new SimpleInstruction(InstructionConstants.OP_CALOAD),
2637//            },
2638//        },
2639//        {   // (short)shorts[...] = shorts[...]
2640//            {
2641//                new SimpleInstruction(InstructionConstants.OP_SALOAD),
2642//                new SimpleInstruction(InstructionConstants.OP_I2S),
2643//            },{
2644//                new SimpleInstruction(InstructionConstants.OP_SALOAD),
2645//            },
2646//        },
2647//        {   // bytes[...] = (byte)... = bytes[...] = ...
2648//            {
2649//                new SimpleInstruction(InstructionConstants.OP_I2B),
2650//                new SimpleInstruction(InstructionConstants.OP_BASTORE),
2651//            },{
2652//                new SimpleInstruction(InstructionConstants.OP_BASTORE),
2653//            },
2654//        },
2655//        {   // chars[...] = (char)... = chars[...] = ...
2656//            {
2657//                new SimpleInstruction(InstructionConstants.OP_I2C),
2658//                new SimpleInstruction(InstructionConstants.OP_CASTORE),
2659//            },{
2660//                new SimpleInstruction(InstructionConstants.OP_CASTORE),
2661//            },
2662//        },
2663//        {   // shorts[...] = (short)... = shorts[...] = ...
2664//            {
2665//                new SimpleInstruction(InstructionConstants.OP_I2S),
2666//                new SimpleInstruction(InstructionConstants.OP_SASTORE),
2667//            },{
2668//                new SimpleInstruction(InstructionConstants.OP_SASTORE),
2669//            },
2670//        },
2671    };
2672
2673    public static final Instruction[][][] BRANCH = new Instruction[][][]
2674    {
2675        {   // goto +3 = nothing
2676            {
2677                new BranchInstruction(InstructionConstants.OP_GOTO, 3),
2678            },{
2679                // Nothing.
2680            },
2681        },
2682        {   // ifeq +3 = pop
2683            {
2684                new BranchInstruction(InstructionConstants.OP_IFEQ, 3),
2685            },{
2686                new SimpleInstruction(InstructionConstants.OP_POP),
2687            },
2688        },
2689        {   // ifne +3 = pop
2690            {
2691                new BranchInstruction(InstructionConstants.OP_IFNE, 3),
2692            },{
2693                new SimpleInstruction(InstructionConstants.OP_POP),
2694            },
2695        },
2696        {   // iflt +3 = pop
2697            {
2698                new BranchInstruction(InstructionConstants.OP_IFLT, 3),
2699            },{
2700                new SimpleInstruction(InstructionConstants.OP_POP),
2701            },
2702        },
2703        {   // ifge +3 = pop
2704            {
2705                new BranchInstruction(InstructionConstants.OP_IFGE, 3),
2706            },{
2707                new SimpleInstruction(InstructionConstants.OP_POP),
2708            },
2709        },
2710        {   // ifgt +3 = pop
2711            {
2712                new BranchInstruction(InstructionConstants.OP_IFGT, 3),
2713            },{
2714                new SimpleInstruction(InstructionConstants.OP_POP),
2715            },
2716        },
2717        {   // ifle +3 = pop
2718            {
2719                new BranchInstruction(InstructionConstants.OP_IFLE, 3),
2720            },{
2721                new SimpleInstruction(InstructionConstants.OP_POP),
2722            },
2723        },
2724        {   // ificmpeq +3 = pop2
2725            {
2726                new BranchInstruction(InstructionConstants.OP_IFICMPEQ, 3),
2727            },{
2728                new SimpleInstruction(InstructionConstants.OP_POP2),
2729            },
2730        },
2731        {   // ificmpne +3 = pop2
2732            {
2733                new BranchInstruction(InstructionConstants.OP_IFICMPNE, 3),
2734            },{
2735                new SimpleInstruction(InstructionConstants.OP_POP2),
2736            },
2737        },
2738        {   // ificmplt +3 = pop2
2739            {
2740                new BranchInstruction(InstructionConstants.OP_IFICMPLT, 3),
2741            },{
2742                new SimpleInstruction(InstructionConstants.OP_POP2),
2743            },
2744        },
2745        {   // ificmpge +3 = pop2
2746            {
2747                new BranchInstruction(InstructionConstants.OP_IFICMPGE, 3),
2748            },{
2749                new SimpleInstruction(InstructionConstants.OP_POP2),
2750            },
2751        },
2752        {   // ificmpgt +3 = pop2
2753            {
2754                new BranchInstruction(InstructionConstants.OP_IFICMPGT, 3),
2755            },{
2756                new SimpleInstruction(InstructionConstants.OP_POP2),
2757            },
2758        },
2759        {   // ificmple +3 = pop2
2760            {
2761                new BranchInstruction(InstructionConstants.OP_IFICMPLE, 3),
2762            },{
2763                new SimpleInstruction(InstructionConstants.OP_POP2),
2764            },
2765        },
2766        {   // ifacmpeq +3 = pop2
2767            {
2768                new BranchInstruction(InstructionConstants.OP_IFACMPEQ, 3),
2769            },{
2770                new SimpleInstruction(InstructionConstants.OP_POP2),
2771            },
2772        },
2773        {   // ifacmpne +3 = pop2
2774            {
2775                new BranchInstruction(InstructionConstants.OP_IFACMPNE, 3),
2776            },{
2777                new SimpleInstruction(InstructionConstants.OP_POP2),
2778            },
2779        },
2780        {   // ifnull +3 = pop
2781            {
2782                new BranchInstruction(InstructionConstants.OP_IFNULL, 3),
2783            },{
2784                new SimpleInstruction(InstructionConstants.OP_POP),
2785            },
2786        },
2787        {   // ifnonnull +3 = pop
2788            {
2789                new BranchInstruction(InstructionConstants.OP_IFNONNULL, 3),
2790            },{
2791                new SimpleInstruction(InstructionConstants.OP_POP),
2792            },
2793        },
2794        {   // if (... == 0) = ifeq
2795            {
2796                new SimpleInstruction(InstructionConstants.OP_ICONST_0),
2797                new BranchInstruction(InstructionConstants.OP_IFICMPEQ, X),
2798            },{
2799                new BranchInstruction(InstructionConstants.OP_IFEQ, X),
2800            },
2801        },
2802        {   // if (0 == i) = iload/ifeq
2803            {
2804                new SimpleInstruction(InstructionConstants.OP_ICONST_0),
2805                new VariableInstruction(InstructionConstants.OP_ILOAD, Y),
2806                new BranchInstruction(InstructionConstants.OP_IFICMPEQ, X),
2807            },{
2808                new VariableInstruction(InstructionConstants.OP_ILOAD, Y),
2809                new BranchInstruction(InstructionConstants.OP_IFEQ, X),
2810            },
2811        },
2812        {   // if (0 == i) = getstatic/ifeq
2813            {
2814                new SimpleInstruction(InstructionConstants.OP_ICONST_0),
2815                new ConstantInstruction(InstructionConstants.OP_GETSTATIC, Y),
2816                new BranchInstruction(InstructionConstants.OP_IFICMPEQ, X),
2817            },{
2818                new ConstantInstruction(InstructionConstants.OP_GETSTATIC, Y),
2819                new BranchInstruction(InstructionConstants.OP_IFEQ, X),
2820            },
2821        },
2822        {   // if (0 == i) = getfield/ifeq
2823            {
2824                new SimpleInstruction(InstructionConstants.OP_ICONST_0),
2825                new VariableInstruction(InstructionConstants.OP_ALOAD, Y),
2826                new ConstantInstruction(InstructionConstants.OP_GETFIELD, Z),
2827                new BranchInstruction(InstructionConstants.OP_IFICMPEQ, X),
2828            },{
2829                new VariableInstruction(InstructionConstants.OP_ALOAD, Y),
2830                new ConstantInstruction(InstructionConstants.OP_GETFIELD, Z),
2831                new BranchInstruction(InstructionConstants.OP_IFEQ, X),
2832            },
2833        },
2834        {   // if (... != 0) = ifne
2835            {
2836                new SimpleInstruction(InstructionConstants.OP_ICONST_0),
2837                new BranchInstruction(InstructionConstants.OP_IFICMPNE, X),
2838            },{
2839                new BranchInstruction(InstructionConstants.OP_IFNE, X),
2840            },
2841        },
2842        {   // if (0 != i) = iload/ifeq
2843            {
2844                new SimpleInstruction(InstructionConstants.OP_ICONST_0),
2845                new VariableInstruction(InstructionConstants.OP_ILOAD, Y),
2846                new BranchInstruction(InstructionConstants.OP_IFICMPNE, X),
2847            },{
2848                new VariableInstruction(InstructionConstants.OP_ILOAD, Y),
2849                new BranchInstruction(InstructionConstants.OP_IFNE, X),
2850            },
2851        },
2852        {   // if (0 != i) = getstatic/ifeq
2853            {
2854                new SimpleInstruction(InstructionConstants.OP_ICONST_0),
2855                new ConstantInstruction(InstructionConstants.OP_GETSTATIC, Y),
2856                new BranchInstruction(InstructionConstants.OP_IFICMPNE, X),
2857            },{
2858                new ConstantInstruction(InstructionConstants.OP_GETSTATIC, Y),
2859                new BranchInstruction(InstructionConstants.OP_IFNE, X),
2860            },
2861        },
2862        {   // if (0 != i) = getfield/ifeq
2863            {
2864                new SimpleInstruction(InstructionConstants.OP_ICONST_0),
2865                new VariableInstruction(InstructionConstants.OP_ALOAD, Y),
2866                new ConstantInstruction(InstructionConstants.OP_GETFIELD, Z),
2867                new BranchInstruction(InstructionConstants.OP_IFICMPNE, X),
2868            },{
2869                new VariableInstruction(InstructionConstants.OP_ALOAD, Y),
2870                new ConstantInstruction(InstructionConstants.OP_GETFIELD, Z),
2871                new BranchInstruction(InstructionConstants.OP_IFNE, X),
2872            },
2873        },
2874        {   // if (... < 0) = iflt
2875            {
2876                new SimpleInstruction(InstructionConstants.OP_ICONST_0),
2877                new BranchInstruction(InstructionConstants.OP_IFICMPLT, X),
2878            },{
2879                new BranchInstruction(InstructionConstants.OP_IFLT, X),
2880            },
2881        },
2882        {   // if (... < 1) = ifle
2883            {
2884                new SimpleInstruction(InstructionConstants.OP_ICONST_1),
2885                new BranchInstruction(InstructionConstants.OP_IFICMPLT, X),
2886            },{
2887                new BranchInstruction(InstructionConstants.OP_IFLE, X),
2888            },
2889        },
2890        {   // if (0 > i) = iload/iflt
2891            {
2892                new SimpleInstruction(InstructionConstants.OP_ICONST_0),
2893                new VariableInstruction(InstructionConstants.OP_ILOAD, Y),
2894                new BranchInstruction(InstructionConstants.OP_IFICMPGT, X),
2895            },{
2896                new VariableInstruction(InstructionConstants.OP_ILOAD, Y),
2897                new BranchInstruction(InstructionConstants.OP_IFLT, X),
2898            },
2899        },
2900        {   // if (1 > i) = iload/ifle
2901            {
2902                new SimpleInstruction(InstructionConstants.OP_ICONST_1),
2903                new VariableInstruction(InstructionConstants.OP_ILOAD, Y),
2904                new BranchInstruction(InstructionConstants.OP_IFICMPGT, X),
2905            },{
2906                new VariableInstruction(InstructionConstants.OP_ILOAD, Y),
2907                new BranchInstruction(InstructionConstants.OP_IFLE, X),
2908            },
2909        },
2910        {   // if (0 > i) = getstatic/iflt
2911            {
2912                new SimpleInstruction(InstructionConstants.OP_ICONST_0),
2913                new ConstantInstruction(InstructionConstants.OP_GETSTATIC, Y),
2914                new BranchInstruction(InstructionConstants.OP_IFICMPGT, X),
2915            },{
2916                new ConstantInstruction(InstructionConstants.OP_GETSTATIC, Y),
2917                new BranchInstruction(InstructionConstants.OP_IFLT, X),
2918            },
2919        },
2920        {   // if (1 > i) = getstatic/ifle
2921            {
2922                new SimpleInstruction(InstructionConstants.OP_ICONST_1),
2923                new ConstantInstruction(InstructionConstants.OP_GETSTATIC, Y),
2924                new BranchInstruction(InstructionConstants.OP_IFICMPGT, X),
2925            },{
2926                new ConstantInstruction(InstructionConstants.OP_GETSTATIC, Y),
2927                new BranchInstruction(InstructionConstants.OP_IFLE, X),
2928            },
2929        },
2930        {   // if (0 > i) = getfield/iflt
2931            {
2932                new SimpleInstruction(InstructionConstants.OP_ICONST_0),
2933                new VariableInstruction(InstructionConstants.OP_ALOAD, Y),
2934                new ConstantInstruction(InstructionConstants.OP_GETFIELD, Z),
2935                new BranchInstruction(InstructionConstants.OP_IFICMPGT, X),
2936            },{
2937                new VariableInstruction(InstructionConstants.OP_ALOAD, Y),
2938                new ConstantInstruction(InstructionConstants.OP_GETFIELD, Z),
2939                new BranchInstruction(InstructionConstants.OP_IFLT, X),
2940            },
2941        },
2942        {   // if (1 > i) = getfield/ifle
2943            {
2944                new SimpleInstruction(InstructionConstants.OP_ICONST_1),
2945                new VariableInstruction(InstructionConstants.OP_ALOAD, Y),
2946                new ConstantInstruction(InstructionConstants.OP_GETFIELD, Z),
2947                new BranchInstruction(InstructionConstants.OP_IFICMPGT, X),
2948            },{
2949                new VariableInstruction(InstructionConstants.OP_ALOAD, Y),
2950                new ConstantInstruction(InstructionConstants.OP_GETFIELD, Z),
2951                new BranchInstruction(InstructionConstants.OP_IFLE, X),
2952            },
2953        },
2954        {   // if (... >= 0) = ifge
2955            {
2956                new SimpleInstruction(InstructionConstants.OP_ICONST_0),
2957                new BranchInstruction(InstructionConstants.OP_IFICMPGE, X),
2958            },{
2959                new BranchInstruction(InstructionConstants.OP_IFGE, X),
2960            },
2961        },
2962        {   // if (... >= 1) = ifgt
2963            {
2964                new SimpleInstruction(InstructionConstants.OP_ICONST_1),
2965                new BranchInstruction(InstructionConstants.OP_IFICMPGE, X),
2966            },{
2967                new BranchInstruction(InstructionConstants.OP_IFGT, X),
2968            },
2969        },
2970        {   // if (0 <= i) = iload/ifge
2971            {
2972                new SimpleInstruction(InstructionConstants.OP_ICONST_0),
2973                new VariableInstruction(InstructionConstants.OP_ILOAD, Y),
2974                new BranchInstruction(InstructionConstants.OP_IFICMPLE, X),
2975            },{
2976                new VariableInstruction(InstructionConstants.OP_ILOAD, Y),
2977                new BranchInstruction(InstructionConstants.OP_IFGE, X),
2978            },
2979        },
2980        {   // if (1 <= i) = iload/ifgt
2981            {
2982                new SimpleInstruction(InstructionConstants.OP_ICONST_1),
2983                new VariableInstruction(InstructionConstants.OP_ILOAD, Y),
2984                new BranchInstruction(InstructionConstants.OP_IFICMPLE, X),
2985            },{
2986                new VariableInstruction(InstructionConstants.OP_ILOAD, Y),
2987                new BranchInstruction(InstructionConstants.OP_IFGT, X),
2988            },
2989        },
2990        {   // if (0 <= i) = getstatic/ifge
2991            {
2992                new SimpleInstruction(InstructionConstants.OP_ICONST_0),
2993                new ConstantInstruction(InstructionConstants.OP_GETSTATIC, Y),
2994                new BranchInstruction(InstructionConstants.OP_IFICMPLE, X),
2995            },{
2996                new ConstantInstruction(InstructionConstants.OP_GETSTATIC, Y),
2997                new BranchInstruction(InstructionConstants.OP_IFGE, X),
2998            },
2999        },
3000        {   // if (1 <= i) = getstatic/ifgt
3001            {
3002                new SimpleInstruction(InstructionConstants.OP_ICONST_1),
3003                new ConstantInstruction(InstructionConstants.OP_GETSTATIC, Y),
3004                new BranchInstruction(InstructionConstants.OP_IFICMPLE, X),
3005            },{
3006                new ConstantInstruction(InstructionConstants.OP_GETSTATIC, Y),
3007                new BranchInstruction(InstructionConstants.OP_IFGT, X),
3008            },
3009        },
3010        {   // if (0 <= i) = getfield/ifge
3011            {
3012                new SimpleInstruction(InstructionConstants.OP_ICONST_0),
3013                new VariableInstruction(InstructionConstants.OP_ALOAD, Y),
3014                new ConstantInstruction(InstructionConstants.OP_GETFIELD, Z),
3015                new BranchInstruction(InstructionConstants.OP_IFICMPLE, X),
3016            },{
3017                new VariableInstruction(InstructionConstants.OP_ALOAD, Y),
3018                new ConstantInstruction(InstructionConstants.OP_GETFIELD, Z),
3019                new BranchInstruction(InstructionConstants.OP_IFGE, X),
3020            },
3021        },
3022        {   // if (1 <= i) = getfield/ifgt
3023            {
3024                new SimpleInstruction(InstructionConstants.OP_ICONST_1),
3025                new VariableInstruction(InstructionConstants.OP_ALOAD, Y),
3026                new ConstantInstruction(InstructionConstants.OP_GETFIELD, Z),
3027                new BranchInstruction(InstructionConstants.OP_IFICMPLE, X),
3028            },{
3029                new VariableInstruction(InstructionConstants.OP_ALOAD, Y),
3030                new ConstantInstruction(InstructionConstants.OP_GETFIELD, Z),
3031                new BranchInstruction(InstructionConstants.OP_IFGT, X),
3032            },
3033        },
3034        {   // if (... > 0) = ifgt
3035            {
3036                new SimpleInstruction(InstructionConstants.OP_ICONST_0),
3037                new BranchInstruction(InstructionConstants.OP_IFICMPGT, X),
3038            },{
3039                new BranchInstruction(InstructionConstants.OP_IFGT, X),
3040            },
3041        },
3042        {   // if (... > -1) = ifge
3043            {
3044                new SimpleInstruction(InstructionConstants.OP_ICONST_M1),
3045                new BranchInstruction(InstructionConstants.OP_IFICMPGT, X),
3046            },{
3047                new BranchInstruction(InstructionConstants.OP_IFGE, X),
3048            },
3049        },
3050        {   // if (0 < i) = iload/ifgt
3051            {
3052                new SimpleInstruction(InstructionConstants.OP_ICONST_0),
3053                new VariableInstruction(InstructionConstants.OP_ILOAD, Y),
3054                new BranchInstruction(InstructionConstants.OP_IFICMPLT, X),
3055            },{
3056                new VariableInstruction(InstructionConstants.OP_ILOAD, Y),
3057                new BranchInstruction(InstructionConstants.OP_IFGT, X),
3058            },
3059        },
3060        {   // if (-1 < i) = iload/ifge
3061            {
3062                new SimpleInstruction(InstructionConstants.OP_ICONST_M1),
3063                new VariableInstruction(InstructionConstants.OP_ILOAD, Y),
3064                new BranchInstruction(InstructionConstants.OP_IFICMPLT, X),
3065            },{
3066                new VariableInstruction(InstructionConstants.OP_ILOAD, Y),
3067                new BranchInstruction(InstructionConstants.OP_IFGE, X),
3068            },
3069        },
3070        {   // if (0 < i) = getstatic/ifgt
3071            {
3072                new SimpleInstruction(InstructionConstants.OP_ICONST_0),
3073                new ConstantInstruction(InstructionConstants.OP_GETSTATIC, Y),
3074                new BranchInstruction(InstructionConstants.OP_IFICMPLT, X),
3075            },{
3076                new ConstantInstruction(InstructionConstants.OP_GETSTATIC, Y),
3077                new BranchInstruction(InstructionConstants.OP_IFGT, X),
3078            },
3079        },
3080        {   // if (-1 < i) = getstatic/ifge
3081            {
3082                new SimpleInstruction(InstructionConstants.OP_ICONST_M1),
3083                new ConstantInstruction(InstructionConstants.OP_GETSTATIC, Y),
3084                new BranchInstruction(InstructionConstants.OP_IFICMPLT, X),
3085            },{
3086                new ConstantInstruction(InstructionConstants.OP_GETSTATIC, Y),
3087                new BranchInstruction(InstructionConstants.OP_IFGE, X),
3088            },
3089        },
3090        {   // if (0 < i) = getfield/ifgt
3091            {
3092                new SimpleInstruction(InstructionConstants.OP_ICONST_0),
3093                new VariableInstruction(InstructionConstants.OP_ALOAD, Y),
3094                new ConstantInstruction(InstructionConstants.OP_GETFIELD, Z),
3095                new BranchInstruction(InstructionConstants.OP_IFICMPLT, X),
3096            },{
3097                new VariableInstruction(InstructionConstants.OP_ALOAD, Y),
3098                new ConstantInstruction(InstructionConstants.OP_GETFIELD, Z),
3099                new BranchInstruction(InstructionConstants.OP_IFGT, X),
3100            },
3101        },
3102        {   // if (-1 < i) = getfield/ifge
3103            {
3104                new SimpleInstruction(InstructionConstants.OP_ICONST_M1),
3105                new VariableInstruction(InstructionConstants.OP_ALOAD, Y),
3106                new ConstantInstruction(InstructionConstants.OP_GETFIELD, Z),
3107                new BranchInstruction(InstructionConstants.OP_IFICMPLT, X),
3108            },{
3109                new VariableInstruction(InstructionConstants.OP_ALOAD, Y),
3110                new ConstantInstruction(InstructionConstants.OP_GETFIELD, Z),
3111                new BranchInstruction(InstructionConstants.OP_IFGE, X),
3112            },
3113        },
3114        {   // if (... <= 0) = ifle
3115            {
3116                new SimpleInstruction(InstructionConstants.OP_ICONST_0),
3117                new BranchInstruction(InstructionConstants.OP_IFICMPLE, X),
3118            },{
3119                new BranchInstruction(InstructionConstants.OP_IFLE, X),
3120            },
3121        },
3122        {   // if (... <= -1) = iflt
3123            {
3124                new SimpleInstruction(InstructionConstants.OP_ICONST_M1),
3125                new BranchInstruction(InstructionConstants.OP_IFICMPLE, X),
3126            },{
3127                new BranchInstruction(InstructionConstants.OP_IFLT, X),
3128            },
3129        },
3130        {   // if (0 >= i) = iload/ifle
3131            {
3132                new SimpleInstruction(InstructionConstants.OP_ICONST_0),
3133                new VariableInstruction(InstructionConstants.OP_ILOAD, Y),
3134                new BranchInstruction(InstructionConstants.OP_IFICMPGE, X),
3135            },{
3136                new VariableInstruction(InstructionConstants.OP_ILOAD, Y),
3137                new BranchInstruction(InstructionConstants.OP_IFLE, X),
3138            },
3139        },
3140        {   // if (-1 >= i) = iload/iflt
3141            {
3142                new SimpleInstruction(InstructionConstants.OP_ICONST_M1),
3143                new VariableInstruction(InstructionConstants.OP_ILOAD, Y),
3144                new BranchInstruction(InstructionConstants.OP_IFICMPGE, X),
3145            },{
3146                new VariableInstruction(InstructionConstants.OP_ILOAD, Y),
3147                new BranchInstruction(InstructionConstants.OP_IFLT, X),
3148            },
3149        },
3150        {   // if (0 >= i) = getstatic/ifle
3151            {
3152                new SimpleInstruction(InstructionConstants.OP_ICONST_0),
3153                new ConstantInstruction(InstructionConstants.OP_GETSTATIC, Y),
3154                new BranchInstruction(InstructionConstants.OP_IFICMPGE, X),
3155            },{
3156                new ConstantInstruction(InstructionConstants.OP_GETSTATIC, Y),
3157                new BranchInstruction(InstructionConstants.OP_IFLE, X),
3158            },
3159        },
3160        {   // if (-1 >= i) = getstatic/iflt
3161            {
3162                new SimpleInstruction(InstructionConstants.OP_ICONST_M1),
3163                new ConstantInstruction(InstructionConstants.OP_GETSTATIC, Y),
3164                new BranchInstruction(InstructionConstants.OP_IFICMPGE, X),
3165            },{
3166                new ConstantInstruction(InstructionConstants.OP_GETSTATIC, Y),
3167                new BranchInstruction(InstructionConstants.OP_IFLT, X),
3168            },
3169        },
3170        {   // if (0 >= i) = getfield/ifle
3171            {
3172                new SimpleInstruction(InstructionConstants.OP_ICONST_0),
3173                new VariableInstruction(InstructionConstants.OP_ALOAD, Y),
3174                new ConstantInstruction(InstructionConstants.OP_GETFIELD, Z),
3175                new BranchInstruction(InstructionConstants.OP_IFICMPGE, X),
3176            },{
3177                new VariableInstruction(InstructionConstants.OP_ALOAD, Y),
3178                new ConstantInstruction(InstructionConstants.OP_GETFIELD, Z),
3179                new BranchInstruction(InstructionConstants.OP_IFLE, X),
3180            },
3181        },
3182        {   // if (-1 >= i) = getfield/iflt
3183            {
3184                new SimpleInstruction(InstructionConstants.OP_ICONST_M1),
3185                new VariableInstruction(InstructionConstants.OP_ALOAD, Y),
3186                new ConstantInstruction(InstructionConstants.OP_GETFIELD, Z),
3187                new BranchInstruction(InstructionConstants.OP_IFICMPGE, X),
3188            },{
3189                new VariableInstruction(InstructionConstants.OP_ALOAD, Y),
3190                new ConstantInstruction(InstructionConstants.OP_GETFIELD, Z),
3191                new BranchInstruction(InstructionConstants.OP_IFLT, X),
3192            },
3193        },
3194        {   // if (... == null) = ifnull
3195            {
3196                new SimpleInstruction(InstructionConstants.OP_ACONST_NULL),
3197                new BranchInstruction(InstructionConstants.OP_IFACMPEQ, X),
3198            },{
3199                new BranchInstruction(InstructionConstants.OP_IFNULL, X),
3200            },
3201        },
3202        {   // if (null == a) = aload/ifnull
3203            {
3204                new SimpleInstruction(InstructionConstants.OP_ACONST_NULL),
3205                new VariableInstruction(InstructionConstants.OP_ALOAD, Y),
3206                new BranchInstruction(InstructionConstants.OP_IFACMPEQ, X),
3207            },{
3208                new VariableInstruction(InstructionConstants.OP_ALOAD, Y),
3209                new BranchInstruction(InstructionConstants.OP_IFNULL, X),
3210            },
3211        },
3212        {   // if (null == a) = getstatic/ifnull
3213            {
3214                new SimpleInstruction(InstructionConstants.OP_ACONST_NULL),
3215                new ConstantInstruction(InstructionConstants.OP_GETSTATIC, Y),
3216                new BranchInstruction(InstructionConstants.OP_IFACMPEQ, X),
3217            },{
3218                new ConstantInstruction(InstructionConstants.OP_GETSTATIC, Y),
3219                new BranchInstruction(InstructionConstants.OP_IFNULL, X),
3220            },
3221        },
3222        {   // if (null == a) = getfield/ifnull
3223            {
3224                new SimpleInstruction(InstructionConstants.OP_ACONST_NULL),
3225                new VariableInstruction(InstructionConstants.OP_ALOAD, Y),
3226                new ConstantInstruction(InstructionConstants.OP_GETFIELD, Z),
3227                new BranchInstruction(InstructionConstants.OP_IFACMPEQ, X),
3228            },{
3229                new VariableInstruction(InstructionConstants.OP_ALOAD, Y),
3230                new ConstantInstruction(InstructionConstants.OP_GETFIELD, Z),
3231                new BranchInstruction(InstructionConstants.OP_IFNULL, X),
3232            },
3233        },
3234        {   // if (... != null) = ifnonnull
3235            {
3236                new SimpleInstruction(InstructionConstants.OP_ACONST_NULL),
3237                new BranchInstruction(InstructionConstants.OP_IFACMPNE, X),
3238            },{
3239                new BranchInstruction(InstructionConstants.OP_IFNONNULL, X),
3240            },
3241        },
3242        {   // if (null != a) = aload/ifnonnull
3243            {
3244                new SimpleInstruction(InstructionConstants.OP_ACONST_NULL),
3245                new VariableInstruction(InstructionConstants.OP_ALOAD, Y),
3246                new BranchInstruction(InstructionConstants.OP_IFACMPNE, X),
3247            },{
3248                new VariableInstruction(InstructionConstants.OP_ALOAD, Y),
3249                new BranchInstruction(InstructionConstants.OP_IFNONNULL, X),
3250            },
3251        },
3252        {   // if (null != a) = getstatic/ifnonnull
3253            {
3254                new SimpleInstruction(InstructionConstants.OP_ACONST_NULL),
3255                new ConstantInstruction(InstructionConstants.OP_GETSTATIC, Y),
3256                new BranchInstruction(InstructionConstants.OP_IFACMPNE, X),
3257            },{
3258                new ConstantInstruction(InstructionConstants.OP_GETSTATIC, Y),
3259                new BranchInstruction(InstructionConstants.OP_IFNONNULL, X),
3260            },
3261        },
3262        {   // if (null != a) = getfield/ifnonnull
3263            {
3264                new SimpleInstruction(InstructionConstants.OP_ACONST_NULL),
3265                new VariableInstruction(InstructionConstants.OP_ALOAD, Y),
3266                new ConstantInstruction(InstructionConstants.OP_GETFIELD, Z),
3267                new BranchInstruction(InstructionConstants.OP_IFACMPNE, X),
3268            },{
3269                new VariableInstruction(InstructionConstants.OP_ALOAD, Y),
3270                new ConstantInstruction(InstructionConstants.OP_GETFIELD, Z),
3271                new BranchInstruction(InstructionConstants.OP_IFNONNULL, X),
3272            },
3273        },
3274        {   // iconst_0/ifeq = goto
3275            {
3276                new SimpleInstruction(InstructionConstants.OP_ICONST_0),
3277                new BranchInstruction(InstructionConstants.OP_IFEQ, X),
3278            },{
3279                new BranchInstruction(InstructionConstants.OP_GOTO, X),
3280            },
3281        },
3282        {   // iconst/ifeq = nothing
3283            {
3284                new SimpleInstruction(InstructionConstants.OP_ICONST_0, A),
3285                new BranchInstruction(InstructionConstants.OP_IFEQ, X),
3286            },{
3287                // Nothing.
3288            },
3289        },
3290        {   // bipush/ifeq = nothing
3291            {
3292                new SimpleInstruction(InstructionConstants.OP_BIPUSH, A),
3293                new BranchInstruction(InstructionConstants.OP_IFEQ, X),
3294            },{
3295                // Nothing.
3296            },
3297        },
3298        {   // sipush/ifeq = nothing
3299            {
3300                new SimpleInstruction(InstructionConstants.OP_SIPUSH, A),
3301                new BranchInstruction(InstructionConstants.OP_IFEQ, X),
3302            },{
3303                // Nothing.
3304            },
3305        },
3306        {   // iconst_0/ifne = nothing
3307            {
3308                new SimpleInstruction(InstructionConstants.OP_ICONST_0),
3309                new BranchInstruction(InstructionConstants.OP_IFNE, X),
3310            },{
3311                // Nothing.
3312            },
3313        },
3314        {   // iconst/ifne = goto
3315            {
3316                new SimpleInstruction(InstructionConstants.OP_ICONST_0, A),
3317                new BranchInstruction(InstructionConstants.OP_IFNE, X),
3318            },{
3319                new BranchInstruction(InstructionConstants.OP_GOTO, X),
3320            },
3321        },
3322        {   // bipush/ifne = goto
3323            {
3324                new SimpleInstruction(InstructionConstants.OP_BIPUSH, A),
3325                new BranchInstruction(InstructionConstants.OP_IFNE, X),
3326            },{
3327                new BranchInstruction(InstructionConstants.OP_GOTO, X),
3328            },
3329        },
3330        {   // sipush/ifne = goto
3331            {
3332                new SimpleInstruction(InstructionConstants.OP_SIPUSH, A),
3333                new BranchInstruction(InstructionConstants.OP_IFNE, X),
3334            },{
3335                new BranchInstruction(InstructionConstants.OP_GOTO, X),
3336            },
3337        },
3338        {   // iconst_0/iflt = nothing
3339            {
3340                new SimpleInstruction(InstructionConstants.OP_ICONST_0),
3341                new BranchInstruction(InstructionConstants.OP_IFLT, X),
3342            },{
3343                // Nothing.
3344            },
3345        },
3346        {   // iconst_0/ifge = goto
3347            {
3348                new SimpleInstruction(InstructionConstants.OP_ICONST_0),
3349                new BranchInstruction(InstructionConstants.OP_IFGE, X),
3350            },{
3351                new BranchInstruction(InstructionConstants.OP_GOTO, X),
3352            },
3353        },
3354        {   // iconst_0/ifgt = nothing
3355            {
3356                new SimpleInstruction(InstructionConstants.OP_ICONST_0),
3357                new BranchInstruction(InstructionConstants.OP_IFGT, X),
3358            },{
3359                // Nothing.
3360            },
3361        },
3362        {   // iconst_0/ifle = goto
3363            {
3364                new SimpleInstruction(InstructionConstants.OP_ICONST_0),
3365                new BranchInstruction(InstructionConstants.OP_IFLE, X),
3366            },{
3367                new BranchInstruction(InstructionConstants.OP_GOTO, X),
3368            },
3369        },
3370        {   // aconst_null/ifnull = goto
3371            {
3372                new SimpleInstruction(InstructionConstants.OP_ACONST_NULL),
3373                new BranchInstruction(InstructionConstants.OP_IFNULL, X),
3374            },{
3375                new BranchInstruction(InstructionConstants.OP_GOTO, X),
3376            },
3377        },
3378        {   // aconst_null/ifnonnul = nothing
3379            {
3380                new SimpleInstruction(InstructionConstants.OP_ACONST_NULL),
3381                new BranchInstruction(InstructionConstants.OP_IFNONNULL, X),
3382            },{
3383                // Nothing.
3384            },
3385        },
3386        {   // ifeq/goto = ifne
3387            {
3388                new BranchInstruction(InstructionConstants.OP_IFEQ, 6),
3389                new BranchInstruction(InstructionConstants.OP_GOTO, X),
3390            },{
3391                new BranchInstruction(InstructionConstants.OP_IFNE, X),
3392            },
3393        },
3394        {   // ifne/goto = ifeq
3395            {
3396                new BranchInstruction(InstructionConstants.OP_IFNE, 6),
3397                new BranchInstruction(InstructionConstants.OP_GOTO, X),
3398            },{
3399                new BranchInstruction(InstructionConstants.OP_IFEQ, X),
3400            },
3401        },
3402        {   // iflt/goto = ifge
3403            {
3404                new BranchInstruction(InstructionConstants.OP_IFLT, 6),
3405                new BranchInstruction(InstructionConstants.OP_GOTO, X),
3406            },{
3407                new BranchInstruction(InstructionConstants.OP_IFGE, X),
3408            },
3409        },
3410        {   // ifge/goto = iflt
3411            {
3412                new BranchInstruction(InstructionConstants.OP_IFGE, 6),
3413                new BranchInstruction(InstructionConstants.OP_GOTO, X),
3414            },{
3415                new BranchInstruction(InstructionConstants.OP_IFLT, X),
3416            },
3417        },
3418        {   // ifgt/goto = ifle
3419            {
3420                new BranchInstruction(InstructionConstants.OP_IFGT, 6),
3421                new BranchInstruction(InstructionConstants.OP_GOTO, X),
3422            },{
3423                new BranchInstruction(InstructionConstants.OP_IFLE, X),
3424            },
3425        },
3426        {   // ifle/goto = ifgt
3427            {
3428                new BranchInstruction(InstructionConstants.OP_IFLE, 6),
3429                new BranchInstruction(InstructionConstants.OP_GOTO, X),
3430            },{
3431                new BranchInstruction(InstructionConstants.OP_IFGT, X),
3432            },
3433        },
3434        {   // ificmpeq/goto = ificmpne
3435            {
3436                new BranchInstruction(InstructionConstants.OP_IFICMPEQ, 6),
3437                new BranchInstruction(InstructionConstants.OP_GOTO, X),
3438            },{
3439                new BranchInstruction(InstructionConstants.OP_IFICMPNE, X),
3440            },
3441        },
3442        {   // ificmpne/goto = ificmpeq
3443            {
3444                new BranchInstruction(InstructionConstants.OP_IFICMPNE, 6),
3445                new BranchInstruction(InstructionConstants.OP_GOTO, X),
3446            },{
3447                new BranchInstruction(InstructionConstants.OP_IFICMPEQ, X),
3448            },
3449        },
3450        {   // ificmplt/goto = ificmpge
3451            {
3452                new BranchInstruction(InstructionConstants.OP_IFICMPLT, 6),
3453                new BranchInstruction(InstructionConstants.OP_GOTO, X),
3454            },{
3455                new BranchInstruction(InstructionConstants.OP_IFICMPGE, X),
3456            },
3457        },
3458        {   // ificmpge/goto = ificmplt
3459            {
3460                new BranchInstruction(InstructionConstants.OP_IFICMPGE, 6),
3461                new BranchInstruction(InstructionConstants.OP_GOTO, X),
3462            },{
3463                new BranchInstruction(InstructionConstants.OP_IFICMPLT, X),
3464            },
3465        },
3466        {   // ificmpgt/goto = ificmple
3467            {
3468                new BranchInstruction(InstructionConstants.OP_IFICMPGT, 6),
3469                new BranchInstruction(InstructionConstants.OP_GOTO, X),
3470            },{
3471                new BranchInstruction(InstructionConstants.OP_IFICMPLE, X),
3472            },
3473        },
3474        {   // ificmple/goto = ificmpgt
3475            {
3476                new BranchInstruction(InstructionConstants.OP_IFICMPLE, 6),
3477                new BranchInstruction(InstructionConstants.OP_GOTO, X),
3478            },{
3479                new BranchInstruction(InstructionConstants.OP_IFICMPGT, X),
3480            },
3481        },
3482        {   // ifacmpeq/goto = ifacmpne
3483            {
3484                new BranchInstruction(InstructionConstants.OP_IFACMPEQ, 6),
3485                new BranchInstruction(InstructionConstants.OP_GOTO, X),
3486            },{
3487                new BranchInstruction(InstructionConstants.OP_IFACMPNE, X),
3488            },
3489        },
3490        {   // ifacmpne/goto = ifacmpeq
3491            {
3492                new BranchInstruction(InstructionConstants.OP_IFACMPNE, 6),
3493                new BranchInstruction(InstructionConstants.OP_GOTO, X),
3494            },{
3495                new BranchInstruction(InstructionConstants.OP_IFACMPEQ, X),
3496            },
3497        },
3498        {   // ifnull/goto = ifnonnull
3499            {
3500                new BranchInstruction(InstructionConstants.OP_IFNULL, 6),
3501                new BranchInstruction(InstructionConstants.OP_GOTO, X),
3502            },{
3503                new BranchInstruction(InstructionConstants.OP_IFNONNULL, X),
3504            },
3505        },
3506        {   // ifnonnull/goto = ifnull
3507            {
3508                new BranchInstruction(InstructionConstants.OP_IFNONNULL, 6),
3509                new BranchInstruction(InstructionConstants.OP_GOTO, X),
3510            },{
3511                new BranchInstruction(InstructionConstants.OP_IFNULL, X),
3512            },
3513        },
3514//        {   // switch (...) { default: ... } = pop/goto ...
3515//            {
3516//                new TableSwitchInstruction(InstructionConstants.OP_TABLESWITCH, A, X, Y, 0, new int[0]),
3517//            },{
3518//                new SimpleInstruction(InstructionConstants.OP_POP),
3519//                new BranchInstruction(InstructionConstants.OP_GOTO, A),
3520//            },
3521//        },
3522//        {   // switch (...) { default: ... } = pop/goto ...
3523//            {
3524//                new LookUpSwitchInstruction(InstructionConstants.OP_LOOKUPSWITCH, A, 0, new int[0], new int[0]),
3525//            },{
3526//                new SimpleInstruction(InstructionConstants.OP_POP),
3527//                new BranchInstruction(InstructionConstants.OP_GOTO, A),
3528//            },
3529//        },
3530        {   // switch (...) { case/case/default: ... } = switch (...) { case/default: ... }
3531            {
3532                new LookUpSwitchInstruction(InstructionConstants.OP_LOOKUPSWITCH, A, new int[] { X, Y }, new int[] { A, B }),
3533            },{
3534                new LookUpSwitchInstruction(InstructionConstants.OP_LOOKUPSWITCH, A, new int[] { Y }, new int[] { B }),
3535            },
3536        },
3537        {   // switch (...) { case/case/default: ... } = switch (...) { case/default: ... }
3538            {
3539                new LookUpSwitchInstruction(InstructionConstants.OP_LOOKUPSWITCH, B, new int[] { X, Y }, new int[] { A, B }),
3540            },{
3541                new LookUpSwitchInstruction(InstructionConstants.OP_LOOKUPSWITCH, B, new int[] { X }, new int[] { A }),
3542            },
3543        },
3544        {   // switch (...) { case/case/case/default: ... } = switch (...) { case/case/default: ... }
3545            {
3546                new LookUpSwitchInstruction(InstructionConstants.OP_LOOKUPSWITCH, A, new int[] { X, Y, Z }, new int[] { A, B, C }),
3547            },{
3548                new LookUpSwitchInstruction(InstructionConstants.OP_LOOKUPSWITCH, A, new int[] { Y, Z }, new int[] { B, C }),
3549            },
3550        },
3551        {   // switch (...) { case/case/case/default: ... } = switch (...) { case/case/default: ... }
3552            {
3553                new LookUpSwitchInstruction(InstructionConstants.OP_LOOKUPSWITCH, B, new int[] { X, Y, Z }, new int[] { A, B, C }),
3554            },{
3555                new LookUpSwitchInstruction(InstructionConstants.OP_LOOKUPSWITCH, B, new int[] { X, Z }, new int[] { A, C }),
3556            },
3557        },
3558        {   // switch (...) { case/case/case/default: ... } = switch (...) { case/case/default: ... }
3559            {
3560                new LookUpSwitchInstruction(InstructionConstants.OP_LOOKUPSWITCH, C, new int[] { X, Y, Z }, new int[] { A, B, C }),
3561            },{
3562                new LookUpSwitchInstruction(InstructionConstants.OP_LOOKUPSWITCH, C, new int[] { X, Y }, new int[] { A, B }),
3563            },
3564        },
3565//        {   // switch (...) { case ...: ...  default:  ... }
3566//            // = if (... == ...) ... else ...
3567//            {
3568//                new TableSwitchInstruction(InstructionConstants.OP_TABLESWITCH, A, X, Y, 1, new int[] { B }),
3569//            },{
3570//                new SimpleInstruction(InstructionConstants.OP_SIPUSH, X),
3571//                new BranchInstruction(InstructionConstants.OP_IFICMPNE, A),
3572//                new BranchInstruction(InstructionConstants.OP_GOTO, B),
3573//            },
3574//        },
3575//        {   // switch (...) { case ...: ...  default:  ... }
3576//            // = if (... == ...) ... else ...
3577//            {
3578//                new LookUpSwitchInstruction(InstructionConstants.OP_LOOKUPSWITCH, A, 1, new int[] { X }, new int[] { B }),
3579//            },{
3580//                new SimpleInstruction(InstructionConstants.OP_SIPUSH, X),
3581//                new BranchInstruction(InstructionConstants.OP_IFICMPNE, A),
3582//                new BranchInstruction(InstructionConstants.OP_GOTO, B),
3583//            },
3584//        }
3585    };
3586
3587    public static final Instruction[][][] STRING = new Instruction[][][]
3588    {
3589        {   // "...".equals("...") = true
3590            {
3591                new ConstantInstruction(InstructionConstants.OP_LDC, A),
3592                new ConstantInstruction(InstructionConstants.OP_LDC, A),
3593                new ConstantInstruction(InstructionConstants.OP_INVOKEVIRTUAL, METHOD_STRING_EQUALS),
3594            },{
3595                new SimpleInstruction(InstructionConstants.OP_ICONST_1),
3596            },
3597        },
3598        {   // "...".length() = ...
3599            {
3600                new ConstantInstruction(InstructionConstants.OP_LDC, A),
3601                new ConstantInstruction(InstructionConstants.OP_INVOKEVIRTUAL, METHOD_STRING_LENGTH),
3602            },{
3603                new SimpleInstruction(InstructionConstants.OP_SIPUSH, STRING_A_LENGTH),
3604            },
3605        },
3606        {   // String.valueOf(Z) = "....
3607            {
3608                new SimpleInstruction(InstructionConstants.OP_ICONST_0, A),
3609                new ConstantInstruction(InstructionConstants.OP_INVOKESTATIC, METHOD_STRING_VALUEOF_Z),
3610            },{
3611                new ConstantInstruction(InstructionConstants.OP_LDC, BOOLEAN_A_STRING),
3612            },
3613        },
3614        {   // String.valueOf(C) = "...."
3615            {
3616                new SimpleInstruction(InstructionConstants.OP_ICONST_0, A),
3617                new ConstantInstruction(InstructionConstants.OP_INVOKESTATIC, METHOD_STRING_VALUEOF_C),
3618            },{
3619                new ConstantInstruction(InstructionConstants.OP_LDC, CHAR_A_STRING),
3620            },
3621        },
3622        {   // String.valueOf(Cc) = "...."
3623            {
3624                new ConstantInstruction(InstructionConstants.OP_LDC, A),
3625                new ConstantInstruction(InstructionConstants.OP_INVOKESTATIC, METHOD_STRING_VALUEOF_C),
3626            },{
3627                new ConstantInstruction(InstructionConstants.OP_LDC, CHAR_A_STRING),
3628            },
3629        },
3630        {   // String.valueOf(I) = "...."
3631            {
3632                new SimpleInstruction(InstructionConstants.OP_ICONST_0, A),
3633                new ConstantInstruction(InstructionConstants.OP_INVOKESTATIC, METHOD_STRING_VALUEOF_I),
3634            },{
3635                new ConstantInstruction(InstructionConstants.OP_LDC, INT_A_STRING),
3636            },
3637        },
3638        {   // String.valueOf(Ic) = "...."
3639            {
3640                new ConstantInstruction(InstructionConstants.OP_LDC, A),
3641                new ConstantInstruction(InstructionConstants.OP_INVOKESTATIC, METHOD_STRING_VALUEOF_I),
3642            },{
3643                new ConstantInstruction(InstructionConstants.OP_LDC, INT_A_STRING),
3644            },
3645        },
3646        {   // String.valueOf(J) = "...."
3647            {
3648                new SimpleInstruction(InstructionConstants.OP_LCONST_0, A),
3649                new ConstantInstruction(InstructionConstants.OP_INVOKESTATIC, METHOD_STRING_VALUEOF_J),
3650            },{
3651                new ConstantInstruction(InstructionConstants.OP_LDC, LONG_A_STRING),
3652            },
3653        },
3654        {   // String.valueOf(Jc) = "...."
3655            {
3656                new ConstantInstruction(InstructionConstants.OP_LDC2_W, A),
3657                new ConstantInstruction(InstructionConstants.OP_INVOKESTATIC, METHOD_STRING_VALUEOF_J),
3658            },{
3659                new ConstantInstruction(InstructionConstants.OP_LDC, LONG_A_STRING),
3660            },
3661        },
3662        {   // String.valueOf(F) = "...."
3663            {
3664                new SimpleInstruction(InstructionConstants.OP_FCONST_0, A),
3665                new ConstantInstruction(InstructionConstants.OP_INVOKESTATIC, METHOD_STRING_VALUEOF_F),
3666            },{
3667                new ConstantInstruction(InstructionConstants.OP_LDC, FLOAT_A_STRING),
3668            },
3669        },
3670        {   // String.valueOf(Fc) = "...."
3671            {
3672                new ConstantInstruction(InstructionConstants.OP_LDC, A),
3673                new ConstantInstruction(InstructionConstants.OP_INVOKESTATIC, METHOD_STRING_VALUEOF_F),
3674            },{
3675                new ConstantInstruction(InstructionConstants.OP_LDC, FLOAT_A_STRING),
3676            },
3677        },
3678        {   // String.valueOf(D) = "...."
3679            {
3680                new SimpleInstruction(InstructionConstants.OP_DCONST_0, A),
3681                new ConstantInstruction(InstructionConstants.OP_INVOKESTATIC, METHOD_STRING_VALUEOF_D),
3682            },{
3683                new ConstantInstruction(InstructionConstants.OP_LDC, DOUBLE_A_STRING),
3684            },
3685        },
3686        {   // String.valueOf(Dc) = "...."
3687            {
3688                new ConstantInstruction(InstructionConstants.OP_LDC2_W, A),
3689                new ConstantInstruction(InstructionConstants.OP_INVOKESTATIC, METHOD_STRING_VALUEOF_D),
3690            },{
3691                new ConstantInstruction(InstructionConstants.OP_LDC, DOUBLE_A_STRING),
3692            },
3693        },
3694
3695        {   // new StringBuffer("...").toString() = "..." (ignoring identity)
3696            {
3697                new ConstantInstruction(InstructionConstants.OP_NEW, CLASS_STRINGBUFFER),
3698                new SimpleInstruction(InstructionConstants.OP_DUP),
3699                new ConstantInstruction(InstructionConstants.OP_LDC, A),
3700                new ConstantInstruction(InstructionConstants.OP_INVOKESPECIAL, METHOD_STRINGBUFFER_INIT_STRING),
3701                new ConstantInstruction(InstructionConstants.OP_INVOKEVIRTUAL, METHOD_STRINGBUFFER_TOSTRING),
3702            },{
3703                new ConstantInstruction(InstructionConstants.OP_LDC, A),
3704            },
3705        },
3706        {   // new StringBuffer(string).toString() = string (ignoring identity)
3707            {
3708                new ConstantInstruction(InstructionConstants.OP_NEW, CLASS_STRINGBUFFER),
3709                new SimpleInstruction(InstructionConstants.OP_DUP),
3710                new VariableInstruction(InstructionConstants.OP_ALOAD, A),
3711                new ConstantInstruction(InstructionConstants.OP_INVOKESPECIAL, METHOD_STRINGBUFFER_INIT_STRING),
3712                new ConstantInstruction(InstructionConstants.OP_INVOKEVIRTUAL, METHOD_STRINGBUFFER_TOSTRING),
3713            },{
3714                new VariableInstruction(InstructionConstants.OP_ALOAD, A),
3715            },
3716        },
3717        {   // new StringBuffer("...").length() = length
3718            {
3719                new ConstantInstruction(InstructionConstants.OP_NEW, CLASS_STRINGBUFFER),
3720                new SimpleInstruction(InstructionConstants.OP_DUP),
3721                new ConstantInstruction(InstructionConstants.OP_LDC, A),
3722                new ConstantInstruction(InstructionConstants.OP_INVOKESPECIAL, METHOD_STRINGBUFFER_INIT_STRING),
3723                new ConstantInstruction(InstructionConstants.OP_INVOKEVIRTUAL, METHOD_STRINGBUFFER_LENGTH),
3724            },{
3725                new SimpleInstruction(InstructionConstants.OP_SIPUSH, STRING_A_LENGTH),
3726            },
3727        },
3728        {   // new StringBuffer() (without dup) = nothing
3729            {
3730                new ConstantInstruction(InstructionConstants.OP_NEW, CLASS_STRINGBUFFER),
3731                new ConstantInstruction(InstructionConstants.OP_LDC, A),
3732                new ConstantInstruction(InstructionConstants.OP_INVOKESPECIAL, METHOD_STRINGBUFFER_INIT),
3733            },{
3734                // Nothing.
3735            },
3736        },
3737        {   // new StringBuffer("...") (without dup) = nothing
3738            {
3739                new ConstantInstruction(InstructionConstants.OP_NEW, CLASS_STRINGBUFFER),
3740                new ConstantInstruction(InstructionConstants.OP_LDC, A),
3741                new ConstantInstruction(InstructionConstants.OP_INVOKESPECIAL, METHOD_STRINGBUFFER_INIT_STRING),
3742            },{
3743                // Nothing.
3744            },
3745        },
3746        {   // new StringBuffer()/pop = nothing
3747            {
3748                new ConstantInstruction(InstructionConstants.OP_NEW, CLASS_STRINGBUFFER),
3749                new SimpleInstruction(InstructionConstants.OP_DUP),
3750                new ConstantInstruction(InstructionConstants.OP_LDC, A),
3751                new ConstantInstruction(InstructionConstants.OP_INVOKESPECIAL, METHOD_STRINGBUFFER_INIT),
3752                new SimpleInstruction(InstructionConstants.OP_POP),
3753            },{
3754                // Nothing.
3755            },
3756        },
3757        {   // new StringBuffer("...")/pop = nothing
3758            {
3759                new ConstantInstruction(InstructionConstants.OP_NEW, CLASS_STRINGBUFFER),
3760                new SimpleInstruction(InstructionConstants.OP_DUP),
3761                new ConstantInstruction(InstructionConstants.OP_LDC, A),
3762                new ConstantInstruction(InstructionConstants.OP_INVOKESPECIAL, METHOD_STRINGBUFFER_INIT_STRING),
3763                new SimpleInstruction(InstructionConstants.OP_POP),
3764            },{
3765                // Nothing.
3766            },
3767        },
3768        {   // new StringBuffer("...").append(z)/pop = nothing
3769            {
3770                new ConstantInstruction(InstructionConstants.OP_NEW, CLASS_STRINGBUFFER),
3771                new SimpleInstruction(InstructionConstants.OP_DUP),
3772                new ConstantInstruction(InstructionConstants.OP_LDC, A),
3773                new ConstantInstruction(InstructionConstants.OP_INVOKESPECIAL, METHOD_STRINGBUFFER_INIT_STRING),
3774                new VariableInstruction(InstructionConstants.OP_ILOAD, B),
3775                new ConstantInstruction(InstructionConstants.OP_INVOKEVIRTUAL, METHOD_STRINGBUFFER_APPEND_Z),
3776                new SimpleInstruction(InstructionConstants.OP_POP),
3777            },{
3778                // Nothing.
3779            },
3780        },
3781        {   // new StringBuffer("...").append(c)/pop = nothing
3782            {
3783                new ConstantInstruction(InstructionConstants.OP_NEW, CLASS_STRINGBUFFER),
3784                new SimpleInstruction(InstructionConstants.OP_DUP),
3785                new ConstantInstruction(InstructionConstants.OP_LDC, A),
3786                new ConstantInstruction(InstructionConstants.OP_INVOKESPECIAL, METHOD_STRINGBUFFER_INIT_STRING),
3787                new VariableInstruction(InstructionConstants.OP_ILOAD, B),
3788                new ConstantInstruction(InstructionConstants.OP_INVOKEVIRTUAL, METHOD_STRINGBUFFER_APPEND_C),
3789                new SimpleInstruction(InstructionConstants.OP_POP),
3790            },{
3791                // Nothing.
3792            },
3793        },
3794        {   // new StringBuffer("...").append(i)/pop = nothing
3795            {
3796                new ConstantInstruction(InstructionConstants.OP_NEW, CLASS_STRINGBUFFER),
3797                new SimpleInstruction(InstructionConstants.OP_DUP),
3798                new ConstantInstruction(InstructionConstants.OP_LDC, A),
3799                new ConstantInstruction(InstructionConstants.OP_INVOKESPECIAL, METHOD_STRINGBUFFER_INIT_STRING),
3800                new VariableInstruction(InstructionConstants.OP_ILOAD, B),
3801                new ConstantInstruction(InstructionConstants.OP_INVOKEVIRTUAL, METHOD_STRINGBUFFER_APPEND_I),
3802                new SimpleInstruction(InstructionConstants.OP_POP),
3803            },{
3804                // Nothing.
3805            },
3806        },
3807        {   // new StringBuffer("...").append(l)/pop = nothing
3808            {
3809                new ConstantInstruction(InstructionConstants.OP_NEW, CLASS_STRINGBUFFER),
3810                new SimpleInstruction(InstructionConstants.OP_DUP),
3811                new ConstantInstruction(InstructionConstants.OP_LDC, A),
3812                new ConstantInstruction(InstructionConstants.OP_INVOKESPECIAL, METHOD_STRINGBUFFER_INIT_STRING),
3813                new VariableInstruction(InstructionConstants.OP_LLOAD, B),
3814                new ConstantInstruction(InstructionConstants.OP_INVOKEVIRTUAL, METHOD_STRINGBUFFER_APPEND_J),
3815                new SimpleInstruction(InstructionConstants.OP_POP),
3816            },{
3817                // Nothing.
3818            },
3819        },
3820        {   // new StringBuffer("...").append(f)/pop = nothing
3821            {
3822                new ConstantInstruction(InstructionConstants.OP_NEW, CLASS_STRINGBUFFER),
3823                new SimpleInstruction(InstructionConstants.OP_DUP),
3824                new ConstantInstruction(InstructionConstants.OP_LDC, A),
3825                new ConstantInstruction(InstructionConstants.OP_INVOKESPECIAL, METHOD_STRINGBUFFER_INIT_STRING),
3826                new VariableInstruction(InstructionConstants.OP_FLOAD, B),
3827                new ConstantInstruction(InstructionConstants.OP_INVOKEVIRTUAL, METHOD_STRINGBUFFER_APPEND_F),
3828                new SimpleInstruction(InstructionConstants.OP_POP),
3829            },{
3830                // Nothing.
3831            },
3832        },
3833        {   // new StringBuffer("...").append(d)/pop = nothing
3834            {
3835                new ConstantInstruction(InstructionConstants.OP_NEW, CLASS_STRINGBUFFER),
3836                new SimpleInstruction(InstructionConstants.OP_DUP),
3837                new ConstantInstruction(InstructionConstants.OP_LDC, A),
3838                new ConstantInstruction(InstructionConstants.OP_INVOKESPECIAL, METHOD_STRINGBUFFER_INIT_STRING),
3839                new VariableInstruction(InstructionConstants.OP_DLOAD, B),
3840                new ConstantInstruction(InstructionConstants.OP_INVOKEVIRTUAL, METHOD_STRINGBUFFER_APPEND_D),
3841                new SimpleInstruction(InstructionConstants.OP_POP),
3842            },{
3843                // Nothing.
3844            },
3845        },
3846        {   // new StringBuffer("...").append(s)/pop = nothing
3847            {
3848                new ConstantInstruction(InstructionConstants.OP_NEW, CLASS_STRINGBUFFER),
3849                new SimpleInstruction(InstructionConstants.OP_DUP),
3850                new ConstantInstruction(InstructionConstants.OP_LDC, A),
3851                new ConstantInstruction(InstructionConstants.OP_INVOKESPECIAL, METHOD_STRINGBUFFER_INIT_STRING),
3852                new VariableInstruction(InstructionConstants.OP_ALOAD, B),
3853                new ConstantInstruction(InstructionConstants.OP_INVOKEVIRTUAL, METHOD_STRINGBUFFER_APPEND_STRING),
3854                new SimpleInstruction(InstructionConstants.OP_POP),
3855            },{
3856                // Nothing.
3857            },
3858        },
3859        {   // StringBuffer#toString()/pop = pop
3860            {
3861                new ConstantInstruction(InstructionConstants.OP_INVOKEVIRTUAL, METHOD_STRINGBUFFER_TOSTRING),
3862                new SimpleInstruction(InstructionConstants.OP_POP),
3863            },{
3864                new SimpleInstruction(InstructionConstants.OP_POP),
3865            },
3866        },
3867        {   // StringBuffer#append("") = nothing
3868            {
3869                new ConstantInstruction(InstructionConstants.OP_LDC, STRING_EMPTY),
3870                new ConstantInstruction(InstructionConstants.OP_INVOKEVIRTUAL, METHOD_STRINGBUFFER_APPEND_STRING),
3871            },{
3872                // Nothing.
3873            },
3874        },
3875        {   // new StringBuffer().append(Z) = new StringBuffer("....")
3876            {
3877                new ConstantInstruction(InstructionConstants.OP_INVOKESPECIAL, METHOD_STRINGBUFFER_INIT),
3878                new SimpleInstruction(InstructionConstants.OP_ICONST_0, A),
3879                new ConstantInstruction(InstructionConstants.OP_INVOKEVIRTUAL, METHOD_STRINGBUFFER_APPEND_Z),
3880            },{
3881                new ConstantInstruction(InstructionConstants.OP_LDC, BOOLEAN_A_STRING),
3882                new ConstantInstruction(InstructionConstants.OP_INVOKESPECIAL, METHOD_STRINGBUFFER_INIT_STRING),
3883            },
3884        },
3885        {   // new StringBuffer().append(C) = new StringBuffer("....")
3886            {
3887                new ConstantInstruction(InstructionConstants.OP_INVOKESPECIAL, METHOD_STRINGBUFFER_INIT),
3888                new SimpleInstruction(InstructionConstants.OP_ICONST_0, A),
3889                new ConstantInstruction(InstructionConstants.OP_INVOKEVIRTUAL, METHOD_STRINGBUFFER_APPEND_C),
3890            },{
3891                new ConstantInstruction(InstructionConstants.OP_LDC, CHAR_A_STRING),
3892                new ConstantInstruction(InstructionConstants.OP_INVOKESPECIAL, METHOD_STRINGBUFFER_INIT_STRING),
3893            },
3894        },
3895        {   // new StringBuffer().append(Cc) = new StringBuffer("....")
3896            {
3897                new ConstantInstruction(InstructionConstants.OP_INVOKESPECIAL, METHOD_STRINGBUFFER_INIT),
3898                new ConstantInstruction(InstructionConstants.OP_LDC, A),
3899                new ConstantInstruction(InstructionConstants.OP_INVOKEVIRTUAL, METHOD_STRINGBUFFER_APPEND_C),
3900            },{
3901                new ConstantInstruction(InstructionConstants.OP_LDC, CHAR_A_STRING),
3902                new ConstantInstruction(InstructionConstants.OP_INVOKESPECIAL, METHOD_STRINGBUFFER_INIT_STRING),
3903            },
3904        },
3905        {   // new StringBuffer().append(I) = new StringBuffer("....")
3906            {
3907                new ConstantInstruction(InstructionConstants.OP_INVOKESPECIAL, METHOD_STRINGBUFFER_INIT),
3908                new SimpleInstruction(InstructionConstants.OP_ICONST_0, A),
3909                new ConstantInstruction(InstructionConstants.OP_INVOKEVIRTUAL, METHOD_STRINGBUFFER_APPEND_I),
3910            },{
3911                new ConstantInstruction(InstructionConstants.OP_LDC, INT_A_STRING),
3912                new ConstantInstruction(InstructionConstants.OP_INVOKESPECIAL, METHOD_STRINGBUFFER_INIT_STRING),
3913            },
3914        },
3915        {   // new StringBuffer().append(Ic) = new StringBuffer("....")
3916            {
3917                new ConstantInstruction(InstructionConstants.OP_INVOKESPECIAL, METHOD_STRINGBUFFER_INIT),
3918                new ConstantInstruction(InstructionConstants.OP_LDC, A),
3919                new ConstantInstruction(InstructionConstants.OP_INVOKEVIRTUAL, METHOD_STRINGBUFFER_APPEND_I),
3920            },{
3921                new ConstantInstruction(InstructionConstants.OP_LDC, INT_A_STRING),
3922                new ConstantInstruction(InstructionConstants.OP_INVOKESPECIAL, METHOD_STRINGBUFFER_INIT_STRING),
3923            },
3924        },
3925        {   // new StringBuffer().append(J) = new StringBuffer("....")
3926            {
3927                new ConstantInstruction(InstructionConstants.OP_INVOKESPECIAL, METHOD_STRINGBUFFER_INIT),
3928                new SimpleInstruction(InstructionConstants.OP_LCONST_0, A),
3929                new ConstantInstruction(InstructionConstants.OP_INVOKEVIRTUAL, METHOD_STRINGBUFFER_APPEND_J),
3930            },{
3931                new ConstantInstruction(InstructionConstants.OP_LDC, LONG_A_STRING),
3932                new ConstantInstruction(InstructionConstants.OP_INVOKESPECIAL, METHOD_STRINGBUFFER_INIT_STRING),
3933            },
3934        },
3935        {   // new StringBuffer().append(Jc) = new StringBuffer("....")
3936            {
3937                new ConstantInstruction(InstructionConstants.OP_INVOKESPECIAL, METHOD_STRINGBUFFER_INIT),
3938                new ConstantInstruction(InstructionConstants.OP_LDC2_W, A),
3939                new ConstantInstruction(InstructionConstants.OP_INVOKEVIRTUAL, METHOD_STRINGBUFFER_APPEND_J),
3940            },{
3941                new ConstantInstruction(InstructionConstants.OP_LDC, LONG_A_STRING),
3942                new ConstantInstruction(InstructionConstants.OP_INVOKESPECIAL, METHOD_STRINGBUFFER_INIT_STRING),
3943            },
3944        },
3945        {   // new StringBuffer().append(F) = new StringBuffer("....")
3946            {
3947                new ConstantInstruction(InstructionConstants.OP_INVOKESPECIAL, METHOD_STRINGBUFFER_INIT),
3948                new SimpleInstruction(InstructionConstants.OP_FCONST_0, A),
3949                new ConstantInstruction(InstructionConstants.OP_INVOKEVIRTUAL, METHOD_STRINGBUFFER_APPEND_F),
3950            },{
3951                new ConstantInstruction(InstructionConstants.OP_LDC, FLOAT_A_STRING),
3952                new ConstantInstruction(InstructionConstants.OP_INVOKESPECIAL, METHOD_STRINGBUFFER_INIT_STRING),
3953            },
3954        },
3955        {   // new StringBuffer().append(Fc) = new StringBuffer("....")
3956            {
3957                new ConstantInstruction(InstructionConstants.OP_INVOKESPECIAL, METHOD_STRINGBUFFER_INIT),
3958                new ConstantInstruction(InstructionConstants.OP_LDC, A),
3959                new ConstantInstruction(InstructionConstants.OP_INVOKEVIRTUAL, METHOD_STRINGBUFFER_APPEND_F),
3960            },{
3961                new ConstantInstruction(InstructionConstants.OP_LDC, FLOAT_A_STRING),
3962                new ConstantInstruction(InstructionConstants.OP_INVOKESPECIAL, METHOD_STRINGBUFFER_INIT_STRING),
3963            },
3964        },
3965        {   // new StringBuffer().append(D) = new StringBuffer("....")
3966            {
3967                new ConstantInstruction(InstructionConstants.OP_INVOKESPECIAL, METHOD_STRINGBUFFER_INIT),
3968                new SimpleInstruction(InstructionConstants.OP_DCONST_0, A),
3969                new ConstantInstruction(InstructionConstants.OP_INVOKEVIRTUAL, METHOD_STRINGBUFFER_APPEND_D),
3970            },{
3971                new ConstantInstruction(InstructionConstants.OP_LDC, DOUBLE_A_STRING),
3972                new ConstantInstruction(InstructionConstants.OP_INVOKESPECIAL, METHOD_STRINGBUFFER_INIT_STRING),
3973            },
3974        },
3975        {   // new StringBuffer().append(Dc) = new StringBuffer("....")
3976            {
3977                new ConstantInstruction(InstructionConstants.OP_INVOKESPECIAL, METHOD_STRINGBUFFER_INIT),
3978                new ConstantInstruction(InstructionConstants.OP_LDC2_W, A),
3979                new ConstantInstruction(InstructionConstants.OP_INVOKEVIRTUAL, METHOD_STRINGBUFFER_APPEND_D),
3980            },{
3981                new ConstantInstruction(InstructionConstants.OP_LDC, DOUBLE_A_STRING),
3982                new ConstantInstruction(InstructionConstants.OP_INVOKESPECIAL, METHOD_STRINGBUFFER_INIT_STRING),
3983            },
3984        },
3985        {   // new StringBuffer().append("...") = new StringBuffer("...")
3986            {
3987                new ConstantInstruction(InstructionConstants.OP_INVOKESPECIAL, METHOD_STRINGBUFFER_INIT),
3988                new ConstantInstruction(InstructionConstants.OP_LDC, A),
3989                new ConstantInstruction(InstructionConstants.OP_INVOKEVIRTUAL, METHOD_STRINGBUFFER_APPEND_STRING),
3990            },{
3991                new ConstantInstruction(InstructionConstants.OP_LDC, A),
3992                new ConstantInstruction(InstructionConstants.OP_INVOKESPECIAL, METHOD_STRINGBUFFER_INIT_STRING),
3993            },
3994        },
3995        {   // new StringBuffer("...").append(Z) = new StringBuffer("....")
3996            {
3997                new ConstantInstruction(InstructionConstants.OP_LDC, A),
3998                new ConstantInstruction(InstructionConstants.OP_INVOKESPECIAL, METHOD_STRINGBUFFER_INIT_STRING),
3999                new SimpleInstruction(InstructionConstants.OP_ICONST_0, B),
4000                new ConstantInstruction(InstructionConstants.OP_INVOKEVIRTUAL, METHOD_STRINGBUFFER_APPEND_Z),
4001            },{
4002                new ConstantInstruction(InstructionConstants.OP_LDC, STRING_A_STRING | BOOLEAN_B_STRING),
4003                new ConstantInstruction(InstructionConstants.OP_INVOKESPECIAL, METHOD_STRINGBUFFER_INIT_STRING),
4004            },
4005        },
4006        {   // new StringBuffer("...").append(C) = new StringBuffer("....")
4007            {
4008                new ConstantInstruction(InstructionConstants.OP_LDC, A),
4009                new ConstantInstruction(InstructionConstants.OP_INVOKESPECIAL, METHOD_STRINGBUFFER_INIT_STRING),
4010                new SimpleInstruction(InstructionConstants.OP_ICONST_0, B),
4011                new ConstantInstruction(InstructionConstants.OP_INVOKEVIRTUAL, METHOD_STRINGBUFFER_APPEND_C),
4012            },{
4013                new ConstantInstruction(InstructionConstants.OP_LDC, STRING_A_STRING | CHAR_B_STRING),
4014                new ConstantInstruction(InstructionConstants.OP_INVOKESPECIAL, METHOD_STRINGBUFFER_INIT_STRING),
4015            },
4016        },
4017        {   // new StringBuffer("...").append(Cc) = new StringBuffer("....")
4018            {
4019                new ConstantInstruction(InstructionConstants.OP_LDC, A),
4020                new ConstantInstruction(InstructionConstants.OP_INVOKESPECIAL, METHOD_STRINGBUFFER_INIT_STRING),
4021                new ConstantInstruction(InstructionConstants.OP_LDC, B),
4022                new ConstantInstruction(InstructionConstants.OP_INVOKEVIRTUAL, METHOD_STRINGBUFFER_APPEND_C),
4023            },{
4024                new ConstantInstruction(InstructionConstants.OP_LDC, STRING_A_STRING | CHAR_B_STRING),
4025                new ConstantInstruction(InstructionConstants.OP_INVOKESPECIAL, METHOD_STRINGBUFFER_INIT_STRING),
4026            },
4027        },
4028        {   // new StringBuffer("...").append(I) = new StringBuffer("....")
4029            {
4030                new ConstantInstruction(InstructionConstants.OP_LDC, A),
4031                new ConstantInstruction(InstructionConstants.OP_INVOKESPECIAL, METHOD_STRINGBUFFER_INIT_STRING),
4032                new SimpleInstruction(InstructionConstants.OP_ICONST_0, B),
4033                new ConstantInstruction(InstructionConstants.OP_INVOKEVIRTUAL, METHOD_STRINGBUFFER_APPEND_I),
4034            },{
4035                new ConstantInstruction(InstructionConstants.OP_LDC, STRING_A_STRING | INT_B_STRING),
4036                new ConstantInstruction(InstructionConstants.OP_INVOKESPECIAL, METHOD_STRINGBUFFER_INIT_STRING),
4037            },
4038        },
4039        {   // new StringBuffer("...").append(Ic) = new StringBuffer("....")
4040            {
4041                new ConstantInstruction(InstructionConstants.OP_LDC, A),
4042                new ConstantInstruction(InstructionConstants.OP_INVOKESPECIAL, METHOD_STRINGBUFFER_INIT_STRING),
4043                new ConstantInstruction(InstructionConstants.OP_LDC, B),
4044                new ConstantInstruction(InstructionConstants.OP_INVOKEVIRTUAL, METHOD_STRINGBUFFER_APPEND_I),
4045            },{
4046                new ConstantInstruction(InstructionConstants.OP_LDC, STRING_A_STRING | INT_B_STRING),
4047                new ConstantInstruction(InstructionConstants.OP_INVOKESPECIAL, METHOD_STRINGBUFFER_INIT_STRING),
4048            },
4049        },
4050        {   // new StringBuffer("...").append(J) = new StringBuffer("....")
4051            {
4052                new ConstantInstruction(InstructionConstants.OP_LDC, A),
4053                new ConstantInstruction(InstructionConstants.OP_INVOKESPECIAL, METHOD_STRINGBUFFER_INIT_STRING),
4054                new SimpleInstruction(InstructionConstants.OP_LCONST_0, B),
4055                new ConstantInstruction(InstructionConstants.OP_INVOKEVIRTUAL, METHOD_STRINGBUFFER_APPEND_J),
4056            },{
4057                new ConstantInstruction(InstructionConstants.OP_LDC, STRING_A_STRING | LONG_B_STRING),
4058                new ConstantInstruction(InstructionConstants.OP_INVOKESPECIAL, METHOD_STRINGBUFFER_INIT_STRING),
4059            },
4060        },
4061        {   // new StringBuffer("...").append(Jc) = new StringBuffer("....")
4062            {
4063                new ConstantInstruction(InstructionConstants.OP_LDC, A),
4064                new ConstantInstruction(InstructionConstants.OP_INVOKESPECIAL, METHOD_STRINGBUFFER_INIT_STRING),
4065                new ConstantInstruction(InstructionConstants.OP_LDC2_W, B),
4066                new ConstantInstruction(InstructionConstants.OP_INVOKEVIRTUAL, METHOD_STRINGBUFFER_APPEND_J),
4067            },{
4068                new ConstantInstruction(InstructionConstants.OP_LDC, STRING_A_STRING | LONG_B_STRING),
4069                new ConstantInstruction(InstructionConstants.OP_INVOKESPECIAL, METHOD_STRINGBUFFER_INIT_STRING),
4070            },
4071        },
4072        {   // new StringBuffer("...").append(F) = new StringBuffer("....")
4073            {
4074                new ConstantInstruction(InstructionConstants.OP_LDC, A),
4075                new ConstantInstruction(InstructionConstants.OP_INVOKESPECIAL, METHOD_STRINGBUFFER_INIT_STRING),
4076                new SimpleInstruction(InstructionConstants.OP_FCONST_0, B),
4077                new ConstantInstruction(InstructionConstants.OP_INVOKEVIRTUAL, METHOD_STRINGBUFFER_APPEND_F),
4078            },{
4079                new ConstantInstruction(InstructionConstants.OP_LDC, STRING_A_STRING | FLOAT_B_STRING),
4080                new ConstantInstruction(InstructionConstants.OP_INVOKESPECIAL, METHOD_STRINGBUFFER_INIT_STRING),
4081            },
4082        },
4083        {   // new StringBuffer("...").append(Fc) = new StringBuffer("....")
4084            {
4085                new ConstantInstruction(InstructionConstants.OP_LDC, A),
4086                new ConstantInstruction(InstructionConstants.OP_INVOKESPECIAL, METHOD_STRINGBUFFER_INIT_STRING),
4087                new ConstantInstruction(InstructionConstants.OP_LDC, B),
4088                new ConstantInstruction(InstructionConstants.OP_INVOKEVIRTUAL, METHOD_STRINGBUFFER_APPEND_F),
4089            },{
4090                new ConstantInstruction(InstructionConstants.OP_LDC, STRING_A_STRING | FLOAT_B_STRING),
4091                new ConstantInstruction(InstructionConstants.OP_INVOKESPECIAL, METHOD_STRINGBUFFER_INIT_STRING),
4092            },
4093        },
4094        {   // new StringBuffer("...").append(D) = new StringBuffer("....")
4095            {
4096                new ConstantInstruction(InstructionConstants.OP_LDC, A),
4097                new ConstantInstruction(InstructionConstants.OP_INVOKESPECIAL, METHOD_STRINGBUFFER_INIT_STRING),
4098                new SimpleInstruction(InstructionConstants.OP_DCONST_0, B),
4099                new ConstantInstruction(InstructionConstants.OP_INVOKEVIRTUAL, METHOD_STRINGBUFFER_APPEND_D),
4100            },{
4101                new ConstantInstruction(InstructionConstants.OP_LDC, STRING_A_STRING | DOUBLE_B_STRING),
4102                new ConstantInstruction(InstructionConstants.OP_INVOKESPECIAL, METHOD_STRINGBUFFER_INIT_STRING),
4103            },
4104        },
4105        {   // new StringBuffer("...").append(Dc) = new StringBuffer("....")
4106            {
4107                new ConstantInstruction(InstructionConstants.OP_LDC, A),
4108                new ConstantInstruction(InstructionConstants.OP_INVOKESPECIAL, METHOD_STRINGBUFFER_INIT_STRING),
4109                new ConstantInstruction(InstructionConstants.OP_LDC2_W, B),
4110                new ConstantInstruction(InstructionConstants.OP_INVOKEVIRTUAL, METHOD_STRINGBUFFER_APPEND_D),
4111            },{
4112                new ConstantInstruction(InstructionConstants.OP_LDC, STRING_A_STRING | DOUBLE_B_STRING),
4113                new ConstantInstruction(InstructionConstants.OP_INVOKESPECIAL, METHOD_STRINGBUFFER_INIT_STRING),
4114            },
4115        },
4116        {   // new StringBuffer("...").append("...") = new StringBuffer("......")
4117            {
4118                new ConstantInstruction(InstructionConstants.OP_LDC, A),
4119                new ConstantInstruction(InstructionConstants.OP_INVOKESPECIAL, METHOD_STRINGBUFFER_INIT_STRING),
4120                new ConstantInstruction(InstructionConstants.OP_LDC, B),
4121                new ConstantInstruction(InstructionConstants.OP_INVOKEVIRTUAL, METHOD_STRINGBUFFER_APPEND_STRING),
4122            },{
4123                new ConstantInstruction(InstructionConstants.OP_LDC, STRING_A_STRING | STRING_B_STRING),
4124                new ConstantInstruction(InstructionConstants.OP_INVOKESPECIAL, METHOD_STRINGBUFFER_INIT_STRING),
4125            },
4126        },
4127        {   // StringBuffer#append("...").append(Z) = StringBuffer#append("....")
4128            {
4129                new ConstantInstruction(InstructionConstants.OP_LDC, A),
4130                new ConstantInstruction(InstructionConstants.OP_INVOKEVIRTUAL, METHOD_STRINGBUFFER_APPEND_STRING),
4131                new SimpleInstruction(InstructionConstants.OP_ICONST_0, B),
4132                new ConstantInstruction(InstructionConstants.OP_INVOKEVIRTUAL, METHOD_STRINGBUFFER_APPEND_Z),
4133            },{
4134                new ConstantInstruction(InstructionConstants.OP_LDC, STRING_A_STRING | BOOLEAN_B_STRING),
4135                new ConstantInstruction(InstructionConstants.OP_INVOKEVIRTUAL, METHOD_STRINGBUFFER_APPEND_STRING),
4136            },
4137        },
4138        {   // StringBuffer#append("...").append(C) = StringBuffer#append("....")
4139            {
4140                new ConstantInstruction(InstructionConstants.OP_LDC, A),
4141                new ConstantInstruction(InstructionConstants.OP_INVOKEVIRTUAL, METHOD_STRINGBUFFER_APPEND_STRING),
4142                new SimpleInstruction(InstructionConstants.OP_ICONST_0, B),
4143                new ConstantInstruction(InstructionConstants.OP_INVOKEVIRTUAL, METHOD_STRINGBUFFER_APPEND_C),
4144            },{
4145                new ConstantInstruction(InstructionConstants.OP_LDC, STRING_A_STRING | CHAR_B_STRING),
4146                new ConstantInstruction(InstructionConstants.OP_INVOKEVIRTUAL, METHOD_STRINGBUFFER_APPEND_STRING),
4147            },
4148        },
4149        {   // StringBuffer#append("...").append(Cc) = StringBuffer#append("....")
4150            {
4151                new ConstantInstruction(InstructionConstants.OP_LDC, A),
4152                new ConstantInstruction(InstructionConstants.OP_INVOKEVIRTUAL, METHOD_STRINGBUFFER_APPEND_STRING),
4153                new ConstantInstruction(InstructionConstants.OP_LDC, B),
4154                new ConstantInstruction(InstructionConstants.OP_INVOKEVIRTUAL, METHOD_STRINGBUFFER_APPEND_C),
4155            },{
4156                new ConstantInstruction(InstructionConstants.OP_LDC, STRING_A_STRING | CHAR_B_STRING),
4157                new ConstantInstruction(InstructionConstants.OP_INVOKEVIRTUAL, METHOD_STRINGBUFFER_APPEND_STRING),
4158            },
4159        },
4160        {   // StringBuffer#append("...").append(I) = StringBuffer#append("....")
4161            {
4162                new ConstantInstruction(InstructionConstants.OP_LDC, A),
4163                new ConstantInstruction(InstructionConstants.OP_INVOKEVIRTUAL, METHOD_STRINGBUFFER_APPEND_STRING),
4164                new SimpleInstruction(InstructionConstants.OP_ICONST_0, B),
4165                new ConstantInstruction(InstructionConstants.OP_INVOKEVIRTUAL, METHOD_STRINGBUFFER_APPEND_I),
4166            },{
4167                new ConstantInstruction(InstructionConstants.OP_LDC, STRING_A_STRING | INT_B_STRING),
4168                new ConstantInstruction(InstructionConstants.OP_INVOKEVIRTUAL, METHOD_STRINGBUFFER_APPEND_STRING),
4169            },
4170        },
4171        {   // StringBuffer#append("...").append(Ic) = StringBuffer#append("....")
4172            {
4173                new ConstantInstruction(InstructionConstants.OP_LDC, A),
4174                new ConstantInstruction(InstructionConstants.OP_INVOKEVIRTUAL, METHOD_STRINGBUFFER_APPEND_STRING),
4175                new ConstantInstruction(InstructionConstants.OP_LDC, B),
4176                new ConstantInstruction(InstructionConstants.OP_INVOKEVIRTUAL, METHOD_STRINGBUFFER_APPEND_I),
4177            },{
4178                new ConstantInstruction(InstructionConstants.OP_LDC, STRING_A_STRING | INT_B_STRING),
4179                new ConstantInstruction(InstructionConstants.OP_INVOKEVIRTUAL, METHOD_STRINGBUFFER_APPEND_STRING),
4180            },
4181        },
4182        {   // StringBuffer#append("...").append(J) = StringBuffer#append("....")
4183            {
4184                new ConstantInstruction(InstructionConstants.OP_LDC, A),
4185                new ConstantInstruction(InstructionConstants.OP_INVOKEVIRTUAL, METHOD_STRINGBUFFER_APPEND_STRING),
4186                new SimpleInstruction(InstructionConstants.OP_LCONST_0, B),
4187                new ConstantInstruction(InstructionConstants.OP_INVOKEVIRTUAL, METHOD_STRINGBUFFER_APPEND_J),
4188            },{
4189                new ConstantInstruction(InstructionConstants.OP_LDC, STRING_A_STRING | LONG_B_STRING),
4190                new ConstantInstruction(InstructionConstants.OP_INVOKEVIRTUAL, METHOD_STRINGBUFFER_APPEND_STRING),
4191            },
4192        },
4193        {   // StringBuffer#append("...").append(Jc) = StringBuffer#append("....")
4194            {
4195                new ConstantInstruction(InstructionConstants.OP_LDC, A),
4196                new ConstantInstruction(InstructionConstants.OP_INVOKEVIRTUAL, METHOD_STRINGBUFFER_APPEND_STRING),
4197                new ConstantInstruction(InstructionConstants.OP_LDC2_W, B),
4198                new ConstantInstruction(InstructionConstants.OP_INVOKEVIRTUAL, METHOD_STRINGBUFFER_APPEND_J),
4199            },{
4200                new ConstantInstruction(InstructionConstants.OP_LDC, STRING_A_STRING | LONG_B_STRING),
4201                new ConstantInstruction(InstructionConstants.OP_INVOKEVIRTUAL, METHOD_STRINGBUFFER_APPEND_STRING),
4202            },
4203        },
4204        {   // StringBuffer#append("...").append(F) = StringBuffer#append("....")
4205            {
4206                new ConstantInstruction(InstructionConstants.OP_LDC, A),
4207                new ConstantInstruction(InstructionConstants.OP_INVOKEVIRTUAL, METHOD_STRINGBUFFER_APPEND_STRING),
4208                new SimpleInstruction(InstructionConstants.OP_FCONST_0, B),
4209                new ConstantInstruction(InstructionConstants.OP_INVOKEVIRTUAL, METHOD_STRINGBUFFER_APPEND_F),
4210            },{
4211                new ConstantInstruction(InstructionConstants.OP_LDC, STRING_A_STRING | FLOAT_B_STRING),
4212                new ConstantInstruction(InstructionConstants.OP_INVOKEVIRTUAL, METHOD_STRINGBUFFER_APPEND_STRING),
4213            },
4214        },
4215        {   // StringBuffer#append("...").append(Fc) = StringBuffer#append("....")
4216            {
4217                new ConstantInstruction(InstructionConstants.OP_LDC, A),
4218                new ConstantInstruction(InstructionConstants.OP_INVOKEVIRTUAL, METHOD_STRINGBUFFER_APPEND_STRING),
4219                new ConstantInstruction(InstructionConstants.OP_LDC, B),
4220                new ConstantInstruction(InstructionConstants.OP_INVOKEVIRTUAL, METHOD_STRINGBUFFER_APPEND_F),
4221            },{
4222                new ConstantInstruction(InstructionConstants.OP_LDC, STRING_A_STRING | FLOAT_B_STRING),
4223                new ConstantInstruction(InstructionConstants.OP_INVOKEVIRTUAL, METHOD_STRINGBUFFER_APPEND_STRING),
4224            },
4225        },
4226        {   // StringBuffer#append("...").append(D) = StringBuffer#append("....")
4227            {
4228                new ConstantInstruction(InstructionConstants.OP_LDC, A),
4229                new ConstantInstruction(InstructionConstants.OP_INVOKEVIRTUAL, METHOD_STRINGBUFFER_APPEND_STRING),
4230                new SimpleInstruction(InstructionConstants.OP_DCONST_0, B),
4231                new ConstantInstruction(InstructionConstants.OP_INVOKEVIRTUAL, METHOD_STRINGBUFFER_APPEND_D),
4232            },{
4233                new ConstantInstruction(InstructionConstants.OP_LDC, STRING_A_STRING | DOUBLE_B_STRING),
4234                new ConstantInstruction(InstructionConstants.OP_INVOKEVIRTUAL, METHOD_STRINGBUFFER_APPEND_STRING),
4235            },
4236        },
4237        {   // StringBuffer#append("...").append(Dc) = StringBuffer#append("....")
4238            {
4239                new ConstantInstruction(InstructionConstants.OP_LDC, A),
4240                new ConstantInstruction(InstructionConstants.OP_INVOKEVIRTUAL, METHOD_STRINGBUFFER_APPEND_STRING),
4241                new ConstantInstruction(InstructionConstants.OP_LDC2_W, B),
4242                new ConstantInstruction(InstructionConstants.OP_INVOKEVIRTUAL, METHOD_STRINGBUFFER_APPEND_D),
4243            },{
4244                new ConstantInstruction(InstructionConstants.OP_LDC, STRING_A_STRING | DOUBLE_B_STRING),
4245                new ConstantInstruction(InstructionConstants.OP_INVOKEVIRTUAL, METHOD_STRINGBUFFER_APPEND_STRING),
4246            },
4247        },
4248        {   // StringBuffer#append("...").append("...") = StringBuffer#append("......")
4249            {
4250                new ConstantInstruction(InstructionConstants.OP_LDC, A),
4251                new ConstantInstruction(InstructionConstants.OP_INVOKEVIRTUAL, METHOD_STRINGBUFFER_APPEND_STRING),
4252                new ConstantInstruction(InstructionConstants.OP_LDC, B),
4253                new ConstantInstruction(InstructionConstants.OP_INVOKEVIRTUAL, METHOD_STRINGBUFFER_APPEND_STRING),
4254            },{
4255                new ConstantInstruction(InstructionConstants.OP_LDC, STRING_A_STRING | STRING_B_STRING),
4256                new ConstantInstruction(InstructionConstants.OP_INVOKEVIRTUAL, METHOD_STRINGBUFFER_APPEND_STRING),
4257            },
4258        },
4259        {   // new StringBuffer().append(z).toString() = String.valueOf(z)
4260            {
4261                new ConstantInstruction(InstructionConstants.OP_NEW, CLASS_STRINGBUFFER),
4262                new SimpleInstruction(InstructionConstants.OP_DUP),
4263                new ConstantInstruction(InstructionConstants.OP_INVOKESPECIAL, METHOD_STRINGBUFFER_INIT),
4264                new VariableInstruction(InstructionConstants.OP_ILOAD, A),
4265                new ConstantInstruction(InstructionConstants.OP_INVOKEVIRTUAL, METHOD_STRINGBUFFER_APPEND_Z),
4266                new ConstantInstruction(InstructionConstants.OP_INVOKEVIRTUAL, METHOD_STRINGBUFFER_TOSTRING),
4267            },{
4268                new VariableInstruction(InstructionConstants.OP_ILOAD, A),
4269                new ConstantInstruction(InstructionConstants.OP_INVOKESTATIC, METHOD_STRING_VALUEOF_Z),
4270            },
4271        },
4272        {   // new StringBuffer().append(c).toString() = String.valueOf(c)
4273            {
4274                new ConstantInstruction(InstructionConstants.OP_NEW, CLASS_STRINGBUFFER),
4275                new SimpleInstruction(InstructionConstants.OP_DUP),
4276                new ConstantInstruction(InstructionConstants.OP_INVOKESPECIAL, METHOD_STRINGBUFFER_INIT),
4277                new VariableInstruction(InstructionConstants.OP_ILOAD, A),
4278                new ConstantInstruction(InstructionConstants.OP_INVOKEVIRTUAL, METHOD_STRINGBUFFER_APPEND_C),
4279                new ConstantInstruction(InstructionConstants.OP_INVOKEVIRTUAL, METHOD_STRINGBUFFER_TOSTRING),
4280            },{
4281                new VariableInstruction(InstructionConstants.OP_ILOAD, A),
4282                new ConstantInstruction(InstructionConstants.OP_INVOKESTATIC, METHOD_STRING_VALUEOF_C),
4283            },
4284        },
4285        {   // new StringBuffer().append(i).toString() = String.valueOf(i)
4286            {
4287                new ConstantInstruction(InstructionConstants.OP_NEW, CLASS_STRINGBUFFER),
4288                new SimpleInstruction(InstructionConstants.OP_DUP),
4289                new ConstantInstruction(InstructionConstants.OP_INVOKESPECIAL, METHOD_STRINGBUFFER_INIT),
4290                new VariableInstruction(InstructionConstants.OP_ILOAD, A),
4291                new ConstantInstruction(InstructionConstants.OP_INVOKEVIRTUAL, METHOD_STRINGBUFFER_APPEND_I),
4292                new ConstantInstruction(InstructionConstants.OP_INVOKEVIRTUAL, METHOD_STRINGBUFFER_TOSTRING),
4293            },{
4294                new VariableInstruction(InstructionConstants.OP_ILOAD, A),
4295                new ConstantInstruction(InstructionConstants.OP_INVOKESTATIC, METHOD_STRING_VALUEOF_I),
4296            },
4297        },
4298        {   // new StringBuffer().append(j).toString() = String.valueOf(j)
4299            {
4300                new ConstantInstruction(InstructionConstants.OP_NEW, CLASS_STRINGBUFFER),
4301                new SimpleInstruction(InstructionConstants.OP_DUP),
4302                new ConstantInstruction(InstructionConstants.OP_INVOKESPECIAL, METHOD_STRINGBUFFER_INIT),
4303                new VariableInstruction(InstructionConstants.OP_LLOAD, A),
4304                new ConstantInstruction(InstructionConstants.OP_INVOKEVIRTUAL, METHOD_STRINGBUFFER_APPEND_J),
4305                new ConstantInstruction(InstructionConstants.OP_INVOKEVIRTUAL, METHOD_STRINGBUFFER_TOSTRING),
4306           },{
4307                new VariableInstruction(InstructionConstants.OP_LLOAD, A),
4308                new ConstantInstruction(InstructionConstants.OP_INVOKESTATIC, METHOD_STRING_VALUEOF_J),
4309            },
4310        },
4311        {   // new StringBuffer().append(f).toString() = String.valueOf(f)
4312            {
4313                new ConstantInstruction(InstructionConstants.OP_NEW, CLASS_STRINGBUFFER),
4314                new SimpleInstruction(InstructionConstants.OP_DUP),
4315                new ConstantInstruction(InstructionConstants.OP_INVOKESPECIAL, METHOD_STRINGBUFFER_INIT),
4316                new VariableInstruction(InstructionConstants.OP_FLOAD, A),
4317                new ConstantInstruction(InstructionConstants.OP_INVOKEVIRTUAL, METHOD_STRINGBUFFER_APPEND_F),
4318                new ConstantInstruction(InstructionConstants.OP_INVOKEVIRTUAL, METHOD_STRINGBUFFER_TOSTRING),
4319            },{
4320                new VariableInstruction(InstructionConstants.OP_FLOAD, A),
4321                new ConstantInstruction(InstructionConstants.OP_INVOKESTATIC, METHOD_STRING_VALUEOF_F),
4322            },
4323        },
4324        {   // new StringBuffer().append(d).toString() = String.valueOf(d)
4325            {
4326                new ConstantInstruction(InstructionConstants.OP_NEW, CLASS_STRINGBUFFER),
4327                new SimpleInstruction(InstructionConstants.OP_DUP),
4328                new ConstantInstruction(InstructionConstants.OP_INVOKESPECIAL, METHOD_STRINGBUFFER_INIT),
4329                new VariableInstruction(InstructionConstants.OP_DLOAD, A),
4330                new ConstantInstruction(InstructionConstants.OP_INVOKEVIRTUAL, METHOD_STRINGBUFFER_APPEND_D),
4331                new ConstantInstruction(InstructionConstants.OP_INVOKEVIRTUAL, METHOD_STRINGBUFFER_TOSTRING),
4332            },{
4333                new VariableInstruction(InstructionConstants.OP_DLOAD, A),
4334                new ConstantInstruction(InstructionConstants.OP_INVOKESTATIC, METHOD_STRING_VALUEOF_D),
4335            },
4336        },
4337        {   // new StringBuffer().append(string).toString() = string
4338            {
4339                new ConstantInstruction(InstructionConstants.OP_NEW, CLASS_STRINGBUFFER),
4340                new SimpleInstruction(InstructionConstants.OP_DUP),
4341                new ConstantInstruction(InstructionConstants.OP_INVOKESPECIAL, METHOD_STRINGBUFFER_INIT),
4342                new VariableInstruction(InstructionConstants.OP_ALOAD, A),
4343                new ConstantInstruction(InstructionConstants.OP_INVOKEVIRTUAL, METHOD_STRINGBUFFER_APPEND_STRING),
4344                new ConstantInstruction(InstructionConstants.OP_INVOKEVIRTUAL, METHOD_STRINGBUFFER_TOSTRING),
4345            },{
4346                new VariableInstruction(InstructionConstants.OP_ALOAD, A),
4347            },
4348        },
4349        {   // new StringBuffer().append(object).toString() = String.valueOf(object)
4350            {
4351                new ConstantInstruction(InstructionConstants.OP_NEW, CLASS_STRINGBUFFER),
4352                new SimpleInstruction(InstructionConstants.OP_DUP),
4353                new ConstantInstruction(InstructionConstants.OP_INVOKESPECIAL, METHOD_STRINGBUFFER_INIT),
4354                new VariableInstruction(InstructionConstants.OP_ALOAD, A),
4355                new ConstantInstruction(InstructionConstants.OP_INVOKEVIRTUAL, METHOD_STRINGBUFFER_APPEND_OBJECT),
4356                new ConstantInstruction(InstructionConstants.OP_INVOKEVIRTUAL, METHOD_STRINGBUFFER_TOSTRING),
4357            },{
4358                new VariableInstruction(InstructionConstants.OP_ALOAD, A),
4359                new ConstantInstruction(InstructionConstants.OP_INVOKESTATIC, METHOD_STRING_VALUEOF_OBJECT),
4360            },
4361        },
4362
4363        {   // new StringBuilder("...").toString() = "..." (ignoring identity)
4364            {
4365                new ConstantInstruction(InstructionConstants.OP_NEW, CLASS_STRINGBUILDER),
4366                new SimpleInstruction(InstructionConstants.OP_DUP),
4367                new ConstantInstruction(InstructionConstants.OP_LDC, A),
4368                new ConstantInstruction(InstructionConstants.OP_INVOKESPECIAL, METHOD_STRINGBUILDER_INIT_STRING),
4369                new ConstantInstruction(InstructionConstants.OP_INVOKEVIRTUAL, METHOD_STRINGBUILDER_TOSTRING),
4370            },{
4371                new ConstantInstruction(InstructionConstants.OP_LDC, A),
4372            },
4373        },
4374        {   // new StringBuilder(string).toString() = string (ignoring identity)
4375            {
4376                new ConstantInstruction(InstructionConstants.OP_NEW, CLASS_STRINGBUILDER),
4377                new SimpleInstruction(InstructionConstants.OP_DUP),
4378                new VariableInstruction(InstructionConstants.OP_ALOAD, A),
4379                new ConstantInstruction(InstructionConstants.OP_INVOKESPECIAL, METHOD_STRINGBUILDER_INIT_STRING),
4380                new ConstantInstruction(InstructionConstants.OP_INVOKEVIRTUAL, METHOD_STRINGBUILDER_TOSTRING),
4381            },{
4382                new VariableInstruction(InstructionConstants.OP_ALOAD, A),
4383            },
4384        },
4385        {   // new StringBuilder("...").length() = length
4386            {
4387                new ConstantInstruction(InstructionConstants.OP_NEW, CLASS_STRINGBUILDER),
4388                new SimpleInstruction(InstructionConstants.OP_DUP),
4389                new ConstantInstruction(InstructionConstants.OP_LDC, A),
4390                new ConstantInstruction(InstructionConstants.OP_INVOKESPECIAL, METHOD_STRINGBUILDER_INIT_STRING),
4391                new ConstantInstruction(InstructionConstants.OP_INVOKEVIRTUAL, METHOD_STRINGBUILDER_LENGTH),
4392            },{
4393                new SimpleInstruction(InstructionConstants.OP_SIPUSH, STRING_A_LENGTH),
4394            },
4395        },
4396        {   // new StringBuilder() (without dup) = nothing
4397            {
4398                new ConstantInstruction(InstructionConstants.OP_NEW, CLASS_STRINGBUILDER),
4399                new ConstantInstruction(InstructionConstants.OP_LDC, A),
4400                new ConstantInstruction(InstructionConstants.OP_INVOKESPECIAL, METHOD_STRINGBUILDER_INIT),
4401            },{
4402                // Nothing.
4403            },
4404        },
4405        {   // new StringBuilder("...") (without dup) = nothing
4406            {
4407                new ConstantInstruction(InstructionConstants.OP_NEW, CLASS_STRINGBUILDER),
4408                new ConstantInstruction(InstructionConstants.OP_LDC, A),
4409                new ConstantInstruction(InstructionConstants.OP_INVOKESPECIAL, METHOD_STRINGBUILDER_INIT_STRING),
4410            },{
4411                // Nothing.
4412            },
4413        },
4414        {   // new StringBuilder()/pop = nothing
4415            {
4416                new ConstantInstruction(InstructionConstants.OP_NEW, CLASS_STRINGBUILDER),
4417                new SimpleInstruction(InstructionConstants.OP_DUP),
4418                new ConstantInstruction(InstructionConstants.OP_LDC, A),
4419                new ConstantInstruction(InstructionConstants.OP_INVOKESPECIAL, METHOD_STRINGBUILDER_INIT),
4420                new SimpleInstruction(InstructionConstants.OP_POP),
4421            },{
4422                // Nothing.
4423            },
4424        },
4425        {   // new StringBuilder("...")/pop = nothing
4426            {
4427                new ConstantInstruction(InstructionConstants.OP_NEW, CLASS_STRINGBUILDER),
4428                new SimpleInstruction(InstructionConstants.OP_DUP),
4429                new ConstantInstruction(InstructionConstants.OP_LDC, A),
4430                new ConstantInstruction(InstructionConstants.OP_INVOKESPECIAL, METHOD_STRINGBUILDER_INIT_STRING),
4431                new SimpleInstruction(InstructionConstants.OP_POP),
4432            },{
4433                // Nothing.
4434            },
4435        },
4436        {   // new StringBuilder("...").append(z)/pop = nothing
4437            {
4438                new ConstantInstruction(InstructionConstants.OP_NEW, CLASS_STRINGBUILDER),
4439                new SimpleInstruction(InstructionConstants.OP_DUP),
4440                new ConstantInstruction(InstructionConstants.OP_LDC, A),
4441                new ConstantInstruction(InstructionConstants.OP_INVOKESPECIAL, METHOD_STRINGBUILDER_INIT_STRING),
4442                new VariableInstruction(InstructionConstants.OP_ILOAD, B),
4443                new ConstantInstruction(InstructionConstants.OP_INVOKEVIRTUAL, METHOD_STRINGBUILDER_APPEND_Z),
4444                new SimpleInstruction(InstructionConstants.OP_POP),
4445            },{
4446                // Nothing.
4447            },
4448        },
4449        {   // new StringBuilder("...").append(c)/pop = nothing
4450            {
4451                new ConstantInstruction(InstructionConstants.OP_NEW, CLASS_STRINGBUILDER),
4452                new SimpleInstruction(InstructionConstants.OP_DUP),
4453                new ConstantInstruction(InstructionConstants.OP_LDC, A),
4454                new ConstantInstruction(InstructionConstants.OP_INVOKESPECIAL, METHOD_STRINGBUILDER_INIT_STRING),
4455                new VariableInstruction(InstructionConstants.OP_ILOAD, B),
4456                new ConstantInstruction(InstructionConstants.OP_INVOKEVIRTUAL, METHOD_STRINGBUILDER_APPEND_C),
4457                new SimpleInstruction(InstructionConstants.OP_POP),
4458            },{
4459                // Nothing.
4460            },
4461        },
4462        {   // new StringBuilder("...").append(i)/pop = nothing
4463            {
4464                new ConstantInstruction(InstructionConstants.OP_NEW, CLASS_STRINGBUILDER),
4465                new SimpleInstruction(InstructionConstants.OP_DUP),
4466                new ConstantInstruction(InstructionConstants.OP_LDC, A),
4467                new ConstantInstruction(InstructionConstants.OP_INVOKESPECIAL, METHOD_STRINGBUILDER_INIT_STRING),
4468                new VariableInstruction(InstructionConstants.OP_ILOAD, B),
4469                new ConstantInstruction(InstructionConstants.OP_INVOKEVIRTUAL, METHOD_STRINGBUILDER_APPEND_I),
4470                new SimpleInstruction(InstructionConstants.OP_POP),
4471            },{
4472                // Nothing.
4473            },
4474        },
4475        {   // new StringBuilder("...").append(l)/pop = nothing
4476            {
4477                new ConstantInstruction(InstructionConstants.OP_NEW, CLASS_STRINGBUILDER),
4478                new SimpleInstruction(InstructionConstants.OP_DUP),
4479                new ConstantInstruction(InstructionConstants.OP_LDC, A),
4480                new ConstantInstruction(InstructionConstants.OP_INVOKESPECIAL, METHOD_STRINGBUILDER_INIT_STRING),
4481                new VariableInstruction(InstructionConstants.OP_LLOAD, B),
4482                new ConstantInstruction(InstructionConstants.OP_INVOKEVIRTUAL, METHOD_STRINGBUILDER_APPEND_J),
4483                new SimpleInstruction(InstructionConstants.OP_POP),
4484            },{
4485                // Nothing.
4486            },
4487        },
4488        {   // new StringBuilder("...").append(f)/pop = nothing
4489            {
4490                new ConstantInstruction(InstructionConstants.OP_NEW, CLASS_STRINGBUILDER),
4491                new SimpleInstruction(InstructionConstants.OP_DUP),
4492                new ConstantInstruction(InstructionConstants.OP_LDC, A),
4493                new ConstantInstruction(InstructionConstants.OP_INVOKESPECIAL, METHOD_STRINGBUILDER_INIT_STRING),
4494                new VariableInstruction(InstructionConstants.OP_FLOAD, B),
4495                new ConstantInstruction(InstructionConstants.OP_INVOKEVIRTUAL, METHOD_STRINGBUILDER_APPEND_F),
4496                new SimpleInstruction(InstructionConstants.OP_POP),
4497            },{
4498                // Nothing.
4499            },
4500        },
4501        {   // new StringBuilder("...").append(d)/pop = nothing
4502            {
4503                new ConstantInstruction(InstructionConstants.OP_NEW, CLASS_STRINGBUILDER),
4504                new SimpleInstruction(InstructionConstants.OP_DUP),
4505                new ConstantInstruction(InstructionConstants.OP_LDC, A),
4506                new ConstantInstruction(InstructionConstants.OP_INVOKESPECIAL, METHOD_STRINGBUILDER_INIT_STRING),
4507                new VariableInstruction(InstructionConstants.OP_DLOAD, B),
4508                new ConstantInstruction(InstructionConstants.OP_INVOKEVIRTUAL, METHOD_STRINGBUILDER_APPEND_D),
4509                new SimpleInstruction(InstructionConstants.OP_POP),
4510            },{
4511                // Nothing.
4512            },
4513        },
4514        {   // new StringBuilder("...").append(s)/pop = nothing
4515            {
4516                new ConstantInstruction(InstructionConstants.OP_NEW, CLASS_STRINGBUILDER),
4517                new SimpleInstruction(InstructionConstants.OP_DUP),
4518                new ConstantInstruction(InstructionConstants.OP_LDC, A),
4519                new ConstantInstruction(InstructionConstants.OP_INVOKESPECIAL, METHOD_STRINGBUILDER_INIT_STRING),
4520                new VariableInstruction(InstructionConstants.OP_ALOAD, B),
4521                new ConstantInstruction(InstructionConstants.OP_INVOKEVIRTUAL, METHOD_STRINGBUILDER_APPEND_STRING),
4522                new SimpleInstruction(InstructionConstants.OP_POP),
4523            },{
4524                // Nothing.
4525            },
4526        },
4527        {   // StringBuilder#toString()/pop = pop
4528            {
4529                new ConstantInstruction(InstructionConstants.OP_INVOKEVIRTUAL, METHOD_STRINGBUILDER_TOSTRING),
4530                new SimpleInstruction(InstructionConstants.OP_POP),
4531            },{
4532                new SimpleInstruction(InstructionConstants.OP_POP),
4533            },
4534        },
4535        {   // StringBuilder#append("") = nothing
4536            {
4537                new ConstantInstruction(InstructionConstants.OP_LDC, STRING_EMPTY),
4538                new ConstantInstruction(InstructionConstants.OP_INVOKEVIRTUAL, METHOD_STRINGBUILDER_APPEND_STRING),
4539            },{
4540                // Nothing.
4541            },
4542        },
4543        {   // new StringBuilder().append(Z) = new StringBuilder("....")
4544            {
4545                new ConstantInstruction(InstructionConstants.OP_INVOKESPECIAL, METHOD_STRINGBUILDER_INIT),
4546                new SimpleInstruction(InstructionConstants.OP_ICONST_0, A),
4547                new ConstantInstruction(InstructionConstants.OP_INVOKEVIRTUAL, METHOD_STRINGBUILDER_APPEND_Z),
4548            },{
4549                new ConstantInstruction(InstructionConstants.OP_LDC, BOOLEAN_A_STRING),
4550                new ConstantInstruction(InstructionConstants.OP_INVOKESPECIAL, METHOD_STRINGBUILDER_INIT_STRING),
4551            },
4552        },
4553        {   // new StringBuilder().append(C) = new StringBuilder("....")
4554            {
4555                new ConstantInstruction(InstructionConstants.OP_INVOKESPECIAL, METHOD_STRINGBUILDER_INIT),
4556                new SimpleInstruction(InstructionConstants.OP_ICONST_0, A),
4557                new ConstantInstruction(InstructionConstants.OP_INVOKEVIRTUAL, METHOD_STRINGBUILDER_APPEND_C),
4558            },{
4559                new ConstantInstruction(InstructionConstants.OP_LDC, CHAR_A_STRING),
4560                new ConstantInstruction(InstructionConstants.OP_INVOKESPECIAL, METHOD_STRINGBUILDER_INIT_STRING),
4561            },
4562        },
4563        {   // new StringBuilder().append(Cc) = new StringBuilder("....")
4564            {
4565                new ConstantInstruction(InstructionConstants.OP_INVOKESPECIAL, METHOD_STRINGBUILDER_INIT),
4566                new ConstantInstruction(InstructionConstants.OP_LDC, A),
4567                new ConstantInstruction(InstructionConstants.OP_INVOKEVIRTUAL, METHOD_STRINGBUILDER_APPEND_C),
4568            },{
4569                new ConstantInstruction(InstructionConstants.OP_LDC, CHAR_A_STRING),
4570                new ConstantInstruction(InstructionConstants.OP_INVOKESPECIAL, METHOD_STRINGBUILDER_INIT_STRING),
4571            },
4572        },
4573        {   // new StringBuilder().append(I) = new StringBuilder("....")
4574            {
4575                new ConstantInstruction(InstructionConstants.OP_INVOKESPECIAL, METHOD_STRINGBUILDER_INIT),
4576                new SimpleInstruction(InstructionConstants.OP_ICONST_0, A),
4577                new ConstantInstruction(InstructionConstants.OP_INVOKEVIRTUAL, METHOD_STRINGBUILDER_APPEND_I),
4578            },{
4579                new ConstantInstruction(InstructionConstants.OP_LDC, INT_A_STRING),
4580                new ConstantInstruction(InstructionConstants.OP_INVOKESPECIAL, METHOD_STRINGBUILDER_INIT_STRING),
4581            },
4582        },
4583        {   // new StringBuilder().append(Ic) = new StringBuilder("....")
4584            {
4585                new ConstantInstruction(InstructionConstants.OP_INVOKESPECIAL, METHOD_STRINGBUILDER_INIT),
4586                new ConstantInstruction(InstructionConstants.OP_LDC, A),
4587                new ConstantInstruction(InstructionConstants.OP_INVOKEVIRTUAL, METHOD_STRINGBUILDER_APPEND_I),
4588            },{
4589                new ConstantInstruction(InstructionConstants.OP_LDC, INT_A_STRING),
4590                new ConstantInstruction(InstructionConstants.OP_INVOKESPECIAL, METHOD_STRINGBUILDER_INIT_STRING),
4591            },
4592        },
4593        {   // new StringBuilder().append(J) = new StringBuilder("....")
4594            {
4595                new ConstantInstruction(InstructionConstants.OP_INVOKESPECIAL, METHOD_STRINGBUILDER_INIT),
4596                new SimpleInstruction(InstructionConstants.OP_LCONST_0, A),
4597                new ConstantInstruction(InstructionConstants.OP_INVOKEVIRTUAL, METHOD_STRINGBUILDER_APPEND_J),
4598            },{
4599                new ConstantInstruction(InstructionConstants.OP_LDC, LONG_A_STRING),
4600                new ConstantInstruction(InstructionConstants.OP_INVOKESPECIAL, METHOD_STRINGBUILDER_INIT_STRING),
4601            },
4602        },
4603        {   // new StringBuilder().append(Jc) = new StringBuilder("....")
4604            {
4605                new ConstantInstruction(InstructionConstants.OP_INVOKESPECIAL, METHOD_STRINGBUILDER_INIT),
4606                new ConstantInstruction(InstructionConstants.OP_LDC2_W, A),
4607                new ConstantInstruction(InstructionConstants.OP_INVOKEVIRTUAL, METHOD_STRINGBUILDER_APPEND_J),
4608            },{
4609                new ConstantInstruction(InstructionConstants.OP_LDC, LONG_A_STRING),
4610                new ConstantInstruction(InstructionConstants.OP_INVOKESPECIAL, METHOD_STRINGBUILDER_INIT_STRING),
4611            },
4612        },
4613        {   // new StringBuilder().append(F) = new StringBuilder("....")
4614            {
4615                new ConstantInstruction(InstructionConstants.OP_INVOKESPECIAL, METHOD_STRINGBUILDER_INIT),
4616                new SimpleInstruction(InstructionConstants.OP_FCONST_0, A),
4617                new ConstantInstruction(InstructionConstants.OP_INVOKEVIRTUAL, METHOD_STRINGBUILDER_APPEND_F),
4618            },{
4619                new ConstantInstruction(InstructionConstants.OP_LDC, FLOAT_A_STRING),
4620                new ConstantInstruction(InstructionConstants.OP_INVOKESPECIAL, METHOD_STRINGBUILDER_INIT_STRING),
4621            },
4622        },
4623        {   // new StringBuilder().append(Fc) = new StringBuilder("....")
4624            {
4625                new ConstantInstruction(InstructionConstants.OP_INVOKESPECIAL, METHOD_STRINGBUILDER_INIT),
4626                new ConstantInstruction(InstructionConstants.OP_LDC, A),
4627                new ConstantInstruction(InstructionConstants.OP_INVOKEVIRTUAL, METHOD_STRINGBUILDER_APPEND_F),
4628            },{
4629                new ConstantInstruction(InstructionConstants.OP_LDC, FLOAT_A_STRING),
4630                new ConstantInstruction(InstructionConstants.OP_INVOKESPECIAL, METHOD_STRINGBUILDER_INIT_STRING),
4631            },
4632        },
4633        {   // new StringBuilder().append(D) = new StringBuilder("....")
4634            {
4635                new ConstantInstruction(InstructionConstants.OP_INVOKESPECIAL, METHOD_STRINGBUILDER_INIT),
4636                new SimpleInstruction(InstructionConstants.OP_DCONST_0, A),
4637                new ConstantInstruction(InstructionConstants.OP_INVOKEVIRTUAL, METHOD_STRINGBUILDER_APPEND_D),
4638            },{
4639                new ConstantInstruction(InstructionConstants.OP_LDC, DOUBLE_A_STRING),
4640                new ConstantInstruction(InstructionConstants.OP_INVOKESPECIAL, METHOD_STRINGBUILDER_INIT_STRING),
4641            },
4642        },
4643        {   // new StringBuilder().append(Dc) = new StringBuilder("....")
4644            {
4645                new ConstantInstruction(InstructionConstants.OP_INVOKESPECIAL, METHOD_STRINGBUILDER_INIT),
4646                new ConstantInstruction(InstructionConstants.OP_LDC2_W, A),
4647                new ConstantInstruction(InstructionConstants.OP_INVOKEVIRTUAL, METHOD_STRINGBUILDER_APPEND_D),
4648            },{
4649                new ConstantInstruction(InstructionConstants.OP_LDC, DOUBLE_A_STRING),
4650                new ConstantInstruction(InstructionConstants.OP_INVOKESPECIAL, METHOD_STRINGBUILDER_INIT_STRING),
4651            },
4652        },
4653        {   // new StringBuilder().append("...") = new StringBuilder("...")
4654            {
4655                new ConstantInstruction(InstructionConstants.OP_INVOKESPECIAL, METHOD_STRINGBUILDER_INIT),
4656                new ConstantInstruction(InstructionConstants.OP_LDC, A),
4657                new ConstantInstruction(InstructionConstants.OP_INVOKEVIRTUAL, METHOD_STRINGBUILDER_APPEND_STRING),
4658            },{
4659                new ConstantInstruction(InstructionConstants.OP_LDC, A),
4660                new ConstantInstruction(InstructionConstants.OP_INVOKESPECIAL, METHOD_STRINGBUILDER_INIT_STRING),
4661            },
4662        },
4663        {   // new StringBuilder("...").append(Z) = new StringBuilder("....")
4664            {
4665                new ConstantInstruction(InstructionConstants.OP_LDC, A),
4666                new ConstantInstruction(InstructionConstants.OP_INVOKESPECIAL, METHOD_STRINGBUILDER_INIT_STRING),
4667                new SimpleInstruction(InstructionConstants.OP_ICONST_0, B),
4668                new ConstantInstruction(InstructionConstants.OP_INVOKEVIRTUAL, METHOD_STRINGBUILDER_APPEND_Z),
4669            },{
4670                new ConstantInstruction(InstructionConstants.OP_LDC, STRING_A_STRING | BOOLEAN_B_STRING),
4671                new ConstantInstruction(InstructionConstants.OP_INVOKESPECIAL, METHOD_STRINGBUILDER_INIT_STRING),
4672            },
4673        },
4674        {   // new StringBuilder("...").append(C) = new StringBuilder("....")
4675            {
4676                new ConstantInstruction(InstructionConstants.OP_LDC, A),
4677                new ConstantInstruction(InstructionConstants.OP_INVOKESPECIAL, METHOD_STRINGBUILDER_INIT_STRING),
4678                new SimpleInstruction(InstructionConstants.OP_ICONST_0, B),
4679                new ConstantInstruction(InstructionConstants.OP_INVOKEVIRTUAL, METHOD_STRINGBUILDER_APPEND_C),
4680            },{
4681                new ConstantInstruction(InstructionConstants.OP_LDC, STRING_A_STRING | CHAR_B_STRING),
4682                new ConstantInstruction(InstructionConstants.OP_INVOKESPECIAL, METHOD_STRINGBUILDER_INIT_STRING),
4683            },
4684        },
4685        {   // new StringBuilder("...").append(Cc) = new StringBuilder("....")
4686            {
4687                new ConstantInstruction(InstructionConstants.OP_LDC, A),
4688                new ConstantInstruction(InstructionConstants.OP_INVOKESPECIAL, METHOD_STRINGBUILDER_INIT_STRING),
4689                new ConstantInstruction(InstructionConstants.OP_LDC, B),
4690                new ConstantInstruction(InstructionConstants.OP_INVOKEVIRTUAL, METHOD_STRINGBUILDER_APPEND_C),
4691            },{
4692                new ConstantInstruction(InstructionConstants.OP_LDC, STRING_A_STRING | CHAR_B_STRING),
4693                new ConstantInstruction(InstructionConstants.OP_INVOKESPECIAL, METHOD_STRINGBUILDER_INIT_STRING),
4694            },
4695        },
4696        {   // new StringBuilder("...").append(I) = new StringBuilder("....")
4697            {
4698                new ConstantInstruction(InstructionConstants.OP_LDC, A),
4699                new ConstantInstruction(InstructionConstants.OP_INVOKESPECIAL, METHOD_STRINGBUILDER_INIT_STRING),
4700                new SimpleInstruction(InstructionConstants.OP_ICONST_0, B),
4701                new ConstantInstruction(InstructionConstants.OP_INVOKEVIRTUAL, METHOD_STRINGBUILDER_APPEND_I),
4702            },{
4703                new ConstantInstruction(InstructionConstants.OP_LDC, STRING_A_STRING | INT_B_STRING),
4704                new ConstantInstruction(InstructionConstants.OP_INVOKESPECIAL, METHOD_STRINGBUILDER_INIT_STRING),
4705            },
4706        },
4707        {   // new StringBuilder("...").append(Ic) = new StringBuilder("....")
4708            {
4709                new ConstantInstruction(InstructionConstants.OP_LDC, A),
4710                new ConstantInstruction(InstructionConstants.OP_INVOKESPECIAL, METHOD_STRINGBUILDER_INIT_STRING),
4711                new ConstantInstruction(InstructionConstants.OP_LDC, B),
4712                new ConstantInstruction(InstructionConstants.OP_INVOKEVIRTUAL, METHOD_STRINGBUILDER_APPEND_I),
4713            },{
4714                new ConstantInstruction(InstructionConstants.OP_LDC, STRING_A_STRING | INT_B_STRING),
4715                new ConstantInstruction(InstructionConstants.OP_INVOKESPECIAL, METHOD_STRINGBUILDER_INIT_STRING),
4716            },
4717        },
4718        {   // new StringBuilder("...").append(J) = new StringBuilder("....")
4719            {
4720                new ConstantInstruction(InstructionConstants.OP_LDC, A),
4721                new ConstantInstruction(InstructionConstants.OP_INVOKESPECIAL, METHOD_STRINGBUILDER_INIT_STRING),
4722                new SimpleInstruction(InstructionConstants.OP_LCONST_0, B),
4723                new ConstantInstruction(InstructionConstants.OP_INVOKEVIRTUAL, METHOD_STRINGBUILDER_APPEND_J),
4724            },{
4725                new ConstantInstruction(InstructionConstants.OP_LDC, STRING_A_STRING | LONG_B_STRING),
4726                new ConstantInstruction(InstructionConstants.OP_INVOKESPECIAL, METHOD_STRINGBUILDER_INIT_STRING),
4727            },
4728        },
4729        {   // new StringBuilder("...").append(Jc) = new StringBuilder("....")
4730            {
4731                new ConstantInstruction(InstructionConstants.OP_LDC, A),
4732                new ConstantInstruction(InstructionConstants.OP_INVOKESPECIAL, METHOD_STRINGBUILDER_INIT_STRING),
4733                new ConstantInstruction(InstructionConstants.OP_LDC2_W, B),
4734                new ConstantInstruction(InstructionConstants.OP_INVOKEVIRTUAL, METHOD_STRINGBUILDER_APPEND_J),
4735            },{
4736                new ConstantInstruction(InstructionConstants.OP_LDC, STRING_A_STRING | LONG_B_STRING),
4737                new ConstantInstruction(InstructionConstants.OP_INVOKESPECIAL, METHOD_STRINGBUILDER_INIT_STRING),
4738            },
4739        },
4740        {   // new StringBuilder("...").append(F) = new StringBuilder("....")
4741            {
4742                new ConstantInstruction(InstructionConstants.OP_LDC, A),
4743                new ConstantInstruction(InstructionConstants.OP_INVOKESPECIAL, METHOD_STRINGBUILDER_INIT_STRING),
4744                new SimpleInstruction(InstructionConstants.OP_FCONST_0, B),
4745                new ConstantInstruction(InstructionConstants.OP_INVOKEVIRTUAL, METHOD_STRINGBUILDER_APPEND_F),
4746            },{
4747                new ConstantInstruction(InstructionConstants.OP_LDC, STRING_A_STRING | FLOAT_B_STRING),
4748                new ConstantInstruction(InstructionConstants.OP_INVOKESPECIAL, METHOD_STRINGBUILDER_INIT_STRING),
4749            },
4750        },
4751        {   // new StringBuilder("...").append(Fc) = new StringBuilder("....")
4752            {
4753                new ConstantInstruction(InstructionConstants.OP_LDC, A),
4754                new ConstantInstruction(InstructionConstants.OP_INVOKESPECIAL, METHOD_STRINGBUILDER_INIT_STRING),
4755                new ConstantInstruction(InstructionConstants.OP_LDC, B),
4756                new ConstantInstruction(InstructionConstants.OP_INVOKEVIRTUAL, METHOD_STRINGBUILDER_APPEND_F),
4757            },{
4758                new ConstantInstruction(InstructionConstants.OP_LDC, STRING_A_STRING | FLOAT_B_STRING),
4759                new ConstantInstruction(InstructionConstants.OP_INVOKESPECIAL, METHOD_STRINGBUILDER_INIT_STRING),
4760            },
4761        },
4762        {   // new StringBuilder("...").append(D) = new StringBuilder("....")
4763            {
4764                new ConstantInstruction(InstructionConstants.OP_LDC, A),
4765                new ConstantInstruction(InstructionConstants.OP_INVOKESPECIAL, METHOD_STRINGBUILDER_INIT_STRING),
4766                new SimpleInstruction(InstructionConstants.OP_DCONST_0, B),
4767                new ConstantInstruction(InstructionConstants.OP_INVOKEVIRTUAL, METHOD_STRINGBUILDER_APPEND_D),
4768            },{
4769                new ConstantInstruction(InstructionConstants.OP_LDC, STRING_A_STRING | DOUBLE_B_STRING),
4770                new ConstantInstruction(InstructionConstants.OP_INVOKESPECIAL, METHOD_STRINGBUILDER_INIT_STRING),
4771            },
4772        },
4773        {   // new StringBuilder("...").append(Dc) = new StringBuilder("....")
4774            {
4775                new ConstantInstruction(InstructionConstants.OP_LDC, A),
4776                new ConstantInstruction(InstructionConstants.OP_INVOKESPECIAL, METHOD_STRINGBUILDER_INIT_STRING),
4777                new ConstantInstruction(InstructionConstants.OP_LDC2_W, B),
4778                new ConstantInstruction(InstructionConstants.OP_INVOKEVIRTUAL, METHOD_STRINGBUILDER_APPEND_D),
4779            },{
4780                new ConstantInstruction(InstructionConstants.OP_LDC, STRING_A_STRING | DOUBLE_B_STRING),
4781                new ConstantInstruction(InstructionConstants.OP_INVOKESPECIAL, METHOD_STRINGBUILDER_INIT_STRING),
4782            },
4783        },
4784        {   // new StringBuilder("...").append("...") = new StringBuilder("......")
4785            {
4786                new ConstantInstruction(InstructionConstants.OP_LDC, A),
4787                new ConstantInstruction(InstructionConstants.OP_INVOKESPECIAL, METHOD_STRINGBUILDER_INIT_STRING),
4788                new ConstantInstruction(InstructionConstants.OP_LDC, B),
4789                new ConstantInstruction(InstructionConstants.OP_INVOKEVIRTUAL, METHOD_STRINGBUILDER_APPEND_STRING),
4790            },{
4791                new ConstantInstruction(InstructionConstants.OP_LDC, STRING_A_STRING | STRING_B_STRING),
4792                new ConstantInstruction(InstructionConstants.OP_INVOKESPECIAL, METHOD_STRINGBUILDER_INIT_STRING),
4793            },
4794        },
4795        {   // StringBuilder#append("...").append(Z) = StringBuilder#append("....")
4796            {
4797                new ConstantInstruction(InstructionConstants.OP_LDC, A),
4798                new ConstantInstruction(InstructionConstants.OP_INVOKEVIRTUAL, METHOD_STRINGBUILDER_APPEND_STRING),
4799                new SimpleInstruction(InstructionConstants.OP_ICONST_0, B),
4800                new ConstantInstruction(InstructionConstants.OP_INVOKEVIRTUAL, METHOD_STRINGBUILDER_APPEND_Z),
4801            },{
4802                new ConstantInstruction(InstructionConstants.OP_LDC, STRING_A_STRING | BOOLEAN_B_STRING),
4803                new ConstantInstruction(InstructionConstants.OP_INVOKEVIRTUAL, METHOD_STRINGBUILDER_APPEND_STRING),
4804            },
4805        },
4806        {   // StringBuilder#append("...").append(C) = StringBuilder#append("....")
4807            {
4808                new ConstantInstruction(InstructionConstants.OP_LDC, A),
4809                new ConstantInstruction(InstructionConstants.OP_INVOKEVIRTUAL, METHOD_STRINGBUILDER_APPEND_STRING),
4810                new SimpleInstruction(InstructionConstants.OP_ICONST_0, B),
4811                new ConstantInstruction(InstructionConstants.OP_INVOKEVIRTUAL, METHOD_STRINGBUILDER_APPEND_C),
4812            },{
4813                new ConstantInstruction(InstructionConstants.OP_LDC, STRING_A_STRING | CHAR_B_STRING),
4814                new ConstantInstruction(InstructionConstants.OP_INVOKEVIRTUAL, METHOD_STRINGBUILDER_APPEND_STRING),
4815            },
4816        },
4817        {   // StringBuilder#append("...").append(Cc) = StringBuilder#append("....")
4818            {
4819                new ConstantInstruction(InstructionConstants.OP_LDC, A),
4820                new ConstantInstruction(InstructionConstants.OP_INVOKEVIRTUAL, METHOD_STRINGBUILDER_APPEND_STRING),
4821                new ConstantInstruction(InstructionConstants.OP_LDC, B),
4822                new ConstantInstruction(InstructionConstants.OP_INVOKEVIRTUAL, METHOD_STRINGBUILDER_APPEND_C),
4823            },{
4824                new ConstantInstruction(InstructionConstants.OP_LDC, STRING_A_STRING | CHAR_B_STRING),
4825                new ConstantInstruction(InstructionConstants.OP_INVOKEVIRTUAL, METHOD_STRINGBUILDER_APPEND_STRING),
4826            },
4827        },
4828        {   // StringBuilder#append("...").append(I) = StringBuilder#append("....")
4829            {
4830                new ConstantInstruction(InstructionConstants.OP_LDC, A),
4831                new ConstantInstruction(InstructionConstants.OP_INVOKEVIRTUAL, METHOD_STRINGBUILDER_APPEND_STRING),
4832                new SimpleInstruction(InstructionConstants.OP_ICONST_0, B),
4833                new ConstantInstruction(InstructionConstants.OP_INVOKEVIRTUAL, METHOD_STRINGBUILDER_APPEND_I),
4834            },{
4835                new ConstantInstruction(InstructionConstants.OP_LDC, STRING_A_STRING | INT_B_STRING),
4836                new ConstantInstruction(InstructionConstants.OP_INVOKEVIRTUAL, METHOD_STRINGBUILDER_APPEND_STRING),
4837            },
4838        },
4839        {   // StringBuilder#append("...").append(Ic) = StringBuilder#append("....")
4840            {
4841                new ConstantInstruction(InstructionConstants.OP_LDC, A),
4842                new ConstantInstruction(InstructionConstants.OP_INVOKEVIRTUAL, METHOD_STRINGBUILDER_APPEND_STRING),
4843                new ConstantInstruction(InstructionConstants.OP_LDC, B),
4844                new ConstantInstruction(InstructionConstants.OP_INVOKEVIRTUAL, METHOD_STRINGBUILDER_APPEND_I),
4845            },{
4846                new ConstantInstruction(InstructionConstants.OP_LDC, STRING_A_STRING | INT_B_STRING),
4847                new ConstantInstruction(InstructionConstants.OP_INVOKEVIRTUAL, METHOD_STRINGBUILDER_APPEND_STRING),
4848            },
4849        },
4850        {   // StringBuilder#append("...").append(J) = StringBuilder#append("....")
4851            {
4852                new ConstantInstruction(InstructionConstants.OP_LDC, A),
4853                new ConstantInstruction(InstructionConstants.OP_INVOKEVIRTUAL, METHOD_STRINGBUILDER_APPEND_STRING),
4854                new SimpleInstruction(InstructionConstants.OP_LCONST_0, B),
4855                new ConstantInstruction(InstructionConstants.OP_INVOKEVIRTUAL, METHOD_STRINGBUILDER_APPEND_J),
4856            },{
4857                new ConstantInstruction(InstructionConstants.OP_LDC, STRING_A_STRING | LONG_B_STRING),
4858                new ConstantInstruction(InstructionConstants.OP_INVOKEVIRTUAL, METHOD_STRINGBUILDER_APPEND_STRING),
4859            },
4860        },
4861        {   // StringBuilder#append("...").append(Jc) = StringBuilder#append("....")
4862            {
4863                new ConstantInstruction(InstructionConstants.OP_LDC, A),
4864                new ConstantInstruction(InstructionConstants.OP_INVOKEVIRTUAL, METHOD_STRINGBUILDER_APPEND_STRING),
4865                new ConstantInstruction(InstructionConstants.OP_LDC2_W, B),
4866                new ConstantInstruction(InstructionConstants.OP_INVOKEVIRTUAL, METHOD_STRINGBUILDER_APPEND_J),
4867            },{
4868                new ConstantInstruction(InstructionConstants.OP_LDC, STRING_A_STRING | LONG_B_STRING),
4869                new ConstantInstruction(InstructionConstants.OP_INVOKEVIRTUAL, METHOD_STRINGBUILDER_APPEND_STRING),
4870            },
4871        },
4872        {   // StringBuilder#append("...").append(F) = StringBuilder#append("....")
4873            {
4874                new ConstantInstruction(InstructionConstants.OP_LDC, A),
4875                new ConstantInstruction(InstructionConstants.OP_INVOKEVIRTUAL, METHOD_STRINGBUILDER_APPEND_STRING),
4876                new SimpleInstruction(InstructionConstants.OP_FCONST_0, B),
4877                new ConstantInstruction(InstructionConstants.OP_INVOKEVIRTUAL, METHOD_STRINGBUILDER_APPEND_F),
4878            },{
4879                new ConstantInstruction(InstructionConstants.OP_LDC, STRING_A_STRING | FLOAT_B_STRING),
4880                new ConstantInstruction(InstructionConstants.OP_INVOKEVIRTUAL, METHOD_STRINGBUILDER_APPEND_STRING),
4881            },
4882        },
4883        {   // StringBuilder#append("...").append(Fc) = StringBuilder#append("....")
4884            {
4885                new ConstantInstruction(InstructionConstants.OP_LDC, A),
4886                new ConstantInstruction(InstructionConstants.OP_INVOKEVIRTUAL, METHOD_STRINGBUILDER_APPEND_STRING),
4887                new ConstantInstruction(InstructionConstants.OP_LDC, B),
4888                new ConstantInstruction(InstructionConstants.OP_INVOKEVIRTUAL, METHOD_STRINGBUILDER_APPEND_F),
4889            },{
4890                new ConstantInstruction(InstructionConstants.OP_LDC, STRING_A_STRING | FLOAT_B_STRING),
4891                new ConstantInstruction(InstructionConstants.OP_INVOKEVIRTUAL, METHOD_STRINGBUILDER_APPEND_STRING),
4892            },
4893        },
4894        {   // StringBuilder#append("...").append(D) = StringBuilder#append("....")
4895            {
4896                new ConstantInstruction(InstructionConstants.OP_LDC, A),
4897                new ConstantInstruction(InstructionConstants.OP_INVOKEVIRTUAL, METHOD_STRINGBUILDER_APPEND_STRING),
4898                new SimpleInstruction(InstructionConstants.OP_DCONST_0, B),
4899                new ConstantInstruction(InstructionConstants.OP_INVOKEVIRTUAL, METHOD_STRINGBUILDER_APPEND_D),
4900            },{
4901                new ConstantInstruction(InstructionConstants.OP_LDC, STRING_A_STRING | DOUBLE_B_STRING),
4902                new ConstantInstruction(InstructionConstants.OP_INVOKEVIRTUAL, METHOD_STRINGBUILDER_APPEND_STRING),
4903            },
4904        },
4905        {   // StringBuilder#append("...").append(Dc) = StringBuilder#append("....")
4906            {
4907                new ConstantInstruction(InstructionConstants.OP_LDC, A),
4908                new ConstantInstruction(InstructionConstants.OP_INVOKEVIRTUAL, METHOD_STRINGBUILDER_APPEND_STRING),
4909                new ConstantInstruction(InstructionConstants.OP_LDC2_W, B),
4910                new ConstantInstruction(InstructionConstants.OP_INVOKEVIRTUAL, METHOD_STRINGBUILDER_APPEND_D),
4911            },{
4912                new ConstantInstruction(InstructionConstants.OP_LDC, STRING_A_STRING | DOUBLE_B_STRING),
4913                new ConstantInstruction(InstructionConstants.OP_INVOKEVIRTUAL, METHOD_STRINGBUILDER_APPEND_STRING),
4914            },
4915        },
4916        {   // StringBuilder#append("...").append("...") = StringBuilder#append("......")
4917            {
4918                new ConstantInstruction(InstructionConstants.OP_LDC, A),
4919                new ConstantInstruction(InstructionConstants.OP_INVOKEVIRTUAL, METHOD_STRINGBUILDER_APPEND_STRING),
4920                new ConstantInstruction(InstructionConstants.OP_LDC, B),
4921                new ConstantInstruction(InstructionConstants.OP_INVOKEVIRTUAL, METHOD_STRINGBUILDER_APPEND_STRING),
4922            },{
4923                new ConstantInstruction(InstructionConstants.OP_LDC, STRING_A_STRING | STRING_B_STRING),
4924                new ConstantInstruction(InstructionConstants.OP_INVOKEVIRTUAL, METHOD_STRINGBUILDER_APPEND_STRING),
4925            },
4926        },
4927        {   // new StringBuilder().append(z).toString() = String.valueOf(z)
4928            {
4929                new ConstantInstruction(InstructionConstants.OP_NEW, CLASS_STRINGBUILDER),
4930                new SimpleInstruction(InstructionConstants.OP_DUP),
4931                new ConstantInstruction(InstructionConstants.OP_INVOKESPECIAL, METHOD_STRINGBUILDER_INIT),
4932                new VariableInstruction(InstructionConstants.OP_ILOAD, A),
4933                new ConstantInstruction(InstructionConstants.OP_INVOKEVIRTUAL, METHOD_STRINGBUILDER_APPEND_Z),
4934                new ConstantInstruction(InstructionConstants.OP_INVOKEVIRTUAL, METHOD_STRINGBUILDER_TOSTRING),
4935            },{
4936                new VariableInstruction(InstructionConstants.OP_ILOAD, A),
4937                new ConstantInstruction(InstructionConstants.OP_INVOKESTATIC, METHOD_STRING_VALUEOF_Z),
4938            },
4939        },
4940        {   // new StringBuilder().append(c).toString() = String.valueOf(c)
4941            {
4942                new ConstantInstruction(InstructionConstants.OP_NEW, CLASS_STRINGBUILDER),
4943                new SimpleInstruction(InstructionConstants.OP_DUP),
4944                new ConstantInstruction(InstructionConstants.OP_INVOKESPECIAL, METHOD_STRINGBUILDER_INIT),
4945                new VariableInstruction(InstructionConstants.OP_ILOAD, A),
4946                new ConstantInstruction(InstructionConstants.OP_INVOKEVIRTUAL, METHOD_STRINGBUILDER_APPEND_C),
4947                new ConstantInstruction(InstructionConstants.OP_INVOKEVIRTUAL, METHOD_STRINGBUILDER_TOSTRING),
4948            },{
4949                new VariableInstruction(InstructionConstants.OP_ILOAD, A),
4950                new ConstantInstruction(InstructionConstants.OP_INVOKESTATIC, METHOD_STRING_VALUEOF_C),
4951            },
4952        },
4953        {   // new StringBuilder().append(i).toString() = String.valueOf(i)
4954            {
4955                new ConstantInstruction(InstructionConstants.OP_NEW, CLASS_STRINGBUILDER),
4956                new SimpleInstruction(InstructionConstants.OP_DUP),
4957                new ConstantInstruction(InstructionConstants.OP_INVOKESPECIAL, METHOD_STRINGBUILDER_INIT),
4958                new VariableInstruction(InstructionConstants.OP_ILOAD, A),
4959                new ConstantInstruction(InstructionConstants.OP_INVOKEVIRTUAL, METHOD_STRINGBUILDER_APPEND_I),
4960                new ConstantInstruction(InstructionConstants.OP_INVOKEVIRTUAL, METHOD_STRINGBUILDER_TOSTRING),
4961            },{
4962                new VariableInstruction(InstructionConstants.OP_ILOAD, A),
4963                new ConstantInstruction(InstructionConstants.OP_INVOKESTATIC, METHOD_STRING_VALUEOF_I),
4964            },
4965        },
4966        {   // new StringBuilder().append(j).toString() = String.valueOf(j)
4967            {
4968                new ConstantInstruction(InstructionConstants.OP_NEW, CLASS_STRINGBUILDER),
4969                new SimpleInstruction(InstructionConstants.OP_DUP),
4970                new ConstantInstruction(InstructionConstants.OP_INVOKESPECIAL, METHOD_STRINGBUILDER_INIT),
4971                new VariableInstruction(InstructionConstants.OP_LLOAD, A),
4972                new ConstantInstruction(InstructionConstants.OP_INVOKEVIRTUAL, METHOD_STRINGBUILDER_APPEND_J),
4973                new ConstantInstruction(InstructionConstants.OP_INVOKEVIRTUAL, METHOD_STRINGBUILDER_TOSTRING),
4974           },{
4975                new VariableInstruction(InstructionConstants.OP_LLOAD, A),
4976                new ConstantInstruction(InstructionConstants.OP_INVOKESTATIC, METHOD_STRING_VALUEOF_J),
4977            },
4978        },
4979        {   // new StringBuilder().append(f).toString() = String.valueOf(f)
4980            {
4981                new ConstantInstruction(InstructionConstants.OP_NEW, CLASS_STRINGBUILDER),
4982                new SimpleInstruction(InstructionConstants.OP_DUP),
4983                new ConstantInstruction(InstructionConstants.OP_INVOKESPECIAL, METHOD_STRINGBUILDER_INIT),
4984                new VariableInstruction(InstructionConstants.OP_FLOAD, A),
4985                new ConstantInstruction(InstructionConstants.OP_INVOKEVIRTUAL, METHOD_STRINGBUILDER_APPEND_F),
4986                new ConstantInstruction(InstructionConstants.OP_INVOKEVIRTUAL, METHOD_STRINGBUILDER_TOSTRING),
4987            },{
4988                new VariableInstruction(InstructionConstants.OP_FLOAD, A),
4989                new ConstantInstruction(InstructionConstants.OP_INVOKESTATIC, METHOD_STRING_VALUEOF_F),
4990            },
4991        },
4992        {   // new StringBuilder().append(d).toString() = String.valueOf(d)
4993            {
4994                new ConstantInstruction(InstructionConstants.OP_NEW, CLASS_STRINGBUILDER),
4995                new SimpleInstruction(InstructionConstants.OP_DUP),
4996                new ConstantInstruction(InstructionConstants.OP_INVOKESPECIAL, METHOD_STRINGBUILDER_INIT),
4997                new VariableInstruction(InstructionConstants.OP_DLOAD, A),
4998                new ConstantInstruction(InstructionConstants.OP_INVOKEVIRTUAL, METHOD_STRINGBUILDER_APPEND_D),
4999                new ConstantInstruction(InstructionConstants.OP_INVOKEVIRTUAL, METHOD_STRINGBUILDER_TOSTRING),
5000            },{
5001                new VariableInstruction(InstructionConstants.OP_DLOAD, A),
5002                new ConstantInstruction(InstructionConstants.OP_INVOKESTATIC, METHOD_STRING_VALUEOF_D),
5003            },
5004        },
5005        {   // new StringBuilder().append(string).toString() = string
5006            {
5007                new ConstantInstruction(InstructionConstants.OP_NEW, CLASS_STRINGBUILDER),
5008                new SimpleInstruction(InstructionConstants.OP_DUP),
5009                new ConstantInstruction(InstructionConstants.OP_INVOKESPECIAL, METHOD_STRINGBUILDER_INIT),
5010                new VariableInstruction(InstructionConstants.OP_ALOAD, A),
5011                new ConstantInstruction(InstructionConstants.OP_INVOKEVIRTUAL, METHOD_STRINGBUILDER_APPEND_STRING),
5012                new ConstantInstruction(InstructionConstants.OP_INVOKEVIRTUAL, METHOD_STRINGBUILDER_TOSTRING),
5013            },{
5014                new VariableInstruction(InstructionConstants.OP_ALOAD, A),
5015            },
5016        },
5017        {   // new StringBuilder().append(object).toString() = String.valueOf(object)
5018            {
5019                new ConstantInstruction(InstructionConstants.OP_NEW, CLASS_STRINGBUILDER),
5020                new SimpleInstruction(InstructionConstants.OP_DUP),
5021                new ConstantInstruction(InstructionConstants.OP_INVOKESPECIAL, METHOD_STRINGBUILDER_INIT),
5022                new VariableInstruction(InstructionConstants.OP_ALOAD, A),
5023                new ConstantInstruction(InstructionConstants.OP_INVOKEVIRTUAL, METHOD_STRINGBUILDER_APPEND_OBJECT),
5024                new ConstantInstruction(InstructionConstants.OP_INVOKEVIRTUAL, METHOD_STRINGBUILDER_TOSTRING),
5025            },{
5026                new VariableInstruction(InstructionConstants.OP_ALOAD, A),
5027                new ConstantInstruction(InstructionConstants.OP_INVOKESTATIC, METHOD_STRING_VALUEOF_OBJECT),
5028            },
5029        },
5030    };
5031
5032
5033    /**
5034     * Prints out the constants and the instruction sequences.
5035     */
5036    public static void main(String[] args)
5037    {
5038        ProgramClass clazz = new ProgramClass();
5039        clazz.constantPool = CONSTANTS;
5040
5041        ClassPrinter printer = new ClassPrinter();
5042
5043        for (int index = 0; index < CONSTANTS.length; index++)
5044        {
5045            System.out.print("["+index+"] ");
5046            try
5047            {
5048                CONSTANTS[index].accept(clazz, printer);
5049            }
5050            catch (Exception e)
5051            {
5052                System.out.println("("+e.getClass().getName()+")");
5053            }
5054        }
5055
5056        if (CONSTANTS.length != SENTINEL)
5057        {
5058            throw new IllegalStateException("Constants length ["+CONSTANTS.length+"] different from number of constant names ["+SENTINEL+"]");
5059        }
5060
5061        Instruction[][][] sequences = STRING;
5062
5063        for (int sequence = 0; sequence < sequences.length; sequence++)
5064        {
5065            System.out.println();
5066            Instruction[] instructions = sequences[sequence][0];
5067            for (int index = 0; index < instructions.length; index++)
5068            {
5069                Instruction instruction = instructions[index];
5070                try
5071                {
5072                    instruction.accept(clazz, null, null, index, new ClassPrinter());
5073                }
5074                catch (Exception e) {}
5075            }
5076
5077            System.out.println("=>");
5078            instructions = sequences[sequence][1];
5079            for (int index = 0; index < instructions.length; index++)
5080            {
5081                Instruction instruction = instructions[index];
5082                try
5083                {
5084                    instruction.accept(clazz, null, null, index, new ClassPrinter());
5085                }
5086                catch (Exception e) {}
5087            }
5088        }
5089    }
5090}
5091