brintos

brintos / llvm-project-archived public Read only

0
0
Text · 18.9 KiB · 26ee94a Raw
611 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc < %s -mtriple=x86_64-unknown-unknown | FileCheck %s --check-prefixes=X64,X64-SSE23; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=avx | FileCheck %s --check-prefixes=X64,X64-AVX,X64-AVX14; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=avx2 | FileCheck %s --check-prefixes=X64,X64-AVX,X64-AVX25 6; This tests codegen time inlining/optimization of memcmp7; rdar://64803988 9@.str = private constant [65 x i8] c"0123456789012345678901234567890123456789012345678901234567890123\00", align 110 11declare dso_local i32 @memcmp(ptr, ptr, i64)12declare dso_local i32 @bcmp(ptr, ptr, i64)13 14define i32 @length2(ptr %X, ptr %Y) nounwind !prof !14 {15; X64-LABEL: length2:16; X64:       # %bb.0:17; X64-NEXT:    movzwl (%rdi), %eax18; X64-NEXT:    movzwl (%rsi), %ecx19; X64-NEXT:    rolw $8, %ax20; X64-NEXT:    rolw $8, %cx21; X64-NEXT:    movzwl %ax, %eax22; X64-NEXT:    movzwl %cx, %ecx23; X64-NEXT:    subl %ecx, %eax24; X64-NEXT:    retq25  %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 2) nounwind26  ret i32 %m27}28 29define i1 @length2_eq(ptr %X, ptr %Y) nounwind !prof !14 {30; X64-LABEL: length2_eq:31; X64:       # %bb.0:32; X64-NEXT:    movzwl (%rdi), %eax33; X64-NEXT:    cmpw (%rsi), %ax34; X64-NEXT:    sete %al35; X64-NEXT:    retq36  %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 2) nounwind37  %c = icmp eq i32 %m, 038  ret i1 %c39}40 41define i1 @length2_eq_const(ptr %X) nounwind !prof !14 {42; X64-LABEL: length2_eq_const:43; X64:       # %bb.0:44; X64-NEXT:    cmpw $12849, (%rdi) # imm = 0x323145; X64-NEXT:    setne %al46; X64-NEXT:    retq47  %m = tail call i32 @memcmp(ptr %X, ptr getelementptr inbounds ([65 x i8], ptr @.str, i32 0, i32 1), i64 2) nounwind48  %c = icmp ne i32 %m, 049  ret i1 %c50}51 52define i1 @length2_eq_nobuiltin_attr(ptr %X, ptr %Y) nounwind !prof !14 {53; X64-LABEL: length2_eq_nobuiltin_attr:54; X64:       # %bb.0:55; X64-NEXT:    pushq %rax56; X64-NEXT:    movl $2, %edx57; X64-NEXT:    callq memcmp58; X64-NEXT:    testl %eax, %eax59; X64-NEXT:    sete %al60; X64-NEXT:    popq %rcx61; X64-NEXT:    retq62  %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 2) nounwind nobuiltin63  %c = icmp eq i32 %m, 064  ret i1 %c65}66 67define i32 @length3(ptr %X, ptr %Y) nounwind !prof !14 {68; X64-LABEL: length3:69; X64:       # %bb.0:70; X64-NEXT:    movzwl (%rdi), %eax71; X64-NEXT:    movzwl (%rsi), %ecx72; X64-NEXT:    rolw $8, %ax73; X64-NEXT:    rolw $8, %cx74; X64-NEXT:    cmpw %cx, %ax75; X64-NEXT:    jne .LBB4_376; X64-NEXT:  # %bb.1: # %loadbb177; X64-NEXT:    movzbl 2(%rdi), %eax78; X64-NEXT:    movzbl 2(%rsi), %ecx79; X64-NEXT:    subl %ecx, %eax80; X64-NEXT:    retq81; X64-NEXT:  .LBB4_3: # %res_block82; X64-NEXT:    setae %al83; X64-NEXT:    movzbl %al, %eax84; X64-NEXT:    leal -1(%rax,%rax), %eax85; X64-NEXT:    retq86  %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 3) nounwind87  ret i32 %m88}89 90define i1 @length3_eq(ptr %X, ptr %Y) nounwind !prof !14 {91; X64-LABEL: length3_eq:92; X64:       # %bb.0:93; X64-NEXT:    movzwl (%rdi), %eax94; X64-NEXT:    xorw (%rsi), %ax95; X64-NEXT:    movb 2(%rdi), %cl96; X64-NEXT:    xorb 2(%rsi), %cl97; X64-NEXT:    movzbl %cl, %ecx98; X64-NEXT:    orw %ax, %cx99; X64-NEXT:    setne %al100; X64-NEXT:    retq101  %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 3) nounwind102  %c = icmp ne i32 %m, 0103  ret i1 %c104}105 106define i32 @length4(ptr %X, ptr %Y) nounwind !prof !14 {107; X64-LABEL: length4:108; X64:       # %bb.0:109; X64-NEXT:    movl (%rdi), %eax110; X64-NEXT:    movl (%rsi), %ecx111; X64-NEXT:    bswapl %eax112; X64-NEXT:    bswapl %ecx113; X64-NEXT:    cmpl %ecx, %eax114; X64-NEXT:    seta %al115; X64-NEXT:    sbbb $0, %al116; X64-NEXT:    movsbl %al, %eax117; X64-NEXT:    retq118  %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 4) nounwind119  ret i32 %m120}121 122define i1 @length4_eq(ptr %X, ptr %Y) nounwind !prof !14 {123; X64-LABEL: length4_eq:124; X64:       # %bb.0:125; X64-NEXT:    movl (%rdi), %eax126; X64-NEXT:    cmpl (%rsi), %eax127; X64-NEXT:    setne %al128; X64-NEXT:    retq129  %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 4) nounwind130  %c = icmp ne i32 %m, 0131  ret i1 %c132}133 134define i1 @length4_eq_const(ptr %X) nounwind !prof !14 {135; X64-LABEL: length4_eq_const:136; X64:       # %bb.0:137; X64-NEXT:    cmpl $875770417, (%rdi) # imm = 0x34333231138; X64-NEXT:    sete %al139; X64-NEXT:    retq140  %m = tail call i32 @memcmp(ptr %X, ptr getelementptr inbounds ([65 x i8], ptr @.str, i32 0, i32 1), i64 4) nounwind141  %c = icmp eq i32 %m, 0142  ret i1 %c143}144 145define i32 @length5(ptr %X, ptr %Y) nounwind !prof !14 {146; X64-LABEL: length5:147; X64:       # %bb.0:148; X64-NEXT:    movl (%rdi), %eax149; X64-NEXT:    movl (%rsi), %ecx150; X64-NEXT:    bswapl %eax151; X64-NEXT:    bswapl %ecx152; X64-NEXT:    cmpl %ecx, %eax153; X64-NEXT:    jne .LBB9_3154; X64-NEXT:  # %bb.1: # %loadbb1155; X64-NEXT:    movzbl 4(%rdi), %eax156; X64-NEXT:    movzbl 4(%rsi), %ecx157; X64-NEXT:    subl %ecx, %eax158; X64-NEXT:    retq159; X64-NEXT:  .LBB9_3: # %res_block160; X64-NEXT:    setae %al161; X64-NEXT:    movzbl %al, %eax162; X64-NEXT:    leal -1(%rax,%rax), %eax163; X64-NEXT:    retq164  %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 5) nounwind165  ret i32 %m166}167 168define i1 @length5_eq(ptr %X, ptr %Y) nounwind !prof !14 {169; X64-LABEL: length5_eq:170; X64:       # %bb.0:171; X64-NEXT:    movl (%rdi), %eax172; X64-NEXT:    xorl (%rsi), %eax173; X64-NEXT:    movb 4(%rdi), %cl174; X64-NEXT:    xorb 4(%rsi), %cl175; X64-NEXT:    movzbl %cl, %ecx176; X64-NEXT:    orl %eax, %ecx177; X64-NEXT:    setne %al178; X64-NEXT:    retq179  %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 5) nounwind180  %c = icmp ne i32 %m, 0181  ret i1 %c182}183 184define i32 @length8(ptr %X, ptr %Y) nounwind !prof !14 {185; X64-LABEL: length8:186; X64:       # %bb.0:187; X64-NEXT:    movq (%rdi), %rax188; X64-NEXT:    movq (%rsi), %rcx189; X64-NEXT:    bswapq %rax190; X64-NEXT:    bswapq %rcx191; X64-NEXT:    cmpq %rcx, %rax192; X64-NEXT:    seta %al193; X64-NEXT:    sbbb $0, %al194; X64-NEXT:    movsbl %al, %eax195; X64-NEXT:    retq196  %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 8) nounwind197  ret i32 %m198}199 200define i1 @length8_eq(ptr %X, ptr %Y) nounwind !prof !14 {201; X64-LABEL: length8_eq:202; X64:       # %bb.0:203; X64-NEXT:    movq (%rdi), %rax204; X64-NEXT:    cmpq (%rsi), %rax205; X64-NEXT:    sete %al206; X64-NEXT:    retq207  %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 8) nounwind208  %c = icmp eq i32 %m, 0209  ret i1 %c210}211 212define i1 @length8_eq_const(ptr %X) nounwind !prof !14 {213; X64-LABEL: length8_eq_const:214; X64:       # %bb.0:215; X64-NEXT:    movabsq $3978425819141910832, %rax # imm = 0x3736353433323130216; X64-NEXT:    cmpq %rax, (%rdi)217; X64-NEXT:    setne %al218; X64-NEXT:    retq219  %m = tail call i32 @memcmp(ptr %X, ptr @.str, i64 8) nounwind220  %c = icmp ne i32 %m, 0221  ret i1 %c222}223 224define i1 @length12_eq(ptr %X, ptr %Y) nounwind !prof !14 {225; X64-LABEL: length12_eq:226; X64:       # %bb.0:227; X64-NEXT:    movq (%rdi), %rax228; X64-NEXT:    xorq (%rsi), %rax229; X64-NEXT:    movl 8(%rdi), %ecx230; X64-NEXT:    xorl 8(%rsi), %ecx231; X64-NEXT:    orq %rax, %rcx232; X64-NEXT:    setne %al233; X64-NEXT:    retq234  %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 12) nounwind235  %c = icmp ne i32 %m, 0236  ret i1 %c237}238 239define i32 @length12(ptr %X, ptr %Y) nounwind !prof !14 {240; X64-LABEL: length12:241; X64:       # %bb.0:242; X64-NEXT:    movq (%rdi), %rcx243; X64-NEXT:    movq (%rsi), %rdx244; X64-NEXT:    bswapq %rcx245; X64-NEXT:    bswapq %rdx246; X64-NEXT:    cmpq %rdx, %rcx247; X64-NEXT:    jne .LBB15_2248; X64-NEXT:  # %bb.1: # %loadbb1249; X64-NEXT:    movl 8(%rdi), %ecx250; X64-NEXT:    movl 8(%rsi), %edx251; X64-NEXT:    bswapl %ecx252; X64-NEXT:    bswapl %edx253; X64-NEXT:    xorl %eax, %eax254; X64-NEXT:    cmpq %rdx, %rcx255; X64-NEXT:    je .LBB15_3256; X64-NEXT:  .LBB15_2: # %res_block257; X64-NEXT:    xorl %eax, %eax258; X64-NEXT:    cmpq %rdx, %rcx259; X64-NEXT:    setae %al260; X64-NEXT:    leal -1(%rax,%rax), %eax261; X64-NEXT:  .LBB15_3: # %endblock262; X64-NEXT:    retq263  %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 12) nounwind264  ret i32 %m265}266 267; PR33329 - https://bugs.llvm.org/show_bug.cgi?id=33329268 269define i32 @length16(ptr %X, ptr %Y) nounwind !prof !14 {270; X64-LABEL: length16:271; X64:       # %bb.0:272; X64-NEXT:    movq (%rdi), %rcx273; X64-NEXT:    movq (%rsi), %rdx274; X64-NEXT:    bswapq %rcx275; X64-NEXT:    bswapq %rdx276; X64-NEXT:    cmpq %rdx, %rcx277; X64-NEXT:    jne .LBB16_2278; X64-NEXT:  # %bb.1: # %loadbb1279; X64-NEXT:    movq 8(%rdi), %rcx280; X64-NEXT:    movq 8(%rsi), %rdx281; X64-NEXT:    bswapq %rcx282; X64-NEXT:    bswapq %rdx283; X64-NEXT:    xorl %eax, %eax284; X64-NEXT:    cmpq %rdx, %rcx285; X64-NEXT:    je .LBB16_3286; X64-NEXT:  .LBB16_2: # %res_block287; X64-NEXT:    xorl %eax, %eax288; X64-NEXT:    cmpq %rdx, %rcx289; X64-NEXT:    setae %al290; X64-NEXT:    leal -1(%rax,%rax), %eax291; X64-NEXT:  .LBB16_3: # %endblock292; X64-NEXT:    retq293  %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 16) nounwind294  ret i32 %m295}296 297define i1 @length16_eq(ptr %x, ptr %y) nounwind !prof !14 {298; X64-SSE2-LABEL: length16_eq:299; X64-SSE2:       # %bb.0:300; X64-SSE2-NEXT:    movdqu (%rdi), %xmm0301; X64-SSE2-NEXT:    movdqu (%rsi), %xmm1302; X64-SSE2-NEXT:    pcmpeqb %xmm0, %xmm1303; X64-SSE2-NEXT:    pmovmskb %xmm1, %eax304; X64-SSE2-NEXT:    cmpl $65535, %eax # imm = 0xFFFF305; X64-SSE2-NEXT:    setne %al306; X64-SSE2-NEXT:    retq307;308; X64-AVX-LABEL: length16_eq:309; X64-AVX:       # %bb.0:310; X64-AVX-NEXT:    vmovdqu (%rdi), %xmm0311; X64-AVX-NEXT:    vpxor (%rsi), %xmm0, %xmm0312; X64-AVX-NEXT:    vptest %xmm0, %xmm0313; X64-AVX-NEXT:    setne %al314; X64-AVX-NEXT:    retq315  %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 16) nounwind316  %cmp = icmp ne i32 %call, 0317  ret i1 %cmp318}319 320define i1 @length16_eq_const(ptr %X) nounwind !prof !14 {321; X64-SSE2-LABEL: length16_eq_const:322; X64-SSE2:       # %bb.0:323; X64-SSE2-NEXT:    movdqu (%rdi), %xmm0324; X64-SSE2-NEXT:    pcmpeqb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0325; X64-SSE2-NEXT:    pmovmskb %xmm0, %eax326; X64-SSE2-NEXT:    cmpl $65535, %eax # imm = 0xFFFF327; X64-SSE2-NEXT:    sete %al328; X64-SSE2-NEXT:    retq329;330; X64-AVX-LABEL: length16_eq_const:331; X64-AVX:       # %bb.0:332; X64-AVX-NEXT:    vmovdqu (%rdi), %xmm0333; X64-AVX-NEXT:    vpxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0334; X64-AVX-NEXT:    vptest %xmm0, %xmm0335; X64-AVX-NEXT:    sete %al336; X64-AVX-NEXT:    retq337  %m = tail call i32 @memcmp(ptr %X, ptr @.str, i64 16) nounwind338  %c = icmp eq i32 %m, 0339  ret i1 %c340}341 342; PR33914 - https://bugs.llvm.org/show_bug.cgi?id=33914343 344define i32 @length24(ptr %X, ptr %Y) nounwind !prof !14 {345; X64-LABEL: length24:346; X64:       # %bb.0:347; X64-NEXT:    movl $24, %edx348; X64-NEXT:    jmp memcmp # TAILCALL349  %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 24) nounwind350  ret i32 %m351}352 353define i1 @length24_eq(ptr %x, ptr %y) nounwind !prof !14 {354; X64-SSE2-LABEL: length24_eq:355; X64-SSE2:       # %bb.0:356; X64-SSE2-NEXT:    movdqu (%rdi), %xmm0357; X64-SSE2-NEXT:    movdqu (%rsi), %xmm1358; X64-SSE2-NEXT:    pcmpeqb %xmm0, %xmm1359; X64-SSE2-NEXT:    movq {{.*#+}} xmm0 = mem[0],zero360; X64-SSE2-NEXT:    movq {{.*#+}} xmm2 = mem[0],zero361; X64-SSE2-NEXT:    pcmpeqb %xmm0, %xmm2362; X64-SSE2-NEXT:    pand %xmm1, %xmm2363; X64-SSE2-NEXT:    pmovmskb %xmm2, %eax364; X64-SSE2-NEXT:    cmpl $65535, %eax # imm = 0xFFFF365; X64-SSE2-NEXT:    sete %al366; X64-SSE2-NEXT:    retq367;368; X64-AVX-LABEL: length24_eq:369; X64-AVX:       # %bb.0:370; X64-AVX-NEXT:    vmovdqu (%rdi), %xmm0371; X64-AVX-NEXT:    vmovq {{.*#+}} xmm1 = mem[0],zero372; X64-AVX-NEXT:    vmovq {{.*#+}} xmm2 = mem[0],zero373; X64-AVX-NEXT:    vpxor %xmm2, %xmm1, %xmm1374; X64-AVX-NEXT:    vpxor (%rsi), %xmm0, %xmm0375; X64-AVX-NEXT:    vpor %xmm0, %xmm1, %xmm0376; X64-AVX-NEXT:    vptest %xmm0, %xmm0377; X64-AVX-NEXT:    sete %al378; X64-AVX-NEXT:    retq379  %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 24) nounwind380  %cmp = icmp eq i32 %call, 0381  ret i1 %cmp382}383 384define i1 @length24_eq_const(ptr %X) nounwind !prof !14 {385; X64-SSE2-LABEL: length24_eq_const:386; X64-SSE2:       # %bb.0:387; X64-SSE2-NEXT:    movdqu (%rdi), %xmm0388; X64-SSE2-NEXT:    movq {{.*#+}} xmm1 = mem[0],zero389; X64-SSE2-NEXT:    pcmpeqb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1390; X64-SSE2-NEXT:    pcmpeqb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0391; X64-SSE2-NEXT:    pand %xmm1, %xmm0392; X64-SSE2-NEXT:    pmovmskb %xmm0, %eax393; X64-SSE2-NEXT:    cmpl $65535, %eax # imm = 0xFFFF394; X64-SSE2-NEXT:    setne %al395; X64-SSE2-NEXT:    retq396;397; X64-AVX-LABEL: length24_eq_const:398; X64-AVX:       # %bb.0:399; X64-AVX-NEXT:    vmovdqu (%rdi), %xmm0400; X64-AVX-NEXT:    vmovq {{.*#+}} xmm1 = mem[0],zero401; X64-AVX-NEXT:    vpxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1402; X64-AVX-NEXT:    vpxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0403; X64-AVX-NEXT:    vpor %xmm1, %xmm0, %xmm0404; X64-AVX-NEXT:    vptest %xmm0, %xmm0405; X64-AVX-NEXT:    setne %al406; X64-AVX-NEXT:    retq407  %m = tail call i32 @memcmp(ptr %X, ptr @.str, i64 24) nounwind408  %c = icmp ne i32 %m, 0409  ret i1 %c410}411 412define i32 @length32(ptr %X, ptr %Y) nounwind !prof !14 {413; X64-LABEL: length32:414; X64:       # %bb.0:415; X64-NEXT:    movl $32, %edx416; X64-NEXT:    jmp memcmp # TAILCALL417  %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 32) nounwind418  ret i32 %m419}420 421; PR33325 - https://bugs.llvm.org/show_bug.cgi?id=33325422 423define i1 @length32_eq(ptr %x, ptr %y) nounwind !prof !14 {424; X64-SSE2-LABEL: length32_eq:425; X64-SSE2:       # %bb.0:426; X64-SSE2-NEXT:    movdqu (%rdi), %xmm0427; X64-SSE2-NEXT:    movdqu 16(%rdi), %xmm1428; X64-SSE2-NEXT:    movdqu (%rsi), %xmm2429; X64-SSE2-NEXT:    pcmpeqb %xmm0, %xmm2430; X64-SSE2-NEXT:    movdqu 16(%rsi), %xmm0431; X64-SSE2-NEXT:    pcmpeqb %xmm1, %xmm0432; X64-SSE2-NEXT:    pand %xmm2, %xmm0433; X64-SSE2-NEXT:    pmovmskb %xmm0, %eax434; X64-SSE2-NEXT:    cmpl $65535, %eax # imm = 0xFFFF435; X64-SSE2-NEXT:    sete %al436; X64-SSE2-NEXT:    retq437;438; X64-AVX1-LABEL: length32_eq:439; X64-AVX1:       # %bb.0:440; X64-AVX1-NEXT:    vmovups (%rdi), %ymm0441; X64-AVX1-NEXT:    vxorps (%rsi), %ymm0, %ymm0442; X64-AVX1-NEXT:    vptest %ymm0, %ymm0443; X64-AVX1-NEXT:    sete %al444; X64-AVX1-NEXT:    vzeroupper445; X64-AVX1-NEXT:    retq446;447; X64-AVX2-LABEL: length32_eq:448; X64-AVX2:       # %bb.0:449; X64-AVX2-NEXT:    vmovdqu (%rdi), %ymm0450; X64-AVX2-NEXT:    vpxor (%rsi), %ymm0, %ymm0451; X64-AVX2-NEXT:    vptest %ymm0, %ymm0452; X64-AVX2-NEXT:    sete %al453; X64-AVX2-NEXT:    vzeroupper454; X64-AVX2-NEXT:    retq455  %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 32) nounwind456  %cmp = icmp eq i32 %call, 0457  ret i1 %cmp458}459 460define i1 @length32_eq_const(ptr %X) nounwind !prof !14 {461; X64-SSE2-LABEL: length32_eq_const:462; X64-SSE2:       # %bb.0:463; X64-SSE2-NEXT:    movdqu (%rdi), %xmm0464; X64-SSE2-NEXT:    movdqu 16(%rdi), %xmm1465; X64-SSE2-NEXT:    pcmpeqb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1466; X64-SSE2-NEXT:    pcmpeqb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0467; X64-SSE2-NEXT:    pand %xmm1, %xmm0468; X64-SSE2-NEXT:    pmovmskb %xmm0, %eax469; X64-SSE2-NEXT:    cmpl $65535, %eax # imm = 0xFFFF470; X64-SSE2-NEXT:    setne %al471; X64-SSE2-NEXT:    retq472;473; X64-AVX1-LABEL: length32_eq_const:474; X64-AVX1:       # %bb.0:475; X64-AVX1-NEXT:    vmovups (%rdi), %ymm0476; X64-AVX1-NEXT:    vxorps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0477; X64-AVX1-NEXT:    vptest %ymm0, %ymm0478; X64-AVX1-NEXT:    setne %al479; X64-AVX1-NEXT:    vzeroupper480; X64-AVX1-NEXT:    retq481;482; X64-AVX2-LABEL: length32_eq_const:483; X64-AVX2:       # %bb.0:484; X64-AVX2-NEXT:    vmovdqu (%rdi), %ymm0485; X64-AVX2-NEXT:    vpxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0486; X64-AVX2-NEXT:    vptest %ymm0, %ymm0487; X64-AVX2-NEXT:    setne %al488; X64-AVX2-NEXT:    vzeroupper489; X64-AVX2-NEXT:    retq490  %m = tail call i32 @memcmp(ptr %X, ptr @.str, i64 32) nounwind491  %c = icmp ne i32 %m, 0492  ret i1 %c493}494 495define i32 @length64(ptr %X, ptr %Y) nounwind !prof !14 {496; X64-LABEL: length64:497; X64:       # %bb.0:498; X64-NEXT:    movl $64, %edx499; X64-NEXT:    jmp memcmp # TAILCALL500  %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 64) nounwind501  ret i32 %m502}503 504define i1 @length64_eq(ptr %x, ptr %y) nounwind !prof !14 {505; X64-SSE2-LABEL: length64_eq:506; X64-SSE2:       # %bb.0:507; X64-SSE2-NEXT:    pushq %rax508; X64-SSE2-NEXT:    movl $64, %edx509; X64-SSE2-NEXT:    callq memcmp510; X64-SSE2-NEXT:    testl %eax, %eax511; X64-SSE2-NEXT:    setne %al512; X64-SSE2-NEXT:    popq %rcx513; X64-SSE2-NEXT:    retq514;515; X64-AVX1-LABEL: length64_eq:516; X64-AVX1:       # %bb.0:517; X64-AVX1-NEXT:    vmovups (%rdi), %ymm0518; X64-AVX1-NEXT:    vmovups 32(%rdi), %ymm1519; X64-AVX1-NEXT:    vxorps 32(%rsi), %ymm1, %ymm1520; X64-AVX1-NEXT:    vxorps (%rsi), %ymm0, %ymm0521; X64-AVX1-NEXT:    vorps %ymm1, %ymm0, %ymm0522; X64-AVX1-NEXT:    vptest %ymm0, %ymm0523; X64-AVX1-NEXT:    setne %al524; X64-AVX1-NEXT:    vzeroupper525; X64-AVX1-NEXT:    retq526;527; X64-AVX2-LABEL: length64_eq:528; X64-AVX2:       # %bb.0:529; X64-AVX2-NEXT:    vmovdqu (%rdi), %ymm0530; X64-AVX2-NEXT:    vmovdqu 32(%rdi), %ymm1531; X64-AVX2-NEXT:    vpxor 32(%rsi), %ymm1, %ymm1532; X64-AVX2-NEXT:    vpxor (%rsi), %ymm0, %ymm0533; X64-AVX2-NEXT:    vpor %ymm1, %ymm0, %ymm0534; X64-AVX2-NEXT:    vptest %ymm0, %ymm0535; X64-AVX2-NEXT:    setne %al536; X64-AVX2-NEXT:    vzeroupper537; X64-AVX2-NEXT:    retq538  %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 64) nounwind539  %cmp = icmp ne i32 %call, 0540  ret i1 %cmp541}542 543define i1 @length64_eq_const(ptr %X) nounwind !prof !14 {544; X64-SSE2-LABEL: length64_eq_const:545; X64-SSE2:       # %bb.0:546; X64-SSE2-NEXT:    pushq %rax547; X64-SSE2-NEXT:    movl $.L.str, %esi548; X64-SSE2-NEXT:    movl $64, %edx549; X64-SSE2-NEXT:    callq memcmp550; X64-SSE2-NEXT:    testl %eax, %eax551; X64-SSE2-NEXT:    sete %al552; X64-SSE2-NEXT:    popq %rcx553; X64-SSE2-NEXT:    retq554;555; X64-AVX1-LABEL: length64_eq_const:556; X64-AVX1:       # %bb.0:557; X64-AVX1-NEXT:    vmovups (%rdi), %ymm0558; X64-AVX1-NEXT:    vmovups 32(%rdi), %ymm1559; X64-AVX1-NEXT:    vxorps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm1560; X64-AVX1-NEXT:    vxorps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0561; X64-AVX1-NEXT:    vorps %ymm1, %ymm0, %ymm0562; X64-AVX1-NEXT:    vptest %ymm0, %ymm0563; X64-AVX1-NEXT:    sete %al564; X64-AVX1-NEXT:    vzeroupper565; X64-AVX1-NEXT:    retq566;567; X64-AVX2-LABEL: length64_eq_const:568; X64-AVX2:       # %bb.0:569; X64-AVX2-NEXT:    vmovdqu (%rdi), %ymm0570; X64-AVX2-NEXT:    vmovdqu 32(%rdi), %ymm1571; X64-AVX2-NEXT:    vpxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm1572; X64-AVX2-NEXT:    vpxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0573; X64-AVX2-NEXT:    vpor %ymm1, %ymm0, %ymm0574; X64-AVX2-NEXT:    vptest %ymm0, %ymm0575; X64-AVX2-NEXT:    sete %al576; X64-AVX2-NEXT:    vzeroupper577; X64-AVX2-NEXT:    retq578  %m = tail call i32 @memcmp(ptr %X, ptr @.str, i64 64) nounwind579  %c = icmp eq i32 %m, 0580  ret i1 %c581}582 583define i32 @bcmp_length2(ptr %X, ptr %Y) nounwind !prof !14 {584; X64-LABEL: bcmp_length2:585; X64:       # %bb.0:586; X64-NEXT:    movzwl (%rdi), %ecx587; X64-NEXT:    xorl %eax, %eax588; X64-NEXT:    cmpw (%rsi), %cx589; X64-NEXT:    setne %al590; X64-NEXT:    retq591  %m = tail call i32 @bcmp(ptr %X, ptr %Y, i64 2) nounwind592  ret i32 %m593}594 595!llvm.module.flags = !{!0}596!0 = !{i32 1, !"ProfileSummary", !1}597!1 = !{!2, !3, !4, !5, !6, !7, !8, !9}598!2 = !{!"ProfileFormat", !"InstrProf"}599!3 = !{!"TotalCount", i64 10000}600!4 = !{!"MaxCount", i64 10}601!5 = !{!"MaxInternalCount", i64 1}602!6 = !{!"MaxFunctionCount", i64 1000}603!7 = !{!"NumCounts", i64 3}604!8 = !{!"NumFunctions", i64 3}605!9 = !{!"DetailedSummary", !10}606!10 = !{!11, !12, !13}607!11 = !{i32 10000, i64 100, i32 1}608!12 = !{i32 999000, i64 100, i32 1}609!13 = !{i32 999999, i64 1, i32 2}610!14 = !{!"function_entry_count", i64 0}611