1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2; RUN: llc < %s -mtriple=i686-unknown-unknown -mattr=cmov | FileCheck %s --check-prefixes=X86,X86-NOSSE 3; RUN: llc < %s -mtriple=i686-unknown-unknown -mattr=+sse | FileCheck %s --check-prefixes=X86,X86-SSE,X86-SSE1 4; RUN: llc < %s -mtriple=i686-unknown-unknown -mattr=+sse2 | FileCheck %s --check-prefixes=X86,X86-SSE,X86-SSE2 5; RUN: llc < %s -mtriple=i686-unknown-unknown -mattr=+sse4.1 | FileCheck %s --check-prefixes=X86,X86-SSE,X86-SSE41 6; RUN: llc < %s -mtriple=x86_64-unknown-unknown | FileCheck %s --check-prefixes=X64,X64-SSE,X64-SSE2 7; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=sse4.1 | FileCheck %s --check-prefixes=X64,X64-SSE,X64-SSE41 8; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=avx | FileCheck %s --check-prefixes=X64,X64-AVX,X64-AVX1 9; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=avx2 | FileCheck %s --check-prefixes=X64,X64-AVX,X64-AVX2 10; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=avx512bw,+prefer-256-bit | FileCheck %s --check-prefixes=X64,X64-AVX,X64-AVX2 11; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=avx512bw,-prefer-256-bit | FileCheck %s --check-prefixes=X64,X64-AVX,X64-AVX512,X64-AVX512BW 12; 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 13; 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 14; 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 15; 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 16 17; This tests codegen time inlining/optimization of memcmp 18; rdar://6480398 19 20@.str = private constant [513 x i8] c"01234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901\00", align 1 21 22declare i32 @memcmp(i8*, i8*, i64) 23 24define i32 @length0(i8* %X, i8* %Y) nounwind { 25; X86-LABEL: length0: 26; X86: # %bb.0: 27; X86-NEXT: xorl %eax, %eax 28; X86-NEXT: retl 29; 30; X64-LABEL: length0: 31; X64: # %bb.0: 32; X64-NEXT: xorl %eax, %eax 33; X64-NEXT: retq 34 %m = tail call i32 @memcmp(i8* %X, i8* %Y, i64 0) nounwind 35 ret i32 %m 36 } 37 38define i1 @length0_eq(i8* %X, i8* %Y) nounwind { 39; X86-LABEL: length0_eq: 40; X86: # %bb.0: 41; X86-NEXT: movb $1, %al 42; X86-NEXT: retl 43; 44; X64-LABEL: length0_eq: 45; X64: # %bb.0: 46; X64-NEXT: movb $1, %al 47; X64-NEXT: retq 48 %m = tail call i32 @memcmp(i8* %X, i8* %Y, i64 0) nounwind 49 %c = icmp eq i32 %m, 0 50 ret i1 %c 51} 52 53define i1 @length0_lt(i8* %X, i8* %Y) nounwind { 54; X86-LABEL: length0_lt: 55; X86: # %bb.0: 56; X86-NEXT: xorl %eax, %eax 57; X86-NEXT: retl 58; 59; X64-LABEL: length0_lt: 60; X64: # %bb.0: 61; X64-NEXT: xorl %eax, %eax 62; X64-NEXT: retq 63 %m = tail call i32 @memcmp(i8* %X, i8* %Y, i64 0) nounwind 64 %c = icmp slt i32 %m, 0 65 ret i1 %c 66} 67 68define i32 @length2(i8* %X, i8* %Y) nounwind { 69; X86-LABEL: length2: 70; X86: # %bb.0: 71; X86-NEXT: movl {{[0-9]+}}(%esp), %eax 72; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx 73; X86-NEXT: movzwl (%ecx), %ecx 74; X86-NEXT: movzwl (%eax), %edx 75; X86-NEXT: rolw $8, %cx 76; X86-NEXT: rolw $8, %dx 77; X86-NEXT: movzwl %cx, %eax 78; X86-NEXT: movzwl %dx, %ecx 79; X86-NEXT: subl %ecx, %eax 80; X86-NEXT: retl 81; 82; X64-LABEL: length2: 83; X64: # %bb.0: 84; X64-NEXT: movzwl (%rdi), %eax 85; X64-NEXT: movzwl (%rsi), %ecx 86; X64-NEXT: rolw $8, %ax 87; X64-NEXT: rolw $8, %cx 88; X64-NEXT: movzwl %ax, %eax 89; X64-NEXT: movzwl %cx, %ecx 90; X64-NEXT: subl %ecx, %eax 91; X64-NEXT: retq 92 %m = tail call i32 @memcmp(i8* %X, i8* %Y, i64 2) nounwind 93 ret i32 %m 94} 95 96define i1 @length2_eq(i8* %X, i8* %Y) nounwind { 97; X86-LABEL: length2_eq: 98; X86: # %bb.0: 99; X86-NEXT: movl {{[0-9]+}}(%esp), %eax 100; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx 101; X86-NEXT: movzwl (%ecx), %ecx 102; X86-NEXT: cmpw (%eax), %cx 103; X86-NEXT: sete %al 104; X86-NEXT: retl 105; 106; X64-LABEL: length2_eq: 107; X64: # %bb.0: 108; X64-NEXT: movzwl (%rdi), %eax 109; X64-NEXT: cmpw (%rsi), %ax 110; X64-NEXT: sete %al 111; X64-NEXT: retq 112 %m = tail call i32 @memcmp(i8* %X, i8* %Y, i64 2) nounwind 113 %c = icmp eq i32 %m, 0 114 ret i1 %c 115} 116 117define i1 @length2_lt(i8* %X, i8* %Y) nounwind { 118; X86-LABEL: length2_lt: 119; X86: # %bb.0: 120; X86-NEXT: movl {{[0-9]+}}(%esp), %eax 121; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx 122; X86-NEXT: movzwl (%ecx), %ecx 123; X86-NEXT: movzwl (%eax), %edx 124; X86-NEXT: rolw $8, %cx 125; X86-NEXT: rolw $8, %dx 126; X86-NEXT: movzwl %cx, %eax 127; X86-NEXT: movzwl %dx, %ecx 128; X86-NEXT: subl %ecx, %eax 129; X86-NEXT: shrl $31, %eax 130; X86-NEXT: # kill: def $al killed $al killed $eax 131; X86-NEXT: retl 132; 133; X64-LABEL: length2_lt: 134; X64: # %bb.0: 135; X64-NEXT: movzwl (%rdi), %eax 136; X64-NEXT: movzwl (%rsi), %ecx 137; X64-NEXT: rolw $8, %ax 138; X64-NEXT: rolw $8, %cx 139; X64-NEXT: movzwl %ax, %eax 140; X64-NEXT: movzwl %cx, %ecx 141; X64-NEXT: subl %ecx, %eax 142; X64-NEXT: shrl $31, %eax 143; X64-NEXT: # kill: def $al killed $al killed $eax 144; X64-NEXT: retq 145 %m = tail call i32 @memcmp(i8* %X, i8* %Y, i64 2) nounwind 146 %c = icmp slt i32 %m, 0 147 ret i1 %c 148} 149 150define i1 @length2_gt(i8* %X, i8* %Y) nounwind { 151; X86-LABEL: length2_gt: 152; X86: # %bb.0: 153; X86-NEXT: movl {{[0-9]+}}(%esp), %eax 154; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx 155; X86-NEXT: movzwl (%ecx), %ecx 156; X86-NEXT: movzwl (%eax), %eax 157; X86-NEXT: rolw $8, %cx 158; X86-NEXT: rolw $8, %ax 159; X86-NEXT: movzwl %cx, %ecx 160; X86-NEXT: movzwl %ax, %eax 161; X86-NEXT: subl %eax, %ecx 162; X86-NEXT: testl %ecx, %ecx 163; X86-NEXT: setg %al 164; X86-NEXT: retl 165; 166; X64-LABEL: length2_gt: 167; X64: # %bb.0: 168; X64-NEXT: movzwl (%rdi), %eax 169; X64-NEXT: movzwl (%rsi), %ecx 170; X64-NEXT: rolw $8, %ax 171; X64-NEXT: rolw $8, %cx 172; X64-NEXT: movzwl %ax, %eax 173; X64-NEXT: movzwl %cx, %ecx 174; X64-NEXT: subl %ecx, %eax 175; X64-NEXT: testl %eax, %eax 176; X64-NEXT: setg %al 177; X64-NEXT: retq 178 %m = tail call i32 @memcmp(i8* %X, i8* %Y, i64 2) nounwind 179 %c = icmp sgt i32 %m, 0 180 ret i1 %c 181} 182 183define i1 @length2_eq_const(i8* %X) nounwind { 184; X86-LABEL: length2_eq_const: 185; X86: # %bb.0: 186; X86-NEXT: movl {{[0-9]+}}(%esp), %eax 187; X86-NEXT: movzwl (%eax), %eax 188; X86-NEXT: cmpl $12849, %eax # imm = 0x3231 189; X86-NEXT: setne %al 190; X86-NEXT: retl 191; 192; X64-LABEL: length2_eq_const: 193; X64: # %bb.0: 194; X64-NEXT: movzwl (%rdi), %eax 195; X64-NEXT: cmpl $12849, %eax # imm = 0x3231 196; X64-NEXT: setne %al 197; X64-NEXT: retq 198 %m = tail call i32 @memcmp(i8* %X, i8* getelementptr inbounds ([513 x i8], [513 x i8]* @.str, i32 0, i32 1), i64 2) nounwind 199 %c = icmp ne i32 %m, 0 200 ret i1 %c 201} 202 203define i1 @length2_eq_nobuiltin_attr(i8* %X, i8* %Y) nounwind { 204; X86-LABEL: length2_eq_nobuiltin_attr: 205; X86: # %bb.0: 206; X86-NEXT: pushl $0 207; X86-NEXT: pushl $2 208; X86-NEXT: pushl {{[0-9]+}}(%esp) 209; X86-NEXT: pushl {{[0-9]+}}(%esp) 210; X86-NEXT: calll memcmp 211; X86-NEXT: addl $16, %esp 212; X86-NEXT: testl %eax, %eax 213; X86-NEXT: sete %al 214; X86-NEXT: retl 215; 216; X64-LABEL: length2_eq_nobuiltin_attr: 217; X64: # %bb.0: 218; X64-NEXT: pushq %rax 219; X64-NEXT: movl $2, %edx 220; X64-NEXT: callq memcmp 221; X64-NEXT: testl %eax, %eax 222; X64-NEXT: sete %al 223; X64-NEXT: popq %rcx 224; X64-NEXT: retq 225 %m = tail call i32 @memcmp(i8* %X, i8* %Y, i64 2) nounwind nobuiltin 226 %c = icmp eq i32 %m, 0 227 ret i1 %c 228} 229 230define i32 @length3(i8* %X, i8* %Y) nounwind { 231; X86-LABEL: length3: 232; X86: # %bb.0: # %loadbb 233; X86-NEXT: pushl %esi 234; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx 235; X86-NEXT: movl {{[0-9]+}}(%esp), %eax 236; X86-NEXT: movzwl (%eax), %edx 237; X86-NEXT: movzwl (%ecx), %esi 238; X86-NEXT: rolw $8, %dx 239; X86-NEXT: rolw $8, %si 240; X86-NEXT: cmpw %si, %dx 241; X86-NEXT: jne .LBB9_1 242; X86-NEXT: # %bb.2: # %loadbb1 243; X86-NEXT: movzbl 2(%eax), %eax 244; X86-NEXT: movzbl 2(%ecx), %ecx 245; X86-NEXT: subl %ecx, %eax 246; X86-NEXT: popl %esi 247; X86-NEXT: retl 248; X86-NEXT: .LBB9_1: # %res_block 249; X86-NEXT: setae %al 250; X86-NEXT: movzbl %al, %eax 251; X86-NEXT: leal -1(%eax,%eax), %eax 252; X86-NEXT: popl %esi 253; X86-NEXT: retl 254; 255; X64-LABEL: length3: 256; X64: # %bb.0: # %loadbb 257; X64-NEXT: movzwl (%rdi), %eax 258; X64-NEXT: movzwl (%rsi), %ecx 259; X64-NEXT: rolw $8, %ax 260; X64-NEXT: rolw $8, %cx 261; X64-NEXT: cmpw %cx, %ax 262; X64-NEXT: jne .LBB9_1 263; X64-NEXT: # %bb.2: # %loadbb1 264; X64-NEXT: movzbl 2(%rdi), %eax 265; X64-NEXT: movzbl 2(%rsi), %ecx 266; X64-NEXT: subl %ecx, %eax 267; X64-NEXT: retq 268; X64-NEXT: .LBB9_1: # %res_block 269; X64-NEXT: setae %al 270; X64-NEXT: movzbl %al, %eax 271; X64-NEXT: leal -1(%rax,%rax), %eax 272; X64-NEXT: retq 273 %m = tail call i32 @memcmp(i8* %X, i8* %Y, i64 3) nounwind 274 ret i32 %m 275} 276 277define i1 @length3_eq(i8* %X, i8* %Y) nounwind { 278; X86-LABEL: length3_eq: 279; X86: # %bb.0: 280; X86-NEXT: movl {{[0-9]+}}(%esp), %eax 281; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx 282; X86-NEXT: movzwl (%ecx), %edx 283; X86-NEXT: xorw (%eax), %dx 284; X86-NEXT: movb 2(%ecx), %cl 285; X86-NEXT: xorb 2(%eax), %cl 286; X86-NEXT: movzbl %cl, %eax 287; X86-NEXT: orw %dx, %ax 288; X86-NEXT: setne %al 289; X86-NEXT: retl 290; 291; X64-LABEL: length3_eq: 292; X64: # %bb.0: 293; X64-NEXT: movzwl (%rdi), %eax 294; X64-NEXT: xorw (%rsi), %ax 295; X64-NEXT: movb 2(%rdi), %cl 296; X64-NEXT: xorb 2(%rsi), %cl 297; X64-NEXT: movzbl %cl, %ecx 298; X64-NEXT: orw %ax, %cx 299; X64-NEXT: setne %al 300; X64-NEXT: retq 301 %m = tail call i32 @memcmp(i8* %X, i8* %Y, i64 3) nounwind 302 %c = icmp ne i32 %m, 0 303 ret i1 %c 304} 305 306define i32 @length4(i8* %X, i8* %Y) nounwind { 307; X86-LABEL: length4: 308; X86: # %bb.0: 309; X86-NEXT: movl {{[0-9]+}}(%esp), %eax 310; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx 311; X86-NEXT: movl (%ecx), %ecx 312; X86-NEXT: movl (%eax), %edx 313; X86-NEXT: bswapl %ecx 314; X86-NEXT: bswapl %edx 315; X86-NEXT: xorl %eax, %eax 316; X86-NEXT: cmpl %edx, %ecx 317; X86-NEXT: seta %al 318; X86-NEXT: sbbl $0, %eax 319; X86-NEXT: retl 320; 321; X64-LABEL: length4: 322; X64: # %bb.0: 323; X64-NEXT: movl (%rdi), %ecx 324; X64-NEXT: movl (%rsi), %edx 325; X64-NEXT: bswapl %ecx 326; X64-NEXT: bswapl %edx 327; X64-NEXT: xorl %eax, %eax 328; X64-NEXT: cmpl %edx, %ecx 329; X64-NEXT: seta %al 330; X64-NEXT: sbbl $0, %eax 331; X64-NEXT: retq 332 %m = tail call i32 @memcmp(i8* %X, i8* %Y, i64 4) nounwind 333 ret i32 %m 334} 335 336define i1 @length4_eq(i8* %X, i8* %Y) nounwind { 337; X86-LABEL: length4_eq: 338; X86: # %bb.0: 339; X86-NEXT: movl {{[0-9]+}}(%esp), %eax 340; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx 341; X86-NEXT: movl (%ecx), %ecx 342; X86-NEXT: cmpl (%eax), %ecx 343; X86-NEXT: setne %al 344; X86-NEXT: retl 345; 346; X64-LABEL: length4_eq: 347; X64: # %bb.0: 348; X64-NEXT: movl (%rdi), %eax 349; X64-NEXT: cmpl (%rsi), %eax 350; X64-NEXT: setne %al 351; X64-NEXT: retq 352 %m = tail call i32 @memcmp(i8* %X, i8* %Y, i64 4) nounwind 353 %c = icmp ne i32 %m, 0 354 ret i1 %c 355} 356 357define i1 @length4_lt(i8* %X, i8* %Y) nounwind { 358; X86-LABEL: length4_lt: 359; X86: # %bb.0: 360; X86-NEXT: movl {{[0-9]+}}(%esp), %eax 361; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx 362; X86-NEXT: movl (%ecx), %ecx 363; X86-NEXT: movl (%eax), %edx 364; X86-NEXT: bswapl %ecx 365; X86-NEXT: bswapl %edx 366; X86-NEXT: xorl %eax, %eax 367; X86-NEXT: cmpl %edx, %ecx 368; X86-NEXT: seta %al 369; X86-NEXT: sbbl $0, %eax 370; X86-NEXT: shrl $31, %eax 371; X86-NEXT: # kill: def $al killed $al killed $eax 372; X86-NEXT: retl 373; 374; X64-LABEL: length4_lt: 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: xorl %eax, %eax 381; X64-NEXT: cmpl %edx, %ecx 382; X64-NEXT: seta %al 383; X64-NEXT: sbbl $0, %eax 384; X64-NEXT: shrl $31, %eax 385; X64-NEXT: # kill: def $al killed $al killed $eax 386; X64-NEXT: retq 387 %m = tail call i32 @memcmp(i8* %X, i8* %Y, i64 4) nounwind 388 %c = icmp slt i32 %m, 0 389 ret i1 %c 390} 391 392define i1 @length4_gt(i8* %X, i8* %Y) nounwind { 393; X86-LABEL: length4_gt: 394; X86: # %bb.0: 395; X86-NEXT: movl {{[0-9]+}}(%esp), %eax 396; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx 397; X86-NEXT: movl (%ecx), %ecx 398; X86-NEXT: movl (%eax), %eax 399; X86-NEXT: bswapl %ecx 400; X86-NEXT: bswapl %eax 401; X86-NEXT: xorl %edx, %edx 402; X86-NEXT: cmpl %eax, %ecx 403; X86-NEXT: seta %dl 404; X86-NEXT: sbbl $0, %edx 405; X86-NEXT: testl %edx, %edx 406; X86-NEXT: setg %al 407; X86-NEXT: retl 408; 409; X64-LABEL: length4_gt: 410; X64: # %bb.0: 411; X64-NEXT: movl (%rdi), %eax 412; X64-NEXT: movl (%rsi), %ecx 413; X64-NEXT: bswapl %eax 414; X64-NEXT: bswapl %ecx 415; X64-NEXT: xorl %edx, %edx 416; X64-NEXT: cmpl %ecx, %eax 417; X64-NEXT: seta %dl 418; X64-NEXT: sbbl $0, %edx 419; X64-NEXT: testl %edx, %edx 420; X64-NEXT: setg %al 421; X64-NEXT: retq 422 %m = tail call i32 @memcmp(i8* %X, i8* %Y, i64 4) nounwind 423 %c = icmp sgt i32 %m, 0 424 ret i1 %c 425} 426 427define i1 @length4_eq_const(i8* %X) nounwind { 428; X86-LABEL: length4_eq_const: 429; X86: # %bb.0: 430; X86-NEXT: movl {{[0-9]+}}(%esp), %eax 431; X86-NEXT: cmpl $875770417, (%eax) # imm = 0x34333231 432; X86-NEXT: sete %al 433; X86-NEXT: retl 434; 435; X64-LABEL: length4_eq_const: 436; X64: # %bb.0: 437; X64-NEXT: cmpl $875770417, (%rdi) # imm = 0x34333231 438; X64-NEXT: sete %al 439; X64-NEXT: retq 440 %m = tail call i32 @memcmp(i8* %X, i8* getelementptr inbounds ([513 x i8], [513 x i8]* @.str, i32 0, i32 1), i64 4) nounwind 441 %c = icmp eq i32 %m, 0 442 ret i1 %c 443} 444 445define i32 @length5(i8* %X, i8* %Y) nounwind { 446; X86-LABEL: length5: 447; X86: # %bb.0: # %loadbb 448; X86-NEXT: pushl %esi 449; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx 450; X86-NEXT: movl {{[0-9]+}}(%esp), %eax 451; X86-NEXT: movl (%eax), %edx 452; X86-NEXT: movl (%ecx), %esi 453; X86-NEXT: bswapl %edx 454; X86-NEXT: bswapl %esi 455; X86-NEXT: cmpl %esi, %edx 456; X86-NEXT: jne .LBB16_1 457; X86-NEXT: # %bb.2: # %loadbb1 458; X86-NEXT: movzbl 4(%eax), %eax 459; X86-NEXT: movzbl 4(%ecx), %ecx 460; X86-NEXT: subl %ecx, %eax 461; X86-NEXT: popl %esi 462; X86-NEXT: retl 463; X86-NEXT: .LBB16_1: # %res_block 464; X86-NEXT: setae %al 465; X86-NEXT: movzbl %al, %eax 466; X86-NEXT: leal -1(%eax,%eax), %eax 467; X86-NEXT: popl %esi 468; X86-NEXT: retl 469; 470; X64-LABEL: length5: 471; X64: # %bb.0: # %loadbb 472; X64-NEXT: movl (%rdi), %eax 473; X64-NEXT: movl (%rsi), %ecx 474; X64-NEXT: bswapl %eax 475; X64-NEXT: bswapl %ecx 476; X64-NEXT: cmpl %ecx, %eax 477; X64-NEXT: jne .LBB16_1 478; X64-NEXT: # %bb.2: # %loadbb1 479; X64-NEXT: movzbl 4(%rdi), %eax 480; X64-NEXT: movzbl 4(%rsi), %ecx 481; X64-NEXT: subl %ecx, %eax 482; X64-NEXT: retq 483; X64-NEXT: .LBB16_1: # %res_block 484; X64-NEXT: setae %al 485; X64-NEXT: movzbl %al, %eax 486; X64-NEXT: leal -1(%rax,%rax), %eax 487; X64-NEXT: retq 488 %m = tail call i32 @memcmp(i8* %X, i8* %Y, i64 5) nounwind 489 ret i32 %m 490} 491 492define i1 @length5_eq(i8* %X, i8* %Y) nounwind { 493; X86-LABEL: length5_eq: 494; X86: # %bb.0: 495; X86-NEXT: movl {{[0-9]+}}(%esp), %eax 496; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx 497; X86-NEXT: movl (%ecx), %edx 498; X86-NEXT: xorl (%eax), %edx 499; X86-NEXT: movb 4(%ecx), %cl 500; X86-NEXT: xorb 4(%eax), %cl 501; X86-NEXT: movzbl %cl, %eax 502; X86-NEXT: orl %edx, %eax 503; X86-NEXT: setne %al 504; X86-NEXT: retl 505; 506; X64-LABEL: length5_eq: 507; X64: # %bb.0: 508; X64-NEXT: movl (%rdi), %eax 509; X64-NEXT: xorl (%rsi), %eax 510; X64-NEXT: movb 4(%rdi), %cl 511; X64-NEXT: xorb 4(%rsi), %cl 512; X64-NEXT: movzbl %cl, %ecx 513; X64-NEXT: orl %eax, %ecx 514; X64-NEXT: setne %al 515; X64-NEXT: retq 516 %m = tail call i32 @memcmp(i8* %X, i8* %Y, i64 5) nounwind 517 %c = icmp ne i32 %m, 0 518 ret i1 %c 519} 520 521define i1 @length5_lt(i8* %X, i8* %Y) nounwind { 522; X86-LABEL: length5_lt: 523; X86: # %bb.0: # %loadbb 524; X86-NEXT: pushl %esi 525; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx 526; X86-NEXT: movl {{[0-9]+}}(%esp), %eax 527; X86-NEXT: movl (%eax), %edx 528; X86-NEXT: movl (%ecx), %esi 529; X86-NEXT: bswapl %edx 530; X86-NEXT: bswapl %esi 531; X86-NEXT: cmpl %esi, %edx 532; X86-NEXT: jne .LBB18_1 533; X86-NEXT: # %bb.2: # %loadbb1 534; X86-NEXT: movzbl 4(%eax), %eax 535; X86-NEXT: movzbl 4(%ecx), %ecx 536; X86-NEXT: subl %ecx, %eax 537; X86-NEXT: jmp .LBB18_3 538; X86-NEXT: .LBB18_1: # %res_block 539; X86-NEXT: setae %al 540; X86-NEXT: movzbl %al, %eax 541; X86-NEXT: leal -1(%eax,%eax), %eax 542; X86-NEXT: .LBB18_3: # %endblock 543; X86-NEXT: shrl $31, %eax 544; X86-NEXT: # kill: def $al killed $al killed $eax 545; X86-NEXT: popl %esi 546; X86-NEXT: retl 547; 548; X64-LABEL: length5_lt: 549; X64: # %bb.0: # %loadbb 550; X64-NEXT: movl (%rdi), %eax 551; X64-NEXT: movl (%rsi), %ecx 552; X64-NEXT: bswapl %eax 553; X64-NEXT: bswapl %ecx 554; X64-NEXT: cmpl %ecx, %eax 555; X64-NEXT: jne .LBB18_1 556; X64-NEXT: # %bb.2: # %loadbb1 557; X64-NEXT: movzbl 4(%rdi), %eax 558; X64-NEXT: movzbl 4(%rsi), %ecx 559; X64-NEXT: subl %ecx, %eax 560; X64-NEXT: shrl $31, %eax 561; X64-NEXT: # kill: def $al killed $al killed $eax 562; X64-NEXT: retq 563; X64-NEXT: .LBB18_1: # %res_block 564; X64-NEXT: setae %al 565; X64-NEXT: movzbl %al, %eax 566; X64-NEXT: leal -1(%rax,%rax), %eax 567; X64-NEXT: shrl $31, %eax 568; X64-NEXT: # kill: def $al killed $al killed $eax 569; X64-NEXT: retq 570 %m = tail call i32 @memcmp(i8* %X, i8* %Y, i64 5) nounwind 571 %c = icmp slt i32 %m, 0 572 ret i1 %c 573} 574 575define i1 @length7_eq(i8* %X, i8* %Y) nounwind { 576; X86-LABEL: length7_eq: 577; X86: # %bb.0: 578; X86-NEXT: movl {{[0-9]+}}(%esp), %eax 579; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx 580; X86-NEXT: movl (%ecx), %edx 581; X86-NEXT: movl 3(%ecx), %ecx 582; X86-NEXT: xorl (%eax), %edx 583; X86-NEXT: xorl 3(%eax), %ecx 584; X86-NEXT: orl %edx, %ecx 585; X86-NEXT: setne %al 586; X86-NEXT: retl 587; 588; X64-LABEL: length7_eq: 589; X64: # %bb.0: 590; X64-NEXT: movl (%rdi), %eax 591; X64-NEXT: movl 3(%rdi), %ecx 592; X64-NEXT: xorl (%rsi), %eax 593; X64-NEXT: xorl 3(%rsi), %ecx 594; X64-NEXT: orl %eax, %ecx 595; X64-NEXT: setne %al 596; X64-NEXT: retq 597 %m = tail call i32 @memcmp(i8* %X, i8* %Y, i64 7) nounwind 598 %c = icmp ne i32 %m, 0 599 ret i1 %c 600} 601 602define i32 @length8(i8* %X, i8* %Y) nounwind { 603; X86-LABEL: length8: 604; X86: # %bb.0: 605; X86-NEXT: pushl %esi 606; X86-NEXT: movl {{[0-9]+}}(%esp), %eax 607; X86-NEXT: movl {{[0-9]+}}(%esp), %esi 608; X86-NEXT: movl (%esi), %ecx 609; X86-NEXT: movl (%eax), %edx 610; X86-NEXT: bswapl %ecx 611; X86-NEXT: bswapl %edx 612; X86-NEXT: cmpl %edx, %ecx 613; X86-NEXT: jne .LBB20_2 614; X86-NEXT: # %bb.1: # %loadbb1 615; X86-NEXT: movl 4(%esi), %ecx 616; X86-NEXT: movl 4(%eax), %edx 617; X86-NEXT: bswapl %ecx 618; X86-NEXT: bswapl %edx 619; X86-NEXT: xorl %eax, %eax 620; X86-NEXT: cmpl %edx, %ecx 621; X86-NEXT: je .LBB20_3 622; X86-NEXT: .LBB20_2: # %res_block 623; X86-NEXT: xorl %eax, %eax 624; X86-NEXT: cmpl %edx, %ecx 625; X86-NEXT: setae %al 626; X86-NEXT: leal -1(%eax,%eax), %eax 627; X86-NEXT: .LBB20_3: # %endblock 628; X86-NEXT: popl %esi 629; X86-NEXT: retl 630; 631; X64-LABEL: length8: 632; X64: # %bb.0: 633; X64-NEXT: movq (%rdi), %rcx 634; X64-NEXT: movq (%rsi), %rdx 635; X64-NEXT: bswapq %rcx 636; X64-NEXT: bswapq %rdx 637; X64-NEXT: xorl %eax, %eax 638; X64-NEXT: cmpq %rdx, %rcx 639; X64-NEXT: seta %al 640; X64-NEXT: sbbl $0, %eax 641; X64-NEXT: retq 642 %m = tail call i32 @memcmp(i8* %X, i8* %Y, i64 8) nounwind 643 ret i32 %m 644} 645 646define i1 @length8_eq(i8* %X, i8* %Y) nounwind { 647; X86-LABEL: length8_eq: 648; X86: # %bb.0: 649; X86-NEXT: movl {{[0-9]+}}(%esp), %eax 650; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx 651; X86-NEXT: movl (%ecx), %edx 652; X86-NEXT: movl 4(%ecx), %ecx 653; X86-NEXT: xorl (%eax), %edx 654; X86-NEXT: xorl 4(%eax), %ecx 655; X86-NEXT: orl %edx, %ecx 656; X86-NEXT: sete %al 657; X86-NEXT: retl 658; 659; X64-LABEL: length8_eq: 660; X64: # %bb.0: 661; X64-NEXT: movq (%rdi), %rax 662; X64-NEXT: cmpq (%rsi), %rax 663; X64-NEXT: sete %al 664; X64-NEXT: retq 665 %m = tail call i32 @memcmp(i8* %X, i8* %Y, i64 8) nounwind 666 %c = icmp eq i32 %m, 0 667 ret i1 %c 668} 669 670define i1 @length8_eq_const(i8* %X) nounwind { 671; X86-LABEL: length8_eq_const: 672; X86: # %bb.0: 673; X86-NEXT: movl {{[0-9]+}}(%esp), %eax 674; X86-NEXT: movl $858927408, %ecx # imm = 0x33323130 675; X86-NEXT: xorl (%eax), %ecx 676; X86-NEXT: movl $926299444, %edx # imm = 0x37363534 677; X86-NEXT: xorl 4(%eax), %edx 678; X86-NEXT: orl %ecx, %edx 679; X86-NEXT: setne %al 680; X86-NEXT: retl 681; 682; X64-LABEL: length8_eq_const: 683; X64: # %bb.0: 684; X64-NEXT: movabsq $3978425819141910832, %rax # imm = 0x3736353433323130 685; X64-NEXT: cmpq %rax, (%rdi) 686; X64-NEXT: setne %al 687; X64-NEXT: retq 688 %m = tail call i32 @memcmp(i8* %X, i8* getelementptr inbounds ([513 x i8], [513 x i8]* @.str, i32 0, i32 0), i64 8) nounwind 689 %c = icmp ne i32 %m, 0 690 ret i1 %c 691} 692 693define i1 @length9_eq(i8* %X, i8* %Y) nounwind { 694; X86-LABEL: length9_eq: 695; X86: # %bb.0: 696; X86-NEXT: pushl $0 697; X86-NEXT: pushl $9 698; X86-NEXT: pushl {{[0-9]+}}(%esp) 699; X86-NEXT: pushl {{[0-9]+}}(%esp) 700; X86-NEXT: calll memcmp 701; X86-NEXT: addl $16, %esp 702; X86-NEXT: testl %eax, %eax 703; X86-NEXT: sete %al 704; X86-NEXT: retl 705; 706; X64-LABEL: length9_eq: 707; X64: # %bb.0: 708; X64-NEXT: movq (%rdi), %rax 709; X64-NEXT: xorq (%rsi), %rax 710; X64-NEXT: movb 8(%rdi), %cl 711; X64-NEXT: xorb 8(%rsi), %cl 712; X64-NEXT: movzbl %cl, %ecx 713; X64-NEXT: orq %rax, %rcx 714; X64-NEXT: sete %al 715; X64-NEXT: retq 716 %m = tail call i32 @memcmp(i8* %X, i8* %Y, i64 9) nounwind 717 %c = icmp eq i32 %m, 0 718 ret i1 %c 719} 720 721define i1 @length10_eq(i8* %X, i8* %Y) nounwind { 722; X86-LABEL: length10_eq: 723; X86: # %bb.0: 724; X86-NEXT: pushl $0 725; X86-NEXT: pushl $10 726; X86-NEXT: pushl {{[0-9]+}}(%esp) 727; X86-NEXT: pushl {{[0-9]+}}(%esp) 728; X86-NEXT: calll memcmp 729; X86-NEXT: addl $16, %esp 730; X86-NEXT: testl %eax, %eax 731; X86-NEXT: sete %al 732; X86-NEXT: retl 733; 734; X64-LABEL: length10_eq: 735; X64: # %bb.0: 736; X64-NEXT: movq (%rdi), %rax 737; X64-NEXT: xorq (%rsi), %rax 738; X64-NEXT: movzwl 8(%rdi), %ecx 739; X64-NEXT: xorw 8(%rsi), %cx 740; X64-NEXT: movzwl %cx, %ecx 741; X64-NEXT: orq %rax, %rcx 742; X64-NEXT: sete %al 743; X64-NEXT: retq 744 %m = tail call i32 @memcmp(i8* %X, i8* %Y, i64 10) nounwind 745 %c = icmp eq i32 %m, 0 746 ret i1 %c 747} 748 749define i1 @length11_eq(i8* %X, i8* %Y) nounwind { 750; X86-LABEL: length11_eq: 751; X86: # %bb.0: 752; X86-NEXT: pushl $0 753; X86-NEXT: pushl $11 754; X86-NEXT: pushl {{[0-9]+}}(%esp) 755; X86-NEXT: pushl {{[0-9]+}}(%esp) 756; X86-NEXT: calll memcmp 757; X86-NEXT: addl $16, %esp 758; X86-NEXT: testl %eax, %eax 759; X86-NEXT: sete %al 760; X86-NEXT: retl 761; 762; X64-LABEL: length11_eq: 763; X64: # %bb.0: 764; X64-NEXT: movq (%rdi), %rax 765; X64-NEXT: movq 3(%rdi), %rcx 766; X64-NEXT: xorq (%rsi), %rax 767; X64-NEXT: xorq 3(%rsi), %rcx 768; X64-NEXT: orq %rax, %rcx 769; X64-NEXT: sete %al 770; X64-NEXT: retq 771 %m = tail call i32 @memcmp(i8* %X, i8* %Y, i64 11) nounwind 772 %c = icmp eq i32 %m, 0 773 ret i1 %c 774} 775 776define i1 @length12_eq(i8* %X, i8* %Y) nounwind { 777; X86-LABEL: length12_eq: 778; X86: # %bb.0: 779; X86-NEXT: pushl $0 780; X86-NEXT: pushl $12 781; X86-NEXT: pushl {{[0-9]+}}(%esp) 782; X86-NEXT: pushl {{[0-9]+}}(%esp) 783; X86-NEXT: calll memcmp 784; X86-NEXT: addl $16, %esp 785; X86-NEXT: testl %eax, %eax 786; X86-NEXT: setne %al 787; X86-NEXT: retl 788; 789; X64-LABEL: length12_eq: 790; X64: # %bb.0: 791; X64-NEXT: movq (%rdi), %rax 792; X64-NEXT: xorq (%rsi), %rax 793; X64-NEXT: movl 8(%rdi), %ecx 794; X64-NEXT: xorl 8(%rsi), %ecx 795; X64-NEXT: orq %rax, %rcx 796; X64-NEXT: setne %al 797; X64-NEXT: retq 798 %m = tail call i32 @memcmp(i8* %X, i8* %Y, i64 12) nounwind 799 %c = icmp ne i32 %m, 0 800 ret i1 %c 801} 802 803define i32 @length12(i8* %X, i8* %Y) nounwind { 804; X86-LABEL: length12: 805; X86: # %bb.0: 806; X86-NEXT: pushl $0 807; X86-NEXT: pushl $12 808; X86-NEXT: pushl {{[0-9]+}}(%esp) 809; X86-NEXT: pushl {{[0-9]+}}(%esp) 810; X86-NEXT: calll memcmp 811; X86-NEXT: addl $16, %esp 812; X86-NEXT: retl 813; 814; X64-LABEL: length12: 815; X64: # %bb.0: 816; X64-NEXT: movq (%rdi), %rcx 817; X64-NEXT: movq (%rsi), %rdx 818; X64-NEXT: bswapq %rcx 819; X64-NEXT: bswapq %rdx 820; X64-NEXT: cmpq %rdx, %rcx 821; X64-NEXT: jne .LBB27_2 822; X64-NEXT: # %bb.1: # %loadbb1 823; X64-NEXT: movl 8(%rdi), %ecx 824; X64-NEXT: movl 8(%rsi), %edx 825; X64-NEXT: bswapl %ecx 826; X64-NEXT: bswapl %edx 827; X64-NEXT: xorl %eax, %eax 828; X64-NEXT: cmpq %rdx, %rcx 829; X64-NEXT: je .LBB27_3 830; X64-NEXT: .LBB27_2: # %res_block 831; X64-NEXT: xorl %eax, %eax 832; X64-NEXT: cmpq %rdx, %rcx 833; X64-NEXT: setae %al 834; X64-NEXT: leal -1(%rax,%rax), %eax 835; X64-NEXT: .LBB27_3: # %endblock 836; X64-NEXT: retq 837 %m = tail call i32 @memcmp(i8* %X, i8* %Y, i64 12) nounwind 838 ret i32 %m 839} 840 841define i1 @length13_eq(i8* %X, i8* %Y) nounwind { 842; X86-LABEL: length13_eq: 843; X86: # %bb.0: 844; X86-NEXT: pushl $0 845; X86-NEXT: pushl $13 846; X86-NEXT: pushl {{[0-9]+}}(%esp) 847; X86-NEXT: pushl {{[0-9]+}}(%esp) 848; X86-NEXT: calll memcmp 849; X86-NEXT: addl $16, %esp 850; X86-NEXT: testl %eax, %eax 851; X86-NEXT: sete %al 852; X86-NEXT: retl 853; 854; X64-LABEL: length13_eq: 855; X64: # %bb.0: 856; X64-NEXT: movq (%rdi), %rax 857; X64-NEXT: movq 5(%rdi), %rcx 858; X64-NEXT: xorq (%rsi), %rax 859; X64-NEXT: xorq 5(%rsi), %rcx 860; X64-NEXT: orq %rax, %rcx 861; X64-NEXT: sete %al 862; X64-NEXT: retq 863 %m = tail call i32 @memcmp(i8* %X, i8* %Y, i64 13) nounwind 864 %c = icmp eq i32 %m, 0 865 ret i1 %c 866} 867 868define i1 @length14_eq(i8* %X, i8* %Y) nounwind { 869; X86-LABEL: length14_eq: 870; X86: # %bb.0: 871; X86-NEXT: pushl $0 872; X86-NEXT: pushl $14 873; X86-NEXT: pushl {{[0-9]+}}(%esp) 874; X86-NEXT: pushl {{[0-9]+}}(%esp) 875; X86-NEXT: calll memcmp 876; X86-NEXT: addl $16, %esp 877; X86-NEXT: testl %eax, %eax 878; X86-NEXT: sete %al 879; X86-NEXT: retl 880; 881; X64-LABEL: length14_eq: 882; X64: # %bb.0: 883; X64-NEXT: movq (%rdi), %rax 884; X64-NEXT: movq 6(%rdi), %rcx 885; X64-NEXT: xorq (%rsi), %rax 886; X64-NEXT: xorq 6(%rsi), %rcx 887; X64-NEXT: orq %rax, %rcx 888; X64-NEXT: sete %al 889; X64-NEXT: retq 890 %m = tail call i32 @memcmp(i8* %X, i8* %Y, i64 14) nounwind 891 %c = icmp eq i32 %m, 0 892 ret i1 %c 893} 894 895define i1 @length15_eq(i8* %X, i8* %Y) nounwind { 896; X86-LABEL: length15_eq: 897; X86: # %bb.0: 898; X86-NEXT: pushl $0 899; X86-NEXT: pushl $15 900; X86-NEXT: pushl {{[0-9]+}}(%esp) 901; X86-NEXT: pushl {{[0-9]+}}(%esp) 902; X86-NEXT: calll memcmp 903; X86-NEXT: addl $16, %esp 904; X86-NEXT: testl %eax, %eax 905; X86-NEXT: sete %al 906; X86-NEXT: retl 907; 908; X64-LABEL: length15_eq: 909; X64: # %bb.0: 910; X64-NEXT: movq (%rdi), %rax 911; X64-NEXT: movq 7(%rdi), %rcx 912; X64-NEXT: xorq (%rsi), %rax 913; X64-NEXT: xorq 7(%rsi), %rcx 914; X64-NEXT: orq %rax, %rcx 915; X64-NEXT: sete %al 916; X64-NEXT: retq 917 %m = tail call i32 @memcmp(i8* %X, i8* %Y, i64 15) nounwind 918 %c = icmp eq i32 %m, 0 919 ret i1 %c 920} 921 922; PR33329 - https://bugs.llvm.org/show_bug.cgi?id=33329 923 924define i32 @length16(i8* %X, i8* %Y) nounwind { 925; X86-LABEL: length16: 926; X86: # %bb.0: 927; X86-NEXT: pushl $0 928; X86-NEXT: pushl $16 929; X86-NEXT: pushl {{[0-9]+}}(%esp) 930; X86-NEXT: pushl {{[0-9]+}}(%esp) 931; X86-NEXT: calll memcmp 932; X86-NEXT: addl $16, %esp 933; X86-NEXT: retl 934; 935; X64-LABEL: length16: 936; X64: # %bb.0: 937; X64-NEXT: movq (%rdi), %rcx 938; X64-NEXT: movq (%rsi), %rdx 939; X64-NEXT: bswapq %rcx 940; X64-NEXT: bswapq %rdx 941; X64-NEXT: cmpq %rdx, %rcx 942; X64-NEXT: jne .LBB31_2 943; X64-NEXT: # %bb.1: # %loadbb1 944; X64-NEXT: movq 8(%rdi), %rcx 945; X64-NEXT: movq 8(%rsi), %rdx 946; X64-NEXT: bswapq %rcx 947; X64-NEXT: bswapq %rdx 948; X64-NEXT: xorl %eax, %eax 949; X64-NEXT: cmpq %rdx, %rcx 950; X64-NEXT: je .LBB31_3 951; X64-NEXT: .LBB31_2: # %res_block 952; X64-NEXT: xorl %eax, %eax 953; X64-NEXT: cmpq %rdx, %rcx 954; X64-NEXT: setae %al 955; X64-NEXT: leal -1(%rax,%rax), %eax 956; X64-NEXT: .LBB31_3: # %endblock 957; X64-NEXT: retq 958 %m = tail call i32 @memcmp(i8* %X, i8* %Y, i64 16) nounwind 959 ret i32 %m 960} 961 962define i1 @length16_eq(i8* %x, i8* %y) nounwind { 963; X86-NOSSE-LABEL: length16_eq: 964; X86-NOSSE: # %bb.0: 965; X86-NOSSE-NEXT: pushl $0 966; X86-NOSSE-NEXT: pushl $16 967; X86-NOSSE-NEXT: pushl {{[0-9]+}}(%esp) 968; X86-NOSSE-NEXT: pushl {{[0-9]+}}(%esp) 969; X86-NOSSE-NEXT: calll memcmp 970; X86-NOSSE-NEXT: addl $16, %esp 971; X86-NOSSE-NEXT: testl %eax, %eax 972; X86-NOSSE-NEXT: setne %al 973; X86-NOSSE-NEXT: retl 974; 975; X86-SSE1-LABEL: length16_eq: 976; X86-SSE1: # %bb.0: 977; X86-SSE1-NEXT: pushl $0 978; X86-SSE1-NEXT: pushl $16 979; X86-SSE1-NEXT: pushl {{[0-9]+}}(%esp) 980; X86-SSE1-NEXT: pushl {{[0-9]+}}(%esp) 981; X86-SSE1-NEXT: calll memcmp 982; X86-SSE1-NEXT: addl $16, %esp 983; X86-SSE1-NEXT: testl %eax, %eax 984; X86-SSE1-NEXT: setne %al 985; X86-SSE1-NEXT: retl 986; 987; X86-SSE2-LABEL: length16_eq: 988; X86-SSE2: # %bb.0: 989; X86-SSE2-NEXT: movl {{[0-9]+}}(%esp), %eax 990; X86-SSE2-NEXT: movl {{[0-9]+}}(%esp), %ecx 991; X86-SSE2-NEXT: movdqu (%ecx), %xmm0 992; X86-SSE2-NEXT: movdqu (%eax), %xmm1 993; X86-SSE2-NEXT: pcmpeqb %xmm0, %xmm1 994; X86-SSE2-NEXT: pmovmskb %xmm1, %eax 995; X86-SSE2-NEXT: cmpl $65535, %eax # imm = 0xFFFF 996; X86-SSE2-NEXT: setne %al 997; X86-SSE2-NEXT: retl 998; 999; X86-SSE41-LABEL: length16_eq: 1000; X86-SSE41: # %bb.0: 1001; X86-SSE41-NEXT: movl {{[0-9]+}}(%esp), %eax 1002; X86-SSE41-NEXT: movl {{[0-9]+}}(%esp), %ecx 1003; X86-SSE41-NEXT: movdqu (%ecx), %xmm0 1004; X86-SSE41-NEXT: movdqu (%eax), %xmm1 1005; X86-SSE41-NEXT: pxor %xmm0, %xmm1 1006; X86-SSE41-NEXT: ptest %xmm1, %xmm1 1007; X86-SSE41-NEXT: setne %al 1008; X86-SSE41-NEXT: retl 1009; 1010; X64-SSE2-LABEL: length16_eq: 1011; X64-SSE2: # %bb.0: 1012; X64-SSE2-NEXT: movdqu (%rdi), %xmm0 1013; X64-SSE2-NEXT: movdqu (%rsi), %xmm1 1014; X64-SSE2-NEXT: pcmpeqb %xmm0, %xmm1 1015; X64-SSE2-NEXT: pmovmskb %xmm1, %eax 1016; X64-SSE2-NEXT: cmpl $65535, %eax # imm = 0xFFFF 1017; X64-SSE2-NEXT: setne %al 1018; X64-SSE2-NEXT: retq 1019; 1020; X64-SSE41-LABEL: length16_eq: 1021; X64-SSE41: # %bb.0: 1022; X64-SSE41-NEXT: movdqu (%rdi), %xmm0 1023; X64-SSE41-NEXT: movdqu (%rsi), %xmm1 1024; X64-SSE41-NEXT: pxor %xmm0, %xmm1 1025; X64-SSE41-NEXT: ptest %xmm1, %xmm1 1026; X64-SSE41-NEXT: setne %al 1027; X64-SSE41-NEXT: retq 1028; 1029; X64-AVX-LABEL: length16_eq: 1030; X64-AVX: # %bb.0: 1031; X64-AVX-NEXT: vmovdqu (%rdi), %xmm0 1032; X64-AVX-NEXT: vpxor (%rsi), %xmm0, %xmm0 1033; X64-AVX-NEXT: vptest %xmm0, %xmm0 1034; X64-AVX-NEXT: setne %al 1035; X64-AVX-NEXT: retq 1036; 1037; X64-MIC-AVX-LABEL: length16_eq: 1038; X64-MIC-AVX: # %bb.0: 1039; X64-MIC-AVX-NEXT: vmovdqu (%rdi), %xmm0 1040; X64-MIC-AVX-NEXT: vmovdqu (%rsi), %xmm1 1041; X64-MIC-AVX-NEXT: vpcmpneqd %zmm1, %zmm0, %k0 1042; X64-MIC-AVX-NEXT: kortestw %k0, %k0 1043; X64-MIC-AVX-NEXT: setne %al 1044; X64-MIC-AVX-NEXT: vzeroupper 1045; X64-MIC-AVX-NEXT: retq 1046 %call = tail call i32 @memcmp(i8* %x, i8* %y, i64 16) nounwind 1047 %cmp = icmp ne i32 %call, 0 1048 ret i1 %cmp 1049} 1050 1051define i1 @length16_lt(i8* %x, i8* %y) nounwind { 1052; X86-LABEL: length16_lt: 1053; X86: # %bb.0: 1054; X86-NEXT: pushl $0 1055; X86-NEXT: pushl $16 1056; X86-NEXT: pushl {{[0-9]+}}(%esp) 1057; X86-NEXT: pushl {{[0-9]+}}(%esp) 1058; X86-NEXT: calll memcmp 1059; X86-NEXT: addl $16, %esp 1060; X86-NEXT: shrl $31, %eax 1061; X86-NEXT: # kill: def $al killed $al killed $eax 1062; X86-NEXT: retl 1063; 1064; X64-LABEL: length16_lt: 1065; X64: # %bb.0: 1066; X64-NEXT: movq (%rdi), %rcx 1067; X64-NEXT: movq (%rsi), %rdx 1068; X64-NEXT: bswapq %rcx 1069; X64-NEXT: bswapq %rdx 1070; X64-NEXT: cmpq %rdx, %rcx 1071; X64-NEXT: jne .LBB33_2 1072; X64-NEXT: # %bb.1: # %loadbb1 1073; X64-NEXT: movq 8(%rdi), %rcx 1074; X64-NEXT: movq 8(%rsi), %rdx 1075; X64-NEXT: bswapq %rcx 1076; X64-NEXT: bswapq %rdx 1077; X64-NEXT: xorl %eax, %eax 1078; X64-NEXT: cmpq %rdx, %rcx 1079; X64-NEXT: je .LBB33_3 1080; X64-NEXT: .LBB33_2: # %res_block 1081; X64-NEXT: xorl %eax, %eax 1082; X64-NEXT: cmpq %rdx, %rcx 1083; X64-NEXT: setae %al 1084; X64-NEXT: leal -1(%rax,%rax), %eax 1085; X64-NEXT: .LBB33_3: # %endblock 1086; X64-NEXT: shrl $31, %eax 1087; X64-NEXT: # kill: def $al killed $al killed $eax 1088; X64-NEXT: retq 1089 %call = tail call i32 @memcmp(i8* %x, i8* %y, i64 16) nounwind 1090 %cmp = icmp slt i32 %call, 0 1091 ret i1 %cmp 1092} 1093 1094define i1 @length16_gt(i8* %x, i8* %y) nounwind { 1095; X86-LABEL: length16_gt: 1096; X86: # %bb.0: 1097; X86-NEXT: pushl $0 1098; X86-NEXT: pushl $16 1099; X86-NEXT: pushl {{[0-9]+}}(%esp) 1100; X86-NEXT: pushl {{[0-9]+}}(%esp) 1101; X86-NEXT: calll memcmp 1102; X86-NEXT: addl $16, %esp 1103; X86-NEXT: testl %eax, %eax 1104; X86-NEXT: setg %al 1105; X86-NEXT: retl 1106; 1107; X64-LABEL: length16_gt: 1108; X64: # %bb.0: 1109; X64-NEXT: movq (%rdi), %rax 1110; X64-NEXT: movq (%rsi), %rcx 1111; X64-NEXT: bswapq %rax 1112; X64-NEXT: bswapq %rcx 1113; X64-NEXT: cmpq %rcx, %rax 1114; X64-NEXT: jne .LBB34_2 1115; X64-NEXT: # %bb.1: # %loadbb1 1116; X64-NEXT: movq 8(%rdi), %rax 1117; X64-NEXT: movq 8(%rsi), %rcx 1118; X64-NEXT: bswapq %rax 1119; X64-NEXT: bswapq %rcx 1120; X64-NEXT: xorl %edx, %edx 1121; X64-NEXT: cmpq %rcx, %rax 1122; X64-NEXT: je .LBB34_3 1123; X64-NEXT: .LBB34_2: # %res_block 1124; X64-NEXT: xorl %edx, %edx 1125; X64-NEXT: cmpq %rcx, %rax 1126; X64-NEXT: setae %dl 1127; X64-NEXT: leal -1(%rdx,%rdx), %edx 1128; X64-NEXT: .LBB34_3: # %endblock 1129; X64-NEXT: testl %edx, %edx 1130; X64-NEXT: setg %al 1131; X64-NEXT: retq 1132 %call = tail call i32 @memcmp(i8* %x, i8* %y, i64 16) nounwind 1133 %cmp = icmp sgt i32 %call, 0 1134 ret i1 %cmp 1135} 1136 1137define i1 @length16_eq_const(i8* %X) nounwind { 1138; X86-NOSSE-LABEL: length16_eq_const: 1139; X86-NOSSE: # %bb.0: 1140; X86-NOSSE-NEXT: pushl $0 1141; X86-NOSSE-NEXT: pushl $16 1142; X86-NOSSE-NEXT: pushl $.L.str 1143; X86-NOSSE-NEXT: pushl {{[0-9]+}}(%esp) 1144; X86-NOSSE-NEXT: calll memcmp 1145; X86-NOSSE-NEXT: addl $16, %esp 1146; X86-NOSSE-NEXT: testl %eax, %eax 1147; X86-NOSSE-NEXT: sete %al 1148; X86-NOSSE-NEXT: retl 1149; 1150; X86-SSE1-LABEL: length16_eq_const: 1151; X86-SSE1: # %bb.0: 1152; X86-SSE1-NEXT: pushl $0 1153; X86-SSE1-NEXT: pushl $16 1154; X86-SSE1-NEXT: pushl $.L.str 1155; X86-SSE1-NEXT: pushl {{[0-9]+}}(%esp) 1156; X86-SSE1-NEXT: calll memcmp 1157; X86-SSE1-NEXT: addl $16, %esp 1158; X86-SSE1-NEXT: testl %eax, %eax 1159; X86-SSE1-NEXT: sete %al 1160; X86-SSE1-NEXT: retl 1161; 1162; X86-SSE2-LABEL: length16_eq_const: 1163; X86-SSE2: # %bb.0: 1164; X86-SSE2-NEXT: movl {{[0-9]+}}(%esp), %eax 1165; X86-SSE2-NEXT: movdqu (%eax), %xmm0 1166; X86-SSE2-NEXT: pcmpeqb {{\.LCPI.*}}, %xmm0 1167; X86-SSE2-NEXT: pmovmskb %xmm0, %eax 1168; X86-SSE2-NEXT: cmpl $65535, %eax # imm = 0xFFFF 1169; X86-SSE2-NEXT: sete %al 1170; X86-SSE2-NEXT: retl 1171; 1172; X86-SSE41-LABEL: length16_eq_const: 1173; X86-SSE41: # %bb.0: 1174; X86-SSE41-NEXT: movl {{[0-9]+}}(%esp), %eax 1175; X86-SSE41-NEXT: movdqu (%eax), %xmm0 1176; X86-SSE41-NEXT: pxor {{\.LCPI.*}}, %xmm0 1177; X86-SSE41-NEXT: ptest %xmm0, %xmm0 1178; X86-SSE41-NEXT: sete %al 1179; X86-SSE41-NEXT: retl 1180; 1181; X64-SSE2-LABEL: length16_eq_const: 1182; X64-SSE2: # %bb.0: 1183; X64-SSE2-NEXT: movdqu (%rdi), %xmm0 1184; X64-SSE2-NEXT: pcmpeqb {{.*}}(%rip), %xmm0 1185; X64-SSE2-NEXT: pmovmskb %xmm0, %eax 1186; X64-SSE2-NEXT: cmpl $65535, %eax # imm = 0xFFFF 1187; X64-SSE2-NEXT: sete %al 1188; X64-SSE2-NEXT: retq 1189; 1190; X64-SSE41-LABEL: length16_eq_const: 1191; X64-SSE41: # %bb.0: 1192; X64-SSE41-NEXT: movdqu (%rdi), %xmm0 1193; X64-SSE41-NEXT: pxor {{.*}}(%rip), %xmm0 1194; X64-SSE41-NEXT: ptest %xmm0, %xmm0 1195; X64-SSE41-NEXT: sete %al 1196; X64-SSE41-NEXT: retq 1197; 1198; X64-AVX-LABEL: length16_eq_const: 1199; X64-AVX: # %bb.0: 1200; X64-AVX-NEXT: vmovdqu (%rdi), %xmm0 1201; X64-AVX-NEXT: vpxor {{.*}}(%rip), %xmm0, %xmm0 1202; X64-AVX-NEXT: vptest %xmm0, %xmm0 1203; X64-AVX-NEXT: sete %al 1204; X64-AVX-NEXT: retq 1205; 1206; X64-MIC-AVX-LABEL: length16_eq_const: 1207; X64-MIC-AVX: # %bb.0: 1208; X64-MIC-AVX-NEXT: vmovdqu (%rdi), %xmm0 1209; X64-MIC-AVX-NEXT: vmovdqa {{.*#+}} xmm1 = [858927408,926299444,825243960,892613426] 1210; X64-MIC-AVX-NEXT: vpcmpneqd %zmm1, %zmm0, %k0 1211; X64-MIC-AVX-NEXT: kortestw %k0, %k0 1212; X64-MIC-AVX-NEXT: sete %al 1213; X64-MIC-AVX-NEXT: vzeroupper 1214; X64-MIC-AVX-NEXT: retq 1215 %m = tail call i32 @memcmp(i8* %X, i8* getelementptr inbounds ([513 x i8], [513 x i8]* @.str, i32 0, i32 0), i64 16) nounwind 1216 %c = icmp eq i32 %m, 0 1217 ret i1 %c 1218} 1219 1220; PR33914 - https://bugs.llvm.org/show_bug.cgi?id=33914 1221 1222define i32 @length24(i8* %X, i8* %Y) nounwind { 1223; X86-LABEL: length24: 1224; X86: # %bb.0: 1225; X86-NEXT: pushl $0 1226; X86-NEXT: pushl $24 1227; X86-NEXT: pushl {{[0-9]+}}(%esp) 1228; X86-NEXT: pushl {{[0-9]+}}(%esp) 1229; X86-NEXT: calll memcmp 1230; X86-NEXT: addl $16, %esp 1231; X86-NEXT: retl 1232; 1233; X64-LABEL: length24: 1234; X64: # %bb.0: 1235; X64-NEXT: movl $24, %edx 1236; X64-NEXT: jmp memcmp # TAILCALL 1237 %m = tail call i32 @memcmp(i8* %X, i8* %Y, i64 24) nounwind 1238 ret i32 %m 1239} 1240 1241define i1 @length24_eq(i8* %x, i8* %y) nounwind { 1242; X86-NOSSE-LABEL: length24_eq: 1243; X86-NOSSE: # %bb.0: 1244; X86-NOSSE-NEXT: pushl $0 1245; X86-NOSSE-NEXT: pushl $24 1246; X86-NOSSE-NEXT: pushl {{[0-9]+}}(%esp) 1247; X86-NOSSE-NEXT: pushl {{[0-9]+}}(%esp) 1248; X86-NOSSE-NEXT: calll memcmp 1249; X86-NOSSE-NEXT: addl $16, %esp 1250; X86-NOSSE-NEXT: testl %eax, %eax 1251; X86-NOSSE-NEXT: sete %al 1252; X86-NOSSE-NEXT: retl 1253; 1254; X86-SSE1-LABEL: length24_eq: 1255; X86-SSE1: # %bb.0: 1256; X86-SSE1-NEXT: pushl $0 1257; X86-SSE1-NEXT: pushl $24 1258; X86-SSE1-NEXT: pushl {{[0-9]+}}(%esp) 1259; X86-SSE1-NEXT: pushl {{[0-9]+}}(%esp) 1260; X86-SSE1-NEXT: calll memcmp 1261; X86-SSE1-NEXT: addl $16, %esp 1262; X86-SSE1-NEXT: testl %eax, %eax 1263; X86-SSE1-NEXT: sete %al 1264; X86-SSE1-NEXT: retl 1265; 1266; X86-SSE2-LABEL: length24_eq: 1267; X86-SSE2: # %bb.0: 1268; X86-SSE2-NEXT: movl {{[0-9]+}}(%esp), %eax 1269; X86-SSE2-NEXT: movl {{[0-9]+}}(%esp), %ecx 1270; X86-SSE2-NEXT: movdqu (%ecx), %xmm0 1271; X86-SSE2-NEXT: movdqu 8(%ecx), %xmm1 1272; X86-SSE2-NEXT: movdqu (%eax), %xmm2 1273; X86-SSE2-NEXT: pcmpeqb %xmm0, %xmm2 1274; X86-SSE2-NEXT: movdqu 8(%eax), %xmm0 1275; X86-SSE2-NEXT: pcmpeqb %xmm1, %xmm0 1276; X86-SSE2-NEXT: pand %xmm2, %xmm0 1277; X86-SSE2-NEXT: pmovmskb %xmm0, %eax 1278; X86-SSE2-NEXT: cmpl $65535, %eax # imm = 0xFFFF 1279; X86-SSE2-NEXT: sete %al 1280; X86-SSE2-NEXT: retl 1281; 1282; X86-SSE41-LABEL: length24_eq: 1283; X86-SSE41: # %bb.0: 1284; X86-SSE41-NEXT: movl {{[0-9]+}}(%esp), %eax 1285; X86-SSE41-NEXT: movl {{[0-9]+}}(%esp), %ecx 1286; X86-SSE41-NEXT: movdqu (%ecx), %xmm0 1287; X86-SSE41-NEXT: movdqu 8(%ecx), %xmm1 1288; X86-SSE41-NEXT: movdqu (%eax), %xmm2 1289; X86-SSE41-NEXT: pxor %xmm0, %xmm2 1290; X86-SSE41-NEXT: movdqu 8(%eax), %xmm0 1291; X86-SSE41-NEXT: pxor %xmm1, %xmm0 1292; X86-SSE41-NEXT: por %xmm2, %xmm0 1293; X86-SSE41-NEXT: ptest %xmm0, %xmm0 1294; X86-SSE41-NEXT: sete %al 1295; X86-SSE41-NEXT: retl 1296; 1297; X64-SSE2-LABEL: length24_eq: 1298; X64-SSE2: # %bb.0: 1299; X64-SSE2-NEXT: movdqu (%rdi), %xmm0 1300; X64-SSE2-NEXT: movdqu (%rsi), %xmm1 1301; X64-SSE2-NEXT: pcmpeqb %xmm0, %xmm1 1302; X64-SSE2-NEXT: movq {{.*#+}} xmm0 = mem[0],zero 1303; X64-SSE2-NEXT: movq {{.*#+}} xmm2 = mem[0],zero 1304; X64-SSE2-NEXT: pcmpeqb %xmm0, %xmm2 1305; X64-SSE2-NEXT: pand %xmm1, %xmm2 1306; X64-SSE2-NEXT: pmovmskb %xmm2, %eax 1307; X64-SSE2-NEXT: cmpl $65535, %eax # imm = 0xFFFF 1308; X64-SSE2-NEXT: sete %al 1309; X64-SSE2-NEXT: retq 1310; 1311; X64-SSE41-LABEL: length24_eq: 1312; X64-SSE41: # %bb.0: 1313; X64-SSE41-NEXT: movdqu (%rdi), %xmm0 1314; X64-SSE41-NEXT: movdqu (%rsi), %xmm1 1315; X64-SSE41-NEXT: pxor %xmm0, %xmm1 1316; X64-SSE41-NEXT: movq {{.*#+}} xmm0 = mem[0],zero 1317; X64-SSE41-NEXT: movq {{.*#+}} xmm2 = mem[0],zero 1318; X64-SSE41-NEXT: pxor %xmm0, %xmm2 1319; X64-SSE41-NEXT: por %xmm1, %xmm2 1320; X64-SSE41-NEXT: ptest %xmm2, %xmm2 1321; X64-SSE41-NEXT: sete %al 1322; X64-SSE41-NEXT: retq 1323; 1324; X64-AVX-LABEL: length24_eq: 1325; X64-AVX: # %bb.0: 1326; X64-AVX-NEXT: vmovdqu (%rdi), %xmm0 1327; X64-AVX-NEXT: vmovq {{.*#+}} xmm1 = mem[0],zero 1328; X64-AVX-NEXT: vmovq {{.*#+}} xmm2 = mem[0],zero 1329; X64-AVX-NEXT: vpxor %xmm2, %xmm1, %xmm1 1330; X64-AVX-NEXT: vpxor (%rsi), %xmm0, %xmm0 1331; X64-AVX-NEXT: vpor %xmm1, %xmm0, %xmm0 1332; X64-AVX-NEXT: vptest %xmm0, %xmm0 1333; X64-AVX-NEXT: sete %al 1334; X64-AVX-NEXT: retq 1335; 1336; X64-MIC-AVX-LABEL: length24_eq: 1337; X64-MIC-AVX: # %bb.0: 1338; X64-MIC-AVX-NEXT: vmovdqu (%rdi), %xmm0 1339; X64-MIC-AVX-NEXT: vmovdqu (%rsi), %xmm1 1340; X64-MIC-AVX-NEXT: vmovq {{.*#+}} xmm2 = mem[0],zero 1341; X64-MIC-AVX-NEXT: vmovq {{.*#+}} xmm3 = mem[0],zero 1342; X64-MIC-AVX-NEXT: vpcmpneqd %zmm3, %zmm2, %k0 1343; X64-MIC-AVX-NEXT: vpcmpneqd %zmm1, %zmm0, %k1 1344; X64-MIC-AVX-NEXT: kortestw %k0, %k1 1345; X64-MIC-AVX-NEXT: sete %al 1346; X64-MIC-AVX-NEXT: vzeroupper 1347; X64-MIC-AVX-NEXT: retq 1348 %call = tail call i32 @memcmp(i8* %x, i8* %y, i64 24) nounwind 1349 %cmp = icmp eq i32 %call, 0 1350 ret i1 %cmp 1351} 1352 1353define i1 @length24_lt(i8* %x, i8* %y) nounwind { 1354; X86-LABEL: length24_lt: 1355; X86: # %bb.0: 1356; X86-NEXT: pushl $0 1357; X86-NEXT: pushl $24 1358; X86-NEXT: pushl {{[0-9]+}}(%esp) 1359; X86-NEXT: pushl {{[0-9]+}}(%esp) 1360; X86-NEXT: calll memcmp 1361; X86-NEXT: addl $16, %esp 1362; X86-NEXT: shrl $31, %eax 1363; X86-NEXT: # kill: def $al killed $al killed $eax 1364; X86-NEXT: retl 1365; 1366; X64-LABEL: length24_lt: 1367; X64: # %bb.0: 1368; X64-NEXT: pushq %rax 1369; X64-NEXT: movl $24, %edx 1370; X64-NEXT: callq memcmp 1371; X64-NEXT: shrl $31, %eax 1372; X64-NEXT: # kill: def $al killed $al killed $eax 1373; X64-NEXT: popq %rcx 1374; X64-NEXT: retq 1375 %call = tail call i32 @memcmp(i8* %x, i8* %y, i64 24) nounwind 1376 %cmp = icmp slt i32 %call, 0 1377 ret i1 %cmp 1378} 1379 1380define i1 @length24_gt(i8* %x, i8* %y) nounwind { 1381; X86-LABEL: length24_gt: 1382; X86: # %bb.0: 1383; X86-NEXT: pushl $0 1384; X86-NEXT: pushl $24 1385; X86-NEXT: pushl {{[0-9]+}}(%esp) 1386; X86-NEXT: pushl {{[0-9]+}}(%esp) 1387; X86-NEXT: calll memcmp 1388; X86-NEXT: addl $16, %esp 1389; X86-NEXT: testl %eax, %eax 1390; X86-NEXT: setg %al 1391; X86-NEXT: retl 1392; 1393; X64-LABEL: length24_gt: 1394; X64: # %bb.0: 1395; X64-NEXT: pushq %rax 1396; X64-NEXT: movl $24, %edx 1397; X64-NEXT: callq memcmp 1398; X64-NEXT: testl %eax, %eax 1399; X64-NEXT: setg %al 1400; X64-NEXT: popq %rcx 1401; X64-NEXT: retq 1402 %call = tail call i32 @memcmp(i8* %x, i8* %y, i64 24) nounwind 1403 %cmp = icmp sgt i32 %call, 0 1404 ret i1 %cmp 1405} 1406 1407define i1 @length24_eq_const(i8* %X) nounwind { 1408; X86-NOSSE-LABEL: length24_eq_const: 1409; X86-NOSSE: # %bb.0: 1410; X86-NOSSE-NEXT: pushl $0 1411; X86-NOSSE-NEXT: pushl $24 1412; X86-NOSSE-NEXT: pushl $.L.str 1413; X86-NOSSE-NEXT: pushl {{[0-9]+}}(%esp) 1414; X86-NOSSE-NEXT: calll memcmp 1415; X86-NOSSE-NEXT: addl $16, %esp 1416; X86-NOSSE-NEXT: testl %eax, %eax 1417; X86-NOSSE-NEXT: setne %al 1418; X86-NOSSE-NEXT: retl 1419; 1420; X86-SSE1-LABEL: length24_eq_const: 1421; X86-SSE1: # %bb.0: 1422; X86-SSE1-NEXT: pushl $0 1423; X86-SSE1-NEXT: pushl $24 1424; X86-SSE1-NEXT: pushl $.L.str 1425; X86-SSE1-NEXT: pushl {{[0-9]+}}(%esp) 1426; X86-SSE1-NEXT: calll memcmp 1427; X86-SSE1-NEXT: addl $16, %esp 1428; X86-SSE1-NEXT: testl %eax, %eax 1429; X86-SSE1-NEXT: setne %al 1430; X86-SSE1-NEXT: retl 1431; 1432; X86-SSE2-LABEL: length24_eq_const: 1433; X86-SSE2: # %bb.0: 1434; X86-SSE2-NEXT: movl {{[0-9]+}}(%esp), %eax 1435; X86-SSE2-NEXT: movdqu (%eax), %xmm0 1436; X86-SSE2-NEXT: movdqu 8(%eax), %xmm1 1437; X86-SSE2-NEXT: pcmpeqb {{\.LCPI.*}}, %xmm1 1438; X86-SSE2-NEXT: pcmpeqb {{\.LCPI.*}}, %xmm0 1439; X86-SSE2-NEXT: pand %xmm1, %xmm0 1440; X86-SSE2-NEXT: pmovmskb %xmm0, %eax 1441; X86-SSE2-NEXT: cmpl $65535, %eax # imm = 0xFFFF 1442; X86-SSE2-NEXT: setne %al 1443; X86-SSE2-NEXT: retl 1444; 1445; X86-SSE41-LABEL: length24_eq_const: 1446; X86-SSE41: # %bb.0: 1447; X86-SSE41-NEXT: movl {{[0-9]+}}(%esp), %eax 1448; X86-SSE41-NEXT: movdqu (%eax), %xmm0 1449; X86-SSE41-NEXT: movdqu 8(%eax), %xmm1 1450; X86-SSE41-NEXT: pxor {{\.LCPI.*}}, %xmm1 1451; X86-SSE41-NEXT: pxor {{\.LCPI.*}}, %xmm0 1452; X86-SSE41-NEXT: por %xmm1, %xmm0 1453; X86-SSE41-NEXT: ptest %xmm0, %xmm0 1454; X86-SSE41-NEXT: setne %al 1455; X86-SSE41-NEXT: retl 1456; 1457; X64-SSE2-LABEL: length24_eq_const: 1458; X64-SSE2: # %bb.0: 1459; X64-SSE2-NEXT: movdqu (%rdi), %xmm0 1460; X64-SSE2-NEXT: movq {{.*#+}} xmm1 = mem[0],zero 1461; X64-SSE2-NEXT: pcmpeqb {{.*}}(%rip), %xmm1 1462; X64-SSE2-NEXT: pcmpeqb {{.*}}(%rip), %xmm0 1463; X64-SSE2-NEXT: pand %xmm1, %xmm0 1464; X64-SSE2-NEXT: pmovmskb %xmm0, %eax 1465; X64-SSE2-NEXT: cmpl $65535, %eax # imm = 0xFFFF 1466; X64-SSE2-NEXT: setne %al 1467; X64-SSE2-NEXT: retq 1468; 1469; X64-SSE41-LABEL: length24_eq_const: 1470; X64-SSE41: # %bb.0: 1471; X64-SSE41-NEXT: movdqu (%rdi), %xmm0 1472; X64-SSE41-NEXT: movq {{.*#+}} xmm1 = mem[0],zero 1473; X64-SSE41-NEXT: pxor {{.*}}(%rip), %xmm1 1474; X64-SSE41-NEXT: pxor {{.*}}(%rip), %xmm0 1475; X64-SSE41-NEXT: por %xmm1, %xmm0 1476; X64-SSE41-NEXT: ptest %xmm0, %xmm0 1477; X64-SSE41-NEXT: setne %al 1478; X64-SSE41-NEXT: retq 1479; 1480; X64-AVX-LABEL: length24_eq_const: 1481; X64-AVX: # %bb.0: 1482; X64-AVX-NEXT: vmovdqu (%rdi), %xmm0 1483; X64-AVX-NEXT: vmovq {{.*#+}} xmm1 = mem[0],zero 1484; X64-AVX-NEXT: vpxor {{.*}}(%rip), %xmm1, %xmm1 1485; X64-AVX-NEXT: vpxor {{.*}}(%rip), %xmm0, %xmm0 1486; X64-AVX-NEXT: vpor %xmm1, %xmm0, %xmm0 1487; X64-AVX-NEXT: vptest %xmm0, %xmm0 1488; X64-AVX-NEXT: setne %al 1489; X64-AVX-NEXT: retq 1490; 1491; X64-MIC-AVX-LABEL: length24_eq_const: 1492; X64-MIC-AVX: # %bb.0: 1493; X64-MIC-AVX-NEXT: vmovdqu (%rdi), %xmm0 1494; X64-MIC-AVX-NEXT: vmovq {{.*#+}} xmm1 = mem[0],zero 1495; X64-MIC-AVX-NEXT: vmovdqa {{.*#+}} xmm2 = [959985462,858927408,0,0] 1496; X64-MIC-AVX-NEXT: vpcmpneqd %zmm2, %zmm1, %k0 1497; X64-MIC-AVX-NEXT: vmovdqa {{.*#+}} xmm1 = [858927408,926299444,825243960,892613426] 1498; X64-MIC-AVX-NEXT: vpcmpneqd %zmm1, %zmm0, %k1 1499; X64-MIC-AVX-NEXT: kortestw %k0, %k1 1500; X64-MIC-AVX-NEXT: setne %al 1501; X64-MIC-AVX-NEXT: vzeroupper 1502; X64-MIC-AVX-NEXT: retq 1503 %m = tail call i32 @memcmp(i8* %X, i8* getelementptr inbounds ([513 x i8], [513 x i8]* @.str, i32 0, i32 0), i64 24) nounwind 1504 %c = icmp ne i32 %m, 0 1505 ret i1 %c 1506} 1507 1508define i32 @length31(i8* %X, i8* %Y) nounwind { 1509; X86-LABEL: length31: 1510; X86: # %bb.0: 1511; X86-NEXT: pushl $0 1512; X86-NEXT: pushl $31 1513; X86-NEXT: pushl {{[0-9]+}}(%esp) 1514; X86-NEXT: pushl {{[0-9]+}}(%esp) 1515; X86-NEXT: calll memcmp 1516; X86-NEXT: addl $16, %esp 1517; X86-NEXT: retl 1518; 1519; X64-LABEL: length31: 1520; X64: # %bb.0: 1521; X64-NEXT: movl $31, %edx 1522; X64-NEXT: jmp memcmp # TAILCALL 1523 %m = tail call i32 @memcmp(i8* %X, i8* %Y, i64 31) nounwind 1524 ret i32 %m 1525} 1526 1527define i1 @length31_eq(i8* %x, i8* %y) nounwind { 1528; X86-NOSSE-LABEL: length31_eq: 1529; X86-NOSSE: # %bb.0: 1530; X86-NOSSE-NEXT: pushl $0 1531; X86-NOSSE-NEXT: pushl $31 1532; X86-NOSSE-NEXT: pushl {{[0-9]+}}(%esp) 1533; X86-NOSSE-NEXT: pushl {{[0-9]+}}(%esp) 1534; X86-NOSSE-NEXT: calll memcmp 1535; X86-NOSSE-NEXT: addl $16, %esp 1536; X86-NOSSE-NEXT: testl %eax, %eax 1537; X86-NOSSE-NEXT: sete %al 1538; X86-NOSSE-NEXT: retl 1539; 1540; X86-SSE1-LABEL: length31_eq: 1541; X86-SSE1: # %bb.0: 1542; X86-SSE1-NEXT: pushl $0 1543; X86-SSE1-NEXT: pushl $31 1544; X86-SSE1-NEXT: pushl {{[0-9]+}}(%esp) 1545; X86-SSE1-NEXT: pushl {{[0-9]+}}(%esp) 1546; X86-SSE1-NEXT: calll memcmp 1547; X86-SSE1-NEXT: addl $16, %esp 1548; X86-SSE1-NEXT: testl %eax, %eax 1549; X86-SSE1-NEXT: sete %al 1550; X86-SSE1-NEXT: retl 1551; 1552; X86-SSE2-LABEL: length31_eq: 1553; X86-SSE2: # %bb.0: 1554; X86-SSE2-NEXT: movl {{[0-9]+}}(%esp), %eax 1555; X86-SSE2-NEXT: movl {{[0-9]+}}(%esp), %ecx 1556; X86-SSE2-NEXT: movdqu (%ecx), %xmm0 1557; X86-SSE2-NEXT: movdqu 15(%ecx), %xmm1 1558; X86-SSE2-NEXT: movdqu (%eax), %xmm2 1559; X86-SSE2-NEXT: pcmpeqb %xmm0, %xmm2 1560; X86-SSE2-NEXT: movdqu 15(%eax), %xmm0 1561; X86-SSE2-NEXT: pcmpeqb %xmm1, %xmm0 1562; X86-SSE2-NEXT: pand %xmm2, %xmm0 1563; X86-SSE2-NEXT: pmovmskb %xmm0, %eax 1564; X86-SSE2-NEXT: cmpl $65535, %eax # imm = 0xFFFF 1565; X86-SSE2-NEXT: sete %al 1566; X86-SSE2-NEXT: retl 1567; 1568; X86-SSE41-LABEL: length31_eq: 1569; X86-SSE41: # %bb.0: 1570; X86-SSE41-NEXT: movl {{[0-9]+}}(%esp), %eax 1571; X86-SSE41-NEXT: movl {{[0-9]+}}(%esp), %ecx 1572; X86-SSE41-NEXT: movdqu (%ecx), %xmm0 1573; X86-SSE41-NEXT: movdqu 15(%ecx), %xmm1 1574; X86-SSE41-NEXT: movdqu (%eax), %xmm2 1575; X86-SSE41-NEXT: pxor %xmm0, %xmm2 1576; X86-SSE41-NEXT: movdqu 15(%eax), %xmm0 1577; X86-SSE41-NEXT: pxor %xmm1, %xmm0 1578; X86-SSE41-NEXT: por %xmm2, %xmm0 1579; X86-SSE41-NEXT: ptest %xmm0, %xmm0 1580; X86-SSE41-NEXT: sete %al 1581; X86-SSE41-NEXT: retl 1582; 1583; X64-SSE2-LABEL: length31_eq: 1584; X64-SSE2: # %bb.0: 1585; X64-SSE2-NEXT: movdqu (%rdi), %xmm0 1586; X64-SSE2-NEXT: movdqu 15(%rdi), %xmm1 1587; X64-SSE2-NEXT: movdqu (%rsi), %xmm2 1588; X64-SSE2-NEXT: pcmpeqb %xmm0, %xmm2 1589; X64-SSE2-NEXT: movdqu 15(%rsi), %xmm0 1590; X64-SSE2-NEXT: pcmpeqb %xmm1, %xmm0 1591; X64-SSE2-NEXT: pand %xmm2, %xmm0 1592; X64-SSE2-NEXT: pmovmskb %xmm0, %eax 1593; X64-SSE2-NEXT: cmpl $65535, %eax # imm = 0xFFFF 1594; X64-SSE2-NEXT: sete %al 1595; X64-SSE2-NEXT: retq 1596; 1597; X64-SSE41-LABEL: length31_eq: 1598; X64-SSE41: # %bb.0: 1599; X64-SSE41-NEXT: movdqu (%rdi), %xmm0 1600; X64-SSE41-NEXT: movdqu 15(%rdi), %xmm1 1601; X64-SSE41-NEXT: movdqu (%rsi), %xmm2 1602; X64-SSE41-NEXT: pxor %xmm0, %xmm2 1603; X64-SSE41-NEXT: movdqu 15(%rsi), %xmm0 1604; X64-SSE41-NEXT: pxor %xmm1, %xmm0 1605; X64-SSE41-NEXT: por %xmm2, %xmm0 1606; X64-SSE41-NEXT: ptest %xmm0, %xmm0 1607; X64-SSE41-NEXT: sete %al 1608; X64-SSE41-NEXT: retq 1609; 1610; X64-AVX-LABEL: length31_eq: 1611; X64-AVX: # %bb.0: 1612; X64-AVX-NEXT: vmovdqu (%rdi), %xmm0 1613; X64-AVX-NEXT: vmovdqu 15(%rdi), %xmm1 1614; X64-AVX-NEXT: vpxor 15(%rsi), %xmm1, %xmm1 1615; X64-AVX-NEXT: vpxor (%rsi), %xmm0, %xmm0 1616; X64-AVX-NEXT: vpor %xmm1, %xmm0, %xmm0 1617; X64-AVX-NEXT: vptest %xmm0, %xmm0 1618; X64-AVX-NEXT: sete %al 1619; X64-AVX-NEXT: retq 1620; 1621; X64-MIC-AVX-LABEL: length31_eq: 1622; X64-MIC-AVX: # %bb.0: 1623; X64-MIC-AVX-NEXT: vmovdqu (%rdi), %xmm0 1624; X64-MIC-AVX-NEXT: vmovdqu 15(%rdi), %xmm1 1625; X64-MIC-AVX-NEXT: vmovdqu (%rsi), %xmm2 1626; X64-MIC-AVX-NEXT: vmovdqu 15(%rsi), %xmm3 1627; X64-MIC-AVX-NEXT: vpcmpneqd %zmm3, %zmm1, %k0 1628; X64-MIC-AVX-NEXT: vpcmpneqd %zmm2, %zmm0, %k1 1629; X64-MIC-AVX-NEXT: kortestw %k0, %k1 1630; X64-MIC-AVX-NEXT: sete %al 1631; X64-MIC-AVX-NEXT: vzeroupper 1632; X64-MIC-AVX-NEXT: retq 1633 %call = tail call i32 @memcmp(i8* %x, i8* %y, i64 31) nounwind 1634 %cmp = icmp eq i32 %call, 0 1635 ret i1 %cmp 1636} 1637 1638define i1 @length31_lt(i8* %x, i8* %y) nounwind { 1639; X86-LABEL: length31_lt: 1640; X86: # %bb.0: 1641; X86-NEXT: pushl $0 1642; X86-NEXT: pushl $31 1643; X86-NEXT: pushl {{[0-9]+}}(%esp) 1644; X86-NEXT: pushl {{[0-9]+}}(%esp) 1645; X86-NEXT: calll memcmp 1646; X86-NEXT: addl $16, %esp 1647; X86-NEXT: shrl $31, %eax 1648; X86-NEXT: # kill: def $al killed $al killed $eax 1649; X86-NEXT: retl 1650; 1651; X64-LABEL: length31_lt: 1652; X64: # %bb.0: 1653; X64-NEXT: pushq %rax 1654; X64-NEXT: movl $31, %edx 1655; X64-NEXT: callq memcmp 1656; X64-NEXT: shrl $31, %eax 1657; X64-NEXT: # kill: def $al killed $al killed $eax 1658; X64-NEXT: popq %rcx 1659; X64-NEXT: retq 1660 %call = tail call i32 @memcmp(i8* %x, i8* %y, i64 31) nounwind 1661 %cmp = icmp slt i32 %call, 0 1662 ret i1 %cmp 1663} 1664 1665define i1 @length31_gt(i8* %x, i8* %y) nounwind { 1666; X86-LABEL: length31_gt: 1667; X86: # %bb.0: 1668; X86-NEXT: pushl $0 1669; X86-NEXT: pushl $31 1670; X86-NEXT: pushl {{[0-9]+}}(%esp) 1671; X86-NEXT: pushl {{[0-9]+}}(%esp) 1672; X86-NEXT: calll memcmp 1673; X86-NEXT: addl $16, %esp 1674; X86-NEXT: testl %eax, %eax 1675; X86-NEXT: setg %al 1676; X86-NEXT: retl 1677; 1678; X64-LABEL: length31_gt: 1679; X64: # %bb.0: 1680; X64-NEXT: pushq %rax 1681; X64-NEXT: movl $31, %edx 1682; X64-NEXT: callq memcmp 1683; X64-NEXT: testl %eax, %eax 1684; X64-NEXT: setg %al 1685; X64-NEXT: popq %rcx 1686; X64-NEXT: retq 1687 %call = tail call i32 @memcmp(i8* %x, i8* %y, i64 31) nounwind 1688 %cmp = icmp sgt i32 %call, 0 1689 ret i1 %cmp 1690} 1691 1692define i1 @length31_eq_prefer128(i8* %x, i8* %y) nounwind "prefer-vector-width"="128" { 1693; X86-NOSSE-LABEL: length31_eq_prefer128: 1694; X86-NOSSE: # %bb.0: 1695; X86-NOSSE-NEXT: pushl $0 1696; X86-NOSSE-NEXT: pushl $31 1697; X86-NOSSE-NEXT: pushl {{[0-9]+}}(%esp) 1698; X86-NOSSE-NEXT: pushl {{[0-9]+}}(%esp) 1699; X86-NOSSE-NEXT: calll memcmp 1700; X86-NOSSE-NEXT: addl $16, %esp 1701; X86-NOSSE-NEXT: testl %eax, %eax 1702; X86-NOSSE-NEXT: sete %al 1703; X86-NOSSE-NEXT: retl 1704; 1705; X86-SSE1-LABEL: length31_eq_prefer128: 1706; X86-SSE1: # %bb.0: 1707; X86-SSE1-NEXT: pushl $0 1708; X86-SSE1-NEXT: pushl $31 1709; X86-SSE1-NEXT: pushl {{[0-9]+}}(%esp) 1710; X86-SSE1-NEXT: pushl {{[0-9]+}}(%esp) 1711; X86-SSE1-NEXT: calll memcmp 1712; X86-SSE1-NEXT: addl $16, %esp 1713; X86-SSE1-NEXT: testl %eax, %eax 1714; X86-SSE1-NEXT: sete %al 1715; X86-SSE1-NEXT: retl 1716; 1717; X86-SSE2-LABEL: length31_eq_prefer128: 1718; X86-SSE2: # %bb.0: 1719; X86-SSE2-NEXT: movl {{[0-9]+}}(%esp), %eax 1720; X86-SSE2-NEXT: movl {{[0-9]+}}(%esp), %ecx 1721; X86-SSE2-NEXT: movdqu (%ecx), %xmm0 1722; X86-SSE2-NEXT: movdqu 15(%ecx), %xmm1 1723; X86-SSE2-NEXT: movdqu (%eax), %xmm2 1724; X86-SSE2-NEXT: pcmpeqb %xmm0, %xmm2 1725; X86-SSE2-NEXT: movdqu 15(%eax), %xmm0 1726; X86-SSE2-NEXT: pcmpeqb %xmm1, %xmm0 1727; X86-SSE2-NEXT: pand %xmm2, %xmm0 1728; X86-SSE2-NEXT: pmovmskb %xmm0, %eax 1729; X86-SSE2-NEXT: cmpl $65535, %eax # imm = 0xFFFF 1730; X86-SSE2-NEXT: sete %al 1731; X86-SSE2-NEXT: retl 1732; 1733; X86-SSE41-LABEL: length31_eq_prefer128: 1734; X86-SSE41: # %bb.0: 1735; X86-SSE41-NEXT: movl {{[0-9]+}}(%esp), %eax 1736; X86-SSE41-NEXT: movl {{[0-9]+}}(%esp), %ecx 1737; X86-SSE41-NEXT: movdqu (%ecx), %xmm0 1738; X86-SSE41-NEXT: movdqu 15(%ecx), %xmm1 1739; X86-SSE41-NEXT: movdqu (%eax), %xmm2 1740; X86-SSE41-NEXT: pxor %xmm0, %xmm2 1741; X86-SSE41-NEXT: movdqu 15(%eax), %xmm0 1742; X86-SSE41-NEXT: pxor %xmm1, %xmm0 1743; X86-SSE41-NEXT: por %xmm2, %xmm0 1744; X86-SSE41-NEXT: ptest %xmm0, %xmm0 1745; X86-SSE41-NEXT: sete %al 1746; X86-SSE41-NEXT: retl 1747; 1748; X64-SSE2-LABEL: length31_eq_prefer128: 1749; X64-SSE2: # %bb.0: 1750; X64-SSE2-NEXT: movdqu (%rdi), %xmm0 1751; X64-SSE2-NEXT: movdqu 15(%rdi), %xmm1 1752; X64-SSE2-NEXT: movdqu (%rsi), %xmm2 1753; X64-SSE2-NEXT: pcmpeqb %xmm0, %xmm2 1754; X64-SSE2-NEXT: movdqu 15(%rsi), %xmm0 1755; X64-SSE2-NEXT: pcmpeqb %xmm1, %xmm0 1756; X64-SSE2-NEXT: pand %xmm2, %xmm0 1757; X64-SSE2-NEXT: pmovmskb %xmm0, %eax 1758; X64-SSE2-NEXT: cmpl $65535, %eax # imm = 0xFFFF 1759; X64-SSE2-NEXT: sete %al 1760; X64-SSE2-NEXT: retq 1761; 1762; X64-SSE41-LABEL: length31_eq_prefer128: 1763; X64-SSE41: # %bb.0: 1764; X64-SSE41-NEXT: movdqu (%rdi), %xmm0 1765; X64-SSE41-NEXT: movdqu 15(%rdi), %xmm1 1766; X64-SSE41-NEXT: movdqu (%rsi), %xmm2 1767; X64-SSE41-NEXT: pxor %xmm0, %xmm2 1768; X64-SSE41-NEXT: movdqu 15(%rsi), %xmm0 1769; X64-SSE41-NEXT: pxor %xmm1, %xmm0 1770; X64-SSE41-NEXT: por %xmm2, %xmm0 1771; X64-SSE41-NEXT: ptest %xmm0, %xmm0 1772; X64-SSE41-NEXT: sete %al 1773; X64-SSE41-NEXT: retq 1774; 1775; X64-AVX-LABEL: length31_eq_prefer128: 1776; X64-AVX: # %bb.0: 1777; X64-AVX-NEXT: vmovdqu (%rdi), %xmm0 1778; X64-AVX-NEXT: vmovdqu 15(%rdi), %xmm1 1779; X64-AVX-NEXT: vpxor 15(%rsi), %xmm1, %xmm1 1780; X64-AVX-NEXT: vpxor (%rsi), %xmm0, %xmm0 1781; X64-AVX-NEXT: vpor %xmm1, %xmm0, %xmm0 1782; X64-AVX-NEXT: vptest %xmm0, %xmm0 1783; X64-AVX-NEXT: sete %al 1784; X64-AVX-NEXT: retq 1785; 1786; X64-MIC-AVX-LABEL: length31_eq_prefer128: 1787; X64-MIC-AVX: # %bb.0: 1788; X64-MIC-AVX-NEXT: vmovdqu (%rdi), %xmm0 1789; X64-MIC-AVX-NEXT: vmovdqu 15(%rdi), %xmm1 1790; X64-MIC-AVX-NEXT: vmovdqu (%rsi), %xmm2 1791; X64-MIC-AVX-NEXT: vmovdqu 15(%rsi), %xmm3 1792; X64-MIC-AVX-NEXT: vpcmpneqd %zmm3, %zmm1, %k0 1793; X64-MIC-AVX-NEXT: vpcmpneqd %zmm2, %zmm0, %k1 1794; X64-MIC-AVX-NEXT: kortestw %k0, %k1 1795; X64-MIC-AVX-NEXT: sete %al 1796; X64-MIC-AVX-NEXT: vzeroupper 1797; X64-MIC-AVX-NEXT: retq 1798 %call = tail call i32 @memcmp(i8* %x, i8* %y, i64 31) nounwind 1799 %cmp = icmp eq i32 %call, 0 1800 ret i1 %cmp 1801} 1802 1803define i1 @length31_eq_const(i8* %X) nounwind { 1804; X86-NOSSE-LABEL: length31_eq_const: 1805; X86-NOSSE: # %bb.0: 1806; X86-NOSSE-NEXT: pushl $0 1807; X86-NOSSE-NEXT: pushl $31 1808; X86-NOSSE-NEXT: pushl $.L.str 1809; X86-NOSSE-NEXT: pushl {{[0-9]+}}(%esp) 1810; X86-NOSSE-NEXT: calll memcmp 1811; X86-NOSSE-NEXT: addl $16, %esp 1812; X86-NOSSE-NEXT: testl %eax, %eax 1813; X86-NOSSE-NEXT: setne %al 1814; X86-NOSSE-NEXT: retl 1815; 1816; X86-SSE1-LABEL: length31_eq_const: 1817; X86-SSE1: # %bb.0: 1818; X86-SSE1-NEXT: pushl $0 1819; X86-SSE1-NEXT: pushl $31 1820; X86-SSE1-NEXT: pushl $.L.str 1821; X86-SSE1-NEXT: pushl {{[0-9]+}}(%esp) 1822; X86-SSE1-NEXT: calll memcmp 1823; X86-SSE1-NEXT: addl $16, %esp 1824; X86-SSE1-NEXT: testl %eax, %eax 1825; X86-SSE1-NEXT: setne %al 1826; X86-SSE1-NEXT: retl 1827; 1828; X86-SSE2-LABEL: length31_eq_const: 1829; X86-SSE2: # %bb.0: 1830; X86-SSE2-NEXT: movl {{[0-9]+}}(%esp), %eax 1831; X86-SSE2-NEXT: movdqu (%eax), %xmm0 1832; X86-SSE2-NEXT: movdqu 15(%eax), %xmm1 1833; X86-SSE2-NEXT: pcmpeqb {{\.LCPI.*}}, %xmm1 1834; X86-SSE2-NEXT: pcmpeqb {{\.LCPI.*}}, %xmm0 1835; X86-SSE2-NEXT: pand %xmm1, %xmm0 1836; X86-SSE2-NEXT: pmovmskb %xmm0, %eax 1837; X86-SSE2-NEXT: cmpl $65535, %eax # imm = 0xFFFF 1838; X86-SSE2-NEXT: setne %al 1839; X86-SSE2-NEXT: retl 1840; 1841; X86-SSE41-LABEL: length31_eq_const: 1842; X86-SSE41: # %bb.0: 1843; X86-SSE41-NEXT: movl {{[0-9]+}}(%esp), %eax 1844; X86-SSE41-NEXT: movdqu (%eax), %xmm0 1845; X86-SSE41-NEXT: movdqu 15(%eax), %xmm1 1846; X86-SSE41-NEXT: pxor {{\.LCPI.*}}, %xmm1 1847; X86-SSE41-NEXT: pxor {{\.LCPI.*}}, %xmm0 1848; X86-SSE41-NEXT: por %xmm1, %xmm0 1849; X86-SSE41-NEXT: ptest %xmm0, %xmm0 1850; X86-SSE41-NEXT: setne %al 1851; X86-SSE41-NEXT: retl 1852; 1853; X64-SSE2-LABEL: length31_eq_const: 1854; X64-SSE2: # %bb.0: 1855; X64-SSE2-NEXT: movdqu (%rdi), %xmm0 1856; X64-SSE2-NEXT: movdqu 15(%rdi), %xmm1 1857; X64-SSE2-NEXT: pcmpeqb {{.*}}(%rip), %xmm1 1858; X64-SSE2-NEXT: pcmpeqb {{.*}}(%rip), %xmm0 1859; X64-SSE2-NEXT: pand %xmm1, %xmm0 1860; X64-SSE2-NEXT: pmovmskb %xmm0, %eax 1861; X64-SSE2-NEXT: cmpl $65535, %eax # imm = 0xFFFF 1862; X64-SSE2-NEXT: setne %al 1863; X64-SSE2-NEXT: retq 1864; 1865; X64-SSE41-LABEL: length31_eq_const: 1866; X64-SSE41: # %bb.0: 1867; X64-SSE41-NEXT: movdqu (%rdi), %xmm0 1868; X64-SSE41-NEXT: movdqu 15(%rdi), %xmm1 1869; X64-SSE41-NEXT: pxor {{.*}}(%rip), %xmm1 1870; X64-SSE41-NEXT: pxor {{.*}}(%rip), %xmm0 1871; X64-SSE41-NEXT: por %xmm1, %xmm0 1872; X64-SSE41-NEXT: ptest %xmm0, %xmm0 1873; X64-SSE41-NEXT: setne %al 1874; X64-SSE41-NEXT: retq 1875; 1876; X64-AVX-LABEL: length31_eq_const: 1877; X64-AVX: # %bb.0: 1878; X64-AVX-NEXT: vmovdqu (%rdi), %xmm0 1879; X64-AVX-NEXT: vmovdqu 15(%rdi), %xmm1 1880; X64-AVX-NEXT: vpxor {{.*}}(%rip), %xmm1, %xmm1 1881; X64-AVX-NEXT: vpxor {{.*}}(%rip), %xmm0, %xmm0 1882; X64-AVX-NEXT: vpor %xmm1, %xmm0, %xmm0 1883; X64-AVX-NEXT: vptest %xmm0, %xmm0 1884; X64-AVX-NEXT: setne %al 1885; X64-AVX-NEXT: retq 1886; 1887; X64-MIC-AVX-LABEL: length31_eq_const: 1888; X64-MIC-AVX: # %bb.0: 1889; X64-MIC-AVX-NEXT: vmovdqu (%rdi), %xmm0 1890; X64-MIC-AVX-NEXT: vmovdqu 15(%rdi), %xmm1 1891; X64-MIC-AVX-NEXT: vmovdqa {{.*#+}} xmm2 = [943142453,842084409,909456435,809056311] 1892; X64-MIC-AVX-NEXT: vpcmpneqd %zmm2, %zmm1, %k0 1893; X64-MIC-AVX-NEXT: vmovdqa {{.*#+}} xmm1 = [858927408,926299444,825243960,892613426] 1894; X64-MIC-AVX-NEXT: vpcmpneqd %zmm1, %zmm0, %k1 1895; X64-MIC-AVX-NEXT: kortestw %k0, %k1 1896; X64-MIC-AVX-NEXT: setne %al 1897; X64-MIC-AVX-NEXT: vzeroupper 1898; X64-MIC-AVX-NEXT: retq 1899 %m = tail call i32 @memcmp(i8* %X, i8* getelementptr inbounds ([513 x i8], [513 x i8]* @.str, i32 0, i32 0), i64 31) nounwind 1900 %c = icmp ne i32 %m, 0 1901 ret i1 %c 1902} 1903 1904define i32 @length32(i8* %X, i8* %Y) nounwind { 1905; X86-LABEL: length32: 1906; X86: # %bb.0: 1907; X86-NEXT: pushl $0 1908; X86-NEXT: pushl $32 1909; X86-NEXT: pushl {{[0-9]+}}(%esp) 1910; X86-NEXT: pushl {{[0-9]+}}(%esp) 1911; X86-NEXT: calll memcmp 1912; X86-NEXT: addl $16, %esp 1913; X86-NEXT: retl 1914; 1915; X64-LABEL: length32: 1916; X64: # %bb.0: 1917; X64-NEXT: movl $32, %edx 1918; X64-NEXT: jmp memcmp # TAILCALL 1919 %m = tail call i32 @memcmp(i8* %X, i8* %Y, i64 32) nounwind 1920 ret i32 %m 1921} 1922 1923; PR33325 - https://bugs.llvm.org/show_bug.cgi?id=33325 1924 1925define i1 @length32_eq(i8* %x, i8* %y) nounwind { 1926; X86-NOSSE-LABEL: length32_eq: 1927; X86-NOSSE: # %bb.0: 1928; X86-NOSSE-NEXT: pushl $0 1929; X86-NOSSE-NEXT: pushl $32 1930; X86-NOSSE-NEXT: pushl {{[0-9]+}}(%esp) 1931; X86-NOSSE-NEXT: pushl {{[0-9]+}}(%esp) 1932; X86-NOSSE-NEXT: calll memcmp 1933; X86-NOSSE-NEXT: addl $16, %esp 1934; X86-NOSSE-NEXT: testl %eax, %eax 1935; X86-NOSSE-NEXT: sete %al 1936; X86-NOSSE-NEXT: retl 1937; 1938; X86-SSE1-LABEL: length32_eq: 1939; X86-SSE1: # %bb.0: 1940; X86-SSE1-NEXT: pushl $0 1941; X86-SSE1-NEXT: pushl $32 1942; X86-SSE1-NEXT: pushl {{[0-9]+}}(%esp) 1943; X86-SSE1-NEXT: pushl {{[0-9]+}}(%esp) 1944; X86-SSE1-NEXT: calll memcmp 1945; X86-SSE1-NEXT: addl $16, %esp 1946; X86-SSE1-NEXT: testl %eax, %eax 1947; X86-SSE1-NEXT: sete %al 1948; X86-SSE1-NEXT: retl 1949; 1950; X86-SSE2-LABEL: length32_eq: 1951; X86-SSE2: # %bb.0: 1952; X86-SSE2-NEXT: movl {{[0-9]+}}(%esp), %eax 1953; X86-SSE2-NEXT: movl {{[0-9]+}}(%esp), %ecx 1954; X86-SSE2-NEXT: movdqu (%ecx), %xmm0 1955; X86-SSE2-NEXT: movdqu 16(%ecx), %xmm1 1956; X86-SSE2-NEXT: movdqu (%eax), %xmm2 1957; X86-SSE2-NEXT: pcmpeqb %xmm0, %xmm2 1958; X86-SSE2-NEXT: movdqu 16(%eax), %xmm0 1959; X86-SSE2-NEXT: pcmpeqb %xmm1, %xmm0 1960; X86-SSE2-NEXT: pand %xmm2, %xmm0 1961; X86-SSE2-NEXT: pmovmskb %xmm0, %eax 1962; X86-SSE2-NEXT: cmpl $65535, %eax # imm = 0xFFFF 1963; X86-SSE2-NEXT: sete %al 1964; X86-SSE2-NEXT: retl 1965; 1966; X86-SSE41-LABEL: length32_eq: 1967; X86-SSE41: # %bb.0: 1968; X86-SSE41-NEXT: movl {{[0-9]+}}(%esp), %eax 1969; X86-SSE41-NEXT: movl {{[0-9]+}}(%esp), %ecx 1970; X86-SSE41-NEXT: movdqu (%ecx), %xmm0 1971; X86-SSE41-NEXT: movdqu 16(%ecx), %xmm1 1972; X86-SSE41-NEXT: movdqu (%eax), %xmm2 1973; X86-SSE41-NEXT: pxor %xmm0, %xmm2 1974; X86-SSE41-NEXT: movdqu 16(%eax), %xmm0 1975; X86-SSE41-NEXT: pxor %xmm1, %xmm0 1976; X86-SSE41-NEXT: por %xmm2, %xmm0 1977; X86-SSE41-NEXT: ptest %xmm0, %xmm0 1978; X86-SSE41-NEXT: sete %al 1979; X86-SSE41-NEXT: retl 1980; 1981; X64-SSE2-LABEL: length32_eq: 1982; X64-SSE2: # %bb.0: 1983; X64-SSE2-NEXT: movdqu (%rdi), %xmm0 1984; X64-SSE2-NEXT: movdqu 16(%rdi), %xmm1 1985; X64-SSE2-NEXT: movdqu (%rsi), %xmm2 1986; X64-SSE2-NEXT: pcmpeqb %xmm0, %xmm2 1987; X64-SSE2-NEXT: movdqu 16(%rsi), %xmm0 1988; X64-SSE2-NEXT: pcmpeqb %xmm1, %xmm0 1989; X64-SSE2-NEXT: pand %xmm2, %xmm0 1990; X64-SSE2-NEXT: pmovmskb %xmm0, %eax 1991; X64-SSE2-NEXT: cmpl $65535, %eax # imm = 0xFFFF 1992; X64-SSE2-NEXT: sete %al 1993; X64-SSE2-NEXT: retq 1994; 1995; X64-SSE41-LABEL: length32_eq: 1996; X64-SSE41: # %bb.0: 1997; X64-SSE41-NEXT: movdqu (%rdi), %xmm0 1998; X64-SSE41-NEXT: movdqu 16(%rdi), %xmm1 1999; X64-SSE41-NEXT: movdqu (%rsi), %xmm2 2000; X64-SSE41-NEXT: pxor %xmm0, %xmm2 2001; X64-SSE41-NEXT: movdqu 16(%rsi), %xmm0 2002; X64-SSE41-NEXT: pxor %xmm1, %xmm0 2003; X64-SSE41-NEXT: por %xmm2, %xmm0 2004; X64-SSE41-NEXT: ptest %xmm0, %xmm0 2005; X64-SSE41-NEXT: sete %al 2006; X64-SSE41-NEXT: retq 2007; 2008; X64-AVX1-LABEL: length32_eq: 2009; X64-AVX1: # %bb.0: 2010; X64-AVX1-NEXT: vmovups (%rdi), %ymm0 2011; X64-AVX1-NEXT: vxorps (%rsi), %ymm0, %ymm0 2012; X64-AVX1-NEXT: vptest %ymm0, %ymm0 2013; X64-AVX1-NEXT: sete %al 2014; X64-AVX1-NEXT: vzeroupper 2015; X64-AVX1-NEXT: retq 2016; 2017; X64-AVX2-LABEL: length32_eq: 2018; X64-AVX2: # %bb.0: 2019; X64-AVX2-NEXT: vmovdqu (%rdi), %ymm0 2020; X64-AVX2-NEXT: vpxor (%rsi), %ymm0, %ymm0 2021; X64-AVX2-NEXT: vptest %ymm0, %ymm0 2022; X64-AVX2-NEXT: sete %al 2023; X64-AVX2-NEXT: vzeroupper 2024; X64-AVX2-NEXT: retq 2025; 2026; X64-AVX512-LABEL: length32_eq: 2027; X64-AVX512: # %bb.0: 2028; X64-AVX512-NEXT: vmovdqu (%rdi), %ymm0 2029; X64-AVX512-NEXT: vpxor (%rsi), %ymm0, %ymm0 2030; X64-AVX512-NEXT: vptest %ymm0, %ymm0 2031; X64-AVX512-NEXT: sete %al 2032; X64-AVX512-NEXT: vzeroupper 2033; X64-AVX512-NEXT: retq 2034; 2035; X64-MIC-AVX-LABEL: length32_eq: 2036; X64-MIC-AVX: # %bb.0: 2037; X64-MIC-AVX-NEXT: vmovdqu (%rdi), %ymm0 2038; X64-MIC-AVX-NEXT: vmovdqu (%rsi), %ymm1 2039; X64-MIC-AVX-NEXT: vpcmpneqd %zmm1, %zmm0, %k0 2040; X64-MIC-AVX-NEXT: kortestw %k0, %k0 2041; X64-MIC-AVX-NEXT: sete %al 2042; X64-MIC-AVX-NEXT: vzeroupper 2043; X64-MIC-AVX-NEXT: retq 2044 %call = tail call i32 @memcmp(i8* %x, i8* %y, i64 32) nounwind 2045 %cmp = icmp eq i32 %call, 0 2046 ret i1 %cmp 2047} 2048 2049define i1 @length32_lt(i8* %x, i8* %y) nounwind { 2050; X86-LABEL: length32_lt: 2051; X86: # %bb.0: 2052; X86-NEXT: pushl $0 2053; X86-NEXT: pushl $32 2054; X86-NEXT: pushl {{[0-9]+}}(%esp) 2055; X86-NEXT: pushl {{[0-9]+}}(%esp) 2056; X86-NEXT: calll memcmp 2057; X86-NEXT: addl $16, %esp 2058; X86-NEXT: shrl $31, %eax 2059; X86-NEXT: # kill: def $al killed $al killed $eax 2060; X86-NEXT: retl 2061; 2062; X64-LABEL: length32_lt: 2063; X64: # %bb.0: 2064; X64-NEXT: pushq %rax 2065; X64-NEXT: movl $32, %edx 2066; X64-NEXT: callq memcmp 2067; X64-NEXT: shrl $31, %eax 2068; X64-NEXT: # kill: def $al killed $al killed $eax 2069; X64-NEXT: popq %rcx 2070; X64-NEXT: retq 2071 %call = tail call i32 @memcmp(i8* %x, i8* %y, i64 32) nounwind 2072 %cmp = icmp slt i32 %call, 0 2073 ret i1 %cmp 2074} 2075 2076define i1 @length32_gt(i8* %x, i8* %y) nounwind { 2077; X86-LABEL: length32_gt: 2078; X86: # %bb.0: 2079; X86-NEXT: pushl $0 2080; X86-NEXT: pushl $32 2081; X86-NEXT: pushl {{[0-9]+}}(%esp) 2082; X86-NEXT: pushl {{[0-9]+}}(%esp) 2083; X86-NEXT: calll memcmp 2084; X86-NEXT: addl $16, %esp 2085; X86-NEXT: testl %eax, %eax 2086; X86-NEXT: setg %al 2087; X86-NEXT: retl 2088; 2089; X64-LABEL: length32_gt: 2090; X64: # %bb.0: 2091; X64-NEXT: pushq %rax 2092; X64-NEXT: movl $32, %edx 2093; X64-NEXT: callq memcmp 2094; X64-NEXT: testl %eax, %eax 2095; X64-NEXT: setg %al 2096; X64-NEXT: popq %rcx 2097; X64-NEXT: retq 2098 %call = tail call i32 @memcmp(i8* %x, i8* %y, i64 32) nounwind 2099 %cmp = icmp sgt i32 %call, 0 2100 ret i1 %cmp 2101} 2102 2103define i1 @length32_eq_prefer128(i8* %x, i8* %y) nounwind "prefer-vector-width"="128" { 2104; X86-NOSSE-LABEL: length32_eq_prefer128: 2105; X86-NOSSE: # %bb.0: 2106; X86-NOSSE-NEXT: pushl $0 2107; X86-NOSSE-NEXT: pushl $32 2108; X86-NOSSE-NEXT: pushl {{[0-9]+}}(%esp) 2109; X86-NOSSE-NEXT: pushl {{[0-9]+}}(%esp) 2110; X86-NOSSE-NEXT: calll memcmp 2111; X86-NOSSE-NEXT: addl $16, %esp 2112; X86-NOSSE-NEXT: testl %eax, %eax 2113; X86-NOSSE-NEXT: sete %al 2114; X86-NOSSE-NEXT: retl 2115; 2116; X86-SSE1-LABEL: length32_eq_prefer128: 2117; X86-SSE1: # %bb.0: 2118; X86-SSE1-NEXT: pushl $0 2119; X86-SSE1-NEXT: pushl $32 2120; X86-SSE1-NEXT: pushl {{[0-9]+}}(%esp) 2121; X86-SSE1-NEXT: pushl {{[0-9]+}}(%esp) 2122; X86-SSE1-NEXT: calll memcmp 2123; X86-SSE1-NEXT: addl $16, %esp 2124; X86-SSE1-NEXT: testl %eax, %eax 2125; X86-SSE1-NEXT: sete %al 2126; X86-SSE1-NEXT: retl 2127; 2128; X86-SSE2-LABEL: length32_eq_prefer128: 2129; X86-SSE2: # %bb.0: 2130; X86-SSE2-NEXT: movl {{[0-9]+}}(%esp), %eax 2131; X86-SSE2-NEXT: movl {{[0-9]+}}(%esp), %ecx 2132; X86-SSE2-NEXT: movdqu (%ecx), %xmm0 2133; X86-SSE2-NEXT: movdqu 16(%ecx), %xmm1 2134; X86-SSE2-NEXT: movdqu (%eax), %xmm2 2135; X86-SSE2-NEXT: pcmpeqb %xmm0, %xmm2 2136; X86-SSE2-NEXT: movdqu 16(%eax), %xmm0 2137; X86-SSE2-NEXT: pcmpeqb %xmm1, %xmm0 2138; X86-SSE2-NEXT: pand %xmm2, %xmm0 2139; X86-SSE2-NEXT: pmovmskb %xmm0, %eax 2140; X86-SSE2-NEXT: cmpl $65535, %eax # imm = 0xFFFF 2141; X86-SSE2-NEXT: sete %al 2142; X86-SSE2-NEXT: retl 2143; 2144; X86-SSE41-LABEL: length32_eq_prefer128: 2145; X86-SSE41: # %bb.0: 2146; X86-SSE41-NEXT: movl {{[0-9]+}}(%esp), %eax 2147; X86-SSE41-NEXT: movl {{[0-9]+}}(%esp), %ecx 2148; X86-SSE41-NEXT: movdqu (%ecx), %xmm0 2149; X86-SSE41-NEXT: movdqu 16(%ecx), %xmm1 2150; X86-SSE41-NEXT: movdqu (%eax), %xmm2 2151; X86-SSE41-NEXT: pxor %xmm0, %xmm2 2152; X86-SSE41-NEXT: movdqu 16(%eax), %xmm0 2153; X86-SSE41-NEXT: pxor %xmm1, %xmm0 2154; X86-SSE41-NEXT: por %xmm2, %xmm0 2155; X86-SSE41-NEXT: ptest %xmm0, %xmm0 2156; X86-SSE41-NEXT: sete %al 2157; X86-SSE41-NEXT: retl 2158; 2159; X64-SSE2-LABEL: length32_eq_prefer128: 2160; X64-SSE2: # %bb.0: 2161; X64-SSE2-NEXT: movdqu (%rdi), %xmm0 2162; X64-SSE2-NEXT: movdqu 16(%rdi), %xmm1 2163; X64-SSE2-NEXT: movdqu (%rsi), %xmm2 2164; X64-SSE2-NEXT: pcmpeqb %xmm0, %xmm2 2165; X64-SSE2-NEXT: movdqu 16(%rsi), %xmm0 2166; X64-SSE2-NEXT: pcmpeqb %xmm1, %xmm0 2167; X64-SSE2-NEXT: pand %xmm2, %xmm0 2168; X64-SSE2-NEXT: pmovmskb %xmm0, %eax 2169; X64-SSE2-NEXT: cmpl $65535, %eax # imm = 0xFFFF 2170; X64-SSE2-NEXT: sete %al 2171; X64-SSE2-NEXT: retq 2172; 2173; X64-SSE41-LABEL: length32_eq_prefer128: 2174; X64-SSE41: # %bb.0: 2175; X64-SSE41-NEXT: movdqu (%rdi), %xmm0 2176; X64-SSE41-NEXT: movdqu 16(%rdi), %xmm1 2177; X64-SSE41-NEXT: movdqu (%rsi), %xmm2 2178; X64-SSE41-NEXT: pxor %xmm0, %xmm2 2179; X64-SSE41-NEXT: movdqu 16(%rsi), %xmm0 2180; X64-SSE41-NEXT: pxor %xmm1, %xmm0 2181; X64-SSE41-NEXT: por %xmm2, %xmm0 2182; X64-SSE41-NEXT: ptest %xmm0, %xmm0 2183; X64-SSE41-NEXT: sete %al 2184; X64-SSE41-NEXT: retq 2185; 2186; X64-AVX-LABEL: length32_eq_prefer128: 2187; X64-AVX: # %bb.0: 2188; X64-AVX-NEXT: vmovdqu (%rdi), %xmm0 2189; X64-AVX-NEXT: vmovdqu 16(%rdi), %xmm1 2190; X64-AVX-NEXT: vpxor 16(%rsi), %xmm1, %xmm1 2191; X64-AVX-NEXT: vpxor (%rsi), %xmm0, %xmm0 2192; X64-AVX-NEXT: vpor %xmm1, %xmm0, %xmm0 2193; X64-AVX-NEXT: vptest %xmm0, %xmm0 2194; X64-AVX-NEXT: sete %al 2195; X64-AVX-NEXT: retq 2196; 2197; X64-MIC-AVX-LABEL: length32_eq_prefer128: 2198; X64-MIC-AVX: # %bb.0: 2199; X64-MIC-AVX-NEXT: vmovdqu (%rdi), %xmm0 2200; X64-MIC-AVX-NEXT: vmovdqu 16(%rdi), %xmm1 2201; X64-MIC-AVX-NEXT: vmovdqu (%rsi), %xmm2 2202; X64-MIC-AVX-NEXT: vmovdqu 16(%rsi), %xmm3 2203; X64-MIC-AVX-NEXT: vpcmpneqd %zmm3, %zmm1, %k0 2204; X64-MIC-AVX-NEXT: vpcmpneqd %zmm2, %zmm0, %k1 2205; X64-MIC-AVX-NEXT: kortestw %k0, %k1 2206; X64-MIC-AVX-NEXT: sete %al 2207; X64-MIC-AVX-NEXT: vzeroupper 2208; X64-MIC-AVX-NEXT: retq 2209 %call = tail call i32 @memcmp(i8* %x, i8* %y, i64 32) nounwind 2210 %cmp = icmp eq i32 %call, 0 2211 ret i1 %cmp 2212} 2213 2214define i1 @length32_eq_const(i8* %X) nounwind { 2215; X86-NOSSE-LABEL: length32_eq_const: 2216; X86-NOSSE: # %bb.0: 2217; X86-NOSSE-NEXT: pushl $0 2218; X86-NOSSE-NEXT: pushl $32 2219; X86-NOSSE-NEXT: pushl $.L.str 2220; X86-NOSSE-NEXT: pushl {{[0-9]+}}(%esp) 2221; X86-NOSSE-NEXT: calll memcmp 2222; X86-NOSSE-NEXT: addl $16, %esp 2223; X86-NOSSE-NEXT: testl %eax, %eax 2224; X86-NOSSE-NEXT: setne %al 2225; X86-NOSSE-NEXT: retl 2226; 2227; X86-SSE1-LABEL: length32_eq_const: 2228; X86-SSE1: # %bb.0: 2229; X86-SSE1-NEXT: pushl $0 2230; X86-SSE1-NEXT: pushl $32 2231; X86-SSE1-NEXT: pushl $.L.str 2232; X86-SSE1-NEXT: pushl {{[0-9]+}}(%esp) 2233; X86-SSE1-NEXT: calll memcmp 2234; X86-SSE1-NEXT: addl $16, %esp 2235; X86-SSE1-NEXT: testl %eax, %eax 2236; X86-SSE1-NEXT: setne %al 2237; X86-SSE1-NEXT: retl 2238; 2239; X86-SSE2-LABEL: length32_eq_const: 2240; X86-SSE2: # %bb.0: 2241; X86-SSE2-NEXT: movl {{[0-9]+}}(%esp), %eax 2242; X86-SSE2-NEXT: movdqu (%eax), %xmm0 2243; X86-SSE2-NEXT: movdqu 16(%eax), %xmm1 2244; X86-SSE2-NEXT: pcmpeqb {{\.LCPI.*}}, %xmm1 2245; X86-SSE2-NEXT: pcmpeqb {{\.LCPI.*}}, %xmm0 2246; X86-SSE2-NEXT: pand %xmm1, %xmm0 2247; X86-SSE2-NEXT: pmovmskb %xmm0, %eax 2248; X86-SSE2-NEXT: cmpl $65535, %eax # imm = 0xFFFF 2249; X86-SSE2-NEXT: setne %al 2250; X86-SSE2-NEXT: retl 2251; 2252; X86-SSE41-LABEL: length32_eq_const: 2253; X86-SSE41: # %bb.0: 2254; X86-SSE41-NEXT: movl {{[0-9]+}}(%esp), %eax 2255; X86-SSE41-NEXT: movdqu (%eax), %xmm0 2256; X86-SSE41-NEXT: movdqu 16(%eax), %xmm1 2257; X86-SSE41-NEXT: pxor {{\.LCPI.*}}, %xmm1 2258; X86-SSE41-NEXT: pxor {{\.LCPI.*}}, %xmm0 2259; X86-SSE41-NEXT: por %xmm1, %xmm0 2260; X86-SSE41-NEXT: ptest %xmm0, %xmm0 2261; X86-SSE41-NEXT: setne %al 2262; X86-SSE41-NEXT: retl 2263; 2264; X64-SSE2-LABEL: length32_eq_const: 2265; X64-SSE2: # %bb.0: 2266; X64-SSE2-NEXT: movdqu (%rdi), %xmm0 2267; X64-SSE2-NEXT: movdqu 16(%rdi), %xmm1 2268; X64-SSE2-NEXT: pcmpeqb {{.*}}(%rip), %xmm1 2269; X64-SSE2-NEXT: pcmpeqb {{.*}}(%rip), %xmm0 2270; X64-SSE2-NEXT: pand %xmm1, %xmm0 2271; X64-SSE2-NEXT: pmovmskb %xmm0, %eax 2272; X64-SSE2-NEXT: cmpl $65535, %eax # imm = 0xFFFF 2273; X64-SSE2-NEXT: setne %al 2274; X64-SSE2-NEXT: retq 2275; 2276; X64-SSE41-LABEL: length32_eq_const: 2277; X64-SSE41: # %bb.0: 2278; X64-SSE41-NEXT: movdqu (%rdi), %xmm0 2279; X64-SSE41-NEXT: movdqu 16(%rdi), %xmm1 2280; X64-SSE41-NEXT: pxor {{.*}}(%rip), %xmm1 2281; X64-SSE41-NEXT: pxor {{.*}}(%rip), %xmm0 2282; X64-SSE41-NEXT: por %xmm1, %xmm0 2283; X64-SSE41-NEXT: ptest %xmm0, %xmm0 2284; X64-SSE41-NEXT: setne %al 2285; X64-SSE41-NEXT: retq 2286; 2287; X64-AVX1-LABEL: length32_eq_const: 2288; X64-AVX1: # %bb.0: 2289; X64-AVX1-NEXT: vmovups (%rdi), %ymm0 2290; X64-AVX1-NEXT: vxorps {{.*}}(%rip), %ymm0, %ymm0 2291; X64-AVX1-NEXT: vptest %ymm0, %ymm0 2292; X64-AVX1-NEXT: setne %al 2293; X64-AVX1-NEXT: vzeroupper 2294; X64-AVX1-NEXT: retq 2295; 2296; X64-AVX2-LABEL: length32_eq_const: 2297; X64-AVX2: # %bb.0: 2298; X64-AVX2-NEXT: vmovdqu (%rdi), %ymm0 2299; X64-AVX2-NEXT: vpxor {{.*}}(%rip), %ymm0, %ymm0 2300; X64-AVX2-NEXT: vptest %ymm0, %ymm0 2301; X64-AVX2-NEXT: setne %al 2302; X64-AVX2-NEXT: vzeroupper 2303; X64-AVX2-NEXT: retq 2304; 2305; X64-AVX512-LABEL: length32_eq_const: 2306; X64-AVX512: # %bb.0: 2307; X64-AVX512-NEXT: vmovdqu (%rdi), %ymm0 2308; X64-AVX512-NEXT: vpxor {{.*}}(%rip), %ymm0, %ymm0 2309; X64-AVX512-NEXT: vptest %ymm0, %ymm0 2310; X64-AVX512-NEXT: setne %al 2311; X64-AVX512-NEXT: vzeroupper 2312; X64-AVX512-NEXT: retq 2313; 2314; X64-MIC-AVX-LABEL: length32_eq_const: 2315; X64-MIC-AVX: # %bb.0: 2316; X64-MIC-AVX-NEXT: vmovdqu (%rdi), %ymm0 2317; X64-MIC-AVX-NEXT: vmovdqa {{.*#+}} ymm1 = [858927408,926299444,825243960,892613426,959985462,858927408,926299444,825243960] 2318; X64-MIC-AVX-NEXT: vpcmpneqd %zmm1, %zmm0, %k0 2319; X64-MIC-AVX-NEXT: kortestw %k0, %k0 2320; X64-MIC-AVX-NEXT: setne %al 2321; X64-MIC-AVX-NEXT: vzeroupper 2322; X64-MIC-AVX-NEXT: retq 2323 %m = tail call i32 @memcmp(i8* %X, i8* getelementptr inbounds ([513 x i8], [513 x i8]* @.str, i32 0, i32 0), i64 32) nounwind 2324 %c = icmp ne i32 %m, 0 2325 ret i1 %c 2326} 2327 2328define i32 @length48(i8* %X, i8* %Y) nounwind { 2329; X86-LABEL: length48: 2330; X86: # %bb.0: 2331; X86-NEXT: pushl $0 2332; X86-NEXT: pushl $48 2333; X86-NEXT: pushl {{[0-9]+}}(%esp) 2334; X86-NEXT: pushl {{[0-9]+}}(%esp) 2335; X86-NEXT: calll memcmp 2336; X86-NEXT: addl $16, %esp 2337; X86-NEXT: retl 2338; 2339; X64-LABEL: length48: 2340; X64: # %bb.0: 2341; X64-NEXT: movl $48, %edx 2342; X64-NEXT: jmp memcmp # TAILCALL 2343 %m = tail call i32 @memcmp(i8* %X, i8* %Y, i64 48) nounwind 2344 ret i32 %m 2345} 2346 2347define i1 @length48_eq(i8* %x, i8* %y) nounwind { 2348; X86-LABEL: length48_eq: 2349; X86: # %bb.0: 2350; X86-NEXT: pushl $0 2351; X86-NEXT: pushl $48 2352; X86-NEXT: pushl {{[0-9]+}}(%esp) 2353; X86-NEXT: pushl {{[0-9]+}}(%esp) 2354; X86-NEXT: calll memcmp 2355; X86-NEXT: addl $16, %esp 2356; X86-NEXT: testl %eax, %eax 2357; X86-NEXT: sete %al 2358; X86-NEXT: retl 2359; 2360; X64-SSE-LABEL: length48_eq: 2361; X64-SSE: # %bb.0: 2362; X64-SSE-NEXT: pushq %rax 2363; X64-SSE-NEXT: movl $48, %edx 2364; X64-SSE-NEXT: callq memcmp 2365; X64-SSE-NEXT: testl %eax, %eax 2366; X64-SSE-NEXT: sete %al 2367; X64-SSE-NEXT: popq %rcx 2368; X64-SSE-NEXT: retq 2369; 2370; X64-AVX1-LABEL: length48_eq: 2371; X64-AVX1: # %bb.0: 2372; X64-AVX1-NEXT: vmovups (%rdi), %ymm0 2373; X64-AVX1-NEXT: vmovups 32(%rdi), %xmm1 2374; X64-AVX1-NEXT: vmovups 32(%rsi), %xmm2 2375; X64-AVX1-NEXT: vxorps (%rsi), %ymm0, %ymm0 2376; X64-AVX1-NEXT: vxorps %ymm2, %ymm1, %ymm1 2377; X64-AVX1-NEXT: vorps %ymm1, %ymm0, %ymm0 2378; X64-AVX1-NEXT: vptest %ymm0, %ymm0 2379; X64-AVX1-NEXT: sete %al 2380; X64-AVX1-NEXT: vzeroupper 2381; X64-AVX1-NEXT: retq 2382; 2383; X64-AVX2-LABEL: length48_eq: 2384; X64-AVX2: # %bb.0: 2385; X64-AVX2-NEXT: vmovdqu (%rdi), %ymm0 2386; X64-AVX2-NEXT: vmovdqu 32(%rdi), %xmm1 2387; X64-AVX2-NEXT: vmovdqu 32(%rsi), %xmm2 2388; X64-AVX2-NEXT: vpxor (%rsi), %ymm0, %ymm0 2389; X64-AVX2-NEXT: vpxor %ymm2, %ymm1, %ymm1 2390; X64-AVX2-NEXT: vpor %ymm1, %ymm0, %ymm0 2391; X64-AVX2-NEXT: vptest %ymm0, %ymm0 2392; X64-AVX2-NEXT: sete %al 2393; X64-AVX2-NEXT: vzeroupper 2394; X64-AVX2-NEXT: retq 2395; 2396; X64-AVX512-LABEL: length48_eq: 2397; X64-AVX512: # %bb.0: 2398; X64-AVX512-NEXT: vmovdqu (%rdi), %ymm0 2399; X64-AVX512-NEXT: vmovdqu 32(%rdi), %xmm1 2400; X64-AVX512-NEXT: vmovdqu 32(%rsi), %xmm2 2401; X64-AVX512-NEXT: vpxor (%rsi), %ymm0, %ymm0 2402; X64-AVX512-NEXT: vpxor %ymm2, %ymm1, %ymm1 2403; X64-AVX512-NEXT: vpor %ymm1, %ymm0, %ymm0 2404; X64-AVX512-NEXT: vptest %ymm0, %ymm0 2405; X64-AVX512-NEXT: sete %al 2406; X64-AVX512-NEXT: vzeroupper 2407; X64-AVX512-NEXT: retq 2408; 2409; X64-MIC-AVX-LABEL: length48_eq: 2410; X64-MIC-AVX: # %bb.0: 2411; X64-MIC-AVX-NEXT: vmovdqu (%rdi), %ymm0 2412; X64-MIC-AVX-NEXT: vmovdqu (%rsi), %ymm1 2413; X64-MIC-AVX-NEXT: vmovdqu 32(%rdi), %xmm2 2414; X64-MIC-AVX-NEXT: vmovdqu 32(%rsi), %xmm3 2415; X64-MIC-AVX-NEXT: vpcmpneqd %zmm3, %zmm2, %k0 2416; X64-MIC-AVX-NEXT: vpcmpneqd %zmm1, %zmm0, %k1 2417; X64-MIC-AVX-NEXT: kortestw %k0, %k1 2418; X64-MIC-AVX-NEXT: sete %al 2419; X64-MIC-AVX-NEXT: vzeroupper 2420; X64-MIC-AVX-NEXT: retq 2421 %call = tail call i32 @memcmp(i8* %x, i8* %y, i64 48) nounwind 2422 %cmp = icmp eq i32 %call, 0 2423 ret i1 %cmp 2424} 2425 2426define i1 @length48_lt(i8* %x, i8* %y) nounwind { 2427; X86-LABEL: length48_lt: 2428; X86: # %bb.0: 2429; X86-NEXT: pushl $0 2430; X86-NEXT: pushl $48 2431; X86-NEXT: pushl {{[0-9]+}}(%esp) 2432; X86-NEXT: pushl {{[0-9]+}}(%esp) 2433; X86-NEXT: calll memcmp 2434; X86-NEXT: addl $16, %esp 2435; X86-NEXT: shrl $31, %eax 2436; X86-NEXT: # kill: def $al killed $al killed $eax 2437; X86-NEXT: retl 2438; 2439; X64-LABEL: length48_lt: 2440; X64: # %bb.0: 2441; X64-NEXT: pushq %rax 2442; X64-NEXT: movl $48, %edx 2443; X64-NEXT: callq memcmp 2444; X64-NEXT: shrl $31, %eax 2445; X64-NEXT: # kill: def $al killed $al killed $eax 2446; X64-NEXT: popq %rcx 2447; X64-NEXT: retq 2448 %call = tail call i32 @memcmp(i8* %x, i8* %y, i64 48) nounwind 2449 %cmp = icmp slt i32 %call, 0 2450 ret i1 %cmp 2451} 2452 2453define i1 @length48_gt(i8* %x, i8* %y) nounwind { 2454; X86-LABEL: length48_gt: 2455; X86: # %bb.0: 2456; X86-NEXT: pushl $0 2457; X86-NEXT: pushl $48 2458; X86-NEXT: pushl {{[0-9]+}}(%esp) 2459; X86-NEXT: pushl {{[0-9]+}}(%esp) 2460; X86-NEXT: calll memcmp 2461; X86-NEXT: addl $16, %esp 2462; X86-NEXT: testl %eax, %eax 2463; X86-NEXT: setg %al 2464; X86-NEXT: retl 2465; 2466; X64-LABEL: length48_gt: 2467; X64: # %bb.0: 2468; X64-NEXT: pushq %rax 2469; X64-NEXT: movl $48, %edx 2470; X64-NEXT: callq memcmp 2471; X64-NEXT: testl %eax, %eax 2472; X64-NEXT: setg %al 2473; X64-NEXT: popq %rcx 2474; X64-NEXT: retq 2475 %call = tail call i32 @memcmp(i8* %x, i8* %y, i64 48) nounwind 2476 %cmp = icmp sgt i32 %call, 0 2477 ret i1 %cmp 2478} 2479 2480define i1 @length48_eq_prefer128(i8* %x, i8* %y) nounwind "prefer-vector-width"="128" { 2481; X86-LABEL: length48_eq_prefer128: 2482; X86: # %bb.0: 2483; X86-NEXT: pushl $0 2484; X86-NEXT: pushl $48 2485; X86-NEXT: pushl {{[0-9]+}}(%esp) 2486; X86-NEXT: pushl {{[0-9]+}}(%esp) 2487; X86-NEXT: calll memcmp 2488; X86-NEXT: addl $16, %esp 2489; X86-NEXT: testl %eax, %eax 2490; X86-NEXT: sete %al 2491; X86-NEXT: retl 2492; 2493; X64-LABEL: length48_eq_prefer128: 2494; X64: # %bb.0: 2495; X64-NEXT: pushq %rax 2496; X64-NEXT: movl $48, %edx 2497; X64-NEXT: callq memcmp 2498; X64-NEXT: testl %eax, %eax 2499; X64-NEXT: sete %al 2500; X64-NEXT: popq %rcx 2501; X64-NEXT: retq 2502 %call = tail call i32 @memcmp(i8* %x, i8* %y, i64 48) nounwind 2503 %cmp = icmp eq i32 %call, 0 2504 ret i1 %cmp 2505} 2506 2507define i1 @length48_eq_const(i8* %X) nounwind { 2508; X86-LABEL: length48_eq_const: 2509; X86: # %bb.0: 2510; X86-NEXT: pushl $0 2511; X86-NEXT: pushl $48 2512; X86-NEXT: pushl $.L.str 2513; X86-NEXT: pushl {{[0-9]+}}(%esp) 2514; X86-NEXT: calll memcmp 2515; X86-NEXT: addl $16, %esp 2516; X86-NEXT: testl %eax, %eax 2517; X86-NEXT: setne %al 2518; X86-NEXT: retl 2519; 2520; X64-SSE-LABEL: length48_eq_const: 2521; X64-SSE: # %bb.0: 2522; X64-SSE-NEXT: pushq %rax 2523; X64-SSE-NEXT: movl $.L.str, %esi 2524; X64-SSE-NEXT: movl $48, %edx 2525; X64-SSE-NEXT: callq memcmp 2526; X64-SSE-NEXT: testl %eax, %eax 2527; X64-SSE-NEXT: setne %al 2528; X64-SSE-NEXT: popq %rcx 2529; X64-SSE-NEXT: retq 2530; 2531; X64-AVX1-LABEL: length48_eq_const: 2532; X64-AVX1: # %bb.0: 2533; X64-AVX1-NEXT: vmovups (%rdi), %ymm0 2534; X64-AVX1-NEXT: vmovups 32(%rdi), %xmm1 2535; X64-AVX1-NEXT: vxorps {{.*}}(%rip), %ymm0, %ymm0 2536; X64-AVX1-NEXT: vxorps {{.*}}(%rip), %ymm1, %ymm1 2537; X64-AVX1-NEXT: vorps %ymm1, %ymm0, %ymm0 2538; X64-AVX1-NEXT: vptest %ymm0, %ymm0 2539; X64-AVX1-NEXT: setne %al 2540; X64-AVX1-NEXT: vzeroupper 2541; X64-AVX1-NEXT: retq 2542; 2543; X64-AVX2-LABEL: length48_eq_const: 2544; X64-AVX2: # %bb.0: 2545; X64-AVX2-NEXT: vmovdqu (%rdi), %ymm0 2546; X64-AVX2-NEXT: vmovdqu 32(%rdi), %xmm1 2547; X64-AVX2-NEXT: vpxor {{.*}}(%rip), %ymm0, %ymm0 2548; X64-AVX2-NEXT: vpxor {{.*}}(%rip), %ymm1, %ymm1 2549; X64-AVX2-NEXT: vpor %ymm1, %ymm0, %ymm0 2550; X64-AVX2-NEXT: vptest %ymm0, %ymm0 2551; X64-AVX2-NEXT: setne %al 2552; X64-AVX2-NEXT: vzeroupper 2553; X64-AVX2-NEXT: retq 2554; 2555; X64-AVX512-LABEL: length48_eq_const: 2556; X64-AVX512: # %bb.0: 2557; X64-AVX512-NEXT: vmovdqu (%rdi), %ymm0 2558; X64-AVX512-NEXT: vmovdqu 32(%rdi), %xmm1 2559; X64-AVX512-NEXT: vpxor {{.*}}(%rip), %ymm0, %ymm0 2560; X64-AVX512-NEXT: vpxor {{.*}}(%rip), %ymm1, %ymm1 2561; X64-AVX512-NEXT: vpor %ymm1, %ymm0, %ymm0 2562; X64-AVX512-NEXT: vptest %ymm0, %ymm0 2563; X64-AVX512-NEXT: setne %al 2564; X64-AVX512-NEXT: vzeroupper 2565; X64-AVX512-NEXT: retq 2566; 2567; X64-MIC-AVX-LABEL: length48_eq_const: 2568; X64-MIC-AVX: # %bb.0: 2569; X64-MIC-AVX-NEXT: vmovdqu (%rdi), %ymm0 2570; X64-MIC-AVX-NEXT: vmovdqu 32(%rdi), %xmm1 2571; X64-MIC-AVX-NEXT: vmovdqa {{.*#+}} ymm2 = [892613426,959985462,858927408,926299444,0,0,0,0] 2572; X64-MIC-AVX-NEXT: vpcmpneqd %zmm2, %zmm1, %k0 2573; X64-MIC-AVX-NEXT: vmovdqa {{.*#+}} ymm1 = [858927408,926299444,825243960,892613426,959985462,858927408,926299444,825243960] 2574; X64-MIC-AVX-NEXT: vpcmpneqd %zmm1, %zmm0, %k1 2575; X64-MIC-AVX-NEXT: kortestw %k0, %k1 2576; X64-MIC-AVX-NEXT: setne %al 2577; X64-MIC-AVX-NEXT: vzeroupper 2578; X64-MIC-AVX-NEXT: retq 2579 %m = tail call i32 @memcmp(i8* %X, i8* getelementptr inbounds ([513 x i8], [513 x i8]* @.str, i32 0, i32 0), i64 48) nounwind 2580 %c = icmp ne i32 %m, 0 2581 ret i1 %c 2582} 2583 2584define i32 @length63(i8* %X, i8* %Y) nounwind { 2585; X86-LABEL: length63: 2586; X86: # %bb.0: 2587; X86-NEXT: pushl $0 2588; X86-NEXT: pushl $63 2589; X86-NEXT: pushl {{[0-9]+}}(%esp) 2590; X86-NEXT: pushl {{[0-9]+}}(%esp) 2591; X86-NEXT: calll memcmp 2592; X86-NEXT: addl $16, %esp 2593; X86-NEXT: retl 2594; 2595; X64-LABEL: length63: 2596; X64: # %bb.0: 2597; X64-NEXT: movl $63, %edx 2598; X64-NEXT: jmp memcmp # TAILCALL 2599 %m = tail call i32 @memcmp(i8* %X, i8* %Y, i64 63) nounwind 2600 ret i32 %m 2601} 2602 2603define i1 @length63_eq(i8* %x, i8* %y) nounwind { 2604; X86-LABEL: length63_eq: 2605; X86: # %bb.0: 2606; X86-NEXT: pushl $0 2607; X86-NEXT: pushl $63 2608; X86-NEXT: pushl {{[0-9]+}}(%esp) 2609; X86-NEXT: pushl {{[0-9]+}}(%esp) 2610; X86-NEXT: calll memcmp 2611; X86-NEXT: addl $16, %esp 2612; X86-NEXT: testl %eax, %eax 2613; X86-NEXT: setne %al 2614; X86-NEXT: retl 2615; 2616; X64-SSE-LABEL: length63_eq: 2617; X64-SSE: # %bb.0: 2618; X64-SSE-NEXT: pushq %rax 2619; X64-SSE-NEXT: movl $63, %edx 2620; X64-SSE-NEXT: callq memcmp 2621; X64-SSE-NEXT: testl %eax, %eax 2622; X64-SSE-NEXT: setne %al 2623; X64-SSE-NEXT: popq %rcx 2624; X64-SSE-NEXT: retq 2625; 2626; X64-AVX1-LABEL: length63_eq: 2627; X64-AVX1: # %bb.0: 2628; X64-AVX1-NEXT: vmovups (%rdi), %ymm0 2629; X64-AVX1-NEXT: vmovups 31(%rdi), %ymm1 2630; X64-AVX1-NEXT: vxorps 31(%rsi), %ymm1, %ymm1 2631; X64-AVX1-NEXT: vxorps (%rsi), %ymm0, %ymm0 2632; X64-AVX1-NEXT: vorps %ymm1, %ymm0, %ymm0 2633; X64-AVX1-NEXT: vptest %ymm0, %ymm0 2634; X64-AVX1-NEXT: setne %al 2635; X64-AVX1-NEXT: vzeroupper 2636; X64-AVX1-NEXT: retq 2637; 2638; X64-AVX2-LABEL: length63_eq: 2639; X64-AVX2: # %bb.0: 2640; X64-AVX2-NEXT: vmovdqu (%rdi), %ymm0 2641; X64-AVX2-NEXT: vmovdqu 31(%rdi), %ymm1 2642; X64-AVX2-NEXT: vpxor 31(%rsi), %ymm1, %ymm1 2643; X64-AVX2-NEXT: vpxor (%rsi), %ymm0, %ymm0 2644; X64-AVX2-NEXT: vpor %ymm1, %ymm0, %ymm0 2645; X64-AVX2-NEXT: vptest %ymm0, %ymm0 2646; X64-AVX2-NEXT: setne %al 2647; X64-AVX2-NEXT: vzeroupper 2648; X64-AVX2-NEXT: retq 2649; 2650; X64-AVX512-LABEL: length63_eq: 2651; X64-AVX512: # %bb.0: 2652; X64-AVX512-NEXT: vmovdqu (%rdi), %ymm0 2653; X64-AVX512-NEXT: vmovdqu 31(%rdi), %ymm1 2654; X64-AVX512-NEXT: vpxor 31(%rsi), %ymm1, %ymm1 2655; X64-AVX512-NEXT: vpxor (%rsi), %ymm0, %ymm0 2656; X64-AVX512-NEXT: vpor %ymm1, %ymm0, %ymm0 2657; X64-AVX512-NEXT: vptest %ymm0, %ymm0 2658; X64-AVX512-NEXT: setne %al 2659; X64-AVX512-NEXT: vzeroupper 2660; X64-AVX512-NEXT: retq 2661; 2662; X64-MIC-AVX-LABEL: length63_eq: 2663; X64-MIC-AVX: # %bb.0: 2664; X64-MIC-AVX-NEXT: vmovdqu (%rdi), %ymm0 2665; X64-MIC-AVX-NEXT: vmovdqu 31(%rdi), %ymm1 2666; X64-MIC-AVX-NEXT: vmovdqu (%rsi), %ymm2 2667; X64-MIC-AVX-NEXT: vmovdqu 31(%rsi), %ymm3 2668; X64-MIC-AVX-NEXT: vpcmpneqd %zmm3, %zmm1, %k0 2669; X64-MIC-AVX-NEXT: vpcmpneqd %zmm2, %zmm0, %k1 2670; X64-MIC-AVX-NEXT: kortestw %k0, %k1 2671; X64-MIC-AVX-NEXT: setne %al 2672; X64-MIC-AVX-NEXT: vzeroupper 2673; X64-MIC-AVX-NEXT: retq 2674 %call = tail call i32 @memcmp(i8* %x, i8* %y, i64 63) nounwind 2675 %cmp = icmp ne i32 %call, 0 2676 ret i1 %cmp 2677} 2678 2679define i1 @length63_lt(i8* %x, i8* %y) nounwind { 2680; X86-LABEL: length63_lt: 2681; X86: # %bb.0: 2682; X86-NEXT: pushl $0 2683; X86-NEXT: pushl $63 2684; X86-NEXT: pushl {{[0-9]+}}(%esp) 2685; X86-NEXT: pushl {{[0-9]+}}(%esp) 2686; X86-NEXT: calll memcmp 2687; X86-NEXT: addl $16, %esp 2688; X86-NEXT: shrl $31, %eax 2689; X86-NEXT: # kill: def $al killed $al killed $eax 2690; X86-NEXT: retl 2691; 2692; X64-LABEL: length63_lt: 2693; X64: # %bb.0: 2694; X64-NEXT: pushq %rax 2695; X64-NEXT: movl $63, %edx 2696; X64-NEXT: callq memcmp 2697; X64-NEXT: shrl $31, %eax 2698; X64-NEXT: # kill: def $al killed $al killed $eax 2699; X64-NEXT: popq %rcx 2700; X64-NEXT: retq 2701 %call = tail call i32 @memcmp(i8* %x, i8* %y, i64 63) nounwind 2702 %cmp = icmp slt i32 %call, 0 2703 ret i1 %cmp 2704} 2705 2706define i1 @length63_gt(i8* %x, i8* %y) nounwind { 2707; X86-LABEL: length63_gt: 2708; X86: # %bb.0: 2709; X86-NEXT: pushl $0 2710; X86-NEXT: pushl $63 2711; X86-NEXT: pushl {{[0-9]+}}(%esp) 2712; X86-NEXT: pushl {{[0-9]+}}(%esp) 2713; X86-NEXT: calll memcmp 2714; X86-NEXT: addl $16, %esp 2715; X86-NEXT: testl %eax, %eax 2716; X86-NEXT: setg %al 2717; X86-NEXT: retl 2718; 2719; X64-LABEL: length63_gt: 2720; X64: # %bb.0: 2721; X64-NEXT: pushq %rax 2722; X64-NEXT: movl $63, %edx 2723; X64-NEXT: callq memcmp 2724; X64-NEXT: testl %eax, %eax 2725; X64-NEXT: setg %al 2726; X64-NEXT: popq %rcx 2727; X64-NEXT: retq 2728 %call = tail call i32 @memcmp(i8* %x, i8* %y, i64 63) nounwind 2729 %cmp = icmp sgt i32 %call, 0 2730 ret i1 %cmp 2731} 2732 2733define i1 @length63_eq_const(i8* %X) nounwind { 2734; X86-LABEL: length63_eq_const: 2735; X86: # %bb.0: 2736; X86-NEXT: pushl $0 2737; X86-NEXT: pushl $63 2738; X86-NEXT: pushl $.L.str 2739; X86-NEXT: pushl {{[0-9]+}}(%esp) 2740; X86-NEXT: calll memcmp 2741; X86-NEXT: addl $16, %esp 2742; X86-NEXT: testl %eax, %eax 2743; X86-NEXT: sete %al 2744; X86-NEXT: retl 2745; 2746; X64-SSE-LABEL: length63_eq_const: 2747; X64-SSE: # %bb.0: 2748; X64-SSE-NEXT: pushq %rax 2749; X64-SSE-NEXT: movl $.L.str, %esi 2750; X64-SSE-NEXT: movl $63, %edx 2751; X64-SSE-NEXT: callq memcmp 2752; X64-SSE-NEXT: testl %eax, %eax 2753; X64-SSE-NEXT: sete %al 2754; X64-SSE-NEXT: popq %rcx 2755; X64-SSE-NEXT: retq 2756; 2757; X64-AVX1-LABEL: length63_eq_const: 2758; X64-AVX1: # %bb.0: 2759; X64-AVX1-NEXT: vmovups (%rdi), %ymm0 2760; X64-AVX1-NEXT: vmovups 31(%rdi), %ymm1 2761; X64-AVX1-NEXT: vxorps {{.*}}(%rip), %ymm1, %ymm1 2762; X64-AVX1-NEXT: vxorps {{.*}}(%rip), %ymm0, %ymm0 2763; X64-AVX1-NEXT: vorps %ymm1, %ymm0, %ymm0 2764; X64-AVX1-NEXT: vptest %ymm0, %ymm0 2765; X64-AVX1-NEXT: sete %al 2766; X64-AVX1-NEXT: vzeroupper 2767; X64-AVX1-NEXT: retq 2768; 2769; X64-AVX2-LABEL: length63_eq_const: 2770; X64-AVX2: # %bb.0: 2771; X64-AVX2-NEXT: vmovdqu (%rdi), %ymm0 2772; X64-AVX2-NEXT: vmovdqu 31(%rdi), %ymm1 2773; X64-AVX2-NEXT: vpxor {{.*}}(%rip), %ymm1, %ymm1 2774; X64-AVX2-NEXT: vpxor {{.*}}(%rip), %ymm0, %ymm0 2775; X64-AVX2-NEXT: vpor %ymm1, %ymm0, %ymm0 2776; X64-AVX2-NEXT: vptest %ymm0, %ymm0 2777; X64-AVX2-NEXT: sete %al 2778; X64-AVX2-NEXT: vzeroupper 2779; X64-AVX2-NEXT: retq 2780; 2781; X64-AVX512-LABEL: length63_eq_const: 2782; X64-AVX512: # %bb.0: 2783; X64-AVX512-NEXT: vmovdqu (%rdi), %ymm0 2784; X64-AVX512-NEXT: vmovdqu 31(%rdi), %ymm1 2785; X64-AVX512-NEXT: vpxor {{.*}}(%rip), %ymm1, %ymm1 2786; X64-AVX512-NEXT: vpxor {{.*}}(%rip), %ymm0, %ymm0 2787; X64-AVX512-NEXT: vpor %ymm1, %ymm0, %ymm0 2788; X64-AVX512-NEXT: vptest %ymm0, %ymm0 2789; X64-AVX512-NEXT: sete %al 2790; X64-AVX512-NEXT: vzeroupper 2791; X64-AVX512-NEXT: retq 2792; 2793; X64-MIC-AVX-LABEL: length63_eq_const: 2794; X64-MIC-AVX: # %bb.0: 2795; X64-MIC-AVX-NEXT: vmovdqu (%rdi), %ymm0 2796; X64-MIC-AVX-NEXT: vmovdqu 31(%rdi), %ymm1 2797; X64-MIC-AVX-NEXT: vmovdqa {{.*#+}} ymm2 = [875770417,943142453,842084409,909456435,809056311,875770417,943142453,842084409] 2798; X64-MIC-AVX-NEXT: vpcmpneqd %zmm2, %zmm1, %k0 2799; X64-MIC-AVX-NEXT: vmovdqa {{.*#+}} ymm1 = [858927408,926299444,825243960,892613426,959985462,858927408,926299444,825243960] 2800; X64-MIC-AVX-NEXT: vpcmpneqd %zmm1, %zmm0, %k1 2801; X64-MIC-AVX-NEXT: kortestw %k0, %k1 2802; X64-MIC-AVX-NEXT: sete %al 2803; X64-MIC-AVX-NEXT: vzeroupper 2804; X64-MIC-AVX-NEXT: retq 2805 %m = tail call i32 @memcmp(i8* %X, i8* getelementptr inbounds ([513 x i8], [513 x i8]* @.str, i32 0, i32 0), i64 63) nounwind 2806 %c = icmp eq i32 %m, 0 2807 ret i1 %c 2808} 2809 2810define i32 @length64(i8* %X, i8* %Y) nounwind { 2811; X86-LABEL: length64: 2812; X86: # %bb.0: 2813; X86-NEXT: pushl $0 2814; X86-NEXT: pushl $64 2815; X86-NEXT: pushl {{[0-9]+}}(%esp) 2816; X86-NEXT: pushl {{[0-9]+}}(%esp) 2817; X86-NEXT: calll memcmp 2818; X86-NEXT: addl $16, %esp 2819; X86-NEXT: retl 2820; 2821; X64-LABEL: length64: 2822; X64: # %bb.0: 2823; X64-NEXT: movl $64, %edx 2824; X64-NEXT: jmp memcmp # TAILCALL 2825 %m = tail call i32 @memcmp(i8* %X, i8* %Y, i64 64) nounwind 2826 ret i32 %m 2827} 2828 2829define i1 @length64_eq(i8* %x, i8* %y) nounwind { 2830; X86-LABEL: length64_eq: 2831; X86: # %bb.0: 2832; X86-NEXT: pushl $0 2833; X86-NEXT: pushl $64 2834; X86-NEXT: pushl {{[0-9]+}}(%esp) 2835; X86-NEXT: pushl {{[0-9]+}}(%esp) 2836; X86-NEXT: calll memcmp 2837; X86-NEXT: addl $16, %esp 2838; X86-NEXT: testl %eax, %eax 2839; X86-NEXT: setne %al 2840; X86-NEXT: retl 2841; 2842; X64-SSE-LABEL: length64_eq: 2843; X64-SSE: # %bb.0: 2844; X64-SSE-NEXT: pushq %rax 2845; X64-SSE-NEXT: movl $64, %edx 2846; X64-SSE-NEXT: callq memcmp 2847; X64-SSE-NEXT: testl %eax, %eax 2848; X64-SSE-NEXT: setne %al 2849; X64-SSE-NEXT: popq %rcx 2850; X64-SSE-NEXT: retq 2851; 2852; X64-AVX1-LABEL: length64_eq: 2853; X64-AVX1: # %bb.0: 2854; X64-AVX1-NEXT: vmovups (%rdi), %ymm0 2855; X64-AVX1-NEXT: vmovups 32(%rdi), %ymm1 2856; X64-AVX1-NEXT: vxorps 32(%rsi), %ymm1, %ymm1 2857; X64-AVX1-NEXT: vxorps (%rsi), %ymm0, %ymm0 2858; X64-AVX1-NEXT: vorps %ymm1, %ymm0, %ymm0 2859; X64-AVX1-NEXT: vptest %ymm0, %ymm0 2860; X64-AVX1-NEXT: setne %al 2861; X64-AVX1-NEXT: vzeroupper 2862; X64-AVX1-NEXT: retq 2863; 2864; X64-AVX2-LABEL: length64_eq: 2865; X64-AVX2: # %bb.0: 2866; X64-AVX2-NEXT: vmovdqu (%rdi), %ymm0 2867; X64-AVX2-NEXT: vmovdqu 32(%rdi), %ymm1 2868; X64-AVX2-NEXT: vpxor 32(%rsi), %ymm1, %ymm1 2869; X64-AVX2-NEXT: vpxor (%rsi), %ymm0, %ymm0 2870; X64-AVX2-NEXT: vpor %ymm1, %ymm0, %ymm0 2871; X64-AVX2-NEXT: vptest %ymm0, %ymm0 2872; X64-AVX2-NEXT: setne %al 2873; X64-AVX2-NEXT: vzeroupper 2874; X64-AVX2-NEXT: retq 2875; 2876; X64-AVX512BW-LABEL: length64_eq: 2877; X64-AVX512BW: # %bb.0: 2878; X64-AVX512BW-NEXT: vmovdqu64 (%rdi), %zmm0 2879; X64-AVX512BW-NEXT: vpcmpneqb (%rsi), %zmm0, %k0 2880; X64-AVX512BW-NEXT: kortestq %k0, %k0 2881; X64-AVX512BW-NEXT: setne %al 2882; X64-AVX512BW-NEXT: vzeroupper 2883; X64-AVX512BW-NEXT: retq 2884; 2885; X64-AVX512F-LABEL: length64_eq: 2886; X64-AVX512F: # %bb.0: 2887; X64-AVX512F-NEXT: vmovdqu64 (%rdi), %zmm0 2888; X64-AVX512F-NEXT: vpcmpneqd (%rsi), %zmm0, %k0 2889; X64-AVX512F-NEXT: kortestw %k0, %k0 2890; X64-AVX512F-NEXT: setne %al 2891; X64-AVX512F-NEXT: vzeroupper 2892; X64-AVX512F-NEXT: retq 2893; 2894; X64-MIC-AVX2-LABEL: length64_eq: 2895; X64-MIC-AVX2: # %bb.0: 2896; X64-MIC-AVX2-NEXT: vmovdqu (%rdi), %ymm0 2897; X64-MIC-AVX2-NEXT: vmovdqu 32(%rdi), %ymm1 2898; X64-MIC-AVX2-NEXT: vmovdqu (%rsi), %ymm2 2899; X64-MIC-AVX2-NEXT: vmovdqu 32(%rsi), %ymm3 2900; X64-MIC-AVX2-NEXT: vpcmpneqd %zmm3, %zmm1, %k0 2901; X64-MIC-AVX2-NEXT: vpcmpneqd %zmm2, %zmm0, %k1 2902; X64-MIC-AVX2-NEXT: kortestw %k0, %k1 2903; X64-MIC-AVX2-NEXT: setne %al 2904; X64-MIC-AVX2-NEXT: vzeroupper 2905; X64-MIC-AVX2-NEXT: retq 2906; 2907; X64-MIC-AVX512F-LABEL: length64_eq: 2908; X64-MIC-AVX512F: # %bb.0: 2909; X64-MIC-AVX512F-NEXT: vmovdqu64 (%rdi), %zmm0 2910; X64-MIC-AVX512F-NEXT: vpcmpneqd (%rsi), %zmm0, %k0 2911; X64-MIC-AVX512F-NEXT: kortestw %k0, %k0 2912; X64-MIC-AVX512F-NEXT: setne %al 2913; X64-MIC-AVX512F-NEXT: vzeroupper 2914; X64-MIC-AVX512F-NEXT: retq 2915 %call = tail call i32 @memcmp(i8* %x, i8* %y, i64 64) nounwind 2916 %cmp = icmp ne i32 %call, 0 2917 ret i1 %cmp 2918} 2919 2920define i1 @length64_lt(i8* %x, i8* %y) nounwind { 2921; X86-LABEL: length64_lt: 2922; X86: # %bb.0: 2923; X86-NEXT: pushl $0 2924; X86-NEXT: pushl $64 2925; X86-NEXT: pushl {{[0-9]+}}(%esp) 2926; X86-NEXT: pushl {{[0-9]+}}(%esp) 2927; X86-NEXT: calll memcmp 2928; X86-NEXT: addl $16, %esp 2929; X86-NEXT: shrl $31, %eax 2930; X86-NEXT: # kill: def $al killed $al killed $eax 2931; X86-NEXT: retl 2932; 2933; X64-LABEL: length64_lt: 2934; X64: # %bb.0: 2935; X64-NEXT: pushq %rax 2936; X64-NEXT: movl $64, %edx 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(i8* %x, i8* %y, i64 64) nounwind 2943 %cmp = icmp slt i32 %call, 0 2944 ret i1 %cmp 2945} 2946 2947define i1 @length64_gt(i8* %x, i8* %y) nounwind { 2948; X86-LABEL: length64_gt: 2949; X86: # %bb.0: 2950; X86-NEXT: pushl $0 2951; X86-NEXT: pushl $64 2952; X86-NEXT: pushl {{[0-9]+}}(%esp) 2953; X86-NEXT: pushl {{[0-9]+}}(%esp) 2954; X86-NEXT: calll memcmp 2955; X86-NEXT: addl $16, %esp 2956; X86-NEXT: testl %eax, %eax 2957; X86-NEXT: setg %al 2958; X86-NEXT: retl 2959; 2960; X64-LABEL: length64_gt: 2961; X64: # %bb.0: 2962; X64-NEXT: pushq %rax 2963; X64-NEXT: movl $64, %edx 2964; X64-NEXT: callq memcmp 2965; X64-NEXT: testl %eax, %eax 2966; X64-NEXT: setg %al 2967; X64-NEXT: popq %rcx 2968; X64-NEXT: retq 2969 %call = tail call i32 @memcmp(i8* %x, i8* %y, i64 64) nounwind 2970 %cmp = icmp sgt i32 %call, 0 2971 ret i1 %cmp 2972} 2973 2974define i1 @length64_eq_const(i8* %X) nounwind { 2975; X86-LABEL: length64_eq_const: 2976; X86: # %bb.0: 2977; X86-NEXT: pushl $0 2978; X86-NEXT: pushl $64 2979; X86-NEXT: pushl $.L.str 2980; X86-NEXT: pushl {{[0-9]+}}(%esp) 2981; X86-NEXT: calll memcmp 2982; X86-NEXT: addl $16, %esp 2983; X86-NEXT: testl %eax, %eax 2984; X86-NEXT: sete %al 2985; X86-NEXT: retl 2986; 2987; X64-SSE-LABEL: length64_eq_const: 2988; X64-SSE: # %bb.0: 2989; X64-SSE-NEXT: pushq %rax 2990; X64-SSE-NEXT: movl $.L.str, %esi 2991; X64-SSE-NEXT: movl $64, %edx 2992; X64-SSE-NEXT: callq memcmp 2993; X64-SSE-NEXT: testl %eax, %eax 2994; X64-SSE-NEXT: sete %al 2995; X64-SSE-NEXT: popq %rcx 2996; X64-SSE-NEXT: retq 2997; 2998; X64-AVX1-LABEL: length64_eq_const: 2999; X64-AVX1: # %bb.0: 3000; X64-AVX1-NEXT: vmovups (%rdi), %ymm0 3001; X64-AVX1-NEXT: vmovups 32(%rdi), %ymm1 3002; X64-AVX1-NEXT: vxorps {{.*}}(%rip), %ymm1, %ymm1 3003; X64-AVX1-NEXT: vxorps {{.*}}(%rip), %ymm0, %ymm0 3004; X64-AVX1-NEXT: vorps %ymm1, %ymm0, %ymm0 3005; X64-AVX1-NEXT: vptest %ymm0, %ymm0 3006; X64-AVX1-NEXT: sete %al 3007; X64-AVX1-NEXT: vzeroupper 3008; X64-AVX1-NEXT: retq 3009; 3010; X64-AVX2-LABEL: length64_eq_const: 3011; X64-AVX2: # %bb.0: 3012; X64-AVX2-NEXT: vmovdqu (%rdi), %ymm0 3013; X64-AVX2-NEXT: vmovdqu 32(%rdi), %ymm1 3014; X64-AVX2-NEXT: vpxor {{.*}}(%rip), %ymm1, %ymm1 3015; X64-AVX2-NEXT: vpxor {{.*}}(%rip), %ymm0, %ymm0 3016; X64-AVX2-NEXT: vpor %ymm1, %ymm0, %ymm0 3017; X64-AVX2-NEXT: vptest %ymm0, %ymm0 3018; X64-AVX2-NEXT: sete %al 3019; X64-AVX2-NEXT: vzeroupper 3020; X64-AVX2-NEXT: retq 3021; 3022; X64-AVX512BW-LABEL: length64_eq_const: 3023; X64-AVX512BW: # %bb.0: 3024; X64-AVX512BW-NEXT: vmovdqu64 (%rdi), %zmm0 3025; X64-AVX512BW-NEXT: vpcmpneqb {{.*}}(%rip), %zmm0, %k0 3026; X64-AVX512BW-NEXT: kortestq %k0, %k0 3027; X64-AVX512BW-NEXT: sete %al 3028; X64-AVX512BW-NEXT: vzeroupper 3029; X64-AVX512BW-NEXT: retq 3030; 3031; X64-AVX512F-LABEL: length64_eq_const: 3032; X64-AVX512F: # %bb.0: 3033; X64-AVX512F-NEXT: vmovdqu64 (%rdi), %zmm0 3034; X64-AVX512F-NEXT: vpcmpneqd {{.*}}(%rip), %zmm0, %k0 3035; X64-AVX512F-NEXT: kortestw %k0, %k0 3036; X64-AVX512F-NEXT: sete %al 3037; X64-AVX512F-NEXT: vzeroupper 3038; X64-AVX512F-NEXT: retq 3039; 3040; X64-MIC-AVX2-LABEL: length64_eq_const: 3041; X64-MIC-AVX2: # %bb.0: 3042; X64-MIC-AVX2-NEXT: vmovdqu (%rdi), %ymm0 3043; X64-MIC-AVX2-NEXT: vmovdqu 32(%rdi), %ymm1 3044; X64-MIC-AVX2-NEXT: vmovdqa {{.*#+}} ymm2 = [892613426,959985462,858927408,926299444,825243960,892613426,959985462,858927408] 3045; X64-MIC-AVX2-NEXT: vpcmpneqd %zmm2, %zmm1, %k0 3046; X64-MIC-AVX2-NEXT: vmovdqa {{.*#+}} ymm1 = [858927408,926299444,825243960,892613426,959985462,858927408,926299444,825243960] 3047; X64-MIC-AVX2-NEXT: vpcmpneqd %zmm1, %zmm0, %k1 3048; X64-MIC-AVX2-NEXT: kortestw %k0, %k1 3049; X64-MIC-AVX2-NEXT: sete %al 3050; X64-MIC-AVX2-NEXT: vzeroupper 3051; X64-MIC-AVX2-NEXT: retq 3052; 3053; X64-MIC-AVX512F-LABEL: length64_eq_const: 3054; X64-MIC-AVX512F: # %bb.0: 3055; X64-MIC-AVX512F-NEXT: vmovdqu64 (%rdi), %zmm0 3056; X64-MIC-AVX512F-NEXT: vpcmpneqd {{.*}}(%rip), %zmm0, %k0 3057; X64-MIC-AVX512F-NEXT: kortestw %k0, %k0 3058; X64-MIC-AVX512F-NEXT: sete %al 3059; X64-MIC-AVX512F-NEXT: vzeroupper 3060; X64-MIC-AVX512F-NEXT: retq 3061 %m = tail call i32 @memcmp(i8* %X, i8* getelementptr inbounds ([513 x i8], [513 x i8]* @.str, i32 0, i32 0), i64 64) nounwind 3062 %c = icmp eq i32 %m, 0 3063 ret i1 %c 3064} 3065 3066define i32 @length96(i8* %X, i8* %Y) nounwind { 3067; X86-LABEL: length96: 3068; X86: # %bb.0: 3069; X86-NEXT: pushl $0 3070; X86-NEXT: pushl $96 3071; X86-NEXT: pushl {{[0-9]+}}(%esp) 3072; X86-NEXT: pushl {{[0-9]+}}(%esp) 3073; X86-NEXT: calll memcmp 3074; X86-NEXT: addl $16, %esp 3075; X86-NEXT: retl 3076; 3077; X64-LABEL: length96: 3078; X64: # %bb.0: 3079; X64-NEXT: movl $96, %edx 3080; X64-NEXT: jmp memcmp # TAILCALL 3081 %m = tail call i32 @memcmp(i8* %X, i8* %Y, i64 96) nounwind 3082 ret i32 %m 3083} 3084 3085define i1 @length96_eq(i8* %x, i8* %y) nounwind { 3086; X86-LABEL: length96_eq: 3087; X86: # %bb.0: 3088; X86-NEXT: pushl $0 3089; X86-NEXT: pushl $96 3090; X86-NEXT: pushl {{[0-9]+}}(%esp) 3091; X86-NEXT: pushl {{[0-9]+}}(%esp) 3092; X86-NEXT: calll memcmp 3093; X86-NEXT: addl $16, %esp 3094; X86-NEXT: testl %eax, %eax 3095; X86-NEXT: setne %al 3096; X86-NEXT: retl 3097; 3098; X64-SSE-LABEL: length96_eq: 3099; X64-SSE: # %bb.0: 3100; X64-SSE-NEXT: pushq %rax 3101; X64-SSE-NEXT: movl $96, %edx 3102; X64-SSE-NEXT: callq memcmp 3103; X64-SSE-NEXT: testl %eax, %eax 3104; X64-SSE-NEXT: setne %al 3105; X64-SSE-NEXT: popq %rcx 3106; X64-SSE-NEXT: retq 3107; 3108; X64-AVX1-LABEL: length96_eq: 3109; X64-AVX1: # %bb.0: 3110; X64-AVX1-NEXT: pushq %rax 3111; X64-AVX1-NEXT: movl $96, %edx 3112; X64-AVX1-NEXT: callq memcmp 3113; X64-AVX1-NEXT: testl %eax, %eax 3114; X64-AVX1-NEXT: setne %al 3115; X64-AVX1-NEXT: popq %rcx 3116; X64-AVX1-NEXT: retq 3117; 3118; X64-AVX2-LABEL: length96_eq: 3119; X64-AVX2: # %bb.0: 3120; X64-AVX2-NEXT: pushq %rax 3121; X64-AVX2-NEXT: movl $96, %edx 3122; X64-AVX2-NEXT: callq memcmp 3123; X64-AVX2-NEXT: testl %eax, %eax 3124; X64-AVX2-NEXT: setne %al 3125; X64-AVX2-NEXT: popq %rcx 3126; X64-AVX2-NEXT: retq 3127; 3128; X64-AVX512BW-LABEL: length96_eq: 3129; X64-AVX512BW: # %bb.0: 3130; X64-AVX512BW-NEXT: vmovdqu64 (%rdi), %zmm0 3131; X64-AVX512BW-NEXT: vmovdqu 64(%rdi), %ymm1 3132; X64-AVX512BW-NEXT: vmovdqu 64(%rsi), %ymm2 3133; X64-AVX512BW-NEXT: vpcmpneqb (%rsi), %zmm0, %k0 3134; X64-AVX512BW-NEXT: vpcmpneqb %zmm2, %zmm1, %k1 3135; X64-AVX512BW-NEXT: kortestq %k1, %k0 3136; X64-AVX512BW-NEXT: setne %al 3137; X64-AVX512BW-NEXT: vzeroupper 3138; X64-AVX512BW-NEXT: retq 3139; 3140; X64-AVX512F-LABEL: length96_eq: 3141; X64-AVX512F: # %bb.0: 3142; X64-AVX512F-NEXT: vmovdqu64 (%rdi), %zmm0 3143; X64-AVX512F-NEXT: vmovdqu 64(%rdi), %ymm1 3144; X64-AVX512F-NEXT: vmovdqu 64(%rsi), %ymm2 3145; X64-AVX512F-NEXT: vpcmpneqd (%rsi), %zmm0, %k0 3146; X64-AVX512F-NEXT: vpcmpneqd %zmm2, %zmm1, %k1 3147; X64-AVX512F-NEXT: kortestw %k1, %k0 3148; X64-AVX512F-NEXT: setne %al 3149; X64-AVX512F-NEXT: vzeroupper 3150; X64-AVX512F-NEXT: retq 3151; 3152; X64-MIC-AVX2-LABEL: length96_eq: 3153; X64-MIC-AVX2: # %bb.0: 3154; X64-MIC-AVX2-NEXT: pushq %rax 3155; X64-MIC-AVX2-NEXT: movl $96, %edx 3156; X64-MIC-AVX2-NEXT: callq memcmp 3157; X64-MIC-AVX2-NEXT: testl %eax, %eax 3158; X64-MIC-AVX2-NEXT: setne %al 3159; X64-MIC-AVX2-NEXT: popq %rcx 3160; X64-MIC-AVX2-NEXT: retq 3161; 3162; X64-MIC-AVX512F-LABEL: length96_eq: 3163; X64-MIC-AVX512F: # %bb.0: 3164; X64-MIC-AVX512F-NEXT: vmovdqu64 (%rdi), %zmm0 3165; X64-MIC-AVX512F-NEXT: vmovdqu 64(%rdi), %ymm1 3166; X64-MIC-AVX512F-NEXT: vmovdqu 64(%rsi), %ymm2 3167; X64-MIC-AVX512F-NEXT: vpcmpneqd (%rsi), %zmm0, %k0 3168; X64-MIC-AVX512F-NEXT: vpcmpneqd %zmm2, %zmm1, %k1 3169; X64-MIC-AVX512F-NEXT: kortestw %k1, %k0 3170; X64-MIC-AVX512F-NEXT: setne %al 3171; X64-MIC-AVX512F-NEXT: vzeroupper 3172; X64-MIC-AVX512F-NEXT: retq 3173 %call = tail call i32 @memcmp(i8* %x, i8* %y, i64 96) nounwind 3174 %cmp = icmp ne i32 %call, 0 3175 ret i1 %cmp 3176} 3177 3178define i1 @length96_lt(i8* %x, i8* %y) nounwind { 3179; X86-LABEL: length96_lt: 3180; X86: # %bb.0: 3181; X86-NEXT: pushl $0 3182; X86-NEXT: pushl $96 3183; X86-NEXT: pushl {{[0-9]+}}(%esp) 3184; X86-NEXT: pushl {{[0-9]+}}(%esp) 3185; X86-NEXT: calll memcmp 3186; X86-NEXT: addl $16, %esp 3187; X86-NEXT: shrl $31, %eax 3188; X86-NEXT: # kill: def $al killed $al killed $eax 3189; X86-NEXT: retl 3190; 3191; X64-LABEL: length96_lt: 3192; X64: # %bb.0: 3193; X64-NEXT: pushq %rax 3194; X64-NEXT: movl $96, %edx 3195; X64-NEXT: callq memcmp 3196; X64-NEXT: shrl $31, %eax 3197; X64-NEXT: # kill: def $al killed $al killed $eax 3198; X64-NEXT: popq %rcx 3199; X64-NEXT: retq 3200 %call = tail call i32 @memcmp(i8* %x, i8* %y, i64 96) nounwind 3201 %cmp = icmp slt i32 %call, 0 3202 ret i1 %cmp 3203} 3204 3205define i1 @length96_gt(i8* %x, i8* %y) nounwind { 3206; X86-LABEL: length96_gt: 3207; X86: # %bb.0: 3208; X86-NEXT: pushl $0 3209; X86-NEXT: pushl $96 3210; X86-NEXT: pushl {{[0-9]+}}(%esp) 3211; X86-NEXT: pushl {{[0-9]+}}(%esp) 3212; X86-NEXT: calll memcmp 3213; X86-NEXT: addl $16, %esp 3214; X86-NEXT: testl %eax, %eax 3215; X86-NEXT: setg %al 3216; X86-NEXT: retl 3217; 3218; X64-LABEL: length96_gt: 3219; X64: # %bb.0: 3220; X64-NEXT: pushq %rax 3221; X64-NEXT: movl $96, %edx 3222; X64-NEXT: callq memcmp 3223; X64-NEXT: testl %eax, %eax 3224; X64-NEXT: setg %al 3225; X64-NEXT: popq %rcx 3226; X64-NEXT: retq 3227 %call = tail call i32 @memcmp(i8* %x, i8* %y, i64 96) nounwind 3228 %cmp = icmp sgt i32 %call, 0 3229 ret i1 %cmp 3230} 3231 3232define i1 @length96_eq_const(i8* %X) nounwind { 3233; X86-LABEL: length96_eq_const: 3234; X86: # %bb.0: 3235; X86-NEXT: pushl $0 3236; X86-NEXT: pushl $96 3237; X86-NEXT: pushl $.L.str 3238; X86-NEXT: pushl {{[0-9]+}}(%esp) 3239; X86-NEXT: calll memcmp 3240; X86-NEXT: addl $16, %esp 3241; X86-NEXT: testl %eax, %eax 3242; X86-NEXT: sete %al 3243; X86-NEXT: retl 3244; 3245; X64-SSE-LABEL: length96_eq_const: 3246; X64-SSE: # %bb.0: 3247; X64-SSE-NEXT: pushq %rax 3248; X64-SSE-NEXT: movl $.L.str, %esi 3249; X64-SSE-NEXT: movl $96, %edx 3250; X64-SSE-NEXT: callq memcmp 3251; X64-SSE-NEXT: testl %eax, %eax 3252; X64-SSE-NEXT: sete %al 3253; X64-SSE-NEXT: popq %rcx 3254; X64-SSE-NEXT: retq 3255; 3256; X64-AVX1-LABEL: length96_eq_const: 3257; X64-AVX1: # %bb.0: 3258; X64-AVX1-NEXT: pushq %rax 3259; X64-AVX1-NEXT: movl $.L.str, %esi 3260; X64-AVX1-NEXT: movl $96, %edx 3261; X64-AVX1-NEXT: callq memcmp 3262; X64-AVX1-NEXT: testl %eax, %eax 3263; X64-AVX1-NEXT: sete %al 3264; X64-AVX1-NEXT: popq %rcx 3265; X64-AVX1-NEXT: retq 3266; 3267; X64-AVX2-LABEL: length96_eq_const: 3268; X64-AVX2: # %bb.0: 3269; X64-AVX2-NEXT: pushq %rax 3270; X64-AVX2-NEXT: movl $.L.str, %esi 3271; X64-AVX2-NEXT: movl $96, %edx 3272; X64-AVX2-NEXT: callq memcmp 3273; X64-AVX2-NEXT: testl %eax, %eax 3274; X64-AVX2-NEXT: sete %al 3275; X64-AVX2-NEXT: popq %rcx 3276; X64-AVX2-NEXT: retq 3277; 3278; X64-AVX512BW-LABEL: length96_eq_const: 3279; X64-AVX512BW: # %bb.0: 3280; X64-AVX512BW-NEXT: vmovdqu64 (%rdi), %zmm0 3281; X64-AVX512BW-NEXT: vmovdqu 64(%rdi), %ymm1 3282; X64-AVX512BW-NEXT: vpcmpneqb {{.*}}(%rip), %zmm0, %k0 3283; X64-AVX512BW-NEXT: vpcmpneqb {{.*}}(%rip), %zmm1, %k1 3284; X64-AVX512BW-NEXT: kortestq %k1, %k0 3285; X64-AVX512BW-NEXT: sete %al 3286; X64-AVX512BW-NEXT: vzeroupper 3287; X64-AVX512BW-NEXT: retq 3288; 3289; X64-AVX512F-LABEL: length96_eq_const: 3290; X64-AVX512F: # %bb.0: 3291; X64-AVX512F-NEXT: vmovdqu64 (%rdi), %zmm0 3292; X64-AVX512F-NEXT: vmovdqu 64(%rdi), %ymm1 3293; X64-AVX512F-NEXT: vpcmpneqd {{.*}}(%rip), %zmm0, %k0 3294; X64-AVX512F-NEXT: vpcmpneqd {{.*}}(%rip), %zmm1, %k1 3295; X64-AVX512F-NEXT: kortestw %k1, %k0 3296; X64-AVX512F-NEXT: sete %al 3297; X64-AVX512F-NEXT: vzeroupper 3298; X64-AVX512F-NEXT: retq 3299; 3300; X64-MIC-AVX2-LABEL: length96_eq_const: 3301; X64-MIC-AVX2: # %bb.0: 3302; X64-MIC-AVX2-NEXT: pushq %rax 3303; X64-MIC-AVX2-NEXT: movl $.L.str, %esi 3304; X64-MIC-AVX2-NEXT: movl $96, %edx 3305; X64-MIC-AVX2-NEXT: callq memcmp 3306; X64-MIC-AVX2-NEXT: testl %eax, %eax 3307; X64-MIC-AVX2-NEXT: sete %al 3308; X64-MIC-AVX2-NEXT: popq %rcx 3309; X64-MIC-AVX2-NEXT: retq 3310; 3311; X64-MIC-AVX512F-LABEL: length96_eq_const: 3312; X64-MIC-AVX512F: # %bb.0: 3313; X64-MIC-AVX512F-NEXT: vmovdqu64 (%rdi), %zmm0 3314; X64-MIC-AVX512F-NEXT: vmovdqu 64(%rdi), %ymm1 3315; X64-MIC-AVX512F-NEXT: vpcmpneqd {{.*}}(%rip), %zmm0, %k0 3316; X64-MIC-AVX512F-NEXT: vpcmpneqd {{.*}}(%rip), %zmm1, %k1 3317; X64-MIC-AVX512F-NEXT: kortestw %k1, %k0 3318; X64-MIC-AVX512F-NEXT: sete %al 3319; X64-MIC-AVX512F-NEXT: vzeroupper 3320; X64-MIC-AVX512F-NEXT: retq 3321 %m = tail call i32 @memcmp(i8* %X, i8* getelementptr inbounds ([513 x i8], [513 x i8]* @.str, i32 0, i32 0), i64 96) nounwind 3322 %c = icmp eq i32 %m, 0 3323 ret i1 %c 3324} 3325 3326define i32 @length127(i8* %X, i8* %Y) nounwind { 3327; X86-LABEL: length127: 3328; X86: # %bb.0: 3329; X86-NEXT: pushl $0 3330; X86-NEXT: pushl $127 3331; X86-NEXT: pushl {{[0-9]+}}(%esp) 3332; X86-NEXT: pushl {{[0-9]+}}(%esp) 3333; X86-NEXT: calll memcmp 3334; X86-NEXT: addl $16, %esp 3335; X86-NEXT: retl 3336; 3337; X64-LABEL: length127: 3338; X64: # %bb.0: 3339; X64-NEXT: movl $127, %edx 3340; X64-NEXT: jmp memcmp # TAILCALL 3341 %m = tail call i32 @memcmp(i8* %X, i8* %Y, i64 127) nounwind 3342 ret i32 %m 3343} 3344 3345define i1 @length127_eq(i8* %x, i8* %y) nounwind { 3346; X86-LABEL: length127_eq: 3347; X86: # %bb.0: 3348; X86-NEXT: pushl $0 3349; X86-NEXT: pushl $127 3350; X86-NEXT: pushl {{[0-9]+}}(%esp) 3351; X86-NEXT: pushl {{[0-9]+}}(%esp) 3352; X86-NEXT: calll memcmp 3353; X86-NEXT: addl $16, %esp 3354; X86-NEXT: testl %eax, %eax 3355; X86-NEXT: setne %al 3356; X86-NEXT: retl 3357; 3358; X64-SSE-LABEL: length127_eq: 3359; X64-SSE: # %bb.0: 3360; X64-SSE-NEXT: pushq %rax 3361; X64-SSE-NEXT: movl $127, %edx 3362; X64-SSE-NEXT: callq memcmp 3363; X64-SSE-NEXT: testl %eax, %eax 3364; X64-SSE-NEXT: setne %al 3365; X64-SSE-NEXT: popq %rcx 3366; X64-SSE-NEXT: retq 3367; 3368; X64-AVX1-LABEL: length127_eq: 3369; X64-AVX1: # %bb.0: 3370; X64-AVX1-NEXT: pushq %rax 3371; X64-AVX1-NEXT: movl $127, %edx 3372; X64-AVX1-NEXT: callq memcmp 3373; X64-AVX1-NEXT: testl %eax, %eax 3374; X64-AVX1-NEXT: setne %al 3375; X64-AVX1-NEXT: popq %rcx 3376; X64-AVX1-NEXT: retq 3377; 3378; X64-AVX2-LABEL: length127_eq: 3379; X64-AVX2: # %bb.0: 3380; X64-AVX2-NEXT: pushq %rax 3381; X64-AVX2-NEXT: movl $127, %edx 3382; X64-AVX2-NEXT: callq memcmp 3383; X64-AVX2-NEXT: testl %eax, %eax 3384; X64-AVX2-NEXT: setne %al 3385; X64-AVX2-NEXT: popq %rcx 3386; X64-AVX2-NEXT: retq 3387; 3388; X64-AVX512BW-LABEL: length127_eq: 3389; X64-AVX512BW: # %bb.0: 3390; X64-AVX512BW-NEXT: vmovdqu64 (%rdi), %zmm0 3391; X64-AVX512BW-NEXT: vmovdqu64 63(%rdi), %zmm1 3392; X64-AVX512BW-NEXT: vpcmpneqb 63(%rsi), %zmm1, %k0 3393; X64-AVX512BW-NEXT: vpcmpneqb (%rsi), %zmm0, %k1 3394; X64-AVX512BW-NEXT: kortestq %k0, %k1 3395; X64-AVX512BW-NEXT: setne %al 3396; X64-AVX512BW-NEXT: vzeroupper 3397; X64-AVX512BW-NEXT: retq 3398; 3399; X64-AVX512F-LABEL: length127_eq: 3400; X64-AVX512F: # %bb.0: 3401; X64-AVX512F-NEXT: vmovdqu64 (%rdi), %zmm0 3402; X64-AVX512F-NEXT: vmovdqu64 63(%rdi), %zmm1 3403; X64-AVX512F-NEXT: vpcmpneqd 63(%rsi), %zmm1, %k0 3404; X64-AVX512F-NEXT: vpcmpneqd (%rsi), %zmm0, %k1 3405; X64-AVX512F-NEXT: kortestw %k0, %k1 3406; X64-AVX512F-NEXT: setne %al 3407; X64-AVX512F-NEXT: vzeroupper 3408; X64-AVX512F-NEXT: retq 3409; 3410; X64-MIC-AVX2-LABEL: length127_eq: 3411; X64-MIC-AVX2: # %bb.0: 3412; X64-MIC-AVX2-NEXT: pushq %rax 3413; X64-MIC-AVX2-NEXT: movl $127, %edx 3414; X64-MIC-AVX2-NEXT: callq memcmp 3415; X64-MIC-AVX2-NEXT: testl %eax, %eax 3416; X64-MIC-AVX2-NEXT: setne %al 3417; X64-MIC-AVX2-NEXT: popq %rcx 3418; X64-MIC-AVX2-NEXT: retq 3419; 3420; X64-MIC-AVX512F-LABEL: length127_eq: 3421; X64-MIC-AVX512F: # %bb.0: 3422; X64-MIC-AVX512F-NEXT: vmovdqu64 (%rdi), %zmm0 3423; X64-MIC-AVX512F-NEXT: vmovdqu64 63(%rdi), %zmm1 3424; X64-MIC-AVX512F-NEXT: vpcmpneqd 63(%rsi), %zmm1, %k0 3425; X64-MIC-AVX512F-NEXT: vpcmpneqd (%rsi), %zmm0, %k1 3426; X64-MIC-AVX512F-NEXT: kortestw %k0, %k1 3427; X64-MIC-AVX512F-NEXT: setne %al 3428; X64-MIC-AVX512F-NEXT: vzeroupper 3429; X64-MIC-AVX512F-NEXT: retq 3430 %call = tail call i32 @memcmp(i8* %x, i8* %y, i64 127) nounwind 3431 %cmp = icmp ne i32 %call, 0 3432 ret i1 %cmp 3433} 3434 3435define i1 @length127_lt(i8* %x, i8* %y) nounwind { 3436; X86-LABEL: length127_lt: 3437; X86: # %bb.0: 3438; X86-NEXT: pushl $0 3439; X86-NEXT: pushl $127 3440; X86-NEXT: pushl {{[0-9]+}}(%esp) 3441; X86-NEXT: pushl {{[0-9]+}}(%esp) 3442; X86-NEXT: calll memcmp 3443; X86-NEXT: addl $16, %esp 3444; X86-NEXT: shrl $31, %eax 3445; X86-NEXT: # kill: def $al killed $al killed $eax 3446; X86-NEXT: retl 3447; 3448; X64-LABEL: length127_lt: 3449; X64: # %bb.0: 3450; X64-NEXT: pushq %rax 3451; X64-NEXT: movl $127, %edx 3452; X64-NEXT: callq memcmp 3453; X64-NEXT: shrl $31, %eax 3454; X64-NEXT: # kill: def $al killed $al killed $eax 3455; X64-NEXT: popq %rcx 3456; X64-NEXT: retq 3457 %call = tail call i32 @memcmp(i8* %x, i8* %y, i64 127) nounwind 3458 %cmp = icmp slt i32 %call, 0 3459 ret i1 %cmp 3460} 3461 3462define i1 @length127_gt(i8* %x, i8* %y) nounwind { 3463; X86-LABEL: length127_gt: 3464; X86: # %bb.0: 3465; X86-NEXT: pushl $0 3466; X86-NEXT: pushl $127 3467; X86-NEXT: pushl {{[0-9]+}}(%esp) 3468; X86-NEXT: pushl {{[0-9]+}}(%esp) 3469; X86-NEXT: calll memcmp 3470; X86-NEXT: addl $16, %esp 3471; X86-NEXT: testl %eax, %eax 3472; X86-NEXT: setg %al 3473; X86-NEXT: retl 3474; 3475; X64-LABEL: length127_gt: 3476; X64: # %bb.0: 3477; X64-NEXT: pushq %rax 3478; X64-NEXT: movl $127, %edx 3479; X64-NEXT: callq memcmp 3480; X64-NEXT: testl %eax, %eax 3481; X64-NEXT: setg %al 3482; X64-NEXT: popq %rcx 3483; X64-NEXT: retq 3484 %call = tail call i32 @memcmp(i8* %x, i8* %y, i64 127) nounwind 3485 %cmp = icmp sgt i32 %call, 0 3486 ret i1 %cmp 3487} 3488 3489define i1 @length127_eq_const(i8* %X) nounwind { 3490; X86-LABEL: length127_eq_const: 3491; X86: # %bb.0: 3492; X86-NEXT: pushl $0 3493; X86-NEXT: pushl $127 3494; X86-NEXT: pushl $.L.str 3495; X86-NEXT: pushl {{[0-9]+}}(%esp) 3496; X86-NEXT: calll memcmp 3497; X86-NEXT: addl $16, %esp 3498; X86-NEXT: testl %eax, %eax 3499; X86-NEXT: sete %al 3500; X86-NEXT: retl 3501; 3502; X64-SSE-LABEL: length127_eq_const: 3503; X64-SSE: # %bb.0: 3504; X64-SSE-NEXT: pushq %rax 3505; X64-SSE-NEXT: movl $.L.str, %esi 3506; X64-SSE-NEXT: movl $127, %edx 3507; X64-SSE-NEXT: callq memcmp 3508; X64-SSE-NEXT: testl %eax, %eax 3509; X64-SSE-NEXT: sete %al 3510; X64-SSE-NEXT: popq %rcx 3511; X64-SSE-NEXT: retq 3512; 3513; X64-AVX1-LABEL: length127_eq_const: 3514; X64-AVX1: # %bb.0: 3515; X64-AVX1-NEXT: pushq %rax 3516; X64-AVX1-NEXT: movl $.L.str, %esi 3517; X64-AVX1-NEXT: movl $127, %edx 3518; X64-AVX1-NEXT: callq memcmp 3519; X64-AVX1-NEXT: testl %eax, %eax 3520; X64-AVX1-NEXT: sete %al 3521; X64-AVX1-NEXT: popq %rcx 3522; X64-AVX1-NEXT: retq 3523; 3524; X64-AVX2-LABEL: length127_eq_const: 3525; X64-AVX2: # %bb.0: 3526; X64-AVX2-NEXT: pushq %rax 3527; X64-AVX2-NEXT: movl $.L.str, %esi 3528; X64-AVX2-NEXT: movl $127, %edx 3529; X64-AVX2-NEXT: callq memcmp 3530; X64-AVX2-NEXT: testl %eax, %eax 3531; X64-AVX2-NEXT: sete %al 3532; X64-AVX2-NEXT: popq %rcx 3533; X64-AVX2-NEXT: retq 3534; 3535; X64-AVX512BW-LABEL: length127_eq_const: 3536; X64-AVX512BW: # %bb.0: 3537; X64-AVX512BW-NEXT: vmovdqu64 (%rdi), %zmm0 3538; X64-AVX512BW-NEXT: vmovdqu64 63(%rdi), %zmm1 3539; X64-AVX512BW-NEXT: vpcmpneqb .L.str+{{.*}}(%rip), %zmm1, %k0 3540; X64-AVX512BW-NEXT: vpcmpneqb {{.*}}(%rip), %zmm0, %k1 3541; X64-AVX512BW-NEXT: kortestq %k0, %k1 3542; X64-AVX512BW-NEXT: sete %al 3543; X64-AVX512BW-NEXT: vzeroupper 3544; X64-AVX512BW-NEXT: retq 3545; 3546; X64-AVX512F-LABEL: length127_eq_const: 3547; X64-AVX512F: # %bb.0: 3548; X64-AVX512F-NEXT: vmovdqu64 (%rdi), %zmm0 3549; X64-AVX512F-NEXT: vmovdqu64 63(%rdi), %zmm1 3550; X64-AVX512F-NEXT: vpcmpneqd .L.str+{{.*}}(%rip), %zmm1, %k0 3551; X64-AVX512F-NEXT: vpcmpneqd {{.*}}(%rip), %zmm0, %k1 3552; X64-AVX512F-NEXT: kortestw %k0, %k1 3553; X64-AVX512F-NEXT: sete %al 3554; X64-AVX512F-NEXT: vzeroupper 3555; X64-AVX512F-NEXT: retq 3556; 3557; X64-MIC-AVX2-LABEL: length127_eq_const: 3558; X64-MIC-AVX2: # %bb.0: 3559; X64-MIC-AVX2-NEXT: pushq %rax 3560; X64-MIC-AVX2-NEXT: movl $.L.str, %esi 3561; X64-MIC-AVX2-NEXT: movl $127, %edx 3562; X64-MIC-AVX2-NEXT: callq memcmp 3563; X64-MIC-AVX2-NEXT: testl %eax, %eax 3564; X64-MIC-AVX2-NEXT: sete %al 3565; X64-MIC-AVX2-NEXT: popq %rcx 3566; X64-MIC-AVX2-NEXT: retq 3567; 3568; X64-MIC-AVX512F-LABEL: length127_eq_const: 3569; X64-MIC-AVX512F: # %bb.0: 3570; X64-MIC-AVX512F-NEXT: vmovdqu64 (%rdi), %zmm0 3571; X64-MIC-AVX512F-NEXT: vmovdqu64 63(%rdi), %zmm1 3572; X64-MIC-AVX512F-NEXT: vpcmpneqd .L.str+{{.*}}(%rip), %zmm1, %k0 3573; X64-MIC-AVX512F-NEXT: vpcmpneqd {{.*}}(%rip), %zmm0, %k1 3574; X64-MIC-AVX512F-NEXT: kortestw %k0, %k1 3575; X64-MIC-AVX512F-NEXT: sete %al 3576; X64-MIC-AVX512F-NEXT: vzeroupper 3577; X64-MIC-AVX512F-NEXT: retq 3578 %m = tail call i32 @memcmp(i8* %X, i8* getelementptr inbounds ([513 x i8], [513 x i8]* @.str, i32 0, i32 0), i64 127) nounwind 3579 %c = icmp eq i32 %m, 0 3580 ret i1 %c 3581} 3582 3583define i32 @length128(i8* %X, i8* %Y) nounwind { 3584; X86-LABEL: length128: 3585; X86: # %bb.0: 3586; X86-NEXT: pushl $0 3587; X86-NEXT: pushl $128 3588; X86-NEXT: pushl {{[0-9]+}}(%esp) 3589; X86-NEXT: pushl {{[0-9]+}}(%esp) 3590; X86-NEXT: calll memcmp 3591; X86-NEXT: addl $16, %esp 3592; X86-NEXT: retl 3593; 3594; X64-LABEL: length128: 3595; X64: # %bb.0: 3596; X64-NEXT: movl $128, %edx 3597; X64-NEXT: jmp memcmp # TAILCALL 3598 %m = tail call i32 @memcmp(i8* %X, i8* %Y, i64 128) nounwind 3599 ret i32 %m 3600} 3601 3602define i1 @length128_eq(i8* %x, i8* %y) nounwind { 3603; X86-LABEL: length128_eq: 3604; X86: # %bb.0: 3605; X86-NEXT: pushl $0 3606; X86-NEXT: pushl $128 3607; X86-NEXT: pushl {{[0-9]+}}(%esp) 3608; X86-NEXT: pushl {{[0-9]+}}(%esp) 3609; X86-NEXT: calll memcmp 3610; X86-NEXT: addl $16, %esp 3611; X86-NEXT: testl %eax, %eax 3612; X86-NEXT: setne %al 3613; X86-NEXT: retl 3614; 3615; X64-SSE-LABEL: length128_eq: 3616; X64-SSE: # %bb.0: 3617; X64-SSE-NEXT: pushq %rax 3618; X64-SSE-NEXT: movl $128, %edx 3619; X64-SSE-NEXT: callq memcmp 3620; X64-SSE-NEXT: testl %eax, %eax 3621; X64-SSE-NEXT: setne %al 3622; X64-SSE-NEXT: popq %rcx 3623; X64-SSE-NEXT: retq 3624; 3625; X64-AVX1-LABEL: length128_eq: 3626; X64-AVX1: # %bb.0: 3627; X64-AVX1-NEXT: pushq %rax 3628; X64-AVX1-NEXT: movl $128, %edx 3629; X64-AVX1-NEXT: callq memcmp 3630; X64-AVX1-NEXT: testl %eax, %eax 3631; X64-AVX1-NEXT: setne %al 3632; X64-AVX1-NEXT: popq %rcx 3633; X64-AVX1-NEXT: retq 3634; 3635; X64-AVX2-LABEL: length128_eq: 3636; X64-AVX2: # %bb.0: 3637; X64-AVX2-NEXT: pushq %rax 3638; X64-AVX2-NEXT: movl $128, %edx 3639; X64-AVX2-NEXT: callq memcmp 3640; X64-AVX2-NEXT: testl %eax, %eax 3641; X64-AVX2-NEXT: setne %al 3642; X64-AVX2-NEXT: popq %rcx 3643; X64-AVX2-NEXT: retq 3644; 3645; X64-AVX512BW-LABEL: length128_eq: 3646; X64-AVX512BW: # %bb.0: 3647; X64-AVX512BW-NEXT: vmovdqu64 (%rdi), %zmm0 3648; X64-AVX512BW-NEXT: vmovdqu64 64(%rdi), %zmm1 3649; X64-AVX512BW-NEXT: vpcmpneqb 64(%rsi), %zmm1, %k0 3650; X64-AVX512BW-NEXT: vpcmpneqb (%rsi), %zmm0, %k1 3651; X64-AVX512BW-NEXT: kortestq %k0, %k1 3652; X64-AVX512BW-NEXT: setne %al 3653; X64-AVX512BW-NEXT: vzeroupper 3654; X64-AVX512BW-NEXT: retq 3655; 3656; X64-AVX512F-LABEL: length128_eq: 3657; X64-AVX512F: # %bb.0: 3658; X64-AVX512F-NEXT: vmovdqu64 (%rdi), %zmm0 3659; X64-AVX512F-NEXT: vmovdqu64 64(%rdi), %zmm1 3660; X64-AVX512F-NEXT: vpcmpneqd 64(%rsi), %zmm1, %k0 3661; X64-AVX512F-NEXT: vpcmpneqd (%rsi), %zmm0, %k1 3662; X64-AVX512F-NEXT: kortestw %k0, %k1 3663; X64-AVX512F-NEXT: setne %al 3664; X64-AVX512F-NEXT: vzeroupper 3665; X64-AVX512F-NEXT: retq 3666; 3667; X64-MIC-AVX2-LABEL: length128_eq: 3668; X64-MIC-AVX2: # %bb.0: 3669; X64-MIC-AVX2-NEXT: pushq %rax 3670; X64-MIC-AVX2-NEXT: movl $128, %edx 3671; X64-MIC-AVX2-NEXT: callq memcmp 3672; X64-MIC-AVX2-NEXT: testl %eax, %eax 3673; X64-MIC-AVX2-NEXT: setne %al 3674; X64-MIC-AVX2-NEXT: popq %rcx 3675; X64-MIC-AVX2-NEXT: retq 3676; 3677; X64-MIC-AVX512F-LABEL: length128_eq: 3678; X64-MIC-AVX512F: # %bb.0: 3679; X64-MIC-AVX512F-NEXT: vmovdqu64 (%rdi), %zmm0 3680; X64-MIC-AVX512F-NEXT: vmovdqu64 64(%rdi), %zmm1 3681; X64-MIC-AVX512F-NEXT: vpcmpneqd 64(%rsi), %zmm1, %k0 3682; X64-MIC-AVX512F-NEXT: vpcmpneqd (%rsi), %zmm0, %k1 3683; X64-MIC-AVX512F-NEXT: kortestw %k0, %k1 3684; X64-MIC-AVX512F-NEXT: setne %al 3685; X64-MIC-AVX512F-NEXT: vzeroupper 3686; X64-MIC-AVX512F-NEXT: retq 3687 %call = tail call i32 @memcmp(i8* %x, i8* %y, i64 128) nounwind 3688 %cmp = icmp ne i32 %call, 0 3689 ret i1 %cmp 3690} 3691 3692define i1 @length128_lt(i8* %x, i8* %y) nounwind { 3693; X86-LABEL: length128_lt: 3694; X86: # %bb.0: 3695; X86-NEXT: pushl $0 3696; X86-NEXT: pushl $128 3697; X86-NEXT: pushl {{[0-9]+}}(%esp) 3698; X86-NEXT: pushl {{[0-9]+}}(%esp) 3699; X86-NEXT: calll memcmp 3700; X86-NEXT: addl $16, %esp 3701; X86-NEXT: shrl $31, %eax 3702; X86-NEXT: # kill: def $al killed $al killed $eax 3703; X86-NEXT: retl 3704; 3705; X64-LABEL: length128_lt: 3706; X64: # %bb.0: 3707; X64-NEXT: pushq %rax 3708; X64-NEXT: movl $128, %edx 3709; X64-NEXT: callq memcmp 3710; X64-NEXT: shrl $31, %eax 3711; X64-NEXT: # kill: def $al killed $al killed $eax 3712; X64-NEXT: popq %rcx 3713; X64-NEXT: retq 3714 %call = tail call i32 @memcmp(i8* %x, i8* %y, i64 128) nounwind 3715 %cmp = icmp slt i32 %call, 0 3716 ret i1 %cmp 3717} 3718 3719define i1 @length128_gt(i8* %x, i8* %y) nounwind { 3720; X86-LABEL: length128_gt: 3721; X86: # %bb.0: 3722; X86-NEXT: pushl $0 3723; X86-NEXT: pushl $128 3724; X86-NEXT: pushl {{[0-9]+}}(%esp) 3725; X86-NEXT: pushl {{[0-9]+}}(%esp) 3726; X86-NEXT: calll memcmp 3727; X86-NEXT: addl $16, %esp 3728; X86-NEXT: testl %eax, %eax 3729; X86-NEXT: setg %al 3730; X86-NEXT: retl 3731; 3732; X64-LABEL: length128_gt: 3733; X64: # %bb.0: 3734; X64-NEXT: pushq %rax 3735; X64-NEXT: movl $128, %edx 3736; X64-NEXT: callq memcmp 3737; X64-NEXT: testl %eax, %eax 3738; X64-NEXT: setg %al 3739; X64-NEXT: popq %rcx 3740; X64-NEXT: retq 3741 %call = tail call i32 @memcmp(i8* %x, i8* %y, i64 128) nounwind 3742 %cmp = icmp sgt i32 %call, 0 3743 ret i1 %cmp 3744} 3745 3746define i1 @length128_eq_const(i8* %X) nounwind { 3747; X86-LABEL: length128_eq_const: 3748; X86: # %bb.0: 3749; X86-NEXT: pushl $0 3750; X86-NEXT: pushl $128 3751; X86-NEXT: pushl $.L.str 3752; X86-NEXT: pushl {{[0-9]+}}(%esp) 3753; X86-NEXT: calll memcmp 3754; X86-NEXT: addl $16, %esp 3755; X86-NEXT: testl %eax, %eax 3756; X86-NEXT: sete %al 3757; X86-NEXT: retl 3758; 3759; X64-SSE-LABEL: length128_eq_const: 3760; X64-SSE: # %bb.0: 3761; X64-SSE-NEXT: pushq %rax 3762; X64-SSE-NEXT: movl $.L.str, %esi 3763; X64-SSE-NEXT: movl $128, %edx 3764; X64-SSE-NEXT: callq memcmp 3765; X64-SSE-NEXT: testl %eax, %eax 3766; X64-SSE-NEXT: sete %al 3767; X64-SSE-NEXT: popq %rcx 3768; X64-SSE-NEXT: retq 3769; 3770; X64-AVX1-LABEL: length128_eq_const: 3771; X64-AVX1: # %bb.0: 3772; X64-AVX1-NEXT: pushq %rax 3773; X64-AVX1-NEXT: movl $.L.str, %esi 3774; X64-AVX1-NEXT: movl $128, %edx 3775; X64-AVX1-NEXT: callq memcmp 3776; X64-AVX1-NEXT: testl %eax, %eax 3777; X64-AVX1-NEXT: sete %al 3778; X64-AVX1-NEXT: popq %rcx 3779; X64-AVX1-NEXT: retq 3780; 3781; X64-AVX2-LABEL: length128_eq_const: 3782; X64-AVX2: # %bb.0: 3783; X64-AVX2-NEXT: pushq %rax 3784; X64-AVX2-NEXT: movl $.L.str, %esi 3785; X64-AVX2-NEXT: movl $128, %edx 3786; X64-AVX2-NEXT: callq memcmp 3787; X64-AVX2-NEXT: testl %eax, %eax 3788; X64-AVX2-NEXT: sete %al 3789; X64-AVX2-NEXT: popq %rcx 3790; X64-AVX2-NEXT: retq 3791; 3792; X64-AVX512BW-LABEL: length128_eq_const: 3793; X64-AVX512BW: # %bb.0: 3794; X64-AVX512BW-NEXT: vmovdqu64 (%rdi), %zmm0 3795; X64-AVX512BW-NEXT: vmovdqu64 64(%rdi), %zmm1 3796; X64-AVX512BW-NEXT: vpcmpneqb .L.str+{{.*}}(%rip), %zmm1, %k0 3797; X64-AVX512BW-NEXT: vpcmpneqb {{.*}}(%rip), %zmm0, %k1 3798; X64-AVX512BW-NEXT: kortestq %k0, %k1 3799; X64-AVX512BW-NEXT: sete %al 3800; X64-AVX512BW-NEXT: vzeroupper 3801; X64-AVX512BW-NEXT: retq 3802; 3803; X64-AVX512F-LABEL: length128_eq_const: 3804; X64-AVX512F: # %bb.0: 3805; X64-AVX512F-NEXT: vmovdqu64 (%rdi), %zmm0 3806; X64-AVX512F-NEXT: vmovdqu64 64(%rdi), %zmm1 3807; X64-AVX512F-NEXT: vpcmpneqd .L.str+{{.*}}(%rip), %zmm1, %k0 3808; X64-AVX512F-NEXT: vpcmpneqd {{.*}}(%rip), %zmm0, %k1 3809; X64-AVX512F-NEXT: kortestw %k0, %k1 3810; X64-AVX512F-NEXT: sete %al 3811; X64-AVX512F-NEXT: vzeroupper 3812; X64-AVX512F-NEXT: retq 3813; 3814; X64-MIC-AVX2-LABEL: length128_eq_const: 3815; X64-MIC-AVX2: # %bb.0: 3816; X64-MIC-AVX2-NEXT: pushq %rax 3817; X64-MIC-AVX2-NEXT: movl $.L.str, %esi 3818; X64-MIC-AVX2-NEXT: movl $128, %edx 3819; X64-MIC-AVX2-NEXT: callq memcmp 3820; X64-MIC-AVX2-NEXT: testl %eax, %eax 3821; X64-MIC-AVX2-NEXT: sete %al 3822; X64-MIC-AVX2-NEXT: popq %rcx 3823; X64-MIC-AVX2-NEXT: retq 3824; 3825; X64-MIC-AVX512F-LABEL: length128_eq_const: 3826; X64-MIC-AVX512F: # %bb.0: 3827; X64-MIC-AVX512F-NEXT: vmovdqu64 (%rdi), %zmm0 3828; X64-MIC-AVX512F-NEXT: vmovdqu64 64(%rdi), %zmm1 3829; X64-MIC-AVX512F-NEXT: vpcmpneqd .L.str+{{.*}}(%rip), %zmm1, %k0 3830; X64-MIC-AVX512F-NEXT: vpcmpneqd {{.*}}(%rip), %zmm0, %k1 3831; X64-MIC-AVX512F-NEXT: kortestw %k0, %k1 3832; X64-MIC-AVX512F-NEXT: sete %al 3833; X64-MIC-AVX512F-NEXT: vzeroupper 3834; X64-MIC-AVX512F-NEXT: retq 3835 %m = tail call i32 @memcmp(i8* %X, i8* getelementptr inbounds ([513 x i8], [513 x i8]* @.str, i32 0, i32 0), i64 128) nounwind 3836 %c = icmp eq i32 %m, 0 3837 ret i1 %c 3838} 3839 3840define i32 @length192(i8* %X, i8* %Y) nounwind { 3841; X86-LABEL: length192: 3842; X86: # %bb.0: 3843; X86-NEXT: pushl $0 3844; X86-NEXT: pushl $192 3845; X86-NEXT: pushl {{[0-9]+}}(%esp) 3846; X86-NEXT: pushl {{[0-9]+}}(%esp) 3847; X86-NEXT: calll memcmp 3848; X86-NEXT: addl $16, %esp 3849; X86-NEXT: retl 3850; 3851; X64-LABEL: length192: 3852; X64: # %bb.0: 3853; X64-NEXT: movl $192, %edx 3854; X64-NEXT: jmp memcmp # TAILCALL 3855 %m = tail call i32 @memcmp(i8* %X, i8* %Y, i64 192) nounwind 3856 ret i32 %m 3857} 3858 3859define i1 @length192_eq(i8* %x, i8* %y) nounwind { 3860; X86-LABEL: length192_eq: 3861; X86: # %bb.0: 3862; X86-NEXT: pushl $0 3863; X86-NEXT: pushl $192 3864; X86-NEXT: pushl {{[0-9]+}}(%esp) 3865; X86-NEXT: pushl {{[0-9]+}}(%esp) 3866; X86-NEXT: calll memcmp 3867; X86-NEXT: addl $16, %esp 3868; X86-NEXT: testl %eax, %eax 3869; X86-NEXT: setne %al 3870; X86-NEXT: retl 3871; 3872; X64-LABEL: length192_eq: 3873; X64: # %bb.0: 3874; X64-NEXT: pushq %rax 3875; X64-NEXT: movl $192, %edx 3876; X64-NEXT: callq memcmp 3877; X64-NEXT: testl %eax, %eax 3878; X64-NEXT: setne %al 3879; X64-NEXT: popq %rcx 3880; X64-NEXT: retq 3881 %call = tail call i32 @memcmp(i8* %x, i8* %y, i64 192) nounwind 3882 %cmp = icmp ne i32 %call, 0 3883 ret i1 %cmp 3884} 3885 3886define i1 @length192_lt(i8* %x, i8* %y) nounwind { 3887; X86-LABEL: length192_lt: 3888; X86: # %bb.0: 3889; X86-NEXT: pushl $0 3890; X86-NEXT: pushl $192 3891; X86-NEXT: pushl {{[0-9]+}}(%esp) 3892; X86-NEXT: pushl {{[0-9]+}}(%esp) 3893; X86-NEXT: calll memcmp 3894; X86-NEXT: addl $16, %esp 3895; X86-NEXT: shrl $31, %eax 3896; X86-NEXT: # kill: def $al killed $al killed $eax 3897; X86-NEXT: retl 3898; 3899; X64-LABEL: length192_lt: 3900; X64: # %bb.0: 3901; X64-NEXT: pushq %rax 3902; X64-NEXT: movl $192, %edx 3903; X64-NEXT: callq memcmp 3904; X64-NEXT: shrl $31, %eax 3905; X64-NEXT: # kill: def $al killed $al killed $eax 3906; X64-NEXT: popq %rcx 3907; X64-NEXT: retq 3908 %call = tail call i32 @memcmp(i8* %x, i8* %y, i64 192) nounwind 3909 %cmp = icmp slt i32 %call, 0 3910 ret i1 %cmp 3911} 3912 3913define i1 @length192_gt(i8* %x, i8* %y) nounwind { 3914; X86-LABEL: length192_gt: 3915; X86: # %bb.0: 3916; X86-NEXT: pushl $0 3917; X86-NEXT: pushl $192 3918; X86-NEXT: pushl {{[0-9]+}}(%esp) 3919; X86-NEXT: pushl {{[0-9]+}}(%esp) 3920; X86-NEXT: calll memcmp 3921; X86-NEXT: addl $16, %esp 3922; X86-NEXT: testl %eax, %eax 3923; X86-NEXT: setg %al 3924; X86-NEXT: retl 3925; 3926; X64-LABEL: length192_gt: 3927; X64: # %bb.0: 3928; X64-NEXT: pushq %rax 3929; X64-NEXT: movl $192, %edx 3930; X64-NEXT: callq memcmp 3931; X64-NEXT: testl %eax, %eax 3932; X64-NEXT: setg %al 3933; X64-NEXT: popq %rcx 3934; X64-NEXT: retq 3935 %call = tail call i32 @memcmp(i8* %x, i8* %y, i64 192) nounwind 3936 %cmp = icmp sgt i32 %call, 0 3937 ret i1 %cmp 3938} 3939 3940define i1 @length192_eq_const(i8* %X) nounwind { 3941; X86-LABEL: length192_eq_const: 3942; X86: # %bb.0: 3943; X86-NEXT: pushl $0 3944; X86-NEXT: pushl $192 3945; X86-NEXT: pushl $.L.str 3946; X86-NEXT: pushl {{[0-9]+}}(%esp) 3947; X86-NEXT: calll memcmp 3948; X86-NEXT: addl $16, %esp 3949; X86-NEXT: testl %eax, %eax 3950; X86-NEXT: sete %al 3951; X86-NEXT: retl 3952; 3953; X64-LABEL: length192_eq_const: 3954; X64: # %bb.0: 3955; X64-NEXT: pushq %rax 3956; X64-NEXT: movl $.L.str, %esi 3957; X64-NEXT: movl $192, %edx 3958; X64-NEXT: callq memcmp 3959; X64-NEXT: testl %eax, %eax 3960; X64-NEXT: sete %al 3961; X64-NEXT: popq %rcx 3962; X64-NEXT: retq 3963 %m = tail call i32 @memcmp(i8* %X, i8* getelementptr inbounds ([513 x i8], [513 x i8]* @.str, i32 0, i32 0), i64 192) nounwind 3964 %c = icmp eq i32 %m, 0 3965 ret i1 %c 3966} 3967 3968define i32 @length255(i8* %X, i8* %Y) nounwind { 3969; X86-LABEL: length255: 3970; X86: # %bb.0: 3971; X86-NEXT: pushl $0 3972; X86-NEXT: pushl $255 3973; X86-NEXT: pushl {{[0-9]+}}(%esp) 3974; X86-NEXT: pushl {{[0-9]+}}(%esp) 3975; X86-NEXT: calll memcmp 3976; X86-NEXT: addl $16, %esp 3977; X86-NEXT: retl 3978; 3979; X64-LABEL: length255: 3980; X64: # %bb.0: 3981; X64-NEXT: movl $255, %edx 3982; X64-NEXT: jmp memcmp # TAILCALL 3983 %m = tail call i32 @memcmp(i8* %X, i8* %Y, i64 255) nounwind 3984 ret i32 %m 3985} 3986 3987define i1 @length255_eq(i8* %x, i8* %y) nounwind { 3988; X86-LABEL: length255_eq: 3989; X86: # %bb.0: 3990; X86-NEXT: pushl $0 3991; X86-NEXT: pushl $255 3992; X86-NEXT: pushl {{[0-9]+}}(%esp) 3993; X86-NEXT: pushl {{[0-9]+}}(%esp) 3994; X86-NEXT: calll memcmp 3995; X86-NEXT: addl $16, %esp 3996; X86-NEXT: testl %eax, %eax 3997; X86-NEXT: setne %al 3998; X86-NEXT: retl 3999; 4000; X64-LABEL: length255_eq: 4001; X64: # %bb.0: 4002; X64-NEXT: pushq %rax 4003; X64-NEXT: movl $255, %edx 4004; X64-NEXT: callq memcmp 4005; X64-NEXT: testl %eax, %eax 4006; X64-NEXT: setne %al 4007; X64-NEXT: popq %rcx 4008; X64-NEXT: retq 4009 %call = tail call i32 @memcmp(i8* %x, i8* %y, i64 255) nounwind 4010 %cmp = icmp ne i32 %call, 0 4011 ret i1 %cmp 4012} 4013 4014define i1 @length255_lt(i8* %x, i8* %y) nounwind { 4015; X86-LABEL: length255_lt: 4016; X86: # %bb.0: 4017; X86-NEXT: pushl $0 4018; X86-NEXT: pushl $255 4019; X86-NEXT: pushl {{[0-9]+}}(%esp) 4020; X86-NEXT: pushl {{[0-9]+}}(%esp) 4021; X86-NEXT: calll memcmp 4022; X86-NEXT: addl $16, %esp 4023; X86-NEXT: shrl $31, %eax 4024; X86-NEXT: # kill: def $al killed $al killed $eax 4025; X86-NEXT: retl 4026; 4027; X64-LABEL: length255_lt: 4028; X64: # %bb.0: 4029; X64-NEXT: pushq %rax 4030; X64-NEXT: movl $255, %edx 4031; X64-NEXT: callq memcmp 4032; X64-NEXT: shrl $31, %eax 4033; X64-NEXT: # kill: def $al killed $al killed $eax 4034; X64-NEXT: popq %rcx 4035; X64-NEXT: retq 4036 %call = tail call i32 @memcmp(i8* %x, i8* %y, i64 255) nounwind 4037 %cmp = icmp slt i32 %call, 0 4038 ret i1 %cmp 4039} 4040 4041define i1 @length255_gt(i8* %x, i8* %y) nounwind { 4042; X86-LABEL: length255_gt: 4043; X86: # %bb.0: 4044; X86-NEXT: pushl $0 4045; X86-NEXT: pushl $255 4046; X86-NEXT: pushl {{[0-9]+}}(%esp) 4047; X86-NEXT: pushl {{[0-9]+}}(%esp) 4048; X86-NEXT: calll memcmp 4049; X86-NEXT: addl $16, %esp 4050; X86-NEXT: testl %eax, %eax 4051; X86-NEXT: setg %al 4052; X86-NEXT: retl 4053; 4054; X64-LABEL: length255_gt: 4055; X64: # %bb.0: 4056; X64-NEXT: pushq %rax 4057; X64-NEXT: movl $255, %edx 4058; X64-NEXT: callq memcmp 4059; X64-NEXT: testl %eax, %eax 4060; X64-NEXT: setg %al 4061; X64-NEXT: popq %rcx 4062; X64-NEXT: retq 4063 %call = tail call i32 @memcmp(i8* %x, i8* %y, i64 255) nounwind 4064 %cmp = icmp sgt i32 %call, 0 4065 ret i1 %cmp 4066} 4067 4068define i1 @length255_eq_const(i8* %X) nounwind { 4069; X86-LABEL: length255_eq_const: 4070; X86: # %bb.0: 4071; X86-NEXT: pushl $0 4072; X86-NEXT: pushl $255 4073; X86-NEXT: pushl $.L.str 4074; X86-NEXT: pushl {{[0-9]+}}(%esp) 4075; X86-NEXT: calll memcmp 4076; X86-NEXT: addl $16, %esp 4077; X86-NEXT: testl %eax, %eax 4078; X86-NEXT: sete %al 4079; X86-NEXT: retl 4080; 4081; X64-LABEL: length255_eq_const: 4082; X64: # %bb.0: 4083; X64-NEXT: pushq %rax 4084; X64-NEXT: movl $.L.str, %esi 4085; X64-NEXT: movl $255, %edx 4086; X64-NEXT: callq memcmp 4087; X64-NEXT: testl %eax, %eax 4088; X64-NEXT: sete %al 4089; X64-NEXT: popq %rcx 4090; X64-NEXT: retq 4091 %m = tail call i32 @memcmp(i8* %X, i8* getelementptr inbounds ([513 x i8], [513 x i8]* @.str, i32 0, i32 0), i64 255) nounwind 4092 %c = icmp eq i32 %m, 0 4093 ret i1 %c 4094} 4095 4096define i32 @length256(i8* %X, i8* %Y) nounwind { 4097; X86-LABEL: length256: 4098; X86: # %bb.0: 4099; X86-NEXT: pushl $0 4100; X86-NEXT: pushl $256 # imm = 0x100 4101; X86-NEXT: pushl {{[0-9]+}}(%esp) 4102; X86-NEXT: pushl {{[0-9]+}}(%esp) 4103; X86-NEXT: calll memcmp 4104; X86-NEXT: addl $16, %esp 4105; X86-NEXT: retl 4106; 4107; X64-LABEL: length256: 4108; X64: # %bb.0: 4109; X64-NEXT: movl $256, %edx # imm = 0x100 4110; X64-NEXT: jmp memcmp # TAILCALL 4111 %m = tail call i32 @memcmp(i8* %X, i8* %Y, i64 256) nounwind 4112 ret i32 %m 4113} 4114 4115define i1 @length256_eq(i8* %x, i8* %y) nounwind { 4116; X86-LABEL: length256_eq: 4117; X86: # %bb.0: 4118; X86-NEXT: pushl $0 4119; X86-NEXT: pushl $256 # imm = 0x100 4120; X86-NEXT: pushl {{[0-9]+}}(%esp) 4121; X86-NEXT: pushl {{[0-9]+}}(%esp) 4122; X86-NEXT: calll memcmp 4123; X86-NEXT: addl $16, %esp 4124; X86-NEXT: testl %eax, %eax 4125; X86-NEXT: setne %al 4126; X86-NEXT: retl 4127; 4128; X64-LABEL: length256_eq: 4129; X64: # %bb.0: 4130; X64-NEXT: pushq %rax 4131; X64-NEXT: movl $256, %edx # imm = 0x100 4132; X64-NEXT: callq memcmp 4133; X64-NEXT: testl %eax, %eax 4134; X64-NEXT: setne %al 4135; X64-NEXT: popq %rcx 4136; X64-NEXT: retq 4137 %call = tail call i32 @memcmp(i8* %x, i8* %y, i64 256) nounwind 4138 %cmp = icmp ne i32 %call, 0 4139 ret i1 %cmp 4140} 4141 4142define i1 @length256_lt(i8* %x, i8* %y) nounwind { 4143; X86-LABEL: length256_lt: 4144; X86: # %bb.0: 4145; X86-NEXT: pushl $0 4146; X86-NEXT: pushl $256 # imm = 0x100 4147; X86-NEXT: pushl {{[0-9]+}}(%esp) 4148; X86-NEXT: pushl {{[0-9]+}}(%esp) 4149; X86-NEXT: calll memcmp 4150; X86-NEXT: addl $16, %esp 4151; X86-NEXT: shrl $31, %eax 4152; X86-NEXT: # kill: def $al killed $al killed $eax 4153; X86-NEXT: retl 4154; 4155; X64-LABEL: length256_lt: 4156; X64: # %bb.0: 4157; X64-NEXT: pushq %rax 4158; X64-NEXT: movl $256, %edx # imm = 0x100 4159; X64-NEXT: callq memcmp 4160; X64-NEXT: shrl $31, %eax 4161; X64-NEXT: # kill: def $al killed $al killed $eax 4162; X64-NEXT: popq %rcx 4163; X64-NEXT: retq 4164 %call = tail call i32 @memcmp(i8* %x, i8* %y, i64 256) nounwind 4165 %cmp = icmp slt i32 %call, 0 4166 ret i1 %cmp 4167} 4168 4169define i1 @length256_gt(i8* %x, i8* %y) nounwind { 4170; X86-LABEL: length256_gt: 4171; X86: # %bb.0: 4172; X86-NEXT: pushl $0 4173; X86-NEXT: pushl $256 # imm = 0x100 4174; X86-NEXT: pushl {{[0-9]+}}(%esp) 4175; X86-NEXT: pushl {{[0-9]+}}(%esp) 4176; X86-NEXT: calll memcmp 4177; X86-NEXT: addl $16, %esp 4178; X86-NEXT: testl %eax, %eax 4179; X86-NEXT: setg %al 4180; X86-NEXT: retl 4181; 4182; X64-LABEL: length256_gt: 4183; X64: # %bb.0: 4184; X64-NEXT: pushq %rax 4185; X64-NEXT: movl $256, %edx # imm = 0x100 4186; X64-NEXT: callq memcmp 4187; X64-NEXT: testl %eax, %eax 4188; X64-NEXT: setg %al 4189; X64-NEXT: popq %rcx 4190; X64-NEXT: retq 4191 %call = tail call i32 @memcmp(i8* %x, i8* %y, i64 256) nounwind 4192 %cmp = icmp sgt i32 %call, 0 4193 ret i1 %cmp 4194} 4195 4196define i1 @length256_eq_const(i8* %X) nounwind { 4197; X86-LABEL: length256_eq_const: 4198; X86: # %bb.0: 4199; X86-NEXT: pushl $0 4200; X86-NEXT: pushl $256 # imm = 0x100 4201; X86-NEXT: pushl $.L.str 4202; X86-NEXT: pushl {{[0-9]+}}(%esp) 4203; X86-NEXT: calll memcmp 4204; X86-NEXT: addl $16, %esp 4205; X86-NEXT: testl %eax, %eax 4206; X86-NEXT: sete %al 4207; X86-NEXT: retl 4208; 4209; X64-LABEL: length256_eq_const: 4210; X64: # %bb.0: 4211; X64-NEXT: pushq %rax 4212; X64-NEXT: movl $.L.str, %esi 4213; X64-NEXT: movl $256, %edx # imm = 0x100 4214; X64-NEXT: callq memcmp 4215; X64-NEXT: testl %eax, %eax 4216; X64-NEXT: sete %al 4217; X64-NEXT: popq %rcx 4218; X64-NEXT: retq 4219 %m = tail call i32 @memcmp(i8* %X, i8* getelementptr inbounds ([513 x i8], [513 x i8]* @.str, i32 0, i32 0), i64 256) nounwind 4220 %c = icmp eq i32 %m, 0 4221 ret i1 %c 4222} 4223 4224define i32 @length384(i8* %X, i8* %Y) nounwind { 4225; X86-LABEL: length384: 4226; X86: # %bb.0: 4227; X86-NEXT: pushl $0 4228; X86-NEXT: pushl $384 # imm = 0x180 4229; X86-NEXT: pushl {{[0-9]+}}(%esp) 4230; X86-NEXT: pushl {{[0-9]+}}(%esp) 4231; X86-NEXT: calll memcmp 4232; X86-NEXT: addl $16, %esp 4233; X86-NEXT: retl 4234; 4235; X64-LABEL: length384: 4236; X64: # %bb.0: 4237; X64-NEXT: movl $384, %edx # imm = 0x180 4238; X64-NEXT: jmp memcmp # TAILCALL 4239 %m = tail call i32 @memcmp(i8* %X, i8* %Y, i64 384) nounwind 4240 ret i32 %m 4241} 4242 4243define i1 @length384_eq(i8* %x, i8* %y) nounwind { 4244; X86-LABEL: length384_eq: 4245; X86: # %bb.0: 4246; X86-NEXT: pushl $0 4247; X86-NEXT: pushl $384 # imm = 0x180 4248; X86-NEXT: pushl {{[0-9]+}}(%esp) 4249; X86-NEXT: pushl {{[0-9]+}}(%esp) 4250; X86-NEXT: calll memcmp 4251; X86-NEXT: addl $16, %esp 4252; X86-NEXT: testl %eax, %eax 4253; X86-NEXT: setne %al 4254; X86-NEXT: retl 4255; 4256; X64-LABEL: length384_eq: 4257; X64: # %bb.0: 4258; X64-NEXT: pushq %rax 4259; X64-NEXT: movl $384, %edx # imm = 0x180 4260; X64-NEXT: callq memcmp 4261; X64-NEXT: testl %eax, %eax 4262; X64-NEXT: setne %al 4263; X64-NEXT: popq %rcx 4264; X64-NEXT: retq 4265 %call = tail call i32 @memcmp(i8* %x, i8* %y, i64 384) nounwind 4266 %cmp = icmp ne i32 %call, 0 4267 ret i1 %cmp 4268} 4269 4270define i1 @length384_lt(i8* %x, i8* %y) nounwind { 4271; X86-LABEL: length384_lt: 4272; X86: # %bb.0: 4273; X86-NEXT: pushl $0 4274; X86-NEXT: pushl $384 # imm = 0x180 4275; X86-NEXT: pushl {{[0-9]+}}(%esp) 4276; X86-NEXT: pushl {{[0-9]+}}(%esp) 4277; X86-NEXT: calll memcmp 4278; X86-NEXT: addl $16, %esp 4279; X86-NEXT: shrl $31, %eax 4280; X86-NEXT: # kill: def $al killed $al killed $eax 4281; X86-NEXT: retl 4282; 4283; X64-LABEL: length384_lt: 4284; X64: # %bb.0: 4285; X64-NEXT: pushq %rax 4286; X64-NEXT: movl $384, %edx # imm = 0x180 4287; X64-NEXT: callq memcmp 4288; X64-NEXT: shrl $31, %eax 4289; X64-NEXT: # kill: def $al killed $al killed $eax 4290; X64-NEXT: popq %rcx 4291; X64-NEXT: retq 4292 %call = tail call i32 @memcmp(i8* %x, i8* %y, i64 384) nounwind 4293 %cmp = icmp slt i32 %call, 0 4294 ret i1 %cmp 4295} 4296 4297define i1 @length384_gt(i8* %x, i8* %y) nounwind { 4298; X86-LABEL: length384_gt: 4299; X86: # %bb.0: 4300; X86-NEXT: pushl $0 4301; X86-NEXT: pushl $384 # imm = 0x180 4302; X86-NEXT: pushl {{[0-9]+}}(%esp) 4303; X86-NEXT: pushl {{[0-9]+}}(%esp) 4304; X86-NEXT: calll memcmp 4305; X86-NEXT: addl $16, %esp 4306; X86-NEXT: testl %eax, %eax 4307; X86-NEXT: setg %al 4308; X86-NEXT: retl 4309; 4310; X64-LABEL: length384_gt: 4311; X64: # %bb.0: 4312; X64-NEXT: pushq %rax 4313; X64-NEXT: movl $384, %edx # imm = 0x180 4314; X64-NEXT: callq memcmp 4315; X64-NEXT: testl %eax, %eax 4316; X64-NEXT: setg %al 4317; X64-NEXT: popq %rcx 4318; X64-NEXT: retq 4319 %call = tail call i32 @memcmp(i8* %x, i8* %y, i64 384) nounwind 4320 %cmp = icmp sgt i32 %call, 0 4321 ret i1 %cmp 4322} 4323 4324define i1 @length384_eq_const(i8* %X) nounwind { 4325; X86-LABEL: length384_eq_const: 4326; X86: # %bb.0: 4327; X86-NEXT: pushl $0 4328; X86-NEXT: pushl $384 # imm = 0x180 4329; X86-NEXT: pushl $.L.str 4330; X86-NEXT: pushl {{[0-9]+}}(%esp) 4331; X86-NEXT: calll memcmp 4332; X86-NEXT: addl $16, %esp 4333; X86-NEXT: testl %eax, %eax 4334; X86-NEXT: sete %al 4335; X86-NEXT: retl 4336; 4337; X64-LABEL: length384_eq_const: 4338; X64: # %bb.0: 4339; X64-NEXT: pushq %rax 4340; X64-NEXT: movl $.L.str, %esi 4341; X64-NEXT: movl $384, %edx # imm = 0x180 4342; X64-NEXT: callq memcmp 4343; X64-NEXT: testl %eax, %eax 4344; X64-NEXT: sete %al 4345; X64-NEXT: popq %rcx 4346; X64-NEXT: retq 4347 %m = tail call i32 @memcmp(i8* %X, i8* getelementptr inbounds ([513 x i8], [513 x i8]* @.str, i32 0, i32 0), i64 384) nounwind 4348 %c = icmp eq i32 %m, 0 4349 ret i1 %c 4350} 4351 4352define i32 @length511(i8* %X, i8* %Y) nounwind { 4353; X86-LABEL: length511: 4354; X86: # %bb.0: 4355; X86-NEXT: pushl $0 4356; X86-NEXT: pushl $511 # imm = 0x1FF 4357; X86-NEXT: pushl {{[0-9]+}}(%esp) 4358; X86-NEXT: pushl {{[0-9]+}}(%esp) 4359; X86-NEXT: calll memcmp 4360; X86-NEXT: addl $16, %esp 4361; X86-NEXT: retl 4362; 4363; X64-LABEL: length511: 4364; X64: # %bb.0: 4365; X64-NEXT: movl $511, %edx # imm = 0x1FF 4366; X64-NEXT: jmp memcmp # TAILCALL 4367 %m = tail call i32 @memcmp(i8* %X, i8* %Y, i64 511) nounwind 4368 ret i32 %m 4369} 4370 4371define i1 @length511_eq(i8* %x, i8* %y) nounwind { 4372; X86-LABEL: length511_eq: 4373; X86: # %bb.0: 4374; X86-NEXT: pushl $0 4375; X86-NEXT: pushl $511 # imm = 0x1FF 4376; X86-NEXT: pushl {{[0-9]+}}(%esp) 4377; X86-NEXT: pushl {{[0-9]+}}(%esp) 4378; X86-NEXT: calll memcmp 4379; X86-NEXT: addl $16, %esp 4380; X86-NEXT: testl %eax, %eax 4381; X86-NEXT: setne %al 4382; X86-NEXT: retl 4383; 4384; X64-LABEL: length511_eq: 4385; X64: # %bb.0: 4386; X64-NEXT: pushq %rax 4387; X64-NEXT: movl $511, %edx # imm = 0x1FF 4388; X64-NEXT: callq memcmp 4389; X64-NEXT: testl %eax, %eax 4390; X64-NEXT: setne %al 4391; X64-NEXT: popq %rcx 4392; X64-NEXT: retq 4393 %call = tail call i32 @memcmp(i8* %x, i8* %y, i64 511) nounwind 4394 %cmp = icmp ne i32 %call, 0 4395 ret i1 %cmp 4396} 4397 4398define i1 @length511_lt(i8* %x, i8* %y) nounwind { 4399; X86-LABEL: length511_lt: 4400; X86: # %bb.0: 4401; X86-NEXT: pushl $0 4402; X86-NEXT: pushl $511 # imm = 0x1FF 4403; X86-NEXT: pushl {{[0-9]+}}(%esp) 4404; X86-NEXT: pushl {{[0-9]+}}(%esp) 4405; X86-NEXT: calll memcmp 4406; X86-NEXT: addl $16, %esp 4407; X86-NEXT: shrl $31, %eax 4408; X86-NEXT: # kill: def $al killed $al killed $eax 4409; X86-NEXT: retl 4410; 4411; X64-LABEL: length511_lt: 4412; X64: # %bb.0: 4413; X64-NEXT: pushq %rax 4414; X64-NEXT: movl $511, %edx # imm = 0x1FF 4415; X64-NEXT: callq memcmp 4416; X64-NEXT: shrl $31, %eax 4417; X64-NEXT: # kill: def $al killed $al killed $eax 4418; X64-NEXT: popq %rcx 4419; X64-NEXT: retq 4420 %call = tail call i32 @memcmp(i8* %x, i8* %y, i64 511) nounwind 4421 %cmp = icmp slt i32 %call, 0 4422 ret i1 %cmp 4423} 4424 4425define i1 @length511_gt(i8* %x, i8* %y) nounwind { 4426; X86-LABEL: length511_gt: 4427; X86: # %bb.0: 4428; X86-NEXT: pushl $0 4429; X86-NEXT: pushl $511 # imm = 0x1FF 4430; X86-NEXT: pushl {{[0-9]+}}(%esp) 4431; X86-NEXT: pushl {{[0-9]+}}(%esp) 4432; X86-NEXT: calll memcmp 4433; X86-NEXT: addl $16, %esp 4434; X86-NEXT: testl %eax, %eax 4435; X86-NEXT: setg %al 4436; X86-NEXT: retl 4437; 4438; X64-LABEL: length511_gt: 4439; X64: # %bb.0: 4440; X64-NEXT: pushq %rax 4441; X64-NEXT: movl $511, %edx # imm = 0x1FF 4442; X64-NEXT: callq memcmp 4443; X64-NEXT: testl %eax, %eax 4444; X64-NEXT: setg %al 4445; X64-NEXT: popq %rcx 4446; X64-NEXT: retq 4447 %call = tail call i32 @memcmp(i8* %x, i8* %y, i64 511) nounwind 4448 %cmp = icmp sgt i32 %call, 0 4449 ret i1 %cmp 4450} 4451 4452define i1 @length511_eq_const(i8* %X) nounwind { 4453; X86-LABEL: length511_eq_const: 4454; X86: # %bb.0: 4455; X86-NEXT: pushl $0 4456; X86-NEXT: pushl $511 # imm = 0x1FF 4457; X86-NEXT: pushl $.L.str 4458; X86-NEXT: pushl {{[0-9]+}}(%esp) 4459; X86-NEXT: calll memcmp 4460; X86-NEXT: addl $16, %esp 4461; X86-NEXT: testl %eax, %eax 4462; X86-NEXT: sete %al 4463; X86-NEXT: retl 4464; 4465; X64-LABEL: length511_eq_const: 4466; X64: # %bb.0: 4467; X64-NEXT: pushq %rax 4468; X64-NEXT: movl $.L.str, %esi 4469; X64-NEXT: movl $511, %edx # imm = 0x1FF 4470; X64-NEXT: callq memcmp 4471; X64-NEXT: testl %eax, %eax 4472; X64-NEXT: sete %al 4473; X64-NEXT: popq %rcx 4474; X64-NEXT: retq 4475 %m = tail call i32 @memcmp(i8* %X, i8* getelementptr inbounds ([513 x i8], [513 x i8]* @.str, i32 0, i32 0), i64 511) nounwind 4476 %c = icmp eq i32 %m, 0 4477 ret i1 %c 4478} 4479 4480define i32 @length512(i8* %X, i8* %Y) nounwind { 4481; X86-LABEL: length512: 4482; X86: # %bb.0: 4483; X86-NEXT: pushl $0 4484; X86-NEXT: pushl $512 # imm = 0x200 4485; X86-NEXT: pushl {{[0-9]+}}(%esp) 4486; X86-NEXT: pushl {{[0-9]+}}(%esp) 4487; X86-NEXT: calll memcmp 4488; X86-NEXT: addl $16, %esp 4489; X86-NEXT: retl 4490; 4491; X64-LABEL: length512: 4492; X64: # %bb.0: 4493; X64-NEXT: movl $512, %edx # imm = 0x200 4494; X64-NEXT: jmp memcmp # TAILCALL 4495 %m = tail call i32 @memcmp(i8* %X, i8* %Y, i64 512) nounwind 4496 ret i32 %m 4497} 4498 4499define i1 @length512_eq(i8* %x, i8* %y) nounwind { 4500; X86-LABEL: length512_eq: 4501; X86: # %bb.0: 4502; X86-NEXT: pushl $0 4503; X86-NEXT: pushl $512 # imm = 0x200 4504; X86-NEXT: pushl {{[0-9]+}}(%esp) 4505; X86-NEXT: pushl {{[0-9]+}}(%esp) 4506; X86-NEXT: calll memcmp 4507; X86-NEXT: addl $16, %esp 4508; X86-NEXT: testl %eax, %eax 4509; X86-NEXT: setne %al 4510; X86-NEXT: retl 4511; 4512; X64-LABEL: length512_eq: 4513; X64: # %bb.0: 4514; X64-NEXT: pushq %rax 4515; X64-NEXT: movl $512, %edx # imm = 0x200 4516; X64-NEXT: callq memcmp 4517; X64-NEXT: testl %eax, %eax 4518; X64-NEXT: setne %al 4519; X64-NEXT: popq %rcx 4520; X64-NEXT: retq 4521 %call = tail call i32 @memcmp(i8* %x, i8* %y, i64 512) nounwind 4522 %cmp = icmp ne i32 %call, 0 4523 ret i1 %cmp 4524} 4525 4526define i1 @length512_lt(i8* %x, i8* %y) nounwind { 4527; X86-LABEL: length512_lt: 4528; X86: # %bb.0: 4529; X86-NEXT: pushl $0 4530; X86-NEXT: pushl $512 # imm = 0x200 4531; X86-NEXT: pushl {{[0-9]+}}(%esp) 4532; X86-NEXT: pushl {{[0-9]+}}(%esp) 4533; X86-NEXT: calll memcmp 4534; X86-NEXT: addl $16, %esp 4535; X86-NEXT: shrl $31, %eax 4536; X86-NEXT: # kill: def $al killed $al killed $eax 4537; X86-NEXT: retl 4538; 4539; X64-LABEL: length512_lt: 4540; X64: # %bb.0: 4541; X64-NEXT: pushq %rax 4542; X64-NEXT: movl $512, %edx # imm = 0x200 4543; X64-NEXT: callq memcmp 4544; X64-NEXT: shrl $31, %eax 4545; X64-NEXT: # kill: def $al killed $al killed $eax 4546; X64-NEXT: popq %rcx 4547; X64-NEXT: retq 4548 %call = tail call i32 @memcmp(i8* %x, i8* %y, i64 512) nounwind 4549 %cmp = icmp slt i32 %call, 0 4550 ret i1 %cmp 4551} 4552 4553define i1 @length512_gt(i8* %x, i8* %y) nounwind { 4554; X86-LABEL: length512_gt: 4555; X86: # %bb.0: 4556; X86-NEXT: pushl $0 4557; X86-NEXT: pushl $512 # imm = 0x200 4558; X86-NEXT: pushl {{[0-9]+}}(%esp) 4559; X86-NEXT: pushl {{[0-9]+}}(%esp) 4560; X86-NEXT: calll memcmp 4561; X86-NEXT: addl $16, %esp 4562; X86-NEXT: testl %eax, %eax 4563; X86-NEXT: setg %al 4564; X86-NEXT: retl 4565; 4566; X64-LABEL: length512_gt: 4567; X64: # %bb.0: 4568; X64-NEXT: pushq %rax 4569; X64-NEXT: movl $512, %edx # imm = 0x200 4570; X64-NEXT: callq memcmp 4571; X64-NEXT: testl %eax, %eax 4572; X64-NEXT: setg %al 4573; X64-NEXT: popq %rcx 4574; X64-NEXT: retq 4575 %call = tail call i32 @memcmp(i8* %x, i8* %y, i64 512) nounwind 4576 %cmp = icmp sgt i32 %call, 0 4577 ret i1 %cmp 4578} 4579 4580define i1 @length512_eq_const(i8* %X) nounwind { 4581; X86-LABEL: length512_eq_const: 4582; X86: # %bb.0: 4583; X86-NEXT: pushl $0 4584; X86-NEXT: pushl $512 # imm = 0x200 4585; X86-NEXT: pushl $.L.str 4586; X86-NEXT: pushl {{[0-9]+}}(%esp) 4587; X86-NEXT: calll memcmp 4588; X86-NEXT: addl $16, %esp 4589; X86-NEXT: testl %eax, %eax 4590; X86-NEXT: sete %al 4591; X86-NEXT: retl 4592; 4593; X64-LABEL: length512_eq_const: 4594; X64: # %bb.0: 4595; X64-NEXT: pushq %rax 4596; X64-NEXT: movl $.L.str, %esi 4597; X64-NEXT: movl $512, %edx # imm = 0x200 4598; X64-NEXT: callq memcmp 4599; X64-NEXT: testl %eax, %eax 4600; X64-NEXT: sete %al 4601; X64-NEXT: popq %rcx 4602; X64-NEXT: retq 4603 %m = tail call i32 @memcmp(i8* %X, i8* getelementptr inbounds ([513 x i8], [513 x i8]* @.str, i32 0, i32 0), i64 512) nounwind 4604 %c = icmp eq i32 %m, 0 4605 ret i1 %c 4606} 4607 4608; This checks that we do not do stupid things with huge sizes. 4609define i32 @huge_length(i8* %X, i8* %Y) nounwind { 4610; X86-LABEL: huge_length: 4611; X86: # %bb.0: 4612; X86-NEXT: pushl $2147483647 # imm = 0x7FFFFFFF 4613; X86-NEXT: pushl $-1 4614; X86-NEXT: pushl {{[0-9]+}}(%esp) 4615; X86-NEXT: pushl {{[0-9]+}}(%esp) 4616; X86-NEXT: calll memcmp 4617; X86-NEXT: addl $16, %esp 4618; X86-NEXT: retl 4619; 4620; X64-LABEL: huge_length: 4621; X64: # %bb.0: 4622; X64-NEXT: movabsq $9223372036854775807, %rdx # imm = 0x7FFFFFFFFFFFFFFF 4623; X64-NEXT: jmp memcmp # TAILCALL 4624 %m = tail call i32 @memcmp(i8* %X, i8* %Y, i64 9223372036854775807) nounwind 4625 ret i32 %m 4626} 4627 4628define i1 @huge_length_eq(i8* %X, i8* %Y) nounwind { 4629; X86-LABEL: huge_length_eq: 4630; X86: # %bb.0: 4631; X86-NEXT: pushl $2147483647 # imm = 0x7FFFFFFF 4632; X86-NEXT: pushl $-1 4633; X86-NEXT: pushl {{[0-9]+}}(%esp) 4634; X86-NEXT: pushl {{[0-9]+}}(%esp) 4635; X86-NEXT: calll memcmp 4636; X86-NEXT: addl $16, %esp 4637; X86-NEXT: testl %eax, %eax 4638; X86-NEXT: sete %al 4639; X86-NEXT: retl 4640; 4641; X64-LABEL: huge_length_eq: 4642; X64: # %bb.0: 4643; X64-NEXT: pushq %rax 4644; X64-NEXT: movabsq $9223372036854775807, %rdx # imm = 0x7FFFFFFFFFFFFFFF 4645; X64-NEXT: callq memcmp 4646; X64-NEXT: testl %eax, %eax 4647; X64-NEXT: sete %al 4648; X64-NEXT: popq %rcx 4649; X64-NEXT: retq 4650 %m = tail call i32 @memcmp(i8* %X, i8* %Y, i64 9223372036854775807) nounwind 4651 %c = icmp eq i32 %m, 0 4652 ret i1 %c 4653} 4654 4655; This checks non-constant sizes. 4656define i32 @nonconst_length(i8* %X, i8* %Y, i64 %size) nounwind { 4657; X86-LABEL: nonconst_length: 4658; X86: # %bb.0: 4659; X86-NEXT: jmp memcmp # TAILCALL 4660; 4661; X64-LABEL: nonconst_length: 4662; X64: # %bb.0: 4663; X64-NEXT: jmp memcmp # TAILCALL 4664 %m = tail call i32 @memcmp(i8* %X, i8* %Y, i64 %size) nounwind 4665 ret i32 %m 4666} 4667 4668define i1 @nonconst_length_eq(i8* %X, i8* %Y, i64 %size) nounwind { 4669; X86-LABEL: nonconst_length_eq: 4670; X86: # %bb.0: 4671; X86-NEXT: pushl {{[0-9]+}}(%esp) 4672; X86-NEXT: pushl {{[0-9]+}}(%esp) 4673; X86-NEXT: pushl {{[0-9]+}}(%esp) 4674; X86-NEXT: pushl {{[0-9]+}}(%esp) 4675; X86-NEXT: calll memcmp 4676; X86-NEXT: addl $16, %esp 4677; X86-NEXT: testl %eax, %eax 4678; X86-NEXT: sete %al 4679; X86-NEXT: retl 4680; 4681; X64-LABEL: nonconst_length_eq: 4682; X64: # %bb.0: 4683; X64-NEXT: pushq %rax 4684; X64-NEXT: callq memcmp 4685; X64-NEXT: testl %eax, %eax 4686; X64-NEXT: sete %al 4687; X64-NEXT: popq %rcx 4688; X64-NEXT: retq 4689 %m = tail call i32 @memcmp(i8* %X, i8* %Y, i64 %size) nounwind 4690 %c = icmp eq i32 %m, 0 4691 ret i1 %c 4692} 4693