4665 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=SSE3; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx | FileCheck %s --check-prefixes=AVX,AVX14; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx2 | FileCheck %s --check-prefixes=AVX,AVX2,AVX2-SLOW5; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx2,+fast-variable-crosslane-shuffle,+fast-variable-perlane-shuffle | FileCheck %s --check-prefixes=AVX,AVX2,AVX2-FAST-ALL6; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx2,+fast-variable-perlane-shuffle | FileCheck %s --check-prefixes=AVX,AVX2,AVX2-FAST-PERLANE7; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f | FileCheck %s --check-prefixes=AVX,AVX512,AVX512F8; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512bw,+fast-variable-crosslane-shuffle,+fast-variable-perlane-shuffle | FileCheck %s --check-prefixes=AVX,AVX512,AVX512BW9; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512bw,+fast-variable-perlane-shuffle | FileCheck %s --check-prefixes=AVX,AVX512,AVX512BW10; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512dq,+fast-variable-crosslane-shuffle,+fast-variable-perlane-shuffle | FileCheck %s --check-prefixes=AVX,AVX512,AVX512DQ11; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512dq,+fast-variable-perlane-shuffle | FileCheck %s --check-prefixes=AVX,AVX512,AVX512DQ12 13;14; add15;16 17define <4 x i32> @trunc_add_v4i64_v4i32(<4 x i64> %a0, <4 x i64> %a1) nounwind {18; SSE-LABEL: trunc_add_v4i64_v4i32:19; SSE: # %bb.0:20; SSE-NEXT: paddq %xmm3, %xmm121; SSE-NEXT: paddq %xmm2, %xmm022; SSE-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,2],xmm1[0,2]23; SSE-NEXT: retq24;25; AVX1-LABEL: trunc_add_v4i64_v4i32:26; AVX1: # %bb.0:27; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm228; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm329; AVX1-NEXT: vpaddq %xmm2, %xmm3, %xmm230; AVX1-NEXT: vpaddq %xmm1, %xmm0, %xmm031; AVX1-NEXT: vshufps {{.*#+}} xmm0 = xmm0[0,2],xmm2[0,2]32; AVX1-NEXT: vzeroupper33; AVX1-NEXT: retq34;35; AVX2-SLOW-LABEL: trunc_add_v4i64_v4i32:36; AVX2-SLOW: # %bb.0:37; AVX2-SLOW-NEXT: vpaddq %ymm1, %ymm0, %ymm038; AVX2-SLOW-NEXT: vextracti128 $1, %ymm0, %xmm139; AVX2-SLOW-NEXT: vshufps {{.*#+}} xmm0 = xmm0[0,2],xmm1[0,2]40; AVX2-SLOW-NEXT: vzeroupper41; AVX2-SLOW-NEXT: retq42;43; AVX2-FAST-ALL-LABEL: trunc_add_v4i64_v4i32:44; AVX2-FAST-ALL: # %bb.0:45; AVX2-FAST-ALL-NEXT: vpaddq %ymm1, %ymm0, %ymm046; AVX2-FAST-ALL-NEXT: vpmovsxbd {{.*#+}} ymm1 = [0,2,4,6,0,0,0,0]47; AVX2-FAST-ALL-NEXT: vpermd %ymm0, %ymm1, %ymm048; AVX2-FAST-ALL-NEXT: # kill: def $xmm0 killed $xmm0 killed $ymm049; AVX2-FAST-ALL-NEXT: vzeroupper50; AVX2-FAST-ALL-NEXT: retq51;52; AVX2-FAST-PERLANE-LABEL: trunc_add_v4i64_v4i32:53; AVX2-FAST-PERLANE: # %bb.0:54; AVX2-FAST-PERLANE-NEXT: vpaddq %ymm1, %ymm0, %ymm055; AVX2-FAST-PERLANE-NEXT: vextracti128 $1, %ymm0, %xmm156; AVX2-FAST-PERLANE-NEXT: vshufps {{.*#+}} xmm0 = xmm0[0,2],xmm1[0,2]57; AVX2-FAST-PERLANE-NEXT: vzeroupper58; AVX2-FAST-PERLANE-NEXT: retq59;60; AVX512-LABEL: trunc_add_v4i64_v4i32:61; AVX512: # %bb.0:62; AVX512-NEXT: vpaddq %ymm1, %ymm0, %ymm063; AVX512-NEXT: vpmovqd %zmm0, %ymm064; AVX512-NEXT: # kill: def $xmm0 killed $xmm0 killed $ymm065; AVX512-NEXT: vzeroupper66; AVX512-NEXT: retq67 %1 = add <4 x i64> %a0, %a168 %2 = trunc <4 x i64> %1 to <4 x i32>69 ret <4 x i32> %270}71 72define <8 x i16> @trunc_add_v8i64_v8i16(<8 x i64> %a0, <8 x i64> %a1) nounwind {73; SSE-LABEL: trunc_add_v8i64_v8i16:74; SSE: # %bb.0:75; SSE-NEXT: paddq %xmm5, %xmm176; SSE-NEXT: paddq %xmm4, %xmm077; SSE-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,2],xmm1[0,2]78; SSE-NEXT: paddq %xmm7, %xmm379; SSE-NEXT: paddq %xmm6, %xmm280; SSE-NEXT: shufps {{.*#+}} xmm2 = xmm2[0,2],xmm3[0,2]81; SSE-NEXT: pslld $16, %xmm282; SSE-NEXT: psrad $16, %xmm283; SSE-NEXT: pslld $16, %xmm084; SSE-NEXT: psrad $16, %xmm085; SSE-NEXT: packssdw %xmm2, %xmm086; SSE-NEXT: retq87;88; AVX1-LABEL: trunc_add_v8i64_v8i16:89; AVX1: # %bb.0:90; AVX1-NEXT: vpaddq %xmm2, %xmm0, %xmm491; AVX1-NEXT: vextractf128 $1, %ymm2, %xmm292; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm093; AVX1-NEXT: vpaddq %xmm2, %xmm0, %xmm094; AVX1-NEXT: vpaddq %xmm3, %xmm1, %xmm295; AVX1-NEXT: vextractf128 $1, %ymm3, %xmm396; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm197; AVX1-NEXT: vpaddq %xmm3, %xmm1, %xmm198; AVX1-NEXT: vpxor %xmm3, %xmm3, %xmm399; AVX1-NEXT: vpblendw {{.*#+}} xmm1 = xmm1[0],xmm3[1,2,3],xmm1[4],xmm3[5,6,7]100; AVX1-NEXT: vpblendw {{.*#+}} xmm2 = xmm2[0],xmm3[1,2,3],xmm2[4],xmm3[5,6,7]101; AVX1-NEXT: vpackusdw %xmm1, %xmm2, %xmm1102; AVX1-NEXT: vpblendw {{.*#+}} xmm0 = xmm0[0],xmm3[1,2,3],xmm0[4],xmm3[5,6,7]103; AVX1-NEXT: vpblendw {{.*#+}} xmm2 = xmm4[0],xmm3[1,2,3],xmm4[4],xmm3[5,6,7]104; AVX1-NEXT: vpackusdw %xmm0, %xmm2, %xmm0105; AVX1-NEXT: vpackusdw %xmm1, %xmm0, %xmm0106; AVX1-NEXT: vzeroupper107; AVX1-NEXT: retq108;109; AVX2-LABEL: trunc_add_v8i64_v8i16:110; AVX2: # %bb.0:111; AVX2-NEXT: vpaddq %ymm2, %ymm0, %ymm0112; AVX2-NEXT: vpaddq %ymm3, %ymm1, %ymm1113; AVX2-NEXT: vpxor %xmm2, %xmm2, %xmm2114; 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]115; 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]116; AVX2-NEXT: vpackusdw %ymm1, %ymm0, %ymm0117; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1118; AVX2-NEXT: vpackusdw %xmm1, %xmm0, %xmm0119; AVX2-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[0,2,1,3]120; AVX2-NEXT: vzeroupper121; AVX2-NEXT: retq122;123; AVX512-LABEL: trunc_add_v8i64_v8i16:124; AVX512: # %bb.0:125; AVX512-NEXT: vpaddq %zmm1, %zmm0, %zmm0126; AVX512-NEXT: vpmovqw %zmm0, %xmm0127; AVX512-NEXT: vzeroupper128; AVX512-NEXT: retq129 %1 = add <8 x i64> %a0, %a1130 %2 = trunc <8 x i64> %1 to <8 x i16>131 ret <8 x i16> %2132}133 134define <8 x i16> @trunc_add_v8i32_v8i16(<8 x i32> %a0, <8 x i32> %a1) nounwind {135; SSE-LABEL: trunc_add_v8i32_v8i16:136; SSE: # %bb.0:137; SSE-NEXT: paddd %xmm2, %xmm0138; SSE-NEXT: paddd %xmm3, %xmm1139; SSE-NEXT: pslld $16, %xmm1140; SSE-NEXT: psrad $16, %xmm1141; SSE-NEXT: pslld $16, %xmm0142; SSE-NEXT: psrad $16, %xmm0143; SSE-NEXT: packssdw %xmm1, %xmm0144; SSE-NEXT: retq145;146; AVX1-LABEL: trunc_add_v8i32_v8i16:147; AVX1: # %bb.0:148; AVX1-NEXT: vpaddd %xmm1, %xmm0, %xmm2149; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm1150; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm0151; AVX1-NEXT: vpaddd %xmm1, %xmm0, %xmm0152; AVX1-NEXT: vpxor %xmm1, %xmm1, %xmm1153; AVX1-NEXT: vpblendw {{.*#+}} xmm0 = xmm0[0],xmm1[1],xmm0[2],xmm1[3],xmm0[4],xmm1[5],xmm0[6],xmm1[7]154; AVX1-NEXT: vpblendw {{.*#+}} xmm1 = xmm2[0],xmm1[1],xmm2[2],xmm1[3],xmm2[4],xmm1[5],xmm2[6],xmm1[7]155; AVX1-NEXT: vpackusdw %xmm0, %xmm1, %xmm0156; AVX1-NEXT: vzeroupper157; AVX1-NEXT: retq158;159; AVX2-LABEL: trunc_add_v8i32_v8i16:160; AVX2: # %bb.0:161; AVX2-NEXT: vpaddd %ymm1, %ymm0, %ymm0162; 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]163; AVX2-NEXT: vpermq {{.*#+}} ymm0 = ymm0[0,2,2,3]164; AVX2-NEXT: # kill: def $xmm0 killed $xmm0 killed $ymm0165; AVX2-NEXT: vzeroupper166; AVX2-NEXT: retq167;168; AVX512-LABEL: trunc_add_v8i32_v8i16:169; AVX512: # %bb.0:170; AVX512-NEXT: vpaddd %ymm1, %ymm0, %ymm0171; AVX512-NEXT: vpmovdw %zmm0, %ymm0172; AVX512-NEXT: # kill: def $xmm0 killed $xmm0 killed $ymm0173; AVX512-NEXT: vzeroupper174; AVX512-NEXT: retq175 %1 = add <8 x i32> %a0, %a1176 %2 = trunc <8 x i32> %1 to <8 x i16>177 ret <8 x i16> %2178}179 180define <16 x i8> @trunc_add_v16i64_v16i8(<16 x i64> %a0, <16 x i64> %a1) nounwind {181; SSE-LABEL: trunc_add_v16i64_v16i8:182; SSE: # %bb.0:183; SSE-NEXT: paddq {{[0-9]+}}(%rsp), %xmm0184; SSE-NEXT: paddq {{[0-9]+}}(%rsp), %xmm1185; SSE-NEXT: paddq {{[0-9]+}}(%rsp), %xmm2186; SSE-NEXT: paddq {{[0-9]+}}(%rsp), %xmm3187; SSE-NEXT: paddq {{[0-9]+}}(%rsp), %xmm4188; SSE-NEXT: paddq {{[0-9]+}}(%rsp), %xmm5189; SSE-NEXT: paddq {{[0-9]+}}(%rsp), %xmm6190; SSE-NEXT: paddq {{[0-9]+}}(%rsp), %xmm7191; SSE-NEXT: movdqa {{.*#+}} xmm8 = [255,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0]192; SSE-NEXT: pand %xmm8, %xmm7193; SSE-NEXT: pand %xmm8, %xmm6194; SSE-NEXT: packuswb %xmm7, %xmm6195; SSE-NEXT: pand %xmm8, %xmm5196; SSE-NEXT: pand %xmm8, %xmm4197; SSE-NEXT: packuswb %xmm5, %xmm4198; SSE-NEXT: packuswb %xmm6, %xmm4199; SSE-NEXT: pand %xmm8, %xmm3200; SSE-NEXT: pand %xmm8, %xmm2201; SSE-NEXT: packuswb %xmm3, %xmm2202; SSE-NEXT: pand %xmm8, %xmm1203; SSE-NEXT: pand %xmm8, %xmm0204; SSE-NEXT: packuswb %xmm1, %xmm0205; SSE-NEXT: packuswb %xmm2, %xmm0206; SSE-NEXT: packuswb %xmm4, %xmm0207; SSE-NEXT: retq208;209; AVX1-LABEL: trunc_add_v16i64_v16i8:210; AVX1: # %bb.0:211; AVX1-NEXT: vpaddq %xmm4, %xmm0, %xmm8212; AVX1-NEXT: vextractf128 $1, %ymm4, %xmm4213; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm0214; AVX1-NEXT: vpaddq %xmm4, %xmm0, %xmm0215; AVX1-NEXT: vpaddq %xmm5, %xmm1, %xmm4216; AVX1-NEXT: vextractf128 $1, %ymm5, %xmm5217; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm1218; AVX1-NEXT: vpaddq %xmm5, %xmm1, %xmm1219; AVX1-NEXT: vpaddq %xmm6, %xmm2, %xmm5220; AVX1-NEXT: vextractf128 $1, %ymm6, %xmm6221; AVX1-NEXT: vextractf128 $1, %ymm2, %xmm2222; AVX1-NEXT: vpaddq %xmm6, %xmm2, %xmm2223; AVX1-NEXT: vpaddq %xmm7, %xmm3, %xmm6224; AVX1-NEXT: vextractf128 $1, %ymm7, %xmm7225; AVX1-NEXT: vextractf128 $1, %ymm3, %xmm3226; AVX1-NEXT: vpaddq %xmm7, %xmm3, %xmm3227; AVX1-NEXT: vpmovzxbq {{.*#+}} xmm7 = [255,255]228; AVX1-NEXT: vpand %xmm7, %xmm3, %xmm3229; AVX1-NEXT: vpand %xmm7, %xmm6, %xmm6230; AVX1-NEXT: vpackusdw %xmm3, %xmm6, %xmm3231; AVX1-NEXT: vpand %xmm7, %xmm2, %xmm2232; AVX1-NEXT: vpand %xmm7, %xmm5, %xmm5233; AVX1-NEXT: vpackusdw %xmm2, %xmm5, %xmm2234; AVX1-NEXT: vpackusdw %xmm3, %xmm2, %xmm2235; AVX1-NEXT: vpand %xmm7, %xmm1, %xmm1236; AVX1-NEXT: vpand %xmm7, %xmm4, %xmm3237; AVX1-NEXT: vpackusdw %xmm1, %xmm3, %xmm1238; AVX1-NEXT: vpand %xmm7, %xmm0, %xmm0239; AVX1-NEXT: vpand %xmm7, %xmm8, %xmm3240; AVX1-NEXT: vpackusdw %xmm0, %xmm3, %xmm0241; AVX1-NEXT: vpackusdw %xmm1, %xmm0, %xmm0242; AVX1-NEXT: vpackuswb %xmm2, %xmm0, %xmm0243; AVX1-NEXT: vzeroupper244; AVX1-NEXT: retq245;246; AVX2-LABEL: trunc_add_v16i64_v16i8:247; AVX2: # %bb.0:248; AVX2-NEXT: vpaddq %ymm4, %ymm0, %ymm0249; AVX2-NEXT: vpaddq %ymm5, %ymm1, %ymm1250; AVX2-NEXT: vpaddq %ymm6, %ymm2, %ymm2251; AVX2-NEXT: vpaddq %ymm7, %ymm3, %ymm3252; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm4 = [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]253; AVX2-NEXT: vpand %ymm4, %ymm3, %ymm3254; AVX2-NEXT: vpand %ymm4, %ymm2, %ymm2255; AVX2-NEXT: vpackusdw %ymm3, %ymm2, %ymm2256; AVX2-NEXT: vpermq {{.*#+}} ymm2 = ymm2[0,2,1,3]257; AVX2-NEXT: vpand %ymm4, %ymm1, %ymm1258; AVX2-NEXT: vpand %ymm4, %ymm0, %ymm0259; AVX2-NEXT: vpackusdw %ymm1, %ymm0, %ymm0260; AVX2-NEXT: vpermq {{.*#+}} ymm0 = ymm0[0,2,1,3]261; AVX2-NEXT: vpackusdw %ymm2, %ymm0, %ymm0262; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1263; AVX2-NEXT: vpackuswb %xmm1, %xmm0, %xmm0264; AVX2-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[0,2,1,3]265; AVX2-NEXT: vzeroupper266; AVX2-NEXT: retq267;268; AVX512-LABEL: trunc_add_v16i64_v16i8:269; AVX512: # %bb.0:270; AVX512-NEXT: vpaddq %zmm2, %zmm0, %zmm0271; AVX512-NEXT: vpaddq %zmm3, %zmm1, %zmm1272; AVX512-NEXT: vpmovqb %zmm1, %xmm1273; AVX512-NEXT: vpmovqb %zmm0, %xmm0274; AVX512-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]275; AVX512-NEXT: vzeroupper276; AVX512-NEXT: retq277 %1 = add <16 x i64> %a0, %a1278 %2 = trunc <16 x i64> %1 to <16 x i8>279 ret <16 x i8> %2280}281 282define <16 x i8> @trunc_add_v16i32_v16i8(<16 x i32> %a0, <16 x i32> %a1) nounwind {283; SSE-LABEL: trunc_add_v16i32_v16i8:284; SSE: # %bb.0:285; SSE-NEXT: paddd %xmm4, %xmm0286; SSE-NEXT: paddd %xmm5, %xmm1287; SSE-NEXT: paddd %xmm6, %xmm2288; SSE-NEXT: paddd %xmm7, %xmm3289; SSE-NEXT: movdqa {{.*#+}} xmm4 = [255,0,0,0,255,0,0,0,255,0,0,0,255,0,0,0]290; SSE-NEXT: pand %xmm4, %xmm3291; SSE-NEXT: pand %xmm4, %xmm2292; SSE-NEXT: packuswb %xmm3, %xmm2293; SSE-NEXT: pand %xmm4, %xmm1294; SSE-NEXT: pand %xmm4, %xmm0295; SSE-NEXT: packuswb %xmm1, %xmm0296; SSE-NEXT: packuswb %xmm2, %xmm0297; SSE-NEXT: retq298;299; AVX1-LABEL: trunc_add_v16i32_v16i8:300; AVX1: # %bb.0:301; AVX1-NEXT: vpaddd %xmm2, %xmm0, %xmm4302; AVX1-NEXT: vextractf128 $1, %ymm2, %xmm2303; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm0304; AVX1-NEXT: vpaddd %xmm2, %xmm0, %xmm0305; AVX1-NEXT: vpaddd %xmm3, %xmm1, %xmm2306; AVX1-NEXT: vextractf128 $1, %ymm3, %xmm3307; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm1308; AVX1-NEXT: vpaddd %xmm3, %xmm1, %xmm1309; AVX1-NEXT: vbroadcastss {{.*#+}} xmm3 = [255,255,255,255]310; AVX1-NEXT: vpand %xmm3, %xmm1, %xmm1311; AVX1-NEXT: vpand %xmm3, %xmm2, %xmm2312; AVX1-NEXT: vpackusdw %xmm1, %xmm2, %xmm1313; AVX1-NEXT: vpand %xmm3, %xmm0, %xmm0314; AVX1-NEXT: vpand %xmm3, %xmm4, %xmm2315; AVX1-NEXT: vpackusdw %xmm0, %xmm2, %xmm0316; AVX1-NEXT: vpackuswb %xmm1, %xmm0, %xmm0317; AVX1-NEXT: vzeroupper318; AVX1-NEXT: retq319;320; AVX2-LABEL: trunc_add_v16i32_v16i8:321; AVX2: # %bb.0:322; AVX2-NEXT: vpaddd %ymm2, %ymm0, %ymm0323; AVX2-NEXT: vpaddd %ymm3, %ymm1, %ymm1324; 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]325; AVX2-NEXT: vpand %ymm2, %ymm1, %ymm1326; AVX2-NEXT: vpand %ymm2, %ymm0, %ymm0327; AVX2-NEXT: vpackusdw %ymm1, %ymm0, %ymm0328; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1329; AVX2-NEXT: vpackuswb %xmm1, %xmm0, %xmm0330; AVX2-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[0,2,1,3]331; AVX2-NEXT: vzeroupper332; AVX2-NEXT: retq333;334; AVX512-LABEL: trunc_add_v16i32_v16i8:335; AVX512: # %bb.0:336; AVX512-NEXT: vpaddd %zmm1, %zmm0, %zmm0337; AVX512-NEXT: vpmovdb %zmm0, %xmm0338; AVX512-NEXT: vzeroupper339; AVX512-NEXT: retq340 %1 = add <16 x i32> %a0, %a1341 %2 = trunc <16 x i32> %1 to <16 x i8>342 ret <16 x i8> %2343}344 345define <16 x i8> @trunc_add_v16i16_v16i8(<16 x i16> %a0, <16 x i16> %a1) nounwind {346; SSE-LABEL: trunc_add_v16i16_v16i8:347; SSE: # %bb.0:348; SSE-NEXT: paddw %xmm2, %xmm0349; SSE-NEXT: paddw %xmm3, %xmm1350; SSE-NEXT: movdqa {{.*#+}} xmm2 = [255,0,255,0,255,0,255,0,255,0,255,0,255,0,255,0]351; SSE-NEXT: pand %xmm2, %xmm1352; SSE-NEXT: pand %xmm2, %xmm0353; SSE-NEXT: packuswb %xmm1, %xmm0354; SSE-NEXT: retq355;356; AVX1-LABEL: trunc_add_v16i16_v16i8:357; AVX1: # %bb.0:358; AVX1-NEXT: vpaddw %xmm1, %xmm0, %xmm2359; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm1360; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm0361; AVX1-NEXT: vpaddw %xmm1, %xmm0, %xmm0362; AVX1-NEXT: vbroadcastss {{.*#+}} xmm1 = [255,255,255,255,255,255,255,255]363; AVX1-NEXT: vpand %xmm1, %xmm0, %xmm0364; AVX1-NEXT: vpand %xmm1, %xmm2, %xmm1365; AVX1-NEXT: vpackuswb %xmm0, %xmm1, %xmm0366; AVX1-NEXT: vzeroupper367; AVX1-NEXT: retq368;369; AVX2-LABEL: trunc_add_v16i16_v16i8:370; AVX2: # %bb.0:371; AVX2-NEXT: vpaddw %ymm1, %ymm0, %ymm0372; AVX2-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0373; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1374; AVX2-NEXT: vpackuswb %xmm1, %xmm0, %xmm0375; AVX2-NEXT: vzeroupper376; AVX2-NEXT: retq377;378; AVX512F-LABEL: trunc_add_v16i16_v16i8:379; AVX512F: # %bb.0:380; AVX512F-NEXT: vpaddw %ymm1, %ymm0, %ymm0381; 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],zero382; AVX512F-NEXT: vpmovdb %zmm0, %xmm0383; AVX512F-NEXT: vzeroupper384; AVX512F-NEXT: retq385;386; AVX512BW-LABEL: trunc_add_v16i16_v16i8:387; AVX512BW: # %bb.0:388; AVX512BW-NEXT: vpaddw %ymm1, %ymm0, %ymm0389; AVX512BW-NEXT: vpmovwb %zmm0, %ymm0390; AVX512BW-NEXT: # kill: def $xmm0 killed $xmm0 killed $ymm0391; AVX512BW-NEXT: vzeroupper392; AVX512BW-NEXT: retq393;394; AVX512DQ-LABEL: trunc_add_v16i16_v16i8:395; AVX512DQ: # %bb.0:396; AVX512DQ-NEXT: vpaddw %ymm1, %ymm0, %ymm0397; AVX512DQ-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],zero398; AVX512DQ-NEXT: vpmovdb %zmm0, %xmm0399; AVX512DQ-NEXT: vzeroupper400; AVX512DQ-NEXT: retq401 %1 = add <16 x i16> %a0, %a1402 %2 = trunc <16 x i16> %1 to <16 x i8>403 ret <16 x i8> %2404}405 406define <8 x i16> @trunc_add_v8i32_v8i16_sext_8i8(<16 x i8> %a0, <8 x i32> %a1) {407; SSE-LABEL: trunc_add_v8i32_v8i16_sext_8i8:408; SSE: # %bb.0:409; SSE-NEXT: pslld $16, %xmm2410; SSE-NEXT: psrad $16, %xmm2411; SSE-NEXT: pslld $16, %xmm1412; SSE-NEXT: psrad $16, %xmm1413; SSE-NEXT: packssdw %xmm2, %xmm1414; SSE-NEXT: punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]415; SSE-NEXT: psraw $8, %xmm0416; SSE-NEXT: paddw %xmm1, %xmm0417; SSE-NEXT: retq418;419; AVX1-LABEL: trunc_add_v8i32_v8i16_sext_8i8:420; AVX1: # %bb.0:421; AVX1-NEXT: vandps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm1422; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2423; AVX1-NEXT: vpackusdw %xmm2, %xmm1, %xmm1424; AVX1-NEXT: vpmovsxbw %xmm0, %xmm0425; AVX1-NEXT: vpaddw %xmm1, %xmm0, %xmm0426; AVX1-NEXT: vzeroupper427; AVX1-NEXT: retq428;429; AVX2-LABEL: trunc_add_v8i32_v8i16_sext_8i8:430; AVX2: # %bb.0:431; AVX2-NEXT: vpmovsxbw %xmm0, %xmm0432; AVX2-NEXT: vpshufb {{.*#+}} ymm1 = ymm1[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]433; AVX2-NEXT: vpermq {{.*#+}} ymm1 = ymm1[0,2,2,3]434; AVX2-NEXT: vpaddw %xmm1, %xmm0, %xmm0435; AVX2-NEXT: vzeroupper436; AVX2-NEXT: retq437;438; AVX512-LABEL: trunc_add_v8i32_v8i16_sext_8i8:439; AVX512: # %bb.0:440; AVX512-NEXT: # kill: def $ymm1 killed $ymm1 def $zmm1441; AVX512-NEXT: vpmovdw %zmm1, %ymm1442; AVX512-NEXT: vpmovsxbw %xmm0, %xmm0443; AVX512-NEXT: vpaddw %xmm1, %xmm0, %xmm0444; AVX512-NEXT: vzeroupper445; AVX512-NEXT: retq446 %1 = shufflevector <16 x i8> %a0, <16 x i8> undef, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>447 %2 = sext <8 x i8> %1 to <8 x i32>448 %3 = add <8 x i32> %2, %a1449 %4 = trunc <8 x i32> %3 to <8 x i16>450 ret <8 x i16> %4451}452 453;454; add to constant455;456 457define <4 x i32> @trunc_add_const_v4i64_v4i32(<4 x i64> %a0) nounwind {458; SSE-LABEL: trunc_add_const_v4i64_v4i32:459; SSE: # %bb.0:460; SSE-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,2],xmm1[0,2]461; SSE-NEXT: paddd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0462; SSE-NEXT: retq463;464; AVX1-LABEL: trunc_add_const_v4i64_v4i32:465; AVX1: # %bb.0:466; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1467; AVX1-NEXT: vshufps {{.*#+}} xmm0 = xmm0[0,2],xmm1[0,2]468; AVX1-NEXT: vpaddd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0469; AVX1-NEXT: vzeroupper470; AVX1-NEXT: retq471;472; AVX2-SLOW-LABEL: trunc_add_const_v4i64_v4i32:473; AVX2-SLOW: # %bb.0:474; AVX2-SLOW-NEXT: vextractf128 $1, %ymm0, %xmm1475; AVX2-SLOW-NEXT: vshufps {{.*#+}} xmm0 = xmm0[0,2],xmm1[0,2]476; AVX2-SLOW-NEXT: vpaddd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0477; AVX2-SLOW-NEXT: vzeroupper478; AVX2-SLOW-NEXT: retq479;480; AVX2-FAST-ALL-LABEL: trunc_add_const_v4i64_v4i32:481; AVX2-FAST-ALL: # %bb.0:482; AVX2-FAST-ALL-NEXT: vpmovsxbd {{.*#+}} ymm1 = [0,2,4,6,0,0,0,0]483; AVX2-FAST-ALL-NEXT: vpermd %ymm0, %ymm1, %ymm0484; AVX2-FAST-ALL-NEXT: vpaddd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0485; AVX2-FAST-ALL-NEXT: vzeroupper486; AVX2-FAST-ALL-NEXT: retq487;488; AVX2-FAST-PERLANE-LABEL: trunc_add_const_v4i64_v4i32:489; AVX2-FAST-PERLANE: # %bb.0:490; AVX2-FAST-PERLANE-NEXT: vextractf128 $1, %ymm0, %xmm1491; AVX2-FAST-PERLANE-NEXT: vshufps {{.*#+}} xmm0 = xmm0[0,2],xmm1[0,2]492; AVX2-FAST-PERLANE-NEXT: vpaddd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0493; AVX2-FAST-PERLANE-NEXT: vzeroupper494; AVX2-FAST-PERLANE-NEXT: retq495;496; AVX512-LABEL: trunc_add_const_v4i64_v4i32:497; AVX512: # %bb.0:498; AVX512-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm0499; AVX512-NEXT: vpmovqd %zmm0, %ymm0500; AVX512-NEXT: vpaddd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0501; AVX512-NEXT: vzeroupper502; AVX512-NEXT: retq503 %1 = add <4 x i64> %a0, <i64 0, i64 1, i64 2, i64 3>504 %2 = trunc <4 x i64> %1 to <4 x i32>505 ret <4 x i32> %2506}507 508define <8 x i16> @trunc_add_const_v8i64_v8i16(<8 x i64> %a0) nounwind {509; SSE-LABEL: trunc_add_const_v8i64_v8i16:510; SSE: # %bb.0:511; SSE-NEXT: shufps {{.*#+}} xmm2 = xmm2[0,2],xmm3[0,2]512; SSE-NEXT: pslld $16, %xmm2513; SSE-NEXT: psrad $16, %xmm2514; SSE-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,2],xmm1[0,2]515; SSE-NEXT: pslld $16, %xmm0516; SSE-NEXT: psrad $16, %xmm0517; SSE-NEXT: packssdw %xmm2, %xmm0518; SSE-NEXT: paddw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0519; SSE-NEXT: retq520;521; AVX1-LABEL: trunc_add_const_v8i64_v8i16:522; AVX1: # %bb.0:523; AVX1-NEXT: vbroadcastsd {{.*#+}} ymm2 = [65535,65535,65535,65535]524; AVX1-NEXT: vandps %ymm2, %ymm1, %ymm1525; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm3526; AVX1-NEXT: vpackusdw %xmm3, %xmm1, %xmm1527; AVX1-NEXT: vandps %ymm2, %ymm0, %ymm0528; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2529; AVX1-NEXT: vpackusdw %xmm2, %xmm0, %xmm0530; AVX1-NEXT: vpackusdw %xmm1, %xmm0, %xmm0531; AVX1-NEXT: vpaddw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0532; AVX1-NEXT: vzeroupper533; AVX1-NEXT: retq534;535; AVX2-LABEL: trunc_add_const_v8i64_v8i16:536; AVX2: # %bb.0:537; AVX2-NEXT: vpxor %xmm2, %xmm2, %xmm2538; 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]539; 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]540; AVX2-NEXT: vpackusdw %ymm1, %ymm0, %ymm0541; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1542; AVX2-NEXT: vpackusdw %xmm1, %xmm0, %xmm0543; AVX2-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[0,2,1,3]544; AVX2-NEXT: vpaddw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0545; AVX2-NEXT: vzeroupper546; AVX2-NEXT: retq547;548; AVX512-LABEL: trunc_add_const_v8i64_v8i16:549; AVX512: # %bb.0:550; AVX512-NEXT: vpmovqw %zmm0, %xmm0551; AVX512-NEXT: vpaddw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0552; AVX512-NEXT: vzeroupper553; AVX512-NEXT: retq554 %1 = add <8 x i64> %a0, <i64 0, i64 1, i64 2, i64 3, i64 4, i64 5, i64 6, i64 7>555 %2 = trunc <8 x i64> %1 to <8 x i16>556 ret <8 x i16> %2557}558 559define <8 x i16> @trunc_add_const_v8i32_v8i16(<8 x i32> %a0) nounwind {560; SSE-LABEL: trunc_add_const_v8i32_v8i16:561; SSE: # %bb.0:562; SSE-NEXT: pslld $16, %xmm1563; SSE-NEXT: psrad $16, %xmm1564; SSE-NEXT: pslld $16, %xmm0565; SSE-NEXT: psrad $16, %xmm0566; SSE-NEXT: packssdw %xmm1, %xmm0567; SSE-NEXT: paddw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0568; SSE-NEXT: retq569;570; AVX1-LABEL: trunc_add_const_v8i32_v8i16:571; AVX1: # %bb.0:572; AVX1-NEXT: vandps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0573; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1574; AVX1-NEXT: vpackusdw %xmm1, %xmm0, %xmm0575; AVX1-NEXT: vpaddw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0576; AVX1-NEXT: vzeroupper577; AVX1-NEXT: retq578;579; AVX2-LABEL: trunc_add_const_v8i32_v8i16:580; AVX2: # %bb.0:581; 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]582; AVX2-NEXT: vpermq {{.*#+}} ymm0 = ymm0[0,2,2,3]583; AVX2-NEXT: vpaddw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0584; AVX2-NEXT: vzeroupper585; AVX2-NEXT: retq586;587; AVX512-LABEL: trunc_add_const_v8i32_v8i16:588; AVX512: # %bb.0:589; AVX512-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm0590; AVX512-NEXT: vpmovdw %zmm0, %ymm0591; AVX512-NEXT: vpaddw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0592; AVX512-NEXT: vzeroupper593; AVX512-NEXT: retq594 %1 = add <8 x i32> %a0, <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>595 %2 = trunc <8 x i32> %1 to <8 x i16>596 ret <8 x i16> %2597}598 599define <16 x i8> @trunc_add_const_v16i64_v16i8(<16 x i64> %a0) nounwind {600; SSE-LABEL: trunc_add_const_v16i64_v16i8:601; SSE: # %bb.0:602; SSE-NEXT: movdqa {{.*#+}} xmm8 = [255,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0]603; SSE-NEXT: pand %xmm8, %xmm7604; SSE-NEXT: pand %xmm8, %xmm6605; SSE-NEXT: packuswb %xmm7, %xmm6606; SSE-NEXT: pand %xmm8, %xmm5607; SSE-NEXT: pand %xmm8, %xmm4608; SSE-NEXT: packuswb %xmm5, %xmm4609; SSE-NEXT: packuswb %xmm6, %xmm4610; SSE-NEXT: pand %xmm8, %xmm3611; SSE-NEXT: pand %xmm8, %xmm2612; SSE-NEXT: packuswb %xmm3, %xmm2613; SSE-NEXT: pand %xmm8, %xmm1614; SSE-NEXT: pand %xmm8, %xmm0615; SSE-NEXT: packuswb %xmm1, %xmm0616; SSE-NEXT: packuswb %xmm2, %xmm0617; SSE-NEXT: packuswb %xmm4, %xmm0618; SSE-NEXT: paddb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0619; SSE-NEXT: retq620;621; AVX1-LABEL: trunc_add_const_v16i64_v16i8:622; AVX1: # %bb.0:623; AVX1-NEXT: vbroadcastsd {{.*#+}} ymm4 = [255,255,255,255]624; AVX1-NEXT: vandps %ymm4, %ymm3, %ymm3625; AVX1-NEXT: vextractf128 $1, %ymm3, %xmm5626; AVX1-NEXT: vpackusdw %xmm5, %xmm3, %xmm3627; AVX1-NEXT: vandps %ymm4, %ymm2, %ymm2628; AVX1-NEXT: vextractf128 $1, %ymm2, %xmm5629; AVX1-NEXT: vpackusdw %xmm5, %xmm2, %xmm2630; AVX1-NEXT: vpackusdw %xmm3, %xmm2, %xmm2631; AVX1-NEXT: vandps %ymm4, %ymm1, %ymm1632; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm3633; AVX1-NEXT: vpackusdw %xmm3, %xmm1, %xmm1634; AVX1-NEXT: vandps %ymm4, %ymm0, %ymm0635; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm3636; AVX1-NEXT: vpackusdw %xmm3, %xmm0, %xmm0637; AVX1-NEXT: vpackusdw %xmm1, %xmm0, %xmm0638; AVX1-NEXT: vpackuswb %xmm2, %xmm0, %xmm0639; AVX1-NEXT: vpaddb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0640; AVX1-NEXT: vzeroupper641; AVX1-NEXT: retq642;643; AVX2-LABEL: trunc_add_const_v16i64_v16i8:644; AVX2: # %bb.0:645; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm4 = [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]646; AVX2-NEXT: vpand %ymm4, %ymm3, %ymm3647; AVX2-NEXT: vpand %ymm4, %ymm2, %ymm2648; AVX2-NEXT: vpackusdw %ymm3, %ymm2, %ymm2649; AVX2-NEXT: vpermq {{.*#+}} ymm2 = ymm2[0,2,1,3]650; AVX2-NEXT: vpand %ymm4, %ymm1, %ymm1651; AVX2-NEXT: vpand %ymm4, %ymm0, %ymm0652; AVX2-NEXT: vpackusdw %ymm1, %ymm0, %ymm0653; AVX2-NEXT: vpermq {{.*#+}} ymm0 = ymm0[0,2,1,3]654; AVX2-NEXT: vpackusdw %ymm2, %ymm0, %ymm0655; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1656; AVX2-NEXT: vpackuswb %xmm1, %xmm0, %xmm0657; AVX2-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[0,2,1,3]658; AVX2-NEXT: vpaddb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0659; AVX2-NEXT: vzeroupper660; AVX2-NEXT: retq661;662; AVX512-LABEL: trunc_add_const_v16i64_v16i8:663; AVX512: # %bb.0:664; AVX512-NEXT: vpmovqb %zmm1, %xmm1665; AVX512-NEXT: vpmovqb %zmm0, %xmm0666; AVX512-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]667; AVX512-NEXT: vpaddb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0668; AVX512-NEXT: vzeroupper669; AVX512-NEXT: retq670 %1 = add <16 x i64> %a0, <i64 0, i64 1, i64 2, i64 3, i64 4, i64 5, i64 6, i64 7, i64 8, i64 9, i64 10, i64 11, i64 12, i64 13, i64 14, i64 15>671 %2 = trunc <16 x i64> %1 to <16 x i8>672 ret <16 x i8> %2673}674 675define <16 x i8> @trunc_add_const_v16i32_v16i8(<16 x i32> %a0) nounwind {676; SSE-LABEL: trunc_add_const_v16i32_v16i8:677; SSE: # %bb.0:678; SSE-NEXT: movdqa {{.*#+}} xmm4 = [255,0,0,0,255,0,0,0,255,0,0,0,255,0,0,0]679; SSE-NEXT: pand %xmm4, %xmm3680; SSE-NEXT: pand %xmm4, %xmm2681; SSE-NEXT: packuswb %xmm3, %xmm2682; SSE-NEXT: pand %xmm4, %xmm1683; SSE-NEXT: pand %xmm4, %xmm0684; SSE-NEXT: packuswb %xmm1, %xmm0685; SSE-NEXT: packuswb %xmm2, %xmm0686; SSE-NEXT: paddb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0687; SSE-NEXT: retq688;689; AVX1-LABEL: trunc_add_const_v16i32_v16i8:690; AVX1: # %bb.0:691; AVX1-NEXT: vbroadcastss {{.*#+}} ymm2 = [255,255,255,255,255,255,255,255]692; AVX1-NEXT: vandps %ymm2, %ymm1, %ymm1693; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm3694; AVX1-NEXT: vpackusdw %xmm3, %xmm1, %xmm1695; AVX1-NEXT: vandps %ymm2, %ymm0, %ymm0696; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2697; AVX1-NEXT: vpackusdw %xmm2, %xmm0, %xmm0698; AVX1-NEXT: vpackuswb %xmm1, %xmm0, %xmm0699; AVX1-NEXT: vpaddb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0700; AVX1-NEXT: vzeroupper701; AVX1-NEXT: retq702;703; AVX2-LABEL: trunc_add_const_v16i32_v16i8:704; AVX2: # %bb.0:705; 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]706; AVX2-NEXT: vpand %ymm2, %ymm1, %ymm1707; AVX2-NEXT: vpand %ymm2, %ymm0, %ymm0708; AVX2-NEXT: vpackusdw %ymm1, %ymm0, %ymm0709; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1710; AVX2-NEXT: vpackuswb %xmm1, %xmm0, %xmm0711; AVX2-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[0,2,1,3]712; AVX2-NEXT: vpaddb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0713; AVX2-NEXT: vzeroupper714; AVX2-NEXT: retq715;716; AVX512-LABEL: trunc_add_const_v16i32_v16i8:717; AVX512: # %bb.0:718; AVX512-NEXT: vpmovdb %zmm0, %xmm0719; AVX512-NEXT: vpaddb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0720; AVX512-NEXT: vzeroupper721; AVX512-NEXT: retq722 %1 = add <16 x i32> %a0, <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>723 %2 = trunc <16 x i32> %1 to <16 x i8>724 ret <16 x i8> %2725}726 727define <16 x i8> @trunc_add_const_v16i16_v16i8(<16 x i16> %a0) nounwind {728; SSE-LABEL: trunc_add_const_v16i16_v16i8:729; SSE: # %bb.0:730; SSE-NEXT: movdqa {{.*#+}} xmm2 = [255,0,255,0,255,0,255,0,255,0,255,0,255,0,255,0]731; SSE-NEXT: pand %xmm2, %xmm1732; SSE-NEXT: pand %xmm2, %xmm0733; SSE-NEXT: packuswb %xmm1, %xmm0734; SSE-NEXT: paddb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0735; SSE-NEXT: retq736;737; AVX1-LABEL: trunc_add_const_v16i16_v16i8:738; AVX1: # %bb.0:739; AVX1-NEXT: vandps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0740; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1741; AVX1-NEXT: vpackuswb %xmm1, %xmm0, %xmm0742; AVX1-NEXT: vpaddb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0743; AVX1-NEXT: vzeroupper744; AVX1-NEXT: retq745;746; AVX2-LABEL: trunc_add_const_v16i16_v16i8:747; AVX2: # %bb.0:748; AVX2-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0749; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1750; AVX2-NEXT: vpackuswb %xmm1, %xmm0, %xmm0751; AVX2-NEXT: vpaddb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0752; AVX2-NEXT: vzeroupper753; AVX2-NEXT: retq754;755; AVX512F-LABEL: trunc_add_const_v16i16_v16i8:756; AVX512F: # %bb.0:757; 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],zero758; AVX512F-NEXT: vpmovdb %zmm0, %xmm0759; AVX512F-NEXT: vpaddb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0760; AVX512F-NEXT: vzeroupper761; AVX512F-NEXT: retq762;763; AVX512BW-LABEL: trunc_add_const_v16i16_v16i8:764; AVX512BW: # %bb.0:765; AVX512BW-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm0766; AVX512BW-NEXT: vpmovwb %zmm0, %ymm0767; AVX512BW-NEXT: vpaddb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0768; AVX512BW-NEXT: vzeroupper769; AVX512BW-NEXT: retq770;771; AVX512DQ-LABEL: trunc_add_const_v16i16_v16i8:772; AVX512DQ: # %bb.0:773; AVX512DQ-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],zero774; AVX512DQ-NEXT: vpmovdb %zmm0, %xmm0775; AVX512DQ-NEXT: vpaddb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0776; AVX512DQ-NEXT: vzeroupper777; AVX512DQ-NEXT: retq778 %1 = add <16 x i16> %a0, <i16 0, i16 1, i16 2, i16 3, i16 4, i16 5, i16 6, i16 7, i16 8, i16 9, i16 10, i16 11, i16 12, i16 13, i16 14, i16 15>779 %2 = trunc <16 x i16> %1 to <16 x i8>780 ret <16 x i8> %2781}782 783;784; sub785;786 787define <4 x i32> @trunc_sub_v4i64_v4i32(<4 x i64> %a0, <4 x i64> %a1) nounwind {788; SSE-LABEL: trunc_sub_v4i64_v4i32:789; SSE: # %bb.0:790; SSE-NEXT: psubq %xmm3, %xmm1791; SSE-NEXT: psubq %xmm2, %xmm0792; SSE-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,2],xmm1[0,2]793; SSE-NEXT: retq794;795; AVX1-LABEL: trunc_sub_v4i64_v4i32:796; AVX1: # %bb.0:797; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2798; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm3799; AVX1-NEXT: vpsubq %xmm2, %xmm3, %xmm2800; AVX1-NEXT: vpsubq %xmm1, %xmm0, %xmm0801; AVX1-NEXT: vshufps {{.*#+}} xmm0 = xmm0[0,2],xmm2[0,2]802; AVX1-NEXT: vzeroupper803; AVX1-NEXT: retq804;805; AVX2-SLOW-LABEL: trunc_sub_v4i64_v4i32:806; AVX2-SLOW: # %bb.0:807; AVX2-SLOW-NEXT: vpsubq %ymm1, %ymm0, %ymm0808; AVX2-SLOW-NEXT: vextracti128 $1, %ymm0, %xmm1809; AVX2-SLOW-NEXT: vshufps {{.*#+}} xmm0 = xmm0[0,2],xmm1[0,2]810; AVX2-SLOW-NEXT: vzeroupper811; AVX2-SLOW-NEXT: retq812;813; AVX2-FAST-ALL-LABEL: trunc_sub_v4i64_v4i32:814; AVX2-FAST-ALL: # %bb.0:815; AVX2-FAST-ALL-NEXT: vpsubq %ymm1, %ymm0, %ymm0816; AVX2-FAST-ALL-NEXT: vpmovsxbd {{.*#+}} ymm1 = [0,2,4,6,0,0,0,0]817; AVX2-FAST-ALL-NEXT: vpermd %ymm0, %ymm1, %ymm0818; AVX2-FAST-ALL-NEXT: # kill: def $xmm0 killed $xmm0 killed $ymm0819; AVX2-FAST-ALL-NEXT: vzeroupper820; AVX2-FAST-ALL-NEXT: retq821;822; AVX2-FAST-PERLANE-LABEL: trunc_sub_v4i64_v4i32:823; AVX2-FAST-PERLANE: # %bb.0:824; AVX2-FAST-PERLANE-NEXT: vpsubq %ymm1, %ymm0, %ymm0825; AVX2-FAST-PERLANE-NEXT: vextracti128 $1, %ymm0, %xmm1826; AVX2-FAST-PERLANE-NEXT: vshufps {{.*#+}} xmm0 = xmm0[0,2],xmm1[0,2]827; AVX2-FAST-PERLANE-NEXT: vzeroupper828; AVX2-FAST-PERLANE-NEXT: retq829;830; AVX512-LABEL: trunc_sub_v4i64_v4i32:831; AVX512: # %bb.0:832; AVX512-NEXT: vpsubq %ymm1, %ymm0, %ymm0833; AVX512-NEXT: vpmovqd %zmm0, %ymm0834; AVX512-NEXT: # kill: def $xmm0 killed $xmm0 killed $ymm0835; AVX512-NEXT: vzeroupper836; AVX512-NEXT: retq837 %1 = sub <4 x i64> %a0, %a1838 %2 = trunc <4 x i64> %1 to <4 x i32>839 ret <4 x i32> %2840}841 842define <8 x i16> @trunc_sub_v8i64_v8i16(<8 x i64> %a0, <8 x i64> %a1) nounwind {843; SSE-LABEL: trunc_sub_v8i64_v8i16:844; SSE: # %bb.0:845; SSE-NEXT: psubq %xmm5, %xmm1846; SSE-NEXT: psubq %xmm4, %xmm0847; SSE-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,2],xmm1[0,2]848; SSE-NEXT: psubq %xmm7, %xmm3849; SSE-NEXT: psubq %xmm6, %xmm2850; SSE-NEXT: shufps {{.*#+}} xmm2 = xmm2[0,2],xmm3[0,2]851; SSE-NEXT: pslld $16, %xmm2852; SSE-NEXT: psrad $16, %xmm2853; SSE-NEXT: pslld $16, %xmm0854; SSE-NEXT: psrad $16, %xmm0855; SSE-NEXT: packssdw %xmm2, %xmm0856; SSE-NEXT: retq857;858; AVX1-LABEL: trunc_sub_v8i64_v8i16:859; AVX1: # %bb.0:860; AVX1-NEXT: vpsubq %xmm2, %xmm0, %xmm4861; AVX1-NEXT: vextractf128 $1, %ymm2, %xmm2862; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm0863; AVX1-NEXT: vpsubq %xmm2, %xmm0, %xmm0864; AVX1-NEXT: vpsubq %xmm3, %xmm1, %xmm2865; AVX1-NEXT: vextractf128 $1, %ymm3, %xmm3866; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm1867; AVX1-NEXT: vpsubq %xmm3, %xmm1, %xmm1868; AVX1-NEXT: vpxor %xmm3, %xmm3, %xmm3869; AVX1-NEXT: vpblendw {{.*#+}} xmm1 = xmm1[0],xmm3[1,2,3],xmm1[4],xmm3[5,6,7]870; AVX1-NEXT: vpblendw {{.*#+}} xmm2 = xmm2[0],xmm3[1,2,3],xmm2[4],xmm3[5,6,7]871; AVX1-NEXT: vpackusdw %xmm1, %xmm2, %xmm1872; AVX1-NEXT: vpblendw {{.*#+}} xmm0 = xmm0[0],xmm3[1,2,3],xmm0[4],xmm3[5,6,7]873; AVX1-NEXT: vpblendw {{.*#+}} xmm2 = xmm4[0],xmm3[1,2,3],xmm4[4],xmm3[5,6,7]874; AVX1-NEXT: vpackusdw %xmm0, %xmm2, %xmm0875; AVX1-NEXT: vpackusdw %xmm1, %xmm0, %xmm0876; AVX1-NEXT: vzeroupper877; AVX1-NEXT: retq878;879; AVX2-LABEL: trunc_sub_v8i64_v8i16:880; AVX2: # %bb.0:881; AVX2-NEXT: vpsubq %ymm2, %ymm0, %ymm0882; AVX2-NEXT: vpsubq %ymm3, %ymm1, %ymm1883; AVX2-NEXT: vpxor %xmm2, %xmm2, %xmm2884; 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]885; 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]886; AVX2-NEXT: vpackusdw %ymm1, %ymm0, %ymm0887; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1888; AVX2-NEXT: vpackusdw %xmm1, %xmm0, %xmm0889; AVX2-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[0,2,1,3]890; AVX2-NEXT: vzeroupper891; AVX2-NEXT: retq892;893; AVX512-LABEL: trunc_sub_v8i64_v8i16:894; AVX512: # %bb.0:895; AVX512-NEXT: vpsubq %zmm1, %zmm0, %zmm0896; AVX512-NEXT: vpmovqw %zmm0, %xmm0897; AVX512-NEXT: vzeroupper898; AVX512-NEXT: retq899 %1 = sub <8 x i64> %a0, %a1900 %2 = trunc <8 x i64> %1 to <8 x i16>901 ret <8 x i16> %2902}903 904define <8 x i16> @trunc_sub_v8i32_v8i16(<8 x i32> %a0, <8 x i32> %a1) nounwind {905; SSE-LABEL: trunc_sub_v8i32_v8i16:906; SSE: # %bb.0:907; SSE-NEXT: psubd %xmm2, %xmm0908; SSE-NEXT: psubd %xmm3, %xmm1909; SSE-NEXT: pslld $16, %xmm1910; SSE-NEXT: psrad $16, %xmm1911; SSE-NEXT: pslld $16, %xmm0912; SSE-NEXT: psrad $16, %xmm0913; SSE-NEXT: packssdw %xmm1, %xmm0914; SSE-NEXT: retq915;916; AVX1-LABEL: trunc_sub_v8i32_v8i16:917; AVX1: # %bb.0:918; AVX1-NEXT: vpsubd %xmm1, %xmm0, %xmm2919; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm1920; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm0921; AVX1-NEXT: vpsubd %xmm1, %xmm0, %xmm0922; AVX1-NEXT: vpxor %xmm1, %xmm1, %xmm1923; AVX1-NEXT: vpblendw {{.*#+}} xmm0 = xmm0[0],xmm1[1],xmm0[2],xmm1[3],xmm0[4],xmm1[5],xmm0[6],xmm1[7]924; AVX1-NEXT: vpblendw {{.*#+}} xmm1 = xmm2[0],xmm1[1],xmm2[2],xmm1[3],xmm2[4],xmm1[5],xmm2[6],xmm1[7]925; AVX1-NEXT: vpackusdw %xmm0, %xmm1, %xmm0926; AVX1-NEXT: vzeroupper927; AVX1-NEXT: retq928;929; AVX2-LABEL: trunc_sub_v8i32_v8i16:930; AVX2: # %bb.0:931; AVX2-NEXT: vpsubd %ymm1, %ymm0, %ymm0932; 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]933; AVX2-NEXT: vpermq {{.*#+}} ymm0 = ymm0[0,2,2,3]934; AVX2-NEXT: # kill: def $xmm0 killed $xmm0 killed $ymm0935; AVX2-NEXT: vzeroupper936; AVX2-NEXT: retq937;938; AVX512-LABEL: trunc_sub_v8i32_v8i16:939; AVX512: # %bb.0:940; AVX512-NEXT: vpsubd %ymm1, %ymm0, %ymm0941; AVX512-NEXT: vpmovdw %zmm0, %ymm0942; AVX512-NEXT: # kill: def $xmm0 killed $xmm0 killed $ymm0943; AVX512-NEXT: vzeroupper944; AVX512-NEXT: retq945 %1 = sub <8 x i32> %a0, %a1946 %2 = trunc <8 x i32> %1 to <8 x i16>947 ret <8 x i16> %2948}949 950define <16 x i8> @trunc_sub_v16i64_v16i8(<16 x i64> %a0, <16 x i64> %a1) nounwind {951; SSE-LABEL: trunc_sub_v16i64_v16i8:952; SSE: # %bb.0:953; SSE-NEXT: psubq {{[0-9]+}}(%rsp), %xmm0954; SSE-NEXT: psubq {{[0-9]+}}(%rsp), %xmm1955; SSE-NEXT: psubq {{[0-9]+}}(%rsp), %xmm2956; SSE-NEXT: psubq {{[0-9]+}}(%rsp), %xmm3957; SSE-NEXT: psubq {{[0-9]+}}(%rsp), %xmm4958; SSE-NEXT: psubq {{[0-9]+}}(%rsp), %xmm5959; SSE-NEXT: psubq {{[0-9]+}}(%rsp), %xmm6960; SSE-NEXT: psubq {{[0-9]+}}(%rsp), %xmm7961; SSE-NEXT: movdqa {{.*#+}} xmm8 = [255,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0]962; SSE-NEXT: pand %xmm8, %xmm7963; SSE-NEXT: pand %xmm8, %xmm6964; SSE-NEXT: packuswb %xmm7, %xmm6965; SSE-NEXT: pand %xmm8, %xmm5966; SSE-NEXT: pand %xmm8, %xmm4967; SSE-NEXT: packuswb %xmm5, %xmm4968; SSE-NEXT: packuswb %xmm6, %xmm4969; SSE-NEXT: pand %xmm8, %xmm3970; SSE-NEXT: pand %xmm8, %xmm2971; SSE-NEXT: packuswb %xmm3, %xmm2972; SSE-NEXT: pand %xmm8, %xmm1973; SSE-NEXT: pand %xmm8, %xmm0974; SSE-NEXT: packuswb %xmm1, %xmm0975; SSE-NEXT: packuswb %xmm2, %xmm0976; SSE-NEXT: packuswb %xmm4, %xmm0977; SSE-NEXT: retq978;979; AVX1-LABEL: trunc_sub_v16i64_v16i8:980; AVX1: # %bb.0:981; AVX1-NEXT: vpsubq %xmm4, %xmm0, %xmm8982; AVX1-NEXT: vextractf128 $1, %ymm4, %xmm4983; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm0984; AVX1-NEXT: vpsubq %xmm4, %xmm0, %xmm0985; AVX1-NEXT: vpsubq %xmm5, %xmm1, %xmm4986; AVX1-NEXT: vextractf128 $1, %ymm5, %xmm5987; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm1988; AVX1-NEXT: vpsubq %xmm5, %xmm1, %xmm1989; AVX1-NEXT: vpsubq %xmm6, %xmm2, %xmm5990; AVX1-NEXT: vextractf128 $1, %ymm6, %xmm6991; AVX1-NEXT: vextractf128 $1, %ymm2, %xmm2992; AVX1-NEXT: vpsubq %xmm6, %xmm2, %xmm2993; AVX1-NEXT: vpsubq %xmm7, %xmm3, %xmm6994; AVX1-NEXT: vextractf128 $1, %ymm7, %xmm7995; AVX1-NEXT: vextractf128 $1, %ymm3, %xmm3996; AVX1-NEXT: vpsubq %xmm7, %xmm3, %xmm3997; AVX1-NEXT: vpmovzxbq {{.*#+}} xmm7 = [255,255]998; AVX1-NEXT: vpand %xmm7, %xmm3, %xmm3999; AVX1-NEXT: vpand %xmm7, %xmm6, %xmm61000; AVX1-NEXT: vpackusdw %xmm3, %xmm6, %xmm31001; AVX1-NEXT: vpand %xmm7, %xmm2, %xmm21002; AVX1-NEXT: vpand %xmm7, %xmm5, %xmm51003; AVX1-NEXT: vpackusdw %xmm2, %xmm5, %xmm21004; AVX1-NEXT: vpackusdw %xmm3, %xmm2, %xmm21005; AVX1-NEXT: vpand %xmm7, %xmm1, %xmm11006; AVX1-NEXT: vpand %xmm7, %xmm4, %xmm31007; AVX1-NEXT: vpackusdw %xmm1, %xmm3, %xmm11008; AVX1-NEXT: vpand %xmm7, %xmm0, %xmm01009; AVX1-NEXT: vpand %xmm7, %xmm8, %xmm31010; AVX1-NEXT: vpackusdw %xmm0, %xmm3, %xmm01011; AVX1-NEXT: vpackusdw %xmm1, %xmm0, %xmm01012; AVX1-NEXT: vpackuswb %xmm2, %xmm0, %xmm01013; AVX1-NEXT: vzeroupper1014; AVX1-NEXT: retq1015;1016; AVX2-LABEL: trunc_sub_v16i64_v16i8:1017; AVX2: # %bb.0:1018; AVX2-NEXT: vpsubq %ymm4, %ymm0, %ymm01019; AVX2-NEXT: vpsubq %ymm5, %ymm1, %ymm11020; AVX2-NEXT: vpsubq %ymm6, %ymm2, %ymm21021; AVX2-NEXT: vpsubq %ymm7, %ymm3, %ymm31022; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm4 = [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]1023; AVX2-NEXT: vpand %ymm4, %ymm3, %ymm31024; AVX2-NEXT: vpand %ymm4, %ymm2, %ymm21025; AVX2-NEXT: vpackusdw %ymm3, %ymm2, %ymm21026; AVX2-NEXT: vpermq {{.*#+}} ymm2 = ymm2[0,2,1,3]1027; AVX2-NEXT: vpand %ymm4, %ymm1, %ymm11028; AVX2-NEXT: vpand %ymm4, %ymm0, %ymm01029; AVX2-NEXT: vpackusdw %ymm1, %ymm0, %ymm01030; AVX2-NEXT: vpermq {{.*#+}} ymm0 = ymm0[0,2,1,3]1031; AVX2-NEXT: vpackusdw %ymm2, %ymm0, %ymm01032; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm11033; AVX2-NEXT: vpackuswb %xmm1, %xmm0, %xmm01034; AVX2-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[0,2,1,3]1035; AVX2-NEXT: vzeroupper1036; AVX2-NEXT: retq1037;1038; AVX512-LABEL: trunc_sub_v16i64_v16i8:1039; AVX512: # %bb.0:1040; AVX512-NEXT: vpsubq %zmm2, %zmm0, %zmm01041; AVX512-NEXT: vpsubq %zmm3, %zmm1, %zmm11042; AVX512-NEXT: vpmovqb %zmm1, %xmm11043; AVX512-NEXT: vpmovqb %zmm0, %xmm01044; AVX512-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]1045; AVX512-NEXT: vzeroupper1046; AVX512-NEXT: retq1047 %1 = sub <16 x i64> %a0, %a11048 %2 = trunc <16 x i64> %1 to <16 x i8>1049 ret <16 x i8> %21050}1051 1052define <16 x i8> @trunc_sub_v16i32_v16i8(<16 x i32> %a0, <16 x i32> %a1) nounwind {1053; SSE-LABEL: trunc_sub_v16i32_v16i8:1054; SSE: # %bb.0:1055; SSE-NEXT: psubd %xmm4, %xmm01056; SSE-NEXT: psubd %xmm5, %xmm11057; SSE-NEXT: psubd %xmm6, %xmm21058; SSE-NEXT: psubd %xmm7, %xmm31059; SSE-NEXT: movdqa {{.*#+}} xmm4 = [255,0,0,0,255,0,0,0,255,0,0,0,255,0,0,0]1060; SSE-NEXT: pand %xmm4, %xmm31061; SSE-NEXT: pand %xmm4, %xmm21062; SSE-NEXT: packuswb %xmm3, %xmm21063; SSE-NEXT: pand %xmm4, %xmm11064; SSE-NEXT: pand %xmm4, %xmm01065; SSE-NEXT: packuswb %xmm1, %xmm01066; SSE-NEXT: packuswb %xmm2, %xmm01067; SSE-NEXT: retq1068;1069; AVX1-LABEL: trunc_sub_v16i32_v16i8:1070; AVX1: # %bb.0:1071; AVX1-NEXT: vpsubd %xmm2, %xmm0, %xmm41072; AVX1-NEXT: vextractf128 $1, %ymm2, %xmm21073; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm01074; AVX1-NEXT: vpsubd %xmm2, %xmm0, %xmm01075; AVX1-NEXT: vpsubd %xmm3, %xmm1, %xmm21076; AVX1-NEXT: vextractf128 $1, %ymm3, %xmm31077; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm11078; AVX1-NEXT: vpsubd %xmm3, %xmm1, %xmm11079; AVX1-NEXT: vbroadcastss {{.*#+}} xmm3 = [255,255,255,255]1080; AVX1-NEXT: vpand %xmm3, %xmm1, %xmm11081; AVX1-NEXT: vpand %xmm3, %xmm2, %xmm21082; AVX1-NEXT: vpackusdw %xmm1, %xmm2, %xmm11083; AVX1-NEXT: vpand %xmm3, %xmm0, %xmm01084; AVX1-NEXT: vpand %xmm3, %xmm4, %xmm21085; AVX1-NEXT: vpackusdw %xmm0, %xmm2, %xmm01086; AVX1-NEXT: vpackuswb %xmm1, %xmm0, %xmm01087; AVX1-NEXT: vzeroupper1088; AVX1-NEXT: retq1089;1090; AVX2-LABEL: trunc_sub_v16i32_v16i8:1091; AVX2: # %bb.0:1092; AVX2-NEXT: vpsubd %ymm2, %ymm0, %ymm01093; AVX2-NEXT: vpsubd %ymm3, %ymm1, %ymm11094; 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]1095; AVX2-NEXT: vpand %ymm2, %ymm1, %ymm11096; AVX2-NEXT: vpand %ymm2, %ymm0, %ymm01097; AVX2-NEXT: vpackusdw %ymm1, %ymm0, %ymm01098; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm11099; AVX2-NEXT: vpackuswb %xmm1, %xmm0, %xmm01100; AVX2-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[0,2,1,3]1101; AVX2-NEXT: vzeroupper1102; AVX2-NEXT: retq1103;1104; AVX512-LABEL: trunc_sub_v16i32_v16i8:1105; AVX512: # %bb.0:1106; AVX512-NEXT: vpsubd %zmm1, %zmm0, %zmm01107; AVX512-NEXT: vpmovdb %zmm0, %xmm01108; AVX512-NEXT: vzeroupper1109; AVX512-NEXT: retq1110 %1 = sub <16 x i32> %a0, %a11111 %2 = trunc <16 x i32> %1 to <16 x i8>1112 ret <16 x i8> %21113}1114 1115define <16 x i8> @trunc_sub_v16i16_v16i8(<16 x i16> %a0, <16 x i16> %a1) nounwind {1116; SSE-LABEL: trunc_sub_v16i16_v16i8:1117; SSE: # %bb.0:1118; SSE-NEXT: psubw %xmm2, %xmm01119; SSE-NEXT: psubw %xmm3, %xmm11120; SSE-NEXT: movdqa {{.*#+}} xmm2 = [255,0,255,0,255,0,255,0,255,0,255,0,255,0,255,0]1121; SSE-NEXT: pand %xmm2, %xmm11122; SSE-NEXT: pand %xmm2, %xmm01123; SSE-NEXT: packuswb %xmm1, %xmm01124; SSE-NEXT: retq1125;1126; AVX1-LABEL: trunc_sub_v16i16_v16i8:1127; AVX1: # %bb.0:1128; AVX1-NEXT: vpsubw %xmm1, %xmm0, %xmm21129; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm11130; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm01131; AVX1-NEXT: vpsubw %xmm1, %xmm0, %xmm01132; AVX1-NEXT: vbroadcastss {{.*#+}} xmm1 = [255,255,255,255,255,255,255,255]1133; AVX1-NEXT: vpand %xmm1, %xmm0, %xmm01134; AVX1-NEXT: vpand %xmm1, %xmm2, %xmm11135; AVX1-NEXT: vpackuswb %xmm0, %xmm1, %xmm01136; AVX1-NEXT: vzeroupper1137; AVX1-NEXT: retq1138;1139; AVX2-LABEL: trunc_sub_v16i16_v16i8:1140; AVX2: # %bb.0:1141; AVX2-NEXT: vpsubw %ymm1, %ymm0, %ymm01142; AVX2-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm01143; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm11144; AVX2-NEXT: vpackuswb %xmm1, %xmm0, %xmm01145; AVX2-NEXT: vzeroupper1146; AVX2-NEXT: retq1147;1148; AVX512F-LABEL: trunc_sub_v16i16_v16i8:1149; AVX512F: # %bb.0:1150; AVX512F-NEXT: vpsubw %ymm1, %ymm0, %ymm01151; 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],zero1152; AVX512F-NEXT: vpmovdb %zmm0, %xmm01153; AVX512F-NEXT: vzeroupper1154; AVX512F-NEXT: retq1155;1156; AVX512BW-LABEL: trunc_sub_v16i16_v16i8:1157; AVX512BW: # %bb.0:1158; AVX512BW-NEXT: vpsubw %ymm1, %ymm0, %ymm01159; AVX512BW-NEXT: vpmovwb %zmm0, %ymm01160; AVX512BW-NEXT: # kill: def $xmm0 killed $xmm0 killed $ymm01161; AVX512BW-NEXT: vzeroupper1162; AVX512BW-NEXT: retq1163;1164; AVX512DQ-LABEL: trunc_sub_v16i16_v16i8:1165; AVX512DQ: # %bb.0:1166; AVX512DQ-NEXT: vpsubw %ymm1, %ymm0, %ymm01167; AVX512DQ-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],zero1168; AVX512DQ-NEXT: vpmovdb %zmm0, %xmm01169; AVX512DQ-NEXT: vzeroupper1170; AVX512DQ-NEXT: retq1171 %1 = sub <16 x i16> %a0, %a11172 %2 = trunc <16 x i16> %1 to <16 x i8>1173 ret <16 x i8> %21174}1175 1176define <16 x i8> @trunc_ext_sub_v16i16_v16i8(<16 x i8> %x, <16 x i8> %y) {1177; SSE-LABEL: trunc_ext_sub_v16i16_v16i8:1178; SSE: # %bb.0:1179; SSE-NEXT: psubb %xmm1, %xmm01180; SSE-NEXT: retq1181;1182; AVX-LABEL: trunc_ext_sub_v16i16_v16i8:1183; AVX: # %bb.0:1184; AVX-NEXT: vpsubb %xmm1, %xmm0, %xmm01185; AVX-NEXT: retq1186 %a = zext <16 x i8> %x to <16 x i16>1187 %b = zext <16 x i8> %y to <16 x i16>1188 %c = sub <16 x i16> %a, %b1189 %d = trunc <16 x i16> %c to <16 x i8>1190 ret <16 x i8> %d1191}1192 1193;1194; sub to constant1195;1196 1197define <4 x i32> @trunc_sub_const_v4i64_v4i32(<4 x i64> %a0) nounwind {1198; SSE-LABEL: trunc_sub_const_v4i64_v4i32:1199; SSE: # %bb.0:1200; SSE-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,2],xmm1[0,2]1201; SSE-NEXT: psubd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm01202; SSE-NEXT: retq1203;1204; AVX1-LABEL: trunc_sub_const_v4i64_v4i32:1205; AVX1: # %bb.0:1206; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm11207; AVX1-NEXT: vshufps {{.*#+}} xmm0 = xmm0[0,2],xmm1[0,2]1208; AVX1-NEXT: vpsubd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm01209; AVX1-NEXT: vzeroupper1210; AVX1-NEXT: retq1211;1212; AVX2-SLOW-LABEL: trunc_sub_const_v4i64_v4i32:1213; AVX2-SLOW: # %bb.0:1214; AVX2-SLOW-NEXT: vextractf128 $1, %ymm0, %xmm11215; AVX2-SLOW-NEXT: vshufps {{.*#+}} xmm0 = xmm0[0,2],xmm1[0,2]1216; AVX2-SLOW-NEXT: vpsubd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm01217; AVX2-SLOW-NEXT: vzeroupper1218; AVX2-SLOW-NEXT: retq1219;1220; AVX2-FAST-ALL-LABEL: trunc_sub_const_v4i64_v4i32:1221; AVX2-FAST-ALL: # %bb.0:1222; AVX2-FAST-ALL-NEXT: vpmovsxbd {{.*#+}} ymm1 = [0,2,4,6,0,0,0,0]1223; AVX2-FAST-ALL-NEXT: vpermd %ymm0, %ymm1, %ymm01224; AVX2-FAST-ALL-NEXT: vpsubd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm01225; AVX2-FAST-ALL-NEXT: vzeroupper1226; AVX2-FAST-ALL-NEXT: retq1227;1228; AVX2-FAST-PERLANE-LABEL: trunc_sub_const_v4i64_v4i32:1229; AVX2-FAST-PERLANE: # %bb.0:1230; AVX2-FAST-PERLANE-NEXT: vextractf128 $1, %ymm0, %xmm11231; AVX2-FAST-PERLANE-NEXT: vshufps {{.*#+}} xmm0 = xmm0[0,2],xmm1[0,2]1232; AVX2-FAST-PERLANE-NEXT: vpsubd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm01233; AVX2-FAST-PERLANE-NEXT: vzeroupper1234; AVX2-FAST-PERLANE-NEXT: retq1235;1236; AVX512-LABEL: trunc_sub_const_v4i64_v4i32:1237; AVX512: # %bb.0:1238; AVX512-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm01239; AVX512-NEXT: vpmovqd %zmm0, %ymm01240; AVX512-NEXT: vpsubd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm01241; AVX512-NEXT: vzeroupper1242; AVX512-NEXT: retq1243 %1 = sub <4 x i64> %a0, <i64 0, i64 1, i64 2, i64 3>1244 %2 = trunc <4 x i64> %1 to <4 x i32>1245 ret <4 x i32> %21246}1247 1248define <8 x i16> @trunc_sub_const_v8i64_v8i16(<8 x i64> %a0) nounwind {1249; SSE-LABEL: trunc_sub_const_v8i64_v8i16:1250; SSE: # %bb.0:1251; SSE-NEXT: shufps {{.*#+}} xmm2 = xmm2[0,2],xmm3[0,2]1252; SSE-NEXT: pslld $16, %xmm21253; SSE-NEXT: psrad $16, %xmm21254; SSE-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,2],xmm1[0,2]1255; SSE-NEXT: pslld $16, %xmm01256; SSE-NEXT: psrad $16, %xmm01257; SSE-NEXT: packssdw %xmm2, %xmm01258; SSE-NEXT: psubw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm01259; SSE-NEXT: retq1260;1261; AVX1-LABEL: trunc_sub_const_v8i64_v8i16:1262; AVX1: # %bb.0:1263; AVX1-NEXT: vbroadcastsd {{.*#+}} ymm2 = [65535,65535,65535,65535]1264; AVX1-NEXT: vandps %ymm2, %ymm1, %ymm11265; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm31266; AVX1-NEXT: vpackusdw %xmm3, %xmm1, %xmm11267; AVX1-NEXT: vandps %ymm2, %ymm0, %ymm01268; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm21269; AVX1-NEXT: vpackusdw %xmm2, %xmm0, %xmm01270; AVX1-NEXT: vpackusdw %xmm1, %xmm0, %xmm01271; AVX1-NEXT: vpsubw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm01272; AVX1-NEXT: vzeroupper1273; AVX1-NEXT: retq1274;1275; AVX2-LABEL: trunc_sub_const_v8i64_v8i16:1276; AVX2: # %bb.0:1277; AVX2-NEXT: vpxor %xmm2, %xmm2, %xmm21278; 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]1279; 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]1280; AVX2-NEXT: vpackusdw %ymm1, %ymm0, %ymm01281; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm11282; AVX2-NEXT: vpackusdw %xmm1, %xmm0, %xmm01283; AVX2-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[0,2,1,3]1284; AVX2-NEXT: vpsubw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm01285; AVX2-NEXT: vzeroupper1286; AVX2-NEXT: retq1287;1288; AVX512-LABEL: trunc_sub_const_v8i64_v8i16:1289; AVX512: # %bb.0:1290; AVX512-NEXT: vpmovqw %zmm0, %xmm01291; AVX512-NEXT: vpsubw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm01292; AVX512-NEXT: vzeroupper1293; AVX512-NEXT: retq1294 %1 = sub <8 x i64> %a0, <i64 0, i64 1, i64 2, i64 3, i64 4, i64 5, i64 6, i64 7>1295 %2 = trunc <8 x i64> %1 to <8 x i16>1296 ret <8 x i16> %21297}1298 1299define <8 x i16> @trunc_sub_const_v8i32_v8i16(<8 x i32> %a0) nounwind {1300; SSE-LABEL: trunc_sub_const_v8i32_v8i16:1301; SSE: # %bb.0:1302; SSE-NEXT: pslld $16, %xmm11303; SSE-NEXT: psrad $16, %xmm11304; SSE-NEXT: pslld $16, %xmm01305; SSE-NEXT: psrad $16, %xmm01306; SSE-NEXT: packssdw %xmm1, %xmm01307; SSE-NEXT: psubw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm01308; SSE-NEXT: retq1309;1310; AVX1-LABEL: trunc_sub_const_v8i32_v8i16:1311; AVX1: # %bb.0:1312; AVX1-NEXT: vandps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm01313; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm11314; AVX1-NEXT: vpackusdw %xmm1, %xmm0, %xmm01315; AVX1-NEXT: vpsubw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm01316; AVX1-NEXT: vzeroupper1317; AVX1-NEXT: retq1318;1319; AVX2-LABEL: trunc_sub_const_v8i32_v8i16:1320; AVX2: # %bb.0:1321; 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]1322; AVX2-NEXT: vpermq {{.*#+}} ymm0 = ymm0[0,2,2,3]1323; AVX2-NEXT: vpsubw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm01324; AVX2-NEXT: vzeroupper1325; AVX2-NEXT: retq1326;1327; AVX512-LABEL: trunc_sub_const_v8i32_v8i16:1328; AVX512: # %bb.0:1329; AVX512-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm01330; AVX512-NEXT: vpmovdw %zmm0, %ymm01331; AVX512-NEXT: vpsubw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm01332; AVX512-NEXT: vzeroupper1333; AVX512-NEXT: retq1334 %1 = sub <8 x i32> %a0, <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>1335 %2 = trunc <8 x i32> %1 to <8 x i16>1336 ret <8 x i16> %21337}1338 1339define <16 x i8> @trunc_sub_const_v16i64_v16i8(<16 x i64> %a0) nounwind {1340; SSE-LABEL: trunc_sub_const_v16i64_v16i8:1341; SSE: # %bb.0:1342; SSE-NEXT: movdqa {{.*#+}} xmm8 = [255,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0]1343; SSE-NEXT: pand %xmm8, %xmm71344; SSE-NEXT: pand %xmm8, %xmm61345; SSE-NEXT: packuswb %xmm7, %xmm61346; SSE-NEXT: pand %xmm8, %xmm51347; SSE-NEXT: pand %xmm8, %xmm41348; SSE-NEXT: packuswb %xmm5, %xmm41349; SSE-NEXT: packuswb %xmm6, %xmm41350; SSE-NEXT: pand %xmm8, %xmm31351; SSE-NEXT: pand %xmm8, %xmm21352; SSE-NEXT: packuswb %xmm3, %xmm21353; SSE-NEXT: pand %xmm8, %xmm11354; SSE-NEXT: pand %xmm8, %xmm01355; SSE-NEXT: packuswb %xmm1, %xmm01356; SSE-NEXT: packuswb %xmm2, %xmm01357; SSE-NEXT: packuswb %xmm4, %xmm01358; SSE-NEXT: psubb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm01359; SSE-NEXT: retq1360;1361; AVX1-LABEL: trunc_sub_const_v16i64_v16i8:1362; AVX1: # %bb.0:1363; AVX1-NEXT: vbroadcastsd {{.*#+}} ymm4 = [255,255,255,255]1364; AVX1-NEXT: vandps %ymm4, %ymm3, %ymm31365; AVX1-NEXT: vextractf128 $1, %ymm3, %xmm51366; AVX1-NEXT: vpackusdw %xmm5, %xmm3, %xmm31367; AVX1-NEXT: vandps %ymm4, %ymm2, %ymm21368; AVX1-NEXT: vextractf128 $1, %ymm2, %xmm51369; AVX1-NEXT: vpackusdw %xmm5, %xmm2, %xmm21370; AVX1-NEXT: vpackusdw %xmm3, %xmm2, %xmm21371; AVX1-NEXT: vandps %ymm4, %ymm1, %ymm11372; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm31373; AVX1-NEXT: vpackusdw %xmm3, %xmm1, %xmm11374; AVX1-NEXT: vandps %ymm4, %ymm0, %ymm01375; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm31376; AVX1-NEXT: vpackusdw %xmm3, %xmm0, %xmm01377; AVX1-NEXT: vpackusdw %xmm1, %xmm0, %xmm01378; AVX1-NEXT: vpackuswb %xmm2, %xmm0, %xmm01379; AVX1-NEXT: vpsubb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm01380; AVX1-NEXT: vzeroupper1381; AVX1-NEXT: retq1382;1383; AVX2-LABEL: trunc_sub_const_v16i64_v16i8:1384; AVX2: # %bb.0:1385; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm4 = [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]1386; AVX2-NEXT: vpand %ymm4, %ymm3, %ymm31387; AVX2-NEXT: vpand %ymm4, %ymm2, %ymm21388; AVX2-NEXT: vpackusdw %ymm3, %ymm2, %ymm21389; AVX2-NEXT: vpermq {{.*#+}} ymm2 = ymm2[0,2,1,3]1390; AVX2-NEXT: vpand %ymm4, %ymm1, %ymm11391; AVX2-NEXT: vpand %ymm4, %ymm0, %ymm01392; AVX2-NEXT: vpackusdw %ymm1, %ymm0, %ymm01393; AVX2-NEXT: vpermq {{.*#+}} ymm0 = ymm0[0,2,1,3]1394; AVX2-NEXT: vpackusdw %ymm2, %ymm0, %ymm01395; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm11396; AVX2-NEXT: vpackuswb %xmm1, %xmm0, %xmm01397; AVX2-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[0,2,1,3]1398; AVX2-NEXT: vpsubb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm01399; AVX2-NEXT: vzeroupper1400; AVX2-NEXT: retq1401;1402; AVX512-LABEL: trunc_sub_const_v16i64_v16i8:1403; AVX512: # %bb.0:1404; AVX512-NEXT: vpmovqb %zmm1, %xmm11405; AVX512-NEXT: vpmovqb %zmm0, %xmm01406; AVX512-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]1407; AVX512-NEXT: vpsubb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm01408; AVX512-NEXT: vzeroupper1409; AVX512-NEXT: retq1410 %1 = sub <16 x i64> %a0, <i64 0, i64 1, i64 2, i64 3, i64 4, i64 5, i64 6, i64 7, i64 8, i64 9, i64 10, i64 11, i64 12, i64 13, i64 14, i64 15>1411 %2 = trunc <16 x i64> %1 to <16 x i8>1412 ret <16 x i8> %21413}1414 1415define <16 x i8> @trunc_sub_const_v16i32_v16i8(<16 x i32> %a0) nounwind {1416; SSE-LABEL: trunc_sub_const_v16i32_v16i8:1417; SSE: # %bb.0:1418; SSE-NEXT: movdqa {{.*#+}} xmm4 = [255,0,0,0,255,0,0,0,255,0,0,0,255,0,0,0]1419; SSE-NEXT: pand %xmm4, %xmm31420; SSE-NEXT: pand %xmm4, %xmm21421; SSE-NEXT: packuswb %xmm3, %xmm21422; SSE-NEXT: pand %xmm4, %xmm11423; SSE-NEXT: pand %xmm4, %xmm01424; SSE-NEXT: packuswb %xmm1, %xmm01425; SSE-NEXT: packuswb %xmm2, %xmm01426; SSE-NEXT: psubb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm01427; SSE-NEXT: retq1428;1429; AVX1-LABEL: trunc_sub_const_v16i32_v16i8:1430; AVX1: # %bb.0:1431; AVX1-NEXT: vbroadcastss {{.*#+}} ymm2 = [255,255,255,255,255,255,255,255]1432; AVX1-NEXT: vandps %ymm2, %ymm1, %ymm11433; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm31434; AVX1-NEXT: vpackusdw %xmm3, %xmm1, %xmm11435; AVX1-NEXT: vandps %ymm2, %ymm0, %ymm01436; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm21437; AVX1-NEXT: vpackusdw %xmm2, %xmm0, %xmm01438; AVX1-NEXT: vpackuswb %xmm1, %xmm0, %xmm01439; AVX1-NEXT: vpsubb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm01440; AVX1-NEXT: vzeroupper1441; AVX1-NEXT: retq1442;1443; AVX2-LABEL: trunc_sub_const_v16i32_v16i8:1444; AVX2: # %bb.0:1445; 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]1446; AVX2-NEXT: vpand %ymm2, %ymm1, %ymm11447; AVX2-NEXT: vpand %ymm2, %ymm0, %ymm01448; AVX2-NEXT: vpackusdw %ymm1, %ymm0, %ymm01449; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm11450; AVX2-NEXT: vpackuswb %xmm1, %xmm0, %xmm01451; AVX2-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[0,2,1,3]1452; AVX2-NEXT: vpsubb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm01453; AVX2-NEXT: vzeroupper1454; AVX2-NEXT: retq1455;1456; AVX512-LABEL: trunc_sub_const_v16i32_v16i8:1457; AVX512: # %bb.0:1458; AVX512-NEXT: vpmovdb %zmm0, %xmm01459; AVX512-NEXT: vpsubb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm01460; AVX512-NEXT: vzeroupper1461; AVX512-NEXT: retq1462 %1 = sub <16 x i32> %a0, <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>1463 %2 = trunc <16 x i32> %1 to <16 x i8>1464 ret <16 x i8> %21465}1466 1467define <16 x i8> @trunc_sub_const_v16i16_v16i8(<16 x i16> %a0) nounwind {1468; SSE-LABEL: trunc_sub_const_v16i16_v16i8:1469; SSE: # %bb.0:1470; SSE-NEXT: movdqa {{.*#+}} xmm2 = [255,0,255,0,255,0,255,0,255,0,255,0,255,0,255,0]1471; SSE-NEXT: pand %xmm2, %xmm11472; SSE-NEXT: pand %xmm2, %xmm01473; SSE-NEXT: packuswb %xmm1, %xmm01474; SSE-NEXT: psubb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm01475; SSE-NEXT: retq1476;1477; AVX1-LABEL: trunc_sub_const_v16i16_v16i8:1478; AVX1: # %bb.0:1479; AVX1-NEXT: vandps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm01480; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm11481; AVX1-NEXT: vpackuswb %xmm1, %xmm0, %xmm01482; AVX1-NEXT: vpsubb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm01483; AVX1-NEXT: vzeroupper1484; AVX1-NEXT: retq1485;1486; AVX2-LABEL: trunc_sub_const_v16i16_v16i8:1487; AVX2: # %bb.0:1488; AVX2-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm01489; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm11490; AVX2-NEXT: vpackuswb %xmm1, %xmm0, %xmm01491; AVX2-NEXT: vpsubb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm01492; AVX2-NEXT: vzeroupper1493; AVX2-NEXT: retq1494;1495; AVX512F-LABEL: trunc_sub_const_v16i16_v16i8:1496; AVX512F: # %bb.0:1497; 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],zero1498; AVX512F-NEXT: vpmovdb %zmm0, %xmm01499; AVX512F-NEXT: vpsubb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm01500; AVX512F-NEXT: vzeroupper1501; AVX512F-NEXT: retq1502;1503; AVX512BW-LABEL: trunc_sub_const_v16i16_v16i8:1504; AVX512BW: # %bb.0:1505; AVX512BW-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm01506; AVX512BW-NEXT: vpmovwb %zmm0, %ymm01507; AVX512BW-NEXT: vpsubb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm01508; AVX512BW-NEXT: vzeroupper1509; AVX512BW-NEXT: retq1510;1511; AVX512DQ-LABEL: trunc_sub_const_v16i16_v16i8:1512; AVX512DQ: # %bb.0:1513; AVX512DQ-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],zero1514; AVX512DQ-NEXT: vpmovdb %zmm0, %xmm01515; AVX512DQ-NEXT: vpsubb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm01516; AVX512DQ-NEXT: vzeroupper1517; AVX512DQ-NEXT: retq1518 %1 = sub <16 x i16> %a0, <i16 0, i16 1, i16 2, i16 3, i16 4, i16 5, i16 6, i16 7, i16 8, i16 9, i16 10, i16 11, i16 12, i16 13, i16 14, i16 15>1519 %2 = trunc <16 x i16> %1 to <16 x i8>1520 ret <16 x i8> %21521}1522 1523define <16 x i8> @trunc_ext_sub_const_rhs_v16i16_v16i8(<16 x i8> %x) {1524; SSE-LABEL: trunc_ext_sub_const_rhs_v16i16_v16i8:1525; SSE: # %bb.0:1526; SSE-NEXT: psubb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm01527; SSE-NEXT: retq1528;1529; AVX-LABEL: trunc_ext_sub_const_rhs_v16i16_v16i8:1530; AVX: # %bb.0:1531; AVX-NEXT: vpsubb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm01532; AVX-NEXT: retq1533 %a = zext <16 x i8> %x to <16 x i16>1534 %b = sub <16 x i16> %a, <i16 0, i16 1, i16 2, i16 3, i16 4, i16 5, i16 6, i16 7, i16 8, i16 9, i16 10, i16 11, i16 12, i16 13, i16 14, i16 15>1535 %c = trunc <16 x i16> %b to <16 x i8>1536 ret <16 x i8> %c1537}1538 1539define <16 x i8> @trunc_ext_sub_const_lhs_v16i16_v16i8(<16 x i8> %x) {1540; SSE-LABEL: trunc_ext_sub_const_lhs_v16i16_v16i8:1541; SSE: # %bb.0:1542; SSE-NEXT: movdqa {{.*#+}} xmm1 = [0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15]1543; SSE-NEXT: psubb %xmm0, %xmm11544; SSE-NEXT: movdqa %xmm1, %xmm01545; SSE-NEXT: retq1546;1547; AVX-LABEL: trunc_ext_sub_const_lhs_v16i16_v16i8:1548; AVX: # %bb.0:1549; AVX-NEXT: vmovdqa {{.*#+}} xmm1 = [0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15]1550; AVX-NEXT: vpsubb %xmm0, %xmm1, %xmm01551; AVX-NEXT: retq1552 %a = zext <16 x i8> %x to <16 x i16>1553 %b = sub <16 x i16> <i16 0, i16 1, i16 2, i16 3, i16 4, i16 5, i16 6, i16 7, i16 8, i16 9, i16 10, i16 11, i16 12, i16 13, i16 14, i16 15>, %a1554 %c = trunc <16 x i16> %b to <16 x i8>1555 ret <16 x i8> %c1556}1557 1558;1559; mul1560;1561 1562define <4 x i32> @trunc_mul_v4i64_v4i32(<4 x i64> %a0, <4 x i64> %a1) nounwind {1563; SSE-LABEL: trunc_mul_v4i64_v4i32:1564; SSE: # %bb.0:1565; SSE-NEXT: pmuludq %xmm3, %xmm11566; SSE-NEXT: pmuludq %xmm2, %xmm01567; SSE-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,2],xmm1[0,2]1568; SSE-NEXT: retq1569;1570; AVX1-LABEL: trunc_mul_v4i64_v4i32:1571; AVX1: # %bb.0:1572; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm21573; AVX1-NEXT: vshufps {{.*#+}} xmm1 = xmm1[0,2],xmm2[0,2]1574; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm21575; AVX1-NEXT: vshufps {{.*#+}} xmm0 = xmm0[0,2],xmm2[0,2]1576; AVX1-NEXT: vpmulld %xmm1, %xmm0, %xmm01577; AVX1-NEXT: vzeroupper1578; AVX1-NEXT: retq1579;1580; AVX2-SLOW-LABEL: trunc_mul_v4i64_v4i32:1581; AVX2-SLOW: # %bb.0:1582; AVX2-SLOW-NEXT: vextractf128 $1, %ymm1, %xmm21583; AVX2-SLOW-NEXT: vshufps {{.*#+}} xmm1 = xmm1[0,2],xmm2[0,2]1584; AVX2-SLOW-NEXT: vextractf128 $1, %ymm0, %xmm21585; AVX2-SLOW-NEXT: vshufps {{.*#+}} xmm0 = xmm0[0,2],xmm2[0,2]1586; AVX2-SLOW-NEXT: vpmulld %xmm1, %xmm0, %xmm01587; AVX2-SLOW-NEXT: vzeroupper1588; AVX2-SLOW-NEXT: retq1589;1590; AVX2-FAST-ALL-LABEL: trunc_mul_v4i64_v4i32:1591; AVX2-FAST-ALL: # %bb.0:1592; AVX2-FAST-ALL-NEXT: vpmovsxbd {{.*#+}} ymm2 = [0,2,4,6,4,6,6,7]1593; AVX2-FAST-ALL-NEXT: vpermd %ymm1, %ymm2, %ymm11594; AVX2-FAST-ALL-NEXT: vpermd %ymm0, %ymm2, %ymm01595; AVX2-FAST-ALL-NEXT: vpmulld %xmm1, %xmm0, %xmm01596; AVX2-FAST-ALL-NEXT: vzeroupper1597; AVX2-FAST-ALL-NEXT: retq1598;1599; AVX2-FAST-PERLANE-LABEL: trunc_mul_v4i64_v4i32:1600; AVX2-FAST-PERLANE: # %bb.0:1601; AVX2-FAST-PERLANE-NEXT: vextractf128 $1, %ymm1, %xmm21602; AVX2-FAST-PERLANE-NEXT: vshufps {{.*#+}} xmm1 = xmm1[0,2],xmm2[0,2]1603; AVX2-FAST-PERLANE-NEXT: vextractf128 $1, %ymm0, %xmm21604; AVX2-FAST-PERLANE-NEXT: vshufps {{.*#+}} xmm0 = xmm0[0,2],xmm2[0,2]1605; AVX2-FAST-PERLANE-NEXT: vpmulld %xmm1, %xmm0, %xmm01606; AVX2-FAST-PERLANE-NEXT: vzeroupper1607; AVX2-FAST-PERLANE-NEXT: retq1608;1609; AVX512F-LABEL: trunc_mul_v4i64_v4i32:1610; AVX512F: # %bb.0:1611; AVX512F-NEXT: # kill: def $ymm1 killed $ymm1 def $zmm11612; AVX512F-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm01613; AVX512F-NEXT: vpmovqd %zmm1, %ymm11614; AVX512F-NEXT: vpmovqd %zmm0, %ymm01615; AVX512F-NEXT: vpmulld %xmm1, %xmm0, %xmm01616; AVX512F-NEXT: vzeroupper1617; AVX512F-NEXT: retq1618;1619; AVX512BW-LABEL: trunc_mul_v4i64_v4i32:1620; AVX512BW: # %bb.0:1621; AVX512BW-NEXT: # kill: def $ymm1 killed $ymm1 def $zmm11622; AVX512BW-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm01623; AVX512BW-NEXT: vpmovqd %zmm1, %ymm11624; AVX512BW-NEXT: vpmovqd %zmm0, %ymm01625; AVX512BW-NEXT: vpmulld %xmm1, %xmm0, %xmm01626; AVX512BW-NEXT: vzeroupper1627; AVX512BW-NEXT: retq1628;1629; AVX512DQ-LABEL: trunc_mul_v4i64_v4i32:1630; AVX512DQ: # %bb.0:1631; AVX512DQ-NEXT: # kill: def $ymm1 killed $ymm1 def $zmm11632; AVX512DQ-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm01633; AVX512DQ-NEXT: vpmullq %zmm1, %zmm0, %zmm01634; AVX512DQ-NEXT: vpmovqd %zmm0, %ymm01635; AVX512DQ-NEXT: # kill: def $xmm0 killed $xmm0 killed $ymm01636; AVX512DQ-NEXT: vzeroupper1637; AVX512DQ-NEXT: retq1638 %1 = mul <4 x i64> %a0, %a11639 %2 = trunc <4 x i64> %1 to <4 x i32>1640 ret <4 x i32> %21641}1642 1643define <8 x i16> @trunc_mul_v8i64_v8i16(<8 x i64> %a0, <8 x i64> %a1) nounwind {1644; SSE-LABEL: trunc_mul_v8i64_v8i16:1645; SSE: # %bb.0:1646; SSE-NEXT: shufps {{.*#+}} xmm6 = xmm6[0,2],xmm7[0,2]1647; SSE-NEXT: pslld $16, %xmm61648; SSE-NEXT: psrad $16, %xmm61649; SSE-NEXT: shufps {{.*#+}} xmm4 = xmm4[0,2],xmm5[0,2]1650; SSE-NEXT: pslld $16, %xmm41651; SSE-NEXT: psrad $16, %xmm41652; SSE-NEXT: packssdw %xmm6, %xmm41653; SSE-NEXT: shufps {{.*#+}} xmm2 = xmm2[0,2],xmm3[0,2]1654; SSE-NEXT: pslld $16, %xmm21655; SSE-NEXT: psrad $16, %xmm21656; SSE-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,2],xmm1[0,2]1657; SSE-NEXT: pslld $16, %xmm01658; SSE-NEXT: psrad $16, %xmm01659; SSE-NEXT: packssdw %xmm2, %xmm01660; SSE-NEXT: pmullw %xmm4, %xmm01661; SSE-NEXT: retq1662;1663; AVX1-LABEL: trunc_mul_v8i64_v8i16:1664; AVX1: # %bb.0:1665; AVX1-NEXT: vbroadcastsd {{.*#+}} ymm4 = [65535,65535,65535,65535]1666; AVX1-NEXT: vandps %ymm4, %ymm3, %ymm31667; AVX1-NEXT: vextractf128 $1, %ymm3, %xmm51668; AVX1-NEXT: vpackusdw %xmm5, %xmm3, %xmm31669; AVX1-NEXT: vandps %ymm4, %ymm2, %ymm21670; AVX1-NEXT: vextractf128 $1, %ymm2, %xmm51671; AVX1-NEXT: vpackusdw %xmm5, %xmm2, %xmm21672; AVX1-NEXT: vpackusdw %xmm3, %xmm2, %xmm21673; AVX1-NEXT: vandps %ymm4, %ymm1, %ymm11674; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm31675; AVX1-NEXT: vpackusdw %xmm3, %xmm1, %xmm11676; AVX1-NEXT: vandps %ymm4, %ymm0, %ymm01677; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm31678; AVX1-NEXT: vpackusdw %xmm3, %xmm0, %xmm01679; AVX1-NEXT: vpackusdw %xmm1, %xmm0, %xmm01680; AVX1-NEXT: vpmullw %xmm2, %xmm0, %xmm01681; AVX1-NEXT: vzeroupper1682; AVX1-NEXT: retq1683;1684; AVX2-LABEL: trunc_mul_v8i64_v8i16:1685; AVX2: # %bb.0:1686; AVX2-NEXT: vpxor %xmm4, %xmm4, %xmm41687; AVX2-NEXT: vpblendw {{.*#+}} ymm3 = ymm3[0],ymm4[1,2,3],ymm3[4],ymm4[5,6,7],ymm3[8],ymm4[9,10,11],ymm3[12],ymm4[13,14,15]1688; AVX2-NEXT: vpblendw {{.*#+}} ymm2 = ymm2[0],ymm4[1,2,3],ymm2[4],ymm4[5,6,7],ymm2[8],ymm4[9,10,11],ymm2[12],ymm4[13,14,15]1689; AVX2-NEXT: vpackusdw %ymm3, %ymm2, %ymm21690; AVX2-NEXT: vextracti128 $1, %ymm2, %xmm31691; AVX2-NEXT: vpackusdw %xmm3, %xmm2, %xmm21692; AVX2-NEXT: vpblendw {{.*#+}} ymm1 = ymm1[0],ymm4[1,2,3],ymm1[4],ymm4[5,6,7],ymm1[8],ymm4[9,10,11],ymm1[12],ymm4[13,14,15]1693; AVX2-NEXT: vpblendw {{.*#+}} ymm0 = ymm0[0],ymm4[1,2,3],ymm0[4],ymm4[5,6,7],ymm0[8],ymm4[9,10,11],ymm0[12],ymm4[13,14,15]1694; AVX2-NEXT: vpackusdw %ymm1, %ymm0, %ymm01695; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm11696; AVX2-NEXT: vpackusdw %xmm1, %xmm0, %xmm01697; AVX2-NEXT: vpmullw %xmm2, %xmm0, %xmm01698; AVX2-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[0,2,1,3]1699; AVX2-NEXT: vzeroupper1700; AVX2-NEXT: retq1701;1702; AVX512F-LABEL: trunc_mul_v8i64_v8i16:1703; AVX512F: # %bb.0:1704; AVX512F-NEXT: vpmovqw %zmm1, %xmm11705; AVX512F-NEXT: vpmovqw %zmm0, %xmm01706; AVX512F-NEXT: vpmullw %xmm1, %xmm0, %xmm01707; AVX512F-NEXT: vzeroupper1708; AVX512F-NEXT: retq1709;1710; AVX512BW-LABEL: trunc_mul_v8i64_v8i16:1711; AVX512BW: # %bb.0:1712; AVX512BW-NEXT: vpmovqw %zmm1, %xmm11713; AVX512BW-NEXT: vpmovqw %zmm0, %xmm01714; AVX512BW-NEXT: vpmullw %xmm1, %xmm0, %xmm01715; AVX512BW-NEXT: vzeroupper1716; AVX512BW-NEXT: retq1717;1718; AVX512DQ-LABEL: trunc_mul_v8i64_v8i16:1719; AVX512DQ: # %bb.0:1720; AVX512DQ-NEXT: vpmullq %zmm1, %zmm0, %zmm01721; AVX512DQ-NEXT: vpmovqw %zmm0, %xmm01722; AVX512DQ-NEXT: vzeroupper1723; AVX512DQ-NEXT: retq1724 %1 = mul <8 x i64> %a0, %a11725 %2 = trunc <8 x i64> %1 to <8 x i16>1726 ret <8 x i16> %21727}1728 1729define <8 x i16> @trunc_mul_v8i32_v8i16(<8 x i32> %a0, <8 x i32> %a1) nounwind {1730; SSE-LABEL: trunc_mul_v8i32_v8i16:1731; SSE: # %bb.0:1732; SSE-NEXT: pshufd {{.*#+}} xmm4 = xmm0[1,1,3,3]1733; SSE-NEXT: pmuludq %xmm2, %xmm01734; SSE-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]1735; SSE-NEXT: pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]1736; SSE-NEXT: pmuludq %xmm4, %xmm21737; SSE-NEXT: pshufd {{.*#+}} xmm2 = xmm2[0,2,2,3]1738; SSE-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1]1739; SSE-NEXT: pshufd {{.*#+}} xmm2 = xmm1[1,1,3,3]1740; SSE-NEXT: pmuludq %xmm3, %xmm11741; SSE-NEXT: pshufd {{.*#+}} xmm1 = xmm1[0,2,2,3]1742; SSE-NEXT: pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]1743; SSE-NEXT: pmuludq %xmm2, %xmm31744; SSE-NEXT: pshufd {{.*#+}} xmm2 = xmm3[0,2,2,3]1745; SSE-NEXT: punpckldq {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1]1746; SSE-NEXT: pslld $16, %xmm11747; SSE-NEXT: psrad $16, %xmm11748; SSE-NEXT: pslld $16, %xmm01749; SSE-NEXT: psrad $16, %xmm01750; SSE-NEXT: packssdw %xmm1, %xmm01751; SSE-NEXT: retq1752;1753; AVX1-LABEL: trunc_mul_v8i32_v8i16:1754; AVX1: # %bb.0:1755; AVX1-NEXT: vpmulld %xmm1, %xmm0, %xmm21756; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm11757; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm01758; AVX1-NEXT: vpmulld %xmm1, %xmm0, %xmm01759; AVX1-NEXT: vpxor %xmm1, %xmm1, %xmm11760; AVX1-NEXT: vpblendw {{.*#+}} xmm0 = xmm0[0],xmm1[1],xmm0[2],xmm1[3],xmm0[4],xmm1[5],xmm0[6],xmm1[7]1761; AVX1-NEXT: vpblendw {{.*#+}} xmm1 = xmm2[0],xmm1[1],xmm2[2],xmm1[3],xmm2[4],xmm1[5],xmm2[6],xmm1[7]1762; AVX1-NEXT: vpackusdw %xmm0, %xmm1, %xmm01763; AVX1-NEXT: vzeroupper1764; AVX1-NEXT: retq1765;1766; AVX2-LABEL: trunc_mul_v8i32_v8i16:1767; AVX2: # %bb.0:1768; AVX2-NEXT: vpmulld %ymm1, %ymm0, %ymm01769; 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]1770; AVX2-NEXT: vpermq {{.*#+}} ymm0 = ymm0[0,2,2,3]1771; AVX2-NEXT: # kill: def $xmm0 killed $xmm0 killed $ymm01772; AVX2-NEXT: vzeroupper1773; AVX2-NEXT: retq1774;1775; AVX512-LABEL: trunc_mul_v8i32_v8i16:1776; AVX512: # %bb.0:1777; AVX512-NEXT: vpmulld %ymm1, %ymm0, %ymm01778; AVX512-NEXT: vpmovdw %zmm0, %ymm01779; AVX512-NEXT: # kill: def $xmm0 killed $xmm0 killed $ymm01780; AVX512-NEXT: vzeroupper1781; AVX512-NEXT: retq1782 %1 = mul <8 x i32> %a0, %a11783 %2 = trunc <8 x i32> %1 to <8 x i16>1784 ret <8 x i16> %21785}1786 1787define <16 x i8> @trunc_mul_v16i64_v16i8(<16 x i64> %a0, <16 x i64> %a1) nounwind {1788; SSE-LABEL: trunc_mul_v16i64_v16i8:1789; SSE: # %bb.0:1790; SSE-NEXT: pmuludq {{[0-9]+}}(%rsp), %xmm01791; SSE-NEXT: pmuludq {{[0-9]+}}(%rsp), %xmm11792; SSE-NEXT: pmuludq {{[0-9]+}}(%rsp), %xmm21793; SSE-NEXT: pmuludq {{[0-9]+}}(%rsp), %xmm31794; SSE-NEXT: pmuludq {{[0-9]+}}(%rsp), %xmm41795; SSE-NEXT: pmuludq {{[0-9]+}}(%rsp), %xmm51796; SSE-NEXT: pmuludq {{[0-9]+}}(%rsp), %xmm61797; SSE-NEXT: pmuludq {{[0-9]+}}(%rsp), %xmm71798; SSE-NEXT: movdqa {{.*#+}} xmm8 = [255,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0]1799; SSE-NEXT: pand %xmm8, %xmm71800; SSE-NEXT: pand %xmm8, %xmm61801; SSE-NEXT: packuswb %xmm7, %xmm61802; SSE-NEXT: pand %xmm8, %xmm51803; SSE-NEXT: pand %xmm8, %xmm41804; SSE-NEXT: packuswb %xmm5, %xmm41805; SSE-NEXT: packuswb %xmm6, %xmm41806; SSE-NEXT: pand %xmm8, %xmm31807; SSE-NEXT: pand %xmm8, %xmm21808; SSE-NEXT: packuswb %xmm3, %xmm21809; SSE-NEXT: pand %xmm8, %xmm11810; SSE-NEXT: pand %xmm8, %xmm01811; SSE-NEXT: packuswb %xmm1, %xmm01812; SSE-NEXT: packuswb %xmm2, %xmm01813; SSE-NEXT: packuswb %xmm4, %xmm01814; SSE-NEXT: retq1815;1816; AVX1-LABEL: trunc_mul_v16i64_v16i8:1817; AVX1: # %bb.0:1818; AVX1-NEXT: vpmuludq %xmm4, %xmm0, %xmm81819; AVX1-NEXT: vextractf128 $1, %ymm4, %xmm41820; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm01821; AVX1-NEXT: vpmuludq %xmm4, %xmm0, %xmm01822; AVX1-NEXT: vpmuludq %xmm5, %xmm1, %xmm41823; AVX1-NEXT: vextractf128 $1, %ymm5, %xmm51824; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm11825; AVX1-NEXT: vpmuludq %xmm5, %xmm1, %xmm11826; AVX1-NEXT: vpmuludq %xmm6, %xmm2, %xmm51827; AVX1-NEXT: vextractf128 $1, %ymm6, %xmm61828; AVX1-NEXT: vextractf128 $1, %ymm2, %xmm21829; AVX1-NEXT: vpmuludq %xmm6, %xmm2, %xmm21830; AVX1-NEXT: vpmuludq %xmm7, %xmm3, %xmm61831; AVX1-NEXT: vextractf128 $1, %ymm7, %xmm71832; AVX1-NEXT: vextractf128 $1, %ymm3, %xmm31833; AVX1-NEXT: vpmuludq %xmm7, %xmm3, %xmm31834; AVX1-NEXT: vpmovzxbq {{.*#+}} xmm7 = [255,255]1835; AVX1-NEXT: vpand %xmm7, %xmm3, %xmm31836; AVX1-NEXT: vpand %xmm7, %xmm6, %xmm61837; AVX1-NEXT: vpackusdw %xmm3, %xmm6, %xmm31838; AVX1-NEXT: vpand %xmm7, %xmm2, %xmm21839; AVX1-NEXT: vpand %xmm7, %xmm5, %xmm51840; AVX1-NEXT: vpackusdw %xmm2, %xmm5, %xmm21841; AVX1-NEXT: vpackusdw %xmm3, %xmm2, %xmm21842; AVX1-NEXT: vpand %xmm7, %xmm1, %xmm11843; AVX1-NEXT: vpand %xmm7, %xmm4, %xmm31844; AVX1-NEXT: vpackusdw %xmm1, %xmm3, %xmm11845; AVX1-NEXT: vpand %xmm7, %xmm0, %xmm01846; AVX1-NEXT: vpand %xmm7, %xmm8, %xmm31847; AVX1-NEXT: vpackusdw %xmm0, %xmm3, %xmm01848; AVX1-NEXT: vpackusdw %xmm1, %xmm0, %xmm01849; AVX1-NEXT: vpackuswb %xmm2, %xmm0, %xmm01850; AVX1-NEXT: vzeroupper1851; AVX1-NEXT: retq1852;1853; AVX2-LABEL: trunc_mul_v16i64_v16i8:1854; AVX2: # %bb.0:1855; AVX2-NEXT: vpmuludq %ymm4, %ymm0, %ymm01856; AVX2-NEXT: vpmuludq %ymm5, %ymm1, %ymm11857; AVX2-NEXT: vpmuludq %ymm6, %ymm2, %ymm21858; AVX2-NEXT: vpmuludq %ymm7, %ymm3, %ymm31859; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm4 = [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]1860; AVX2-NEXT: vpand %ymm4, %ymm3, %ymm31861; AVX2-NEXT: vpand %ymm4, %ymm2, %ymm21862; AVX2-NEXT: vpackusdw %ymm3, %ymm2, %ymm21863; AVX2-NEXT: vpermq {{.*#+}} ymm2 = ymm2[0,2,1,3]1864; AVX2-NEXT: vpand %ymm4, %ymm1, %ymm11865; AVX2-NEXT: vpand %ymm4, %ymm0, %ymm01866; AVX2-NEXT: vpackusdw %ymm1, %ymm0, %ymm01867; AVX2-NEXT: vpermq {{.*#+}} ymm0 = ymm0[0,2,1,3]1868; AVX2-NEXT: vpackusdw %ymm2, %ymm0, %ymm01869; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm11870; AVX2-NEXT: vpackuswb %xmm1, %xmm0, %xmm01871; AVX2-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[0,2,1,3]1872; AVX2-NEXT: vzeroupper1873; AVX2-NEXT: retq1874;1875; AVX512F-LABEL: trunc_mul_v16i64_v16i8:1876; AVX512F: # %bb.0:1877; AVX512F-NEXT: vpmuludq %zmm2, %zmm0, %zmm01878; AVX512F-NEXT: vpmuludq %zmm3, %zmm1, %zmm11879; AVX512F-NEXT: vpmovqb %zmm1, %xmm11880; AVX512F-NEXT: vpmovqb %zmm0, %xmm01881; AVX512F-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]1882; AVX512F-NEXT: vzeroupper1883; AVX512F-NEXT: retq1884;1885; AVX512BW-LABEL: trunc_mul_v16i64_v16i8:1886; AVX512BW: # %bb.0:1887; AVX512BW-NEXT: vpmuludq %zmm2, %zmm0, %zmm01888; AVX512BW-NEXT: vpmuludq %zmm3, %zmm1, %zmm11889; AVX512BW-NEXT: vpmovqb %zmm1, %xmm11890; AVX512BW-NEXT: vpmovqb %zmm0, %xmm01891; AVX512BW-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]1892; AVX512BW-NEXT: vzeroupper1893; AVX512BW-NEXT: retq1894;1895; AVX512DQ-LABEL: trunc_mul_v16i64_v16i8:1896; AVX512DQ: # %bb.0:1897; AVX512DQ-NEXT: vpmullq %zmm2, %zmm0, %zmm01898; AVX512DQ-NEXT: vpmullq %zmm3, %zmm1, %zmm11899; AVX512DQ-NEXT: vpmovqb %zmm1, %xmm11900; AVX512DQ-NEXT: vpmovqb %zmm0, %xmm01901; AVX512DQ-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]1902; AVX512DQ-NEXT: vzeroupper1903; AVX512DQ-NEXT: retq1904 %1 = mul <16 x i64> %a0, %a11905 %2 = trunc <16 x i64> %1 to <16 x i8>1906 ret <16 x i8> %21907}1908 1909define <16 x i8> @trunc_mul_v16i32_v16i8(<16 x i32> %a0, <16 x i32> %a1) nounwind {1910; SSE-LABEL: trunc_mul_v16i32_v16i8:1911; SSE: # %bb.0:1912; SSE-NEXT: pshufd {{.*#+}} xmm8 = xmm0[1,1,3,3]1913; SSE-NEXT: pmuludq %xmm4, %xmm01914; SSE-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]1915; SSE-NEXT: pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]1916; SSE-NEXT: pmuludq %xmm8, %xmm41917; SSE-NEXT: pshufd {{.*#+}} xmm4 = xmm4[0,2,2,3]1918; SSE-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm4[0],xmm0[1],xmm4[1]1919; SSE-NEXT: pshufd {{.*#+}} xmm4 = xmm1[1,1,3,3]1920; SSE-NEXT: pmuludq %xmm5, %xmm11921; SSE-NEXT: pshufd {{.*#+}} xmm1 = xmm1[0,2,2,3]1922; SSE-NEXT: pshufd {{.*#+}} xmm5 = xmm5[1,1,3,3]1923; SSE-NEXT: pmuludq %xmm4, %xmm51924; SSE-NEXT: pshufd {{.*#+}} xmm4 = xmm5[0,2,2,3]1925; SSE-NEXT: punpckldq {{.*#+}} xmm1 = xmm1[0],xmm4[0],xmm1[1],xmm4[1]1926; SSE-NEXT: pshufd {{.*#+}} xmm4 = xmm2[1,1,3,3]1927; SSE-NEXT: pmuludq %xmm6, %xmm21928; SSE-NEXT: pshufd {{.*#+}} xmm2 = xmm2[0,2,2,3]1929; SSE-NEXT: pshufd {{.*#+}} xmm5 = xmm6[1,1,3,3]1930; SSE-NEXT: pmuludq %xmm4, %xmm51931; SSE-NEXT: pshufd {{.*#+}} xmm4 = xmm5[0,2,2,3]1932; SSE-NEXT: punpckldq {{.*#+}} xmm2 = xmm2[0],xmm4[0],xmm2[1],xmm4[1]1933; SSE-NEXT: pshufd {{.*#+}} xmm4 = xmm3[1,1,3,3]1934; SSE-NEXT: pmuludq %xmm7, %xmm31935; SSE-NEXT: pshufd {{.*#+}} xmm3 = xmm3[0,2,2,3]1936; SSE-NEXT: pshufd {{.*#+}} xmm5 = xmm7[1,1,3,3]1937; SSE-NEXT: pmuludq %xmm4, %xmm51938; SSE-NEXT: pshufd {{.*#+}} xmm4 = xmm5[0,2,2,3]1939; SSE-NEXT: punpckldq {{.*#+}} xmm3 = xmm3[0],xmm4[0],xmm3[1],xmm4[1]1940; SSE-NEXT: movdqa {{.*#+}} xmm4 = [255,0,0,0,255,0,0,0,255,0,0,0,255,0,0,0]1941; SSE-NEXT: pand %xmm4, %xmm31942; SSE-NEXT: pand %xmm4, %xmm21943; SSE-NEXT: packuswb %xmm3, %xmm21944; SSE-NEXT: pand %xmm4, %xmm11945; SSE-NEXT: pand %xmm4, %xmm01946; SSE-NEXT: packuswb %xmm1, %xmm01947; SSE-NEXT: packuswb %xmm2, %xmm01948; SSE-NEXT: retq1949;1950; AVX1-LABEL: trunc_mul_v16i32_v16i8:1951; AVX1: # %bb.0:1952; AVX1-NEXT: vpmulld %xmm2, %xmm0, %xmm41953; AVX1-NEXT: vextractf128 $1, %ymm2, %xmm21954; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm01955; AVX1-NEXT: vpmulld %xmm2, %xmm0, %xmm01956; AVX1-NEXT: vpmulld %xmm3, %xmm1, %xmm21957; AVX1-NEXT: vextractf128 $1, %ymm3, %xmm31958; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm11959; AVX1-NEXT: vpmulld %xmm3, %xmm1, %xmm11960; AVX1-NEXT: vbroadcastss {{.*#+}} xmm3 = [255,255,255,255]1961; AVX1-NEXT: vpand %xmm3, %xmm1, %xmm11962; AVX1-NEXT: vpand %xmm3, %xmm2, %xmm21963; AVX1-NEXT: vpackusdw %xmm1, %xmm2, %xmm11964; AVX1-NEXT: vpand %xmm3, %xmm0, %xmm01965; AVX1-NEXT: vpand %xmm3, %xmm4, %xmm21966; AVX1-NEXT: vpackusdw %xmm0, %xmm2, %xmm01967; AVX1-NEXT: vpackuswb %xmm1, %xmm0, %xmm01968; AVX1-NEXT: vzeroupper1969; AVX1-NEXT: retq1970;1971; AVX2-LABEL: trunc_mul_v16i32_v16i8:1972; AVX2: # %bb.0:1973; AVX2-NEXT: vpmulld %ymm2, %ymm0, %ymm01974; AVX2-NEXT: vpmulld %ymm3, %ymm1, %ymm11975; 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]1976; AVX2-NEXT: vpand %ymm2, %ymm1, %ymm11977; AVX2-NEXT: vpand %ymm2, %ymm0, %ymm01978; AVX2-NEXT: vpackusdw %ymm1, %ymm0, %ymm01979; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm11980; AVX2-NEXT: vpackuswb %xmm1, %xmm0, %xmm01981; AVX2-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[0,2,1,3]1982; AVX2-NEXT: vzeroupper1983; AVX2-NEXT: retq1984;1985; AVX512-LABEL: trunc_mul_v16i32_v16i8:1986; AVX512: # %bb.0:1987; AVX512-NEXT: vpmulld %zmm1, %zmm0, %zmm01988; AVX512-NEXT: vpmovdb %zmm0, %xmm01989; AVX512-NEXT: vzeroupper1990; AVX512-NEXT: retq1991 %1 = mul <16 x i32> %a0, %a11992 %2 = trunc <16 x i32> %1 to <16 x i8>1993 ret <16 x i8> %21994}1995 1996define <16 x i8> @trunc_mul_v16i16_v16i8(<16 x i16> %a0, <16 x i16> %a1) nounwind {1997; SSE-LABEL: trunc_mul_v16i16_v16i8:1998; SSE: # %bb.0:1999; SSE-NEXT: pmullw %xmm2, %xmm02000; SSE-NEXT: pmullw %xmm3, %xmm12001; SSE-NEXT: movdqa {{.*#+}} xmm2 = [255,0,255,0,255,0,255,0,255,0,255,0,255,0,255,0]2002; SSE-NEXT: pand %xmm2, %xmm12003; SSE-NEXT: pand %xmm2, %xmm02004; SSE-NEXT: packuswb %xmm1, %xmm02005; SSE-NEXT: retq2006;2007; AVX1-LABEL: trunc_mul_v16i16_v16i8:2008; AVX1: # %bb.0:2009; AVX1-NEXT: vpmullw %xmm1, %xmm0, %xmm22010; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm12011; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm02012; AVX1-NEXT: vpmullw %xmm1, %xmm0, %xmm02013; AVX1-NEXT: vbroadcastss {{.*#+}} xmm1 = [255,255,255,255,255,255,255,255]2014; AVX1-NEXT: vpand %xmm1, %xmm0, %xmm02015; AVX1-NEXT: vpand %xmm1, %xmm2, %xmm12016; AVX1-NEXT: vpackuswb %xmm0, %xmm1, %xmm02017; AVX1-NEXT: vzeroupper2018; AVX1-NEXT: retq2019;2020; AVX2-LABEL: trunc_mul_v16i16_v16i8:2021; AVX2: # %bb.0:2022; AVX2-NEXT: vpmullw %ymm1, %ymm0, %ymm02023; AVX2-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm02024; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm12025; AVX2-NEXT: vpackuswb %xmm1, %xmm0, %xmm02026; AVX2-NEXT: vzeroupper2027; AVX2-NEXT: retq2028;2029; AVX512F-LABEL: trunc_mul_v16i16_v16i8:2030; AVX512F: # %bb.0:2031; AVX512F-NEXT: vpmullw %ymm1, %ymm0, %ymm02032; 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],zero2033; AVX512F-NEXT: vpmovdb %zmm0, %xmm02034; AVX512F-NEXT: vzeroupper2035; AVX512F-NEXT: retq2036;2037; AVX512BW-LABEL: trunc_mul_v16i16_v16i8:2038; AVX512BW: # %bb.0:2039; AVX512BW-NEXT: vpmullw %ymm1, %ymm0, %ymm02040; AVX512BW-NEXT: vpmovwb %zmm0, %ymm02041; AVX512BW-NEXT: # kill: def $xmm0 killed $xmm0 killed $ymm02042; AVX512BW-NEXT: vzeroupper2043; AVX512BW-NEXT: retq2044;2045; AVX512DQ-LABEL: trunc_mul_v16i16_v16i8:2046; AVX512DQ: # %bb.0:2047; AVX512DQ-NEXT: vpmullw %ymm1, %ymm0, %ymm02048; AVX512DQ-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],zero2049; AVX512DQ-NEXT: vpmovdb %zmm0, %xmm02050; AVX512DQ-NEXT: vzeroupper2051; AVX512DQ-NEXT: retq2052 %1 = mul <16 x i16> %a0, %a12053 %2 = trunc <16 x i16> %1 to <16 x i8>2054 ret <16 x i8> %22055}2056 2057define <8 x i16> @trunc_mul_v8i32_v8i16_zext_8i8(<16 x i8> %a0, <8 x i32> %a1) {2058; SSE-LABEL: trunc_mul_v8i32_v8i16_zext_8i8:2059; SSE: # %bb.0:2060; SSE-NEXT: pxor %xmm3, %xmm32061; SSE-NEXT: punpcklbw {{.*#+}} xmm0 = xmm0[0],xmm3[0],xmm0[1],xmm3[1],xmm0[2],xmm3[2],xmm0[3],xmm3[3],xmm0[4],xmm3[4],xmm0[5],xmm3[5],xmm0[6],xmm3[6],xmm0[7],xmm3[7]2062; SSE-NEXT: pslld $16, %xmm22063; SSE-NEXT: psrad $16, %xmm22064; SSE-NEXT: pslld $16, %xmm12065; SSE-NEXT: psrad $16, %xmm12066; SSE-NEXT: packssdw %xmm2, %xmm12067; SSE-NEXT: pmullw %xmm1, %xmm02068; SSE-NEXT: retq2069;2070; AVX1-LABEL: trunc_mul_v8i32_v8i16_zext_8i8:2071; AVX1: # %bb.0:2072; AVX1-NEXT: vandps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm12073; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm22074; AVX1-NEXT: vpackusdw %xmm2, %xmm1, %xmm12075; AVX1-NEXT: vpmovzxbw {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero2076; AVX1-NEXT: vpmullw %xmm1, %xmm0, %xmm02077; AVX1-NEXT: vzeroupper2078; AVX1-NEXT: retq2079;2080; AVX2-LABEL: trunc_mul_v8i32_v8i16_zext_8i8:2081; AVX2: # %bb.0:2082; AVX2-NEXT: vpmovzxbw {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero2083; AVX2-NEXT: vpshufb {{.*#+}} ymm1 = ymm1[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]2084; AVX2-NEXT: vpermq {{.*#+}} ymm1 = ymm1[0,2,2,3]2085; AVX2-NEXT: vpmullw %xmm1, %xmm0, %xmm02086; AVX2-NEXT: vzeroupper2087; AVX2-NEXT: retq2088;2089; AVX512-LABEL: trunc_mul_v8i32_v8i16_zext_8i8:2090; AVX512: # %bb.0:2091; AVX512-NEXT: # kill: def $ymm1 killed $ymm1 def $zmm12092; AVX512-NEXT: vpmovdw %zmm1, %ymm12093; AVX512-NEXT: vpmovzxbw {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero2094; AVX512-NEXT: vpmullw %xmm1, %xmm0, %xmm02095; AVX512-NEXT: vzeroupper2096; AVX512-NEXT: retq2097 %1 = shufflevector <16 x i8> %a0, <16 x i8> undef, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>2098 %2 = zext <8 x i8> %1 to <8 x i32>2099 %3 = mul <8 x i32> %2, %a12100 %4 = trunc <8 x i32> %3 to <8 x i16>2101 ret <8 x i16> %42102}2103 2104;2105; mul to constant2106;2107 2108define <4 x i32> @trunc_mul_const_v4i64_v4i32(<4 x i64> %a0) nounwind {2109; SSE-LABEL: trunc_mul_const_v4i64_v4i32:2110; SSE: # %bb.0:2111; SSE-NEXT: xorps %xmm2, %xmm22112; SSE-NEXT: unpckhpd {{.*#+}} xmm2 = xmm2[1],xmm0[1]2113; SSE-NEXT: pmuludq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1 # [2,3]2114; SSE-NEXT: shufps {{.*#+}} xmm2 = xmm2[0,2],xmm1[0,2]2115; SSE-NEXT: movaps %xmm2, %xmm02116; SSE-NEXT: retq2117;2118; AVX1-LABEL: trunc_mul_const_v4i64_v4i32:2119; AVX1: # %bb.0:2120; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm12121; AVX1-NEXT: vshufps {{.*#+}} xmm0 = xmm0[0,2],xmm1[0,2]2122; AVX1-NEXT: vpmulld {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0 # [0,1,2,3]2123; AVX1-NEXT: vzeroupper2124; AVX1-NEXT: retq2125;2126; AVX2-SLOW-LABEL: trunc_mul_const_v4i64_v4i32:2127; AVX2-SLOW: # %bb.0:2128; AVX2-SLOW-NEXT: vextractf128 $1, %ymm0, %xmm12129; AVX2-SLOW-NEXT: vshufps {{.*#+}} xmm0 = xmm0[0,2],xmm1[0,2]2130; AVX2-SLOW-NEXT: vpmulld {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0 # [0,1,2,3]2131; AVX2-SLOW-NEXT: vzeroupper2132; AVX2-SLOW-NEXT: retq2133;2134; AVX2-FAST-ALL-LABEL: trunc_mul_const_v4i64_v4i32:2135; AVX2-FAST-ALL: # %bb.0:2136; AVX2-FAST-ALL-NEXT: vpmovsxbd {{.*#+}} ymm1 = [0,2,4,6,0,0,0,0]2137; AVX2-FAST-ALL-NEXT: vpermd %ymm0, %ymm1, %ymm02138; AVX2-FAST-ALL-NEXT: vpmulld {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0 # [0,1,2,3]2139; AVX2-FAST-ALL-NEXT: vzeroupper2140; AVX2-FAST-ALL-NEXT: retq2141;2142; AVX2-FAST-PERLANE-LABEL: trunc_mul_const_v4i64_v4i32:2143; AVX2-FAST-PERLANE: # %bb.0:2144; AVX2-FAST-PERLANE-NEXT: vextractf128 $1, %ymm0, %xmm12145; AVX2-FAST-PERLANE-NEXT: vshufps {{.*#+}} xmm0 = xmm0[0,2],xmm1[0,2]2146; AVX2-FAST-PERLANE-NEXT: vpmulld {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0 # [0,1,2,3]2147; AVX2-FAST-PERLANE-NEXT: vzeroupper2148; AVX2-FAST-PERLANE-NEXT: retq2149;2150; AVX512-LABEL: trunc_mul_const_v4i64_v4i32:2151; AVX512: # %bb.0:2152; AVX512-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm02153; AVX512-NEXT: vpmovqd %zmm0, %ymm02154; AVX512-NEXT: vpmulld {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0 # [0,1,2,3]2155; AVX512-NEXT: vzeroupper2156; AVX512-NEXT: retq2157 %1 = mul <4 x i64> %a0, <i64 0, i64 1, i64 2, i64 3>2158 %2 = trunc <4 x i64> %1 to <4 x i32>2159 ret <4 x i32> %22160}2161 2162define <8 x i16> @trunc_mul_const_v8i64_v8i16(<8 x i64> %a0) nounwind {2163; SSE-LABEL: trunc_mul_const_v8i64_v8i16:2164; SSE: # %bb.0:2165; SSE-NEXT: shufps {{.*#+}} xmm2 = xmm2[0,2],xmm3[0,2]2166; SSE-NEXT: pslld $16, %xmm22167; SSE-NEXT: psrad $16, %xmm22168; SSE-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,2],xmm1[0,2]2169; SSE-NEXT: pslld $16, %xmm02170; SSE-NEXT: psrad $16, %xmm02171; SSE-NEXT: packssdw %xmm2, %xmm02172; SSE-NEXT: pmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0 # [0,1,2,3,4,5,6,7]2173; SSE-NEXT: retq2174;2175; AVX1-LABEL: trunc_mul_const_v8i64_v8i16:2176; AVX1: # %bb.0:2177; AVX1-NEXT: vbroadcastsd {{.*#+}} ymm2 = [65535,65535,65535,65535]2178; AVX1-NEXT: vandps %ymm2, %ymm1, %ymm12179; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm32180; AVX1-NEXT: vpackusdw %xmm3, %xmm1, %xmm12181; AVX1-NEXT: vandps %ymm2, %ymm0, %ymm02182; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm22183; AVX1-NEXT: vpackusdw %xmm2, %xmm0, %xmm02184; AVX1-NEXT: vpackusdw %xmm1, %xmm0, %xmm02185; AVX1-NEXT: vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0 # [0,1,2,3,4,5,6,7]2186; AVX1-NEXT: vzeroupper2187; AVX1-NEXT: retq2188;2189; AVX2-LABEL: trunc_mul_const_v8i64_v8i16:2190; AVX2: # %bb.0:2191; AVX2-NEXT: vpxor %xmm2, %xmm2, %xmm22192; 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]2193; 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]2194; AVX2-NEXT: vpackusdw %ymm1, %ymm0, %ymm02195; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm12196; AVX2-NEXT: vpackusdw %xmm1, %xmm0, %xmm02197; AVX2-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[0,2,1,3]2198; AVX2-NEXT: vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0 # [0,1,2,3,4,5,6,7]2199; AVX2-NEXT: vzeroupper2200; AVX2-NEXT: retq2201;2202; AVX512-LABEL: trunc_mul_const_v8i64_v8i16:2203; AVX512: # %bb.0:2204; AVX512-NEXT: vpmovqw %zmm0, %xmm02205; AVX512-NEXT: vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0 # [0,1,2,3,4,5,6,7]2206; AVX512-NEXT: vzeroupper2207; AVX512-NEXT: retq2208 %1 = mul <8 x i64> %a0, <i64 0, i64 1, i64 2, i64 3, i64 4, i64 5, i64 6, i64 7>2209 %2 = trunc <8 x i64> %1 to <8 x i16>2210 ret <8 x i16> %22211}2212 2213define <8 x i16> @trunc_mul_const_v8i32_v8i16(<8 x i32> %a0) nounwind {2214; SSE-LABEL: trunc_mul_const_v8i32_v8i16:2215; SSE: # %bb.0:2216; SSE-NEXT: pslld $16, %xmm12217; SSE-NEXT: psrad $16, %xmm12218; SSE-NEXT: pslld $16, %xmm02219; SSE-NEXT: psrad $16, %xmm02220; SSE-NEXT: packssdw %xmm1, %xmm02221; SSE-NEXT: pmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0 # [0,1,2,3,4,5,6,7]2222; SSE-NEXT: retq2223;2224; AVX1-LABEL: trunc_mul_const_v8i32_v8i16:2225; AVX1: # %bb.0:2226; AVX1-NEXT: vandps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm02227; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm12228; AVX1-NEXT: vpackusdw %xmm1, %xmm0, %xmm02229; AVX1-NEXT: vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0 # [0,1,2,3,4,5,6,7]2230; AVX1-NEXT: vzeroupper2231; AVX1-NEXT: retq2232;2233; AVX2-LABEL: trunc_mul_const_v8i32_v8i16:2234; AVX2: # %bb.0:2235; 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]2236; AVX2-NEXT: vpermq {{.*#+}} ymm0 = ymm0[0,2,2,3]2237; AVX2-NEXT: vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0 # [0,1,2,3,4,5,6,7]2238; AVX2-NEXT: vzeroupper2239; AVX2-NEXT: retq2240;2241; AVX512-LABEL: trunc_mul_const_v8i32_v8i16:2242; AVX512: # %bb.0:2243; AVX512-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm02244; AVX512-NEXT: vpmovdw %zmm0, %ymm02245; AVX512-NEXT: vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0 # [0,1,2,3,4,5,6,7]2246; AVX512-NEXT: vzeroupper2247; AVX512-NEXT: retq2248 %1 = mul <8 x i32> %a0, <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>2249 %2 = trunc <8 x i32> %1 to <8 x i16>2250 ret <8 x i16> %22251}2252 2253define <16 x i8> @trunc_mul_const_v16i64_v16i8(<16 x i64> %a0) nounwind {2254; SSE-LABEL: trunc_mul_const_v16i64_v16i8:2255; SSE: # %bb.0:2256; SSE-NEXT: pmuludq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1 # [2,3]2257; SSE-NEXT: pmuludq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2 # [4,5]2258; SSE-NEXT: pmuludq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm3 # [6,7]2259; SSE-NEXT: pmuludq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm4 # [8,9]2260; SSE-NEXT: pmuludq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm5 # [10,11]2261; SSE-NEXT: pmuludq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm6 # [12,13]2262; SSE-NEXT: pmuludq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm7 # [14,15]2263; SSE-NEXT: movdqa {{.*#+}} xmm8 = [255,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0]2264; SSE-NEXT: pand %xmm8, %xmm72265; SSE-NEXT: pand %xmm8, %xmm62266; SSE-NEXT: packuswb %xmm7, %xmm62267; SSE-NEXT: pand %xmm8, %xmm52268; SSE-NEXT: pand %xmm8, %xmm42269; SSE-NEXT: packuswb %xmm5, %xmm42270; SSE-NEXT: packuswb %xmm6, %xmm42271; SSE-NEXT: pand %xmm8, %xmm32272; SSE-NEXT: pand %xmm8, %xmm22273; SSE-NEXT: packuswb %xmm3, %xmm22274; SSE-NEXT: pand %xmm8, %xmm12275; SSE-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm02276; SSE-NEXT: packuswb %xmm1, %xmm02277; SSE-NEXT: packuswb %xmm2, %xmm02278; SSE-NEXT: packuswb %xmm4, %xmm02279; SSE-NEXT: retq2280;2281; AVX1-LABEL: trunc_mul_const_v16i64_v16i8:2282; AVX1: # %bb.0:2283; AVX1-NEXT: vpmuludq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm4 # [0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0]2284; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm02285; AVX1-NEXT: vpmuludq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0 # [2,3]2286; AVX1-NEXT: vpmuludq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm5 # [4,5]2287; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm12288; AVX1-NEXT: vpmuludq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1 # [6,7]2289; AVX1-NEXT: vpmuludq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2, %xmm6 # [8,9]2290; AVX1-NEXT: vextractf128 $1, %ymm2, %xmm22291; AVX1-NEXT: vpmuludq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2, %xmm2 # [10,11]2292; AVX1-NEXT: vpmuludq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm3, %xmm7 # [12,13]2293; AVX1-NEXT: vextractf128 $1, %ymm3, %xmm32294; AVX1-NEXT: vpmuludq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm3, %xmm3 # [14,15]2295; AVX1-NEXT: vpmovzxbq {{.*#+}} xmm8 = [255,255]2296; AVX1-NEXT: vpand %xmm3, %xmm8, %xmm32297; AVX1-NEXT: vpand %xmm7, %xmm8, %xmm72298; AVX1-NEXT: vpackusdw %xmm3, %xmm7, %xmm32299; AVX1-NEXT: vpand %xmm2, %xmm8, %xmm22300; AVX1-NEXT: vpand %xmm6, %xmm8, %xmm62301; AVX1-NEXT: vpackusdw %xmm2, %xmm6, %xmm22302; AVX1-NEXT: vpackusdw %xmm3, %xmm2, %xmm22303; AVX1-NEXT: vpand %xmm1, %xmm8, %xmm12304; AVX1-NEXT: vpand %xmm5, %xmm8, %xmm32305; AVX1-NEXT: vpackusdw %xmm1, %xmm3, %xmm12306; AVX1-NEXT: vpand %xmm0, %xmm8, %xmm02307; AVX1-NEXT: vpand %xmm4, %xmm8, %xmm32308; AVX1-NEXT: vpackusdw %xmm0, %xmm3, %xmm02309; AVX1-NEXT: vpackusdw %xmm1, %xmm0, %xmm02310; AVX1-NEXT: vpackuswb %xmm2, %xmm0, %xmm02311; AVX1-NEXT: vzeroupper2312; AVX1-NEXT: retq2313;2314; AVX2-LABEL: trunc_mul_const_v16i64_v16i8:2315; AVX2: # %bb.0:2316; AVX2-NEXT: vpmuludq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0 # [0,1,2,3]2317; AVX2-NEXT: vpmuludq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm1 # [4,5,6,7]2318; AVX2-NEXT: vpmuludq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm2, %ymm2 # [8,9,10,11]2319; AVX2-NEXT: vpmuludq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm3, %ymm3 # [12,13,14,15]2320; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm4 = [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]2321; AVX2-NEXT: vpand %ymm4, %ymm3, %ymm32322; AVX2-NEXT: vpand %ymm4, %ymm2, %ymm22323; AVX2-NEXT: vpackusdw %ymm3, %ymm2, %ymm22324; AVX2-NEXT: vpermq {{.*#+}} ymm2 = ymm2[0,2,1,3]2325; AVX2-NEXT: vpand %ymm4, %ymm1, %ymm12326; AVX2-NEXT: vpand %ymm4, %ymm0, %ymm02327; AVX2-NEXT: vpackusdw %ymm1, %ymm0, %ymm02328; AVX2-NEXT: vpermq {{.*#+}} ymm0 = ymm0[0,2,1,3]2329; AVX2-NEXT: vpackusdw %ymm2, %ymm0, %ymm02330; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm12331; AVX2-NEXT: vpackuswb %xmm1, %xmm0, %xmm02332; AVX2-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[0,2,1,3]2333; AVX2-NEXT: vzeroupper2334; AVX2-NEXT: retq2335;2336; AVX512F-LABEL: trunc_mul_const_v16i64_v16i8:2337; AVX512F: # %bb.0:2338; AVX512F-NEXT: vpmuludq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %zmm0, %zmm0 # [0,1,2,3,4,5,6,7]2339; AVX512F-NEXT: vpmuludq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %zmm1, %zmm1 # [8,9,10,11,12,13,14,15]2340; AVX512F-NEXT: vpmovqb %zmm1, %xmm12341; AVX512F-NEXT: vpmovqb %zmm0, %xmm02342; AVX512F-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]2343; AVX512F-NEXT: vzeroupper2344; AVX512F-NEXT: retq2345;2346; AVX512BW-LABEL: trunc_mul_const_v16i64_v16i8:2347; AVX512BW: # %bb.0:2348; AVX512BW-NEXT: vpmuludq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %zmm0, %zmm0 # [0,1,2,3,4,5,6,7]2349; AVX512BW-NEXT: vpmuludq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %zmm1, %zmm1 # [8,9,10,11,12,13,14,15]2350; AVX512BW-NEXT: vpmovqb %zmm1, %xmm12351; AVX512BW-NEXT: vpmovqb %zmm0, %xmm02352; AVX512BW-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]2353; AVX512BW-NEXT: vzeroupper2354; AVX512BW-NEXT: retq2355;2356; AVX512DQ-LABEL: trunc_mul_const_v16i64_v16i8:2357; AVX512DQ: # %bb.0:2358; AVX512DQ-NEXT: vpmullq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %zmm0, %zmm0 # [0,1,2,3,4,5,6,7]2359; AVX512DQ-NEXT: vpmullq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %zmm1, %zmm1 # [8,9,10,11,12,13,14,15]2360; AVX512DQ-NEXT: vpmovqb %zmm1, %xmm12361; AVX512DQ-NEXT: vpmovqb %zmm0, %xmm02362; AVX512DQ-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]2363; AVX512DQ-NEXT: vzeroupper2364; AVX512DQ-NEXT: retq2365 %1 = mul <16 x i64> %a0, <i64 0, i64 1, i64 2, i64 3, i64 4, i64 5, i64 6, i64 7, i64 8, i64 9, i64 10, i64 11, i64 12, i64 13, i64 14, i64 15>2366 %2 = trunc <16 x i64> %1 to <16 x i8>2367 ret <16 x i8> %22368}2369 2370define <16 x i8> @trunc_mul_const_v16i32_v16i8(<16 x i32> %a0) nounwind {2371; SSE-LABEL: trunc_mul_const_v16i32_v16i8:2372; SSE: # %bb.0:2373; SSE-NEXT: pshufd {{.*#+}} xmm4 = xmm0[1,1,3,3]2374; SSE-NEXT: pmuludq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0 # [0,1,2,3]2375; SSE-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]2376; SSE-NEXT: pmuludq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm4 # [1,u,3,u]2377; SSE-NEXT: pshufd {{.*#+}} xmm4 = xmm4[0,2,2,3]2378; SSE-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm4[0],xmm0[1],xmm4[1]2379; SSE-NEXT: pshufd {{.*#+}} xmm4 = xmm1[1,1,3,3]2380; SSE-NEXT: pmuludq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1 # [4,5,6,7]2381; SSE-NEXT: pshufd {{.*#+}} xmm1 = xmm1[0,2,2,3]2382; SSE-NEXT: pmuludq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm4 # [5,u,7,u]2383; SSE-NEXT: pshufd {{.*#+}} xmm4 = xmm4[0,2,2,3]2384; SSE-NEXT: punpckldq {{.*#+}} xmm1 = xmm1[0],xmm4[0],xmm1[1],xmm4[1]2385; SSE-NEXT: pshufd {{.*#+}} xmm4 = xmm2[1,1,3,3]2386; SSE-NEXT: pmuludq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2 # [8,9,10,11]2387; SSE-NEXT: pshufd {{.*#+}} xmm2 = xmm2[0,2,2,3]2388; SSE-NEXT: pmuludq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm4 # [9,u,11,u]2389; SSE-NEXT: pshufd {{.*#+}} xmm4 = xmm4[0,2,2,3]2390; SSE-NEXT: punpckldq {{.*#+}} xmm2 = xmm2[0],xmm4[0],xmm2[1],xmm4[1]2391; SSE-NEXT: pshufd {{.*#+}} xmm4 = xmm3[1,1,3,3]2392; SSE-NEXT: pmuludq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm3 # [12,13,14,15]2393; SSE-NEXT: pshufd {{.*#+}} xmm3 = xmm3[0,2,2,3]2394; SSE-NEXT: pmuludq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm4 # [13,u,15,u]2395; SSE-NEXT: pshufd {{.*#+}} xmm4 = xmm4[0,2,2,3]2396; SSE-NEXT: punpckldq {{.*#+}} xmm3 = xmm3[0],xmm4[0],xmm3[1],xmm4[1]2397; SSE-NEXT: movdqa {{.*#+}} xmm4 = [255,0,0,0,255,0,0,0,255,0,0,0,255,0,0,0]2398; SSE-NEXT: pand %xmm4, %xmm32399; SSE-NEXT: pand %xmm4, %xmm22400; SSE-NEXT: packuswb %xmm3, %xmm22401; SSE-NEXT: pand %xmm4, %xmm12402; SSE-NEXT: pand %xmm4, %xmm02403; SSE-NEXT: packuswb %xmm1, %xmm02404; SSE-NEXT: packuswb %xmm2, %xmm02405; SSE-NEXT: retq2406;2407; AVX1-LABEL: trunc_mul_const_v16i32_v16i8:2408; AVX1: # %bb.0:2409; AVX1-NEXT: vpmulld {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm2 # [0,1,2,3]2410; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm02411; AVX1-NEXT: vpmulld {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0 # [4,5,6,7]2412; AVX1-NEXT: vpmulld {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm3 # [8,9,10,11]2413; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm12414; AVX1-NEXT: vpmulld {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1 # [12,13,14,15]2415; AVX1-NEXT: vbroadcastss {{.*#+}} xmm4 = [255,255,255,255]2416; AVX1-NEXT: vpand %xmm4, %xmm1, %xmm12417; AVX1-NEXT: vpand %xmm4, %xmm3, %xmm32418; AVX1-NEXT: vpackusdw %xmm1, %xmm3, %xmm12419; AVX1-NEXT: vpand %xmm4, %xmm0, %xmm02420; AVX1-NEXT: vpand %xmm4, %xmm2, %xmm22421; AVX1-NEXT: vpackusdw %xmm0, %xmm2, %xmm02422; AVX1-NEXT: vpackuswb %xmm1, %xmm0, %xmm02423; AVX1-NEXT: vzeroupper2424; AVX1-NEXT: retq2425;2426; AVX2-LABEL: trunc_mul_const_v16i32_v16i8:2427; AVX2: # %bb.0:2428; AVX2-NEXT: vpmulld {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0 # [0,1,2,3,4,5,6,7]2429; AVX2-NEXT: vpmulld {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm1 # [8,9,10,11,12,13,14,15]2430; 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]2431; AVX2-NEXT: vpand %ymm2, %ymm1, %ymm12432; AVX2-NEXT: vpand %ymm2, %ymm0, %ymm02433; AVX2-NEXT: vpackusdw %ymm1, %ymm0, %ymm02434; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm12435; AVX2-NEXT: vpackuswb %xmm1, %xmm0, %xmm02436; AVX2-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[0,2,1,3]2437; AVX2-NEXT: vzeroupper2438; AVX2-NEXT: retq2439;2440; AVX512-LABEL: trunc_mul_const_v16i32_v16i8:2441; AVX512: # %bb.0:2442; AVX512-NEXT: vpmulld {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %zmm0, %zmm0 # [0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15]2443; AVX512-NEXT: vpmovdb %zmm0, %xmm02444; AVX512-NEXT: vzeroupper2445; AVX512-NEXT: retq2446 %1 = mul <16 x i32> %a0, <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>2447 %2 = trunc <16 x i32> %1 to <16 x i8>2448 ret <16 x i8> %22449}2450 2451define <16 x i8> @trunc_mul_const_v16i16_v16i8(<16 x i16> %a0) nounwind {2452; SSE-LABEL: trunc_mul_const_v16i16_v16i8:2453; SSE: # %bb.0:2454; SSE-NEXT: pmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0 # [0,1,2,3,4,5,6,7]2455; SSE-NEXT: pmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1 # [8,9,10,11,12,13,14,15]2456; SSE-NEXT: movdqa {{.*#+}} xmm2 = [255,0,255,0,255,0,255,0,255,0,255,0,255,0,255,0]2457; SSE-NEXT: pand %xmm2, %xmm12458; SSE-NEXT: pand %xmm2, %xmm02459; SSE-NEXT: packuswb %xmm1, %xmm02460; SSE-NEXT: retq2461;2462; AVX1-LABEL: trunc_mul_const_v16i16_v16i8:2463; AVX1: # %bb.0:2464; AVX1-NEXT: vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm1 # [0,1,2,3,4,5,6,7]2465; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm02466; AVX1-NEXT: vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0 # [8,9,10,11,12,13,14,15]2467; AVX1-NEXT: vbroadcastss {{.*#+}} xmm2 = [255,255,255,255,255,255,255,255]2468; AVX1-NEXT: vpand %xmm2, %xmm0, %xmm02469; AVX1-NEXT: vpand %xmm2, %xmm1, %xmm12470; AVX1-NEXT: vpackuswb %xmm0, %xmm1, %xmm02471; AVX1-NEXT: vzeroupper2472; AVX1-NEXT: retq2473;2474; AVX2-LABEL: trunc_mul_const_v16i16_v16i8:2475; AVX2: # %bb.0:2476; AVX2-NEXT: vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0 # [0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15]2477; AVX2-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm02478; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm12479; AVX2-NEXT: vpackuswb %xmm1, %xmm0, %xmm02480; AVX2-NEXT: vzeroupper2481; AVX2-NEXT: retq2482;2483; AVX512F-LABEL: trunc_mul_const_v16i16_v16i8:2484; AVX512F: # %bb.0:2485; AVX512F-NEXT: vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0 # [0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15]2486; 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],zero2487; AVX512F-NEXT: vpmovdb %zmm0, %xmm02488; AVX512F-NEXT: vzeroupper2489; AVX512F-NEXT: retq2490;2491; AVX512BW-LABEL: trunc_mul_const_v16i16_v16i8:2492; AVX512BW: # %bb.0:2493; AVX512BW-NEXT: vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0 # [0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15]2494; AVX512BW-NEXT: vpmovwb %zmm0, %ymm02495; AVX512BW-NEXT: # kill: def $xmm0 killed $xmm0 killed $ymm02496; AVX512BW-NEXT: vzeroupper2497; AVX512BW-NEXT: retq2498;2499; AVX512DQ-LABEL: trunc_mul_const_v16i16_v16i8:2500; AVX512DQ: # %bb.0:2501; AVX512DQ-NEXT: vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0 # [0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15]2502; AVX512DQ-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],zero2503; AVX512DQ-NEXT: vpmovdb %zmm0, %xmm02504; AVX512DQ-NEXT: vzeroupper2505; AVX512DQ-NEXT: retq2506 %1 = mul <16 x i16> %a0, <i16 0, i16 1, i16 2, i16 3, i16 4, i16 5, i16 6, i16 7, i16 8, i16 9, i16 10, i16 11, i16 12, i16 13, i16 14, i16 15>2507 %2 = trunc <16 x i16> %1 to <16 x i8>2508 ret <16 x i8> %22509}2510 2511;2512; and2513;2514 2515define <4 x i32> @trunc_and_v4i64_v4i32(<4 x i64> %a0, <4 x i64> %a1) nounwind {2516; SSE-LABEL: trunc_and_v4i64_v4i32:2517; SSE: # %bb.0:2518; SSE-NEXT: andps %xmm3, %xmm12519; SSE-NEXT: andps %xmm2, %xmm02520; SSE-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,2],xmm1[0,2]2521; SSE-NEXT: retq2522;2523; AVX1-LABEL: trunc_and_v4i64_v4i32:2524; AVX1: # %bb.0:2525; AVX1-NEXT: vandps %ymm1, %ymm0, %ymm02526; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm12527; AVX1-NEXT: vshufps {{.*#+}} xmm0 = xmm0[0,2],xmm1[0,2]2528; AVX1-NEXT: vzeroupper2529; AVX1-NEXT: retq2530;2531; AVX2-SLOW-LABEL: trunc_and_v4i64_v4i32:2532; AVX2-SLOW: # %bb.0:2533; AVX2-SLOW-NEXT: vandps %ymm1, %ymm0, %ymm02534; AVX2-SLOW-NEXT: vextractf128 $1, %ymm0, %xmm12535; AVX2-SLOW-NEXT: vshufps {{.*#+}} xmm0 = xmm0[0,2],xmm1[0,2]2536; AVX2-SLOW-NEXT: vzeroupper2537; AVX2-SLOW-NEXT: retq2538;2539; AVX2-FAST-ALL-LABEL: trunc_and_v4i64_v4i32:2540; AVX2-FAST-ALL: # %bb.0:2541; AVX2-FAST-ALL-NEXT: vandps %ymm1, %ymm0, %ymm02542; AVX2-FAST-ALL-NEXT: vbroadcastf128 {{.*#+}} ymm1 = [0,2,4,6,0,2,4,6]2543; AVX2-FAST-ALL-NEXT: # ymm1 = mem[0,1,0,1]2544; AVX2-FAST-ALL-NEXT: vpermps %ymm0, %ymm1, %ymm02545; AVX2-FAST-ALL-NEXT: # kill: def $xmm0 killed $xmm0 killed $ymm02546; AVX2-FAST-ALL-NEXT: vzeroupper2547; AVX2-FAST-ALL-NEXT: retq2548;2549; AVX2-FAST-PERLANE-LABEL: trunc_and_v4i64_v4i32:2550; AVX2-FAST-PERLANE: # %bb.0:2551; AVX2-FAST-PERLANE-NEXT: vandps %ymm1, %ymm0, %ymm02552; AVX2-FAST-PERLANE-NEXT: vextractf128 $1, %ymm0, %xmm12553; AVX2-FAST-PERLANE-NEXT: vshufps {{.*#+}} xmm0 = xmm0[0,2],xmm1[0,2]2554; AVX2-FAST-PERLANE-NEXT: vzeroupper2555; AVX2-FAST-PERLANE-NEXT: retq2556;2557; AVX512-LABEL: trunc_and_v4i64_v4i32:2558; AVX512: # %bb.0:2559; AVX512-NEXT: vpand %ymm1, %ymm0, %ymm02560; AVX512-NEXT: vpmovqd %zmm0, %ymm02561; AVX512-NEXT: # kill: def $xmm0 killed $xmm0 killed $ymm02562; AVX512-NEXT: vzeroupper2563; AVX512-NEXT: retq2564 %1 = and <4 x i64> %a0, %a12565 %2 = trunc <4 x i64> %1 to <4 x i32>2566 ret <4 x i32> %22567}2568 2569define <8 x i16> @trunc_and_v8i64_v8i16(<8 x i64> %a0, <8 x i64> %a1) nounwind {2570; SSE-LABEL: trunc_and_v8i64_v8i16:2571; SSE: # %bb.0:2572; SSE-NEXT: andps %xmm5, %xmm12573; SSE-NEXT: andps %xmm4, %xmm02574; SSE-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,2],xmm1[0,2]2575; SSE-NEXT: andps %xmm7, %xmm32576; SSE-NEXT: andps %xmm6, %xmm22577; SSE-NEXT: shufps {{.*#+}} xmm2 = xmm2[0,2],xmm3[0,2]2578; SSE-NEXT: pslld $16, %xmm22579; SSE-NEXT: psrad $16, %xmm22580; SSE-NEXT: pslld $16, %xmm02581; SSE-NEXT: psrad $16, %xmm02582; SSE-NEXT: packssdw %xmm2, %xmm02583; SSE-NEXT: retq2584;2585; AVX1-LABEL: trunc_and_v8i64_v8i16:2586; AVX1: # %bb.0:2587; AVX1-NEXT: vandps %ymm2, %ymm0, %ymm02588; AVX1-NEXT: vandps %ymm3, %ymm1, %ymm12589; AVX1-NEXT: vbroadcastsd {{.*#+}} ymm2 = [65535,65535,65535,65535]2590; AVX1-NEXT: vandps %ymm2, %ymm1, %ymm12591; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm32592; AVX1-NEXT: vpackusdw %xmm3, %xmm1, %xmm12593; AVX1-NEXT: vandps %ymm2, %ymm0, %ymm02594; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm22595; AVX1-NEXT: vpackusdw %xmm2, %xmm0, %xmm02596; AVX1-NEXT: vpackusdw %xmm1, %xmm0, %xmm02597; AVX1-NEXT: vzeroupper2598; AVX1-NEXT: retq2599;2600; AVX2-LABEL: trunc_and_v8i64_v8i16:2601; AVX2: # %bb.0:2602; AVX2-NEXT: vpand %ymm2, %ymm0, %ymm02603; AVX2-NEXT: vpand %ymm3, %ymm1, %ymm12604; AVX2-NEXT: vpxor %xmm2, %xmm2, %xmm22605; 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]2606; 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]2607; AVX2-NEXT: vpackusdw %ymm1, %ymm0, %ymm02608; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm12609; AVX2-NEXT: vpackusdw %xmm1, %xmm0, %xmm02610; AVX2-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[0,2,1,3]2611; AVX2-NEXT: vzeroupper2612; AVX2-NEXT: retq2613;2614; AVX512-LABEL: trunc_and_v8i64_v8i16:2615; AVX512: # %bb.0:2616; AVX512-NEXT: vpandq %zmm1, %zmm0, %zmm02617; AVX512-NEXT: vpmovqw %zmm0, %xmm02618; AVX512-NEXT: vzeroupper2619; AVX512-NEXT: retq2620 %1 = and <8 x i64> %a0, %a12621 %2 = trunc <8 x i64> %1 to <8 x i16>2622 ret <8 x i16> %22623}2624 2625define <8 x i16> @trunc_and_v8i32_v8i16(<8 x i32> %a0, <8 x i32> %a1) nounwind {2626; SSE-LABEL: trunc_and_v8i32_v8i16:2627; SSE: # %bb.0:2628; SSE-NEXT: pand %xmm2, %xmm02629; SSE-NEXT: pand %xmm3, %xmm12630; SSE-NEXT: pslld $16, %xmm12631; SSE-NEXT: psrad $16, %xmm12632; SSE-NEXT: pslld $16, %xmm02633; SSE-NEXT: psrad $16, %xmm02634; SSE-NEXT: packssdw %xmm1, %xmm02635; SSE-NEXT: retq2636;2637; AVX1-LABEL: trunc_and_v8i32_v8i16:2638; AVX1: # %bb.0:2639; AVX1-NEXT: vandps %ymm1, %ymm0, %ymm02640; AVX1-NEXT: vandps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm02641; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm12642; AVX1-NEXT: vpackusdw %xmm1, %xmm0, %xmm02643; AVX1-NEXT: vzeroupper2644; AVX1-NEXT: retq2645;2646; AVX2-LABEL: trunc_and_v8i32_v8i16:2647; AVX2: # %bb.0:2648; AVX2-NEXT: vpand %ymm1, %ymm0, %ymm02649; 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]2650; AVX2-NEXT: vpermq {{.*#+}} ymm0 = ymm0[0,2,2,3]2651; AVX2-NEXT: # kill: def $xmm0 killed $xmm0 killed $ymm02652; AVX2-NEXT: vzeroupper2653; AVX2-NEXT: retq2654;2655; AVX512-LABEL: trunc_and_v8i32_v8i16:2656; AVX512: # %bb.0:2657; AVX512-NEXT: vpand %ymm1, %ymm0, %ymm02658; AVX512-NEXT: vpmovdw %zmm0, %ymm02659; AVX512-NEXT: # kill: def $xmm0 killed $xmm0 killed $ymm02660; AVX512-NEXT: vzeroupper2661; AVX512-NEXT: retq2662 %1 = and <8 x i32> %a0, %a12663 %2 = trunc <8 x i32> %1 to <8 x i16>2664 ret <8 x i16> %22665}2666 2667define <16 x i8> @trunc_and_v16i64_v16i8(<16 x i64> %a0, <16 x i64> %a1) nounwind {2668; SSE-LABEL: trunc_and_v16i64_v16i8:2669; SSE: # %bb.0:2670; SSE-NEXT: pand {{[0-9]+}}(%rsp), %xmm02671; SSE-NEXT: pand {{[0-9]+}}(%rsp), %xmm12672; SSE-NEXT: pand {{[0-9]+}}(%rsp), %xmm22673; SSE-NEXT: pand {{[0-9]+}}(%rsp), %xmm32674; SSE-NEXT: pand {{[0-9]+}}(%rsp), %xmm42675; SSE-NEXT: pand {{[0-9]+}}(%rsp), %xmm52676; SSE-NEXT: pand {{[0-9]+}}(%rsp), %xmm62677; SSE-NEXT: pand {{[0-9]+}}(%rsp), %xmm72678; SSE-NEXT: movdqa {{.*#+}} xmm8 = [255,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0]2679; SSE-NEXT: pand %xmm8, %xmm72680; SSE-NEXT: pand %xmm8, %xmm62681; SSE-NEXT: packuswb %xmm7, %xmm62682; SSE-NEXT: pand %xmm8, %xmm52683; SSE-NEXT: pand %xmm8, %xmm42684; SSE-NEXT: packuswb %xmm5, %xmm42685; SSE-NEXT: packuswb %xmm6, %xmm42686; SSE-NEXT: pand %xmm8, %xmm32687; SSE-NEXT: pand %xmm8, %xmm22688; SSE-NEXT: packuswb %xmm3, %xmm22689; SSE-NEXT: pand %xmm8, %xmm12690; SSE-NEXT: pand %xmm8, %xmm02691; SSE-NEXT: packuswb %xmm1, %xmm02692; SSE-NEXT: packuswb %xmm2, %xmm02693; SSE-NEXT: packuswb %xmm4, %xmm02694; SSE-NEXT: retq2695;2696; AVX1-LABEL: trunc_and_v16i64_v16i8:2697; AVX1: # %bb.0:2698; AVX1-NEXT: vandps %ymm4, %ymm0, %ymm02699; AVX1-NEXT: vandps %ymm5, %ymm1, %ymm12700; AVX1-NEXT: vandps %ymm6, %ymm2, %ymm22701; AVX1-NEXT: vandps %ymm7, %ymm3, %ymm32702; AVX1-NEXT: vbroadcastsd {{.*#+}} ymm4 = [255,255,255,255]2703; AVX1-NEXT: vandps %ymm4, %ymm3, %ymm32704; AVX1-NEXT: vextractf128 $1, %ymm3, %xmm52705; AVX1-NEXT: vpackusdw %xmm5, %xmm3, %xmm32706; AVX1-NEXT: vandps %ymm4, %ymm2, %ymm22707; AVX1-NEXT: vextractf128 $1, %ymm2, %xmm52708; AVX1-NEXT: vpackusdw %xmm5, %xmm2, %xmm22709; AVX1-NEXT: vpackusdw %xmm3, %xmm2, %xmm22710; AVX1-NEXT: vandps %ymm4, %ymm1, %ymm12711; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm32712; AVX1-NEXT: vpackusdw %xmm3, %xmm1, %xmm12713; AVX1-NEXT: vandps %ymm4, %ymm0, %ymm02714; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm32715; AVX1-NEXT: vpackusdw %xmm3, %xmm0, %xmm02716; AVX1-NEXT: vpackusdw %xmm1, %xmm0, %xmm02717; AVX1-NEXT: vpackuswb %xmm2, %xmm0, %xmm02718; AVX1-NEXT: vzeroupper2719; AVX1-NEXT: retq2720;2721; AVX2-LABEL: trunc_and_v16i64_v16i8:2722; AVX2: # %bb.0:2723; AVX2-NEXT: vpand %ymm4, %ymm0, %ymm02724; AVX2-NEXT: vpand %ymm5, %ymm1, %ymm12725; AVX2-NEXT: vpand %ymm6, %ymm2, %ymm22726; AVX2-NEXT: vpand %ymm7, %ymm3, %ymm32727; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm4 = [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]2728; AVX2-NEXT: vpand %ymm4, %ymm3, %ymm32729; AVX2-NEXT: vpand %ymm4, %ymm2, %ymm22730; AVX2-NEXT: vpackusdw %ymm3, %ymm2, %ymm22731; AVX2-NEXT: vpermq {{.*#+}} ymm2 = ymm2[0,2,1,3]2732; AVX2-NEXT: vpand %ymm4, %ymm1, %ymm12733; AVX2-NEXT: vpand %ymm4, %ymm0, %ymm02734; AVX2-NEXT: vpackusdw %ymm1, %ymm0, %ymm02735; AVX2-NEXT: vpermq {{.*#+}} ymm0 = ymm0[0,2,1,3]2736; AVX2-NEXT: vpackusdw %ymm2, %ymm0, %ymm02737; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm12738; AVX2-NEXT: vpackuswb %xmm1, %xmm0, %xmm02739; AVX2-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[0,2,1,3]2740; AVX2-NEXT: vzeroupper2741; AVX2-NEXT: retq2742;2743; AVX512-LABEL: trunc_and_v16i64_v16i8:2744; AVX512: # %bb.0:2745; AVX512-NEXT: vpandq %zmm2, %zmm0, %zmm02746; AVX512-NEXT: vpandq %zmm3, %zmm1, %zmm12747; AVX512-NEXT: vpmovqb %zmm1, %xmm12748; AVX512-NEXT: vpmovqb %zmm0, %xmm02749; AVX512-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]2750; AVX512-NEXT: vzeroupper2751; AVX512-NEXT: retq2752 %1 = and <16 x i64> %a0, %a12753 %2 = trunc <16 x i64> %1 to <16 x i8>2754 ret <16 x i8> %22755}2756 2757define <16 x i8> @trunc_and_v16i32_v16i8(<16 x i32> %a0, <16 x i32> %a1) nounwind {2758; SSE-LABEL: trunc_and_v16i32_v16i8:2759; SSE: # %bb.0:2760; SSE-NEXT: pand %xmm4, %xmm02761; SSE-NEXT: pand %xmm5, %xmm12762; SSE-NEXT: pand %xmm6, %xmm22763; SSE-NEXT: pand %xmm7, %xmm32764; SSE-NEXT: movdqa {{.*#+}} xmm4 = [255,0,0,0,255,0,0,0,255,0,0,0,255,0,0,0]2765; SSE-NEXT: pand %xmm4, %xmm32766; SSE-NEXT: pand %xmm4, %xmm22767; SSE-NEXT: packuswb %xmm3, %xmm22768; SSE-NEXT: pand %xmm4, %xmm12769; SSE-NEXT: pand %xmm4, %xmm02770; SSE-NEXT: packuswb %xmm1, %xmm02771; SSE-NEXT: packuswb %xmm2, %xmm02772; SSE-NEXT: retq2773;2774; AVX1-LABEL: trunc_and_v16i32_v16i8:2775; AVX1: # %bb.0:2776; AVX1-NEXT: vandps %ymm2, %ymm0, %ymm02777; AVX1-NEXT: vandps %ymm3, %ymm1, %ymm12778; AVX1-NEXT: vbroadcastss {{.*#+}} ymm2 = [255,255,255,255,255,255,255,255]2779; AVX1-NEXT: vandps %ymm2, %ymm1, %ymm12780; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm32781; AVX1-NEXT: vpackusdw %xmm3, %xmm1, %xmm12782; AVX1-NEXT: vandps %ymm2, %ymm0, %ymm02783; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm22784; AVX1-NEXT: vpackusdw %xmm2, %xmm0, %xmm02785; AVX1-NEXT: vpackuswb %xmm1, %xmm0, %xmm02786; AVX1-NEXT: vzeroupper2787; AVX1-NEXT: retq2788;2789; AVX2-LABEL: trunc_and_v16i32_v16i8:2790; AVX2: # %bb.0:2791; AVX2-NEXT: vpand %ymm2, %ymm0, %ymm02792; AVX2-NEXT: vpand %ymm3, %ymm1, %ymm12793; 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]2794; AVX2-NEXT: vpand %ymm2, %ymm1, %ymm12795; AVX2-NEXT: vpand %ymm2, %ymm0, %ymm02796; AVX2-NEXT: vpackusdw %ymm1, %ymm0, %ymm02797; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm12798; AVX2-NEXT: vpackuswb %xmm1, %xmm0, %xmm02799; AVX2-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[0,2,1,3]2800; AVX2-NEXT: vzeroupper2801; AVX2-NEXT: retq2802;2803; AVX512-LABEL: trunc_and_v16i32_v16i8:2804; AVX512: # %bb.0:2805; AVX512-NEXT: vpandd %zmm1, %zmm0, %zmm02806; AVX512-NEXT: vpmovdb %zmm0, %xmm02807; AVX512-NEXT: vzeroupper2808; AVX512-NEXT: retq2809 %1 = and <16 x i32> %a0, %a12810 %2 = trunc <16 x i32> %1 to <16 x i8>2811 ret <16 x i8> %22812}2813 2814define <16 x i8> @trunc_and_v16i16_v16i8(<16 x i16> %a0, <16 x i16> %a1) nounwind {2815; SSE-LABEL: trunc_and_v16i16_v16i8:2816; SSE: # %bb.0:2817; SSE-NEXT: pand %xmm2, %xmm02818; SSE-NEXT: pand %xmm3, %xmm12819; SSE-NEXT: movdqa {{.*#+}} xmm2 = [255,0,255,0,255,0,255,0,255,0,255,0,255,0,255,0]2820; SSE-NEXT: pand %xmm2, %xmm12821; SSE-NEXT: pand %xmm2, %xmm02822; SSE-NEXT: packuswb %xmm1, %xmm02823; SSE-NEXT: retq2824;2825; AVX1-LABEL: trunc_and_v16i16_v16i8:2826; AVX1: # %bb.0:2827; AVX1-NEXT: vandps %ymm1, %ymm0, %ymm02828; AVX1-NEXT: vandps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm02829; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm12830; AVX1-NEXT: vpackuswb %xmm1, %xmm0, %xmm02831; AVX1-NEXT: vzeroupper2832; AVX1-NEXT: retq2833;2834; AVX2-LABEL: trunc_and_v16i16_v16i8:2835; AVX2: # %bb.0:2836; AVX2-NEXT: vpand %ymm1, %ymm0, %ymm02837; AVX2-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm02838; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm12839; AVX2-NEXT: vpackuswb %xmm1, %xmm0, %xmm02840; AVX2-NEXT: vzeroupper2841; AVX2-NEXT: retq2842;2843; AVX512F-LABEL: trunc_and_v16i16_v16i8:2844; AVX512F: # %bb.0:2845; AVX512F-NEXT: vpand %ymm1, %ymm0, %ymm02846; 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],zero2847; AVX512F-NEXT: vpmovdb %zmm0, %xmm02848; AVX512F-NEXT: vzeroupper2849; AVX512F-NEXT: retq2850;2851; AVX512BW-LABEL: trunc_and_v16i16_v16i8:2852; AVX512BW: # %bb.0:2853; AVX512BW-NEXT: vpand %ymm1, %ymm0, %ymm02854; AVX512BW-NEXT: vpmovwb %zmm0, %ymm02855; AVX512BW-NEXT: # kill: def $xmm0 killed $xmm0 killed $ymm02856; AVX512BW-NEXT: vzeroupper2857; AVX512BW-NEXT: retq2858;2859; AVX512DQ-LABEL: trunc_and_v16i16_v16i8:2860; AVX512DQ: # %bb.0:2861; AVX512DQ-NEXT: vpand %ymm1, %ymm0, %ymm02862; AVX512DQ-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],zero2863; AVX512DQ-NEXT: vpmovdb %zmm0, %xmm02864; AVX512DQ-NEXT: vzeroupper2865; AVX512DQ-NEXT: retq2866 %1 = and <16 x i16> %a0, %a12867 %2 = trunc <16 x i16> %1 to <16 x i8>2868 ret <16 x i8> %22869}2870 2871;2872; and to constant2873;2874 2875define <4 x i32> @trunc_and_const_v4i64_v4i32(<4 x i64> %a0) nounwind {2876; SSE-LABEL: trunc_and_const_v4i64_v4i32:2877; SSE: # %bb.0:2878; SSE-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,2],xmm1[0,2]2879; SSE-NEXT: andps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm02880; SSE-NEXT: retq2881;2882; AVX1-LABEL: trunc_and_const_v4i64_v4i32:2883; AVX1: # %bb.0:2884; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm12885; AVX1-NEXT: vshufps {{.*#+}} xmm0 = xmm0[0,2],xmm1[0,2]2886; AVX1-NEXT: vandps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm02887; AVX1-NEXT: vzeroupper2888; AVX1-NEXT: retq2889;2890; AVX2-SLOW-LABEL: trunc_and_const_v4i64_v4i32:2891; AVX2-SLOW: # %bb.0:2892; AVX2-SLOW-NEXT: vextractf128 $1, %ymm0, %xmm12893; AVX2-SLOW-NEXT: vshufps {{.*#+}} xmm0 = xmm0[0,2],xmm1[0,2]2894; AVX2-SLOW-NEXT: vandps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm02895; AVX2-SLOW-NEXT: vzeroupper2896; AVX2-SLOW-NEXT: retq2897;2898; AVX2-FAST-ALL-LABEL: trunc_and_const_v4i64_v4i32:2899; AVX2-FAST-ALL: # %bb.0:2900; AVX2-FAST-ALL-NEXT: vbroadcastf128 {{.*#+}} ymm1 = [0,2,4,6,0,2,4,6]2901; AVX2-FAST-ALL-NEXT: # ymm1 = mem[0,1,0,1]2902; AVX2-FAST-ALL-NEXT: vpermps %ymm0, %ymm1, %ymm02903; AVX2-FAST-ALL-NEXT: vandps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm02904; AVX2-FAST-ALL-NEXT: vzeroupper2905; AVX2-FAST-ALL-NEXT: retq2906;2907; AVX2-FAST-PERLANE-LABEL: trunc_and_const_v4i64_v4i32:2908; AVX2-FAST-PERLANE: # %bb.0:2909; AVX2-FAST-PERLANE-NEXT: vextractf128 $1, %ymm0, %xmm12910; AVX2-FAST-PERLANE-NEXT: vshufps {{.*#+}} xmm0 = xmm0[0,2],xmm1[0,2]2911; AVX2-FAST-PERLANE-NEXT: vandps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm02912; AVX2-FAST-PERLANE-NEXT: vzeroupper2913; AVX2-FAST-PERLANE-NEXT: retq2914;2915; AVX512-LABEL: trunc_and_const_v4i64_v4i32:2916; AVX512: # %bb.0:2917; AVX512-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm02918; AVX512-NEXT: vpmovqd %zmm0, %ymm02919; AVX512-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm02920; AVX512-NEXT: vzeroupper2921; AVX512-NEXT: retq2922 %1 = and <4 x i64> %a0, <i64 0, i64 1, i64 2, i64 3>2923 %2 = trunc <4 x i64> %1 to <4 x i32>2924 ret <4 x i32> %22925}2926 2927define <8 x i16> @trunc_and_const_v8i64_v8i16(<8 x i64> %a0) nounwind {2928; SSE-LABEL: trunc_and_const_v8i64_v8i16:2929; SSE: # %bb.0:2930; SSE-NEXT: shufps {{.*#+}} xmm2 = xmm2[0,2],xmm3[0,2]2931; SSE-NEXT: pslld $16, %xmm22932; SSE-NEXT: psrad $16, %xmm22933; SSE-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,2],xmm1[0,2]2934; SSE-NEXT: pslld $16, %xmm02935; SSE-NEXT: psrad $16, %xmm02936; SSE-NEXT: packssdw %xmm2, %xmm02937; SSE-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm02938; SSE-NEXT: retq2939;2940; AVX1-LABEL: trunc_and_const_v8i64_v8i16:2941; AVX1: # %bb.0:2942; AVX1-NEXT: vbroadcastsd {{.*#+}} ymm2 = [65535,65535,65535,65535]2943; AVX1-NEXT: vandps %ymm2, %ymm1, %ymm12944; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm32945; AVX1-NEXT: vpackusdw %xmm3, %xmm1, %xmm12946; AVX1-NEXT: vandps %ymm2, %ymm0, %ymm02947; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm22948; AVX1-NEXT: vpackusdw %xmm2, %xmm0, %xmm02949; AVX1-NEXT: vpackusdw %xmm1, %xmm0, %xmm02950; AVX1-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm02951; AVX1-NEXT: vzeroupper2952; AVX1-NEXT: retq2953;2954; AVX2-LABEL: trunc_and_const_v8i64_v8i16:2955; AVX2: # %bb.0:2956; AVX2-NEXT: vpxor %xmm2, %xmm2, %xmm22957; 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]2958; 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]2959; AVX2-NEXT: vpackusdw %ymm1, %ymm0, %ymm02960; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm12961; AVX2-NEXT: vpackusdw %xmm1, %xmm0, %xmm02962; AVX2-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[0,2,1,3]2963; AVX2-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm02964; AVX2-NEXT: vzeroupper2965; AVX2-NEXT: retq2966;2967; AVX512-LABEL: trunc_and_const_v8i64_v8i16:2968; AVX512: # %bb.0:2969; AVX512-NEXT: vpmovqw %zmm0, %xmm02970; AVX512-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm02971; AVX512-NEXT: vzeroupper2972; AVX512-NEXT: retq2973 %1 = and <8 x i64> %a0, <i64 0, i64 1, i64 2, i64 3, i64 4, i64 5, i64 6, i64 7>2974 %2 = trunc <8 x i64> %1 to <8 x i16>2975 ret <8 x i16> %22976}2977 2978define <8 x i16> @trunc_and_const_v8i32_v8i16(<8 x i32> %a0) nounwind {2979; SSE-LABEL: trunc_and_const_v8i32_v8i16:2980; SSE: # %bb.0:2981; SSE-NEXT: pslld $16, %xmm12982; SSE-NEXT: psrad $16, %xmm12983; SSE-NEXT: pslld $16, %xmm02984; SSE-NEXT: psrad $16, %xmm02985; SSE-NEXT: packssdw %xmm1, %xmm02986; SSE-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm02987; SSE-NEXT: retq2988;2989; AVX1-LABEL: trunc_and_const_v8i32_v8i16:2990; AVX1: # %bb.0:2991; AVX1-NEXT: vandps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm02992; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm12993; AVX1-NEXT: vpackusdw %xmm1, %xmm0, %xmm02994; AVX1-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm02995; AVX1-NEXT: vzeroupper2996; AVX1-NEXT: retq2997;2998; AVX2-LABEL: trunc_and_const_v8i32_v8i16:2999; AVX2: # %bb.0:3000; 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]3001; AVX2-NEXT: vpermq {{.*#+}} ymm0 = ymm0[0,2,2,3]3002; AVX2-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm03003; AVX2-NEXT: vzeroupper3004; AVX2-NEXT: retq3005;3006; AVX512-LABEL: trunc_and_const_v8i32_v8i16:3007; AVX512: # %bb.0:3008; AVX512-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm03009; AVX512-NEXT: vpmovdw %zmm0, %ymm03010; AVX512-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm03011; AVX512-NEXT: vzeroupper3012; AVX512-NEXT: retq3013 %1 = and <8 x i32> %a0, <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>3014 %2 = trunc <8 x i32> %1 to <8 x i16>3015 ret <8 x i16> %23016}3017 3018define <16 x i8> @trunc_and_const_v16i64_v16i8(<16 x i64> %a0) nounwind {3019; SSE-LABEL: trunc_and_const_v16i64_v16i8:3020; SSE: # %bb.0:3021; SSE-NEXT: movdqa {{.*#+}} xmm8 = [255,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0]3022; SSE-NEXT: pand %xmm8, %xmm73023; SSE-NEXT: pand %xmm8, %xmm63024; SSE-NEXT: packuswb %xmm7, %xmm63025; SSE-NEXT: pand %xmm8, %xmm53026; SSE-NEXT: pand %xmm8, %xmm43027; SSE-NEXT: packuswb %xmm5, %xmm43028; SSE-NEXT: packuswb %xmm6, %xmm43029; SSE-NEXT: pand %xmm8, %xmm33030; SSE-NEXT: pand %xmm8, %xmm23031; SSE-NEXT: packuswb %xmm3, %xmm23032; SSE-NEXT: pand %xmm8, %xmm13033; SSE-NEXT: pand %xmm8, %xmm03034; SSE-NEXT: packuswb %xmm1, %xmm03035; SSE-NEXT: packuswb %xmm2, %xmm03036; SSE-NEXT: packuswb %xmm4, %xmm03037; SSE-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm03038; SSE-NEXT: retq3039;3040; AVX1-LABEL: trunc_and_const_v16i64_v16i8:3041; AVX1: # %bb.0:3042; AVX1-NEXT: vbroadcastsd {{.*#+}} ymm4 = [255,255,255,255]3043; AVX1-NEXT: vandps %ymm4, %ymm3, %ymm33044; AVX1-NEXT: vextractf128 $1, %ymm3, %xmm53045; AVX1-NEXT: vpackusdw %xmm5, %xmm3, %xmm33046; AVX1-NEXT: vandps %ymm4, %ymm2, %ymm23047; AVX1-NEXT: vextractf128 $1, %ymm2, %xmm53048; AVX1-NEXT: vpackusdw %xmm5, %xmm2, %xmm23049; AVX1-NEXT: vpackusdw %xmm3, %xmm2, %xmm23050; AVX1-NEXT: vandps %ymm4, %ymm1, %ymm13051; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm33052; AVX1-NEXT: vpackusdw %xmm3, %xmm1, %xmm13053; AVX1-NEXT: vandps %ymm4, %ymm0, %ymm03054; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm33055; AVX1-NEXT: vpackusdw %xmm3, %xmm0, %xmm03056; AVX1-NEXT: vpackusdw %xmm1, %xmm0, %xmm03057; AVX1-NEXT: vpackuswb %xmm2, %xmm0, %xmm03058; AVX1-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm03059; AVX1-NEXT: vzeroupper3060; AVX1-NEXT: retq3061;3062; AVX2-LABEL: trunc_and_const_v16i64_v16i8:3063; AVX2: # %bb.0:3064; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm4 = [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]3065; AVX2-NEXT: vpand %ymm4, %ymm3, %ymm33066; AVX2-NEXT: vpand %ymm4, %ymm2, %ymm23067; AVX2-NEXT: vpackusdw %ymm3, %ymm2, %ymm23068; AVX2-NEXT: vpermq {{.*#+}} ymm2 = ymm2[0,2,1,3]3069; AVX2-NEXT: vpand %ymm4, %ymm1, %ymm13070; AVX2-NEXT: vpand %ymm4, %ymm0, %ymm03071; AVX2-NEXT: vpackusdw %ymm1, %ymm0, %ymm03072; AVX2-NEXT: vpermq {{.*#+}} ymm0 = ymm0[0,2,1,3]3073; AVX2-NEXT: vpackusdw %ymm2, %ymm0, %ymm03074; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm13075; AVX2-NEXT: vpackuswb %xmm1, %xmm0, %xmm03076; AVX2-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[0,2,1,3]3077; AVX2-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm03078; AVX2-NEXT: vzeroupper3079; AVX2-NEXT: retq3080;3081; AVX512-LABEL: trunc_and_const_v16i64_v16i8:3082; AVX512: # %bb.0:3083; AVX512-NEXT: vpmovqb %zmm1, %xmm13084; AVX512-NEXT: vpmovqb %zmm0, %xmm03085; AVX512-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]3086; AVX512-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm03087; AVX512-NEXT: vzeroupper3088; AVX512-NEXT: retq3089 %1 = and <16 x i64> %a0, <i64 0, i64 1, i64 2, i64 3, i64 4, i64 5, i64 6, i64 7, i64 8, i64 9, i64 10, i64 11, i64 12, i64 13, i64 14, i64 15>3090 %2 = trunc <16 x i64> %1 to <16 x i8>3091 ret <16 x i8> %23092}3093 3094define <16 x i8> @trunc_and_const_v16i32_v16i8(<16 x i32> %a0) nounwind {3095; SSE-LABEL: trunc_and_const_v16i32_v16i8:3096; SSE: # %bb.0:3097; SSE-NEXT: movdqa {{.*#+}} xmm4 = [255,0,0,0,255,0,0,0,255,0,0,0,255,0,0,0]3098; SSE-NEXT: pand %xmm4, %xmm33099; SSE-NEXT: pand %xmm4, %xmm23100; SSE-NEXT: packuswb %xmm3, %xmm23101; SSE-NEXT: pand %xmm4, %xmm13102; SSE-NEXT: pand %xmm4, %xmm03103; SSE-NEXT: packuswb %xmm1, %xmm03104; SSE-NEXT: packuswb %xmm2, %xmm03105; SSE-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm03106; SSE-NEXT: retq3107;3108; AVX1-LABEL: trunc_and_const_v16i32_v16i8:3109; AVX1: # %bb.0:3110; AVX1-NEXT: vbroadcastss {{.*#+}} ymm2 = [255,255,255,255,255,255,255,255]3111; AVX1-NEXT: vandps %ymm2, %ymm1, %ymm13112; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm33113; AVX1-NEXT: vpackusdw %xmm3, %xmm1, %xmm13114; AVX1-NEXT: vandps %ymm2, %ymm0, %ymm03115; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm23116; AVX1-NEXT: vpackusdw %xmm2, %xmm0, %xmm03117; AVX1-NEXT: vpackuswb %xmm1, %xmm0, %xmm03118; AVX1-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm03119; AVX1-NEXT: vzeroupper3120; AVX1-NEXT: retq3121;3122; AVX2-LABEL: trunc_and_const_v16i32_v16i8:3123; AVX2: # %bb.0:3124; 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]3125; AVX2-NEXT: vpand %ymm2, %ymm1, %ymm13126; AVX2-NEXT: vpand %ymm2, %ymm0, %ymm03127; AVX2-NEXT: vpackusdw %ymm1, %ymm0, %ymm03128; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm13129; AVX2-NEXT: vpackuswb %xmm1, %xmm0, %xmm03130; AVX2-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[0,2,1,3]3131; AVX2-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm03132; AVX2-NEXT: vzeroupper3133; AVX2-NEXT: retq3134;3135; AVX512-LABEL: trunc_and_const_v16i32_v16i8:3136; AVX512: # %bb.0:3137; AVX512-NEXT: vpmovdb %zmm0, %xmm03138; AVX512-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm03139; AVX512-NEXT: vzeroupper3140; AVX512-NEXT: retq3141 %1 = and <16 x i32> %a0, <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>3142 %2 = trunc <16 x i32> %1 to <16 x i8>3143 ret <16 x i8> %23144}3145 3146define <16 x i8> @trunc_and_const_v16i16_v16i8(<16 x i16> %a0) nounwind {3147; SSE-LABEL: trunc_and_const_v16i16_v16i8:3148; SSE: # %bb.0:3149; SSE-NEXT: movdqa {{.*#+}} xmm2 = [255,0,255,0,255,0,255,0,255,0,255,0,255,0,255,0]3150; SSE-NEXT: pand %xmm2, %xmm13151; SSE-NEXT: pand %xmm2, %xmm03152; SSE-NEXT: packuswb %xmm1, %xmm03153; SSE-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm03154; SSE-NEXT: retq3155;3156; AVX1-LABEL: trunc_and_const_v16i16_v16i8:3157; AVX1: # %bb.0:3158; AVX1-NEXT: vandps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm03159; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm13160; AVX1-NEXT: vpackuswb %xmm1, %xmm0, %xmm03161; AVX1-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm03162; AVX1-NEXT: vzeroupper3163; AVX1-NEXT: retq3164;3165; AVX2-LABEL: trunc_and_const_v16i16_v16i8:3166; AVX2: # %bb.0:3167; AVX2-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm03168; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm13169; AVX2-NEXT: vpackuswb %xmm1, %xmm0, %xmm03170; AVX2-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm03171; AVX2-NEXT: vzeroupper3172; AVX2-NEXT: retq3173;3174; AVX512F-LABEL: trunc_and_const_v16i16_v16i8:3175; AVX512F: # %bb.0:3176; 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],zero3177; AVX512F-NEXT: vpmovdb %zmm0, %xmm03178; AVX512F-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm03179; AVX512F-NEXT: vzeroupper3180; AVX512F-NEXT: retq3181;3182; AVX512BW-LABEL: trunc_and_const_v16i16_v16i8:3183; AVX512BW: # %bb.0:3184; AVX512BW-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm03185; AVX512BW-NEXT: vpmovwb %zmm0, %ymm03186; AVX512BW-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm03187; AVX512BW-NEXT: vzeroupper3188; AVX512BW-NEXT: retq3189;3190; AVX512DQ-LABEL: trunc_and_const_v16i16_v16i8:3191; AVX512DQ: # %bb.0:3192; AVX512DQ-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],zero3193; AVX512DQ-NEXT: vpmovdb %zmm0, %xmm03194; AVX512DQ-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm03195; AVX512DQ-NEXT: vzeroupper3196; AVX512DQ-NEXT: retq3197 %1 = and <16 x i16> %a0, <i16 0, i16 1, i16 2, i16 3, i16 4, i16 5, i16 6, i16 7, i16 8, i16 9, i16 10, i16 11, i16 12, i16 13, i16 14, i16 15>3198 %2 = trunc <16 x i16> %1 to <16 x i8>3199 ret <16 x i8> %23200}3201 3202;3203; xor3204;3205 3206define <4 x i32> @trunc_xor_v4i64_v4i32(<4 x i64> %a0, <4 x i64> %a1) nounwind {3207; SSE-LABEL: trunc_xor_v4i64_v4i32:3208; SSE: # %bb.0:3209; SSE-NEXT: xorps %xmm3, %xmm13210; SSE-NEXT: xorps %xmm2, %xmm03211; SSE-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,2],xmm1[0,2]3212; SSE-NEXT: retq3213;3214; AVX1-LABEL: trunc_xor_v4i64_v4i32:3215; AVX1: # %bb.0:3216; AVX1-NEXT: vxorps %ymm1, %ymm0, %ymm03217; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm13218; AVX1-NEXT: vshufps {{.*#+}} xmm0 = xmm0[0,2],xmm1[0,2]3219; AVX1-NEXT: vzeroupper3220; AVX1-NEXT: retq3221;3222; AVX2-SLOW-LABEL: trunc_xor_v4i64_v4i32:3223; AVX2-SLOW: # %bb.0:3224; AVX2-SLOW-NEXT: vxorps %ymm1, %ymm0, %ymm03225; AVX2-SLOW-NEXT: vextractf128 $1, %ymm0, %xmm13226; AVX2-SLOW-NEXT: vshufps {{.*#+}} xmm0 = xmm0[0,2],xmm1[0,2]3227; AVX2-SLOW-NEXT: vzeroupper3228; AVX2-SLOW-NEXT: retq3229;3230; AVX2-FAST-ALL-LABEL: trunc_xor_v4i64_v4i32:3231; AVX2-FAST-ALL: # %bb.0:3232; AVX2-FAST-ALL-NEXT: vxorps %ymm1, %ymm0, %ymm03233; AVX2-FAST-ALL-NEXT: vbroadcastf128 {{.*#+}} ymm1 = [0,2,4,6,0,2,4,6]3234; AVX2-FAST-ALL-NEXT: # ymm1 = mem[0,1,0,1]3235; AVX2-FAST-ALL-NEXT: vpermps %ymm0, %ymm1, %ymm03236; AVX2-FAST-ALL-NEXT: # kill: def $xmm0 killed $xmm0 killed $ymm03237; AVX2-FAST-ALL-NEXT: vzeroupper3238; AVX2-FAST-ALL-NEXT: retq3239;3240; AVX2-FAST-PERLANE-LABEL: trunc_xor_v4i64_v4i32:3241; AVX2-FAST-PERLANE: # %bb.0:3242; AVX2-FAST-PERLANE-NEXT: vxorps %ymm1, %ymm0, %ymm03243; AVX2-FAST-PERLANE-NEXT: vextractf128 $1, %ymm0, %xmm13244; AVX2-FAST-PERLANE-NEXT: vshufps {{.*#+}} xmm0 = xmm0[0,2],xmm1[0,2]3245; AVX2-FAST-PERLANE-NEXT: vzeroupper3246; AVX2-FAST-PERLANE-NEXT: retq3247;3248; AVX512-LABEL: trunc_xor_v4i64_v4i32:3249; AVX512: # %bb.0:3250; AVX512-NEXT: vpxor %ymm1, %ymm0, %ymm03251; AVX512-NEXT: vpmovqd %zmm0, %ymm03252; AVX512-NEXT: # kill: def $xmm0 killed $xmm0 killed $ymm03253; AVX512-NEXT: vzeroupper3254; AVX512-NEXT: retq3255 %1 = xor <4 x i64> %a0, %a13256 %2 = trunc <4 x i64> %1 to <4 x i32>3257 ret <4 x i32> %23258}3259 3260define <8 x i16> @trunc_xor_v8i64_v8i16(<8 x i64> %a0, <8 x i64> %a1) nounwind {3261; SSE-LABEL: trunc_xor_v8i64_v8i16:3262; SSE: # %bb.0:3263; SSE-NEXT: xorps %xmm5, %xmm13264; SSE-NEXT: xorps %xmm4, %xmm03265; SSE-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,2],xmm1[0,2]3266; SSE-NEXT: xorps %xmm7, %xmm33267; SSE-NEXT: xorps %xmm6, %xmm23268; SSE-NEXT: shufps {{.*#+}} xmm2 = xmm2[0,2],xmm3[0,2]3269; SSE-NEXT: pslld $16, %xmm23270; SSE-NEXT: psrad $16, %xmm23271; SSE-NEXT: pslld $16, %xmm03272; SSE-NEXT: psrad $16, %xmm03273; SSE-NEXT: packssdw %xmm2, %xmm03274; SSE-NEXT: retq3275;3276; AVX1-LABEL: trunc_xor_v8i64_v8i16:3277; AVX1: # %bb.0:3278; AVX1-NEXT: vxorps %ymm2, %ymm0, %ymm03279; AVX1-NEXT: vxorps %ymm3, %ymm1, %ymm13280; AVX1-NEXT: vbroadcastsd {{.*#+}} ymm2 = [65535,65535,65535,65535]3281; AVX1-NEXT: vandps %ymm2, %ymm1, %ymm13282; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm33283; AVX1-NEXT: vpackusdw %xmm3, %xmm1, %xmm13284; AVX1-NEXT: vandps %ymm2, %ymm0, %ymm03285; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm23286; AVX1-NEXT: vpackusdw %xmm2, %xmm0, %xmm03287; AVX1-NEXT: vpackusdw %xmm1, %xmm0, %xmm03288; AVX1-NEXT: vzeroupper3289; AVX1-NEXT: retq3290;3291; AVX2-LABEL: trunc_xor_v8i64_v8i16:3292; AVX2: # %bb.0:3293; AVX2-NEXT: vpxor %ymm2, %ymm0, %ymm03294; AVX2-NEXT: vpxor %ymm3, %ymm1, %ymm13295; AVX2-NEXT: vpxor %xmm2, %xmm2, %xmm23296; 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]3297; 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]3298; AVX2-NEXT: vpackusdw %ymm1, %ymm0, %ymm03299; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm13300; AVX2-NEXT: vpackusdw %xmm1, %xmm0, %xmm03301; AVX2-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[0,2,1,3]3302; AVX2-NEXT: vzeroupper3303; AVX2-NEXT: retq3304;3305; AVX512-LABEL: trunc_xor_v8i64_v8i16:3306; AVX512: # %bb.0:3307; AVX512-NEXT: vpxorq %zmm1, %zmm0, %zmm03308; AVX512-NEXT: vpmovqw %zmm0, %xmm03309; AVX512-NEXT: vzeroupper3310; AVX512-NEXT: retq3311 %1 = xor <8 x i64> %a0, %a13312 %2 = trunc <8 x i64> %1 to <8 x i16>3313 ret <8 x i16> %23314}3315 3316define <8 x i16> @trunc_xor_v8i32_v8i16(<8 x i32> %a0, <8 x i32> %a1) nounwind {3317; SSE-LABEL: trunc_xor_v8i32_v8i16:3318; SSE: # %bb.0:3319; SSE-NEXT: pxor %xmm2, %xmm03320; SSE-NEXT: pxor %xmm3, %xmm13321; SSE-NEXT: pslld $16, %xmm13322; SSE-NEXT: psrad $16, %xmm13323; SSE-NEXT: pslld $16, %xmm03324; SSE-NEXT: psrad $16, %xmm03325; SSE-NEXT: packssdw %xmm1, %xmm03326; SSE-NEXT: retq3327;3328; AVX1-LABEL: trunc_xor_v8i32_v8i16:3329; AVX1: # %bb.0:3330; AVX1-NEXT: vxorps %ymm1, %ymm0, %ymm03331; AVX1-NEXT: vandps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm03332; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm13333; AVX1-NEXT: vpackusdw %xmm1, %xmm0, %xmm03334; AVX1-NEXT: vzeroupper3335; AVX1-NEXT: retq3336;3337; AVX2-LABEL: trunc_xor_v8i32_v8i16:3338; AVX2: # %bb.0:3339; AVX2-NEXT: vpxor %ymm1, %ymm0, %ymm03340; 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]3341; AVX2-NEXT: vpermq {{.*#+}} ymm0 = ymm0[0,2,2,3]3342; AVX2-NEXT: # kill: def $xmm0 killed $xmm0 killed $ymm03343; AVX2-NEXT: vzeroupper3344; AVX2-NEXT: retq3345;3346; AVX512-LABEL: trunc_xor_v8i32_v8i16:3347; AVX512: # %bb.0:3348; AVX512-NEXT: vpxor %ymm1, %ymm0, %ymm03349; AVX512-NEXT: vpmovdw %zmm0, %ymm03350; AVX512-NEXT: # kill: def $xmm0 killed $xmm0 killed $ymm03351; AVX512-NEXT: vzeroupper3352; AVX512-NEXT: retq3353 %1 = xor <8 x i32> %a0, %a13354 %2 = trunc <8 x i32> %1 to <8 x i16>3355 ret <8 x i16> %23356}3357 3358define <16 x i8> @trunc_xor_v16i64_v16i8(<16 x i64> %a0, <16 x i64> %a1) nounwind {3359; SSE-LABEL: trunc_xor_v16i64_v16i8:3360; SSE: # %bb.0:3361; SSE-NEXT: pxor {{[0-9]+}}(%rsp), %xmm03362; SSE-NEXT: pxor {{[0-9]+}}(%rsp), %xmm13363; SSE-NEXT: pxor {{[0-9]+}}(%rsp), %xmm23364; SSE-NEXT: pxor {{[0-9]+}}(%rsp), %xmm33365; SSE-NEXT: pxor {{[0-9]+}}(%rsp), %xmm43366; SSE-NEXT: pxor {{[0-9]+}}(%rsp), %xmm53367; SSE-NEXT: pxor {{[0-9]+}}(%rsp), %xmm63368; SSE-NEXT: pxor {{[0-9]+}}(%rsp), %xmm73369; SSE-NEXT: movdqa {{.*#+}} xmm8 = [255,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0]3370; SSE-NEXT: pand %xmm8, %xmm73371; SSE-NEXT: pand %xmm8, %xmm63372; SSE-NEXT: packuswb %xmm7, %xmm63373; SSE-NEXT: pand %xmm8, %xmm53374; SSE-NEXT: pand %xmm8, %xmm43375; SSE-NEXT: packuswb %xmm5, %xmm43376; SSE-NEXT: packuswb %xmm6, %xmm43377; SSE-NEXT: pand %xmm8, %xmm33378; SSE-NEXT: pand %xmm8, %xmm23379; SSE-NEXT: packuswb %xmm3, %xmm23380; SSE-NEXT: pand %xmm8, %xmm13381; SSE-NEXT: pand %xmm8, %xmm03382; SSE-NEXT: packuswb %xmm1, %xmm03383; SSE-NEXT: packuswb %xmm2, %xmm03384; SSE-NEXT: packuswb %xmm4, %xmm03385; SSE-NEXT: retq3386;3387; AVX1-LABEL: trunc_xor_v16i64_v16i8:3388; AVX1: # %bb.0:3389; AVX1-NEXT: vxorps %ymm4, %ymm0, %ymm03390; AVX1-NEXT: vxorps %ymm5, %ymm1, %ymm13391; AVX1-NEXT: vxorps %ymm6, %ymm2, %ymm23392; AVX1-NEXT: vxorps %ymm7, %ymm3, %ymm33393; AVX1-NEXT: vbroadcastsd {{.*#+}} ymm4 = [255,255,255,255]3394; AVX1-NEXT: vandps %ymm4, %ymm3, %ymm33395; AVX1-NEXT: vextractf128 $1, %ymm3, %xmm53396; AVX1-NEXT: vpackusdw %xmm5, %xmm3, %xmm33397; AVX1-NEXT: vandps %ymm4, %ymm2, %ymm23398; AVX1-NEXT: vextractf128 $1, %ymm2, %xmm53399; AVX1-NEXT: vpackusdw %xmm5, %xmm2, %xmm23400; AVX1-NEXT: vpackusdw %xmm3, %xmm2, %xmm23401; AVX1-NEXT: vandps %ymm4, %ymm1, %ymm13402; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm33403; AVX1-NEXT: vpackusdw %xmm3, %xmm1, %xmm13404; AVX1-NEXT: vandps %ymm4, %ymm0, %ymm03405; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm33406; AVX1-NEXT: vpackusdw %xmm3, %xmm0, %xmm03407; AVX1-NEXT: vpackusdw %xmm1, %xmm0, %xmm03408; AVX1-NEXT: vpackuswb %xmm2, %xmm0, %xmm03409; AVX1-NEXT: vzeroupper3410; AVX1-NEXT: retq3411;3412; AVX2-LABEL: trunc_xor_v16i64_v16i8:3413; AVX2: # %bb.0:3414; AVX2-NEXT: vpxor %ymm4, %ymm0, %ymm03415; AVX2-NEXT: vpxor %ymm5, %ymm1, %ymm13416; AVX2-NEXT: vpxor %ymm6, %ymm2, %ymm23417; AVX2-NEXT: vpxor %ymm7, %ymm3, %ymm33418; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm4 = [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]3419; AVX2-NEXT: vpand %ymm4, %ymm3, %ymm33420; AVX2-NEXT: vpand %ymm4, %ymm2, %ymm23421; AVX2-NEXT: vpackusdw %ymm3, %ymm2, %ymm23422; AVX2-NEXT: vpermq {{.*#+}} ymm2 = ymm2[0,2,1,3]3423; AVX2-NEXT: vpand %ymm4, %ymm1, %ymm13424; AVX2-NEXT: vpand %ymm4, %ymm0, %ymm03425; AVX2-NEXT: vpackusdw %ymm1, %ymm0, %ymm03426; AVX2-NEXT: vpermq {{.*#+}} ymm0 = ymm0[0,2,1,3]3427; AVX2-NEXT: vpackusdw %ymm2, %ymm0, %ymm03428; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm13429; AVX2-NEXT: vpackuswb %xmm1, %xmm0, %xmm03430; AVX2-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[0,2,1,3]3431; AVX2-NEXT: vzeroupper3432; AVX2-NEXT: retq3433;3434; AVX512-LABEL: trunc_xor_v16i64_v16i8:3435; AVX512: # %bb.0:3436; AVX512-NEXT: vpxorq %zmm2, %zmm0, %zmm03437; AVX512-NEXT: vpxorq %zmm3, %zmm1, %zmm13438; AVX512-NEXT: vpmovqb %zmm1, %xmm13439; AVX512-NEXT: vpmovqb %zmm0, %xmm03440; AVX512-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]3441; AVX512-NEXT: vzeroupper3442; AVX512-NEXT: retq3443 %1 = xor <16 x i64> %a0, %a13444 %2 = trunc <16 x i64> %1 to <16 x i8>3445 ret <16 x i8> %23446}3447 3448define <16 x i8> @trunc_xor_v16i32_v16i8(<16 x i32> %a0, <16 x i32> %a1) nounwind {3449; SSE-LABEL: trunc_xor_v16i32_v16i8:3450; SSE: # %bb.0:3451; SSE-NEXT: pxor %xmm4, %xmm03452; SSE-NEXT: pxor %xmm5, %xmm13453; SSE-NEXT: pxor %xmm6, %xmm23454; SSE-NEXT: pxor %xmm7, %xmm33455; SSE-NEXT: movdqa {{.*#+}} xmm4 = [255,0,0,0,255,0,0,0,255,0,0,0,255,0,0,0]3456; SSE-NEXT: pand %xmm4, %xmm33457; SSE-NEXT: pand %xmm4, %xmm23458; SSE-NEXT: packuswb %xmm3, %xmm23459; SSE-NEXT: pand %xmm4, %xmm13460; SSE-NEXT: pand %xmm4, %xmm03461; SSE-NEXT: packuswb %xmm1, %xmm03462; SSE-NEXT: packuswb %xmm2, %xmm03463; SSE-NEXT: retq3464;3465; AVX1-LABEL: trunc_xor_v16i32_v16i8:3466; AVX1: # %bb.0:3467; AVX1-NEXT: vxorps %ymm2, %ymm0, %ymm03468; AVX1-NEXT: vxorps %ymm3, %ymm1, %ymm13469; AVX1-NEXT: vbroadcastss {{.*#+}} ymm2 = [255,255,255,255,255,255,255,255]3470; AVX1-NEXT: vandps %ymm2, %ymm1, %ymm13471; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm33472; AVX1-NEXT: vpackusdw %xmm3, %xmm1, %xmm13473; AVX1-NEXT: vandps %ymm2, %ymm0, %ymm03474; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm23475; AVX1-NEXT: vpackusdw %xmm2, %xmm0, %xmm03476; AVX1-NEXT: vpackuswb %xmm1, %xmm0, %xmm03477; AVX1-NEXT: vzeroupper3478; AVX1-NEXT: retq3479;3480; AVX2-LABEL: trunc_xor_v16i32_v16i8:3481; AVX2: # %bb.0:3482; AVX2-NEXT: vpxor %ymm2, %ymm0, %ymm03483; AVX2-NEXT: vpxor %ymm3, %ymm1, %ymm13484; 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]3485; AVX2-NEXT: vpand %ymm2, %ymm1, %ymm13486; AVX2-NEXT: vpand %ymm2, %ymm0, %ymm03487; AVX2-NEXT: vpackusdw %ymm1, %ymm0, %ymm03488; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm13489; AVX2-NEXT: vpackuswb %xmm1, %xmm0, %xmm03490; AVX2-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[0,2,1,3]3491; AVX2-NEXT: vzeroupper3492; AVX2-NEXT: retq3493;3494; AVX512-LABEL: trunc_xor_v16i32_v16i8:3495; AVX512: # %bb.0:3496; AVX512-NEXT: vpxord %zmm1, %zmm0, %zmm03497; AVX512-NEXT: vpmovdb %zmm0, %xmm03498; AVX512-NEXT: vzeroupper3499; AVX512-NEXT: retq3500 %1 = xor <16 x i32> %a0, %a13501 %2 = trunc <16 x i32> %1 to <16 x i8>3502 ret <16 x i8> %23503}3504 3505define <16 x i8> @trunc_xor_v16i16_v16i8(<16 x i16> %a0, <16 x i16> %a1) nounwind {3506; SSE-LABEL: trunc_xor_v16i16_v16i8:3507; SSE: # %bb.0:3508; SSE-NEXT: pxor %xmm2, %xmm03509; SSE-NEXT: pxor %xmm3, %xmm13510; SSE-NEXT: movdqa {{.*#+}} xmm2 = [255,0,255,0,255,0,255,0,255,0,255,0,255,0,255,0]3511; SSE-NEXT: pand %xmm2, %xmm13512; SSE-NEXT: pand %xmm2, %xmm03513; SSE-NEXT: packuswb %xmm1, %xmm03514; SSE-NEXT: retq3515;3516; AVX1-LABEL: trunc_xor_v16i16_v16i8:3517; AVX1: # %bb.0:3518; AVX1-NEXT: vxorps %ymm1, %ymm0, %ymm03519; AVX1-NEXT: vandps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm03520; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm13521; AVX1-NEXT: vpackuswb %xmm1, %xmm0, %xmm03522; AVX1-NEXT: vzeroupper3523; AVX1-NEXT: retq3524;3525; AVX2-LABEL: trunc_xor_v16i16_v16i8:3526; AVX2: # %bb.0:3527; AVX2-NEXT: vpxor %ymm1, %ymm0, %ymm03528; AVX2-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm03529; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm13530; AVX2-NEXT: vpackuswb %xmm1, %xmm0, %xmm03531; AVX2-NEXT: vzeroupper3532; AVX2-NEXT: retq3533;3534; AVX512F-LABEL: trunc_xor_v16i16_v16i8:3535; AVX512F: # %bb.0:3536; AVX512F-NEXT: vpxor %ymm1, %ymm0, %ymm03537; 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],zero3538; AVX512F-NEXT: vpmovdb %zmm0, %xmm03539; AVX512F-NEXT: vzeroupper3540; AVX512F-NEXT: retq3541;3542; AVX512BW-LABEL: trunc_xor_v16i16_v16i8:3543; AVX512BW: # %bb.0:3544; AVX512BW-NEXT: vpxor %ymm1, %ymm0, %ymm03545; AVX512BW-NEXT: vpmovwb %zmm0, %ymm03546; AVX512BW-NEXT: # kill: def $xmm0 killed $xmm0 killed $ymm03547; AVX512BW-NEXT: vzeroupper3548; AVX512BW-NEXT: retq3549;3550; AVX512DQ-LABEL: trunc_xor_v16i16_v16i8:3551; AVX512DQ: # %bb.0:3552; AVX512DQ-NEXT: vpxor %ymm1, %ymm0, %ymm03553; AVX512DQ-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],zero3554; AVX512DQ-NEXT: vpmovdb %zmm0, %xmm03555; AVX512DQ-NEXT: vzeroupper3556; AVX512DQ-NEXT: retq3557 %1 = xor <16 x i16> %a0, %a13558 %2 = trunc <16 x i16> %1 to <16 x i8>3559 ret <16 x i8> %23560}3561 3562;3563; xor to constant3564;3565 3566define <4 x i32> @trunc_xor_const_v4i64_v4i32(<4 x i64> %a0) nounwind {3567; SSE-LABEL: trunc_xor_const_v4i64_v4i32:3568; SSE: # %bb.0:3569; SSE-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,2],xmm1[0,2]3570; SSE-NEXT: xorps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm03571; SSE-NEXT: retq3572;3573; AVX1-LABEL: trunc_xor_const_v4i64_v4i32:3574; AVX1: # %bb.0:3575; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm13576; AVX1-NEXT: vshufps {{.*#+}} xmm0 = xmm0[0,2],xmm1[0,2]3577; AVX1-NEXT: vxorps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm03578; AVX1-NEXT: vzeroupper3579; AVX1-NEXT: retq3580;3581; AVX2-SLOW-LABEL: trunc_xor_const_v4i64_v4i32:3582; AVX2-SLOW: # %bb.0:3583; AVX2-SLOW-NEXT: vextractf128 $1, %ymm0, %xmm13584; AVX2-SLOW-NEXT: vshufps {{.*#+}} xmm0 = xmm0[0,2],xmm1[0,2]3585; AVX2-SLOW-NEXT: vxorps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm03586; AVX2-SLOW-NEXT: vzeroupper3587; AVX2-SLOW-NEXT: retq3588;3589; AVX2-FAST-ALL-LABEL: trunc_xor_const_v4i64_v4i32:3590; AVX2-FAST-ALL: # %bb.0:3591; AVX2-FAST-ALL-NEXT: vbroadcastf128 {{.*#+}} ymm1 = [0,2,4,6,0,2,4,6]3592; AVX2-FAST-ALL-NEXT: # ymm1 = mem[0,1,0,1]3593; AVX2-FAST-ALL-NEXT: vpermps %ymm0, %ymm1, %ymm03594; AVX2-FAST-ALL-NEXT: vxorps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm03595; AVX2-FAST-ALL-NEXT: vzeroupper3596; AVX2-FAST-ALL-NEXT: retq3597;3598; AVX2-FAST-PERLANE-LABEL: trunc_xor_const_v4i64_v4i32:3599; AVX2-FAST-PERLANE: # %bb.0:3600; AVX2-FAST-PERLANE-NEXT: vextractf128 $1, %ymm0, %xmm13601; AVX2-FAST-PERLANE-NEXT: vshufps {{.*#+}} xmm0 = xmm0[0,2],xmm1[0,2]3602; AVX2-FAST-PERLANE-NEXT: vxorps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm03603; AVX2-FAST-PERLANE-NEXT: vzeroupper3604; AVX2-FAST-PERLANE-NEXT: retq3605;3606; AVX512-LABEL: trunc_xor_const_v4i64_v4i32:3607; AVX512: # %bb.0:3608; AVX512-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm03609; AVX512-NEXT: vpmovqd %zmm0, %ymm03610; AVX512-NEXT: vpxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm03611; AVX512-NEXT: vzeroupper3612; AVX512-NEXT: retq3613 %1 = xor <4 x i64> %a0, <i64 0, i64 1, i64 2, i64 3>3614 %2 = trunc <4 x i64> %1 to <4 x i32>3615 ret <4 x i32> %23616}3617 3618define <8 x i16> @trunc_xor_const_v8i64_v8i16(<8 x i64> %a0) nounwind {3619; SSE-LABEL: trunc_xor_const_v8i64_v8i16:3620; SSE: # %bb.0:3621; SSE-NEXT: shufps {{.*#+}} xmm2 = xmm2[0,2],xmm3[0,2]3622; SSE-NEXT: pslld $16, %xmm23623; SSE-NEXT: psrad $16, %xmm23624; SSE-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,2],xmm1[0,2]3625; SSE-NEXT: pslld $16, %xmm03626; SSE-NEXT: psrad $16, %xmm03627; SSE-NEXT: packssdw %xmm2, %xmm03628; SSE-NEXT: pxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm03629; SSE-NEXT: retq3630;3631; AVX1-LABEL: trunc_xor_const_v8i64_v8i16:3632; AVX1: # %bb.0:3633; AVX1-NEXT: vbroadcastsd {{.*#+}} ymm2 = [65535,65535,65535,65535]3634; AVX1-NEXT: vandps %ymm2, %ymm1, %ymm13635; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm33636; AVX1-NEXT: vpackusdw %xmm3, %xmm1, %xmm13637; AVX1-NEXT: vandps %ymm2, %ymm0, %ymm03638; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm23639; AVX1-NEXT: vpackusdw %xmm2, %xmm0, %xmm03640; AVX1-NEXT: vpackusdw %xmm1, %xmm0, %xmm03641; AVX1-NEXT: vpxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm03642; AVX1-NEXT: vzeroupper3643; AVX1-NEXT: retq3644;3645; AVX2-LABEL: trunc_xor_const_v8i64_v8i16:3646; AVX2: # %bb.0:3647; AVX2-NEXT: vpxor %xmm2, %xmm2, %xmm23648; 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]3649; 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]3650; AVX2-NEXT: vpackusdw %ymm1, %ymm0, %ymm03651; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm13652; AVX2-NEXT: vpackusdw %xmm1, %xmm0, %xmm03653; AVX2-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[0,2,1,3]3654; AVX2-NEXT: vpxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm03655; AVX2-NEXT: vzeroupper3656; AVX2-NEXT: retq3657;3658; AVX512-LABEL: trunc_xor_const_v8i64_v8i16:3659; AVX512: # %bb.0:3660; AVX512-NEXT: vpmovqw %zmm0, %xmm03661; AVX512-NEXT: vpxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm03662; AVX512-NEXT: vzeroupper3663; AVX512-NEXT: retq3664 %1 = xor <8 x i64> %a0, <i64 0, i64 1, i64 2, i64 3, i64 4, i64 5, i64 6, i64 7>3665 %2 = trunc <8 x i64> %1 to <8 x i16>3666 ret <8 x i16> %23667}3668 3669define <8 x i16> @trunc_xor_const_v8i32_v8i16(<8 x i32> %a0) nounwind {3670; SSE-LABEL: trunc_xor_const_v8i32_v8i16:3671; SSE: # %bb.0:3672; SSE-NEXT: pslld $16, %xmm13673; SSE-NEXT: psrad $16, %xmm13674; SSE-NEXT: pslld $16, %xmm03675; SSE-NEXT: psrad $16, %xmm03676; SSE-NEXT: packssdw %xmm1, %xmm03677; SSE-NEXT: pxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm03678; SSE-NEXT: retq3679;3680; AVX1-LABEL: trunc_xor_const_v8i32_v8i16:3681; AVX1: # %bb.0:3682; AVX1-NEXT: vandps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm03683; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm13684; AVX1-NEXT: vpackusdw %xmm1, %xmm0, %xmm03685; AVX1-NEXT: vpxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm03686; AVX1-NEXT: vzeroupper3687; AVX1-NEXT: retq3688;3689; AVX2-LABEL: trunc_xor_const_v8i32_v8i16:3690; AVX2: # %bb.0:3691; 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]3692; AVX2-NEXT: vpermq {{.*#+}} ymm0 = ymm0[0,2,2,3]3693; AVX2-NEXT: vpxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm03694; AVX2-NEXT: vzeroupper3695; AVX2-NEXT: retq3696;3697; AVX512-LABEL: trunc_xor_const_v8i32_v8i16:3698; AVX512: # %bb.0:3699; AVX512-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm03700; AVX512-NEXT: vpmovdw %zmm0, %ymm03701; AVX512-NEXT: vpxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm03702; AVX512-NEXT: vzeroupper3703; AVX512-NEXT: retq3704 %1 = xor <8 x i32> %a0, <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>3705 %2 = trunc <8 x i32> %1 to <8 x i16>3706 ret <8 x i16> %23707}3708 3709define <16 x i8> @trunc_xor_const_v16i64_v16i8(<16 x i64> %a0) nounwind {3710; SSE-LABEL: trunc_xor_const_v16i64_v16i8:3711; SSE: # %bb.0:3712; SSE-NEXT: movdqa {{.*#+}} xmm8 = [255,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0]3713; SSE-NEXT: pand %xmm8, %xmm73714; SSE-NEXT: pand %xmm8, %xmm63715; SSE-NEXT: packuswb %xmm7, %xmm63716; SSE-NEXT: pand %xmm8, %xmm53717; SSE-NEXT: pand %xmm8, %xmm43718; SSE-NEXT: packuswb %xmm5, %xmm43719; SSE-NEXT: packuswb %xmm6, %xmm43720; SSE-NEXT: pand %xmm8, %xmm33721; SSE-NEXT: pand %xmm8, %xmm23722; SSE-NEXT: packuswb %xmm3, %xmm23723; SSE-NEXT: pand %xmm8, %xmm13724; SSE-NEXT: pand %xmm8, %xmm03725; SSE-NEXT: packuswb %xmm1, %xmm03726; SSE-NEXT: packuswb %xmm2, %xmm03727; SSE-NEXT: packuswb %xmm4, %xmm03728; SSE-NEXT: pxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm03729; SSE-NEXT: retq3730;3731; AVX1-LABEL: trunc_xor_const_v16i64_v16i8:3732; AVX1: # %bb.0:3733; AVX1-NEXT: vbroadcastsd {{.*#+}} ymm4 = [255,255,255,255]3734; AVX1-NEXT: vandps %ymm4, %ymm3, %ymm33735; AVX1-NEXT: vextractf128 $1, %ymm3, %xmm53736; AVX1-NEXT: vpackusdw %xmm5, %xmm3, %xmm33737; AVX1-NEXT: vandps %ymm4, %ymm2, %ymm23738; AVX1-NEXT: vextractf128 $1, %ymm2, %xmm53739; AVX1-NEXT: vpackusdw %xmm5, %xmm2, %xmm23740; AVX1-NEXT: vpackusdw %xmm3, %xmm2, %xmm23741; AVX1-NEXT: vandps %ymm4, %ymm1, %ymm13742; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm33743; AVX1-NEXT: vpackusdw %xmm3, %xmm1, %xmm13744; AVX1-NEXT: vandps %ymm4, %ymm0, %ymm03745; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm33746; AVX1-NEXT: vpackusdw %xmm3, %xmm0, %xmm03747; AVX1-NEXT: vpackusdw %xmm1, %xmm0, %xmm03748; AVX1-NEXT: vpackuswb %xmm2, %xmm0, %xmm03749; AVX1-NEXT: vpxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm03750; AVX1-NEXT: vzeroupper3751; AVX1-NEXT: retq3752;3753; AVX2-LABEL: trunc_xor_const_v16i64_v16i8:3754; AVX2: # %bb.0:3755; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm4 = [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]3756; AVX2-NEXT: vpand %ymm4, %ymm3, %ymm33757; AVX2-NEXT: vpand %ymm4, %ymm2, %ymm23758; AVX2-NEXT: vpackusdw %ymm3, %ymm2, %ymm23759; AVX2-NEXT: vpermq {{.*#+}} ymm2 = ymm2[0,2,1,3]3760; AVX2-NEXT: vpand %ymm4, %ymm1, %ymm13761; AVX2-NEXT: vpand %ymm4, %ymm0, %ymm03762; AVX2-NEXT: vpackusdw %ymm1, %ymm0, %ymm03763; AVX2-NEXT: vpermq {{.*#+}} ymm0 = ymm0[0,2,1,3]3764; AVX2-NEXT: vpackusdw %ymm2, %ymm0, %ymm03765; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm13766; AVX2-NEXT: vpackuswb %xmm1, %xmm0, %xmm03767; AVX2-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[0,2,1,3]3768; AVX2-NEXT: vpxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm03769; AVX2-NEXT: vzeroupper3770; AVX2-NEXT: retq3771;3772; AVX512-LABEL: trunc_xor_const_v16i64_v16i8:3773; AVX512: # %bb.0:3774; AVX512-NEXT: vpmovqb %zmm1, %xmm13775; AVX512-NEXT: vpmovqb %zmm0, %xmm03776; AVX512-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]3777; AVX512-NEXT: vpxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm03778; AVX512-NEXT: vzeroupper3779; AVX512-NEXT: retq3780 %1 = xor <16 x i64> %a0, <i64 0, i64 1, i64 2, i64 3, i64 4, i64 5, i64 6, i64 7, i64 8, i64 9, i64 10, i64 11, i64 12, i64 13, i64 14, i64 15>3781 %2 = trunc <16 x i64> %1 to <16 x i8>3782 ret <16 x i8> %23783}3784 3785define <16 x i8> @trunc_xor_const_v16i32_v16i8(<16 x i32> %a0) nounwind {3786; SSE-LABEL: trunc_xor_const_v16i32_v16i8:3787; SSE: # %bb.0:3788; SSE-NEXT: movdqa {{.*#+}} xmm4 = [255,0,0,0,255,0,0,0,255,0,0,0,255,0,0,0]3789; SSE-NEXT: pand %xmm4, %xmm33790; SSE-NEXT: pand %xmm4, %xmm23791; SSE-NEXT: packuswb %xmm3, %xmm23792; SSE-NEXT: pand %xmm4, %xmm13793; SSE-NEXT: pand %xmm4, %xmm03794; SSE-NEXT: packuswb %xmm1, %xmm03795; SSE-NEXT: packuswb %xmm2, %xmm03796; SSE-NEXT: pxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm03797; SSE-NEXT: retq3798;3799; AVX1-LABEL: trunc_xor_const_v16i32_v16i8:3800; AVX1: # %bb.0:3801; AVX1-NEXT: vbroadcastss {{.*#+}} ymm2 = [255,255,255,255,255,255,255,255]3802; AVX1-NEXT: vandps %ymm2, %ymm1, %ymm13803; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm33804; AVX1-NEXT: vpackusdw %xmm3, %xmm1, %xmm13805; AVX1-NEXT: vandps %ymm2, %ymm0, %ymm03806; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm23807; AVX1-NEXT: vpackusdw %xmm2, %xmm0, %xmm03808; AVX1-NEXT: vpackuswb %xmm1, %xmm0, %xmm03809; AVX1-NEXT: vpxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm03810; AVX1-NEXT: vzeroupper3811; AVX1-NEXT: retq3812;3813; AVX2-LABEL: trunc_xor_const_v16i32_v16i8:3814; AVX2: # %bb.0:3815; 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]3816; AVX2-NEXT: vpand %ymm2, %ymm1, %ymm13817; AVX2-NEXT: vpand %ymm2, %ymm0, %ymm03818; AVX2-NEXT: vpackusdw %ymm1, %ymm0, %ymm03819; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm13820; AVX2-NEXT: vpackuswb %xmm1, %xmm0, %xmm03821; AVX2-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[0,2,1,3]3822; AVX2-NEXT: vpxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm03823; AVX2-NEXT: vzeroupper3824; AVX2-NEXT: retq3825;3826; AVX512-LABEL: trunc_xor_const_v16i32_v16i8:3827; AVX512: # %bb.0:3828; AVX512-NEXT: vpmovdb %zmm0, %xmm03829; AVX512-NEXT: vpxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm03830; AVX512-NEXT: vzeroupper3831; AVX512-NEXT: retq3832 %1 = xor <16 x i32> %a0, <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>3833 %2 = trunc <16 x i32> %1 to <16 x i8>3834 ret <16 x i8> %23835}3836 3837define <16 x i8> @trunc_xor_const_v16i16_v16i8(<16 x i16> %a0) nounwind {3838; SSE-LABEL: trunc_xor_const_v16i16_v16i8:3839; SSE: # %bb.0:3840; SSE-NEXT: movdqa {{.*#+}} xmm2 = [255,0,255,0,255,0,255,0,255,0,255,0,255,0,255,0]3841; SSE-NEXT: pand %xmm2, %xmm13842; SSE-NEXT: pand %xmm2, %xmm03843; SSE-NEXT: packuswb %xmm1, %xmm03844; SSE-NEXT: pxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm03845; SSE-NEXT: retq3846;3847; AVX1-LABEL: trunc_xor_const_v16i16_v16i8:3848; AVX1: # %bb.0:3849; AVX1-NEXT: vandps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm03850; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm13851; AVX1-NEXT: vpackuswb %xmm1, %xmm0, %xmm03852; AVX1-NEXT: vpxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm03853; AVX1-NEXT: vzeroupper3854; AVX1-NEXT: retq3855;3856; AVX2-LABEL: trunc_xor_const_v16i16_v16i8:3857; AVX2: # %bb.0:3858; AVX2-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm03859; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm13860; AVX2-NEXT: vpackuswb %xmm1, %xmm0, %xmm03861; AVX2-NEXT: vpxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm03862; AVX2-NEXT: vzeroupper3863; AVX2-NEXT: retq3864;3865; AVX512F-LABEL: trunc_xor_const_v16i16_v16i8:3866; AVX512F: # %bb.0:3867; 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],zero3868; AVX512F-NEXT: vpmovdb %zmm0, %xmm03869; AVX512F-NEXT: vpxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm03870; AVX512F-NEXT: vzeroupper3871; AVX512F-NEXT: retq3872;3873; AVX512BW-LABEL: trunc_xor_const_v16i16_v16i8:3874; AVX512BW: # %bb.0:3875; AVX512BW-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm03876; AVX512BW-NEXT: vpmovwb %zmm0, %ymm03877; AVX512BW-NEXT: vpxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm03878; AVX512BW-NEXT: vzeroupper3879; AVX512BW-NEXT: retq3880;3881; AVX512DQ-LABEL: trunc_xor_const_v16i16_v16i8:3882; AVX512DQ: # %bb.0:3883; AVX512DQ-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],zero3884; AVX512DQ-NEXT: vpmovdb %zmm0, %xmm03885; AVX512DQ-NEXT: vpxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm03886; AVX512DQ-NEXT: vzeroupper3887; AVX512DQ-NEXT: retq3888 %1 = xor <16 x i16> %a0, <i16 0, i16 1, i16 2, i16 3, i16 4, i16 5, i16 6, i16 7, i16 8, i16 9, i16 10, i16 11, i16 12, i16 13, i16 14, i16 15>3889 %2 = trunc <16 x i16> %1 to <16 x i8>3890 ret <16 x i8> %23891}3892 3893;3894; or3895;3896 3897define <4 x i32> @trunc_or_v4i64_v4i32(<4 x i64> %a0, <4 x i64> %a1) nounwind {3898; SSE-LABEL: trunc_or_v4i64_v4i32:3899; SSE: # %bb.0:3900; SSE-NEXT: orps %xmm3, %xmm13901; SSE-NEXT: orps %xmm2, %xmm03902; SSE-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,2],xmm1[0,2]3903; SSE-NEXT: retq3904;3905; AVX1-LABEL: trunc_or_v4i64_v4i32:3906; AVX1: # %bb.0:3907; AVX1-NEXT: vorps %ymm1, %ymm0, %ymm03908; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm13909; AVX1-NEXT: vshufps {{.*#+}} xmm0 = xmm0[0,2],xmm1[0,2]3910; AVX1-NEXT: vzeroupper3911; AVX1-NEXT: retq3912;3913; AVX2-SLOW-LABEL: trunc_or_v4i64_v4i32:3914; AVX2-SLOW: # %bb.0:3915; AVX2-SLOW-NEXT: vorps %ymm1, %ymm0, %ymm03916; AVX2-SLOW-NEXT: vextractf128 $1, %ymm0, %xmm13917; AVX2-SLOW-NEXT: vshufps {{.*#+}} xmm0 = xmm0[0,2],xmm1[0,2]3918; AVX2-SLOW-NEXT: vzeroupper3919; AVX2-SLOW-NEXT: retq3920;3921; AVX2-FAST-ALL-LABEL: trunc_or_v4i64_v4i32:3922; AVX2-FAST-ALL: # %bb.0:3923; AVX2-FAST-ALL-NEXT: vorps %ymm1, %ymm0, %ymm03924; AVX2-FAST-ALL-NEXT: vbroadcastf128 {{.*#+}} ymm1 = [0,2,4,6,0,2,4,6]3925; AVX2-FAST-ALL-NEXT: # ymm1 = mem[0,1,0,1]3926; AVX2-FAST-ALL-NEXT: vpermps %ymm0, %ymm1, %ymm03927; AVX2-FAST-ALL-NEXT: # kill: def $xmm0 killed $xmm0 killed $ymm03928; AVX2-FAST-ALL-NEXT: vzeroupper3929; AVX2-FAST-ALL-NEXT: retq3930;3931; AVX2-FAST-PERLANE-LABEL: trunc_or_v4i64_v4i32:3932; AVX2-FAST-PERLANE: # %bb.0:3933; AVX2-FAST-PERLANE-NEXT: vorps %ymm1, %ymm0, %ymm03934; AVX2-FAST-PERLANE-NEXT: vextractf128 $1, %ymm0, %xmm13935; AVX2-FAST-PERLANE-NEXT: vshufps {{.*#+}} xmm0 = xmm0[0,2],xmm1[0,2]3936; AVX2-FAST-PERLANE-NEXT: vzeroupper3937; AVX2-FAST-PERLANE-NEXT: retq3938;3939; AVX512-LABEL: trunc_or_v4i64_v4i32:3940; AVX512: # %bb.0:3941; AVX512-NEXT: vpor %ymm1, %ymm0, %ymm03942; AVX512-NEXT: vpmovqd %zmm0, %ymm03943; AVX512-NEXT: # kill: def $xmm0 killed $xmm0 killed $ymm03944; AVX512-NEXT: vzeroupper3945; AVX512-NEXT: retq3946 %1 = or <4 x i64> %a0, %a13947 %2 = trunc <4 x i64> %1 to <4 x i32>3948 ret <4 x i32> %23949}3950 3951define <8 x i16> @trunc_or_v8i64_v8i16(<8 x i64> %a0, <8 x i64> %a1) nounwind {3952; SSE-LABEL: trunc_or_v8i64_v8i16:3953; SSE: # %bb.0:3954; SSE-NEXT: orps %xmm5, %xmm13955; SSE-NEXT: orps %xmm4, %xmm03956; SSE-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,2],xmm1[0,2]3957; SSE-NEXT: orps %xmm7, %xmm33958; SSE-NEXT: orps %xmm6, %xmm23959; SSE-NEXT: shufps {{.*#+}} xmm2 = xmm2[0,2],xmm3[0,2]3960; SSE-NEXT: pslld $16, %xmm23961; SSE-NEXT: psrad $16, %xmm23962; SSE-NEXT: pslld $16, %xmm03963; SSE-NEXT: psrad $16, %xmm03964; SSE-NEXT: packssdw %xmm2, %xmm03965; SSE-NEXT: retq3966;3967; AVX1-LABEL: trunc_or_v8i64_v8i16:3968; AVX1: # %bb.0:3969; AVX1-NEXT: vorps %ymm2, %ymm0, %ymm03970; AVX1-NEXT: vorps %ymm3, %ymm1, %ymm13971; AVX1-NEXT: vbroadcastsd {{.*#+}} ymm2 = [65535,65535,65535,65535]3972; AVX1-NEXT: vandps %ymm2, %ymm1, %ymm13973; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm33974; AVX1-NEXT: vpackusdw %xmm3, %xmm1, %xmm13975; AVX1-NEXT: vandps %ymm2, %ymm0, %ymm03976; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm23977; AVX1-NEXT: vpackusdw %xmm2, %xmm0, %xmm03978; AVX1-NEXT: vpackusdw %xmm1, %xmm0, %xmm03979; AVX1-NEXT: vzeroupper3980; AVX1-NEXT: retq3981;3982; AVX2-LABEL: trunc_or_v8i64_v8i16:3983; AVX2: # %bb.0:3984; AVX2-NEXT: vpor %ymm2, %ymm0, %ymm03985; AVX2-NEXT: vpor %ymm3, %ymm1, %ymm13986; AVX2-NEXT: vpxor %xmm2, %xmm2, %xmm23987; 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]3988; 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]3989; AVX2-NEXT: vpackusdw %ymm1, %ymm0, %ymm03990; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm13991; AVX2-NEXT: vpackusdw %xmm1, %xmm0, %xmm03992; AVX2-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[0,2,1,3]3993; AVX2-NEXT: vzeroupper3994; AVX2-NEXT: retq3995;3996; AVX512-LABEL: trunc_or_v8i64_v8i16:3997; AVX512: # %bb.0:3998; AVX512-NEXT: vporq %zmm1, %zmm0, %zmm03999; AVX512-NEXT: vpmovqw %zmm0, %xmm04000; AVX512-NEXT: vzeroupper4001; AVX512-NEXT: retq4002 %1 = or <8 x i64> %a0, %a14003 %2 = trunc <8 x i64> %1 to <8 x i16>4004 ret <8 x i16> %24005}4006 4007define <8 x i16> @trunc_or_v8i32_v8i16(<8 x i32> %a0, <8 x i32> %a1) nounwind {4008; SSE-LABEL: trunc_or_v8i32_v8i16:4009; SSE: # %bb.0:4010; SSE-NEXT: por %xmm2, %xmm04011; SSE-NEXT: por %xmm3, %xmm14012; SSE-NEXT: pslld $16, %xmm14013; SSE-NEXT: psrad $16, %xmm14014; SSE-NEXT: pslld $16, %xmm04015; SSE-NEXT: psrad $16, %xmm04016; SSE-NEXT: packssdw %xmm1, %xmm04017; SSE-NEXT: retq4018;4019; AVX1-LABEL: trunc_or_v8i32_v8i16:4020; AVX1: # %bb.0:4021; AVX1-NEXT: vorps %ymm1, %ymm0, %ymm04022; AVX1-NEXT: vandps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm04023; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm14024; AVX1-NEXT: vpackusdw %xmm1, %xmm0, %xmm04025; AVX1-NEXT: vzeroupper4026; AVX1-NEXT: retq4027;4028; AVX2-LABEL: trunc_or_v8i32_v8i16:4029; AVX2: # %bb.0:4030; AVX2-NEXT: vpor %ymm1, %ymm0, %ymm04031; 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]4032; AVX2-NEXT: vpermq {{.*#+}} ymm0 = ymm0[0,2,2,3]4033; AVX2-NEXT: # kill: def $xmm0 killed $xmm0 killed $ymm04034; AVX2-NEXT: vzeroupper4035; AVX2-NEXT: retq4036;4037; AVX512-LABEL: trunc_or_v8i32_v8i16:4038; AVX512: # %bb.0:4039; AVX512-NEXT: vpor %ymm1, %ymm0, %ymm04040; AVX512-NEXT: vpmovdw %zmm0, %ymm04041; AVX512-NEXT: # kill: def $xmm0 killed $xmm0 killed $ymm04042; AVX512-NEXT: vzeroupper4043; AVX512-NEXT: retq4044 %1 = or <8 x i32> %a0, %a14045 %2 = trunc <8 x i32> %1 to <8 x i16>4046 ret <8 x i16> %24047}4048 4049define <16 x i8> @trunc_or_v16i64_v16i8(<16 x i64> %a0, <16 x i64> %a1) nounwind {4050; SSE-LABEL: trunc_or_v16i64_v16i8:4051; SSE: # %bb.0:4052; SSE-NEXT: por {{[0-9]+}}(%rsp), %xmm04053; SSE-NEXT: por {{[0-9]+}}(%rsp), %xmm14054; SSE-NEXT: por {{[0-9]+}}(%rsp), %xmm24055; SSE-NEXT: por {{[0-9]+}}(%rsp), %xmm34056; SSE-NEXT: por {{[0-9]+}}(%rsp), %xmm44057; SSE-NEXT: por {{[0-9]+}}(%rsp), %xmm54058; SSE-NEXT: por {{[0-9]+}}(%rsp), %xmm64059; SSE-NEXT: por {{[0-9]+}}(%rsp), %xmm74060; SSE-NEXT: movdqa {{.*#+}} xmm8 = [255,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0]4061; SSE-NEXT: pand %xmm8, %xmm74062; SSE-NEXT: pand %xmm8, %xmm64063; SSE-NEXT: packuswb %xmm7, %xmm64064; SSE-NEXT: pand %xmm8, %xmm54065; SSE-NEXT: pand %xmm8, %xmm44066; SSE-NEXT: packuswb %xmm5, %xmm44067; SSE-NEXT: packuswb %xmm6, %xmm44068; SSE-NEXT: pand %xmm8, %xmm34069; SSE-NEXT: pand %xmm8, %xmm24070; SSE-NEXT: packuswb %xmm3, %xmm24071; SSE-NEXT: pand %xmm8, %xmm14072; SSE-NEXT: pand %xmm8, %xmm04073; SSE-NEXT: packuswb %xmm1, %xmm04074; SSE-NEXT: packuswb %xmm2, %xmm04075; SSE-NEXT: packuswb %xmm4, %xmm04076; SSE-NEXT: retq4077;4078; AVX1-LABEL: trunc_or_v16i64_v16i8:4079; AVX1: # %bb.0:4080; AVX1-NEXT: vorps %ymm4, %ymm0, %ymm04081; AVX1-NEXT: vorps %ymm5, %ymm1, %ymm14082; AVX1-NEXT: vorps %ymm6, %ymm2, %ymm24083; AVX1-NEXT: vorps %ymm7, %ymm3, %ymm34084; AVX1-NEXT: vbroadcastsd {{.*#+}} ymm4 = [255,255,255,255]4085; AVX1-NEXT: vandps %ymm4, %ymm3, %ymm34086; AVX1-NEXT: vextractf128 $1, %ymm3, %xmm54087; AVX1-NEXT: vpackusdw %xmm5, %xmm3, %xmm34088; AVX1-NEXT: vandps %ymm4, %ymm2, %ymm24089; AVX1-NEXT: vextractf128 $1, %ymm2, %xmm54090; AVX1-NEXT: vpackusdw %xmm5, %xmm2, %xmm24091; AVX1-NEXT: vpackusdw %xmm3, %xmm2, %xmm24092; AVX1-NEXT: vandps %ymm4, %ymm1, %ymm14093; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm34094; AVX1-NEXT: vpackusdw %xmm3, %xmm1, %xmm14095; AVX1-NEXT: vandps %ymm4, %ymm0, %ymm04096; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm34097; AVX1-NEXT: vpackusdw %xmm3, %xmm0, %xmm04098; AVX1-NEXT: vpackusdw %xmm1, %xmm0, %xmm04099; AVX1-NEXT: vpackuswb %xmm2, %xmm0, %xmm04100; AVX1-NEXT: vzeroupper4101; AVX1-NEXT: retq4102;4103; AVX2-LABEL: trunc_or_v16i64_v16i8:4104; AVX2: # %bb.0:4105; AVX2-NEXT: vpor %ymm4, %ymm0, %ymm04106; AVX2-NEXT: vpor %ymm5, %ymm1, %ymm14107; AVX2-NEXT: vpor %ymm6, %ymm2, %ymm24108; AVX2-NEXT: vpor %ymm7, %ymm3, %ymm34109; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm4 = [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]4110; AVX2-NEXT: vpand %ymm4, %ymm3, %ymm34111; AVX2-NEXT: vpand %ymm4, %ymm2, %ymm24112; AVX2-NEXT: vpackusdw %ymm3, %ymm2, %ymm24113; AVX2-NEXT: vpermq {{.*#+}} ymm2 = ymm2[0,2,1,3]4114; AVX2-NEXT: vpand %ymm4, %ymm1, %ymm14115; AVX2-NEXT: vpand %ymm4, %ymm0, %ymm04116; AVX2-NEXT: vpackusdw %ymm1, %ymm0, %ymm04117; AVX2-NEXT: vpermq {{.*#+}} ymm0 = ymm0[0,2,1,3]4118; AVX2-NEXT: vpackusdw %ymm2, %ymm0, %ymm04119; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm14120; AVX2-NEXT: vpackuswb %xmm1, %xmm0, %xmm04121; AVX2-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[0,2,1,3]4122; AVX2-NEXT: vzeroupper4123; AVX2-NEXT: retq4124;4125; AVX512-LABEL: trunc_or_v16i64_v16i8:4126; AVX512: # %bb.0:4127; AVX512-NEXT: vporq %zmm2, %zmm0, %zmm04128; AVX512-NEXT: vporq %zmm3, %zmm1, %zmm14129; AVX512-NEXT: vpmovqb %zmm1, %xmm14130; AVX512-NEXT: vpmovqb %zmm0, %xmm04131; AVX512-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]4132; AVX512-NEXT: vzeroupper4133; AVX512-NEXT: retq4134 %1 = or <16 x i64> %a0, %a14135 %2 = trunc <16 x i64> %1 to <16 x i8>4136 ret <16 x i8> %24137}4138 4139define <16 x i8> @trunc_or_v16i32_v16i8(<16 x i32> %a0, <16 x i32> %a1) nounwind {4140; SSE-LABEL: trunc_or_v16i32_v16i8:4141; SSE: # %bb.0:4142; SSE-NEXT: por %xmm4, %xmm04143; SSE-NEXT: por %xmm5, %xmm14144; SSE-NEXT: por %xmm6, %xmm24145; SSE-NEXT: por %xmm7, %xmm34146; SSE-NEXT: movdqa {{.*#+}} xmm4 = [255,0,0,0,255,0,0,0,255,0,0,0,255,0,0,0]4147; SSE-NEXT: pand %xmm4, %xmm34148; SSE-NEXT: pand %xmm4, %xmm24149; SSE-NEXT: packuswb %xmm3, %xmm24150; SSE-NEXT: pand %xmm4, %xmm14151; SSE-NEXT: pand %xmm4, %xmm04152; SSE-NEXT: packuswb %xmm1, %xmm04153; SSE-NEXT: packuswb %xmm2, %xmm04154; SSE-NEXT: retq4155;4156; AVX1-LABEL: trunc_or_v16i32_v16i8:4157; AVX1: # %bb.0:4158; AVX1-NEXT: vorps %ymm2, %ymm0, %ymm04159; AVX1-NEXT: vorps %ymm3, %ymm1, %ymm14160; AVX1-NEXT: vbroadcastss {{.*#+}} ymm2 = [255,255,255,255,255,255,255,255]4161; AVX1-NEXT: vandps %ymm2, %ymm1, %ymm14162; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm34163; AVX1-NEXT: vpackusdw %xmm3, %xmm1, %xmm14164; AVX1-NEXT: vandps %ymm2, %ymm0, %ymm04165; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm24166; AVX1-NEXT: vpackusdw %xmm2, %xmm0, %xmm04167; AVX1-NEXT: vpackuswb %xmm1, %xmm0, %xmm04168; AVX1-NEXT: vzeroupper4169; AVX1-NEXT: retq4170;4171; AVX2-LABEL: trunc_or_v16i32_v16i8:4172; AVX2: # %bb.0:4173; AVX2-NEXT: vpor %ymm2, %ymm0, %ymm04174; AVX2-NEXT: vpor %ymm3, %ymm1, %ymm14175; 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]4176; AVX2-NEXT: vpand %ymm2, %ymm1, %ymm14177; AVX2-NEXT: vpand %ymm2, %ymm0, %ymm04178; AVX2-NEXT: vpackusdw %ymm1, %ymm0, %ymm04179; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm14180; AVX2-NEXT: vpackuswb %xmm1, %xmm0, %xmm04181; AVX2-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[0,2,1,3]4182; AVX2-NEXT: vzeroupper4183; AVX2-NEXT: retq4184;4185; AVX512-LABEL: trunc_or_v16i32_v16i8:4186; AVX512: # %bb.0:4187; AVX512-NEXT: vpord %zmm1, %zmm0, %zmm04188; AVX512-NEXT: vpmovdb %zmm0, %xmm04189; AVX512-NEXT: vzeroupper4190; AVX512-NEXT: retq4191 %1 = or <16 x i32> %a0, %a14192 %2 = trunc <16 x i32> %1 to <16 x i8>4193 ret <16 x i8> %24194}4195 4196define <16 x i8> @trunc_or_v16i16_v16i8(<16 x i16> %a0, <16 x i16> %a1) nounwind {4197; SSE-LABEL: trunc_or_v16i16_v16i8:4198; SSE: # %bb.0:4199; SSE-NEXT: por %xmm2, %xmm04200; SSE-NEXT: por %xmm3, %xmm14201; SSE-NEXT: movdqa {{.*#+}} xmm2 = [255,0,255,0,255,0,255,0,255,0,255,0,255,0,255,0]4202; SSE-NEXT: pand %xmm2, %xmm14203; SSE-NEXT: pand %xmm2, %xmm04204; SSE-NEXT: packuswb %xmm1, %xmm04205; SSE-NEXT: retq4206;4207; AVX1-LABEL: trunc_or_v16i16_v16i8:4208; AVX1: # %bb.0:4209; AVX1-NEXT: vorps %ymm1, %ymm0, %ymm04210; AVX1-NEXT: vandps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm04211; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm14212; AVX1-NEXT: vpackuswb %xmm1, %xmm0, %xmm04213; AVX1-NEXT: vzeroupper4214; AVX1-NEXT: retq4215;4216; AVX2-LABEL: trunc_or_v16i16_v16i8:4217; AVX2: # %bb.0:4218; AVX2-NEXT: vpor %ymm1, %ymm0, %ymm04219; AVX2-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm04220; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm14221; AVX2-NEXT: vpackuswb %xmm1, %xmm0, %xmm04222; AVX2-NEXT: vzeroupper4223; AVX2-NEXT: retq4224;4225; AVX512F-LABEL: trunc_or_v16i16_v16i8:4226; AVX512F: # %bb.0:4227; AVX512F-NEXT: vpor %ymm1, %ymm0, %ymm04228; 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],zero4229; AVX512F-NEXT: vpmovdb %zmm0, %xmm04230; AVX512F-NEXT: vzeroupper4231; AVX512F-NEXT: retq4232;4233; AVX512BW-LABEL: trunc_or_v16i16_v16i8:4234; AVX512BW: # %bb.0:4235; AVX512BW-NEXT: vpor %ymm1, %ymm0, %ymm04236; AVX512BW-NEXT: vpmovwb %zmm0, %ymm04237; AVX512BW-NEXT: # kill: def $xmm0 killed $xmm0 killed $ymm04238; AVX512BW-NEXT: vzeroupper4239; AVX512BW-NEXT: retq4240;4241; AVX512DQ-LABEL: trunc_or_v16i16_v16i8:4242; AVX512DQ: # %bb.0:4243; AVX512DQ-NEXT: vpor %ymm1, %ymm0, %ymm04244; AVX512DQ-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],zero4245; AVX512DQ-NEXT: vpmovdb %zmm0, %xmm04246; AVX512DQ-NEXT: vzeroupper4247; AVX512DQ-NEXT: retq4248 %1 = or <16 x i16> %a0, %a14249 %2 = trunc <16 x i16> %1 to <16 x i8>4250 ret <16 x i8> %24251}4252 4253;4254; or to constant4255;4256 4257define <4 x i32> @trunc_or_const_v4i64_v4i32(<4 x i64> %a0) nounwind {4258; SSE-LABEL: trunc_or_const_v4i64_v4i32:4259; SSE: # %bb.0:4260; SSE-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,2],xmm1[0,2]4261; SSE-NEXT: orps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm04262; SSE-NEXT: retq4263;4264; AVX1-LABEL: trunc_or_const_v4i64_v4i32:4265; AVX1: # %bb.0:4266; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm14267; AVX1-NEXT: vshufps {{.*#+}} xmm0 = xmm0[0,2],xmm1[0,2]4268; AVX1-NEXT: vorps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm04269; AVX1-NEXT: vzeroupper4270; AVX1-NEXT: retq4271;4272; AVX2-SLOW-LABEL: trunc_or_const_v4i64_v4i32:4273; AVX2-SLOW: # %bb.0:4274; AVX2-SLOW-NEXT: vextractf128 $1, %ymm0, %xmm14275; AVX2-SLOW-NEXT: vshufps {{.*#+}} xmm0 = xmm0[0,2],xmm1[0,2]4276; AVX2-SLOW-NEXT: vorps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm04277; AVX2-SLOW-NEXT: vzeroupper4278; AVX2-SLOW-NEXT: retq4279;4280; AVX2-FAST-ALL-LABEL: trunc_or_const_v4i64_v4i32:4281; AVX2-FAST-ALL: # %bb.0:4282; AVX2-FAST-ALL-NEXT: vbroadcastf128 {{.*#+}} ymm1 = [0,2,4,6,0,2,4,6]4283; AVX2-FAST-ALL-NEXT: # ymm1 = mem[0,1,0,1]4284; AVX2-FAST-ALL-NEXT: vpermps %ymm0, %ymm1, %ymm04285; AVX2-FAST-ALL-NEXT: vorps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm04286; AVX2-FAST-ALL-NEXT: vzeroupper4287; AVX2-FAST-ALL-NEXT: retq4288;4289; AVX2-FAST-PERLANE-LABEL: trunc_or_const_v4i64_v4i32:4290; AVX2-FAST-PERLANE: # %bb.0:4291; AVX2-FAST-PERLANE-NEXT: vextractf128 $1, %ymm0, %xmm14292; AVX2-FAST-PERLANE-NEXT: vshufps {{.*#+}} xmm0 = xmm0[0,2],xmm1[0,2]4293; AVX2-FAST-PERLANE-NEXT: vorps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm04294; AVX2-FAST-PERLANE-NEXT: vzeroupper4295; AVX2-FAST-PERLANE-NEXT: retq4296;4297; AVX512-LABEL: trunc_or_const_v4i64_v4i32:4298; AVX512: # %bb.0:4299; AVX512-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm04300; AVX512-NEXT: vpmovqd %zmm0, %ymm04301; AVX512-NEXT: vpor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm04302; AVX512-NEXT: vzeroupper4303; AVX512-NEXT: retq4304 %1 = or <4 x i64> %a0, <i64 0, i64 1, i64 2, i64 3>4305 %2 = trunc <4 x i64> %1 to <4 x i32>4306 ret <4 x i32> %24307}4308 4309define <8 x i16> @trunc_or_const_v8i64_v8i16(<8 x i64> %a0) nounwind {4310; SSE-LABEL: trunc_or_const_v8i64_v8i16:4311; SSE: # %bb.0:4312; SSE-NEXT: shufps {{.*#+}} xmm2 = xmm2[0,2],xmm3[0,2]4313; SSE-NEXT: pslld $16, %xmm24314; SSE-NEXT: psrad $16, %xmm24315; SSE-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,2],xmm1[0,2]4316; SSE-NEXT: pslld $16, %xmm04317; SSE-NEXT: psrad $16, %xmm04318; SSE-NEXT: packssdw %xmm2, %xmm04319; SSE-NEXT: por {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm04320; SSE-NEXT: retq4321;4322; AVX1-LABEL: trunc_or_const_v8i64_v8i16:4323; AVX1: # %bb.0:4324; AVX1-NEXT: vbroadcastsd {{.*#+}} ymm2 = [65535,65535,65535,65535]4325; AVX1-NEXT: vandps %ymm2, %ymm1, %ymm14326; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm34327; AVX1-NEXT: vpackusdw %xmm3, %xmm1, %xmm14328; AVX1-NEXT: vandps %ymm2, %ymm0, %ymm04329; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm24330; AVX1-NEXT: vpackusdw %xmm2, %xmm0, %xmm04331; AVX1-NEXT: vpackusdw %xmm1, %xmm0, %xmm04332; AVX1-NEXT: vpor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm04333; AVX1-NEXT: vzeroupper4334; AVX1-NEXT: retq4335;4336; AVX2-LABEL: trunc_or_const_v8i64_v8i16:4337; AVX2: # %bb.0:4338; AVX2-NEXT: vpxor %xmm2, %xmm2, %xmm24339; 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]4340; 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]4341; AVX2-NEXT: vpackusdw %ymm1, %ymm0, %ymm04342; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm14343; AVX2-NEXT: vpackusdw %xmm1, %xmm0, %xmm04344; AVX2-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[0,2,1,3]4345; AVX2-NEXT: vpor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm04346; AVX2-NEXT: vzeroupper4347; AVX2-NEXT: retq4348;4349; AVX512-LABEL: trunc_or_const_v8i64_v8i16:4350; AVX512: # %bb.0:4351; AVX512-NEXT: vpmovqw %zmm0, %xmm04352; AVX512-NEXT: vpor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm04353; AVX512-NEXT: vzeroupper4354; AVX512-NEXT: retq4355 %1 = or <8 x i64> %a0, <i64 0, i64 1, i64 2, i64 3, i64 4, i64 5, i64 6, i64 7>4356 %2 = trunc <8 x i64> %1 to <8 x i16>4357 ret <8 x i16> %24358}4359 4360define <8 x i16> @trunc_or_const_v8i32_v8i16(<8 x i32> %a0) nounwind {4361; SSE-LABEL: trunc_or_const_v8i32_v8i16:4362; SSE: # %bb.0:4363; SSE-NEXT: pslld $16, %xmm14364; SSE-NEXT: psrad $16, %xmm14365; SSE-NEXT: pslld $16, %xmm04366; SSE-NEXT: psrad $16, %xmm04367; SSE-NEXT: packssdw %xmm1, %xmm04368; SSE-NEXT: por {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm04369; SSE-NEXT: retq4370;4371; AVX1-LABEL: trunc_or_const_v8i32_v8i16:4372; AVX1: # %bb.0:4373; AVX1-NEXT: vandps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm04374; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm14375; AVX1-NEXT: vpackusdw %xmm1, %xmm0, %xmm04376; AVX1-NEXT: vpor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm04377; AVX1-NEXT: vzeroupper4378; AVX1-NEXT: retq4379;4380; AVX2-LABEL: trunc_or_const_v8i32_v8i16:4381; AVX2: # %bb.0:4382; 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]4383; AVX2-NEXT: vpermq {{.*#+}} ymm0 = ymm0[0,2,2,3]4384; AVX2-NEXT: vpor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm04385; AVX2-NEXT: vzeroupper4386; AVX2-NEXT: retq4387;4388; AVX512-LABEL: trunc_or_const_v8i32_v8i16:4389; AVX512: # %bb.0:4390; AVX512-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm04391; AVX512-NEXT: vpmovdw %zmm0, %ymm04392; AVX512-NEXT: vpor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm04393; AVX512-NEXT: vzeroupper4394; AVX512-NEXT: retq4395 %1 = or <8 x i32> %a0, <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>4396 %2 = trunc <8 x i32> %1 to <8 x i16>4397 ret <8 x i16> %24398}4399 4400define <16 x i8> @trunc_or_const_v16i64_v16i8(<16 x i64> %a0) nounwind {4401; SSE-LABEL: trunc_or_const_v16i64_v16i8:4402; SSE: # %bb.0:4403; SSE-NEXT: movdqa {{.*#+}} xmm8 = [255,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0]4404; SSE-NEXT: pand %xmm8, %xmm74405; SSE-NEXT: pand %xmm8, %xmm64406; SSE-NEXT: packuswb %xmm7, %xmm64407; SSE-NEXT: pand %xmm8, %xmm54408; SSE-NEXT: pand %xmm8, %xmm44409; SSE-NEXT: packuswb %xmm5, %xmm44410; SSE-NEXT: packuswb %xmm6, %xmm44411; SSE-NEXT: pand %xmm8, %xmm34412; SSE-NEXT: pand %xmm8, %xmm24413; SSE-NEXT: packuswb %xmm3, %xmm24414; SSE-NEXT: pand %xmm8, %xmm14415; SSE-NEXT: pand %xmm8, %xmm04416; SSE-NEXT: packuswb %xmm1, %xmm04417; SSE-NEXT: packuswb %xmm2, %xmm04418; SSE-NEXT: packuswb %xmm4, %xmm04419; SSE-NEXT: por {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm04420; SSE-NEXT: retq4421;4422; AVX1-LABEL: trunc_or_const_v16i64_v16i8:4423; AVX1: # %bb.0:4424; AVX1-NEXT: vbroadcastsd {{.*#+}} ymm4 = [255,255,255,255]4425; AVX1-NEXT: vandps %ymm4, %ymm3, %ymm34426; AVX1-NEXT: vextractf128 $1, %ymm3, %xmm54427; AVX1-NEXT: vpackusdw %xmm5, %xmm3, %xmm34428; AVX1-NEXT: vandps %ymm4, %ymm2, %ymm24429; AVX1-NEXT: vextractf128 $1, %ymm2, %xmm54430; AVX1-NEXT: vpackusdw %xmm5, %xmm2, %xmm24431; AVX1-NEXT: vpackusdw %xmm3, %xmm2, %xmm24432; AVX1-NEXT: vandps %ymm4, %ymm1, %ymm14433; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm34434; AVX1-NEXT: vpackusdw %xmm3, %xmm1, %xmm14435; AVX1-NEXT: vandps %ymm4, %ymm0, %ymm04436; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm34437; AVX1-NEXT: vpackusdw %xmm3, %xmm0, %xmm04438; AVX1-NEXT: vpackusdw %xmm1, %xmm0, %xmm04439; AVX1-NEXT: vpackuswb %xmm2, %xmm0, %xmm04440; AVX1-NEXT: vpor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm04441; AVX1-NEXT: vzeroupper4442; AVX1-NEXT: retq4443;4444; AVX2-LABEL: trunc_or_const_v16i64_v16i8:4445; AVX2: # %bb.0:4446; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm4 = [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]4447; AVX2-NEXT: vpand %ymm4, %ymm3, %ymm34448; AVX2-NEXT: vpand %ymm4, %ymm2, %ymm24449; AVX2-NEXT: vpackusdw %ymm3, %ymm2, %ymm24450; AVX2-NEXT: vpermq {{.*#+}} ymm2 = ymm2[0,2,1,3]4451; AVX2-NEXT: vpand %ymm4, %ymm1, %ymm14452; AVX2-NEXT: vpand %ymm4, %ymm0, %ymm04453; AVX2-NEXT: vpackusdw %ymm1, %ymm0, %ymm04454; AVX2-NEXT: vpermq {{.*#+}} ymm0 = ymm0[0,2,1,3]4455; AVX2-NEXT: vpackusdw %ymm2, %ymm0, %ymm04456; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm14457; AVX2-NEXT: vpackuswb %xmm1, %xmm0, %xmm04458; AVX2-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[0,2,1,3]4459; AVX2-NEXT: vpor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm04460; AVX2-NEXT: vzeroupper4461; AVX2-NEXT: retq4462;4463; AVX512-LABEL: trunc_or_const_v16i64_v16i8:4464; AVX512: # %bb.0:4465; AVX512-NEXT: vpmovqb %zmm1, %xmm14466; AVX512-NEXT: vpmovqb %zmm0, %xmm04467; AVX512-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]4468; AVX512-NEXT: vpor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm04469; AVX512-NEXT: vzeroupper4470; AVX512-NEXT: retq4471 %1 = or <16 x i64> %a0, <i64 0, i64 1, i64 2, i64 3, i64 4, i64 5, i64 6, i64 7, i64 8, i64 9, i64 10, i64 11, i64 12, i64 13, i64 14, i64 15>4472 %2 = trunc <16 x i64> %1 to <16 x i8>4473 ret <16 x i8> %24474}4475 4476define <16 x i8> @trunc_or_const_v16i32_v16i8(<16 x i32> %a0) nounwind {4477; SSE-LABEL: trunc_or_const_v16i32_v16i8:4478; SSE: # %bb.0:4479; SSE-NEXT: movdqa {{.*#+}} xmm4 = [255,0,0,0,255,0,0,0,255,0,0,0,255,0,0,0]4480; SSE-NEXT: pand %xmm4, %xmm34481; SSE-NEXT: pand %xmm4, %xmm24482; SSE-NEXT: packuswb %xmm3, %xmm24483; SSE-NEXT: pand %xmm4, %xmm14484; SSE-NEXT: pand %xmm4, %xmm04485; SSE-NEXT: packuswb %xmm1, %xmm04486; SSE-NEXT: packuswb %xmm2, %xmm04487; SSE-NEXT: por {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm04488; SSE-NEXT: retq4489;4490; AVX1-LABEL: trunc_or_const_v16i32_v16i8:4491; AVX1: # %bb.0:4492; AVX1-NEXT: vbroadcastss {{.*#+}} ymm2 = [255,255,255,255,255,255,255,255]4493; AVX1-NEXT: vandps %ymm2, %ymm1, %ymm14494; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm34495; AVX1-NEXT: vpackusdw %xmm3, %xmm1, %xmm14496; AVX1-NEXT: vandps %ymm2, %ymm0, %ymm04497; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm24498; AVX1-NEXT: vpackusdw %xmm2, %xmm0, %xmm04499; AVX1-NEXT: vpackuswb %xmm1, %xmm0, %xmm04500; AVX1-NEXT: vpor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm04501; AVX1-NEXT: vzeroupper4502; AVX1-NEXT: retq4503;4504; AVX2-LABEL: trunc_or_const_v16i32_v16i8:4505; AVX2: # %bb.0:4506; 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]4507; AVX2-NEXT: vpand %ymm2, %ymm1, %ymm14508; AVX2-NEXT: vpand %ymm2, %ymm0, %ymm04509; AVX2-NEXT: vpackusdw %ymm1, %ymm0, %ymm04510; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm14511; AVX2-NEXT: vpackuswb %xmm1, %xmm0, %xmm04512; AVX2-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[0,2,1,3]4513; AVX2-NEXT: vpor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm04514; AVX2-NEXT: vzeroupper4515; AVX2-NEXT: retq4516;4517; AVX512-LABEL: trunc_or_const_v16i32_v16i8:4518; AVX512: # %bb.0:4519; AVX512-NEXT: vpmovdb %zmm0, %xmm04520; AVX512-NEXT: vpor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm04521; AVX512-NEXT: vzeroupper4522; AVX512-NEXT: retq4523 %1 = or <16 x i32> %a0, <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>4524 %2 = trunc <16 x i32> %1 to <16 x i8>4525 ret <16 x i8> %24526}4527 4528define <16 x i8> @trunc_or_const_v16i16_v16i8(<16 x i16> %a0) nounwind {4529; SSE-LABEL: trunc_or_const_v16i16_v16i8:4530; SSE: # %bb.0:4531; SSE-NEXT: movdqa {{.*#+}} xmm2 = [255,0,255,0,255,0,255,0,255,0,255,0,255,0,255,0]4532; SSE-NEXT: pand %xmm2, %xmm14533; SSE-NEXT: pand %xmm2, %xmm04534; SSE-NEXT: packuswb %xmm1, %xmm04535; SSE-NEXT: por {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm04536; SSE-NEXT: retq4537;4538; AVX1-LABEL: trunc_or_const_v16i16_v16i8:4539; AVX1: # %bb.0:4540; AVX1-NEXT: vandps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm04541; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm14542; AVX1-NEXT: vpackuswb %xmm1, %xmm0, %xmm04543; AVX1-NEXT: vpor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm04544; AVX1-NEXT: vzeroupper4545; AVX1-NEXT: retq4546;4547; AVX2-LABEL: trunc_or_const_v16i16_v16i8:4548; AVX2: # %bb.0:4549; AVX2-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm04550; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm14551; AVX2-NEXT: vpackuswb %xmm1, %xmm0, %xmm04552; AVX2-NEXT: vpor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm04553; AVX2-NEXT: vzeroupper4554; AVX2-NEXT: retq4555;4556; AVX512F-LABEL: trunc_or_const_v16i16_v16i8:4557; AVX512F: # %bb.0:4558; 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],zero4559; AVX512F-NEXT: vpmovdb %zmm0, %xmm04560; AVX512F-NEXT: vpor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm04561; AVX512F-NEXT: vzeroupper4562; AVX512F-NEXT: retq4563;4564; AVX512BW-LABEL: trunc_or_const_v16i16_v16i8:4565; AVX512BW: # %bb.0:4566; AVX512BW-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm04567; AVX512BW-NEXT: vpmovwb %zmm0, %ymm04568; AVX512BW-NEXT: vpor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm04569; AVX512BW-NEXT: vzeroupper4570; AVX512BW-NEXT: retq4571;4572; AVX512DQ-LABEL: trunc_or_const_v16i16_v16i8:4573; AVX512DQ: # %bb.0:4574; AVX512DQ-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],zero4575; AVX512DQ-NEXT: vpmovdb %zmm0, %xmm04576; AVX512DQ-NEXT: vpor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm04577; AVX512DQ-NEXT: vzeroupper4578; AVX512DQ-NEXT: retq4579 %1 = or <16 x i16> %a0, <i16 0, i16 1, i16 2, i16 3, i16 4, i16 5, i16 6, i16 7, i16 8, i16 9, i16 10, i16 11, i16 12, i16 13, i16 14, i16 15>4580 %2 = trunc <16 x i16> %1 to <16 x i8>4581 ret <16 x i8> %24582}4583 4584;4585; complex patterns - often created by vectorizer4586;4587 4588define <4 x i32> @mul_add_const_v4i64_v4i32(<4 x i32> %a0, <4 x i32> %a1) nounwind {4589; SSE-LABEL: mul_add_const_v4i64_v4i32:4590; SSE: # %bb.0:4591; SSE-NEXT: pshufd {{.*#+}} xmm2 = xmm0[0,1,1,3]4592; SSE-NEXT: pshufd {{.*#+}} xmm3 = xmm0[2,1,3,3]4593; SSE-NEXT: pshufd {{.*#+}} xmm0 = xmm1[0,1,1,3]4594; SSE-NEXT: pmuludq %xmm2, %xmm04595; SSE-NEXT: pshufd {{.*#+}} xmm1 = xmm1[2,1,3,3]4596; SSE-NEXT: pmuludq %xmm3, %xmm14597; SSE-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,2],xmm1[0,2]4598; SSE-NEXT: paddd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm04599; SSE-NEXT: retq4600;4601; AVX-LABEL: mul_add_const_v4i64_v4i32:4602; AVX: # %bb.0:4603; AVX-NEXT: vpmulld %xmm1, %xmm0, %xmm04604; AVX-NEXT: vpaddd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm04605; AVX-NEXT: retq4606 %1 = sext <4 x i32> %a0 to <4 x i64>4607 %2 = sext <4 x i32> %a1 to <4 x i64>4608 %3 = mul <4 x i64> %1, %24609 %4 = add <4 x i64> %3, <i64 -3, i64 -1, i64 1, i64 3>4610 %5 = trunc <4 x i64> %4 to <4 x i32>4611 ret <4 x i32> %54612}4613 4614define <4 x i32> @mul_add_self_v4i64_v4i32(<4 x i32> %a0, <4 x i32> %a1) nounwind {4615; SSE-LABEL: mul_add_self_v4i64_v4i32:4616; SSE: # %bb.0:4617; SSE-NEXT: pshufd {{.*#+}} xmm2 = xmm0[0,1,1,3]4618; SSE-NEXT: pshufd {{.*#+}} xmm3 = xmm0[2,1,3,3]4619; SSE-NEXT: pshufd {{.*#+}} xmm0 = xmm1[0,1,1,3]4620; SSE-NEXT: pmuludq %xmm2, %xmm04621; SSE-NEXT: pshufd {{.*#+}} xmm1 = xmm1[2,1,3,3]4622; SSE-NEXT: pmuludq %xmm3, %xmm14623; SSE-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,2],xmm1[0,2]4624; SSE-NEXT: paddd %xmm0, %xmm04625; SSE-NEXT: retq4626;4627; AVX-LABEL: mul_add_self_v4i64_v4i32:4628; AVX: # %bb.0:4629; AVX-NEXT: vpmulld %xmm1, %xmm0, %xmm04630; AVX-NEXT: vpaddd %xmm0, %xmm0, %xmm04631; AVX-NEXT: retq4632 %1 = sext <4 x i32> %a0 to <4 x i64>4633 %2 = sext <4 x i32> %a1 to <4 x i64>4634 %3 = mul <4 x i64> %1, %24635 %4 = add <4 x i64> %3, %34636 %5 = trunc <4 x i64> %4 to <4 x i32>4637 ret <4 x i32> %54638}4639 4640define <4 x i32> @mul_add_multiuse_v4i64_v4i32(<4 x i32> %a0, <4 x i32> %a1) nounwind {4641; SSE-LABEL: mul_add_multiuse_v4i64_v4i32:4642; SSE: # %bb.0:4643; SSE-NEXT: pshufd {{.*#+}} xmm2 = xmm0[0,1,1,3]4644; SSE-NEXT: pshufd {{.*#+}} xmm3 = xmm0[2,1,3,3]4645; SSE-NEXT: pshufd {{.*#+}} xmm4 = xmm1[0,1,1,3]4646; SSE-NEXT: pmuludq %xmm2, %xmm44647; SSE-NEXT: pshufd {{.*#+}} xmm1 = xmm1[2,1,3,3]4648; SSE-NEXT: pmuludq %xmm3, %xmm14649; SSE-NEXT: shufps {{.*#+}} xmm4 = xmm4[0,2],xmm1[0,2]4650; SSE-NEXT: paddd %xmm4, %xmm04651; SSE-NEXT: retq4652;4653; AVX-LABEL: mul_add_multiuse_v4i64_v4i32:4654; AVX: # %bb.0:4655; AVX-NEXT: vpmulld %xmm1, %xmm0, %xmm14656; AVX-NEXT: vpaddd %xmm1, %xmm0, %xmm04657; AVX-NEXT: retq4658 %1 = sext <4 x i32> %a0 to <4 x i64>4659 %2 = sext <4 x i32> %a1 to <4 x i64>4660 %3 = mul <4 x i64> %1, %24661 %4 = add <4 x i64> %1, %34662 %5 = trunc <4 x i64> %4 to <4 x i32>4663 ret <4 x i32> %54664}4665