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