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