1693 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+sse4.2 | FileCheck %s --check-prefixes=SSE423; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx2 | FileCheck %s --check-prefixes=AVX24; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f,+avx512bw,+avx512cd,+avx512vl | FileCheck %s --check-prefixes=AVX512,AVX512VL5; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f,+avx512bw,+avx512cd,+avx512vl,+avx512vpopcntdq | FileCheck %s --check-prefixes=AVX512,AVX512VPOPCNT6 7;8; CTPOP9;10 11define <4 x i32> @widen_ctpop_v2i32_v4i32(<2 x i32> %a0, <2 x i32> %a1) {12; SSE42-LABEL: widen_ctpop_v2i32_v4i32:13; SSE42: # %bb.0:14; SSE42-NEXT: movdqa {{.*#+}} xmm2 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]15; SSE42-NEXT: movdqa %xmm0, %xmm316; SSE42-NEXT: pand %xmm2, %xmm317; SSE42-NEXT: movdqa {{.*#+}} xmm4 = [0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4]18; SSE42-NEXT: movdqa %xmm4, %xmm519; SSE42-NEXT: pshufb %xmm3, %xmm520; SSE42-NEXT: psrlw $4, %xmm021; SSE42-NEXT: pand %xmm2, %xmm022; SSE42-NEXT: movdqa %xmm4, %xmm323; SSE42-NEXT: pshufb %xmm0, %xmm324; SSE42-NEXT: paddb %xmm5, %xmm325; SSE42-NEXT: pmovzxdq {{.*#+}} xmm0 = xmm3[0],zero,xmm3[1],zero26; SSE42-NEXT: pxor %xmm3, %xmm327; SSE42-NEXT: psadbw %xmm3, %xmm028; SSE42-NEXT: movdqa %xmm1, %xmm529; SSE42-NEXT: pand %xmm2, %xmm530; SSE42-NEXT: movdqa %xmm4, %xmm631; SSE42-NEXT: pshufb %xmm5, %xmm632; SSE42-NEXT: psrlw $4, %xmm133; SSE42-NEXT: pand %xmm2, %xmm134; SSE42-NEXT: pshufb %xmm1, %xmm435; SSE42-NEXT: paddb %xmm6, %xmm436; SSE42-NEXT: pmovzxdq {{.*#+}} xmm1 = xmm4[0],zero,xmm4[1],zero37; SSE42-NEXT: psadbw %xmm3, %xmm138; SSE42-NEXT: packuswb %xmm1, %xmm039; SSE42-NEXT: retq40;41; AVX2-LABEL: widen_ctpop_v2i32_v4i32:42; AVX2: # %bb.0:43; AVX2-NEXT: vpbroadcastb {{.*#+}} xmm2 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]44; AVX2-NEXT: vpand %xmm2, %xmm0, %xmm345; AVX2-NEXT: vmovdqa {{.*#+}} xmm4 = [0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4]46; AVX2-NEXT: vpshufb %xmm3, %xmm4, %xmm347; AVX2-NEXT: vpsrlw $4, %xmm0, %xmm048; AVX2-NEXT: vpand %xmm2, %xmm0, %xmm049; AVX2-NEXT: vpshufb %xmm0, %xmm4, %xmm050; AVX2-NEXT: vpaddb %xmm3, %xmm0, %xmm051; AVX2-NEXT: vpmovzxdq {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero52; AVX2-NEXT: vpxor %xmm3, %xmm3, %xmm353; AVX2-NEXT: vpsadbw %xmm3, %xmm0, %xmm054; AVX2-NEXT: vpand %xmm2, %xmm1, %xmm555; AVX2-NEXT: vpshufb %xmm5, %xmm4, %xmm556; AVX2-NEXT: vpsrlw $4, %xmm1, %xmm157; AVX2-NEXT: vpand %xmm2, %xmm1, %xmm158; AVX2-NEXT: vpshufb %xmm1, %xmm4, %xmm159; AVX2-NEXT: vpaddb %xmm5, %xmm1, %xmm160; AVX2-NEXT: vpmovzxdq {{.*#+}} xmm1 = xmm1[0],zero,xmm1[1],zero61; AVX2-NEXT: vpsadbw %xmm3, %xmm1, %xmm162; AVX2-NEXT: vpackuswb %xmm1, %xmm0, %xmm063; AVX2-NEXT: retq64;65; AVX512VL-LABEL: widen_ctpop_v2i32_v4i32:66; AVX512VL: # %bb.0:67; AVX512VL-NEXT: vpbroadcastb {{.*#+}} xmm2 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]68; AVX512VL-NEXT: vpand %xmm2, %xmm0, %xmm369; AVX512VL-NEXT: vmovdqa {{.*#+}} xmm4 = [0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4]70; AVX512VL-NEXT: vpshufb %xmm3, %xmm4, %xmm371; AVX512VL-NEXT: vpsrlw $4, %xmm0, %xmm072; AVX512VL-NEXT: vpand %xmm2, %xmm0, %xmm073; AVX512VL-NEXT: vpshufb %xmm0, %xmm4, %xmm074; AVX512VL-NEXT: vpaddb %xmm3, %xmm0, %xmm075; AVX512VL-NEXT: vpmovzxdq {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero76; AVX512VL-NEXT: vpxor %xmm3, %xmm3, %xmm377; AVX512VL-NEXT: vpsadbw %xmm3, %xmm0, %xmm078; AVX512VL-NEXT: vpand %xmm2, %xmm1, %xmm579; AVX512VL-NEXT: vpshufb %xmm5, %xmm4, %xmm580; AVX512VL-NEXT: vpsrlw $4, %xmm1, %xmm181; AVX512VL-NEXT: vpand %xmm2, %xmm1, %xmm182; AVX512VL-NEXT: vpshufb %xmm1, %xmm4, %xmm183; AVX512VL-NEXT: vpaddb %xmm5, %xmm1, %xmm184; AVX512VL-NEXT: vpmovzxdq {{.*#+}} xmm1 = xmm1[0],zero,xmm1[1],zero85; AVX512VL-NEXT: vpsadbw %xmm3, %xmm1, %xmm186; AVX512VL-NEXT: vpackuswb %xmm1, %xmm0, %xmm087; AVX512VL-NEXT: retq88;89; AVX512VPOPCNT-LABEL: widen_ctpop_v2i32_v4i32:90; AVX512VPOPCNT: # %bb.0:91; AVX512VPOPCNT-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]92; AVX512VPOPCNT-NEXT: vpopcntd %xmm0, %xmm093; AVX512VPOPCNT-NEXT: retq94 %b0 = call <2 x i32> @llvm.ctpop.v2i32(<2 x i32> %a0)95 %b1 = call <2 x i32> @llvm.ctpop.v2i32(<2 x i32> %a1)96 %res = shufflevector <2 x i32> %b0, <2 x i32> %b1, <4 x i32> <i32 0, i32 1, i32 2, i32 3>97 ret <4 x i32> %res98}99 100define <8 x i32> @widen_ctpop_v4i32_v8i32(<4 x i32> %a0, <4 x i32> %a1) {101; SSE42-LABEL: widen_ctpop_v4i32_v8i32:102; SSE42: # %bb.0:103; SSE42-NEXT: movdqa {{.*#+}} xmm3 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]104; SSE42-NEXT: movdqa %xmm0, %xmm4105; SSE42-NEXT: pand %xmm3, %xmm4106; SSE42-NEXT: movdqa {{.*#+}} xmm2 = [0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4]107; SSE42-NEXT: movdqa %xmm2, %xmm5108; SSE42-NEXT: pshufb %xmm4, %xmm5109; SSE42-NEXT: psrlw $4, %xmm0110; SSE42-NEXT: pand %xmm3, %xmm0111; SSE42-NEXT: movdqa %xmm2, %xmm4112; SSE42-NEXT: pshufb %xmm0, %xmm4113; SSE42-NEXT: paddb %xmm5, %xmm4114; SSE42-NEXT: pxor %xmm5, %xmm5115; SSE42-NEXT: pmovzxdq {{.*#+}} xmm0 = xmm4[0],zero,xmm4[1],zero116; SSE42-NEXT: punpckhdq {{.*#+}} xmm4 = xmm4[2],xmm5[2],xmm4[3],xmm5[3]117; SSE42-NEXT: psadbw %xmm5, %xmm4118; SSE42-NEXT: psadbw %xmm5, %xmm0119; SSE42-NEXT: packuswb %xmm4, %xmm0120; SSE42-NEXT: movdqa %xmm1, %xmm4121; SSE42-NEXT: pand %xmm3, %xmm4122; SSE42-NEXT: movdqa %xmm2, %xmm6123; SSE42-NEXT: pshufb %xmm4, %xmm6124; SSE42-NEXT: psrlw $4, %xmm1125; SSE42-NEXT: pand %xmm3, %xmm1126; SSE42-NEXT: pshufb %xmm1, %xmm2127; SSE42-NEXT: paddb %xmm6, %xmm2128; SSE42-NEXT: pmovzxdq {{.*#+}} xmm1 = xmm2[0],zero,xmm2[1],zero129; SSE42-NEXT: punpckhdq {{.*#+}} xmm2 = xmm2[2],xmm5[2],xmm2[3],xmm5[3]130; SSE42-NEXT: psadbw %xmm5, %xmm2131; SSE42-NEXT: psadbw %xmm5, %xmm1132; SSE42-NEXT: packuswb %xmm2, %xmm1133; SSE42-NEXT: retq134;135; AVX2-LABEL: widen_ctpop_v4i32_v8i32:136; AVX2: # %bb.0:137; AVX2-NEXT: # kill: def $xmm0 killed $xmm0 def $ymm0138; AVX2-NEXT: vinserti128 $1, %xmm1, %ymm0, %ymm0139; AVX2-NEXT: vpbroadcastb {{.*#+}} ymm1 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]140; AVX2-NEXT: vpand %ymm1, %ymm0, %ymm2141; AVX2-NEXT: vbroadcasti128 {{.*#+}} ymm3 = [0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4,0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4]142; AVX2-NEXT: # ymm3 = mem[0,1,0,1]143; AVX2-NEXT: vpshufb %ymm2, %ymm3, %ymm2144; AVX2-NEXT: vpsrlw $4, %ymm0, %ymm0145; AVX2-NEXT: vpand %ymm1, %ymm0, %ymm0146; AVX2-NEXT: vpshufb %ymm0, %ymm3, %ymm0147; AVX2-NEXT: vpaddb %ymm2, %ymm0, %ymm0148; AVX2-NEXT: vpxor %xmm1, %xmm1, %xmm1149; AVX2-NEXT: vpunpckhdq {{.*#+}} ymm2 = ymm0[2],ymm1[2],ymm0[3],ymm1[3],ymm0[6],ymm1[6],ymm0[7],ymm1[7]150; AVX2-NEXT: vpsadbw %ymm1, %ymm2, %ymm2151; AVX2-NEXT: vpunpckldq {{.*#+}} ymm0 = ymm0[0],ymm1[0],ymm0[1],ymm1[1],ymm0[4],ymm1[4],ymm0[5],ymm1[5]152; AVX2-NEXT: vpsadbw %ymm1, %ymm0, %ymm0153; AVX2-NEXT: vpackuswb %ymm2, %ymm0, %ymm0154; AVX2-NEXT: retq155;156; AVX512VL-LABEL: widen_ctpop_v4i32_v8i32:157; AVX512VL: # %bb.0:158; AVX512VL-NEXT: # kill: def $xmm0 killed $xmm0 def $ymm0159; AVX512VL-NEXT: vinserti128 $1, %xmm1, %ymm0, %ymm0160; AVX512VL-NEXT: vpbroadcastb {{.*#+}} ymm1 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]161; AVX512VL-NEXT: vpand %ymm1, %ymm0, %ymm2162; AVX512VL-NEXT: vbroadcasti128 {{.*#+}} ymm3 = [0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4,0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4]163; AVX512VL-NEXT: # ymm3 = mem[0,1,0,1]164; AVX512VL-NEXT: vpshufb %ymm2, %ymm3, %ymm2165; AVX512VL-NEXT: vpsrlw $4, %ymm0, %ymm0166; AVX512VL-NEXT: vpand %ymm1, %ymm0, %ymm0167; AVX512VL-NEXT: vpshufb %ymm0, %ymm3, %ymm0168; AVX512VL-NEXT: vpaddb %ymm2, %ymm0, %ymm0169; AVX512VL-NEXT: vpxor %xmm1, %xmm1, %xmm1170; AVX512VL-NEXT: vpunpckhdq {{.*#+}} ymm2 = ymm0[2],ymm1[2],ymm0[3],ymm1[3],ymm0[6],ymm1[6],ymm0[7],ymm1[7]171; AVX512VL-NEXT: vpsadbw %ymm1, %ymm2, %ymm2172; AVX512VL-NEXT: vpunpckldq {{.*#+}} ymm0 = ymm0[0],ymm1[0],ymm0[1],ymm1[1],ymm0[4],ymm1[4],ymm0[5],ymm1[5]173; AVX512VL-NEXT: vpsadbw %ymm1, %ymm0, %ymm0174; AVX512VL-NEXT: vpackuswb %ymm2, %ymm0, %ymm0175; AVX512VL-NEXT: retq176;177; AVX512VPOPCNT-LABEL: widen_ctpop_v4i32_v8i32:178; AVX512VPOPCNT: # %bb.0:179; AVX512VPOPCNT-NEXT: # kill: def $xmm0 killed $xmm0 def $ymm0180; AVX512VPOPCNT-NEXT: vinserti128 $1, %xmm1, %ymm0, %ymm0181; AVX512VPOPCNT-NEXT: vpopcntd %ymm0, %ymm0182; AVX512VPOPCNT-NEXT: retq183 %b0 = call <4 x i32> @llvm.ctpop.v4i32(<4 x i32> %a0)184 %b1 = call <4 x i32> @llvm.ctpop.v4i32(<4 x i32> %a1)185 %res = shufflevector <4 x i32> %b0, <4 x i32> %b1, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>186 ret <8 x i32> %res187}188 189define <8 x i32> @widen_ctpop_v2i32_v8i32(<2 x i32> %a0, <2 x i32> %a1, <2 x i32> %a2, <2 x i32> %a3) {190; SSE42-LABEL: widen_ctpop_v2i32_v8i32:191; SSE42: # %bb.0:192; SSE42-NEXT: movdqa {{.*#+}} xmm5 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]193; SSE42-NEXT: movdqa %xmm0, %xmm6194; SSE42-NEXT: pand %xmm5, %xmm6195; SSE42-NEXT: movdqa {{.*#+}} xmm4 = [0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4]196; SSE42-NEXT: movdqa %xmm4, %xmm7197; SSE42-NEXT: pshufb %xmm6, %xmm7198; SSE42-NEXT: psrlw $4, %xmm0199; SSE42-NEXT: pand %xmm5, %xmm0200; SSE42-NEXT: movdqa %xmm4, %xmm6201; SSE42-NEXT: pshufb %xmm0, %xmm6202; SSE42-NEXT: paddb %xmm7, %xmm6203; SSE42-NEXT: pmovzxdq {{.*#+}} xmm0 = xmm6[0],zero,xmm6[1],zero204; SSE42-NEXT: pxor %xmm6, %xmm6205; SSE42-NEXT: psadbw %xmm6, %xmm0206; SSE42-NEXT: movdqa %xmm1, %xmm7207; SSE42-NEXT: pand %xmm5, %xmm7208; SSE42-NEXT: movdqa %xmm4, %xmm8209; SSE42-NEXT: pshufb %xmm7, %xmm8210; SSE42-NEXT: psrlw $4, %xmm1211; SSE42-NEXT: pand %xmm5, %xmm1212; SSE42-NEXT: movdqa %xmm4, %xmm7213; SSE42-NEXT: pshufb %xmm1, %xmm7214; SSE42-NEXT: paddb %xmm8, %xmm7215; SSE42-NEXT: pmovzxdq {{.*#+}} xmm1 = xmm7[0],zero,xmm7[1],zero216; SSE42-NEXT: psadbw %xmm6, %xmm1217; SSE42-NEXT: packuswb %xmm1, %xmm0218; SSE42-NEXT: movdqa %xmm2, %xmm1219; SSE42-NEXT: pand %xmm5, %xmm1220; SSE42-NEXT: movdqa %xmm4, %xmm7221; SSE42-NEXT: pshufb %xmm1, %xmm7222; SSE42-NEXT: psrlw $4, %xmm2223; SSE42-NEXT: pand %xmm5, %xmm2224; SSE42-NEXT: movdqa %xmm4, %xmm1225; SSE42-NEXT: pshufb %xmm2, %xmm1226; SSE42-NEXT: paddb %xmm7, %xmm1227; SSE42-NEXT: pmovzxdq {{.*#+}} xmm1 = xmm1[0],zero,xmm1[1],zero228; SSE42-NEXT: psadbw %xmm6, %xmm1229; SSE42-NEXT: movdqa %xmm3, %xmm2230; SSE42-NEXT: pand %xmm5, %xmm2231; SSE42-NEXT: movdqa %xmm4, %xmm7232; SSE42-NEXT: pshufb %xmm2, %xmm7233; SSE42-NEXT: psrlw $4, %xmm3234; SSE42-NEXT: pand %xmm5, %xmm3235; SSE42-NEXT: pshufb %xmm3, %xmm4236; SSE42-NEXT: paddb %xmm7, %xmm4237; SSE42-NEXT: pmovzxdq {{.*#+}} xmm2 = xmm4[0],zero,xmm4[1],zero238; SSE42-NEXT: psadbw %xmm6, %xmm2239; SSE42-NEXT: packuswb %xmm2, %xmm1240; SSE42-NEXT: retq241;242; AVX2-LABEL: widen_ctpop_v2i32_v8i32:243; AVX2: # %bb.0:244; AVX2-NEXT: # kill: def $xmm1 killed $xmm1 def $ymm1245; AVX2-NEXT: # kill: def $xmm0 killed $xmm0 def $ymm0246; AVX2-NEXT: vinserti128 $1, %xmm3, %ymm1, %ymm1247; AVX2-NEXT: vpbroadcastb {{.*#+}} ymm3 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]248; AVX2-NEXT: vpand %ymm3, %ymm1, %ymm4249; AVX2-NEXT: vbroadcasti128 {{.*#+}} ymm5 = [0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4,0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4]250; AVX2-NEXT: # ymm5 = mem[0,1,0,1]251; AVX2-NEXT: vpshufb %ymm4, %ymm5, %ymm4252; AVX2-NEXT: vpsrlw $4, %ymm1, %ymm1253; AVX2-NEXT: vpand %ymm3, %ymm1, %ymm1254; AVX2-NEXT: vpshufb %ymm1, %ymm5, %ymm1255; AVX2-NEXT: vpaddb %ymm4, %ymm1, %ymm1256; AVX2-NEXT: vpxor %xmm4, %xmm4, %xmm4257; AVX2-NEXT: vpunpckldq {{.*#+}} ymm1 = ymm1[0],ymm4[0],ymm1[1],ymm4[1],ymm1[4],ymm4[4],ymm1[5],ymm4[5]258; AVX2-NEXT: vpsadbw %ymm4, %ymm1, %ymm1259; AVX2-NEXT: vinserti128 $1, %xmm2, %ymm0, %ymm0260; AVX2-NEXT: vpand %ymm3, %ymm0, %ymm2261; AVX2-NEXT: vpshufb %ymm2, %ymm5, %ymm2262; AVX2-NEXT: vpsrlw $4, %ymm0, %ymm0263; AVX2-NEXT: vpand %ymm3, %ymm0, %ymm0264; AVX2-NEXT: vpshufb %ymm0, %ymm5, %ymm0265; AVX2-NEXT: vpaddb %ymm2, %ymm0, %ymm0266; AVX2-NEXT: vpunpckldq {{.*#+}} ymm0 = ymm0[0],ymm4[0],ymm0[1],ymm4[1],ymm0[4],ymm4[4],ymm0[5],ymm4[5]267; AVX2-NEXT: vpsadbw %ymm4, %ymm0, %ymm0268; AVX2-NEXT: vpackuswb %ymm1, %ymm0, %ymm0269; AVX2-NEXT: retq270;271; AVX512VL-LABEL: widen_ctpop_v2i32_v8i32:272; AVX512VL: # %bb.0:273; AVX512VL-NEXT: # kill: def $xmm1 killed $xmm1 def $ymm1274; AVX512VL-NEXT: # kill: def $xmm0 killed $xmm0 def $ymm0275; AVX512VL-NEXT: vinserti128 $1, %xmm3, %ymm1, %ymm1276; AVX512VL-NEXT: vpbroadcastb {{.*#+}} ymm3 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]277; AVX512VL-NEXT: vpand %ymm3, %ymm1, %ymm4278; AVX512VL-NEXT: vbroadcasti128 {{.*#+}} ymm5 = [0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4,0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4]279; AVX512VL-NEXT: # ymm5 = mem[0,1,0,1]280; AVX512VL-NEXT: vpshufb %ymm4, %ymm5, %ymm4281; AVX512VL-NEXT: vpsrlw $4, %ymm1, %ymm1282; AVX512VL-NEXT: vpand %ymm3, %ymm1, %ymm1283; AVX512VL-NEXT: vpshufb %ymm1, %ymm5, %ymm1284; AVX512VL-NEXT: vpaddb %ymm4, %ymm1, %ymm1285; AVX512VL-NEXT: vpxor %xmm4, %xmm4, %xmm4286; AVX512VL-NEXT: vpunpckldq {{.*#+}} ymm1 = ymm1[0],ymm4[0],ymm1[1],ymm4[1],ymm1[4],ymm4[4],ymm1[5],ymm4[5]287; AVX512VL-NEXT: vpsadbw %ymm4, %ymm1, %ymm1288; AVX512VL-NEXT: vinserti128 $1, %xmm2, %ymm0, %ymm0289; AVX512VL-NEXT: vpand %ymm3, %ymm0, %ymm2290; AVX512VL-NEXT: vpshufb %ymm2, %ymm5, %ymm2291; AVX512VL-NEXT: vpsrlw $4, %ymm0, %ymm0292; AVX512VL-NEXT: vpand %ymm3, %ymm0, %ymm0293; AVX512VL-NEXT: vpshufb %ymm0, %ymm5, %ymm0294; AVX512VL-NEXT: vpaddb %ymm2, %ymm0, %ymm0295; AVX512VL-NEXT: vpunpckldq {{.*#+}} ymm0 = ymm0[0],ymm4[0],ymm0[1],ymm4[1],ymm0[4],ymm4[4],ymm0[5],ymm4[5]296; AVX512VL-NEXT: vpsadbw %ymm4, %ymm0, %ymm0297; AVX512VL-NEXT: vpackuswb %ymm1, %ymm0, %ymm0298; AVX512VL-NEXT: retq299;300; AVX512VPOPCNT-LABEL: widen_ctpop_v2i32_v8i32:301; AVX512VPOPCNT: # %bb.0:302; AVX512VPOPCNT-NEXT: # kill: def $xmm1 killed $xmm1 def $ymm1303; AVX512VPOPCNT-NEXT: # kill: def $xmm0 killed $xmm0 def $ymm0304; AVX512VPOPCNT-NEXT: vinserti128 $1, %xmm3, %ymm1, %ymm1305; AVX512VPOPCNT-NEXT: vinserti128 $1, %xmm2, %ymm0, %ymm0306; AVX512VPOPCNT-NEXT: vpunpcklqdq {{.*#+}} ymm0 = ymm0[0],ymm1[0],ymm0[2],ymm1[2]307; AVX512VPOPCNT-NEXT: vpopcntd %ymm0, %ymm0308; AVX512VPOPCNT-NEXT: retq309 %b0 = call <2 x i32> @llvm.ctpop.v2i32(<2 x i32> %a0)310 %b1 = call <2 x i32> @llvm.ctpop.v2i32(<2 x i32> %a1)311 %b2 = call <2 x i32> @llvm.ctpop.v2i32(<2 x i32> %a2)312 %b3 = call <2 x i32> @llvm.ctpop.v2i32(<2 x i32> %a3)313 %res01 = shufflevector <2 x i32> %b0, <2 x i32> %b1, <4 x i32> <i32 0, i32 1, i32 2, i32 3>314 %res23 = shufflevector <2 x i32> %b2, <2 x i32> %b3, <4 x i32> <i32 0, i32 1, i32 2, i32 3>315 %res = shufflevector <4 x i32> %res01, <4 x i32> %res23, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>316 ret <8 x i32> %res317}318 319;320; CTLZ321;322 323define <4 x i32> @widen_ctlz_v2i32_v4i32(<2 x i32> %a0, <2 x i32> %a1) {324; SSE42-LABEL: widen_ctlz_v2i32_v4i32:325; SSE42: # %bb.0:326; SSE42-NEXT: movq {{.*#+}} xmm3 = [4,3,2,2,1,1,1,1,0,0,0,0,0,0,0,0]327; SSE42-NEXT: movdqa %xmm3, %xmm6328; SSE42-NEXT: pshufb %xmm0, %xmm6329; SSE42-NEXT: movdqa %xmm0, %xmm5330; SSE42-NEXT: psrlw $4, %xmm5331; SSE42-NEXT: movdqa {{.*#+}} xmm4 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]332; SSE42-NEXT: pand %xmm4, %xmm5333; SSE42-NEXT: pxor %xmm2, %xmm2334; SSE42-NEXT: movdqa %xmm3, %xmm7335; SSE42-NEXT: pshufb %xmm5, %xmm7336; SSE42-NEXT: pcmpeqb %xmm2, %xmm5337; SSE42-NEXT: pand %xmm6, %xmm5338; SSE42-NEXT: paddb %xmm7, %xmm5339; SSE42-NEXT: movdqa %xmm0, %xmm6340; SSE42-NEXT: pcmpeqb %xmm2, %xmm6341; SSE42-NEXT: psrlw $8, %xmm6342; SSE42-NEXT: pand %xmm5, %xmm6343; SSE42-NEXT: psrlw $8, %xmm5344; SSE42-NEXT: paddw %xmm6, %xmm5345; SSE42-NEXT: pcmpeqw %xmm2, %xmm0346; SSE42-NEXT: psrld $16, %xmm0347; SSE42-NEXT: pand %xmm5, %xmm0348; SSE42-NEXT: psrld $16, %xmm5349; SSE42-NEXT: paddd %xmm5, %xmm0350; SSE42-NEXT: movdqa %xmm3, %xmm6351; SSE42-NEXT: pshufb %xmm1, %xmm6352; SSE42-NEXT: movdqa %xmm1, %xmm5353; SSE42-NEXT: psrlw $4, %xmm5354; SSE42-NEXT: pand %xmm4, %xmm5355; SSE42-NEXT: pshufb %xmm5, %xmm3356; SSE42-NEXT: pcmpeqb %xmm2, %xmm5357; SSE42-NEXT: pand %xmm6, %xmm5358; SSE42-NEXT: paddb %xmm3, %xmm5359; SSE42-NEXT: movdqa %xmm1, %xmm3360; SSE42-NEXT: pcmpeqb %xmm2, %xmm3361; SSE42-NEXT: psrlw $8, %xmm3362; SSE42-NEXT: pand %xmm5, %xmm3363; SSE42-NEXT: psrlw $8, %xmm5364; SSE42-NEXT: paddw %xmm3, %xmm5365; SSE42-NEXT: pcmpeqw %xmm2, %xmm1366; SSE42-NEXT: psrld $16, %xmm1367; SSE42-NEXT: pand %xmm5, %xmm1368; SSE42-NEXT: psrld $16, %xmm5369; SSE42-NEXT: paddd %xmm1, %xmm5370; SSE42-NEXT: punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm5[0]371; SSE42-NEXT: retq372;373; AVX2-LABEL: widen_ctlz_v2i32_v4i32:374; AVX2: # %bb.0:375; AVX2-NEXT: vmovq {{.*#+}} xmm2 = [4,3,2,2,1,1,1,1,0,0,0,0,0,0,0,0]376; AVX2-NEXT: vpshufb %xmm0, %xmm2, %xmm3377; AVX2-NEXT: vpsrlw $4, %xmm0, %xmm4378; AVX2-NEXT: vpbroadcastb {{.*#+}} xmm5 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]379; AVX2-NEXT: vpand %xmm5, %xmm4, %xmm4380; AVX2-NEXT: vpxor %xmm6, %xmm6, %xmm6381; AVX2-NEXT: vpcmpeqb %xmm6, %xmm4, %xmm7382; AVX2-NEXT: vpand %xmm7, %xmm3, %xmm3383; AVX2-NEXT: vpshufb %xmm4, %xmm2, %xmm4384; AVX2-NEXT: vpaddb %xmm4, %xmm3, %xmm3385; AVX2-NEXT: vpcmpeqb %xmm6, %xmm0, %xmm4386; AVX2-NEXT: vpsrlw $8, %xmm4, %xmm4387; AVX2-NEXT: vpand %xmm4, %xmm3, %xmm4388; AVX2-NEXT: vpsrlw $8, %xmm3, %xmm3389; AVX2-NEXT: vpaddw %xmm4, %xmm3, %xmm3390; AVX2-NEXT: vpcmpeqw %xmm6, %xmm0, %xmm0391; AVX2-NEXT: vpsrld $16, %xmm0, %xmm0392; AVX2-NEXT: vpand %xmm0, %xmm3, %xmm0393; AVX2-NEXT: vpsrld $16, %xmm3, %xmm3394; AVX2-NEXT: vpaddd %xmm0, %xmm3, %xmm0395; AVX2-NEXT: vpshufb %xmm1, %xmm2, %xmm3396; AVX2-NEXT: vpsrlw $4, %xmm1, %xmm4397; AVX2-NEXT: vpand %xmm5, %xmm4, %xmm4398; AVX2-NEXT: vpcmpeqb %xmm6, %xmm4, %xmm5399; AVX2-NEXT: vpand %xmm5, %xmm3, %xmm3400; AVX2-NEXT: vpshufb %xmm4, %xmm2, %xmm2401; AVX2-NEXT: vpaddb %xmm2, %xmm3, %xmm2402; AVX2-NEXT: vpcmpeqb %xmm6, %xmm1, %xmm3403; AVX2-NEXT: vpsrlw $8, %xmm3, %xmm3404; AVX2-NEXT: vpand %xmm3, %xmm2, %xmm3405; AVX2-NEXT: vpsrlw $8, %xmm2, %xmm2406; AVX2-NEXT: vpaddw %xmm3, %xmm2, %xmm2407; AVX2-NEXT: vpcmpeqw %xmm6, %xmm1, %xmm1408; AVX2-NEXT: vpsrld $16, %xmm1, %xmm1409; AVX2-NEXT: vpand %xmm1, %xmm2, %xmm1410; AVX2-NEXT: vpsrld $16, %xmm2, %xmm2411; AVX2-NEXT: vpaddd %xmm1, %xmm2, %xmm1412; AVX2-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]413; AVX2-NEXT: retq414;415; AVX512-LABEL: widen_ctlz_v2i32_v4i32:416; AVX512: # %bb.0:417; AVX512-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]418; AVX512-NEXT: vplzcntd %xmm0, %xmm0419; AVX512-NEXT: retq420 %b0 = call <2 x i32> @llvm.ctlz.v2i32(<2 x i32> %a0, i1 0)421 %b1 = call <2 x i32> @llvm.ctlz.v2i32(<2 x i32> %a1, i1 0)422 %res = shufflevector <2 x i32> %b0, <2 x i32> %b1, <4 x i32> <i32 0, i32 1, i32 2, i32 3>423 ret <4 x i32> %res424}425 426define <8 x i32> @widen_ctlz_v4i32_v8i32(<4 x i32> %a0, <4 x i32> %a1) {427; SSE42-LABEL: widen_ctlz_v4i32_v8i32:428; SSE42: # %bb.0:429; SSE42-NEXT: movq {{.*#+}} xmm3 = [4,3,2,2,1,1,1,1,0,0,0,0,0,0,0,0]430; SSE42-NEXT: movdqa %xmm3, %xmm6431; SSE42-NEXT: pshufb %xmm0, %xmm6432; SSE42-NEXT: movdqa %xmm0, %xmm5433; SSE42-NEXT: psrlw $4, %xmm5434; SSE42-NEXT: movdqa {{.*#+}} xmm4 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]435; SSE42-NEXT: pand %xmm4, %xmm5436; SSE42-NEXT: pxor %xmm2, %xmm2437; SSE42-NEXT: movdqa %xmm3, %xmm7438; SSE42-NEXT: pshufb %xmm5, %xmm7439; SSE42-NEXT: pcmpeqb %xmm2, %xmm5440; SSE42-NEXT: pand %xmm6, %xmm5441; SSE42-NEXT: paddb %xmm7, %xmm5442; SSE42-NEXT: movdqa %xmm0, %xmm6443; SSE42-NEXT: pcmpeqb %xmm2, %xmm6444; SSE42-NEXT: psrlw $8, %xmm6445; SSE42-NEXT: pand %xmm5, %xmm6446; SSE42-NEXT: psrlw $8, %xmm5447; SSE42-NEXT: paddw %xmm6, %xmm5448; SSE42-NEXT: pcmpeqw %xmm2, %xmm0449; SSE42-NEXT: psrld $16, %xmm0450; SSE42-NEXT: pand %xmm5, %xmm0451; SSE42-NEXT: psrld $16, %xmm5452; SSE42-NEXT: paddd %xmm5, %xmm0453; SSE42-NEXT: movdqa %xmm3, %xmm5454; SSE42-NEXT: pshufb %xmm1, %xmm5455; SSE42-NEXT: movdqa %xmm1, %xmm6456; SSE42-NEXT: psrlw $4, %xmm6457; SSE42-NEXT: pand %xmm4, %xmm6458; SSE42-NEXT: pshufb %xmm6, %xmm3459; SSE42-NEXT: pcmpeqb %xmm2, %xmm6460; SSE42-NEXT: pand %xmm5, %xmm6461; SSE42-NEXT: paddb %xmm3, %xmm6462; SSE42-NEXT: movdqa %xmm1, %xmm3463; SSE42-NEXT: pcmpeqb %xmm2, %xmm3464; SSE42-NEXT: psrlw $8, %xmm3465; SSE42-NEXT: pand %xmm6, %xmm3466; SSE42-NEXT: psrlw $8, %xmm6467; SSE42-NEXT: paddw %xmm3, %xmm6468; SSE42-NEXT: pcmpeqw %xmm2, %xmm1469; SSE42-NEXT: psrld $16, %xmm1470; SSE42-NEXT: pand %xmm6, %xmm1471; SSE42-NEXT: psrld $16, %xmm6472; SSE42-NEXT: paddd %xmm6, %xmm1473; SSE42-NEXT: retq474;475; AVX2-LABEL: widen_ctlz_v4i32_v8i32:476; AVX2: # %bb.0:477; AVX2-NEXT: # kill: def $xmm0 killed $xmm0 def $ymm0478; AVX2-NEXT: vinserti128 $1, %xmm1, %ymm0, %ymm0479; AVX2-NEXT: vbroadcasti128 {{.*#+}} ymm1 = [4,3,2,2,1,1,1,1,0,0,0,0,0,0,0,0,4,3,2,2,1,1,1,1,0,0,0,0,0,0,0,0]480; AVX2-NEXT: # ymm1 = mem[0,1,0,1]481; AVX2-NEXT: vpshufb %ymm0, %ymm1, %ymm2482; AVX2-NEXT: vpsrlw $4, %ymm0, %ymm3483; AVX2-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm3, %ymm3484; AVX2-NEXT: vpxor %xmm4, %xmm4, %xmm4485; AVX2-NEXT: vpcmpeqb %ymm4, %ymm3, %ymm5486; AVX2-NEXT: vpand %ymm5, %ymm2, %ymm2487; AVX2-NEXT: vpshufb %ymm3, %ymm1, %ymm1488; AVX2-NEXT: vpaddb %ymm1, %ymm2, %ymm1489; AVX2-NEXT: vpcmpeqb %ymm4, %ymm0, %ymm2490; AVX2-NEXT: vpsrlw $8, %ymm2, %ymm2491; AVX2-NEXT: vpand %ymm2, %ymm1, %ymm2492; AVX2-NEXT: vpsrlw $8, %ymm1, %ymm1493; AVX2-NEXT: vpaddw %ymm2, %ymm1, %ymm1494; AVX2-NEXT: vpcmpeqw %ymm4, %ymm0, %ymm0495; AVX2-NEXT: vpsrld $16, %ymm0, %ymm0496; AVX2-NEXT: vpand %ymm0, %ymm1, %ymm0497; AVX2-NEXT: vpsrld $16, %ymm1, %ymm1498; AVX2-NEXT: vpaddd %ymm0, %ymm1, %ymm0499; AVX2-NEXT: retq500;501; AVX512-LABEL: widen_ctlz_v4i32_v8i32:502; AVX512: # %bb.0:503; AVX512-NEXT: # kill: def $xmm0 killed $xmm0 def $ymm0504; AVX512-NEXT: vinserti128 $1, %xmm1, %ymm0, %ymm0505; AVX512-NEXT: vplzcntd %ymm0, %ymm0506; AVX512-NEXT: retq507 %b0 = call <4 x i32> @llvm.ctlz.v4i32(<4 x i32> %a0, i1 0)508 %b1 = call <4 x i32> @llvm.ctlz.v4i32(<4 x i32> %a1, i1 0)509 %res = shufflevector <4 x i32> %b0, <4 x i32> %b1, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>510 ret <8 x i32> %res511}512 513define <8 x i32> @widen_ctlz_v2i32_v8i32(<2 x i32> %a0, <2 x i32> %a1, <2 x i32> %a2, <2 x i32> %a3) {514; SSE42-LABEL: widen_ctlz_v2i32_v8i32:515; SSE42: # %bb.0:516; SSE42-NEXT: movq {{.*#+}} xmm5 = [4,3,2,2,1,1,1,1,0,0,0,0,0,0,0,0]517; SSE42-NEXT: movdqa %xmm5, %xmm8518; SSE42-NEXT: pshufb %xmm0, %xmm8519; SSE42-NEXT: movdqa %xmm0, %xmm7520; SSE42-NEXT: psrlw $4, %xmm7521; SSE42-NEXT: movdqa {{.*#+}} xmm6 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]522; SSE42-NEXT: pand %xmm6, %xmm7523; SSE42-NEXT: pxor %xmm4, %xmm4524; SSE42-NEXT: movdqa %xmm5, %xmm9525; SSE42-NEXT: pshufb %xmm7, %xmm9526; SSE42-NEXT: pcmpeqb %xmm4, %xmm7527; SSE42-NEXT: pand %xmm8, %xmm7528; SSE42-NEXT: paddb %xmm9, %xmm7529; SSE42-NEXT: movdqa %xmm0, %xmm8530; SSE42-NEXT: pcmpeqb %xmm4, %xmm8531; SSE42-NEXT: psrlw $8, %xmm8532; SSE42-NEXT: pand %xmm7, %xmm8533; SSE42-NEXT: psrlw $8, %xmm7534; SSE42-NEXT: paddw %xmm8, %xmm7535; SSE42-NEXT: pcmpeqw %xmm4, %xmm0536; SSE42-NEXT: psrld $16, %xmm0537; SSE42-NEXT: pand %xmm7, %xmm0538; SSE42-NEXT: psrld $16, %xmm7539; SSE42-NEXT: paddd %xmm7, %xmm0540; SSE42-NEXT: movdqa %xmm5, %xmm8541; SSE42-NEXT: pshufb %xmm1, %xmm8542; SSE42-NEXT: movdqa %xmm1, %xmm7543; SSE42-NEXT: psrlw $4, %xmm7544; SSE42-NEXT: pand %xmm6, %xmm7545; SSE42-NEXT: movdqa %xmm5, %xmm9546; SSE42-NEXT: pshufb %xmm7, %xmm9547; SSE42-NEXT: pcmpeqb %xmm4, %xmm7548; SSE42-NEXT: pand %xmm8, %xmm7549; SSE42-NEXT: paddb %xmm9, %xmm7550; SSE42-NEXT: movdqa %xmm1, %xmm8551; SSE42-NEXT: pcmpeqb %xmm4, %xmm8552; SSE42-NEXT: psrlw $8, %xmm8553; SSE42-NEXT: pand %xmm7, %xmm8554; SSE42-NEXT: psrlw $8, %xmm7555; SSE42-NEXT: paddw %xmm8, %xmm7556; SSE42-NEXT: pcmpeqw %xmm4, %xmm1557; SSE42-NEXT: psrld $16, %xmm1558; SSE42-NEXT: pand %xmm7, %xmm1559; SSE42-NEXT: psrld $16, %xmm7560; SSE42-NEXT: paddd %xmm1, %xmm7561; SSE42-NEXT: punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm7[0]562; SSE42-NEXT: movdqa %xmm5, %xmm7563; SSE42-NEXT: pshufb %xmm2, %xmm7564; SSE42-NEXT: movdqa %xmm2, %xmm1565; SSE42-NEXT: psrlw $4, %xmm1566; SSE42-NEXT: pand %xmm6, %xmm1567; SSE42-NEXT: movdqa %xmm5, %xmm8568; SSE42-NEXT: pshufb %xmm1, %xmm8569; SSE42-NEXT: pcmpeqb %xmm4, %xmm1570; SSE42-NEXT: pand %xmm7, %xmm1571; SSE42-NEXT: paddb %xmm8, %xmm1572; SSE42-NEXT: movdqa %xmm2, %xmm7573; SSE42-NEXT: pcmpeqb %xmm4, %xmm7574; SSE42-NEXT: psrlw $8, %xmm7575; SSE42-NEXT: pand %xmm1, %xmm7576; SSE42-NEXT: psrlw $8, %xmm1577; SSE42-NEXT: paddw %xmm7, %xmm1578; SSE42-NEXT: pcmpeqw %xmm4, %xmm2579; SSE42-NEXT: psrld $16, %xmm2580; SSE42-NEXT: pand %xmm1, %xmm2581; SSE42-NEXT: psrld $16, %xmm1582; SSE42-NEXT: paddd %xmm2, %xmm1583; SSE42-NEXT: movdqa %xmm5, %xmm7584; SSE42-NEXT: pshufb %xmm3, %xmm7585; SSE42-NEXT: movdqa %xmm3, %xmm2586; SSE42-NEXT: psrlw $4, %xmm2587; SSE42-NEXT: pand %xmm6, %xmm2588; SSE42-NEXT: pshufb %xmm2, %xmm5589; SSE42-NEXT: pcmpeqb %xmm4, %xmm2590; SSE42-NEXT: pand %xmm7, %xmm2591; SSE42-NEXT: paddb %xmm5, %xmm2592; SSE42-NEXT: movdqa %xmm3, %xmm5593; SSE42-NEXT: pcmpeqb %xmm4, %xmm5594; SSE42-NEXT: psrlw $8, %xmm5595; SSE42-NEXT: pand %xmm2, %xmm5596; SSE42-NEXT: psrlw $8, %xmm2597; SSE42-NEXT: paddw %xmm5, %xmm2598; SSE42-NEXT: pcmpeqw %xmm4, %xmm3599; SSE42-NEXT: psrld $16, %xmm3600; SSE42-NEXT: pand %xmm2, %xmm3601; SSE42-NEXT: psrld $16, %xmm2602; SSE42-NEXT: paddd %xmm3, %xmm2603; SSE42-NEXT: punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm2[0]604; SSE42-NEXT: retq605;606; AVX2-LABEL: widen_ctlz_v2i32_v8i32:607; AVX2: # %bb.0:608; AVX2-NEXT: # kill: def $xmm1 killed $xmm1 def $ymm1609; AVX2-NEXT: # kill: def $xmm0 killed $xmm0 def $ymm0610; AVX2-NEXT: vinserti128 $1, %xmm3, %ymm1, %ymm1611; AVX2-NEXT: vbroadcasti128 {{.*#+}} ymm3 = [4,3,2,2,1,1,1,1,0,0,0,0,0,0,0,0,4,3,2,2,1,1,1,1,0,0,0,0,0,0,0,0]612; AVX2-NEXT: # ymm3 = mem[0,1,0,1]613; AVX2-NEXT: vpshufb %ymm1, %ymm3, %ymm4614; AVX2-NEXT: vpsrlw $4, %ymm1, %ymm5615; AVX2-NEXT: vpbroadcastb {{.*#+}} ymm6 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]616; AVX2-NEXT: vpand %ymm6, %ymm5, %ymm5617; AVX2-NEXT: vpxor %xmm7, %xmm7, %xmm7618; AVX2-NEXT: vpcmpeqb %ymm7, %ymm5, %ymm8619; AVX2-NEXT: vpand %ymm4, %ymm8, %ymm4620; AVX2-NEXT: vpshufb %ymm5, %ymm3, %ymm5621; AVX2-NEXT: vpaddb %ymm5, %ymm4, %ymm4622; AVX2-NEXT: vpcmpeqb %ymm7, %ymm1, %ymm5623; AVX2-NEXT: vpsrlw $8, %ymm5, %ymm5624; AVX2-NEXT: vpand %ymm5, %ymm4, %ymm5625; AVX2-NEXT: vpsrlw $8, %ymm4, %ymm4626; AVX2-NEXT: vpaddw %ymm5, %ymm4, %ymm4627; AVX2-NEXT: vpcmpeqw %ymm7, %ymm1, %ymm1628; AVX2-NEXT: vpsrld $16, %ymm1, %ymm1629; AVX2-NEXT: vpand %ymm1, %ymm4, %ymm1630; AVX2-NEXT: vpsrld $16, %ymm4, %ymm4631; AVX2-NEXT: vpaddd %ymm1, %ymm4, %ymm1632; AVX2-NEXT: vinserti128 $1, %xmm2, %ymm0, %ymm0633; AVX2-NEXT: vpshufb %ymm0, %ymm3, %ymm2634; AVX2-NEXT: vpsrlw $4, %ymm0, %ymm4635; AVX2-NEXT: vpand %ymm6, %ymm4, %ymm4636; AVX2-NEXT: vpcmpeqb %ymm7, %ymm4, %ymm5637; AVX2-NEXT: vpand %ymm5, %ymm2, %ymm2638; AVX2-NEXT: vpshufb %ymm4, %ymm3, %ymm3639; AVX2-NEXT: vpaddb %ymm3, %ymm2, %ymm2640; AVX2-NEXT: vpcmpeqb %ymm7, %ymm0, %ymm3641; AVX2-NEXT: vpsrlw $8, %ymm3, %ymm3642; AVX2-NEXT: vpand %ymm3, %ymm2, %ymm3643; AVX2-NEXT: vpsrlw $8, %ymm2, %ymm2644; AVX2-NEXT: vpaddw %ymm3, %ymm2, %ymm2645; AVX2-NEXT: vpcmpeqw %ymm7, %ymm0, %ymm0646; AVX2-NEXT: vpsrld $16, %ymm0, %ymm0647; AVX2-NEXT: vpand %ymm0, %ymm2, %ymm0648; AVX2-NEXT: vpsrld $16, %ymm2, %ymm2649; AVX2-NEXT: vpaddd %ymm0, %ymm2, %ymm0650; AVX2-NEXT: vpunpcklqdq {{.*#+}} ymm0 = ymm0[0],ymm1[0],ymm0[2],ymm1[2]651; AVX2-NEXT: retq652;653; AVX512-LABEL: widen_ctlz_v2i32_v8i32:654; AVX512: # %bb.0:655; AVX512-NEXT: # kill: def $xmm1 killed $xmm1 def $ymm1656; AVX512-NEXT: # kill: def $xmm0 killed $xmm0 def $ymm0657; AVX512-NEXT: vinserti128 $1, %xmm3, %ymm1, %ymm1658; AVX512-NEXT: vinserti128 $1, %xmm2, %ymm0, %ymm0659; AVX512-NEXT: vpunpcklqdq {{.*#+}} ymm0 = ymm0[0],ymm1[0],ymm0[2],ymm1[2]660; AVX512-NEXT: vplzcntd %ymm0, %ymm0661; AVX512-NEXT: retq662 %b0 = call <2 x i32> @llvm.ctlz.v2i32(<2 x i32> %a0, i1 0)663 %b1 = call <2 x i32> @llvm.ctlz.v2i32(<2 x i32> %a1, i1 0)664 %b2 = call <2 x i32> @llvm.ctlz.v2i32(<2 x i32> %a2, i1 0)665 %b3 = call <2 x i32> @llvm.ctlz.v2i32(<2 x i32> %a3, i1 0)666 %res01 = shufflevector <2 x i32> %b0, <2 x i32> %b1, <4 x i32> <i32 0, i32 1, i32 2, i32 3>667 %res23 = shufflevector <2 x i32> %b2, <2 x i32> %b3, <4 x i32> <i32 0, i32 1, i32 2, i32 3>668 %res = shufflevector <4 x i32> %res01, <4 x i32> %res23, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>669 ret <8 x i32> %res670}671 672;673; CTLZ_ZERO_UNDEF674;675 676define <4 x i32> @widen_ctlz_undef_v2i32_v4i32(<2 x i32> %a0, <2 x i32> %a1) {677; SSE42-LABEL: widen_ctlz_undef_v2i32_v4i32:678; SSE42: # %bb.0:679; SSE42-NEXT: movq {{.*#+}} xmm3 = [4,3,2,2,1,1,1,1,0,0,0,0,0,0,0,0]680; SSE42-NEXT: movdqa %xmm3, %xmm6681; SSE42-NEXT: pshufb %xmm0, %xmm6682; SSE42-NEXT: movdqa %xmm0, %xmm5683; SSE42-NEXT: psrlw $4, %xmm5684; SSE42-NEXT: movdqa {{.*#+}} xmm4 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]685; SSE42-NEXT: pand %xmm4, %xmm5686; SSE42-NEXT: pxor %xmm2, %xmm2687; SSE42-NEXT: movdqa %xmm3, %xmm7688; SSE42-NEXT: pshufb %xmm5, %xmm7689; SSE42-NEXT: pcmpeqb %xmm2, %xmm5690; SSE42-NEXT: pand %xmm6, %xmm5691; SSE42-NEXT: paddb %xmm7, %xmm5692; SSE42-NEXT: movdqa %xmm0, %xmm6693; SSE42-NEXT: pcmpeqb %xmm2, %xmm6694; SSE42-NEXT: psrlw $8, %xmm6695; SSE42-NEXT: pand %xmm5, %xmm6696; SSE42-NEXT: psrlw $8, %xmm5697; SSE42-NEXT: paddw %xmm6, %xmm5698; SSE42-NEXT: pcmpeqw %xmm2, %xmm0699; SSE42-NEXT: psrld $16, %xmm0700; SSE42-NEXT: pand %xmm5, %xmm0701; SSE42-NEXT: psrld $16, %xmm5702; SSE42-NEXT: paddd %xmm5, %xmm0703; SSE42-NEXT: movdqa %xmm3, %xmm6704; SSE42-NEXT: pshufb %xmm1, %xmm6705; SSE42-NEXT: movdqa %xmm1, %xmm5706; SSE42-NEXT: psrlw $4, %xmm5707; SSE42-NEXT: pand %xmm4, %xmm5708; SSE42-NEXT: pshufb %xmm5, %xmm3709; SSE42-NEXT: pcmpeqb %xmm2, %xmm5710; SSE42-NEXT: pand %xmm6, %xmm5711; SSE42-NEXT: paddb %xmm3, %xmm5712; SSE42-NEXT: movdqa %xmm1, %xmm3713; SSE42-NEXT: pcmpeqb %xmm2, %xmm3714; SSE42-NEXT: psrlw $8, %xmm3715; SSE42-NEXT: pand %xmm5, %xmm3716; SSE42-NEXT: psrlw $8, %xmm5717; SSE42-NEXT: paddw %xmm3, %xmm5718; SSE42-NEXT: pcmpeqw %xmm2, %xmm1719; SSE42-NEXT: psrld $16, %xmm1720; SSE42-NEXT: pand %xmm5, %xmm1721; SSE42-NEXT: psrld $16, %xmm5722; SSE42-NEXT: paddd %xmm1, %xmm5723; SSE42-NEXT: punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm5[0]724; SSE42-NEXT: retq725;726; AVX2-LABEL: widen_ctlz_undef_v2i32_v4i32:727; AVX2: # %bb.0:728; AVX2-NEXT: vmovq {{.*#+}} xmm2 = [4,3,2,2,1,1,1,1,0,0,0,0,0,0,0,0]729; AVX2-NEXT: vpshufb %xmm0, %xmm2, %xmm3730; AVX2-NEXT: vpsrlw $4, %xmm0, %xmm4731; AVX2-NEXT: vpbroadcastb {{.*#+}} xmm5 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]732; AVX2-NEXT: vpand %xmm5, %xmm4, %xmm4733; AVX2-NEXT: vpxor %xmm6, %xmm6, %xmm6734; AVX2-NEXT: vpcmpeqb %xmm6, %xmm4, %xmm7735; AVX2-NEXT: vpand %xmm7, %xmm3, %xmm3736; AVX2-NEXT: vpshufb %xmm4, %xmm2, %xmm4737; AVX2-NEXT: vpaddb %xmm4, %xmm3, %xmm3738; AVX2-NEXT: vpcmpeqb %xmm6, %xmm0, %xmm4739; AVX2-NEXT: vpsrlw $8, %xmm4, %xmm4740; AVX2-NEXT: vpand %xmm4, %xmm3, %xmm4741; AVX2-NEXT: vpsrlw $8, %xmm3, %xmm3742; AVX2-NEXT: vpaddw %xmm4, %xmm3, %xmm3743; AVX2-NEXT: vpcmpeqw %xmm6, %xmm0, %xmm0744; AVX2-NEXT: vpsrld $16, %xmm0, %xmm0745; AVX2-NEXT: vpand %xmm0, %xmm3, %xmm0746; AVX2-NEXT: vpsrld $16, %xmm3, %xmm3747; AVX2-NEXT: vpaddd %xmm0, %xmm3, %xmm0748; AVX2-NEXT: vpshufb %xmm1, %xmm2, %xmm3749; AVX2-NEXT: vpsrlw $4, %xmm1, %xmm4750; AVX2-NEXT: vpand %xmm5, %xmm4, %xmm4751; AVX2-NEXT: vpcmpeqb %xmm6, %xmm4, %xmm5752; AVX2-NEXT: vpand %xmm5, %xmm3, %xmm3753; AVX2-NEXT: vpshufb %xmm4, %xmm2, %xmm2754; AVX2-NEXT: vpaddb %xmm2, %xmm3, %xmm2755; AVX2-NEXT: vpcmpeqb %xmm6, %xmm1, %xmm3756; AVX2-NEXT: vpsrlw $8, %xmm3, %xmm3757; AVX2-NEXT: vpand %xmm3, %xmm2, %xmm3758; AVX2-NEXT: vpsrlw $8, %xmm2, %xmm2759; AVX2-NEXT: vpaddw %xmm3, %xmm2, %xmm2760; AVX2-NEXT: vpcmpeqw %xmm6, %xmm1, %xmm1761; AVX2-NEXT: vpsrld $16, %xmm1, %xmm1762; AVX2-NEXT: vpand %xmm1, %xmm2, %xmm1763; AVX2-NEXT: vpsrld $16, %xmm2, %xmm2764; AVX2-NEXT: vpaddd %xmm1, %xmm2, %xmm1765; AVX2-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]766; AVX2-NEXT: retq767;768; AVX512-LABEL: widen_ctlz_undef_v2i32_v4i32:769; AVX512: # %bb.0:770; AVX512-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]771; AVX512-NEXT: vplzcntd %xmm0, %xmm0772; AVX512-NEXT: retq773 %b0 = call <2 x i32> @llvm.ctlz.v2i32(<2 x i32> %a0, i1 1)774 %b1 = call <2 x i32> @llvm.ctlz.v2i32(<2 x i32> %a1, i1 1)775 %res = shufflevector <2 x i32> %b0, <2 x i32> %b1, <4 x i32> <i32 0, i32 1, i32 2, i32 3>776 ret <4 x i32> %res777}778 779define <8 x i32> @widen_ctlz_undef_v4i32_v8i32(<4 x i32> %a0, <4 x i32> %a1) {780; SSE42-LABEL: widen_ctlz_undef_v4i32_v8i32:781; SSE42: # %bb.0:782; SSE42-NEXT: movq {{.*#+}} xmm3 = [4,3,2,2,1,1,1,1,0,0,0,0,0,0,0,0]783; SSE42-NEXT: movdqa %xmm3, %xmm6784; SSE42-NEXT: pshufb %xmm0, %xmm6785; SSE42-NEXT: movdqa %xmm0, %xmm5786; SSE42-NEXT: psrlw $4, %xmm5787; SSE42-NEXT: movdqa {{.*#+}} xmm4 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]788; SSE42-NEXT: pand %xmm4, %xmm5789; SSE42-NEXT: pxor %xmm2, %xmm2790; SSE42-NEXT: movdqa %xmm3, %xmm7791; SSE42-NEXT: pshufb %xmm5, %xmm7792; SSE42-NEXT: pcmpeqb %xmm2, %xmm5793; SSE42-NEXT: pand %xmm6, %xmm5794; SSE42-NEXT: paddb %xmm7, %xmm5795; SSE42-NEXT: movdqa %xmm0, %xmm6796; SSE42-NEXT: pcmpeqb %xmm2, %xmm6797; SSE42-NEXT: psrlw $8, %xmm6798; SSE42-NEXT: pand %xmm5, %xmm6799; SSE42-NEXT: psrlw $8, %xmm5800; SSE42-NEXT: paddw %xmm6, %xmm5801; SSE42-NEXT: pcmpeqw %xmm2, %xmm0802; SSE42-NEXT: psrld $16, %xmm0803; SSE42-NEXT: pand %xmm5, %xmm0804; SSE42-NEXT: psrld $16, %xmm5805; SSE42-NEXT: paddd %xmm5, %xmm0806; SSE42-NEXT: movdqa %xmm3, %xmm5807; SSE42-NEXT: pshufb %xmm1, %xmm5808; SSE42-NEXT: movdqa %xmm1, %xmm6809; SSE42-NEXT: psrlw $4, %xmm6810; SSE42-NEXT: pand %xmm4, %xmm6811; SSE42-NEXT: pshufb %xmm6, %xmm3812; SSE42-NEXT: pcmpeqb %xmm2, %xmm6813; SSE42-NEXT: pand %xmm5, %xmm6814; SSE42-NEXT: paddb %xmm3, %xmm6815; SSE42-NEXT: movdqa %xmm1, %xmm3816; SSE42-NEXT: pcmpeqb %xmm2, %xmm3817; SSE42-NEXT: psrlw $8, %xmm3818; SSE42-NEXT: pand %xmm6, %xmm3819; SSE42-NEXT: psrlw $8, %xmm6820; SSE42-NEXT: paddw %xmm3, %xmm6821; SSE42-NEXT: pcmpeqw %xmm2, %xmm1822; SSE42-NEXT: psrld $16, %xmm1823; SSE42-NEXT: pand %xmm6, %xmm1824; SSE42-NEXT: psrld $16, %xmm6825; SSE42-NEXT: paddd %xmm6, %xmm1826; SSE42-NEXT: retq827;828; AVX2-LABEL: widen_ctlz_undef_v4i32_v8i32:829; AVX2: # %bb.0:830; AVX2-NEXT: # kill: def $xmm0 killed $xmm0 def $ymm0831; AVX2-NEXT: vinserti128 $1, %xmm1, %ymm0, %ymm0832; AVX2-NEXT: vbroadcasti128 {{.*#+}} ymm1 = [4,3,2,2,1,1,1,1,0,0,0,0,0,0,0,0,4,3,2,2,1,1,1,1,0,0,0,0,0,0,0,0]833; AVX2-NEXT: # ymm1 = mem[0,1,0,1]834; AVX2-NEXT: vpshufb %ymm0, %ymm1, %ymm2835; AVX2-NEXT: vpsrlw $4, %ymm0, %ymm3836; AVX2-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm3, %ymm3837; AVX2-NEXT: vpxor %xmm4, %xmm4, %xmm4838; AVX2-NEXT: vpcmpeqb %ymm4, %ymm3, %ymm5839; AVX2-NEXT: vpand %ymm5, %ymm2, %ymm2840; AVX2-NEXT: vpshufb %ymm3, %ymm1, %ymm1841; AVX2-NEXT: vpaddb %ymm1, %ymm2, %ymm1842; AVX2-NEXT: vpcmpeqb %ymm4, %ymm0, %ymm2843; AVX2-NEXT: vpsrlw $8, %ymm2, %ymm2844; AVX2-NEXT: vpand %ymm2, %ymm1, %ymm2845; AVX2-NEXT: vpsrlw $8, %ymm1, %ymm1846; AVX2-NEXT: vpaddw %ymm2, %ymm1, %ymm1847; AVX2-NEXT: vpcmpeqw %ymm4, %ymm0, %ymm0848; AVX2-NEXT: vpsrld $16, %ymm0, %ymm0849; AVX2-NEXT: vpand %ymm0, %ymm1, %ymm0850; AVX2-NEXT: vpsrld $16, %ymm1, %ymm1851; AVX2-NEXT: vpaddd %ymm0, %ymm1, %ymm0852; AVX2-NEXT: retq853;854; AVX512-LABEL: widen_ctlz_undef_v4i32_v8i32:855; AVX512: # %bb.0:856; AVX512-NEXT: # kill: def $xmm0 killed $xmm0 def $ymm0857; AVX512-NEXT: vinserti128 $1, %xmm1, %ymm0, %ymm0858; AVX512-NEXT: vplzcntd %ymm0, %ymm0859; AVX512-NEXT: retq860 %b0 = call <4 x i32> @llvm.ctlz.v4i32(<4 x i32> %a0, i1 1)861 %b1 = call <4 x i32> @llvm.ctlz.v4i32(<4 x i32> %a1, i1 1)862 %res = shufflevector <4 x i32> %b0, <4 x i32> %b1, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>863 ret <8 x i32> %res864}865 866define <8 x i32> @widen_ctlz_undef_v2i32_v8i32(<2 x i32> %a0, <2 x i32> %a1, <2 x i32> %a2, <2 x i32> %a3) {867; SSE42-LABEL: widen_ctlz_undef_v2i32_v8i32:868; SSE42: # %bb.0:869; SSE42-NEXT: movq {{.*#+}} xmm5 = [4,3,2,2,1,1,1,1,0,0,0,0,0,0,0,0]870; SSE42-NEXT: movdqa %xmm5, %xmm8871; SSE42-NEXT: pshufb %xmm0, %xmm8872; SSE42-NEXT: movdqa %xmm0, %xmm7873; SSE42-NEXT: psrlw $4, %xmm7874; SSE42-NEXT: movdqa {{.*#+}} xmm6 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]875; SSE42-NEXT: pand %xmm6, %xmm7876; SSE42-NEXT: pxor %xmm4, %xmm4877; SSE42-NEXT: movdqa %xmm5, %xmm9878; SSE42-NEXT: pshufb %xmm7, %xmm9879; SSE42-NEXT: pcmpeqb %xmm4, %xmm7880; SSE42-NEXT: pand %xmm8, %xmm7881; SSE42-NEXT: paddb %xmm9, %xmm7882; SSE42-NEXT: movdqa %xmm0, %xmm8883; SSE42-NEXT: pcmpeqb %xmm4, %xmm8884; SSE42-NEXT: psrlw $8, %xmm8885; SSE42-NEXT: pand %xmm7, %xmm8886; SSE42-NEXT: psrlw $8, %xmm7887; SSE42-NEXT: paddw %xmm8, %xmm7888; SSE42-NEXT: pcmpeqw %xmm4, %xmm0889; SSE42-NEXT: psrld $16, %xmm0890; SSE42-NEXT: pand %xmm7, %xmm0891; SSE42-NEXT: psrld $16, %xmm7892; SSE42-NEXT: paddd %xmm7, %xmm0893; SSE42-NEXT: movdqa %xmm5, %xmm8894; SSE42-NEXT: pshufb %xmm1, %xmm8895; SSE42-NEXT: movdqa %xmm1, %xmm7896; SSE42-NEXT: psrlw $4, %xmm7897; SSE42-NEXT: pand %xmm6, %xmm7898; SSE42-NEXT: movdqa %xmm5, %xmm9899; SSE42-NEXT: pshufb %xmm7, %xmm9900; SSE42-NEXT: pcmpeqb %xmm4, %xmm7901; SSE42-NEXT: pand %xmm8, %xmm7902; SSE42-NEXT: paddb %xmm9, %xmm7903; SSE42-NEXT: movdqa %xmm1, %xmm8904; SSE42-NEXT: pcmpeqb %xmm4, %xmm8905; SSE42-NEXT: psrlw $8, %xmm8906; SSE42-NEXT: pand %xmm7, %xmm8907; SSE42-NEXT: psrlw $8, %xmm7908; SSE42-NEXT: paddw %xmm8, %xmm7909; SSE42-NEXT: pcmpeqw %xmm4, %xmm1910; SSE42-NEXT: psrld $16, %xmm1911; SSE42-NEXT: pand %xmm7, %xmm1912; SSE42-NEXT: psrld $16, %xmm7913; SSE42-NEXT: paddd %xmm1, %xmm7914; SSE42-NEXT: punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm7[0]915; SSE42-NEXT: movdqa %xmm5, %xmm7916; SSE42-NEXT: pshufb %xmm2, %xmm7917; SSE42-NEXT: movdqa %xmm2, %xmm1918; SSE42-NEXT: psrlw $4, %xmm1919; SSE42-NEXT: pand %xmm6, %xmm1920; SSE42-NEXT: movdqa %xmm5, %xmm8921; SSE42-NEXT: pshufb %xmm1, %xmm8922; SSE42-NEXT: pcmpeqb %xmm4, %xmm1923; SSE42-NEXT: pand %xmm7, %xmm1924; SSE42-NEXT: paddb %xmm8, %xmm1925; SSE42-NEXT: movdqa %xmm2, %xmm7926; SSE42-NEXT: pcmpeqb %xmm4, %xmm7927; SSE42-NEXT: psrlw $8, %xmm7928; SSE42-NEXT: pand %xmm1, %xmm7929; SSE42-NEXT: psrlw $8, %xmm1930; SSE42-NEXT: paddw %xmm7, %xmm1931; SSE42-NEXT: pcmpeqw %xmm4, %xmm2932; SSE42-NEXT: psrld $16, %xmm2933; SSE42-NEXT: pand %xmm1, %xmm2934; SSE42-NEXT: psrld $16, %xmm1935; SSE42-NEXT: paddd %xmm2, %xmm1936; SSE42-NEXT: movdqa %xmm5, %xmm7937; SSE42-NEXT: pshufb %xmm3, %xmm7938; SSE42-NEXT: movdqa %xmm3, %xmm2939; SSE42-NEXT: psrlw $4, %xmm2940; SSE42-NEXT: pand %xmm6, %xmm2941; SSE42-NEXT: pshufb %xmm2, %xmm5942; SSE42-NEXT: pcmpeqb %xmm4, %xmm2943; SSE42-NEXT: pand %xmm7, %xmm2944; SSE42-NEXT: paddb %xmm5, %xmm2945; SSE42-NEXT: movdqa %xmm3, %xmm5946; SSE42-NEXT: pcmpeqb %xmm4, %xmm5947; SSE42-NEXT: psrlw $8, %xmm5948; SSE42-NEXT: pand %xmm2, %xmm5949; SSE42-NEXT: psrlw $8, %xmm2950; SSE42-NEXT: paddw %xmm5, %xmm2951; SSE42-NEXT: pcmpeqw %xmm4, %xmm3952; SSE42-NEXT: psrld $16, %xmm3953; SSE42-NEXT: pand %xmm2, %xmm3954; SSE42-NEXT: psrld $16, %xmm2955; SSE42-NEXT: paddd %xmm3, %xmm2956; SSE42-NEXT: punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm2[0]957; SSE42-NEXT: retq958;959; AVX2-LABEL: widen_ctlz_undef_v2i32_v8i32:960; AVX2: # %bb.0:961; AVX2-NEXT: # kill: def $xmm1 killed $xmm1 def $ymm1962; AVX2-NEXT: # kill: def $xmm0 killed $xmm0 def $ymm0963; AVX2-NEXT: vinserti128 $1, %xmm3, %ymm1, %ymm1964; AVX2-NEXT: vbroadcasti128 {{.*#+}} ymm3 = [4,3,2,2,1,1,1,1,0,0,0,0,0,0,0,0,4,3,2,2,1,1,1,1,0,0,0,0,0,0,0,0]965; AVX2-NEXT: # ymm3 = mem[0,1,0,1]966; AVX2-NEXT: vpshufb %ymm1, %ymm3, %ymm4967; AVX2-NEXT: vpsrlw $4, %ymm1, %ymm5968; AVX2-NEXT: vpbroadcastb {{.*#+}} ymm6 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]969; AVX2-NEXT: vpand %ymm6, %ymm5, %ymm5970; AVX2-NEXT: vpxor %xmm7, %xmm7, %xmm7971; AVX2-NEXT: vpcmpeqb %ymm7, %ymm5, %ymm8972; AVX2-NEXT: vpand %ymm4, %ymm8, %ymm4973; AVX2-NEXT: vpshufb %ymm5, %ymm3, %ymm5974; AVX2-NEXT: vpaddb %ymm5, %ymm4, %ymm4975; AVX2-NEXT: vpcmpeqb %ymm7, %ymm1, %ymm5976; AVX2-NEXT: vpsrlw $8, %ymm5, %ymm5977; AVX2-NEXT: vpand %ymm5, %ymm4, %ymm5978; AVX2-NEXT: vpsrlw $8, %ymm4, %ymm4979; AVX2-NEXT: vpaddw %ymm5, %ymm4, %ymm4980; AVX2-NEXT: vpcmpeqw %ymm7, %ymm1, %ymm1981; AVX2-NEXT: vpsrld $16, %ymm1, %ymm1982; AVX2-NEXT: vpand %ymm1, %ymm4, %ymm1983; AVX2-NEXT: vpsrld $16, %ymm4, %ymm4984; AVX2-NEXT: vpaddd %ymm1, %ymm4, %ymm1985; AVX2-NEXT: vinserti128 $1, %xmm2, %ymm0, %ymm0986; AVX2-NEXT: vpshufb %ymm0, %ymm3, %ymm2987; AVX2-NEXT: vpsrlw $4, %ymm0, %ymm4988; AVX2-NEXT: vpand %ymm6, %ymm4, %ymm4989; AVX2-NEXT: vpcmpeqb %ymm7, %ymm4, %ymm5990; AVX2-NEXT: vpand %ymm5, %ymm2, %ymm2991; AVX2-NEXT: vpshufb %ymm4, %ymm3, %ymm3992; AVX2-NEXT: vpaddb %ymm3, %ymm2, %ymm2993; AVX2-NEXT: vpcmpeqb %ymm7, %ymm0, %ymm3994; AVX2-NEXT: vpsrlw $8, %ymm3, %ymm3995; AVX2-NEXT: vpand %ymm3, %ymm2, %ymm3996; AVX2-NEXT: vpsrlw $8, %ymm2, %ymm2997; AVX2-NEXT: vpaddw %ymm3, %ymm2, %ymm2998; AVX2-NEXT: vpcmpeqw %ymm7, %ymm0, %ymm0999; AVX2-NEXT: vpsrld $16, %ymm0, %ymm01000; AVX2-NEXT: vpand %ymm0, %ymm2, %ymm01001; AVX2-NEXT: vpsrld $16, %ymm2, %ymm21002; AVX2-NEXT: vpaddd %ymm0, %ymm2, %ymm01003; AVX2-NEXT: vpunpcklqdq {{.*#+}} ymm0 = ymm0[0],ymm1[0],ymm0[2],ymm1[2]1004; AVX2-NEXT: retq1005;1006; AVX512-LABEL: widen_ctlz_undef_v2i32_v8i32:1007; AVX512: # %bb.0:1008; AVX512-NEXT: # kill: def $xmm1 killed $xmm1 def $ymm11009; AVX512-NEXT: # kill: def $xmm0 killed $xmm0 def $ymm01010; AVX512-NEXT: vinserti128 $1, %xmm3, %ymm1, %ymm11011; AVX512-NEXT: vinserti128 $1, %xmm2, %ymm0, %ymm01012; AVX512-NEXT: vpunpcklqdq {{.*#+}} ymm0 = ymm0[0],ymm1[0],ymm0[2],ymm1[2]1013; AVX512-NEXT: vplzcntd %ymm0, %ymm01014; AVX512-NEXT: retq1015 %b0 = call <2 x i32> @llvm.ctlz.v2i32(<2 x i32> %a0, i1 1)1016 %b1 = call <2 x i32> @llvm.ctlz.v2i32(<2 x i32> %a1, i1 1)1017 %b2 = call <2 x i32> @llvm.ctlz.v2i32(<2 x i32> %a2, i1 1)1018 %b3 = call <2 x i32> @llvm.ctlz.v2i32(<2 x i32> %a3, i1 1)1019 %res01 = shufflevector <2 x i32> %b0, <2 x i32> %b1, <4 x i32> <i32 0, i32 1, i32 2, i32 3>1020 %res23 = shufflevector <2 x i32> %b2, <2 x i32> %b3, <4 x i32> <i32 0, i32 1, i32 2, i32 3>1021 %res = shufflevector <4 x i32> %res01, <4 x i32> %res23, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>1022 ret <8 x i32> %res1023}1024 1025;1026; CTTZ1027;1028 1029define <4 x i32> @widen_cttz_v2i32_v4i32(<2 x i32> %a0, <2 x i32> %a1) {1030; SSE42-LABEL: widen_cttz_v2i32_v4i32:1031; SSE42: # %bb.0:1032; SSE42-NEXT: pcmpeqd %xmm2, %xmm21033; SSE42-NEXT: movdqa %xmm0, %xmm31034; SSE42-NEXT: paddd %xmm2, %xmm31035; SSE42-NEXT: pandn %xmm3, %xmm01036; SSE42-NEXT: movdqa {{.*#+}} xmm3 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]1037; SSE42-NEXT: movdqa %xmm0, %xmm41038; SSE42-NEXT: pand %xmm3, %xmm41039; SSE42-NEXT: movdqa {{.*#+}} xmm5 = [0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4]1040; SSE42-NEXT: movdqa %xmm5, %xmm61041; SSE42-NEXT: pshufb %xmm4, %xmm61042; SSE42-NEXT: psrlw $4, %xmm01043; SSE42-NEXT: pand %xmm3, %xmm01044; SSE42-NEXT: movdqa %xmm5, %xmm41045; SSE42-NEXT: pshufb %xmm0, %xmm41046; SSE42-NEXT: paddb %xmm6, %xmm41047; SSE42-NEXT: pmovzxdq {{.*#+}} xmm0 = xmm4[0],zero,xmm4[1],zero1048; SSE42-NEXT: pxor %xmm4, %xmm41049; SSE42-NEXT: psadbw %xmm4, %xmm01050; SSE42-NEXT: paddd %xmm1, %xmm21051; SSE42-NEXT: pandn %xmm2, %xmm11052; SSE42-NEXT: movdqa %xmm1, %xmm21053; SSE42-NEXT: pand %xmm3, %xmm21054; SSE42-NEXT: movdqa %xmm5, %xmm61055; SSE42-NEXT: pshufb %xmm2, %xmm61056; SSE42-NEXT: psrlw $4, %xmm11057; SSE42-NEXT: pand %xmm3, %xmm11058; SSE42-NEXT: pshufb %xmm1, %xmm51059; SSE42-NEXT: paddb %xmm6, %xmm51060; SSE42-NEXT: pmovzxdq {{.*#+}} xmm1 = xmm5[0],zero,xmm5[1],zero1061; SSE42-NEXT: psadbw %xmm4, %xmm11062; SSE42-NEXT: packuswb %xmm1, %xmm01063; SSE42-NEXT: retq1064;1065; AVX2-LABEL: widen_cttz_v2i32_v4i32:1066; AVX2: # %bb.0:1067; AVX2-NEXT: vpcmpeqd %xmm2, %xmm2, %xmm21068; AVX2-NEXT: vpaddd %xmm2, %xmm0, %xmm31069; AVX2-NEXT: vpandn %xmm3, %xmm0, %xmm01070; AVX2-NEXT: vpbroadcastb {{.*#+}} xmm3 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]1071; AVX2-NEXT: vpand %xmm3, %xmm0, %xmm41072; AVX2-NEXT: vmovdqa {{.*#+}} xmm5 = [0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4]1073; AVX2-NEXT: vpshufb %xmm4, %xmm5, %xmm41074; AVX2-NEXT: vpsrlw $4, %xmm0, %xmm01075; AVX2-NEXT: vpand %xmm3, %xmm0, %xmm01076; AVX2-NEXT: vpshufb %xmm0, %xmm5, %xmm01077; AVX2-NEXT: vpaddb %xmm4, %xmm0, %xmm01078; AVX2-NEXT: vpmovzxdq {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero1079; AVX2-NEXT: vpxor %xmm4, %xmm4, %xmm41080; AVX2-NEXT: vpsadbw %xmm4, %xmm0, %xmm01081; AVX2-NEXT: vpaddd %xmm2, %xmm1, %xmm21082; AVX2-NEXT: vpandn %xmm2, %xmm1, %xmm11083; AVX2-NEXT: vpand %xmm3, %xmm1, %xmm21084; AVX2-NEXT: vpshufb %xmm2, %xmm5, %xmm21085; AVX2-NEXT: vpsrlw $4, %xmm1, %xmm11086; AVX2-NEXT: vpand %xmm3, %xmm1, %xmm11087; AVX2-NEXT: vpshufb %xmm1, %xmm5, %xmm11088; AVX2-NEXT: vpaddb %xmm2, %xmm1, %xmm11089; AVX2-NEXT: vpmovzxdq {{.*#+}} xmm1 = xmm1[0],zero,xmm1[1],zero1090; AVX2-NEXT: vpsadbw %xmm4, %xmm1, %xmm11091; AVX2-NEXT: vpackuswb %xmm1, %xmm0, %xmm01092; AVX2-NEXT: retq1093;1094; AVX512VL-LABEL: widen_cttz_v2i32_v4i32:1095; AVX512VL: # %bb.0:1096; AVX512VL-NEXT: vpcmpeqd %xmm2, %xmm2, %xmm21097; AVX512VL-NEXT: vpaddd %xmm2, %xmm0, %xmm31098; AVX512VL-NEXT: vpandn %xmm3, %xmm0, %xmm01099; AVX512VL-NEXT: vpbroadcastd {{.*#+}} xmm3 = [32,32,32,32]1100; AVX512VL-NEXT: vpaddd %xmm2, %xmm1, %xmm21101; AVX512VL-NEXT: vpandn %xmm2, %xmm1, %xmm11102; AVX512VL-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]1103; AVX512VL-NEXT: vplzcntd %xmm0, %xmm01104; AVX512VL-NEXT: vpsubd %xmm0, %xmm3, %xmm01105; AVX512VL-NEXT: retq1106;1107; AVX512VPOPCNT-LABEL: widen_cttz_v2i32_v4i32:1108; AVX512VPOPCNT: # %bb.0:1109; AVX512VPOPCNT-NEXT: vpcmpeqd %xmm2, %xmm2, %xmm21110; AVX512VPOPCNT-NEXT: vpaddd %xmm2, %xmm0, %xmm31111; AVX512VPOPCNT-NEXT: vpandn %xmm3, %xmm0, %xmm01112; AVX512VPOPCNT-NEXT: vpaddd %xmm2, %xmm1, %xmm21113; AVX512VPOPCNT-NEXT: vpandn %xmm2, %xmm1, %xmm11114; AVX512VPOPCNT-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]1115; AVX512VPOPCNT-NEXT: vpopcntd %xmm0, %xmm01116; AVX512VPOPCNT-NEXT: retq1117 %b0 = call <2 x i32> @llvm.cttz.v2i32(<2 x i32> %a0, i1 0)1118 %b1 = call <2 x i32> @llvm.cttz.v2i32(<2 x i32> %a1, i1 0)1119 %res = shufflevector <2 x i32> %b0, <2 x i32> %b1, <4 x i32> <i32 0, i32 1, i32 2, i32 3>1120 ret <4 x i32> %res1121}1122 1123define <8 x i32> @widen_cttz_v4i32_v8i32(<4 x i32> %a0, <4 x i32> %a1) {1124; SSE42-LABEL: widen_cttz_v4i32_v8i32:1125; SSE42: # %bb.0:1126; SSE42-NEXT: pcmpeqd %xmm4, %xmm41127; SSE42-NEXT: movdqa %xmm0, %xmm21128; SSE42-NEXT: paddd %xmm4, %xmm21129; SSE42-NEXT: pandn %xmm2, %xmm01130; SSE42-NEXT: movdqa {{.*#+}} xmm3 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]1131; SSE42-NEXT: movdqa %xmm0, %xmm51132; SSE42-NEXT: pand %xmm3, %xmm51133; SSE42-NEXT: movdqa {{.*#+}} xmm2 = [0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4]1134; SSE42-NEXT: movdqa %xmm2, %xmm61135; SSE42-NEXT: pshufb %xmm5, %xmm61136; SSE42-NEXT: psrlw $4, %xmm01137; SSE42-NEXT: pand %xmm3, %xmm01138; SSE42-NEXT: movdqa %xmm2, %xmm51139; SSE42-NEXT: pshufb %xmm0, %xmm51140; SSE42-NEXT: paddb %xmm6, %xmm51141; SSE42-NEXT: pxor %xmm6, %xmm61142; SSE42-NEXT: pmovzxdq {{.*#+}} xmm0 = xmm5[0],zero,xmm5[1],zero1143; SSE42-NEXT: punpckhdq {{.*#+}} xmm5 = xmm5[2],xmm6[2],xmm5[3],xmm6[3]1144; SSE42-NEXT: psadbw %xmm6, %xmm51145; SSE42-NEXT: psadbw %xmm6, %xmm01146; SSE42-NEXT: packuswb %xmm5, %xmm01147; SSE42-NEXT: paddd %xmm1, %xmm41148; SSE42-NEXT: pandn %xmm4, %xmm11149; SSE42-NEXT: movdqa %xmm1, %xmm41150; SSE42-NEXT: pand %xmm3, %xmm41151; SSE42-NEXT: movdqa %xmm2, %xmm51152; SSE42-NEXT: pshufb %xmm4, %xmm51153; SSE42-NEXT: psrlw $4, %xmm11154; SSE42-NEXT: pand %xmm3, %xmm11155; SSE42-NEXT: pshufb %xmm1, %xmm21156; SSE42-NEXT: paddb %xmm5, %xmm21157; SSE42-NEXT: pmovzxdq {{.*#+}} xmm1 = xmm2[0],zero,xmm2[1],zero1158; SSE42-NEXT: punpckhdq {{.*#+}} xmm2 = xmm2[2],xmm6[2],xmm2[3],xmm6[3]1159; SSE42-NEXT: psadbw %xmm6, %xmm21160; SSE42-NEXT: psadbw %xmm6, %xmm11161; SSE42-NEXT: packuswb %xmm2, %xmm11162; SSE42-NEXT: retq1163;1164; AVX2-LABEL: widen_cttz_v4i32_v8i32:1165; AVX2: # %bb.0:1166; AVX2-NEXT: # kill: def $xmm0 killed $xmm0 def $ymm01167; AVX2-NEXT: vinserti128 $1, %xmm1, %ymm0, %ymm01168; AVX2-NEXT: vpcmpeqd %ymm1, %ymm1, %ymm11169; AVX2-NEXT: vpaddd %ymm1, %ymm0, %ymm11170; AVX2-NEXT: vpandn %ymm1, %ymm0, %ymm01171; AVX2-NEXT: vpbroadcastb {{.*#+}} ymm1 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]1172; AVX2-NEXT: vpand %ymm1, %ymm0, %ymm21173; AVX2-NEXT: vbroadcasti128 {{.*#+}} ymm3 = [0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4,0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4]1174; AVX2-NEXT: # ymm3 = mem[0,1,0,1]1175; AVX2-NEXT: vpshufb %ymm2, %ymm3, %ymm21176; AVX2-NEXT: vpsrlw $4, %ymm0, %ymm01177; AVX2-NEXT: vpand %ymm1, %ymm0, %ymm01178; AVX2-NEXT: vpshufb %ymm0, %ymm3, %ymm01179; AVX2-NEXT: vpaddb %ymm2, %ymm0, %ymm01180; AVX2-NEXT: vpxor %xmm1, %xmm1, %xmm11181; AVX2-NEXT: vpunpckhdq {{.*#+}} ymm2 = ymm0[2],ymm1[2],ymm0[3],ymm1[3],ymm0[6],ymm1[6],ymm0[7],ymm1[7]1182; AVX2-NEXT: vpsadbw %ymm1, %ymm2, %ymm21183; AVX2-NEXT: vpunpckldq {{.*#+}} ymm0 = ymm0[0],ymm1[0],ymm0[1],ymm1[1],ymm0[4],ymm1[4],ymm0[5],ymm1[5]1184; AVX2-NEXT: vpsadbw %ymm1, %ymm0, %ymm01185; AVX2-NEXT: vpackuswb %ymm2, %ymm0, %ymm01186; AVX2-NEXT: retq1187;1188; AVX512VL-LABEL: widen_cttz_v4i32_v8i32:1189; AVX512VL: # %bb.0:1190; AVX512VL-NEXT: # kill: def $xmm0 killed $xmm0 def $ymm01191; AVX512VL-NEXT: vinserti128 $1, %xmm1, %ymm0, %ymm01192; AVX512VL-NEXT: vpcmpeqd %ymm1, %ymm1, %ymm11193; AVX512VL-NEXT: vpaddd %ymm1, %ymm0, %ymm11194; AVX512VL-NEXT: vpandn %ymm1, %ymm0, %ymm01195; AVX512VL-NEXT: vplzcntd %ymm0, %ymm01196; AVX512VL-NEXT: vpbroadcastd {{.*#+}} ymm1 = [32,32,32,32,32,32,32,32]1197; AVX512VL-NEXT: vpsubd %ymm0, %ymm1, %ymm01198; AVX512VL-NEXT: retq1199;1200; AVX512VPOPCNT-LABEL: widen_cttz_v4i32_v8i32:1201; AVX512VPOPCNT: # %bb.0:1202; AVX512VPOPCNT-NEXT: # kill: def $xmm0 killed $xmm0 def $ymm01203; AVX512VPOPCNT-NEXT: vinserti128 $1, %xmm1, %ymm0, %ymm01204; AVX512VPOPCNT-NEXT: vpcmpeqd %ymm1, %ymm1, %ymm11205; AVX512VPOPCNT-NEXT: vpaddd %ymm1, %ymm0, %ymm11206; AVX512VPOPCNT-NEXT: vpandn %ymm1, %ymm0, %ymm01207; AVX512VPOPCNT-NEXT: vpopcntd %ymm0, %ymm01208; AVX512VPOPCNT-NEXT: retq1209 %b0 = call <4 x i32> @llvm.cttz.v4i32(<4 x i32> %a0, i1 0)1210 %b1 = call <4 x i32> @llvm.cttz.v4i32(<4 x i32> %a1, i1 0)1211 %res = shufflevector <4 x i32> %b0, <4 x i32> %b1, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>1212 ret <8 x i32> %res1213}1214 1215define <8 x i32> @widen_cttz_v2i32_v8i32(<2 x i32> %a0, <2 x i32> %a1, <2 x i32> %a2, <2 x i32> %a3) {1216; SSE42-LABEL: widen_cttz_v2i32_v8i32:1217; SSE42: # %bb.0:1218; SSE42-NEXT: pcmpeqd %xmm6, %xmm61219; SSE42-NEXT: movdqa %xmm0, %xmm41220; SSE42-NEXT: paddd %xmm6, %xmm41221; SSE42-NEXT: pandn %xmm4, %xmm01222; SSE42-NEXT: movdqa {{.*#+}} xmm5 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]1223; SSE42-NEXT: movdqa %xmm0, %xmm71224; SSE42-NEXT: pand %xmm5, %xmm71225; SSE42-NEXT: movdqa {{.*#+}} xmm4 = [0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4]1226; SSE42-NEXT: movdqa %xmm4, %xmm81227; SSE42-NEXT: pshufb %xmm7, %xmm81228; SSE42-NEXT: psrlw $4, %xmm01229; SSE42-NEXT: pand %xmm5, %xmm01230; SSE42-NEXT: movdqa %xmm4, %xmm71231; SSE42-NEXT: pshufb %xmm0, %xmm71232; SSE42-NEXT: paddb %xmm8, %xmm71233; SSE42-NEXT: pmovzxdq {{.*#+}} xmm0 = xmm7[0],zero,xmm7[1],zero1234; SSE42-NEXT: pxor %xmm7, %xmm71235; SSE42-NEXT: psadbw %xmm7, %xmm01236; SSE42-NEXT: movdqa %xmm1, %xmm81237; SSE42-NEXT: paddd %xmm6, %xmm81238; SSE42-NEXT: pandn %xmm8, %xmm11239; SSE42-NEXT: movdqa %xmm1, %xmm81240; SSE42-NEXT: pand %xmm5, %xmm81241; SSE42-NEXT: movdqa %xmm4, %xmm91242; SSE42-NEXT: pshufb %xmm8, %xmm91243; SSE42-NEXT: psrlw $4, %xmm11244; SSE42-NEXT: pand %xmm5, %xmm11245; SSE42-NEXT: movdqa %xmm4, %xmm81246; SSE42-NEXT: pshufb %xmm1, %xmm81247; SSE42-NEXT: paddb %xmm9, %xmm81248; SSE42-NEXT: pmovzxdq {{.*#+}} xmm1 = xmm8[0],zero,xmm8[1],zero1249; SSE42-NEXT: psadbw %xmm7, %xmm11250; SSE42-NEXT: packuswb %xmm1, %xmm01251; SSE42-NEXT: movdqa %xmm2, %xmm11252; SSE42-NEXT: paddd %xmm6, %xmm11253; SSE42-NEXT: pandn %xmm1, %xmm21254; SSE42-NEXT: movdqa %xmm2, %xmm11255; SSE42-NEXT: pand %xmm5, %xmm11256; SSE42-NEXT: movdqa %xmm4, %xmm81257; SSE42-NEXT: pshufb %xmm1, %xmm81258; SSE42-NEXT: psrlw $4, %xmm21259; SSE42-NEXT: pand %xmm5, %xmm21260; SSE42-NEXT: movdqa %xmm4, %xmm11261; SSE42-NEXT: pshufb %xmm2, %xmm11262; SSE42-NEXT: paddb %xmm8, %xmm11263; SSE42-NEXT: pmovzxdq {{.*#+}} xmm1 = xmm1[0],zero,xmm1[1],zero1264; SSE42-NEXT: psadbw %xmm7, %xmm11265; SSE42-NEXT: paddd %xmm3, %xmm61266; SSE42-NEXT: pandn %xmm6, %xmm31267; SSE42-NEXT: movdqa %xmm3, %xmm21268; SSE42-NEXT: pand %xmm5, %xmm21269; SSE42-NEXT: movdqa %xmm4, %xmm61270; SSE42-NEXT: pshufb %xmm2, %xmm61271; SSE42-NEXT: psrlw $4, %xmm31272; SSE42-NEXT: pand %xmm5, %xmm31273; SSE42-NEXT: pshufb %xmm3, %xmm41274; SSE42-NEXT: paddb %xmm6, %xmm41275; SSE42-NEXT: pmovzxdq {{.*#+}} xmm2 = xmm4[0],zero,xmm4[1],zero1276; SSE42-NEXT: psadbw %xmm7, %xmm21277; SSE42-NEXT: packuswb %xmm2, %xmm11278; SSE42-NEXT: retq1279;1280; AVX2-LABEL: widen_cttz_v2i32_v8i32:1281; AVX2: # %bb.0:1282; AVX2-NEXT: # kill: def $xmm1 killed $xmm1 def $ymm11283; AVX2-NEXT: # kill: def $xmm0 killed $xmm0 def $ymm01284; AVX2-NEXT: vinserti128 $1, %xmm3, %ymm1, %ymm11285; AVX2-NEXT: vpcmpeqd %ymm3, %ymm3, %ymm31286; AVX2-NEXT: vpaddd %ymm3, %ymm1, %ymm41287; AVX2-NEXT: vpandn %ymm4, %ymm1, %ymm11288; AVX2-NEXT: vpbroadcastb {{.*#+}} ymm4 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]1289; AVX2-NEXT: vpand %ymm4, %ymm1, %ymm51290; AVX2-NEXT: vbroadcasti128 {{.*#+}} ymm6 = [0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4,0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4]1291; AVX2-NEXT: # ymm6 = mem[0,1,0,1]1292; AVX2-NEXT: vpshufb %ymm5, %ymm6, %ymm51293; AVX2-NEXT: vpsrlw $4, %ymm1, %ymm11294; AVX2-NEXT: vpand %ymm4, %ymm1, %ymm11295; AVX2-NEXT: vpshufb %ymm1, %ymm6, %ymm11296; AVX2-NEXT: vpaddb %ymm5, %ymm1, %ymm11297; AVX2-NEXT: vpxor %xmm5, %xmm5, %xmm51298; AVX2-NEXT: vpunpckldq {{.*#+}} ymm1 = ymm1[0],ymm5[0],ymm1[1],ymm5[1],ymm1[4],ymm5[4],ymm1[5],ymm5[5]1299; AVX2-NEXT: vpsadbw %ymm5, %ymm1, %ymm11300; AVX2-NEXT: vinserti128 $1, %xmm2, %ymm0, %ymm01301; AVX2-NEXT: vpaddd %ymm3, %ymm0, %ymm21302; AVX2-NEXT: vpandn %ymm2, %ymm0, %ymm01303; AVX2-NEXT: vpand %ymm4, %ymm0, %ymm21304; AVX2-NEXT: vpshufb %ymm2, %ymm6, %ymm21305; AVX2-NEXT: vpsrlw $4, %ymm0, %ymm01306; AVX2-NEXT: vpand %ymm4, %ymm0, %ymm01307; AVX2-NEXT: vpshufb %ymm0, %ymm6, %ymm01308; AVX2-NEXT: vpaddb %ymm2, %ymm0, %ymm01309; AVX2-NEXT: vpunpckldq {{.*#+}} ymm0 = ymm0[0],ymm5[0],ymm0[1],ymm5[1],ymm0[4],ymm5[4],ymm0[5],ymm5[5]1310; AVX2-NEXT: vpsadbw %ymm5, %ymm0, %ymm01311; AVX2-NEXT: vpackuswb %ymm1, %ymm0, %ymm01312; AVX2-NEXT: retq1313;1314; AVX512VL-LABEL: widen_cttz_v2i32_v8i32:1315; AVX512VL: # %bb.0:1316; AVX512VL-NEXT: # kill: def $xmm1 killed $xmm1 def $ymm11317; AVX512VL-NEXT: # kill: def $xmm0 killed $xmm0 def $ymm01318; AVX512VL-NEXT: vinserti128 $1, %xmm3, %ymm1, %ymm11319; AVX512VL-NEXT: vpcmpeqd %ymm3, %ymm3, %ymm31320; AVX512VL-NEXT: vpaddd %ymm3, %ymm1, %ymm41321; AVX512VL-NEXT: vpandn %ymm4, %ymm1, %ymm11322; AVX512VL-NEXT: vinserti128 $1, %xmm2, %ymm0, %ymm01323; AVX512VL-NEXT: vpaddd %ymm3, %ymm0, %ymm21324; AVX512VL-NEXT: vpandn %ymm2, %ymm0, %ymm01325; AVX512VL-NEXT: vpunpcklqdq {{.*#+}} ymm0 = ymm0[0],ymm1[0],ymm0[2],ymm1[2]1326; AVX512VL-NEXT: vplzcntd %ymm0, %ymm01327; AVX512VL-NEXT: vpbroadcastd {{.*#+}} ymm1 = [32,32,32,32,32,32,32,32]1328; AVX512VL-NEXT: vpsubd %ymm0, %ymm1, %ymm01329; AVX512VL-NEXT: retq1330;1331; AVX512VPOPCNT-LABEL: widen_cttz_v2i32_v8i32:1332; AVX512VPOPCNT: # %bb.0:1333; AVX512VPOPCNT-NEXT: # kill: def $xmm1 killed $xmm1 def $ymm11334; AVX512VPOPCNT-NEXT: # kill: def $xmm0 killed $xmm0 def $ymm01335; AVX512VPOPCNT-NEXT: vinserti128 $1, %xmm3, %ymm1, %ymm11336; AVX512VPOPCNT-NEXT: vpcmpeqd %ymm3, %ymm3, %ymm31337; AVX512VPOPCNT-NEXT: vpaddd %ymm3, %ymm1, %ymm41338; AVX512VPOPCNT-NEXT: vpandn %ymm4, %ymm1, %ymm11339; AVX512VPOPCNT-NEXT: vinserti128 $1, %xmm2, %ymm0, %ymm01340; AVX512VPOPCNT-NEXT: vpaddd %ymm3, %ymm0, %ymm21341; AVX512VPOPCNT-NEXT: vpandn %ymm2, %ymm0, %ymm01342; AVX512VPOPCNT-NEXT: vpunpcklqdq {{.*#+}} ymm0 = ymm0[0],ymm1[0],ymm0[2],ymm1[2]1343; AVX512VPOPCNT-NEXT: vpopcntd %ymm0, %ymm01344; AVX512VPOPCNT-NEXT: retq1345 %b0 = call <2 x i32> @llvm.cttz.v2i32(<2 x i32> %a0, i1 0)1346 %b1 = call <2 x i32> @llvm.cttz.v2i32(<2 x i32> %a1, i1 0)1347 %b2 = call <2 x i32> @llvm.cttz.v2i32(<2 x i32> %a2, i1 0)1348 %b3 = call <2 x i32> @llvm.cttz.v2i32(<2 x i32> %a3, i1 0)1349 %res01 = shufflevector <2 x i32> %b0, <2 x i32> %b1, <4 x i32> <i32 0, i32 1, i32 2, i32 3>1350 %res23 = shufflevector <2 x i32> %b2, <2 x i32> %b3, <4 x i32> <i32 0, i32 1, i32 2, i32 3>1351 %res = shufflevector <4 x i32> %res01, <4 x i32> %res23, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>1352 ret <8 x i32> %res1353}1354 1355;1356; CTTZ_ZERO_UNDEF1357;1358 1359define <4 x i32> @widen_cttz_undef_v2i32_v4i32(<2 x i32> %a0, <2 x i32> %a1) {1360; SSE42-LABEL: widen_cttz_undef_v2i32_v4i32:1361; SSE42: # %bb.0:1362; SSE42-NEXT: pcmpeqd %xmm2, %xmm21363; SSE42-NEXT: movdqa %xmm0, %xmm31364; SSE42-NEXT: paddd %xmm2, %xmm31365; SSE42-NEXT: pandn %xmm3, %xmm01366; SSE42-NEXT: movdqa {{.*#+}} xmm3 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]1367; SSE42-NEXT: movdqa %xmm0, %xmm41368; SSE42-NEXT: pand %xmm3, %xmm41369; SSE42-NEXT: movdqa {{.*#+}} xmm5 = [0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4]1370; SSE42-NEXT: movdqa %xmm5, %xmm61371; SSE42-NEXT: pshufb %xmm4, %xmm61372; SSE42-NEXT: psrlw $4, %xmm01373; SSE42-NEXT: pand %xmm3, %xmm01374; SSE42-NEXT: movdqa %xmm5, %xmm41375; SSE42-NEXT: pshufb %xmm0, %xmm41376; SSE42-NEXT: paddb %xmm6, %xmm41377; SSE42-NEXT: pmovzxdq {{.*#+}} xmm0 = xmm4[0],zero,xmm4[1],zero1378; SSE42-NEXT: pxor %xmm4, %xmm41379; SSE42-NEXT: psadbw %xmm4, %xmm01380; SSE42-NEXT: paddd %xmm1, %xmm21381; SSE42-NEXT: pandn %xmm2, %xmm11382; SSE42-NEXT: movdqa %xmm1, %xmm21383; SSE42-NEXT: pand %xmm3, %xmm21384; SSE42-NEXT: movdqa %xmm5, %xmm61385; SSE42-NEXT: pshufb %xmm2, %xmm61386; SSE42-NEXT: psrlw $4, %xmm11387; SSE42-NEXT: pand %xmm3, %xmm11388; SSE42-NEXT: pshufb %xmm1, %xmm51389; SSE42-NEXT: paddb %xmm6, %xmm51390; SSE42-NEXT: pmovzxdq {{.*#+}} xmm1 = xmm5[0],zero,xmm5[1],zero1391; SSE42-NEXT: psadbw %xmm4, %xmm11392; SSE42-NEXT: packuswb %xmm1, %xmm01393; SSE42-NEXT: retq1394;1395; AVX2-LABEL: widen_cttz_undef_v2i32_v4i32:1396; AVX2: # %bb.0:1397; AVX2-NEXT: vpcmpeqd %xmm2, %xmm2, %xmm21398; AVX2-NEXT: vpaddd %xmm2, %xmm0, %xmm31399; AVX2-NEXT: vpandn %xmm3, %xmm0, %xmm01400; AVX2-NEXT: vpbroadcastb {{.*#+}} xmm3 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]1401; AVX2-NEXT: vpand %xmm3, %xmm0, %xmm41402; AVX2-NEXT: vmovdqa {{.*#+}} xmm5 = [0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4]1403; AVX2-NEXT: vpshufb %xmm4, %xmm5, %xmm41404; AVX2-NEXT: vpsrlw $4, %xmm0, %xmm01405; AVX2-NEXT: vpand %xmm3, %xmm0, %xmm01406; AVX2-NEXT: vpshufb %xmm0, %xmm5, %xmm01407; AVX2-NEXT: vpaddb %xmm4, %xmm0, %xmm01408; AVX2-NEXT: vpmovzxdq {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero1409; AVX2-NEXT: vpxor %xmm4, %xmm4, %xmm41410; AVX2-NEXT: vpsadbw %xmm4, %xmm0, %xmm01411; AVX2-NEXT: vpaddd %xmm2, %xmm1, %xmm21412; AVX2-NEXT: vpandn %xmm2, %xmm1, %xmm11413; AVX2-NEXT: vpand %xmm3, %xmm1, %xmm21414; AVX2-NEXT: vpshufb %xmm2, %xmm5, %xmm21415; AVX2-NEXT: vpsrlw $4, %xmm1, %xmm11416; AVX2-NEXT: vpand %xmm3, %xmm1, %xmm11417; AVX2-NEXT: vpshufb %xmm1, %xmm5, %xmm11418; AVX2-NEXT: vpaddb %xmm2, %xmm1, %xmm11419; AVX2-NEXT: vpmovzxdq {{.*#+}} xmm1 = xmm1[0],zero,xmm1[1],zero1420; AVX2-NEXT: vpsadbw %xmm4, %xmm1, %xmm11421; AVX2-NEXT: vpackuswb %xmm1, %xmm0, %xmm01422; AVX2-NEXT: retq1423;1424; AVX512VL-LABEL: widen_cttz_undef_v2i32_v4i32:1425; AVX512VL: # %bb.0:1426; AVX512VL-NEXT: vpcmpeqd %xmm2, %xmm2, %xmm21427; AVX512VL-NEXT: vpaddd %xmm2, %xmm0, %xmm31428; AVX512VL-NEXT: vpandn %xmm3, %xmm0, %xmm01429; AVX512VL-NEXT: vpbroadcastd {{.*#+}} xmm3 = [32,32,32,32]1430; AVX512VL-NEXT: vpaddd %xmm2, %xmm1, %xmm21431; AVX512VL-NEXT: vpandn %xmm2, %xmm1, %xmm11432; AVX512VL-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]1433; AVX512VL-NEXT: vplzcntd %xmm0, %xmm01434; AVX512VL-NEXT: vpsubd %xmm0, %xmm3, %xmm01435; AVX512VL-NEXT: retq1436;1437; AVX512VPOPCNT-LABEL: widen_cttz_undef_v2i32_v4i32:1438; AVX512VPOPCNT: # %bb.0:1439; AVX512VPOPCNT-NEXT: vpcmpeqd %xmm2, %xmm2, %xmm21440; AVX512VPOPCNT-NEXT: vpaddd %xmm2, %xmm0, %xmm31441; AVX512VPOPCNT-NEXT: vpandn %xmm3, %xmm0, %xmm01442; AVX512VPOPCNT-NEXT: vpaddd %xmm2, %xmm1, %xmm21443; AVX512VPOPCNT-NEXT: vpandn %xmm2, %xmm1, %xmm11444; AVX512VPOPCNT-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]1445; AVX512VPOPCNT-NEXT: vpopcntd %xmm0, %xmm01446; AVX512VPOPCNT-NEXT: retq1447 %b0 = call <2 x i32> @llvm.cttz.v2i32(<2 x i32> %a0, i1 1)1448 %b1 = call <2 x i32> @llvm.cttz.v2i32(<2 x i32> %a1, i1 1)1449 %res = shufflevector <2 x i32> %b0, <2 x i32> %b1, <4 x i32> <i32 0, i32 1, i32 2, i32 3>1450 ret <4 x i32> %res1451}1452 1453define <8 x i32> @widen_cttz_undef_v4i32_v8i32(<4 x i32> %a0, <4 x i32> %a1) {1454; SSE42-LABEL: widen_cttz_undef_v4i32_v8i32:1455; SSE42: # %bb.0:1456; SSE42-NEXT: pcmpeqd %xmm4, %xmm41457; SSE42-NEXT: movdqa %xmm0, %xmm21458; SSE42-NEXT: paddd %xmm4, %xmm21459; SSE42-NEXT: pandn %xmm2, %xmm01460; SSE42-NEXT: movdqa {{.*#+}} xmm3 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]1461; SSE42-NEXT: movdqa %xmm0, %xmm51462; SSE42-NEXT: pand %xmm3, %xmm51463; SSE42-NEXT: movdqa {{.*#+}} xmm2 = [0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4]1464; SSE42-NEXT: movdqa %xmm2, %xmm61465; SSE42-NEXT: pshufb %xmm5, %xmm61466; SSE42-NEXT: psrlw $4, %xmm01467; SSE42-NEXT: pand %xmm3, %xmm01468; SSE42-NEXT: movdqa %xmm2, %xmm51469; SSE42-NEXT: pshufb %xmm0, %xmm51470; SSE42-NEXT: paddb %xmm6, %xmm51471; SSE42-NEXT: pxor %xmm6, %xmm61472; SSE42-NEXT: pmovzxdq {{.*#+}} xmm0 = xmm5[0],zero,xmm5[1],zero1473; SSE42-NEXT: punpckhdq {{.*#+}} xmm5 = xmm5[2],xmm6[2],xmm5[3],xmm6[3]1474; SSE42-NEXT: psadbw %xmm6, %xmm51475; SSE42-NEXT: psadbw %xmm6, %xmm01476; SSE42-NEXT: packuswb %xmm5, %xmm01477; SSE42-NEXT: paddd %xmm1, %xmm41478; SSE42-NEXT: pandn %xmm4, %xmm11479; SSE42-NEXT: movdqa %xmm1, %xmm41480; SSE42-NEXT: pand %xmm3, %xmm41481; SSE42-NEXT: movdqa %xmm2, %xmm51482; SSE42-NEXT: pshufb %xmm4, %xmm51483; SSE42-NEXT: psrlw $4, %xmm11484; SSE42-NEXT: pand %xmm3, %xmm11485; SSE42-NEXT: pshufb %xmm1, %xmm21486; SSE42-NEXT: paddb %xmm5, %xmm21487; SSE42-NEXT: pmovzxdq {{.*#+}} xmm1 = xmm2[0],zero,xmm2[1],zero1488; SSE42-NEXT: punpckhdq {{.*#+}} xmm2 = xmm2[2],xmm6[2],xmm2[3],xmm6[3]1489; SSE42-NEXT: psadbw %xmm6, %xmm21490; SSE42-NEXT: psadbw %xmm6, %xmm11491; SSE42-NEXT: packuswb %xmm2, %xmm11492; SSE42-NEXT: retq1493;1494; AVX2-LABEL: widen_cttz_undef_v4i32_v8i32:1495; AVX2: # %bb.0:1496; AVX2-NEXT: # kill: def $xmm0 killed $xmm0 def $ymm01497; AVX2-NEXT: vinserti128 $1, %xmm1, %ymm0, %ymm01498; AVX2-NEXT: vpcmpeqd %ymm1, %ymm1, %ymm11499; AVX2-NEXT: vpaddd %ymm1, %ymm0, %ymm11500; AVX2-NEXT: vpandn %ymm1, %ymm0, %ymm01501; AVX2-NEXT: vpbroadcastb {{.*#+}} ymm1 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]1502; AVX2-NEXT: vpand %ymm1, %ymm0, %ymm21503; AVX2-NEXT: vbroadcasti128 {{.*#+}} ymm3 = [0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4,0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4]1504; AVX2-NEXT: # ymm3 = mem[0,1,0,1]1505; AVX2-NEXT: vpshufb %ymm2, %ymm3, %ymm21506; AVX2-NEXT: vpsrlw $4, %ymm0, %ymm01507; AVX2-NEXT: vpand %ymm1, %ymm0, %ymm01508; AVX2-NEXT: vpshufb %ymm0, %ymm3, %ymm01509; AVX2-NEXT: vpaddb %ymm2, %ymm0, %ymm01510; AVX2-NEXT: vpxor %xmm1, %xmm1, %xmm11511; AVX2-NEXT: vpunpckhdq {{.*#+}} ymm2 = ymm0[2],ymm1[2],ymm0[3],ymm1[3],ymm0[6],ymm1[6],ymm0[7],ymm1[7]1512; AVX2-NEXT: vpsadbw %ymm1, %ymm2, %ymm21513; AVX2-NEXT: vpunpckldq {{.*#+}} ymm0 = ymm0[0],ymm1[0],ymm0[1],ymm1[1],ymm0[4],ymm1[4],ymm0[5],ymm1[5]1514; AVX2-NEXT: vpsadbw %ymm1, %ymm0, %ymm01515; AVX2-NEXT: vpackuswb %ymm2, %ymm0, %ymm01516; AVX2-NEXT: retq1517;1518; AVX512VL-LABEL: widen_cttz_undef_v4i32_v8i32:1519; AVX512VL: # %bb.0:1520; AVX512VL-NEXT: # kill: def $xmm0 killed $xmm0 def $ymm01521; AVX512VL-NEXT: vinserti128 $1, %xmm1, %ymm0, %ymm01522; AVX512VL-NEXT: vpcmpeqd %ymm1, %ymm1, %ymm11523; AVX512VL-NEXT: vpaddd %ymm1, %ymm0, %ymm11524; AVX512VL-NEXT: vpandn %ymm1, %ymm0, %ymm01525; AVX512VL-NEXT: vplzcntd %ymm0, %ymm01526; AVX512VL-NEXT: vpbroadcastd {{.*#+}} ymm1 = [32,32,32,32,32,32,32,32]1527; AVX512VL-NEXT: vpsubd %ymm0, %ymm1, %ymm01528; AVX512VL-NEXT: retq1529;1530; AVX512VPOPCNT-LABEL: widen_cttz_undef_v4i32_v8i32:1531; AVX512VPOPCNT: # %bb.0:1532; AVX512VPOPCNT-NEXT: # kill: def $xmm0 killed $xmm0 def $ymm01533; AVX512VPOPCNT-NEXT: vinserti128 $1, %xmm1, %ymm0, %ymm01534; AVX512VPOPCNT-NEXT: vpcmpeqd %ymm1, %ymm1, %ymm11535; AVX512VPOPCNT-NEXT: vpaddd %ymm1, %ymm0, %ymm11536; AVX512VPOPCNT-NEXT: vpandn %ymm1, %ymm0, %ymm01537; AVX512VPOPCNT-NEXT: vpopcntd %ymm0, %ymm01538; AVX512VPOPCNT-NEXT: retq1539 %b0 = call <4 x i32> @llvm.cttz.v4i32(<4 x i32> %a0, i1 1)1540 %b1 = call <4 x i32> @llvm.cttz.v4i32(<4 x i32> %a1, i1 1)1541 %res = shufflevector <4 x i32> %b0, <4 x i32> %b1, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>1542 ret <8 x i32> %res1543}1544 1545define <8 x i32> @widen_cttz_undef_v2i32_v8i32(<2 x i32> %a0, <2 x i32> %a1, <2 x i32> %a2, <2 x i32> %a3) {1546; SSE42-LABEL: widen_cttz_undef_v2i32_v8i32:1547; SSE42: # %bb.0:1548; SSE42-NEXT: pcmpeqd %xmm6, %xmm61549; SSE42-NEXT: movdqa %xmm0, %xmm41550; SSE42-NEXT: paddd %xmm6, %xmm41551; SSE42-NEXT: pandn %xmm4, %xmm01552; SSE42-NEXT: movdqa {{.*#+}} xmm5 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]1553; SSE42-NEXT: movdqa %xmm0, %xmm71554; SSE42-NEXT: pand %xmm5, %xmm71555; SSE42-NEXT: movdqa {{.*#+}} xmm4 = [0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4]1556; SSE42-NEXT: movdqa %xmm4, %xmm81557; SSE42-NEXT: pshufb %xmm7, %xmm81558; SSE42-NEXT: psrlw $4, %xmm01559; SSE42-NEXT: pand %xmm5, %xmm01560; SSE42-NEXT: movdqa %xmm4, %xmm71561; SSE42-NEXT: pshufb %xmm0, %xmm71562; SSE42-NEXT: paddb %xmm8, %xmm71563; SSE42-NEXT: pmovzxdq {{.*#+}} xmm0 = xmm7[0],zero,xmm7[1],zero1564; SSE42-NEXT: pxor %xmm7, %xmm71565; SSE42-NEXT: psadbw %xmm7, %xmm01566; SSE42-NEXT: movdqa %xmm1, %xmm81567; SSE42-NEXT: paddd %xmm6, %xmm81568; SSE42-NEXT: pandn %xmm8, %xmm11569; SSE42-NEXT: movdqa %xmm1, %xmm81570; SSE42-NEXT: pand %xmm5, %xmm81571; SSE42-NEXT: movdqa %xmm4, %xmm91572; SSE42-NEXT: pshufb %xmm8, %xmm91573; SSE42-NEXT: psrlw $4, %xmm11574; SSE42-NEXT: pand %xmm5, %xmm11575; SSE42-NEXT: movdqa %xmm4, %xmm81576; SSE42-NEXT: pshufb %xmm1, %xmm81577; SSE42-NEXT: paddb %xmm9, %xmm81578; SSE42-NEXT: pmovzxdq {{.*#+}} xmm1 = xmm8[0],zero,xmm8[1],zero1579; SSE42-NEXT: psadbw %xmm7, %xmm11580; SSE42-NEXT: packuswb %xmm1, %xmm01581; SSE42-NEXT: movdqa %xmm2, %xmm11582; SSE42-NEXT: paddd %xmm6, %xmm11583; SSE42-NEXT: pandn %xmm1, %xmm21584; SSE42-NEXT: movdqa %xmm2, %xmm11585; SSE42-NEXT: pand %xmm5, %xmm11586; SSE42-NEXT: movdqa %xmm4, %xmm81587; SSE42-NEXT: pshufb %xmm1, %xmm81588; SSE42-NEXT: psrlw $4, %xmm21589; SSE42-NEXT: pand %xmm5, %xmm21590; SSE42-NEXT: movdqa %xmm4, %xmm11591; SSE42-NEXT: pshufb %xmm2, %xmm11592; SSE42-NEXT: paddb %xmm8, %xmm11593; SSE42-NEXT: pmovzxdq {{.*#+}} xmm1 = xmm1[0],zero,xmm1[1],zero1594; SSE42-NEXT: psadbw %xmm7, %xmm11595; SSE42-NEXT: paddd %xmm3, %xmm61596; SSE42-NEXT: pandn %xmm6, %xmm31597; SSE42-NEXT: movdqa %xmm3, %xmm21598; SSE42-NEXT: pand %xmm5, %xmm21599; SSE42-NEXT: movdqa %xmm4, %xmm61600; SSE42-NEXT: pshufb %xmm2, %xmm61601; SSE42-NEXT: psrlw $4, %xmm31602; SSE42-NEXT: pand %xmm5, %xmm31603; SSE42-NEXT: pshufb %xmm3, %xmm41604; SSE42-NEXT: paddb %xmm6, %xmm41605; SSE42-NEXT: pmovzxdq {{.*#+}} xmm2 = xmm4[0],zero,xmm4[1],zero1606; SSE42-NEXT: psadbw %xmm7, %xmm21607; SSE42-NEXT: packuswb %xmm2, %xmm11608; SSE42-NEXT: retq1609;1610; AVX2-LABEL: widen_cttz_undef_v2i32_v8i32:1611; AVX2: # %bb.0:1612; AVX2-NEXT: # kill: def $xmm1 killed $xmm1 def $ymm11613; AVX2-NEXT: # kill: def $xmm0 killed $xmm0 def $ymm01614; AVX2-NEXT: vinserti128 $1, %xmm3, %ymm1, %ymm11615; AVX2-NEXT: vpcmpeqd %ymm3, %ymm3, %ymm31616; AVX2-NEXT: vpaddd %ymm3, %ymm1, %ymm41617; AVX2-NEXT: vpandn %ymm4, %ymm1, %ymm11618; AVX2-NEXT: vpbroadcastb {{.*#+}} ymm4 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]1619; AVX2-NEXT: vpand %ymm4, %ymm1, %ymm51620; AVX2-NEXT: vbroadcasti128 {{.*#+}} ymm6 = [0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4,0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4]1621; AVX2-NEXT: # ymm6 = mem[0,1,0,1]1622; AVX2-NEXT: vpshufb %ymm5, %ymm6, %ymm51623; AVX2-NEXT: vpsrlw $4, %ymm1, %ymm11624; AVX2-NEXT: vpand %ymm4, %ymm1, %ymm11625; AVX2-NEXT: vpshufb %ymm1, %ymm6, %ymm11626; AVX2-NEXT: vpaddb %ymm5, %ymm1, %ymm11627; AVX2-NEXT: vpxor %xmm5, %xmm5, %xmm51628; AVX2-NEXT: vpunpckldq {{.*#+}} ymm1 = ymm1[0],ymm5[0],ymm1[1],ymm5[1],ymm1[4],ymm5[4],ymm1[5],ymm5[5]1629; AVX2-NEXT: vpsadbw %ymm5, %ymm1, %ymm11630; AVX2-NEXT: vinserti128 $1, %xmm2, %ymm0, %ymm01631; AVX2-NEXT: vpaddd %ymm3, %ymm0, %ymm21632; AVX2-NEXT: vpandn %ymm2, %ymm0, %ymm01633; AVX2-NEXT: vpand %ymm4, %ymm0, %ymm21634; AVX2-NEXT: vpshufb %ymm2, %ymm6, %ymm21635; AVX2-NEXT: vpsrlw $4, %ymm0, %ymm01636; AVX2-NEXT: vpand %ymm4, %ymm0, %ymm01637; AVX2-NEXT: vpshufb %ymm0, %ymm6, %ymm01638; AVX2-NEXT: vpaddb %ymm2, %ymm0, %ymm01639; AVX2-NEXT: vpunpckldq {{.*#+}} ymm0 = ymm0[0],ymm5[0],ymm0[1],ymm5[1],ymm0[4],ymm5[4],ymm0[5],ymm5[5]1640; AVX2-NEXT: vpsadbw %ymm5, %ymm0, %ymm01641; AVX2-NEXT: vpackuswb %ymm1, %ymm0, %ymm01642; AVX2-NEXT: retq1643;1644; AVX512VL-LABEL: widen_cttz_undef_v2i32_v8i32:1645; AVX512VL: # %bb.0:1646; AVX512VL-NEXT: # kill: def $xmm1 killed $xmm1 def $ymm11647; AVX512VL-NEXT: # kill: def $xmm0 killed $xmm0 def $ymm01648; AVX512VL-NEXT: vinserti128 $1, %xmm3, %ymm1, %ymm11649; AVX512VL-NEXT: vpcmpeqd %ymm3, %ymm3, %ymm31650; AVX512VL-NEXT: vpaddd %ymm3, %ymm1, %ymm41651; AVX512VL-NEXT: vpandn %ymm4, %ymm1, %ymm11652; AVX512VL-NEXT: vinserti128 $1, %xmm2, %ymm0, %ymm01653; AVX512VL-NEXT: vpaddd %ymm3, %ymm0, %ymm21654; AVX512VL-NEXT: vpandn %ymm2, %ymm0, %ymm01655; AVX512VL-NEXT: vpunpcklqdq {{.*#+}} ymm0 = ymm0[0],ymm1[0],ymm0[2],ymm1[2]1656; AVX512VL-NEXT: vplzcntd %ymm0, %ymm01657; AVX512VL-NEXT: vpbroadcastd {{.*#+}} ymm1 = [32,32,32,32,32,32,32,32]1658; AVX512VL-NEXT: vpsubd %ymm0, %ymm1, %ymm01659; AVX512VL-NEXT: retq1660;1661; AVX512VPOPCNT-LABEL: widen_cttz_undef_v2i32_v8i32:1662; AVX512VPOPCNT: # %bb.0:1663; AVX512VPOPCNT-NEXT: # kill: def $xmm1 killed $xmm1 def $ymm11664; AVX512VPOPCNT-NEXT: # kill: def $xmm0 killed $xmm0 def $ymm01665; AVX512VPOPCNT-NEXT: vinserti128 $1, %xmm3, %ymm1, %ymm11666; AVX512VPOPCNT-NEXT: vpcmpeqd %ymm3, %ymm3, %ymm31667; AVX512VPOPCNT-NEXT: vpaddd %ymm3, %ymm1, %ymm41668; AVX512VPOPCNT-NEXT: vpandn %ymm4, %ymm1, %ymm11669; AVX512VPOPCNT-NEXT: vinserti128 $1, %xmm2, %ymm0, %ymm01670; AVX512VPOPCNT-NEXT: vpaddd %ymm3, %ymm0, %ymm21671; AVX512VPOPCNT-NEXT: vpandn %ymm2, %ymm0, %ymm01672; AVX512VPOPCNT-NEXT: vpunpcklqdq {{.*#+}} ymm0 = ymm0[0],ymm1[0],ymm0[2],ymm1[2]1673; AVX512VPOPCNT-NEXT: vpopcntd %ymm0, %ymm01674; AVX512VPOPCNT-NEXT: retq1675 %b0 = call <2 x i32> @llvm.cttz.v2i32(<2 x i32> %a0, i1 1)1676 %b1 = call <2 x i32> @llvm.cttz.v2i32(<2 x i32> %a1, i1 1)1677 %b2 = call <2 x i32> @llvm.cttz.v2i32(<2 x i32> %a2, i1 1)1678 %b3 = call <2 x i32> @llvm.cttz.v2i32(<2 x i32> %a3, i1 1)1679 %res01 = shufflevector <2 x i32> %b0, <2 x i32> %b1, <4 x i32> <i32 0, i32 1, i32 2, i32 3>1680 %res23 = shufflevector <2 x i32> %b2, <2 x i32> %b3, <4 x i32> <i32 0, i32 1, i32 2, i32 3>1681 %res = shufflevector <4 x i32> %res01, <4 x i32> %res23, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>1682 ret <8 x i32> %res1683}1684 1685declare <2 x i32> @llvm.ctpop.v2i32(<2 x i32>)1686declare <4 x i32> @llvm.ctpop.v4i32(<4 x i32>)1687 1688declare <2 x i32> @llvm.ctlz.v2i32(<2 x i32>, i1)1689declare <4 x i32> @llvm.ctlz.v4i32(<4 x i32>, i1)1690 1691declare <2 x i32> @llvm.cttz.v2i32(<2 x i32>, i1)1692declare <4 x i32> @llvm.cttz.v4i32(<4 x i32>, i1)1693