672 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc < %s -mtriple=x86_64-linux | FileCheck %s --check-prefix=X643; RUN: llc < %s -mtriple=x86_64-linux -mattr=+avx2 | FileCheck %s --check-prefix=X64-AVX24; RUN: llc < %s -mtriple=i686 -mattr=cmov | FileCheck %s --check-prefix=X865 6declare <2 x i64> @llvm.ushl.sat.v2i64(<2 x i64>, <2 x i64>)7declare <4 x i32> @llvm.ushl.sat.v4i32(<4 x i32>, <4 x i32>)8declare <8 x i16> @llvm.ushl.sat.v8i16(<8 x i16>, <8 x i16>)9declare <16 x i8> @llvm.ushl.sat.v16i8(<16 x i8>, <16 x i8>)10 11define <2 x i64> @vec_v2i64(<2 x i64> %x, <2 x i64> %y) nounwind {12; X64-LABEL: vec_v2i64:13; X64: # %bb.0:14; X64-NEXT: movdqa %xmm0, %xmm215; X64-NEXT: psllq %xmm1, %xmm216; X64-NEXT: pshufd {{.*#+}} xmm3 = xmm1[2,3,2,3]17; X64-NEXT: movdqa %xmm0, %xmm418; X64-NEXT: psllq %xmm3, %xmm419; X64-NEXT: movdqa %xmm4, %xmm520; X64-NEXT: movsd {{.*#+}} xmm4 = xmm2[0],xmm4[1]21; X64-NEXT: psrlq %xmm1, %xmm222; X64-NEXT: psrlq %xmm3, %xmm523; X64-NEXT: movsd {{.*#+}} xmm5 = xmm2[0],xmm5[1]24; X64-NEXT: pcmpeqd %xmm5, %xmm025; X64-NEXT: pshufd {{.*#+}} xmm1 = xmm0[1,0,3,2]26; X64-NEXT: pand %xmm1, %xmm027; X64-NEXT: pcmpeqd %xmm1, %xmm128; X64-NEXT: pxor %xmm1, %xmm029; X64-NEXT: por %xmm4, %xmm030; X64-NEXT: retq31;32; X64-AVX2-LABEL: vec_v2i64:33; X64-AVX2: # %bb.0:34; X64-AVX2-NEXT: vpsllvq %xmm1, %xmm0, %xmm235; X64-AVX2-NEXT: vpsrlvq %xmm1, %xmm2, %xmm136; X64-AVX2-NEXT: vpcmpeqq %xmm1, %xmm0, %xmm037; X64-AVX2-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm138; X64-AVX2-NEXT: vblendvpd %xmm0, %xmm2, %xmm1, %xmm039; X64-AVX2-NEXT: retq40;41; X86-LABEL: vec_v2i64:42; X86: # %bb.0:43; X86-NEXT: pushl %ebp44; X86-NEXT: pushl %ebx45; X86-NEXT: pushl %edi46; X86-NEXT: pushl %esi47; X86-NEXT: subl $16, %esp48; X86-NEXT: movzbl {{[0-9]+}}(%esp), %ecx49; X86-NEXT: movl {{[0-9]+}}(%esp), %esi50; X86-NEXT: movl {{[0-9]+}}(%esp), %edx51; X86-NEXT: movl %esi, %eax52; X86-NEXT: shll %cl, %eax53; X86-NEXT: shldl %cl, %esi, %edx54; X86-NEXT: xorl %ebx, %ebx55; X86-NEXT: testb $32, %cl56; X86-NEXT: cmovnel %eax, %edx57; X86-NEXT: cmovnel %ebx, %eax58; X86-NEXT: movl %eax, (%esp) # 4-byte Spill59; X86-NEXT: movl %edx, %eax60; X86-NEXT: movl %edx, %ebp61; X86-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill62; X86-NEXT: shrl %cl, %eax63; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill64; X86-NEXT: testb $32, %cl65; X86-NEXT: cmovnel %ebx, %eax66; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill67; X86-NEXT: movb {{[0-9]+}}(%esp), %ch68; X86-NEXT: movl {{[0-9]+}}(%esp), %eax69; X86-NEXT: movl %eax, %esi70; X86-NEXT: movb %ch, %cl71; X86-NEXT: shll %cl, %esi72; X86-NEXT: movl {{[0-9]+}}(%esp), %edx73; X86-NEXT: shldl %cl, %eax, %edx74; X86-NEXT: testb $32, %ch75; X86-NEXT: cmovnel %esi, %edx76; X86-NEXT: cmovnel %ebx, %esi77; X86-NEXT: movl %edx, %edi78; X86-NEXT: shrl %cl, %edi79; X86-NEXT: testb $32, %ch80; X86-NEXT: cmovel %edi, %ebx81; X86-NEXT: movl (%esp), %eax # 4-byte Reload82; X86-NEXT: movb {{[0-9]+}}(%esp), %cl83; X86-NEXT: shrdl %cl, %ebp, %eax84; X86-NEXT: testb $32, %cl85; X86-NEXT: cmovnel {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Folded Reload86; X86-NEXT: movl %esi, %ebp87; X86-NEXT: movb %ch, %cl88; X86-NEXT: shrdl %cl, %edx, %ebp89; X86-NEXT: testb $32, %ch90; X86-NEXT: cmovnel %edi, %ebp91; X86-NEXT: xorl {{[0-9]+}}(%esp), %eax92; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload93; X86-NEXT: xorl {{[0-9]+}}(%esp), %ecx94; X86-NEXT: orl %eax, %ecx95; X86-NEXT: movl $-1, %ecx96; X86-NEXT: movl (%esp), %edi # 4-byte Reload97; X86-NEXT: cmovnel %ecx, %edi98; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload99; X86-NEXT: cmovnel %ecx, %eax100; X86-NEXT: xorl {{[0-9]+}}(%esp), %ebp101; X86-NEXT: xorl {{[0-9]+}}(%esp), %ebx102; X86-NEXT: orl %ebp, %ebx103; X86-NEXT: cmovnel %ecx, %esi104; X86-NEXT: cmovnel %ecx, %edx105; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx106; X86-NEXT: movl %edx, 12(%ecx)107; X86-NEXT: movl %esi, 8(%ecx)108; X86-NEXT: movl %eax, 4(%ecx)109; X86-NEXT: movl %edi, (%ecx)110; X86-NEXT: movl %ecx, %eax111; X86-NEXT: addl $16, %esp112; X86-NEXT: popl %esi113; X86-NEXT: popl %edi114; X86-NEXT: popl %ebx115; X86-NEXT: popl %ebp116; X86-NEXT: retl $4117 %tmp = call <2 x i64> @llvm.ushl.sat.v2i64(<2 x i64> %x, <2 x i64> %y)118 ret <2 x i64> %tmp119}120 121define <4 x i32> @vec_v4i32(<4 x i32> %x, <4 x i32> %y) nounwind {122; X64-LABEL: vec_v4i32:123; X64: # %bb.0:124; X64-NEXT: pshufd {{.*#+}} xmm2 = xmm1[2,3,2,3]125; X64-NEXT: pshuflw {{.*#+}} xmm3 = xmm1[2,3,3,3,4,5,6,7]126; X64-NEXT: pshuflw {{.*#+}} xmm4 = xmm1[0,1,1,1,4,5,6,7]127; X64-NEXT: pslld $23, %xmm1128; X64-NEXT: paddd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1129; X64-NEXT: cvttps2dq %xmm1, %xmm1130; X64-NEXT: movdqa %xmm0, %xmm5131; X64-NEXT: pmuludq %xmm1, %xmm5132; X64-NEXT: pshufd {{.*#+}} xmm6 = xmm5[0,2,2,3]133; X64-NEXT: pshufd {{.*#+}} xmm7 = xmm0[1,1,3,3]134; X64-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]135; X64-NEXT: pmuludq %xmm7, %xmm1136; X64-NEXT: pshufd {{.*#+}} xmm1 = xmm1[0,2,2,3]137; X64-NEXT: punpckldq {{.*#+}} xmm6 = xmm6[0],xmm1[0],xmm6[1],xmm1[1]138; X64-NEXT: pshuflw {{.*#+}} xmm1 = xmm2[2,3,3,3,4,5,6,7]139; X64-NEXT: movdqa %xmm6, %xmm7140; X64-NEXT: psrld %xmm1, %xmm7141; X64-NEXT: pshuflw {{.*#+}} xmm1 = xmm2[0,1,1,1,4,5,6,7]142; X64-NEXT: movdqa %xmm5, %xmm2143; X64-NEXT: psrld %xmm1, %xmm2144; X64-NEXT: punpckhqdq {{.*#+}} xmm2 = xmm2[1],xmm7[1]145; X64-NEXT: movdqa %xmm6, %xmm1146; X64-NEXT: psrld %xmm3, %xmm1147; X64-NEXT: psrld %xmm4, %xmm5148; X64-NEXT: punpcklqdq {{.*#+}} xmm5 = xmm5[0],xmm1[0]149; X64-NEXT: shufps {{.*#+}} xmm5 = xmm5[0,3],xmm2[0,3]150; X64-NEXT: pcmpeqd %xmm5, %xmm0151; X64-NEXT: pcmpeqd %xmm1, %xmm1152; X64-NEXT: pxor %xmm1, %xmm0153; X64-NEXT: por %xmm6, %xmm0154; X64-NEXT: retq155;156; X64-AVX2-LABEL: vec_v4i32:157; X64-AVX2: # %bb.0:158; X64-AVX2-NEXT: vpsllvd %xmm1, %xmm0, %xmm2159; X64-AVX2-NEXT: vpsrlvd %xmm1, %xmm2, %xmm1160; X64-AVX2-NEXT: vpcmpeqd %xmm1, %xmm0, %xmm0161; X64-AVX2-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1162; X64-AVX2-NEXT: vblendvps %xmm0, %xmm2, %xmm1, %xmm0163; X64-AVX2-NEXT: retq164;165; X86-LABEL: vec_v4i32:166; X86: # %bb.0:167; X86-NEXT: pushl %ebp168; X86-NEXT: pushl %ebx169; X86-NEXT: pushl %edi170; X86-NEXT: pushl %esi171; X86-NEXT: movb {{[0-9]+}}(%esp), %ch172; X86-NEXT: movb {{[0-9]+}}(%esp), %ah173; X86-NEXT: movl {{[0-9]+}}(%esp), %edi174; X86-NEXT: movb {{[0-9]+}}(%esp), %cl175; X86-NEXT: movl {{[0-9]+}}(%esp), %ebx176; X86-NEXT: movl %ebx, %esi177; X86-NEXT: shll %cl, %esi178; X86-NEXT: movl %esi, %ebp179; X86-NEXT: shrl %cl, %ebp180; X86-NEXT: cmpl %ebp, %ebx181; X86-NEXT: movl $-1, %edx182; X86-NEXT: cmovnel %edx, %esi183; X86-NEXT: movl $-1, %ebx184; X86-NEXT: movl %edi, %edx185; X86-NEXT: movb %ah, %cl186; X86-NEXT: shll %cl, %edx187; X86-NEXT: movl %edx, %ebp188; X86-NEXT: shrl %cl, %ebp189; X86-NEXT: cmpl %ebp, %edi190; X86-NEXT: cmovnel %ebx, %edx191; X86-NEXT: movl $-1, %eax192; X86-NEXT: movl {{[0-9]+}}(%esp), %edi193; X86-NEXT: movb %ch, %cl194; X86-NEXT: shll %cl, %edi195; X86-NEXT: movl %edi, %ebp196; X86-NEXT: shrl %cl, %ebp197; X86-NEXT: cmpl %ebp, {{[0-9]+}}(%esp)198; X86-NEXT: movl {{[0-9]+}}(%esp), %ebx199; X86-NEXT: cmovnel %eax, %edi200; X86-NEXT: movl %ebx, %ebp201; X86-NEXT: movzbl {{[0-9]+}}(%esp), %ecx202; X86-NEXT: shll %cl, %ebp203; X86-NEXT: movl %ebp, %eax204; X86-NEXT: shrl %cl, %eax205; X86-NEXT: cmpl %eax, %ebx206; X86-NEXT: movl $-1, %eax207; X86-NEXT: cmovnel %eax, %ebp208; X86-NEXT: movl {{[0-9]+}}(%esp), %eax209; X86-NEXT: movl %ebp, 12(%eax)210; X86-NEXT: movl %edi, 8(%eax)211; X86-NEXT: movl %edx, 4(%eax)212; X86-NEXT: movl %esi, (%eax)213; X86-NEXT: popl %esi214; X86-NEXT: popl %edi215; X86-NEXT: popl %ebx216; X86-NEXT: popl %ebp217; X86-NEXT: retl $4218 %tmp = call <4 x i32> @llvm.ushl.sat.v4i32(<4 x i32> %x, <4 x i32> %y)219 ret <4 x i32> %tmp220}221 222define <8 x i16> @vec_v8i16(<8 x i16> %x, <8 x i16> %y) nounwind {223; X64-LABEL: vec_v8i16:224; X64: # %bb.0:225; X64-NEXT: movdqa %xmm1, %xmm2226; X64-NEXT: punpckhwd {{.*#+}} xmm2 = xmm2[4,4,5,5,6,6,7,7]227; X64-NEXT: pslld $23, %xmm2228; X64-NEXT: movdqa {{.*#+}} xmm3 = [1065353216,1065353216,1065353216,1065353216]229; X64-NEXT: paddd %xmm3, %xmm2230; X64-NEXT: cvttps2dq %xmm2, %xmm4231; X64-NEXT: pslld $16, %xmm4232; X64-NEXT: psrad $16, %xmm4233; X64-NEXT: movdqa %xmm1, %xmm2234; X64-NEXT: punpcklwd {{.*#+}} xmm2 = xmm2[0,0,1,1,2,2,3,3]235; X64-NEXT: pslld $23, %xmm2236; X64-NEXT: paddd %xmm3, %xmm2237; X64-NEXT: cvttps2dq %xmm2, %xmm2238; X64-NEXT: pslld $16, %xmm2239; X64-NEXT: psrad $16, %xmm2240; X64-NEXT: packssdw %xmm4, %xmm2241; X64-NEXT: pmullw %xmm0, %xmm2242; X64-NEXT: psllw $12, %xmm1243; X64-NEXT: movdqa %xmm1, %xmm3244; X64-NEXT: psraw $15, %xmm3245; X64-NEXT: movdqa %xmm2, %xmm4246; X64-NEXT: psrlw $8, %xmm4247; X64-NEXT: pand %xmm3, %xmm4248; X64-NEXT: pandn %xmm2, %xmm3249; X64-NEXT: por %xmm4, %xmm3250; X64-NEXT: paddw %xmm1, %xmm1251; X64-NEXT: movdqa %xmm1, %xmm4252; X64-NEXT: psraw $15, %xmm4253; X64-NEXT: movdqa %xmm4, %xmm5254; X64-NEXT: pandn %xmm3, %xmm5255; X64-NEXT: psrlw $4, %xmm3256; X64-NEXT: pand %xmm4, %xmm3257; X64-NEXT: por %xmm5, %xmm3258; X64-NEXT: paddw %xmm1, %xmm1259; X64-NEXT: movdqa %xmm1, %xmm4260; X64-NEXT: psraw $15, %xmm4261; X64-NEXT: movdqa %xmm4, %xmm5262; X64-NEXT: pandn %xmm3, %xmm5263; X64-NEXT: psrlw $2, %xmm3264; X64-NEXT: pand %xmm4, %xmm3265; X64-NEXT: por %xmm5, %xmm3266; X64-NEXT: paddw %xmm1, %xmm1267; X64-NEXT: psraw $15, %xmm1268; X64-NEXT: movdqa %xmm1, %xmm4269; X64-NEXT: pandn %xmm3, %xmm4270; X64-NEXT: psrlw $1, %xmm3271; X64-NEXT: pand %xmm1, %xmm3272; X64-NEXT: por %xmm4, %xmm3273; X64-NEXT: pcmpeqw %xmm3, %xmm0274; X64-NEXT: pcmpeqd %xmm1, %xmm1275; X64-NEXT: pxor %xmm1, %xmm0276; X64-NEXT: por %xmm2, %xmm0277; X64-NEXT: retq278;279; X64-AVX2-LABEL: vec_v8i16:280; X64-AVX2: # %bb.0:281; X64-AVX2-NEXT: vpmovzxwd {{.*#+}} ymm1 = xmm1[0],zero,xmm1[1],zero,xmm1[2],zero,xmm1[3],zero,xmm1[4],zero,xmm1[5],zero,xmm1[6],zero,xmm1[7],zero282; X64-AVX2-NEXT: vpmovzxwd {{.*#+}} ymm2 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero283; X64-AVX2-NEXT: vpsllvd %ymm1, %ymm2, %ymm2284; X64-AVX2-NEXT: vpshufb {{.*#+}} ymm2 = ymm2[0,1,4,5,8,9,12,13,u,u,u,u,u,u,u,u,16,17,20,21,24,25,28,29,24,25,28,29,28,29,30,31]285; X64-AVX2-NEXT: vpermq {{.*#+}} ymm2 = ymm2[0,2,2,3]286; X64-AVX2-NEXT: vpmovzxwd {{.*#+}} ymm3 = xmm2[0],zero,xmm2[1],zero,xmm2[2],zero,xmm2[3],zero,xmm2[4],zero,xmm2[5],zero,xmm2[6],zero,xmm2[7],zero287; X64-AVX2-NEXT: vpsrlvd %ymm1, %ymm3, %ymm1288; X64-AVX2-NEXT: vextracti128 $1, %ymm1, %xmm3289; X64-AVX2-NEXT: vpackusdw %xmm3, %xmm1, %xmm1290; X64-AVX2-NEXT: vpcmpeqw %xmm1, %xmm0, %xmm0291; X64-AVX2-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1292; X64-AVX2-NEXT: vpxor %xmm1, %xmm0, %xmm0293; X64-AVX2-NEXT: vpor %xmm2, %xmm0, %xmm0294; X64-AVX2-NEXT: vzeroupper295; X64-AVX2-NEXT: retq296;297; X86-LABEL: vec_v8i16:298; X86: # %bb.0:299; X86-NEXT: pushl %ebp300; X86-NEXT: pushl %ebx301; X86-NEXT: pushl %edi302; X86-NEXT: pushl %esi303; X86-NEXT: subl $16, %esp304; X86-NEXT: movl {{[0-9]+}}(%esp), %ebx305; X86-NEXT: movl {{[0-9]+}}(%esp), %ebp306; X86-NEXT: movl %ebp, %edi307; X86-NEXT: movl {{[0-9]+}}(%esp), %eax308; X86-NEXT: movl %eax, %edx309; X86-NEXT: movzbl {{[0-9]+}}(%esp), %ecx310; X86-NEXT: shll %cl, %eax311; X86-NEXT: movzwl %ax, %esi312; X86-NEXT: shrl %cl, %esi313; X86-NEXT: cmpw %si, %dx314; X86-NEXT: movzbl {{[0-9]+}}(%esp), %ecx315; X86-NEXT: movl $65535, %edx # imm = 0xFFFF316; X86-NEXT: cmovnel %edx, %eax317; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill318; X86-NEXT: shll %cl, %ebp319; X86-NEXT: movzwl %bp, %eax320; X86-NEXT: shrl %cl, %eax321; X86-NEXT: cmpw %ax, %di322; X86-NEXT: movl %ebx, %eax323; X86-NEXT: movzbl {{[0-9]+}}(%esp), %ecx324; X86-NEXT: cmovnel %edx, %ebp325; X86-NEXT: movl %ebp, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill326; X86-NEXT: shll %cl, %ebx327; X86-NEXT: movzwl %bx, %edx328; X86-NEXT: shrl %cl, %edx329; X86-NEXT: cmpw %dx, %ax330; X86-NEXT: movl {{[0-9]+}}(%esp), %edi331; X86-NEXT: movl %edi, %eax332; X86-NEXT: movzbl {{[0-9]+}}(%esp), %ecx333; X86-NEXT: movl $65535, %esi # imm = 0xFFFF334; X86-NEXT: cmovnel %esi, %ebx335; X86-NEXT: movl %ebx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill336; X86-NEXT: shll %cl, %edi337; X86-NEXT: movzwl %di, %edx338; X86-NEXT: shrl %cl, %edx339; X86-NEXT: cmpw %dx, %ax340; X86-NEXT: movl {{[0-9]+}}(%esp), %ebp341; X86-NEXT: movl %ebp, %eax342; X86-NEXT: cmovnel %esi, %edi343; X86-NEXT: movl %edi, (%esp) # 4-byte Spill344; X86-NEXT: movzbl {{[0-9]+}}(%esp), %ecx345; X86-NEXT: shll %cl, %ebp346; X86-NEXT: movzwl %bp, %edx347; X86-NEXT: shrl %cl, %edx348; X86-NEXT: cmpw %dx, %ax349; X86-NEXT: movl {{[0-9]+}}(%esp), %edi350; X86-NEXT: cmovnel %esi, %ebp351; X86-NEXT: movzbl {{[0-9]+}}(%esp), %ecx352; X86-NEXT: movl %edi, %eax353; X86-NEXT: shll %cl, %edi354; X86-NEXT: movzwl %di, %edx355; X86-NEXT: shrl %cl, %edx356; X86-NEXT: cmpw %dx, %ax357; X86-NEXT: cmovnel %esi, %edi358; X86-NEXT: movl $65535, %ebx # imm = 0xFFFF359; X86-NEXT: movzbl {{[0-9]+}}(%esp), %ecx360; X86-NEXT: movl {{[0-9]+}}(%esp), %edx361; X86-NEXT: movl %edx, %esi362; X86-NEXT: shll %cl, %edx363; X86-NEXT: movzwl %dx, %eax364; X86-NEXT: shrl %cl, %eax365; X86-NEXT: cmpw %ax, %si366; X86-NEXT: cmovnel %ebx, %edx367; X86-NEXT: movzbl {{[0-9]+}}(%esp), %ecx368; X86-NEXT: movl {{[0-9]+}}(%esp), %eax369; X86-NEXT: movl %eax, %ebx370; X86-NEXT: shll %cl, %eax371; X86-NEXT: movzwl %ax, %esi372; X86-NEXT: shrl %cl, %esi373; X86-NEXT: cmpw %si, %bx374; X86-NEXT: movl $65535, %ecx # imm = 0xFFFF375; X86-NEXT: cmovnel %ecx, %eax376; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx377; X86-NEXT: movw %ax, 14(%ecx)378; X86-NEXT: movw %dx, 12(%ecx)379; X86-NEXT: movw %di, 10(%ecx)380; X86-NEXT: movw %bp, 8(%ecx)381; X86-NEXT: movl (%esp), %eax # 4-byte Reload382; X86-NEXT: movw %ax, 6(%ecx)383; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload384; X86-NEXT: movw %ax, 4(%ecx)385; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload386; X86-NEXT: movw %ax, 2(%ecx)387; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload388; X86-NEXT: movw %ax, (%ecx)389; X86-NEXT: movl %ecx, %eax390; X86-NEXT: addl $16, %esp391; X86-NEXT: popl %esi392; X86-NEXT: popl %edi393; X86-NEXT: popl %ebx394; X86-NEXT: popl %ebp395; X86-NEXT: retl $4396 %tmp = call <8 x i16> @llvm.ushl.sat.v8i16(<8 x i16> %x, <8 x i16> %y)397 ret <8 x i16> %tmp398}399 400define <16 x i8> @vec_v16i8(<16 x i8> %x, <16 x i8> %y) nounwind {401; X64-LABEL: vec_v16i8:402; X64: # %bb.0:403; X64-NEXT: psllw $5, %xmm1404; X64-NEXT: pxor %xmm3, %xmm3405; X64-NEXT: pxor %xmm4, %xmm4406; X64-NEXT: pcmpgtb %xmm1, %xmm4407; X64-NEXT: movdqa %xmm4, %xmm5408; X64-NEXT: pandn %xmm0, %xmm5409; X64-NEXT: movdqa %xmm0, %xmm2410; X64-NEXT: psllw $4, %xmm2411; X64-NEXT: pand %xmm4, %xmm2412; X64-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2413; X64-NEXT: por %xmm5, %xmm2414; X64-NEXT: paddb %xmm1, %xmm1415; X64-NEXT: pxor %xmm5, %xmm5416; X64-NEXT: pcmpgtb %xmm1, %xmm5417; X64-NEXT: movdqa %xmm5, %xmm6418; X64-NEXT: pandn %xmm2, %xmm6419; X64-NEXT: psllw $2, %xmm2420; X64-NEXT: pand %xmm5, %xmm2421; X64-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2422; X64-NEXT: por %xmm6, %xmm2423; X64-NEXT: paddb %xmm1, %xmm1424; X64-NEXT: pcmpgtb %xmm1, %xmm3425; X64-NEXT: movdqa %xmm3, %xmm1426; X64-NEXT: pandn %xmm2, %xmm1427; X64-NEXT: paddb %xmm2, %xmm2428; X64-NEXT: pand %xmm3, %xmm2429; X64-NEXT: por %xmm1, %xmm2430; X64-NEXT: movdqa %xmm2, %xmm1431; X64-NEXT: psrlw $4, %xmm1432; X64-NEXT: pand %xmm4, %xmm1433; X64-NEXT: pandn %xmm2, %xmm4434; X64-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1435; X64-NEXT: por %xmm4, %xmm1436; X64-NEXT: movdqa %xmm5, %xmm4437; X64-NEXT: pandn %xmm1, %xmm4438; X64-NEXT: psrlw $2, %xmm1439; X64-NEXT: pand %xmm5, %xmm1440; X64-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1441; X64-NEXT: por %xmm4, %xmm1442; X64-NEXT: movdqa %xmm3, %xmm4443; X64-NEXT: pandn %xmm1, %xmm4444; X64-NEXT: psrlw $1, %xmm1445; X64-NEXT: pand %xmm3, %xmm1446; X64-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1447; X64-NEXT: por %xmm4, %xmm1448; X64-NEXT: pcmpeqb %xmm1, %xmm0449; X64-NEXT: pcmpeqd %xmm1, %xmm1450; X64-NEXT: pxor %xmm1, %xmm0451; X64-NEXT: por %xmm2, %xmm0452; X64-NEXT: retq453;454; X64-AVX2-LABEL: vec_v16i8:455; X64-AVX2: # %bb.0:456; X64-AVX2-NEXT: vpsllw $5, %xmm1, %xmm1457; X64-AVX2-NEXT: vpsllw $4, %xmm0, %xmm2458; X64-AVX2-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2, %xmm2459; X64-AVX2-NEXT: vpblendvb %xmm1, %xmm2, %xmm0, %xmm2460; X64-AVX2-NEXT: vpsllw $2, %xmm2, %xmm3461; X64-AVX2-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm3, %xmm3462; X64-AVX2-NEXT: vpaddb %xmm1, %xmm1, %xmm4463; X64-AVX2-NEXT: vpblendvb %xmm4, %xmm3, %xmm2, %xmm2464; X64-AVX2-NEXT: vpaddb %xmm2, %xmm2, %xmm3465; X64-AVX2-NEXT: vpaddb %xmm4, %xmm4, %xmm5466; X64-AVX2-NEXT: vpblendvb %xmm5, %xmm3, %xmm2, %xmm2467; X64-AVX2-NEXT: vpsrlw $4, %xmm2, %xmm3468; X64-AVX2-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm3, %xmm3469; X64-AVX2-NEXT: vpblendvb %xmm1, %xmm3, %xmm2, %xmm1470; X64-AVX2-NEXT: vpsrlw $2, %xmm1, %xmm3471; X64-AVX2-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm3, %xmm3472; X64-AVX2-NEXT: vpblendvb %xmm4, %xmm3, %xmm1, %xmm1473; X64-AVX2-NEXT: vpsrlw $1, %xmm1, %xmm3474; X64-AVX2-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm3, %xmm3475; X64-AVX2-NEXT: vpblendvb %xmm5, %xmm3, %xmm1, %xmm1476; X64-AVX2-NEXT: vpcmpeqb %xmm1, %xmm0, %xmm0477; X64-AVX2-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1478; X64-AVX2-NEXT: vpblendvb %xmm0, %xmm2, %xmm1, %xmm0479; X64-AVX2-NEXT: retq480;481; X86-LABEL: vec_v16i8:482; X86: # %bb.0:483; X86-NEXT: pushl %ebp484; X86-NEXT: pushl %ebx485; X86-NEXT: pushl %edi486; X86-NEXT: pushl %esi487; X86-NEXT: subl $48, %esp488; X86-NEXT: movzbl {{[0-9]+}}(%esp), %eax489; X86-NEXT: movzbl {{[0-9]+}}(%esp), %edx490; X86-NEXT: movb {{[0-9]+}}(%esp), %ch491; X86-NEXT: movb {{[0-9]+}}(%esp), %ah492; X86-NEXT: movb {{[0-9]+}}(%esp), %dh493; X86-NEXT: movb {{[0-9]+}}(%esp), %cl494; X86-NEXT: movzbl {{[0-9]+}}(%esp), %ebx495; X86-NEXT: movb %bl, %bh496; X86-NEXT: shlb %cl, %bh497; X86-NEXT: movzbl %bh, %edi498; X86-NEXT: shrb %cl, %bh499; X86-NEXT: cmpb %bh, %bl500; X86-NEXT: movl $255, %esi501; X86-NEXT: cmovnel %esi, %edi502; X86-NEXT: movl %edi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill503; X86-NEXT: movb %dh, %bl504; X86-NEXT: movb %ah, %cl505; X86-NEXT: shlb %cl, %bl506; X86-NEXT: movzbl %bl, %edi507; X86-NEXT: shrb %cl, %bl508; X86-NEXT: cmpb %bl, %dh509; X86-NEXT: cmovnel %esi, %edi510; X86-NEXT: movl %edi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill511; X86-NEXT: movb %ch, %ah512; X86-NEXT: movb %dl, %cl513; X86-NEXT: shlb %cl, %ah514; X86-NEXT: movzbl %ah, %edi515; X86-NEXT: shrb %cl, %ah516; X86-NEXT: movzbl {{[0-9]+}}(%esp), %edx517; X86-NEXT: cmpb %ah, %ch518; X86-NEXT: cmovnel %esi, %edi519; X86-NEXT: movl %edi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill520; X86-NEXT: movb %dl, %ah521; X86-NEXT: movl %eax, %ecx522; X86-NEXT: shlb %cl, %ah523; X86-NEXT: movzbl %ah, %edi524; X86-NEXT: shrb %cl, %ah525; X86-NEXT: cmpb %ah, %dl526; X86-NEXT: movzbl {{[0-9]+}}(%esp), %ecx527; X86-NEXT: movzbl {{[0-9]+}}(%esp), %eax528; X86-NEXT: cmovnel %esi, %edi529; X86-NEXT: movl %edi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill530; X86-NEXT: movl %eax, %edx531; X86-NEXT: shlb %cl, %dl532; X86-NEXT: movzbl %dl, %edi533; X86-NEXT: shrb %cl, %dl534; X86-NEXT: cmpb %dl, %al535; X86-NEXT: cmovnel %esi, %edi536; X86-NEXT: movl %edi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill537; X86-NEXT: movzbl {{[0-9]+}}(%esp), %ecx538; X86-NEXT: movzbl {{[0-9]+}}(%esp), %eax539; X86-NEXT: movl %eax, %edx540; X86-NEXT: shlb %cl, %dl541; X86-NEXT: movzbl %dl, %edi542; X86-NEXT: shrb %cl, %dl543; X86-NEXT: cmpb %dl, %al544; X86-NEXT: cmovnel %esi, %edi545; X86-NEXT: movl %edi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill546; X86-NEXT: movzbl {{[0-9]+}}(%esp), %ecx547; X86-NEXT: movzbl {{[0-9]+}}(%esp), %eax548; X86-NEXT: movl %eax, %edx549; X86-NEXT: shlb %cl, %dl550; X86-NEXT: movzbl %dl, %edi551; X86-NEXT: shrb %cl, %dl552; X86-NEXT: cmpb %dl, %al553; X86-NEXT: cmovnel %esi, %edi554; X86-NEXT: movl %edi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill555; X86-NEXT: movzbl {{[0-9]+}}(%esp), %ecx556; X86-NEXT: movzbl {{[0-9]+}}(%esp), %eax557; X86-NEXT: movl %eax, %edx558; X86-NEXT: shlb %cl, %dl559; X86-NEXT: movzbl %dl, %edi560; X86-NEXT: shrb %cl, %dl561; X86-NEXT: cmpb %dl, %al562; X86-NEXT: cmovnel %esi, %edi563; X86-NEXT: movl %edi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill564; X86-NEXT: movzbl {{[0-9]+}}(%esp), %ecx565; X86-NEXT: movzbl {{[0-9]+}}(%esp), %eax566; X86-NEXT: movl %eax, %edx567; X86-NEXT: shlb %cl, %dl568; X86-NEXT: movzbl %dl, %edi569; X86-NEXT: shrb %cl, %dl570; X86-NEXT: cmpb %dl, %al571; X86-NEXT: cmovnel %esi, %edi572; X86-NEXT: movl %edi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill573; X86-NEXT: movzbl {{[0-9]+}}(%esp), %ecx574; X86-NEXT: movzbl {{[0-9]+}}(%esp), %eax575; X86-NEXT: movl %eax, %edx576; X86-NEXT: shlb %cl, %dl577; X86-NEXT: movzbl %dl, %edi578; X86-NEXT: shrb %cl, %dl579; X86-NEXT: cmpb %dl, %al580; X86-NEXT: cmovnel %esi, %edi581; X86-NEXT: movl %edi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill582; X86-NEXT: movzbl {{[0-9]+}}(%esp), %ecx583; X86-NEXT: movzbl {{[0-9]+}}(%esp), %eax584; X86-NEXT: movl %eax, %edx585; X86-NEXT: shlb %cl, %dl586; X86-NEXT: movzbl %dl, %edi587; X86-NEXT: shrb %cl, %dl588; X86-NEXT: cmpb %dl, %al589; X86-NEXT: cmovnel %esi, %edi590; X86-NEXT: movl %edi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill591; X86-NEXT: movzbl {{[0-9]+}}(%esp), %ecx592; X86-NEXT: movzbl {{[0-9]+}}(%esp), %eax593; X86-NEXT: movl %eax, %edx594; X86-NEXT: shlb %cl, %dl595; X86-NEXT: movzbl %dl, %edi596; X86-NEXT: shrb %cl, %dl597; X86-NEXT: cmpb %dl, %al598; X86-NEXT: cmovnel %esi, %edi599; X86-NEXT: movl %edi, (%esp) # 4-byte Spill600; X86-NEXT: movzbl {{[0-9]+}}(%esp), %ecx601; X86-NEXT: movzbl {{[0-9]+}}(%esp), %eax602; X86-NEXT: movl %eax, %edx603; X86-NEXT: shlb %cl, %dl604; X86-NEXT: movzbl %dl, %ebp605; X86-NEXT: shrb %cl, %dl606; X86-NEXT: cmpb %dl, %al607; X86-NEXT: cmovnel %esi, %ebp608; X86-NEXT: movzbl {{[0-9]+}}(%esp), %ecx609; X86-NEXT: movzbl {{[0-9]+}}(%esp), %eax610; X86-NEXT: movl %eax, %edx611; X86-NEXT: shlb %cl, %dl612; X86-NEXT: movzbl %dl, %edi613; X86-NEXT: shrb %cl, %dl614; X86-NEXT: cmpb %dl, %al615; X86-NEXT: cmovnel %esi, %edi616; X86-NEXT: movzbl {{[0-9]+}}(%esp), %ecx617; X86-NEXT: movzbl {{[0-9]+}}(%esp), %eax618; X86-NEXT: movl %eax, %edx619; X86-NEXT: shlb %cl, %dl620; X86-NEXT: movzbl %dl, %ebx621; X86-NEXT: shrb %cl, %dl622; X86-NEXT: cmpb %dl, %al623; X86-NEXT: cmovnel %esi, %ebx624; X86-NEXT: movzbl {{[0-9]+}}(%esp), %ecx625; X86-NEXT: movzbl {{[0-9]+}}(%esp), %eax626; X86-NEXT: movb %al, %ah627; X86-NEXT: shlb %cl, %ah628; X86-NEXT: movzbl %ah, %edx629; X86-NEXT: shrb %cl, %ah630; X86-NEXT: cmpb %ah, %al631; X86-NEXT: cmovnel %esi, %edx632; X86-NEXT: movl {{[0-9]+}}(%esp), %eax633; X86-NEXT: movb %dl, 15(%eax)634; X86-NEXT: movb %bl, 14(%eax)635; X86-NEXT: movl %edi, %ecx636; X86-NEXT: movb %cl, 13(%eax)637; X86-NEXT: movl %ebp, %ecx638; X86-NEXT: movb %cl, 12(%eax)639; X86-NEXT: movl (%esp), %ecx # 4-byte Reload640; X86-NEXT: movb %cl, 11(%eax)641; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload642; X86-NEXT: movb %cl, 10(%eax)643; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload644; X86-NEXT: movb %cl, 9(%eax)645; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload646; X86-NEXT: movb %cl, 8(%eax)647; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload648; X86-NEXT: movb %cl, 7(%eax)649; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload650; X86-NEXT: movb %cl, 6(%eax)651; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload652; X86-NEXT: movb %cl, 5(%eax)653; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload654; X86-NEXT: movb %cl, 4(%eax)655; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload656; X86-NEXT: movb %cl, 3(%eax)657; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload658; X86-NEXT: movb %cl, 2(%eax)659; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload660; X86-NEXT: movb %cl, 1(%eax)661; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload662; X86-NEXT: movb %cl, (%eax)663; X86-NEXT: addl $48, %esp664; X86-NEXT: popl %esi665; X86-NEXT: popl %edi666; X86-NEXT: popl %ebx667; X86-NEXT: popl %ebp668; X86-NEXT: retl $4669 %tmp = call <16 x i8> @llvm.ushl.sat.v16i8(<16 x i8> %x, <16 x i8> %y)670 ret <16 x i8> %tmp671}672