OSDN Git Service

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