/* * Copyright (C) 2016 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ public class Main { /// CHECK-START: long Main.$noinline$longSelect(long) register (before) /// CHECK: <> LessThanOrEqual [{{j\d+}},{{j\d+}}] /// CHECK-NEXT: Select [{{j\d+}},{{j\d+}},<>] public long $noinline$longSelect(long param) { if (doThrow) { throw new Error(); } long val_true = longB; long val_false = longC; return (param > longA) ? val_true : val_false; } /// CHECK-START: long Main.$noinline$longSelect_Constant(long) register (before) /// CHECK: <> LongConstant /// CHECK: <> LessThanOrEqual [{{j\d+}},<>] /// CHECK-NEXT: Select [{{j\d+}},{{j\d+}},<>] // Condition can be non-materialized on X86 because the condition does not // request 4 registers any more. /// CHECK-START-X86: long Main.$noinline$longSelect_Constant(long) disassembly (after) /// CHECK: LessThanOrEqual /// CHECK-NEXT: Select // Check that we generate CMOV for long on x86_64. /// CHECK-START-X86_64: long Main.$noinline$longSelect_Constant(long) disassembly (after) /// CHECK: LessThanOrEqual /// CHECK-NEXT: Select /// CHECK: cmpq /// CHECK: cmovle/ngq public long $noinline$longSelect_Constant(long param) { if (doThrow) { throw new Error(); } long val_true = longB; long val_false = longC; return (param > 3L) ? val_true : val_false; } // Check that we generate CMOV for int on x86_64. /// CHECK-START-X86_64: int Main.$noinline$intSelect_Constant(int) disassembly (after) /// CHECK: LessThan /// CHECK-NEXT: Select /// CHECK: cmp /// CHECK: cmovl/nge public int $noinline$intSelect_Constant(int param) { if (doThrow) { throw new Error(); } int val_true = intB; int val_false = intC; return (param >= 3) ? val_true : val_false; } public static void main(String[] args) { Main m = new Main(); assertLongEquals(5L, m.$noinline$longSelect(4L)); assertLongEquals(7L, m.$noinline$longSelect(2L)); assertLongEquals(5L, m.$noinline$longSelect_Constant(4L)); assertLongEquals(7L, m.$noinline$longSelect_Constant(2L)); assertIntEquals(5, m.$noinline$intSelect_Constant(4)); assertIntEquals(7, m.$noinline$intSelect_Constant(2)); } public static void assertIntEquals(int expected, int actual) { if (expected != actual) { throw new Error(expected + " != " + actual); } } public static void assertLongEquals(long expected, long actual) { if (expected != actual) { throw new Error(expected + " != " + actual); } } public boolean doThrow = false; public long longA = 3L; public long longB = 5L; public long longC = 7L; public int intB = 5; public int intC = 7; }