Electrical Fire

Design

Primitive Graph Format

Data Layer

Bytecode Mappings

  

The following table lists all bytecodes currently permitted inside portable Java code. The quick bytecodes are not included because they are purely an interpreter optimizations and not permitted inside portable Java code. For each bytecode the table shows the primitive or primitives to which the translator's front end will convert the bytecode.

Notation

The notation Uin represents an incoming data flow edge connected to the source of the integer at index n (index 0 is the top of stack) on the Java stack just before the bytecode. Similarly, Uln represents a data flow edge connected to the source of the long at indices n and n+1 on the Java stack just before the bytecode, Ufn represents the same for a float at index n, Udn represents the same for a double at indices n and n+1, and Uan represents the same for an object reference at index n. n is one of the above, with the kind chosen depending on the context.

The notation Vin represents an outgoing integer data flow edge that produces the integer at index n on the Java stack just after the bytecode. Similarly, Vln represents an outgoing integer data flow edge that produces the long at indices n and n+1 on the Java stack just after the bytecode, Vfn represents the same for a float at index n, Vdn represents the same for a double at indices n and n+1, and Van represents the same for an object reference at index n. n is one of the above, with the kind chosen depending on the context.

If Liv is a target of a primitive, then it represents an outgoing integer data flow edge that produces the integer in the local variable at index v just after the bytecode. If Liv is a source of a primitive, then it represents an incoming integer data flow edge connected to the source of the integer in the local variable at index v just before the bytecode. Lfv and Lav are analogous for float and address local variables. Llv and Ldv are analogous for pairs of local variables that together hold a long or a double.

Tin is an int temporary data flow edge used to construct a bytecode from several connected primitives. Tln, Tan, Tfn, and Tdn are analogous. Tcn is a condition temporary data flow edge, and Ttn is a tuple temporary data flow edge.

Some generated primitives have outgoing edges that are not used. These are represented by Ø.

Constants

The mappings make use of the following constants:

Name 

Value

objectTypeOffset 

Offset from an object's address to its type word.

arrayLengthOffset 

Offset from an array's address to its length word.

arrayEltsOffset 

Offset from an array's address to its first element.

intfIndexTableOffset 

Offset from the beginning of a class object to its field that points to that class's row in the interface index table.

intfAssignableTableOffset 

Offset from the beginning of a class object to its field that points to that class's row in the interface assignability table.

assignableMatchValueOffset 

Offset from the beginning of a class object to its field that contains that class's value in the interface assignability table.

Mappings

Bytecodes

Description

Equivalent Primitives

Hex

Assembly

   00
 
nop No operation.
Deleted.
   01 aconst_null Push nil. 0 = Const.¤ C¤;
or coalesced with a subsequent primitive.
   02 iconst_m1 Push the int -1.
   03 iconst_0 Push the int 0.
   04 iconst_1 Push the int 1.
   05 iconst_2 Push the int 2.
   06 iconst_3 Push the int 3.
   07 iconst_4 Push the int 4.
   08 iconst_5 Push the int 5.
   09 lconst_0 Push the long 0.
   0A lconst_1 Push the long 1.
   0B fconst_0 Push the float 0.0.
   0C fconst_1 Push the float 1.0.
   0D fconst_2 Push the float 2.0.
   0E dconst_0 Push the double 0.0.
   0F dconst_1 Push the double 1.0.
   10 cc
   11 cccc
bipush c
sipush c
Push the int exts(c).
   12 ii
   13 iiii
ldc i
ldc_w i
Push constant table int, float, or string address at index i.
   14 iiii
 
ldc2_w i Push constant table long or double at index i.
   15 vv
C4 15 vvvv
iload v
wide iload v
Push local int variable at index v. Deleted; data flow edges subsume local variable manipulations.
   16 vv
C4 16 vvvv
lload v
wide lload v
Push local long variable at index v.
   17 vv
C4 17 vvvv
fload v
wide fload v
Push local float variable at index v.
   18 vv
C4 18 vvvv
dload v
wide dload v
Push local double variable at index v.
   19 vv
C4 19 vvvv
aload v
wide aload v
Push local address variable at index v.
   1A iload_0 Push local int variable at index 0.
   1B iload_1 Push local int variable at index 1.
   1C iload_2 Push local int variable at index 2.
   1D iload_3 Push local int variable at index 3.
   1E lload_0 Push local long variable at index 0.
   1F lload_1 Push local long variable at index 1.
   20 lload_2 Push local long variable at index 2.
   21 lload_3 Push local long variable at index 3.
   22 fload_0 Push local float variable at index 0.
   23 fload_1 Push local float variable at index 1.
   24 fload_2 Push local float variable at index 2.
   25 fload_3 Push local float variable at index 3.
   26 dload_0 Push local double variable at index 0.
   27 dload_1 Push local double variable at index 1.
   28 dload_2 Push local double variable at index 2.
   29 dload_3 Push local double variable at index 3.
   2A aload_0 Push local address variable at index 0.
   2B aload_1 Push local address variable at index 1.
   2C aload_2 Push local address variable at index 2.
   2D
 
aload_3 Push local address variable at index 3.
   2E iaload Read int array element. exc ChkNull.a Ua1;
Ta0 = Add.a Ua1, arrayLengthOffset;
Ti0 = Ld.i ©, Ta0;
exc Limit.i Ui0, Ti0;
Ti1 = Shl.i Ui0, lgsizeof(¤);
Ta1 = Add.a Ua1, Ti1;
Ta2 = Add.a Ta1, arrayEltsOffset;
0 = Ld[U|S].¤ M, Ta2.
   2F laload Read long array element.
   30 faload Read float array element.
   31 daload Read double array element.
   32 aaload Read object array element.
   33 baload Read signed byte array element.
   34 caload Read char array element.
   35
 
saload Read signed short array element.
   36 vv
C4 36 vvvv
istore v
wide istore v
Pop into local int variable at index v. Deleted; data flow edges subsume local variable manipulations.
   37 vv
C4 37 vvvv
lstore v
wide lstore v
Pop into local long variable at index v.
   38 vv
C4 38 vvvv
fstore v
wide fstore v
Pop into local float variable at index v.
   39 vv
C4 39 vvvv
dstore v
wide dstore v
Pop into local double variable at index v.
   3A vv
C4 3A vvvv
astore v
wide astore v
Pop into local address variable at index v.
   3B istore_0 Pop into local int variable at index 0.
   3C istore_1 Pop into local int variable at index 1.
   3D istore_2 Pop into local int variable at index 2.
   3E istore_3 Pop into local int variable at index 3.
   3F lstore_0 Pop into local long variable at index 0.
   40 lstore_1 Pop into local long variable at index 1.
   41 lstore_2 Pop into local long variable at index 2.
   42 lstore_3 Pop into local long variable at index 3.
   43 fstore_0 Pop into local float variable at index 0.
   44 fstore_1 Pop into local float variable at index 1.
   45 fstore_2 Pop into local float variable at index 2.
   46 fstore_3 Pop into local float variable at index 3.
   47 dstore_0 Pop into local double variable at index 0.
   48 dstore_1 Pop into local double variable at index 1.
   49 dstore_2 Pop into local double variable at index 2.
   4A dstore_3 Pop into local double variable at index 3.
   4B astore_0 Pop into local address variable at index 0.
   4C astore_1 Pop into local address variable at index 1.
   4D astore_2 Pop into local address variable at index 2.
   4E
 
astore_3 Pop into local address variable at index 3.
   4F iastore Write int array element. exc ChkNull.a Ua2;
Ta0 = Add.a Ua2, arrayLengthOffset;
Ti0 = Ld.i ©, Ta0;
exc Limit.i Ui1, Ti0;
[exc Ø = SysCallEC CheckArrayStore, Ua2, Ua0]
Ti1 = Shl.i Ui1, lgsizeof(¤);
Ta1 = Add.a Ua2, Ti1;
Ta2 = Add.a Ta1, arrayEltsOffset;
M' = St.¤ M, Ta2, U¤0.
(If ¤=l or ¤=d then Ua2 is really Ua3 and Ui1 is really Ui2.)
   50 lastore Write long array element.
   51 fastore Write float array element.
   52 dastore Write double float array element.
   53 aastore Write object array element.
   54 bastore Write signed byte array element.
   55 castore Write char array element.
   56
 
sastore Write signed short array element.
   57 pop Pop top stack element. Deleted; data flow edges subsume stack location manipulations.
   58 pop2 Pop top two stack elements.
   59 dup Duplicate top stack element.
   5A dup_x1 Insert copy of top stack element behind second element.
   5B dup_x2 Insert copy of top stack element behind third element.
   5C dup2 Duplicate top two stack elements.
   5D dup2_x1 Insert copies of top two stack elements behind third element.
   5E dup2_x2 Insert copies of top two stack elements behind fourth element.
   5F
 
swap Swap top two stack elements.
   60 iadd Add two ints. Vi0 = Add.i Ui1, Ui0.
   61 ladd Add two longs. Vl0 = Add.l Ul2, Ul0.
   62 fadd Add two floats. Vf0 = FAdd.f Uf1, Uf0.
   63
 
dadd Add two doubles.
Vd0 = FAdd.d Ud2, Ud0.
   64 isub Subtract two ints. Vi0 = Sub.i Ui1, Ui0.
   65 lsub Subtract two longs. Vl0 = Sub.l Ul2, Ul0.
   66 fsub Subtract two floats. Vf0 = FSub.f Uf1, Uf0.
   67
 
dsub Subtract two doubles.
Vd0 = FSub.d Ud2, Ud0.
   68 imul Multiply two ints. Vi0 = Mul.i Ui1, Ui0.
   69 lmul Multiply two longs. Vl0 = Mul.l Ul2, Ul0.
   6A fmul Multiply two floats. Vf0 = FMul.f Uf1, Uf0.
   6B
 
dmul Multiply two doubles.
Vd0 = FMul.d Ud2, Ud0.
   6C idiv Divide two ints. Vi0, E = DivE.i Ui1, Ui0.
   6D ldiv Divide two longs. Vl0, E = DivE.l Ul2, Ul0.
   6E fdiv Divide two floats. Vf0 = FDiv.f Uf1, Uf0.
   6F
 
ddiv Divide two doubles.
Vd0 = FDiv.d Ud2, Ud0.
   70 irem Compute remainder of int division. Vi0, E = ModE.i Ui1, Ui0.
   71 lrem Compute remainder of long division. Vl0, E = ModE.l Ul2, Ul0.
   72 frem Compute remainder of truncated float division. Vf0 = FRem.f Uf1, Uf0.
   73
 
drem Compute remainder of truncated double division.
Vd0 = FRem.d Ud2, Ud0.
   74 ineg Negate an int. Vi0 = Sub.i 0, Ui0.
   75 lneg Negate a long. Vl0 = Sub.l 0, Ul0.
   76 fneg Negate a float. Vf0 = FSub.f -0.0, Uf0.
   77
 
dneg Negate a double.
Vd0 = FSub.d -0.0, Ud0.
   78 ishl Shift int left. Vi0 = Shl.i Ui1, Ui0.
   79 lshl Shift long left. Vl0 = Shl.l Ul1, Ui0.
   7A ishr Arithmetical shift int right. Vi0 = Shr.i Ui1, Ui0.
   7B lshr Arithmetical shift long right. Vl0 = Shr.l Ul1, Ui0.
   7C iushr Logical shift int right. Vi0 = ShrU.i Ui1, Ui0.
   7D
 
lushr Logical shift long right.
Vl0 = ShrU.l Ul1, Ui0.
   7E iand Int bitwise AND. Vi0 = And.i Ui1, Ui0.
   7F
 
land Long bitwise AND.
Vl0 = And.l Ul2, Ul0.
   80 ior Int bitwise OR. Vi0 = Or.i Ui1, Ui0.
   81
 
lor Long bitwise OR.
Vl0 = Or.l Ul2, Ul0.
   82 ixor Int bitwise exclusive OR. Vi0 = Xor.i Ui1, Ui0.
   83
 
lxor Long bitwise exclusive OR.
Vl0 = Xor.l Ul2, Ul0.
   84 vv cc
C4 84 vvvv cccc
 
iinc v,c
wide iinc v,c
Increment local variable at index v by the constant c. Liv = Add.i Liv, Ci.
   85 i2l Convert int to long. Vl0 = ConvL.i Ui0.
   86 i2f Convert int to float. Vf0 = FConvF.i Ui0.
   87
 
i2d Convert int to double.
Vd0 = FConvD.i Ui0.
   88 l2i Convert long to int. Vi0 = ConvI.l Ul0.
   89 l2f Convert long to float. Vf0 = FConvF.l Ul0.
   8A
 
l2d Convert long to double.
Vd0 = FConvD.l Ul0.
   8B f2i Convert float to int. Vi0 = FConvI.f Uf0.
   8C f2l Convert float to long. Vl0 = FConvL.f Uf0.
   8D
 
f2d Convert float to double.
Vd0 = FConvD.f Uf0.
   8E d2i Convert double to int. Vi0 = FConvI.d Ud0.
   8F d2l Convert double to long. Vl0 = FConvL.d Ud0.
   90
 
d2f Convert double to float.
Vf0 = FConvF.d Ud0.
   91 i2b Convert int to signed byte. Vi0 = Ext.i Ui0, 8.
   92 i2c Convert int to char. Vi0 = And.i Ui0, 0xFFFF.
   93
 
i2s Convert int to signed short.
Vi0 = Ext.i Ui0, 16.
   94
 
lcmp Three-way compare of two longs, yielding either -1, 0, or 1.
Tc0 = Cmp.l Ul2, Ul0;
Vi0 = CatL.i Tc0.
   95 fcmpl Three-way float compare; yields -1 on incomparable. Tc0 = FCmp.f Uf1, Uf0;
Vi0 = CatL.i Tc0.
   96 fcmpg Three-way float compare; yields 1 on incomparable. Tc0 = FCmp.f Uf1, Uf0;
Vi0 = CatG.i Tc0.
   97 dcmpl Three-way double compare; yields -1 on incomparable. Tc0 = FCmp.d Uf2, Uf0;
Vi0 = CatL.i Tc0.
   98
 
dcmpg Three-way double compare; yields 1 on incomparable.
Tc0 = FCmp.d Uf2, Uf0;
Vi0 = CatG.i Tc0.
   99 dddd ifeq Go to cnode(§+d) if popped int is zero. Tc0 = Cmp.i Ui0, 0;
ifcond Tc0 goto cnode(§+d) else A;
A:;
where cond is:
 ifeq  Eq
 ifne  Ne
 iflt  Lt
 ifge  Ge
 ifgt  Gt
 ifle  Le
   9A dddd ifne Go to cnode(§+d) if popped int is nonzero.
   9B dddd iflt Go to cnode(§+d) if popped int is less than zero.
   9C dddd ifge Go to cnode(§+d) if popped int is greater than or equal to zero.
   9D dddd ifgt Go to cnode(§+d) if popped int is greater than zero.
   9E dddd
 
ifle Go to cnode(§+d) if popped int is less than or equal to zero.
   9F dddd if_icmpeq Go to cnode(§+d) if two popped ints are equal. Tc0 = Cmp.i Ui1, Ui0;
ifcond Tc0 goto cnode(§+d) else A;
A:;
where cond is:
 if_icmpeq  Eq
 if_icmpne  Ne
 if_icmplt  Lt
 if_icmpge  Ge
 if_icmpgt  Gt
 if_icmple  Le
   A0 dddd if_icmpne Go to cnode(§+d) if two popped ints are not equal.
   A1 dddd if_icmplt Go to cnode(§+d) if second int popped is less than first.
   A2 dddd if_icmpge Go to cnode(§+d) if second int popped is greater than or equal to first.
   A3 dddd if_icmpgt Go to cnode(§+d) if second int popped is greater than first.
   A4 dddd
 
if_icmple Go to cnode(§+d) if second int popped is less than or equal to first.
   A5 dddd if_acmpeq Go to cnode(§+d) if two popped addresses are equal. Tc0 = Cmp.a Ua1, Ua0;
ifcond Tc0 goto cnode(§+d) else A;
A:;
where cond is:
 if_acmpeq  Eq
 if_acmpne  Ne
   A6 dddd
 
if_acmpne Go to cnode(§+d) if two popped addresses are not equal.
   A7 dddd
 
goto Go to cnode(§+d).
Deleted; control flow edges subsume unconditional branches.
   A8 dddd jsr Jump to subroutine at cnode(§+d), pushing the return address on the Java stack. [For now] expanded into inlined subroutine contents.
   A9 vv
C4 A9 vvvv
 
ret v
wide ret v
Return from subroutine, getting return address from local variable at index v.
[For now] deleted when subroutine calls are expanded.
   AA ...
 
tableswitch Dense int switch statement to one of the labels in {dlow, dlow+1, ..., dhigh; default}.
Ti0 = Add.i Ui0, -low;
Tc0 = CmpU.i Ti0, high-low+1;
ifGe Tc0 goto cnode(§+default) else A;
A: switch Ti0 {cnode(§+dlow), cnode(§+dlow+1), ..., cnode(§+dhigh)}.
   AB ...
 
lookupswitch Sparse int switch statement.
Expanded into a tree of if primitives.
   AC ireturn Return int from function. return 0;
followed by a control flow edge to the end node.
   AD lreturn Return long from function.
   AE freturn Return float from function.
   AF dreturn Return double from function.
   B0
 
areturn Return address from function.
   B1
 
return Return from function with no value.
return followed by a control flow edge to the end node.
   B2 iiii getstatic Read static field i. If field is not volatile:
  V¤0 = LdG.¤ M, globalAddr(i).
If field is volatile:
  Tt0 = LdVG.¤ M, globalAddr(i);
  M' = Proj.m Tt0, 0;
  V¤0 = Proj.¤ Tt0, 1.
   B3 iiii
 
putstatic Write static field i. M' = St[V]G.¤ M, globalAddr(i), U¤0.
   B4 iiii
 
getfield Read instance field i.
exc ChkNull.a Ua0;
Ta0 = Add.a Ua0, fieldOffset(i);
then, if field is not volatile:
  V¤0 = Ld.¤ M, Ta0;
or, if field is volatile:
  Tt0 = LdV.¤ M, Ta0;
  M' = Proj.m Tt0, 0;
  V¤0 = Proj.¤ Tt0, 1.
   B5 iiii
 
putfield Write instance field i.
exc ChkNull.a Ua0;
Ta0 = Add.a Ua0, fieldOffset(i);
M' = St[V].¤ M, Ta0, U¤0.
   B6 iiii
 
invokevirtual Call method i using dynamic dispatch.
exc ChkNull.a Uan-1;
Ta0 = Add.a Uan-1, objectTypeOffset;
Ta1 = Ld.a ©, Ta0;
Ta2 = Add.a Ta1, methodVTableOffset(i);
Ta3 = Ld.a ©, Ta2;
exc Tt0 = Call M, Ta3, Uan-1, U¤n-2, ..., U¤0;
M' = Proj.m Tt0, 0;
[0 = Proj.¤ Tt0, 1];
or optimized into an invokespecial-style call.
   B7 iiii
 
invokespecial Call superclass, private, or initialization method i using static dispatch.
exc ChkNull.a Uan-1;
exc Tt0 = Call M, lookupSpecial(i), Uan-1, U¤n-2, ..., U¤0;
M' = Proj.m Tt0, 0;
[0 = Proj.¤ Tt0, 1].
   B8 iiii
 
invokestatic Call static method i.
exc Tt0 = Call M, lookupStatic(i), U¤n-1, U¤n-2, ..., U¤0;
M' = Proj.m Tt0, 0;
[0 = Proj.¤ Tt0, 1].
   B9 iiii nn00 
 
invokeinterface Call interface method i with n arguments.
exc ChkNull.a Uan-1;
Ta0 = Add.a Uan-1, objectTypeOffset;
Ta1 = Ld.a ©, Ta0;
Ta2 = Add.a Ta1, intfIndexTableOffset;
Ta3 = Ld.a ©, Ta2;
Ta4 = Add.a Ta3, interfaceNumber(i)*4;
Ti0 = Ld.i ©, Ta4;
Ta5 = Add.a Ta1, intfMethodVTableOffset(i);
Ta6 = Add.a Ta5, Ti0;
Ta7 = Ld.a ©, Ta6;
exc Tt0 = Call M, Ta7, Uan-1, U¤n-2, ..., U¤0;
M' = Proj.m Tt0, 0;
[0 = Proj.¤ Tt0, 1];
or optimized into an invokevirtual or invokespecial-style call.
   BA
 
unused Illegal instruction
Cause verifier error if this bytecode is encountered in code.
   BB iiii
 
new Create a new object of the given class.
exc Tt0 = SysCallEV New, M, class(i);
M' = Proj.m Tt0, 0;
Va0 = Proj.a Tt0, 1.
   BC tt
 
newarray Create a new array of non-objects.
exc Tt0 = SysCallEV creator, M, Ui0;
M' = Proj.m Tt0, 0;
Va0 = Proj.a Tt0, 1;
where creator is:
 tt
 04  NewBooleanArray
 05  NewCharArray
 06  NewFloatArray
 07  NewDoubleArray
 08  NewByteArray
 09  NewShortArray
 0A  NewIntArray
 0B  NewLongArray
   BD iiii
 
anewarray Create a new array of objects of the given type.
exc Tt0 = SysCallEV NewObjectArray, M, type(i), Ui0;
M' = Proj.m Tt0, 0;
Va0 = Proj.a Tt0, 1.
   BE
 
arraylength Get length of array.
exc ChkNull.a Ua0;
Ta0 = Add.a Ua0, arrayLengthOffset;
Vi0 = Ld.i ©, Ta0.
   BF
 
athrow Throw an exception.
exc ChkNull.a Ua0;
exc Ø = SysCallEC Throw, Ua0.
   C0 iiii
 
checkcast Throw ClassCastException if the object is not of the given type.
If type(i) is Object, don't generate any code. Otherwise:
  Tc0 = Cmp.a Ua0, nil;
  ifEq Tc0 goto B else A;
  A: Ta0 = Add.a Ua0, objectTypeOffset;
  Ta1 = Ld.a ©, Ta0;
  common
  B:;
where common is one of the following:
If type(i) is a final type:
  exc ChkCast.a Ta1, type(i).
Otherwise, if type(i) is a class, or an array of a class, or an array of arrays of a class, or ...:
  Ta2 = Add.a Ta1, nVTableSlotsOffset;
  Ti0 = Ld.i ©, Ta2;
  exc LimCast.a Ti0, nVTableSlots(i);
  Ta3 = Add.a Ta1, selfVTableSlot(i);
  Ta4 = Ld.a ©, Ta3;
  exc ChkCast.a Ta4, type(i).
Otherwise, if type(i) is an interface, or an array of an interface, or an array of arrays of an interface, or ...:
  Ta2 = Add.a Ta1, intfAssignableTableOffset;
  Ta3 = Ld.a ©, Ta2;
  Ta4 = Add.a Ta3, interfaceNumber(i)*2;
  Ti0 = LdU.h ©, Ta4;
  Ta5 = Add.a Ta1, assignableMatchValueOffset;
  Ti1 = LdU.h ©, Ta5;
  exc ChkCast.i Ti0, Ti1.
   C1 iiii
 
instanceof Return true if the object has the given type;
however, always return false if the object is null.
If type(i) is Object:
  Tc0 = Cmp.a Ua0, nil;
  Vi0 = Ne.a Tc0.
Otherwise:
  Tc0 = Cmp.a Ua0, nil;
  ifEq Tc0 goto B else A;
  A: Ta0 = Add.a Ua0, objectTypeOffset;
  Ta1 = Ld.a ©, Ta0;
  common
  goto C;
  B:  Ti1 = 0;
  C:  Vi0 = phi Ti0, Ti1.
where common is one of the following:
If type(i) is a final type:
  Tc1 = Cmp.a Ta1, type(i);
  Ti0 = Eq.i Tc1.
Otherwise, if type(i) is a class, or an array of a class, or an array of arrays of a class, or ...:
  Ta2 = Add.a Ta1, nVTableSlotsOffset;
  Ti2 = Ld.i ©, Ta2;
  Tc1 = Cmp.i Ti2, nVTableSlots(i);
  ifLt Tc1 goto B else C;
  C: Ta3 = Add.a Ta1, selfVTableSlot(i);
  Ta4 = Ld.a ©, Ta3;
  Tc2 = Cmp.a Ta4, type(i);
  Ti0 = Eq.i Tc2.
Otherwise, if type(i) is an interface, or an array of an interface, or an array of arrays of an interface, or ...:
  Ta2 = Add.a Ta1, intfAssignableTableOffset;
  Ta3 = Ld.a ©, Ta2;
  Ta4 = Add.a Ta3, interfaceNumber(i)*2;
  Ti2 = LdU.h ©, Ta4;
  Ta5 = Add.a Ta1, assignableMatchValueOffset;
  Ti3 = LdU.h ©, Ta5;
  Tc1 = Cmp.i Ti2, Ti3;
  Ti0 = Eq.i Tc1.
   C2
 
monitorenter Enter a monitored region of code.
exc ChkNull.a Ua0;
exc M' = MEnter M, Ua0, slot.
   C3
 
monitorexit Exit a monitored region of code.
M' = MExit M, Ua0, slot.
slot must be the slot number of the matching MEnter primitive, determined by static control and data flow analysis.
   C4 ...
 
wide Prefix See descriptions of prefixed bytecodes.
   C5 iiii nn
 
multianewarray Create n-dimensional array.
If n=1, generate code as if for newarray or anewarray.
If n=2, use:
  exc Tt0 = SysCallEV New2DArray, M, type(i), Ui1, Ui0;
  M' = Proj.m Tt0, 0;
  Va0 = Proj.a Tt0, 1.
If n=3, use:
  exc Tt0 = SysCallEV New3DArray, M, type(i), Ui2, Ui1, Ui0;
  M' = Proj.m Tt0, 0;
  Va0 = Proj.a Tt0, 1.
Otherwise, construct a temporary array Ta0 of all the dimensions and call:
  exc Tt0 = SysCallEV NewNDArray, M, type(i), Ta0;
  M' = Proj.m Tt0, 0;
  Va0 = Proj.a Tt0, 1.
   C6 dddd ifnull Go to cnode(§+d) if popped address is null. Tc0 = Cmp.a Ua0, nil;
ifcond Tc0 goto cnode(§+d) else A;
A:;
where cond is:
 ifnull     Eq
 ifnonnull  Ne
   C7 dddd
 
ifnonnull Go to cnode(§+d) if popped address is not null.
   C8 dddddddd
 
goto_w Go to cnode(§+d).
Deleted; control flow edges subsume unconditional branches.
   C9 dddddddd
 
jsr_w Jump to subroutine at cnode(§+d), pushing the return address on the Java stack.
[For now] expanded into inlined subroutine contents.
   CA
 
breakpoint Breakpoint.
M' = Break M.
   CB-FF
 
unused Quick and illegal instructions
Cause verifier error if any of these bytecodes are encountered in code.