summaryrefslogtreecommitdiffstats
path: root/opcode-gen/bytecode.txt
blob: 89b8c83057aba69da8760ab18bc2859a14f650d9 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
# Copyright (C) 2007 The Android Open Source Project
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#      http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

#
# Bytecode definition file
#

# One line per instruction format family. Each line consists of a
# series of instruction formats that all take (potentially) compatible
# arguments. The order is the preferred order (most to least
# preferable) of formats, when more than one opcode could be used for
# a given instruction's arguments.
#
# Note: The family that starts with 12x has a mix of both two- and
# three- register formats. This is because some of the two-register
# opcodes effectively take three, with a destination and two sources
# where the destination and one of the sources have to be the same.

# Regular formats
format 10t 20t 30t
format 10x
format 11n 21s 21h 31i 51l
format 11x
format 12x 22x 23x 32x 33x  # See note, above.
format 21c 31c 41c
format 21t 31t
format 22b 22s 32s
format 22c 52c
format 22t
format 35c 3rc 5rc

# Optimized formats
format 00x 
format 20bc
format 22cs
format 35mi
format 35ms
format 3rmi
format 3rms
format 40sc

# One line per opcode. Columns are:
#   hex for opcode
#   opcode name
#   format
#   has result register; one of:
#     y
#     n
#   index type; one of:
#     unknown -- used for undefined opcodes and breakpoint
#     none
#     varies
#     type-ref
#     string-ref
#     method-ref
#     field-ref
#     inline-method
#     vtable-offset
#     field-offset
#   flags; pipe-combined combo of one or more of:
#     optimized     -- optimized; not to be included in unoptimized dex files
#     branch        -- might branch to an address
#     continue      -- might continue to the next address in sequence
#     switch        -- is a switch
#     throw         -- might throw an exception
#     return        -- is a return from method
#     invoke        -- is a method invoke; this is only used for true
#                      method invokes and notably *not* vm-implemented
#                      execute-inline nor the nop-equivalent
#                      invoke-direct-empty

#
# Regular opcodes (with a couple holes)
#

op   00 nop                         10x  n none          continue
op   01 move                        12x  y none          continue
op   02 move/from16                 22x  y none          continue
op   03 move/16                     32x  y none          continue
op   04 move-wide                   12x  y none          continue
op   05 move-wide/from16            22x  y none          continue
op   06 move-wide/16                32x  y none          continue
op   07 move-object                 12x  y none          continue
op   08 move-object/from16          22x  y none          continue
op   09 move-object/16              32x  y none          continue
op   0a move-result                 11x  y none          continue
op   0b move-result-wide            11x  y none          continue
op   0c move-result-object          11x  y none          continue
op   0d move-exception              11x  y none          continue
op   0e return-void                 10x  n none          return
op   0f return                      11x  n none          return
op   10 return-wide                 11x  n none          return
op   11 return-object               11x  n none          return
op   12 const/4                     11n  y none          continue
op   13 const/16                    21s  y none          continue
op   14 const                       31i  y none          continue
op   15 const/high16                21h  y none          continue
op   16 const-wide/16               21s  y none          continue
op   17 const-wide/32               31i  y none          continue
op   18 const-wide                  51l  y none          continue
op   19 const-wide/high16           21h  y none          continue
op   1a const-string                21c  y string-ref    continue|throw
op   1b const-string/jumbo          31c  y string-ref    continue|throw
op   1c const-class                 21c  y type-ref      continue|throw
op   1d monitor-enter               11x  n none          continue|throw
op   1e monitor-exit                11x  n none          continue|throw
op   1f check-cast                  21c  y type-ref      continue|throw
op   20 instance-of                 22c  y type-ref      continue|throw
op   21 array-length                12x  y none          continue|throw
op   22 new-instance                21c  y type-ref      continue|throw
op   23 new-array                   22c  y type-ref      continue|throw
op   24 filled-new-array            35c  n type-ref      continue|throw
op   25 filled-new-array/range      3rc  n type-ref      continue|throw
op   26 fill-array-data             31t  n none          continue
op   27 throw                       11x  n none          throw
op   28 goto                        10t  n none          branch
op   29 goto/16                     20t  n none          branch
op   2a goto/32                     30t  n none          branch
op   2b packed-switch               31t  n none          continue|switch
op   2c sparse-switch               31t  n none          continue|switch
op   2d cmpl-float                  23x  y none          continue
op   2e cmpg-float                  23x  y none          continue
op   2f cmpl-double                 23x  y none          continue
op   30 cmpg-double                 23x  y none          continue
op   31 cmp-long                    23x  y none          continue
op   32 if-eq                       22t  n none          continue|branch
op   33 if-ne                       22t  n none          continue|branch
op   34 if-lt                       22t  n none          continue|branch
op   35 if-ge                       22t  n none          continue|branch
op   36 if-gt                       22t  n none          continue|branch
op   37 if-le                       22t  n none          continue|branch
op   38 if-eqz                      21t  n none          continue|branch
op   39 if-nez                      21t  n none          continue|branch
op   3a if-ltz                      21t  n none          continue|branch
op   3b if-gez                      21t  n none          continue|branch
op   3c if-gtz                      21t  n none          continue|branch
op   3d if-lez                      21t  n none          continue|branch
# unused: op 3e..43
op   44 aget                        23x  y none          continue|throw
op   45 aget-wide                   23x  y none          continue|throw
op   46 aget-object                 23x  y none          continue|throw
op   47 aget-boolean                23x  y none          continue|throw
op   48 aget-byte                   23x  y none          continue|throw
op   49 aget-char                   23x  y none          continue|throw
op   4a aget-short                  23x  y none          continue|throw
op   4b aput                        23x  n none          continue|throw
op   4c aput-wide                   23x  n none          continue|throw
op   4d aput-object                 23x  n none          continue|throw
op   4e aput-boolean                23x  n none          continue|throw
op   4f aput-byte                   23x  n none          continue|throw
op   50 aput-char                   23x  n none          continue|throw
op   51 aput-short                  23x  n none          continue|throw
op   52 iget                        22c  y field-ref     continue|throw
op   53 iget-wide                   22c  y field-ref     continue|throw
op   54 iget-object                 22c  y field-ref     continue|throw
op   55 iget-boolean                22c  y field-ref     continue|throw
op   56 iget-byte                   22c  y field-ref     continue|throw
op   57 iget-char                   22c  y field-ref     continue|throw
op   58 iget-short                  22c  y field-ref     continue|throw
op   59 iput                        22c  n field-ref     continue|throw
op   5a iput-wide                   22c  n field-ref     continue|throw
op   5b iput-object                 22c  n field-ref     continue|throw
op   5c iput-boolean                22c  n field-ref     continue|throw
op   5d iput-byte                   22c  n field-ref     continue|throw
op   5e iput-char                   22c  n field-ref     continue|throw
op   5f iput-short                  22c  n field-ref     continue|throw
op   60 sget                        21c  y field-ref     continue|throw
op   61 sget-wide                   21c  y field-ref     continue|throw
op   62 sget-object                 21c  y field-ref     continue|throw
op   63 sget-boolean                21c  y field-ref     continue|throw
op   64 sget-byte                   21c  y field-ref     continue|throw
op   65 sget-char                   21c  y field-ref     continue|throw
op   66 sget-short                  21c  y field-ref     continue|throw
op   67 sput                        21c  n field-ref     continue|throw
op   68 sput-wide                   21c  n field-ref     continue|throw
op   69 sput-object                 21c  n field-ref     continue|throw
op   6a sput-boolean                21c  n field-ref     continue|throw
op   6b sput-byte                   21c  n field-ref     continue|throw
op   6c sput-char                   21c  n field-ref     continue|throw
op   6d sput-short                  21c  n field-ref     continue|throw
op   6e invoke-virtual              35c  n method-ref    continue|throw|invoke
op   6f invoke-super                35c  n method-ref    continue|throw|invoke
op   70 invoke-direct               35c  n method-ref    continue|throw|invoke
op   71 invoke-static               35c  n method-ref    continue|throw|invoke
op   72 invoke-interface            35c  n method-ref    continue|throw|invoke
# unused: op 73
op   74 invoke-virtual/range        3rc  n method-ref    continue|throw|invoke
op   75 invoke-super/range          3rc  n method-ref    continue|throw|invoke
op   76 invoke-direct/range         3rc  n method-ref    continue|throw|invoke
op   77 invoke-static/range         3rc  n method-ref    continue|throw|invoke
op   78 invoke-interface/range      3rc  n method-ref    continue|throw|invoke
# unused: op 79..7a
op   7b neg-int                     12x  y none          continue
op   7c not-int                     12x  y none          continue
op   7d neg-long                    12x  y none          continue
op   7e not-long                    12x  y none          continue
op   7f neg-float                   12x  y none          continue
op   80 neg-double                  12x  y none          continue
op   81 int-to-long                 12x  y none          continue
op   82 int-to-float                12x  y none          continue
op   83 int-to-double               12x  y none          continue
op   84 long-to-int                 12x  y none          continue
op   85 long-to-float               12x  y none          continue
op   86 long-to-double              12x  y none          continue
op   87 float-to-int                12x  y none          continue
op   88 float-to-long               12x  y none          continue
op   89 float-to-double             12x  y none          continue
op   8a double-to-int               12x  y none          continue
op   8b double-to-long              12x  y none          continue
op   8c double-to-float             12x  y none          continue
op   8d int-to-byte                 12x  y none          continue
op   8e int-to-char                 12x  y none          continue
op   8f int-to-short                12x  y none          continue
op   90 add-int                     23x  y none          continue
op   91 sub-int                     23x  y none          continue
op   92 mul-int                     23x  y none          continue
op   93 div-int                     23x  y none          continue|throw
op   94 rem-int                     23x  y none          continue|throw
op   95 and-int                     23x  y none          continue
op   96 or-int                      23x  y none          continue
op   97 xor-int                     23x  y none          continue
op   98 shl-int                     23x  y none          continue
op   99 shr-int                     23x  y none          continue
op   9a ushr-int                    23x  y none          continue
op   9b add-long                    23x  y none          continue
op   9c sub-long                    23x  y none          continue
op   9d mul-long                    23x  y none          continue
op   9e div-long                    23x  y none          continue|throw
op   9f rem-long                    23x  y none          continue|throw
op   a0 and-long                    23x  y none          continue
op   a1 or-long                     23x  y none          continue
op   a2 xor-long                    23x  y none          continue
op   a3 shl-long                    23x  y none          continue
op   a4 shr-long                    23x  y none          continue
op   a5 ushr-long                   23x  y none          continue
op   a6 add-float                   23x  y none          continue
op   a7 sub-float                   23x  y none          continue
op   a8 mul-float                   23x  y none          continue
op   a9 div-float                   23x  y none          continue
op   aa rem-float                   23x  y none          continue
op   ab add-double                  23x  y none          continue
op   ac sub-double                  23x  y none          continue
op   ad mul-double                  23x  y none          continue
op   ae div-double                  23x  y none          continue
op   af rem-double                  23x  y none          continue
op   b0 add-int/2addr               12x  y none          continue
op   b1 sub-int/2addr               12x  y none          continue
op   b2 mul-int/2addr               12x  y none          continue
op   b3 div-int/2addr               12x  y none          continue|throw
op   b4 rem-int/2addr               12x  y none          continue|throw
op   b5 and-int/2addr               12x  y none          continue
op   b6 or-int/2addr                12x  y none          continue
op   b7 xor-int/2addr               12x  y none          continue
op   b8 shl-int/2addr               12x  y none          continue
op   b9 shr-int/2addr               12x  y none          continue
op   ba ushr-int/2addr              12x  y none          continue
op   bb add-long/2addr              12x  y none          continue
op   bc sub-long/2addr              12x  y none          continue
op   bd mul-long/2addr              12x  y none          continue
op   be div-long/2addr              12x  y none          continue|throw
op   bf rem-long/2addr              12x  y none          continue|throw
op   c0 and-long/2addr              12x  y none          continue
op   c1 or-long/2addr               12x  y none          continue
op   c2 xor-long/2addr              12x  y none          continue
op   c3 shl-long/2addr              12x  y none          continue
op   c4 shr-long/2addr              12x  y none          continue
op   c5 ushr-long/2addr             12x  y none          continue
op   c6 add-float/2addr             12x  y none          continue
op   c7 sub-float/2addr             12x  y none          continue
op   c8 mul-float/2addr             12x  y none          continue
op   c9 div-float/2addr             12x  y none          continue
op   ca rem-float/2addr             12x  y none          continue
op   cb add-double/2addr            12x  y none          continue
op   cc sub-double/2addr            12x  y none          continue
op   cd mul-double/2addr            12x  y none          continue
op   ce div-double/2addr            12x  y none          continue
op   cf rem-double/2addr            12x  y none          continue
op   d0 add-int/lit16               22s  y none          continue
op   d1 rsub-int                    22s  y none          continue
op   d2 mul-int/lit16               22s  y none          continue
op   d3 div-int/lit16               22s  y none          continue|throw
op   d4 rem-int/lit16               22s  y none          continue|throw
op   d5 and-int/lit16               22s  y none          continue
op   d6 or-int/lit16                22s  y none          continue
op   d7 xor-int/lit16               22s  y none          continue
op   d8 add-int/lit8                22b  y none          continue
op   d9 rsub-int/lit8               22b  y none          continue
op   da mul-int/lit8                22b  y none          continue
op   db div-int/lit8                22b  y none          continue|throw
op   dc rem-int/lit8                22b  y none          continue|throw
op   dd and-int/lit8                22b  y none          continue
op   de or-int/lit8                 22b  y none          continue
op   df xor-int/lit8                22b  y none          continue
op   e0 shl-int/lit8                22b  y none          continue
op   e1 shr-int/lit8                22b  y none          continue
op   e2 ushr-int/lit8               22b  y none          continue

#
# Optimized opcodes (not valid in an unoptimized dex file)
#

op   e3 +iget-volatile              22c  y field-ref     optimized|continue|throw
op   e4 +iput-volatile              22c  n field-ref     optimized|continue|throw
op   e5 +sget-volatile              21c  y field-ref     optimized|continue|throw
op   e6 +sput-volatile              21c  n field-ref     optimized|continue|throw
op   e7 +iget-object-volatile       22c  y field-ref     optimized|continue|throw
op   e8 +iget-wide-volatile         22c  y field-ref     optimized|continue|throw
op   e9 +iput-wide-volatile         22c  n field-ref     optimized|continue|throw
op   ea +sget-wide-volatile         21c  y field-ref     optimized|continue|throw
op   eb +sput-wide-volatile         21c  n field-ref     optimized|continue|throw

# Technically "breakpoint" isn't really an optimized opcode, but it
# fits the label in terms of not being valid in regular dex files.
op   ec ^breakpoint                 00x  n unknown       optimized

op   ed ^throw-verification-error   20bc n varies        optimized|throw
op   ee +execute-inline             35mi n inline-method optimized|continue|throw
op   ef +execute-inline/range       3rmi n inline-method optimized|continue|throw

op   f0 +invoke-object-init/range   35c  n method-ref    optimized|continue|throw|invoke
op   f1 +return-void-barrier        10x  n none          optimized|return
op   f2 +iget-quick                 22cs y field-offset  optimized|continue|throw
op   f3 +iget-wide-quick            22cs y field-offset  optimized|continue|throw
op   f4 +iget-object-quick          22cs y field-offset  optimized|continue|throw
op   f5 +iput-quick                 22cs n field-offset  optimized|continue|throw
op   f6 +iput-wide-quick            22cs n field-offset  optimized|continue|throw
op   f7 +iput-object-quick          22cs n field-offset  optimized|continue|throw
op   f8 +invoke-virtual-quick       35ms n vtable-offset optimized|continue|throw|invoke
op   f9 +invoke-virtual-quick/range 3rms n vtable-offset optimized|continue|throw|invoke
op   fa +invoke-super-quick         35ms n vtable-offset optimized|continue|throw|invoke
op   fb +invoke-super-quick/range   3rms n vtable-offset optimized|continue|throw|invoke
op   fc +iput-object-volatile       22c  n field-ref     optimized|continue|throw
op   fd +sget-object-volatile       21c  y field-ref     optimized|continue|throw
op   fe +sput-object-volatile       21c  n field-ref     optimized|continue|throw

#
# Extended-width opcodes
#

op 00ff const-class/jumbo           41c  y type-ref      continue|throw
op 01ff check-cast/jumbo            41c  n type-ref      continue|throw
op 02ff instance-of/jumbo           52c  y type-ref      continue|throw
op 03ff new-instance/jumbo          41c  y type-ref      continue|throw
op 04ff new-array/jumbo             52c  y type-ref      continue|throw
op 05ff filled-new-array/jumbo      5rc  n type-ref      continue|throw
op 06ff iget/jumbo                  52c  y field-ref     continue|throw
op 07ff iget-wide/jumbo             52c  y field-ref     continue|throw
op 08ff iget-object/jumbo           52c  y field-ref     continue|throw
op 09ff iget-boolean/jumbo          52c  y field-ref     continue|throw
op 0aff iget-byte/jumbo             52c  y field-ref     continue|throw
op 0bff iget-char/jumbo             52c  y field-ref     continue|throw
op 0cff iget-short/jumbo            52c  y field-ref     continue|throw
op 0dff iput/jumbo                  52c  n field-ref     continue|throw
op 0eff iput-wide/jumbo             52c  n field-ref     continue|throw
op 0fff iput-object/jumbo           52c  n field-ref     continue|throw
op 10ff iput-boolean/jumbo          52c  n field-ref     continue|throw
op 11ff iput-byte/jumbo             52c  n field-ref     continue|throw
op 12ff iput-char/jumbo             52c  n field-ref     continue|throw
op 13ff iput-short/jumbo            52c  n field-ref     continue|throw
op 14ff sget/jumbo                  41c  y field-ref     continue|throw
op 15ff sget-wide/jumbo             41c  y field-ref     continue|throw
op 16ff sget-object/jumbo           41c  y field-ref     continue|throw
op 17ff sget-boolean/jumbo          41c  y field-ref     continue|throw
op 18ff sget-byte/jumbo             41c  y field-ref     continue|throw
op 19ff sget-char/jumbo             41c  y field-ref     continue|throw
op 1aff sget-short/jumbo            41c  y field-ref     continue|throw
op 1bff sput/jumbo                  41c  n field-ref     continue|throw
op 1cff sput-wide/jumbo             41c  n field-ref     continue|throw
op 1dff sput-object/jumbo           41c  n field-ref     continue|throw
op 1eff sput-boolean/jumbo          41c  n field-ref     continue|throw
op 1fff sput-byte/jumbo             41c  n field-ref     continue|throw
op 20ff sput-char/jumbo             41c  n field-ref     continue|throw
op 21ff sput-short/jumbo            41c  n field-ref     continue|throw
op 22ff invoke-virtual/jumbo        5rc  n method-ref    continue|throw|invoke
op 23ff invoke-super/jumbo          5rc  n method-ref    continue|throw|invoke
op 24ff invoke-direct/jumbo         5rc  n method-ref    continue|throw|invoke
op 25ff invoke-static/jumbo         5rc  n method-ref    continue|throw|invoke
op 26ff invoke-interface/jumbo      5rc  n method-ref    continue|throw|invoke

# unused: op 27ff..f1ff

#
# Optimized opcodes (not valid in an unoptimized dex file)
#

op f2ff +invoke-object-init/jumbo   5rc  n method-ref    optimized|continue|throw|invoke
op f3ff +iget-volatile/jumbo        52c  y field-ref     optimized|continue|throw
op f4ff +iget-wide-volatile/jumbo   52c  y field-ref     optimized|continue|throw
op f5ff +iget-object-volatile/jumbo 52c  y field-ref     optimized|continue|throw
op f6ff +iput-volatile/jumbo        52c  n field-ref     optimized|continue|throw
op f7ff +iput-wide-volatile/jumbo   52c  n field-ref     optimized|continue|throw
op f8ff +iput-object-volatile/jumbo 52c  n field-ref     optimized|continue|throw
op f9ff +sget-volatile/jumbo        41c  y field-ref     optimized|continue|throw
op faff +sget-wide-volatile/jumbo   41c  y field-ref     optimized|continue|throw
op fbff +sget-object-volatile/jumbo 41c  y field-ref     optimized|continue|throw
op fcff +sput-volatile/jumbo        41c  n field-ref     optimized|continue|throw
op fdff +sput-wide-volatile/jumbo   41c  n field-ref     optimized|continue|throw
op feff +sput-object-volatile/jumbo 41c  n field-ref     optimized|continue|throw
op ffff ^throw-verification-error/jumbo 40sc n varies    optimized|throw