1*795d594fSAndroid Build Coastguard Worker /* 2*795d594fSAndroid Build Coastguard Worker * Copyright (C) 2020 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 DivTest { expectEquals(int expected, int result)18*795d594fSAndroid Build Coastguard Worker private static void expectEquals(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 expectEquals(long expected, long result)24*795d594fSAndroid Build Coastguard Worker private static void expectEquals(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 expectEquals(String expected, String result)30*795d594fSAndroid Build Coastguard Worker private static void expectEquals(String expected, String result) { 31*795d594fSAndroid Build Coastguard Worker if (!expected.equals(result)) { 32*795d594fSAndroid Build Coastguard Worker throw new Error("Expected: " + expected + ", found: " + result); 33*795d594fSAndroid Build Coastguard Worker } 34*795d594fSAndroid Build Coastguard Worker } 35*795d594fSAndroid Build Coastguard Worker main()36*795d594fSAndroid Build Coastguard Worker public static void main() { 37*795d594fSAndroid Build Coastguard Worker divInt(); 38*795d594fSAndroid Build Coastguard Worker divLong(); 39*795d594fSAndroid Build Coastguard Worker } 40*795d594fSAndroid Build Coastguard Worker divInt()41*795d594fSAndroid Build Coastguard Worker private static void divInt() { 42*795d594fSAndroid Build Coastguard Worker expectEquals(0, $noinline$IntDivBy18(0)); 43*795d594fSAndroid Build Coastguard Worker expectEquals(0, $noinline$IntDivBy18(1)); 44*795d594fSAndroid Build Coastguard Worker expectEquals(0, $noinline$IntDivBy18(-1)); 45*795d594fSAndroid Build Coastguard Worker expectEquals(1, $noinline$IntDivBy18(18)); 46*795d594fSAndroid Build Coastguard Worker expectEquals(-1, $noinline$IntDivBy18(-18)); 47*795d594fSAndroid Build Coastguard Worker expectEquals(3, $noinline$IntDivBy18(65)); 48*795d594fSAndroid Build Coastguard Worker expectEquals(-3, $noinline$IntDivBy18(-65)); 49*795d594fSAndroid Build Coastguard Worker 50*795d594fSAndroid Build Coastguard Worker expectEquals(0, $noinline$IntALenDivBy18(new int[0])); 51*795d594fSAndroid Build Coastguard Worker expectEquals(0, $noinline$IntALenDivBy18(new int[1])); 52*795d594fSAndroid Build Coastguard Worker expectEquals(1, $noinline$IntALenDivBy18(new int[18])); 53*795d594fSAndroid Build Coastguard Worker expectEquals(3, $noinline$IntALenDivBy18(new int[65])); 54*795d594fSAndroid Build Coastguard Worker 55*795d594fSAndroid Build Coastguard Worker expectEquals(0, $noinline$IntDivByMinus18(0)); 56*795d594fSAndroid Build Coastguard Worker expectEquals(0, $noinline$IntDivByMinus18(1)); 57*795d594fSAndroid Build Coastguard Worker expectEquals(0, $noinline$IntDivByMinus18(-1)); 58*795d594fSAndroid Build Coastguard Worker expectEquals(-1, $noinline$IntDivByMinus18(18)); 59*795d594fSAndroid Build Coastguard Worker expectEquals(1, $noinline$IntDivByMinus18(-18)); 60*795d594fSAndroid Build Coastguard Worker expectEquals(-3, $noinline$IntDivByMinus18(65)); 61*795d594fSAndroid Build Coastguard Worker expectEquals(3, $noinline$IntDivByMinus18(-65)); 62*795d594fSAndroid Build Coastguard Worker 63*795d594fSAndroid Build Coastguard Worker expectEquals(0, $noinline$IntDivBy7(0)); 64*795d594fSAndroid Build Coastguard Worker expectEquals(0, $noinline$IntDivBy7(1)); 65*795d594fSAndroid Build Coastguard Worker expectEquals(0, $noinline$IntDivBy7(-1)); 66*795d594fSAndroid Build Coastguard Worker expectEquals(1, $noinline$IntDivBy7(7)); 67*795d594fSAndroid Build Coastguard Worker expectEquals(-1, $noinline$IntDivBy7(-7)); 68*795d594fSAndroid Build Coastguard Worker expectEquals(3, $noinline$IntDivBy7(22)); 69*795d594fSAndroid Build Coastguard Worker expectEquals(-3, $noinline$IntDivBy7(-22)); 70*795d594fSAndroid Build Coastguard Worker 71*795d594fSAndroid Build Coastguard Worker expectEquals(0, $noinline$IntALenDivBy7(new int[0])); 72*795d594fSAndroid Build Coastguard Worker expectEquals(0, $noinline$IntALenDivBy7(new int[1])); 73*795d594fSAndroid Build Coastguard Worker expectEquals(1, $noinline$IntALenDivBy7(new int[7])); 74*795d594fSAndroid Build Coastguard Worker expectEquals(3, $noinline$IntALenDivBy7(new int[22])); 75*795d594fSAndroid Build Coastguard Worker 76*795d594fSAndroid Build Coastguard Worker expectEquals(0, $noinline$IntDivByMinus7(0)); 77*795d594fSAndroid Build Coastguard Worker expectEquals(0, $noinline$IntDivByMinus7(1)); 78*795d594fSAndroid Build Coastguard Worker expectEquals(0, $noinline$IntDivByMinus7(-1)); 79*795d594fSAndroid Build Coastguard Worker expectEquals(-1, $noinline$IntDivByMinus7(7)); 80*795d594fSAndroid Build Coastguard Worker expectEquals(1, $noinline$IntDivByMinus7(-7)); 81*795d594fSAndroid Build Coastguard Worker expectEquals(-3, $noinline$IntDivByMinus7(22)); 82*795d594fSAndroid Build Coastguard Worker expectEquals(3, $noinline$IntDivByMinus7(-22)); 83*795d594fSAndroid Build Coastguard Worker 84*795d594fSAndroid Build Coastguard Worker expectEquals(0, $noinline$IntDivBy6(0)); 85*795d594fSAndroid Build Coastguard Worker expectEquals(0, $noinline$IntDivBy6(1)); 86*795d594fSAndroid Build Coastguard Worker expectEquals(0, $noinline$IntDivBy6(-1)); 87*795d594fSAndroid Build Coastguard Worker expectEquals(1, $noinline$IntDivBy6(6)); 88*795d594fSAndroid Build Coastguard Worker expectEquals(-1, $noinline$IntDivBy6(-6)); 89*795d594fSAndroid Build Coastguard Worker expectEquals(3, $noinline$IntDivBy6(19)); 90*795d594fSAndroid Build Coastguard Worker expectEquals(-3, $noinline$IntDivBy6(-19)); 91*795d594fSAndroid Build Coastguard Worker 92*795d594fSAndroid Build Coastguard Worker expectEquals(0, $noinline$IntALenDivBy6(new int[0])); 93*795d594fSAndroid Build Coastguard Worker expectEquals(0, $noinline$IntALenDivBy6(new int[1])); 94*795d594fSAndroid Build Coastguard Worker expectEquals(1, $noinline$IntALenDivBy6(new int[6])); 95*795d594fSAndroid Build Coastguard Worker expectEquals(3, $noinline$IntALenDivBy6(new int[19])); 96*795d594fSAndroid Build Coastguard Worker 97*795d594fSAndroid Build Coastguard Worker expectEquals(0, $noinline$IntDivByMinus6(0)); 98*795d594fSAndroid Build Coastguard Worker expectEquals(0, $noinline$IntDivByMinus6(1)); 99*795d594fSAndroid Build Coastguard Worker expectEquals(0, $noinline$IntDivByMinus6(-1)); 100*795d594fSAndroid Build Coastguard Worker expectEquals(-1, $noinline$IntDivByMinus6(6)); 101*795d594fSAndroid Build Coastguard Worker expectEquals(1, $noinline$IntDivByMinus6(-6)); 102*795d594fSAndroid Build Coastguard Worker expectEquals(-3, $noinline$IntDivByMinus6(19)); 103*795d594fSAndroid Build Coastguard Worker expectEquals(3, $noinline$IntDivByMinus6(-19)); 104*795d594fSAndroid Build Coastguard Worker 105*795d594fSAndroid Build Coastguard Worker expectEquals(2, $noinline$UnsignedIntDiv01(12)); 106*795d594fSAndroid Build Coastguard Worker expectEquals(2, $noinline$UnsignedIntDiv02(12)); 107*795d594fSAndroid Build Coastguard Worker expectEquals(2, $noinline$UnsignedIntDiv03(12)); 108*795d594fSAndroid Build Coastguard Worker expectEquals(2, $noinline$UnsignedIntDiv04(12)); 109*795d594fSAndroid Build Coastguard Worker expectEquals("01", $noinline$UnsignedIntDiv05(10)); 110*795d594fSAndroid Build Coastguard Worker expectEquals("321", $noinline$UnsignedIntDiv05(123)); 111*795d594fSAndroid Build Coastguard Worker expectEquals(1, $noinline$UnsignedIntDiv06(101)); 112*795d594fSAndroid Build Coastguard Worker expectEquals(1, $noinline$UnsignedIntDiv07(10)); 113*795d594fSAndroid Build Coastguard Worker expectEquals(1, $noinline$UnsignedIntDiv07(100)); 114*795d594fSAndroid Build Coastguard Worker expectEquals(10, $noinline$UnsignedIntDiv08(100)); 115*795d594fSAndroid Build Coastguard Worker expectEquals(11, $noinline$UnsignedIntDiv08(101)); 116*795d594fSAndroid Build Coastguard Worker 117*795d594fSAndroid Build Coastguard Worker expectEquals(-2, $noinline$SignedIntDiv01(-12)); 118*795d594fSAndroid Build Coastguard Worker expectEquals(-2, $noinline$SignedIntDiv02(-12)); 119*795d594fSAndroid Build Coastguard Worker expectEquals(2, $noinline$SignedIntDiv03(-12)); 120*795d594fSAndroid Build Coastguard Worker expectEquals(2, $noinline$SignedIntDiv04(-12, true)); 121*795d594fSAndroid Build Coastguard Worker expectEquals(-2, $noinline$SignedIntDiv05(-12, 0,-13)); 122*795d594fSAndroid Build Coastguard Worker expectEquals(-2, $noinline$SignedIntDiv06(-12)); 123*795d594fSAndroid Build Coastguard Worker } 124*795d594fSAndroid Build Coastguard Worker 125*795d594fSAndroid Build Coastguard Worker // A test case to check that 'lsr' and 'asr' are combined into one 'asr'. 126*795d594fSAndroid Build Coastguard Worker // For divisor 18 seen in an MP3 decoding workload there is no need 127*795d594fSAndroid Build Coastguard Worker // to correct the result of get_high(dividend * magic). So there are no 128*795d594fSAndroid Build Coastguard Worker // instructions between 'lsr' and 'asr'. In such a case they can be combined 129*795d594fSAndroid Build Coastguard Worker // into one 'asr'. 130*795d594fSAndroid Build Coastguard Worker // 131*795d594fSAndroid Build Coastguard Worker /// CHECK-START-ARM64: int DivTest.$noinline$IntDivBy18(int) disassembly (after) 132*795d594fSAndroid Build Coastguard Worker /// CHECK: asr x{{\d+}}, x{{\d+}}, #34 133*795d594fSAndroid Build Coastguard Worker /// CHECK-NEXT: add w{{\d+}}, w{{\d+}}, w{{\d+}}, lsr #31 $noinline$IntDivBy18(int v)134*795d594fSAndroid Build Coastguard Worker private static int $noinline$IntDivBy18(int v) { 135*795d594fSAndroid Build Coastguard Worker int r = v / 18; 136*795d594fSAndroid Build Coastguard Worker return r; 137*795d594fSAndroid Build Coastguard Worker } 138*795d594fSAndroid Build Coastguard Worker 139*795d594fSAndroid Build Coastguard Worker // A test case to check that a correcting 'add' is not generated for a non-negative 140*795d594fSAndroid Build Coastguard Worker // dividend and a positive divisor. 141*795d594fSAndroid Build Coastguard Worker // 142*795d594fSAndroid Build Coastguard Worker /// CHECK-START-ARM: int DivTest.$noinline$IntALenDivBy18(int[]) disassembly (after) 143*795d594fSAndroid Build Coastguard Worker /// CHECK: smull r{{\d+}}, r{{\d+}}, r{{\d+}}, r{{\d+}} 144*795d594fSAndroid Build Coastguard Worker /// CHECK-NEXT: lsr{{s?}} r{{\d+}}, r{{\d+}}, #2 145*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: sub r{{\d+}}, r{{\d+}}, r{{\d+}}, asr #31 146*795d594fSAndroid Build Coastguard Worker // 147*795d594fSAndroid Build Coastguard Worker /// CHECK-START-ARM64: int DivTest.$noinline$IntALenDivBy18(int[]) disassembly (after) 148*795d594fSAndroid Build Coastguard Worker /// CHECK: lsr x{{\d+}}, x{{\d+}}, #34 149*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: add w{{\d+}}, w{{\d+}}, w{{\d+}}, lsr #31 $noinline$IntALenDivBy18(int[] arr)150*795d594fSAndroid Build Coastguard Worker private static int $noinline$IntALenDivBy18(int[] arr) { 151*795d594fSAndroid Build Coastguard Worker int r = arr.length / 18; 152*795d594fSAndroid Build Coastguard Worker return r; 153*795d594fSAndroid Build Coastguard Worker } 154*795d594fSAndroid Build Coastguard Worker 155*795d594fSAndroid Build Coastguard Worker // A test case to check that 'lsr' and 'asr' are combined into one 'asr'. 156*795d594fSAndroid Build Coastguard Worker // Divisor -18 has the same property as divisor 18: no need to correct the 157*795d594fSAndroid Build Coastguard Worker // result of get_high(dividend * magic). So there are no 158*795d594fSAndroid Build Coastguard Worker // instructions between 'lsr' and 'asr'. In such a case they can be combined 159*795d594fSAndroid Build Coastguard Worker // into one 'asr'. 160*795d594fSAndroid Build Coastguard Worker // 161*795d594fSAndroid Build Coastguard Worker /// CHECK-START-ARM64: int DivTest.$noinline$IntDivByMinus18(int) disassembly (after) 162*795d594fSAndroid Build Coastguard Worker /// CHECK: asr x{{\d+}}, x{{\d+}}, #34 163*795d594fSAndroid Build Coastguard Worker /// CHECK-NEXT: add w{{\d+}}, w{{\d+}}, w{{\d+}}, lsr #31 $noinline$IntDivByMinus18(int v)164*795d594fSAndroid Build Coastguard Worker private static int $noinline$IntDivByMinus18(int v) { 165*795d594fSAndroid Build Coastguard Worker int r = v / -18; 166*795d594fSAndroid Build Coastguard Worker return r; 167*795d594fSAndroid Build Coastguard Worker } 168*795d594fSAndroid Build Coastguard Worker 169*795d594fSAndroid Build Coastguard Worker // A test case to check that 'lsr' and 'add' are combined into one 'adds'. 170*795d594fSAndroid Build Coastguard Worker // For divisor 7 seen in the core library the result of get_high(dividend * magic) 171*795d594fSAndroid Build Coastguard Worker // must be corrected by the 'add' instruction. 172*795d594fSAndroid Build Coastguard Worker // 173*795d594fSAndroid Build Coastguard Worker // The test case also checks 'add' and 'add_shift' are optimized into 'adds' and 'cinc'. 174*795d594fSAndroid Build Coastguard Worker // 175*795d594fSAndroid Build Coastguard Worker /// CHECK-START-ARM64: int DivTest.$noinline$IntDivBy7(int) disassembly (after) 176*795d594fSAndroid Build Coastguard Worker /// CHECK: adds x{{\d+}}, x{{\d+}}, x{{\d+}}, lsl #32 177*795d594fSAndroid Build Coastguard Worker /// CHECK-NEXT: asr x{{\d+}}, x{{\d+}}, #34 178*795d594fSAndroid Build Coastguard Worker /// CHECK-NEXT: cinc w{{\d+}}, w{{\d+}}, mi $noinline$IntDivBy7(int v)179*795d594fSAndroid Build Coastguard Worker private static int $noinline$IntDivBy7(int v) { 180*795d594fSAndroid Build Coastguard Worker int r = v / 7; 181*795d594fSAndroid Build Coastguard Worker return r; 182*795d594fSAndroid Build Coastguard Worker } 183*795d594fSAndroid Build Coastguard Worker 184*795d594fSAndroid Build Coastguard Worker // A test case to check that a correcting 'add' is not generated for a non-negative 185*795d594fSAndroid Build Coastguard Worker // dividend and a positive divisor. 186*795d594fSAndroid Build Coastguard Worker // 187*795d594fSAndroid Build Coastguard Worker /// CHECK-START-ARM: int DivTest.$noinline$IntALenDivBy7(int[]) disassembly (after) 188*795d594fSAndroid Build Coastguard Worker /// CHECK: smull r{{\d+}}, r{{\d+}}, r{{\d+}}, r{{\d+}} 189*795d594fSAndroid Build Coastguard Worker /// CHECK-NEXT: add{{s?}} r{{\d+}}, r{{\d+}} 190*795d594fSAndroid Build Coastguard Worker /// CHECK-NEXT: lsr{{s?}} r{{\d+}}, r{{\d+}}, #2 191*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: sub r{{\d+}}, r{{\d+}}, r{{\d+}}, asr #31 192*795d594fSAndroid Build Coastguard Worker // 193*795d594fSAndroid Build Coastguard Worker /// CHECK-START-ARM64: int DivTest.$noinline$IntALenDivBy7(int[]) disassembly (after) 194*795d594fSAndroid Build Coastguard Worker /// CHECK: adds x{{\d+}}, x{{\d+}}, x{{\d+}}, lsl #32 195*795d594fSAndroid Build Coastguard Worker /// CHECK-NEXT: lsr x{{\d+}}, x{{\d+}}, #34 196*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: cinc w{{\d+}}, w{{\d+}}, mi $noinline$IntALenDivBy7(int[] arr)197*795d594fSAndroid Build Coastguard Worker private static int $noinline$IntALenDivBy7(int[] arr) { 198*795d594fSAndroid Build Coastguard Worker int r = arr.length / 7; 199*795d594fSAndroid Build Coastguard Worker return r; 200*795d594fSAndroid Build Coastguard Worker } 201*795d594fSAndroid Build Coastguard Worker 202*795d594fSAndroid Build Coastguard Worker // A test case to check that 'lsr' and 'add' are combined into one 'adds'. 203*795d594fSAndroid Build Coastguard Worker // Divisor -7 has the same property as divisor 7: the result of get_high(dividend * magic) 204*795d594fSAndroid Build Coastguard Worker // must be corrected. In this case it is a 'sub' instruction. 205*795d594fSAndroid Build Coastguard Worker // 206*795d594fSAndroid Build Coastguard Worker // The test case also checks 'sub' and 'add_shift' are optimized into 'subs' and 'cinc'. 207*795d594fSAndroid Build Coastguard Worker // 208*795d594fSAndroid Build Coastguard Worker /// CHECK-START-ARM64: int DivTest.$noinline$IntDivByMinus7(int) disassembly (after) 209*795d594fSAndroid Build Coastguard Worker /// CHECK: subs x{{\d+}}, x{{\d+}}, x{{\d+}}, lsl #32 210*795d594fSAndroid Build Coastguard Worker /// CHECK-NEXT: asr x{{\d+}}, x{{\d+}}, #34 211*795d594fSAndroid Build Coastguard Worker /// CHECK-NEXT: cinc w{{\d+}}, w{{\d+}}, mi $noinline$IntDivByMinus7(int v)212*795d594fSAndroid Build Coastguard Worker private static int $noinline$IntDivByMinus7(int v) { 213*795d594fSAndroid Build Coastguard Worker int r = v / -7; 214*795d594fSAndroid Build Coastguard Worker return r; 215*795d594fSAndroid Build Coastguard Worker } 216*795d594fSAndroid Build Coastguard Worker 217*795d594fSAndroid Build Coastguard Worker // A test case to check that 'asr' is used to get the high 32 bits of the result of 218*795d594fSAndroid Build Coastguard Worker // 'dividend * magic'. 219*795d594fSAndroid Build Coastguard Worker // For divisor 6 seen in the core library there is no need to correct the result of 220*795d594fSAndroid Build Coastguard Worker // get_high(dividend * magic). Also there is no 'asr' before the final 'add' instruction 221*795d594fSAndroid Build Coastguard Worker // which uses only the high 32 bits of the result. In such a case 'asr' getting the high 222*795d594fSAndroid Build Coastguard Worker // 32 bits can be used as well. 223*795d594fSAndroid Build Coastguard Worker // 224*795d594fSAndroid Build Coastguard Worker /// CHECK-START-ARM64: int DivTest.$noinline$IntDivBy6(int) disassembly (after) 225*795d594fSAndroid Build Coastguard Worker /// CHECK: asr x{{\d+}}, x{{\d+}}, #32 226*795d594fSAndroid Build Coastguard Worker /// CHECK-NEXT: add w{{\d+}}, w{{\d+}}, w{{\d+}}, lsr #31 $noinline$IntDivBy6(int v)227*795d594fSAndroid Build Coastguard Worker private static int $noinline$IntDivBy6(int v) { 228*795d594fSAndroid Build Coastguard Worker int r = v / 6; 229*795d594fSAndroid Build Coastguard Worker return r; 230*795d594fSAndroid Build Coastguard Worker } 231*795d594fSAndroid Build Coastguard Worker 232*795d594fSAndroid Build Coastguard Worker // A test case to check that a correcting 'add' is not generated for a non-negative 233*795d594fSAndroid Build Coastguard Worker // dividend and a positive divisor. 234*795d594fSAndroid Build Coastguard Worker // 235*795d594fSAndroid Build Coastguard Worker /// CHECK-START-ARM: int DivTest.$noinline$IntALenDivBy6(int[]) disassembly (after) 236*795d594fSAndroid Build Coastguard Worker /// CHECK: smull r{{\d+}}, r{{\d+}}, r{{\d+}}, r{{\d+}} 237*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: sub r{{\d+}}, r{{\d+}}, r{{\d+}}, asr #31 238*795d594fSAndroid Build Coastguard Worker // 239*795d594fSAndroid Build Coastguard Worker /// CHECK-START-ARM64: int DivTest.$noinline$IntALenDivBy6(int[]) disassembly (after) 240*795d594fSAndroid Build Coastguard Worker /// CHECK: lsr x{{\d+}}, x{{\d+}}, #32 241*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: add w{{\d+}}, w{{\d+}}, w{{\d+}}, lsr #31 $noinline$IntALenDivBy6(int[] arr)242*795d594fSAndroid Build Coastguard Worker private static int $noinline$IntALenDivBy6(int[] arr) { 243*795d594fSAndroid Build Coastguard Worker int r = arr.length / 6; 244*795d594fSAndroid Build Coastguard Worker return r; 245*795d594fSAndroid Build Coastguard Worker } 246*795d594fSAndroid Build Coastguard Worker 247*795d594fSAndroid Build Coastguard Worker // A test case to check that 'asr' is used to get the high 32 bits of the result of 248*795d594fSAndroid Build Coastguard Worker // 'dividend * magic'. 249*795d594fSAndroid Build Coastguard Worker // Divisor -6 has the same property as divisor 6: no need to correct the result of 250*795d594fSAndroid Build Coastguard Worker // get_high(dividend * magic) and no 'asr' before the final 'add' instruction 251*795d594fSAndroid Build Coastguard Worker // which uses only the high 32 bits of the result. In such a case 'asr' getting the high 252*795d594fSAndroid Build Coastguard Worker // 32 bits can be used as well. 253*795d594fSAndroid Build Coastguard Worker // 254*795d594fSAndroid Build Coastguard Worker /// CHECK-START-ARM64: int DivTest.$noinline$IntDivByMinus6(int) disassembly (after) 255*795d594fSAndroid Build Coastguard Worker /// CHECK: asr x{{\d+}}, x{{\d+}}, #32 256*795d594fSAndroid Build Coastguard Worker /// CHECK-NEXT: add w{{\d+}}, w{{\d+}}, w{{\d+}}, lsr #31 $noinline$IntDivByMinus6(int v)257*795d594fSAndroid Build Coastguard Worker private static int $noinline$IntDivByMinus6(int v) { 258*795d594fSAndroid Build Coastguard Worker int r = v / -6; 259*795d594fSAndroid Build Coastguard Worker return r; 260*795d594fSAndroid Build Coastguard Worker } 261*795d594fSAndroid Build Coastguard Worker $noinline$Negate(int v)262*795d594fSAndroid Build Coastguard Worker private static int $noinline$Negate(int v) { 263*795d594fSAndroid Build Coastguard Worker return -v; 264*795d594fSAndroid Build Coastguard Worker } 265*795d594fSAndroid Build Coastguard Worker $noinline$Decrement(int v)266*795d594fSAndroid Build Coastguard Worker private static int $noinline$Decrement(int v) { 267*795d594fSAndroid Build Coastguard Worker return v - 1; 268*795d594fSAndroid Build Coastguard Worker } 269*795d594fSAndroid Build Coastguard Worker $noinline$Increment(int v)270*795d594fSAndroid Build Coastguard Worker private static int $noinline$Increment(int v) { 271*795d594fSAndroid Build Coastguard Worker return v + 1; 272*795d594fSAndroid Build Coastguard Worker } 273*795d594fSAndroid Build Coastguard Worker 274*795d594fSAndroid Build Coastguard Worker // A test case to check that a correcting 'add' is not generated for a non-negative 275*795d594fSAndroid Build Coastguard Worker // dividend and a positive divisor. 276*795d594fSAndroid Build Coastguard Worker // 277*795d594fSAndroid Build Coastguard Worker /// CHECK-START-ARM: int DivTest.$noinline$UnsignedIntDiv01(int) disassembly (after) 278*795d594fSAndroid Build Coastguard Worker /// CHECK: smull r{{\d+}}, r{{\d+}}, r{{\d+}}, r{{\d+}} 279*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: sub r{{\d+}}, r{{\d+}}, r{{\d+}}, asr #31 280*795d594fSAndroid Build Coastguard Worker // 281*795d594fSAndroid Build Coastguard Worker /// CHECK-START-ARM64: int DivTest.$noinline$UnsignedIntDiv01(int) disassembly (after) 282*795d594fSAndroid Build Coastguard Worker /// CHECK: lsr x{{\d+}}, x{{\d+}}, #32 283*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: add w{{\d+}}, w{{\d+}}, w{{\d+}}, lsr #31 $noinline$UnsignedIntDiv01(int v)284*795d594fSAndroid Build Coastguard Worker private static int $noinline$UnsignedIntDiv01(int v) { 285*795d594fSAndroid Build Coastguard Worker int c = 0; 286*795d594fSAndroid Build Coastguard Worker if (v > 0) { 287*795d594fSAndroid Build Coastguard Worker c = v / 6; 288*795d594fSAndroid Build Coastguard Worker } else { 289*795d594fSAndroid Build Coastguard Worker c = $noinline$Negate(v); // This is to prevent from using Select. 290*795d594fSAndroid Build Coastguard Worker } 291*795d594fSAndroid Build Coastguard Worker return c; 292*795d594fSAndroid Build Coastguard Worker } 293*795d594fSAndroid Build Coastguard Worker 294*795d594fSAndroid Build Coastguard Worker // A test case to check that a correcting 'add' is not generated for a non-negative 295*795d594fSAndroid Build Coastguard Worker // dividend and a positive divisor. 296*795d594fSAndroid Build Coastguard Worker // 297*795d594fSAndroid Build Coastguard Worker /// CHECK-START-ARM: int DivTest.$noinline$UnsignedIntDiv02(int) disassembly (after) 298*795d594fSAndroid Build Coastguard Worker /// CHECK: smull r{{\d+}}, r{{\d+}}, r{{\d+}}, r{{\d+}} 299*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: sub r{{\d+}}, r{{\d+}}, r{{\d+}}, asr #31 300*795d594fSAndroid Build Coastguard Worker // 301*795d594fSAndroid Build Coastguard Worker /// CHECK-START-ARM64: int DivTest.$noinline$UnsignedIntDiv02(int) disassembly (after) 302*795d594fSAndroid Build Coastguard Worker /// CHECK: lsr x{{\d+}}, x{{\d+}}, #32 303*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: add w{{\d+}}, w{{\d+}}, w{{\d+}}, lsr #31 $noinline$UnsignedIntDiv02(int v)304*795d594fSAndroid Build Coastguard Worker private static int $noinline$UnsignedIntDiv02(int v) { 305*795d594fSAndroid Build Coastguard Worker int c = 0; 306*795d594fSAndroid Build Coastguard Worker if (0 < v) { 307*795d594fSAndroid Build Coastguard Worker c = v / 6; 308*795d594fSAndroid Build Coastguard Worker } else { 309*795d594fSAndroid Build Coastguard Worker c = $noinline$Negate(v); // This is to prevent from using Select. 310*795d594fSAndroid Build Coastguard Worker } 311*795d594fSAndroid Build Coastguard Worker return c; 312*795d594fSAndroid Build Coastguard Worker } 313*795d594fSAndroid Build Coastguard Worker 314*795d594fSAndroid Build Coastguard Worker // A test case to check that a correcting 'add' is not generated for a non-negative 315*795d594fSAndroid Build Coastguard Worker // dividend and a positive divisor. 316*795d594fSAndroid Build Coastguard Worker // 317*795d594fSAndroid Build Coastguard Worker /// CHECK-START-ARM: int DivTest.$noinline$UnsignedIntDiv03(int) disassembly (after) 318*795d594fSAndroid Build Coastguard Worker /// CHECK: smull r{{\d+}}, r{{\d+}}, r{{\d+}}, r{{\d+}} 319*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: sub r{{\d+}}, r{{\d+}}, r{{\d+}}, asr #31 320*795d594fSAndroid Build Coastguard Worker // 321*795d594fSAndroid Build Coastguard Worker /// CHECK-START-ARM64: int DivTest.$noinline$UnsignedIntDiv03(int) disassembly (after) 322*795d594fSAndroid Build Coastguard Worker /// CHECK: lsr x{{\d+}}, x{{\d+}}, #32 323*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: add w{{\d+}}, w{{\d+}}, w{{\d+}}, lsr #31 $noinline$UnsignedIntDiv03(int v)324*795d594fSAndroid Build Coastguard Worker private static int $noinline$UnsignedIntDiv03(int v) { 325*795d594fSAndroid Build Coastguard Worker int c = 0; 326*795d594fSAndroid Build Coastguard Worker if (v >= 0) { 327*795d594fSAndroid Build Coastguard Worker c = v / 6; 328*795d594fSAndroid Build Coastguard Worker } else { 329*795d594fSAndroid Build Coastguard Worker c = $noinline$Negate(v); // This is to prevent from using Select. 330*795d594fSAndroid Build Coastguard Worker } 331*795d594fSAndroid Build Coastguard Worker return c; 332*795d594fSAndroid Build Coastguard Worker } 333*795d594fSAndroid Build Coastguard Worker 334*795d594fSAndroid Build Coastguard Worker // A test case to check that a correcting 'add' is not generated for a non-negative 335*795d594fSAndroid Build Coastguard Worker // dividend and a positive divisor. 336*795d594fSAndroid Build Coastguard Worker // 337*795d594fSAndroid Build Coastguard Worker /// CHECK-START-ARM: int DivTest.$noinline$UnsignedIntDiv04(int) disassembly (after) 338*795d594fSAndroid Build Coastguard Worker /// CHECK: smull r{{\d+}}, r{{\d+}}, r{{\d+}}, r{{\d+}} 339*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: sub r{{\d+}}, r{{\d+}}, r{{\d+}}, asr #31 340*795d594fSAndroid Build Coastguard Worker // 341*795d594fSAndroid Build Coastguard Worker /// CHECK-START-ARM64: int DivTest.$noinline$UnsignedIntDiv04(int) disassembly (after) 342*795d594fSAndroid Build Coastguard Worker /// CHECK: lsr x{{\d+}}, x{{\d+}}, #32 343*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: add w{{\d+}}, w{{\d+}}, w{{\d+}}, lsr #31 $noinline$UnsignedIntDiv04(int v)344*795d594fSAndroid Build Coastguard Worker private static int $noinline$UnsignedIntDiv04(int v) { 345*795d594fSAndroid Build Coastguard Worker int c = 0; 346*795d594fSAndroid Build Coastguard Worker if (0 <= v) { 347*795d594fSAndroid Build Coastguard Worker c = v / 6; 348*795d594fSAndroid Build Coastguard Worker } else { 349*795d594fSAndroid Build Coastguard Worker c = $noinline$Negate(v); // This is to prevent from using Select. 350*795d594fSAndroid Build Coastguard Worker } 351*795d594fSAndroid Build Coastguard Worker return c; 352*795d594fSAndroid Build Coastguard Worker } 353*795d594fSAndroid Build Coastguard Worker 354*795d594fSAndroid Build Coastguard Worker // A test case to check that a correcting 'add' is not generated for a non-negative 355*795d594fSAndroid Build Coastguard Worker // dividend and a positive divisor. 356*795d594fSAndroid Build Coastguard Worker // 357*795d594fSAndroid Build Coastguard Worker /// CHECK-START-ARM: java.lang.String DivTest.$noinline$UnsignedIntDiv05(int) disassembly (after) 358*795d594fSAndroid Build Coastguard Worker /// CHECK: smull r{{\d+}}, r{{\d+}}, r{{\d+}}, r{{\d+}} 359*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: sub r{{\d+}}, r{{\d+}}, r{{\d+}}, asr #31 360*795d594fSAndroid Build Coastguard Worker // 361*795d594fSAndroid Build Coastguard Worker /// CHECK-START-ARM64: java.lang.String DivTest.$noinline$UnsignedIntDiv05(int) disassembly (after) 362*795d594fSAndroid Build Coastguard Worker /// CHECK: smull x{{\d+}}, w{{\d+}}, w{{\d+}} 363*795d594fSAndroid Build Coastguard Worker /// CHECK: lsr x{{\d+}}, x{{\d+}}, #34 364*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: add w{{\d+}}, w{{\d+}}, w{{\d+}}, lsr #31 $noinline$UnsignedIntDiv05(int v)365*795d594fSAndroid Build Coastguard Worker private static String $noinline$UnsignedIntDiv05(int v) { 366*795d594fSAndroid Build Coastguard Worker String r = ""; 367*795d594fSAndroid Build Coastguard Worker while (v > 0) { 368*795d594fSAndroid Build Coastguard Worker int d = v % 10; 369*795d594fSAndroid Build Coastguard Worker r += (char)(d + '0'); 370*795d594fSAndroid Build Coastguard Worker v /= 10; 371*795d594fSAndroid Build Coastguard Worker } 372*795d594fSAndroid Build Coastguard Worker return r; 373*795d594fSAndroid Build Coastguard Worker } 374*795d594fSAndroid Build Coastguard Worker 375*795d594fSAndroid Build Coastguard Worker // A test case to check that a correcting 'add' is not generated for a non-negative 376*795d594fSAndroid Build Coastguard Worker // dividend and a positive divisor. 377*795d594fSAndroid Build Coastguard Worker // 378*795d594fSAndroid Build Coastguard Worker /// CHECK-START-ARM: int DivTest.$noinline$UnsignedIntDiv06(int) disassembly (after) 379*795d594fSAndroid Build Coastguard Worker /// CHECK: smull r{{\d+}}, r{{\d+}}, r{{\d+}}, r{{\d+}} 380*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: sub r{{\d+}}, r{{\d+}}, r{{\d+}}, asr #31 381*795d594fSAndroid Build Coastguard Worker // 382*795d594fSAndroid Build Coastguard Worker /// CHECK-START-ARM64: int DivTest.$noinline$UnsignedIntDiv06(int) disassembly (after) 383*795d594fSAndroid Build Coastguard Worker /// CHECK: smull x{{\d+}}, w{{\d+}}, w{{\d+}} 384*795d594fSAndroid Build Coastguard Worker /// CHECK: lsr x{{\d+}}, x{{\d+}}, #34 385*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: add w{{\d+}}, w{{\d+}}, w{{\d+}}, lsr #31 $noinline$UnsignedIntDiv06(int v)386*795d594fSAndroid Build Coastguard Worker private static int $noinline$UnsignedIntDiv06(int v) { 387*795d594fSAndroid Build Coastguard Worker int c = 0; 388*795d594fSAndroid Build Coastguard Worker for(; v > 100; ++c) { 389*795d594fSAndroid Build Coastguard Worker v /= 10; 390*795d594fSAndroid Build Coastguard Worker } 391*795d594fSAndroid Build Coastguard Worker return c; 392*795d594fSAndroid Build Coastguard Worker } 393*795d594fSAndroid Build Coastguard Worker 394*795d594fSAndroid Build Coastguard Worker // A test case to check that a correcting 'add' is not generated for a non-negative 395*795d594fSAndroid Build Coastguard Worker // dividend and a positive divisor. 396*795d594fSAndroid Build Coastguard Worker // 397*795d594fSAndroid Build Coastguard Worker /// CHECK-START-ARM: int DivTest.$noinline$UnsignedIntDiv07(int) disassembly (after) 398*795d594fSAndroid Build Coastguard Worker /// CHECK: smull r{{\d+}}, r{{\d+}}, r{{\d+}}, r{{\d+}} 399*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: sub r{{\d+}}, r{{\d+}}, r{{\d+}}, asr #31 400*795d594fSAndroid Build Coastguard Worker // 401*795d594fSAndroid Build Coastguard Worker /// CHECK-START-ARM64: int DivTest.$noinline$UnsignedIntDiv07(int) disassembly (after) 402*795d594fSAndroid Build Coastguard Worker /// CHECK: smull x{{\d+}}, w{{\d+}}, w{{\d+}} 403*795d594fSAndroid Build Coastguard Worker /// CHECK: lsr x{{\d+}}, x{{\d+}}, #34 404*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: add w{{\d+}}, w{{\d+}}, w{{\d+}}, lsr #31 $noinline$UnsignedIntDiv07(int v)405*795d594fSAndroid Build Coastguard Worker private static int $noinline$UnsignedIntDiv07(int v) { 406*795d594fSAndroid Build Coastguard Worker while (v > 0 && (v % 10) == 0) { 407*795d594fSAndroid Build Coastguard Worker v /= 10; 408*795d594fSAndroid Build Coastguard Worker } 409*795d594fSAndroid Build Coastguard Worker return v; 410*795d594fSAndroid Build Coastguard Worker } 411*795d594fSAndroid Build Coastguard Worker 412*795d594fSAndroid Build Coastguard Worker // A test case to check that a correcting 'add' is not generated for a non-negative 413*795d594fSAndroid Build Coastguard Worker // dividend and a positive divisor. 414*795d594fSAndroid Build Coastguard Worker // 415*795d594fSAndroid Build Coastguard Worker /// CHECK-START-ARM: int DivTest.$noinline$UnsignedIntDiv08(int) disassembly (after) 416*795d594fSAndroid Build Coastguard Worker /// CHECK: smull r{{\d+}}, r{{\d+}}, r{{\d+}}, r{{\d+}} 417*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: sub r{{\d+}}, r{{\d+}}, r{{\d+}}, asr #31 418*795d594fSAndroid Build Coastguard Worker // 419*795d594fSAndroid Build Coastguard Worker /// CHECK-START-ARM64: int DivTest.$noinline$UnsignedIntDiv08(int) disassembly (after) 420*795d594fSAndroid Build Coastguard Worker /// CHECK: smull x{{\d+}}, w{{\d+}}, w{{\d+}} 421*795d594fSAndroid Build Coastguard Worker /// CHECK: lsr x{{\d+}}, x{{\d+}}, #34 422*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: add w{{\d+}}, w{{\d+}}, w{{\d+}}, lsr #31 $noinline$UnsignedIntDiv08(int v)423*795d594fSAndroid Build Coastguard Worker private static int $noinline$UnsignedIntDiv08(int v) { 424*795d594fSAndroid Build Coastguard Worker if (v < 10) { 425*795d594fSAndroid Build Coastguard Worker v = $noinline$Negate(v); // This is to prevent from using Select. 426*795d594fSAndroid Build Coastguard Worker } else { 427*795d594fSAndroid Build Coastguard Worker v = (v % 10) + (v / 10); 428*795d594fSAndroid Build Coastguard Worker } 429*795d594fSAndroid Build Coastguard Worker return v; 430*795d594fSAndroid Build Coastguard Worker } 431*795d594fSAndroid Build Coastguard Worker 432*795d594fSAndroid Build Coastguard Worker // A test case to check that a correcting 'add' is generated for a negative 433*795d594fSAndroid Build Coastguard Worker // dividend and a positive divisor. 434*795d594fSAndroid Build Coastguard Worker // 435*795d594fSAndroid Build Coastguard Worker /// CHECK-START-ARM: int DivTest.$noinline$SignedIntDiv01(int) disassembly (after) 436*795d594fSAndroid Build Coastguard Worker /// CHECK: smull r{{\d+}}, r{{\d+}}, r{{\d+}}, r{{\d+}} 437*795d594fSAndroid Build Coastguard Worker /// CHECK-NEXT: sub r{{\d+}}, r{{\d+}}, r{{\d+}}, asr #31 438*795d594fSAndroid Build Coastguard Worker // 439*795d594fSAndroid Build Coastguard Worker /// CHECK-START-ARM64: int DivTest.$noinline$SignedIntDiv01(int) disassembly (after) 440*795d594fSAndroid Build Coastguard Worker /// CHECK: asr x{{\d+}}, x{{\d+}}, #32 441*795d594fSAndroid Build Coastguard Worker /// CHECK-NEXT: add w{{\d+}}, w{{\d+}}, w{{\d+}}, lsr #31 $noinline$SignedIntDiv01(int v)442*795d594fSAndroid Build Coastguard Worker private static int $noinline$SignedIntDiv01(int v) { 443*795d594fSAndroid Build Coastguard Worker int c = 0; 444*795d594fSAndroid Build Coastguard Worker if (v < 0) { 445*795d594fSAndroid Build Coastguard Worker c = v / 6; 446*795d594fSAndroid Build Coastguard Worker } else { 447*795d594fSAndroid Build Coastguard Worker c = $noinline$Decrement(v); // This is to prevent from using Select. 448*795d594fSAndroid Build Coastguard Worker } 449*795d594fSAndroid Build Coastguard Worker return c; 450*795d594fSAndroid Build Coastguard Worker } 451*795d594fSAndroid Build Coastguard Worker 452*795d594fSAndroid Build Coastguard Worker // A test case to check that a correcting 'add' is generated for a negative 453*795d594fSAndroid Build Coastguard Worker // dividend and a positive divisor. 454*795d594fSAndroid Build Coastguard Worker // 455*795d594fSAndroid Build Coastguard Worker /// CHECK-START-ARM: int DivTest.$noinline$SignedIntDiv02(int) disassembly (after) 456*795d594fSAndroid Build Coastguard Worker /// CHECK: smull r{{\d+}}, r{{\d+}}, r{{\d+}}, r{{\d+}} 457*795d594fSAndroid Build Coastguard Worker /// CHECK-NEXT: sub r{{\d+}}, r{{\d+}}, r{{\d+}}, asr #31 458*795d594fSAndroid Build Coastguard Worker // 459*795d594fSAndroid Build Coastguard Worker /// CHECK-START-ARM64: int DivTest.$noinline$SignedIntDiv02(int) disassembly (after) 460*795d594fSAndroid Build Coastguard Worker /// CHECK: asr x{{\d+}}, x{{\d+}}, #32 461*795d594fSAndroid Build Coastguard Worker /// CHECK-NEXT: add w{{\d+}}, w{{\d+}}, w{{\d+}}, lsr #31 $noinline$SignedIntDiv02(int v)462*795d594fSAndroid Build Coastguard Worker private static int $noinline$SignedIntDiv02(int v) { 463*795d594fSAndroid Build Coastguard Worker int c = 0; 464*795d594fSAndroid Build Coastguard Worker if (v <= 0) { 465*795d594fSAndroid Build Coastguard Worker c = v / 6; 466*795d594fSAndroid Build Coastguard Worker } else { 467*795d594fSAndroid Build Coastguard Worker c = $noinline$Decrement(v); // This is to prevent from using Select. 468*795d594fSAndroid Build Coastguard Worker } 469*795d594fSAndroid Build Coastguard Worker return c; 470*795d594fSAndroid Build Coastguard Worker } 471*795d594fSAndroid Build Coastguard Worker 472*795d594fSAndroid Build Coastguard Worker // A test case to check that a correcting 'add' is generated for signed division. 473*795d594fSAndroid Build Coastguard Worker // 474*795d594fSAndroid Build Coastguard Worker /// CHECK-START-ARM: int DivTest.$noinline$SignedIntDiv03(int) disassembly (after) 475*795d594fSAndroid Build Coastguard Worker /// CHECK: smull r{{\d+}}, r{{\d+}}, r{{\d+}}, r{{\d+}} 476*795d594fSAndroid Build Coastguard Worker /// CHECK-NEXT: sub r{{\d+}}, r{{\d+}}, r{{\d+}}, asr #31 477*795d594fSAndroid Build Coastguard Worker // 478*795d594fSAndroid Build Coastguard Worker /// CHECK-START-ARM64: int DivTest.$noinline$SignedIntDiv03(int) disassembly (after) 479*795d594fSAndroid Build Coastguard Worker /// CHECK: asr x{{\d+}}, x{{\d+}}, #32 480*795d594fSAndroid Build Coastguard Worker /// CHECK-NEXT: add w{{\d+}}, w{{\d+}}, w{{\d+}}, lsr #31 $noinline$SignedIntDiv03(int v)481*795d594fSAndroid Build Coastguard Worker private static int $noinline$SignedIntDiv03(int v) { 482*795d594fSAndroid Build Coastguard Worker boolean positive = (v > 0); 483*795d594fSAndroid Build Coastguard Worker int c = v / 6; 484*795d594fSAndroid Build Coastguard Worker if (!positive) { 485*795d594fSAndroid Build Coastguard Worker c = $noinline$Negate(c); // This is to prevent from using Select. 486*795d594fSAndroid Build Coastguard Worker } 487*795d594fSAndroid Build Coastguard Worker return c; 488*795d594fSAndroid Build Coastguard Worker } 489*795d594fSAndroid Build Coastguard Worker 490*795d594fSAndroid Build Coastguard Worker // A test case to check that a correcting 'add' is generated for signed division. 491*795d594fSAndroid Build Coastguard Worker // 492*795d594fSAndroid Build Coastguard Worker /// CHECK-START-ARM: int DivTest.$noinline$SignedIntDiv04(int, boolean) disassembly (after) 493*795d594fSAndroid Build Coastguard Worker /// CHECK: smull r{{\d+}}, r{{\d+}}, r{{\d+}}, r{{\d+}} 494*795d594fSAndroid Build Coastguard Worker /// CHECK-NEXT: sub r{{\d+}}, r{{\d+}}, r{{\d+}}, asr #31 495*795d594fSAndroid Build Coastguard Worker // 496*795d594fSAndroid Build Coastguard Worker /// CHECK-START-ARM64: int DivTest.$noinline$SignedIntDiv04(int, boolean) disassembly (after) 497*795d594fSAndroid Build Coastguard Worker /// CHECK: asr x{{\d+}}, x{{\d+}}, #32 498*795d594fSAndroid Build Coastguard Worker /// CHECK-NEXT: add w{{\d+}}, w{{\d+}}, w{{\d+}}, lsr #31 $noinline$SignedIntDiv04(int v, boolean apply_div)499*795d594fSAndroid Build Coastguard Worker private static int $noinline$SignedIntDiv04(int v, boolean apply_div) { 500*795d594fSAndroid Build Coastguard Worker int c = 0; 501*795d594fSAndroid Build Coastguard Worker boolean positive = (v > 0); 502*795d594fSAndroid Build Coastguard Worker if (apply_div) { 503*795d594fSAndroid Build Coastguard Worker c = v / 6; 504*795d594fSAndroid Build Coastguard Worker } else { 505*795d594fSAndroid Build Coastguard Worker c = $noinline$Decrement(v); // This is to prevent from using Select. 506*795d594fSAndroid Build Coastguard Worker } 507*795d594fSAndroid Build Coastguard Worker if (!positive) { 508*795d594fSAndroid Build Coastguard Worker c = $noinline$Negate(c); // This is to prevent from using Select. 509*795d594fSAndroid Build Coastguard Worker } 510*795d594fSAndroid Build Coastguard Worker return c; 511*795d594fSAndroid Build Coastguard Worker } 512*795d594fSAndroid Build Coastguard Worker 513*795d594fSAndroid Build Coastguard Worker // A test case to check that a correcting 'add' is generated for signed division. 514*795d594fSAndroid Build Coastguard Worker // 515*795d594fSAndroid Build Coastguard Worker /// CHECK-START-ARM: int DivTest.$noinline$SignedIntDiv05(int, int, int) disassembly (after) 516*795d594fSAndroid Build Coastguard Worker /// CHECK: smull r{{\d+}}, r{{\d+}}, r{{\d+}}, r{{\d+}} 517*795d594fSAndroid Build Coastguard Worker /// CHECK-NEXT: sub r{{\d+}}, r{{\d+}}, r{{\d+}}, asr #31 518*795d594fSAndroid Build Coastguard Worker // 519*795d594fSAndroid Build Coastguard Worker /// CHECK-START-ARM64: int DivTest.$noinline$SignedIntDiv05(int, int, int) disassembly (after) 520*795d594fSAndroid Build Coastguard Worker /// CHECK: asr x{{\d+}}, x{{\d+}}, #32 521*795d594fSAndroid Build Coastguard Worker /// CHECK-NEXT: add w{{\d+}}, w{{\d+}}, w{{\d+}}, lsr #31 $noinline$SignedIntDiv05(int v, int a, int b)522*795d594fSAndroid Build Coastguard Worker private static int $noinline$SignedIntDiv05(int v, int a, int b) { 523*795d594fSAndroid Build Coastguard Worker int c = 0; 524*795d594fSAndroid Build Coastguard Worker 525*795d594fSAndroid Build Coastguard Worker if (v < a) 526*795d594fSAndroid Build Coastguard Worker c = $noinline$Increment(c); // This is to prevent from using Select. 527*795d594fSAndroid Build Coastguard Worker 528*795d594fSAndroid Build Coastguard Worker if (b < a) 529*795d594fSAndroid Build Coastguard Worker c = $noinline$Increment(c); // This is to prevent from using Select. 530*795d594fSAndroid Build Coastguard Worker 531*795d594fSAndroid Build Coastguard Worker if (v > b) { 532*795d594fSAndroid Build Coastguard Worker c = v / 6; 533*795d594fSAndroid Build Coastguard Worker } else { 534*795d594fSAndroid Build Coastguard Worker c = $noinline$Increment(c); // This is to prevent from using Select. 535*795d594fSAndroid Build Coastguard Worker } 536*795d594fSAndroid Build Coastguard Worker 537*795d594fSAndroid Build Coastguard Worker return c; 538*795d594fSAndroid Build Coastguard Worker } 539*795d594fSAndroid Build Coastguard Worker 540*795d594fSAndroid Build Coastguard Worker // A test case to check that a correcting 'add' is generated for signed division. 541*795d594fSAndroid Build Coastguard Worker // 542*795d594fSAndroid Build Coastguard Worker /// CHECK-START-ARM: int DivTest.$noinline$SignedIntDiv06(int) disassembly (after) 543*795d594fSAndroid Build Coastguard Worker /// CHECK: smull r{{\d+}}, r{{\d+}}, r{{\d+}}, r{{\d+}} 544*795d594fSAndroid Build Coastguard Worker /// CHECK-NEXT: sub r{{\d+}}, r{{\d+}}, r{{\d+}}, asr #31 545*795d594fSAndroid Build Coastguard Worker // 546*795d594fSAndroid Build Coastguard Worker /// CHECK-START-ARM64: int DivTest.$noinline$SignedIntDiv06(int) disassembly (after) 547*795d594fSAndroid Build Coastguard Worker /// CHECK: asr x{{\d+}}, x{{\d+}}, #32 548*795d594fSAndroid Build Coastguard Worker /// CHECK-NEXT: add w{{\d+}}, w{{\d+}}, w{{\d+}}, lsr #31 $noinline$SignedIntDiv06(int v)549*795d594fSAndroid Build Coastguard Worker private static int $noinline$SignedIntDiv06(int v) { 550*795d594fSAndroid Build Coastguard Worker int c = v / 6; 551*795d594fSAndroid Build Coastguard Worker 552*795d594fSAndroid Build Coastguard Worker if (v > 0) { 553*795d594fSAndroid Build Coastguard Worker c = $noinline$Negate(c); // This is to prevent from using Select. 554*795d594fSAndroid Build Coastguard Worker } 555*795d594fSAndroid Build Coastguard Worker 556*795d594fSAndroid Build Coastguard Worker return c; 557*795d594fSAndroid Build Coastguard Worker } 558*795d594fSAndroid Build Coastguard Worker divLong()559*795d594fSAndroid Build Coastguard Worker private static void divLong() { 560*795d594fSAndroid Build Coastguard Worker expectEquals(0L, $noinline$LongDivBy18(0L)); 561*795d594fSAndroid Build Coastguard Worker expectEquals(0L, $noinline$LongDivBy18(1L)); 562*795d594fSAndroid Build Coastguard Worker expectEquals(0L, $noinline$LongDivBy18(-1L)); 563*795d594fSAndroid Build Coastguard Worker expectEquals(1L, $noinline$LongDivBy18(18L)); 564*795d594fSAndroid Build Coastguard Worker expectEquals(-1L, $noinline$LongDivBy18(-18L)); 565*795d594fSAndroid Build Coastguard Worker expectEquals(3L, $noinline$LongDivBy18(65L)); 566*795d594fSAndroid Build Coastguard Worker expectEquals(-3L, $noinline$LongDivBy18(-65L)); 567*795d594fSAndroid Build Coastguard Worker 568*795d594fSAndroid Build Coastguard Worker expectEquals(0L, $noinline$LongDivByMinus18(0L)); 569*795d594fSAndroid Build Coastguard Worker expectEquals(0L, $noinline$LongDivByMinus18(1L)); 570*795d594fSAndroid Build Coastguard Worker expectEquals(0L, $noinline$LongDivByMinus18(-1L)); 571*795d594fSAndroid Build Coastguard Worker expectEquals(-1L, $noinline$LongDivByMinus18(18L)); 572*795d594fSAndroid Build Coastguard Worker expectEquals(1L, $noinline$LongDivByMinus18(-18L)); 573*795d594fSAndroid Build Coastguard Worker expectEquals(-3L, $noinline$LongDivByMinus18(65L)); 574*795d594fSAndroid Build Coastguard Worker expectEquals(3L, $noinline$LongDivByMinus18(-65L)); 575*795d594fSAndroid Build Coastguard Worker 576*795d594fSAndroid Build Coastguard Worker expectEquals(0L, $noinline$LongDivBy7(0L)); 577*795d594fSAndroid Build Coastguard Worker expectEquals(0L, $noinline$LongDivBy7(1L)); 578*795d594fSAndroid Build Coastguard Worker expectEquals(0L, $noinline$LongDivBy7(-1L)); 579*795d594fSAndroid Build Coastguard Worker expectEquals(1L, $noinline$LongDivBy7(7L)); 580*795d594fSAndroid Build Coastguard Worker expectEquals(-1L, $noinline$LongDivBy7(-7L)); 581*795d594fSAndroid Build Coastguard Worker expectEquals(3L, $noinline$LongDivBy7(22L)); 582*795d594fSAndroid Build Coastguard Worker expectEquals(-3L, $noinline$LongDivBy7(-22L)); 583*795d594fSAndroid Build Coastguard Worker 584*795d594fSAndroid Build Coastguard Worker expectEquals(0L, $noinline$LongDivByMinus7(0L)); 585*795d594fSAndroid Build Coastguard Worker expectEquals(0L, $noinline$LongDivByMinus7(1L)); 586*795d594fSAndroid Build Coastguard Worker expectEquals(0L, $noinline$LongDivByMinus7(-1L)); 587*795d594fSAndroid Build Coastguard Worker expectEquals(-1L, $noinline$LongDivByMinus7(7L)); 588*795d594fSAndroid Build Coastguard Worker expectEquals(1L, $noinline$LongDivByMinus7(-7L)); 589*795d594fSAndroid Build Coastguard Worker expectEquals(-3L, $noinline$LongDivByMinus7(22L)); 590*795d594fSAndroid Build Coastguard Worker expectEquals(3L, $noinline$LongDivByMinus7(-22L)); 591*795d594fSAndroid Build Coastguard Worker 592*795d594fSAndroid Build Coastguard Worker expectEquals(0L, $noinline$LongDivBy6(0L)); 593*795d594fSAndroid Build Coastguard Worker expectEquals(0L, $noinline$LongDivBy6(1L)); 594*795d594fSAndroid Build Coastguard Worker expectEquals(0L, $noinline$LongDivBy6(-1L)); 595*795d594fSAndroid Build Coastguard Worker expectEquals(1L, $noinline$LongDivBy6(6L)); 596*795d594fSAndroid Build Coastguard Worker expectEquals(-1L, $noinline$LongDivBy6(-6L)); 597*795d594fSAndroid Build Coastguard Worker expectEquals(3L, $noinline$LongDivBy6(19L)); 598*795d594fSAndroid Build Coastguard Worker expectEquals(-3L, $noinline$LongDivBy6(-19L)); 599*795d594fSAndroid Build Coastguard Worker 600*795d594fSAndroid Build Coastguard Worker expectEquals(0L, $noinline$LongDivByMinus6(0L)); 601*795d594fSAndroid Build Coastguard Worker expectEquals(0L, $noinline$LongDivByMinus6(1L)); 602*795d594fSAndroid Build Coastguard Worker expectEquals(0L, $noinline$LongDivByMinus6(-1L)); 603*795d594fSAndroid Build Coastguard Worker expectEquals(-1L, $noinline$LongDivByMinus6(6L)); 604*795d594fSAndroid Build Coastguard Worker expectEquals(1L, $noinline$LongDivByMinus6(-6L)); 605*795d594fSAndroid Build Coastguard Worker expectEquals(-3L, $noinline$LongDivByMinus6(19L)); 606*795d594fSAndroid Build Coastguard Worker expectEquals(3L, $noinline$LongDivByMinus6(-19L)); 607*795d594fSAndroid Build Coastguard Worker 608*795d594fSAndroid Build Coastguard Worker expectEquals(0L, $noinline$LongDivBy100(0L)); 609*795d594fSAndroid Build Coastguard Worker expectEquals(0L, $noinline$LongDivBy100(1L)); 610*795d594fSAndroid Build Coastguard Worker expectEquals(0L, $noinline$LongDivBy100(-1L)); 611*795d594fSAndroid Build Coastguard Worker expectEquals(1L, $noinline$LongDivBy100(100L)); 612*795d594fSAndroid Build Coastguard Worker expectEquals(-1L, $noinline$LongDivBy100(-100L)); 613*795d594fSAndroid Build Coastguard Worker expectEquals(3L, $noinline$LongDivBy100(301L)); 614*795d594fSAndroid Build Coastguard Worker expectEquals(-3L, $noinline$LongDivBy100(-301L)); 615*795d594fSAndroid Build Coastguard Worker 616*795d594fSAndroid Build Coastguard Worker expectEquals(0L, $noinline$LongDivByMinus100(0L)); 617*795d594fSAndroid Build Coastguard Worker expectEquals(0L, $noinline$LongDivByMinus100(1L)); 618*795d594fSAndroid Build Coastguard Worker expectEquals(0L, $noinline$LongDivByMinus100(-1L)); 619*795d594fSAndroid Build Coastguard Worker expectEquals(-1L, $noinline$LongDivByMinus100(100L)); 620*795d594fSAndroid Build Coastguard Worker expectEquals(1L, $noinline$LongDivByMinus100(-100L)); 621*795d594fSAndroid Build Coastguard Worker expectEquals(-3L, $noinline$LongDivByMinus100(301L)); 622*795d594fSAndroid Build Coastguard Worker expectEquals(3L, $noinline$LongDivByMinus100(-301L)); 623*795d594fSAndroid Build Coastguard Worker 624*795d594fSAndroid Build Coastguard Worker expectEquals(2L, $noinline$UnsignedLongDiv01(12L)); 625*795d594fSAndroid Build Coastguard Worker expectEquals(2L, $noinline$UnsignedLongDiv02(12L)); 626*795d594fSAndroid Build Coastguard Worker expectEquals(2L, $noinline$UnsignedLongDiv03(12L)); 627*795d594fSAndroid Build Coastguard Worker expectEquals(2L, $noinline$UnsignedLongDiv04(12L)); 628*795d594fSAndroid Build Coastguard Worker expectEquals("01", $noinline$UnsignedLongDiv05(10L)); 629*795d594fSAndroid Build Coastguard Worker expectEquals("321", $noinline$UnsignedLongDiv05(123L)); 630*795d594fSAndroid Build Coastguard Worker expectEquals(1L, $noinline$UnsignedLongDiv06(101L)); 631*795d594fSAndroid Build Coastguard Worker expectEquals(1L, $noinline$UnsignedLongDiv07(10L)); 632*795d594fSAndroid Build Coastguard Worker expectEquals(1L, $noinline$UnsignedLongDiv07(100L)); 633*795d594fSAndroid Build Coastguard Worker expectEquals(10L, $noinline$UnsignedLongDiv08(100L)); 634*795d594fSAndroid Build Coastguard Worker expectEquals(11L, $noinline$UnsignedLongDiv08(101L)); 635*795d594fSAndroid Build Coastguard Worker 636*795d594fSAndroid Build Coastguard Worker expectEquals(-2L, $noinline$SignedLongDiv01(-12L)); 637*795d594fSAndroid Build Coastguard Worker expectEquals(-2L, $noinline$SignedLongDiv02(-12L)); 638*795d594fSAndroid Build Coastguard Worker expectEquals(2L, $noinline$SignedLongDiv03(-12L)); 639*795d594fSAndroid Build Coastguard Worker expectEquals(2L, $noinline$SignedLongDiv04(-12L, true)); 640*795d594fSAndroid Build Coastguard Worker expectEquals(-2L, $noinline$SignedLongDiv05(-12L, 0L,-13L)); 641*795d594fSAndroid Build Coastguard Worker expectEquals(-2L, $noinline$SignedLongDiv06(-12L)); 642*795d594fSAndroid Build Coastguard Worker } 643*795d594fSAndroid Build Coastguard Worker 644*795d594fSAndroid Build Coastguard Worker // Test cases for Int64 HDiv/HRem to check that optimizations implemented for Int32 are not 645*795d594fSAndroid Build Coastguard Worker // used for Int64. The same divisors 18, -18, 7, -7, 6 and -6 are used. 646*795d594fSAndroid Build Coastguard Worker 647*795d594fSAndroid Build Coastguard Worker /// CHECK-START-ARM64: long DivTest.$noinline$LongDivBy18(long) disassembly (after) 648*795d594fSAndroid Build Coastguard Worker /// CHECK: smulh x{{\d+}}, x{{\d+}}, x{{\d+}} 649*795d594fSAndroid Build Coastguard Worker /// CHECK-NEXT: add x{{\d+}}, x{{\d+}}, x{{\d+}}, lsr #63 $noinline$LongDivBy18(long v)650*795d594fSAndroid Build Coastguard Worker private static long $noinline$LongDivBy18(long v) { 651*795d594fSAndroid Build Coastguard Worker long r = v / 18L; 652*795d594fSAndroid Build Coastguard Worker return r; 653*795d594fSAndroid Build Coastguard Worker } 654*795d594fSAndroid Build Coastguard Worker 655*795d594fSAndroid Build Coastguard Worker /// CHECK-START-ARM64: long DivTest.$noinline$LongDivByMinus18(long) disassembly (after) 656*795d594fSAndroid Build Coastguard Worker /// CHECK: smulh x{{\d+}}, x{{\d+}}, x{{\d+}} 657*795d594fSAndroid Build Coastguard Worker /// CHECK-NEXT: add x{{\d+}}, x{{\d+}}, x{{\d+}}, lsr #63 $noinline$LongDivByMinus18(long v)658*795d594fSAndroid Build Coastguard Worker private static long $noinline$LongDivByMinus18(long v) { 659*795d594fSAndroid Build Coastguard Worker long r = v / -18L; 660*795d594fSAndroid Build Coastguard Worker return r; 661*795d594fSAndroid Build Coastguard Worker } 662*795d594fSAndroid Build Coastguard Worker 663*795d594fSAndroid Build Coastguard Worker /// CHECK-START-ARM64: long DivTest.$noinline$LongDivBy7(long) disassembly (after) 664*795d594fSAndroid Build Coastguard Worker /// CHECK: smulh x{{\d+}}, x{{\d+}}, x{{\d+}} 665*795d594fSAndroid Build Coastguard Worker /// CHECK-NEXT: asr x{{\d+}}, x{{\d+}}, #1 666*795d594fSAndroid Build Coastguard Worker /// CHECK-NEXT: add x{{\d+}}, x{{\d+}}, x{{\d+}}, lsr #63 $noinline$LongDivBy7(long v)667*795d594fSAndroid Build Coastguard Worker private static long $noinline$LongDivBy7(long v) { 668*795d594fSAndroid Build Coastguard Worker long r = v / 7L; 669*795d594fSAndroid Build Coastguard Worker return r; 670*795d594fSAndroid Build Coastguard Worker } 671*795d594fSAndroid Build Coastguard Worker 672*795d594fSAndroid Build Coastguard Worker /// CHECK-START-ARM64: long DivTest.$noinline$LongDivByMinus7(long) disassembly (after) 673*795d594fSAndroid Build Coastguard Worker /// CHECK: smulh x{{\d+}}, x{{\d+}}, x{{\d+}} 674*795d594fSAndroid Build Coastguard Worker /// CHECK-NEXT: asr x{{\d+}}, x{{\d+}}, #1 675*795d594fSAndroid Build Coastguard Worker /// CHECK-NEXT: add x{{\d+}}, x{{\d+}}, x{{\d+}}, lsr #63 $noinline$LongDivByMinus7(long v)676*795d594fSAndroid Build Coastguard Worker private static long $noinline$LongDivByMinus7(long v) { 677*795d594fSAndroid Build Coastguard Worker long r = v / -7L; 678*795d594fSAndroid Build Coastguard Worker return r; 679*795d594fSAndroid Build Coastguard Worker } 680*795d594fSAndroid Build Coastguard Worker 681*795d594fSAndroid Build Coastguard Worker /// CHECK-START-ARM64: long DivTest.$noinline$LongDivBy6(long) disassembly (after) 682*795d594fSAndroid Build Coastguard Worker /// CHECK: smulh x{{\d+}}, x{{\d+}}, x{{\d+}} 683*795d594fSAndroid Build Coastguard Worker /// CHECK-NEXT: add x{{\d+}}, x{{\d+}}, x{{\d+}}, lsr #63 $noinline$LongDivBy6(long v)684*795d594fSAndroid Build Coastguard Worker private static long $noinline$LongDivBy6(long v) { 685*795d594fSAndroid Build Coastguard Worker long r = v / 6L; 686*795d594fSAndroid Build Coastguard Worker return r; 687*795d594fSAndroid Build Coastguard Worker } 688*795d594fSAndroid Build Coastguard Worker 689*795d594fSAndroid Build Coastguard Worker /// CHECK-START-ARM64: long DivTest.$noinline$LongDivByMinus6(long) disassembly (after) 690*795d594fSAndroid Build Coastguard Worker /// CHECK: smulh x{{\d+}}, x{{\d+}}, x{{\d+}} 691*795d594fSAndroid Build Coastguard Worker /// CHECK-NEXT: add x{{\d+}}, x{{\d+}}, x{{\d+}}, lsr #63 $noinline$LongDivByMinus6(long v)692*795d594fSAndroid Build Coastguard Worker private static long $noinline$LongDivByMinus6(long v) { 693*795d594fSAndroid Build Coastguard Worker long r = v / -6L; 694*795d594fSAndroid Build Coastguard Worker return r; 695*795d594fSAndroid Build Coastguard Worker } 696*795d594fSAndroid Build Coastguard Worker 697*795d594fSAndroid Build Coastguard Worker // A test to check 'add' and 'add_shift' are optimized into 'adds' and 'cinc'. 698*795d594fSAndroid Build Coastguard Worker // 699*795d594fSAndroid Build Coastguard Worker /// CHECK-START-ARM64: long DivTest.$noinline$LongDivBy100(long) disassembly (after) 700*795d594fSAndroid Build Coastguard Worker /// CHECK: smulh x{{\d+}}, x{{\d+}}, x{{\d+}} 701*795d594fSAndroid Build Coastguard Worker /// CHECK-NEXT: adds x{{\d+}}, x{{\d+}}, x{{\d+}} 702*795d594fSAndroid Build Coastguard Worker /// CHECK-NEXT: asr x{{\d+}}, x{{\d+}}, #6 703*795d594fSAndroid Build Coastguard Worker /// CHECK-NEXT: cinc x{{\d+}}, x{{\d+}}, mi $noinline$LongDivBy100(long v)704*795d594fSAndroid Build Coastguard Worker private static long $noinline$LongDivBy100(long v) { 705*795d594fSAndroid Build Coastguard Worker long r = v / 100L; 706*795d594fSAndroid Build Coastguard Worker return r; 707*795d594fSAndroid Build Coastguard Worker } 708*795d594fSAndroid Build Coastguard Worker 709*795d594fSAndroid Build Coastguard Worker // A test to check 'subs' and 'add_shift' are optimized into 'subs' and 'cinc'. 710*795d594fSAndroid Build Coastguard Worker // 711*795d594fSAndroid Build Coastguard Worker /// CHECK-START-ARM64: long DivTest.$noinline$LongDivByMinus100(long) disassembly (after) 712*795d594fSAndroid Build Coastguard Worker /// CHECK: smulh x{{\d+}}, x{{\d+}}, x{{\d+}} 713*795d594fSAndroid Build Coastguard Worker /// CHECK-NEXT: subs x{{\d+}}, x{{\d+}}, x{{\d+}} 714*795d594fSAndroid Build Coastguard Worker /// CHECK-NEXT: asr x{{\d+}}, x{{\d+}}, #6 715*795d594fSAndroid Build Coastguard Worker /// CHECK-NEXT: cinc x{{\d+}}, x{{\d+}}, mi $noinline$LongDivByMinus100(long v)716*795d594fSAndroid Build Coastguard Worker private static long $noinline$LongDivByMinus100(long v) { 717*795d594fSAndroid Build Coastguard Worker long r = v / -100L; 718*795d594fSAndroid Build Coastguard Worker return r; 719*795d594fSAndroid Build Coastguard Worker } 720*795d594fSAndroid Build Coastguard Worker $noinline$Negate(long v)721*795d594fSAndroid Build Coastguard Worker private static long $noinline$Negate(long v) { 722*795d594fSAndroid Build Coastguard Worker return -v; 723*795d594fSAndroid Build Coastguard Worker } 724*795d594fSAndroid Build Coastguard Worker $noinline$Decrement(long v)725*795d594fSAndroid Build Coastguard Worker private static long $noinline$Decrement(long v) { 726*795d594fSAndroid Build Coastguard Worker return v - 1; 727*795d594fSAndroid Build Coastguard Worker } 728*795d594fSAndroid Build Coastguard Worker $noinline$Increment(long v)729*795d594fSAndroid Build Coastguard Worker private static long $noinline$Increment(long v) { 730*795d594fSAndroid Build Coastguard Worker return v + 1; 731*795d594fSAndroid Build Coastguard Worker } 732*795d594fSAndroid Build Coastguard Worker 733*795d594fSAndroid Build Coastguard Worker // A test case to check that a correcting 'add' is not generated for a non-negative 734*795d594fSAndroid Build Coastguard Worker // dividend and a positive divisor. 735*795d594fSAndroid Build Coastguard Worker // 736*795d594fSAndroid Build Coastguard Worker /// CHECK-START-ARM64: long DivTest.$noinline$UnsignedLongDiv01(long) disassembly (after) 737*795d594fSAndroid Build Coastguard Worker /// CHECK: smulh x{{\d+}}, x{{\d+}}, x{{\d+}} 738*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: add x{{\d+}}, x{{\d+}}, x{{\d+}}, lsr #63 $noinline$UnsignedLongDiv01(long v)739*795d594fSAndroid Build Coastguard Worker private static long $noinline$UnsignedLongDiv01(long v) { 740*795d594fSAndroid Build Coastguard Worker long c = 0; 741*795d594fSAndroid Build Coastguard Worker if (v > 0) { 742*795d594fSAndroid Build Coastguard Worker c = v / 6; 743*795d594fSAndroid Build Coastguard Worker } else { 744*795d594fSAndroid Build Coastguard Worker c = $noinline$Negate(v); // This is to prevent from using Select. 745*795d594fSAndroid Build Coastguard Worker } 746*795d594fSAndroid Build Coastguard Worker return c; 747*795d594fSAndroid Build Coastguard Worker } 748*795d594fSAndroid Build Coastguard Worker 749*795d594fSAndroid Build Coastguard Worker // A test case to check that a correcting 'add' is not generated for a non-negative 750*795d594fSAndroid Build Coastguard Worker // dividend and a positive divisor. 751*795d594fSAndroid Build Coastguard Worker // 752*795d594fSAndroid Build Coastguard Worker /// CHECK-START-ARM64: long DivTest.$noinline$UnsignedLongDiv02(long) disassembly (after) 753*795d594fSAndroid Build Coastguard Worker /// CHECK: smulh x{{\d+}}, x{{\d+}}, x{{\d+}} 754*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: add x{{\d+}}, x{{\d+}}, x{{\d+}}, lsr #63 $noinline$UnsignedLongDiv02(long v)755*795d594fSAndroid Build Coastguard Worker private static long $noinline$UnsignedLongDiv02(long v) { 756*795d594fSAndroid Build Coastguard Worker long c = 0; 757*795d594fSAndroid Build Coastguard Worker if (0 < v) { 758*795d594fSAndroid Build Coastguard Worker c = v / 6; 759*795d594fSAndroid Build Coastguard Worker } else { 760*795d594fSAndroid Build Coastguard Worker c = $noinline$Negate(v); // This is to prevent from using Select. 761*795d594fSAndroid Build Coastguard Worker } 762*795d594fSAndroid Build Coastguard Worker return c; 763*795d594fSAndroid Build Coastguard Worker } 764*795d594fSAndroid Build Coastguard Worker 765*795d594fSAndroid Build Coastguard Worker // A test case to check that a correcting 'add' is not generated for a non-negative 766*795d594fSAndroid Build Coastguard Worker // dividend and a positive divisor. 767*795d594fSAndroid Build Coastguard Worker // 768*795d594fSAndroid Build Coastguard Worker /// CHECK-START-ARM64: long DivTest.$noinline$UnsignedLongDiv03(long) disassembly (after) 769*795d594fSAndroid Build Coastguard Worker /// CHECK: smulh x{{\d+}}, x{{\d+}}, x{{\d+}} 770*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: add x{{\d+}}, x{{\d+}}, x{{\d+}}, lsr #63 $noinline$UnsignedLongDiv03(long v)771*795d594fSAndroid Build Coastguard Worker private static long $noinline$UnsignedLongDiv03(long v) { 772*795d594fSAndroid Build Coastguard Worker long c = 0; 773*795d594fSAndroid Build Coastguard Worker if (v >= 0) { 774*795d594fSAndroid Build Coastguard Worker c = v / 6; 775*795d594fSAndroid Build Coastguard Worker } else { 776*795d594fSAndroid Build Coastguard Worker c = $noinline$Negate(v); // This is to prevent from using Select. 777*795d594fSAndroid Build Coastguard Worker } 778*795d594fSAndroid Build Coastguard Worker return c; 779*795d594fSAndroid Build Coastguard Worker } 780*795d594fSAndroid Build Coastguard Worker 781*795d594fSAndroid Build Coastguard Worker // A test case to check that a correcting 'add' is not generated for a non-negative 782*795d594fSAndroid Build Coastguard Worker // dividend and a positive divisor. 783*795d594fSAndroid Build Coastguard Worker // 784*795d594fSAndroid Build Coastguard Worker /// CHECK-START-ARM64: long DivTest.$noinline$UnsignedLongDiv04(long) disassembly (after) 785*795d594fSAndroid Build Coastguard Worker /// CHECK: smulh x{{\d+}}, x{{\d+}}, x{{\d+}} 786*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: add x{{\d+}}, x{{\d+}}, x{{\d+}}, lsr #63 $noinline$UnsignedLongDiv04(long v)787*795d594fSAndroid Build Coastguard Worker private static long $noinline$UnsignedLongDiv04(long v) { 788*795d594fSAndroid Build Coastguard Worker long c = 0; 789*795d594fSAndroid Build Coastguard Worker if (0 <= v) { 790*795d594fSAndroid Build Coastguard Worker c = v / 6; 791*795d594fSAndroid Build Coastguard Worker } else { 792*795d594fSAndroid Build Coastguard Worker c = $noinline$Negate(v); // This is to prevent from using Select. 793*795d594fSAndroid Build Coastguard Worker } 794*795d594fSAndroid Build Coastguard Worker return c; 795*795d594fSAndroid Build Coastguard Worker } 796*795d594fSAndroid Build Coastguard Worker 797*795d594fSAndroid Build Coastguard Worker // A test case to check that a correcting 'add' is not generated for a non-negative 798*795d594fSAndroid Build Coastguard Worker // dividend and a positive divisor. 799*795d594fSAndroid Build Coastguard Worker // 800*795d594fSAndroid Build Coastguard Worker /// CHECK-START-ARM64: java.lang.String DivTest.$noinline$UnsignedLongDiv05(long) disassembly (after) 801*795d594fSAndroid Build Coastguard Worker /// CHECK: smulh x{{\d+}}, x{{\d+}}, x{{\d+}} 802*795d594fSAndroid Build Coastguard Worker /// CHECK-NEXT: lsr x{{\d+}}, x{{\d+}}, #2 803*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: add x{{\d+}}, x{{\d+}}, x{{\d+}}, lsr #63 $noinline$UnsignedLongDiv05(long v)804*795d594fSAndroid Build Coastguard Worker private static String $noinline$UnsignedLongDiv05(long v) { 805*795d594fSAndroid Build Coastguard Worker String r = ""; 806*795d594fSAndroid Build Coastguard Worker while (v > 0) { 807*795d594fSAndroid Build Coastguard Worker long d = v % 10; 808*795d594fSAndroid Build Coastguard Worker r += (char)(d + '0'); 809*795d594fSAndroid Build Coastguard Worker v /= 10; 810*795d594fSAndroid Build Coastguard Worker } 811*795d594fSAndroid Build Coastguard Worker return r; 812*795d594fSAndroid Build Coastguard Worker } 813*795d594fSAndroid Build Coastguard Worker // A test case to check that a correcting 'add' is not generated for a non-negative 814*795d594fSAndroid Build Coastguard Worker // dividend and a positive divisor. 815*795d594fSAndroid Build Coastguard Worker // 816*795d594fSAndroid Build Coastguard Worker /// CHECK-START-ARM64: void DivTest.$noinline$UnsignedLongDiv05(java.lang.StringBuilder, long, long) disassembly (after) 817*795d594fSAndroid Build Coastguard Worker /// CHECK: smulh x{{\d+}}, x{{\d+}}, x{{\d+}} 818*795d594fSAndroid Build Coastguard Worker /// CHECK-NEXT: lsr x{{\d+}}, x{{\d+}}, #2 819*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: add x{{\d+}}, x{{\d+}}, x{{\d+}}, lsr #63 $noinline$UnsignedLongDiv05(java.lang.StringBuilder sb, long w, long d)820*795d594fSAndroid Build Coastguard Worker private static void $noinline$UnsignedLongDiv05(java.lang.StringBuilder sb, long w, long d) { 821*795d594fSAndroid Build Coastguard Worker while (w > 0) { 822*795d594fSAndroid Build Coastguard Worker sb.append((char)(d/w + '0')); 823*795d594fSAndroid Build Coastguard Worker d = d % w; 824*795d594fSAndroid Build Coastguard Worker w /= 10; 825*795d594fSAndroid Build Coastguard Worker } 826*795d594fSAndroid Build Coastguard Worker } 827*795d594fSAndroid Build Coastguard Worker 828*795d594fSAndroid Build Coastguard Worker // A test case to check that a correcting 'add' is not generated for a non-negative 829*795d594fSAndroid Build Coastguard Worker // dividend and a positive divisor. 830*795d594fSAndroid Build Coastguard Worker // 831*795d594fSAndroid Build Coastguard Worker /// CHECK-START-ARM64: long DivTest.$noinline$UnsignedLongDiv06(long) disassembly (after) 832*795d594fSAndroid Build Coastguard Worker /// CHECK: smulh x{{\d+}}, x{{\d+}}, x{{\d+}} 833*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: add x{{\d+}}, x{{\d+}}, x{{\d+}}, lsr #63 $noinline$UnsignedLongDiv06(long v)834*795d594fSAndroid Build Coastguard Worker private static long $noinline$UnsignedLongDiv06(long v) { 835*795d594fSAndroid Build Coastguard Worker long c = 0; 836*795d594fSAndroid Build Coastguard Worker for(; v > 100; ++c) { 837*795d594fSAndroid Build Coastguard Worker v /= 10; 838*795d594fSAndroid Build Coastguard Worker } 839*795d594fSAndroid Build Coastguard Worker return c; 840*795d594fSAndroid Build Coastguard Worker } 841*795d594fSAndroid Build Coastguard Worker 842*795d594fSAndroid Build Coastguard Worker // A test case to check that a correcting 'add' is not generated for a non-negative 843*795d594fSAndroid Build Coastguard Worker // dividend and a positive divisor. 844*795d594fSAndroid Build Coastguard Worker // 845*795d594fSAndroid Build Coastguard Worker /// CHECK-START-ARM64: long DivTest.$noinline$UnsignedLongDiv07(long) disassembly (after) 846*795d594fSAndroid Build Coastguard Worker /// CHECK: smulh x{{\d+}}, x{{\d+}}, x{{\d+}} 847*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: add x{{\d+}}, x{{\d+}}, x{{\d+}}, lsr #63 $noinline$UnsignedLongDiv07(long v)848*795d594fSAndroid Build Coastguard Worker private static long $noinline$UnsignedLongDiv07(long v) { 849*795d594fSAndroid Build Coastguard Worker while (v > 0 && (v % 10) == 0) { 850*795d594fSAndroid Build Coastguard Worker v /= 10; 851*795d594fSAndroid Build Coastguard Worker } 852*795d594fSAndroid Build Coastguard Worker return v; 853*795d594fSAndroid Build Coastguard Worker } 854*795d594fSAndroid Build Coastguard Worker 855*795d594fSAndroid Build Coastguard Worker // A test case to check that a correcting 'add' is not generated for a non-negative 856*795d594fSAndroid Build Coastguard Worker // dividend and a positive divisor. 857*795d594fSAndroid Build Coastguard Worker // 858*795d594fSAndroid Build Coastguard Worker /// CHECK-START-ARM64: long DivTest.$noinline$UnsignedLongDiv08(long) disassembly (after) 859*795d594fSAndroid Build Coastguard Worker /// CHECK: smulh x{{\d+}}, x{{\d+}}, x{{\d+}} 860*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: add x{{\d+}}, x{{\d+}}, x{{\d+}}, lsr #63 $noinline$UnsignedLongDiv08(long v)861*795d594fSAndroid Build Coastguard Worker private static long $noinline$UnsignedLongDiv08(long v) { 862*795d594fSAndroid Build Coastguard Worker if (v < 10) { 863*795d594fSAndroid Build Coastguard Worker v = $noinline$Negate(v); // This is to prevent from using Select. 864*795d594fSAndroid Build Coastguard Worker } else { 865*795d594fSAndroid Build Coastguard Worker v = (v % 10) + (v / 10); 866*795d594fSAndroid Build Coastguard Worker } 867*795d594fSAndroid Build Coastguard Worker return v; 868*795d594fSAndroid Build Coastguard Worker } 869*795d594fSAndroid Build Coastguard Worker 870*795d594fSAndroid Build Coastguard Worker // A test case to check that a correcting 'add' is generated for a negative 871*795d594fSAndroid Build Coastguard Worker // dividend and a positive divisor. 872*795d594fSAndroid Build Coastguard Worker // 873*795d594fSAndroid Build Coastguard Worker /// CHECK-START-ARM64: long DivTest.$noinline$SignedLongDiv01(long) disassembly (after) 874*795d594fSAndroid Build Coastguard Worker /// CHECK: smulh x{{\d+}}, x{{\d+}}, x{{\d+}} 875*795d594fSAndroid Build Coastguard Worker /// CHECK-NEXT: add x{{\d+}}, x{{\d+}}, x{{\d+}}, lsr #63 $noinline$SignedLongDiv01(long v)876*795d594fSAndroid Build Coastguard Worker private static long $noinline$SignedLongDiv01(long v) { 877*795d594fSAndroid Build Coastguard Worker long c = 0; 878*795d594fSAndroid Build Coastguard Worker if (v < 0) { 879*795d594fSAndroid Build Coastguard Worker c = v / 6; 880*795d594fSAndroid Build Coastguard Worker } else { 881*795d594fSAndroid Build Coastguard Worker c = $noinline$Decrement(v); // This is to prevent from using Select. 882*795d594fSAndroid Build Coastguard Worker } 883*795d594fSAndroid Build Coastguard Worker return c; 884*795d594fSAndroid Build Coastguard Worker } 885*795d594fSAndroid Build Coastguard Worker 886*795d594fSAndroid Build Coastguard Worker // A test case to check that a correcting 'add' is generated for a negative 887*795d594fSAndroid Build Coastguard Worker // dividend and a positive divisor. 888*795d594fSAndroid Build Coastguard Worker // 889*795d594fSAndroid Build Coastguard Worker /// CHECK-START-ARM64: long DivTest.$noinline$SignedLongDiv02(long) disassembly (after) 890*795d594fSAndroid Build Coastguard Worker /// CHECK: smulh x{{\d+}}, x{{\d+}}, x{{\d+}} 891*795d594fSAndroid Build Coastguard Worker /// CHECK-NEXT: add x{{\d+}}, x{{\d+}}, x{{\d+}}, lsr #63 $noinline$SignedLongDiv02(long v)892*795d594fSAndroid Build Coastguard Worker private static long $noinline$SignedLongDiv02(long v) { 893*795d594fSAndroid Build Coastguard Worker long c = 0; 894*795d594fSAndroid Build Coastguard Worker if (v <= 0) { 895*795d594fSAndroid Build Coastguard Worker c = v / 6; 896*795d594fSAndroid Build Coastguard Worker } else { 897*795d594fSAndroid Build Coastguard Worker c = $noinline$Decrement(v); // This is to prevent from using Select. 898*795d594fSAndroid Build Coastguard Worker } 899*795d594fSAndroid Build Coastguard Worker return c; 900*795d594fSAndroid Build Coastguard Worker } 901*795d594fSAndroid Build Coastguard Worker 902*795d594fSAndroid Build Coastguard Worker // A test case to check that a correcting 'add' is generated for signed division. 903*795d594fSAndroid Build Coastguard Worker // 904*795d594fSAndroid Build Coastguard Worker /// CHECK-START-ARM64: long DivTest.$noinline$SignedLongDiv03(long) disassembly (after) 905*795d594fSAndroid Build Coastguard Worker /// CHECK: smulh x{{\d+}}, x{{\d+}}, x{{\d+}} 906*795d594fSAndroid Build Coastguard Worker /// CHECK-NEXT: add x{{\d+}}, x{{\d+}}, x{{\d+}}, lsr #63 $noinline$SignedLongDiv03(long v)907*795d594fSAndroid Build Coastguard Worker private static long $noinline$SignedLongDiv03(long v) { 908*795d594fSAndroid Build Coastguard Worker boolean positive = (v > 0); 909*795d594fSAndroid Build Coastguard Worker long c = v / 6; 910*795d594fSAndroid Build Coastguard Worker if (!positive) { 911*795d594fSAndroid Build Coastguard Worker c = $noinline$Negate(c); // This is to prevent from using Select. 912*795d594fSAndroid Build Coastguard Worker } 913*795d594fSAndroid Build Coastguard Worker return c; 914*795d594fSAndroid Build Coastguard Worker } 915*795d594fSAndroid Build Coastguard Worker 916*795d594fSAndroid Build Coastguard Worker // A test case to check that a correcting 'add' is generated for signed division. 917*795d594fSAndroid Build Coastguard Worker // 918*795d594fSAndroid Build Coastguard Worker /// CHECK-START-ARM64: long DivTest.$noinline$SignedLongDiv04(long, boolean) disassembly (after) 919*795d594fSAndroid Build Coastguard Worker /// CHECK: smulh x{{\d+}}, x{{\d+}}, x{{\d+}} 920*795d594fSAndroid Build Coastguard Worker /// CHECK-NEXT: add x{{\d+}}, x{{\d+}}, x{{\d+}}, lsr #63 $noinline$SignedLongDiv04(long v, boolean apply_div)921*795d594fSAndroid Build Coastguard Worker private static long $noinline$SignedLongDiv04(long v, boolean apply_div) { 922*795d594fSAndroid Build Coastguard Worker long c = 0; 923*795d594fSAndroid Build Coastguard Worker boolean positive = (v > 0); 924*795d594fSAndroid Build Coastguard Worker if (apply_div) { 925*795d594fSAndroid Build Coastguard Worker c = v / 6; 926*795d594fSAndroid Build Coastguard Worker } else { 927*795d594fSAndroid Build Coastguard Worker c = $noinline$Decrement(v); // This is to prevent from using Select. 928*795d594fSAndroid Build Coastguard Worker } 929*795d594fSAndroid Build Coastguard Worker if (!positive) { 930*795d594fSAndroid Build Coastguard Worker c = $noinline$Negate(c); // This is to prevent from using Select. 931*795d594fSAndroid Build Coastguard Worker } 932*795d594fSAndroid Build Coastguard Worker return c; 933*795d594fSAndroid Build Coastguard Worker } 934*795d594fSAndroid Build Coastguard Worker 935*795d594fSAndroid Build Coastguard Worker // A test case to check that a correcting 'add' is generated for signed division. 936*795d594fSAndroid Build Coastguard Worker // 937*795d594fSAndroid Build Coastguard Worker /// CHECK-START-ARM64: long DivTest.$noinline$SignedLongDiv05(long, long, long) disassembly (after) 938*795d594fSAndroid Build Coastguard Worker /// CHECK: smulh x{{\d+}}, x{{\d+}}, x{{\d+}} 939*795d594fSAndroid Build Coastguard Worker /// CHECK-NEXT: add x{{\d+}}, x{{\d+}}, x{{\d+}}, lsr #63 $noinline$SignedLongDiv05(long v, long a, long b)940*795d594fSAndroid Build Coastguard Worker private static long $noinline$SignedLongDiv05(long v, long a, long b) { 941*795d594fSAndroid Build Coastguard Worker long c = 0; 942*795d594fSAndroid Build Coastguard Worker 943*795d594fSAndroid Build Coastguard Worker if (v < a) 944*795d594fSAndroid Build Coastguard Worker c = $noinline$Increment(c); // This is to prevent from using Select. 945*795d594fSAndroid Build Coastguard Worker 946*795d594fSAndroid Build Coastguard Worker if (b < a) 947*795d594fSAndroid Build Coastguard Worker c = $noinline$Increment(c); // This is to prevent from using Select. 948*795d594fSAndroid Build Coastguard Worker 949*795d594fSAndroid Build Coastguard Worker if (v > b) { 950*795d594fSAndroid Build Coastguard Worker c = v / 6; 951*795d594fSAndroid Build Coastguard Worker } else { 952*795d594fSAndroid Build Coastguard Worker c = $noinline$Increment(c); // This is to prevent from using Select. 953*795d594fSAndroid Build Coastguard Worker } 954*795d594fSAndroid Build Coastguard Worker 955*795d594fSAndroid Build Coastguard Worker return c; 956*795d594fSAndroid Build Coastguard Worker } 957*795d594fSAndroid Build Coastguard Worker 958*795d594fSAndroid Build Coastguard Worker // A test case to check that a correcting 'add' is generated for signed division. 959*795d594fSAndroid Build Coastguard Worker // 960*795d594fSAndroid Build Coastguard Worker /// CHECK-START-ARM64: long DivTest.$noinline$SignedLongDiv06(long) disassembly (after) 961*795d594fSAndroid Build Coastguard Worker /// CHECK: smulh x{{\d+}}, x{{\d+}}, x{{\d+}} 962*795d594fSAndroid Build Coastguard Worker /// CHECK-NEXT: add x{{\d+}}, x{{\d+}}, x{{\d+}}, lsr #63 $noinline$SignedLongDiv06(long v)963*795d594fSAndroid Build Coastguard Worker private static long $noinline$SignedLongDiv06(long v) { 964*795d594fSAndroid Build Coastguard Worker long c = v / 6; 965*795d594fSAndroid Build Coastguard Worker 966*795d594fSAndroid Build Coastguard Worker if (v > 0) { 967*795d594fSAndroid Build Coastguard Worker c = $noinline$Negate(c); // This is to prevent from using Select. 968*795d594fSAndroid Build Coastguard Worker } 969*795d594fSAndroid Build Coastguard Worker 970*795d594fSAndroid Build Coastguard Worker return c; 971*795d594fSAndroid Build Coastguard Worker } 972*795d594fSAndroid Build Coastguard Worker } 973