xref: /aosp_15_r20/art/test/411-checker-hdiv-hrem-const/src/DivTest.java (revision 795d594fd825385562da6b089ea9b2033f3abf5a)
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