Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
PojavLauncherTeam
GitHub Repository: PojavLauncherTeam/mobile
Path: blob/master/src/jdk.jdeps/share/classes/com/sun/tools/classfile/Opcode.java
41161 views
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
26
package com.sun.tools.classfile;
27
28
import static com.sun.tools.classfile.Instruction.Kind.*;
29
import 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
*/
42
public 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
474