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