brintos

brintos / llvm-project-archived public Read only

0
0
Text · 96.9 KiB · 9e713bf Raw
3092 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc < %s -mtriple=x86_64-unknown-unknown               | FileCheck %s --check-prefixes=X64,X64-SSE,X64-SSE23; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=sse4.1 | FileCheck %s --check-prefixes=X64,X64-SSE,X64-SSE414; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=avx    | FileCheck %s --check-prefixes=X64,X64-AVX,X64-AVX15; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=avx2   | FileCheck %s --check-prefixes=X64,X64-AVX,X64-AVX26; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=avx512bw,+prefer-256-bit | FileCheck %s --check-prefixes=X64,X64-AVX,X64-AVX27; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=avx512bw,-prefer-256-bit | FileCheck %s --check-prefixes=X64,X64-AVX,X64-AVX512,X64-AVX512BW8; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=avx512f,+prefer-256-bit,-prefer-mask-registers | FileCheck %s --check-prefixes=X64,X64-AVX,X64-AVX29; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=avx512f,-prefer-256-bit,-prefer-mask-registers | FileCheck %s --check-prefixes=X64,X64-AVX,X64-AVX512,X64-AVX512F10; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=avx512f,+prefer-256-bit,+prefer-mask-registers | FileCheck %s --check-prefixes=X64,X64-MIC-AVX,X64-MIC-AVX211; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=avx512f,-prefer-256-bit,+prefer-mask-registers | FileCheck %s --check-prefixes=X64,X64-MIC-AVX,X64-MIC-AVX512F12 13; This tests codegen time inlining/optimization of memcmp14; rdar://648039815 16@.str = private constant [513 x i8] c"01234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901\00", align 117 18declare dso_local i32 @memcmp(ptr, ptr, i64)19 20define i32 @length0(ptr %X, ptr %Y) nounwind {21; X64-LABEL: length0:22; X64:       # %bb.0:23; X64-NEXT:    xorl %eax, %eax24; X64-NEXT:    retq25   %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 0) nounwind26   ret i32 %m27 }28 29define i1 @length0_eq(ptr %X, ptr %Y) nounwind {30; X64-LABEL: length0_eq:31; X64:       # %bb.0:32; X64-NEXT:    movb $1, %al33; X64-NEXT:    retq34  %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 0) nounwind35  %c = icmp eq i32 %m, 036  ret i1 %c37}38 39define i1 @length0_lt(ptr %X, ptr %Y) nounwind {40; X64-LABEL: length0_lt:41; X64:       # %bb.0:42; X64-NEXT:    xorl %eax, %eax43; X64-NEXT:    retq44  %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 0) nounwind45  %c = icmp slt i32 %m, 046  ret i1 %c47}48 49define i32 @length2(ptr %X, ptr %Y) nounwind {50; X64-LABEL: length2:51; X64:       # %bb.0:52; X64-NEXT:    movzwl (%rdi), %eax53; X64-NEXT:    movzwl (%rsi), %ecx54; X64-NEXT:    rolw $8, %ax55; X64-NEXT:    rolw $8, %cx56; X64-NEXT:    movzwl %ax, %eax57; X64-NEXT:    movzwl %cx, %ecx58; X64-NEXT:    subl %ecx, %eax59; X64-NEXT:    retq60  %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 2) nounwind61  ret i32 %m62}63 64define i32 @length2_const(ptr %X, ptr %Y) nounwind {65; X64-LABEL: length2_const:66; X64:       # %bb.0:67; X64-NEXT:    movzwl (%rdi), %eax68; X64-NEXT:    rolw $8, %ax69; X64-NEXT:    movzwl %ax, %eax70; X64-NEXT:    addl $-12594, %eax # imm = 0xCECE71; X64-NEXT:    retq72  %m = tail call i32 @memcmp(ptr %X, ptr getelementptr inbounds ([513 x i8], ptr @.str, i32 0, i32 1), i64 2) nounwind73  ret i32 %m74}75 76define i1 @length2_gt_const(ptr %X, ptr %Y) nounwind {77; X64-LABEL: length2_gt_const:78; X64:       # %bb.0:79; X64-NEXT:    movzwl (%rdi), %eax80; X64-NEXT:    rolw $8, %ax81; X64-NEXT:    movzwl %ax, %eax82; X64-NEXT:    addl $-12594, %eax # imm = 0xCECE83; X64-NEXT:    testl %eax, %eax84; X64-NEXT:    setg %al85; X64-NEXT:    retq86  %m = tail call i32 @memcmp(ptr %X, ptr getelementptr inbounds ([513 x i8], ptr @.str, i32 0, i32 1), i64 2) nounwind87  %c = icmp sgt i32 %m, 088  ret i1 %c89}90 91define i1 @length2_eq(ptr %X, ptr %Y) nounwind {92; X64-LABEL: length2_eq:93; X64:       # %bb.0:94; X64-NEXT:    movzwl (%rdi), %eax95; X64-NEXT:    cmpw (%rsi), %ax96; X64-NEXT:    sete %al97; X64-NEXT:    retq98  %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 2) nounwind99  %c = icmp eq i32 %m, 0100  ret i1 %c101}102 103define i1 @length2_lt(ptr %X, ptr %Y) nounwind {104; X64-LABEL: length2_lt:105; X64:       # %bb.0:106; X64-NEXT:    movzwl (%rdi), %eax107; X64-NEXT:    movzwl (%rsi), %ecx108; X64-NEXT:    rolw $8, %ax109; X64-NEXT:    rolw $8, %cx110; X64-NEXT:    movzwl %ax, %eax111; X64-NEXT:    movzwl %cx, %ecx112; X64-NEXT:    subl %ecx, %eax113; X64-NEXT:    shrl $31, %eax114; X64-NEXT:    # kill: def $al killed $al killed $eax115; X64-NEXT:    retq116  %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 2) nounwind117  %c = icmp slt i32 %m, 0118  ret i1 %c119}120 121define i1 @length2_gt(ptr %X, ptr %Y) nounwind {122; X64-LABEL: length2_gt:123; X64:       # %bb.0:124; X64-NEXT:    movzwl (%rdi), %eax125; X64-NEXT:    movzwl (%rsi), %ecx126; X64-NEXT:    rolw $8, %ax127; X64-NEXT:    rolw $8, %cx128; X64-NEXT:    movzwl %ax, %eax129; X64-NEXT:    movzwl %cx, %ecx130; X64-NEXT:    subl %ecx, %eax131; X64-NEXT:    testl %eax, %eax132; X64-NEXT:    setg %al133; X64-NEXT:    retq134  %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 2) nounwind135  %c = icmp sgt i32 %m, 0136  ret i1 %c137}138 139define i1 @length2_eq_const(ptr %X) nounwind {140; X64-LABEL: length2_eq_const:141; X64:       # %bb.0:142; X64-NEXT:    cmpw $12849, (%rdi) # imm = 0x3231143; X64-NEXT:    setne %al144; X64-NEXT:    retq145  %m = tail call i32 @memcmp(ptr %X, ptr getelementptr inbounds ([513 x i8], ptr @.str, i32 0, i32 1), i64 2) nounwind146  %c = icmp ne i32 %m, 0147  ret i1 %c148}149 150define i1 @length2_eq_nobuiltin_attr(ptr %X, ptr %Y) nounwind {151; X64-LABEL: length2_eq_nobuiltin_attr:152; X64:       # %bb.0:153; X64-NEXT:    pushq %rax154; X64-NEXT:    movl $2, %edx155; X64-NEXT:    callq memcmp156; X64-NEXT:    testl %eax, %eax157; X64-NEXT:    sete %al158; X64-NEXT:    popq %rcx159; X64-NEXT:    retq160  %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 2) nounwind nobuiltin161  %c = icmp eq i32 %m, 0162  ret i1 %c163}164 165define i32 @length3(ptr %X, ptr %Y) nounwind {166; X64-LABEL: length3:167; X64:       # %bb.0:168; X64-NEXT:    movzwl (%rdi), %eax169; X64-NEXT:    movzwl (%rsi), %ecx170; X64-NEXT:    rolw $8, %ax171; X64-NEXT:    rolw $8, %cx172; X64-NEXT:    cmpw %cx, %ax173; X64-NEXT:    jne .LBB11_3174; X64-NEXT:  # %bb.1: # %loadbb1175; X64-NEXT:    movzbl 2(%rdi), %eax176; X64-NEXT:    movzbl 2(%rsi), %ecx177; X64-NEXT:    subl %ecx, %eax178; X64-NEXT:    retq179; X64-NEXT:  .LBB11_3: # %res_block180; X64-NEXT:    setae %al181; X64-NEXT:    movzbl %al, %eax182; X64-NEXT:    leal -1(%rax,%rax), %eax183; X64-NEXT:    retq184  %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 3) nounwind185  ret i32 %m186}187 188define i1 @length3_eq(ptr %X, ptr %Y) nounwind {189; X64-LABEL: length3_eq:190; X64:       # %bb.0:191; X64-NEXT:    movzwl (%rdi), %eax192; X64-NEXT:    xorw (%rsi), %ax193; X64-NEXT:    movzbl 2(%rdi), %ecx194; X64-NEXT:    xorb 2(%rsi), %cl195; X64-NEXT:    movzbl %cl, %ecx196; X64-NEXT:    orw %ax, %cx197; X64-NEXT:    setne %al198; X64-NEXT:    retq199  %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 3) nounwind200  %c = icmp ne i32 %m, 0201  ret i1 %c202}203 204define i32 @length4(ptr %X, ptr %Y) nounwind {205; X64-LABEL: length4:206; X64:       # %bb.0:207; X64-NEXT:    movl (%rdi), %eax208; X64-NEXT:    movl (%rsi), %ecx209; X64-NEXT:    bswapl %eax210; X64-NEXT:    bswapl %ecx211; X64-NEXT:    cmpl %ecx, %eax212; X64-NEXT:    seta %al213; X64-NEXT:    sbbb $0, %al214; X64-NEXT:    movsbl %al, %eax215; X64-NEXT:    retq216  %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 4) nounwind217  ret i32 %m218}219 220define i1 @length4_eq(ptr %X, ptr %Y) nounwind {221; X64-LABEL: length4_eq:222; X64:       # %bb.0:223; X64-NEXT:    movl (%rdi), %eax224; X64-NEXT:    cmpl (%rsi), %eax225; X64-NEXT:    setne %al226; X64-NEXT:    retq227  %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 4) nounwind228  %c = icmp ne i32 %m, 0229  ret i1 %c230}231 232define i1 @length4_lt(ptr %X, ptr %Y) nounwind {233; X64-LABEL: length4_lt:234; X64:       # %bb.0:235; X64-NEXT:    movl (%rdi), %eax236; X64-NEXT:    movl (%rsi), %ecx237; X64-NEXT:    bswapl %eax238; X64-NEXT:    bswapl %ecx239; X64-NEXT:    cmpl %ecx, %eax240; X64-NEXT:    setb %al241; X64-NEXT:    retq242  %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 4) nounwind243  %c = icmp slt i32 %m, 0244  ret i1 %c245}246 247define i1 @length4_gt(ptr %X, ptr %Y) nounwind {248; X64-LABEL: length4_gt:249; X64:       # %bb.0:250; X64-NEXT:    movl (%rdi), %eax251; X64-NEXT:    movl (%rsi), %ecx252; X64-NEXT:    bswapl %eax253; X64-NEXT:    bswapl %ecx254; X64-NEXT:    cmpl %ecx, %eax255; X64-NEXT:    seta %al256; X64-NEXT:    retq257  %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 4) nounwind258  %c = icmp sgt i32 %m, 0259  ret i1 %c260}261 262define i1 @length4_le(ptr %X, ptr %Y) nounwind {263; X64-LABEL: length4_le:264; X64:       # %bb.0:265; X64-NEXT:    movl (%rdi), %eax266; X64-NEXT:    movl (%rsi), %ecx267; X64-NEXT:    bswapl %eax268; X64-NEXT:    bswapl %ecx269; X64-NEXT:    cmpl %ecx, %eax270; X64-NEXT:    setbe %al271; X64-NEXT:    retq272  %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 4) nounwind273  %c = icmp slt i32 %m, 1274  ret i1 %c275}276 277define i1 @length4_ge(ptr %X, ptr %Y) nounwind {278; X64-LABEL: length4_ge:279; X64:       # %bb.0:280; X64-NEXT:    movl (%rdi), %eax281; X64-NEXT:    movl (%rsi), %ecx282; X64-NEXT:    bswapl %eax283; X64-NEXT:    bswapl %ecx284; X64-NEXT:    cmpl %ecx, %eax285; X64-NEXT:    setae %al286; X64-NEXT:    retq287  %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 4) nounwind288  %c = icmp sgt i32 %m, -1289  ret i1 %c290}291 292define i1 @length4_eq_const(ptr %X) nounwind {293; X64-LABEL: length4_eq_const:294; X64:       # %bb.0:295; X64-NEXT:    cmpl $875770417, (%rdi) # imm = 0x34333231296; X64-NEXT:    sete %al297; X64-NEXT:    retq298  %m = tail call i32 @memcmp(ptr %X, ptr getelementptr inbounds ([513 x i8], ptr @.str, i32 0, i32 1), i64 4) nounwind299  %c = icmp eq i32 %m, 0300  ret i1 %c301}302 303define i32 @length5(ptr %X, ptr %Y) nounwind {304; X64-LABEL: length5:305; X64:       # %bb.0:306; X64-NEXT:    movl (%rdi), %eax307; X64-NEXT:    movl (%rsi), %ecx308; X64-NEXT:    bswapl %eax309; X64-NEXT:    bswapl %ecx310; X64-NEXT:    cmpl %ecx, %eax311; X64-NEXT:    jne .LBB20_3312; X64-NEXT:  # %bb.1: # %loadbb1313; X64-NEXT:    movzbl 4(%rdi), %eax314; X64-NEXT:    movzbl 4(%rsi), %ecx315; X64-NEXT:    subl %ecx, %eax316; X64-NEXT:    retq317; X64-NEXT:  .LBB20_3: # %res_block318; X64-NEXT:    setae %al319; X64-NEXT:    movzbl %al, %eax320; X64-NEXT:    leal -1(%rax,%rax), %eax321; X64-NEXT:    retq322  %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 5) nounwind323  ret i32 %m324}325 326define i1 @length5_eq(ptr %X, ptr %Y) nounwind {327; X64-LABEL: length5_eq:328; X64:       # %bb.0:329; X64-NEXT:    movl (%rdi), %eax330; X64-NEXT:    xorl (%rsi), %eax331; X64-NEXT:    movzbl 4(%rdi), %ecx332; X64-NEXT:    xorb 4(%rsi), %cl333; X64-NEXT:    movzbl %cl, %ecx334; X64-NEXT:    orl %eax, %ecx335; X64-NEXT:    setne %al336; X64-NEXT:    retq337  %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 5) nounwind338  %c = icmp ne i32 %m, 0339  ret i1 %c340}341 342define i1 @length5_lt(ptr %X, ptr %Y) nounwind {343; X64-LABEL: length5_lt:344; X64:       # %bb.0:345; X64-NEXT:    movl (%rdi), %eax346; X64-NEXT:    movl (%rsi), %ecx347; X64-NEXT:    bswapl %eax348; X64-NEXT:    bswapl %ecx349; X64-NEXT:    cmpl %ecx, %eax350; X64-NEXT:    jne .LBB22_3351; X64-NEXT:  # %bb.1: # %loadbb1352; X64-NEXT:    movzbl 4(%rdi), %eax353; X64-NEXT:    movzbl 4(%rsi), %ecx354; X64-NEXT:    subl %ecx, %eax355; X64-NEXT:    shrl $31, %eax356; X64-NEXT:    # kill: def $al killed $al killed $eax357; X64-NEXT:    retq358; X64-NEXT:  .LBB22_3: # %res_block359; X64-NEXT:    setae %al360; X64-NEXT:    movzbl %al, %eax361; X64-NEXT:    leal -1(%rax,%rax), %eax362; X64-NEXT:    shrl $31, %eax363; X64-NEXT:    # kill: def $al killed $al killed $eax364; X64-NEXT:    retq365  %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 5) nounwind366  %c = icmp slt i32 %m, 0367  ret i1 %c368}369 370define i32 @length7(ptr %X, ptr %Y) nounwind {371; X64-LABEL: length7:372; X64:       # %bb.0:373; X64-NEXT:    movl (%rdi), %ecx374; X64-NEXT:    movl (%rsi), %edx375; X64-NEXT:    bswapl %ecx376; X64-NEXT:    bswapl %edx377; X64-NEXT:    cmpl %edx, %ecx378; X64-NEXT:    jne .LBB23_2379; X64-NEXT:  # %bb.1: # %loadbb1380; X64-NEXT:    movl 3(%rdi), %ecx381; X64-NEXT:    movl 3(%rsi), %edx382; X64-NEXT:    bswapl %ecx383; X64-NEXT:    bswapl %edx384; X64-NEXT:    xorl %eax, %eax385; X64-NEXT:    cmpl %edx, %ecx386; X64-NEXT:    je .LBB23_3387; X64-NEXT:  .LBB23_2: # %res_block388; X64-NEXT:    xorl %eax, %eax389; X64-NEXT:    cmpl %edx, %ecx390; X64-NEXT:    setae %al391; X64-NEXT:    leal -1(%rax,%rax), %eax392; X64-NEXT:  .LBB23_3: # %endblock393; X64-NEXT:    retq394  %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 7) nounwind395  ret i32 %m396}397 398define i1 @length7_lt(ptr %X, ptr %Y) nounwind {399; X64-LABEL: length7_lt:400; X64:       # %bb.0:401; X64-NEXT:    movl (%rdi), %ecx402; X64-NEXT:    movl (%rsi), %edx403; X64-NEXT:    bswapl %ecx404; X64-NEXT:    bswapl %edx405; X64-NEXT:    cmpl %edx, %ecx406; X64-NEXT:    jne .LBB24_2407; X64-NEXT:  # %bb.1: # %loadbb1408; X64-NEXT:    movl 3(%rdi), %ecx409; X64-NEXT:    movl 3(%rsi), %edx410; X64-NEXT:    bswapl %ecx411; X64-NEXT:    bswapl %edx412; X64-NEXT:    xorl %eax, %eax413; X64-NEXT:    cmpl %edx, %ecx414; X64-NEXT:    je .LBB24_3415; X64-NEXT:  .LBB24_2: # %res_block416; X64-NEXT:    xorl %eax, %eax417; X64-NEXT:    cmpl %edx, %ecx418; X64-NEXT:    setae %al419; X64-NEXT:    leal -1(%rax,%rax), %eax420; X64-NEXT:  .LBB24_3: # %endblock421; X64-NEXT:    shrl $31, %eax422; X64-NEXT:    # kill: def $al killed $al killed $eax423; X64-NEXT:    retq424  %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 7) nounwind425  %c = icmp slt i32 %m, 0426  ret i1 %c427}428 429define i1 @length7_eq(ptr %X, ptr %Y) nounwind {430; X64-LABEL: length7_eq:431; X64:       # %bb.0:432; X64-NEXT:    movl (%rdi), %eax433; X64-NEXT:    movl 3(%rdi), %ecx434; X64-NEXT:    xorl (%rsi), %eax435; X64-NEXT:    xorl 3(%rsi), %ecx436; X64-NEXT:    orl %eax, %ecx437; X64-NEXT:    setne %al438; X64-NEXT:    retq439  %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 7) nounwind440  %c = icmp ne i32 %m, 0441  ret i1 %c442}443 444define i32 @length8(ptr %X, ptr %Y) nounwind {445; X64-LABEL: length8:446; X64:       # %bb.0:447; X64-NEXT:    movq (%rdi), %rax448; X64-NEXT:    movq (%rsi), %rcx449; X64-NEXT:    bswapq %rax450; X64-NEXT:    bswapq %rcx451; X64-NEXT:    cmpq %rcx, %rax452; X64-NEXT:    seta %al453; X64-NEXT:    sbbb $0, %al454; X64-NEXT:    movsbl %al, %eax455; X64-NEXT:    retq456  %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 8) nounwind457  ret i32 %m458}459 460define i1 @length8_eq(ptr %X, ptr %Y) nounwind {461; X64-LABEL: length8_eq:462; X64:       # %bb.0:463; X64-NEXT:    movq (%rdi), %rax464; X64-NEXT:    cmpq (%rsi), %rax465; X64-NEXT:    sete %al466; X64-NEXT:    retq467  %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 8) nounwind468  %c = icmp eq i32 %m, 0469  ret i1 %c470}471 472define i1 @length8_eq_const(ptr %X) nounwind {473; X64-LABEL: length8_eq_const:474; X64:       # %bb.0:475; X64-NEXT:    movabsq $3978425819141910832, %rax # imm = 0x3736353433323130476; X64-NEXT:    cmpq %rax, (%rdi)477; X64-NEXT:    setne %al478; X64-NEXT:    retq479  %m = tail call i32 @memcmp(ptr %X, ptr @.str, i64 8) nounwind480  %c = icmp ne i32 %m, 0481  ret i1 %c482}483 484define i1 @length9_eq(ptr %X, ptr %Y) nounwind {485; X64-LABEL: length9_eq:486; X64:       # %bb.0:487; X64-NEXT:    movq (%rdi), %rax488; X64-NEXT:    xorq (%rsi), %rax489; X64-NEXT:    movzbl 8(%rdi), %ecx490; X64-NEXT:    xorb 8(%rsi), %cl491; X64-NEXT:    movzbl %cl, %ecx492; X64-NEXT:    orq %rax, %rcx493; X64-NEXT:    sete %al494; X64-NEXT:    retq495  %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 9) nounwind496  %c = icmp eq i32 %m, 0497  ret i1 %c498}499 500define i1 @length10_eq(ptr %X, ptr %Y) nounwind {501; X64-LABEL: length10_eq:502; X64:       # %bb.0:503; X64-NEXT:    movq (%rdi), %rax504; X64-NEXT:    xorq (%rsi), %rax505; X64-NEXT:    movzwl 8(%rdi), %ecx506; X64-NEXT:    xorw 8(%rsi), %cx507; X64-NEXT:    movzwl %cx, %ecx508; X64-NEXT:    orq %rax, %rcx509; X64-NEXT:    sete %al510; X64-NEXT:    retq511  %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 10) nounwind512  %c = icmp eq i32 %m, 0513  ret i1 %c514}515 516define i1 @length11_eq(ptr %X, ptr %Y) nounwind {517; X64-LABEL: length11_eq:518; X64:       # %bb.0:519; X64-NEXT:    movq (%rdi), %rax520; X64-NEXT:    movq 3(%rdi), %rcx521; X64-NEXT:    xorq (%rsi), %rax522; X64-NEXT:    xorq 3(%rsi), %rcx523; X64-NEXT:    orq %rax, %rcx524; X64-NEXT:    sete %al525; X64-NEXT:    retq526  %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 11) nounwind527  %c = icmp eq i32 %m, 0528  ret i1 %c529}530 531define i1 @length12_eq(ptr %X, ptr %Y) nounwind {532; X64-LABEL: length12_eq:533; X64:       # %bb.0:534; X64-NEXT:    movq (%rdi), %rax535; X64-NEXT:    xorq (%rsi), %rax536; X64-NEXT:    movl 8(%rdi), %ecx537; X64-NEXT:    xorl 8(%rsi), %ecx538; X64-NEXT:    orq %rax, %rcx539; X64-NEXT:    setne %al540; X64-NEXT:    retq541  %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 12) nounwind542  %c = icmp ne i32 %m, 0543  ret i1 %c544}545 546define i32 @length12(ptr %X, ptr %Y) nounwind {547; X64-LABEL: length12:548; X64:       # %bb.0:549; X64-NEXT:    movq (%rdi), %rcx550; X64-NEXT:    movq (%rsi), %rdx551; X64-NEXT:    bswapq %rcx552; X64-NEXT:    bswapq %rdx553; X64-NEXT:    cmpq %rdx, %rcx554; X64-NEXT:    jne .LBB33_2555; X64-NEXT:  # %bb.1: # %loadbb1556; X64-NEXT:    movl 8(%rdi), %ecx557; X64-NEXT:    movl 8(%rsi), %edx558; X64-NEXT:    bswapl %ecx559; X64-NEXT:    bswapl %edx560; X64-NEXT:    xorl %eax, %eax561; X64-NEXT:    cmpq %rdx, %rcx562; X64-NEXT:    je .LBB33_3563; X64-NEXT:  .LBB33_2: # %res_block564; X64-NEXT:    xorl %eax, %eax565; X64-NEXT:    cmpq %rdx, %rcx566; X64-NEXT:    setae %al567; X64-NEXT:    leal -1(%rax,%rax), %eax568; X64-NEXT:  .LBB33_3: # %endblock569; X64-NEXT:    retq570  %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 12) nounwind571  ret i32 %m572}573 574define i1 @length13_eq(ptr %X, ptr %Y) nounwind {575; X64-LABEL: length13_eq:576; X64:       # %bb.0:577; X64-NEXT:    movq (%rdi), %rax578; X64-NEXT:    movq 5(%rdi), %rcx579; X64-NEXT:    xorq (%rsi), %rax580; X64-NEXT:    xorq 5(%rsi), %rcx581; X64-NEXT:    orq %rax, %rcx582; X64-NEXT:    sete %al583; X64-NEXT:    retq584  %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 13) nounwind585  %c = icmp eq i32 %m, 0586  ret i1 %c587}588 589define i1 @length14_eq(ptr %X, ptr %Y) nounwind {590; X64-LABEL: length14_eq:591; X64:       # %bb.0:592; X64-NEXT:    movq (%rdi), %rax593; X64-NEXT:    movq 6(%rdi), %rcx594; X64-NEXT:    xorq (%rsi), %rax595; X64-NEXT:    xorq 6(%rsi), %rcx596; X64-NEXT:    orq %rax, %rcx597; X64-NEXT:    sete %al598; X64-NEXT:    retq599  %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 14) nounwind600  %c = icmp eq i32 %m, 0601  ret i1 %c602}603 604define i32 @length15(ptr %X, ptr %Y) nounwind {605; X64-LABEL: length15:606; X64:       # %bb.0:607; X64-NEXT:    movq (%rdi), %rcx608; X64-NEXT:    movq (%rsi), %rdx609; X64-NEXT:    bswapq %rcx610; X64-NEXT:    bswapq %rdx611; X64-NEXT:    cmpq %rdx, %rcx612; X64-NEXT:    jne .LBB36_2613; X64-NEXT:  # %bb.1: # %loadbb1614; X64-NEXT:    movq 7(%rdi), %rcx615; X64-NEXT:    movq 7(%rsi), %rdx616; X64-NEXT:    bswapq %rcx617; X64-NEXT:    bswapq %rdx618; X64-NEXT:    xorl %eax, %eax619; X64-NEXT:    cmpq %rdx, %rcx620; X64-NEXT:    je .LBB36_3621; X64-NEXT:  .LBB36_2: # %res_block622; X64-NEXT:    xorl %eax, %eax623; X64-NEXT:    cmpq %rdx, %rcx624; X64-NEXT:    setae %al625; X64-NEXT:    leal -1(%rax,%rax), %eax626; X64-NEXT:  .LBB36_3: # %endblock627; X64-NEXT:    retq628  %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 15) nounwind629  ret i32 %m630}631 632define i1 @length15_lt(ptr %X, ptr %Y) nounwind {633; X64-LABEL: length15_lt:634; X64:       # %bb.0:635; X64-NEXT:    movq (%rdi), %rcx636; X64-NEXT:    movq (%rsi), %rdx637; X64-NEXT:    bswapq %rcx638; X64-NEXT:    bswapq %rdx639; X64-NEXT:    cmpq %rdx, %rcx640; X64-NEXT:    jne .LBB37_2641; X64-NEXT:  # %bb.1: # %loadbb1642; X64-NEXT:    movq 7(%rdi), %rcx643; X64-NEXT:    movq 7(%rsi), %rdx644; X64-NEXT:    bswapq %rcx645; X64-NEXT:    bswapq %rdx646; X64-NEXT:    xorl %eax, %eax647; X64-NEXT:    cmpq %rdx, %rcx648; X64-NEXT:    je .LBB37_3649; X64-NEXT:  .LBB37_2: # %res_block650; X64-NEXT:    xorl %eax, %eax651; X64-NEXT:    cmpq %rdx, %rcx652; X64-NEXT:    setae %al653; X64-NEXT:    leal -1(%rax,%rax), %eax654; X64-NEXT:  .LBB37_3: # %endblock655; X64-NEXT:    shrl $31, %eax656; X64-NEXT:    # kill: def $al killed $al killed $eax657; X64-NEXT:    retq658  %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 15) nounwind659  %c = icmp slt i32 %m, 0660  ret i1 %c661}662 663define i32 @length15_const(ptr %X, ptr %Y) nounwind {664; X64-LABEL: length15_const:665; X64:       # %bb.0:666; X64-NEXT:    movabsq $3544952156018063160, %rcx # imm = 0x3132333435363738667; X64-NEXT:    movq (%rdi), %rdx668; X64-NEXT:    bswapq %rdx669; X64-NEXT:    cmpq %rcx, %rdx670; X64-NEXT:    jne .LBB38_2671; X64-NEXT:  # %bb.1: # %loadbb1672; X64-NEXT:    movabsq $4051322327650219061, %rcx # imm = 0x3839303132333435673; X64-NEXT:    movq 7(%rdi), %rdx674; X64-NEXT:    bswapq %rdx675; X64-NEXT:    xorl %eax, %eax676; X64-NEXT:    cmpq %rcx, %rdx677; X64-NEXT:    je .LBB38_3678; X64-NEXT:  .LBB38_2: # %res_block679; X64-NEXT:    xorl %eax, %eax680; X64-NEXT:    cmpq %rcx, %rdx681; X64-NEXT:    setae %al682; X64-NEXT:    leal -1(%rax,%rax), %eax683; X64-NEXT:  .LBB38_3: # %endblock684; X64-NEXT:    retq685  %m = tail call i32 @memcmp(ptr %X, ptr getelementptr inbounds ([513 x i8], ptr @.str, i32 0, i32 1), i64 15) nounwind686  ret i32 %m687}688 689define i1 @length15_eq(ptr %X, ptr %Y) nounwind {690; X64-LABEL: length15_eq:691; X64:       # %bb.0:692; X64-NEXT:    movq (%rdi), %rax693; X64-NEXT:    movq 7(%rdi), %rcx694; X64-NEXT:    xorq (%rsi), %rax695; X64-NEXT:    xorq 7(%rsi), %rcx696; X64-NEXT:    orq %rax, %rcx697; X64-NEXT:    sete %al698; X64-NEXT:    retq699  %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 15) nounwind700  %c = icmp eq i32 %m, 0701  ret i1 %c702}703 704define i1 @length15_gt_const(ptr %X, ptr %Y) nounwind {705; X64-LABEL: length15_gt_const:706; X64:       # %bb.0:707; X64-NEXT:    movabsq $3544952156018063160, %rax # imm = 0x3132333435363738708; X64-NEXT:    movq (%rdi), %rcx709; X64-NEXT:    bswapq %rcx710; X64-NEXT:    cmpq %rax, %rcx711; X64-NEXT:    jne .LBB40_2712; X64-NEXT:  # %bb.1: # %loadbb1713; X64-NEXT:    movabsq $4051322327650219061, %rax # imm = 0x3839303132333435714; X64-NEXT:    movq 7(%rdi), %rcx715; X64-NEXT:    bswapq %rcx716; X64-NEXT:    xorl %edx, %edx717; X64-NEXT:    cmpq %rax, %rcx718; X64-NEXT:    je .LBB40_3719; X64-NEXT:  .LBB40_2: # %res_block720; X64-NEXT:    xorl %edx, %edx721; X64-NEXT:    cmpq %rax, %rcx722; X64-NEXT:    setae %dl723; X64-NEXT:    leal -1(%rdx,%rdx), %edx724; X64-NEXT:  .LBB40_3: # %endblock725; X64-NEXT:    testl %edx, %edx726; X64-NEXT:    setg %al727; X64-NEXT:    retq728  %m = tail call i32 @memcmp(ptr %X, ptr getelementptr inbounds ([513 x i8], ptr @.str, i32 0, i32 1), i64 15) nounwind729  %c = icmp sgt i32 %m, 0730  ret i1 %c731}732 733; PR33329 - https://bugs.llvm.org/show_bug.cgi?id=33329734 735define i32 @length16(ptr %X, ptr %Y) nounwind {736; X64-LABEL: length16:737; X64:       # %bb.0:738; X64-NEXT:    movq (%rdi), %rcx739; X64-NEXT:    movq (%rsi), %rdx740; X64-NEXT:    bswapq %rcx741; X64-NEXT:    bswapq %rdx742; X64-NEXT:    cmpq %rdx, %rcx743; X64-NEXT:    jne .LBB41_2744; X64-NEXT:  # %bb.1: # %loadbb1745; X64-NEXT:    movq 8(%rdi), %rcx746; X64-NEXT:    movq 8(%rsi), %rdx747; X64-NEXT:    bswapq %rcx748; X64-NEXT:    bswapq %rdx749; X64-NEXT:    xorl %eax, %eax750; X64-NEXT:    cmpq %rdx, %rcx751; X64-NEXT:    je .LBB41_3752; X64-NEXT:  .LBB41_2: # %res_block753; X64-NEXT:    xorl %eax, %eax754; X64-NEXT:    cmpq %rdx, %rcx755; X64-NEXT:    setae %al756; X64-NEXT:    leal -1(%rax,%rax), %eax757; X64-NEXT:  .LBB41_3: # %endblock758; X64-NEXT:    retq759  %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 16) nounwind760  ret i32 %m761}762 763define i1 @length16_eq(ptr %x, ptr %y) nounwind {764; X64-SSE2-LABEL: length16_eq:765; X64-SSE2:       # %bb.0:766; X64-SSE2-NEXT:    movdqu (%rdi), %xmm0767; X64-SSE2-NEXT:    movdqu (%rsi), %xmm1768; X64-SSE2-NEXT:    pcmpeqb %xmm0, %xmm1769; X64-SSE2-NEXT:    pmovmskb %xmm1, %eax770; X64-SSE2-NEXT:    cmpl $65535, %eax # imm = 0xFFFF771; X64-SSE2-NEXT:    setne %al772; X64-SSE2-NEXT:    retq773;774; X64-SSE41-LABEL: length16_eq:775; X64-SSE41:       # %bb.0:776; X64-SSE41-NEXT:    movdqu (%rdi), %xmm0777; X64-SSE41-NEXT:    movdqu (%rsi), %xmm1778; X64-SSE41-NEXT:    pxor %xmm0, %xmm1779; X64-SSE41-NEXT:    ptest %xmm1, %xmm1780; X64-SSE41-NEXT:    setne %al781; X64-SSE41-NEXT:    retq782;783; X64-AVX-LABEL: length16_eq:784; X64-AVX:       # %bb.0:785; X64-AVX-NEXT:    vmovdqu (%rdi), %xmm0786; X64-AVX-NEXT:    vpxor (%rsi), %xmm0, %xmm0787; X64-AVX-NEXT:    vptest %xmm0, %xmm0788; X64-AVX-NEXT:    setne %al789; X64-AVX-NEXT:    retq790;791; X64-MIC-AVX-LABEL: length16_eq:792; X64-MIC-AVX:       # %bb.0:793; X64-MIC-AVX-NEXT:    vmovdqu (%rdi), %xmm0794; X64-MIC-AVX-NEXT:    vmovdqu (%rsi), %xmm1795; X64-MIC-AVX-NEXT:    vpcmpneqd %zmm1, %zmm0, %k0796; X64-MIC-AVX-NEXT:    kortestw %k0, %k0797; X64-MIC-AVX-NEXT:    setne %al798; X64-MIC-AVX-NEXT:    vzeroupper799; X64-MIC-AVX-NEXT:    retq800  %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 16) nounwind801  %cmp = icmp ne i32 %call, 0802  ret i1 %cmp803}804 805define i1 @length16_lt(ptr %x, ptr %y) nounwind {806; X64-LABEL: length16_lt:807; X64:       # %bb.0:808; X64-NEXT:    movq (%rdi), %rcx809; X64-NEXT:    movq (%rsi), %rdx810; X64-NEXT:    bswapq %rcx811; X64-NEXT:    bswapq %rdx812; X64-NEXT:    cmpq %rdx, %rcx813; X64-NEXT:    jne .LBB43_2814; X64-NEXT:  # %bb.1: # %loadbb1815; X64-NEXT:    movq 8(%rdi), %rcx816; X64-NEXT:    movq 8(%rsi), %rdx817; X64-NEXT:    bswapq %rcx818; X64-NEXT:    bswapq %rdx819; X64-NEXT:    xorl %eax, %eax820; X64-NEXT:    cmpq %rdx, %rcx821; X64-NEXT:    je .LBB43_3822; X64-NEXT:  .LBB43_2: # %res_block823; X64-NEXT:    xorl %eax, %eax824; X64-NEXT:    cmpq %rdx, %rcx825; X64-NEXT:    setae %al826; X64-NEXT:    leal -1(%rax,%rax), %eax827; X64-NEXT:  .LBB43_3: # %endblock828; X64-NEXT:    shrl $31, %eax829; X64-NEXT:    # kill: def $al killed $al killed $eax830; X64-NEXT:    retq831  %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 16) nounwind832  %cmp = icmp slt i32 %call, 0833  ret i1 %cmp834}835 836define i1 @length16_gt(ptr %x, ptr %y) nounwind {837; X64-LABEL: length16_gt:838; X64:       # %bb.0:839; X64-NEXT:    movq (%rdi), %rax840; X64-NEXT:    movq (%rsi), %rcx841; X64-NEXT:    bswapq %rax842; X64-NEXT:    bswapq %rcx843; X64-NEXT:    cmpq %rcx, %rax844; X64-NEXT:    jne .LBB44_2845; X64-NEXT:  # %bb.1: # %loadbb1846; X64-NEXT:    movq 8(%rdi), %rax847; X64-NEXT:    movq 8(%rsi), %rcx848; X64-NEXT:    bswapq %rax849; X64-NEXT:    bswapq %rcx850; X64-NEXT:    xorl %edx, %edx851; X64-NEXT:    cmpq %rcx, %rax852; X64-NEXT:    je .LBB44_3853; X64-NEXT:  .LBB44_2: # %res_block854; X64-NEXT:    xorl %edx, %edx855; X64-NEXT:    cmpq %rcx, %rax856; X64-NEXT:    setae %dl857; X64-NEXT:    leal -1(%rdx,%rdx), %edx858; X64-NEXT:  .LBB44_3: # %endblock859; X64-NEXT:    testl %edx, %edx860; X64-NEXT:    setg %al861; X64-NEXT:    retq862  %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 16) nounwind863  %cmp = icmp sgt i32 %call, 0864  ret i1 %cmp865}866 867define i1 @length16_eq_const(ptr %X) nounwind {868; X64-SSE2-LABEL: length16_eq_const:869; X64-SSE2:       # %bb.0:870; X64-SSE2-NEXT:    movdqu (%rdi), %xmm0871; X64-SSE2-NEXT:    pcmpeqb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0872; X64-SSE2-NEXT:    pmovmskb %xmm0, %eax873; X64-SSE2-NEXT:    cmpl $65535, %eax # imm = 0xFFFF874; X64-SSE2-NEXT:    sete %al875; X64-SSE2-NEXT:    retq876;877; X64-SSE41-LABEL: length16_eq_const:878; X64-SSE41:       # %bb.0:879; X64-SSE41-NEXT:    movdqu (%rdi), %xmm0880; X64-SSE41-NEXT:    pxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0881; X64-SSE41-NEXT:    ptest %xmm0, %xmm0882; X64-SSE41-NEXT:    sete %al883; X64-SSE41-NEXT:    retq884;885; X64-AVX-LABEL: length16_eq_const:886; X64-AVX:       # %bb.0:887; X64-AVX-NEXT:    vmovdqu (%rdi), %xmm0888; X64-AVX-NEXT:    vpxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0889; X64-AVX-NEXT:    vptest %xmm0, %xmm0890; X64-AVX-NEXT:    sete %al891; X64-AVX-NEXT:    retq892;893; X64-MIC-AVX-LABEL: length16_eq_const:894; X64-MIC-AVX:       # %bb.0:895; X64-MIC-AVX-NEXT:    vmovdqu (%rdi), %xmm0896; X64-MIC-AVX-NEXT:    vmovdqa {{.*#+}} xmm1 = [858927408,926299444,825243960,892613426]897; X64-MIC-AVX-NEXT:    vpcmpneqd %zmm1, %zmm0, %k0898; X64-MIC-AVX-NEXT:    kortestw %k0, %k0899; X64-MIC-AVX-NEXT:    sete %al900; X64-MIC-AVX-NEXT:    vzeroupper901; X64-MIC-AVX-NEXT:    retq902  %m = tail call i32 @memcmp(ptr %X, ptr @.str, i64 16) nounwind903  %c = icmp eq i32 %m, 0904  ret i1 %c905}906 907; PR33914 - https://bugs.llvm.org/show_bug.cgi?id=33914908 909define i32 @length24(ptr %X, ptr %Y) nounwind {910; X64-LABEL: length24:911; X64:       # %bb.0:912; X64-NEXT:    movl $24, %edx913; X64-NEXT:    jmp memcmp # TAILCALL914  %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 24) nounwind915  ret i32 %m916}917 918define i1 @length24_eq(ptr %x, ptr %y) nounwind {919; X64-SSE2-LABEL: length24_eq:920; X64-SSE2:       # %bb.0:921; X64-SSE2-NEXT:    movdqu (%rdi), %xmm0922; X64-SSE2-NEXT:    movdqu (%rsi), %xmm1923; X64-SSE2-NEXT:    pcmpeqb %xmm0, %xmm1924; X64-SSE2-NEXT:    movq {{.*#+}} xmm0 = mem[0],zero925; X64-SSE2-NEXT:    movq {{.*#+}} xmm2 = mem[0],zero926; X64-SSE2-NEXT:    pcmpeqb %xmm0, %xmm2927; X64-SSE2-NEXT:    pand %xmm1, %xmm2928; X64-SSE2-NEXT:    pmovmskb %xmm2, %eax929; X64-SSE2-NEXT:    cmpl $65535, %eax # imm = 0xFFFF930; X64-SSE2-NEXT:    sete %al931; X64-SSE2-NEXT:    retq932;933; X64-SSE41-LABEL: length24_eq:934; X64-SSE41:       # %bb.0:935; X64-SSE41-NEXT:    movdqu (%rdi), %xmm0936; X64-SSE41-NEXT:    movdqu (%rsi), %xmm1937; X64-SSE41-NEXT:    pxor %xmm0, %xmm1938; X64-SSE41-NEXT:    movq {{.*#+}} xmm0 = mem[0],zero939; X64-SSE41-NEXT:    movq {{.*#+}} xmm2 = mem[0],zero940; X64-SSE41-NEXT:    pxor %xmm0, %xmm2941; X64-SSE41-NEXT:    por %xmm1, %xmm2942; X64-SSE41-NEXT:    ptest %xmm2, %xmm2943; X64-SSE41-NEXT:    sete %al944; X64-SSE41-NEXT:    retq945;946; X64-AVX-LABEL: length24_eq:947; X64-AVX:       # %bb.0:948; X64-AVX-NEXT:    vmovdqu (%rdi), %xmm0949; X64-AVX-NEXT:    vmovq {{.*#+}} xmm1 = mem[0],zero950; X64-AVX-NEXT:    vmovq {{.*#+}} xmm2 = mem[0],zero951; X64-AVX-NEXT:    vpxor %xmm2, %xmm1, %xmm1952; X64-AVX-NEXT:    vpxor (%rsi), %xmm0, %xmm0953; X64-AVX-NEXT:    vpor %xmm0, %xmm1, %xmm0954; X64-AVX-NEXT:    vptest %xmm0, %xmm0955; X64-AVX-NEXT:    sete %al956; X64-AVX-NEXT:    retq957;958; X64-MIC-AVX-LABEL: length24_eq:959; X64-MIC-AVX:       # %bb.0:960; X64-MIC-AVX-NEXT:    vmovdqu (%rdi), %xmm0961; X64-MIC-AVX-NEXT:    vmovdqu (%rsi), %xmm1962; X64-MIC-AVX-NEXT:    vmovq {{.*#+}} xmm2 = mem[0],zero963; X64-MIC-AVX-NEXT:    vmovq {{.*#+}} xmm3 = mem[0],zero964; X64-MIC-AVX-NEXT:    vpcmpneqd %zmm3, %zmm2, %k0965; X64-MIC-AVX-NEXT:    vpcmpneqd %zmm1, %zmm0, %k1966; X64-MIC-AVX-NEXT:    kortestw %k0, %k1967; X64-MIC-AVX-NEXT:    sete %al968; X64-MIC-AVX-NEXT:    vzeroupper969; X64-MIC-AVX-NEXT:    retq970  %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 24) nounwind971  %cmp = icmp eq i32 %call, 0972  ret i1 %cmp973}974 975define i1 @length24_lt(ptr %x, ptr %y) nounwind {976; X64-LABEL: length24_lt:977; X64:       # %bb.0:978; X64-NEXT:    pushq %rax979; X64-NEXT:    movl $24, %edx980; X64-NEXT:    callq memcmp981; X64-NEXT:    shrl $31, %eax982; X64-NEXT:    # kill: def $al killed $al killed $eax983; X64-NEXT:    popq %rcx984; X64-NEXT:    retq985  %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 24) nounwind986  %cmp = icmp slt i32 %call, 0987  ret i1 %cmp988}989 990define i1 @length24_gt(ptr %x, ptr %y) nounwind {991; X64-LABEL: length24_gt:992; X64:       # %bb.0:993; X64-NEXT:    pushq %rax994; X64-NEXT:    movl $24, %edx995; X64-NEXT:    callq memcmp996; X64-NEXT:    testl %eax, %eax997; X64-NEXT:    setg %al998; X64-NEXT:    popq %rcx999; X64-NEXT:    retq1000  %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 24) nounwind1001  %cmp = icmp sgt i32 %call, 01002  ret i1 %cmp1003}1004 1005define i1 @length24_eq_const(ptr %X) nounwind {1006; X64-SSE2-LABEL: length24_eq_const:1007; X64-SSE2:       # %bb.0:1008; X64-SSE2-NEXT:    movdqu (%rdi), %xmm01009; X64-SSE2-NEXT:    movq {{.*#+}} xmm1 = mem[0],zero1010; X64-SSE2-NEXT:    pcmpeqb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm11011; X64-SSE2-NEXT:    pcmpeqb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm01012; X64-SSE2-NEXT:    pand %xmm1, %xmm01013; X64-SSE2-NEXT:    pmovmskb %xmm0, %eax1014; X64-SSE2-NEXT:    cmpl $65535, %eax # imm = 0xFFFF1015; X64-SSE2-NEXT:    setne %al1016; X64-SSE2-NEXT:    retq1017;1018; X64-SSE41-LABEL: length24_eq_const:1019; X64-SSE41:       # %bb.0:1020; X64-SSE41-NEXT:    movdqu (%rdi), %xmm01021; X64-SSE41-NEXT:    movq {{.*#+}} xmm1 = mem[0],zero1022; X64-SSE41-NEXT:    pxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm11023; X64-SSE41-NEXT:    pxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm01024; X64-SSE41-NEXT:    por %xmm1, %xmm01025; X64-SSE41-NEXT:    ptest %xmm0, %xmm01026; X64-SSE41-NEXT:    setne %al1027; X64-SSE41-NEXT:    retq1028;1029; X64-AVX-LABEL: length24_eq_const:1030; X64-AVX:       # %bb.0:1031; X64-AVX-NEXT:    vmovdqu (%rdi), %xmm01032; X64-AVX-NEXT:    vmovq {{.*#+}} xmm1 = mem[0],zero1033; X64-AVX-NEXT:    vpxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm11034; X64-AVX-NEXT:    vpxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm01035; X64-AVX-NEXT:    vpor %xmm1, %xmm0, %xmm01036; X64-AVX-NEXT:    vptest %xmm0, %xmm01037; X64-AVX-NEXT:    setne %al1038; X64-AVX-NEXT:    retq1039;1040; X64-MIC-AVX-LABEL: length24_eq_const:1041; X64-MIC-AVX:       # %bb.0:1042; X64-MIC-AVX-NEXT:    vmovdqu (%rdi), %xmm01043; X64-MIC-AVX-NEXT:    vmovq {{.*#+}} xmm1 = mem[0],zero1044; X64-MIC-AVX-NEXT:    vmovq {{.*#+}} xmm2 = [959985462,858927408,0,0]1045; X64-MIC-AVX-NEXT:    vpcmpneqd %zmm2, %zmm1, %k01046; X64-MIC-AVX-NEXT:    vmovdqa {{.*#+}} xmm1 = [858927408,926299444,825243960,892613426]1047; X64-MIC-AVX-NEXT:    vpcmpneqd %zmm1, %zmm0, %k11048; X64-MIC-AVX-NEXT:    kortestw %k0, %k11049; X64-MIC-AVX-NEXT:    setne %al1050; X64-MIC-AVX-NEXT:    vzeroupper1051; X64-MIC-AVX-NEXT:    retq1052  %m = tail call i32 @memcmp(ptr %X, ptr @.str, i64 24) nounwind1053  %c = icmp ne i32 %m, 01054  ret i1 %c1055}1056 1057define i32 @length31(ptr %X, ptr %Y) nounwind {1058; X64-LABEL: length31:1059; X64:       # %bb.0:1060; X64-NEXT:    movl $31, %edx1061; X64-NEXT:    jmp memcmp # TAILCALL1062  %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 31) nounwind1063  ret i32 %m1064}1065 1066define i1 @length31_eq(ptr %x, ptr %y) nounwind {1067; X64-SSE2-LABEL: length31_eq:1068; X64-SSE2:       # %bb.0:1069; X64-SSE2-NEXT:    movdqu (%rdi), %xmm01070; X64-SSE2-NEXT:    movdqu 15(%rdi), %xmm11071; X64-SSE2-NEXT:    movdqu (%rsi), %xmm21072; X64-SSE2-NEXT:    pcmpeqb %xmm0, %xmm21073; X64-SSE2-NEXT:    movdqu 15(%rsi), %xmm01074; X64-SSE2-NEXT:    pcmpeqb %xmm1, %xmm01075; X64-SSE2-NEXT:    pand %xmm2, %xmm01076; X64-SSE2-NEXT:    pmovmskb %xmm0, %eax1077; X64-SSE2-NEXT:    cmpl $65535, %eax # imm = 0xFFFF1078; X64-SSE2-NEXT:    sete %al1079; X64-SSE2-NEXT:    retq1080;1081; X64-SSE41-LABEL: length31_eq:1082; X64-SSE41:       # %bb.0:1083; X64-SSE41-NEXT:    movdqu (%rdi), %xmm01084; X64-SSE41-NEXT:    movdqu 15(%rdi), %xmm11085; X64-SSE41-NEXT:    movdqu (%rsi), %xmm21086; X64-SSE41-NEXT:    pxor %xmm0, %xmm21087; X64-SSE41-NEXT:    movdqu 15(%rsi), %xmm01088; X64-SSE41-NEXT:    pxor %xmm1, %xmm01089; X64-SSE41-NEXT:    por %xmm2, %xmm01090; X64-SSE41-NEXT:    ptest %xmm0, %xmm01091; X64-SSE41-NEXT:    sete %al1092; X64-SSE41-NEXT:    retq1093;1094; X64-AVX-LABEL: length31_eq:1095; X64-AVX:       # %bb.0:1096; X64-AVX-NEXT:    vmovdqu (%rdi), %xmm01097; X64-AVX-NEXT:    vmovdqu 15(%rdi), %xmm11098; X64-AVX-NEXT:    vpxor 15(%rsi), %xmm1, %xmm11099; X64-AVX-NEXT:    vpxor (%rsi), %xmm0, %xmm01100; X64-AVX-NEXT:    vpor %xmm1, %xmm0, %xmm01101; X64-AVX-NEXT:    vptest %xmm0, %xmm01102; X64-AVX-NEXT:    sete %al1103; X64-AVX-NEXT:    retq1104;1105; X64-MIC-AVX-LABEL: length31_eq:1106; X64-MIC-AVX:       # %bb.0:1107; X64-MIC-AVX-NEXT:    vmovdqu (%rdi), %xmm01108; X64-MIC-AVX-NEXT:    vmovdqu 15(%rdi), %xmm11109; X64-MIC-AVX-NEXT:    vmovdqu (%rsi), %xmm21110; X64-MIC-AVX-NEXT:    vmovdqu 15(%rsi), %xmm31111; X64-MIC-AVX-NEXT:    vpcmpneqd %zmm3, %zmm1, %k01112; X64-MIC-AVX-NEXT:    vpcmpneqd %zmm2, %zmm0, %k11113; X64-MIC-AVX-NEXT:    kortestw %k0, %k11114; X64-MIC-AVX-NEXT:    sete %al1115; X64-MIC-AVX-NEXT:    vzeroupper1116; X64-MIC-AVX-NEXT:    retq1117  %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 31) nounwind1118  %cmp = icmp eq i32 %call, 01119  ret i1 %cmp1120}1121 1122define i1 @length31_lt(ptr %x, ptr %y) nounwind {1123; X64-LABEL: length31_lt:1124; X64:       # %bb.0:1125; X64-NEXT:    pushq %rax1126; X64-NEXT:    movl $31, %edx1127; X64-NEXT:    callq memcmp1128; X64-NEXT:    shrl $31, %eax1129; X64-NEXT:    # kill: def $al killed $al killed $eax1130; X64-NEXT:    popq %rcx1131; X64-NEXT:    retq1132  %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 31) nounwind1133  %cmp = icmp slt i32 %call, 01134  ret i1 %cmp1135}1136 1137define i1 @length31_gt(ptr %x, ptr %y) nounwind {1138; X64-LABEL: length31_gt:1139; X64:       # %bb.0:1140; X64-NEXT:    pushq %rax1141; X64-NEXT:    movl $31, %edx1142; X64-NEXT:    callq memcmp1143; X64-NEXT:    testl %eax, %eax1144; X64-NEXT:    setg %al1145; X64-NEXT:    popq %rcx1146; X64-NEXT:    retq1147  %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 31) nounwind1148  %cmp = icmp sgt i32 %call, 01149  ret i1 %cmp1150}1151 1152define i1 @length31_eq_prefer128(ptr %x, ptr %y) nounwind "prefer-vector-width"="128" {1153; X64-SSE2-LABEL: length31_eq_prefer128:1154; X64-SSE2:       # %bb.0:1155; X64-SSE2-NEXT:    movdqu (%rdi), %xmm01156; X64-SSE2-NEXT:    movdqu 15(%rdi), %xmm11157; X64-SSE2-NEXT:    movdqu (%rsi), %xmm21158; X64-SSE2-NEXT:    pcmpeqb %xmm0, %xmm21159; X64-SSE2-NEXT:    movdqu 15(%rsi), %xmm01160; X64-SSE2-NEXT:    pcmpeqb %xmm1, %xmm01161; X64-SSE2-NEXT:    pand %xmm2, %xmm01162; X64-SSE2-NEXT:    pmovmskb %xmm0, %eax1163; X64-SSE2-NEXT:    cmpl $65535, %eax # imm = 0xFFFF1164; X64-SSE2-NEXT:    sete %al1165; X64-SSE2-NEXT:    retq1166;1167; X64-SSE41-LABEL: length31_eq_prefer128:1168; X64-SSE41:       # %bb.0:1169; X64-SSE41-NEXT:    movdqu (%rdi), %xmm01170; X64-SSE41-NEXT:    movdqu 15(%rdi), %xmm11171; X64-SSE41-NEXT:    movdqu (%rsi), %xmm21172; X64-SSE41-NEXT:    pxor %xmm0, %xmm21173; X64-SSE41-NEXT:    movdqu 15(%rsi), %xmm01174; X64-SSE41-NEXT:    pxor %xmm1, %xmm01175; X64-SSE41-NEXT:    por %xmm2, %xmm01176; X64-SSE41-NEXT:    ptest %xmm0, %xmm01177; X64-SSE41-NEXT:    sete %al1178; X64-SSE41-NEXT:    retq1179;1180; X64-AVX-LABEL: length31_eq_prefer128:1181; X64-AVX:       # %bb.0:1182; X64-AVX-NEXT:    vmovdqu (%rdi), %xmm01183; X64-AVX-NEXT:    vmovdqu 15(%rdi), %xmm11184; X64-AVX-NEXT:    vpxor 15(%rsi), %xmm1, %xmm11185; X64-AVX-NEXT:    vpxor (%rsi), %xmm0, %xmm01186; X64-AVX-NEXT:    vpor %xmm1, %xmm0, %xmm01187; X64-AVX-NEXT:    vptest %xmm0, %xmm01188; X64-AVX-NEXT:    sete %al1189; X64-AVX-NEXT:    retq1190;1191; X64-MIC-AVX-LABEL: length31_eq_prefer128:1192; X64-MIC-AVX:       # %bb.0:1193; X64-MIC-AVX-NEXT:    vmovdqu (%rdi), %xmm01194; X64-MIC-AVX-NEXT:    vmovdqu 15(%rdi), %xmm11195; X64-MIC-AVX-NEXT:    vmovdqu (%rsi), %xmm21196; X64-MIC-AVX-NEXT:    vmovdqu 15(%rsi), %xmm31197; X64-MIC-AVX-NEXT:    vpcmpneqd %zmm3, %zmm1, %k01198; X64-MIC-AVX-NEXT:    vpcmpneqd %zmm2, %zmm0, %k11199; X64-MIC-AVX-NEXT:    kortestw %k0, %k11200; X64-MIC-AVX-NEXT:    sete %al1201; X64-MIC-AVX-NEXT:    vzeroupper1202; X64-MIC-AVX-NEXT:    retq1203  %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 31) nounwind1204  %cmp = icmp eq i32 %call, 01205  ret i1 %cmp1206}1207 1208define i1 @length31_eq_const(ptr %X) nounwind {1209; X64-SSE2-LABEL: length31_eq_const:1210; X64-SSE2:       # %bb.0:1211; X64-SSE2-NEXT:    movdqu (%rdi), %xmm01212; X64-SSE2-NEXT:    movdqu 15(%rdi), %xmm11213; X64-SSE2-NEXT:    pcmpeqb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm11214; X64-SSE2-NEXT:    pcmpeqb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm01215; X64-SSE2-NEXT:    pand %xmm1, %xmm01216; X64-SSE2-NEXT:    pmovmskb %xmm0, %eax1217; X64-SSE2-NEXT:    cmpl $65535, %eax # imm = 0xFFFF1218; X64-SSE2-NEXT:    setne %al1219; X64-SSE2-NEXT:    retq1220;1221; X64-SSE41-LABEL: length31_eq_const:1222; X64-SSE41:       # %bb.0:1223; X64-SSE41-NEXT:    movdqu (%rdi), %xmm01224; X64-SSE41-NEXT:    movdqu 15(%rdi), %xmm11225; X64-SSE41-NEXT:    pxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm11226; X64-SSE41-NEXT:    pxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm01227; X64-SSE41-NEXT:    por %xmm1, %xmm01228; X64-SSE41-NEXT:    ptest %xmm0, %xmm01229; X64-SSE41-NEXT:    setne %al1230; X64-SSE41-NEXT:    retq1231;1232; X64-AVX-LABEL: length31_eq_const:1233; X64-AVX:       # %bb.0:1234; X64-AVX-NEXT:    vmovdqu (%rdi), %xmm01235; X64-AVX-NEXT:    vmovdqu 15(%rdi), %xmm11236; X64-AVX-NEXT:    vpxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm11237; X64-AVX-NEXT:    vpxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm01238; X64-AVX-NEXT:    vpor %xmm1, %xmm0, %xmm01239; X64-AVX-NEXT:    vptest %xmm0, %xmm01240; X64-AVX-NEXT:    setne %al1241; X64-AVX-NEXT:    retq1242;1243; X64-MIC-AVX-LABEL: length31_eq_const:1244; X64-MIC-AVX:       # %bb.0:1245; X64-MIC-AVX-NEXT:    vmovdqu (%rdi), %xmm01246; X64-MIC-AVX-NEXT:    vmovdqu 15(%rdi), %xmm11247; X64-MIC-AVX-NEXT:    vmovdqa {{.*#+}} xmm2 = [943142453,842084409,909456435,809056311]1248; X64-MIC-AVX-NEXT:    vpcmpneqd %zmm2, %zmm1, %k01249; X64-MIC-AVX-NEXT:    vmovdqa {{.*#+}} xmm1 = [858927408,926299444,825243960,892613426]1250; X64-MIC-AVX-NEXT:    vpcmpneqd %zmm1, %zmm0, %k11251; X64-MIC-AVX-NEXT:    kortestw %k0, %k11252; X64-MIC-AVX-NEXT:    setne %al1253; X64-MIC-AVX-NEXT:    vzeroupper1254; X64-MIC-AVX-NEXT:    retq1255  %m = tail call i32 @memcmp(ptr %X, ptr @.str, i64 31) nounwind1256  %c = icmp ne i32 %m, 01257  ret i1 %c1258}1259 1260define i32 @length32(ptr %X, ptr %Y) nounwind {1261; X64-LABEL: length32:1262; X64:       # %bb.0:1263; X64-NEXT:    movl $32, %edx1264; X64-NEXT:    jmp memcmp # TAILCALL1265  %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 32) nounwind1266  ret i32 %m1267}1268 1269; PR33325 - https://bugs.llvm.org/show_bug.cgi?id=333251270 1271define i1 @length32_eq(ptr %x, ptr %y) nounwind {1272; X64-SSE2-LABEL: length32_eq:1273; X64-SSE2:       # %bb.0:1274; X64-SSE2-NEXT:    movdqu (%rdi), %xmm01275; X64-SSE2-NEXT:    movdqu 16(%rdi), %xmm11276; X64-SSE2-NEXT:    movdqu (%rsi), %xmm21277; X64-SSE2-NEXT:    pcmpeqb %xmm0, %xmm21278; X64-SSE2-NEXT:    movdqu 16(%rsi), %xmm01279; X64-SSE2-NEXT:    pcmpeqb %xmm1, %xmm01280; X64-SSE2-NEXT:    pand %xmm2, %xmm01281; X64-SSE2-NEXT:    pmovmskb %xmm0, %eax1282; X64-SSE2-NEXT:    cmpl $65535, %eax # imm = 0xFFFF1283; X64-SSE2-NEXT:    sete %al1284; X64-SSE2-NEXT:    retq1285;1286; X64-SSE41-LABEL: length32_eq:1287; X64-SSE41:       # %bb.0:1288; X64-SSE41-NEXT:    movdqu (%rdi), %xmm01289; X64-SSE41-NEXT:    movdqu 16(%rdi), %xmm11290; X64-SSE41-NEXT:    movdqu (%rsi), %xmm21291; X64-SSE41-NEXT:    pxor %xmm0, %xmm21292; X64-SSE41-NEXT:    movdqu 16(%rsi), %xmm01293; X64-SSE41-NEXT:    pxor %xmm1, %xmm01294; X64-SSE41-NEXT:    por %xmm2, %xmm01295; X64-SSE41-NEXT:    ptest %xmm0, %xmm01296; X64-SSE41-NEXT:    sete %al1297; X64-SSE41-NEXT:    retq1298;1299; X64-AVX1-LABEL: length32_eq:1300; X64-AVX1:       # %bb.0:1301; X64-AVX1-NEXT:    vmovups (%rdi), %ymm01302; X64-AVX1-NEXT:    vxorps (%rsi), %ymm0, %ymm01303; X64-AVX1-NEXT:    vptest %ymm0, %ymm01304; X64-AVX1-NEXT:    sete %al1305; X64-AVX1-NEXT:    vzeroupper1306; X64-AVX1-NEXT:    retq1307;1308; X64-AVX2-LABEL: length32_eq:1309; X64-AVX2:       # %bb.0:1310; X64-AVX2-NEXT:    vmovdqu (%rdi), %ymm01311; X64-AVX2-NEXT:    vpxor (%rsi), %ymm0, %ymm01312; X64-AVX2-NEXT:    vptest %ymm0, %ymm01313; X64-AVX2-NEXT:    sete %al1314; X64-AVX2-NEXT:    vzeroupper1315; X64-AVX2-NEXT:    retq1316;1317; X64-AVX512-LABEL: length32_eq:1318; X64-AVX512:       # %bb.0:1319; X64-AVX512-NEXT:    vmovdqu (%rdi), %ymm01320; X64-AVX512-NEXT:    vpxor (%rsi), %ymm0, %ymm01321; X64-AVX512-NEXT:    vptest %ymm0, %ymm01322; X64-AVX512-NEXT:    sete %al1323; X64-AVX512-NEXT:    vzeroupper1324; X64-AVX512-NEXT:    retq1325;1326; X64-MIC-AVX-LABEL: length32_eq:1327; X64-MIC-AVX:       # %bb.0:1328; X64-MIC-AVX-NEXT:    vmovdqu (%rdi), %ymm01329; X64-MIC-AVX-NEXT:    vmovdqu (%rsi), %ymm11330; X64-MIC-AVX-NEXT:    vpcmpneqd %zmm1, %zmm0, %k01331; X64-MIC-AVX-NEXT:    kortestw %k0, %k01332; X64-MIC-AVX-NEXT:    sete %al1333; X64-MIC-AVX-NEXT:    vzeroupper1334; X64-MIC-AVX-NEXT:    retq1335  %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 32) nounwind1336  %cmp = icmp eq i32 %call, 01337  ret i1 %cmp1338}1339 1340define i1 @length32_lt(ptr %x, ptr %y) nounwind {1341; X64-LABEL: length32_lt:1342; X64:       # %bb.0:1343; X64-NEXT:    pushq %rax1344; X64-NEXT:    movl $32, %edx1345; X64-NEXT:    callq memcmp1346; X64-NEXT:    shrl $31, %eax1347; X64-NEXT:    # kill: def $al killed $al killed $eax1348; X64-NEXT:    popq %rcx1349; X64-NEXT:    retq1350  %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 32) nounwind1351  %cmp = icmp slt i32 %call, 01352  ret i1 %cmp1353}1354 1355define i1 @length32_gt(ptr %x, ptr %y) nounwind {1356; X64-LABEL: length32_gt:1357; X64:       # %bb.0:1358; X64-NEXT:    pushq %rax1359; X64-NEXT:    movl $32, %edx1360; X64-NEXT:    callq memcmp1361; X64-NEXT:    testl %eax, %eax1362; X64-NEXT:    setg %al1363; X64-NEXT:    popq %rcx1364; X64-NEXT:    retq1365  %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 32) nounwind1366  %cmp = icmp sgt i32 %call, 01367  ret i1 %cmp1368}1369 1370define i1 @length32_eq_prefer128(ptr %x, ptr %y) nounwind "prefer-vector-width"="128" {1371; X64-SSE2-LABEL: length32_eq_prefer128:1372; X64-SSE2:       # %bb.0:1373; X64-SSE2-NEXT:    movdqu (%rdi), %xmm01374; X64-SSE2-NEXT:    movdqu 16(%rdi), %xmm11375; X64-SSE2-NEXT:    movdqu (%rsi), %xmm21376; X64-SSE2-NEXT:    pcmpeqb %xmm0, %xmm21377; X64-SSE2-NEXT:    movdqu 16(%rsi), %xmm01378; X64-SSE2-NEXT:    pcmpeqb %xmm1, %xmm01379; X64-SSE2-NEXT:    pand %xmm2, %xmm01380; X64-SSE2-NEXT:    pmovmskb %xmm0, %eax1381; X64-SSE2-NEXT:    cmpl $65535, %eax # imm = 0xFFFF1382; X64-SSE2-NEXT:    sete %al1383; X64-SSE2-NEXT:    retq1384;1385; X64-SSE41-LABEL: length32_eq_prefer128:1386; X64-SSE41:       # %bb.0:1387; X64-SSE41-NEXT:    movdqu (%rdi), %xmm01388; X64-SSE41-NEXT:    movdqu 16(%rdi), %xmm11389; X64-SSE41-NEXT:    movdqu (%rsi), %xmm21390; X64-SSE41-NEXT:    pxor %xmm0, %xmm21391; X64-SSE41-NEXT:    movdqu 16(%rsi), %xmm01392; X64-SSE41-NEXT:    pxor %xmm1, %xmm01393; X64-SSE41-NEXT:    por %xmm2, %xmm01394; X64-SSE41-NEXT:    ptest %xmm0, %xmm01395; X64-SSE41-NEXT:    sete %al1396; X64-SSE41-NEXT:    retq1397;1398; X64-AVX-LABEL: length32_eq_prefer128:1399; X64-AVX:       # %bb.0:1400; X64-AVX-NEXT:    vmovdqu (%rdi), %xmm01401; X64-AVX-NEXT:    vmovdqu 16(%rdi), %xmm11402; X64-AVX-NEXT:    vpxor 16(%rsi), %xmm1, %xmm11403; X64-AVX-NEXT:    vpxor (%rsi), %xmm0, %xmm01404; X64-AVX-NEXT:    vpor %xmm1, %xmm0, %xmm01405; X64-AVX-NEXT:    vptest %xmm0, %xmm01406; X64-AVX-NEXT:    sete %al1407; X64-AVX-NEXT:    retq1408;1409; X64-MIC-AVX-LABEL: length32_eq_prefer128:1410; X64-MIC-AVX:       # %bb.0:1411; X64-MIC-AVX-NEXT:    vmovdqu (%rdi), %xmm01412; X64-MIC-AVX-NEXT:    vmovdqu 16(%rdi), %xmm11413; X64-MIC-AVX-NEXT:    vmovdqu (%rsi), %xmm21414; X64-MIC-AVX-NEXT:    vmovdqu 16(%rsi), %xmm31415; X64-MIC-AVX-NEXT:    vpcmpneqd %zmm3, %zmm1, %k01416; X64-MIC-AVX-NEXT:    vpcmpneqd %zmm2, %zmm0, %k11417; X64-MIC-AVX-NEXT:    kortestw %k0, %k11418; X64-MIC-AVX-NEXT:    sete %al1419; X64-MIC-AVX-NEXT:    vzeroupper1420; X64-MIC-AVX-NEXT:    retq1421  %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 32) nounwind1422  %cmp = icmp eq i32 %call, 01423  ret i1 %cmp1424}1425 1426define i1 @length32_eq_const(ptr %X) nounwind {1427; X64-SSE2-LABEL: length32_eq_const:1428; X64-SSE2:       # %bb.0:1429; X64-SSE2-NEXT:    movdqu (%rdi), %xmm01430; X64-SSE2-NEXT:    movdqu 16(%rdi), %xmm11431; X64-SSE2-NEXT:    pcmpeqb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm11432; X64-SSE2-NEXT:    pcmpeqb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm01433; X64-SSE2-NEXT:    pand %xmm1, %xmm01434; X64-SSE2-NEXT:    pmovmskb %xmm0, %eax1435; X64-SSE2-NEXT:    cmpl $65535, %eax # imm = 0xFFFF1436; X64-SSE2-NEXT:    setne %al1437; X64-SSE2-NEXT:    retq1438;1439; X64-SSE41-LABEL: length32_eq_const:1440; X64-SSE41:       # %bb.0:1441; X64-SSE41-NEXT:    movdqu (%rdi), %xmm01442; X64-SSE41-NEXT:    movdqu 16(%rdi), %xmm11443; X64-SSE41-NEXT:    pxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm11444; X64-SSE41-NEXT:    pxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm01445; X64-SSE41-NEXT:    por %xmm1, %xmm01446; X64-SSE41-NEXT:    ptest %xmm0, %xmm01447; X64-SSE41-NEXT:    setne %al1448; X64-SSE41-NEXT:    retq1449;1450; X64-AVX1-LABEL: length32_eq_const:1451; X64-AVX1:       # %bb.0:1452; X64-AVX1-NEXT:    vmovups (%rdi), %ymm01453; X64-AVX1-NEXT:    vxorps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm01454; X64-AVX1-NEXT:    vptest %ymm0, %ymm01455; X64-AVX1-NEXT:    setne %al1456; X64-AVX1-NEXT:    vzeroupper1457; X64-AVX1-NEXT:    retq1458;1459; X64-AVX2-LABEL: length32_eq_const:1460; X64-AVX2:       # %bb.0:1461; X64-AVX2-NEXT:    vmovdqu (%rdi), %ymm01462; X64-AVX2-NEXT:    vpxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm01463; X64-AVX2-NEXT:    vptest %ymm0, %ymm01464; X64-AVX2-NEXT:    setne %al1465; X64-AVX2-NEXT:    vzeroupper1466; X64-AVX2-NEXT:    retq1467;1468; X64-AVX512-LABEL: length32_eq_const:1469; X64-AVX512:       # %bb.0:1470; X64-AVX512-NEXT:    vmovdqu (%rdi), %ymm01471; X64-AVX512-NEXT:    vpxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm01472; X64-AVX512-NEXT:    vptest %ymm0, %ymm01473; X64-AVX512-NEXT:    setne %al1474; X64-AVX512-NEXT:    vzeroupper1475; X64-AVX512-NEXT:    retq1476;1477; X64-MIC-AVX-LABEL: length32_eq_const:1478; X64-MIC-AVX:       # %bb.0:1479; X64-MIC-AVX-NEXT:    vmovdqu (%rdi), %ymm01480; X64-MIC-AVX-NEXT:    vmovdqa {{.*#+}} ymm1 = [858927408,926299444,825243960,892613426,959985462,858927408,926299444,825243960]1481; X64-MIC-AVX-NEXT:    vpcmpneqd %zmm1, %zmm0, %k01482; X64-MIC-AVX-NEXT:    kortestw %k0, %k01483; X64-MIC-AVX-NEXT:    setne %al1484; X64-MIC-AVX-NEXT:    vzeroupper1485; X64-MIC-AVX-NEXT:    retq1486  %m = tail call i32 @memcmp(ptr %X, ptr @.str, i64 32) nounwind1487  %c = icmp ne i32 %m, 01488  ret i1 %c1489}1490 1491define i32 @length48(ptr %X, ptr %Y) nounwind {1492; X64-LABEL: length48:1493; X64:       # %bb.0:1494; X64-NEXT:    movl $48, %edx1495; X64-NEXT:    jmp memcmp # TAILCALL1496  %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 48) nounwind1497  ret i32 %m1498}1499 1500define i1 @length48_eq(ptr %x, ptr %y) nounwind {1501; X64-SSE-LABEL: length48_eq:1502; X64-SSE:       # %bb.0:1503; X64-SSE-NEXT:    pushq %rax1504; X64-SSE-NEXT:    movl $48, %edx1505; X64-SSE-NEXT:    callq memcmp1506; X64-SSE-NEXT:    testl %eax, %eax1507; X64-SSE-NEXT:    sete %al1508; X64-SSE-NEXT:    popq %rcx1509; X64-SSE-NEXT:    retq1510;1511; X64-AVX1-LABEL: length48_eq:1512; X64-AVX1:       # %bb.0:1513; X64-AVX1-NEXT:    vmovups (%rdi), %ymm01514; X64-AVX1-NEXT:    vmovups 32(%rdi), %xmm11515; X64-AVX1-NEXT:    vmovups 32(%rsi), %xmm21516; X64-AVX1-NEXT:    vxorps (%rsi), %ymm0, %ymm01517; X64-AVX1-NEXT:    vxorps %ymm2, %ymm1, %ymm11518; X64-AVX1-NEXT:    vorps %ymm1, %ymm0, %ymm01519; X64-AVX1-NEXT:    vptest %ymm0, %ymm01520; X64-AVX1-NEXT:    sete %al1521; X64-AVX1-NEXT:    vzeroupper1522; X64-AVX1-NEXT:    retq1523;1524; X64-AVX2-LABEL: length48_eq:1525; X64-AVX2:       # %bb.0:1526; X64-AVX2-NEXT:    vmovdqu (%rdi), %ymm01527; X64-AVX2-NEXT:    vmovdqu 32(%rdi), %xmm11528; X64-AVX2-NEXT:    vmovdqu 32(%rsi), %xmm21529; X64-AVX2-NEXT:    vpxor (%rsi), %ymm0, %ymm01530; X64-AVX2-NEXT:    vpxor %ymm2, %ymm1, %ymm11531; X64-AVX2-NEXT:    vpor %ymm1, %ymm0, %ymm01532; X64-AVX2-NEXT:    vptest %ymm0, %ymm01533; X64-AVX2-NEXT:    sete %al1534; X64-AVX2-NEXT:    vzeroupper1535; X64-AVX2-NEXT:    retq1536;1537; X64-AVX512-LABEL: length48_eq:1538; X64-AVX512:       # %bb.0:1539; X64-AVX512-NEXT:    vmovdqu (%rdi), %ymm01540; X64-AVX512-NEXT:    vmovdqu 32(%rdi), %xmm11541; X64-AVX512-NEXT:    vmovdqu 32(%rsi), %xmm21542; X64-AVX512-NEXT:    vpxor (%rsi), %ymm0, %ymm01543; X64-AVX512-NEXT:    vpxor %ymm2, %ymm1, %ymm11544; X64-AVX512-NEXT:    vpor %ymm1, %ymm0, %ymm01545; X64-AVX512-NEXT:    vptest %ymm0, %ymm01546; X64-AVX512-NEXT:    sete %al1547; X64-AVX512-NEXT:    vzeroupper1548; X64-AVX512-NEXT:    retq1549;1550; X64-MIC-AVX-LABEL: length48_eq:1551; X64-MIC-AVX:       # %bb.0:1552; X64-MIC-AVX-NEXT:    vmovdqu (%rdi), %ymm01553; X64-MIC-AVX-NEXT:    vmovdqu (%rsi), %ymm11554; X64-MIC-AVX-NEXT:    vmovdqu 32(%rdi), %xmm21555; X64-MIC-AVX-NEXT:    vmovdqu 32(%rsi), %xmm31556; X64-MIC-AVX-NEXT:    vpcmpneqd %zmm3, %zmm2, %k01557; X64-MIC-AVX-NEXT:    vpcmpneqd %zmm1, %zmm0, %k11558; X64-MIC-AVX-NEXT:    kortestw %k0, %k11559; X64-MIC-AVX-NEXT:    sete %al1560; X64-MIC-AVX-NEXT:    vzeroupper1561; X64-MIC-AVX-NEXT:    retq1562  %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 48) nounwind1563  %cmp = icmp eq i32 %call, 01564  ret i1 %cmp1565}1566 1567define i1 @length48_lt(ptr %x, ptr %y) nounwind {1568; X64-LABEL: length48_lt:1569; X64:       # %bb.0:1570; X64-NEXT:    pushq %rax1571; X64-NEXT:    movl $48, %edx1572; X64-NEXT:    callq memcmp1573; X64-NEXT:    shrl $31, %eax1574; X64-NEXT:    # kill: def $al killed $al killed $eax1575; X64-NEXT:    popq %rcx1576; X64-NEXT:    retq1577  %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 48) nounwind1578  %cmp = icmp slt i32 %call, 01579  ret i1 %cmp1580}1581 1582define i1 @length48_gt(ptr %x, ptr %y) nounwind {1583; X64-LABEL: length48_gt:1584; X64:       # %bb.0:1585; X64-NEXT:    pushq %rax1586; X64-NEXT:    movl $48, %edx1587; X64-NEXT:    callq memcmp1588; X64-NEXT:    testl %eax, %eax1589; X64-NEXT:    setg %al1590; X64-NEXT:    popq %rcx1591; X64-NEXT:    retq1592  %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 48) nounwind1593  %cmp = icmp sgt i32 %call, 01594  ret i1 %cmp1595}1596 1597define i1 @length48_eq_prefer128(ptr %x, ptr %y) nounwind "prefer-vector-width"="128" {1598; X64-LABEL: length48_eq_prefer128:1599; X64:       # %bb.0:1600; X64-NEXT:    pushq %rax1601; X64-NEXT:    movl $48, %edx1602; X64-NEXT:    callq memcmp1603; X64-NEXT:    testl %eax, %eax1604; X64-NEXT:    sete %al1605; X64-NEXT:    popq %rcx1606; X64-NEXT:    retq1607  %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 48) nounwind1608  %cmp = icmp eq i32 %call, 01609  ret i1 %cmp1610}1611 1612define i1 @length48_eq_const(ptr %X) nounwind {1613; X64-SSE-LABEL: length48_eq_const:1614; X64-SSE:       # %bb.0:1615; X64-SSE-NEXT:    pushq %rax1616; X64-SSE-NEXT:    movl $.L.str, %esi1617; X64-SSE-NEXT:    movl $48, %edx1618; X64-SSE-NEXT:    callq memcmp1619; X64-SSE-NEXT:    testl %eax, %eax1620; X64-SSE-NEXT:    setne %al1621; X64-SSE-NEXT:    popq %rcx1622; X64-SSE-NEXT:    retq1623;1624; X64-AVX1-LABEL: length48_eq_const:1625; X64-AVX1:       # %bb.0:1626; X64-AVX1-NEXT:    vmovups (%rdi), %ymm01627; X64-AVX1-NEXT:    vmovups 32(%rdi), %xmm11628; X64-AVX1-NEXT:    vxorps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm01629; X64-AVX1-NEXT:    vxorps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm11630; X64-AVX1-NEXT:    vorps %ymm1, %ymm0, %ymm01631; X64-AVX1-NEXT:    vptest %ymm0, %ymm01632; X64-AVX1-NEXT:    setne %al1633; X64-AVX1-NEXT:    vzeroupper1634; X64-AVX1-NEXT:    retq1635;1636; X64-AVX2-LABEL: length48_eq_const:1637; X64-AVX2:       # %bb.0:1638; X64-AVX2-NEXT:    vmovdqu (%rdi), %ymm01639; X64-AVX2-NEXT:    vmovdqu 32(%rdi), %xmm11640; X64-AVX2-NEXT:    vpxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm01641; X64-AVX2-NEXT:    vpxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm11642; X64-AVX2-NEXT:    vpor %ymm1, %ymm0, %ymm01643; X64-AVX2-NEXT:    vptest %ymm0, %ymm01644; X64-AVX2-NEXT:    setne %al1645; X64-AVX2-NEXT:    vzeroupper1646; X64-AVX2-NEXT:    retq1647;1648; X64-AVX512-LABEL: length48_eq_const:1649; X64-AVX512:       # %bb.0:1650; X64-AVX512-NEXT:    vmovdqu (%rdi), %ymm01651; X64-AVX512-NEXT:    vmovdqu 32(%rdi), %xmm11652; X64-AVX512-NEXT:    vpxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm01653; X64-AVX512-NEXT:    vpxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm11654; X64-AVX512-NEXT:    vpor %ymm1, %ymm0, %ymm01655; X64-AVX512-NEXT:    vptest %ymm0, %ymm01656; X64-AVX512-NEXT:    setne %al1657; X64-AVX512-NEXT:    vzeroupper1658; X64-AVX512-NEXT:    retq1659;1660; X64-MIC-AVX-LABEL: length48_eq_const:1661; X64-MIC-AVX:       # %bb.0:1662; X64-MIC-AVX-NEXT:    vmovdqu (%rdi), %ymm01663; X64-MIC-AVX-NEXT:    vmovdqu 32(%rdi), %xmm11664; X64-MIC-AVX-NEXT:    vmovdqa {{.*#+}} ymm2 = [892613426,959985462,858927408,926299444,0,0,0,0]1665; X64-MIC-AVX-NEXT:    vpcmpneqd %zmm2, %zmm1, %k01666; X64-MIC-AVX-NEXT:    vmovdqa {{.*#+}} ymm1 = [858927408,926299444,825243960,892613426,959985462,858927408,926299444,825243960]1667; X64-MIC-AVX-NEXT:    vpcmpneqd %zmm1, %zmm0, %k11668; X64-MIC-AVX-NEXT:    kortestw %k0, %k11669; X64-MIC-AVX-NEXT:    setne %al1670; X64-MIC-AVX-NEXT:    vzeroupper1671; X64-MIC-AVX-NEXT:    retq1672  %m = tail call i32 @memcmp(ptr %X, ptr @.str, i64 48) nounwind1673  %c = icmp ne i32 %m, 01674  ret i1 %c1675}1676 1677define i32 @length63(ptr %X, ptr %Y) nounwind {1678; X64-LABEL: length63:1679; X64:       # %bb.0:1680; X64-NEXT:    movl $63, %edx1681; X64-NEXT:    jmp memcmp # TAILCALL1682  %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 63) nounwind1683  ret i32 %m1684}1685 1686define i1 @length63_eq(ptr %x, ptr %y) nounwind {1687; X64-SSE-LABEL: length63_eq:1688; X64-SSE:       # %bb.0:1689; X64-SSE-NEXT:    pushq %rax1690; X64-SSE-NEXT:    movl $63, %edx1691; X64-SSE-NEXT:    callq memcmp1692; X64-SSE-NEXT:    testl %eax, %eax1693; X64-SSE-NEXT:    setne %al1694; X64-SSE-NEXT:    popq %rcx1695; X64-SSE-NEXT:    retq1696;1697; X64-AVX1-LABEL: length63_eq:1698; X64-AVX1:       # %bb.0:1699; X64-AVX1-NEXT:    vmovups (%rdi), %ymm01700; X64-AVX1-NEXT:    vmovups 31(%rdi), %ymm11701; X64-AVX1-NEXT:    vxorps 31(%rsi), %ymm1, %ymm11702; X64-AVX1-NEXT:    vxorps (%rsi), %ymm0, %ymm01703; X64-AVX1-NEXT:    vorps %ymm1, %ymm0, %ymm01704; X64-AVX1-NEXT:    vptest %ymm0, %ymm01705; X64-AVX1-NEXT:    setne %al1706; X64-AVX1-NEXT:    vzeroupper1707; X64-AVX1-NEXT:    retq1708;1709; X64-AVX2-LABEL: length63_eq:1710; X64-AVX2:       # %bb.0:1711; X64-AVX2-NEXT:    vmovdqu (%rdi), %ymm01712; X64-AVX2-NEXT:    vmovdqu 31(%rdi), %ymm11713; X64-AVX2-NEXT:    vpxor 31(%rsi), %ymm1, %ymm11714; X64-AVX2-NEXT:    vpxor (%rsi), %ymm0, %ymm01715; X64-AVX2-NEXT:    vpor %ymm1, %ymm0, %ymm01716; X64-AVX2-NEXT:    vptest %ymm0, %ymm01717; X64-AVX2-NEXT:    setne %al1718; X64-AVX2-NEXT:    vzeroupper1719; X64-AVX2-NEXT:    retq1720;1721; X64-AVX512-LABEL: length63_eq:1722; X64-AVX512:       # %bb.0:1723; X64-AVX512-NEXT:    vmovdqu (%rdi), %ymm01724; X64-AVX512-NEXT:    vmovdqu 31(%rdi), %ymm11725; X64-AVX512-NEXT:    vpxor 31(%rsi), %ymm1, %ymm11726; X64-AVX512-NEXT:    vpxor (%rsi), %ymm0, %ymm01727; X64-AVX512-NEXT:    vpor %ymm1, %ymm0, %ymm01728; X64-AVX512-NEXT:    vptest %ymm0, %ymm01729; X64-AVX512-NEXT:    setne %al1730; X64-AVX512-NEXT:    vzeroupper1731; X64-AVX512-NEXT:    retq1732;1733; X64-MIC-AVX-LABEL: length63_eq:1734; X64-MIC-AVX:       # %bb.0:1735; X64-MIC-AVX-NEXT:    vmovdqu (%rdi), %ymm01736; X64-MIC-AVX-NEXT:    vmovdqu 31(%rdi), %ymm11737; X64-MIC-AVX-NEXT:    vmovdqu (%rsi), %ymm21738; X64-MIC-AVX-NEXT:    vmovdqu 31(%rsi), %ymm31739; X64-MIC-AVX-NEXT:    vpcmpneqd %zmm3, %zmm1, %k01740; X64-MIC-AVX-NEXT:    vpcmpneqd %zmm2, %zmm0, %k11741; X64-MIC-AVX-NEXT:    kortestw %k0, %k11742; X64-MIC-AVX-NEXT:    setne %al1743; X64-MIC-AVX-NEXT:    vzeroupper1744; X64-MIC-AVX-NEXT:    retq1745  %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 63) nounwind1746  %cmp = icmp ne i32 %call, 01747  ret i1 %cmp1748}1749 1750define i1 @length63_lt(ptr %x, ptr %y) nounwind {1751; X64-LABEL: length63_lt:1752; X64:       # %bb.0:1753; X64-NEXT:    pushq %rax1754; X64-NEXT:    movl $63, %edx1755; X64-NEXT:    callq memcmp1756; X64-NEXT:    shrl $31, %eax1757; X64-NEXT:    # kill: def $al killed $al killed $eax1758; X64-NEXT:    popq %rcx1759; X64-NEXT:    retq1760  %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 63) nounwind1761  %cmp = icmp slt i32 %call, 01762  ret i1 %cmp1763}1764 1765define i1 @length63_gt(ptr %x, ptr %y) nounwind {1766; X64-LABEL: length63_gt:1767; X64:       # %bb.0:1768; X64-NEXT:    pushq %rax1769; X64-NEXT:    movl $63, %edx1770; X64-NEXT:    callq memcmp1771; X64-NEXT:    testl %eax, %eax1772; X64-NEXT:    setg %al1773; X64-NEXT:    popq %rcx1774; X64-NEXT:    retq1775  %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 63) nounwind1776  %cmp = icmp sgt i32 %call, 01777  ret i1 %cmp1778}1779 1780define i1 @length63_eq_const(ptr %X) nounwind {1781; X64-SSE-LABEL: length63_eq_const:1782; X64-SSE:       # %bb.0:1783; X64-SSE-NEXT:    pushq %rax1784; X64-SSE-NEXT:    movl $.L.str, %esi1785; X64-SSE-NEXT:    movl $63, %edx1786; X64-SSE-NEXT:    callq memcmp1787; X64-SSE-NEXT:    testl %eax, %eax1788; X64-SSE-NEXT:    sete %al1789; X64-SSE-NEXT:    popq %rcx1790; X64-SSE-NEXT:    retq1791;1792; X64-AVX1-LABEL: length63_eq_const:1793; X64-AVX1:       # %bb.0:1794; X64-AVX1-NEXT:    vmovups (%rdi), %ymm01795; X64-AVX1-NEXT:    vmovups 31(%rdi), %ymm11796; X64-AVX1-NEXT:    vxorps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm11797; X64-AVX1-NEXT:    vxorps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm01798; X64-AVX1-NEXT:    vorps %ymm1, %ymm0, %ymm01799; X64-AVX1-NEXT:    vptest %ymm0, %ymm01800; X64-AVX1-NEXT:    sete %al1801; X64-AVX1-NEXT:    vzeroupper1802; X64-AVX1-NEXT:    retq1803;1804; X64-AVX2-LABEL: length63_eq_const:1805; X64-AVX2:       # %bb.0:1806; X64-AVX2-NEXT:    vmovdqu (%rdi), %ymm01807; X64-AVX2-NEXT:    vmovdqu 31(%rdi), %ymm11808; X64-AVX2-NEXT:    vpxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm11809; X64-AVX2-NEXT:    vpxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm01810; X64-AVX2-NEXT:    vpor %ymm1, %ymm0, %ymm01811; X64-AVX2-NEXT:    vptest %ymm0, %ymm01812; X64-AVX2-NEXT:    sete %al1813; X64-AVX2-NEXT:    vzeroupper1814; X64-AVX2-NEXT:    retq1815;1816; X64-AVX512-LABEL: length63_eq_const:1817; X64-AVX512:       # %bb.0:1818; X64-AVX512-NEXT:    vmovdqu (%rdi), %ymm01819; X64-AVX512-NEXT:    vmovdqu 31(%rdi), %ymm11820; X64-AVX512-NEXT:    vpxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm11821; X64-AVX512-NEXT:    vpxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm01822; X64-AVX512-NEXT:    vpor %ymm1, %ymm0, %ymm01823; X64-AVX512-NEXT:    vptest %ymm0, %ymm01824; X64-AVX512-NEXT:    sete %al1825; X64-AVX512-NEXT:    vzeroupper1826; X64-AVX512-NEXT:    retq1827;1828; X64-MIC-AVX-LABEL: length63_eq_const:1829; X64-MIC-AVX:       # %bb.0:1830; X64-MIC-AVX-NEXT:    vmovdqu (%rdi), %ymm01831; X64-MIC-AVX-NEXT:    vmovdqu 31(%rdi), %ymm11832; X64-MIC-AVX-NEXT:    vmovdqa {{.*#+}} ymm2 = [875770417,943142453,842084409,909456435,809056311,875770417,943142453,842084409]1833; X64-MIC-AVX-NEXT:    vpcmpneqd %zmm2, %zmm1, %k01834; X64-MIC-AVX-NEXT:    vmovdqa {{.*#+}} ymm1 = [858927408,926299444,825243960,892613426,959985462,858927408,926299444,825243960]1835; X64-MIC-AVX-NEXT:    vpcmpneqd %zmm1, %zmm0, %k11836; X64-MIC-AVX-NEXT:    kortestw %k0, %k11837; X64-MIC-AVX-NEXT:    sete %al1838; X64-MIC-AVX-NEXT:    vzeroupper1839; X64-MIC-AVX-NEXT:    retq1840  %m = tail call i32 @memcmp(ptr %X, ptr @.str, i64 63) nounwind1841  %c = icmp eq i32 %m, 01842  ret i1 %c1843}1844 1845define i32 @length64(ptr %X, ptr %Y) nounwind {1846; X64-LABEL: length64:1847; X64:       # %bb.0:1848; X64-NEXT:    movl $64, %edx1849; X64-NEXT:    jmp memcmp # TAILCALL1850  %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 64) nounwind1851  ret i32 %m1852}1853 1854define i1 @length64_eq(ptr %x, ptr %y) nounwind {1855; X64-SSE-LABEL: length64_eq:1856; X64-SSE:       # %bb.0:1857; X64-SSE-NEXT:    pushq %rax1858; X64-SSE-NEXT:    movl $64, %edx1859; X64-SSE-NEXT:    callq memcmp1860; X64-SSE-NEXT:    testl %eax, %eax1861; X64-SSE-NEXT:    setne %al1862; X64-SSE-NEXT:    popq %rcx1863; X64-SSE-NEXT:    retq1864;1865; X64-AVX1-LABEL: length64_eq:1866; X64-AVX1:       # %bb.0:1867; X64-AVX1-NEXT:    vmovups (%rdi), %ymm01868; X64-AVX1-NEXT:    vmovups 32(%rdi), %ymm11869; X64-AVX1-NEXT:    vxorps 32(%rsi), %ymm1, %ymm11870; X64-AVX1-NEXT:    vxorps (%rsi), %ymm0, %ymm01871; X64-AVX1-NEXT:    vorps %ymm1, %ymm0, %ymm01872; X64-AVX1-NEXT:    vptest %ymm0, %ymm01873; X64-AVX1-NEXT:    setne %al1874; X64-AVX1-NEXT:    vzeroupper1875; X64-AVX1-NEXT:    retq1876;1877; X64-AVX2-LABEL: length64_eq:1878; X64-AVX2:       # %bb.0:1879; X64-AVX2-NEXT:    vmovdqu (%rdi), %ymm01880; X64-AVX2-NEXT:    vmovdqu 32(%rdi), %ymm11881; X64-AVX2-NEXT:    vpxor 32(%rsi), %ymm1, %ymm11882; X64-AVX2-NEXT:    vpxor (%rsi), %ymm0, %ymm01883; X64-AVX2-NEXT:    vpor %ymm1, %ymm0, %ymm01884; X64-AVX2-NEXT:    vptest %ymm0, %ymm01885; X64-AVX2-NEXT:    setne %al1886; X64-AVX2-NEXT:    vzeroupper1887; X64-AVX2-NEXT:    retq1888;1889; X64-AVX512-LABEL: length64_eq:1890; X64-AVX512:       # %bb.0:1891; X64-AVX512-NEXT:    vmovdqu64 (%rdi), %zmm01892; X64-AVX512-NEXT:    vpcmpneqd (%rsi), %zmm0, %k01893; X64-AVX512-NEXT:    kortestw %k0, %k01894; X64-AVX512-NEXT:    setne %al1895; X64-AVX512-NEXT:    vzeroupper1896; X64-AVX512-NEXT:    retq1897;1898; X64-MIC-AVX2-LABEL: length64_eq:1899; X64-MIC-AVX2:       # %bb.0:1900; X64-MIC-AVX2-NEXT:    vmovdqu (%rdi), %ymm01901; X64-MIC-AVX2-NEXT:    vmovdqu 32(%rdi), %ymm11902; X64-MIC-AVX2-NEXT:    vmovdqu (%rsi), %ymm21903; X64-MIC-AVX2-NEXT:    vmovdqu 32(%rsi), %ymm31904; X64-MIC-AVX2-NEXT:    vpcmpneqd %zmm3, %zmm1, %k01905; X64-MIC-AVX2-NEXT:    vpcmpneqd %zmm2, %zmm0, %k11906; X64-MIC-AVX2-NEXT:    kortestw %k0, %k11907; X64-MIC-AVX2-NEXT:    setne %al1908; X64-MIC-AVX2-NEXT:    vzeroupper1909; X64-MIC-AVX2-NEXT:    retq1910;1911; X64-MIC-AVX512F-LABEL: length64_eq:1912; X64-MIC-AVX512F:       # %bb.0:1913; X64-MIC-AVX512F-NEXT:    vmovdqu64 (%rdi), %zmm01914; X64-MIC-AVX512F-NEXT:    vpcmpneqd (%rsi), %zmm0, %k01915; X64-MIC-AVX512F-NEXT:    kortestw %k0, %k01916; X64-MIC-AVX512F-NEXT:    setne %al1917; X64-MIC-AVX512F-NEXT:    vzeroupper1918; X64-MIC-AVX512F-NEXT:    retq1919  %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 64) nounwind1920  %cmp = icmp ne i32 %call, 01921  ret i1 %cmp1922}1923 1924define i1 @length64_lt(ptr %x, ptr %y) nounwind {1925; X64-LABEL: length64_lt:1926; X64:       # %bb.0:1927; X64-NEXT:    pushq %rax1928; X64-NEXT:    movl $64, %edx1929; X64-NEXT:    callq memcmp1930; X64-NEXT:    shrl $31, %eax1931; X64-NEXT:    # kill: def $al killed $al killed $eax1932; X64-NEXT:    popq %rcx1933; X64-NEXT:    retq1934  %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 64) nounwind1935  %cmp = icmp slt i32 %call, 01936  ret i1 %cmp1937}1938 1939define i1 @length64_gt(ptr %x, ptr %y) nounwind {1940; X64-LABEL: length64_gt:1941; X64:       # %bb.0:1942; X64-NEXT:    pushq %rax1943; X64-NEXT:    movl $64, %edx1944; X64-NEXT:    callq memcmp1945; X64-NEXT:    testl %eax, %eax1946; X64-NEXT:    setg %al1947; X64-NEXT:    popq %rcx1948; X64-NEXT:    retq1949  %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 64) nounwind1950  %cmp = icmp sgt i32 %call, 01951  ret i1 %cmp1952}1953 1954define i1 @length64_eq_const(ptr %X) nounwind {1955; X64-SSE-LABEL: length64_eq_const:1956; X64-SSE:       # %bb.0:1957; X64-SSE-NEXT:    pushq %rax1958; X64-SSE-NEXT:    movl $.L.str, %esi1959; X64-SSE-NEXT:    movl $64, %edx1960; X64-SSE-NEXT:    callq memcmp1961; X64-SSE-NEXT:    testl %eax, %eax1962; X64-SSE-NEXT:    sete %al1963; X64-SSE-NEXT:    popq %rcx1964; X64-SSE-NEXT:    retq1965;1966; X64-AVX1-LABEL: length64_eq_const:1967; X64-AVX1:       # %bb.0:1968; X64-AVX1-NEXT:    vmovups (%rdi), %ymm01969; X64-AVX1-NEXT:    vmovups 32(%rdi), %ymm11970; X64-AVX1-NEXT:    vxorps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm11971; X64-AVX1-NEXT:    vxorps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm01972; X64-AVX1-NEXT:    vorps %ymm1, %ymm0, %ymm01973; X64-AVX1-NEXT:    vptest %ymm0, %ymm01974; X64-AVX1-NEXT:    sete %al1975; X64-AVX1-NEXT:    vzeroupper1976; X64-AVX1-NEXT:    retq1977;1978; X64-AVX2-LABEL: length64_eq_const:1979; X64-AVX2:       # %bb.0:1980; X64-AVX2-NEXT:    vmovdqu (%rdi), %ymm01981; X64-AVX2-NEXT:    vmovdqu 32(%rdi), %ymm11982; X64-AVX2-NEXT:    vpxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm11983; X64-AVX2-NEXT:    vpxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm01984; X64-AVX2-NEXT:    vpor %ymm1, %ymm0, %ymm01985; X64-AVX2-NEXT:    vptest %ymm0, %ymm01986; X64-AVX2-NEXT:    sete %al1987; X64-AVX2-NEXT:    vzeroupper1988; X64-AVX2-NEXT:    retq1989;1990; X64-AVX512-LABEL: length64_eq_const:1991; X64-AVX512:       # %bb.0:1992; X64-AVX512-NEXT:    vmovdqu64 (%rdi), %zmm01993; X64-AVX512-NEXT:    vpcmpneqd .L.str(%rip), %zmm0, %k01994; X64-AVX512-NEXT:    kortestw %k0, %k01995; X64-AVX512-NEXT:    sete %al1996; X64-AVX512-NEXT:    vzeroupper1997; X64-AVX512-NEXT:    retq1998;1999; X64-MIC-AVX2-LABEL: length64_eq_const:2000; X64-MIC-AVX2:       # %bb.0:2001; X64-MIC-AVX2-NEXT:    vmovdqu (%rdi), %ymm02002; X64-MIC-AVX2-NEXT:    vmovdqu 32(%rdi), %ymm12003; X64-MIC-AVX2-NEXT:    vmovdqa {{.*#+}} ymm2 = [892613426,959985462,858927408,926299444,825243960,892613426,959985462,858927408]2004; X64-MIC-AVX2-NEXT:    vpcmpneqd %zmm2, %zmm1, %k02005; X64-MIC-AVX2-NEXT:    vmovdqa {{.*#+}} ymm1 = [858927408,926299444,825243960,892613426,959985462,858927408,926299444,825243960]2006; X64-MIC-AVX2-NEXT:    vpcmpneqd %zmm1, %zmm0, %k12007; X64-MIC-AVX2-NEXT:    kortestw %k0, %k12008; X64-MIC-AVX2-NEXT:    sete %al2009; X64-MIC-AVX2-NEXT:    vzeroupper2010; X64-MIC-AVX2-NEXT:    retq2011;2012; X64-MIC-AVX512F-LABEL: length64_eq_const:2013; X64-MIC-AVX512F:       # %bb.0:2014; X64-MIC-AVX512F-NEXT:    vmovdqu64 (%rdi), %zmm02015; X64-MIC-AVX512F-NEXT:    vpcmpneqd .L.str(%rip), %zmm0, %k02016; X64-MIC-AVX512F-NEXT:    kortestw %k0, %k02017; X64-MIC-AVX512F-NEXT:    sete %al2018; X64-MIC-AVX512F-NEXT:    vzeroupper2019; X64-MIC-AVX512F-NEXT:    retq2020  %m = tail call i32 @memcmp(ptr %X, ptr @.str, i64 64) nounwind2021  %c = icmp eq i32 %m, 02022  ret i1 %c2023}2024 2025define i32 @length96(ptr %X, ptr %Y) nounwind {2026; X64-LABEL: length96:2027; X64:       # %bb.0:2028; X64-NEXT:    movl $96, %edx2029; X64-NEXT:    jmp memcmp # TAILCALL2030  %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 96) nounwind2031  ret i32 %m2032}2033 2034define i1 @length96_eq(ptr %x, ptr %y) nounwind {2035; X64-SSE-LABEL: length96_eq:2036; X64-SSE:       # %bb.0:2037; X64-SSE-NEXT:    pushq %rax2038; X64-SSE-NEXT:    movl $96, %edx2039; X64-SSE-NEXT:    callq memcmp2040; X64-SSE-NEXT:    testl %eax, %eax2041; X64-SSE-NEXT:    setne %al2042; X64-SSE-NEXT:    popq %rcx2043; X64-SSE-NEXT:    retq2044;2045; X64-AVX1-LABEL: length96_eq:2046; X64-AVX1:       # %bb.0:2047; X64-AVX1-NEXT:    pushq %rax2048; X64-AVX1-NEXT:    movl $96, %edx2049; X64-AVX1-NEXT:    callq memcmp2050; X64-AVX1-NEXT:    testl %eax, %eax2051; X64-AVX1-NEXT:    setne %al2052; X64-AVX1-NEXT:    popq %rcx2053; X64-AVX1-NEXT:    retq2054;2055; X64-AVX2-LABEL: length96_eq:2056; X64-AVX2:       # %bb.0:2057; X64-AVX2-NEXT:    pushq %rax2058; X64-AVX2-NEXT:    movl $96, %edx2059; X64-AVX2-NEXT:    callq memcmp2060; X64-AVX2-NEXT:    testl %eax, %eax2061; X64-AVX2-NEXT:    setne %al2062; X64-AVX2-NEXT:    popq %rcx2063; X64-AVX2-NEXT:    retq2064;2065; X64-AVX512BW-LABEL: length96_eq:2066; X64-AVX512BW:       # %bb.0:2067; X64-AVX512BW-NEXT:    vmovdqu64 (%rdi), %zmm02068; X64-AVX512BW-NEXT:    vmovdqu 64(%rdi), %ymm12069; X64-AVX512BW-NEXT:    vmovdqu 64(%rsi), %ymm22070; X64-AVX512BW-NEXT:    vpcmpneqb (%rsi), %zmm0, %k02071; X64-AVX512BW-NEXT:    vpcmpneqb %zmm2, %zmm1, %k12072; X64-AVX512BW-NEXT:    kortestq %k1, %k02073; X64-AVX512BW-NEXT:    setne %al2074; X64-AVX512BW-NEXT:    vzeroupper2075; X64-AVX512BW-NEXT:    retq2076;2077; X64-AVX512F-LABEL: length96_eq:2078; X64-AVX512F:       # %bb.0:2079; X64-AVX512F-NEXT:    vmovdqu64 (%rdi), %zmm02080; X64-AVX512F-NEXT:    vmovdqu 64(%rdi), %ymm12081; X64-AVX512F-NEXT:    vmovdqu 64(%rsi), %ymm22082; X64-AVX512F-NEXT:    vpcmpneqd (%rsi), %zmm0, %k02083; X64-AVX512F-NEXT:    vpcmpneqd %zmm2, %zmm1, %k12084; X64-AVX512F-NEXT:    kortestw %k1, %k02085; X64-AVX512F-NEXT:    setne %al2086; X64-AVX512F-NEXT:    vzeroupper2087; X64-AVX512F-NEXT:    retq2088;2089; X64-MIC-AVX2-LABEL: length96_eq:2090; X64-MIC-AVX2:       # %bb.0:2091; X64-MIC-AVX2-NEXT:    pushq %rax2092; X64-MIC-AVX2-NEXT:    movl $96, %edx2093; X64-MIC-AVX2-NEXT:    callq memcmp2094; X64-MIC-AVX2-NEXT:    testl %eax, %eax2095; X64-MIC-AVX2-NEXT:    setne %al2096; X64-MIC-AVX2-NEXT:    popq %rcx2097; X64-MIC-AVX2-NEXT:    retq2098;2099; X64-MIC-AVX512F-LABEL: length96_eq:2100; X64-MIC-AVX512F:       # %bb.0:2101; X64-MIC-AVX512F-NEXT:    vmovdqu64 (%rdi), %zmm02102; X64-MIC-AVX512F-NEXT:    vmovdqu 64(%rdi), %ymm12103; X64-MIC-AVX512F-NEXT:    vmovdqu 64(%rsi), %ymm22104; X64-MIC-AVX512F-NEXT:    vpcmpneqd (%rsi), %zmm0, %k02105; X64-MIC-AVX512F-NEXT:    vpcmpneqd %zmm2, %zmm1, %k12106; X64-MIC-AVX512F-NEXT:    kortestw %k1, %k02107; X64-MIC-AVX512F-NEXT:    setne %al2108; X64-MIC-AVX512F-NEXT:    vzeroupper2109; X64-MIC-AVX512F-NEXT:    retq2110  %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 96) nounwind2111  %cmp = icmp ne i32 %call, 02112  ret i1 %cmp2113}2114 2115define i1 @length96_lt(ptr %x, ptr %y) nounwind {2116; X64-LABEL: length96_lt:2117; X64:       # %bb.0:2118; X64-NEXT:    pushq %rax2119; X64-NEXT:    movl $96, %edx2120; X64-NEXT:    callq memcmp2121; X64-NEXT:    shrl $31, %eax2122; X64-NEXT:    # kill: def $al killed $al killed $eax2123; X64-NEXT:    popq %rcx2124; X64-NEXT:    retq2125  %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 96) nounwind2126  %cmp = icmp slt i32 %call, 02127  ret i1 %cmp2128}2129 2130define i1 @length96_gt(ptr %x, ptr %y) nounwind {2131; X64-LABEL: length96_gt:2132; X64:       # %bb.0:2133; X64-NEXT:    pushq %rax2134; X64-NEXT:    movl $96, %edx2135; X64-NEXT:    callq memcmp2136; X64-NEXT:    testl %eax, %eax2137; X64-NEXT:    setg %al2138; X64-NEXT:    popq %rcx2139; X64-NEXT:    retq2140  %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 96) nounwind2141  %cmp = icmp sgt i32 %call, 02142  ret i1 %cmp2143}2144 2145define i1 @length96_eq_const(ptr %X) nounwind {2146; X64-SSE-LABEL: length96_eq_const:2147; X64-SSE:       # %bb.0:2148; X64-SSE-NEXT:    pushq %rax2149; X64-SSE-NEXT:    movl $.L.str, %esi2150; X64-SSE-NEXT:    movl $96, %edx2151; X64-SSE-NEXT:    callq memcmp2152; X64-SSE-NEXT:    testl %eax, %eax2153; X64-SSE-NEXT:    sete %al2154; X64-SSE-NEXT:    popq %rcx2155; X64-SSE-NEXT:    retq2156;2157; X64-AVX1-LABEL: length96_eq_const:2158; X64-AVX1:       # %bb.0:2159; X64-AVX1-NEXT:    pushq %rax2160; X64-AVX1-NEXT:    movl $.L.str, %esi2161; X64-AVX1-NEXT:    movl $96, %edx2162; X64-AVX1-NEXT:    callq memcmp2163; X64-AVX1-NEXT:    testl %eax, %eax2164; X64-AVX1-NEXT:    sete %al2165; X64-AVX1-NEXT:    popq %rcx2166; X64-AVX1-NEXT:    retq2167;2168; X64-AVX2-LABEL: length96_eq_const:2169; X64-AVX2:       # %bb.0:2170; X64-AVX2-NEXT:    pushq %rax2171; X64-AVX2-NEXT:    movl $.L.str, %esi2172; X64-AVX2-NEXT:    movl $96, %edx2173; X64-AVX2-NEXT:    callq memcmp2174; X64-AVX2-NEXT:    testl %eax, %eax2175; X64-AVX2-NEXT:    sete %al2176; X64-AVX2-NEXT:    popq %rcx2177; X64-AVX2-NEXT:    retq2178;2179; X64-AVX512BW-LABEL: length96_eq_const:2180; X64-AVX512BW:       # %bb.0:2181; X64-AVX512BW-NEXT:    vmovdqu64 (%rdi), %zmm02182; X64-AVX512BW-NEXT:    vmovdqu 64(%rdi), %ymm12183; X64-AVX512BW-NEXT:    vpcmpneqb .L.str(%rip), %zmm0, %k02184; X64-AVX512BW-NEXT:    vpcmpneqb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %zmm1, %k12185; X64-AVX512BW-NEXT:    kortestq %k1, %k02186; X64-AVX512BW-NEXT:    sete %al2187; X64-AVX512BW-NEXT:    vzeroupper2188; X64-AVX512BW-NEXT:    retq2189;2190; X64-AVX512F-LABEL: length96_eq_const:2191; X64-AVX512F:       # %bb.0:2192; X64-AVX512F-NEXT:    vmovdqu64 (%rdi), %zmm02193; X64-AVX512F-NEXT:    vmovdqu 64(%rdi), %ymm12194; X64-AVX512F-NEXT:    vpcmpneqd .L.str(%rip), %zmm0, %k02195; X64-AVX512F-NEXT:    vpcmpneqd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %zmm1, %k12196; X64-AVX512F-NEXT:    kortestw %k1, %k02197; X64-AVX512F-NEXT:    sete %al2198; X64-AVX512F-NEXT:    vzeroupper2199; X64-AVX512F-NEXT:    retq2200;2201; X64-MIC-AVX2-LABEL: length96_eq_const:2202; X64-MIC-AVX2:       # %bb.0:2203; X64-MIC-AVX2-NEXT:    pushq %rax2204; X64-MIC-AVX2-NEXT:    movl $.L.str, %esi2205; X64-MIC-AVX2-NEXT:    movl $96, %edx2206; X64-MIC-AVX2-NEXT:    callq memcmp2207; X64-MIC-AVX2-NEXT:    testl %eax, %eax2208; X64-MIC-AVX2-NEXT:    sete %al2209; X64-MIC-AVX2-NEXT:    popq %rcx2210; X64-MIC-AVX2-NEXT:    retq2211;2212; X64-MIC-AVX512F-LABEL: length96_eq_const:2213; X64-MIC-AVX512F:       # %bb.0:2214; X64-MIC-AVX512F-NEXT:    vmovdqu64 (%rdi), %zmm02215; X64-MIC-AVX512F-NEXT:    vmovdqu 64(%rdi), %ymm12216; X64-MIC-AVX512F-NEXT:    vpcmpneqd .L.str(%rip), %zmm0, %k02217; X64-MIC-AVX512F-NEXT:    vpcmpneqd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %zmm1, %k12218; X64-MIC-AVX512F-NEXT:    kortestw %k1, %k02219; X64-MIC-AVX512F-NEXT:    sete %al2220; X64-MIC-AVX512F-NEXT:    vzeroupper2221; X64-MIC-AVX512F-NEXT:    retq2222  %m = tail call i32 @memcmp(ptr %X, ptr @.str, i64 96) nounwind2223  %c = icmp eq i32 %m, 02224  ret i1 %c2225}2226 2227define i32 @length127(ptr %X, ptr %Y) nounwind {2228; X64-LABEL: length127:2229; X64:       # %bb.0:2230; X64-NEXT:    movl $127, %edx2231; X64-NEXT:    jmp memcmp # TAILCALL2232  %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 127) nounwind2233  ret i32 %m2234}2235 2236define i1 @length127_eq(ptr %x, ptr %y) nounwind {2237; X64-SSE-LABEL: length127_eq:2238; X64-SSE:       # %bb.0:2239; X64-SSE-NEXT:    pushq %rax2240; X64-SSE-NEXT:    movl $127, %edx2241; X64-SSE-NEXT:    callq memcmp2242; X64-SSE-NEXT:    testl %eax, %eax2243; X64-SSE-NEXT:    setne %al2244; X64-SSE-NEXT:    popq %rcx2245; X64-SSE-NEXT:    retq2246;2247; X64-AVX1-LABEL: length127_eq:2248; X64-AVX1:       # %bb.0:2249; X64-AVX1-NEXT:    pushq %rax2250; X64-AVX1-NEXT:    movl $127, %edx2251; X64-AVX1-NEXT:    callq memcmp2252; X64-AVX1-NEXT:    testl %eax, %eax2253; X64-AVX1-NEXT:    setne %al2254; X64-AVX1-NEXT:    popq %rcx2255; X64-AVX1-NEXT:    retq2256;2257; X64-AVX2-LABEL: length127_eq:2258; X64-AVX2:       # %bb.0:2259; X64-AVX2-NEXT:    pushq %rax2260; X64-AVX2-NEXT:    movl $127, %edx2261; X64-AVX2-NEXT:    callq memcmp2262; X64-AVX2-NEXT:    testl %eax, %eax2263; X64-AVX2-NEXT:    setne %al2264; X64-AVX2-NEXT:    popq %rcx2265; X64-AVX2-NEXT:    retq2266;2267; X64-AVX512BW-LABEL: length127_eq:2268; X64-AVX512BW:       # %bb.0:2269; X64-AVX512BW-NEXT:    vmovdqu64 (%rdi), %zmm02270; X64-AVX512BW-NEXT:    vmovdqu64 63(%rdi), %zmm12271; X64-AVX512BW-NEXT:    vpcmpneqb 63(%rsi), %zmm1, %k02272; X64-AVX512BW-NEXT:    vpcmpneqb (%rsi), %zmm0, %k12273; X64-AVX512BW-NEXT:    kortestq %k0, %k12274; X64-AVX512BW-NEXT:    setne %al2275; X64-AVX512BW-NEXT:    vzeroupper2276; X64-AVX512BW-NEXT:    retq2277;2278; X64-AVX512F-LABEL: length127_eq:2279; X64-AVX512F:       # %bb.0:2280; X64-AVX512F-NEXT:    vmovdqu64 (%rdi), %zmm02281; X64-AVX512F-NEXT:    vmovdqu64 63(%rdi), %zmm12282; X64-AVX512F-NEXT:    vpcmpneqd 63(%rsi), %zmm1, %k02283; X64-AVX512F-NEXT:    vpcmpneqd (%rsi), %zmm0, %k12284; X64-AVX512F-NEXT:    kortestw %k0, %k12285; X64-AVX512F-NEXT:    setne %al2286; X64-AVX512F-NEXT:    vzeroupper2287; X64-AVX512F-NEXT:    retq2288;2289; X64-MIC-AVX2-LABEL: length127_eq:2290; X64-MIC-AVX2:       # %bb.0:2291; X64-MIC-AVX2-NEXT:    pushq %rax2292; X64-MIC-AVX2-NEXT:    movl $127, %edx2293; X64-MIC-AVX2-NEXT:    callq memcmp2294; X64-MIC-AVX2-NEXT:    testl %eax, %eax2295; X64-MIC-AVX2-NEXT:    setne %al2296; X64-MIC-AVX2-NEXT:    popq %rcx2297; X64-MIC-AVX2-NEXT:    retq2298;2299; X64-MIC-AVX512F-LABEL: length127_eq:2300; X64-MIC-AVX512F:       # %bb.0:2301; X64-MIC-AVX512F-NEXT:    vmovdqu64 (%rdi), %zmm02302; X64-MIC-AVX512F-NEXT:    vmovdqu64 63(%rdi), %zmm12303; X64-MIC-AVX512F-NEXT:    vpcmpneqd 63(%rsi), %zmm1, %k02304; X64-MIC-AVX512F-NEXT:    vpcmpneqd (%rsi), %zmm0, %k12305; X64-MIC-AVX512F-NEXT:    kortestw %k0, %k12306; X64-MIC-AVX512F-NEXT:    setne %al2307; X64-MIC-AVX512F-NEXT:    vzeroupper2308; X64-MIC-AVX512F-NEXT:    retq2309  %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 127) nounwind2310  %cmp = icmp ne i32 %call, 02311  ret i1 %cmp2312}2313 2314define i1 @length127_lt(ptr %x, ptr %y) nounwind {2315; X64-LABEL: length127_lt:2316; X64:       # %bb.0:2317; X64-NEXT:    pushq %rax2318; X64-NEXT:    movl $127, %edx2319; X64-NEXT:    callq memcmp2320; X64-NEXT:    shrl $31, %eax2321; X64-NEXT:    # kill: def $al killed $al killed $eax2322; X64-NEXT:    popq %rcx2323; X64-NEXT:    retq2324  %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 127) nounwind2325  %cmp = icmp slt i32 %call, 02326  ret i1 %cmp2327}2328 2329define i1 @length127_gt(ptr %x, ptr %y) nounwind {2330; X64-LABEL: length127_gt:2331; X64:       # %bb.0:2332; X64-NEXT:    pushq %rax2333; X64-NEXT:    movl $127, %edx2334; X64-NEXT:    callq memcmp2335; X64-NEXT:    testl %eax, %eax2336; X64-NEXT:    setg %al2337; X64-NEXT:    popq %rcx2338; X64-NEXT:    retq2339  %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 127) nounwind2340  %cmp = icmp sgt i32 %call, 02341  ret i1 %cmp2342}2343 2344define i1 @length127_eq_const(ptr %X) nounwind {2345; X64-SSE-LABEL: length127_eq_const:2346; X64-SSE:       # %bb.0:2347; X64-SSE-NEXT:    pushq %rax2348; X64-SSE-NEXT:    movl $.L.str, %esi2349; X64-SSE-NEXT:    movl $127, %edx2350; X64-SSE-NEXT:    callq memcmp2351; X64-SSE-NEXT:    testl %eax, %eax2352; X64-SSE-NEXT:    sete %al2353; X64-SSE-NEXT:    popq %rcx2354; X64-SSE-NEXT:    retq2355;2356; X64-AVX1-LABEL: length127_eq_const:2357; X64-AVX1:       # %bb.0:2358; X64-AVX1-NEXT:    pushq %rax2359; X64-AVX1-NEXT:    movl $.L.str, %esi2360; X64-AVX1-NEXT:    movl $127, %edx2361; X64-AVX1-NEXT:    callq memcmp2362; X64-AVX1-NEXT:    testl %eax, %eax2363; X64-AVX1-NEXT:    sete %al2364; X64-AVX1-NEXT:    popq %rcx2365; X64-AVX1-NEXT:    retq2366;2367; X64-AVX2-LABEL: length127_eq_const:2368; X64-AVX2:       # %bb.0:2369; X64-AVX2-NEXT:    pushq %rax2370; X64-AVX2-NEXT:    movl $.L.str, %esi2371; X64-AVX2-NEXT:    movl $127, %edx2372; X64-AVX2-NEXT:    callq memcmp2373; X64-AVX2-NEXT:    testl %eax, %eax2374; X64-AVX2-NEXT:    sete %al2375; X64-AVX2-NEXT:    popq %rcx2376; X64-AVX2-NEXT:    retq2377;2378; X64-AVX512BW-LABEL: length127_eq_const:2379; X64-AVX512BW:       # %bb.0:2380; X64-AVX512BW-NEXT:    vmovdqu64 (%rdi), %zmm02381; X64-AVX512BW-NEXT:    vmovdqu64 63(%rdi), %zmm12382; X64-AVX512BW-NEXT:    vpcmpneqb .L.str+63(%rip), %zmm1, %k02383; X64-AVX512BW-NEXT:    vpcmpneqb .L.str(%rip), %zmm0, %k12384; X64-AVX512BW-NEXT:    kortestq %k0, %k12385; X64-AVX512BW-NEXT:    sete %al2386; X64-AVX512BW-NEXT:    vzeroupper2387; X64-AVX512BW-NEXT:    retq2388;2389; X64-AVX512F-LABEL: length127_eq_const:2390; X64-AVX512F:       # %bb.0:2391; X64-AVX512F-NEXT:    vmovdqu64 (%rdi), %zmm02392; X64-AVX512F-NEXT:    vmovdqu64 63(%rdi), %zmm12393; X64-AVX512F-NEXT:    vpcmpneqd .L.str+63(%rip), %zmm1, %k02394; X64-AVX512F-NEXT:    vpcmpneqd .L.str(%rip), %zmm0, %k12395; X64-AVX512F-NEXT:    kortestw %k0, %k12396; X64-AVX512F-NEXT:    sete %al2397; X64-AVX512F-NEXT:    vzeroupper2398; X64-AVX512F-NEXT:    retq2399;2400; X64-MIC-AVX2-LABEL: length127_eq_const:2401; X64-MIC-AVX2:       # %bb.0:2402; X64-MIC-AVX2-NEXT:    pushq %rax2403; X64-MIC-AVX2-NEXT:    movl $.L.str, %esi2404; X64-MIC-AVX2-NEXT:    movl $127, %edx2405; X64-MIC-AVX2-NEXT:    callq memcmp2406; X64-MIC-AVX2-NEXT:    testl %eax, %eax2407; X64-MIC-AVX2-NEXT:    sete %al2408; X64-MIC-AVX2-NEXT:    popq %rcx2409; X64-MIC-AVX2-NEXT:    retq2410;2411; X64-MIC-AVX512F-LABEL: length127_eq_const:2412; X64-MIC-AVX512F:       # %bb.0:2413; X64-MIC-AVX512F-NEXT:    vmovdqu64 (%rdi), %zmm02414; X64-MIC-AVX512F-NEXT:    vmovdqu64 63(%rdi), %zmm12415; X64-MIC-AVX512F-NEXT:    vpcmpneqd .L.str+63(%rip), %zmm1, %k02416; X64-MIC-AVX512F-NEXT:    vpcmpneqd .L.str(%rip), %zmm0, %k12417; X64-MIC-AVX512F-NEXT:    kortestw %k0, %k12418; X64-MIC-AVX512F-NEXT:    sete %al2419; X64-MIC-AVX512F-NEXT:    vzeroupper2420; X64-MIC-AVX512F-NEXT:    retq2421  %m = tail call i32 @memcmp(ptr %X, ptr @.str, i64 127) nounwind2422  %c = icmp eq i32 %m, 02423  ret i1 %c2424}2425 2426define i32 @length128(ptr %X, ptr %Y) nounwind {2427; X64-LABEL: length128:2428; X64:       # %bb.0:2429; X64-NEXT:    movl $128, %edx2430; X64-NEXT:    jmp memcmp # TAILCALL2431  %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 128) nounwind2432  ret i32 %m2433}2434 2435define i1 @length128_eq(ptr %x, ptr %y) nounwind {2436; X64-SSE-LABEL: length128_eq:2437; X64-SSE:       # %bb.0:2438; X64-SSE-NEXT:    pushq %rax2439; X64-SSE-NEXT:    movl $128, %edx2440; X64-SSE-NEXT:    callq memcmp2441; X64-SSE-NEXT:    testl %eax, %eax2442; X64-SSE-NEXT:    setne %al2443; X64-SSE-NEXT:    popq %rcx2444; X64-SSE-NEXT:    retq2445;2446; X64-AVX1-LABEL: length128_eq:2447; X64-AVX1:       # %bb.0:2448; X64-AVX1-NEXT:    pushq %rax2449; X64-AVX1-NEXT:    movl $128, %edx2450; X64-AVX1-NEXT:    callq memcmp2451; X64-AVX1-NEXT:    testl %eax, %eax2452; X64-AVX1-NEXT:    setne %al2453; X64-AVX1-NEXT:    popq %rcx2454; X64-AVX1-NEXT:    retq2455;2456; X64-AVX2-LABEL: length128_eq:2457; X64-AVX2:       # %bb.0:2458; X64-AVX2-NEXT:    pushq %rax2459; X64-AVX2-NEXT:    movl $128, %edx2460; X64-AVX2-NEXT:    callq memcmp2461; X64-AVX2-NEXT:    testl %eax, %eax2462; X64-AVX2-NEXT:    setne %al2463; X64-AVX2-NEXT:    popq %rcx2464; X64-AVX2-NEXT:    retq2465;2466; X64-AVX512BW-LABEL: length128_eq:2467; X64-AVX512BW:       # %bb.0:2468; X64-AVX512BW-NEXT:    vmovdqu64 (%rdi), %zmm02469; X64-AVX512BW-NEXT:    vmovdqu64 64(%rdi), %zmm12470; X64-AVX512BW-NEXT:    vpcmpneqb 64(%rsi), %zmm1, %k02471; X64-AVX512BW-NEXT:    vpcmpneqb (%rsi), %zmm0, %k12472; X64-AVX512BW-NEXT:    kortestq %k0, %k12473; X64-AVX512BW-NEXT:    setne %al2474; X64-AVX512BW-NEXT:    vzeroupper2475; X64-AVX512BW-NEXT:    retq2476;2477; X64-AVX512F-LABEL: length128_eq:2478; X64-AVX512F:       # %bb.0:2479; X64-AVX512F-NEXT:    vmovdqu64 (%rdi), %zmm02480; X64-AVX512F-NEXT:    vmovdqu64 64(%rdi), %zmm12481; X64-AVX512F-NEXT:    vpcmpneqd 64(%rsi), %zmm1, %k02482; X64-AVX512F-NEXT:    vpcmpneqd (%rsi), %zmm0, %k12483; X64-AVX512F-NEXT:    kortestw %k0, %k12484; X64-AVX512F-NEXT:    setne %al2485; X64-AVX512F-NEXT:    vzeroupper2486; X64-AVX512F-NEXT:    retq2487;2488; X64-MIC-AVX2-LABEL: length128_eq:2489; X64-MIC-AVX2:       # %bb.0:2490; X64-MIC-AVX2-NEXT:    pushq %rax2491; X64-MIC-AVX2-NEXT:    movl $128, %edx2492; X64-MIC-AVX2-NEXT:    callq memcmp2493; X64-MIC-AVX2-NEXT:    testl %eax, %eax2494; X64-MIC-AVX2-NEXT:    setne %al2495; X64-MIC-AVX2-NEXT:    popq %rcx2496; X64-MIC-AVX2-NEXT:    retq2497;2498; X64-MIC-AVX512F-LABEL: length128_eq:2499; X64-MIC-AVX512F:       # %bb.0:2500; X64-MIC-AVX512F-NEXT:    vmovdqu64 (%rdi), %zmm02501; X64-MIC-AVX512F-NEXT:    vmovdqu64 64(%rdi), %zmm12502; X64-MIC-AVX512F-NEXT:    vpcmpneqd 64(%rsi), %zmm1, %k02503; X64-MIC-AVX512F-NEXT:    vpcmpneqd (%rsi), %zmm0, %k12504; X64-MIC-AVX512F-NEXT:    kortestw %k0, %k12505; X64-MIC-AVX512F-NEXT:    setne %al2506; X64-MIC-AVX512F-NEXT:    vzeroupper2507; X64-MIC-AVX512F-NEXT:    retq2508  %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 128) nounwind2509  %cmp = icmp ne i32 %call, 02510  ret i1 %cmp2511}2512 2513define i1 @length128_lt(ptr %x, ptr %y) nounwind {2514; X64-LABEL: length128_lt:2515; X64:       # %bb.0:2516; X64-NEXT:    pushq %rax2517; X64-NEXT:    movl $128, %edx2518; X64-NEXT:    callq memcmp2519; X64-NEXT:    shrl $31, %eax2520; X64-NEXT:    # kill: def $al killed $al killed $eax2521; X64-NEXT:    popq %rcx2522; X64-NEXT:    retq2523  %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 128) nounwind2524  %cmp = icmp slt i32 %call, 02525  ret i1 %cmp2526}2527 2528define i1 @length128_gt(ptr %x, ptr %y) nounwind {2529; X64-LABEL: length128_gt:2530; X64:       # %bb.0:2531; X64-NEXT:    pushq %rax2532; X64-NEXT:    movl $128, %edx2533; X64-NEXT:    callq memcmp2534; X64-NEXT:    testl %eax, %eax2535; X64-NEXT:    setg %al2536; X64-NEXT:    popq %rcx2537; X64-NEXT:    retq2538  %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 128) nounwind2539  %cmp = icmp sgt i32 %call, 02540  ret i1 %cmp2541}2542 2543define i1 @length128_eq_const(ptr %X) nounwind {2544; X64-SSE-LABEL: length128_eq_const:2545; X64-SSE:       # %bb.0:2546; X64-SSE-NEXT:    pushq %rax2547; X64-SSE-NEXT:    movl $.L.str, %esi2548; X64-SSE-NEXT:    movl $128, %edx2549; X64-SSE-NEXT:    callq memcmp2550; X64-SSE-NEXT:    testl %eax, %eax2551; X64-SSE-NEXT:    sete %al2552; X64-SSE-NEXT:    popq %rcx2553; X64-SSE-NEXT:    retq2554;2555; X64-AVX1-LABEL: length128_eq_const:2556; X64-AVX1:       # %bb.0:2557; X64-AVX1-NEXT:    pushq %rax2558; X64-AVX1-NEXT:    movl $.L.str, %esi2559; X64-AVX1-NEXT:    movl $128, %edx2560; X64-AVX1-NEXT:    callq memcmp2561; X64-AVX1-NEXT:    testl %eax, %eax2562; X64-AVX1-NEXT:    sete %al2563; X64-AVX1-NEXT:    popq %rcx2564; X64-AVX1-NEXT:    retq2565;2566; X64-AVX2-LABEL: length128_eq_const:2567; X64-AVX2:       # %bb.0:2568; X64-AVX2-NEXT:    pushq %rax2569; X64-AVX2-NEXT:    movl $.L.str, %esi2570; X64-AVX2-NEXT:    movl $128, %edx2571; X64-AVX2-NEXT:    callq memcmp2572; X64-AVX2-NEXT:    testl %eax, %eax2573; X64-AVX2-NEXT:    sete %al2574; X64-AVX2-NEXT:    popq %rcx2575; X64-AVX2-NEXT:    retq2576;2577; X64-AVX512BW-LABEL: length128_eq_const:2578; X64-AVX512BW:       # %bb.0:2579; X64-AVX512BW-NEXT:    vmovdqu64 (%rdi), %zmm02580; X64-AVX512BW-NEXT:    vmovdqu64 64(%rdi), %zmm12581; X64-AVX512BW-NEXT:    vpcmpneqb .L.str+64(%rip), %zmm1, %k02582; X64-AVX512BW-NEXT:    vpcmpneqb .L.str(%rip), %zmm0, %k12583; X64-AVX512BW-NEXT:    kortestq %k0, %k12584; X64-AVX512BW-NEXT:    sete %al2585; X64-AVX512BW-NEXT:    vzeroupper2586; X64-AVX512BW-NEXT:    retq2587;2588; X64-AVX512F-LABEL: length128_eq_const:2589; X64-AVX512F:       # %bb.0:2590; X64-AVX512F-NEXT:    vmovdqu64 (%rdi), %zmm02591; X64-AVX512F-NEXT:    vmovdqu64 64(%rdi), %zmm12592; X64-AVX512F-NEXT:    vpcmpneqd .L.str+64(%rip), %zmm1, %k02593; X64-AVX512F-NEXT:    vpcmpneqd .L.str(%rip), %zmm0, %k12594; X64-AVX512F-NEXT:    kortestw %k0, %k12595; X64-AVX512F-NEXT:    sete %al2596; X64-AVX512F-NEXT:    vzeroupper2597; X64-AVX512F-NEXT:    retq2598;2599; X64-MIC-AVX2-LABEL: length128_eq_const:2600; X64-MIC-AVX2:       # %bb.0:2601; X64-MIC-AVX2-NEXT:    pushq %rax2602; X64-MIC-AVX2-NEXT:    movl $.L.str, %esi2603; X64-MIC-AVX2-NEXT:    movl $128, %edx2604; X64-MIC-AVX2-NEXT:    callq memcmp2605; X64-MIC-AVX2-NEXT:    testl %eax, %eax2606; X64-MIC-AVX2-NEXT:    sete %al2607; X64-MIC-AVX2-NEXT:    popq %rcx2608; X64-MIC-AVX2-NEXT:    retq2609;2610; X64-MIC-AVX512F-LABEL: length128_eq_const:2611; X64-MIC-AVX512F:       # %bb.0:2612; X64-MIC-AVX512F-NEXT:    vmovdqu64 (%rdi), %zmm02613; X64-MIC-AVX512F-NEXT:    vmovdqu64 64(%rdi), %zmm12614; X64-MIC-AVX512F-NEXT:    vpcmpneqd .L.str+64(%rip), %zmm1, %k02615; X64-MIC-AVX512F-NEXT:    vpcmpneqd .L.str(%rip), %zmm0, %k12616; X64-MIC-AVX512F-NEXT:    kortestw %k0, %k12617; X64-MIC-AVX512F-NEXT:    sete %al2618; X64-MIC-AVX512F-NEXT:    vzeroupper2619; X64-MIC-AVX512F-NEXT:    retq2620  %m = tail call i32 @memcmp(ptr %X, ptr @.str, i64 128) nounwind2621  %c = icmp eq i32 %m, 02622  ret i1 %c2623}2624 2625define i32 @length192(ptr %X, ptr %Y) nounwind {2626; X64-LABEL: length192:2627; X64:       # %bb.0:2628; X64-NEXT:    movl $192, %edx2629; X64-NEXT:    jmp memcmp # TAILCALL2630  %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 192) nounwind2631  ret i32 %m2632}2633 2634define i1 @length192_eq(ptr %x, ptr %y) nounwind {2635; X64-LABEL: length192_eq:2636; X64:       # %bb.0:2637; X64-NEXT:    pushq %rax2638; X64-NEXT:    movl $192, %edx2639; X64-NEXT:    callq memcmp2640; X64-NEXT:    testl %eax, %eax2641; X64-NEXT:    setne %al2642; X64-NEXT:    popq %rcx2643; X64-NEXT:    retq2644  %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 192) nounwind2645  %cmp = icmp ne i32 %call, 02646  ret i1 %cmp2647}2648 2649define i1 @length192_lt(ptr %x, ptr %y) nounwind {2650; X64-LABEL: length192_lt:2651; X64:       # %bb.0:2652; X64-NEXT:    pushq %rax2653; X64-NEXT:    movl $192, %edx2654; X64-NEXT:    callq memcmp2655; X64-NEXT:    shrl $31, %eax2656; X64-NEXT:    # kill: def $al killed $al killed $eax2657; X64-NEXT:    popq %rcx2658; X64-NEXT:    retq2659  %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 192) nounwind2660  %cmp = icmp slt i32 %call, 02661  ret i1 %cmp2662}2663 2664define i1 @length192_gt(ptr %x, ptr %y) nounwind {2665; X64-LABEL: length192_gt:2666; X64:       # %bb.0:2667; X64-NEXT:    pushq %rax2668; X64-NEXT:    movl $192, %edx2669; X64-NEXT:    callq memcmp2670; X64-NEXT:    testl %eax, %eax2671; X64-NEXT:    setg %al2672; X64-NEXT:    popq %rcx2673; X64-NEXT:    retq2674  %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 192) nounwind2675  %cmp = icmp sgt i32 %call, 02676  ret i1 %cmp2677}2678 2679define i1 @length192_eq_const(ptr %X) nounwind {2680; X64-LABEL: length192_eq_const:2681; X64:       # %bb.0:2682; X64-NEXT:    pushq %rax2683; X64-NEXT:    movl $.L.str, %esi2684; X64-NEXT:    movl $192, %edx2685; X64-NEXT:    callq memcmp2686; X64-NEXT:    testl %eax, %eax2687; X64-NEXT:    sete %al2688; X64-NEXT:    popq %rcx2689; X64-NEXT:    retq2690  %m = tail call i32 @memcmp(ptr %X, ptr @.str, i64 192) nounwind2691  %c = icmp eq i32 %m, 02692  ret i1 %c2693}2694 2695define i32 @length255(ptr %X, ptr %Y) nounwind {2696; X64-LABEL: length255:2697; X64:       # %bb.0:2698; X64-NEXT:    movl $255, %edx2699; X64-NEXT:    jmp memcmp # TAILCALL2700  %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 255) nounwind2701  ret i32 %m2702}2703 2704define i1 @length255_eq(ptr %x, ptr %y) nounwind {2705; X64-LABEL: length255_eq:2706; X64:       # %bb.0:2707; X64-NEXT:    pushq %rax2708; X64-NEXT:    movl $255, %edx2709; X64-NEXT:    callq memcmp2710; X64-NEXT:    testl %eax, %eax2711; X64-NEXT:    setne %al2712; X64-NEXT:    popq %rcx2713; X64-NEXT:    retq2714  %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 255) nounwind2715  %cmp = icmp ne i32 %call, 02716  ret i1 %cmp2717}2718 2719define i1 @length255_lt(ptr %x, ptr %y) nounwind {2720; X64-LABEL: length255_lt:2721; X64:       # %bb.0:2722; X64-NEXT:    pushq %rax2723; X64-NEXT:    movl $255, %edx2724; X64-NEXT:    callq memcmp2725; X64-NEXT:    shrl $31, %eax2726; X64-NEXT:    # kill: def $al killed $al killed $eax2727; X64-NEXT:    popq %rcx2728; X64-NEXT:    retq2729  %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 255) nounwind2730  %cmp = icmp slt i32 %call, 02731  ret i1 %cmp2732}2733 2734define i1 @length255_gt(ptr %x, ptr %y) nounwind {2735; X64-LABEL: length255_gt:2736; X64:       # %bb.0:2737; X64-NEXT:    pushq %rax2738; X64-NEXT:    movl $255, %edx2739; X64-NEXT:    callq memcmp2740; X64-NEXT:    testl %eax, %eax2741; X64-NEXT:    setg %al2742; X64-NEXT:    popq %rcx2743; X64-NEXT:    retq2744  %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 255) nounwind2745  %cmp = icmp sgt i32 %call, 02746  ret i1 %cmp2747}2748 2749define i1 @length255_eq_const(ptr %X) nounwind {2750; X64-LABEL: length255_eq_const:2751; X64:       # %bb.0:2752; X64-NEXT:    pushq %rax2753; X64-NEXT:    movl $.L.str, %esi2754; X64-NEXT:    movl $255, %edx2755; X64-NEXT:    callq memcmp2756; X64-NEXT:    testl %eax, %eax2757; X64-NEXT:    sete %al2758; X64-NEXT:    popq %rcx2759; X64-NEXT:    retq2760  %m = tail call i32 @memcmp(ptr %X, ptr @.str, i64 255) nounwind2761  %c = icmp eq i32 %m, 02762  ret i1 %c2763}2764 2765define i32 @length256(ptr %X, ptr %Y) nounwind {2766; X64-LABEL: length256:2767; X64:       # %bb.0:2768; X64-NEXT:    movl $256, %edx # imm = 0x1002769; X64-NEXT:    jmp memcmp # TAILCALL2770  %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 256) nounwind2771  ret i32 %m2772}2773 2774define i1 @length256_eq(ptr %x, ptr %y) nounwind {2775; X64-LABEL: length256_eq:2776; X64:       # %bb.0:2777; X64-NEXT:    pushq %rax2778; X64-NEXT:    movl $256, %edx # imm = 0x1002779; X64-NEXT:    callq memcmp2780; X64-NEXT:    testl %eax, %eax2781; X64-NEXT:    setne %al2782; X64-NEXT:    popq %rcx2783; X64-NEXT:    retq2784  %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 256) nounwind2785  %cmp = icmp ne i32 %call, 02786  ret i1 %cmp2787}2788 2789define i1 @length256_lt(ptr %x, ptr %y) nounwind {2790; X64-LABEL: length256_lt:2791; X64:       # %bb.0:2792; X64-NEXT:    pushq %rax2793; X64-NEXT:    movl $256, %edx # imm = 0x1002794; X64-NEXT:    callq memcmp2795; X64-NEXT:    shrl $31, %eax2796; X64-NEXT:    # kill: def $al killed $al killed $eax2797; X64-NEXT:    popq %rcx2798; X64-NEXT:    retq2799  %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 256) nounwind2800  %cmp = icmp slt i32 %call, 02801  ret i1 %cmp2802}2803 2804define i1 @length256_gt(ptr %x, ptr %y) nounwind {2805; X64-LABEL: length256_gt:2806; X64:       # %bb.0:2807; X64-NEXT:    pushq %rax2808; X64-NEXT:    movl $256, %edx # imm = 0x1002809; X64-NEXT:    callq memcmp2810; X64-NEXT:    testl %eax, %eax2811; X64-NEXT:    setg %al2812; X64-NEXT:    popq %rcx2813; X64-NEXT:    retq2814  %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 256) nounwind2815  %cmp = icmp sgt i32 %call, 02816  ret i1 %cmp2817}2818 2819define i1 @length256_eq_const(ptr %X) nounwind {2820; X64-LABEL: length256_eq_const:2821; X64:       # %bb.0:2822; X64-NEXT:    pushq %rax2823; X64-NEXT:    movl $.L.str, %esi2824; X64-NEXT:    movl $256, %edx # imm = 0x1002825; X64-NEXT:    callq memcmp2826; X64-NEXT:    testl %eax, %eax2827; X64-NEXT:    sete %al2828; X64-NEXT:    popq %rcx2829; X64-NEXT:    retq2830  %m = tail call i32 @memcmp(ptr %X, ptr @.str, i64 256) nounwind2831  %c = icmp eq i32 %m, 02832  ret i1 %c2833}2834 2835define i32 @length384(ptr %X, ptr %Y) nounwind {2836; X64-LABEL: length384:2837; X64:       # %bb.0:2838; X64-NEXT:    movl $384, %edx # imm = 0x1802839; X64-NEXT:    jmp memcmp # TAILCALL2840  %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 384) nounwind2841  ret i32 %m2842}2843 2844define i1 @length384_eq(ptr %x, ptr %y) nounwind {2845; X64-LABEL: length384_eq:2846; X64:       # %bb.0:2847; X64-NEXT:    pushq %rax2848; X64-NEXT:    movl $384, %edx # imm = 0x1802849; X64-NEXT:    callq memcmp2850; X64-NEXT:    testl %eax, %eax2851; X64-NEXT:    setne %al2852; X64-NEXT:    popq %rcx2853; X64-NEXT:    retq2854  %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 384) nounwind2855  %cmp = icmp ne i32 %call, 02856  ret i1 %cmp2857}2858 2859define i1 @length384_lt(ptr %x, ptr %y) nounwind {2860; X64-LABEL: length384_lt:2861; X64:       # %bb.0:2862; X64-NEXT:    pushq %rax2863; X64-NEXT:    movl $384, %edx # imm = 0x1802864; X64-NEXT:    callq memcmp2865; X64-NEXT:    shrl $31, %eax2866; X64-NEXT:    # kill: def $al killed $al killed $eax2867; X64-NEXT:    popq %rcx2868; X64-NEXT:    retq2869  %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 384) nounwind2870  %cmp = icmp slt i32 %call, 02871  ret i1 %cmp2872}2873 2874define i1 @length384_gt(ptr %x, ptr %y) nounwind {2875; X64-LABEL: length384_gt:2876; X64:       # %bb.0:2877; X64-NEXT:    pushq %rax2878; X64-NEXT:    movl $384, %edx # imm = 0x1802879; X64-NEXT:    callq memcmp2880; X64-NEXT:    testl %eax, %eax2881; X64-NEXT:    setg %al2882; X64-NEXT:    popq %rcx2883; X64-NEXT:    retq2884  %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 384) nounwind2885  %cmp = icmp sgt i32 %call, 02886  ret i1 %cmp2887}2888 2889define i1 @length384_eq_const(ptr %X) nounwind {2890; X64-LABEL: length384_eq_const:2891; X64:       # %bb.0:2892; X64-NEXT:    pushq %rax2893; X64-NEXT:    movl $.L.str, %esi2894; X64-NEXT:    movl $384, %edx # imm = 0x1802895; X64-NEXT:    callq memcmp2896; X64-NEXT:    testl %eax, %eax2897; X64-NEXT:    sete %al2898; X64-NEXT:    popq %rcx2899; X64-NEXT:    retq2900  %m = tail call i32 @memcmp(ptr %X, ptr @.str, i64 384) nounwind2901  %c = icmp eq i32 %m, 02902  ret i1 %c2903}2904 2905define i32 @length511(ptr %X, ptr %Y) nounwind {2906; X64-LABEL: length511:2907; X64:       # %bb.0:2908; X64-NEXT:    movl $511, %edx # imm = 0x1FF2909; X64-NEXT:    jmp memcmp # TAILCALL2910  %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 511) nounwind2911  ret i32 %m2912}2913 2914define i1 @length511_eq(ptr %x, ptr %y) nounwind {2915; X64-LABEL: length511_eq:2916; X64:       # %bb.0:2917; X64-NEXT:    pushq %rax2918; X64-NEXT:    movl $511, %edx # imm = 0x1FF2919; X64-NEXT:    callq memcmp2920; X64-NEXT:    testl %eax, %eax2921; X64-NEXT:    setne %al2922; X64-NEXT:    popq %rcx2923; X64-NEXT:    retq2924  %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 511) nounwind2925  %cmp = icmp ne i32 %call, 02926  ret i1 %cmp2927}2928 2929define i1 @length511_lt(ptr %x, ptr %y) nounwind {2930; X64-LABEL: length511_lt:2931; X64:       # %bb.0:2932; X64-NEXT:    pushq %rax2933; X64-NEXT:    movl $511, %edx # imm = 0x1FF2934; X64-NEXT:    callq memcmp2935; X64-NEXT:    shrl $31, %eax2936; X64-NEXT:    # kill: def $al killed $al killed $eax2937; X64-NEXT:    popq %rcx2938; X64-NEXT:    retq2939  %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 511) nounwind2940  %cmp = icmp slt i32 %call, 02941  ret i1 %cmp2942}2943 2944define i1 @length511_gt(ptr %x, ptr %y) nounwind {2945; X64-LABEL: length511_gt:2946; X64:       # %bb.0:2947; X64-NEXT:    pushq %rax2948; X64-NEXT:    movl $511, %edx # imm = 0x1FF2949; X64-NEXT:    callq memcmp2950; X64-NEXT:    testl %eax, %eax2951; X64-NEXT:    setg %al2952; X64-NEXT:    popq %rcx2953; X64-NEXT:    retq2954  %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 511) nounwind2955  %cmp = icmp sgt i32 %call, 02956  ret i1 %cmp2957}2958 2959define i1 @length511_eq_const(ptr %X) nounwind {2960; X64-LABEL: length511_eq_const:2961; X64:       # %bb.0:2962; X64-NEXT:    pushq %rax2963; X64-NEXT:    movl $.L.str, %esi2964; X64-NEXT:    movl $511, %edx # imm = 0x1FF2965; X64-NEXT:    callq memcmp2966; X64-NEXT:    testl %eax, %eax2967; X64-NEXT:    sete %al2968; X64-NEXT:    popq %rcx2969; X64-NEXT:    retq2970  %m = tail call i32 @memcmp(ptr %X, ptr @.str, i64 511) nounwind2971  %c = icmp eq i32 %m, 02972  ret i1 %c2973}2974 2975define i32 @length512(ptr %X, ptr %Y) nounwind {2976; X64-LABEL: length512:2977; X64:       # %bb.0:2978; X64-NEXT:    movl $512, %edx # imm = 0x2002979; X64-NEXT:    jmp memcmp # TAILCALL2980  %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 512) nounwind2981  ret i32 %m2982}2983 2984define i1 @length512_eq(ptr %x, ptr %y) nounwind {2985; X64-LABEL: length512_eq:2986; X64:       # %bb.0:2987; X64-NEXT:    pushq %rax2988; X64-NEXT:    movl $512, %edx # imm = 0x2002989; X64-NEXT:    callq memcmp2990; X64-NEXT:    testl %eax, %eax2991; X64-NEXT:    setne %al2992; X64-NEXT:    popq %rcx2993; X64-NEXT:    retq2994  %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 512) nounwind2995  %cmp = icmp ne i32 %call, 02996  ret i1 %cmp2997}2998 2999define i1 @length512_lt(ptr %x, ptr %y) nounwind {3000; X64-LABEL: length512_lt:3001; X64:       # %bb.0:3002; X64-NEXT:    pushq %rax3003; X64-NEXT:    movl $512, %edx # imm = 0x2003004; X64-NEXT:    callq memcmp3005; X64-NEXT:    shrl $31, %eax3006; X64-NEXT:    # kill: def $al killed $al killed $eax3007; X64-NEXT:    popq %rcx3008; X64-NEXT:    retq3009  %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 512) nounwind3010  %cmp = icmp slt i32 %call, 03011  ret i1 %cmp3012}3013 3014define i1 @length512_gt(ptr %x, ptr %y) nounwind {3015; X64-LABEL: length512_gt:3016; X64:       # %bb.0:3017; X64-NEXT:    pushq %rax3018; X64-NEXT:    movl $512, %edx # imm = 0x2003019; X64-NEXT:    callq memcmp3020; X64-NEXT:    testl %eax, %eax3021; X64-NEXT:    setg %al3022; X64-NEXT:    popq %rcx3023; X64-NEXT:    retq3024  %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 512) nounwind3025  %cmp = icmp sgt i32 %call, 03026  ret i1 %cmp3027}3028 3029define i1 @length512_eq_const(ptr %X) nounwind {3030; X64-LABEL: length512_eq_const:3031; X64:       # %bb.0:3032; X64-NEXT:    pushq %rax3033; X64-NEXT:    movl $.L.str, %esi3034; X64-NEXT:    movl $512, %edx # imm = 0x2003035; X64-NEXT:    callq memcmp3036; X64-NEXT:    testl %eax, %eax3037; X64-NEXT:    sete %al3038; X64-NEXT:    popq %rcx3039; X64-NEXT:    retq3040  %m = tail call i32 @memcmp(ptr %X, ptr @.str, i64 512) nounwind3041  %c = icmp eq i32 %m, 03042  ret i1 %c3043}3044 3045; This checks that we do not do stupid things with huge sizes.3046define i32 @huge_length(ptr %X, ptr %Y) nounwind {3047; X64-LABEL: huge_length:3048; X64:       # %bb.0:3049; X64-NEXT:    movabsq $9223372036854775807, %rdx # imm = 0x7FFFFFFFFFFFFFFF3050; X64-NEXT:    jmp memcmp # TAILCALL3051  %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 9223372036854775807) nounwind3052  ret i32 %m3053}3054 3055define i1 @huge_length_eq(ptr %X, ptr %Y) nounwind {3056; X64-LABEL: huge_length_eq:3057; X64:       # %bb.0:3058; X64-NEXT:    pushq %rax3059; X64-NEXT:    movabsq $9223372036854775807, %rdx # imm = 0x7FFFFFFFFFFFFFFF3060; X64-NEXT:    callq memcmp3061; X64-NEXT:    testl %eax, %eax3062; X64-NEXT:    sete %al3063; X64-NEXT:    popq %rcx3064; X64-NEXT:    retq3065  %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 9223372036854775807) nounwind3066  %c = icmp eq i32 %m, 03067  ret i1 %c3068}3069 3070; This checks non-constant sizes.3071define i32 @nonconst_length(ptr %X, ptr %Y, i64 %size) nounwind {3072; X64-LABEL: nonconst_length:3073; X64:       # %bb.0:3074; X64-NEXT:    jmp memcmp # TAILCALL3075  %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 %size) nounwind3076  ret i32 %m3077}3078 3079define i1 @nonconst_length_eq(ptr %X, ptr %Y, i64 %size) nounwind {3080; X64-LABEL: nonconst_length_eq:3081; X64:       # %bb.0:3082; X64-NEXT:    pushq %rax3083; X64-NEXT:    callq memcmp3084; X64-NEXT:    testl %eax, %eax3085; X64-NEXT:    sete %al3086; X64-NEXT:    popq %rcx3087; X64-NEXT:    retq3088  %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 %size) nounwind3089  %c = icmp eq i32 %m, 03090  ret i1 %c3091}3092