brintos

brintos / llvm-project-archived public Read only

0
0
Text · 43.7 KiB · 39cbee5 Raw
1318 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc < %s -mtriple=i686-unknown-unknown -mattr=+sse4.2 | FileCheck %s --check-prefix=X863; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+sse4.2 | FileCheck %s --check-prefix=X644 5declare i32 @llvm.x86.sse42.pcmpestric128(<16 x i8> %lhs, i32, <16 x i8>, i32, i8)6declare i32 @llvm.x86.sse42.pcmpestri128(<16 x i8> %lhs, i32, <16 x i8>, i32, i8)7declare <16 x i8> @llvm.x86.sse42.pcmpestrm128(<16 x i8> %lhs, i32, <16 x i8>, i32, i8)8declare i32 @llvm.x86.sse42.pcmpistric128(<16 x i8> %lhs, <16 x i8>, i8)9declare i32 @llvm.x86.sse42.pcmpistri128(<16 x i8> %lhs, <16 x i8>, i8)10declare <16 x i8> @llvm.x86.sse42.pcmpistrm128(<16 x i8> %lhs, <16 x i8>, i8)11 12define i1 @pcmpestri_reg_eq_i8(<16 x i8> %lhs, i32 %lhs_len, <16 x i8> %rhs, i32 %rhs_len) nounwind {13; X86-LABEL: pcmpestri_reg_eq_i8:14; X86:       # %bb.0: # %entry15; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax16; X86-NEXT:    movl {{[0-9]+}}(%esp), %edx17; X86-NEXT:    pcmpestri $24, %xmm1, %xmm018; X86-NEXT:    setae %al19; X86-NEXT:    retl20;21; X64-LABEL: pcmpestri_reg_eq_i8:22; X64:       # %bb.0: # %entry23; X64-NEXT:    movl %esi, %edx24; X64-NEXT:    movl %edi, %eax25; X64-NEXT:    pcmpestri $24, %xmm1, %xmm026; X64-NEXT:    setae %al27; X64-NEXT:    retq28entry:29  %c = call i32 @llvm.x86.sse42.pcmpestric128(<16 x i8> %lhs, i32 %lhs_len, <16 x i8> %rhs, i32 %rhs_len, i8 24)30  %result = icmp eq i32 %c, 031  ret i1 %result32}33 34define i32 @pcmpestri_reg_idx_i8(<16 x i8> %lhs, i32 %lhs_len, <16 x i8> %rhs, i32 %rhs_len) nounwind {35; X86-LABEL: pcmpestri_reg_idx_i8:36; X86:       # %bb.0: # %entry37; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax38; X86-NEXT:    movl {{[0-9]+}}(%esp), %edx39; X86-NEXT:    pcmpestri $24, %xmm1, %xmm040; X86-NEXT:    movl %ecx, %eax41; X86-NEXT:    retl42;43; X64-LABEL: pcmpestri_reg_idx_i8:44; X64:       # %bb.0: # %entry45; X64-NEXT:    movl %esi, %edx46; X64-NEXT:    movl %edi, %eax47; X64-NEXT:    pcmpestri $24, %xmm1, %xmm048; X64-NEXT:    movl %ecx, %eax49; X64-NEXT:    retq50entry:51  %idx = call i32 @llvm.x86.sse42.pcmpestri128(<16 x i8> %lhs, i32 %lhs_len, <16 x i8> %rhs, i32 %rhs_len, i8 24)52  ret i32 %idx53}54 55define i32 @pcmpestri_reg_diff_i8(<16 x i8> %lhs, i32 %lhs_len, <16 x i8> %rhs, i32 %rhs_len) nounwind {56; X86-LABEL: pcmpestri_reg_diff_i8:57; X86:       # %bb.0: # %entry58; X86-NEXT:    pushl %ebp59; X86-NEXT:    movl %esp, %ebp60; X86-NEXT:    andl $-16, %esp61; X86-NEXT:    subl $48, %esp62; X86-NEXT:    movl 8(%ebp), %eax63; X86-NEXT:    movl 12(%ebp), %edx64; X86-NEXT:    pcmpestri $24, %xmm1, %xmm065; X86-NEXT:    cmpl $16, %ecx66; X86-NEXT:    jne .LBB2_267; X86-NEXT:  # %bb.1:68; X86-NEXT:    xorl %eax, %eax69; X86-NEXT:    jmp .LBB2_370; X86-NEXT:  .LBB2_2: # %compare71; X86-NEXT:    movdqa %xmm0, (%esp)72; X86-NEXT:    andl $15, %ecx73; X86-NEXT:    movzbl (%esp,%ecx), %eax74; X86-NEXT:    movdqa %xmm1, {{[0-9]+}}(%esp)75; X86-NEXT:    subb 16(%esp,%ecx), %al76; X86-NEXT:  .LBB2_3: # %exit77; X86-NEXT:    movzbl %al, %eax78; X86-NEXT:    movl %ebp, %esp79; X86-NEXT:    popl %ebp80; X86-NEXT:    retl81;82; X64-LABEL: pcmpestri_reg_diff_i8:83; X64:       # %bb.0: # %entry84; X64-NEXT:    movl %esi, %edx85; X64-NEXT:    movl %edi, %eax86; X64-NEXT:    pcmpestri $24, %xmm1, %xmm087; X64-NEXT:    # kill: def $ecx killed $ecx def $rcx88; X64-NEXT:    cmpl $16, %ecx89; X64-NEXT:    jne .LBB2_290; X64-NEXT:  # %bb.1:91; X64-NEXT:    xorl %eax, %eax92; X64-NEXT:    movzbl %al, %eax93; X64-NEXT:    retq94; X64-NEXT:  .LBB2_2: # %compare95; X64-NEXT:    movdqa %xmm0, -{{[0-9]+}}(%rsp)96; X64-NEXT:    andl $15, %ecx97; X64-NEXT:    movzbl -24(%rsp,%rcx), %eax98; X64-NEXT:    movdqa %xmm1, -{{[0-9]+}}(%rsp)99; X64-NEXT:    subb -40(%rsp,%rcx), %al100; X64-NEXT:    movzbl %al, %eax101; X64-NEXT:    retq102entry:103  %idx = call i32 @llvm.x86.sse42.pcmpestri128(<16 x i8> %lhs, i32 %lhs_len, <16 x i8> %rhs, i32 %rhs_len, i8 24)104  %eq = icmp eq i32 %idx, 16105  br i1 %eq, label %exit, label %compare106 107compare:108  %lhs_c = extractelement <16 x i8> %lhs, i32 %idx109  %rhs_c = extractelement <16 x i8> %rhs, i32 %idx110  %sub = sub i8 %lhs_c, %rhs_c111  br label %exit112 113exit:114  %result = phi i8 [ 0, %entry ], [ %sub, %compare ]115  %result_ext = zext i8 %result to i32116  ret i32 %result_ext117}118 119define i1 @pcmpestri_mem_eq_i8(ptr %lhs_ptr, i32 %lhs_len, ptr %rhs_ptr, i32 %rhs_len) nounwind {120; X86-LABEL: pcmpestri_mem_eq_i8:121; X86:       # %bb.0: # %entry122; X86-NEXT:    pushl %esi123; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax124; X86-NEXT:    movl {{[0-9]+}}(%esp), %edx125; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx126; X86-NEXT:    movl {{[0-9]+}}(%esp), %esi127; X86-NEXT:    movdqu (%esi), %xmm0128; X86-NEXT:    pcmpestri $24, (%ecx), %xmm0129; X86-NEXT:    setae %al130; X86-NEXT:    popl %esi131; X86-NEXT:    retl132;133; X64-LABEL: pcmpestri_mem_eq_i8:134; X64:       # %bb.0: # %entry135; X64-NEXT:    movq %rdx, %r8136; X64-NEXT:    movl %esi, %eax137; X64-NEXT:    movdqu (%rdi), %xmm0138; X64-NEXT:    movl %ecx, %edx139; X64-NEXT:    pcmpestri $24, (%r8), %xmm0140; X64-NEXT:    setae %al141; X64-NEXT:    retq142entry:143  %lhs = load <16 x i8>, ptr %lhs_ptr, align 1144  %rhs = load <16 x i8>, ptr %rhs_ptr, align 1145  %c = call i32 @llvm.x86.sse42.pcmpestric128(<16 x i8> %lhs, i32 %lhs_len, <16 x i8> %rhs, i32 %rhs_len, i8 24)146  %result = icmp eq i32 %c, 0147  ret i1 %result148}149 150define i32 @pcmpestri_mem_idx_i8(ptr %lhs_ptr, i32 %lhs_len, ptr %rhs_ptr, i32 %rhs_len) nounwind {151; X86-LABEL: pcmpestri_mem_idx_i8:152; X86:       # %bb.0: # %entry153; X86-NEXT:    pushl %esi154; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax155; X86-NEXT:    movl {{[0-9]+}}(%esp), %edx156; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx157; X86-NEXT:    movl {{[0-9]+}}(%esp), %esi158; X86-NEXT:    movdqu (%esi), %xmm0159; X86-NEXT:    pcmpestri $24, (%ecx), %xmm0160; X86-NEXT:    movl %ecx, %eax161; X86-NEXT:    popl %esi162; X86-NEXT:    retl163;164; X64-LABEL: pcmpestri_mem_idx_i8:165; X64:       # %bb.0: # %entry166; X64-NEXT:    movq %rdx, %r8167; X64-NEXT:    movl %esi, %eax168; X64-NEXT:    movdqu (%rdi), %xmm0169; X64-NEXT:    movl %ecx, %edx170; X64-NEXT:    pcmpestri $24, (%r8), %xmm0171; X64-NEXT:    movl %ecx, %eax172; X64-NEXT:    retq173entry:174  %lhs = load <16 x i8>, ptr %lhs_ptr, align 1175  %rhs = load <16 x i8>, ptr %rhs_ptr, align 1176  %idx = call i32 @llvm.x86.sse42.pcmpestri128(<16 x i8> %lhs, i32 %lhs_len, <16 x i8> %rhs, i32 %rhs_len, i8 24)177  ret i32 %idx178}179 180define i32 @pcmpestri_mem_diff_i8(ptr %lhs_ptr, i32 %lhs_len, ptr %rhs_ptr, i32 %rhs_len) nounwind {181; X86-LABEL: pcmpestri_mem_diff_i8:182; X86:       # %bb.0: # %entry183; X86-NEXT:    pushl %ebp184; X86-NEXT:    movl %esp, %ebp185; X86-NEXT:    pushl %esi186; X86-NEXT:    andl $-16, %esp187; X86-NEXT:    subl $48, %esp188; X86-NEXT:    movl 12(%ebp), %eax189; X86-NEXT:    movl 20(%ebp), %edx190; X86-NEXT:    movl 16(%ebp), %ecx191; X86-NEXT:    movl 8(%ebp), %esi192; X86-NEXT:    movdqu (%esi), %xmm1193; X86-NEXT:    movdqu (%ecx), %xmm0194; X86-NEXT:    pcmpestri $24, %xmm0, %xmm1195; X86-NEXT:    cmpl $16, %ecx196; X86-NEXT:    jne .LBB5_2197; X86-NEXT:  # %bb.1:198; X86-NEXT:    xorl %eax, %eax199; X86-NEXT:    jmp .LBB5_3200; X86-NEXT:  .LBB5_2: # %compare201; X86-NEXT:    movdqa %xmm1, (%esp)202; X86-NEXT:    andl $15, %ecx203; X86-NEXT:    movzbl (%esp,%ecx), %eax204; X86-NEXT:    movdqa %xmm0, {{[0-9]+}}(%esp)205; X86-NEXT:    subb 16(%esp,%ecx), %al206; X86-NEXT:  .LBB5_3: # %exit207; X86-NEXT:    movzbl %al, %eax208; X86-NEXT:    leal -4(%ebp), %esp209; X86-NEXT:    popl %esi210; X86-NEXT:    popl %ebp211; X86-NEXT:    retl212;213; X64-LABEL: pcmpestri_mem_diff_i8:214; X64:       # %bb.0: # %entry215; X64-NEXT:    movl %esi, %eax216; X64-NEXT:    movdqu (%rdi), %xmm1217; X64-NEXT:    movdqu (%rdx), %xmm0218; X64-NEXT:    movl %ecx, %edx219; X64-NEXT:    pcmpestri $24, %xmm0, %xmm1220; X64-NEXT:    # kill: def $ecx killed $ecx def $rcx221; X64-NEXT:    cmpl $16, %ecx222; X64-NEXT:    jne .LBB5_2223; X64-NEXT:  # %bb.1:224; X64-NEXT:    xorl %eax, %eax225; X64-NEXT:    movzbl %al, %eax226; X64-NEXT:    retq227; X64-NEXT:  .LBB5_2: # %compare228; X64-NEXT:    movdqa %xmm1, -{{[0-9]+}}(%rsp)229; X64-NEXT:    andl $15, %ecx230; X64-NEXT:    movzbl -24(%rsp,%rcx), %eax231; X64-NEXT:    movdqa %xmm0, -{{[0-9]+}}(%rsp)232; X64-NEXT:    subb -40(%rsp,%rcx), %al233; X64-NEXT:    movzbl %al, %eax234; X64-NEXT:    retq235entry:236  %lhs = load <16 x i8>, ptr %lhs_ptr, align 1237  %rhs = load <16 x i8>, ptr %rhs_ptr, align 1238  %idx = call i32 @llvm.x86.sse42.pcmpestri128(<16 x i8> %lhs, i32 %lhs_len, <16 x i8> %rhs, i32 %rhs_len, i8 24)239  %eq = icmp eq i32 %idx, 16240  br i1 %eq, label %exit, label %compare241 242compare:243  %lhs_c = extractelement <16 x i8> %lhs, i32 %idx244  %rhs_c = extractelement <16 x i8> %rhs, i32 %idx245  %sub = sub i8 %lhs_c, %rhs_c246  br label %exit247 248exit:249  %result = phi i8 [ 0, %entry ], [ %sub, %compare ]250  %result_ext = zext i8 %result to i32251  ret i32 %result_ext252}253 254define i1 @pcmpestri_reg_eq_i16(<8 x i16> %lhs, i32 %lhs_len, <8 x i16> %rhs, i32 %rhs_len) nounwind {255; X86-LABEL: pcmpestri_reg_eq_i16:256; X86:       # %bb.0: # %entry257; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax258; X86-NEXT:    movl {{[0-9]+}}(%esp), %edx259; X86-NEXT:    pcmpestri $24, %xmm1, %xmm0260; X86-NEXT:    setae %al261; X86-NEXT:    retl262;263; X64-LABEL: pcmpestri_reg_eq_i16:264; X64:       # %bb.0: # %entry265; X64-NEXT:    movl %esi, %edx266; X64-NEXT:    movl %edi, %eax267; X64-NEXT:    pcmpestri $24, %xmm1, %xmm0268; X64-NEXT:    setae %al269; X64-NEXT:    retq270entry:271  %lhs_cast = bitcast <8 x i16> %lhs to <16 x i8>272  %rhs_cast = bitcast <8 x i16> %rhs to <16 x i8>273  %c = call i32 @llvm.x86.sse42.pcmpestric128(<16 x i8> %lhs_cast, i32 %lhs_len, <16 x i8> %rhs_cast, i32 %rhs_len, i8 24)274  %result = icmp eq i32 %c, 0275  ret i1 %result276}277 278define i32 @pcmpestri_reg_idx_i16(<8 x i16> %lhs, i32 %lhs_len, <8 x i16> %rhs, i32 %rhs_len) nounwind {279; X86-LABEL: pcmpestri_reg_idx_i16:280; X86:       # %bb.0: # %entry281; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax282; X86-NEXT:    movl {{[0-9]+}}(%esp), %edx283; X86-NEXT:    pcmpestri $24, %xmm1, %xmm0284; X86-NEXT:    movl %ecx, %eax285; X86-NEXT:    retl286;287; X64-LABEL: pcmpestri_reg_idx_i16:288; X64:       # %bb.0: # %entry289; X64-NEXT:    movl %esi, %edx290; X64-NEXT:    movl %edi, %eax291; X64-NEXT:    pcmpestri $24, %xmm1, %xmm0292; X64-NEXT:    movl %ecx, %eax293; X64-NEXT:    retq294entry:295  %lhs_cast = bitcast <8 x i16> %lhs to <16 x i8>296  %rhs_cast = bitcast <8 x i16> %rhs to <16 x i8>297  %idx = call i32 @llvm.x86.sse42.pcmpestri128(<16 x i8> %lhs_cast, i32 %lhs_len, <16 x i8> %rhs_cast, i32 %rhs_len, i8 24)298  ret i32 %idx299}300 301define i32 @pcmpestri_reg_diff_i16(<8 x i16> %lhs, i32 %lhs_len, <8 x i16> %rhs, i32 %rhs_len) nounwind {302; X86-LABEL: pcmpestri_reg_diff_i16:303; X86:       # %bb.0: # %entry304; X86-NEXT:    pushl %ebp305; X86-NEXT:    movl %esp, %ebp306; X86-NEXT:    andl $-16, %esp307; X86-NEXT:    subl $48, %esp308; X86-NEXT:    movl 8(%ebp), %eax309; X86-NEXT:    movl 12(%ebp), %edx310; X86-NEXT:    pcmpestri $24, %xmm1, %xmm0311; X86-NEXT:    cmpl $16, %ecx312; X86-NEXT:    jne .LBB8_2313; X86-NEXT:  # %bb.1:314; X86-NEXT:    xorl %eax, %eax315; X86-NEXT:    jmp .LBB8_3316; X86-NEXT:  .LBB8_2: # %compare317; X86-NEXT:    movdqa %xmm0, (%esp)318; X86-NEXT:    addl %ecx, %ecx319; X86-NEXT:    andl $14, %ecx320; X86-NEXT:    movzwl (%esp,%ecx), %eax321; X86-NEXT:    movdqa %xmm1, {{[0-9]+}}(%esp)322; X86-NEXT:    subw 16(%esp,%ecx), %ax323; X86-NEXT:  .LBB8_3: # %exit324; X86-NEXT:    movzwl %ax, %eax325; X86-NEXT:    movl %ebp, %esp326; X86-NEXT:    popl %ebp327; X86-NEXT:    retl328;329; X64-LABEL: pcmpestri_reg_diff_i16:330; X64:       # %bb.0: # %entry331; X64-NEXT:    movl %esi, %edx332; X64-NEXT:    movl %edi, %eax333; X64-NEXT:    pcmpestri $24, %xmm1, %xmm0334; X64-NEXT:    # kill: def $ecx killed $ecx def $rcx335; X64-NEXT:    cmpl $16, %ecx336; X64-NEXT:    jne .LBB8_2337; X64-NEXT:  # %bb.1:338; X64-NEXT:    xorl %eax, %eax339; X64-NEXT:    movzwl %ax, %eax340; X64-NEXT:    retq341; X64-NEXT:  .LBB8_2: # %compare342; X64-NEXT:    movdqa %xmm0, -{{[0-9]+}}(%rsp)343; X64-NEXT:    andl $7, %ecx344; X64-NEXT:    addl %ecx, %ecx345; X64-NEXT:    movzwl -24(%rsp,%rcx), %eax346; X64-NEXT:    movdqa %xmm1, -{{[0-9]+}}(%rsp)347; X64-NEXT:    subw -40(%rsp,%rcx), %ax348; X64-NEXT:    movzwl %ax, %eax349; X64-NEXT:    retq350entry:351  %lhs_cast = bitcast <8 x i16> %lhs to <16 x i8>352  %rhs_cast = bitcast <8 x i16> %rhs to <16 x i8>353  %idx = call i32 @llvm.x86.sse42.pcmpestri128(<16 x i8> %lhs_cast, i32 %lhs_len, <16 x i8> %rhs_cast, i32 %rhs_len, i8 24)354  %eq = icmp eq i32 %idx, 16355  br i1 %eq, label %exit, label %compare356 357compare:358  %lhs_c = extractelement <8 x i16> %lhs, i32 %idx359  %rhs_c = extractelement <8 x i16> %rhs, i32 %idx360  %sub = sub i16 %lhs_c, %rhs_c361  br label %exit362 363exit:364  %result = phi i16 [ 0, %entry ], [ %sub, %compare ]365  %result_ext = zext i16 %result to i32366  ret i32 %result_ext367}368 369define i1 @pcmpestri_mem_eq_i16(ptr %lhs_ptr, i32 %lhs_len, ptr %rhs_ptr, i32 %rhs_len) nounwind {370; X86-LABEL: pcmpestri_mem_eq_i16:371; X86:       # %bb.0: # %entry372; X86-NEXT:    pushl %esi373; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax374; X86-NEXT:    movl {{[0-9]+}}(%esp), %edx375; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx376; X86-NEXT:    movl {{[0-9]+}}(%esp), %esi377; X86-NEXT:    movdqu (%esi), %xmm0378; X86-NEXT:    pcmpestri $25, (%ecx), %xmm0379; X86-NEXT:    setae %al380; X86-NEXT:    popl %esi381; X86-NEXT:    retl382;383; X64-LABEL: pcmpestri_mem_eq_i16:384; X64:       # %bb.0: # %entry385; X64-NEXT:    movq %rdx, %r8386; X64-NEXT:    movl %esi, %eax387; X64-NEXT:    movdqu (%rdi), %xmm0388; X64-NEXT:    movl %ecx, %edx389; X64-NEXT:    pcmpestri $25, (%r8), %xmm0390; X64-NEXT:    setae %al391; X64-NEXT:    retq392entry:393  %lhs = load <8 x i16>, ptr %lhs_ptr, align 1394  %rhs = load <8 x i16>, ptr %rhs_ptr, align 1395  %lhs_cast = bitcast <8 x i16> %lhs to <16 x i8>396  %rhs_cast = bitcast <8 x i16> %rhs to <16 x i8>397  %c = call i32 @llvm.x86.sse42.pcmpestric128(<16 x i8> %lhs_cast, i32 %lhs_len, <16 x i8> %rhs_cast, i32 %rhs_len, i8 25)398  %result = icmp eq i32 %c, 0399  ret i1 %result400}401 402define i32 @pcmpestri_mem_idx_i16(ptr %lhs_ptr, i32 %lhs_len, ptr %rhs_ptr, i32 %rhs_len) nounwind {403; X86-LABEL: pcmpestri_mem_idx_i16:404; X86:       # %bb.0: # %entry405; X86-NEXT:    pushl %esi406; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax407; X86-NEXT:    movl {{[0-9]+}}(%esp), %edx408; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx409; X86-NEXT:    movl {{[0-9]+}}(%esp), %esi410; X86-NEXT:    movdqu (%esi), %xmm0411; X86-NEXT:    pcmpestri $25, (%ecx), %xmm0412; X86-NEXT:    movl %ecx, %eax413; X86-NEXT:    popl %esi414; X86-NEXT:    retl415;416; X64-LABEL: pcmpestri_mem_idx_i16:417; X64:       # %bb.0: # %entry418; X64-NEXT:    movq %rdx, %r8419; X64-NEXT:    movl %esi, %eax420; X64-NEXT:    movdqu (%rdi), %xmm0421; X64-NEXT:    movl %ecx, %edx422; X64-NEXT:    pcmpestri $25, (%r8), %xmm0423; X64-NEXT:    movl %ecx, %eax424; X64-NEXT:    retq425entry:426  %lhs = load <8 x i16>, ptr %lhs_ptr, align 1427  %rhs = load <8 x i16>, ptr %rhs_ptr, align 1428  %lhs_cast = bitcast <8 x i16> %lhs to <16 x i8>429  %rhs_cast = bitcast <8 x i16> %rhs to <16 x i8>430  %idx = call i32 @llvm.x86.sse42.pcmpestri128(<16 x i8> %lhs_cast, i32 %lhs_len, <16 x i8> %rhs_cast, i32 %rhs_len, i8 25)431  ret i32 %idx432}433 434define i32 @pcmpestri_mem_diff_i16(ptr %lhs_ptr, i32 %lhs_len, ptr %rhs_ptr, i32 %rhs_len) nounwind {435; X86-LABEL: pcmpestri_mem_diff_i16:436; X86:       # %bb.0: # %entry437; X86-NEXT:    pushl %ebp438; X86-NEXT:    movl %esp, %ebp439; X86-NEXT:    pushl %esi440; X86-NEXT:    andl $-16, %esp441; X86-NEXT:    subl $48, %esp442; X86-NEXT:    movl 12(%ebp), %eax443; X86-NEXT:    movl 20(%ebp), %edx444; X86-NEXT:    movl 16(%ebp), %ecx445; X86-NEXT:    movl 8(%ebp), %esi446; X86-NEXT:    movdqu (%esi), %xmm1447; X86-NEXT:    movdqu (%ecx), %xmm0448; X86-NEXT:    pcmpestri $25, %xmm0, %xmm1449; X86-NEXT:    cmpl $8, %ecx450; X86-NEXT:    jne .LBB11_2451; X86-NEXT:  # %bb.1:452; X86-NEXT:    xorl %eax, %eax453; X86-NEXT:    jmp .LBB11_3454; X86-NEXT:  .LBB11_2: # %compare455; X86-NEXT:    movdqa %xmm1, (%esp)456; X86-NEXT:    addl %ecx, %ecx457; X86-NEXT:    andl $14, %ecx458; X86-NEXT:    movzwl (%esp,%ecx), %eax459; X86-NEXT:    movdqa %xmm0, {{[0-9]+}}(%esp)460; X86-NEXT:    subw 16(%esp,%ecx), %ax461; X86-NEXT:  .LBB11_3: # %exit462; X86-NEXT:    movzwl %ax, %eax463; X86-NEXT:    leal -4(%ebp), %esp464; X86-NEXT:    popl %esi465; X86-NEXT:    popl %ebp466; X86-NEXT:    retl467;468; X64-LABEL: pcmpestri_mem_diff_i16:469; X64:       # %bb.0: # %entry470; X64-NEXT:    movl %esi, %eax471; X64-NEXT:    movdqu (%rdi), %xmm1472; X64-NEXT:    movdqu (%rdx), %xmm0473; X64-NEXT:    movl %ecx, %edx474; X64-NEXT:    pcmpestri $25, %xmm0, %xmm1475; X64-NEXT:    # kill: def $ecx killed $ecx def $rcx476; X64-NEXT:    cmpl $8, %ecx477; X64-NEXT:    jne .LBB11_2478; X64-NEXT:  # %bb.1:479; X64-NEXT:    xorl %eax, %eax480; X64-NEXT:    movzwl %ax, %eax481; X64-NEXT:    retq482; X64-NEXT:  .LBB11_2: # %compare483; X64-NEXT:    movdqa %xmm1, -{{[0-9]+}}(%rsp)484; X64-NEXT:    andl $7, %ecx485; X64-NEXT:    addl %ecx, %ecx486; X64-NEXT:    movzwl -24(%rsp,%rcx), %eax487; X64-NEXT:    movdqa %xmm0, -{{[0-9]+}}(%rsp)488; X64-NEXT:    subw -40(%rsp,%rcx), %ax489; X64-NEXT:    movzwl %ax, %eax490; X64-NEXT:    retq491entry:492  %lhs = load <8 x i16>, ptr %lhs_ptr, align 1493  %rhs = load <8 x i16>, ptr %rhs_ptr, align 1494  %lhs_cast = bitcast <8 x i16> %lhs to <16 x i8>495  %rhs_cast = bitcast <8 x i16> %rhs to <16 x i8>496  %idx = call i32 @llvm.x86.sse42.pcmpestri128(<16 x i8> %lhs_cast, i32 %lhs_len, <16 x i8> %rhs_cast, i32 %rhs_len, i8 25)497  %eq = icmp eq i32 %idx, 8498  br i1 %eq, label %exit, label %compare499 500compare:501  %lhs_c = extractelement <8 x i16> %lhs, i32 %idx502  %rhs_c = extractelement <8 x i16> %rhs, i32 %idx503  %sub = sub i16 %lhs_c, %rhs_c504  br label %exit505 506exit:507  %result = phi i16 [ 0, %entry ], [ %sub, %compare ]508  %result_ext = zext i16 %result to i32509  ret i32 %result_ext510}511 512define i1 @pcmpistri_reg_eq_i8(<16 x i8> %lhs, <16 x i8> %rhs) nounwind {513; X86-LABEL: pcmpistri_reg_eq_i8:514; X86:       # %bb.0: # %entry515; X86-NEXT:    pcmpistri $24, %xmm1, %xmm0516; X86-NEXT:    setae %al517; X86-NEXT:    retl518;519; X64-LABEL: pcmpistri_reg_eq_i8:520; X64:       # %bb.0: # %entry521; X64-NEXT:    pcmpistri $24, %xmm1, %xmm0522; X64-NEXT:    setae %al523; X64-NEXT:    retq524entry:525  %c = call i32 @llvm.x86.sse42.pcmpistric128(<16 x i8> %lhs, <16 x i8> %rhs, i8 24)526  %result = icmp eq i32 %c, 0527  ret i1 %result528}529 530define i32 @pcmpistri_reg_idx_i8(<16 x i8> %lhs, <16 x i8> %rhs) nounwind {531; X86-LABEL: pcmpistri_reg_idx_i8:532; X86:       # %bb.0: # %entry533; X86-NEXT:    pcmpistri $24, %xmm1, %xmm0534; X86-NEXT:    movl %ecx, %eax535; X86-NEXT:    retl536;537; X64-LABEL: pcmpistri_reg_idx_i8:538; X64:       # %bb.0: # %entry539; X64-NEXT:    pcmpistri $24, %xmm1, %xmm0540; X64-NEXT:    movl %ecx, %eax541; X64-NEXT:    retq542entry:543  %idx = call i32 @llvm.x86.sse42.pcmpistri128(<16 x i8> %lhs, <16 x i8> %rhs, i8 24)544  ret i32 %idx545}546 547define i32 @pcmpistri_reg_diff_i8(<16 x i8> %lhs, <16 x i8> %rhs) nounwind {548; X86-LABEL: pcmpistri_reg_diff_i8:549; X86:       # %bb.0: # %entry550; X86-NEXT:    pcmpistri $24, %xmm1, %xmm0551; X86-NEXT:    cmpl $16, %ecx552; X86-NEXT:    jne .LBB14_2553; X86-NEXT:  # %bb.1:554; X86-NEXT:    xorl %eax, %eax555; X86-NEXT:    movzbl %al, %eax556; X86-NEXT:    retl557; X86-NEXT:  .LBB14_2: # %compare558; X86-NEXT:    pushl %ebp559; X86-NEXT:    movl %esp, %ebp560; X86-NEXT:    andl $-16, %esp561; X86-NEXT:    subl $48, %esp562; X86-NEXT:    movdqa %xmm0, (%esp)563; X86-NEXT:    andl $15, %ecx564; X86-NEXT:    movzbl (%esp,%ecx), %eax565; X86-NEXT:    movdqa %xmm1, {{[0-9]+}}(%esp)566; X86-NEXT:    subb 16(%esp,%ecx), %al567; X86-NEXT:    movl %ebp, %esp568; X86-NEXT:    popl %ebp569; X86-NEXT:    movzbl %al, %eax570; X86-NEXT:    retl571;572; X64-LABEL: pcmpistri_reg_diff_i8:573; X64:       # %bb.0: # %entry574; X64-NEXT:    pcmpistri $24, %xmm1, %xmm0575; X64-NEXT:    # kill: def $ecx killed $ecx def $rcx576; X64-NEXT:    cmpl $16, %ecx577; X64-NEXT:    jne .LBB14_2578; X64-NEXT:  # %bb.1:579; X64-NEXT:    xorl %eax, %eax580; X64-NEXT:    movzbl %al, %eax581; X64-NEXT:    retq582; X64-NEXT:  .LBB14_2: # %compare583; X64-NEXT:    movdqa %xmm0, -{{[0-9]+}}(%rsp)584; X64-NEXT:    andl $15, %ecx585; X64-NEXT:    movzbl -24(%rsp,%rcx), %eax586; X64-NEXT:    movdqa %xmm1, -{{[0-9]+}}(%rsp)587; X64-NEXT:    subb -40(%rsp,%rcx), %al588; X64-NEXT:    movzbl %al, %eax589; X64-NEXT:    retq590entry:591  %idx = call i32 @llvm.x86.sse42.pcmpistri128(<16 x i8> %lhs, <16 x i8> %rhs, i8 24)592  %eq = icmp eq i32 %idx, 16593  br i1 %eq, label %exit, label %compare594 595compare:596  %lhs_c = extractelement <16 x i8> %lhs, i32 %idx597  %rhs_c = extractelement <16 x i8> %rhs, i32 %idx598  %sub = sub i8 %lhs_c, %rhs_c599  br label %exit600 601exit:602  %result = phi i8 [ 0, %entry ], [ %sub, %compare ]603  %result_ext = zext i8 %result to i32604  ret i32 %result_ext605}606 607define i1 @pcmpistri_mem_eq_i8(ptr %lhs_ptr, ptr %rhs_ptr) nounwind {608; X86-LABEL: pcmpistri_mem_eq_i8:609; X86:       # %bb.0: # %entry610; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax611; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx612; X86-NEXT:    movdqu (%ecx), %xmm0613; X86-NEXT:    pcmpistri $24, (%eax), %xmm0614; X86-NEXT:    setae %al615; X86-NEXT:    retl616;617; X64-LABEL: pcmpistri_mem_eq_i8:618; X64:       # %bb.0: # %entry619; X64-NEXT:    movdqu (%rdi), %xmm0620; X64-NEXT:    pcmpistri $24, (%rsi), %xmm0621; X64-NEXT:    setae %al622; X64-NEXT:    retq623entry:624  %lhs = load <16 x i8>, ptr %lhs_ptr, align 1625  %rhs = load <16 x i8>, ptr %rhs_ptr, align 1626  %c = call i32 @llvm.x86.sse42.pcmpistric128(<16 x i8> %lhs, <16 x i8> %rhs, i8 24)627  %result = icmp eq i32 %c, 0628  ret i1 %result629}630 631define i32 @pcmpistri_mem_idx_i8(ptr %lhs_ptr, ptr %rhs_ptr) nounwind {632; X86-LABEL: pcmpistri_mem_idx_i8:633; X86:       # %bb.0: # %entry634; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax635; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx636; X86-NEXT:    movdqu (%ecx), %xmm0637; X86-NEXT:    pcmpistri $24, (%eax), %xmm0638; X86-NEXT:    movl %ecx, %eax639; X86-NEXT:    retl640;641; X64-LABEL: pcmpistri_mem_idx_i8:642; X64:       # %bb.0: # %entry643; X64-NEXT:    movdqu (%rdi), %xmm0644; X64-NEXT:    pcmpistri $24, (%rsi), %xmm0645; X64-NEXT:    movl %ecx, %eax646; X64-NEXT:    retq647entry:648  %lhs = load <16 x i8>, ptr %lhs_ptr, align 1649  %rhs = load <16 x i8>, ptr %rhs_ptr, align 1650  %idx = call i32 @llvm.x86.sse42.pcmpistri128(<16 x i8> %lhs, <16 x i8> %rhs, i8 24)651  ret i32 %idx652}653 654define i32 @pcmpistri_mem_diff_i8(ptr %lhs_ptr, ptr %rhs_ptr) nounwind {655; X86-LABEL: pcmpistri_mem_diff_i8:656; X86:       # %bb.0: # %entry657; X86-NEXT:    pushl %ebp658; X86-NEXT:    movl %esp, %ebp659; X86-NEXT:    andl $-16, %esp660; X86-NEXT:    subl $48, %esp661; X86-NEXT:    movl 12(%ebp), %eax662; X86-NEXT:    movl 8(%ebp), %ecx663; X86-NEXT:    movdqu (%ecx), %xmm1664; X86-NEXT:    movdqu (%eax), %xmm0665; X86-NEXT:    pcmpistri $24, %xmm0, %xmm1666; X86-NEXT:    cmpl $16, %ecx667; X86-NEXT:    jne .LBB17_2668; X86-NEXT:  # %bb.1:669; X86-NEXT:    xorl %eax, %eax670; X86-NEXT:    jmp .LBB17_3671; X86-NEXT:  .LBB17_2: # %compare672; X86-NEXT:    movdqa %xmm1, (%esp)673; X86-NEXT:    andl $15, %ecx674; X86-NEXT:    movzbl (%esp,%ecx), %eax675; X86-NEXT:    movdqa %xmm0, {{[0-9]+}}(%esp)676; X86-NEXT:    subb 16(%esp,%ecx), %al677; X86-NEXT:  .LBB17_3: # %exit678; X86-NEXT:    movzbl %al, %eax679; X86-NEXT:    movl %ebp, %esp680; X86-NEXT:    popl %ebp681; X86-NEXT:    retl682;683; X64-LABEL: pcmpistri_mem_diff_i8:684; X64:       # %bb.0: # %entry685; X64-NEXT:    movdqu (%rdi), %xmm1686; X64-NEXT:    movdqu (%rsi), %xmm0687; X64-NEXT:    pcmpistri $24, %xmm0, %xmm1688; X64-NEXT:    # kill: def $ecx killed $ecx def $rcx689; X64-NEXT:    cmpl $16, %ecx690; X64-NEXT:    jne .LBB17_2691; X64-NEXT:  # %bb.1:692; X64-NEXT:    xorl %eax, %eax693; X64-NEXT:    movzbl %al, %eax694; X64-NEXT:    retq695; X64-NEXT:  .LBB17_2: # %compare696; X64-NEXT:    movdqa %xmm1, -{{[0-9]+}}(%rsp)697; X64-NEXT:    andl $15, %ecx698; X64-NEXT:    movzbl -24(%rsp,%rcx), %eax699; X64-NEXT:    movdqa %xmm0, -{{[0-9]+}}(%rsp)700; X64-NEXT:    subb -40(%rsp,%rcx), %al701; X64-NEXT:    movzbl %al, %eax702; X64-NEXT:    retq703entry:704  %lhs = load <16 x i8>, ptr %lhs_ptr, align 1705  %rhs = load <16 x i8>, ptr %rhs_ptr, align 1706  %idx = call i32 @llvm.x86.sse42.pcmpistri128(<16 x i8> %lhs, <16 x i8> %rhs, i8 24)707  %eq = icmp eq i32 %idx, 16708  br i1 %eq, label %exit, label %compare709 710compare:711  %lhs_c = extractelement <16 x i8> %lhs, i32 %idx712  %rhs_c = extractelement <16 x i8> %rhs, i32 %idx713  %sub = sub i8 %lhs_c, %rhs_c714  br label %exit715 716exit:717  %result = phi i8 [ 0, %entry ], [ %sub, %compare ]718  %result_ext = zext i8 %result to i32719  ret i32 %result_ext720}721 722define i1 @pcmpistri_reg_eq_i16(<8 x i16> %lhs, <8 x i16> %rhs) nounwind {723; X86-LABEL: pcmpistri_reg_eq_i16:724; X86:       # %bb.0: # %entry725; X86-NEXT:    pcmpistri $24, %xmm1, %xmm0726; X86-NEXT:    setae %al727; X86-NEXT:    retl728;729; X64-LABEL: pcmpistri_reg_eq_i16:730; X64:       # %bb.0: # %entry731; X64-NEXT:    pcmpistri $24, %xmm1, %xmm0732; X64-NEXT:    setae %al733; X64-NEXT:    retq734entry:735  %lhs_cast = bitcast <8 x i16> %lhs to <16 x i8>736  %rhs_cast = bitcast <8 x i16> %rhs to <16 x i8>737  %c = call i32 @llvm.x86.sse42.pcmpistric128(<16 x i8> %lhs_cast, <16 x i8> %rhs_cast, i8 24)738  %result = icmp eq i32 %c, 0739  ret i1 %result740}741 742define i32 @pcmpistri_reg_idx_i16(<8 x i16> %lhs, <8 x i16> %rhs) nounwind {743; X86-LABEL: pcmpistri_reg_idx_i16:744; X86:       # %bb.0: # %entry745; X86-NEXT:    pcmpistri $24, %xmm1, %xmm0746; X86-NEXT:    movl %ecx, %eax747; X86-NEXT:    retl748;749; X64-LABEL: pcmpistri_reg_idx_i16:750; X64:       # %bb.0: # %entry751; X64-NEXT:    pcmpistri $24, %xmm1, %xmm0752; X64-NEXT:    movl %ecx, %eax753; X64-NEXT:    retq754entry:755  %lhs_cast = bitcast <8 x i16> %lhs to <16 x i8>756  %rhs_cast = bitcast <8 x i16> %rhs to <16 x i8>757  %idx = call i32 @llvm.x86.sse42.pcmpistri128(<16 x i8> %lhs_cast, <16 x i8> %rhs_cast, i8 24)758  ret i32 %idx759}760 761define i32 @pcmpistri_reg_diff_i16(<8 x i16> %lhs, <8 x i16> %rhs) nounwind {762; X86-LABEL: pcmpistri_reg_diff_i16:763; X86:       # %bb.0: # %entry764; X86-NEXT:    pcmpistri $24, %xmm1, %xmm0765; X86-NEXT:    cmpl $16, %ecx766; X86-NEXT:    jne .LBB20_2767; X86-NEXT:  # %bb.1:768; X86-NEXT:    xorl %eax, %eax769; X86-NEXT:    movzwl %ax, %eax770; X86-NEXT:    retl771; X86-NEXT:  .LBB20_2: # %compare772; X86-NEXT:    pushl %ebp773; X86-NEXT:    movl %esp, %ebp774; X86-NEXT:    andl $-16, %esp775; X86-NEXT:    subl $48, %esp776; X86-NEXT:    movdqa %xmm0, (%esp)777; X86-NEXT:    addl %ecx, %ecx778; X86-NEXT:    andl $14, %ecx779; X86-NEXT:    movzwl (%esp,%ecx), %eax780; X86-NEXT:    movdqa %xmm1, {{[0-9]+}}(%esp)781; X86-NEXT:    subw 16(%esp,%ecx), %ax782; X86-NEXT:    movl %ebp, %esp783; X86-NEXT:    popl %ebp784; X86-NEXT:    movzwl %ax, %eax785; X86-NEXT:    retl786;787; X64-LABEL: pcmpistri_reg_diff_i16:788; X64:       # %bb.0: # %entry789; X64-NEXT:    pcmpistri $24, %xmm1, %xmm0790; X64-NEXT:    # kill: def $ecx killed $ecx def $rcx791; X64-NEXT:    cmpl $16, %ecx792; X64-NEXT:    jne .LBB20_2793; X64-NEXT:  # %bb.1:794; X64-NEXT:    xorl %eax, %eax795; X64-NEXT:    movzwl %ax, %eax796; X64-NEXT:    retq797; X64-NEXT:  .LBB20_2: # %compare798; X64-NEXT:    movdqa %xmm0, -{{[0-9]+}}(%rsp)799; X64-NEXT:    andl $7, %ecx800; X64-NEXT:    addl %ecx, %ecx801; X64-NEXT:    movzwl -24(%rsp,%rcx), %eax802; X64-NEXT:    movdqa %xmm1, -{{[0-9]+}}(%rsp)803; X64-NEXT:    subw -40(%rsp,%rcx), %ax804; X64-NEXT:    movzwl %ax, %eax805; X64-NEXT:    retq806entry:807  %lhs_cast = bitcast <8 x i16> %lhs to <16 x i8>808  %rhs_cast = bitcast <8 x i16> %rhs to <16 x i8>809  %idx = call i32 @llvm.x86.sse42.pcmpistri128(<16 x i8> %lhs_cast, <16 x i8> %rhs_cast, i8 24)810  %eq = icmp eq i32 %idx, 16811  br i1 %eq, label %exit, label %compare812 813compare:814  %lhs_c = extractelement <8 x i16> %lhs, i32 %idx815  %rhs_c = extractelement <8 x i16> %rhs, i32 %idx816  %sub = sub i16 %lhs_c, %rhs_c817  br label %exit818 819exit:820  %result = phi i16 [ 0, %entry ], [ %sub, %compare ]821  %result_ext = zext i16 %result to i32822  ret i32 %result_ext823}824 825define i1 @pcmpistri_mem_eq_i16(ptr %lhs_ptr, ptr %rhs_ptr) nounwind {826; X86-LABEL: pcmpistri_mem_eq_i16:827; X86:       # %bb.0: # %entry828; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax829; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx830; X86-NEXT:    movdqu (%ecx), %xmm0831; X86-NEXT:    pcmpistri $25, (%eax), %xmm0832; X86-NEXT:    setae %al833; X86-NEXT:    retl834;835; X64-LABEL: pcmpistri_mem_eq_i16:836; X64:       # %bb.0: # %entry837; X64-NEXT:    movdqu (%rdi), %xmm0838; X64-NEXT:    pcmpistri $25, (%rsi), %xmm0839; X64-NEXT:    setae %al840; X64-NEXT:    retq841entry:842  %lhs = load <8 x i16>, ptr %lhs_ptr, align 1843  %rhs = load <8 x i16>, ptr %rhs_ptr, align 1844  %lhs_cast = bitcast <8 x i16> %lhs to <16 x i8>845  %rhs_cast = bitcast <8 x i16> %rhs to <16 x i8>846  %c = call i32 @llvm.x86.sse42.pcmpistric128(<16 x i8> %lhs_cast, <16 x i8> %rhs_cast, i8 25)847  %result = icmp eq i32 %c, 0848  ret i1 %result849}850 851define i32 @pcmpistri_mem_idx_i16(ptr %lhs_ptr, ptr %rhs_ptr) nounwind {852; X86-LABEL: pcmpistri_mem_idx_i16:853; X86:       # %bb.0: # %entry854; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax855; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx856; X86-NEXT:    movdqu (%ecx), %xmm0857; X86-NEXT:    pcmpistri $25, (%eax), %xmm0858; X86-NEXT:    movl %ecx, %eax859; X86-NEXT:    retl860;861; X64-LABEL: pcmpistri_mem_idx_i16:862; X64:       # %bb.0: # %entry863; X64-NEXT:    movdqu (%rdi), %xmm0864; X64-NEXT:    pcmpistri $25, (%rsi), %xmm0865; X64-NEXT:    movl %ecx, %eax866; X64-NEXT:    retq867entry:868  %lhs = load <8 x i16>, ptr %lhs_ptr, align 1869  %rhs = load <8 x i16>, ptr %rhs_ptr, align 1870  %lhs_cast = bitcast <8 x i16> %lhs to <16 x i8>871  %rhs_cast = bitcast <8 x i16> %rhs to <16 x i8>872  %idx = call i32 @llvm.x86.sse42.pcmpistri128(<16 x i8> %lhs_cast, <16 x i8> %rhs_cast, i8 25)873  ret i32 %idx874}875 876define i32 @pcmpistri_mem_diff_i16(ptr %lhs_ptr, ptr %rhs_ptr) nounwind {877; X86-LABEL: pcmpistri_mem_diff_i16:878; X86:       # %bb.0: # %entry879; X86-NEXT:    pushl %ebp880; X86-NEXT:    movl %esp, %ebp881; X86-NEXT:    andl $-16, %esp882; X86-NEXT:    subl $48, %esp883; X86-NEXT:    movl 12(%ebp), %eax884; X86-NEXT:    movl 8(%ebp), %ecx885; X86-NEXT:    movdqu (%ecx), %xmm1886; X86-NEXT:    movdqu (%eax), %xmm0887; X86-NEXT:    pcmpistri $25, %xmm0, %xmm1888; X86-NEXT:    cmpl $8, %ecx889; X86-NEXT:    jne .LBB23_2890; X86-NEXT:  # %bb.1:891; X86-NEXT:    xorl %eax, %eax892; X86-NEXT:    jmp .LBB23_3893; X86-NEXT:  .LBB23_2: # %compare894; X86-NEXT:    movdqa %xmm1, (%esp)895; X86-NEXT:    addl %ecx, %ecx896; X86-NEXT:    andl $14, %ecx897; X86-NEXT:    movzwl (%esp,%ecx), %eax898; X86-NEXT:    movdqa %xmm0, {{[0-9]+}}(%esp)899; X86-NEXT:    subw 16(%esp,%ecx), %ax900; X86-NEXT:  .LBB23_3: # %exit901; X86-NEXT:    movzwl %ax, %eax902; X86-NEXT:    movl %ebp, %esp903; X86-NEXT:    popl %ebp904; X86-NEXT:    retl905;906; X64-LABEL: pcmpistri_mem_diff_i16:907; X64:       # %bb.0: # %entry908; X64-NEXT:    movdqu (%rdi), %xmm1909; X64-NEXT:    movdqu (%rsi), %xmm0910; X64-NEXT:    pcmpistri $25, %xmm0, %xmm1911; X64-NEXT:    # kill: def $ecx killed $ecx def $rcx912; X64-NEXT:    cmpl $8, %ecx913; X64-NEXT:    jne .LBB23_2914; X64-NEXT:  # %bb.1:915; X64-NEXT:    xorl %eax, %eax916; X64-NEXT:    movzwl %ax, %eax917; X64-NEXT:    retq918; X64-NEXT:  .LBB23_2: # %compare919; X64-NEXT:    movdqa %xmm1, -{{[0-9]+}}(%rsp)920; X64-NEXT:    andl $7, %ecx921; X64-NEXT:    addl %ecx, %ecx922; X64-NEXT:    movzwl -24(%rsp,%rcx), %eax923; X64-NEXT:    movdqa %xmm0, -{{[0-9]+}}(%rsp)924; X64-NEXT:    subw -40(%rsp,%rcx), %ax925; X64-NEXT:    movzwl %ax, %eax926; X64-NEXT:    retq927entry:928  %lhs = load <8 x i16>, ptr %lhs_ptr, align 1929  %rhs = load <8 x i16>, ptr %rhs_ptr, align 1930  %lhs_cast = bitcast <8 x i16> %lhs to <16 x i8>931  %rhs_cast = bitcast <8 x i16> %rhs to <16 x i8>932  %idx = call i32 @llvm.x86.sse42.pcmpistri128(<16 x i8> %lhs_cast, <16 x i8> %rhs_cast, i8 25)933  %eq = icmp eq i32 %idx, 8934  br i1 %eq, label %exit, label %compare935 936compare:937  %lhs_c = extractelement <8 x i16> %lhs, i32 %idx938  %rhs_c = extractelement <8 x i16> %rhs, i32 %idx939  %sub = sub i16 %lhs_c, %rhs_c940  br label %exit941 942exit:943  %result = phi i16 [ 0, %entry ], [ %sub, %compare ]944  %result_ext = zext i16 %result to i32945  ret i32 %result_ext946}947 948define void @pcmpestr_index_flag(<16 x i8> %lhs, i32 %lhs_len, <16 x i8> %rhs, i32 %rhs_len, ptr %iptr, ptr %fptr) nounwind {949; X86-LABEL: pcmpestr_index_flag:950; X86:       # %bb.0: # %entry951; X86-NEXT:    pushl %ebx952; X86-NEXT:    pushl %edi953; X86-NEXT:    pushl %esi954; X86-NEXT:    movl {{[0-9]+}}(%esp), %esi955; X86-NEXT:    movl {{[0-9]+}}(%esp), %edi956; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax957; X86-NEXT:    movl {{[0-9]+}}(%esp), %edx958; X86-NEXT:    xorl %ebx, %ebx959; X86-NEXT:    pcmpestri $24, %xmm1, %xmm0960; X86-NEXT:    setb %bl961; X86-NEXT:    movl %ecx, (%edi)962; X86-NEXT:    movl %ebx, (%esi)963; X86-NEXT:    popl %esi964; X86-NEXT:    popl %edi965; X86-NEXT:    popl %ebx966; X86-NEXT:    retl967;968; X64-LABEL: pcmpestr_index_flag:969; X64:       # %bb.0: # %entry970; X64-NEXT:    movq %rcx, %r8971; X64-NEXT:    movq %rdx, %r9972; X64-NEXT:    movl %esi, %edx973; X64-NEXT:    movl %edi, %eax974; X64-NEXT:    xorl %esi, %esi975; X64-NEXT:    pcmpestri $24, %xmm1, %xmm0976; X64-NEXT:    setb %sil977; X64-NEXT:    movl %ecx, (%r9)978; X64-NEXT:    movl %esi, (%r8)979; X64-NEXT:    retq980entry:981  %flag = call i32 @llvm.x86.sse42.pcmpestric128(<16 x i8> %lhs, i32 %lhs_len, <16 x i8> %rhs, i32 %rhs_len, i8 24)982  %index = call i32 @llvm.x86.sse42.pcmpestri128(<16 x i8> %lhs, i32 %lhs_len, <16 x i8> %rhs, i32 %rhs_len, i8 24)983  store i32 %index, ptr %iptr984  store i32 %flag, ptr %fptr985  ret void986}987 988define void @pcmpestr_mask_flag(<16 x i8> %lhs, i32 %lhs_len, <16 x i8> %rhs, i32 %rhs_len, ptr %mptr, ptr %fptr) nounwind {989; X86-LABEL: pcmpestr_mask_flag:990; X86:       # %bb.0: # %entry991; X86-NEXT:    pushl %ebx992; X86-NEXT:    pushl %esi993; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx994; X86-NEXT:    movl {{[0-9]+}}(%esp), %esi995; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax996; X86-NEXT:    movl {{[0-9]+}}(%esp), %edx997; X86-NEXT:    xorl %ebx, %ebx998; X86-NEXT:    pcmpestrm $24, %xmm1, %xmm0999; X86-NEXT:    setb %bl1000; X86-NEXT:    movdqa %xmm0, (%esi)1001; X86-NEXT:    movl %ebx, (%ecx)1002; X86-NEXT:    popl %esi1003; X86-NEXT:    popl %ebx1004; X86-NEXT:    retl1005;1006; X64-LABEL: pcmpestr_mask_flag:1007; X64:       # %bb.0: # %entry1008; X64-NEXT:    movq %rdx, %r81009; X64-NEXT:    movl %esi, %edx1010; X64-NEXT:    movl %edi, %eax1011; X64-NEXT:    xorl %esi, %esi1012; X64-NEXT:    pcmpestrm $24, %xmm1, %xmm01013; X64-NEXT:    setb %sil1014; X64-NEXT:    movdqa %xmm0, (%r8)1015; X64-NEXT:    movl %esi, (%rcx)1016; X64-NEXT:    retq1017entry:1018  %flag = call i32 @llvm.x86.sse42.pcmpestric128(<16 x i8> %lhs, i32 %lhs_len, <16 x i8> %rhs, i32 %rhs_len, i8 24)1019  %mask = call <16 x i8> @llvm.x86.sse42.pcmpestrm128(<16 x i8> %lhs, i32 %lhs_len, <16 x i8> %rhs, i32 %rhs_len, i8 24)1020  store <16 x i8> %mask, ptr %mptr1021  store i32 %flag, ptr %fptr1022  ret void1023}1024 1025define void @pcmpestr_mask_index(<16 x i8> %lhs, i32 %lhs_len, <16 x i8> %rhs, i32 %rhs_len, ptr %mptr, ptr %iptr) nounwind {1026; X86-LABEL: pcmpestr_mask_index:1027; X86:       # %bb.0: # %entry1028; X86-NEXT:    pushl %edi1029; X86-NEXT:    pushl %esi1030; X86-NEXT:    movdqa %xmm0, %xmm21031; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax1032; X86-NEXT:    movl {{[0-9]+}}(%esp), %edx1033; X86-NEXT:    pcmpestrm $24, %xmm1, %xmm01034; X86-NEXT:    movl {{[0-9]+}}(%esp), %esi1035; X86-NEXT:    movl {{[0-9]+}}(%esp), %edi1036; X86-NEXT:    pcmpestri $24, %xmm1, %xmm21037; X86-NEXT:    movdqa %xmm0, (%edi)1038; X86-NEXT:    movl %ecx, (%esi)1039; X86-NEXT:    popl %esi1040; X86-NEXT:    popl %edi1041; X86-NEXT:    retl1042;1043; X64-LABEL: pcmpestr_mask_index:1044; X64:       # %bb.0: # %entry1045; X64-NEXT:    movq %rcx, %r81046; X64-NEXT:    movq %rdx, %r91047; X64-NEXT:    movl %esi, %edx1048; X64-NEXT:    movl %edi, %eax1049; X64-NEXT:    movdqa %xmm0, %xmm21050; X64-NEXT:    pcmpestrm $24, %xmm1, %xmm01051; X64-NEXT:    pcmpestri $24, %xmm1, %xmm21052; X64-NEXT:    movdqa %xmm0, (%r9)1053; X64-NEXT:    movl %ecx, (%r8)1054; X64-NEXT:    retq1055entry:1056  %index = call i32 @llvm.x86.sse42.pcmpestri128(<16 x i8> %lhs, i32 %lhs_len, <16 x i8> %rhs, i32 %rhs_len, i8 24)1057  %mask = call <16 x i8> @llvm.x86.sse42.pcmpestrm128(<16 x i8> %lhs, i32 %lhs_len, <16 x i8> %rhs, i32 %rhs_len, i8 24)1058  store <16 x i8> %mask, ptr %mptr1059  store i32 %index, ptr %iptr1060  ret void1061}1062 1063define void @pcmpestr_mask_index_flag(<16 x i8> %lhs, i32 %lhs_len, <16 x i8> %rhs, i32 %rhs_len, ptr %mptr, ptr %iptr, ptr %fptr) nounwind {1064; X86-LABEL: pcmpestr_mask_index_flag:1065; X86:       # %bb.0: # %entry1066; X86-NEXT:    pushl %ebp1067; X86-NEXT:    pushl %ebx1068; X86-NEXT:    pushl %edi1069; X86-NEXT:    pushl %esi1070; X86-NEXT:    movdqa %xmm0, %xmm21071; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax1072; X86-NEXT:    movl {{[0-9]+}}(%esp), %edx1073; X86-NEXT:    pcmpestrm $24, %xmm1, %xmm01074; X86-NEXT:    movl {{[0-9]+}}(%esp), %esi1075; X86-NEXT:    movl {{[0-9]+}}(%esp), %edi1076; X86-NEXT:    movl {{[0-9]+}}(%esp), %ebp1077; X86-NEXT:    xorl %ebx, %ebx1078; X86-NEXT:    pcmpestri $24, %xmm1, %xmm21079; X86-NEXT:    setb %bl1080; X86-NEXT:    movdqa %xmm0, (%ebp)1081; X86-NEXT:    movl %ecx, (%edi)1082; X86-NEXT:    movl %ebx, (%esi)1083; X86-NEXT:    popl %esi1084; X86-NEXT:    popl %edi1085; X86-NEXT:    popl %ebx1086; X86-NEXT:    popl %ebp1087; X86-NEXT:    retl1088;1089; X64-LABEL: pcmpestr_mask_index_flag:1090; X64:       # %bb.0: # %entry1091; X64-NEXT:    movq %rcx, %r91092; X64-NEXT:    movq %rdx, %r101093; X64-NEXT:    movl %esi, %edx1094; X64-NEXT:    movl %edi, %eax1095; X64-NEXT:    movdqa %xmm0, %xmm21096; X64-NEXT:    pcmpestrm $24, %xmm1, %xmm01097; X64-NEXT:    xorl %esi, %esi1098; X64-NEXT:    pcmpestri $24, %xmm1, %xmm21099; X64-NEXT:    setb %sil1100; X64-NEXT:    movdqa %xmm0, (%r10)1101; X64-NEXT:    movl %ecx, (%r9)1102; X64-NEXT:    movl %esi, (%r8)1103; X64-NEXT:    retq1104entry:1105  %index = call i32 @llvm.x86.sse42.pcmpestri128(<16 x i8> %lhs, i32 %lhs_len, <16 x i8> %rhs, i32 %rhs_len, i8 24)1106  %mask = call <16 x i8> @llvm.x86.sse42.pcmpestrm128(<16 x i8> %lhs, i32 %lhs_len, <16 x i8> %rhs, i32 %rhs_len, i8 24)1107  %flag = call i32 @llvm.x86.sse42.pcmpestric128(<16 x i8> %lhs, i32 %lhs_len, <16 x i8> %rhs, i32 %rhs_len, i8 24)1108  store <16 x i8> %mask, ptr %mptr1109  store i32 %index, ptr %iptr1110  store i32 %flag, ptr %fptr1111  ret void1112}1113 1114define void @pcmpistr_index_flag(<16 x i8> %lhs, <16 x i8> %rhs, ptr %iptr, ptr %fptr) nounwind {1115; X86-LABEL: pcmpistr_index_flag:1116; X86:       # %bb.0: # %entry1117; X86-NEXT:    pushl %esi1118; X86-NEXT:    movl {{[0-9]+}}(%esp), %edx1119; X86-NEXT:    movl {{[0-9]+}}(%esp), %esi1120; X86-NEXT:    xorl %eax, %eax1121; X86-NEXT:    pcmpistri $24, %xmm1, %xmm01122; X86-NEXT:    setb %al1123; X86-NEXT:    movl %ecx, (%esi)1124; X86-NEXT:    movl %eax, (%edx)1125; X86-NEXT:    popl %esi1126; X86-NEXT:    retl1127;1128; X64-LABEL: pcmpistr_index_flag:1129; X64:       # %bb.0: # %entry1130; X64-NEXT:    xorl %eax, %eax1131; X64-NEXT:    pcmpistri $24, %xmm1, %xmm01132; X64-NEXT:    setb %al1133; X64-NEXT:    movl %ecx, (%rdi)1134; X64-NEXT:    movl %eax, (%rsi)1135; X64-NEXT:    retq1136entry:1137  %flag = call i32 @llvm.x86.sse42.pcmpistric128(<16 x i8> %lhs, <16 x i8> %rhs, i8 24)1138  %index = call i32 @llvm.x86.sse42.pcmpistri128(<16 x i8> %lhs, <16 x i8> %rhs, i8 24)1139  store i32 %index, ptr %iptr1140  store i32 %flag, ptr %fptr1141  ret void1142}1143 1144define void @pcmpistr_mask_flag(<16 x i8> %lhs, <16 x i8> %rhs, ptr %mptr, ptr %fptr) nounwind {1145; X86-LABEL: pcmpistr_mask_flag:1146; X86:       # %bb.0: # %entry1147; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx1148; X86-NEXT:    movl {{[0-9]+}}(%esp), %edx1149; X86-NEXT:    xorl %eax, %eax1150; X86-NEXT:    pcmpistrm $24, %xmm1, %xmm01151; X86-NEXT:    setb %al1152; X86-NEXT:    movdqa %xmm0, (%edx)1153; X86-NEXT:    movl %eax, (%ecx)1154; X86-NEXT:    retl1155;1156; X64-LABEL: pcmpistr_mask_flag:1157; X64:       # %bb.0: # %entry1158; X64-NEXT:    xorl %eax, %eax1159; X64-NEXT:    pcmpistrm $24, %xmm1, %xmm01160; X64-NEXT:    setb %al1161; X64-NEXT:    movdqa %xmm0, (%rdi)1162; X64-NEXT:    movl %eax, (%rsi)1163; X64-NEXT:    retq1164entry:1165  %flag = call i32 @llvm.x86.sse42.pcmpistric128(<16 x i8> %lhs, <16 x i8> %rhs, i8 24)1166  %mask = call <16 x i8> @llvm.x86.sse42.pcmpistrm128(<16 x i8> %lhs, <16 x i8> %rhs, i8 24)1167  store <16 x i8> %mask, ptr %mptr1168  store i32 %flag, ptr %fptr1169  ret void1170}1171 1172define void @pcmpistr_mask_index(<16 x i8> %lhs, <16 x i8> %rhs, ptr %mptr, ptr %iptr) nounwind {1173; X86-LABEL: pcmpistr_mask_index:1174; X86:       # %bb.0: # %entry1175; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax1176; X86-NEXT:    movl {{[0-9]+}}(%esp), %edx1177; X86-NEXT:    pcmpistri $24, %xmm1, %xmm01178; X86-NEXT:    pcmpistrm $24, %xmm1, %xmm01179; X86-NEXT:    movdqa %xmm0, (%edx)1180; X86-NEXT:    movl %ecx, (%eax)1181; X86-NEXT:    retl1182;1183; X64-LABEL: pcmpistr_mask_index:1184; X64:       # %bb.0: # %entry1185; X64-NEXT:    pcmpistri $24, %xmm1, %xmm01186; X64-NEXT:    pcmpistrm $24, %xmm1, %xmm01187; X64-NEXT:    movdqa %xmm0, (%rdi)1188; X64-NEXT:    movl %ecx, (%rsi)1189; X64-NEXT:    retq1190entry:1191  %index = call i32 @llvm.x86.sse42.pcmpistri128(<16 x i8> %lhs, <16 x i8> %rhs, i8 24)1192  %mask = call <16 x i8> @llvm.x86.sse42.pcmpistrm128(<16 x i8> %lhs, <16 x i8> %rhs, i8 24)1193  store <16 x i8> %mask, ptr %mptr1194  store i32 %index, ptr %iptr1195  ret void1196}1197 1198define void @pcmpistr_mask_index_flag(<16 x i8> %lhs, <16 x i8> %rhs, ptr %mptr, ptr %iptr, ptr %fptr) nounwind {1199; X86-LABEL: pcmpistr_mask_index_flag:1200; X86:       # %bb.0: # %entry1201; X86-NEXT:    pushl %ebx1202; X86-NEXT:    pushl %esi1203; X86-NEXT:    movdqa %xmm0, %xmm21204; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax1205; X86-NEXT:    movl {{[0-9]+}}(%esp), %edx1206; X86-NEXT:    movl {{[0-9]+}}(%esp), %esi1207; X86-NEXT:    pcmpistrm $24, %xmm1, %xmm01208; X86-NEXT:    xorl %ebx, %ebx1209; X86-NEXT:    pcmpistri $24, %xmm1, %xmm21210; X86-NEXT:    setb %bl1211; X86-NEXT:    movdqa %xmm0, (%esi)1212; X86-NEXT:    movl %ecx, (%edx)1213; X86-NEXT:    movl %ebx, (%eax)1214; X86-NEXT:    popl %esi1215; X86-NEXT:    popl %ebx1216; X86-NEXT:    retl1217;1218; X64-LABEL: pcmpistr_mask_index_flag:1219; X64:       # %bb.0: # %entry1220; X64-NEXT:    movdqa %xmm0, %xmm21221; X64-NEXT:    pcmpistrm $24, %xmm1, %xmm01222; X64-NEXT:    xorl %eax, %eax1223; X64-NEXT:    pcmpistri $24, %xmm1, %xmm21224; X64-NEXT:    setb %al1225; X64-NEXT:    movdqa %xmm0, (%rdi)1226; X64-NEXT:    movl %ecx, (%rsi)1227; X64-NEXT:    movl %eax, (%rdx)1228; X64-NEXT:    retq1229entry:1230  %index = call i32 @llvm.x86.sse42.pcmpistri128(<16 x i8> %lhs, <16 x i8> %rhs, i8 24)1231  %mask = call <16 x i8> @llvm.x86.sse42.pcmpistrm128(<16 x i8> %lhs, <16 x i8> %rhs, i8 24)1232  %flag = call i32 @llvm.x86.sse42.pcmpistric128(<16 x i8> %lhs, <16 x i8> %rhs, i8 24)1233  store <16 x i8> %mask, ptr %mptr1234  store i32 %index, ptr %iptr1235  store i32 %flag, ptr %fptr1236  ret void1237}1238 1239; Make sure we don't fold loads when we need to emit pcmpistrm and pcmpistri.1240define void @pcmpistr_mask_index_flag_load(<16 x i8> %lhs, ptr %rhsptr, ptr %mptr, ptr %iptr, ptr %fptr) nounwind {1241; X86-LABEL: pcmpistr_mask_index_flag_load:1242; X86:       # %bb.0: # %entry1243; X86-NEXT:    pushl %ebx1244; X86-NEXT:    pushl %esi1245; X86-NEXT:    movdqa %xmm0, %xmm11246; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax1247; X86-NEXT:    movl {{[0-9]+}}(%esp), %edx1248; X86-NEXT:    movl {{[0-9]+}}(%esp), %esi1249; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx1250; X86-NEXT:    movdqu (%ecx), %xmm21251; X86-NEXT:    pcmpistrm $24, %xmm2, %xmm01252; X86-NEXT:    xorl %ebx, %ebx1253; X86-NEXT:    pcmpistri $24, %xmm2, %xmm11254; X86-NEXT:    setb %bl1255; X86-NEXT:    movdqa %xmm0, (%esi)1256; X86-NEXT:    movl %ecx, (%edx)1257; X86-NEXT:    movl %ebx, (%eax)1258; X86-NEXT:    popl %esi1259; X86-NEXT:    popl %ebx1260; X86-NEXT:    retl1261;1262; X64-LABEL: pcmpistr_mask_index_flag_load:1263; X64:       # %bb.0: # %entry1264; X64-NEXT:    movq %rcx, %rax1265; X64-NEXT:    movdqa %xmm0, %xmm11266; X64-NEXT:    movdqu (%rdi), %xmm21267; X64-NEXT:    pcmpistrm $24, %xmm2, %xmm01268; X64-NEXT:    xorl %edi, %edi1269; X64-NEXT:    pcmpistri $24, %xmm2, %xmm11270; X64-NEXT:    setb %dil1271; X64-NEXT:    movdqa %xmm0, (%rsi)1272; X64-NEXT:    movl %ecx, (%rdx)1273; X64-NEXT:    movl %edi, (%rax)1274; X64-NEXT:    retq1275entry:1276  %rhs = load <16 x i8>, ptr %rhsptr, align 11277  %index = call i32 @llvm.x86.sse42.pcmpistri128(<16 x i8> %lhs, <16 x i8> %rhs, i8 24)1278  %mask = call <16 x i8> @llvm.x86.sse42.pcmpistrm128(<16 x i8> %lhs, <16 x i8> %rhs, i8 24)1279  %flag = call i32 @llvm.x86.sse42.pcmpistric128(<16 x i8> %lhs, <16 x i8> %rhs, i8 24)1280  store <16 x i8> %mask, ptr %mptr1281  store i32 %index, ptr %iptr1282  store i32 %flag, ptr %fptr1283  ret void1284}1285 1286; Make sure we don't fold nontemporal loads.1287define i32 @pcmpestri_nontemporal(<16 x i8> %lhs, i32 %lhs_len, ptr %rhsptr, i32 %rhs_len) nounwind {1288; X86-LABEL: pcmpestri_nontemporal:1289; X86:       # %bb.0: # %entry1290; X86-NEXT:    pushl %ebx1291; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax1292; X86-NEXT:    movl {{[0-9]+}}(%esp), %edx1293; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx1294; X86-NEXT:    movntdqa (%ecx), %xmm11295; X86-NEXT:    xorl %ebx, %ebx1296; X86-NEXT:    pcmpestri $24, %xmm1, %xmm01297; X86-NEXT:    setb %bl1298; X86-NEXT:    movl %ebx, %eax1299; X86-NEXT:    popl %ebx1300; X86-NEXT:    retl1301;1302; X64-LABEL: pcmpestri_nontemporal:1303; X64:       # %bb.0: # %entry1304; X64-NEXT:    movl %edi, %eax1305; X64-NEXT:    movntdqa (%rsi), %xmm11306; X64-NEXT:    xorl %esi, %esi1307; X64-NEXT:    pcmpestri $24, %xmm1, %xmm01308; X64-NEXT:    setb %sil1309; X64-NEXT:    movl %esi, %eax1310; X64-NEXT:    retq1311entry:1312  %rhs = load <16 x i8>, ptr %rhsptr, align 16, !nontemporal !01313  %flag = call i32 @llvm.x86.sse42.pcmpestric128(<16 x i8> %lhs, i32 %lhs_len, <16 x i8> %rhs, i32 %rhs_len, i8 24)1314  ret i32 %flag1315}1316 1317!0 = !{ i32 1 }1318