/* * Copyright (c) 2009, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License version 2 only, as * published by the Free Software Foundation. Oracle designates this * particular file as subject to the "Classpath" exception as provided * by Oracle in the LICENSE file that accompanied this code. * * This code 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 * version 2 for more details (a copy is included in the LICENSE file that * accompanied this code). * * You should have received a copy of the GNU General Public License version * 2 along with this work; if not, write to the Free Software Foundation, * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. * * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA * or visit www.oracle.com if you need additional information or have any * questions. */ package com.sun.tools.classfile; import static com.sun.tools.classfile.Instruction.Kind.*; import static com.sun.tools.classfile.Opcode.Set.*; /** * See JVMS, chapter 6. * * <p>In addition to providing all the standard opcodes defined in JVMS, * this class also provides legacy support for the PicoJava extensions. * * <p><b>This is NOT part of any supported API. * If you write code that depends on this, you do so at your own risk. * This code and its internal interfaces are subject to change or * deletion without notice.</b> */ public enum Opcode { NOP(0x0), ACONST_NULL(0x1), ICONST_M1(0x2), ICONST_0(0x3), ICONST_1(0x4), ICONST_2(0x5), ICONST_3(0x6), ICONST_4(0x7), ICONST_5(0x8), LCONST_0(0x9), LCONST_1(0xa), FCONST_0(0xb), FCONST_1(0xc), FCONST_2(0xd), DCONST_0(0xe), DCONST_1(0xf), BIPUSH(0x10, BYTE), SIPUSH(0x11, SHORT), LDC(0x12, CPREF), LDC_W(0x13, CPREF_W), LDC2_W(0x14, CPREF_W), ILOAD(0x15, LOCAL), LLOAD(0x16, LOCAL), FLOAD(0x17, LOCAL), DLOAD(0x18, LOCAL), ALOAD(0x19, LOCAL), ILOAD_0(0x1a), ILOAD_1(0x1b), ILOAD_2(0x1c), ILOAD_3(0x1d), LLOAD_0(0x1e), LLOAD_1(0x1f), LLOAD_2(0x20), LLOAD_3(0x21), FLOAD_0(0x22), FLOAD_1(0x23), FLOAD_2(0x24), FLOAD_3(0x25), DLOAD_0(0x26), DLOAD_1(0x27), DLOAD_2(0x28), DLOAD_3(0x29), ALOAD_0(0x2a), ALOAD_1(0x2b), ALOAD_2(0x2c), ALOAD_3(0x2d), IALOAD(0x2e), LALOAD(0x2f), FALOAD(0x30), DALOAD(0x31), AALOAD(0x32), BALOAD(0x33), CALOAD(0x34), SALOAD(0x35), ISTORE(0x36, LOCAL), LSTORE(0x37, LOCAL), FSTORE(0x38, LOCAL), DSTORE(0x39, LOCAL), ASTORE(0x3a, LOCAL), ISTORE_0(0x3b), ISTORE_1(0x3c), ISTORE_2(0x3d), ISTORE_3(0x3e), LSTORE_0(0x3f), LSTORE_1(0x40), LSTORE_2(0x41), LSTORE_3(0x42), FSTORE_0(0x43), FSTORE_1(0x44), FSTORE_2(0x45), FSTORE_3(0x46), DSTORE_0(0x47), DSTORE_1(0x48), DSTORE_2(0x49), DSTORE_3(0x4a), ASTORE_0(0x4b), ASTORE_1(0x4c), ASTORE_2(0x4d), ASTORE_3(0x4e), IASTORE(0x4f), LASTORE(0x50), FASTORE(0x51), DASTORE(0x52), AASTORE(0x53), BASTORE(0x54), CASTORE(0x55), SASTORE(0x56), POP(0x57), POP2(0x58), DUP(0x59), DUP_X1(0x5a), DUP_X2(0x5b), DUP2(0x5c), DUP2_X1(0x5d), DUP2_X2(0x5e), SWAP(0x5f), IADD(0x60), LADD(0x61), FADD(0x62), DADD(0x63), ISUB(0x64), LSUB(0x65), FSUB(0x66), DSUB(0x67), IMUL(0x68), LMUL(0x69), FMUL(0x6a), DMUL(0x6b), IDIV(0x6c), LDIV(0x6d), FDIV(0x6e), DDIV(0x6f), IREM(0x70), LREM(0x71), FREM(0x72), DREM(0x73), INEG(0x74), LNEG(0x75), FNEG(0x76), DNEG(0x77), ISHL(0x78), LSHL(0x79), ISHR(0x7a), LSHR(0x7b), IUSHR(0x7c), LUSHR(0x7d), IAND(0x7e), LAND(0x7f), IOR(0x80), LOR(0x81), IXOR(0x82), LXOR(0x83), IINC(0x84, LOCAL_BYTE), I2L(0x85), I2F(0x86), I2D(0x87), L2I(0x88), L2F(0x89), L2D(0x8a), F2I(0x8b), F2L(0x8c), F2D(0x8d), D2I(0x8e), D2L(0x8f), D2F(0x90), I2B(0x91), I2C(0x92), I2S(0x93), LCMP(0x94), FCMPL(0x95), FCMPG(0x96), DCMPL(0x97), DCMPG(0x98), IFEQ(0x99, BRANCH), IFNE(0x9a, BRANCH), IFLT(0x9b, BRANCH), IFGE(0x9c, BRANCH), IFGT(0x9d, BRANCH), IFLE(0x9e, BRANCH), IF_ICMPEQ(0x9f, BRANCH), IF_ICMPNE(0xa0, BRANCH), IF_ICMPLT(0xa1, BRANCH), IF_ICMPGE(0xa2, BRANCH), IF_ICMPGT(0xa3, BRANCH), IF_ICMPLE(0xa4, BRANCH), IF_ACMPEQ(0xa5, BRANCH), IF_ACMPNE(0xa6, BRANCH), GOTO(0xa7, BRANCH), JSR(0xa8, BRANCH), RET(0xa9, LOCAL), TABLESWITCH(0xaa, DYNAMIC), LOOKUPSWITCH(0xab, DYNAMIC), IRETURN(0xac), LRETURN(0xad), FRETURN(0xae), DRETURN(0xaf), ARETURN(0xb0), RETURN(0xb1), GETSTATIC(0xb2, CPREF_W), PUTSTATIC(0xb3, CPREF_W), GETFIELD(0xb4, CPREF_W), PUTFIELD(0xb5, CPREF_W), INVOKEVIRTUAL(0xb6, CPREF_W), INVOKESPECIAL(0xb7, CPREF_W), INVOKESTATIC(0xb8, CPREF_W), INVOKEINTERFACE(0xb9, CPREF_W_UBYTE_ZERO), INVOKEDYNAMIC(0xba, CPREF_W_UBYTE_ZERO), NEW(0xbb, CPREF_W), NEWARRAY(0xbc, ATYPE), ANEWARRAY(0xbd, CPREF_W), ARRAYLENGTH(0xbe), ATHROW(0xbf), CHECKCAST(0xc0, CPREF_W), INSTANCEOF(0xc1, CPREF_W), MONITORENTER(0xc2), MONITOREXIT(0xc3), // wide 0xc4 MULTIANEWARRAY(0xc5, CPREF_W_UBYTE), IFNULL(0xc6, BRANCH), IFNONNULL(0xc7, BRANCH), GOTO_W(0xc8, BRANCH_W), JSR_W(0xc9, BRANCH_W), // impdep 0xfe: PicoJava nonpriv // impdep 0xff: Picojava priv // wide opcodes ILOAD_W(0xc415, WIDE_LOCAL), LLOAD_W(0xc416, WIDE_LOCAL), FLOAD_W(0xc417, WIDE_LOCAL), DLOAD_W(0xc418, WIDE_LOCAL), ALOAD_W(0xc419, WIDE_LOCAL), ISTORE_W(0xc436, WIDE_LOCAL), LSTORE_W(0xc437, WIDE_LOCAL), FSTORE_W(0xc438, WIDE_LOCAL), DSTORE_W(0xc439, WIDE_LOCAL), ASTORE_W(0xc43a, WIDE_LOCAL), IINC_W(0xc484, WIDE_LOCAL_SHORT), RET_W(0xc4a9, WIDE_LOCAL), // PicoJava nonpriv instructions LOAD_UBYTE(PICOJAVA, 0xfe00), LOAD_BYTE(PICOJAVA, 0xfe01), LOAD_CHAR(PICOJAVA, 0xfe02), LOAD_SHORT(PICOJAVA, 0xfe03), LOAD_WORD(PICOJAVA, 0xfe04), RET_FROM_SUB(PICOJAVA, 0xfe05), LOAD_CHAR_OE(PICOJAVA, 0xfe0a), LOAD_SHORT_OE(PICOJAVA, 0xfe0b), LOAD_WORD_OE(PICOJAVA, 0xfe0c), NCLOAD_UBYTE(PICOJAVA, 0xfe10), NCLOAD_BYTE(PICOJAVA, 0xfe11), NCLOAD_CHAR(PICOJAVA, 0xfe12), NCLOAD_SHORT(PICOJAVA, 0xfe13), NCLOAD_WORD(PICOJAVA, 0xfe14), NCLOAD_CHAR_OE(PICOJAVA, 0xfe1a), NCLOAD_SHORT_OE(PICOJAVA, 0xfe1b), NCLOAD_WORD_OE(PICOJAVA, 0xfe1c), CACHE_FLUSH(PICOJAVA, 0xfe1e), STORE_BYTE(PICOJAVA, 0xfe20), STORE_SHORT(PICOJAVA, 0xfe22), STORE_WORD(PICOJAVA, 0xfe24), STORE_SHORT_OE(PICOJAVA, 0xfe2a), STORE_WORD_OE(PICOJAVA, 0xfe2c), NCSTORE_BYTE(PICOJAVA, 0xfe30), NCSTORE_SHORT(PICOJAVA, 0xfe32), NCSTORE_WORD(PICOJAVA, 0xfe34), NCSTORE_SHORT_OE(PICOJAVA, 0xfe3a), NCSTORE_WORD_OE(PICOJAVA, 0xfe3c), ZERO_LINE(PICOJAVA, 0xfe3e), ENTER_SYNC_METHOD(PICOJAVA, 0xfe3f), // PicoJava priv instructions PRIV_LOAD_UBYTE(PICOJAVA, 0xff00), PRIV_LOAD_BYTE(PICOJAVA, 0xff01), PRIV_LOAD_CHAR(PICOJAVA, 0xff02), PRIV_LOAD_SHORT(PICOJAVA, 0xff03), PRIV_LOAD_WORD(PICOJAVA, 0xff04), PRIV_RET_FROM_TRAP(PICOJAVA, 0xff05), PRIV_READ_DCACHE_TAG(PICOJAVA, 0xff06), PRIV_READ_DCACHE_DATA(PICOJAVA, 0xff07), PRIV_LOAD_CHAR_OE(PICOJAVA, 0xff0a), PRIV_LOAD_SHORT_OE(PICOJAVA, 0xff0b), PRIV_LOAD_WORD_OE(PICOJAVA, 0xff0c), PRIV_READ_ICACHE_TAG(PICOJAVA, 0xff0e), PRIV_READ_ICACHE_DATA(PICOJAVA, 0xff0f), PRIV_NCLOAD_UBYTE(PICOJAVA, 0xff10), PRIV_NCLOAD_BYTE(PICOJAVA, 0xff11), PRIV_NCLOAD_CHAR(PICOJAVA, 0xff12), PRIV_NCLOAD_SHORT(PICOJAVA, 0xff13), PRIV_NCLOAD_WORD(PICOJAVA, 0xff14), PRIV_POWERDOWN(PICOJAVA, 0xff16), PRIV_READ_SCACHE_DATA(PICOJAVA, 0xff17), PRIV_NCLOAD_CHAR_OE(PICOJAVA, 0xff1a), PRIV_NCLOAD_SHORT_OE(PICOJAVA, 0xff1b), PRIV_NCLOAD_WORD_OE(PICOJAVA, 0xff1c), PRIV_CACHE_FLUSH(PICOJAVA, 0xff1e), PRIV_CACHE_INDEX_FLUSH(PICOJAVA, 0xff1f), PRIV_STORE_BYTE(PICOJAVA, 0xff20), PRIV_STORE_SHORT(PICOJAVA, 0xff22), PRIV_STORE_WORD(PICOJAVA, 0xff24), PRIV_WRITE_DCACHE_TAG(PICOJAVA, 0xff26), PRIV_WRITE_DCACHE_DATA(PICOJAVA, 0xff27), PRIV_STORE_SHORT_OE(PICOJAVA, 0xff2a), PRIV_STORE_WORD_OE(PICOJAVA, 0xff2c), PRIV_WRITE_ICACHE_TAG(PICOJAVA, 0xff2e), PRIV_WRITE_ICACHE_DATA(PICOJAVA, 0xff2f), PRIV_NCSTORE_BYTE(PICOJAVA, 0xff30), PRIV_NCSTORE_SHORT(PICOJAVA, 0xff32), PRIV_NCSTORE_WORD(PICOJAVA, 0xff34), PRIV_RESET(PICOJAVA, 0xff36), PRIV_WRITE_SCACHE_DATA(PICOJAVA, 0xff37), PRIV_NCSTORE_SHORT_OE(PICOJAVA, 0xff3a), PRIV_NCSTORE_WORD_OE(PICOJAVA, 0xff3c), PRIV_ZERO_LINE(PICOJAVA, 0xff3e), PRIV_READ_REG_0(PICOJAVA, 0xff40), PRIV_READ_REG_1(PICOJAVA, 0xff41), PRIV_READ_REG_2(PICOJAVA, 0xff42), PRIV_READ_REG_3(PICOJAVA, 0xff43), PRIV_READ_REG_4(PICOJAVA, 0xff44), PRIV_READ_REG_5(PICOJAVA, 0xff45), PRIV_READ_REG_6(PICOJAVA, 0xff46), PRIV_READ_REG_7(PICOJAVA, 0xff47), PRIV_READ_REG_8(PICOJAVA, 0xff48), PRIV_READ_REG_9(PICOJAVA, 0xff49), PRIV_READ_REG_10(PICOJAVA, 0xff4a), PRIV_READ_REG_11(PICOJAVA, 0xff4b), PRIV_READ_REG_12(PICOJAVA, 0xff4c), PRIV_READ_REG_13(PICOJAVA, 0xff4d), PRIV_READ_REG_14(PICOJAVA, 0xff4e), PRIV_READ_REG_15(PICOJAVA, 0xff4f), PRIV_READ_REG_16(PICOJAVA, 0xff50), PRIV_READ_REG_17(PICOJAVA, 0xff51), PRIV_READ_REG_18(PICOJAVA, 0xff52), PRIV_READ_REG_19(PICOJAVA, 0xff53), PRIV_READ_REG_20(PICOJAVA, 0xff54), PRIV_READ_REG_21(PICOJAVA, 0xff55), PRIV_READ_REG_22(PICOJAVA, 0xff56), PRIV_READ_REG_23(PICOJAVA, 0xff57), PRIV_READ_REG_24(PICOJAVA, 0xff58), PRIV_READ_REG_25(PICOJAVA, 0xff59), PRIV_READ_REG_26(PICOJAVA, 0xff5a), PRIV_READ_REG_27(PICOJAVA, 0xff5b), PRIV_READ_REG_28(PICOJAVA, 0xff5c), PRIV_READ_REG_29(PICOJAVA, 0xff5d), PRIV_READ_REG_30(PICOJAVA, 0xff5e), PRIV_READ_REG_31(PICOJAVA, 0xff5f), PRIV_WRITE_REG_0(PICOJAVA, 0xff60), PRIV_WRITE_REG_1(PICOJAVA, 0xff61), PRIV_WRITE_REG_2(PICOJAVA, 0xff62), PRIV_WRITE_REG_3(PICOJAVA, 0xff63), PRIV_WRITE_REG_4(PICOJAVA, 0xff64), PRIV_WRITE_REG_5(PICOJAVA, 0xff65), PRIV_WRITE_REG_6(PICOJAVA, 0xff66), PRIV_WRITE_REG_7(PICOJAVA, 0xff67), PRIV_WRITE_REG_8(PICOJAVA, 0xff68), PRIV_WRITE_REG_9(PICOJAVA, 0xff69), PRIV_WRITE_REG_10(PICOJAVA, 0xff6a), PRIV_WRITE_REG_11(PICOJAVA, 0xff6b), PRIV_WRITE_REG_12(PICOJAVA, 0xff6c), PRIV_WRITE_REG_13(PICOJAVA, 0xff6d), PRIV_WRITE_REG_14(PICOJAVA, 0xff6e), PRIV_WRITE_REG_15(PICOJAVA, 0xff6f), PRIV_WRITE_REG_16(PICOJAVA, 0xff70), PRIV_WRITE_REG_17(PICOJAVA, 0xff71), PRIV_WRITE_REG_18(PICOJAVA, 0xff72), PRIV_WRITE_REG_19(PICOJAVA, 0xff73), PRIV_WRITE_REG_20(PICOJAVA, 0xff74), PRIV_WRITE_REG_21(PICOJAVA, 0xff75), PRIV_WRITE_REG_22(PICOJAVA, 0xff76), PRIV_WRITE_REG_23(PICOJAVA, 0xff77), PRIV_WRITE_REG_24(PICOJAVA, 0xff78), PRIV_WRITE_REG_25(PICOJAVA, 0xff79), PRIV_WRITE_REG_26(PICOJAVA, 0xff7a), PRIV_WRITE_REG_27(PICOJAVA, 0xff7b), PRIV_WRITE_REG_28(PICOJAVA, 0xff7c), PRIV_WRITE_REG_29(PICOJAVA, 0xff7d), PRIV_WRITE_REG_30(PICOJAVA, 0xff7e), PRIV_WRITE_REG_31(PICOJAVA, 0xff7f); Opcode(int opcode) { this(STANDARD, opcode, NO_OPERANDS); } Opcode(int opcode, Instruction.Kind kind) { this(STANDARD, opcode, kind); } Opcode(Set set, int opcode) { this(set, opcode, (set == STANDARD ? NO_OPERANDS : WIDE_NO_OPERANDS)); } Opcode(Set set, int opcode, Instruction.Kind kind) { this.set = set; this.opcode = opcode; this.kind = kind; } public final Set set; public final int opcode; public final Instruction.Kind kind; /** Get the Opcode for a simple standard 1-byte opcode. */ public static Opcode get(int opcode) { return stdOpcodes[opcode]; } /** Get the Opcode for 1- or 2-byte opcode. */ public static Opcode get(int opcodePrefix, int opcode) { Opcode[] block = getOpcodeBlock(opcodePrefix); return (block == null ? null : block[opcode]); } private static Opcode[] getOpcodeBlock(int opcodePrefix) { switch (opcodePrefix) { case 0: return stdOpcodes; case WIDE: return wideOpcodes; case NONPRIV: return nonPrivOpcodes; case PRIV: return privOpcodes; default: return null; } } private static final Opcode[] stdOpcodes = new Opcode[256]; private static final Opcode[] wideOpcodes = new Opcode[256]; private static final Opcode[] nonPrivOpcodes = new Opcode[256]; private static final Opcode[] privOpcodes = new Opcode[256]; static { for (Opcode o: values()) getOpcodeBlock(o.opcode >> 8)[o.opcode & 0xff] = o; } /** The byte prefix for the wide instructions. */ public static final int WIDE = 0xc4; /** The byte prefix for the PicoJava nonpriv instructions. */ public static final int NONPRIV = 0xfe; /** The byte prefix for the PicoJava priv instructions. */ public static final int PRIV = 0xff; public enum Set { /** Standard opcodes. */ STANDARD, /** Legacy support for PicoJava opcodes. */ PICOJAVA } }