jjg@255: /* vromero@1428: * Copyright (c) 2009, 2012, Oracle and/or its affiliates. All rights reserved. jjg@255: * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. jjg@255: * jjg@255: * This code is free software; you can redistribute it and/or modify it jjg@255: * under the terms of the GNU General Public License version 2 only, as ohair@554: * published by the Free Software Foundation. Oracle designates this jjg@255: * particular file as subject to the "Classpath" exception as provided ohair@554: * by Oracle in the LICENSE file that accompanied this code. jjg@255: * jjg@255: * This code is distributed in the hope that it will be useful, but WITHOUT jjg@255: * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or jjg@255: * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License jjg@255: * version 2 for more details (a copy is included in the LICENSE file that jjg@255: * accompanied this code). jjg@255: * jjg@255: * You should have received a copy of the GNU General Public License version jjg@255: * 2 along with this work; if not, write to the Free Software Foundation, jjg@255: * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. jjg@255: * ohair@554: * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA ohair@554: * or visit www.oracle.com if you need additional information or have any ohair@554: * questions. jjg@255: */ jjg@255: jjg@255: package com.sun.tools.classfile; jjg@255: jjg@255: import static com.sun.tools.classfile.Instruction.Kind.*; jjg@255: import static com.sun.tools.classfile.Opcode.Set.*; jjg@255: jjg@255: /** jjh@972: * See JVMS, chapter 6. jjg@255: * jjg@255: *

In addition to providing all the standard opcodes defined in JVMS, jjg@255: * this class also provides legacy support for the PicoJava extensions. jjg@255: * jjg@581: *

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