4003 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; NOTE: This is a copy of llvm/test/CodeGen/X86/memcmp.ll with more load pairs. Please keep it that way.3; RUN: llc -max-loads-per-memcmp=4 -memcmp-num-loads-per-block=4 < %s -mtriple=x86_64-unknown-unknown | FileCheck %s --check-prefixes=X64,X64-SSE,X64-SSE24; RUN: llc -max-loads-per-memcmp=4 -memcmp-num-loads-per-block=4 < %s -mtriple=x86_64-unknown-unknown -mattr=sse4.1 | FileCheck %s --check-prefixes=X64,X64-SSE,X64-SSE415; RUN: llc -max-loads-per-memcmp=4 -memcmp-num-loads-per-block=4 < %s -mtriple=x86_64-unknown-unknown -mattr=avx | FileCheck %s --check-prefixes=X64,X64-AVX,X64-AVX16; RUN: llc -max-loads-per-memcmp=4 -memcmp-num-loads-per-block=4 < %s -mtriple=x86_64-unknown-unknown -mattr=avx2 | FileCheck %s --check-prefixes=X64,X64-AVX,X64-AVX27; RUN: llc -max-loads-per-memcmp=4 -memcmp-num-loads-per-block=4 < %s -mtriple=x86_64-unknown-unknown -mattr=avx512bw,+prefer-256-bit | FileCheck %s --check-prefixes=X64,X64-AVX,X64-AVX28; RUN: llc -max-loads-per-memcmp=4 -memcmp-num-loads-per-block=4 < %s -mtriple=x86_64-unknown-unknown -mattr=avx512bw,-prefer-256-bit | FileCheck %s --check-prefixes=X64,X64-AVX,X64-AVX512,X64-AVX512BW9; RUN: llc -max-loads-per-memcmp=4 -memcmp-num-loads-per-block=4 < %s -mtriple=x86_64-unknown-unknown -mattr=avx512f,+prefer-256-bit,-prefer-mask-registers | FileCheck %s --check-prefixes=X64,X64-AVX,X64-AVX210; RUN: llc -max-loads-per-memcmp=4 -memcmp-num-loads-per-block=4 < %s -mtriple=x86_64-unknown-unknown -mattr=avx512f,-prefer-256-bit,-prefer-mask-registers | FileCheck %s --check-prefixes=X64,X64-AVX,X64-AVX512,X64-AVX512F11; RUN: llc -max-loads-per-memcmp=4 -memcmp-num-loads-per-block=4 < %s -mtriple=x86_64-unknown-unknown -mattr=avx512f,+prefer-256-bit,+prefer-mask-registers | FileCheck %s --check-prefixes=X64,X64-MIC-AVX,X64-MIC-AVX212; RUN: llc -max-loads-per-memcmp=4 -memcmp-num-loads-per-block=4 < %s -mtriple=x86_64-unknown-unknown -mattr=avx512f,-prefer-256-bit,+prefer-mask-registers | FileCheck %s --check-prefixes=X64,X64-MIC-AVX,X64-MIC-AVX512F13 14; This tests codegen time inlining/optimization of memcmp15; rdar://648039816 17@.str = private constant [513 x i8] c"01234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901\00", align 118 19declare dso_local i32 @memcmp(ptr, ptr, i64)20 21define i32 @length0(ptr %X, ptr %Y) nounwind {22; X64-LABEL: length0:23; X64: # %bb.0:24; X64-NEXT: xorl %eax, %eax25; X64-NEXT: retq26 %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 0) nounwind27 ret i32 %m28 }29 30define i1 @length0_eq(ptr %X, ptr %Y) nounwind {31; X64-LABEL: length0_eq:32; X64: # %bb.0:33; X64-NEXT: movb $1, %al34; X64-NEXT: retq35 %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 0) nounwind36 %c = icmp eq i32 %m, 037 ret i1 %c38}39 40define i1 @length0_lt(ptr %X, ptr %Y) nounwind {41; X64-LABEL: length0_lt:42; X64: # %bb.0:43; X64-NEXT: xorl %eax, %eax44; X64-NEXT: retq45 %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 0) nounwind46 %c = icmp slt i32 %m, 047 ret i1 %c48}49 50define i32 @length2(ptr %X, ptr %Y) nounwind {51; X64-LABEL: length2:52; X64: # %bb.0:53; X64-NEXT: movzwl (%rdi), %eax54; X64-NEXT: movzwl (%rsi), %ecx55; X64-NEXT: rolw $8, %ax56; X64-NEXT: rolw $8, %cx57; X64-NEXT: movzwl %ax, %eax58; X64-NEXT: movzwl %cx, %ecx59; X64-NEXT: subl %ecx, %eax60; X64-NEXT: retq61 %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 2) nounwind62 ret i32 %m63}64 65define i1 @length2_eq(ptr %X, ptr %Y) nounwind {66; X64-LABEL: length2_eq:67; X64: # %bb.0:68; X64-NEXT: movzwl (%rdi), %eax69; X64-NEXT: cmpw (%rsi), %ax70; X64-NEXT: sete %al71; X64-NEXT: retq72 %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 2) nounwind73 %c = icmp eq i32 %m, 074 ret i1 %c75}76 77define i1 @length2_lt(ptr %X, ptr %Y) nounwind {78; X64-LABEL: length2_lt:79; X64: # %bb.0:80; X64-NEXT: movzwl (%rdi), %eax81; X64-NEXT: movzwl (%rsi), %ecx82; X64-NEXT: rolw $8, %ax83; X64-NEXT: rolw $8, %cx84; X64-NEXT: movzwl %ax, %eax85; X64-NEXT: movzwl %cx, %ecx86; X64-NEXT: subl %ecx, %eax87; X64-NEXT: shrl $31, %eax88; X64-NEXT: # kill: def $al killed $al killed $eax89; X64-NEXT: retq90 %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 2) nounwind91 %c = icmp slt i32 %m, 092 ret i1 %c93}94 95define i1 @length2_gt(ptr %X, ptr %Y) nounwind {96; X64-LABEL: length2_gt:97; X64: # %bb.0:98; X64-NEXT: movzwl (%rdi), %eax99; X64-NEXT: movzwl (%rsi), %ecx100; X64-NEXT: rolw $8, %ax101; X64-NEXT: rolw $8, %cx102; X64-NEXT: movzwl %ax, %eax103; X64-NEXT: movzwl %cx, %ecx104; X64-NEXT: subl %ecx, %eax105; X64-NEXT: testl %eax, %eax106; X64-NEXT: setg %al107; X64-NEXT: retq108 %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 2) nounwind109 %c = icmp sgt i32 %m, 0110 ret i1 %c111}112 113define i1 @length2_eq_const(ptr %X) nounwind {114; X64-LABEL: length2_eq_const:115; X64: # %bb.0:116; X64-NEXT: cmpw $12849, (%rdi) # imm = 0x3231117; X64-NEXT: setne %al118; X64-NEXT: retq119 %m = tail call i32 @memcmp(ptr %X, ptr getelementptr inbounds ([513 x i8], ptr @.str, i32 0, i32 1), i64 2) nounwind120 %c = icmp ne i32 %m, 0121 ret i1 %c122}123 124define i1 @length2_eq_nobuiltin_attr(ptr %X, ptr %Y) nounwind {125; X64-LABEL: length2_eq_nobuiltin_attr:126; X64: # %bb.0:127; X64-NEXT: pushq %rax128; X64-NEXT: movl $2, %edx129; X64-NEXT: callq memcmp130; X64-NEXT: testl %eax, %eax131; X64-NEXT: sete %al132; X64-NEXT: popq %rcx133; X64-NEXT: retq134 %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 2) nounwind nobuiltin135 %c = icmp eq i32 %m, 0136 ret i1 %c137}138 139define i32 @length3(ptr %X, ptr %Y) nounwind {140; X64-LABEL: length3:141; X64: # %bb.0:142; X64-NEXT: movzwl (%rdi), %eax143; X64-NEXT: movzwl (%rsi), %ecx144; X64-NEXT: rolw $8, %ax145; X64-NEXT: rolw $8, %cx146; X64-NEXT: cmpw %cx, %ax147; X64-NEXT: jne .LBB9_3148; X64-NEXT: # %bb.1: # %loadbb1149; X64-NEXT: movzbl 2(%rdi), %eax150; X64-NEXT: movzbl 2(%rsi), %ecx151; X64-NEXT: subl %ecx, %eax152; X64-NEXT: retq153; X64-NEXT: .LBB9_3: # %res_block154; X64-NEXT: setae %al155; X64-NEXT: movzbl %al, %eax156; X64-NEXT: leal -1(%rax,%rax), %eax157; X64-NEXT: retq158 %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 3) nounwind159 ret i32 %m160}161 162define i1 @length3_eq(ptr %X, ptr %Y) nounwind {163; X64-LABEL: length3_eq:164; X64: # %bb.0:165; X64-NEXT: movzwl (%rdi), %eax166; X64-NEXT: xorw (%rsi), %ax167; X64-NEXT: movzbl 2(%rdi), %ecx168; X64-NEXT: xorb 2(%rsi), %cl169; X64-NEXT: movzbl %cl, %ecx170; X64-NEXT: orw %ax, %cx171; X64-NEXT: setne %al172; X64-NEXT: retq173 %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 3) nounwind174 %c = icmp ne i32 %m, 0175 ret i1 %c176}177 178define i32 @length4(ptr %X, ptr %Y) nounwind {179; X64-LABEL: length4:180; X64: # %bb.0:181; X64-NEXT: movl (%rdi), %eax182; X64-NEXT: movl (%rsi), %ecx183; X64-NEXT: bswapl %eax184; X64-NEXT: bswapl %ecx185; X64-NEXT: cmpl %ecx, %eax186; X64-NEXT: seta %al187; X64-NEXT: sbbb $0, %al188; X64-NEXT: movsbl %al, %eax189; X64-NEXT: retq190 %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 4) nounwind191 ret i32 %m192}193 194define i1 @length4_eq(ptr %X, ptr %Y) nounwind {195; X64-LABEL: length4_eq:196; X64: # %bb.0:197; X64-NEXT: movl (%rdi), %eax198; X64-NEXT: cmpl (%rsi), %eax199; X64-NEXT: setne %al200; X64-NEXT: retq201 %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 4) nounwind202 %c = icmp ne i32 %m, 0203 ret i1 %c204}205 206define i1 @length4_lt(ptr %X, ptr %Y) nounwind {207; X64-LABEL: length4_lt:208; X64: # %bb.0:209; X64-NEXT: movl (%rdi), %eax210; X64-NEXT: movl (%rsi), %ecx211; X64-NEXT: bswapl %eax212; X64-NEXT: bswapl %ecx213; X64-NEXT: cmpl %ecx, %eax214; X64-NEXT: setb %al215; X64-NEXT: retq216 %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 4) nounwind217 %c = icmp slt i32 %m, 0218 ret i1 %c219}220 221define i1 @length4_gt(ptr %X, ptr %Y) nounwind {222; X64-LABEL: length4_gt:223; X64: # %bb.0:224; X64-NEXT: movl (%rdi), %eax225; X64-NEXT: movl (%rsi), %ecx226; X64-NEXT: bswapl %eax227; X64-NEXT: bswapl %ecx228; X64-NEXT: cmpl %ecx, %eax229; X64-NEXT: seta %al230; X64-NEXT: retq231 %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 4) nounwind232 %c = icmp sgt i32 %m, 0233 ret i1 %c234}235 236define i1 @length4_eq_const(ptr %X) nounwind {237; X64-LABEL: length4_eq_const:238; X64: # %bb.0:239; X64-NEXT: cmpl $875770417, (%rdi) # imm = 0x34333231240; X64-NEXT: sete %al241; X64-NEXT: retq242 %m = tail call i32 @memcmp(ptr %X, ptr getelementptr inbounds ([513 x i8], ptr @.str, i32 0, i32 1), i64 4) nounwind243 %c = icmp eq i32 %m, 0244 ret i1 %c245}246 247define i32 @length5(ptr %X, ptr %Y) nounwind {248; X64-LABEL: length5: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: jne .LBB16_3256; X64-NEXT: # %bb.1: # %loadbb1257; X64-NEXT: movzbl 4(%rdi), %eax258; X64-NEXT: movzbl 4(%rsi), %ecx259; X64-NEXT: subl %ecx, %eax260; X64-NEXT: retq261; X64-NEXT: .LBB16_3: # %res_block262; X64-NEXT: setae %al263; X64-NEXT: movzbl %al, %eax264; X64-NEXT: leal -1(%rax,%rax), %eax265; X64-NEXT: retq266 %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 5) nounwind267 ret i32 %m268}269 270define i1 @length5_eq(ptr %X, ptr %Y) nounwind {271; X64-LABEL: length5_eq:272; X64: # %bb.0:273; X64-NEXT: movl (%rdi), %eax274; X64-NEXT: xorl (%rsi), %eax275; X64-NEXT: movzbl 4(%rdi), %ecx276; X64-NEXT: xorb 4(%rsi), %cl277; X64-NEXT: movzbl %cl, %ecx278; X64-NEXT: orl %eax, %ecx279; X64-NEXT: setne %al280; X64-NEXT: retq281 %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 5) nounwind282 %c = icmp ne i32 %m, 0283 ret i1 %c284}285 286define i1 @length5_lt(ptr %X, ptr %Y) nounwind {287; X64-LABEL: length5_lt:288; X64: # %bb.0:289; X64-NEXT: movl (%rdi), %eax290; X64-NEXT: movl (%rsi), %ecx291; X64-NEXT: bswapl %eax292; X64-NEXT: bswapl %ecx293; X64-NEXT: cmpl %ecx, %eax294; X64-NEXT: jne .LBB18_3295; X64-NEXT: # %bb.1: # %loadbb1296; X64-NEXT: movzbl 4(%rdi), %eax297; X64-NEXT: movzbl 4(%rsi), %ecx298; X64-NEXT: subl %ecx, %eax299; X64-NEXT: shrl $31, %eax300; X64-NEXT: # kill: def $al killed $al killed $eax301; X64-NEXT: retq302; X64-NEXT: .LBB18_3: # %res_block303; X64-NEXT: setae %al304; X64-NEXT: movzbl %al, %eax305; X64-NEXT: leal -1(%rax,%rax), %eax306; X64-NEXT: shrl $31, %eax307; X64-NEXT: # kill: def $al killed $al killed $eax308; X64-NEXT: retq309 %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 5) nounwind310 %c = icmp slt i32 %m, 0311 ret i1 %c312}313 314define i32 @length7(ptr %X, ptr %Y) nounwind {315; X64-LABEL: length7:316; X64: # %bb.0:317; X64-NEXT: movl (%rdi), %ecx318; X64-NEXT: movl (%rsi), %edx319; X64-NEXT: bswapl %ecx320; X64-NEXT: bswapl %edx321; X64-NEXT: cmpl %edx, %ecx322; X64-NEXT: jne .LBB19_2323; X64-NEXT: # %bb.1: # %loadbb1324; X64-NEXT: movl 3(%rdi), %ecx325; X64-NEXT: movl 3(%rsi), %edx326; X64-NEXT: bswapl %ecx327; X64-NEXT: bswapl %edx328; X64-NEXT: xorl %eax, %eax329; X64-NEXT: cmpl %edx, %ecx330; X64-NEXT: je .LBB19_3331; X64-NEXT: .LBB19_2: # %res_block332; X64-NEXT: xorl %eax, %eax333; X64-NEXT: cmpl %edx, %ecx334; X64-NEXT: setae %al335; X64-NEXT: leal -1(%rax,%rax), %eax336; X64-NEXT: .LBB19_3: # %endblock337; X64-NEXT: retq338 %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 7) nounwind339 ret i32 %m340}341 342define i1 @length7_eq(ptr %X, ptr %Y) nounwind {343; X64-LABEL: length7_eq:344; X64: # %bb.0:345; X64-NEXT: movl (%rdi), %eax346; X64-NEXT: movl 3(%rdi), %ecx347; X64-NEXT: xorl (%rsi), %eax348; X64-NEXT: xorl 3(%rsi), %ecx349; X64-NEXT: orl %eax, %ecx350; X64-NEXT: setne %al351; X64-NEXT: retq352 %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 7) nounwind353 %c = icmp ne i32 %m, 0354 ret i1 %c355}356 357define i1 @length7_lt(ptr %X, ptr %Y) nounwind {358; X64-LABEL: length7_lt:359; X64: # %bb.0:360; X64-NEXT: movl (%rdi), %ecx361; X64-NEXT: movl (%rsi), %edx362; X64-NEXT: bswapl %ecx363; X64-NEXT: bswapl %edx364; X64-NEXT: cmpl %edx, %ecx365; X64-NEXT: jne .LBB21_2366; X64-NEXT: # %bb.1: # %loadbb1367; X64-NEXT: movl 3(%rdi), %ecx368; X64-NEXT: movl 3(%rsi), %edx369; X64-NEXT: bswapl %ecx370; X64-NEXT: bswapl %edx371; X64-NEXT: xorl %eax, %eax372; X64-NEXT: cmpl %edx, %ecx373; X64-NEXT: je .LBB21_3374; X64-NEXT: .LBB21_2: # %res_block375; X64-NEXT: xorl %eax, %eax376; X64-NEXT: cmpl %edx, %ecx377; X64-NEXT: setae %al378; X64-NEXT: leal -1(%rax,%rax), %eax379; X64-NEXT: .LBB21_3: # %endblock380; X64-NEXT: shrl $31, %eax381; X64-NEXT: # kill: def $al killed $al killed $eax382; X64-NEXT: retq383 %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 7) nounwind384 %c = icmp slt i32 %m, 0385 ret i1 %c386}387 388define i32 @length8(ptr %X, ptr %Y) nounwind {389; X64-LABEL: length8:390; X64: # %bb.0:391; X64-NEXT: movq (%rdi), %rax392; X64-NEXT: movq (%rsi), %rcx393; X64-NEXT: bswapq %rax394; X64-NEXT: bswapq %rcx395; X64-NEXT: cmpq %rcx, %rax396; X64-NEXT: seta %al397; X64-NEXT: sbbb $0, %al398; X64-NEXT: movsbl %al, %eax399; X64-NEXT: retq400 %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 8) nounwind401 ret i32 %m402}403 404define i1 @length8_eq(ptr %X, ptr %Y) nounwind {405; X64-LABEL: length8_eq:406; X64: # %bb.0:407; X64-NEXT: movq (%rdi), %rax408; X64-NEXT: cmpq (%rsi), %rax409; X64-NEXT: sete %al410; X64-NEXT: retq411 %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 8) nounwind412 %c = icmp eq i32 %m, 0413 ret i1 %c414}415 416define i1 @length8_eq_const(ptr %X) nounwind {417; X64-LABEL: length8_eq_const:418; X64: # %bb.0:419; X64-NEXT: movabsq $3978425819141910832, %rax # imm = 0x3736353433323130420; X64-NEXT: cmpq %rax, (%rdi)421; X64-NEXT: setne %al422; X64-NEXT: retq423 %m = tail call i32 @memcmp(ptr %X, ptr @.str, i64 8) nounwind424 %c = icmp ne i32 %m, 0425 ret i1 %c426}427 428define i1 @length9_eq(ptr %X, ptr %Y) nounwind {429; X64-LABEL: length9_eq:430; X64: # %bb.0:431; X64-NEXT: movq (%rdi), %rax432; X64-NEXT: xorq (%rsi), %rax433; X64-NEXT: movzbl 8(%rdi), %ecx434; X64-NEXT: xorb 8(%rsi), %cl435; X64-NEXT: movzbl %cl, %ecx436; X64-NEXT: orq %rax, %rcx437; X64-NEXT: sete %al438; X64-NEXT: retq439 %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 9) nounwind440 %c = icmp eq i32 %m, 0441 ret i1 %c442}443 444define i1 @length10_eq(ptr %X, ptr %Y) nounwind {445; X64-LABEL: length10_eq:446; X64: # %bb.0:447; X64-NEXT: movq (%rdi), %rax448; X64-NEXT: xorq (%rsi), %rax449; X64-NEXT: movzwl 8(%rdi), %ecx450; X64-NEXT: xorw 8(%rsi), %cx451; X64-NEXT: movzwl %cx, %ecx452; X64-NEXT: orq %rax, %rcx453; X64-NEXT: sete %al454; X64-NEXT: retq455 %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 10) nounwind456 %c = icmp eq i32 %m, 0457 ret i1 %c458}459 460define i1 @length11_eq(ptr %X, ptr %Y) nounwind {461; X64-LABEL: length11_eq:462; X64: # %bb.0:463; X64-NEXT: movq (%rdi), %rax464; X64-NEXT: movq 3(%rdi), %rcx465; X64-NEXT: xorq (%rsi), %rax466; X64-NEXT: xorq 3(%rsi), %rcx467; X64-NEXT: orq %rax, %rcx468; X64-NEXT: sete %al469; X64-NEXT: retq470 %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 11) nounwind471 %c = icmp eq i32 %m, 0472 ret i1 %c473}474 475define i1 @length12_eq(ptr %X, ptr %Y) nounwind {476; X64-LABEL: length12_eq:477; X64: # %bb.0:478; X64-NEXT: movq (%rdi), %rax479; X64-NEXT: xorq (%rsi), %rax480; X64-NEXT: movl 8(%rdi), %ecx481; X64-NEXT: xorl 8(%rsi), %ecx482; X64-NEXT: orq %rax, %rcx483; X64-NEXT: setne %al484; X64-NEXT: retq485 %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 12) nounwind486 %c = icmp ne i32 %m, 0487 ret i1 %c488}489 490define i32 @length12(ptr %X, ptr %Y) nounwind {491; X64-LABEL: length12:492; X64: # %bb.0:493; X64-NEXT: movq (%rdi), %rcx494; X64-NEXT: movq (%rsi), %rdx495; X64-NEXT: bswapq %rcx496; X64-NEXT: bswapq %rdx497; X64-NEXT: cmpq %rdx, %rcx498; X64-NEXT: jne .LBB29_2499; X64-NEXT: # %bb.1: # %loadbb1500; X64-NEXT: movl 8(%rdi), %ecx501; X64-NEXT: movl 8(%rsi), %edx502; X64-NEXT: bswapl %ecx503; X64-NEXT: bswapl %edx504; X64-NEXT: xorl %eax, %eax505; X64-NEXT: cmpq %rdx, %rcx506; X64-NEXT: je .LBB29_3507; X64-NEXT: .LBB29_2: # %res_block508; X64-NEXT: xorl %eax, %eax509; X64-NEXT: cmpq %rdx, %rcx510; X64-NEXT: setae %al511; X64-NEXT: leal -1(%rax,%rax), %eax512; X64-NEXT: .LBB29_3: # %endblock513; X64-NEXT: retq514 %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 12) nounwind515 ret i32 %m516}517 518define i1 @length13_eq(ptr %X, ptr %Y) nounwind {519; X64-LABEL: length13_eq:520; X64: # %bb.0:521; X64-NEXT: movq (%rdi), %rax522; X64-NEXT: movq 5(%rdi), %rcx523; X64-NEXT: xorq (%rsi), %rax524; X64-NEXT: xorq 5(%rsi), %rcx525; X64-NEXT: orq %rax, %rcx526; X64-NEXT: sete %al527; X64-NEXT: retq528 %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 13) nounwind529 %c = icmp eq i32 %m, 0530 ret i1 %c531}532 533define i1 @length14_eq(ptr %X, ptr %Y) nounwind {534; X64-LABEL: length14_eq:535; X64: # %bb.0:536; X64-NEXT: movq (%rdi), %rax537; X64-NEXT: movq 6(%rdi), %rcx538; X64-NEXT: xorq (%rsi), %rax539; X64-NEXT: xorq 6(%rsi), %rcx540; X64-NEXT: orq %rax, %rcx541; X64-NEXT: sete %al542; X64-NEXT: retq543 %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 14) nounwind544 %c = icmp eq i32 %m, 0545 ret i1 %c546}547 548define i1 @length15_eq(ptr %X, ptr %Y) nounwind {549; X64-LABEL: length15_eq:550; X64: # %bb.0:551; X64-NEXT: movq (%rdi), %rax552; X64-NEXT: movq 7(%rdi), %rcx553; X64-NEXT: xorq (%rsi), %rax554; X64-NEXT: xorq 7(%rsi), %rcx555; X64-NEXT: orq %rax, %rcx556; X64-NEXT: sete %al557; X64-NEXT: retq558 %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 15) nounwind559 %c = icmp eq i32 %m, 0560 ret i1 %c561}562 563; PR33329 - https://bugs.llvm.org/show_bug.cgi?id=33329564 565define i32 @length16(ptr %X, ptr %Y) nounwind {566; X64-LABEL: length16:567; X64: # %bb.0:568; X64-NEXT: movq (%rdi), %rcx569; X64-NEXT: movq (%rsi), %rdx570; X64-NEXT: bswapq %rcx571; X64-NEXT: bswapq %rdx572; X64-NEXT: cmpq %rdx, %rcx573; X64-NEXT: jne .LBB33_2574; X64-NEXT: # %bb.1: # %loadbb1575; X64-NEXT: movq 8(%rdi), %rcx576; X64-NEXT: movq 8(%rsi), %rdx577; X64-NEXT: bswapq %rcx578; X64-NEXT: bswapq %rdx579; X64-NEXT: xorl %eax, %eax580; X64-NEXT: cmpq %rdx, %rcx581; X64-NEXT: je .LBB33_3582; X64-NEXT: .LBB33_2: # %res_block583; X64-NEXT: xorl %eax, %eax584; X64-NEXT: cmpq %rdx, %rcx585; X64-NEXT: setae %al586; X64-NEXT: leal -1(%rax,%rax), %eax587; X64-NEXT: .LBB33_3: # %endblock588; X64-NEXT: retq589 %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 16) nounwind590 ret i32 %m591}592 593define i1 @length16_eq(ptr %x, ptr %y) nounwind {594; X64-SSE2-LABEL: length16_eq:595; X64-SSE2: # %bb.0:596; X64-SSE2-NEXT: movdqu (%rdi), %xmm0597; X64-SSE2-NEXT: movdqu (%rsi), %xmm1598; X64-SSE2-NEXT: pcmpeqb %xmm0, %xmm1599; X64-SSE2-NEXT: pmovmskb %xmm1, %eax600; X64-SSE2-NEXT: cmpl $65535, %eax # imm = 0xFFFF601; X64-SSE2-NEXT: setne %al602; X64-SSE2-NEXT: retq603;604; X64-SSE41-LABEL: length16_eq:605; X64-SSE41: # %bb.0:606; X64-SSE41-NEXT: movdqu (%rdi), %xmm0607; X64-SSE41-NEXT: movdqu (%rsi), %xmm1608; X64-SSE41-NEXT: pxor %xmm0, %xmm1609; X64-SSE41-NEXT: ptest %xmm1, %xmm1610; X64-SSE41-NEXT: setne %al611; X64-SSE41-NEXT: retq612;613; X64-AVX-LABEL: length16_eq:614; X64-AVX: # %bb.0:615; X64-AVX-NEXT: vmovdqu (%rdi), %xmm0616; X64-AVX-NEXT: vpxor (%rsi), %xmm0, %xmm0617; X64-AVX-NEXT: vptest %xmm0, %xmm0618; X64-AVX-NEXT: setne %al619; X64-AVX-NEXT: retq620;621; X64-MIC-AVX-LABEL: length16_eq:622; X64-MIC-AVX: # %bb.0:623; X64-MIC-AVX-NEXT: vmovdqu (%rdi), %xmm0624; X64-MIC-AVX-NEXT: vmovdqu (%rsi), %xmm1625; X64-MIC-AVX-NEXT: vpcmpneqd %zmm1, %zmm0, %k0626; X64-MIC-AVX-NEXT: kortestw %k0, %k0627; X64-MIC-AVX-NEXT: setne %al628; X64-MIC-AVX-NEXT: vzeroupper629; X64-MIC-AVX-NEXT: retq630 %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 16) nounwind631 %cmp = icmp ne i32 %call, 0632 ret i1 %cmp633}634 635define i1 @length16_lt(ptr %x, ptr %y) nounwind {636; X64-LABEL: length16_lt:637; X64: # %bb.0:638; X64-NEXT: movq (%rdi), %rcx639; X64-NEXT: movq (%rsi), %rdx640; X64-NEXT: bswapq %rcx641; X64-NEXT: bswapq %rdx642; X64-NEXT: cmpq %rdx, %rcx643; X64-NEXT: jne .LBB35_2644; X64-NEXT: # %bb.1: # %loadbb1645; X64-NEXT: movq 8(%rdi), %rcx646; X64-NEXT: movq 8(%rsi), %rdx647; X64-NEXT: bswapq %rcx648; X64-NEXT: bswapq %rdx649; X64-NEXT: xorl %eax, %eax650; X64-NEXT: cmpq %rdx, %rcx651; X64-NEXT: je .LBB35_3652; X64-NEXT: .LBB35_2: # %res_block653; X64-NEXT: xorl %eax, %eax654; X64-NEXT: cmpq %rdx, %rcx655; X64-NEXT: setae %al656; X64-NEXT: leal -1(%rax,%rax), %eax657; X64-NEXT: .LBB35_3: # %endblock658; X64-NEXT: shrl $31, %eax659; X64-NEXT: # kill: def $al killed $al killed $eax660; X64-NEXT: retq661 %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 16) nounwind662 %cmp = icmp slt i32 %call, 0663 ret i1 %cmp664}665 666define i1 @length16_gt(ptr %x, ptr %y) nounwind {667; X64-LABEL: length16_gt:668; X64: # %bb.0:669; X64-NEXT: movq (%rdi), %rax670; X64-NEXT: movq (%rsi), %rcx671; X64-NEXT: bswapq %rax672; X64-NEXT: bswapq %rcx673; X64-NEXT: cmpq %rcx, %rax674; X64-NEXT: jne .LBB36_2675; X64-NEXT: # %bb.1: # %loadbb1676; X64-NEXT: movq 8(%rdi), %rax677; X64-NEXT: movq 8(%rsi), %rcx678; X64-NEXT: bswapq %rax679; X64-NEXT: bswapq %rcx680; X64-NEXT: xorl %edx, %edx681; X64-NEXT: cmpq %rcx, %rax682; X64-NEXT: je .LBB36_3683; X64-NEXT: .LBB36_2: # %res_block684; X64-NEXT: xorl %edx, %edx685; X64-NEXT: cmpq %rcx, %rax686; X64-NEXT: setae %dl687; X64-NEXT: leal -1(%rdx,%rdx), %edx688; X64-NEXT: .LBB36_3: # %endblock689; X64-NEXT: testl %edx, %edx690; X64-NEXT: setg %al691; X64-NEXT: retq692 %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 16) nounwind693 %cmp = icmp sgt i32 %call, 0694 ret i1 %cmp695}696 697define i1 @length16_eq_const(ptr %X) nounwind {698; X64-SSE2-LABEL: length16_eq_const:699; X64-SSE2: # %bb.0:700; X64-SSE2-NEXT: movdqu (%rdi), %xmm0701; X64-SSE2-NEXT: pcmpeqb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0702; X64-SSE2-NEXT: pmovmskb %xmm0, %eax703; X64-SSE2-NEXT: cmpl $65535, %eax # imm = 0xFFFF704; X64-SSE2-NEXT: sete %al705; X64-SSE2-NEXT: retq706;707; X64-SSE41-LABEL: length16_eq_const:708; X64-SSE41: # %bb.0:709; X64-SSE41-NEXT: movdqu (%rdi), %xmm0710; X64-SSE41-NEXT: pxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0711; X64-SSE41-NEXT: ptest %xmm0, %xmm0712; X64-SSE41-NEXT: sete %al713; X64-SSE41-NEXT: retq714;715; X64-AVX-LABEL: length16_eq_const:716; X64-AVX: # %bb.0:717; X64-AVX-NEXT: vmovdqu (%rdi), %xmm0718; X64-AVX-NEXT: vpxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0719; X64-AVX-NEXT: vptest %xmm0, %xmm0720; X64-AVX-NEXT: sete %al721; X64-AVX-NEXT: retq722;723; X64-MIC-AVX-LABEL: length16_eq_const:724; X64-MIC-AVX: # %bb.0:725; X64-MIC-AVX-NEXT: vmovdqu (%rdi), %xmm0726; X64-MIC-AVX-NEXT: vmovdqa {{.*#+}} xmm1 = [858927408,926299444,825243960,892613426]727; X64-MIC-AVX-NEXT: vpcmpneqd %zmm1, %zmm0, %k0728; X64-MIC-AVX-NEXT: kortestw %k0, %k0729; X64-MIC-AVX-NEXT: sete %al730; X64-MIC-AVX-NEXT: vzeroupper731; X64-MIC-AVX-NEXT: retq732 %m = tail call i32 @memcmp(ptr %X, ptr @.str, i64 16) nounwind733 %c = icmp eq i32 %m, 0734 ret i1 %c735}736 737; PR33914 - https://bugs.llvm.org/show_bug.cgi?id=33914738 739define i32 @length24(ptr %X, ptr %Y) nounwind {740; X64-LABEL: length24:741; X64: # %bb.0:742; X64-NEXT: movq (%rdi), %rcx743; X64-NEXT: movq (%rsi), %rdx744; X64-NEXT: bswapq %rcx745; X64-NEXT: bswapq %rdx746; X64-NEXT: cmpq %rdx, %rcx747; X64-NEXT: jne .LBB38_3748; X64-NEXT: # %bb.1: # %loadbb1749; X64-NEXT: movq 8(%rdi), %rcx750; X64-NEXT: movq 8(%rsi), %rdx751; X64-NEXT: bswapq %rcx752; X64-NEXT: bswapq %rdx753; X64-NEXT: cmpq %rdx, %rcx754; X64-NEXT: jne .LBB38_3755; X64-NEXT: # %bb.2: # %loadbb2756; X64-NEXT: movq 16(%rdi), %rcx757; X64-NEXT: movq 16(%rsi), %rdx758; X64-NEXT: bswapq %rcx759; X64-NEXT: bswapq %rdx760; X64-NEXT: xorl %eax, %eax761; X64-NEXT: cmpq %rdx, %rcx762; X64-NEXT: je .LBB38_4763; X64-NEXT: .LBB38_3: # %res_block764; X64-NEXT: xorl %eax, %eax765; X64-NEXT: cmpq %rdx, %rcx766; X64-NEXT: setae %al767; X64-NEXT: leal -1(%rax,%rax), %eax768; X64-NEXT: .LBB38_4: # %endblock769; X64-NEXT: retq770 %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 24) nounwind771 ret i32 %m772}773 774define i1 @length24_eq(ptr %x, ptr %y) nounwind {775; X64-SSE2-LABEL: length24_eq:776; X64-SSE2: # %bb.0:777; X64-SSE2-NEXT: movdqu (%rdi), %xmm0778; X64-SSE2-NEXT: movdqu (%rsi), %xmm1779; X64-SSE2-NEXT: pcmpeqb %xmm0, %xmm1780; X64-SSE2-NEXT: movq {{.*#+}} xmm0 = mem[0],zero781; X64-SSE2-NEXT: movq {{.*#+}} xmm2 = mem[0],zero782; X64-SSE2-NEXT: pcmpeqb %xmm0, %xmm2783; X64-SSE2-NEXT: pand %xmm1, %xmm2784; X64-SSE2-NEXT: pmovmskb %xmm2, %eax785; X64-SSE2-NEXT: cmpl $65535, %eax # imm = 0xFFFF786; X64-SSE2-NEXT: sete %al787; X64-SSE2-NEXT: retq788;789; X64-SSE41-LABEL: length24_eq:790; X64-SSE41: # %bb.0:791; X64-SSE41-NEXT: movdqu (%rdi), %xmm0792; X64-SSE41-NEXT: movdqu (%rsi), %xmm1793; X64-SSE41-NEXT: pxor %xmm0, %xmm1794; X64-SSE41-NEXT: movq {{.*#+}} xmm0 = mem[0],zero795; X64-SSE41-NEXT: movq {{.*#+}} xmm2 = mem[0],zero796; X64-SSE41-NEXT: pxor %xmm0, %xmm2797; X64-SSE41-NEXT: por %xmm1, %xmm2798; X64-SSE41-NEXT: ptest %xmm2, %xmm2799; X64-SSE41-NEXT: sete %al800; X64-SSE41-NEXT: retq801;802; X64-AVX-LABEL: length24_eq:803; X64-AVX: # %bb.0:804; X64-AVX-NEXT: vmovdqu (%rdi), %xmm0805; X64-AVX-NEXT: vmovq {{.*#+}} xmm1 = mem[0],zero806; X64-AVX-NEXT: vmovq {{.*#+}} xmm2 = mem[0],zero807; X64-AVX-NEXT: vpxor %xmm2, %xmm1, %xmm1808; X64-AVX-NEXT: vpxor (%rsi), %xmm0, %xmm0809; X64-AVX-NEXT: vpor %xmm0, %xmm1, %xmm0810; X64-AVX-NEXT: vptest %xmm0, %xmm0811; X64-AVX-NEXT: sete %al812; X64-AVX-NEXT: retq813;814; X64-MIC-AVX-LABEL: length24_eq:815; X64-MIC-AVX: # %bb.0:816; X64-MIC-AVX-NEXT: vmovdqu (%rdi), %xmm0817; X64-MIC-AVX-NEXT: vmovdqu (%rsi), %xmm1818; X64-MIC-AVX-NEXT: vmovq {{.*#+}} xmm2 = mem[0],zero819; X64-MIC-AVX-NEXT: vmovq {{.*#+}} xmm3 = mem[0],zero820; X64-MIC-AVX-NEXT: vpcmpneqd %zmm3, %zmm2, %k0821; X64-MIC-AVX-NEXT: vpcmpneqd %zmm1, %zmm0, %k1822; X64-MIC-AVX-NEXT: kortestw %k0, %k1823; X64-MIC-AVX-NEXT: sete %al824; X64-MIC-AVX-NEXT: vzeroupper825; X64-MIC-AVX-NEXT: retq826 %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 24) nounwind827 %cmp = icmp eq i32 %call, 0828 ret i1 %cmp829}830 831define i1 @length24_lt(ptr %x, ptr %y) nounwind {832; X64-LABEL: length24_lt:833; X64: # %bb.0:834; X64-NEXT: movq (%rdi), %rcx835; X64-NEXT: movq (%rsi), %rdx836; X64-NEXT: bswapq %rcx837; X64-NEXT: bswapq %rdx838; X64-NEXT: cmpq %rdx, %rcx839; X64-NEXT: jne .LBB40_3840; X64-NEXT: # %bb.1: # %loadbb1841; X64-NEXT: movq 8(%rdi), %rcx842; X64-NEXT: movq 8(%rsi), %rdx843; X64-NEXT: bswapq %rcx844; X64-NEXT: bswapq %rdx845; X64-NEXT: cmpq %rdx, %rcx846; X64-NEXT: jne .LBB40_3847; X64-NEXT: # %bb.2: # %loadbb2848; X64-NEXT: movq 16(%rdi), %rcx849; X64-NEXT: movq 16(%rsi), %rdx850; X64-NEXT: bswapq %rcx851; X64-NEXT: bswapq %rdx852; X64-NEXT: xorl %eax, %eax853; X64-NEXT: cmpq %rdx, %rcx854; X64-NEXT: je .LBB40_4855; X64-NEXT: .LBB40_3: # %res_block856; X64-NEXT: xorl %eax, %eax857; X64-NEXT: cmpq %rdx, %rcx858; X64-NEXT: setae %al859; X64-NEXT: leal -1(%rax,%rax), %eax860; X64-NEXT: .LBB40_4: # %endblock861; X64-NEXT: shrl $31, %eax862; X64-NEXT: # kill: def $al killed $al killed $eax863; X64-NEXT: retq864 %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 24) nounwind865 %cmp = icmp slt i32 %call, 0866 ret i1 %cmp867}868 869define i1 @length24_gt(ptr %x, ptr %y) nounwind {870; X64-LABEL: length24_gt:871; X64: # %bb.0:872; X64-NEXT: movq (%rdi), %rax873; X64-NEXT: movq (%rsi), %rcx874; X64-NEXT: bswapq %rax875; X64-NEXT: bswapq %rcx876; X64-NEXT: cmpq %rcx, %rax877; X64-NEXT: jne .LBB41_3878; X64-NEXT: # %bb.1: # %loadbb1879; X64-NEXT: movq 8(%rdi), %rax880; X64-NEXT: movq 8(%rsi), %rcx881; X64-NEXT: bswapq %rax882; X64-NEXT: bswapq %rcx883; X64-NEXT: cmpq %rcx, %rax884; X64-NEXT: jne .LBB41_3885; X64-NEXT: # %bb.2: # %loadbb2886; X64-NEXT: movq 16(%rdi), %rax887; X64-NEXT: movq 16(%rsi), %rcx888; X64-NEXT: bswapq %rax889; X64-NEXT: bswapq %rcx890; X64-NEXT: xorl %edx, %edx891; X64-NEXT: cmpq %rcx, %rax892; X64-NEXT: je .LBB41_4893; X64-NEXT: .LBB41_3: # %res_block894; X64-NEXT: xorl %edx, %edx895; X64-NEXT: cmpq %rcx, %rax896; X64-NEXT: setae %dl897; X64-NEXT: leal -1(%rdx,%rdx), %edx898; X64-NEXT: .LBB41_4: # %endblock899; X64-NEXT: testl %edx, %edx900; X64-NEXT: setg %al901; X64-NEXT: retq902 %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 24) nounwind903 %cmp = icmp sgt i32 %call, 0904 ret i1 %cmp905}906 907define i1 @length24_eq_const(ptr %X) nounwind {908; X64-SSE2-LABEL: length24_eq_const:909; X64-SSE2: # %bb.0:910; X64-SSE2-NEXT: movdqu (%rdi), %xmm0911; X64-SSE2-NEXT: movq {{.*#+}} xmm1 = mem[0],zero912; X64-SSE2-NEXT: pcmpeqb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1913; X64-SSE2-NEXT: pcmpeqb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0914; X64-SSE2-NEXT: pand %xmm1, %xmm0915; X64-SSE2-NEXT: pmovmskb %xmm0, %eax916; X64-SSE2-NEXT: cmpl $65535, %eax # imm = 0xFFFF917; X64-SSE2-NEXT: setne %al918; X64-SSE2-NEXT: retq919;920; X64-SSE41-LABEL: length24_eq_const:921; X64-SSE41: # %bb.0:922; X64-SSE41-NEXT: movdqu (%rdi), %xmm0923; X64-SSE41-NEXT: movq {{.*#+}} xmm1 = mem[0],zero924; X64-SSE41-NEXT: pxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1925; X64-SSE41-NEXT: pxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0926; X64-SSE41-NEXT: por %xmm1, %xmm0927; X64-SSE41-NEXT: ptest %xmm0, %xmm0928; X64-SSE41-NEXT: setne %al929; X64-SSE41-NEXT: retq930;931; X64-AVX-LABEL: length24_eq_const:932; X64-AVX: # %bb.0:933; X64-AVX-NEXT: vmovdqu (%rdi), %xmm0934; X64-AVX-NEXT: vmovq {{.*#+}} xmm1 = mem[0],zero935; X64-AVX-NEXT: vpxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1936; X64-AVX-NEXT: vpxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0937; X64-AVX-NEXT: vpor %xmm1, %xmm0, %xmm0938; X64-AVX-NEXT: vptest %xmm0, %xmm0939; X64-AVX-NEXT: setne %al940; X64-AVX-NEXT: retq941;942; X64-MIC-AVX-LABEL: length24_eq_const:943; X64-MIC-AVX: # %bb.0:944; X64-MIC-AVX-NEXT: vmovdqu (%rdi), %xmm0945; X64-MIC-AVX-NEXT: vmovq {{.*#+}} xmm1 = mem[0],zero946; X64-MIC-AVX-NEXT: vmovq {{.*#+}} xmm2 = [959985462,858927408,0,0]947; X64-MIC-AVX-NEXT: vpcmpneqd %zmm2, %zmm1, %k0948; X64-MIC-AVX-NEXT: vmovdqa {{.*#+}} xmm1 = [858927408,926299444,825243960,892613426]949; X64-MIC-AVX-NEXT: vpcmpneqd %zmm1, %zmm0, %k1950; X64-MIC-AVX-NEXT: kortestw %k0, %k1951; X64-MIC-AVX-NEXT: setne %al952; X64-MIC-AVX-NEXT: vzeroupper953; X64-MIC-AVX-NEXT: retq954 %m = tail call i32 @memcmp(ptr %X, ptr @.str, i64 24) nounwind955 %c = icmp ne i32 %m, 0956 ret i1 %c957}958 959define i32 @length31(ptr %X, ptr %Y) nounwind {960; X64-LABEL: length31:961; X64: # %bb.0:962; X64-NEXT: movq (%rdi), %rcx963; X64-NEXT: movq (%rsi), %rdx964; X64-NEXT: bswapq %rcx965; X64-NEXT: bswapq %rdx966; X64-NEXT: cmpq %rdx, %rcx967; X64-NEXT: jne .LBB43_4968; X64-NEXT: # %bb.1: # %loadbb1969; X64-NEXT: movq 8(%rdi), %rcx970; X64-NEXT: movq 8(%rsi), %rdx971; X64-NEXT: bswapq %rcx972; X64-NEXT: bswapq %rdx973; X64-NEXT: cmpq %rdx, %rcx974; X64-NEXT: jne .LBB43_4975; X64-NEXT: # %bb.2: # %loadbb2976; X64-NEXT: movq 16(%rdi), %rcx977; X64-NEXT: movq 16(%rsi), %rdx978; X64-NEXT: bswapq %rcx979; X64-NEXT: bswapq %rdx980; X64-NEXT: cmpq %rdx, %rcx981; X64-NEXT: jne .LBB43_4982; X64-NEXT: # %bb.3: # %loadbb3983; X64-NEXT: movq 23(%rdi), %rcx984; X64-NEXT: movq 23(%rsi), %rdx985; X64-NEXT: bswapq %rcx986; X64-NEXT: bswapq %rdx987; X64-NEXT: xorl %eax, %eax988; X64-NEXT: cmpq %rdx, %rcx989; X64-NEXT: je .LBB43_5990; X64-NEXT: .LBB43_4: # %res_block991; X64-NEXT: xorl %eax, %eax992; X64-NEXT: cmpq %rdx, %rcx993; X64-NEXT: setae %al994; X64-NEXT: leal -1(%rax,%rax), %eax995; X64-NEXT: .LBB43_5: # %endblock996; X64-NEXT: retq997 %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 31) nounwind998 ret i32 %m999}1000 1001define i1 @length31_eq(ptr %x, ptr %y) nounwind {1002; X64-SSE2-LABEL: length31_eq:1003; X64-SSE2: # %bb.0:1004; X64-SSE2-NEXT: movdqu (%rdi), %xmm01005; X64-SSE2-NEXT: movdqu 15(%rdi), %xmm11006; X64-SSE2-NEXT: movdqu (%rsi), %xmm21007; X64-SSE2-NEXT: pcmpeqb %xmm0, %xmm21008; X64-SSE2-NEXT: movdqu 15(%rsi), %xmm01009; X64-SSE2-NEXT: pcmpeqb %xmm1, %xmm01010; X64-SSE2-NEXT: pand %xmm2, %xmm01011; X64-SSE2-NEXT: pmovmskb %xmm0, %eax1012; X64-SSE2-NEXT: cmpl $65535, %eax # imm = 0xFFFF1013; X64-SSE2-NEXT: sete %al1014; X64-SSE2-NEXT: retq1015;1016; X64-SSE41-LABEL: length31_eq:1017; X64-SSE41: # %bb.0:1018; X64-SSE41-NEXT: movdqu (%rdi), %xmm01019; X64-SSE41-NEXT: movdqu 15(%rdi), %xmm11020; X64-SSE41-NEXT: movdqu (%rsi), %xmm21021; X64-SSE41-NEXT: pxor %xmm0, %xmm21022; X64-SSE41-NEXT: movdqu 15(%rsi), %xmm01023; X64-SSE41-NEXT: pxor %xmm1, %xmm01024; X64-SSE41-NEXT: por %xmm2, %xmm01025; X64-SSE41-NEXT: ptest %xmm0, %xmm01026; X64-SSE41-NEXT: sete %al1027; X64-SSE41-NEXT: retq1028;1029; X64-AVX-LABEL: length31_eq:1030; X64-AVX: # %bb.0:1031; X64-AVX-NEXT: vmovdqu (%rdi), %xmm01032; X64-AVX-NEXT: vmovdqu 15(%rdi), %xmm11033; X64-AVX-NEXT: vpxor 15(%rsi), %xmm1, %xmm11034; X64-AVX-NEXT: vpxor (%rsi), %xmm0, %xmm01035; X64-AVX-NEXT: vpor %xmm1, %xmm0, %xmm01036; X64-AVX-NEXT: vptest %xmm0, %xmm01037; X64-AVX-NEXT: sete %al1038; X64-AVX-NEXT: retq1039;1040; X64-MIC-AVX-LABEL: length31_eq:1041; X64-MIC-AVX: # %bb.0:1042; X64-MIC-AVX-NEXT: vmovdqu (%rdi), %xmm01043; X64-MIC-AVX-NEXT: vmovdqu 15(%rdi), %xmm11044; X64-MIC-AVX-NEXT: vmovdqu (%rsi), %xmm21045; X64-MIC-AVX-NEXT: vmovdqu 15(%rsi), %xmm31046; X64-MIC-AVX-NEXT: vpcmpneqd %zmm3, %zmm1, %k01047; X64-MIC-AVX-NEXT: vpcmpneqd %zmm2, %zmm0, %k11048; X64-MIC-AVX-NEXT: kortestw %k0, %k11049; X64-MIC-AVX-NEXT: sete %al1050; X64-MIC-AVX-NEXT: vzeroupper1051; X64-MIC-AVX-NEXT: retq1052 %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 31) nounwind1053 %cmp = icmp eq i32 %call, 01054 ret i1 %cmp1055}1056 1057define i1 @length31_lt(ptr %x, ptr %y) nounwind {1058; X64-LABEL: length31_lt:1059; X64: # %bb.0:1060; X64-NEXT: movq (%rdi), %rcx1061; X64-NEXT: movq (%rsi), %rdx1062; X64-NEXT: bswapq %rcx1063; X64-NEXT: bswapq %rdx1064; X64-NEXT: cmpq %rdx, %rcx1065; X64-NEXT: jne .LBB45_41066; X64-NEXT: # %bb.1: # %loadbb11067; X64-NEXT: movq 8(%rdi), %rcx1068; X64-NEXT: movq 8(%rsi), %rdx1069; X64-NEXT: bswapq %rcx1070; X64-NEXT: bswapq %rdx1071; X64-NEXT: cmpq %rdx, %rcx1072; X64-NEXT: jne .LBB45_41073; X64-NEXT: # %bb.2: # %loadbb21074; X64-NEXT: movq 16(%rdi), %rcx1075; X64-NEXT: movq 16(%rsi), %rdx1076; X64-NEXT: bswapq %rcx1077; X64-NEXT: bswapq %rdx1078; X64-NEXT: cmpq %rdx, %rcx1079; X64-NEXT: jne .LBB45_41080; X64-NEXT: # %bb.3: # %loadbb31081; X64-NEXT: movq 23(%rdi), %rcx1082; X64-NEXT: movq 23(%rsi), %rdx1083; X64-NEXT: bswapq %rcx1084; X64-NEXT: bswapq %rdx1085; X64-NEXT: xorl %eax, %eax1086; X64-NEXT: cmpq %rdx, %rcx1087; X64-NEXT: je .LBB45_51088; X64-NEXT: .LBB45_4: # %res_block1089; X64-NEXT: xorl %eax, %eax1090; X64-NEXT: cmpq %rdx, %rcx1091; X64-NEXT: setae %al1092; X64-NEXT: leal -1(%rax,%rax), %eax1093; X64-NEXT: .LBB45_5: # %endblock1094; X64-NEXT: shrl $31, %eax1095; X64-NEXT: # kill: def $al killed $al killed $eax1096; X64-NEXT: retq1097 %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 31) nounwind1098 %cmp = icmp slt i32 %call, 01099 ret i1 %cmp1100}1101 1102define i1 @length31_gt(ptr %x, ptr %y) nounwind {1103; X64-LABEL: length31_gt:1104; X64: # %bb.0:1105; X64-NEXT: movq (%rdi), %rax1106; X64-NEXT: movq (%rsi), %rcx1107; X64-NEXT: bswapq %rax1108; X64-NEXT: bswapq %rcx1109; X64-NEXT: cmpq %rcx, %rax1110; X64-NEXT: jne .LBB46_41111; X64-NEXT: # %bb.1: # %loadbb11112; X64-NEXT: movq 8(%rdi), %rax1113; X64-NEXT: movq 8(%rsi), %rcx1114; X64-NEXT: bswapq %rax1115; X64-NEXT: bswapq %rcx1116; X64-NEXT: cmpq %rcx, %rax1117; X64-NEXT: jne .LBB46_41118; X64-NEXT: # %bb.2: # %loadbb21119; X64-NEXT: movq 16(%rdi), %rax1120; X64-NEXT: movq 16(%rsi), %rcx1121; X64-NEXT: bswapq %rax1122; X64-NEXT: bswapq %rcx1123; X64-NEXT: cmpq %rcx, %rax1124; X64-NEXT: jne .LBB46_41125; X64-NEXT: # %bb.3: # %loadbb31126; X64-NEXT: movq 23(%rdi), %rax1127; X64-NEXT: movq 23(%rsi), %rcx1128; X64-NEXT: bswapq %rax1129; X64-NEXT: bswapq %rcx1130; X64-NEXT: xorl %edx, %edx1131; X64-NEXT: cmpq %rcx, %rax1132; X64-NEXT: je .LBB46_51133; X64-NEXT: .LBB46_4: # %res_block1134; X64-NEXT: xorl %edx, %edx1135; X64-NEXT: cmpq %rcx, %rax1136; X64-NEXT: setae %dl1137; X64-NEXT: leal -1(%rdx,%rdx), %edx1138; X64-NEXT: .LBB46_5: # %endblock1139; X64-NEXT: testl %edx, %edx1140; X64-NEXT: setg %al1141; X64-NEXT: retq1142 %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 31) nounwind1143 %cmp = icmp sgt i32 %call, 01144 ret i1 %cmp1145}1146 1147define i1 @length31_eq_prefer128(ptr %x, ptr %y) nounwind "prefer-vector-width"="128" {1148; X64-SSE2-LABEL: length31_eq_prefer128:1149; X64-SSE2: # %bb.0:1150; X64-SSE2-NEXT: movdqu (%rdi), %xmm01151; X64-SSE2-NEXT: movdqu 15(%rdi), %xmm11152; X64-SSE2-NEXT: movdqu (%rsi), %xmm21153; X64-SSE2-NEXT: pcmpeqb %xmm0, %xmm21154; X64-SSE2-NEXT: movdqu 15(%rsi), %xmm01155; X64-SSE2-NEXT: pcmpeqb %xmm1, %xmm01156; X64-SSE2-NEXT: pand %xmm2, %xmm01157; X64-SSE2-NEXT: pmovmskb %xmm0, %eax1158; X64-SSE2-NEXT: cmpl $65535, %eax # imm = 0xFFFF1159; X64-SSE2-NEXT: sete %al1160; X64-SSE2-NEXT: retq1161;1162; X64-SSE41-LABEL: length31_eq_prefer128:1163; X64-SSE41: # %bb.0:1164; X64-SSE41-NEXT: movdqu (%rdi), %xmm01165; X64-SSE41-NEXT: movdqu 15(%rdi), %xmm11166; X64-SSE41-NEXT: movdqu (%rsi), %xmm21167; X64-SSE41-NEXT: pxor %xmm0, %xmm21168; X64-SSE41-NEXT: movdqu 15(%rsi), %xmm01169; X64-SSE41-NEXT: pxor %xmm1, %xmm01170; X64-SSE41-NEXT: por %xmm2, %xmm01171; X64-SSE41-NEXT: ptest %xmm0, %xmm01172; X64-SSE41-NEXT: sete %al1173; X64-SSE41-NEXT: retq1174;1175; X64-AVX-LABEL: length31_eq_prefer128:1176; X64-AVX: # %bb.0:1177; X64-AVX-NEXT: vmovdqu (%rdi), %xmm01178; X64-AVX-NEXT: vmovdqu 15(%rdi), %xmm11179; X64-AVX-NEXT: vpxor 15(%rsi), %xmm1, %xmm11180; X64-AVX-NEXT: vpxor (%rsi), %xmm0, %xmm01181; X64-AVX-NEXT: vpor %xmm1, %xmm0, %xmm01182; X64-AVX-NEXT: vptest %xmm0, %xmm01183; X64-AVX-NEXT: sete %al1184; X64-AVX-NEXT: retq1185;1186; X64-MIC-AVX-LABEL: length31_eq_prefer128:1187; X64-MIC-AVX: # %bb.0:1188; X64-MIC-AVX-NEXT: vmovdqu (%rdi), %xmm01189; X64-MIC-AVX-NEXT: vmovdqu 15(%rdi), %xmm11190; X64-MIC-AVX-NEXT: vmovdqu (%rsi), %xmm21191; X64-MIC-AVX-NEXT: vmovdqu 15(%rsi), %xmm31192; X64-MIC-AVX-NEXT: vpcmpneqd %zmm3, %zmm1, %k01193; X64-MIC-AVX-NEXT: vpcmpneqd %zmm2, %zmm0, %k11194; X64-MIC-AVX-NEXT: kortestw %k0, %k11195; X64-MIC-AVX-NEXT: sete %al1196; X64-MIC-AVX-NEXT: vzeroupper1197; X64-MIC-AVX-NEXT: retq1198 %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 31) nounwind1199 %cmp = icmp eq i32 %call, 01200 ret i1 %cmp1201}1202 1203define i1 @length31_eq_const(ptr %X) nounwind {1204; X64-SSE2-LABEL: length31_eq_const:1205; X64-SSE2: # %bb.0:1206; X64-SSE2-NEXT: movdqu (%rdi), %xmm01207; X64-SSE2-NEXT: movdqu 15(%rdi), %xmm11208; X64-SSE2-NEXT: pcmpeqb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm11209; X64-SSE2-NEXT: pcmpeqb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm01210; X64-SSE2-NEXT: pand %xmm1, %xmm01211; X64-SSE2-NEXT: pmovmskb %xmm0, %eax1212; X64-SSE2-NEXT: cmpl $65535, %eax # imm = 0xFFFF1213; X64-SSE2-NEXT: setne %al1214; X64-SSE2-NEXT: retq1215;1216; X64-SSE41-LABEL: length31_eq_const:1217; X64-SSE41: # %bb.0:1218; X64-SSE41-NEXT: movdqu (%rdi), %xmm01219; X64-SSE41-NEXT: movdqu 15(%rdi), %xmm11220; X64-SSE41-NEXT: pxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm11221; X64-SSE41-NEXT: pxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm01222; X64-SSE41-NEXT: por %xmm1, %xmm01223; X64-SSE41-NEXT: ptest %xmm0, %xmm01224; X64-SSE41-NEXT: setne %al1225; X64-SSE41-NEXT: retq1226;1227; X64-AVX-LABEL: length31_eq_const:1228; X64-AVX: # %bb.0:1229; X64-AVX-NEXT: vmovdqu (%rdi), %xmm01230; X64-AVX-NEXT: vmovdqu 15(%rdi), %xmm11231; X64-AVX-NEXT: vpxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm11232; X64-AVX-NEXT: vpxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm01233; X64-AVX-NEXT: vpor %xmm1, %xmm0, %xmm01234; X64-AVX-NEXT: vptest %xmm0, %xmm01235; X64-AVX-NEXT: setne %al1236; X64-AVX-NEXT: retq1237;1238; X64-MIC-AVX-LABEL: length31_eq_const:1239; X64-MIC-AVX: # %bb.0:1240; X64-MIC-AVX-NEXT: vmovdqu (%rdi), %xmm01241; X64-MIC-AVX-NEXT: vmovdqu 15(%rdi), %xmm11242; X64-MIC-AVX-NEXT: vmovdqa {{.*#+}} xmm2 = [943142453,842084409,909456435,809056311]1243; X64-MIC-AVX-NEXT: vpcmpneqd %zmm2, %zmm1, %k01244; X64-MIC-AVX-NEXT: vmovdqa {{.*#+}} xmm1 = [858927408,926299444,825243960,892613426]1245; X64-MIC-AVX-NEXT: vpcmpneqd %zmm1, %zmm0, %k11246; X64-MIC-AVX-NEXT: kortestw %k0, %k11247; X64-MIC-AVX-NEXT: setne %al1248; X64-MIC-AVX-NEXT: vzeroupper1249; X64-MIC-AVX-NEXT: retq1250 %m = tail call i32 @memcmp(ptr %X, ptr @.str, i64 31) nounwind1251 %c = icmp ne i32 %m, 01252 ret i1 %c1253}1254 1255define i32 @length32(ptr %X, ptr %Y) nounwind {1256; X64-LABEL: length32:1257; X64: # %bb.0:1258; X64-NEXT: movq (%rdi), %rcx1259; X64-NEXT: movq (%rsi), %rdx1260; X64-NEXT: bswapq %rcx1261; X64-NEXT: bswapq %rdx1262; X64-NEXT: cmpq %rdx, %rcx1263; X64-NEXT: jne .LBB49_41264; X64-NEXT: # %bb.1: # %loadbb11265; X64-NEXT: movq 8(%rdi), %rcx1266; X64-NEXT: movq 8(%rsi), %rdx1267; X64-NEXT: bswapq %rcx1268; X64-NEXT: bswapq %rdx1269; X64-NEXT: cmpq %rdx, %rcx1270; X64-NEXT: jne .LBB49_41271; X64-NEXT: # %bb.2: # %loadbb21272; X64-NEXT: movq 16(%rdi), %rcx1273; X64-NEXT: movq 16(%rsi), %rdx1274; X64-NEXT: bswapq %rcx1275; X64-NEXT: bswapq %rdx1276; X64-NEXT: cmpq %rdx, %rcx1277; X64-NEXT: jne .LBB49_41278; X64-NEXT: # %bb.3: # %loadbb31279; X64-NEXT: movq 24(%rdi), %rcx1280; X64-NEXT: movq 24(%rsi), %rdx1281; X64-NEXT: bswapq %rcx1282; X64-NEXT: bswapq %rdx1283; X64-NEXT: xorl %eax, %eax1284; X64-NEXT: cmpq %rdx, %rcx1285; X64-NEXT: je .LBB49_51286; X64-NEXT: .LBB49_4: # %res_block1287; X64-NEXT: xorl %eax, %eax1288; X64-NEXT: cmpq %rdx, %rcx1289; X64-NEXT: setae %al1290; X64-NEXT: leal -1(%rax,%rax), %eax1291; X64-NEXT: .LBB49_5: # %endblock1292; X64-NEXT: retq1293 %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 32) nounwind1294 ret i32 %m1295}1296 1297; PR33325 - https://bugs.llvm.org/show_bug.cgi?id=333251298 1299define i1 @length32_eq(ptr %x, ptr %y) nounwind {1300; X64-SSE2-LABEL: length32_eq:1301; X64-SSE2: # %bb.0:1302; X64-SSE2-NEXT: movdqu (%rdi), %xmm01303; X64-SSE2-NEXT: movdqu 16(%rdi), %xmm11304; X64-SSE2-NEXT: movdqu (%rsi), %xmm21305; X64-SSE2-NEXT: pcmpeqb %xmm0, %xmm21306; X64-SSE2-NEXT: movdqu 16(%rsi), %xmm01307; X64-SSE2-NEXT: pcmpeqb %xmm1, %xmm01308; X64-SSE2-NEXT: pand %xmm2, %xmm01309; X64-SSE2-NEXT: pmovmskb %xmm0, %eax1310; X64-SSE2-NEXT: cmpl $65535, %eax # imm = 0xFFFF1311; X64-SSE2-NEXT: sete %al1312; X64-SSE2-NEXT: retq1313;1314; X64-SSE41-LABEL: length32_eq:1315; X64-SSE41: # %bb.0:1316; X64-SSE41-NEXT: movdqu (%rdi), %xmm01317; X64-SSE41-NEXT: movdqu 16(%rdi), %xmm11318; X64-SSE41-NEXT: movdqu (%rsi), %xmm21319; X64-SSE41-NEXT: pxor %xmm0, %xmm21320; X64-SSE41-NEXT: movdqu 16(%rsi), %xmm01321; X64-SSE41-NEXT: pxor %xmm1, %xmm01322; X64-SSE41-NEXT: por %xmm2, %xmm01323; X64-SSE41-NEXT: ptest %xmm0, %xmm01324; X64-SSE41-NEXT: sete %al1325; X64-SSE41-NEXT: retq1326;1327; X64-AVX1-LABEL: length32_eq:1328; X64-AVX1: # %bb.0:1329; X64-AVX1-NEXT: vmovups (%rdi), %ymm01330; X64-AVX1-NEXT: vxorps (%rsi), %ymm0, %ymm01331; X64-AVX1-NEXT: vptest %ymm0, %ymm01332; X64-AVX1-NEXT: sete %al1333; X64-AVX1-NEXT: vzeroupper1334; X64-AVX1-NEXT: retq1335;1336; X64-AVX2-LABEL: length32_eq:1337; X64-AVX2: # %bb.0:1338; X64-AVX2-NEXT: vmovdqu (%rdi), %ymm01339; X64-AVX2-NEXT: vpxor (%rsi), %ymm0, %ymm01340; X64-AVX2-NEXT: vptest %ymm0, %ymm01341; X64-AVX2-NEXT: sete %al1342; X64-AVX2-NEXT: vzeroupper1343; X64-AVX2-NEXT: retq1344;1345; X64-AVX512-LABEL: length32_eq:1346; X64-AVX512: # %bb.0:1347; X64-AVX512-NEXT: vmovdqu (%rdi), %ymm01348; X64-AVX512-NEXT: vpxor (%rsi), %ymm0, %ymm01349; X64-AVX512-NEXT: vptest %ymm0, %ymm01350; X64-AVX512-NEXT: sete %al1351; X64-AVX512-NEXT: vzeroupper1352; X64-AVX512-NEXT: retq1353;1354; X64-MIC-AVX-LABEL: length32_eq:1355; X64-MIC-AVX: # %bb.0:1356; X64-MIC-AVX-NEXT: vmovdqu (%rdi), %ymm01357; X64-MIC-AVX-NEXT: vmovdqu (%rsi), %ymm11358; X64-MIC-AVX-NEXT: vpcmpneqd %zmm1, %zmm0, %k01359; X64-MIC-AVX-NEXT: kortestw %k0, %k01360; X64-MIC-AVX-NEXT: sete %al1361; X64-MIC-AVX-NEXT: vzeroupper1362; X64-MIC-AVX-NEXT: retq1363 %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 32) nounwind1364 %cmp = icmp eq i32 %call, 01365 ret i1 %cmp1366}1367 1368define i1 @length32_lt(ptr %x, ptr %y) nounwind {1369; X64-LABEL: length32_lt:1370; X64: # %bb.0:1371; X64-NEXT: movq (%rdi), %rcx1372; X64-NEXT: movq (%rsi), %rdx1373; X64-NEXT: bswapq %rcx1374; X64-NEXT: bswapq %rdx1375; X64-NEXT: cmpq %rdx, %rcx1376; X64-NEXT: jne .LBB51_41377; X64-NEXT: # %bb.1: # %loadbb11378; X64-NEXT: movq 8(%rdi), %rcx1379; X64-NEXT: movq 8(%rsi), %rdx1380; X64-NEXT: bswapq %rcx1381; X64-NEXT: bswapq %rdx1382; X64-NEXT: cmpq %rdx, %rcx1383; X64-NEXT: jne .LBB51_41384; X64-NEXT: # %bb.2: # %loadbb21385; X64-NEXT: movq 16(%rdi), %rcx1386; X64-NEXT: movq 16(%rsi), %rdx1387; X64-NEXT: bswapq %rcx1388; X64-NEXT: bswapq %rdx1389; X64-NEXT: cmpq %rdx, %rcx1390; X64-NEXT: jne .LBB51_41391; X64-NEXT: # %bb.3: # %loadbb31392; X64-NEXT: movq 24(%rdi), %rcx1393; X64-NEXT: movq 24(%rsi), %rdx1394; X64-NEXT: bswapq %rcx1395; X64-NEXT: bswapq %rdx1396; X64-NEXT: xorl %eax, %eax1397; X64-NEXT: cmpq %rdx, %rcx1398; X64-NEXT: je .LBB51_51399; X64-NEXT: .LBB51_4: # %res_block1400; X64-NEXT: xorl %eax, %eax1401; X64-NEXT: cmpq %rdx, %rcx1402; X64-NEXT: setae %al1403; X64-NEXT: leal -1(%rax,%rax), %eax1404; X64-NEXT: .LBB51_5: # %endblock1405; X64-NEXT: shrl $31, %eax1406; X64-NEXT: # kill: def $al killed $al killed $eax1407; X64-NEXT: retq1408 %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 32) nounwind1409 %cmp = icmp slt i32 %call, 01410 ret i1 %cmp1411}1412 1413define i1 @length32_gt(ptr %x, ptr %y) nounwind {1414; X64-LABEL: length32_gt:1415; X64: # %bb.0:1416; X64-NEXT: movq (%rdi), %rax1417; X64-NEXT: movq (%rsi), %rcx1418; X64-NEXT: bswapq %rax1419; X64-NEXT: bswapq %rcx1420; X64-NEXT: cmpq %rcx, %rax1421; X64-NEXT: jne .LBB52_41422; X64-NEXT: # %bb.1: # %loadbb11423; X64-NEXT: movq 8(%rdi), %rax1424; X64-NEXT: movq 8(%rsi), %rcx1425; X64-NEXT: bswapq %rax1426; X64-NEXT: bswapq %rcx1427; X64-NEXT: cmpq %rcx, %rax1428; X64-NEXT: jne .LBB52_41429; X64-NEXT: # %bb.2: # %loadbb21430; X64-NEXT: movq 16(%rdi), %rax1431; X64-NEXT: movq 16(%rsi), %rcx1432; X64-NEXT: bswapq %rax1433; X64-NEXT: bswapq %rcx1434; X64-NEXT: cmpq %rcx, %rax1435; X64-NEXT: jne .LBB52_41436; X64-NEXT: # %bb.3: # %loadbb31437; X64-NEXT: movq 24(%rdi), %rax1438; X64-NEXT: movq 24(%rsi), %rcx1439; X64-NEXT: bswapq %rax1440; X64-NEXT: bswapq %rcx1441; X64-NEXT: xorl %edx, %edx1442; X64-NEXT: cmpq %rcx, %rax1443; X64-NEXT: je .LBB52_51444; X64-NEXT: .LBB52_4: # %res_block1445; X64-NEXT: xorl %edx, %edx1446; X64-NEXT: cmpq %rcx, %rax1447; X64-NEXT: setae %dl1448; X64-NEXT: leal -1(%rdx,%rdx), %edx1449; X64-NEXT: .LBB52_5: # %endblock1450; X64-NEXT: testl %edx, %edx1451; X64-NEXT: setg %al1452; X64-NEXT: retq1453 %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 32) nounwind1454 %cmp = icmp sgt i32 %call, 01455 ret i1 %cmp1456}1457 1458define i1 @length32_eq_prefer128(ptr %x, ptr %y) nounwind "prefer-vector-width"="128" {1459; X64-SSE2-LABEL: length32_eq_prefer128:1460; X64-SSE2: # %bb.0:1461; X64-SSE2-NEXT: movdqu (%rdi), %xmm01462; X64-SSE2-NEXT: movdqu 16(%rdi), %xmm11463; X64-SSE2-NEXT: movdqu (%rsi), %xmm21464; X64-SSE2-NEXT: pcmpeqb %xmm0, %xmm21465; X64-SSE2-NEXT: movdqu 16(%rsi), %xmm01466; X64-SSE2-NEXT: pcmpeqb %xmm1, %xmm01467; X64-SSE2-NEXT: pand %xmm2, %xmm01468; X64-SSE2-NEXT: pmovmskb %xmm0, %eax1469; X64-SSE2-NEXT: cmpl $65535, %eax # imm = 0xFFFF1470; X64-SSE2-NEXT: sete %al1471; X64-SSE2-NEXT: retq1472;1473; X64-SSE41-LABEL: length32_eq_prefer128:1474; X64-SSE41: # %bb.0:1475; X64-SSE41-NEXT: movdqu (%rdi), %xmm01476; X64-SSE41-NEXT: movdqu 16(%rdi), %xmm11477; X64-SSE41-NEXT: movdqu (%rsi), %xmm21478; X64-SSE41-NEXT: pxor %xmm0, %xmm21479; X64-SSE41-NEXT: movdqu 16(%rsi), %xmm01480; X64-SSE41-NEXT: pxor %xmm1, %xmm01481; X64-SSE41-NEXT: por %xmm2, %xmm01482; X64-SSE41-NEXT: ptest %xmm0, %xmm01483; X64-SSE41-NEXT: sete %al1484; X64-SSE41-NEXT: retq1485;1486; X64-AVX-LABEL: length32_eq_prefer128:1487; X64-AVX: # %bb.0:1488; X64-AVX-NEXT: vmovdqu (%rdi), %xmm01489; X64-AVX-NEXT: vmovdqu 16(%rdi), %xmm11490; X64-AVX-NEXT: vpxor 16(%rsi), %xmm1, %xmm11491; X64-AVX-NEXT: vpxor (%rsi), %xmm0, %xmm01492; X64-AVX-NEXT: vpor %xmm1, %xmm0, %xmm01493; X64-AVX-NEXT: vptest %xmm0, %xmm01494; X64-AVX-NEXT: sete %al1495; X64-AVX-NEXT: retq1496;1497; X64-MIC-AVX-LABEL: length32_eq_prefer128:1498; X64-MIC-AVX: # %bb.0:1499; X64-MIC-AVX-NEXT: vmovdqu (%rdi), %xmm01500; X64-MIC-AVX-NEXT: vmovdqu 16(%rdi), %xmm11501; X64-MIC-AVX-NEXT: vmovdqu (%rsi), %xmm21502; X64-MIC-AVX-NEXT: vmovdqu 16(%rsi), %xmm31503; X64-MIC-AVX-NEXT: vpcmpneqd %zmm3, %zmm1, %k01504; X64-MIC-AVX-NEXT: vpcmpneqd %zmm2, %zmm0, %k11505; X64-MIC-AVX-NEXT: kortestw %k0, %k11506; X64-MIC-AVX-NEXT: sete %al1507; X64-MIC-AVX-NEXT: vzeroupper1508; X64-MIC-AVX-NEXT: retq1509 %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 32) nounwind1510 %cmp = icmp eq i32 %call, 01511 ret i1 %cmp1512}1513 1514define i1 @length32_eq_const(ptr %X) nounwind {1515; X64-SSE2-LABEL: length32_eq_const:1516; X64-SSE2: # %bb.0:1517; X64-SSE2-NEXT: movdqu (%rdi), %xmm01518; X64-SSE2-NEXT: movdqu 16(%rdi), %xmm11519; X64-SSE2-NEXT: pcmpeqb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm11520; X64-SSE2-NEXT: pcmpeqb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm01521; X64-SSE2-NEXT: pand %xmm1, %xmm01522; X64-SSE2-NEXT: pmovmskb %xmm0, %eax1523; X64-SSE2-NEXT: cmpl $65535, %eax # imm = 0xFFFF1524; X64-SSE2-NEXT: setne %al1525; X64-SSE2-NEXT: retq1526;1527; X64-SSE41-LABEL: length32_eq_const:1528; X64-SSE41: # %bb.0:1529; X64-SSE41-NEXT: movdqu (%rdi), %xmm01530; X64-SSE41-NEXT: movdqu 16(%rdi), %xmm11531; X64-SSE41-NEXT: pxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm11532; X64-SSE41-NEXT: pxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm01533; X64-SSE41-NEXT: por %xmm1, %xmm01534; X64-SSE41-NEXT: ptest %xmm0, %xmm01535; X64-SSE41-NEXT: setne %al1536; X64-SSE41-NEXT: retq1537;1538; X64-AVX1-LABEL: length32_eq_const:1539; X64-AVX1: # %bb.0:1540; X64-AVX1-NEXT: vmovups (%rdi), %ymm01541; X64-AVX1-NEXT: vxorps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm01542; X64-AVX1-NEXT: vptest %ymm0, %ymm01543; X64-AVX1-NEXT: setne %al1544; X64-AVX1-NEXT: vzeroupper1545; X64-AVX1-NEXT: retq1546;1547; X64-AVX2-LABEL: length32_eq_const:1548; X64-AVX2: # %bb.0:1549; X64-AVX2-NEXT: vmovdqu (%rdi), %ymm01550; X64-AVX2-NEXT: vpxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm01551; X64-AVX2-NEXT: vptest %ymm0, %ymm01552; X64-AVX2-NEXT: setne %al1553; X64-AVX2-NEXT: vzeroupper1554; X64-AVX2-NEXT: retq1555;1556; X64-AVX512-LABEL: length32_eq_const:1557; X64-AVX512: # %bb.0:1558; X64-AVX512-NEXT: vmovdqu (%rdi), %ymm01559; X64-AVX512-NEXT: vpxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm01560; X64-AVX512-NEXT: vptest %ymm0, %ymm01561; X64-AVX512-NEXT: setne %al1562; X64-AVX512-NEXT: vzeroupper1563; X64-AVX512-NEXT: retq1564;1565; X64-MIC-AVX-LABEL: length32_eq_const:1566; X64-MIC-AVX: # %bb.0:1567; X64-MIC-AVX-NEXT: vmovdqu (%rdi), %ymm01568; X64-MIC-AVX-NEXT: vmovdqa {{.*#+}} ymm1 = [858927408,926299444,825243960,892613426,959985462,858927408,926299444,825243960]1569; X64-MIC-AVX-NEXT: vpcmpneqd %zmm1, %zmm0, %k01570; X64-MIC-AVX-NEXT: kortestw %k0, %k01571; X64-MIC-AVX-NEXT: setne %al1572; X64-MIC-AVX-NEXT: vzeroupper1573; X64-MIC-AVX-NEXT: retq1574 %m = tail call i32 @memcmp(ptr %X, ptr @.str, i64 32) nounwind1575 %c = icmp ne i32 %m, 01576 ret i1 %c1577}1578 1579define i32 @length48(ptr %X, ptr %Y) nounwind {1580; X64-LABEL: length48:1581; X64: # %bb.0:1582; X64-NEXT: movl $48, %edx1583; X64-NEXT: jmp memcmp # TAILCALL1584 %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 48) nounwind1585 ret i32 %m1586}1587 1588define i1 @length48_eq(ptr %x, ptr %y) nounwind {1589; X64-SSE2-LABEL: length48_eq:1590; X64-SSE2: # %bb.0:1591; X64-SSE2-NEXT: movdqu (%rdi), %xmm01592; X64-SSE2-NEXT: movdqu 16(%rdi), %xmm11593; X64-SSE2-NEXT: movdqu 32(%rdi), %xmm21594; X64-SSE2-NEXT: movdqu (%rsi), %xmm31595; X64-SSE2-NEXT: pcmpeqb %xmm0, %xmm31596; X64-SSE2-NEXT: movdqu 16(%rsi), %xmm01597; X64-SSE2-NEXT: pcmpeqb %xmm1, %xmm01598; X64-SSE2-NEXT: pand %xmm3, %xmm01599; X64-SSE2-NEXT: movdqu 32(%rsi), %xmm11600; X64-SSE2-NEXT: pcmpeqb %xmm2, %xmm11601; X64-SSE2-NEXT: pand %xmm0, %xmm11602; X64-SSE2-NEXT: pmovmskb %xmm1, %eax1603; X64-SSE2-NEXT: cmpl $65535, %eax # imm = 0xFFFF1604; X64-SSE2-NEXT: sete %al1605; X64-SSE2-NEXT: retq1606;1607; X64-SSE41-LABEL: length48_eq:1608; X64-SSE41: # %bb.0:1609; X64-SSE41-NEXT: movdqu (%rdi), %xmm01610; X64-SSE41-NEXT: movdqu 16(%rdi), %xmm11611; X64-SSE41-NEXT: movdqu 32(%rdi), %xmm21612; X64-SSE41-NEXT: movdqu (%rsi), %xmm31613; X64-SSE41-NEXT: pxor %xmm0, %xmm31614; X64-SSE41-NEXT: movdqu 16(%rsi), %xmm01615; X64-SSE41-NEXT: pxor %xmm1, %xmm01616; X64-SSE41-NEXT: por %xmm3, %xmm01617; X64-SSE41-NEXT: movdqu 32(%rsi), %xmm11618; X64-SSE41-NEXT: pxor %xmm2, %xmm11619; X64-SSE41-NEXT: por %xmm0, %xmm11620; X64-SSE41-NEXT: ptest %xmm1, %xmm11621; X64-SSE41-NEXT: sete %al1622; X64-SSE41-NEXT: retq1623;1624; X64-AVX1-LABEL: length48_eq:1625; X64-AVX1: # %bb.0:1626; X64-AVX1-NEXT: vmovups (%rdi), %ymm01627; X64-AVX1-NEXT: vmovups 32(%rdi), %xmm11628; X64-AVX1-NEXT: vmovups 32(%rsi), %xmm21629; X64-AVX1-NEXT: vxorps (%rsi), %ymm0, %ymm01630; X64-AVX1-NEXT: vxorps %ymm2, %ymm1, %ymm11631; X64-AVX1-NEXT: vorps %ymm1, %ymm0, %ymm01632; X64-AVX1-NEXT: vptest %ymm0, %ymm01633; X64-AVX1-NEXT: sete %al1634; X64-AVX1-NEXT: vzeroupper1635; X64-AVX1-NEXT: retq1636;1637; X64-AVX2-LABEL: length48_eq:1638; X64-AVX2: # %bb.0:1639; X64-AVX2-NEXT: vmovdqu (%rdi), %ymm01640; X64-AVX2-NEXT: vmovdqu 32(%rdi), %xmm11641; X64-AVX2-NEXT: vmovdqu 32(%rsi), %xmm21642; X64-AVX2-NEXT: vpxor (%rsi), %ymm0, %ymm01643; X64-AVX2-NEXT: vpxor %ymm2, %ymm1, %ymm11644; X64-AVX2-NEXT: vpor %ymm1, %ymm0, %ymm01645; X64-AVX2-NEXT: vptest %ymm0, %ymm01646; X64-AVX2-NEXT: sete %al1647; X64-AVX2-NEXT: vzeroupper1648; X64-AVX2-NEXT: retq1649;1650; X64-AVX512-LABEL: length48_eq:1651; X64-AVX512: # %bb.0:1652; X64-AVX512-NEXT: vmovdqu (%rdi), %ymm01653; X64-AVX512-NEXT: vmovdqu 32(%rdi), %xmm11654; X64-AVX512-NEXT: vmovdqu 32(%rsi), %xmm21655; X64-AVX512-NEXT: vpxor (%rsi), %ymm0, %ymm01656; X64-AVX512-NEXT: vpxor %ymm2, %ymm1, %ymm11657; X64-AVX512-NEXT: vpor %ymm1, %ymm0, %ymm01658; X64-AVX512-NEXT: vptest %ymm0, %ymm01659; X64-AVX512-NEXT: sete %al1660; X64-AVX512-NEXT: vzeroupper1661; X64-AVX512-NEXT: retq1662;1663; X64-MIC-AVX-LABEL: length48_eq:1664; X64-MIC-AVX: # %bb.0:1665; X64-MIC-AVX-NEXT: vmovdqu (%rdi), %ymm01666; X64-MIC-AVX-NEXT: vmovdqu (%rsi), %ymm11667; X64-MIC-AVX-NEXT: vmovdqu 32(%rdi), %xmm21668; X64-MIC-AVX-NEXT: vmovdqu 32(%rsi), %xmm31669; X64-MIC-AVX-NEXT: vpcmpneqd %zmm3, %zmm2, %k01670; X64-MIC-AVX-NEXT: vpcmpneqd %zmm1, %zmm0, %k11671; X64-MIC-AVX-NEXT: kortestw %k0, %k11672; X64-MIC-AVX-NEXT: sete %al1673; X64-MIC-AVX-NEXT: vzeroupper1674; X64-MIC-AVX-NEXT: retq1675 %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 48) nounwind1676 %cmp = icmp eq i32 %call, 01677 ret i1 %cmp1678}1679 1680define i1 @length48_lt(ptr %x, ptr %y) nounwind {1681; X64-LABEL: length48_lt:1682; X64: # %bb.0:1683; X64-NEXT: pushq %rax1684; X64-NEXT: movl $48, %edx1685; X64-NEXT: callq memcmp1686; X64-NEXT: shrl $31, %eax1687; X64-NEXT: # kill: def $al killed $al killed $eax1688; X64-NEXT: popq %rcx1689; X64-NEXT: retq1690 %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 48) nounwind1691 %cmp = icmp slt i32 %call, 01692 ret i1 %cmp1693}1694 1695define i1 @length48_gt(ptr %x, ptr %y) nounwind {1696; X64-LABEL: length48_gt:1697; X64: # %bb.0:1698; X64-NEXT: pushq %rax1699; X64-NEXT: movl $48, %edx1700; X64-NEXT: callq memcmp1701; X64-NEXT: testl %eax, %eax1702; X64-NEXT: setg %al1703; X64-NEXT: popq %rcx1704; X64-NEXT: retq1705 %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 48) nounwind1706 %cmp = icmp sgt i32 %call, 01707 ret i1 %cmp1708}1709 1710define i1 @length48_eq_prefer128(ptr %x, ptr %y) nounwind "prefer-vector-width"="128" {1711; X64-SSE2-LABEL: length48_eq_prefer128:1712; X64-SSE2: # %bb.0:1713; X64-SSE2-NEXT: movdqu (%rdi), %xmm01714; X64-SSE2-NEXT: movdqu 16(%rdi), %xmm11715; X64-SSE2-NEXT: movdqu 32(%rdi), %xmm21716; X64-SSE2-NEXT: movdqu (%rsi), %xmm31717; X64-SSE2-NEXT: pcmpeqb %xmm0, %xmm31718; X64-SSE2-NEXT: movdqu 16(%rsi), %xmm01719; X64-SSE2-NEXT: pcmpeqb %xmm1, %xmm01720; X64-SSE2-NEXT: pand %xmm3, %xmm01721; X64-SSE2-NEXT: movdqu 32(%rsi), %xmm11722; X64-SSE2-NEXT: pcmpeqb %xmm2, %xmm11723; X64-SSE2-NEXT: pand %xmm0, %xmm11724; X64-SSE2-NEXT: pmovmskb %xmm1, %eax1725; X64-SSE2-NEXT: cmpl $65535, %eax # imm = 0xFFFF1726; X64-SSE2-NEXT: sete %al1727; X64-SSE2-NEXT: retq1728;1729; X64-SSE41-LABEL: length48_eq_prefer128:1730; X64-SSE41: # %bb.0:1731; X64-SSE41-NEXT: movdqu (%rdi), %xmm01732; X64-SSE41-NEXT: movdqu 16(%rdi), %xmm11733; X64-SSE41-NEXT: movdqu 32(%rdi), %xmm21734; X64-SSE41-NEXT: movdqu (%rsi), %xmm31735; X64-SSE41-NEXT: pxor %xmm0, %xmm31736; X64-SSE41-NEXT: movdqu 16(%rsi), %xmm01737; X64-SSE41-NEXT: pxor %xmm1, %xmm01738; X64-SSE41-NEXT: por %xmm3, %xmm01739; X64-SSE41-NEXT: movdqu 32(%rsi), %xmm11740; X64-SSE41-NEXT: pxor %xmm2, %xmm11741; X64-SSE41-NEXT: por %xmm0, %xmm11742; X64-SSE41-NEXT: ptest %xmm1, %xmm11743; X64-SSE41-NEXT: sete %al1744; X64-SSE41-NEXT: retq1745;1746; X64-AVX-LABEL: length48_eq_prefer128:1747; X64-AVX: # %bb.0:1748; X64-AVX-NEXT: vmovdqu (%rdi), %xmm01749; X64-AVX-NEXT: vmovdqu 16(%rdi), %xmm11750; X64-AVX-NEXT: vmovdqu 32(%rdi), %xmm21751; X64-AVX-NEXT: vpxor 16(%rsi), %xmm1, %xmm11752; X64-AVX-NEXT: vpxor (%rsi), %xmm0, %xmm01753; X64-AVX-NEXT: vpor %xmm1, %xmm0, %xmm01754; X64-AVX-NEXT: vpxor 32(%rsi), %xmm2, %xmm11755; X64-AVX-NEXT: vpor %xmm1, %xmm0, %xmm01756; X64-AVX-NEXT: vptest %xmm0, %xmm01757; X64-AVX-NEXT: sete %al1758; X64-AVX-NEXT: retq1759;1760; X64-MIC-AVX-LABEL: length48_eq_prefer128:1761; X64-MIC-AVX: # %bb.0:1762; X64-MIC-AVX-NEXT: vmovdqu (%rdi), %xmm01763; X64-MIC-AVX-NEXT: vmovdqu 16(%rdi), %xmm11764; X64-MIC-AVX-NEXT: vmovdqu 32(%rdi), %xmm21765; X64-MIC-AVX-NEXT: vmovdqu (%rsi), %xmm31766; X64-MIC-AVX-NEXT: vmovdqu 16(%rsi), %xmm41767; X64-MIC-AVX-NEXT: vmovdqu 32(%rsi), %xmm51768; X64-MIC-AVX-NEXT: vpcmpneqd %zmm4, %zmm1, %k01769; X64-MIC-AVX-NEXT: vpcmpneqd %zmm3, %zmm0, %k11770; X64-MIC-AVX-NEXT: korw %k0, %k1, %k01771; X64-MIC-AVX-NEXT: vpcmpneqd %zmm5, %zmm2, %k11772; X64-MIC-AVX-NEXT: kortestw %k1, %k01773; X64-MIC-AVX-NEXT: sete %al1774; X64-MIC-AVX-NEXT: vzeroupper1775; X64-MIC-AVX-NEXT: retq1776 %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 48) nounwind1777 %cmp = icmp eq i32 %call, 01778 ret i1 %cmp1779}1780 1781define i1 @length48_eq_const(ptr %X) nounwind {1782; X64-SSE2-LABEL: length48_eq_const:1783; X64-SSE2: # %bb.0:1784; X64-SSE2-NEXT: movdqu (%rdi), %xmm01785; X64-SSE2-NEXT: movdqu 16(%rdi), %xmm11786; X64-SSE2-NEXT: movdqu 32(%rdi), %xmm21787; X64-SSE2-NEXT: pcmpeqb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm11788; X64-SSE2-NEXT: pcmpeqb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm01789; X64-SSE2-NEXT: pand %xmm1, %xmm01790; X64-SSE2-NEXT: pcmpeqb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm21791; X64-SSE2-NEXT: pand %xmm0, %xmm21792; X64-SSE2-NEXT: pmovmskb %xmm2, %eax1793; X64-SSE2-NEXT: cmpl $65535, %eax # imm = 0xFFFF1794; X64-SSE2-NEXT: setne %al1795; X64-SSE2-NEXT: retq1796;1797; X64-SSE41-LABEL: length48_eq_const:1798; X64-SSE41: # %bb.0:1799; X64-SSE41-NEXT: movdqu (%rdi), %xmm01800; X64-SSE41-NEXT: movdqu 16(%rdi), %xmm11801; X64-SSE41-NEXT: movdqu 32(%rdi), %xmm21802; X64-SSE41-NEXT: pxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm11803; X64-SSE41-NEXT: pxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm01804; X64-SSE41-NEXT: por %xmm1, %xmm01805; X64-SSE41-NEXT: pxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm21806; X64-SSE41-NEXT: por %xmm0, %xmm21807; X64-SSE41-NEXT: ptest %xmm2, %xmm21808; X64-SSE41-NEXT: setne %al1809; X64-SSE41-NEXT: retq1810;1811; X64-AVX1-LABEL: length48_eq_const:1812; X64-AVX1: # %bb.0:1813; X64-AVX1-NEXT: vmovups (%rdi), %ymm01814; X64-AVX1-NEXT: vmovups 32(%rdi), %xmm11815; X64-AVX1-NEXT: vxorps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm01816; X64-AVX1-NEXT: vxorps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm11817; X64-AVX1-NEXT: vorps %ymm1, %ymm0, %ymm01818; X64-AVX1-NEXT: vptest %ymm0, %ymm01819; X64-AVX1-NEXT: setne %al1820; X64-AVX1-NEXT: vzeroupper1821; X64-AVX1-NEXT: retq1822;1823; X64-AVX2-LABEL: length48_eq_const:1824; X64-AVX2: # %bb.0:1825; X64-AVX2-NEXT: vmovdqu (%rdi), %ymm01826; X64-AVX2-NEXT: vmovdqu 32(%rdi), %xmm11827; X64-AVX2-NEXT: vpxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm01828; X64-AVX2-NEXT: vpxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm11829; X64-AVX2-NEXT: vpor %ymm1, %ymm0, %ymm01830; X64-AVX2-NEXT: vptest %ymm0, %ymm01831; X64-AVX2-NEXT: setne %al1832; X64-AVX2-NEXT: vzeroupper1833; X64-AVX2-NEXT: retq1834;1835; X64-AVX512-LABEL: length48_eq_const:1836; X64-AVX512: # %bb.0:1837; X64-AVX512-NEXT: vmovdqu (%rdi), %ymm01838; X64-AVX512-NEXT: vmovdqu 32(%rdi), %xmm11839; X64-AVX512-NEXT: vpxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm01840; X64-AVX512-NEXT: vpxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm11841; X64-AVX512-NEXT: vpor %ymm1, %ymm0, %ymm01842; X64-AVX512-NEXT: vptest %ymm0, %ymm01843; X64-AVX512-NEXT: setne %al1844; X64-AVX512-NEXT: vzeroupper1845; X64-AVX512-NEXT: retq1846;1847; X64-MIC-AVX-LABEL: length48_eq_const:1848; X64-MIC-AVX: # %bb.0:1849; X64-MIC-AVX-NEXT: vmovdqu (%rdi), %ymm01850; X64-MIC-AVX-NEXT: vmovdqu 32(%rdi), %xmm11851; X64-MIC-AVX-NEXT: vmovdqa {{.*#+}} ymm2 = [892613426,959985462,858927408,926299444,0,0,0,0]1852; X64-MIC-AVX-NEXT: vpcmpneqd %zmm2, %zmm1, %k01853; X64-MIC-AVX-NEXT: vmovdqa {{.*#+}} ymm1 = [858927408,926299444,825243960,892613426,959985462,858927408,926299444,825243960]1854; X64-MIC-AVX-NEXT: vpcmpneqd %zmm1, %zmm0, %k11855; X64-MIC-AVX-NEXT: kortestw %k0, %k11856; X64-MIC-AVX-NEXT: setne %al1857; X64-MIC-AVX-NEXT: vzeroupper1858; X64-MIC-AVX-NEXT: retq1859 %m = tail call i32 @memcmp(ptr %X, ptr @.str, i64 48) nounwind1860 %c = icmp ne i32 %m, 01861 ret i1 %c1862}1863 1864define i32 @length63(ptr %X, ptr %Y) nounwind {1865; X64-LABEL: length63:1866; X64: # %bb.0:1867; X64-NEXT: movl $63, %edx1868; X64-NEXT: jmp memcmp # TAILCALL1869 %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 63) nounwind1870 ret i32 %m1871}1872 1873define i1 @length63_eq(ptr %x, ptr %y) nounwind {1874; X64-SSE2-LABEL: length63_eq:1875; X64-SSE2: # %bb.0:1876; X64-SSE2-NEXT: movdqu (%rdi), %xmm01877; X64-SSE2-NEXT: movdqu 16(%rdi), %xmm11878; X64-SSE2-NEXT: movdqu 32(%rdi), %xmm21879; X64-SSE2-NEXT: movdqu 47(%rdi), %xmm31880; X64-SSE2-NEXT: movdqu (%rsi), %xmm41881; X64-SSE2-NEXT: pcmpeqb %xmm0, %xmm41882; X64-SSE2-NEXT: movdqu 16(%rsi), %xmm01883; X64-SSE2-NEXT: pcmpeqb %xmm1, %xmm01884; X64-SSE2-NEXT: pand %xmm4, %xmm01885; X64-SSE2-NEXT: movdqu 32(%rsi), %xmm11886; X64-SSE2-NEXT: pcmpeqb %xmm2, %xmm11887; X64-SSE2-NEXT: movdqu 47(%rsi), %xmm21888; X64-SSE2-NEXT: pcmpeqb %xmm3, %xmm21889; X64-SSE2-NEXT: pand %xmm1, %xmm21890; X64-SSE2-NEXT: pand %xmm0, %xmm21891; X64-SSE2-NEXT: pmovmskb %xmm2, %eax1892; X64-SSE2-NEXT: cmpl $65535, %eax # imm = 0xFFFF1893; X64-SSE2-NEXT: setne %al1894; X64-SSE2-NEXT: retq1895;1896; X64-SSE41-LABEL: length63_eq:1897; X64-SSE41: # %bb.0:1898; X64-SSE41-NEXT: movdqu (%rdi), %xmm01899; X64-SSE41-NEXT: movdqu 16(%rdi), %xmm11900; X64-SSE41-NEXT: movdqu 32(%rdi), %xmm21901; X64-SSE41-NEXT: movdqu 47(%rdi), %xmm31902; X64-SSE41-NEXT: movdqu (%rsi), %xmm41903; X64-SSE41-NEXT: pxor %xmm0, %xmm41904; X64-SSE41-NEXT: movdqu 16(%rsi), %xmm01905; X64-SSE41-NEXT: pxor %xmm1, %xmm01906; X64-SSE41-NEXT: por %xmm4, %xmm01907; X64-SSE41-NEXT: movdqu 32(%rsi), %xmm11908; X64-SSE41-NEXT: pxor %xmm2, %xmm11909; X64-SSE41-NEXT: movdqu 47(%rsi), %xmm21910; X64-SSE41-NEXT: pxor %xmm3, %xmm21911; X64-SSE41-NEXT: por %xmm1, %xmm21912; X64-SSE41-NEXT: por %xmm0, %xmm21913; X64-SSE41-NEXT: ptest %xmm2, %xmm21914; X64-SSE41-NEXT: setne %al1915; X64-SSE41-NEXT: retq1916;1917; X64-AVX1-LABEL: length63_eq:1918; X64-AVX1: # %bb.0:1919; X64-AVX1-NEXT: vmovups (%rdi), %ymm01920; X64-AVX1-NEXT: vmovups 31(%rdi), %ymm11921; X64-AVX1-NEXT: vxorps 31(%rsi), %ymm1, %ymm11922; X64-AVX1-NEXT: vxorps (%rsi), %ymm0, %ymm01923; X64-AVX1-NEXT: vorps %ymm1, %ymm0, %ymm01924; X64-AVX1-NEXT: vptest %ymm0, %ymm01925; X64-AVX1-NEXT: setne %al1926; X64-AVX1-NEXT: vzeroupper1927; X64-AVX1-NEXT: retq1928;1929; X64-AVX2-LABEL: length63_eq:1930; X64-AVX2: # %bb.0:1931; X64-AVX2-NEXT: vmovdqu (%rdi), %ymm01932; X64-AVX2-NEXT: vmovdqu 31(%rdi), %ymm11933; X64-AVX2-NEXT: vpxor 31(%rsi), %ymm1, %ymm11934; X64-AVX2-NEXT: vpxor (%rsi), %ymm0, %ymm01935; X64-AVX2-NEXT: vpor %ymm1, %ymm0, %ymm01936; X64-AVX2-NEXT: vptest %ymm0, %ymm01937; X64-AVX2-NEXT: setne %al1938; X64-AVX2-NEXT: vzeroupper1939; X64-AVX2-NEXT: retq1940;1941; X64-AVX512-LABEL: length63_eq:1942; X64-AVX512: # %bb.0:1943; X64-AVX512-NEXT: vmovdqu (%rdi), %ymm01944; X64-AVX512-NEXT: vmovdqu 31(%rdi), %ymm11945; X64-AVX512-NEXT: vpxor 31(%rsi), %ymm1, %ymm11946; X64-AVX512-NEXT: vpxor (%rsi), %ymm0, %ymm01947; X64-AVX512-NEXT: vpor %ymm1, %ymm0, %ymm01948; X64-AVX512-NEXT: vptest %ymm0, %ymm01949; X64-AVX512-NEXT: setne %al1950; X64-AVX512-NEXT: vzeroupper1951; X64-AVX512-NEXT: retq1952;1953; X64-MIC-AVX-LABEL: length63_eq:1954; X64-MIC-AVX: # %bb.0:1955; X64-MIC-AVX-NEXT: vmovdqu (%rdi), %ymm01956; X64-MIC-AVX-NEXT: vmovdqu 31(%rdi), %ymm11957; X64-MIC-AVX-NEXT: vmovdqu (%rsi), %ymm21958; X64-MIC-AVX-NEXT: vmovdqu 31(%rsi), %ymm31959; X64-MIC-AVX-NEXT: vpcmpneqd %zmm3, %zmm1, %k01960; X64-MIC-AVX-NEXT: vpcmpneqd %zmm2, %zmm0, %k11961; X64-MIC-AVX-NEXT: kortestw %k0, %k11962; X64-MIC-AVX-NEXT: setne %al1963; X64-MIC-AVX-NEXT: vzeroupper1964; X64-MIC-AVX-NEXT: retq1965 %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 63) nounwind1966 %cmp = icmp ne i32 %call, 01967 ret i1 %cmp1968}1969 1970define i1 @length63_lt(ptr %x, ptr %y) nounwind {1971; X64-LABEL: length63_lt:1972; X64: # %bb.0:1973; X64-NEXT: pushq %rax1974; X64-NEXT: movl $63, %edx1975; X64-NEXT: callq memcmp1976; X64-NEXT: shrl $31, %eax1977; X64-NEXT: # kill: def $al killed $al killed $eax1978; X64-NEXT: popq %rcx1979; X64-NEXT: retq1980 %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 63) nounwind1981 %cmp = icmp slt i32 %call, 01982 ret i1 %cmp1983}1984 1985define i1 @length63_gt(ptr %x, ptr %y) nounwind {1986; X64-LABEL: length63_gt:1987; X64: # %bb.0:1988; X64-NEXT: pushq %rax1989; X64-NEXT: movl $63, %edx1990; X64-NEXT: callq memcmp1991; X64-NEXT: testl %eax, %eax1992; X64-NEXT: setg %al1993; X64-NEXT: popq %rcx1994; X64-NEXT: retq1995 %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 63) nounwind1996 %cmp = icmp sgt i32 %call, 01997 ret i1 %cmp1998}1999 2000define i1 @length63_eq_const(ptr %X) nounwind {2001; X64-SSE2-LABEL: length63_eq_const:2002; X64-SSE2: # %bb.0:2003; X64-SSE2-NEXT: movdqu (%rdi), %xmm02004; X64-SSE2-NEXT: movdqu 16(%rdi), %xmm12005; X64-SSE2-NEXT: movdqu 32(%rdi), %xmm22006; X64-SSE2-NEXT: movdqu 47(%rdi), %xmm32007; X64-SSE2-NEXT: pcmpeqb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm32008; X64-SSE2-NEXT: pcmpeqb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm22009; X64-SSE2-NEXT: pand %xmm3, %xmm22010; X64-SSE2-NEXT: pcmpeqb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm12011; X64-SSE2-NEXT: pcmpeqb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm02012; X64-SSE2-NEXT: pand %xmm1, %xmm02013; X64-SSE2-NEXT: pand %xmm2, %xmm02014; X64-SSE2-NEXT: pmovmskb %xmm0, %eax2015; X64-SSE2-NEXT: cmpl $65535, %eax # imm = 0xFFFF2016; X64-SSE2-NEXT: sete %al2017; X64-SSE2-NEXT: retq2018;2019; X64-SSE41-LABEL: length63_eq_const:2020; X64-SSE41: # %bb.0:2021; X64-SSE41-NEXT: movdqu (%rdi), %xmm02022; X64-SSE41-NEXT: movdqu 16(%rdi), %xmm12023; X64-SSE41-NEXT: movdqu 32(%rdi), %xmm22024; X64-SSE41-NEXT: movdqu 47(%rdi), %xmm32025; X64-SSE41-NEXT: pxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm32026; X64-SSE41-NEXT: pxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm22027; X64-SSE41-NEXT: por %xmm3, %xmm22028; X64-SSE41-NEXT: pxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm12029; X64-SSE41-NEXT: pxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm02030; X64-SSE41-NEXT: por %xmm1, %xmm02031; X64-SSE41-NEXT: por %xmm2, %xmm02032; X64-SSE41-NEXT: ptest %xmm0, %xmm02033; X64-SSE41-NEXT: sete %al2034; X64-SSE41-NEXT: retq2035;2036; X64-AVX1-LABEL: length63_eq_const:2037; X64-AVX1: # %bb.0:2038; X64-AVX1-NEXT: vmovups (%rdi), %ymm02039; X64-AVX1-NEXT: vmovups 31(%rdi), %ymm12040; X64-AVX1-NEXT: vxorps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm12041; X64-AVX1-NEXT: vxorps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm02042; X64-AVX1-NEXT: vorps %ymm1, %ymm0, %ymm02043; X64-AVX1-NEXT: vptest %ymm0, %ymm02044; X64-AVX1-NEXT: sete %al2045; X64-AVX1-NEXT: vzeroupper2046; X64-AVX1-NEXT: retq2047;2048; X64-AVX2-LABEL: length63_eq_const:2049; X64-AVX2: # %bb.0:2050; X64-AVX2-NEXT: vmovdqu (%rdi), %ymm02051; X64-AVX2-NEXT: vmovdqu 31(%rdi), %ymm12052; X64-AVX2-NEXT: vpxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm12053; X64-AVX2-NEXT: vpxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm02054; X64-AVX2-NEXT: vpor %ymm1, %ymm0, %ymm02055; X64-AVX2-NEXT: vptest %ymm0, %ymm02056; X64-AVX2-NEXT: sete %al2057; X64-AVX2-NEXT: vzeroupper2058; X64-AVX2-NEXT: retq2059;2060; X64-AVX512-LABEL: length63_eq_const:2061; X64-AVX512: # %bb.0:2062; X64-AVX512-NEXT: vmovdqu (%rdi), %ymm02063; X64-AVX512-NEXT: vmovdqu 31(%rdi), %ymm12064; X64-AVX512-NEXT: vpxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm12065; X64-AVX512-NEXT: vpxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm02066; X64-AVX512-NEXT: vpor %ymm1, %ymm0, %ymm02067; X64-AVX512-NEXT: vptest %ymm0, %ymm02068; X64-AVX512-NEXT: sete %al2069; X64-AVX512-NEXT: vzeroupper2070; X64-AVX512-NEXT: retq2071;2072; X64-MIC-AVX-LABEL: length63_eq_const:2073; X64-MIC-AVX: # %bb.0:2074; X64-MIC-AVX-NEXT: vmovdqu (%rdi), %ymm02075; X64-MIC-AVX-NEXT: vmovdqu 31(%rdi), %ymm12076; X64-MIC-AVX-NEXT: vmovdqa {{.*#+}} ymm2 = [875770417,943142453,842084409,909456435,809056311,875770417,943142453,842084409]2077; X64-MIC-AVX-NEXT: vpcmpneqd %zmm2, %zmm1, %k02078; X64-MIC-AVX-NEXT: vmovdqa {{.*#+}} ymm1 = [858927408,926299444,825243960,892613426,959985462,858927408,926299444,825243960]2079; X64-MIC-AVX-NEXT: vpcmpneqd %zmm1, %zmm0, %k12080; X64-MIC-AVX-NEXT: kortestw %k0, %k12081; X64-MIC-AVX-NEXT: sete %al2082; X64-MIC-AVX-NEXT: vzeroupper2083; X64-MIC-AVX-NEXT: retq2084 %m = tail call i32 @memcmp(ptr %X, ptr @.str, i64 63) nounwind2085 %c = icmp eq i32 %m, 02086 ret i1 %c2087}2088 2089define i32 @length64(ptr %X, ptr %Y) nounwind {2090; X64-LABEL: length64:2091; X64: # %bb.0:2092; X64-NEXT: movl $64, %edx2093; X64-NEXT: jmp memcmp # TAILCALL2094 %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 64) nounwind2095 ret i32 %m2096}2097 2098define i1 @length64_eq(ptr %x, ptr %y) nounwind {2099; X64-SSE2-LABEL: length64_eq:2100; X64-SSE2: # %bb.0:2101; X64-SSE2-NEXT: movdqu (%rdi), %xmm02102; X64-SSE2-NEXT: movdqu 16(%rdi), %xmm12103; X64-SSE2-NEXT: movdqu 32(%rdi), %xmm22104; X64-SSE2-NEXT: movdqu 48(%rdi), %xmm32105; X64-SSE2-NEXT: movdqu (%rsi), %xmm42106; X64-SSE2-NEXT: pcmpeqb %xmm0, %xmm42107; X64-SSE2-NEXT: movdqu 16(%rsi), %xmm02108; X64-SSE2-NEXT: pcmpeqb %xmm1, %xmm02109; X64-SSE2-NEXT: pand %xmm4, %xmm02110; X64-SSE2-NEXT: movdqu 32(%rsi), %xmm12111; X64-SSE2-NEXT: pcmpeqb %xmm2, %xmm12112; X64-SSE2-NEXT: movdqu 48(%rsi), %xmm22113; X64-SSE2-NEXT: pcmpeqb %xmm3, %xmm22114; X64-SSE2-NEXT: pand %xmm1, %xmm22115; X64-SSE2-NEXT: pand %xmm0, %xmm22116; X64-SSE2-NEXT: pmovmskb %xmm2, %eax2117; X64-SSE2-NEXT: cmpl $65535, %eax # imm = 0xFFFF2118; X64-SSE2-NEXT: setne %al2119; X64-SSE2-NEXT: retq2120;2121; X64-SSE41-LABEL: length64_eq:2122; X64-SSE41: # %bb.0:2123; X64-SSE41-NEXT: movdqu (%rdi), %xmm02124; X64-SSE41-NEXT: movdqu 16(%rdi), %xmm12125; X64-SSE41-NEXT: movdqu 32(%rdi), %xmm22126; X64-SSE41-NEXT: movdqu 48(%rdi), %xmm32127; X64-SSE41-NEXT: movdqu (%rsi), %xmm42128; X64-SSE41-NEXT: pxor %xmm0, %xmm42129; X64-SSE41-NEXT: movdqu 16(%rsi), %xmm02130; X64-SSE41-NEXT: pxor %xmm1, %xmm02131; X64-SSE41-NEXT: por %xmm4, %xmm02132; X64-SSE41-NEXT: movdqu 32(%rsi), %xmm12133; X64-SSE41-NEXT: pxor %xmm2, %xmm12134; X64-SSE41-NEXT: movdqu 48(%rsi), %xmm22135; X64-SSE41-NEXT: pxor %xmm3, %xmm22136; X64-SSE41-NEXT: por %xmm1, %xmm22137; X64-SSE41-NEXT: por %xmm0, %xmm22138; X64-SSE41-NEXT: ptest %xmm2, %xmm22139; X64-SSE41-NEXT: setne %al2140; X64-SSE41-NEXT: retq2141;2142; X64-AVX1-LABEL: length64_eq:2143; X64-AVX1: # %bb.0:2144; X64-AVX1-NEXT: vmovups (%rdi), %ymm02145; X64-AVX1-NEXT: vmovups 32(%rdi), %ymm12146; X64-AVX1-NEXT: vxorps 32(%rsi), %ymm1, %ymm12147; X64-AVX1-NEXT: vxorps (%rsi), %ymm0, %ymm02148; X64-AVX1-NEXT: vorps %ymm1, %ymm0, %ymm02149; X64-AVX1-NEXT: vptest %ymm0, %ymm02150; X64-AVX1-NEXT: setne %al2151; X64-AVX1-NEXT: vzeroupper2152; X64-AVX1-NEXT: retq2153;2154; X64-AVX2-LABEL: length64_eq:2155; X64-AVX2: # %bb.0:2156; X64-AVX2-NEXT: vmovdqu (%rdi), %ymm02157; X64-AVX2-NEXT: vmovdqu 32(%rdi), %ymm12158; X64-AVX2-NEXT: vpxor 32(%rsi), %ymm1, %ymm12159; X64-AVX2-NEXT: vpxor (%rsi), %ymm0, %ymm02160; X64-AVX2-NEXT: vpor %ymm1, %ymm0, %ymm02161; X64-AVX2-NEXT: vptest %ymm0, %ymm02162; X64-AVX2-NEXT: setne %al2163; X64-AVX2-NEXT: vzeroupper2164; X64-AVX2-NEXT: retq2165;2166; X64-AVX512-LABEL: length64_eq:2167; X64-AVX512: # %bb.0:2168; X64-AVX512-NEXT: vmovdqu64 (%rdi), %zmm02169; X64-AVX512-NEXT: vpcmpneqd (%rsi), %zmm0, %k02170; X64-AVX512-NEXT: kortestw %k0, %k02171; X64-AVX512-NEXT: setne %al2172; X64-AVX512-NEXT: vzeroupper2173; X64-AVX512-NEXT: retq2174;2175; X64-MIC-AVX2-LABEL: length64_eq:2176; X64-MIC-AVX2: # %bb.0:2177; X64-MIC-AVX2-NEXT: vmovdqu (%rdi), %ymm02178; X64-MIC-AVX2-NEXT: vmovdqu 32(%rdi), %ymm12179; X64-MIC-AVX2-NEXT: vmovdqu (%rsi), %ymm22180; X64-MIC-AVX2-NEXT: vmovdqu 32(%rsi), %ymm32181; X64-MIC-AVX2-NEXT: vpcmpneqd %zmm3, %zmm1, %k02182; X64-MIC-AVX2-NEXT: vpcmpneqd %zmm2, %zmm0, %k12183; X64-MIC-AVX2-NEXT: kortestw %k0, %k12184; X64-MIC-AVX2-NEXT: setne %al2185; X64-MIC-AVX2-NEXT: vzeroupper2186; X64-MIC-AVX2-NEXT: retq2187;2188; X64-MIC-AVX512F-LABEL: length64_eq:2189; X64-MIC-AVX512F: # %bb.0:2190; X64-MIC-AVX512F-NEXT: vmovdqu64 (%rdi), %zmm02191; X64-MIC-AVX512F-NEXT: vpcmpneqd (%rsi), %zmm0, %k02192; X64-MIC-AVX512F-NEXT: kortestw %k0, %k02193; X64-MIC-AVX512F-NEXT: setne %al2194; X64-MIC-AVX512F-NEXT: vzeroupper2195; X64-MIC-AVX512F-NEXT: retq2196 %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 64) nounwind2197 %cmp = icmp ne i32 %call, 02198 ret i1 %cmp2199}2200 2201define i1 @length64_lt(ptr %x, ptr %y) nounwind {2202; X64-LABEL: length64_lt:2203; X64: # %bb.0:2204; X64-NEXT: pushq %rax2205; X64-NEXT: movl $64, %edx2206; X64-NEXT: callq memcmp2207; X64-NEXT: shrl $31, %eax2208; X64-NEXT: # kill: def $al killed $al killed $eax2209; X64-NEXT: popq %rcx2210; X64-NEXT: retq2211 %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 64) nounwind2212 %cmp = icmp slt i32 %call, 02213 ret i1 %cmp2214}2215 2216define i1 @length64_gt(ptr %x, ptr %y) nounwind {2217; X64-LABEL: length64_gt:2218; X64: # %bb.0:2219; X64-NEXT: pushq %rax2220; X64-NEXT: movl $64, %edx2221; X64-NEXT: callq memcmp2222; X64-NEXT: testl %eax, %eax2223; X64-NEXT: setg %al2224; X64-NEXT: popq %rcx2225; X64-NEXT: retq2226 %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 64) nounwind2227 %cmp = icmp sgt i32 %call, 02228 ret i1 %cmp2229}2230 2231define i1 @length64_eq_const(ptr %X) nounwind {2232; X64-SSE2-LABEL: length64_eq_const:2233; X64-SSE2: # %bb.0:2234; X64-SSE2-NEXT: movdqu (%rdi), %xmm02235; X64-SSE2-NEXT: movdqu 16(%rdi), %xmm12236; X64-SSE2-NEXT: movdqu 32(%rdi), %xmm22237; X64-SSE2-NEXT: movdqu 48(%rdi), %xmm32238; X64-SSE2-NEXT: pcmpeqb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm32239; X64-SSE2-NEXT: pcmpeqb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm22240; X64-SSE2-NEXT: pand %xmm3, %xmm22241; X64-SSE2-NEXT: pcmpeqb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm12242; X64-SSE2-NEXT: pcmpeqb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm02243; X64-SSE2-NEXT: pand %xmm1, %xmm02244; X64-SSE2-NEXT: pand %xmm2, %xmm02245; X64-SSE2-NEXT: pmovmskb %xmm0, %eax2246; X64-SSE2-NEXT: cmpl $65535, %eax # imm = 0xFFFF2247; X64-SSE2-NEXT: sete %al2248; X64-SSE2-NEXT: retq2249;2250; X64-SSE41-LABEL: length64_eq_const:2251; X64-SSE41: # %bb.0:2252; X64-SSE41-NEXT: movdqu (%rdi), %xmm02253; X64-SSE41-NEXT: movdqu 16(%rdi), %xmm12254; X64-SSE41-NEXT: movdqu 32(%rdi), %xmm22255; X64-SSE41-NEXT: movdqu 48(%rdi), %xmm32256; X64-SSE41-NEXT: pxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm32257; X64-SSE41-NEXT: pxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm22258; X64-SSE41-NEXT: por %xmm3, %xmm22259; X64-SSE41-NEXT: pxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm12260; X64-SSE41-NEXT: pxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm02261; X64-SSE41-NEXT: por %xmm1, %xmm02262; X64-SSE41-NEXT: por %xmm2, %xmm02263; X64-SSE41-NEXT: ptest %xmm0, %xmm02264; X64-SSE41-NEXT: sete %al2265; X64-SSE41-NEXT: retq2266;2267; X64-AVX1-LABEL: length64_eq_const:2268; X64-AVX1: # %bb.0:2269; X64-AVX1-NEXT: vmovups (%rdi), %ymm02270; X64-AVX1-NEXT: vmovups 32(%rdi), %ymm12271; X64-AVX1-NEXT: vxorps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm12272; X64-AVX1-NEXT: vxorps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm02273; X64-AVX1-NEXT: vorps %ymm1, %ymm0, %ymm02274; X64-AVX1-NEXT: vptest %ymm0, %ymm02275; X64-AVX1-NEXT: sete %al2276; X64-AVX1-NEXT: vzeroupper2277; X64-AVX1-NEXT: retq2278;2279; X64-AVX2-LABEL: length64_eq_const:2280; X64-AVX2: # %bb.0:2281; X64-AVX2-NEXT: vmovdqu (%rdi), %ymm02282; X64-AVX2-NEXT: vmovdqu 32(%rdi), %ymm12283; X64-AVX2-NEXT: vpxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm12284; X64-AVX2-NEXT: vpxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm02285; X64-AVX2-NEXT: vpor %ymm1, %ymm0, %ymm02286; X64-AVX2-NEXT: vptest %ymm0, %ymm02287; X64-AVX2-NEXT: sete %al2288; X64-AVX2-NEXT: vzeroupper2289; X64-AVX2-NEXT: retq2290;2291; X64-AVX512-LABEL: length64_eq_const:2292; X64-AVX512: # %bb.0:2293; X64-AVX512-NEXT: vmovdqu64 (%rdi), %zmm02294; X64-AVX512-NEXT: vpcmpneqd .L.str(%rip), %zmm0, %k02295; X64-AVX512-NEXT: kortestw %k0, %k02296; X64-AVX512-NEXT: sete %al2297; X64-AVX512-NEXT: vzeroupper2298; X64-AVX512-NEXT: retq2299;2300; X64-MIC-AVX2-LABEL: length64_eq_const:2301; X64-MIC-AVX2: # %bb.0:2302; X64-MIC-AVX2-NEXT: vmovdqu (%rdi), %ymm02303; X64-MIC-AVX2-NEXT: vmovdqu 32(%rdi), %ymm12304; X64-MIC-AVX2-NEXT: vmovdqa {{.*#+}} ymm2 = [892613426,959985462,858927408,926299444,825243960,892613426,959985462,858927408]2305; X64-MIC-AVX2-NEXT: vpcmpneqd %zmm2, %zmm1, %k02306; X64-MIC-AVX2-NEXT: vmovdqa {{.*#+}} ymm1 = [858927408,926299444,825243960,892613426,959985462,858927408,926299444,825243960]2307; X64-MIC-AVX2-NEXT: vpcmpneqd %zmm1, %zmm0, %k12308; X64-MIC-AVX2-NEXT: kortestw %k0, %k12309; X64-MIC-AVX2-NEXT: sete %al2310; X64-MIC-AVX2-NEXT: vzeroupper2311; X64-MIC-AVX2-NEXT: retq2312;2313; X64-MIC-AVX512F-LABEL: length64_eq_const:2314; X64-MIC-AVX512F: # %bb.0:2315; X64-MIC-AVX512F-NEXT: vmovdqu64 (%rdi), %zmm02316; X64-MIC-AVX512F-NEXT: vpcmpneqd .L.str(%rip), %zmm0, %k02317; X64-MIC-AVX512F-NEXT: kortestw %k0, %k02318; X64-MIC-AVX512F-NEXT: sete %al2319; X64-MIC-AVX512F-NEXT: vzeroupper2320; X64-MIC-AVX512F-NEXT: retq2321 %m = tail call i32 @memcmp(ptr %X, ptr @.str, i64 64) nounwind2322 %c = icmp eq i32 %m, 02323 ret i1 %c2324}2325 2326define i32 @length96(ptr %X, ptr %Y) nounwind {2327; X64-LABEL: length96:2328; X64: # %bb.0:2329; X64-NEXT: movl $96, %edx2330; X64-NEXT: jmp memcmp # TAILCALL2331 %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 96) nounwind2332 ret i32 %m2333}2334 2335define i1 @length96_eq(ptr %x, ptr %y) nounwind {2336; X64-SSE-LABEL: length96_eq:2337; X64-SSE: # %bb.0:2338; X64-SSE-NEXT: pushq %rax2339; X64-SSE-NEXT: movl $96, %edx2340; X64-SSE-NEXT: callq memcmp2341; X64-SSE-NEXT: testl %eax, %eax2342; X64-SSE-NEXT: setne %al2343; X64-SSE-NEXT: popq %rcx2344; X64-SSE-NEXT: retq2345;2346; X64-AVX1-LABEL: length96_eq:2347; X64-AVX1: # %bb.0:2348; X64-AVX1-NEXT: vmovups (%rdi), %ymm02349; X64-AVX1-NEXT: vmovups 32(%rdi), %ymm12350; X64-AVX1-NEXT: vmovups 64(%rdi), %ymm22351; X64-AVX1-NEXT: vxorps 32(%rsi), %ymm1, %ymm12352; X64-AVX1-NEXT: vxorps (%rsi), %ymm0, %ymm02353; X64-AVX1-NEXT: vorps %ymm1, %ymm0, %ymm02354; X64-AVX1-NEXT: vxorps 64(%rsi), %ymm2, %ymm12355; X64-AVX1-NEXT: vorps %ymm1, %ymm0, %ymm02356; X64-AVX1-NEXT: vptest %ymm0, %ymm02357; X64-AVX1-NEXT: setne %al2358; X64-AVX1-NEXT: vzeroupper2359; X64-AVX1-NEXT: retq2360;2361; X64-AVX2-LABEL: length96_eq:2362; X64-AVX2: # %bb.0:2363; X64-AVX2-NEXT: vmovdqu (%rdi), %ymm02364; X64-AVX2-NEXT: vmovdqu 32(%rdi), %ymm12365; X64-AVX2-NEXT: vmovdqu 64(%rdi), %ymm22366; X64-AVX2-NEXT: vpxor 32(%rsi), %ymm1, %ymm12367; X64-AVX2-NEXT: vpxor (%rsi), %ymm0, %ymm02368; X64-AVX2-NEXT: vpor %ymm1, %ymm0, %ymm02369; X64-AVX2-NEXT: vpxor 64(%rsi), %ymm2, %ymm12370; X64-AVX2-NEXT: vpor %ymm1, %ymm0, %ymm02371; X64-AVX2-NEXT: vptest %ymm0, %ymm02372; X64-AVX2-NEXT: setne %al2373; X64-AVX2-NEXT: vzeroupper2374; X64-AVX2-NEXT: retq2375;2376; X64-AVX512BW-LABEL: length96_eq:2377; X64-AVX512BW: # %bb.0:2378; X64-AVX512BW-NEXT: vmovdqu64 (%rdi), %zmm02379; X64-AVX512BW-NEXT: vmovdqu 64(%rdi), %ymm12380; X64-AVX512BW-NEXT: vmovdqu 64(%rsi), %ymm22381; X64-AVX512BW-NEXT: vpcmpneqb (%rsi), %zmm0, %k02382; X64-AVX512BW-NEXT: vpcmpneqb %zmm2, %zmm1, %k12383; X64-AVX512BW-NEXT: kortestq %k1, %k02384; X64-AVX512BW-NEXT: setne %al2385; X64-AVX512BW-NEXT: vzeroupper2386; X64-AVX512BW-NEXT: retq2387;2388; X64-AVX512F-LABEL: length96_eq:2389; X64-AVX512F: # %bb.0:2390; X64-AVX512F-NEXT: vmovdqu64 (%rdi), %zmm02391; X64-AVX512F-NEXT: vmovdqu 64(%rdi), %ymm12392; X64-AVX512F-NEXT: vmovdqu 64(%rsi), %ymm22393; X64-AVX512F-NEXT: vpcmpneqd (%rsi), %zmm0, %k02394; X64-AVX512F-NEXT: vpcmpneqd %zmm2, %zmm1, %k12395; X64-AVX512F-NEXT: kortestw %k1, %k02396; X64-AVX512F-NEXT: setne %al2397; X64-AVX512F-NEXT: vzeroupper2398; X64-AVX512F-NEXT: retq2399;2400; X64-MIC-AVX2-LABEL: length96_eq:2401; X64-MIC-AVX2: # %bb.0:2402; X64-MIC-AVX2-NEXT: vmovdqu (%rdi), %ymm02403; X64-MIC-AVX2-NEXT: vmovdqu 32(%rdi), %ymm12404; X64-MIC-AVX2-NEXT: vmovdqu 64(%rdi), %ymm22405; X64-MIC-AVX2-NEXT: vmovdqu (%rsi), %ymm32406; X64-MIC-AVX2-NEXT: vmovdqu 32(%rsi), %ymm42407; X64-MIC-AVX2-NEXT: vmovdqu 64(%rsi), %ymm52408; X64-MIC-AVX2-NEXT: vpcmpneqd %zmm4, %zmm1, %k02409; X64-MIC-AVX2-NEXT: vpcmpneqd %zmm3, %zmm0, %k12410; X64-MIC-AVX2-NEXT: korw %k0, %k1, %k02411; X64-MIC-AVX2-NEXT: vpcmpneqd %zmm5, %zmm2, %k12412; X64-MIC-AVX2-NEXT: kortestw %k1, %k02413; X64-MIC-AVX2-NEXT: setne %al2414; X64-MIC-AVX2-NEXT: vzeroupper2415; X64-MIC-AVX2-NEXT: retq2416;2417; X64-MIC-AVX512F-LABEL: length96_eq:2418; X64-MIC-AVX512F: # %bb.0:2419; X64-MIC-AVX512F-NEXT: vmovdqu64 (%rdi), %zmm02420; X64-MIC-AVX512F-NEXT: vmovdqu 64(%rdi), %ymm12421; X64-MIC-AVX512F-NEXT: vmovdqu 64(%rsi), %ymm22422; X64-MIC-AVX512F-NEXT: vpcmpneqd (%rsi), %zmm0, %k02423; X64-MIC-AVX512F-NEXT: vpcmpneqd %zmm2, %zmm1, %k12424; X64-MIC-AVX512F-NEXT: kortestw %k1, %k02425; X64-MIC-AVX512F-NEXT: setne %al2426; X64-MIC-AVX512F-NEXT: vzeroupper2427; X64-MIC-AVX512F-NEXT: retq2428 %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 96) nounwind2429 %cmp = icmp ne i32 %call, 02430 ret i1 %cmp2431}2432 2433define i1 @length96_lt(ptr %x, ptr %y) nounwind {2434; X64-LABEL: length96_lt:2435; X64: # %bb.0:2436; X64-NEXT: pushq %rax2437; X64-NEXT: movl $96, %edx2438; X64-NEXT: callq memcmp2439; X64-NEXT: shrl $31, %eax2440; X64-NEXT: # kill: def $al killed $al killed $eax2441; X64-NEXT: popq %rcx2442; X64-NEXT: retq2443 %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 96) nounwind2444 %cmp = icmp slt i32 %call, 02445 ret i1 %cmp2446}2447 2448define i1 @length96_gt(ptr %x, ptr %y) nounwind {2449; X64-LABEL: length96_gt:2450; X64: # %bb.0:2451; X64-NEXT: pushq %rax2452; X64-NEXT: movl $96, %edx2453; X64-NEXT: callq memcmp2454; X64-NEXT: testl %eax, %eax2455; X64-NEXT: setg %al2456; X64-NEXT: popq %rcx2457; X64-NEXT: retq2458 %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 96) nounwind2459 %cmp = icmp sgt i32 %call, 02460 ret i1 %cmp2461}2462 2463define i1 @length96_eq_const(ptr %X) nounwind {2464; X64-SSE-LABEL: length96_eq_const:2465; X64-SSE: # %bb.0:2466; X64-SSE-NEXT: pushq %rax2467; X64-SSE-NEXT: movl $.L.str, %esi2468; X64-SSE-NEXT: movl $96, %edx2469; X64-SSE-NEXT: callq memcmp2470; X64-SSE-NEXT: testl %eax, %eax2471; X64-SSE-NEXT: sete %al2472; X64-SSE-NEXT: popq %rcx2473; X64-SSE-NEXT: retq2474;2475; X64-AVX1-LABEL: length96_eq_const:2476; X64-AVX1: # %bb.0:2477; X64-AVX1-NEXT: vmovups (%rdi), %ymm02478; X64-AVX1-NEXT: vmovups 32(%rdi), %ymm12479; X64-AVX1-NEXT: vmovups 64(%rdi), %ymm22480; X64-AVX1-NEXT: vxorps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm12481; X64-AVX1-NEXT: vxorps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm02482; X64-AVX1-NEXT: vorps %ymm1, %ymm0, %ymm02483; X64-AVX1-NEXT: vxorps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm2, %ymm12484; X64-AVX1-NEXT: vorps %ymm1, %ymm0, %ymm02485; X64-AVX1-NEXT: vptest %ymm0, %ymm02486; X64-AVX1-NEXT: sete %al2487; X64-AVX1-NEXT: vzeroupper2488; X64-AVX1-NEXT: retq2489;2490; X64-AVX2-LABEL: length96_eq_const:2491; X64-AVX2: # %bb.0:2492; X64-AVX2-NEXT: vmovdqu (%rdi), %ymm02493; X64-AVX2-NEXT: vmovdqu 32(%rdi), %ymm12494; X64-AVX2-NEXT: vmovdqu 64(%rdi), %ymm22495; X64-AVX2-NEXT: vpxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm12496; X64-AVX2-NEXT: vpxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm02497; X64-AVX2-NEXT: vpor %ymm1, %ymm0, %ymm02498; X64-AVX2-NEXT: vpxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm2, %ymm12499; X64-AVX2-NEXT: vpor %ymm1, %ymm0, %ymm02500; X64-AVX2-NEXT: vptest %ymm0, %ymm02501; X64-AVX2-NEXT: sete %al2502; X64-AVX2-NEXT: vzeroupper2503; X64-AVX2-NEXT: retq2504;2505; X64-AVX512BW-LABEL: length96_eq_const:2506; X64-AVX512BW: # %bb.0:2507; X64-AVX512BW-NEXT: vmovdqu64 (%rdi), %zmm02508; X64-AVX512BW-NEXT: vmovdqu 64(%rdi), %ymm12509; X64-AVX512BW-NEXT: vpcmpneqb .L.str(%rip), %zmm0, %k02510; X64-AVX512BW-NEXT: vpcmpneqb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %zmm1, %k12511; X64-AVX512BW-NEXT: kortestq %k1, %k02512; X64-AVX512BW-NEXT: sete %al2513; X64-AVX512BW-NEXT: vzeroupper2514; X64-AVX512BW-NEXT: retq2515;2516; X64-AVX512F-LABEL: length96_eq_const:2517; X64-AVX512F: # %bb.0:2518; X64-AVX512F-NEXT: vmovdqu64 (%rdi), %zmm02519; X64-AVX512F-NEXT: vmovdqu 64(%rdi), %ymm12520; X64-AVX512F-NEXT: vpcmpneqd .L.str(%rip), %zmm0, %k02521; X64-AVX512F-NEXT: vpcmpneqd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %zmm1, %k12522; X64-AVX512F-NEXT: kortestw %k1, %k02523; X64-AVX512F-NEXT: sete %al2524; X64-AVX512F-NEXT: vzeroupper2525; X64-AVX512F-NEXT: retq2526;2527; X64-MIC-AVX2-LABEL: length96_eq_const:2528; X64-MIC-AVX2: # %bb.0:2529; X64-MIC-AVX2-NEXT: vmovdqu (%rdi), %ymm02530; X64-MIC-AVX2-NEXT: vmovdqu 32(%rdi), %ymm12531; X64-MIC-AVX2-NEXT: vmovdqu 64(%rdi), %ymm22532; X64-MIC-AVX2-NEXT: vmovdqa {{.*#+}} ymm3 = [892613426,959985462,858927408,926299444,825243960,892613426,959985462,858927408]2533; X64-MIC-AVX2-NEXT: vpcmpneqd %zmm3, %zmm1, %k02534; X64-MIC-AVX2-NEXT: vmovdqa {{.*#+}} ymm1 = [858927408,926299444,825243960,892613426,959985462,858927408,926299444,825243960]2535; X64-MIC-AVX2-NEXT: vpcmpneqd %zmm1, %zmm0, %k12536; X64-MIC-AVX2-NEXT: korw %k0, %k1, %k02537; X64-MIC-AVX2-NEXT: vmovdqa {{.*#+}} ymm0 = [926299444,825243960,892613426,959985462,858927408,926299444,825243960,892613426]2538; X64-MIC-AVX2-NEXT: vpcmpneqd %zmm0, %zmm2, %k12539; X64-MIC-AVX2-NEXT: kortestw %k1, %k02540; X64-MIC-AVX2-NEXT: sete %al2541; X64-MIC-AVX2-NEXT: vzeroupper2542; X64-MIC-AVX2-NEXT: retq2543;2544; X64-MIC-AVX512F-LABEL: length96_eq_const:2545; X64-MIC-AVX512F: # %bb.0:2546; X64-MIC-AVX512F-NEXT: vmovdqu64 (%rdi), %zmm02547; X64-MIC-AVX512F-NEXT: vmovdqu 64(%rdi), %ymm12548; X64-MIC-AVX512F-NEXT: vpcmpneqd .L.str(%rip), %zmm0, %k02549; X64-MIC-AVX512F-NEXT: vpcmpneqd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %zmm1, %k12550; X64-MIC-AVX512F-NEXT: kortestw %k1, %k02551; X64-MIC-AVX512F-NEXT: sete %al2552; X64-MIC-AVX512F-NEXT: vzeroupper2553; X64-MIC-AVX512F-NEXT: retq2554 %m = tail call i32 @memcmp(ptr %X, ptr @.str, i64 96) nounwind2555 %c = icmp eq i32 %m, 02556 ret i1 %c2557}2558 2559define i32 @length127(ptr %X, ptr %Y) nounwind {2560; X64-LABEL: length127:2561; X64: # %bb.0:2562; X64-NEXT: movl $127, %edx2563; X64-NEXT: jmp memcmp # TAILCALL2564 %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 127) nounwind2565 ret i32 %m2566}2567 2568define i1 @length127_eq(ptr %x, ptr %y) nounwind {2569; X64-SSE-LABEL: length127_eq:2570; X64-SSE: # %bb.0:2571; X64-SSE-NEXT: pushq %rax2572; X64-SSE-NEXT: movl $127, %edx2573; X64-SSE-NEXT: callq memcmp2574; X64-SSE-NEXT: testl %eax, %eax2575; X64-SSE-NEXT: setne %al2576; X64-SSE-NEXT: popq %rcx2577; X64-SSE-NEXT: retq2578;2579; X64-AVX1-LABEL: length127_eq:2580; X64-AVX1: # %bb.0:2581; X64-AVX1-NEXT: vmovups (%rdi), %ymm02582; X64-AVX1-NEXT: vmovups 32(%rdi), %ymm12583; X64-AVX1-NEXT: vmovups 64(%rdi), %ymm22584; X64-AVX1-NEXT: vmovups 95(%rdi), %ymm32585; X64-AVX1-NEXT: vxorps 95(%rsi), %ymm3, %ymm32586; X64-AVX1-NEXT: vxorps 64(%rsi), %ymm2, %ymm22587; X64-AVX1-NEXT: vorps %ymm3, %ymm2, %ymm22588; X64-AVX1-NEXT: vxorps 32(%rsi), %ymm1, %ymm12589; X64-AVX1-NEXT: vxorps (%rsi), %ymm0, %ymm02590; X64-AVX1-NEXT: vorps %ymm1, %ymm0, %ymm02591; X64-AVX1-NEXT: vorps %ymm2, %ymm0, %ymm02592; X64-AVX1-NEXT: vptest %ymm0, %ymm02593; X64-AVX1-NEXT: setne %al2594; X64-AVX1-NEXT: vzeroupper2595; X64-AVX1-NEXT: retq2596;2597; X64-AVX2-LABEL: length127_eq:2598; X64-AVX2: # %bb.0:2599; X64-AVX2-NEXT: vmovdqu (%rdi), %ymm02600; X64-AVX2-NEXT: vmovdqu 32(%rdi), %ymm12601; X64-AVX2-NEXT: vmovdqu 64(%rdi), %ymm22602; X64-AVX2-NEXT: vmovdqu 95(%rdi), %ymm32603; X64-AVX2-NEXT: vpxor 95(%rsi), %ymm3, %ymm32604; X64-AVX2-NEXT: vpxor 64(%rsi), %ymm2, %ymm22605; X64-AVX2-NEXT: vpor %ymm3, %ymm2, %ymm22606; X64-AVX2-NEXT: vpxor 32(%rsi), %ymm1, %ymm12607; X64-AVX2-NEXT: vpxor (%rsi), %ymm0, %ymm02608; X64-AVX2-NEXT: vpor %ymm1, %ymm0, %ymm02609; X64-AVX2-NEXT: vpor %ymm2, %ymm0, %ymm02610; X64-AVX2-NEXT: vptest %ymm0, %ymm02611; X64-AVX2-NEXT: setne %al2612; X64-AVX2-NEXT: vzeroupper2613; X64-AVX2-NEXT: retq2614;2615; X64-AVX512BW-LABEL: length127_eq:2616; X64-AVX512BW: # %bb.0:2617; X64-AVX512BW-NEXT: vmovdqu64 (%rdi), %zmm02618; X64-AVX512BW-NEXT: vmovdqu64 63(%rdi), %zmm12619; X64-AVX512BW-NEXT: vpcmpneqb 63(%rsi), %zmm1, %k02620; X64-AVX512BW-NEXT: vpcmpneqb (%rsi), %zmm0, %k12621; X64-AVX512BW-NEXT: kortestq %k0, %k12622; X64-AVX512BW-NEXT: setne %al2623; X64-AVX512BW-NEXT: vzeroupper2624; X64-AVX512BW-NEXT: retq2625;2626; X64-AVX512F-LABEL: length127_eq:2627; X64-AVX512F: # %bb.0:2628; X64-AVX512F-NEXT: vmovdqu64 (%rdi), %zmm02629; X64-AVX512F-NEXT: vmovdqu64 63(%rdi), %zmm12630; X64-AVX512F-NEXT: vpcmpneqd 63(%rsi), %zmm1, %k02631; X64-AVX512F-NEXT: vpcmpneqd (%rsi), %zmm0, %k12632; X64-AVX512F-NEXT: kortestw %k0, %k12633; X64-AVX512F-NEXT: setne %al2634; X64-AVX512F-NEXT: vzeroupper2635; X64-AVX512F-NEXT: retq2636;2637; X64-MIC-AVX2-LABEL: length127_eq:2638; X64-MIC-AVX2: # %bb.0:2639; X64-MIC-AVX2-NEXT: vmovdqu (%rdi), %ymm02640; X64-MIC-AVX2-NEXT: vmovdqu 32(%rdi), %ymm12641; X64-MIC-AVX2-NEXT: vmovdqu 64(%rdi), %ymm22642; X64-MIC-AVX2-NEXT: vmovdqu 95(%rdi), %ymm32643; X64-MIC-AVX2-NEXT: vmovdqu (%rsi), %ymm42644; X64-MIC-AVX2-NEXT: vmovdqu 32(%rsi), %ymm52645; X64-MIC-AVX2-NEXT: vmovdqu 64(%rsi), %ymm62646; X64-MIC-AVX2-NEXT: vmovdqu 95(%rsi), %ymm72647; X64-MIC-AVX2-NEXT: vpcmpneqd %zmm7, %zmm3, %k02648; X64-MIC-AVX2-NEXT: vpcmpneqd %zmm6, %zmm2, %k12649; X64-MIC-AVX2-NEXT: korw %k0, %k1, %k02650; X64-MIC-AVX2-NEXT: vpcmpneqd %zmm5, %zmm1, %k12651; X64-MIC-AVX2-NEXT: vpcmpneqd %zmm4, %zmm0, %k22652; X64-MIC-AVX2-NEXT: korw %k1, %k2, %k12653; X64-MIC-AVX2-NEXT: kortestw %k0, %k12654; X64-MIC-AVX2-NEXT: setne %al2655; X64-MIC-AVX2-NEXT: vzeroupper2656; X64-MIC-AVX2-NEXT: retq2657;2658; X64-MIC-AVX512F-LABEL: length127_eq:2659; X64-MIC-AVX512F: # %bb.0:2660; X64-MIC-AVX512F-NEXT: vmovdqu64 (%rdi), %zmm02661; X64-MIC-AVX512F-NEXT: vmovdqu64 63(%rdi), %zmm12662; X64-MIC-AVX512F-NEXT: vpcmpneqd 63(%rsi), %zmm1, %k02663; X64-MIC-AVX512F-NEXT: vpcmpneqd (%rsi), %zmm0, %k12664; X64-MIC-AVX512F-NEXT: kortestw %k0, %k12665; X64-MIC-AVX512F-NEXT: setne %al2666; X64-MIC-AVX512F-NEXT: vzeroupper2667; X64-MIC-AVX512F-NEXT: retq2668 %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 127) nounwind2669 %cmp = icmp ne i32 %call, 02670 ret i1 %cmp2671}2672 2673define i1 @length127_lt(ptr %x, ptr %y) nounwind {2674; X64-LABEL: length127_lt:2675; X64: # %bb.0:2676; X64-NEXT: pushq %rax2677; X64-NEXT: movl $127, %edx2678; X64-NEXT: callq memcmp2679; X64-NEXT: shrl $31, %eax2680; X64-NEXT: # kill: def $al killed $al killed $eax2681; X64-NEXT: popq %rcx2682; X64-NEXT: retq2683 %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 127) nounwind2684 %cmp = icmp slt i32 %call, 02685 ret i1 %cmp2686}2687 2688define i1 @length127_gt(ptr %x, ptr %y) nounwind {2689; X64-LABEL: length127_gt:2690; X64: # %bb.0:2691; X64-NEXT: pushq %rax2692; X64-NEXT: movl $127, %edx2693; X64-NEXT: callq memcmp2694; X64-NEXT: testl %eax, %eax2695; X64-NEXT: setg %al2696; X64-NEXT: popq %rcx2697; X64-NEXT: retq2698 %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 127) nounwind2699 %cmp = icmp sgt i32 %call, 02700 ret i1 %cmp2701}2702 2703define i1 @length127_eq_const(ptr %X) nounwind {2704; X64-SSE-LABEL: length127_eq_const:2705; X64-SSE: # %bb.0:2706; X64-SSE-NEXT: pushq %rax2707; X64-SSE-NEXT: movl $.L.str, %esi2708; X64-SSE-NEXT: movl $127, %edx2709; X64-SSE-NEXT: callq memcmp2710; X64-SSE-NEXT: testl %eax, %eax2711; X64-SSE-NEXT: sete %al2712; X64-SSE-NEXT: popq %rcx2713; X64-SSE-NEXT: retq2714;2715; X64-AVX1-LABEL: length127_eq_const:2716; X64-AVX1: # %bb.0:2717; X64-AVX1-NEXT: vmovups (%rdi), %ymm02718; X64-AVX1-NEXT: vmovups 32(%rdi), %ymm12719; X64-AVX1-NEXT: vmovups 64(%rdi), %ymm22720; X64-AVX1-NEXT: vmovups 95(%rdi), %ymm32721; X64-AVX1-NEXT: vxorps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm3, %ymm32722; X64-AVX1-NEXT: vxorps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm2, %ymm22723; X64-AVX1-NEXT: vorps %ymm3, %ymm2, %ymm22724; X64-AVX1-NEXT: vxorps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm12725; X64-AVX1-NEXT: vxorps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm02726; X64-AVX1-NEXT: vorps %ymm1, %ymm0, %ymm02727; X64-AVX1-NEXT: vorps %ymm2, %ymm0, %ymm02728; X64-AVX1-NEXT: vptest %ymm0, %ymm02729; X64-AVX1-NEXT: sete %al2730; X64-AVX1-NEXT: vzeroupper2731; X64-AVX1-NEXT: retq2732;2733; X64-AVX2-LABEL: length127_eq_const:2734; X64-AVX2: # %bb.0:2735; X64-AVX2-NEXT: vmovdqu (%rdi), %ymm02736; X64-AVX2-NEXT: vmovdqu 32(%rdi), %ymm12737; X64-AVX2-NEXT: vmovdqu 64(%rdi), %ymm22738; X64-AVX2-NEXT: vmovdqu 95(%rdi), %ymm32739; X64-AVX2-NEXT: vpxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm3, %ymm32740; X64-AVX2-NEXT: vpxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm2, %ymm22741; X64-AVX2-NEXT: vpor %ymm3, %ymm2, %ymm22742; X64-AVX2-NEXT: vpxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm12743; X64-AVX2-NEXT: vpxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm02744; X64-AVX2-NEXT: vpor %ymm1, %ymm0, %ymm02745; X64-AVX2-NEXT: vpor %ymm2, %ymm0, %ymm02746; X64-AVX2-NEXT: vptest %ymm0, %ymm02747; X64-AVX2-NEXT: sete %al2748; X64-AVX2-NEXT: vzeroupper2749; X64-AVX2-NEXT: retq2750;2751; X64-AVX512BW-LABEL: length127_eq_const:2752; X64-AVX512BW: # %bb.0:2753; X64-AVX512BW-NEXT: vmovdqu64 (%rdi), %zmm02754; X64-AVX512BW-NEXT: vmovdqu64 63(%rdi), %zmm12755; X64-AVX512BW-NEXT: vpcmpneqb .L.str+63(%rip), %zmm1, %k02756; X64-AVX512BW-NEXT: vpcmpneqb .L.str(%rip), %zmm0, %k12757; X64-AVX512BW-NEXT: kortestq %k0, %k12758; X64-AVX512BW-NEXT: sete %al2759; X64-AVX512BW-NEXT: vzeroupper2760; X64-AVX512BW-NEXT: retq2761;2762; X64-AVX512F-LABEL: length127_eq_const:2763; X64-AVX512F: # %bb.0:2764; X64-AVX512F-NEXT: vmovdqu64 (%rdi), %zmm02765; X64-AVX512F-NEXT: vmovdqu64 63(%rdi), %zmm12766; X64-AVX512F-NEXT: vpcmpneqd .L.str+63(%rip), %zmm1, %k02767; X64-AVX512F-NEXT: vpcmpneqd .L.str(%rip), %zmm0, %k12768; X64-AVX512F-NEXT: kortestw %k0, %k12769; X64-AVX512F-NEXT: sete %al2770; X64-AVX512F-NEXT: vzeroupper2771; X64-AVX512F-NEXT: retq2772;2773; X64-MIC-AVX2-LABEL: length127_eq_const:2774; X64-MIC-AVX2: # %bb.0:2775; X64-MIC-AVX2-NEXT: vmovdqu (%rdi), %ymm02776; X64-MIC-AVX2-NEXT: vmovdqu 32(%rdi), %ymm12777; X64-MIC-AVX2-NEXT: vmovdqu 64(%rdi), %ymm22778; X64-MIC-AVX2-NEXT: vmovdqu 95(%rdi), %ymm32779; X64-MIC-AVX2-NEXT: vmovdqa {{.*#+}} ymm4 = [943142453,842084409,909456435,809056311,875770417,943142453,842084409,909456435]2780; X64-MIC-AVX2-NEXT: vpcmpneqd %zmm4, %zmm3, %k02781; X64-MIC-AVX2-NEXT: vmovdqa {{.*#+}} ymm3 = [926299444,825243960,892613426,959985462,858927408,926299444,825243960,892613426]2782; X64-MIC-AVX2-NEXT: vpcmpneqd %zmm3, %zmm2, %k12783; X64-MIC-AVX2-NEXT: korw %k0, %k1, %k02784; X64-MIC-AVX2-NEXT: vmovdqa {{.*#+}} ymm2 = [892613426,959985462,858927408,926299444,825243960,892613426,959985462,858927408]2785; X64-MIC-AVX2-NEXT: vpcmpneqd %zmm2, %zmm1, %k12786; X64-MIC-AVX2-NEXT: vmovdqa {{.*#+}} ymm1 = [858927408,926299444,825243960,892613426,959985462,858927408,926299444,825243960]2787; X64-MIC-AVX2-NEXT: vpcmpneqd %zmm1, %zmm0, %k22788; X64-MIC-AVX2-NEXT: korw %k1, %k2, %k12789; X64-MIC-AVX2-NEXT: kortestw %k0, %k12790; X64-MIC-AVX2-NEXT: sete %al2791; X64-MIC-AVX2-NEXT: vzeroupper2792; X64-MIC-AVX2-NEXT: retq2793;2794; X64-MIC-AVX512F-LABEL: length127_eq_const:2795; X64-MIC-AVX512F: # %bb.0:2796; X64-MIC-AVX512F-NEXT: vmovdqu64 (%rdi), %zmm02797; X64-MIC-AVX512F-NEXT: vmovdqu64 63(%rdi), %zmm12798; X64-MIC-AVX512F-NEXT: vpcmpneqd .L.str+63(%rip), %zmm1, %k02799; X64-MIC-AVX512F-NEXT: vpcmpneqd .L.str(%rip), %zmm0, %k12800; X64-MIC-AVX512F-NEXT: kortestw %k0, %k12801; X64-MIC-AVX512F-NEXT: sete %al2802; X64-MIC-AVX512F-NEXT: vzeroupper2803; X64-MIC-AVX512F-NEXT: retq2804 %m = tail call i32 @memcmp(ptr %X, ptr @.str, i64 127) nounwind2805 %c = icmp eq i32 %m, 02806 ret i1 %c2807}2808 2809define i32 @length128(ptr %X, ptr %Y) nounwind {2810; X64-LABEL: length128:2811; X64: # %bb.0:2812; X64-NEXT: movl $128, %edx2813; X64-NEXT: jmp memcmp # TAILCALL2814 %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 128) nounwind2815 ret i32 %m2816}2817 2818define i1 @length128_eq(ptr %x, ptr %y) nounwind {2819; X64-SSE-LABEL: length128_eq:2820; X64-SSE: # %bb.0:2821; X64-SSE-NEXT: pushq %rax2822; X64-SSE-NEXT: movl $128, %edx2823; X64-SSE-NEXT: callq memcmp2824; X64-SSE-NEXT: testl %eax, %eax2825; X64-SSE-NEXT: setne %al2826; X64-SSE-NEXT: popq %rcx2827; X64-SSE-NEXT: retq2828;2829; X64-AVX1-LABEL: length128_eq:2830; X64-AVX1: # %bb.0:2831; X64-AVX1-NEXT: vmovups (%rdi), %ymm02832; X64-AVX1-NEXT: vmovups 32(%rdi), %ymm12833; X64-AVX1-NEXT: vmovups 64(%rdi), %ymm22834; X64-AVX1-NEXT: vmovups 96(%rdi), %ymm32835; X64-AVX1-NEXT: vxorps 96(%rsi), %ymm3, %ymm32836; X64-AVX1-NEXT: vxorps 64(%rsi), %ymm2, %ymm22837; X64-AVX1-NEXT: vorps %ymm3, %ymm2, %ymm22838; X64-AVX1-NEXT: vxorps 32(%rsi), %ymm1, %ymm12839; X64-AVX1-NEXT: vxorps (%rsi), %ymm0, %ymm02840; X64-AVX1-NEXT: vorps %ymm1, %ymm0, %ymm02841; X64-AVX1-NEXT: vorps %ymm2, %ymm0, %ymm02842; X64-AVX1-NEXT: vptest %ymm0, %ymm02843; X64-AVX1-NEXT: setne %al2844; X64-AVX1-NEXT: vzeroupper2845; X64-AVX1-NEXT: retq2846;2847; X64-AVX2-LABEL: length128_eq:2848; X64-AVX2: # %bb.0:2849; X64-AVX2-NEXT: vmovdqu (%rdi), %ymm02850; X64-AVX2-NEXT: vmovdqu 32(%rdi), %ymm12851; X64-AVX2-NEXT: vmovdqu 64(%rdi), %ymm22852; X64-AVX2-NEXT: vmovdqu 96(%rdi), %ymm32853; X64-AVX2-NEXT: vpxor 96(%rsi), %ymm3, %ymm32854; X64-AVX2-NEXT: vpxor 64(%rsi), %ymm2, %ymm22855; X64-AVX2-NEXT: vpor %ymm3, %ymm2, %ymm22856; X64-AVX2-NEXT: vpxor 32(%rsi), %ymm1, %ymm12857; X64-AVX2-NEXT: vpxor (%rsi), %ymm0, %ymm02858; X64-AVX2-NEXT: vpor %ymm1, %ymm0, %ymm02859; X64-AVX2-NEXT: vpor %ymm2, %ymm0, %ymm02860; X64-AVX2-NEXT: vptest %ymm0, %ymm02861; X64-AVX2-NEXT: setne %al2862; X64-AVX2-NEXT: vzeroupper2863; X64-AVX2-NEXT: retq2864;2865; X64-AVX512BW-LABEL: length128_eq:2866; X64-AVX512BW: # %bb.0:2867; X64-AVX512BW-NEXT: vmovdqu64 (%rdi), %zmm02868; X64-AVX512BW-NEXT: vmovdqu64 64(%rdi), %zmm12869; X64-AVX512BW-NEXT: vpcmpneqb 64(%rsi), %zmm1, %k02870; X64-AVX512BW-NEXT: vpcmpneqb (%rsi), %zmm0, %k12871; X64-AVX512BW-NEXT: kortestq %k0, %k12872; X64-AVX512BW-NEXT: setne %al2873; X64-AVX512BW-NEXT: vzeroupper2874; X64-AVX512BW-NEXT: retq2875;2876; X64-AVX512F-LABEL: length128_eq:2877; X64-AVX512F: # %bb.0:2878; X64-AVX512F-NEXT: vmovdqu64 (%rdi), %zmm02879; X64-AVX512F-NEXT: vmovdqu64 64(%rdi), %zmm12880; X64-AVX512F-NEXT: vpcmpneqd 64(%rsi), %zmm1, %k02881; X64-AVX512F-NEXT: vpcmpneqd (%rsi), %zmm0, %k12882; X64-AVX512F-NEXT: kortestw %k0, %k12883; X64-AVX512F-NEXT: setne %al2884; X64-AVX512F-NEXT: vzeroupper2885; X64-AVX512F-NEXT: retq2886;2887; X64-MIC-AVX2-LABEL: length128_eq:2888; X64-MIC-AVX2: # %bb.0:2889; X64-MIC-AVX2-NEXT: vmovdqu (%rdi), %ymm02890; X64-MIC-AVX2-NEXT: vmovdqu 32(%rdi), %ymm12891; X64-MIC-AVX2-NEXT: vmovdqu 64(%rdi), %ymm22892; X64-MIC-AVX2-NEXT: vmovdqu 96(%rdi), %ymm32893; X64-MIC-AVX2-NEXT: vmovdqu (%rsi), %ymm42894; X64-MIC-AVX2-NEXT: vmovdqu 32(%rsi), %ymm52895; X64-MIC-AVX2-NEXT: vmovdqu 64(%rsi), %ymm62896; X64-MIC-AVX2-NEXT: vmovdqu 96(%rsi), %ymm72897; X64-MIC-AVX2-NEXT: vpcmpneqd %zmm7, %zmm3, %k02898; X64-MIC-AVX2-NEXT: vpcmpneqd %zmm6, %zmm2, %k12899; X64-MIC-AVX2-NEXT: korw %k0, %k1, %k02900; X64-MIC-AVX2-NEXT: vpcmpneqd %zmm5, %zmm1, %k12901; X64-MIC-AVX2-NEXT: vpcmpneqd %zmm4, %zmm0, %k22902; X64-MIC-AVX2-NEXT: korw %k1, %k2, %k12903; X64-MIC-AVX2-NEXT: kortestw %k0, %k12904; X64-MIC-AVX2-NEXT: setne %al2905; X64-MIC-AVX2-NEXT: vzeroupper2906; X64-MIC-AVX2-NEXT: retq2907;2908; X64-MIC-AVX512F-LABEL: length128_eq:2909; X64-MIC-AVX512F: # %bb.0:2910; X64-MIC-AVX512F-NEXT: vmovdqu64 (%rdi), %zmm02911; X64-MIC-AVX512F-NEXT: vmovdqu64 64(%rdi), %zmm12912; X64-MIC-AVX512F-NEXT: vpcmpneqd 64(%rsi), %zmm1, %k02913; X64-MIC-AVX512F-NEXT: vpcmpneqd (%rsi), %zmm0, %k12914; X64-MIC-AVX512F-NEXT: kortestw %k0, %k12915; X64-MIC-AVX512F-NEXT: setne %al2916; X64-MIC-AVX512F-NEXT: vzeroupper2917; X64-MIC-AVX512F-NEXT: retq2918 %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 128) nounwind2919 %cmp = icmp ne i32 %call, 02920 ret i1 %cmp2921}2922 2923define i1 @length128_lt(ptr %x, ptr %y) nounwind {2924; X64-LABEL: length128_lt:2925; X64: # %bb.0:2926; X64-NEXT: pushq %rax2927; X64-NEXT: movl $128, %edx2928; X64-NEXT: callq memcmp2929; X64-NEXT: shrl $31, %eax2930; X64-NEXT: # kill: def $al killed $al killed $eax2931; X64-NEXT: popq %rcx2932; X64-NEXT: retq2933 %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 128) nounwind2934 %cmp = icmp slt i32 %call, 02935 ret i1 %cmp2936}2937 2938define i1 @length128_gt(ptr %x, ptr %y) nounwind {2939; X64-LABEL: length128_gt:2940; X64: # %bb.0:2941; X64-NEXT: pushq %rax2942; X64-NEXT: movl $128, %edx2943; X64-NEXT: callq memcmp2944; X64-NEXT: testl %eax, %eax2945; X64-NEXT: setg %al2946; X64-NEXT: popq %rcx2947; X64-NEXT: retq2948 %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 128) nounwind2949 %cmp = icmp sgt i32 %call, 02950 ret i1 %cmp2951}2952 2953define i1 @length128_eq_const(ptr %X) nounwind {2954; X64-SSE-LABEL: length128_eq_const:2955; X64-SSE: # %bb.0:2956; X64-SSE-NEXT: pushq %rax2957; X64-SSE-NEXT: movl $.L.str, %esi2958; X64-SSE-NEXT: movl $128, %edx2959; X64-SSE-NEXT: callq memcmp2960; X64-SSE-NEXT: testl %eax, %eax2961; X64-SSE-NEXT: sete %al2962; X64-SSE-NEXT: popq %rcx2963; X64-SSE-NEXT: retq2964;2965; X64-AVX1-LABEL: length128_eq_const:2966; X64-AVX1: # %bb.0:2967; X64-AVX1-NEXT: vmovups (%rdi), %ymm02968; X64-AVX1-NEXT: vmovups 32(%rdi), %ymm12969; X64-AVX1-NEXT: vmovups 64(%rdi), %ymm22970; X64-AVX1-NEXT: vmovups 96(%rdi), %ymm32971; X64-AVX1-NEXT: vxorps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm3, %ymm32972; X64-AVX1-NEXT: vxorps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm2, %ymm22973; X64-AVX1-NEXT: vorps %ymm3, %ymm2, %ymm22974; X64-AVX1-NEXT: vxorps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm12975; X64-AVX1-NEXT: vxorps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm02976; X64-AVX1-NEXT: vorps %ymm1, %ymm0, %ymm02977; X64-AVX1-NEXT: vorps %ymm2, %ymm0, %ymm02978; X64-AVX1-NEXT: vptest %ymm0, %ymm02979; X64-AVX1-NEXT: sete %al2980; X64-AVX1-NEXT: vzeroupper2981; X64-AVX1-NEXT: retq2982;2983; X64-AVX2-LABEL: length128_eq_const:2984; X64-AVX2: # %bb.0:2985; X64-AVX2-NEXT: vmovdqu (%rdi), %ymm02986; X64-AVX2-NEXT: vmovdqu 32(%rdi), %ymm12987; X64-AVX2-NEXT: vmovdqu 64(%rdi), %ymm22988; X64-AVX2-NEXT: vmovdqu 96(%rdi), %ymm32989; X64-AVX2-NEXT: vpxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm3, %ymm32990; X64-AVX2-NEXT: vpxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm2, %ymm22991; X64-AVX2-NEXT: vpor %ymm3, %ymm2, %ymm22992; X64-AVX2-NEXT: vpxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm12993; X64-AVX2-NEXT: vpxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm02994; X64-AVX2-NEXT: vpor %ymm1, %ymm0, %ymm02995; X64-AVX2-NEXT: vpor %ymm2, %ymm0, %ymm02996; X64-AVX2-NEXT: vptest %ymm0, %ymm02997; X64-AVX2-NEXT: sete %al2998; X64-AVX2-NEXT: vzeroupper2999; X64-AVX2-NEXT: retq3000;3001; X64-AVX512BW-LABEL: length128_eq_const:3002; X64-AVX512BW: # %bb.0:3003; X64-AVX512BW-NEXT: vmovdqu64 (%rdi), %zmm03004; X64-AVX512BW-NEXT: vmovdqu64 64(%rdi), %zmm13005; X64-AVX512BW-NEXT: vpcmpneqb .L.str+64(%rip), %zmm1, %k03006; X64-AVX512BW-NEXT: vpcmpneqb .L.str(%rip), %zmm0, %k13007; X64-AVX512BW-NEXT: kortestq %k0, %k13008; X64-AVX512BW-NEXT: sete %al3009; X64-AVX512BW-NEXT: vzeroupper3010; X64-AVX512BW-NEXT: retq3011;3012; X64-AVX512F-LABEL: length128_eq_const:3013; X64-AVX512F: # %bb.0:3014; X64-AVX512F-NEXT: vmovdqu64 (%rdi), %zmm03015; X64-AVX512F-NEXT: vmovdqu64 64(%rdi), %zmm13016; X64-AVX512F-NEXT: vpcmpneqd .L.str+64(%rip), %zmm1, %k03017; X64-AVX512F-NEXT: vpcmpneqd .L.str(%rip), %zmm0, %k13018; X64-AVX512F-NEXT: kortestw %k0, %k13019; X64-AVX512F-NEXT: sete %al3020; X64-AVX512F-NEXT: vzeroupper3021; X64-AVX512F-NEXT: retq3022;3023; X64-MIC-AVX2-LABEL: length128_eq_const:3024; X64-MIC-AVX2: # %bb.0:3025; X64-MIC-AVX2-NEXT: vmovdqu (%rdi), %ymm03026; X64-MIC-AVX2-NEXT: vmovdqu 32(%rdi), %ymm13027; X64-MIC-AVX2-NEXT: vmovdqu 64(%rdi), %ymm23028; X64-MIC-AVX2-NEXT: vmovdqu 96(%rdi), %ymm33029; X64-MIC-AVX2-NEXT: vmovdqa {{.*#+}} ymm4 = [959985462,858927408,926299444,825243960,892613426,959985462,858927408,926299444]3030; X64-MIC-AVX2-NEXT: vpcmpneqd %zmm4, %zmm3, %k03031; X64-MIC-AVX2-NEXT: vmovdqa {{.*#+}} ymm3 = [926299444,825243960,892613426,959985462,858927408,926299444,825243960,892613426]3032; X64-MIC-AVX2-NEXT: vpcmpneqd %zmm3, %zmm2, %k13033; X64-MIC-AVX2-NEXT: korw %k0, %k1, %k03034; X64-MIC-AVX2-NEXT: vmovdqa {{.*#+}} ymm2 = [892613426,959985462,858927408,926299444,825243960,892613426,959985462,858927408]3035; X64-MIC-AVX2-NEXT: vpcmpneqd %zmm2, %zmm1, %k13036; X64-MIC-AVX2-NEXT: vmovdqa {{.*#+}} ymm1 = [858927408,926299444,825243960,892613426,959985462,858927408,926299444,825243960]3037; X64-MIC-AVX2-NEXT: vpcmpneqd %zmm1, %zmm0, %k23038; X64-MIC-AVX2-NEXT: korw %k1, %k2, %k13039; X64-MIC-AVX2-NEXT: kortestw %k0, %k13040; X64-MIC-AVX2-NEXT: sete %al3041; X64-MIC-AVX2-NEXT: vzeroupper3042; X64-MIC-AVX2-NEXT: retq3043;3044; X64-MIC-AVX512F-LABEL: length128_eq_const:3045; X64-MIC-AVX512F: # %bb.0:3046; X64-MIC-AVX512F-NEXT: vmovdqu64 (%rdi), %zmm03047; X64-MIC-AVX512F-NEXT: vmovdqu64 64(%rdi), %zmm13048; X64-MIC-AVX512F-NEXT: vpcmpneqd .L.str+64(%rip), %zmm1, %k03049; X64-MIC-AVX512F-NEXT: vpcmpneqd .L.str(%rip), %zmm0, %k13050; X64-MIC-AVX512F-NEXT: kortestw %k0, %k13051; X64-MIC-AVX512F-NEXT: sete %al3052; X64-MIC-AVX512F-NEXT: vzeroupper3053; X64-MIC-AVX512F-NEXT: retq3054 %m = tail call i32 @memcmp(ptr %X, ptr @.str, i64 128) nounwind3055 %c = icmp eq i32 %m, 03056 ret i1 %c3057}3058 3059define i32 @length192(ptr %X, ptr %Y) nounwind {3060; X64-LABEL: length192:3061; X64: # %bb.0:3062; X64-NEXT: movl $192, %edx3063; X64-NEXT: jmp memcmp # TAILCALL3064 %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 192) nounwind3065 ret i32 %m3066}3067 3068define i1 @length192_eq(ptr %x, ptr %y) nounwind {3069; X64-SSE-LABEL: length192_eq:3070; X64-SSE: # %bb.0:3071; X64-SSE-NEXT: pushq %rax3072; X64-SSE-NEXT: movl $192, %edx3073; X64-SSE-NEXT: callq memcmp3074; X64-SSE-NEXT: testl %eax, %eax3075; X64-SSE-NEXT: setne %al3076; X64-SSE-NEXT: popq %rcx3077; X64-SSE-NEXT: retq3078;3079; X64-AVX1-LABEL: length192_eq:3080; X64-AVX1: # %bb.0:3081; X64-AVX1-NEXT: pushq %rax3082; X64-AVX1-NEXT: movl $192, %edx3083; X64-AVX1-NEXT: callq memcmp3084; X64-AVX1-NEXT: testl %eax, %eax3085; X64-AVX1-NEXT: setne %al3086; X64-AVX1-NEXT: popq %rcx3087; X64-AVX1-NEXT: retq3088;3089; X64-AVX2-LABEL: length192_eq:3090; X64-AVX2: # %bb.0:3091; X64-AVX2-NEXT: pushq %rax3092; X64-AVX2-NEXT: movl $192, %edx3093; X64-AVX2-NEXT: callq memcmp3094; X64-AVX2-NEXT: testl %eax, %eax3095; X64-AVX2-NEXT: setne %al3096; X64-AVX2-NEXT: popq %rcx3097; X64-AVX2-NEXT: retq3098;3099; X64-AVX512BW-LABEL: length192_eq:3100; X64-AVX512BW: # %bb.0:3101; X64-AVX512BW-NEXT: vmovdqu64 (%rdi), %zmm03102; X64-AVX512BW-NEXT: vmovdqu64 64(%rdi), %zmm13103; X64-AVX512BW-NEXT: vmovdqu64 128(%rdi), %zmm23104; X64-AVX512BW-NEXT: vpcmpneqb 64(%rsi), %zmm1, %k03105; X64-AVX512BW-NEXT: vpcmpneqb (%rsi), %zmm0, %k13106; X64-AVX512BW-NEXT: korq %k0, %k1, %k03107; X64-AVX512BW-NEXT: vpcmpneqb 128(%rsi), %zmm2, %k13108; X64-AVX512BW-NEXT: kortestq %k1, %k03109; X64-AVX512BW-NEXT: setne %al3110; X64-AVX512BW-NEXT: vzeroupper3111; X64-AVX512BW-NEXT: retq3112;3113; X64-AVX512F-LABEL: length192_eq:3114; X64-AVX512F: # %bb.0:3115; X64-AVX512F-NEXT: vmovdqu64 (%rdi), %zmm03116; X64-AVX512F-NEXT: vmovdqu64 64(%rdi), %zmm13117; X64-AVX512F-NEXT: vmovdqu64 128(%rdi), %zmm23118; X64-AVX512F-NEXT: vpcmpneqd 64(%rsi), %zmm1, %k03119; X64-AVX512F-NEXT: vpcmpneqd (%rsi), %zmm0, %k13120; X64-AVX512F-NEXT: korw %k0, %k1, %k03121; X64-AVX512F-NEXT: vpcmpneqd 128(%rsi), %zmm2, %k13122; X64-AVX512F-NEXT: kortestw %k1, %k03123; X64-AVX512F-NEXT: setne %al3124; X64-AVX512F-NEXT: vzeroupper3125; X64-AVX512F-NEXT: retq3126;3127; X64-MIC-AVX2-LABEL: length192_eq:3128; X64-MIC-AVX2: # %bb.0:3129; X64-MIC-AVX2-NEXT: pushq %rax3130; X64-MIC-AVX2-NEXT: movl $192, %edx3131; X64-MIC-AVX2-NEXT: callq memcmp3132; X64-MIC-AVX2-NEXT: testl %eax, %eax3133; X64-MIC-AVX2-NEXT: setne %al3134; X64-MIC-AVX2-NEXT: popq %rcx3135; X64-MIC-AVX2-NEXT: retq3136;3137; X64-MIC-AVX512F-LABEL: length192_eq:3138; X64-MIC-AVX512F: # %bb.0:3139; X64-MIC-AVX512F-NEXT: vmovdqu64 (%rdi), %zmm03140; X64-MIC-AVX512F-NEXT: vmovdqu64 64(%rdi), %zmm13141; X64-MIC-AVX512F-NEXT: vmovdqu64 128(%rdi), %zmm23142; X64-MIC-AVX512F-NEXT: vpcmpneqd 64(%rsi), %zmm1, %k03143; X64-MIC-AVX512F-NEXT: vpcmpneqd (%rsi), %zmm0, %k13144; X64-MIC-AVX512F-NEXT: korw %k0, %k1, %k03145; X64-MIC-AVX512F-NEXT: vpcmpneqd 128(%rsi), %zmm2, %k13146; X64-MIC-AVX512F-NEXT: kortestw %k1, %k03147; X64-MIC-AVX512F-NEXT: setne %al3148; X64-MIC-AVX512F-NEXT: vzeroupper3149; X64-MIC-AVX512F-NEXT: retq3150 %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 192) nounwind3151 %cmp = icmp ne i32 %call, 03152 ret i1 %cmp3153}3154 3155define i1 @length192_lt(ptr %x, ptr %y) nounwind {3156; X64-LABEL: length192_lt:3157; X64: # %bb.0:3158; X64-NEXT: pushq %rax3159; X64-NEXT: movl $192, %edx3160; X64-NEXT: callq memcmp3161; X64-NEXT: shrl $31, %eax3162; X64-NEXT: # kill: def $al killed $al killed $eax3163; X64-NEXT: popq %rcx3164; X64-NEXT: retq3165 %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 192) nounwind3166 %cmp = icmp slt i32 %call, 03167 ret i1 %cmp3168}3169 3170define i1 @length192_gt(ptr %x, ptr %y) nounwind {3171; X64-LABEL: length192_gt:3172; X64: # %bb.0:3173; X64-NEXT: pushq %rax3174; X64-NEXT: movl $192, %edx3175; X64-NEXT: callq memcmp3176; X64-NEXT: testl %eax, %eax3177; X64-NEXT: setg %al3178; X64-NEXT: popq %rcx3179; X64-NEXT: retq3180 %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 192) nounwind3181 %cmp = icmp sgt i32 %call, 03182 ret i1 %cmp3183}3184 3185define i1 @length192_eq_const(ptr %X) nounwind {3186; X64-SSE-LABEL: length192_eq_const:3187; X64-SSE: # %bb.0:3188; X64-SSE-NEXT: pushq %rax3189; X64-SSE-NEXT: movl $.L.str, %esi3190; X64-SSE-NEXT: movl $192, %edx3191; X64-SSE-NEXT: callq memcmp3192; X64-SSE-NEXT: testl %eax, %eax3193; X64-SSE-NEXT: sete %al3194; X64-SSE-NEXT: popq %rcx3195; X64-SSE-NEXT: retq3196;3197; X64-AVX1-LABEL: length192_eq_const:3198; X64-AVX1: # %bb.0:3199; X64-AVX1-NEXT: pushq %rax3200; X64-AVX1-NEXT: movl $.L.str, %esi3201; X64-AVX1-NEXT: movl $192, %edx3202; X64-AVX1-NEXT: callq memcmp3203; X64-AVX1-NEXT: testl %eax, %eax3204; X64-AVX1-NEXT: sete %al3205; X64-AVX1-NEXT: popq %rcx3206; X64-AVX1-NEXT: retq3207;3208; X64-AVX2-LABEL: length192_eq_const:3209; X64-AVX2: # %bb.0:3210; X64-AVX2-NEXT: pushq %rax3211; X64-AVX2-NEXT: movl $.L.str, %esi3212; X64-AVX2-NEXT: movl $192, %edx3213; X64-AVX2-NEXT: callq memcmp3214; X64-AVX2-NEXT: testl %eax, %eax3215; X64-AVX2-NEXT: sete %al3216; X64-AVX2-NEXT: popq %rcx3217; X64-AVX2-NEXT: retq3218;3219; X64-AVX512BW-LABEL: length192_eq_const:3220; X64-AVX512BW: # %bb.0:3221; X64-AVX512BW-NEXT: vmovdqu64 (%rdi), %zmm03222; X64-AVX512BW-NEXT: vmovdqu64 64(%rdi), %zmm13223; X64-AVX512BW-NEXT: vmovdqu64 128(%rdi), %zmm23224; X64-AVX512BW-NEXT: vpcmpneqb .L.str+64(%rip), %zmm1, %k03225; X64-AVX512BW-NEXT: vpcmpneqb .L.str(%rip), %zmm0, %k13226; X64-AVX512BW-NEXT: korq %k0, %k1, %k03227; X64-AVX512BW-NEXT: vpcmpneqb .L.str+128(%rip), %zmm2, %k13228; X64-AVX512BW-NEXT: kortestq %k1, %k03229; X64-AVX512BW-NEXT: sete %al3230; X64-AVX512BW-NEXT: vzeroupper3231; X64-AVX512BW-NEXT: retq3232;3233; X64-AVX512F-LABEL: length192_eq_const:3234; X64-AVX512F: # %bb.0:3235; X64-AVX512F-NEXT: vmovdqu64 (%rdi), %zmm03236; X64-AVX512F-NEXT: vmovdqu64 64(%rdi), %zmm13237; X64-AVX512F-NEXT: vmovdqu64 128(%rdi), %zmm23238; X64-AVX512F-NEXT: vpcmpneqd .L.str+64(%rip), %zmm1, %k03239; X64-AVX512F-NEXT: vpcmpneqd .L.str(%rip), %zmm0, %k13240; X64-AVX512F-NEXT: korw %k0, %k1, %k03241; X64-AVX512F-NEXT: vpcmpneqd .L.str+128(%rip), %zmm2, %k13242; X64-AVX512F-NEXT: kortestw %k1, %k03243; X64-AVX512F-NEXT: sete %al3244; X64-AVX512F-NEXT: vzeroupper3245; X64-AVX512F-NEXT: retq3246;3247; X64-MIC-AVX2-LABEL: length192_eq_const:3248; X64-MIC-AVX2: # %bb.0:3249; X64-MIC-AVX2-NEXT: pushq %rax3250; X64-MIC-AVX2-NEXT: movl $.L.str, %esi3251; X64-MIC-AVX2-NEXT: movl $192, %edx3252; X64-MIC-AVX2-NEXT: callq memcmp3253; X64-MIC-AVX2-NEXT: testl %eax, %eax3254; X64-MIC-AVX2-NEXT: sete %al3255; X64-MIC-AVX2-NEXT: popq %rcx3256; X64-MIC-AVX2-NEXT: retq3257;3258; X64-MIC-AVX512F-LABEL: length192_eq_const:3259; X64-MIC-AVX512F: # %bb.0:3260; X64-MIC-AVX512F-NEXT: vmovdqu64 (%rdi), %zmm03261; X64-MIC-AVX512F-NEXT: vmovdqu64 64(%rdi), %zmm13262; X64-MIC-AVX512F-NEXT: vmovdqu64 128(%rdi), %zmm23263; X64-MIC-AVX512F-NEXT: vpcmpneqd .L.str+64(%rip), %zmm1, %k03264; X64-MIC-AVX512F-NEXT: vpcmpneqd .L.str(%rip), %zmm0, %k13265; X64-MIC-AVX512F-NEXT: korw %k0, %k1, %k03266; X64-MIC-AVX512F-NEXT: vpcmpneqd .L.str+128(%rip), %zmm2, %k13267; X64-MIC-AVX512F-NEXT: kortestw %k1, %k03268; X64-MIC-AVX512F-NEXT: sete %al3269; X64-MIC-AVX512F-NEXT: vzeroupper3270; X64-MIC-AVX512F-NEXT: retq3271 %m = tail call i32 @memcmp(ptr %X, ptr @.str, i64 192) nounwind3272 %c = icmp eq i32 %m, 03273 ret i1 %c3274}3275 3276define i32 @length255(ptr %X, ptr %Y) nounwind {3277; X64-LABEL: length255:3278; X64: # %bb.0:3279; X64-NEXT: movl $255, %edx3280; X64-NEXT: jmp memcmp # TAILCALL3281 %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 255) nounwind3282 ret i32 %m3283}3284 3285define i1 @length255_eq(ptr %x, ptr %y) nounwind {3286; X64-SSE-LABEL: length255_eq:3287; X64-SSE: # %bb.0:3288; X64-SSE-NEXT: pushq %rax3289; X64-SSE-NEXT: movl $255, %edx3290; X64-SSE-NEXT: callq memcmp3291; X64-SSE-NEXT: testl %eax, %eax3292; X64-SSE-NEXT: setne %al3293; X64-SSE-NEXT: popq %rcx3294; X64-SSE-NEXT: retq3295;3296; X64-AVX1-LABEL: length255_eq:3297; X64-AVX1: # %bb.0:3298; X64-AVX1-NEXT: pushq %rax3299; X64-AVX1-NEXT: movl $255, %edx3300; X64-AVX1-NEXT: callq memcmp3301; X64-AVX1-NEXT: testl %eax, %eax3302; X64-AVX1-NEXT: setne %al3303; X64-AVX1-NEXT: popq %rcx3304; X64-AVX1-NEXT: retq3305;3306; X64-AVX2-LABEL: length255_eq:3307; X64-AVX2: # %bb.0:3308; X64-AVX2-NEXT: pushq %rax3309; X64-AVX2-NEXT: movl $255, %edx3310; X64-AVX2-NEXT: callq memcmp3311; X64-AVX2-NEXT: testl %eax, %eax3312; X64-AVX2-NEXT: setne %al3313; X64-AVX2-NEXT: popq %rcx3314; X64-AVX2-NEXT: retq3315;3316; X64-AVX512BW-LABEL: length255_eq:3317; X64-AVX512BW: # %bb.0:3318; X64-AVX512BW-NEXT: vmovdqu64 (%rdi), %zmm03319; X64-AVX512BW-NEXT: vmovdqu64 64(%rdi), %zmm13320; X64-AVX512BW-NEXT: vmovdqu64 128(%rdi), %zmm23321; X64-AVX512BW-NEXT: vmovdqu64 191(%rdi), %zmm33322; X64-AVX512BW-NEXT: vpcmpneqb 191(%rsi), %zmm3, %k03323; X64-AVX512BW-NEXT: vpcmpneqb 128(%rsi), %zmm2, %k13324; X64-AVX512BW-NEXT: korq %k0, %k1, %k03325; X64-AVX512BW-NEXT: vpcmpneqb 64(%rsi), %zmm1, %k13326; X64-AVX512BW-NEXT: vpcmpneqb (%rsi), %zmm0, %k23327; X64-AVX512BW-NEXT: korq %k1, %k2, %k13328; X64-AVX512BW-NEXT: kortestq %k0, %k13329; X64-AVX512BW-NEXT: setne %al3330; X64-AVX512BW-NEXT: vzeroupper3331; X64-AVX512BW-NEXT: retq3332;3333; X64-AVX512F-LABEL: length255_eq:3334; X64-AVX512F: # %bb.0:3335; X64-AVX512F-NEXT: vmovdqu64 (%rdi), %zmm03336; X64-AVX512F-NEXT: vmovdqu64 64(%rdi), %zmm13337; X64-AVX512F-NEXT: vmovdqu64 128(%rdi), %zmm23338; X64-AVX512F-NEXT: vmovdqu64 191(%rdi), %zmm33339; X64-AVX512F-NEXT: vpcmpneqd 191(%rsi), %zmm3, %k03340; X64-AVX512F-NEXT: vpcmpneqd 128(%rsi), %zmm2, %k13341; X64-AVX512F-NEXT: korw %k0, %k1, %k03342; X64-AVX512F-NEXT: vpcmpneqd 64(%rsi), %zmm1, %k13343; X64-AVX512F-NEXT: vpcmpneqd (%rsi), %zmm0, %k23344; X64-AVX512F-NEXT: korw %k1, %k2, %k13345; X64-AVX512F-NEXT: kortestw %k0, %k13346; X64-AVX512F-NEXT: setne %al3347; X64-AVX512F-NEXT: vzeroupper3348; X64-AVX512F-NEXT: retq3349;3350; X64-MIC-AVX2-LABEL: length255_eq:3351; X64-MIC-AVX2: # %bb.0:3352; X64-MIC-AVX2-NEXT: pushq %rax3353; X64-MIC-AVX2-NEXT: movl $255, %edx3354; X64-MIC-AVX2-NEXT: callq memcmp3355; X64-MIC-AVX2-NEXT: testl %eax, %eax3356; X64-MIC-AVX2-NEXT: setne %al3357; X64-MIC-AVX2-NEXT: popq %rcx3358; X64-MIC-AVX2-NEXT: retq3359;3360; X64-MIC-AVX512F-LABEL: length255_eq:3361; X64-MIC-AVX512F: # %bb.0:3362; X64-MIC-AVX512F-NEXT: vmovdqu64 (%rdi), %zmm03363; X64-MIC-AVX512F-NEXT: vmovdqu64 64(%rdi), %zmm13364; X64-MIC-AVX512F-NEXT: vmovdqu64 128(%rdi), %zmm23365; X64-MIC-AVX512F-NEXT: vmovdqu64 191(%rdi), %zmm33366; X64-MIC-AVX512F-NEXT: vpcmpneqd 191(%rsi), %zmm3, %k03367; X64-MIC-AVX512F-NEXT: vpcmpneqd 128(%rsi), %zmm2, %k13368; X64-MIC-AVX512F-NEXT: korw %k0, %k1, %k03369; X64-MIC-AVX512F-NEXT: vpcmpneqd 64(%rsi), %zmm1, %k13370; X64-MIC-AVX512F-NEXT: vpcmpneqd (%rsi), %zmm0, %k23371; X64-MIC-AVX512F-NEXT: korw %k1, %k2, %k13372; X64-MIC-AVX512F-NEXT: kortestw %k0, %k13373; X64-MIC-AVX512F-NEXT: setne %al3374; X64-MIC-AVX512F-NEXT: vzeroupper3375; X64-MIC-AVX512F-NEXT: retq3376 %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 255) nounwind3377 %cmp = icmp ne i32 %call, 03378 ret i1 %cmp3379}3380 3381define i1 @length255_lt(ptr %x, ptr %y) nounwind {3382; X64-LABEL: length255_lt:3383; X64: # %bb.0:3384; X64-NEXT: pushq %rax3385; X64-NEXT: movl $255, %edx3386; X64-NEXT: callq memcmp3387; X64-NEXT: shrl $31, %eax3388; X64-NEXT: # kill: def $al killed $al killed $eax3389; X64-NEXT: popq %rcx3390; X64-NEXT: retq3391 %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 255) nounwind3392 %cmp = icmp slt i32 %call, 03393 ret i1 %cmp3394}3395 3396define i1 @length255_gt(ptr %x, ptr %y) nounwind {3397; X64-LABEL: length255_gt:3398; X64: # %bb.0:3399; X64-NEXT: pushq %rax3400; X64-NEXT: movl $255, %edx3401; X64-NEXT: callq memcmp3402; X64-NEXT: testl %eax, %eax3403; X64-NEXT: setg %al3404; X64-NEXT: popq %rcx3405; X64-NEXT: retq3406 %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 255) nounwind3407 %cmp = icmp sgt i32 %call, 03408 ret i1 %cmp3409}3410 3411define i1 @length255_eq_const(ptr %X) nounwind {3412; X64-SSE-LABEL: length255_eq_const:3413; X64-SSE: # %bb.0:3414; X64-SSE-NEXT: pushq %rax3415; X64-SSE-NEXT: movl $.L.str, %esi3416; X64-SSE-NEXT: movl $255, %edx3417; X64-SSE-NEXT: callq memcmp3418; X64-SSE-NEXT: testl %eax, %eax3419; X64-SSE-NEXT: sete %al3420; X64-SSE-NEXT: popq %rcx3421; X64-SSE-NEXT: retq3422;3423; X64-AVX1-LABEL: length255_eq_const:3424; X64-AVX1: # %bb.0:3425; X64-AVX1-NEXT: pushq %rax3426; X64-AVX1-NEXT: movl $.L.str, %esi3427; X64-AVX1-NEXT: movl $255, %edx3428; X64-AVX1-NEXT: callq memcmp3429; X64-AVX1-NEXT: testl %eax, %eax3430; X64-AVX1-NEXT: sete %al3431; X64-AVX1-NEXT: popq %rcx3432; X64-AVX1-NEXT: retq3433;3434; X64-AVX2-LABEL: length255_eq_const:3435; X64-AVX2: # %bb.0:3436; X64-AVX2-NEXT: pushq %rax3437; X64-AVX2-NEXT: movl $.L.str, %esi3438; X64-AVX2-NEXT: movl $255, %edx3439; X64-AVX2-NEXT: callq memcmp3440; X64-AVX2-NEXT: testl %eax, %eax3441; X64-AVX2-NEXT: sete %al3442; X64-AVX2-NEXT: popq %rcx3443; X64-AVX2-NEXT: retq3444;3445; X64-AVX512BW-LABEL: length255_eq_const:3446; X64-AVX512BW: # %bb.0:3447; X64-AVX512BW-NEXT: vmovdqu64 (%rdi), %zmm03448; X64-AVX512BW-NEXT: vmovdqu64 64(%rdi), %zmm13449; X64-AVX512BW-NEXT: vmovdqu64 128(%rdi), %zmm23450; X64-AVX512BW-NEXT: vmovdqu64 191(%rdi), %zmm33451; X64-AVX512BW-NEXT: vpcmpneqb .L.str+191(%rip), %zmm3, %k03452; X64-AVX512BW-NEXT: vpcmpneqb .L.str+128(%rip), %zmm2, %k13453; X64-AVX512BW-NEXT: korq %k0, %k1, %k03454; X64-AVX512BW-NEXT: vpcmpneqb .L.str+64(%rip), %zmm1, %k13455; X64-AVX512BW-NEXT: vpcmpneqb .L.str(%rip), %zmm0, %k23456; X64-AVX512BW-NEXT: korq %k1, %k2, %k13457; X64-AVX512BW-NEXT: kortestq %k0, %k13458; X64-AVX512BW-NEXT: sete %al3459; X64-AVX512BW-NEXT: vzeroupper3460; X64-AVX512BW-NEXT: retq3461;3462; X64-AVX512F-LABEL: length255_eq_const:3463; X64-AVX512F: # %bb.0:3464; X64-AVX512F-NEXT: vmovdqu64 (%rdi), %zmm03465; X64-AVX512F-NEXT: vmovdqu64 64(%rdi), %zmm13466; X64-AVX512F-NEXT: vmovdqu64 128(%rdi), %zmm23467; X64-AVX512F-NEXT: vmovdqu64 191(%rdi), %zmm33468; X64-AVX512F-NEXT: vpcmpneqd .L.str+191(%rip), %zmm3, %k03469; X64-AVX512F-NEXT: vpcmpneqd .L.str+128(%rip), %zmm2, %k13470; X64-AVX512F-NEXT: korw %k0, %k1, %k03471; X64-AVX512F-NEXT: vpcmpneqd .L.str+64(%rip), %zmm1, %k13472; X64-AVX512F-NEXT: vpcmpneqd .L.str(%rip), %zmm0, %k23473; X64-AVX512F-NEXT: korw %k1, %k2, %k13474; X64-AVX512F-NEXT: kortestw %k0, %k13475; X64-AVX512F-NEXT: sete %al3476; X64-AVX512F-NEXT: vzeroupper3477; X64-AVX512F-NEXT: retq3478;3479; X64-MIC-AVX2-LABEL: length255_eq_const:3480; X64-MIC-AVX2: # %bb.0:3481; X64-MIC-AVX2-NEXT: pushq %rax3482; X64-MIC-AVX2-NEXT: movl $.L.str, %esi3483; X64-MIC-AVX2-NEXT: movl $255, %edx3484; X64-MIC-AVX2-NEXT: callq memcmp3485; X64-MIC-AVX2-NEXT: testl %eax, %eax3486; X64-MIC-AVX2-NEXT: sete %al3487; X64-MIC-AVX2-NEXT: popq %rcx3488; X64-MIC-AVX2-NEXT: retq3489;3490; X64-MIC-AVX512F-LABEL: length255_eq_const:3491; X64-MIC-AVX512F: # %bb.0:3492; X64-MIC-AVX512F-NEXT: vmovdqu64 (%rdi), %zmm03493; X64-MIC-AVX512F-NEXT: vmovdqu64 64(%rdi), %zmm13494; X64-MIC-AVX512F-NEXT: vmovdqu64 128(%rdi), %zmm23495; X64-MIC-AVX512F-NEXT: vmovdqu64 191(%rdi), %zmm33496; X64-MIC-AVX512F-NEXT: vpcmpneqd .L.str+191(%rip), %zmm3, %k03497; X64-MIC-AVX512F-NEXT: vpcmpneqd .L.str+128(%rip), %zmm2, %k13498; X64-MIC-AVX512F-NEXT: korw %k0, %k1, %k03499; X64-MIC-AVX512F-NEXT: vpcmpneqd .L.str+64(%rip), %zmm1, %k13500; X64-MIC-AVX512F-NEXT: vpcmpneqd .L.str(%rip), %zmm0, %k23501; X64-MIC-AVX512F-NEXT: korw %k1, %k2, %k13502; X64-MIC-AVX512F-NEXT: kortestw %k0, %k13503; X64-MIC-AVX512F-NEXT: sete %al3504; X64-MIC-AVX512F-NEXT: vzeroupper3505; X64-MIC-AVX512F-NEXT: retq3506 %m = tail call i32 @memcmp(ptr %X, ptr @.str, i64 255) nounwind3507 %c = icmp eq i32 %m, 03508 ret i1 %c3509}3510 3511define i32 @length256(ptr %X, ptr %Y) nounwind {3512; X64-LABEL: length256:3513; X64: # %bb.0:3514; X64-NEXT: movl $256, %edx # imm = 0x1003515; X64-NEXT: jmp memcmp # TAILCALL3516 %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 256) nounwind3517 ret i32 %m3518}3519 3520define i1 @length256_eq(ptr %x, ptr %y) nounwind {3521; X64-SSE-LABEL: length256_eq:3522; X64-SSE: # %bb.0:3523; X64-SSE-NEXT: pushq %rax3524; X64-SSE-NEXT: movl $256, %edx # imm = 0x1003525; X64-SSE-NEXT: callq memcmp3526; X64-SSE-NEXT: testl %eax, %eax3527; X64-SSE-NEXT: setne %al3528; X64-SSE-NEXT: popq %rcx3529; X64-SSE-NEXT: retq3530;3531; X64-AVX1-LABEL: length256_eq:3532; X64-AVX1: # %bb.0:3533; X64-AVX1-NEXT: pushq %rax3534; X64-AVX1-NEXT: movl $256, %edx # imm = 0x1003535; X64-AVX1-NEXT: callq memcmp3536; X64-AVX1-NEXT: testl %eax, %eax3537; X64-AVX1-NEXT: setne %al3538; X64-AVX1-NEXT: popq %rcx3539; X64-AVX1-NEXT: retq3540;3541; X64-AVX2-LABEL: length256_eq:3542; X64-AVX2: # %bb.0:3543; X64-AVX2-NEXT: pushq %rax3544; X64-AVX2-NEXT: movl $256, %edx # imm = 0x1003545; X64-AVX2-NEXT: callq memcmp3546; X64-AVX2-NEXT: testl %eax, %eax3547; X64-AVX2-NEXT: setne %al3548; X64-AVX2-NEXT: popq %rcx3549; X64-AVX2-NEXT: retq3550;3551; X64-AVX512BW-LABEL: length256_eq:3552; X64-AVX512BW: # %bb.0:3553; X64-AVX512BW-NEXT: vmovdqu64 (%rdi), %zmm03554; X64-AVX512BW-NEXT: vmovdqu64 64(%rdi), %zmm13555; X64-AVX512BW-NEXT: vmovdqu64 128(%rdi), %zmm23556; X64-AVX512BW-NEXT: vmovdqu64 192(%rdi), %zmm33557; X64-AVX512BW-NEXT: vpcmpneqb 192(%rsi), %zmm3, %k03558; X64-AVX512BW-NEXT: vpcmpneqb 128(%rsi), %zmm2, %k13559; X64-AVX512BW-NEXT: korq %k0, %k1, %k03560; X64-AVX512BW-NEXT: vpcmpneqb 64(%rsi), %zmm1, %k13561; X64-AVX512BW-NEXT: vpcmpneqb (%rsi), %zmm0, %k23562; X64-AVX512BW-NEXT: korq %k1, %k2, %k13563; X64-AVX512BW-NEXT: kortestq %k0, %k13564; X64-AVX512BW-NEXT: setne %al3565; X64-AVX512BW-NEXT: vzeroupper3566; X64-AVX512BW-NEXT: retq3567;3568; X64-AVX512F-LABEL: length256_eq:3569; X64-AVX512F: # %bb.0:3570; X64-AVX512F-NEXT: vmovdqu64 (%rdi), %zmm03571; X64-AVX512F-NEXT: vmovdqu64 64(%rdi), %zmm13572; X64-AVX512F-NEXT: vmovdqu64 128(%rdi), %zmm23573; X64-AVX512F-NEXT: vmovdqu64 192(%rdi), %zmm33574; X64-AVX512F-NEXT: vpcmpneqd 192(%rsi), %zmm3, %k03575; X64-AVX512F-NEXT: vpcmpneqd 128(%rsi), %zmm2, %k13576; X64-AVX512F-NEXT: korw %k0, %k1, %k03577; X64-AVX512F-NEXT: vpcmpneqd 64(%rsi), %zmm1, %k13578; X64-AVX512F-NEXT: vpcmpneqd (%rsi), %zmm0, %k23579; X64-AVX512F-NEXT: korw %k1, %k2, %k13580; X64-AVX512F-NEXT: kortestw %k0, %k13581; X64-AVX512F-NEXT: setne %al3582; X64-AVX512F-NEXT: vzeroupper3583; X64-AVX512F-NEXT: retq3584;3585; X64-MIC-AVX2-LABEL: length256_eq:3586; X64-MIC-AVX2: # %bb.0:3587; X64-MIC-AVX2-NEXT: pushq %rax3588; X64-MIC-AVX2-NEXT: movl $256, %edx # imm = 0x1003589; X64-MIC-AVX2-NEXT: callq memcmp3590; X64-MIC-AVX2-NEXT: testl %eax, %eax3591; X64-MIC-AVX2-NEXT: setne %al3592; X64-MIC-AVX2-NEXT: popq %rcx3593; X64-MIC-AVX2-NEXT: retq3594;3595; X64-MIC-AVX512F-LABEL: length256_eq:3596; X64-MIC-AVX512F: # %bb.0:3597; X64-MIC-AVX512F-NEXT: vmovdqu64 (%rdi), %zmm03598; X64-MIC-AVX512F-NEXT: vmovdqu64 64(%rdi), %zmm13599; X64-MIC-AVX512F-NEXT: vmovdqu64 128(%rdi), %zmm23600; X64-MIC-AVX512F-NEXT: vmovdqu64 192(%rdi), %zmm33601; X64-MIC-AVX512F-NEXT: vpcmpneqd 192(%rsi), %zmm3, %k03602; X64-MIC-AVX512F-NEXT: vpcmpneqd 128(%rsi), %zmm2, %k13603; X64-MIC-AVX512F-NEXT: korw %k0, %k1, %k03604; X64-MIC-AVX512F-NEXT: vpcmpneqd 64(%rsi), %zmm1, %k13605; X64-MIC-AVX512F-NEXT: vpcmpneqd (%rsi), %zmm0, %k23606; X64-MIC-AVX512F-NEXT: korw %k1, %k2, %k13607; X64-MIC-AVX512F-NEXT: kortestw %k0, %k13608; X64-MIC-AVX512F-NEXT: setne %al3609; X64-MIC-AVX512F-NEXT: vzeroupper3610; X64-MIC-AVX512F-NEXT: retq3611 %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 256) nounwind3612 %cmp = icmp ne i32 %call, 03613 ret i1 %cmp3614}3615 3616define i1 @length256_lt(ptr %x, ptr %y) nounwind {3617; X64-LABEL: length256_lt:3618; X64: # %bb.0:3619; X64-NEXT: pushq %rax3620; X64-NEXT: movl $256, %edx # imm = 0x1003621; X64-NEXT: callq memcmp3622; X64-NEXT: shrl $31, %eax3623; X64-NEXT: # kill: def $al killed $al killed $eax3624; X64-NEXT: popq %rcx3625; X64-NEXT: retq3626 %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 256) nounwind3627 %cmp = icmp slt i32 %call, 03628 ret i1 %cmp3629}3630 3631define i1 @length256_gt(ptr %x, ptr %y) nounwind {3632; X64-LABEL: length256_gt:3633; X64: # %bb.0:3634; X64-NEXT: pushq %rax3635; X64-NEXT: movl $256, %edx # imm = 0x1003636; X64-NEXT: callq memcmp3637; X64-NEXT: testl %eax, %eax3638; X64-NEXT: setg %al3639; X64-NEXT: popq %rcx3640; X64-NEXT: retq3641 %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 256) nounwind3642 %cmp = icmp sgt i32 %call, 03643 ret i1 %cmp3644}3645 3646define i1 @length256_eq_const(ptr %X) nounwind {3647; X64-SSE-LABEL: length256_eq_const:3648; X64-SSE: # %bb.0:3649; X64-SSE-NEXT: pushq %rax3650; X64-SSE-NEXT: movl $.L.str, %esi3651; X64-SSE-NEXT: movl $256, %edx # imm = 0x1003652; X64-SSE-NEXT: callq memcmp3653; X64-SSE-NEXT: testl %eax, %eax3654; X64-SSE-NEXT: sete %al3655; X64-SSE-NEXT: popq %rcx3656; X64-SSE-NEXT: retq3657;3658; X64-AVX1-LABEL: length256_eq_const:3659; X64-AVX1: # %bb.0:3660; X64-AVX1-NEXT: pushq %rax3661; X64-AVX1-NEXT: movl $.L.str, %esi3662; X64-AVX1-NEXT: movl $256, %edx # imm = 0x1003663; X64-AVX1-NEXT: callq memcmp3664; X64-AVX1-NEXT: testl %eax, %eax3665; X64-AVX1-NEXT: sete %al3666; X64-AVX1-NEXT: popq %rcx3667; X64-AVX1-NEXT: retq3668;3669; X64-AVX2-LABEL: length256_eq_const:3670; X64-AVX2: # %bb.0:3671; X64-AVX2-NEXT: pushq %rax3672; X64-AVX2-NEXT: movl $.L.str, %esi3673; X64-AVX2-NEXT: movl $256, %edx # imm = 0x1003674; X64-AVX2-NEXT: callq memcmp3675; X64-AVX2-NEXT: testl %eax, %eax3676; X64-AVX2-NEXT: sete %al3677; X64-AVX2-NEXT: popq %rcx3678; X64-AVX2-NEXT: retq3679;3680; X64-AVX512BW-LABEL: length256_eq_const:3681; X64-AVX512BW: # %bb.0:3682; X64-AVX512BW-NEXT: vmovdqu64 (%rdi), %zmm03683; X64-AVX512BW-NEXT: vmovdqu64 64(%rdi), %zmm13684; X64-AVX512BW-NEXT: vmovdqu64 128(%rdi), %zmm23685; X64-AVX512BW-NEXT: vmovdqu64 192(%rdi), %zmm33686; X64-AVX512BW-NEXT: vpcmpneqb .L.str+192(%rip), %zmm3, %k03687; X64-AVX512BW-NEXT: vpcmpneqb .L.str+128(%rip), %zmm2, %k13688; X64-AVX512BW-NEXT: korq %k0, %k1, %k03689; X64-AVX512BW-NEXT: vpcmpneqb .L.str+64(%rip), %zmm1, %k13690; X64-AVX512BW-NEXT: vpcmpneqb .L.str(%rip), %zmm0, %k23691; X64-AVX512BW-NEXT: korq %k1, %k2, %k13692; X64-AVX512BW-NEXT: kortestq %k0, %k13693; X64-AVX512BW-NEXT: sete %al3694; X64-AVX512BW-NEXT: vzeroupper3695; X64-AVX512BW-NEXT: retq3696;3697; X64-AVX512F-LABEL: length256_eq_const:3698; X64-AVX512F: # %bb.0:3699; X64-AVX512F-NEXT: vmovdqu64 (%rdi), %zmm03700; X64-AVX512F-NEXT: vmovdqu64 64(%rdi), %zmm13701; X64-AVX512F-NEXT: vmovdqu64 128(%rdi), %zmm23702; X64-AVX512F-NEXT: vmovdqu64 192(%rdi), %zmm33703; X64-AVX512F-NEXT: vpcmpneqd .L.str+192(%rip), %zmm3, %k03704; X64-AVX512F-NEXT: vpcmpneqd .L.str+128(%rip), %zmm2, %k13705; X64-AVX512F-NEXT: korw %k0, %k1, %k03706; X64-AVX512F-NEXT: vpcmpneqd .L.str+64(%rip), %zmm1, %k13707; X64-AVX512F-NEXT: vpcmpneqd .L.str(%rip), %zmm0, %k23708; X64-AVX512F-NEXT: korw %k1, %k2, %k13709; X64-AVX512F-NEXT: kortestw %k0, %k13710; X64-AVX512F-NEXT: sete %al3711; X64-AVX512F-NEXT: vzeroupper3712; X64-AVX512F-NEXT: retq3713;3714; X64-MIC-AVX2-LABEL: length256_eq_const:3715; X64-MIC-AVX2: # %bb.0:3716; X64-MIC-AVX2-NEXT: pushq %rax3717; X64-MIC-AVX2-NEXT: movl $.L.str, %esi3718; X64-MIC-AVX2-NEXT: movl $256, %edx # imm = 0x1003719; X64-MIC-AVX2-NEXT: callq memcmp3720; X64-MIC-AVX2-NEXT: testl %eax, %eax3721; X64-MIC-AVX2-NEXT: sete %al3722; X64-MIC-AVX2-NEXT: popq %rcx3723; X64-MIC-AVX2-NEXT: retq3724;3725; X64-MIC-AVX512F-LABEL: length256_eq_const:3726; X64-MIC-AVX512F: # %bb.0:3727; X64-MIC-AVX512F-NEXT: vmovdqu64 (%rdi), %zmm03728; X64-MIC-AVX512F-NEXT: vmovdqu64 64(%rdi), %zmm13729; X64-MIC-AVX512F-NEXT: vmovdqu64 128(%rdi), %zmm23730; X64-MIC-AVX512F-NEXT: vmovdqu64 192(%rdi), %zmm33731; X64-MIC-AVX512F-NEXT: vpcmpneqd .L.str+192(%rip), %zmm3, %k03732; X64-MIC-AVX512F-NEXT: vpcmpneqd .L.str+128(%rip), %zmm2, %k13733; X64-MIC-AVX512F-NEXT: korw %k0, %k1, %k03734; X64-MIC-AVX512F-NEXT: vpcmpneqd .L.str+64(%rip), %zmm1, %k13735; X64-MIC-AVX512F-NEXT: vpcmpneqd .L.str(%rip), %zmm0, %k23736; X64-MIC-AVX512F-NEXT: korw %k1, %k2, %k13737; X64-MIC-AVX512F-NEXT: kortestw %k0, %k13738; X64-MIC-AVX512F-NEXT: sete %al3739; X64-MIC-AVX512F-NEXT: vzeroupper3740; X64-MIC-AVX512F-NEXT: retq3741 %m = tail call i32 @memcmp(ptr %X, ptr @.str, i64 256) nounwind3742 %c = icmp eq i32 %m, 03743 ret i1 %c3744}3745 3746define i32 @length384(ptr %X, ptr %Y) nounwind {3747; X64-LABEL: length384:3748; X64: # %bb.0:3749; X64-NEXT: movl $384, %edx # imm = 0x1803750; X64-NEXT: jmp memcmp # TAILCALL3751 %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 384) nounwind3752 ret i32 %m3753}3754 3755define i1 @length384_eq(ptr %x, ptr %y) nounwind {3756; X64-LABEL: length384_eq:3757; X64: # %bb.0:3758; X64-NEXT: pushq %rax3759; X64-NEXT: movl $384, %edx # imm = 0x1803760; X64-NEXT: callq memcmp3761; X64-NEXT: testl %eax, %eax3762; X64-NEXT: setne %al3763; X64-NEXT: popq %rcx3764; X64-NEXT: retq3765 %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 384) nounwind3766 %cmp = icmp ne i32 %call, 03767 ret i1 %cmp3768}3769 3770define i1 @length384_lt(ptr %x, ptr %y) nounwind {3771; X64-LABEL: length384_lt:3772; X64: # %bb.0:3773; X64-NEXT: pushq %rax3774; X64-NEXT: movl $384, %edx # imm = 0x1803775; X64-NEXT: callq memcmp3776; X64-NEXT: shrl $31, %eax3777; X64-NEXT: # kill: def $al killed $al killed $eax3778; X64-NEXT: popq %rcx3779; X64-NEXT: retq3780 %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 384) nounwind3781 %cmp = icmp slt i32 %call, 03782 ret i1 %cmp3783}3784 3785define i1 @length384_gt(ptr %x, ptr %y) nounwind {3786; X64-LABEL: length384_gt:3787; X64: # %bb.0:3788; X64-NEXT: pushq %rax3789; X64-NEXT: movl $384, %edx # imm = 0x1803790; X64-NEXT: callq memcmp3791; X64-NEXT: testl %eax, %eax3792; X64-NEXT: setg %al3793; X64-NEXT: popq %rcx3794; X64-NEXT: retq3795 %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 384) nounwind3796 %cmp = icmp sgt i32 %call, 03797 ret i1 %cmp3798}3799 3800define i1 @length384_eq_const(ptr %X) nounwind {3801; X64-LABEL: length384_eq_const:3802; X64: # %bb.0:3803; X64-NEXT: pushq %rax3804; X64-NEXT: movl $.L.str, %esi3805; X64-NEXT: movl $384, %edx # imm = 0x1803806; X64-NEXT: callq memcmp3807; X64-NEXT: testl %eax, %eax3808; X64-NEXT: sete %al3809; X64-NEXT: popq %rcx3810; X64-NEXT: retq3811 %m = tail call i32 @memcmp(ptr %X, ptr @.str, i64 384) nounwind3812 %c = icmp eq i32 %m, 03813 ret i1 %c3814}3815 3816define i32 @length511(ptr %X, ptr %Y) nounwind {3817; X64-LABEL: length511:3818; X64: # %bb.0:3819; X64-NEXT: movl $511, %edx # imm = 0x1FF3820; X64-NEXT: jmp memcmp # TAILCALL3821 %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 511) nounwind3822 ret i32 %m3823}3824 3825define i1 @length511_eq(ptr %x, ptr %y) nounwind {3826; X64-LABEL: length511_eq:3827; X64: # %bb.0:3828; X64-NEXT: pushq %rax3829; X64-NEXT: movl $511, %edx # imm = 0x1FF3830; X64-NEXT: callq memcmp3831; X64-NEXT: testl %eax, %eax3832; X64-NEXT: setne %al3833; X64-NEXT: popq %rcx3834; X64-NEXT: retq3835 %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 511) nounwind3836 %cmp = icmp ne i32 %call, 03837 ret i1 %cmp3838}3839 3840define i1 @length511_lt(ptr %x, ptr %y) nounwind {3841; X64-LABEL: length511_lt:3842; X64: # %bb.0:3843; X64-NEXT: pushq %rax3844; X64-NEXT: movl $511, %edx # imm = 0x1FF3845; X64-NEXT: callq memcmp3846; X64-NEXT: shrl $31, %eax3847; X64-NEXT: # kill: def $al killed $al killed $eax3848; X64-NEXT: popq %rcx3849; X64-NEXT: retq3850 %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 511) nounwind3851 %cmp = icmp slt i32 %call, 03852 ret i1 %cmp3853}3854 3855define i1 @length511_gt(ptr %x, ptr %y) nounwind {3856; X64-LABEL: length511_gt:3857; X64: # %bb.0:3858; X64-NEXT: pushq %rax3859; X64-NEXT: movl $511, %edx # imm = 0x1FF3860; X64-NEXT: callq memcmp3861; X64-NEXT: testl %eax, %eax3862; X64-NEXT: setg %al3863; X64-NEXT: popq %rcx3864; X64-NEXT: retq3865 %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 511) nounwind3866 %cmp = icmp sgt i32 %call, 03867 ret i1 %cmp3868}3869 3870define i1 @length511_eq_const(ptr %X) nounwind {3871; X64-LABEL: length511_eq_const:3872; X64: # %bb.0:3873; X64-NEXT: pushq %rax3874; X64-NEXT: movl $.L.str, %esi3875; X64-NEXT: movl $511, %edx # imm = 0x1FF3876; X64-NEXT: callq memcmp3877; X64-NEXT: testl %eax, %eax3878; X64-NEXT: sete %al3879; X64-NEXT: popq %rcx3880; X64-NEXT: retq3881 %m = tail call i32 @memcmp(ptr %X, ptr @.str, i64 511) nounwind3882 %c = icmp eq i32 %m, 03883 ret i1 %c3884}3885 3886define i32 @length512(ptr %X, ptr %Y) nounwind {3887; X64-LABEL: length512:3888; X64: # %bb.0:3889; X64-NEXT: movl $512, %edx # imm = 0x2003890; X64-NEXT: jmp memcmp # TAILCALL3891 %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 512) nounwind3892 ret i32 %m3893}3894 3895define i1 @length512_eq(ptr %x, ptr %y) nounwind {3896; X64-LABEL: length512_eq:3897; X64: # %bb.0:3898; X64-NEXT: pushq %rax3899; X64-NEXT: movl $512, %edx # imm = 0x2003900; X64-NEXT: callq memcmp3901; X64-NEXT: testl %eax, %eax3902; X64-NEXT: setne %al3903; X64-NEXT: popq %rcx3904; X64-NEXT: retq3905 %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 512) nounwind3906 %cmp = icmp ne i32 %call, 03907 ret i1 %cmp3908}3909 3910define i1 @length512_lt(ptr %x, ptr %y) nounwind {3911; X64-LABEL: length512_lt:3912; X64: # %bb.0:3913; X64-NEXT: pushq %rax3914; X64-NEXT: movl $512, %edx # imm = 0x2003915; X64-NEXT: callq memcmp3916; X64-NEXT: shrl $31, %eax3917; X64-NEXT: # kill: def $al killed $al killed $eax3918; X64-NEXT: popq %rcx3919; X64-NEXT: retq3920 %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 512) nounwind3921 %cmp = icmp slt i32 %call, 03922 ret i1 %cmp3923}3924 3925define i1 @length512_gt(ptr %x, ptr %y) nounwind {3926; X64-LABEL: length512_gt:3927; X64: # %bb.0:3928; X64-NEXT: pushq %rax3929; X64-NEXT: movl $512, %edx # imm = 0x2003930; X64-NEXT: callq memcmp3931; X64-NEXT: testl %eax, %eax3932; X64-NEXT: setg %al3933; X64-NEXT: popq %rcx3934; X64-NEXT: retq3935 %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 512) nounwind3936 %cmp = icmp sgt i32 %call, 03937 ret i1 %cmp3938}3939 3940define i1 @length512_eq_const(ptr %X) nounwind {3941; X64-LABEL: length512_eq_const:3942; X64: # %bb.0:3943; X64-NEXT: pushq %rax3944; X64-NEXT: movl $.L.str, %esi3945; X64-NEXT: movl $512, %edx # imm = 0x2003946; X64-NEXT: callq memcmp3947; X64-NEXT: testl %eax, %eax3948; X64-NEXT: sete %al3949; X64-NEXT: popq %rcx3950; X64-NEXT: retq3951 %m = tail call i32 @memcmp(ptr %X, ptr @.str, i64 512) nounwind3952 %c = icmp eq i32 %m, 03953 ret i1 %c3954}3955 3956; This checks that we do not do stupid things with huge sizes.3957define i32 @huge_length(ptr %X, ptr %Y) nounwind {3958; X64-LABEL: huge_length:3959; X64: # %bb.0:3960; X64-NEXT: movabsq $9223372036854775807, %rdx # imm = 0x7FFFFFFFFFFFFFFF3961; X64-NEXT: jmp memcmp # TAILCALL3962 %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 9223372036854775807) nounwind3963 ret i32 %m3964}3965 3966define i1 @huge_length_eq(ptr %X, ptr %Y) nounwind {3967; X64-LABEL: huge_length_eq:3968; X64: # %bb.0:3969; X64-NEXT: pushq %rax3970; X64-NEXT: movabsq $9223372036854775807, %rdx # imm = 0x7FFFFFFFFFFFFFFF3971; X64-NEXT: callq memcmp3972; X64-NEXT: testl %eax, %eax3973; X64-NEXT: sete %al3974; X64-NEXT: popq %rcx3975; X64-NEXT: retq3976 %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 9223372036854775807) nounwind3977 %c = icmp eq i32 %m, 03978 ret i1 %c3979}3980 3981; This checks non-constant sizes.3982define i32 @nonconst_length(ptr %X, ptr %Y, i64 %size) nounwind {3983; X64-LABEL: nonconst_length:3984; X64: # %bb.0:3985; X64-NEXT: jmp memcmp # TAILCALL3986 %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 %size) nounwind3987 ret i32 %m3988}3989 3990define i1 @nonconst_length_eq(ptr %X, ptr %Y, i64 %size) nounwind {3991; X64-LABEL: nonconst_length_eq:3992; X64: # %bb.0:3993; X64-NEXT: pushq %rax3994; X64-NEXT: callq memcmp3995; X64-NEXT: testl %eax, %eax3996; X64-NEXT: sete %al3997; X64-NEXT: popq %rcx3998; X64-NEXT: retq3999 %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 %size) nounwind4000 %c = icmp eq i32 %m, 04001 ret i1 %c4002}4003