brintos

brintos / llvm-project-archived public Read only

0
0
Text · 89.8 KiB · 7d1422d Raw
2908 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; NOTE: This is a copy of llvm/test/CodeGen/X86/memcmp.ll with more load pairs. Please keep it that way.3; RUN: llc -max-loads-per-memcmp=4 -memcmp-num-loads-per-block=4 < %s -mtriple=i686-unknown-unknown -mattr=cmov     | FileCheck %s --check-prefixes=X86,X86-NOSSE4; RUN: llc -max-loads-per-memcmp=4 -memcmp-num-loads-per-block=4 < %s -mtriple=i686-unknown-unknown -mattr=+sse     | FileCheck %s --check-prefixes=X86,X86-SSE15; RUN: llc -max-loads-per-memcmp=4 -memcmp-num-loads-per-block=4 < %s -mtriple=i686-unknown-unknown -mattr=+sse2    | FileCheck %s --check-prefixes=X86,X86-SSE26; RUN: llc -max-loads-per-memcmp=4 -memcmp-num-loads-per-block=4 < %s -mtriple=i686-unknown-unknown -mattr=+sse4.1  | FileCheck %s --check-prefixes=X86,X86-SSE417 8; This tests codegen time inlining/optimization of memcmp9; rdar://648039810 11@.str = private constant [513 x i8] c"01234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901\00", align 112 13declare dso_local i32 @memcmp(ptr, ptr, i32)14 15define i32 @length0(ptr %X, ptr %Y) nounwind {16; X86-LABEL: length0:17; X86:       # %bb.0:18; X86-NEXT:    xorl %eax, %eax19; X86-NEXT:    retl20   %m = tail call i32 @memcmp(ptr %X, ptr %Y, i32 0) nounwind21   ret i32 %m22 }23 24define i1 @length0_eq(ptr %X, ptr %Y) nounwind {25; X86-LABEL: length0_eq:26; X86:       # %bb.0:27; X86-NEXT:    movb $1, %al28; X86-NEXT:    retl29  %m = tail call i32 @memcmp(ptr %X, ptr %Y, i32 0) nounwind30  %c = icmp eq i32 %m, 031  ret i1 %c32}33 34define i1 @length0_lt(ptr %X, ptr %Y) nounwind {35; X86-LABEL: length0_lt:36; X86:       # %bb.0:37; X86-NEXT:    xorl %eax, %eax38; X86-NEXT:    retl39  %m = tail call i32 @memcmp(ptr %X, ptr %Y, i32 0) nounwind40  %c = icmp slt i32 %m, 041  ret i1 %c42}43 44define i32 @length2(ptr %X, ptr %Y) nounwind {45; X86-LABEL: length2:46; X86:       # %bb.0:47; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax48; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx49; X86-NEXT:    movzwl (%ecx), %ecx50; X86-NEXT:    movzwl (%eax), %edx51; X86-NEXT:    rolw $8, %cx52; X86-NEXT:    rolw $8, %dx53; X86-NEXT:    movzwl %cx, %eax54; X86-NEXT:    movzwl %dx, %ecx55; X86-NEXT:    subl %ecx, %eax56; X86-NEXT:    retl57  %m = tail call i32 @memcmp(ptr %X, ptr %Y, i32 2) nounwind58  ret i32 %m59}60 61define i1 @length2_eq(ptr %X, ptr %Y) nounwind {62; X86-LABEL: length2_eq:63; X86:       # %bb.0:64; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax65; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx66; X86-NEXT:    movzwl (%ecx), %ecx67; X86-NEXT:    cmpw (%eax), %cx68; X86-NEXT:    sete %al69; X86-NEXT:    retl70  %m = tail call i32 @memcmp(ptr %X, ptr %Y, i32 2) nounwind71  %c = icmp eq i32 %m, 072  ret i1 %c73}74 75define i1 @length2_lt(ptr %X, ptr %Y) nounwind {76; X86-LABEL: length2_lt:77; X86:       # %bb.0:78; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax79; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx80; X86-NEXT:    movzwl (%ecx), %ecx81; X86-NEXT:    movzwl (%eax), %edx82; X86-NEXT:    rolw $8, %cx83; X86-NEXT:    rolw $8, %dx84; X86-NEXT:    movzwl %cx, %eax85; X86-NEXT:    movzwl %dx, %ecx86; X86-NEXT:    subl %ecx, %eax87; X86-NEXT:    shrl $31, %eax88; X86-NEXT:    # kill: def $al killed $al killed $eax89; X86-NEXT:    retl90  %m = tail call i32 @memcmp(ptr %X, ptr %Y, i32 2) nounwind91  %c = icmp slt i32 %m, 092  ret i1 %c93}94 95define i1 @length2_gt(ptr %X, ptr %Y) nounwind {96; X86-LABEL: length2_gt:97; X86:       # %bb.0:98; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax99; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx100; X86-NEXT:    movzwl (%ecx), %ecx101; X86-NEXT:    movzwl (%eax), %eax102; X86-NEXT:    rolw $8, %cx103; X86-NEXT:    rolw $8, %ax104; X86-NEXT:    movzwl %cx, %ecx105; X86-NEXT:    movzwl %ax, %eax106; X86-NEXT:    subl %eax, %ecx107; X86-NEXT:    testl %ecx, %ecx108; X86-NEXT:    setg %al109; X86-NEXT:    retl110  %m = tail call i32 @memcmp(ptr %X, ptr %Y, i32 2) nounwind111  %c = icmp sgt i32 %m, 0112  ret i1 %c113}114 115define i1 @length2_eq_const(ptr %X) nounwind {116; X86-LABEL: length2_eq_const:117; X86:       # %bb.0:118; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax119; X86-NEXT:    cmpw $12849, (%eax) # imm = 0x3231120; X86-NEXT:    setne %al121; X86-NEXT:    retl122  %m = tail call i32 @memcmp(ptr %X, ptr getelementptr inbounds ([513 x i8], ptr @.str, i32 0, i32 1), i32 2) nounwind123  %c = icmp ne i32 %m, 0124  ret i1 %c125}126 127define i1 @length2_eq_nobuiltin_attr(ptr %X, ptr %Y) nounwind {128; X86-LABEL: length2_eq_nobuiltin_attr:129; X86:       # %bb.0:130; X86-NEXT:    pushl $2131; X86-NEXT:    pushl {{[0-9]+}}(%esp)132; X86-NEXT:    pushl {{[0-9]+}}(%esp)133; X86-NEXT:    calll memcmp134; X86-NEXT:    addl $12, %esp135; X86-NEXT:    testl %eax, %eax136; X86-NEXT:    sete %al137; X86-NEXT:    retl138  %m = tail call i32 @memcmp(ptr %X, ptr %Y, i32 2) nounwind nobuiltin139  %c = icmp eq i32 %m, 0140  ret i1 %c141}142 143define i32 @length3(ptr %X, ptr %Y) nounwind {144; X86-LABEL: length3:145; X86:       # %bb.0:146; X86-NEXT:    pushl %esi147; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx148; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax149; X86-NEXT:    movzwl (%eax), %edx150; X86-NEXT:    movzwl (%ecx), %esi151; X86-NEXT:    rolw $8, %dx152; X86-NEXT:    rolw $8, %si153; X86-NEXT:    cmpw %si, %dx154; X86-NEXT:    jne .LBB9_3155; X86-NEXT:  # %bb.1: # %loadbb1156; X86-NEXT:    movzbl 2(%eax), %eax157; X86-NEXT:    movzbl 2(%ecx), %ecx158; X86-NEXT:    subl %ecx, %eax159; X86-NEXT:    popl %esi160; X86-NEXT:    retl161; X86-NEXT:  .LBB9_3: # %res_block162; X86-NEXT:    setae %al163; X86-NEXT:    movzbl %al, %eax164; X86-NEXT:    leal -1(%eax,%eax), %eax165; X86-NEXT:    popl %esi166; X86-NEXT:    retl167  %m = tail call i32 @memcmp(ptr %X, ptr %Y, i32 3) nounwind168  ret i32 %m169}170 171define i1 @length3_eq(ptr %X, ptr %Y) nounwind {172; X86-LABEL: length3_eq:173; X86:       # %bb.0:174; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax175; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx176; X86-NEXT:    movzwl (%ecx), %edx177; X86-NEXT:    xorw (%eax), %dx178; X86-NEXT:    movzbl 2(%ecx), %ecx179; X86-NEXT:    xorb 2(%eax), %cl180; X86-NEXT:    movzbl %cl, %eax181; X86-NEXT:    orw %dx, %ax182; X86-NEXT:    setne %al183; X86-NEXT:    retl184  %m = tail call i32 @memcmp(ptr %X, ptr %Y, i32 3) nounwind185  %c = icmp ne i32 %m, 0186  ret i1 %c187}188 189define i32 @length4(ptr %X, ptr %Y) nounwind {190; X86-LABEL: length4:191; X86:       # %bb.0:192; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax193; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx194; X86-NEXT:    movl (%ecx), %ecx195; X86-NEXT:    movl (%eax), %eax196; X86-NEXT:    bswapl %ecx197; X86-NEXT:    bswapl %eax198; X86-NEXT:    cmpl %eax, %ecx199; X86-NEXT:    seta %al200; X86-NEXT:    sbbb $0, %al201; X86-NEXT:    movsbl %al, %eax202; X86-NEXT:    retl203  %m = tail call i32 @memcmp(ptr %X, ptr %Y, i32 4) nounwind204  ret i32 %m205}206 207define i1 @length4_eq(ptr %X, ptr %Y) nounwind {208; X86-LABEL: length4_eq:209; X86:       # %bb.0:210; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax211; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx212; X86-NEXT:    movl (%ecx), %ecx213; X86-NEXT:    cmpl (%eax), %ecx214; X86-NEXT:    setne %al215; X86-NEXT:    retl216  %m = tail call i32 @memcmp(ptr %X, ptr %Y, i32 4) nounwind217  %c = icmp ne i32 %m, 0218  ret i1 %c219}220 221define i1 @length4_lt(ptr %X, ptr %Y) nounwind {222; X86-LABEL: length4_lt:223; X86:       # %bb.0:224; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax225; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx226; X86-NEXT:    movl (%ecx), %ecx227; X86-NEXT:    movl (%eax), %eax228; X86-NEXT:    bswapl %ecx229; X86-NEXT:    bswapl %eax230; X86-NEXT:    cmpl %eax, %ecx231; X86-NEXT:    setb %al232; X86-NEXT:    retl233  %m = tail call i32 @memcmp(ptr %X, ptr %Y, i32 4) nounwind234  %c = icmp slt i32 %m, 0235  ret i1 %c236}237 238define i1 @length4_gt(ptr %X, ptr %Y) nounwind {239; X86-LABEL: length4_gt:240; X86:       # %bb.0:241; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax242; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx243; X86-NEXT:    movl (%ecx), %ecx244; X86-NEXT:    movl (%eax), %eax245; X86-NEXT:    bswapl %ecx246; X86-NEXT:    bswapl %eax247; X86-NEXT:    cmpl %eax, %ecx248; X86-NEXT:    seta %al249; X86-NEXT:    retl250  %m = tail call i32 @memcmp(ptr %X, ptr %Y, i32 4) nounwind251  %c = icmp sgt i32 %m, 0252  ret i1 %c253}254 255define i1 @length4_eq_const(ptr %X) nounwind {256; X86-LABEL: length4_eq_const:257; X86:       # %bb.0:258; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax259; X86-NEXT:    cmpl $875770417, (%eax) # imm = 0x34333231260; X86-NEXT:    sete %al261; X86-NEXT:    retl262  %m = tail call i32 @memcmp(ptr %X, ptr getelementptr inbounds ([513 x i8], ptr @.str, i32 0, i32 1), i32 4) nounwind263  %c = icmp eq i32 %m, 0264  ret i1 %c265}266 267define i32 @length5(ptr %X, ptr %Y) nounwind {268; X86-LABEL: length5:269; X86:       # %bb.0:270; X86-NEXT:    pushl %esi271; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx272; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax273; X86-NEXT:    movl (%eax), %edx274; X86-NEXT:    movl (%ecx), %esi275; X86-NEXT:    bswapl %edx276; X86-NEXT:    bswapl %esi277; X86-NEXT:    cmpl %esi, %edx278; X86-NEXT:    jne .LBB16_3279; X86-NEXT:  # %bb.1: # %loadbb1280; X86-NEXT:    movzbl 4(%eax), %eax281; X86-NEXT:    movzbl 4(%ecx), %ecx282; X86-NEXT:    subl %ecx, %eax283; X86-NEXT:    popl %esi284; X86-NEXT:    retl285; X86-NEXT:  .LBB16_3: # %res_block286; X86-NEXT:    setae %al287; X86-NEXT:    movzbl %al, %eax288; X86-NEXT:    leal -1(%eax,%eax), %eax289; X86-NEXT:    popl %esi290; X86-NEXT:    retl291  %m = tail call i32 @memcmp(ptr %X, ptr %Y, i32 5) nounwind292  ret i32 %m293}294 295define i1 @length5_eq(ptr %X, ptr %Y) nounwind {296; X86-LABEL: length5_eq:297; X86:       # %bb.0:298; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax299; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx300; X86-NEXT:    movl (%ecx), %edx301; X86-NEXT:    xorl (%eax), %edx302; X86-NEXT:    movzbl 4(%ecx), %ecx303; X86-NEXT:    xorb 4(%eax), %cl304; X86-NEXT:    movzbl %cl, %eax305; X86-NEXT:    orl %edx, %eax306; X86-NEXT:    setne %al307; X86-NEXT:    retl308  %m = tail call i32 @memcmp(ptr %X, ptr %Y, i32 5) nounwind309  %c = icmp ne i32 %m, 0310  ret i1 %c311}312 313define i1 @length5_lt(ptr %X, ptr %Y) nounwind {314; X86-LABEL: length5_lt:315; X86:       # %bb.0:316; X86-NEXT:    pushl %esi317; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx318; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax319; X86-NEXT:    movl (%eax), %edx320; X86-NEXT:    movl (%ecx), %esi321; X86-NEXT:    bswapl %edx322; X86-NEXT:    bswapl %esi323; X86-NEXT:    cmpl %esi, %edx324; X86-NEXT:    jne .LBB18_3325; X86-NEXT:  # %bb.1: # %loadbb1326; X86-NEXT:    movzbl 4(%eax), %eax327; X86-NEXT:    movzbl 4(%ecx), %ecx328; X86-NEXT:    subl %ecx, %eax329; X86-NEXT:    jmp .LBB18_2330; X86-NEXT:  .LBB18_3: # %res_block331; X86-NEXT:    setae %al332; X86-NEXT:    movzbl %al, %eax333; X86-NEXT:    leal -1(%eax,%eax), %eax334; X86-NEXT:  .LBB18_2: # %endblock335; X86-NEXT:    shrl $31, %eax336; X86-NEXT:    # kill: def $al killed $al killed $eax337; X86-NEXT:    popl %esi338; X86-NEXT:    retl339  %m = tail call i32 @memcmp(ptr %X, ptr %Y, i32 5) nounwind340  %c = icmp slt i32 %m, 0341  ret i1 %c342}343 344define i32 @length7(ptr %X, ptr %Y) nounwind {345; X86-LABEL: length7:346; X86:       # %bb.0:347; X86-NEXT:    pushl %esi348; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax349; X86-NEXT:    movl {{[0-9]+}}(%esp), %esi350; X86-NEXT:    movl (%esi), %ecx351; X86-NEXT:    movl (%eax), %edx352; X86-NEXT:    bswapl %ecx353; X86-NEXT:    bswapl %edx354; X86-NEXT:    cmpl %edx, %ecx355; X86-NEXT:    jne .LBB19_2356; X86-NEXT:  # %bb.1: # %loadbb1357; X86-NEXT:    movl 3(%esi), %ecx358; X86-NEXT:    movl 3(%eax), %edx359; X86-NEXT:    bswapl %ecx360; X86-NEXT:    bswapl %edx361; X86-NEXT:    xorl %eax, %eax362; X86-NEXT:    cmpl %edx, %ecx363; X86-NEXT:    je .LBB19_3364; X86-NEXT:  .LBB19_2: # %res_block365; X86-NEXT:    xorl %eax, %eax366; X86-NEXT:    cmpl %edx, %ecx367; X86-NEXT:    setae %al368; X86-NEXT:    leal -1(%eax,%eax), %eax369; X86-NEXT:  .LBB19_3: # %endblock370; X86-NEXT:    popl %esi371; X86-NEXT:    retl372  %m = tail call i32 @memcmp(ptr %X, ptr %Y, i32 7) nounwind373  ret i32 %m374}375 376define i1 @length7_eq(ptr %X, ptr %Y) nounwind {377; X86-LABEL: length7_eq:378; X86:       # %bb.0:379; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax380; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx381; X86-NEXT:    movl (%ecx), %edx382; X86-NEXT:    movl 3(%ecx), %ecx383; X86-NEXT:    xorl (%eax), %edx384; X86-NEXT:    xorl 3(%eax), %ecx385; X86-NEXT:    orl %edx, %ecx386; X86-NEXT:    setne %al387; X86-NEXT:    retl388  %m = tail call i32 @memcmp(ptr %X, ptr %Y, i32 7) nounwind389  %c = icmp ne i32 %m, 0390  ret i1 %c391}392 393define i1 @length7_lt(ptr %X, ptr %Y) nounwind {394; X86-LABEL: length7_lt:395; X86:       # %bb.0:396; X86-NEXT:    pushl %esi397; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax398; X86-NEXT:    movl {{[0-9]+}}(%esp), %esi399; X86-NEXT:    movl (%esi), %ecx400; X86-NEXT:    movl (%eax), %edx401; X86-NEXT:    bswapl %ecx402; X86-NEXT:    bswapl %edx403; X86-NEXT:    cmpl %edx, %ecx404; X86-NEXT:    jne .LBB21_2405; X86-NEXT:  # %bb.1: # %loadbb1406; X86-NEXT:    movl 3(%esi), %ecx407; X86-NEXT:    movl 3(%eax), %edx408; X86-NEXT:    bswapl %ecx409; X86-NEXT:    bswapl %edx410; X86-NEXT:    xorl %eax, %eax411; X86-NEXT:    cmpl %edx, %ecx412; X86-NEXT:    je .LBB21_3413; X86-NEXT:  .LBB21_2: # %res_block414; X86-NEXT:    xorl %eax, %eax415; X86-NEXT:    cmpl %edx, %ecx416; X86-NEXT:    setae %al417; X86-NEXT:    leal -1(%eax,%eax), %eax418; X86-NEXT:  .LBB21_3: # %endblock419; X86-NEXT:    shrl $31, %eax420; X86-NEXT:    # kill: def $al killed $al killed $eax421; X86-NEXT:    popl %esi422; X86-NEXT:    retl423  %m = tail call i32 @memcmp(ptr %X, ptr %Y, i32 7) nounwind424  %c = icmp slt i32 %m, 0425  ret i1 %c426}427 428define i32 @length8(ptr %X, ptr %Y) nounwind {429; X86-LABEL: length8:430; X86:       # %bb.0:431; X86-NEXT:    pushl %esi432; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax433; X86-NEXT:    movl {{[0-9]+}}(%esp), %esi434; X86-NEXT:    movl (%esi), %ecx435; X86-NEXT:    movl (%eax), %edx436; X86-NEXT:    bswapl %ecx437; X86-NEXT:    bswapl %edx438; X86-NEXT:    cmpl %edx, %ecx439; X86-NEXT:    jne .LBB22_2440; X86-NEXT:  # %bb.1: # %loadbb1441; X86-NEXT:    movl 4(%esi), %ecx442; X86-NEXT:    movl 4(%eax), %edx443; X86-NEXT:    bswapl %ecx444; X86-NEXT:    bswapl %edx445; X86-NEXT:    xorl %eax, %eax446; X86-NEXT:    cmpl %edx, %ecx447; X86-NEXT:    je .LBB22_3448; X86-NEXT:  .LBB22_2: # %res_block449; X86-NEXT:    xorl %eax, %eax450; X86-NEXT:    cmpl %edx, %ecx451; X86-NEXT:    setae %al452; X86-NEXT:    leal -1(%eax,%eax), %eax453; X86-NEXT:  .LBB22_3: # %endblock454; X86-NEXT:    popl %esi455; X86-NEXT:    retl456  %m = tail call i32 @memcmp(ptr %X, ptr %Y, i32 8) nounwind457  ret i32 %m458}459 460define i1 @length8_eq(ptr %X, ptr %Y) nounwind {461; X86-LABEL: length8_eq:462; X86:       # %bb.0:463; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax464; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx465; X86-NEXT:    movl (%ecx), %edx466; X86-NEXT:    movl 4(%ecx), %ecx467; X86-NEXT:    xorl (%eax), %edx468; X86-NEXT:    xorl 4(%eax), %ecx469; X86-NEXT:    orl %edx, %ecx470; X86-NEXT:    sete %al471; X86-NEXT:    retl472  %m = tail call i32 @memcmp(ptr %X, ptr %Y, i32 8) nounwind473  %c = icmp eq i32 %m, 0474  ret i1 %c475}476 477define i1 @length8_eq_const(ptr %X) nounwind {478; X86-LABEL: length8_eq_const:479; X86:       # %bb.0:480; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax481; X86-NEXT:    movl $858927408, %ecx # imm = 0x33323130482; X86-NEXT:    xorl (%eax), %ecx483; X86-NEXT:    movl $926299444, %edx # imm = 0x37363534484; X86-NEXT:    xorl 4(%eax), %edx485; X86-NEXT:    orl %ecx, %edx486; X86-NEXT:    setne %al487; X86-NEXT:    retl488  %m = tail call i32 @memcmp(ptr %X, ptr @.str, i32 8) nounwind489  %c = icmp ne i32 %m, 0490  ret i1 %c491}492 493define i1 @length9_eq(ptr %X, ptr %Y) nounwind {494; X86-LABEL: length9_eq:495; X86:       # %bb.0:496; X86-NEXT:    pushl %esi497; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax498; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx499; X86-NEXT:    movl (%ecx), %edx500; X86-NEXT:    movl 4(%ecx), %esi501; X86-NEXT:    xorl (%eax), %edx502; X86-NEXT:    xorl 4(%eax), %esi503; X86-NEXT:    orl %edx, %esi504; X86-NEXT:    movzbl 8(%ecx), %ecx505; X86-NEXT:    xorb 8(%eax), %cl506; X86-NEXT:    movzbl %cl, %eax507; X86-NEXT:    orl %esi, %eax508; X86-NEXT:    sete %al509; X86-NEXT:    popl %esi510; X86-NEXT:    retl511  %m = tail call i32 @memcmp(ptr %X, ptr %Y, i32 9) nounwind512  %c = icmp eq i32 %m, 0513  ret i1 %c514}515 516define i1 @length10_eq(ptr %X, ptr %Y) nounwind {517; X86-LABEL: length10_eq:518; X86:       # %bb.0:519; X86-NEXT:    pushl %esi520; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax521; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx522; X86-NEXT:    movl (%ecx), %edx523; X86-NEXT:    movl 4(%ecx), %esi524; X86-NEXT:    xorl (%eax), %edx525; X86-NEXT:    xorl 4(%eax), %esi526; X86-NEXT:    orl %edx, %esi527; X86-NEXT:    movzwl 8(%ecx), %ecx528; X86-NEXT:    xorw 8(%eax), %cx529; X86-NEXT:    movzwl %cx, %eax530; X86-NEXT:    orl %esi, %eax531; X86-NEXT:    sete %al532; X86-NEXT:    popl %esi533; X86-NEXT:    retl534  %m = tail call i32 @memcmp(ptr %X, ptr %Y, i32 10) nounwind535  %c = icmp eq i32 %m, 0536  ret i1 %c537}538 539define i1 @length11_eq(ptr %X, ptr %Y) nounwind {540; X86-LABEL: length11_eq:541; X86:       # %bb.0:542; X86-NEXT:    pushl %esi543; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax544; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx545; X86-NEXT:    movl (%ecx), %edx546; X86-NEXT:    movl 4(%ecx), %esi547; X86-NEXT:    xorl (%eax), %edx548; X86-NEXT:    xorl 4(%eax), %esi549; X86-NEXT:    orl %edx, %esi550; X86-NEXT:    movl 7(%ecx), %ecx551; X86-NEXT:    xorl 7(%eax), %ecx552; X86-NEXT:    orl %esi, %ecx553; X86-NEXT:    sete %al554; X86-NEXT:    popl %esi555; X86-NEXT:    retl556  %m = tail call i32 @memcmp(ptr %X, ptr %Y, i32 11) nounwind557  %c = icmp eq i32 %m, 0558  ret i1 %c559}560 561define i1 @length12_eq(ptr %X, ptr %Y) nounwind {562; X86-LABEL: length12_eq:563; X86:       # %bb.0:564; X86-NEXT:    pushl %esi565; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax566; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx567; X86-NEXT:    movl (%ecx), %edx568; X86-NEXT:    movl 4(%ecx), %esi569; X86-NEXT:    xorl (%eax), %edx570; X86-NEXT:    xorl 4(%eax), %esi571; X86-NEXT:    orl %edx, %esi572; X86-NEXT:    movl 8(%ecx), %ecx573; X86-NEXT:    xorl 8(%eax), %ecx574; X86-NEXT:    orl %esi, %ecx575; X86-NEXT:    setne %al576; X86-NEXT:    popl %esi577; X86-NEXT:    retl578  %m = tail call i32 @memcmp(ptr %X, ptr %Y, i32 12) nounwind579  %c = icmp ne i32 %m, 0580  ret i1 %c581}582 583define i32 @length12(ptr %X, ptr %Y) nounwind {584; X86-LABEL: length12:585; X86:       # %bb.0:586; X86-NEXT:    pushl %esi587; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax588; X86-NEXT:    movl {{[0-9]+}}(%esp), %esi589; X86-NEXT:    movl (%esi), %ecx590; X86-NEXT:    movl (%eax), %edx591; X86-NEXT:    bswapl %ecx592; X86-NEXT:    bswapl %edx593; X86-NEXT:    cmpl %edx, %ecx594; X86-NEXT:    jne .LBB29_3595; X86-NEXT:  # %bb.1: # %loadbb1596; X86-NEXT:    movl 4(%esi), %ecx597; X86-NEXT:    movl 4(%eax), %edx598; X86-NEXT:    bswapl %ecx599; X86-NEXT:    bswapl %edx600; X86-NEXT:    cmpl %edx, %ecx601; X86-NEXT:    jne .LBB29_3602; X86-NEXT:  # %bb.2: # %loadbb2603; X86-NEXT:    movl 8(%esi), %ecx604; X86-NEXT:    movl 8(%eax), %edx605; X86-NEXT:    bswapl %ecx606; X86-NEXT:    bswapl %edx607; X86-NEXT:    xorl %eax, %eax608; X86-NEXT:    cmpl %edx, %ecx609; X86-NEXT:    je .LBB29_4610; X86-NEXT:  .LBB29_3: # %res_block611; X86-NEXT:    xorl %eax, %eax612; X86-NEXT:    cmpl %edx, %ecx613; X86-NEXT:    setae %al614; X86-NEXT:    leal -1(%eax,%eax), %eax615; X86-NEXT:  .LBB29_4: # %endblock616; X86-NEXT:    popl %esi617; X86-NEXT:    retl618  %m = tail call i32 @memcmp(ptr %X, ptr %Y, i32 12) nounwind619  ret i32 %m620}621 622define i1 @length13_eq(ptr %X, ptr %Y) nounwind {623; X86-LABEL: length13_eq:624; X86:       # %bb.0:625; X86-NEXT:    pushl %esi626; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx627; X86-NEXT:    movl {{[0-9]+}}(%esp), %edx628; X86-NEXT:    movl (%edx), %esi629; X86-NEXT:    movl 4(%edx), %eax630; X86-NEXT:    xorl (%ecx), %esi631; X86-NEXT:    xorl 4(%ecx), %eax632; X86-NEXT:    orl %esi, %eax633; X86-NEXT:    movl 8(%edx), %esi634; X86-NEXT:    xorl 8(%ecx), %esi635; X86-NEXT:    movzbl 12(%edx), %edx636; X86-NEXT:    xorb 12(%ecx), %dl637; X86-NEXT:    movzbl %dl, %ecx638; X86-NEXT:    orl %esi, %ecx639; X86-NEXT:    orl %eax, %ecx640; X86-NEXT:    sete %al641; X86-NEXT:    popl %esi642; X86-NEXT:    retl643  %m = tail call i32 @memcmp(ptr %X, ptr %Y, i32 13) nounwind644  %c = icmp eq i32 %m, 0645  ret i1 %c646}647 648define i1 @length14_eq(ptr %X, ptr %Y) nounwind {649; X86-LABEL: length14_eq:650; X86:       # %bb.0:651; X86-NEXT:    pushl %esi652; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx653; X86-NEXT:    movl {{[0-9]+}}(%esp), %edx654; X86-NEXT:    movl (%edx), %esi655; X86-NEXT:    movl 4(%edx), %eax656; X86-NEXT:    xorl (%ecx), %esi657; X86-NEXT:    xorl 4(%ecx), %eax658; X86-NEXT:    orl %esi, %eax659; X86-NEXT:    movl 8(%edx), %esi660; X86-NEXT:    xorl 8(%ecx), %esi661; X86-NEXT:    movzwl 12(%edx), %edx662; X86-NEXT:    xorw 12(%ecx), %dx663; X86-NEXT:    movzwl %dx, %ecx664; X86-NEXT:    orl %esi, %ecx665; X86-NEXT:    orl %eax, %ecx666; X86-NEXT:    sete %al667; X86-NEXT:    popl %esi668; X86-NEXT:    retl669  %m = tail call i32 @memcmp(ptr %X, ptr %Y, i32 14) nounwind670  %c = icmp eq i32 %m, 0671  ret i1 %c672}673 674define i1 @length15_eq(ptr %X, ptr %Y) nounwind {675; X86-LABEL: length15_eq:676; X86:       # %bb.0:677; X86-NEXT:    pushl %esi678; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx679; X86-NEXT:    movl {{[0-9]+}}(%esp), %edx680; X86-NEXT:    movl (%edx), %esi681; X86-NEXT:    movl 4(%edx), %eax682; X86-NEXT:    xorl (%ecx), %esi683; X86-NEXT:    xorl 4(%ecx), %eax684; X86-NEXT:    orl %esi, %eax685; X86-NEXT:    movl 8(%edx), %esi686; X86-NEXT:    xorl 8(%ecx), %esi687; X86-NEXT:    movl 11(%edx), %edx688; X86-NEXT:    xorl 11(%ecx), %edx689; X86-NEXT:    orl %esi, %edx690; X86-NEXT:    orl %eax, %edx691; X86-NEXT:    sete %al692; X86-NEXT:    popl %esi693; X86-NEXT:    retl694  %m = tail call i32 @memcmp(ptr %X, ptr %Y, i32 15) nounwind695  %c = icmp eq i32 %m, 0696  ret i1 %c697}698 699; PR33329 - https://bugs.llvm.org/show_bug.cgi?id=33329700 701define i32 @length16(ptr %X, ptr %Y) nounwind {702; X86-LABEL: length16:703; X86:       # %bb.0:704; X86-NEXT:    pushl %esi705; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax706; X86-NEXT:    movl {{[0-9]+}}(%esp), %esi707; X86-NEXT:    movl (%esi), %ecx708; X86-NEXT:    movl (%eax), %edx709; X86-NEXT:    bswapl %ecx710; X86-NEXT:    bswapl %edx711; X86-NEXT:    cmpl %edx, %ecx712; X86-NEXT:    jne .LBB33_4713; X86-NEXT:  # %bb.1: # %loadbb1714; X86-NEXT:    movl 4(%esi), %ecx715; X86-NEXT:    movl 4(%eax), %edx716; X86-NEXT:    bswapl %ecx717; X86-NEXT:    bswapl %edx718; X86-NEXT:    cmpl %edx, %ecx719; X86-NEXT:    jne .LBB33_4720; X86-NEXT:  # %bb.2: # %loadbb2721; X86-NEXT:    movl 8(%esi), %ecx722; X86-NEXT:    movl 8(%eax), %edx723; X86-NEXT:    bswapl %ecx724; X86-NEXT:    bswapl %edx725; X86-NEXT:    cmpl %edx, %ecx726; X86-NEXT:    jne .LBB33_4727; X86-NEXT:  # %bb.3: # %loadbb3728; X86-NEXT:    movl 12(%esi), %ecx729; X86-NEXT:    movl 12(%eax), %edx730; X86-NEXT:    bswapl %ecx731; X86-NEXT:    bswapl %edx732; X86-NEXT:    xorl %eax, %eax733; X86-NEXT:    cmpl %edx, %ecx734; X86-NEXT:    je .LBB33_5735; X86-NEXT:  .LBB33_4: # %res_block736; X86-NEXT:    xorl %eax, %eax737; X86-NEXT:    cmpl %edx, %ecx738; X86-NEXT:    setae %al739; X86-NEXT:    leal -1(%eax,%eax), %eax740; X86-NEXT:  .LBB33_5: # %endblock741; X86-NEXT:    popl %esi742; X86-NEXT:    retl743  %m = tail call i32 @memcmp(ptr %X, ptr %Y, i32 16) nounwind744  ret i32 %m745}746 747define i1 @length16_eq(ptr %x, ptr %y) nounwind {748; X86-NOSSE-LABEL: length16_eq:749; X86-NOSSE:       # %bb.0:750; X86-NOSSE-NEXT:    pushl %esi751; X86-NOSSE-NEXT:    movl {{[0-9]+}}(%esp), %ecx752; X86-NOSSE-NEXT:    movl {{[0-9]+}}(%esp), %edx753; X86-NOSSE-NEXT:    movl (%edx), %esi754; X86-NOSSE-NEXT:    movl 4(%edx), %eax755; X86-NOSSE-NEXT:    xorl (%ecx), %esi756; X86-NOSSE-NEXT:    xorl 4(%ecx), %eax757; X86-NOSSE-NEXT:    orl %esi, %eax758; X86-NOSSE-NEXT:    movl 8(%edx), %esi759; X86-NOSSE-NEXT:    xorl 8(%ecx), %esi760; X86-NOSSE-NEXT:    movl 12(%edx), %edx761; X86-NOSSE-NEXT:    xorl 12(%ecx), %edx762; X86-NOSSE-NEXT:    orl %esi, %edx763; X86-NOSSE-NEXT:    orl %eax, %edx764; X86-NOSSE-NEXT:    setne %al765; X86-NOSSE-NEXT:    popl %esi766; X86-NOSSE-NEXT:    retl767;768; X86-SSE1-LABEL: length16_eq:769; X86-SSE1:       # %bb.0:770; X86-SSE1-NEXT:    pushl %esi771; X86-SSE1-NEXT:    movl {{[0-9]+}}(%esp), %ecx772; X86-SSE1-NEXT:    movl {{[0-9]+}}(%esp), %edx773; X86-SSE1-NEXT:    movl (%edx), %esi774; X86-SSE1-NEXT:    movl 4(%edx), %eax775; X86-SSE1-NEXT:    xorl (%ecx), %esi776; X86-SSE1-NEXT:    xorl 4(%ecx), %eax777; X86-SSE1-NEXT:    orl %esi, %eax778; X86-SSE1-NEXT:    movl 8(%edx), %esi779; X86-SSE1-NEXT:    xorl 8(%ecx), %esi780; X86-SSE1-NEXT:    movl 12(%edx), %edx781; X86-SSE1-NEXT:    xorl 12(%ecx), %edx782; X86-SSE1-NEXT:    orl %esi, %edx783; X86-SSE1-NEXT:    orl %eax, %edx784; X86-SSE1-NEXT:    setne %al785; X86-SSE1-NEXT:    popl %esi786; X86-SSE1-NEXT:    retl787;788; X86-SSE2-LABEL: length16_eq:789; X86-SSE2:       # %bb.0:790; X86-SSE2-NEXT:    movl {{[0-9]+}}(%esp), %eax791; X86-SSE2-NEXT:    movl {{[0-9]+}}(%esp), %ecx792; X86-SSE2-NEXT:    movdqu (%ecx), %xmm0793; X86-SSE2-NEXT:    movdqu (%eax), %xmm1794; X86-SSE2-NEXT:    pcmpeqb %xmm0, %xmm1795; X86-SSE2-NEXT:    pmovmskb %xmm1, %eax796; X86-SSE2-NEXT:    cmpl $65535, %eax # imm = 0xFFFF797; X86-SSE2-NEXT:    setne %al798; X86-SSE2-NEXT:    retl799;800; X86-SSE41-LABEL: length16_eq:801; X86-SSE41:       # %bb.0:802; X86-SSE41-NEXT:    movl {{[0-9]+}}(%esp), %eax803; X86-SSE41-NEXT:    movl {{[0-9]+}}(%esp), %ecx804; X86-SSE41-NEXT:    movdqu (%ecx), %xmm0805; X86-SSE41-NEXT:    movdqu (%eax), %xmm1806; X86-SSE41-NEXT:    pxor %xmm0, %xmm1807; X86-SSE41-NEXT:    ptest %xmm1, %xmm1808; X86-SSE41-NEXT:    setne %al809; X86-SSE41-NEXT:    retl810  %call = tail call i32 @memcmp(ptr %x, ptr %y, i32 16) nounwind811  %cmp = icmp ne i32 %call, 0812  ret i1 %cmp813}814 815define i1 @length16_lt(ptr %x, ptr %y) nounwind {816; X86-LABEL: length16_lt:817; X86:       # %bb.0:818; X86-NEXT:    pushl %esi819; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax820; X86-NEXT:    movl {{[0-9]+}}(%esp), %esi821; X86-NEXT:    movl (%esi), %ecx822; X86-NEXT:    movl (%eax), %edx823; X86-NEXT:    bswapl %ecx824; X86-NEXT:    bswapl %edx825; X86-NEXT:    cmpl %edx, %ecx826; X86-NEXT:    jne .LBB35_4827; X86-NEXT:  # %bb.1: # %loadbb1828; X86-NEXT:    movl 4(%esi), %ecx829; X86-NEXT:    movl 4(%eax), %edx830; X86-NEXT:    bswapl %ecx831; X86-NEXT:    bswapl %edx832; X86-NEXT:    cmpl %edx, %ecx833; X86-NEXT:    jne .LBB35_4834; X86-NEXT:  # %bb.2: # %loadbb2835; X86-NEXT:    movl 8(%esi), %ecx836; X86-NEXT:    movl 8(%eax), %edx837; X86-NEXT:    bswapl %ecx838; X86-NEXT:    bswapl %edx839; X86-NEXT:    cmpl %edx, %ecx840; X86-NEXT:    jne .LBB35_4841; X86-NEXT:  # %bb.3: # %loadbb3842; X86-NEXT:    movl 12(%esi), %ecx843; X86-NEXT:    movl 12(%eax), %edx844; X86-NEXT:    bswapl %ecx845; X86-NEXT:    bswapl %edx846; X86-NEXT:    xorl %eax, %eax847; X86-NEXT:    cmpl %edx, %ecx848; X86-NEXT:    je .LBB35_5849; X86-NEXT:  .LBB35_4: # %res_block850; X86-NEXT:    xorl %eax, %eax851; X86-NEXT:    cmpl %edx, %ecx852; X86-NEXT:    setae %al853; X86-NEXT:    leal -1(%eax,%eax), %eax854; X86-NEXT:  .LBB35_5: # %endblock855; X86-NEXT:    shrl $31, %eax856; X86-NEXT:    # kill: def $al killed $al killed $eax857; X86-NEXT:    popl %esi858; X86-NEXT:    retl859  %call = tail call i32 @memcmp(ptr %x, ptr %y, i32 16) nounwind860  %cmp = icmp slt i32 %call, 0861  ret i1 %cmp862}863 864define i1 @length16_gt(ptr %x, ptr %y) nounwind {865; X86-LABEL: length16_gt:866; X86:       # %bb.0:867; X86-NEXT:    pushl %esi868; X86-NEXT:    movl {{[0-9]+}}(%esp), %edx869; X86-NEXT:    movl {{[0-9]+}}(%esp), %esi870; X86-NEXT:    movl (%esi), %eax871; X86-NEXT:    movl (%edx), %ecx872; X86-NEXT:    bswapl %eax873; X86-NEXT:    bswapl %ecx874; X86-NEXT:    cmpl %ecx, %eax875; X86-NEXT:    jne .LBB36_4876; X86-NEXT:  # %bb.1: # %loadbb1877; X86-NEXT:    movl 4(%esi), %eax878; X86-NEXT:    movl 4(%edx), %ecx879; X86-NEXT:    bswapl %eax880; X86-NEXT:    bswapl %ecx881; X86-NEXT:    cmpl %ecx, %eax882; X86-NEXT:    jne .LBB36_4883; X86-NEXT:  # %bb.2: # %loadbb2884; X86-NEXT:    movl 8(%esi), %eax885; X86-NEXT:    movl 8(%edx), %ecx886; X86-NEXT:    bswapl %eax887; X86-NEXT:    bswapl %ecx888; X86-NEXT:    cmpl %ecx, %eax889; X86-NEXT:    jne .LBB36_4890; X86-NEXT:  # %bb.3: # %loadbb3891; X86-NEXT:    movl 12(%esi), %eax892; X86-NEXT:    movl 12(%edx), %ecx893; X86-NEXT:    bswapl %eax894; X86-NEXT:    bswapl %ecx895; X86-NEXT:    xorl %edx, %edx896; X86-NEXT:    cmpl %ecx, %eax897; X86-NEXT:    je .LBB36_5898; X86-NEXT:  .LBB36_4: # %res_block899; X86-NEXT:    xorl %edx, %edx900; X86-NEXT:    cmpl %ecx, %eax901; X86-NEXT:    setae %dl902; X86-NEXT:    leal -1(%edx,%edx), %edx903; X86-NEXT:  .LBB36_5: # %endblock904; X86-NEXT:    testl %edx, %edx905; X86-NEXT:    setg %al906; X86-NEXT:    popl %esi907; X86-NEXT:    retl908  %call = tail call i32 @memcmp(ptr %x, ptr %y, i32 16) nounwind909  %cmp = icmp sgt i32 %call, 0910  ret i1 %cmp911}912 913define i1 @length16_eq_const(ptr %X) nounwind {914; X86-NOSSE-LABEL: length16_eq_const:915; X86-NOSSE:       # %bb.0:916; X86-NOSSE-NEXT:    pushl %esi917; X86-NOSSE-NEXT:    movl {{[0-9]+}}(%esp), %eax918; X86-NOSSE-NEXT:    movl $858927408, %ecx # imm = 0x33323130919; X86-NOSSE-NEXT:    xorl (%eax), %ecx920; X86-NOSSE-NEXT:    movl $926299444, %edx # imm = 0x37363534921; X86-NOSSE-NEXT:    xorl 4(%eax), %edx922; X86-NOSSE-NEXT:    orl %ecx, %edx923; X86-NOSSE-NEXT:    movl $825243960, %ecx # imm = 0x31303938924; X86-NOSSE-NEXT:    xorl 8(%eax), %ecx925; X86-NOSSE-NEXT:    movl $892613426, %esi # imm = 0x35343332926; X86-NOSSE-NEXT:    xorl 12(%eax), %esi927; X86-NOSSE-NEXT:    orl %ecx, %esi928; X86-NOSSE-NEXT:    orl %edx, %esi929; X86-NOSSE-NEXT:    sete %al930; X86-NOSSE-NEXT:    popl %esi931; X86-NOSSE-NEXT:    retl932;933; X86-SSE1-LABEL: length16_eq_const:934; X86-SSE1:       # %bb.0:935; X86-SSE1-NEXT:    pushl %esi936; X86-SSE1-NEXT:    movl {{[0-9]+}}(%esp), %eax937; X86-SSE1-NEXT:    movl $858927408, %ecx # imm = 0x33323130938; X86-SSE1-NEXT:    xorl (%eax), %ecx939; X86-SSE1-NEXT:    movl $926299444, %edx # imm = 0x37363534940; X86-SSE1-NEXT:    xorl 4(%eax), %edx941; X86-SSE1-NEXT:    orl %ecx, %edx942; X86-SSE1-NEXT:    movl $825243960, %ecx # imm = 0x31303938943; X86-SSE1-NEXT:    xorl 8(%eax), %ecx944; X86-SSE1-NEXT:    movl $892613426, %esi # imm = 0x35343332945; X86-SSE1-NEXT:    xorl 12(%eax), %esi946; X86-SSE1-NEXT:    orl %ecx, %esi947; X86-SSE1-NEXT:    orl %edx, %esi948; X86-SSE1-NEXT:    sete %al949; X86-SSE1-NEXT:    popl %esi950; X86-SSE1-NEXT:    retl951;952; X86-SSE2-LABEL: length16_eq_const:953; X86-SSE2:       # %bb.0:954; X86-SSE2-NEXT:    movl {{[0-9]+}}(%esp), %eax955; X86-SSE2-NEXT:    movdqu (%eax), %xmm0956; X86-SSE2-NEXT:    pcmpeqb {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0957; X86-SSE2-NEXT:    pmovmskb %xmm0, %eax958; X86-SSE2-NEXT:    cmpl $65535, %eax # imm = 0xFFFF959; X86-SSE2-NEXT:    sete %al960; X86-SSE2-NEXT:    retl961;962; X86-SSE41-LABEL: length16_eq_const:963; X86-SSE41:       # %bb.0:964; X86-SSE41-NEXT:    movl {{[0-9]+}}(%esp), %eax965; X86-SSE41-NEXT:    movdqu (%eax), %xmm0966; X86-SSE41-NEXT:    pxor {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0967; X86-SSE41-NEXT:    ptest %xmm0, %xmm0968; X86-SSE41-NEXT:    sete %al969; X86-SSE41-NEXT:    retl970  %m = tail call i32 @memcmp(ptr %X, ptr @.str, i32 16) nounwind971  %c = icmp eq i32 %m, 0972  ret i1 %c973}974 975; PR33914 - https://bugs.llvm.org/show_bug.cgi?id=33914976 977define i32 @length24(ptr %X, ptr %Y) nounwind {978; X86-LABEL: length24:979; X86:       # %bb.0:980; X86-NEXT:    pushl $24981; X86-NEXT:    pushl {{[0-9]+}}(%esp)982; X86-NEXT:    pushl {{[0-9]+}}(%esp)983; X86-NEXT:    calll memcmp984; X86-NEXT:    addl $12, %esp985; X86-NEXT:    retl986  %m = tail call i32 @memcmp(ptr %X, ptr %Y, i32 24) nounwind987  ret i32 %m988}989 990define i1 @length24_eq(ptr %x, ptr %y) nounwind {991; X86-NOSSE-LABEL: length24_eq:992; X86-NOSSE:       # %bb.0:993; X86-NOSSE-NEXT:    pushl $24994; X86-NOSSE-NEXT:    pushl {{[0-9]+}}(%esp)995; X86-NOSSE-NEXT:    pushl {{[0-9]+}}(%esp)996; X86-NOSSE-NEXT:    calll memcmp997; X86-NOSSE-NEXT:    addl $12, %esp998; X86-NOSSE-NEXT:    testl %eax, %eax999; X86-NOSSE-NEXT:    sete %al1000; X86-NOSSE-NEXT:    retl1001;1002; X86-SSE1-LABEL: length24_eq:1003; X86-SSE1:       # %bb.0:1004; X86-SSE1-NEXT:    pushl $241005; X86-SSE1-NEXT:    pushl {{[0-9]+}}(%esp)1006; X86-SSE1-NEXT:    pushl {{[0-9]+}}(%esp)1007; X86-SSE1-NEXT:    calll memcmp1008; X86-SSE1-NEXT:    addl $12, %esp1009; X86-SSE1-NEXT:    testl %eax, %eax1010; X86-SSE1-NEXT:    sete %al1011; X86-SSE1-NEXT:    retl1012;1013; X86-SSE2-LABEL: length24_eq:1014; X86-SSE2:       # %bb.0:1015; X86-SSE2-NEXT:    movl {{[0-9]+}}(%esp), %eax1016; X86-SSE2-NEXT:    movl {{[0-9]+}}(%esp), %ecx1017; X86-SSE2-NEXT:    movdqu (%ecx), %xmm01018; X86-SSE2-NEXT:    movdqu 8(%ecx), %xmm11019; X86-SSE2-NEXT:    movdqu (%eax), %xmm21020; X86-SSE2-NEXT:    pcmpeqb %xmm0, %xmm21021; X86-SSE2-NEXT:    movdqu 8(%eax), %xmm01022; X86-SSE2-NEXT:    pcmpeqb %xmm1, %xmm01023; X86-SSE2-NEXT:    pand %xmm2, %xmm01024; X86-SSE2-NEXT:    pmovmskb %xmm0, %eax1025; X86-SSE2-NEXT:    cmpl $65535, %eax # imm = 0xFFFF1026; X86-SSE2-NEXT:    sete %al1027; X86-SSE2-NEXT:    retl1028;1029; X86-SSE41-LABEL: length24_eq:1030; X86-SSE41:       # %bb.0:1031; X86-SSE41-NEXT:    movl {{[0-9]+}}(%esp), %eax1032; X86-SSE41-NEXT:    movl {{[0-9]+}}(%esp), %ecx1033; X86-SSE41-NEXT:    movdqu (%ecx), %xmm01034; X86-SSE41-NEXT:    movdqu 8(%ecx), %xmm11035; X86-SSE41-NEXT:    movdqu (%eax), %xmm21036; X86-SSE41-NEXT:    pxor %xmm0, %xmm21037; X86-SSE41-NEXT:    movdqu 8(%eax), %xmm01038; X86-SSE41-NEXT:    pxor %xmm1, %xmm01039; X86-SSE41-NEXT:    por %xmm2, %xmm01040; X86-SSE41-NEXT:    ptest %xmm0, %xmm01041; X86-SSE41-NEXT:    sete %al1042; X86-SSE41-NEXT:    retl1043  %call = tail call i32 @memcmp(ptr %x, ptr %y, i32 24) nounwind1044  %cmp = icmp eq i32 %call, 01045  ret i1 %cmp1046}1047 1048define i1 @length24_lt(ptr %x, ptr %y) nounwind {1049; X86-LABEL: length24_lt:1050; X86:       # %bb.0:1051; X86-NEXT:    pushl $241052; X86-NEXT:    pushl {{[0-9]+}}(%esp)1053; X86-NEXT:    pushl {{[0-9]+}}(%esp)1054; X86-NEXT:    calll memcmp1055; X86-NEXT:    addl $12, %esp1056; X86-NEXT:    shrl $31, %eax1057; X86-NEXT:    # kill: def $al killed $al killed $eax1058; X86-NEXT:    retl1059  %call = tail call i32 @memcmp(ptr %x, ptr %y, i32 24) nounwind1060  %cmp = icmp slt i32 %call, 01061  ret i1 %cmp1062}1063 1064define i1 @length24_gt(ptr %x, ptr %y) nounwind {1065; X86-LABEL: length24_gt:1066; X86:       # %bb.0:1067; X86-NEXT:    pushl $241068; X86-NEXT:    pushl {{[0-9]+}}(%esp)1069; X86-NEXT:    pushl {{[0-9]+}}(%esp)1070; X86-NEXT:    calll memcmp1071; X86-NEXT:    addl $12, %esp1072; X86-NEXT:    testl %eax, %eax1073; X86-NEXT:    setg %al1074; X86-NEXT:    retl1075  %call = tail call i32 @memcmp(ptr %x, ptr %y, i32 24) nounwind1076  %cmp = icmp sgt i32 %call, 01077  ret i1 %cmp1078}1079 1080define i1 @length24_eq_const(ptr %X) nounwind {1081; X86-NOSSE-LABEL: length24_eq_const:1082; X86-NOSSE:       # %bb.0:1083; X86-NOSSE-NEXT:    pushl $241084; X86-NOSSE-NEXT:    pushl $.L.str1085; X86-NOSSE-NEXT:    pushl {{[0-9]+}}(%esp)1086; X86-NOSSE-NEXT:    calll memcmp1087; X86-NOSSE-NEXT:    addl $12, %esp1088; X86-NOSSE-NEXT:    testl %eax, %eax1089; X86-NOSSE-NEXT:    setne %al1090; X86-NOSSE-NEXT:    retl1091;1092; X86-SSE1-LABEL: length24_eq_const:1093; X86-SSE1:       # %bb.0:1094; X86-SSE1-NEXT:    pushl $241095; X86-SSE1-NEXT:    pushl $.L.str1096; X86-SSE1-NEXT:    pushl {{[0-9]+}}(%esp)1097; X86-SSE1-NEXT:    calll memcmp1098; X86-SSE1-NEXT:    addl $12, %esp1099; X86-SSE1-NEXT:    testl %eax, %eax1100; X86-SSE1-NEXT:    setne %al1101; X86-SSE1-NEXT:    retl1102;1103; X86-SSE2-LABEL: length24_eq_const:1104; X86-SSE2:       # %bb.0:1105; X86-SSE2-NEXT:    movl {{[0-9]+}}(%esp), %eax1106; X86-SSE2-NEXT:    movdqu (%eax), %xmm01107; X86-SSE2-NEXT:    movdqu 8(%eax), %xmm11108; X86-SSE2-NEXT:    pcmpeqb {{\.?LCPI[0-9]+_[0-9]+}}, %xmm11109; X86-SSE2-NEXT:    pcmpeqb {{\.?LCPI[0-9]+_[0-9]+}}, %xmm01110; X86-SSE2-NEXT:    pand %xmm1, %xmm01111; X86-SSE2-NEXT:    pmovmskb %xmm0, %eax1112; X86-SSE2-NEXT:    cmpl $65535, %eax # imm = 0xFFFF1113; X86-SSE2-NEXT:    setne %al1114; X86-SSE2-NEXT:    retl1115;1116; X86-SSE41-LABEL: length24_eq_const:1117; X86-SSE41:       # %bb.0:1118; X86-SSE41-NEXT:    movl {{[0-9]+}}(%esp), %eax1119; X86-SSE41-NEXT:    movdqu (%eax), %xmm01120; X86-SSE41-NEXT:    movdqu 8(%eax), %xmm11121; X86-SSE41-NEXT:    pxor {{\.?LCPI[0-9]+_[0-9]+}}, %xmm11122; X86-SSE41-NEXT:    pxor {{\.?LCPI[0-9]+_[0-9]+}}, %xmm01123; X86-SSE41-NEXT:    por %xmm1, %xmm01124; X86-SSE41-NEXT:    ptest %xmm0, %xmm01125; X86-SSE41-NEXT:    setne %al1126; X86-SSE41-NEXT:    retl1127  %m = tail call i32 @memcmp(ptr %X, ptr @.str, i32 24) nounwind1128  %c = icmp ne i32 %m, 01129  ret i1 %c1130}1131 1132define i32 @length31(ptr %X, ptr %Y) nounwind {1133; X86-LABEL: length31:1134; X86:       # %bb.0:1135; X86-NEXT:    pushl $311136; X86-NEXT:    pushl {{[0-9]+}}(%esp)1137; X86-NEXT:    pushl {{[0-9]+}}(%esp)1138; X86-NEXT:    calll memcmp1139; X86-NEXT:    addl $12, %esp1140; X86-NEXT:    retl1141  %m = tail call i32 @memcmp(ptr %X, ptr %Y, i32 31) nounwind1142  ret i32 %m1143}1144 1145define i1 @length31_eq(ptr %x, ptr %y) nounwind {1146; X86-NOSSE-LABEL: length31_eq:1147; X86-NOSSE:       # %bb.0:1148; X86-NOSSE-NEXT:    pushl $311149; X86-NOSSE-NEXT:    pushl {{[0-9]+}}(%esp)1150; X86-NOSSE-NEXT:    pushl {{[0-9]+}}(%esp)1151; X86-NOSSE-NEXT:    calll memcmp1152; X86-NOSSE-NEXT:    addl $12, %esp1153; X86-NOSSE-NEXT:    testl %eax, %eax1154; X86-NOSSE-NEXT:    sete %al1155; X86-NOSSE-NEXT:    retl1156;1157; X86-SSE1-LABEL: length31_eq:1158; X86-SSE1:       # %bb.0:1159; X86-SSE1-NEXT:    pushl $311160; X86-SSE1-NEXT:    pushl {{[0-9]+}}(%esp)1161; X86-SSE1-NEXT:    pushl {{[0-9]+}}(%esp)1162; X86-SSE1-NEXT:    calll memcmp1163; X86-SSE1-NEXT:    addl $12, %esp1164; X86-SSE1-NEXT:    testl %eax, %eax1165; X86-SSE1-NEXT:    sete %al1166; X86-SSE1-NEXT:    retl1167;1168; X86-SSE2-LABEL: length31_eq:1169; X86-SSE2:       # %bb.0:1170; X86-SSE2-NEXT:    movl {{[0-9]+}}(%esp), %eax1171; X86-SSE2-NEXT:    movl {{[0-9]+}}(%esp), %ecx1172; X86-SSE2-NEXT:    movdqu (%ecx), %xmm01173; X86-SSE2-NEXT:    movdqu 15(%ecx), %xmm11174; X86-SSE2-NEXT:    movdqu (%eax), %xmm21175; X86-SSE2-NEXT:    pcmpeqb %xmm0, %xmm21176; X86-SSE2-NEXT:    movdqu 15(%eax), %xmm01177; X86-SSE2-NEXT:    pcmpeqb %xmm1, %xmm01178; X86-SSE2-NEXT:    pand %xmm2, %xmm01179; X86-SSE2-NEXT:    pmovmskb %xmm0, %eax1180; X86-SSE2-NEXT:    cmpl $65535, %eax # imm = 0xFFFF1181; X86-SSE2-NEXT:    sete %al1182; X86-SSE2-NEXT:    retl1183;1184; X86-SSE41-LABEL: length31_eq:1185; X86-SSE41:       # %bb.0:1186; X86-SSE41-NEXT:    movl {{[0-9]+}}(%esp), %eax1187; X86-SSE41-NEXT:    movl {{[0-9]+}}(%esp), %ecx1188; X86-SSE41-NEXT:    movdqu (%ecx), %xmm01189; X86-SSE41-NEXT:    movdqu 15(%ecx), %xmm11190; X86-SSE41-NEXT:    movdqu (%eax), %xmm21191; X86-SSE41-NEXT:    pxor %xmm0, %xmm21192; X86-SSE41-NEXT:    movdqu 15(%eax), %xmm01193; X86-SSE41-NEXT:    pxor %xmm1, %xmm01194; X86-SSE41-NEXT:    por %xmm2, %xmm01195; X86-SSE41-NEXT:    ptest %xmm0, %xmm01196; X86-SSE41-NEXT:    sete %al1197; X86-SSE41-NEXT:    retl1198  %call = tail call i32 @memcmp(ptr %x, ptr %y, i32 31) nounwind1199  %cmp = icmp eq i32 %call, 01200  ret i1 %cmp1201}1202 1203define i1 @length31_lt(ptr %x, ptr %y) nounwind {1204; X86-LABEL: length31_lt:1205; X86:       # %bb.0:1206; X86-NEXT:    pushl $311207; X86-NEXT:    pushl {{[0-9]+}}(%esp)1208; X86-NEXT:    pushl {{[0-9]+}}(%esp)1209; X86-NEXT:    calll memcmp1210; X86-NEXT:    addl $12, %esp1211; X86-NEXT:    shrl $31, %eax1212; X86-NEXT:    # kill: def $al killed $al killed $eax1213; X86-NEXT:    retl1214  %call = tail call i32 @memcmp(ptr %x, ptr %y, i32 31) nounwind1215  %cmp = icmp slt i32 %call, 01216  ret i1 %cmp1217}1218 1219define i1 @length31_gt(ptr %x, ptr %y) nounwind {1220; X86-LABEL: length31_gt:1221; X86:       # %bb.0:1222; X86-NEXT:    pushl $311223; X86-NEXT:    pushl {{[0-9]+}}(%esp)1224; X86-NEXT:    pushl {{[0-9]+}}(%esp)1225; X86-NEXT:    calll memcmp1226; X86-NEXT:    addl $12, %esp1227; X86-NEXT:    testl %eax, %eax1228; X86-NEXT:    setg %al1229; X86-NEXT:    retl1230  %call = tail call i32 @memcmp(ptr %x, ptr %y, i32 31) nounwind1231  %cmp = icmp sgt i32 %call, 01232  ret i1 %cmp1233}1234 1235define i1 @length31_eq_prefer128(ptr %x, ptr %y) nounwind "prefer-vector-width"="128" {1236; X86-NOSSE-LABEL: length31_eq_prefer128:1237; X86-NOSSE:       # %bb.0:1238; X86-NOSSE-NEXT:    pushl $311239; X86-NOSSE-NEXT:    pushl {{[0-9]+}}(%esp)1240; X86-NOSSE-NEXT:    pushl {{[0-9]+}}(%esp)1241; X86-NOSSE-NEXT:    calll memcmp1242; X86-NOSSE-NEXT:    addl $12, %esp1243; X86-NOSSE-NEXT:    testl %eax, %eax1244; X86-NOSSE-NEXT:    sete %al1245; X86-NOSSE-NEXT:    retl1246;1247; X86-SSE1-LABEL: length31_eq_prefer128:1248; X86-SSE1:       # %bb.0:1249; X86-SSE1-NEXT:    pushl $311250; X86-SSE1-NEXT:    pushl {{[0-9]+}}(%esp)1251; X86-SSE1-NEXT:    pushl {{[0-9]+}}(%esp)1252; X86-SSE1-NEXT:    calll memcmp1253; X86-SSE1-NEXT:    addl $12, %esp1254; X86-SSE1-NEXT:    testl %eax, %eax1255; X86-SSE1-NEXT:    sete %al1256; X86-SSE1-NEXT:    retl1257;1258; X86-SSE2-LABEL: length31_eq_prefer128:1259; X86-SSE2:       # %bb.0:1260; X86-SSE2-NEXT:    movl {{[0-9]+}}(%esp), %eax1261; X86-SSE2-NEXT:    movl {{[0-9]+}}(%esp), %ecx1262; X86-SSE2-NEXT:    movdqu (%ecx), %xmm01263; X86-SSE2-NEXT:    movdqu 15(%ecx), %xmm11264; X86-SSE2-NEXT:    movdqu (%eax), %xmm21265; X86-SSE2-NEXT:    pcmpeqb %xmm0, %xmm21266; X86-SSE2-NEXT:    movdqu 15(%eax), %xmm01267; X86-SSE2-NEXT:    pcmpeqb %xmm1, %xmm01268; X86-SSE2-NEXT:    pand %xmm2, %xmm01269; X86-SSE2-NEXT:    pmovmskb %xmm0, %eax1270; X86-SSE2-NEXT:    cmpl $65535, %eax # imm = 0xFFFF1271; X86-SSE2-NEXT:    sete %al1272; X86-SSE2-NEXT:    retl1273;1274; X86-SSE41-LABEL: length31_eq_prefer128:1275; X86-SSE41:       # %bb.0:1276; X86-SSE41-NEXT:    movl {{[0-9]+}}(%esp), %eax1277; X86-SSE41-NEXT:    movl {{[0-9]+}}(%esp), %ecx1278; X86-SSE41-NEXT:    movdqu (%ecx), %xmm01279; X86-SSE41-NEXT:    movdqu 15(%ecx), %xmm11280; X86-SSE41-NEXT:    movdqu (%eax), %xmm21281; X86-SSE41-NEXT:    pxor %xmm0, %xmm21282; X86-SSE41-NEXT:    movdqu 15(%eax), %xmm01283; X86-SSE41-NEXT:    pxor %xmm1, %xmm01284; X86-SSE41-NEXT:    por %xmm2, %xmm01285; X86-SSE41-NEXT:    ptest %xmm0, %xmm01286; X86-SSE41-NEXT:    sete %al1287; X86-SSE41-NEXT:    retl1288  %call = tail call i32 @memcmp(ptr %x, ptr %y, i32 31) nounwind1289  %cmp = icmp eq i32 %call, 01290  ret i1 %cmp1291}1292 1293define i1 @length31_eq_const(ptr %X) nounwind {1294; X86-NOSSE-LABEL: length31_eq_const:1295; X86-NOSSE:       # %bb.0:1296; X86-NOSSE-NEXT:    pushl $311297; X86-NOSSE-NEXT:    pushl $.L.str1298; X86-NOSSE-NEXT:    pushl {{[0-9]+}}(%esp)1299; X86-NOSSE-NEXT:    calll memcmp1300; X86-NOSSE-NEXT:    addl $12, %esp1301; X86-NOSSE-NEXT:    testl %eax, %eax1302; X86-NOSSE-NEXT:    setne %al1303; X86-NOSSE-NEXT:    retl1304;1305; X86-SSE1-LABEL: length31_eq_const:1306; X86-SSE1:       # %bb.0:1307; X86-SSE1-NEXT:    pushl $311308; X86-SSE1-NEXT:    pushl $.L.str1309; X86-SSE1-NEXT:    pushl {{[0-9]+}}(%esp)1310; X86-SSE1-NEXT:    calll memcmp1311; X86-SSE1-NEXT:    addl $12, %esp1312; X86-SSE1-NEXT:    testl %eax, %eax1313; X86-SSE1-NEXT:    setne %al1314; X86-SSE1-NEXT:    retl1315;1316; X86-SSE2-LABEL: length31_eq_const:1317; X86-SSE2:       # %bb.0:1318; X86-SSE2-NEXT:    movl {{[0-9]+}}(%esp), %eax1319; X86-SSE2-NEXT:    movdqu (%eax), %xmm01320; X86-SSE2-NEXT:    movdqu 15(%eax), %xmm11321; X86-SSE2-NEXT:    pcmpeqb {{\.?LCPI[0-9]+_[0-9]+}}, %xmm11322; X86-SSE2-NEXT:    pcmpeqb {{\.?LCPI[0-9]+_[0-9]+}}, %xmm01323; X86-SSE2-NEXT:    pand %xmm1, %xmm01324; X86-SSE2-NEXT:    pmovmskb %xmm0, %eax1325; X86-SSE2-NEXT:    cmpl $65535, %eax # imm = 0xFFFF1326; X86-SSE2-NEXT:    setne %al1327; X86-SSE2-NEXT:    retl1328;1329; X86-SSE41-LABEL: length31_eq_const:1330; X86-SSE41:       # %bb.0:1331; X86-SSE41-NEXT:    movl {{[0-9]+}}(%esp), %eax1332; X86-SSE41-NEXT:    movdqu (%eax), %xmm01333; X86-SSE41-NEXT:    movdqu 15(%eax), %xmm11334; X86-SSE41-NEXT:    pxor {{\.?LCPI[0-9]+_[0-9]+}}, %xmm11335; X86-SSE41-NEXT:    pxor {{\.?LCPI[0-9]+_[0-9]+}}, %xmm01336; X86-SSE41-NEXT:    por %xmm1, %xmm01337; X86-SSE41-NEXT:    ptest %xmm0, %xmm01338; X86-SSE41-NEXT:    setne %al1339; X86-SSE41-NEXT:    retl1340  %m = tail call i32 @memcmp(ptr %X, ptr @.str, i32 31) nounwind1341  %c = icmp ne i32 %m, 01342  ret i1 %c1343}1344 1345define i32 @length32(ptr %X, ptr %Y) nounwind {1346; X86-LABEL: length32:1347; X86:       # %bb.0:1348; X86-NEXT:    pushl $321349; X86-NEXT:    pushl {{[0-9]+}}(%esp)1350; X86-NEXT:    pushl {{[0-9]+}}(%esp)1351; X86-NEXT:    calll memcmp1352; X86-NEXT:    addl $12, %esp1353; X86-NEXT:    retl1354  %m = tail call i32 @memcmp(ptr %X, ptr %Y, i32 32) nounwind1355  ret i32 %m1356}1357 1358; PR33325 - https://bugs.llvm.org/show_bug.cgi?id=333251359 1360define i1 @length32_eq(ptr %x, ptr %y) nounwind {1361; X86-NOSSE-LABEL: length32_eq:1362; X86-NOSSE:       # %bb.0:1363; X86-NOSSE-NEXT:    pushl $321364; X86-NOSSE-NEXT:    pushl {{[0-9]+}}(%esp)1365; X86-NOSSE-NEXT:    pushl {{[0-9]+}}(%esp)1366; X86-NOSSE-NEXT:    calll memcmp1367; X86-NOSSE-NEXT:    addl $12, %esp1368; X86-NOSSE-NEXT:    testl %eax, %eax1369; X86-NOSSE-NEXT:    sete %al1370; X86-NOSSE-NEXT:    retl1371;1372; X86-SSE1-LABEL: length32_eq:1373; X86-SSE1:       # %bb.0:1374; X86-SSE1-NEXT:    pushl $321375; X86-SSE1-NEXT:    pushl {{[0-9]+}}(%esp)1376; X86-SSE1-NEXT:    pushl {{[0-9]+}}(%esp)1377; X86-SSE1-NEXT:    calll memcmp1378; X86-SSE1-NEXT:    addl $12, %esp1379; X86-SSE1-NEXT:    testl %eax, %eax1380; X86-SSE1-NEXT:    sete %al1381; X86-SSE1-NEXT:    retl1382;1383; X86-SSE2-LABEL: length32_eq:1384; X86-SSE2:       # %bb.0:1385; X86-SSE2-NEXT:    movl {{[0-9]+}}(%esp), %eax1386; X86-SSE2-NEXT:    movl {{[0-9]+}}(%esp), %ecx1387; X86-SSE2-NEXT:    movdqu (%ecx), %xmm01388; X86-SSE2-NEXT:    movdqu 16(%ecx), %xmm11389; X86-SSE2-NEXT:    movdqu (%eax), %xmm21390; X86-SSE2-NEXT:    pcmpeqb %xmm0, %xmm21391; X86-SSE2-NEXT:    movdqu 16(%eax), %xmm01392; X86-SSE2-NEXT:    pcmpeqb %xmm1, %xmm01393; X86-SSE2-NEXT:    pand %xmm2, %xmm01394; X86-SSE2-NEXT:    pmovmskb %xmm0, %eax1395; X86-SSE2-NEXT:    cmpl $65535, %eax # imm = 0xFFFF1396; X86-SSE2-NEXT:    sete %al1397; X86-SSE2-NEXT:    retl1398;1399; X86-SSE41-LABEL: length32_eq:1400; X86-SSE41:       # %bb.0:1401; X86-SSE41-NEXT:    movl {{[0-9]+}}(%esp), %eax1402; X86-SSE41-NEXT:    movl {{[0-9]+}}(%esp), %ecx1403; X86-SSE41-NEXT:    movdqu (%ecx), %xmm01404; X86-SSE41-NEXT:    movdqu 16(%ecx), %xmm11405; X86-SSE41-NEXT:    movdqu (%eax), %xmm21406; X86-SSE41-NEXT:    pxor %xmm0, %xmm21407; X86-SSE41-NEXT:    movdqu 16(%eax), %xmm01408; X86-SSE41-NEXT:    pxor %xmm1, %xmm01409; X86-SSE41-NEXT:    por %xmm2, %xmm01410; X86-SSE41-NEXT:    ptest %xmm0, %xmm01411; X86-SSE41-NEXT:    sete %al1412; X86-SSE41-NEXT:    retl1413  %call = tail call i32 @memcmp(ptr %x, ptr %y, i32 32) nounwind1414  %cmp = icmp eq i32 %call, 01415  ret i1 %cmp1416}1417 1418define i1 @length32_lt(ptr %x, ptr %y) nounwind {1419; X86-LABEL: length32_lt:1420; X86:       # %bb.0:1421; X86-NEXT:    pushl $321422; X86-NEXT:    pushl {{[0-9]+}}(%esp)1423; X86-NEXT:    pushl {{[0-9]+}}(%esp)1424; X86-NEXT:    calll memcmp1425; X86-NEXT:    addl $12, %esp1426; X86-NEXT:    shrl $31, %eax1427; X86-NEXT:    # kill: def $al killed $al killed $eax1428; X86-NEXT:    retl1429  %call = tail call i32 @memcmp(ptr %x, ptr %y, i32 32) nounwind1430  %cmp = icmp slt i32 %call, 01431  ret i1 %cmp1432}1433 1434define i1 @length32_gt(ptr %x, ptr %y) nounwind {1435; X86-LABEL: length32_gt:1436; X86:       # %bb.0:1437; X86-NEXT:    pushl $321438; X86-NEXT:    pushl {{[0-9]+}}(%esp)1439; X86-NEXT:    pushl {{[0-9]+}}(%esp)1440; X86-NEXT:    calll memcmp1441; X86-NEXT:    addl $12, %esp1442; X86-NEXT:    testl %eax, %eax1443; X86-NEXT:    setg %al1444; X86-NEXT:    retl1445  %call = tail call i32 @memcmp(ptr %x, ptr %y, i32 32) nounwind1446  %cmp = icmp sgt i32 %call, 01447  ret i1 %cmp1448}1449 1450define i1 @length32_eq_prefer128(ptr %x, ptr %y) nounwind "prefer-vector-width"="128" {1451; X86-NOSSE-LABEL: length32_eq_prefer128:1452; X86-NOSSE:       # %bb.0:1453; X86-NOSSE-NEXT:    pushl $321454; X86-NOSSE-NEXT:    pushl {{[0-9]+}}(%esp)1455; X86-NOSSE-NEXT:    pushl {{[0-9]+}}(%esp)1456; X86-NOSSE-NEXT:    calll memcmp1457; X86-NOSSE-NEXT:    addl $12, %esp1458; X86-NOSSE-NEXT:    testl %eax, %eax1459; X86-NOSSE-NEXT:    sete %al1460; X86-NOSSE-NEXT:    retl1461;1462; X86-SSE1-LABEL: length32_eq_prefer128:1463; X86-SSE1:       # %bb.0:1464; X86-SSE1-NEXT:    pushl $321465; X86-SSE1-NEXT:    pushl {{[0-9]+}}(%esp)1466; X86-SSE1-NEXT:    pushl {{[0-9]+}}(%esp)1467; X86-SSE1-NEXT:    calll memcmp1468; X86-SSE1-NEXT:    addl $12, %esp1469; X86-SSE1-NEXT:    testl %eax, %eax1470; X86-SSE1-NEXT:    sete %al1471; X86-SSE1-NEXT:    retl1472;1473; X86-SSE2-LABEL: length32_eq_prefer128:1474; X86-SSE2:       # %bb.0:1475; X86-SSE2-NEXT:    movl {{[0-9]+}}(%esp), %eax1476; X86-SSE2-NEXT:    movl {{[0-9]+}}(%esp), %ecx1477; X86-SSE2-NEXT:    movdqu (%ecx), %xmm01478; X86-SSE2-NEXT:    movdqu 16(%ecx), %xmm11479; X86-SSE2-NEXT:    movdqu (%eax), %xmm21480; X86-SSE2-NEXT:    pcmpeqb %xmm0, %xmm21481; X86-SSE2-NEXT:    movdqu 16(%eax), %xmm01482; X86-SSE2-NEXT:    pcmpeqb %xmm1, %xmm01483; X86-SSE2-NEXT:    pand %xmm2, %xmm01484; X86-SSE2-NEXT:    pmovmskb %xmm0, %eax1485; X86-SSE2-NEXT:    cmpl $65535, %eax # imm = 0xFFFF1486; X86-SSE2-NEXT:    sete %al1487; X86-SSE2-NEXT:    retl1488;1489; X86-SSE41-LABEL: length32_eq_prefer128:1490; X86-SSE41:       # %bb.0:1491; X86-SSE41-NEXT:    movl {{[0-9]+}}(%esp), %eax1492; X86-SSE41-NEXT:    movl {{[0-9]+}}(%esp), %ecx1493; X86-SSE41-NEXT:    movdqu (%ecx), %xmm01494; X86-SSE41-NEXT:    movdqu 16(%ecx), %xmm11495; X86-SSE41-NEXT:    movdqu (%eax), %xmm21496; X86-SSE41-NEXT:    pxor %xmm0, %xmm21497; X86-SSE41-NEXT:    movdqu 16(%eax), %xmm01498; X86-SSE41-NEXT:    pxor %xmm1, %xmm01499; X86-SSE41-NEXT:    por %xmm2, %xmm01500; X86-SSE41-NEXT:    ptest %xmm0, %xmm01501; X86-SSE41-NEXT:    sete %al1502; X86-SSE41-NEXT:    retl1503  %call = tail call i32 @memcmp(ptr %x, ptr %y, i32 32) nounwind1504  %cmp = icmp eq i32 %call, 01505  ret i1 %cmp1506}1507 1508define i1 @length32_eq_const(ptr %X) nounwind {1509; X86-NOSSE-LABEL: length32_eq_const:1510; X86-NOSSE:       # %bb.0:1511; X86-NOSSE-NEXT:    pushl $321512; X86-NOSSE-NEXT:    pushl $.L.str1513; X86-NOSSE-NEXT:    pushl {{[0-9]+}}(%esp)1514; X86-NOSSE-NEXT:    calll memcmp1515; X86-NOSSE-NEXT:    addl $12, %esp1516; X86-NOSSE-NEXT:    testl %eax, %eax1517; X86-NOSSE-NEXT:    setne %al1518; X86-NOSSE-NEXT:    retl1519;1520; X86-SSE1-LABEL: length32_eq_const:1521; X86-SSE1:       # %bb.0:1522; X86-SSE1-NEXT:    pushl $321523; X86-SSE1-NEXT:    pushl $.L.str1524; X86-SSE1-NEXT:    pushl {{[0-9]+}}(%esp)1525; X86-SSE1-NEXT:    calll memcmp1526; X86-SSE1-NEXT:    addl $12, %esp1527; X86-SSE1-NEXT:    testl %eax, %eax1528; X86-SSE1-NEXT:    setne %al1529; X86-SSE1-NEXT:    retl1530;1531; X86-SSE2-LABEL: length32_eq_const:1532; X86-SSE2:       # %bb.0:1533; X86-SSE2-NEXT:    movl {{[0-9]+}}(%esp), %eax1534; X86-SSE2-NEXT:    movdqu (%eax), %xmm01535; X86-SSE2-NEXT:    movdqu 16(%eax), %xmm11536; X86-SSE2-NEXT:    pcmpeqb {{\.?LCPI[0-9]+_[0-9]+}}, %xmm11537; X86-SSE2-NEXT:    pcmpeqb {{\.?LCPI[0-9]+_[0-9]+}}, %xmm01538; X86-SSE2-NEXT:    pand %xmm1, %xmm01539; X86-SSE2-NEXT:    pmovmskb %xmm0, %eax1540; X86-SSE2-NEXT:    cmpl $65535, %eax # imm = 0xFFFF1541; X86-SSE2-NEXT:    setne %al1542; X86-SSE2-NEXT:    retl1543;1544; X86-SSE41-LABEL: length32_eq_const:1545; X86-SSE41:       # %bb.0:1546; X86-SSE41-NEXT:    movl {{[0-9]+}}(%esp), %eax1547; X86-SSE41-NEXT:    movdqu (%eax), %xmm01548; X86-SSE41-NEXT:    movdqu 16(%eax), %xmm11549; X86-SSE41-NEXT:    pxor {{\.?LCPI[0-9]+_[0-9]+}}, %xmm11550; X86-SSE41-NEXT:    pxor {{\.?LCPI[0-9]+_[0-9]+}}, %xmm01551; X86-SSE41-NEXT:    por %xmm1, %xmm01552; X86-SSE41-NEXT:    ptest %xmm0, %xmm01553; X86-SSE41-NEXT:    setne %al1554; X86-SSE41-NEXT:    retl1555  %m = tail call i32 @memcmp(ptr %X, ptr @.str, i32 32) nounwind1556  %c = icmp ne i32 %m, 01557  ret i1 %c1558}1559 1560define i32 @length48(ptr %X, ptr %Y) nounwind {1561; X86-LABEL: length48:1562; X86:       # %bb.0:1563; X86-NEXT:    pushl $481564; X86-NEXT:    pushl {{[0-9]+}}(%esp)1565; X86-NEXT:    pushl {{[0-9]+}}(%esp)1566; X86-NEXT:    calll memcmp1567; X86-NEXT:    addl $12, %esp1568; X86-NEXT:    retl1569  %m = tail call i32 @memcmp(ptr %X, ptr %Y, i32 48) nounwind1570  ret i32 %m1571}1572 1573define i1 @length48_eq(ptr %x, ptr %y) nounwind {1574; X86-NOSSE-LABEL: length48_eq:1575; X86-NOSSE:       # %bb.0:1576; X86-NOSSE-NEXT:    pushl $481577; X86-NOSSE-NEXT:    pushl {{[0-9]+}}(%esp)1578; X86-NOSSE-NEXT:    pushl {{[0-9]+}}(%esp)1579; X86-NOSSE-NEXT:    calll memcmp1580; X86-NOSSE-NEXT:    addl $12, %esp1581; X86-NOSSE-NEXT:    testl %eax, %eax1582; X86-NOSSE-NEXT:    sete %al1583; X86-NOSSE-NEXT:    retl1584;1585; X86-SSE1-LABEL: length48_eq:1586; X86-SSE1:       # %bb.0:1587; X86-SSE1-NEXT:    pushl $481588; X86-SSE1-NEXT:    pushl {{[0-9]+}}(%esp)1589; X86-SSE1-NEXT:    pushl {{[0-9]+}}(%esp)1590; X86-SSE1-NEXT:    calll memcmp1591; X86-SSE1-NEXT:    addl $12, %esp1592; X86-SSE1-NEXT:    testl %eax, %eax1593; X86-SSE1-NEXT:    sete %al1594; X86-SSE1-NEXT:    retl1595;1596; X86-SSE2-LABEL: length48_eq:1597; X86-SSE2:       # %bb.0:1598; X86-SSE2-NEXT:    movl {{[0-9]+}}(%esp), %eax1599; X86-SSE2-NEXT:    movl {{[0-9]+}}(%esp), %ecx1600; X86-SSE2-NEXT:    movdqu (%ecx), %xmm01601; X86-SSE2-NEXT:    movdqu 16(%ecx), %xmm11602; X86-SSE2-NEXT:    movdqu (%eax), %xmm21603; X86-SSE2-NEXT:    pcmpeqb %xmm0, %xmm21604; X86-SSE2-NEXT:    movdqu 16(%eax), %xmm01605; X86-SSE2-NEXT:    pcmpeqb %xmm1, %xmm01606; X86-SSE2-NEXT:    pand %xmm2, %xmm01607; X86-SSE2-NEXT:    movdqu 32(%ecx), %xmm11608; X86-SSE2-NEXT:    movdqu 32(%eax), %xmm21609; X86-SSE2-NEXT:    pcmpeqb %xmm1, %xmm21610; X86-SSE2-NEXT:    pand %xmm0, %xmm21611; X86-SSE2-NEXT:    pmovmskb %xmm2, %eax1612; X86-SSE2-NEXT:    cmpl $65535, %eax # imm = 0xFFFF1613; X86-SSE2-NEXT:    sete %al1614; X86-SSE2-NEXT:    retl1615;1616; X86-SSE41-LABEL: length48_eq:1617; X86-SSE41:       # %bb.0:1618; X86-SSE41-NEXT:    movl {{[0-9]+}}(%esp), %eax1619; X86-SSE41-NEXT:    movl {{[0-9]+}}(%esp), %ecx1620; X86-SSE41-NEXT:    movdqu (%ecx), %xmm01621; X86-SSE41-NEXT:    movdqu 16(%ecx), %xmm11622; X86-SSE41-NEXT:    movdqu (%eax), %xmm21623; X86-SSE41-NEXT:    pxor %xmm0, %xmm21624; X86-SSE41-NEXT:    movdqu 16(%eax), %xmm01625; X86-SSE41-NEXT:    pxor %xmm1, %xmm01626; X86-SSE41-NEXT:    por %xmm2, %xmm01627; X86-SSE41-NEXT:    movdqu 32(%ecx), %xmm11628; X86-SSE41-NEXT:    movdqu 32(%eax), %xmm21629; X86-SSE41-NEXT:    pxor %xmm1, %xmm21630; X86-SSE41-NEXT:    por %xmm0, %xmm21631; X86-SSE41-NEXT:    ptest %xmm2, %xmm21632; X86-SSE41-NEXT:    sete %al1633; X86-SSE41-NEXT:    retl1634  %call = tail call i32 @memcmp(ptr %x, ptr %y, i32 48) nounwind1635  %cmp = icmp eq i32 %call, 01636  ret i1 %cmp1637}1638 1639define i1 @length48_lt(ptr %x, ptr %y) nounwind {1640; X86-LABEL: length48_lt:1641; X86:       # %bb.0:1642; X86-NEXT:    pushl $481643; X86-NEXT:    pushl {{[0-9]+}}(%esp)1644; X86-NEXT:    pushl {{[0-9]+}}(%esp)1645; X86-NEXT:    calll memcmp1646; X86-NEXT:    addl $12, %esp1647; X86-NEXT:    shrl $31, %eax1648; X86-NEXT:    # kill: def $al killed $al killed $eax1649; X86-NEXT:    retl1650  %call = tail call i32 @memcmp(ptr %x, ptr %y, i32 48) nounwind1651  %cmp = icmp slt i32 %call, 01652  ret i1 %cmp1653}1654 1655define i1 @length48_gt(ptr %x, ptr %y) nounwind {1656; X86-LABEL: length48_gt:1657; X86:       # %bb.0:1658; X86-NEXT:    pushl $481659; X86-NEXT:    pushl {{[0-9]+}}(%esp)1660; X86-NEXT:    pushl {{[0-9]+}}(%esp)1661; X86-NEXT:    calll memcmp1662; X86-NEXT:    addl $12, %esp1663; X86-NEXT:    testl %eax, %eax1664; X86-NEXT:    setg %al1665; X86-NEXT:    retl1666  %call = tail call i32 @memcmp(ptr %x, ptr %y, i32 48) nounwind1667  %cmp = icmp sgt i32 %call, 01668  ret i1 %cmp1669}1670 1671define i1 @length48_eq_prefer128(ptr %x, ptr %y) nounwind "prefer-vector-width"="128" {1672; X86-NOSSE-LABEL: length48_eq_prefer128:1673; X86-NOSSE:       # %bb.0:1674; X86-NOSSE-NEXT:    pushl $481675; X86-NOSSE-NEXT:    pushl {{[0-9]+}}(%esp)1676; X86-NOSSE-NEXT:    pushl {{[0-9]+}}(%esp)1677; X86-NOSSE-NEXT:    calll memcmp1678; X86-NOSSE-NEXT:    addl $12, %esp1679; X86-NOSSE-NEXT:    testl %eax, %eax1680; X86-NOSSE-NEXT:    sete %al1681; X86-NOSSE-NEXT:    retl1682;1683; X86-SSE1-LABEL: length48_eq_prefer128:1684; X86-SSE1:       # %bb.0:1685; X86-SSE1-NEXT:    pushl $481686; X86-SSE1-NEXT:    pushl {{[0-9]+}}(%esp)1687; X86-SSE1-NEXT:    pushl {{[0-9]+}}(%esp)1688; X86-SSE1-NEXT:    calll memcmp1689; X86-SSE1-NEXT:    addl $12, %esp1690; X86-SSE1-NEXT:    testl %eax, %eax1691; X86-SSE1-NEXT:    sete %al1692; X86-SSE1-NEXT:    retl1693;1694; X86-SSE2-LABEL: length48_eq_prefer128:1695; X86-SSE2:       # %bb.0:1696; X86-SSE2-NEXT:    movl {{[0-9]+}}(%esp), %eax1697; X86-SSE2-NEXT:    movl {{[0-9]+}}(%esp), %ecx1698; X86-SSE2-NEXT:    movdqu (%ecx), %xmm01699; X86-SSE2-NEXT:    movdqu 16(%ecx), %xmm11700; X86-SSE2-NEXT:    movdqu (%eax), %xmm21701; X86-SSE2-NEXT:    pcmpeqb %xmm0, %xmm21702; X86-SSE2-NEXT:    movdqu 16(%eax), %xmm01703; X86-SSE2-NEXT:    pcmpeqb %xmm1, %xmm01704; X86-SSE2-NEXT:    pand %xmm2, %xmm01705; X86-SSE2-NEXT:    movdqu 32(%ecx), %xmm11706; X86-SSE2-NEXT:    movdqu 32(%eax), %xmm21707; X86-SSE2-NEXT:    pcmpeqb %xmm1, %xmm21708; X86-SSE2-NEXT:    pand %xmm0, %xmm21709; X86-SSE2-NEXT:    pmovmskb %xmm2, %eax1710; X86-SSE2-NEXT:    cmpl $65535, %eax # imm = 0xFFFF1711; X86-SSE2-NEXT:    sete %al1712; X86-SSE2-NEXT:    retl1713;1714; X86-SSE41-LABEL: length48_eq_prefer128:1715; X86-SSE41:       # %bb.0:1716; X86-SSE41-NEXT:    movl {{[0-9]+}}(%esp), %eax1717; X86-SSE41-NEXT:    movl {{[0-9]+}}(%esp), %ecx1718; X86-SSE41-NEXT:    movdqu (%ecx), %xmm01719; X86-SSE41-NEXT:    movdqu 16(%ecx), %xmm11720; X86-SSE41-NEXT:    movdqu (%eax), %xmm21721; X86-SSE41-NEXT:    pxor %xmm0, %xmm21722; X86-SSE41-NEXT:    movdqu 16(%eax), %xmm01723; X86-SSE41-NEXT:    pxor %xmm1, %xmm01724; X86-SSE41-NEXT:    por %xmm2, %xmm01725; X86-SSE41-NEXT:    movdqu 32(%ecx), %xmm11726; X86-SSE41-NEXT:    movdqu 32(%eax), %xmm21727; X86-SSE41-NEXT:    pxor %xmm1, %xmm21728; X86-SSE41-NEXT:    por %xmm0, %xmm21729; X86-SSE41-NEXT:    ptest %xmm2, %xmm21730; X86-SSE41-NEXT:    sete %al1731; X86-SSE41-NEXT:    retl1732  %call = tail call i32 @memcmp(ptr %x, ptr %y, i32 48) nounwind1733  %cmp = icmp eq i32 %call, 01734  ret i1 %cmp1735}1736 1737define i1 @length48_eq_const(ptr %X) nounwind {1738; X86-NOSSE-LABEL: length48_eq_const:1739; X86-NOSSE:       # %bb.0:1740; X86-NOSSE-NEXT:    pushl $481741; X86-NOSSE-NEXT:    pushl $.L.str1742; X86-NOSSE-NEXT:    pushl {{[0-9]+}}(%esp)1743; X86-NOSSE-NEXT:    calll memcmp1744; X86-NOSSE-NEXT:    addl $12, %esp1745; X86-NOSSE-NEXT:    testl %eax, %eax1746; X86-NOSSE-NEXT:    setne %al1747; X86-NOSSE-NEXT:    retl1748;1749; X86-SSE1-LABEL: length48_eq_const:1750; X86-SSE1:       # %bb.0:1751; X86-SSE1-NEXT:    pushl $481752; X86-SSE1-NEXT:    pushl $.L.str1753; X86-SSE1-NEXT:    pushl {{[0-9]+}}(%esp)1754; X86-SSE1-NEXT:    calll memcmp1755; X86-SSE1-NEXT:    addl $12, %esp1756; X86-SSE1-NEXT:    testl %eax, %eax1757; X86-SSE1-NEXT:    setne %al1758; X86-SSE1-NEXT:    retl1759;1760; X86-SSE2-LABEL: length48_eq_const:1761; X86-SSE2:       # %bb.0:1762; X86-SSE2-NEXT:    movl {{[0-9]+}}(%esp), %eax1763; X86-SSE2-NEXT:    movdqu (%eax), %xmm01764; X86-SSE2-NEXT:    movdqu 16(%eax), %xmm11765; X86-SSE2-NEXT:    movdqu 32(%eax), %xmm21766; X86-SSE2-NEXT:    pcmpeqb {{\.?LCPI[0-9]+_[0-9]+}}, %xmm11767; X86-SSE2-NEXT:    pcmpeqb {{\.?LCPI[0-9]+_[0-9]+}}, %xmm01768; X86-SSE2-NEXT:    pand %xmm1, %xmm01769; X86-SSE2-NEXT:    pcmpeqb {{\.?LCPI[0-9]+_[0-9]+}}, %xmm21770; X86-SSE2-NEXT:    pand %xmm0, %xmm21771; X86-SSE2-NEXT:    pmovmskb %xmm2, %eax1772; X86-SSE2-NEXT:    cmpl $65535, %eax # imm = 0xFFFF1773; X86-SSE2-NEXT:    setne %al1774; X86-SSE2-NEXT:    retl1775;1776; X86-SSE41-LABEL: length48_eq_const:1777; X86-SSE41:       # %bb.0:1778; X86-SSE41-NEXT:    movl {{[0-9]+}}(%esp), %eax1779; X86-SSE41-NEXT:    movdqu (%eax), %xmm01780; X86-SSE41-NEXT:    movdqu 16(%eax), %xmm11781; X86-SSE41-NEXT:    movdqu 32(%eax), %xmm21782; X86-SSE41-NEXT:    pxor {{\.?LCPI[0-9]+_[0-9]+}}, %xmm11783; X86-SSE41-NEXT:    pxor {{\.?LCPI[0-9]+_[0-9]+}}, %xmm01784; X86-SSE41-NEXT:    por %xmm1, %xmm01785; X86-SSE41-NEXT:    pxor {{\.?LCPI[0-9]+_[0-9]+}}, %xmm21786; X86-SSE41-NEXT:    por %xmm0, %xmm21787; X86-SSE41-NEXT:    ptest %xmm2, %xmm21788; X86-SSE41-NEXT:    setne %al1789; X86-SSE41-NEXT:    retl1790  %m = tail call i32 @memcmp(ptr %X, ptr @.str, i32 48) nounwind1791  %c = icmp ne i32 %m, 01792  ret i1 %c1793}1794 1795define i32 @length63(ptr %X, ptr %Y) nounwind {1796; X86-LABEL: length63:1797; X86:       # %bb.0:1798; X86-NEXT:    pushl $631799; X86-NEXT:    pushl {{[0-9]+}}(%esp)1800; X86-NEXT:    pushl {{[0-9]+}}(%esp)1801; X86-NEXT:    calll memcmp1802; X86-NEXT:    addl $12, %esp1803; X86-NEXT:    retl1804  %m = tail call i32 @memcmp(ptr %X, ptr %Y, i32 63) nounwind1805  ret i32 %m1806}1807 1808define i1 @length63_eq(ptr %x, ptr %y) nounwind {1809; X86-NOSSE-LABEL: length63_eq:1810; X86-NOSSE:       # %bb.0:1811; X86-NOSSE-NEXT:    pushl $631812; X86-NOSSE-NEXT:    pushl {{[0-9]+}}(%esp)1813; X86-NOSSE-NEXT:    pushl {{[0-9]+}}(%esp)1814; X86-NOSSE-NEXT:    calll memcmp1815; X86-NOSSE-NEXT:    addl $12, %esp1816; X86-NOSSE-NEXT:    testl %eax, %eax1817; X86-NOSSE-NEXT:    setne %al1818; X86-NOSSE-NEXT:    retl1819;1820; X86-SSE1-LABEL: length63_eq:1821; X86-SSE1:       # %bb.0:1822; X86-SSE1-NEXT:    pushl $631823; X86-SSE1-NEXT:    pushl {{[0-9]+}}(%esp)1824; X86-SSE1-NEXT:    pushl {{[0-9]+}}(%esp)1825; X86-SSE1-NEXT:    calll memcmp1826; X86-SSE1-NEXT:    addl $12, %esp1827; X86-SSE1-NEXT:    testl %eax, %eax1828; X86-SSE1-NEXT:    setne %al1829; X86-SSE1-NEXT:    retl1830;1831; X86-SSE2-LABEL: length63_eq:1832; X86-SSE2:       # %bb.0:1833; X86-SSE2-NEXT:    movl {{[0-9]+}}(%esp), %eax1834; X86-SSE2-NEXT:    movl {{[0-9]+}}(%esp), %ecx1835; X86-SSE2-NEXT:    movdqu (%ecx), %xmm01836; X86-SSE2-NEXT:    movdqu 16(%ecx), %xmm11837; X86-SSE2-NEXT:    movdqu (%eax), %xmm21838; X86-SSE2-NEXT:    pcmpeqb %xmm0, %xmm21839; X86-SSE2-NEXT:    movdqu 16(%eax), %xmm01840; X86-SSE2-NEXT:    pcmpeqb %xmm1, %xmm01841; X86-SSE2-NEXT:    pand %xmm2, %xmm01842; X86-SSE2-NEXT:    movdqu 32(%ecx), %xmm11843; X86-SSE2-NEXT:    movdqu 32(%eax), %xmm21844; X86-SSE2-NEXT:    pcmpeqb %xmm1, %xmm21845; X86-SSE2-NEXT:    movdqu 47(%ecx), %xmm11846; X86-SSE2-NEXT:    movdqu 47(%eax), %xmm31847; X86-SSE2-NEXT:    pcmpeqb %xmm1, %xmm31848; X86-SSE2-NEXT:    pand %xmm2, %xmm31849; X86-SSE2-NEXT:    pand %xmm0, %xmm31850; X86-SSE2-NEXT:    pmovmskb %xmm3, %eax1851; X86-SSE2-NEXT:    cmpl $65535, %eax # imm = 0xFFFF1852; X86-SSE2-NEXT:    setne %al1853; X86-SSE2-NEXT:    retl1854;1855; X86-SSE41-LABEL: length63_eq:1856; X86-SSE41:       # %bb.0:1857; X86-SSE41-NEXT:    movl {{[0-9]+}}(%esp), %eax1858; X86-SSE41-NEXT:    movl {{[0-9]+}}(%esp), %ecx1859; X86-SSE41-NEXT:    movdqu (%ecx), %xmm01860; X86-SSE41-NEXT:    movdqu 16(%ecx), %xmm11861; X86-SSE41-NEXT:    movdqu (%eax), %xmm21862; X86-SSE41-NEXT:    pxor %xmm0, %xmm21863; X86-SSE41-NEXT:    movdqu 16(%eax), %xmm01864; X86-SSE41-NEXT:    pxor %xmm1, %xmm01865; X86-SSE41-NEXT:    por %xmm2, %xmm01866; X86-SSE41-NEXT:    movdqu 32(%ecx), %xmm11867; X86-SSE41-NEXT:    movdqu 32(%eax), %xmm21868; X86-SSE41-NEXT:    pxor %xmm1, %xmm21869; X86-SSE41-NEXT:    movdqu 47(%ecx), %xmm11870; X86-SSE41-NEXT:    movdqu 47(%eax), %xmm31871; X86-SSE41-NEXT:    pxor %xmm1, %xmm31872; X86-SSE41-NEXT:    por %xmm2, %xmm31873; X86-SSE41-NEXT:    por %xmm0, %xmm31874; X86-SSE41-NEXT:    ptest %xmm3, %xmm31875; X86-SSE41-NEXT:    setne %al1876; X86-SSE41-NEXT:    retl1877  %call = tail call i32 @memcmp(ptr %x, ptr %y, i32 63) nounwind1878  %cmp = icmp ne i32 %call, 01879  ret i1 %cmp1880}1881 1882define i1 @length63_lt(ptr %x, ptr %y) nounwind {1883; X86-LABEL: length63_lt:1884; X86:       # %bb.0:1885; X86-NEXT:    pushl $631886; X86-NEXT:    pushl {{[0-9]+}}(%esp)1887; X86-NEXT:    pushl {{[0-9]+}}(%esp)1888; X86-NEXT:    calll memcmp1889; X86-NEXT:    addl $12, %esp1890; X86-NEXT:    shrl $31, %eax1891; X86-NEXT:    # kill: def $al killed $al killed $eax1892; X86-NEXT:    retl1893  %call = tail call i32 @memcmp(ptr %x, ptr %y, i32 63) nounwind1894  %cmp = icmp slt i32 %call, 01895  ret i1 %cmp1896}1897 1898define i1 @length63_gt(ptr %x, ptr %y) nounwind {1899; X86-LABEL: length63_gt:1900; X86:       # %bb.0:1901; X86-NEXT:    pushl $631902; X86-NEXT:    pushl {{[0-9]+}}(%esp)1903; X86-NEXT:    pushl {{[0-9]+}}(%esp)1904; X86-NEXT:    calll memcmp1905; X86-NEXT:    addl $12, %esp1906; X86-NEXT:    testl %eax, %eax1907; X86-NEXT:    setg %al1908; X86-NEXT:    retl1909  %call = tail call i32 @memcmp(ptr %x, ptr %y, i32 63) nounwind1910  %cmp = icmp sgt i32 %call, 01911  ret i1 %cmp1912}1913 1914define i1 @length63_eq_const(ptr %X) nounwind {1915; X86-NOSSE-LABEL: length63_eq_const:1916; X86-NOSSE:       # %bb.0:1917; X86-NOSSE-NEXT:    pushl $631918; X86-NOSSE-NEXT:    pushl $.L.str1919; X86-NOSSE-NEXT:    pushl {{[0-9]+}}(%esp)1920; X86-NOSSE-NEXT:    calll memcmp1921; X86-NOSSE-NEXT:    addl $12, %esp1922; X86-NOSSE-NEXT:    testl %eax, %eax1923; X86-NOSSE-NEXT:    sete %al1924; X86-NOSSE-NEXT:    retl1925;1926; X86-SSE1-LABEL: length63_eq_const:1927; X86-SSE1:       # %bb.0:1928; X86-SSE1-NEXT:    pushl $631929; X86-SSE1-NEXT:    pushl $.L.str1930; X86-SSE1-NEXT:    pushl {{[0-9]+}}(%esp)1931; X86-SSE1-NEXT:    calll memcmp1932; X86-SSE1-NEXT:    addl $12, %esp1933; X86-SSE1-NEXT:    testl %eax, %eax1934; X86-SSE1-NEXT:    sete %al1935; X86-SSE1-NEXT:    retl1936;1937; X86-SSE2-LABEL: length63_eq_const:1938; X86-SSE2:       # %bb.0:1939; X86-SSE2-NEXT:    movl {{[0-9]+}}(%esp), %eax1940; X86-SSE2-NEXT:    movdqu (%eax), %xmm01941; X86-SSE2-NEXT:    movdqu 16(%eax), %xmm11942; X86-SSE2-NEXT:    movdqu 32(%eax), %xmm21943; X86-SSE2-NEXT:    movdqu 47(%eax), %xmm31944; X86-SSE2-NEXT:    pcmpeqb {{\.?LCPI[0-9]+_[0-9]+}}, %xmm31945; X86-SSE2-NEXT:    pcmpeqb {{\.?LCPI[0-9]+_[0-9]+}}, %xmm21946; X86-SSE2-NEXT:    pand %xmm3, %xmm21947; X86-SSE2-NEXT:    pcmpeqb {{\.?LCPI[0-9]+_[0-9]+}}, %xmm11948; X86-SSE2-NEXT:    pcmpeqb {{\.?LCPI[0-9]+_[0-9]+}}, %xmm01949; X86-SSE2-NEXT:    pand %xmm1, %xmm01950; X86-SSE2-NEXT:    pand %xmm2, %xmm01951; X86-SSE2-NEXT:    pmovmskb %xmm0, %eax1952; X86-SSE2-NEXT:    cmpl $65535, %eax # imm = 0xFFFF1953; X86-SSE2-NEXT:    sete %al1954; X86-SSE2-NEXT:    retl1955;1956; X86-SSE41-LABEL: length63_eq_const:1957; X86-SSE41:       # %bb.0:1958; X86-SSE41-NEXT:    movl {{[0-9]+}}(%esp), %eax1959; X86-SSE41-NEXT:    movdqu (%eax), %xmm01960; X86-SSE41-NEXT:    movdqu 16(%eax), %xmm11961; X86-SSE41-NEXT:    movdqu 32(%eax), %xmm21962; X86-SSE41-NEXT:    movdqu 47(%eax), %xmm31963; X86-SSE41-NEXT:    pxor {{\.?LCPI[0-9]+_[0-9]+}}, %xmm31964; X86-SSE41-NEXT:    pxor {{\.?LCPI[0-9]+_[0-9]+}}, %xmm21965; X86-SSE41-NEXT:    por %xmm3, %xmm21966; X86-SSE41-NEXT:    pxor {{\.?LCPI[0-9]+_[0-9]+}}, %xmm11967; X86-SSE41-NEXT:    pxor {{\.?LCPI[0-9]+_[0-9]+}}, %xmm01968; X86-SSE41-NEXT:    por %xmm1, %xmm01969; X86-SSE41-NEXT:    por %xmm2, %xmm01970; X86-SSE41-NEXT:    ptest %xmm0, %xmm01971; X86-SSE41-NEXT:    sete %al1972; X86-SSE41-NEXT:    retl1973  %m = tail call i32 @memcmp(ptr %X, ptr @.str, i32 63) nounwind1974  %c = icmp eq i32 %m, 01975  ret i1 %c1976}1977 1978define i32 @length64(ptr %X, ptr %Y) nounwind {1979; X86-LABEL: length64:1980; X86:       # %bb.0:1981; X86-NEXT:    pushl $641982; X86-NEXT:    pushl {{[0-9]+}}(%esp)1983; X86-NEXT:    pushl {{[0-9]+}}(%esp)1984; X86-NEXT:    calll memcmp1985; X86-NEXT:    addl $12, %esp1986; X86-NEXT:    retl1987  %m = tail call i32 @memcmp(ptr %X, ptr %Y, i32 64) nounwind1988  ret i32 %m1989}1990 1991define i1 @length64_eq(ptr %x, ptr %y) nounwind {1992; X86-NOSSE-LABEL: length64_eq:1993; X86-NOSSE:       # %bb.0:1994; X86-NOSSE-NEXT:    pushl $641995; X86-NOSSE-NEXT:    pushl {{[0-9]+}}(%esp)1996; X86-NOSSE-NEXT:    pushl {{[0-9]+}}(%esp)1997; X86-NOSSE-NEXT:    calll memcmp1998; X86-NOSSE-NEXT:    addl $12, %esp1999; X86-NOSSE-NEXT:    testl %eax, %eax2000; X86-NOSSE-NEXT:    setne %al2001; X86-NOSSE-NEXT:    retl2002;2003; X86-SSE1-LABEL: length64_eq:2004; X86-SSE1:       # %bb.0:2005; X86-SSE1-NEXT:    pushl $642006; X86-SSE1-NEXT:    pushl {{[0-9]+}}(%esp)2007; X86-SSE1-NEXT:    pushl {{[0-9]+}}(%esp)2008; X86-SSE1-NEXT:    calll memcmp2009; X86-SSE1-NEXT:    addl $12, %esp2010; X86-SSE1-NEXT:    testl %eax, %eax2011; X86-SSE1-NEXT:    setne %al2012; X86-SSE1-NEXT:    retl2013;2014; X86-SSE2-LABEL: length64_eq:2015; X86-SSE2:       # %bb.0:2016; X86-SSE2-NEXT:    movl {{[0-9]+}}(%esp), %eax2017; X86-SSE2-NEXT:    movl {{[0-9]+}}(%esp), %ecx2018; X86-SSE2-NEXT:    movdqu (%ecx), %xmm02019; X86-SSE2-NEXT:    movdqu 16(%ecx), %xmm12020; X86-SSE2-NEXT:    movdqu (%eax), %xmm22021; X86-SSE2-NEXT:    pcmpeqb %xmm0, %xmm22022; X86-SSE2-NEXT:    movdqu 16(%eax), %xmm02023; X86-SSE2-NEXT:    pcmpeqb %xmm1, %xmm02024; X86-SSE2-NEXT:    pand %xmm2, %xmm02025; X86-SSE2-NEXT:    movdqu 32(%ecx), %xmm12026; X86-SSE2-NEXT:    movdqu 32(%eax), %xmm22027; X86-SSE2-NEXT:    pcmpeqb %xmm1, %xmm22028; X86-SSE2-NEXT:    movdqu 48(%ecx), %xmm12029; X86-SSE2-NEXT:    movdqu 48(%eax), %xmm32030; X86-SSE2-NEXT:    pcmpeqb %xmm1, %xmm32031; X86-SSE2-NEXT:    pand %xmm2, %xmm32032; X86-SSE2-NEXT:    pand %xmm0, %xmm32033; X86-SSE2-NEXT:    pmovmskb %xmm3, %eax2034; X86-SSE2-NEXT:    cmpl $65535, %eax # imm = 0xFFFF2035; X86-SSE2-NEXT:    setne %al2036; X86-SSE2-NEXT:    retl2037;2038; X86-SSE41-LABEL: length64_eq:2039; X86-SSE41:       # %bb.0:2040; X86-SSE41-NEXT:    movl {{[0-9]+}}(%esp), %eax2041; X86-SSE41-NEXT:    movl {{[0-9]+}}(%esp), %ecx2042; X86-SSE41-NEXT:    movdqu (%ecx), %xmm02043; X86-SSE41-NEXT:    movdqu 16(%ecx), %xmm12044; X86-SSE41-NEXT:    movdqu (%eax), %xmm22045; X86-SSE41-NEXT:    pxor %xmm0, %xmm22046; X86-SSE41-NEXT:    movdqu 16(%eax), %xmm02047; X86-SSE41-NEXT:    pxor %xmm1, %xmm02048; X86-SSE41-NEXT:    por %xmm2, %xmm02049; X86-SSE41-NEXT:    movdqu 32(%ecx), %xmm12050; X86-SSE41-NEXT:    movdqu 32(%eax), %xmm22051; X86-SSE41-NEXT:    pxor %xmm1, %xmm22052; X86-SSE41-NEXT:    movdqu 48(%ecx), %xmm12053; X86-SSE41-NEXT:    movdqu 48(%eax), %xmm32054; X86-SSE41-NEXT:    pxor %xmm1, %xmm32055; X86-SSE41-NEXT:    por %xmm2, %xmm32056; X86-SSE41-NEXT:    por %xmm0, %xmm32057; X86-SSE41-NEXT:    ptest %xmm3, %xmm32058; X86-SSE41-NEXT:    setne %al2059; X86-SSE41-NEXT:    retl2060  %call = tail call i32 @memcmp(ptr %x, ptr %y, i32 64) nounwind2061  %cmp = icmp ne i32 %call, 02062  ret i1 %cmp2063}2064 2065define i1 @length64_lt(ptr %x, ptr %y) nounwind {2066; X86-LABEL: length64_lt:2067; X86:       # %bb.0:2068; X86-NEXT:    pushl $642069; X86-NEXT:    pushl {{[0-9]+}}(%esp)2070; X86-NEXT:    pushl {{[0-9]+}}(%esp)2071; X86-NEXT:    calll memcmp2072; X86-NEXT:    addl $12, %esp2073; X86-NEXT:    shrl $31, %eax2074; X86-NEXT:    # kill: def $al killed $al killed $eax2075; X86-NEXT:    retl2076  %call = tail call i32 @memcmp(ptr %x, ptr %y, i32 64) nounwind2077  %cmp = icmp slt i32 %call, 02078  ret i1 %cmp2079}2080 2081define i1 @length64_gt(ptr %x, ptr %y) nounwind {2082; X86-LABEL: length64_gt:2083; X86:       # %bb.0:2084; X86-NEXT:    pushl $642085; X86-NEXT:    pushl {{[0-9]+}}(%esp)2086; X86-NEXT:    pushl {{[0-9]+}}(%esp)2087; X86-NEXT:    calll memcmp2088; X86-NEXT:    addl $12, %esp2089; X86-NEXT:    testl %eax, %eax2090; X86-NEXT:    setg %al2091; X86-NEXT:    retl2092  %call = tail call i32 @memcmp(ptr %x, ptr %y, i32 64) nounwind2093  %cmp = icmp sgt i32 %call, 02094  ret i1 %cmp2095}2096 2097define i1 @length64_eq_const(ptr %X) nounwind {2098; X86-NOSSE-LABEL: length64_eq_const:2099; X86-NOSSE:       # %bb.0:2100; X86-NOSSE-NEXT:    pushl $642101; X86-NOSSE-NEXT:    pushl $.L.str2102; X86-NOSSE-NEXT:    pushl {{[0-9]+}}(%esp)2103; X86-NOSSE-NEXT:    calll memcmp2104; X86-NOSSE-NEXT:    addl $12, %esp2105; X86-NOSSE-NEXT:    testl %eax, %eax2106; X86-NOSSE-NEXT:    sete %al2107; X86-NOSSE-NEXT:    retl2108;2109; X86-SSE1-LABEL: length64_eq_const:2110; X86-SSE1:       # %bb.0:2111; X86-SSE1-NEXT:    pushl $642112; X86-SSE1-NEXT:    pushl $.L.str2113; X86-SSE1-NEXT:    pushl {{[0-9]+}}(%esp)2114; X86-SSE1-NEXT:    calll memcmp2115; X86-SSE1-NEXT:    addl $12, %esp2116; X86-SSE1-NEXT:    testl %eax, %eax2117; X86-SSE1-NEXT:    sete %al2118; X86-SSE1-NEXT:    retl2119;2120; X86-SSE2-LABEL: length64_eq_const:2121; X86-SSE2:       # %bb.0:2122; X86-SSE2-NEXT:    movl {{[0-9]+}}(%esp), %eax2123; X86-SSE2-NEXT:    movdqu (%eax), %xmm02124; X86-SSE2-NEXT:    movdqu 16(%eax), %xmm12125; X86-SSE2-NEXT:    movdqu 32(%eax), %xmm22126; X86-SSE2-NEXT:    movdqu 48(%eax), %xmm32127; X86-SSE2-NEXT:    pcmpeqb {{\.?LCPI[0-9]+_[0-9]+}}, %xmm32128; X86-SSE2-NEXT:    pcmpeqb {{\.?LCPI[0-9]+_[0-9]+}}, %xmm22129; X86-SSE2-NEXT:    pand %xmm3, %xmm22130; X86-SSE2-NEXT:    pcmpeqb {{\.?LCPI[0-9]+_[0-9]+}}, %xmm12131; X86-SSE2-NEXT:    pcmpeqb {{\.?LCPI[0-9]+_[0-9]+}}, %xmm02132; X86-SSE2-NEXT:    pand %xmm1, %xmm02133; X86-SSE2-NEXT:    pand %xmm2, %xmm02134; X86-SSE2-NEXT:    pmovmskb %xmm0, %eax2135; X86-SSE2-NEXT:    cmpl $65535, %eax # imm = 0xFFFF2136; X86-SSE2-NEXT:    sete %al2137; X86-SSE2-NEXT:    retl2138;2139; X86-SSE41-LABEL: length64_eq_const:2140; X86-SSE41:       # %bb.0:2141; X86-SSE41-NEXT:    movl {{[0-9]+}}(%esp), %eax2142; X86-SSE41-NEXT:    movdqu (%eax), %xmm02143; X86-SSE41-NEXT:    movdqu 16(%eax), %xmm12144; X86-SSE41-NEXT:    movdqu 32(%eax), %xmm22145; X86-SSE41-NEXT:    movdqu 48(%eax), %xmm32146; X86-SSE41-NEXT:    pxor {{\.?LCPI[0-9]+_[0-9]+}}, %xmm32147; X86-SSE41-NEXT:    pxor {{\.?LCPI[0-9]+_[0-9]+}}, %xmm22148; X86-SSE41-NEXT:    por %xmm3, %xmm22149; X86-SSE41-NEXT:    pxor {{\.?LCPI[0-9]+_[0-9]+}}, %xmm12150; X86-SSE41-NEXT:    pxor {{\.?LCPI[0-9]+_[0-9]+}}, %xmm02151; X86-SSE41-NEXT:    por %xmm1, %xmm02152; X86-SSE41-NEXT:    por %xmm2, %xmm02153; X86-SSE41-NEXT:    ptest %xmm0, %xmm02154; X86-SSE41-NEXT:    sete %al2155; X86-SSE41-NEXT:    retl2156  %m = tail call i32 @memcmp(ptr %X, ptr @.str, i32 64) nounwind2157  %c = icmp eq i32 %m, 02158  ret i1 %c2159}2160 2161define i32 @length96(ptr %X, ptr %Y) nounwind {2162; X86-LABEL: length96:2163; X86:       # %bb.0:2164; X86-NEXT:    pushl $962165; X86-NEXT:    pushl {{[0-9]+}}(%esp)2166; X86-NEXT:    pushl {{[0-9]+}}(%esp)2167; X86-NEXT:    calll memcmp2168; X86-NEXT:    addl $12, %esp2169; X86-NEXT:    retl2170  %m = tail call i32 @memcmp(ptr %X, ptr %Y, i32 96) nounwind2171  ret i32 %m2172}2173 2174define i1 @length96_eq(ptr %x, ptr %y) nounwind {2175; X86-LABEL: length96_eq:2176; X86:       # %bb.0:2177; X86-NEXT:    pushl $962178; X86-NEXT:    pushl {{[0-9]+}}(%esp)2179; X86-NEXT:    pushl {{[0-9]+}}(%esp)2180; X86-NEXT:    calll memcmp2181; X86-NEXT:    addl $12, %esp2182; X86-NEXT:    testl %eax, %eax2183; X86-NEXT:    setne %al2184; X86-NEXT:    retl2185  %call = tail call i32 @memcmp(ptr %x, ptr %y, i32 96) nounwind2186  %cmp = icmp ne i32 %call, 02187  ret i1 %cmp2188}2189 2190define i1 @length96_lt(ptr %x, ptr %y) nounwind {2191; X86-LABEL: length96_lt:2192; X86:       # %bb.0:2193; X86-NEXT:    pushl $962194; X86-NEXT:    pushl {{[0-9]+}}(%esp)2195; X86-NEXT:    pushl {{[0-9]+}}(%esp)2196; X86-NEXT:    calll memcmp2197; X86-NEXT:    addl $12, %esp2198; X86-NEXT:    shrl $31, %eax2199; X86-NEXT:    # kill: def $al killed $al killed $eax2200; X86-NEXT:    retl2201  %call = tail call i32 @memcmp(ptr %x, ptr %y, i32 96) nounwind2202  %cmp = icmp slt i32 %call, 02203  ret i1 %cmp2204}2205 2206define i1 @length96_gt(ptr %x, ptr %y) nounwind {2207; X86-LABEL: length96_gt:2208; X86:       # %bb.0:2209; X86-NEXT:    pushl $962210; X86-NEXT:    pushl {{[0-9]+}}(%esp)2211; X86-NEXT:    pushl {{[0-9]+}}(%esp)2212; X86-NEXT:    calll memcmp2213; X86-NEXT:    addl $12, %esp2214; X86-NEXT:    testl %eax, %eax2215; X86-NEXT:    setg %al2216; X86-NEXT:    retl2217  %call = tail call i32 @memcmp(ptr %x, ptr %y, i32 96) nounwind2218  %cmp = icmp sgt i32 %call, 02219  ret i1 %cmp2220}2221 2222define i1 @length96_eq_const(ptr %X) nounwind {2223; X86-LABEL: length96_eq_const:2224; X86:       # %bb.0:2225; X86-NEXT:    pushl $962226; X86-NEXT:    pushl $.L.str2227; X86-NEXT:    pushl {{[0-9]+}}(%esp)2228; X86-NEXT:    calll memcmp2229; X86-NEXT:    addl $12, %esp2230; X86-NEXT:    testl %eax, %eax2231; X86-NEXT:    sete %al2232; X86-NEXT:    retl2233  %m = tail call i32 @memcmp(ptr %X, ptr @.str, i32 96) nounwind2234  %c = icmp eq i32 %m, 02235  ret i1 %c2236}2237 2238define i32 @length127(ptr %X, ptr %Y) nounwind {2239; X86-LABEL: length127:2240; X86:       # %bb.0:2241; X86-NEXT:    pushl $1272242; X86-NEXT:    pushl {{[0-9]+}}(%esp)2243; X86-NEXT:    pushl {{[0-9]+}}(%esp)2244; X86-NEXT:    calll memcmp2245; X86-NEXT:    addl $12, %esp2246; X86-NEXT:    retl2247  %m = tail call i32 @memcmp(ptr %X, ptr %Y, i32 127) nounwind2248  ret i32 %m2249}2250 2251define i1 @length127_eq(ptr %x, ptr %y) nounwind {2252; X86-LABEL: length127_eq:2253; X86:       # %bb.0:2254; X86-NEXT:    pushl $1272255; X86-NEXT:    pushl {{[0-9]+}}(%esp)2256; X86-NEXT:    pushl {{[0-9]+}}(%esp)2257; X86-NEXT:    calll memcmp2258; X86-NEXT:    addl $12, %esp2259; X86-NEXT:    testl %eax, %eax2260; X86-NEXT:    setne %al2261; X86-NEXT:    retl2262  %call = tail call i32 @memcmp(ptr %x, ptr %y, i32 127) nounwind2263  %cmp = icmp ne i32 %call, 02264  ret i1 %cmp2265}2266 2267define i1 @length127_lt(ptr %x, ptr %y) nounwind {2268; X86-LABEL: length127_lt:2269; X86:       # %bb.0:2270; X86-NEXT:    pushl $1272271; X86-NEXT:    pushl {{[0-9]+}}(%esp)2272; X86-NEXT:    pushl {{[0-9]+}}(%esp)2273; X86-NEXT:    calll memcmp2274; X86-NEXT:    addl $12, %esp2275; X86-NEXT:    shrl $31, %eax2276; X86-NEXT:    # kill: def $al killed $al killed $eax2277; X86-NEXT:    retl2278  %call = tail call i32 @memcmp(ptr %x, ptr %y, i32 127) nounwind2279  %cmp = icmp slt i32 %call, 02280  ret i1 %cmp2281}2282 2283define i1 @length127_gt(ptr %x, ptr %y) nounwind {2284; X86-LABEL: length127_gt:2285; X86:       # %bb.0:2286; X86-NEXT:    pushl $1272287; X86-NEXT:    pushl {{[0-9]+}}(%esp)2288; X86-NEXT:    pushl {{[0-9]+}}(%esp)2289; X86-NEXT:    calll memcmp2290; X86-NEXT:    addl $12, %esp2291; X86-NEXT:    testl %eax, %eax2292; X86-NEXT:    setg %al2293; X86-NEXT:    retl2294  %call = tail call i32 @memcmp(ptr %x, ptr %y, i32 127) nounwind2295  %cmp = icmp sgt i32 %call, 02296  ret i1 %cmp2297}2298 2299define i1 @length127_eq_const(ptr %X) nounwind {2300; X86-LABEL: length127_eq_const:2301; X86:       # %bb.0:2302; X86-NEXT:    pushl $1272303; X86-NEXT:    pushl $.L.str2304; X86-NEXT:    pushl {{[0-9]+}}(%esp)2305; X86-NEXT:    calll memcmp2306; X86-NEXT:    addl $12, %esp2307; X86-NEXT:    testl %eax, %eax2308; X86-NEXT:    sete %al2309; X86-NEXT:    retl2310  %m = tail call i32 @memcmp(ptr %X, ptr @.str, i32 127) nounwind2311  %c = icmp eq i32 %m, 02312  ret i1 %c2313}2314 2315define i32 @length128(ptr %X, ptr %Y) nounwind {2316; X86-LABEL: length128:2317; X86:       # %bb.0:2318; X86-NEXT:    pushl $1282319; X86-NEXT:    pushl {{[0-9]+}}(%esp)2320; X86-NEXT:    pushl {{[0-9]+}}(%esp)2321; X86-NEXT:    calll memcmp2322; X86-NEXT:    addl $12, %esp2323; X86-NEXT:    retl2324  %m = tail call i32 @memcmp(ptr %X, ptr %Y, i32 128) nounwind2325  ret i32 %m2326}2327 2328define i1 @length128_eq(ptr %x, ptr %y) nounwind {2329; X86-LABEL: length128_eq:2330; X86:       # %bb.0:2331; X86-NEXT:    pushl $1282332; X86-NEXT:    pushl {{[0-9]+}}(%esp)2333; X86-NEXT:    pushl {{[0-9]+}}(%esp)2334; X86-NEXT:    calll memcmp2335; X86-NEXT:    addl $12, %esp2336; X86-NEXT:    testl %eax, %eax2337; X86-NEXT:    setne %al2338; X86-NEXT:    retl2339  %call = tail call i32 @memcmp(ptr %x, ptr %y, i32 128) nounwind2340  %cmp = icmp ne i32 %call, 02341  ret i1 %cmp2342}2343 2344define i1 @length128_lt(ptr %x, ptr %y) nounwind {2345; X86-LABEL: length128_lt:2346; X86:       # %bb.0:2347; X86-NEXT:    pushl $1282348; X86-NEXT:    pushl {{[0-9]+}}(%esp)2349; X86-NEXT:    pushl {{[0-9]+}}(%esp)2350; X86-NEXT:    calll memcmp2351; X86-NEXT:    addl $12, %esp2352; X86-NEXT:    shrl $31, %eax2353; X86-NEXT:    # kill: def $al killed $al killed $eax2354; X86-NEXT:    retl2355  %call = tail call i32 @memcmp(ptr %x, ptr %y, i32 128) nounwind2356  %cmp = icmp slt i32 %call, 02357  ret i1 %cmp2358}2359 2360define i1 @length128_gt(ptr %x, ptr %y) nounwind {2361; X86-LABEL: length128_gt:2362; X86:       # %bb.0:2363; X86-NEXT:    pushl $1282364; X86-NEXT:    pushl {{[0-9]+}}(%esp)2365; X86-NEXT:    pushl {{[0-9]+}}(%esp)2366; X86-NEXT:    calll memcmp2367; X86-NEXT:    addl $12, %esp2368; X86-NEXT:    testl %eax, %eax2369; X86-NEXT:    setg %al2370; X86-NEXT:    retl2371  %call = tail call i32 @memcmp(ptr %x, ptr %y, i32 128) nounwind2372  %cmp = icmp sgt i32 %call, 02373  ret i1 %cmp2374}2375 2376define i1 @length128_eq_const(ptr %X) nounwind {2377; X86-LABEL: length128_eq_const:2378; X86:       # %bb.0:2379; X86-NEXT:    pushl $1282380; X86-NEXT:    pushl $.L.str2381; X86-NEXT:    pushl {{[0-9]+}}(%esp)2382; X86-NEXT:    calll memcmp2383; X86-NEXT:    addl $12, %esp2384; X86-NEXT:    testl %eax, %eax2385; X86-NEXT:    sete %al2386; X86-NEXT:    retl2387  %m = tail call i32 @memcmp(ptr %X, ptr @.str, i32 128) nounwind2388  %c = icmp eq i32 %m, 02389  ret i1 %c2390}2391 2392define i32 @length192(ptr %X, ptr %Y) nounwind {2393; X86-LABEL: length192:2394; X86:       # %bb.0:2395; X86-NEXT:    pushl $1922396; X86-NEXT:    pushl {{[0-9]+}}(%esp)2397; X86-NEXT:    pushl {{[0-9]+}}(%esp)2398; X86-NEXT:    calll memcmp2399; X86-NEXT:    addl $12, %esp2400; X86-NEXT:    retl2401  %m = tail call i32 @memcmp(ptr %X, ptr %Y, i32 192) nounwind2402  ret i32 %m2403}2404 2405define i1 @length192_eq(ptr %x, ptr %y) nounwind {2406; X86-LABEL: length192_eq:2407; X86:       # %bb.0:2408; X86-NEXT:    pushl $1922409; X86-NEXT:    pushl {{[0-9]+}}(%esp)2410; X86-NEXT:    pushl {{[0-9]+}}(%esp)2411; X86-NEXT:    calll memcmp2412; X86-NEXT:    addl $12, %esp2413; X86-NEXT:    testl %eax, %eax2414; X86-NEXT:    setne %al2415; X86-NEXT:    retl2416  %call = tail call i32 @memcmp(ptr %x, ptr %y, i32 192) nounwind2417  %cmp = icmp ne i32 %call, 02418  ret i1 %cmp2419}2420 2421define i1 @length192_lt(ptr %x, ptr %y) nounwind {2422; X86-LABEL: length192_lt:2423; X86:       # %bb.0:2424; X86-NEXT:    pushl $1922425; X86-NEXT:    pushl {{[0-9]+}}(%esp)2426; X86-NEXT:    pushl {{[0-9]+}}(%esp)2427; X86-NEXT:    calll memcmp2428; X86-NEXT:    addl $12, %esp2429; X86-NEXT:    shrl $31, %eax2430; X86-NEXT:    # kill: def $al killed $al killed $eax2431; X86-NEXT:    retl2432  %call = tail call i32 @memcmp(ptr %x, ptr %y, i32 192) nounwind2433  %cmp = icmp slt i32 %call, 02434  ret i1 %cmp2435}2436 2437define i1 @length192_gt(ptr %x, ptr %y) nounwind {2438; X86-LABEL: length192_gt:2439; X86:       # %bb.0:2440; X86-NEXT:    pushl $1922441; X86-NEXT:    pushl {{[0-9]+}}(%esp)2442; X86-NEXT:    pushl {{[0-9]+}}(%esp)2443; X86-NEXT:    calll memcmp2444; X86-NEXT:    addl $12, %esp2445; X86-NEXT:    testl %eax, %eax2446; X86-NEXT:    setg %al2447; X86-NEXT:    retl2448  %call = tail call i32 @memcmp(ptr %x, ptr %y, i32 192) nounwind2449  %cmp = icmp sgt i32 %call, 02450  ret i1 %cmp2451}2452 2453define i1 @length192_eq_const(ptr %X) nounwind {2454; X86-LABEL: length192_eq_const:2455; X86:       # %bb.0:2456; X86-NEXT:    pushl $1922457; X86-NEXT:    pushl $.L.str2458; X86-NEXT:    pushl {{[0-9]+}}(%esp)2459; X86-NEXT:    calll memcmp2460; X86-NEXT:    addl $12, %esp2461; X86-NEXT:    testl %eax, %eax2462; X86-NEXT:    sete %al2463; X86-NEXT:    retl2464  %m = tail call i32 @memcmp(ptr %X, ptr @.str, i32 192) nounwind2465  %c = icmp eq i32 %m, 02466  ret i1 %c2467}2468 2469define i32 @length255(ptr %X, ptr %Y) nounwind {2470; X86-LABEL: length255:2471; X86:       # %bb.0:2472; X86-NEXT:    pushl $2552473; X86-NEXT:    pushl {{[0-9]+}}(%esp)2474; X86-NEXT:    pushl {{[0-9]+}}(%esp)2475; X86-NEXT:    calll memcmp2476; X86-NEXT:    addl $12, %esp2477; X86-NEXT:    retl2478  %m = tail call i32 @memcmp(ptr %X, ptr %Y, i32 255) nounwind2479  ret i32 %m2480}2481 2482define i1 @length255_eq(ptr %x, ptr %y) nounwind {2483; X86-LABEL: length255_eq:2484; X86:       # %bb.0:2485; X86-NEXT:    pushl $2552486; X86-NEXT:    pushl {{[0-9]+}}(%esp)2487; X86-NEXT:    pushl {{[0-9]+}}(%esp)2488; X86-NEXT:    calll memcmp2489; X86-NEXT:    addl $12, %esp2490; X86-NEXT:    testl %eax, %eax2491; X86-NEXT:    setne %al2492; X86-NEXT:    retl2493  %call = tail call i32 @memcmp(ptr %x, ptr %y, i32 255) nounwind2494  %cmp = icmp ne i32 %call, 02495  ret i1 %cmp2496}2497 2498define i1 @length255_lt(ptr %x, ptr %y) nounwind {2499; X86-LABEL: length255_lt:2500; X86:       # %bb.0:2501; X86-NEXT:    pushl $2552502; X86-NEXT:    pushl {{[0-9]+}}(%esp)2503; X86-NEXT:    pushl {{[0-9]+}}(%esp)2504; X86-NEXT:    calll memcmp2505; X86-NEXT:    addl $12, %esp2506; X86-NEXT:    shrl $31, %eax2507; X86-NEXT:    # kill: def $al killed $al killed $eax2508; X86-NEXT:    retl2509  %call = tail call i32 @memcmp(ptr %x, ptr %y, i32 255) nounwind2510  %cmp = icmp slt i32 %call, 02511  ret i1 %cmp2512}2513 2514define i1 @length255_gt(ptr %x, ptr %y) nounwind {2515; X86-LABEL: length255_gt:2516; X86:       # %bb.0:2517; X86-NEXT:    pushl $2552518; X86-NEXT:    pushl {{[0-9]+}}(%esp)2519; X86-NEXT:    pushl {{[0-9]+}}(%esp)2520; X86-NEXT:    calll memcmp2521; X86-NEXT:    addl $12, %esp2522; X86-NEXT:    testl %eax, %eax2523; X86-NEXT:    setg %al2524; X86-NEXT:    retl2525  %call = tail call i32 @memcmp(ptr %x, ptr %y, i32 255) nounwind2526  %cmp = icmp sgt i32 %call, 02527  ret i1 %cmp2528}2529 2530define i1 @length255_eq_const(ptr %X) nounwind {2531; X86-LABEL: length255_eq_const:2532; X86:       # %bb.0:2533; X86-NEXT:    pushl $2552534; X86-NEXT:    pushl $.L.str2535; X86-NEXT:    pushl {{[0-9]+}}(%esp)2536; X86-NEXT:    calll memcmp2537; X86-NEXT:    addl $12, %esp2538; X86-NEXT:    testl %eax, %eax2539; X86-NEXT:    sete %al2540; X86-NEXT:    retl2541  %m = tail call i32 @memcmp(ptr %X, ptr @.str, i32 255) nounwind2542  %c = icmp eq i32 %m, 02543  ret i1 %c2544}2545 2546define i32 @length256(ptr %X, ptr %Y) nounwind {2547; X86-LABEL: length256:2548; X86:       # %bb.0:2549; X86-NEXT:    pushl $256 # imm = 0x1002550; X86-NEXT:    pushl {{[0-9]+}}(%esp)2551; X86-NEXT:    pushl {{[0-9]+}}(%esp)2552; X86-NEXT:    calll memcmp2553; X86-NEXT:    addl $12, %esp2554; X86-NEXT:    retl2555  %m = tail call i32 @memcmp(ptr %X, ptr %Y, i32 256) nounwind2556  ret i32 %m2557}2558 2559define i1 @length256_eq(ptr %x, ptr %y) nounwind {2560; X86-LABEL: length256_eq:2561; X86:       # %bb.0:2562; X86-NEXT:    pushl $256 # imm = 0x1002563; X86-NEXT:    pushl {{[0-9]+}}(%esp)2564; X86-NEXT:    pushl {{[0-9]+}}(%esp)2565; X86-NEXT:    calll memcmp2566; X86-NEXT:    addl $12, %esp2567; X86-NEXT:    testl %eax, %eax2568; X86-NEXT:    setne %al2569; X86-NEXT:    retl2570  %call = tail call i32 @memcmp(ptr %x, ptr %y, i32 256) nounwind2571  %cmp = icmp ne i32 %call, 02572  ret i1 %cmp2573}2574 2575define i1 @length256_lt(ptr %x, ptr %y) nounwind {2576; X86-LABEL: length256_lt:2577; X86:       # %bb.0:2578; X86-NEXT:    pushl $256 # imm = 0x1002579; X86-NEXT:    pushl {{[0-9]+}}(%esp)2580; X86-NEXT:    pushl {{[0-9]+}}(%esp)2581; X86-NEXT:    calll memcmp2582; X86-NEXT:    addl $12, %esp2583; X86-NEXT:    shrl $31, %eax2584; X86-NEXT:    # kill: def $al killed $al killed $eax2585; X86-NEXT:    retl2586  %call = tail call i32 @memcmp(ptr %x, ptr %y, i32 256) nounwind2587  %cmp = icmp slt i32 %call, 02588  ret i1 %cmp2589}2590 2591define i1 @length256_gt(ptr %x, ptr %y) nounwind {2592; X86-LABEL: length256_gt:2593; X86:       # %bb.0:2594; X86-NEXT:    pushl $256 # imm = 0x1002595; X86-NEXT:    pushl {{[0-9]+}}(%esp)2596; X86-NEXT:    pushl {{[0-9]+}}(%esp)2597; X86-NEXT:    calll memcmp2598; X86-NEXT:    addl $12, %esp2599; X86-NEXT:    testl %eax, %eax2600; X86-NEXT:    setg %al2601; X86-NEXT:    retl2602  %call = tail call i32 @memcmp(ptr %x, ptr %y, i32 256) nounwind2603  %cmp = icmp sgt i32 %call, 02604  ret i1 %cmp2605}2606 2607define i1 @length256_eq_const(ptr %X) nounwind {2608; X86-LABEL: length256_eq_const:2609; X86:       # %bb.0:2610; X86-NEXT:    pushl $256 # imm = 0x1002611; X86-NEXT:    pushl $.L.str2612; X86-NEXT:    pushl {{[0-9]+}}(%esp)2613; X86-NEXT:    calll memcmp2614; X86-NEXT:    addl $12, %esp2615; X86-NEXT:    testl %eax, %eax2616; X86-NEXT:    sete %al2617; X86-NEXT:    retl2618  %m = tail call i32 @memcmp(ptr %X, ptr @.str, i32 256) nounwind2619  %c = icmp eq i32 %m, 02620  ret i1 %c2621}2622 2623define i32 @length384(ptr %X, ptr %Y) nounwind {2624; X86-LABEL: length384:2625; X86:       # %bb.0:2626; X86-NEXT:    pushl $384 # imm = 0x1802627; X86-NEXT:    pushl {{[0-9]+}}(%esp)2628; X86-NEXT:    pushl {{[0-9]+}}(%esp)2629; X86-NEXT:    calll memcmp2630; X86-NEXT:    addl $12, %esp2631; X86-NEXT:    retl2632  %m = tail call i32 @memcmp(ptr %X, ptr %Y, i32 384) nounwind2633  ret i32 %m2634}2635 2636define i1 @length384_eq(ptr %x, ptr %y) nounwind {2637; X86-LABEL: length384_eq:2638; X86:       # %bb.0:2639; X86-NEXT:    pushl $384 # imm = 0x1802640; X86-NEXT:    pushl {{[0-9]+}}(%esp)2641; X86-NEXT:    pushl {{[0-9]+}}(%esp)2642; X86-NEXT:    calll memcmp2643; X86-NEXT:    addl $12, %esp2644; X86-NEXT:    testl %eax, %eax2645; X86-NEXT:    setne %al2646; X86-NEXT:    retl2647  %call = tail call i32 @memcmp(ptr %x, ptr %y, i32 384) nounwind2648  %cmp = icmp ne i32 %call, 02649  ret i1 %cmp2650}2651 2652define i1 @length384_lt(ptr %x, ptr %y) nounwind {2653; X86-LABEL: length384_lt:2654; X86:       # %bb.0:2655; X86-NEXT:    pushl $384 # imm = 0x1802656; X86-NEXT:    pushl {{[0-9]+}}(%esp)2657; X86-NEXT:    pushl {{[0-9]+}}(%esp)2658; X86-NEXT:    calll memcmp2659; X86-NEXT:    addl $12, %esp2660; X86-NEXT:    shrl $31, %eax2661; X86-NEXT:    # kill: def $al killed $al killed $eax2662; X86-NEXT:    retl2663  %call = tail call i32 @memcmp(ptr %x, ptr %y, i32 384) nounwind2664  %cmp = icmp slt i32 %call, 02665  ret i1 %cmp2666}2667 2668define i1 @length384_gt(ptr %x, ptr %y) nounwind {2669; X86-LABEL: length384_gt:2670; X86:       # %bb.0:2671; X86-NEXT:    pushl $384 # imm = 0x1802672; X86-NEXT:    pushl {{[0-9]+}}(%esp)2673; X86-NEXT:    pushl {{[0-9]+}}(%esp)2674; X86-NEXT:    calll memcmp2675; X86-NEXT:    addl $12, %esp2676; X86-NEXT:    testl %eax, %eax2677; X86-NEXT:    setg %al2678; X86-NEXT:    retl2679  %call = tail call i32 @memcmp(ptr %x, ptr %y, i32 384) nounwind2680  %cmp = icmp sgt i32 %call, 02681  ret i1 %cmp2682}2683 2684define i1 @length384_eq_const(ptr %X) nounwind {2685; X86-LABEL: length384_eq_const:2686; X86:       # %bb.0:2687; X86-NEXT:    pushl $384 # imm = 0x1802688; X86-NEXT:    pushl $.L.str2689; X86-NEXT:    pushl {{[0-9]+}}(%esp)2690; X86-NEXT:    calll memcmp2691; X86-NEXT:    addl $12, %esp2692; X86-NEXT:    testl %eax, %eax2693; X86-NEXT:    sete %al2694; X86-NEXT:    retl2695  %m = tail call i32 @memcmp(ptr %X, ptr @.str, i32 384) nounwind2696  %c = icmp eq i32 %m, 02697  ret i1 %c2698}2699 2700define i32 @length511(ptr %X, ptr %Y) nounwind {2701; X86-LABEL: length511:2702; X86:       # %bb.0:2703; X86-NEXT:    pushl $511 # imm = 0x1FF2704; X86-NEXT:    pushl {{[0-9]+}}(%esp)2705; X86-NEXT:    pushl {{[0-9]+}}(%esp)2706; X86-NEXT:    calll memcmp2707; X86-NEXT:    addl $12, %esp2708; X86-NEXT:    retl2709  %m = tail call i32 @memcmp(ptr %X, ptr %Y, i32 511) nounwind2710  ret i32 %m2711}2712 2713define i1 @length511_eq(ptr %x, ptr %y) nounwind {2714; X86-LABEL: length511_eq:2715; X86:       # %bb.0:2716; X86-NEXT:    pushl $511 # imm = 0x1FF2717; X86-NEXT:    pushl {{[0-9]+}}(%esp)2718; X86-NEXT:    pushl {{[0-9]+}}(%esp)2719; X86-NEXT:    calll memcmp2720; X86-NEXT:    addl $12, %esp2721; X86-NEXT:    testl %eax, %eax2722; X86-NEXT:    setne %al2723; X86-NEXT:    retl2724  %call = tail call i32 @memcmp(ptr %x, ptr %y, i32 511) nounwind2725  %cmp = icmp ne i32 %call, 02726  ret i1 %cmp2727}2728 2729define i1 @length511_lt(ptr %x, ptr %y) nounwind {2730; X86-LABEL: length511_lt:2731; X86:       # %bb.0:2732; X86-NEXT:    pushl $511 # imm = 0x1FF2733; X86-NEXT:    pushl {{[0-9]+}}(%esp)2734; X86-NEXT:    pushl {{[0-9]+}}(%esp)2735; X86-NEXT:    calll memcmp2736; X86-NEXT:    addl $12, %esp2737; X86-NEXT:    shrl $31, %eax2738; X86-NEXT:    # kill: def $al killed $al killed $eax2739; X86-NEXT:    retl2740  %call = tail call i32 @memcmp(ptr %x, ptr %y, i32 511) nounwind2741  %cmp = icmp slt i32 %call, 02742  ret i1 %cmp2743}2744 2745define i1 @length511_gt(ptr %x, ptr %y) nounwind {2746; X86-LABEL: length511_gt:2747; X86:       # %bb.0:2748; X86-NEXT:    pushl $511 # imm = 0x1FF2749; X86-NEXT:    pushl {{[0-9]+}}(%esp)2750; X86-NEXT:    pushl {{[0-9]+}}(%esp)2751; X86-NEXT:    calll memcmp2752; X86-NEXT:    addl $12, %esp2753; X86-NEXT:    testl %eax, %eax2754; X86-NEXT:    setg %al2755; X86-NEXT:    retl2756  %call = tail call i32 @memcmp(ptr %x, ptr %y, i32 511) nounwind2757  %cmp = icmp sgt i32 %call, 02758  ret i1 %cmp2759}2760 2761define i1 @length511_eq_const(ptr %X) nounwind {2762; X86-LABEL: length511_eq_const:2763; X86:       # %bb.0:2764; X86-NEXT:    pushl $511 # imm = 0x1FF2765; X86-NEXT:    pushl $.L.str2766; X86-NEXT:    pushl {{[0-9]+}}(%esp)2767; X86-NEXT:    calll memcmp2768; X86-NEXT:    addl $12, %esp2769; X86-NEXT:    testl %eax, %eax2770; X86-NEXT:    sete %al2771; X86-NEXT:    retl2772  %m = tail call i32 @memcmp(ptr %X, ptr @.str, i32 511) nounwind2773  %c = icmp eq i32 %m, 02774  ret i1 %c2775}2776 2777define i32 @length512(ptr %X, ptr %Y) nounwind {2778; X86-LABEL: length512:2779; X86:       # %bb.0:2780; X86-NEXT:    pushl $512 # imm = 0x2002781; X86-NEXT:    pushl {{[0-9]+}}(%esp)2782; X86-NEXT:    pushl {{[0-9]+}}(%esp)2783; X86-NEXT:    calll memcmp2784; X86-NEXT:    addl $12, %esp2785; X86-NEXT:    retl2786  %m = tail call i32 @memcmp(ptr %X, ptr %Y, i32 512) nounwind2787  ret i32 %m2788}2789 2790define i1 @length512_eq(ptr %x, ptr %y) nounwind {2791; X86-LABEL: length512_eq:2792; X86:       # %bb.0:2793; X86-NEXT:    pushl $512 # imm = 0x2002794; X86-NEXT:    pushl {{[0-9]+}}(%esp)2795; X86-NEXT:    pushl {{[0-9]+}}(%esp)2796; X86-NEXT:    calll memcmp2797; X86-NEXT:    addl $12, %esp2798; X86-NEXT:    testl %eax, %eax2799; X86-NEXT:    setne %al2800; X86-NEXT:    retl2801  %call = tail call i32 @memcmp(ptr %x, ptr %y, i32 512) nounwind2802  %cmp = icmp ne i32 %call, 02803  ret i1 %cmp2804}2805 2806define i1 @length512_lt(ptr %x, ptr %y) nounwind {2807; X86-LABEL: length512_lt:2808; X86:       # %bb.0:2809; X86-NEXT:    pushl $512 # imm = 0x2002810; X86-NEXT:    pushl {{[0-9]+}}(%esp)2811; X86-NEXT:    pushl {{[0-9]+}}(%esp)2812; X86-NEXT:    calll memcmp2813; X86-NEXT:    addl $12, %esp2814; X86-NEXT:    shrl $31, %eax2815; X86-NEXT:    # kill: def $al killed $al killed $eax2816; X86-NEXT:    retl2817  %call = tail call i32 @memcmp(ptr %x, ptr %y, i32 512) nounwind2818  %cmp = icmp slt i32 %call, 02819  ret i1 %cmp2820}2821 2822define i1 @length512_gt(ptr %x, ptr %y) nounwind {2823; X86-LABEL: length512_gt:2824; X86:       # %bb.0:2825; X86-NEXT:    pushl $512 # imm = 0x2002826; X86-NEXT:    pushl {{[0-9]+}}(%esp)2827; X86-NEXT:    pushl {{[0-9]+}}(%esp)2828; X86-NEXT:    calll memcmp2829; X86-NEXT:    addl $12, %esp2830; X86-NEXT:    testl %eax, %eax2831; X86-NEXT:    setg %al2832; X86-NEXT:    retl2833  %call = tail call i32 @memcmp(ptr %x, ptr %y, i32 512) nounwind2834  %cmp = icmp sgt i32 %call, 02835  ret i1 %cmp2836}2837 2838define i1 @length512_eq_const(ptr %X) nounwind {2839; X86-LABEL: length512_eq_const:2840; X86:       # %bb.0:2841; X86-NEXT:    pushl $512 # imm = 0x2002842; X86-NEXT:    pushl $.L.str2843; X86-NEXT:    pushl {{[0-9]+}}(%esp)2844; X86-NEXT:    calll memcmp2845; X86-NEXT:    addl $12, %esp2846; X86-NEXT:    testl %eax, %eax2847; X86-NEXT:    sete %al2848; X86-NEXT:    retl2849  %m = tail call i32 @memcmp(ptr %X, ptr @.str, i32 512) nounwind2850  %c = icmp eq i32 %m, 02851  ret i1 %c2852}2853 2854; This checks that we do not do stupid things with huge sizes.2855define i32 @huge_length(ptr %X, ptr %Y) nounwind {2856; X86-LABEL: huge_length:2857; X86:       # %bb.0:2858; X86-NEXT:    pushl $-12859; X86-NEXT:    pushl {{[0-9]+}}(%esp)2860; X86-NEXT:    pushl {{[0-9]+}}(%esp)2861; X86-NEXT:    calll memcmp2862; X86-NEXT:    addl $12, %esp2863; X86-NEXT:    retl2864  %m = tail call i32 @memcmp(ptr %X, ptr %Y, i32 9223372036854775807) nounwind2865  ret i32 %m2866}2867 2868define i1 @huge_length_eq(ptr %X, ptr %Y) nounwind {2869; X86-LABEL: huge_length_eq:2870; X86:       # %bb.0:2871; X86-NEXT:    pushl $-12872; X86-NEXT:    pushl {{[0-9]+}}(%esp)2873; X86-NEXT:    pushl {{[0-9]+}}(%esp)2874; X86-NEXT:    calll memcmp2875; X86-NEXT:    addl $12, %esp2876; X86-NEXT:    testl %eax, %eax2877; X86-NEXT:    sete %al2878; X86-NEXT:    retl2879  %m = tail call i32 @memcmp(ptr %X, ptr %Y, i32 9223372036854775807) nounwind2880  %c = icmp eq i32 %m, 02881  ret i1 %c2882}2883 2884; This checks non-constant sizes.2885define i32 @nonconst_length(ptr %X, ptr %Y, i32 %size) nounwind {2886; X86-LABEL: nonconst_length:2887; X86:       # %bb.0:2888; X86-NEXT:    jmp memcmp # TAILCALL2889  %m = tail call i32 @memcmp(ptr %X, ptr %Y, i32 %size) nounwind2890  ret i32 %m2891}2892 2893define i1 @nonconst_length_eq(ptr %X, ptr %Y, i32 %size) nounwind {2894; X86-LABEL: nonconst_length_eq:2895; X86:       # %bb.0:2896; X86-NEXT:    pushl {{[0-9]+}}(%esp)2897; X86-NEXT:    pushl {{[0-9]+}}(%esp)2898; X86-NEXT:    pushl {{[0-9]+}}(%esp)2899; X86-NEXT:    calll memcmp2900; X86-NEXT:    addl $12, %esp2901; X86-NEXT:    testl %eax, %eax2902; X86-NEXT:    sete %al2903; X86-NEXT:    retl2904  %m = tail call i32 @memcmp(ptr %X, ptr %Y, i32 %size) nounwind2905  %c = icmp eq i32 %m, 02906  ret i1 %c2907}2908