3055 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 32; RUN: llc < %s -mtriple=aarch64-unknown-unknown | FileCheck %s3 4@.str = private constant [513 x i8] c"01234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901\00", align 15 6declare dso_local i32 @memcmp(ptr, ptr, i64)7 8define i32 @length0(ptr %X, ptr %Y) nounwind {9; CHECK-LABEL: length0:10; CHECK: // %bb.0:11; CHECK-NEXT: mov w0, wzr12; CHECK-NEXT: ret13 %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 0) nounwind14 ret i32 %m15 }16 17define i1 @length0_eq(ptr %X, ptr %Y) nounwind {18; CHECK-LABEL: length0_eq:19; CHECK: // %bb.0:20; CHECK-NEXT: mov w0, #1 // =0x121; CHECK-NEXT: ret22 %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 0) nounwind23 %c = icmp eq i32 %m, 024 ret i1 %c25}26 27define i1 @length0_lt(ptr %X, ptr %Y) nounwind {28; CHECK-LABEL: length0_lt:29; CHECK: // %bb.0:30; CHECK-NEXT: mov w0, wzr31; CHECK-NEXT: ret32 %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 0) nounwind33 %c = icmp slt i32 %m, 034 ret i1 %c35}36 37define i32 @length2(ptr %X, ptr %Y) nounwind {38; CHECK-LABEL: length2:39; CHECK: // %bb.0:40; CHECK-NEXT: ldrh w8, [x0]41; CHECK-NEXT: ldrh w9, [x1]42; CHECK-NEXT: rev w8, w843; CHECK-NEXT: rev w9, w944; CHECK-NEXT: lsr w8, w8, #1645; CHECK-NEXT: sub w0, w8, w9, lsr #1646; CHECK-NEXT: ret47 %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 2) nounwind48 ret i32 %m49}50 51define i32 @length2_const(ptr %X, ptr %Y) nounwind {52; CHECK-LABEL: length2_const:53; CHECK: // %bb.0:54; CHECK-NEXT: ldrh w9, [x0]55; CHECK-NEXT: mov w8, #-12594 // =0xffffcece56; CHECK-NEXT: rev w9, w957; CHECK-NEXT: add w0, w8, w9, lsr #1658; CHECK-NEXT: ret59 %m = tail call i32 @memcmp(ptr %X, ptr getelementptr inbounds ([513 x i8], ptr @.str, i32 0, i32 1), i64 2) nounwind60 ret i32 %m61}62 63define i1 @length2_gt_const(ptr %X, ptr %Y) nounwind {64; CHECK-LABEL: length2_gt_const:65; CHECK: // %bb.0:66; CHECK-NEXT: ldrh w9, [x0]67; CHECK-NEXT: mov w8, #-12594 // =0xffffcece68; CHECK-NEXT: rev w9, w969; CHECK-NEXT: add w8, w8, w9, lsr #1670; CHECK-NEXT: cmp w8, #071; CHECK-NEXT: cset w0, gt72; CHECK-NEXT: ret73 %m = tail call i32 @memcmp(ptr %X, ptr getelementptr inbounds ([513 x i8], ptr @.str, i32 0, i32 1), i64 2) nounwind74 %c = icmp sgt i32 %m, 075 ret i1 %c76}77 78define i1 @length2_eq(ptr %X, ptr %Y) nounwind {79; CHECK-LABEL: length2_eq:80; CHECK: // %bb.0:81; CHECK-NEXT: ldrh w8, [x0]82; CHECK-NEXT: ldrh w9, [x1]83; CHECK-NEXT: cmp w8, w984; CHECK-NEXT: cset w0, eq85; CHECK-NEXT: ret86 %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 2) nounwind87 %c = icmp eq i32 %m, 088 ret i1 %c89}90 91define i1 @length2_lt(ptr %X, ptr %Y) nounwind {92; CHECK-LABEL: length2_lt:93; CHECK: // %bb.0:94; CHECK-NEXT: ldrh w8, [x0]95; CHECK-NEXT: ldrh w9, [x1]96; CHECK-NEXT: rev w8, w897; CHECK-NEXT: rev w9, w998; CHECK-NEXT: lsr w8, w8, #1699; CHECK-NEXT: sub w8, w8, w9, lsr #16100; CHECK-NEXT: lsr w0, w8, #31101; CHECK-NEXT: ret102 %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 2) nounwind103 %c = icmp slt i32 %m, 0104 ret i1 %c105}106 107define i1 @length2_gt(ptr %X, ptr %Y) nounwind {108; CHECK-LABEL: length2_gt:109; CHECK: // %bb.0:110; CHECK-NEXT: ldrh w8, [x0]111; CHECK-NEXT: ldrh w9, [x1]112; CHECK-NEXT: rev w8, w8113; CHECK-NEXT: rev w9, w9114; CHECK-NEXT: lsr w8, w8, #16115; CHECK-NEXT: sub w8, w8, w9, lsr #16116; CHECK-NEXT: cmp w8, #0117; CHECK-NEXT: cset w0, gt118; CHECK-NEXT: ret119 %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 2) nounwind120 %c = icmp sgt i32 %m, 0121 ret i1 %c122}123 124define i1 @length2_eq_const(ptr %X) nounwind {125; CHECK-LABEL: length2_eq_const:126; CHECK: // %bb.0:127; CHECK-NEXT: ldrh w8, [x0]128; CHECK-NEXT: mov w9, #12849 // =0x3231129; CHECK-NEXT: cmp w8, w9130; CHECK-NEXT: cset w0, ne131; CHECK-NEXT: ret132 %m = tail call i32 @memcmp(ptr %X, ptr getelementptr inbounds ([513 x i8], ptr @.str, i32 0, i32 1), i64 2) nounwind133 %c = icmp ne i32 %m, 0134 ret i1 %c135}136 137define i1 @length2_eq_nobuiltin_attr(ptr %X, ptr %Y) nounwind {138; CHECK-LABEL: length2_eq_nobuiltin_attr:139; CHECK: // %bb.0:140; CHECK-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill141; CHECK-NEXT: mov w2, #2 // =0x2142; CHECK-NEXT: bl memcmp143; CHECK-NEXT: cmp w0, #0144; CHECK-NEXT: cset w0, eq145; CHECK-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload146; CHECK-NEXT: ret147 %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 2) nounwind nobuiltin148 %c = icmp eq i32 %m, 0149 ret i1 %c150}151 152define i32 @length3(ptr %X, ptr %Y) nounwind {153; CHECK-LABEL: length3:154; CHECK: // %bb.0:155; CHECK-NEXT: ldrb w8, [x0, #2]156; CHECK-NEXT: ldrh w9, [x0]157; CHECK-NEXT: ldrb w10, [x1, #2]158; CHECK-NEXT: ldrh w11, [x1]159; CHECK-NEXT: orr w8, w9, w8, lsl #16160; CHECK-NEXT: orr w9, w11, w10, lsl #16161; CHECK-NEXT: rev w8, w8162; CHECK-NEXT: rev w9, w9163; CHECK-NEXT: cmp w8, w9164; CHECK-NEXT: cset w8, hi165; CHECK-NEXT: csinv w0, w8, wzr, hs166; CHECK-NEXT: ret167 %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 3) nounwind168 ret i32 %m169}170 171define i1 @length3_eq(ptr %X, ptr %Y) nounwind {172; CHECK-LABEL: length3_eq:173; CHECK: // %bb.0:174; CHECK-NEXT: ldrh w8, [x0]175; CHECK-NEXT: ldrh w9, [x1]176; CHECK-NEXT: ldrb w10, [x0, #2]177; CHECK-NEXT: ldrb w11, [x1, #2]178; CHECK-NEXT: cmp w8, w9179; CHECK-NEXT: ccmp w10, w11, #0, eq180; CHECK-NEXT: cset w0, ne181; CHECK-NEXT: ret182 %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 3) nounwind183 %c = icmp ne i32 %m, 0184 ret i1 %c185}186 187define i32 @length4(ptr %X, ptr %Y) nounwind {188; CHECK-LABEL: length4:189; CHECK: // %bb.0:190; CHECK-NEXT: ldr w8, [x0]191; CHECK-NEXT: ldr w9, [x1]192; CHECK-NEXT: rev w8, w8193; CHECK-NEXT: rev w9, w9194; CHECK-NEXT: cmp w8, w9195; CHECK-NEXT: cset w8, hi196; CHECK-NEXT: csinv w0, w8, wzr, hs197; CHECK-NEXT: ret198 %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 4) nounwind199 ret i32 %m200}201 202define i1 @length4_eq(ptr %X, ptr %Y) nounwind {203; CHECK-LABEL: length4_eq:204; CHECK: // %bb.0:205; CHECK-NEXT: ldr w8, [x0]206; CHECK-NEXT: ldr w9, [x1]207; CHECK-NEXT: cmp w8, w9208; CHECK-NEXT: cset w0, ne209; CHECK-NEXT: ret210 %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 4) nounwind211 %c = icmp ne i32 %m, 0212 ret i1 %c213}214 215define i1 @length4_lt(ptr %X, ptr %Y) nounwind {216; CHECK-LABEL: length4_lt:217; CHECK: // %bb.0:218; CHECK-NEXT: ldr w8, [x0]219; CHECK-NEXT: ldr w9, [x1]220; CHECK-NEXT: rev w8, w8221; CHECK-NEXT: rev w9, w9222; CHECK-NEXT: cmp w8, w9223; CHECK-NEXT: cset w0, lo224; CHECK-NEXT: ret225 %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 4) nounwind226 %c = icmp slt i32 %m, 0227 ret i1 %c228}229 230define i32 @length4_lt_32(ptr %X, ptr %Y) nounwind {231; CHECK-LABEL: length4_lt_32:232; CHECK: // %bb.0:233; CHECK-NEXT: ldr w8, [x0]234; CHECK-NEXT: ldr w9, [x1]235; CHECK-NEXT: rev w8, w8236; CHECK-NEXT: rev w9, w9237; CHECK-NEXT: cmp w8, w9238; CHECK-NEXT: cset w0, lo239; CHECK-NEXT: ret240 %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 4) nounwind241 %c = lshr i32 %m, 31242 ret i32 %c243}244 245define i1 @length4_gt(ptr %X, ptr %Y) nounwind {246; CHECK-LABEL: length4_gt:247; CHECK: // %bb.0:248; CHECK-NEXT: ldr w8, [x0]249; CHECK-NEXT: ldr w9, [x1]250; CHECK-NEXT: rev w8, w8251; CHECK-NEXT: rev w9, w9252; CHECK-NEXT: cmp w8, w9253; CHECK-NEXT: cset w0, hi254; CHECK-NEXT: ret255 %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 4) nounwind256 %c = icmp sgt i32 %m, 0257 ret i1 %c258}259 260define i1 @length4_le(ptr %X, ptr %Y) nounwind {261; CHECK-LABEL: length4_le:262; CHECK: // %bb.0:263; CHECK-NEXT: ldr w8, [x0]264; CHECK-NEXT: ldr w9, [x1]265; CHECK-NEXT: rev w8, w8266; CHECK-NEXT: rev w9, w9267; CHECK-NEXT: cmp w8, w9268; CHECK-NEXT: cset w0, ls269; CHECK-NEXT: ret270 %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 4) nounwind271 %c = icmp slt i32 %m, 1272 ret i1 %c273}274 275define i1 @length4_ge(ptr %X, ptr %Y) nounwind {276; CHECK-LABEL: length4_ge:277; CHECK: // %bb.0:278; CHECK-NEXT: ldr w8, [x0]279; CHECK-NEXT: ldr w9, [x1]280; CHECK-NEXT: rev w8, w8281; CHECK-NEXT: rev w9, w9282; CHECK-NEXT: cmp w8, w9283; CHECK-NEXT: cset w0, hs284; CHECK-NEXT: ret285 %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 4) nounwind286 %c = icmp sgt i32 %m, -1287 ret i1 %c288}289 290define i1 @length4_eq_const(ptr %X) nounwind {291; CHECK-LABEL: length4_eq_const:292; CHECK: // %bb.0:293; CHECK-NEXT: ldr w8, [x0]294; CHECK-NEXT: mov w9, #12849 // =0x3231295; CHECK-NEXT: movk w9, #13363, lsl #16296; CHECK-NEXT: cmp w8, w9297; CHECK-NEXT: cset w0, eq298; CHECK-NEXT: ret299 %m = tail call i32 @memcmp(ptr %X, ptr getelementptr inbounds ([513 x i8], ptr @.str, i32 0, i32 1), i64 4) nounwind300 %c = icmp eq i32 %m, 0301 ret i1 %c302}303 304define i32 @length5(ptr %X, ptr %Y) nounwind {305; CHECK-LABEL: length5:306; CHECK: // %bb.0:307; CHECK-NEXT: ldrb w8, [x0, #4]308; CHECK-NEXT: ldr w9, [x0]309; CHECK-NEXT: ldrb w10, [x1, #4]310; CHECK-NEXT: ldr w11, [x1]311; CHECK-NEXT: orr x8, x9, x8, lsl #32312; CHECK-NEXT: orr x9, x11, x10, lsl #32313; CHECK-NEXT: rev x8, x8314; CHECK-NEXT: rev x9, x9315; CHECK-NEXT: cmp x8, x9316; CHECK-NEXT: cset w8, hi317; CHECK-NEXT: csinv w0, w8, wzr, hs318; CHECK-NEXT: ret319 %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 5) nounwind320 ret i32 %m321}322 323define i1 @length5_eq(ptr %X, ptr %Y) nounwind {324; CHECK-LABEL: length5_eq:325; CHECK: // %bb.0:326; CHECK-NEXT: ldr w8, [x0]327; CHECK-NEXT: ldr w9, [x1]328; CHECK-NEXT: ldrb w10, [x0, #4]329; CHECK-NEXT: ldrb w11, [x1, #4]330; CHECK-NEXT: cmp w8, w9331; CHECK-NEXT: ccmp w10, w11, #0, eq332; CHECK-NEXT: cset w0, ne333; CHECK-NEXT: ret334 %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 5) nounwind335 %c = icmp ne i32 %m, 0336 ret i1 %c337}338 339define i1 @length5_lt(ptr %X, ptr %Y) nounwind {340; CHECK-LABEL: length5_lt:341; CHECK: // %bb.0:342; CHECK-NEXT: ldrb w8, [x0, #4]343; CHECK-NEXT: ldr w9, [x0]344; CHECK-NEXT: ldrb w10, [x1, #4]345; CHECK-NEXT: ldr w11, [x1]346; CHECK-NEXT: orr x8, x9, x8, lsl #32347; CHECK-NEXT: orr x9, x11, x10, lsl #32348; CHECK-NEXT: rev x8, x8349; CHECK-NEXT: rev x9, x9350; CHECK-NEXT: cmp x8, x9351; CHECK-NEXT: cset w0, lo352; CHECK-NEXT: ret353 %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 5) nounwind354 %c = icmp slt i32 %m, 0355 ret i1 %c356}357 358define i32 @length6(ptr %X, ptr %Y) nounwind {359; CHECK-LABEL: length6:360; CHECK: // %bb.0:361; CHECK-NEXT: ldrh w8, [x0, #4]362; CHECK-NEXT: ldr w9, [x0]363; CHECK-NEXT: ldrh w10, [x1, #4]364; CHECK-NEXT: ldr w11, [x1]365; CHECK-NEXT: orr x8, x9, x8, lsl #32366; CHECK-NEXT: orr x9, x11, x10, lsl #32367; CHECK-NEXT: rev x8, x8368; CHECK-NEXT: rev x9, x9369; CHECK-NEXT: cmp x8, x9370; CHECK-NEXT: cset w8, hi371; CHECK-NEXT: csinv w0, w8, wzr, hs372; CHECK-NEXT: ret373 %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 6) nounwind374 ret i32 %m375}376 377define i32 @length6_lt(ptr %X, ptr %Y) nounwind {378; CHECK-LABEL: length6_lt:379; CHECK: // %bb.0:380; CHECK-NEXT: ldrh w8, [x0, #4]381; CHECK-NEXT: ldr w9, [x0]382; CHECK-NEXT: ldrh w10, [x1, #4]383; CHECK-NEXT: ldr w11, [x1]384; CHECK-NEXT: orr x8, x9, x8, lsl #32385; CHECK-NEXT: orr x9, x11, x10, lsl #32386; CHECK-NEXT: rev x8, x8387; CHECK-NEXT: rev x9, x9388; CHECK-NEXT: cmp x8, x9389; CHECK-NEXT: cset w0, lo390; CHECK-NEXT: ret391 %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 6) nounwind392 %r = lshr i32 %m, 31393 ret i32 %r394}395 396define i32 @length7(ptr %X, ptr %Y) nounwind {397; CHECK-LABEL: length7:398; CHECK: // %bb.0:399; CHECK-NEXT: ldr w8, [x0]400; CHECK-NEXT: ldr w9, [x1]401; CHECK-NEXT: rev w8, w8402; CHECK-NEXT: rev w9, w9403; CHECK-NEXT: cmp w8, w9404; CHECK-NEXT: b.ne .LBB26_3405; CHECK-NEXT: // %bb.1: // %loadbb1406; CHECK-NEXT: ldur w8, [x0, #3]407; CHECK-NEXT: ldur w9, [x1, #3]408; CHECK-NEXT: rev w8, w8409; CHECK-NEXT: rev w9, w9410; CHECK-NEXT: cmp w8, w9411; CHECK-NEXT: b.ne .LBB26_3412; CHECK-NEXT: // %bb.2:413; CHECK-NEXT: mov w0, wzr414; CHECK-NEXT: ret415; CHECK-NEXT: .LBB26_3: // %res_block416; CHECK-NEXT: cmp w8, w9417; CHECK-NEXT: mov w8, #-1 // =0xffffffff418; CHECK-NEXT: cneg w0, w8, hs419; CHECK-NEXT: ret420 %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 7) nounwind421 ret i32 %m422}423 424define i1 @length7_lt(ptr %X, ptr %Y) nounwind {425; CHECK-LABEL: length7_lt:426; CHECK: // %bb.0:427; CHECK-NEXT: ldr w8, [x0]428; CHECK-NEXT: ldr w9, [x1]429; CHECK-NEXT: rev w8, w8430; CHECK-NEXT: rev w9, w9431; CHECK-NEXT: cmp w8, w9432; CHECK-NEXT: b.ne .LBB27_3433; CHECK-NEXT: // %bb.1: // %loadbb1434; CHECK-NEXT: ldur w8, [x0, #3]435; CHECK-NEXT: ldur w9, [x1, #3]436; CHECK-NEXT: rev w8, w8437; CHECK-NEXT: rev w9, w9438; CHECK-NEXT: cmp w8, w9439; CHECK-NEXT: b.ne .LBB27_3440; CHECK-NEXT: // %bb.2:441; CHECK-NEXT: lsr w0, wzr, #31442; CHECK-NEXT: ret443; CHECK-NEXT: .LBB27_3: // %res_block444; CHECK-NEXT: cmp w8, w9445; CHECK-NEXT: mov w8, #-1 // =0xffffffff446; CHECK-NEXT: cneg w8, w8, hs447; CHECK-NEXT: lsr w0, w8, #31448; CHECK-NEXT: ret449 %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 7) nounwind450 %c = icmp slt i32 %m, 0451 ret i1 %c452}453 454define i1 @length7_eq(ptr %X, ptr %Y) nounwind {455; CHECK-LABEL: length7_eq:456; CHECK: // %bb.0:457; CHECK-NEXT: ldr w8, [x0]458; CHECK-NEXT: ldr w9, [x1]459; CHECK-NEXT: ldur w10, [x0, #3]460; CHECK-NEXT: ldur w11, [x1, #3]461; CHECK-NEXT: cmp w8, w9462; CHECK-NEXT: ccmp w10, w11, #0, eq463; CHECK-NEXT: cset w0, ne464; CHECK-NEXT: ret465 %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 7) nounwind466 %c = icmp ne i32 %m, 0467 ret i1 %c468}469 470define i32 @length8(ptr %X, ptr %Y) nounwind {471; CHECK-LABEL: length8:472; CHECK: // %bb.0:473; CHECK-NEXT: ldr x8, [x0]474; CHECK-NEXT: ldr x9, [x1]475; CHECK-NEXT: rev x8, x8476; CHECK-NEXT: rev x9, x9477; CHECK-NEXT: cmp x8, x9478; CHECK-NEXT: cset w8, hi479; CHECK-NEXT: csinv w0, w8, wzr, hs480; CHECK-NEXT: ret481 %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 8) nounwind482 ret i32 %m483}484 485define i1 @length8_eq(ptr %X, ptr %Y) nounwind {486; CHECK-LABEL: length8_eq:487; CHECK: // %bb.0:488; CHECK-NEXT: ldr x8, [x0]489; CHECK-NEXT: ldr x9, [x1]490; CHECK-NEXT: cmp x8, x9491; CHECK-NEXT: cset w0, eq492; CHECK-NEXT: ret493 %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 8) nounwind494 %c = icmp eq i32 %m, 0495 ret i1 %c496}497 498define i1 @length8_eq_const(ptr %X) nounwind {499; CHECK-LABEL: length8_eq_const:500; CHECK: // %bb.0:501; CHECK-NEXT: mov x9, #12592 // =0x3130502; CHECK-NEXT: ldr x8, [x0]503; CHECK-NEXT: movk x9, #13106, lsl #16504; CHECK-NEXT: movk x9, #13620, lsl #32505; CHECK-NEXT: movk x9, #14134, lsl #48506; CHECK-NEXT: cmp x8, x9507; CHECK-NEXT: cset w0, ne508; CHECK-NEXT: ret509 %m = tail call i32 @memcmp(ptr %X, ptr @.str, i64 8) nounwind510 %c = icmp ne i32 %m, 0511 ret i1 %c512}513 514define i32 @length9(ptr %X, ptr %Y) nounwind {515; CHECK-LABEL: length9:516; CHECK: // %bb.0:517; CHECK-NEXT: ldr x8, [x0]518; CHECK-NEXT: ldr x9, [x1]519; CHECK-NEXT: rev x8, x8520; CHECK-NEXT: rev x9, x9521; CHECK-NEXT: cmp x8, x9522; CHECK-NEXT: b.ne .LBB32_2523; CHECK-NEXT: // %bb.1: // %loadbb1524; CHECK-NEXT: ldrb w8, [x0, #8]525; CHECK-NEXT: ldrb w9, [x1, #8]526; CHECK-NEXT: sub w0, w8, w9527; CHECK-NEXT: ret528; CHECK-NEXT: .LBB32_2: // %res_block529; CHECK-NEXT: mov w8, #-1 // =0xffffffff530; CHECK-NEXT: cneg w0, w8, hs531; CHECK-NEXT: ret532 %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 9) nounwind533 ret i32 %m534}535 536define i1 @length9_eq(ptr %X, ptr %Y) nounwind {537; CHECK-LABEL: length9_eq:538; CHECK: // %bb.0:539; CHECK-NEXT: ldr x8, [x0]540; CHECK-NEXT: ldr x9, [x1]541; CHECK-NEXT: ldrb w10, [x0, #8]542; CHECK-NEXT: ldrb w11, [x1, #8]543; CHECK-NEXT: cmp x8, x9544; CHECK-NEXT: ccmp x10, x11, #0, eq545; CHECK-NEXT: cset w0, eq546; CHECK-NEXT: ret547 %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 9) nounwind548 %c = icmp eq i32 %m, 0549 ret i1 %c550}551 552define i32 @length10(ptr %X, ptr %Y) nounwind {553; CHECK-LABEL: length10:554; CHECK: // %bb.0:555; CHECK-NEXT: ldr x8, [x0]556; CHECK-NEXT: ldr x9, [x1]557; CHECK-NEXT: rev x8, x8558; CHECK-NEXT: rev x9, x9559; CHECK-NEXT: cmp x8, x9560; CHECK-NEXT: b.ne .LBB34_3561; CHECK-NEXT: // %bb.1: // %loadbb1562; CHECK-NEXT: ldrh w8, [x0, #8]563; CHECK-NEXT: ldrh w9, [x1, #8]564; CHECK-NEXT: rev w8, w8565; CHECK-NEXT: rev w9, w9566; CHECK-NEXT: lsr w8, w8, #16567; CHECK-NEXT: lsr w9, w9, #16568; CHECK-NEXT: cmp x8, x9569; CHECK-NEXT: b.ne .LBB34_3570; CHECK-NEXT: // %bb.2:571; CHECK-NEXT: mov w0, wzr572; CHECK-NEXT: ret573; CHECK-NEXT: .LBB34_3: // %res_block574; CHECK-NEXT: cmp x8, x9575; CHECK-NEXT: mov w8, #-1 // =0xffffffff576; CHECK-NEXT: cneg w0, w8, hs577; CHECK-NEXT: ret578 %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 10) nounwind579 ret i32 %m580}581 582define i1 @length10_eq(ptr %X, ptr %Y) nounwind {583; CHECK-LABEL: length10_eq:584; CHECK: // %bb.0:585; CHECK-NEXT: ldr x8, [x0]586; CHECK-NEXT: ldr x9, [x1]587; CHECK-NEXT: ldrh w10, [x0, #8]588; CHECK-NEXT: ldrh w11, [x1, #8]589; CHECK-NEXT: cmp x8, x9590; CHECK-NEXT: ccmp x10, x11, #0, eq591; CHECK-NEXT: cset w0, eq592; CHECK-NEXT: ret593 %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 10) nounwind594 %c = icmp eq i32 %m, 0595 ret i1 %c596}597 598define i32 @length11(ptr %X, ptr %Y) nounwind {599; CHECK-LABEL: length11:600; CHECK: // %bb.0:601; CHECK-NEXT: ldr x8, [x0]602; CHECK-NEXT: ldr x9, [x1]603; CHECK-NEXT: rev x8, x8604; CHECK-NEXT: rev x9, x9605; CHECK-NEXT: cmp x8, x9606; CHECK-NEXT: b.ne .LBB36_3607; CHECK-NEXT: // %bb.1: // %loadbb1608; CHECK-NEXT: ldur x8, [x0, #3]609; CHECK-NEXT: ldur x9, [x1, #3]610; CHECK-NEXT: rev x8, x8611; CHECK-NEXT: rev x9, x9612; CHECK-NEXT: cmp x8, x9613; CHECK-NEXT: b.ne .LBB36_3614; CHECK-NEXT: // %bb.2:615; CHECK-NEXT: mov w0, wzr616; CHECK-NEXT: ret617; CHECK-NEXT: .LBB36_3: // %res_block618; CHECK-NEXT: cmp x8, x9619; CHECK-NEXT: mov w8, #-1 // =0xffffffff620; CHECK-NEXT: cneg w0, w8, hs621; CHECK-NEXT: ret622 %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 11) nounwind623 ret i32 %m624}625 626define i1 @length11_eq(ptr %X, ptr %Y) nounwind {627; CHECK-LABEL: length11_eq:628; CHECK: // %bb.0:629; CHECK-NEXT: ldr x8, [x0]630; CHECK-NEXT: ldr x9, [x1]631; CHECK-NEXT: ldur x10, [x0, #3]632; CHECK-NEXT: ldur x11, [x1, #3]633; CHECK-NEXT: cmp x8, x9634; CHECK-NEXT: ccmp x10, x11, #0, eq635; CHECK-NEXT: cset w0, eq636; CHECK-NEXT: ret637 %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 11) nounwind638 %c = icmp eq i32 %m, 0639 ret i1 %c640}641 642define i1 @length12_eq(ptr %X, ptr %Y) nounwind {643; CHECK-LABEL: length12_eq:644; CHECK: // %bb.0:645; CHECK-NEXT: ldr x8, [x0]646; CHECK-NEXT: ldr x9, [x1]647; CHECK-NEXT: ldr w10, [x0, #8]648; CHECK-NEXT: ldr w11, [x1, #8]649; CHECK-NEXT: cmp x8, x9650; CHECK-NEXT: ccmp x10, x11, #0, eq651; CHECK-NEXT: cset w0, ne652; CHECK-NEXT: ret653 %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 12) nounwind654 %c = icmp ne i32 %m, 0655 ret i1 %c656}657 658define i32 @length12(ptr %X, ptr %Y) nounwind {659; CHECK-LABEL: length12:660; CHECK: // %bb.0:661; CHECK-NEXT: ldr x8, [x0]662; CHECK-NEXT: ldr x9, [x1]663; CHECK-NEXT: rev x8, x8664; CHECK-NEXT: rev x9, x9665; CHECK-NEXT: cmp x8, x9666; CHECK-NEXT: b.ne .LBB39_3667; CHECK-NEXT: // %bb.1: // %loadbb1668; CHECK-NEXT: ldr w8, [x0, #8]669; CHECK-NEXT: ldr w9, [x1, #8]670; CHECK-NEXT: rev w8, w8671; CHECK-NEXT: rev w9, w9672; CHECK-NEXT: cmp x8, x9673; CHECK-NEXT: b.ne .LBB39_3674; CHECK-NEXT: // %bb.2:675; CHECK-NEXT: mov w0, wzr676; CHECK-NEXT: ret677; CHECK-NEXT: .LBB39_3: // %res_block678; CHECK-NEXT: cmp x8, x9679; CHECK-NEXT: mov w8, #-1 // =0xffffffff680; CHECK-NEXT: cneg w0, w8, hs681; CHECK-NEXT: ret682 %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 12) nounwind683 ret i32 %m684}685 686define i1 @length13_eq(ptr %X, ptr %Y) nounwind {687; CHECK-LABEL: length13_eq:688; CHECK: // %bb.0:689; CHECK-NEXT: ldr x8, [x0]690; CHECK-NEXT: ldr x9, [x1]691; CHECK-NEXT: ldur x10, [x0, #5]692; CHECK-NEXT: ldur x11, [x1, #5]693; CHECK-NEXT: cmp x8, x9694; CHECK-NEXT: ccmp x10, x11, #0, eq695; CHECK-NEXT: cset w0, eq696; CHECK-NEXT: ret697 %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 13) nounwind698 %c = icmp eq i32 %m, 0699 ret i1 %c700}701 702define i1 @length14_eq(ptr %X, ptr %Y) nounwind {703; CHECK-LABEL: length14_eq:704; CHECK: // %bb.0:705; CHECK-NEXT: ldr x8, [x0]706; CHECK-NEXT: ldr x9, [x1]707; CHECK-NEXT: ldur x10, [x0, #6]708; CHECK-NEXT: ldur x11, [x1, #6]709; CHECK-NEXT: cmp x8, x9710; CHECK-NEXT: ccmp x10, x11, #0, eq711; CHECK-NEXT: cset w0, eq712; CHECK-NEXT: ret713 %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 14) nounwind714 %c = icmp eq i32 %m, 0715 ret i1 %c716}717 718define i32 @length15(ptr %X, ptr %Y) nounwind {719; CHECK-LABEL: length15:720; CHECK: // %bb.0:721; CHECK-NEXT: ldr x8, [x0]722; CHECK-NEXT: ldr x9, [x1]723; CHECK-NEXT: rev x8, x8724; CHECK-NEXT: rev x9, x9725; CHECK-NEXT: cmp x8, x9726; CHECK-NEXT: b.ne .LBB42_3727; CHECK-NEXT: // %bb.1: // %loadbb1728; CHECK-NEXT: ldur x8, [x0, #7]729; CHECK-NEXT: ldur x9, [x1, #7]730; CHECK-NEXT: rev x8, x8731; CHECK-NEXT: rev x9, x9732; CHECK-NEXT: cmp x8, x9733; CHECK-NEXT: b.ne .LBB42_3734; CHECK-NEXT: // %bb.2:735; CHECK-NEXT: mov w0, wzr736; CHECK-NEXT: ret737; CHECK-NEXT: .LBB42_3: // %res_block738; CHECK-NEXT: cmp x8, x9739; CHECK-NEXT: mov w8, #-1 // =0xffffffff740; CHECK-NEXT: cneg w0, w8, hs741; CHECK-NEXT: ret742 %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 15) nounwind743 ret i32 %m744}745 746define i1 @length15_lt(ptr %X, ptr %Y) nounwind {747; CHECK-LABEL: length15_lt:748; CHECK: // %bb.0:749; CHECK-NEXT: ldr x8, [x0]750; CHECK-NEXT: ldr x9, [x1]751; CHECK-NEXT: rev x8, x8752; CHECK-NEXT: rev x9, x9753; CHECK-NEXT: cmp x8, x9754; CHECK-NEXT: b.ne .LBB43_3755; CHECK-NEXT: // %bb.1: // %loadbb1756; CHECK-NEXT: ldur x8, [x0, #7]757; CHECK-NEXT: ldur x9, [x1, #7]758; CHECK-NEXT: rev x8, x8759; CHECK-NEXT: rev x9, x9760; CHECK-NEXT: cmp x8, x9761; CHECK-NEXT: b.ne .LBB43_3762; CHECK-NEXT: // %bb.2:763; CHECK-NEXT: lsr w0, wzr, #31764; CHECK-NEXT: ret765; CHECK-NEXT: .LBB43_3: // %res_block766; CHECK-NEXT: cmp x8, x9767; CHECK-NEXT: mov w8, #-1 // =0xffffffff768; CHECK-NEXT: cneg w8, w8, hs769; CHECK-NEXT: lsr w0, w8, #31770; CHECK-NEXT: ret771 %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 15) nounwind772 %c = icmp slt i32 %m, 0773 ret i1 %c774}775 776define i32 @length15_const(ptr %X, ptr %Y) nounwind {777; CHECK-LABEL: length15_const:778; CHECK: // %bb.0:779; CHECK-NEXT: mov x8, #14136 // =0x3738780; CHECK-NEXT: ldr x9, [x0]781; CHECK-NEXT: movk x8, #13622, lsl #16782; CHECK-NEXT: movk x8, #13108, lsl #32783; CHECK-NEXT: rev x9, x9784; CHECK-NEXT: movk x8, #12594, lsl #48785; CHECK-NEXT: cmp x9, x8786; CHECK-NEXT: b.ne .LBB44_3787; CHECK-NEXT: // %bb.1: // %loadbb1788; CHECK-NEXT: mov x8, #13365 // =0x3435789; CHECK-NEXT: ldur x9, [x0, #7]790; CHECK-NEXT: movk x8, #12851, lsl #16791; CHECK-NEXT: movk x8, #12337, lsl #32792; CHECK-NEXT: rev x9, x9793; CHECK-NEXT: movk x8, #14393, lsl #48794; CHECK-NEXT: cmp x9, x8795; CHECK-NEXT: b.ne .LBB44_3796; CHECK-NEXT: // %bb.2:797; CHECK-NEXT: mov w0, wzr798; CHECK-NEXT: ret799; CHECK-NEXT: .LBB44_3: // %res_block800; CHECK-NEXT: cmp x9, x8801; CHECK-NEXT: mov w8, #-1 // =0xffffffff802; CHECK-NEXT: cneg w0, w8, hs803; CHECK-NEXT: ret804 %m = tail call i32 @memcmp(ptr %X, ptr getelementptr inbounds ([513 x i8], ptr @.str, i32 0, i32 1), i64 15) nounwind805 ret i32 %m806}807 808define i1 @length15_eq(ptr %X, ptr %Y) nounwind {809; CHECK-LABEL: length15_eq:810; CHECK: // %bb.0:811; CHECK-NEXT: ldr x8, [x0]812; CHECK-NEXT: ldr x9, [x1]813; CHECK-NEXT: ldur x10, [x0, #7]814; CHECK-NEXT: ldur x11, [x1, #7]815; CHECK-NEXT: cmp x8, x9816; CHECK-NEXT: ccmp x10, x11, #0, eq817; CHECK-NEXT: cset w0, eq818; CHECK-NEXT: ret819 %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 15) nounwind820 %c = icmp eq i32 %m, 0821 ret i1 %c822}823 824define i1 @length15_gt_const(ptr %X, ptr %Y) nounwind {825; CHECK-LABEL: length15_gt_const:826; CHECK: // %bb.0:827; CHECK-NEXT: mov x8, #14136 // =0x3738828; CHECK-NEXT: ldr x9, [x0]829; CHECK-NEXT: movk x8, #13622, lsl #16830; CHECK-NEXT: movk x8, #13108, lsl #32831; CHECK-NEXT: rev x9, x9832; CHECK-NEXT: movk x8, #12594, lsl #48833; CHECK-NEXT: cmp x9, x8834; CHECK-NEXT: b.ne .LBB46_3835; CHECK-NEXT: // %bb.1: // %loadbb1836; CHECK-NEXT: mov x8, #13365 // =0x3435837; CHECK-NEXT: ldur x9, [x0, #7]838; CHECK-NEXT: movk x8, #12851, lsl #16839; CHECK-NEXT: movk x8, #12337, lsl #32840; CHECK-NEXT: rev x9, x9841; CHECK-NEXT: movk x8, #14393, lsl #48842; CHECK-NEXT: cmp x9, x8843; CHECK-NEXT: b.ne .LBB46_3844; CHECK-NEXT: // %bb.2:845; CHECK-NEXT: mov w8, wzr846; CHECK-NEXT: b .LBB46_4847; CHECK-NEXT: .LBB46_3: // %res_block848; CHECK-NEXT: cmp x9, x8849; CHECK-NEXT: mov w8, #-1 // =0xffffffff850; CHECK-NEXT: cneg w8, w8, hs851; CHECK-NEXT: .LBB46_4: // %endblock852; CHECK-NEXT: cmp w8, #0853; CHECK-NEXT: cset w0, gt854; CHECK-NEXT: ret855 %m = tail call i32 @memcmp(ptr %X, ptr getelementptr inbounds ([513 x i8], ptr @.str, i32 0, i32 1), i64 15) nounwind856 %c = icmp sgt i32 %m, 0857 ret i1 %c858}859 860 861define i32 @length16(ptr %X, ptr %Y) nounwind {862; CHECK-LABEL: length16:863; CHECK: // %bb.0:864; CHECK-NEXT: ldr x8, [x0]865; CHECK-NEXT: ldr x9, [x1]866; CHECK-NEXT: rev x8, x8867; CHECK-NEXT: rev x9, x9868; CHECK-NEXT: cmp x8, x9869; CHECK-NEXT: b.ne .LBB47_3870; CHECK-NEXT: // %bb.1: // %loadbb1871; CHECK-NEXT: ldr x8, [x0, #8]872; CHECK-NEXT: ldr x9, [x1, #8]873; CHECK-NEXT: rev x8, x8874; CHECK-NEXT: rev x9, x9875; CHECK-NEXT: cmp x8, x9876; CHECK-NEXT: b.ne .LBB47_3877; CHECK-NEXT: // %bb.2:878; CHECK-NEXT: mov w0, wzr879; CHECK-NEXT: ret880; CHECK-NEXT: .LBB47_3: // %res_block881; CHECK-NEXT: cmp x8, x9882; CHECK-NEXT: mov w8, #-1 // =0xffffffff883; CHECK-NEXT: cneg w0, w8, hs884; CHECK-NEXT: ret885 %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 16) nounwind886 ret i32 %m887}888 889define i1 @length16_eq(ptr %x, ptr %y) nounwind {890; CHECK-LABEL: length16_eq:891; CHECK: // %bb.0:892; CHECK-NEXT: ldp x8, x11, [x1]893; CHECK-NEXT: ldp x9, x10, [x0]894; CHECK-NEXT: cmp x9, x8895; CHECK-NEXT: ccmp x10, x11, #0, eq896; CHECK-NEXT: cset w0, ne897; CHECK-NEXT: ret898 %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 16) nounwind899 %cmp = icmp ne i32 %call, 0900 ret i1 %cmp901}902 903define i1 @length16_lt(ptr %x, ptr %y) nounwind {904; CHECK-LABEL: length16_lt:905; CHECK: // %bb.0:906; CHECK-NEXT: ldr x8, [x0]907; CHECK-NEXT: ldr x9, [x1]908; CHECK-NEXT: rev x8, x8909; CHECK-NEXT: rev x9, x9910; CHECK-NEXT: cmp x8, x9911; CHECK-NEXT: b.ne .LBB49_3912; CHECK-NEXT: // %bb.1: // %loadbb1913; CHECK-NEXT: ldr x8, [x0, #8]914; CHECK-NEXT: ldr x9, [x1, #8]915; CHECK-NEXT: rev x8, x8916; CHECK-NEXT: rev x9, x9917; CHECK-NEXT: cmp x8, x9918; CHECK-NEXT: b.ne .LBB49_3919; CHECK-NEXT: // %bb.2:920; CHECK-NEXT: lsr w0, wzr, #31921; CHECK-NEXT: ret922; CHECK-NEXT: .LBB49_3: // %res_block923; CHECK-NEXT: cmp x8, x9924; CHECK-NEXT: mov w8, #-1 // =0xffffffff925; CHECK-NEXT: cneg w8, w8, hs926; CHECK-NEXT: lsr w0, w8, #31927; CHECK-NEXT: ret928 %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 16) nounwind929 %cmp = icmp slt i32 %call, 0930 ret i1 %cmp931}932 933define i1 @length16_gt(ptr %x, ptr %y) nounwind {934; CHECK-LABEL: length16_gt:935; CHECK: // %bb.0:936; CHECK-NEXT: ldr x8, [x0]937; CHECK-NEXT: ldr x9, [x1]938; CHECK-NEXT: rev x8, x8939; CHECK-NEXT: rev x9, x9940; CHECK-NEXT: cmp x8, x9941; CHECK-NEXT: b.ne .LBB50_3942; CHECK-NEXT: // %bb.1: // %loadbb1943; CHECK-NEXT: ldr x8, [x0, #8]944; CHECK-NEXT: ldr x9, [x1, #8]945; CHECK-NEXT: rev x8, x8946; CHECK-NEXT: rev x9, x9947; CHECK-NEXT: cmp x8, x9948; CHECK-NEXT: b.ne .LBB50_3949; CHECK-NEXT: // %bb.2:950; CHECK-NEXT: mov w8, wzr951; CHECK-NEXT: b .LBB50_4952; CHECK-NEXT: .LBB50_3: // %res_block953; CHECK-NEXT: cmp x8, x9954; CHECK-NEXT: mov w8, #-1 // =0xffffffff955; CHECK-NEXT: cneg w8, w8, hs956; CHECK-NEXT: .LBB50_4: // %endblock957; CHECK-NEXT: cmp w8, #0958; CHECK-NEXT: cset w0, gt959; CHECK-NEXT: ret960 %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 16) nounwind961 %cmp = icmp sgt i32 %call, 0962 ret i1 %cmp963}964 965define i1 @length16_eq_const(ptr %X) nounwind {966; CHECK-LABEL: length16_eq_const:967; CHECK: // %bb.0:968; CHECK-NEXT: mov x8, #12592 // =0x3130969; CHECK-NEXT: ldp x9, x10, [x0]970; CHECK-NEXT: movk x8, #13106, lsl #16971; CHECK-NEXT: movk x8, #13620, lsl #32972; CHECK-NEXT: movk x8, #14134, lsl #48973; CHECK-NEXT: cmp x9, x8974; CHECK-NEXT: mov x8, #14648 // =0x3938975; CHECK-NEXT: movk x8, #12592, lsl #16976; CHECK-NEXT: movk x8, #13106, lsl #32977; CHECK-NEXT: movk x8, #13620, lsl #48978; CHECK-NEXT: ccmp x10, x8, #0, eq979; CHECK-NEXT: cset w0, eq980; CHECK-NEXT: ret981 %m = tail call i32 @memcmp(ptr %X, ptr @.str, i64 16) nounwind982 %c = icmp eq i32 %m, 0983 ret i1 %c984}985 986 987define i32 @length24(ptr %X, ptr %Y) nounwind {988; CHECK-LABEL: length24:989; CHECK: // %bb.0:990; CHECK-NEXT: ldr x8, [x0]991; CHECK-NEXT: ldr x9, [x1]992; CHECK-NEXT: rev x8, x8993; CHECK-NEXT: rev x9, x9994; CHECK-NEXT: cmp x8, x9995; CHECK-NEXT: b.ne .LBB52_4996; CHECK-NEXT: // %bb.1: // %loadbb1997; CHECK-NEXT: ldr x8, [x0, #8]998; CHECK-NEXT: ldr x9, [x1, #8]999; CHECK-NEXT: rev x8, x81000; CHECK-NEXT: rev x9, x91001; CHECK-NEXT: cmp x8, x91002; CHECK-NEXT: b.ne .LBB52_41003; CHECK-NEXT: // %bb.2: // %loadbb21004; CHECK-NEXT: ldr x8, [x0, #16]1005; CHECK-NEXT: ldr x9, [x1, #16]1006; CHECK-NEXT: rev x8, x81007; CHECK-NEXT: rev x9, x91008; CHECK-NEXT: cmp x8, x91009; CHECK-NEXT: b.ne .LBB52_41010; CHECK-NEXT: // %bb.3:1011; CHECK-NEXT: mov w0, wzr1012; CHECK-NEXT: ret1013; CHECK-NEXT: .LBB52_4: // %res_block1014; CHECK-NEXT: cmp x8, x91015; CHECK-NEXT: mov w8, #-1 // =0xffffffff1016; CHECK-NEXT: cneg w0, w8, hs1017; CHECK-NEXT: ret1018 %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 24) nounwind1019 ret i32 %m1020}1021 1022define i1 @length24_eq(ptr %x, ptr %y) nounwind {1023; CHECK-LABEL: length24_eq:1024; CHECK: // %bb.0:1025; CHECK-NEXT: ldp x8, x11, [x1]1026; CHECK-NEXT: ldr x12, [x0, #16]1027; CHECK-NEXT: ldp x9, x10, [x0]1028; CHECK-NEXT: ldr x13, [x1, #16]1029; CHECK-NEXT: cmp x9, x81030; CHECK-NEXT: ccmp x10, x11, #0, eq1031; CHECK-NEXT: ccmp x12, x13, #0, eq1032; CHECK-NEXT: cset w0, eq1033; CHECK-NEXT: ret1034 %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 24) nounwind1035 %cmp = icmp eq i32 %call, 01036 ret i1 %cmp1037}1038 1039define i1 @length24_lt(ptr %x, ptr %y) nounwind {1040; CHECK-LABEL: length24_lt:1041; CHECK: // %bb.0:1042; CHECK-NEXT: ldr x8, [x0]1043; CHECK-NEXT: ldr x9, [x1]1044; CHECK-NEXT: rev x8, x81045; CHECK-NEXT: rev x9, x91046; CHECK-NEXT: cmp x8, x91047; CHECK-NEXT: b.ne .LBB54_41048; CHECK-NEXT: // %bb.1: // %loadbb11049; CHECK-NEXT: ldr x8, [x0, #8]1050; CHECK-NEXT: ldr x9, [x1, #8]1051; CHECK-NEXT: rev x8, x81052; CHECK-NEXT: rev x9, x91053; CHECK-NEXT: cmp x8, x91054; CHECK-NEXT: b.ne .LBB54_41055; CHECK-NEXT: // %bb.2: // %loadbb21056; CHECK-NEXT: ldr x8, [x0, #16]1057; CHECK-NEXT: ldr x9, [x1, #16]1058; CHECK-NEXT: rev x8, x81059; CHECK-NEXT: rev x9, x91060; CHECK-NEXT: cmp x8, x91061; CHECK-NEXT: b.ne .LBB54_41062; CHECK-NEXT: // %bb.3:1063; CHECK-NEXT: lsr w0, wzr, #311064; CHECK-NEXT: ret1065; CHECK-NEXT: .LBB54_4: // %res_block1066; CHECK-NEXT: cmp x8, x91067; CHECK-NEXT: mov w8, #-1 // =0xffffffff1068; CHECK-NEXT: cneg w8, w8, hs1069; CHECK-NEXT: lsr w0, w8, #311070; CHECK-NEXT: ret1071 %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 24) nounwind1072 %cmp = icmp slt i32 %call, 01073 ret i1 %cmp1074}1075 1076define i1 @length24_gt(ptr %x, ptr %y) nounwind {1077; CHECK-LABEL: length24_gt:1078; CHECK: // %bb.0:1079; CHECK-NEXT: ldr x8, [x0]1080; CHECK-NEXT: ldr x9, [x1]1081; CHECK-NEXT: rev x8, x81082; CHECK-NEXT: rev x9, x91083; CHECK-NEXT: cmp x8, x91084; CHECK-NEXT: b.ne .LBB55_41085; CHECK-NEXT: // %bb.1: // %loadbb11086; CHECK-NEXT: ldr x8, [x0, #8]1087; CHECK-NEXT: ldr x9, [x1, #8]1088; CHECK-NEXT: rev x8, x81089; CHECK-NEXT: rev x9, x91090; CHECK-NEXT: cmp x8, x91091; CHECK-NEXT: b.ne .LBB55_41092; CHECK-NEXT: // %bb.2: // %loadbb21093; CHECK-NEXT: ldr x8, [x0, #16]1094; CHECK-NEXT: ldr x9, [x1, #16]1095; CHECK-NEXT: rev x8, x81096; CHECK-NEXT: rev x9, x91097; CHECK-NEXT: cmp x8, x91098; CHECK-NEXT: b.ne .LBB55_41099; CHECK-NEXT: // %bb.3:1100; CHECK-NEXT: mov w8, wzr1101; CHECK-NEXT: b .LBB55_51102; CHECK-NEXT: .LBB55_4: // %res_block1103; CHECK-NEXT: cmp x8, x91104; CHECK-NEXT: mov w8, #-1 // =0xffffffff1105; CHECK-NEXT: cneg w8, w8, hs1106; CHECK-NEXT: .LBB55_5: // %endblock1107; CHECK-NEXT: cmp w8, #01108; CHECK-NEXT: cset w0, gt1109; CHECK-NEXT: ret1110 %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 24) nounwind1111 %cmp = icmp sgt i32 %call, 01112 ret i1 %cmp1113}1114 1115define i1 @length24_eq_const(ptr %X) nounwind {1116; CHECK-LABEL: length24_eq_const:1117; CHECK: // %bb.0:1118; CHECK-NEXT: mov x8, #12592 // =0x31301119; CHECK-NEXT: ldp x9, x10, [x0]1120; CHECK-NEXT: movk x8, #13106, lsl #161121; CHECK-NEXT: ldr x11, [x0, #16]1122; CHECK-NEXT: movk x8, #13620, lsl #321123; CHECK-NEXT: movk x8, #14134, lsl #481124; CHECK-NEXT: cmp x9, x81125; CHECK-NEXT: mov x8, #14648 // =0x39381126; CHECK-NEXT: movk x8, #12592, lsl #161127; CHECK-NEXT: movk x8, #13106, lsl #321128; CHECK-NEXT: movk x8, #13620, lsl #481129; CHECK-NEXT: ccmp x10, x8, #0, eq1130; CHECK-NEXT: mov x8, #14134 // =0x37361131; CHECK-NEXT: movk x8, #14648, lsl #161132; CHECK-NEXT: movk x8, #12592, lsl #321133; CHECK-NEXT: movk x8, #13106, lsl #481134; CHECK-NEXT: ccmp x11, x8, #0, eq1135; CHECK-NEXT: cset w0, ne1136; CHECK-NEXT: ret1137 %m = tail call i32 @memcmp(ptr %X, ptr @.str, i64 24) nounwind1138 %c = icmp ne i32 %m, 01139 ret i1 %c1140}1141 1142define i32 @length31(ptr %X, ptr %Y) nounwind {1143; CHECK-LABEL: length31:1144; CHECK: // %bb.0:1145; CHECK-NEXT: ldr x8, [x0]1146; CHECK-NEXT: ldr x9, [x1]1147; CHECK-NEXT: rev x8, x81148; CHECK-NEXT: rev x9, x91149; CHECK-NEXT: cmp x8, x91150; CHECK-NEXT: b.ne .LBB57_51151; CHECK-NEXT: // %bb.1: // %loadbb11152; CHECK-NEXT: ldr x8, [x0, #8]1153; CHECK-NEXT: ldr x9, [x1, #8]1154; CHECK-NEXT: rev x8, x81155; CHECK-NEXT: rev x9, x91156; CHECK-NEXT: cmp x8, x91157; CHECK-NEXT: b.ne .LBB57_51158; CHECK-NEXT: // %bb.2: // %loadbb21159; CHECK-NEXT: ldr x8, [x0, #16]1160; CHECK-NEXT: ldr x9, [x1, #16]1161; CHECK-NEXT: rev x8, x81162; CHECK-NEXT: rev x9, x91163; CHECK-NEXT: cmp x8, x91164; CHECK-NEXT: b.ne .LBB57_51165; CHECK-NEXT: // %bb.3: // %loadbb31166; CHECK-NEXT: ldur x8, [x0, #23]1167; CHECK-NEXT: ldur x9, [x1, #23]1168; CHECK-NEXT: rev x8, x81169; CHECK-NEXT: rev x9, x91170; CHECK-NEXT: cmp x8, x91171; CHECK-NEXT: b.ne .LBB57_51172; CHECK-NEXT: // %bb.4:1173; CHECK-NEXT: mov w0, wzr1174; CHECK-NEXT: ret1175; CHECK-NEXT: .LBB57_5: // %res_block1176; CHECK-NEXT: cmp x8, x91177; CHECK-NEXT: mov w8, #-1 // =0xffffffff1178; CHECK-NEXT: cneg w0, w8, hs1179; CHECK-NEXT: ret1180 %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 31) nounwind1181 ret i32 %m1182}1183 1184define i1 @length31_eq(ptr %x, ptr %y) nounwind {1185; CHECK-LABEL: length31_eq:1186; CHECK: // %bb.0:1187; CHECK-NEXT: ldp x8, x11, [x1]1188; CHECK-NEXT: ldr x12, [x0, #16]1189; CHECK-NEXT: ldp x9, x10, [x0]1190; CHECK-NEXT: ldr x13, [x1, #16]1191; CHECK-NEXT: cmp x9, x81192; CHECK-NEXT: ldur x8, [x0, #23]1193; CHECK-NEXT: ldur x9, [x1, #23]1194; CHECK-NEXT: ccmp x10, x11, #0, eq1195; CHECK-NEXT: ccmp x12, x13, #0, eq1196; CHECK-NEXT: ccmp x8, x9, #0, eq1197; CHECK-NEXT: cset w0, eq1198; CHECK-NEXT: ret1199 %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 31) nounwind1200 %cmp = icmp eq i32 %call, 01201 ret i1 %cmp1202}1203 1204define i1 @length31_lt(ptr %x, ptr %y) nounwind {1205; CHECK-LABEL: length31_lt:1206; CHECK: // %bb.0:1207; CHECK-NEXT: ldr x8, [x0]1208; CHECK-NEXT: ldr x9, [x1]1209; CHECK-NEXT: rev x8, x81210; CHECK-NEXT: rev x9, x91211; CHECK-NEXT: cmp x8, x91212; CHECK-NEXT: b.ne .LBB59_51213; CHECK-NEXT: // %bb.1: // %loadbb11214; CHECK-NEXT: ldr x8, [x0, #8]1215; CHECK-NEXT: ldr x9, [x1, #8]1216; CHECK-NEXT: rev x8, x81217; CHECK-NEXT: rev x9, x91218; CHECK-NEXT: cmp x8, x91219; CHECK-NEXT: b.ne .LBB59_51220; CHECK-NEXT: // %bb.2: // %loadbb21221; CHECK-NEXT: ldr x8, [x0, #16]1222; CHECK-NEXT: ldr x9, [x1, #16]1223; CHECK-NEXT: rev x8, x81224; CHECK-NEXT: rev x9, x91225; CHECK-NEXT: cmp x8, x91226; CHECK-NEXT: b.ne .LBB59_51227; CHECK-NEXT: // %bb.3: // %loadbb31228; CHECK-NEXT: ldur x8, [x0, #23]1229; CHECK-NEXT: ldur x9, [x1, #23]1230; CHECK-NEXT: rev x8, x81231; CHECK-NEXT: rev x9, x91232; CHECK-NEXT: cmp x8, x91233; CHECK-NEXT: b.ne .LBB59_51234; CHECK-NEXT: // %bb.4:1235; CHECK-NEXT: lsr w0, wzr, #311236; CHECK-NEXT: ret1237; CHECK-NEXT: .LBB59_5: // %res_block1238; CHECK-NEXT: cmp x8, x91239; CHECK-NEXT: mov w8, #-1 // =0xffffffff1240; CHECK-NEXT: cneg w8, w8, hs1241; CHECK-NEXT: lsr w0, w8, #311242; CHECK-NEXT: ret1243 %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 31) nounwind1244 %cmp = icmp slt i32 %call, 01245 ret i1 %cmp1246}1247 1248define i1 @length31_gt(ptr %x, ptr %y) nounwind {1249; CHECK-LABEL: length31_gt:1250; CHECK: // %bb.0:1251; CHECK-NEXT: ldr x8, [x0]1252; CHECK-NEXT: ldr x9, [x1]1253; CHECK-NEXT: rev x8, x81254; CHECK-NEXT: rev x9, x91255; CHECK-NEXT: cmp x8, x91256; CHECK-NEXT: b.ne .LBB60_51257; CHECK-NEXT: // %bb.1: // %loadbb11258; CHECK-NEXT: ldr x8, [x0, #8]1259; CHECK-NEXT: ldr x9, [x1, #8]1260; CHECK-NEXT: rev x8, x81261; CHECK-NEXT: rev x9, x91262; CHECK-NEXT: cmp x8, x91263; CHECK-NEXT: b.ne .LBB60_51264; CHECK-NEXT: // %bb.2: // %loadbb21265; CHECK-NEXT: ldr x8, [x0, #16]1266; CHECK-NEXT: ldr x9, [x1, #16]1267; CHECK-NEXT: rev x8, x81268; CHECK-NEXT: rev x9, x91269; CHECK-NEXT: cmp x8, x91270; CHECK-NEXT: b.ne .LBB60_51271; CHECK-NEXT: // %bb.3: // %loadbb31272; CHECK-NEXT: ldur x8, [x0, #23]1273; CHECK-NEXT: ldur x9, [x1, #23]1274; CHECK-NEXT: rev x8, x81275; CHECK-NEXT: rev x9, x91276; CHECK-NEXT: cmp x8, x91277; CHECK-NEXT: b.ne .LBB60_51278; CHECK-NEXT: // %bb.4:1279; CHECK-NEXT: mov w8, wzr1280; CHECK-NEXT: b .LBB60_61281; CHECK-NEXT: .LBB60_5: // %res_block1282; CHECK-NEXT: cmp x8, x91283; CHECK-NEXT: mov w8, #-1 // =0xffffffff1284; CHECK-NEXT: cneg w8, w8, hs1285; CHECK-NEXT: .LBB60_6: // %endblock1286; CHECK-NEXT: cmp w8, #01287; CHECK-NEXT: cset w0, gt1288; CHECK-NEXT: ret1289 %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 31) nounwind1290 %cmp = icmp sgt i32 %call, 01291 ret i1 %cmp1292}1293 1294define i1 @length31_eq_prefer128(ptr %x, ptr %y) nounwind "prefer-vector-width"="128" {1295; CHECK-LABEL: length31_eq_prefer128:1296; CHECK: // %bb.0:1297; CHECK-NEXT: ldp x8, x11, [x1]1298; CHECK-NEXT: ldr x12, [x0, #16]1299; CHECK-NEXT: ldp x9, x10, [x0]1300; CHECK-NEXT: ldr x13, [x1, #16]1301; CHECK-NEXT: cmp x9, x81302; CHECK-NEXT: ldur x8, [x0, #23]1303; CHECK-NEXT: ldur x9, [x1, #23]1304; CHECK-NEXT: ccmp x10, x11, #0, eq1305; CHECK-NEXT: ccmp x12, x13, #0, eq1306; CHECK-NEXT: ccmp x8, x9, #0, eq1307; CHECK-NEXT: cset w0, eq1308; CHECK-NEXT: ret1309 %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 31) nounwind1310 %cmp = icmp eq i32 %call, 01311 ret i1 %cmp1312}1313 1314define i1 @length31_eq_const(ptr %X) nounwind {1315; CHECK-LABEL: length31_eq_const:1316; CHECK: // %bb.0:1317; CHECK-NEXT: mov x8, #12592 // =0x31301318; CHECK-NEXT: ldp x9, x10, [x0]1319; CHECK-NEXT: movk x8, #13106, lsl #161320; CHECK-NEXT: ldr x11, [x0, #16]1321; CHECK-NEXT: movk x8, #13620, lsl #321322; CHECK-NEXT: movk x8, #14134, lsl #481323; CHECK-NEXT: cmp x9, x81324; CHECK-NEXT: mov x8, #14648 // =0x39381325; CHECK-NEXT: ldur x9, [x0, #23]1326; CHECK-NEXT: movk x8, #12592, lsl #161327; CHECK-NEXT: movk x8, #13106, lsl #321328; CHECK-NEXT: movk x8, #13620, lsl #481329; CHECK-NEXT: ccmp x10, x8, #0, eq1330; CHECK-NEXT: mov x8, #14134 // =0x37361331; CHECK-NEXT: movk x8, #14648, lsl #161332; CHECK-NEXT: movk x8, #12592, lsl #321333; CHECK-NEXT: movk x8, #13106, lsl #481334; CHECK-NEXT: ccmp x11, x8, #0, eq1335; CHECK-NEXT: mov x8, #13363 // =0x34331336; CHECK-NEXT: movk x8, #13877, lsl #161337; CHECK-NEXT: movk x8, #14391, lsl #321338; CHECK-NEXT: movk x8, #12345, lsl #481339; CHECK-NEXT: ccmp x9, x8, #0, eq1340; CHECK-NEXT: cset w0, ne1341; CHECK-NEXT: ret1342 %m = tail call i32 @memcmp(ptr %X, ptr @.str, i64 31) nounwind1343 %c = icmp ne i32 %m, 01344 ret i1 %c1345}1346 1347define i32 @length32(ptr %X, ptr %Y) nounwind {1348; CHECK-LABEL: length32:1349; CHECK: // %bb.0:1350; CHECK-NEXT: ldr x8, [x0]1351; CHECK-NEXT: ldr x9, [x1]1352; CHECK-NEXT: rev x8, x81353; CHECK-NEXT: rev x9, x91354; CHECK-NEXT: cmp x8, x91355; CHECK-NEXT: b.ne .LBB63_51356; CHECK-NEXT: // %bb.1: // %loadbb11357; CHECK-NEXT: ldr x8, [x0, #8]1358; CHECK-NEXT: ldr x9, [x1, #8]1359; CHECK-NEXT: rev x8, x81360; CHECK-NEXT: rev x9, x91361; CHECK-NEXT: cmp x8, x91362; CHECK-NEXT: b.ne .LBB63_51363; CHECK-NEXT: // %bb.2: // %loadbb21364; CHECK-NEXT: ldr x8, [x0, #16]1365; CHECK-NEXT: ldr x9, [x1, #16]1366; CHECK-NEXT: rev x8, x81367; CHECK-NEXT: rev x9, x91368; CHECK-NEXT: cmp x8, x91369; CHECK-NEXT: b.ne .LBB63_51370; CHECK-NEXT: // %bb.3: // %loadbb31371; CHECK-NEXT: ldr x8, [x0, #24]1372; CHECK-NEXT: ldr x9, [x1, #24]1373; CHECK-NEXT: rev x8, x81374; CHECK-NEXT: rev x9, x91375; CHECK-NEXT: cmp x8, x91376; CHECK-NEXT: b.ne .LBB63_51377; CHECK-NEXT: // %bb.4:1378; CHECK-NEXT: mov w0, wzr1379; CHECK-NEXT: ret1380; CHECK-NEXT: .LBB63_5: // %res_block1381; CHECK-NEXT: cmp x8, x91382; CHECK-NEXT: mov w8, #-1 // =0xffffffff1383; CHECK-NEXT: cneg w0, w8, hs1384; CHECK-NEXT: ret1385 %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 32) nounwind1386 ret i32 %m1387}1388 1389 1390define i1 @length32_eq(ptr %x, ptr %y) nounwind {1391; CHECK-LABEL: length32_eq:1392; CHECK: // %bb.0:1393; CHECK-NEXT: ldp x8, x11, [x1]1394; CHECK-NEXT: ldp x9, x10, [x0]1395; CHECK-NEXT: ldp x12, x13, [x1, #16]1396; CHECK-NEXT: cmp x9, x81397; CHECK-NEXT: ldp x8, x9, [x0, #16]1398; CHECK-NEXT: ccmp x10, x11, #0, eq1399; CHECK-NEXT: ccmp x8, x12, #0, eq1400; CHECK-NEXT: ccmp x9, x13, #0, eq1401; CHECK-NEXT: cset w0, eq1402; CHECK-NEXT: ret1403 %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 32) nounwind1404 %cmp = icmp eq i32 %call, 01405 ret i1 %cmp1406}1407 1408define i1 @length32_lt(ptr %x, ptr %y) nounwind {1409; CHECK-LABEL: length32_lt:1410; CHECK: // %bb.0:1411; CHECK-NEXT: ldr x8, [x0]1412; CHECK-NEXT: ldr x9, [x1]1413; CHECK-NEXT: rev x8, x81414; CHECK-NEXT: rev x9, x91415; CHECK-NEXT: cmp x8, x91416; CHECK-NEXT: b.ne .LBB65_51417; CHECK-NEXT: // %bb.1: // %loadbb11418; CHECK-NEXT: ldr x8, [x0, #8]1419; CHECK-NEXT: ldr x9, [x1, #8]1420; CHECK-NEXT: rev x8, x81421; CHECK-NEXT: rev x9, x91422; CHECK-NEXT: cmp x8, x91423; CHECK-NEXT: b.ne .LBB65_51424; CHECK-NEXT: // %bb.2: // %loadbb21425; CHECK-NEXT: ldr x8, [x0, #16]1426; CHECK-NEXT: ldr x9, [x1, #16]1427; CHECK-NEXT: rev x8, x81428; CHECK-NEXT: rev x9, x91429; CHECK-NEXT: cmp x8, x91430; CHECK-NEXT: b.ne .LBB65_51431; CHECK-NEXT: // %bb.3: // %loadbb31432; CHECK-NEXT: ldr x8, [x0, #24]1433; CHECK-NEXT: ldr x9, [x1, #24]1434; CHECK-NEXT: rev x8, x81435; CHECK-NEXT: rev x9, x91436; CHECK-NEXT: cmp x8, x91437; CHECK-NEXT: b.ne .LBB65_51438; CHECK-NEXT: // %bb.4:1439; CHECK-NEXT: lsr w0, wzr, #311440; CHECK-NEXT: ret1441; CHECK-NEXT: .LBB65_5: // %res_block1442; CHECK-NEXT: cmp x8, x91443; CHECK-NEXT: mov w8, #-1 // =0xffffffff1444; CHECK-NEXT: cneg w8, w8, hs1445; CHECK-NEXT: lsr w0, w8, #311446; CHECK-NEXT: ret1447 %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 32) nounwind1448 %cmp = icmp slt i32 %call, 01449 ret i1 %cmp1450}1451 1452define i1 @length32_gt(ptr %x, ptr %y) nounwind {1453; CHECK-LABEL: length32_gt:1454; CHECK: // %bb.0:1455; CHECK-NEXT: ldr x8, [x0]1456; CHECK-NEXT: ldr x9, [x1]1457; CHECK-NEXT: rev x8, x81458; CHECK-NEXT: rev x9, x91459; CHECK-NEXT: cmp x8, x91460; CHECK-NEXT: b.ne .LBB66_51461; CHECK-NEXT: // %bb.1: // %loadbb11462; CHECK-NEXT: ldr x8, [x0, #8]1463; CHECK-NEXT: ldr x9, [x1, #8]1464; CHECK-NEXT: rev x8, x81465; CHECK-NEXT: rev x9, x91466; CHECK-NEXT: cmp x8, x91467; CHECK-NEXT: b.ne .LBB66_51468; CHECK-NEXT: // %bb.2: // %loadbb21469; CHECK-NEXT: ldr x8, [x0, #16]1470; CHECK-NEXT: ldr x9, [x1, #16]1471; CHECK-NEXT: rev x8, x81472; CHECK-NEXT: rev x9, x91473; CHECK-NEXT: cmp x8, x91474; CHECK-NEXT: b.ne .LBB66_51475; CHECK-NEXT: // %bb.3: // %loadbb31476; CHECK-NEXT: ldr x8, [x0, #24]1477; CHECK-NEXT: ldr x9, [x1, #24]1478; CHECK-NEXT: rev x8, x81479; CHECK-NEXT: rev x9, x91480; CHECK-NEXT: cmp x8, x91481; CHECK-NEXT: b.ne .LBB66_51482; CHECK-NEXT: // %bb.4:1483; CHECK-NEXT: mov w8, wzr1484; CHECK-NEXT: b .LBB66_61485; CHECK-NEXT: .LBB66_5: // %res_block1486; CHECK-NEXT: cmp x8, x91487; CHECK-NEXT: mov w8, #-1 // =0xffffffff1488; CHECK-NEXT: cneg w8, w8, hs1489; CHECK-NEXT: .LBB66_6: // %endblock1490; CHECK-NEXT: cmp w8, #01491; CHECK-NEXT: cset w0, gt1492; CHECK-NEXT: ret1493 %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 32) nounwind1494 %cmp = icmp sgt i32 %call, 01495 ret i1 %cmp1496}1497 1498define i1 @length32_eq_prefer128(ptr %x, ptr %y) nounwind "prefer-vector-width"="128" {1499; CHECK-LABEL: length32_eq_prefer128:1500; CHECK: // %bb.0:1501; CHECK-NEXT: ldp x8, x11, [x1]1502; CHECK-NEXT: ldp x9, x10, [x0]1503; CHECK-NEXT: ldp x12, x13, [x1, #16]1504; CHECK-NEXT: cmp x9, x81505; CHECK-NEXT: ldp x8, x9, [x0, #16]1506; CHECK-NEXT: ccmp x10, x11, #0, eq1507; CHECK-NEXT: ccmp x8, x12, #0, eq1508; CHECK-NEXT: ccmp x9, x13, #0, eq1509; CHECK-NEXT: cset w0, eq1510; CHECK-NEXT: ret1511 %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 32) nounwind1512 %cmp = icmp eq i32 %call, 01513 ret i1 %cmp1514}1515 1516define i1 @length32_eq_const(ptr %X) nounwind {1517; CHECK-LABEL: length32_eq_const:1518; CHECK: // %bb.0:1519; CHECK-NEXT: mov x8, #12592 // =0x31301520; CHECK-NEXT: ldp x9, x10, [x0]1521; CHECK-NEXT: movk x8, #13106, lsl #161522; CHECK-NEXT: movk x8, #13620, lsl #321523; CHECK-NEXT: movk x8, #14134, lsl #481524; CHECK-NEXT: cmp x9, x81525; CHECK-NEXT: mov x8, #14648 // =0x39381526; CHECK-NEXT: movk x8, #12592, lsl #161527; CHECK-NEXT: ldp x9, x11, [x0, #16]1528; CHECK-NEXT: movk x8, #13106, lsl #321529; CHECK-NEXT: movk x8, #13620, lsl #481530; CHECK-NEXT: ccmp x10, x8, #0, eq1531; CHECK-NEXT: mov x8, #14134 // =0x37361532; CHECK-NEXT: movk x8, #14648, lsl #161533; CHECK-NEXT: movk x8, #12592, lsl #321534; CHECK-NEXT: movk x8, #13106, lsl #481535; CHECK-NEXT: ccmp x9, x8, #0, eq1536; CHECK-NEXT: mov x8, #13620 // =0x35341537; CHECK-NEXT: movk x8, #14134, lsl #161538; CHECK-NEXT: movk x8, #14648, lsl #321539; CHECK-NEXT: movk x8, #12592, lsl #481540; CHECK-NEXT: ccmp x11, x8, #0, eq1541; CHECK-NEXT: cset w0, ne1542; CHECK-NEXT: ret1543 %m = tail call i32 @memcmp(ptr %X, ptr @.str, i64 32) nounwind1544 %c = icmp ne i32 %m, 01545 ret i1 %c1546}1547 1548define i32 @length48(ptr %X, ptr %Y) nounwind {1549; CHECK-LABEL: length48:1550; CHECK: // %bb.0:1551; CHECK-NEXT: ldr x8, [x0]1552; CHECK-NEXT: ldr x9, [x1]1553; CHECK-NEXT: rev x8, x81554; CHECK-NEXT: rev x9, x91555; CHECK-NEXT: cmp x8, x91556; CHECK-NEXT: b.ne .LBB69_71557; CHECK-NEXT: // %bb.1: // %loadbb11558; CHECK-NEXT: ldr x8, [x0, #8]1559; CHECK-NEXT: ldr x9, [x1, #8]1560; CHECK-NEXT: rev x8, x81561; CHECK-NEXT: rev x9, x91562; CHECK-NEXT: cmp x8, x91563; CHECK-NEXT: b.ne .LBB69_71564; CHECK-NEXT: // %bb.2: // %loadbb21565; CHECK-NEXT: ldr x8, [x0, #16]1566; CHECK-NEXT: ldr x9, [x1, #16]1567; CHECK-NEXT: rev x8, x81568; CHECK-NEXT: rev x9, x91569; CHECK-NEXT: cmp x8, x91570; CHECK-NEXT: b.ne .LBB69_71571; CHECK-NEXT: // %bb.3: // %loadbb31572; CHECK-NEXT: ldr x8, [x0, #24]1573; CHECK-NEXT: ldr x9, [x1, #24]1574; CHECK-NEXT: rev x8, x81575; CHECK-NEXT: rev x9, x91576; CHECK-NEXT: cmp x8, x91577; CHECK-NEXT: b.ne .LBB69_71578; CHECK-NEXT: // %bb.4: // %loadbb41579; CHECK-NEXT: ldr x8, [x0, #32]1580; CHECK-NEXT: ldr x9, [x1, #32]1581; CHECK-NEXT: rev x8, x81582; CHECK-NEXT: rev x9, x91583; CHECK-NEXT: cmp x8, x91584; CHECK-NEXT: b.ne .LBB69_71585; CHECK-NEXT: // %bb.5: // %loadbb51586; CHECK-NEXT: ldr x8, [x0, #40]1587; CHECK-NEXT: ldr x9, [x1, #40]1588; CHECK-NEXT: rev x8, x81589; CHECK-NEXT: rev x9, x91590; CHECK-NEXT: cmp x8, x91591; CHECK-NEXT: b.ne .LBB69_71592; CHECK-NEXT: // %bb.6:1593; CHECK-NEXT: mov w0, wzr1594; CHECK-NEXT: ret1595; CHECK-NEXT: .LBB69_7: // %res_block1596; CHECK-NEXT: cmp x8, x91597; CHECK-NEXT: mov w8, #-1 // =0xffffffff1598; CHECK-NEXT: cneg w0, w8, hs1599; CHECK-NEXT: ret1600 %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 48) nounwind1601 ret i32 %m1602}1603 1604define i1 @length48_eq(ptr %x, ptr %y) nounwind {1605; CHECK-LABEL: length48_eq:1606; CHECK: // %bb.0:1607; CHECK-NEXT: ldp x8, x11, [x1]1608; CHECK-NEXT: ldp x9, x10, [x0]1609; CHECK-NEXT: ldp x12, x13, [x1, #16]1610; CHECK-NEXT: cmp x9, x81611; CHECK-NEXT: ldp x8, x9, [x0, #16]1612; CHECK-NEXT: ccmp x10, x11, #0, eq1613; CHECK-NEXT: ccmp x8, x12, #0, eq1614; CHECK-NEXT: ldp x8, x11, [x0, #32]1615; CHECK-NEXT: ldp x10, x12, [x1, #32]1616; CHECK-NEXT: ccmp x9, x13, #0, eq1617; CHECK-NEXT: ccmp x8, x10, #0, eq1618; CHECK-NEXT: ccmp x11, x12, #0, eq1619; CHECK-NEXT: cset w0, eq1620; CHECK-NEXT: ret1621 %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 48) nounwind1622 %cmp = icmp eq i32 %call, 01623 ret i1 %cmp1624}1625 1626define i1 @length48_lt(ptr %x, ptr %y) nounwind {1627; CHECK-LABEL: length48_lt:1628; CHECK: // %bb.0:1629; CHECK-NEXT: ldr x8, [x0]1630; CHECK-NEXT: ldr x9, [x1]1631; CHECK-NEXT: rev x8, x81632; CHECK-NEXT: rev x9, x91633; CHECK-NEXT: cmp x8, x91634; CHECK-NEXT: b.ne .LBB71_71635; CHECK-NEXT: // %bb.1: // %loadbb11636; CHECK-NEXT: ldr x8, [x0, #8]1637; CHECK-NEXT: ldr x9, [x1, #8]1638; CHECK-NEXT: rev x8, x81639; CHECK-NEXT: rev x9, x91640; CHECK-NEXT: cmp x8, x91641; CHECK-NEXT: b.ne .LBB71_71642; CHECK-NEXT: // %bb.2: // %loadbb21643; CHECK-NEXT: ldr x8, [x0, #16]1644; CHECK-NEXT: ldr x9, [x1, #16]1645; CHECK-NEXT: rev x8, x81646; CHECK-NEXT: rev x9, x91647; CHECK-NEXT: cmp x8, x91648; CHECK-NEXT: b.ne .LBB71_71649; CHECK-NEXT: // %bb.3: // %loadbb31650; CHECK-NEXT: ldr x8, [x0, #24]1651; CHECK-NEXT: ldr x9, [x1, #24]1652; CHECK-NEXT: rev x8, x81653; CHECK-NEXT: rev x9, x91654; CHECK-NEXT: cmp x8, x91655; CHECK-NEXT: b.ne .LBB71_71656; CHECK-NEXT: // %bb.4: // %loadbb41657; CHECK-NEXT: ldr x8, [x0, #32]1658; CHECK-NEXT: ldr x9, [x1, #32]1659; CHECK-NEXT: rev x8, x81660; CHECK-NEXT: rev x9, x91661; CHECK-NEXT: cmp x8, x91662; CHECK-NEXT: b.ne .LBB71_71663; CHECK-NEXT: // %bb.5: // %loadbb51664; CHECK-NEXT: ldr x8, [x0, #40]1665; CHECK-NEXT: ldr x9, [x1, #40]1666; CHECK-NEXT: rev x8, x81667; CHECK-NEXT: rev x9, x91668; CHECK-NEXT: cmp x8, x91669; CHECK-NEXT: b.ne .LBB71_71670; CHECK-NEXT: // %bb.6:1671; CHECK-NEXT: lsr w0, wzr, #311672; CHECK-NEXT: ret1673; CHECK-NEXT: .LBB71_7: // %res_block1674; CHECK-NEXT: cmp x8, x91675; CHECK-NEXT: mov w8, #-1 // =0xffffffff1676; CHECK-NEXT: cneg w8, w8, hs1677; CHECK-NEXT: lsr w0, w8, #311678; CHECK-NEXT: ret1679 %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 48) nounwind1680 %cmp = icmp slt i32 %call, 01681 ret i1 %cmp1682}1683 1684define i1 @length48_gt(ptr %x, ptr %y) nounwind {1685; CHECK-LABEL: length48_gt:1686; CHECK: // %bb.0:1687; CHECK-NEXT: ldr x8, [x0]1688; CHECK-NEXT: ldr x9, [x1]1689; CHECK-NEXT: rev x8, x81690; CHECK-NEXT: rev x9, x91691; CHECK-NEXT: cmp x8, x91692; CHECK-NEXT: b.ne .LBB72_71693; CHECK-NEXT: // %bb.1: // %loadbb11694; CHECK-NEXT: ldr x8, [x0, #8]1695; CHECK-NEXT: ldr x9, [x1, #8]1696; CHECK-NEXT: rev x8, x81697; CHECK-NEXT: rev x9, x91698; CHECK-NEXT: cmp x8, x91699; CHECK-NEXT: b.ne .LBB72_71700; CHECK-NEXT: // %bb.2: // %loadbb21701; CHECK-NEXT: ldr x8, [x0, #16]1702; CHECK-NEXT: ldr x9, [x1, #16]1703; CHECK-NEXT: rev x8, x81704; CHECK-NEXT: rev x9, x91705; CHECK-NEXT: cmp x8, x91706; CHECK-NEXT: b.ne .LBB72_71707; CHECK-NEXT: // %bb.3: // %loadbb31708; CHECK-NEXT: ldr x8, [x0, #24]1709; CHECK-NEXT: ldr x9, [x1, #24]1710; CHECK-NEXT: rev x8, x81711; CHECK-NEXT: rev x9, x91712; CHECK-NEXT: cmp x8, x91713; CHECK-NEXT: b.ne .LBB72_71714; CHECK-NEXT: // %bb.4: // %loadbb41715; CHECK-NEXT: ldr x8, [x0, #32]1716; CHECK-NEXT: ldr x9, [x1, #32]1717; CHECK-NEXT: rev x8, x81718; CHECK-NEXT: rev x9, x91719; CHECK-NEXT: cmp x8, x91720; CHECK-NEXT: b.ne .LBB72_71721; CHECK-NEXT: // %bb.5: // %loadbb51722; CHECK-NEXT: ldr x8, [x0, #40]1723; CHECK-NEXT: ldr x9, [x1, #40]1724; CHECK-NEXT: rev x8, x81725; CHECK-NEXT: rev x9, x91726; CHECK-NEXT: cmp x8, x91727; CHECK-NEXT: b.ne .LBB72_71728; CHECK-NEXT: // %bb.6:1729; CHECK-NEXT: mov w8, wzr1730; CHECK-NEXT: b .LBB72_81731; CHECK-NEXT: .LBB72_7: // %res_block1732; CHECK-NEXT: cmp x8, x91733; CHECK-NEXT: mov w8, #-1 // =0xffffffff1734; CHECK-NEXT: cneg w8, w8, hs1735; CHECK-NEXT: .LBB72_8: // %endblock1736; CHECK-NEXT: cmp w8, #01737; CHECK-NEXT: cset w0, gt1738; CHECK-NEXT: ret1739 %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 48) nounwind1740 %cmp = icmp sgt i32 %call, 01741 ret i1 %cmp1742}1743 1744define i1 @length48_eq_prefer128(ptr %x, ptr %y) nounwind "prefer-vector-width"="128" {1745; CHECK-LABEL: length48_eq_prefer128:1746; CHECK: // %bb.0:1747; CHECK-NEXT: ldp x8, x11, [x1]1748; CHECK-NEXT: ldp x9, x10, [x0]1749; CHECK-NEXT: ldp x12, x13, [x1, #16]1750; CHECK-NEXT: cmp x9, x81751; CHECK-NEXT: ldp x8, x9, [x0, #16]1752; CHECK-NEXT: ccmp x10, x11, #0, eq1753; CHECK-NEXT: ccmp x8, x12, #0, eq1754; CHECK-NEXT: ldp x8, x11, [x0, #32]1755; CHECK-NEXT: ldp x10, x12, [x1, #32]1756; CHECK-NEXT: ccmp x9, x13, #0, eq1757; CHECK-NEXT: ccmp x8, x10, #0, eq1758; CHECK-NEXT: ccmp x11, x12, #0, eq1759; CHECK-NEXT: cset w0, eq1760; CHECK-NEXT: ret1761 %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 48) nounwind1762 %cmp = icmp eq i32 %call, 01763 ret i1 %cmp1764}1765 1766define i1 @length48_eq_const(ptr %X) nounwind {1767; CHECK-LABEL: length48_eq_const:1768; CHECK: // %bb.0:1769; CHECK-NEXT: mov x8, #12592 // =0x31301770; CHECK-NEXT: ldp x9, x10, [x0]1771; CHECK-NEXT: movk x8, #13106, lsl #161772; CHECK-NEXT: ldp x11, x12, [x0, #16]1773; CHECK-NEXT: movk x8, #13620, lsl #321774; CHECK-NEXT: movk x8, #14134, lsl #481775; CHECK-NEXT: cmp x9, x81776; CHECK-NEXT: mov x9, #14648 // =0x39381777; CHECK-NEXT: movk x9, #12592, lsl #161778; CHECK-NEXT: movk x9, #13106, lsl #321779; CHECK-NEXT: movk x9, #13620, lsl #481780; CHECK-NEXT: ccmp x10, x9, #0, eq1781; CHECK-NEXT: mov x9, #14134 // =0x37361782; CHECK-NEXT: movk x9, #14648, lsl #161783; CHECK-NEXT: movk x9, #12592, lsl #321784; CHECK-NEXT: movk x9, #13106, lsl #481785; CHECK-NEXT: ccmp x11, x9, #0, eq1786; CHECK-NEXT: mov x9, #13620 // =0x35341787; CHECK-NEXT: movk x9, #14134, lsl #161788; CHECK-NEXT: ldp x10, x11, [x0, #32]1789; CHECK-NEXT: movk x9, #14648, lsl #321790; CHECK-NEXT: movk x9, #12592, lsl #481791; CHECK-NEXT: ccmp x12, x9, #0, eq1792; CHECK-NEXT: mov x9, #13106 // =0x33321793; CHECK-NEXT: movk x9, #13620, lsl #161794; CHECK-NEXT: movk x9, #14134, lsl #321795; CHECK-NEXT: movk x9, #14648, lsl #481796; CHECK-NEXT: ccmp x10, x9, #0, eq1797; CHECK-NEXT: ccmp x11, x8, #0, eq1798; CHECK-NEXT: cset w0, ne1799; CHECK-NEXT: ret1800 %m = tail call i32 @memcmp(ptr %X, ptr @.str, i64 48) nounwind1801 %c = icmp ne i32 %m, 01802 ret i1 %c1803}1804 1805define i32 @length63(ptr %X, ptr %Y) nounwind {1806; CHECK-LABEL: length63:1807; CHECK: // %bb.0:1808; CHECK-NEXT: ldr x8, [x0]1809; CHECK-NEXT: ldr x9, [x1]1810; CHECK-NEXT: rev x8, x81811; CHECK-NEXT: rev x9, x91812; CHECK-NEXT: cmp x8, x91813; CHECK-NEXT: b.ne .LBB75_91814; CHECK-NEXT: // %bb.1: // %loadbb11815; CHECK-NEXT: ldr x8, [x0, #8]1816; CHECK-NEXT: ldr x9, [x1, #8]1817; CHECK-NEXT: rev x8, x81818; CHECK-NEXT: rev x9, x91819; CHECK-NEXT: cmp x8, x91820; CHECK-NEXT: b.ne .LBB75_91821; CHECK-NEXT: // %bb.2: // %loadbb21822; CHECK-NEXT: ldr x8, [x0, #16]1823; CHECK-NEXT: ldr x9, [x1, #16]1824; CHECK-NEXT: rev x8, x81825; CHECK-NEXT: rev x9, x91826; CHECK-NEXT: cmp x8, x91827; CHECK-NEXT: b.ne .LBB75_91828; CHECK-NEXT: // %bb.3: // %loadbb31829; CHECK-NEXT: ldr x8, [x0, #24]1830; CHECK-NEXT: ldr x9, [x1, #24]1831; CHECK-NEXT: rev x8, x81832; CHECK-NEXT: rev x9, x91833; CHECK-NEXT: cmp x8, x91834; CHECK-NEXT: b.ne .LBB75_91835; CHECK-NEXT: // %bb.4: // %loadbb41836; CHECK-NEXT: ldr x8, [x0, #32]1837; CHECK-NEXT: ldr x9, [x1, #32]1838; CHECK-NEXT: rev x8, x81839; CHECK-NEXT: rev x9, x91840; CHECK-NEXT: cmp x8, x91841; CHECK-NEXT: b.ne .LBB75_91842; CHECK-NEXT: // %bb.5: // %loadbb51843; CHECK-NEXT: ldr x8, [x0, #40]1844; CHECK-NEXT: ldr x9, [x1, #40]1845; CHECK-NEXT: rev x8, x81846; CHECK-NEXT: rev x9, x91847; CHECK-NEXT: cmp x8, x91848; CHECK-NEXT: b.ne .LBB75_91849; CHECK-NEXT: // %bb.6: // %loadbb61850; CHECK-NEXT: ldr x8, [x0, #48]1851; CHECK-NEXT: ldr x9, [x1, #48]1852; CHECK-NEXT: rev x8, x81853; CHECK-NEXT: rev x9, x91854; CHECK-NEXT: cmp x8, x91855; CHECK-NEXT: b.ne .LBB75_91856; CHECK-NEXT: // %bb.7: // %loadbb71857; CHECK-NEXT: ldur x8, [x0, #55]1858; CHECK-NEXT: ldur x9, [x1, #55]1859; CHECK-NEXT: rev x8, x81860; CHECK-NEXT: rev x9, x91861; CHECK-NEXT: cmp x8, x91862; CHECK-NEXT: b.ne .LBB75_91863; CHECK-NEXT: // %bb.8:1864; CHECK-NEXT: mov w0, wzr1865; CHECK-NEXT: ret1866; CHECK-NEXT: .LBB75_9: // %res_block1867; CHECK-NEXT: cmp x8, x91868; CHECK-NEXT: mov w8, #-1 // =0xffffffff1869; CHECK-NEXT: cneg w0, w8, hs1870; CHECK-NEXT: ret1871 %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 63) nounwind1872 ret i32 %m1873}1874 1875define i1 @length63_eq(ptr %x, ptr %y) nounwind {1876; CHECK-LABEL: length63_eq:1877; CHECK: // %bb.0:1878; CHECK-NEXT: ldp x8, x11, [x1]1879; CHECK-NEXT: ldp x9, x10, [x0]1880; CHECK-NEXT: ldp x12, x13, [x1, #16]1881; CHECK-NEXT: cmp x9, x81882; CHECK-NEXT: ldp x8, x9, [x0, #16]1883; CHECK-NEXT: ccmp x10, x11, #0, eq1884; CHECK-NEXT: ccmp x8, x12, #0, eq1885; CHECK-NEXT: ldp x8, x11, [x0, #32]1886; CHECK-NEXT: ldp x10, x12, [x1, #32]1887; CHECK-NEXT: ccmp x9, x13, #0, eq1888; CHECK-NEXT: ldr x9, [x0, #48]1889; CHECK-NEXT: ldr x13, [x1, #48]1890; CHECK-NEXT: ccmp x8, x10, #0, eq1891; CHECK-NEXT: ldur x8, [x0, #55]1892; CHECK-NEXT: ldur x10, [x1, #55]1893; CHECK-NEXT: ccmp x11, x12, #0, eq1894; CHECK-NEXT: ccmp x9, x13, #0, eq1895; CHECK-NEXT: ccmp x8, x10, #0, eq1896; CHECK-NEXT: cset w0, ne1897; CHECK-NEXT: ret1898 %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 63) nounwind1899 %cmp = icmp ne i32 %call, 01900 ret i1 %cmp1901}1902 1903define i1 @length63_lt(ptr %x, ptr %y) nounwind {1904; CHECK-LABEL: length63_lt:1905; CHECK: // %bb.0:1906; CHECK-NEXT: ldr x8, [x0]1907; CHECK-NEXT: ldr x9, [x1]1908; CHECK-NEXT: rev x8, x81909; CHECK-NEXT: rev x9, x91910; CHECK-NEXT: cmp x8, x91911; CHECK-NEXT: b.ne .LBB77_91912; CHECK-NEXT: // %bb.1: // %loadbb11913; CHECK-NEXT: ldr x8, [x0, #8]1914; CHECK-NEXT: ldr x9, [x1, #8]1915; CHECK-NEXT: rev x8, x81916; CHECK-NEXT: rev x9, x91917; CHECK-NEXT: cmp x8, x91918; CHECK-NEXT: b.ne .LBB77_91919; CHECK-NEXT: // %bb.2: // %loadbb21920; CHECK-NEXT: ldr x8, [x0, #16]1921; CHECK-NEXT: ldr x9, [x1, #16]1922; CHECK-NEXT: rev x8, x81923; CHECK-NEXT: rev x9, x91924; CHECK-NEXT: cmp x8, x91925; CHECK-NEXT: b.ne .LBB77_91926; CHECK-NEXT: // %bb.3: // %loadbb31927; CHECK-NEXT: ldr x8, [x0, #24]1928; CHECK-NEXT: ldr x9, [x1, #24]1929; CHECK-NEXT: rev x8, x81930; CHECK-NEXT: rev x9, x91931; CHECK-NEXT: cmp x8, x91932; CHECK-NEXT: b.ne .LBB77_91933; CHECK-NEXT: // %bb.4: // %loadbb41934; CHECK-NEXT: ldr x8, [x0, #32]1935; CHECK-NEXT: ldr x9, [x1, #32]1936; CHECK-NEXT: rev x8, x81937; CHECK-NEXT: rev x9, x91938; CHECK-NEXT: cmp x8, x91939; CHECK-NEXT: b.ne .LBB77_91940; CHECK-NEXT: // %bb.5: // %loadbb51941; CHECK-NEXT: ldr x8, [x0, #40]1942; CHECK-NEXT: ldr x9, [x1, #40]1943; CHECK-NEXT: rev x8, x81944; CHECK-NEXT: rev x9, x91945; CHECK-NEXT: cmp x8, x91946; CHECK-NEXT: b.ne .LBB77_91947; CHECK-NEXT: // %bb.6: // %loadbb61948; CHECK-NEXT: ldr x8, [x0, #48]1949; CHECK-NEXT: ldr x9, [x1, #48]1950; CHECK-NEXT: rev x8, x81951; CHECK-NEXT: rev x9, x91952; CHECK-NEXT: cmp x8, x91953; CHECK-NEXT: b.ne .LBB77_91954; CHECK-NEXT: // %bb.7: // %loadbb71955; CHECK-NEXT: ldur x8, [x0, #55]1956; CHECK-NEXT: ldur x9, [x1, #55]1957; CHECK-NEXT: rev x8, x81958; CHECK-NEXT: rev x9, x91959; CHECK-NEXT: cmp x8, x91960; CHECK-NEXT: b.ne .LBB77_91961; CHECK-NEXT: // %bb.8:1962; CHECK-NEXT: lsr w0, wzr, #311963; CHECK-NEXT: ret1964; CHECK-NEXT: .LBB77_9: // %res_block1965; CHECK-NEXT: cmp x8, x91966; CHECK-NEXT: mov w8, #-1 // =0xffffffff1967; CHECK-NEXT: cneg w8, w8, hs1968; CHECK-NEXT: lsr w0, w8, #311969; CHECK-NEXT: ret1970 %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 63) nounwind1971 %cmp = icmp slt i32 %call, 01972 ret i1 %cmp1973}1974 1975define i1 @length63_gt(ptr %x, ptr %y) nounwind {1976; CHECK-LABEL: length63_gt:1977; CHECK: // %bb.0:1978; CHECK-NEXT: ldr x8, [x0]1979; CHECK-NEXT: ldr x9, [x1]1980; CHECK-NEXT: rev x8, x81981; CHECK-NEXT: rev x9, x91982; CHECK-NEXT: cmp x8, x91983; CHECK-NEXT: b.ne .LBB78_91984; CHECK-NEXT: // %bb.1: // %loadbb11985; CHECK-NEXT: ldr x8, [x0, #8]1986; CHECK-NEXT: ldr x9, [x1, #8]1987; CHECK-NEXT: rev x8, x81988; CHECK-NEXT: rev x9, x91989; CHECK-NEXT: cmp x8, x91990; CHECK-NEXT: b.ne .LBB78_91991; CHECK-NEXT: // %bb.2: // %loadbb21992; CHECK-NEXT: ldr x8, [x0, #16]1993; CHECK-NEXT: ldr x9, [x1, #16]1994; CHECK-NEXT: rev x8, x81995; CHECK-NEXT: rev x9, x91996; CHECK-NEXT: cmp x8, x91997; CHECK-NEXT: b.ne .LBB78_91998; CHECK-NEXT: // %bb.3: // %loadbb31999; CHECK-NEXT: ldr x8, [x0, #24]2000; CHECK-NEXT: ldr x9, [x1, #24]2001; CHECK-NEXT: rev x8, x82002; CHECK-NEXT: rev x9, x92003; CHECK-NEXT: cmp x8, x92004; CHECK-NEXT: b.ne .LBB78_92005; CHECK-NEXT: // %bb.4: // %loadbb42006; CHECK-NEXT: ldr x8, [x0, #32]2007; CHECK-NEXT: ldr x9, [x1, #32]2008; CHECK-NEXT: rev x8, x82009; CHECK-NEXT: rev x9, x92010; CHECK-NEXT: cmp x8, x92011; CHECK-NEXT: b.ne .LBB78_92012; CHECK-NEXT: // %bb.5: // %loadbb52013; CHECK-NEXT: ldr x8, [x0, #40]2014; CHECK-NEXT: ldr x9, [x1, #40]2015; CHECK-NEXT: rev x8, x82016; CHECK-NEXT: rev x9, x92017; CHECK-NEXT: cmp x8, x92018; CHECK-NEXT: b.ne .LBB78_92019; CHECK-NEXT: // %bb.6: // %loadbb62020; CHECK-NEXT: ldr x8, [x0, #48]2021; CHECK-NEXT: ldr x9, [x1, #48]2022; CHECK-NEXT: rev x8, x82023; CHECK-NEXT: rev x9, x92024; CHECK-NEXT: cmp x8, x92025; CHECK-NEXT: b.ne .LBB78_92026; CHECK-NEXT: // %bb.7: // %loadbb72027; CHECK-NEXT: ldur x8, [x0, #55]2028; CHECK-NEXT: ldur x9, [x1, #55]2029; CHECK-NEXT: rev x8, x82030; CHECK-NEXT: rev x9, x92031; CHECK-NEXT: cmp x8, x92032; CHECK-NEXT: b.ne .LBB78_92033; CHECK-NEXT: // %bb.8:2034; CHECK-NEXT: mov w8, wzr2035; CHECK-NEXT: b .LBB78_102036; CHECK-NEXT: .LBB78_9: // %res_block2037; CHECK-NEXT: cmp x8, x92038; CHECK-NEXT: mov w8, #-1 // =0xffffffff2039; CHECK-NEXT: cneg w8, w8, hs2040; CHECK-NEXT: .LBB78_10: // %endblock2041; CHECK-NEXT: cmp w8, #02042; CHECK-NEXT: cset w0, gt2043; CHECK-NEXT: ret2044 %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 63) nounwind2045 %cmp = icmp sgt i32 %call, 02046 ret i1 %cmp2047}2048 2049define i1 @length63_eq_const(ptr %X) nounwind {2050; CHECK-LABEL: length63_eq_const:2051; CHECK: // %bb.0:2052; CHECK-NEXT: mov x8, #12592 // =0x31302053; CHECK-NEXT: ldp x9, x10, [x0]2054; CHECK-NEXT: movk x8, #13106, lsl #162055; CHECK-NEXT: ldp x11, x12, [x0, #16]2056; CHECK-NEXT: movk x8, #13620, lsl #322057; CHECK-NEXT: movk x8, #14134, lsl #482058; CHECK-NEXT: cmp x9, x82059; CHECK-NEXT: mov x9, #14648 // =0x39382060; CHECK-NEXT: movk x9, #12592, lsl #162061; CHECK-NEXT: movk x9, #13106, lsl #322062; CHECK-NEXT: movk x9, #13620, lsl #482063; CHECK-NEXT: ccmp x10, x9, #0, eq2064; CHECK-NEXT: mov x10, #14134 // =0x37362065; CHECK-NEXT: movk x10, #14648, lsl #162066; CHECK-NEXT: movk x10, #12592, lsl #322067; CHECK-NEXT: movk x10, #13106, lsl #482068; CHECK-NEXT: ccmp x11, x10, #0, eq2069; CHECK-NEXT: mov x10, #13620 // =0x35342070; CHECK-NEXT: movk x10, #14134, lsl #162071; CHECK-NEXT: ldp x11, x13, [x0, #32]2072; CHECK-NEXT: movk x10, #14648, lsl #322073; CHECK-NEXT: movk x10, #12592, lsl #482074; CHECK-NEXT: ccmp x12, x10, #0, eq2075; CHECK-NEXT: mov x10, #13106 // =0x33322076; CHECK-NEXT: ldr x12, [x0, #48]2077; CHECK-NEXT: movk x10, #13620, lsl #162078; CHECK-NEXT: movk x10, #14134, lsl #322079; CHECK-NEXT: movk x10, #14648, lsl #482080; CHECK-NEXT: ccmp x11, x10, #0, eq2081; CHECK-NEXT: ldur x10, [x0, #55]2082; CHECK-NEXT: ccmp x13, x8, #0, eq2083; CHECK-NEXT: mov x8, #13877 // =0x36352084; CHECK-NEXT: movk x8, #14391, lsl #162085; CHECK-NEXT: ccmp x12, x9, #0, eq2086; CHECK-NEXT: movk x8, #12345, lsl #322087; CHECK-NEXT: movk x8, #12849, lsl #482088; CHECK-NEXT: ccmp x10, x8, #0, eq2089; CHECK-NEXT: cset w0, eq2090; CHECK-NEXT: ret2091 %m = tail call i32 @memcmp(ptr %X, ptr @.str, i64 63) nounwind2092 %c = icmp eq i32 %m, 02093 ret i1 %c2094}2095 2096define i32 @length64(ptr %X, ptr %Y) nounwind {2097; CHECK-LABEL: length64:2098; CHECK: // %bb.0:2099; CHECK-NEXT: ldr x8, [x0]2100; CHECK-NEXT: ldr x9, [x1]2101; CHECK-NEXT: rev x8, x82102; CHECK-NEXT: rev x9, x92103; CHECK-NEXT: cmp x8, x92104; CHECK-NEXT: b.ne .LBB80_92105; CHECK-NEXT: // %bb.1: // %loadbb12106; CHECK-NEXT: ldr x8, [x0, #8]2107; CHECK-NEXT: ldr x9, [x1, #8]2108; CHECK-NEXT: rev x8, x82109; CHECK-NEXT: rev x9, x92110; CHECK-NEXT: cmp x8, x92111; CHECK-NEXT: b.ne .LBB80_92112; CHECK-NEXT: // %bb.2: // %loadbb22113; CHECK-NEXT: ldr x8, [x0, #16]2114; CHECK-NEXT: ldr x9, [x1, #16]2115; CHECK-NEXT: rev x8, x82116; CHECK-NEXT: rev x9, x92117; CHECK-NEXT: cmp x8, x92118; CHECK-NEXT: b.ne .LBB80_92119; CHECK-NEXT: // %bb.3: // %loadbb32120; CHECK-NEXT: ldr x8, [x0, #24]2121; CHECK-NEXT: ldr x9, [x1, #24]2122; CHECK-NEXT: rev x8, x82123; CHECK-NEXT: rev x9, x92124; CHECK-NEXT: cmp x8, x92125; CHECK-NEXT: b.ne .LBB80_92126; CHECK-NEXT: // %bb.4: // %loadbb42127; CHECK-NEXT: ldr x8, [x0, #32]2128; CHECK-NEXT: ldr x9, [x1, #32]2129; CHECK-NEXT: rev x8, x82130; CHECK-NEXT: rev x9, x92131; CHECK-NEXT: cmp x8, x92132; CHECK-NEXT: b.ne .LBB80_92133; CHECK-NEXT: // %bb.5: // %loadbb52134; CHECK-NEXT: ldr x8, [x0, #40]2135; CHECK-NEXT: ldr x9, [x1, #40]2136; CHECK-NEXT: rev x8, x82137; CHECK-NEXT: rev x9, x92138; CHECK-NEXT: cmp x8, x92139; CHECK-NEXT: b.ne .LBB80_92140; CHECK-NEXT: // %bb.6: // %loadbb62141; CHECK-NEXT: ldr x8, [x0, #48]2142; CHECK-NEXT: ldr x9, [x1, #48]2143; CHECK-NEXT: rev x8, x82144; CHECK-NEXT: rev x9, x92145; CHECK-NEXT: cmp x8, x92146; CHECK-NEXT: b.ne .LBB80_92147; CHECK-NEXT: // %bb.7: // %loadbb72148; CHECK-NEXT: ldr x8, [x0, #56]2149; CHECK-NEXT: ldr x9, [x1, #56]2150; CHECK-NEXT: rev x8, x82151; CHECK-NEXT: rev x9, x92152; CHECK-NEXT: cmp x8, x92153; CHECK-NEXT: b.ne .LBB80_92154; CHECK-NEXT: // %bb.8:2155; CHECK-NEXT: mov w0, wzr2156; CHECK-NEXT: ret2157; CHECK-NEXT: .LBB80_9: // %res_block2158; CHECK-NEXT: cmp x8, x92159; CHECK-NEXT: mov w8, #-1 // =0xffffffff2160; CHECK-NEXT: cneg w0, w8, hs2161; CHECK-NEXT: ret2162 %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 64) nounwind2163 ret i32 %m2164}2165 2166define i1 @length64_eq(ptr %x, ptr %y) nounwind {2167; CHECK-LABEL: length64_eq:2168; CHECK: // %bb.0:2169; CHECK-NEXT: ldp x8, x11, [x1]2170; CHECK-NEXT: ldp x9, x10, [x0]2171; CHECK-NEXT: ldp x12, x13, [x1, #16]2172; CHECK-NEXT: cmp x9, x82173; CHECK-NEXT: ldp x8, x9, [x0, #16]2174; CHECK-NEXT: ccmp x10, x11, #0, eq2175; CHECK-NEXT: ccmp x8, x12, #0, eq2176; CHECK-NEXT: ldp x8, x11, [x0, #32]2177; CHECK-NEXT: ldp x10, x12, [x1, #32]2178; CHECK-NEXT: ccmp x9, x13, #0, eq2179; CHECK-NEXT: ldp x9, x13, [x1, #48]2180; CHECK-NEXT: ccmp x8, x10, #0, eq2181; CHECK-NEXT: ldp x8, x10, [x0, #48]2182; CHECK-NEXT: ccmp x11, x12, #0, eq2183; CHECK-NEXT: ccmp x8, x9, #0, eq2184; CHECK-NEXT: ccmp x10, x13, #0, eq2185; CHECK-NEXT: cset w0, ne2186; CHECK-NEXT: ret2187 %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 64) nounwind2188 %cmp = icmp ne i32 %call, 02189 ret i1 %cmp2190}2191 2192define i1 @length64_lt(ptr %x, ptr %y) nounwind {2193; CHECK-LABEL: length64_lt:2194; CHECK: // %bb.0:2195; CHECK-NEXT: ldr x8, [x0]2196; CHECK-NEXT: ldr x9, [x1]2197; CHECK-NEXT: rev x8, x82198; CHECK-NEXT: rev x9, x92199; CHECK-NEXT: cmp x8, x92200; CHECK-NEXT: b.ne .LBB82_92201; CHECK-NEXT: // %bb.1: // %loadbb12202; CHECK-NEXT: ldr x8, [x0, #8]2203; CHECK-NEXT: ldr x9, [x1, #8]2204; CHECK-NEXT: rev x8, x82205; CHECK-NEXT: rev x9, x92206; CHECK-NEXT: cmp x8, x92207; CHECK-NEXT: b.ne .LBB82_92208; CHECK-NEXT: // %bb.2: // %loadbb22209; CHECK-NEXT: ldr x8, [x0, #16]2210; CHECK-NEXT: ldr x9, [x1, #16]2211; CHECK-NEXT: rev x8, x82212; CHECK-NEXT: rev x9, x92213; CHECK-NEXT: cmp x8, x92214; CHECK-NEXT: b.ne .LBB82_92215; CHECK-NEXT: // %bb.3: // %loadbb32216; CHECK-NEXT: ldr x8, [x0, #24]2217; CHECK-NEXT: ldr x9, [x1, #24]2218; CHECK-NEXT: rev x8, x82219; CHECK-NEXT: rev x9, x92220; CHECK-NEXT: cmp x8, x92221; CHECK-NEXT: b.ne .LBB82_92222; CHECK-NEXT: // %bb.4: // %loadbb42223; CHECK-NEXT: ldr x8, [x0, #32]2224; CHECK-NEXT: ldr x9, [x1, #32]2225; CHECK-NEXT: rev x8, x82226; CHECK-NEXT: rev x9, x92227; CHECK-NEXT: cmp x8, x92228; CHECK-NEXT: b.ne .LBB82_92229; CHECK-NEXT: // %bb.5: // %loadbb52230; CHECK-NEXT: ldr x8, [x0, #40]2231; CHECK-NEXT: ldr x9, [x1, #40]2232; CHECK-NEXT: rev x8, x82233; CHECK-NEXT: rev x9, x92234; CHECK-NEXT: cmp x8, x92235; CHECK-NEXT: b.ne .LBB82_92236; CHECK-NEXT: // %bb.6: // %loadbb62237; CHECK-NEXT: ldr x8, [x0, #48]2238; CHECK-NEXT: ldr x9, [x1, #48]2239; CHECK-NEXT: rev x8, x82240; CHECK-NEXT: rev x9, x92241; CHECK-NEXT: cmp x8, x92242; CHECK-NEXT: b.ne .LBB82_92243; CHECK-NEXT: // %bb.7: // %loadbb72244; CHECK-NEXT: ldr x8, [x0, #56]2245; CHECK-NEXT: ldr x9, [x1, #56]2246; CHECK-NEXT: rev x8, x82247; CHECK-NEXT: rev x9, x92248; CHECK-NEXT: cmp x8, x92249; CHECK-NEXT: b.ne .LBB82_92250; CHECK-NEXT: // %bb.8:2251; CHECK-NEXT: lsr w0, wzr, #312252; CHECK-NEXT: ret2253; CHECK-NEXT: .LBB82_9: // %res_block2254; CHECK-NEXT: cmp x8, x92255; CHECK-NEXT: mov w8, #-1 // =0xffffffff2256; CHECK-NEXT: cneg w8, w8, hs2257; CHECK-NEXT: lsr w0, w8, #312258; CHECK-NEXT: ret2259 %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 64) nounwind2260 %cmp = icmp slt i32 %call, 02261 ret i1 %cmp2262}2263 2264define i1 @length64_gt(ptr %x, ptr %y) nounwind {2265; CHECK-LABEL: length64_gt:2266; CHECK: // %bb.0:2267; CHECK-NEXT: ldr x8, [x0]2268; CHECK-NEXT: ldr x9, [x1]2269; CHECK-NEXT: rev x8, x82270; CHECK-NEXT: rev x9, x92271; CHECK-NEXT: cmp x8, x92272; CHECK-NEXT: b.ne .LBB83_92273; CHECK-NEXT: // %bb.1: // %loadbb12274; CHECK-NEXT: ldr x8, [x0, #8]2275; CHECK-NEXT: ldr x9, [x1, #8]2276; CHECK-NEXT: rev x8, x82277; CHECK-NEXT: rev x9, x92278; CHECK-NEXT: cmp x8, x92279; CHECK-NEXT: b.ne .LBB83_92280; CHECK-NEXT: // %bb.2: // %loadbb22281; CHECK-NEXT: ldr x8, [x0, #16]2282; CHECK-NEXT: ldr x9, [x1, #16]2283; CHECK-NEXT: rev x8, x82284; CHECK-NEXT: rev x9, x92285; CHECK-NEXT: cmp x8, x92286; CHECK-NEXT: b.ne .LBB83_92287; CHECK-NEXT: // %bb.3: // %loadbb32288; CHECK-NEXT: ldr x8, [x0, #24]2289; CHECK-NEXT: ldr x9, [x1, #24]2290; CHECK-NEXT: rev x8, x82291; CHECK-NEXT: rev x9, x92292; CHECK-NEXT: cmp x8, x92293; CHECK-NEXT: b.ne .LBB83_92294; CHECK-NEXT: // %bb.4: // %loadbb42295; CHECK-NEXT: ldr x8, [x0, #32]2296; CHECK-NEXT: ldr x9, [x1, #32]2297; CHECK-NEXT: rev x8, x82298; CHECK-NEXT: rev x9, x92299; CHECK-NEXT: cmp x8, x92300; CHECK-NEXT: b.ne .LBB83_92301; CHECK-NEXT: // %bb.5: // %loadbb52302; CHECK-NEXT: ldr x8, [x0, #40]2303; CHECK-NEXT: ldr x9, [x1, #40]2304; CHECK-NEXT: rev x8, x82305; CHECK-NEXT: rev x9, x92306; CHECK-NEXT: cmp x8, x92307; CHECK-NEXT: b.ne .LBB83_92308; CHECK-NEXT: // %bb.6: // %loadbb62309; CHECK-NEXT: ldr x8, [x0, #48]2310; CHECK-NEXT: ldr x9, [x1, #48]2311; CHECK-NEXT: rev x8, x82312; CHECK-NEXT: rev x9, x92313; CHECK-NEXT: cmp x8, x92314; CHECK-NEXT: b.ne .LBB83_92315; CHECK-NEXT: // %bb.7: // %loadbb72316; CHECK-NEXT: ldr x8, [x0, #56]2317; CHECK-NEXT: ldr x9, [x1, #56]2318; CHECK-NEXT: rev x8, x82319; CHECK-NEXT: rev x9, x92320; CHECK-NEXT: cmp x8, x92321; CHECK-NEXT: b.ne .LBB83_92322; CHECK-NEXT: // %bb.8:2323; CHECK-NEXT: mov w8, wzr2324; CHECK-NEXT: b .LBB83_102325; CHECK-NEXT: .LBB83_9: // %res_block2326; CHECK-NEXT: cmp x8, x92327; CHECK-NEXT: mov w8, #-1 // =0xffffffff2328; CHECK-NEXT: cneg w8, w8, hs2329; CHECK-NEXT: .LBB83_10: // %endblock2330; CHECK-NEXT: cmp w8, #02331; CHECK-NEXT: cset w0, gt2332; CHECK-NEXT: ret2333 %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 64) nounwind2334 %cmp = icmp sgt i32 %call, 02335 ret i1 %cmp2336}2337 2338define i1 @length64_eq_const(ptr %X) nounwind {2339; CHECK-LABEL: length64_eq_const:2340; CHECK: // %bb.0:2341; CHECK-NEXT: mov x8, #12592 // =0x31302342; CHECK-NEXT: ldp x9, x10, [x0]2343; CHECK-NEXT: movk x8, #13106, lsl #162344; CHECK-NEXT: ldp x11, x12, [x0, #16]2345; CHECK-NEXT: movk x8, #13620, lsl #322346; CHECK-NEXT: ldp x13, x14, [x0, #32]2347; CHECK-NEXT: movk x8, #14134, lsl #482348; CHECK-NEXT: cmp x9, x82349; CHECK-NEXT: mov x9, #14648 // =0x39382350; CHECK-NEXT: movk x9, #12592, lsl #162351; CHECK-NEXT: movk x9, #13106, lsl #322352; CHECK-NEXT: movk x9, #13620, lsl #482353; CHECK-NEXT: ccmp x10, x9, #0, eq2354; CHECK-NEXT: mov x10, #14134 // =0x37362355; CHECK-NEXT: movk x10, #14648, lsl #162356; CHECK-NEXT: movk x10, #12592, lsl #322357; CHECK-NEXT: movk x10, #13106, lsl #482358; CHECK-NEXT: ccmp x11, x10, #0, eq2359; CHECK-NEXT: mov x11, #13620 // =0x35342360; CHECK-NEXT: movk x11, #14134, lsl #162361; CHECK-NEXT: movk x11, #14648, lsl #322362; CHECK-NEXT: movk x11, #12592, lsl #482363; CHECK-NEXT: ccmp x12, x11, #0, eq2364; CHECK-NEXT: mov x11, #13106 // =0x33322365; CHECK-NEXT: movk x11, #13620, lsl #162366; CHECK-NEXT: movk x11, #14134, lsl #322367; CHECK-NEXT: movk x11, #14648, lsl #482368; CHECK-NEXT: ccmp x13, x11, #0, eq2369; CHECK-NEXT: ldp x11, x12, [x0, #48]2370; CHECK-NEXT: ccmp x14, x8, #0, eq2371; CHECK-NEXT: ccmp x11, x9, #0, eq2372; CHECK-NEXT: ccmp x12, x10, #0, eq2373; CHECK-NEXT: cset w0, eq2374; CHECK-NEXT: ret2375 %m = tail call i32 @memcmp(ptr %X, ptr @.str, i64 64) nounwind2376 %c = icmp eq i32 %m, 02377 ret i1 %c2378}2379 2380define i32 @length96(ptr %X, ptr %Y) nounwind {2381; CHECK-LABEL: length96:2382; CHECK: // %bb.0:2383; CHECK-NEXT: mov w2, #96 // =0x602384; CHECK-NEXT: b memcmp2385 %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 96) nounwind2386 ret i32 %m2387}2388 2389define i1 @length96_eq(ptr %x, ptr %y) nounwind {2390; CHECK-LABEL: length96_eq:2391; CHECK: // %bb.0:2392; CHECK-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill2393; CHECK-NEXT: mov w2, #96 // =0x602394; CHECK-NEXT: bl memcmp2395; CHECK-NEXT: cmp w0, #02396; CHECK-NEXT: cset w0, ne2397; CHECK-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload2398; CHECK-NEXT: ret2399 %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 96) nounwind2400 %cmp = icmp ne i32 %call, 02401 ret i1 %cmp2402}2403 2404define i1 @length96_lt(ptr %x, ptr %y) nounwind {2405; CHECK-LABEL: length96_lt:2406; CHECK: // %bb.0:2407; CHECK-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill2408; CHECK-NEXT: mov w2, #96 // =0x602409; CHECK-NEXT: bl memcmp2410; CHECK-NEXT: lsr w0, w0, #312411; CHECK-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload2412; CHECK-NEXT: ret2413 %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 96) nounwind2414 %cmp = icmp slt i32 %call, 02415 ret i1 %cmp2416}2417 2418define i1 @length96_gt(ptr %x, ptr %y) nounwind {2419; CHECK-LABEL: length96_gt:2420; CHECK: // %bb.0:2421; CHECK-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill2422; CHECK-NEXT: mov w2, #96 // =0x602423; CHECK-NEXT: bl memcmp2424; CHECK-NEXT: cmp w0, #02425; CHECK-NEXT: cset w0, gt2426; CHECK-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload2427; CHECK-NEXT: ret2428 %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 96) nounwind2429 %cmp = icmp sgt i32 %call, 02430 ret i1 %cmp2431}2432 2433define i1 @length96_eq_const(ptr %X) nounwind {2434; CHECK-LABEL: length96_eq_const:2435; CHECK: // %bb.0:2436; CHECK-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill2437; CHECK-NEXT: adrp x1, .L.str2438; CHECK-NEXT: add x1, x1, :lo12:.L.str2439; CHECK-NEXT: mov w2, #96 // =0x602440; CHECK-NEXT: bl memcmp2441; CHECK-NEXT: cmp w0, #02442; CHECK-NEXT: cset w0, eq2443; CHECK-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload2444; CHECK-NEXT: ret2445 %m = tail call i32 @memcmp(ptr %X, ptr @.str, i64 96) nounwind2446 %c = icmp eq i32 %m, 02447 ret i1 %c2448}2449 2450define i32 @length127(ptr %X, ptr %Y) nounwind {2451; CHECK-LABEL: length127:2452; CHECK: // %bb.0:2453; CHECK-NEXT: mov w2, #127 // =0x7f2454; CHECK-NEXT: b memcmp2455 %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 127) nounwind2456 ret i32 %m2457}2458 2459define i1 @length127_eq(ptr %x, ptr %y) nounwind {2460; CHECK-LABEL: length127_eq:2461; CHECK: // %bb.0:2462; CHECK-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill2463; CHECK-NEXT: mov w2, #127 // =0x7f2464; CHECK-NEXT: bl memcmp2465; CHECK-NEXT: cmp w0, #02466; CHECK-NEXT: cset w0, ne2467; CHECK-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload2468; CHECK-NEXT: ret2469 %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 127) nounwind2470 %cmp = icmp ne i32 %call, 02471 ret i1 %cmp2472}2473 2474define i1 @length127_lt(ptr %x, ptr %y) nounwind {2475; CHECK-LABEL: length127_lt:2476; CHECK: // %bb.0:2477; CHECK-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill2478; CHECK-NEXT: mov w2, #127 // =0x7f2479; CHECK-NEXT: bl memcmp2480; CHECK-NEXT: lsr w0, w0, #312481; CHECK-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload2482; CHECK-NEXT: ret2483 %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 127) nounwind2484 %cmp = icmp slt i32 %call, 02485 ret i1 %cmp2486}2487 2488define i1 @length127_gt(ptr %x, ptr %y) nounwind {2489; CHECK-LABEL: length127_gt:2490; CHECK: // %bb.0:2491; CHECK-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill2492; CHECK-NEXT: mov w2, #127 // =0x7f2493; CHECK-NEXT: bl memcmp2494; CHECK-NEXT: cmp w0, #02495; CHECK-NEXT: cset w0, gt2496; CHECK-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload2497; CHECK-NEXT: ret2498 %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 127) nounwind2499 %cmp = icmp sgt i32 %call, 02500 ret i1 %cmp2501}2502 2503define i1 @length127_eq_const(ptr %X) nounwind {2504; CHECK-LABEL: length127_eq_const:2505; CHECK: // %bb.0:2506; CHECK-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill2507; CHECK-NEXT: adrp x1, .L.str2508; CHECK-NEXT: add x1, x1, :lo12:.L.str2509; CHECK-NEXT: mov w2, #127 // =0x7f2510; CHECK-NEXT: bl memcmp2511; CHECK-NEXT: cmp w0, #02512; CHECK-NEXT: cset w0, eq2513; CHECK-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload2514; CHECK-NEXT: ret2515 %m = tail call i32 @memcmp(ptr %X, ptr @.str, i64 127) nounwind2516 %c = icmp eq i32 %m, 02517 ret i1 %c2518}2519 2520define i32 @length128(ptr %X, ptr %Y) nounwind {2521; CHECK-LABEL: length128:2522; CHECK: // %bb.0:2523; CHECK-NEXT: mov w2, #128 // =0x802524; CHECK-NEXT: b memcmp2525 %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 128) nounwind2526 ret i32 %m2527}2528 2529define i1 @length128_eq(ptr %x, ptr %y) nounwind {2530; CHECK-LABEL: length128_eq:2531; CHECK: // %bb.0:2532; CHECK-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill2533; CHECK-NEXT: mov w2, #128 // =0x802534; CHECK-NEXT: bl memcmp2535; CHECK-NEXT: cmp w0, #02536; CHECK-NEXT: cset w0, ne2537; CHECK-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload2538; CHECK-NEXT: ret2539 %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 128) nounwind2540 %cmp = icmp ne i32 %call, 02541 ret i1 %cmp2542}2543 2544define i1 @length128_lt(ptr %x, ptr %y) nounwind {2545; CHECK-LABEL: length128_lt:2546; CHECK: // %bb.0:2547; CHECK-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill2548; CHECK-NEXT: mov w2, #128 // =0x802549; CHECK-NEXT: bl memcmp2550; CHECK-NEXT: lsr w0, w0, #312551; CHECK-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload2552; CHECK-NEXT: ret2553 %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 128) nounwind2554 %cmp = icmp slt i32 %call, 02555 ret i1 %cmp2556}2557 2558define i1 @length128_gt(ptr %x, ptr %y) nounwind {2559; CHECK-LABEL: length128_gt:2560; CHECK: // %bb.0:2561; CHECK-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill2562; CHECK-NEXT: mov w2, #128 // =0x802563; CHECK-NEXT: bl memcmp2564; CHECK-NEXT: cmp w0, #02565; CHECK-NEXT: cset w0, gt2566; CHECK-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload2567; CHECK-NEXT: ret2568 %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 128) nounwind2569 %cmp = icmp sgt i32 %call, 02570 ret i1 %cmp2571}2572 2573define i1 @length128_eq_const(ptr %X) nounwind {2574; CHECK-LABEL: length128_eq_const:2575; CHECK: // %bb.0:2576; CHECK-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill2577; CHECK-NEXT: adrp x1, .L.str2578; CHECK-NEXT: add x1, x1, :lo12:.L.str2579; CHECK-NEXT: mov w2, #128 // =0x802580; CHECK-NEXT: bl memcmp2581; CHECK-NEXT: cmp w0, #02582; CHECK-NEXT: cset w0, eq2583; CHECK-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload2584; CHECK-NEXT: ret2585 %m = tail call i32 @memcmp(ptr %X, ptr @.str, i64 128) nounwind2586 %c = icmp eq i32 %m, 02587 ret i1 %c2588}2589 2590define i32 @length192(ptr %X, ptr %Y) nounwind {2591; CHECK-LABEL: length192:2592; CHECK: // %bb.0:2593; CHECK-NEXT: mov w2, #192 // =0xc02594; CHECK-NEXT: b memcmp2595 %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 192) nounwind2596 ret i32 %m2597}2598 2599define i1 @length192_eq(ptr %x, ptr %y) nounwind {2600; CHECK-LABEL: length192_eq:2601; CHECK: // %bb.0:2602; CHECK-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill2603; CHECK-NEXT: mov w2, #192 // =0xc02604; CHECK-NEXT: bl memcmp2605; CHECK-NEXT: cmp w0, #02606; CHECK-NEXT: cset w0, ne2607; CHECK-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload2608; CHECK-NEXT: ret2609 %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 192) nounwind2610 %cmp = icmp ne i32 %call, 02611 ret i1 %cmp2612}2613 2614define i1 @length192_lt(ptr %x, ptr %y) nounwind {2615; CHECK-LABEL: length192_lt:2616; CHECK: // %bb.0:2617; CHECK-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill2618; CHECK-NEXT: mov w2, #192 // =0xc02619; CHECK-NEXT: bl memcmp2620; CHECK-NEXT: lsr w0, w0, #312621; CHECK-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload2622; CHECK-NEXT: ret2623 %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 192) nounwind2624 %cmp = icmp slt i32 %call, 02625 ret i1 %cmp2626}2627 2628define i1 @length192_gt(ptr %x, ptr %y) nounwind {2629; CHECK-LABEL: length192_gt:2630; CHECK: // %bb.0:2631; CHECK-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill2632; CHECK-NEXT: mov w2, #192 // =0xc02633; CHECK-NEXT: bl memcmp2634; CHECK-NEXT: cmp w0, #02635; CHECK-NEXT: cset w0, gt2636; CHECK-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload2637; CHECK-NEXT: ret2638 %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 192) nounwind2639 %cmp = icmp sgt i32 %call, 02640 ret i1 %cmp2641}2642 2643define i1 @length192_eq_const(ptr %X) nounwind {2644; CHECK-LABEL: length192_eq_const:2645; CHECK: // %bb.0:2646; CHECK-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill2647; CHECK-NEXT: adrp x1, .L.str2648; CHECK-NEXT: add x1, x1, :lo12:.L.str2649; CHECK-NEXT: mov w2, #192 // =0xc02650; CHECK-NEXT: bl memcmp2651; CHECK-NEXT: cmp w0, #02652; CHECK-NEXT: cset w0, eq2653; CHECK-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload2654; CHECK-NEXT: ret2655 %m = tail call i32 @memcmp(ptr %X, ptr @.str, i64 192) nounwind2656 %c = icmp eq i32 %m, 02657 ret i1 %c2658}2659 2660define i32 @length255(ptr %X, ptr %Y) nounwind {2661; CHECK-LABEL: length255:2662; CHECK: // %bb.0:2663; CHECK-NEXT: mov w2, #255 // =0xff2664; CHECK-NEXT: b memcmp2665 %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 255) nounwind2666 ret i32 %m2667}2668 2669define i1 @length255_eq(ptr %x, ptr %y) nounwind {2670; CHECK-LABEL: length255_eq:2671; CHECK: // %bb.0:2672; CHECK-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill2673; CHECK-NEXT: mov w2, #255 // =0xff2674; CHECK-NEXT: bl memcmp2675; CHECK-NEXT: cmp w0, #02676; CHECK-NEXT: cset w0, ne2677; CHECK-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload2678; CHECK-NEXT: ret2679 %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 255) nounwind2680 %cmp = icmp ne i32 %call, 02681 ret i1 %cmp2682}2683 2684define i1 @length255_lt(ptr %x, ptr %y) nounwind {2685; CHECK-LABEL: length255_lt:2686; CHECK: // %bb.0:2687; CHECK-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill2688; CHECK-NEXT: mov w2, #255 // =0xff2689; CHECK-NEXT: bl memcmp2690; CHECK-NEXT: lsr w0, w0, #312691; CHECK-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload2692; CHECK-NEXT: ret2693 %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 255) nounwind2694 %cmp = icmp slt i32 %call, 02695 ret i1 %cmp2696}2697 2698define i1 @length255_gt(ptr %x, ptr %y) nounwind {2699; CHECK-LABEL: length255_gt:2700; CHECK: // %bb.0:2701; CHECK-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill2702; CHECK-NEXT: mov w2, #255 // =0xff2703; CHECK-NEXT: bl memcmp2704; CHECK-NEXT: cmp w0, #02705; CHECK-NEXT: cset w0, gt2706; CHECK-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload2707; CHECK-NEXT: ret2708 %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 255) nounwind2709 %cmp = icmp sgt i32 %call, 02710 ret i1 %cmp2711}2712 2713define i1 @length255_eq_const(ptr %X) nounwind {2714; CHECK-LABEL: length255_eq_const:2715; CHECK: // %bb.0:2716; CHECK-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill2717; CHECK-NEXT: adrp x1, .L.str2718; CHECK-NEXT: add x1, x1, :lo12:.L.str2719; CHECK-NEXT: mov w2, #255 // =0xff2720; CHECK-NEXT: bl memcmp2721; CHECK-NEXT: cmp w0, #02722; CHECK-NEXT: cset w0, eq2723; CHECK-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload2724; CHECK-NEXT: ret2725 %m = tail call i32 @memcmp(ptr %X, ptr @.str, i64 255) nounwind2726 %c = icmp eq i32 %m, 02727 ret i1 %c2728}2729 2730define i32 @length256(ptr %X, ptr %Y) nounwind {2731; CHECK-LABEL: length256:2732; CHECK: // %bb.0:2733; CHECK-NEXT: mov w2, #256 // =0x1002734; CHECK-NEXT: b memcmp2735 %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 256) nounwind2736 ret i32 %m2737}2738 2739define i1 @length256_eq(ptr %x, ptr %y) nounwind {2740; CHECK-LABEL: length256_eq:2741; CHECK: // %bb.0:2742; CHECK-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill2743; CHECK-NEXT: mov w2, #256 // =0x1002744; CHECK-NEXT: bl memcmp2745; CHECK-NEXT: cmp w0, #02746; CHECK-NEXT: cset w0, ne2747; CHECK-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload2748; CHECK-NEXT: ret2749 %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 256) nounwind2750 %cmp = icmp ne i32 %call, 02751 ret i1 %cmp2752}2753 2754define i1 @length256_lt(ptr %x, ptr %y) nounwind {2755; CHECK-LABEL: length256_lt:2756; CHECK: // %bb.0:2757; CHECK-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill2758; CHECK-NEXT: mov w2, #256 // =0x1002759; CHECK-NEXT: bl memcmp2760; CHECK-NEXT: lsr w0, w0, #312761; CHECK-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload2762; CHECK-NEXT: ret2763 %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 256) nounwind2764 %cmp = icmp slt i32 %call, 02765 ret i1 %cmp2766}2767 2768define i1 @length256_gt(ptr %x, ptr %y) nounwind {2769; CHECK-LABEL: length256_gt:2770; CHECK: // %bb.0:2771; CHECK-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill2772; CHECK-NEXT: mov w2, #256 // =0x1002773; CHECK-NEXT: bl memcmp2774; CHECK-NEXT: cmp w0, #02775; CHECK-NEXT: cset w0, gt2776; CHECK-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload2777; CHECK-NEXT: ret2778 %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 256) nounwind2779 %cmp = icmp sgt i32 %call, 02780 ret i1 %cmp2781}2782 2783define i1 @length256_eq_const(ptr %X) nounwind {2784; CHECK-LABEL: length256_eq_const:2785; CHECK: // %bb.0:2786; CHECK-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill2787; CHECK-NEXT: adrp x1, .L.str2788; CHECK-NEXT: add x1, x1, :lo12:.L.str2789; CHECK-NEXT: mov w2, #256 // =0x1002790; CHECK-NEXT: bl memcmp2791; CHECK-NEXT: cmp w0, #02792; CHECK-NEXT: cset w0, eq2793; CHECK-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload2794; CHECK-NEXT: ret2795 %m = tail call i32 @memcmp(ptr %X, ptr @.str, i64 256) nounwind2796 %c = icmp eq i32 %m, 02797 ret i1 %c2798}2799 2800define i32 @length384(ptr %X, ptr %Y) nounwind {2801; CHECK-LABEL: length384:2802; CHECK: // %bb.0:2803; CHECK-NEXT: mov w2, #384 // =0x1802804; CHECK-NEXT: b memcmp2805 %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 384) nounwind2806 ret i32 %m2807}2808 2809define i1 @length384_eq(ptr %x, ptr %y) nounwind {2810; CHECK-LABEL: length384_eq:2811; CHECK: // %bb.0:2812; CHECK-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill2813; CHECK-NEXT: mov w2, #384 // =0x1802814; CHECK-NEXT: bl memcmp2815; CHECK-NEXT: cmp w0, #02816; CHECK-NEXT: cset w0, ne2817; CHECK-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload2818; CHECK-NEXT: ret2819 %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 384) nounwind2820 %cmp = icmp ne i32 %call, 02821 ret i1 %cmp2822}2823 2824define i1 @length384_lt(ptr %x, ptr %y) nounwind {2825; CHECK-LABEL: length384_lt:2826; CHECK: // %bb.0:2827; CHECK-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill2828; CHECK-NEXT: mov w2, #384 // =0x1802829; CHECK-NEXT: bl memcmp2830; CHECK-NEXT: lsr w0, w0, #312831; CHECK-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload2832; CHECK-NEXT: ret2833 %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 384) nounwind2834 %cmp = icmp slt i32 %call, 02835 ret i1 %cmp2836}2837 2838define i1 @length384_gt(ptr %x, ptr %y) nounwind {2839; CHECK-LABEL: length384_gt:2840; CHECK: // %bb.0:2841; CHECK-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill2842; CHECK-NEXT: mov w2, #384 // =0x1802843; CHECK-NEXT: bl memcmp2844; CHECK-NEXT: cmp w0, #02845; CHECK-NEXT: cset w0, gt2846; CHECK-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload2847; CHECK-NEXT: ret2848 %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 384) nounwind2849 %cmp = icmp sgt i32 %call, 02850 ret i1 %cmp2851}2852 2853define i1 @length384_eq_const(ptr %X) nounwind {2854; CHECK-LABEL: length384_eq_const:2855; CHECK: // %bb.0:2856; CHECK-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill2857; CHECK-NEXT: adrp x1, .L.str2858; CHECK-NEXT: add x1, x1, :lo12:.L.str2859; CHECK-NEXT: mov w2, #384 // =0x1802860; CHECK-NEXT: bl memcmp2861; CHECK-NEXT: cmp w0, #02862; CHECK-NEXT: cset w0, eq2863; CHECK-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload2864; CHECK-NEXT: ret2865 %m = tail call i32 @memcmp(ptr %X, ptr @.str, i64 384) nounwind2866 %c = icmp eq i32 %m, 02867 ret i1 %c2868}2869 2870define i32 @length511(ptr %X, ptr %Y) nounwind {2871; CHECK-LABEL: length511:2872; CHECK: // %bb.0:2873; CHECK-NEXT: mov w2, #511 // =0x1ff2874; CHECK-NEXT: b memcmp2875 %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 511) nounwind2876 ret i32 %m2877}2878 2879define i1 @length511_eq(ptr %x, ptr %y) nounwind {2880; CHECK-LABEL: length511_eq:2881; CHECK: // %bb.0:2882; CHECK-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill2883; CHECK-NEXT: mov w2, #511 // =0x1ff2884; CHECK-NEXT: bl memcmp2885; CHECK-NEXT: cmp w0, #02886; CHECK-NEXT: cset w0, ne2887; CHECK-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload2888; CHECK-NEXT: ret2889 %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 511) nounwind2890 %cmp = icmp ne i32 %call, 02891 ret i1 %cmp2892}2893 2894define i1 @length511_lt(ptr %x, ptr %y) nounwind {2895; CHECK-LABEL: length511_lt:2896; CHECK: // %bb.0:2897; CHECK-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill2898; CHECK-NEXT: mov w2, #511 // =0x1ff2899; CHECK-NEXT: bl memcmp2900; CHECK-NEXT: lsr w0, w0, #312901; CHECK-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload2902; CHECK-NEXT: ret2903 %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 511) nounwind2904 %cmp = icmp slt i32 %call, 02905 ret i1 %cmp2906}2907 2908define i1 @length511_gt(ptr %x, ptr %y) nounwind {2909; CHECK-LABEL: length511_gt:2910; CHECK: // %bb.0:2911; CHECK-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill2912; CHECK-NEXT: mov w2, #511 // =0x1ff2913; CHECK-NEXT: bl memcmp2914; CHECK-NEXT: cmp w0, #02915; CHECK-NEXT: cset w0, gt2916; CHECK-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload2917; CHECK-NEXT: ret2918 %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 511) nounwind2919 %cmp = icmp sgt i32 %call, 02920 ret i1 %cmp2921}2922 2923define i1 @length511_eq_const(ptr %X) nounwind {2924; CHECK-LABEL: length511_eq_const:2925; CHECK: // %bb.0:2926; CHECK-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill2927; CHECK-NEXT: adrp x1, .L.str2928; CHECK-NEXT: add x1, x1, :lo12:.L.str2929; CHECK-NEXT: mov w2, #511 // =0x1ff2930; CHECK-NEXT: bl memcmp2931; CHECK-NEXT: cmp w0, #02932; CHECK-NEXT: cset w0, eq2933; CHECK-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload2934; CHECK-NEXT: ret2935 %m = tail call i32 @memcmp(ptr %X, ptr @.str, i64 511) nounwind2936 %c = icmp eq i32 %m, 02937 ret i1 %c2938}2939 2940define i32 @length512(ptr %X, ptr %Y) nounwind {2941; CHECK-LABEL: length512:2942; CHECK: // %bb.0:2943; CHECK-NEXT: mov w2, #512 // =0x2002944; CHECK-NEXT: b memcmp2945 %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 512) nounwind2946 ret i32 %m2947}2948 2949define i1 @length512_eq(ptr %x, ptr %y) nounwind {2950; CHECK-LABEL: length512_eq:2951; CHECK: // %bb.0:2952; CHECK-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill2953; CHECK-NEXT: mov w2, #512 // =0x2002954; CHECK-NEXT: bl memcmp2955; CHECK-NEXT: cmp w0, #02956; CHECK-NEXT: cset w0, ne2957; CHECK-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload2958; CHECK-NEXT: ret2959 %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 512) nounwind2960 %cmp = icmp ne i32 %call, 02961 ret i1 %cmp2962}2963 2964define i1 @length512_lt(ptr %x, ptr %y) nounwind {2965; CHECK-LABEL: length512_lt:2966; CHECK: // %bb.0:2967; CHECK-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill2968; CHECK-NEXT: mov w2, #512 // =0x2002969; CHECK-NEXT: bl memcmp2970; CHECK-NEXT: lsr w0, w0, #312971; CHECK-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload2972; CHECK-NEXT: ret2973 %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 512) nounwind2974 %cmp = icmp slt i32 %call, 02975 ret i1 %cmp2976}2977 2978define i1 @length512_gt(ptr %x, ptr %y) nounwind {2979; CHECK-LABEL: length512_gt:2980; CHECK: // %bb.0:2981; CHECK-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill2982; CHECK-NEXT: mov w2, #512 // =0x2002983; CHECK-NEXT: bl memcmp2984; CHECK-NEXT: cmp w0, #02985; CHECK-NEXT: cset w0, gt2986; CHECK-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload2987; CHECK-NEXT: ret2988 %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 512) nounwind2989 %cmp = icmp sgt i32 %call, 02990 ret i1 %cmp2991}2992 2993define i1 @length512_eq_const(ptr %X) nounwind {2994; CHECK-LABEL: length512_eq_const:2995; CHECK: // %bb.0:2996; CHECK-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill2997; CHECK-NEXT: adrp x1, .L.str2998; CHECK-NEXT: add x1, x1, :lo12:.L.str2999; CHECK-NEXT: mov w2, #512 // =0x2003000; CHECK-NEXT: bl memcmp3001; CHECK-NEXT: cmp w0, #03002; CHECK-NEXT: cset w0, eq3003; CHECK-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload3004; CHECK-NEXT: ret3005 %m = tail call i32 @memcmp(ptr %X, ptr @.str, i64 512) nounwind3006 %c = icmp eq i32 %m, 03007 ret i1 %c3008}3009 3010define i32 @huge_length(ptr %X, ptr %Y) nounwind {3011; CHECK-LABEL: huge_length:3012; CHECK: // %bb.0:3013; CHECK-NEXT: mov x2, #9223372036854775807 // =0x7fffffffffffffff3014; CHECK-NEXT: b memcmp3015 %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 9223372036854775807) nounwind3016 ret i32 %m3017}3018 3019define i1 @huge_length_eq(ptr %X, ptr %Y) nounwind {3020; CHECK-LABEL: huge_length_eq:3021; CHECK: // %bb.0:3022; CHECK-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill3023; CHECK-NEXT: mov x2, #9223372036854775807 // =0x7fffffffffffffff3024; CHECK-NEXT: bl memcmp3025; CHECK-NEXT: cmp w0, #03026; CHECK-NEXT: cset w0, eq3027; CHECK-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload3028; CHECK-NEXT: ret3029 %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 9223372036854775807) nounwind3030 %c = icmp eq i32 %m, 03031 ret i1 %c3032}3033 3034define i32 @nonconst_length(ptr %X, ptr %Y, i64 %size) nounwind {3035; CHECK-LABEL: nonconst_length:3036; CHECK: // %bb.0:3037; CHECK-NEXT: b memcmp3038 %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 %size) nounwind3039 ret i32 %m3040}3041 3042define i1 @nonconst_length_eq(ptr %X, ptr %Y, i64 %size) nounwind {3043; CHECK-LABEL: nonconst_length_eq:3044; CHECK: // %bb.0:3045; CHECK-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill3046; CHECK-NEXT: bl memcmp3047; CHECK-NEXT: cmp w0, #03048; CHECK-NEXT: cset w0, eq3049; CHECK-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload3050; CHECK-NEXT: ret3051 %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 %size) nounwind3052 %c = icmp eq i32 %m, 03053 ret i1 %c3054}3055