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