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