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