1 /*
2  * Copyright (C) 2018 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 public class RemTest {
18 
expectEquals(T expected, T result)19   public static <T extends Number> void expectEquals(T expected, T result) {
20     if (!expected.equals(result)) {
21       throw new Error("Expected: " + expected + ", found: " + result);
22     }
23   }
24 
main()25   public static void main() {
26     remInt();
27     remLong();
28   }
29 
remInt()30   private static void remInt() {
31     expectEquals(0, $noinline$IntMod2(0));
32     expectEquals(1, $noinline$IntMod2(1));
33     expectEquals(-1, $noinline$IntMod2(-1));
34     expectEquals(0, $noinline$IntMod2(2));
35     expectEquals(0, $noinline$IntMod2(-2));
36     expectEquals(1, $noinline$IntMod2(3));
37     expectEquals(-1, $noinline$IntMod2(-3));
38     expectEquals(1, $noinline$IntMod2(0x0f));
39     expectEquals(1, $noinline$IntMod2(0x00ff));
40     expectEquals(1, $noinline$IntMod2(0x00ffff));
41     expectEquals(1, $noinline$IntMod2(Integer.MAX_VALUE));
42     expectEquals(0, $noinline$IntMod2(Integer.MIN_VALUE));
43 
44     expectEquals(0, $noinline$IntModMinus2(0));
45     expectEquals(1, $noinline$IntModMinus2(1));
46     expectEquals(-1, $noinline$IntModMinus2(-1));
47     expectEquals(0, $noinline$IntModMinus2(2));
48     expectEquals(0, $noinline$IntModMinus2(-2));
49     expectEquals(1, $noinline$IntModMinus2(3));
50     expectEquals(-1, $noinline$IntModMinus2(-3));
51     expectEquals(1, $noinline$IntModMinus2(0x0f));
52     expectEquals(1, $noinline$IntModMinus2(0x00ff));
53     expectEquals(1, $noinline$IntModMinus2(0x00ffff));
54     expectEquals(1, $noinline$IntModMinus2(Integer.MAX_VALUE));
55     expectEquals(0, $noinline$IntModMinus2(Integer.MIN_VALUE));
56 
57     expectEquals(0, $noinline$IntAbsMod2(0));
58     expectEquals(1, $noinline$IntAbsMod2(1));
59     expectEquals(1, $noinline$IntAbsMod2(-1));
60     expectEquals(0, $noinline$IntAbsMod2(2));
61     expectEquals(0, $noinline$IntAbsMod2(-2));
62     expectEquals(1, $noinline$IntAbsMod2(3));
63     expectEquals(1, $noinline$IntAbsMod2(-3));
64     expectEquals(1, $noinline$IntAbsMod2(0x0f));
65     expectEquals(1, $noinline$IntAbsMod2(0x00ff));
66     expectEquals(1, $noinline$IntAbsMod2(0x00ffff));
67     expectEquals(1, $noinline$IntAbsMod2(Integer.MAX_VALUE));
68     expectEquals(0, $noinline$IntAbsMod2(Integer.MIN_VALUE));
69 
70     expectEquals(0, $noinline$IntAbsModMinus2(0));
71     expectEquals(1, $noinline$IntAbsModMinus2(1));
72     expectEquals(1, $noinline$IntAbsModMinus2(-1));
73     expectEquals(0, $noinline$IntAbsModMinus2(2));
74     expectEquals(0, $noinline$IntAbsModMinus2(-2));
75     expectEquals(1, $noinline$IntAbsModMinus2(3));
76     expectEquals(1, $noinline$IntAbsModMinus2(-3));
77     expectEquals(1, $noinline$IntAbsModMinus2(0x0f));
78     expectEquals(1, $noinline$IntAbsModMinus2(0x00ff));
79     expectEquals(1, $noinline$IntAbsModMinus2(0x00ffff));
80     expectEquals(1, $noinline$IntAbsModMinus2(Integer.MAX_VALUE));
81     expectEquals(0, $noinline$IntAbsModMinus2(Integer.MIN_VALUE));
82 
83     expectEquals(0, $noinline$IntALenMod2(new int[0]));
84     expectEquals(1, $noinline$IntALenMod2(new int[1]));
85     expectEquals(0, $noinline$IntALenMod2(new int[2]));
86     expectEquals(1, $noinline$IntALenMod2(new int[3]));
87     expectEquals(1, $noinline$IntALenMod2(new int[0x0f]));
88     expectEquals(1, $noinline$IntALenMod2(new int[0x00ff]));
89     expectEquals(1, $noinline$IntALenMod2(new int[0x00ffff]));
90 
91     expectEquals(0, $noinline$IntALenModMinus2(new int[0]));
92     expectEquals(1, $noinline$IntALenModMinus2(new int[1]));
93     expectEquals(0, $noinline$IntALenModMinus2(new int[2]));
94     expectEquals(1, $noinline$IntALenModMinus2(new int[3]));
95     expectEquals(1, $noinline$IntALenModMinus2(new int[0x0f]));
96     expectEquals(1, $noinline$IntALenModMinus2(new int[0x00ff]));
97     expectEquals(1, $noinline$IntALenModMinus2(new int[0x00ffff]));
98 
99     expectEquals(0, $noinline$IntMod16(0));
100     expectEquals(1, $noinline$IntMod16(1));
101     expectEquals(1, $noinline$IntMod16(17));
102     expectEquals(-1, $noinline$IntMod16(-1));
103     expectEquals(0, $noinline$IntMod16(32));
104     expectEquals(0, $noinline$IntMod16(-32));
105     expectEquals(0x0f, $noinline$IntMod16(0x0f));
106     expectEquals(0x0f, $noinline$IntMod16(0x00ff));
107     expectEquals(0x0f, $noinline$IntMod16(0x00ffff));
108     expectEquals(15, $noinline$IntMod16(Integer.MAX_VALUE));
109     expectEquals(0, $noinline$IntMod16(Integer.MIN_VALUE));
110 
111     expectEquals(0, $noinline$IntModMinus16(0));
112     expectEquals(1, $noinline$IntModMinus16(1));
113     expectEquals(1, $noinline$IntModMinus16(17));
114     expectEquals(-1, $noinline$IntModMinus16(-1));
115     expectEquals(0, $noinline$IntModMinus16(32));
116     expectEquals(0, $noinline$IntModMinus16(-32));
117     expectEquals(0x0f, $noinline$IntModMinus16(0x0f));
118     expectEquals(0x0f, $noinline$IntModMinus16(0x00ff));
119     expectEquals(0x0f, $noinline$IntModMinus16(0x00ffff));
120     expectEquals(15, $noinline$IntModMinus16(Integer.MAX_VALUE));
121     expectEquals(0, $noinline$IntModMinus16(Integer.MIN_VALUE));
122 
123     expectEquals(0, $noinline$IntAbsMod16(0));
124     expectEquals(1, $noinline$IntAbsMod16(1));
125     expectEquals(1, $noinline$IntAbsMod16(17));
126     expectEquals(1, $noinline$IntAbsMod16(-1));
127     expectEquals(0, $noinline$IntAbsMod16(32));
128     expectEquals(0, $noinline$IntAbsMod16(-32));
129     expectEquals(0x0f, $noinline$IntAbsMod16(0x0f));
130     expectEquals(0x0f, $noinline$IntAbsMod16(0x00ff));
131     expectEquals(0x0f, $noinline$IntAbsMod16(0x00ffff));
132     expectEquals(15, $noinline$IntAbsMod16(Integer.MAX_VALUE));
133     expectEquals(0, $noinline$IntAbsMod16(Integer.MIN_VALUE));
134 
135     expectEquals(0, $noinline$IntAbsModMinus16(0));
136     expectEquals(1, $noinline$IntAbsModMinus16(1));
137     expectEquals(1, $noinline$IntAbsModMinus16(17));
138     expectEquals(1, $noinline$IntAbsModMinus16(-1));
139     expectEquals(0, $noinline$IntAbsModMinus16(32));
140     expectEquals(0, $noinline$IntAbsModMinus16(-32));
141     expectEquals(0x0f, $noinline$IntAbsModMinus16(0x0f));
142     expectEquals(0x0f, $noinline$IntAbsModMinus16(0x00ff));
143     expectEquals(0x0f, $noinline$IntAbsModMinus16(0x00ffff));
144     expectEquals(15, $noinline$IntAbsModMinus16(Integer.MAX_VALUE));
145     expectEquals(0, $noinline$IntAbsModMinus16(Integer.MIN_VALUE));
146 
147     expectEquals(0, $noinline$IntALenMod16(new int[0]));
148     expectEquals(1, $noinline$IntALenMod16(new int[1]));
149     expectEquals(1, $noinline$IntALenMod16(new int[17]));
150     expectEquals(0, $noinline$IntALenMod16(new int[32]));
151     expectEquals(0x0f, $noinline$IntALenMod16(new int[0x0f]));
152     expectEquals(0x0f, $noinline$IntALenMod16(new int[0x00ff]));
153     expectEquals(0x0f, $noinline$IntALenMod16(new int[0x00ffff]));
154 
155     expectEquals(0, $noinline$IntALenModMinus16(new int[0]));
156     expectEquals(1, $noinline$IntALenModMinus16(new int[1]));
157     expectEquals(1, $noinline$IntALenModMinus16(new int[17]));
158     expectEquals(0, $noinline$IntALenModMinus16(new int[32]));
159     expectEquals(0x0f, $noinline$IntALenModMinus16(new int[0x0f]));
160     expectEquals(0x0f, $noinline$IntALenModMinus16(new int[0x00ff]));
161     expectEquals(0x0f, $noinline$IntALenModMinus16(new int[0x00ffff]));
162 
163     expectEquals(0, $noinline$IntAbsMod1024(0));
164     expectEquals(1, $noinline$IntAbsMod1024(1));
165     expectEquals(1, $noinline$IntAbsMod1024(1025));
166     expectEquals(1, $noinline$IntAbsMod1024(-1));
167     expectEquals(0, $noinline$IntAbsMod1024(2048));
168     expectEquals(0, $noinline$IntAbsMod1024(-2048));
169     expectEquals(0x0f, $noinline$IntAbsMod1024(0x0f));
170     expectEquals(0x0ff, $noinline$IntAbsMod1024(0x00ff));
171     expectEquals(0x03ff, $noinline$IntAbsMod1024(0x00ffff));
172     expectEquals(0x03ff, $noinline$IntAbsMod1024(Integer.MAX_VALUE));
173     expectEquals(0, $noinline$IntAbsMod1024(Integer.MIN_VALUE));
174 
175     expectEquals(0, $noinline$IntAbsModMinus1024(0));
176     expectEquals(1, $noinline$IntAbsModMinus1024(1));
177     expectEquals(1, $noinline$IntAbsModMinus1024(1025));
178     expectEquals(1, $noinline$IntAbsModMinus1024(-1));
179     expectEquals(0, $noinline$IntAbsModMinus1024(2048));
180     expectEquals(0, $noinline$IntAbsModMinus1024(-2048));
181     expectEquals(0x0f, $noinline$IntAbsModMinus1024(0x0f));
182     expectEquals(0x0ff, $noinline$IntAbsModMinus1024(0x00ff));
183     expectEquals(0x03ff, $noinline$IntAbsModMinus1024(0x00ffff));
184     expectEquals(0x03ff, $noinline$IntAbsModMinus1024(Integer.MAX_VALUE));
185     expectEquals(0, $noinline$IntAbsModMinus1024(Integer.MIN_VALUE));
186 
187     expectEquals(0, $noinline$IntALenMod1024(new int[0]));
188     expectEquals(1, $noinline$IntALenMod1024(new int[1]));
189     expectEquals(1, $noinline$IntALenMod1024(new int[1025]));
190     expectEquals(0, $noinline$IntALenMod1024(new int[2048]));
191     expectEquals(0x0f, $noinline$IntALenMod1024(new int[0x0f]));
192     expectEquals(0x0ff, $noinline$IntALenMod1024(new int[0x00ff]));
193     expectEquals(0x03ff, $noinline$IntALenMod1024(new int[0x00ffff]));
194 
195     expectEquals(0, $noinline$IntALenModMinus1024(new int[0]));
196     expectEquals(1, $noinline$IntALenModMinus1024(new int[1]));
197     expectEquals(1, $noinline$IntALenModMinus1024(new int[1025]));
198     expectEquals(0, $noinline$IntALenModMinus1024(new int[2048]));
199     expectEquals(0x0f, $noinline$IntALenModMinus1024(new int[0x0f]));
200     expectEquals(0x0ff, $noinline$IntALenModMinus1024(new int[0x00ff]));
201     expectEquals(0x03ff, $noinline$IntALenModMinus1024(new int[0x00ffff]));
202 
203     expectEquals(0, $noinline$IntModIntMin(0));
204     expectEquals(1, $noinline$IntModIntMin(1));
205     expectEquals(0, $noinline$IntModIntMin(Integer.MIN_VALUE));
206     expectEquals(-1, $noinline$IntModIntMin(-1));
207     expectEquals(0x0f, $noinline$IntModIntMin(0x0f));
208     expectEquals(0x00ff, $noinline$IntModIntMin(0x00ff));
209     expectEquals(0x00ffff, $noinline$IntModIntMin(0x00ffff));
210     expectEquals(Integer.MAX_VALUE, $noinline$IntModIntMin(Integer.MAX_VALUE));
211 
212     expectEquals(0, $noinline$IntAbsModIntMin(0));
213     expectEquals(1, $noinline$IntAbsModIntMin(1));
214     expectEquals(0, $noinline$IntAbsModIntMin(Integer.MIN_VALUE));
215     expectEquals(1, $noinline$IntAbsModIntMin(-1));
216     expectEquals(0x0f, $noinline$IntAbsModIntMin(0x0f));
217     expectEquals(0x00ff, $noinline$IntAbsModIntMin(0x00ff));
218     expectEquals(0x00ffff, $noinline$IntAbsModIntMin(0x00ffff));
219     expectEquals(Integer.MAX_VALUE, $noinline$IntAbsModIntMin(Integer.MAX_VALUE));
220   }
221 
222   /// CHECK-START-ARM:   java.lang.Integer RemTest.$noinline$IntMod2(int) disassembly (after)
223   /// CHECK:                 add       r{{\d+}}, r{{\d+}}, r{{\d+}}, lsr #31
224   /// CHECK-NEXT:            bfc       r{{\d+}}, #0, #1
225   /// CHECK-NEXT:            sub{{s?}} r{{\d+}}, r{{\d+}}, r{{\d+}}
226   //
227   /// CHECK-START-ARM64: java.lang.Integer RemTest.$noinline$IntMod2(int) disassembly (after)
228   /// CHECK:                 cmp w{{\d+}}, #0x0
229   /// CHECK-NEXT:            and w{{\d+}}, w{{\d+}}, #0x1
230   /// CHECK-NEXT:            cneg w{{\d+}}, w{{\d+}}, lt
231   //
232   /// CHECK-START-X86_64: java.lang.Integer RemTest.$noinline$IntMod2(int) disassembly (after)
233   /// CHECK:          Rem [{{i\d+}},{{i\d+}}]
234   /// CHECK-NOT:      imul
235   /// CHECK-NOT:      shr
236   /// CHECK-NOT:      imul
237   /// CHECK:          mov
238   /// CHECK:          and
239   /// CHECK:          jz/eq
240   /// CHECK:          lea
241   /// CHECK:          test
242   /// CHECK:          cmovl/nge
$noinline$IntMod2(int v)243   private static Integer $noinline$IntMod2(int v) {
244     int r = v % 2;
245     return r;
246   }
247 
248   /// CHECK-START-ARM:   java.lang.Integer RemTest.$noinline$IntModMinus2(int) disassembly (after)
249   /// CHECK:                 add       r{{\d+}}, r{{\d+}}, r{{\d+}}, lsr #31
250   /// CHECK-NEXT:            bfc       r{{\d+}}, #0, #1
251   /// CHECK-NEXT:            sub{{s?}} r{{\d+}}, r{{\d+}}, r{{\d+}}
252   //
253   /// CHECK-START-ARM64: java.lang.Integer RemTest.$noinline$IntModMinus2(int) disassembly (after)
254   /// CHECK:                 cmp w{{\d+}}, #0x0
255   /// CHECK-NEXT:            and w{{\d+}}, w{{\d+}}, #0x1
256   /// CHECK-NEXT:            cneg w{{\d+}}, w{{\d+}}, lt
257   //
258   /// CHECK-START-X86_64: java.lang.Integer RemTest.$noinline$IntModMinus2(int) disassembly (after)
259   /// CHECK:          Rem [{{i\d+}},{{i\d+}}]
260   /// CHECK-NOT:      imul
261   /// CHECK-NOT:      shr
262   /// CHECK-NOT:      imul
263   /// CHECK:          mov
264   /// CHECK:          and
265   /// CHECK:          jz/eq
266   /// CHECK:          lea
267   /// CHECK:          test
268   /// CHECK:          cmovl/nge
$noinline$IntModMinus2(int v)269   private static Integer $noinline$IntModMinus2(int v) {
270     int r = v % -2;
271     return r;
272   }
273 
274   /// CHECK-START-ARM:   java.lang.Integer RemTest.$noinline$IntAbsMod2(int) disassembly (after)
275   /// CHECK:                 Rem
276   /// CHECK-NEXT:            and{{s?}} r{{\d+}}, r{{\d+}}, #0x1
277   //
278   /// CHECK-START-ARM64: java.lang.Integer RemTest.$noinline$IntAbsMod2(int) disassembly (after)
279   /// CHECK:                 Rem
280   /// CHECK-NEXT:            and w{{\d+}}, w{{\d+}}, #0x1
$noinline$IntAbsMod2(int v)281   private static Integer $noinline$IntAbsMod2(int v) {
282     int r = Math.abs(v) % 2;
283     return r;
284   }
285 
286   /// CHECK-START-ARM:   java.lang.Integer RemTest.$noinline$IntAbsModMinus2(int) disassembly (after)
287   /// CHECK:                 Rem
288   /// CHECK-NEXT:            and{{s?}} r{{\d+}}, r{{\d+}}, #0x1
289   //
290   /// CHECK-START-ARM64: java.lang.Integer RemTest.$noinline$IntAbsModMinus2(int) disassembly (after)
291   /// CHECK:                 Rem
292   /// CHECK-NEXT:            and w{{\d+}}, w{{\d+}}, #0x1
$noinline$IntAbsModMinus2(int v)293   private static Integer $noinline$IntAbsModMinus2(int v) {
294     int r = Math.abs(v) % -2;
295     return r;
296   }
297 
298   /// CHECK-START-ARM:   java.lang.Integer RemTest.$noinline$IntALenMod2(int[]) disassembly (after)
299   /// CHECK:                 Rem
300   /// CHECK-NEXT:            and{{s?}} r{{\d+}}, r{{\d+}}, #0x1
301   //
302   /// CHECK-START-ARM64: java.lang.Integer RemTest.$noinline$IntALenMod2(int[]) disassembly (after)
303   /// CHECK:                 Rem
304   /// CHECK-NEXT:            and w{{\d+}}, w{{\d+}}, #0x1
$noinline$IntALenMod2(int[] arr)305   private static Integer $noinline$IntALenMod2(int[] arr) {
306     int r = arr.length % 2;
307     return r;
308   }
309 
310   /// CHECK-START-ARM:   java.lang.Integer RemTest.$noinline$IntALenModMinus2(int[]) disassembly (after)
311   /// CHECK:                 Rem
312   /// CHECK-NEXT:            and{{s?}} r{{\d+}}, r{{\d+}}, #0x1
313   //
314   /// CHECK-START-ARM64: java.lang.Integer RemTest.$noinline$IntALenModMinus2(int[]) disassembly (after)
315   /// CHECK:                 Rem
316   /// CHECK-NEXT:            and w{{\d+}}, w{{\d+}}, #0x1
$noinline$IntALenModMinus2(int[] arr)317   private static Integer $noinline$IntALenModMinus2(int[] arr) {
318     int r = arr.length % -2;
319     return r;
320   }
321 
322   /// CHECK-START-ARM:   java.lang.Integer RemTest.$noinline$IntMod16(int) disassembly (after)
323   /// CHECK:                 asr{{s?}} r{{\d+}}, r{{\d+}}, #31
324   /// CHECK-NEXT:            add       r{{\d+}}, r{{\d+}}, r{{\d+}}, lsr #28
325   /// CHECK-NEXT:            bfc       r{{\d+}}, #0, #4
326   /// CHECK-NEXT:            sub{{s?}} r{{\d+}}, r{{\d+}}, r{{\d+}}
327   //
328   /// CHECK-START-ARM64: java.lang.Integer RemTest.$noinline$IntMod16(int) disassembly (after)
329   /// CHECK:                 negs w{{\d+}}, w{{\d+}}
330   /// CHECK-NEXT:            and w{{\d+}}, w{{\d+}}, #0xf
331   /// CHECK-NEXT:            and w{{\d+}}, w{{\d+}}, #0xf
332   /// CHECK-NEXT:            csneg w{{\d+}}, w{{\d+}}, mi
333   //
334   /// CHECK-START-X86_64: java.lang.Integer RemTest.$noinline$IntMod16(int) disassembly (after)
335   /// CHECK:          Rem [{{i\d+}},{{i\d+}}]
336   /// CHECK-NOT:      imul
337   /// CHECK-NOT:      shr
338   /// CHECK-NOT:      imul
339   /// CHECK:          mov
340   /// CHECK:          and
341   /// CHECK:          jz/eq
342   /// CHECK:          lea
343   /// CHECK:          test
344   /// CHECK:          cmovl/nge
$noinline$IntMod16(int v)345   private static Integer $noinline$IntMod16(int v) {
346     int r = v % 16;
347     return r;
348   }
349 
350   /// CHECK-START-ARM:   java.lang.Integer RemTest.$noinline$IntModMinus16(int) disassembly (after)
351   /// CHECK:                 asr{{s?}} r{{\d+}}, r{{\d+}}, #31
352   /// CHECK-NEXT:            add       r{{\d+}}, r{{\d+}}, r{{\d+}}, lsr #28
353   /// CHECK-NEXT:            bfc       r{{\d+}}, #0, #4
354   /// CHECK-NEXT:            sub{{s?}} r{{\d+}}, r{{\d+}}, r{{\d+}}
355   //
356   /// CHECK-START-ARM64: java.lang.Integer RemTest.$noinline$IntModMinus16(int) disassembly (after)
357   /// CHECK:                 negs w{{\d+}}, w{{\d+}}
358   /// CHECK-NEXT:            and w{{\d+}}, w{{\d+}}, #0xf
359   /// CHECK-NEXT:            and w{{\d+}}, w{{\d+}}, #0xf
360   /// CHECK-NEXT:            csneg w{{\d+}}, w{{\d+}}, mi
361   //
362   /// CHECK-START-X86_64: java.lang.Integer RemTest.$noinline$IntModMinus16(int) disassembly (after)
363   /// CHECK:          Rem [{{i\d+}},{{i\d+}}]
364   /// CHECK-NOT:      imul
365   /// CHECK-NOT:      shr
366   /// CHECK-NOT:      imul
367   /// CHECK:          mov
368   /// CHECK:          and
369   /// CHECK:          jz/eq
370   /// CHECK:          lea
371   /// CHECK:          test
372   /// CHECK:          cmovl/nge
$noinline$IntModMinus16(int v)373   private static Integer $noinline$IntModMinus16(int v) {
374     int r = v % -16;
375     return r;
376   }
377 
378   /// CHECK-START-ARM:   java.lang.Integer RemTest.$noinline$IntAbsMod16(int) disassembly (after)
379   /// CHECK:                 Rem
380   /// CHECK-NEXT:            and{{s?}} r{{\d+}}, r{{\d+}}, #0xf
381   //
382   /// CHECK-START-ARM64: java.lang.Integer RemTest.$noinline$IntAbsMod16(int) disassembly (after)
383   /// CHECK:                 Rem
384   /// CHECK-NEXT:            and w{{\d+}}, w{{\d+}}, #0xf
$noinline$IntAbsMod16(int v)385   private static Integer $noinline$IntAbsMod16(int v) {
386     int r = Math.abs(v) % 16;
387     return r;
388   }
389 
390   /// CHECK-START-ARM:   java.lang.Integer RemTest.$noinline$IntAbsModMinus16(int) disassembly (after)
391   /// CHECK:                 Rem
392   /// CHECK-NEXT:            and{{s?}} r{{\d+}}, r{{\d+}}, #0xf
393   //
394   /// CHECK-START-ARM64: java.lang.Integer RemTest.$noinline$IntAbsModMinus16(int) disassembly (after)
395   /// CHECK:                 Rem
396   /// CHECK-NEXT:            and w{{\d+}}, w{{\d+}}, #0xf
$noinline$IntAbsModMinus16(int v)397   private static Integer $noinline$IntAbsModMinus16(int v) {
398     int r = Math.abs(v) % -16;
399     return r;
400   }
401 
402   /// CHECK-START-ARM:   java.lang.Integer RemTest.$noinline$IntALenMod16(int[]) disassembly (after)
403   /// CHECK:                 Rem
404   /// CHECK-NEXT:            and{{s?}} r{{\d+}}, r{{\d+}}, #0xf
405   //
406   /// CHECK-START-ARM64: java.lang.Integer RemTest.$noinline$IntALenMod16(int[]) disassembly (after)
407   /// CHECK:                 Rem
408   /// CHECK-NEXT:            and w{{\d+}}, w{{\d+}}, #0xf
$noinline$IntALenMod16(int[] arr)409   private static Integer $noinline$IntALenMod16(int[] arr) {
410     int r = arr.length % 16;
411     return r;
412   }
413 
414   /// CHECK-START-ARM:   java.lang.Integer RemTest.$noinline$IntALenModMinus16(int[]) disassembly (after)
415   /// CHECK:                 Rem
416   /// CHECK-NEXT:            and{{s?}} r{{\d+}}, r{{\d+}}, #0xf
417   //
418   /// CHECK-START-ARM64: java.lang.Integer RemTest.$noinline$IntALenModMinus16(int[]) disassembly (after)
419   /// CHECK:                 Rem
420   /// CHECK-NEXT:            and w{{\d+}}, w{{\d+}}, #0xf
$noinline$IntALenModMinus16(int[] arr)421   private static Integer $noinline$IntALenModMinus16(int[] arr) {
422     int r = arr.length % -16;
423     return r;
424   }
425 
426   /// CHECK-START-ARM:   java.lang.Integer RemTest.$noinline$IntAbsMod1024(int) disassembly (after)
427   /// CHECK:                 Rem
428   /// CHECK-NEXT:            ubfx r{{\d+}}, r{{\d+}}, #0, #10
429   //
430   /// CHECK-START-ARM64: java.lang.Integer RemTest.$noinline$IntAbsMod1024(int) disassembly (after)
431   /// CHECK:                 Rem
432   /// CHECK-NEXT:            and w{{\d+}}, w{{\d+}}, #0x3ff
$noinline$IntAbsMod1024(int v)433   private static Integer $noinline$IntAbsMod1024(int v) {
434     int r = Math.abs(v) % 1024;
435     return r;
436   }
437 
438   /// CHECK-START-ARM:   java.lang.Integer RemTest.$noinline$IntAbsModMinus1024(int) disassembly (after)
439   /// CHECK:                 Rem
440   /// CHECK-NEXT:            ubfx r{{\d+}}, r{{\d+}}, #0, #10
441   //
442   /// CHECK-START-ARM64: java.lang.Integer RemTest.$noinline$IntAbsModMinus1024(int) disassembly (after)
443   /// CHECK:                 Rem
444   /// CHECK-NEXT:            and w{{\d+}}, w{{\d+}}, #0x3ff
$noinline$IntAbsModMinus1024(int v)445   private static Integer $noinline$IntAbsModMinus1024(int v) {
446     int r = Math.abs(v) % -1024;
447     return r;
448   }
449 
450   /// CHECK-START-ARM:   java.lang.Integer RemTest.$noinline$IntALenMod1024(int[]) disassembly (after)
451   /// CHECK:                 Rem
452   /// CHECK-NEXT:            ubfx r{{\d+}}, r{{\d+}}, #0, #10
453   //
454   /// CHECK-START-ARM64: java.lang.Integer RemTest.$noinline$IntALenMod1024(int[]) disassembly (after)
455   /// CHECK:                 Rem
456   /// CHECK-NEXT:            and w{{\d+}}, w{{\d+}}, #0x3ff
$noinline$IntALenMod1024(int[] arr)457   private static Integer $noinline$IntALenMod1024(int[] arr) {
458     int r = arr.length % 1024;
459     return r;
460   }
461 
462   /// CHECK-START-ARM:   java.lang.Integer RemTest.$noinline$IntALenModMinus1024(int[]) disassembly (after)
463   /// CHECK:                 Rem
464   /// CHECK-NEXT:            ubfx r{{\d+}}, r{{\d+}}, #0, #10
465   //
466   /// CHECK-START-ARM64: java.lang.Integer RemTest.$noinline$IntALenModMinus1024(int[]) disassembly (after)
467   /// CHECK:                 Rem
468   /// CHECK-NEXT:            and w{{\d+}}, w{{\d+}}, #0x3ff
$noinline$IntALenModMinus1024(int[] arr)469   private static Integer $noinline$IntALenModMinus1024(int[] arr) {
470     int r = arr.length % -1024;
471     return r;
472   }
473 
474   /// CHECK-START-ARM:   java.lang.Integer RemTest.$noinline$IntModIntMin(int) disassembly (after)
475   /// CHECK:                 asr{{s?}} r{{\d+}}, r{{\d+}}, #31
476   /// CHECK-NEXT:            add       r{{\d+}}, r{{\d+}}, r{{\d+}}, lsr #1
477   /// CHECK-NEXT:            bfc       r{{\d+}}, #0, #31
478   /// CHECK-NEXT:            sub{{s?}} r{{\d+}}, r{{\d+}}, r{{\d+}}
479   //
480   /// CHECK-START-ARM64: java.lang.Integer RemTest.$noinline$IntModIntMin(int) disassembly (after)
481   /// CHECK:                 negs w{{\d+}}, w{{\d+}}
482   /// CHECK-NEXT:            and w{{\d+}}, w{{\d+}}, #0x7fffffff
483   /// CHECK-NEXT:            and w{{\d+}}, w{{\d+}}, #0x7fffffff
484   /// CHECK-NEXT:            csneg w{{\d+}}, w{{\d+}}, mi
485   //
486   /// CHECK-START-X86_64: java.lang.Integer RemTest.$noinline$IntModIntMin(int) disassembly (after)
487   /// CHECK:          Rem [{{i\d+}},{{i\d+}}]
488   /// CHECK-NOT:      imul
489   /// CHECK-NOT:      shr
490   /// CHECK-NOT:      imul
491   /// CHECK:          mov
492   /// CHECK:          and
493   /// CHECK:          jz/eq
494   /// CHECK:          lea
495   /// CHECK:          test
496   /// CHECK:          cmovl/nge
$noinline$IntModIntMin(int v)497   private static Integer $noinline$IntModIntMin(int v) {
498     int r = v % Integer.MIN_VALUE;
499     return r;
500   }
501 
502   /// CHECK-START-ARM:   java.lang.Integer RemTest.$noinline$IntAbsModIntMin(int) disassembly (after)
503   /// CHECK:                 Rem
504   /// CHECK-NEXT:            ubfx r{{\d+}}, r{{\d+}}, #0, #31
505   //
506   /// CHECK-START-ARM64: java.lang.Integer RemTest.$noinline$IntAbsModIntMin(int) disassembly (after)
507   /// CHECK:                 Rem
508   /// CHECK-NEXT:            and w{{\d+}}, w{{\d+}}, #0x7fffffff
$noinline$IntAbsModIntMin(int v)509   private static Integer $noinline$IntAbsModIntMin(int v) {
510     int r = Math.abs(v) % Integer.MIN_VALUE;
511     return r;
512   }
513 
remLong()514   private static void remLong() {
515     expectEquals(0L, $noinline$LongMod2(0));
516     expectEquals(1L, $noinline$LongMod2(1));
517     expectEquals(-1L, $noinline$LongMod2(-1));
518     expectEquals(0L, $noinline$LongMod2(2));
519     expectEquals(0L, $noinline$LongMod2(-2));
520     expectEquals(1L, $noinline$LongMod2(3));
521     expectEquals(-1L, $noinline$LongMod2(-3));
522     expectEquals(1L, $noinline$LongMod2(0x0f));
523     expectEquals(1L, $noinline$LongMod2(0x00ff));
524     expectEquals(1L, $noinline$LongMod2(0x00ffff));
525     expectEquals(1L, $noinline$LongMod2(0x00ffffff));
526     expectEquals(1L, $noinline$LongMod2(0x00ffffffffL));
527     expectEquals(1L, $noinline$LongMod2(Long.MAX_VALUE));
528     expectEquals(0L, $noinline$LongMod2(Long.MIN_VALUE));
529 
530     expectEquals(0L, $noinline$LongModMinus2(0));
531     expectEquals(1L, $noinline$LongModMinus2(1));
532     expectEquals(-1L, $noinline$LongModMinus2(-1));
533     expectEquals(0L, $noinline$LongModMinus2(2));
534     expectEquals(0L, $noinline$LongModMinus2(-2));
535     expectEquals(1L, $noinline$LongModMinus2(3));
536     expectEquals(-1L, $noinline$LongModMinus2(-3));
537     expectEquals(1L, $noinline$LongModMinus2(0x0f));
538     expectEquals(1L, $noinline$LongModMinus2(0x00ff));
539     expectEquals(1L, $noinline$LongModMinus2(0x00ffff));
540     expectEquals(1L, $noinline$LongModMinus2(0x00ffffff));
541     expectEquals(1L, $noinline$LongModMinus2(0x00ffffffffL));
542     expectEquals(1L, $noinline$LongModMinus2(Long.MAX_VALUE));
543     expectEquals(0L, $noinline$LongModMinus2(Long.MIN_VALUE));
544 
545     expectEquals(0L, $noinline$LongAbsMod2(0));
546     expectEquals(1L, $noinline$LongAbsMod2(1));
547     expectEquals(1L, $noinline$LongAbsMod2(-1));
548     expectEquals(0L, $noinline$LongAbsMod2(2));
549     expectEquals(0L, $noinline$LongAbsMod2(-2));
550     expectEquals(1L, $noinline$LongAbsMod2(3));
551     expectEquals(1L, $noinline$LongAbsMod2(-3));
552     expectEquals(1L, $noinline$LongAbsMod2(0x0f));
553     expectEquals(1L, $noinline$LongAbsMod2(0x00ff));
554     expectEquals(1L, $noinline$LongAbsMod2(0x00ffff));
555     expectEquals(1L, $noinline$LongAbsMod2(0x00ffffff));
556     expectEquals(1L, $noinline$LongAbsMod2(0x00ffffffffL));
557     expectEquals(1L, $noinline$LongAbsMod2(Long.MAX_VALUE));
558     expectEquals(0L, $noinline$LongAbsMod2(Long.MIN_VALUE));
559 
560     expectEquals(0L, $noinline$LongAbsModMinus2(0));
561     expectEquals(1L, $noinline$LongAbsModMinus2(1));
562     expectEquals(1L, $noinline$LongAbsModMinus2(-1));
563     expectEquals(0L, $noinline$LongAbsModMinus2(2));
564     expectEquals(0L, $noinline$LongAbsModMinus2(-2));
565     expectEquals(1L, $noinline$LongAbsModMinus2(3));
566     expectEquals(1L, $noinline$LongAbsModMinus2(-3));
567     expectEquals(1L, $noinline$LongAbsModMinus2(0x0f));
568     expectEquals(1L, $noinline$LongAbsModMinus2(0x00ff));
569     expectEquals(1L, $noinline$LongAbsModMinus2(0x00ffff));
570     expectEquals(1L, $noinline$LongAbsModMinus2(0x00ffffff));
571     expectEquals(1L, $noinline$LongAbsModMinus2(0x00ffffffffL));
572     expectEquals(1L, $noinline$LongAbsModMinus2(Long.MAX_VALUE));
573     expectEquals(0L, $noinline$LongAbsModMinus2(Long.MIN_VALUE));
574 
575     expectEquals(0L, $noinline$LongMod16(0));
576     expectEquals(1L, $noinline$LongMod16(1));
577     expectEquals(1L, $noinline$LongMod16(17));
578     expectEquals(-1L, $noinline$LongMod16(-1));
579     expectEquals(0L, $noinline$LongMod16(32));
580     expectEquals(0L, $noinline$LongMod16(-32));
581     expectEquals(0x0fL, $noinline$LongMod16(0x0f));
582     expectEquals(0x0fL, $noinline$LongMod16(0x00ff));
583     expectEquals(0x0fL, $noinline$LongMod16(0x00ffff));
584     expectEquals(0x0fL, $noinline$LongMod16(0x00ffffff));
585     expectEquals(0x0fL, $noinline$LongMod16(0x00ffffffffL));
586     expectEquals(15L, $noinline$LongMod16(Long.MAX_VALUE));
587     expectEquals(0L, $noinline$LongMod16(Long.MIN_VALUE));
588 
589     expectEquals(0L, $noinline$LongModMinus16(0));
590     expectEquals(1L, $noinline$LongModMinus16(1));
591     expectEquals(1L, $noinline$LongModMinus16(17));
592     expectEquals(-1L, $noinline$LongModMinus16(-1));
593     expectEquals(0L, $noinline$LongModMinus16(32));
594     expectEquals(0L, $noinline$LongModMinus16(-32));
595     expectEquals(0x0fL, $noinline$LongModMinus16(0x0f));
596     expectEquals(0x0fL, $noinline$LongModMinus16(0x00ff));
597     expectEquals(0x0fL, $noinline$LongModMinus16(0x00ffff));
598     expectEquals(0x0fL, $noinline$LongModMinus16(0x00ffffff));
599     expectEquals(0x0fL, $noinline$LongModMinus16(0x00ffffffffL));
600     expectEquals(15L, $noinline$LongModMinus16(Long.MAX_VALUE));
601     expectEquals(0L, $noinline$LongModMinus16(Long.MIN_VALUE));
602 
603     expectEquals(0L, $noinline$LongAbsMod16(0));
604     expectEquals(1L, $noinline$LongAbsMod16(1));
605     expectEquals(1L, $noinline$LongAbsMod16(17));
606     expectEquals(1L, $noinline$LongAbsMod16(-1));
607     expectEquals(0L, $noinline$LongAbsMod16(32));
608     expectEquals(0L, $noinline$LongAbsMod16(-32));
609     expectEquals(0x0fL, $noinline$LongAbsMod16(0x0f));
610     expectEquals(0x0fL, $noinline$LongAbsMod16(0x00ff));
611     expectEquals(0x0fL, $noinline$LongAbsMod16(0x00ffff));
612     expectEquals(0x0fL, $noinline$LongAbsMod16(0x00ffffff));
613     expectEquals(0x0fL, $noinline$LongAbsMod16(0x00ffffffffL));
614     expectEquals(15L, $noinline$LongAbsMod16(Long.MAX_VALUE));
615     expectEquals(0L, $noinline$LongAbsMod16(Long.MIN_VALUE));
616 
617     expectEquals(0L, $noinline$LongAbsModMinus16(0));
618     expectEquals(1L, $noinline$LongAbsModMinus16(1));
619     expectEquals(1L, $noinline$LongAbsModMinus16(17));
620     expectEquals(1L, $noinline$LongAbsModMinus16(-1));
621     expectEquals(0L, $noinline$LongAbsModMinus16(32));
622     expectEquals(0L, $noinline$LongAbsModMinus16(-32));
623     expectEquals(0x0fL, $noinline$LongAbsModMinus16(0x0f));
624     expectEquals(0x0fL, $noinline$LongAbsModMinus16(0x00ff));
625     expectEquals(0x0fL, $noinline$LongAbsModMinus16(0x00ffff));
626     expectEquals(0x0fL, $noinline$LongAbsModMinus16(0x00ffffff));
627     expectEquals(0x0fL, $noinline$LongAbsModMinus16(0x00ffffffffL));
628     expectEquals(15L, $noinline$LongAbsModMinus16(Long.MAX_VALUE));
629     expectEquals(0L, $noinline$LongAbsModMinus16(Long.MIN_VALUE));
630 
631     expectEquals(0L, $noinline$LongModLongMin(0));
632     expectEquals(1L, $noinline$LongModLongMin(1));
633     expectEquals(0L, $noinline$LongModLongMin(Long.MIN_VALUE));
634     expectEquals(-1L, $noinline$LongModLongMin(-1));
635     expectEquals(0x0fL, $noinline$LongModLongMin(0x0f));
636     expectEquals(0x00ffL, $noinline$LongModLongMin(0x00ff));
637     expectEquals(0x00ffffL, $noinline$LongModLongMin(0x00ffff));
638     expectEquals(0x00ffffffL, $noinline$LongModLongMin(0x00ffffff));
639     expectEquals(0x00ffffffffL, $noinline$LongModLongMin(0x00ffffffffL));
640     expectEquals(Long.MAX_VALUE, $noinline$LongModLongMin(Long.MAX_VALUE));
641 
642     expectEquals(0L, $noinline$LongAbsModLongMin(0));
643     expectEquals(1L, $noinline$LongAbsModLongMin(1));
644     expectEquals(0L, $noinline$LongAbsModLongMin(Long.MIN_VALUE));
645     expectEquals(1L, $noinline$LongAbsModLongMin(-1));
646     expectEquals(0x0fL, $noinline$LongAbsModLongMin(0x0f));
647     expectEquals(0x00ffL, $noinline$LongAbsModLongMin(0x00ff));
648     expectEquals(0x00ffffL, $noinline$LongAbsModLongMin(0x00ffff));
649     expectEquals(0x00ffffffL, $noinline$LongAbsModLongMin(0x00ffffff));
650     expectEquals(0x00ffffffffL, $noinline$LongAbsModLongMin(0x00ffffffffL));
651     expectEquals(Long.MAX_VALUE, $noinline$LongAbsModLongMin(Long.MAX_VALUE));
652   }
653 
654   /// CHECK-START-ARM64: java.lang.Long RemTest.$noinline$LongMod2(long) disassembly (after)
655   /// CHECK:                 cmp x{{\d+}}, #0x0
656   /// CHECK-NEXT:            and x{{\d+}}, x{{\d+}}, #0x1
657   /// CHECK-NEXT:            cneg x{{\d+}}, x{{\d+}}, lt
658   //
659   /// CHECK-START-X86_64: java.lang.Long RemTest.$noinline$LongMod2(long) disassembly (after)
660   /// CHECK:          Rem [{{j\d+}},{{j\d+}}]
661   /// CHECK-NOT:      imul
662   /// CHECK-NOT:      shrq
663   /// CHECK-NOT:      imulq
664   /// CHECK:          movq
665   /// CHECK:          andq
666   /// CHECK:          jz/eq
667   /// CHECK:          movq
668   /// CHECK:          sarq
669   /// CHECK:          shlq
670   /// CHECK:          orq
$noinline$LongMod2(long v)671   private static Long $noinline$LongMod2(long v) {
672     long r = v % 2;
673     return r;
674   }
675 
676   /// CHECK-START-ARM64: java.lang.Long RemTest.$noinline$LongModMinus2(long) disassembly (after)
677   /// CHECK:                 cmp x{{\d+}}, #0x0
678   /// CHECK-NEXT:            and x{{\d+}}, x{{\d+}}, #0x1
679   /// CHECK-NEXT:            cneg x{{\d+}}, x{{\d+}}, lt
680   //
681   /// CHECK-START-X86_64: java.lang.Long RemTest.$noinline$LongModMinus2(long) disassembly (after)
682   /// CHECK:          Rem [{{j\d+}},{{j\d+}}]
683   /// CHECK-NOT:      imul
684   /// CHECK-NOT:      shrq
685   /// CHECK-NOT:      imulq
686   /// CHECK:          movq
687   /// CHECK:          andq
688   /// CHECK:          jz/eq
689   /// CHECK:          movq
690   /// CHECK:          sarq
691   /// CHECK:          shlq
692   /// CHECK:          orq
$noinline$LongModMinus2(long v)693   private static Long $noinline$LongModMinus2(long v) {
694     long r = v % -2;
695     return r;
696   }
697 
698   /// CHECK-START-ARM64: java.lang.Long RemTest.$noinline$LongAbsMod2(long) disassembly (after)
699   /// CHECK:                 Rem
700   /// CHECK-NEXT:            and x{{\d+}}, x{{\d+}}, #0x1
$noinline$LongAbsMod2(long v)701   private static Long $noinline$LongAbsMod2(long v) {
702     long r = Math.abs(v) % 2;
703     return r;
704   }
705 
706   /// CHECK-START-ARM64: java.lang.Long RemTest.$noinline$LongAbsModMinus2(long) disassembly (after)
707   /// CHECK:                 Rem
708   /// CHECK-NEXT:            and x{{\d+}}, x{{\d+}}, #0x1
$noinline$LongAbsModMinus2(long v)709   private static Long $noinline$LongAbsModMinus2(long v) {
710     long r = Math.abs(v) % -2;
711     return r;
712   }
713 
714   /// CHECK-START-ARM64: java.lang.Long RemTest.$noinline$LongMod16(long) disassembly (after)
715   /// CHECK:                 negs x{{\d+}}, x{{\d+}}
716   /// CHECK-NEXT:            and x{{\d+}}, x{{\d+}}, #0xf
717   /// CHECK-NEXT:            and x{{\d+}}, x{{\d+}}, #0xf
718   /// CHECK-NEXT:            csneg x{{\d+}}, x{{\d+}}, mi
719 
720   /// CHECK-START-X86_64: java.lang.Long RemTest.$noinline$LongMod16(long) disassembly (after)
721   /// CHECK:          Rem [{{j\d+}},{{j\d+}}]
722   /// CHECK-NOT:      imul
723   /// CHECK-NOT:      shrq
724   /// CHECK-NOT:      imulq
725   /// CHECK:          movq
726   /// CHECK:          andq
727   /// CHECK:          jz/eq
728   /// CHECK:          movq
729   /// CHECK:          sarq
730   /// CHECK:          shlq
731   /// CHECK:          orq
$noinline$LongMod16(long v)732   private static Long $noinline$LongMod16(long v) {
733     long r = v % 16;
734     return r;
735   }
736 
737   /// CHECK-START-ARM64: java.lang.Long RemTest.$noinline$LongModMinus16(long) disassembly (after)
738   /// CHECK:                 negs x{{\d+}}, x{{\d+}}
739   /// CHECK-NEXT:            and x{{\d+}}, x{{\d+}}, #0xf
740   /// CHECK-NEXT:            and x{{\d+}}, x{{\d+}}, #0xf
741   /// CHECK-NEXT:            csneg x{{\d+}}, x{{\d+}}, mi
742   //
743   /// CHECK-START-X86_64: java.lang.Long RemTest.$noinline$LongModMinus16(long) disassembly (after)
744   /// CHECK:          Rem [{{j\d+}},{{j\d+}}]
745   /// CHECK-NOT:      imul
746   /// CHECK-NOT:      shrq
747   /// CHECK-NOT:      imulq
748   /// CHECK:          movq
749   /// CHECK:          andq
750   /// CHECK:          jz/eq
751   /// CHECK:          movq
752   /// CHECK:          sarq
753   /// CHECK:          shlq
754   /// CHECK:          orq
$noinline$LongModMinus16(long v)755   private static Long $noinline$LongModMinus16(long v) {
756     long r = v % -16;
757     return r;
758   }
759 
760   /// CHECK-START-ARM64: java.lang.Long RemTest.$noinline$LongAbsMod16(long) disassembly (after)
761   /// CHECK:                 Rem
762   /// CHECK-NEXT:            and x{{\d+}}, x{{\d+}}, #0xf
$noinline$LongAbsMod16(long v)763   private static Long $noinline$LongAbsMod16(long v) {
764     long r = Math.abs(v) % 16;
765     return r;
766   }
767 
768   /// CHECK-START-ARM64: java.lang.Long RemTest.$noinline$LongAbsModMinus16(long) disassembly (after)
769   /// CHECK:                 Rem
770   /// CHECK-NEXT:            and x{{\d+}}, x{{\d+}}, #0xf
$noinline$LongAbsModMinus16(long v)771   private static Long $noinline$LongAbsModMinus16(long v) {
772     long r = Math.abs(v) % -16;
773     return r;
774   }
775 
776   /// CHECK-START-ARM64: java.lang.Long RemTest.$noinline$LongModLongMin(long) disassembly (after)
777   /// CHECK:                 negs x{{\d+}}, x{{\d+}}
778   /// CHECK-NEXT:            and x{{\d+}}, x{{\d+}}, #0x7fffffffffffffff
779   /// CHECK-NEXT:            and x{{\d+}}, x{{\d+}}, #0x7fffffffffffffff
780   /// CHECK-NEXT:            csneg x{{\d+}}, x{{\d+}}, mi
781   //
782   /// CHECK-START-X86_64: java.lang.Long RemTest.$noinline$LongModLongMin(long) disassembly (after)
783   /// CHECK:          Rem [{{j\d+}},{{j\d+}}]
784   /// CHECK-NOT:      imul
785   /// CHECK-NOT:      shrq
786   /// CHECK-NOT:      imulq
787   /// CHECK:          movq
788   /// CHECK:          andq
789   /// CHECK:          jz/eq
790   /// CHECK:          movq
791   /// CHECK:          sarq
792   /// CHECK:          shlq
793   /// CHECK:          orq
$noinline$LongModLongMin(long v)794   private static Long $noinline$LongModLongMin(long v) {
795     long r = v % Long.MIN_VALUE;
796     return r;
797   }
798 
799   /// CHECK-START-ARM64: java.lang.Long RemTest.$noinline$LongAbsModLongMin(long) disassembly (after)
800   /// CHECK:                 Rem
801   /// CHECK-NEXT:            and x{{\d+}}, x{{\d+}}, #0x7fffffffffffffff
$noinline$LongAbsModLongMin(long v)802   private static Long $noinline$LongAbsModLongMin(long v) {
803     long r = Math.abs(v) % Long.MIN_VALUE;
804     return r;
805   }
806 }
807