| /* |
| * ProGuard -- shrinking, optimization, obfuscation, and preverification |
| * of Java bytecode. |
| * |
| * Copyright (c) 2002-2009 Eric Lafortune (eric@graphics.cornell.edu) |
| * |
| * This program is free software; you can redistribute it and/or modify it |
| * under the terms of the GNU General Public License as published by the Free |
| * Software Foundation; either version 2 of the License, or (at your option) |
| * any later version. |
| * |
| * This program is distributed in the hope that it will be useful, but WITHOUT |
| * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or |
| * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for |
| * more details. |
| * |
| * You should have received a copy of the GNU General Public License along |
| * with this program; if not, write to the Free Software Foundation, Inc., |
| * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
| */ |
| package proguard.optimize.peephole; |
| |
| import proguard.classfile.constant.*; |
| import proguard.classfile.instruction.*; |
| import proguard.classfile.util.InstructionSequenceMatcher; |
| |
| /** |
| * This class contains a set of instruction sequences and their suggested |
| * replacements. |
| * |
| * @see InstructionSequencesReplacer |
| * @author Eric Lafortune |
| */ |
| public class InstructionSequenceConstants |
| { |
| public static final int X = InstructionSequenceMatcher.X; |
| public static final int Y = InstructionSequenceMatcher.Y; |
| public static final int Z = InstructionSequenceMatcher.Z; |
| |
| public static final int A = InstructionSequenceMatcher.A; |
| public static final int B = InstructionSequenceMatcher.B; |
| public static final int C = InstructionSequenceMatcher.C; |
| public static final int D = InstructionSequenceMatcher.D; |
| |
| |
| private static final int I_32768 = 0; |
| private static final int I_65536 = 1; |
| private static final int I_16777216 = 2; |
| |
| // private static final int I_0x000000ff |
| private static final int I_0x0000ff00 = 3; |
| private static final int I_0x00ff0000 = 4; |
| private static final int I_0xff000000 = 5; |
| private static final int I_0x0000ffff = 6; |
| private static final int I_0xffff0000 = 7; |
| |
| private static final int L_M1 = 8; |
| private static final int L_2 = 9; |
| private static final int L_4 = 10; |
| private static final int L_8 = 11; |
| private static final int L_16 = 12; |
| private static final int L_32 = 13; |
| private static final int L_64 = 14; |
| private static final int L_128 = 15; |
| private static final int L_256 = 16; |
| private static final int L_512 = 17; |
| private static final int L_1024 = 18; |
| private static final int L_2048 = 19; |
| private static final int L_4096 = 20; |
| private static final int L_8192 = 21; |
| private static final int L_16384 = 22; |
| private static final int L_32768 = 23; |
| private static final int L_65536 = 24; |
| private static final int L_16777216 = 25; |
| private static final int L_4294967296 = 26; |
| |
| private static final int L_0x00000000ffffffff = 27; |
| private static final int L_0xffffffff00000000 = 28; |
| |
| private static final int F_M1 = 29; |
| |
| private static final int D_M1 = 30; |
| |
| private static final int FIELD_I = 31; |
| private static final int FIELD_L = 32; |
| private static final int FIELD_F = 33; |
| private static final int FIELD_D = 34; |
| |
| private static final int NAME_AND_TYPE_I = 35; |
| private static final int NAME_AND_TYPE_L = 36; |
| private static final int NAME_AND_TYPE_F = 37; |
| private static final int NAME_AND_TYPE_D = 38; |
| |
| private static final int TYPE_I = 39; |
| private static final int TYPE_L = 40; |
| private static final int TYPE_F = 41; |
| private static final int TYPE_D = 42; |
| |
| |
| public static final Constant[] CONSTANTS = new Constant[] |
| { |
| new IntegerConstant(32768), |
| new IntegerConstant(65536), |
| new IntegerConstant(16777216), |
| |
| new IntegerConstant(0x0000ff00), |
| new IntegerConstant(0x00ff0000), |
| new IntegerConstant(0xff000000), |
| new IntegerConstant(0x0000ffff), |
| new IntegerConstant(0xffff0000), |
| |
| new LongConstant(-1L), |
| new LongConstant(2L), |
| new LongConstant(4L), |
| new LongConstant(8L), |
| new LongConstant(16L), |
| new LongConstant(32L), |
| new LongConstant(64L), |
| new LongConstant(128L), |
| new LongConstant(256L), |
| new LongConstant(512L), |
| new LongConstant(1024L), |
| new LongConstant(2048L), |
| new LongConstant(4096L), |
| new LongConstant(8192L), |
| new LongConstant(16384L), |
| new LongConstant(32768L), |
| new LongConstant(65536L), |
| new LongConstant(16777216L), |
| new LongConstant(4294967296L), |
| |
| new LongConstant(0x00000000ffffffffL), |
| new LongConstant(0xffffffff00000000L), |
| |
| new FloatConstant(-1f), |
| |
| new DoubleConstant(-1d), |
| |
| new FieldrefConstant(X, NAME_AND_TYPE_I, null, null), |
| new FieldrefConstant(X, NAME_AND_TYPE_L, null, null), |
| new FieldrefConstant(X, NAME_AND_TYPE_F, null, null), |
| new FieldrefConstant(X, NAME_AND_TYPE_D, null, null), |
| |
| new NameAndTypeConstant(Y, TYPE_I), |
| new NameAndTypeConstant(Y, TYPE_L), |
| new NameAndTypeConstant(Y, TYPE_F), |
| new NameAndTypeConstant(Y, TYPE_D), |
| |
| new Utf8Constant("I"), |
| new Utf8Constant("J"), |
| new Utf8Constant("F"), |
| new Utf8Constant("D"), |
| }; |
| |
| |
| public static final Instruction[][][] VARIABLE = new Instruction[][][] |
| { |
| { // nop = nothing |
| { |
| new SimpleInstruction(InstructionConstants.OP_NOP), |
| },{ |
| // Nothing. |
| }, |
| }, |
| { // iload/pop = nothing |
| { |
| new VariableInstruction(InstructionConstants.OP_ILOAD, X), |
| new SimpleInstruction(InstructionConstants.OP_POP), |
| },{ |
| // Nothing. |
| }, |
| }, |
| { // lload/pop2 = nothing |
| { |
| new VariableInstruction(InstructionConstants.OP_LLOAD, X), |
| new SimpleInstruction(InstructionConstants.OP_POP2), |
| },{ |
| // Nothing. |
| }, |
| }, |
| { // fload/pop = nothing |
| { |
| new VariableInstruction(InstructionConstants.OP_FLOAD, X), |
| new SimpleInstruction(InstructionConstants.OP_POP), |
| },{ |
| // Nothing. |
| }, |
| }, |
| { // dload/pop2 = nothing |
| { |
| new VariableInstruction(InstructionConstants.OP_DLOAD, X), |
| new SimpleInstruction(InstructionConstants.OP_POP2), |
| },{ |
| // Nothing. |
| }, |
| }, |
| { // aload/pop = nothing |
| { |
| new VariableInstruction(InstructionConstants.OP_ALOAD, X), |
| new SimpleInstruction(InstructionConstants.OP_POP), |
| },{ |
| // Nothing. |
| }, |
| }, |
| { // i = i = nothing |
| { |
| new VariableInstruction(InstructionConstants.OP_ILOAD, X), |
| new VariableInstruction(InstructionConstants.OP_ISTORE, X), |
| },{ |
| // Nothing. |
| }, |
| }, |
| { // l = l = nothing |
| { |
| new VariableInstruction(InstructionConstants.OP_LLOAD, X), |
| new VariableInstruction(InstructionConstants.OP_LSTORE, X), |
| },{ |
| // Nothing. |
| }, |
| }, |
| { // f = f = nothing |
| { |
| new VariableInstruction(InstructionConstants.OP_FLOAD, X), |
| new VariableInstruction(InstructionConstants.OP_FSTORE, X), |
| },{ |
| // Nothing. |
| }, |
| }, |
| { // d = d = nothing |
| { |
| new VariableInstruction(InstructionConstants.OP_DLOAD, X), |
| new VariableInstruction(InstructionConstants.OP_DSTORE, X), |
| },{ |
| // Nothing. |
| }, |
| }, |
| { // a = a = nothing |
| { |
| new VariableInstruction(InstructionConstants.OP_ALOAD, X), |
| new SimpleInstruction(InstructionConstants.OP_POP), |
| },{ |
| // Nothing. |
| }, |
| }, |
| { // istore/istore = pop/istore |
| { |
| new VariableInstruction(InstructionConstants.OP_ISTORE, X), |
| new VariableInstruction(InstructionConstants.OP_ISTORE, X), |
| },{ |
| new SimpleInstruction(InstructionConstants.OP_POP), |
| new VariableInstruction(InstructionConstants.OP_ISTORE, X), |
| }, |
| }, |
| { // lstore/lstore = pop2/lstore |
| { |
| new VariableInstruction(InstructionConstants.OP_LSTORE, X), |
| new VariableInstruction(InstructionConstants.OP_LSTORE, X), |
| },{ |
| new SimpleInstruction(InstructionConstants.OP_POP2), |
| new VariableInstruction(InstructionConstants.OP_LSTORE, X), |
| }, |
| }, |
| { // fstore/fstore = pop/fstore |
| { |
| new VariableInstruction(InstructionConstants.OP_FSTORE, X), |
| new VariableInstruction(InstructionConstants.OP_FSTORE, X), |
| },{ |
| new SimpleInstruction(InstructionConstants.OP_POP), |
| new VariableInstruction(InstructionConstants.OP_FSTORE, X), |
| }, |
| }, |
| { // dstore/dstore = pop2/dstore |
| { |
| new VariableInstruction(InstructionConstants.OP_DSTORE, X), |
| new VariableInstruction(InstructionConstants.OP_DSTORE, X), |
| },{ |
| new SimpleInstruction(InstructionConstants.OP_POP2), |
| new VariableInstruction(InstructionConstants.OP_DSTORE, X), |
| }, |
| }, |
| { // astore/astore = pop/astore |
| { |
| new VariableInstruction(InstructionConstants.OP_ASTORE, X), |
| new VariableInstruction(InstructionConstants.OP_ASTORE, X), |
| },{ |
| new SimpleInstruction(InstructionConstants.OP_POP), |
| new VariableInstruction(InstructionConstants.OP_ASTORE, X), |
| }, |
| }, |
| { // istore/iload = dup/istore |
| { |
| new VariableInstruction(InstructionConstants.OP_ISTORE, X), |
| new VariableInstruction(InstructionConstants.OP_ILOAD, X), |
| },{ |
| new SimpleInstruction(InstructionConstants.OP_DUP), |
| new VariableInstruction(InstructionConstants.OP_ISTORE, X), |
| }, |
| }, |
| { // lstore/lload = dup2/lstore |
| { |
| new VariableInstruction(InstructionConstants.OP_LSTORE, X), |
| new VariableInstruction(InstructionConstants.OP_LLOAD, X), |
| },{ |
| new SimpleInstruction(InstructionConstants.OP_DUP2), |
| new VariableInstruction(InstructionConstants.OP_LSTORE, X), |
| }, |
| }, |
| { // fstore/fload = dup/fstore |
| { |
| new VariableInstruction(InstructionConstants.OP_FSTORE, X), |
| new VariableInstruction(InstructionConstants.OP_FLOAD, X), |
| },{ |
| new SimpleInstruction(InstructionConstants.OP_DUP), |
| new VariableInstruction(InstructionConstants.OP_FSTORE, X), |
| }, |
| }, |
| { // dstore/dload = dup2/dstore |
| { |
| new VariableInstruction(InstructionConstants.OP_DSTORE, X), |
| new VariableInstruction(InstructionConstants.OP_DLOAD, X), |
| },{ |
| new SimpleInstruction(InstructionConstants.OP_DUP2), |
| new VariableInstruction(InstructionConstants.OP_DSTORE, X), |
| }, |
| }, |
| { // astore/aload = dup/astore |
| { |
| new VariableInstruction(InstructionConstants.OP_ASTORE, X), |
| new VariableInstruction(InstructionConstants.OP_ALOAD, X), |
| },{ |
| new SimpleInstruction(InstructionConstants.OP_DUP), |
| new VariableInstruction(InstructionConstants.OP_ASTORE, X), |
| }, |
| }, |
| }; |
| |
| public static final Instruction[][][] ARITHMETIC = new Instruction[][][] |
| { |
| { // c + i = i + c |
| { |
| new SimpleInstruction(InstructionConstants.OP_ICONST_0, A), |
| new VariableInstruction(InstructionConstants.OP_ILOAD, X), |
| new SimpleInstruction(InstructionConstants.OP_IADD), |
| },{ |
| new VariableInstruction(InstructionConstants.OP_ILOAD, X), |
| new SimpleInstruction(InstructionConstants.OP_ICONST_0, A), |
| new SimpleInstruction(InstructionConstants.OP_IADD), |
| }, |
| }, |
| { // b + i = i + b |
| { |
| new SimpleInstruction(InstructionConstants.OP_BIPUSH, A), |
| new VariableInstruction(InstructionConstants.OP_ILOAD, X), |
| new SimpleInstruction(InstructionConstants.OP_IADD), |
| },{ |
| new VariableInstruction(InstructionConstants.OP_ILOAD, X), |
| new SimpleInstruction(InstructionConstants.OP_BIPUSH, A), |
| new SimpleInstruction(InstructionConstants.OP_IADD), |
| }, |
| }, |
| { // s + i = i + s |
| { |
| new SimpleInstruction(InstructionConstants.OP_SIPUSH, A), |
| new VariableInstruction(InstructionConstants.OP_ILOAD, X), |
| new SimpleInstruction(InstructionConstants.OP_IADD), |
| },{ |
| new VariableInstruction(InstructionConstants.OP_ILOAD, X), |
| new SimpleInstruction(InstructionConstants.OP_SIPUSH, A), |
| new SimpleInstruction(InstructionConstants.OP_IADD), |
| }, |
| }, |
| { // c + i = i + c |
| { |
| new ConstantInstruction(InstructionConstants.OP_LDC, A), |
| new VariableInstruction(InstructionConstants.OP_ILOAD, X), |
| new SimpleInstruction(InstructionConstants.OP_IADD), |
| },{ |
| new VariableInstruction(InstructionConstants.OP_ILOAD, X), |
| new ConstantInstruction(InstructionConstants.OP_LDC, A), |
| new SimpleInstruction(InstructionConstants.OP_IADD), |
| }, |
| }, |
| { // c * i = i * c |
| { |
| new SimpleInstruction(InstructionConstants.OP_ICONST_0, A), |
| new VariableInstruction(InstructionConstants.OP_ILOAD, X), |
| new SimpleInstruction(InstructionConstants.OP_IMUL), |
| },{ |
| new VariableInstruction(InstructionConstants.OP_ILOAD, X), |
| new SimpleInstruction(InstructionConstants.OP_ICONST_0, A), |
| new SimpleInstruction(InstructionConstants.OP_IMUL), |
| }, |
| }, |
| { // b * i = i * b |
| { |
| new SimpleInstruction(InstructionConstants.OP_BIPUSH, A), |
| new VariableInstruction(InstructionConstants.OP_ILOAD, X), |
| new SimpleInstruction(InstructionConstants.OP_IMUL), |
| },{ |
| new VariableInstruction(InstructionConstants.OP_ILOAD, X), |
| new SimpleInstruction(InstructionConstants.OP_BIPUSH, A), |
| new SimpleInstruction(InstructionConstants.OP_IMUL), |
| }, |
| }, |
| { // s * i = i * s |
| { |
| new SimpleInstruction(InstructionConstants.OP_SIPUSH, A), |
| new VariableInstruction(InstructionConstants.OP_ILOAD, X), |
| new SimpleInstruction(InstructionConstants.OP_IMUL), |
| },{ |
| new VariableInstruction(InstructionConstants.OP_ILOAD, X), |
| new SimpleInstruction(InstructionConstants.OP_SIPUSH, A), |
| new SimpleInstruction(InstructionConstants.OP_IMUL), |
| }, |
| }, |
| { // c * i = i * c |
| { |
| new ConstantInstruction(InstructionConstants.OP_LDC, A), |
| new VariableInstruction(InstructionConstants.OP_ILOAD, X), |
| new SimpleInstruction(InstructionConstants.OP_IMUL), |
| },{ |
| new VariableInstruction(InstructionConstants.OP_ILOAD, X), |
| new ConstantInstruction(InstructionConstants.OP_LDC, A), |
| new SimpleInstruction(InstructionConstants.OP_IMUL), |
| }, |
| }, |
| { // c + l = l + c |
| { |
| new SimpleInstruction(InstructionConstants.OP_LCONST_0, A), |
| new VariableInstruction(InstructionConstants.OP_LLOAD, X), |
| new SimpleInstruction(InstructionConstants.OP_LADD), |
| },{ |
| new VariableInstruction(InstructionConstants.OP_LLOAD, X), |
| new SimpleInstruction(InstructionConstants.OP_LCONST_0, A), |
| new SimpleInstruction(InstructionConstants.OP_LADD), |
| }, |
| }, |
| { // c + l = l + c |
| { |
| new ConstantInstruction(InstructionConstants.OP_LDC2_W, A), |
| new VariableInstruction(InstructionConstants.OP_LLOAD, X), |
| new SimpleInstruction(InstructionConstants.OP_LADD), |
| },{ |
| new VariableInstruction(InstructionConstants.OP_LLOAD, X), |
| new ConstantInstruction(InstructionConstants.OP_LDC2_W, A), |
| new SimpleInstruction(InstructionConstants.OP_LADD), |
| }, |
| }, |
| { // c * l = l * c |
| { |
| new SimpleInstruction(InstructionConstants.OP_LCONST_0, A), |
| new VariableInstruction(InstructionConstants.OP_LLOAD, X), |
| new SimpleInstruction(InstructionConstants.OP_LMUL), |
| },{ |
| new VariableInstruction(InstructionConstants.OP_LLOAD, X), |
| new SimpleInstruction(InstructionConstants.OP_LCONST_0, A), |
| new SimpleInstruction(InstructionConstants.OP_LMUL), |
| }, |
| }, |
| { // c + f = f + c |
| { |
| new SimpleInstruction(InstructionConstants.OP_FCONST_0, A), |
| new VariableInstruction(InstructionConstants.OP_FLOAD, X), |
| new SimpleInstruction(InstructionConstants.OP_FADD), |
| },{ |
| new VariableInstruction(InstructionConstants.OP_FLOAD, X), |
| new SimpleInstruction(InstructionConstants.OP_FCONST_0, A), |
| new SimpleInstruction(InstructionConstants.OP_FADD), |
| }, |
| }, |
| { // c + f = f + c |
| { |
| new ConstantInstruction(InstructionConstants.OP_LDC, A), |
| new VariableInstruction(InstructionConstants.OP_FLOAD, X), |
| new SimpleInstruction(InstructionConstants.OP_FADD), |
| },{ |
| new VariableInstruction(InstructionConstants.OP_FLOAD, X), |
| new ConstantInstruction(InstructionConstants.OP_LDC, A), |
| new SimpleInstruction(InstructionConstants.OP_FADD), |
| }, |
| }, |
| { // c * f = f * c |
| { |
| new SimpleInstruction(InstructionConstants.OP_FCONST_0, A), |
| new VariableInstruction(InstructionConstants.OP_FLOAD, X), |
| new SimpleInstruction(InstructionConstants.OP_FMUL), |
| },{ |
| new VariableInstruction(InstructionConstants.OP_FLOAD, X), |
| new SimpleInstruction(InstructionConstants.OP_FCONST_0, A), |
| new SimpleInstruction(InstructionConstants.OP_FMUL), |
| }, |
| }, |
| { // c * f = f * c |
| { |
| new ConstantInstruction(InstructionConstants.OP_LDC, A), |
| new VariableInstruction(InstructionConstants.OP_FLOAD, X), |
| new SimpleInstruction(InstructionConstants.OP_LMUL), |
| },{ |
| new VariableInstruction(InstructionConstants.OP_FLOAD, X), |
| new ConstantInstruction(InstructionConstants.OP_LDC, A), |
| new SimpleInstruction(InstructionConstants.OP_LMUL), |
| }, |
| }, |
| { // c + d = d + c |
| { |
| new SimpleInstruction(InstructionConstants.OP_DCONST_0, A), |
| new VariableInstruction(InstructionConstants.OP_DLOAD, X), |
| new SimpleInstruction(InstructionConstants.OP_DADD), |
| },{ |
| new VariableInstruction(InstructionConstants.OP_DLOAD, X), |
| new SimpleInstruction(InstructionConstants.OP_DCONST_0, A), |
| new SimpleInstruction(InstructionConstants.OP_DADD), |
| }, |
| }, |
| { // c + d = d + c |
| { |
| new ConstantInstruction(InstructionConstants.OP_LDC2_W, A), |
| new VariableInstruction(InstructionConstants.OP_DLOAD, X), |
| new SimpleInstruction(InstructionConstants.OP_DADD), |
| },{ |
| new VariableInstruction(InstructionConstants.OP_DLOAD, X), |
| new ConstantInstruction(InstructionConstants.OP_LDC2_W, A), |
| new SimpleInstruction(InstructionConstants.OP_DADD), |
| }, |
| }, |
| { // c * d = d * c |
| { |
| new SimpleInstruction(InstructionConstants.OP_DCONST_0, A), |
| new VariableInstruction(InstructionConstants.OP_DLOAD, X), |
| new SimpleInstruction(InstructionConstants.OP_DMUL), |
| },{ |
| new VariableInstruction(InstructionConstants.OP_DLOAD, X), |
| new SimpleInstruction(InstructionConstants.OP_DCONST_0, A), |
| new SimpleInstruction(InstructionConstants.OP_DMUL), |
| }, |
| }, |
| { // c * d = d * c |
| { |
| new ConstantInstruction(InstructionConstants.OP_LDC2_W, A), |
| new VariableInstruction(InstructionConstants.OP_DLOAD, X), |
| new SimpleInstruction(InstructionConstants.OP_DMUL), |
| },{ |
| new VariableInstruction(InstructionConstants.OP_DLOAD, X), |
| new ConstantInstruction(InstructionConstants.OP_LDC2_W, A), |
| new SimpleInstruction(InstructionConstants.OP_DMUL), |
| }, |
| }, |
| { // i = i + c = i += c |
| { |
| new VariableInstruction(InstructionConstants.OP_ILOAD, X), |
| new SimpleInstruction(InstructionConstants.OP_ICONST_0, A), |
| new SimpleInstruction(InstructionConstants.OP_IADD), |
| new VariableInstruction(InstructionConstants.OP_ISTORE, X), |
| },{ |
| new VariableInstruction(InstructionConstants.OP_IINC, X, A), |
| }, |
| }, |
| { // i = i + b = i += b |
| { |
| new VariableInstruction(InstructionConstants.OP_ILOAD, X), |
| new SimpleInstruction(InstructionConstants.OP_BIPUSH, A), |
| new SimpleInstruction(InstructionConstants.OP_IADD), |
| new VariableInstruction(InstructionConstants.OP_ISTORE, X), |
| },{ |
| new VariableInstruction(InstructionConstants.OP_IINC, X, A), |
| }, |
| }, |
| { // i = i + s = i += s |
| { |
| new VariableInstruction(InstructionConstants.OP_ILOAD, X), |
| new SimpleInstruction(InstructionConstants.OP_SIPUSH, A), |
| new SimpleInstruction(InstructionConstants.OP_IADD), |
| new VariableInstruction(InstructionConstants.OP_ISTORE, X), |
| },{ |
| new VariableInstruction(InstructionConstants.OP_IINC, X, A), |
| }, |
| }, |
| { // i = i - -1 = i++ |
| { |
| new VariableInstruction(InstructionConstants.OP_ILOAD, X), |
| new SimpleInstruction(InstructionConstants.OP_ICONST_M1), |
| new SimpleInstruction(InstructionConstants.OP_ISUB), |
| new VariableInstruction(InstructionConstants.OP_ISTORE, X), |
| },{ |
| new VariableInstruction(InstructionConstants.OP_IINC, X, 1), |
| }, |
| }, |
| { // i = i - 1 = i-- |
| { |
| new VariableInstruction(InstructionConstants.OP_ILOAD, X), |
| new SimpleInstruction(InstructionConstants.OP_ICONST_1), |
| new SimpleInstruction(InstructionConstants.OP_ISUB), |
| new VariableInstruction(InstructionConstants.OP_ISTORE, X), |
| },{ |
| new VariableInstruction(InstructionConstants.OP_IINC, X, -1), |
| }, |
| }, |
| { // i = i - 2 = i -= 2 |
| { |
| new VariableInstruction(InstructionConstants.OP_ILOAD, X), |
| new SimpleInstruction(InstructionConstants.OP_ICONST_2), |
| new SimpleInstruction(InstructionConstants.OP_ISUB), |
| new VariableInstruction(InstructionConstants.OP_ISTORE, X), |
| },{ |
| new VariableInstruction(InstructionConstants.OP_IINC, X, -2), |
| }, |
| }, |
| { // i = i - 3 = i -= 3 |
| { |
| new VariableInstruction(InstructionConstants.OP_ILOAD, X), |
| new SimpleInstruction(InstructionConstants.OP_ICONST_3), |
| new SimpleInstruction(InstructionConstants.OP_ISUB), |
| new VariableInstruction(InstructionConstants.OP_ISTORE, X), |
| },{ |
| new VariableInstruction(InstructionConstants.OP_IINC, X, -3), |
| }, |
| }, |
| { // i = i - 4 = i -= 4 |
| { |
| new VariableInstruction(InstructionConstants.OP_ILOAD, X), |
| new SimpleInstruction(InstructionConstants.OP_ICONST_4), |
| new SimpleInstruction(InstructionConstants.OP_ISUB), |
| new VariableInstruction(InstructionConstants.OP_ISTORE, X), |
| },{ |
| new VariableInstruction(InstructionConstants.OP_IINC, X, -4), |
| }, |
| }, |
| { // i = i - 5 = i -= 5 |
| { |
| new VariableInstruction(InstructionConstants.OP_ILOAD, X), |
| new SimpleInstruction(InstructionConstants.OP_ICONST_5), |
| new SimpleInstruction(InstructionConstants.OP_ISUB), |
| new VariableInstruction(InstructionConstants.OP_ISTORE, X), |
| },{ |
| new VariableInstruction(InstructionConstants.OP_IINC, X, -5), |
| }, |
| }, |
| { // ... + 0 = ... |
| { |
| new SimpleInstruction(InstructionConstants.OP_ICONST_0), |
| new SimpleInstruction(InstructionConstants.OP_IADD), |
| },{ |
| // Nothing. |
| }, |
| }, |
| { // ... + 0L = ... |
| { |
| new SimpleInstruction(InstructionConstants.OP_LCONST_0), |
| new SimpleInstruction(InstructionConstants.OP_LADD), |
| },{ |
| // Nothing. |
| }, |
| }, |
| { // ... + 0f = ... |
| { |
| new SimpleInstruction(InstructionConstants.OP_FCONST_0), |
| new SimpleInstruction(InstructionConstants.OP_FADD), |
| },{ |
| // Nothing. |
| }, |
| }, |
| { // ... + 0d = ... |
| { |
| new SimpleInstruction(InstructionConstants.OP_DCONST_0), |
| new SimpleInstruction(InstructionConstants.OP_DADD), |
| },{ |
| // Nothing. |
| }, |
| }, |
| { // ... - 0 = ... |
| { |
| new SimpleInstruction(InstructionConstants.OP_ICONST_0), |
| new SimpleInstruction(InstructionConstants.OP_ISUB), |
| },{ |
| // Nothing. |
| }, |
| }, |
| { // ... - 0L = ... |
| { |
| new SimpleInstruction(InstructionConstants.OP_LCONST_0), |
| new SimpleInstruction(InstructionConstants.OP_LSUB), |
| },{ |
| // Nothing. |
| }, |
| }, |
| { // ... - 0f = ... |
| { |
| new SimpleInstruction(InstructionConstants.OP_FCONST_0), |
| new SimpleInstruction(InstructionConstants.OP_FSUB), |
| },{ |
| // Nothing. |
| }, |
| }, |
| { // ... - 0d = ... |
| { |
| new SimpleInstruction(InstructionConstants.OP_DCONST_0), |
| new SimpleInstruction(InstructionConstants.OP_DSUB), |
| },{ |
| // Nothing. |
| }, |
| }, |
| { // ... * -1 = -... |
| { |
| new SimpleInstruction(InstructionConstants.OP_ICONST_M1), |
| new SimpleInstruction(InstructionConstants.OP_IMUL), |
| },{ |
| new SimpleInstruction(InstructionConstants.OP_INEG), |
| }, |
| }, |
| { // ... * 0 = 0 |
| { |
| new SimpleInstruction(InstructionConstants.OP_ICONST_0), |
| new SimpleInstruction(InstructionConstants.OP_IMUL), |
| },{ |
| new SimpleInstruction(InstructionConstants.OP_POP), |
| new SimpleInstruction(InstructionConstants.OP_ICONST_0), |
| }, |
| }, |
| { // ... * 1 = ... |
| { |
| new SimpleInstruction(InstructionConstants.OP_ICONST_1), |
| new SimpleInstruction(InstructionConstants.OP_IMUL), |
| },{ |
| // Nothing. |
| }, |
| }, |
| { // ... * 2 = ... << 1 |
| { |
| new SimpleInstruction(InstructionConstants.OP_ICONST_2), |
| new SimpleInstruction(InstructionConstants.OP_IMUL), |
| },{ |
| new SimpleInstruction(InstructionConstants.OP_ICONST_1), |
| new SimpleInstruction(InstructionConstants.OP_ISHL), |
| }, |
| }, |
| { // ... * 4 = ... << 2 |
| { |
| new SimpleInstruction(InstructionConstants.OP_ICONST_4), |
| new SimpleInstruction(InstructionConstants.OP_IMUL), |
| },{ |
| new SimpleInstruction(InstructionConstants.OP_ICONST_2), |
| new SimpleInstruction(InstructionConstants.OP_ISHL), |
| }, |
| }, |
| { // ... * 8 = ... << 3 |
| { |
| new SimpleInstruction(InstructionConstants.OP_BIPUSH, 8), |
| new SimpleInstruction(InstructionConstants.OP_IMUL), |
| },{ |
| new SimpleInstruction(InstructionConstants.OP_ICONST_3), |
| new SimpleInstruction(InstructionConstants.OP_ISHL), |
| }, |
| }, |
| { // ... * 16 = ... << 4 |
| { |
| new SimpleInstruction(InstructionConstants.OP_BIPUSH, 16), |
| new SimpleInstruction(InstructionConstants.OP_IMUL), |
| },{ |
| new SimpleInstruction(InstructionConstants.OP_BIPUSH, 4), |
| new SimpleInstruction(InstructionConstants.OP_ISHL), |
| }, |
| }, |
| { // ... * 32 = ... << 5 |
| { |
| new SimpleInstruction(InstructionConstants.OP_BIPUSH, 32), |
| new SimpleInstruction(InstructionConstants.OP_IMUL), |
| },{ |
| new SimpleInstruction(InstructionConstants.OP_BIPUSH, 5), |
| new SimpleInstruction(InstructionConstants.OP_ISHL), |
| }, |
| }, |
| { // ... * 64 = ... << 6 |
| { |
| new SimpleInstruction(InstructionConstants.OP_BIPUSH, 64), |
| new SimpleInstruction(InstructionConstants.OP_IMUL), |
| },{ |
| new SimpleInstruction(InstructionConstants.OP_BIPUSH, 6), |
| new SimpleInstruction(InstructionConstants.OP_ISHL), |
| }, |
| }, |
| { // ... * 128 = ... << 7 |
| { |
| new SimpleInstruction(InstructionConstants.OP_SIPUSH, 128), |
| new SimpleInstruction(InstructionConstants.OP_IMUL), |
| },{ |
| new SimpleInstruction(InstructionConstants.OP_BIPUSH, 7), |
| new SimpleInstruction(InstructionConstants.OP_ISHL), |
| }, |
| }, |
| { // ... * 256 = ... << 8 |
| { |
| new SimpleInstruction(InstructionConstants.OP_SIPUSH, 256), |
| new SimpleInstruction(InstructionConstants.OP_IMUL), |
| },{ |
| new SimpleInstruction(InstructionConstants.OP_BIPUSH, 8), |
| new SimpleInstruction(InstructionConstants.OP_ISHL), |
| }, |
| }, |
| { // ... * 512 = ... << 9 |
| { |
| new SimpleInstruction(InstructionConstants.OP_SIPUSH, 512), |
| new SimpleInstruction(InstructionConstants.OP_IMUL), |
| },{ |
| new SimpleInstruction(InstructionConstants.OP_BIPUSH, 9), |
| new SimpleInstruction(InstructionConstants.OP_ISHL), |
| }, |
| }, |
| { // ... * 1024 = ... << 10 |
| { |
| new SimpleInstruction(InstructionConstants.OP_SIPUSH, 1024), |
| new SimpleInstruction(InstructionConstants.OP_IMUL), |
| },{ |
| new SimpleInstruction(InstructionConstants.OP_BIPUSH, 10), |
| new SimpleInstruction(InstructionConstants.OP_ISHL), |
| }, |
| }, |
| { // ... * 2048 = ... << 11 |
| { |
| new SimpleInstruction(InstructionConstants.OP_SIPUSH, 2048), |
| new SimpleInstruction(InstructionConstants.OP_IMUL), |
| },{ |
| new SimpleInstruction(InstructionConstants.OP_BIPUSH, 11), |
| new SimpleInstruction(InstructionConstants.OP_ISHL), |
| }, |
| }, |
| { // ... * 4096 = ... << 12 |
| { |
| new SimpleInstruction(InstructionConstants.OP_SIPUSH, 4096), |
| new SimpleInstruction(InstructionConstants.OP_IMUL), |
| },{ |
| new SimpleInstruction(InstructionConstants.OP_BIPUSH, 12), |
| new SimpleInstruction(InstructionConstants.OP_ISHL), |
| }, |
| }, |
| { // ... * 8192 = ... << 13 |
| { |
| new SimpleInstruction(InstructionConstants.OP_SIPUSH, 8192), |
| new SimpleInstruction(InstructionConstants.OP_IMUL), |
| },{ |
| new SimpleInstruction(InstructionConstants.OP_BIPUSH, 13), |
| new SimpleInstruction(InstructionConstants.OP_ISHL), |
| }, |
| }, |
| { // ... * 16384 = ... << 14 |
| { |
| new SimpleInstruction(InstructionConstants.OP_SIPUSH, 16384), |
| new SimpleInstruction(InstructionConstants.OP_IMUL), |
| },{ |
| new SimpleInstruction(InstructionConstants.OP_BIPUSH, 14), |
| new SimpleInstruction(InstructionConstants.OP_ISHL), |
| }, |
| }, |
| { // ... * 32768 = ... << 15 |
| { |
| new ConstantInstruction(InstructionConstants.OP_LDC, I_32768), |
| new SimpleInstruction(InstructionConstants.OP_IMUL), |
| },{ |
| new SimpleInstruction(InstructionConstants.OP_BIPUSH, 15), |
| new SimpleInstruction(InstructionConstants.OP_ISHL), |
| }, |
| }, |
| { // ... * 65536 = ... << 16 |
| { |
| new ConstantInstruction(InstructionConstants.OP_LDC, I_65536), |
| new SimpleInstruction(InstructionConstants.OP_IMUL), |
| },{ |
| new SimpleInstruction(InstructionConstants.OP_BIPUSH, 16), |
| new SimpleInstruction(InstructionConstants.OP_ISHL), |
| }, |
| }, |
| { // ... * 16777216 = ... << 24 |
| { |
| new ConstantInstruction(InstructionConstants.OP_LDC, I_16777216), |
| new SimpleInstruction(InstructionConstants.OP_IMUL), |
| },{ |
| new SimpleInstruction(InstructionConstants.OP_BIPUSH, 24), |
| new SimpleInstruction(InstructionConstants.OP_ISHL), |
| }, |
| }, |
| { // ... * -1L = -... |
| { |
| new ConstantInstruction(InstructionConstants.OP_LDC2_W, L_M1), |
| new SimpleInstruction(InstructionConstants.OP_LMUL), |
| },{ |
| new SimpleInstruction(InstructionConstants.OP_LNEG), |
| }, |
| }, |
| { // ... * 0L = 0L |
| { |
| new SimpleInstruction(InstructionConstants.OP_LCONST_0), |
| new SimpleInstruction(InstructionConstants.OP_LMUL), |
| },{ |
| new SimpleInstruction(InstructionConstants.OP_POP2), |
| new SimpleInstruction(InstructionConstants.OP_LCONST_0), |
| }, |
| }, |
| { // ... * 1L = ... |
| { |
| new SimpleInstruction(InstructionConstants.OP_LCONST_1), |
| new SimpleInstruction(InstructionConstants.OP_LMUL), |
| },{ |
| // Nothing. |
| }, |
| }, |
| { // ... * 2L = ... << 1 |
| { |
| new ConstantInstruction(InstructionConstants.OP_LDC2_W, L_2), |
| new SimpleInstruction(InstructionConstants.OP_LMUL), |
| },{ |
| new SimpleInstruction(InstructionConstants.OP_ICONST_1), |
| new SimpleInstruction(InstructionConstants.OP_LSHL), |
| }, |
| }, |
| { // ... * 4L = ... << 2 |
| { |
| new ConstantInstruction(InstructionConstants.OP_LDC2_W, L_4), |
| new SimpleInstruction(InstructionConstants.OP_LMUL), |
| },{ |
| new SimpleInstruction(InstructionConstants.OP_ICONST_2), |
| new SimpleInstruction(InstructionConstants.OP_LSHL), |
| }, |
| }, |
| { // ... * 8L = ... << 3 |
| { |
| new ConstantInstruction(InstructionConstants.OP_LDC2_W, L_8), |
| new SimpleInstruction(InstructionConstants.OP_LMUL), |
| },{ |
| new SimpleInstruction(InstructionConstants.OP_ICONST_3), |
| new SimpleInstruction(InstructionConstants.OP_LSHL), |
| }, |
| }, |
| { // ... * 16L = ... << 4 |
| { |
| new ConstantInstruction(InstructionConstants.OP_LDC2_W, L_16), |
| new SimpleInstruction(InstructionConstants.OP_LMUL), |
| },{ |
| new SimpleInstruction(InstructionConstants.OP_BIPUSH, 4), |
| new SimpleInstruction(InstructionConstants.OP_LSHL), |
| }, |
| }, |
| { // ... * 32L = ... << 5 |
| { |
| new ConstantInstruction(InstructionConstants.OP_LDC2_W, L_32), |
| new SimpleInstruction(InstructionConstants.OP_LMUL), |
| },{ |
| new SimpleInstruction(InstructionConstants.OP_BIPUSH, 5), |
| new SimpleInstruction(InstructionConstants.OP_LSHL), |
| }, |
| }, |
| { // ... * 64L = ... << 6 |
| { |
| new ConstantInstruction(InstructionConstants.OP_LDC2_W, L_64), |
| new SimpleInstruction(InstructionConstants.OP_LMUL), |
| },{ |
| new SimpleInstruction(InstructionConstants.OP_BIPUSH, 6), |
| new SimpleInstruction(InstructionConstants.OP_LSHL), |
| }, |
| }, |
| { // ... * 128L = ... << 7 |
| { |
| new ConstantInstruction(InstructionConstants.OP_LDC2_W, L_128), |
| new SimpleInstruction(InstructionConstants.OP_LMUL), |
| },{ |
| new SimpleInstruction(InstructionConstants.OP_BIPUSH, 7), |
| new SimpleInstruction(InstructionConstants.OP_LSHL), |
| }, |
| }, |
| { // ... * 256L = ... << 8 |
| { |
| new ConstantInstruction(InstructionConstants.OP_LDC2_W, L_256), |
| new SimpleInstruction(InstructionConstants.OP_LMUL), |
| },{ |
| new SimpleInstruction(InstructionConstants.OP_BIPUSH, 8), |
| new SimpleInstruction(InstructionConstants.OP_LSHL), |
| }, |
| }, |
| { // ... * 512L = ... << 9 |
| { |
| new ConstantInstruction(InstructionConstants.OP_LDC2_W, L_512), |
| new SimpleInstruction(InstructionConstants.OP_LMUL), |
| },{ |
| new SimpleInstruction(InstructionConstants.OP_BIPUSH, 9), |
| new SimpleInstruction(InstructionConstants.OP_LSHL), |
| }, |
| }, |
| { // ... * 1024L = ... << 10 |
| { |
| new ConstantInstruction(InstructionConstants.OP_LDC2_W, L_1024), |
| new SimpleInstruction(InstructionConstants.OP_LMUL), |
| },{ |
| new SimpleInstruction(InstructionConstants.OP_BIPUSH, 10), |
| new SimpleInstruction(InstructionConstants.OP_LSHL), |
| }, |
| }, |
| { // ... * 2048L = ... << 11 |
| { |
| new ConstantInstruction(InstructionConstants.OP_LDC2_W, L_2048), |
| new SimpleInstruction(InstructionConstants.OP_LMUL), |
| },{ |
| new SimpleInstruction(InstructionConstants.OP_BIPUSH, 11), |
| new SimpleInstruction(InstructionConstants.OP_LSHL), |
| }, |
| }, |
| { // ... * 4096L = ... << 12 |
| { |
| new ConstantInstruction(InstructionConstants.OP_LDC2_W, L_4096), |
| new SimpleInstruction(InstructionConstants.OP_LMUL), |
| },{ |
| new SimpleInstruction(InstructionConstants.OP_BIPUSH, 12), |
| new SimpleInstruction(InstructionConstants.OP_LSHL), |
| }, |
| }, |
| { // ... * 8192L = ... << 13 |
| { |
| new ConstantInstruction(InstructionConstants.OP_LDC2_W, L_8192), |
| new SimpleInstruction(InstructionConstants.OP_LMUL), |
| },{ |
| new SimpleInstruction(InstructionConstants.OP_BIPUSH, 13), |
| new SimpleInstruction(InstructionConstants.OP_LSHL), |
| }, |
| }, |
| { // ... * 16384L = ... << 14 |
| { |
| new ConstantInstruction(InstructionConstants.OP_LDC2_W, L_16384), |
| new SimpleInstruction(InstructionConstants.OP_LMUL), |
| },{ |
| new SimpleInstruction(InstructionConstants.OP_BIPUSH, 14), |
| new SimpleInstruction(InstructionConstants.OP_LSHL), |
| }, |
| }, |
| { // ... * 32768L = ... << 15 |
| { |
| new ConstantInstruction(InstructionConstants.OP_LDC2_W, L_32768), |
| new SimpleInstruction(InstructionConstants.OP_LMUL), |
| },{ |
| new SimpleInstruction(InstructionConstants.OP_BIPUSH, 15), |
| new SimpleInstruction(InstructionConstants.OP_LSHL), |
| }, |
| }, |
| { // ... * 65536LL = ... << 16 |
| { |
| new ConstantInstruction(InstructionConstants.OP_LDC2_W, L_65536), |
| new SimpleInstruction(InstructionConstants.OP_LMUL), |
| },{ |
| new SimpleInstruction(InstructionConstants.OP_BIPUSH, 16), |
| new SimpleInstruction(InstructionConstants.OP_LSHL), |
| }, |
| }, |
| { // ... * 16777216L = ... << 24 |
| { |
| new ConstantInstruction(InstructionConstants.OP_LDC2_W, L_16777216), |
| new SimpleInstruction(InstructionConstants.OP_LMUL), |
| },{ |
| new SimpleInstruction(InstructionConstants.OP_BIPUSH, 24), |
| new SimpleInstruction(InstructionConstants.OP_LSHL), |
| }, |
| }, |
| { // ... * 4294967296L = ... << 32 |
| { |
| new ConstantInstruction(InstructionConstants.OP_LDC2_W, L_4294967296), |
| new SimpleInstruction(InstructionConstants.OP_LMUL), |
| },{ |
| new SimpleInstruction(InstructionConstants.OP_BIPUSH, 32), |
| new SimpleInstruction(InstructionConstants.OP_LSHL), |
| }, |
| }, |
| { // ... * -1f = -... |
| { |
| new ConstantInstruction(InstructionConstants.OP_LDC, F_M1), |
| new SimpleInstruction(InstructionConstants.OP_FMUL), |
| },{ |
| new SimpleInstruction(InstructionConstants.OP_FNEG), |
| }, |
| }, |
| // { // ... * 0f = 0f (or NaN) |
| // { |
| // new SimpleInstruction(InstructionConstants.OP_FCONST_0), |
| // new SimpleInstruction(InstructionConstants.OP_FMUL), |
| // },{ |
| // new SimpleInstruction(InstructionConstants.OP_POP), |
| // new SimpleInstruction(InstructionConstants.OP_FCONST_0), |
| // }, |
| // }, |
| { // ... * 1f = ... |
| { |
| new SimpleInstruction(InstructionConstants.OP_FCONST_1), |
| new SimpleInstruction(InstructionConstants.OP_FMUL), |
| },{ |
| // Nothing. |
| }, |
| }, |
| { // ... * -1d = -... |
| { |
| new ConstantInstruction(InstructionConstants.OP_LDC2_W, D_M1), |
| new SimpleInstruction(InstructionConstants.OP_DMUL), |
| },{ |
| new SimpleInstruction(InstructionConstants.OP_DNEG), |
| }, |
| }, |
| // { // ... * 0d = 0d (or NaN) |
| // { |
| // new SimpleInstruction(InstructionConstants.OP_DCONST_0), |
| // new SimpleInstruction(InstructionConstants.OP_DMUL), |
| // },{ |
| // new SimpleInstruction(InstructionConstants.OP_POP2), |
| // new SimpleInstruction(InstructionConstants.OP_DCONST_0), |
| // }, |
| // }, |
| { // ... * 1d = ... |
| { |
| new SimpleInstruction(InstructionConstants.OP_DCONST_1), |
| new SimpleInstruction(InstructionConstants.OP_DMUL), |
| },{ |
| // Nothing. |
| }, |
| }, |
| { // ... / -1 = -... |
| { |
| new SimpleInstruction(InstructionConstants.OP_ICONST_M1), |
| new SimpleInstruction(InstructionConstants.OP_IDIV), |
| },{ |
| new SimpleInstruction(InstructionConstants.OP_INEG), |
| }, |
| }, |
| { // ... / 1 = ... |
| { |
| new SimpleInstruction(InstructionConstants.OP_ICONST_1), |
| new SimpleInstruction(InstructionConstants.OP_IDIV), |
| },{ |
| // Nothing. |
| }, |
| }, |
| // Not valid for negative values. |
| // { // ... / 2 = ... >> 1 |
| // { |
| // new SimpleInstruction(InstructionConstants.OP_ICONST_2), |
| // new SimpleInstruction(InstructionConstants.OP_IDIV), |
| // },{ |
| // new SimpleInstruction(InstructionConstants.OP_ICONST_1), |
| // new SimpleInstruction(InstructionConstants.OP_ISHR), |
| // }, |
| // }, |
| // { // ... / 4 = ... >> 2 |
| // { |
| // new SimpleInstruction(InstructionConstants.OP_ICONST_4), |
| // new SimpleInstruction(InstructionConstants.OP_IDIV), |
| // },{ |
| // new SimpleInstruction(InstructionConstants.OP_ICONST_2), |
| // new SimpleInstruction(InstructionConstants.OP_ISHR), |
| // }, |
| // }, |
| // { // ... / 8 = ... >> 3 |
| // { |
| // new SimpleInstruction(InstructionConstants.OP_BIPUSH, 8), |
| // new SimpleInstruction(InstructionConstants.OP_IDIV), |
| // },{ |
| // new SimpleInstruction(InstructionConstants.OP_ICONST_3), |
| // new SimpleInstruction(InstructionConstants.OP_ISHR), |
| // }, |
| // }, |
| // { // ... / 16 = ... >> 4 |
| // { |
| // new SimpleInstruction(InstructionConstants.OP_BIPUSH, 16), |
| // new SimpleInstruction(InstructionConstants.OP_IDIV), |
| // },{ |
| // new SimpleInstruction(InstructionConstants.OP_BIPUSH, 4), |
| // new SimpleInstruction(InstructionConstants.OP_ISHR), |
| // }, |
| // }, |
| // { // ... / 32 = ... >> 5 |
| // { |
| // new SimpleInstruction(InstructionConstants.OP_BIPUSH, 32), |
| // new SimpleInstruction(InstructionConstants.OP_IDIV), |
| // },{ |
| // new SimpleInstruction(InstructionConstants.OP_BIPUSH, 5), |
| // new SimpleInstruction(InstructionConstants.OP_ISHR), |
| // }, |
| // }, |
| // { // ... / 64 = ... >> 6 |
| // { |
| // new SimpleInstruction(InstructionConstants.OP_BIPUSH, 64), |
| // new SimpleInstruction(InstructionConstants.OP_IDIV), |
| // },{ |
| // new SimpleInstruction(InstructionConstants.OP_BIPUSH, 6), |
| // new SimpleInstruction(InstructionConstants.OP_ISHR), |
| // }, |
| // }, |
| // { // ... / 128 = ... >> 7 |
| // { |
| // new SimpleInstruction(InstructionConstants.OP_SIPUSH, 128), |
| // new SimpleInstruction(InstructionConstants.OP_IDIV), |
| // },{ |
| // new SimpleInstruction(InstructionConstants.OP_BIPUSH, 7), |
| // new SimpleInstruction(InstructionConstants.OP_ISHR), |
| // }, |
| // }, |
| // { // ... / 256 = ... >> 8 |
| // { |
| // new SimpleInstruction(InstructionConstants.OP_SIPUSH, 256), |
| // new SimpleInstruction(InstructionConstants.OP_IDIV), |
| // },{ |
| // new SimpleInstruction(InstructionConstants.OP_BIPUSH, 8), |
| // new SimpleInstruction(InstructionConstants.OP_ISHR), |
| // }, |
| // }, |
| // { // ... / 512 = ... >> 9 |
| // { |
| // new SimpleInstruction(InstructionConstants.OP_SIPUSH, 512), |
| // new SimpleInstruction(InstructionConstants.OP_IDIV), |
| // },{ |
| // new SimpleInstruction(InstructionConstants.OP_BIPUSH, 9), |
| // new SimpleInstruction(InstructionConstants.OP_ISHR), |
| // }, |
| // }, |
| // { // ... / 1024 = ... >> 10 |
| // { |
| // new SimpleInstruction(InstructionConstants.OP_SIPUSH, 1024), |
| // new SimpleInstruction(InstructionConstants.OP_IDIV), |
| // },{ |
| // new SimpleInstruction(InstructionConstants.OP_BIPUSH, 10), |
| // new SimpleInstruction(InstructionConstants.OP_ISHR), |
| // }, |
| // }, |
| // { // ... / 2048 = ... >> 11 |
| // { |
| // new SimpleInstruction(InstructionConstants.OP_SIPUSH, 2048), |
| // new SimpleInstruction(InstructionConstants.OP_IDIV), |
| // },{ |
| // new SimpleInstruction(InstructionConstants.OP_BIPUSH, 11), |
| // new SimpleInstruction(InstructionConstants.OP_ISHR), |
| // }, |
| // }, |
| // { // ... / 4096 = ... >> 12 |
| // { |
| // new SimpleInstruction(InstructionConstants.OP_SIPUSH, 4096), |
| // new SimpleInstruction(InstructionConstants.OP_IDIV), |
| // },{ |
| // new SimpleInstruction(InstructionConstants.OP_BIPUSH, 12), |
| // new SimpleInstruction(InstructionConstants.OP_ISHR), |
| // }, |
| // }, |
| // { // ... / 8192 = ... >> 13 |
| // { |
| // new SimpleInstruction(InstructionConstants.OP_SIPUSH, 8192), |
| // new SimpleInstruction(InstructionConstants.OP_IDIV), |
| // },{ |
| // new SimpleInstruction(InstructionConstants.OP_BIPUSH, 13), |
| // new SimpleInstruction(InstructionConstants.OP_ISHR), |
| // }, |
| // }, |
| // { // ... / 16384 = ... >> 14 |
| // { |
| // new SimpleInstruction(InstructionConstants.OP_SIPUSH, 16384), |
| // new SimpleInstruction(InstructionConstants.OP_IDIV), |
| // },{ |
| // new SimpleInstruction(InstructionConstants.OP_BIPUSH, 14), |
| // new SimpleInstruction(InstructionConstants.OP_ISHR), |
| // }, |
| // }, |
| // { // ... / 32768 = ... >> 15 |
| // { |
| // new ConstantInstruction(InstructionConstants.OP_LDC, I_32768), |
| // new SimpleInstruction(InstructionConstants.OP_IDIV), |
| // },{ |
| // new SimpleInstruction(InstructionConstants.OP_BIPUSH, 15), |
| // new SimpleInstruction(InstructionConstants.OP_ISHR), |
| // }, |
| // }, |
| // { // ... / 65536 = ... >> 16 |
| // { |
| // new ConstantInstruction(InstructionConstants.OP_LDC, I_65536), |
| // new SimpleInstruction(InstructionConstants.OP_IDIV), |
| // },{ |
| // new SimpleInstruction(InstructionConstants.OP_BIPUSH, 16), |
| // new SimpleInstruction(InstructionConstants.OP_ISHR), |
| // }, |
| // }, |
| // { // ... / 16777216 = ... >> 24 |
| // { |
| // new ConstantInstruction(InstructionConstants.OP_LDC, I_16777216), |
| // new SimpleInstruction(InstructionConstants.OP_IDIV), |
| // },{ |
| // new SimpleInstruction(InstructionConstants.OP_BIPUSH, 24), |
| // new SimpleInstruction(InstructionConstants.OP_ISHR), |
| // }, |
| // }, |
| { // ... / -1L = -... |
| { |
| new ConstantInstruction(InstructionConstants.OP_LDC2_W, L_M1), |
| new SimpleInstruction(InstructionConstants.OP_LDIV), |
| },{ |
| new SimpleInstruction(InstructionConstants.OP_LNEG), |
| }, |
| }, |
| { // ... / 1L = ... |
| { |
| new SimpleInstruction(InstructionConstants.OP_LCONST_1), |
| new SimpleInstruction(InstructionConstants.OP_LDIV), |
| },{ |
| // Nothing. |
| }, |
| }, |
| // Not valid for negative values. |
| // { // ... / 2L = ... >> 1 |
| // { |
| // new ConstantInstruction(InstructionConstants.OP_LDC2_W, L_2), |
| // new SimpleInstruction(InstructionConstants.OP_LDIV), |
| // },{ |
| // new SimpleInstruction(InstructionConstants.OP_ICONST_1), |
| // new SimpleInstruction(InstructionConstants.OP_LSHR), |
| // }, |
| // }, |
| // { // ... / 4L = ... >> 2 |
| // { |
| // new ConstantInstruction(InstructionConstants.OP_LDC2_W, L_4), |
| // new SimpleInstruction(InstructionConstants.OP_LDIV), |
| // },{ |
| // new SimpleInstruction(InstructionConstants.OP_ICONST_2), |
| // new SimpleInstruction(InstructionConstants.OP_LSHR), |
| // }, |
| // }, |
| // { // ... / 8L = ... >> 3 |
| // { |
| // new ConstantInstruction(InstructionConstants.OP_LDC2_W, L_8), |
| // new SimpleInstruction(InstructionConstants.OP_LDIV), |
| // },{ |
| // new SimpleInstruction(InstructionConstants.OP_ICONST_3), |
| // new SimpleInstruction(InstructionConstants.OP_LSHR), |
| // }, |
| // }, |
| // { // ... / 16L = ... >> 4 |
| // { |
| // new ConstantInstruction(InstructionConstants.OP_LDC2_W, L_16), |
| // new SimpleInstruction(InstructionConstants.OP_LDIV), |
| // },{ |
| // new SimpleInstruction(InstructionConstants.OP_BIPUSH, 4), |
| // new SimpleInstruction(InstructionConstants.OP_LSHR), |
| // }, |
| // }, |
| // { // ... / 32L = ... >> 5 |
| // { |
| // new ConstantInstruction(InstructionConstants.OP_LDC2_W, L_32), |
| // new SimpleInstruction(InstructionConstants.OP_LDIV), |
| // },{ |
| // new SimpleInstruction(InstructionConstants.OP_BIPUSH, 5), |
| // new SimpleInstruction(InstructionConstants.OP_LSHR), |
| // }, |
| // }, |
| // { // ... / 64L = ... >> 6 |
| // { |
| // new ConstantInstruction(InstructionConstants.OP_LDC2_W, L_64), |
| // new SimpleInstruction(InstructionConstants.OP_LDIV), |
| // },{ |
| // new SimpleInstruction(InstructionConstants.OP_BIPUSH, 6), |
| // new SimpleInstruction(InstructionConstants.OP_LSHR), |
| // }, |
| // }, |
| // { // ... / 128L = ... >> 7 |
| // { |
| // new ConstantInstruction(InstructionConstants.OP_LDC2_W, L_128), |
| // new SimpleInstruction(InstructionConstants.OP_LDIV), |
| // },{ |
| // new SimpleInstruction(InstructionConstants.OP_BIPUSH, 7), |
| // new SimpleInstruction(InstructionConstants.OP_LSHR), |
| // }, |
| // }, |
| // { // ... / 256L = ... >> 8 |
| // { |
| // new ConstantInstruction(InstructionConstants.OP_LDC2_W, L_256), |
| // new SimpleInstruction(InstructionConstants.OP_LDIV), |
| // },{ |
| // new SimpleInstruction(InstructionConstants.OP_BIPUSH, 8), |
| // new SimpleInstruction(InstructionConstants.OP_LSHR), |
| // }, |
| // }, |
| // { // ... / 512L = ... >> 9 |
| // { |
| // new ConstantInstruction(InstructionConstants.OP_LDC2_W, L_512), |
| // new SimpleInstruction(InstructionConstants.OP_LDIV), |
| // },{ |
| // new SimpleInstruction(InstructionConstants.OP_BIPUSH, 9), |
| // new SimpleInstruction(InstructionConstants.OP_LSHR), |
| // }, |
| // }, |
| // { // ... / 1024L = ... >> 10 |
| // { |
| // new ConstantInstruction(InstructionConstants.OP_LDC2_W, L_1024), |
| // new SimpleInstruction(InstructionConstants.OP_LDIV), |
| // },{ |
| // new SimpleInstruction(InstructionConstants.OP_BIPUSH, 10), |
| // new SimpleInstruction(InstructionConstants.OP_LSHR), |
| // }, |
| // }, |
| // { // ... / 2048L = ... >> 11 |
| // { |
| // new ConstantInstruction(InstructionConstants.OP_LDC2_W, L_2048), |
| // new SimpleInstruction(InstructionConstants.OP_LDIV), |
| // },{ |
| // new SimpleInstruction(InstructionConstants.OP_BIPUSH, 11), |
| // new SimpleInstruction(InstructionConstants.OP_LSHR), |
| // }, |
| // }, |
| // { // ... / 4096L = ... >> 12 |
| // { |
| // new ConstantInstruction(InstructionConstants.OP_LDC2_W, L_4096), |
| // new SimpleInstruction(InstructionConstants.OP_LDIV), |
| // },{ |
| // new SimpleInstruction(InstructionConstants.OP_BIPUSH, 12), |
| // new SimpleInstruction(InstructionConstants.OP_LSHR), |
| // }, |
| // }, |
| // { // ... / 8192L = ... >> 13 |
| // { |
| // new ConstantInstruction(InstructionConstants.OP_LDC2_W, L_8192), |
| // new SimpleInstruction(InstructionConstants.OP_LDIV), |
| // },{ |
| // new SimpleInstruction(InstructionConstants.OP_BIPUSH, 13), |
| // new SimpleInstruction(InstructionConstants.OP_LSHR), |
| // }, |
| // }, |
| // { // ... / 16384L = ... >> 14 |
| // { |
| // new ConstantInstruction(InstructionConstants.OP_LDC2_W, L_16384), |
| // new SimpleInstruction(InstructionConstants.OP_LDIV), |
| // },{ |
| // new SimpleInstruction(InstructionConstants.OP_BIPUSH, 14), |
| // new SimpleInstruction(InstructionConstants.OP_LSHR), |
| // }, |
| // }, |
| // { // ... / 32768L = ... >> 15 |
| // { |
| // new ConstantInstruction(InstructionConstants.OP_LDC2_W, L_32768), |
| // new SimpleInstruction(InstructionConstants.OP_LDIV), |
| // },{ |
| // new SimpleInstruction(InstructionConstants.OP_BIPUSH, 15), |
| // new SimpleInstruction(InstructionConstants.OP_LSHR), |
| // }, |
| // }, |
| // { // ... / 65536LL = ... >> 16 |
| // { |
| // new ConstantInstruction(InstructionConstants.OP_LDC2_W, L_65536), |
| // new SimpleInstruction(InstructionConstants.OP_LDIV), |
| // },{ |
| // new SimpleInstruction(InstructionConstants.OP_BIPUSH, 16), |
| // new SimpleInstruction(InstructionConstants.OP_LSHR), |
| // }, |
| // }, |
| // { // ... / 16777216L = ... >> 24 |
| // { |
| // new ConstantInstruction(InstructionConstants.OP_LDC2_W, L_16777216), |
| // new SimpleInstruction(InstructionConstants.OP_LDIV), |
| // },{ |
| // new SimpleInstruction(InstructionConstants.OP_BIPUSH, 24), |
| // new SimpleInstruction(InstructionConstants.OP_LSHR), |
| // }, |
| // }, |
| // { // ... / 4294967296L = ... >> 32 |
| // { |
| // new ConstantInstruction(InstructionConstants.OP_LDC2_W, L_4294967296), |
| // new SimpleInstruction(InstructionConstants.OP_LDIV), |
| // },{ |
| // new SimpleInstruction(InstructionConstants.OP_BIPUSH, 32), |
| // new SimpleInstruction(InstructionConstants.OP_LSHR), |
| // }, |
| // }, |
| { // ... / -1f = -... |
| { |
| new ConstantInstruction(InstructionConstants.OP_LDC, F_M1), |
| new SimpleInstruction(InstructionConstants.OP_FDIV), |
| },{ |
| new SimpleInstruction(InstructionConstants.OP_FNEG), |
| }, |
| }, |
| { // ... / 1f = ... |
| { |
| new SimpleInstruction(InstructionConstants.OP_FCONST_1), |
| new SimpleInstruction(InstructionConstants.OP_FDIV), |
| },{ |
| // Nothing. |
| }, |
| }, |
| { // ... / -1d = -... |
| { |
| new ConstantInstruction(InstructionConstants.OP_LDC2_W, D_M1), |
| new SimpleInstruction(InstructionConstants.OP_DDIV), |
| },{ |
| new SimpleInstruction(InstructionConstants.OP_DNEG), |
| }, |
| }, |
| { // ... / 1d = ... |
| { |
| new SimpleInstruction(InstructionConstants.OP_DCONST_1), |
| new SimpleInstruction(InstructionConstants.OP_DDIV), |
| },{ |
| // Nothing. |
| }, |
| }, |
| { // ... % 1 = 0 |
| { |
| new SimpleInstruction(InstructionConstants.OP_ICONST_1), |
| new SimpleInstruction(InstructionConstants.OP_IREM), |
| },{ |
| new SimpleInstruction(InstructionConstants.OP_POP), |
| new SimpleInstruction(InstructionConstants.OP_ICONST_0), |
| }, |
| }, |
| // { // ... % 2 = ... & 0x1 |
| // { |
| // new SimpleInstruction(InstructionConstants.OP_ICONST_2), |
| // new SimpleInstruction(InstructionConstants.OP_IREM), |
| // },{ |
| // new SimpleInstruction(InstructionConstants.OP_ICONST_1), |
| // new SimpleInstruction(InstructionConstants.OP_IAND), |
| // }, |
| // }, |
| // { // ... % 4 = ... & 0x3 |
| // { |
| // new SimpleInstruction(InstructionConstants.OP_ICONST_4), |
| // new SimpleInstruction(InstructionConstants.OP_IREM), |
| // },{ |
| // new SimpleInstruction(InstructionConstants.OP_ICONST_3), |
| // new SimpleInstruction(InstructionConstants.OP_IAND), |
| // }, |
| // }, |
| // { // ... % 8 = ... & 0x07 |
| // { |
| // new SimpleInstruction(InstructionConstants.OP_BIPUSH, 8), |
| // new SimpleInstruction(InstructionConstants.OP_IREM), |
| // },{ |
| // new SimpleInstruction(InstructionConstants.OP_BIPUSH, 0x07), |
| // new SimpleInstruction(InstructionConstants.OP_IAND), |
| // }, |
| // }, |
| // { // ... % 16 = ... & 0x0f |
| // { |
| // new SimpleInstruction(InstructionConstants.OP_BIPUSH, 16), |
| // new SimpleInstruction(InstructionConstants.OP_IREM), |
| // },{ |
| // new SimpleInstruction(InstructionConstants.OP_BIPUSH, 0x0f), |
| // new SimpleInstruction(InstructionConstants.OP_IAND), |
| // }, |
| // }, |
| // { // ... % 32 = ... & 0x1f |
| // { |
| // new SimpleInstruction(InstructionConstants.OP_BIPUSH, 32), |
| // new SimpleInstruction(InstructionConstants.OP_IREM), |
| // },{ |
| // new SimpleInstruction(InstructionConstants.OP_BIPUSH, 0x1f), |
| // new SimpleInstruction(InstructionConstants.OP_IAND), |
| // }, |
| // }, |
| // { // ... % 64 = ... & 0x3f |
| // { |
| // new SimpleInstruction(InstructionConstants.OP_BIPUSH, 64), |
| // new SimpleInstruction(InstructionConstants.OP_IREM), |
| // },{ |
| // new SimpleInstruction(InstructionConstants.OP_BIPUSH, 0x3f), |
| // new SimpleInstruction(InstructionConstants.OP_IAND), |
| // }, |
| // }, |
| // { // ... % 128 = ... & 0x7f |
| // { |
| // new SimpleInstruction(InstructionConstants.OP_SIPUSH, 128), |
| // new SimpleInstruction(InstructionConstants.OP_IREM), |
| // },{ |
| // new SimpleInstruction(InstructionConstants.OP_BIPUSH, 0x7f), |
| // new SimpleInstruction(InstructionConstants.OP_IAND), |
| // }, |
| // }, |
| // { // ... % 256 = ... & 0x00ff |
| // { |
| // new SimpleInstruction(InstructionConstants.OP_SIPUSH, 256), |
| // new SimpleInstruction(InstructionConstants.OP_IREM), |
| // },{ |
| // new SimpleInstruction(InstructionConstants.OP_SIPUSH, 0x00ff), |
| // new SimpleInstruction(InstructionConstants.OP_IAND), |
| // }, |
| // }, |
| // { // ... % 512 = ... & 0x01ff |
| // { |
| // new SimpleInstruction(InstructionConstants.OP_SIPUSH, 512), |
| // new SimpleInstruction(InstructionConstants.OP_IREM), |
| // },{ |
| // new SimpleInstruction(InstructionConstants.OP_SIPUSH, 0x01ff), |
| // new SimpleInstruction(InstructionConstants.OP_IAND), |
| // }, |
| // }, |
| // { // ... % 1024 = ... & 0x03ff |
| // { |
| // new SimpleInstruction(InstructionConstants.OP_SIPUSH, 1024), |
| // new SimpleInstruction(InstructionConstants.OP_IREM), |
| // },{ |
| // new SimpleInstruction(InstructionConstants.OP_SIPUSH, 0x03ff), |
| // new SimpleInstruction(InstructionConstants.OP_IAND), |
| // }, |
| // }, |
| // { // ... % 2048 = ... & 0x07ff |
| // { |
| // new SimpleInstruction(InstructionConstants.OP_SIPUSH, 2048), |
| // new SimpleInstruction(InstructionConstants.OP_IREM), |
| // },{ |
| // new SimpleInstruction(InstructionConstants.OP_SIPUSH, 0x07ff), |
| // new SimpleInstruction(InstructionConstants.OP_IAND), |
| // }, |
| // }, |
| // { // ... % 4096 = ... & 0x0fff |
| // { |
| // new SimpleInstruction(InstructionConstants.OP_SIPUSH, 4096), |
| // new SimpleInstruction(InstructionConstants.OP_IREM), |
| // },{ |
| // new SimpleInstruction(InstructionConstants.OP_SIPUSH, 0x0fff), |
| // new SimpleInstruction(InstructionConstants.OP_IAND), |
| // }, |
| // }, |
| // { // ... % 8192 = ... & 0x1fff |
| // { |
| // new SimpleInstruction(InstructionConstants.OP_SIPUSH, 8192), |
| // new SimpleInstruction(InstructionConstants.OP_IREM), |
| // },{ |
| // new SimpleInstruction(InstructionConstants.OP_SIPUSH, 0x1fff), |
| // new SimpleInstruction(InstructionConstants.OP_IAND), |
| // }, |
| // }, |
| // { // ... % 16384 = ... & 0x3fff |
| // { |
| // new SimpleInstruction(InstructionConstants.OP_SIPUSH, 16384), |
| // new SimpleInstruction(InstructionConstants.OP_IREM), |
| // },{ |
| // new SimpleInstruction(InstructionConstants.OP_SIPUSH, 0x3fff), |
| // new SimpleInstruction(InstructionConstants.OP_IAND), |
| // }, |
| // }, |
| { // ... % 1L = 0L |
| { |
| new SimpleInstruction(InstructionConstants.OP_LCONST_1), |
| new SimpleInstruction(InstructionConstants.OP_LREM), |
| },{ |
| new SimpleInstruction(InstructionConstants.OP_POP2), |
| new SimpleInstruction(InstructionConstants.OP_LCONST_0), |
| }, |
| }, |
| // { // ... % 1f = 0f |
| // { |
| // new SimpleInstruction(InstructionConstants.OP_FCONST_1), |
| // new SimpleInstruction(InstructionConstants.OP_FREM), |
| // },{ |
| // new SimpleInstruction(InstructionConstants.OP_POP), |
| // new SimpleInstruction(InstructionConstants.OP_FCONST_0), |
| // }, |
| // }, |
| // { // ... % 1d = 0d |
| // { |
| // new SimpleInstruction(InstructionConstants.OP_DCONST_1), |
| // new SimpleInstruction(InstructionConstants.OP_DREM), |
| // },{ |
| // new SimpleInstruction(InstructionConstants.OP_POP2), |
| // new SimpleInstruction(InstructionConstants.OP_DCONST_0), |
| // }, |
| // }, |
| { // -(-...) = ... |
| { |
| new SimpleInstruction(InstructionConstants.OP_INEG), |
| new SimpleInstruction(InstructionConstants.OP_INEG), |
| },{ |
| // Nothing. |
| }, |
| }, |
| { // -(-...) = ... |
| { |
| new SimpleInstruction(InstructionConstants.OP_LNEG), |
| new SimpleInstruction(InstructionConstants.OP_LNEG), |
| },{ |
| // Nothing. |
| }, |
| }, |
| { // -(-...) = ... |
| { |
| new SimpleInstruction(InstructionConstants.OP_FNEG), |
| new SimpleInstruction(InstructionConstants.OP_FNEG), |
| },{ |
| // Nothing. |
| }, |
| }, |
| { // -(-...) = ... |
| { |
| new SimpleInstruction(InstructionConstants.OP_DNEG), |
| new SimpleInstruction(InstructionConstants.OP_DNEG), |
| },{ |
| // Nothing. |
| }, |
| }, |
| { // +(-...) = -... |
| { |
| new SimpleInstruction(InstructionConstants.OP_INEG), |
| new SimpleInstruction(InstructionConstants.OP_IADD), |
| },{ |
| new SimpleInstruction(InstructionConstants.OP_ISUB), |
| }, |
| }, |
| { // +(-...) = -... |
| { |
| new SimpleInstruction(InstructionConstants.OP_LNEG), |
| new SimpleInstruction(InstructionConstants.OP_LADD), |
| },{ |
| new SimpleInstruction(InstructionConstants.OP_LSUB), |
| }, |
| }, |
| { // +(-...) = -... |
| { |
| new SimpleInstruction(InstructionConstants.OP_FNEG), |
| new SimpleInstruction(InstructionConstants.OP_FADD), |
| },{ |
| new SimpleInstruction(InstructionConstants.OP_FSUB), |
| }, |
| }, |
| { // +(-...) = -... |
| { |
| new SimpleInstruction(InstructionConstants.OP_DNEG), |
| new SimpleInstruction(InstructionConstants.OP_DADD), |
| },{ |
| new SimpleInstruction(InstructionConstants.OP_DSUB), |
| }, |
| }, |
| { // ... << 0 = ... |
| { |
| new SimpleInstruction(InstructionConstants.OP_ICONST_0), |
| new SimpleInstruction(InstructionConstants.OP_ISHL), |
| },{ |
| // Nothing. |
| }, |
| }, |
| { // ... << 0 = ... |
| { |
| new SimpleInstruction(InstructionConstants.OP_ICONST_0), |
| new SimpleInstruction(InstructionConstants.OP_LSHL), |
| },{ |
| // Nothing. |
| }, |
| }, |
| { // ... >> 0 = ... |
| { |
| new SimpleInstruction(InstructionConstants.OP_ICONST_0), |
| new SimpleInstruction(InstructionConstants.OP_ISHR), |
| },{ |
| // Nothing. |
| }, |
| }, |
| { // ... >> 0 = ... |
| { |
| new SimpleInstruction(InstructionConstants.OP_ICONST_0), |
| new SimpleInstruction(InstructionConstants.OP_LSHR), |
| },{ |
| // Nothing. |
| }, |
| }, |
| { // ... >>> 0 = ... |
| { |
| new SimpleInstruction(InstructionConstants.OP_ICONST_0), |
| new SimpleInstruction(InstructionConstants.OP_IUSHR), |
| },{ |
| // Nothing. |
| }, |
| }, |
| { // ... >>> 0 = ... |
| { |
| new SimpleInstruction(InstructionConstants.OP_ICONST_0), |
| new SimpleInstruction(InstructionConstants.OP_LUSHR), |
| },{ |
| // Nothing. |
| }, |
| }, |
| { // ... & -1 = ... |
| { |
| new SimpleInstruction(InstructionConstants.OP_ICONST_M1), |
| new SimpleInstruction(InstructionConstants.OP_IAND), |
| },{ |
| // Nothing. |
| }, |
| }, |
| { // ... & 0 = 0 |
| { |
| new SimpleInstruction(InstructionConstants.OP_ICONST_0), |
| new SimpleInstruction(InstructionConstants.OP_IAND), |
| },{ |
| new SimpleInstruction(InstructionConstants.OP_POP), |
| new SimpleInstruction(InstructionConstants.OP_ICONST_0), |
| }, |
| }, |
| { // ... & -1L = ... |
| { |
| new ConstantInstruction(InstructionConstants.OP_LDC2_W, L_M1), |
| new SimpleInstruction(InstructionConstants.OP_LAND), |
| },{ |
| // Nothing. |
| }, |
| }, |
| { // ... & 0L = 0L |
| { |
| new SimpleInstruction(InstructionConstants.OP_LCONST_0), |
| new SimpleInstruction(InstructionConstants.OP_LAND), |
| },{ |
| new SimpleInstruction(InstructionConstants.OP_POP2), |
| new SimpleInstruction(InstructionConstants.OP_LCONST_0), |
| }, |
| }, |
| { // ... | -1 = -1 |
| { |
| new SimpleInstruction(InstructionConstants.OP_ICONST_M1), |
| new SimpleInstruction(InstructionConstants.OP_IOR), |
| },{ |
| new SimpleInstruction(InstructionConstants.OP_POP), |
| new SimpleInstruction(InstructionConstants.OP_ICONST_M1), |
| }, |
| }, |
| { // ... | 0 = ... |
| { |
| new SimpleInstruction(InstructionConstants.OP_ICONST_0), |
| new SimpleInstruction(InstructionConstants.OP_IOR), |
| },{ |
| // Nothing. |
| }, |
| }, |
| { // ... | -1L = -1L |
| { |
| new ConstantInstruction(InstructionConstants.OP_LDC2_W, L_M1), |
| new SimpleInstruction(InstructionConstants.OP_LAND), |
| },{ |
| new SimpleInstruction(InstructionConstants.OP_POP2), |
| new ConstantInstruction(InstructionConstants.OP_LDC2_W, L_M1), |
| }, |
| }, |
| { // ... | 0L = ... |
| { |
| new SimpleInstruction(InstructionConstants.OP_LCONST_0), |
| new SimpleInstruction(InstructionConstants.OP_LOR), |
| },{ |
| // Nothing. |
| }, |
| }, |
| { // ... ^ 0 = ... |
| { |
| new SimpleInstruction(InstructionConstants.OP_ICONST_0), |
| new SimpleInstruction(InstructionConstants.OP_IXOR), |
| },{ |
| // Nothing. |
| }, |
| }, |
| { // ... ^ 0L = ... |
| { |
| new SimpleInstruction(InstructionConstants.OP_LCONST_0), |
| new SimpleInstruction(InstructionConstants.OP_LXOR), |
| },{ |
| // Nothing. |
| }, |
| }, |
| { // (... & 0x0000ff00) >> 8 = (... >> 8) & 0xff |
| { |
| new ConstantInstruction(InstructionConstants.OP_LDC, I_0x0000ff00), |
| new SimpleInstruction(InstructionConstants.OP_IAND), |
| new SimpleInstruction(InstructionConstants.OP_BIPUSH, 8), |
| new SimpleInstruction(InstructionConstants.OP_ISHR), |
| },{ |
| new SimpleInstruction(InstructionConstants.OP_BIPUSH, 8), |
| new SimpleInstruction(InstructionConstants.OP_ISHR), |
| new SimpleInstruction(InstructionConstants.OP_SIPUSH, 0xff), |
| new SimpleInstruction(InstructionConstants.OP_IAND), |
| }, |
| }, |
| { // (... & 0x0000ff00) >>> 8 = (... >>> 8) & 0xff |
| { |
| new ConstantInstruction(InstructionConstants.OP_LDC, I_0x0000ff00), |
| new SimpleInstruction(InstructionConstants.OP_IAND), |
| new SimpleInstruction(InstructionConstants.OP_BIPUSH, 8), |
| new SimpleInstruction(InstructionConstants.OP_IUSHR), |
| },{ |
| new SimpleInstruction(InstructionConstants.OP_BIPUSH, 8), |
| new SimpleInstruction(InstructionConstants.OP_IUSHR), |
| new SimpleInstruction(InstructionConstants.OP_SIPUSH, 0xff), |
| new SimpleInstruction(InstructionConstants.OP_IAND), |
| }, |
| }, |
| { // (... & 0x00ff0000) >> 16 = (... >> 16) & 0xff |
| { |
| new ConstantInstruction(InstructionConstants.OP_LDC, I_0x00ff0000), |
| new SimpleInstruction(InstructionConstants.OP_IAND), |
| new SimpleInstruction(InstructionConstants.OP_BIPUSH, 16), |
| new SimpleInstruction(InstructionConstants.OP_ISHR), |
| },{ |
| new SimpleInstruction(InstructionConstants.OP_BIPUSH, 16), |
| new SimpleInstruction(InstructionConstants.OP_ISHR), |
| new SimpleInstruction(InstructionConstants.OP_SIPUSH, 0xff), |
| new SimpleInstruction(InstructionConstants.OP_IAND), |
| }, |
| }, |
| { // (... & 0x00ff0000) >>> 16 = (... >>> 16) & 0xff |
| { |
| new ConstantInstruction(InstructionConstants.OP_LDC, I_0x00ff0000), |
| new SimpleInstruction(InstructionConstants.OP_IAND), |
| new SimpleInstruction(InstructionConstants.OP_BIPUSH, 16), |
| new SimpleInstruction(InstructionConstants.OP_IUSHR), |
| },{ |
| new SimpleInstruction(InstructionConstants.OP_BIPUSH, 16), |
| new SimpleInstruction(InstructionConstants.OP_IUSHR), |
| new SimpleInstruction(InstructionConstants.OP_SIPUSH, 0xff), |
| new SimpleInstruction(InstructionConstants.OP_IAND), |
| }, |
| }, |
| { // (... & 0xff000000) >> 24 = ... >> 24 |
| { |
| new ConstantInstruction(InstructionConstants.OP_LDC, I_0xff000000), |
| new SimpleInstruction(InstructionConstants.OP_IAND), |
| new SimpleInstruction(InstructionConstants.OP_BIPUSH, 24), |
| new SimpleInstruction(InstructionConstants.OP_ISHR), |
| },{ |
| new SimpleInstruction(InstructionConstants.OP_BIPUSH, 24), |
| new SimpleInstruction(InstructionConstants.OP_ISHR), |
| }, |
| }, |
| { // (... & 0xffff0000) >> 16 = ... >> 16 |
| { |
| new ConstantInstruction(InstructionConstants.OP_LDC, I_0xffff0000), |
| new SimpleInstruction(InstructionConstants.OP_IAND), |
| new SimpleInstruction(InstructionConstants.OP_BIPUSH, 16), |
| new SimpleInstruction(InstructionConstants.OP_ISHR), |
| },{ |
| new SimpleInstruction(InstructionConstants.OP_BIPUSH, 16), |
| new SimpleInstruction(InstructionConstants.OP_ISHR), |
| }, |
| }, |
| { // (... & 0xffff0000) >>> 16 = ... >>> 16 |
| { |
| new ConstantInstruction(InstructionConstants.OP_LDC, I_0xffff0000), |
| new SimpleInstruction(InstructionConstants.OP_IAND), |
| new SimpleInstruction(InstructionConstants.OP_BIPUSH, 16), |
| new SimpleInstruction(InstructionConstants.OP_IUSHR), |
| },{ |
| new SimpleInstruction(InstructionConstants.OP_BIPUSH, 16), |
| new SimpleInstruction(InstructionConstants.OP_IUSHR), |
| }, |
| }, |
| { // (... >> 24) & 0xff = ... >>> 24 |
| { |
| new SimpleInstruction(InstructionConstants.OP_BIPUSH, 24), |
| new SimpleInstruction(InstructionConstants.OP_ISHR), |
| new SimpleInstruction(InstructionConstants.OP_SIPUSH, 0xff), |
| new SimpleInstruction(InstructionConstants.OP_IAND), |
| },{ |
| new SimpleInstruction(InstructionConstants.OP_BIPUSH, 24), |
| new SimpleInstruction(InstructionConstants.OP_IUSHR), |
| }, |
| }, |
| { // (... >>> 24) & 0xff = ... >>> 24 |
| { |
| new SimpleInstruction(InstructionConstants.OP_BIPUSH, 24), |
| new SimpleInstruction(InstructionConstants.OP_IUSHR), |
| new SimpleInstruction(InstructionConstants.OP_SIPUSH, 0xff), |
| new SimpleInstruction(InstructionConstants.OP_IAND), |
| },{ |
| new SimpleInstruction(InstructionConstants.OP_BIPUSH, 24), |
| new SimpleInstruction(InstructionConstants.OP_IUSHR), |
| }, |
| }, |
| { // (byte)(... & 0x000000ff) = (byte)... |
| { |
| new SimpleInstruction(InstructionConstants.OP_SIPUSH, 0xff), |
| new SimpleInstruction(InstructionConstants.OP_IAND), |
| new SimpleInstruction(InstructionConstants.OP_I2B), |
| },{ |
| new SimpleInstruction(InstructionConstants.OP_I2B), |
| }, |
| }, |
| { // (char)(... & 0x0000ffff) = (char)... |
| { |
| new ConstantInstruction(InstructionConstants.OP_LDC, I_0x0000ffff), |
| new SimpleInstruction(InstructionConstants.OP_IAND), |
| new SimpleInstruction(InstructionConstants.OP_I2C), |
| },{ |
| new SimpleInstruction(InstructionConstants.OP_I2C), |
| }, |
| }, |
| { // (short)(... & 0x0000ffff) = (short)... |
| { |
| new ConstantInstruction(InstructionConstants.OP_LDC, I_0x0000ffff), |
| new SimpleInstruction(InstructionConstants.OP_IAND), |
| new SimpleInstruction(InstructionConstants.OP_I2S), |
| },{ |
| new SimpleInstruction(InstructionConstants.OP_I2S), |
| }, |
| }, |
| { // (byte)(... >> 24) = ... >> 24 |
| { |
| new SimpleInstruction(InstructionConstants.OP_BIPUSH, 24), |
| new SimpleInstruction(InstructionConstants.OP_ISHR), |
| new SimpleInstruction(InstructionConstants.OP_I2B), |
| },{ |
| new SimpleInstruction(InstructionConstants.OP_BIPUSH, 24), |
| new SimpleInstruction(InstructionConstants.OP_ISHR), |
| }, |
| }, |
| { // (byte)(... >>> 24) = ... >> 24 |
| { |
| new SimpleInstruction(InstructionConstants.OP_BIPUSH, 24), |
| new SimpleInstruction(InstructionConstants.OP_IUSHR), |
| new SimpleInstruction(InstructionConstants.OP_I2B), |
| },{ |
| new SimpleInstruction(InstructionConstants.OP_BIPUSH, 24), |
| new SimpleInstruction(InstructionConstants.OP_ISHR), |
| }, |
| }, |
| { // (char)(... >> 16) = ... >>> 16 |
| { |
| new SimpleInstruction(InstructionConstants.OP_BIPUSH, 16), |
| new SimpleInstruction(InstructionConstants.OP_ISHR), |
| new SimpleInstruction(InstructionConstants.OP_I2C), |
| },{ |
| new SimpleInstruction(InstructionConstants.OP_BIPUSH, 16), |
| new SimpleInstruction(InstructionConstants.OP_IUSHR), |
| }, |
| }, |
| { // (char)(... >>> 16) = ... >>> 16 |
| { |
| new SimpleInstruction(InstructionConstants.OP_BIPUSH, 16), |
| new SimpleInstruction(InstructionConstants.OP_IUSHR), |
| new SimpleInstruction(InstructionConstants.OP_I2C), |
| },{ |
| new SimpleInstruction(InstructionConstants.OP_BIPUSH, 16), |
| new SimpleInstruction(InstructionConstants.OP_IUSHR), |
| }, |
| }, |
| { // (short)(... >> 16) = ... >> 16 |
| { |
| new SimpleInstruction(InstructionConstants.OP_BIPUSH, 16), |
| new SimpleInstruction(InstructionConstants.OP_ISHR), |
| new SimpleInstruction(InstructionConstants.OP_I2S), |
| },{ |
| new SimpleInstruction(InstructionConstants.OP_BIPUSH, 16), |
| new SimpleInstruction(InstructionConstants.OP_ISHR), |
| }, |
| }, |
| { // (short)(... >>> 16) = ... >> 16 |
| { |
| new SimpleInstruction(InstructionConstants.OP_BIPUSH, 16), |
| new SimpleInstruction(InstructionConstants.OP_IUSHR), |
| new SimpleInstruction(InstructionConstants.OP_I2S), |
| },{ |
| new SimpleInstruction(InstructionConstants.OP_BIPUSH, 16), |
| new SimpleInstruction(InstructionConstants.OP_ISHR), |
| }, |
| }, |
| { // ... << 24 >> 24 = (byte)... |
| { |
| new SimpleInstruction(InstructionConstants.OP_BIPUSH, 24), |
| new SimpleInstruction(InstructionConstants.OP_ISHL), |
| new SimpleInstruction(InstructionConstants.OP_BIPUSH, 24), |
| new SimpleInstruction(InstructionConstants.OP_ISHR), |
| },{ |
| new SimpleInstruction(InstructionConstants.OP_I2B), |
| }, |
| }, |
| { // ... << 16 >>> 16 = (char)... |
| { |
| new SimpleInstruction(InstructionConstants.OP_BIPUSH, 16), |
| new SimpleInstruction(InstructionConstants.OP_ISHL), |
| new SimpleInstruction(InstructionConstants.OP_BIPUSH, 16), |
| new SimpleInstruction(InstructionConstants.OP_IUSHR), |
| },{ |
| new SimpleInstruction(InstructionConstants.OP_I2C), |
| }, |
| }, |
| { // ... << 16 >> 16 = (short)... |
| { |
| new SimpleInstruction(InstructionConstants.OP_BIPUSH, 16), |
| new SimpleInstruction(InstructionConstants.OP_ISHL), |
| new SimpleInstruction(InstructionConstants.OP_BIPUSH, 16), |
| new SimpleInstruction(InstructionConstants.OP_ISHR), |
| },{ |
| new SimpleInstruction(InstructionConstants.OP_I2S), |
| }, |
| }, |
| { // ... << 32 >> 32 = (long)(int)... |
| { |
| new SimpleInstruction(InstructionConstants.OP_BIPUSH, 32), |
| new SimpleInstruction(InstructionConstants.OP_LSHL), |
| new SimpleInstruction(InstructionConstants.OP_BIPUSH, 32), |
| new SimpleInstruction(InstructionConstants.OP_LSHR), |
| },{ |
| new SimpleInstruction(InstructionConstants.OP_L2I), |
| new SimpleInstruction(InstructionConstants.OP_I2L), |
| }, |
| }, |
| { // (int)(... & 0x00000000ffffffffL) = (int)... |
| { |
| new ConstantInstruction(InstructionConstants.OP_LDC2_W, L_0x00000000ffffffff), |
| new SimpleInstruction(InstructionConstants.OP_LAND), |
| new SimpleInstruction(InstructionConstants.OP_L2I), |
| },{ |
| new SimpleInstruction(InstructionConstants.OP_L2I), |
| }, |
| }, |
| { // (... & 0xffffffff00000000L) >> 32 = ... >> 32 |
| { |
| new ConstantInstruction(InstructionConstants.OP_LDC2_W, L_0xffffffff00000000), |
| new SimpleInstruction(InstructionConstants.OP_LAND), |
| new SimpleInstruction(InstructionConstants.OP_BIPUSH, 32), |
| new SimpleInstruction(InstructionConstants.OP_LSHR), |
| },{ |
| new SimpleInstruction(InstructionConstants.OP_BIPUSH, 32), |
| new SimpleInstruction(InstructionConstants.OP_LSHR), |
| }, |
| }, |
| { // (... & 0xffffffff00000000L) >>> 32 = ... >>> 32 |
| { |
| new ConstantInstruction(InstructionConstants.OP_LDC2_W, L_0xffffffff00000000), |
| new SimpleInstruction(InstructionConstants.OP_LAND), |
| new SimpleInstruction(InstructionConstants.OP_BIPUSH, 32), |
| new SimpleInstruction(InstructionConstants.OP_LUSHR), |
| },{ |
| new SimpleInstruction(InstructionConstants.OP_BIPUSH, 32), |
| new SimpleInstruction(InstructionConstants.OP_LUSHR), |
| }, |
| }, |
| { // ... += 0 = nothing |
| { |
| new VariableInstruction(InstructionConstants.OP_IINC, X, 0), |
| },{ |
| // Nothing. |
| }, |
| }, |
| }; |
| |
| public static final Instruction[][][] FIELD = new Instruction[][][] |
| { |
| { // getfield/putfield = nothing |
| { |
| new VariableInstruction(InstructionConstants.OP_ALOAD, X), |
| new VariableInstruction(InstructionConstants.OP_ALOAD, X), |
| new ConstantInstruction(InstructionConstants.OP_GETFIELD, Y), |
| new ConstantInstruction(InstructionConstants.OP_PUTFIELD, Y), |
| },{ |
| // Nothing. |
| }, |
| }, |
| // { // putfield_L/putfield_L = pop2_x1/putfield |
| // { |
| // new VariableInstruction(InstructionConstants.OP_ALOAD, X), |
| // // ... |
| // new ConstantInstruction(InstructionConstants.OP_PUTFIELD, FIELD_L), |
| // new VariableInstruction(InstructionConstants.OP_ALOAD, X), |
| // // ... |
| // new ConstantInstruction(InstructionConstants.OP_PUTFIELD, FIELD_L), |
| // },{ |
| // new VariableInstruction(InstructionConstants.OP_ALOAD, X), |
| // // ... |
| // new SimpleInstruction(InstructionConstants.OP_POP2), |
| // // ... |
| // new ConstantInstruction(InstructionConstants.OP_PUTFIELD, FIELD_L), |
| // }, |
| // }, |
| // { // putfield_D/putfield_D = pop2_x1/putfield |
| // { |
| // new VariableInstruction(InstructionConstants.OP_ALOAD, X), |
| // // ... |
| // new ConstantInstruction(InstructionConstants.OP_PUTFIELD, FIELD_D), |
| // new VariableInstruction(InstructionConstants.OP_ALOAD, X), |
| // // ... |
| // new ConstantInstruction(InstructionConstants.OP_PUTFIELD, FIELD_D), |
| // },{ |
| // new VariableInstruction(InstructionConstants.OP_ALOAD, X), |
| // // ... |
| // new SimpleInstruction(InstructionConstants.OP_POP2), |
| // // ... |
| // new ConstantInstruction(InstructionConstants.OP_PUTFIELD, FIELD_D), |
| // }, |
| // }, |
| // { // putfield/putfield = pop_x1/putfield |
| // { |
| // new VariableInstruction(InstructionConstants.OP_ALOAD, X), |
| // // ... |
| // new ConstantInstruction(InstructionConstants.OP_PUTFIELD, Y), |
| // new VariableInstruction(InstructionConstants.OP_ALOAD, X), |
| // // ... |
| // new ConstantInstruction(InstructionConstants.OP_PUTFIELD, Y), |
| // },{ |
| // new VariableInstruction(InstructionConstants.OP_ALOAD, X), |
| // // ... |
| // new SimpleInstruction(InstructionConstants.OP_POP), |
| // // ... |
| // new ConstantInstruction(InstructionConstants.OP_PUTFIELD, Y), |
| // }, |
| // }, |
| // { // putfield_L/getfield_L = dup2_x1/putfield |
| // { |
| // new VariableInstruction(InstructionConstants.OP_ALOAD, X), |
| // // ... |
| // new ConstantInstruction(InstructionConstants.OP_PUTFIELD, FIELD_L), |
| // new VariableInstruction(InstructionConstants.OP_ALOAD, X), |
| // new ConstantInstruction(InstructionConstants.OP_GETFIELD, FIELD_L), |
| // },{ |
| // new VariableInstruction(InstructionConstants.OP_ALOAD, X), |
| // // ... |
| // new SimpleInstruction(InstructionConstants.OP_DUP2_X1), |
| // new ConstantInstruction(InstructionConstants.OP_PUTFIELD, FIELD_L), |
| // }, |
| // }, |
| // { // putfield_D/getfield_D = dup2_x1/putfield |
| // { |
| // new VariableInstruction(InstructionConstants.OP_ALOAD, X), |
| // // ... |
| // new ConstantInstruction(InstructionConstants.OP_PUTFIELD, FIELD_D), |
| // new VariableInstruction(InstructionConstants.OP_ALOAD, X), |
| // new ConstantInstruction(InstructionConstants.OP_GETFIELD, FIELD_D), |
| // },{ |
| // new VariableInstruction(InstructionConstants.OP_ALOAD, X), |
| // // ... |
| // new SimpleInstruction(InstructionConstants.OP_DUP2_X1), |
| // new ConstantInstruction(InstructionConstants.OP_PUTFIELD, FIELD_D), |
| // }, |
| // }, |
| // { // putfield/getfield = dup_x1/putfield |
| // { |
| // new VariableInstruction(InstructionConstants.OP_ALOAD, X), |
| // // ... |
| // new ConstantInstruction(InstructionConstants.OP_PUTFIELD, Y), |
| // new VariableInstruction(InstructionConstants.OP_ALOAD, X), |
| // new ConstantInstruction(InstructionConstants.OP_GETFIELD, Y), |
| // },{ |
| // new VariableInstruction(InstructionConstants.OP_ALOAD, X), |
| // // ... |
| // new SimpleInstruction(InstructionConstants.OP_DUP_X1), |
| // new ConstantInstruction(InstructionConstants.OP_PUTFIELD, Y), |
| // }, |
| // }, |
| { // getstatic/putstatic = nothing |
| { |
| new ConstantInstruction(InstructionConstants.OP_GETSTATIC, X), |
| new ConstantInstruction(InstructionConstants.OP_PUTSTATIC, X), |
| },{ |
| // Nothing. |
| }, |
| }, |
| { // putstatic_L/putstatic_L = pop2/putstatic |
| { |
| new ConstantInstruction(InstructionConstants.OP_PUTSTATIC, FIELD_L), |
| new ConstantInstruction(InstructionConstants.OP_PUTSTATIC, FIELD_L), |
| },{ |
| new SimpleInstruction(InstructionConstants.OP_POP2), |
| new ConstantInstruction(InstructionConstants.OP_PUTSTATIC, FIELD_L), |
| }, |
| }, |
| { // putstatic_D/putstatic_D = pop2/putstatic |
| { |
| new ConstantInstruction(InstructionConstants.OP_PUTSTATIC, FIELD_D), |
| new ConstantInstruction(InstructionConstants.OP_PUTSTATIC, FIELD_D), |
| },{ |
| new SimpleInstruction(InstructionConstants.OP_POP2), |
| new ConstantInstruction(InstructionConstants.OP_PUTSTATIC, FIELD_D), |
| }, |
| }, |
| { // putstatic/putstatic = pop/putstatic |
| { |
| new ConstantInstruction(InstructionConstants.OP_PUTSTATIC, X), |
| new ConstantInstruction(InstructionConstants.OP_PUTSTATIC, X), |
| },{ |
| new SimpleInstruction(InstructionConstants.OP_POP), |
| new ConstantInstruction(InstructionConstants.OP_PUTSTATIC, X), |
| }, |
| }, |
| { // putstatic_L/getstatic_L = dup2/putstatic |
| { |
| new ConstantInstruction(InstructionConstants.OP_PUTSTATIC, FIELD_L), |
| new ConstantInstruction(InstructionConstants.OP_GETSTATIC, FIELD_L), |
| },{ |
| new SimpleInstruction(InstructionConstants.OP_DUP2), |
| new ConstantInstruction(InstructionConstants.OP_PUTSTATIC, FIELD_L), |
| }, |
| }, |
| { // putstatic_D/getstatic_D = dup2/putstatic |
| { |
| new ConstantInstruction(InstructionConstants.OP_PUTSTATIC, FIELD_D), |
| new ConstantInstruction(InstructionConstants.OP_GETSTATIC, FIELD_D), |
| },{ |
| new SimpleInstruction(InstructionConstants.OP_DUP2), |
| new ConstantInstruction(InstructionConstants.OP_PUTSTATIC, FIELD_D), |
| }, |
| }, |
| { // putstatic/getstatic = dup/putstatic |
| { |
| new ConstantInstruction(InstructionConstants.OP_PUTSTATIC, X), |
| new ConstantInstruction(InstructionConstants.OP_GETSTATIC, X), |
| },{ |
| new SimpleInstruction(InstructionConstants.OP_DUP), |
| new ConstantInstruction(InstructionConstants.OP_PUTSTATIC, X), |
| }, |
| }, |
| }; |
| |
| public static final Instruction[][][] CAST = new Instruction[][][] |
| { |
| { // (byte)(byte)... = (byte)... |
| { |
| new SimpleInstruction(InstructionConstants.OP_I2B), |
| new SimpleInstruction(InstructionConstants.OP_I2B), |
| },{ |
| new SimpleInstruction(InstructionConstants.OP_I2B), |
| }, |
| }, |
| { // (byte)(char)... = (byte)... |
| { |
| new SimpleInstruction(InstructionConstants.OP_I2C), |
| new SimpleInstruction(InstructionConstants.OP_I2B), |
| },{ |
| new SimpleInstruction(InstructionConstants.OP_I2B), |
| }, |
| }, |
| { // (byte)(short)... = (byte)... |
| { |
| new SimpleInstruction(InstructionConstants.OP_I2S), |
| new SimpleInstruction(InstructionConstants.OP_I2B), |
| },{ |
| new SimpleInstruction(InstructionConstants.OP_I2B), |
| }, |
| }, |
| { // (char)(char)... = (char)... |
| { |
| new SimpleInstruction(InstructionConstants.OP_I2C), |
| new SimpleInstruction(InstructionConstants.OP_I2C), |
| },{ |
| new SimpleInstruction(InstructionConstants.OP_I2C), |
| }, |
| }, |
| { // (char)(short)... = (char)... |
| { |
| new SimpleInstruction(InstructionConstants.OP_I2S), |
| new SimpleInstruction(InstructionConstants.OP_I2C), |
| },{ |
| new SimpleInstruction(InstructionConstants.OP_I2C), |
| }, |
| }, |
| { // (short)(byte)... = (byte)... |
| { |
| new SimpleInstruction(InstructionConstants.OP_I2B), |
| new SimpleInstruction(InstructionConstants.OP_I2S), |
| },{ |
| new SimpleInstruction(InstructionConstants.OP_I2B), |
| }, |
| }, |
| { // (short)(char)... = (short)... |
| { |
| new SimpleInstruction(InstructionConstants.OP_I2C), |
| new SimpleInstruction(InstructionConstants.OP_I2S), |
| },{ |
| new SimpleInstruction(InstructionConstants.OP_I2S), |
| }, |
| }, |
| { // (short)(short)... = (short)... |
| { |
| new SimpleInstruction(InstructionConstants.OP_I2S), |
| new SimpleInstruction(InstructionConstants.OP_I2S), |
| },{ |
| new SimpleInstruction(InstructionConstants.OP_I2S), |
| }, |
| }, |
| { // (int)(long)... = ... |
| { |
| new SimpleInstruction(InstructionConstants.OP_I2L), |
| new SimpleInstruction(InstructionConstants.OP_L2I), |
| },{ |
| // Nothing. |
| }, |
| }, |
| { // (X)(X)... = (X)... |
| { |
| new ConstantInstruction(InstructionConstants.OP_CHECKCAST, X), |
| new ConstantInstruction(InstructionConstants.OP_CHECKCAST, X), |
| },{ |
| new ConstantInstruction(InstructionConstants.OP_CHECKCAST, X), |
| }, |
| }, |
| // Not handled correctly in all cases by VMs prior to Java 6... |
| // { // (byte)bytes[...] = bytes[...] |
| // { |
| // new SimpleInstruction(InstructionConstants.OP_BALOAD), |
| // new SimpleInstruction(InstructionConstants.OP_I2B), |
| // },{ |
| // new SimpleInstruction(InstructionConstants.OP_BALOAD), |
| // }, |
| // }, |
| // { // (short)bytes[...] = bytes[...] |
| // { |
| // new SimpleInstruction(InstructionConstants.OP_BALOAD), |
| // new SimpleInstruction(InstructionConstants.OP_I2S), |
| // },{ |
| // new SimpleInstruction(InstructionConstants.OP_BALOAD), |
| // }, |
| // }, |
| // { // (char)chars[...] = chars[...] |
| // { |
| // new SimpleInstruction(InstructionConstants.OP_CALOAD), |
| // new SimpleInstruction(InstructionConstants.OP_I2C), |
| // },{ |
| // new SimpleInstruction(InstructionConstants.OP_CALOAD), |
| // }, |
| // }, |
| // { // (short)shorts[...] = shorts[...] |
| // { |
| // new SimpleInstruction(InstructionConstants.OP_SALOAD), |
| // new SimpleInstruction(InstructionConstants.OP_I2S), |
| // },{ |
| // new SimpleInstruction(InstructionConstants.OP_SALOAD), |
| // }, |
| // }, |
| // { // bytes[...] = (byte)... = bytes[...] = ... |
| // { |
| // new SimpleInstruction(InstructionConstants.OP_I2B), |
| // new SimpleInstruction(InstructionConstants.OP_BASTORE), |
| // },{ |
| // new SimpleInstruction(InstructionConstants.OP_BASTORE), |
| // }, |
| // }, |
| // { // chars[...] = (char)... = chars[...] = ... |
| // { |
| // new SimpleInstruction(InstructionConstants.OP_I2C), |
| // new SimpleInstruction(InstructionConstants.OP_CASTORE), |
| // },{ |
| // new SimpleInstruction(InstructionConstants.OP_CASTORE), |
| // }, |
| // }, |
| // { // shorts[...] = (short)... = shorts[...] = ... |
| // { |
| // new SimpleInstruction(InstructionConstants.OP_I2S), |
| // new SimpleInstruction(InstructionConstants.OP_SASTORE), |
| // },{ |
| // new SimpleInstruction(InstructionConstants.OP_SASTORE), |
| // }, |
| // }, |
| }; |
| |
| public static final Instruction[][][] BRANCH = new Instruction[][][] |
| { |
| { // goto +3 = nothing |
| { |
| new BranchInstruction(InstructionConstants.OP_GOTO, 3), |
| },{ |
| // Nothing. |
| }, |
| }, |
| { // ifeq +3 = pop |
| { |
| new BranchInstruction(InstructionConstants.OP_IFEQ, 3), |
| },{ |
| new SimpleInstruction(InstructionConstants.OP_POP), |
| }, |
| }, |
| { // ifne +3 = pop |
| { |
| new BranchInstruction(InstructionConstants.OP_IFNE, 3), |
| },{ |
| new SimpleInstruction(InstructionConstants.OP_POP), |
| }, |
| }, |
| { // iflt +3 = pop |
| { |
| new BranchInstruction(InstructionConstants.OP_IFLT, 3), |
| },{ |
| new SimpleInstruction(InstructionConstants.OP_POP), |
| }, |
| }, |
| { // ifge +3 = pop |
| { |
| new BranchInstruction(InstructionConstants.OP_IFGE, 3), |
| },{ |
| new SimpleInstruction(InstructionConstants.OP_POP), |
| }, |
| }, |
| { // ifgt +3 = pop |
| { |
| new BranchInstruction(InstructionConstants.OP_IFGT, 3), |
| },{ |
| new SimpleInstruction(InstructionConstants.OP_POP), |
| }, |
| }, |
| { // ifle +3 = pop |
| { |
| new BranchInstruction(InstructionConstants.OP_IFLE, 3), |
| },{ |
| new SimpleInstruction(InstructionConstants.OP_POP), |
| }, |
| }, |
| { // ificmpeq +3 = pop2 |
| { |
| new BranchInstruction(InstructionConstants.OP_IFICMPEQ, 3), |
| },{ |
| new SimpleInstruction(InstructionConstants.OP_POP2), |
| }, |
| }, |
| { // ificmpne +3 = pop2 |
| { |
| new BranchInstruction(InstructionConstants.OP_IFICMPNE, 3), |
| },{ |
| new SimpleInstruction(InstructionConstants.OP_POP2), |
| }, |
| }, |
| { // ificmplt +3 = pop2 |
| { |
| new BranchInstruction(InstructionConstants.OP_IFICMPLT, 3), |
| },{ |
| new SimpleInstruction(InstructionConstants.OP_POP2), |
| }, |
| }, |
| { // ificmpge +3 = pop2 |
| { |
| new BranchInstruction(InstructionConstants.OP_IFICMPGE, 3), |
| },{ |
| new SimpleInstruction(InstructionConstants.OP_POP2), |
| }, |
| }, |
| { // ificmpgt +3 = pop2 |
| { |
| new BranchInstruction(InstructionConstants.OP_IFICMPGT, 3), |
| },{ |
| new SimpleInstruction(InstructionConstants.OP_POP2), |
| }, |
| }, |
| { // ificmple +3 = pop2 |
| { |
| new BranchInstruction(InstructionConstants.OP_IFICMPLE, 3), |
| },{ |
| new SimpleInstruction(InstructionConstants.OP_POP2), |
| }, |
| }, |
| { // ifacmpeq +3 = pop2 |
| { |
| new BranchInstruction(InstructionConstants.OP_IFACMPEQ, 3), |
| },{ |
| new SimpleInstruction(InstructionConstants.OP_POP2), |
| }, |
| }, |
| { // ifacmpne +3 = pop2 |
| { |
| new BranchInstruction(InstructionConstants.OP_IFACMPNE, 3), |
| },{ |
| new SimpleInstruction(InstructionConstants.OP_POP2), |
| }, |
| }, |
| { // ifnull +3 = pop |
| { |
| new BranchInstruction(InstructionConstants.OP_IFNULL, 3), |
| },{ |
| new SimpleInstruction(InstructionConstants.OP_POP), |
| }, |
| }, |
| { // ifnonnull +3 = pop |
| { |
| new BranchInstruction(InstructionConstants.OP_IFNONNULL, 3), |
| },{ |
| new SimpleInstruction(InstructionConstants.OP_POP), |
| }, |
| }, |
| { // if (... == 0) = ifeq |
| { |
| new SimpleInstruction(InstructionConstants.OP_ICONST_0), |
| new BranchInstruction(InstructionConstants.OP_IFICMPEQ, X), |
| },{ |
| new BranchInstruction(InstructionConstants.OP_IFEQ, X), |
| }, |
| }, |
| { // if (0 == i) = iload/ifeq |
| { |
| new SimpleInstruction(InstructionConstants.OP_ICONST_0), |
| new VariableInstruction(InstructionConstants.OP_ILOAD, Y), |
| new BranchInstruction(InstructionConstants.OP_IFICMPEQ, X), |
| },{ |
| new VariableInstruction(InstructionConstants.OP_ILOAD, Y), |
| new BranchInstruction(InstructionConstants.OP_IFEQ, X), |
| }, |
| }, |
| { // if (0 == i) = getstatic/ifeq |
| { |
| new SimpleInstruction(InstructionConstants.OP_ICONST_0), |
| new ConstantInstruction(InstructionConstants.OP_GETSTATIC, Y), |
| new BranchInstruction(InstructionConstants.OP_IFICMPEQ, X), |
| },{ |
| new ConstantInstruction(InstructionConstants.OP_GETSTATIC, Y), |
| new BranchInstruction(InstructionConstants.OP_IFEQ, X), |
| }, |
| }, |
| { // if (0 == i) = getfield/ifeq |
| { |
| new SimpleInstruction(InstructionConstants.OP_ICONST_0), |
| new VariableInstruction(InstructionConstants.OP_ALOAD, Y), |
| new ConstantInstruction(InstructionConstants.OP_GETFIELD, Z), |
| new BranchInstruction(InstructionConstants.OP_IFICMPEQ, X), |
| },{ |
| new VariableInstruction(InstructionConstants.OP_ALOAD, Y), |
| new ConstantInstruction(InstructionConstants.OP_GETFIELD, Z), |
| new BranchInstruction(InstructionConstants.OP_IFEQ, X), |
| }, |
| }, |
| { // if (... != 0) = ifne |
| { |
| new SimpleInstruction(InstructionConstants.OP_ICONST_0), |
| new BranchInstruction(InstructionConstants.OP_IFICMPNE, X), |
| },{ |
| new BranchInstruction(InstructionConstants.OP_IFNE, X), |
| }, |
| }, |
| { // if (0 != i) = iload/ifeq |
| { |
| new SimpleInstruction(InstructionConstants.OP_ICONST_0), |
| new VariableInstruction(InstructionConstants.OP_ILOAD, Y), |
| new BranchInstruction(InstructionConstants.OP_IFICMPNE, X), |
| },{ |
| new VariableInstruction(InstructionConstants.OP_ILOAD, Y), |
| new BranchInstruction(InstructionConstants.OP_IFNE, X), |
| }, |
| }, |
| { // if (0 != i) = getstatic/ifeq |
| { |
| new SimpleInstruction(InstructionConstants.OP_ICONST_0), |
| new ConstantInstruction(InstructionConstants.OP_GETSTATIC, Y), |
| new BranchInstruction(InstructionConstants.OP_IFICMPNE, X), |
| },{ |
| new ConstantInstruction(InstructionConstants.OP_GETSTATIC, Y), |
| new BranchInstruction(InstructionConstants.OP_IFNE, X), |
| }, |
| }, |
| { // if (0 != i) = getfield/ifeq |
| { |
| new SimpleInstruction(InstructionConstants.OP_ICONST_0), |
| new VariableInstruction(InstructionConstants.OP_ALOAD, Y), |
| new ConstantInstruction(InstructionConstants.OP_GETFIELD, Z), |
| new BranchInstruction(InstructionConstants.OP_IFICMPNE, X), |
| },{ |
| new VariableInstruction(InstructionConstants.OP_ALOAD, Y), |
| new ConstantInstruction(InstructionConstants.OP_GETFIELD, Z), |
| new BranchInstruction(InstructionConstants.OP_IFNE, X), |
| }, |
| }, |
| { // if (... < 0) = iflt |
| { |
| new SimpleInstruction(InstructionConstants.OP_ICONST_0), |
| new BranchInstruction(InstructionConstants.OP_IFICMPLT, X), |
| },{ |
| new BranchInstruction(InstructionConstants.OP_IFLT, X), |
| }, |
| }, |
| { // if (... < 1) = ifle |
| { |
| new SimpleInstruction(InstructionConstants.OP_ICONST_1), |
| new BranchInstruction(InstructionConstants.OP_IFICMPLT, X), |
| },{ |
| new BranchInstruction(InstructionConstants.OP_IFLE, X), |
| }, |
| }, |
| { // if (0 > i) = iload/iflt |
| { |
| new SimpleInstruction(InstructionConstants.OP_ICONST_0), |
| new VariableInstruction(InstructionConstants.OP_ILOAD, Y), |
| new BranchInstruction(InstructionConstants.OP_IFICMPGT, X), |
| },{ |
| new VariableInstruction(InstructionConstants.OP_ILOAD, Y), |
| new BranchInstruction(InstructionConstants.OP_IFLT, X), |
| }, |
| }, |
| { // if (1 > i) = iload/ifle |
| { |
| new SimpleInstruction(InstructionConstants.OP_ICONST_1), |
| new VariableInstruction(InstructionConstants.OP_ILOAD, Y), |
| new BranchInstruction(InstructionConstants.OP_IFICMPGT, X), |
| },{ |
| new VariableInstruction(InstructionConstants.OP_ILOAD, Y), |
| new BranchInstruction(InstructionConstants.OP_IFLE, X), |
| }, |
| }, |
| { // if (0 > i) = getstatic/iflt |
| { |
| new SimpleInstruction(InstructionConstants.OP_ICONST_0), |
| new ConstantInstruction(InstructionConstants.OP_GETSTATIC, Y), |
| new BranchInstruction(InstructionConstants.OP_IFICMPGT, X), |
| },{ |
| new ConstantInstruction(InstructionConstants.OP_GETSTATIC, Y), |
| new BranchInstruction(InstructionConstants.OP_IFLT, X), |
| }, |
| }, |
| { // if (1 > i) = getstatic/ifle |
| { |
| new SimpleInstruction(InstructionConstants.OP_ICONST_1), |
| new ConstantInstruction(InstructionConstants.OP_GETSTATIC, Y), |
| new BranchInstruction(InstructionConstants.OP_IFICMPGT, X), |
| },{ |
| new ConstantInstruction(InstructionConstants.OP_GETSTATIC, Y), |
| new BranchInstruction(InstructionConstants.OP_IFLE, X), |
| }, |
| }, |
| { // if (0 > i) = getfield/iflt |
| { |
| new SimpleInstruction(InstructionConstants.OP_ICONST_0), |
| new VariableInstruction(InstructionConstants.OP_ALOAD, Y), |
| new ConstantInstruction(InstructionConstants.OP_GETFIELD, Z), |
| new BranchInstruction(InstructionConstants.OP_IFICMPGT, X), |
| },{ |
| new VariableInstruction(InstructionConstants.OP_ALOAD, Y), |
| new ConstantInstruction(InstructionConstants.OP_GETFIELD, Z), |
| new BranchInstruction(InstructionConstants.OP_IFLT, X), |
| }, |
| }, |
| { // if (1 > i) = getfield/ifle |
| { |
| new SimpleInstruction(InstructionConstants.OP_ICONST_1), |
| new VariableInstruction(InstructionConstants.OP_ALOAD, Y), |
| new ConstantInstruction(InstructionConstants.OP_GETFIELD, Z), |
| new BranchInstruction(InstructionConstants.OP_IFICMPGT, X), |
| },{ |
| new VariableInstruction(InstructionConstants.OP_ALOAD, Y), |
| new ConstantInstruction(InstructionConstants.OP_GETFIELD, Z), |
| new BranchInstruction(InstructionConstants.OP_IFLE, X), |
| }, |
| }, |
| { // if (... >= 0) = ifge |
| { |
| new SimpleInstruction(InstructionConstants.OP_ICONST_0), |
| new BranchInstruction(InstructionConstants.OP_IFICMPGE, X), |
| },{ |
| new BranchInstruction(InstructionConstants.OP_IFGE, X), |
| }, |
| }, |
| { // if (... >= 1) = ifgt |
| { |
| new SimpleInstruction(InstructionConstants.OP_ICONST_1), |
| new BranchInstruction(InstructionConstants.OP_IFICMPGE, X), |
| },{ |
| new BranchInstruction(InstructionConstants.OP_IFGT, X), |
| }, |
| }, |
| { // if (0 <= i) = iload/ifge |
| { |
| new SimpleInstruction(InstructionConstants.OP_ICONST_0), |
| new VariableInstruction(InstructionConstants.OP_ILOAD, Y), |
| new BranchInstruction(InstructionConstants.OP_IFICMPLE, X), |
| },{ |
| new VariableInstruction(InstructionConstants.OP_ILOAD, Y), |
| new BranchInstruction(InstructionConstants.OP_IFGE, X), |
| }, |
| }, |
| { // if (1 <= i) = iload/ifgt |
| { |
| new SimpleInstruction(InstructionConstants.OP_ICONST_1), |
| new VariableInstruction(InstructionConstants.OP_ILOAD, Y), |
| new BranchInstruction(InstructionConstants.OP_IFICMPLE, X), |
| },{ |
| new VariableInstruction(InstructionConstants.OP_ILOAD, Y), |
| new BranchInstruction(InstructionConstants.OP_IFGT, X), |
| }, |
| }, |
| { // if (0 <= i) = getstatic/ifge |
| { |
| new SimpleInstruction(InstructionConstants.OP_ICONST_0), |
| new ConstantInstruction(InstructionConstants.OP_GETSTATIC, Y), |
| new BranchInstruction(InstructionConstants.OP_IFICMPLE, X), |
| },{ |
| new ConstantInstruction(InstructionConstants.OP_GETSTATIC, Y), |
| new BranchInstruction(InstructionConstants.OP_IFGE, X), |
| }, |
| }, |
| { // if (1 <= i) = getstatic/ifgt |
| { |
| new SimpleInstruction(InstructionConstants.OP_ICONST_1), |
| new ConstantInstruction(InstructionConstants.OP_GETSTATIC, Y), |
| new BranchInstruction(InstructionConstants.OP_IFICMPLE, X), |
| },{ |
| new ConstantInstruction(InstructionConstants.OP_GETSTATIC, Y), |
| new BranchInstruction(InstructionConstants.OP_IFGT, X), |
| }, |
| }, |
| { // if (0 <= i) = getfield/ifge |
| { |
| new SimpleInstruction(InstructionConstants.OP_ICONST_0), |
| new VariableInstruction(InstructionConstants.OP_ALOAD, Y), |
| new ConstantInstruction(InstructionConstants.OP_GETFIELD, Z), |
| new BranchInstruction(InstructionConstants.OP_IFICMPLE, X), |
| },{ |
| new VariableInstruction(InstructionConstants.OP_ALOAD, Y), |
| new ConstantInstruction(InstructionConstants.OP_GETFIELD, Z), |
| new BranchInstruction(InstructionConstants.OP_IFGE, X), |
| }, |
| }, |
| { // if (1 <= i) = getfield/ifgt |
| { |
| new SimpleInstruction(InstructionConstants.OP_ICONST_1), |
| new VariableInstruction(InstructionConstants.OP_ALOAD, Y), |
| new ConstantInstruction(InstructionConstants.OP_GETFIELD, Z), |
| new BranchInstruction(InstructionConstants.OP_IFICMPLE, X), |
| },{ |
| new VariableInstruction(InstructionConstants.OP_ALOAD, Y), |
| new ConstantInstruction(InstructionConstants.OP_GETFIELD, Z), |
| new BranchInstruction(InstructionConstants.OP_IFGT, X), |
| }, |
| }, |
| { // if (... > 0) = ifgt |
| { |
| new SimpleInstruction(InstructionConstants.OP_ICONST_0), |
| new BranchInstruction(InstructionConstants.OP_IFICMPGT, X), |
| },{ |
| new BranchInstruction(InstructionConstants.OP_IFGT, X), |
| }, |
| }, |
| { // if (... > -1) = ifge |
| { |
| new SimpleInstruction(InstructionConstants.OP_ICONST_M1), |
| new BranchInstruction(InstructionConstants.OP_IFICMPGT, X), |
| },{ |
| new BranchInstruction(InstructionConstants.OP_IFGE, X), |
| }, |
| }, |
| { // if (0 < i) = iload/ifgt |
| { |
| new SimpleInstruction(InstructionConstants.OP_ICONST_0), |
| new VariableInstruction(InstructionConstants.OP_ILOAD, Y), |
| new BranchInstruction(InstructionConstants.OP_IFICMPLT, X), |
| },{ |
| new VariableInstruction(InstructionConstants.OP_ILOAD, Y), |
| new BranchInstruction(InstructionConstants.OP_IFGT, X), |
| }, |
| }, |
| { // if (-1 < i) = iload/ifge |
| { |
| new SimpleInstruction(InstructionConstants.OP_ICONST_M1), |
| new VariableInstruction(InstructionConstants.OP_ILOAD, Y), |
| new BranchInstruction(InstructionConstants.OP_IFICMPLT, X), |
| },{ |
| new VariableInstruction(InstructionConstants.OP_ILOAD, Y), |
| new BranchInstruction(InstructionConstants.OP_IFGE, X), |
| }, |
| }, |
| { // if (0 < i) = getstatic/ifgt |
| { |
| new SimpleInstruction(InstructionConstants.OP_ICONST_0), |
| new ConstantInstruction(InstructionConstants.OP_GETSTATIC, Y), |
| new BranchInstruction(InstructionConstants.OP_IFICMPLT, X), |
| },{ |
| new ConstantInstruction(InstructionConstants.OP_GETSTATIC, Y), |
| new BranchInstruction(InstructionConstants.OP_IFGT, X), |
| }, |
| }, |
| { // if (-1 < i) = getstatic/ifge |
| { |
| new SimpleInstruction(InstructionConstants.OP_ICONST_M1), |
| new ConstantInstruction(InstructionConstants.OP_GETSTATIC, Y), |
| new BranchInstruction(InstructionConstants.OP_IFICMPLT, X), |
| },{ |
| new ConstantInstruction(InstructionConstants.OP_GETSTATIC, Y), |
| new BranchInstruction(InstructionConstants.OP_IFGE, X), |
| }, |
| }, |
| { // if (0 < i) = getfield/ifgt |
| { |
| new SimpleInstruction(InstructionConstants.OP_ICONST_0), |
| new VariableInstruction(InstructionConstants.OP_ALOAD, Y), |
| new ConstantInstruction(InstructionConstants.OP_GETFIELD, Z), |
| new BranchInstruction(InstructionConstants.OP_IFICMPLT, X), |
| },{ |
| new VariableInstruction(InstructionConstants.OP_ALOAD, Y), |
| new ConstantInstruction(InstructionConstants.OP_GETFIELD, Z), |
| new BranchInstruction(InstructionConstants.OP_IFGT, X), |
| }, |
| }, |
| { // if (-1 < i) = getfield/ifge |
| { |
| new SimpleInstruction(InstructionConstants.OP_ICONST_M1), |
| new VariableInstruction(InstructionConstants.OP_ALOAD, Y), |
| new ConstantInstruction(InstructionConstants.OP_GETFIELD, Z), |
| new BranchInstruction(InstructionConstants.OP_IFICMPLT, X), |
| },{ |
| new VariableInstruction(InstructionConstants.OP_ALOAD, Y), |
| new ConstantInstruction(InstructionConstants.OP_GETFIELD, Z), |
| new BranchInstruction(InstructionConstants.OP_IFGE, X), |
| }, |
| }, |
| { // if (... <= 0) = ifle |
| { |
| new SimpleInstruction(InstructionConstants.OP_ICONST_0), |
| new BranchInstruction(InstructionConstants.OP_IFICMPLE, X), |
| },{ |
| new BranchInstruction(InstructionConstants.OP_IFLE, X), |
| }, |
| }, |
| { // if (... <= -1) = iflt |
| { |
| new SimpleInstruction(InstructionConstants.OP_ICONST_M1), |
| new BranchInstruction(InstructionConstants.OP_IFICMPLE, X), |
| },{ |
| new BranchInstruction(InstructionConstants.OP_IFLT, X), |
| }, |
| }, |
| { // if (0 >= i) = iload/ifle |
| { |
| new SimpleInstruction(InstructionConstants.OP_ICONST_0), |
| new VariableInstruction(InstructionConstants.OP_ILOAD, Y), |
| new BranchInstruction(InstructionConstants.OP_IFICMPGE, X), |
| },{ |
| new VariableInstruction(InstructionConstants.OP_ILOAD, Y), |
| new BranchInstruction(InstructionConstants.OP_IFLE, X), |
| }, |
| }, |
| { // if (-1 >= i) = iload/iflt |
| { |
| new SimpleInstruction(InstructionConstants.OP_ICONST_M1), |
| new VariableInstruction(InstructionConstants.OP_ILOAD, Y), |
| new BranchInstruction(InstructionConstants.OP_IFICMPGE, X), |
| },{ |
| new VariableInstruction(InstructionConstants.OP_ILOAD, Y), |
| new BranchInstruction(InstructionConstants.OP_IFLT, X), |
| }, |
| }, |
| { // if (0 >= i) = getstatic/ifle |
| { |
| new SimpleInstruction(InstructionConstants.OP_ICONST_0), |
| new ConstantInstruction(InstructionConstants.OP_GETSTATIC, Y), |
| new BranchInstruction(InstructionConstants.OP_IFICMPGE, X), |
| },{ |
| new ConstantInstruction(InstructionConstants.OP_GETSTATIC, Y), |
| new BranchInstruction(InstructionConstants.OP_IFLE, X), |
| }, |
| }, |
| { // if (-1 >= i) = getstatic/iflt |
| { |
| new SimpleInstruction(InstructionConstants.OP_ICONST_M1), |
| new ConstantInstruction(InstructionConstants.OP_GETSTATIC, Y), |
| new BranchInstruction(InstructionConstants.OP_IFICMPGE, X), |
| },{ |
| new ConstantInstruction(InstructionConstants.OP_GETSTATIC, Y), |
| new BranchInstruction(InstructionConstants.OP_IFLT, X), |
| }, |
| }, |
| { // if (0 >= i) = getfield/ifle |
| { |
| new SimpleInstruction(InstructionConstants.OP_ICONST_0), |
| new VariableInstruction(InstructionConstants.OP_ALOAD, Y), |
| new ConstantInstruction(InstructionConstants.OP_GETFIELD, Z), |
| new BranchInstruction(InstructionConstants.OP_IFICMPGE, X), |
| },{ |
| new VariableInstruction(InstructionConstants.OP_ALOAD, Y), |
| new ConstantInstruction(InstructionConstants.OP_GETFIELD, Z), |
| new BranchInstruction(InstructionConstants.OP_IFLE, X), |
| }, |
| }, |
| { // if (-1 >= i) = getfield/iflt |
| { |
| new SimpleInstruction(InstructionConstants.OP_ICONST_M1), |
| new VariableInstruction(InstructionConstants.OP_ALOAD, Y), |
| new ConstantInstruction(InstructionConstants.OP_GETFIELD, Z), |
| new BranchInstruction(InstructionConstants.OP_IFICMPGE, X), |
| },{ |
| new VariableInstruction(InstructionConstants.OP_ALOAD, Y), |
| new ConstantInstruction(InstructionConstants.OP_GETFIELD, Z), |
| new BranchInstruction(InstructionConstants.OP_IFLT, X), |
| }, |
| }, |
| { // if (... == null) = ifnull |
| { |
| new SimpleInstruction(InstructionConstants.OP_ACONST_NULL), |
| new BranchInstruction(InstructionConstants.OP_IFACMPEQ, X), |
| },{ |
| new BranchInstruction(InstructionConstants.OP_IFNULL, X), |
| }, |
| }, |
| { // if (null == a) = aload/ifnull |
| { |
| new SimpleInstruction(InstructionConstants.OP_ACONST_NULL), |
| new VariableInstruction(InstructionConstants.OP_ALOAD, Y), |
| new BranchInstruction(InstructionConstants.OP_IFACMPEQ, X), |
| },{ |
| new VariableInstruction(InstructionConstants.OP_ALOAD, Y), |
| new BranchInstruction(InstructionConstants.OP_IFNULL, X), |
| }, |
| }, |
| { // if (null == a) = getstatic/ifnull |
| { |
| new SimpleInstruction(InstructionConstants.OP_ACONST_NULL), |
| new ConstantInstruction(InstructionConstants.OP_GETSTATIC, Y), |
| new BranchInstruction(InstructionConstants.OP_IFACMPEQ, X), |
| },{ |
| new ConstantInstruction(InstructionConstants.OP_GETSTATIC, Y), |
| new BranchInstruction(InstructionConstants.OP_IFNULL, X), |
| }, |
| }, |
| { // if (null == a) = getfield/ifnull |
| { |
| new SimpleInstruction(InstructionConstants.OP_ACONST_NULL), |
| new VariableInstruction(InstructionConstants.OP_ALOAD, Y), |
| new ConstantInstruction(InstructionConstants.OP_GETFIELD, Z), |
| new BranchInstruction(InstructionConstants.OP_IFACMPEQ, X), |
| },{ |
| new VariableInstruction(InstructionConstants.OP_ALOAD, Y), |
| new ConstantInstruction(InstructionConstants.OP_GETFIELD, Z), |
| new BranchInstruction(InstructionConstants.OP_IFNULL, X), |
| }, |
| }, |
| { // if (... != null) = ifnonnull |
| { |
| new SimpleInstruction(InstructionConstants.OP_ACONST_NULL), |
| new BranchInstruction(InstructionConstants.OP_IFACMPNE, X), |
| },{ |
| new BranchInstruction(InstructionConstants.OP_IFNONNULL, X), |
| }, |
| }, |
| { // if (null != a) = aload/ifnonnull |
| { |
| new SimpleInstruction(InstructionConstants.OP_ACONST_NULL), |
| new VariableInstruction(InstructionConstants.OP_ALOAD, Y), |
| new BranchInstruction(InstructionConstants.OP_IFACMPNE, X), |
| },{ |
| new VariableInstruction(InstructionConstants.OP_ALOAD, Y), |
| new BranchInstruction(InstructionConstants.OP_IFNONNULL, X), |
| }, |
| }, |
| { // if (null != a) = getstatic/ifnonnull |
| { |
| new SimpleInstruction(InstructionConstants.OP_ACONST_NULL), |
| new ConstantInstruction(InstructionConstants.OP_GETSTATIC, Y), |
| new BranchInstruction(InstructionConstants.OP_IFACMPNE, X), |
| },{ |
| new ConstantInstruction(InstructionConstants.OP_GETSTATIC, Y), |
| new BranchInstruction(InstructionConstants.OP_IFNONNULL, X), |
| }, |
| }, |
| { // if (null != a) = getfield/ifnonnull |
| { |
| new SimpleInstruction(InstructionConstants.OP_ACONST_NULL), |
| new VariableInstruction(InstructionConstants.OP_ALOAD, Y), |
| new ConstantInstruction(InstructionConstants.OP_GETFIELD, Z), |
| new BranchInstruction(InstructionConstants.OP_IFACMPNE, X), |
| },{ |
| new VariableInstruction(InstructionConstants.OP_ALOAD, Y), |
| new ConstantInstruction(InstructionConstants.OP_GETFIELD, Z), |
| new BranchInstruction(InstructionConstants.OP_IFNONNULL, X), |
| }, |
| }, |
| { // iconst_0/ifeq = goto |
| { |
| new SimpleInstruction(InstructionConstants.OP_ICONST_0), |
| new BranchInstruction(InstructionConstants.OP_IFEQ, X), |
| },{ |
| new BranchInstruction(InstructionConstants.OP_GOTO, X), |
| }, |
| }, |
| { // iconst/ifeq = nothing |
| { |
| new SimpleInstruction(InstructionConstants.OP_ICONST_0, A), |
| new BranchInstruction(InstructionConstants.OP_IFEQ, X), |
| },{ |
| // Nothing. |
| }, |
| }, |
| { // bipush/ifeq = nothing |
| { |
| new SimpleInstruction(InstructionConstants.OP_BIPUSH, A), |
| new BranchInstruction(InstructionConstants.OP_IFEQ, X), |
| },{ |
| // Nothing. |
| }, |
| }, |
| { // sipush/ifeq = nothing |
| { |
| new SimpleInstruction(InstructionConstants.OP_SIPUSH, A), |
| new BranchInstruction(InstructionConstants.OP_IFEQ, X), |
| },{ |
| // Nothing. |
| }, |
| }, |
| { // iconst_0/ifne = nothing |
| { |
| new SimpleInstruction(InstructionConstants.OP_ICONST_0), |
| new BranchInstruction(InstructionConstants.OP_IFNE, X), |
| },{ |
| // Nothing. |
| }, |
| }, |
| { // iconst/ifne = goto |
| { |
| new SimpleInstruction(InstructionConstants.OP_ICONST_0, A), |
| new BranchInstruction(InstructionConstants.OP_IFNE, X), |
| },{ |
| new BranchInstruction(InstructionConstants.OP_GOTO, X), |
| }, |
| }, |
| { // bipush/ifne = goto |
| { |
| new SimpleInstruction(InstructionConstants.OP_BIPUSH, A), |
| new BranchInstruction(InstructionConstants.OP_IFNE, X), |
| },{ |
| new BranchInstruction(InstructionConstants.OP_GOTO, X), |
| }, |
| }, |
| { // sipush/ifne = goto |
| { |
| new SimpleInstruction(InstructionConstants.OP_SIPUSH, A), |
| new BranchInstruction(InstructionConstants.OP_IFNE, X), |
| },{ |
| new BranchInstruction(InstructionConstants.OP_GOTO, X), |
| }, |
| }, |
| { // iconst_0/iflt = nothing |
| { |
| new SimpleInstruction(InstructionConstants.OP_ICONST_0), |
| new BranchInstruction(InstructionConstants.OP_IFLT, X), |
| },{ |
| // Nothing. |
| }, |
| }, |
| { // iconst_0/ifge = goto |
| { |
| new SimpleInstruction(InstructionConstants.OP_ICONST_0), |
| new BranchInstruction(InstructionConstants.OP_IFGE, X), |
| },{ |
| new BranchInstruction(InstructionConstants.OP_GOTO, X), |
| }, |
| }, |
| { // iconst_0/ifgt = nothing |
| { |
| new SimpleInstruction(InstructionConstants.OP_ICONST_0), |
| new BranchInstruction(InstructionConstants.OP_IFGT, X), |
| },{ |
| // Nothing. |
| }, |
| }, |
| { // iconst_0/ifle = goto |
| { |
| new SimpleInstruction(InstructionConstants.OP_ICONST_0), |
| new BranchInstruction(InstructionConstants.OP_IFLE, X), |
| },{ |
| new BranchInstruction(InstructionConstants.OP_GOTO, X), |
| }, |
| }, |
| { // aconst_null/ifnull = goto |
| { |
| new SimpleInstruction(InstructionConstants.OP_ACONST_NULL), |
| new BranchInstruction(InstructionConstants.OP_IFNULL, X), |
| },{ |
| new BranchInstruction(InstructionConstants.OP_GOTO, X), |
| }, |
| }, |
| { // aconst_null/ifnonnul = nothing |
| { |
| new SimpleInstruction(InstructionConstants.OP_ACONST_NULL), |
| new BranchInstruction(InstructionConstants.OP_IFNONNULL, X), |
| },{ |
| // Nothing. |
| }, |
| }, |
| { // ifeq/goto = ifne |
| { |
| new BranchInstruction(InstructionConstants.OP_IFEQ, 6), |
| new BranchInstruction(InstructionConstants.OP_GOTO, X), |
| },{ |
| new BranchInstruction(InstructionConstants.OP_IFNE, X), |
| }, |
| }, |
| { // ifne/goto = ifeq |
| { |
| new BranchInstruction(InstructionConstants.OP_IFNE, 6), |
| new BranchInstruction(InstructionConstants.OP_GOTO, X), |
| },{ |
| new BranchInstruction(InstructionConstants.OP_IFEQ, X), |
| }, |
| }, |
| { // iflt/goto = ifge |
| { |
| new BranchInstruction(InstructionConstants.OP_IFLT, 6), |
| new BranchInstruction(InstructionConstants.OP_GOTO, X), |
| },{ |
| new BranchInstruction(InstructionConstants.OP_IFGE, X), |
| }, |
| }, |
| { // ifge/goto = iflt |
| { |
| new BranchInstruction(InstructionConstants.OP_IFGE, 6), |
| new BranchInstruction(InstructionConstants.OP_GOTO, X), |
| },{ |
| new BranchInstruction(InstructionConstants.OP_IFLT, X), |
| }, |
| }, |
| { // ifgt/goto = ifle |
| { |
| new BranchInstruction(InstructionConstants.OP_IFGT, 6), |
| new BranchInstruction(InstructionConstants.OP_GOTO, X), |
| },{ |
| new BranchInstruction(InstructionConstants.OP_IFLE, X), |
| }, |
| }, |
| { // ifle/goto = ifgt |
| { |
| new BranchInstruction(InstructionConstants.OP_IFLE, 6), |
| new BranchInstruction(InstructionConstants.OP_GOTO, X), |
| },{ |
| new BranchInstruction(InstructionConstants.OP_IFGT, X), |
| }, |
| }, |
| { // ificmpeq/goto = ificmpne |
| { |
| new BranchInstruction(InstructionConstants.OP_IFICMPEQ, 6), |
| new BranchInstruction(InstructionConstants.OP_GOTO, X), |
| },{ |
| new BranchInstruction(InstructionConstants.OP_IFICMPNE, X), |
| }, |
| }, |
| { // ificmpne/goto = ificmpeq |
| { |
| new BranchInstruction(InstructionConstants.OP_IFICMPNE, 6), |
| new BranchInstruction(InstructionConstants.OP_GOTO, X), |
| },{ |
| new BranchInstruction(InstructionConstants.OP_IFICMPEQ, X), |
| }, |
| }, |
| { // ificmplt/goto = ificmpge |
| { |
| new BranchInstruction(InstructionConstants.OP_IFICMPLT, 6), |
| new BranchInstruction(InstructionConstants.OP_GOTO, X), |
| },{ |
| new BranchInstruction(InstructionConstants.OP_IFICMPGE, X), |
| }, |
| }, |
| { // ificmpge/goto = ificmplt |
| { |
| new BranchInstruction(InstructionConstants.OP_IFICMPGE, 6), |
| new BranchInstruction(InstructionConstants.OP_GOTO, X), |
| },{ |
| new BranchInstruction(InstructionConstants.OP_IFICMPLT, X), |
| }, |
| }, |
| { // ificmpgt/goto = ificmple |
| { |
| new BranchInstruction(InstructionConstants.OP_IFICMPGT, 6), |
| new BranchInstruction(InstructionConstants.OP_GOTO, X), |
| },{ |
| new BranchInstruction(InstructionConstants.OP_IFICMPLE, X), |
| }, |
| }, |
| { // ificmple/goto = ificmpgt |
| { |
| new BranchInstruction(InstructionConstants.OP_IFICMPLE, 6), |
| new BranchInstruction(InstructionConstants.OP_GOTO, X), |
| },{ |
| new BranchInstruction(InstructionConstants.OP_IFICMPGT, X), |
| }, |
| }, |
| { // ifacmpeq/goto = ifacmpne |
| { |
| new BranchInstruction(InstructionConstants.OP_IFACMPEQ, 6), |
| new BranchInstruction(InstructionConstants.OP_GOTO, X), |
| },{ |
| new BranchInstruction(InstructionConstants.OP_IFACMPNE, X), |
| }, |
| }, |
| { // ifacmpne/goto = ifacmpeq |
| { |
| new BranchInstruction(InstructionConstants.OP_IFACMPNE, 6), |
| new BranchInstruction(InstructionConstants.OP_GOTO, X), |
| },{ |
| new BranchInstruction(InstructionConstants.OP_IFACMPEQ, X), |
| }, |
| }, |
| { // ifnull/goto = ifnonnull |
| { |
| new BranchInstruction(InstructionConstants.OP_IFNULL, 6), |
| new BranchInstruction(InstructionConstants.OP_GOTO, X), |
| },{ |
| new BranchInstruction(InstructionConstants.OP_IFNONNULL, X), |
| }, |
| }, |
| { // ifnonnull/goto = ifnull |
| { |
| new BranchInstruction(InstructionConstants.OP_IFNONNULL, 6), |
| new BranchInstruction(InstructionConstants.OP_GOTO, X), |
| },{ |
| new BranchInstruction(InstructionConstants.OP_IFNULL, X), |
| }, |
| }, |
| // { // switch (...) { default: ... } = pop/goto ... |
| // { |
| // new TableSwitchInstruction(InstructionConstants.OP_TABLESWITCH, A, X, Y, 0, new int[0]), |
| // },{ |
| // new SimpleInstruction(InstructionConstants.OP_POP), |
| // new BranchInstruction(InstructionConstants.OP_GOTO, A), |
| // }, |
| // }, |
| // { // switch (...) { default: ... } = pop/goto ... |
| // { |
| // new LookUpSwitchInstruction(InstructionConstants.OP_LOOKUPSWITCH, A, 0, new int[0], new int[0]), |
| // },{ |
| // new SimpleInstruction(InstructionConstants.OP_POP), |
| // new BranchInstruction(InstructionConstants.OP_GOTO, A), |
| // }, |
| // }, |
| { // switch (...) { case/case/default: ... } = switch (...) { case/default: ... } |
| { |
| new LookUpSwitchInstruction(InstructionConstants.OP_LOOKUPSWITCH, A, new int[] { X, Y }, new int[] { A, B }), |
| },{ |
| new LookUpSwitchInstruction(InstructionConstants.OP_LOOKUPSWITCH, A, new int[] { Y }, new int[] { B }), |
| }, |
| }, |
| { // switch (...) { case/case/default: ... } = switch (...) { case/default: ... } |
| { |
| new LookUpSwitchInstruction(InstructionConstants.OP_LOOKUPSWITCH, B, new int[] { X, Y }, new int[] { A, B }), |
| },{ |
| new LookUpSwitchInstruction(InstructionConstants.OP_LOOKUPSWITCH, B, new int[] { X }, new int[] { A }), |
| }, |
| }, |
| { // switch (...) { case/case/case/default: ... } = switch (...) { case/case/default: ... } |
| { |
| new LookUpSwitchInstruction(InstructionConstants.OP_LOOKUPSWITCH, A, new int[] { X, Y, Z }, new int[] { A, B, C }), |
| },{ |
| new LookUpSwitchInstruction(InstructionConstants.OP_LOOKUPSWITCH, A, new int[] { Y, Z }, new int[] { B, C }), |
| }, |
| }, |
| { // switch (...) { case/case/case/default: ... } = switch (...) { case/case/default: ... } |
| { |
| new LookUpSwitchInstruction(InstructionConstants.OP_LOOKUPSWITCH, B, new int[] { X, Y, Z }, new int[] { A, B, C }), |
| },{ |
| new LookUpSwitchInstruction(InstructionConstants.OP_LOOKUPSWITCH, B, new int[] { X, Z }, new int[] { A, C }), |
| }, |
| }, |
| { // switch (...) { case/case/case/default: ... } = switch (...) { case/case/default: ... } |
| { |
| new LookUpSwitchInstruction(InstructionConstants.OP_LOOKUPSWITCH, C, new int[] { X, Y, Z }, new int[] { A, B, C }), |
| },{ |
| new LookUpSwitchInstruction(InstructionConstants.OP_LOOKUPSWITCH, C, new int[] { X, Y }, new int[] { A, B }), |
| }, |
| }, |
| // { // switch (...) { case ...: ... default: ... } |
| // // = if (... == ...) ... else ... |
| // { |
| // new TableSwitchInstruction(InstructionConstants.OP_TABLESWITCH, A, X, Y, 1, new int[] { B }), |
| // },{ |
| // new SimpleInstruction(InstructionConstants.OP_SIPUSH, X), |
| // new BranchInstruction(InstructionConstants.OP_IFICMPNE, A), |
| // new BranchInstruction(InstructionConstants.OP_GOTO, B), |
| // }, |
| // }, |
| // { // switch (...) { case ...: ... default: ... } |
| // // = if (... == ...) ... else ... |
| // { |
| // new LookUpSwitchInstruction(InstructionConstants.OP_LOOKUPSWITCH, A, 1, new int[] { X }, new int[] { B }), |
| // },{ |
| // new SimpleInstruction(InstructionConstants.OP_SIPUSH, X), |
| // new BranchInstruction(InstructionConstants.OP_IFICMPNE, A), |
| // new BranchInstruction(InstructionConstants.OP_GOTO, B), |
| // }, |
| // } |
| }; |
| } |