2198 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,SSE2-SSSE3,SSE23; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+ssse3 | FileCheck %s --check-prefixes=SSE,SSE2-SSSE3,SSSE34; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+sse4.1 | FileCheck %s --check-prefixes=SSE,SSE415; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx | FileCheck %s --check-prefixes=AVX,AVX16; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx2 | FileCheck %s --check-prefixes=AVX,AVX27; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx2,+fast-variable-crosslane-shuffle,+fast-variable-perlane-shuffle | FileCheck %s --check-prefixes=AVX,AVX28; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx2,+fast-variable-perlane-shuffle | FileCheck %s --check-prefixes=AVX,AVX29; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f | FileCheck %s --check-prefix=AVX512 --check-prefix=AVX512F10; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512vl,+fast-variable-crosslane-shuffle,+fast-variable-perlane-shuffle | FileCheck %s --check-prefixes=AVX512,AVX512VL11; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512vl,+fast-variable-perlane-shuffle | FileCheck %s --check-prefixes=AVX512,AVX512VL12; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512bw,+fast-variable-crosslane-shuffle,+fast-variable-perlane-shuffle | FileCheck %s --check-prefixes=AVX512,AVX512BW13; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512bw,+fast-variable-perlane-shuffle | FileCheck %s --check-prefixes=AVX512,AVX512BW14; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512bw,+avx512vl,+fast-variable-crosslane-shuffle,+fast-variable-perlane-shuffle | FileCheck %s --check-prefixes=AVX512,AVX512BWVL15; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512bw,+avx512vl,+fast-variable-perlane-shuffle | FileCheck %s --check-prefixes=AVX512,AVX512BWVL16 17define <8 x i32> @trunc8i64_8i32(<8 x i64> %a) {18; SSE-LABEL: trunc8i64_8i32:19; SSE: # %bb.0: # %entry20; SSE-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,2],xmm1[0,2]21; SSE-NEXT: shufps {{.*#+}} xmm2 = xmm2[0,2],xmm3[0,2]22; SSE-NEXT: movaps %xmm2, %xmm123; SSE-NEXT: retq24;25; AVX1-LABEL: trunc8i64_8i32:26; AVX1: # %bb.0: # %entry27; AVX1-NEXT: vperm2f128 {{.*#+}} ymm2 = ymm0[2,3],ymm1[2,3]28; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm029; AVX1-NEXT: vshufps {{.*#+}} ymm0 = ymm0[0,2],ymm2[0,2],ymm0[4,6],ymm2[4,6]30; AVX1-NEXT: retq31;32; AVX2-LABEL: trunc8i64_8i32:33; AVX2: # %bb.0: # %entry34; AVX2-NEXT: vshufps {{.*#+}} ymm0 = ymm0[0,2],ymm1[0,2],ymm0[4,6],ymm1[4,6]35; AVX2-NEXT: vpermpd {{.*#+}} ymm0 = ymm0[0,2,1,3]36; AVX2-NEXT: retq37;38; AVX512-LABEL: trunc8i64_8i32:39; AVX512: # %bb.0: # %entry40; AVX512-NEXT: vpmovqd %zmm0, %ymm041; AVX512-NEXT: retq42entry:43 %0 = trunc <8 x i64> %a to <8 x i32>44 ret <8 x i32> %045}46 47define <8 x i32> @trunc8i64_8i32_ashr(<8 x i64> %a) {48; SSE-LABEL: trunc8i64_8i32_ashr:49; SSE: # %bb.0: # %entry50; SSE-NEXT: shufps {{.*#+}} xmm0 = xmm0[1,3],xmm1[1,3]51; SSE-NEXT: shufps {{.*#+}} xmm2 = xmm2[1,3],xmm3[1,3]52; SSE-NEXT: movaps %xmm2, %xmm153; SSE-NEXT: retq54;55; AVX1-LABEL: trunc8i64_8i32_ashr:56; AVX1: # %bb.0: # %entry57; AVX1-NEXT: vperm2f128 {{.*#+}} ymm2 = ymm0[2,3],ymm1[2,3]58; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm059; AVX1-NEXT: vshufps {{.*#+}} ymm0 = ymm0[1,3],ymm2[1,3],ymm0[5,7],ymm2[5,7]60; AVX1-NEXT: retq61;62; AVX2-LABEL: trunc8i64_8i32_ashr:63; AVX2: # %bb.0: # %entry64; AVX2-NEXT: vshufps {{.*#+}} ymm0 = ymm0[1,3],ymm1[1,3],ymm0[5,7],ymm1[5,7]65; AVX2-NEXT: vpermpd {{.*#+}} ymm0 = ymm0[0,2,1,3]66; AVX2-NEXT: retq67;68; AVX512-LABEL: trunc8i64_8i32_ashr:69; AVX512: # %bb.0: # %entry70; AVX512-NEXT: vpsrlq $32, %zmm0, %zmm071; AVX512-NEXT: vpmovqd %zmm0, %ymm072; AVX512-NEXT: retq73entry:74 %0 = ashr <8 x i64> %a, <i64 32, i64 32, i64 32, i64 32, i64 32, i64 32, i64 32, i64 32>75 %1 = trunc <8 x i64> %0 to <8 x i32>76 ret <8 x i32> %177}78 79define <8 x i32> @trunc8i64_8i32_lshr(<8 x i64> %a) {80; SSE-LABEL: trunc8i64_8i32_lshr:81; SSE: # %bb.0: # %entry82; SSE-NEXT: shufps {{.*#+}} xmm0 = xmm0[1,3],xmm1[1,3]83; SSE-NEXT: shufps {{.*#+}} xmm2 = xmm2[1,3],xmm3[1,3]84; SSE-NEXT: movaps %xmm2, %xmm185; SSE-NEXT: retq86;87; AVX1-LABEL: trunc8i64_8i32_lshr:88; AVX1: # %bb.0: # %entry89; AVX1-NEXT: vperm2f128 {{.*#+}} ymm2 = ymm0[2,3],ymm1[2,3]90; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm091; AVX1-NEXT: vshufps {{.*#+}} ymm0 = ymm0[1,3],ymm2[1,3],ymm0[5,7],ymm2[5,7]92; AVX1-NEXT: retq93;94; AVX2-LABEL: trunc8i64_8i32_lshr:95; AVX2: # %bb.0: # %entry96; AVX2-NEXT: vshufps {{.*#+}} ymm0 = ymm0[1,3],ymm1[1,3],ymm0[5,7],ymm1[5,7]97; AVX2-NEXT: vpermpd {{.*#+}} ymm0 = ymm0[0,2,1,3]98; AVX2-NEXT: retq99;100; AVX512-LABEL: trunc8i64_8i32_lshr:101; AVX512: # %bb.0: # %entry102; AVX512-NEXT: vpsrlq $32, %zmm0, %zmm0103; AVX512-NEXT: vpmovqd %zmm0, %ymm0104; AVX512-NEXT: retq105entry:106 %0 = lshr <8 x i64> %a, <i64 32, i64 32, i64 32, i64 32, i64 32, i64 32, i64 32, i64 32>107 %1 = trunc <8 x i64> %0 to <8 x i32>108 ret <8 x i32> %1109}110 111define <8 x i16> @trunc8i64_8i16(<8 x i64> %a) {112; SSE2-SSSE3-LABEL: trunc8i64_8i16:113; SSE2-SSSE3: # %bb.0: # %entry114; SSE2-SSSE3-NEXT: shufps {{.*#+}} xmm2 = xmm2[0,2],xmm3[0,2]115; SSE2-SSSE3-NEXT: pslld $16, %xmm2116; SSE2-SSSE3-NEXT: psrad $16, %xmm2117; SSE2-SSSE3-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,2],xmm1[0,2]118; SSE2-SSSE3-NEXT: pslld $16, %xmm0119; SSE2-SSSE3-NEXT: psrad $16, %xmm0120; SSE2-SSSE3-NEXT: packssdw %xmm2, %xmm0121; SSE2-SSSE3-NEXT: retq122;123; SSE41-LABEL: trunc8i64_8i16:124; SSE41: # %bb.0: # %entry125; SSE41-NEXT: pxor %xmm4, %xmm4126; SSE41-NEXT: pblendw {{.*#+}} xmm3 = xmm3[0],xmm4[1,2,3],xmm3[4],xmm4[5,6,7]127; SSE41-NEXT: pblendw {{.*#+}} xmm2 = xmm2[0],xmm4[1,2,3],xmm2[4],xmm4[5,6,7]128; SSE41-NEXT: packusdw %xmm3, %xmm2129; SSE41-NEXT: pblendw {{.*#+}} xmm1 = xmm1[0],xmm4[1,2,3],xmm1[4],xmm4[5,6,7]130; SSE41-NEXT: pblendw {{.*#+}} xmm0 = xmm0[0],xmm4[1,2,3],xmm0[4],xmm4[5,6,7]131; SSE41-NEXT: packusdw %xmm1, %xmm0132; SSE41-NEXT: packusdw %xmm2, %xmm0133; SSE41-NEXT: retq134;135; AVX1-LABEL: trunc8i64_8i16:136; AVX1: # %bb.0: # %entry137; AVX1-NEXT: vbroadcastsd {{.*#+}} ymm2 = [65535,65535,65535,65535]138; AVX1-NEXT: vandps %ymm2, %ymm1, %ymm1139; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm3140; AVX1-NEXT: vpackusdw %xmm3, %xmm1, %xmm1141; AVX1-NEXT: vandps %ymm2, %ymm0, %ymm0142; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2143; AVX1-NEXT: vpackusdw %xmm2, %xmm0, %xmm0144; AVX1-NEXT: vpackusdw %xmm1, %xmm0, %xmm0145; AVX1-NEXT: vzeroupper146; AVX1-NEXT: retq147;148; AVX2-LABEL: trunc8i64_8i16:149; AVX2: # %bb.0: # %entry150; AVX2-NEXT: vpxor %xmm2, %xmm2, %xmm2151; AVX2-NEXT: vpblendw {{.*#+}} ymm1 = ymm1[0],ymm2[1,2,3],ymm1[4],ymm2[5,6,7],ymm1[8],ymm2[9,10,11],ymm1[12],ymm2[13,14,15]152; AVX2-NEXT: vpblendw {{.*#+}} ymm0 = ymm0[0],ymm2[1,2,3],ymm0[4],ymm2[5,6,7],ymm0[8],ymm2[9,10,11],ymm0[12],ymm2[13,14,15]153; AVX2-NEXT: vpackusdw %ymm1, %ymm0, %ymm0154; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1155; AVX2-NEXT: vpackusdw %xmm1, %xmm0, %xmm0156; AVX2-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[0,2,1,3]157; AVX2-NEXT: vzeroupper158; AVX2-NEXT: retq159;160; AVX512-LABEL: trunc8i64_8i16:161; AVX512: # %bb.0: # %entry162; AVX512-NEXT: vpmovqw %zmm0, %xmm0163; AVX512-NEXT: vzeroupper164; AVX512-NEXT: retq165entry:166 %0 = trunc <8 x i64> %a to <8 x i16>167 ret <8 x i16> %0168}169 170define void @trunc8i64_8i8(<8 x i64> %a, ptr %b) {171; SSE2-SSSE3-LABEL: trunc8i64_8i8:172; SSE2-SSSE3: # %bb.0: # %entry173; SSE2-SSSE3-NEXT: movdqa {{.*#+}} xmm4 = [255,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0]174; SSE2-SSSE3-NEXT: pand %xmm4, %xmm3175; SSE2-SSSE3-NEXT: pand %xmm4, %xmm2176; SSE2-SSSE3-NEXT: packuswb %xmm3, %xmm2177; SSE2-SSSE3-NEXT: pand %xmm4, %xmm1178; SSE2-SSSE3-NEXT: pand %xmm4, %xmm0179; SSE2-SSSE3-NEXT: packuswb %xmm1, %xmm0180; SSE2-SSSE3-NEXT: packuswb %xmm2, %xmm0181; SSE2-SSSE3-NEXT: packuswb %xmm0, %xmm0182; SSE2-SSSE3-NEXT: movq %xmm0, (%rdi)183; SSE2-SSSE3-NEXT: retq184;185; SSE41-LABEL: trunc8i64_8i8:186; SSE41: # %bb.0: # %entry187; SSE41-NEXT: pmovzxbq {{.*#+}} xmm4 = [255,255]188; SSE41-NEXT: pand %xmm4, %xmm3189; SSE41-NEXT: pand %xmm4, %xmm2190; SSE41-NEXT: packusdw %xmm3, %xmm2191; SSE41-NEXT: pand %xmm4, %xmm1192; SSE41-NEXT: pand %xmm4, %xmm0193; SSE41-NEXT: packusdw %xmm1, %xmm0194; SSE41-NEXT: packusdw %xmm2, %xmm0195; SSE41-NEXT: packuswb %xmm0, %xmm0196; SSE41-NEXT: movq %xmm0, (%rdi)197; SSE41-NEXT: retq198;199; AVX1-LABEL: trunc8i64_8i8:200; AVX1: # %bb.0: # %entry201; AVX1-NEXT: vbroadcastsd {{.*#+}} ymm2 = [255,255,255,255]202; AVX1-NEXT: vandps %ymm2, %ymm1, %ymm1203; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm3204; AVX1-NEXT: vpackusdw %xmm3, %xmm1, %xmm1205; AVX1-NEXT: vandps %ymm2, %ymm0, %ymm0206; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2207; AVX1-NEXT: vpackusdw %xmm2, %xmm0, %xmm0208; AVX1-NEXT: vpackusdw %xmm1, %xmm0, %xmm0209; AVX1-NEXT: vpackuswb %xmm0, %xmm0, %xmm0210; AVX1-NEXT: vmovq %xmm0, (%rdi)211; AVX1-NEXT: vzeroupper212; AVX1-NEXT: retq213;214; AVX2-LABEL: trunc8i64_8i8:215; AVX2: # %bb.0: # %entry216; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm2 = [255,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0]217; AVX2-NEXT: vpand %ymm2, %ymm1, %ymm1218; AVX2-NEXT: vpand %ymm2, %ymm0, %ymm0219; AVX2-NEXT: vpackusdw %ymm1, %ymm0, %ymm0220; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1221; AVX2-NEXT: vpackusdw %xmm1, %xmm0, %xmm0222; AVX2-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[0,2,1,3]223; AVX2-NEXT: vpackuswb %xmm0, %xmm0, %xmm0224; AVX2-NEXT: vmovq %xmm0, (%rdi)225; AVX2-NEXT: vzeroupper226; AVX2-NEXT: retq227;228; AVX512-LABEL: trunc8i64_8i8:229; AVX512: # %bb.0: # %entry230; AVX512-NEXT: vpmovqb %zmm0, (%rdi)231; AVX512-NEXT: vzeroupper232; AVX512-NEXT: retq233entry:234 %0 = trunc <8 x i64> %a to <8 x i8>235 store <8 x i8> %0, ptr %b, align 4236 ret void237}238 239define <8 x i16> @trunc8i32_8i16(<8 x i32> %a) {240; SSE2-LABEL: trunc8i32_8i16:241; SSE2: # %bb.0: # %entry242; SSE2-NEXT: pslld $16, %xmm1243; SSE2-NEXT: psrad $16, %xmm1244; SSE2-NEXT: pslld $16, %xmm0245; SSE2-NEXT: psrad $16, %xmm0246; SSE2-NEXT: packssdw %xmm1, %xmm0247; SSE2-NEXT: retq248;249; SSSE3-LABEL: trunc8i32_8i16:250; SSSE3: # %bb.0: # %entry251; SSSE3-NEXT: movdqa {{.*#+}} xmm2 = [0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15]252; SSSE3-NEXT: pshufb %xmm2, %xmm1253; SSSE3-NEXT: pshufb %xmm2, %xmm0254; SSSE3-NEXT: punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]255; SSSE3-NEXT: retq256;257; SSE41-LABEL: trunc8i32_8i16:258; SSE41: # %bb.0: # %entry259; SSE41-NEXT: pxor %xmm2, %xmm2260; SSE41-NEXT: pblendw {{.*#+}} xmm1 = xmm1[0],xmm2[1],xmm1[2],xmm2[3],xmm1[4],xmm2[5],xmm1[6],xmm2[7]261; SSE41-NEXT: pblendw {{.*#+}} xmm0 = xmm0[0],xmm2[1],xmm0[2],xmm2[3],xmm0[4],xmm2[5],xmm0[6],xmm2[7]262; SSE41-NEXT: packusdw %xmm1, %xmm0263; SSE41-NEXT: retq264;265; AVX1-LABEL: trunc8i32_8i16:266; AVX1: # %bb.0: # %entry267; AVX1-NEXT: vandps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0268; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1269; AVX1-NEXT: vpackusdw %xmm1, %xmm0, %xmm0270; AVX1-NEXT: vzeroupper271; AVX1-NEXT: retq272;273; AVX2-LABEL: trunc8i32_8i16:274; AVX2: # %bb.0: # %entry275; AVX2-NEXT: vpshufb {{.*#+}} ymm0 = ymm0[0,1,4,5,8,9,12,13,u,u,u,u,u,u,u,u,16,17,20,21,24,25,28,29,u,u,u,u,u,u,u,u]276; AVX2-NEXT: vpermq {{.*#+}} ymm0 = ymm0[0,2,2,3]277; AVX2-NEXT: # kill: def $xmm0 killed $xmm0 killed $ymm0278; AVX2-NEXT: vzeroupper279; AVX2-NEXT: retq280;281; AVX512F-LABEL: trunc8i32_8i16:282; AVX512F: # %bb.0: # %entry283; AVX512F-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm0284; AVX512F-NEXT: vpmovdw %zmm0, %ymm0285; AVX512F-NEXT: # kill: def $xmm0 killed $xmm0 killed $ymm0286; AVX512F-NEXT: vzeroupper287; AVX512F-NEXT: retq288;289; AVX512VL-LABEL: trunc8i32_8i16:290; AVX512VL: # %bb.0: # %entry291; AVX512VL-NEXT: vpmovdw %ymm0, %xmm0292; AVX512VL-NEXT: vzeroupper293; AVX512VL-NEXT: retq294;295; AVX512BW-LABEL: trunc8i32_8i16:296; AVX512BW: # %bb.0: # %entry297; AVX512BW-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm0298; AVX512BW-NEXT: vpmovdw %zmm0, %ymm0299; AVX512BW-NEXT: # kill: def $xmm0 killed $xmm0 killed $ymm0300; AVX512BW-NEXT: vzeroupper301; AVX512BW-NEXT: retq302;303; AVX512BWVL-LABEL: trunc8i32_8i16:304; AVX512BWVL: # %bb.0: # %entry305; AVX512BWVL-NEXT: vpmovdw %ymm0, %xmm0306; AVX512BWVL-NEXT: vzeroupper307; AVX512BWVL-NEXT: retq308entry:309 %0 = trunc <8 x i32> %a to <8 x i16>310 ret <8 x i16> %0311}312 313define <8 x i16> @trunc8i32_8i16_ashr(<8 x i32> %a) {314; SSE2-SSSE3-LABEL: trunc8i32_8i16_ashr:315; SSE2-SSSE3: # %bb.0: # %entry316; SSE2-SSSE3-NEXT: psrad $16, %xmm1317; SSE2-SSSE3-NEXT: psrad $16, %xmm0318; SSE2-SSSE3-NEXT: packssdw %xmm1, %xmm0319; SSE2-SSSE3-NEXT: retq320;321; SSE41-LABEL: trunc8i32_8i16_ashr:322; SSE41: # %bb.0: # %entry323; SSE41-NEXT: psrld $16, %xmm1324; SSE41-NEXT: psrld $16, %xmm0325; SSE41-NEXT: packusdw %xmm1, %xmm0326; SSE41-NEXT: retq327;328; AVX1-LABEL: trunc8i32_8i16_ashr:329; AVX1: # %bb.0: # %entry330; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1331; AVX1-NEXT: vpsrld $16, %xmm1, %xmm1332; AVX1-NEXT: vpsrld $16, %xmm0, %xmm0333; AVX1-NEXT: vpackusdw %xmm1, %xmm0, %xmm0334; AVX1-NEXT: vzeroupper335; AVX1-NEXT: retq336;337; AVX2-LABEL: trunc8i32_8i16_ashr:338; AVX2: # %bb.0: # %entry339; AVX2-NEXT: vpsrld $16, %ymm0, %ymm0340; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1341; AVX2-NEXT: vpackusdw %xmm1, %xmm0, %xmm0342; AVX2-NEXT: vzeroupper343; AVX2-NEXT: retq344;345; AVX512F-LABEL: trunc8i32_8i16_ashr:346; AVX512F: # %bb.0: # %entry347; AVX512F-NEXT: vpsrld $16, %ymm0, %ymm0348; AVX512F-NEXT: vpmovdw %zmm0, %ymm0349; AVX512F-NEXT: # kill: def $xmm0 killed $xmm0 killed $ymm0350; AVX512F-NEXT: vzeroupper351; AVX512F-NEXT: retq352;353; AVX512VL-LABEL: trunc8i32_8i16_ashr:354; AVX512VL: # %bb.0: # %entry355; AVX512VL-NEXT: vpsrld $16, %ymm0, %ymm0356; AVX512VL-NEXT: vpmovdw %ymm0, %xmm0357; AVX512VL-NEXT: vzeroupper358; AVX512VL-NEXT: retq359;360; AVX512BW-LABEL: trunc8i32_8i16_ashr:361; AVX512BW: # %bb.0: # %entry362; AVX512BW-NEXT: vpsrld $16, %ymm0, %ymm0363; AVX512BW-NEXT: vpmovdw %zmm0, %ymm0364; AVX512BW-NEXT: # kill: def $xmm0 killed $xmm0 killed $ymm0365; AVX512BW-NEXT: vzeroupper366; AVX512BW-NEXT: retq367;368; AVX512BWVL-LABEL: trunc8i32_8i16_ashr:369; AVX512BWVL: # %bb.0: # %entry370; AVX512BWVL-NEXT: vpsrld $16, %ymm0, %ymm0371; AVX512BWVL-NEXT: vpmovdw %ymm0, %xmm0372; AVX512BWVL-NEXT: vzeroupper373; AVX512BWVL-NEXT: retq374entry:375 %0 = ashr <8 x i32> %a, <i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16>376 %1 = trunc <8 x i32> %0 to <8 x i16>377 ret <8 x i16> %1378}379 380define <8 x i16> @trunc8i32_8i16_lshr(<8 x i32> %a) {381; SSE2-SSSE3-LABEL: trunc8i32_8i16_lshr:382; SSE2-SSSE3: # %bb.0: # %entry383; SSE2-SSSE3-NEXT: psrad $16, %xmm1384; SSE2-SSSE3-NEXT: psrad $16, %xmm0385; SSE2-SSSE3-NEXT: packssdw %xmm1, %xmm0386; SSE2-SSSE3-NEXT: retq387;388; SSE41-LABEL: trunc8i32_8i16_lshr:389; SSE41: # %bb.0: # %entry390; SSE41-NEXT: psrld $16, %xmm1391; SSE41-NEXT: psrld $16, %xmm0392; SSE41-NEXT: packusdw %xmm1, %xmm0393; SSE41-NEXT: retq394;395; AVX1-LABEL: trunc8i32_8i16_lshr:396; AVX1: # %bb.0: # %entry397; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1398; AVX1-NEXT: vpsrld $16, %xmm1, %xmm1399; AVX1-NEXT: vpsrld $16, %xmm0, %xmm0400; AVX1-NEXT: vpackusdw %xmm1, %xmm0, %xmm0401; AVX1-NEXT: vzeroupper402; AVX1-NEXT: retq403;404; AVX2-LABEL: trunc8i32_8i16_lshr:405; AVX2: # %bb.0: # %entry406; AVX2-NEXT: vpsrld $16, %ymm0, %ymm0407; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1408; AVX2-NEXT: vpackusdw %xmm1, %xmm0, %xmm0409; AVX2-NEXT: vzeroupper410; AVX2-NEXT: retq411;412; AVX512F-LABEL: trunc8i32_8i16_lshr:413; AVX512F: # %bb.0: # %entry414; AVX512F-NEXT: vpsrld $16, %ymm0, %ymm0415; AVX512F-NEXT: vpmovdw %zmm0, %ymm0416; AVX512F-NEXT: # kill: def $xmm0 killed $xmm0 killed $ymm0417; AVX512F-NEXT: vzeroupper418; AVX512F-NEXT: retq419;420; AVX512VL-LABEL: trunc8i32_8i16_lshr:421; AVX512VL: # %bb.0: # %entry422; AVX512VL-NEXT: vpsrld $16, %ymm0, %ymm0423; AVX512VL-NEXT: vpmovdw %ymm0, %xmm0424; AVX512VL-NEXT: vzeroupper425; AVX512VL-NEXT: retq426;427; AVX512BW-LABEL: trunc8i32_8i16_lshr:428; AVX512BW: # %bb.0: # %entry429; AVX512BW-NEXT: vpsrld $16, %ymm0, %ymm0430; AVX512BW-NEXT: vpmovdw %zmm0, %ymm0431; AVX512BW-NEXT: # kill: def $xmm0 killed $xmm0 killed $ymm0432; AVX512BW-NEXT: vzeroupper433; AVX512BW-NEXT: retq434;435; AVX512BWVL-LABEL: trunc8i32_8i16_lshr:436; AVX512BWVL: # %bb.0: # %entry437; AVX512BWVL-NEXT: vpsrld $16, %ymm0, %ymm0438; AVX512BWVL-NEXT: vpmovdw %ymm0, %xmm0439; AVX512BWVL-NEXT: vzeroupper440; AVX512BWVL-NEXT: retq441entry:442 %0 = lshr <8 x i32> %a, <i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16>443 %1 = trunc <8 x i32> %0 to <8 x i16>444 ret <8 x i16> %1445}446 447define void @trunc8i32_8i8(<8 x i32> %a, ptr %b) {448; SSE2-SSSE3-LABEL: trunc8i32_8i8:449; SSE2-SSSE3: # %bb.0: # %entry450; SSE2-SSSE3-NEXT: movdqa {{.*#+}} xmm2 = [255,0,0,0,255,0,0,0,255,0,0,0,255,0,0,0]451; SSE2-SSSE3-NEXT: pand %xmm2, %xmm1452; SSE2-SSSE3-NEXT: pand %xmm2, %xmm0453; SSE2-SSSE3-NEXT: packuswb %xmm1, %xmm0454; SSE2-SSSE3-NEXT: packuswb %xmm0, %xmm0455; SSE2-SSSE3-NEXT: movq %xmm0, (%rdi)456; SSE2-SSSE3-NEXT: retq457;458; SSE41-LABEL: trunc8i32_8i8:459; SSE41: # %bb.0: # %entry460; SSE41-NEXT: pmovzxbd {{.*#+}} xmm2 = [255,255,255,255]461; SSE41-NEXT: pand %xmm2, %xmm1462; SSE41-NEXT: pand %xmm2, %xmm0463; SSE41-NEXT: packusdw %xmm1, %xmm0464; SSE41-NEXT: packuswb %xmm0, %xmm0465; SSE41-NEXT: movq %xmm0, (%rdi)466; SSE41-NEXT: retq467;468; AVX1-LABEL: trunc8i32_8i8:469; AVX1: # %bb.0: # %entry470; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1471; AVX1-NEXT: vmovd {{.*#+}} xmm2 = [0,4,8,12,0,0,0,0,0,0,0,0,0,0,0,0]472; AVX1-NEXT: vpshufb %xmm2, %xmm1, %xmm1473; AVX1-NEXT: vpshufb %xmm2, %xmm0, %xmm0474; AVX1-NEXT: vpunpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]475; AVX1-NEXT: vmovq %xmm0, (%rdi)476; AVX1-NEXT: vzeroupper477; AVX1-NEXT: retq478;479; AVX2-LABEL: trunc8i32_8i8:480; AVX2: # %bb.0: # %entry481; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1482; AVX2-NEXT: vmovd {{.*#+}} xmm2 = [0,4,8,12,0,0,0,0,0,0,0,0,0,0,0,0]483; AVX2-NEXT: vpshufb %xmm2, %xmm1, %xmm1484; AVX2-NEXT: vpshufb %xmm2, %xmm0, %xmm0485; AVX2-NEXT: vpunpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]486; AVX2-NEXT: vmovq %xmm0, (%rdi)487; AVX2-NEXT: vzeroupper488; AVX2-NEXT: retq489;490; AVX512F-LABEL: trunc8i32_8i8:491; AVX512F: # %bb.0: # %entry492; AVX512F-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm0493; AVX512F-NEXT: vpmovdb %zmm0, %xmm0494; AVX512F-NEXT: vmovq %xmm0, (%rdi)495; AVX512F-NEXT: vzeroupper496; AVX512F-NEXT: retq497;498; AVX512VL-LABEL: trunc8i32_8i8:499; AVX512VL: # %bb.0: # %entry500; AVX512VL-NEXT: vpmovdb %ymm0, (%rdi)501; AVX512VL-NEXT: vzeroupper502; AVX512VL-NEXT: retq503;504; AVX512BW-LABEL: trunc8i32_8i8:505; AVX512BW: # %bb.0: # %entry506; AVX512BW-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm0507; AVX512BW-NEXT: vpmovdb %zmm0, %xmm0508; AVX512BW-NEXT: vmovq %xmm0, (%rdi)509; AVX512BW-NEXT: vzeroupper510; AVX512BW-NEXT: retq511;512; AVX512BWVL-LABEL: trunc8i32_8i8:513; AVX512BWVL: # %bb.0: # %entry514; AVX512BWVL-NEXT: vpmovdb %ymm0, (%rdi)515; AVX512BWVL-NEXT: vzeroupper516; AVX512BWVL-NEXT: retq517entry:518 %0 = trunc <8 x i32> %a to <8 x i8>519 store <8 x i8> %0, ptr %b, align 4520 ret void521}522 523define void @trunc16i32_16i16(<16 x i32> %a, ptr %b) {524; SSE2-LABEL: trunc16i32_16i16:525; SSE2: # %bb.0: # %entry526; SSE2-NEXT: pslld $16, %xmm1527; SSE2-NEXT: psrad $16, %xmm1528; SSE2-NEXT: pslld $16, %xmm0529; SSE2-NEXT: psrad $16, %xmm0530; SSE2-NEXT: packssdw %xmm1, %xmm0531; SSE2-NEXT: pslld $16, %xmm3532; SSE2-NEXT: psrad $16, %xmm3533; SSE2-NEXT: pslld $16, %xmm2534; SSE2-NEXT: psrad $16, %xmm2535; SSE2-NEXT: packssdw %xmm3, %xmm2536; SSE2-NEXT: movdqu %xmm2, 16(%rdi)537; SSE2-NEXT: movdqu %xmm0, (%rdi)538; SSE2-NEXT: retq539;540; SSSE3-LABEL: trunc16i32_16i16:541; SSSE3: # %bb.0: # %entry542; SSSE3-NEXT: movdqa {{.*#+}} xmm4 = [0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15]543; SSSE3-NEXT: pshufb %xmm4, %xmm1544; SSSE3-NEXT: pshufb %xmm4, %xmm0545; SSSE3-NEXT: punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]546; SSSE3-NEXT: pshufb %xmm4, %xmm3547; SSSE3-NEXT: pshufb %xmm4, %xmm2548; SSSE3-NEXT: punpcklqdq {{.*#+}} xmm2 = xmm2[0],xmm3[0]549; SSSE3-NEXT: movdqu %xmm2, 16(%rdi)550; SSSE3-NEXT: movdqu %xmm0, (%rdi)551; SSSE3-NEXT: retq552;553; SSE41-LABEL: trunc16i32_16i16:554; SSE41: # %bb.0: # %entry555; SSE41-NEXT: pxor %xmm4, %xmm4556; SSE41-NEXT: pblendw {{.*#+}} xmm1 = xmm1[0],xmm4[1],xmm1[2],xmm4[3],xmm1[4],xmm4[5],xmm1[6],xmm4[7]557; SSE41-NEXT: pblendw {{.*#+}} xmm0 = xmm0[0],xmm4[1],xmm0[2],xmm4[3],xmm0[4],xmm4[5],xmm0[6],xmm4[7]558; SSE41-NEXT: packusdw %xmm1, %xmm0559; SSE41-NEXT: pblendw {{.*#+}} xmm3 = xmm3[0],xmm4[1],xmm3[2],xmm4[3],xmm3[4],xmm4[5],xmm3[6],xmm4[7]560; SSE41-NEXT: pblendw {{.*#+}} xmm2 = xmm2[0],xmm4[1],xmm2[2],xmm4[3],xmm2[4],xmm4[5],xmm2[6],xmm4[7]561; SSE41-NEXT: packusdw %xmm3, %xmm2562; SSE41-NEXT: movdqu %xmm2, 16(%rdi)563; SSE41-NEXT: movdqu %xmm0, (%rdi)564; SSE41-NEXT: retq565;566; AVX1-LABEL: trunc16i32_16i16:567; AVX1: # %bb.0: # %entry568; AVX1-NEXT: vbroadcastss {{.*#+}} ymm2 = [65535,65535,65535,65535,65535,65535,65535,65535]569; AVX1-NEXT: vandps %ymm2, %ymm0, %ymm0570; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm3571; AVX1-NEXT: vpackusdw %xmm3, %xmm0, %xmm0572; AVX1-NEXT: vandps %ymm2, %ymm1, %ymm1573; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2574; AVX1-NEXT: vpackusdw %xmm2, %xmm1, %xmm1575; AVX1-NEXT: vmovdqu %xmm1, 16(%rdi)576; AVX1-NEXT: vmovdqu %xmm0, (%rdi)577; AVX1-NEXT: vzeroupper578; AVX1-NEXT: retq579;580; AVX2-LABEL: trunc16i32_16i16:581; AVX2: # %bb.0: # %entry582; AVX2-NEXT: vpxor %xmm2, %xmm2, %xmm2583; AVX2-NEXT: vpblendw {{.*#+}} ymm1 = ymm1[0],ymm2[1],ymm1[2],ymm2[3],ymm1[4],ymm2[5],ymm1[6],ymm2[7],ymm1[8],ymm2[9],ymm1[10],ymm2[11],ymm1[12],ymm2[13],ymm1[14],ymm2[15]584; AVX2-NEXT: vpblendw {{.*#+}} ymm0 = ymm0[0],ymm2[1],ymm0[2],ymm2[3],ymm0[4],ymm2[5],ymm0[6],ymm2[7],ymm0[8],ymm2[9],ymm0[10],ymm2[11],ymm0[12],ymm2[13],ymm0[14],ymm2[15]585; AVX2-NEXT: vpackusdw %ymm1, %ymm0, %ymm0586; AVX2-NEXT: vpermq {{.*#+}} ymm0 = ymm0[0,2,1,3]587; AVX2-NEXT: vmovdqu %ymm0, (%rdi)588; AVX2-NEXT: vzeroupper589; AVX2-NEXT: retq590;591; AVX512-LABEL: trunc16i32_16i16:592; AVX512: # %bb.0: # %entry593; AVX512-NEXT: vpmovdw %zmm0, (%rdi)594; AVX512-NEXT: vzeroupper595; AVX512-NEXT: retq596entry:597 %0 = trunc <16 x i32> %a to <16 x i16>598 store <16 x i16> %0, ptr %b, align 4599 ret void600}601 602define void @trunc16i32_16i16_ashr(<16 x i32> %a, ptr %b) {603; SSE2-SSSE3-LABEL: trunc16i32_16i16_ashr:604; SSE2-SSSE3: # %bb.0: # %entry605; SSE2-SSSE3-NEXT: psrad $16, %xmm1606; SSE2-SSSE3-NEXT: psrad $16, %xmm0607; SSE2-SSSE3-NEXT: packssdw %xmm1, %xmm0608; SSE2-SSSE3-NEXT: psrad $16, %xmm3609; SSE2-SSSE3-NEXT: psrad $16, %xmm2610; SSE2-SSSE3-NEXT: packssdw %xmm3, %xmm2611; SSE2-SSSE3-NEXT: movdqu %xmm2, 16(%rdi)612; SSE2-SSSE3-NEXT: movdqu %xmm0, (%rdi)613; SSE2-SSSE3-NEXT: retq614;615; SSE41-LABEL: trunc16i32_16i16_ashr:616; SSE41: # %bb.0: # %entry617; SSE41-NEXT: psrld $16, %xmm3618; SSE41-NEXT: psrld $16, %xmm2619; SSE41-NEXT: packusdw %xmm3, %xmm2620; SSE41-NEXT: psrld $16, %xmm1621; SSE41-NEXT: psrld $16, %xmm0622; SSE41-NEXT: packusdw %xmm1, %xmm0623; SSE41-NEXT: movdqu %xmm2, 16(%rdi)624; SSE41-NEXT: movdqu %xmm0, (%rdi)625; SSE41-NEXT: retq626;627; AVX1-LABEL: trunc16i32_16i16_ashr:628; AVX1: # %bb.0: # %entry629; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2630; AVX1-NEXT: vpsrld $16, %xmm2, %xmm2631; AVX1-NEXT: vpsrld $16, %xmm1, %xmm1632; AVX1-NEXT: vpackusdw %xmm2, %xmm1, %xmm1633; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2634; AVX1-NEXT: vpsrld $16, %xmm2, %xmm2635; AVX1-NEXT: vpsrld $16, %xmm0, %xmm0636; AVX1-NEXT: vpackusdw %xmm2, %xmm0, %xmm0637; AVX1-NEXT: vmovdqu %xmm1, 16(%rdi)638; AVX1-NEXT: vmovdqu %xmm0, (%rdi)639; AVX1-NEXT: vzeroupper640; AVX1-NEXT: retq641;642; AVX2-LABEL: trunc16i32_16i16_ashr:643; AVX2: # %bb.0: # %entry644; AVX2-NEXT: vpsrld $16, %ymm1, %ymm1645; AVX2-NEXT: vpsrld $16, %ymm0, %ymm0646; AVX2-NEXT: vpackusdw %ymm1, %ymm0, %ymm0647; AVX2-NEXT: vpermq {{.*#+}} ymm0 = ymm0[0,2,1,3]648; AVX2-NEXT: vmovdqu %ymm0, (%rdi)649; AVX2-NEXT: vzeroupper650; AVX2-NEXT: retq651;652; AVX512-LABEL: trunc16i32_16i16_ashr:653; AVX512: # %bb.0: # %entry654; AVX512-NEXT: vpsrld $16, %zmm0, %zmm0655; AVX512-NEXT: vpmovdw %zmm0, (%rdi)656; AVX512-NEXT: vzeroupper657; AVX512-NEXT: retq658entry:659 %0 = ashr <16 x i32> %a, <i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16>660 %1 = trunc <16 x i32> %0 to <16 x i16>661 store <16 x i16> %1, ptr %b, align 4662 ret void663}664 665define void @trunc16i32_16i16_lshr(<16 x i32> %a, ptr %b) {666; SSE2-SSSE3-LABEL: trunc16i32_16i16_lshr:667; SSE2-SSSE3: # %bb.0: # %entry668; SSE2-SSSE3-NEXT: psrad $16, %xmm1669; SSE2-SSSE3-NEXT: psrad $16, %xmm0670; SSE2-SSSE3-NEXT: packssdw %xmm1, %xmm0671; SSE2-SSSE3-NEXT: psrad $16, %xmm3672; SSE2-SSSE3-NEXT: psrad $16, %xmm2673; SSE2-SSSE3-NEXT: packssdw %xmm3, %xmm2674; SSE2-SSSE3-NEXT: movdqu %xmm2, 16(%rdi)675; SSE2-SSSE3-NEXT: movdqu %xmm0, (%rdi)676; SSE2-SSSE3-NEXT: retq677;678; SSE41-LABEL: trunc16i32_16i16_lshr:679; SSE41: # %bb.0: # %entry680; SSE41-NEXT: psrld $16, %xmm3681; SSE41-NEXT: psrld $16, %xmm2682; SSE41-NEXT: packusdw %xmm3, %xmm2683; SSE41-NEXT: psrld $16, %xmm1684; SSE41-NEXT: psrld $16, %xmm0685; SSE41-NEXT: packusdw %xmm1, %xmm0686; SSE41-NEXT: movdqu %xmm2, 16(%rdi)687; SSE41-NEXT: movdqu %xmm0, (%rdi)688; SSE41-NEXT: retq689;690; AVX1-LABEL: trunc16i32_16i16_lshr:691; AVX1: # %bb.0: # %entry692; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2693; AVX1-NEXT: vpsrld $16, %xmm2, %xmm2694; AVX1-NEXT: vpsrld $16, %xmm1, %xmm1695; AVX1-NEXT: vpackusdw %xmm2, %xmm1, %xmm1696; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2697; AVX1-NEXT: vpsrld $16, %xmm2, %xmm2698; AVX1-NEXT: vpsrld $16, %xmm0, %xmm0699; AVX1-NEXT: vpackusdw %xmm2, %xmm0, %xmm0700; AVX1-NEXT: vmovdqu %xmm1, 16(%rdi)701; AVX1-NEXT: vmovdqu %xmm0, (%rdi)702; AVX1-NEXT: vzeroupper703; AVX1-NEXT: retq704;705; AVX2-LABEL: trunc16i32_16i16_lshr:706; AVX2: # %bb.0: # %entry707; AVX2-NEXT: vpsrld $16, %ymm1, %ymm1708; AVX2-NEXT: vpsrld $16, %ymm0, %ymm0709; AVX2-NEXT: vpackusdw %ymm1, %ymm0, %ymm0710; AVX2-NEXT: vpermq {{.*#+}} ymm0 = ymm0[0,2,1,3]711; AVX2-NEXT: vmovdqu %ymm0, (%rdi)712; AVX2-NEXT: vzeroupper713; AVX2-NEXT: retq714;715; AVX512-LABEL: trunc16i32_16i16_lshr:716; AVX512: # %bb.0: # %entry717; AVX512-NEXT: vpsrld $16, %zmm0, %zmm0718; AVX512-NEXT: vpmovdw %zmm0, (%rdi)719; AVX512-NEXT: vzeroupper720; AVX512-NEXT: retq721entry:722 %0 = lshr <16 x i32> %a, <i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16>723 %1 = trunc <16 x i32> %0 to <16 x i16>724 store <16 x i16> %1, ptr %b, align 4725 ret void726}727 728define void @trunc16i32_16i8(<16 x i32> %a, ptr %b) {729; SSE2-SSSE3-LABEL: trunc16i32_16i8:730; SSE2-SSSE3: # %bb.0: # %entry731; SSE2-SSSE3-NEXT: movdqa {{.*#+}} xmm4 = [255,0,0,0,255,0,0,0,255,0,0,0,255,0,0,0]732; SSE2-SSSE3-NEXT: pand %xmm4, %xmm3733; SSE2-SSSE3-NEXT: pand %xmm4, %xmm2734; SSE2-SSSE3-NEXT: packuswb %xmm3, %xmm2735; SSE2-SSSE3-NEXT: pand %xmm4, %xmm1736; SSE2-SSSE3-NEXT: pand %xmm4, %xmm0737; SSE2-SSSE3-NEXT: packuswb %xmm1, %xmm0738; SSE2-SSSE3-NEXT: packuswb %xmm2, %xmm0739; SSE2-SSSE3-NEXT: movdqu %xmm0, (%rdi)740; SSE2-SSSE3-NEXT: retq741;742; SSE41-LABEL: trunc16i32_16i8:743; SSE41: # %bb.0: # %entry744; SSE41-NEXT: pmovzxbd {{.*#+}} xmm4 = [255,255,255,255]745; SSE41-NEXT: pand %xmm4, %xmm3746; SSE41-NEXT: pand %xmm4, %xmm2747; SSE41-NEXT: packusdw %xmm3, %xmm2748; SSE41-NEXT: pand %xmm4, %xmm1749; SSE41-NEXT: pand %xmm4, %xmm0750; SSE41-NEXT: packusdw %xmm1, %xmm0751; SSE41-NEXT: packuswb %xmm2, %xmm0752; SSE41-NEXT: movdqu %xmm0, (%rdi)753; SSE41-NEXT: retq754;755; AVX1-LABEL: trunc16i32_16i8:756; AVX1: # %bb.0: # %entry757; AVX1-NEXT: vbroadcastss {{.*#+}} ymm2 = [255,255,255,255,255,255,255,255]758; AVX1-NEXT: vandps %ymm2, %ymm1, %ymm1759; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm3760; AVX1-NEXT: vpackusdw %xmm3, %xmm1, %xmm1761; AVX1-NEXT: vandps %ymm2, %ymm0, %ymm0762; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2763; AVX1-NEXT: vpackusdw %xmm2, %xmm0, %xmm0764; AVX1-NEXT: vpackuswb %xmm1, %xmm0, %xmm0765; AVX1-NEXT: vmovdqu %xmm0, (%rdi)766; AVX1-NEXT: vzeroupper767; AVX1-NEXT: retq768;769; AVX2-LABEL: trunc16i32_16i8:770; AVX2: # %bb.0: # %entry771; AVX2-NEXT: vpbroadcastd {{.*#+}} ymm2 = [255,0,0,0,255,0,0,0,255,0,0,0,255,0,0,0,255,0,0,0,255,0,0,0,255,0,0,0,255,0,0,0]772; AVX2-NEXT: vpand %ymm2, %ymm1, %ymm1773; AVX2-NEXT: vpand %ymm2, %ymm0, %ymm0774; AVX2-NEXT: vpackusdw %ymm1, %ymm0, %ymm0775; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1776; AVX2-NEXT: vpackuswb %xmm1, %xmm0, %xmm0777; AVX2-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[0,2,1,3]778; AVX2-NEXT: vmovdqu %xmm0, (%rdi)779; AVX2-NEXT: vzeroupper780; AVX2-NEXT: retq781;782; AVX512-LABEL: trunc16i32_16i8:783; AVX512: # %bb.0: # %entry784; AVX512-NEXT: vpmovdb %zmm0, (%rdi)785; AVX512-NEXT: vzeroupper786; AVX512-NEXT: retq787entry:788 %0 = trunc <16 x i32> %a to <16 x i8>789 store <16 x i8> %0, ptr %b, align 4790 ret void791}792 793define void @trunc16i32_16i8_ashr(<16 x i32> %a, ptr %b) {794; SSE2-SSSE3-LABEL: trunc16i32_16i8_ashr:795; SSE2-SSSE3: # %bb.0: # %entry796; SSE2-SSSE3-NEXT: psrld $24, %xmm1797; SSE2-SSSE3-NEXT: psrld $24, %xmm0798; SSE2-SSSE3-NEXT: packuswb %xmm1, %xmm0799; SSE2-SSSE3-NEXT: psrld $24, %xmm3800; SSE2-SSSE3-NEXT: psrld $24, %xmm2801; SSE2-SSSE3-NEXT: packuswb %xmm3, %xmm2802; SSE2-SSSE3-NEXT: packuswb %xmm2, %xmm0803; SSE2-SSSE3-NEXT: movdqu %xmm0, (%rdi)804; SSE2-SSSE3-NEXT: retq805;806; SSE41-LABEL: trunc16i32_16i8_ashr:807; SSE41: # %bb.0: # %entry808; SSE41-NEXT: psrld $24, %xmm1809; SSE41-NEXT: psrld $24, %xmm0810; SSE41-NEXT: packusdw %xmm1, %xmm0811; SSE41-NEXT: psrld $24, %xmm3812; SSE41-NEXT: psrld $24, %xmm2813; SSE41-NEXT: packusdw %xmm3, %xmm2814; SSE41-NEXT: packuswb %xmm2, %xmm0815; SSE41-NEXT: movdqu %xmm0, (%rdi)816; SSE41-NEXT: retq817;818; AVX1-LABEL: trunc16i32_16i8_ashr:819; AVX1: # %bb.0: # %entry820; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2821; AVX1-NEXT: vpsrld $24, %xmm2, %xmm2822; AVX1-NEXT: vpsrld $24, %xmm0, %xmm0823; AVX1-NEXT: vpackusdw %xmm2, %xmm0, %xmm0824; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2825; AVX1-NEXT: vpsrld $24, %xmm2, %xmm2826; AVX1-NEXT: vpsrld $24, %xmm1, %xmm1827; AVX1-NEXT: vpackusdw %xmm2, %xmm1, %xmm1828; AVX1-NEXT: vpackuswb %xmm1, %xmm0, %xmm0829; AVX1-NEXT: vmovdqu %xmm0, (%rdi)830; AVX1-NEXT: vzeroupper831; AVX1-NEXT: retq832;833; AVX2-LABEL: trunc16i32_16i8_ashr:834; AVX2: # %bb.0: # %entry835; AVX2-NEXT: vpsrld $24, %ymm1, %ymm1836; AVX2-NEXT: vpsrld $24, %ymm0, %ymm0837; AVX2-NEXT: vpackusdw %ymm1, %ymm0, %ymm0838; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1839; AVX2-NEXT: vpackuswb %xmm1, %xmm0, %xmm0840; AVX2-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[0,2,1,3]841; AVX2-NEXT: vmovdqu %xmm0, (%rdi)842; AVX2-NEXT: vzeroupper843; AVX2-NEXT: retq844;845; AVX512-LABEL: trunc16i32_16i8_ashr:846; AVX512: # %bb.0: # %entry847; AVX512-NEXT: vpsrld $24, %zmm0, %zmm0848; AVX512-NEXT: vpmovdb %zmm0, (%rdi)849; AVX512-NEXT: vzeroupper850; AVX512-NEXT: retq851entry:852 %0 = ashr <16 x i32> %a, <i32 24, i32 24, i32 24, i32 24, i32 24, i32 24, i32 24, i32 24, i32 24, i32 24, i32 24, i32 24, i32 24, i32 24, i32 24, i32 24>853 %1 = trunc <16 x i32> %0 to <16 x i8>854 store <16 x i8> %1, ptr %b, align 4855 ret void856}857 858define void @trunc16i32_16i8_lshr(<16 x i32> %a, ptr %b) {859; SSE2-SSSE3-LABEL: trunc16i32_16i8_lshr:860; SSE2-SSSE3: # %bb.0: # %entry861; SSE2-SSSE3-NEXT: psrld $24, %xmm1862; SSE2-SSSE3-NEXT: psrld $24, %xmm0863; SSE2-SSSE3-NEXT: packuswb %xmm1, %xmm0864; SSE2-SSSE3-NEXT: psrld $24, %xmm3865; SSE2-SSSE3-NEXT: psrld $24, %xmm2866; SSE2-SSSE3-NEXT: packuswb %xmm3, %xmm2867; SSE2-SSSE3-NEXT: packuswb %xmm2, %xmm0868; SSE2-SSSE3-NEXT: movdqu %xmm0, (%rdi)869; SSE2-SSSE3-NEXT: retq870;871; SSE41-LABEL: trunc16i32_16i8_lshr:872; SSE41: # %bb.0: # %entry873; SSE41-NEXT: psrld $24, %xmm1874; SSE41-NEXT: psrld $24, %xmm0875; SSE41-NEXT: packusdw %xmm1, %xmm0876; SSE41-NEXT: psrld $24, %xmm3877; SSE41-NEXT: psrld $24, %xmm2878; SSE41-NEXT: packusdw %xmm3, %xmm2879; SSE41-NEXT: packuswb %xmm2, %xmm0880; SSE41-NEXT: movdqu %xmm0, (%rdi)881; SSE41-NEXT: retq882;883; AVX1-LABEL: trunc16i32_16i8_lshr:884; AVX1: # %bb.0: # %entry885; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2886; AVX1-NEXT: vpsrld $24, %xmm2, %xmm2887; AVX1-NEXT: vpsrld $24, %xmm0, %xmm0888; AVX1-NEXT: vpackusdw %xmm2, %xmm0, %xmm0889; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2890; AVX1-NEXT: vpsrld $24, %xmm2, %xmm2891; AVX1-NEXT: vpsrld $24, %xmm1, %xmm1892; AVX1-NEXT: vpackusdw %xmm2, %xmm1, %xmm1893; AVX1-NEXT: vpackuswb %xmm1, %xmm0, %xmm0894; AVX1-NEXT: vmovdqu %xmm0, (%rdi)895; AVX1-NEXT: vzeroupper896; AVX1-NEXT: retq897;898; AVX2-LABEL: trunc16i32_16i8_lshr:899; AVX2: # %bb.0: # %entry900; AVX2-NEXT: vpsrld $24, %ymm1, %ymm1901; AVX2-NEXT: vpsrld $24, %ymm0, %ymm0902; AVX2-NEXT: vpackusdw %ymm1, %ymm0, %ymm0903; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1904; AVX2-NEXT: vpackuswb %xmm1, %xmm0, %xmm0905; AVX2-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[0,2,1,3]906; AVX2-NEXT: vmovdqu %xmm0, (%rdi)907; AVX2-NEXT: vzeroupper908; AVX2-NEXT: retq909;910; AVX512-LABEL: trunc16i32_16i8_lshr:911; AVX512: # %bb.0: # %entry912; AVX512-NEXT: vpsrld $24, %zmm0, %zmm0913; AVX512-NEXT: vpmovdb %zmm0, (%rdi)914; AVX512-NEXT: vzeroupper915; AVX512-NEXT: retq916entry:917 %0 = lshr <16 x i32> %a, <i32 24, i32 24, i32 24, i32 24, i32 24, i32 24, i32 24, i32 24, i32 24, i32 24, i32 24, i32 24, i32 24, i32 24, i32 24, i32 24>918 %1 = trunc <16 x i32> %0 to <16 x i8>919 store <16 x i8> %1, ptr %b, align 4920 ret void921}922 923;PR25684924define void @trunc16i16_16i8(<16 x i16> %a, ptr %b) {925; SSE2-SSSE3-LABEL: trunc16i16_16i8:926; SSE2-SSSE3: # %bb.0: # %entry927; SSE2-SSSE3-NEXT: movdqa {{.*#+}} xmm2 = [255,0,255,0,255,0,255,0,255,0,255,0,255,0,255,0]928; SSE2-SSSE3-NEXT: pand %xmm2, %xmm1929; SSE2-SSSE3-NEXT: pand %xmm2, %xmm0930; SSE2-SSSE3-NEXT: packuswb %xmm1, %xmm0931; SSE2-SSSE3-NEXT: movdqu %xmm0, (%rdi)932; SSE2-SSSE3-NEXT: retq933;934; SSE41-LABEL: trunc16i16_16i8:935; SSE41: # %bb.0: # %entry936; SSE41-NEXT: pmovzxbw {{.*#+}} xmm2 = [255,255,255,255,255,255,255,255]937; SSE41-NEXT: pand %xmm2, %xmm1938; SSE41-NEXT: pand %xmm2, %xmm0939; SSE41-NEXT: packuswb %xmm1, %xmm0940; SSE41-NEXT: movdqu %xmm0, (%rdi)941; SSE41-NEXT: retq942;943; AVX1-LABEL: trunc16i16_16i8:944; AVX1: # %bb.0: # %entry945; AVX1-NEXT: vandps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0946; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1947; AVX1-NEXT: vpackuswb %xmm1, %xmm0, %xmm0948; AVX1-NEXT: vmovdqu %xmm0, (%rdi)949; AVX1-NEXT: vzeroupper950; AVX1-NEXT: retq951;952; AVX2-LABEL: trunc16i16_16i8:953; AVX2: # %bb.0: # %entry954; AVX2-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0955; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1956; AVX2-NEXT: vpackuswb %xmm1, %xmm0, %xmm0957; AVX2-NEXT: vmovdqu %xmm0, (%rdi)958; AVX2-NEXT: vzeroupper959; AVX2-NEXT: retq960;961; AVX512F-LABEL: trunc16i16_16i8:962; AVX512F: # %bb.0: # %entry963; AVX512F-NEXT: vpmovzxwd {{.*#+}} zmm0 = ymm0[0],zero,ymm0[1],zero,ymm0[2],zero,ymm0[3],zero,ymm0[4],zero,ymm0[5],zero,ymm0[6],zero,ymm0[7],zero,ymm0[8],zero,ymm0[9],zero,ymm0[10],zero,ymm0[11],zero,ymm0[12],zero,ymm0[13],zero,ymm0[14],zero,ymm0[15],zero964; AVX512F-NEXT: vpmovdb %zmm0, (%rdi)965; AVX512F-NEXT: vzeroupper966; AVX512F-NEXT: retq967;968; AVX512VL-LABEL: trunc16i16_16i8:969; AVX512VL: # %bb.0: # %entry970; AVX512VL-NEXT: vpmovzxwd {{.*#+}} zmm0 = ymm0[0],zero,ymm0[1],zero,ymm0[2],zero,ymm0[3],zero,ymm0[4],zero,ymm0[5],zero,ymm0[6],zero,ymm0[7],zero,ymm0[8],zero,ymm0[9],zero,ymm0[10],zero,ymm0[11],zero,ymm0[12],zero,ymm0[13],zero,ymm0[14],zero,ymm0[15],zero971; AVX512VL-NEXT: vpmovdb %zmm0, (%rdi)972; AVX512VL-NEXT: vzeroupper973; AVX512VL-NEXT: retq974;975; AVX512BW-LABEL: trunc16i16_16i8:976; AVX512BW: # %bb.0: # %entry977; AVX512BW-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm0978; AVX512BW-NEXT: vpmovwb %zmm0, %ymm0979; AVX512BW-NEXT: vmovdqu %xmm0, (%rdi)980; AVX512BW-NEXT: vzeroupper981; AVX512BW-NEXT: retq982;983; AVX512BWVL-LABEL: trunc16i16_16i8:984; AVX512BWVL: # %bb.0: # %entry985; AVX512BWVL-NEXT: vpmovwb %ymm0, (%rdi)986; AVX512BWVL-NEXT: vzeroupper987; AVX512BWVL-NEXT: retq988entry:989 %0 = trunc <16 x i16> %a to <16 x i8>990 store <16 x i8> %0, ptr %b, align 4991 ret void992}993 994define void @trunc16i16_16i8_ashr(<16 x i16> %a, ptr %b) {995; SSE-LABEL: trunc16i16_16i8_ashr:996; SSE: # %bb.0: # %entry997; SSE-NEXT: psrlw $8, %xmm1998; SSE-NEXT: psrlw $8, %xmm0999; SSE-NEXT: packuswb %xmm1, %xmm01000; SSE-NEXT: movdqu %xmm0, (%rdi)1001; SSE-NEXT: retq1002;1003; AVX1-LABEL: trunc16i16_16i8_ashr:1004; AVX1: # %bb.0: # %entry1005; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm11006; AVX1-NEXT: vpsrlw $8, %xmm1, %xmm11007; AVX1-NEXT: vpsrlw $8, %xmm0, %xmm01008; AVX1-NEXT: vpackuswb %xmm1, %xmm0, %xmm01009; AVX1-NEXT: vmovdqu %xmm0, (%rdi)1010; AVX1-NEXT: vzeroupper1011; AVX1-NEXT: retq1012;1013; AVX2-LABEL: trunc16i16_16i8_ashr:1014; AVX2: # %bb.0: # %entry1015; AVX2-NEXT: vpsrlw $8, %ymm0, %ymm01016; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm11017; AVX2-NEXT: vpackuswb %xmm1, %xmm0, %xmm01018; AVX2-NEXT: vmovdqu %xmm0, (%rdi)1019; AVX2-NEXT: vzeroupper1020; AVX2-NEXT: retq1021;1022; AVX512F-LABEL: trunc16i16_16i8_ashr:1023; AVX512F: # %bb.0: # %entry1024; AVX512F-NEXT: vpsrlw $8, %ymm0, %ymm01025; AVX512F-NEXT: vpmovzxwd {{.*#+}} zmm0 = ymm0[0],zero,ymm0[1],zero,ymm0[2],zero,ymm0[3],zero,ymm0[4],zero,ymm0[5],zero,ymm0[6],zero,ymm0[7],zero,ymm0[8],zero,ymm0[9],zero,ymm0[10],zero,ymm0[11],zero,ymm0[12],zero,ymm0[13],zero,ymm0[14],zero,ymm0[15],zero1026; AVX512F-NEXT: vpmovdb %zmm0, (%rdi)1027; AVX512F-NEXT: vzeroupper1028; AVX512F-NEXT: retq1029;1030; AVX512VL-LABEL: trunc16i16_16i8_ashr:1031; AVX512VL: # %bb.0: # %entry1032; AVX512VL-NEXT: vpsrlw $8, %ymm0, %ymm01033; AVX512VL-NEXT: vpmovzxwd {{.*#+}} zmm0 = ymm0[0],zero,ymm0[1],zero,ymm0[2],zero,ymm0[3],zero,ymm0[4],zero,ymm0[5],zero,ymm0[6],zero,ymm0[7],zero,ymm0[8],zero,ymm0[9],zero,ymm0[10],zero,ymm0[11],zero,ymm0[12],zero,ymm0[13],zero,ymm0[14],zero,ymm0[15],zero1034; AVX512VL-NEXT: vpmovdb %zmm0, (%rdi)1035; AVX512VL-NEXT: vzeroupper1036; AVX512VL-NEXT: retq1037;1038; AVX512BW-LABEL: trunc16i16_16i8_ashr:1039; AVX512BW: # %bb.0: # %entry1040; AVX512BW-NEXT: vpsrlw $8, %ymm0, %ymm01041; AVX512BW-NEXT: vpmovwb %zmm0, %ymm01042; AVX512BW-NEXT: vmovdqu %xmm0, (%rdi)1043; AVX512BW-NEXT: vzeroupper1044; AVX512BW-NEXT: retq1045;1046; AVX512BWVL-LABEL: trunc16i16_16i8_ashr:1047; AVX512BWVL: # %bb.0: # %entry1048; AVX512BWVL-NEXT: vpsrlw $8, %ymm0, %ymm01049; AVX512BWVL-NEXT: vpmovwb %ymm0, (%rdi)1050; AVX512BWVL-NEXT: vzeroupper1051; AVX512BWVL-NEXT: retq1052entry:1053 %0 = ashr <16 x i16> %a, <i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8>1054 %1 = trunc <16 x i16> %0 to <16 x i8>1055 store <16 x i8> %1, ptr %b, align 41056 ret void1057}1058 1059define void @trunc16i16_16i8_lshr(<16 x i16> %a, ptr %b) {1060; SSE-LABEL: trunc16i16_16i8_lshr:1061; SSE: # %bb.0: # %entry1062; SSE-NEXT: psrlw $8, %xmm11063; SSE-NEXT: psrlw $8, %xmm01064; SSE-NEXT: packuswb %xmm1, %xmm01065; SSE-NEXT: movdqu %xmm0, (%rdi)1066; SSE-NEXT: retq1067;1068; AVX1-LABEL: trunc16i16_16i8_lshr:1069; AVX1: # %bb.0: # %entry1070; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm11071; AVX1-NEXT: vpsrlw $8, %xmm1, %xmm11072; AVX1-NEXT: vpsrlw $8, %xmm0, %xmm01073; AVX1-NEXT: vpackuswb %xmm1, %xmm0, %xmm01074; AVX1-NEXT: vmovdqu %xmm0, (%rdi)1075; AVX1-NEXT: vzeroupper1076; AVX1-NEXT: retq1077;1078; AVX2-LABEL: trunc16i16_16i8_lshr:1079; AVX2: # %bb.0: # %entry1080; AVX2-NEXT: vpsrlw $8, %ymm0, %ymm01081; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm11082; AVX2-NEXT: vpackuswb %xmm1, %xmm0, %xmm01083; AVX2-NEXT: vmovdqu %xmm0, (%rdi)1084; AVX2-NEXT: vzeroupper1085; AVX2-NEXT: retq1086;1087; AVX512F-LABEL: trunc16i16_16i8_lshr:1088; AVX512F: # %bb.0: # %entry1089; AVX512F-NEXT: vpsrlw $8, %ymm0, %ymm01090; AVX512F-NEXT: vpmovzxwd {{.*#+}} zmm0 = ymm0[0],zero,ymm0[1],zero,ymm0[2],zero,ymm0[3],zero,ymm0[4],zero,ymm0[5],zero,ymm0[6],zero,ymm0[7],zero,ymm0[8],zero,ymm0[9],zero,ymm0[10],zero,ymm0[11],zero,ymm0[12],zero,ymm0[13],zero,ymm0[14],zero,ymm0[15],zero1091; AVX512F-NEXT: vpmovdb %zmm0, (%rdi)1092; AVX512F-NEXT: vzeroupper1093; AVX512F-NEXT: retq1094;1095; AVX512VL-LABEL: trunc16i16_16i8_lshr:1096; AVX512VL: # %bb.0: # %entry1097; AVX512VL-NEXT: vpsrlw $8, %ymm0, %ymm01098; AVX512VL-NEXT: vpmovzxwd {{.*#+}} zmm0 = ymm0[0],zero,ymm0[1],zero,ymm0[2],zero,ymm0[3],zero,ymm0[4],zero,ymm0[5],zero,ymm0[6],zero,ymm0[7],zero,ymm0[8],zero,ymm0[9],zero,ymm0[10],zero,ymm0[11],zero,ymm0[12],zero,ymm0[13],zero,ymm0[14],zero,ymm0[15],zero1099; AVX512VL-NEXT: vpmovdb %zmm0, (%rdi)1100; AVX512VL-NEXT: vzeroupper1101; AVX512VL-NEXT: retq1102;1103; AVX512BW-LABEL: trunc16i16_16i8_lshr:1104; AVX512BW: # %bb.0: # %entry1105; AVX512BW-NEXT: vpsrlw $8, %ymm0, %ymm01106; AVX512BW-NEXT: vpmovwb %zmm0, %ymm01107; AVX512BW-NEXT: vmovdqu %xmm0, (%rdi)1108; AVX512BW-NEXT: vzeroupper1109; AVX512BW-NEXT: retq1110;1111; AVX512BWVL-LABEL: trunc16i16_16i8_lshr:1112; AVX512BWVL: # %bb.0: # %entry1113; AVX512BWVL-NEXT: vpsrlw $8, %ymm0, %ymm01114; AVX512BWVL-NEXT: vpmovwb %ymm0, (%rdi)1115; AVX512BWVL-NEXT: vzeroupper1116; AVX512BWVL-NEXT: retq1117entry:1118 %0 = lshr <16 x i16> %a, <i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8>1119 %1 = trunc <16 x i16> %0 to <16 x i8>1120 store <16 x i8> %1, ptr %b, align 41121 ret void1122}1123 1124define void @trunc32i16_32i8(<32 x i16> %a, ptr %b) {1125; SSE2-SSSE3-LABEL: trunc32i16_32i8:1126; SSE2-SSSE3: # %bb.0: # %entry1127; SSE2-SSSE3-NEXT: movdqa {{.*#+}} xmm4 = [255,0,255,0,255,0,255,0,255,0,255,0,255,0,255,0]1128; SSE2-SSSE3-NEXT: pand %xmm4, %xmm11129; SSE2-SSSE3-NEXT: pand %xmm4, %xmm01130; SSE2-SSSE3-NEXT: packuswb %xmm1, %xmm01131; SSE2-SSSE3-NEXT: pand %xmm4, %xmm31132; SSE2-SSSE3-NEXT: pand %xmm4, %xmm21133; SSE2-SSSE3-NEXT: packuswb %xmm3, %xmm21134; SSE2-SSSE3-NEXT: movdqu %xmm2, 16(%rdi)1135; SSE2-SSSE3-NEXT: movdqu %xmm0, (%rdi)1136; SSE2-SSSE3-NEXT: retq1137;1138; SSE41-LABEL: trunc32i16_32i8:1139; SSE41: # %bb.0: # %entry1140; SSE41-NEXT: pmovzxbw {{.*#+}} xmm4 = [255,255,255,255,255,255,255,255]1141; SSE41-NEXT: pand %xmm4, %xmm11142; SSE41-NEXT: pand %xmm4, %xmm01143; SSE41-NEXT: packuswb %xmm1, %xmm01144; SSE41-NEXT: pand %xmm4, %xmm31145; SSE41-NEXT: pand %xmm4, %xmm21146; SSE41-NEXT: packuswb %xmm3, %xmm21147; SSE41-NEXT: movdqu %xmm2, 16(%rdi)1148; SSE41-NEXT: movdqu %xmm0, (%rdi)1149; SSE41-NEXT: retq1150;1151; AVX1-LABEL: trunc32i16_32i8:1152; AVX1: # %bb.0: # %entry1153; AVX1-NEXT: vbroadcastss {{.*#+}} ymm2 = [255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255]1154; AVX1-NEXT: vandps %ymm2, %ymm0, %ymm01155; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm31156; AVX1-NEXT: vpackuswb %xmm3, %xmm0, %xmm01157; AVX1-NEXT: vandps %ymm2, %ymm1, %ymm11158; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm21159; AVX1-NEXT: vpackuswb %xmm2, %xmm1, %xmm11160; AVX1-NEXT: vmovdqu %xmm1, 16(%rdi)1161; AVX1-NEXT: vmovdqu %xmm0, (%rdi)1162; AVX1-NEXT: vzeroupper1163; AVX1-NEXT: retq1164;1165; AVX2-LABEL: trunc32i16_32i8:1166; AVX2: # %bb.0: # %entry1167; AVX2-NEXT: vpbroadcastw {{.*#+}} ymm2 = [255,0,255,0,255,0,255,0,255,0,255,0,255,0,255,0,255,0,255,0,255,0,255,0,255,0,255,0,255,0,255,0]1168; AVX2-NEXT: vpand %ymm2, %ymm1, %ymm11169; AVX2-NEXT: vpand %ymm2, %ymm0, %ymm01170; AVX2-NEXT: vpackuswb %ymm1, %ymm0, %ymm01171; AVX2-NEXT: vpermq {{.*#+}} ymm0 = ymm0[0,2,1,3]1172; AVX2-NEXT: vmovdqu %ymm0, (%rdi)1173; AVX2-NEXT: vzeroupper1174; AVX2-NEXT: retq1175;1176; AVX512F-LABEL: trunc32i16_32i8:1177; AVX512F: # %bb.0: # %entry1178; AVX512F-NEXT: vextracti64x4 $1, %zmm0, %ymm11179; AVX512F-NEXT: vpmovzxwd {{.*#+}} zmm1 = ymm1[0],zero,ymm1[1],zero,ymm1[2],zero,ymm1[3],zero,ymm1[4],zero,ymm1[5],zero,ymm1[6],zero,ymm1[7],zero,ymm1[8],zero,ymm1[9],zero,ymm1[10],zero,ymm1[11],zero,ymm1[12],zero,ymm1[13],zero,ymm1[14],zero,ymm1[15],zero1180; AVX512F-NEXT: vpmovdb %zmm1, 16(%rdi)1181; AVX512F-NEXT: vpmovzxwd {{.*#+}} zmm0 = ymm0[0],zero,ymm0[1],zero,ymm0[2],zero,ymm0[3],zero,ymm0[4],zero,ymm0[5],zero,ymm0[6],zero,ymm0[7],zero,ymm0[8],zero,ymm0[9],zero,ymm0[10],zero,ymm0[11],zero,ymm0[12],zero,ymm0[13],zero,ymm0[14],zero,ymm0[15],zero1182; AVX512F-NEXT: vpmovdb %zmm0, (%rdi)1183; AVX512F-NEXT: vzeroupper1184; AVX512F-NEXT: retq1185;1186; AVX512VL-LABEL: trunc32i16_32i8:1187; AVX512VL: # %bb.0: # %entry1188; AVX512VL-NEXT: vextracti64x4 $1, %zmm0, %ymm11189; AVX512VL-NEXT: vpmovzxwd {{.*#+}} zmm1 = ymm1[0],zero,ymm1[1],zero,ymm1[2],zero,ymm1[3],zero,ymm1[4],zero,ymm1[5],zero,ymm1[6],zero,ymm1[7],zero,ymm1[8],zero,ymm1[9],zero,ymm1[10],zero,ymm1[11],zero,ymm1[12],zero,ymm1[13],zero,ymm1[14],zero,ymm1[15],zero1190; AVX512VL-NEXT: vpmovdb %zmm1, 16(%rdi)1191; AVX512VL-NEXT: vpmovzxwd {{.*#+}} zmm0 = ymm0[0],zero,ymm0[1],zero,ymm0[2],zero,ymm0[3],zero,ymm0[4],zero,ymm0[5],zero,ymm0[6],zero,ymm0[7],zero,ymm0[8],zero,ymm0[9],zero,ymm0[10],zero,ymm0[11],zero,ymm0[12],zero,ymm0[13],zero,ymm0[14],zero,ymm0[15],zero1192; AVX512VL-NEXT: vpmovdb %zmm0, (%rdi)1193; AVX512VL-NEXT: vzeroupper1194; AVX512VL-NEXT: retq1195;1196; AVX512BW-LABEL: trunc32i16_32i8:1197; AVX512BW: # %bb.0: # %entry1198; AVX512BW-NEXT: vpmovwb %zmm0, (%rdi)1199; AVX512BW-NEXT: vzeroupper1200; AVX512BW-NEXT: retq1201;1202; AVX512BWVL-LABEL: trunc32i16_32i8:1203; AVX512BWVL: # %bb.0: # %entry1204; AVX512BWVL-NEXT: vpmovwb %zmm0, (%rdi)1205; AVX512BWVL-NEXT: vzeroupper1206; AVX512BWVL-NEXT: retq1207entry:1208 %0 = trunc <32 x i16> %a to <32 x i8>1209 store <32 x i8> %0, ptr %b, align 41210 ret void1211}1212 1213define <8 x i32> @trunc2x4i64_8i32(<4 x i64> %a, <4 x i64> %b) {1214; SSE-LABEL: trunc2x4i64_8i32:1215; SSE: # %bb.0: # %entry1216; SSE-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,2],xmm1[0,2]1217; SSE-NEXT: shufps {{.*#+}} xmm2 = xmm2[0,2],xmm3[0,2]1218; SSE-NEXT: movaps %xmm2, %xmm11219; SSE-NEXT: retq1220;1221; AVX1-LABEL: trunc2x4i64_8i32:1222; AVX1: # %bb.0: # %entry1223; AVX1-NEXT: vperm2f128 {{.*#+}} ymm2 = ymm0[2,3],ymm1[2,3]1224; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm01225; AVX1-NEXT: vshufps {{.*#+}} ymm0 = ymm0[0,2],ymm2[0,2],ymm0[4,6],ymm2[4,6]1226; AVX1-NEXT: retq1227;1228; AVX2-LABEL: trunc2x4i64_8i32:1229; AVX2: # %bb.0: # %entry1230; AVX2-NEXT: vshufps {{.*#+}} ymm0 = ymm0[0,2],ymm1[0,2],ymm0[4,6],ymm1[4,6]1231; AVX2-NEXT: vpermpd {{.*#+}} ymm0 = ymm0[0,2,1,3]1232; AVX2-NEXT: retq1233;1234; AVX512-LABEL: trunc2x4i64_8i32:1235; AVX512: # %bb.0: # %entry1236; AVX512-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm01237; AVX512-NEXT: vinserti64x4 $1, %ymm1, %zmm0, %zmm01238; AVX512-NEXT: vpmovqd %zmm0, %ymm01239; AVX512-NEXT: retq1240entry:1241 %0 = trunc <4 x i64> %a to <4 x i32>1242 %1 = trunc <4 x i64> %b to <4 x i32>1243 %2 = shufflevector <4 x i32> %0, <4 x i32> %1, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>1244 ret <8 x i32> %21245}1246 1247define <8 x i16> @trunc2x4i64_8i16(<4 x i64> %a, <4 x i64> %b) {1248; SSE2-SSSE3-LABEL: trunc2x4i64_8i16:1249; SSE2-SSSE3: # %bb.0: # %entry1250; SSE2-SSSE3-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,2],xmm1[0,2]1251; SSE2-SSSE3-NEXT: pslld $16, %xmm01252; SSE2-SSSE3-NEXT: psrad $16, %xmm01253; SSE2-SSSE3-NEXT: shufps {{.*#+}} xmm2 = xmm2[0,2],xmm3[0,2]1254; SSE2-SSSE3-NEXT: pslld $16, %xmm21255; SSE2-SSSE3-NEXT: psrad $16, %xmm21256; SSE2-SSSE3-NEXT: packssdw %xmm2, %xmm01257; SSE2-SSSE3-NEXT: retq1258;1259; SSE41-LABEL: trunc2x4i64_8i16:1260; SSE41: # %bb.0: # %entry1261; SSE41-NEXT: pxor %xmm4, %xmm41262; SSE41-NEXT: pblendw {{.*#+}} xmm1 = xmm1[0],xmm4[1,2,3],xmm1[4],xmm4[5,6,7]1263; SSE41-NEXT: pblendw {{.*#+}} xmm0 = xmm0[0],xmm4[1,2,3],xmm0[4],xmm4[5,6,7]1264; SSE41-NEXT: packusdw %xmm1, %xmm01265; SSE41-NEXT: pblendw {{.*#+}} xmm3 = xmm3[0],xmm4[1,2,3],xmm3[4],xmm4[5,6,7]1266; SSE41-NEXT: pblendw {{.*#+}} xmm2 = xmm2[0],xmm4[1,2,3],xmm2[4],xmm4[5,6,7]1267; SSE41-NEXT: packusdw %xmm3, %xmm21268; SSE41-NEXT: packusdw %xmm2, %xmm01269; SSE41-NEXT: retq1270;1271; AVX1-LABEL: trunc2x4i64_8i16:1272; AVX1: # %bb.0: # %entry1273; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm21274; AVX1-NEXT: vpxor %xmm3, %xmm3, %xmm31275; AVX1-NEXT: vpblendw {{.*#+}} xmm2 = xmm2[0],xmm3[1,2,3],xmm2[4],xmm3[5,6,7]1276; AVX1-NEXT: vpblendw {{.*#+}} xmm1 = xmm1[0],xmm3[1,2,3],xmm1[4],xmm3[5,6,7]1277; AVX1-NEXT: vpackusdw %xmm2, %xmm1, %xmm11278; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm21279; AVX1-NEXT: vpblendw {{.*#+}} xmm2 = xmm2[0],xmm3[1,2,3],xmm2[4],xmm3[5,6,7]1280; AVX1-NEXT: vpblendw {{.*#+}} xmm0 = xmm0[0],xmm3[1,2,3],xmm0[4],xmm3[5,6,7]1281; AVX1-NEXT: vpackusdw %xmm2, %xmm0, %xmm01282; AVX1-NEXT: vpackusdw %xmm1, %xmm0, %xmm01283; AVX1-NEXT: vzeroupper1284; AVX1-NEXT: retq1285;1286; AVX2-LABEL: trunc2x4i64_8i16:1287; AVX2: # %bb.0: # %entry1288; AVX2-NEXT: vpxor %xmm2, %xmm2, %xmm21289; AVX2-NEXT: vpblendw {{.*#+}} ymm1 = ymm1[0],ymm2[1,2,3],ymm1[4],ymm2[5,6,7],ymm1[8],ymm2[9,10,11],ymm1[12],ymm2[13,14,15]1290; AVX2-NEXT: vextracti128 $1, %ymm1, %xmm31291; AVX2-NEXT: vpackusdw %xmm3, %xmm1, %xmm11292; AVX2-NEXT: vpblendw {{.*#+}} ymm0 = ymm0[0],ymm2[1,2,3],ymm0[4],ymm2[5,6,7],ymm0[8],ymm2[9,10,11],ymm0[12],ymm2[13,14,15]1293; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm21294; AVX2-NEXT: vpackusdw %xmm2, %xmm0, %xmm01295; AVX2-NEXT: vpackusdw %xmm1, %xmm0, %xmm01296; AVX2-NEXT: vzeroupper1297; AVX2-NEXT: retq1298;1299; AVX512F-LABEL: trunc2x4i64_8i16:1300; AVX512F: # %bb.0: # %entry1301; AVX512F-NEXT: # kill: def $ymm1 killed $ymm1 def $zmm11302; AVX512F-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm01303; AVX512F-NEXT: vpmovqw %zmm0, %xmm01304; AVX512F-NEXT: vpmovqw %zmm1, %xmm11305; AVX512F-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]1306; AVX512F-NEXT: vzeroupper1307; AVX512F-NEXT: retq1308;1309; AVX512VL-LABEL: trunc2x4i64_8i16:1310; AVX512VL: # %bb.0: # %entry1311; AVX512VL-NEXT: vpmovqw %ymm0, %xmm01312; AVX512VL-NEXT: vpmovqw %ymm1, %xmm11313; AVX512VL-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]1314; AVX512VL-NEXT: vzeroupper1315; AVX512VL-NEXT: retq1316;1317; AVX512BW-LABEL: trunc2x4i64_8i16:1318; AVX512BW: # %bb.0: # %entry1319; AVX512BW-NEXT: # kill: def $ymm1 killed $ymm1 def $zmm11320; AVX512BW-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm01321; AVX512BW-NEXT: vpmovqw %zmm0, %xmm01322; AVX512BW-NEXT: vpmovqw %zmm1, %xmm11323; AVX512BW-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]1324; AVX512BW-NEXT: vzeroupper1325; AVX512BW-NEXT: retq1326;1327; AVX512BWVL-LABEL: trunc2x4i64_8i16:1328; AVX512BWVL: # %bb.0: # %entry1329; AVX512BWVL-NEXT: vpmovqw %ymm0, %xmm01330; AVX512BWVL-NEXT: vpmovqw %ymm1, %xmm11331; AVX512BWVL-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]1332; AVX512BWVL-NEXT: vzeroupper1333; AVX512BWVL-NEXT: retq1334entry:1335 %0 = trunc <4 x i64> %a to <4 x i16>1336 %1 = trunc <4 x i64> %b to <4 x i16>1337 %2 = shufflevector <4 x i16> %0, <4 x i16> %1, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>1338 ret <8 x i16> %21339}1340 1341define <4 x i32> @trunc2x2i64_4i32(<2 x i64> %a, <2 x i64> %b) {1342; SSE-LABEL: trunc2x2i64_4i32:1343; SSE: # %bb.0: # %entry1344; SSE-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,2],xmm1[0,2]1345; SSE-NEXT: retq1346;1347; AVX-LABEL: trunc2x2i64_4i32:1348; AVX: # %bb.0: # %entry1349; AVX-NEXT: vshufps {{.*#+}} xmm0 = xmm0[0,2],xmm1[0,2]1350; AVX-NEXT: retq1351;1352; AVX512F-LABEL: trunc2x2i64_4i32:1353; AVX512F: # %bb.0: # %entry1354; AVX512F-NEXT: vshufps {{.*#+}} xmm0 = xmm0[0,2],xmm1[0,2]1355; AVX512F-NEXT: retq1356;1357; AVX512VL-LABEL: trunc2x2i64_4i32:1358; AVX512VL: # %bb.0: # %entry1359; AVX512VL-NEXT: # kill: def $xmm0 killed $xmm0 def $ymm01360; AVX512VL-NEXT: vinserti128 $1, %xmm1, %ymm0, %ymm01361; AVX512VL-NEXT: vpmovqd %ymm0, %xmm01362; AVX512VL-NEXT: vzeroupper1363; AVX512VL-NEXT: retq1364;1365; AVX512BW-LABEL: trunc2x2i64_4i32:1366; AVX512BW: # %bb.0: # %entry1367; AVX512BW-NEXT: vshufps {{.*#+}} xmm0 = xmm0[0,2],xmm1[0,2]1368; AVX512BW-NEXT: retq1369;1370; AVX512BWVL-LABEL: trunc2x2i64_4i32:1371; AVX512BWVL: # %bb.0: # %entry1372; AVX512BWVL-NEXT: # kill: def $xmm0 killed $xmm0 def $ymm01373; AVX512BWVL-NEXT: vinserti128 $1, %xmm1, %ymm0, %ymm01374; AVX512BWVL-NEXT: vpmovqd %ymm0, %xmm01375; AVX512BWVL-NEXT: vzeroupper1376; AVX512BWVL-NEXT: retq1377entry:1378 %0 = trunc <2 x i64> %a to <2 x i32>1379 %1 = trunc <2 x i64> %b to <2 x i32>1380 %2 = shufflevector <2 x i32> %0, <2 x i32> %1, <4 x i32> <i32 0, i32 1, i32 2, i32 3>1381 ret <4 x i32> %21382}1383 1384define i64 @trunc2i64_i64(<2 x i64> %inval) {1385; SSE-LABEL: trunc2i64_i64:1386; SSE: # %bb.0: # %entry1387; SSE-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]1388; SSE-NEXT: movq %xmm0, %rax1389; SSE-NEXT: retq1390;1391; AVX-LABEL: trunc2i64_i64:1392; AVX: # %bb.0: # %entry1393; AVX-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]1394; AVX-NEXT: vmovq %xmm0, %rax1395; AVX-NEXT: retq1396;1397; AVX512-LABEL: trunc2i64_i64:1398; AVX512: # %bb.0: # %entry1399; AVX512-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]1400; AVX512-NEXT: vmovq %xmm0, %rax1401; AVX512-NEXT: retq1402entry:1403 %0 = trunc <2 x i64> %inval to <2 x i32>1404 %1 = bitcast <2 x i32> %0 to i641405 ret i64 %11406}1407 1408define <8 x i16> @trunc2x4i32_8i16(<4 x i32> %a, <4 x i32> %b) {1409; SSE2-LABEL: trunc2x4i32_8i16:1410; SSE2: # %bb.0: # %entry1411; SSE2-NEXT: pslld $16, %xmm11412; SSE2-NEXT: psrad $16, %xmm11413; SSE2-NEXT: pslld $16, %xmm01414; SSE2-NEXT: psrad $16, %xmm01415; SSE2-NEXT: packssdw %xmm1, %xmm01416; SSE2-NEXT: retq1417;1418; SSSE3-LABEL: trunc2x4i32_8i16:1419; SSSE3: # %bb.0: # %entry1420; SSSE3-NEXT: movdqa {{.*#+}} xmm2 = [0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15]1421; SSSE3-NEXT: pshufb %xmm2, %xmm11422; SSSE3-NEXT: pshufb %xmm2, %xmm01423; SSSE3-NEXT: punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]1424; SSSE3-NEXT: retq1425;1426; SSE41-LABEL: trunc2x4i32_8i16:1427; SSE41: # %bb.0: # %entry1428; SSE41-NEXT: pxor %xmm2, %xmm21429; SSE41-NEXT: pblendw {{.*#+}} xmm1 = xmm1[0],xmm2[1],xmm1[2],xmm2[3],xmm1[4],xmm2[5],xmm1[6],xmm2[7]1430; SSE41-NEXT: pblendw {{.*#+}} xmm0 = xmm0[0],xmm2[1],xmm0[2],xmm2[3],xmm0[4],xmm2[5],xmm0[6],xmm2[7]1431; SSE41-NEXT: packusdw %xmm1, %xmm01432; SSE41-NEXT: retq1433;1434; AVX-LABEL: trunc2x4i32_8i16:1435; AVX: # %bb.0: # %entry1436; AVX-NEXT: vpxor %xmm2, %xmm2, %xmm21437; AVX-NEXT: vpblendw {{.*#+}} xmm1 = xmm1[0],xmm2[1],xmm1[2],xmm2[3],xmm1[4],xmm2[5],xmm1[6],xmm2[7]1438; AVX-NEXT: vpblendw {{.*#+}} xmm0 = xmm0[0],xmm2[1],xmm0[2],xmm2[3],xmm0[4],xmm2[5],xmm0[6],xmm2[7]1439; AVX-NEXT: vpackusdw %xmm1, %xmm0, %xmm01440; AVX-NEXT: retq1441;1442; AVX512F-LABEL: trunc2x4i32_8i16:1443; AVX512F: # %bb.0: # %entry1444; AVX512F-NEXT: # kill: def $xmm0 killed $xmm0 def $ymm01445; AVX512F-NEXT: vinserti128 $1, %xmm1, %ymm0, %ymm01446; AVX512F-NEXT: vpmovdw %zmm0, %ymm01447; AVX512F-NEXT: # kill: def $xmm0 killed $xmm0 killed $ymm01448; AVX512F-NEXT: vzeroupper1449; AVX512F-NEXT: retq1450;1451; AVX512VL-LABEL: trunc2x4i32_8i16:1452; AVX512VL: # %bb.0: # %entry1453; AVX512VL-NEXT: # kill: def $xmm0 killed $xmm0 def $ymm01454; AVX512VL-NEXT: vinserti128 $1, %xmm1, %ymm0, %ymm01455; AVX512VL-NEXT: vpmovdw %ymm0, %xmm01456; AVX512VL-NEXT: vzeroupper1457; AVX512VL-NEXT: retq1458;1459; AVX512BW-LABEL: trunc2x4i32_8i16:1460; AVX512BW: # %bb.0: # %entry1461; AVX512BW-NEXT: # kill: def $xmm0 killed $xmm0 def $ymm01462; AVX512BW-NEXT: vinserti128 $1, %xmm1, %ymm0, %ymm01463; AVX512BW-NEXT: vpmovdw %zmm0, %ymm01464; AVX512BW-NEXT: # kill: def $xmm0 killed $xmm0 killed $ymm01465; AVX512BW-NEXT: vzeroupper1466; AVX512BW-NEXT: retq1467;1468; AVX512BWVL-LABEL: trunc2x4i32_8i16:1469; AVX512BWVL: # %bb.0: # %entry1470; AVX512BWVL-NEXT: # kill: def $xmm0 killed $xmm0 def $ymm01471; AVX512BWVL-NEXT: vinserti128 $1, %xmm1, %ymm0, %ymm01472; AVX512BWVL-NEXT: vpmovdw %ymm0, %xmm01473; AVX512BWVL-NEXT: vzeroupper1474; AVX512BWVL-NEXT: retq1475entry:1476 %0 = trunc <4 x i32> %a to <4 x i16>1477 %1 = trunc <4 x i32> %b to <4 x i16>1478 %2 = shufflevector <4 x i16> %0, <4 x i16> %1, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>1479 ret <8 x i16> %21480}1481 1482; PR15524 http://llvm.org/bugs/show_bug.cgi?id=155241483define i64 @trunc4i32_i64(<4 x i32> %inval) {1484; SSE2-LABEL: trunc4i32_i64:1485; SSE2: # %bb.0: # %entry1486; SSE2-NEXT: pshuflw {{.*#+}} xmm0 = xmm0[0,2,2,3,4,5,6,7]1487; SSE2-NEXT: pshufhw {{.*#+}} xmm0 = xmm0[0,1,2,3,4,6,6,7]1488; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]1489; SSE2-NEXT: movq %xmm0, %rax1490; SSE2-NEXT: retq1491;1492; SSSE3-LABEL: trunc4i32_i64:1493; SSSE3: # %bb.0: # %entry1494; SSSE3-NEXT: pshufb {{.*#+}} xmm0 = xmm0[0,1,4,5,8,9,12,13,u,u,u,u,u,u,u,u]1495; SSSE3-NEXT: movq %xmm0, %rax1496; SSSE3-NEXT: retq1497;1498; SSE41-LABEL: trunc4i32_i64:1499; SSE41: # %bb.0: # %entry1500; SSE41-NEXT: pshufb {{.*#+}} xmm0 = xmm0[0,1,4,5,8,9,12,13,u,u,u,u,u,u,u,u]1501; SSE41-NEXT: movq %xmm0, %rax1502; SSE41-NEXT: retq1503;1504; AVX-LABEL: trunc4i32_i64:1505; AVX: # %bb.0: # %entry1506; AVX-NEXT: vpshufb {{.*#+}} xmm0 = xmm0[0,1,4,5,8,9,12,13,u,u,u,u,u,u,u,u]1507; AVX-NEXT: vmovq %xmm0, %rax1508; AVX-NEXT: retq1509;1510; AVX512F-LABEL: trunc4i32_i64:1511; AVX512F: # %bb.0: # %entry1512; AVX512F-NEXT: vpshufb {{.*#+}} xmm0 = xmm0[0,1,4,5,8,9,12,13,u,u,u,u,u,u,u,u]1513; AVX512F-NEXT: vmovq %xmm0, %rax1514; AVX512F-NEXT: retq1515;1516; AVX512VL-LABEL: trunc4i32_i64:1517; AVX512VL: # %bb.0: # %entry1518; AVX512VL-NEXT: vpmovdw %xmm0, %xmm01519; AVX512VL-NEXT: vmovq %xmm0, %rax1520; AVX512VL-NEXT: retq1521;1522; AVX512BW-LABEL: trunc4i32_i64:1523; AVX512BW: # %bb.0: # %entry1524; AVX512BW-NEXT: vpshufb {{.*#+}} xmm0 = xmm0[0,1,4,5,8,9,12,13,u,u,u,u,u,u,u,u]1525; AVX512BW-NEXT: vmovq %xmm0, %rax1526; AVX512BW-NEXT: retq1527;1528; AVX512BWVL-LABEL: trunc4i32_i64:1529; AVX512BWVL: # %bb.0: # %entry1530; AVX512BWVL-NEXT: vpmovdw %xmm0, %xmm01531; AVX512BWVL-NEXT: vmovq %xmm0, %rax1532; AVX512BWVL-NEXT: retq1533entry:1534 %0 = trunc <4 x i32> %inval to <4 x i16>1535 %1 = bitcast <4 x i16> %0 to i641536 ret i64 %11537}1538 1539define <32 x i8> @trunc2x16i16_32i8(<16 x i16> %a, <16 x i16> %b) {1540; SSE2-SSSE3-LABEL: trunc2x16i16_32i8:1541; SSE2-SSSE3: # %bb.0: # %entry1542; SSE2-SSSE3-NEXT: movdqa {{.*#+}} xmm4 = [255,0,255,0,255,0,255,0,255,0,255,0,255,0,255,0]1543; SSE2-SSSE3-NEXT: pand %xmm4, %xmm11544; SSE2-SSSE3-NEXT: pand %xmm4, %xmm01545; SSE2-SSSE3-NEXT: packuswb %xmm1, %xmm01546; SSE2-SSSE3-NEXT: pand %xmm4, %xmm31547; SSE2-SSSE3-NEXT: pand %xmm2, %xmm41548; SSE2-SSSE3-NEXT: packuswb %xmm3, %xmm41549; SSE2-SSSE3-NEXT: movdqa %xmm4, %xmm11550; SSE2-SSSE3-NEXT: retq1551;1552; SSE41-LABEL: trunc2x16i16_32i8:1553; SSE41: # %bb.0: # %entry1554; SSE41-NEXT: pmovzxbw {{.*#+}} xmm4 = [255,255,255,255,255,255,255,255]1555; SSE41-NEXT: pand %xmm4, %xmm11556; SSE41-NEXT: pand %xmm4, %xmm01557; SSE41-NEXT: packuswb %xmm1, %xmm01558; SSE41-NEXT: pand %xmm4, %xmm31559; SSE41-NEXT: pand %xmm2, %xmm41560; SSE41-NEXT: packuswb %xmm3, %xmm41561; SSE41-NEXT: movdqa %xmm4, %xmm11562; SSE41-NEXT: retq1563;1564; AVX1-LABEL: trunc2x16i16_32i8:1565; AVX1: # %bb.0: # %entry1566; AVX1-NEXT: vbroadcastss {{.*#+}} ymm2 = [255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255]1567; AVX1-NEXT: vandps %ymm2, %ymm0, %ymm01568; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm31569; AVX1-NEXT: vpackuswb %xmm3, %xmm0, %xmm01570; AVX1-NEXT: vandps %ymm2, %ymm1, %ymm11571; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm21572; AVX1-NEXT: vpackuswb %xmm2, %xmm1, %xmm11573; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm01574; AVX1-NEXT: retq1575;1576; AVX2-LABEL: trunc2x16i16_32i8:1577; AVX2: # %bb.0: # %entry1578; AVX2-NEXT: vpbroadcastw {{.*#+}} ymm2 = [255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255]1579; AVX2-NEXT: vpand %ymm2, %ymm0, %ymm01580; AVX2-NEXT: vpand %ymm2, %ymm1, %ymm11581; AVX2-NEXT: vpackuswb %ymm1, %ymm0, %ymm01582; AVX2-NEXT: vpermq {{.*#+}} ymm0 = ymm0[0,2,1,3]1583; AVX2-NEXT: retq1584;1585; AVX512F-LABEL: trunc2x16i16_32i8:1586; AVX512F: # %bb.0: # %entry1587; AVX512F-NEXT: vpmovzxwd {{.*#+}} zmm0 = ymm0[0],zero,ymm0[1],zero,ymm0[2],zero,ymm0[3],zero,ymm0[4],zero,ymm0[5],zero,ymm0[6],zero,ymm0[7],zero,ymm0[8],zero,ymm0[9],zero,ymm0[10],zero,ymm0[11],zero,ymm0[12],zero,ymm0[13],zero,ymm0[14],zero,ymm0[15],zero1588; AVX512F-NEXT: vpmovdb %zmm0, %xmm01589; AVX512F-NEXT: vpmovzxwd {{.*#+}} zmm1 = ymm1[0],zero,ymm1[1],zero,ymm1[2],zero,ymm1[3],zero,ymm1[4],zero,ymm1[5],zero,ymm1[6],zero,ymm1[7],zero,ymm1[8],zero,ymm1[9],zero,ymm1[10],zero,ymm1[11],zero,ymm1[12],zero,ymm1[13],zero,ymm1[14],zero,ymm1[15],zero1590; AVX512F-NEXT: vpmovdb %zmm1, %xmm11591; AVX512F-NEXT: vinserti128 $1, %xmm1, %ymm0, %ymm01592; AVX512F-NEXT: retq1593;1594; AVX512VL-LABEL: trunc2x16i16_32i8:1595; AVX512VL: # %bb.0: # %entry1596; AVX512VL-NEXT: vpmovzxwd {{.*#+}} zmm0 = ymm0[0],zero,ymm0[1],zero,ymm0[2],zero,ymm0[3],zero,ymm0[4],zero,ymm0[5],zero,ymm0[6],zero,ymm0[7],zero,ymm0[8],zero,ymm0[9],zero,ymm0[10],zero,ymm0[11],zero,ymm0[12],zero,ymm0[13],zero,ymm0[14],zero,ymm0[15],zero1597; AVX512VL-NEXT: vpmovdb %zmm0, %xmm01598; AVX512VL-NEXT: vpmovzxwd {{.*#+}} zmm1 = ymm1[0],zero,ymm1[1],zero,ymm1[2],zero,ymm1[3],zero,ymm1[4],zero,ymm1[5],zero,ymm1[6],zero,ymm1[7],zero,ymm1[8],zero,ymm1[9],zero,ymm1[10],zero,ymm1[11],zero,ymm1[12],zero,ymm1[13],zero,ymm1[14],zero,ymm1[15],zero1599; AVX512VL-NEXT: vpmovdb %zmm1, %xmm11600; AVX512VL-NEXT: vinserti128 $1, %xmm1, %ymm0, %ymm01601; AVX512VL-NEXT: retq1602;1603; AVX512BW-LABEL: trunc2x16i16_32i8:1604; AVX512BW: # %bb.0: # %entry1605; AVX512BW-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm01606; AVX512BW-NEXT: vinserti64x4 $1, %ymm1, %zmm0, %zmm01607; AVX512BW-NEXT: vpmovwb %zmm0, %ymm01608; AVX512BW-NEXT: retq1609;1610; AVX512BWVL-LABEL: trunc2x16i16_32i8:1611; AVX512BWVL: # %bb.0: # %entry1612; AVX512BWVL-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm01613; AVX512BWVL-NEXT: vinserti64x4 $1, %ymm1, %zmm0, %zmm01614; AVX512BWVL-NEXT: vpmovwb %zmm0, %ymm01615; AVX512BWVL-NEXT: retq1616entry:1617 %0 = trunc <16 x i16> %a to <16 x i8>1618 %1 = trunc <16 x i16> %b to <16 x i8>1619 %2 = shufflevector <16 x i8> %0, <16 x i8> %1, <32 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15, i32 16, i32 17, i32 18, i32 19, i32 20, i32 21, i32 22, i32 23, i32 24, i32 25, i32 26, i32 27, i32 28, i32 29, i32 30, i32 31>1620 ret <32 x i8> %21621}1622 1623define <16 x i8> @trunc2x8i16_16i8(<8 x i16> %a, <8 x i16> %b) {1624; SSE2-SSSE3-LABEL: trunc2x8i16_16i8:1625; SSE2-SSSE3: # %bb.0: # %entry1626; SSE2-SSSE3-NEXT: movdqa {{.*#+}} xmm2 = [255,255,255,255,255,255,255,255]1627; SSE2-SSSE3-NEXT: pand %xmm2, %xmm11628; SSE2-SSSE3-NEXT: pand %xmm2, %xmm01629; SSE2-SSSE3-NEXT: packuswb %xmm1, %xmm01630; SSE2-SSSE3-NEXT: retq1631;1632; SSE41-LABEL: trunc2x8i16_16i8:1633; SSE41: # %bb.0: # %entry1634; SSE41-NEXT: pmovzxbw {{.*#+}} xmm2 = [255,255,255,255,255,255,255,255]1635; SSE41-NEXT: pand %xmm2, %xmm11636; SSE41-NEXT: pand %xmm2, %xmm01637; SSE41-NEXT: packuswb %xmm1, %xmm01638; SSE41-NEXT: retq1639;1640; AVX1-LABEL: trunc2x8i16_16i8:1641; AVX1: # %bb.0: # %entry1642; AVX1-NEXT: vbroadcastss {{.*#+}} xmm2 = [255,255,255,255,255,255,255,255]1643; AVX1-NEXT: vpand %xmm2, %xmm1, %xmm11644; AVX1-NEXT: vpand %xmm2, %xmm0, %xmm01645; AVX1-NEXT: vpackuswb %xmm1, %xmm0, %xmm01646; AVX1-NEXT: retq1647;1648; AVX2-LABEL: trunc2x8i16_16i8:1649; AVX2: # %bb.0: # %entry1650; AVX2-NEXT: vpbroadcastw {{.*#+}} xmm2 = [255,255,255,255,255,255,255,255]1651; AVX2-NEXT: vpand %xmm2, %xmm1, %xmm11652; AVX2-NEXT: vpand %xmm2, %xmm0, %xmm01653; AVX2-NEXT: vpackuswb %xmm1, %xmm0, %xmm01654; AVX2-NEXT: retq1655;1656; AVX512F-LABEL: trunc2x8i16_16i8:1657; AVX512F: # %bb.0: # %entry1658; AVX512F-NEXT: vpbroadcastw {{.*#+}} xmm2 = [255,255,255,255,255,255,255,255]1659; AVX512F-NEXT: vpand %xmm2, %xmm1, %xmm11660; AVX512F-NEXT: vpand %xmm2, %xmm0, %xmm01661; AVX512F-NEXT: vpackuswb %xmm1, %xmm0, %xmm01662; AVX512F-NEXT: retq1663;1664; AVX512VL-LABEL: trunc2x8i16_16i8:1665; AVX512VL: # %bb.0: # %entry1666; AVX512VL-NEXT: vpbroadcastd {{.*#+}} xmm2 = [255,255,255,255,255,255,255,255]1667; AVX512VL-NEXT: vpand %xmm2, %xmm1, %xmm11668; AVX512VL-NEXT: vpand %xmm2, %xmm0, %xmm01669; AVX512VL-NEXT: vpackuswb %xmm1, %xmm0, %xmm01670; AVX512VL-NEXT: retq1671;1672; AVX512BW-LABEL: trunc2x8i16_16i8:1673; AVX512BW: # %bb.0: # %entry1674; AVX512BW-NEXT: # kill: def $xmm0 killed $xmm0 def $ymm01675; AVX512BW-NEXT: vinserti128 $1, %xmm1, %ymm0, %ymm01676; AVX512BW-NEXT: vpmovwb %zmm0, %ymm01677; AVX512BW-NEXT: # kill: def $xmm0 killed $xmm0 killed $ymm01678; AVX512BW-NEXT: vzeroupper1679; AVX512BW-NEXT: retq1680;1681; AVX512BWVL-LABEL: trunc2x8i16_16i8:1682; AVX512BWVL: # %bb.0: # %entry1683; AVX512BWVL-NEXT: # kill: def $xmm0 killed $xmm0 def $ymm01684; AVX512BWVL-NEXT: vinserti128 $1, %xmm1, %ymm0, %ymm01685; AVX512BWVL-NEXT: vpmovwb %ymm0, %xmm01686; AVX512BWVL-NEXT: vzeroupper1687; AVX512BWVL-NEXT: retq1688entry:1689 %0 = trunc <8 x i16> %a to <8 x i8>1690 %1 = trunc <8 x i16> %b to <8 x i8>1691 %2 = shufflevector <8 x i8> %0, <8 x i8> %1, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15>1692 ret <16 x i8> %21693}1694 1695; PR15524 http://llvm.org/bugs/show_bug.cgi?id=155241696define i64 @trunc8i16_i64(<8 x i16> %inval) {1697; SSE2-LABEL: trunc8i16_i64:1698; SSE2: # %bb.0: # %entry1699; SSE2-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm01700; SSE2-NEXT: packuswb %xmm0, %xmm01701; SSE2-NEXT: movq %xmm0, %rax1702; SSE2-NEXT: retq1703;1704; SSSE3-LABEL: trunc8i16_i64:1705; SSSE3: # %bb.0: # %entry1706; SSSE3-NEXT: pshufb {{.*#+}} xmm0 = xmm0[0,2,4,6,8,10,12,14,u,u,u,u,u,u,u,u]1707; SSSE3-NEXT: movq %xmm0, %rax1708; SSSE3-NEXT: retq1709;1710; SSE41-LABEL: trunc8i16_i64:1711; SSE41: # %bb.0: # %entry1712; SSE41-NEXT: pshufb {{.*#+}} xmm0 = xmm0[0,2,4,6,8,10,12,14,u,u,u,u,u,u,u,u]1713; SSE41-NEXT: movq %xmm0, %rax1714; SSE41-NEXT: retq1715;1716; AVX-LABEL: trunc8i16_i64:1717; AVX: # %bb.0: # %entry1718; AVX-NEXT: vpshufb {{.*#+}} xmm0 = xmm0[0,2,4,6,8,10,12,14,u,u,u,u,u,u,u,u]1719; AVX-NEXT: vmovq %xmm0, %rax1720; AVX-NEXT: retq1721;1722; AVX512F-LABEL: trunc8i16_i64:1723; AVX512F: # %bb.0: # %entry1724; AVX512F-NEXT: vpshufb {{.*#+}} xmm0 = xmm0[0,2,4,6,8,10,12,14,u,u,u,u,u,u,u,u]1725; AVX512F-NEXT: vmovq %xmm0, %rax1726; AVX512F-NEXT: retq1727;1728; AVX512VL-LABEL: trunc8i16_i64:1729; AVX512VL: # %bb.0: # %entry1730; AVX512VL-NEXT: vpshufb {{.*#+}} xmm0 = xmm0[0,2,4,6,8,10,12,14,u,u,u,u,u,u,u,u]1731; AVX512VL-NEXT: vmovq %xmm0, %rax1732; AVX512VL-NEXT: retq1733;1734; AVX512BW-LABEL: trunc8i16_i64:1735; AVX512BW: # %bb.0: # %entry1736; AVX512BW-NEXT: vpshufb {{.*#+}} xmm0 = xmm0[0,2,4,6,8,10,12,14,u,u,u,u,u,u,u,u]1737; AVX512BW-NEXT: vmovq %xmm0, %rax1738; AVX512BW-NEXT: retq1739;1740; AVX512BWVL-LABEL: trunc8i16_i64:1741; AVX512BWVL: # %bb.0: # %entry1742; AVX512BWVL-NEXT: vpmovwb %xmm0, %xmm01743; AVX512BWVL-NEXT: vmovq %xmm0, %rax1744; AVX512BWVL-NEXT: retq1745entry:1746 %0 = trunc <8 x i16> %inval to <8 x i8>1747 %1 = bitcast <8 x i8> %0 to i641748 ret i64 %11749}1750 1751define <16 x i8> @trunc16i64_16i8_const() {1752; SSE-LABEL: trunc16i64_16i8_const:1753; SSE: # %bb.0: # %entry1754; SSE-NEXT: xorps %xmm0, %xmm01755; SSE-NEXT: retq1756;1757; AVX-LABEL: trunc16i64_16i8_const:1758; AVX: # %bb.0: # %entry1759; AVX-NEXT: vxorps %xmm0, %xmm0, %xmm01760; AVX-NEXT: retq1761;1762; AVX512-LABEL: trunc16i64_16i8_const:1763; AVX512: # %bb.0: # %entry1764; AVX512-NEXT: vxorps %xmm0, %xmm0, %xmm01765; AVX512-NEXT: retq1766 1767entry:1768 %0 = trunc <16 x i64> zeroinitializer to <16 x i8>1769 %1 = shufflevector <16 x i8> %0, <16 x i8> %0, <16 x i32> <i32 28, i32 30, i32 0, i32 2, i32 4, i32 6, i32 8, i32 10, i32 undef, i32 14, i32 16, i32 18, i32 20, i32 22, i32 24, i32 26>1770 ret <16 x i8> %11771}1772 1773define <8 x i16> @PR32160(<8 x i32> %x) {1774; SSE-LABEL: PR32160:1775; SSE: # %bb.0:1776; SSE-NEXT: pshufhw {{.*#+}} xmm0 = xmm0[0,1,2,3,4,4,4,4]1777; SSE-NEXT: pshufd {{.*#+}} xmm0 = xmm0[2,3,2,3]1778; SSE-NEXT: retq1779;1780; AVX-LABEL: PR32160:1781; AVX: # %bb.0:1782; AVX-NEXT: vpshufb {{.*#+}} xmm0 = xmm0[8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9]1783; AVX-NEXT: vzeroupper1784; AVX-NEXT: retq1785;1786; AVX512F-LABEL: PR32160:1787; AVX512F: # %bb.0:1788; AVX512F-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm01789; AVX512F-NEXT: vpmovdw %zmm0, %ymm01790; AVX512F-NEXT: vpshuflw {{.*#+}} xmm0 = xmm0[2,2,2,2,4,5,6,7]1791; AVX512F-NEXT: vpbroadcastq %xmm0, %xmm01792; AVX512F-NEXT: vzeroupper1793; AVX512F-NEXT: retq1794;1795; AVX512VL-LABEL: PR32160:1796; AVX512VL: # %bb.0:1797; AVX512VL-NEXT: vpmovdw %ymm0, %xmm01798; AVX512VL-NEXT: vpshufb {{.*#+}} xmm0 = xmm0[4,5,4,5,4,5,4,5,4,5,4,5,4,5,4,5]1799; AVX512VL-NEXT: vzeroupper1800; AVX512VL-NEXT: retq1801;1802; AVX512BW-LABEL: PR32160:1803; AVX512BW: # %bb.0:1804; AVX512BW-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm01805; AVX512BW-NEXT: vpmovdw %zmm0, %ymm01806; AVX512BW-NEXT: vpshufb {{.*#+}} xmm0 = xmm0[4,5,4,5,4,5,4,5,4,5,4,5,4,5,4,5]1807; AVX512BW-NEXT: vzeroupper1808; AVX512BW-NEXT: retq1809;1810; AVX512BWVL-LABEL: PR32160:1811; AVX512BWVL: # %bb.0:1812; AVX512BWVL-NEXT: vpmovdw %ymm0, %xmm01813; AVX512BWVL-NEXT: vpshufb {{.*#+}} xmm0 = xmm0[4,5,4,5,4,5,4,5,4,5,4,5,4,5,4,5]1814; AVX512BWVL-NEXT: vzeroupper1815; AVX512BWVL-NEXT: retq1816 %shuf = trunc <8 x i32> %x to <8 x i16>1817 %trunc = shufflevector <8 x i16> %shuf, <8 x i16> undef, <8 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>1818 ret <8 x i16> %trunc1819}1820 1821define void @PR34773(ptr %a0, ptr %a1) {1822; SSE-LABEL: PR34773:1823; SSE: # %bb.0:1824; SSE-NEXT: movdqu (%rdi), %xmm01825; SSE-NEXT: movdqu 16(%rdi), %xmm11826; SSE-NEXT: movdqu 32(%rdi), %xmm21827; SSE-NEXT: movdqu 48(%rdi), %xmm31828; SSE-NEXT: psrlw $8, %xmm11829; SSE-NEXT: psrlw $8, %xmm01830; SSE-NEXT: packuswb %xmm1, %xmm01831; SSE-NEXT: psrlw $8, %xmm31832; SSE-NEXT: psrlw $8, %xmm21833; SSE-NEXT: packuswb %xmm3, %xmm21834; SSE-NEXT: movdqu %xmm0, (%rsi)1835; SSE-NEXT: movdqu %xmm2, 16(%rsi)1836; SSE-NEXT: retq1837;1838; AVX1-LABEL: PR34773:1839; AVX1: # %bb.0:1840; AVX1-NEXT: vmovdqu (%rdi), %xmm01841; AVX1-NEXT: vmovdqu 16(%rdi), %xmm11842; AVX1-NEXT: vmovdqu 32(%rdi), %xmm21843; AVX1-NEXT: vmovdqu 48(%rdi), %xmm31844; AVX1-NEXT: vpsrlw $8, %xmm1, %xmm11845; AVX1-NEXT: vpsrlw $8, %xmm0, %xmm01846; AVX1-NEXT: vpackuswb %xmm1, %xmm0, %xmm01847; AVX1-NEXT: vpsrlw $8, %xmm3, %xmm11848; AVX1-NEXT: vpsrlw $8, %xmm2, %xmm21849; AVX1-NEXT: vpackuswb %xmm1, %xmm2, %xmm11850; AVX1-NEXT: vmovdqu %xmm0, (%rsi)1851; AVX1-NEXT: vmovdqu %xmm1, 16(%rsi)1852; AVX1-NEXT: retq1853;1854; AVX2-LABEL: PR34773:1855; AVX2: # %bb.0:1856; AVX2-NEXT: vmovdqu (%rdi), %ymm01857; AVX2-NEXT: vmovdqu 32(%rdi), %ymm11858; AVX2-NEXT: vpsrlw $8, %ymm0, %ymm01859; AVX2-NEXT: vpsrlw $8, %ymm1, %ymm11860; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm21861; AVX2-NEXT: vpackuswb %xmm2, %xmm0, %xmm01862; AVX2-NEXT: vextracti128 $1, %ymm1, %xmm21863; AVX2-NEXT: vpackuswb %xmm2, %xmm1, %xmm11864; AVX2-NEXT: vmovdqu %xmm0, (%rsi)1865; AVX2-NEXT: vmovdqu %xmm1, 16(%rsi)1866; AVX2-NEXT: vzeroupper1867; AVX2-NEXT: retq1868;1869; AVX512F-LABEL: PR34773:1870; AVX512F: # %bb.0:1871; AVX512F-NEXT: vmovdqu (%rdi), %ymm01872; AVX512F-NEXT: vmovdqu 32(%rdi), %ymm11873; AVX512F-NEXT: vpsrlw $8, %ymm0, %ymm01874; AVX512F-NEXT: vpsrlw $8, %ymm1, %ymm11875; AVX512F-NEXT: vpmovzxwd {{.*#+}} zmm0 = ymm0[0],zero,ymm0[1],zero,ymm0[2],zero,ymm0[3],zero,ymm0[4],zero,ymm0[5],zero,ymm0[6],zero,ymm0[7],zero,ymm0[8],zero,ymm0[9],zero,ymm0[10],zero,ymm0[11],zero,ymm0[12],zero,ymm0[13],zero,ymm0[14],zero,ymm0[15],zero1876; AVX512F-NEXT: vpmovdb %zmm0, (%rsi)1877; AVX512F-NEXT: vpmovzxwd {{.*#+}} zmm0 = ymm1[0],zero,ymm1[1],zero,ymm1[2],zero,ymm1[3],zero,ymm1[4],zero,ymm1[5],zero,ymm1[6],zero,ymm1[7],zero,ymm1[8],zero,ymm1[9],zero,ymm1[10],zero,ymm1[11],zero,ymm1[12],zero,ymm1[13],zero,ymm1[14],zero,ymm1[15],zero1878; AVX512F-NEXT: vpmovdb %zmm0, 16(%rsi)1879; AVX512F-NEXT: vzeroupper1880; AVX512F-NEXT: retq1881;1882; AVX512VL-LABEL: PR34773:1883; AVX512VL: # %bb.0:1884; AVX512VL-NEXT: vmovdqu (%rdi), %ymm01885; AVX512VL-NEXT: vmovdqu 32(%rdi), %ymm11886; AVX512VL-NEXT: vpsrlw $8, %ymm0, %ymm01887; AVX512VL-NEXT: vpsrlw $8, %ymm1, %ymm11888; AVX512VL-NEXT: vpmovzxwd {{.*#+}} zmm0 = ymm0[0],zero,ymm0[1],zero,ymm0[2],zero,ymm0[3],zero,ymm0[4],zero,ymm0[5],zero,ymm0[6],zero,ymm0[7],zero,ymm0[8],zero,ymm0[9],zero,ymm0[10],zero,ymm0[11],zero,ymm0[12],zero,ymm0[13],zero,ymm0[14],zero,ymm0[15],zero1889; AVX512VL-NEXT: vpmovdb %zmm0, (%rsi)1890; AVX512VL-NEXT: vpmovzxwd {{.*#+}} zmm0 = ymm1[0],zero,ymm1[1],zero,ymm1[2],zero,ymm1[3],zero,ymm1[4],zero,ymm1[5],zero,ymm1[6],zero,ymm1[7],zero,ymm1[8],zero,ymm1[9],zero,ymm1[10],zero,ymm1[11],zero,ymm1[12],zero,ymm1[13],zero,ymm1[14],zero,ymm1[15],zero1891; AVX512VL-NEXT: vpmovdb %zmm0, 16(%rsi)1892; AVX512VL-NEXT: vzeroupper1893; AVX512VL-NEXT: retq1894;1895; AVX512BW-LABEL: PR34773:1896; AVX512BW: # %bb.0:1897; AVX512BW-NEXT: vmovdqu (%rdi), %ymm01898; AVX512BW-NEXT: vmovdqu 32(%rdi), %ymm11899; AVX512BW-NEXT: vpsrlw $8, %ymm0, %ymm01900; AVX512BW-NEXT: vpsrlw $8, %ymm1, %ymm11901; AVX512BW-NEXT: vpmovwb %zmm0, %ymm01902; AVX512BW-NEXT: vpmovwb %zmm1, %ymm11903; AVX512BW-NEXT: vmovdqu %xmm0, (%rsi)1904; AVX512BW-NEXT: vmovdqu %xmm1, 16(%rsi)1905; AVX512BW-NEXT: vzeroupper1906; AVX512BW-NEXT: retq1907;1908; AVX512BWVL-LABEL: PR34773:1909; AVX512BWVL: # %bb.0:1910; AVX512BWVL-NEXT: vpsrlw $8, (%rdi), %ymm01911; AVX512BWVL-NEXT: vpsrlw $8, 32(%rdi), %ymm11912; AVX512BWVL-NEXT: vpmovwb %ymm0, (%rsi)1913; AVX512BWVL-NEXT: vpmovwb %ymm1, 16(%rsi)1914; AVX512BWVL-NEXT: vzeroupper1915; AVX512BWVL-NEXT: retq1916 %1 = getelementptr i16, ptr %a0, i64 161917 %2 = getelementptr i8, ptr %a1, i64 161918 %3 = load <16 x i16>, ptr %a0, align 21919 %4 = load <16 x i16>, ptr %1, align 21920 %5 = lshr <16 x i16> %3, <i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8>1921 %6 = lshr <16 x i16> %4, <i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8>1922 %7 = trunc <16 x i16> %5 to <16 x i8>1923 %8 = trunc <16 x i16> %6 to <16 x i8>1924 store <16 x i8> %7, ptr %a1, align 11925 store <16 x i8> %8, ptr %2, align 11926 ret void1927}1928 1929define i16 @PR66194(i8 %q) {1930; SSE2-SSSE3-LABEL: PR66194:1931; SSE2-SSSE3: # %bb.0: # %entry1932; SSE2-SSSE3-NEXT: xorl %eax, %eax1933; SSE2-SSSE3-NEXT: xorl %ecx, %ecx1934; SSE2-SSSE3-NEXT: testb %dil, %dil1935; SSE2-SSSE3-NEXT: setne %al1936; SSE2-SSSE3-NEXT: sete %cl1937; SSE2-SSSE3-NEXT: movl %ecx, %edx1938; SSE2-SSSE3-NEXT: shll $16, %edx1939; SSE2-SSSE3-NEXT: orl %eax, %edx1940; SSE2-SSSE3-NEXT: movd %edx, %xmm01941; SSE2-SSSE3-NEXT: pinsrw $2, %eax, %xmm01942; SSE2-SSSE3-NEXT: pinsrw $3, %eax, %xmm01943; SSE2-SSSE3-NEXT: pinsrw $4, %ecx, %xmm01944; SSE2-SSSE3-NEXT: pinsrw $5, %eax, %xmm01945; SSE2-SSSE3-NEXT: pinsrw $6, %eax, %xmm01946; SSE2-SSSE3-NEXT: pinsrw $7, %ecx, %xmm01947; SSE2-SSSE3-NEXT: pcmpeqd %xmm1, %xmm11948; SSE2-SSSE3-NEXT: psubw %xmm1, %xmm01949; SSE2-SSSE3-NEXT: packuswb %xmm0, %xmm01950; SSE2-SSSE3-NEXT: pxor %xmm1, %xmm11951; SSE2-SSSE3-NEXT: psadbw %xmm0, %xmm11952; SSE2-SSSE3-NEXT: movd %xmm1, %eax1953; SSE2-SSSE3-NEXT: # kill: def $ax killed $ax killed $eax1954; SSE2-SSSE3-NEXT: retq1955;1956; SSE41-LABEL: PR66194:1957; SSE41: # %bb.0: # %entry1958; SSE41-NEXT: xorl %eax, %eax1959; SSE41-NEXT: xorl %ecx, %ecx1960; SSE41-NEXT: testb %dil, %dil1961; SSE41-NEXT: setne %al1962; SSE41-NEXT: sete %cl1963; SSE41-NEXT: movd %eax, %xmm01964; SSE41-NEXT: pinsrb $2, %ecx, %xmm01965; SSE41-NEXT: pinsrb $4, %eax, %xmm01966; SSE41-NEXT: pinsrb $6, %eax, %xmm01967; SSE41-NEXT: pinsrb $8, %ecx, %xmm01968; SSE41-NEXT: pinsrb $10, %eax, %xmm01969; SSE41-NEXT: pinsrb $12, %eax, %xmm01970; SSE41-NEXT: pinsrb $14, %ecx, %xmm01971; SSE41-NEXT: pcmpeqd %xmm1, %xmm11972; SSE41-NEXT: psubw %xmm1, %xmm01973; SSE41-NEXT: packuswb %xmm0, %xmm01974; SSE41-NEXT: pxor %xmm1, %xmm11975; SSE41-NEXT: psadbw %xmm0, %xmm11976; SSE41-NEXT: movd %xmm1, %eax1977; SSE41-NEXT: # kill: def $ax killed $ax killed $eax1978; SSE41-NEXT: retq1979;1980; AVX1-LABEL: PR66194:1981; AVX1: # %bb.0: # %entry1982; AVX1-NEXT: xorl %eax, %eax1983; AVX1-NEXT: testb %dil, %dil1984; AVX1-NEXT: setne %al1985; AVX1-NEXT: sete %cl1986; AVX1-NEXT: vmovd %eax, %xmm01987; AVX1-NEXT: vpinsrb $2, %ecx, %xmm0, %xmm01988; AVX1-NEXT: vpinsrb $4, %eax, %xmm0, %xmm01989; AVX1-NEXT: vpinsrb $6, %eax, %xmm0, %xmm01990; AVX1-NEXT: vpinsrb $8, %ecx, %xmm0, %xmm01991; AVX1-NEXT: vpinsrb $10, %eax, %xmm0, %xmm01992; AVX1-NEXT: vpinsrb $12, %eax, %xmm0, %xmm01993; AVX1-NEXT: vpinsrb $14, %ecx, %xmm0, %xmm01994; AVX1-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm11995; AVX1-NEXT: vpsubw %xmm1, %xmm0, %xmm01996; AVX1-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]1997; AVX1-NEXT: vpaddw %xmm1, %xmm0, %xmm01998; AVX1-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]1999; AVX1-NEXT: vpaddw %xmm1, %xmm0, %xmm02000; AVX1-NEXT: vpsrld $16, %xmm0, %xmm12001; AVX1-NEXT: vpaddw %xmm1, %xmm0, %xmm02002; AVX1-NEXT: vmovd %xmm0, %eax2003; AVX1-NEXT: # kill: def $ax killed $ax killed $eax2004; AVX1-NEXT: retq2005;2006; AVX2-LABEL: PR66194:2007; AVX2: # %bb.0: # %entry2008; AVX2-NEXT: xorl %eax, %eax2009; AVX2-NEXT: xorl %ecx, %ecx2010; AVX2-NEXT: testb %dil, %dil2011; AVX2-NEXT: setne %al2012; AVX2-NEXT: sete %cl2013; AVX2-NEXT: vmovd %eax, %xmm02014; AVX2-NEXT: vpinsrw $1, %ecx, %xmm0, %xmm02015; AVX2-NEXT: vpinsrw $2, %eax, %xmm0, %xmm02016; AVX2-NEXT: vpinsrw $3, %eax, %xmm0, %xmm02017; AVX2-NEXT: vpinsrw $4, %ecx, %xmm0, %xmm02018; AVX2-NEXT: vpinsrw $5, %eax, %xmm0, %xmm02019; AVX2-NEXT: vpinsrw $6, %eax, %xmm0, %xmm02020; AVX2-NEXT: vpinsrw $7, %ecx, %xmm0, %xmm02021; AVX2-NEXT: vpaddw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm02022; AVX2-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]2023; AVX2-NEXT: vpaddw %xmm1, %xmm0, %xmm02024; AVX2-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]2025; AVX2-NEXT: vpaddw %xmm1, %xmm0, %xmm02026; AVX2-NEXT: vpsrld $16, %xmm0, %xmm12027; AVX2-NEXT: vpaddw %xmm1, %xmm0, %xmm02028; AVX2-NEXT: vmovd %xmm0, %eax2029; AVX2-NEXT: # kill: def $ax killed $ax killed $eax2030; AVX2-NEXT: retq2031;2032; AVX512-LABEL: PR66194:2033; AVX512: # %bb.0: # %entry2034; AVX512-NEXT: xorl %eax, %eax2035; AVX512-NEXT: xorl %ecx, %ecx2036; AVX512-NEXT: testb %dil, %dil2037; AVX512-NEXT: setne %al2038; AVX512-NEXT: sete %cl2039; AVX512-NEXT: vmovd %eax, %xmm02040; AVX512-NEXT: vpinsrw $1, %ecx, %xmm0, %xmm02041; AVX512-NEXT: vpinsrw $2, %eax, %xmm0, %xmm02042; AVX512-NEXT: vpinsrw $3, %eax, %xmm0, %xmm02043; AVX512-NEXT: vpinsrw $4, %ecx, %xmm0, %xmm02044; AVX512-NEXT: vpinsrw $5, %eax, %xmm0, %xmm02045; AVX512-NEXT: vpinsrw $6, %eax, %xmm0, %xmm02046; AVX512-NEXT: vpinsrw $7, %ecx, %xmm0, %xmm02047; AVX512-NEXT: vpaddw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm02048; AVX512-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]2049; AVX512-NEXT: vpaddw %xmm1, %xmm0, %xmm02050; AVX512-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]2051; AVX512-NEXT: vpaddw %xmm1, %xmm0, %xmm02052; AVX512-NEXT: vpsrld $16, %xmm0, %xmm12053; AVX512-NEXT: vpaddw %xmm1, %xmm0, %xmm02054; AVX512-NEXT: vmovd %xmm0, %eax2055; AVX512-NEXT: # kill: def $ax killed $ax killed $eax2056; AVX512-NEXT: retq2057entry:2058 %cmp12.i.13 = icmp ne i8 %q, 02059 %cond.i15.13 = zext i1 %cmp12.i.13 to i162060 %tobool.not.i.13 = icmp eq i8 %q, 02061 %cond18.i.13 = zext i1 %tobool.not.i.13 to i162062 %0 = insertelement <16 x i16> <i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1>, i16 %cond.i15.13, i64 82063 %1 = insertelement <16 x i16> %0, i16 %cond18.i.13, i64 92064 %2 = insertelement <16 x i16> %1, i16 %cond.i15.13, i64 102065 %3 = insertelement <16 x i16> %2, i16 %cond.i15.13, i64 112066 %4 = insertelement <16 x i16> %3, i16 %cond18.i.13, i64 122067 %5 = insertelement <16 x i16> %4, i16 %cond.i15.13, i64 132068 %6 = insertelement <16 x i16> %5, i16 %cond.i15.13, i64 142069 %7 = insertelement <16 x i16> %6, i16 %cond18.i.13, i64 152070 %8 = tail call i16 @llvm.vector.reduce.add.v16i16(<16 x i16> %7)2071 ret i16 %82072}2073declare i16 @llvm.vector.reduce.add.v16i16(<16 x i16>)2074 2075; Store merging must not infinitely fight store splitting.2076 2077define void @store_merge_split(<8 x i32> %w1, <8 x i32> %w2, i64 %idx, ptr %p) align 2 {2078; SSE2-LABEL: store_merge_split:2079; SSE2: # %bb.0:2080; SSE2-NEXT: pslld $16, %xmm12081; SSE2-NEXT: psrad $16, %xmm12082; SSE2-NEXT: pslld $16, %xmm02083; SSE2-NEXT: psrad $16, %xmm02084; SSE2-NEXT: packssdw %xmm1, %xmm02085; SSE2-NEXT: pslld $16, %xmm32086; SSE2-NEXT: psrad $16, %xmm32087; SSE2-NEXT: pslld $16, %xmm22088; SSE2-NEXT: psrad $16, %xmm22089; SSE2-NEXT: packssdw %xmm3, %xmm22090; SSE2-NEXT: shlq $4, %rdi2091; SSE2-NEXT: movdqu %xmm0, (%rsi,%rdi)2092; SSE2-NEXT: movdqu %xmm2, 16(%rsi,%rdi)2093; SSE2-NEXT: retq2094;2095; SSSE3-LABEL: store_merge_split:2096; SSSE3: # %bb.0:2097; SSSE3-NEXT: movdqa {{.*#+}} xmm4 = [0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15]2098; SSSE3-NEXT: pshufb %xmm4, %xmm12099; SSSE3-NEXT: pshufb %xmm4, %xmm02100; SSSE3-NEXT: punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]2101; SSSE3-NEXT: pshufb %xmm4, %xmm32102; SSSE3-NEXT: pshufb %xmm4, %xmm22103; SSSE3-NEXT: punpcklqdq {{.*#+}} xmm2 = xmm2[0],xmm3[0]2104; SSSE3-NEXT: shlq $4, %rdi2105; SSSE3-NEXT: movdqu %xmm0, (%rsi,%rdi)2106; SSSE3-NEXT: movdqu %xmm2, 16(%rsi,%rdi)2107; SSSE3-NEXT: retq2108;2109; SSE41-LABEL: store_merge_split:2110; SSE41: # %bb.0:2111; SSE41-NEXT: pxor %xmm4, %xmm42112; SSE41-NEXT: pblendw {{.*#+}} xmm1 = xmm1[0],xmm4[1],xmm1[2],xmm4[3],xmm1[4],xmm4[5],xmm1[6],xmm4[7]2113; SSE41-NEXT: pblendw {{.*#+}} xmm0 = xmm0[0],xmm4[1],xmm0[2],xmm4[3],xmm0[4],xmm4[5],xmm0[6],xmm4[7]2114; SSE41-NEXT: packusdw %xmm1, %xmm02115; SSE41-NEXT: pblendw {{.*#+}} xmm3 = xmm3[0],xmm4[1],xmm3[2],xmm4[3],xmm3[4],xmm4[5],xmm3[6],xmm4[7]2116; SSE41-NEXT: pblendw {{.*#+}} xmm2 = xmm2[0],xmm4[1],xmm2[2],xmm4[3],xmm2[4],xmm4[5],xmm2[6],xmm4[7]2117; SSE41-NEXT: packusdw %xmm3, %xmm22118; SSE41-NEXT: shlq $4, %rdi2119; SSE41-NEXT: movdqu %xmm0, (%rsi,%rdi)2120; SSE41-NEXT: movdqu %xmm2, 16(%rsi,%rdi)2121; SSE41-NEXT: retq2122;2123; AVX1-LABEL: store_merge_split:2124; AVX1: # %bb.0:2125; AVX1-NEXT: vbroadcastss {{.*#+}} ymm2 = [65535,65535,65535,65535,65535,65535,65535,65535]2126; AVX1-NEXT: vandps %ymm2, %ymm0, %ymm02127; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm32128; AVX1-NEXT: vpackusdw %xmm3, %xmm0, %xmm02129; AVX1-NEXT: vandps %ymm2, %ymm1, %ymm12130; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm22131; AVX1-NEXT: vpackusdw %xmm2, %xmm1, %xmm12132; AVX1-NEXT: shlq $4, %rdi2133; AVX1-NEXT: vmovdqu %xmm0, (%rsi,%rdi)2134; AVX1-NEXT: vmovdqu %xmm1, 16(%rsi,%rdi)2135; AVX1-NEXT: vzeroupper2136; AVX1-NEXT: retq2137;2138; AVX2-LABEL: store_merge_split:2139; AVX2: # %bb.0:2140; AVX2-NEXT: vmovdqa {{.*#+}} ymm2 = [0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15,16,17,20,21,24,25,28,29,24,25,28,29,28,29,30,31]2141; AVX2-NEXT: vpshufb %ymm2, %ymm0, %ymm02142; AVX2-NEXT: vpermq {{.*#+}} ymm0 = ymm0[0,2,2,3]2143; AVX2-NEXT: vpshufb %ymm2, %ymm1, %ymm12144; AVX2-NEXT: vpermq {{.*#+}} ymm1 = ymm1[0,2,2,3]2145; AVX2-NEXT: shlq $4, %rdi2146; AVX2-NEXT: vmovdqu %xmm0, (%rsi,%rdi)2147; AVX2-NEXT: vmovdqu %xmm1, 16(%rsi,%rdi)2148; AVX2-NEXT: vzeroupper2149; AVX2-NEXT: retq2150;2151; AVX512F-LABEL: store_merge_split:2152; AVX512F: # %bb.0:2153; AVX512F-NEXT: # kill: def $ymm1 killed $ymm1 def $zmm12154; AVX512F-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm02155; AVX512F-NEXT: vpmovdw %zmm0, %ymm02156; AVX512F-NEXT: vpmovdw %zmm1, %ymm12157; AVX512F-NEXT: shlq $4, %rdi2158; AVX512F-NEXT: vmovdqu %xmm0, (%rsi,%rdi)2159; AVX512F-NEXT: vmovdqu %xmm1, 16(%rsi,%rdi)2160; AVX512F-NEXT: vzeroupper2161; AVX512F-NEXT: retq2162;2163; AVX512VL-LABEL: store_merge_split:2164; AVX512VL: # %bb.0:2165; AVX512VL-NEXT: shlq $4, %rdi2166; AVX512VL-NEXT: vpmovdw %ymm0, (%rsi,%rdi)2167; AVX512VL-NEXT: vpmovdw %ymm1, 16(%rsi,%rdi)2168; AVX512VL-NEXT: vzeroupper2169; AVX512VL-NEXT: retq2170;2171; AVX512BW-LABEL: store_merge_split:2172; AVX512BW: # %bb.0:2173; AVX512BW-NEXT: # kill: def $ymm1 killed $ymm1 def $zmm12174; AVX512BW-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm02175; AVX512BW-NEXT: vpmovdw %zmm0, %ymm02176; AVX512BW-NEXT: vpmovdw %zmm1, %ymm12177; AVX512BW-NEXT: shlq $4, %rdi2178; AVX512BW-NEXT: vmovdqu %xmm0, (%rsi,%rdi)2179; AVX512BW-NEXT: vmovdqu %xmm1, 16(%rsi,%rdi)2180; AVX512BW-NEXT: vzeroupper2181; AVX512BW-NEXT: retq2182;2183; AVX512BWVL-LABEL: store_merge_split:2184; AVX512BWVL: # %bb.0:2185; AVX512BWVL-NEXT: shlq $4, %rdi2186; AVX512BWVL-NEXT: vpmovdw %ymm0, (%rsi,%rdi)2187; AVX512BWVL-NEXT: vpmovdw %ymm1, 16(%rsi,%rdi)2188; AVX512BWVL-NEXT: vzeroupper2189; AVX512BWVL-NEXT: retq2190 %t1 = trunc <8 x i32> %w1 to <8 x i16>2191 %t2 = trunc <8 x i32> %w2 to <8 x i16>2192 %g1 = getelementptr inbounds <8 x i16>, ptr %p, i64 %idx2193 %g2 = getelementptr inbounds <8 x i16>, ptr %g1, i64 12194 store <8 x i16> %t1, ptr %g1, align 22195 store <8 x i16> %t2, ptr %g2, align 22196 ret void2197}2198