2162 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc < %s -mtriple=i686-unknown-unknown -mattr=+avx | FileCheck %s --check-prefixes=X863; RUN: llc < %s -mtriple=x86_64-unknown-unknown | FileCheck %s --check-prefixes=SSE4; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx | FileCheck %s --check-prefixes=AVX,AVX15; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx2 | FileCheck %s --check-prefixes=AVX,AVX26; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512vl | FileCheck %s --check-prefixes=AVX,AVX5127 8define void @vp_add_v4i32(<4 x i32> %a0, <4 x i32> %a1, ptr %out, i32 %vp) nounwind {9; X86-LABEL: vp_add_v4i32:10; X86: # %bb.0:11; X86-NEXT: movl {{[0-9]+}}(%esp), %eax12; X86-NEXT: vpaddd %xmm1, %xmm0, %xmm013; X86-NEXT: vmovdqa %xmm0, (%eax)14; X86-NEXT: retl15;16; SSE-LABEL: vp_add_v4i32:17; SSE: # %bb.0:18; SSE-NEXT: paddd %xmm1, %xmm019; SSE-NEXT: movdqa %xmm0, (%rdi)20; SSE-NEXT: retq21;22; AVX-LABEL: vp_add_v4i32:23; AVX: # %bb.0:24; AVX-NEXT: vpaddd %xmm1, %xmm0, %xmm025; AVX-NEXT: vmovdqa %xmm0, (%rdi)26; AVX-NEXT: retq27 %res = call <4 x i32> @llvm.vp.add.v4i32(<4 x i32> %a0, <4 x i32> %a1, <4 x i1> <i1 -1, i1 -1, i1 -1, i1 -1>, i32 %vp)28 store <4 x i32> %res, ptr %out29 ret void30}31declare <4 x i32> @llvm.vp.add.v4i32(<4 x i32>, <4 x i32>, <4 x i1>, i32)32 33define void @vp_sub_v4i32(<4 x i32> %a0, <4 x i32> %a1, ptr %out, i32 %vp) nounwind {34; X86-LABEL: vp_sub_v4i32:35; X86: # %bb.0:36; X86-NEXT: movl {{[0-9]+}}(%esp), %eax37; X86-NEXT: vpsubd %xmm1, %xmm0, %xmm038; X86-NEXT: vmovdqa %xmm0, (%eax)39; X86-NEXT: retl40;41; SSE-LABEL: vp_sub_v4i32:42; SSE: # %bb.0:43; SSE-NEXT: psubd %xmm1, %xmm044; SSE-NEXT: movdqa %xmm0, (%rdi)45; SSE-NEXT: retq46;47; AVX-LABEL: vp_sub_v4i32:48; AVX: # %bb.0:49; AVX-NEXT: vpsubd %xmm1, %xmm0, %xmm050; AVX-NEXT: vmovdqa %xmm0, (%rdi)51; AVX-NEXT: retq52 %res = call <4 x i32> @llvm.vp.sub.v4i32(<4 x i32> %a0, <4 x i32> %a1, <4 x i1> <i1 -1, i1 -1, i1 -1, i1 -1>, i32 %vp)53 store <4 x i32> %res, ptr %out54 ret void55}56declare <4 x i32> @llvm.vp.sub.v4i32(<4 x i32>, <4 x i32>, <4 x i1>, i32)57 58define void @vp_mul_v4i32(<4 x i32> %a0, <4 x i32> %a1, ptr %out, i32 %vp) nounwind {59; X86-LABEL: vp_mul_v4i32:60; X86: # %bb.0:61; X86-NEXT: movl {{[0-9]+}}(%esp), %eax62; X86-NEXT: vpmulld %xmm1, %xmm0, %xmm063; X86-NEXT: vmovdqa %xmm0, (%eax)64; X86-NEXT: retl65;66; SSE-LABEL: vp_mul_v4i32:67; SSE: # %bb.0:68; SSE-NEXT: pshufd {{.*#+}} xmm2 = xmm0[1,1,3,3]69; SSE-NEXT: pmuludq %xmm1, %xmm070; SSE-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]71; SSE-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]72; SSE-NEXT: pmuludq %xmm2, %xmm173; SSE-NEXT: pshufd {{.*#+}} xmm1 = xmm1[0,2,2,3]74; SSE-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]75; SSE-NEXT: movdqa %xmm0, (%rdi)76; SSE-NEXT: retq77;78; AVX-LABEL: vp_mul_v4i32:79; AVX: # %bb.0:80; AVX-NEXT: vpmulld %xmm1, %xmm0, %xmm081; AVX-NEXT: vmovdqa %xmm0, (%rdi)82; AVX-NEXT: retq83 %res = call <4 x i32> @llvm.vp.mul.v4i32(<4 x i32> %a0, <4 x i32> %a1, <4 x i1> <i1 -1, i1 -1, i1 -1, i1 -1>, i32 %vp)84 store <4 x i32> %res, ptr %out85 ret void86}87declare <4 x i32> @llvm.vp.mul.v4i32(<4 x i32>, <4 x i32>, <4 x i1>, i32)88 89define void @vp_sdiv_v4i32(<4 x i32> %a0, <4 x i32> %a1, ptr %out, i32 %vp) nounwind {90; X86-LABEL: vp_sdiv_v4i32:91; X86: # %bb.0:92; X86-NEXT: pushl %edi93; X86-NEXT: pushl %esi94; X86-NEXT: movl {{[0-9]+}}(%esp), %esi95; X86-NEXT: vbroadcastss {{[0-9]+}}(%esp), %xmm296; X86-NEXT: vpmovsxbd {{.*#+}} xmm3 = [0,1,2,3]97; X86-NEXT: vpmaxud %xmm3, %xmm2, %xmm298; X86-NEXT: vpcmpeqd %xmm3, %xmm2, %xmm299; X86-NEXT: vblendvps %xmm2, {{\.?LCPI[0-9]+_[0-9]+}}, %xmm1, %xmm1100; X86-NEXT: vextractps $1, %xmm1, %ecx101; X86-NEXT: vpextrd $1, %xmm0, %eax102; X86-NEXT: cltd103; X86-NEXT: idivl %ecx104; X86-NEXT: movl %eax, %ecx105; X86-NEXT: vmovd %xmm1, %edi106; X86-NEXT: vmovd %xmm0, %eax107; X86-NEXT: cltd108; X86-NEXT: idivl %edi109; X86-NEXT: vmovd %eax, %xmm2110; X86-NEXT: vpinsrd $1, %ecx, %xmm2, %xmm2111; X86-NEXT: vpextrd $2, %xmm1, %ecx112; X86-NEXT: vpextrd $2, %xmm0, %eax113; X86-NEXT: cltd114; X86-NEXT: idivl %ecx115; X86-NEXT: vpinsrd $2, %eax, %xmm2, %xmm2116; X86-NEXT: vpextrd $3, %xmm1, %ecx117; X86-NEXT: vpextrd $3, %xmm0, %eax118; X86-NEXT: cltd119; X86-NEXT: idivl %ecx120; X86-NEXT: vpinsrd $3, %eax, %xmm2, %xmm0121; X86-NEXT: vmovdqa %xmm0, (%esi)122; X86-NEXT: popl %esi123; X86-NEXT: popl %edi124; X86-NEXT: retl125;126; SSE-LABEL: vp_sdiv_v4i32:127; SSE: # %bb.0:128; SSE-NEXT: movd %esi, %xmm2129; SSE-NEXT: pshufd {{.*#+}} xmm2 = xmm2[0,0,0,0]130; SSE-NEXT: pxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2131; SSE-NEXT: pcmpgtd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2132; SSE-NEXT: pand %xmm2, %xmm1133; SSE-NEXT: paddd %xmm2, %xmm1134; SSE-NEXT: pcmpeqd %xmm2, %xmm2135; SSE-NEXT: psubd %xmm2, %xmm1136; SSE-NEXT: pshufd {{.*#+}} xmm2 = xmm1[3,3,3,3]137; SSE-NEXT: movd %xmm2, %ecx138; SSE-NEXT: pshufd {{.*#+}} xmm2 = xmm0[3,3,3,3]139; SSE-NEXT: movd %xmm2, %eax140; SSE-NEXT: cltd141; SSE-NEXT: idivl %ecx142; SSE-NEXT: movd %eax, %xmm2143; SSE-NEXT: pshufd {{.*#+}} xmm3 = xmm1[2,3,2,3]144; SSE-NEXT: movd %xmm3, %ecx145; SSE-NEXT: pshufd {{.*#+}} xmm3 = xmm0[2,3,2,3]146; SSE-NEXT: movd %xmm3, %eax147; SSE-NEXT: cltd148; SSE-NEXT: idivl %ecx149; SSE-NEXT: movd %eax, %xmm3150; SSE-NEXT: punpckldq {{.*#+}} xmm3 = xmm3[0],xmm2[0],xmm3[1],xmm2[1]151; SSE-NEXT: movd %xmm1, %ecx152; SSE-NEXT: movd %xmm0, %eax153; SSE-NEXT: cltd154; SSE-NEXT: idivl %ecx155; SSE-NEXT: movd %eax, %xmm2156; SSE-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,1,1,1]157; SSE-NEXT: movd %xmm1, %ecx158; SSE-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,1,1]159; SSE-NEXT: movd %xmm0, %eax160; SSE-NEXT: cltd161; SSE-NEXT: idivl %ecx162; SSE-NEXT: movd %eax, %xmm0163; SSE-NEXT: punpckldq {{.*#+}} xmm2 = xmm2[0],xmm0[0],xmm2[1],xmm0[1]164; SSE-NEXT: punpcklqdq {{.*#+}} xmm2 = xmm2[0],xmm3[0]165; SSE-NEXT: movdqa %xmm2, (%rdi)166; SSE-NEXT: retq167;168; AVX1-LABEL: vp_sdiv_v4i32:169; AVX1: # %bb.0:170; AVX1-NEXT: vmovd %esi, %xmm2171; AVX1-NEXT: vpshufd {{.*#+}} xmm2 = xmm2[0,0,0,0]172; AVX1-NEXT: vpmovsxbd {{.*#+}} xmm3 = [0,1,2,3]173; AVX1-NEXT: vpmaxud %xmm3, %xmm2, %xmm2174; AVX1-NEXT: vpcmpeqd %xmm3, %xmm2, %xmm2175; AVX1-NEXT: vblendvps %xmm2, {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1176; AVX1-NEXT: vextractps $1, %xmm1, %ecx177; AVX1-NEXT: vpextrd $1, %xmm0, %eax178; AVX1-NEXT: cltd179; AVX1-NEXT: idivl %ecx180; AVX1-NEXT: movl %eax, %ecx181; AVX1-NEXT: vmovd %xmm1, %esi182; AVX1-NEXT: vmovd %xmm0, %eax183; AVX1-NEXT: cltd184; AVX1-NEXT: idivl %esi185; AVX1-NEXT: vmovd %eax, %xmm2186; AVX1-NEXT: vpinsrd $1, %ecx, %xmm2, %xmm2187; AVX1-NEXT: vpextrd $2, %xmm1, %ecx188; AVX1-NEXT: vpextrd $2, %xmm0, %eax189; AVX1-NEXT: cltd190; AVX1-NEXT: idivl %ecx191; AVX1-NEXT: vpinsrd $2, %eax, %xmm2, %xmm2192; AVX1-NEXT: vpextrd $3, %xmm1, %ecx193; AVX1-NEXT: vpextrd $3, %xmm0, %eax194; AVX1-NEXT: cltd195; AVX1-NEXT: idivl %ecx196; AVX1-NEXT: vpinsrd $3, %eax, %xmm2, %xmm0197; AVX1-NEXT: vmovdqa %xmm0, (%rdi)198; AVX1-NEXT: retq199;200; AVX2-LABEL: vp_sdiv_v4i32:201; AVX2: # %bb.0:202; AVX2-NEXT: vmovd %esi, %xmm2203; AVX2-NEXT: vpbroadcastd %xmm2, %xmm2204; AVX2-NEXT: vpmovsxbd {{.*#+}} xmm3 = [0,1,2,3]205; AVX2-NEXT: vpmaxud %xmm3, %xmm2, %xmm2206; AVX2-NEXT: vpcmpeqd %xmm3, %xmm2, %xmm2207; AVX2-NEXT: vbroadcastss {{.*#+}} xmm3 = [1,1,1,1]208; AVX2-NEXT: vblendvps %xmm2, %xmm3, %xmm1, %xmm1209; AVX2-NEXT: vextractps $1, %xmm1, %ecx210; AVX2-NEXT: vpextrd $1, %xmm0, %eax211; AVX2-NEXT: cltd212; AVX2-NEXT: idivl %ecx213; AVX2-NEXT: movl %eax, %ecx214; AVX2-NEXT: vmovd %xmm1, %esi215; AVX2-NEXT: vmovd %xmm0, %eax216; AVX2-NEXT: cltd217; AVX2-NEXT: idivl %esi218; AVX2-NEXT: vmovd %eax, %xmm2219; AVX2-NEXT: vpinsrd $1, %ecx, %xmm2, %xmm2220; AVX2-NEXT: vpextrd $2, %xmm1, %ecx221; AVX2-NEXT: vpextrd $2, %xmm0, %eax222; AVX2-NEXT: cltd223; AVX2-NEXT: idivl %ecx224; AVX2-NEXT: vpinsrd $2, %eax, %xmm2, %xmm2225; AVX2-NEXT: vpextrd $3, %xmm1, %ecx226; AVX2-NEXT: vpextrd $3, %xmm0, %eax227; AVX2-NEXT: cltd228; AVX2-NEXT: idivl %ecx229; AVX2-NEXT: vpinsrd $3, %eax, %xmm2, %xmm0230; AVX2-NEXT: vmovdqa %xmm0, (%rdi)231; AVX2-NEXT: retq232;233; AVX512-LABEL: vp_sdiv_v4i32:234; AVX512: # %bb.0:235; AVX512-NEXT: vpbroadcastd %esi, %xmm2236; AVX512-NEXT: vpcmpnleud {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2, %k1237; AVX512-NEXT: vpbroadcastd {{.*#+}} xmm2 = [1,1,1,1]238; AVX512-NEXT: vmovdqa32 %xmm1, %xmm2 {%k1}239; AVX512-NEXT: vpextrd $1, %xmm2, %ecx240; AVX512-NEXT: vpextrd $1, %xmm0, %eax241; AVX512-NEXT: cltd242; AVX512-NEXT: idivl %ecx243; AVX512-NEXT: movl %eax, %ecx244; AVX512-NEXT: vmovd %xmm2, %esi245; AVX512-NEXT: vmovd %xmm0, %eax246; AVX512-NEXT: cltd247; AVX512-NEXT: idivl %esi248; AVX512-NEXT: vmovd %eax, %xmm1249; AVX512-NEXT: vpinsrd $1, %ecx, %xmm1, %xmm1250; AVX512-NEXT: vpextrd $2, %xmm2, %ecx251; AVX512-NEXT: vpextrd $2, %xmm0, %eax252; AVX512-NEXT: cltd253; AVX512-NEXT: idivl %ecx254; AVX512-NEXT: vpinsrd $2, %eax, %xmm1, %xmm1255; AVX512-NEXT: vpextrd $3, %xmm2, %ecx256; AVX512-NEXT: vpextrd $3, %xmm0, %eax257; AVX512-NEXT: cltd258; AVX512-NEXT: idivl %ecx259; AVX512-NEXT: vpinsrd $3, %eax, %xmm1, %xmm0260; AVX512-NEXT: vmovdqa %xmm0, (%rdi)261; AVX512-NEXT: retq262 %res = call <4 x i32> @llvm.vp.sdiv.v4i32(<4 x i32> %a0, <4 x i32> %a1, <4 x i1> <i1 -1, i1 -1, i1 -1, i1 -1>, i32 %vp)263 store <4 x i32> %res, ptr %out264 ret void265}266declare <4 x i32> @llvm.vp.sdiv.v4i32(<4 x i32>, <4 x i32>, <4 x i1>, i32)267 268define void @vp_udiv_v4i32(<4 x i32> %a0, <4 x i32> %a1, ptr %out, i32 %vp) nounwind {269; X86-LABEL: vp_udiv_v4i32:270; X86: # %bb.0:271; X86-NEXT: pushl %edi272; X86-NEXT: pushl %esi273; X86-NEXT: movl {{[0-9]+}}(%esp), %esi274; X86-NEXT: vbroadcastss {{[0-9]+}}(%esp), %xmm2275; X86-NEXT: vpmovsxbd {{.*#+}} xmm3 = [0,1,2,3]276; X86-NEXT: vpmaxud %xmm3, %xmm2, %xmm2277; X86-NEXT: vpcmpeqd %xmm3, %xmm2, %xmm2278; X86-NEXT: vblendvps %xmm2, {{\.?LCPI[0-9]+_[0-9]+}}, %xmm1, %xmm1279; X86-NEXT: vextractps $1, %xmm1, %ecx280; X86-NEXT: vpextrd $1, %xmm0, %eax281; X86-NEXT: xorl %edx, %edx282; X86-NEXT: divl %ecx283; X86-NEXT: movl %eax, %ecx284; X86-NEXT: vmovd %xmm1, %edi285; X86-NEXT: vmovd %xmm0, %eax286; X86-NEXT: xorl %edx, %edx287; X86-NEXT: divl %edi288; X86-NEXT: vmovd %eax, %xmm2289; X86-NEXT: vpinsrd $1, %ecx, %xmm2, %xmm2290; X86-NEXT: vpextrd $2, %xmm1, %ecx291; X86-NEXT: vpextrd $2, %xmm0, %eax292; X86-NEXT: xorl %edx, %edx293; X86-NEXT: divl %ecx294; X86-NEXT: vpinsrd $2, %eax, %xmm2, %xmm2295; X86-NEXT: vpextrd $3, %xmm1, %ecx296; X86-NEXT: vpextrd $3, %xmm0, %eax297; X86-NEXT: xorl %edx, %edx298; X86-NEXT: divl %ecx299; X86-NEXT: vpinsrd $3, %eax, %xmm2, %xmm0300; X86-NEXT: vmovdqa %xmm0, (%esi)301; X86-NEXT: popl %esi302; X86-NEXT: popl %edi303; X86-NEXT: retl304;305; SSE-LABEL: vp_udiv_v4i32:306; SSE: # %bb.0:307; SSE-NEXT: movd %esi, %xmm2308; SSE-NEXT: pshufd {{.*#+}} xmm2 = xmm2[0,0,0,0]309; SSE-NEXT: pxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2310; SSE-NEXT: pcmpgtd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2311; SSE-NEXT: pand %xmm2, %xmm1312; SSE-NEXT: paddd %xmm2, %xmm1313; SSE-NEXT: pcmpeqd %xmm2, %xmm2314; SSE-NEXT: psubd %xmm2, %xmm1315; SSE-NEXT: pshufd {{.*#+}} xmm2 = xmm1[3,3,3,3]316; SSE-NEXT: movd %xmm2, %ecx317; SSE-NEXT: pshufd {{.*#+}} xmm2 = xmm0[3,3,3,3]318; SSE-NEXT: movd %xmm2, %eax319; SSE-NEXT: xorl %edx, %edx320; SSE-NEXT: divl %ecx321; SSE-NEXT: movd %eax, %xmm2322; SSE-NEXT: pshufd {{.*#+}} xmm3 = xmm1[2,3,2,3]323; SSE-NEXT: movd %xmm3, %ecx324; SSE-NEXT: pshufd {{.*#+}} xmm3 = xmm0[2,3,2,3]325; SSE-NEXT: movd %xmm3, %eax326; SSE-NEXT: xorl %edx, %edx327; SSE-NEXT: divl %ecx328; SSE-NEXT: movd %eax, %xmm3329; SSE-NEXT: punpckldq {{.*#+}} xmm3 = xmm3[0],xmm2[0],xmm3[1],xmm2[1]330; SSE-NEXT: movd %xmm1, %ecx331; SSE-NEXT: movd %xmm0, %eax332; SSE-NEXT: xorl %edx, %edx333; SSE-NEXT: divl %ecx334; SSE-NEXT: movd %eax, %xmm2335; SSE-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,1,1,1]336; SSE-NEXT: movd %xmm1, %ecx337; SSE-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,1,1]338; SSE-NEXT: movd %xmm0, %eax339; SSE-NEXT: xorl %edx, %edx340; SSE-NEXT: divl %ecx341; SSE-NEXT: movd %eax, %xmm0342; SSE-NEXT: punpckldq {{.*#+}} xmm2 = xmm2[0],xmm0[0],xmm2[1],xmm0[1]343; SSE-NEXT: punpcklqdq {{.*#+}} xmm2 = xmm2[0],xmm3[0]344; SSE-NEXT: movdqa %xmm2, (%rdi)345; SSE-NEXT: retq346;347; AVX1-LABEL: vp_udiv_v4i32:348; AVX1: # %bb.0:349; AVX1-NEXT: vmovd %esi, %xmm2350; AVX1-NEXT: vpshufd {{.*#+}} xmm2 = xmm2[0,0,0,0]351; AVX1-NEXT: vpmovsxbd {{.*#+}} xmm3 = [0,1,2,3]352; AVX1-NEXT: vpmaxud %xmm3, %xmm2, %xmm2353; AVX1-NEXT: vpcmpeqd %xmm3, %xmm2, %xmm2354; AVX1-NEXT: vblendvps %xmm2, {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1355; AVX1-NEXT: vextractps $1, %xmm1, %ecx356; AVX1-NEXT: vpextrd $1, %xmm0, %eax357; AVX1-NEXT: xorl %edx, %edx358; AVX1-NEXT: divl %ecx359; AVX1-NEXT: movl %eax, %ecx360; AVX1-NEXT: vmovd %xmm1, %esi361; AVX1-NEXT: vmovd %xmm0, %eax362; AVX1-NEXT: xorl %edx, %edx363; AVX1-NEXT: divl %esi364; AVX1-NEXT: vmovd %eax, %xmm2365; AVX1-NEXT: vpinsrd $1, %ecx, %xmm2, %xmm2366; AVX1-NEXT: vpextrd $2, %xmm1, %ecx367; AVX1-NEXT: vpextrd $2, %xmm0, %eax368; AVX1-NEXT: xorl %edx, %edx369; AVX1-NEXT: divl %ecx370; AVX1-NEXT: vpinsrd $2, %eax, %xmm2, %xmm2371; AVX1-NEXT: vpextrd $3, %xmm1, %ecx372; AVX1-NEXT: vpextrd $3, %xmm0, %eax373; AVX1-NEXT: xorl %edx, %edx374; AVX1-NEXT: divl %ecx375; AVX1-NEXT: vpinsrd $3, %eax, %xmm2, %xmm0376; AVX1-NEXT: vmovdqa %xmm0, (%rdi)377; AVX1-NEXT: retq378;379; AVX2-LABEL: vp_udiv_v4i32:380; AVX2: # %bb.0:381; AVX2-NEXT: vmovd %esi, %xmm2382; AVX2-NEXT: vpbroadcastd %xmm2, %xmm2383; AVX2-NEXT: vpmovsxbd {{.*#+}} xmm3 = [0,1,2,3]384; AVX2-NEXT: vpmaxud %xmm3, %xmm2, %xmm2385; AVX2-NEXT: vpcmpeqd %xmm3, %xmm2, %xmm2386; AVX2-NEXT: vbroadcastss {{.*#+}} xmm3 = [1,1,1,1]387; AVX2-NEXT: vblendvps %xmm2, %xmm3, %xmm1, %xmm1388; AVX2-NEXT: vextractps $1, %xmm1, %ecx389; AVX2-NEXT: vpextrd $1, %xmm0, %eax390; AVX2-NEXT: xorl %edx, %edx391; AVX2-NEXT: divl %ecx392; AVX2-NEXT: movl %eax, %ecx393; AVX2-NEXT: vmovd %xmm1, %esi394; AVX2-NEXT: vmovd %xmm0, %eax395; AVX2-NEXT: xorl %edx, %edx396; AVX2-NEXT: divl %esi397; AVX2-NEXT: vmovd %eax, %xmm2398; AVX2-NEXT: vpinsrd $1, %ecx, %xmm2, %xmm2399; AVX2-NEXT: vpextrd $2, %xmm1, %ecx400; AVX2-NEXT: vpextrd $2, %xmm0, %eax401; AVX2-NEXT: xorl %edx, %edx402; AVX2-NEXT: divl %ecx403; AVX2-NEXT: vpinsrd $2, %eax, %xmm2, %xmm2404; AVX2-NEXT: vpextrd $3, %xmm1, %ecx405; AVX2-NEXT: vpextrd $3, %xmm0, %eax406; AVX2-NEXT: xorl %edx, %edx407; AVX2-NEXT: divl %ecx408; AVX2-NEXT: vpinsrd $3, %eax, %xmm2, %xmm0409; AVX2-NEXT: vmovdqa %xmm0, (%rdi)410; AVX2-NEXT: retq411;412; AVX512-LABEL: vp_udiv_v4i32:413; AVX512: # %bb.0:414; AVX512-NEXT: vpbroadcastd %esi, %xmm2415; AVX512-NEXT: vpcmpnleud {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2, %k1416; AVX512-NEXT: vpbroadcastd {{.*#+}} xmm2 = [1,1,1,1]417; AVX512-NEXT: vmovdqa32 %xmm1, %xmm2 {%k1}418; AVX512-NEXT: vpextrd $1, %xmm2, %ecx419; AVX512-NEXT: vpextrd $1, %xmm0, %eax420; AVX512-NEXT: xorl %edx, %edx421; AVX512-NEXT: divl %ecx422; AVX512-NEXT: movl %eax, %ecx423; AVX512-NEXT: vmovd %xmm2, %esi424; AVX512-NEXT: vmovd %xmm0, %eax425; AVX512-NEXT: xorl %edx, %edx426; AVX512-NEXT: divl %esi427; AVX512-NEXT: vmovd %eax, %xmm1428; AVX512-NEXT: vpinsrd $1, %ecx, %xmm1, %xmm1429; AVX512-NEXT: vpextrd $2, %xmm2, %ecx430; AVX512-NEXT: vpextrd $2, %xmm0, %eax431; AVX512-NEXT: xorl %edx, %edx432; AVX512-NEXT: divl %ecx433; AVX512-NEXT: vpinsrd $2, %eax, %xmm1, %xmm1434; AVX512-NEXT: vpextrd $3, %xmm2, %ecx435; AVX512-NEXT: vpextrd $3, %xmm0, %eax436; AVX512-NEXT: xorl %edx, %edx437; AVX512-NEXT: divl %ecx438; AVX512-NEXT: vpinsrd $3, %eax, %xmm1, %xmm0439; AVX512-NEXT: vmovdqa %xmm0, (%rdi)440; AVX512-NEXT: retq441 %res = call <4 x i32> @llvm.vp.udiv.v4i32(<4 x i32> %a0, <4 x i32> %a1, <4 x i1> <i1 -1, i1 -1, i1 -1, i1 -1>, i32 %vp)442 store <4 x i32> %res, ptr %out443 ret void444}445declare <4 x i32> @llvm.vp.udiv.v4i32(<4 x i32>, <4 x i32>, <4 x i1>, i32)446 447define void @vp_srem_v4i32(<4 x i32> %a0, <4 x i32> %a1, ptr %out, i32 %vp) nounwind {448; X86-LABEL: vp_srem_v4i32:449; X86: # %bb.0:450; X86-NEXT: pushl %edi451; X86-NEXT: pushl %esi452; X86-NEXT: movl {{[0-9]+}}(%esp), %esi453; X86-NEXT: vbroadcastss {{[0-9]+}}(%esp), %xmm2454; X86-NEXT: vpmovsxbd {{.*#+}} xmm3 = [0,1,2,3]455; X86-NEXT: vpmaxud %xmm3, %xmm2, %xmm2456; X86-NEXT: vpcmpeqd %xmm3, %xmm2, %xmm2457; X86-NEXT: vblendvps %xmm2, {{\.?LCPI[0-9]+_[0-9]+}}, %xmm1, %xmm1458; X86-NEXT: vextractps $1, %xmm1, %ecx459; X86-NEXT: vpextrd $1, %xmm0, %eax460; X86-NEXT: cltd461; X86-NEXT: idivl %ecx462; X86-NEXT: movl %edx, %ecx463; X86-NEXT: vmovd %xmm1, %edi464; X86-NEXT: vmovd %xmm0, %eax465; X86-NEXT: cltd466; X86-NEXT: idivl %edi467; X86-NEXT: vmovd %edx, %xmm2468; X86-NEXT: vpinsrd $1, %ecx, %xmm2, %xmm2469; X86-NEXT: vpextrd $2, %xmm1, %ecx470; X86-NEXT: vpextrd $2, %xmm0, %eax471; X86-NEXT: cltd472; X86-NEXT: idivl %ecx473; X86-NEXT: vpinsrd $2, %edx, %xmm2, %xmm2474; X86-NEXT: vpextrd $3, %xmm1, %ecx475; X86-NEXT: vpextrd $3, %xmm0, %eax476; X86-NEXT: cltd477; X86-NEXT: idivl %ecx478; X86-NEXT: vpinsrd $3, %edx, %xmm2, %xmm0479; X86-NEXT: vmovdqa %xmm0, (%esi)480; X86-NEXT: popl %esi481; X86-NEXT: popl %edi482; X86-NEXT: retl483;484; SSE-LABEL: vp_srem_v4i32:485; SSE: # %bb.0:486; SSE-NEXT: movd %esi, %xmm2487; SSE-NEXT: pshufd {{.*#+}} xmm2 = xmm2[0,0,0,0]488; SSE-NEXT: pxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2489; SSE-NEXT: pcmpgtd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2490; SSE-NEXT: pand %xmm2, %xmm1491; SSE-NEXT: paddd %xmm2, %xmm1492; SSE-NEXT: pcmpeqd %xmm2, %xmm2493; SSE-NEXT: psubd %xmm2, %xmm1494; SSE-NEXT: pshufd {{.*#+}} xmm2 = xmm1[3,3,3,3]495; SSE-NEXT: movd %xmm2, %ecx496; SSE-NEXT: pshufd {{.*#+}} xmm2 = xmm0[3,3,3,3]497; SSE-NEXT: movd %xmm2, %eax498; SSE-NEXT: cltd499; SSE-NEXT: idivl %ecx500; SSE-NEXT: movd %edx, %xmm2501; SSE-NEXT: pshufd {{.*#+}} xmm3 = xmm1[2,3,2,3]502; SSE-NEXT: movd %xmm3, %ecx503; SSE-NEXT: pshufd {{.*#+}} xmm3 = xmm0[2,3,2,3]504; SSE-NEXT: movd %xmm3, %eax505; SSE-NEXT: cltd506; SSE-NEXT: idivl %ecx507; SSE-NEXT: movd %edx, %xmm3508; SSE-NEXT: punpckldq {{.*#+}} xmm3 = xmm3[0],xmm2[0],xmm3[1],xmm2[1]509; SSE-NEXT: movd %xmm1, %ecx510; SSE-NEXT: movd %xmm0, %eax511; SSE-NEXT: cltd512; SSE-NEXT: idivl %ecx513; SSE-NEXT: movd %edx, %xmm2514; SSE-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,1,1,1]515; SSE-NEXT: movd %xmm1, %ecx516; SSE-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,1,1]517; SSE-NEXT: movd %xmm0, %eax518; SSE-NEXT: cltd519; SSE-NEXT: idivl %ecx520; SSE-NEXT: movd %edx, %xmm0521; SSE-NEXT: punpckldq {{.*#+}} xmm2 = xmm2[0],xmm0[0],xmm2[1],xmm0[1]522; SSE-NEXT: punpcklqdq {{.*#+}} xmm2 = xmm2[0],xmm3[0]523; SSE-NEXT: movdqa %xmm2, (%rdi)524; SSE-NEXT: retq525;526; AVX1-LABEL: vp_srem_v4i32:527; AVX1: # %bb.0:528; AVX1-NEXT: vmovd %esi, %xmm2529; AVX1-NEXT: vpshufd {{.*#+}} xmm2 = xmm2[0,0,0,0]530; AVX1-NEXT: vpmovsxbd {{.*#+}} xmm3 = [0,1,2,3]531; AVX1-NEXT: vpmaxud %xmm3, %xmm2, %xmm2532; AVX1-NEXT: vpcmpeqd %xmm3, %xmm2, %xmm2533; AVX1-NEXT: vblendvps %xmm2, {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1534; AVX1-NEXT: vextractps $1, %xmm1, %ecx535; AVX1-NEXT: vpextrd $1, %xmm0, %eax536; AVX1-NEXT: cltd537; AVX1-NEXT: idivl %ecx538; AVX1-NEXT: movl %edx, %ecx539; AVX1-NEXT: vmovd %xmm1, %esi540; AVX1-NEXT: vmovd %xmm0, %eax541; AVX1-NEXT: cltd542; AVX1-NEXT: idivl %esi543; AVX1-NEXT: vmovd %edx, %xmm2544; AVX1-NEXT: vpinsrd $1, %ecx, %xmm2, %xmm2545; AVX1-NEXT: vpextrd $2, %xmm1, %ecx546; AVX1-NEXT: vpextrd $2, %xmm0, %eax547; AVX1-NEXT: cltd548; AVX1-NEXT: idivl %ecx549; AVX1-NEXT: vpinsrd $2, %edx, %xmm2, %xmm2550; AVX1-NEXT: vpextrd $3, %xmm1, %ecx551; AVX1-NEXT: vpextrd $3, %xmm0, %eax552; AVX1-NEXT: cltd553; AVX1-NEXT: idivl %ecx554; AVX1-NEXT: vpinsrd $3, %edx, %xmm2, %xmm0555; AVX1-NEXT: vmovdqa %xmm0, (%rdi)556; AVX1-NEXT: retq557;558; AVX2-LABEL: vp_srem_v4i32:559; AVX2: # %bb.0:560; AVX2-NEXT: vmovd %esi, %xmm2561; AVX2-NEXT: vpbroadcastd %xmm2, %xmm2562; AVX2-NEXT: vpmovsxbd {{.*#+}} xmm3 = [0,1,2,3]563; AVX2-NEXT: vpmaxud %xmm3, %xmm2, %xmm2564; AVX2-NEXT: vpcmpeqd %xmm3, %xmm2, %xmm2565; AVX2-NEXT: vbroadcastss {{.*#+}} xmm3 = [1,1,1,1]566; AVX2-NEXT: vblendvps %xmm2, %xmm3, %xmm1, %xmm1567; AVX2-NEXT: vextractps $1, %xmm1, %ecx568; AVX2-NEXT: vpextrd $1, %xmm0, %eax569; AVX2-NEXT: cltd570; AVX2-NEXT: idivl %ecx571; AVX2-NEXT: movl %edx, %ecx572; AVX2-NEXT: vmovd %xmm1, %esi573; AVX2-NEXT: vmovd %xmm0, %eax574; AVX2-NEXT: cltd575; AVX2-NEXT: idivl %esi576; AVX2-NEXT: vmovd %edx, %xmm2577; AVX2-NEXT: vpinsrd $1, %ecx, %xmm2, %xmm2578; AVX2-NEXT: vpextrd $2, %xmm1, %ecx579; AVX2-NEXT: vpextrd $2, %xmm0, %eax580; AVX2-NEXT: cltd581; AVX2-NEXT: idivl %ecx582; AVX2-NEXT: vpinsrd $2, %edx, %xmm2, %xmm2583; AVX2-NEXT: vpextrd $3, %xmm1, %ecx584; AVX2-NEXT: vpextrd $3, %xmm0, %eax585; AVX2-NEXT: cltd586; AVX2-NEXT: idivl %ecx587; AVX2-NEXT: vpinsrd $3, %edx, %xmm2, %xmm0588; AVX2-NEXT: vmovdqa %xmm0, (%rdi)589; AVX2-NEXT: retq590;591; AVX512-LABEL: vp_srem_v4i32:592; AVX512: # %bb.0:593; AVX512-NEXT: vpbroadcastd %esi, %xmm2594; AVX512-NEXT: vpcmpnleud {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2, %k1595; AVX512-NEXT: vpbroadcastd {{.*#+}} xmm2 = [1,1,1,1]596; AVX512-NEXT: vmovdqa32 %xmm1, %xmm2 {%k1}597; AVX512-NEXT: vpextrd $1, %xmm2, %ecx598; AVX512-NEXT: vpextrd $1, %xmm0, %eax599; AVX512-NEXT: cltd600; AVX512-NEXT: idivl %ecx601; AVX512-NEXT: movl %edx, %ecx602; AVX512-NEXT: vmovd %xmm2, %esi603; AVX512-NEXT: vmovd %xmm0, %eax604; AVX512-NEXT: cltd605; AVX512-NEXT: idivl %esi606; AVX512-NEXT: vmovd %edx, %xmm1607; AVX512-NEXT: vpinsrd $1, %ecx, %xmm1, %xmm1608; AVX512-NEXT: vpextrd $2, %xmm2, %ecx609; AVX512-NEXT: vpextrd $2, %xmm0, %eax610; AVX512-NEXT: cltd611; AVX512-NEXT: idivl %ecx612; AVX512-NEXT: vpinsrd $2, %edx, %xmm1, %xmm1613; AVX512-NEXT: vpextrd $3, %xmm2, %ecx614; AVX512-NEXT: vpextrd $3, %xmm0, %eax615; AVX512-NEXT: cltd616; AVX512-NEXT: idivl %ecx617; AVX512-NEXT: vpinsrd $3, %edx, %xmm1, %xmm0618; AVX512-NEXT: vmovdqa %xmm0, (%rdi)619; AVX512-NEXT: retq620 %res = call <4 x i32> @llvm.vp.srem.v4i32(<4 x i32> %a0, <4 x i32> %a1, <4 x i1> <i1 -1, i1 -1, i1 -1, i1 -1>, i32 %vp)621 store <4 x i32> %res, ptr %out622 ret void623}624declare <4 x i32> @llvm.vp.srem.v4i32(<4 x i32>, <4 x i32>, <4 x i1>, i32)625 626define void @vp_urem_v4i32(<4 x i32> %a0, <4 x i32> %a1, ptr %out, i32 %vp) nounwind {627; X86-LABEL: vp_urem_v4i32:628; X86: # %bb.0:629; X86-NEXT: pushl %edi630; X86-NEXT: pushl %esi631; X86-NEXT: movl {{[0-9]+}}(%esp), %esi632; X86-NEXT: vbroadcastss {{[0-9]+}}(%esp), %xmm2633; X86-NEXT: vpmovsxbd {{.*#+}} xmm3 = [0,1,2,3]634; X86-NEXT: vpmaxud %xmm3, %xmm2, %xmm2635; X86-NEXT: vpcmpeqd %xmm3, %xmm2, %xmm2636; X86-NEXT: vblendvps %xmm2, {{\.?LCPI[0-9]+_[0-9]+}}, %xmm1, %xmm1637; X86-NEXT: vextractps $1, %xmm1, %ecx638; X86-NEXT: vpextrd $1, %xmm0, %eax639; X86-NEXT: xorl %edx, %edx640; X86-NEXT: divl %ecx641; X86-NEXT: movl %edx, %ecx642; X86-NEXT: vmovd %xmm1, %edi643; X86-NEXT: vmovd %xmm0, %eax644; X86-NEXT: xorl %edx, %edx645; X86-NEXT: divl %edi646; X86-NEXT: vmovd %edx, %xmm2647; X86-NEXT: vpinsrd $1, %ecx, %xmm2, %xmm2648; X86-NEXT: vpextrd $2, %xmm1, %ecx649; X86-NEXT: vpextrd $2, %xmm0, %eax650; X86-NEXT: xorl %edx, %edx651; X86-NEXT: divl %ecx652; X86-NEXT: vpinsrd $2, %edx, %xmm2, %xmm2653; X86-NEXT: vpextrd $3, %xmm1, %ecx654; X86-NEXT: vpextrd $3, %xmm0, %eax655; X86-NEXT: xorl %edx, %edx656; X86-NEXT: divl %ecx657; X86-NEXT: vpinsrd $3, %edx, %xmm2, %xmm0658; X86-NEXT: vmovdqa %xmm0, (%esi)659; X86-NEXT: popl %esi660; X86-NEXT: popl %edi661; X86-NEXT: retl662;663; SSE-LABEL: vp_urem_v4i32:664; SSE: # %bb.0:665; SSE-NEXT: movd %esi, %xmm2666; SSE-NEXT: pshufd {{.*#+}} xmm2 = xmm2[0,0,0,0]667; SSE-NEXT: pxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2668; SSE-NEXT: pcmpgtd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2669; SSE-NEXT: pand %xmm2, %xmm1670; SSE-NEXT: paddd %xmm2, %xmm1671; SSE-NEXT: pcmpeqd %xmm2, %xmm2672; SSE-NEXT: psubd %xmm2, %xmm1673; SSE-NEXT: pshufd {{.*#+}} xmm2 = xmm1[3,3,3,3]674; SSE-NEXT: movd %xmm2, %ecx675; SSE-NEXT: pshufd {{.*#+}} xmm2 = xmm0[3,3,3,3]676; SSE-NEXT: movd %xmm2, %eax677; SSE-NEXT: xorl %edx, %edx678; SSE-NEXT: divl %ecx679; SSE-NEXT: movd %edx, %xmm2680; SSE-NEXT: pshufd {{.*#+}} xmm3 = xmm1[2,3,2,3]681; SSE-NEXT: movd %xmm3, %ecx682; SSE-NEXT: pshufd {{.*#+}} xmm3 = xmm0[2,3,2,3]683; SSE-NEXT: movd %xmm3, %eax684; SSE-NEXT: xorl %edx, %edx685; SSE-NEXT: divl %ecx686; SSE-NEXT: movd %edx, %xmm3687; SSE-NEXT: punpckldq {{.*#+}} xmm3 = xmm3[0],xmm2[0],xmm3[1],xmm2[1]688; SSE-NEXT: movd %xmm1, %ecx689; SSE-NEXT: movd %xmm0, %eax690; SSE-NEXT: xorl %edx, %edx691; SSE-NEXT: divl %ecx692; SSE-NEXT: movd %edx, %xmm2693; SSE-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,1,1,1]694; SSE-NEXT: movd %xmm1, %ecx695; SSE-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,1,1]696; SSE-NEXT: movd %xmm0, %eax697; SSE-NEXT: xorl %edx, %edx698; SSE-NEXT: divl %ecx699; SSE-NEXT: movd %edx, %xmm0700; SSE-NEXT: punpckldq {{.*#+}} xmm2 = xmm2[0],xmm0[0],xmm2[1],xmm0[1]701; SSE-NEXT: punpcklqdq {{.*#+}} xmm2 = xmm2[0],xmm3[0]702; SSE-NEXT: movdqa %xmm2, (%rdi)703; SSE-NEXT: retq704;705; AVX1-LABEL: vp_urem_v4i32:706; AVX1: # %bb.0:707; AVX1-NEXT: vmovd %esi, %xmm2708; AVX1-NEXT: vpshufd {{.*#+}} xmm2 = xmm2[0,0,0,0]709; AVX1-NEXT: vpmovsxbd {{.*#+}} xmm3 = [0,1,2,3]710; AVX1-NEXT: vpmaxud %xmm3, %xmm2, %xmm2711; AVX1-NEXT: vpcmpeqd %xmm3, %xmm2, %xmm2712; AVX1-NEXT: vblendvps %xmm2, {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1713; AVX1-NEXT: vextractps $1, %xmm1, %ecx714; AVX1-NEXT: vpextrd $1, %xmm0, %eax715; AVX1-NEXT: xorl %edx, %edx716; AVX1-NEXT: divl %ecx717; AVX1-NEXT: movl %edx, %ecx718; AVX1-NEXT: vmovd %xmm1, %esi719; AVX1-NEXT: vmovd %xmm0, %eax720; AVX1-NEXT: xorl %edx, %edx721; AVX1-NEXT: divl %esi722; AVX1-NEXT: vmovd %edx, %xmm2723; AVX1-NEXT: vpinsrd $1, %ecx, %xmm2, %xmm2724; AVX1-NEXT: vpextrd $2, %xmm1, %ecx725; AVX1-NEXT: vpextrd $2, %xmm0, %eax726; AVX1-NEXT: xorl %edx, %edx727; AVX1-NEXT: divl %ecx728; AVX1-NEXT: vpinsrd $2, %edx, %xmm2, %xmm2729; AVX1-NEXT: vpextrd $3, %xmm1, %ecx730; AVX1-NEXT: vpextrd $3, %xmm0, %eax731; AVX1-NEXT: xorl %edx, %edx732; AVX1-NEXT: divl %ecx733; AVX1-NEXT: vpinsrd $3, %edx, %xmm2, %xmm0734; AVX1-NEXT: vmovdqa %xmm0, (%rdi)735; AVX1-NEXT: retq736;737; AVX2-LABEL: vp_urem_v4i32:738; AVX2: # %bb.0:739; AVX2-NEXT: vmovd %esi, %xmm2740; AVX2-NEXT: vpbroadcastd %xmm2, %xmm2741; AVX2-NEXT: vpmovsxbd {{.*#+}} xmm3 = [0,1,2,3]742; AVX2-NEXT: vpmaxud %xmm3, %xmm2, %xmm2743; AVX2-NEXT: vpcmpeqd %xmm3, %xmm2, %xmm2744; AVX2-NEXT: vbroadcastss {{.*#+}} xmm3 = [1,1,1,1]745; AVX2-NEXT: vblendvps %xmm2, %xmm3, %xmm1, %xmm1746; AVX2-NEXT: vextractps $1, %xmm1, %ecx747; AVX2-NEXT: vpextrd $1, %xmm0, %eax748; AVX2-NEXT: xorl %edx, %edx749; AVX2-NEXT: divl %ecx750; AVX2-NEXT: movl %edx, %ecx751; AVX2-NEXT: vmovd %xmm1, %esi752; AVX2-NEXT: vmovd %xmm0, %eax753; AVX2-NEXT: xorl %edx, %edx754; AVX2-NEXT: divl %esi755; AVX2-NEXT: vmovd %edx, %xmm2756; AVX2-NEXT: vpinsrd $1, %ecx, %xmm2, %xmm2757; AVX2-NEXT: vpextrd $2, %xmm1, %ecx758; AVX2-NEXT: vpextrd $2, %xmm0, %eax759; AVX2-NEXT: xorl %edx, %edx760; AVX2-NEXT: divl %ecx761; AVX2-NEXT: vpinsrd $2, %edx, %xmm2, %xmm2762; AVX2-NEXT: vpextrd $3, %xmm1, %ecx763; AVX2-NEXT: vpextrd $3, %xmm0, %eax764; AVX2-NEXT: xorl %edx, %edx765; AVX2-NEXT: divl %ecx766; AVX2-NEXT: vpinsrd $3, %edx, %xmm2, %xmm0767; AVX2-NEXT: vmovdqa %xmm0, (%rdi)768; AVX2-NEXT: retq769;770; AVX512-LABEL: vp_urem_v4i32:771; AVX512: # %bb.0:772; AVX512-NEXT: vpbroadcastd %esi, %xmm2773; AVX512-NEXT: vpcmpnleud {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2, %k1774; AVX512-NEXT: vpbroadcastd {{.*#+}} xmm2 = [1,1,1,1]775; AVX512-NEXT: vmovdqa32 %xmm1, %xmm2 {%k1}776; AVX512-NEXT: vpextrd $1, %xmm2, %ecx777; AVX512-NEXT: vpextrd $1, %xmm0, %eax778; AVX512-NEXT: xorl %edx, %edx779; AVX512-NEXT: divl %ecx780; AVX512-NEXT: movl %edx, %ecx781; AVX512-NEXT: vmovd %xmm2, %esi782; AVX512-NEXT: vmovd %xmm0, %eax783; AVX512-NEXT: xorl %edx, %edx784; AVX512-NEXT: divl %esi785; AVX512-NEXT: vmovd %edx, %xmm1786; AVX512-NEXT: vpinsrd $1, %ecx, %xmm1, %xmm1787; AVX512-NEXT: vpextrd $2, %xmm2, %ecx788; AVX512-NEXT: vpextrd $2, %xmm0, %eax789; AVX512-NEXT: xorl %edx, %edx790; AVX512-NEXT: divl %ecx791; AVX512-NEXT: vpinsrd $2, %edx, %xmm1, %xmm1792; AVX512-NEXT: vpextrd $3, %xmm2, %ecx793; AVX512-NEXT: vpextrd $3, %xmm0, %eax794; AVX512-NEXT: xorl %edx, %edx795; AVX512-NEXT: divl %ecx796; AVX512-NEXT: vpinsrd $3, %edx, %xmm1, %xmm0797; AVX512-NEXT: vmovdqa %xmm0, (%rdi)798; AVX512-NEXT: retq799 %res = call <4 x i32> @llvm.vp.urem.v4i32(<4 x i32> %a0, <4 x i32> %a1, <4 x i1> <i1 -1, i1 -1, i1 -1, i1 -1>, i32 %vp)800 store <4 x i32> %res, ptr %out801 ret void802}803declare <4 x i32> @llvm.vp.urem.v4i32(<4 x i32>, <4 x i32>, <4 x i1>, i32)804 805define void @vp_ashr_v4i32(<4 x i32> %a0, <4 x i32> %a1, ptr %out, i32 %vp) nounwind {806; X86-LABEL: vp_ashr_v4i32:807; X86: # %bb.0:808; X86-NEXT: movl {{[0-9]+}}(%esp), %eax809; X86-NEXT: vpsrldq {{.*#+}} xmm2 = xmm1[12,13,14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero810; X86-NEXT: vpsrad %xmm2, %xmm0, %xmm2811; X86-NEXT: vpsrlq $32, %xmm1, %xmm3812; X86-NEXT: vpsrad %xmm3, %xmm0, %xmm3813; X86-NEXT: vpblendw {{.*#+}} xmm2 = xmm3[0,1,2,3],xmm2[4,5,6,7]814; X86-NEXT: vpxor %xmm3, %xmm3, %xmm3815; X86-NEXT: vpunpckhdq {{.*#+}} xmm3 = xmm1[2],xmm3[2],xmm1[3],xmm3[3]816; X86-NEXT: vpsrad %xmm3, %xmm0, %xmm3817; X86-NEXT: vpmovzxdq {{.*#+}} xmm1 = xmm1[0],zero,xmm1[1],zero818; X86-NEXT: vpsrad %xmm1, %xmm0, %xmm0819; X86-NEXT: vpblendw {{.*#+}} xmm0 = xmm0[0,1,2,3],xmm3[4,5,6,7]820; X86-NEXT: vpblendw {{.*#+}} xmm0 = xmm0[0,1],xmm2[2,3],xmm0[4,5],xmm2[6,7]821; X86-NEXT: vmovdqa %xmm0, (%eax)822; X86-NEXT: retl823;824; SSE-LABEL: vp_ashr_v4i32:825; SSE: # %bb.0:826; SSE-NEXT: pshuflw {{.*#+}} xmm2 = xmm1[2,3,3,3,4,5,6,7]827; SSE-NEXT: movdqa %xmm0, %xmm3828; SSE-NEXT: psrad %xmm2, %xmm3829; SSE-NEXT: pshuflw {{.*#+}} xmm2 = xmm1[0,1,1,1,4,5,6,7]830; SSE-NEXT: movdqa %xmm0, %xmm4831; SSE-NEXT: psrad %xmm2, %xmm4832; SSE-NEXT: punpcklqdq {{.*#+}} xmm4 = xmm4[0],xmm3[0]833; SSE-NEXT: pshufd {{.*#+}} xmm1 = xmm1[2,3,2,3]834; SSE-NEXT: pshuflw {{.*#+}} xmm2 = xmm1[2,3,3,3,4,5,6,7]835; SSE-NEXT: movdqa %xmm0, %xmm3836; SSE-NEXT: psrad %xmm2, %xmm3837; SSE-NEXT: pshuflw {{.*#+}} xmm1 = xmm1[0,1,1,1,4,5,6,7]838; SSE-NEXT: psrad %xmm1, %xmm0839; SSE-NEXT: punpckhqdq {{.*#+}} xmm0 = xmm0[1],xmm3[1]840; SSE-NEXT: shufps {{.*#+}} xmm4 = xmm4[0,3],xmm0[0,3]841; SSE-NEXT: movaps %xmm4, (%rdi)842; SSE-NEXT: retq843;844; AVX1-LABEL: vp_ashr_v4i32:845; AVX1: # %bb.0:846; AVX1-NEXT: vpsrldq {{.*#+}} xmm2 = xmm1[12,13,14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero847; AVX1-NEXT: vpsrad %xmm2, %xmm0, %xmm2848; AVX1-NEXT: vpsrlq $32, %xmm1, %xmm3849; AVX1-NEXT: vpsrad %xmm3, %xmm0, %xmm3850; AVX1-NEXT: vpblendw {{.*#+}} xmm2 = xmm3[0,1,2,3],xmm2[4,5,6,7]851; AVX1-NEXT: vpxor %xmm3, %xmm3, %xmm3852; AVX1-NEXT: vpunpckhdq {{.*#+}} xmm3 = xmm1[2],xmm3[2],xmm1[3],xmm3[3]853; AVX1-NEXT: vpsrad %xmm3, %xmm0, %xmm3854; AVX1-NEXT: vpmovzxdq {{.*#+}} xmm1 = xmm1[0],zero,xmm1[1],zero855; AVX1-NEXT: vpsrad %xmm1, %xmm0, %xmm0856; AVX1-NEXT: vpblendw {{.*#+}} xmm0 = xmm0[0,1,2,3],xmm3[4,5,6,7]857; AVX1-NEXT: vpblendw {{.*#+}} xmm0 = xmm0[0,1],xmm2[2,3],xmm0[4,5],xmm2[6,7]858; AVX1-NEXT: vmovdqa %xmm0, (%rdi)859; AVX1-NEXT: retq860;861; AVX2-LABEL: vp_ashr_v4i32:862; AVX2: # %bb.0:863; AVX2-NEXT: vpsravd %xmm1, %xmm0, %xmm0864; AVX2-NEXT: vmovdqa %xmm0, (%rdi)865; AVX2-NEXT: retq866;867; AVX512-LABEL: vp_ashr_v4i32:868; AVX512: # %bb.0:869; AVX512-NEXT: vpsravd %xmm1, %xmm0, %xmm0870; AVX512-NEXT: vmovdqa %xmm0, (%rdi)871; AVX512-NEXT: retq872 %res = call <4 x i32> @llvm.vp.ashr.v4i32(<4 x i32> %a0, <4 x i32> %a1, <4 x i1> <i1 -1, i1 -1, i1 -1, i1 -1>, i32 %vp)873 store <4 x i32> %res, ptr %out874 ret void875}876declare <4 x i32> @llvm.vp.ashr.v4i32(<4 x i32>, <4 x i32>, <4 x i1>, i32)877 878define void @vp_lshr_v4i32(<4 x i32> %a0, <4 x i32> %a1, ptr %out, i32 %vp) nounwind {879; X86-LABEL: vp_lshr_v4i32:880; X86: # %bb.0:881; X86-NEXT: movl {{[0-9]+}}(%esp), %eax882; X86-NEXT: vpsrldq {{.*#+}} xmm2 = xmm1[12,13,14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero883; X86-NEXT: vpsrld %xmm2, %xmm0, %xmm2884; X86-NEXT: vpsrlq $32, %xmm1, %xmm3885; X86-NEXT: vpsrld %xmm3, %xmm0, %xmm3886; X86-NEXT: vpblendw {{.*#+}} xmm2 = xmm3[0,1,2,3],xmm2[4,5,6,7]887; X86-NEXT: vpxor %xmm3, %xmm3, %xmm3888; X86-NEXT: vpunpckhdq {{.*#+}} xmm3 = xmm1[2],xmm3[2],xmm1[3],xmm3[3]889; X86-NEXT: vpsrld %xmm3, %xmm0, %xmm3890; X86-NEXT: vpmovzxdq {{.*#+}} xmm1 = xmm1[0],zero,xmm1[1],zero891; X86-NEXT: vpsrld %xmm1, %xmm0, %xmm0892; X86-NEXT: vpblendw {{.*#+}} xmm0 = xmm0[0,1,2,3],xmm3[4,5,6,7]893; X86-NEXT: vpblendw {{.*#+}} xmm0 = xmm0[0,1],xmm2[2,3],xmm0[4,5],xmm2[6,7]894; X86-NEXT: vmovdqa %xmm0, (%eax)895; X86-NEXT: retl896;897; SSE-LABEL: vp_lshr_v4i32:898; SSE: # %bb.0:899; SSE-NEXT: pshuflw {{.*#+}} xmm2 = xmm1[2,3,3,3,4,5,6,7]900; SSE-NEXT: movdqa %xmm0, %xmm3901; SSE-NEXT: psrld %xmm2, %xmm3902; SSE-NEXT: pshuflw {{.*#+}} xmm2 = xmm1[0,1,1,1,4,5,6,7]903; SSE-NEXT: movdqa %xmm0, %xmm4904; SSE-NEXT: psrld %xmm2, %xmm4905; SSE-NEXT: punpcklqdq {{.*#+}} xmm4 = xmm4[0],xmm3[0]906; SSE-NEXT: pshufd {{.*#+}} xmm1 = xmm1[2,3,2,3]907; SSE-NEXT: pshuflw {{.*#+}} xmm2 = xmm1[2,3,3,3,4,5,6,7]908; SSE-NEXT: movdqa %xmm0, %xmm3909; SSE-NEXT: psrld %xmm2, %xmm3910; SSE-NEXT: pshuflw {{.*#+}} xmm1 = xmm1[0,1,1,1,4,5,6,7]911; SSE-NEXT: psrld %xmm1, %xmm0912; SSE-NEXT: punpckhqdq {{.*#+}} xmm0 = xmm0[1],xmm3[1]913; SSE-NEXT: shufps {{.*#+}} xmm4 = xmm4[0,3],xmm0[0,3]914; SSE-NEXT: movaps %xmm4, (%rdi)915; SSE-NEXT: retq916;917; AVX1-LABEL: vp_lshr_v4i32:918; AVX1: # %bb.0:919; AVX1-NEXT: vpsrldq {{.*#+}} xmm2 = xmm1[12,13,14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero920; AVX1-NEXT: vpsrld %xmm2, %xmm0, %xmm2921; AVX1-NEXT: vpsrlq $32, %xmm1, %xmm3922; AVX1-NEXT: vpsrld %xmm3, %xmm0, %xmm3923; AVX1-NEXT: vpblendw {{.*#+}} xmm2 = xmm3[0,1,2,3],xmm2[4,5,6,7]924; AVX1-NEXT: vpxor %xmm3, %xmm3, %xmm3925; AVX1-NEXT: vpunpckhdq {{.*#+}} xmm3 = xmm1[2],xmm3[2],xmm1[3],xmm3[3]926; AVX1-NEXT: vpsrld %xmm3, %xmm0, %xmm3927; AVX1-NEXT: vpmovzxdq {{.*#+}} xmm1 = xmm1[0],zero,xmm1[1],zero928; AVX1-NEXT: vpsrld %xmm1, %xmm0, %xmm0929; AVX1-NEXT: vpblendw {{.*#+}} xmm0 = xmm0[0,1,2,3],xmm3[4,5,6,7]930; AVX1-NEXT: vpblendw {{.*#+}} xmm0 = xmm0[0,1],xmm2[2,3],xmm0[4,5],xmm2[6,7]931; AVX1-NEXT: vmovdqa %xmm0, (%rdi)932; AVX1-NEXT: retq933;934; AVX2-LABEL: vp_lshr_v4i32:935; AVX2: # %bb.0:936; AVX2-NEXT: vpsrlvd %xmm1, %xmm0, %xmm0937; AVX2-NEXT: vmovdqa %xmm0, (%rdi)938; AVX2-NEXT: retq939;940; AVX512-LABEL: vp_lshr_v4i32:941; AVX512: # %bb.0:942; AVX512-NEXT: vpsrlvd %xmm1, %xmm0, %xmm0943; AVX512-NEXT: vmovdqa %xmm0, (%rdi)944; AVX512-NEXT: retq945 %res = call <4 x i32> @llvm.vp.lshr.v4i32(<4 x i32> %a0, <4 x i32> %a1, <4 x i1> <i1 -1, i1 -1, i1 -1, i1 -1>, i32 %vp)946 store <4 x i32> %res, ptr %out947 ret void948}949declare <4 x i32> @llvm.vp.lshr.v4i32(<4 x i32>, <4 x i32>, <4 x i1>, i32)950 951define void @vp_shl_v4i32(<4 x i32> %a0, <4 x i32> %a1, ptr %out, i32 %vp) nounwind {952; X86-LABEL: vp_shl_v4i32:953; X86: # %bb.0:954; X86-NEXT: movl {{[0-9]+}}(%esp), %eax955; X86-NEXT: vpslld $23, %xmm1, %xmm1956; X86-NEXT: vpaddd {{\.?LCPI[0-9]+_[0-9]+}}, %xmm1, %xmm1957; X86-NEXT: vcvttps2dq %xmm1, %xmm1958; X86-NEXT: vpmulld %xmm1, %xmm0, %xmm0959; X86-NEXT: vmovdqa %xmm0, (%eax)960; X86-NEXT: retl961;962; SSE-LABEL: vp_shl_v4i32:963; SSE: # %bb.0:964; SSE-NEXT: pslld $23, %xmm1965; SSE-NEXT: paddd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1966; SSE-NEXT: cvttps2dq %xmm1, %xmm1967; SSE-NEXT: pshufd {{.*#+}} xmm2 = xmm0[1,1,3,3]968; SSE-NEXT: pmuludq %xmm1, %xmm0969; SSE-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]970; SSE-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]971; SSE-NEXT: pmuludq %xmm2, %xmm1972; SSE-NEXT: pshufd {{.*#+}} xmm1 = xmm1[0,2,2,3]973; SSE-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]974; SSE-NEXT: movdqa %xmm0, (%rdi)975; SSE-NEXT: retq976;977; AVX1-LABEL: vp_shl_v4i32:978; AVX1: # %bb.0:979; AVX1-NEXT: vpslld $23, %xmm1, %xmm1980; AVX1-NEXT: vpaddd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1981; AVX1-NEXT: vcvttps2dq %xmm1, %xmm1982; AVX1-NEXT: vpmulld %xmm1, %xmm0, %xmm0983; AVX1-NEXT: vmovdqa %xmm0, (%rdi)984; AVX1-NEXT: retq985;986; AVX2-LABEL: vp_shl_v4i32:987; AVX2: # %bb.0:988; AVX2-NEXT: vpsllvd %xmm1, %xmm0, %xmm0989; AVX2-NEXT: vmovdqa %xmm0, (%rdi)990; AVX2-NEXT: retq991;992; AVX512-LABEL: vp_shl_v4i32:993; AVX512: # %bb.0:994; AVX512-NEXT: vpsllvd %xmm1, %xmm0, %xmm0995; AVX512-NEXT: vmovdqa %xmm0, (%rdi)996; AVX512-NEXT: retq997 %res = call <4 x i32> @llvm.vp.shl.v4i32(<4 x i32> %a0, <4 x i32> %a1, <4 x i1> <i1 -1, i1 -1, i1 -1, i1 -1>, i32 %vp)998 store <4 x i32> %res, ptr %out999 ret void1000}1001declare <4 x i32> @llvm.vp.shl.v4i32(<4 x i32>, <4 x i32>, <4 x i1>, i32)1002 1003define void @vp_or_v4i32(<4 x i32> %a0, <4 x i32> %a1, ptr %out, i32 %vp) nounwind {1004; X86-LABEL: vp_or_v4i32:1005; X86: # %bb.0:1006; X86-NEXT: movl {{[0-9]+}}(%esp), %eax1007; X86-NEXT: vorps %xmm1, %xmm0, %xmm01008; X86-NEXT: vmovaps %xmm0, (%eax)1009; X86-NEXT: retl1010;1011; SSE-LABEL: vp_or_v4i32:1012; SSE: # %bb.0:1013; SSE-NEXT: orps %xmm1, %xmm01014; SSE-NEXT: movaps %xmm0, (%rdi)1015; SSE-NEXT: retq1016;1017; AVX-LABEL: vp_or_v4i32:1018; AVX: # %bb.0:1019; AVX-NEXT: vorps %xmm1, %xmm0, %xmm01020; AVX-NEXT: vmovaps %xmm0, (%rdi)1021; AVX-NEXT: retq1022 %res = call <4 x i32> @llvm.vp.or.v4i32(<4 x i32> %a0, <4 x i32> %a1, <4 x i1> <i1 -1, i1 -1, i1 -1, i1 -1>, i32 %vp)1023 store <4 x i32> %res, ptr %out1024 ret void1025}1026declare <4 x i32> @llvm.vp.or.v4i32(<4 x i32>, <4 x i32>, <4 x i1>, i32)1027 1028define void @vp_and_v4i32(<4 x i32> %a0, <4 x i32> %a1, ptr %out, i32 %vp) nounwind {1029; X86-LABEL: vp_and_v4i32:1030; X86: # %bb.0:1031; X86-NEXT: movl {{[0-9]+}}(%esp), %eax1032; X86-NEXT: vorps %xmm1, %xmm0, %xmm01033; X86-NEXT: vmovaps %xmm0, (%eax)1034; X86-NEXT: retl1035;1036; SSE-LABEL: vp_and_v4i32:1037; SSE: # %bb.0:1038; SSE-NEXT: orps %xmm1, %xmm01039; SSE-NEXT: movaps %xmm0, (%rdi)1040; SSE-NEXT: retq1041;1042; AVX-LABEL: vp_and_v4i32:1043; AVX: # %bb.0:1044; AVX-NEXT: vorps %xmm1, %xmm0, %xmm01045; AVX-NEXT: vmovaps %xmm0, (%rdi)1046; AVX-NEXT: retq1047 %res = call <4 x i32> @llvm.vp.or.v4i32(<4 x i32> %a0, <4 x i32> %a1, <4 x i1> <i1 -1, i1 -1, i1 -1, i1 -1>, i32 %vp)1048 store <4 x i32> %res, ptr %out1049 ret void1050}1051declare <4 x i32> @llvm.vp.and.v4i32(<4 x i32>, <4 x i32>, <4 x i1>, i32)1052 1053define void @vp_xor_v4i32(<4 x i32> %a0, <4 x i32> %a1, ptr %out, i32 %vp) nounwind {1054; X86-LABEL: vp_xor_v4i32:1055; X86: # %bb.0:1056; X86-NEXT: movl {{[0-9]+}}(%esp), %eax1057; X86-NEXT: vxorps %xmm1, %xmm0, %xmm01058; X86-NEXT: vmovaps %xmm0, (%eax)1059; X86-NEXT: retl1060;1061; SSE-LABEL: vp_xor_v4i32:1062; SSE: # %bb.0:1063; SSE-NEXT: xorps %xmm1, %xmm01064; SSE-NEXT: movaps %xmm0, (%rdi)1065; SSE-NEXT: retq1066;1067; AVX-LABEL: vp_xor_v4i32:1068; AVX: # %bb.0:1069; AVX-NEXT: vxorps %xmm1, %xmm0, %xmm01070; AVX-NEXT: vmovaps %xmm0, (%rdi)1071; AVX-NEXT: retq1072 %res = call <4 x i32> @llvm.vp.xor.v4i32(<4 x i32> %a0, <4 x i32> %a1, <4 x i1> <i1 -1, i1 -1, i1 -1, i1 -1>, i32 %vp)1073 store <4 x i32> %res, ptr %out1074 ret void1075}1076declare <4 x i32> @llvm.vp.xor.v4i32(<4 x i32>, <4 x i32>, <4 x i1>, i32)1077 1078define void @vp_abs_v4i32(<4 x i32> %a0, ptr %out, i32 %vp) nounwind {1079; X86-LABEL: vp_abs_v4i32:1080; X86: # %bb.0:1081; X86-NEXT: movl {{[0-9]+}}(%esp), %eax1082; X86-NEXT: vpabsd %xmm0, %xmm01083; X86-NEXT: vmovdqa %xmm0, (%eax)1084; X86-NEXT: retl1085;1086; SSE-LABEL: vp_abs_v4i32:1087; SSE: # %bb.0:1088; SSE-NEXT: movdqa %xmm0, %xmm11089; SSE-NEXT: psrad $31, %xmm11090; SSE-NEXT: pxor %xmm1, %xmm01091; SSE-NEXT: psubd %xmm1, %xmm01092; SSE-NEXT: movdqa %xmm0, (%rdi)1093; SSE-NEXT: retq1094;1095; AVX-LABEL: vp_abs_v4i32:1096; AVX: # %bb.0:1097; AVX-NEXT: vpabsd %xmm0, %xmm01098; AVX-NEXT: vmovdqa %xmm0, (%rdi)1099; AVX-NEXT: retq1100 %res = call <4 x i32> @llvm.vp.abs.v4i32(<4 x i32> %a0, i1 false, <4 x i1> <i1 -1, i1 -1, i1 -1, i1 -1>, i32 %vp)1101 store <4 x i32> %res, ptr %out1102 ret void1103}1104declare <4 x i32> @llvm.vp.abs.v4i32(<4 x i32>, i1 immarg, <4 x i1>, i32)1105 1106define void @vp_smax_v4i32(<4 x i32> %a0, <4 x i32> %a1, ptr %out, i32 %vp) nounwind {1107; X86-LABEL: vp_smax_v4i32:1108; X86: # %bb.0:1109; X86-NEXT: movl {{[0-9]+}}(%esp), %eax1110; X86-NEXT: vpmaxsd %xmm1, %xmm0, %xmm01111; X86-NEXT: vmovdqa %xmm0, (%eax)1112; X86-NEXT: retl1113;1114; SSE-LABEL: vp_smax_v4i32:1115; SSE: # %bb.0:1116; SSE-NEXT: movdqa %xmm0, %xmm21117; SSE-NEXT: pcmpgtd %xmm1, %xmm21118; SSE-NEXT: pand %xmm2, %xmm01119; SSE-NEXT: pandn %xmm1, %xmm21120; SSE-NEXT: por %xmm0, %xmm21121; SSE-NEXT: movdqa %xmm2, (%rdi)1122; SSE-NEXT: retq1123;1124; AVX-LABEL: vp_smax_v4i32:1125; AVX: # %bb.0:1126; AVX-NEXT: vpmaxsd %xmm1, %xmm0, %xmm01127; AVX-NEXT: vmovdqa %xmm0, (%rdi)1128; AVX-NEXT: retq1129 %res = call <4 x i32> @llvm.vp.smax.v4i32(<4 x i32> %a0, <4 x i32> %a1, <4 x i1> <i1 -1, i1 -1, i1 -1, i1 -1>, i32 %vp)1130 store <4 x i32> %res, ptr %out1131 ret void1132}1133declare <4 x i32> @llvm.vp.smax.v4i32(<4 x i32>, <4 x i32>, <4 x i1>, i32)1134 1135define void @vp_smin_v4i32(<4 x i32> %a0, <4 x i32> %a1, ptr %out, i32 %vp) nounwind {1136; X86-LABEL: vp_smin_v4i32:1137; X86: # %bb.0:1138; X86-NEXT: movl {{[0-9]+}}(%esp), %eax1139; X86-NEXT: vpminsd %xmm1, %xmm0, %xmm01140; X86-NEXT: vmovdqa %xmm0, (%eax)1141; X86-NEXT: retl1142;1143; SSE-LABEL: vp_smin_v4i32:1144; SSE: # %bb.0:1145; SSE-NEXT: movdqa %xmm1, %xmm21146; SSE-NEXT: pcmpgtd %xmm0, %xmm21147; SSE-NEXT: pand %xmm2, %xmm01148; SSE-NEXT: pandn %xmm1, %xmm21149; SSE-NEXT: por %xmm0, %xmm21150; SSE-NEXT: movdqa %xmm2, (%rdi)1151; SSE-NEXT: retq1152;1153; AVX-LABEL: vp_smin_v4i32:1154; AVX: # %bb.0:1155; AVX-NEXT: vpminsd %xmm1, %xmm0, %xmm01156; AVX-NEXT: vmovdqa %xmm0, (%rdi)1157; AVX-NEXT: retq1158 %res = call <4 x i32> @llvm.vp.smin.v4i32(<4 x i32> %a0, <4 x i32> %a1, <4 x i1> <i1 -1, i1 -1, i1 -1, i1 -1>, i32 %vp)1159 store <4 x i32> %res, ptr %out1160 ret void1161}1162declare <4 x i32> @llvm.vp.smin.v4i32(<4 x i32>, <4 x i32>, <4 x i1>, i32)1163 1164define void @vp_umax_v4i32(<4 x i32> %a0, <4 x i32> %a1, ptr %out, i32 %vp) nounwind {1165; X86-LABEL: vp_umax_v4i32:1166; X86: # %bb.0:1167; X86-NEXT: movl {{[0-9]+}}(%esp), %eax1168; X86-NEXT: vpmaxud %xmm1, %xmm0, %xmm01169; X86-NEXT: vmovdqa %xmm0, (%eax)1170; X86-NEXT: retl1171;1172; SSE-LABEL: vp_umax_v4i32:1173; SSE: # %bb.0:1174; SSE-NEXT: movdqa {{.*#+}} xmm2 = [2147483648,2147483648,2147483648,2147483648]1175; SSE-NEXT: movdqa %xmm1, %xmm31176; SSE-NEXT: pxor %xmm2, %xmm31177; SSE-NEXT: pxor %xmm0, %xmm21178; SSE-NEXT: pcmpgtd %xmm3, %xmm21179; SSE-NEXT: pand %xmm2, %xmm01180; SSE-NEXT: pandn %xmm1, %xmm21181; SSE-NEXT: por %xmm0, %xmm21182; SSE-NEXT: movdqa %xmm2, (%rdi)1183; SSE-NEXT: retq1184;1185; AVX-LABEL: vp_umax_v4i32:1186; AVX: # %bb.0:1187; AVX-NEXT: vpmaxud %xmm1, %xmm0, %xmm01188; AVX-NEXT: vmovdqa %xmm0, (%rdi)1189; AVX-NEXT: retq1190 %res = call <4 x i32> @llvm.vp.umax.v4i32(<4 x i32> %a0, <4 x i32> %a1, <4 x i1> <i1 -1, i1 -1, i1 -1, i1 -1>, i32 %vp)1191 store <4 x i32> %res, ptr %out1192 ret void1193}1194declare <4 x i32> @llvm.vp.umax.v4i32(<4 x i32>, <4 x i32>, <4 x i1>, i32)1195 1196define void @vp_umin_v4i32(<4 x i32> %a0, <4 x i32> %a1, ptr %out, i32 %vp) nounwind {1197; X86-LABEL: vp_umin_v4i32:1198; X86: # %bb.0:1199; X86-NEXT: movl {{[0-9]+}}(%esp), %eax1200; X86-NEXT: vpminud %xmm1, %xmm0, %xmm01201; X86-NEXT: vmovdqa %xmm0, (%eax)1202; X86-NEXT: retl1203;1204; SSE-LABEL: vp_umin_v4i32:1205; SSE: # %bb.0:1206; SSE-NEXT: movdqa {{.*#+}} xmm2 = [2147483648,2147483648,2147483648,2147483648]1207; SSE-NEXT: movdqa %xmm0, %xmm31208; SSE-NEXT: pxor %xmm2, %xmm31209; SSE-NEXT: pxor %xmm1, %xmm21210; SSE-NEXT: pcmpgtd %xmm3, %xmm21211; SSE-NEXT: pand %xmm2, %xmm01212; SSE-NEXT: pandn %xmm1, %xmm21213; SSE-NEXT: por %xmm0, %xmm21214; SSE-NEXT: movdqa %xmm2, (%rdi)1215; SSE-NEXT: retq1216;1217; AVX-LABEL: vp_umin_v4i32:1218; AVX: # %bb.0:1219; AVX-NEXT: vpminud %xmm1, %xmm0, %xmm01220; AVX-NEXT: vmovdqa %xmm0, (%rdi)1221; AVX-NEXT: retq1222 %res = call <4 x i32> @llvm.vp.umin.v4i32(<4 x i32> %a0, <4 x i32> %a1, <4 x i1> <i1 -1, i1 -1, i1 -1, i1 -1>, i32 %vp)1223 store <4 x i32> %res, ptr %out1224 ret void1225}1226declare <4 x i32> @llvm.vp.umin.v4i32(<4 x i32>, <4 x i32>, <4 x i1>, i32)1227 1228define <4 x i32> @vp_bitreverse_v4i32(<4 x i32> %va, <4 x i1> %m, i32 zeroext %evl) {1229; X86-LABEL: vp_bitreverse_v4i32:1230; X86: # %bb.0:1231; X86-NEXT: vpshufb {{.*#+}} xmm0 = xmm0[3,2,1,0,7,6,5,4,11,10,9,8,15,14,13,12]1232; X86-NEXT: vbroadcastss {{.*#+}} xmm1 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]1233; X86-NEXT: vpand %xmm1, %xmm0, %xmm21234; X86-NEXT: vmovdqa {{.*#+}} xmm3 = [0,128,64,192,32,160,96,224,16,144,80,208,48,176,112,240]1235; X86-NEXT: vpshufb %xmm2, %xmm3, %xmm21236; X86-NEXT: vpsrlw $4, %xmm0, %xmm01237; X86-NEXT: vpand %xmm1, %xmm0, %xmm01238; X86-NEXT: vmovdqa {{.*#+}} xmm1 = [0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15]1239; X86-NEXT: vpshufb %xmm0, %xmm1, %xmm01240; X86-NEXT: vpor %xmm0, %xmm2, %xmm01241; X86-NEXT: retl1242;1243; SSE-LABEL: vp_bitreverse_v4i32:1244; SSE: # %bb.0:1245; SSE-NEXT: pxor %xmm1, %xmm11246; SSE-NEXT: movdqa %xmm0, %xmm21247; SSE-NEXT: punpckhbw {{.*#+}} xmm2 = xmm2[8],xmm1[8],xmm2[9],xmm1[9],xmm2[10],xmm1[10],xmm2[11],xmm1[11],xmm2[12],xmm1[12],xmm2[13],xmm1[13],xmm2[14],xmm1[14],xmm2[15],xmm1[15]1248; SSE-NEXT: pshuflw {{.*#+}} xmm2 = xmm2[3,2,1,0,4,5,6,7]1249; SSE-NEXT: pshufhw {{.*#+}} xmm2 = xmm2[0,1,2,3,7,6,5,4]1250; SSE-NEXT: punpcklbw {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3],xmm0[4],xmm1[4],xmm0[5],xmm1[5],xmm0[6],xmm1[6],xmm0[7],xmm1[7]1251; SSE-NEXT: pshuflw {{.*#+}} xmm0 = xmm0[3,2,1,0,4,5,6,7]1252; SSE-NEXT: pshufhw {{.*#+}} xmm0 = xmm0[0,1,2,3,7,6,5,4]1253; SSE-NEXT: packuswb %xmm2, %xmm01254; SSE-NEXT: movdqa %xmm0, %xmm11255; SSE-NEXT: psrlw $4, %xmm11256; SSE-NEXT: movdqa {{.*#+}} xmm2 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]1257; SSE-NEXT: pand %xmm2, %xmm11258; SSE-NEXT: pand %xmm2, %xmm01259; SSE-NEXT: psllw $4, %xmm01260; SSE-NEXT: por %xmm1, %xmm01261; SSE-NEXT: movdqa %xmm0, %xmm11262; SSE-NEXT: psrlw $2, %xmm11263; SSE-NEXT: movdqa {{.*#+}} xmm2 = [51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51]1264; SSE-NEXT: pand %xmm2, %xmm11265; SSE-NEXT: pand %xmm2, %xmm01266; SSE-NEXT: psllw $2, %xmm01267; SSE-NEXT: por %xmm1, %xmm01268; SSE-NEXT: movdqa %xmm0, %xmm11269; SSE-NEXT: psrlw $1, %xmm11270; SSE-NEXT: movdqa {{.*#+}} xmm2 = [85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85]1271; SSE-NEXT: pand %xmm2, %xmm11272; SSE-NEXT: pand %xmm2, %xmm01273; SSE-NEXT: paddb %xmm0, %xmm01274; SSE-NEXT: por %xmm1, %xmm01275; SSE-NEXT: retq1276;1277; AVX1-LABEL: vp_bitreverse_v4i32:1278; AVX1: # %bb.0:1279; AVX1-NEXT: vpshufb {{.*#+}} xmm0 = xmm0[3,2,1,0,7,6,5,4,11,10,9,8,15,14,13,12]1280; AVX1-NEXT: vbroadcastss {{.*#+}} xmm1 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]1281; AVX1-NEXT: vpand %xmm1, %xmm0, %xmm21282; AVX1-NEXT: vmovdqa {{.*#+}} xmm3 = [0,128,64,192,32,160,96,224,16,144,80,208,48,176,112,240]1283; AVX1-NEXT: vpshufb %xmm2, %xmm3, %xmm21284; AVX1-NEXT: vpsrlw $4, %xmm0, %xmm01285; AVX1-NEXT: vpand %xmm1, %xmm0, %xmm01286; AVX1-NEXT: vmovdqa {{.*#+}} xmm1 = [0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15]1287; AVX1-NEXT: vpshufb %xmm0, %xmm1, %xmm01288; AVX1-NEXT: vpor %xmm0, %xmm2, %xmm01289; AVX1-NEXT: retq1290;1291; AVX2-LABEL: vp_bitreverse_v4i32:1292; AVX2: # %bb.0:1293; AVX2-NEXT: vpshufb {{.*#+}} xmm0 = xmm0[3,2,1,0,7,6,5,4,11,10,9,8,15,14,13,12]1294; AVX2-NEXT: vpbroadcastb {{.*#+}} xmm1 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]1295; AVX2-NEXT: vpand %xmm1, %xmm0, %xmm21296; AVX2-NEXT: vmovdqa {{.*#+}} xmm3 = [0,128,64,192,32,160,96,224,16,144,80,208,48,176,112,240]1297; AVX2-NEXT: vpshufb %xmm2, %xmm3, %xmm21298; AVX2-NEXT: vpsrlw $4, %xmm0, %xmm01299; AVX2-NEXT: vpand %xmm1, %xmm0, %xmm01300; AVX2-NEXT: vmovdqa {{.*#+}} xmm1 = [0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15]1301; AVX2-NEXT: vpshufb %xmm0, %xmm1, %xmm01302; AVX2-NEXT: vpor %xmm0, %xmm2, %xmm01303; AVX2-NEXT: retq1304;1305; AVX512-LABEL: vp_bitreverse_v4i32:1306; AVX512: # %bb.0:1307; AVX512-NEXT: vpshufb {{.*#+}} xmm0 = xmm0[3,2,1,0,7,6,5,4,11,10,9,8,15,14,13,12]1308; AVX512-NEXT: vpbroadcastd {{.*#+}} xmm1 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]1309; AVX512-NEXT: vpand %xmm1, %xmm0, %xmm21310; AVX512-NEXT: vmovdqa {{.*#+}} xmm3 = [0,128,64,192,32,160,96,224,16,144,80,208,48,176,112,240]1311; AVX512-NEXT: vpshufb %xmm2, %xmm3, %xmm21312; AVX512-NEXT: vpsrlw $4, %xmm0, %xmm01313; AVX512-NEXT: vpand %xmm1, %xmm0, %xmm01314; AVX512-NEXT: vmovdqa {{.*#+}} xmm1 = [0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15]1315; AVX512-NEXT: vpshufb %xmm0, %xmm1, %xmm01316; AVX512-NEXT: vpor %xmm0, %xmm2, %xmm01317; AVX512-NEXT: retq1318 %v = call <4 x i32> @llvm.vp.bitreverse.v4i32(<4 x i32> %va, <4 x i1> %m, i32 %evl)1319 ret <4 x i32> %v1320}1321declare <4 x i32> @llvm.vp.bitreverse.v4i32(<4 x i32>, <4 x i1>, i32)1322 1323define <4 x i32> @vp_bswap_v4i32(<4 x i32> %va, <4 x i1> %m, i32 zeroext %evl) {1324; X86-LABEL: vp_bswap_v4i32:1325; X86: # %bb.0:1326; X86-NEXT: vpshufb {{.*#+}} xmm0 = xmm0[3,2,1,0,7,6,5,4,11,10,9,8,15,14,13,12]1327; X86-NEXT: retl1328;1329; SSE-LABEL: vp_bswap_v4i32:1330; SSE: # %bb.0:1331; SSE-NEXT: pxor %xmm1, %xmm11332; SSE-NEXT: movdqa %xmm0, %xmm21333; SSE-NEXT: punpckhbw {{.*#+}} xmm2 = xmm2[8],xmm1[8],xmm2[9],xmm1[9],xmm2[10],xmm1[10],xmm2[11],xmm1[11],xmm2[12],xmm1[12],xmm2[13],xmm1[13],xmm2[14],xmm1[14],xmm2[15],xmm1[15]1334; SSE-NEXT: pshuflw {{.*#+}} xmm2 = xmm2[3,2,1,0,4,5,6,7]1335; SSE-NEXT: pshufhw {{.*#+}} xmm2 = xmm2[0,1,2,3,7,6,5,4]1336; SSE-NEXT: punpcklbw {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3],xmm0[4],xmm1[4],xmm0[5],xmm1[5],xmm0[6],xmm1[6],xmm0[7],xmm1[7]1337; SSE-NEXT: pshuflw {{.*#+}} xmm0 = xmm0[3,2,1,0,4,5,6,7]1338; SSE-NEXT: pshufhw {{.*#+}} xmm0 = xmm0[0,1,2,3,7,6,5,4]1339; SSE-NEXT: packuswb %xmm2, %xmm01340; SSE-NEXT: retq1341;1342; AVX-LABEL: vp_bswap_v4i32:1343; AVX: # %bb.0:1344; AVX-NEXT: vpshufb {{.*#+}} xmm0 = xmm0[3,2,1,0,7,6,5,4,11,10,9,8,15,14,13,12]1345; AVX-NEXT: retq1346 %v = call <4 x i32> @llvm.vp.bswap.v4i32(<4 x i32> %va, <4 x i1> %m, i32 %evl)1347 ret <4 x i32> %v1348}1349declare <4 x i32> @llvm.vp.bswap.v4i32(<4 x i32>, <4 x i1>, i32)1350 1351define <4 x i32> @vp_ctpop_v4i32(<4 x i32> %va, <4 x i1> %m, i32 zeroext %evl) {1352; X86-LABEL: vp_ctpop_v4i32:1353; X86: # %bb.0:1354; X86-NEXT: vbroadcastss {{.*#+}} xmm1 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]1355; X86-NEXT: vpand %xmm1, %xmm0, %xmm21356; X86-NEXT: vmovdqa {{.*#+}} xmm3 = [0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4]1357; X86-NEXT: vpshufb %xmm2, %xmm3, %xmm21358; X86-NEXT: vpsrlw $4, %xmm0, %xmm01359; X86-NEXT: vpand %xmm1, %xmm0, %xmm01360; X86-NEXT: vpshufb %xmm0, %xmm3, %xmm01361; X86-NEXT: vpaddb %xmm2, %xmm0, %xmm01362; X86-NEXT: vpxor %xmm1, %xmm1, %xmm11363; X86-NEXT: vpunpckhdq {{.*#+}} xmm2 = xmm0[2],xmm1[2],xmm0[3],xmm1[3]1364; X86-NEXT: vpsadbw %xmm1, %xmm2, %xmm21365; X86-NEXT: vpmovzxdq {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero1366; X86-NEXT: vpsadbw %xmm1, %xmm0, %xmm01367; X86-NEXT: vpackuswb %xmm2, %xmm0, %xmm01368; X86-NEXT: retl1369;1370; SSE-LABEL: vp_ctpop_v4i32:1371; SSE: # %bb.0:1372; SSE-NEXT: movdqa %xmm0, %xmm11373; SSE-NEXT: psrlw $1, %xmm11374; SSE-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm11375; SSE-NEXT: psubb %xmm1, %xmm01376; SSE-NEXT: movdqa {{.*#+}} xmm1 = [51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51]1377; SSE-NEXT: movdqa %xmm0, %xmm21378; SSE-NEXT: pand %xmm1, %xmm21379; SSE-NEXT: psrlw $2, %xmm01380; SSE-NEXT: pand %xmm1, %xmm01381; SSE-NEXT: paddb %xmm2, %xmm01382; SSE-NEXT: movdqa %xmm0, %xmm11383; SSE-NEXT: psrlw $4, %xmm11384; SSE-NEXT: paddb %xmm1, %xmm01385; SSE-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm01386; SSE-NEXT: pxor %xmm1, %xmm11387; SSE-NEXT: movdqa %xmm0, %xmm21388; SSE-NEXT: punpckhdq {{.*#+}} xmm2 = xmm2[2],xmm1[2],xmm2[3],xmm1[3]1389; SSE-NEXT: psadbw %xmm1, %xmm21390; SSE-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]1391; SSE-NEXT: psadbw %xmm1, %xmm01392; SSE-NEXT: packuswb %xmm2, %xmm01393; SSE-NEXT: retq1394;1395; AVX1-LABEL: vp_ctpop_v4i32:1396; AVX1: # %bb.0:1397; AVX1-NEXT: vbroadcastss {{.*#+}} xmm1 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]1398; AVX1-NEXT: vpand %xmm1, %xmm0, %xmm21399; AVX1-NEXT: vmovdqa {{.*#+}} xmm3 = [0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4]1400; AVX1-NEXT: vpshufb %xmm2, %xmm3, %xmm21401; AVX1-NEXT: vpsrlw $4, %xmm0, %xmm01402; AVX1-NEXT: vpand %xmm1, %xmm0, %xmm01403; AVX1-NEXT: vpshufb %xmm0, %xmm3, %xmm01404; AVX1-NEXT: vpaddb %xmm2, %xmm0, %xmm01405; AVX1-NEXT: vpxor %xmm1, %xmm1, %xmm11406; AVX1-NEXT: vpunpckhdq {{.*#+}} xmm2 = xmm0[2],xmm1[2],xmm0[3],xmm1[3]1407; AVX1-NEXT: vpsadbw %xmm1, %xmm2, %xmm21408; AVX1-NEXT: vpmovzxdq {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero1409; AVX1-NEXT: vpsadbw %xmm1, %xmm0, %xmm01410; AVX1-NEXT: vpackuswb %xmm2, %xmm0, %xmm01411; AVX1-NEXT: retq1412;1413; AVX2-LABEL: vp_ctpop_v4i32:1414; AVX2: # %bb.0:1415; AVX2-NEXT: vpbroadcastb {{.*#+}} xmm1 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]1416; AVX2-NEXT: vpand %xmm1, %xmm0, %xmm21417; AVX2-NEXT: vmovdqa {{.*#+}} xmm3 = [0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4]1418; AVX2-NEXT: vpshufb %xmm2, %xmm3, %xmm21419; AVX2-NEXT: vpsrlw $4, %xmm0, %xmm01420; AVX2-NEXT: vpand %xmm1, %xmm0, %xmm01421; AVX2-NEXT: vpshufb %xmm0, %xmm3, %xmm01422; AVX2-NEXT: vpaddb %xmm2, %xmm0, %xmm01423; AVX2-NEXT: vpxor %xmm1, %xmm1, %xmm11424; AVX2-NEXT: vpunpckhdq {{.*#+}} xmm2 = xmm0[2],xmm1[2],xmm0[3],xmm1[3]1425; AVX2-NEXT: vpsadbw %xmm1, %xmm2, %xmm21426; AVX2-NEXT: vpmovzxdq {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero1427; AVX2-NEXT: vpsadbw %xmm1, %xmm0, %xmm01428; AVX2-NEXT: vpackuswb %xmm2, %xmm0, %xmm01429; AVX2-NEXT: retq1430;1431; AVX512-LABEL: vp_ctpop_v4i32:1432; AVX512: # %bb.0:1433; AVX512-NEXT: vpbroadcastd {{.*#+}} xmm1 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]1434; AVX512-NEXT: vpand %xmm1, %xmm0, %xmm21435; AVX512-NEXT: vmovdqa {{.*#+}} xmm3 = [0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4]1436; AVX512-NEXT: vpshufb %xmm2, %xmm3, %xmm21437; AVX512-NEXT: vpsrlw $4, %xmm0, %xmm01438; AVX512-NEXT: vpand %xmm1, %xmm0, %xmm01439; AVX512-NEXT: vpshufb %xmm0, %xmm3, %xmm01440; AVX512-NEXT: vpaddb %xmm2, %xmm0, %xmm01441; AVX512-NEXT: vpxor %xmm1, %xmm1, %xmm11442; AVX512-NEXT: vpunpckhdq {{.*#+}} xmm2 = xmm0[2],xmm1[2],xmm0[3],xmm1[3]1443; AVX512-NEXT: vpsadbw %xmm1, %xmm2, %xmm21444; AVX512-NEXT: vpmovzxdq {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero1445; AVX512-NEXT: vpsadbw %xmm1, %xmm0, %xmm01446; AVX512-NEXT: vpackuswb %xmm2, %xmm0, %xmm01447; AVX512-NEXT: retq1448 %v = call <4 x i32> @llvm.vp.ctpop.v4i32(<4 x i32> %va, <4 x i1> %m, i32 %evl)1449 ret <4 x i32> %v1450}1451declare <4 x i32> @llvm.vp.ctpop.v4i32(<4 x i32>, <4 x i1>, i32)1452 1453define <4 x i32> @vp_ctlz_v4i32(<4 x i32> %va, <4 x i1> %m, i32 zeroext %evl) {1454; X86-LABEL: vp_ctlz_v4i32:1455; X86: # %bb.0:1456; X86-NEXT: vmovq {{.*#+}} xmm1 = [4,3,2,2,1,1,1,1,0,0,0,0,0,0,0,0]1457; X86-NEXT: vpshufb %xmm0, %xmm1, %xmm21458; X86-NEXT: vpsrlw $4, %xmm0, %xmm31459; X86-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}, %xmm3, %xmm31460; X86-NEXT: vpxor %xmm4, %xmm4, %xmm41461; X86-NEXT: vpcmpeqb %xmm4, %xmm3, %xmm51462; X86-NEXT: vpand %xmm5, %xmm2, %xmm21463; X86-NEXT: vpshufb %xmm3, %xmm1, %xmm11464; X86-NEXT: vpaddb %xmm1, %xmm2, %xmm11465; X86-NEXT: vpcmpeqb %xmm4, %xmm0, %xmm21466; X86-NEXT: vpsrlw $8, %xmm2, %xmm21467; X86-NEXT: vpand %xmm2, %xmm1, %xmm21468; X86-NEXT: vpsrlw $8, %xmm1, %xmm11469; X86-NEXT: vpaddw %xmm2, %xmm1, %xmm11470; X86-NEXT: vpcmpeqw %xmm4, %xmm0, %xmm01471; X86-NEXT: vpsrld $16, %xmm0, %xmm01472; X86-NEXT: vpand %xmm0, %xmm1, %xmm01473; X86-NEXT: vpsrld $16, %xmm1, %xmm11474; X86-NEXT: vpaddd %xmm0, %xmm1, %xmm01475; X86-NEXT: retl1476;1477; SSE-LABEL: vp_ctlz_v4i32:1478; SSE: # %bb.0:1479; SSE-NEXT: movdqa %xmm0, %xmm11480; SSE-NEXT: psrld $1, %xmm11481; SSE-NEXT: por %xmm1, %xmm01482; SSE-NEXT: movdqa %xmm0, %xmm11483; SSE-NEXT: psrld $2, %xmm11484; SSE-NEXT: por %xmm1, %xmm01485; SSE-NEXT: movdqa %xmm0, %xmm11486; SSE-NEXT: psrld $4, %xmm11487; SSE-NEXT: por %xmm1, %xmm01488; SSE-NEXT: movdqa %xmm0, %xmm11489; SSE-NEXT: psrld $8, %xmm11490; SSE-NEXT: por %xmm1, %xmm01491; SSE-NEXT: movdqa %xmm0, %xmm11492; SSE-NEXT: psrld $16, %xmm11493; SSE-NEXT: por %xmm1, %xmm01494; SSE-NEXT: pcmpeqd %xmm1, %xmm11495; SSE-NEXT: pxor %xmm1, %xmm01496; SSE-NEXT: movdqa %xmm0, %xmm11497; SSE-NEXT: psrlw $1, %xmm11498; SSE-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm11499; SSE-NEXT: psubb %xmm1, %xmm01500; SSE-NEXT: movdqa {{.*#+}} xmm1 = [51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51]1501; SSE-NEXT: movdqa %xmm0, %xmm21502; SSE-NEXT: pand %xmm1, %xmm21503; SSE-NEXT: psrlw $2, %xmm01504; SSE-NEXT: pand %xmm1, %xmm01505; SSE-NEXT: paddb %xmm2, %xmm01506; SSE-NEXT: movdqa %xmm0, %xmm11507; SSE-NEXT: psrlw $4, %xmm11508; SSE-NEXT: paddb %xmm1, %xmm01509; SSE-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm01510; SSE-NEXT: pxor %xmm1, %xmm11511; SSE-NEXT: movdqa %xmm0, %xmm21512; SSE-NEXT: punpckhdq {{.*#+}} xmm2 = xmm2[2],xmm1[2],xmm2[3],xmm1[3]1513; SSE-NEXT: psadbw %xmm1, %xmm21514; SSE-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]1515; SSE-NEXT: psadbw %xmm1, %xmm01516; SSE-NEXT: packuswb %xmm2, %xmm01517; SSE-NEXT: retq1518;1519; AVX1-LABEL: vp_ctlz_v4i32:1520; AVX1: # %bb.0:1521; AVX1-NEXT: vmovq {{.*#+}} xmm1 = [4,3,2,2,1,1,1,1,0,0,0,0,0,0,0,0]1522; AVX1-NEXT: vpshufb %xmm0, %xmm1, %xmm21523; AVX1-NEXT: vpsrlw $4, %xmm0, %xmm31524; AVX1-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm3, %xmm31525; AVX1-NEXT: vpxor %xmm4, %xmm4, %xmm41526; AVX1-NEXT: vpcmpeqb %xmm4, %xmm3, %xmm51527; AVX1-NEXT: vpand %xmm5, %xmm2, %xmm21528; AVX1-NEXT: vpshufb %xmm3, %xmm1, %xmm11529; AVX1-NEXT: vpaddb %xmm1, %xmm2, %xmm11530; AVX1-NEXT: vpcmpeqb %xmm4, %xmm0, %xmm21531; AVX1-NEXT: vpsrlw $8, %xmm2, %xmm21532; AVX1-NEXT: vpand %xmm2, %xmm1, %xmm21533; AVX1-NEXT: vpsrlw $8, %xmm1, %xmm11534; AVX1-NEXT: vpaddw %xmm2, %xmm1, %xmm11535; AVX1-NEXT: vpcmpeqw %xmm4, %xmm0, %xmm01536; AVX1-NEXT: vpsrld $16, %xmm0, %xmm01537; AVX1-NEXT: vpand %xmm0, %xmm1, %xmm01538; AVX1-NEXT: vpsrld $16, %xmm1, %xmm11539; AVX1-NEXT: vpaddd %xmm0, %xmm1, %xmm01540; AVX1-NEXT: retq1541;1542; AVX2-LABEL: vp_ctlz_v4i32:1543; AVX2: # %bb.0:1544; AVX2-NEXT: vmovq {{.*#+}} xmm1 = [4,3,2,2,1,1,1,1,0,0,0,0,0,0,0,0]1545; AVX2-NEXT: vpshufb %xmm0, %xmm1, %xmm21546; AVX2-NEXT: vpsrlw $4, %xmm0, %xmm31547; AVX2-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm3, %xmm31548; AVX2-NEXT: vpxor %xmm4, %xmm4, %xmm41549; AVX2-NEXT: vpcmpeqb %xmm4, %xmm3, %xmm51550; AVX2-NEXT: vpand %xmm5, %xmm2, %xmm21551; AVX2-NEXT: vpshufb %xmm3, %xmm1, %xmm11552; AVX2-NEXT: vpaddb %xmm1, %xmm2, %xmm11553; AVX2-NEXT: vpcmpeqb %xmm4, %xmm0, %xmm21554; AVX2-NEXT: vpsrlw $8, %xmm2, %xmm21555; AVX2-NEXT: vpand %xmm2, %xmm1, %xmm21556; AVX2-NEXT: vpsrlw $8, %xmm1, %xmm11557; AVX2-NEXT: vpaddw %xmm2, %xmm1, %xmm11558; AVX2-NEXT: vpcmpeqw %xmm4, %xmm0, %xmm01559; AVX2-NEXT: vpsrld $16, %xmm0, %xmm01560; AVX2-NEXT: vpand %xmm0, %xmm1, %xmm01561; AVX2-NEXT: vpsrld $16, %xmm1, %xmm11562; AVX2-NEXT: vpaddd %xmm0, %xmm1, %xmm01563; AVX2-NEXT: retq1564;1565; AVX512-LABEL: vp_ctlz_v4i32:1566; AVX512: # %bb.0:1567; AVX512-NEXT: vmovq {{.*#+}} xmm1 = [4,3,2,2,1,1,1,1,0,0,0,0,0,0,0,0]1568; AVX512-NEXT: vpshufb %xmm0, %xmm1, %xmm21569; AVX512-NEXT: vpsrlw $4, %xmm0, %xmm31570; AVX512-NEXT: vpandd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to4}, %xmm3, %xmm31571; AVX512-NEXT: vpxor %xmm4, %xmm4, %xmm41572; AVX512-NEXT: vpcmpeqb %xmm4, %xmm3, %xmm51573; AVX512-NEXT: vpand %xmm5, %xmm2, %xmm21574; AVX512-NEXT: vpshufb %xmm3, %xmm1, %xmm11575; AVX512-NEXT: vpaddb %xmm1, %xmm2, %xmm11576; AVX512-NEXT: vpcmpeqb %xmm4, %xmm0, %xmm21577; AVX512-NEXT: vpsrlw $8, %xmm2, %xmm21578; AVX512-NEXT: vpand %xmm2, %xmm1, %xmm21579; AVX512-NEXT: vpsrlw $8, %xmm1, %xmm11580; AVX512-NEXT: vpaddw %xmm2, %xmm1, %xmm11581; AVX512-NEXT: vpcmpeqw %xmm4, %xmm0, %xmm01582; AVX512-NEXT: vpsrld $16, %xmm0, %xmm01583; AVX512-NEXT: vpand %xmm0, %xmm1, %xmm01584; AVX512-NEXT: vpsrld $16, %xmm1, %xmm11585; AVX512-NEXT: vpaddd %xmm0, %xmm1, %xmm01586; AVX512-NEXT: retq1587 %v = call <4 x i32> @llvm.vp.ctlz.v4i32(<4 x i32> %va, i1 false, <4 x i1> %m, i32 %evl)1588 ret <4 x i32> %v1589}1590declare <4 x i32> @llvm.vp.ctlz.v4i32(<4 x i32>, i1, <4 x i1>, i32)1591 1592define <4 x i32> @vp_cttz_v4i32(<4 x i32> %va, <4 x i1> %m, i32 zeroext %evl) {1593; X86-LABEL: vp_cttz_v4i32:1594; X86: # %bb.0:1595; X86-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm11596; X86-NEXT: vpaddd %xmm1, %xmm0, %xmm11597; X86-NEXT: vpandn %xmm1, %xmm0, %xmm01598; X86-NEXT: vbroadcastss {{.*#+}} xmm1 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]1599; X86-NEXT: vpand %xmm1, %xmm0, %xmm21600; X86-NEXT: vmovdqa {{.*#+}} xmm3 = [0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4]1601; X86-NEXT: vpshufb %xmm2, %xmm3, %xmm21602; X86-NEXT: vpsrlw $4, %xmm0, %xmm01603; X86-NEXT: vpand %xmm1, %xmm0, %xmm01604; X86-NEXT: vpshufb %xmm0, %xmm3, %xmm01605; X86-NEXT: vpaddb %xmm2, %xmm0, %xmm01606; X86-NEXT: vpxor %xmm1, %xmm1, %xmm11607; X86-NEXT: vpunpckhdq {{.*#+}} xmm2 = xmm0[2],xmm1[2],xmm0[3],xmm1[3]1608; X86-NEXT: vpsadbw %xmm1, %xmm2, %xmm21609; X86-NEXT: vpmovzxdq {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero1610; X86-NEXT: vpsadbw %xmm1, %xmm0, %xmm01611; X86-NEXT: vpackuswb %xmm2, %xmm0, %xmm01612; X86-NEXT: retl1613;1614; SSE-LABEL: vp_cttz_v4i32:1615; SSE: # %bb.0:1616; SSE-NEXT: pcmpeqd %xmm1, %xmm11617; SSE-NEXT: paddd %xmm0, %xmm11618; SSE-NEXT: pandn %xmm1, %xmm01619; SSE-NEXT: movdqa %xmm0, %xmm11620; SSE-NEXT: psrlw $1, %xmm11621; SSE-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm11622; SSE-NEXT: psubb %xmm1, %xmm01623; SSE-NEXT: movdqa {{.*#+}} xmm1 = [51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51]1624; SSE-NEXT: movdqa %xmm0, %xmm21625; SSE-NEXT: pand %xmm1, %xmm21626; SSE-NEXT: psrlw $2, %xmm01627; SSE-NEXT: pand %xmm1, %xmm01628; SSE-NEXT: paddb %xmm2, %xmm01629; SSE-NEXT: movdqa %xmm0, %xmm11630; SSE-NEXT: psrlw $4, %xmm11631; SSE-NEXT: paddb %xmm1, %xmm01632; SSE-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm01633; SSE-NEXT: pxor %xmm1, %xmm11634; SSE-NEXT: movdqa %xmm0, %xmm21635; SSE-NEXT: punpckhdq {{.*#+}} xmm2 = xmm2[2],xmm1[2],xmm2[3],xmm1[3]1636; SSE-NEXT: psadbw %xmm1, %xmm21637; SSE-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]1638; SSE-NEXT: psadbw %xmm1, %xmm01639; SSE-NEXT: packuswb %xmm2, %xmm01640; SSE-NEXT: retq1641;1642; AVX1-LABEL: vp_cttz_v4i32:1643; AVX1: # %bb.0:1644; AVX1-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm11645; AVX1-NEXT: vpaddd %xmm1, %xmm0, %xmm11646; AVX1-NEXT: vpandn %xmm1, %xmm0, %xmm01647; AVX1-NEXT: vbroadcastss {{.*#+}} xmm1 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]1648; AVX1-NEXT: vpand %xmm1, %xmm0, %xmm21649; AVX1-NEXT: vmovdqa {{.*#+}} xmm3 = [0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4]1650; AVX1-NEXT: vpshufb %xmm2, %xmm3, %xmm21651; AVX1-NEXT: vpsrlw $4, %xmm0, %xmm01652; AVX1-NEXT: vpand %xmm1, %xmm0, %xmm01653; AVX1-NEXT: vpshufb %xmm0, %xmm3, %xmm01654; AVX1-NEXT: vpaddb %xmm2, %xmm0, %xmm01655; AVX1-NEXT: vpxor %xmm1, %xmm1, %xmm11656; AVX1-NEXT: vpunpckhdq {{.*#+}} xmm2 = xmm0[2],xmm1[2],xmm0[3],xmm1[3]1657; AVX1-NEXT: vpsadbw %xmm1, %xmm2, %xmm21658; AVX1-NEXT: vpmovzxdq {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero1659; AVX1-NEXT: vpsadbw %xmm1, %xmm0, %xmm01660; AVX1-NEXT: vpackuswb %xmm2, %xmm0, %xmm01661; AVX1-NEXT: retq1662;1663; AVX2-LABEL: vp_cttz_v4i32:1664; AVX2: # %bb.0:1665; AVX2-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm11666; AVX2-NEXT: vpaddd %xmm1, %xmm0, %xmm11667; AVX2-NEXT: vpandn %xmm1, %xmm0, %xmm01668; AVX2-NEXT: vpbroadcastb {{.*#+}} xmm1 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]1669; AVX2-NEXT: vpand %xmm1, %xmm0, %xmm21670; AVX2-NEXT: vmovdqa {{.*#+}} xmm3 = [0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4]1671; AVX2-NEXT: vpshufb %xmm2, %xmm3, %xmm21672; AVX2-NEXT: vpsrlw $4, %xmm0, %xmm01673; AVX2-NEXT: vpand %xmm1, %xmm0, %xmm01674; AVX2-NEXT: vpshufb %xmm0, %xmm3, %xmm01675; AVX2-NEXT: vpaddb %xmm2, %xmm0, %xmm01676; AVX2-NEXT: vpxor %xmm1, %xmm1, %xmm11677; AVX2-NEXT: vpunpckhdq {{.*#+}} xmm2 = xmm0[2],xmm1[2],xmm0[3],xmm1[3]1678; AVX2-NEXT: vpsadbw %xmm1, %xmm2, %xmm21679; AVX2-NEXT: vpmovzxdq {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero1680; AVX2-NEXT: vpsadbw %xmm1, %xmm0, %xmm01681; AVX2-NEXT: vpackuswb %xmm2, %xmm0, %xmm01682; AVX2-NEXT: retq1683;1684; AVX512-LABEL: vp_cttz_v4i32:1685; AVX512: # %bb.0:1686; AVX512-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm11687; AVX512-NEXT: vpaddd %xmm1, %xmm0, %xmm11688; AVX512-NEXT: vpandn %xmm1, %xmm0, %xmm01689; AVX512-NEXT: vpbroadcastd {{.*#+}} xmm1 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]1690; AVX512-NEXT: vpand %xmm1, %xmm0, %xmm21691; AVX512-NEXT: vmovdqa {{.*#+}} xmm3 = [0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4]1692; AVX512-NEXT: vpshufb %xmm2, %xmm3, %xmm21693; AVX512-NEXT: vpsrlw $4, %xmm0, %xmm01694; AVX512-NEXT: vpand %xmm1, %xmm0, %xmm01695; AVX512-NEXT: vpshufb %xmm0, %xmm3, %xmm01696; AVX512-NEXT: vpaddb %xmm2, %xmm0, %xmm01697; AVX512-NEXT: vpxor %xmm1, %xmm1, %xmm11698; AVX512-NEXT: vpunpckhdq {{.*#+}} xmm2 = xmm0[2],xmm1[2],xmm0[3],xmm1[3]1699; AVX512-NEXT: vpsadbw %xmm1, %xmm2, %xmm21700; AVX512-NEXT: vpmovzxdq {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero1701; AVX512-NEXT: vpsadbw %xmm1, %xmm0, %xmm01702; AVX512-NEXT: vpackuswb %xmm2, %xmm0, %xmm01703; AVX512-NEXT: retq1704 %v = call <4 x i32> @llvm.vp.cttz.v4i32(<4 x i32> %va, i1 false, <4 x i1> %m, i32 %evl)1705 ret <4 x i32> %v1706}1707declare <4 x i32> @llvm.vp.cttz.v4i32(<4 x i32>, i1, <4 x i1>, i32)1708 1709 1710define <4 x i32> @vp_sadd_sat_v4i32(<4 x i32> %va, <4 x i32> %vb, <4 x i1> %m, i32 zeroext %evl) {1711; X86-LABEL: vp_sadd_sat_v4i32:1712; X86: # %bb.0:1713; X86-NEXT: vpaddd %xmm1, %xmm0, %xmm21714; X86-NEXT: vpcmpgtd %xmm2, %xmm0, %xmm01715; X86-NEXT: vpxor %xmm0, %xmm1, %xmm01716; X86-NEXT: vpsrad $31, %xmm2, %xmm11717; X86-NEXT: vpxor {{\.?LCPI[0-9]+_[0-9]+}}, %xmm1, %xmm11718; X86-NEXT: vblendvps %xmm0, %xmm1, %xmm2, %xmm01719; X86-NEXT: retl1720;1721; SSE-LABEL: vp_sadd_sat_v4i32:1722; SSE: # %bb.0:1723; SSE-NEXT: pxor %xmm2, %xmm21724; SSE-NEXT: pcmpgtd %xmm1, %xmm21725; SSE-NEXT: paddd %xmm0, %xmm11726; SSE-NEXT: pcmpgtd %xmm1, %xmm01727; SSE-NEXT: pxor %xmm2, %xmm01728; SSE-NEXT: movdqa %xmm0, %xmm21729; SSE-NEXT: pandn %xmm1, %xmm21730; SSE-NEXT: psrad $31, %xmm11731; SSE-NEXT: pxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm11732; SSE-NEXT: pand %xmm1, %xmm01733; SSE-NEXT: por %xmm2, %xmm01734; SSE-NEXT: retq1735;1736; AVX1-LABEL: vp_sadd_sat_v4i32:1737; AVX1: # %bb.0:1738; AVX1-NEXT: vpaddd %xmm1, %xmm0, %xmm21739; AVX1-NEXT: vpcmpgtd %xmm2, %xmm0, %xmm01740; AVX1-NEXT: vpxor %xmm0, %xmm1, %xmm01741; AVX1-NEXT: vpsrad $31, %xmm2, %xmm11742; AVX1-NEXT: vpxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm11743; AVX1-NEXT: vblendvps %xmm0, %xmm1, %xmm2, %xmm01744; AVX1-NEXT: retq1745;1746; AVX2-LABEL: vp_sadd_sat_v4i32:1747; AVX2: # %bb.0:1748; AVX2-NEXT: vpaddd %xmm1, %xmm0, %xmm21749; AVX2-NEXT: vpcmpgtd %xmm2, %xmm0, %xmm01750; AVX2-NEXT: vpxor %xmm0, %xmm1, %xmm01751; AVX2-NEXT: vpsrad $31, %xmm2, %xmm11752; AVX2-NEXT: vpbroadcastd {{.*#+}} xmm3 = [2147483648,2147483648,2147483648,2147483648]1753; AVX2-NEXT: vpxor %xmm3, %xmm1, %xmm11754; AVX2-NEXT: vblendvps %xmm0, %xmm1, %xmm2, %xmm01755; AVX2-NEXT: retq1756;1757; AVX512-LABEL: vp_sadd_sat_v4i32:1758; AVX512: # %bb.0:1759; AVX512-NEXT: vpxor %xmm2, %xmm2, %xmm21760; AVX512-NEXT: vpcmpgtd %xmm1, %xmm2, %k01761; AVX512-NEXT: vpaddd %xmm1, %xmm0, %xmm11762; AVX512-NEXT: vpcmpgtd %xmm1, %xmm0, %k11763; AVX512-NEXT: kxorw %k1, %k0, %k11764; AVX512-NEXT: vpsrad $31, %xmm1, %xmm01765; AVX512-NEXT: vpxord {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to4}, %xmm0, %xmm1 {%k1}1766; AVX512-NEXT: vmovdqa %xmm1, %xmm01767; AVX512-NEXT: retq1768 %v = call <4 x i32> @llvm.vp.sadd.sat.v4i32(<4 x i32> %va, <4 x i32> %vb, <4 x i1> %m, i32 %evl)1769 ret <4 x i32> %v1770}1771declare <4 x i32> @llvm.vp.sadd.sat.v4i32(<4 x i32>, <4 x i32>, <4 x i1>, i32)1772 1773define <4 x i32> @vp_uadd_sat_v4i32(<4 x i32> %va, <4 x i32> %vb, <4 x i1> %m, i32 zeroext %evl) {1774; X86-LABEL: vp_uadd_sat_v4i32:1775; X86: # %bb.0:1776; X86-NEXT: vpcmpeqd %xmm2, %xmm2, %xmm21777; X86-NEXT: vpxor %xmm2, %xmm1, %xmm21778; X86-NEXT: vpminud %xmm2, %xmm0, %xmm01779; X86-NEXT: vpaddd %xmm1, %xmm0, %xmm01780; X86-NEXT: retl1781;1782; SSE-LABEL: vp_uadd_sat_v4i32:1783; SSE: # %bb.0:1784; SSE-NEXT: movdqa {{.*#+}} xmm2 = [2147483648,2147483648,2147483648,2147483648]1785; SSE-NEXT: movdqa %xmm0, %xmm31786; SSE-NEXT: pxor %xmm2, %xmm31787; SSE-NEXT: paddd %xmm1, %xmm01788; SSE-NEXT: pxor %xmm0, %xmm21789; SSE-NEXT: pcmpgtd %xmm2, %xmm31790; SSE-NEXT: por %xmm3, %xmm01791; SSE-NEXT: retq1792;1793; AVX1-LABEL: vp_uadd_sat_v4i32:1794; AVX1: # %bb.0:1795; AVX1-NEXT: vpcmpeqd %xmm2, %xmm2, %xmm21796; AVX1-NEXT: vpxor %xmm2, %xmm1, %xmm21797; AVX1-NEXT: vpminud %xmm2, %xmm0, %xmm01798; AVX1-NEXT: vpaddd %xmm1, %xmm0, %xmm01799; AVX1-NEXT: retq1800;1801; AVX2-LABEL: vp_uadd_sat_v4i32:1802; AVX2: # %bb.0:1803; AVX2-NEXT: vpcmpeqd %xmm2, %xmm2, %xmm21804; AVX2-NEXT: vpxor %xmm2, %xmm1, %xmm21805; AVX2-NEXT: vpminud %xmm2, %xmm0, %xmm01806; AVX2-NEXT: vpaddd %xmm1, %xmm0, %xmm01807; AVX2-NEXT: retq1808;1809; AVX512-LABEL: vp_uadd_sat_v4i32:1810; AVX512: # %bb.0:1811; AVX512-NEXT: vmovdqa %xmm1, %xmm21812; AVX512-NEXT: vpternlogq {{.*#+}} xmm2 = ~xmm21813; AVX512-NEXT: vpminud %xmm2, %xmm0, %xmm01814; AVX512-NEXT: vpaddd %xmm1, %xmm0, %xmm01815; AVX512-NEXT: retq1816 %v = call <4 x i32> @llvm.vp.uadd.sat.v4i32(<4 x i32> %va, <4 x i32> %vb, <4 x i1> %m, i32 %evl)1817 ret <4 x i32> %v1818}1819declare <4 x i32> @llvm.vp.uadd.sat.v4i32(<4 x i32>, <4 x i32>, <4 x i1>, i32)1820 1821define <4 x i32> @vp_ssub_sat_v4i32(<4 x i32> %va, <4 x i32> %vb, <4 x i1> %m, i32 zeroext %evl) {1822; X86-LABEL: vp_ssub_sat_v4i32:1823; X86: # %bb.0:1824; X86-NEXT: vpxor %xmm2, %xmm2, %xmm21825; X86-NEXT: vpcmpgtd %xmm2, %xmm1, %xmm21826; X86-NEXT: vpsubd %xmm1, %xmm0, %xmm11827; X86-NEXT: vpcmpgtd %xmm1, %xmm0, %xmm01828; X86-NEXT: vpxor %xmm0, %xmm2, %xmm01829; X86-NEXT: vpsrad $31, %xmm1, %xmm21830; X86-NEXT: vpxor {{\.?LCPI[0-9]+_[0-9]+}}, %xmm2, %xmm21831; X86-NEXT: vblendvps %xmm0, %xmm2, %xmm1, %xmm01832; X86-NEXT: retl1833;1834; SSE-LABEL: vp_ssub_sat_v4i32:1835; SSE: # %bb.0:1836; SSE-NEXT: pxor %xmm2, %xmm21837; SSE-NEXT: movdqa %xmm0, %xmm31838; SSE-NEXT: psubd %xmm1, %xmm31839; SSE-NEXT: pcmpgtd %xmm2, %xmm11840; SSE-NEXT: pcmpgtd %xmm3, %xmm01841; SSE-NEXT: pxor %xmm1, %xmm01842; SSE-NEXT: movdqa %xmm0, %xmm11843; SSE-NEXT: pandn %xmm3, %xmm11844; SSE-NEXT: psrad $31, %xmm31845; SSE-NEXT: pxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm31846; SSE-NEXT: pand %xmm3, %xmm01847; SSE-NEXT: por %xmm1, %xmm01848; SSE-NEXT: retq1849;1850; AVX1-LABEL: vp_ssub_sat_v4i32:1851; AVX1: # %bb.0:1852; AVX1-NEXT: vpxor %xmm2, %xmm2, %xmm21853; AVX1-NEXT: vpcmpgtd %xmm2, %xmm1, %xmm21854; AVX1-NEXT: vpsubd %xmm1, %xmm0, %xmm11855; AVX1-NEXT: vpcmpgtd %xmm1, %xmm0, %xmm01856; AVX1-NEXT: vpxor %xmm0, %xmm2, %xmm01857; AVX1-NEXT: vpsrad $31, %xmm1, %xmm21858; AVX1-NEXT: vpxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2, %xmm21859; AVX1-NEXT: vblendvps %xmm0, %xmm2, %xmm1, %xmm01860; AVX1-NEXT: retq1861;1862; AVX2-LABEL: vp_ssub_sat_v4i32:1863; AVX2: # %bb.0:1864; AVX2-NEXT: vpxor %xmm2, %xmm2, %xmm21865; AVX2-NEXT: vpcmpgtd %xmm2, %xmm1, %xmm21866; AVX2-NEXT: vpsubd %xmm1, %xmm0, %xmm11867; AVX2-NEXT: vpcmpgtd %xmm1, %xmm0, %xmm01868; AVX2-NEXT: vpxor %xmm0, %xmm2, %xmm01869; AVX2-NEXT: vpsrad $31, %xmm1, %xmm21870; AVX2-NEXT: vpbroadcastd {{.*#+}} xmm3 = [2147483648,2147483648,2147483648,2147483648]1871; AVX2-NEXT: vpxor %xmm3, %xmm2, %xmm21872; AVX2-NEXT: vblendvps %xmm0, %xmm2, %xmm1, %xmm01873; AVX2-NEXT: retq1874;1875; AVX512-LABEL: vp_ssub_sat_v4i32:1876; AVX512: # %bb.0:1877; AVX512-NEXT: vpxor %xmm2, %xmm2, %xmm21878; AVX512-NEXT: vpcmpgtd %xmm2, %xmm1, %k01879; AVX512-NEXT: vpsubd %xmm1, %xmm0, %xmm11880; AVX512-NEXT: vpcmpgtd %xmm1, %xmm0, %k11881; AVX512-NEXT: kxorw %k1, %k0, %k11882; AVX512-NEXT: vpsrad $31, %xmm1, %xmm01883; AVX512-NEXT: vpxord {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to4}, %xmm0, %xmm1 {%k1}1884; AVX512-NEXT: vmovdqa %xmm1, %xmm01885; AVX512-NEXT: retq1886 %v = call <4 x i32> @llvm.vp.ssub.sat.v4i32(<4 x i32> %va, <4 x i32> %vb, <4 x i1> %m, i32 %evl)1887 ret <4 x i32> %v1888}1889declare <4 x i32> @llvm.vp.ssub.sat.v4i32(<4 x i32>, <4 x i32>, <4 x i1>, i32)1890 1891define <4 x i32> @vp_usub_sat_v4i32(<4 x i32> %va, <4 x i32> %vb, <4 x i1> %m, i32 zeroext %evl) {1892; X86-LABEL: vp_usub_sat_v4i32:1893; X86: # %bb.0:1894; X86-NEXT: vpmaxud %xmm1, %xmm0, %xmm01895; X86-NEXT: vpsubd %xmm1, %xmm0, %xmm01896; X86-NEXT: retl1897;1898; SSE-LABEL: vp_usub_sat_v4i32:1899; SSE: # %bb.0:1900; SSE-NEXT: movdqa {{.*#+}} xmm2 = [2147483648,2147483648,2147483648,2147483648]1901; SSE-NEXT: movdqa %xmm1, %xmm31902; SSE-NEXT: pxor %xmm2, %xmm31903; SSE-NEXT: pxor %xmm0, %xmm21904; SSE-NEXT: pcmpgtd %xmm3, %xmm21905; SSE-NEXT: psubd %xmm1, %xmm01906; SSE-NEXT: pand %xmm2, %xmm01907; SSE-NEXT: retq1908;1909; AVX-LABEL: vp_usub_sat_v4i32:1910; AVX: # %bb.0:1911; AVX-NEXT: vpmaxud %xmm1, %xmm0, %xmm01912; AVX-NEXT: vpsubd %xmm1, %xmm0, %xmm01913; AVX-NEXT: retq1914 %v = call <4 x i32> @llvm.vp.usub.sat.v4i32(<4 x i32> %va, <4 x i32> %vb, <4 x i1> %m, i32 %evl)1915 ret <4 x i32> %v1916}1917declare <4 x i32> @llvm.vp.usub.sat.v4i32(<4 x i32>, <4 x i32>, <4 x i1>, i32)1918 1919define <4 x i32> @vp_fshl_v4i32(<4 x i32> %va, <4 x i32> %vb, <4 x i32> %vc, <4 x i1> %m, i32 zeroext %evl) {1920; X86-LABEL: vp_fshl_v4i32:1921; X86: # %bb.0:1922; X86-NEXT: pushl %ebp1923; X86-NEXT: .cfi_def_cfa_offset 81924; X86-NEXT: .cfi_offset %ebp, -81925; X86-NEXT: movl %esp, %ebp1926; X86-NEXT: .cfi_def_cfa_register %ebp1927; X86-NEXT: andl $-16, %esp1928; X86-NEXT: subl $16, %esp1929; X86-NEXT: vbroadcastss {{.*#+}} xmm3 = [31,31,31,31]1930; X86-NEXT: vpandn %xmm3, %xmm2, %xmm41931; X86-NEXT: vpsrldq {{.*#+}} xmm5 = xmm4[12,13,14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero1932; X86-NEXT: vpsrld $1, %xmm1, %xmm11933; X86-NEXT: vpsrld %xmm5, %xmm1, %xmm51934; X86-NEXT: vpsrlq $32, %xmm4, %xmm61935; X86-NEXT: vpsrld %xmm6, %xmm1, %xmm61936; X86-NEXT: vpblendw {{.*#+}} xmm5 = xmm6[0,1,2,3],xmm5[4,5,6,7]1937; X86-NEXT: vpxor %xmm6, %xmm6, %xmm61938; X86-NEXT: vpunpckhdq {{.*#+}} xmm6 = xmm4[2],xmm6[2],xmm4[3],xmm6[3]1939; X86-NEXT: vpsrld %xmm6, %xmm1, %xmm61940; X86-NEXT: vpmovzxdq {{.*#+}} xmm4 = xmm4[0],zero,xmm4[1],zero1941; X86-NEXT: vpsrld %xmm4, %xmm1, %xmm11942; X86-NEXT: vpblendw {{.*#+}} xmm1 = xmm1[0,1,2,3],xmm6[4,5,6,7]1943; X86-NEXT: vpblendw {{.*#+}} xmm1 = xmm1[0,1],xmm5[2,3],xmm1[4,5],xmm5[6,7]1944; X86-NEXT: vpand %xmm3, %xmm2, %xmm21945; X86-NEXT: vpslld $23, %xmm2, %xmm21946; X86-NEXT: vpaddd {{\.?LCPI[0-9]+_[0-9]+}}, %xmm2, %xmm21947; X86-NEXT: vcvttps2dq %xmm2, %xmm21948; X86-NEXT: vpmulld %xmm2, %xmm0, %xmm01949; X86-NEXT: vpor %xmm1, %xmm0, %xmm01950; X86-NEXT: movl %ebp, %esp1951; X86-NEXT: popl %ebp1952; X86-NEXT: .cfi_def_cfa %esp, 41953; X86-NEXT: retl1954;1955; SSE-LABEL: vp_fshl_v4i32:1956; SSE: # %bb.0:1957; SSE-NEXT: movdqa {{.*#+}} xmm4 = [31,31,31,31]1958; SSE-NEXT: movdqa %xmm2, %xmm51959; SSE-NEXT: pandn %xmm4, %xmm51960; SSE-NEXT: pshuflw {{.*#+}} xmm3 = xmm5[2,3,3,3,4,5,6,7]1961; SSE-NEXT: psrld $1, %xmm11962; SSE-NEXT: movdqa %xmm1, %xmm61963; SSE-NEXT: psrld %xmm3, %xmm61964; SSE-NEXT: pshuflw {{.*#+}} xmm7 = xmm5[0,1,1,1,4,5,6,7]1965; SSE-NEXT: movdqa %xmm1, %xmm31966; SSE-NEXT: psrld %xmm7, %xmm31967; SSE-NEXT: punpcklqdq {{.*#+}} xmm3 = xmm3[0],xmm6[0]1968; SSE-NEXT: pshufd {{.*#+}} xmm5 = xmm5[2,3,2,3]1969; SSE-NEXT: pshuflw {{.*#+}} xmm6 = xmm5[2,3,3,3,4,5,6,7]1970; SSE-NEXT: movdqa %xmm1, %xmm71971; SSE-NEXT: psrld %xmm6, %xmm71972; SSE-NEXT: pshuflw {{.*#+}} xmm5 = xmm5[0,1,1,1,4,5,6,7]1973; SSE-NEXT: psrld %xmm5, %xmm11974; SSE-NEXT: punpckhqdq {{.*#+}} xmm1 = xmm1[1],xmm7[1]1975; SSE-NEXT: shufps {{.*#+}} xmm3 = xmm3[0,3],xmm1[0,3]1976; SSE-NEXT: pand %xmm4, %xmm21977; SSE-NEXT: pslld $23, %xmm21978; SSE-NEXT: paddd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm21979; SSE-NEXT: cvttps2dq %xmm2, %xmm11980; SSE-NEXT: pshufd {{.*#+}} xmm2 = xmm0[1,1,3,3]1981; SSE-NEXT: pmuludq %xmm1, %xmm01982; SSE-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]1983; SSE-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]1984; SSE-NEXT: pmuludq %xmm2, %xmm11985; SSE-NEXT: pshufd {{.*#+}} xmm1 = xmm1[0,2,2,3]1986; SSE-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]1987; SSE-NEXT: por %xmm3, %xmm01988; SSE-NEXT: retq1989;1990; AVX1-LABEL: vp_fshl_v4i32:1991; AVX1: # %bb.0:1992; AVX1-NEXT: vbroadcastss {{.*#+}} xmm3 = [31,31,31,31]1993; AVX1-NEXT: vpandn %xmm3, %xmm2, %xmm41994; AVX1-NEXT: vpsrldq {{.*#+}} xmm5 = xmm4[12,13,14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero1995; AVX1-NEXT: vpsrld $1, %xmm1, %xmm11996; AVX1-NEXT: vpsrld %xmm5, %xmm1, %xmm51997; AVX1-NEXT: vpsrlq $32, %xmm4, %xmm61998; AVX1-NEXT: vpsrld %xmm6, %xmm1, %xmm61999; AVX1-NEXT: vpblendw {{.*#+}} xmm5 = xmm6[0,1,2,3],xmm5[4,5,6,7]2000; AVX1-NEXT: vpxor %xmm6, %xmm6, %xmm62001; AVX1-NEXT: vpunpckhdq {{.*#+}} xmm6 = xmm4[2],xmm6[2],xmm4[3],xmm6[3]2002; AVX1-NEXT: vpsrld %xmm6, %xmm1, %xmm62003; AVX1-NEXT: vpmovzxdq {{.*#+}} xmm4 = xmm4[0],zero,xmm4[1],zero2004; AVX1-NEXT: vpsrld %xmm4, %xmm1, %xmm12005; AVX1-NEXT: vpblendw {{.*#+}} xmm1 = xmm1[0,1,2,3],xmm6[4,5,6,7]2006; AVX1-NEXT: vpblendw {{.*#+}} xmm1 = xmm1[0,1],xmm5[2,3],xmm1[4,5],xmm5[6,7]2007; AVX1-NEXT: vpand %xmm3, %xmm2, %xmm22008; AVX1-NEXT: vpslld $23, %xmm2, %xmm22009; AVX1-NEXT: vpaddd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2, %xmm22010; AVX1-NEXT: vcvttps2dq %xmm2, %xmm22011; AVX1-NEXT: vpmulld %xmm2, %xmm0, %xmm02012; AVX1-NEXT: vpor %xmm1, %xmm0, %xmm02013; AVX1-NEXT: retq2014;2015; AVX2-LABEL: vp_fshl_v4i32:2016; AVX2: # %bb.0:2017; AVX2-NEXT: vpbroadcastd {{.*#+}} xmm3 = [31,31,31,31]2018; AVX2-NEXT: vpandn %xmm3, %xmm2, %xmm42019; AVX2-NEXT: vpsrld $1, %xmm1, %xmm12020; AVX2-NEXT: vpsrlvd %xmm4, %xmm1, %xmm12021; AVX2-NEXT: vpand %xmm3, %xmm2, %xmm22022; AVX2-NEXT: vpsllvd %xmm2, %xmm0, %xmm02023; AVX2-NEXT: vpor %xmm1, %xmm0, %xmm02024; AVX2-NEXT: retq2025;2026; AVX512-LABEL: vp_fshl_v4i32:2027; AVX512: # %bb.0:2028; AVX512-NEXT: vpbroadcastd {{.*#+}} xmm3 = [31,31,31,31]2029; AVX512-NEXT: vpandn %xmm3, %xmm2, %xmm42030; AVX512-NEXT: vpsrld $1, %xmm1, %xmm12031; AVX512-NEXT: vpsrlvd %xmm4, %xmm1, %xmm12032; AVX512-NEXT: vpand %xmm3, %xmm2, %xmm22033; AVX512-NEXT: vpsllvd %xmm2, %xmm0, %xmm02034; AVX512-NEXT: vpor %xmm1, %xmm0, %xmm02035; AVX512-NEXT: retq2036 %v = call <4 x i32> @llvm.vp.fshl.v4i32(<4 x i32> %va, <4 x i32> %vb, <4 x i32> %vc, <4 x i1> %m, i32 %evl)2037 ret <4 x i32> %v2038}2039declare <4 x i32> @llvm.vp.fshl.v4i32(<4 x i32>, <4 x i32>, <4 x i32>, <4 x i1>, i32)2040 2041define <4 x i32> @vp_fshr_v4i32(<4 x i32> %va, <4 x i32> %vb, <4 x i32> %vc, <4 x i1> %m, i32 zeroext %evl) {2042; X86-LABEL: vp_fshr_v4i32:2043; X86: # %bb.0:2044; X86-NEXT: pushl %ebp2045; X86-NEXT: .cfi_def_cfa_offset 82046; X86-NEXT: .cfi_offset %ebp, -82047; X86-NEXT: movl %esp, %ebp2048; X86-NEXT: .cfi_def_cfa_register %ebp2049; X86-NEXT: andl $-16, %esp2050; X86-NEXT: subl $16, %esp2051; X86-NEXT: vbroadcastss {{.*#+}} xmm3 = [31,31,31,31]2052; X86-NEXT: vpand %xmm3, %xmm2, %xmm42053; X86-NEXT: vpsrldq {{.*#+}} xmm5 = xmm4[12,13,14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero2054; X86-NEXT: vpsrld %xmm5, %xmm1, %xmm52055; X86-NEXT: vpsrlq $32, %xmm4, %xmm62056; X86-NEXT: vpsrld %xmm6, %xmm1, %xmm62057; X86-NEXT: vpblendw {{.*#+}} xmm5 = xmm6[0,1,2,3],xmm5[4,5,6,7]2058; X86-NEXT: vpxor %xmm6, %xmm6, %xmm62059; X86-NEXT: vpunpckhdq {{.*#+}} xmm6 = xmm4[2],xmm6[2],xmm4[3],xmm6[3]2060; X86-NEXT: vpsrld %xmm6, %xmm1, %xmm62061; X86-NEXT: vpmovzxdq {{.*#+}} xmm4 = xmm4[0],zero,xmm4[1],zero2062; X86-NEXT: vpsrld %xmm4, %xmm1, %xmm12063; X86-NEXT: vpblendw {{.*#+}} xmm1 = xmm1[0,1,2,3],xmm6[4,5,6,7]2064; X86-NEXT: vpblendw {{.*#+}} xmm1 = xmm1[0,1],xmm5[2,3],xmm1[4,5],xmm5[6,7]2065; X86-NEXT: vpandn %xmm3, %xmm2, %xmm22066; X86-NEXT: vpslld $23, %xmm2, %xmm22067; X86-NEXT: vpaddd {{\.?LCPI[0-9]+_[0-9]+}}, %xmm2, %xmm22068; X86-NEXT: vcvttps2dq %xmm2, %xmm22069; X86-NEXT: vpaddd %xmm0, %xmm0, %xmm02070; X86-NEXT: vpmulld %xmm2, %xmm0, %xmm02071; X86-NEXT: vpor %xmm1, %xmm0, %xmm02072; X86-NEXT: movl %ebp, %esp2073; X86-NEXT: popl %ebp2074; X86-NEXT: .cfi_def_cfa %esp, 42075; X86-NEXT: retl2076;2077; SSE-LABEL: vp_fshr_v4i32:2078; SSE: # %bb.0:2079; SSE-NEXT: movdqa {{.*#+}} xmm4 = [31,31,31,31]2080; SSE-NEXT: movdqa %xmm2, %xmm52081; SSE-NEXT: pand %xmm4, %xmm52082; SSE-NEXT: pshuflw {{.*#+}} xmm3 = xmm5[2,3,3,3,4,5,6,7]2083; SSE-NEXT: movdqa %xmm1, %xmm62084; SSE-NEXT: psrld %xmm3, %xmm62085; SSE-NEXT: pshuflw {{.*#+}} xmm7 = xmm5[0,1,1,1,4,5,6,7]2086; SSE-NEXT: movdqa %xmm1, %xmm32087; SSE-NEXT: psrld %xmm7, %xmm32088; SSE-NEXT: punpcklqdq {{.*#+}} xmm3 = xmm3[0],xmm6[0]2089; SSE-NEXT: pshufd {{.*#+}} xmm5 = xmm5[2,3,2,3]2090; SSE-NEXT: pshuflw {{.*#+}} xmm6 = xmm5[2,3,3,3,4,5,6,7]2091; SSE-NEXT: movdqa %xmm1, %xmm72092; SSE-NEXT: psrld %xmm6, %xmm72093; SSE-NEXT: pshuflw {{.*#+}} xmm5 = xmm5[0,1,1,1,4,5,6,7]2094; SSE-NEXT: psrld %xmm5, %xmm12095; SSE-NEXT: punpckhqdq {{.*#+}} xmm1 = xmm1[1],xmm7[1]2096; SSE-NEXT: shufps {{.*#+}} xmm3 = xmm3[0,3],xmm1[0,3]2097; SSE-NEXT: pandn %xmm4, %xmm22098; SSE-NEXT: pslld $23, %xmm22099; SSE-NEXT: paddd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm22100; SSE-NEXT: cvttps2dq %xmm2, %xmm12101; SSE-NEXT: paddd %xmm0, %xmm02102; SSE-NEXT: pshufd {{.*#+}} xmm2 = xmm0[1,1,3,3]2103; SSE-NEXT: pmuludq %xmm1, %xmm02104; SSE-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]2105; SSE-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]2106; SSE-NEXT: pmuludq %xmm2, %xmm12107; SSE-NEXT: pshufd {{.*#+}} xmm1 = xmm1[0,2,2,3]2108; SSE-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]2109; SSE-NEXT: por %xmm3, %xmm02110; SSE-NEXT: retq2111;2112; AVX1-LABEL: vp_fshr_v4i32:2113; AVX1: # %bb.0:2114; AVX1-NEXT: vbroadcastss {{.*#+}} xmm3 = [31,31,31,31]2115; AVX1-NEXT: vpand %xmm3, %xmm2, %xmm42116; AVX1-NEXT: vpsrldq {{.*#+}} xmm5 = xmm4[12,13,14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero2117; AVX1-NEXT: vpsrld %xmm5, %xmm1, %xmm52118; AVX1-NEXT: vpsrlq $32, %xmm4, %xmm62119; AVX1-NEXT: vpsrld %xmm6, %xmm1, %xmm62120; AVX1-NEXT: vpblendw {{.*#+}} xmm5 = xmm6[0,1,2,3],xmm5[4,5,6,7]2121; AVX1-NEXT: vpxor %xmm6, %xmm6, %xmm62122; AVX1-NEXT: vpunpckhdq {{.*#+}} xmm6 = xmm4[2],xmm6[2],xmm4[3],xmm6[3]2123; AVX1-NEXT: vpsrld %xmm6, %xmm1, %xmm62124; AVX1-NEXT: vpmovzxdq {{.*#+}} xmm4 = xmm4[0],zero,xmm4[1],zero2125; AVX1-NEXT: vpsrld %xmm4, %xmm1, %xmm12126; AVX1-NEXT: vpblendw {{.*#+}} xmm1 = xmm1[0,1,2,3],xmm6[4,5,6,7]2127; AVX1-NEXT: vpblendw {{.*#+}} xmm1 = xmm1[0,1],xmm5[2,3],xmm1[4,5],xmm5[6,7]2128; AVX1-NEXT: vpandn %xmm3, %xmm2, %xmm22129; AVX1-NEXT: vpslld $23, %xmm2, %xmm22130; AVX1-NEXT: vpaddd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2, %xmm22131; AVX1-NEXT: vcvttps2dq %xmm2, %xmm22132; AVX1-NEXT: vpaddd %xmm0, %xmm0, %xmm02133; AVX1-NEXT: vpmulld %xmm2, %xmm0, %xmm02134; AVX1-NEXT: vpor %xmm1, %xmm0, %xmm02135; AVX1-NEXT: retq2136;2137; AVX2-LABEL: vp_fshr_v4i32:2138; AVX2: # %bb.0:2139; AVX2-NEXT: vpbroadcastd {{.*#+}} xmm3 = [31,31,31,31]2140; AVX2-NEXT: vpand %xmm3, %xmm2, %xmm42141; AVX2-NEXT: vpsrlvd %xmm4, %xmm1, %xmm12142; AVX2-NEXT: vpandn %xmm3, %xmm2, %xmm22143; AVX2-NEXT: vpaddd %xmm0, %xmm0, %xmm02144; AVX2-NEXT: vpsllvd %xmm2, %xmm0, %xmm02145; AVX2-NEXT: vpor %xmm1, %xmm0, %xmm02146; AVX2-NEXT: retq2147;2148; AVX512-LABEL: vp_fshr_v4i32:2149; AVX512: # %bb.0:2150; AVX512-NEXT: vpbroadcastd {{.*#+}} xmm3 = [31,31,31,31]2151; AVX512-NEXT: vpand %xmm3, %xmm2, %xmm42152; AVX512-NEXT: vpsrlvd %xmm4, %xmm1, %xmm12153; AVX512-NEXT: vpandn %xmm3, %xmm2, %xmm22154; AVX512-NEXT: vpaddd %xmm0, %xmm0, %xmm02155; AVX512-NEXT: vpsllvd %xmm2, %xmm0, %xmm02156; AVX512-NEXT: vpor %xmm1, %xmm0, %xmm02157; AVX512-NEXT: retq2158 %v = call <4 x i32> @llvm.vp.fshr.v4i32(<4 x i32> %va, <4 x i32> %vb, <4 x i32> %vc, <4 x i1> %m, i32 %evl)2159 ret <4 x i32> %v2160}2161declare <4 x i32> @llvm.vp.fshr.v4i32(<4 x i32>, <4 x i32>, <4 x i32>, <4 x i1>, i32)2162