xref: /aosp_15_r20/art/test/411-checker-hdiv-hrem-pow2/src/DivTest.java (revision 795d594fd825385562da6b089ea9b2033f3abf5a)
1*795d594fSAndroid Build Coastguard Worker /*
2*795d594fSAndroid Build Coastguard Worker  * Copyright (C) 2018 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 {
18*795d594fSAndroid Build Coastguard Worker 
expectEquals(T expected, T result)19*795d594fSAndroid Build Coastguard Worker   public static <T extends Number> void expectEquals(T expected, T result) {
20*795d594fSAndroid Build Coastguard Worker     if (!expected.equals(result)) {
21*795d594fSAndroid Build Coastguard Worker       throw new Error("Expected: " + expected + ", found: " + result);
22*795d594fSAndroid Build Coastguard Worker     }
23*795d594fSAndroid Build Coastguard Worker   }
24*795d594fSAndroid Build Coastguard Worker 
main()25*795d594fSAndroid Build Coastguard Worker   public static void main() {
26*795d594fSAndroid Build Coastguard Worker     divInt();
27*795d594fSAndroid Build Coastguard Worker     divLong();
28*795d594fSAndroid Build Coastguard Worker   }
29*795d594fSAndroid Build Coastguard Worker 
divInt()30*795d594fSAndroid Build Coastguard Worker   private static void divInt() {
31*795d594fSAndroid Build Coastguard Worker     expectEquals(0, $noinline$IntDivBy2(0));
32*795d594fSAndroid Build Coastguard Worker     expectEquals(0, $noinline$IntDivBy2(1));
33*795d594fSAndroid Build Coastguard Worker     expectEquals(0, $noinline$IntDivBy2(-1));
34*795d594fSAndroid Build Coastguard Worker     expectEquals(1, $noinline$IntDivBy2(2));
35*795d594fSAndroid Build Coastguard Worker     expectEquals(-1, $noinline$IntDivBy2(-2));
36*795d594fSAndroid Build Coastguard Worker     expectEquals(1, $noinline$IntDivBy2(3));
37*795d594fSAndroid Build Coastguard Worker     expectEquals(-1, $noinline$IntDivBy2(-3));
38*795d594fSAndroid Build Coastguard Worker     expectEquals(3, $noinline$IntDivBy2(7));
39*795d594fSAndroid Build Coastguard Worker     expectEquals(-3, $noinline$IntDivBy2(-7));
40*795d594fSAndroid Build Coastguard Worker     expectEquals(4, $noinline$IntDivBy2(8));
41*795d594fSAndroid Build Coastguard Worker     expectEquals(-4, $noinline$IntDivBy2(-8));
42*795d594fSAndroid Build Coastguard Worker     expectEquals(7, $noinline$IntDivBy2(0x0f));
43*795d594fSAndroid Build Coastguard Worker     expectEquals(0x007f, $noinline$IntDivBy2(0x00ff));
44*795d594fSAndroid Build Coastguard Worker     expectEquals(0x07ff, $noinline$IntDivBy2(0x0fff));
45*795d594fSAndroid Build Coastguard Worker     expectEquals(0x007fff, $noinline$IntDivBy2(0x00ffff));
46*795d594fSAndroid Build Coastguard Worker     expectEquals(0x3fffffff, $noinline$IntDivBy2(Integer.MAX_VALUE));
47*795d594fSAndroid Build Coastguard Worker     expectEquals(0xc0000000, $noinline$IntDivBy2(Integer.MIN_VALUE));
48*795d594fSAndroid Build Coastguard Worker 
49*795d594fSAndroid Build Coastguard Worker     expectEquals(0, $noinline$IntDivByMinus2(0));
50*795d594fSAndroid Build Coastguard Worker     expectEquals(0, $noinline$IntDivByMinus2(1));
51*795d594fSAndroid Build Coastguard Worker     expectEquals(0, $noinline$IntDivByMinus2(-1));
52*795d594fSAndroid Build Coastguard Worker     expectEquals(-1, $noinline$IntDivByMinus2(2));
53*795d594fSAndroid Build Coastguard Worker     expectEquals(1, $noinline$IntDivByMinus2(-2));
54*795d594fSAndroid Build Coastguard Worker     expectEquals(-1, $noinline$IntDivByMinus2(3));
55*795d594fSAndroid Build Coastguard Worker     expectEquals(1, $noinline$IntDivByMinus2(-3));
56*795d594fSAndroid Build Coastguard Worker     expectEquals(-3, $noinline$IntDivByMinus2(7));
57*795d594fSAndroid Build Coastguard Worker     expectEquals(3, $noinline$IntDivByMinus2(-7));
58*795d594fSAndroid Build Coastguard Worker     expectEquals(-4, $noinline$IntDivByMinus2(8));
59*795d594fSAndroid Build Coastguard Worker     expectEquals(4, $noinline$IntDivByMinus2(-8));
60*795d594fSAndroid Build Coastguard Worker     expectEquals(-7, $noinline$IntDivByMinus2(0x0f));
61*795d594fSAndroid Build Coastguard Worker     expectEquals(0xffffff81, $noinline$IntDivByMinus2(0x00ff));
62*795d594fSAndroid Build Coastguard Worker     expectEquals(0xfffff801, $noinline$IntDivByMinus2(0x0fff));
63*795d594fSAndroid Build Coastguard Worker     expectEquals(0xffff8001, $noinline$IntDivByMinus2(0x00ffff));
64*795d594fSAndroid Build Coastguard Worker     expectEquals(0xc0000001, $noinline$IntDivByMinus2(Integer.MAX_VALUE));
65*795d594fSAndroid Build Coastguard Worker     expectEquals(0x40000000, $noinline$IntDivByMinus2(Integer.MIN_VALUE));
66*795d594fSAndroid Build Coastguard Worker 
67*795d594fSAndroid Build Coastguard Worker     expectEquals(0, $noinline$IntAbsDivBy2(0));
68*795d594fSAndroid Build Coastguard Worker     expectEquals(0, $noinline$IntAbsDivBy2(1));
69*795d594fSAndroid Build Coastguard Worker     expectEquals(0, $noinline$IntAbsDivBy2(-1));
70*795d594fSAndroid Build Coastguard Worker     expectEquals(1, $noinline$IntAbsDivBy2(2));
71*795d594fSAndroid Build Coastguard Worker     expectEquals(1, $noinline$IntAbsDivBy2(-2));
72*795d594fSAndroid Build Coastguard Worker     expectEquals(1, $noinline$IntAbsDivBy2(3));
73*795d594fSAndroid Build Coastguard Worker     expectEquals(1, $noinline$IntAbsDivBy2(-3));
74*795d594fSAndroid Build Coastguard Worker     expectEquals(3, $noinline$IntAbsDivBy2(7));
75*795d594fSAndroid Build Coastguard Worker     expectEquals(3, $noinline$IntAbsDivBy2(-7));
76*795d594fSAndroid Build Coastguard Worker     expectEquals(4, $noinline$IntAbsDivBy2(8));
77*795d594fSAndroid Build Coastguard Worker     expectEquals(4, $noinline$IntAbsDivBy2(-8));
78*795d594fSAndroid Build Coastguard Worker     expectEquals(7, $noinline$IntAbsDivBy2(0x0f));
79*795d594fSAndroid Build Coastguard Worker     expectEquals(0x007f, $noinline$IntAbsDivBy2(0x00ff));
80*795d594fSAndroid Build Coastguard Worker     expectEquals(0x07ff, $noinline$IntAbsDivBy2(0x0fff));
81*795d594fSAndroid Build Coastguard Worker     expectEquals(0x007fff, $noinline$IntAbsDivBy2(0x00ffff));
82*795d594fSAndroid Build Coastguard Worker     expectEquals(0x3fffffff, $noinline$IntAbsDivBy2(Integer.MAX_VALUE));
83*795d594fSAndroid Build Coastguard Worker     expectEquals(0xc0000000, $noinline$IntAbsDivBy2(Integer.MIN_VALUE));
84*795d594fSAndroid Build Coastguard Worker 
85*795d594fSAndroid Build Coastguard Worker     expectEquals(0, $noinline$IntAbsDivByMinus2(0));
86*795d594fSAndroid Build Coastguard Worker     expectEquals(0, $noinline$IntAbsDivByMinus2(1));
87*795d594fSAndroid Build Coastguard Worker     expectEquals(0, $noinline$IntAbsDivByMinus2(-1));
88*795d594fSAndroid Build Coastguard Worker     expectEquals(-1, $noinline$IntAbsDivByMinus2(2));
89*795d594fSAndroid Build Coastguard Worker     expectEquals(-1, $noinline$IntAbsDivByMinus2(-2));
90*795d594fSAndroid Build Coastguard Worker     expectEquals(-1, $noinline$IntAbsDivByMinus2(3));
91*795d594fSAndroid Build Coastguard Worker     expectEquals(-1, $noinline$IntAbsDivByMinus2(-3));
92*795d594fSAndroid Build Coastguard Worker     expectEquals(-3, $noinline$IntAbsDivByMinus2(7));
93*795d594fSAndroid Build Coastguard Worker     expectEquals(-3, $noinline$IntAbsDivByMinus2(-7));
94*795d594fSAndroid Build Coastguard Worker     expectEquals(-4, $noinline$IntAbsDivByMinus2(8));
95*795d594fSAndroid Build Coastguard Worker     expectEquals(-4, $noinline$IntAbsDivByMinus2(-8));
96*795d594fSAndroid Build Coastguard Worker     expectEquals(-7, $noinline$IntAbsDivByMinus2(0x0f));
97*795d594fSAndroid Build Coastguard Worker     expectEquals(0xffffff81, $noinline$IntAbsDivByMinus2(0x00ff));
98*795d594fSAndroid Build Coastguard Worker     expectEquals(0xfffff801, $noinline$IntAbsDivByMinus2(0x0fff));
99*795d594fSAndroid Build Coastguard Worker     expectEquals(0xffff8001, $noinline$IntAbsDivByMinus2(0x00ffff));
100*795d594fSAndroid Build Coastguard Worker     expectEquals(0xc0000001, $noinline$IntAbsDivByMinus2(Integer.MAX_VALUE));
101*795d594fSAndroid Build Coastguard Worker     expectEquals(0x40000000, $noinline$IntAbsDivByMinus2(Integer.MIN_VALUE));
102*795d594fSAndroid Build Coastguard Worker 
103*795d594fSAndroid Build Coastguard Worker     expectEquals(0, $noinline$IntALenDivBy2(new int[0]));
104*795d594fSAndroid Build Coastguard Worker     expectEquals(0, $noinline$IntALenDivBy2(new int[1]));
105*795d594fSAndroid Build Coastguard Worker     expectEquals(1, $noinline$IntALenDivBy2(new int[2]));
106*795d594fSAndroid Build Coastguard Worker     expectEquals(1, $noinline$IntALenDivBy2(new int[3]));
107*795d594fSAndroid Build Coastguard Worker     expectEquals(3, $noinline$IntALenDivBy2(new int[7]));
108*795d594fSAndroid Build Coastguard Worker     expectEquals(4, $noinline$IntALenDivBy2(new int[8]));
109*795d594fSAndroid Build Coastguard Worker     expectEquals(7, $noinline$IntALenDivBy2(new int[0x0f]));
110*795d594fSAndroid Build Coastguard Worker     expectEquals(0x007f, $noinline$IntALenDivBy2(new int[0x00ff]));
111*795d594fSAndroid Build Coastguard Worker     expectEquals(0x07ff, $noinline$IntALenDivBy2(new int[0x0fff]));
112*795d594fSAndroid Build Coastguard Worker     expectEquals(0x007fff, $noinline$IntALenDivBy2(new int[0x00ffff]));
113*795d594fSAndroid Build Coastguard Worker 
114*795d594fSAndroid Build Coastguard Worker     expectEquals(0, $noinline$IntALenDivByMinus2(new int[0]));
115*795d594fSAndroid Build Coastguard Worker     expectEquals(0, $noinline$IntALenDivByMinus2(new int[1]));
116*795d594fSAndroid Build Coastguard Worker     expectEquals(-1, $noinline$IntALenDivByMinus2(new int[2]));
117*795d594fSAndroid Build Coastguard Worker     expectEquals(-1, $noinline$IntALenDivByMinus2(new int[3]));
118*795d594fSAndroid Build Coastguard Worker     expectEquals(-3, $noinline$IntALenDivByMinus2(new int[7]));
119*795d594fSAndroid Build Coastguard Worker     expectEquals(-4, $noinline$IntALenDivByMinus2(new int[8]));
120*795d594fSAndroid Build Coastguard Worker     expectEquals(-7, $noinline$IntALenDivByMinus2(new int[0x0f]));
121*795d594fSAndroid Build Coastguard Worker     expectEquals(0xffffff81, $noinline$IntALenDivByMinus2(new int[0x00ff]));
122*795d594fSAndroid Build Coastguard Worker     expectEquals(0xfffff801, $noinline$IntALenDivByMinus2(new int[0x0fff]));
123*795d594fSAndroid Build Coastguard Worker     expectEquals(0xffff8001, $noinline$IntALenDivByMinus2(new int[0x00ffff]));
124*795d594fSAndroid Build Coastguard Worker 
125*795d594fSAndroid Build Coastguard Worker     expectEquals(0, $noinline$IntDivBy16(0));
126*795d594fSAndroid Build Coastguard Worker     expectEquals(1, $noinline$IntDivBy16(16));
127*795d594fSAndroid Build Coastguard Worker     expectEquals(-1, $noinline$IntDivBy16(-16));
128*795d594fSAndroid Build Coastguard Worker     expectEquals(2, $noinline$IntDivBy16(33));
129*795d594fSAndroid Build Coastguard Worker     expectEquals(0x000f, $noinline$IntDivBy16(0x00ff));
130*795d594fSAndroid Build Coastguard Worker     expectEquals(0x00ff, $noinline$IntDivBy16(0x0fff));
131*795d594fSAndroid Build Coastguard Worker     expectEquals(0x000fff, $noinline$IntDivBy16(0x00ffff));
132*795d594fSAndroid Build Coastguard Worker     expectEquals(0x07ffffff, $noinline$IntDivBy16(Integer.MAX_VALUE));
133*795d594fSAndroid Build Coastguard Worker     expectEquals(0xf8000000, $noinline$IntDivBy16(Integer.MIN_VALUE));
134*795d594fSAndroid Build Coastguard Worker 
135*795d594fSAndroid Build Coastguard Worker     expectEquals(0, $noinline$IntDivByMinus16(0));
136*795d594fSAndroid Build Coastguard Worker     expectEquals(-1, $noinline$IntDivByMinus16(16));
137*795d594fSAndroid Build Coastguard Worker     expectEquals(1, $noinline$IntDivByMinus16(-16));
138*795d594fSAndroid Build Coastguard Worker     expectEquals(-2, $noinline$IntDivByMinus16(33));
139*795d594fSAndroid Build Coastguard Worker     expectEquals(0xfffffff1, $noinline$IntDivByMinus16(0x00ff));
140*795d594fSAndroid Build Coastguard Worker     expectEquals(0xffffff01, $noinline$IntDivByMinus16(0x0fff));
141*795d594fSAndroid Build Coastguard Worker     expectEquals(0xfffff001, $noinline$IntDivByMinus16(0x00ffff));
142*795d594fSAndroid Build Coastguard Worker     expectEquals(0xf8000001, $noinline$IntDivByMinus16(Integer.MAX_VALUE));
143*795d594fSAndroid Build Coastguard Worker     expectEquals(0x08000000, $noinline$IntDivByMinus16(Integer.MIN_VALUE));
144*795d594fSAndroid Build Coastguard Worker 
145*795d594fSAndroid Build Coastguard Worker     expectEquals(0, $noinline$IntAbsDivBy16(0));
146*795d594fSAndroid Build Coastguard Worker     expectEquals(1, $noinline$IntAbsDivBy16(16));
147*795d594fSAndroid Build Coastguard Worker     expectEquals(1, $noinline$IntAbsDivBy16(-16));
148*795d594fSAndroid Build Coastguard Worker     expectEquals(2, $noinline$IntAbsDivBy16(33));
149*795d594fSAndroid Build Coastguard Worker     expectEquals(0x000f, $noinline$IntAbsDivBy16(0x00ff));
150*795d594fSAndroid Build Coastguard Worker     expectEquals(0x00ff, $noinline$IntAbsDivBy16(0x0fff));
151*795d594fSAndroid Build Coastguard Worker     expectEquals(0x000fff, $noinline$IntAbsDivBy16(0x00ffff));
152*795d594fSAndroid Build Coastguard Worker     expectEquals(0x07ffffff, $noinline$IntAbsDivBy16(Integer.MAX_VALUE));
153*795d594fSAndroid Build Coastguard Worker     expectEquals(0xf8000000, $noinline$IntAbsDivBy16(Integer.MIN_VALUE));
154*795d594fSAndroid Build Coastguard Worker 
155*795d594fSAndroid Build Coastguard Worker     expectEquals(0, $noinline$IntAbsDivByMinus16(0));
156*795d594fSAndroid Build Coastguard Worker     expectEquals(-1, $noinline$IntAbsDivByMinus16(16));
157*795d594fSAndroid Build Coastguard Worker     expectEquals(-1, $noinline$IntAbsDivByMinus16(-16));
158*795d594fSAndroid Build Coastguard Worker     expectEquals(-2, $noinline$IntAbsDivByMinus16(33));
159*795d594fSAndroid Build Coastguard Worker     expectEquals(0xfffffff1, $noinline$IntAbsDivByMinus16(0x00ff));
160*795d594fSAndroid Build Coastguard Worker     expectEquals(0xffffff01, $noinline$IntAbsDivByMinus16(0x0fff));
161*795d594fSAndroid Build Coastguard Worker     expectEquals(0xfffff001, $noinline$IntAbsDivByMinus16(0x00ffff));
162*795d594fSAndroid Build Coastguard Worker     expectEquals(0xf8000001, $noinline$IntAbsDivByMinus16(Integer.MAX_VALUE));
163*795d594fSAndroid Build Coastguard Worker     expectEquals(0x08000000, $noinline$IntAbsDivByMinus16(Integer.MIN_VALUE));
164*795d594fSAndroid Build Coastguard Worker 
165*795d594fSAndroid Build Coastguard Worker     expectEquals(0, $noinline$IntALenDivBy16(new int[0]));
166*795d594fSAndroid Build Coastguard Worker     expectEquals(1, $noinline$IntALenDivBy16(new int[16]));
167*795d594fSAndroid Build Coastguard Worker     expectEquals(2, $noinline$IntALenDivBy16(new int[33]));
168*795d594fSAndroid Build Coastguard Worker     expectEquals(0x000f, $noinline$IntALenDivBy16(new int[0x00ff]));
169*795d594fSAndroid Build Coastguard Worker     expectEquals(0x00ff, $noinline$IntALenDivBy16(new int[0x0fff]));
170*795d594fSAndroid Build Coastguard Worker     expectEquals(0x000fff, $noinline$IntALenDivBy16(new int[0x00ffff]));
171*795d594fSAndroid Build Coastguard Worker 
172*795d594fSAndroid Build Coastguard Worker     expectEquals(0, $noinline$IntALenDivByMinus16(new int[0]));
173*795d594fSAndroid Build Coastguard Worker     expectEquals(-1, $noinline$IntALenDivByMinus16(new int[16]));
174*795d594fSAndroid Build Coastguard Worker     expectEquals(-2, $noinline$IntALenDivByMinus16(new int[33]));
175*795d594fSAndroid Build Coastguard Worker     expectEquals(0xfffffff1, $noinline$IntALenDivByMinus16(new int[0x00ff]));
176*795d594fSAndroid Build Coastguard Worker     expectEquals(0xffffff01, $noinline$IntALenDivByMinus16(new int[0x0fff]));
177*795d594fSAndroid Build Coastguard Worker     expectEquals(0xfffff001, $noinline$IntALenDivByMinus16(new int[0x00ffff]));
178*795d594fSAndroid Build Coastguard Worker 
179*795d594fSAndroid Build Coastguard Worker     expectEquals(0, $noinline$IntDivByIntMin(0));
180*795d594fSAndroid Build Coastguard Worker     expectEquals(0, $noinline$IntDivByIntMin(1));
181*795d594fSAndroid Build Coastguard Worker     expectEquals(0, $noinline$IntDivByIntMin(-1));
182*795d594fSAndroid Build Coastguard Worker     expectEquals(1, $noinline$IntDivByIntMin(Integer.MIN_VALUE));
183*795d594fSAndroid Build Coastguard Worker     expectEquals(0, $noinline$IntDivByIntMin(Integer.MAX_VALUE));
184*795d594fSAndroid Build Coastguard Worker 
185*795d594fSAndroid Build Coastguard Worker     expectEquals(0, $noinline$IntAbsDivByIntMin(0));
186*795d594fSAndroid Build Coastguard Worker     expectEquals(0, $noinline$IntAbsDivByIntMin(1));
187*795d594fSAndroid Build Coastguard Worker     expectEquals(0, $noinline$IntAbsDivByIntMin(-1));
188*795d594fSAndroid Build Coastguard Worker     expectEquals(1, $noinline$IntAbsDivByIntMin(Integer.MIN_VALUE));
189*795d594fSAndroid Build Coastguard Worker     expectEquals(0, $noinline$IntAbsDivByIntMin(Integer.MAX_VALUE));
190*795d594fSAndroid Build Coastguard Worker   }
191*795d594fSAndroid Build Coastguard Worker 
192*795d594fSAndroid Build Coastguard Worker   /// CHECK-START-ARM:   java.lang.Integer DivTest.$noinline$IntDivBy2(int) disassembly (after)
193*795d594fSAndroid Build Coastguard Worker   /// CHECK:                 add       r{{\d+}}, r{{\d+}}, r{{\d+}}, lsr #31
194*795d594fSAndroid Build Coastguard Worker   /// CHECK-NEXT:            asr{{s?}} r{{\d+}}, #1
195*795d594fSAndroid Build Coastguard Worker   //
196*795d594fSAndroid Build Coastguard Worker   /// CHECK-START-ARM64: java.lang.Integer DivTest.$noinline$IntDivBy2(int) disassembly (after)
197*795d594fSAndroid Build Coastguard Worker   /// CHECK:                 add w{{\d+}}, w{{\d+}}, w{{\d+}}, lsr #31
198*795d594fSAndroid Build Coastguard Worker   /// CHECK-NEXT:            asr w{{\d+}}, w{{\d+}}, #1
199*795d594fSAndroid Build Coastguard Worker   //
200*795d594fSAndroid Build Coastguard Worker   /// CHECK-START-X86_64: java.lang.Integer DivTest.$noinline$IntDivBy2(int) disassembly (after)
201*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:             cmovnl/geq
202*795d594fSAndroid Build Coastguard Worker   /// CHECK:                 add
$noinline$IntDivBy2(int v)203*795d594fSAndroid Build Coastguard Worker   private static Integer $noinline$IntDivBy2(int v) {
204*795d594fSAndroid Build Coastguard Worker     int r = v / 2;
205*795d594fSAndroid Build Coastguard Worker     return r;
206*795d594fSAndroid Build Coastguard Worker   }
207*795d594fSAndroid Build Coastguard Worker 
208*795d594fSAndroid Build Coastguard Worker   /// CHECK-START-ARM:   java.lang.Integer DivTest.$noinline$IntDivByMinus2(int) disassembly (after)
209*795d594fSAndroid Build Coastguard Worker   /// CHECK:                 add       r{{\d+}}, r{{\d+}}, r{{\d+}}, lsr #31
210*795d594fSAndroid Build Coastguard Worker   /// CHECK-NEXT:            asr{{s?}} r{{\d+}}, #1
211*795d594fSAndroid Build Coastguard Worker   /// CHECK-NEXT:            rsb{{s?}} r{{\d+}}, #0
212*795d594fSAndroid Build Coastguard Worker   //
213*795d594fSAndroid Build Coastguard Worker   /// CHECK-START-ARM64: java.lang.Integer DivTest.$noinline$IntDivByMinus2(int) disassembly (after)
214*795d594fSAndroid Build Coastguard Worker   /// CHECK:                 add w{{\d+}}, w{{\d+}}, w{{\d+}}, lsr #31
215*795d594fSAndroid Build Coastguard Worker   /// CHECK-NEXT:            neg w{{\d+}}, w{{\d+}}, asr #1
216*795d594fSAndroid Build Coastguard Worker   //
217*795d594fSAndroid Build Coastguard Worker   /// CHECK-START-X86_64: java.lang.Integer DivTest.$noinline$IntDivByMinus2(int) disassembly (after)
218*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:             cmovnl/geq
219*795d594fSAndroid Build Coastguard Worker   /// CHECK:                 add
$noinline$IntDivByMinus2(int v)220*795d594fSAndroid Build Coastguard Worker   private static Integer $noinline$IntDivByMinus2(int v) {
221*795d594fSAndroid Build Coastguard Worker     int r = v / -2;
222*795d594fSAndroid Build Coastguard Worker     return r;
223*795d594fSAndroid Build Coastguard Worker   }
224*795d594fSAndroid Build Coastguard Worker 
225*795d594fSAndroid Build Coastguard Worker   /// CHECK-START-ARM:   java.lang.Integer DivTest.$noinline$IntAbsDivBy2(int) disassembly (after)
226*795d594fSAndroid Build Coastguard Worker   /// CHECK:                 Div
227*795d594fSAndroid Build Coastguard Worker   /// CHECK-NEXT:            asr{{s?}} r{{\d+}}, #1
228*795d594fSAndroid Build Coastguard Worker   //
229*795d594fSAndroid Build Coastguard Worker   /// CHECK-START-ARM64: java.lang.Integer DivTest.$noinline$IntAbsDivBy2(int) disassembly (after)
230*795d594fSAndroid Build Coastguard Worker   /// CHECK:                 Div
231*795d594fSAndroid Build Coastguard Worker   /// CHECK-NEXT:            asr w{{\d+}}, w{{\d+}}, #1
$noinline$IntAbsDivBy2(int v)232*795d594fSAndroid Build Coastguard Worker   private static Integer $noinline$IntAbsDivBy2(int v) {
233*795d594fSAndroid Build Coastguard Worker     int r = Math.abs(v) / 2;
234*795d594fSAndroid Build Coastguard Worker     return r;
235*795d594fSAndroid Build Coastguard Worker   }
236*795d594fSAndroid Build Coastguard Worker 
237*795d594fSAndroid Build Coastguard Worker   /// CHECK-START-ARM:   java.lang.Integer DivTest.$noinline$IntAbsDivByMinus2(int) disassembly (after)
238*795d594fSAndroid Build Coastguard Worker   /// CHECK:                 Div
239*795d594fSAndroid Build Coastguard Worker   /// CHECK-NEXT:            asr{{s?}} r{{\d+}}, #1
240*795d594fSAndroid Build Coastguard Worker   /// CHECK-NEXT:            rsb{{s?}} r{{\d+}}, #0
241*795d594fSAndroid Build Coastguard Worker   //
242*795d594fSAndroid Build Coastguard Worker   /// CHECK-START-ARM64: java.lang.Integer DivTest.$noinline$IntAbsDivByMinus2(int) disassembly (after)
243*795d594fSAndroid Build Coastguard Worker   /// CHECK:                 Div
244*795d594fSAndroid Build Coastguard Worker   /// CHECK-NEXT:            neg w{{\d+}}, w{{\d+}}, asr #1
$noinline$IntAbsDivByMinus2(int v)245*795d594fSAndroid Build Coastguard Worker   private static Integer $noinline$IntAbsDivByMinus2(int v) {
246*795d594fSAndroid Build Coastguard Worker     int r = Math.abs(v) / -2;
247*795d594fSAndroid Build Coastguard Worker     return r;
248*795d594fSAndroid Build Coastguard Worker   }
249*795d594fSAndroid Build Coastguard Worker 
250*795d594fSAndroid Build Coastguard Worker   /// CHECK-START-ARM:   java.lang.Integer DivTest.$noinline$IntALenDivBy2(int[]) disassembly (after)
251*795d594fSAndroid Build Coastguard Worker   /// CHECK:                 Div
252*795d594fSAndroid Build Coastguard Worker   /// CHECK-NEXT:            asr{{s?}} r{{\d+}}, #1
253*795d594fSAndroid Build Coastguard Worker   //
254*795d594fSAndroid Build Coastguard Worker   /// CHECK-START-ARM64: java.lang.Integer DivTest.$noinline$IntALenDivBy2(int[]) disassembly (after)
255*795d594fSAndroid Build Coastguard Worker   /// CHECK:                 Div
256*795d594fSAndroid Build Coastguard Worker   /// CHECK-NEXT:            asr w{{\d+}}, w{{\d+}}, #1
$noinline$IntALenDivBy2(int[] arr)257*795d594fSAndroid Build Coastguard Worker   private static Integer $noinline$IntALenDivBy2(int[] arr) {
258*795d594fSAndroid Build Coastguard Worker     int r = arr.length / 2;
259*795d594fSAndroid Build Coastguard Worker     return r;
260*795d594fSAndroid Build Coastguard Worker   }
261*795d594fSAndroid Build Coastguard Worker 
262*795d594fSAndroid Build Coastguard Worker   /// CHECK-START-ARM:   java.lang.Integer DivTest.$noinline$IntALenDivByMinus2(int[]) disassembly (after)
263*795d594fSAndroid Build Coastguard Worker   /// CHECK:                 Div
264*795d594fSAndroid Build Coastguard Worker   /// CHECK-NEXT:            asr{{s?}} r{{\d+}}, #1
265*795d594fSAndroid Build Coastguard Worker   /// CHECK-NEXT:            rsb{{s?}} r{{\d+}}, #0
266*795d594fSAndroid Build Coastguard Worker   //
267*795d594fSAndroid Build Coastguard Worker   /// CHECK-START-ARM64: java.lang.Integer DivTest.$noinline$IntALenDivByMinus2(int[]) disassembly (after)
268*795d594fSAndroid Build Coastguard Worker   /// CHECK:                 Div
269*795d594fSAndroid Build Coastguard Worker   /// CHECK-NEXT:            neg w{{\d+}}, w{{\d+}}, asr #1
$noinline$IntALenDivByMinus2(int[] arr)270*795d594fSAndroid Build Coastguard Worker   private static Integer $noinline$IntALenDivByMinus2(int[] arr) {
271*795d594fSAndroid Build Coastguard Worker     int r = arr.length / -2;
272*795d594fSAndroid Build Coastguard Worker     return r;
273*795d594fSAndroid Build Coastguard Worker   }
274*795d594fSAndroid Build Coastguard Worker 
275*795d594fSAndroid Build Coastguard Worker   /// CHECK-START-ARM:   java.lang.Integer DivTest.$noinline$IntDivBy16(int) disassembly (after)
276*795d594fSAndroid Build Coastguard Worker   /// CHECK:                 asr{{s?}} r{{\d+}}, r{{\d+}}, #31
277*795d594fSAndroid Build Coastguard Worker   /// CHECK-NEXT:            add       r{{\d+}}, r{{\d+}}, r{{\d+}}, lsr #28
278*795d594fSAndroid Build Coastguard Worker   /// CHECK-NEXT:            asr{{s?}} r{{\d+}}, #4
279*795d594fSAndroid Build Coastguard Worker   //
280*795d594fSAndroid Build Coastguard Worker   /// CHECK-START-ARM64: java.lang.Integer DivTest.$noinline$IntDivBy16(int) disassembly (after)
281*795d594fSAndroid Build Coastguard Worker   /// CHECK:                 add w{{\d+}}, w{{\d+}}, #0xf
282*795d594fSAndroid Build Coastguard Worker   /// CHECK-NEXT:            cmp w{{\d+}}, #0x0
283*795d594fSAndroid Build Coastguard Worker   /// CHECK-NEXT:            csel w{{\d+}}, w{{\d+}}, w{{\d+}}, lt
284*795d594fSAndroid Build Coastguard Worker   /// CHECK-NEXT:            asr w{{\d+}}, w{{\d+}}, #4
$noinline$IntDivBy16(int v)285*795d594fSAndroid Build Coastguard Worker   private static Integer $noinline$IntDivBy16(int v) {
286*795d594fSAndroid Build Coastguard Worker     int r = v / 16;
287*795d594fSAndroid Build Coastguard Worker     return r;
288*795d594fSAndroid Build Coastguard Worker   }
289*795d594fSAndroid Build Coastguard Worker 
290*795d594fSAndroid Build Coastguard Worker   /// CHECK-START-ARM:   java.lang.Integer DivTest.$noinline$IntDivByMinus16(int) disassembly (after)
291*795d594fSAndroid Build Coastguard Worker   /// CHECK:                 asr{{s?}} r{{\d+}}, r{{\d+}}, #31
292*795d594fSAndroid Build Coastguard Worker   /// CHECK-NEXT:            add       r{{\d+}}, r{{\d+}}, r{{\d+}}, lsr #28
293*795d594fSAndroid Build Coastguard Worker   /// CHECK-NEXT:            asr{{s?}} r{{\d+}}, #4
294*795d594fSAndroid Build Coastguard Worker   /// CHECK-NEXT:            rsb{{s?}} r{{\d+}}, #0
295*795d594fSAndroid Build Coastguard Worker   //
296*795d594fSAndroid Build Coastguard Worker   /// CHECK-START-ARM64: java.lang.Integer DivTest.$noinline$IntDivByMinus16(int) disassembly (after)
297*795d594fSAndroid Build Coastguard Worker   /// CHECK:                 add w{{\d+}}, w{{\d+}}, #0xf
298*795d594fSAndroid Build Coastguard Worker   /// CHECK-NEXT:            cmp w{{\d+}}, #0x0
299*795d594fSAndroid Build Coastguard Worker   /// CHECK-NEXT:            csel w{{\d+}}, w{{\d+}}, w{{\d+}}, lt
300*795d594fSAndroid Build Coastguard Worker   /// CHECK-NEXT:            neg w{{\d+}}, w{{\d+}}, asr #4
$noinline$IntDivByMinus16(int v)301*795d594fSAndroid Build Coastguard Worker   private static Integer $noinline$IntDivByMinus16(int v) {
302*795d594fSAndroid Build Coastguard Worker     int r = v / -16;
303*795d594fSAndroid Build Coastguard Worker     return r;
304*795d594fSAndroid Build Coastguard Worker   }
305*795d594fSAndroid Build Coastguard Worker 
306*795d594fSAndroid Build Coastguard Worker   /// CHECK-START-ARM:   java.lang.Integer DivTest.$noinline$IntAbsDivBy16(int) disassembly (after)
307*795d594fSAndroid Build Coastguard Worker   /// CHECK:                 Div
308*795d594fSAndroid Build Coastguard Worker   /// CHECK-NEXT:            asr{{s?}} r{{\d+}}, #4
309*795d594fSAndroid Build Coastguard Worker   //
310*795d594fSAndroid Build Coastguard Worker   /// CHECK-START-ARM64: java.lang.Integer DivTest.$noinline$IntAbsDivBy16(int) disassembly (after)
311*795d594fSAndroid Build Coastguard Worker   /// CHECK:                 Div
312*795d594fSAndroid Build Coastguard Worker   /// CHECK-NEXT:            asr w{{\d+}}, w{{\d+}}, #4
$noinline$IntAbsDivBy16(int v)313*795d594fSAndroid Build Coastguard Worker   private static Integer $noinline$IntAbsDivBy16(int v) {
314*795d594fSAndroid Build Coastguard Worker     int r = Math.abs(v) / 16;
315*795d594fSAndroid Build Coastguard Worker     return r;
316*795d594fSAndroid Build Coastguard Worker   }
317*795d594fSAndroid Build Coastguard Worker 
318*795d594fSAndroid Build Coastguard Worker   /// CHECK-START-ARM:   java.lang.Integer DivTest.$noinline$IntAbsDivByMinus16(int) disassembly (after)
319*795d594fSAndroid Build Coastguard Worker   /// CHECK:                 Div
320*795d594fSAndroid Build Coastguard Worker   /// CHECK-NEXT:            asr{{s?}} r{{\d+}}, #4
321*795d594fSAndroid Build Coastguard Worker   /// CHECK-NEXT:            rsb{{s?}} r{{\d+}}, #0
322*795d594fSAndroid Build Coastguard Worker   //
323*795d594fSAndroid Build Coastguard Worker   /// CHECK-START-ARM64: java.lang.Integer DivTest.$noinline$IntAbsDivByMinus16(int) disassembly (after)
324*795d594fSAndroid Build Coastguard Worker   /// CHECK:                 Div
325*795d594fSAndroid Build Coastguard Worker   /// CHECK-NEXT:            neg w{{\d+}}, w{{\d+}}, asr #4
$noinline$IntAbsDivByMinus16(int v)326*795d594fSAndroid Build Coastguard Worker   private static Integer $noinline$IntAbsDivByMinus16(int v) {
327*795d594fSAndroid Build Coastguard Worker     int r = Math.abs(v) / -16;
328*795d594fSAndroid Build Coastguard Worker     return r;
329*795d594fSAndroid Build Coastguard Worker   }
330*795d594fSAndroid Build Coastguard Worker 
331*795d594fSAndroid Build Coastguard Worker   /// CHECK-START-ARM:   java.lang.Integer DivTest.$noinline$IntALenDivBy16(int[]) disassembly (after)
332*795d594fSAndroid Build Coastguard Worker   /// CHECK:                 Div
333*795d594fSAndroid Build Coastguard Worker   /// CHECK-NEXT:            asr{{s?}} r{{\d+}}, #4
334*795d594fSAndroid Build Coastguard Worker   //
335*795d594fSAndroid Build Coastguard Worker   /// CHECK-START-ARM64: java.lang.Integer DivTest.$noinline$IntALenDivBy16(int[]) disassembly (after)
336*795d594fSAndroid Build Coastguard Worker   /// CHECK:                 Div
337*795d594fSAndroid Build Coastguard Worker   /// CHECK-NEXT:            asr w{{\d+}}, w{{\d+}}, #4
$noinline$IntALenDivBy16(int[] arr)338*795d594fSAndroid Build Coastguard Worker   private static Integer $noinline$IntALenDivBy16(int[] arr) {
339*795d594fSAndroid Build Coastguard Worker     int r = arr.length / 16;
340*795d594fSAndroid Build Coastguard Worker     return r;
341*795d594fSAndroid Build Coastguard Worker   }
342*795d594fSAndroid Build Coastguard Worker 
343*795d594fSAndroid Build Coastguard Worker   /// CHECK-START-ARM:   java.lang.Integer DivTest.$noinline$IntALenDivByMinus16(int[]) disassembly (after)
344*795d594fSAndroid Build Coastguard Worker   /// CHECK:                 Div
345*795d594fSAndroid Build Coastguard Worker   /// CHECK-NEXT:            asr{{s?}} r{{\d+}}, #4
346*795d594fSAndroid Build Coastguard Worker   /// CHECK-NEXT:            rsb{{s?}} r{{\d+}}, #0
347*795d594fSAndroid Build Coastguard Worker   //
348*795d594fSAndroid Build Coastguard Worker   /// CHECK-START-ARM64: java.lang.Integer DivTest.$noinline$IntALenDivByMinus16(int[]) disassembly (after)
349*795d594fSAndroid Build Coastguard Worker   /// CHECK:                 Div
350*795d594fSAndroid Build Coastguard Worker   /// CHECK-NEXT:            neg w{{\d+}}, w{{\d+}}, asr #4
$noinline$IntALenDivByMinus16(int[] arr)351*795d594fSAndroid Build Coastguard Worker   private static Integer $noinline$IntALenDivByMinus16(int[] arr) {
352*795d594fSAndroid Build Coastguard Worker     int r = arr.length / -16;
353*795d594fSAndroid Build Coastguard Worker     return r;
354*795d594fSAndroid Build Coastguard Worker   }
355*795d594fSAndroid Build Coastguard Worker 
356*795d594fSAndroid Build Coastguard Worker   /// CHECK-START-ARM:   java.lang.Integer DivTest.$noinline$IntDivByIntMin(int) disassembly (after)
357*795d594fSAndroid Build Coastguard Worker   /// CHECK:                 asr{{s?}} r{{\d+}}, r{{\d+}}, #31
358*795d594fSAndroid Build Coastguard Worker   /// CHECK-NEXT:            add       r{{\d+}}, r{{\d+}}, r{{\d+}}, lsr #1
359*795d594fSAndroid Build Coastguard Worker   /// CHECK-NEXT:            asr{{s?}} r{{\d+}}, #31
360*795d594fSAndroid Build Coastguard Worker   /// CHECK-NEXT:            rsb{{s?}} r{{\d+}}, #0
361*795d594fSAndroid Build Coastguard Worker   //
362*795d594fSAndroid Build Coastguard Worker   /// CHECK-START-ARM64: java.lang.Integer DivTest.$noinline$IntDivByIntMin(int) disassembly (after)
363*795d594fSAndroid Build Coastguard Worker   /// CHECK:                 mov w{{\d+}}, #0x7fffffff
364*795d594fSAndroid Build Coastguard Worker   /// CHECK-NEXT:            add w{{\d+}}, w{{\d+}}, w{{\d+}}
365*795d594fSAndroid Build Coastguard Worker   /// CHECK-NEXT:            cmp w{{\d+}}, #0x0
366*795d594fSAndroid Build Coastguard Worker   /// CHECK-NEXT:            csel w{{\d+}}, w{{\d+}}, w{{\d+}}, lt
367*795d594fSAndroid Build Coastguard Worker   /// CHECK-NEXT:            neg w{{\d+}}, w{{\d+}}, asr #31
$noinline$IntDivByIntMin(int v)368*795d594fSAndroid Build Coastguard Worker   private static Integer $noinline$IntDivByIntMin(int v) {
369*795d594fSAndroid Build Coastguard Worker     int r = v / Integer.MIN_VALUE;
370*795d594fSAndroid Build Coastguard Worker     return r;
371*795d594fSAndroid Build Coastguard Worker   }
372*795d594fSAndroid Build Coastguard Worker 
373*795d594fSAndroid Build Coastguard Worker   /// CHECK-START-ARM:   java.lang.Integer DivTest.$noinline$IntAbsDivByIntMin(int) disassembly (after)
374*795d594fSAndroid Build Coastguard Worker   /// CHECK:                 Div
375*795d594fSAndroid Build Coastguard Worker   /// CHECK-NEXT:            asr{{s?}} r{{\d+}}, #31
376*795d594fSAndroid Build Coastguard Worker   /// CHECK-NEXT:            rsb{{s?}} r{{\d+}}, #0
377*795d594fSAndroid Build Coastguard Worker   //
378*795d594fSAndroid Build Coastguard Worker   /// CHECK-START-ARM64: java.lang.Integer DivTest.$noinline$IntAbsDivByIntMin(int) disassembly (after)
379*795d594fSAndroid Build Coastguard Worker   /// CHECK:                 Div
380*795d594fSAndroid Build Coastguard Worker   /// CHECK-NEXT:            neg w{{\d+}}, w{{\d+}}, asr #31
$noinline$IntAbsDivByIntMin(int v)381*795d594fSAndroid Build Coastguard Worker   private static Integer $noinline$IntAbsDivByIntMin(int v) {
382*795d594fSAndroid Build Coastguard Worker     int r = Math.abs(v) / Integer.MIN_VALUE;
383*795d594fSAndroid Build Coastguard Worker     return r;
384*795d594fSAndroid Build Coastguard Worker   }
385*795d594fSAndroid Build Coastguard Worker 
386*795d594fSAndroid Build Coastguard Worker   /// CHECK-START-ARM:   java.lang.Integer DivTest.unsignedDiv01(int) disassembly (after)
387*795d594fSAndroid Build Coastguard Worker   /// CHECK:                 Div
388*795d594fSAndroid Build Coastguard Worker   /// CHECK-NEXT:            asr{{s?}} r{{\d+}}, #1
389*795d594fSAndroid Build Coastguard Worker   //
390*795d594fSAndroid Build Coastguard Worker   /// CHECK-START-ARM64: java.lang.Integer DivTest.unsignedDiv01(int) disassembly (after)
391*795d594fSAndroid Build Coastguard Worker   /// CHECK:                 Div
392*795d594fSAndroid Build Coastguard Worker   /// CHECK-NEXT:            asr w{{\d+}}, w{{\d+}}, #1
unsignedDiv01(int v)393*795d594fSAndroid Build Coastguard Worker   private static Integer unsignedDiv01(int v) {
394*795d594fSAndroid Build Coastguard Worker     int l = 0;
395*795d594fSAndroid Build Coastguard Worker     for (int m = v - 1; m >= 0; m = m / 2 - 1) {
396*795d594fSAndroid Build Coastguard Worker       ++l;
397*795d594fSAndroid Build Coastguard Worker     }
398*795d594fSAndroid Build Coastguard Worker     return l;
399*795d594fSAndroid Build Coastguard Worker   }
400*795d594fSAndroid Build Coastguard Worker 
divLong()401*795d594fSAndroid Build Coastguard Worker   private static void divLong() {
402*795d594fSAndroid Build Coastguard Worker     expectEquals(0L, $noinline$LongDivBy2(0L));
403*795d594fSAndroid Build Coastguard Worker     expectEquals(0L, $noinline$LongDivBy2(1L));
404*795d594fSAndroid Build Coastguard Worker     expectEquals(0L, $noinline$LongDivBy2(-1L));
405*795d594fSAndroid Build Coastguard Worker     expectEquals(1L, $noinline$LongDivBy2(2L));
406*795d594fSAndroid Build Coastguard Worker     expectEquals(-1L, $noinline$LongDivBy2(-2L));
407*795d594fSAndroid Build Coastguard Worker     expectEquals(1L, $noinline$LongDivBy2(3L));
408*795d594fSAndroid Build Coastguard Worker     expectEquals(-1L, $noinline$LongDivBy2(-3L));
409*795d594fSAndroid Build Coastguard Worker     expectEquals(3L, $noinline$LongDivBy2(7L));
410*795d594fSAndroid Build Coastguard Worker     expectEquals(-3L, $noinline$LongDivBy2(-7L));
411*795d594fSAndroid Build Coastguard Worker     expectEquals(4L, $noinline$LongDivBy2(8L));
412*795d594fSAndroid Build Coastguard Worker     expectEquals(-4L, $noinline$LongDivBy2(-8L));
413*795d594fSAndroid Build Coastguard Worker     expectEquals(7L, $noinline$LongDivBy2(0x0fL));
414*795d594fSAndroid Build Coastguard Worker     expectEquals(0x007fL, $noinline$LongDivBy2(0x00ffL));
415*795d594fSAndroid Build Coastguard Worker     expectEquals(0x07ffL, $noinline$LongDivBy2(0x0fffL));
416*795d594fSAndroid Build Coastguard Worker     expectEquals(0x007fffL, $noinline$LongDivBy2(0x00ffffL));
417*795d594fSAndroid Build Coastguard Worker     expectEquals(0x3fffffffffffffffL, $noinline$LongDivBy2(Long.MAX_VALUE));
418*795d594fSAndroid Build Coastguard Worker     expectEquals(0xc000000000000000L, $noinline$LongDivBy2(Long.MIN_VALUE));
419*795d594fSAndroid Build Coastguard Worker 
420*795d594fSAndroid Build Coastguard Worker     expectEquals(0L, $noinline$LongDivByMinus2(0));
421*795d594fSAndroid Build Coastguard Worker     expectEquals(0L, $noinline$LongDivByMinus2(1L));
422*795d594fSAndroid Build Coastguard Worker     expectEquals(0L, $noinline$LongDivByMinus2(-1L));
423*795d594fSAndroid Build Coastguard Worker     expectEquals(-1L, $noinline$LongDivByMinus2(2L));
424*795d594fSAndroid Build Coastguard Worker     expectEquals(1L, $noinline$LongDivByMinus2(-2L));
425*795d594fSAndroid Build Coastguard Worker     expectEquals(-1L, $noinline$LongDivByMinus2(3L));
426*795d594fSAndroid Build Coastguard Worker     expectEquals(1L, $noinline$LongDivByMinus2(-3L));
427*795d594fSAndroid Build Coastguard Worker     expectEquals(-3L, $noinline$LongDivByMinus2(7L));
428*795d594fSAndroid Build Coastguard Worker     expectEquals(3L, $noinline$LongDivByMinus2(-7L));
429*795d594fSAndroid Build Coastguard Worker     expectEquals(-4L, $noinline$LongDivByMinus2(8L));
430*795d594fSAndroid Build Coastguard Worker     expectEquals(4L, $noinline$LongDivByMinus2(-8L));
431*795d594fSAndroid Build Coastguard Worker     expectEquals(-7L, $noinline$LongDivByMinus2(0x0fL));
432*795d594fSAndroid Build Coastguard Worker     expectEquals(0xffffffffffffff81L, $noinline$LongDivByMinus2(0x00ffL));
433*795d594fSAndroid Build Coastguard Worker     expectEquals(0xfffffffffffff801L, $noinline$LongDivByMinus2(0x0fffL));
434*795d594fSAndroid Build Coastguard Worker     expectEquals(0xffffffffffff8001L, $noinline$LongDivByMinus2(0x00ffffL));
435*795d594fSAndroid Build Coastguard Worker     expectEquals(0xc000000000000001L, $noinline$LongDivByMinus2(Long.MAX_VALUE));
436*795d594fSAndroid Build Coastguard Worker     expectEquals(0x4000000000000000L, $noinline$LongDivByMinus2(Long.MIN_VALUE));
437*795d594fSAndroid Build Coastguard Worker 
438*795d594fSAndroid Build Coastguard Worker     expectEquals(0L, $noinline$LongAbsDivBy2(0L));
439*795d594fSAndroid Build Coastguard Worker     expectEquals(0L, $noinline$LongAbsDivBy2(1L));
440*795d594fSAndroid Build Coastguard Worker     expectEquals(0L, $noinline$LongAbsDivBy2(-1L));
441*795d594fSAndroid Build Coastguard Worker     expectEquals(1L, $noinline$LongAbsDivBy2(2L));
442*795d594fSAndroid Build Coastguard Worker     expectEquals(1L, $noinline$LongAbsDivBy2(-2L));
443*795d594fSAndroid Build Coastguard Worker     expectEquals(1L, $noinline$LongAbsDivBy2(3L));
444*795d594fSAndroid Build Coastguard Worker     expectEquals(1L, $noinline$LongAbsDivBy2(-3L));
445*795d594fSAndroid Build Coastguard Worker     expectEquals(3L, $noinline$LongAbsDivBy2(7L));
446*795d594fSAndroid Build Coastguard Worker     expectEquals(3L, $noinline$LongAbsDivBy2(-7L));
447*795d594fSAndroid Build Coastguard Worker     expectEquals(4L, $noinline$LongAbsDivBy2(8L));
448*795d594fSAndroid Build Coastguard Worker     expectEquals(4L, $noinline$LongAbsDivBy2(-8L));
449*795d594fSAndroid Build Coastguard Worker     expectEquals(7L, $noinline$LongAbsDivBy2(0x0fL));
450*795d594fSAndroid Build Coastguard Worker     expectEquals(0x007fL, $noinline$LongAbsDivBy2(0x00ffL));
451*795d594fSAndroid Build Coastguard Worker     expectEquals(0x07ffL, $noinline$LongAbsDivBy2(0x0fffL));
452*795d594fSAndroid Build Coastguard Worker     expectEquals(0x007fffL, $noinline$LongAbsDivBy2(0x00ffffL));
453*795d594fSAndroid Build Coastguard Worker     expectEquals(0x3fffffffffffffffL, $noinline$LongAbsDivBy2(Long.MAX_VALUE));
454*795d594fSAndroid Build Coastguard Worker     expectEquals(0xc000000000000000L, $noinline$LongAbsDivBy2(Long.MIN_VALUE));
455*795d594fSAndroid Build Coastguard Worker 
456*795d594fSAndroid Build Coastguard Worker     expectEquals(0L, $noinline$LongAbsDivByMinus2(0));
457*795d594fSAndroid Build Coastguard Worker     expectEquals(0L, $noinline$LongAbsDivByMinus2(1L));
458*795d594fSAndroid Build Coastguard Worker     expectEquals(0L, $noinline$LongAbsDivByMinus2(-1L));
459*795d594fSAndroid Build Coastguard Worker     expectEquals(-1L, $noinline$LongAbsDivByMinus2(2L));
460*795d594fSAndroid Build Coastguard Worker     expectEquals(-1L, $noinline$LongAbsDivByMinus2(-2L));
461*795d594fSAndroid Build Coastguard Worker     expectEquals(-1L, $noinline$LongAbsDivByMinus2(3L));
462*795d594fSAndroid Build Coastguard Worker     expectEquals(-1L, $noinline$LongAbsDivByMinus2(-3L));
463*795d594fSAndroid Build Coastguard Worker     expectEquals(-3L, $noinline$LongAbsDivByMinus2(7L));
464*795d594fSAndroid Build Coastguard Worker     expectEquals(-3L, $noinline$LongAbsDivByMinus2(-7L));
465*795d594fSAndroid Build Coastguard Worker     expectEquals(-4L, $noinline$LongAbsDivByMinus2(8L));
466*795d594fSAndroid Build Coastguard Worker     expectEquals(-4L, $noinline$LongAbsDivByMinus2(-8L));
467*795d594fSAndroid Build Coastguard Worker     expectEquals(-7L, $noinline$LongAbsDivByMinus2(0x0fL));
468*795d594fSAndroid Build Coastguard Worker     expectEquals(0xffffffffffffff81L, $noinline$LongAbsDivByMinus2(0x00ffL));
469*795d594fSAndroid Build Coastguard Worker     expectEquals(0xfffffffffffff801L, $noinline$LongAbsDivByMinus2(0x0fffL));
470*795d594fSAndroid Build Coastguard Worker     expectEquals(0xffffffffffff8001L, $noinline$LongAbsDivByMinus2(0x00ffffL));
471*795d594fSAndroid Build Coastguard Worker     expectEquals(0xc000000000000001L, $noinline$LongAbsDivByMinus2(Long.MAX_VALUE));
472*795d594fSAndroid Build Coastguard Worker     expectEquals(0x4000000000000000L, $noinline$LongAbsDivByMinus2(Long.MIN_VALUE));
473*795d594fSAndroid Build Coastguard Worker 
474*795d594fSAndroid Build Coastguard Worker     expectEquals(0L, $noinline$LongDivBy16(0));
475*795d594fSAndroid Build Coastguard Worker     expectEquals(1L, $noinline$LongDivBy16(16L));
476*795d594fSAndroid Build Coastguard Worker     expectEquals(-1L, $noinline$LongDivBy16(-16L));
477*795d594fSAndroid Build Coastguard Worker     expectEquals(2L, $noinline$LongDivBy16(33L));
478*795d594fSAndroid Build Coastguard Worker     expectEquals(0x000fL, $noinline$LongDivBy16(0x00ffL));
479*795d594fSAndroid Build Coastguard Worker     expectEquals(0x00ffL, $noinline$LongDivBy16(0x0fffL));
480*795d594fSAndroid Build Coastguard Worker     expectEquals(0x000fffL, $noinline$LongDivBy16(0x00ffffL));
481*795d594fSAndroid Build Coastguard Worker     expectEquals(0x07ffffffffffffffL, $noinline$LongDivBy16(Long.MAX_VALUE));
482*795d594fSAndroid Build Coastguard Worker     expectEquals(0xf800000000000000L, $noinline$LongDivBy16(Long.MIN_VALUE));
483*795d594fSAndroid Build Coastguard Worker 
484*795d594fSAndroid Build Coastguard Worker     expectEquals(0L, $noinline$LongDivByMinus16(0));
485*795d594fSAndroid Build Coastguard Worker     expectEquals(-1L, $noinline$LongDivByMinus16(16L));
486*795d594fSAndroid Build Coastguard Worker     expectEquals(1L, $noinline$LongDivByMinus16(-16L));
487*795d594fSAndroid Build Coastguard Worker     expectEquals(-2L, $noinline$LongDivByMinus16(33L));
488*795d594fSAndroid Build Coastguard Worker     expectEquals(0xfffffffffffffff1L, $noinline$LongDivByMinus16(0x00ffL));
489*795d594fSAndroid Build Coastguard Worker     expectEquals(0xffffffffffffff01L, $noinline$LongDivByMinus16(0x0fffL));
490*795d594fSAndroid Build Coastguard Worker     expectEquals(0xfffffffffffff001L, $noinline$LongDivByMinus16(0x00ffffL));
491*795d594fSAndroid Build Coastguard Worker     expectEquals(0xf800000000000001L, $noinline$LongDivByMinus16(Long.MAX_VALUE));
492*795d594fSAndroid Build Coastguard Worker     expectEquals(0x0800000000000000L, $noinline$LongDivByMinus16(Long.MIN_VALUE));
493*795d594fSAndroid Build Coastguard Worker 
494*795d594fSAndroid Build Coastguard Worker     expectEquals(0L, $noinline$LongAbsDivBy16(0));
495*795d594fSAndroid Build Coastguard Worker     expectEquals(1L, $noinline$LongAbsDivBy16(16L));
496*795d594fSAndroid Build Coastguard Worker     expectEquals(1L, $noinline$LongAbsDivBy16(-16L));
497*795d594fSAndroid Build Coastguard Worker     expectEquals(2L, $noinline$LongAbsDivBy16(33L));
498*795d594fSAndroid Build Coastguard Worker     expectEquals(0x000fL, $noinline$LongAbsDivBy16(0x00ffL));
499*795d594fSAndroid Build Coastguard Worker     expectEquals(0x00ffL, $noinline$LongAbsDivBy16(0x0fffL));
500*795d594fSAndroid Build Coastguard Worker     expectEquals(0x000fffL, $noinline$LongAbsDivBy16(0x00ffffL));
501*795d594fSAndroid Build Coastguard Worker     expectEquals(0x07ffffffffffffffL, $noinline$LongAbsDivBy16(Long.MAX_VALUE));
502*795d594fSAndroid Build Coastguard Worker     expectEquals(0xf800000000000000L, $noinline$LongAbsDivBy16(Long.MIN_VALUE));
503*795d594fSAndroid Build Coastguard Worker 
504*795d594fSAndroid Build Coastguard Worker     expectEquals(0L, $noinline$LongAbsDivByMinus16(0));
505*795d594fSAndroid Build Coastguard Worker     expectEquals(-1L, $noinline$LongAbsDivByMinus16(16L));
506*795d594fSAndroid Build Coastguard Worker     expectEquals(-1L, $noinline$LongAbsDivByMinus16(-16L));
507*795d594fSAndroid Build Coastguard Worker     expectEquals(-2L, $noinline$LongAbsDivByMinus16(33L));
508*795d594fSAndroid Build Coastguard Worker     expectEquals(0xfffffffffffffff1L, $noinline$LongAbsDivByMinus16(0x00ffL));
509*795d594fSAndroid Build Coastguard Worker     expectEquals(0xffffffffffffff01L, $noinline$LongAbsDivByMinus16(0x0fffL));
510*795d594fSAndroid Build Coastguard Worker     expectEquals(0xfffffffffffff001L, $noinline$LongAbsDivByMinus16(0x00ffffL));
511*795d594fSAndroid Build Coastguard Worker     expectEquals(0xf800000000000001L, $noinline$LongAbsDivByMinus16(Long.MAX_VALUE));
512*795d594fSAndroid Build Coastguard Worker     expectEquals(0x0800000000000000L, $noinline$LongAbsDivByMinus16(Long.MIN_VALUE));
513*795d594fSAndroid Build Coastguard Worker 
514*795d594fSAndroid Build Coastguard Worker     expectEquals(0L, $noinline$LongDivByLongMin(0));
515*795d594fSAndroid Build Coastguard Worker     expectEquals(0L, $noinline$LongDivByLongMin(1));
516*795d594fSAndroid Build Coastguard Worker     expectEquals(0L, $noinline$LongDivByLongMin(-1));
517*795d594fSAndroid Build Coastguard Worker     expectEquals(1L, $noinline$LongDivByLongMin(Long.MIN_VALUE));
518*795d594fSAndroid Build Coastguard Worker     expectEquals(0L, $noinline$LongDivByLongMin(Long.MAX_VALUE));
519*795d594fSAndroid Build Coastguard Worker 
520*795d594fSAndroid Build Coastguard Worker     expectEquals(0L, $noinline$LongAbsDivByLongMin(0));
521*795d594fSAndroid Build Coastguard Worker     expectEquals(0L, $noinline$LongAbsDivByLongMin(1));
522*795d594fSAndroid Build Coastguard Worker     expectEquals(0L, $noinline$LongAbsDivByLongMin(-1));
523*795d594fSAndroid Build Coastguard Worker     expectEquals(1L, $noinline$LongAbsDivByLongMin(Long.MIN_VALUE));
524*795d594fSAndroid Build Coastguard Worker     expectEquals(0L, $noinline$LongAbsDivByLongMin(Long.MAX_VALUE));
525*795d594fSAndroid Build Coastguard Worker   }
526*795d594fSAndroid Build Coastguard Worker 
527*795d594fSAndroid Build Coastguard Worker   /// CHECK-START-ARM64: java.lang.Long DivTest.$noinline$LongDivBy2(long) disassembly (after)
528*795d594fSAndroid Build Coastguard Worker   /// CHECK:                 add x{{\d+}}, x{{\d+}}, x{{\d+}}, lsr #63
529*795d594fSAndroid Build Coastguard Worker   /// CHECK-NEXT:            asr x{{\d+}}, x{{\d+}}, #1
530*795d594fSAndroid Build Coastguard Worker   //
531*795d594fSAndroid Build Coastguard Worker   /// CHECK-START-X86_64: java.lang.Long DivTest.$noinline$LongDivBy2(long) disassembly (after)
532*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:             cmovnl/geq
533*795d594fSAndroid Build Coastguard Worker   /// CHECK:                 addq
$noinline$LongDivBy2(long v)534*795d594fSAndroid Build Coastguard Worker   private static Long $noinline$LongDivBy2(long v) {
535*795d594fSAndroid Build Coastguard Worker     long r = v / 2;
536*795d594fSAndroid Build Coastguard Worker     return r;
537*795d594fSAndroid Build Coastguard Worker   }
538*795d594fSAndroid Build Coastguard Worker 
539*795d594fSAndroid Build Coastguard Worker   /// CHECK-START-ARM64: java.lang.Long DivTest.$noinline$LongDivByMinus2(long) disassembly (after)
540*795d594fSAndroid Build Coastguard Worker   /// CHECK:                 add x{{\d+}}, x{{\d+}}, x{{\d+}}, lsr #63
541*795d594fSAndroid Build Coastguard Worker   /// CHECK-NEXT:            neg x{{\d+}}, x{{\d+}}, asr #1
542*795d594fSAndroid Build Coastguard Worker   //
543*795d594fSAndroid Build Coastguard Worker   /// CHECK-START-X86_64: java.lang.Long DivTest.$noinline$LongDivByMinus2(long) disassembly (after)
544*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:             cmovnl/geq
545*795d594fSAndroid Build Coastguard Worker   /// CHECK:                 addq
$noinline$LongDivByMinus2(long v)546*795d594fSAndroid Build Coastguard Worker   private static Long $noinline$LongDivByMinus2(long v) {
547*795d594fSAndroid Build Coastguard Worker     long r = v / -2;
548*795d594fSAndroid Build Coastguard Worker     return r;
549*795d594fSAndroid Build Coastguard Worker   }
550*795d594fSAndroid Build Coastguard Worker 
551*795d594fSAndroid Build Coastguard Worker   /// CHECK-START-ARM64: java.lang.Long DivTest.$noinline$LongAbsDivBy2(long) disassembly (after)
552*795d594fSAndroid Build Coastguard Worker   /// CHECK:                 Div
553*795d594fSAndroid Build Coastguard Worker   /// CHECK-NEXT:            asr x{{\d+}}, x{{\d+}}, #1
$noinline$LongAbsDivBy2(long v)554*795d594fSAndroid Build Coastguard Worker   private static Long $noinline$LongAbsDivBy2(long v) {
555*795d594fSAndroid Build Coastguard Worker     long r = Math.abs(v) / 2;
556*795d594fSAndroid Build Coastguard Worker     return r;
557*795d594fSAndroid Build Coastguard Worker   }
558*795d594fSAndroid Build Coastguard Worker 
559*795d594fSAndroid Build Coastguard Worker   /// CHECK-START-ARM64: java.lang.Long DivTest.$noinline$LongAbsDivByMinus2(long) disassembly (after)
560*795d594fSAndroid Build Coastguard Worker   /// CHECK:                 Div
561*795d594fSAndroid Build Coastguard Worker   /// CHECK-NEXT:            neg x{{\d+}}, x{{\d+}}, asr #1
$noinline$LongAbsDivByMinus2(long v)562*795d594fSAndroid Build Coastguard Worker   private static Long $noinline$LongAbsDivByMinus2(long v) {
563*795d594fSAndroid Build Coastguard Worker     long r = Math.abs(v) / -2;
564*795d594fSAndroid Build Coastguard Worker     return r;
565*795d594fSAndroid Build Coastguard Worker   }
566*795d594fSAndroid Build Coastguard Worker 
567*795d594fSAndroid Build Coastguard Worker   /// CHECK-START-ARM64: java.lang.Long DivTest.$noinline$LongDivBy16(long) disassembly (after)
568*795d594fSAndroid Build Coastguard Worker   /// CHECK:                 add x{{\d+}}, x{{\d+}}, #0xf
569*795d594fSAndroid Build Coastguard Worker   /// CHECK-NEXT:            cmp x{{\d+}}, #0x0
570*795d594fSAndroid Build Coastguard Worker   /// CHECK-NEXT:            csel x{{\d+}}, x{{\d+}}, x{{\d+}}, lt
571*795d594fSAndroid Build Coastguard Worker   /// CHECK-NEXT:            asr x{{\d+}}, x{{\d+}}, #4
$noinline$LongDivBy16(long v)572*795d594fSAndroid Build Coastguard Worker   private static Long $noinline$LongDivBy16(long v) {
573*795d594fSAndroid Build Coastguard Worker     long r = v / 16;
574*795d594fSAndroid Build Coastguard Worker     return r;
575*795d594fSAndroid Build Coastguard Worker   }
576*795d594fSAndroid Build Coastguard Worker 
577*795d594fSAndroid Build Coastguard Worker   /// CHECK-START-ARM64: java.lang.Long DivTest.$noinline$LongDivByMinus16(long) disassembly (after)
578*795d594fSAndroid Build Coastguard Worker   /// CHECK:                 add x{{\d+}}, x{{\d+}}, #0xf
579*795d594fSAndroid Build Coastguard Worker   /// CHECK-NEXT:            cmp x{{\d+}}, #0x0
580*795d594fSAndroid Build Coastguard Worker   /// CHECK-NEXT:            csel x{{\d+}}, x{{\d+}}, x{{\d+}}, lt
581*795d594fSAndroid Build Coastguard Worker   /// CHECK-NEXT:            neg x{{\d+}}, x{{\d+}}, asr #4
$noinline$LongDivByMinus16(long v)582*795d594fSAndroid Build Coastguard Worker   private static Long $noinline$LongDivByMinus16(long v) {
583*795d594fSAndroid Build Coastguard Worker     long r = v / -16;
584*795d594fSAndroid Build Coastguard Worker     return r;
585*795d594fSAndroid Build Coastguard Worker   }
586*795d594fSAndroid Build Coastguard Worker 
587*795d594fSAndroid Build Coastguard Worker   /// CHECK-START-ARM64: java.lang.Long DivTest.$noinline$LongAbsDivBy16(long) disassembly (after)
588*795d594fSAndroid Build Coastguard Worker   /// CHECK:                 Div
589*795d594fSAndroid Build Coastguard Worker   /// CHECK-NEXT:            asr x{{\d+}}, x{{\d+}}, #4
$noinline$LongAbsDivBy16(long v)590*795d594fSAndroid Build Coastguard Worker   private static Long $noinline$LongAbsDivBy16(long v) {
591*795d594fSAndroid Build Coastguard Worker     long r = Math.abs(v) / 16;
592*795d594fSAndroid Build Coastguard Worker     return r;
593*795d594fSAndroid Build Coastguard Worker   }
594*795d594fSAndroid Build Coastguard Worker 
595*795d594fSAndroid Build Coastguard Worker   /// CHECK-START-ARM64: java.lang.Long DivTest.$noinline$LongAbsDivByMinus16(long) disassembly (after)
596*795d594fSAndroid Build Coastguard Worker   /// CHECK:                 Div
597*795d594fSAndroid Build Coastguard Worker   /// CHECK-NEXT:            neg x{{\d+}}, x{{\d+}}, asr #4
$noinline$LongAbsDivByMinus16(long v)598*795d594fSAndroid Build Coastguard Worker   private static Long $noinline$LongAbsDivByMinus16(long v) {
599*795d594fSAndroid Build Coastguard Worker     long r = Math.abs(v) / -16;
600*795d594fSAndroid Build Coastguard Worker     return r;
601*795d594fSAndroid Build Coastguard Worker   }
602*795d594fSAndroid Build Coastguard Worker 
603*795d594fSAndroid Build Coastguard Worker   /// CHECK-START-ARM64: java.lang.Long DivTest.$noinline$LongDivByLongMin(long) disassembly (after)
604*795d594fSAndroid Build Coastguard Worker   /// CHECK:                 mov x{{\d+}}, #0x7fffffffffffffff
605*795d594fSAndroid Build Coastguard Worker   /// CHECK-NEXT:            add x{{\d+}}, x{{\d+}}, x{{\d+}}
606*795d594fSAndroid Build Coastguard Worker   /// CHECK-NEXT:            cmp x{{\d+}}, #0x0
607*795d594fSAndroid Build Coastguard Worker   /// CHECK-NEXT:            csel x{{\d+}}, x{{\d+}}, x{{\d+}}, lt
608*795d594fSAndroid Build Coastguard Worker   /// CHECK-NEXT:            neg x{{\d+}}, x{{\d+}}, asr #63
$noinline$LongDivByLongMin(long v)609*795d594fSAndroid Build Coastguard Worker   private static Long $noinline$LongDivByLongMin(long v) {
610*795d594fSAndroid Build Coastguard Worker     long r = v / Long.MIN_VALUE;
611*795d594fSAndroid Build Coastguard Worker     return r;
612*795d594fSAndroid Build Coastguard Worker   }
613*795d594fSAndroid Build Coastguard Worker 
614*795d594fSAndroid Build Coastguard Worker   /// CHECK-START-ARM64: java.lang.Long DivTest.$noinline$LongAbsDivByLongMin(long) disassembly (after)
615*795d594fSAndroid Build Coastguard Worker   /// CHECK:                 Div
616*795d594fSAndroid Build Coastguard Worker   /// CHECK-NEXT:            neg x{{\d+}}, x{{\d+}}, asr #63
$noinline$LongAbsDivByLongMin(long v)617*795d594fSAndroid Build Coastguard Worker   private static Long $noinline$LongAbsDivByLongMin(long v) {
618*795d594fSAndroid Build Coastguard Worker     long r = Math.abs(v) / Long.MIN_VALUE;
619*795d594fSAndroid Build Coastguard Worker     return r;
620*795d594fSAndroid Build Coastguard Worker   }
621*795d594fSAndroid Build Coastguard Worker }
622