1 /* 2 * Copyright (C) 2015 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 Main { 18 19 static boolean doThrow = false; 20 21 /// CHECK-START: int Main.BoolCond_IntVarVar(boolean, int, int) register (after) 22 /// CHECK: Select [{{i\d+}},{{i\d+}},{{z\d+}}] 23 24 /// CHECK-START-ARM64: int Main.BoolCond_IntVarVar(boolean, int, int) disassembly (after) 25 /// CHECK: Select 26 /// CHECK-NEXT: cmp 27 /// CHECK-NEXT: csel ne 28 29 /// CHECK-START-X86_64: int Main.BoolCond_IntVarVar(boolean, int, int) disassembly (after) 30 /// CHECK: <<Cond:z\d+>> ParameterValue 31 /// CHECK: Select [{{i\d+}},{{i\d+}},<<Cond>>] 32 /// CHECK: cmovnz/ne 33 34 /// CHECK-START-X86: int Main.BoolCond_IntVarVar(boolean, int, int) disassembly (after) 35 /// CHECK: <<Cond:z\d+>> ParameterValue 36 /// CHECK: Select [{{i\d+}},{{i\d+}},<<Cond>>] 37 /// CHECK: cmovnz/ne 38 39 public static int BoolCond_IntVarVar(boolean cond, int x, int y) { 40 if (doThrow) { 41 // Try defeating inlining. 42 throw new Error(); 43 } 44 return cond ? x : y; 45 } 46 47 /// CHECK-START: int Main.BoolCond_IntVarCst(boolean, int) register (after) 48 /// CHECK: Select [{{i\d+}},{{i\d+}},{{z\d+}}] 49 50 /// CHECK-START-ARM64: int Main.BoolCond_IntVarCst(boolean, int) disassembly (after) 51 /// CHECK: Select 52 /// CHECK-NEXT: cmp 53 /// CHECK-NEXT: csinc ne 54 55 /// CHECK-START-X86_64: int Main.BoolCond_IntVarCst(boolean, int) disassembly (after) 56 /// CHECK: <<Cond:z\d+>> ParameterValue 57 /// CHECK: Select [{{i\d+}},{{i\d+}},<<Cond>>] 58 /// CHECK: cmovnz/ne 59 60 /// CHECK-START-X86: int Main.BoolCond_IntVarCst(boolean, int) disassembly (after) 61 /// CHECK: <<Cond:z\d+>> ParameterValue 62 /// CHECK: Select [{{i\d+}},{{i\d+}},<<Cond>>] 63 /// CHECK: cmovnz/ne 64 65 public static int BoolCond_IntVarCst(boolean cond, int x) { 66 if (doThrow) { 67 // Try defeating inlining. 68 throw new Error(); 69 } 70 return cond ? x : 1; 71 } 72 73 /// CHECK-START: int Main.BoolCond_IntCstVar(boolean, int) register (after) 74 /// CHECK: Select [{{i\d+}},{{i\d+}},{{z\d+}}] 75 76 /// CHECK-START-ARM64: int Main.BoolCond_IntCstVar(boolean, int) disassembly (after) 77 /// CHECK: Select 78 /// CHECK-NEXT: cmp 79 /// CHECK-NEXT: csinc eq 80 81 /// CHECK-START-X86_64: int Main.BoolCond_IntCstVar(boolean, int) disassembly (after) 82 /// CHECK: <<Cond:z\d+>> ParameterValue 83 /// CHECK: Select [{{i\d+}},{{i\d+}},<<Cond>>] 84 /// CHECK: cmovnz/ne 85 86 /// CHECK-START-X86: int Main.BoolCond_IntCstVar(boolean, int) disassembly (after) 87 /// CHECK: <<Cond:z\d+>> ParameterValue 88 /// CHECK: Select [{{i\d+}},{{i\d+}},<<Cond>>] 89 /// CHECK: cmovnz/ne 90 91 public static int BoolCond_IntCstVar(boolean cond, int y) { 92 if (doThrow) { 93 // Try defeating inlining. 94 throw new Error(); 95 } 96 return cond ? 1 : y; 97 } 98 99 /// CHECK-START: long Main.BoolCond_LongVarVar(boolean, long, long) register (after) 100 /// CHECK: Select [{{j\d+}},{{j\d+}},{{z\d+}}] 101 102 /// CHECK-START-ARM64: long Main.BoolCond_LongVarVar(boolean, long, long) disassembly (after) 103 /// CHECK: Select 104 /// CHECK-NEXT: cmp 105 /// CHECK-NEXT: csel ne 106 107 /// CHECK-START-X86_64: long Main.BoolCond_LongVarVar(boolean, long, long) disassembly (after) 108 /// CHECK: <<Cond:z\d+>> ParameterValue 109 /// CHECK: Select [{{j\d+}},{{j\d+}},<<Cond>>] 110 /// CHECK: cmovnz/neq 111 112 /// CHECK-START-X86: long Main.BoolCond_LongVarVar(boolean, long, long) disassembly (after) 113 /// CHECK: <<Cond:z\d+>> ParameterValue 114 /// CHECK: Select [{{j\d+}},{{j\d+}},<<Cond>>] 115 /// CHECK: cmovnz/ne 116 /// CHECK-NEXT: cmovnz/ne 117 118 public static long BoolCond_LongVarVar(boolean cond, long x, long y) { 119 if (doThrow) { 120 // Try defeating inlining. 121 throw new Error(); 122 } 123 return cond ? x : y; 124 } 125 126 /// CHECK-START: long Main.BoolCond_LongVarCst(boolean, long) register (after) 127 /// CHECK: Select [{{j\d+}},{{j\d+}},{{z\d+}}] 128 129 /// CHECK-START-ARM64: long Main.BoolCond_LongVarCst(boolean, long) disassembly (after) 130 /// CHECK: Select 131 /// CHECK-NEXT: cmp 132 /// CHECK-NEXT: csinc ne 133 134 /// CHECK-START-X86_64: long Main.BoolCond_LongVarCst(boolean, long) disassembly (after) 135 /// CHECK: <<Cond:z\d+>> ParameterValue 136 /// CHECK: Select [{{j\d+}},{{j\d+}},<<Cond>>] 137 /// CHECK: cmovnz/neq 138 139 /// CHECK-START-X86: long Main.BoolCond_LongVarCst(boolean, long) disassembly (after) 140 /// CHECK: <<Cond:z\d+>> ParameterValue 141 /// CHECK: Select [{{j\d+}},{{j\d+}},<<Cond>>] 142 /// CHECK: cmovnz/ne 143 /// CHECK-NEXT: cmovnz/ne 144 145 public static long BoolCond_LongVarCst(boolean cond, long x) { 146 if (doThrow) { 147 // Try defeating inlining. 148 throw new Error(); 149 } 150 return cond ? x : 1L; 151 } 152 153 /// CHECK-START: long Main.BoolCond_LongCstVar(boolean, long) register (after) 154 /// CHECK: Select [{{j\d+}},{{j\d+}},{{z\d+}}] 155 156 /// CHECK-START-ARM64: long Main.BoolCond_LongCstVar(boolean, long) disassembly (after) 157 /// CHECK: Select 158 /// CHECK-NEXT: cmp 159 /// CHECK-NEXT: csinc eq 160 161 /// CHECK-START-X86_64: long Main.BoolCond_LongCstVar(boolean, long) disassembly (after) 162 /// CHECK: <<Cond:z\d+>> ParameterValue 163 /// CHECK: Select [{{j\d+}},{{j\d+}},<<Cond>>] 164 /// CHECK: cmovnz/neq 165 166 /// CHECK-START-X86: long Main.BoolCond_LongCstVar(boolean, long) disassembly (after) 167 /// CHECK: <<Cond:z\d+>> ParameterValue 168 /// CHECK: Select [{{j\d+}},{{j\d+}},<<Cond>>] 169 /// CHECK: cmovnz/ne 170 /// CHECK-NEXT: cmovnz/ne 171 172 public static long BoolCond_LongCstVar(boolean cond, long y) { 173 if (doThrow) { 174 // Try defeating inlining. 175 throw new Error(); 176 } 177 return cond ? 1L : y; 178 } 179 180 /// CHECK-START: float Main.BoolCond_FloatVarVar(boolean, float, float) register (after) 181 /// CHECK: Select [{{f\d+}},{{f\d+}},{{z\d+}}] 182 183 /// CHECK-START-ARM64: float Main.BoolCond_FloatVarVar(boolean, float, float) disassembly (after) 184 /// CHECK: Select 185 /// CHECK-NEXT: cmp 186 /// CHECK-NEXT: fcsel ne 187 188 public static float BoolCond_FloatVarVar(boolean cond, float x, float y) { 189 if (doThrow) { 190 // Try defeating inlining. 191 throw new Error(); 192 } 193 return cond ? x : y; 194 } 195 196 /// CHECK-START: float Main.BoolCond_FloatVarCst(boolean, float) register (after) 197 /// CHECK: Select [{{f\d+}},{{f\d+}},{{z\d+}}] 198 199 /// CHECK-START-ARM64: float Main.BoolCond_FloatVarCst(boolean, float) disassembly (after) 200 /// CHECK: Select 201 /// CHECK-NEXT: cmp 202 /// CHECK-NEXT: fcsel ne 203 204 public static float BoolCond_FloatVarCst(boolean cond, float x) { 205 if (doThrow) { 206 // Try defeating inlining. 207 throw new Error(); 208 } 209 return cond ? x : 1.0f; 210 } 211 212 /// CHECK-START: float Main.BoolCond_FloatCstVar(boolean, float) register (after) 213 /// CHECK: Select [{{f\d+}},{{f\d+}},{{z\d+}}] 214 215 /// CHECK-START-ARM64: float Main.BoolCond_FloatCstVar(boolean, float) disassembly (after) 216 /// CHECK: Select 217 /// CHECK-NEXT: cmp 218 /// CHECK-NEXT: fcsel ne 219 220 public static float BoolCond_FloatCstVar(boolean cond, float y) { 221 if (doThrow) { 222 // Try defeating inlining. 223 throw new Error(); 224 } 225 return cond ? 1.0f : y; 226 } 227 228 /// CHECK-START: int Main.IntNonmatCond_IntVarVar(int, int, int, int) register (after) 229 /// CHECK: <<Cond:z\d+>> LessThanOrEqual [{{i\d+}},{{i\d+}}] 230 /// CHECK-NEXT: Select [{{i\d+}},{{i\d+}},<<Cond>>] 231 232 /// CHECK-START-ARM64: int Main.IntNonmatCond_IntVarVar(int, int, int, int) disassembly (after) 233 /// CHECK: Select 234 /// CHECK-NEXT: cmp 235 /// CHECK-NEXT: csel le 236 237 /// CHECK-START-X86_64: int Main.IntNonmatCond_IntVarVar(int, int, int, int) disassembly (after) 238 /// CHECK: <<Cond:z\d+>> LessThanOrEqual [{{i\d+}},{{i\d+}}] 239 /// CHECK-NEXT: Select [{{i\d+}},{{i\d+}},<<Cond>>] 240 /// CHECK: cmovle/ng 241 242 /// CHECK-START-X86: int Main.IntNonmatCond_IntVarVar(int, int, int, int) disassembly (after) 243 /// CHECK: <<Cond:z\d+>> LessThanOrEqual [{{i\d+}},{{i\d+}}] 244 /// CHECK-NEXT: Select [{{i\d+}},{{i\d+}},<<Cond>>] 245 /// CHECK: cmovle/ng 246 247 public static int IntNonmatCond_IntVarVar(int a, int b, int x, int y) { 248 if (doThrow) { 249 // Try defeating inlining. 250 throw new Error(); 251 } 252 return a > b ? x : y; 253 } 254 255 /// CHECK-START: int Main.IntMatCond_IntVarVar(int, int, int, int) register (after) 256 /// CHECK: <<Cond:z\d+>> LessThanOrEqual [{{i\d+}},{{i\d+}}] 257 /// CHECK-NEXT: <<Sel:i\d+>> Select [{{i\d+}},{{i\d+}},{{z\d+}}] 258 /// CHECK-NEXT: Add [<<Cond>>,<<Sel>>] 259 260 /// CHECK-START-ARM64: int Main.IntMatCond_IntVarVar(int, int, int, int) disassembly (after) 261 /// CHECK: LessThanOrEqual 262 /// CHECK-NEXT: cmp 263 /// CHECK-NEXT: cset le 264 /// CHECK: Select 265 /// CHECK-NEXT: csel le 266 267 /// CHECK-START-X86_64: int Main.IntMatCond_IntVarVar(int, int, int, int) disassembly (after) 268 /// CHECK: <<Cond:z\d+>> LessThanOrEqual [{{i\d+}},{{i\d+}}] 269 /// CHECK: Select [{{i\d+}},{{i\d+}},<<Cond>>] 270 /// CHECK: cmovle/ng 271 272 /// CHECK-START-X86: int Main.IntMatCond_IntVarVar(int, int, int, int) disassembly (after) 273 /// CHECK: <<Cond:z\d+>> LessThanOrEqual [{{i\d+}},{{i\d+}}] 274 /// CHECK: Select [{{i\d+}},{{i\d+}},<<Cond>>] 275 /// CHECK: cmovle/ng 276 277 public static int IntMatCond_IntVarVar(int a, int b, int x, int y) { 278 if (doThrow) { 279 // Try defeating inlining. 280 throw new Error(); 281 } 282 int result = (a > b ? x : y); 283 return result + (a > b ? 0 : 1); 284 } 285 286 /// CHECK-START: long Main.IntNonmatCond_LongVarVar(int, int, long, long) register (after) 287 /// CHECK: <<Cond:z\d+>> LessThanOrEqual [{{i\d+}},{{i\d+}}] 288 /// CHECK-NEXT: Select [{{j\d+}},{{j\d+}},<<Cond>>] 289 290 /// CHECK-START-ARM64: long Main.IntNonmatCond_LongVarVar(int, int, long, long) disassembly (after) 291 /// CHECK: Select 292 /// CHECK-NEXT: cmp 293 /// CHECK-NEXT: csel le 294 295 /// CHECK-START-X86_64: long Main.IntNonmatCond_LongVarVar(int, int, long, long) disassembly (after) 296 /// CHECK: <<Cond:z\d+>> LessThanOrEqual [{{i\d+}},{{i\d+}}] 297 /// CHECK-NEXT: Select [{{j\d+}},{{j\d+}},<<Cond>>] 298 /// CHECK: cmovle/ngq 299 300 /// CHECK-START-X86: long Main.IntNonmatCond_LongVarVar(int, int, long, long) disassembly (after) 301 /// CHECK: <<Cond:z\d+>> LessThanOrEqual [{{i\d+}},{{i\d+}}] 302 /// CHECK-NEXT: Select [{{j\d+}},{{j\d+}},<<Cond>>] 303 /// CHECK: cmovle/ng 304 /// CHECK-NEXT: cmovle/ng 305 306 public static long IntNonmatCond_LongVarVar(int a, int b, long x, long y) { 307 if (doThrow) { 308 // Try defeating inlining. 309 throw new Error(); 310 } 311 return a > b ? x : y; 312 } 313 314 /// CHECK-START: long Main.IntMatCond_LongVarVar(int, int, long, long) register (after) 315 /// CHECK: <<Cond:z\d+>> LessThanOrEqual [{{i\d+}},{{i\d+}}] 316 /// CHECK: <<Sel1:j\d+>> Select [{{j\d+}},{{j\d+}},<<Cond>>] 317 /// CHECK: <<Sel2:j\d+>> Select [{{j\d+}},{{j\d+}},<<Cond>>] 318 /// CHECK: Add [<<Sel2>>,<<Sel1>>] 319 320 /// CHECK-START-ARM64: long Main.IntMatCond_LongVarVar(int, int, long, long) disassembly (after) 321 /// CHECK: LessThanOrEqual 322 /// CHECK-NEXT: cmp 323 /// CHECK-NEXT: cset le 324 /// CHECK: Select 325 /// CHECK-NEXT: csel le 326 327 /// CHECK-START-X86_64: long Main.IntMatCond_LongVarVar(int, int, long, long) disassembly (after) 328 /// CHECK: <<Cond:z\d+>> LessThanOrEqual [{{i\d+}},{{i\d+}}] 329 /// CHECK: Select [{{j\d+}},{{j\d+}},<<Cond>>] 330 /// CHECK: cmovle/ngq 331 /// CHECK: Select [{{j\d+}},{{j\d+}},<<Cond>>] 332 /// CHECK: cmovnz/neq 333 334 /// CHECK-START-X86: long Main.IntMatCond_LongVarVar(int, int, long, long) disassembly (after) 335 /// CHECK: <<Cond:z\d+>> LessThanOrEqual [{{i\d+}},{{i\d+}}] 336 /// CHECK: Select [{{j\d+}},{{j\d+}},<<Cond>>] 337 /// CHECK-NEXT: cmovle/ng 338 /// CHECK-NEXT: cmovle/ng 339 /// CHECK: Select [{{j\d+}},{{j\d+}},<<Cond>>] 340 /// CHECK: cmovnz/ne 341 /// CHECK-NEXT: cmovnz/ne 342 343 public static long IntMatCond_LongVarVar(int a, int b, long x, long y) { 344 if (doThrow) { 345 // Try defeating inlining. 346 throw new Error(); 347 } 348 long result = (a > b ? x : y); 349 return result + (a > b ? 0L : 1L); 350 } 351 352 /// CHECK-START: long Main.LongNonmatCond_LongVarVar(long, long, long, long) register (after) 353 /// CHECK: <<Cond:z\d+>> LessThanOrEqual [{{j\d+}},{{j\d+}}] 354 /// CHECK: Select [{{j\d+}},{{j\d+}},<<Cond>>] 355 356 /// CHECK-START-ARM64: long Main.LongNonmatCond_LongVarVar(long, long, long, long) disassembly (after) 357 /// CHECK: Select 358 /// CHECK-NEXT: cmp 359 /// CHECK-NEXT: csel le 360 361 /// CHECK-START-X86_64: long Main.LongNonmatCond_LongVarVar(long, long, long, long) disassembly (after) 362 /// CHECK: <<Cond:z\d+>> LessThanOrEqual [{{j\d+}},{{j\d+}}] 363 /// CHECK: Select [{{j\d+}},{{j\d+}},<<Cond>>] 364 /// CHECK: cmovle/ngq 365 366 public static long LongNonmatCond_LongVarVar(long a, long b, long x, long y) { 367 if (doThrow) { 368 // Try defeating inlining. 369 throw new Error(); 370 } 371 return a > b ? x : y; 372 } 373 374 /// CHECK-START-ARM: long Main.$noinline$LongEqNonmatCond_LongVarVar(long, long, long, long) disassembly (after) 375 /// CHECK: Select 376 /// CHECK-NEXT: cmp {{r\d+}}, {{r\d+}} 377 /// CHECK-NEXT: it eq 378 /// CHECK-NEXT: cmpeq {{r\d+}}, {{r\d+}} 379 /// CHECK-NEXT: it eq 380 381 public static long $noinline$LongEqNonmatCond_LongVarVar(long a, long b, long x, long y) { 382 return a == b ? x : y; 383 } 384 385 /// CHECK-START-ARM: long Main.$noinline$LongNonmatCondCst_LongVarVar(long, long, long) disassembly (after) 386 /// CHECK: Select 387 /// CHECK-NEXT: mov ip, #52720 388 /// CHECK-NEXT: movt ip, #35243 389 /// CHECK-NEXT: cmp {{r\d+}}, ip 390 /// CHECK-NEXT: sbcs ip, {{r\d+}}, #{{\d+}} 391 /// CHECK-NEXT: it ge 392 393 public static long $noinline$LongNonmatCondCst_LongVarVar(long a, long x, long y) { 394 return a > 0x89ABCDEFL ? x : y; 395 } 396 397 /// CHECK-START-ARM: long Main.$noinline$LongNonmatCondCst_LongVarVar2(long, long, long) disassembly (after) 398 /// CHECK: Select 399 /// CHECK-NEXT: mov ip, #{{\d+}} 400 /// CHECK-NEXT: movt ip, #{{\d+}} 401 /// CHECK-NEXT: cmp {{r\d+}}, ip 402 403 public static long $noinline$LongNonmatCondCst_LongVarVar2(long a, long x, long y) { 404 return a > 0x0123456789ABCDEFL ? x : y; 405 } 406 407 /// CHECK-START-ARM: long Main.$noinline$LongNonmatCondCst_LongVarVar3(long, long, long) disassembly (after) 408 /// CHECK: Select 409 /// CHECK-NEXT: cmp {{r\d+}}, {{r\d+}} 410 /// CHECK-NOT: sbcs 411 /// CHECK-NOT: cmp 412 413 public static long $noinline$LongNonmatCondCst_LongVarVar3(long a, long x, long y) { 414 return a > 0x7FFFFFFFFFFFFFFFL ? x : y; 415 } 416 417 /// CHECK-START-ARM: long Main.$noinline$LongNonmatCondCst_LongVarVar4(long, long, long) disassembly (after) 418 /// CHECK: Select 419 /// CHECK-NEXT: orrs ip, {{r\d+}}, {{r\d+}} 420 /// CHECK-NOT: cmp 421 /// CHECK-NOT: sbcs 422 423 public static long $noinline$LongNonmatCondCst_LongVarVar4(long a, long x, long y) { 424 return a == 0 ? x : y; 425 } 426 427 /// CHECK-START-ARM: long Main.$noinline$LongNonmatCondCst_LongVarVar5(long, long, long) disassembly (after) 428 /// CHECK: Select 429 /// CHECK-NEXT: orrs ip, {{r\d+}}, {{r\d+}} 430 /// CHECK-NOT: cmp 431 /// CHECK-NOT: sbcs 432 433 public static long $noinline$LongNonmatCondCst_LongVarVar5(long a, long x, long y) { 434 return a != 0 ? x : y; 435 } 436 437 /// CHECK-START-ARM: long Main.$noinline$LongNonmatCondCst_LongVarVar6(long, long, long) disassembly (after) 438 /// CHECK: Select 439 /// CHECK-NEXT: cmp {{r\d+}}, #0 440 /// CHECK-NOT: cmp 441 /// CHECK-NOT: sbcs 442 443 public static long $noinline$LongNonmatCondCst_LongVarVar6(long a, long x, long y) { 444 return a >= 0 ? x : y; 445 } 446 447 /// CHECK-START-ARM: long Main.$noinline$LongNonmatCondCst_LongVarVar7(long, long, long) disassembly (after) 448 /// CHECK: Select 449 /// CHECK-NEXT: cmp {{r\d+}}, #0 450 /// CHECK-NOT: cmp 451 /// CHECK-NOT: sbcs 452 453 public static long $noinline$LongNonmatCondCst_LongVarVar7(long a, long x, long y) { 454 return a < 0 ? x : y; 455 } 456 457 /// CHECK-START: long Main.LongMatCond_LongVarVar(long, long, long, long) register (after) 458 /// CHECK: <<Cond:z\d+>> LessThanOrEqual [{{j\d+}},{{j\d+}}] 459 /// CHECK: <<Sel1:j\d+>> Select [{{j\d+}},{{j\d+}},<<Cond>>] 460 /// CHECK: <<Sel2:j\d+>> Select [{{j\d+}},{{j\d+}},<<Cond>>] 461 /// CHECK: Add [<<Sel2>>,<<Sel1>>] 462 463 /// CHECK-START-ARM64: long Main.LongMatCond_LongVarVar(long, long, long, long) disassembly (after) 464 /// CHECK: LessThanOrEqual 465 /// CHECK-NEXT: cmp 466 /// CHECK-NEXT: cset le 467 /// CHECK: Select 468 /// CHECK-NEXT: csel le 469 470 /// CHECK-START-X86_64: long Main.LongMatCond_LongVarVar(long, long, long, long) disassembly (after) 471 /// CHECK: <<Cond:z\d+>> LessThanOrEqual [{{j\d+}},{{j\d+}}] 472 /// CHECK: Select [{{j\d+}},{{j\d+}},<<Cond>>] 473 /// CHECK: cmovle/ngq 474 /// CHECK: Select [{{j\d+}},{{j\d+}},<<Cond>>] 475 /// CHECK: cmovnz/neq 476 477 public static long LongMatCond_LongVarVar(long a, long b, long x, long y) { 478 if (doThrow) { 479 // Try defeating inlining. 480 throw new Error(); 481 } 482 long result = (a > b ? x : y); 483 return result + (a > b ? 0L : 1L); 484 } 485 486 /// CHECK-START: int Main.FloatLtNonmatCond_IntVarVar(float, float, int, int) register (after) 487 /// CHECK: <<Cond:z\d+>> LessThanOrEqual [{{f\d+}},{{f\d+}}] 488 /// CHECK-NEXT: Select [{{i\d+}},{{i\d+}},<<Cond>>] 489 490 /// CHECK-START-ARM64: int Main.FloatLtNonmatCond_IntVarVar(float, float, int, int) disassembly (after) 491 /// CHECK: LessThanOrEqual 492 /// CHECK: Select 493 /// CHECK-NEXT: fcmp 494 /// CHECK-NEXT: csel le 495 496 public static int FloatLtNonmatCond_IntVarVar(float a, float b, int x, int y) { 497 if (doThrow) { 498 // Try defeating inlining. 499 throw new Error(); 500 } 501 return a > b ? x : y; 502 } 503 504 /// CHECK-START: int Main.FloatGtNonmatCond_IntVarVar(float, float, int, int) register (after) 505 /// CHECK: <<Cond:z\d+>> GreaterThanOrEqual [{{f\d+}},{{f\d+}}] 506 /// CHECK-NEXT: Select [{{i\d+}},{{i\d+}},<<Cond>>] 507 508 /// CHECK-START-ARM64: int Main.FloatGtNonmatCond_IntVarVar(float, float, int, int) disassembly (after) 509 /// CHECK: GreaterThanOrEqual 510 /// CHECK: Select 511 /// CHECK-NEXT: fcmp 512 /// CHECK-NEXT: csel hs 513 514 public static int FloatGtNonmatCond_IntVarVar(float a, float b, int x, int y) { 515 if (doThrow) { 516 // Try defeating inlining. 517 throw new Error(); 518 } 519 return a < b ? x : y; 520 } 521 522 /// CHECK-START: float Main.FloatGtNonmatCond_FloatVarVar(float, float, float, float) register (after) 523 /// CHECK: <<Cond:z\d+>> GreaterThanOrEqual [{{f\d+}},{{f\d+}}] 524 /// CHECK-NEXT: Select [{{f\d+}},{{f\d+}},<<Cond>>] 525 526 /// CHECK-START-ARM64: float Main.FloatGtNonmatCond_FloatVarVar(float, float, float, float) disassembly (after) 527 /// CHECK: GreaterThanOrEqual 528 /// CHECK: Select 529 /// CHECK-NEXT: fcmp 530 /// CHECK-NEXT: fcsel hs 531 532 public static float FloatGtNonmatCond_FloatVarVar(float a, float b, float x, float y) { 533 if (doThrow) { 534 // Try defeating inlining. 535 throw new Error(); 536 } 537 return a < b ? x : y; 538 } 539 540 /// CHECK-START: int Main.FloatLtMatCond_IntVarVar(float, float, int, int) register (after) 541 /// CHECK: <<Cond:z\d+>> LessThanOrEqual [{{f\d+}},{{f\d+}}] 542 /// CHECK-NEXT: <<Sel:i\d+>> Select [{{i\d+}},{{i\d+}},<<Cond>>] 543 /// CHECK-NEXT: Add [<<Cond>>,<<Sel>>] 544 545 /// CHECK-START-ARM64: int Main.FloatLtMatCond_IntVarVar(float, float, int, int) disassembly (after) 546 /// CHECK: LessThanOrEqual 547 /// CHECK-NEXT: fcmp 548 /// CHECK-NEXT: cset le 549 /// CHECK: Select 550 /// CHECK-NEXT: csel le 551 552 public static int FloatLtMatCond_IntVarVar(float a, float b, int x, int y) { 553 if (doThrow) { 554 // Try defeating inlining. 555 throw new Error(); 556 } 557 int result = (a > b ? x : y); 558 return result + (a > b ? 0 : 1); 559 } 560 561 /// CHECK-START: int Main.FloatGtMatCond_IntVarVar(float, float, int, int) register (after) 562 /// CHECK: <<Cond:z\d+>> GreaterThanOrEqual [{{f\d+}},{{f\d+}}] 563 /// CHECK-NEXT: <<Sel:i\d+>> Select [{{i\d+}},{{i\d+}},<<Cond>>] 564 /// CHECK-NEXT: Add [<<Cond>>,<<Sel>>] 565 566 /// CHECK-START-ARM64: int Main.FloatGtMatCond_IntVarVar(float, float, int, int) disassembly (after) 567 /// CHECK: GreaterThanOrEqual 568 /// CHECK-NEXT: fcmp 569 /// CHECK-NEXT: cset hs 570 /// CHECK: Select 571 /// CHECK-NEXT: csel hs 572 573 public static int FloatGtMatCond_IntVarVar(float a, float b, int x, int y) { 574 if (doThrow) { 575 // Try defeating inlining. 576 throw new Error(); 577 } 578 int result = (a < b ? x : y); 579 return result + (a < b ? 0 : 1); 580 } 581 582 /// CHECK-START: float Main.FloatGtMatCond_FloatVarVar(float, float, float, float) register (after) 583 /// CHECK: <<Cond:z\d+>> GreaterThanOrEqual 584 /// CHECK-NEXT: <<Sel:f\d+>> Select [{{f\d+}},{{f\d+}},<<Cond>>] 585 /// CHECK-NEXT: TypeConversion [<<Cond>>] 586 587 /// CHECK-START-ARM64: float Main.FloatGtMatCond_FloatVarVar(float, float, float, float) disassembly (after) 588 /// CHECK: GreaterThanOrEqual 589 /// CHECK-NEXT: fcmp 590 /// CHECK-NEXT: cset hs 591 /// CHECK: Select 592 /// CHECK-NEXT: fcsel hs 593 594 public static float FloatGtMatCond_FloatVarVar(float a, float b, float x, float y) { 595 if (doThrow) { 596 // Try defeating inlining. 597 throw new Error(); 598 } 599 float result = (a < b ? x : y); 600 return result + (a < b ? 0 : 1); 601 } 602 603 /// CHECK-START: int Main.BoolCond_0_m1(boolean) register (after) 604 /// CHECK: <<Cond:z\d+>> ParameterValue 605 /// CHECK: Select [{{i\d+}},{{i\d+}},<<Cond>>] 606 607 /// CHECK-START-ARM64: int Main.BoolCond_0_m1(boolean) disassembly (after) 608 /// CHECK: <<Cond:z\d+>> ParameterValue 609 /// CHECK: Select [{{i\d+}},{{i\d+}},<<Cond>>] 610 /// CHECK-NEXT: cmp {{w\d+}}, #0x0 (0) 611 /// CHECK-NEXT: csetm {{w\d+}}, eq 612 613 /// CHECK-START-X86_64: int Main.BoolCond_0_m1(boolean) disassembly (after) 614 /// CHECK: <<Cond:z\d+>> ParameterValue 615 /// CHECK: Select [{{i\d+}},{{i\d+}},<<Cond>>] 616 /// CHECK: cmovnz/ne 617 618 /// CHECK-START-X86: int Main.BoolCond_0_m1(boolean) disassembly (after) 619 /// CHECK: <<Cond:z\d+>> ParameterValue 620 /// CHECK: Select [{{i\d+}},{{i\d+}},<<Cond>>] 621 /// CHECK: cmovnz/ne 622 623 public static int BoolCond_0_m1(boolean cond) { 624 if (doThrow) { 625 // Try defeating inlining. 626 throw new Error(); 627 } 628 return cond ? 0 : -1; 629 } 630 631 /// CHECK-START: int Main.BoolCond_m1_0(boolean) register (after) 632 /// CHECK: <<Cond:z\d+>> ParameterValue 633 /// CHECK: Select [{{i\d+}},{{i\d+}},<<Cond>>] 634 635 /// CHECK-START-ARM64: int Main.BoolCond_m1_0(boolean) disassembly (after) 636 /// CHECK: <<Cond:z\d+>> ParameterValue 637 /// CHECK: Select [{{i\d+}},{{i\d+}},<<Cond>>] 638 /// CHECK-NEXT: cmp {{w\d+}}, #0x0 (0) 639 /// CHECK-NEXT: csetm {{w\d+}}, ne 640 641 /// CHECK-START-X86_64: int Main.BoolCond_m1_0(boolean) disassembly (after) 642 /// CHECK: <<Cond:z\d+>> ParameterValue 643 /// CHECK: Select [{{i\d+}},{{i\d+}},<<Cond>>] 644 /// CHECK: cmovnz/ne 645 646 /// CHECK-START-X86: int Main.BoolCond_m1_0(boolean) disassembly (after) 647 /// CHECK: <<Cond:z\d+>> ParameterValue 648 /// CHECK: Select [{{i\d+}},{{i\d+}},<<Cond>>] 649 /// CHECK: cmovnz/ne 650 651 public static int BoolCond_m1_0(boolean cond) { 652 if (doThrow) { 653 // Try defeating inlining. 654 throw new Error(); 655 } 656 return cond ? -1 : 0; 657 } 658 659 public static void assertEqual(int expected, int actual) { 660 if (expected != actual) { 661 throw new Error("Assertion failed: " + expected + " != " + actual); 662 } 663 } 664 665 public static void assertEqual(float expected, float actual) { 666 if (expected != actual) { 667 throw new Error("Assertion failed: " + expected + " != " + actual); 668 } 669 } 670 671 public static void main(String[] args) { 672 assertEqual(5, BoolCond_IntVarVar(true, 5, 7)); 673 assertEqual(7, BoolCond_IntVarVar(false, 5, 7)); 674 assertEqual(5, BoolCond_IntVarCst(true, 5)); 675 assertEqual(1, BoolCond_IntVarCst(false, 5)); 676 assertEqual(1, BoolCond_IntCstVar(true, 7)); 677 assertEqual(7, BoolCond_IntCstVar(false, 7)); 678 679 assertEqual(5L, BoolCond_LongVarVar(true, 5L, 7L)); 680 assertEqual(7L, BoolCond_LongVarVar(false, 5L, 7L)); 681 assertEqual(5L, BoolCond_LongVarCst(true, 5L)); 682 assertEqual(1L, BoolCond_LongVarCst(false, 5L)); 683 assertEqual(1L, BoolCond_LongCstVar(true, 7L)); 684 assertEqual(7L, BoolCond_LongCstVar(false, 7L)); 685 686 assertEqual(5, BoolCond_FloatVarVar(true, 5, 7)); 687 assertEqual(7, BoolCond_FloatVarVar(false, 5, 7)); 688 assertEqual(5, BoolCond_FloatVarCst(true, 5)); 689 assertEqual(1, BoolCond_FloatVarCst(false, 5)); 690 assertEqual(1, BoolCond_FloatCstVar(true, 7)); 691 assertEqual(7, BoolCond_FloatCstVar(false, 7)); 692 693 assertEqual(5, IntNonmatCond_IntVarVar(3, 2, 5, 7)); 694 assertEqual(7, IntNonmatCond_IntVarVar(2, 3, 5, 7)); 695 assertEqual(5, IntMatCond_IntVarVar(3, 2, 5, 7)); 696 assertEqual(8, IntMatCond_IntVarVar(2, 3, 5, 7)); 697 698 assertEqual(0xAAAAAAAA55555555L, 699 LongNonmatCond_LongVarVar(3L, 2L, 0xAAAAAAAA55555555L, 0x8888888877777777L)); 700 assertEqual(0x8888888877777777L, 701 LongNonmatCond_LongVarVar(2L, 2L, 0xAAAAAAAA55555555L, 0x8888888877777777L)); 702 assertEqual(0x8888888877777777L, 703 LongNonmatCond_LongVarVar(2L, 3L, 0xAAAAAAAA55555555L, 0x8888888877777777L)); 704 assertEqual(0xAAAAAAAA55555555L, LongNonmatCond_LongVarVar(0x0000000100000000L, 705 0x00000000FFFFFFFFL, 706 0xAAAAAAAA55555555L, 707 0x8888888877777777L)); 708 assertEqual(0x8888888877777777L, LongNonmatCond_LongVarVar(0x00000000FFFFFFFFL, 709 0x0000000100000000L, 710 0xAAAAAAAA55555555L, 711 0x8888888877777777L)); 712 713 assertEqual(0x8888888877777777L, $noinline$LongEqNonmatCond_LongVarVar(2L, 714 3L, 715 0xAAAAAAAA55555555L, 716 0x8888888877777777L)); 717 assertEqual(0xAAAAAAAA55555555L, $noinline$LongEqNonmatCond_LongVarVar(2L, 718 2L, 719 0xAAAAAAAA55555555L, 720 0x8888888877777777L)); 721 assertEqual(0x8888888877777777L, $noinline$LongEqNonmatCond_LongVarVar(0x10000000000L, 722 0L, 723 0xAAAAAAAA55555555L, 724 0x8888888877777777L)); 725 726 assertEqual(5L, $noinline$LongNonmatCondCst_LongVarVar2(0x7FFFFFFFFFFFFFFFL, 5L, 7L)); 727 assertEqual(7L, $noinline$LongNonmatCondCst_LongVarVar2(2L, 5L, 7L)); 728 729 assertEqual(7L, $noinline$LongNonmatCondCst_LongVarVar3(2L, 5L, 7L)); 730 731 long[] long_inputs = { 732 0L, 1L, -1L, Long.MIN_VALUE, Long.MAX_VALUE, 2L, 0x100000000L, 0xFFFFFFFF00000000L, -9000L}; 733 734 long[] expected_1 = {5L, 7L, 7L, 7L, 7L, 7L, 7L, 7L, 7L}; 735 736 for (int i = 0; i < long_inputs.length; i++) { 737 assertEqual(expected_1[i], $noinline$LongNonmatCondCst_LongVarVar4(long_inputs[i], 5L, 7L)); 738 } 739 740 long[] expected_2 = {7L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L}; 741 742 for (int i = 0; i < long_inputs.length; i++) { 743 assertEqual(expected_2[i], $noinline$LongNonmatCondCst_LongVarVar5(long_inputs[i], 5L, 7L)); 744 } 745 746 long[] expected_3 = {5L, 5L, 7L, 7L, 5L, 5L, 5L, 7L, 7L}; 747 748 for (int i = 0; i < long_inputs.length; i++) { 749 assertEqual(expected_3[i], $noinline$LongNonmatCondCst_LongVarVar6(long_inputs[i], 5L, 7L)); 750 } 751 752 long[] expected_4 = {7L, 7L, 5L, 5L, 7L, 7L, 7L, 5L, 5L}; 753 754 for (int i = 0; i < long_inputs.length; i++) { 755 assertEqual(expected_4[i], $noinline$LongNonmatCondCst_LongVarVar7(long_inputs[i], 5L, 7L)); 756 } 757 758 assertEqual(7L, $noinline$LongNonmatCondCst_LongVarVar7(0L, 5L, 7L)); 759 assertEqual(7L, $noinline$LongNonmatCondCst_LongVarVar7(2L, 5L, 7L)); 760 assertEqual(5L, $noinline$LongNonmatCondCst_LongVarVar7(-9000L, 5L, 7L)); 761 762 assertEqual(5, FloatLtNonmatCond_IntVarVar(3, 2, 5, 7)); 763 assertEqual(7, FloatLtNonmatCond_IntVarVar(2, 3, 5, 7)); 764 assertEqual(7, FloatLtNonmatCond_IntVarVar(Float.NaN, 2, 5, 7)); 765 assertEqual(7, FloatLtNonmatCond_IntVarVar(2, Float.NaN, 5, 7)); 766 767 assertEqual(5, FloatGtNonmatCond_IntVarVar(2, 3, 5, 7)); 768 assertEqual(7, FloatGtNonmatCond_IntVarVar(3, 2, 5, 7)); 769 assertEqual(7, FloatGtNonmatCond_IntVarVar(Float.NaN, 2, 5, 7)); 770 assertEqual(7, FloatGtNonmatCond_IntVarVar(2, Float.NaN, 5, 7)); 771 772 assertEqual(5, FloatGtNonmatCond_FloatVarVar(2, 3, 5, 7)); 773 assertEqual(7, FloatGtNonmatCond_FloatVarVar(3, 2, 5, 7)); 774 assertEqual(7, FloatGtNonmatCond_FloatVarVar(Float.NaN, 2, 5, 7)); 775 assertEqual(7, FloatGtNonmatCond_FloatVarVar(2, Float.NaN, 5, 7)); 776 777 assertEqual(5, FloatLtMatCond_IntVarVar(3, 2, 5, 7)); 778 assertEqual(8, FloatLtMatCond_IntVarVar(2, 3, 5, 7)); 779 assertEqual(8, FloatLtMatCond_IntVarVar(Float.NaN, 2, 5, 7)); 780 assertEqual(8, FloatLtMatCond_IntVarVar(2, Float.NaN, 5, 7)); 781 782 assertEqual(5, FloatGtMatCond_IntVarVar(2, 3, 5, 7)); 783 assertEqual(8, FloatGtMatCond_IntVarVar(3, 2, 5, 7)); 784 assertEqual(8, FloatGtMatCond_IntVarVar(Float.NaN, 2, 5, 7)); 785 assertEqual(8, FloatGtMatCond_IntVarVar(2, Float.NaN, 5, 7)); 786 787 assertEqual(5, FloatGtMatCond_FloatVarVar(2, 3, 5, 7)); 788 assertEqual(8, FloatGtMatCond_FloatVarVar(3, 2, 5, 7)); 789 assertEqual(8, FloatGtMatCond_FloatVarVar(Float.NaN, 2, 5, 7)); 790 assertEqual(8, FloatGtMatCond_FloatVarVar(2, Float.NaN, 5, 7)); 791 792 assertEqual(0, BoolCond_0_m1(true)); 793 assertEqual(-1, BoolCond_0_m1(false)); 794 assertEqual(-1, BoolCond_m1_0(true)); 795 assertEqual(0, BoolCond_m1_0(false)); 796 } 797 } 798