blob: b24e6119a251e6068162e3d2e74da56532dc1e1a (
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
|
# 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 # not in spec; used for undefined opcodes and breakpoint
format 20bc # not in spec; used for throw-verification-error
format 22cs
format 35mi
format 35ms
format 3rmi
format 3rms
# 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
# 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)
#
# Note: Technically "breakpoint" isn't really an optimized opcode, but
# it fits the label in terms of not being valid in dex files.
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
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-direct-empty 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..ffff
|