1490 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+sse2 | FileCheck %s --check-prefixes=SSE,SSE23; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+sse4.2 | FileCheck %s --check-prefixes=SSE,SSE424; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx | FileCheck %s --check-prefixes=AVX,AVX15; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx2 | FileCheck %s --check-prefixes=AVX,AVX2,AVX2-SLOW6; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx2,+fast-variable-crosslane-shuffle,+fast-variable-perlane-shuffle | FileCheck %s --check-prefixes=AVX,AVX2,AVX2-FAST7; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx2,+fast-variable-perlane-shuffle | FileCheck %s --check-prefixes=AVX,AVX2,AVX2-FAST8; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f | FileCheck %s --check-prefixes=AVX512,AVX512F9; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512vl,+fast-variable-crosslane-shuffle,+fast-variable-perlane-shuffle | FileCheck %s --check-prefixes=AVX512,AVX512VL10; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512vl,+fast-variable-perlane-shuffle | FileCheck %s --check-prefixes=AVX512,AVX512VL11; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512bw,+fast-variable-crosslane-shuffle,+fast-variable-perlane-shuffle | FileCheck %s --check-prefixes=AVX512,AVX512BW12; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512bw,+fast-variable-perlane-shuffle | FileCheck %s --check-prefixes=AVX512,AVX512BW13; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512bw,+avx512vl,+fast-variable-crosslane-shuffle,+fast-variable-perlane-shuffle | FileCheck %s --check-prefixes=AVX512,AVX512BWVL,AVX512BWVL-ONLY14; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512bw,+avx512vl,+fast-variable-perlane-shuffle | FileCheck %s --check-prefixes=AVX512,AVX512BWVL,AVX512BWVL-ONLY15; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512vbmi,+avx512vl,+fast-variable-crosslane-shuffle,+fast-variable-perlane-shuffle | FileCheck %s --check-prefixes=AVX512,AVX512BWVL,AVX512VBMI,AVX512VBMI-FAST16; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512vbmi,+avx512vl,+fast-variable-perlane-shuffle | FileCheck %s --check-prefixes=AVX512,AVX512BWVL,AVX512VBMI,AVX512VBMI-SLOW17 18; PR3155119; Pairs of shufflevector:trunc functions with functional equivalence.20; Ideally, the shuffles should be lowered to code with the same quality as the truncates.21 22define void @shuffle_v16i8_to_v8i8(ptr %L, ptr %S) nounwind {23; SSE2-LABEL: shuffle_v16i8_to_v8i8:24; SSE2: # %bb.0:25; SSE2-NEXT: movdqa (%rdi), %xmm026; SSE2-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm027; SSE2-NEXT: packuswb %xmm0, %xmm028; SSE2-NEXT: movq %xmm0, (%rsi)29; SSE2-NEXT: retq30;31; SSE42-LABEL: shuffle_v16i8_to_v8i8:32; SSE42: # %bb.0:33; SSE42-NEXT: movdqa (%rdi), %xmm034; SSE42-NEXT: pshufb {{.*#+}} xmm0 = xmm0[0,2,4,6,8,10,12,14,u,u,u,u,u,u,u,u]35; SSE42-NEXT: movq %xmm0, (%rsi)36; SSE42-NEXT: retq37;38; AVX-LABEL: shuffle_v16i8_to_v8i8:39; AVX: # %bb.0:40; AVX-NEXT: vmovdqa (%rdi), %xmm041; AVX-NEXT: vpshufb {{.*#+}} xmm0 = xmm0[0,2,4,6,8,10,12,14,u,u,u,u,u,u,u,u]42; AVX-NEXT: vmovq %xmm0, (%rsi)43; AVX-NEXT: retq44;45; AVX512F-LABEL: shuffle_v16i8_to_v8i8:46; AVX512F: # %bb.0:47; AVX512F-NEXT: vmovdqa (%rdi), %xmm048; AVX512F-NEXT: vpshufb {{.*#+}} xmm0 = xmm0[0,2,4,6,8,10,12,14,u,u,u,u,u,u,u,u]49; AVX512F-NEXT: vmovq %xmm0, (%rsi)50; AVX512F-NEXT: retq51;52; AVX512VL-LABEL: shuffle_v16i8_to_v8i8:53; AVX512VL: # %bb.0:54; AVX512VL-NEXT: vmovdqa (%rdi), %xmm055; AVX512VL-NEXT: vpshufb {{.*#+}} xmm0 = xmm0[0,2,4,6,8,10,12,14,u,u,u,u,u,u,u,u]56; AVX512VL-NEXT: vmovq %xmm0, (%rsi)57; AVX512VL-NEXT: retq58;59; AVX512BW-LABEL: shuffle_v16i8_to_v8i8:60; AVX512BW: # %bb.0:61; AVX512BW-NEXT: vmovdqa (%rdi), %xmm062; AVX512BW-NEXT: vpshufb {{.*#+}} xmm0 = xmm0[0,2,4,6,8,10,12,14,u,u,u,u,u,u,u,u]63; AVX512BW-NEXT: vmovq %xmm0, (%rsi)64; AVX512BW-NEXT: retq65;66; AVX512BWVL-LABEL: shuffle_v16i8_to_v8i8:67; AVX512BWVL: # %bb.0:68; AVX512BWVL-NEXT: vmovdqa (%rdi), %xmm069; AVX512BWVL-NEXT: vpmovwb %xmm0, (%rsi)70; AVX512BWVL-NEXT: retq71 %vec = load <16 x i8>, ptr %L72 %strided.vec = shufflevector <16 x i8> %vec, <16 x i8> undef, <8 x i32> <i32 0, i32 2, i32 4, i32 6, i32 8, i32 10, i32 12, i32 14>73 store <8 x i8> %strided.vec, ptr %S74 ret void75}76 77define void @trunc_v8i16_to_v8i8(ptr %L, ptr %S) nounwind {78; SSE2-LABEL: trunc_v8i16_to_v8i8:79; SSE2: # %bb.0:80; SSE2-NEXT: movdqa (%rdi), %xmm081; SSE2-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm082; SSE2-NEXT: packuswb %xmm0, %xmm083; SSE2-NEXT: movq %xmm0, (%rsi)84; SSE2-NEXT: retq85;86; SSE42-LABEL: trunc_v8i16_to_v8i8:87; SSE42: # %bb.0:88; SSE42-NEXT: movdqa (%rdi), %xmm089; SSE42-NEXT: pshufb {{.*#+}} xmm0 = xmm0[0,2,4,6,8,10,12,14,u,u,u,u,u,u,u,u]90; SSE42-NEXT: movq %xmm0, (%rsi)91; SSE42-NEXT: retq92;93; AVX-LABEL: trunc_v8i16_to_v8i8:94; AVX: # %bb.0:95; AVX-NEXT: vmovdqa (%rdi), %xmm096; AVX-NEXT: vpshufb {{.*#+}} xmm0 = xmm0[0,2,4,6,8,10,12,14,u,u,u,u,u,u,u,u]97; AVX-NEXT: vmovq %xmm0, (%rsi)98; AVX-NEXT: retq99;100; AVX512F-LABEL: trunc_v8i16_to_v8i8:101; AVX512F: # %bb.0:102; AVX512F-NEXT: vmovdqa (%rdi), %xmm0103; AVX512F-NEXT: vpshufb {{.*#+}} xmm0 = xmm0[0,2,4,6,8,10,12,14,u,u,u,u,u,u,u,u]104; AVX512F-NEXT: vmovq %xmm0, (%rsi)105; AVX512F-NEXT: retq106;107; AVX512VL-LABEL: trunc_v8i16_to_v8i8:108; AVX512VL: # %bb.0:109; AVX512VL-NEXT: vmovdqa (%rdi), %xmm0110; AVX512VL-NEXT: vpshufb {{.*#+}} xmm0 = xmm0[0,2,4,6,8,10,12,14,u,u,u,u,u,u,u,u]111; AVX512VL-NEXT: vmovq %xmm0, (%rsi)112; AVX512VL-NEXT: retq113;114; AVX512BW-LABEL: trunc_v8i16_to_v8i8:115; AVX512BW: # %bb.0:116; AVX512BW-NEXT: vmovdqa (%rdi), %xmm0117; AVX512BW-NEXT: vpshufb {{.*#+}} xmm0 = xmm0[0,2,4,6,8,10,12,14,u,u,u,u,u,u,u,u]118; AVX512BW-NEXT: vmovq %xmm0, (%rsi)119; AVX512BW-NEXT: retq120;121; AVX512BWVL-LABEL: trunc_v8i16_to_v8i8:122; AVX512BWVL: # %bb.0:123; AVX512BWVL-NEXT: vmovdqa (%rdi), %xmm0124; AVX512BWVL-NEXT: vpmovwb %xmm0, (%rsi)125; AVX512BWVL-NEXT: retq126 %vec = load <16 x i8>, ptr %L127 %bc = bitcast <16 x i8> %vec to <8 x i16>128 %strided.vec = trunc <8 x i16> %bc to <8 x i8>129 store <8 x i8> %strided.vec, ptr %S130 ret void131}132 133define void @shuffle_v8i16_to_v4i16(ptr %L, ptr %S) nounwind {134; SSE2-LABEL: shuffle_v8i16_to_v4i16:135; SSE2: # %bb.0:136; SSE2-NEXT: pshuflw {{.*#+}} xmm0 = mem[0,2,2,3,4,5,6,7]137; SSE2-NEXT: pshufhw {{.*#+}} xmm0 = xmm0[0,1,2,3,4,6,6,7]138; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]139; SSE2-NEXT: movq %xmm0, (%rsi)140; SSE2-NEXT: retq141;142; SSE42-LABEL: shuffle_v8i16_to_v4i16:143; SSE42: # %bb.0:144; SSE42-NEXT: movdqa (%rdi), %xmm0145; SSE42-NEXT: pshufb {{.*#+}} xmm0 = xmm0[0,1,4,5,8,9,12,13,u,u,u,u,u,u,u,u]146; SSE42-NEXT: movq %xmm0, (%rsi)147; SSE42-NEXT: retq148;149; AVX-LABEL: shuffle_v8i16_to_v4i16:150; AVX: # %bb.0:151; AVX-NEXT: vmovdqa (%rdi), %xmm0152; AVX-NEXT: vpshufb {{.*#+}} xmm0 = xmm0[0,1,4,5,8,9,12,13,u,u,u,u,u,u,u,u]153; AVX-NEXT: vmovq %xmm0, (%rsi)154; AVX-NEXT: retq155;156; AVX512F-LABEL: shuffle_v8i16_to_v4i16:157; AVX512F: # %bb.0:158; AVX512F-NEXT: vmovdqa (%rdi), %xmm0159; AVX512F-NEXT: vpshufb {{.*#+}} xmm0 = xmm0[0,1,4,5,8,9,12,13,u,u,u,u,u,u,u,u]160; AVX512F-NEXT: vmovq %xmm0, (%rsi)161; AVX512F-NEXT: retq162;163; AVX512VL-LABEL: shuffle_v8i16_to_v4i16:164; AVX512VL: # %bb.0:165; AVX512VL-NEXT: vmovdqa (%rdi), %xmm0166; AVX512VL-NEXT: vpmovdw %xmm0, (%rsi)167; AVX512VL-NEXT: retq168;169; AVX512BW-LABEL: shuffle_v8i16_to_v4i16:170; AVX512BW: # %bb.0:171; AVX512BW-NEXT: vmovdqa (%rdi), %xmm0172; AVX512BW-NEXT: vpshufb {{.*#+}} xmm0 = xmm0[0,1,4,5,8,9,12,13,u,u,u,u,u,u,u,u]173; AVX512BW-NEXT: vmovq %xmm0, (%rsi)174; AVX512BW-NEXT: retq175;176; AVX512BWVL-LABEL: shuffle_v8i16_to_v4i16:177; AVX512BWVL: # %bb.0:178; AVX512BWVL-NEXT: vmovdqa (%rdi), %xmm0179; AVX512BWVL-NEXT: vpmovdw %xmm0, (%rsi)180; AVX512BWVL-NEXT: retq181 %vec = load <8 x i16>, ptr %L182 %strided.vec = shufflevector <8 x i16> %vec, <8 x i16> undef, <4 x i32> <i32 0, i32 2, i32 4, i32 6>183 store <4 x i16> %strided.vec, ptr %S184 ret void185}186 187define void @trunc_v4i32_to_v4i16(ptr %L, ptr %S) nounwind {188; SSE2-LABEL: trunc_v4i32_to_v4i16:189; SSE2: # %bb.0:190; SSE2-NEXT: pshuflw {{.*#+}} xmm0 = mem[0,2,2,3,4,5,6,7]191; SSE2-NEXT: pshufhw {{.*#+}} xmm0 = xmm0[0,1,2,3,4,6,6,7]192; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]193; SSE2-NEXT: movq %xmm0, (%rsi)194; SSE2-NEXT: retq195;196; SSE42-LABEL: trunc_v4i32_to_v4i16:197; SSE42: # %bb.0:198; SSE42-NEXT: movdqa (%rdi), %xmm0199; SSE42-NEXT: pshufb {{.*#+}} xmm0 = xmm0[0,1,4,5,8,9,12,13,u,u,u,u,u,u,u,u]200; SSE42-NEXT: movq %xmm0, (%rsi)201; SSE42-NEXT: retq202;203; AVX-LABEL: trunc_v4i32_to_v4i16:204; AVX: # %bb.0:205; AVX-NEXT: vmovdqa (%rdi), %xmm0206; AVX-NEXT: vpshufb {{.*#+}} xmm0 = xmm0[0,1,4,5,8,9,12,13,u,u,u,u,u,u,u,u]207; AVX-NEXT: vmovq %xmm0, (%rsi)208; AVX-NEXT: retq209;210; AVX512F-LABEL: trunc_v4i32_to_v4i16:211; AVX512F: # %bb.0:212; AVX512F-NEXT: vmovdqa (%rdi), %xmm0213; AVX512F-NEXT: vpshufb {{.*#+}} xmm0 = xmm0[0,1,4,5,8,9,12,13,u,u,u,u,u,u,u,u]214; AVX512F-NEXT: vmovq %xmm0, (%rsi)215; AVX512F-NEXT: retq216;217; AVX512VL-LABEL: trunc_v4i32_to_v4i16:218; AVX512VL: # %bb.0:219; AVX512VL-NEXT: vmovdqa (%rdi), %xmm0220; AVX512VL-NEXT: vpmovdw %xmm0, (%rsi)221; AVX512VL-NEXT: retq222;223; AVX512BW-LABEL: trunc_v4i32_to_v4i16:224; AVX512BW: # %bb.0:225; AVX512BW-NEXT: vmovdqa (%rdi), %xmm0226; AVX512BW-NEXT: vpshufb {{.*#+}} xmm0 = xmm0[0,1,4,5,8,9,12,13,u,u,u,u,u,u,u,u]227; AVX512BW-NEXT: vmovq %xmm0, (%rsi)228; AVX512BW-NEXT: retq229;230; AVX512BWVL-LABEL: trunc_v4i32_to_v4i16:231; AVX512BWVL: # %bb.0:232; AVX512BWVL-NEXT: vmovdqa (%rdi), %xmm0233; AVX512BWVL-NEXT: vpmovdw %xmm0, (%rsi)234; AVX512BWVL-NEXT: retq235 %vec = load <8 x i16>, ptr %L236 %bc = bitcast <8 x i16> %vec to <4 x i32>237 %strided.vec = trunc <4 x i32> %bc to <4 x i16>238 store <4 x i16> %strided.vec, ptr %S239 ret void240}241 242define void @shuffle_v4i32_to_v2i32(ptr %L, ptr %S) nounwind {243; SSE-LABEL: shuffle_v4i32_to_v2i32:244; SSE: # %bb.0:245; SSE-NEXT: pshufd {{.*#+}} xmm0 = mem[0,2,2,3]246; SSE-NEXT: movq %xmm0, (%rsi)247; SSE-NEXT: retq248;249; AVX-LABEL: shuffle_v4i32_to_v2i32:250; AVX: # %bb.0:251; AVX-NEXT: vpermilps {{.*#+}} xmm0 = mem[0,2,2,3]252; AVX-NEXT: vmovlps %xmm0, (%rsi)253; AVX-NEXT: retq254;255; AVX512-LABEL: shuffle_v4i32_to_v2i32:256; AVX512: # %bb.0:257; AVX512-NEXT: vpermilps {{.*#+}} xmm0 = mem[0,2,2,3]258; AVX512-NEXT: vmovlps %xmm0, (%rsi)259; AVX512-NEXT: retq260 %vec = load <4 x i32>, ptr %L261 %strided.vec = shufflevector <4 x i32> %vec, <4 x i32> undef, <2 x i32> <i32 0, i32 2>262 store <2 x i32> %strided.vec, ptr %S263 ret void264}265 266define void @trunc_v2i64_to_v2i32(ptr %L, ptr %S) nounwind {267; SSE-LABEL: trunc_v2i64_to_v2i32:268; SSE: # %bb.0:269; SSE-NEXT: pshufd {{.*#+}} xmm0 = mem[0,2,2,3]270; SSE-NEXT: movq %xmm0, (%rsi)271; SSE-NEXT: retq272;273; AVX-LABEL: trunc_v2i64_to_v2i32:274; AVX: # %bb.0:275; AVX-NEXT: vpermilps {{.*#+}} xmm0 = mem[0,2,2,3]276; AVX-NEXT: vmovlps %xmm0, (%rsi)277; AVX-NEXT: retq278;279; AVX512F-LABEL: trunc_v2i64_to_v2i32:280; AVX512F: # %bb.0:281; AVX512F-NEXT: vpermilps {{.*#+}} xmm0 = mem[0,2,2,3]282; AVX512F-NEXT: vmovlps %xmm0, (%rsi)283; AVX512F-NEXT: retq284;285; AVX512VL-LABEL: trunc_v2i64_to_v2i32:286; AVX512VL: # %bb.0:287; AVX512VL-NEXT: vmovdqa (%rdi), %xmm0288; AVX512VL-NEXT: vpmovqd %xmm0, (%rsi)289; AVX512VL-NEXT: retq290;291; AVX512BW-LABEL: trunc_v2i64_to_v2i32:292; AVX512BW: # %bb.0:293; AVX512BW-NEXT: vpermilps {{.*#+}} xmm0 = mem[0,2,2,3]294; AVX512BW-NEXT: vmovlps %xmm0, (%rsi)295; AVX512BW-NEXT: retq296;297; AVX512BWVL-LABEL: trunc_v2i64_to_v2i32:298; AVX512BWVL: # %bb.0:299; AVX512BWVL-NEXT: vmovdqa (%rdi), %xmm0300; AVX512BWVL-NEXT: vpmovqd %xmm0, (%rsi)301; AVX512BWVL-NEXT: retq302 %vec = load <4 x i32>, ptr %L303 %bc = bitcast <4 x i32> %vec to <2 x i64>304 %strided.vec = trunc <2 x i64> %bc to <2 x i32>305 store <2 x i32> %strided.vec, ptr %S306 ret void307}308 309define void @shuffle_v16i8_to_v4i8(ptr %L, ptr %S) nounwind {310; SSE2-LABEL: shuffle_v16i8_to_v4i8:311; SSE2: # %bb.0:312; SSE2-NEXT: movdqa (%rdi), %xmm0313; SSE2-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0314; SSE2-NEXT: packuswb %xmm0, %xmm0315; SSE2-NEXT: packuswb %xmm0, %xmm0316; SSE2-NEXT: movd %xmm0, (%rsi)317; SSE2-NEXT: retq318;319; SSE42-LABEL: shuffle_v16i8_to_v4i8:320; SSE42: # %bb.0:321; SSE42-NEXT: movdqa (%rdi), %xmm0322; SSE42-NEXT: pshufb {{.*#+}} xmm0 = xmm0[0,4,8,12,u,u,u,u,u,u,u,u,u,u,u,u]323; SSE42-NEXT: movd %xmm0, (%rsi)324; SSE42-NEXT: retq325;326; AVX-LABEL: shuffle_v16i8_to_v4i8:327; AVX: # %bb.0:328; AVX-NEXT: vmovdqa (%rdi), %xmm0329; AVX-NEXT: vpshufb {{.*#+}} xmm0 = xmm0[0,4,8,12,u,u,u,u,u,u,u,u,u,u,u,u]330; AVX-NEXT: vmovd %xmm0, (%rsi)331; AVX-NEXT: retq332;333; AVX512F-LABEL: shuffle_v16i8_to_v4i8:334; AVX512F: # %bb.0:335; AVX512F-NEXT: vmovdqa (%rdi), %xmm0336; AVX512F-NEXT: vpshufb {{.*#+}} xmm0 = xmm0[0,4,8,12,u,u,u,u,u,u,u,u,u,u,u,u]337; AVX512F-NEXT: vmovd %xmm0, (%rsi)338; AVX512F-NEXT: retq339;340; AVX512VL-LABEL: shuffle_v16i8_to_v4i8:341; AVX512VL: # %bb.0:342; AVX512VL-NEXT: vmovdqa (%rdi), %xmm0343; AVX512VL-NEXT: vpmovdb %xmm0, (%rsi)344; AVX512VL-NEXT: retq345;346; AVX512BW-LABEL: shuffle_v16i8_to_v4i8:347; AVX512BW: # %bb.0:348; AVX512BW-NEXT: vmovdqa (%rdi), %xmm0349; AVX512BW-NEXT: vpshufb {{.*#+}} xmm0 = xmm0[0,4,8,12,u,u,u,u,u,u,u,u,u,u,u,u]350; AVX512BW-NEXT: vmovd %xmm0, (%rsi)351; AVX512BW-NEXT: retq352;353; AVX512BWVL-LABEL: shuffle_v16i8_to_v4i8:354; AVX512BWVL: # %bb.0:355; AVX512BWVL-NEXT: vmovdqa (%rdi), %xmm0356; AVX512BWVL-NEXT: vpmovdb %xmm0, (%rsi)357; AVX512BWVL-NEXT: retq358 %vec = load <16 x i8>, ptr %L359 %strided.vec = shufflevector <16 x i8> %vec, <16 x i8> undef, <4 x i32> <i32 0, i32 4, i32 8, i32 12>360 store <4 x i8> %strided.vec, ptr %S361 ret void362}363 364define void @trunc_v4i32_to_v4i8(ptr %L, ptr %S) nounwind {365; SSE2-LABEL: trunc_v4i32_to_v4i8:366; SSE2: # %bb.0:367; SSE2-NEXT: movdqa (%rdi), %xmm0368; SSE2-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0369; SSE2-NEXT: packuswb %xmm0, %xmm0370; SSE2-NEXT: packuswb %xmm0, %xmm0371; SSE2-NEXT: movd %xmm0, (%rsi)372; SSE2-NEXT: retq373;374; SSE42-LABEL: trunc_v4i32_to_v4i8:375; SSE42: # %bb.0:376; SSE42-NEXT: movdqa (%rdi), %xmm0377; SSE42-NEXT: pshufb {{.*#+}} xmm0 = xmm0[0,4,8,12,u,u,u,u,u,u,u,u,u,u,u,u]378; SSE42-NEXT: movd %xmm0, (%rsi)379; SSE42-NEXT: retq380;381; AVX-LABEL: trunc_v4i32_to_v4i8:382; AVX: # %bb.0:383; AVX-NEXT: vmovdqa (%rdi), %xmm0384; AVX-NEXT: vpshufb {{.*#+}} xmm0 = xmm0[0,4,8,12,u,u,u,u,u,u,u,u,u,u,u,u]385; AVX-NEXT: vmovd %xmm0, (%rsi)386; AVX-NEXT: retq387;388; AVX512F-LABEL: trunc_v4i32_to_v4i8:389; AVX512F: # %bb.0:390; AVX512F-NEXT: vmovdqa (%rdi), %xmm0391; AVX512F-NEXT: vpshufb {{.*#+}} xmm0 = xmm0[0,4,8,12,u,u,u,u,u,u,u,u,u,u,u,u]392; AVX512F-NEXT: vmovd %xmm0, (%rsi)393; AVX512F-NEXT: retq394;395; AVX512VL-LABEL: trunc_v4i32_to_v4i8:396; AVX512VL: # %bb.0:397; AVX512VL-NEXT: vmovdqa (%rdi), %xmm0398; AVX512VL-NEXT: vpmovdb %xmm0, (%rsi)399; AVX512VL-NEXT: retq400;401; AVX512BW-LABEL: trunc_v4i32_to_v4i8:402; AVX512BW: # %bb.0:403; AVX512BW-NEXT: vmovdqa (%rdi), %xmm0404; AVX512BW-NEXT: vpshufb {{.*#+}} xmm0 = xmm0[0,4,8,12,u,u,u,u,u,u,u,u,u,u,u,u]405; AVX512BW-NEXT: vmovd %xmm0, (%rsi)406; AVX512BW-NEXT: retq407;408; AVX512BWVL-LABEL: trunc_v4i32_to_v4i8:409; AVX512BWVL: # %bb.0:410; AVX512BWVL-NEXT: vmovdqa (%rdi), %xmm0411; AVX512BWVL-NEXT: vpmovdb %xmm0, (%rsi)412; AVX512BWVL-NEXT: retq413 %vec = load <16 x i8>, ptr %L414 %bc = bitcast <16 x i8> %vec to <4 x i32>415 %strided.vec = trunc <4 x i32> %bc to <4 x i8>416 store <4 x i8> %strided.vec, ptr %S417 ret void418}419 420define void @shuffle_v8i16_to_v2i16(ptr %L, ptr %S) nounwind {421; SSE-LABEL: shuffle_v8i16_to_v2i16:422; SSE: # %bb.0:423; SSE-NEXT: pshufd {{.*#+}} xmm0 = mem[0,2,2,3]424; SSE-NEXT: pshuflw {{.*#+}} xmm0 = xmm0[0,2,2,3,4,5,6,7]425; SSE-NEXT: movd %xmm0, (%rsi)426; SSE-NEXT: retq427;428; AVX1-LABEL: shuffle_v8i16_to_v2i16:429; AVX1: # %bb.0:430; AVX1-NEXT: vpshufd {{.*#+}} xmm0 = mem[0,2,2,3]431; AVX1-NEXT: vpshuflw {{.*#+}} xmm0 = xmm0[0,2,2,3,4,5,6,7]432; AVX1-NEXT: vmovd %xmm0, (%rsi)433; AVX1-NEXT: retq434;435; AVX2-SLOW-LABEL: shuffle_v8i16_to_v2i16:436; AVX2-SLOW: # %bb.0:437; AVX2-SLOW-NEXT: vpshufd {{.*#+}} xmm0 = mem[0,2,2,3]438; AVX2-SLOW-NEXT: vpshuflw {{.*#+}} xmm0 = xmm0[0,2,2,3,4,5,6,7]439; AVX2-SLOW-NEXT: vmovd %xmm0, (%rsi)440; AVX2-SLOW-NEXT: retq441;442; AVX2-FAST-LABEL: shuffle_v8i16_to_v2i16:443; AVX2-FAST: # %bb.0:444; AVX2-FAST-NEXT: vmovdqa (%rdi), %xmm0445; AVX2-FAST-NEXT: vpshufb {{.*#+}} xmm0 = xmm0[0,1,8,9,u,u,u,u,u,u,u,u,u,u,u,u]446; AVX2-FAST-NEXT: vmovd %xmm0, (%rsi)447; AVX2-FAST-NEXT: retq448;449; AVX512F-LABEL: shuffle_v8i16_to_v2i16:450; AVX512F: # %bb.0:451; AVX512F-NEXT: vpshufd {{.*#+}} xmm0 = mem[0,2,2,3]452; AVX512F-NEXT: vpshuflw {{.*#+}} xmm0 = xmm0[0,2,2,3,4,5,6,7]453; AVX512F-NEXT: vmovd %xmm0, (%rsi)454; AVX512F-NEXT: retq455;456; AVX512VL-LABEL: shuffle_v8i16_to_v2i16:457; AVX512VL: # %bb.0:458; AVX512VL-NEXT: vmovdqa (%rdi), %xmm0459; AVX512VL-NEXT: vpmovqw %xmm0, (%rsi)460; AVX512VL-NEXT: retq461;462; AVX512BW-LABEL: shuffle_v8i16_to_v2i16:463; AVX512BW: # %bb.0:464; AVX512BW-NEXT: vmovdqa (%rdi), %xmm0465; AVX512BW-NEXT: vpshufb {{.*#+}} xmm0 = xmm0[0,1,8,9,u,u,u,u,u,u,u,u,u,u,u,u]466; AVX512BW-NEXT: vmovd %xmm0, (%rsi)467; AVX512BW-NEXT: retq468;469; AVX512BWVL-LABEL: shuffle_v8i16_to_v2i16:470; AVX512BWVL: # %bb.0:471; AVX512BWVL-NEXT: vmovdqa (%rdi), %xmm0472; AVX512BWVL-NEXT: vpmovqw %xmm0, (%rsi)473; AVX512BWVL-NEXT: retq474 %vec = load <8 x i16>, ptr %L475 %strided.vec = shufflevector <8 x i16> %vec, <8 x i16> undef, <2 x i32> <i32 0, i32 4>476 store <2 x i16> %strided.vec, ptr %S477 ret void478}479 480define void @trunc_v2i64_to_v2i16(ptr %L, ptr %S) nounwind {481; SSE-LABEL: trunc_v2i64_to_v2i16:482; SSE: # %bb.0:483; SSE-NEXT: pshufd {{.*#+}} xmm0 = mem[0,2,2,3]484; SSE-NEXT: pshuflw {{.*#+}} xmm0 = xmm0[0,2,2,3,4,5,6,7]485; SSE-NEXT: movd %xmm0, (%rsi)486; SSE-NEXT: retq487;488; AVX1-LABEL: trunc_v2i64_to_v2i16:489; AVX1: # %bb.0:490; AVX1-NEXT: vpshufd {{.*#+}} xmm0 = mem[0,2,2,3]491; AVX1-NEXT: vpshuflw {{.*#+}} xmm0 = xmm0[0,2,2,3,4,5,6,7]492; AVX1-NEXT: vmovd %xmm0, (%rsi)493; AVX1-NEXT: retq494;495; AVX2-SLOW-LABEL: trunc_v2i64_to_v2i16:496; AVX2-SLOW: # %bb.0:497; AVX2-SLOW-NEXT: vpshufd {{.*#+}} xmm0 = mem[0,2,2,3]498; AVX2-SLOW-NEXT: vpshuflw {{.*#+}} xmm0 = xmm0[0,2,2,3,4,5,6,7]499; AVX2-SLOW-NEXT: vmovd %xmm0, (%rsi)500; AVX2-SLOW-NEXT: retq501;502; AVX2-FAST-LABEL: trunc_v2i64_to_v2i16:503; AVX2-FAST: # %bb.0:504; AVX2-FAST-NEXT: vmovdqa (%rdi), %xmm0505; AVX2-FAST-NEXT: vpshufb {{.*#+}} xmm0 = xmm0[0,1,8,9,u,u,u,u,u,u,u,u,u,u,u,u]506; AVX2-FAST-NEXT: vmovd %xmm0, (%rsi)507; AVX2-FAST-NEXT: retq508;509; AVX512F-LABEL: trunc_v2i64_to_v2i16:510; AVX512F: # %bb.0:511; AVX512F-NEXT: vpshufd {{.*#+}} xmm0 = mem[0,2,2,3]512; AVX512F-NEXT: vpshuflw {{.*#+}} xmm0 = xmm0[0,2,2,3,4,5,6,7]513; AVX512F-NEXT: vmovd %xmm0, (%rsi)514; AVX512F-NEXT: retq515;516; AVX512VL-LABEL: trunc_v2i64_to_v2i16:517; AVX512VL: # %bb.0:518; AVX512VL-NEXT: vmovdqa (%rdi), %xmm0519; AVX512VL-NEXT: vpmovqw %xmm0, (%rsi)520; AVX512VL-NEXT: retq521;522; AVX512BW-LABEL: trunc_v2i64_to_v2i16:523; AVX512BW: # %bb.0:524; AVX512BW-NEXT: vmovdqa (%rdi), %xmm0525; AVX512BW-NEXT: vpshufb {{.*#+}} xmm0 = xmm0[0,1,8,9,u,u,u,u,u,u,u,u,u,u,u,u]526; AVX512BW-NEXT: vmovd %xmm0, (%rsi)527; AVX512BW-NEXT: retq528;529; AVX512BWVL-LABEL: trunc_v2i64_to_v2i16:530; AVX512BWVL: # %bb.0:531; AVX512BWVL-NEXT: vmovdqa (%rdi), %xmm0532; AVX512BWVL-NEXT: vpmovqw %xmm0, (%rsi)533; AVX512BWVL-NEXT: retq534 %vec = load <8 x i16>, ptr %L535 %bc = bitcast <8 x i16> %vec to <2 x i64>536 %strided.vec = trunc <2 x i64> %bc to <2 x i16>537 store <2 x i16> %strided.vec, ptr %S538 ret void539}540 541define void @shuffle_v16i8_to_v2i8(ptr %L, ptr %S) nounwind {542; SSE2-LABEL: shuffle_v16i8_to_v2i8:543; SSE2: # %bb.0:544; SSE2-NEXT: movdqa (%rdi), %xmm0545; SSE2-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0546; SSE2-NEXT: packuswb %xmm0, %xmm0547; SSE2-NEXT: packuswb %xmm0, %xmm0548; SSE2-NEXT: packuswb %xmm0, %xmm0549; SSE2-NEXT: movd %xmm0, %eax550; SSE2-NEXT: movw %ax, (%rsi)551; SSE2-NEXT: retq552;553; SSE42-LABEL: shuffle_v16i8_to_v2i8:554; SSE42: # %bb.0:555; SSE42-NEXT: movdqa (%rdi), %xmm0556; SSE42-NEXT: pshufb {{.*#+}} xmm0 = xmm0[0,8,u,u,u,u,u,u,u,u,u,u,u,u,u,u]557; SSE42-NEXT: pextrw $0, %xmm0, (%rsi)558; SSE42-NEXT: retq559;560; AVX-LABEL: shuffle_v16i8_to_v2i8:561; AVX: # %bb.0:562; AVX-NEXT: vmovdqa (%rdi), %xmm0563; AVX-NEXT: vpshufb {{.*#+}} xmm0 = xmm0[0,8,u,u,u,u,u,u,u,u,u,u,u,u,u,u]564; AVX-NEXT: vpextrw $0, %xmm0, (%rsi)565; AVX-NEXT: retq566;567; AVX512F-LABEL: shuffle_v16i8_to_v2i8:568; AVX512F: # %bb.0:569; AVX512F-NEXT: vmovdqa (%rdi), %xmm0570; AVX512F-NEXT: vpshufb {{.*#+}} xmm0 = xmm0[0,8,u,u,u,u,u,u,u,u,u,u,u,u,u,u]571; AVX512F-NEXT: vpextrw $0, %xmm0, (%rsi)572; AVX512F-NEXT: retq573;574; AVX512VL-LABEL: shuffle_v16i8_to_v2i8:575; AVX512VL: # %bb.0:576; AVX512VL-NEXT: vmovdqa (%rdi), %xmm0577; AVX512VL-NEXT: vpmovqb %xmm0, (%rsi)578; AVX512VL-NEXT: retq579;580; AVX512BW-LABEL: shuffle_v16i8_to_v2i8:581; AVX512BW: # %bb.0:582; AVX512BW-NEXT: vmovdqa (%rdi), %xmm0583; AVX512BW-NEXT: vpshufb {{.*#+}} xmm0 = xmm0[0,8,u,u,u,u,u,u,u,u,u,u,u,u,u,u]584; AVX512BW-NEXT: vpextrw $0, %xmm0, (%rsi)585; AVX512BW-NEXT: retq586;587; AVX512BWVL-LABEL: shuffle_v16i8_to_v2i8:588; AVX512BWVL: # %bb.0:589; AVX512BWVL-NEXT: vmovdqa (%rdi), %xmm0590; AVX512BWVL-NEXT: vpmovqb %xmm0, (%rsi)591; AVX512BWVL-NEXT: retq592 %vec = load <16 x i8>, ptr %L593 %strided.vec = shufflevector <16 x i8> %vec, <16 x i8> undef, <2 x i32> <i32 0, i32 8>594 store <2 x i8> %strided.vec, ptr %S595 ret void596}597 598define void @trunc_v2i64_to_v2i8(ptr %L, ptr %S) nounwind {599; SSE2-LABEL: trunc_v2i64_to_v2i8:600; SSE2: # %bb.0:601; SSE2-NEXT: movdqa (%rdi), %xmm0602; SSE2-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0603; SSE2-NEXT: packuswb %xmm0, %xmm0604; SSE2-NEXT: packuswb %xmm0, %xmm0605; SSE2-NEXT: packuswb %xmm0, %xmm0606; SSE2-NEXT: movd %xmm0, %eax607; SSE2-NEXT: movw %ax, (%rsi)608; SSE2-NEXT: retq609;610; SSE42-LABEL: trunc_v2i64_to_v2i8:611; SSE42: # %bb.0:612; SSE42-NEXT: movdqa (%rdi), %xmm0613; SSE42-NEXT: pshufb {{.*#+}} xmm0 = xmm0[0,8,u,u,u,u,u,u,u,u,u,u,u,u,u,u]614; SSE42-NEXT: pextrw $0, %xmm0, (%rsi)615; SSE42-NEXT: retq616;617; AVX-LABEL: trunc_v2i64_to_v2i8:618; AVX: # %bb.0:619; AVX-NEXT: vmovdqa (%rdi), %xmm0620; AVX-NEXT: vpshufb {{.*#+}} xmm0 = xmm0[0,8,u,u,u,u,u,u,u,u,u,u,u,u,u,u]621; AVX-NEXT: vpextrw $0, %xmm0, (%rsi)622; AVX-NEXT: retq623;624; AVX512F-LABEL: trunc_v2i64_to_v2i8:625; AVX512F: # %bb.0:626; AVX512F-NEXT: vmovdqa (%rdi), %xmm0627; AVX512F-NEXT: vpshufb {{.*#+}} xmm0 = xmm0[0,8,u,u,u,u,u,u,u,u,u,u,u,u,u,u]628; AVX512F-NEXT: vpextrw $0, %xmm0, (%rsi)629; AVX512F-NEXT: retq630;631; AVX512VL-LABEL: trunc_v2i64_to_v2i8:632; AVX512VL: # %bb.0:633; AVX512VL-NEXT: vmovdqa (%rdi), %xmm0634; AVX512VL-NEXT: vpmovqb %xmm0, (%rsi)635; AVX512VL-NEXT: retq636;637; AVX512BW-LABEL: trunc_v2i64_to_v2i8:638; AVX512BW: # %bb.0:639; AVX512BW-NEXT: vmovdqa (%rdi), %xmm0640; AVX512BW-NEXT: vpshufb {{.*#+}} xmm0 = xmm0[0,8,u,u,u,u,u,u,u,u,u,u,u,u,u,u]641; AVX512BW-NEXT: vpextrw $0, %xmm0, (%rsi)642; AVX512BW-NEXT: retq643;644; AVX512BWVL-LABEL: trunc_v2i64_to_v2i8:645; AVX512BWVL: # %bb.0:646; AVX512BWVL-NEXT: vmovdqa (%rdi), %xmm0647; AVX512BWVL-NEXT: vpmovqb %xmm0, (%rsi)648; AVX512BWVL-NEXT: retq649 %vec = load <16 x i8>, ptr %L650 %bc = bitcast <16 x i8> %vec to <2 x i64>651 %strided.vec = trunc <2 x i64> %bc to <2 x i8>652 store <2 x i8> %strided.vec, ptr %S653 ret void654}655 656; PR88030 - Select sub-elements and truncate657 658define <16 x i8> @evenelts_v32i16_shuffle_v16i16_to_v16i8(<32 x i16> %n2) nounwind {659; SSE2-LABEL: evenelts_v32i16_shuffle_v16i16_to_v16i8:660; SSE2: # %bb.0:661; SSE2-NEXT: movdqa {{.*#+}} xmm4 = [255,0,255,0,255,0,255,0]662; SSE2-NEXT: pand %xmm4, %xmm3663; SSE2-NEXT: pand %xmm4, %xmm2664; SSE2-NEXT: packuswb %xmm3, %xmm2665; SSE2-NEXT: pand %xmm4, %xmm1666; SSE2-NEXT: pand %xmm4, %xmm0667; SSE2-NEXT: packuswb %xmm1, %xmm0668; SSE2-NEXT: packuswb %xmm2, %xmm0669; SSE2-NEXT: retq670;671; SSE42-LABEL: evenelts_v32i16_shuffle_v16i16_to_v16i8:672; SSE42: # %bb.0:673; SSE42-NEXT: movq {{.*#+}} xmm4 = [0,0,0,0,0,4,8,12,0,0,0,0,0,0,0,0]674; SSE42-NEXT: pshufb %xmm4, %xmm3675; SSE42-NEXT: pshufb %xmm4, %xmm2676; SSE42-NEXT: punpckldq {{.*#+}} xmm2 = xmm2[0],xmm3[0],xmm2[1],xmm3[1]677; SSE42-NEXT: movd {{.*#+}} xmm3 = [0,4,8,12,0,0,0,0,0,0,0,0,0,0,0,0]678; SSE42-NEXT: pshufb %xmm3, %xmm1679; SSE42-NEXT: pshufb %xmm3, %xmm0680; SSE42-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]681; SSE42-NEXT: pblendw {{.*#+}} xmm0 = xmm0[0,1,2,3],xmm2[4,5,6,7]682; SSE42-NEXT: retq683;684; AVX1-LABEL: evenelts_v32i16_shuffle_v16i16_to_v16i8:685; AVX1: # %bb.0:686; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2687; AVX1-NEXT: vbroadcastss {{.*#+}} xmm3 = [0,4,8,12,0,4,8,12,0,4,8,12,0,4,8,12]688; AVX1-NEXT: vpshufb %xmm3, %xmm2, %xmm2689; AVX1-NEXT: vpshufb %xmm3, %xmm1, %xmm1690; AVX1-NEXT: vpunpckldq {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1]691; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2692; AVX1-NEXT: vmovd {{.*#+}} xmm3 = [0,4,8,12,0,0,0,0,0,0,0,0,0,0,0,0]693; AVX1-NEXT: vpshufb %xmm3, %xmm2, %xmm2694; AVX1-NEXT: vpshufb %xmm3, %xmm0, %xmm0695; AVX1-NEXT: vpunpckldq {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1]696; AVX1-NEXT: vpblendw {{.*#+}} xmm0 = xmm0[0,1,2,3],xmm1[4,5,6,7]697; AVX1-NEXT: vzeroupper698; AVX1-NEXT: retq699;700; AVX2-LABEL: evenelts_v32i16_shuffle_v16i16_to_v16i8:701; AVX2: # %bb.0:702; AVX2-NEXT: vpbroadcastd {{.*#+}} ymm2 = [0,4,8,12,0,4,8,12,0,4,8,12,0,4,8,12,0,4,8,12,0,4,8,12,0,4,8,12,0,4,8,12]703; AVX2-NEXT: vpshufb %ymm2, %ymm0, %ymm0704; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm3705; AVX2-NEXT: vpunpckldq {{.*#+}} xmm0 = xmm0[0],xmm3[0],xmm0[1],xmm3[1]706; AVX2-NEXT: vpshufb %ymm2, %ymm1, %ymm1707; AVX2-NEXT: vpmovsxbd {{.*#+}} xmm2 = [0,0,0,4]708; AVX2-NEXT: vpermd %ymm1, %ymm2, %ymm1709; AVX2-NEXT: vpblendd {{.*#+}} xmm0 = xmm0[0,1],xmm1[2,3]710; AVX2-NEXT: vzeroupper711; AVX2-NEXT: retq712;713; AVX512-LABEL: evenelts_v32i16_shuffle_v16i16_to_v16i8:714; AVX512: # %bb.0:715; AVX512-NEXT: vpmovdb %zmm0, %xmm0716; AVX512-NEXT: vzeroupper717; AVX512-NEXT: retq718 %n0 = bitcast <32 x i16> %n2 to <64 x i8>719 %p = shufflevector <64 x i8> %n0, <64 x i8> poison, <16 x i32> <i32 0, i32 4, i32 8, i32 12, i32 16, i32 20, i32 24, i32 28, i32 32, i32 36, i32 40, i32 44, i32 48, i32 52, i32 56, i32 60>720 ret <16 x i8> %p721}722 723define <16 x i8> @oddelts_v32i16_shuffle_v16i16_to_v16i8(<32 x i16> %n2) nounwind {724; SSE2-LABEL: oddelts_v32i16_shuffle_v16i16_to_v16i8:725; SSE2: # %bb.0:726; SSE2-NEXT: pshuflw {{.*#+}} xmm3 = xmm3[3,1,2,3,4,5,6,7]727; SSE2-NEXT: pshufhw {{.*#+}} xmm3 = xmm3[0,1,2,3,7,5,6,7]728; SSE2-NEXT: movdqa {{.*#+}} xmm4 = [255,255,255,255,255,255,255,255]729; SSE2-NEXT: pand %xmm4, %xmm3730; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm3[0,1,2,0]731; SSE2-NEXT: pshufhw {{.*#+}} xmm3 = xmm3[0,1,2,3,7,6,5,4]732; SSE2-NEXT: pshuflw {{.*#+}} xmm2 = xmm2[3,1,2,3,4,5,6,7]733; SSE2-NEXT: pshufhw {{.*#+}} xmm2 = xmm2[0,1,2,3,7,5,6,7]734; SSE2-NEXT: pand %xmm4, %xmm2735; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm2[0,2,2,3]736; SSE2-NEXT: pshuflw {{.*#+}} xmm2 = xmm2[1,0,3,2,4,5,6,7]737; SSE2-NEXT: packuswb %xmm3, %xmm2738; SSE2-NEXT: pshuflw {{.*#+}} xmm1 = xmm1[3,1,2,3,4,5,6,7]739; SSE2-NEXT: pshufhw {{.*#+}} xmm1 = xmm1[0,1,2,3,7,5,6,7]740; SSE2-NEXT: pand %xmm4, %xmm1741; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm1[0,1,2,0]742; SSE2-NEXT: pshufhw {{.*#+}} xmm1 = xmm1[0,1,2,3,7,6,5,4]743; SSE2-NEXT: pshuflw {{.*#+}} xmm0 = xmm0[3,1,2,3,4,5,6,7]744; SSE2-NEXT: pshufhw {{.*#+}} xmm0 = xmm0[0,1,2,3,7,5,6,7]745; SSE2-NEXT: pand %xmm4, %xmm0746; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]747; SSE2-NEXT: pshuflw {{.*#+}} xmm0 = xmm0[1,0,3,2,4,5,6,7]748; SSE2-NEXT: packuswb %xmm1, %xmm0749; SSE2-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,3],xmm2[0,3]750; SSE2-NEXT: retq751;752; SSE42-LABEL: oddelts_v32i16_shuffle_v16i16_to_v16i8:753; SSE42: # %bb.0:754; SSE42-NEXT: movq {{.*#+}} xmm4 = [0,0,0,0,2,6,10,14,0,0,0,0,0,0,0,0]755; SSE42-NEXT: pshufb %xmm4, %xmm3756; SSE42-NEXT: pshufb %xmm4, %xmm2757; SSE42-NEXT: punpckldq {{.*#+}} xmm2 = xmm2[0],xmm3[0],xmm2[1],xmm3[1]758; SSE42-NEXT: movd {{.*#+}} xmm3 = [2,6,10,14,0,0,0,0,0,0,0,0,0,0,0,0]759; SSE42-NEXT: pshufb %xmm3, %xmm1760; SSE42-NEXT: pshufb %xmm3, %xmm0761; SSE42-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]762; SSE42-NEXT: pblendw {{.*#+}} xmm0 = xmm0[0,1,2,3],xmm2[4,5,6,7]763; SSE42-NEXT: retq764;765; AVX1-LABEL: oddelts_v32i16_shuffle_v16i16_to_v16i8:766; AVX1: # %bb.0:767; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2768; AVX1-NEXT: vbroadcastss {{.*#+}} xmm3 = [2,6,10,14,2,6,10,14,2,6,10,14,2,6,10,14]769; AVX1-NEXT: vpshufb %xmm3, %xmm2, %xmm2770; AVX1-NEXT: vpshufb %xmm3, %xmm1, %xmm1771; AVX1-NEXT: vpunpckldq {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1]772; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2773; AVX1-NEXT: vmovd {{.*#+}} xmm3 = [2,6,10,14,0,0,0,0,0,0,0,0,0,0,0,0]774; AVX1-NEXT: vpshufb %xmm3, %xmm2, %xmm2775; AVX1-NEXT: vpshufb %xmm3, %xmm0, %xmm0776; AVX1-NEXT: vpunpckldq {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1]777; AVX1-NEXT: vpblendw {{.*#+}} xmm0 = xmm0[0,1,2,3],xmm1[4,5,6,7]778; AVX1-NEXT: vzeroupper779; AVX1-NEXT: retq780;781; AVX2-LABEL: oddelts_v32i16_shuffle_v16i16_to_v16i8:782; AVX2: # %bb.0:783; AVX2-NEXT: vpbroadcastd {{.*#+}} ymm2 = [2,6,10,14,2,6,10,14,2,6,10,14,2,6,10,14,2,6,10,14,2,6,10,14,2,6,10,14,2,6,10,14]784; AVX2-NEXT: vpshufb %ymm2, %ymm0, %ymm0785; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm3786; AVX2-NEXT: vpunpckldq {{.*#+}} xmm0 = xmm0[0],xmm3[0],xmm0[1],xmm3[1]787; AVX2-NEXT: vpshufb %ymm2, %ymm1, %ymm1788; AVX2-NEXT: vpmovsxbd {{.*#+}} xmm2 = [0,0,0,4]789; AVX2-NEXT: vpermd %ymm1, %ymm2, %ymm1790; AVX2-NEXT: vpblendd {{.*#+}} xmm0 = xmm0[0,1],xmm1[2,3]791; AVX2-NEXT: vzeroupper792; AVX2-NEXT: retq793;794; AVX512-LABEL: oddelts_v32i16_shuffle_v16i16_to_v16i8:795; AVX512: # %bb.0:796; AVX512-NEXT: vpsrld $16, %zmm0, %zmm0797; AVX512-NEXT: vpmovdb %zmm0, %xmm0798; AVX512-NEXT: vzeroupper799; AVX512-NEXT: retq800 %n0 = bitcast <32 x i16> %n2 to <64 x i8>801 %p = shufflevector <64 x i8> %n0, <64 x i8> poison, <16 x i32> <i32 2, i32 6, i32 10, i32 14, i32 18, i32 22, i32 26, i32 30, i32 34, i32 38, i32 42, i32 46, i32 50, i32 54, i32 58, i32 62>802 ret <16 x i8> %p803}804 805define <16 x i8> @evenelts_v32i16_trunc_v16i16_to_v16i8(<32 x i16> %n2) nounwind {806; SSE2-LABEL: evenelts_v32i16_trunc_v16i16_to_v16i8:807; SSE2: # %bb.0:808; SSE2-NEXT: pushq %rbp809; SSE2-NEXT: pushq %r14810; SSE2-NEXT: pushq %rbx811; SSE2-NEXT: pextrw $2, %xmm0, %eax812; SSE2-NEXT: pextrw $4, %xmm0, %ecx813; SSE2-NEXT: pextrw $6, %xmm0, %edx814; SSE2-NEXT: pextrw $2, %xmm1, %esi815; SSE2-NEXT: pextrw $4, %xmm1, %edi816; SSE2-NEXT: pextrw $6, %xmm1, %r8d817; SSE2-NEXT: pextrw $2, %xmm2, %r9d818; SSE2-NEXT: pextrw $4, %xmm2, %r10d819; SSE2-NEXT: pextrw $6, %xmm2, %r11d820; SSE2-NEXT: pextrw $2, %xmm3, %ebx821; SSE2-NEXT: pextrw $4, %xmm3, %ebp822; SSE2-NEXT: pextrw $6, %xmm3, %r14d823; SSE2-NEXT: movd %r14d, %xmm4824; SSE2-NEXT: movd %ebp, %xmm5825; SSE2-NEXT: punpcklbw {{.*#+}} xmm5 = xmm5[0],xmm4[0],xmm5[1],xmm4[1],xmm5[2],xmm4[2],xmm5[3],xmm4[3],xmm5[4],xmm4[4],xmm5[5],xmm4[5],xmm5[6],xmm4[6],xmm5[7],xmm4[7]826; SSE2-NEXT: movd %ebx, %xmm4827; SSE2-NEXT: punpcklbw {{.*#+}} xmm3 = xmm3[0],xmm4[0],xmm3[1],xmm4[1],xmm3[2],xmm4[2],xmm3[3],xmm4[3],xmm3[4],xmm4[4],xmm3[5],xmm4[5],xmm3[6],xmm4[6],xmm3[7],xmm4[7]828; SSE2-NEXT: punpcklwd {{.*#+}} xmm3 = xmm3[0],xmm5[0],xmm3[1],xmm5[1],xmm3[2],xmm5[2],xmm3[3],xmm5[3]829; SSE2-NEXT: movd %r11d, %xmm4830; SSE2-NEXT: movd %r10d, %xmm5831; SSE2-NEXT: punpcklbw {{.*#+}} xmm5 = xmm5[0],xmm4[0],xmm5[1],xmm4[1],xmm5[2],xmm4[2],xmm5[3],xmm4[3],xmm5[4],xmm4[4],xmm5[5],xmm4[5],xmm5[6],xmm4[6],xmm5[7],xmm4[7]832; SSE2-NEXT: movd %r9d, %xmm4833; SSE2-NEXT: punpcklbw {{.*#+}} xmm2 = xmm2[0],xmm4[0],xmm2[1],xmm4[1],xmm2[2],xmm4[2],xmm2[3],xmm4[3],xmm2[4],xmm4[4],xmm2[5],xmm4[5],xmm2[6],xmm4[6],xmm2[7],xmm4[7]834; SSE2-NEXT: punpcklwd {{.*#+}} xmm2 = xmm2[0],xmm5[0],xmm2[1],xmm5[1],xmm2[2],xmm5[2],xmm2[3],xmm5[3]835; SSE2-NEXT: punpckldq {{.*#+}} xmm2 = xmm2[0],xmm3[0],xmm2[1],xmm3[1]836; SSE2-NEXT: movd %r8d, %xmm3837; SSE2-NEXT: movd %edi, %xmm4838; SSE2-NEXT: punpcklbw {{.*#+}} xmm4 = xmm4[0],xmm3[0],xmm4[1],xmm3[1],xmm4[2],xmm3[2],xmm4[3],xmm3[3],xmm4[4],xmm3[4],xmm4[5],xmm3[5],xmm4[6],xmm3[6],xmm4[7],xmm3[7]839; SSE2-NEXT: movd %esi, %xmm3840; SSE2-NEXT: punpcklbw {{.*#+}} xmm1 = xmm1[0],xmm3[0],xmm1[1],xmm3[1],xmm1[2],xmm3[2],xmm1[3],xmm3[3],xmm1[4],xmm3[4],xmm1[5],xmm3[5],xmm1[6],xmm3[6],xmm1[7],xmm3[7]841; SSE2-NEXT: punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm4[0],xmm1[1],xmm4[1],xmm1[2],xmm4[2],xmm1[3],xmm4[3]842; SSE2-NEXT: movd %edx, %xmm3843; SSE2-NEXT: movd %ecx, %xmm4844; SSE2-NEXT: punpcklbw {{.*#+}} xmm4 = xmm4[0],xmm3[0],xmm4[1],xmm3[1],xmm4[2],xmm3[2],xmm4[3],xmm3[3],xmm4[4],xmm3[4],xmm4[5],xmm3[5],xmm4[6],xmm3[6],xmm4[7],xmm3[7]845; SSE2-NEXT: movd %eax, %xmm3846; SSE2-NEXT: punpcklbw {{.*#+}} xmm0 = xmm0[0],xmm3[0],xmm0[1],xmm3[1],xmm0[2],xmm3[2],xmm0[3],xmm3[3],xmm0[4],xmm3[4],xmm0[5],xmm3[5],xmm0[6],xmm3[6],xmm0[7],xmm3[7]847; SSE2-NEXT: punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm4[0],xmm0[1],xmm4[1],xmm0[2],xmm4[2],xmm0[3],xmm4[3]848; SSE2-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]849; SSE2-NEXT: punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm2[0]850; SSE2-NEXT: popq %rbx851; SSE2-NEXT: popq %r14852; SSE2-NEXT: popq %rbp853; SSE2-NEXT: retq854;855; SSE42-LABEL: evenelts_v32i16_trunc_v16i16_to_v16i8:856; SSE42: # %bb.0:857; SSE42-NEXT: pushq %rbp858; SSE42-NEXT: pushq %r14859; SSE42-NEXT: pushq %rbx860; SSE42-NEXT: pextrw $6, %xmm3, %eax861; SSE42-NEXT: pextrw $4, %xmm3, %ecx862; SSE42-NEXT: pextrw $2, %xmm3, %edx863; SSE42-NEXT: movd %xmm3, %esi864; SSE42-NEXT: pextrw $6, %xmm2, %edi865; SSE42-NEXT: pextrw $4, %xmm2, %r8d866; SSE42-NEXT: pextrw $2, %xmm2, %r9d867; SSE42-NEXT: movd %xmm2, %r10d868; SSE42-NEXT: pextrw $6, %xmm1, %r11d869; SSE42-NEXT: pextrw $4, %xmm1, %ebx870; SSE42-NEXT: pextrw $2, %xmm1, %ebp871; SSE42-NEXT: movd %xmm1, %r14d872; SSE42-NEXT: pshufb {{.*#+}} xmm0 = xmm0[0,4,8,12,u,u,u,u,u,u,u,u,u,u,u,u]873; SSE42-NEXT: pinsrb $4, %r14d, %xmm0874; SSE42-NEXT: pinsrb $5, %ebp, %xmm0875; SSE42-NEXT: pinsrb $6, %ebx, %xmm0876; SSE42-NEXT: pinsrb $7, %r11d, %xmm0877; SSE42-NEXT: pinsrb $8, %r10d, %xmm0878; SSE42-NEXT: pinsrb $9, %r9d, %xmm0879; SSE42-NEXT: pinsrb $10, %r8d, %xmm0880; SSE42-NEXT: pinsrb $11, %edi, %xmm0881; SSE42-NEXT: pinsrb $12, %esi, %xmm0882; SSE42-NEXT: pinsrb $13, %edx, %xmm0883; SSE42-NEXT: pinsrb $14, %ecx, %xmm0884; SSE42-NEXT: pinsrb $15, %eax, %xmm0885; SSE42-NEXT: popq %rbx886; SSE42-NEXT: popq %r14887; SSE42-NEXT: popq %rbp888; SSE42-NEXT: retq889;890; AVX1-LABEL: evenelts_v32i16_trunc_v16i16_to_v16i8:891; AVX1: # %bb.0:892; AVX1-NEXT: pushq %rbp893; AVX1-NEXT: pushq %r14894; AVX1-NEXT: pushq %rbx895; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2896; AVX1-NEXT: vpextrw $6, %xmm2, %eax897; AVX1-NEXT: vpextrw $4, %xmm2, %ecx898; AVX1-NEXT: vpextrw $2, %xmm2, %edx899; AVX1-NEXT: vmovd %xmm2, %esi900; AVX1-NEXT: vpextrw $6, %xmm1, %edi901; AVX1-NEXT: vpextrw $4, %xmm1, %r8d902; AVX1-NEXT: vpextrw $2, %xmm1, %r9d903; AVX1-NEXT: vmovd %xmm1, %r10d904; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1905; AVX1-NEXT: vpextrw $6, %xmm1, %r11d906; AVX1-NEXT: vpextrw $4, %xmm1, %ebx907; AVX1-NEXT: vpextrw $2, %xmm1, %ebp908; AVX1-NEXT: vmovd %xmm1, %r14d909; AVX1-NEXT: vpshufb {{.*#+}} xmm0 = xmm0[0,4,8,12,u,u,u,u,u,u,u,u,u,u,u,u]910; AVX1-NEXT: vpinsrb $4, %r14d, %xmm0, %xmm0911; AVX1-NEXT: vpinsrb $5, %ebp, %xmm0, %xmm0912; AVX1-NEXT: vpinsrb $6, %ebx, %xmm0, %xmm0913; AVX1-NEXT: vpinsrb $7, %r11d, %xmm0, %xmm0914; AVX1-NEXT: vpinsrb $8, %r10d, %xmm0, %xmm0915; AVX1-NEXT: vpinsrb $9, %r9d, %xmm0, %xmm0916; AVX1-NEXT: vpinsrb $10, %r8d, %xmm0, %xmm0917; AVX1-NEXT: vpinsrb $11, %edi, %xmm0, %xmm0918; AVX1-NEXT: vpinsrb $12, %esi, %xmm0, %xmm0919; AVX1-NEXT: vpinsrb $13, %edx, %xmm0, %xmm0920; AVX1-NEXT: vpinsrb $14, %ecx, %xmm0, %xmm0921; AVX1-NEXT: vpinsrb $15, %eax, %xmm0, %xmm0922; AVX1-NEXT: popq %rbx923; AVX1-NEXT: popq %r14924; AVX1-NEXT: popq %rbp925; AVX1-NEXT: vzeroupper926; AVX1-NEXT: retq927;928; AVX2-LABEL: evenelts_v32i16_trunc_v16i16_to_v16i8:929; AVX2: # %bb.0:930; AVX2-NEXT: pushq %rbp931; AVX2-NEXT: pushq %r14932; AVX2-NEXT: pushq %rbx933; AVX2-NEXT: vextracti128 $1, %ymm1, %xmm2934; AVX2-NEXT: vpextrw $6, %xmm2, %eax935; AVX2-NEXT: vpextrw $4, %xmm2, %ecx936; AVX2-NEXT: vpextrw $2, %xmm2, %edx937; AVX2-NEXT: vmovd %xmm2, %esi938; AVX2-NEXT: vpextrw $6, %xmm1, %edi939; AVX2-NEXT: vpextrw $4, %xmm1, %r8d940; AVX2-NEXT: vpextrw $2, %xmm1, %r9d941; AVX2-NEXT: vmovd %xmm1, %r10d942; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1943; AVX2-NEXT: vpextrw $6, %xmm1, %r11d944; AVX2-NEXT: vpextrw $4, %xmm1, %ebx945; AVX2-NEXT: vpextrw $2, %xmm1, %ebp946; AVX2-NEXT: vmovd %xmm1, %r14d947; AVX2-NEXT: vpshufb {{.*#+}} xmm0 = xmm0[0,4,8,12,u,u,u,u,u,u,u,u,u,u,u,u]948; AVX2-NEXT: vpinsrb $4, %r14d, %xmm0, %xmm0949; AVX2-NEXT: vpinsrb $5, %ebp, %xmm0, %xmm0950; AVX2-NEXT: vpinsrb $6, %ebx, %xmm0, %xmm0951; AVX2-NEXT: vpinsrb $7, %r11d, %xmm0, %xmm0952; AVX2-NEXT: vpinsrb $8, %r10d, %xmm0, %xmm0953; AVX2-NEXT: vpinsrb $9, %r9d, %xmm0, %xmm0954; AVX2-NEXT: vpinsrb $10, %r8d, %xmm0, %xmm0955; AVX2-NEXT: vpinsrb $11, %edi, %xmm0, %xmm0956; AVX2-NEXT: vpinsrb $12, %esi, %xmm0, %xmm0957; AVX2-NEXT: vpinsrb $13, %edx, %xmm0, %xmm0958; AVX2-NEXT: vpinsrb $14, %ecx, %xmm0, %xmm0959; AVX2-NEXT: vpinsrb $15, %eax, %xmm0, %xmm0960; AVX2-NEXT: popq %rbx961; AVX2-NEXT: popq %r14962; AVX2-NEXT: popq %rbp963; AVX2-NEXT: vzeroupper964; AVX2-NEXT: retq965;966; AVX512F-LABEL: evenelts_v32i16_trunc_v16i16_to_v16i8:967; AVX512F: # %bb.0:968; AVX512F-NEXT: pushq %rbp969; AVX512F-NEXT: pushq %rbx970; AVX512F-NEXT: vpmovdb %zmm0, %xmm1971; AVX512F-NEXT: vextracti32x4 $3, %zmm0, %xmm2972; AVX512F-NEXT: vpextrw $6, %xmm2, %eax973; AVX512F-NEXT: vpextrw $4, %xmm2, %ecx974; AVX512F-NEXT: vpextrw $2, %xmm2, %edx975; AVX512F-NEXT: vmovd %xmm2, %esi976; AVX512F-NEXT: vextracti32x4 $2, %zmm0, %xmm2977; AVX512F-NEXT: vpextrw $6, %xmm2, %edi978; AVX512F-NEXT: vpextrw $4, %xmm2, %r8d979; AVX512F-NEXT: vpextrw $2, %xmm2, %r9d980; AVX512F-NEXT: vmovd %xmm2, %r10d981; AVX512F-NEXT: vextracti128 $1, %ymm0, %xmm0982; AVX512F-NEXT: vpextrw $6, %xmm0, %r11d983; AVX512F-NEXT: vpextrw $4, %xmm0, %ebx984; AVX512F-NEXT: vpextrw $2, %xmm0, %ebp985; AVX512F-NEXT: vpinsrb $5, %ebp, %xmm1, %xmm0986; AVX512F-NEXT: vpinsrb $6, %ebx, %xmm0, %xmm0987; AVX512F-NEXT: vpinsrb $7, %r11d, %xmm0, %xmm0988; AVX512F-NEXT: vpinsrb $8, %r10d, %xmm0, %xmm0989; AVX512F-NEXT: vpinsrb $9, %r9d, %xmm0, %xmm0990; AVX512F-NEXT: vpinsrb $10, %r8d, %xmm0, %xmm0991; AVX512F-NEXT: vpinsrb $11, %edi, %xmm0, %xmm0992; AVX512F-NEXT: vpinsrb $12, %esi, %xmm0, %xmm0993; AVX512F-NEXT: vpinsrb $13, %edx, %xmm0, %xmm0994; AVX512F-NEXT: vpinsrb $14, %ecx, %xmm0, %xmm0995; AVX512F-NEXT: vpinsrb $15, %eax, %xmm0, %xmm0996; AVX512F-NEXT: popq %rbx997; AVX512F-NEXT: popq %rbp998; AVX512F-NEXT: vzeroupper999; AVX512F-NEXT: retq1000;1001; AVX512VL-LABEL: evenelts_v32i16_trunc_v16i16_to_v16i8:1002; AVX512VL: # %bb.0:1003; AVX512VL-NEXT: pushq %rbp1004; AVX512VL-NEXT: pushq %r141005; AVX512VL-NEXT: pushq %rbx1006; AVX512VL-NEXT: vextracti32x4 $3, %zmm0, %xmm11007; AVX512VL-NEXT: vpextrw $6, %xmm1, %eax1008; AVX512VL-NEXT: vpextrw $4, %xmm1, %ecx1009; AVX512VL-NEXT: vpextrw $2, %xmm1, %edx1010; AVX512VL-NEXT: vmovd %xmm1, %esi1011; AVX512VL-NEXT: vextracti32x4 $2, %zmm0, %xmm11012; AVX512VL-NEXT: vpextrw $6, %xmm1, %edi1013; AVX512VL-NEXT: vpextrw $4, %xmm1, %r8d1014; AVX512VL-NEXT: vpextrw $2, %xmm1, %r9d1015; AVX512VL-NEXT: vmovd %xmm1, %r10d1016; AVX512VL-NEXT: vextracti128 $1, %ymm0, %xmm11017; AVX512VL-NEXT: vpextrw $6, %xmm1, %r11d1018; AVX512VL-NEXT: vpextrw $4, %xmm1, %ebx1019; AVX512VL-NEXT: vpextrw $2, %xmm1, %ebp1020; AVX512VL-NEXT: vmovd %xmm1, %r14d1021; AVX512VL-NEXT: vpmovdb %xmm0, %xmm01022; AVX512VL-NEXT: vpinsrb $4, %r14d, %xmm0, %xmm01023; AVX512VL-NEXT: vpinsrb $5, %ebp, %xmm0, %xmm01024; AVX512VL-NEXT: vpinsrb $6, %ebx, %xmm0, %xmm01025; AVX512VL-NEXT: vpinsrb $7, %r11d, %xmm0, %xmm01026; AVX512VL-NEXT: vpinsrb $8, %r10d, %xmm0, %xmm01027; AVX512VL-NEXT: vpinsrb $9, %r9d, %xmm0, %xmm01028; AVX512VL-NEXT: vpinsrb $10, %r8d, %xmm0, %xmm01029; AVX512VL-NEXT: vpinsrb $11, %edi, %xmm0, %xmm01030; AVX512VL-NEXT: vpinsrb $12, %esi, %xmm0, %xmm01031; AVX512VL-NEXT: vpinsrb $13, %edx, %xmm0, %xmm01032; AVX512VL-NEXT: vpinsrb $14, %ecx, %xmm0, %xmm01033; AVX512VL-NEXT: vpinsrb $15, %eax, %xmm0, %xmm01034; AVX512VL-NEXT: popq %rbx1035; AVX512VL-NEXT: popq %r141036; AVX512VL-NEXT: popq %rbp1037; AVX512VL-NEXT: vzeroupper1038; AVX512VL-NEXT: retq1039;1040; AVX512BW-LABEL: evenelts_v32i16_trunc_v16i16_to_v16i8:1041; AVX512BW: # %bb.0:1042; AVX512BW-NEXT: pushq %rbp1043; AVX512BW-NEXT: pushq %rbx1044; AVX512BW-NEXT: vpmovdb %zmm0, %xmm11045; AVX512BW-NEXT: vextracti32x4 $3, %zmm0, %xmm21046; AVX512BW-NEXT: vpextrw $6, %xmm2, %eax1047; AVX512BW-NEXT: vpextrw $4, %xmm2, %ecx1048; AVX512BW-NEXT: vpextrw $2, %xmm2, %edx1049; AVX512BW-NEXT: vmovd %xmm2, %esi1050; AVX512BW-NEXT: vextracti32x4 $2, %zmm0, %xmm21051; AVX512BW-NEXT: vpextrw $6, %xmm2, %edi1052; AVX512BW-NEXT: vpextrw $4, %xmm2, %r8d1053; AVX512BW-NEXT: vpextrw $2, %xmm2, %r9d1054; AVX512BW-NEXT: vmovd %xmm2, %r10d1055; AVX512BW-NEXT: vextracti128 $1, %ymm0, %xmm01056; AVX512BW-NEXT: vpextrw $6, %xmm0, %r11d1057; AVX512BW-NEXT: vpextrw $4, %xmm0, %ebx1058; AVX512BW-NEXT: vpextrw $2, %xmm0, %ebp1059; AVX512BW-NEXT: vpinsrb $5, %ebp, %xmm1, %xmm01060; AVX512BW-NEXT: vpinsrb $6, %ebx, %xmm0, %xmm01061; AVX512BW-NEXT: vpinsrb $7, %r11d, %xmm0, %xmm01062; AVX512BW-NEXT: vpinsrb $8, %r10d, %xmm0, %xmm01063; AVX512BW-NEXT: vpinsrb $9, %r9d, %xmm0, %xmm01064; AVX512BW-NEXT: vpinsrb $10, %r8d, %xmm0, %xmm01065; AVX512BW-NEXT: vpinsrb $11, %edi, %xmm0, %xmm01066; AVX512BW-NEXT: vpinsrb $12, %esi, %xmm0, %xmm01067; AVX512BW-NEXT: vpinsrb $13, %edx, %xmm0, %xmm01068; AVX512BW-NEXT: vpinsrb $14, %ecx, %xmm0, %xmm01069; AVX512BW-NEXT: vpinsrb $15, %eax, %xmm0, %xmm01070; AVX512BW-NEXT: popq %rbx1071; AVX512BW-NEXT: popq %rbp1072; AVX512BW-NEXT: vzeroupper1073; AVX512BW-NEXT: retq1074;1075; AVX512BWVL-ONLY-LABEL: evenelts_v32i16_trunc_v16i16_to_v16i8:1076; AVX512BWVL-ONLY: # %bb.0:1077; AVX512BWVL-ONLY-NEXT: pushq %rbp1078; AVX512BWVL-ONLY-NEXT: pushq %r141079; AVX512BWVL-ONLY-NEXT: pushq %rbx1080; AVX512BWVL-ONLY-NEXT: vextracti32x4 $3, %zmm0, %xmm11081; AVX512BWVL-ONLY-NEXT: vpextrw $6, %xmm1, %eax1082; AVX512BWVL-ONLY-NEXT: vpextrw $4, %xmm1, %ecx1083; AVX512BWVL-ONLY-NEXT: vpextrw $2, %xmm1, %edx1084; AVX512BWVL-ONLY-NEXT: vmovd %xmm1, %esi1085; AVX512BWVL-ONLY-NEXT: vextracti32x4 $2, %zmm0, %xmm11086; AVX512BWVL-ONLY-NEXT: vpextrw $6, %xmm1, %edi1087; AVX512BWVL-ONLY-NEXT: vpextrw $4, %xmm1, %r8d1088; AVX512BWVL-ONLY-NEXT: vpextrw $2, %xmm1, %r9d1089; AVX512BWVL-ONLY-NEXT: vmovd %xmm1, %r10d1090; AVX512BWVL-ONLY-NEXT: vextracti128 $1, %ymm0, %xmm11091; AVX512BWVL-ONLY-NEXT: vpextrw $6, %xmm1, %r11d1092; AVX512BWVL-ONLY-NEXT: vpextrw $4, %xmm1, %ebx1093; AVX512BWVL-ONLY-NEXT: vpextrw $2, %xmm1, %ebp1094; AVX512BWVL-ONLY-NEXT: vmovd %xmm1, %r14d1095; AVX512BWVL-ONLY-NEXT: vpmovdb %xmm0, %xmm01096; AVX512BWVL-ONLY-NEXT: vpinsrb $4, %r14d, %xmm0, %xmm01097; AVX512BWVL-ONLY-NEXT: vpinsrb $5, %ebp, %xmm0, %xmm01098; AVX512BWVL-ONLY-NEXT: vpinsrb $6, %ebx, %xmm0, %xmm01099; AVX512BWVL-ONLY-NEXT: vpinsrb $7, %r11d, %xmm0, %xmm01100; AVX512BWVL-ONLY-NEXT: vpinsrb $8, %r10d, %xmm0, %xmm01101; AVX512BWVL-ONLY-NEXT: vpinsrb $9, %r9d, %xmm0, %xmm01102; AVX512BWVL-ONLY-NEXT: vpinsrb $10, %r8d, %xmm0, %xmm01103; AVX512BWVL-ONLY-NEXT: vpinsrb $11, %edi, %xmm0, %xmm01104; AVX512BWVL-ONLY-NEXT: vpinsrb $12, %esi, %xmm0, %xmm01105; AVX512BWVL-ONLY-NEXT: vpinsrb $13, %edx, %xmm0, %xmm01106; AVX512BWVL-ONLY-NEXT: vpinsrb $14, %ecx, %xmm0, %xmm01107; AVX512BWVL-ONLY-NEXT: vpinsrb $15, %eax, %xmm0, %xmm01108; AVX512BWVL-ONLY-NEXT: popq %rbx1109; AVX512BWVL-ONLY-NEXT: popq %r141110; AVX512BWVL-ONLY-NEXT: popq %rbp1111; AVX512BWVL-ONLY-NEXT: vzeroupper1112; AVX512BWVL-ONLY-NEXT: retq1113;1114; AVX512VBMI-FAST-LABEL: evenelts_v32i16_trunc_v16i16_to_v16i8:1115; AVX512VBMI-FAST: # %bb.0:1116; AVX512VBMI-FAST-NEXT: vmovdqa {{.*#+}} xmm1 = [64,65,66,67,68,69,24,28,32,36,40,44,48,52,56,79]1117; AVX512VBMI-FAST-NEXT: vpmovdb %ymm0, %xmm21118; AVX512VBMI-FAST-NEXT: vpermi2b %zmm2, %zmm0, %zmm11119; AVX512VBMI-FAST-NEXT: vextracti32x4 $3, %zmm0, %xmm01120; AVX512VBMI-FAST-NEXT: vpextrw $6, %xmm0, %eax1121; AVX512VBMI-FAST-NEXT: vpinsrb $15, %eax, %xmm1, %xmm01122; AVX512VBMI-FAST-NEXT: vzeroupper1123; AVX512VBMI-FAST-NEXT: retq1124;1125; AVX512VBMI-SLOW-LABEL: evenelts_v32i16_trunc_v16i16_to_v16i8:1126; AVX512VBMI-SLOW: # %bb.0:1127; AVX512VBMI-SLOW-NEXT: vmovdqa {{.*#+}} xmm1 = [0,1,2,3,4,5,6,92,96,100,104,108,112,13,14,15]1128; AVX512VBMI-SLOW-NEXT: vpmovdb %ymm0, %xmm21129; AVX512VBMI-SLOW-NEXT: vpermt2b %zmm0, %zmm1, %zmm21130; AVX512VBMI-SLOW-NEXT: vextracti32x4 $3, %zmm0, %xmm01131; AVX512VBMI-SLOW-NEXT: vpextrw $6, %xmm0, %eax1132; AVX512VBMI-SLOW-NEXT: vpextrw $4, %xmm0, %ecx1133; AVX512VBMI-SLOW-NEXT: vpextrw $2, %xmm0, %edx1134; AVX512VBMI-SLOW-NEXT: vpinsrb $13, %edx, %xmm2, %xmm01135; AVX512VBMI-SLOW-NEXT: vpinsrb $14, %ecx, %xmm0, %xmm01136; AVX512VBMI-SLOW-NEXT: vpinsrb $15, %eax, %xmm0, %xmm01137; AVX512VBMI-SLOW-NEXT: vzeroupper1138; AVX512VBMI-SLOW-NEXT: retq1139 %n0 = shufflevector <32 x i16> %n2, <32 x i16> poison, <16 x i32> <i32 0, i32 2, i32 4, i32 6, i32 8, i32 10, i32 12, i32 14, i32 16, i32 18, i32 20, i32 22, i32 24, i32 26, i32 28, i32 30>1140 %n1 = trunc <16 x i16> %n0 to <16 x i8>1141 ret <16 x i8> %n11142}1143 1144define <16 x i8> @oddelts_v32i16_trunc_v16i16_to_v16i8(<32 x i16> %n2) nounwind {1145; SSE2-LABEL: oddelts_v32i16_trunc_v16i16_to_v16i8:1146; SSE2: # %bb.0:1147; SSE2-NEXT: pextrw $7, %xmm3, %eax1148; SSE2-NEXT: movd %eax, %xmm41149; SSE2-NEXT: pextrw $5, %xmm3, %eax1150; SSE2-NEXT: movd %eax, %xmm51151; SSE2-NEXT: pextrw $3, %xmm3, %eax1152; SSE2-NEXT: movd %eax, %xmm61153; SSE2-NEXT: pextrw $1, %xmm3, %eax1154; SSE2-NEXT: movd %eax, %xmm31155; SSE2-NEXT: pextrw $7, %xmm2, %eax1156; SSE2-NEXT: movd %eax, %xmm71157; SSE2-NEXT: pextrw $5, %xmm2, %eax1158; SSE2-NEXT: movd %eax, %xmm81159; SSE2-NEXT: pextrw $3, %xmm2, %eax1160; SSE2-NEXT: movd %eax, %xmm91161; SSE2-NEXT: pextrw $1, %xmm2, %eax1162; SSE2-NEXT: movd %eax, %xmm21163; SSE2-NEXT: pextrw $7, %xmm1, %eax1164; SSE2-NEXT: movd %eax, %xmm101165; SSE2-NEXT: pextrw $5, %xmm1, %eax1166; SSE2-NEXT: movd %eax, %xmm111167; SSE2-NEXT: pextrw $3, %xmm1, %eax1168; SSE2-NEXT: movd %eax, %xmm121169; SSE2-NEXT: pextrw $1, %xmm1, %eax1170; SSE2-NEXT: movd %eax, %xmm11171; SSE2-NEXT: pextrw $7, %xmm0, %eax1172; SSE2-NEXT: movd %eax, %xmm131173; SSE2-NEXT: pextrw $5, %xmm0, %eax1174; SSE2-NEXT: movd %eax, %xmm141175; SSE2-NEXT: pextrw $3, %xmm0, %eax1176; SSE2-NEXT: movd %eax, %xmm151177; SSE2-NEXT: pextrw $1, %xmm0, %eax1178; SSE2-NEXT: movd %eax, %xmm01179; SSE2-NEXT: punpcklbw {{.*#+}} xmm5 = xmm5[0],xmm4[0],xmm5[1],xmm4[1],xmm5[2],xmm4[2],xmm5[3],xmm4[3],xmm5[4],xmm4[4],xmm5[5],xmm4[5],xmm5[6],xmm4[6],xmm5[7],xmm4[7]1180; SSE2-NEXT: punpcklbw {{.*#+}} xmm3 = xmm3[0],xmm6[0],xmm3[1],xmm6[1],xmm3[2],xmm6[2],xmm3[3],xmm6[3],xmm3[4],xmm6[4],xmm3[5],xmm6[5],xmm3[6],xmm6[6],xmm3[7],xmm6[7]1181; SSE2-NEXT: punpcklwd {{.*#+}} xmm3 = xmm3[0],xmm5[0],xmm3[1],xmm5[1],xmm3[2],xmm5[2],xmm3[3],xmm5[3]1182; SSE2-NEXT: punpcklbw {{.*#+}} xmm8 = xmm8[0],xmm7[0],xmm8[1],xmm7[1],xmm8[2],xmm7[2],xmm8[3],xmm7[3],xmm8[4],xmm7[4],xmm8[5],xmm7[5],xmm8[6],xmm7[6],xmm8[7],xmm7[7]1183; SSE2-NEXT: punpcklbw {{.*#+}} xmm2 = xmm2[0],xmm9[0],xmm2[1],xmm9[1],xmm2[2],xmm9[2],xmm2[3],xmm9[3],xmm2[4],xmm9[4],xmm2[5],xmm9[5],xmm2[6],xmm9[6],xmm2[7],xmm9[7]1184; SSE2-NEXT: punpcklwd {{.*#+}} xmm2 = xmm2[0],xmm8[0],xmm2[1],xmm8[1],xmm2[2],xmm8[2],xmm2[3],xmm8[3]1185; SSE2-NEXT: punpckldq {{.*#+}} xmm2 = xmm2[0],xmm3[0],xmm2[1],xmm3[1]1186; SSE2-NEXT: punpcklbw {{.*#+}} xmm11 = xmm11[0],xmm10[0],xmm11[1],xmm10[1],xmm11[2],xmm10[2],xmm11[3],xmm10[3],xmm11[4],xmm10[4],xmm11[5],xmm10[5],xmm11[6],xmm10[6],xmm11[7],xmm10[7]1187; SSE2-NEXT: punpcklbw {{.*#+}} xmm1 = xmm1[0],xmm12[0],xmm1[1],xmm12[1],xmm1[2],xmm12[2],xmm1[3],xmm12[3],xmm1[4],xmm12[4],xmm1[5],xmm12[5],xmm1[6],xmm12[6],xmm1[7],xmm12[7]1188; SSE2-NEXT: punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm11[0],xmm1[1],xmm11[1],xmm1[2],xmm11[2],xmm1[3],xmm11[3]1189; SSE2-NEXT: punpcklbw {{.*#+}} xmm14 = xmm14[0],xmm13[0],xmm14[1],xmm13[1],xmm14[2],xmm13[2],xmm14[3],xmm13[3],xmm14[4],xmm13[4],xmm14[5],xmm13[5],xmm14[6],xmm13[6],xmm14[7],xmm13[7]1190; SSE2-NEXT: punpcklbw {{.*#+}} xmm0 = xmm0[0],xmm15[0],xmm0[1],xmm15[1],xmm0[2],xmm15[2],xmm0[3],xmm15[3],xmm0[4],xmm15[4],xmm0[5],xmm15[5],xmm0[6],xmm15[6],xmm0[7],xmm15[7]1191; SSE2-NEXT: punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm14[0],xmm0[1],xmm14[1],xmm0[2],xmm14[2],xmm0[3],xmm14[3]1192; SSE2-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]1193; SSE2-NEXT: punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm2[0]1194; SSE2-NEXT: retq1195;1196; SSE42-LABEL: oddelts_v32i16_trunc_v16i16_to_v16i8:1197; SSE42: # %bb.0:1198; SSE42-NEXT: pushq %rbp1199; SSE42-NEXT: pushq %r141200; SSE42-NEXT: pushq %rbx1201; SSE42-NEXT: pextrw $7, %xmm3, %eax1202; SSE42-NEXT: pextrw $5, %xmm3, %ecx1203; SSE42-NEXT: pextrw $3, %xmm3, %edx1204; SSE42-NEXT: pextrw $1, %xmm3, %esi1205; SSE42-NEXT: pextrw $7, %xmm2, %edi1206; SSE42-NEXT: pextrw $5, %xmm2, %r8d1207; SSE42-NEXT: pextrw $3, %xmm2, %r9d1208; SSE42-NEXT: pextrw $1, %xmm2, %r10d1209; SSE42-NEXT: pextrw $7, %xmm1, %r11d1210; SSE42-NEXT: pextrw $5, %xmm1, %ebx1211; SSE42-NEXT: pextrw $3, %xmm1, %ebp1212; SSE42-NEXT: pextrw $1, %xmm1, %r14d1213; SSE42-NEXT: pshufb {{.*#+}} xmm0 = xmm0[2,6,10,14,u,u,u,u,u,u,u,u,u,u,u,u]1214; SSE42-NEXT: pinsrb $4, %r14d, %xmm01215; SSE42-NEXT: pinsrb $5, %ebp, %xmm01216; SSE42-NEXT: pinsrb $6, %ebx, %xmm01217; SSE42-NEXT: pinsrb $7, %r11d, %xmm01218; SSE42-NEXT: pinsrb $8, %r10d, %xmm01219; SSE42-NEXT: pinsrb $9, %r9d, %xmm01220; SSE42-NEXT: pinsrb $10, %r8d, %xmm01221; SSE42-NEXT: pinsrb $11, %edi, %xmm01222; SSE42-NEXT: pinsrb $12, %esi, %xmm01223; SSE42-NEXT: pinsrb $13, %edx, %xmm01224; SSE42-NEXT: pinsrb $14, %ecx, %xmm01225; SSE42-NEXT: pinsrb $15, %eax, %xmm01226; SSE42-NEXT: popq %rbx1227; SSE42-NEXT: popq %r141228; SSE42-NEXT: popq %rbp1229; SSE42-NEXT: retq1230;1231; AVX1-LABEL: oddelts_v32i16_trunc_v16i16_to_v16i8:1232; AVX1: # %bb.0:1233; AVX1-NEXT: pushq %rbp1234; AVX1-NEXT: pushq %r141235; AVX1-NEXT: pushq %rbx1236; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm21237; AVX1-NEXT: vpextrw $7, %xmm2, %eax1238; AVX1-NEXT: vpextrw $5, %xmm2, %ecx1239; AVX1-NEXT: vpextrw $3, %xmm2, %edx1240; AVX1-NEXT: vpextrw $1, %xmm2, %esi1241; AVX1-NEXT: vpextrw $7, %xmm1, %edi1242; AVX1-NEXT: vpextrw $5, %xmm1, %r8d1243; AVX1-NEXT: vpextrw $3, %xmm1, %r9d1244; AVX1-NEXT: vpextrw $1, %xmm1, %r10d1245; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm11246; AVX1-NEXT: vpextrw $7, %xmm1, %r11d1247; AVX1-NEXT: vpextrw $5, %xmm1, %ebx1248; AVX1-NEXT: vpextrw $3, %xmm1, %ebp1249; AVX1-NEXT: vpextrw $1, %xmm1, %r14d1250; AVX1-NEXT: vpshufb {{.*#+}} xmm0 = xmm0[2,6,10,14,u,u,u,u,u,u,u,u,u,u,u,u]1251; AVX1-NEXT: vpinsrb $4, %r14d, %xmm0, %xmm01252; AVX1-NEXT: vpinsrb $5, %ebp, %xmm0, %xmm01253; AVX1-NEXT: vpinsrb $6, %ebx, %xmm0, %xmm01254; AVX1-NEXT: vpinsrb $7, %r11d, %xmm0, %xmm01255; AVX1-NEXT: vpinsrb $8, %r10d, %xmm0, %xmm01256; AVX1-NEXT: vpinsrb $9, %r9d, %xmm0, %xmm01257; AVX1-NEXT: vpinsrb $10, %r8d, %xmm0, %xmm01258; AVX1-NEXT: vpinsrb $11, %edi, %xmm0, %xmm01259; AVX1-NEXT: vpinsrb $12, %esi, %xmm0, %xmm01260; AVX1-NEXT: vpinsrb $13, %edx, %xmm0, %xmm01261; AVX1-NEXT: vpinsrb $14, %ecx, %xmm0, %xmm01262; AVX1-NEXT: vpinsrb $15, %eax, %xmm0, %xmm01263; AVX1-NEXT: popq %rbx1264; AVX1-NEXT: popq %r141265; AVX1-NEXT: popq %rbp1266; AVX1-NEXT: vzeroupper1267; AVX1-NEXT: retq1268;1269; AVX2-LABEL: oddelts_v32i16_trunc_v16i16_to_v16i8:1270; AVX2: # %bb.0:1271; AVX2-NEXT: pushq %rbp1272; AVX2-NEXT: pushq %r141273; AVX2-NEXT: pushq %rbx1274; AVX2-NEXT: vextracti128 $1, %ymm1, %xmm21275; AVX2-NEXT: vpextrw $7, %xmm2, %eax1276; AVX2-NEXT: vpextrw $5, %xmm2, %ecx1277; AVX2-NEXT: vpextrw $3, %xmm2, %edx1278; AVX2-NEXT: vpextrw $1, %xmm2, %esi1279; AVX2-NEXT: vpextrw $7, %xmm1, %edi1280; AVX2-NEXT: vpextrw $5, %xmm1, %r8d1281; AVX2-NEXT: vpextrw $3, %xmm1, %r9d1282; AVX2-NEXT: vpextrw $1, %xmm1, %r10d1283; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm11284; AVX2-NEXT: vpextrw $7, %xmm1, %r11d1285; AVX2-NEXT: vpextrw $5, %xmm1, %ebx1286; AVX2-NEXT: vpextrw $3, %xmm1, %ebp1287; AVX2-NEXT: vpextrw $1, %xmm1, %r14d1288; AVX2-NEXT: vpshufb {{.*#+}} xmm0 = xmm0[2,6,10,14,u,u,u,u,u,u,u,u,u,u,u,u]1289; AVX2-NEXT: vpinsrb $4, %r14d, %xmm0, %xmm01290; AVX2-NEXT: vpinsrb $5, %ebp, %xmm0, %xmm01291; AVX2-NEXT: vpinsrb $6, %ebx, %xmm0, %xmm01292; AVX2-NEXT: vpinsrb $7, %r11d, %xmm0, %xmm01293; AVX2-NEXT: vpinsrb $8, %r10d, %xmm0, %xmm01294; AVX2-NEXT: vpinsrb $9, %r9d, %xmm0, %xmm01295; AVX2-NEXT: vpinsrb $10, %r8d, %xmm0, %xmm01296; AVX2-NEXT: vpinsrb $11, %edi, %xmm0, %xmm01297; AVX2-NEXT: vpinsrb $12, %esi, %xmm0, %xmm01298; AVX2-NEXT: vpinsrb $13, %edx, %xmm0, %xmm01299; AVX2-NEXT: vpinsrb $14, %ecx, %xmm0, %xmm01300; AVX2-NEXT: vpinsrb $15, %eax, %xmm0, %xmm01301; AVX2-NEXT: popq %rbx1302; AVX2-NEXT: popq %r141303; AVX2-NEXT: popq %rbp1304; AVX2-NEXT: vzeroupper1305; AVX2-NEXT: retq1306;1307; AVX512F-LABEL: oddelts_v32i16_trunc_v16i16_to_v16i8:1308; AVX512F: # %bb.0:1309; AVX512F-NEXT: pushq %rbp1310; AVX512F-NEXT: pushq %r141311; AVX512F-NEXT: pushq %rbx1312; AVX512F-NEXT: vextracti32x4 $3, %zmm0, %xmm11313; AVX512F-NEXT: vpextrw $7, %xmm1, %eax1314; AVX512F-NEXT: vpextrw $5, %xmm1, %ecx1315; AVX512F-NEXT: vpextrw $3, %xmm1, %edx1316; AVX512F-NEXT: vpextrw $1, %xmm1, %esi1317; AVX512F-NEXT: vextracti32x4 $2, %zmm0, %xmm11318; AVX512F-NEXT: vpextrw $7, %xmm1, %edi1319; AVX512F-NEXT: vpextrw $5, %xmm1, %r8d1320; AVX512F-NEXT: vpextrw $3, %xmm1, %r9d1321; AVX512F-NEXT: vpextrw $1, %xmm1, %r10d1322; AVX512F-NEXT: vextracti128 $1, %ymm0, %xmm11323; AVX512F-NEXT: vpextrw $7, %xmm1, %r11d1324; AVX512F-NEXT: vpextrw $5, %xmm1, %ebx1325; AVX512F-NEXT: vpextrw $3, %xmm1, %ebp1326; AVX512F-NEXT: vpextrw $1, %xmm1, %r14d1327; AVX512F-NEXT: vpshufb {{.*#+}} xmm0 = xmm0[2,6,10,14,u,u,u,u,u,u,u,u,u,u,u,u]1328; AVX512F-NEXT: vpinsrb $4, %r14d, %xmm0, %xmm01329; AVX512F-NEXT: vpinsrb $5, %ebp, %xmm0, %xmm01330; AVX512F-NEXT: vpinsrb $6, %ebx, %xmm0, %xmm01331; AVX512F-NEXT: vpinsrb $7, %r11d, %xmm0, %xmm01332; AVX512F-NEXT: vpinsrb $8, %r10d, %xmm0, %xmm01333; AVX512F-NEXT: vpinsrb $9, %r9d, %xmm0, %xmm01334; AVX512F-NEXT: vpinsrb $10, %r8d, %xmm0, %xmm01335; AVX512F-NEXT: vpinsrb $11, %edi, %xmm0, %xmm01336; AVX512F-NEXT: vpinsrb $12, %esi, %xmm0, %xmm01337; AVX512F-NEXT: vpinsrb $13, %edx, %xmm0, %xmm01338; AVX512F-NEXT: vpinsrb $14, %ecx, %xmm0, %xmm01339; AVX512F-NEXT: vpinsrb $15, %eax, %xmm0, %xmm01340; AVX512F-NEXT: popq %rbx1341; AVX512F-NEXT: popq %r141342; AVX512F-NEXT: popq %rbp1343; AVX512F-NEXT: vzeroupper1344; AVX512F-NEXT: retq1345;1346; AVX512VL-LABEL: oddelts_v32i16_trunc_v16i16_to_v16i8:1347; AVX512VL: # %bb.0:1348; AVX512VL-NEXT: pushq %rbp1349; AVX512VL-NEXT: pushq %r141350; AVX512VL-NEXT: pushq %rbx1351; AVX512VL-NEXT: vextracti32x4 $3, %zmm0, %xmm11352; AVX512VL-NEXT: vpextrw $7, %xmm1, %eax1353; AVX512VL-NEXT: vpextrw $5, %xmm1, %ecx1354; AVX512VL-NEXT: vpextrw $3, %xmm1, %edx1355; AVX512VL-NEXT: vpextrw $1, %xmm1, %esi1356; AVX512VL-NEXT: vextracti32x4 $2, %zmm0, %xmm11357; AVX512VL-NEXT: vpextrw $7, %xmm1, %edi1358; AVX512VL-NEXT: vpextrw $5, %xmm1, %r8d1359; AVX512VL-NEXT: vpextrw $3, %xmm1, %r9d1360; AVX512VL-NEXT: vpextrw $1, %xmm1, %r10d1361; AVX512VL-NEXT: vextracti128 $1, %ymm0, %xmm11362; AVX512VL-NEXT: vpextrw $7, %xmm1, %r11d1363; AVX512VL-NEXT: vpextrw $5, %xmm1, %ebx1364; AVX512VL-NEXT: vpextrw $3, %xmm1, %ebp1365; AVX512VL-NEXT: vpextrw $1, %xmm1, %r14d1366; AVX512VL-NEXT: vpshufb {{.*#+}} xmm0 = xmm0[2,6,10,14,u,u,u,u,u,u,u,u,u,u,u,u]1367; AVX512VL-NEXT: vpinsrb $4, %r14d, %xmm0, %xmm01368; AVX512VL-NEXT: vpinsrb $5, %ebp, %xmm0, %xmm01369; AVX512VL-NEXT: vpinsrb $6, %ebx, %xmm0, %xmm01370; AVX512VL-NEXT: vpinsrb $7, %r11d, %xmm0, %xmm01371; AVX512VL-NEXT: vpinsrb $8, %r10d, %xmm0, %xmm01372; AVX512VL-NEXT: vpinsrb $9, %r9d, %xmm0, %xmm01373; AVX512VL-NEXT: vpinsrb $10, %r8d, %xmm0, %xmm01374; AVX512VL-NEXT: vpinsrb $11, %edi, %xmm0, %xmm01375; AVX512VL-NEXT: vpinsrb $12, %esi, %xmm0, %xmm01376; AVX512VL-NEXT: vpinsrb $13, %edx, %xmm0, %xmm01377; AVX512VL-NEXT: vpinsrb $14, %ecx, %xmm0, %xmm01378; AVX512VL-NEXT: vpinsrb $15, %eax, %xmm0, %xmm01379; AVX512VL-NEXT: popq %rbx1380; AVX512VL-NEXT: popq %r141381; AVX512VL-NEXT: popq %rbp1382; AVX512VL-NEXT: vzeroupper1383; AVX512VL-NEXT: retq1384;1385; AVX512BW-LABEL: oddelts_v32i16_trunc_v16i16_to_v16i8:1386; AVX512BW: # %bb.0:1387; AVX512BW-NEXT: pushq %rbp1388; AVX512BW-NEXT: pushq %r141389; AVX512BW-NEXT: pushq %rbx1390; AVX512BW-NEXT: vextracti32x4 $3, %zmm0, %xmm11391; AVX512BW-NEXT: vpextrw $7, %xmm1, %eax1392; AVX512BW-NEXT: vpextrw $5, %xmm1, %ecx1393; AVX512BW-NEXT: vpextrw $3, %xmm1, %edx1394; AVX512BW-NEXT: vpextrw $1, %xmm1, %esi1395; AVX512BW-NEXT: vextracti32x4 $2, %zmm0, %xmm11396; AVX512BW-NEXT: vpextrw $7, %xmm1, %edi1397; AVX512BW-NEXT: vpextrw $5, %xmm1, %r8d1398; AVX512BW-NEXT: vpextrw $3, %xmm1, %r9d1399; AVX512BW-NEXT: vpextrw $1, %xmm1, %r10d1400; AVX512BW-NEXT: vextracti128 $1, %ymm0, %xmm11401; AVX512BW-NEXT: vpextrw $7, %xmm1, %r11d1402; AVX512BW-NEXT: vpextrw $5, %xmm1, %ebx1403; AVX512BW-NEXT: vpextrw $3, %xmm1, %ebp1404; AVX512BW-NEXT: vpextrw $1, %xmm1, %r14d1405; AVX512BW-NEXT: vpshufb {{.*#+}} xmm0 = xmm0[2,6,10,14,u,u,u,u,u,u,u,u,u,u,u,u]1406; AVX512BW-NEXT: vpinsrb $4, %r14d, %xmm0, %xmm01407; AVX512BW-NEXT: vpinsrb $5, %ebp, %xmm0, %xmm01408; AVX512BW-NEXT: vpinsrb $6, %ebx, %xmm0, %xmm01409; AVX512BW-NEXT: vpinsrb $7, %r11d, %xmm0, %xmm01410; AVX512BW-NEXT: vpinsrb $8, %r10d, %xmm0, %xmm01411; AVX512BW-NEXT: vpinsrb $9, %r9d, %xmm0, %xmm01412; AVX512BW-NEXT: vpinsrb $10, %r8d, %xmm0, %xmm01413; AVX512BW-NEXT: vpinsrb $11, %edi, %xmm0, %xmm01414; AVX512BW-NEXT: vpinsrb $12, %esi, %xmm0, %xmm01415; AVX512BW-NEXT: vpinsrb $13, %edx, %xmm0, %xmm01416; AVX512BW-NEXT: vpinsrb $14, %ecx, %xmm0, %xmm01417; AVX512BW-NEXT: vpinsrb $15, %eax, %xmm0, %xmm01418; AVX512BW-NEXT: popq %rbx1419; AVX512BW-NEXT: popq %r141420; AVX512BW-NEXT: popq %rbp1421; AVX512BW-NEXT: vzeroupper1422; AVX512BW-NEXT: retq1423;1424; AVX512BWVL-ONLY-LABEL: oddelts_v32i16_trunc_v16i16_to_v16i8:1425; AVX512BWVL-ONLY: # %bb.0:1426; AVX512BWVL-ONLY-NEXT: pushq %rbp1427; AVX512BWVL-ONLY-NEXT: pushq %r141428; AVX512BWVL-ONLY-NEXT: pushq %rbx1429; AVX512BWVL-ONLY-NEXT: vextracti32x4 $3, %zmm0, %xmm11430; AVX512BWVL-ONLY-NEXT: vpextrw $7, %xmm1, %eax1431; AVX512BWVL-ONLY-NEXT: vpextrw $5, %xmm1, %ecx1432; AVX512BWVL-ONLY-NEXT: vpextrw $3, %xmm1, %edx1433; AVX512BWVL-ONLY-NEXT: vpextrw $1, %xmm1, %esi1434; AVX512BWVL-ONLY-NEXT: vextracti32x4 $2, %zmm0, %xmm11435; AVX512BWVL-ONLY-NEXT: vpextrw $7, %xmm1, %edi1436; AVX512BWVL-ONLY-NEXT: vpextrw $5, %xmm1, %r8d1437; AVX512BWVL-ONLY-NEXT: vpextrw $3, %xmm1, %r9d1438; AVX512BWVL-ONLY-NEXT: vpextrw $1, %xmm1, %r10d1439; AVX512BWVL-ONLY-NEXT: vextracti128 $1, %ymm0, %xmm11440; AVX512BWVL-ONLY-NEXT: vpextrw $7, %xmm1, %r11d1441; AVX512BWVL-ONLY-NEXT: vpextrw $5, %xmm1, %ebx1442; AVX512BWVL-ONLY-NEXT: vpextrw $3, %xmm1, %ebp1443; AVX512BWVL-ONLY-NEXT: vpextrw $1, %xmm1, %r14d1444; AVX512BWVL-ONLY-NEXT: vpshufb {{.*#+}} xmm0 = xmm0[2,6,10,14,u,u,u,u,u,u,u,u,u,u,u,u]1445; AVX512BWVL-ONLY-NEXT: vpinsrb $4, %r14d, %xmm0, %xmm01446; AVX512BWVL-ONLY-NEXT: vpinsrb $5, %ebp, %xmm0, %xmm01447; AVX512BWVL-ONLY-NEXT: vpinsrb $6, %ebx, %xmm0, %xmm01448; AVX512BWVL-ONLY-NEXT: vpinsrb $7, %r11d, %xmm0, %xmm01449; AVX512BWVL-ONLY-NEXT: vpinsrb $8, %r10d, %xmm0, %xmm01450; AVX512BWVL-ONLY-NEXT: vpinsrb $9, %r9d, %xmm0, %xmm01451; AVX512BWVL-ONLY-NEXT: vpinsrb $10, %r8d, %xmm0, %xmm01452; AVX512BWVL-ONLY-NEXT: vpinsrb $11, %edi, %xmm0, %xmm01453; AVX512BWVL-ONLY-NEXT: vpinsrb $12, %esi, %xmm0, %xmm01454; AVX512BWVL-ONLY-NEXT: vpinsrb $13, %edx, %xmm0, %xmm01455; AVX512BWVL-ONLY-NEXT: vpinsrb $14, %ecx, %xmm0, %xmm01456; AVX512BWVL-ONLY-NEXT: vpinsrb $15, %eax, %xmm0, %xmm01457; AVX512BWVL-ONLY-NEXT: popq %rbx1458; AVX512BWVL-ONLY-NEXT: popq %r141459; AVX512BWVL-ONLY-NEXT: popq %rbp1460; AVX512BWVL-ONLY-NEXT: vzeroupper1461; AVX512BWVL-ONLY-NEXT: retq1462;1463; AVX512VBMI-FAST-LABEL: oddelts_v32i16_trunc_v16i16_to_v16i8:1464; AVX512VBMI-FAST: # %bb.0:1465; AVX512VBMI-FAST-NEXT: vmovdqa {{.*#+}} xmm1 = [2,6,10,14,18,22,26,30,34,38,42,46,50,54,58,62]1466; AVX512VBMI-FAST-NEXT: vpermb %zmm0, %zmm1, %zmm01467; AVX512VBMI-FAST-NEXT: # kill: def $xmm0 killed $xmm0 killed $zmm01468; AVX512VBMI-FAST-NEXT: vzeroupper1469; AVX512VBMI-FAST-NEXT: retq1470;1471; AVX512VBMI-SLOW-LABEL: oddelts_v32i16_trunc_v16i16_to_v16i8:1472; AVX512VBMI-SLOW: # %bb.0:1473; AVX512VBMI-SLOW-NEXT: vmovdqa {{.*#+}} xmm1 = [2,6,10,14,18,22,26,30,34,38,42,46,50,u,u,u]1474; AVX512VBMI-SLOW-NEXT: vpermb %zmm0, %zmm1, %zmm11475; AVX512VBMI-SLOW-NEXT: vextracti32x4 $3, %zmm0, %xmm01476; AVX512VBMI-SLOW-NEXT: vpextrw $7, %xmm0, %eax1477; AVX512VBMI-SLOW-NEXT: vpextrw $5, %xmm0, %ecx1478; AVX512VBMI-SLOW-NEXT: vpextrw $3, %xmm0, %edx1479; AVX512VBMI-SLOW-NEXT: vpinsrb $13, %edx, %xmm1, %xmm01480; AVX512VBMI-SLOW-NEXT: vpinsrb $14, %ecx, %xmm0, %xmm01481; AVX512VBMI-SLOW-NEXT: vpinsrb $15, %eax, %xmm0, %xmm01482; AVX512VBMI-SLOW-NEXT: vzeroupper1483; AVX512VBMI-SLOW-NEXT: retq1484 %n0 = shufflevector <32 x i16> %n2, <32 x i16> poison, <16 x i32> <i32 1, i32 3, i32 5, i32 7, i32 9, i32 11, i32 13, i32 15, i32 17, i32 19, i32 21, i32 23, i32 25, i32 27, i32 29, i32 31>1485 %n1 = trunc <16 x i16> %n0 to <16 x i8>1486 ret <16 x i8> %n11487}1488;; NOTE: These prefixes are unused and the list is autogenerated. Do not add tests below this line:1489; AVX512VBMI: {{.*}}1490