brintos

brintos / llvm-project-archived public Read only

0
0
Text · 57.5 KiB · a47e6de Raw
1593 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_nsw(<8 x i64> %a) {18; SSE-LABEL: trunc8i64_8i32_nsw: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_nsw: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_nsw: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_nsw:39; AVX512:       # %bb.0: # %entry40; AVX512-NEXT:    vpmovqd %zmm0, %ymm041; AVX512-NEXT:    retq42entry:43  %0 = trunc nsw <8 x i64> %a to <8 x i32>44  ret <8 x i32> %045}46 47define <8 x i32> @trunc8i64_8i32_nuw(<8 x i64> %a) {48; SSE-LABEL: trunc8i64_8i32_nuw:49; SSE:       # %bb.0: # %entry50; SSE-NEXT:    shufps {{.*#+}} xmm0 = xmm0[0,2],xmm1[0,2]51; SSE-NEXT:    shufps {{.*#+}} xmm2 = xmm2[0,2],xmm3[0,2]52; SSE-NEXT:    movaps %xmm2, %xmm153; SSE-NEXT:    retq54;55; AVX1-LABEL: trunc8i64_8i32_nuw: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[0,2],ymm2[0,2],ymm0[4,6],ymm2[4,6]60; AVX1-NEXT:    retq61;62; AVX2-LABEL: trunc8i64_8i32_nuw:63; AVX2:       # %bb.0: # %entry64; AVX2-NEXT:    vshufps {{.*#+}} ymm0 = ymm0[0,2],ymm1[0,2],ymm0[4,6],ymm1[4,6]65; AVX2-NEXT:    vpermpd {{.*#+}} ymm0 = ymm0[0,2,1,3]66; AVX2-NEXT:    retq67;68; AVX512-LABEL: trunc8i64_8i32_nuw:69; AVX512:       # %bb.0: # %entry70; AVX512-NEXT:    vpmovqd %zmm0, %ymm071; AVX512-NEXT:    retq72entry:73  %0 = trunc nuw <8 x i64> %a to <8 x i32>74  ret <8 x i32> %075}76 77define <8 x i16> @trunc8i64_8i16_nsw(<8 x i64> %a) {78; SSE-LABEL: trunc8i64_8i16_nsw:79; SSE:       # %bb.0: # %entry80; SSE-NEXT:    packssdw %xmm3, %xmm281; SSE-NEXT:    packssdw %xmm1, %xmm082; SSE-NEXT:    packssdw %xmm2, %xmm083; SSE-NEXT:    retq84;85; AVX1-LABEL: trunc8i64_8i16_nsw:86; AVX1:       # %bb.0: # %entry87; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm288; AVX1-NEXT:    vpackssdw %xmm2, %xmm1, %xmm189; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm290; AVX1-NEXT:    vpackssdw %xmm2, %xmm0, %xmm091; AVX1-NEXT:    vpackssdw %xmm1, %xmm0, %xmm092; AVX1-NEXT:    vzeroupper93; AVX1-NEXT:    retq94;95; AVX2-LABEL: trunc8i64_8i16_nsw:96; AVX2:       # %bb.0: # %entry97; AVX2-NEXT:    vpackssdw %ymm1, %ymm0, %ymm098; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm199; AVX2-NEXT:    vpackssdw %xmm1, %xmm0, %xmm0100; AVX2-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[0,2,1,3]101; AVX2-NEXT:    vzeroupper102; AVX2-NEXT:    retq103;104; AVX512-LABEL: trunc8i64_8i16_nsw:105; AVX512:       # %bb.0: # %entry106; AVX512-NEXT:    vpmovqw %zmm0, %xmm0107; AVX512-NEXT:    vzeroupper108; AVX512-NEXT:    retq109entry:110  %0 = trunc nsw <8 x i64> %a to <8 x i16>111  ret <8 x i16> %0112}113 114define <8 x i16> @trunc8i64_8i16_nuw(<8 x i64> %a) {115; SSE2-SSSE3-LABEL: trunc8i64_8i16_nuw:116; SSE2-SSSE3:       # %bb.0: # %entry117; SSE2-SSSE3-NEXT:    shufps {{.*#+}} xmm2 = xmm2[0,2],xmm3[0,2]118; SSE2-SSSE3-NEXT:    pslld $16, %xmm2119; SSE2-SSSE3-NEXT:    psrad $16, %xmm2120; SSE2-SSSE3-NEXT:    shufps {{.*#+}} xmm0 = xmm0[0,2],xmm1[0,2]121; SSE2-SSSE3-NEXT:    pslld $16, %xmm0122; SSE2-SSSE3-NEXT:    psrad $16, %xmm0123; SSE2-SSSE3-NEXT:    packssdw %xmm2, %xmm0124; SSE2-SSSE3-NEXT:    retq125;126; SSE41-LABEL: trunc8i64_8i16_nuw:127; SSE41:       # %bb.0: # %entry128; SSE41-NEXT:    packusdw %xmm3, %xmm2129; SSE41-NEXT:    packusdw %xmm1, %xmm0130; SSE41-NEXT:    packusdw %xmm2, %xmm0131; SSE41-NEXT:    retq132;133; AVX1-LABEL: trunc8i64_8i16_nuw:134; AVX1:       # %bb.0: # %entry135; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2136; AVX1-NEXT:    vpackusdw %xmm2, %xmm1, %xmm1137; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2138; AVX1-NEXT:    vpackusdw %xmm2, %xmm0, %xmm0139; AVX1-NEXT:    vpackusdw %xmm1, %xmm0, %xmm0140; AVX1-NEXT:    vzeroupper141; AVX1-NEXT:    retq142;143; AVX2-LABEL: trunc8i64_8i16_nuw:144; AVX2:       # %bb.0: # %entry145; AVX2-NEXT:    vpackusdw %ymm1, %ymm0, %ymm0146; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1147; AVX2-NEXT:    vpackusdw %xmm1, %xmm0, %xmm0148; AVX2-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[0,2,1,3]149; AVX2-NEXT:    vzeroupper150; AVX2-NEXT:    retq151;152; AVX512-LABEL: trunc8i64_8i16_nuw:153; AVX512:       # %bb.0: # %entry154; AVX512-NEXT:    vpmovqw %zmm0, %xmm0155; AVX512-NEXT:    vzeroupper156; AVX512-NEXT:    retq157entry:158  %0 = trunc nuw <8 x i64> %a to <8 x i16>159  ret <8 x i16> %0160}161 162define void @trunc8i64_8i8_nsw(<8 x i64> %a) {163; SSE-LABEL: trunc8i64_8i8_nsw:164; SSE:       # %bb.0: # %entry165; SSE-NEXT:    packssdw %xmm3, %xmm2166; SSE-NEXT:    packssdw %xmm1, %xmm0167; SSE-NEXT:    packssdw %xmm2, %xmm0168; SSE-NEXT:    packsswb %xmm0, %xmm0169; SSE-NEXT:    movq %xmm0, (%rax)170; SSE-NEXT:    retq171;172; AVX1-LABEL: trunc8i64_8i8_nsw:173; AVX1:       # %bb.0: # %entry174; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2175; AVX1-NEXT:    vpackssdw %xmm2, %xmm1, %xmm1176; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2177; AVX1-NEXT:    vpackssdw %xmm2, %xmm0, %xmm0178; AVX1-NEXT:    vpackssdw %xmm1, %xmm0, %xmm0179; AVX1-NEXT:    vpacksswb %xmm0, %xmm0, %xmm0180; AVX1-NEXT:    vmovq %xmm0, (%rax)181; AVX1-NEXT:    vzeroupper182; AVX1-NEXT:    retq183;184; AVX2-LABEL: trunc8i64_8i8_nsw:185; AVX2:       # %bb.0: # %entry186; AVX2-NEXT:    vpackssdw %ymm1, %ymm0, %ymm0187; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1188; AVX2-NEXT:    vpackssdw %xmm1, %xmm0, %xmm0189; AVX2-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[0,2,1,3]190; AVX2-NEXT:    vpacksswb %xmm0, %xmm0, %xmm0191; AVX2-NEXT:    vmovq %xmm0, (%rax)192; AVX2-NEXT:    vzeroupper193; AVX2-NEXT:    retq194;195; AVX512-LABEL: trunc8i64_8i8_nsw:196; AVX512:       # %bb.0: # %entry197; AVX512-NEXT:    vpmovqb %zmm0, (%rax)198; AVX512-NEXT:    vzeroupper199; AVX512-NEXT:    retq200entry:201  %0 = trunc nsw <8 x i64> %a to <8 x i8>202  store <8 x i8> %0, ptr undef, align 4203  ret void204}205 206define void @trunc8i64_8i8_nuw(<8 x i64> %a) {207; SSE2-SSSE3-LABEL: trunc8i64_8i8_nuw:208; SSE2-SSSE3:       # %bb.0: # %entry209; SSE2-SSSE3-NEXT:    packuswb %xmm3, %xmm2210; SSE2-SSSE3-NEXT:    packuswb %xmm1, %xmm0211; SSE2-SSSE3-NEXT:    packuswb %xmm2, %xmm0212; SSE2-SSSE3-NEXT:    packuswb %xmm0, %xmm0213; SSE2-SSSE3-NEXT:    movq %xmm0, (%rax)214; SSE2-SSSE3-NEXT:    retq215;216; SSE41-LABEL: trunc8i64_8i8_nuw:217; SSE41:       # %bb.0: # %entry218; SSE41-NEXT:    packusdw %xmm3, %xmm2219; SSE41-NEXT:    packusdw %xmm1, %xmm0220; SSE41-NEXT:    packusdw %xmm2, %xmm0221; SSE41-NEXT:    packuswb %xmm0, %xmm0222; SSE41-NEXT:    movq %xmm0, (%rax)223; SSE41-NEXT:    retq224;225; AVX1-LABEL: trunc8i64_8i8_nuw:226; AVX1:       # %bb.0: # %entry227; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2228; AVX1-NEXT:    vpackusdw %xmm2, %xmm1, %xmm1229; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2230; AVX1-NEXT:    vpackusdw %xmm2, %xmm0, %xmm0231; AVX1-NEXT:    vpackusdw %xmm1, %xmm0, %xmm0232; AVX1-NEXT:    vpackuswb %xmm0, %xmm0, %xmm0233; AVX1-NEXT:    vmovq %xmm0, (%rax)234; AVX1-NEXT:    vzeroupper235; AVX1-NEXT:    retq236;237; AVX2-LABEL: trunc8i64_8i8_nuw:238; AVX2:       # %bb.0: # %entry239; AVX2-NEXT:    vpackusdw %ymm1, %ymm0, %ymm0240; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1241; AVX2-NEXT:    vpackusdw %xmm1, %xmm0, %xmm0242; AVX2-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[0,2,1,3]243; AVX2-NEXT:    vpackuswb %xmm0, %xmm0, %xmm0244; AVX2-NEXT:    vmovq %xmm0, (%rax)245; AVX2-NEXT:    vzeroupper246; AVX2-NEXT:    retq247;248; AVX512-LABEL: trunc8i64_8i8_nuw:249; AVX512:       # %bb.0: # %entry250; AVX512-NEXT:    vpmovqb %zmm0, (%rax)251; AVX512-NEXT:    vzeroupper252; AVX512-NEXT:    retq253entry:254  %0 = trunc nuw <8 x i64> %a to <8 x i8>255  store <8 x i8> %0, ptr undef, align 4256  ret void257}258 259define <8 x i16> @trunc8i32_8i16_nsw(<8 x i32> %a) {260; SSE-LABEL: trunc8i32_8i16_nsw:261; SSE:       # %bb.0: # %entry262; SSE-NEXT:    packssdw %xmm1, %xmm0263; SSE-NEXT:    retq264;265; AVX1-LABEL: trunc8i32_8i16_nsw:266; AVX1:       # %bb.0: # %entry267; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1268; AVX1-NEXT:    vpackssdw %xmm1, %xmm0, %xmm0269; AVX1-NEXT:    vzeroupper270; AVX1-NEXT:    retq271;272; AVX2-LABEL: trunc8i32_8i16_nsw:273; AVX2:       # %bb.0: # %entry274; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1275; AVX2-NEXT:    vpackssdw %xmm1, %xmm0, %xmm0276; AVX2-NEXT:    vzeroupper277; AVX2-NEXT:    retq278;279; AVX512F-LABEL: trunc8i32_8i16_nsw:280; AVX512F:       # %bb.0: # %entry281; AVX512F-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0282; AVX512F-NEXT:    vpmovdw %zmm0, %ymm0283; AVX512F-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0284; AVX512F-NEXT:    vzeroupper285; AVX512F-NEXT:    retq286;287; AVX512VL-LABEL: trunc8i32_8i16_nsw:288; AVX512VL:       # %bb.0: # %entry289; AVX512VL-NEXT:    vpmovdw %ymm0, %xmm0290; AVX512VL-NEXT:    vzeroupper291; AVX512VL-NEXT:    retq292;293; AVX512BW-LABEL: trunc8i32_8i16_nsw:294; AVX512BW:       # %bb.0: # %entry295; AVX512BW-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0296; AVX512BW-NEXT:    vpmovdw %zmm0, %ymm0297; AVX512BW-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0298; AVX512BW-NEXT:    vzeroupper299; AVX512BW-NEXT:    retq300;301; AVX512BWVL-LABEL: trunc8i32_8i16_nsw:302; AVX512BWVL:       # %bb.0: # %entry303; AVX512BWVL-NEXT:    vpmovdw %ymm0, %xmm0304; AVX512BWVL-NEXT:    vzeroupper305; AVX512BWVL-NEXT:    retq306entry:307  %0 = trunc nsw <8 x i32> %a to <8 x i16>308  ret <8 x i16> %0309}310 311define <8 x i16> @trunc8i32_8i16_nuw(<8 x i32> %a) {312; SSE2-LABEL: trunc8i32_8i16_nuw:313; SSE2:       # %bb.0: # %entry314; SSE2-NEXT:    pslld $16, %xmm1315; SSE2-NEXT:    psrad $16, %xmm1316; SSE2-NEXT:    pslld $16, %xmm0317; SSE2-NEXT:    psrad $16, %xmm0318; SSE2-NEXT:    packssdw %xmm1, %xmm0319; SSE2-NEXT:    retq320;321; SSSE3-LABEL: trunc8i32_8i16_nuw:322; SSSE3:       # %bb.0: # %entry323; SSSE3-NEXT:    movdqa {{.*#+}} xmm2 = [0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15]324; SSSE3-NEXT:    pshufb %xmm2, %xmm1325; SSSE3-NEXT:    pshufb %xmm2, %xmm0326; SSSE3-NEXT:    punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]327; SSSE3-NEXT:    retq328;329; SSE41-LABEL: trunc8i32_8i16_nuw:330; SSE41:       # %bb.0: # %entry331; SSE41-NEXT:    packusdw %xmm1, %xmm0332; SSE41-NEXT:    retq333;334; AVX1-LABEL: trunc8i32_8i16_nuw:335; AVX1:       # %bb.0: # %entry336; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1337; AVX1-NEXT:    vpackusdw %xmm1, %xmm0, %xmm0338; AVX1-NEXT:    vzeroupper339; AVX1-NEXT:    retq340;341; AVX2-LABEL: trunc8i32_8i16_nuw:342; AVX2:       # %bb.0: # %entry343; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1344; AVX2-NEXT:    vpackusdw %xmm1, %xmm0, %xmm0345; AVX2-NEXT:    vzeroupper346; AVX2-NEXT:    retq347;348; AVX512F-LABEL: trunc8i32_8i16_nuw:349; AVX512F:       # %bb.0: # %entry350; AVX512F-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0351; AVX512F-NEXT:    vpmovdw %zmm0, %ymm0352; AVX512F-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0353; AVX512F-NEXT:    vzeroupper354; AVX512F-NEXT:    retq355;356; AVX512VL-LABEL: trunc8i32_8i16_nuw:357; AVX512VL:       # %bb.0: # %entry358; AVX512VL-NEXT:    vpmovdw %ymm0, %xmm0359; AVX512VL-NEXT:    vzeroupper360; AVX512VL-NEXT:    retq361;362; AVX512BW-LABEL: trunc8i32_8i16_nuw:363; AVX512BW:       # %bb.0: # %entry364; AVX512BW-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0365; AVX512BW-NEXT:    vpmovdw %zmm0, %ymm0366; AVX512BW-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0367; AVX512BW-NEXT:    vzeroupper368; AVX512BW-NEXT:    retq369;370; AVX512BWVL-LABEL: trunc8i32_8i16_nuw:371; AVX512BWVL:       # %bb.0: # %entry372; AVX512BWVL-NEXT:    vpmovdw %ymm0, %xmm0373; AVX512BWVL-NEXT:    vzeroupper374; AVX512BWVL-NEXT:    retq375entry:376  %0 = trunc nuw <8 x i32> %a to <8 x i16>377  ret <8 x i16> %0378}379 380define void @trunc8i32_8i8_nsw(<8 x i32> %a) {381; SSE-LABEL: trunc8i32_8i8_nsw:382; SSE:       # %bb.0: # %entry383; SSE-NEXT:    packssdw %xmm1, %xmm0384; SSE-NEXT:    packsswb %xmm0, %xmm0385; SSE-NEXT:    movq %xmm0, (%rax)386; SSE-NEXT:    retq387;388; AVX1-LABEL: trunc8i32_8i8_nsw:389; AVX1:       # %bb.0: # %entry390; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1391; AVX1-NEXT:    vpackssdw %xmm1, %xmm0, %xmm0392; AVX1-NEXT:    vpacksswb %xmm0, %xmm0, %xmm0393; AVX1-NEXT:    vmovq %xmm0, (%rax)394; AVX1-NEXT:    vzeroupper395; AVX1-NEXT:    retq396;397; AVX2-LABEL: trunc8i32_8i8_nsw:398; AVX2:       # %bb.0: # %entry399; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1400; AVX2-NEXT:    vpackssdw %xmm1, %xmm0, %xmm0401; AVX2-NEXT:    vpacksswb %xmm0, %xmm0, %xmm0402; AVX2-NEXT:    vmovq %xmm0, (%rax)403; AVX2-NEXT:    vzeroupper404; AVX2-NEXT:    retq405;406; AVX512F-LABEL: trunc8i32_8i8_nsw:407; AVX512F:       # %bb.0: # %entry408; AVX512F-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0409; AVX512F-NEXT:    vpmovdb %zmm0, %xmm0410; AVX512F-NEXT:    vmovq %xmm0, (%rax)411; AVX512F-NEXT:    vzeroupper412; AVX512F-NEXT:    retq413;414; AVX512VL-LABEL: trunc8i32_8i8_nsw:415; AVX512VL:       # %bb.0: # %entry416; AVX512VL-NEXT:    vpmovdb %ymm0, (%rax)417; AVX512VL-NEXT:    vzeroupper418; AVX512VL-NEXT:    retq419;420; AVX512BW-LABEL: trunc8i32_8i8_nsw:421; AVX512BW:       # %bb.0: # %entry422; AVX512BW-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0423; AVX512BW-NEXT:    vpmovdb %zmm0, %xmm0424; AVX512BW-NEXT:    vmovq %xmm0, (%rax)425; AVX512BW-NEXT:    vzeroupper426; AVX512BW-NEXT:    retq427;428; AVX512BWVL-LABEL: trunc8i32_8i8_nsw:429; AVX512BWVL:       # %bb.0: # %entry430; AVX512BWVL-NEXT:    vpmovdb %ymm0, (%rax)431; AVX512BWVL-NEXT:    vzeroupper432; AVX512BWVL-NEXT:    retq433entry:434  %0 = trunc nsw <8 x i32> %a to <8 x i8>435  store <8 x i8> %0, ptr undef, align 4436  ret void437}438 439define void @trunc8i32_8i8_nuw(<8 x i32> %a) {440; SSE2-SSSE3-LABEL: trunc8i32_8i8_nuw:441; SSE2-SSSE3:       # %bb.0: # %entry442; SSE2-SSSE3-NEXT:    packuswb %xmm1, %xmm0443; SSE2-SSSE3-NEXT:    packuswb %xmm0, %xmm0444; SSE2-SSSE3-NEXT:    movq %xmm0, (%rax)445; SSE2-SSSE3-NEXT:    retq446;447; SSE41-LABEL: trunc8i32_8i8_nuw:448; SSE41:       # %bb.0: # %entry449; SSE41-NEXT:    packusdw %xmm1, %xmm0450; SSE41-NEXT:    packuswb %xmm0, %xmm0451; SSE41-NEXT:    movq %xmm0, (%rax)452; SSE41-NEXT:    retq453;454; AVX1-LABEL: trunc8i32_8i8_nuw:455; AVX1:       # %bb.0: # %entry456; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1457; AVX1-NEXT:    vpackusdw %xmm1, %xmm0, %xmm0458; AVX1-NEXT:    vpackuswb %xmm0, %xmm0, %xmm0459; AVX1-NEXT:    vmovq %xmm0, (%rax)460; AVX1-NEXT:    vzeroupper461; AVX1-NEXT:    retq462;463; AVX2-LABEL: trunc8i32_8i8_nuw:464; AVX2:       # %bb.0: # %entry465; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1466; AVX2-NEXT:    vpackusdw %xmm1, %xmm0, %xmm0467; AVX2-NEXT:    vpackuswb %xmm0, %xmm0, %xmm0468; AVX2-NEXT:    vmovq %xmm0, (%rax)469; AVX2-NEXT:    vzeroupper470; AVX2-NEXT:    retq471;472; AVX512F-LABEL: trunc8i32_8i8_nuw:473; AVX512F:       # %bb.0: # %entry474; AVX512F-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0475; AVX512F-NEXT:    vpmovdb %zmm0, %xmm0476; AVX512F-NEXT:    vmovq %xmm0, (%rax)477; AVX512F-NEXT:    vzeroupper478; AVX512F-NEXT:    retq479;480; AVX512VL-LABEL: trunc8i32_8i8_nuw:481; AVX512VL:       # %bb.0: # %entry482; AVX512VL-NEXT:    vpmovdb %ymm0, (%rax)483; AVX512VL-NEXT:    vzeroupper484; AVX512VL-NEXT:    retq485;486; AVX512BW-LABEL: trunc8i32_8i8_nuw:487; AVX512BW:       # %bb.0: # %entry488; AVX512BW-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0489; AVX512BW-NEXT:    vpmovdb %zmm0, %xmm0490; AVX512BW-NEXT:    vmovq %xmm0, (%rax)491; AVX512BW-NEXT:    vzeroupper492; AVX512BW-NEXT:    retq493;494; AVX512BWVL-LABEL: trunc8i32_8i8_nuw:495; AVX512BWVL:       # %bb.0: # %entry496; AVX512BWVL-NEXT:    vpmovdb %ymm0, (%rax)497; AVX512BWVL-NEXT:    vzeroupper498; AVX512BWVL-NEXT:    retq499entry:500  %0 = trunc nuw <8 x i32> %a to <8 x i8>501  store <8 x i8> %0, ptr undef, align 4502  ret void503}504 505define void @trunc16i32_16i16_nsw(<16 x i32> %a) {506; SSE-LABEL: trunc16i32_16i16_nsw:507; SSE:       # %bb.0: # %entry508; SSE-NEXT:    packssdw %xmm1, %xmm0509; SSE-NEXT:    packssdw %xmm3, %xmm2510; SSE-NEXT:    movdqu %xmm2, (%rax)511; SSE-NEXT:    movdqu %xmm0, (%rax)512; SSE-NEXT:    retq513;514; AVX1-LABEL: trunc16i32_16i16_nsw:515; AVX1:       # %bb.0: # %entry516; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2517; AVX1-NEXT:    vpackssdw %xmm2, %xmm0, %xmm0518; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2519; AVX1-NEXT:    vpackssdw %xmm2, %xmm1, %xmm1520; AVX1-NEXT:    vmovdqu %xmm1, (%rax)521; AVX1-NEXT:    vmovdqu %xmm0, (%rax)522; AVX1-NEXT:    vzeroupper523; AVX1-NEXT:    retq524;525; AVX2-LABEL: trunc16i32_16i16_nsw:526; AVX2:       # %bb.0: # %entry527; AVX2-NEXT:    vpackssdw %ymm1, %ymm0, %ymm0528; AVX2-NEXT:    vpermq {{.*#+}} ymm0 = ymm0[0,2,1,3]529; AVX2-NEXT:    vmovdqu %ymm0, (%rax)530; AVX2-NEXT:    vzeroupper531; AVX2-NEXT:    retq532;533; AVX512-LABEL: trunc16i32_16i16_nsw:534; AVX512:       # %bb.0: # %entry535; AVX512-NEXT:    vpmovdw %zmm0, (%rax)536; AVX512-NEXT:    vzeroupper537; AVX512-NEXT:    retq538entry:539  %0 = trunc nsw <16 x i32> %a to <16 x i16>540  store <16 x i16> %0, ptr undef, align 4541  ret void542}543 544define void @trunc16i32_16i16_nuw(<16 x i32> %a) {545; SSE2-LABEL: trunc16i32_16i16_nuw:546; SSE2:       # %bb.0: # %entry547; SSE2-NEXT:    pslld $16, %xmm1548; SSE2-NEXT:    psrad $16, %xmm1549; SSE2-NEXT:    pslld $16, %xmm0550; SSE2-NEXT:    psrad $16, %xmm0551; SSE2-NEXT:    packssdw %xmm1, %xmm0552; SSE2-NEXT:    pslld $16, %xmm3553; SSE2-NEXT:    psrad $16, %xmm3554; SSE2-NEXT:    pslld $16, %xmm2555; SSE2-NEXT:    psrad $16, %xmm2556; SSE2-NEXT:    packssdw %xmm3, %xmm2557; SSE2-NEXT:    movdqu %xmm2, (%rax)558; SSE2-NEXT:    movdqu %xmm0, (%rax)559; SSE2-NEXT:    retq560;561; SSSE3-LABEL: trunc16i32_16i16_nuw:562; SSSE3:       # %bb.0: # %entry563; SSSE3-NEXT:    movdqa {{.*#+}} xmm4 = [0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15]564; SSSE3-NEXT:    pshufb %xmm4, %xmm1565; SSSE3-NEXT:    pshufb %xmm4, %xmm0566; SSSE3-NEXT:    punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]567; SSSE3-NEXT:    pshufb %xmm4, %xmm3568; SSSE3-NEXT:    pshufb %xmm4, %xmm2569; SSSE3-NEXT:    punpcklqdq {{.*#+}} xmm2 = xmm2[0],xmm3[0]570; SSSE3-NEXT:    movdqu %xmm2, (%rax)571; SSSE3-NEXT:    movdqu %xmm0, (%rax)572; SSSE3-NEXT:    retq573;574; SSE41-LABEL: trunc16i32_16i16_nuw:575; SSE41:       # %bb.0: # %entry576; SSE41-NEXT:    packusdw %xmm1, %xmm0577; SSE41-NEXT:    packusdw %xmm3, %xmm2578; SSE41-NEXT:    movdqu %xmm2, (%rax)579; SSE41-NEXT:    movdqu %xmm0, (%rax)580; SSE41-NEXT:    retq581;582; AVX1-LABEL: trunc16i32_16i16_nuw:583; AVX1:       # %bb.0: # %entry584; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2585; AVX1-NEXT:    vpackusdw %xmm2, %xmm0, %xmm0586; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2587; AVX1-NEXT:    vpackusdw %xmm2, %xmm1, %xmm1588; AVX1-NEXT:    vmovdqu %xmm1, (%rax)589; AVX1-NEXT:    vmovdqu %xmm0, (%rax)590; AVX1-NEXT:    vzeroupper591; AVX1-NEXT:    retq592;593; AVX2-LABEL: trunc16i32_16i16_nuw:594; AVX2:       # %bb.0: # %entry595; AVX2-NEXT:    vpackusdw %ymm1, %ymm0, %ymm0596; AVX2-NEXT:    vpermq {{.*#+}} ymm0 = ymm0[0,2,1,3]597; AVX2-NEXT:    vmovdqu %ymm0, (%rax)598; AVX2-NEXT:    vzeroupper599; AVX2-NEXT:    retq600;601; AVX512-LABEL: trunc16i32_16i16_nuw:602; AVX512:       # %bb.0: # %entry603; AVX512-NEXT:    vpmovdw %zmm0, (%rax)604; AVX512-NEXT:    vzeroupper605; AVX512-NEXT:    retq606entry:607  %0 = trunc nuw <16 x i32> %a to <16 x i16>608  store <16 x i16> %0, ptr undef, align 4609  ret void610}611 612define void @trunc16i32_16i8_nsw(<16 x i32> %a) {613; SSE2-SSSE3-LABEL: trunc16i32_16i8_nsw:614; SSE2-SSSE3:       # %bb.0: # %entry615; SSE2-SSSE3-NEXT:    packuswb %xmm3, %xmm2616; SSE2-SSSE3-NEXT:    packuswb %xmm1, %xmm0617; SSE2-SSSE3-NEXT:    packuswb %xmm2, %xmm0618; SSE2-SSSE3-NEXT:    movdqu %xmm0, (%rax)619; SSE2-SSSE3-NEXT:    retq620;621; SSE41-LABEL: trunc16i32_16i8_nsw:622; SSE41:       # %bb.0: # %entry623; SSE41-NEXT:    packusdw %xmm3, %xmm2624; SSE41-NEXT:    packusdw %xmm1, %xmm0625; SSE41-NEXT:    packuswb %xmm2, %xmm0626; SSE41-NEXT:    movdqu %xmm0, (%rax)627; SSE41-NEXT:    retq628;629; AVX1-LABEL: trunc16i32_16i8_nsw:630; AVX1:       # %bb.0: # %entry631; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2632; AVX1-NEXT:    vpackusdw %xmm2, %xmm1, %xmm1633; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2634; AVX1-NEXT:    vpackusdw %xmm2, %xmm0, %xmm0635; AVX1-NEXT:    vpackuswb %xmm1, %xmm0, %xmm0636; AVX1-NEXT:    vmovdqu %xmm0, (%rax)637; AVX1-NEXT:    vzeroupper638; AVX1-NEXT:    retq639;640; AVX2-LABEL: trunc16i32_16i8_nsw:641; AVX2:       # %bb.0: # %entry642; AVX2-NEXT:    vpackusdw %ymm1, %ymm0, %ymm0643; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1644; AVX2-NEXT:    vpackuswb %xmm1, %xmm0, %xmm0645; AVX2-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[0,2,1,3]646; AVX2-NEXT:    vmovdqu %xmm0, (%rax)647; AVX2-NEXT:    vzeroupper648; AVX2-NEXT:    retq649;650; AVX512-LABEL: trunc16i32_16i8_nsw:651; AVX512:       # %bb.0: # %entry652; AVX512-NEXT:    vpmovdb %zmm0, (%rax)653; AVX512-NEXT:    vzeroupper654; AVX512-NEXT:    retq655entry:656  %0 = trunc nuw <16 x i32> %a to <16 x i8>657  store <16 x i8> %0, ptr undef, align 4658  ret void659}660 661define void @trunc16i32_16i8_nuw(<16 x i32> %a) {662; SSE2-SSSE3-LABEL: trunc16i32_16i8_nuw:663; SSE2-SSSE3:       # %bb.0: # %entry664; SSE2-SSSE3-NEXT:    packuswb %xmm3, %xmm2665; SSE2-SSSE3-NEXT:    packuswb %xmm1, %xmm0666; SSE2-SSSE3-NEXT:    packuswb %xmm2, %xmm0667; SSE2-SSSE3-NEXT:    movdqu %xmm0, (%rax)668; SSE2-SSSE3-NEXT:    retq669;670; SSE41-LABEL: trunc16i32_16i8_nuw:671; SSE41:       # %bb.0: # %entry672; SSE41-NEXT:    packusdw %xmm3, %xmm2673; SSE41-NEXT:    packusdw %xmm1, %xmm0674; SSE41-NEXT:    packuswb %xmm2, %xmm0675; SSE41-NEXT:    movdqu %xmm0, (%rax)676; SSE41-NEXT:    retq677;678; AVX1-LABEL: trunc16i32_16i8_nuw:679; AVX1:       # %bb.0: # %entry680; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2681; AVX1-NEXT:    vpackusdw %xmm2, %xmm1, %xmm1682; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2683; AVX1-NEXT:    vpackusdw %xmm2, %xmm0, %xmm0684; AVX1-NEXT:    vpackuswb %xmm1, %xmm0, %xmm0685; AVX1-NEXT:    vmovdqu %xmm0, (%rax)686; AVX1-NEXT:    vzeroupper687; AVX1-NEXT:    retq688;689; AVX2-LABEL: trunc16i32_16i8_nuw:690; AVX2:       # %bb.0: # %entry691; AVX2-NEXT:    vpackusdw %ymm1, %ymm0, %ymm0692; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1693; AVX2-NEXT:    vpackuswb %xmm1, %xmm0, %xmm0694; AVX2-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[0,2,1,3]695; AVX2-NEXT:    vmovdqu %xmm0, (%rax)696; AVX2-NEXT:    vzeroupper697; AVX2-NEXT:    retq698;699; AVX512-LABEL: trunc16i32_16i8_nuw:700; AVX512:       # %bb.0: # %entry701; AVX512-NEXT:    vpmovdb %zmm0, (%rax)702; AVX512-NEXT:    vzeroupper703; AVX512-NEXT:    retq704entry:705  %0 = trunc nuw <16 x i32> %a to <16 x i8>706  store <16 x i8> %0, ptr undef, align 4707  ret void708}709 710define void @trunc16i16_16i8_nsw(<16 x i16> %a) {711; SSE-LABEL: trunc16i16_16i8_nsw:712; SSE:       # %bb.0: # %entry713; SSE-NEXT:    packsswb %xmm1, %xmm0714; SSE-NEXT:    movdqu %xmm0, (%rax)715; SSE-NEXT:    retq716;717; AVX1-LABEL: trunc16i16_16i8_nsw:718; AVX1:       # %bb.0: # %entry719; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1720; AVX1-NEXT:    vpacksswb %xmm1, %xmm0, %xmm0721; AVX1-NEXT:    vmovdqu %xmm0, (%rax)722; AVX1-NEXT:    vzeroupper723; AVX1-NEXT:    retq724;725; AVX2-LABEL: trunc16i16_16i8_nsw:726; AVX2:       # %bb.0: # %entry727; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1728; AVX2-NEXT:    vpacksswb %xmm1, %xmm0, %xmm0729; AVX2-NEXT:    vmovdqu %xmm0, (%rax)730; AVX2-NEXT:    vzeroupper731; AVX2-NEXT:    retq732;733; AVX512F-LABEL: trunc16i16_16i8_nsw:734; AVX512F:       # %bb.0: # %entry735; 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],zero736; AVX512F-NEXT:    vpmovdb %zmm0, (%rax)737; AVX512F-NEXT:    vzeroupper738; AVX512F-NEXT:    retq739;740; AVX512VL-LABEL: trunc16i16_16i8_nsw:741; AVX512VL:       # %bb.0: # %entry742; 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],zero743; AVX512VL-NEXT:    vpmovdb %zmm0, (%rax)744; AVX512VL-NEXT:    vzeroupper745; AVX512VL-NEXT:    retq746;747; AVX512BW-LABEL: trunc16i16_16i8_nsw:748; AVX512BW:       # %bb.0: # %entry749; AVX512BW-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0750; AVX512BW-NEXT:    vpmovwb %zmm0, %ymm0751; AVX512BW-NEXT:    vmovdqu %xmm0, (%rax)752; AVX512BW-NEXT:    vzeroupper753; AVX512BW-NEXT:    retq754;755; AVX512BWVL-LABEL: trunc16i16_16i8_nsw:756; AVX512BWVL:       # %bb.0: # %entry757; AVX512BWVL-NEXT:    vpmovwb %ymm0, (%rax)758; AVX512BWVL-NEXT:    vzeroupper759; AVX512BWVL-NEXT:    retq760entry:761  %0 = trunc nsw <16 x i16> %a to <16 x i8>762  store <16 x i8> %0, ptr undef, align 4763  ret void764}765 766define void @trunc16i16_16i8_nuw(<16 x i16> %a) {767; SSE-LABEL: trunc16i16_16i8_nuw:768; SSE:       # %bb.0: # %entry769; SSE-NEXT:    packuswb %xmm1, %xmm0770; SSE-NEXT:    movdqu %xmm0, (%rax)771; SSE-NEXT:    retq772;773; AVX1-LABEL: trunc16i16_16i8_nuw:774; AVX1:       # %bb.0: # %entry775; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1776; AVX1-NEXT:    vpackuswb %xmm1, %xmm0, %xmm0777; AVX1-NEXT:    vmovdqu %xmm0, (%rax)778; AVX1-NEXT:    vzeroupper779; AVX1-NEXT:    retq780;781; AVX2-LABEL: trunc16i16_16i8_nuw:782; AVX2:       # %bb.0: # %entry783; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1784; AVX2-NEXT:    vpackuswb %xmm1, %xmm0, %xmm0785; AVX2-NEXT:    vmovdqu %xmm0, (%rax)786; AVX2-NEXT:    vzeroupper787; AVX2-NEXT:    retq788;789; AVX512F-LABEL: trunc16i16_16i8_nuw:790; AVX512F:       # %bb.0: # %entry791; 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],zero792; AVX512F-NEXT:    vpmovdb %zmm0, (%rax)793; AVX512F-NEXT:    vzeroupper794; AVX512F-NEXT:    retq795;796; AVX512VL-LABEL: trunc16i16_16i8_nuw:797; AVX512VL:       # %bb.0: # %entry798; 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],zero799; AVX512VL-NEXT:    vpmovdb %zmm0, (%rax)800; AVX512VL-NEXT:    vzeroupper801; AVX512VL-NEXT:    retq802;803; AVX512BW-LABEL: trunc16i16_16i8_nuw:804; AVX512BW:       # %bb.0: # %entry805; AVX512BW-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0806; AVX512BW-NEXT:    vpmovwb %zmm0, %ymm0807; AVX512BW-NEXT:    vmovdqu %xmm0, (%rax)808; AVX512BW-NEXT:    vzeroupper809; AVX512BW-NEXT:    retq810;811; AVX512BWVL-LABEL: trunc16i16_16i8_nuw:812; AVX512BWVL:       # %bb.0: # %entry813; AVX512BWVL-NEXT:    vpmovwb %ymm0, (%rax)814; AVX512BWVL-NEXT:    vzeroupper815; AVX512BWVL-NEXT:    retq816entry:817  %0 = trunc nuw <16 x i16> %a to <16 x i8>818  store <16 x i8> %0, ptr undef, align 4819  ret void820}821 822define void @trunc32i16_32i8_nsw(<32 x i16> %a) {823; SSE-LABEL: trunc32i16_32i8_nsw:824; SSE:       # %bb.0: # %entry825; SSE-NEXT:    packsswb %xmm1, %xmm0826; SSE-NEXT:    packsswb %xmm3, %xmm2827; SSE-NEXT:    movdqu %xmm2, (%rax)828; SSE-NEXT:    movdqu %xmm0, (%rax)829; SSE-NEXT:    retq830;831; AVX1-LABEL: trunc32i16_32i8_nsw:832; AVX1:       # %bb.0: # %entry833; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2834; AVX1-NEXT:    vpacksswb %xmm2, %xmm0, %xmm0835; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2836; AVX1-NEXT:    vpacksswb %xmm2, %xmm1, %xmm1837; AVX1-NEXT:    vmovdqu %xmm1, (%rax)838; AVX1-NEXT:    vmovdqu %xmm0, (%rax)839; AVX1-NEXT:    vzeroupper840; AVX1-NEXT:    retq841;842; AVX2-LABEL: trunc32i16_32i8_nsw:843; AVX2:       # %bb.0: # %entry844; AVX2-NEXT:    vpacksswb %ymm1, %ymm0, %ymm0845; AVX2-NEXT:    vpermq {{.*#+}} ymm0 = ymm0[0,2,1,3]846; AVX2-NEXT:    vmovdqu %ymm0, (%rax)847; AVX2-NEXT:    vzeroupper848; AVX2-NEXT:    retq849;850; AVX512F-LABEL: trunc32i16_32i8_nsw:851; AVX512F:       # %bb.0: # %entry852; AVX512F-NEXT:    vextracti64x4 $1, %zmm0, %ymm1853; 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],zero854; AVX512F-NEXT:    vpmovdb %zmm1, (%rax)855; 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],zero856; AVX512F-NEXT:    vpmovdb %zmm0, (%rax)857; AVX512F-NEXT:    vzeroupper858; AVX512F-NEXT:    retq859;860; AVX512VL-LABEL: trunc32i16_32i8_nsw:861; AVX512VL:       # %bb.0: # %entry862; AVX512VL-NEXT:    vextracti64x4 $1, %zmm0, %ymm1863; 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],zero864; AVX512VL-NEXT:    vpmovdb %zmm1, (%rax)865; 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],zero866; AVX512VL-NEXT:    vpmovdb %zmm0, (%rax)867; AVX512VL-NEXT:    vzeroupper868; AVX512VL-NEXT:    retq869;870; AVX512BW-LABEL: trunc32i16_32i8_nsw:871; AVX512BW:       # %bb.0: # %entry872; AVX512BW-NEXT:    vpmovwb %zmm0, (%rax)873; AVX512BW-NEXT:    vzeroupper874; AVX512BW-NEXT:    retq875;876; AVX512BWVL-LABEL: trunc32i16_32i8_nsw:877; AVX512BWVL:       # %bb.0: # %entry878; AVX512BWVL-NEXT:    vpmovwb %zmm0, (%rax)879; AVX512BWVL-NEXT:    vzeroupper880; AVX512BWVL-NEXT:    retq881entry:882  %0 = trunc nsw <32 x i16> %a to <32 x i8>883  store <32 x i8> %0, ptr undef, align 4884  ret void885}886 887define void @trunc32i16_32i8_nuw(<32 x i16> %a) {888; SSE-LABEL: trunc32i16_32i8_nuw:889; SSE:       # %bb.0: # %entry890; SSE-NEXT:    packsswb %xmm1, %xmm0891; SSE-NEXT:    packsswb %xmm3, %xmm2892; SSE-NEXT:    movdqu %xmm2, (%rax)893; SSE-NEXT:    movdqu %xmm0, (%rax)894; SSE-NEXT:    retq895;896; AVX1-LABEL: trunc32i16_32i8_nuw:897; AVX1:       # %bb.0: # %entry898; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2899; AVX1-NEXT:    vpacksswb %xmm2, %xmm0, %xmm0900; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2901; AVX1-NEXT:    vpacksswb %xmm2, %xmm1, %xmm1902; AVX1-NEXT:    vmovdqu %xmm1, (%rax)903; AVX1-NEXT:    vmovdqu %xmm0, (%rax)904; AVX1-NEXT:    vzeroupper905; AVX1-NEXT:    retq906;907; AVX2-LABEL: trunc32i16_32i8_nuw:908; AVX2:       # %bb.0: # %entry909; AVX2-NEXT:    vpacksswb %ymm1, %ymm0, %ymm0910; AVX2-NEXT:    vpermq {{.*#+}} ymm0 = ymm0[0,2,1,3]911; AVX2-NEXT:    vmovdqu %ymm0, (%rax)912; AVX2-NEXT:    vzeroupper913; AVX2-NEXT:    retq914;915; AVX512F-LABEL: trunc32i16_32i8_nuw:916; AVX512F:       # %bb.0: # %entry917; AVX512F-NEXT:    vextracti64x4 $1, %zmm0, %ymm1918; 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],zero919; AVX512F-NEXT:    vpmovdb %zmm1, (%rax)920; 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],zero921; AVX512F-NEXT:    vpmovdb %zmm0, (%rax)922; AVX512F-NEXT:    vzeroupper923; AVX512F-NEXT:    retq924;925; AVX512VL-LABEL: trunc32i16_32i8_nuw:926; AVX512VL:       # %bb.0: # %entry927; AVX512VL-NEXT:    vextracti64x4 $1, %zmm0, %ymm1928; 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],zero929; AVX512VL-NEXT:    vpmovdb %zmm1, (%rax)930; 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],zero931; AVX512VL-NEXT:    vpmovdb %zmm0, (%rax)932; AVX512VL-NEXT:    vzeroupper933; AVX512VL-NEXT:    retq934;935; AVX512BW-LABEL: trunc32i16_32i8_nuw:936; AVX512BW:       # %bb.0: # %entry937; AVX512BW-NEXT:    vpmovwb %zmm0, (%rax)938; AVX512BW-NEXT:    vzeroupper939; AVX512BW-NEXT:    retq940;941; AVX512BWVL-LABEL: trunc32i16_32i8_nuw:942; AVX512BWVL:       # %bb.0: # %entry943; AVX512BWVL-NEXT:    vpmovwb %zmm0, (%rax)944; AVX512BWVL-NEXT:    vzeroupper945; AVX512BWVL-NEXT:    retq946entry:947  %0 = trunc nsw <32 x i16> %a to <32 x i8>948  store <32 x i8> %0, ptr undef, align 4949  ret void950}951 952define <8 x i32> @trunc2x4i64_8i32_nsw(<4 x i64> %a, <4 x i64> %b) {953; SSE-LABEL: trunc2x4i64_8i32_nsw:954; SSE:       # %bb.0: # %entry955; SSE-NEXT:    shufps {{.*#+}} xmm0 = xmm0[0,2],xmm1[0,2]956; SSE-NEXT:    shufps {{.*#+}} xmm2 = xmm2[0,2],xmm3[0,2]957; SSE-NEXT:    movaps %xmm2, %xmm1958; SSE-NEXT:    retq959;960; AVX1-LABEL: trunc2x4i64_8i32_nsw:961; AVX1:       # %bb.0: # %entry962; AVX1-NEXT:    vperm2f128 {{.*#+}} ymm2 = ymm0[2,3],ymm1[2,3]963; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0964; AVX1-NEXT:    vshufps {{.*#+}} ymm0 = ymm0[0,2],ymm2[0,2],ymm0[4,6],ymm2[4,6]965; AVX1-NEXT:    retq966;967; AVX2-LABEL: trunc2x4i64_8i32_nsw:968; AVX2:       # %bb.0: # %entry969; AVX2-NEXT:    vshufps {{.*#+}} ymm0 = ymm0[0,2],ymm1[0,2],ymm0[4,6],ymm1[4,6]970; AVX2-NEXT:    vpermpd {{.*#+}} ymm0 = ymm0[0,2,1,3]971; AVX2-NEXT:    retq972;973; AVX512-LABEL: trunc2x4i64_8i32_nsw:974; AVX512:       # %bb.0: # %entry975; AVX512-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0976; AVX512-NEXT:    vinserti64x4 $1, %ymm1, %zmm0, %zmm0977; AVX512-NEXT:    vpmovqd %zmm0, %ymm0978; AVX512-NEXT:    retq979entry:980  %0 = trunc nsw <4 x i64> %a to <4 x i32>981  %1 = trunc nsw <4 x i64> %b to <4 x i32>982  %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>983  ret <8 x i32> %2984}985 986define <8 x i32> @trunc2x4i64_8i32_nuw(<4 x i64> %a, <4 x i64> %b) {987; SSE-LABEL: trunc2x4i64_8i32_nuw:988; SSE:       # %bb.0: # %entry989; SSE-NEXT:    shufps {{.*#+}} xmm0 = xmm0[0,2],xmm1[0,2]990; SSE-NEXT:    shufps {{.*#+}} xmm2 = xmm2[0,2],xmm3[0,2]991; SSE-NEXT:    movaps %xmm2, %xmm1992; SSE-NEXT:    retq993;994; AVX1-LABEL: trunc2x4i64_8i32_nuw:995; AVX1:       # %bb.0: # %entry996; AVX1-NEXT:    vperm2f128 {{.*#+}} ymm2 = ymm0[2,3],ymm1[2,3]997; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0998; AVX1-NEXT:    vshufps {{.*#+}} ymm0 = ymm0[0,2],ymm2[0,2],ymm0[4,6],ymm2[4,6]999; AVX1-NEXT:    retq1000;1001; AVX2-LABEL: trunc2x4i64_8i32_nuw:1002; AVX2:       # %bb.0: # %entry1003; AVX2-NEXT:    vshufps {{.*#+}} ymm0 = ymm0[0,2],ymm1[0,2],ymm0[4,6],ymm1[4,6]1004; AVX2-NEXT:    vpermpd {{.*#+}} ymm0 = ymm0[0,2,1,3]1005; AVX2-NEXT:    retq1006;1007; AVX512-LABEL: trunc2x4i64_8i32_nuw:1008; AVX512:       # %bb.0: # %entry1009; AVX512-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm01010; AVX512-NEXT:    vinserti64x4 $1, %ymm1, %zmm0, %zmm01011; AVX512-NEXT:    vpmovqd %zmm0, %ymm01012; AVX512-NEXT:    retq1013entry:1014  %0 = trunc nuw <4 x i64> %a to <4 x i32>1015  %1 = trunc nuw <4 x i64> %b to <4 x i32>1016  %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>1017  ret <8 x i32> %21018}1019 1020define <8 x i16> @trunc2x4i64_8i16_nsw(<4 x i64> %a, <4 x i64> %b) {1021; SSE-LABEL: trunc2x4i64_8i16_nsw:1022; SSE:       # %bb.0: # %entry1023; SSE-NEXT:    packssdw %xmm1, %xmm01024; SSE-NEXT:    packssdw %xmm3, %xmm21025; SSE-NEXT:    packssdw %xmm2, %xmm01026; SSE-NEXT:    retq1027;1028; AVX1-LABEL: trunc2x4i64_8i16_nsw:1029; AVX1:       # %bb.0: # %entry1030; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm21031; AVX1-NEXT:    vpackssdw %xmm2, %xmm0, %xmm01032; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm21033; AVX1-NEXT:    vpackssdw %xmm2, %xmm1, %xmm11034; AVX1-NEXT:    vpackssdw %xmm1, %xmm0, %xmm01035; AVX1-NEXT:    vzeroupper1036; AVX1-NEXT:    retq1037;1038; AVX2-LABEL: trunc2x4i64_8i16_nsw:1039; AVX2:       # %bb.0: # %entry1040; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm21041; AVX2-NEXT:    vpackssdw %xmm2, %xmm0, %xmm01042; AVX2-NEXT:    vextracti128 $1, %ymm1, %xmm21043; AVX2-NEXT:    vpackssdw %xmm2, %xmm1, %xmm11044; AVX2-NEXT:    vpackssdw %xmm1, %xmm0, %xmm01045; AVX2-NEXT:    vzeroupper1046; AVX2-NEXT:    retq1047;1048; AVX512F-LABEL: trunc2x4i64_8i16_nsw:1049; AVX512F:       # %bb.0: # %entry1050; AVX512F-NEXT:    # kill: def $ymm1 killed $ymm1 def $zmm11051; AVX512F-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm01052; AVX512F-NEXT:    vpmovqw %zmm0, %xmm01053; AVX512F-NEXT:    vpmovqw %zmm1, %xmm11054; AVX512F-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]1055; AVX512F-NEXT:    vzeroupper1056; AVX512F-NEXT:    retq1057;1058; AVX512VL-LABEL: trunc2x4i64_8i16_nsw:1059; AVX512VL:       # %bb.0: # %entry1060; AVX512VL-NEXT:    vpmovqw %ymm0, %xmm01061; AVX512VL-NEXT:    vpmovqw %ymm1, %xmm11062; AVX512VL-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]1063; AVX512VL-NEXT:    vzeroupper1064; AVX512VL-NEXT:    retq1065;1066; AVX512BW-LABEL: trunc2x4i64_8i16_nsw:1067; AVX512BW:       # %bb.0: # %entry1068; AVX512BW-NEXT:    # kill: def $ymm1 killed $ymm1 def $zmm11069; AVX512BW-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm01070; AVX512BW-NEXT:    vpmovqw %zmm0, %xmm01071; AVX512BW-NEXT:    vpmovqw %zmm1, %xmm11072; AVX512BW-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]1073; AVX512BW-NEXT:    vzeroupper1074; AVX512BW-NEXT:    retq1075;1076; AVX512BWVL-LABEL: trunc2x4i64_8i16_nsw:1077; AVX512BWVL:       # %bb.0: # %entry1078; AVX512BWVL-NEXT:    vpmovqw %ymm0, %xmm01079; AVX512BWVL-NEXT:    vpmovqw %ymm1, %xmm11080; AVX512BWVL-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]1081; AVX512BWVL-NEXT:    vzeroupper1082; AVX512BWVL-NEXT:    retq1083entry:1084  %0 = trunc nsw <4 x i64> %a to <4 x i16>1085  %1 = trunc nsw <4 x i64> %b to <4 x i16>1086  %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>1087  ret <8 x i16> %21088}1089 1090define <8 x i16> @trunc2x4i64_8i16_nuw(<4 x i64> %a, <4 x i64> %b) {1091; SSE2-SSSE3-LABEL: trunc2x4i64_8i16_nuw:1092; SSE2-SSSE3:       # %bb.0: # %entry1093; SSE2-SSSE3-NEXT:    shufps {{.*#+}} xmm0 = xmm0[0,2],xmm1[0,2]1094; SSE2-SSSE3-NEXT:    pslld $16, %xmm01095; SSE2-SSSE3-NEXT:    psrad $16, %xmm01096; SSE2-SSSE3-NEXT:    shufps {{.*#+}} xmm2 = xmm2[0,2],xmm3[0,2]1097; SSE2-SSSE3-NEXT:    pslld $16, %xmm21098; SSE2-SSSE3-NEXT:    psrad $16, %xmm21099; SSE2-SSSE3-NEXT:    packssdw %xmm2, %xmm01100; SSE2-SSSE3-NEXT:    retq1101;1102; SSE41-LABEL: trunc2x4i64_8i16_nuw:1103; SSE41:       # %bb.0: # %entry1104; SSE41-NEXT:    packusdw %xmm1, %xmm01105; SSE41-NEXT:    packusdw %xmm3, %xmm21106; SSE41-NEXT:    packusdw %xmm2, %xmm01107; SSE41-NEXT:    retq1108;1109; AVX1-LABEL: trunc2x4i64_8i16_nuw:1110; AVX1:       # %bb.0: # %entry1111; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm21112; AVX1-NEXT:    vpackusdw %xmm2, %xmm0, %xmm01113; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm21114; AVX1-NEXT:    vpackusdw %xmm2, %xmm1, %xmm11115; AVX1-NEXT:    vpackusdw %xmm1, %xmm0, %xmm01116; AVX1-NEXT:    vzeroupper1117; AVX1-NEXT:    retq1118;1119; AVX2-LABEL: trunc2x4i64_8i16_nuw:1120; AVX2:       # %bb.0: # %entry1121; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm21122; AVX2-NEXT:    vpackusdw %xmm2, %xmm0, %xmm01123; AVX2-NEXT:    vextracti128 $1, %ymm1, %xmm21124; AVX2-NEXT:    vpackusdw %xmm2, %xmm1, %xmm11125; AVX2-NEXT:    vpackusdw %xmm1, %xmm0, %xmm01126; AVX2-NEXT:    vzeroupper1127; AVX2-NEXT:    retq1128;1129; AVX512F-LABEL: trunc2x4i64_8i16_nuw:1130; AVX512F:       # %bb.0: # %entry1131; AVX512F-NEXT:    # kill: def $ymm1 killed $ymm1 def $zmm11132; AVX512F-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm01133; AVX512F-NEXT:    vpmovqw %zmm0, %xmm01134; AVX512F-NEXT:    vpmovqw %zmm1, %xmm11135; AVX512F-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]1136; AVX512F-NEXT:    vzeroupper1137; AVX512F-NEXT:    retq1138;1139; AVX512VL-LABEL: trunc2x4i64_8i16_nuw:1140; AVX512VL:       # %bb.0: # %entry1141; AVX512VL-NEXT:    vpmovqw %ymm0, %xmm01142; AVX512VL-NEXT:    vpmovqw %ymm1, %xmm11143; AVX512VL-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]1144; AVX512VL-NEXT:    vzeroupper1145; AVX512VL-NEXT:    retq1146;1147; AVX512BW-LABEL: trunc2x4i64_8i16_nuw:1148; AVX512BW:       # %bb.0: # %entry1149; AVX512BW-NEXT:    # kill: def $ymm1 killed $ymm1 def $zmm11150; AVX512BW-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm01151; AVX512BW-NEXT:    vpmovqw %zmm0, %xmm01152; AVX512BW-NEXT:    vpmovqw %zmm1, %xmm11153; AVX512BW-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]1154; AVX512BW-NEXT:    vzeroupper1155; AVX512BW-NEXT:    retq1156;1157; AVX512BWVL-LABEL: trunc2x4i64_8i16_nuw:1158; AVX512BWVL:       # %bb.0: # %entry1159; AVX512BWVL-NEXT:    vpmovqw %ymm0, %xmm01160; AVX512BWVL-NEXT:    vpmovqw %ymm1, %xmm11161; AVX512BWVL-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]1162; AVX512BWVL-NEXT:    vzeroupper1163; AVX512BWVL-NEXT:    retq1164entry:1165  %0 = trunc nuw <4 x i64> %a to <4 x i16>1166  %1 = trunc nuw <4 x i64> %b to <4 x i16>1167  %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>1168  ret <8 x i16> %21169}1170 1171define <4 x i32> @trunc2x2i64_4i32_nsw(<2 x i64> %a, <2 x i64> %b) {1172; SSE-LABEL: trunc2x2i64_4i32_nsw:1173; SSE:       # %bb.0: # %entry1174; SSE-NEXT:    shufps {{.*#+}} xmm0 = xmm0[0,2],xmm1[0,2]1175; SSE-NEXT:    retq1176;1177; AVX-LABEL: trunc2x2i64_4i32_nsw:1178; AVX:       # %bb.0: # %entry1179; AVX-NEXT:    vshufps {{.*#+}} xmm0 = xmm0[0,2],xmm1[0,2]1180; AVX-NEXT:    retq1181;1182; AVX512F-LABEL: trunc2x2i64_4i32_nsw:1183; AVX512F:       # %bb.0: # %entry1184; AVX512F-NEXT:    vshufps {{.*#+}} xmm0 = xmm0[0,2],xmm1[0,2]1185; AVX512F-NEXT:    retq1186;1187; AVX512VL-LABEL: trunc2x2i64_4i32_nsw:1188; AVX512VL:       # %bb.0: # %entry1189; AVX512VL-NEXT:    # kill: def $xmm0 killed $xmm0 def $ymm01190; AVX512VL-NEXT:    vinserti128 $1, %xmm1, %ymm0, %ymm01191; AVX512VL-NEXT:    vpmovqd %ymm0, %xmm01192; AVX512VL-NEXT:    vzeroupper1193; AVX512VL-NEXT:    retq1194;1195; AVX512BW-LABEL: trunc2x2i64_4i32_nsw:1196; AVX512BW:       # %bb.0: # %entry1197; AVX512BW-NEXT:    vshufps {{.*#+}} xmm0 = xmm0[0,2],xmm1[0,2]1198; AVX512BW-NEXT:    retq1199;1200; AVX512BWVL-LABEL: trunc2x2i64_4i32_nsw:1201; AVX512BWVL:       # %bb.0: # %entry1202; AVX512BWVL-NEXT:    # kill: def $xmm0 killed $xmm0 def $ymm01203; AVX512BWVL-NEXT:    vinserti128 $1, %xmm1, %ymm0, %ymm01204; AVX512BWVL-NEXT:    vpmovqd %ymm0, %xmm01205; AVX512BWVL-NEXT:    vzeroupper1206; AVX512BWVL-NEXT:    retq1207entry:1208  %0 = trunc nsw <2 x i64> %a to <2 x i32>1209  %1 = trunc nsw <2 x i64> %b to <2 x i32>1210  %2 = shufflevector <2 x i32> %0, <2 x i32> %1, <4 x i32> <i32 0, i32 1, i32 2, i32 3>1211  ret <4 x i32> %21212}1213 1214define <4 x i32> @trunc2x2i64_4i32_nuw(<2 x i64> %a, <2 x i64> %b) {1215; SSE-LABEL: trunc2x2i64_4i32_nuw:1216; SSE:       # %bb.0: # %entry1217; SSE-NEXT:    shufps {{.*#+}} xmm0 = xmm0[0,2],xmm1[0,2]1218; SSE-NEXT:    retq1219;1220; AVX-LABEL: trunc2x2i64_4i32_nuw:1221; AVX:       # %bb.0: # %entry1222; AVX-NEXT:    vshufps {{.*#+}} xmm0 = xmm0[0,2],xmm1[0,2]1223; AVX-NEXT:    retq1224;1225; AVX512F-LABEL: trunc2x2i64_4i32_nuw:1226; AVX512F:       # %bb.0: # %entry1227; AVX512F-NEXT:    vshufps {{.*#+}} xmm0 = xmm0[0,2],xmm1[0,2]1228; AVX512F-NEXT:    retq1229;1230; AVX512VL-LABEL: trunc2x2i64_4i32_nuw:1231; AVX512VL:       # %bb.0: # %entry1232; AVX512VL-NEXT:    # kill: def $xmm0 killed $xmm0 def $ymm01233; AVX512VL-NEXT:    vinserti128 $1, %xmm1, %ymm0, %ymm01234; AVX512VL-NEXT:    vpmovqd %ymm0, %xmm01235; AVX512VL-NEXT:    vzeroupper1236; AVX512VL-NEXT:    retq1237;1238; AVX512BW-LABEL: trunc2x2i64_4i32_nuw:1239; AVX512BW:       # %bb.0: # %entry1240; AVX512BW-NEXT:    vshufps {{.*#+}} xmm0 = xmm0[0,2],xmm1[0,2]1241; AVX512BW-NEXT:    retq1242;1243; AVX512BWVL-LABEL: trunc2x2i64_4i32_nuw:1244; AVX512BWVL:       # %bb.0: # %entry1245; AVX512BWVL-NEXT:    # kill: def $xmm0 killed $xmm0 def $ymm01246; AVX512BWVL-NEXT:    vinserti128 $1, %xmm1, %ymm0, %ymm01247; AVX512BWVL-NEXT:    vpmovqd %ymm0, %xmm01248; AVX512BWVL-NEXT:    vzeroupper1249; AVX512BWVL-NEXT:    retq1250entry:1251  %0 = trunc nuw <2 x i64> %a to <2 x i32>1252  %1 = trunc nuw <2 x i64> %b to <2 x i32>1253  %2 = shufflevector <2 x i32> %0, <2 x i32> %1, <4 x i32> <i32 0, i32 1, i32 2, i32 3>1254  ret <4 x i32> %21255}1256 1257define <8 x i16> @trunc2x4i32_8i16_nsw(<4 x i32> %a, <4 x i32> %b) {1258; SSE-LABEL: trunc2x4i32_8i16_nsw:1259; SSE:       # %bb.0: # %entry1260; SSE-NEXT:    packssdw %xmm1, %xmm01261; SSE-NEXT:    retq1262;1263; AVX-LABEL: trunc2x4i32_8i16_nsw:1264; AVX:       # %bb.0: # %entry1265; AVX-NEXT:    vpackssdw %xmm1, %xmm0, %xmm01266; AVX-NEXT:    retq1267;1268; AVX512-LABEL: trunc2x4i32_8i16_nsw:1269; AVX512:       # %bb.0: # %entry1270; AVX512-NEXT:    vpackssdw %xmm1, %xmm0, %xmm01271; AVX512-NEXT:    retq1272entry:1273  %0 = trunc nsw <4 x i32> %a to <4 x i16>1274  %1 = trunc nsw <4 x i32> %b to <4 x i16>1275  %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>1276  ret <8 x i16> %21277}1278 1279define <8 x i16> @trunc2x4i32_8i16_nuw(<4 x i32> %a, <4 x i32> %b) {1280; SSE2-LABEL: trunc2x4i32_8i16_nuw:1281; SSE2:       # %bb.0: # %entry1282; SSE2-NEXT:    pslld $16, %xmm11283; SSE2-NEXT:    psrad $16, %xmm11284; SSE2-NEXT:    pslld $16, %xmm01285; SSE2-NEXT:    psrad $16, %xmm01286; SSE2-NEXT:    packssdw %xmm1, %xmm01287; SSE2-NEXT:    retq1288;1289; SSSE3-LABEL: trunc2x4i32_8i16_nuw:1290; SSSE3:       # %bb.0: # %entry1291; SSSE3-NEXT:    movdqa {{.*#+}} xmm2 = [0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15]1292; SSSE3-NEXT:    pshufb %xmm2, %xmm11293; SSSE3-NEXT:    pshufb %xmm2, %xmm01294; SSSE3-NEXT:    punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]1295; SSSE3-NEXT:    retq1296;1297; SSE41-LABEL: trunc2x4i32_8i16_nuw:1298; SSE41:       # %bb.0: # %entry1299; SSE41-NEXT:    packusdw %xmm1, %xmm01300; SSE41-NEXT:    retq1301;1302; AVX-LABEL: trunc2x4i32_8i16_nuw:1303; AVX:       # %bb.0: # %entry1304; AVX-NEXT:    vpackusdw %xmm1, %xmm0, %xmm01305; AVX-NEXT:    retq1306;1307; AVX512-LABEL: trunc2x4i32_8i16_nuw:1308; AVX512:       # %bb.0: # %entry1309; AVX512-NEXT:    vpackusdw %xmm1, %xmm0, %xmm01310; AVX512-NEXT:    retq1311entry:1312  %0 = trunc nuw <4 x i32> %a to <4 x i16>1313  %1 = trunc nuw <4 x i32> %b to <4 x i16>1314  %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>1315  ret <8 x i16> %21316}1317 1318define <32 x i8> @trunc2x16i16_32i8_nsw(<16 x i16> %a, <16 x i16> %b) {1319; SSE-LABEL: trunc2x16i16_32i8_nsw:1320; SSE:       # %bb.0: # %entry1321; SSE-NEXT:    packsswb %xmm1, %xmm01322; SSE-NEXT:    packsswb %xmm3, %xmm21323; SSE-NEXT:    movdqa %xmm2, %xmm11324; SSE-NEXT:    retq1325;1326; AVX1-LABEL: trunc2x16i16_32i8_nsw:1327; AVX1:       # %bb.0: # %entry1328; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm21329; AVX1-NEXT:    vpacksswb %xmm2, %xmm0, %xmm01330; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm21331; AVX1-NEXT:    vpacksswb %xmm2, %xmm1, %xmm11332; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm01333; AVX1-NEXT:    retq1334;1335; AVX2-LABEL: trunc2x16i16_32i8_nsw:1336; AVX2:       # %bb.0: # %entry1337; AVX2-NEXT:    vpacksswb %ymm1, %ymm0, %ymm01338; AVX2-NEXT:    vpermq {{.*#+}} ymm0 = ymm0[0,2,1,3]1339; AVX2-NEXT:    retq1340;1341; AVX512F-LABEL: trunc2x16i16_32i8_nsw:1342; AVX512F:       # %bb.0: # %entry1343; 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],zero1344; AVX512F-NEXT:    vpmovdb %zmm0, %xmm01345; 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],zero1346; AVX512F-NEXT:    vpmovdb %zmm1, %xmm11347; AVX512F-NEXT:    vinserti128 $1, %xmm1, %ymm0, %ymm01348; AVX512F-NEXT:    retq1349;1350; AVX512VL-LABEL: trunc2x16i16_32i8_nsw:1351; AVX512VL:       # %bb.0: # %entry1352; 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],zero1353; AVX512VL-NEXT:    vpmovdb %zmm0, %xmm01354; 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],zero1355; AVX512VL-NEXT:    vpmovdb %zmm1, %xmm11356; AVX512VL-NEXT:    vinserti128 $1, %xmm1, %ymm0, %ymm01357; AVX512VL-NEXT:    retq1358;1359; AVX512BW-LABEL: trunc2x16i16_32i8_nsw:1360; AVX512BW:       # %bb.0: # %entry1361; AVX512BW-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm01362; AVX512BW-NEXT:    vinserti64x4 $1, %ymm1, %zmm0, %zmm01363; AVX512BW-NEXT:    vpmovwb %zmm0, %ymm01364; AVX512BW-NEXT:    retq1365;1366; AVX512BWVL-LABEL: trunc2x16i16_32i8_nsw:1367; AVX512BWVL:       # %bb.0: # %entry1368; AVX512BWVL-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm01369; AVX512BWVL-NEXT:    vinserti64x4 $1, %ymm1, %zmm0, %zmm01370; AVX512BWVL-NEXT:    vpmovwb %zmm0, %ymm01371; AVX512BWVL-NEXT:    retq1372entry:1373  %0 = trunc nsw <16 x i16> %a to <16 x i8>1374  %1 = trunc nsw <16 x i16> %b to <16 x i8>1375  %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>1376  ret <32 x i8> %21377}1378 1379define <32 x i8> @trunc2x16i16_32i8_nuw(<16 x i16> %a, <16 x i16> %b) {1380; SSE-LABEL: trunc2x16i16_32i8_nuw:1381; SSE:       # %bb.0: # %entry1382; SSE-NEXT:    packuswb %xmm1, %xmm01383; SSE-NEXT:    packuswb %xmm3, %xmm21384; SSE-NEXT:    movdqa %xmm2, %xmm11385; SSE-NEXT:    retq1386;1387; AVX1-LABEL: trunc2x16i16_32i8_nuw:1388; AVX1:       # %bb.0: # %entry1389; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm21390; AVX1-NEXT:    vpackuswb %xmm2, %xmm0, %xmm01391; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm21392; AVX1-NEXT:    vpackuswb %xmm2, %xmm1, %xmm11393; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm01394; AVX1-NEXT:    retq1395;1396; AVX2-LABEL: trunc2x16i16_32i8_nuw:1397; AVX2:       # %bb.0: # %entry1398; AVX2-NEXT:    vpackuswb %ymm1, %ymm0, %ymm01399; AVX2-NEXT:    vpermq {{.*#+}} ymm0 = ymm0[0,2,1,3]1400; AVX2-NEXT:    retq1401;1402; AVX512F-LABEL: trunc2x16i16_32i8_nuw:1403; AVX512F:       # %bb.0: # %entry1404; 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],zero1405; AVX512F-NEXT:    vpmovdb %zmm0, %xmm01406; 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],zero1407; AVX512F-NEXT:    vpmovdb %zmm1, %xmm11408; AVX512F-NEXT:    vinserti128 $1, %xmm1, %ymm0, %ymm01409; AVX512F-NEXT:    retq1410;1411; AVX512VL-LABEL: trunc2x16i16_32i8_nuw:1412; AVX512VL:       # %bb.0: # %entry1413; 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],zero1414; AVX512VL-NEXT:    vpmovdb %zmm0, %xmm01415; 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],zero1416; AVX512VL-NEXT:    vpmovdb %zmm1, %xmm11417; AVX512VL-NEXT:    vinserti128 $1, %xmm1, %ymm0, %ymm01418; AVX512VL-NEXT:    retq1419;1420; AVX512BW-LABEL: trunc2x16i16_32i8_nuw:1421; AVX512BW:       # %bb.0: # %entry1422; AVX512BW-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm01423; AVX512BW-NEXT:    vinserti64x4 $1, %ymm1, %zmm0, %zmm01424; AVX512BW-NEXT:    vpmovwb %zmm0, %ymm01425; AVX512BW-NEXT:    retq1426;1427; AVX512BWVL-LABEL: trunc2x16i16_32i8_nuw:1428; AVX512BWVL:       # %bb.0: # %entry1429; AVX512BWVL-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm01430; AVX512BWVL-NEXT:    vinserti64x4 $1, %ymm1, %zmm0, %zmm01431; AVX512BWVL-NEXT:    vpmovwb %zmm0, %ymm01432; AVX512BWVL-NEXT:    retq1433entry:1434  %0 = trunc nuw <16 x i16> %a to <16 x i8>1435  %1 = trunc nuw <16 x i16> %b to <16 x i8>1436  %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>1437  ret <32 x i8> %21438}1439 1440define <16 x i8> @trunc2x8i16_16i8_nsw(<8 x i16> %a, <8 x i16> %b) {1441; SSE-LABEL: trunc2x8i16_16i8_nsw:1442; SSE:       # %bb.0: # %entry1443; SSE-NEXT:    packsswb %xmm1, %xmm01444; SSE-NEXT:    retq1445;1446; AVX-LABEL: trunc2x8i16_16i8_nsw:1447; AVX:       # %bb.0: # %entry1448; AVX-NEXT:    vpacksswb %xmm1, %xmm0, %xmm01449; AVX-NEXT:    retq1450;1451; AVX512-LABEL: trunc2x8i16_16i8_nsw:1452; AVX512:       # %bb.0: # %entry1453; AVX512-NEXT:    vpacksswb %xmm1, %xmm0, %xmm01454; AVX512-NEXT:    retq1455entry:1456  %0 = trunc nsw <8 x i16> %a to <8 x i8>1457  %1 = trunc nsw <8 x i16> %b to <8 x i8>1458  %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>1459  ret <16 x i8> %21460}1461 1462define <16 x i8> @trunc2x8i16_16i8_nuw(<8 x i16> %a, <8 x i16> %b) {1463; SSE-LABEL: trunc2x8i16_16i8_nuw:1464; SSE:       # %bb.0: # %entry1465; SSE-NEXT:    packuswb %xmm1, %xmm01466; SSE-NEXT:    retq1467;1468; AVX-LABEL: trunc2x8i16_16i8_nuw:1469; AVX:       # %bb.0: # %entry1470; AVX-NEXT:    vpackuswb %xmm1, %xmm0, %xmm01471; AVX-NEXT:    retq1472;1473; AVX512-LABEL: trunc2x8i16_16i8_nuw:1474; AVX512:       # %bb.0: # %entry1475; AVX512-NEXT:    vpackuswb %xmm1, %xmm0, %xmm01476; AVX512-NEXT:    retq1477entry:1478  %0 = trunc nuw <8 x i16> %a to <8 x i8>1479  %1 = trunc nuw <8 x i16> %b to <8 x i8>1480  %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>1481  ret <16 x i8> %21482}1483 1484define i64 @trunc8i16_i64_nsw(<8 x i16> %inval) {1485; SSE-LABEL: trunc8i16_i64_nsw:1486; SSE:       # %bb.0: # %entry1487; SSE-NEXT:    packsswb %xmm0, %xmm01488; SSE-NEXT:    movq %xmm0, %rax1489; SSE-NEXT:    retq1490;1491; AVX-LABEL: trunc8i16_i64_nsw:1492; AVX:       # %bb.0: # %entry1493; AVX-NEXT:    vpacksswb %xmm0, %xmm0, %xmm01494; AVX-NEXT:    vmovq %xmm0, %rax1495; AVX-NEXT:    retq1496;1497; AVX512-LABEL: trunc8i16_i64_nsw:1498; AVX512:       # %bb.0: # %entry1499; AVX512-NEXT:    vpacksswb %xmm0, %xmm0, %xmm01500; AVX512-NEXT:    vmovq %xmm0, %rax1501; AVX512-NEXT:    retq1502entry:1503  %0 = trunc nsw <8 x i16> %inval to <8 x i8>1504  %1 = bitcast <8 x i8> %0 to i641505  ret i64 %11506}1507 1508define i64 @trunc8i16_i64_nuw(<8 x i16> %inval) {1509; SSE-LABEL: trunc8i16_i64_nuw:1510; SSE:       # %bb.0: # %entry1511; SSE-NEXT:    packuswb %xmm0, %xmm01512; SSE-NEXT:    movq %xmm0, %rax1513; SSE-NEXT:    retq1514;1515; AVX-LABEL: trunc8i16_i64_nuw:1516; AVX:       # %bb.0: # %entry1517; AVX-NEXT:    vpackuswb %xmm0, %xmm0, %xmm01518; AVX-NEXT:    vmovq %xmm0, %rax1519; AVX-NEXT:    retq1520;1521; AVX512-LABEL: trunc8i16_i64_nuw:1522; AVX512:       # %bb.0: # %entry1523; AVX512-NEXT:    vpackuswb %xmm0, %xmm0, %xmm01524; AVX512-NEXT:    vmovq %xmm0, %rax1525; AVX512-NEXT:    retq1526entry:1527  %0 = trunc nuw <8 x i16> %inval to <8 x i8>1528  %1 = bitcast <8 x i8> %0 to i641529  ret i64 %11530}1531 1532define void @foo(<4 x i64> %a, <4 x i64> %b, ptr %p) "min-legal-vector-width"="256" "prefer-vector-width"="256" {1533; SSE-LABEL: foo:1534; SSE:       # %bb.0: # %entry1535; SSE-NEXT:    shufps {{.*#+}} xmm0 = xmm0[0,2],xmm1[0,2]1536; SSE-NEXT:    shufps {{.*#+}} xmm2 = xmm2[0,2],xmm3[0,2]1537; SSE-NEXT:    movaps %xmm2, 16(%rdi)1538; SSE-NEXT:    movaps %xmm0, (%rdi)1539; SSE-NEXT:    retq1540;1541; AVX1-LABEL: foo:1542; AVX1:       # %bb.0: # %entry1543; AVX1-NEXT:    vperm2f128 {{.*#+}} ymm2 = ymm0[2,3],ymm1[2,3]1544; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm01545; AVX1-NEXT:    vshufps {{.*#+}} ymm0 = ymm0[0,2],ymm2[0,2],ymm0[4,6],ymm2[4,6]1546; AVX1-NEXT:    vmovups %ymm0, (%rdi)1547; AVX1-NEXT:    vzeroupper1548; AVX1-NEXT:    retq1549;1550; AVX2-LABEL: foo:1551; AVX2:       # %bb.0: # %entry1552; AVX2-NEXT:    vshufps {{.*#+}} ymm0 = ymm0[0,2],ymm1[0,2],ymm0[4,6],ymm1[4,6]1553; AVX2-NEXT:    vpermpd {{.*#+}} ymm0 = ymm0[0,2,1,3]1554; AVX2-NEXT:    vmovups %ymm0, (%rdi)1555; AVX2-NEXT:    vzeroupper1556; AVX2-NEXT:    retq1557;1558; AVX512F-LABEL: foo:1559; AVX512F:       # %bb.0: # %entry1560; AVX512F-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm01561; AVX512F-NEXT:    vinserti64x4 $1, %ymm1, %zmm0, %zmm01562; AVX512F-NEXT:    vpmovqd %zmm0, (%rdi)1563; AVX512F-NEXT:    vzeroupper1564; AVX512F-NEXT:    retq1565;1566; AVX512VL-LABEL: foo:1567; AVX512VL:       # %bb.0: # %entry1568; AVX512VL-NEXT:    vpmovqd %ymm1, 16(%rdi)1569; AVX512VL-NEXT:    vpmovqd %ymm0, (%rdi)1570; AVX512VL-NEXT:    vzeroupper1571; AVX512VL-NEXT:    retq1572;1573; AVX512BW-LABEL: foo:1574; AVX512BW:       # %bb.0: # %entry1575; AVX512BW-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm01576; AVX512BW-NEXT:    vinserti64x4 $1, %ymm1, %zmm0, %zmm01577; AVX512BW-NEXT:    vpmovqd %zmm0, (%rdi)1578; AVX512BW-NEXT:    vzeroupper1579; AVX512BW-NEXT:    retq1580;1581; AVX512BWVL-LABEL: foo:1582; AVX512BWVL:       # %bb.0: # %entry1583; AVX512BWVL-NEXT:    vpmovqd %ymm1, 16(%rdi)1584; AVX512BWVL-NEXT:    vpmovqd %ymm0, (%rdi)1585; AVX512BWVL-NEXT:    vzeroupper1586; AVX512BWVL-NEXT:    retq1587entry:1588  %0 = shufflevector <4 x i64> %a, <4 x i64> %b, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>1589  %1 = trunc nsw <8 x i64> %0 to <8 x i32>1590  store <8 x i32> %1, ptr %p, align 161591  ret void1592}1593