Home | History | Annotate | Download | only in src
      1 /*
      2  * Copyright (C) 2016 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 public class Main {
     18 
     19   /// CHECK-START: long Main.$noinline$longSelect(long) register (before)
     20   /// CHECK:         <<Cond:z\d+>> LessThanOrEqual [{{j\d+}},{{j\d+}}]
     21   /// CHECK-NEXT:                  Select [{{j\d+}},{{j\d+}},<<Cond>>]
     22 
     23   public long $noinline$longSelect(long param) {
     24     if (doThrow) { throw new Error(); }
     25     long val_true = longB;
     26     long val_false = longC;
     27     return (param > longA) ? val_true : val_false;
     28   }
     29 
     30   /// CHECK-START: long Main.$noinline$longSelect_Constant(long) register (before)
     31   /// CHECK:         <<Const:j\d+>> LongConstant
     32   /// CHECK:         <<Cond:z\d+>>  LessThanOrEqual [{{j\d+}},<<Const>>]
     33   /// CHECK-NEXT:                   Select [{{j\d+}},{{j\d+}},<<Cond>>]
     34 
     35   // Condition can be non-materialized on X86 because the condition does not
     36   // request 4 registers any more.
     37   /// CHECK-START-X86: long Main.$noinline$longSelect_Constant(long) disassembly (after)
     38   /// CHECK:             LessThanOrEqual
     39   /// CHECK-NEXT:        Select
     40 
     41   // Check that we generate CMOV for long on x86_64.
     42   /// CHECK-START-X86_64: long Main.$noinline$longSelect_Constant(long) disassembly (after)
     43   /// CHECK:             LessThanOrEqual
     44   /// CHECK-NEXT:        Select
     45   /// CHECK:             cmpq
     46   /// CHECK:             cmovle/ngq
     47 
     48   public long $noinline$longSelect_Constant(long param) {
     49     if (doThrow) { throw new Error(); }
     50     long val_true = longB;
     51     long val_false = longC;
     52     return (param > 3L) ? val_true : val_false;
     53   }
     54 
     55   // Check that we generate CMOV for int on x86_64.
     56   /// CHECK-START-X86_64: int Main.$noinline$intSelect_Constant(int) disassembly (after)
     57   /// CHECK:             LessThan
     58   /// CHECK-NEXT:        Select
     59   /// CHECK:             cmp
     60   /// CHECK:             cmovl/nge
     61 
     62   public int $noinline$intSelect_Constant(int param) {
     63     if (doThrow) { throw new Error(); }
     64     int val_true = intB;
     65     int val_false = intC;
     66     return (param >= 3) ? val_true : val_false;
     67   }
     68 
     69   public static void main(String[] args) {
     70     Main m = new Main();
     71     assertLongEquals(5L, m.$noinline$longSelect(4L));
     72     assertLongEquals(7L, m.$noinline$longSelect(2L));
     73     assertLongEquals(5L, m.$noinline$longSelect_Constant(4L));
     74     assertLongEquals(7L, m.$noinline$longSelect_Constant(2L));
     75     assertIntEquals(5, m.$noinline$intSelect_Constant(4));
     76     assertIntEquals(7, m.$noinline$intSelect_Constant(2));
     77   }
     78 
     79   public static void assertIntEquals(int expected, int actual) {
     80     if (expected != actual) {
     81       throw new Error(expected + " != " + actual);
     82     }
     83   }
     84 
     85   public static void assertLongEquals(long expected, long actual) {
     86     if (expected != actual) {
     87       throw new Error(expected + " != " + actual);
     88     }
     89   }
     90 
     91   public boolean doThrow = false;
     92 
     93   public long longA = 3L;
     94   public long longB = 5L;
     95   public long longC = 7L;
     96   public int intB = 5;
     97   public int intC = 7;
     98 }
     99