| /* |
| * 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 } |
| } |