1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2; RUN: llc < %s -mtriple=x86_64-unknown-unknown | FileCheck %s --check-prefixes=X64,X64-SSE,X64-SSE2 3; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=sse4.1 | FileCheck %s --check-prefixes=X64,X64-SSE,X64-SSE41 4; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=avx | FileCheck %s --check-prefixes=X64,X64-AVX,X64-AVX1 5; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=avx2 | FileCheck %s --check-prefixes=X64,X64-AVX,X64-AVX2 6; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=avx512bw,+prefer-256-bit | FileCheck %s --check-prefixes=X64,X64-AVX,X64-AVX2 7; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=avx512bw,-prefer-256-bit | FileCheck %s --check-prefixes=X64,X64-AVX,X64-AVX512,X64-AVX512BW 8; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=avx512f,+prefer-256-bit,-prefer-mask-registers | FileCheck %s --check-prefixes=X64,X64-AVX,X64-AVX2 9; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=avx512f,-prefer-256-bit,-prefer-mask-registers | FileCheck %s --check-prefixes=X64,X64-AVX,X64-AVX512,X64-AVX512F 10; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=avx512f,+prefer-256-bit,+prefer-mask-registers | FileCheck %s --check-prefixes=X64,X64-MIC-AVX,X64-MIC-AVX2 11; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=avx512f,-prefer-256-bit,+prefer-mask-registers | FileCheck %s --check-prefixes=X64,X64-MIC-AVX,X64-MIC-AVX512F 12 13; This tests codegen time inlining/optimization of memcmp 14; rdar://6480398 15 16@.str = private constant [513 x i8] c"01234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901\00", align 1 17 18declare dso_local i32 @memcmp(ptr, ptr, i64) 19 20define i32 @length0(ptr %X, ptr %Y) nounwind { 21; X64-LABEL: length0: 22; X64: # %bb.0: 23; X64-NEXT: xorl %eax, %eax 24; X64-NEXT: retq 25 %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 0) nounwind 26 ret i32 %m 27 } 28 29define i1 @length0_eq(ptr %X, ptr %Y) nounwind { 30; X64-LABEL: length0_eq: 31; X64: # %bb.0: 32; X64-NEXT: movb $1, %al 33; X64-NEXT: retq 34 %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 0) nounwind 35 %c = icmp eq i32 %m, 0 36 ret i1 %c 37} 38 39define i1 @length0_lt(ptr %X, ptr %Y) nounwind { 40; X64-LABEL: length0_lt: 41; X64: # %bb.0: 42; X64-NEXT: xorl %eax, %eax 43; X64-NEXT: retq 44 %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 0) nounwind 45 %c = icmp slt i32 %m, 0 46 ret i1 %c 47} 48 49define i32 @length2(ptr %X, ptr %Y) nounwind { 50; X64-LABEL: length2: 51; X64: # %bb.0: 52; X64-NEXT: movzwl (%rdi), %eax 53; X64-NEXT: movzwl (%rsi), %ecx 54; X64-NEXT: rolw $8, %ax 55; X64-NEXT: rolw $8, %cx 56; X64-NEXT: movzwl %ax, %eax 57; X64-NEXT: movzwl %cx, %ecx 58; X64-NEXT: subl %ecx, %eax 59; X64-NEXT: retq 60 %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 2) nounwind 61 ret i32 %m 62} 63 64define i32 @length2_const(ptr %X, ptr %Y) nounwind { 65; X64-LABEL: length2_const: 66; X64: # %bb.0: 67; X64-NEXT: movzwl (%rdi), %eax 68; X64-NEXT: rolw $8, %ax 69; X64-NEXT: movzwl %ax, %eax 70; X64-NEXT: addl $-12594, %eax # imm = 0xCECE 71; X64-NEXT: retq 72 %m = tail call i32 @memcmp(ptr %X, ptr getelementptr inbounds ([513 x i8], ptr @.str, i32 0, i32 1), i64 2) nounwind 73 ret i32 %m 74} 75 76define i1 @length2_gt_const(ptr %X, ptr %Y) nounwind { 77; X64-LABEL: length2_gt_const: 78; X64: # %bb.0: 79; X64-NEXT: movzwl (%rdi), %eax 80; X64-NEXT: rolw $8, %ax 81; X64-NEXT: movzwl %ax, %eax 82; X64-NEXT: addl $-12594, %eax # imm = 0xCECE 83; X64-NEXT: testl %eax, %eax 84; X64-NEXT: setg %al 85; X64-NEXT: retq 86 %m = tail call i32 @memcmp(ptr %X, ptr getelementptr inbounds ([513 x i8], ptr @.str, i32 0, i32 1), i64 2) nounwind 87 %c = icmp sgt i32 %m, 0 88 ret i1 %c 89} 90 91define i1 @length2_eq(ptr %X, ptr %Y) nounwind { 92; X64-LABEL: length2_eq: 93; X64: # %bb.0: 94; X64-NEXT: movzwl (%rdi), %eax 95; X64-NEXT: cmpw (%rsi), %ax 96; X64-NEXT: sete %al 97; X64-NEXT: retq 98 %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 2) nounwind 99 %c = icmp eq i32 %m, 0 100 ret i1 %c 101} 102 103define i1 @length2_lt(ptr %X, ptr %Y) nounwind { 104; X64-LABEL: length2_lt: 105; X64: # %bb.0: 106; X64-NEXT: movzwl (%rdi), %eax 107; X64-NEXT: movzwl (%rsi), %ecx 108; X64-NEXT: rolw $8, %ax 109; X64-NEXT: rolw $8, %cx 110; X64-NEXT: movzwl %ax, %eax 111; X64-NEXT: movzwl %cx, %ecx 112; X64-NEXT: subl %ecx, %eax 113; X64-NEXT: shrl $31, %eax 114; X64-NEXT: # kill: def $al killed $al killed $eax 115; X64-NEXT: retq 116 %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 2) nounwind 117 %c = icmp slt i32 %m, 0 118 ret i1 %c 119} 120 121define i1 @length2_gt(ptr %X, ptr %Y) nounwind { 122; X64-LABEL: length2_gt: 123; X64: # %bb.0: 124; X64-NEXT: movzwl (%rdi), %eax 125; X64-NEXT: movzwl (%rsi), %ecx 126; X64-NEXT: rolw $8, %ax 127; X64-NEXT: rolw $8, %cx 128; X64-NEXT: movzwl %ax, %eax 129; X64-NEXT: movzwl %cx, %ecx 130; X64-NEXT: subl %ecx, %eax 131; X64-NEXT: testl %eax, %eax 132; X64-NEXT: setg %al 133; X64-NEXT: retq 134 %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 2) nounwind 135 %c = icmp sgt i32 %m, 0 136 ret i1 %c 137} 138 139define i1 @length2_eq_const(ptr %X) nounwind { 140; X64-LABEL: length2_eq_const: 141; X64: # %bb.0: 142; X64-NEXT: movzwl (%rdi), %eax 143; X64-NEXT: cmpl $12849, %eax # imm = 0x3231 144; X64-NEXT: setne %al 145; X64-NEXT: retq 146 %m = tail call i32 @memcmp(ptr %X, ptr getelementptr inbounds ([513 x i8], ptr @.str, i32 0, i32 1), i64 2) nounwind 147 %c = icmp ne i32 %m, 0 148 ret i1 %c 149} 150 151define i1 @length2_eq_nobuiltin_attr(ptr %X, ptr %Y) nounwind { 152; X64-LABEL: length2_eq_nobuiltin_attr: 153; X64: # %bb.0: 154; X64-NEXT: pushq %rax 155; X64-NEXT: movl $2, %edx 156; X64-NEXT: callq memcmp 157; X64-NEXT: testl %eax, %eax 158; X64-NEXT: sete %al 159; X64-NEXT: popq %rcx 160; X64-NEXT: retq 161 %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 2) nounwind nobuiltin 162 %c = icmp eq i32 %m, 0 163 ret i1 %c 164} 165 166define i32 @length3(ptr %X, ptr %Y) nounwind { 167; X64-LABEL: length3: 168; X64: # %bb.0: 169; X64-NEXT: movzwl (%rdi), %eax 170; X64-NEXT: movzwl (%rsi), %ecx 171; X64-NEXT: rolw $8, %ax 172; X64-NEXT: rolw $8, %cx 173; X64-NEXT: cmpw %cx, %ax 174; X64-NEXT: jne .LBB11_3 175; X64-NEXT: # %bb.1: # %loadbb1 176; X64-NEXT: movzbl 2(%rdi), %eax 177; X64-NEXT: movzbl 2(%rsi), %ecx 178; X64-NEXT: subl %ecx, %eax 179; X64-NEXT: retq 180; X64-NEXT: .LBB11_3: # %res_block 181; X64-NEXT: setae %al 182; X64-NEXT: movzbl %al, %eax 183; X64-NEXT: leal -1(%rax,%rax), %eax 184; X64-NEXT: retq 185 %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 3) nounwind 186 ret i32 %m 187} 188 189define i1 @length3_eq(ptr %X, ptr %Y) nounwind { 190; X64-LABEL: length3_eq: 191; X64: # %bb.0: 192; X64-NEXT: movzwl (%rdi), %eax 193; X64-NEXT: xorw (%rsi), %ax 194; X64-NEXT: movzbl 2(%rdi), %ecx 195; X64-NEXT: xorb 2(%rsi), %cl 196; X64-NEXT: movzbl %cl, %ecx 197; X64-NEXT: orw %ax, %cx 198; X64-NEXT: setne %al 199; X64-NEXT: retq 200 %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 3) nounwind 201 %c = icmp ne i32 %m, 0 202 ret i1 %c 203} 204 205define i32 @length4(ptr %X, ptr %Y) nounwind { 206; X64-LABEL: length4: 207; X64: # %bb.0: 208; X64-NEXT: movl (%rdi), %ecx 209; X64-NEXT: movl (%rsi), %edx 210; X64-NEXT: bswapl %ecx 211; X64-NEXT: bswapl %edx 212; X64-NEXT: xorl %eax, %eax 213; X64-NEXT: cmpl %edx, %ecx 214; X64-NEXT: seta %al 215; X64-NEXT: sbbl $0, %eax 216; X64-NEXT: retq 217 %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 4) nounwind 218 ret i32 %m 219} 220 221define i1 @length4_eq(ptr %X, ptr %Y) nounwind { 222; X64-LABEL: length4_eq: 223; X64: # %bb.0: 224; X64-NEXT: movl (%rdi), %eax 225; X64-NEXT: cmpl (%rsi), %eax 226; X64-NEXT: setne %al 227; X64-NEXT: retq 228 %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 4) nounwind 229 %c = icmp ne i32 %m, 0 230 ret i1 %c 231} 232 233define i1 @length4_lt(ptr %X, ptr %Y) nounwind { 234; X64-LABEL: length4_lt: 235; X64: # %bb.0: 236; X64-NEXT: movl (%rdi), %ecx 237; X64-NEXT: movl (%rsi), %edx 238; X64-NEXT: bswapl %ecx 239; X64-NEXT: bswapl %edx 240; X64-NEXT: xorl %eax, %eax 241; X64-NEXT: cmpl %edx, %ecx 242; X64-NEXT: seta %al 243; X64-NEXT: sbbl $0, %eax 244; X64-NEXT: shrl $31, %eax 245; X64-NEXT: # kill: def $al killed $al killed $eax 246; X64-NEXT: retq 247 %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 4) nounwind 248 %c = icmp slt i32 %m, 0 249 ret i1 %c 250} 251 252define i1 @length4_gt(ptr %X, ptr %Y) nounwind { 253; X64-LABEL: length4_gt: 254; X64: # %bb.0: 255; X64-NEXT: movl (%rdi), %eax 256; X64-NEXT: movl (%rsi), %ecx 257; X64-NEXT: bswapl %eax 258; X64-NEXT: bswapl %ecx 259; X64-NEXT: xorl %edx, %edx 260; X64-NEXT: cmpl %ecx, %eax 261; X64-NEXT: seta %dl 262; X64-NEXT: sbbl $0, %edx 263; X64-NEXT: testl %edx, %edx 264; X64-NEXT: setg %al 265; X64-NEXT: retq 266 %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 4) nounwind 267 %c = icmp sgt i32 %m, 0 268 ret i1 %c 269} 270 271define i1 @length4_eq_const(ptr %X) nounwind { 272; X64-LABEL: length4_eq_const: 273; X64: # %bb.0: 274; X64-NEXT: cmpl $875770417, (%rdi) # imm = 0x34333231 275; X64-NEXT: sete %al 276; X64-NEXT: retq 277 %m = tail call i32 @memcmp(ptr %X, ptr getelementptr inbounds ([513 x i8], ptr @.str, i32 0, i32 1), i64 4) nounwind 278 %c = icmp eq i32 %m, 0 279 ret i1 %c 280} 281 282define i32 @length5(ptr %X, ptr %Y) nounwind { 283; X64-LABEL: length5: 284; X64: # %bb.0: 285; X64-NEXT: movl (%rdi), %eax 286; X64-NEXT: movl (%rsi), %ecx 287; X64-NEXT: bswapl %eax 288; X64-NEXT: bswapl %ecx 289; X64-NEXT: cmpl %ecx, %eax 290; X64-NEXT: jne .LBB18_3 291; X64-NEXT: # %bb.1: # %loadbb1 292; X64-NEXT: movzbl 4(%rdi), %eax 293; X64-NEXT: movzbl 4(%rsi), %ecx 294; X64-NEXT: subl %ecx, %eax 295; X64-NEXT: retq 296; X64-NEXT: .LBB18_3: # %res_block 297; X64-NEXT: setae %al 298; X64-NEXT: movzbl %al, %eax 299; X64-NEXT: leal -1(%rax,%rax), %eax 300; X64-NEXT: retq 301 %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 5) nounwind 302 ret i32 %m 303} 304 305define i1 @length5_eq(ptr %X, ptr %Y) nounwind { 306; X64-LABEL: length5_eq: 307; X64: # %bb.0: 308; X64-NEXT: movl (%rdi), %eax 309; X64-NEXT: xorl (%rsi), %eax 310; X64-NEXT: movzbl 4(%rdi), %ecx 311; X64-NEXT: xorb 4(%rsi), %cl 312; X64-NEXT: movzbl %cl, %ecx 313; X64-NEXT: orl %eax, %ecx 314; X64-NEXT: setne %al 315; X64-NEXT: retq 316 %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 5) nounwind 317 %c = icmp ne i32 %m, 0 318 ret i1 %c 319} 320 321define i1 @length5_lt(ptr %X, ptr %Y) nounwind { 322; X64-LABEL: length5_lt: 323; X64: # %bb.0: 324; X64-NEXT: movl (%rdi), %eax 325; X64-NEXT: movl (%rsi), %ecx 326; X64-NEXT: bswapl %eax 327; X64-NEXT: bswapl %ecx 328; X64-NEXT: cmpl %ecx, %eax 329; X64-NEXT: jne .LBB20_3 330; X64-NEXT: # %bb.1: # %loadbb1 331; X64-NEXT: movzbl 4(%rdi), %eax 332; X64-NEXT: movzbl 4(%rsi), %ecx 333; X64-NEXT: subl %ecx, %eax 334; X64-NEXT: shrl $31, %eax 335; X64-NEXT: # kill: def $al killed $al killed $eax 336; X64-NEXT: retq 337; X64-NEXT: .LBB20_3: # %res_block 338; X64-NEXT: setae %al 339; X64-NEXT: movzbl %al, %eax 340; X64-NEXT: leal -1(%rax,%rax), %eax 341; X64-NEXT: shrl $31, %eax 342; X64-NEXT: # kill: def $al killed $al killed $eax 343; X64-NEXT: retq 344 %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 5) nounwind 345 %c = icmp slt i32 %m, 0 346 ret i1 %c 347} 348 349define i32 @length7(ptr %X, ptr %Y) nounwind { 350; X64-LABEL: length7: 351; X64: # %bb.0: 352; X64-NEXT: movl (%rdi), %ecx 353; X64-NEXT: movl (%rsi), %edx 354; X64-NEXT: bswapl %ecx 355; X64-NEXT: bswapl %edx 356; X64-NEXT: cmpl %edx, %ecx 357; X64-NEXT: jne .LBB21_2 358; X64-NEXT: # %bb.1: # %loadbb1 359; X64-NEXT: movl 3(%rdi), %ecx 360; X64-NEXT: movl 3(%rsi), %edx 361; X64-NEXT: bswapl %ecx 362; X64-NEXT: bswapl %edx 363; X64-NEXT: xorl %eax, %eax 364; X64-NEXT: cmpl %edx, %ecx 365; X64-NEXT: je .LBB21_3 366; X64-NEXT: .LBB21_2: # %res_block 367; X64-NEXT: xorl %eax, %eax 368; X64-NEXT: cmpl %edx, %ecx 369; X64-NEXT: setae %al 370; X64-NEXT: leal -1(%rax,%rax), %eax 371; X64-NEXT: .LBB21_3: # %endblock 372; X64-NEXT: retq 373 %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 7) nounwind 374 ret i32 %m 375} 376 377define i1 @length7_lt(ptr %X, ptr %Y) nounwind { 378; X64-LABEL: length7_lt: 379; X64: # %bb.0: 380; X64-NEXT: movl (%rdi), %ecx 381; X64-NEXT: movl (%rsi), %edx 382; X64-NEXT: bswapl %ecx 383; X64-NEXT: bswapl %edx 384; X64-NEXT: cmpl %edx, %ecx 385; X64-NEXT: jne .LBB22_2 386; X64-NEXT: # %bb.1: # %loadbb1 387; X64-NEXT: movl 3(%rdi), %ecx 388; X64-NEXT: movl 3(%rsi), %edx 389; X64-NEXT: bswapl %ecx 390; X64-NEXT: bswapl %edx 391; X64-NEXT: xorl %eax, %eax 392; X64-NEXT: cmpl %edx, %ecx 393; X64-NEXT: je .LBB22_3 394; X64-NEXT: .LBB22_2: # %res_block 395; X64-NEXT: xorl %eax, %eax 396; X64-NEXT: cmpl %edx, %ecx 397; X64-NEXT: setae %al 398; X64-NEXT: leal -1(%rax,%rax), %eax 399; X64-NEXT: .LBB22_3: # %endblock 400; X64-NEXT: shrl $31, %eax 401; X64-NEXT: # kill: def $al killed $al killed $eax 402; X64-NEXT: retq 403 %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 7) nounwind 404 %c = icmp slt i32 %m, 0 405 ret i1 %c 406} 407 408define i1 @length7_eq(ptr %X, ptr %Y) nounwind { 409; X64-LABEL: length7_eq: 410; X64: # %bb.0: 411; X64-NEXT: movl (%rdi), %eax 412; X64-NEXT: movl 3(%rdi), %ecx 413; X64-NEXT: xorl (%rsi), %eax 414; X64-NEXT: xorl 3(%rsi), %ecx 415; X64-NEXT: orl %eax, %ecx 416; X64-NEXT: setne %al 417; X64-NEXT: retq 418 %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 7) nounwind 419 %c = icmp ne i32 %m, 0 420 ret i1 %c 421} 422 423define i32 @length8(ptr %X, ptr %Y) nounwind { 424; X64-LABEL: length8: 425; X64: # %bb.0: 426; X64-NEXT: movq (%rdi), %rcx 427; X64-NEXT: movq (%rsi), %rdx 428; X64-NEXT: bswapq %rcx 429; X64-NEXT: bswapq %rdx 430; X64-NEXT: xorl %eax, %eax 431; X64-NEXT: cmpq %rdx, %rcx 432; X64-NEXT: seta %al 433; X64-NEXT: sbbl $0, %eax 434; X64-NEXT: retq 435 %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 8) nounwind 436 ret i32 %m 437} 438 439define i1 @length8_eq(ptr %X, ptr %Y) nounwind { 440; X64-LABEL: length8_eq: 441; X64: # %bb.0: 442; X64-NEXT: movq (%rdi), %rax 443; X64-NEXT: cmpq (%rsi), %rax 444; X64-NEXT: sete %al 445; X64-NEXT: retq 446 %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 8) nounwind 447 %c = icmp eq i32 %m, 0 448 ret i1 %c 449} 450 451define i1 @length8_eq_const(ptr %X) nounwind { 452; X64-LABEL: length8_eq_const: 453; X64: # %bb.0: 454; X64-NEXT: movabsq $3978425819141910832, %rax # imm = 0x3736353433323130 455; X64-NEXT: cmpq %rax, (%rdi) 456; X64-NEXT: setne %al 457; X64-NEXT: retq 458 %m = tail call i32 @memcmp(ptr %X, ptr @.str, i64 8) nounwind 459 %c = icmp ne i32 %m, 0 460 ret i1 %c 461} 462 463define i1 @length9_eq(ptr %X, ptr %Y) nounwind { 464; X64-LABEL: length9_eq: 465; X64: # %bb.0: 466; X64-NEXT: movq (%rdi), %rax 467; X64-NEXT: xorq (%rsi), %rax 468; X64-NEXT: movzbl 8(%rdi), %ecx 469; X64-NEXT: xorb 8(%rsi), %cl 470; X64-NEXT: movzbl %cl, %ecx 471; X64-NEXT: orq %rax, %rcx 472; X64-NEXT: sete %al 473; X64-NEXT: retq 474 %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 9) nounwind 475 %c = icmp eq i32 %m, 0 476 ret i1 %c 477} 478 479define i1 @length10_eq(ptr %X, ptr %Y) nounwind { 480; X64-LABEL: length10_eq: 481; X64: # %bb.0: 482; X64-NEXT: movq (%rdi), %rax 483; X64-NEXT: xorq (%rsi), %rax 484; X64-NEXT: movzwl 8(%rdi), %ecx 485; X64-NEXT: xorw 8(%rsi), %cx 486; X64-NEXT: movzwl %cx, %ecx 487; X64-NEXT: orq %rax, %rcx 488; X64-NEXT: sete %al 489; X64-NEXT: retq 490 %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 10) nounwind 491 %c = icmp eq i32 %m, 0 492 ret i1 %c 493} 494 495define i1 @length11_eq(ptr %X, ptr %Y) nounwind { 496; X64-LABEL: length11_eq: 497; X64: # %bb.0: 498; X64-NEXT: movq (%rdi), %rax 499; X64-NEXT: movq 3(%rdi), %rcx 500; X64-NEXT: xorq (%rsi), %rax 501; X64-NEXT: xorq 3(%rsi), %rcx 502; X64-NEXT: orq %rax, %rcx 503; X64-NEXT: sete %al 504; X64-NEXT: retq 505 %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 11) nounwind 506 %c = icmp eq i32 %m, 0 507 ret i1 %c 508} 509 510define i1 @length12_eq(ptr %X, ptr %Y) nounwind { 511; X64-LABEL: length12_eq: 512; X64: # %bb.0: 513; X64-NEXT: movq (%rdi), %rax 514; X64-NEXT: xorq (%rsi), %rax 515; X64-NEXT: movl 8(%rdi), %ecx 516; X64-NEXT: xorl 8(%rsi), %ecx 517; X64-NEXT: orq %rax, %rcx 518; X64-NEXT: setne %al 519; X64-NEXT: retq 520 %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 12) nounwind 521 %c = icmp ne i32 %m, 0 522 ret i1 %c 523} 524 525define i32 @length12(ptr %X, ptr %Y) nounwind { 526; X64-LABEL: length12: 527; X64: # %bb.0: 528; X64-NEXT: movq (%rdi), %rcx 529; X64-NEXT: movq (%rsi), %rdx 530; X64-NEXT: bswapq %rcx 531; X64-NEXT: bswapq %rdx 532; X64-NEXT: cmpq %rdx, %rcx 533; X64-NEXT: jne .LBB31_2 534; X64-NEXT: # %bb.1: # %loadbb1 535; X64-NEXT: movl 8(%rdi), %ecx 536; X64-NEXT: movl 8(%rsi), %edx 537; X64-NEXT: bswapl %ecx 538; X64-NEXT: bswapl %edx 539; X64-NEXT: xorl %eax, %eax 540; X64-NEXT: cmpq %rdx, %rcx 541; X64-NEXT: je .LBB31_3 542; X64-NEXT: .LBB31_2: # %res_block 543; X64-NEXT: xorl %eax, %eax 544; X64-NEXT: cmpq %rdx, %rcx 545; X64-NEXT: setae %al 546; X64-NEXT: leal -1(%rax,%rax), %eax 547; X64-NEXT: .LBB31_3: # %endblock 548; X64-NEXT: retq 549 %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 12) nounwind 550 ret i32 %m 551} 552 553define i1 @length13_eq(ptr %X, ptr %Y) nounwind { 554; X64-LABEL: length13_eq: 555; X64: # %bb.0: 556; X64-NEXT: movq (%rdi), %rax 557; X64-NEXT: movq 5(%rdi), %rcx 558; X64-NEXT: xorq (%rsi), %rax 559; X64-NEXT: xorq 5(%rsi), %rcx 560; X64-NEXT: orq %rax, %rcx 561; X64-NEXT: sete %al 562; X64-NEXT: retq 563 %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 13) nounwind 564 %c = icmp eq i32 %m, 0 565 ret i1 %c 566} 567 568define i1 @length14_eq(ptr %X, ptr %Y) nounwind { 569; X64-LABEL: length14_eq: 570; X64: # %bb.0: 571; X64-NEXT: movq (%rdi), %rax 572; X64-NEXT: movq 6(%rdi), %rcx 573; X64-NEXT: xorq (%rsi), %rax 574; X64-NEXT: xorq 6(%rsi), %rcx 575; X64-NEXT: orq %rax, %rcx 576; X64-NEXT: sete %al 577; X64-NEXT: retq 578 %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 14) nounwind 579 %c = icmp eq i32 %m, 0 580 ret i1 %c 581} 582 583define i32 @length15(ptr %X, ptr %Y) nounwind { 584; X64-LABEL: length15: 585; X64: # %bb.0: 586; X64-NEXT: movq (%rdi), %rcx 587; X64-NEXT: movq (%rsi), %rdx 588; X64-NEXT: bswapq %rcx 589; X64-NEXT: bswapq %rdx 590; X64-NEXT: cmpq %rdx, %rcx 591; X64-NEXT: jne .LBB34_2 592; X64-NEXT: # %bb.1: # %loadbb1 593; X64-NEXT: movq 7(%rdi), %rcx 594; X64-NEXT: movq 7(%rsi), %rdx 595; X64-NEXT: bswapq %rcx 596; X64-NEXT: bswapq %rdx 597; X64-NEXT: xorl %eax, %eax 598; X64-NEXT: cmpq %rdx, %rcx 599; X64-NEXT: je .LBB34_3 600; X64-NEXT: .LBB34_2: # %res_block 601; X64-NEXT: xorl %eax, %eax 602; X64-NEXT: cmpq %rdx, %rcx 603; X64-NEXT: setae %al 604; X64-NEXT: leal -1(%rax,%rax), %eax 605; X64-NEXT: .LBB34_3: # %endblock 606; X64-NEXT: retq 607 %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 15) nounwind 608 ret i32 %m 609} 610 611define i1 @length15_lt(ptr %X, ptr %Y) nounwind { 612; X64-LABEL: length15_lt: 613; X64: # %bb.0: 614; X64-NEXT: movq (%rdi), %rcx 615; X64-NEXT: movq (%rsi), %rdx 616; X64-NEXT: bswapq %rcx 617; X64-NEXT: bswapq %rdx 618; X64-NEXT: cmpq %rdx, %rcx 619; X64-NEXT: jne .LBB35_2 620; X64-NEXT: # %bb.1: # %loadbb1 621; X64-NEXT: movq 7(%rdi), %rcx 622; X64-NEXT: movq 7(%rsi), %rdx 623; X64-NEXT: bswapq %rcx 624; X64-NEXT: bswapq %rdx 625; X64-NEXT: xorl %eax, %eax 626; X64-NEXT: cmpq %rdx, %rcx 627; X64-NEXT: je .LBB35_3 628; X64-NEXT: .LBB35_2: # %res_block 629; X64-NEXT: xorl %eax, %eax 630; X64-NEXT: cmpq %rdx, %rcx 631; X64-NEXT: setae %al 632; X64-NEXT: leal -1(%rax,%rax), %eax 633; X64-NEXT: .LBB35_3: # %endblock 634; X64-NEXT: shrl $31, %eax 635; X64-NEXT: # kill: def $al killed $al killed $eax 636; X64-NEXT: retq 637 %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 15) nounwind 638 %c = icmp slt i32 %m, 0 639 ret i1 %c 640} 641 642define i32 @length15_const(ptr %X, ptr %Y) nounwind { 643; X64-LABEL: length15_const: 644; X64: # %bb.0: 645; X64-NEXT: movabsq $3544952156018063160, %rcx # imm = 0x3132333435363738 646; X64-NEXT: movq (%rdi), %rdx 647; X64-NEXT: bswapq %rdx 648; X64-NEXT: cmpq %rcx, %rdx 649; X64-NEXT: jne .LBB36_2 650; X64-NEXT: # %bb.1: # %loadbb1 651; X64-NEXT: movabsq $4051322327650219061, %rcx # imm = 0x3839303132333435 652; X64-NEXT: movq 7(%rdi), %rdx 653; X64-NEXT: bswapq %rdx 654; X64-NEXT: xorl %eax, %eax 655; X64-NEXT: cmpq %rcx, %rdx 656; X64-NEXT: je .LBB36_3 657; X64-NEXT: .LBB36_2: # %res_block 658; X64-NEXT: xorl %eax, %eax 659; X64-NEXT: cmpq %rcx, %rdx 660; X64-NEXT: setae %al 661; X64-NEXT: leal -1(%rax,%rax), %eax 662; X64-NEXT: .LBB36_3: # %endblock 663; X64-NEXT: retq 664 %m = tail call i32 @memcmp(ptr %X, ptr getelementptr inbounds ([513 x i8], ptr @.str, i32 0, i32 1), i64 15) nounwind 665 ret i32 %m 666} 667 668define i1 @length15_eq(ptr %X, ptr %Y) nounwind { 669; X64-LABEL: length15_eq: 670; X64: # %bb.0: 671; X64-NEXT: movq (%rdi), %rax 672; X64-NEXT: movq 7(%rdi), %rcx 673; X64-NEXT: xorq (%rsi), %rax 674; X64-NEXT: xorq 7(%rsi), %rcx 675; X64-NEXT: orq %rax, %rcx 676; X64-NEXT: sete %al 677; X64-NEXT: retq 678 %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 15) nounwind 679 %c = icmp eq i32 %m, 0 680 ret i1 %c 681} 682 683define i1 @length15_gt_const(ptr %X, ptr %Y) nounwind { 684; X64-LABEL: length15_gt_const: 685; X64: # %bb.0: 686; X64-NEXT: movabsq $3544952156018063160, %rax # imm = 0x3132333435363738 687; X64-NEXT: movq (%rdi), %rcx 688; X64-NEXT: bswapq %rcx 689; X64-NEXT: cmpq %rax, %rcx 690; X64-NEXT: jne .LBB38_2 691; X64-NEXT: # %bb.1: # %loadbb1 692; X64-NEXT: movabsq $4051322327650219061, %rax # imm = 0x3839303132333435 693; X64-NEXT: movq 7(%rdi), %rcx 694; X64-NEXT: bswapq %rcx 695; X64-NEXT: xorl %edx, %edx 696; X64-NEXT: cmpq %rax, %rcx 697; X64-NEXT: je .LBB38_3 698; X64-NEXT: .LBB38_2: # %res_block 699; X64-NEXT: xorl %edx, %edx 700; X64-NEXT: cmpq %rax, %rcx 701; X64-NEXT: setae %dl 702; X64-NEXT: leal -1(%rdx,%rdx), %edx 703; X64-NEXT: .LBB38_3: # %endblock 704; X64-NEXT: testl %edx, %edx 705; X64-NEXT: setg %al 706; X64-NEXT: retq 707 %m = tail call i32 @memcmp(ptr %X, ptr getelementptr inbounds ([513 x i8], ptr @.str, i32 0, i32 1), i64 15) nounwind 708 %c = icmp sgt i32 %m, 0 709 ret i1 %c 710} 711 712; PR33329 - https://bugs.llvm.org/show_bug.cgi?id=33329 713 714define i32 @length16(ptr %X, ptr %Y) nounwind { 715; X64-LABEL: length16: 716; X64: # %bb.0: 717; X64-NEXT: movq (%rdi), %rcx 718; X64-NEXT: movq (%rsi), %rdx 719; X64-NEXT: bswapq %rcx 720; X64-NEXT: bswapq %rdx 721; X64-NEXT: cmpq %rdx, %rcx 722; X64-NEXT: jne .LBB39_2 723; X64-NEXT: # %bb.1: # %loadbb1 724; X64-NEXT: movq 8(%rdi), %rcx 725; X64-NEXT: movq 8(%rsi), %rdx 726; X64-NEXT: bswapq %rcx 727; X64-NEXT: bswapq %rdx 728; X64-NEXT: xorl %eax, %eax 729; X64-NEXT: cmpq %rdx, %rcx 730; X64-NEXT: je .LBB39_3 731; X64-NEXT: .LBB39_2: # %res_block 732; X64-NEXT: xorl %eax, %eax 733; X64-NEXT: cmpq %rdx, %rcx 734; X64-NEXT: setae %al 735; X64-NEXT: leal -1(%rax,%rax), %eax 736; X64-NEXT: .LBB39_3: # %endblock 737; X64-NEXT: retq 738 %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 16) nounwind 739 ret i32 %m 740} 741 742define i1 @length16_eq(ptr %x, ptr %y) nounwind { 743; X64-SSE2-LABEL: length16_eq: 744; X64-SSE2: # %bb.0: 745; X64-SSE2-NEXT: movdqu (%rdi), %xmm0 746; X64-SSE2-NEXT: movdqu (%rsi), %xmm1 747; X64-SSE2-NEXT: pcmpeqb %xmm0, %xmm1 748; X64-SSE2-NEXT: pmovmskb %xmm1, %eax 749; X64-SSE2-NEXT: cmpl $65535, %eax # imm = 0xFFFF 750; X64-SSE2-NEXT: setne %al 751; X64-SSE2-NEXT: retq 752; 753; X64-SSE41-LABEL: length16_eq: 754; X64-SSE41: # %bb.0: 755; X64-SSE41-NEXT: movdqu (%rdi), %xmm0 756; X64-SSE41-NEXT: movdqu (%rsi), %xmm1 757; X64-SSE41-NEXT: pxor %xmm0, %xmm1 758; X64-SSE41-NEXT: ptest %xmm1, %xmm1 759; X64-SSE41-NEXT: setne %al 760; X64-SSE41-NEXT: retq 761; 762; X64-AVX-LABEL: length16_eq: 763; X64-AVX: # %bb.0: 764; X64-AVX-NEXT: vmovdqu (%rdi), %xmm0 765; X64-AVX-NEXT: vpxor (%rsi), %xmm0, %xmm0 766; X64-AVX-NEXT: vptest %xmm0, %xmm0 767; X64-AVX-NEXT: setne %al 768; X64-AVX-NEXT: retq 769; 770; X64-MIC-AVX-LABEL: length16_eq: 771; X64-MIC-AVX: # %bb.0: 772; X64-MIC-AVX-NEXT: vmovdqu (%rdi), %xmm0 773; X64-MIC-AVX-NEXT: vmovdqu (%rsi), %xmm1 774; X64-MIC-AVX-NEXT: vpcmpneqd %zmm1, %zmm0, %k0 775; X64-MIC-AVX-NEXT: kortestw %k0, %k0 776; X64-MIC-AVX-NEXT: setne %al 777; X64-MIC-AVX-NEXT: vzeroupper 778; X64-MIC-AVX-NEXT: retq 779 %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 16) nounwind 780 %cmp = icmp ne i32 %call, 0 781 ret i1 %cmp 782} 783 784define i1 @length16_lt(ptr %x, ptr %y) nounwind { 785; X64-LABEL: length16_lt: 786; X64: # %bb.0: 787; X64-NEXT: movq (%rdi), %rcx 788; X64-NEXT: movq (%rsi), %rdx 789; X64-NEXT: bswapq %rcx 790; X64-NEXT: bswapq %rdx 791; X64-NEXT: cmpq %rdx, %rcx 792; X64-NEXT: jne .LBB41_2 793; X64-NEXT: # %bb.1: # %loadbb1 794; X64-NEXT: movq 8(%rdi), %rcx 795; X64-NEXT: movq 8(%rsi), %rdx 796; X64-NEXT: bswapq %rcx 797; X64-NEXT: bswapq %rdx 798; X64-NEXT: xorl %eax, %eax 799; X64-NEXT: cmpq %rdx, %rcx 800; X64-NEXT: je .LBB41_3 801; X64-NEXT: .LBB41_2: # %res_block 802; X64-NEXT: xorl %eax, %eax 803; X64-NEXT: cmpq %rdx, %rcx 804; X64-NEXT: setae %al 805; X64-NEXT: leal -1(%rax,%rax), %eax 806; X64-NEXT: .LBB41_3: # %endblock 807; X64-NEXT: shrl $31, %eax 808; X64-NEXT: # kill: def $al killed $al killed $eax 809; X64-NEXT: retq 810 %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 16) nounwind 811 %cmp = icmp slt i32 %call, 0 812 ret i1 %cmp 813} 814 815define i1 @length16_gt(ptr %x, ptr %y) nounwind { 816; X64-LABEL: length16_gt: 817; X64: # %bb.0: 818; X64-NEXT: movq (%rdi), %rax 819; X64-NEXT: movq (%rsi), %rcx 820; X64-NEXT: bswapq %rax 821; X64-NEXT: bswapq %rcx 822; X64-NEXT: cmpq %rcx, %rax 823; X64-NEXT: jne .LBB42_2 824; X64-NEXT: # %bb.1: # %loadbb1 825; X64-NEXT: movq 8(%rdi), %rax 826; X64-NEXT: movq 8(%rsi), %rcx 827; X64-NEXT: bswapq %rax 828; X64-NEXT: bswapq %rcx 829; X64-NEXT: xorl %edx, %edx 830; X64-NEXT: cmpq %rcx, %rax 831; X64-NEXT: je .LBB42_3 832; X64-NEXT: .LBB42_2: # %res_block 833; X64-NEXT: xorl %edx, %edx 834; X64-NEXT: cmpq %rcx, %rax 835; X64-NEXT: setae %dl 836; X64-NEXT: leal -1(%rdx,%rdx), %edx 837; X64-NEXT: .LBB42_3: # %endblock 838; X64-NEXT: testl %edx, %edx 839; X64-NEXT: setg %al 840; X64-NEXT: retq 841 %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 16) nounwind 842 %cmp = icmp sgt i32 %call, 0 843 ret i1 %cmp 844} 845 846define i1 @length16_eq_const(ptr %X) nounwind { 847; X64-SSE2-LABEL: length16_eq_const: 848; X64-SSE2: # %bb.0: 849; X64-SSE2-NEXT: movdqu (%rdi), %xmm0 850; X64-SSE2-NEXT: pcmpeqb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0 851; X64-SSE2-NEXT: pmovmskb %xmm0, %eax 852; X64-SSE2-NEXT: cmpl $65535, %eax # imm = 0xFFFF 853; X64-SSE2-NEXT: sete %al 854; X64-SSE2-NEXT: retq 855; 856; X64-SSE41-LABEL: length16_eq_const: 857; X64-SSE41: # %bb.0: 858; X64-SSE41-NEXT: movdqu (%rdi), %xmm0 859; X64-SSE41-NEXT: pxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0 860; X64-SSE41-NEXT: ptest %xmm0, %xmm0 861; X64-SSE41-NEXT: sete %al 862; X64-SSE41-NEXT: retq 863; 864; X64-AVX-LABEL: length16_eq_const: 865; X64-AVX: # %bb.0: 866; X64-AVX-NEXT: vmovdqu (%rdi), %xmm0 867; X64-AVX-NEXT: vpxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0 868; X64-AVX-NEXT: vptest %xmm0, %xmm0 869; X64-AVX-NEXT: sete %al 870; X64-AVX-NEXT: retq 871; 872; X64-MIC-AVX-LABEL: length16_eq_const: 873; X64-MIC-AVX: # %bb.0: 874; X64-MIC-AVX-NEXT: vmovdqu (%rdi), %xmm0 875; X64-MIC-AVX-NEXT: vmovdqa {{.*#+}} xmm1 = [858927408,926299444,825243960,892613426] 876; X64-MIC-AVX-NEXT: vpcmpneqd %zmm1, %zmm0, %k0 877; X64-MIC-AVX-NEXT: kortestw %k0, %k0 878; X64-MIC-AVX-NEXT: sete %al 879; X64-MIC-AVX-NEXT: vzeroupper 880; X64-MIC-AVX-NEXT: retq 881 %m = tail call i32 @memcmp(ptr %X, ptr @.str, i64 16) nounwind 882 %c = icmp eq i32 %m, 0 883 ret i1 %c 884} 885 886; PR33914 - https://bugs.llvm.org/show_bug.cgi?id=33914 887 888define i32 @length24(ptr %X, ptr %Y) nounwind { 889; X64-LABEL: length24: 890; X64: # %bb.0: 891; X64-NEXT: movl $24, %edx 892; X64-NEXT: jmp memcmp # TAILCALL 893 %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 24) nounwind 894 ret i32 %m 895} 896 897define i1 @length24_eq(ptr %x, ptr %y) nounwind { 898; X64-SSE2-LABEL: length24_eq: 899; X64-SSE2: # %bb.0: 900; X64-SSE2-NEXT: movdqu (%rdi), %xmm0 901; X64-SSE2-NEXT: movdqu (%rsi), %xmm1 902; X64-SSE2-NEXT: pcmpeqb %xmm0, %xmm1 903; X64-SSE2-NEXT: movq {{.*#+}} xmm0 = mem[0],zero 904; X64-SSE2-NEXT: movq {{.*#+}} xmm2 = mem[0],zero 905; X64-SSE2-NEXT: pcmpeqb %xmm0, %xmm2 906; X64-SSE2-NEXT: pand %xmm1, %xmm2 907; X64-SSE2-NEXT: pmovmskb %xmm2, %eax 908; X64-SSE2-NEXT: cmpl $65535, %eax # imm = 0xFFFF 909; X64-SSE2-NEXT: sete %al 910; X64-SSE2-NEXT: retq 911; 912; X64-SSE41-LABEL: length24_eq: 913; X64-SSE41: # %bb.0: 914; X64-SSE41-NEXT: movdqu (%rdi), %xmm0 915; X64-SSE41-NEXT: movdqu (%rsi), %xmm1 916; X64-SSE41-NEXT: pxor %xmm0, %xmm1 917; X64-SSE41-NEXT: movq {{.*#+}} xmm0 = mem[0],zero 918; X64-SSE41-NEXT: movq {{.*#+}} xmm2 = mem[0],zero 919; X64-SSE41-NEXT: pxor %xmm0, %xmm2 920; X64-SSE41-NEXT: por %xmm1, %xmm2 921; X64-SSE41-NEXT: ptest %xmm2, %xmm2 922; X64-SSE41-NEXT: sete %al 923; X64-SSE41-NEXT: retq 924; 925; X64-AVX-LABEL: length24_eq: 926; X64-AVX: # %bb.0: 927; X64-AVX-NEXT: vmovdqu (%rdi), %xmm0 928; X64-AVX-NEXT: vmovq {{.*#+}} xmm1 = mem[0],zero 929; X64-AVX-NEXT: vmovq {{.*#+}} xmm2 = mem[0],zero 930; X64-AVX-NEXT: vpxor %xmm2, %xmm1, %xmm1 931; X64-AVX-NEXT: vpxor (%rsi), %xmm0, %xmm0 932; X64-AVX-NEXT: vpor %xmm0, %xmm1, %xmm0 933; X64-AVX-NEXT: vptest %xmm0, %xmm0 934; X64-AVX-NEXT: sete %al 935; X64-AVX-NEXT: retq 936; 937; X64-MIC-AVX-LABEL: length24_eq: 938; X64-MIC-AVX: # %bb.0: 939; X64-MIC-AVX-NEXT: vmovdqu (%rdi), %xmm0 940; X64-MIC-AVX-NEXT: vmovdqu (%rsi), %xmm1 941; X64-MIC-AVX-NEXT: vmovq {{.*#+}} xmm2 = mem[0],zero 942; X64-MIC-AVX-NEXT: vmovq {{.*#+}} xmm3 = mem[0],zero 943; X64-MIC-AVX-NEXT: vpcmpneqd %zmm3, %zmm2, %k0 944; X64-MIC-AVX-NEXT: vpcmpneqd %zmm1, %zmm0, %k1 945; X64-MIC-AVX-NEXT: kortestw %k0, %k1 946; X64-MIC-AVX-NEXT: sete %al 947; X64-MIC-AVX-NEXT: vzeroupper 948; X64-MIC-AVX-NEXT: retq 949 %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 24) nounwind 950 %cmp = icmp eq i32 %call, 0 951 ret i1 %cmp 952} 953 954define i1 @length24_lt(ptr %x, ptr %y) nounwind { 955; X64-LABEL: length24_lt: 956; X64: # %bb.0: 957; X64-NEXT: pushq %rax 958; X64-NEXT: movl $24, %edx 959; X64-NEXT: callq memcmp 960; X64-NEXT: shrl $31, %eax 961; X64-NEXT: # kill: def $al killed $al killed $eax 962; X64-NEXT: popq %rcx 963; X64-NEXT: retq 964 %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 24) nounwind 965 %cmp = icmp slt i32 %call, 0 966 ret i1 %cmp 967} 968 969define i1 @length24_gt(ptr %x, ptr %y) nounwind { 970; X64-LABEL: length24_gt: 971; X64: # %bb.0: 972; X64-NEXT: pushq %rax 973; X64-NEXT: movl $24, %edx 974; X64-NEXT: callq memcmp 975; X64-NEXT: testl %eax, %eax 976; X64-NEXT: setg %al 977; X64-NEXT: popq %rcx 978; X64-NEXT: retq 979 %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 24) nounwind 980 %cmp = icmp sgt i32 %call, 0 981 ret i1 %cmp 982} 983 984define i1 @length24_eq_const(ptr %X) nounwind { 985; X64-SSE2-LABEL: length24_eq_const: 986; X64-SSE2: # %bb.0: 987; X64-SSE2-NEXT: movdqu (%rdi), %xmm0 988; X64-SSE2-NEXT: movq {{.*#+}} xmm1 = mem[0],zero 989; X64-SSE2-NEXT: pcmpeqb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1 990; X64-SSE2-NEXT: pcmpeqb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0 991; X64-SSE2-NEXT: pand %xmm1, %xmm0 992; X64-SSE2-NEXT: pmovmskb %xmm0, %eax 993; X64-SSE2-NEXT: cmpl $65535, %eax # imm = 0xFFFF 994; X64-SSE2-NEXT: setne %al 995; X64-SSE2-NEXT: retq 996; 997; X64-SSE41-LABEL: length24_eq_const: 998; X64-SSE41: # %bb.0: 999; X64-SSE41-NEXT: movdqu (%rdi), %xmm0 1000; X64-SSE41-NEXT: movq {{.*#+}} xmm1 = mem[0],zero 1001; X64-SSE41-NEXT: pxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1 1002; X64-SSE41-NEXT: pxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0 1003; X64-SSE41-NEXT: por %xmm1, %xmm0 1004; X64-SSE41-NEXT: ptest %xmm0, %xmm0 1005; X64-SSE41-NEXT: setne %al 1006; X64-SSE41-NEXT: retq 1007; 1008; X64-AVX-LABEL: length24_eq_const: 1009; X64-AVX: # %bb.0: 1010; X64-AVX-NEXT: vmovdqu (%rdi), %xmm0 1011; X64-AVX-NEXT: vmovq {{.*#+}} xmm1 = mem[0],zero 1012; X64-AVX-NEXT: vpxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1 1013; X64-AVX-NEXT: vpxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0 1014; X64-AVX-NEXT: vpor %xmm1, %xmm0, %xmm0 1015; X64-AVX-NEXT: vptest %xmm0, %xmm0 1016; X64-AVX-NEXT: setne %al 1017; X64-AVX-NEXT: retq 1018; 1019; X64-MIC-AVX-LABEL: length24_eq_const: 1020; X64-MIC-AVX: # %bb.0: 1021; X64-MIC-AVX-NEXT: vmovdqu (%rdi), %xmm0 1022; X64-MIC-AVX-NEXT: vmovq {{.*#+}} xmm1 = mem[0],zero 1023; X64-MIC-AVX-NEXT: vmovdqa {{.*#+}} xmm2 = [959985462,858927408,0,0] 1024; X64-MIC-AVX-NEXT: vpcmpneqd %zmm2, %zmm1, %k0 1025; X64-MIC-AVX-NEXT: vmovdqa {{.*#+}} xmm1 = [858927408,926299444,825243960,892613426] 1026; X64-MIC-AVX-NEXT: vpcmpneqd %zmm1, %zmm0, %k1 1027; X64-MIC-AVX-NEXT: kortestw %k0, %k1 1028; X64-MIC-AVX-NEXT: setne %al 1029; X64-MIC-AVX-NEXT: vzeroupper 1030; X64-MIC-AVX-NEXT: retq 1031 %m = tail call i32 @memcmp(ptr %X, ptr @.str, i64 24) nounwind 1032 %c = icmp ne i32 %m, 0 1033 ret i1 %c 1034} 1035 1036define i32 @length31(ptr %X, ptr %Y) nounwind { 1037; X64-LABEL: length31: 1038; X64: # %bb.0: 1039; X64-NEXT: movl $31, %edx 1040; X64-NEXT: jmp memcmp # TAILCALL 1041 %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 31) nounwind 1042 ret i32 %m 1043} 1044 1045define i1 @length31_eq(ptr %x, ptr %y) nounwind { 1046; X64-SSE2-LABEL: length31_eq: 1047; X64-SSE2: # %bb.0: 1048; X64-SSE2-NEXT: movdqu (%rdi), %xmm0 1049; X64-SSE2-NEXT: movdqu 15(%rdi), %xmm1 1050; X64-SSE2-NEXT: movdqu (%rsi), %xmm2 1051; X64-SSE2-NEXT: pcmpeqb %xmm0, %xmm2 1052; X64-SSE2-NEXT: movdqu 15(%rsi), %xmm0 1053; X64-SSE2-NEXT: pcmpeqb %xmm1, %xmm0 1054; X64-SSE2-NEXT: pand %xmm2, %xmm0 1055; X64-SSE2-NEXT: pmovmskb %xmm0, %eax 1056; X64-SSE2-NEXT: cmpl $65535, %eax # imm = 0xFFFF 1057; X64-SSE2-NEXT: sete %al 1058; X64-SSE2-NEXT: retq 1059; 1060; X64-SSE41-LABEL: length31_eq: 1061; X64-SSE41: # %bb.0: 1062; X64-SSE41-NEXT: movdqu (%rdi), %xmm0 1063; X64-SSE41-NEXT: movdqu 15(%rdi), %xmm1 1064; X64-SSE41-NEXT: movdqu (%rsi), %xmm2 1065; X64-SSE41-NEXT: pxor %xmm0, %xmm2 1066; X64-SSE41-NEXT: movdqu 15(%rsi), %xmm0 1067; X64-SSE41-NEXT: pxor %xmm1, %xmm0 1068; X64-SSE41-NEXT: por %xmm2, %xmm0 1069; X64-SSE41-NEXT: ptest %xmm0, %xmm0 1070; X64-SSE41-NEXT: sete %al 1071; X64-SSE41-NEXT: retq 1072; 1073; X64-AVX-LABEL: length31_eq: 1074; X64-AVX: # %bb.0: 1075; X64-AVX-NEXT: vmovdqu (%rdi), %xmm0 1076; X64-AVX-NEXT: vmovdqu 15(%rdi), %xmm1 1077; X64-AVX-NEXT: vpxor 15(%rsi), %xmm1, %xmm1 1078; X64-AVX-NEXT: vpxor (%rsi), %xmm0, %xmm0 1079; X64-AVX-NEXT: vpor %xmm1, %xmm0, %xmm0 1080; X64-AVX-NEXT: vptest %xmm0, %xmm0 1081; X64-AVX-NEXT: sete %al 1082; X64-AVX-NEXT: retq 1083; 1084; X64-MIC-AVX-LABEL: length31_eq: 1085; X64-MIC-AVX: # %bb.0: 1086; X64-MIC-AVX-NEXT: vmovdqu (%rdi), %xmm0 1087; X64-MIC-AVX-NEXT: vmovdqu 15(%rdi), %xmm1 1088; X64-MIC-AVX-NEXT: vmovdqu (%rsi), %xmm2 1089; X64-MIC-AVX-NEXT: vmovdqu 15(%rsi), %xmm3 1090; X64-MIC-AVX-NEXT: vpcmpneqd %zmm3, %zmm1, %k0 1091; X64-MIC-AVX-NEXT: vpcmpneqd %zmm2, %zmm0, %k1 1092; X64-MIC-AVX-NEXT: kortestw %k0, %k1 1093; X64-MIC-AVX-NEXT: sete %al 1094; X64-MIC-AVX-NEXT: vzeroupper 1095; X64-MIC-AVX-NEXT: retq 1096 %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 31) nounwind 1097 %cmp = icmp eq i32 %call, 0 1098 ret i1 %cmp 1099} 1100 1101define i1 @length31_lt(ptr %x, ptr %y) nounwind { 1102; X64-LABEL: length31_lt: 1103; X64: # %bb.0: 1104; X64-NEXT: pushq %rax 1105; X64-NEXT: movl $31, %edx 1106; X64-NEXT: callq memcmp 1107; X64-NEXT: shrl $31, %eax 1108; X64-NEXT: # kill: def $al killed $al killed $eax 1109; X64-NEXT: popq %rcx 1110; X64-NEXT: retq 1111 %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 31) nounwind 1112 %cmp = icmp slt i32 %call, 0 1113 ret i1 %cmp 1114} 1115 1116define i1 @length31_gt(ptr %x, ptr %y) nounwind { 1117; X64-LABEL: length31_gt: 1118; X64: # %bb.0: 1119; X64-NEXT: pushq %rax 1120; X64-NEXT: movl $31, %edx 1121; X64-NEXT: callq memcmp 1122; X64-NEXT: testl %eax, %eax 1123; X64-NEXT: setg %al 1124; X64-NEXT: popq %rcx 1125; X64-NEXT: retq 1126 %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 31) nounwind 1127 %cmp = icmp sgt i32 %call, 0 1128 ret i1 %cmp 1129} 1130 1131define i1 @length31_eq_prefer128(ptr %x, ptr %y) nounwind "prefer-vector-width"="128" { 1132; X64-SSE2-LABEL: length31_eq_prefer128: 1133; X64-SSE2: # %bb.0: 1134; X64-SSE2-NEXT: movdqu (%rdi), %xmm0 1135; X64-SSE2-NEXT: movdqu 15(%rdi), %xmm1 1136; X64-SSE2-NEXT: movdqu (%rsi), %xmm2 1137; X64-SSE2-NEXT: pcmpeqb %xmm0, %xmm2 1138; X64-SSE2-NEXT: movdqu 15(%rsi), %xmm0 1139; X64-SSE2-NEXT: pcmpeqb %xmm1, %xmm0 1140; X64-SSE2-NEXT: pand %xmm2, %xmm0 1141; X64-SSE2-NEXT: pmovmskb %xmm0, %eax 1142; X64-SSE2-NEXT: cmpl $65535, %eax # imm = 0xFFFF 1143; X64-SSE2-NEXT: sete %al 1144; X64-SSE2-NEXT: retq 1145; 1146; X64-SSE41-LABEL: length31_eq_prefer128: 1147; X64-SSE41: # %bb.0: 1148; X64-SSE41-NEXT: movdqu (%rdi), %xmm0 1149; X64-SSE41-NEXT: movdqu 15(%rdi), %xmm1 1150; X64-SSE41-NEXT: movdqu (%rsi), %xmm2 1151; X64-SSE41-NEXT: pxor %xmm0, %xmm2 1152; X64-SSE41-NEXT: movdqu 15(%rsi), %xmm0 1153; X64-SSE41-NEXT: pxor %xmm1, %xmm0 1154; X64-SSE41-NEXT: por %xmm2, %xmm0 1155; X64-SSE41-NEXT: ptest %xmm0, %xmm0 1156; X64-SSE41-NEXT: sete %al 1157; X64-SSE41-NEXT: retq 1158; 1159; X64-AVX-LABEL: length31_eq_prefer128: 1160; X64-AVX: # %bb.0: 1161; X64-AVX-NEXT: vmovdqu (%rdi), %xmm0 1162; X64-AVX-NEXT: vmovdqu 15(%rdi), %xmm1 1163; X64-AVX-NEXT: vpxor 15(%rsi), %xmm1, %xmm1 1164; X64-AVX-NEXT: vpxor (%rsi), %xmm0, %xmm0 1165; X64-AVX-NEXT: vpor %xmm1, %xmm0, %xmm0 1166; X64-AVX-NEXT: vptest %xmm0, %xmm0 1167; X64-AVX-NEXT: sete %al 1168; X64-AVX-NEXT: retq 1169; 1170; X64-MIC-AVX-LABEL: length31_eq_prefer128: 1171; X64-MIC-AVX: # %bb.0: 1172; X64-MIC-AVX-NEXT: vmovdqu (%rdi), %xmm0 1173; X64-MIC-AVX-NEXT: vmovdqu 15(%rdi), %xmm1 1174; X64-MIC-AVX-NEXT: vmovdqu (%rsi), %xmm2 1175; X64-MIC-AVX-NEXT: vmovdqu 15(%rsi), %xmm3 1176; X64-MIC-AVX-NEXT: vpcmpneqd %zmm3, %zmm1, %k0 1177; X64-MIC-AVX-NEXT: vpcmpneqd %zmm2, %zmm0, %k1 1178; X64-MIC-AVX-NEXT: kortestw %k0, %k1 1179; X64-MIC-AVX-NEXT: sete %al 1180; X64-MIC-AVX-NEXT: vzeroupper 1181; X64-MIC-AVX-NEXT: retq 1182 %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 31) nounwind 1183 %cmp = icmp eq i32 %call, 0 1184 ret i1 %cmp 1185} 1186 1187define i1 @length31_eq_const(ptr %X) nounwind { 1188; X64-SSE2-LABEL: length31_eq_const: 1189; X64-SSE2: # %bb.0: 1190; X64-SSE2-NEXT: movdqu (%rdi), %xmm0 1191; X64-SSE2-NEXT: movdqu 15(%rdi), %xmm1 1192; X64-SSE2-NEXT: pcmpeqb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1 1193; X64-SSE2-NEXT: pcmpeqb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0 1194; X64-SSE2-NEXT: pand %xmm1, %xmm0 1195; X64-SSE2-NEXT: pmovmskb %xmm0, %eax 1196; X64-SSE2-NEXT: cmpl $65535, %eax # imm = 0xFFFF 1197; X64-SSE2-NEXT: setne %al 1198; X64-SSE2-NEXT: retq 1199; 1200; X64-SSE41-LABEL: length31_eq_const: 1201; X64-SSE41: # %bb.0: 1202; X64-SSE41-NEXT: movdqu (%rdi), %xmm0 1203; X64-SSE41-NEXT: movdqu 15(%rdi), %xmm1 1204; X64-SSE41-NEXT: pxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1 1205; X64-SSE41-NEXT: pxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0 1206; X64-SSE41-NEXT: por %xmm1, %xmm0 1207; X64-SSE41-NEXT: ptest %xmm0, %xmm0 1208; X64-SSE41-NEXT: setne %al 1209; X64-SSE41-NEXT: retq 1210; 1211; X64-AVX-LABEL: length31_eq_const: 1212; X64-AVX: # %bb.0: 1213; X64-AVX-NEXT: vmovdqu (%rdi), %xmm0 1214; X64-AVX-NEXT: vmovdqu 15(%rdi), %xmm1 1215; X64-AVX-NEXT: vpxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1 1216; X64-AVX-NEXT: vpxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0 1217; X64-AVX-NEXT: vpor %xmm1, %xmm0, %xmm0 1218; X64-AVX-NEXT: vptest %xmm0, %xmm0 1219; X64-AVX-NEXT: setne %al 1220; X64-AVX-NEXT: retq 1221; 1222; X64-MIC-AVX-LABEL: length31_eq_const: 1223; X64-MIC-AVX: # %bb.0: 1224; X64-MIC-AVX-NEXT: vmovdqu (%rdi), %xmm0 1225; X64-MIC-AVX-NEXT: vmovdqu 15(%rdi), %xmm1 1226; X64-MIC-AVX-NEXT: vmovdqa {{.*#+}} xmm2 = [943142453,842084409,909456435,809056311] 1227; X64-MIC-AVX-NEXT: vpcmpneqd %zmm2, %zmm1, %k0 1228; X64-MIC-AVX-NEXT: vmovdqa {{.*#+}} xmm1 = [858927408,926299444,825243960,892613426] 1229; X64-MIC-AVX-NEXT: vpcmpneqd %zmm1, %zmm0, %k1 1230; X64-MIC-AVX-NEXT: kortestw %k0, %k1 1231; X64-MIC-AVX-NEXT: setne %al 1232; X64-MIC-AVX-NEXT: vzeroupper 1233; X64-MIC-AVX-NEXT: retq 1234 %m = tail call i32 @memcmp(ptr %X, ptr @.str, i64 31) nounwind 1235 %c = icmp ne i32 %m, 0 1236 ret i1 %c 1237} 1238 1239define i32 @length32(ptr %X, ptr %Y) nounwind { 1240; X64-LABEL: length32: 1241; X64: # %bb.0: 1242; X64-NEXT: movl $32, %edx 1243; X64-NEXT: jmp memcmp # TAILCALL 1244 %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 32) nounwind 1245 ret i32 %m 1246} 1247 1248; PR33325 - https://bugs.llvm.org/show_bug.cgi?id=33325 1249 1250define i1 @length32_eq(ptr %x, ptr %y) nounwind { 1251; X64-SSE2-LABEL: length32_eq: 1252; X64-SSE2: # %bb.0: 1253; X64-SSE2-NEXT: movdqu (%rdi), %xmm0 1254; X64-SSE2-NEXT: movdqu 16(%rdi), %xmm1 1255; X64-SSE2-NEXT: movdqu (%rsi), %xmm2 1256; X64-SSE2-NEXT: pcmpeqb %xmm0, %xmm2 1257; X64-SSE2-NEXT: movdqu 16(%rsi), %xmm0 1258; X64-SSE2-NEXT: pcmpeqb %xmm1, %xmm0 1259; X64-SSE2-NEXT: pand %xmm2, %xmm0 1260; X64-SSE2-NEXT: pmovmskb %xmm0, %eax 1261; X64-SSE2-NEXT: cmpl $65535, %eax # imm = 0xFFFF 1262; X64-SSE2-NEXT: sete %al 1263; X64-SSE2-NEXT: retq 1264; 1265; X64-SSE41-LABEL: length32_eq: 1266; X64-SSE41: # %bb.0: 1267; X64-SSE41-NEXT: movdqu (%rdi), %xmm0 1268; X64-SSE41-NEXT: movdqu 16(%rdi), %xmm1 1269; X64-SSE41-NEXT: movdqu (%rsi), %xmm2 1270; X64-SSE41-NEXT: pxor %xmm0, %xmm2 1271; X64-SSE41-NEXT: movdqu 16(%rsi), %xmm0 1272; X64-SSE41-NEXT: pxor %xmm1, %xmm0 1273; X64-SSE41-NEXT: por %xmm2, %xmm0 1274; X64-SSE41-NEXT: ptest %xmm0, %xmm0 1275; X64-SSE41-NEXT: sete %al 1276; X64-SSE41-NEXT: retq 1277; 1278; X64-AVX1-LABEL: length32_eq: 1279; X64-AVX1: # %bb.0: 1280; X64-AVX1-NEXT: vmovups (%rdi), %ymm0 1281; X64-AVX1-NEXT: vxorps (%rsi), %ymm0, %ymm0 1282; X64-AVX1-NEXT: vptest %ymm0, %ymm0 1283; X64-AVX1-NEXT: sete %al 1284; X64-AVX1-NEXT: vzeroupper 1285; X64-AVX1-NEXT: retq 1286; 1287; X64-AVX2-LABEL: length32_eq: 1288; X64-AVX2: # %bb.0: 1289; X64-AVX2-NEXT: vmovdqu (%rdi), %ymm0 1290; X64-AVX2-NEXT: vpxor (%rsi), %ymm0, %ymm0 1291; X64-AVX2-NEXT: vptest %ymm0, %ymm0 1292; X64-AVX2-NEXT: sete %al 1293; X64-AVX2-NEXT: vzeroupper 1294; X64-AVX2-NEXT: retq 1295; 1296; X64-AVX512-LABEL: length32_eq: 1297; X64-AVX512: # %bb.0: 1298; X64-AVX512-NEXT: vmovdqu (%rdi), %ymm0 1299; X64-AVX512-NEXT: vpxor (%rsi), %ymm0, %ymm0 1300; X64-AVX512-NEXT: vptest %ymm0, %ymm0 1301; X64-AVX512-NEXT: sete %al 1302; X64-AVX512-NEXT: vzeroupper 1303; X64-AVX512-NEXT: retq 1304; 1305; X64-MIC-AVX-LABEL: length32_eq: 1306; X64-MIC-AVX: # %bb.0: 1307; X64-MIC-AVX-NEXT: vmovdqu (%rdi), %ymm0 1308; X64-MIC-AVX-NEXT: vmovdqu (%rsi), %ymm1 1309; X64-MIC-AVX-NEXT: vpcmpneqd %zmm1, %zmm0, %k0 1310; X64-MIC-AVX-NEXT: kortestw %k0, %k0 1311; X64-MIC-AVX-NEXT: sete %al 1312; X64-MIC-AVX-NEXT: vzeroupper 1313; X64-MIC-AVX-NEXT: retq 1314 %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 32) nounwind 1315 %cmp = icmp eq i32 %call, 0 1316 ret i1 %cmp 1317} 1318 1319define i1 @length32_lt(ptr %x, ptr %y) nounwind { 1320; X64-LABEL: length32_lt: 1321; X64: # %bb.0: 1322; X64-NEXT: pushq %rax 1323; X64-NEXT: movl $32, %edx 1324; X64-NEXT: callq memcmp 1325; X64-NEXT: shrl $31, %eax 1326; X64-NEXT: # kill: def $al killed $al killed $eax 1327; X64-NEXT: popq %rcx 1328; X64-NEXT: retq 1329 %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 32) nounwind 1330 %cmp = icmp slt i32 %call, 0 1331 ret i1 %cmp 1332} 1333 1334define i1 @length32_gt(ptr %x, ptr %y) nounwind { 1335; X64-LABEL: length32_gt: 1336; X64: # %bb.0: 1337; X64-NEXT: pushq %rax 1338; X64-NEXT: movl $32, %edx 1339; X64-NEXT: callq memcmp 1340; X64-NEXT: testl %eax, %eax 1341; X64-NEXT: setg %al 1342; X64-NEXT: popq %rcx 1343; X64-NEXT: retq 1344 %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 32) nounwind 1345 %cmp = icmp sgt i32 %call, 0 1346 ret i1 %cmp 1347} 1348 1349define i1 @length32_eq_prefer128(ptr %x, ptr %y) nounwind "prefer-vector-width"="128" { 1350; X64-SSE2-LABEL: length32_eq_prefer128: 1351; X64-SSE2: # %bb.0: 1352; X64-SSE2-NEXT: movdqu (%rdi), %xmm0 1353; X64-SSE2-NEXT: movdqu 16(%rdi), %xmm1 1354; X64-SSE2-NEXT: movdqu (%rsi), %xmm2 1355; X64-SSE2-NEXT: pcmpeqb %xmm0, %xmm2 1356; X64-SSE2-NEXT: movdqu 16(%rsi), %xmm0 1357; X64-SSE2-NEXT: pcmpeqb %xmm1, %xmm0 1358; X64-SSE2-NEXT: pand %xmm2, %xmm0 1359; X64-SSE2-NEXT: pmovmskb %xmm0, %eax 1360; X64-SSE2-NEXT: cmpl $65535, %eax # imm = 0xFFFF 1361; X64-SSE2-NEXT: sete %al 1362; X64-SSE2-NEXT: retq 1363; 1364; X64-SSE41-LABEL: length32_eq_prefer128: 1365; X64-SSE41: # %bb.0: 1366; X64-SSE41-NEXT: movdqu (%rdi), %xmm0 1367; X64-SSE41-NEXT: movdqu 16(%rdi), %xmm1 1368; X64-SSE41-NEXT: movdqu (%rsi), %xmm2 1369; X64-SSE41-NEXT: pxor %xmm0, %xmm2 1370; X64-SSE41-NEXT: movdqu 16(%rsi), %xmm0 1371; X64-SSE41-NEXT: pxor %xmm1, %xmm0 1372; X64-SSE41-NEXT: por %xmm2, %xmm0 1373; X64-SSE41-NEXT: ptest %xmm0, %xmm0 1374; X64-SSE41-NEXT: sete %al 1375; X64-SSE41-NEXT: retq 1376; 1377; X64-AVX-LABEL: length32_eq_prefer128: 1378; X64-AVX: # %bb.0: 1379; X64-AVX-NEXT: vmovdqu (%rdi), %xmm0 1380; X64-AVX-NEXT: vmovdqu 16(%rdi), %xmm1 1381; X64-AVX-NEXT: vpxor 16(%rsi), %xmm1, %xmm1 1382; X64-AVX-NEXT: vpxor (%rsi), %xmm0, %xmm0 1383; X64-AVX-NEXT: vpor %xmm1, %xmm0, %xmm0 1384; X64-AVX-NEXT: vptest %xmm0, %xmm0 1385; X64-AVX-NEXT: sete %al 1386; X64-AVX-NEXT: retq 1387; 1388; X64-MIC-AVX-LABEL: length32_eq_prefer128: 1389; X64-MIC-AVX: # %bb.0: 1390; X64-MIC-AVX-NEXT: vmovdqu (%rdi), %xmm0 1391; X64-MIC-AVX-NEXT: vmovdqu 16(%rdi), %xmm1 1392; X64-MIC-AVX-NEXT: vmovdqu (%rsi), %xmm2 1393; X64-MIC-AVX-NEXT: vmovdqu 16(%rsi), %xmm3 1394; X64-MIC-AVX-NEXT: vpcmpneqd %zmm3, %zmm1, %k0 1395; X64-MIC-AVX-NEXT: vpcmpneqd %zmm2, %zmm0, %k1 1396; X64-MIC-AVX-NEXT: kortestw %k0, %k1 1397; X64-MIC-AVX-NEXT: sete %al 1398; X64-MIC-AVX-NEXT: vzeroupper 1399; X64-MIC-AVX-NEXT: retq 1400 %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 32) nounwind 1401 %cmp = icmp eq i32 %call, 0 1402 ret i1 %cmp 1403} 1404 1405define i1 @length32_eq_const(ptr %X) nounwind { 1406; X64-SSE2-LABEL: length32_eq_const: 1407; X64-SSE2: # %bb.0: 1408; X64-SSE2-NEXT: movdqu (%rdi), %xmm0 1409; X64-SSE2-NEXT: movdqu 16(%rdi), %xmm1 1410; X64-SSE2-NEXT: pcmpeqb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1 1411; X64-SSE2-NEXT: pcmpeqb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0 1412; X64-SSE2-NEXT: pand %xmm1, %xmm0 1413; X64-SSE2-NEXT: pmovmskb %xmm0, %eax 1414; X64-SSE2-NEXT: cmpl $65535, %eax # imm = 0xFFFF 1415; X64-SSE2-NEXT: setne %al 1416; X64-SSE2-NEXT: retq 1417; 1418; X64-SSE41-LABEL: length32_eq_const: 1419; X64-SSE41: # %bb.0: 1420; X64-SSE41-NEXT: movdqu (%rdi), %xmm0 1421; X64-SSE41-NEXT: movdqu 16(%rdi), %xmm1 1422; X64-SSE41-NEXT: pxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1 1423; X64-SSE41-NEXT: pxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0 1424; X64-SSE41-NEXT: por %xmm1, %xmm0 1425; X64-SSE41-NEXT: ptest %xmm0, %xmm0 1426; X64-SSE41-NEXT: setne %al 1427; X64-SSE41-NEXT: retq 1428; 1429; X64-AVX1-LABEL: length32_eq_const: 1430; X64-AVX1: # %bb.0: 1431; X64-AVX1-NEXT: vmovups (%rdi), %ymm0 1432; X64-AVX1-NEXT: vxorps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0 1433; X64-AVX1-NEXT: vptest %ymm0, %ymm0 1434; X64-AVX1-NEXT: setne %al 1435; X64-AVX1-NEXT: vzeroupper 1436; X64-AVX1-NEXT: retq 1437; 1438; X64-AVX2-LABEL: length32_eq_const: 1439; X64-AVX2: # %bb.0: 1440; X64-AVX2-NEXT: vmovdqu (%rdi), %ymm0 1441; X64-AVX2-NEXT: vpxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0 1442; X64-AVX2-NEXT: vptest %ymm0, %ymm0 1443; X64-AVX2-NEXT: setne %al 1444; X64-AVX2-NEXT: vzeroupper 1445; X64-AVX2-NEXT: retq 1446; 1447; X64-AVX512-LABEL: length32_eq_const: 1448; X64-AVX512: # %bb.0: 1449; X64-AVX512-NEXT: vmovdqu (%rdi), %ymm0 1450; X64-AVX512-NEXT: vpxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0 1451; X64-AVX512-NEXT: vptest %ymm0, %ymm0 1452; X64-AVX512-NEXT: setne %al 1453; X64-AVX512-NEXT: vzeroupper 1454; X64-AVX512-NEXT: retq 1455; 1456; X64-MIC-AVX-LABEL: length32_eq_const: 1457; X64-MIC-AVX: # %bb.0: 1458; X64-MIC-AVX-NEXT: vmovdqu (%rdi), %ymm0 1459; X64-MIC-AVX-NEXT: vmovdqa {{.*#+}} ymm1 = [858927408,926299444,825243960,892613426,959985462,858927408,926299444,825243960] 1460; X64-MIC-AVX-NEXT: vpcmpneqd %zmm1, %zmm0, %k0 1461; X64-MIC-AVX-NEXT: kortestw %k0, %k0 1462; X64-MIC-AVX-NEXT: setne %al 1463; X64-MIC-AVX-NEXT: vzeroupper 1464; X64-MIC-AVX-NEXT: retq 1465 %m = tail call i32 @memcmp(ptr %X, ptr @.str, i64 32) nounwind 1466 %c = icmp ne i32 %m, 0 1467 ret i1 %c 1468} 1469 1470define i32 @length48(ptr %X, ptr %Y) nounwind { 1471; X64-LABEL: length48: 1472; X64: # %bb.0: 1473; X64-NEXT: movl $48, %edx 1474; X64-NEXT: jmp memcmp # TAILCALL 1475 %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 48) nounwind 1476 ret i32 %m 1477} 1478 1479define i1 @length48_eq(ptr %x, ptr %y) nounwind { 1480; X64-SSE-LABEL: length48_eq: 1481; X64-SSE: # %bb.0: 1482; X64-SSE-NEXT: pushq %rax 1483; X64-SSE-NEXT: movl $48, %edx 1484; X64-SSE-NEXT: callq memcmp 1485; X64-SSE-NEXT: testl %eax, %eax 1486; X64-SSE-NEXT: sete %al 1487; X64-SSE-NEXT: popq %rcx 1488; X64-SSE-NEXT: retq 1489; 1490; X64-AVX1-LABEL: length48_eq: 1491; X64-AVX1: # %bb.0: 1492; X64-AVX1-NEXT: vmovups (%rdi), %ymm0 1493; X64-AVX1-NEXT: vmovups 32(%rdi), %xmm1 1494; X64-AVX1-NEXT: vmovups 32(%rsi), %xmm2 1495; X64-AVX1-NEXT: vxorps (%rsi), %ymm0, %ymm0 1496; X64-AVX1-NEXT: vxorps %ymm2, %ymm1, %ymm1 1497; X64-AVX1-NEXT: vorps %ymm1, %ymm0, %ymm0 1498; X64-AVX1-NEXT: vptest %ymm0, %ymm0 1499; X64-AVX1-NEXT: sete %al 1500; X64-AVX1-NEXT: vzeroupper 1501; X64-AVX1-NEXT: retq 1502; 1503; X64-AVX2-LABEL: length48_eq: 1504; X64-AVX2: # %bb.0: 1505; X64-AVX2-NEXT: vmovdqu (%rdi), %ymm0 1506; X64-AVX2-NEXT: vmovdqu 32(%rdi), %xmm1 1507; X64-AVX2-NEXT: vmovdqu 32(%rsi), %xmm2 1508; X64-AVX2-NEXT: vpxor (%rsi), %ymm0, %ymm0 1509; X64-AVX2-NEXT: vpxor %ymm2, %ymm1, %ymm1 1510; X64-AVX2-NEXT: vpor %ymm1, %ymm0, %ymm0 1511; X64-AVX2-NEXT: vptest %ymm0, %ymm0 1512; X64-AVX2-NEXT: sete %al 1513; X64-AVX2-NEXT: vzeroupper 1514; X64-AVX2-NEXT: retq 1515; 1516; X64-AVX512-LABEL: length48_eq: 1517; X64-AVX512: # %bb.0: 1518; X64-AVX512-NEXT: vmovdqu (%rdi), %ymm0 1519; X64-AVX512-NEXT: vmovdqu 32(%rdi), %xmm1 1520; X64-AVX512-NEXT: vmovdqu 32(%rsi), %xmm2 1521; X64-AVX512-NEXT: vpxor (%rsi), %ymm0, %ymm0 1522; X64-AVX512-NEXT: vpxor %ymm2, %ymm1, %ymm1 1523; X64-AVX512-NEXT: vpor %ymm1, %ymm0, %ymm0 1524; X64-AVX512-NEXT: vptest %ymm0, %ymm0 1525; X64-AVX512-NEXT: sete %al 1526; X64-AVX512-NEXT: vzeroupper 1527; X64-AVX512-NEXT: retq 1528; 1529; X64-MIC-AVX-LABEL: length48_eq: 1530; X64-MIC-AVX: # %bb.0: 1531; X64-MIC-AVX-NEXT: vmovdqu (%rdi), %ymm0 1532; X64-MIC-AVX-NEXT: vmovdqu (%rsi), %ymm1 1533; X64-MIC-AVX-NEXT: vmovdqu 32(%rdi), %xmm2 1534; X64-MIC-AVX-NEXT: vmovdqu 32(%rsi), %xmm3 1535; X64-MIC-AVX-NEXT: vpcmpneqd %zmm3, %zmm2, %k0 1536; X64-MIC-AVX-NEXT: vpcmpneqd %zmm1, %zmm0, %k1 1537; X64-MIC-AVX-NEXT: kortestw %k0, %k1 1538; X64-MIC-AVX-NEXT: sete %al 1539; X64-MIC-AVX-NEXT: vzeroupper 1540; X64-MIC-AVX-NEXT: retq 1541 %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 48) nounwind 1542 %cmp = icmp eq i32 %call, 0 1543 ret i1 %cmp 1544} 1545 1546define i1 @length48_lt(ptr %x, ptr %y) nounwind { 1547; X64-LABEL: length48_lt: 1548; X64: # %bb.0: 1549; X64-NEXT: pushq %rax 1550; X64-NEXT: movl $48, %edx 1551; X64-NEXT: callq memcmp 1552; X64-NEXT: shrl $31, %eax 1553; X64-NEXT: # kill: def $al killed $al killed $eax 1554; X64-NEXT: popq %rcx 1555; X64-NEXT: retq 1556 %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 48) nounwind 1557 %cmp = icmp slt i32 %call, 0 1558 ret i1 %cmp 1559} 1560 1561define i1 @length48_gt(ptr %x, ptr %y) nounwind { 1562; X64-LABEL: length48_gt: 1563; X64: # %bb.0: 1564; X64-NEXT: pushq %rax 1565; X64-NEXT: movl $48, %edx 1566; X64-NEXT: callq memcmp 1567; X64-NEXT: testl %eax, %eax 1568; X64-NEXT: setg %al 1569; X64-NEXT: popq %rcx 1570; X64-NEXT: retq 1571 %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 48) nounwind 1572 %cmp = icmp sgt i32 %call, 0 1573 ret i1 %cmp 1574} 1575 1576define i1 @length48_eq_prefer128(ptr %x, ptr %y) nounwind "prefer-vector-width"="128" { 1577; X64-LABEL: length48_eq_prefer128: 1578; X64: # %bb.0: 1579; X64-NEXT: pushq %rax 1580; X64-NEXT: movl $48, %edx 1581; X64-NEXT: callq memcmp 1582; X64-NEXT: testl %eax, %eax 1583; X64-NEXT: sete %al 1584; X64-NEXT: popq %rcx 1585; X64-NEXT: retq 1586 %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 48) nounwind 1587 %cmp = icmp eq i32 %call, 0 1588 ret i1 %cmp 1589} 1590 1591define i1 @length48_eq_const(ptr %X) nounwind { 1592; X64-SSE-LABEL: length48_eq_const: 1593; X64-SSE: # %bb.0: 1594; X64-SSE-NEXT: pushq %rax 1595; X64-SSE-NEXT: movl $.L.str, %esi 1596; X64-SSE-NEXT: movl $48, %edx 1597; X64-SSE-NEXT: callq memcmp 1598; X64-SSE-NEXT: testl %eax, %eax 1599; X64-SSE-NEXT: setne %al 1600; X64-SSE-NEXT: popq %rcx 1601; X64-SSE-NEXT: retq 1602; 1603; X64-AVX1-LABEL: length48_eq_const: 1604; X64-AVX1: # %bb.0: 1605; X64-AVX1-NEXT: vmovups (%rdi), %ymm0 1606; X64-AVX1-NEXT: vmovups 32(%rdi), %xmm1 1607; X64-AVX1-NEXT: vxorps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0 1608; X64-AVX1-NEXT: vxorps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm1 1609; X64-AVX1-NEXT: vorps %ymm1, %ymm0, %ymm0 1610; X64-AVX1-NEXT: vptest %ymm0, %ymm0 1611; X64-AVX1-NEXT: setne %al 1612; X64-AVX1-NEXT: vzeroupper 1613; X64-AVX1-NEXT: retq 1614; 1615; X64-AVX2-LABEL: length48_eq_const: 1616; X64-AVX2: # %bb.0: 1617; X64-AVX2-NEXT: vmovdqu (%rdi), %ymm0 1618; X64-AVX2-NEXT: vmovdqu 32(%rdi), %xmm1 1619; X64-AVX2-NEXT: vpxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0 1620; X64-AVX2-NEXT: vpxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm1 1621; X64-AVX2-NEXT: vpor %ymm1, %ymm0, %ymm0 1622; X64-AVX2-NEXT: vptest %ymm0, %ymm0 1623; X64-AVX2-NEXT: setne %al 1624; X64-AVX2-NEXT: vzeroupper 1625; X64-AVX2-NEXT: retq 1626; 1627; X64-AVX512-LABEL: length48_eq_const: 1628; X64-AVX512: # %bb.0: 1629; X64-AVX512-NEXT: vmovdqu (%rdi), %ymm0 1630; X64-AVX512-NEXT: vmovdqu 32(%rdi), %xmm1 1631; X64-AVX512-NEXT: vpxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0 1632; X64-AVX512-NEXT: vpxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm1 1633; X64-AVX512-NEXT: vpor %ymm1, %ymm0, %ymm0 1634; X64-AVX512-NEXT: vptest %ymm0, %ymm0 1635; X64-AVX512-NEXT: setne %al 1636; X64-AVX512-NEXT: vzeroupper 1637; X64-AVX512-NEXT: retq 1638; 1639; X64-MIC-AVX-LABEL: length48_eq_const: 1640; X64-MIC-AVX: # %bb.0: 1641; X64-MIC-AVX-NEXT: vmovdqu (%rdi), %ymm0 1642; X64-MIC-AVX-NEXT: vmovdqu 32(%rdi), %xmm1 1643; X64-MIC-AVX-NEXT: vmovdqa {{.*#+}} ymm2 = [892613426,959985462,858927408,926299444,0,0,0,0] 1644; X64-MIC-AVX-NEXT: vpcmpneqd %zmm2, %zmm1, %k0 1645; X64-MIC-AVX-NEXT: vmovdqa {{.*#+}} ymm1 = [858927408,926299444,825243960,892613426,959985462,858927408,926299444,825243960] 1646; X64-MIC-AVX-NEXT: vpcmpneqd %zmm1, %zmm0, %k1 1647; X64-MIC-AVX-NEXT: kortestw %k0, %k1 1648; X64-MIC-AVX-NEXT: setne %al 1649; X64-MIC-AVX-NEXT: vzeroupper 1650; X64-MIC-AVX-NEXT: retq 1651 %m = tail call i32 @memcmp(ptr %X, ptr @.str, i64 48) nounwind 1652 %c = icmp ne i32 %m, 0 1653 ret i1 %c 1654} 1655 1656define i32 @length63(ptr %X, ptr %Y) nounwind { 1657; X64-LABEL: length63: 1658; X64: # %bb.0: 1659; X64-NEXT: movl $63, %edx 1660; X64-NEXT: jmp memcmp # TAILCALL 1661 %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 63) nounwind 1662 ret i32 %m 1663} 1664 1665define i1 @length63_eq(ptr %x, ptr %y) nounwind { 1666; X64-SSE-LABEL: length63_eq: 1667; X64-SSE: # %bb.0: 1668; X64-SSE-NEXT: pushq %rax 1669; X64-SSE-NEXT: movl $63, %edx 1670; X64-SSE-NEXT: callq memcmp 1671; X64-SSE-NEXT: testl %eax, %eax 1672; X64-SSE-NEXT: setne %al 1673; X64-SSE-NEXT: popq %rcx 1674; X64-SSE-NEXT: retq 1675; 1676; X64-AVX1-LABEL: length63_eq: 1677; X64-AVX1: # %bb.0: 1678; X64-AVX1-NEXT: vmovups (%rdi), %ymm0 1679; X64-AVX1-NEXT: vmovups 31(%rdi), %ymm1 1680; X64-AVX1-NEXT: vxorps 31(%rsi), %ymm1, %ymm1 1681; X64-AVX1-NEXT: vxorps (%rsi), %ymm0, %ymm0 1682; X64-AVX1-NEXT: vorps %ymm1, %ymm0, %ymm0 1683; X64-AVX1-NEXT: vptest %ymm0, %ymm0 1684; X64-AVX1-NEXT: setne %al 1685; X64-AVX1-NEXT: vzeroupper 1686; X64-AVX1-NEXT: retq 1687; 1688; X64-AVX2-LABEL: length63_eq: 1689; X64-AVX2: # %bb.0: 1690; X64-AVX2-NEXT: vmovdqu (%rdi), %ymm0 1691; X64-AVX2-NEXT: vmovdqu 31(%rdi), %ymm1 1692; X64-AVX2-NEXT: vpxor 31(%rsi), %ymm1, %ymm1 1693; X64-AVX2-NEXT: vpxor (%rsi), %ymm0, %ymm0 1694; X64-AVX2-NEXT: vpor %ymm1, %ymm0, %ymm0 1695; X64-AVX2-NEXT: vptest %ymm0, %ymm0 1696; X64-AVX2-NEXT: setne %al 1697; X64-AVX2-NEXT: vzeroupper 1698; X64-AVX2-NEXT: retq 1699; 1700; X64-AVX512-LABEL: length63_eq: 1701; X64-AVX512: # %bb.0: 1702; X64-AVX512-NEXT: vmovdqu (%rdi), %ymm0 1703; X64-AVX512-NEXT: vmovdqu 31(%rdi), %ymm1 1704; X64-AVX512-NEXT: vpxor 31(%rsi), %ymm1, %ymm1 1705; X64-AVX512-NEXT: vpxor (%rsi), %ymm0, %ymm0 1706; X64-AVX512-NEXT: vpor %ymm1, %ymm0, %ymm0 1707; X64-AVX512-NEXT: vptest %ymm0, %ymm0 1708; X64-AVX512-NEXT: setne %al 1709; X64-AVX512-NEXT: vzeroupper 1710; X64-AVX512-NEXT: retq 1711; 1712; X64-MIC-AVX-LABEL: length63_eq: 1713; X64-MIC-AVX: # %bb.0: 1714; X64-MIC-AVX-NEXT: vmovdqu (%rdi), %ymm0 1715; X64-MIC-AVX-NEXT: vmovdqu 31(%rdi), %ymm1 1716; X64-MIC-AVX-NEXT: vmovdqu (%rsi), %ymm2 1717; X64-MIC-AVX-NEXT: vmovdqu 31(%rsi), %ymm3 1718; X64-MIC-AVX-NEXT: vpcmpneqd %zmm3, %zmm1, %k0 1719; X64-MIC-AVX-NEXT: vpcmpneqd %zmm2, %zmm0, %k1 1720; X64-MIC-AVX-NEXT: kortestw %k0, %k1 1721; X64-MIC-AVX-NEXT: setne %al 1722; X64-MIC-AVX-NEXT: vzeroupper 1723; X64-MIC-AVX-NEXT: retq 1724 %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 63) nounwind 1725 %cmp = icmp ne i32 %call, 0 1726 ret i1 %cmp 1727} 1728 1729define i1 @length63_lt(ptr %x, ptr %y) nounwind { 1730; X64-LABEL: length63_lt: 1731; X64: # %bb.0: 1732; X64-NEXT: pushq %rax 1733; X64-NEXT: movl $63, %edx 1734; X64-NEXT: callq memcmp 1735; X64-NEXT: shrl $31, %eax 1736; X64-NEXT: # kill: def $al killed $al killed $eax 1737; X64-NEXT: popq %rcx 1738; X64-NEXT: retq 1739 %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 63) nounwind 1740 %cmp = icmp slt i32 %call, 0 1741 ret i1 %cmp 1742} 1743 1744define i1 @length63_gt(ptr %x, ptr %y) nounwind { 1745; X64-LABEL: length63_gt: 1746; X64: # %bb.0: 1747; X64-NEXT: pushq %rax 1748; X64-NEXT: movl $63, %edx 1749; X64-NEXT: callq memcmp 1750; X64-NEXT: testl %eax, %eax 1751; X64-NEXT: setg %al 1752; X64-NEXT: popq %rcx 1753; X64-NEXT: retq 1754 %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 63) nounwind 1755 %cmp = icmp sgt i32 %call, 0 1756 ret i1 %cmp 1757} 1758 1759define i1 @length63_eq_const(ptr %X) nounwind { 1760; X64-SSE-LABEL: length63_eq_const: 1761; X64-SSE: # %bb.0: 1762; X64-SSE-NEXT: pushq %rax 1763; X64-SSE-NEXT: movl $.L.str, %esi 1764; X64-SSE-NEXT: movl $63, %edx 1765; X64-SSE-NEXT: callq memcmp 1766; X64-SSE-NEXT: testl %eax, %eax 1767; X64-SSE-NEXT: sete %al 1768; X64-SSE-NEXT: popq %rcx 1769; X64-SSE-NEXT: retq 1770; 1771; X64-AVX1-LABEL: length63_eq_const: 1772; X64-AVX1: # %bb.0: 1773; X64-AVX1-NEXT: vmovups (%rdi), %ymm0 1774; X64-AVX1-NEXT: vmovups 31(%rdi), %ymm1 1775; X64-AVX1-NEXT: vxorps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm1 1776; X64-AVX1-NEXT: vxorps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0 1777; X64-AVX1-NEXT: vorps %ymm1, %ymm0, %ymm0 1778; X64-AVX1-NEXT: vptest %ymm0, %ymm0 1779; X64-AVX1-NEXT: sete %al 1780; X64-AVX1-NEXT: vzeroupper 1781; X64-AVX1-NEXT: retq 1782; 1783; X64-AVX2-LABEL: length63_eq_const: 1784; X64-AVX2: # %bb.0: 1785; X64-AVX2-NEXT: vmovdqu (%rdi), %ymm0 1786; X64-AVX2-NEXT: vmovdqu 31(%rdi), %ymm1 1787; X64-AVX2-NEXT: vpxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm1 1788; X64-AVX2-NEXT: vpxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0 1789; X64-AVX2-NEXT: vpor %ymm1, %ymm0, %ymm0 1790; X64-AVX2-NEXT: vptest %ymm0, %ymm0 1791; X64-AVX2-NEXT: sete %al 1792; X64-AVX2-NEXT: vzeroupper 1793; X64-AVX2-NEXT: retq 1794; 1795; X64-AVX512-LABEL: length63_eq_const: 1796; X64-AVX512: # %bb.0: 1797; X64-AVX512-NEXT: vmovdqu (%rdi), %ymm0 1798; X64-AVX512-NEXT: vmovdqu 31(%rdi), %ymm1 1799; X64-AVX512-NEXT: vpxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm1 1800; X64-AVX512-NEXT: vpxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0 1801; X64-AVX512-NEXT: vpor %ymm1, %ymm0, %ymm0 1802; X64-AVX512-NEXT: vptest %ymm0, %ymm0 1803; X64-AVX512-NEXT: sete %al 1804; X64-AVX512-NEXT: vzeroupper 1805; X64-AVX512-NEXT: retq 1806; 1807; X64-MIC-AVX-LABEL: length63_eq_const: 1808; X64-MIC-AVX: # %bb.0: 1809; X64-MIC-AVX-NEXT: vmovdqu (%rdi), %ymm0 1810; X64-MIC-AVX-NEXT: vmovdqu 31(%rdi), %ymm1 1811; X64-MIC-AVX-NEXT: vmovdqa {{.*#+}} ymm2 = [875770417,943142453,842084409,909456435,809056311,875770417,943142453,842084409] 1812; X64-MIC-AVX-NEXT: vpcmpneqd %zmm2, %zmm1, %k0 1813; X64-MIC-AVX-NEXT: vmovdqa {{.*#+}} ymm1 = [858927408,926299444,825243960,892613426,959985462,858927408,926299444,825243960] 1814; X64-MIC-AVX-NEXT: vpcmpneqd %zmm1, %zmm0, %k1 1815; X64-MIC-AVX-NEXT: kortestw %k0, %k1 1816; X64-MIC-AVX-NEXT: sete %al 1817; X64-MIC-AVX-NEXT: vzeroupper 1818; X64-MIC-AVX-NEXT: retq 1819 %m = tail call i32 @memcmp(ptr %X, ptr @.str, i64 63) nounwind 1820 %c = icmp eq i32 %m, 0 1821 ret i1 %c 1822} 1823 1824define i32 @length64(ptr %X, ptr %Y) nounwind { 1825; X64-LABEL: length64: 1826; X64: # %bb.0: 1827; X64-NEXT: movl $64, %edx 1828; X64-NEXT: jmp memcmp # TAILCALL 1829 %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 64) nounwind 1830 ret i32 %m 1831} 1832 1833define i1 @length64_eq(ptr %x, ptr %y) nounwind { 1834; X64-SSE-LABEL: length64_eq: 1835; X64-SSE: # %bb.0: 1836; X64-SSE-NEXT: pushq %rax 1837; X64-SSE-NEXT: movl $64, %edx 1838; X64-SSE-NEXT: callq memcmp 1839; X64-SSE-NEXT: testl %eax, %eax 1840; X64-SSE-NEXT: setne %al 1841; X64-SSE-NEXT: popq %rcx 1842; X64-SSE-NEXT: retq 1843; 1844; X64-AVX1-LABEL: length64_eq: 1845; X64-AVX1: # %bb.0: 1846; X64-AVX1-NEXT: vmovups (%rdi), %ymm0 1847; X64-AVX1-NEXT: vmovups 32(%rdi), %ymm1 1848; X64-AVX1-NEXT: vxorps 32(%rsi), %ymm1, %ymm1 1849; X64-AVX1-NEXT: vxorps (%rsi), %ymm0, %ymm0 1850; X64-AVX1-NEXT: vorps %ymm1, %ymm0, %ymm0 1851; X64-AVX1-NEXT: vptest %ymm0, %ymm0 1852; X64-AVX1-NEXT: setne %al 1853; X64-AVX1-NEXT: vzeroupper 1854; X64-AVX1-NEXT: retq 1855; 1856; X64-AVX2-LABEL: length64_eq: 1857; X64-AVX2: # %bb.0: 1858; X64-AVX2-NEXT: vmovdqu (%rdi), %ymm0 1859; X64-AVX2-NEXT: vmovdqu 32(%rdi), %ymm1 1860; X64-AVX2-NEXT: vpxor 32(%rsi), %ymm1, %ymm1 1861; X64-AVX2-NEXT: vpxor (%rsi), %ymm0, %ymm0 1862; X64-AVX2-NEXT: vpor %ymm1, %ymm0, %ymm0 1863; X64-AVX2-NEXT: vptest %ymm0, %ymm0 1864; X64-AVX2-NEXT: setne %al 1865; X64-AVX2-NEXT: vzeroupper 1866; X64-AVX2-NEXT: retq 1867; 1868; X64-AVX512BW-LABEL: length64_eq: 1869; X64-AVX512BW: # %bb.0: 1870; X64-AVX512BW-NEXT: vmovdqu64 (%rdi), %zmm0 1871; X64-AVX512BW-NEXT: vpcmpneqb (%rsi), %zmm0, %k0 1872; X64-AVX512BW-NEXT: kortestq %k0, %k0 1873; X64-AVX512BW-NEXT: setne %al 1874; X64-AVX512BW-NEXT: vzeroupper 1875; X64-AVX512BW-NEXT: retq 1876; 1877; X64-AVX512F-LABEL: length64_eq: 1878; X64-AVX512F: # %bb.0: 1879; X64-AVX512F-NEXT: vmovdqu64 (%rdi), %zmm0 1880; X64-AVX512F-NEXT: vpcmpneqd (%rsi), %zmm0, %k0 1881; X64-AVX512F-NEXT: kortestw %k0, %k0 1882; X64-AVX512F-NEXT: setne %al 1883; X64-AVX512F-NEXT: vzeroupper 1884; X64-AVX512F-NEXT: retq 1885; 1886; X64-MIC-AVX2-LABEL: length64_eq: 1887; X64-MIC-AVX2: # %bb.0: 1888; X64-MIC-AVX2-NEXT: vmovdqu (%rdi), %ymm0 1889; X64-MIC-AVX2-NEXT: vmovdqu 32(%rdi), %ymm1 1890; X64-MIC-AVX2-NEXT: vmovdqu (%rsi), %ymm2 1891; X64-MIC-AVX2-NEXT: vmovdqu 32(%rsi), %ymm3 1892; X64-MIC-AVX2-NEXT: vpcmpneqd %zmm3, %zmm1, %k0 1893; X64-MIC-AVX2-NEXT: vpcmpneqd %zmm2, %zmm0, %k1 1894; X64-MIC-AVX2-NEXT: kortestw %k0, %k1 1895; X64-MIC-AVX2-NEXT: setne %al 1896; X64-MIC-AVX2-NEXT: vzeroupper 1897; X64-MIC-AVX2-NEXT: retq 1898; 1899; X64-MIC-AVX512F-LABEL: length64_eq: 1900; X64-MIC-AVX512F: # %bb.0: 1901; X64-MIC-AVX512F-NEXT: vmovdqu64 (%rdi), %zmm0 1902; X64-MIC-AVX512F-NEXT: vpcmpneqd (%rsi), %zmm0, %k0 1903; X64-MIC-AVX512F-NEXT: kortestw %k0, %k0 1904; X64-MIC-AVX512F-NEXT: setne %al 1905; X64-MIC-AVX512F-NEXT: vzeroupper 1906; X64-MIC-AVX512F-NEXT: retq 1907 %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 64) nounwind 1908 %cmp = icmp ne i32 %call, 0 1909 ret i1 %cmp 1910} 1911 1912define i1 @length64_lt(ptr %x, ptr %y) nounwind { 1913; X64-LABEL: length64_lt: 1914; X64: # %bb.0: 1915; X64-NEXT: pushq %rax 1916; X64-NEXT: movl $64, %edx 1917; X64-NEXT: callq memcmp 1918; X64-NEXT: shrl $31, %eax 1919; X64-NEXT: # kill: def $al killed $al killed $eax 1920; X64-NEXT: popq %rcx 1921; X64-NEXT: retq 1922 %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 64) nounwind 1923 %cmp = icmp slt i32 %call, 0 1924 ret i1 %cmp 1925} 1926 1927define i1 @length64_gt(ptr %x, ptr %y) nounwind { 1928; X64-LABEL: length64_gt: 1929; X64: # %bb.0: 1930; X64-NEXT: pushq %rax 1931; X64-NEXT: movl $64, %edx 1932; X64-NEXT: callq memcmp 1933; X64-NEXT: testl %eax, %eax 1934; X64-NEXT: setg %al 1935; X64-NEXT: popq %rcx 1936; X64-NEXT: retq 1937 %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 64) nounwind 1938 %cmp = icmp sgt i32 %call, 0 1939 ret i1 %cmp 1940} 1941 1942define i1 @length64_eq_const(ptr %X) nounwind { 1943; X64-SSE-LABEL: length64_eq_const: 1944; X64-SSE: # %bb.0: 1945; X64-SSE-NEXT: pushq %rax 1946; X64-SSE-NEXT: movl $.L.str, %esi 1947; X64-SSE-NEXT: movl $64, %edx 1948; X64-SSE-NEXT: callq memcmp 1949; X64-SSE-NEXT: testl %eax, %eax 1950; X64-SSE-NEXT: sete %al 1951; X64-SSE-NEXT: popq %rcx 1952; X64-SSE-NEXT: retq 1953; 1954; X64-AVX1-LABEL: length64_eq_const: 1955; X64-AVX1: # %bb.0: 1956; X64-AVX1-NEXT: vmovups (%rdi), %ymm0 1957; X64-AVX1-NEXT: vmovups 32(%rdi), %ymm1 1958; X64-AVX1-NEXT: vxorps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm1 1959; X64-AVX1-NEXT: vxorps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0 1960; X64-AVX1-NEXT: vorps %ymm1, %ymm0, %ymm0 1961; X64-AVX1-NEXT: vptest %ymm0, %ymm0 1962; X64-AVX1-NEXT: sete %al 1963; X64-AVX1-NEXT: vzeroupper 1964; X64-AVX1-NEXT: retq 1965; 1966; X64-AVX2-LABEL: length64_eq_const: 1967; X64-AVX2: # %bb.0: 1968; X64-AVX2-NEXT: vmovdqu (%rdi), %ymm0 1969; X64-AVX2-NEXT: vmovdqu 32(%rdi), %ymm1 1970; X64-AVX2-NEXT: vpxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm1 1971; X64-AVX2-NEXT: vpxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0 1972; X64-AVX2-NEXT: vpor %ymm1, %ymm0, %ymm0 1973; X64-AVX2-NEXT: vptest %ymm0, %ymm0 1974; X64-AVX2-NEXT: sete %al 1975; X64-AVX2-NEXT: vzeroupper 1976; X64-AVX2-NEXT: retq 1977; 1978; X64-AVX512BW-LABEL: length64_eq_const: 1979; X64-AVX512BW: # %bb.0: 1980; X64-AVX512BW-NEXT: vmovdqu64 (%rdi), %zmm0 1981; X64-AVX512BW-NEXT: vpcmpneqb .L.str(%rip), %zmm0, %k0 1982; X64-AVX512BW-NEXT: kortestq %k0, %k0 1983; X64-AVX512BW-NEXT: sete %al 1984; X64-AVX512BW-NEXT: vzeroupper 1985; X64-AVX512BW-NEXT: retq 1986; 1987; X64-AVX512F-LABEL: length64_eq_const: 1988; X64-AVX512F: # %bb.0: 1989; X64-AVX512F-NEXT: vmovdqu64 (%rdi), %zmm0 1990; X64-AVX512F-NEXT: vpcmpneqd .L.str(%rip), %zmm0, %k0 1991; X64-AVX512F-NEXT: kortestw %k0, %k0 1992; X64-AVX512F-NEXT: sete %al 1993; X64-AVX512F-NEXT: vzeroupper 1994; X64-AVX512F-NEXT: retq 1995; 1996; X64-MIC-AVX2-LABEL: length64_eq_const: 1997; X64-MIC-AVX2: # %bb.0: 1998; X64-MIC-AVX2-NEXT: vmovdqu (%rdi), %ymm0 1999; X64-MIC-AVX2-NEXT: vmovdqu 32(%rdi), %ymm1 2000; X64-MIC-AVX2-NEXT: vmovdqa {{.*#+}} ymm2 = [892613426,959985462,858927408,926299444,825243960,892613426,959985462,858927408] 2001; X64-MIC-AVX2-NEXT: vpcmpneqd %zmm2, %zmm1, %k0 2002; X64-MIC-AVX2-NEXT: vmovdqa {{.*#+}} ymm1 = [858927408,926299444,825243960,892613426,959985462,858927408,926299444,825243960] 2003; X64-MIC-AVX2-NEXT: vpcmpneqd %zmm1, %zmm0, %k1 2004; X64-MIC-AVX2-NEXT: kortestw %k0, %k1 2005; X64-MIC-AVX2-NEXT: sete %al 2006; X64-MIC-AVX2-NEXT: vzeroupper 2007; X64-MIC-AVX2-NEXT: retq 2008; 2009; X64-MIC-AVX512F-LABEL: length64_eq_const: 2010; X64-MIC-AVX512F: # %bb.0: 2011; X64-MIC-AVX512F-NEXT: vmovdqu64 (%rdi), %zmm0 2012; X64-MIC-AVX512F-NEXT: vpcmpneqd .L.str(%rip), %zmm0, %k0 2013; X64-MIC-AVX512F-NEXT: kortestw %k0, %k0 2014; X64-MIC-AVX512F-NEXT: sete %al 2015; X64-MIC-AVX512F-NEXT: vzeroupper 2016; X64-MIC-AVX512F-NEXT: retq 2017 %m = tail call i32 @memcmp(ptr %X, ptr @.str, i64 64) nounwind 2018 %c = icmp eq i32 %m, 0 2019 ret i1 %c 2020} 2021 2022define i32 @length96(ptr %X, ptr %Y) nounwind { 2023; X64-LABEL: length96: 2024; X64: # %bb.0: 2025; X64-NEXT: movl $96, %edx 2026; X64-NEXT: jmp memcmp # TAILCALL 2027 %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 96) nounwind 2028 ret i32 %m 2029} 2030 2031define i1 @length96_eq(ptr %x, ptr %y) nounwind { 2032; X64-SSE-LABEL: length96_eq: 2033; X64-SSE: # %bb.0: 2034; X64-SSE-NEXT: pushq %rax 2035; X64-SSE-NEXT: movl $96, %edx 2036; X64-SSE-NEXT: callq memcmp 2037; X64-SSE-NEXT: testl %eax, %eax 2038; X64-SSE-NEXT: setne %al 2039; X64-SSE-NEXT: popq %rcx 2040; X64-SSE-NEXT: retq 2041; 2042; X64-AVX1-LABEL: length96_eq: 2043; X64-AVX1: # %bb.0: 2044; X64-AVX1-NEXT: pushq %rax 2045; X64-AVX1-NEXT: movl $96, %edx 2046; X64-AVX1-NEXT: callq memcmp 2047; X64-AVX1-NEXT: testl %eax, %eax 2048; X64-AVX1-NEXT: setne %al 2049; X64-AVX1-NEXT: popq %rcx 2050; X64-AVX1-NEXT: retq 2051; 2052; X64-AVX2-LABEL: length96_eq: 2053; X64-AVX2: # %bb.0: 2054; X64-AVX2-NEXT: pushq %rax 2055; X64-AVX2-NEXT: movl $96, %edx 2056; X64-AVX2-NEXT: callq memcmp 2057; X64-AVX2-NEXT: testl %eax, %eax 2058; X64-AVX2-NEXT: setne %al 2059; X64-AVX2-NEXT: popq %rcx 2060; X64-AVX2-NEXT: retq 2061; 2062; X64-AVX512BW-LABEL: length96_eq: 2063; X64-AVX512BW: # %bb.0: 2064; X64-AVX512BW-NEXT: vmovdqu64 (%rdi), %zmm0 2065; X64-AVX512BW-NEXT: vmovdqu 64(%rdi), %ymm1 2066; X64-AVX512BW-NEXT: vmovdqu 64(%rsi), %ymm2 2067; X64-AVX512BW-NEXT: vpcmpneqb (%rsi), %zmm0, %k0 2068; X64-AVX512BW-NEXT: vpcmpneqb %zmm2, %zmm1, %k1 2069; X64-AVX512BW-NEXT: kortestq %k1, %k0 2070; X64-AVX512BW-NEXT: setne %al 2071; X64-AVX512BW-NEXT: vzeroupper 2072; X64-AVX512BW-NEXT: retq 2073; 2074; X64-AVX512F-LABEL: length96_eq: 2075; X64-AVX512F: # %bb.0: 2076; X64-AVX512F-NEXT: vmovdqu64 (%rdi), %zmm0 2077; X64-AVX512F-NEXT: vmovdqu 64(%rdi), %ymm1 2078; X64-AVX512F-NEXT: vmovdqu 64(%rsi), %ymm2 2079; X64-AVX512F-NEXT: vpcmpneqd (%rsi), %zmm0, %k0 2080; X64-AVX512F-NEXT: vpcmpneqd %zmm2, %zmm1, %k1 2081; X64-AVX512F-NEXT: kortestw %k1, %k0 2082; X64-AVX512F-NEXT: setne %al 2083; X64-AVX512F-NEXT: vzeroupper 2084; X64-AVX512F-NEXT: retq 2085; 2086; X64-MIC-AVX2-LABEL: length96_eq: 2087; X64-MIC-AVX2: # %bb.0: 2088; X64-MIC-AVX2-NEXT: pushq %rax 2089; X64-MIC-AVX2-NEXT: movl $96, %edx 2090; X64-MIC-AVX2-NEXT: callq memcmp 2091; X64-MIC-AVX2-NEXT: testl %eax, %eax 2092; X64-MIC-AVX2-NEXT: setne %al 2093; X64-MIC-AVX2-NEXT: popq %rcx 2094; X64-MIC-AVX2-NEXT: retq 2095; 2096; X64-MIC-AVX512F-LABEL: length96_eq: 2097; X64-MIC-AVX512F: # %bb.0: 2098; X64-MIC-AVX512F-NEXT: vmovdqu64 (%rdi), %zmm0 2099; X64-MIC-AVX512F-NEXT: vmovdqu 64(%rdi), %ymm1 2100; X64-MIC-AVX512F-NEXT: vmovdqu 64(%rsi), %ymm2 2101; X64-MIC-AVX512F-NEXT: vpcmpneqd (%rsi), %zmm0, %k0 2102; X64-MIC-AVX512F-NEXT: vpcmpneqd %zmm2, %zmm1, %k1 2103; X64-MIC-AVX512F-NEXT: kortestw %k1, %k0 2104; X64-MIC-AVX512F-NEXT: setne %al 2105; X64-MIC-AVX512F-NEXT: vzeroupper 2106; X64-MIC-AVX512F-NEXT: retq 2107 %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 96) nounwind 2108 %cmp = icmp ne i32 %call, 0 2109 ret i1 %cmp 2110} 2111 2112define i1 @length96_lt(ptr %x, ptr %y) nounwind { 2113; X64-LABEL: length96_lt: 2114; X64: # %bb.0: 2115; X64-NEXT: pushq %rax 2116; X64-NEXT: movl $96, %edx 2117; X64-NEXT: callq memcmp 2118; X64-NEXT: shrl $31, %eax 2119; X64-NEXT: # kill: def $al killed $al killed $eax 2120; X64-NEXT: popq %rcx 2121; X64-NEXT: retq 2122 %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 96) nounwind 2123 %cmp = icmp slt i32 %call, 0 2124 ret i1 %cmp 2125} 2126 2127define i1 @length96_gt(ptr %x, ptr %y) nounwind { 2128; X64-LABEL: length96_gt: 2129; X64: # %bb.0: 2130; X64-NEXT: pushq %rax 2131; X64-NEXT: movl $96, %edx 2132; X64-NEXT: callq memcmp 2133; X64-NEXT: testl %eax, %eax 2134; X64-NEXT: setg %al 2135; X64-NEXT: popq %rcx 2136; X64-NEXT: retq 2137 %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 96) nounwind 2138 %cmp = icmp sgt i32 %call, 0 2139 ret i1 %cmp 2140} 2141 2142define i1 @length96_eq_const(ptr %X) nounwind { 2143; X64-SSE-LABEL: length96_eq_const: 2144; X64-SSE: # %bb.0: 2145; X64-SSE-NEXT: pushq %rax 2146; X64-SSE-NEXT: movl $.L.str, %esi 2147; X64-SSE-NEXT: movl $96, %edx 2148; X64-SSE-NEXT: callq memcmp 2149; X64-SSE-NEXT: testl %eax, %eax 2150; X64-SSE-NEXT: sete %al 2151; X64-SSE-NEXT: popq %rcx 2152; X64-SSE-NEXT: retq 2153; 2154; X64-AVX1-LABEL: length96_eq_const: 2155; X64-AVX1: # %bb.0: 2156; X64-AVX1-NEXT: pushq %rax 2157; X64-AVX1-NEXT: movl $.L.str, %esi 2158; X64-AVX1-NEXT: movl $96, %edx 2159; X64-AVX1-NEXT: callq memcmp 2160; X64-AVX1-NEXT: testl %eax, %eax 2161; X64-AVX1-NEXT: sete %al 2162; X64-AVX1-NEXT: popq %rcx 2163; X64-AVX1-NEXT: retq 2164; 2165; X64-AVX2-LABEL: length96_eq_const: 2166; X64-AVX2: # %bb.0: 2167; X64-AVX2-NEXT: pushq %rax 2168; X64-AVX2-NEXT: movl $.L.str, %esi 2169; X64-AVX2-NEXT: movl $96, %edx 2170; X64-AVX2-NEXT: callq memcmp 2171; X64-AVX2-NEXT: testl %eax, %eax 2172; X64-AVX2-NEXT: sete %al 2173; X64-AVX2-NEXT: popq %rcx 2174; X64-AVX2-NEXT: retq 2175; 2176; X64-AVX512BW-LABEL: length96_eq_const: 2177; X64-AVX512BW: # %bb.0: 2178; X64-AVX512BW-NEXT: vmovdqu64 (%rdi), %zmm0 2179; X64-AVX512BW-NEXT: vmovdqu 64(%rdi), %ymm1 2180; X64-AVX512BW-NEXT: vpcmpneqb .L.str(%rip), %zmm0, %k0 2181; X64-AVX512BW-NEXT: vpcmpneqb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %zmm1, %k1 2182; X64-AVX512BW-NEXT: kortestq %k1, %k0 2183; X64-AVX512BW-NEXT: sete %al 2184; X64-AVX512BW-NEXT: vzeroupper 2185; X64-AVX512BW-NEXT: retq 2186; 2187; X64-AVX512F-LABEL: length96_eq_const: 2188; X64-AVX512F: # %bb.0: 2189; X64-AVX512F-NEXT: vmovdqu64 (%rdi), %zmm0 2190; X64-AVX512F-NEXT: vmovdqu 64(%rdi), %ymm1 2191; X64-AVX512F-NEXT: vpcmpneqd .L.str(%rip), %zmm0, %k0 2192; X64-AVX512F-NEXT: vpcmpneqd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %zmm1, %k1 2193; X64-AVX512F-NEXT: kortestw %k1, %k0 2194; X64-AVX512F-NEXT: sete %al 2195; X64-AVX512F-NEXT: vzeroupper 2196; X64-AVX512F-NEXT: retq 2197; 2198; X64-MIC-AVX2-LABEL: length96_eq_const: 2199; X64-MIC-AVX2: # %bb.0: 2200; X64-MIC-AVX2-NEXT: pushq %rax 2201; X64-MIC-AVX2-NEXT: movl $.L.str, %esi 2202; X64-MIC-AVX2-NEXT: movl $96, %edx 2203; X64-MIC-AVX2-NEXT: callq memcmp 2204; X64-MIC-AVX2-NEXT: testl %eax, %eax 2205; X64-MIC-AVX2-NEXT: sete %al 2206; X64-MIC-AVX2-NEXT: popq %rcx 2207; X64-MIC-AVX2-NEXT: retq 2208; 2209; X64-MIC-AVX512F-LABEL: length96_eq_const: 2210; X64-MIC-AVX512F: # %bb.0: 2211; X64-MIC-AVX512F-NEXT: vmovdqu64 (%rdi), %zmm0 2212; X64-MIC-AVX512F-NEXT: vmovdqu 64(%rdi), %ymm1 2213; X64-MIC-AVX512F-NEXT: vpcmpneqd .L.str(%rip), %zmm0, %k0 2214; X64-MIC-AVX512F-NEXT: vpcmpneqd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %zmm1, %k1 2215; X64-MIC-AVX512F-NEXT: kortestw %k1, %k0 2216; X64-MIC-AVX512F-NEXT: sete %al 2217; X64-MIC-AVX512F-NEXT: vzeroupper 2218; X64-MIC-AVX512F-NEXT: retq 2219 %m = tail call i32 @memcmp(ptr %X, ptr @.str, i64 96) nounwind 2220 %c = icmp eq i32 %m, 0 2221 ret i1 %c 2222} 2223 2224define i32 @length127(ptr %X, ptr %Y) nounwind { 2225; X64-LABEL: length127: 2226; X64: # %bb.0: 2227; X64-NEXT: movl $127, %edx 2228; X64-NEXT: jmp memcmp # TAILCALL 2229 %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 127) nounwind 2230 ret i32 %m 2231} 2232 2233define i1 @length127_eq(ptr %x, ptr %y) nounwind { 2234; X64-SSE-LABEL: length127_eq: 2235; X64-SSE: # %bb.0: 2236; X64-SSE-NEXT: pushq %rax 2237; X64-SSE-NEXT: movl $127, %edx 2238; X64-SSE-NEXT: callq memcmp 2239; X64-SSE-NEXT: testl %eax, %eax 2240; X64-SSE-NEXT: setne %al 2241; X64-SSE-NEXT: popq %rcx 2242; X64-SSE-NEXT: retq 2243; 2244; X64-AVX1-LABEL: length127_eq: 2245; X64-AVX1: # %bb.0: 2246; X64-AVX1-NEXT: pushq %rax 2247; X64-AVX1-NEXT: movl $127, %edx 2248; X64-AVX1-NEXT: callq memcmp 2249; X64-AVX1-NEXT: testl %eax, %eax 2250; X64-AVX1-NEXT: setne %al 2251; X64-AVX1-NEXT: popq %rcx 2252; X64-AVX1-NEXT: retq 2253; 2254; X64-AVX2-LABEL: length127_eq: 2255; X64-AVX2: # %bb.0: 2256; X64-AVX2-NEXT: pushq %rax 2257; X64-AVX2-NEXT: movl $127, %edx 2258; X64-AVX2-NEXT: callq memcmp 2259; X64-AVX2-NEXT: testl %eax, %eax 2260; X64-AVX2-NEXT: setne %al 2261; X64-AVX2-NEXT: popq %rcx 2262; X64-AVX2-NEXT: retq 2263; 2264; X64-AVX512BW-LABEL: length127_eq: 2265; X64-AVX512BW: # %bb.0: 2266; X64-AVX512BW-NEXT: vmovdqu64 (%rdi), %zmm0 2267; X64-AVX512BW-NEXT: vmovdqu64 63(%rdi), %zmm1 2268; X64-AVX512BW-NEXT: vpcmpneqb 63(%rsi), %zmm1, %k0 2269; X64-AVX512BW-NEXT: vpcmpneqb (%rsi), %zmm0, %k1 2270; X64-AVX512BW-NEXT: kortestq %k0, %k1 2271; X64-AVX512BW-NEXT: setne %al 2272; X64-AVX512BW-NEXT: vzeroupper 2273; X64-AVX512BW-NEXT: retq 2274; 2275; X64-AVX512F-LABEL: length127_eq: 2276; X64-AVX512F: # %bb.0: 2277; X64-AVX512F-NEXT: vmovdqu64 (%rdi), %zmm0 2278; X64-AVX512F-NEXT: vmovdqu64 63(%rdi), %zmm1 2279; X64-AVX512F-NEXT: vpcmpneqd 63(%rsi), %zmm1, %k0 2280; X64-AVX512F-NEXT: vpcmpneqd (%rsi), %zmm0, %k1 2281; X64-AVX512F-NEXT: kortestw %k0, %k1 2282; X64-AVX512F-NEXT: setne %al 2283; X64-AVX512F-NEXT: vzeroupper 2284; X64-AVX512F-NEXT: retq 2285; 2286; X64-MIC-AVX2-LABEL: length127_eq: 2287; X64-MIC-AVX2: # %bb.0: 2288; X64-MIC-AVX2-NEXT: pushq %rax 2289; X64-MIC-AVX2-NEXT: movl $127, %edx 2290; X64-MIC-AVX2-NEXT: callq memcmp 2291; X64-MIC-AVX2-NEXT: testl %eax, %eax 2292; X64-MIC-AVX2-NEXT: setne %al 2293; X64-MIC-AVX2-NEXT: popq %rcx 2294; X64-MIC-AVX2-NEXT: retq 2295; 2296; X64-MIC-AVX512F-LABEL: length127_eq: 2297; X64-MIC-AVX512F: # %bb.0: 2298; X64-MIC-AVX512F-NEXT: vmovdqu64 (%rdi), %zmm0 2299; X64-MIC-AVX512F-NEXT: vmovdqu64 63(%rdi), %zmm1 2300; X64-MIC-AVX512F-NEXT: vpcmpneqd 63(%rsi), %zmm1, %k0 2301; X64-MIC-AVX512F-NEXT: vpcmpneqd (%rsi), %zmm0, %k1 2302; X64-MIC-AVX512F-NEXT: kortestw %k0, %k1 2303; X64-MIC-AVX512F-NEXT: setne %al 2304; X64-MIC-AVX512F-NEXT: vzeroupper 2305; X64-MIC-AVX512F-NEXT: retq 2306 %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 127) nounwind 2307 %cmp = icmp ne i32 %call, 0 2308 ret i1 %cmp 2309} 2310 2311define i1 @length127_lt(ptr %x, ptr %y) nounwind { 2312; X64-LABEL: length127_lt: 2313; X64: # %bb.0: 2314; X64-NEXT: pushq %rax 2315; X64-NEXT: movl $127, %edx 2316; X64-NEXT: callq memcmp 2317; X64-NEXT: shrl $31, %eax 2318; X64-NEXT: # kill: def $al killed $al killed $eax 2319; X64-NEXT: popq %rcx 2320; X64-NEXT: retq 2321 %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 127) nounwind 2322 %cmp = icmp slt i32 %call, 0 2323 ret i1 %cmp 2324} 2325 2326define i1 @length127_gt(ptr %x, ptr %y) nounwind { 2327; X64-LABEL: length127_gt: 2328; X64: # %bb.0: 2329; X64-NEXT: pushq %rax 2330; X64-NEXT: movl $127, %edx 2331; X64-NEXT: callq memcmp 2332; X64-NEXT: testl %eax, %eax 2333; X64-NEXT: setg %al 2334; X64-NEXT: popq %rcx 2335; X64-NEXT: retq 2336 %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 127) nounwind 2337 %cmp = icmp sgt i32 %call, 0 2338 ret i1 %cmp 2339} 2340 2341define i1 @length127_eq_const(ptr %X) nounwind { 2342; X64-SSE-LABEL: length127_eq_const: 2343; X64-SSE: # %bb.0: 2344; X64-SSE-NEXT: pushq %rax 2345; X64-SSE-NEXT: movl $.L.str, %esi 2346; X64-SSE-NEXT: movl $127, %edx 2347; X64-SSE-NEXT: callq memcmp 2348; X64-SSE-NEXT: testl %eax, %eax 2349; X64-SSE-NEXT: sete %al 2350; X64-SSE-NEXT: popq %rcx 2351; X64-SSE-NEXT: retq 2352; 2353; X64-AVX1-LABEL: length127_eq_const: 2354; X64-AVX1: # %bb.0: 2355; X64-AVX1-NEXT: pushq %rax 2356; X64-AVX1-NEXT: movl $.L.str, %esi 2357; X64-AVX1-NEXT: movl $127, %edx 2358; X64-AVX1-NEXT: callq memcmp 2359; X64-AVX1-NEXT: testl %eax, %eax 2360; X64-AVX1-NEXT: sete %al 2361; X64-AVX1-NEXT: popq %rcx 2362; X64-AVX1-NEXT: retq 2363; 2364; X64-AVX2-LABEL: length127_eq_const: 2365; X64-AVX2: # %bb.0: 2366; X64-AVX2-NEXT: pushq %rax 2367; X64-AVX2-NEXT: movl $.L.str, %esi 2368; X64-AVX2-NEXT: movl $127, %edx 2369; X64-AVX2-NEXT: callq memcmp 2370; X64-AVX2-NEXT: testl %eax, %eax 2371; X64-AVX2-NEXT: sete %al 2372; X64-AVX2-NEXT: popq %rcx 2373; X64-AVX2-NEXT: retq 2374; 2375; X64-AVX512BW-LABEL: length127_eq_const: 2376; X64-AVX512BW: # %bb.0: 2377; X64-AVX512BW-NEXT: vmovdqu64 (%rdi), %zmm0 2378; X64-AVX512BW-NEXT: vmovdqu64 63(%rdi), %zmm1 2379; X64-AVX512BW-NEXT: vpcmpneqb .L.str+63(%rip), %zmm1, %k0 2380; X64-AVX512BW-NEXT: vpcmpneqb .L.str(%rip), %zmm0, %k1 2381; X64-AVX512BW-NEXT: kortestq %k0, %k1 2382; X64-AVX512BW-NEXT: sete %al 2383; X64-AVX512BW-NEXT: vzeroupper 2384; X64-AVX512BW-NEXT: retq 2385; 2386; X64-AVX512F-LABEL: length127_eq_const: 2387; X64-AVX512F: # %bb.0: 2388; X64-AVX512F-NEXT: vmovdqu64 (%rdi), %zmm0 2389; X64-AVX512F-NEXT: vmovdqu64 63(%rdi), %zmm1 2390; X64-AVX512F-NEXT: vpcmpneqd .L.str+63(%rip), %zmm1, %k0 2391; X64-AVX512F-NEXT: vpcmpneqd .L.str(%rip), %zmm0, %k1 2392; X64-AVX512F-NEXT: kortestw %k0, %k1 2393; X64-AVX512F-NEXT: sete %al 2394; X64-AVX512F-NEXT: vzeroupper 2395; X64-AVX512F-NEXT: retq 2396; 2397; X64-MIC-AVX2-LABEL: length127_eq_const: 2398; X64-MIC-AVX2: # %bb.0: 2399; X64-MIC-AVX2-NEXT: pushq %rax 2400; X64-MIC-AVX2-NEXT: movl $.L.str, %esi 2401; X64-MIC-AVX2-NEXT: movl $127, %edx 2402; X64-MIC-AVX2-NEXT: callq memcmp 2403; X64-MIC-AVX2-NEXT: testl %eax, %eax 2404; X64-MIC-AVX2-NEXT: sete %al 2405; X64-MIC-AVX2-NEXT: popq %rcx 2406; X64-MIC-AVX2-NEXT: retq 2407; 2408; X64-MIC-AVX512F-LABEL: length127_eq_const: 2409; X64-MIC-AVX512F: # %bb.0: 2410; X64-MIC-AVX512F-NEXT: vmovdqu64 (%rdi), %zmm0 2411; X64-MIC-AVX512F-NEXT: vmovdqu64 63(%rdi), %zmm1 2412; X64-MIC-AVX512F-NEXT: vpcmpneqd .L.str+63(%rip), %zmm1, %k0 2413; X64-MIC-AVX512F-NEXT: vpcmpneqd .L.str(%rip), %zmm0, %k1 2414; X64-MIC-AVX512F-NEXT: kortestw %k0, %k1 2415; X64-MIC-AVX512F-NEXT: sete %al 2416; X64-MIC-AVX512F-NEXT: vzeroupper 2417; X64-MIC-AVX512F-NEXT: retq 2418 %m = tail call i32 @memcmp(ptr %X, ptr @.str, i64 127) nounwind 2419 %c = icmp eq i32 %m, 0 2420 ret i1 %c 2421} 2422 2423define i32 @length128(ptr %X, ptr %Y) nounwind { 2424; X64-LABEL: length128: 2425; X64: # %bb.0: 2426; X64-NEXT: movl $128, %edx 2427; X64-NEXT: jmp memcmp # TAILCALL 2428 %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 128) nounwind 2429 ret i32 %m 2430} 2431 2432define i1 @length128_eq(ptr %x, ptr %y) nounwind { 2433; X64-SSE-LABEL: length128_eq: 2434; X64-SSE: # %bb.0: 2435; X64-SSE-NEXT: pushq %rax 2436; X64-SSE-NEXT: movl $128, %edx 2437; X64-SSE-NEXT: callq memcmp 2438; X64-SSE-NEXT: testl %eax, %eax 2439; X64-SSE-NEXT: setne %al 2440; X64-SSE-NEXT: popq %rcx 2441; X64-SSE-NEXT: retq 2442; 2443; X64-AVX1-LABEL: length128_eq: 2444; X64-AVX1: # %bb.0: 2445; X64-AVX1-NEXT: pushq %rax 2446; X64-AVX1-NEXT: movl $128, %edx 2447; X64-AVX1-NEXT: callq memcmp 2448; X64-AVX1-NEXT: testl %eax, %eax 2449; X64-AVX1-NEXT: setne %al 2450; X64-AVX1-NEXT: popq %rcx 2451; X64-AVX1-NEXT: retq 2452; 2453; X64-AVX2-LABEL: length128_eq: 2454; X64-AVX2: # %bb.0: 2455; X64-AVX2-NEXT: pushq %rax 2456; X64-AVX2-NEXT: movl $128, %edx 2457; X64-AVX2-NEXT: callq memcmp 2458; X64-AVX2-NEXT: testl %eax, %eax 2459; X64-AVX2-NEXT: setne %al 2460; X64-AVX2-NEXT: popq %rcx 2461; X64-AVX2-NEXT: retq 2462; 2463; X64-AVX512BW-LABEL: length128_eq: 2464; X64-AVX512BW: # %bb.0: 2465; X64-AVX512BW-NEXT: vmovdqu64 (%rdi), %zmm0 2466; X64-AVX512BW-NEXT: vmovdqu64 64(%rdi), %zmm1 2467; X64-AVX512BW-NEXT: vpcmpneqb 64(%rsi), %zmm1, %k0 2468; X64-AVX512BW-NEXT: vpcmpneqb (%rsi), %zmm0, %k1 2469; X64-AVX512BW-NEXT: kortestq %k0, %k1 2470; X64-AVX512BW-NEXT: setne %al 2471; X64-AVX512BW-NEXT: vzeroupper 2472; X64-AVX512BW-NEXT: retq 2473; 2474; X64-AVX512F-LABEL: length128_eq: 2475; X64-AVX512F: # %bb.0: 2476; X64-AVX512F-NEXT: vmovdqu64 (%rdi), %zmm0 2477; X64-AVX512F-NEXT: vmovdqu64 64(%rdi), %zmm1 2478; X64-AVX512F-NEXT: vpcmpneqd 64(%rsi), %zmm1, %k0 2479; X64-AVX512F-NEXT: vpcmpneqd (%rsi), %zmm0, %k1 2480; X64-AVX512F-NEXT: kortestw %k0, %k1 2481; X64-AVX512F-NEXT: setne %al 2482; X64-AVX512F-NEXT: vzeroupper 2483; X64-AVX512F-NEXT: retq 2484; 2485; X64-MIC-AVX2-LABEL: length128_eq: 2486; X64-MIC-AVX2: # %bb.0: 2487; X64-MIC-AVX2-NEXT: pushq %rax 2488; X64-MIC-AVX2-NEXT: movl $128, %edx 2489; X64-MIC-AVX2-NEXT: callq memcmp 2490; X64-MIC-AVX2-NEXT: testl %eax, %eax 2491; X64-MIC-AVX2-NEXT: setne %al 2492; X64-MIC-AVX2-NEXT: popq %rcx 2493; X64-MIC-AVX2-NEXT: retq 2494; 2495; X64-MIC-AVX512F-LABEL: length128_eq: 2496; X64-MIC-AVX512F: # %bb.0: 2497; X64-MIC-AVX512F-NEXT: vmovdqu64 (%rdi), %zmm0 2498; X64-MIC-AVX512F-NEXT: vmovdqu64 64(%rdi), %zmm1 2499; X64-MIC-AVX512F-NEXT: vpcmpneqd 64(%rsi), %zmm1, %k0 2500; X64-MIC-AVX512F-NEXT: vpcmpneqd (%rsi), %zmm0, %k1 2501; X64-MIC-AVX512F-NEXT: kortestw %k0, %k1 2502; X64-MIC-AVX512F-NEXT: setne %al 2503; X64-MIC-AVX512F-NEXT: vzeroupper 2504; X64-MIC-AVX512F-NEXT: retq 2505 %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 128) nounwind 2506 %cmp = icmp ne i32 %call, 0 2507 ret i1 %cmp 2508} 2509 2510define i1 @length128_lt(ptr %x, ptr %y) nounwind { 2511; X64-LABEL: length128_lt: 2512; X64: # %bb.0: 2513; X64-NEXT: pushq %rax 2514; X64-NEXT: movl $128, %edx 2515; X64-NEXT: callq memcmp 2516; X64-NEXT: shrl $31, %eax 2517; X64-NEXT: # kill: def $al killed $al killed $eax 2518; X64-NEXT: popq %rcx 2519; X64-NEXT: retq 2520 %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 128) nounwind 2521 %cmp = icmp slt i32 %call, 0 2522 ret i1 %cmp 2523} 2524 2525define i1 @length128_gt(ptr %x, ptr %y) nounwind { 2526; X64-LABEL: length128_gt: 2527; X64: # %bb.0: 2528; X64-NEXT: pushq %rax 2529; X64-NEXT: movl $128, %edx 2530; X64-NEXT: callq memcmp 2531; X64-NEXT: testl %eax, %eax 2532; X64-NEXT: setg %al 2533; X64-NEXT: popq %rcx 2534; X64-NEXT: retq 2535 %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 128) nounwind 2536 %cmp = icmp sgt i32 %call, 0 2537 ret i1 %cmp 2538} 2539 2540define i1 @length128_eq_const(ptr %X) nounwind { 2541; X64-SSE-LABEL: length128_eq_const: 2542; X64-SSE: # %bb.0: 2543; X64-SSE-NEXT: pushq %rax 2544; X64-SSE-NEXT: movl $.L.str, %esi 2545; X64-SSE-NEXT: movl $128, %edx 2546; X64-SSE-NEXT: callq memcmp 2547; X64-SSE-NEXT: testl %eax, %eax 2548; X64-SSE-NEXT: sete %al 2549; X64-SSE-NEXT: popq %rcx 2550; X64-SSE-NEXT: retq 2551; 2552; X64-AVX1-LABEL: length128_eq_const: 2553; X64-AVX1: # %bb.0: 2554; X64-AVX1-NEXT: pushq %rax 2555; X64-AVX1-NEXT: movl $.L.str, %esi 2556; X64-AVX1-NEXT: movl $128, %edx 2557; X64-AVX1-NEXT: callq memcmp 2558; X64-AVX1-NEXT: testl %eax, %eax 2559; X64-AVX1-NEXT: sete %al 2560; X64-AVX1-NEXT: popq %rcx 2561; X64-AVX1-NEXT: retq 2562; 2563; X64-AVX2-LABEL: length128_eq_const: 2564; X64-AVX2: # %bb.0: 2565; X64-AVX2-NEXT: pushq %rax 2566; X64-AVX2-NEXT: movl $.L.str, %esi 2567; X64-AVX2-NEXT: movl $128, %edx 2568; X64-AVX2-NEXT: callq memcmp 2569; X64-AVX2-NEXT: testl %eax, %eax 2570; X64-AVX2-NEXT: sete %al 2571; X64-AVX2-NEXT: popq %rcx 2572; X64-AVX2-NEXT: retq 2573; 2574; X64-AVX512BW-LABEL: length128_eq_const: 2575; X64-AVX512BW: # %bb.0: 2576; X64-AVX512BW-NEXT: vmovdqu64 (%rdi), %zmm0 2577; X64-AVX512BW-NEXT: vmovdqu64 64(%rdi), %zmm1 2578; X64-AVX512BW-NEXT: vpcmpneqb .L.str+64(%rip), %zmm1, %k0 2579; X64-AVX512BW-NEXT: vpcmpneqb .L.str(%rip), %zmm0, %k1 2580; X64-AVX512BW-NEXT: kortestq %k0, %k1 2581; X64-AVX512BW-NEXT: sete %al 2582; X64-AVX512BW-NEXT: vzeroupper 2583; X64-AVX512BW-NEXT: retq 2584; 2585; X64-AVX512F-LABEL: length128_eq_const: 2586; X64-AVX512F: # %bb.0: 2587; X64-AVX512F-NEXT: vmovdqu64 (%rdi), %zmm0 2588; X64-AVX512F-NEXT: vmovdqu64 64(%rdi), %zmm1 2589; X64-AVX512F-NEXT: vpcmpneqd .L.str+64(%rip), %zmm1, %k0 2590; X64-AVX512F-NEXT: vpcmpneqd .L.str(%rip), %zmm0, %k1 2591; X64-AVX512F-NEXT: kortestw %k0, %k1 2592; X64-AVX512F-NEXT: sete %al 2593; X64-AVX512F-NEXT: vzeroupper 2594; X64-AVX512F-NEXT: retq 2595; 2596; X64-MIC-AVX2-LABEL: length128_eq_const: 2597; X64-MIC-AVX2: # %bb.0: 2598; X64-MIC-AVX2-NEXT: pushq %rax 2599; X64-MIC-AVX2-NEXT: movl $.L.str, %esi 2600; X64-MIC-AVX2-NEXT: movl $128, %edx 2601; X64-MIC-AVX2-NEXT: callq memcmp 2602; X64-MIC-AVX2-NEXT: testl %eax, %eax 2603; X64-MIC-AVX2-NEXT: sete %al 2604; X64-MIC-AVX2-NEXT: popq %rcx 2605; X64-MIC-AVX2-NEXT: retq 2606; 2607; X64-MIC-AVX512F-LABEL: length128_eq_const: 2608; X64-MIC-AVX512F: # %bb.0: 2609; X64-MIC-AVX512F-NEXT: vmovdqu64 (%rdi), %zmm0 2610; X64-MIC-AVX512F-NEXT: vmovdqu64 64(%rdi), %zmm1 2611; X64-MIC-AVX512F-NEXT: vpcmpneqd .L.str+64(%rip), %zmm1, %k0 2612; X64-MIC-AVX512F-NEXT: vpcmpneqd .L.str(%rip), %zmm0, %k1 2613; X64-MIC-AVX512F-NEXT: kortestw %k0, %k1 2614; X64-MIC-AVX512F-NEXT: sete %al 2615; X64-MIC-AVX512F-NEXT: vzeroupper 2616; X64-MIC-AVX512F-NEXT: retq 2617 %m = tail call i32 @memcmp(ptr %X, ptr @.str, i64 128) nounwind 2618 %c = icmp eq i32 %m, 0 2619 ret i1 %c 2620} 2621 2622define i32 @length192(ptr %X, ptr %Y) nounwind { 2623; X64-LABEL: length192: 2624; X64: # %bb.0: 2625; X64-NEXT: movl $192, %edx 2626; X64-NEXT: jmp memcmp # TAILCALL 2627 %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 192) nounwind 2628 ret i32 %m 2629} 2630 2631define i1 @length192_eq(ptr %x, ptr %y) nounwind { 2632; X64-LABEL: length192_eq: 2633; X64: # %bb.0: 2634; X64-NEXT: pushq %rax 2635; X64-NEXT: movl $192, %edx 2636; X64-NEXT: callq memcmp 2637; X64-NEXT: testl %eax, %eax 2638; X64-NEXT: setne %al 2639; X64-NEXT: popq %rcx 2640; X64-NEXT: retq 2641 %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 192) nounwind 2642 %cmp = icmp ne i32 %call, 0 2643 ret i1 %cmp 2644} 2645 2646define i1 @length192_lt(ptr %x, ptr %y) nounwind { 2647; X64-LABEL: length192_lt: 2648; X64: # %bb.0: 2649; X64-NEXT: pushq %rax 2650; X64-NEXT: movl $192, %edx 2651; X64-NEXT: callq memcmp 2652; X64-NEXT: shrl $31, %eax 2653; X64-NEXT: # kill: def $al killed $al killed $eax 2654; X64-NEXT: popq %rcx 2655; X64-NEXT: retq 2656 %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 192) nounwind 2657 %cmp = icmp slt i32 %call, 0 2658 ret i1 %cmp 2659} 2660 2661define i1 @length192_gt(ptr %x, ptr %y) nounwind { 2662; X64-LABEL: length192_gt: 2663; X64: # %bb.0: 2664; X64-NEXT: pushq %rax 2665; X64-NEXT: movl $192, %edx 2666; X64-NEXT: callq memcmp 2667; X64-NEXT: testl %eax, %eax 2668; X64-NEXT: setg %al 2669; X64-NEXT: popq %rcx 2670; X64-NEXT: retq 2671 %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 192) nounwind 2672 %cmp = icmp sgt i32 %call, 0 2673 ret i1 %cmp 2674} 2675 2676define i1 @length192_eq_const(ptr %X) nounwind { 2677; X64-LABEL: length192_eq_const: 2678; X64: # %bb.0: 2679; X64-NEXT: pushq %rax 2680; X64-NEXT: movl $.L.str, %esi 2681; X64-NEXT: movl $192, %edx 2682; X64-NEXT: callq memcmp 2683; X64-NEXT: testl %eax, %eax 2684; X64-NEXT: sete %al 2685; X64-NEXT: popq %rcx 2686; X64-NEXT: retq 2687 %m = tail call i32 @memcmp(ptr %X, ptr @.str, i64 192) nounwind 2688 %c = icmp eq i32 %m, 0 2689 ret i1 %c 2690} 2691 2692define i32 @length255(ptr %X, ptr %Y) nounwind { 2693; X64-LABEL: length255: 2694; X64: # %bb.0: 2695; X64-NEXT: movl $255, %edx 2696; X64-NEXT: jmp memcmp # TAILCALL 2697 %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 255) nounwind 2698 ret i32 %m 2699} 2700 2701define i1 @length255_eq(ptr %x, ptr %y) nounwind { 2702; X64-LABEL: length255_eq: 2703; X64: # %bb.0: 2704; X64-NEXT: pushq %rax 2705; X64-NEXT: movl $255, %edx 2706; X64-NEXT: callq memcmp 2707; X64-NEXT: testl %eax, %eax 2708; X64-NEXT: setne %al 2709; X64-NEXT: popq %rcx 2710; X64-NEXT: retq 2711 %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 255) nounwind 2712 %cmp = icmp ne i32 %call, 0 2713 ret i1 %cmp 2714} 2715 2716define i1 @length255_lt(ptr %x, ptr %y) nounwind { 2717; X64-LABEL: length255_lt: 2718; X64: # %bb.0: 2719; X64-NEXT: pushq %rax 2720; X64-NEXT: movl $255, %edx 2721; X64-NEXT: callq memcmp 2722; X64-NEXT: shrl $31, %eax 2723; X64-NEXT: # kill: def $al killed $al killed $eax 2724; X64-NEXT: popq %rcx 2725; X64-NEXT: retq 2726 %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 255) nounwind 2727 %cmp = icmp slt i32 %call, 0 2728 ret i1 %cmp 2729} 2730 2731define i1 @length255_gt(ptr %x, ptr %y) nounwind { 2732; X64-LABEL: length255_gt: 2733; X64: # %bb.0: 2734; X64-NEXT: pushq %rax 2735; X64-NEXT: movl $255, %edx 2736; X64-NEXT: callq memcmp 2737; X64-NEXT: testl %eax, %eax 2738; X64-NEXT: setg %al 2739; X64-NEXT: popq %rcx 2740; X64-NEXT: retq 2741 %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 255) nounwind 2742 %cmp = icmp sgt i32 %call, 0 2743 ret i1 %cmp 2744} 2745 2746define i1 @length255_eq_const(ptr %X) nounwind { 2747; X64-LABEL: length255_eq_const: 2748; X64: # %bb.0: 2749; X64-NEXT: pushq %rax 2750; X64-NEXT: movl $.L.str, %esi 2751; X64-NEXT: movl $255, %edx 2752; X64-NEXT: callq memcmp 2753; X64-NEXT: testl %eax, %eax 2754; X64-NEXT: sete %al 2755; X64-NEXT: popq %rcx 2756; X64-NEXT: retq 2757 %m = tail call i32 @memcmp(ptr %X, ptr @.str, i64 255) nounwind 2758 %c = icmp eq i32 %m, 0 2759 ret i1 %c 2760} 2761 2762define i32 @length256(ptr %X, ptr %Y) nounwind { 2763; X64-LABEL: length256: 2764; X64: # %bb.0: 2765; X64-NEXT: movl $256, %edx # imm = 0x100 2766; X64-NEXT: jmp memcmp # TAILCALL 2767 %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 256) nounwind 2768 ret i32 %m 2769} 2770 2771define i1 @length256_eq(ptr %x, ptr %y) nounwind { 2772; X64-LABEL: length256_eq: 2773; X64: # %bb.0: 2774; X64-NEXT: pushq %rax 2775; X64-NEXT: movl $256, %edx # imm = 0x100 2776; X64-NEXT: callq memcmp 2777; X64-NEXT: testl %eax, %eax 2778; X64-NEXT: setne %al 2779; X64-NEXT: popq %rcx 2780; X64-NEXT: retq 2781 %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 256) nounwind 2782 %cmp = icmp ne i32 %call, 0 2783 ret i1 %cmp 2784} 2785 2786define i1 @length256_lt(ptr %x, ptr %y) nounwind { 2787; X64-LABEL: length256_lt: 2788; X64: # %bb.0: 2789; X64-NEXT: pushq %rax 2790; X64-NEXT: movl $256, %edx # imm = 0x100 2791; X64-NEXT: callq memcmp 2792; X64-NEXT: shrl $31, %eax 2793; X64-NEXT: # kill: def $al killed $al killed $eax 2794; X64-NEXT: popq %rcx 2795; X64-NEXT: retq 2796 %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 256) nounwind 2797 %cmp = icmp slt i32 %call, 0 2798 ret i1 %cmp 2799} 2800 2801define i1 @length256_gt(ptr %x, ptr %y) nounwind { 2802; X64-LABEL: length256_gt: 2803; X64: # %bb.0: 2804; X64-NEXT: pushq %rax 2805; X64-NEXT: movl $256, %edx # imm = 0x100 2806; X64-NEXT: callq memcmp 2807; X64-NEXT: testl %eax, %eax 2808; X64-NEXT: setg %al 2809; X64-NEXT: popq %rcx 2810; X64-NEXT: retq 2811 %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 256) nounwind 2812 %cmp = icmp sgt i32 %call, 0 2813 ret i1 %cmp 2814} 2815 2816define i1 @length256_eq_const(ptr %X) nounwind { 2817; X64-LABEL: length256_eq_const: 2818; X64: # %bb.0: 2819; X64-NEXT: pushq %rax 2820; X64-NEXT: movl $.L.str, %esi 2821; X64-NEXT: movl $256, %edx # imm = 0x100 2822; X64-NEXT: callq memcmp 2823; X64-NEXT: testl %eax, %eax 2824; X64-NEXT: sete %al 2825; X64-NEXT: popq %rcx 2826; X64-NEXT: retq 2827 %m = tail call i32 @memcmp(ptr %X, ptr @.str, i64 256) nounwind 2828 %c = icmp eq i32 %m, 0 2829 ret i1 %c 2830} 2831 2832define i32 @length384(ptr %X, ptr %Y) nounwind { 2833; X64-LABEL: length384: 2834; X64: # %bb.0: 2835; X64-NEXT: movl $384, %edx # imm = 0x180 2836; X64-NEXT: jmp memcmp # TAILCALL 2837 %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 384) nounwind 2838 ret i32 %m 2839} 2840 2841define i1 @length384_eq(ptr %x, ptr %y) nounwind { 2842; X64-LABEL: length384_eq: 2843; X64: # %bb.0: 2844; X64-NEXT: pushq %rax 2845; X64-NEXT: movl $384, %edx # imm = 0x180 2846; X64-NEXT: callq memcmp 2847; X64-NEXT: testl %eax, %eax 2848; X64-NEXT: setne %al 2849; X64-NEXT: popq %rcx 2850; X64-NEXT: retq 2851 %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 384) nounwind 2852 %cmp = icmp ne i32 %call, 0 2853 ret i1 %cmp 2854} 2855 2856define i1 @length384_lt(ptr %x, ptr %y) nounwind { 2857; X64-LABEL: length384_lt: 2858; X64: # %bb.0: 2859; X64-NEXT: pushq %rax 2860; X64-NEXT: movl $384, %edx # imm = 0x180 2861; X64-NEXT: callq memcmp 2862; X64-NEXT: shrl $31, %eax 2863; X64-NEXT: # kill: def $al killed $al killed $eax 2864; X64-NEXT: popq %rcx 2865; X64-NEXT: retq 2866 %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 384) nounwind 2867 %cmp = icmp slt i32 %call, 0 2868 ret i1 %cmp 2869} 2870 2871define i1 @length384_gt(ptr %x, ptr %y) nounwind { 2872; X64-LABEL: length384_gt: 2873; X64: # %bb.0: 2874; X64-NEXT: pushq %rax 2875; X64-NEXT: movl $384, %edx # imm = 0x180 2876; X64-NEXT: callq memcmp 2877; X64-NEXT: testl %eax, %eax 2878; X64-NEXT: setg %al 2879; X64-NEXT: popq %rcx 2880; X64-NEXT: retq 2881 %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 384) nounwind 2882 %cmp = icmp sgt i32 %call, 0 2883 ret i1 %cmp 2884} 2885 2886define i1 @length384_eq_const(ptr %X) nounwind { 2887; X64-LABEL: length384_eq_const: 2888; X64: # %bb.0: 2889; X64-NEXT: pushq %rax 2890; X64-NEXT: movl $.L.str, %esi 2891; X64-NEXT: movl $384, %edx # imm = 0x180 2892; X64-NEXT: callq memcmp 2893; X64-NEXT: testl %eax, %eax 2894; X64-NEXT: sete %al 2895; X64-NEXT: popq %rcx 2896; X64-NEXT: retq 2897 %m = tail call i32 @memcmp(ptr %X, ptr @.str, i64 384) nounwind 2898 %c = icmp eq i32 %m, 0 2899 ret i1 %c 2900} 2901 2902define i32 @length511(ptr %X, ptr %Y) nounwind { 2903; X64-LABEL: length511: 2904; X64: # %bb.0: 2905; X64-NEXT: movl $511, %edx # imm = 0x1FF 2906; X64-NEXT: jmp memcmp # TAILCALL 2907 %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 511) nounwind 2908 ret i32 %m 2909} 2910 2911define i1 @length511_eq(ptr %x, ptr %y) nounwind { 2912; X64-LABEL: length511_eq: 2913; X64: # %bb.0: 2914; X64-NEXT: pushq %rax 2915; X64-NEXT: movl $511, %edx # imm = 0x1FF 2916; X64-NEXT: callq memcmp 2917; X64-NEXT: testl %eax, %eax 2918; X64-NEXT: setne %al 2919; X64-NEXT: popq %rcx 2920; X64-NEXT: retq 2921 %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 511) nounwind 2922 %cmp = icmp ne i32 %call, 0 2923 ret i1 %cmp 2924} 2925 2926define i1 @length511_lt(ptr %x, ptr %y) nounwind { 2927; X64-LABEL: length511_lt: 2928; X64: # %bb.0: 2929; X64-NEXT: pushq %rax 2930; X64-NEXT: movl $511, %edx # imm = 0x1FF 2931; X64-NEXT: callq memcmp 2932; X64-NEXT: shrl $31, %eax 2933; X64-NEXT: # kill: def $al killed $al killed $eax 2934; X64-NEXT: popq %rcx 2935; X64-NEXT: retq 2936 %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 511) nounwind 2937 %cmp = icmp slt i32 %call, 0 2938 ret i1 %cmp 2939} 2940 2941define i1 @length511_gt(ptr %x, ptr %y) nounwind { 2942; X64-LABEL: length511_gt: 2943; X64: # %bb.0: 2944; X64-NEXT: pushq %rax 2945; X64-NEXT: movl $511, %edx # imm = 0x1FF 2946; X64-NEXT: callq memcmp 2947; X64-NEXT: testl %eax, %eax 2948; X64-NEXT: setg %al 2949; X64-NEXT: popq %rcx 2950; X64-NEXT: retq 2951 %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 511) nounwind 2952 %cmp = icmp sgt i32 %call, 0 2953 ret i1 %cmp 2954} 2955 2956define i1 @length511_eq_const(ptr %X) nounwind { 2957; X64-LABEL: length511_eq_const: 2958; X64: # %bb.0: 2959; X64-NEXT: pushq %rax 2960; X64-NEXT: movl $.L.str, %esi 2961; X64-NEXT: movl $511, %edx # imm = 0x1FF 2962; X64-NEXT: callq memcmp 2963; X64-NEXT: testl %eax, %eax 2964; X64-NEXT: sete %al 2965; X64-NEXT: popq %rcx 2966; X64-NEXT: retq 2967 %m = tail call i32 @memcmp(ptr %X, ptr @.str, i64 511) nounwind 2968 %c = icmp eq i32 %m, 0 2969 ret i1 %c 2970} 2971 2972define i32 @length512(ptr %X, ptr %Y) nounwind { 2973; X64-LABEL: length512: 2974; X64: # %bb.0: 2975; X64-NEXT: movl $512, %edx # imm = 0x200 2976; X64-NEXT: jmp memcmp # TAILCALL 2977 %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 512) nounwind 2978 ret i32 %m 2979} 2980 2981define i1 @length512_eq(ptr %x, ptr %y) nounwind { 2982; X64-LABEL: length512_eq: 2983; X64: # %bb.0: 2984; X64-NEXT: pushq %rax 2985; X64-NEXT: movl $512, %edx # imm = 0x200 2986; X64-NEXT: callq memcmp 2987; X64-NEXT: testl %eax, %eax 2988; X64-NEXT: setne %al 2989; X64-NEXT: popq %rcx 2990; X64-NEXT: retq 2991 %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 512) nounwind 2992 %cmp = icmp ne i32 %call, 0 2993 ret i1 %cmp 2994} 2995 2996define i1 @length512_lt(ptr %x, ptr %y) nounwind { 2997; X64-LABEL: length512_lt: 2998; X64: # %bb.0: 2999; X64-NEXT: pushq %rax 3000; X64-NEXT: movl $512, %edx # imm = 0x200 3001; X64-NEXT: callq memcmp 3002; X64-NEXT: shrl $31, %eax 3003; X64-NEXT: # kill: def $al killed $al killed $eax 3004; X64-NEXT: popq %rcx 3005; X64-NEXT: retq 3006 %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 512) nounwind 3007 %cmp = icmp slt i32 %call, 0 3008 ret i1 %cmp 3009} 3010 3011define i1 @length512_gt(ptr %x, ptr %y) nounwind { 3012; X64-LABEL: length512_gt: 3013; X64: # %bb.0: 3014; X64-NEXT: pushq %rax 3015; X64-NEXT: movl $512, %edx # imm = 0x200 3016; X64-NEXT: callq memcmp 3017; X64-NEXT: testl %eax, %eax 3018; X64-NEXT: setg %al 3019; X64-NEXT: popq %rcx 3020; X64-NEXT: retq 3021 %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 512) nounwind 3022 %cmp = icmp sgt i32 %call, 0 3023 ret i1 %cmp 3024} 3025 3026define i1 @length512_eq_const(ptr %X) nounwind { 3027; X64-LABEL: length512_eq_const: 3028; X64: # %bb.0: 3029; X64-NEXT: pushq %rax 3030; X64-NEXT: movl $.L.str, %esi 3031; X64-NEXT: movl $512, %edx # imm = 0x200 3032; X64-NEXT: callq memcmp 3033; X64-NEXT: testl %eax, %eax 3034; X64-NEXT: sete %al 3035; X64-NEXT: popq %rcx 3036; X64-NEXT: retq 3037 %m = tail call i32 @memcmp(ptr %X, ptr @.str, i64 512) nounwind 3038 %c = icmp eq i32 %m, 0 3039 ret i1 %c 3040} 3041 3042; This checks that we do not do stupid things with huge sizes. 3043define i32 @huge_length(ptr %X, ptr %Y) nounwind { 3044; X64-LABEL: huge_length: 3045; X64: # %bb.0: 3046; X64-NEXT: movabsq $9223372036854775807, %rdx # imm = 0x7FFFFFFFFFFFFFFF 3047; X64-NEXT: jmp memcmp # TAILCALL 3048 %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 9223372036854775807) nounwind 3049 ret i32 %m 3050} 3051 3052define i1 @huge_length_eq(ptr %X, ptr %Y) nounwind { 3053; X64-LABEL: huge_length_eq: 3054; X64: # %bb.0: 3055; X64-NEXT: pushq %rax 3056; X64-NEXT: movabsq $9223372036854775807, %rdx # imm = 0x7FFFFFFFFFFFFFFF 3057; X64-NEXT: callq memcmp 3058; X64-NEXT: testl %eax, %eax 3059; X64-NEXT: sete %al 3060; X64-NEXT: popq %rcx 3061; X64-NEXT: retq 3062 %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 9223372036854775807) nounwind 3063 %c = icmp eq i32 %m, 0 3064 ret i1 %c 3065} 3066 3067; This checks non-constant sizes. 3068define i32 @nonconst_length(ptr %X, ptr %Y, i64 %size) nounwind { 3069; X64-LABEL: nonconst_length: 3070; X64: # %bb.0: 3071; X64-NEXT: jmp memcmp # TAILCALL 3072 %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 %size) nounwind 3073 ret i32 %m 3074} 3075 3076define i1 @nonconst_length_eq(ptr %X, ptr %Y, i64 %size) nounwind { 3077; X64-LABEL: nonconst_length_eq: 3078; X64: # %bb.0: 3079; X64-NEXT: pushq %rax 3080; X64-NEXT: callq memcmp 3081; X64-NEXT: testl %eax, %eax 3082; X64-NEXT: sete %al 3083; X64-NEXT: popq %rcx 3084; X64-NEXT: retq 3085 %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 %size) nounwind 3086 %c = icmp eq i32 %m, 0 3087 ret i1 %c 3088} 3089