blob: db546070ac66dc5538f98c302e459bc04554928c [file] [log] [blame]
# Copyright 1994-2007 Sun Microsystems, Inc. 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. Sun designates this
# particular file as subject to the "Classpath" exception as provided
# by Sun 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
# CA 95054 USA or visit www.sun.com if you need additional information or
# have any questions.
#
# Any line that doesn't have a-z in the 1st column is a comment.
#
# The first column is the name of the opcodes. The second column is the
# total length of the instruction. We use 99 for tableswitch and
# tablelookup, which must always be treated as special cases.
#
# The third and fourth colum give what the opcode pops off the stack, and
# what it then pushes back onto the stack
# - <no effect on stack>
# I integer
# L long integer
# F float
# D double float
# A address [array or object]
# O object only
# R return address (for jsr)
# a integer, array, or object
# ? unknown
# [I], [L], [F], [D], [A], [B], [C], [?]
# array of integer, long, float, double, address, bytes,
# chars, or anything
# 1,2,3,4,+ used by stack duplicating/popping routines.
#
# 1,2,3,4 represent >>any<< stack type except long or double. Two numbers
# separated by a + (in the third column) indicate that the two, together, can
# be used for a double or long. (Or they can represent two non-long items).
#
# The fifth column provides an *approximate* relative cost of executing the
# opcode. It is used by the instruction profiler. See profiler.h for
# blurb.
nop 1 - - 1 /* nop */
aconst_null 1 - A 1 /* push null object */
iconst_m1 1 - I 1 /* push integer constant -1 */
iconst_0 1 - I 1 /* push integer constant 0 */
iconst_1 1 - I 1 /* push integer constant 1 */
iconst_2 1 - I 1 /* push integer constant 2 */
iconst_3 1 - I 1 /* push integer constant 3 */
iconst_4 1 - I 1 /* push integer constant 4 */
iconst_5 1 - I 1 /* push integer constant 5 */
lconst_0 1 - L 1 /* push long 0L */
lconst_1 1 - L 1 /* push long 1L */
fconst_0 1 - F 1 /* push float constant 0.0 */
fconst_1 1 - F 1 /* push float constant 1.0 */
fconst_2 1 - F 1 /* push float constant 2.0 */
dconst_0 1 - D 1 /* push double float constant 0.0d */
dconst_1 1 - D 1 /* push double float constant 1.0d */
bipush 2 - I 1 /* push byte-sized value */
sipush 3 - I 1 /* push two-byte value */
ldc 2 - ? 1 /* load a const from constant table */
ldc_w 3 - ? 1
ldc2_w 3 - ? 1 /* load a 2-word constant . . . */
iload 2 - I 1 /* load local integer variable */
lload 2 - L 1 /* load local long variable */
fload 2 - F 1 /* load local floating variable */
dload 2 - D 1 /* load local double variable */
aload 2 - A 1 /* load local object variable */
iload_0 1 - I 1 /* load local integer variable #0 */
iload_1 1 - I 1 /* load local integer variable #1 */
iload_2 1 - I 1 /* load local integer variable #2 */
iload_3 1 - I 1 /* load local integer variable #3 */
lload_0 1 - L 1 /* load local long variable #0 */
lload_1 1 - L 1 /* load local long variable #1 */
lload_2 1 - L 1 /* load local long variable #2 */
lload_3 1 - L 1 /* load local long variable #3 */
fload_0 1 - F 1 /* load local float variable #0 */
fload_1 1 - F 1 /* load local float variable #1 */
fload_2 1 - F 1 /* load local float variable #2 */
fload_3 1 - F 1 /* load local float variable #3 */
dload_0 1 - D 1 /* load lcl double float variable #0 */
dload_1 1 - D 1 /* load lcl double float variable #1 */
dload_2 1 - D 1 /* load lcl double float variable #2 */
dload_3 1 - D 1 /* load lcl double float variable #3 */
aload_0 1 - A 1 /* load local object variable #0 */
aload_1 1 - A 1 /* load local object variable #1 */
aload_2 1 - A 1 /* load local object variable #2 */
aload_3 1 - A 1 /* load local object variable #3 */
iaload 1 [I]I I 1 /* load from array of integer */
laload 1 [L]I L 1 /* load from array of long */
faload 1 [F]I F 1 /* load from array of float */
daload 1 [D]I D 1 /* load from array of double */
aaload 1 [A]I A 1 /* load from array of object */
baload 1 [B]I I 1 /* load from array of (signed) bytes */
caload 1 [C]I I 1 /* load from array of chars */
saload 1 [S]I I 1 /* load from array of (signed) shorts */
istore 2 I - 1 /* store local integer variable */
lstore 2 L - 1 /* store local long variable */
fstore 2 F - 1 /* store local float variable */
dstore 2 D - 1 /* store local double variable */
astore 2 A - 1 /* store local object variable */
istore_0 1 I - 1 /* store local integer variable #0 */
istore_1 1 I - 1 /* store local integer variable #1 */
istore_2 1 I - 1 /* store local integer variable #2 */
istore_3 1 I - 1 /* store local integer variable #3 */
lstore_0 1 L - 1 /* store local long variable #0 */
lstore_1 1 L - 1 /* store local long variable #1 */
lstore_2 1 L - 1 /* store local long variable #2 */
lstore_3 1 L - 1 /* store local long variable #3 */
fstore_0 1 F - 1 /* store local float variable #0 */
fstore_1 1 F - 1 /* store local float variable #1 */
fstore_2 1 F - 1 /* store local float variable #2 */
fstore_3 1 F - 1 /* store local float variable #3 */
dstore_0 1 D - 1 /* store lcl double float variable #0 */
dstore_1 1 D - 1 /* store lcl double float variable #1 */
dstore_2 1 D - 1 /* store lcl double float variable #2 */
dstore_3 1 D - 1 /* store lcl double float variable #3 */
astore_0 1 A - 1 /* store local object variable #0 */
astore_1 1 A - 1 /* store local object variable #1 */
astore_2 1 A - 1 /* store local object variable #2 */
astore_3 1 A - 1 /* store local object variable #3 */
iastore 1 [I]II - 1 /* store into array of int */
lastore 1 [L]IL - 1 /* store into array of long */
fastore 1 [F]IF - 1 /* store into array of float */
dastore 1 [D]ID - 1 /* store into array of double float */
aastore 1 [A]IA - 1 /* store into array of object */
bastore 1 [B]II - 1 /* store into array of (signed) bytes */
castore 1 [C]II - 1 /* store into array of chars */
sastore 1 [S]II - 1 /* store into array of (signed) shorts*/
pop 1 1 - 1 /* pop top element */
pop2 1 2+1 - 1 /* pop top two elements */
dup 1 1 11 1 /* dup top element */
dup_x1 1 21 121 1 /* dup top element. Skip one */
dup_x2 1 3+21 1321 1 /* dup top element. Skip two */
dup2 1 2+1 2121 1 /* dup top two elements. */
dup2_x1 1 32+1 21321 1 /* dup top two elements. Skip one */
dup2_x2 1 4+32+1 214321 1 /* dup top two elements. Skip two */
swap 1 21 12 1 /* swap top two elements of stack. */
iadd 1 II I 1 /* integer add */
ladd 1 LL L 1 /* long add */
fadd 1 FF F 1 /* floating add */
dadd 1 DD D 1 /* double float add */
isub 1 II I 1 /* integer subtract */
lsub 1 LL L 1 /* long subtract */
fsub 1 FF F 1 /* floating subtract */
dsub 1 DD D 1 /* floating double subtract */
imul 1 II I 1 /* integer multiply */
lmul 1 LL L 1 /* long multiply */
fmul 1 FF F 1 /* floating multiply */
dmul 1 DD D 1 /* double float multiply */
idiv 1 II I 1 /* integer divide */
ldiv 1 LL L 1 /* long divide */
fdiv 1 FF F 1 /* floating divide */
ddiv 1 DD D 1 /* double float divide */
irem 1 II I 1 /* integer mod */
lrem 1 LL L 1 /* long mod */
frem 1 FF F 1 /* floating mod */
drem 1 DD D 1 /* double float mod */
ineg 1 I I 1 /* integer negate */
lneg 1 L L 1 /* long negate */
fneg 1 F F 1 /* floating negate */
dneg 1 D D 1 /* double float negate */
ishl 1 II I 1 /* shift left */
lshl 1 LI L 1 /* long shift left */
ishr 1 II I 1 /* shift right */
lshr 1 LI L 1 /* long shift right */
iushr 1 II I 1 /* unsigned shift right */
lushr 1 LI L 1 /* long unsigned shift right */
iand 1 II I 1 /* boolean and */
land 1 LL L 1 /* long boolean and */
ior 1 II I 1 /* boolean or */
lor 1 LL L 1 /* long boolean or */
ixor 1 II I 1 /* boolean xor */
lxor 1 LL L 1 /* long boolean xor */
iinc 3 - - 1 /* increment lcl variable by constant */
i2l 1 I L 1 /* integer to long */
i2f 1 I F 1 /* integer to float */
i2d 1 I D 1 /* integer to double */
l2i 1 L I 1 /* long to integer */
l2f 1 L F 1 /* long to float */
l2d 1 L D 1 /* long to double */
f2i 1 F I 1 /* float to integer */
f2l 1 F L 1 /* float to long */
f2d 1 F D 1 /* float to double */
d2i 1 D I 1 /* double to integer */
d2l 1 D L 1 /* double to long */
d2f 1 D F 1 /* double to float */
i2b 1 I I 1 /* integer to byte */
i2c 1 I I 1 /* integer to character */
i2s 1 I I 1 /* integer to signed short */
lcmp 1 LL I 1 /* long compare */
fcmpl 1 FF I 1 /* float compare. -1 on incomparable */
fcmpg 1 FF I 1 /* float compare. 1 on incomparable */
dcmpl 1 DD I 1 /* dbl floating cmp. -1 on incomp */
dcmpg 1 DD I 1 /* dbl floating cmp. 1 on incomp */
ifeq 3 I - 1 /* goto if equal */
ifne 3 I - 1 /* goto if not equal */
iflt 3 I - 1 /* goto if less than */
ifge 3 I - 1 /* goto if greater than or equal */
ifgt 3 I - 1 /* goto if greater than */
ifle 3 I - 1 /* goto if less than or equal */
if_icmpeq 3 II - 1 /* compare top two elements of stack */
if_icmpne 3 II - 1 /* compare top two elements of stack */
if_icmplt 3 II - 1 /* compare top two elements of stack */
if_icmpge 3 II - 1 /* compare top two elements of stack */
if_icmpgt 3 II - 1 /* compare top two elements of stack */
if_icmple 3 II - 1 /* compare top two elements of stack */
if_acmpeq 3 AA - 1 /* compare top two objects of stack */
if_acmpne 3 AA - 1 /* compare top two objects of stack */
goto 3 - - 1 /* unconditional goto */
jsr 3 - R 1 /* jump subroutine */
ret 2 - - 1 /* return from subroutine */
tableswitch 99 I - 1 /* goto (case) */
lookupswitch 99 I - 1 /* goto (case) */
ireturn 1 I - 1 /* return integer from procedure */
lreturn 1 L - 1 /* return long from procedure */
freturn 1 F - 1 /* return float from procedure */
dreturn 1 D - 1 /* return double from procedure */
areturn 1 A - 1 /* return object from procedure */
return 1 - - 1 /* return (void) from procedure */
getstatic 3 - ? 1 /* get static field value. */
putstatic 3 ? - 1 /* assign static field value */
getfield 3 A ? 1 /* get field value from object. */
putfield 3 ? - 1 /* assign field value to object. */
invokevirtual 3 ? ? 1 /* call method, based on object. */
invokespecial 3 ? ? 1 /* call method, not based on object. */
invokestatic 3 ? ? 1 /* call a static method. */
invokeinterface 5 ? ? 1 /* call an interface method */
xxxunusedxxx 0 ? ? 1 /* was newfromname */
new 3 - A 1 /* Create a new object */
newarray 2 I A 1 /* Create a new array of non-objects*/
anewarray 3 I A 1 /* Create a new array of objects */
arraylength 1 [?] I 1 /* get length of array */
athrow 1 O - 1 /* throw an exception */
checkcast 3 A A 1 /* error if object not of given type */
instanceof 3 A I 1 /* is object of given type? */
monitorenter 1 A - 1 /* enter a monitored region of code */
monitorexit 1 A - 1 /* exit a monitored region of code */
wide 0 - - 1 /* prefix operation. */
multianewarray 4 ? A 1 /* create multidimensional array */
ifnull 3 A - 1 /* goto if null */
ifnonnull 3 A - 1 /* goto if not null */
# The following instructions are "long" versions. They allow access to
# variables with index greater than 255.
goto_w 5 - - 1 /* unconditional goto. 4byte offset */
jsr_w 5 - R 1 /* jump subroutine. 4byte offset */
breakpoint 1 - - 1 /* call breakpoint handler */
# The compiler will not generate any of the following instructions. That
# are created by the interpreter from the non _quick versions of the
# instructions.
ldc_quick 2 - ? 1
ldc_w_quick 3 - ? 1
ldc2_w_quick 3 - ? 1
getfield_quick 3 A ? 1
putfield_quick 3 ? - 1
getfield2_quick 3 A ? 1
putfield2_quick 3 ? - 1
getstatic_quick 3 - ? 1
putstatic_quick 3 ? - 1
getstatic2_quick 3 - ? 1
putstatic2_quick 3 ? _ 1
invokevirtual_quick 3 ? ? 1
invokenonvirtual_quick 3 ? ? 1
invokesuper_quick 3 ? ? 1
invokestatic_quick 3 ? ? 1
invokeinterface_quick 5 ? ? 1
invokevirtualobject_quick 3 ? ? 1
invokeignored_quick 3 ? ? 1
new_quick 3 - A 1
anewarray_quick 3 I A 1
multianewarray_quick 4 ? A 1
checkcast_quick 3 A A 1
instanceof_quick 3 A I 1
# The following are generated when the offset is bigger than 255
invokevirtual_quick_w 3 ? ? 1
getfield_quick_w 3 A ? 1
putfield_quick_w 3 ? - 1
# used for simplification
nonnull_quick 1 A - 1 /* throw exception if stacktop null */