1*795d594fSAndroid Build Coastguard Worker /* 2*795d594fSAndroid Build Coastguard Worker * Copyright (C) 2024 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 { assertIntEquals(int expected, int result)18*795d594fSAndroid Build Coastguard Worker public static void assertIntEquals(int expected, int result) { 19*795d594fSAndroid Build Coastguard Worker if (expected != result) { 20*795d594fSAndroid Build Coastguard Worker throw new Error("Expected: " + expected + ", found: " + result); 21*795d594fSAndroid Build Coastguard Worker } 22*795d594fSAndroid Build Coastguard Worker } 23*795d594fSAndroid Build Coastguard Worker assertLongEquals(long expected, long result)24*795d594fSAndroid Build Coastguard Worker public static void assertLongEquals(long expected, long result) { 25*795d594fSAndroid Build Coastguard Worker if (expected != result) { 26*795d594fSAndroid Build Coastguard Worker throw new Error("Expected: " + expected + ", found: " + result); 27*795d594fSAndroid Build Coastguard Worker } 28*795d594fSAndroid Build Coastguard Worker } 29*795d594fSAndroid Build Coastguard Worker 30*795d594fSAndroid Build Coastguard Worker /// CHECK-START-RISCV64: int Main.$noinline$intRiscvShift1Add(int, int) instruction_simplifier_riscv64 (before) 31*795d594fSAndroid Build Coastguard Worker /// CHECK: <<A:i\d+>> ParameterValue 32*795d594fSAndroid Build Coastguard Worker /// CHECK: <<B:i\d+>> ParameterValue 33*795d594fSAndroid Build Coastguard Worker /// CHECK: <<One:i\d+>> IntConstant 1 34*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Shift:i\d+>> Shl [<<A>>,<<One>>] 35*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Add:i\d+>> Add [<<B>>,<<Shift>>] 36*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Return:v\d+>> Return [<<Add>>] 37*795d594fSAndroid Build Coastguard Worker 38*795d594fSAndroid Build Coastguard Worker /// CHECK-START-RISCV64: int Main.$noinline$intRiscvShift1Add(int, int) instruction_simplifier_riscv64 (after) 39*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: Riscv64ShiftAdd 40*795d594fSAndroid Build Coastguard Worker $noinline$intRiscvShift1Add(int a, int b)41*795d594fSAndroid Build Coastguard Worker public static int $noinline$intRiscvShift1Add(int a, int b) { 42*795d594fSAndroid Build Coastguard Worker return (a << 1) + b; 43*795d594fSAndroid Build Coastguard Worker } 44*795d594fSAndroid Build Coastguard Worker 45*795d594fSAndroid Build Coastguard Worker /// CHECK-START-RISCV64: long Main.$noinline$longIntRiscvShift1Add(long, int) instruction_simplifier_riscv64 (before) 46*795d594fSAndroid Build Coastguard Worker /// CHECK: <<A:j\d+>> ParameterValue 47*795d594fSAndroid Build Coastguard Worker /// CHECK: <<B:i\d+>> ParameterValue 48*795d594fSAndroid Build Coastguard Worker /// CHECK: <<One:i\d+>> IntConstant 1 49*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Shift:j\d+>> Shl [<<A>>,<<One>>] 50*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Convert:j\d+>> TypeConversion [<<B>>] 51*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Add:j\d+>> Add [<<Shift>>,<<Convert>>] 52*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Return:v\d+>> Return [<<Add>>] 53*795d594fSAndroid Build Coastguard Worker 54*795d594fSAndroid Build Coastguard Worker /// CHECK-START-RISCV64: long Main.$noinline$longIntRiscvShift1Add(long, int) instruction_simplifier_riscv64 (after) 55*795d594fSAndroid Build Coastguard Worker /// CHECK: <<A:j\d+>> ParameterValue 56*795d594fSAndroid Build Coastguard Worker /// CHECK: <<B:i\d+>> ParameterValue 57*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Convert:j\d+>> TypeConversion [<<B>>] 58*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<ShiftAdd:j\d+>> Riscv64ShiftAdd [<<A>>,<<Convert>>] distance:1 59*795d594fSAndroid Build Coastguard Worker 60*795d594fSAndroid Build Coastguard Worker /// CHECK-START-RISCV64: long Main.$noinline$longIntRiscvShift1Add(long, int) instruction_simplifier_riscv64 (after) 61*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: Shl 62*795d594fSAndroid Build Coastguard Worker 63*795d594fSAndroid Build Coastguard Worker /// CHECK-START-RISCV64: long Main.$noinline$longIntRiscvShift1Add(long, int) instruction_simplifier_riscv64 (after) 64*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: Add 65*795d594fSAndroid Build Coastguard Worker $noinline$longIntRiscvShift1Add(long a, int b)66*795d594fSAndroid Build Coastguard Worker public static long $noinline$longIntRiscvShift1Add(long a, int b) { 67*795d594fSAndroid Build Coastguard Worker return (a << 1) + b; 68*795d594fSAndroid Build Coastguard Worker } 69*795d594fSAndroid Build Coastguard Worker 70*795d594fSAndroid Build Coastguard Worker /// CHECK-START-RISCV64: long Main.$noinline$longRiscvShift1Add(long, long) instruction_simplifier_riscv64 (before) 71*795d594fSAndroid Build Coastguard Worker /// CHECK: <<A:j\d+>> ParameterValue 72*795d594fSAndroid Build Coastguard Worker /// CHECK: <<B:j\d+>> ParameterValue 73*795d594fSAndroid Build Coastguard Worker /// CHECK: <<One:i\d+>> IntConstant 1 74*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Shift:j\d+>> Shl [<<A>>,<<One>>] 75*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Add:j\d+>> Add [<<B>>,<<Shift>>] 76*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Return:v\d+>> Return [<<Add>>] 77*795d594fSAndroid Build Coastguard Worker 78*795d594fSAndroid Build Coastguard Worker /// CHECK-START-RISCV64: long Main.$noinline$longRiscvShift1Add(long, long) instruction_simplifier_riscv64 (after) 79*795d594fSAndroid Build Coastguard Worker /// CHECK: <<A:j\d+>> ParameterValue 80*795d594fSAndroid Build Coastguard Worker /// CHECK: <<B:j\d+>> ParameterValue 81*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<ShiftAdd:j\d+>> Riscv64ShiftAdd [<<A>>,<<B>>] distance:1 82*795d594fSAndroid Build Coastguard Worker 83*795d594fSAndroid Build Coastguard Worker /// CHECK-START-RISCV64: long Main.$noinline$longRiscvShift1Add(long, long) instruction_simplifier_riscv64 (after) 84*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: Shl 85*795d594fSAndroid Build Coastguard Worker 86*795d594fSAndroid Build Coastguard Worker /// CHECK-START-RISCV64: long Main.$noinline$longRiscvShift1Add(long, long) instruction_simplifier_riscv64 (after) 87*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: Add 88*795d594fSAndroid Build Coastguard Worker $noinline$longRiscvShift1Add(long a, long b)89*795d594fSAndroid Build Coastguard Worker public static long $noinline$longRiscvShift1Add(long a, long b) { 90*795d594fSAndroid Build Coastguard Worker return (a << 1) + b; 91*795d594fSAndroid Build Coastguard Worker } 92*795d594fSAndroid Build Coastguard Worker 93*795d594fSAndroid Build Coastguard Worker /// CHECK-START-RISCV64: long Main.$noinline$longRiscvShift2Add(long, long) instruction_simplifier_riscv64 (before) 94*795d594fSAndroid Build Coastguard Worker /// CHECK: <<A:j\d+>> ParameterValue 95*795d594fSAndroid Build Coastguard Worker /// CHECK: <<B:j\d+>> ParameterValue 96*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Two:i\d+>> IntConstant 2 97*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Shift:j\d+>> Shl [<<A>>,<<Two>>] 98*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Add:j\d+>> Add [<<B>>,<<Shift>>] 99*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Return:v\d+>> Return [<<Add>>] 100*795d594fSAndroid Build Coastguard Worker 101*795d594fSAndroid Build Coastguard Worker /// CHECK-START-RISCV64: long Main.$noinline$longRiscvShift2Add(long, long) instruction_simplifier_riscv64 (after) 102*795d594fSAndroid Build Coastguard Worker /// CHECK: <<A:j\d+>> ParameterValue 103*795d594fSAndroid Build Coastguard Worker /// CHECK: <<B:j\d+>> ParameterValue 104*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<ShiftAdd:j\d+>> Riscv64ShiftAdd [<<A>>,<<B>>] distance:2 105*795d594fSAndroid Build Coastguard Worker 106*795d594fSAndroid Build Coastguard Worker /// CHECK-START-RISCV64: long Main.$noinline$longRiscvShift2Add(long, long) instruction_simplifier_riscv64 (after) 107*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: Shl 108*795d594fSAndroid Build Coastguard Worker 109*795d594fSAndroid Build Coastguard Worker /// CHECK-START-RISCV64: long Main.$noinline$longRiscvShift2Add(long, long) instruction_simplifier_riscv64 (after) 110*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: Add 111*795d594fSAndroid Build Coastguard Worker $noinline$longRiscvShift2Add(long a, long b)112*795d594fSAndroid Build Coastguard Worker public static long $noinline$longRiscvShift2Add(long a, long b) { 113*795d594fSAndroid Build Coastguard Worker return (a << 2) + b; 114*795d594fSAndroid Build Coastguard Worker } 115*795d594fSAndroid Build Coastguard Worker 116*795d594fSAndroid Build Coastguard Worker /// CHECK-START-RISCV64: long Main.$noinline$longRiscvShift3Add(long, long) instruction_simplifier_riscv64 (before) 117*795d594fSAndroid Build Coastguard Worker /// CHECK: <<A:j\d+>> ParameterValue 118*795d594fSAndroid Build Coastguard Worker /// CHECK: <<B:j\d+>> ParameterValue 119*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Three:i\d+>> IntConstant 3 120*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Shift:j\d+>> Shl [<<A>>,<<Three>>] 121*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Add:j\d+>> Add [<<B>>,<<Shift>>] 122*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Return:v\d+>> Return [<<Add>>] 123*795d594fSAndroid Build Coastguard Worker 124*795d594fSAndroid Build Coastguard Worker /// CHECK-START-RISCV64: long Main.$noinline$longRiscvShift3Add(long, long) instruction_simplifier_riscv64 (after) 125*795d594fSAndroid Build Coastguard Worker /// CHECK: <<A:j\d+>> ParameterValue 126*795d594fSAndroid Build Coastguard Worker /// CHECK: <<B:j\d+>> ParameterValue 127*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<ShiftAdd:j\d+>> Riscv64ShiftAdd [<<A>>,<<B>>] distance:3 128*795d594fSAndroid Build Coastguard Worker 129*795d594fSAndroid Build Coastguard Worker /// CHECK-START-RISCV64: long Main.$noinline$longRiscvShift3Add(long, long) instruction_simplifier_riscv64 (after) 130*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: Shl 131*795d594fSAndroid Build Coastguard Worker 132*795d594fSAndroid Build Coastguard Worker /// CHECK-START-RISCV64: long Main.$noinline$longRiscvShift3Add(long, long) instruction_simplifier_riscv64 (after) 133*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: Add 134*795d594fSAndroid Build Coastguard Worker $noinline$longRiscvShift3Add(long a, long b)135*795d594fSAndroid Build Coastguard Worker public static long $noinline$longRiscvShift3Add(long a, long b) { 136*795d594fSAndroid Build Coastguard Worker return (a << 3) + b; 137*795d594fSAndroid Build Coastguard Worker } 138*795d594fSAndroid Build Coastguard Worker 139*795d594fSAndroid Build Coastguard Worker /// CHECK-START-RISCV64: long Main.$noinline$longReverseRiscvShift3Add(long, long) instruction_simplifier_riscv64 (before) 140*795d594fSAndroid Build Coastguard Worker /// CHECK: <<A:j\d+>> ParameterValue 141*795d594fSAndroid Build Coastguard Worker /// CHECK: <<B:j\d+>> ParameterValue 142*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Three:i\d+>> IntConstant 3 143*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Shift:j\d+>> Shl [<<A>>,<<Three>>] 144*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Add:j\d+>> Add [<<B>>,<<Shift>>] 145*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Return:v\d+>> Return [<<Add>>] 146*795d594fSAndroid Build Coastguard Worker 147*795d594fSAndroid Build Coastguard Worker /// CHECK-START-RISCV64: long Main.$noinline$longReverseRiscvShift3Add(long, long) instruction_simplifier_riscv64 (after) 148*795d594fSAndroid Build Coastguard Worker /// CHECK: <<A:j\d+>> ParameterValue 149*795d594fSAndroid Build Coastguard Worker /// CHECK: <<B:j\d+>> ParameterValue 150*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<ShiftAdd:j\d+>> Riscv64ShiftAdd [<<A>>,<<B>>] distance:3 151*795d594fSAndroid Build Coastguard Worker 152*795d594fSAndroid Build Coastguard Worker /// CHECK-START-RISCV64: long Main.$noinline$longReverseRiscvShift3Add(long, long) instruction_simplifier_riscv64 (after) 153*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: Shl 154*795d594fSAndroid Build Coastguard Worker 155*795d594fSAndroid Build Coastguard Worker /// CHECK-START-RISCV64: long Main.$noinline$longReverseRiscvShift3Add(long, long) instruction_simplifier_riscv64 (after) 156*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: Add 157*795d594fSAndroid Build Coastguard Worker $noinline$longReverseRiscvShift3Add(long a, long b)158*795d594fSAndroid Build Coastguard Worker public static long $noinline$longReverseRiscvShift3Add(long a, long b) { 159*795d594fSAndroid Build Coastguard Worker return b + (a << 3); 160*795d594fSAndroid Build Coastguard Worker } 161*795d594fSAndroid Build Coastguard Worker 162*795d594fSAndroid Build Coastguard Worker /// CHECK-START-RISCV64: long Main.$noinline$longRightShift(long, long) instruction_simplifier_riscv64 (before) 163*795d594fSAndroid Build Coastguard Worker /// CHECK: <<A:j\d+>> ParameterValue 164*795d594fSAndroid Build Coastguard Worker /// CHECK: <<B:j\d+>> ParameterValue 165*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Four:i\d+>> IntConstant 4 166*795d594fSAndroid Build Coastguard Worker /// CHECK: <<One:i\d+>> IntConstant 1 167*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Shift1:j\d+>> Shl [<<A>>,<<Four>>] 168*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Shift2:j\d+>> Shl [<<B>>,<<One>>] 169*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Add:j\d+>> Add [<<Shift1>>,<<Shift2>>] 170*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Return:v\d+>> Return [<<Add>>] 171*795d594fSAndroid Build Coastguard Worker 172*795d594fSAndroid Build Coastguard Worker /// CHECK-START-RISCV64: long Main.$noinline$longRightShift(long, long) instruction_simplifier_riscv64 (after) 173*795d594fSAndroid Build Coastguard Worker /// CHECK: <<A:j\d+>> ParameterValue 174*795d594fSAndroid Build Coastguard Worker /// CHECK: <<B:j\d+>> ParameterValue 175*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Four:i\d+>> IntConstant 4 176*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Shift1:j\d+>> Shl [<<A>>,<<Four>>] 177*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<ShiftAdd:j\d+>> Riscv64ShiftAdd [<<B>>,<<Shift1>>] distance:1 178*795d594fSAndroid Build Coastguard Worker 179*795d594fSAndroid Build Coastguard Worker /// CHECK-START-RISCV64: long Main.$noinline$longRightShift(long, long) instruction_simplifier_riscv64 (after) 180*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: Add 181*795d594fSAndroid Build Coastguard Worker $noinline$longRightShift(long a, long b)182*795d594fSAndroid Build Coastguard Worker public static long $noinline$longRightShift(long a, long b) { 183*795d594fSAndroid Build Coastguard Worker return (a << 4) + (b << 1); 184*795d594fSAndroid Build Coastguard Worker } 185*795d594fSAndroid Build Coastguard Worker 186*795d594fSAndroid Build Coastguard Worker /// CHECK-START-RISCV64: long Main.$noinline$longLeftShift(long, long) instruction_simplifier_riscv64 (before) 187*795d594fSAndroid Build Coastguard Worker /// CHECK: <<A:j\d+>> ParameterValue 188*795d594fSAndroid Build Coastguard Worker /// CHECK: <<B:j\d+>> ParameterValue 189*795d594fSAndroid Build Coastguard Worker /// CHECK: <<One:i\d+>> IntConstant 1 190*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Four:i\d+>> IntConstant 4 191*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Shift1:j\d+>> Shl [<<A>>,<<One>>] 192*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Shift2:j\d+>> Shl [<<B>>,<<Four>>] 193*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Add:j\d+>> Add [<<Shift1>>,<<Shift2>>] 194*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Return:v\d+>> Return [<<Add>>] 195*795d594fSAndroid Build Coastguard Worker 196*795d594fSAndroid Build Coastguard Worker /// CHECK-START-RISCV64: long Main.$noinline$longLeftShift(long, long) instruction_simplifier_riscv64 (after) 197*795d594fSAndroid Build Coastguard Worker /// CHECK: <<A:j\d+>> ParameterValue 198*795d594fSAndroid Build Coastguard Worker /// CHECK: <<B:j\d+>> ParameterValue 199*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Four:i\d+>> IntConstant 4 200*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Shift2:j\d+>> Shl [<<B>>,<<Four>>] 201*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<ShiftAdd:j\d+>> Riscv64ShiftAdd [<<A>>,<<Shift2>>] distance:1 202*795d594fSAndroid Build Coastguard Worker 203*795d594fSAndroid Build Coastguard Worker /// CHECK-START-RISCV64: long Main.$noinline$longLeftShift(long, long) instruction_simplifier_riscv64 (after) 204*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: Add 205*795d594fSAndroid Build Coastguard Worker $noinline$longLeftShift(long a, long b)206*795d594fSAndroid Build Coastguard Worker public static long $noinline$longLeftShift(long a, long b) { 207*795d594fSAndroid Build Coastguard Worker return (a << 1) + (b << 4); 208*795d594fSAndroid Build Coastguard Worker } 209*795d594fSAndroid Build Coastguard Worker 210*795d594fSAndroid Build Coastguard Worker /// CHECK-START-RISCV64: long Main.$noinline$longShiftTooLittleDistance(long, long) instruction_simplifier_riscv64 (after) 211*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: Riscv64ShiftAdd 212*795d594fSAndroid Build Coastguard Worker $noinline$longShiftTooLittleDistance(long a, long b)213*795d594fSAndroid Build Coastguard Worker public static long $noinline$longShiftTooLittleDistance(long a, long b) { 214*795d594fSAndroid Build Coastguard Worker return (a << 0) + b; 215*795d594fSAndroid Build Coastguard Worker } 216*795d594fSAndroid Build Coastguard Worker 217*795d594fSAndroid Build Coastguard Worker /// CHECK-START-RISCV64: long Main.$noinline$longShiftTooGreatDistance(long, long) instruction_simplifier_riscv64 (after) 218*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: Riscv64ShiftAdd 219*795d594fSAndroid Build Coastguard Worker $noinline$longShiftTooGreatDistance(long a, long b)220*795d594fSAndroid Build Coastguard Worker public static long $noinline$longShiftTooGreatDistance(long a, long b) { 221*795d594fSAndroid Build Coastguard Worker return (a << 4) + b; 222*795d594fSAndroid Build Coastguard Worker } 223*795d594fSAndroid Build Coastguard Worker 224*795d594fSAndroid Build Coastguard Worker /// CHECK-START-RISCV64: long Main.$noinline$longTwoSimplifications(long, long) instruction_simplifier_riscv64 (before) 225*795d594fSAndroid Build Coastguard Worker /// CHECK: <<A:j\d+>> ParameterValue 226*795d594fSAndroid Build Coastguard Worker /// CHECK: <<B:j\d+>> ParameterValue 227*795d594fSAndroid Build Coastguard Worker /// CHECK: <<One:i\d+>> IntConstant 1 228*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Two:i\d+>> IntConstant 2 229*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Shift1:j\d+>> Shl [<<A>>,<<One>>] 230*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Add1:j\d+>> Add [<<B>>,<<Shift1>>] 231*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Shift2:j\d+>> Shl [<<B>>,<<Two>>] 232*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Add2:j\d+>> Add [<<A>>,<<Shift2>>] 233*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Xor:j\d+>> Xor [<<Add1>>,<<Add2>>] 234*795d594fSAndroid Build Coastguard Worker 235*795d594fSAndroid Build Coastguard Worker /// CHECK-START-RISCV64: long Main.$noinline$longTwoSimplifications(long, long) instruction_simplifier_riscv64 (after) 236*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<ShiftAdd1:j\d+>> Riscv64ShiftAdd distance:1 237*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<ShiftAdd2:j\d+>> Riscv64ShiftAdd distance:2 238*795d594fSAndroid Build Coastguard Worker 239*795d594fSAndroid Build Coastguard Worker /// CHECK-START-RISCV64: long Main.$noinline$longTwoSimplifications(long, long) instruction_simplifier_riscv64 (after) 240*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: Shl 241*795d594fSAndroid Build Coastguard Worker 242*795d594fSAndroid Build Coastguard Worker /// CHECK-START-RISCV64: long Main.$noinline$longTwoSimplifications(long, long) instruction_simplifier_riscv64 (after) 243*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: Add 244*795d594fSAndroid Build Coastguard Worker $noinline$longTwoSimplifications(long a, long b)245*795d594fSAndroid Build Coastguard Worker public static long $noinline$longTwoSimplifications(long a, long b) { 246*795d594fSAndroid Build Coastguard Worker long x = b + (a << 1); 247*795d594fSAndroid Build Coastguard Worker long y = a + (b << 2); 248*795d594fSAndroid Build Coastguard Worker return x ^ y; 249*795d594fSAndroid Build Coastguard Worker } 250*795d594fSAndroid Build Coastguard Worker 251*795d594fSAndroid Build Coastguard Worker /// CHECK-START-RISCV64: long Main.$noinline$longTwoAddsUseShl(long, long, long) instruction_simplifier_riscv64 (before) 252*795d594fSAndroid Build Coastguard Worker /// CHECK: <<A:j\d+>> ParameterValue 253*795d594fSAndroid Build Coastguard Worker /// CHECK: <<B:j\d+>> ParameterValue 254*795d594fSAndroid Build Coastguard Worker /// CHECK: <<C:j\d+>> ParameterValue 255*795d594fSAndroid Build Coastguard Worker /// CHECK: <<One:i\d+>> IntConstant 1 256*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Shl:j\d+>> Shl [<<A>>,<<One>>] 257*795d594fSAndroid Build Coastguard Worker /// CHECK: <<X:j\d+>> Add [<<B>>,<<Shl>>] 258*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Y:j\d+>> Add [<<C>>,<<Shl>>] 259*795d594fSAndroid Build Coastguard Worker 260*795d594fSAndroid Build Coastguard Worker /// CHECK-START-RISCV64: long Main.$noinline$longTwoAddsUseShl(long, long, long) instruction_simplifier_riscv64 (after) 261*795d594fSAndroid Build Coastguard Worker /// CHECK: <<A:j\d+>> ParameterValue 262*795d594fSAndroid Build Coastguard Worker /// CHECK: <<B:j\d+>> ParameterValue 263*795d594fSAndroid Build Coastguard Worker /// CHECK: <<C:j\d+>> ParameterValue 264*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<ShAdd1:j\d+>> Riscv64ShiftAdd [<<A>>,<<B>>] distance:1 265*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<ShAdd2:j\d+>> Riscv64ShiftAdd [<<A>>,<<C>>] distance:1 266*795d594fSAndroid Build Coastguard Worker 267*795d594fSAndroid Build Coastguard Worker /// CHECK-START-RISCV64: long Main.$noinline$longTwoAddsUseShl(long, long, long) instruction_simplifier_riscv64 (after) 268*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: Shl 269*795d594fSAndroid Build Coastguard Worker 270*795d594fSAndroid Build Coastguard Worker /// CHECK-START-RISCV64: long Main.$noinline$longTwoAddsUseShl(long, long, long) instruction_simplifier_riscv64 (after) 271*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: Add 272*795d594fSAndroid Build Coastguard Worker $noinline$longTwoAddsUseShl(long a, long b, long c)273*795d594fSAndroid Build Coastguard Worker public static long $noinline$longTwoAddsUseShl(long a, long b, long c) { 274*795d594fSAndroid Build Coastguard Worker long shl = a << 1; 275*795d594fSAndroid Build Coastguard Worker long x = shl + b; 276*795d594fSAndroid Build Coastguard Worker long y = shl + c; 277*795d594fSAndroid Build Coastguard Worker return x ^ y; 278*795d594fSAndroid Build Coastguard Worker } 279*795d594fSAndroid Build Coastguard Worker 280*795d594fSAndroid Build Coastguard Worker /// CHECK-START-RISCV64: long Main.$noinline$longTwoAddsMixedOrderUseShl(long, long, long) instruction_simplifier_riscv64 (after) 281*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: Riscv64ShiftAdd 282*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: Riscv64ShiftAdd 283*795d594fSAndroid Build Coastguard Worker 284*795d594fSAndroid Build Coastguard Worker /// CHECK-START-RISCV64: long Main.$noinline$longTwoAddsMixedOrderUseShl(long, long, long) instruction_simplifier_riscv64 (after) 285*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: Shl 286*795d594fSAndroid Build Coastguard Worker 287*795d594fSAndroid Build Coastguard Worker /// CHECK-START-RISCV64: long Main.$noinline$longTwoAddsMixedOrderUseShl(long, long, long) instruction_simplifier_riscv64 (after) 288*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: Add 289*795d594fSAndroid Build Coastguard Worker $noinline$longTwoAddsMixedOrderUseShl(long a, long b, long c)290*795d594fSAndroid Build Coastguard Worker public static long $noinline$longTwoAddsMixedOrderUseShl(long a, long b, long c) { 291*795d594fSAndroid Build Coastguard Worker long x = (a << 1) + b; 292*795d594fSAndroid Build Coastguard Worker long y = c + (a << 1); 293*795d594fSAndroid Build Coastguard Worker return x ^ y; 294*795d594fSAndroid Build Coastguard Worker } 295*795d594fSAndroid Build Coastguard Worker 296*795d594fSAndroid Build Coastguard Worker /// CHECK-START-RISCV64: long Main.$noinline$longOneAddSharesShlUse(long, long, long) instruction_simplifier_riscv64 (before) 297*795d594fSAndroid Build Coastguard Worker /// CHECK: <<A:j\d+>> ParameterValue 298*795d594fSAndroid Build Coastguard Worker /// CHECK: <<B:j\d+>> ParameterValue 299*795d594fSAndroid Build Coastguard Worker /// CHECK: <<C:j\d+>> ParameterValue 300*795d594fSAndroid Build Coastguard Worker /// CHECK: <<One:i\d+>> IntConstant 1 301*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Shl:j\d+>> Shl [<<A>>,<<One>>] 302*795d594fSAndroid Build Coastguard Worker /// CHECK: <<X:j\d+>> Add [<<B>>,<<Shl>>] 303*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Y:j\d+>> Sub [<<Shl>>,<<C>>] 304*795d594fSAndroid Build Coastguard Worker 305*795d594fSAndroid Build Coastguard Worker /// CHECK-START-RISCV64: long Main.$noinline$longOneAddSharesShlUse(long, long, long) instruction_simplifier_riscv64 (after) 306*795d594fSAndroid Build Coastguard Worker /// CHECK: <<A:j\d+>> ParameterValue 307*795d594fSAndroid Build Coastguard Worker /// CHECK: <<B:j\d+>> ParameterValue 308*795d594fSAndroid Build Coastguard Worker /// CHECK: <<C:j\d+>> ParameterValue 309*795d594fSAndroid Build Coastguard Worker /// CHECK: <<One:i\d+>> IntConstant 1 310*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Shl:j\d+>> Shl [<<A>>,<<One>>] 311*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<ShAdd:j\d+>> Riscv64ShiftAdd [<<A>>,<<B>>] distance:1 312*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Y:j\d+>> Sub [<<Shl>>,<<C>>] 313*795d594fSAndroid Build Coastguard Worker 314*795d594fSAndroid Build Coastguard Worker /// CHECK-START-RISCV64: long Main.$noinline$longOneAddSharesShlUse(long, long, long) instruction_simplifier_riscv64 (after) 315*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: Add 316*795d594fSAndroid Build Coastguard Worker $noinline$longOneAddSharesShlUse(long a, long b, long c)317*795d594fSAndroid Build Coastguard Worker public static long $noinline$longOneAddSharesShlUse(long a, long b, long c) { 318*795d594fSAndroid Build Coastguard Worker long shl = a << 1; 319*795d594fSAndroid Build Coastguard Worker long x = shl + b; 320*795d594fSAndroid Build Coastguard Worker long y = shl - c; 321*795d594fSAndroid Build Coastguard Worker return x ^ y; 322*795d594fSAndroid Build Coastguard Worker } 323*795d594fSAndroid Build Coastguard Worker $noinline$returnVoid(long a)324*795d594fSAndroid Build Coastguard Worker public static void $noinline$returnVoid(long a) {} 325*795d594fSAndroid Build Coastguard Worker 326*795d594fSAndroid Build Coastguard Worker /// CHECK-START-RISCV64: long Main.$noinline$longOneAddSharesShlEnvironmentUse(long, long) instruction_simplifier_riscv64 (after) 327*795d594fSAndroid Build Coastguard Worker /// CHECK: Shl 328*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: Riscv64ShiftAdd 329*795d594fSAndroid Build Coastguard Worker $noinline$longOneAddSharesShlEnvironmentUse(long a, long b)330*795d594fSAndroid Build Coastguard Worker public static long $noinline$longOneAddSharesShlEnvironmentUse(long a, long b) { 331*795d594fSAndroid Build Coastguard Worker long shl = a << 1; 332*795d594fSAndroid Build Coastguard Worker long x = shl + b; 333*795d594fSAndroid Build Coastguard Worker $noinline$returnVoid(shl); 334*795d594fSAndroid Build Coastguard Worker return x; 335*795d594fSAndroid Build Coastguard Worker } 336*795d594fSAndroid Build Coastguard Worker 337*795d594fSAndroid Build Coastguard Worker /// CHECK-START-RISCV64: long Main.$noinline$longTwoTheSameShl(long) instruction_simplifier_riscv64 (after) 338*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: Riscv64ShiftAdd 339*795d594fSAndroid Build Coastguard Worker $noinline$longTwoTheSameShl(long a)340*795d594fSAndroid Build Coastguard Worker public static long $noinline$longTwoTheSameShl(long a) { 341*795d594fSAndroid Build Coastguard Worker return (a << 1) + (a << 1); 342*795d594fSAndroid Build Coastguard Worker } 343*795d594fSAndroid Build Coastguard Worker main(String[] args)344*795d594fSAndroid Build Coastguard Worker public static void main(String[] args) { 345*795d594fSAndroid Build Coastguard Worker assertIntEquals(0, $noinline$intRiscvShift1Add(0, 0)); 346*795d594fSAndroid Build Coastguard Worker 347*795d594fSAndroid Build Coastguard Worker assertLongEquals(-3L, $noinline$longIntRiscvShift1Add(-1L, -1)); 348*795d594fSAndroid Build Coastguard Worker assertLongEquals(3L, $noinline$longIntRiscvShift1Add(1L, 1)); 349*795d594fSAndroid Build Coastguard Worker 350*795d594fSAndroid Build Coastguard Worker assertLongEquals(-3L, $noinline$longRiscvShift1Add(-1L, -1L)); 351*795d594fSAndroid Build Coastguard Worker assertLongEquals(-1L, $noinline$longRiscvShift1Add(0L, -1L)); 352*795d594fSAndroid Build Coastguard Worker assertLongEquals(-2L, $noinline$longRiscvShift1Add(-1L, 0L)); 353*795d594fSAndroid Build Coastguard Worker assertLongEquals(0L, $noinline$longRiscvShift1Add(0L, 0L)); 354*795d594fSAndroid Build Coastguard Worker assertLongEquals(1L, $noinline$longRiscvShift1Add(0L, 1L)); 355*795d594fSAndroid Build Coastguard Worker assertLongEquals(2L, $noinline$longRiscvShift1Add(1L, 0L)); 356*795d594fSAndroid Build Coastguard Worker assertLongEquals(3L, $noinline$longRiscvShift1Add(1L, 1L)); 357*795d594fSAndroid Build Coastguard Worker 358*795d594fSAndroid Build Coastguard Worker assertLongEquals(-1L, $noinline$longRiscvShift1Add(Long.MAX_VALUE, 1L)); 359*795d594fSAndroid Build Coastguard Worker 360*795d594fSAndroid Build Coastguard Worker assertLongEquals(0L, $noinline$longRiscvShift2Add(0L, 0L)); 361*795d594fSAndroid Build Coastguard Worker assertLongEquals(1L, $noinline$longRiscvShift2Add(0L, 1L)); 362*795d594fSAndroid Build Coastguard Worker assertLongEquals(4L, $noinline$longRiscvShift2Add(1L, 0L)); 363*795d594fSAndroid Build Coastguard Worker assertLongEquals(5L, $noinline$longRiscvShift2Add(1L, 1L)); 364*795d594fSAndroid Build Coastguard Worker 365*795d594fSAndroid Build Coastguard Worker assertLongEquals(0L, $noinline$longRiscvShift3Add(0L, 0L)); 366*795d594fSAndroid Build Coastguard Worker assertLongEquals(0L, $noinline$longReverseRiscvShift3Add(0L, 0L)); 367*795d594fSAndroid Build Coastguard Worker assertLongEquals(1L, $noinline$longRiscvShift3Add(0L, 1L)); 368*795d594fSAndroid Build Coastguard Worker assertLongEquals(1L, $noinline$longReverseRiscvShift3Add(0L, 1L)); 369*795d594fSAndroid Build Coastguard Worker assertLongEquals(8L, $noinline$longRiscvShift3Add(1L, 0L)); 370*795d594fSAndroid Build Coastguard Worker assertLongEquals(8L, $noinline$longReverseRiscvShift3Add(1L, 0L)); 371*795d594fSAndroid Build Coastguard Worker assertLongEquals(9L, $noinline$longRiscvShift3Add(1L, 1L)); 372*795d594fSAndroid Build Coastguard Worker assertLongEquals(9L, $noinline$longReverseRiscvShift3Add(1L, 1L)); 373*795d594fSAndroid Build Coastguard Worker 374*795d594fSAndroid Build Coastguard Worker assertLongEquals(2L, $noinline$longRightShift(0L, 1L)); 375*795d594fSAndroid Build Coastguard Worker assertLongEquals(4L, $noinline$longRightShift(0L, 2L)); 376*795d594fSAndroid Build Coastguard Worker 377*795d594fSAndroid Build Coastguard Worker assertLongEquals(2L, $noinline$longLeftShift(1L, 0L)); 378*795d594fSAndroid Build Coastguard Worker assertLongEquals(4L, $noinline$longLeftShift(2L, 0L)); 379*795d594fSAndroid Build Coastguard Worker 380*795d594fSAndroid Build Coastguard Worker assertLongEquals(1L, $noinline$longShiftTooLittleDistance(1L, 0L)); 381*795d594fSAndroid Build Coastguard Worker assertLongEquals(2L, $noinline$longShiftTooLittleDistance(2L, 0L)); 382*795d594fSAndroid Build Coastguard Worker 383*795d594fSAndroid Build Coastguard Worker assertLongEquals(17L, $noinline$longShiftTooGreatDistance(1L, 1L)); 384*795d594fSAndroid Build Coastguard Worker assertLongEquals(32L, $noinline$longShiftTooGreatDistance(2L, 0L)); 385*795d594fSAndroid Build Coastguard Worker 386*795d594fSAndroid Build Coastguard Worker assertLongEquals(6L, $noinline$longTwoSimplifications(1L, 1L)); 387*795d594fSAndroid Build Coastguard Worker 388*795d594fSAndroid Build Coastguard Worker assertLongEquals(0L, $noinline$longTwoAddsUseShl(1L, 1L, 1L)); 389*795d594fSAndroid Build Coastguard Worker assertLongEquals(1L, $noinline$longTwoAddsUseShl(1L, 0L, 1L)); 390*795d594fSAndroid Build Coastguard Worker assertLongEquals(3L, $noinline$longTwoAddsUseShl(0L, 1L, 2L)); 391*795d594fSAndroid Build Coastguard Worker assertLongEquals(7L, $noinline$longTwoAddsUseShl(1L, 2L, 1L)); 392*795d594fSAndroid Build Coastguard Worker 393*795d594fSAndroid Build Coastguard Worker assertLongEquals(0L, $noinline$longTwoAddsMixedOrderUseShl(1L, 1L, 1L)); 394*795d594fSAndroid Build Coastguard Worker assertLongEquals(1L, $noinline$longTwoAddsMixedOrderUseShl(1L, 0L, 1L)); 395*795d594fSAndroid Build Coastguard Worker assertLongEquals(3L, $noinline$longTwoAddsMixedOrderUseShl(0L, 1L, 2L)); 396*795d594fSAndroid Build Coastguard Worker 397*795d594fSAndroid Build Coastguard Worker assertLongEquals(2L, $noinline$longOneAddSharesShlUse(1L, 1L, 1L)); 398*795d594fSAndroid Build Coastguard Worker assertLongEquals(3L, $noinline$longOneAddSharesShlUse(1L, 0L, 1L)); 399*795d594fSAndroid Build Coastguard Worker assertLongEquals(-1L, $noinline$longOneAddSharesShlUse(0L, 1L, 2L)); 400*795d594fSAndroid Build Coastguard Worker assertLongEquals(5L, $noinline$longOneAddSharesShlUse(1L, 2L, 1L)); 401*795d594fSAndroid Build Coastguard Worker 402*795d594fSAndroid Build Coastguard Worker assertLongEquals(3L, $noinline$longOneAddSharesShlEnvironmentUse(1L, 1L)); 403*795d594fSAndroid Build Coastguard Worker 404*795d594fSAndroid Build Coastguard Worker assertLongEquals(4L, $noinline$longTwoTheSameShl(1L)); 405*795d594fSAndroid Build Coastguard Worker } 406*795d594fSAndroid Build Coastguard Worker } 407