Electrical FireDesignPrimitive Graph FormatData LayerBytecode 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.
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. U¤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. V¤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 Ø.
The mappings make use of the following constants:
Name |
Value |
|---|---|
|
Offset from an object's address to its type word. |
|
Offset from an array's address to its length word. |
|
Offset from an array's address to its first element. |
|
Offset from the beginning of a class object to its field that points to that class's row in the interface index table. |
|
Offset from the beginning of a class object to its field that points to that class's row in the interface assignability table. |
|
Offset from the beginning of a class object to its field that contains that class's value in the interface assignability table. |
| Bytecodes | Description |
Equivalent Primitives |
|
|---|---|---|---|
Hex |
Assembly |
||
00 |
nop |
No operation. |
Deleted. |
01 |
aconst_null |
Push nil. |
V¤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 |
bipush c |
Push the int exts(c). | |
12 ii |
ldc 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 |
iload v |
Push local int variable at index v. | Deleted; data flow edges subsume local variable manipulations. |
16 vv |
lload v |
Push local long variable at index v. | |
17 vv |
fload v |
Push local float variable at index v. | |
18 vv |
dload v |
Push local double variable at index v. | |
19 vv |
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;V¤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 |
istore v |
Pop into local int variable at index v. | Deleted; data flow edges subsume local variable manipulations. |
37 vv |
lstore v |
Pop into local long variable at index v. | |
38 vv |
fstore v |
Pop into local float variable at index v. | |
39 vv |
dstore v |
Pop into local double variable at index v. | |
3A vv |
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 |
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;if cond 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;if cond 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;if cond 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 |
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;if Ge 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 U¤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;[V¤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;[V¤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;[V¤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;[V¤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;if Eq 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;if Eq 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);if Lt 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;if cond 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. |