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