Home | History | Annotate | Download | only in 071-dex-java-stack-ops
      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 .class Blort
     16 .super java/lang/Object
     17 
     18 ; Methods to "consume" an int.
     19 .method public static consume1(I)V
     20 .limit stack 0
     21 .limit locals 1
     22     nop
     23     return
     24 .end method
     25 
     26 .method public static consume2(I)V
     27 .limit stack 0
     28 .limit locals 1
     29     nop
     30     return
     31 .end method
     32 
     33 .method public static consume3(I)V
     34 .limit stack 0
     35 .limit locals 1
     36     nop
     37     return
     38 .end method
     39 
     40 .method public static consume4(I)V
     41 .limit stack 0
     42 .limit locals 1
     43     nop
     44     return
     45 .end method
     46 
     47 .method public static consume5(I)V
     48 .limit stack 0
     49 .limit locals 1
     50     nop
     51     return
     52 .end method
     53 
     54 .method public static consume6(I)V
     55 .limit stack 0
     56 .limit locals 1
     57     nop
     58     return
     59 .end method
     60 
     61 ; Methods to "consume" a long.
     62 .method public static consume1(J)V
     63 .limit stack 0
     64 .limit locals 2
     65     nop
     66     return
     67 .end method
     68 
     69 .method public static consume2(J)V
     70 .limit stack 0
     71 .limit locals 2
     72     nop
     73     return
     74 .end method
     75 
     76 .method public static consume3(J)V
     77 .limit stack 0
     78 .limit locals 2
     79     nop
     80     return
     81 .end method
     82 
     83 .method public static consume4(J)V
     84 .limit stack 0
     85 .limit locals 2
     86     nop
     87     return
     88 .end method
     89 
     90 ; Test of "pop" opcode. This should end up causing a call to consume1(0).
     91 .method public static test_pop()V
     92 .limit stack 2
     93 .limit locals 0
     94     iconst_0
     95     iconst_1
     96     pop          ; A1 -> (empty)
     97     invokestatic Blort/consume1(I)V
     98     return
     99 .end method
    100 
    101 ; Test of "pop2" opcode, form 1. This should end up causing a call
    102 ; to consume1(0).
    103 .method public static test_pop2_form1()V
    104 .limit stack 3
    105 .limit locals 0
    106     iconst_0
    107     iconst_1
    108     iconst_2
    109     pop2         ; A1 B1 -> (empty)
    110     invokestatic Blort/consume1(I)V
    111     return
    112 .end method
    113 
    114 ; Test of "pop2" opcode, form 2. This should end up causing a call
    115 ; to consume1(0).
    116 .method public static test_pop2_form2()V
    117 .limit stack 3
    118 .limit locals 0
    119     iconst_0
    120     lconst_0
    121     pop2         ; A2 -> (empty)
    122     invokestatic Blort/consume1(I)V
    123     return
    124 .end method
    125 
    126 ; Test of "dup" opcode. This should end up causing these calls in order:
    127 ; consume1(0), consume2(0).
    128 .method public static test_dup()V
    129 .limit stack 2
    130 .limit locals 0
    131     iconst_0
    132     dup          ; A1 -> A1 A1
    133     invokestatic Blort/consume1(I)V
    134     invokestatic Blort/consume2(I)V
    135     return
    136 .end method
    137 
    138 ; Test of "dup_x1" opcode. This should end up causing these calls in order:
    139 ; consume1(1), consume2(0), consume3(1).
    140 .method public static test_dup_x1()V
    141 .limit stack 3
    142 .limit locals 0
    143     iconst_0
    144     iconst_1
    145     dup_x1       ; A1 B1 -> B1 A1 B1
    146     invokestatic Blort/consume1(I)V
    147     invokestatic Blort/consume2(I)V
    148     invokestatic Blort/consume3(I)V
    149     return
    150 .end method
    151 
    152 ; Test of "dup_x2" opcode, form 1. This should end up causing these calls
    153 ; in order: consume1(2), consume2(1), consume3(0), consume4(2).
    154 .method public static test_dup_x2_form1()V
    155 .limit stack 4
    156 .limit locals 0
    157     iconst_0
    158     iconst_1
    159     iconst_2
    160     dup_x2       ; A1 B1 C1 -> C1 A1 B1 C1
    161     invokestatic Blort/consume1(I)V
    162     invokestatic Blort/consume2(I)V
    163     invokestatic Blort/consume3(I)V
    164     invokestatic Blort/consume4(I)V
    165     return
    166 .end method
    167 
    168 ; Test of "dup_x2" opcode, form 2. This should end up causing these calls
    169 ; in order: consume1(1), consume2(0L), consume3(1).
    170 .method public static test_dup_x2_form2()V
    171 .limit stack 4
    172 .limit locals 0
    173     lconst_0
    174     iconst_1
    175     dup_x2       ; A2 B1 -> B1 A2 B1
    176     invokestatic Blort/consume1(I)V
    177     invokestatic Blort/consume2(J)V
    178     invokestatic Blort/consume3(I)V
    179     return
    180 .end method
    181 
    182 ; Test of "dup2" opcode, form 1. This should end up causing these calls
    183 ; in order: consume1(1), consume2(0), consume3(1), consume4(0).
    184 .method public static test_dup2_form1()V
    185 .limit stack 4
    186 .limit locals 0
    187     iconst_0
    188     iconst_1
    189     dup2         ; A1 B1 -> A1 B1 A1 B1
    190     invokestatic Blort/consume1(I)V
    191     invokestatic Blort/consume2(I)V
    192     invokestatic Blort/consume3(I)V
    193     invokestatic Blort/consume4(I)V
    194     return
    195 .end method
    196 
    197 ; Test of "dup2" opcode, form 2. This should end up causing these calls
    198 ; in order: consume1(0L), consume2(0L).
    199 .method public static test_dup2_form2()V
    200 .limit stack 4
    201 .limit locals 0
    202     lconst_0
    203     dup2         ; A2 -> A2 A2
    204     invokestatic Blort/consume1(J)V
    205     invokestatic Blort/consume2(J)V
    206     return
    207 .end method
    208 
    209 ; Test of "dup2_x1" opcode, form 1. This should end up causing these calls
    210 ; in order: consume1(1), consume2(2), consume3(0), consume4(1), consume5(2).
    211 .method public static test_dup2_x1_form1()V
    212 .limit stack 5
    213 .limit locals 0
    214     iconst_0
    215     iconst_1
    216     iconst_2
    217     dup2_x1      ; A1 B1 C1 -> B1 C1 A1 B1 C1
    218     invokestatic Blort/consume1(I)V
    219     invokestatic Blort/consume2(I)V
    220     invokestatic Blort/consume3(I)V
    221     invokestatic Blort/consume4(I)V
    222     invokestatic Blort/consume5(I)V
    223     return
    224 .end method
    225 
    226 
    227 ; Test of "dup2_x1" opcode, form 2. This should end up causing these calls
    228 ; in order: consume1(1L), consume2(2), consume3(1L).
    229 .method public static test_dup2_x1_form2()V
    230 .limit stack 5
    231 .limit locals 0
    232     iconst_0
    233     lconst_1
    234     dup2_x1      ; A1 B2 -> B2 A1 B2
    235     invokestatic Blort/consume1(J)V
    236     invokestatic Blort/consume2(I)V
    237     invokestatic Blort/consume3(J)V
    238     return
    239 .end method
    240 
    241 ; Test of "dup2_x2" opcode, form 1. This should end up causing these calls
    242 ; in order: consume1(3), consume2(2), consume3(1), consume4(0), consume5(3),
    243 ; consume6(2).
    244 .method public static test_dup2_x2_form1()V
    245 .limit stack 6
    246 .limit locals 0
    247     iconst_0
    248     iconst_1
    249     iconst_2
    250     iconst_3
    251     dup2_x2      ; A1 B1 C1 D1 -> C1 D1 A1 B1 C1 D1
    252     invokestatic Blort/consume1(I)V
    253     invokestatic Blort/consume2(I)V
    254     invokestatic Blort/consume3(I)V
    255     invokestatic Blort/consume4(I)V
    256     invokestatic Blort/consume5(I)V
    257     invokestatic Blort/consume6(I)V
    258     return
    259 .end method
    260 
    261 ; Test of "dup2_x2" opcode, form 2. This should end up causing these calls
    262 ; in order: consume1(2L), consume2(1), consume3(0), consume4(2L).
    263 .method public static test_dup2_x2_form2()V
    264 .limit stack 6
    265 .limit locals 0
    266     iconst_0
    267     iconst_1
    268     ldc2_w 2
    269     dup2_x2      ; A1 B1 C2 -> C2 A1 B1 C2
    270     invokestatic Blort/consume1(J)V
    271     invokestatic Blort/consume2(I)V
    272     invokestatic Blort/consume3(I)V
    273     invokestatic Blort/consume4(J)V
    274     return
    275 .end method
    276 
    277 ; Test of "dup2_x2" opcode, form 3. This should end up causing these calls
    278 ; in order: consume1(2), consume2(1), consume3(0L), consume4(2), consume5(1).
    279 .method public static test_dup2_x2_form3()V
    280 .limit stack 6
    281 .limit locals 0
    282     lconst_0
    283     iconst_1
    284     iconst_2
    285     dup2_x2      ; A2 B1 C1 -> B1 C1 A2 B1 C1
    286     invokestatic Blort/consume1(I)V
    287     invokestatic Blort/consume2(I)V
    288     invokestatic Blort/consume3(J)V
    289     invokestatic Blort/consume4(I)V
    290     invokestatic Blort/consume5(I)V
    291     return
    292 .end method
    293 
    294 ; Test of "dup2_x2" opcode, form 4. This should end up causing these calls
    295 ; in order: consume1(1L), consume2(0L), consume3(1L).
    296 .method public static test_dup2_x2_form4()V
    297 .limit stack 6
    298 .limit locals 0
    299     lconst_0
    300     lconst_1
    301     dup2_x2      ; A2 B2 -> B2 A2 B2
    302     invokestatic Blort/consume1(J)V
    303     invokestatic Blort/consume2(J)V
    304     invokestatic Blort/consume3(J)V
    305     return
    306 .end method
    307 
    308 ; Test of "swap" opcode. This should end up causing these calls
    309 ; in order: consume1(0), consume2(1).
    310 .method public static test_swap()V
    311 .limit stack 2
    312 .limit locals 0
    313     iconst_0
    314     iconst_1
    315     swap         ; A1 B1 -> B1 A1
    316     invokestatic Blort/consume1(I)V
    317     invokestatic Blort/consume2(I)V
    318     return
    319 .end method
    320