Path: blob/master/src/jdk.jdeps/share/classes/com/sun/tools/classfile/Opcode.java
41161 views
/*1* Copyright (c) 2009, 2012, Oracle and/or its affiliates. All rights reserved.2* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.3*4* This code is free software; you can redistribute it and/or modify it5* under the terms of the GNU General Public License version 2 only, as6* published by the Free Software Foundation. Oracle designates this7* particular file as subject to the "Classpath" exception as provided8* by Oracle in the LICENSE file that accompanied this code.9*10* This code is distributed in the hope that it will be useful, but WITHOUT11* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or12* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License13* version 2 for more details (a copy is included in the LICENSE file that14* accompanied this code).15*16* You should have received a copy of the GNU General Public License version17* 2 along with this work; if not, write to the Free Software Foundation,18* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.19*20* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA21* or visit www.oracle.com if you need additional information or have any22* questions.23*/2425package com.sun.tools.classfile;2627import static com.sun.tools.classfile.Instruction.Kind.*;28import static com.sun.tools.classfile.Opcode.Set.*;2930/**31* See JVMS, chapter 6.32*33* <p>In addition to providing all the standard opcodes defined in JVMS,34* this class also provides legacy support for the PicoJava extensions.35*36* <p><b>This is NOT part of any supported API.37* If you write code that depends on this, you do so at your own risk.38* This code and its internal interfaces are subject to change or39* deletion without notice.</b>40*/41public enum Opcode {42NOP(0x0),43ACONST_NULL(0x1),44ICONST_M1(0x2),45ICONST_0(0x3),46ICONST_1(0x4),47ICONST_2(0x5),48ICONST_3(0x6),49ICONST_4(0x7),50ICONST_5(0x8),51LCONST_0(0x9),52LCONST_1(0xa),53FCONST_0(0xb),54FCONST_1(0xc),55FCONST_2(0xd),56DCONST_0(0xe),57DCONST_1(0xf),58BIPUSH(0x10, BYTE),59SIPUSH(0x11, SHORT),60LDC(0x12, CPREF),61LDC_W(0x13, CPREF_W),62LDC2_W(0x14, CPREF_W),63ILOAD(0x15, LOCAL),64LLOAD(0x16, LOCAL),65FLOAD(0x17, LOCAL),66DLOAD(0x18, LOCAL),67ALOAD(0x19, LOCAL),68ILOAD_0(0x1a),69ILOAD_1(0x1b),70ILOAD_2(0x1c),71ILOAD_3(0x1d),72LLOAD_0(0x1e),73LLOAD_1(0x1f),74LLOAD_2(0x20),75LLOAD_3(0x21),76FLOAD_0(0x22),77FLOAD_1(0x23),78FLOAD_2(0x24),79FLOAD_3(0x25),80DLOAD_0(0x26),81DLOAD_1(0x27),82DLOAD_2(0x28),83DLOAD_3(0x29),84ALOAD_0(0x2a),85ALOAD_1(0x2b),86ALOAD_2(0x2c),87ALOAD_3(0x2d),88IALOAD(0x2e),89LALOAD(0x2f),90FALOAD(0x30),91DALOAD(0x31),92AALOAD(0x32),93BALOAD(0x33),94CALOAD(0x34),95SALOAD(0x35),96ISTORE(0x36, LOCAL),97LSTORE(0x37, LOCAL),98FSTORE(0x38, LOCAL),99DSTORE(0x39, LOCAL),100ASTORE(0x3a, LOCAL),101ISTORE_0(0x3b),102ISTORE_1(0x3c),103ISTORE_2(0x3d),104ISTORE_3(0x3e),105LSTORE_0(0x3f),106LSTORE_1(0x40),107LSTORE_2(0x41),108LSTORE_3(0x42),109FSTORE_0(0x43),110FSTORE_1(0x44),111FSTORE_2(0x45),112FSTORE_3(0x46),113DSTORE_0(0x47),114DSTORE_1(0x48),115DSTORE_2(0x49),116DSTORE_3(0x4a),117ASTORE_0(0x4b),118ASTORE_1(0x4c),119ASTORE_2(0x4d),120ASTORE_3(0x4e),121IASTORE(0x4f),122LASTORE(0x50),123FASTORE(0x51),124DASTORE(0x52),125AASTORE(0x53),126BASTORE(0x54),127CASTORE(0x55),128SASTORE(0x56),129POP(0x57),130POP2(0x58),131DUP(0x59),132DUP_X1(0x5a),133DUP_X2(0x5b),134DUP2(0x5c),135DUP2_X1(0x5d),136DUP2_X2(0x5e),137SWAP(0x5f),138IADD(0x60),139LADD(0x61),140FADD(0x62),141DADD(0x63),142ISUB(0x64),143LSUB(0x65),144FSUB(0x66),145DSUB(0x67),146IMUL(0x68),147LMUL(0x69),148FMUL(0x6a),149DMUL(0x6b),150IDIV(0x6c),151LDIV(0x6d),152FDIV(0x6e),153DDIV(0x6f),154IREM(0x70),155LREM(0x71),156FREM(0x72),157DREM(0x73),158INEG(0x74),159LNEG(0x75),160FNEG(0x76),161DNEG(0x77),162ISHL(0x78),163LSHL(0x79),164ISHR(0x7a),165LSHR(0x7b),166IUSHR(0x7c),167LUSHR(0x7d),168IAND(0x7e),169LAND(0x7f),170IOR(0x80),171LOR(0x81),172IXOR(0x82),173LXOR(0x83),174IINC(0x84, LOCAL_BYTE),175I2L(0x85),176I2F(0x86),177I2D(0x87),178L2I(0x88),179L2F(0x89),180L2D(0x8a),181F2I(0x8b),182F2L(0x8c),183F2D(0x8d),184D2I(0x8e),185D2L(0x8f),186D2F(0x90),187I2B(0x91),188I2C(0x92),189I2S(0x93),190LCMP(0x94),191FCMPL(0x95),192FCMPG(0x96),193DCMPL(0x97),194DCMPG(0x98),195IFEQ(0x99, BRANCH),196IFNE(0x9a, BRANCH),197IFLT(0x9b, BRANCH),198IFGE(0x9c, BRANCH),199IFGT(0x9d, BRANCH),200IFLE(0x9e, BRANCH),201IF_ICMPEQ(0x9f, BRANCH),202IF_ICMPNE(0xa0, BRANCH),203IF_ICMPLT(0xa1, BRANCH),204IF_ICMPGE(0xa2, BRANCH),205IF_ICMPGT(0xa3, BRANCH),206IF_ICMPLE(0xa4, BRANCH),207IF_ACMPEQ(0xa5, BRANCH),208IF_ACMPNE(0xa6, BRANCH),209GOTO(0xa7, BRANCH),210JSR(0xa8, BRANCH),211RET(0xa9, LOCAL),212TABLESWITCH(0xaa, DYNAMIC),213LOOKUPSWITCH(0xab, DYNAMIC),214IRETURN(0xac),215LRETURN(0xad),216FRETURN(0xae),217DRETURN(0xaf),218ARETURN(0xb0),219RETURN(0xb1),220GETSTATIC(0xb2, CPREF_W),221PUTSTATIC(0xb3, CPREF_W),222GETFIELD(0xb4, CPREF_W),223PUTFIELD(0xb5, CPREF_W),224INVOKEVIRTUAL(0xb6, CPREF_W),225INVOKESPECIAL(0xb7, CPREF_W),226INVOKESTATIC(0xb8, CPREF_W),227INVOKEINTERFACE(0xb9, CPREF_W_UBYTE_ZERO),228INVOKEDYNAMIC(0xba, CPREF_W_UBYTE_ZERO),229NEW(0xbb, CPREF_W),230NEWARRAY(0xbc, ATYPE),231ANEWARRAY(0xbd, CPREF_W),232ARRAYLENGTH(0xbe),233ATHROW(0xbf),234CHECKCAST(0xc0, CPREF_W),235INSTANCEOF(0xc1, CPREF_W),236MONITORENTER(0xc2),237MONITOREXIT(0xc3),238// wide 0xc4239MULTIANEWARRAY(0xc5, CPREF_W_UBYTE),240IFNULL(0xc6, BRANCH),241IFNONNULL(0xc7, BRANCH),242GOTO_W(0xc8, BRANCH_W),243JSR_W(0xc9, BRANCH_W),244// impdep 0xfe: PicoJava nonpriv245// impdep 0xff: Picojava priv246247// wide opcodes248ILOAD_W(0xc415, WIDE_LOCAL),249LLOAD_W(0xc416, WIDE_LOCAL),250FLOAD_W(0xc417, WIDE_LOCAL),251DLOAD_W(0xc418, WIDE_LOCAL),252ALOAD_W(0xc419, WIDE_LOCAL),253ISTORE_W(0xc436, WIDE_LOCAL),254LSTORE_W(0xc437, WIDE_LOCAL),255FSTORE_W(0xc438, WIDE_LOCAL),256DSTORE_W(0xc439, WIDE_LOCAL),257ASTORE_W(0xc43a, WIDE_LOCAL),258IINC_W(0xc484, WIDE_LOCAL_SHORT),259RET_W(0xc4a9, WIDE_LOCAL),260261// PicoJava nonpriv instructions262LOAD_UBYTE(PICOJAVA, 0xfe00),263LOAD_BYTE(PICOJAVA, 0xfe01),264LOAD_CHAR(PICOJAVA, 0xfe02),265LOAD_SHORT(PICOJAVA, 0xfe03),266LOAD_WORD(PICOJAVA, 0xfe04),267RET_FROM_SUB(PICOJAVA, 0xfe05),268LOAD_CHAR_OE(PICOJAVA, 0xfe0a),269LOAD_SHORT_OE(PICOJAVA, 0xfe0b),270LOAD_WORD_OE(PICOJAVA, 0xfe0c),271NCLOAD_UBYTE(PICOJAVA, 0xfe10),272NCLOAD_BYTE(PICOJAVA, 0xfe11),273NCLOAD_CHAR(PICOJAVA, 0xfe12),274NCLOAD_SHORT(PICOJAVA, 0xfe13),275NCLOAD_WORD(PICOJAVA, 0xfe14),276NCLOAD_CHAR_OE(PICOJAVA, 0xfe1a),277NCLOAD_SHORT_OE(PICOJAVA, 0xfe1b),278NCLOAD_WORD_OE(PICOJAVA, 0xfe1c),279CACHE_FLUSH(PICOJAVA, 0xfe1e),280STORE_BYTE(PICOJAVA, 0xfe20),281STORE_SHORT(PICOJAVA, 0xfe22),282STORE_WORD(PICOJAVA, 0xfe24),283STORE_SHORT_OE(PICOJAVA, 0xfe2a),284STORE_WORD_OE(PICOJAVA, 0xfe2c),285NCSTORE_BYTE(PICOJAVA, 0xfe30),286NCSTORE_SHORT(PICOJAVA, 0xfe32),287NCSTORE_WORD(PICOJAVA, 0xfe34),288NCSTORE_SHORT_OE(PICOJAVA, 0xfe3a),289NCSTORE_WORD_OE(PICOJAVA, 0xfe3c),290ZERO_LINE(PICOJAVA, 0xfe3e),291ENTER_SYNC_METHOD(PICOJAVA, 0xfe3f),292293// PicoJava priv instructions294PRIV_LOAD_UBYTE(PICOJAVA, 0xff00),295PRIV_LOAD_BYTE(PICOJAVA, 0xff01),296PRIV_LOAD_CHAR(PICOJAVA, 0xff02),297PRIV_LOAD_SHORT(PICOJAVA, 0xff03),298PRIV_LOAD_WORD(PICOJAVA, 0xff04),299PRIV_RET_FROM_TRAP(PICOJAVA, 0xff05),300PRIV_READ_DCACHE_TAG(PICOJAVA, 0xff06),301PRIV_READ_DCACHE_DATA(PICOJAVA, 0xff07),302PRIV_LOAD_CHAR_OE(PICOJAVA, 0xff0a),303PRIV_LOAD_SHORT_OE(PICOJAVA, 0xff0b),304PRIV_LOAD_WORD_OE(PICOJAVA, 0xff0c),305PRIV_READ_ICACHE_TAG(PICOJAVA, 0xff0e),306PRIV_READ_ICACHE_DATA(PICOJAVA, 0xff0f),307PRIV_NCLOAD_UBYTE(PICOJAVA, 0xff10),308PRIV_NCLOAD_BYTE(PICOJAVA, 0xff11),309PRIV_NCLOAD_CHAR(PICOJAVA, 0xff12),310PRIV_NCLOAD_SHORT(PICOJAVA, 0xff13),311PRIV_NCLOAD_WORD(PICOJAVA, 0xff14),312PRIV_POWERDOWN(PICOJAVA, 0xff16),313PRIV_READ_SCACHE_DATA(PICOJAVA, 0xff17),314PRIV_NCLOAD_CHAR_OE(PICOJAVA, 0xff1a),315PRIV_NCLOAD_SHORT_OE(PICOJAVA, 0xff1b),316PRIV_NCLOAD_WORD_OE(PICOJAVA, 0xff1c),317PRIV_CACHE_FLUSH(PICOJAVA, 0xff1e),318PRIV_CACHE_INDEX_FLUSH(PICOJAVA, 0xff1f),319PRIV_STORE_BYTE(PICOJAVA, 0xff20),320PRIV_STORE_SHORT(PICOJAVA, 0xff22),321PRIV_STORE_WORD(PICOJAVA, 0xff24),322PRIV_WRITE_DCACHE_TAG(PICOJAVA, 0xff26),323PRIV_WRITE_DCACHE_DATA(PICOJAVA, 0xff27),324PRIV_STORE_SHORT_OE(PICOJAVA, 0xff2a),325PRIV_STORE_WORD_OE(PICOJAVA, 0xff2c),326PRIV_WRITE_ICACHE_TAG(PICOJAVA, 0xff2e),327PRIV_WRITE_ICACHE_DATA(PICOJAVA, 0xff2f),328PRIV_NCSTORE_BYTE(PICOJAVA, 0xff30),329PRIV_NCSTORE_SHORT(PICOJAVA, 0xff32),330PRIV_NCSTORE_WORD(PICOJAVA, 0xff34),331PRIV_RESET(PICOJAVA, 0xff36),332PRIV_WRITE_SCACHE_DATA(PICOJAVA, 0xff37),333PRIV_NCSTORE_SHORT_OE(PICOJAVA, 0xff3a),334PRIV_NCSTORE_WORD_OE(PICOJAVA, 0xff3c),335PRIV_ZERO_LINE(PICOJAVA, 0xff3e),336PRIV_READ_REG_0(PICOJAVA, 0xff40),337PRIV_READ_REG_1(PICOJAVA, 0xff41),338PRIV_READ_REG_2(PICOJAVA, 0xff42),339PRIV_READ_REG_3(PICOJAVA, 0xff43),340PRIV_READ_REG_4(PICOJAVA, 0xff44),341PRIV_READ_REG_5(PICOJAVA, 0xff45),342PRIV_READ_REG_6(PICOJAVA, 0xff46),343PRIV_READ_REG_7(PICOJAVA, 0xff47),344PRIV_READ_REG_8(PICOJAVA, 0xff48),345PRIV_READ_REG_9(PICOJAVA, 0xff49),346PRIV_READ_REG_10(PICOJAVA, 0xff4a),347PRIV_READ_REG_11(PICOJAVA, 0xff4b),348PRIV_READ_REG_12(PICOJAVA, 0xff4c),349PRIV_READ_REG_13(PICOJAVA, 0xff4d),350PRIV_READ_REG_14(PICOJAVA, 0xff4e),351PRIV_READ_REG_15(PICOJAVA, 0xff4f),352PRIV_READ_REG_16(PICOJAVA, 0xff50),353PRIV_READ_REG_17(PICOJAVA, 0xff51),354PRIV_READ_REG_18(PICOJAVA, 0xff52),355PRIV_READ_REG_19(PICOJAVA, 0xff53),356PRIV_READ_REG_20(PICOJAVA, 0xff54),357PRIV_READ_REG_21(PICOJAVA, 0xff55),358PRIV_READ_REG_22(PICOJAVA, 0xff56),359PRIV_READ_REG_23(PICOJAVA, 0xff57),360PRIV_READ_REG_24(PICOJAVA, 0xff58),361PRIV_READ_REG_25(PICOJAVA, 0xff59),362PRIV_READ_REG_26(PICOJAVA, 0xff5a),363PRIV_READ_REG_27(PICOJAVA, 0xff5b),364PRIV_READ_REG_28(PICOJAVA, 0xff5c),365PRIV_READ_REG_29(PICOJAVA, 0xff5d),366PRIV_READ_REG_30(PICOJAVA, 0xff5e),367PRIV_READ_REG_31(PICOJAVA, 0xff5f),368PRIV_WRITE_REG_0(PICOJAVA, 0xff60),369PRIV_WRITE_REG_1(PICOJAVA, 0xff61),370PRIV_WRITE_REG_2(PICOJAVA, 0xff62),371PRIV_WRITE_REG_3(PICOJAVA, 0xff63),372PRIV_WRITE_REG_4(PICOJAVA, 0xff64),373PRIV_WRITE_REG_5(PICOJAVA, 0xff65),374PRIV_WRITE_REG_6(PICOJAVA, 0xff66),375PRIV_WRITE_REG_7(PICOJAVA, 0xff67),376PRIV_WRITE_REG_8(PICOJAVA, 0xff68),377PRIV_WRITE_REG_9(PICOJAVA, 0xff69),378PRIV_WRITE_REG_10(PICOJAVA, 0xff6a),379PRIV_WRITE_REG_11(PICOJAVA, 0xff6b),380PRIV_WRITE_REG_12(PICOJAVA, 0xff6c),381PRIV_WRITE_REG_13(PICOJAVA, 0xff6d),382PRIV_WRITE_REG_14(PICOJAVA, 0xff6e),383PRIV_WRITE_REG_15(PICOJAVA, 0xff6f),384PRIV_WRITE_REG_16(PICOJAVA, 0xff70),385PRIV_WRITE_REG_17(PICOJAVA, 0xff71),386PRIV_WRITE_REG_18(PICOJAVA, 0xff72),387PRIV_WRITE_REG_19(PICOJAVA, 0xff73),388PRIV_WRITE_REG_20(PICOJAVA, 0xff74),389PRIV_WRITE_REG_21(PICOJAVA, 0xff75),390PRIV_WRITE_REG_22(PICOJAVA, 0xff76),391PRIV_WRITE_REG_23(PICOJAVA, 0xff77),392PRIV_WRITE_REG_24(PICOJAVA, 0xff78),393PRIV_WRITE_REG_25(PICOJAVA, 0xff79),394PRIV_WRITE_REG_26(PICOJAVA, 0xff7a),395PRIV_WRITE_REG_27(PICOJAVA, 0xff7b),396PRIV_WRITE_REG_28(PICOJAVA, 0xff7c),397PRIV_WRITE_REG_29(PICOJAVA, 0xff7d),398PRIV_WRITE_REG_30(PICOJAVA, 0xff7e),399PRIV_WRITE_REG_31(PICOJAVA, 0xff7f);400401Opcode(int opcode) {402this(STANDARD, opcode, NO_OPERANDS);403}404405Opcode(int opcode, Instruction.Kind kind) {406this(STANDARD, opcode, kind);407}408409Opcode(Set set, int opcode) {410this(set, opcode, (set == STANDARD ? NO_OPERANDS : WIDE_NO_OPERANDS));411}412413Opcode(Set set, int opcode, Instruction.Kind kind) {414this.set = set;415this.opcode = opcode;416this.kind = kind;417}418419public final Set set;420public final int opcode;421public final Instruction.Kind kind;422423/** Get the Opcode for a simple standard 1-byte opcode. */424public static Opcode get(int opcode) {425return stdOpcodes[opcode];426}427428/** Get the Opcode for 1- or 2-byte opcode. */429public static Opcode get(int opcodePrefix, int opcode) {430Opcode[] block = getOpcodeBlock(opcodePrefix);431return (block == null ? null : block[opcode]);432}433434private static Opcode[] getOpcodeBlock(int opcodePrefix) {435switch (opcodePrefix) {436case 0:437return stdOpcodes;438case WIDE:439return wideOpcodes;440case NONPRIV:441return nonPrivOpcodes;442case PRIV:443return privOpcodes;444default:445return null;446}447448}449450private static final Opcode[] stdOpcodes = new Opcode[256];451private static final Opcode[] wideOpcodes = new Opcode[256];452private static final Opcode[] nonPrivOpcodes = new Opcode[256];453private static final Opcode[] privOpcodes = new Opcode[256];454static {455for (Opcode o: values())456getOpcodeBlock(o.opcode >> 8)[o.opcode & 0xff] = o;457}458459/** The byte prefix for the wide instructions. */460public static final int WIDE = 0xc4;461/** The byte prefix for the PicoJava nonpriv instructions. */462public static final int NONPRIV = 0xfe;463/** The byte prefix for the PicoJava priv instructions. */464public static final int PRIV = 0xff;465466public enum Set {467/** Standard opcodes. */468STANDARD,469/** Legacy support for PicoJava opcodes. */470PICOJAVA }471}472473474