• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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
45format 20bc
46format 22cs
47format 35mi
48format 35ms
49format 3rmi
50format 3rms
51format 40sc
52
53# One line per opcode. Columns are:
54#   hex for opcode
55#   opcode name
56#   format
57#   has result register; one of:
58#     y
59#     n
60#   index type; one of:
61#     unknown -- used for undefined opcodes and breakpoint
62#     none
63#     varies
64#     type-ref
65#     string-ref
66#     method-ref
67#     field-ref
68#     inline-method
69#     vtable-offset
70#     field-offset
71#   flags; pipe-combined combo of one or more of:
72#     optimized     -- optimized; not to be included in unoptimized dex files
73#     branch        -- might branch to an address
74#     continue      -- might continue to the next address in sequence
75#     switch        -- is a switch
76#     throw         -- might throw an exception
77#     return        -- is a return from method
78#     invoke        -- is a method invoke; this is only used for true
79#                      method invokes and notably *not* vm-implemented
80#                      execute-inline nor the nop-equivalent
81#                      invoke-direct-empty
82
83#
84# Regular opcodes (with a couple holes)
85#
86
87op   00 nop                         10x  n none          continue
88op   01 move                        12x  y none          continue
89op   02 move/from16                 22x  y none          continue
90op   03 move/16                     32x  y none          continue
91op   04 move-wide                   12x  y none          continue
92op   05 move-wide/from16            22x  y none          continue
93op   06 move-wide/16                32x  y none          continue
94op   07 move-object                 12x  y none          continue
95op   08 move-object/from16          22x  y none          continue
96op   09 move-object/16              32x  y none          continue
97op   0a move-result                 11x  y none          continue
98op   0b move-result-wide            11x  y none          continue
99op   0c move-result-object          11x  y none          continue
100op   0d move-exception              11x  y none          continue
101op   0e return-void                 10x  n none          return
102op   0f return                      11x  n none          return
103op   10 return-wide                 11x  n none          return
104op   11 return-object               11x  n none          return
105op   12 const/4                     11n  y none          continue
106op   13 const/16                    21s  y none          continue
107op   14 const                       31i  y none          continue
108op   15 const/high16                21h  y none          continue
109op   16 const-wide/16               21s  y none          continue
110op   17 const-wide/32               31i  y none          continue
111op   18 const-wide                  51l  y none          continue
112op   19 const-wide/high16           21h  y none          continue
113op   1a const-string                21c  y string-ref    continue|throw
114op   1b const-string/jumbo          31c  y string-ref    continue|throw
115op   1c const-class                 21c  y type-ref      continue|throw
116op   1d monitor-enter               11x  n none          continue|throw
117op   1e monitor-exit                11x  n none          continue|throw
118op   1f check-cast                  21c  y type-ref      continue|throw
119op   20 instance-of                 22c  y type-ref      continue|throw
120op   21 array-length                12x  y none          continue|throw
121op   22 new-instance                21c  y type-ref      continue|throw
122op   23 new-array                   22c  y type-ref      continue|throw
123op   24 filled-new-array            35c  n type-ref      continue|throw
124op   25 filled-new-array/range      3rc  n type-ref      continue|throw
125op   26 fill-array-data             31t  n none          continue
126op   27 throw                       11x  n none          throw
127op   28 goto                        10t  n none          branch
128op   29 goto/16                     20t  n none          branch
129op   2a goto/32                     30t  n none          branch
130op   2b packed-switch               31t  n none          continue|switch
131op   2c sparse-switch               31t  n none          continue|switch
132op   2d cmpl-float                  23x  y none          continue
133op   2e cmpg-float                  23x  y none          continue
134op   2f cmpl-double                 23x  y none          continue
135op   30 cmpg-double                 23x  y none          continue
136op   31 cmp-long                    23x  y none          continue
137op   32 if-eq                       22t  n none          continue|branch
138op   33 if-ne                       22t  n none          continue|branch
139op   34 if-lt                       22t  n none          continue|branch
140op   35 if-ge                       22t  n none          continue|branch
141op   36 if-gt                       22t  n none          continue|branch
142op   37 if-le                       22t  n none          continue|branch
143op   38 if-eqz                      21t  n none          continue|branch
144op   39 if-nez                      21t  n none          continue|branch
145op   3a if-ltz                      21t  n none          continue|branch
146op   3b if-gez                      21t  n none          continue|branch
147op   3c if-gtz                      21t  n none          continue|branch
148op   3d if-lez                      21t  n none          continue|branch
149# unused: op 3e..43
150op   44 aget                        23x  y none          continue|throw
151op   45 aget-wide                   23x  y none          continue|throw
152op   46 aget-object                 23x  y none          continue|throw
153op   47 aget-boolean                23x  y none          continue|throw
154op   48 aget-byte                   23x  y none          continue|throw
155op   49 aget-char                   23x  y none          continue|throw
156op   4a aget-short                  23x  y none          continue|throw
157op   4b aput                        23x  n none          continue|throw
158op   4c aput-wide                   23x  n none          continue|throw
159op   4d aput-object                 23x  n none          continue|throw
160op   4e aput-boolean                23x  n none          continue|throw
161op   4f aput-byte                   23x  n none          continue|throw
162op   50 aput-char                   23x  n none          continue|throw
163op   51 aput-short                  23x  n none          continue|throw
164op   52 iget                        22c  y field-ref     continue|throw
165op   53 iget-wide                   22c  y field-ref     continue|throw
166op   54 iget-object                 22c  y field-ref     continue|throw
167op   55 iget-boolean                22c  y field-ref     continue|throw
168op   56 iget-byte                   22c  y field-ref     continue|throw
169op   57 iget-char                   22c  y field-ref     continue|throw
170op   58 iget-short                  22c  y field-ref     continue|throw
171op   59 iput                        22c  n field-ref     continue|throw
172op   5a iput-wide                   22c  n field-ref     continue|throw
173op   5b iput-object                 22c  n field-ref     continue|throw
174op   5c iput-boolean                22c  n field-ref     continue|throw
175op   5d iput-byte                   22c  n field-ref     continue|throw
176op   5e iput-char                   22c  n field-ref     continue|throw
177op   5f iput-short                  22c  n field-ref     continue|throw
178op   60 sget                        21c  y field-ref     continue|throw
179op   61 sget-wide                   21c  y field-ref     continue|throw
180op   62 sget-object                 21c  y field-ref     continue|throw
181op   63 sget-boolean                21c  y field-ref     continue|throw
182op   64 sget-byte                   21c  y field-ref     continue|throw
183op   65 sget-char                   21c  y field-ref     continue|throw
184op   66 sget-short                  21c  y field-ref     continue|throw
185op   67 sput                        21c  n field-ref     continue|throw
186op   68 sput-wide                   21c  n field-ref     continue|throw
187op   69 sput-object                 21c  n field-ref     continue|throw
188op   6a sput-boolean                21c  n field-ref     continue|throw
189op   6b sput-byte                   21c  n field-ref     continue|throw
190op   6c sput-char                   21c  n field-ref     continue|throw
191op   6d sput-short                  21c  n field-ref     continue|throw
192op   6e invoke-virtual              35c  n method-ref    continue|throw|invoke
193op   6f invoke-super                35c  n method-ref    continue|throw|invoke
194op   70 invoke-direct               35c  n method-ref    continue|throw|invoke
195op   71 invoke-static               35c  n method-ref    continue|throw|invoke
196op   72 invoke-interface            35c  n method-ref    continue|throw|invoke
197# unused: op 73
198op   74 invoke-virtual/range        3rc  n method-ref    continue|throw|invoke
199op   75 invoke-super/range          3rc  n method-ref    continue|throw|invoke
200op   76 invoke-direct/range         3rc  n method-ref    continue|throw|invoke
201op   77 invoke-static/range         3rc  n method-ref    continue|throw|invoke
202op   78 invoke-interface/range      3rc  n method-ref    continue|throw|invoke
203# unused: op 79..7a
204op   7b neg-int                     12x  y none          continue
205op   7c not-int                     12x  y none          continue
206op   7d neg-long                    12x  y none          continue
207op   7e not-long                    12x  y none          continue
208op   7f neg-float                   12x  y none          continue
209op   80 neg-double                  12x  y none          continue
210op   81 int-to-long                 12x  y none          continue
211op   82 int-to-float                12x  y none          continue
212op   83 int-to-double               12x  y none          continue
213op   84 long-to-int                 12x  y none          continue
214op   85 long-to-float               12x  y none          continue
215op   86 long-to-double              12x  y none          continue
216op   87 float-to-int                12x  y none          continue
217op   88 float-to-long               12x  y none          continue
218op   89 float-to-double             12x  y none          continue
219op   8a double-to-int               12x  y none          continue
220op   8b double-to-long              12x  y none          continue
221op   8c double-to-float             12x  y none          continue
222op   8d int-to-byte                 12x  y none          continue
223op   8e int-to-char                 12x  y none          continue
224op   8f int-to-short                12x  y none          continue
225op   90 add-int                     23x  y none          continue
226op   91 sub-int                     23x  y none          continue
227op   92 mul-int                     23x  y none          continue
228op   93 div-int                     23x  y none          continue|throw
229op   94 rem-int                     23x  y none          continue|throw
230op   95 and-int                     23x  y none          continue
231op   96 or-int                      23x  y none          continue
232op   97 xor-int                     23x  y none          continue
233op   98 shl-int                     23x  y none          continue
234op   99 shr-int                     23x  y none          continue
235op   9a ushr-int                    23x  y none          continue
236op   9b add-long                    23x  y none          continue
237op   9c sub-long                    23x  y none          continue
238op   9d mul-long                    23x  y none          continue
239op   9e div-long                    23x  y none          continue|throw
240op   9f rem-long                    23x  y none          continue|throw
241op   a0 and-long                    23x  y none          continue
242op   a1 or-long                     23x  y none          continue
243op   a2 xor-long                    23x  y none          continue
244op   a3 shl-long                    23x  y none          continue
245op   a4 shr-long                    23x  y none          continue
246op   a5 ushr-long                   23x  y none          continue
247op   a6 add-float                   23x  y none          continue
248op   a7 sub-float                   23x  y none          continue
249op   a8 mul-float                   23x  y none          continue
250op   a9 div-float                   23x  y none          continue
251op   aa rem-float                   23x  y none          continue
252op   ab add-double                  23x  y none          continue
253op   ac sub-double                  23x  y none          continue
254op   ad mul-double                  23x  y none          continue
255op   ae div-double                  23x  y none          continue
256op   af rem-double                  23x  y none          continue
257op   b0 add-int/2addr               12x  y none          continue
258op   b1 sub-int/2addr               12x  y none          continue
259op   b2 mul-int/2addr               12x  y none          continue
260op   b3 div-int/2addr               12x  y none          continue|throw
261op   b4 rem-int/2addr               12x  y none          continue|throw
262op   b5 and-int/2addr               12x  y none          continue
263op   b6 or-int/2addr                12x  y none          continue
264op   b7 xor-int/2addr               12x  y none          continue
265op   b8 shl-int/2addr               12x  y none          continue
266op   b9 shr-int/2addr               12x  y none          continue
267op   ba ushr-int/2addr              12x  y none          continue
268op   bb add-long/2addr              12x  y none          continue
269op   bc sub-long/2addr              12x  y none          continue
270op   bd mul-long/2addr              12x  y none          continue
271op   be div-long/2addr              12x  y none          continue|throw
272op   bf rem-long/2addr              12x  y none          continue|throw
273op   c0 and-long/2addr              12x  y none          continue
274op   c1 or-long/2addr               12x  y none          continue
275op   c2 xor-long/2addr              12x  y none          continue
276op   c3 shl-long/2addr              12x  y none          continue
277op   c4 shr-long/2addr              12x  y none          continue
278op   c5 ushr-long/2addr             12x  y none          continue
279op   c6 add-float/2addr             12x  y none          continue
280op   c7 sub-float/2addr             12x  y none          continue
281op   c8 mul-float/2addr             12x  y none          continue
282op   c9 div-float/2addr             12x  y none          continue
283op   ca rem-float/2addr             12x  y none          continue
284op   cb add-double/2addr            12x  y none          continue
285op   cc sub-double/2addr            12x  y none          continue
286op   cd mul-double/2addr            12x  y none          continue
287op   ce div-double/2addr            12x  y none          continue
288op   cf rem-double/2addr            12x  y none          continue
289op   d0 add-int/lit16               22s  y none          continue
290op   d1 rsub-int                    22s  y none          continue
291op   d2 mul-int/lit16               22s  y none          continue
292op   d3 div-int/lit16               22s  y none          continue|throw
293op   d4 rem-int/lit16               22s  y none          continue|throw
294op   d5 and-int/lit16               22s  y none          continue
295op   d6 or-int/lit16                22s  y none          continue
296op   d7 xor-int/lit16               22s  y none          continue
297op   d8 add-int/lit8                22b  y none          continue
298op   d9 rsub-int/lit8               22b  y none          continue
299op   da mul-int/lit8                22b  y none          continue
300op   db div-int/lit8                22b  y none          continue|throw
301op   dc rem-int/lit8                22b  y none          continue|throw
302op   dd and-int/lit8                22b  y none          continue
303op   de or-int/lit8                 22b  y none          continue
304op   df xor-int/lit8                22b  y none          continue
305op   e0 shl-int/lit8                22b  y none          continue
306op   e1 shr-int/lit8                22b  y none          continue
307op   e2 ushr-int/lit8               22b  y none          continue
308
309#
310# Optimized opcodes (not valid in an unoptimized dex file)
311#
312
313op   e3 +iget-volatile              22c  y field-ref     optimized|continue|throw
314op   e4 +iput-volatile              22c  n field-ref     optimized|continue|throw
315op   e5 +sget-volatile              21c  y field-ref     optimized|continue|throw
316op   e6 +sput-volatile              21c  n field-ref     optimized|continue|throw
317op   e7 +iget-object-volatile       22c  y field-ref     optimized|continue|throw
318op   e8 +iget-wide-volatile         22c  y field-ref     optimized|continue|throw
319op   e9 +iput-wide-volatile         22c  n field-ref     optimized|continue|throw
320op   ea +sget-wide-volatile         21c  y field-ref     optimized|continue|throw
321op   eb +sput-wide-volatile         21c  n field-ref     optimized|continue|throw
322
323# Technically "breakpoint" isn't really an optimized opcode, but it
324# fits the label in terms of not being valid in regular dex files.
325op   ec ^breakpoint                 00x  n unknown       optimized
326
327op   ed ^throw-verification-error   20bc n varies        optimized|throw
328op   ee +execute-inline             35mi n inline-method optimized|continue|throw
329op   ef +execute-inline/range       3rmi n inline-method optimized|continue|throw
330
331op   f0 +invoke-object-init/range   35c  n method-ref    optimized|continue|throw|invoke
332op   f1 +return-void-barrier        10x  n none          optimized|return
333op   f2 +iget-quick                 22cs y field-offset  optimized|continue|throw
334op   f3 +iget-wide-quick            22cs y field-offset  optimized|continue|throw
335op   f4 +iget-object-quick          22cs y field-offset  optimized|continue|throw
336op   f5 +iput-quick                 22cs n field-offset  optimized|continue|throw
337op   f6 +iput-wide-quick            22cs n field-offset  optimized|continue|throw
338op   f7 +iput-object-quick          22cs n field-offset  optimized|continue|throw
339op   f8 +invoke-virtual-quick       35ms n vtable-offset optimized|continue|throw|invoke
340op   f9 +invoke-virtual-quick/range 3rms n vtable-offset optimized|continue|throw|invoke
341op   fa +invoke-super-quick         35ms n vtable-offset optimized|continue|throw|invoke
342op   fb +invoke-super-quick/range   3rms n vtable-offset optimized|continue|throw|invoke
343op   fc +iput-object-volatile       22c  n field-ref     optimized|continue|throw
344op   fd +sget-object-volatile       21c  y field-ref     optimized|continue|throw
345op   fe +sput-object-volatile       21c  n field-ref     optimized|continue|throw
346
347#
348# Extended-width opcodes
349#
350
351op 00ff const-class/jumbo           41c  y type-ref      continue|throw
352op 01ff check-cast/jumbo            41c  n type-ref      continue|throw
353op 02ff instance-of/jumbo           52c  y type-ref      continue|throw
354op 03ff new-instance/jumbo          41c  y type-ref      continue|throw
355op 04ff new-array/jumbo             52c  y type-ref      continue|throw
356op 05ff filled-new-array/jumbo      5rc  n type-ref      continue|throw
357op 06ff iget/jumbo                  52c  y field-ref     continue|throw
358op 07ff iget-wide/jumbo             52c  y field-ref     continue|throw
359op 08ff iget-object/jumbo           52c  y field-ref     continue|throw
360op 09ff iget-boolean/jumbo          52c  y field-ref     continue|throw
361op 0aff iget-byte/jumbo             52c  y field-ref     continue|throw
362op 0bff iget-char/jumbo             52c  y field-ref     continue|throw
363op 0cff iget-short/jumbo            52c  y field-ref     continue|throw
364op 0dff iput/jumbo                  52c  n field-ref     continue|throw
365op 0eff iput-wide/jumbo             52c  n field-ref     continue|throw
366op 0fff iput-object/jumbo           52c  n field-ref     continue|throw
367op 10ff iput-boolean/jumbo          52c  n field-ref     continue|throw
368op 11ff iput-byte/jumbo             52c  n field-ref     continue|throw
369op 12ff iput-char/jumbo             52c  n field-ref     continue|throw
370op 13ff iput-short/jumbo            52c  n field-ref     continue|throw
371op 14ff sget/jumbo                  41c  y field-ref     continue|throw
372op 15ff sget-wide/jumbo             41c  y field-ref     continue|throw
373op 16ff sget-object/jumbo           41c  y field-ref     continue|throw
374op 17ff sget-boolean/jumbo          41c  y field-ref     continue|throw
375op 18ff sget-byte/jumbo             41c  y field-ref     continue|throw
376op 19ff sget-char/jumbo             41c  y field-ref     continue|throw
377op 1aff sget-short/jumbo            41c  y field-ref     continue|throw
378op 1bff sput/jumbo                  41c  n field-ref     continue|throw
379op 1cff sput-wide/jumbo             41c  n field-ref     continue|throw
380op 1dff sput-object/jumbo           41c  n field-ref     continue|throw
381op 1eff sput-boolean/jumbo          41c  n field-ref     continue|throw
382op 1fff sput-byte/jumbo             41c  n field-ref     continue|throw
383op 20ff sput-char/jumbo             41c  n field-ref     continue|throw
384op 21ff sput-short/jumbo            41c  n field-ref     continue|throw
385op 22ff invoke-virtual/jumbo        5rc  n method-ref    continue|throw|invoke
386op 23ff invoke-super/jumbo          5rc  n method-ref    continue|throw|invoke
387op 24ff invoke-direct/jumbo         5rc  n method-ref    continue|throw|invoke
388op 25ff invoke-static/jumbo         5rc  n method-ref    continue|throw|invoke
389op 26ff invoke-interface/jumbo      5rc  n method-ref    continue|throw|invoke
390
391# unused: op 27ff..f1ff
392
393#
394# Optimized opcodes (not valid in an unoptimized dex file)
395#
396
397op f2ff +invoke-object-init/jumbo   5rc  n method-ref    optimized|continue|throw|invoke
398op f3ff +iget-volatile/jumbo        52c  y field-ref     optimized|continue|throw
399op f4ff +iget-wide-volatile/jumbo   52c  y field-ref     optimized|continue|throw
400op f5ff +iget-object-volatile/jumbo 52c  y field-ref     optimized|continue|throw
401op f6ff +iput-volatile/jumbo        52c  n field-ref     optimized|continue|throw
402op f7ff +iput-wide-volatile/jumbo   52c  n field-ref     optimized|continue|throw
403op f8ff +iput-object-volatile/jumbo 52c  n field-ref     optimized|continue|throw
404op f9ff +sget-volatile/jumbo        41c  y field-ref     optimized|continue|throw
405op faff +sget-wide-volatile/jumbo   41c  y field-ref     optimized|continue|throw
406op fbff +sget-object-volatile/jumbo 41c  y field-ref     optimized|continue|throw
407op fcff +sput-volatile/jumbo        41c  n field-ref     optimized|continue|throw
408op fdff +sput-wide-volatile/jumbo   41c  n field-ref     optimized|continue|throw
409op feff +sput-object-volatile/jumbo 41c  n field-ref     optimized|continue|throw
410op ffff ^throw-verification-error/jumbo 40sc n varies    optimized|throw
411