1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2; RUN: llc -O2 < %s -mtriple=aarch64-linux-gnu | FileCheck %s 3 4declare i32 @bcmp(ptr, ptr, i64) 5 6define i1 @bcmp0(ptr %a, ptr %b) { 7; CHECK-LABEL: bcmp0: 8; CHECK: // %bb.0: 9; CHECK-NEXT: mov w0, #1 // =0x1 10; CHECK-NEXT: ret 11 %cr = call i32 @bcmp(ptr %a, ptr %b, i64 0) 12 %r = icmp eq i32 %cr, 0 13 ret i1 %r 14} 15 16define i1 @bcmp1(ptr %a, ptr %b) { 17; CHECK-LABEL: bcmp1: 18; CHECK: // %bb.0: 19; CHECK-NEXT: ldrb w8, [x0] 20; CHECK-NEXT: ldrb w9, [x1] 21; CHECK-NEXT: cmp w8, w9 22; CHECK-NEXT: cset w0, eq 23; CHECK-NEXT: ret 24 %cr = call i32 @bcmp(ptr %a, ptr %b, i64 1) 25 %r = icmp eq i32 %cr, 0 26 ret i1 %r 27} 28 29define i1 @bcmp2(ptr %a, ptr %b) { 30; CHECK-LABEL: bcmp2: 31; CHECK: // %bb.0: 32; CHECK-NEXT: ldrh w8, [x0] 33; CHECK-NEXT: ldrh w9, [x1] 34; CHECK-NEXT: cmp w8, w9 35; CHECK-NEXT: cset w0, eq 36; CHECK-NEXT: ret 37 %cr = call i32 @bcmp(ptr %a, ptr %b, i64 2) 38 %r = icmp eq i32 %cr, 0 39 ret i1 %r 40} 41 42; or (and (xor a, b), C1), (and (xor c, d), C2) 43define i1 @bcmp3(ptr %a, ptr %b) { 44; CHECK-LABEL: bcmp3: 45; CHECK: // %bb.0: 46; CHECK-NEXT: ldrh w8, [x0] 47; CHECK-NEXT: ldrh w9, [x1] 48; CHECK-NEXT: ldrb w10, [x0, #2] 49; CHECK-NEXT: ldrb w11, [x1, #2] 50; CHECK-NEXT: cmp w8, w9 51; CHECK-NEXT: ccmp w10, w11, #0, eq 52; CHECK-NEXT: cset w0, eq 53; CHECK-NEXT: ret 54 %cr = call i32 @bcmp(ptr %a, ptr %b, i64 3) 55 %r = icmp eq i32 %cr, 0 56 ret i1 %r 57} 58 59define i1 @bcmp4(ptr %a, ptr %b) { 60; CHECK-LABEL: bcmp4: 61; CHECK: // %bb.0: 62; CHECK-NEXT: ldr w8, [x0] 63; CHECK-NEXT: ldr w9, [x1] 64; CHECK-NEXT: cmp w8, w9 65; CHECK-NEXT: cset w0, eq 66; CHECK-NEXT: ret 67 %cr = call i32 @bcmp(ptr %a, ptr %b, i64 4) 68 %r = icmp eq i32 %cr, 0 69 ret i1 %r 70} 71 72; or (xor a, b), (and (xor c, d), C2) 73define i1 @bcmp5(ptr %a, ptr %b) { 74; CHECK-LABEL: bcmp5: 75; CHECK: // %bb.0: 76; CHECK-NEXT: ldr w8, [x0] 77; CHECK-NEXT: ldr w9, [x1] 78; CHECK-NEXT: ldrb w10, [x0, #4] 79; CHECK-NEXT: ldrb w11, [x1, #4] 80; CHECK-NEXT: cmp w8, w9 81; CHECK-NEXT: ccmp w10, w11, #0, eq 82; CHECK-NEXT: cset w0, eq 83; CHECK-NEXT: ret 84 %cr = call i32 @bcmp(ptr %a, ptr %b, i64 5) 85 %r = icmp eq i32 %cr, 0 86 ret i1 %r 87} 88 89; or (xor a, b), (and (xor c, d), C2) 90define i1 @bcmp6(ptr %a, ptr %b) { 91; CHECK-LABEL: bcmp6: 92; CHECK: // %bb.0: 93; CHECK-NEXT: ldr w8, [x0] 94; CHECK-NEXT: ldr w9, [x1] 95; CHECK-NEXT: ldrh w10, [x0, #4] 96; CHECK-NEXT: ldrh w11, [x1, #4] 97; CHECK-NEXT: cmp w8, w9 98; CHECK-NEXT: ccmp w10, w11, #0, eq 99; CHECK-NEXT: cset w0, eq 100; CHECK-NEXT: ret 101 %cr = call i32 @bcmp(ptr %a, ptr %b, i64 6) 102 %r = icmp eq i32 %cr, 0 103 ret i1 %r 104} 105 106; or (xor a, b), (xor c, d) 107define i1 @bcmp7(ptr %a, ptr %b) { 108; CHECK-LABEL: bcmp7: 109; CHECK: // %bb.0: 110; CHECK-NEXT: ldr w8, [x0] 111; CHECK-NEXT: ldr w9, [x1] 112; CHECK-NEXT: ldur w10, [x0, #3] 113; CHECK-NEXT: ldur w11, [x1, #3] 114; CHECK-NEXT: cmp w8, w9 115; CHECK-NEXT: ccmp w10, w11, #0, eq 116; CHECK-NEXT: cset w0, eq 117; CHECK-NEXT: ret 118 %cr = call i32 @bcmp(ptr %a, ptr %b, i64 7) 119 %r = icmp eq i32 %cr, 0 120 ret i1 %r 121} 122 123define i1 @bcmp8(ptr %a, ptr %b) { 124; CHECK-LABEL: bcmp8: 125; CHECK: // %bb.0: 126; CHECK-NEXT: ldr x8, [x0] 127; CHECK-NEXT: ldr x9, [x1] 128; CHECK-NEXT: cmp x8, x9 129; CHECK-NEXT: cset w0, eq 130; CHECK-NEXT: ret 131 %cr = call i32 @bcmp(ptr %a, ptr %b, i64 8) 132 %r = icmp eq i32 %cr, 0 133 ret i1 %r 134} 135 136; or (xor a, b), (and (xor c, d), C2) 137define i1 @bcmp9(ptr %a, ptr %b) { 138; CHECK-LABEL: bcmp9: 139; CHECK: // %bb.0: 140; CHECK-NEXT: ldr x8, [x0] 141; CHECK-NEXT: ldr x9, [x1] 142; CHECK-NEXT: ldrb w10, [x0, #8] 143; CHECK-NEXT: ldrb w11, [x1, #8] 144; CHECK-NEXT: cmp x8, x9 145; CHECK-NEXT: ccmp x10, x11, #0, eq 146; CHECK-NEXT: cset w0, eq 147; CHECK-NEXT: ret 148 %cr = call i32 @bcmp(ptr %a, ptr %b, i64 9) 149 %r = icmp eq i32 %cr, 0 150 ret i1 %r 151} 152 153define i1 @bcmp10(ptr %a, ptr %b) { 154; CHECK-LABEL: bcmp10: 155; CHECK: // %bb.0: 156; CHECK-NEXT: ldr x8, [x0] 157; CHECK-NEXT: ldr x9, [x1] 158; CHECK-NEXT: ldrh w10, [x0, #8] 159; CHECK-NEXT: ldrh w11, [x1, #8] 160; CHECK-NEXT: cmp x8, x9 161; CHECK-NEXT: ccmp x10, x11, #0, eq 162; CHECK-NEXT: cset w0, eq 163; CHECK-NEXT: ret 164 %cr = call i32 @bcmp(ptr %a, ptr %b, i64 10) 165 %r = icmp eq i32 %cr, 0 166 ret i1 %r 167} 168 169define i1 @bcmp11(ptr %a, ptr %b) { 170; CHECK-LABEL: bcmp11: 171; CHECK: // %bb.0: 172; CHECK-NEXT: ldr x8, [x0] 173; CHECK-NEXT: ldr x9, [x1] 174; CHECK-NEXT: ldur x10, [x0, #3] 175; CHECK-NEXT: ldur x11, [x1, #3] 176; CHECK-NEXT: cmp x8, x9 177; CHECK-NEXT: ccmp x10, x11, #0, eq 178; CHECK-NEXT: cset w0, eq 179; CHECK-NEXT: ret 180 %cr = call i32 @bcmp(ptr %a, ptr %b, i64 11) 181 %r = icmp eq i32 %cr, 0 182 ret i1 %r 183} 184 185define i1 @bcmp12(ptr %a, ptr %b) { 186; CHECK-LABEL: bcmp12: 187; CHECK: // %bb.0: 188; CHECK-NEXT: ldr x8, [x0] 189; CHECK-NEXT: ldr x9, [x1] 190; CHECK-NEXT: ldr w10, [x0, #8] 191; CHECK-NEXT: ldr w11, [x1, #8] 192; CHECK-NEXT: cmp x8, x9 193; CHECK-NEXT: ccmp x10, x11, #0, eq 194; CHECK-NEXT: cset w0, eq 195; CHECK-NEXT: ret 196 %cr = call i32 @bcmp(ptr %a, ptr %b, i64 12) 197 %r = icmp eq i32 %cr, 0 198 ret i1 %r 199} 200 201define i1 @bcmp13(ptr %a, ptr %b) { 202; CHECK-LABEL: bcmp13: 203; CHECK: // %bb.0: 204; CHECK-NEXT: ldr x8, [x0] 205; CHECK-NEXT: ldr x9, [x1] 206; CHECK-NEXT: ldur x10, [x0, #5] 207; CHECK-NEXT: ldur x11, [x1, #5] 208; CHECK-NEXT: cmp x8, x9 209; CHECK-NEXT: ccmp x10, x11, #0, eq 210; CHECK-NEXT: cset w0, eq 211; CHECK-NEXT: ret 212 %cr = call i32 @bcmp(ptr %a, ptr %b, i64 13) 213 %r = icmp eq i32 %cr, 0 214 ret i1 %r 215} 216 217define i1 @bcmp14(ptr %a, ptr %b) { 218; CHECK-LABEL: bcmp14: 219; CHECK: // %bb.0: 220; CHECK-NEXT: ldr x8, [x0] 221; CHECK-NEXT: ldr x9, [x1] 222; CHECK-NEXT: ldur x10, [x0, #6] 223; CHECK-NEXT: ldur x11, [x1, #6] 224; CHECK-NEXT: cmp x8, x9 225; CHECK-NEXT: ccmp x10, x11, #0, eq 226; CHECK-NEXT: cset w0, eq 227; CHECK-NEXT: ret 228 %cr = call i32 @bcmp(ptr %a, ptr %b, i64 14) 229 %r = icmp eq i32 %cr, 0 230 ret i1 %r 231} 232 233define i1 @bcmp15(ptr %a, ptr %b) { 234; CHECK-LABEL: bcmp15: 235; CHECK: // %bb.0: 236; CHECK-NEXT: ldr x8, [x0] 237; CHECK-NEXT: ldr x9, [x1] 238; CHECK-NEXT: ldur x10, [x0, #7] 239; CHECK-NEXT: ldur x11, [x1, #7] 240; CHECK-NEXT: cmp x8, x9 241; CHECK-NEXT: ccmp x10, x11, #0, eq 242; CHECK-NEXT: cset w0, eq 243; CHECK-NEXT: ret 244 %cr = call i32 @bcmp(ptr %a, ptr %b, i64 15) 245 %r = icmp eq i32 %cr, 0 246 ret i1 %r 247} 248 249define i1 @bcmp16(ptr %a, ptr %b) { 250; CHECK-LABEL: bcmp16: 251; CHECK: // %bb.0: 252; CHECK-NEXT: ldp x8, x11, [x1] 253; CHECK-NEXT: ldp x9, x10, [x0] 254; CHECK-NEXT: cmp x9, x8 255; CHECK-NEXT: ccmp x10, x11, #0, eq 256; CHECK-NEXT: cset w0, eq 257; CHECK-NEXT: ret 258 %cr = call i32 @bcmp(ptr %a, ptr %b, i64 16) 259 %r = icmp eq i32 %cr, 0 260 ret i1 %r 261} 262 263define i1 @bcmp20(ptr %a, ptr %b) { 264; CHECK-LABEL: bcmp20: 265; CHECK: // %bb.0: 266; CHECK-NEXT: ldp x8, x11, [x1] 267; CHECK-NEXT: ldr w12, [x0, #16] 268; CHECK-NEXT: ldp x9, x10, [x0] 269; CHECK-NEXT: ldr w13, [x1, #16] 270; CHECK-NEXT: cmp x9, x8 271; CHECK-NEXT: ccmp x10, x11, #0, eq 272; CHECK-NEXT: ccmp x12, x13, #0, eq 273; CHECK-NEXT: cset w0, eq 274; CHECK-NEXT: ret 275 %cr = call i32 @bcmp(ptr %a, ptr %b, i64 20) 276 %r = icmp eq i32 %cr, 0 277 ret i1 %r 278} 279 280define i1 @bcmp24(ptr %a, ptr %b) { 281; CHECK-LABEL: bcmp24: 282; CHECK: // %bb.0: 283; CHECK-NEXT: ldp x8, x11, [x1] 284; CHECK-NEXT: ldr x12, [x0, #16] 285; CHECK-NEXT: ldp x9, x10, [x0] 286; CHECK-NEXT: ldr x13, [x1, #16] 287; CHECK-NEXT: cmp x9, x8 288; CHECK-NEXT: ccmp x10, x11, #0, eq 289; CHECK-NEXT: ccmp x12, x13, #0, eq 290; CHECK-NEXT: cset w0, eq 291; CHECK-NEXT: ret 292 %cr = call i32 @bcmp(ptr %a, ptr %b, i64 24) 293 %r = icmp eq i32 %cr, 0 294 ret i1 %r 295} 296 297define i1 @bcmp28(ptr %a, ptr %b) { 298; CHECK-LABEL: bcmp28: 299; CHECK: // %bb.0: 300; CHECK-NEXT: ldp x8, x11, [x1] 301; CHECK-NEXT: ldr x12, [x0, #16] 302; CHECK-NEXT: ldp x9, x10, [x0] 303; CHECK-NEXT: ldr x13, [x1, #16] 304; CHECK-NEXT: cmp x9, x8 305; CHECK-NEXT: ldr w8, [x0, #24] 306; CHECK-NEXT: ldr w9, [x1, #24] 307; CHECK-NEXT: ccmp x10, x11, #0, eq 308; CHECK-NEXT: ccmp x12, x13, #0, eq 309; CHECK-NEXT: ccmp x8, x9, #0, eq 310; CHECK-NEXT: cset w0, eq 311; CHECK-NEXT: ret 312 %cr = call i32 @bcmp(ptr %a, ptr %b, i64 28) 313 %r = icmp eq i32 %cr, 0 314 ret i1 %r 315} 316 317define i1 @bcmp33(ptr %a, ptr %b) { 318; CHECK-LABEL: bcmp33: 319; CHECK: // %bb.0: 320; CHECK-NEXT: ldp x8, x11, [x1] 321; CHECK-NEXT: ldp x9, x10, [x0] 322; CHECK-NEXT: ldp x12, x13, [x1, #16] 323; CHECK-NEXT: cmp x9, x8 324; CHECK-NEXT: ldp x8, x9, [x0, #16] 325; CHECK-NEXT: ccmp x10, x11, #0, eq 326; CHECK-NEXT: ldrb w10, [x0, #32] 327; CHECK-NEXT: ldrb w11, [x1, #32] 328; CHECK-NEXT: ccmp x8, x12, #0, eq 329; CHECK-NEXT: ccmp x9, x13, #0, eq 330; CHECK-NEXT: ccmp x10, x11, #0, eq 331; CHECK-NEXT: cset w0, eq 332; CHECK-NEXT: ret 333 %cr = call i32 @bcmp(ptr %a, ptr %b, i64 33) 334 %r = icmp eq i32 %cr, 0 335 ret i1 %r 336} 337 338define i1 @bcmp38(ptr %a, ptr %b) { 339; CHECK-LABEL: bcmp38: 340; CHECK: // %bb.0: 341; CHECK-NEXT: ldp x8, x11, [x1] 342; CHECK-NEXT: ldp x9, x10, [x0] 343; CHECK-NEXT: ldp x12, x13, [x1, #16] 344; CHECK-NEXT: cmp x9, x8 345; CHECK-NEXT: ldp x8, x9, [x0, #16] 346; CHECK-NEXT: ccmp x10, x11, #0, eq 347; CHECK-NEXT: ldur x10, [x0, #30] 348; CHECK-NEXT: ldur x11, [x1, #30] 349; CHECK-NEXT: ccmp x8, x12, #0, eq 350; CHECK-NEXT: ccmp x9, x13, #0, eq 351; CHECK-NEXT: ccmp x10, x11, #0, eq 352; CHECK-NEXT: cset w0, eq 353; CHECK-NEXT: ret 354 %cr = call i32 @bcmp(ptr %a, ptr %b, i64 38) 355 %r = icmp eq i32 %cr, 0 356 ret i1 %r 357} 358 359define i1 @bcmp45(ptr %a, ptr %b) { 360; CHECK-LABEL: bcmp45: 361; CHECK: // %bb.0: 362; CHECK-NEXT: ldp x8, x11, [x1] 363; CHECK-NEXT: ldp x9, x10, [x0] 364; CHECK-NEXT: ldp x12, x13, [x1, #16] 365; CHECK-NEXT: cmp x9, x8 366; CHECK-NEXT: ldp x8, x9, [x0, #16] 367; CHECK-NEXT: ccmp x10, x11, #0, eq 368; CHECK-NEXT: ldr x10, [x0, #32] 369; CHECK-NEXT: ldr x11, [x1, #32] 370; CHECK-NEXT: ccmp x8, x12, #0, eq 371; CHECK-NEXT: ldur x8, [x0, #37] 372; CHECK-NEXT: ldur x12, [x1, #37] 373; CHECK-NEXT: ccmp x9, x13, #0, eq 374; CHECK-NEXT: ccmp x10, x11, #0, eq 375; CHECK-NEXT: ccmp x8, x12, #0, eq 376; CHECK-NEXT: cset w0, eq 377; CHECK-NEXT: ret 378 %cr = call i32 @bcmp(ptr %a, ptr %b, i64 45) 379 %r = icmp eq i32 %cr, 0 380 ret i1 %r 381} 382 383; Although the large cmp chain may be not profitable on high end CPU, we 384; believe it is better on most cpus, so perform the transform now. 385; 8 xor + 7 or + 1 cmp only need 6 cycles on a 4 width ALU port machine 386; 2 cycle for xor 387; 3 cycle for or 388; 1 cycle for cmp 389define i1 @bcmp64(ptr %a, ptr %b) { 390; CHECK-LABEL: bcmp64: 391; CHECK: // %bb.0: 392; CHECK-NEXT: ldp x8, x11, [x1] 393; CHECK-NEXT: ldp x9, x10, [x0] 394; CHECK-NEXT: ldp x12, x13, [x1, #16] 395; CHECK-NEXT: cmp x9, x8 396; CHECK-NEXT: ldp x8, x9, [x0, #16] 397; CHECK-NEXT: ccmp x10, x11, #0, eq 398; CHECK-NEXT: ccmp x8, x12, #0, eq 399; CHECK-NEXT: ldp x8, x11, [x0, #32] 400; CHECK-NEXT: ldp x10, x12, [x1, #32] 401; CHECK-NEXT: ccmp x9, x13, #0, eq 402; CHECK-NEXT: ldp x9, x13, [x1, #48] 403; CHECK-NEXT: ccmp x8, x10, #0, eq 404; CHECK-NEXT: ldp x8, x10, [x0, #48] 405; CHECK-NEXT: ccmp x11, x12, #0, eq 406; CHECK-NEXT: ccmp x8, x9, #0, eq 407; CHECK-NEXT: ccmp x10, x13, #0, eq 408; CHECK-NEXT: cset w0, eq 409; CHECK-NEXT: ret 410 %cr = call i32 @bcmp(ptr %a, ptr %b, i64 64) 411 %r = icmp eq i32 %cr, 0 412 ret i1 %r 413} 414 415define i1 @bcmp89(ptr %a, ptr %b) { 416; CHECK-LABEL: bcmp89: 417; CHECK: // %bb.0: 418; CHECK-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill 419; CHECK-NEXT: .cfi_def_cfa_offset 16 420; CHECK-NEXT: .cfi_offset w30, -16 421; CHECK-NEXT: mov w2, #89 // =0x59 422; CHECK-NEXT: bl bcmp 423; CHECK-NEXT: cmp w0, #0 424; CHECK-NEXT: cset w0, eq 425; CHECK-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload 426; CHECK-NEXT: ret 427 %cr = call i32 @bcmp(ptr %a, ptr %b, i64 89) 428 %r = icmp eq i32 %cr, 0 429 ret i1 %r 430} 431 432define i1 @bcmp_zext(i32 %0, i32 %1, i8 %2, i8 %3) { 433; CHECK-LABEL: bcmp_zext: 434; CHECK: // %bb.0: 435; CHECK-NEXT: and w8, w2, #0xff 436; CHECK-NEXT: and w9, w3, #0xff 437; CHECK-NEXT: cmp w1, w0 438; CHECK-NEXT: ccmp w9, w8, #0, eq 439; CHECK-NEXT: cset w0, eq 440; CHECK-NEXT: ret 441 %5 = xor i32 %1, %0 442 %6 = xor i8 %3, %2 443 %7 = zext i8 %6 to i32 444 %8 = or i32 %5, %7 445 %9 = icmp eq i32 %8, 0 446 ret i1 %9 447} 448 449define i1 @bcmp_i8(i8 %a0, i8 %b0, i8 %a1, i8 %b1, i8 %a2, i8 %b2) { 450; CHECK-LABEL: bcmp_i8: 451; CHECK: // %bb.0: 452; CHECK-NEXT: and w8, w1, #0xff 453; CHECK-NEXT: and w9, w2, #0xff 454; CHECK-NEXT: and w10, w3, #0xff 455; CHECK-NEXT: cmp w8, w0, uxtb 456; CHECK-NEXT: and w8, w4, #0xff 457; CHECK-NEXT: and w11, w5, #0xff 458; CHECK-NEXT: ccmp w10, w9, #0, eq 459; CHECK-NEXT: ccmp w11, w8, #0, eq 460; CHECK-NEXT: cset w0, eq 461; CHECK-NEXT: ret 462 %xor0 = xor i8 %b0, %a0 463 %xor1 = xor i8 %b1, %a1 464 %xor2 = xor i8 %b2, %a2 465 %or0 = or i8 %xor0, %xor1 466 %or1 = or i8 %or0, %xor2 467 %r = icmp eq i8 %or1, 0 468 ret i1 %r 469} 470 471define i1 @bcmp_i16(i16 %a0, i16 %b0, i16 %a1, i16 %b1, i16 %a2, i16 %b2) { 472; CHECK-LABEL: bcmp_i16: 473; CHECK: // %bb.0: 474; CHECK-NEXT: and w8, w1, #0xffff 475; CHECK-NEXT: and w9, w2, #0xffff 476; CHECK-NEXT: and w10, w3, #0xffff 477; CHECK-NEXT: cmp w8, w0, uxth 478; CHECK-NEXT: and w8, w4, #0xffff 479; CHECK-NEXT: and w11, w5, #0xffff 480; CHECK-NEXT: ccmp w10, w9, #0, eq 481; CHECK-NEXT: ccmp w11, w8, #0, eq 482; CHECK-NEXT: cset w0, eq 483; CHECK-NEXT: ret 484 %xor0 = xor i16 %b0, %a0 485 %xor1 = xor i16 %b1, %a1 486 %xor2 = xor i16 %b2, %a2 487 %or0 = or i16 %xor0, %xor1 488 %or1 = or i16 %or0, %xor2 489 %r = icmp eq i16 %or1, 0 490 ret i1 %r 491} 492 493define i1 @bcmp_i128(i128 %a0, i128 %b0, i128 %a1, i128 %b1, i128 %a2, i128 %b2) { 494; CHECK-LABEL: bcmp_i128: 495; CHECK: // %bb.0: 496; CHECK-NEXT: cmp x2, x0 497; CHECK-NEXT: ldp x8, x10, [sp] 498; CHECK-NEXT: ccmp x3, x1, #0, eq 499; CHECK-NEXT: ldp x9, x11, [sp, #16] 500; CHECK-NEXT: ccmp x6, x4, #0, eq 501; CHECK-NEXT: ccmp x7, x5, #0, eq 502; CHECK-NEXT: cset w12, ne 503; CHECK-NEXT: cmp x9, x8 504; CHECK-NEXT: ccmp x11, x10, #0, eq 505; CHECK-NEXT: csinc w0, w12, wzr, eq 506; CHECK-NEXT: ret 507 %xor0 = xor i128 %b0, %a0 508 %xor1 = xor i128 %b1, %a1 509 %xor2 = xor i128 %b2, %a2 510 %or0 = or i128 %xor0, %xor1 511 %or1 = or i128 %or0, %xor2 512 %r = icmp ne i128 %or1, 0 513 ret i1 %r 514} 515 516define i1 @bcmp_i42(i42 %a0, i42 %b0, i42 %a1, i42 %b1, i42 %a2, i42 %b2) { 517; CHECK-LABEL: bcmp_i42: 518; CHECK: // %bb.0: 519; CHECK-NEXT: and x8, x0, #0x3ffffffffff 520; CHECK-NEXT: and x9, x1, #0x3ffffffffff 521; CHECK-NEXT: and x10, x2, #0x3ffffffffff 522; CHECK-NEXT: and x11, x3, #0x3ffffffffff 523; CHECK-NEXT: cmp x9, x8 524; CHECK-NEXT: and x8, x4, #0x3ffffffffff 525; CHECK-NEXT: and x9, x5, #0x3ffffffffff 526; CHECK-NEXT: ccmp x11, x10, #0, eq 527; CHECK-NEXT: ccmp x9, x8, #0, eq 528; CHECK-NEXT: cset w0, ne 529; CHECK-NEXT: ret 530 %xor0 = xor i42 %b0, %a0 531 %xor1 = xor i42 %b1, %a1 532 %xor2 = xor i42 %b2, %a2 533 %or0 = or i42 %xor0, %xor1 534 %or1 = or i42 %or0, %xor2 535 %r = icmp ne i42 %or1, 0 536 ret i1 %r 537} 538