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 $noinline$longSelect(long param)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 $noinline$longSelect_Constant(long param)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 $noinline$intSelect_Constant(int param)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 main(String[] args)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 assertIntEquals(int expected, int actual)79 public static void assertIntEquals(int expected, int actual) { 80 if (expected != actual) { 81 throw new Error(expected + " != " + actual); 82 } 83 } 84 assertLongEquals(long expected, long actual)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