Home | History | Annotate | Download | only in src
      1 /*
      2  * Copyright (C) 2007 The Android Open Source Project
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 
     17 /**
     18  * Test switch() blocks
     19  */
     20 public class Main {
     21 
     22     // TODO: This should be translated to smali tests, so it is guaranteed we have the right kind
     23     //       of switch.
     24 
     25     // Simple packed-switch.
     26     public static void packedSwitch(int value) {
     27         switch (value) {
     28             case 0:
     29                 System.out.println("0"); break;
     30             case 1:
     31                 System.out.println("1"); break;
     32             case 2:
     33                 System.out.println("2"); break;
     34             case 3:
     35                 System.out.println("3"); break;
     36             case 4:
     37                 System.out.println("4"); break;
     38             default:
     39                 System.out.println("default"); break;
     40         }
     41     }
     42 
     43     // Simple packed-switch starting at a negative index.
     44     public static void packedSwitch2(int value) {
     45         switch (value) {
     46             case -3:
     47                 System.out.println("-3"); break;
     48             case -2:
     49                 System.out.println("-2"); break;
     50             case -1:
     51                 System.out.println("-1"); break;
     52             case 0:
     53                 System.out.println("0"); break;
     54             case 1:
     55                 System.out.println("1"); break;
     56             case 2:
     57                 System.out.println("2"); break;
     58             default:
     59                 System.out.println("default"); break;
     60         }
     61     }
     62 
     63     // Simple packed-switch starting above 0.
     64     public static void packedSwitch3(int value) {
     65         switch (value) {
     66             case 2:
     67                 System.out.println("2"); break;
     68             case 3:
     69                 System.out.println("3"); break;
     70             case 4:
     71                 System.out.println("4"); break;
     72             case 5:
     73                 System.out.println("5"); break;
     74             case 6:
     75                 System.out.println("6"); break;
     76             default:
     77                 System.out.println("default"); break;
     78         }
     79     }
     80 
     81     // Simple packed-switch going up to max_int.
     82     public static void packedSwitch4(int value) {
     83         switch (value) {
     84             case Integer.MAX_VALUE - 1:
     85                 System.out.println(Integer.MAX_VALUE - 1); break;
     86             case Integer.MAX_VALUE:
     87                 System.out.println(Integer.MAX_VALUE); break;
     88             default:
     89                 System.out.println("default"); break;
     90         }
     91     }
     92 
     93     // Simple packed-switch starting at min_int.
     94     public static void packedSwitch5(int value) {
     95         switch (value) {
     96             case Integer.MIN_VALUE:
     97                 System.out.println(Integer.MIN_VALUE); break;
     98             case Integer.MIN_VALUE + 1:
     99                 System.out.println(Integer.MIN_VALUE + 1); break;
    100             default:
    101                 System.out.println("default"); break;
    102         }
    103     }
    104 
    105     // Simple (packed-)switch with only min_int.
    106     public static void packedSwitch6(int value) {
    107         switch (value) {
    108             case Integer.MIN_VALUE:
    109                 System.out.println(Integer.MIN_VALUE); break;
    110             default:
    111                 System.out.println("default"); break;
    112         }
    113     }
    114 
    115     // Long packed-switch that might lead to not creating chained-ifs.
    116     public static long packedSwitch7(int value) {
    117         switch (value) {
    118             case 1:
    119                 System.out.println(1); break;
    120             case 2:
    121                 System.out.println(2); break;
    122             case 3:
    123                 System.out.println(3); break;
    124             case 4:
    125                 System.out.println(4); break;
    126             case 5:
    127                 System.out.println(5); break;
    128             case 6:
    129                 System.out.println(6); break;
    130             case 7:
    131                 System.out.println(7); break;
    132             case 8:
    133                 System.out.println(8); break;
    134             case 9:
    135                 System.out.println(9); break;
    136             case 10:
    137                 System.out.println(10); break;
    138             case 11:
    139                 System.out.println(11); break;
    140             case 12:
    141                 System.out.println(12); break;
    142             case 13:
    143                 System.out.println(13); break;
    144             case 14:
    145                 System.out.println(14); break;
    146             case 15:
    147                 System.out.println(15); break;
    148             default:
    149                 System.out.println("default"); break;
    150         }
    151 
    152         // Jump tables previously were emitted in the end of the method code buffer. The
    153         // following boilerplate code aims to fill the emitted code buffer extensively
    154         // and check that even for big method jump table is correctly emitted, its address
    155         // is within a range of corresponded pc-relative instructions (this applies to
    156         // ARM mainly).
    157         long temp = value;
    158         temp = Long.rotateLeft(temp, value);
    159         temp = Long.rotateLeft(temp, value);
    160         temp = Long.rotateLeft(temp, value);
    161         temp = Long.rotateLeft(temp, value);
    162         temp = Long.rotateLeft(temp, value);
    163         temp = Long.rotateLeft(temp, value);
    164         temp = Long.rotateLeft(temp, value);
    165         temp = Long.rotateLeft(temp, value);
    166         temp = Long.rotateLeft(temp, value);
    167         temp = Long.rotateLeft(temp, value);
    168         temp = Long.rotateLeft(temp, value);
    169         temp = Long.rotateLeft(temp, value);
    170         temp = Long.rotateLeft(temp, value);
    171         temp = Long.rotateLeft(temp, value);
    172         temp = Long.rotateLeft(temp, value);
    173         temp = Long.rotateLeft(temp, value);
    174         temp = Long.rotateLeft(temp, value);
    175         temp = Long.rotateLeft(temp, value);
    176         temp = Long.rotateLeft(temp, value);
    177         temp = Long.rotateLeft(temp, value);
    178         temp = Long.rotateLeft(temp, value);
    179         temp = Long.rotateLeft(temp, value);
    180         temp = Long.rotateLeft(temp, value);
    181         temp = Long.rotateLeft(temp, value);
    182         temp = Long.rotateLeft(temp, value);
    183         temp = Long.rotateLeft(temp, value);
    184         temp = Long.rotateLeft(temp, value);
    185         temp = Long.rotateLeft(temp, value);
    186         temp = Long.rotateLeft(temp, value);
    187         temp = Long.rotateLeft(temp, value);
    188         temp = Long.rotateLeft(temp, value);
    189         temp = Long.rotateLeft(temp, value);
    190         temp = Long.rotateLeft(temp, value);
    191         temp = Long.rotateLeft(temp, value);
    192         temp = Long.rotateLeft(temp, value);
    193         temp = Long.rotateLeft(temp, value);
    194         temp = Long.rotateLeft(temp, value);
    195         temp = Long.rotateLeft(temp, value);
    196         temp = Long.rotateLeft(temp, value);
    197         temp = Long.rotateLeft(temp, value);
    198         temp = Long.rotateLeft(temp, value);
    199         temp = Long.rotateLeft(temp, value);
    200         temp = Long.rotateLeft(temp, value);
    201         temp = Long.rotateLeft(temp, value);
    202         temp = Long.rotateLeft(temp, value);
    203         temp = Long.rotateLeft(temp, value);
    204         temp = Long.rotateLeft(temp, value);
    205         temp = Long.rotateLeft(temp, value);
    206         temp = Long.rotateLeft(temp, value);
    207         temp = Long.rotateLeft(temp, value);
    208         temp = Long.rotateLeft(temp, value);
    209         temp = Long.rotateLeft(temp, value);
    210         temp = Long.rotateLeft(temp, value);
    211         temp = Long.rotateLeft(temp, value);
    212         temp = Long.rotateLeft(temp, value);
    213         temp = Long.rotateLeft(temp, value);
    214         temp = Long.rotateLeft(temp, value);
    215         temp = Long.rotateLeft(temp, value);
    216         temp = Long.rotateLeft(temp, value);
    217         temp = Long.rotateLeft(temp, value);
    218         temp = Long.rotateLeft(temp, value);
    219         temp = Long.rotateLeft(temp, value);
    220         temp = Long.rotateLeft(temp, value);
    221         temp = Long.rotateLeft(temp, value);
    222         temp = Long.rotateLeft(temp, value);
    223         temp = Long.rotateLeft(temp, value);
    224         temp = Long.rotateLeft(temp, value);
    225         temp = Long.rotateLeft(temp, value);
    226         temp = Long.rotateLeft(temp, value);
    227         temp = Long.rotateLeft(temp, value);
    228         temp = Long.rotateLeft(temp, value);
    229         temp = Long.rotateLeft(temp, value);
    230         temp = Long.rotateLeft(temp, value);
    231         temp = Long.rotateLeft(temp, value);
    232         temp = Long.rotateLeft(temp, value);
    233         temp = Long.rotateLeft(temp, value);
    234         temp = Long.rotateLeft(temp, value);
    235         temp = Long.rotateLeft(temp, value);
    236         temp = Long.rotateLeft(temp, value);
    237         temp = Long.rotateLeft(temp, value);
    238         temp = Long.rotateLeft(temp, value);
    239         temp = Long.rotateLeft(temp, value);
    240         temp = Long.rotateLeft(temp, value);
    241         temp = Long.rotateLeft(temp, value);
    242         temp = Long.rotateLeft(temp, value);
    243         temp = Long.rotateLeft(temp, value);
    244         temp = Long.rotateLeft(temp, value);
    245         temp = Long.rotateLeft(temp, value);
    246         temp = Long.rotateLeft(temp, value);
    247         temp = Long.rotateLeft(temp, value);
    248         temp = Long.rotateLeft(temp, value);
    249         temp = Long.rotateLeft(temp, value);
    250         temp = Long.rotateLeft(temp, value);
    251         temp = Long.rotateLeft(temp, value);
    252         temp = Long.rotateLeft(temp, value);
    253         temp = Long.rotateLeft(temp, value);
    254         temp = Long.rotateLeft(temp, value);
    255         temp = Long.rotateLeft(temp, value);
    256 
    257         return temp;
    258     }
    259 
    260     // Sparse switch, just leave a gap.
    261     public static void sparseSwitch(int value) {
    262         switch (value) {
    263             case 0:
    264                 System.out.println("0"); break;
    265             case 1:
    266                 System.out.println("1"); break;
    267             case 3:
    268                 System.out.println("3"); break;
    269             case 4:
    270                 System.out.println("4"); break;
    271             default:
    272                 System.out.println("default"); break;
    273         }
    274     }
    275 
    276     // Simple sparse-switch starting at a negative index.
    277     public static void sparseSwitch2(int value) {
    278         switch (value) {
    279             case -3:
    280                 System.out.println("-3"); break;
    281             case -2:
    282                 System.out.println("-2"); break;
    283             case -1:
    284                 System.out.println("-1"); break;
    285             case 0:
    286                 System.out.println("0"); break;
    287             case 2:
    288                 System.out.println("2"); break;
    289             default:
    290                 System.out.println("default"); break;
    291         }
    292     }
    293 
    294     // Simple sparse-switch starting above 0.
    295     public static void sparseSwitch3(int value) {
    296         switch (value) {
    297             case 2:
    298                 System.out.println("2"); break;
    299             case 4:
    300                 System.out.println("4"); break;
    301             case 5:
    302                 System.out.println("5"); break;
    303             case 6:
    304                 System.out.println("6"); break;
    305             default:
    306                 System.out.println("default"); break;
    307         }
    308     }
    309 
    310     // Simple sparse-switch going up to max_int.
    311     public static void sparseSwitch4(int value) {
    312         switch (value) {
    313             case Integer.MAX_VALUE - 2:
    314                 System.out.println(Integer.MAX_VALUE - 2); break;
    315             case Integer.MAX_VALUE:
    316                 System.out.println(Integer.MAX_VALUE); break;
    317             default:
    318                 System.out.println("default"); break;
    319         }
    320     }
    321 
    322     // Simple sparse-switch starting at min_int.
    323     public static void sparseSwitch5(int value) {
    324         switch (value) {
    325             case Integer.MIN_VALUE:
    326                 System.out.println(Integer.MIN_VALUE); break;
    327             case Integer.MIN_VALUE + 2:
    328                 System.out.println(Integer.MIN_VALUE + 2); break;
    329             default:
    330                 System.out.println("default"); break;
    331         }
    332     }
    333 
    334     // Long sparse-switch that might lead to not creating chained-ifs.
    335     public static void sparseSwitch7(int value) {
    336         switch (value) {
    337             case 1:
    338                 System.out.println(1); break;
    339             case 2:
    340                 System.out.println(2); break;
    341             case 4:
    342                 System.out.println(4); break;
    343             case 5:
    344                 System.out.println(5); break;
    345             case 6:
    346                 System.out.println(6); break;
    347             case 7:
    348                 System.out.println(7); break;
    349             case 8:
    350                 System.out.println(8); break;
    351             case 9:
    352                 System.out.println(9); break;
    353             case 10:
    354                 System.out.println(10); break;
    355             case 11:
    356                 System.out.println(11); break;
    357             case 12:
    358                 System.out.println(12); break;
    359             case 13:
    360                 System.out.println(13); break;
    361             case 14:
    362                 System.out.println(14); break;
    363             case 15:
    364                 System.out.println(15); break;
    365             default:
    366                 System.out.println("default"); break;
    367         }
    368     }
    369 
    370     public static void main(String args[]) {
    371         /*
    372          * Note: We are using for loops and calls to hopefully avoid simplifying the switch
    373          *       structure from constant propagation. When inlining is supported, this needs to
    374          *       be revisited.
    375          */
    376 
    377         System.out.println("packed");
    378         for (int i = -2; i < 3; i++) {
    379             packedSwitch(i);
    380         }
    381         packedSwitch(Integer.MIN_VALUE);
    382         packedSwitch(Integer.MAX_VALUE);
    383 
    384         System.out.println("packed2");
    385         for (int i = -2; i < 3; i++) {
    386             packedSwitch2(i);
    387         }
    388         packedSwitch2(Integer.MIN_VALUE);
    389         packedSwitch2(Integer.MAX_VALUE);
    390 
    391         System.out.println("packed3");
    392         for (int i = -2; i < 7; i++) {
    393             packedSwitch3(i);
    394         }
    395         packedSwitch3(Integer.MIN_VALUE);
    396         packedSwitch3(Integer.MAX_VALUE);
    397 
    398         System.out.println("packed4");
    399         for (int i = Integer.MAX_VALUE - 2; i > 0; i++) {
    400             packedSwitch4(i);
    401         }
    402         packedSwitch4(Integer.MIN_VALUE);
    403 
    404         System.out.println("packed5");
    405         for (int i = Integer.MIN_VALUE; i < Integer.MIN_VALUE + 2; i++) {
    406             packedSwitch5(i);
    407         }
    408         packedSwitch5(Integer.MAX_VALUE);
    409 
    410         System.out.println("packed6");
    411         packedSwitch6(Integer.MIN_VALUE);
    412         packedSwitch6(Integer.MAX_VALUE);
    413 
    414         System.out.println("packed7");
    415         for (int i = -1; i < 17; i++) {
    416             packedSwitch7(i);
    417         }
    418 
    419 
    420         System.out.println("sparse");
    421         for (int i = -2; i < 4; i++) {
    422             sparseSwitch(i);
    423         }
    424         sparseSwitch(Integer.MIN_VALUE);
    425         sparseSwitch(Integer.MAX_VALUE);
    426 
    427         System.out.println("sparse2");
    428         for (int i = -2; i < 3; i++) {
    429             sparseSwitch2(i);
    430         }
    431         sparseSwitch2(Integer.MIN_VALUE);
    432         sparseSwitch2(Integer.MAX_VALUE);
    433 
    434         System.out.println("sparse3");
    435         for (int i = -2; i < 7; i++) {
    436             sparseSwitch3(i);
    437         }
    438         sparseSwitch3(Integer.MIN_VALUE);
    439         sparseSwitch3(Integer.MAX_VALUE);
    440 
    441         System.out.println("sparse4");
    442         for (int i = Integer.MAX_VALUE - 2; i > 0; i++) {
    443             sparseSwitch4(i);
    444         }
    445         sparseSwitch4(Integer.MIN_VALUE);
    446 
    447         System.out.println("sparse5");
    448         for (int i = Integer.MIN_VALUE; i < Integer.MIN_VALUE + 2; i++) {
    449             sparseSwitch5(i);
    450         }
    451         sparseSwitch5(Integer.MAX_VALUE);
    452 
    453         System.out.println("sparse7");
    454         for (int i = -1; i < 17; i++) {
    455             sparseSwitch7(i);
    456         }
    457 
    458         // Older tests.
    459 
    460         int a = 1;
    461 
    462         switch (a) {
    463             case -1: System.out.print("neg one\n"); break;
    464             case 0: System.out.print("zero\n"); break;
    465             case 1: System.out.print("CORRECT (one)\n"); break;
    466             case 2: System.out.print("two\n"); break;
    467             case 3: System.out.print("three\n"); break;
    468             case 4: System.out.print("four\n"); break;
    469             default: System.out.print("???\n"); break;
    470         }
    471         switch (a) {
    472             case 3: System.out.print("three\n"); break;
    473             case 4: System.out.print("four\n"); break;
    474             default: System.out.print("CORRECT (not found)\n"); break;
    475         }
    476 
    477         a = 0x12345678;
    478 
    479         switch (a) {
    480             case 0x12345678: System.out.print("CORRECT (large)\n"); break;
    481             case 0x12345679: System.out.print("large+1\n"); break;
    482             default: System.out.print("nuts\n"); break;
    483         }
    484         switch (a) {
    485             case 0x12345678: System.out.print("CORRECT (large2)\n"); break;
    486             case 0x12345700: System.out.print("large+many\n"); break;
    487             default: System.out.print("nuts\n"); break;
    488         }
    489         switch (a) {
    490             case 57: System.out.print("fifty-seven!\n"); break;
    491             case -6: System.out.print("neg six!\n"); break;
    492             case 0x12345678: System.out.print("CORRECT (large3)\n"); break;
    493             case 22: System.out.print("twenty-two!\n"); break;
    494             case 3: System.out.print("three!\n"); break;
    495             default: System.out.print("huh?\n"); break;
    496         }
    497         switch (a) {
    498             case -6: System.out.print("neg six!\n"); break;
    499             case 3: System.out.print("three!\n"); break;
    500             default: System.out.print("CORRECT (not found)\n"); break;
    501         }
    502 
    503         a = -5;
    504         switch (a) {
    505             case 12: System.out.print("twelve\n"); break;
    506             case -5: System.out.print("CORRECT (not found)\n"); break;
    507             case 0: System.out.print("zero\n"); break;
    508             default: System.out.print("wah?\n"); break;
    509         }
    510 
    511         switch (a) {
    512             default: System.out.print("CORRECT (default only)\n"); break;
    513         }
    514 
    515         a = -10;
    516         switch (a) {
    517             case -10: System.out.print("CORRECT big sparse / first\n"); break;
    518             case -5: System.out.print("neg five\n"); break;
    519             case 0: System.out.print("zero\n"); break;
    520             case 5: System.out.print("five\n"); break;
    521             case 10: System.out.print("ten\n"); break;
    522             case 15: System.out.print("fifteen\n"); break;
    523             case 20: System.out.print("twenty\n"); break;
    524             case 50: System.out.print("fifty\n"); break;
    525             case 100: System.out.print("hundred\n"); break;
    526             default: System.out.print("blah!\n"); break;
    527         }
    528 
    529         a = 100;
    530         switch (a) {
    531             case -10: System.out.print("neg ten\n"); break;
    532             case -5: System.out.print("neg five\n"); break;
    533             case 0: System.out.print("zero\n"); break;
    534             case 5: System.out.print("five\n"); break;
    535             case 10: System.out.print("ten\n"); break;
    536             case 15: System.out.print("fifteen\n"); break;
    537             case 20: System.out.print("twenty\n"); break;
    538             case 50: System.out.print("fifty\n"); break;
    539             case 100: System.out.print("CORRECT big sparse / last\n"); break;
    540             default: System.out.print("blah!\n"); break;
    541         }
    542 
    543         for (a = 253; a <= 258; a++) {
    544           switch (a) {
    545             case 254: System.out.println("254"); break;
    546             case 255: System.out.println("255"); break;
    547             case 256: System.out.println("256"); break;
    548             case 257: System.out.println("257"); break;
    549             default: System.out.println("default"); break;
    550           }
    551         }
    552     }
    553 }
    554