bytecode.txt revision 82dbe1c22c6a1088f73f1e11e5cacbdd492ca79d
1# Copyright (C) 2007 The Android Open Source Project
2#
3# Licensed under the Apache License, Version 2.0 (the "License");
4# you may not use this file except in compliance with the License.
5# You may obtain a copy of the License at
6#
7#      http://www.apache.org/licenses/LICENSE-2.0
8#
9# Unless required by applicable law or agreed to in writing, software
10# distributed under the License is distributed on an "AS IS" BASIS,
11# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12# See the License for the specific language governing permissions and
13# limitations under the License.
14
15#
16# Bytecode definition file
17#
18
19# One line per instruction format family. Each line consists of a
20# series of instruction formats that all take (potentially) compatible
21# arguments. The order is the preferred order (most to least
22# preferable) of formats, when more than one opcode could be used for
23# a given instruction's arguments.
24#
25# Note: The family that starts with 12x has a mix of both two- and
26# three- register formats. This is because some of the two-register
27# opcodes effectively take three, with a destination and two sources
28# where the destination and one of the sources have to be the same.
29
30# Regular formats
31format 10t 20t 30t
32format 10x
33format 11n 21s 21h 31i 51l
34format 11x
35format 12x 22x 23x 32x 33x  # See note, above.
36format 21c 31c 41c
37format 21t 31t
38format 22b 22s 32s
39format 22c 52c
40format 22t
41format 35c 3rc 5rc
42
43# Optimized formats
44format 00x  # not in spec; used for breakpoint
45format 20bc # not in spec; used for throw-verification-error
46format 22cs
47format 35mi
48format 35ms
49format 3rmi
50format 3rms
51
52# One line per opcode. Columns are:
53#   hex for opcode
54#   opcode name
55#   format
56#   has result register; one of:
57#     y
58#     n
59#   index type; one of:
60#     none
61#     varies
62#     type-ref
63#     string-ref
64#     method-ref
65#     field-ref
66#     inline-method
67#     vtable-offset
68#     field-offset
69#   flags; pipe-combined combo of one or more of:
70#     optimized     -- optimized; not to be included in unoptimized dex files
71#     branch        -- might branch to an address
72#     continue      -- might continue to the next address in sequence
73#     switch        -- is a switch
74#     throw         -- might throw an exception
75#     return        -- is a return from method
76#     invoke        -- is a method invoke
77
78# Regular opcodes (with a couple holes)
79op   00 nop                        10x  n none          continue
80op   01 move                       12x  y none          continue
81op   02 move/from16                22x  y none          continue
82op   03 move/16                    32x  y none          continue
83op   04 move-wide                  12x  y none          continue
84op   05 move-wide/from16           22x  y none          continue
85op   06 move-wide/16               32x  y none          continue
86op   07 move-object                12x  y none          continue
87op   08 move-object/from16         22x  y none          continue
88op   09 move-object/16             32x  y none          continue
89op   0a move-result                11x  y none          continue
90op   0b move-result-wide           11x  y none          continue
91op   0c move-result-object         11x  y none          continue
92op   0d move-exception             11x  y none          continue
93op   0e return-void                10x  n none          return
94op   0f return                     11x  n none          return
95op   10 return-wide                11x  n none          return
96op   11 return-object              11x  n none          return
97op   12 const/4                    11n  y none          continue
98op   13 const/16                   21s  y none          continue
99op   14 const                      31i  y none          continue
100op   15 const/high16               21h  y none          continue
101op   16 const-wide/16              21s  y none          continue
102op   17 const-wide/32              31i  y none          continue
103op   18 const-wide                 51l  y none          continue
104op   19 const-wide/high16          21h  y none          continue
105op   1a const-string               21c  y string-ref    continue|throw
106op   1b const-string/jumbo         31c  y string-ref    continue|throw
107op   1c const-class                21c  y type-ref      continue|throw
108op   1d monitor-enter              11x  n none          continue|throw
109op   1e monitor-exit               11x  n none          continue|throw
110op   1f check-cast                 21c  y type-ref      continue|throw
111op   20 instance-of                22c  y type-ref      continue|throw
112op   21 array-length               12x  y none          continue|throw
113op   22 new-instance               21c  y type-ref      continue|throw
114op   23 new-array                  22c  y type-ref      continue|throw
115op   24 filled-new-array           35c  n type-ref      continue|throw
116op   25 filled-new-array/range     3rc  n type-ref      continue|throw
117op   26 fill-array-data            31t  n none          continue
118op   27 throw                      11x  n none          throw
119op   28 goto                       10t  n none          branch
120op   29 goto/16                    20t  n none          branch
121op   2a goto/32                    30t  n none          branch
122op   2b packed-switch              31t  n none          continue|switch
123op   2c sparse-switch              31t  n none          continue|switch
124op   2d cmpl-float                 23x  y none          continue
125op   2e cmpg-float                 23x  y none          continue
126op   2f cmpl-double                23x  y none          continue
127op   30 cmpg-double                23x  y none          continue
128op   31 cmp-long                   23x  y none          continue
129op   32 if-eq                      22t  n none          continue|branch
130op   33 if-ne                      22t  n none          continue|branch
131op   34 if-lt                      22t  n none          continue|branch
132op   35 if-ge                      22t  n none          continue|branch
133op   36 if-gt                      22t  n none          continue|branch
134op   37 if-le                      22t  n none          continue|branch
135op   38 if-eqz                     21t  n none          continue|branch
136op   39 if-nez                     21t  n none          continue|branch
137op   3a if-ltz                     21t  n none          continue|branch
138op   3b if-gez                     21t  n none          continue|branch
139op   3c if-gtz                     21t  n none          continue|branch
140op   3d if-lez                     21t  n none          continue|branch
141# unused: op 3e..43
142op   44 aget                       23x  y none          continue|throw
143op   45 aget-wide                  23x  y none          continue|throw
144op   46 aget-object                23x  y none          continue|throw
145op   47 aget-boolean               23x  y none          continue|throw
146op   48 aget-byte                  23x  y none          continue|throw
147op   49 aget-char                  23x  y none          continue|throw
148op   4a aget-short                 23x  y none          continue|throw
149op   4b aput                       23x  n none          continue|throw
150op   4c aput-wide                  23x  n none          continue|throw
151op   4d aput-object                23x  n none          continue|throw
152op   4e aput-boolean               23x  n none          continue|throw
153op   4f aput-byte                  23x  n none          continue|throw
154op   50 aput-char                  23x  n none          continue|throw
155op   51 aput-short                 23x  n none          continue|throw
156op   52 iget                       22c  y field-ref     continue|throw
157op   53 iget-wide                  22c  y field-ref     continue|throw
158op   54 iget-object                22c  y field-ref     continue|throw
159op   55 iget-boolean               22c  y field-ref     continue|throw
160op   56 iget-byte                  22c  y field-ref     continue|throw
161op   57 iget-char                  22c  y field-ref     continue|throw
162op   58 iget-short                 22c  y field-ref     continue|throw
163op   59 iput                       22c  n field-ref     continue|throw
164op   5a iput-wide                  22c  n field-ref     continue|throw
165op   5b iput-object                22c  n field-ref     continue|throw
166op   5c iput-boolean               22c  n field-ref     continue|throw
167op   5d iput-byte                  22c  n field-ref     continue|throw
168op   5e iput-char                  22c  n field-ref     continue|throw
169op   5f iput-short                 22c  n field-ref     continue|throw
170op   60 sget                       21c  y field-ref     continue|throw
171op   61 sget-wide                  21c  y field-ref     continue|throw
172op   62 sget-object                21c  y field-ref     continue|throw
173op   63 sget-boolean               21c  y field-ref     continue|throw
174op   64 sget-byte                  21c  y field-ref     continue|throw
175op   65 sget-char                  21c  y field-ref     continue|throw
176op   66 sget-short                 21c  y field-ref     continue|throw
177op   67 sput                       21c  n field-ref     continue|throw
178op   68 sput-wide                  21c  n field-ref     continue|throw
179op   69 sput-object                21c  n field-ref     continue|throw
180op   6a sput-boolean               21c  n field-ref     continue|throw
181op   6b sput-byte                  21c  n field-ref     continue|throw
182op   6c sput-char                  21c  n field-ref     continue|throw
183op   6d sput-short                 21c  n field-ref     continue|throw
184op   6e invoke-virtual             35c  n method-ref    continue|throw|invoke
185op   6f invoke-super               35c  n method-ref    continue|throw|invoke
186op   70 invoke-direct              35c  n method-ref    continue|throw|invoke
187op   71 invoke-static              35c  n method-ref    continue|throw|invoke
188op   72 invoke-interface           35c  n method-ref    continue|throw|invoke
189# unused: op 73
190op   74 invoke-virtual/range       3rc  n method-ref    continue|throw|invoke
191op   75 invoke-super/range         3rc  n method-ref    continue|throw|invoke
192op   76 invoke-direct/range        3rc  n method-ref    continue|throw|invoke
193op   77 invoke-static/range        3rc  n method-ref    continue|throw|invoke
194op   78 invoke-interface/range     3rc  n method-ref    continue|throw|invoke
195# unused: op 79..7a
196op   7b neg-int                    12x  y none          continue
197op   7c not-int                    12x  y none          continue
198op   7d neg-long                   12x  y none          continue
199op   7e not-long                   12x  y none          continue
200op   7f neg-float                  12x  y none          continue
201op   80 neg-double                 12x  y none          continue
202op   81 int-to-long                12x  y none          continue
203op   82 int-to-float               12x  y none          continue
204op   83 int-to-double              12x  y none          continue
205op   84 long-to-int                12x  y none          continue
206op   85 long-to-float              12x  y none          continue
207op   86 long-to-double             12x  y none          continue
208op   87 float-to-int               12x  y none          continue
209op   88 float-to-long              12x  y none          continue
210op   89 float-to-double            12x  y none          continue
211op   8a double-to-int              12x  y none          continue
212op   8b double-to-long             12x  y none          continue
213op   8c double-to-float            12x  y none          continue
214op   8d int-to-byte                12x  y none          continue
215op   8e int-to-char                12x  y none          continue
216op   8f int-to-short               12x  y none          continue
217op   90 add-int                    23x  y none          continue
218op   91 sub-int                    23x  y none          continue
219op   92 mul-int                    23x  y none          continue
220op   93 div-int                    23x  y none          continue|throw
221op   94 rem-int                    23x  y none          continue|throw
222op   95 and-int                    23x  y none          continue
223op   96 or-int                     23x  y none          continue
224op   97 xor-int                    23x  y none          continue
225op   98 shl-int                    23x  y none          continue
226op   99 shr-int                    23x  y none          continue
227op   9a ushr-int                   23x  y none          continue
228op   9b add-long                   23x  y none          continue
229op   9c sub-long                   23x  y none          continue
230op   9d mul-long                   23x  y none          continue
231op   9e div-long                   23x  y none          continue|throw
232op   9f rem-long                   23x  y none          continue|throw
233op   a0 and-long                   23x  y none          continue
234op   a1 or-long                    23x  y none          continue
235op   a2 xor-long                   23x  y none          continue
236op   a3 shl-long                   23x  y none          continue
237op   a4 shr-long                   23x  y none          continue
238op   a5 ushr-long                  23x  y none          continue
239op   a6 add-float                  23x  y none          continue
240op   a7 sub-float                  23x  y none          continue
241op   a8 mul-float                  23x  y none          continue
242op   a9 div-float                  23x  y none          continue
243op   aa rem-float                  23x  y none          continue
244op   ab add-double                 23x  y none          continue
245op   ac sub-double                 23x  y none          continue
246op   ad mul-double                 23x  y none          continue
247op   ae div-double                 23x  y none          continue
248op   af rem-double                 23x  y none          continue
249op   b0 add-int/2addr              12x  y none          continue
250op   b1 sub-int/2addr              12x  y none          continue
251op   b2 mul-int/2addr              12x  y none          continue
252op   b3 div-int/2addr              12x  y none          continue|throw
253op   b4 rem-int/2addr              12x  y none          continue|throw
254op   b5 and-int/2addr              12x  y none          continue
255op   b6 or-int/2addr               12x  y none          continue
256op   b7 xor-int/2addr              12x  y none          continue
257op   b8 shl-int/2addr              12x  y none          continue
258op   b9 shr-int/2addr              12x  y none          continue
259op   ba ushr-int/2addr             12x  y none          continue
260op   bb add-long/2addr             12x  y none          continue
261op   bc sub-long/2addr             12x  y none          continue
262op   bd mul-long/2addr             12x  y none          continue
263op   be div-long/2addr             12x  y none          continue|throw
264op   bf rem-long/2addr             12x  y none          continue|throw
265op   c0 and-long/2addr             12x  y none          continue
266op   c1 or-long/2addr              12x  y none          continue
267op   c2 xor-long/2addr             12x  y none          continue
268op   c3 shl-long/2addr             12x  y none          continue
269op   c4 shr-long/2addr             12x  y none          continue
270op   c5 ushr-long/2addr            12x  y none          continue
271op   c6 add-float/2addr            12x  y none          continue
272op   c7 sub-float/2addr            12x  y none          continue
273op   c8 mul-float/2addr            12x  y none          continue
274op   c9 div-float/2addr            12x  y none          continue
275op   ca rem-float/2addr            12x  y none          continue
276op   cb add-double/2addr           12x  y none          continue
277op   cc sub-double/2addr           12x  y none          continue
278op   cd mul-double/2addr           12x  y none          continue
279op   ce div-double/2addr           12x  y none          continue
280op   cf rem-double/2addr           12x  y none          continue
281op   d0 add-int/lit16              22s  y none          continue
282op   d1 rsub-int                   22s  y none          continue
283op   d2 mul-int/lit16              22s  y none          continue
284op   d3 div-int/lit16              22s  y none          continue|throw
285op   d4 rem-int/lit16              22s  y none          continue|throw
286op   d5 and-int/lit16              22s  y none          continue
287op   d6 or-int/lit16               22s  y none          continue
288op   d7 xor-int/lit16              22s  y none          continue
289op   d8 add-int/lit8               22b  y none          continue
290op   d9 rsub-int/lit8              22b  y none          continue
291op   da mul-int/lit8               22b  y none          continue
292op   db div-int/lit8               22b  y none          continue|throw
293op   dc rem-int/lit8               22b  y none          continue|throw
294op   dd and-int/lit8               22b  y none          continue
295op   de or-int/lit8                22b  y none          continue
296op   df xor-int/lit8               22b  y none          continue
297op   e0 shl-int/lit8               22b  y none          continue
298op   e1 shr-int/lit8               22b  y none          continue
299op   e2 ushr-int/lit8              22b  y none          continue
300
301# Optimized opcodes (not valid in an unoptimized dex file)
302#
303# Note: Technically "breakpoint" isn't really an optimized opcode, but
304# it fits the label in terms of not being valid in dex files.
305op   e3 iget-volatile              22c  y field-ref     optimized|continue|throw
306op   e4 iput-volatile              22c  n field-ref     optimized|continue|throw
307op   e5 sget-volatile              21c  y field-ref     optimized|continue|throw
308op   e6 sput-volatile              21c  n field-ref     optimized|continue|throw
309op   e7 iget-object-volatile       22c  y field-ref     optimized|continue|throw
310op   e8 iget-wide-volatile         22c  y field-ref     optimized|continue|throw
311op   e9 iput-wide-volatile         22c  n field-ref     optimized|continue|throw
312op   ea sget-wide-volatile         21c  y field-ref     optimized|continue|throw
313op   eb sput-wide-volatile         21c  n field-ref     optimized|continue|throw
314op   ec breakpoint                 00x  n none          optimized|continue|throw
315op   ed throw-verification-error   20bc n varies        optimized|throw
316op   ee execute-inline             35mi n inline-method optimized|continue|throw
317op   ef execute-inline/range       3rmi n inline-method optimized|continue|throw
318op   f0 invoke-direct-empty        35c  n method-ref    optimized|continue|throw|invoke
319op   f1 return-void-barrier        10x  n none          optimized|return
320op   f2 iget-quick                 22cs y field-offset  optimized|continue|throw
321op   f3 iget-wide-quick            22cs y field-offset  optimized|continue|throw
322op   f4 iget-object-quick          22cs y field-offset  optimized|continue|throw
323op   f5 iput-quick                 22cs n field-offset  optimized|continue|throw
324op   f6 iput-wide-quick            22cs n field-offset  optimized|continue|throw
325op   f7 iput-object-quick          22cs n field-offset  optimized|continue|throw
326op   f8 invoke-virtual-quick       35ms n vtable-offset optimized|continue|throw|invoke
327op   f9 invoke-virtual-quick/range 3rms n vtable-offset optimized|continue|throw|invoke
328op   fa invoke-super-quick         35ms n vtable-offset optimized|continue|throw|invoke
329op   fb invoke-super-quick/range   3rms n vtable-offset optimized|continue|throw|invoke
330op   fc iput-object-volatile       22c  n field-ref     optimized|continue|throw
331op   fd sget-object-volatile       21c  y field-ref     optimized|continue|throw
332op   fe sput-object-volatile       21c  n field-ref     optimized|continue|throw
333
334# Extended-width opcodes 
335op 00ff const-class/jumbo          41c  y type-ref      continue|throw
336op 01ff check-cast/jumbo           41c  n type-ref      continue|throw
337op 02ff instance-of/jumbo          52c  y type-ref      continue|throw
338op 03ff new-instance/jumbo         41c  y type-ref      continue|throw
339op 04ff new-array/jumbo            52c  y type-ref      continue|throw
340op 05ff filled-new-array/jumbo     5rc  n type-ref      continue|throw
341op 06ff iget/jumbo                 52c  y field-ref     continue|throw
342op 07ff iget-wide/jumbo            52c  y field-ref     continue|throw
343op 08ff iget-object/jumbo          52c  y field-ref     continue|throw
344op 09ff iget-boolean/jumbo         52c  y field-ref     continue|throw
345op 0aff iget-byte/jumbo            52c  y field-ref     continue|throw
346op 0bff iget-char/jumbo            52c  y field-ref     continue|throw
347op 0cff iget-short/jumbo           52c  y field-ref     continue|throw
348op 0dff iput/jumbo                 52c  n field-ref     continue|throw
349op 0eff iput-wide/jumbo            52c  n field-ref     continue|throw
350op 0fff iput-object/jumbo          52c  n field-ref     continue|throw
351op 10ff iput-boolean/jumbo         52c  n field-ref     continue|throw
352op 11ff iput-byte/jumbo            52c  n field-ref     continue|throw
353op 12ff iput-char/jumbo            52c  n field-ref     continue|throw
354op 13ff iput-short/jumbo           52c  n field-ref     continue|throw
355op 14ff sget/jumbo                 41c  y field-ref     continue|throw
356op 15ff sget-wide/jumbo            41c  y field-ref     continue|throw
357op 16ff sget-object/jumbo          41c  y field-ref     continue|throw
358op 17ff sget-boolean/jumbo         41c  y field-ref     continue|throw
359op 18ff sget-byte/jumbo            41c  y field-ref     continue|throw
360op 19ff sget-char/jumbo            41c  y field-ref     continue|throw
361op 1aff sget-short/jumbo           41c  y field-ref     continue|throw
362op 1bff sput/jumbo                 41c  n field-ref     continue|throw
363op 1cff sput-wide/jumbo            41c  n field-ref     continue|throw
364op 1dff sput-object/jumbo          41c  n field-ref     continue|throw
365op 1eff sput-boolean/jumbo         41c  n field-ref     continue|throw
366op 1fff sput-byte/jumbo            41c  n field-ref     continue|throw
367op 20ff sput-char/jumbo            41c  n field-ref     continue|throw
368op 21ff sput-short/jumbo           41c  n field-ref     continue|throw
369op 22ff invoke-virtual/jumbo       5rc  n method-ref    continue|throw|invoke
370op 23ff invoke-super/jumbo         5rc  n method-ref    continue|throw|invoke
371op 24ff invoke-direct/jumbo        5rc  n method-ref    continue|throw|invoke
372op 25ff invoke-static/jumbo        5rc  n method-ref    continue|throw|invoke
373op 26ff invoke-interface/jumbo     5rc  n method-ref    continue|throw|invoke
374# unused: op 27ff..ffff
375