1*795d594fSAndroid Build Coastguard Worker /* 2*795d594fSAndroid Build Coastguard Worker * Copyright (C) 2016 The Android Open Source Project 3*795d594fSAndroid Build Coastguard Worker * 4*795d594fSAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License"); 5*795d594fSAndroid Build Coastguard Worker * you may not use this file except in compliance with the License. 6*795d594fSAndroid Build Coastguard Worker * You may obtain a copy of the License at 7*795d594fSAndroid Build Coastguard Worker * 8*795d594fSAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0 9*795d594fSAndroid Build Coastguard Worker * 10*795d594fSAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software 11*795d594fSAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS, 12*795d594fSAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13*795d594fSAndroid Build Coastguard Worker * See the License for the specific language governing permissions and 14*795d594fSAndroid Build Coastguard Worker * limitations under the License. 15*795d594fSAndroid Build Coastguard Worker */ 16*795d594fSAndroid Build Coastguard Worker 17*795d594fSAndroid Build Coastguard Worker public class Main { 18*795d594fSAndroid Build Coastguard Worker 19*795d594fSAndroid Build Coastguard Worker /// CHECK-START: long Main.$noinline$longSelect(long) register (before) 20*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Cond:z\d+>> LessThanOrEqual [{{j\d+}},{{j\d+}}] 21*795d594fSAndroid Build Coastguard Worker /// CHECK-NEXT: Select [{{j\d+}},{{j\d+}},<<Cond>>] 22*795d594fSAndroid Build Coastguard Worker $noinline$longSelect(long param)23*795d594fSAndroid Build Coastguard Worker public long $noinline$longSelect(long param) { 24*795d594fSAndroid Build Coastguard Worker long val_true = longB; 25*795d594fSAndroid Build Coastguard Worker long val_false = longC; 26*795d594fSAndroid Build Coastguard Worker return (param > longA) ? val_true : val_false; 27*795d594fSAndroid Build Coastguard Worker } 28*795d594fSAndroid Build Coastguard Worker 29*795d594fSAndroid Build Coastguard Worker /// CHECK-START: long Main.$noinline$longSelect_Constant(long) register (before) 30*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Const:j\d+>> LongConstant 31*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Cond:z\d+>> LessThanOrEqual [{{j\d+}},<<Const>>] 32*795d594fSAndroid Build Coastguard Worker /// CHECK-NEXT: Select [{{j\d+}},{{j\d+}},<<Cond>>] 33*795d594fSAndroid Build Coastguard Worker 34*795d594fSAndroid Build Coastguard Worker // Condition can be non-materialized on X86 because the condition does not 35*795d594fSAndroid Build Coastguard Worker // request 4 registers any more. 36*795d594fSAndroid Build Coastguard Worker /// CHECK-START-X86: long Main.$noinline$longSelect_Constant(long) disassembly (after) 37*795d594fSAndroid Build Coastguard Worker /// CHECK: LessThanOrEqual 38*795d594fSAndroid Build Coastguard Worker /// CHECK-NEXT: Select 39*795d594fSAndroid Build Coastguard Worker 40*795d594fSAndroid Build Coastguard Worker // Check that we generate CMOV for long on x86_64. 41*795d594fSAndroid Build Coastguard Worker /// CHECK-START-X86_64: long Main.$noinline$longSelect_Constant(long) disassembly (after) 42*795d594fSAndroid Build Coastguard Worker /// CHECK: LessThanOrEqual 43*795d594fSAndroid Build Coastguard Worker /// CHECK-NEXT: Select 44*795d594fSAndroid Build Coastguard Worker /// CHECK: cmpq 45*795d594fSAndroid Build Coastguard Worker /// CHECK: cmovle/ngq 46*795d594fSAndroid Build Coastguard Worker $noinline$longSelect_Constant(long param)47*795d594fSAndroid Build Coastguard Worker public long $noinline$longSelect_Constant(long param) { 48*795d594fSAndroid Build Coastguard Worker long val_true = longB; 49*795d594fSAndroid Build Coastguard Worker long val_false = longC; 50*795d594fSAndroid Build Coastguard Worker return (param > 3L) ? val_true : val_false; 51*795d594fSAndroid Build Coastguard Worker } 52*795d594fSAndroid Build Coastguard Worker 53*795d594fSAndroid Build Coastguard Worker // Check that we generate CMOV for int on x86_64. 54*795d594fSAndroid Build Coastguard Worker /// CHECK-START-X86_64: int Main.$noinline$intSelect_Constant(int) disassembly (after) 55*795d594fSAndroid Build Coastguard Worker /// CHECK: LessThan 56*795d594fSAndroid Build Coastguard Worker /// CHECK-NEXT: Select 57*795d594fSAndroid Build Coastguard Worker /// CHECK: cmp 58*795d594fSAndroid Build Coastguard Worker /// CHECK: cmovl/nge 59*795d594fSAndroid Build Coastguard Worker $noinline$intSelect_Constant(int param)60*795d594fSAndroid Build Coastguard Worker public int $noinline$intSelect_Constant(int param) { 61*795d594fSAndroid Build Coastguard Worker int val_true = intB; 62*795d594fSAndroid Build Coastguard Worker int val_false = intC; 63*795d594fSAndroid Build Coastguard Worker return (param >= 3) ? val_true : val_false; 64*795d594fSAndroid Build Coastguard Worker } 65*795d594fSAndroid Build Coastguard Worker main(String[] args)66*795d594fSAndroid Build Coastguard Worker public static void main(String[] args) { 67*795d594fSAndroid Build Coastguard Worker Main m = new Main(); 68*795d594fSAndroid Build Coastguard Worker assertLongEquals(5L, m.$noinline$longSelect(4L)); 69*795d594fSAndroid Build Coastguard Worker assertLongEquals(7L, m.$noinline$longSelect(2L)); 70*795d594fSAndroid Build Coastguard Worker assertLongEquals(5L, m.$noinline$longSelect_Constant(4L)); 71*795d594fSAndroid Build Coastguard Worker assertLongEquals(7L, m.$noinline$longSelect_Constant(2L)); 72*795d594fSAndroid Build Coastguard Worker assertIntEquals(5, m.$noinline$intSelect_Constant(4)); 73*795d594fSAndroid Build Coastguard Worker assertIntEquals(7, m.$noinline$intSelect_Constant(2)); 74*795d594fSAndroid Build Coastguard Worker } 75*795d594fSAndroid Build Coastguard Worker assertIntEquals(int expected, int actual)76*795d594fSAndroid Build Coastguard Worker public static void assertIntEquals(int expected, int actual) { 77*795d594fSAndroid Build Coastguard Worker if (expected != actual) { 78*795d594fSAndroid Build Coastguard Worker throw new Error(expected + " != " + actual); 79*795d594fSAndroid Build Coastguard Worker } 80*795d594fSAndroid Build Coastguard Worker } 81*795d594fSAndroid Build Coastguard Worker assertLongEquals(long expected, long actual)82*795d594fSAndroid Build Coastguard Worker public static void assertLongEquals(long expected, long actual) { 83*795d594fSAndroid Build Coastguard Worker if (expected != actual) { 84*795d594fSAndroid Build Coastguard Worker throw new Error(expected + " != " + actual); 85*795d594fSAndroid Build Coastguard Worker } 86*795d594fSAndroid Build Coastguard Worker } 87*795d594fSAndroid Build Coastguard Worker 88*795d594fSAndroid Build Coastguard Worker public long longA = 3L; 89*795d594fSAndroid Build Coastguard Worker public long longB = 5L; 90*795d594fSAndroid Build Coastguard Worker public long longC = 7L; 91*795d594fSAndroid Build Coastguard Worker public int intB = 5; 92*795d594fSAndroid Build Coastguard Worker public int intC = 7; 93*795d594fSAndroid Build Coastguard Worker } 94