1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+sse2 | FileCheck %s --check-prefix=ALL --check-prefix=SSE --check-prefix=SSE2 3; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx | FileCheck %s --check-prefix=ALL --check-prefix=AVX --check-prefix=AVX1 4; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx2 | FileCheck %s --check-prefixes=ALL,AVX,AVX2,AVX2-SLOW 5; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx2,+fast-variable-shuffle | FileCheck %s --check-prefixes=ALL,AVX,AVX2,AVX2-FAST 6; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f | FileCheck %s --check-prefix=ALL --check-prefix=AVX --check-prefix=AVX512 --check-prefix=AVX512F 7; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512bw,+fast-variable-shuffle | FileCheck %s --check-prefixes=ALL,AVX,AVX512,AVX512BW 8; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512dq,+fast-variable-shuffle | FileCheck %s --check-prefixes=ALL,AVX,AVX512,AVX512DQ 9 10; 11; add 12; 13 14define <4 x i32> @trunc_add_v4i64_v4i32(<4 x i64> %a0, <4 x i64> %a1) nounwind { 15; SSE-LABEL: trunc_add_v4i64_v4i32: 16; SSE: # %bb.0: 17; SSE-NEXT: paddq %xmm3, %xmm1 18; SSE-NEXT: paddq %xmm2, %xmm0 19; SSE-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,2],xmm1[0,2] 20; SSE-NEXT: retq 21; 22; AVX1-LABEL: trunc_add_v4i64_v4i32: 23; AVX1: # %bb.0: 24; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2 25; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm3 26; AVX1-NEXT: vpaddq %xmm2, %xmm3, %xmm2 27; AVX1-NEXT: vpaddq %xmm1, %xmm0, %xmm0 28; AVX1-NEXT: vshufps {{.*#+}} xmm0 = xmm0[0,2],xmm2[0,2] 29; AVX1-NEXT: vzeroupper 30; AVX1-NEXT: retq 31; 32; AVX2-SLOW-LABEL: trunc_add_v4i64_v4i32: 33; AVX2-SLOW: # %bb.0: 34; AVX2-SLOW-NEXT: vpaddq %ymm1, %ymm0, %ymm0 35; AVX2-SLOW-NEXT: vextracti128 $1, %ymm0, %xmm1 36; AVX2-SLOW-NEXT: vshufps {{.*#+}} xmm0 = xmm0[0,2],xmm1[0,2] 37; AVX2-SLOW-NEXT: vzeroupper 38; AVX2-SLOW-NEXT: retq 39; 40; AVX2-FAST-LABEL: trunc_add_v4i64_v4i32: 41; AVX2-FAST: # %bb.0: 42; AVX2-FAST-NEXT: vpaddq %ymm1, %ymm0, %ymm0 43; AVX2-FAST-NEXT: vmovdqa {{.*#+}} ymm1 = [0,2,4,6,4,6,6,7] 44; AVX2-FAST-NEXT: vpermd %ymm0, %ymm1, %ymm0 45; AVX2-FAST-NEXT: # kill: def $xmm0 killed $xmm0 killed $ymm0 46; AVX2-FAST-NEXT: vzeroupper 47; AVX2-FAST-NEXT: retq 48; 49; AVX512-LABEL: trunc_add_v4i64_v4i32: 50; AVX512: # %bb.0: 51; AVX512-NEXT: vpaddq %ymm1, %ymm0, %ymm0 52; AVX512-NEXT: vpmovqd %zmm0, %ymm0 53; AVX512-NEXT: # kill: def $xmm0 killed $xmm0 killed $ymm0 54; AVX512-NEXT: vzeroupper 55; AVX512-NEXT: retq 56 %1 = add <4 x i64> %a0, %a1 57 %2 = trunc <4 x i64> %1 to <4 x i32> 58 ret <4 x i32> %2 59} 60 61define <8 x i16> @trunc_add_v8i64_v8i16(<8 x i64> %a0, <8 x i64> %a1) nounwind { 62; SSE-LABEL: trunc_add_v8i64_v8i16: 63; SSE: # %bb.0: 64; SSE-NEXT: paddq %xmm6, %xmm2 65; SSE-NEXT: paddq %xmm7, %xmm3 66; SSE-NEXT: paddq %xmm4, %xmm0 67; SSE-NEXT: paddq %xmm5, %xmm1 68; SSE-NEXT: pshufd {{.*#+}} xmm1 = xmm1[0,2,2,3] 69; SSE-NEXT: pshuflw {{.*#+}} xmm1 = xmm1[0,2,2,3,4,5,6,7] 70; SSE-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3] 71; SSE-NEXT: pshuflw {{.*#+}} xmm4 = xmm0[0,2,2,3,4,5,6,7] 72; SSE-NEXT: punpckldq {{.*#+}} xmm4 = xmm4[0],xmm1[0],xmm4[1],xmm1[1] 73; SSE-NEXT: pshufd {{.*#+}} xmm0 = xmm3[0,2,2,3] 74; SSE-NEXT: pshuflw {{.*#+}} xmm1 = xmm0[0,1,0,2,4,5,6,7] 75; SSE-NEXT: pshufd {{.*#+}} xmm0 = xmm2[0,2,2,3] 76; SSE-NEXT: pshuflw {{.*#+}} xmm0 = xmm0[0,1,0,2,4,5,6,7] 77; SSE-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1] 78; SSE-NEXT: movsd {{.*#+}} xmm0 = xmm4[0],xmm0[1] 79; SSE-NEXT: retq 80; 81; AVX1-LABEL: trunc_add_v8i64_v8i16: 82; AVX1: # %bb.0: 83; AVX1-NEXT: vpaddq %xmm2, %xmm0, %xmm4 84; AVX1-NEXT: vextractf128 $1, %ymm2, %xmm2 85; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm0 86; AVX1-NEXT: vpaddq %xmm2, %xmm0, %xmm0 87; AVX1-NEXT: vpaddq %xmm3, %xmm1, %xmm2 88; AVX1-NEXT: vextractf128 $1, %ymm3, %xmm3 89; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm1 90; AVX1-NEXT: vpaddq %xmm3, %xmm1, %xmm1 91; AVX1-NEXT: vpxor %xmm3, %xmm3, %xmm3 92; AVX1-NEXT: vpblendw {{.*#+}} xmm1 = xmm1[0],xmm3[1,2,3],xmm1[4],xmm3[5,6,7] 93; AVX1-NEXT: vpblendw {{.*#+}} xmm2 = xmm2[0],xmm3[1,2,3],xmm2[4],xmm3[5,6,7] 94; AVX1-NEXT: vpackusdw %xmm1, %xmm2, %xmm1 95; AVX1-NEXT: vpblendw {{.*#+}} xmm0 = xmm0[0],xmm3[1,2,3],xmm0[4],xmm3[5,6,7] 96; AVX1-NEXT: vpblendw {{.*#+}} xmm2 = xmm4[0],xmm3[1,2,3],xmm4[4],xmm3[5,6,7] 97; AVX1-NEXT: vpackusdw %xmm0, %xmm2, %xmm0 98; AVX1-NEXT: vpackusdw %xmm1, %xmm0, %xmm0 99; AVX1-NEXT: vzeroupper 100; AVX1-NEXT: retq 101; 102; AVX2-SLOW-LABEL: trunc_add_v8i64_v8i16: 103; AVX2-SLOW: # %bb.0: 104; AVX2-SLOW-NEXT: vpaddq %ymm3, %ymm1, %ymm1 105; AVX2-SLOW-NEXT: vpaddq %ymm2, %ymm0, %ymm0 106; AVX2-SLOW-NEXT: vperm2i128 {{.*#+}} ymm2 = ymm0[2,3],ymm1[2,3] 107; AVX2-SLOW-NEXT: vinserti128 $1, %xmm1, %ymm0, %ymm0 108; AVX2-SLOW-NEXT: vshufps {{.*#+}} ymm0 = ymm0[0,2],ymm2[0,2],ymm0[4,6],ymm2[4,6] 109; AVX2-SLOW-NEXT: vpshufb {{.*#+}} ymm0 = ymm0[0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15,16,17,20,21,24,25,28,29,24,25,28,29,28,29,30,31] 110; AVX2-SLOW-NEXT: vpermq {{.*#+}} ymm0 = ymm0[0,2,2,3] 111; AVX2-SLOW-NEXT: # kill: def $xmm0 killed $xmm0 killed $ymm0 112; AVX2-SLOW-NEXT: vzeroupper 113; AVX2-SLOW-NEXT: retq 114; 115; AVX2-FAST-LABEL: trunc_add_v8i64_v8i16: 116; AVX2-FAST: # %bb.0: 117; AVX2-FAST-NEXT: vpaddq %ymm3, %ymm1, %ymm1 118; AVX2-FAST-NEXT: vpaddq %ymm2, %ymm0, %ymm0 119; AVX2-FAST-NEXT: vmovdqa {{.*#+}} ymm2 = [0,2,4,6,4,6,6,7] 120; AVX2-FAST-NEXT: vpermd %ymm0, %ymm2, %ymm0 121; AVX2-FAST-NEXT: vpermd %ymm1, %ymm2, %ymm1 122; AVX2-FAST-NEXT: vinserti128 $1, %xmm1, %ymm0, %ymm0 123; AVX2-FAST-NEXT: vpshufb {{.*#+}} ymm0 = ymm0[0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15,16,17,20,21,24,25,28,29,24,25,28,29,28,29,30,31] 124; AVX2-FAST-NEXT: vpermq {{.*#+}} ymm0 = ymm0[0,2,2,3] 125; AVX2-FAST-NEXT: # kill: def $xmm0 killed $xmm0 killed $ymm0 126; AVX2-FAST-NEXT: vzeroupper 127; AVX2-FAST-NEXT: retq 128; 129; AVX512-LABEL: trunc_add_v8i64_v8i16: 130; AVX512: # %bb.0: 131; AVX512-NEXT: vpaddq %zmm1, %zmm0, %zmm0 132; AVX512-NEXT: vpmovqw %zmm0, %xmm0 133; AVX512-NEXT: vzeroupper 134; AVX512-NEXT: retq 135 %1 = add <8 x i64> %a0, %a1 136 %2 = trunc <8 x i64> %1 to <8 x i16> 137 ret <8 x i16> %2 138} 139 140define <8 x i16> @trunc_add_v8i32_v8i16(<8 x i32> %a0, <8 x i32> %a1) nounwind { 141; SSE-LABEL: trunc_add_v8i32_v8i16: 142; SSE: # %bb.0: 143; SSE-NEXT: paddd %xmm2, %xmm0 144; SSE-NEXT: paddd %xmm3, %xmm1 145; SSE-NEXT: pslld $16, %xmm1 146; SSE-NEXT: psrad $16, %xmm1 147; SSE-NEXT: pslld $16, %xmm0 148; SSE-NEXT: psrad $16, %xmm0 149; SSE-NEXT: packssdw %xmm1, %xmm0 150; SSE-NEXT: retq 151; 152; AVX1-LABEL: trunc_add_v8i32_v8i16: 153; AVX1: # %bb.0: 154; AVX1-NEXT: vpaddd %xmm1, %xmm0, %xmm2 155; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm1 156; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm0 157; AVX1-NEXT: vpaddd %xmm1, %xmm0, %xmm0 158; AVX1-NEXT: vmovdqa {{.*#+}} xmm1 = [0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15] 159; AVX1-NEXT: vpshufb %xmm1, %xmm0, %xmm0 160; AVX1-NEXT: vpshufb %xmm1, %xmm2, %xmm1 161; AVX1-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm1[0],xmm0[0] 162; AVX1-NEXT: vzeroupper 163; AVX1-NEXT: retq 164; 165; AVX2-LABEL: trunc_add_v8i32_v8i16: 166; AVX2: # %bb.0: 167; AVX2-NEXT: vpaddd %ymm1, %ymm0, %ymm0 168; AVX2-NEXT: vpshufb {{.*#+}} ymm0 = ymm0[0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15,16,17,20,21,24,25,28,29,24,25,28,29,28,29,30,31] 169; AVX2-NEXT: vpermq {{.*#+}} ymm0 = ymm0[0,2,2,3] 170; AVX2-NEXT: # kill: def $xmm0 killed $xmm0 killed $ymm0 171; AVX2-NEXT: vzeroupper 172; AVX2-NEXT: retq 173; 174; AVX512-LABEL: trunc_add_v8i32_v8i16: 175; AVX512: # %bb.0: 176; AVX512-NEXT: vpaddd %ymm1, %ymm0, %ymm0 177; AVX512-NEXT: vpmovdw %zmm0, %ymm0 178; AVX512-NEXT: # kill: def $xmm0 killed $xmm0 killed $ymm0 179; AVX512-NEXT: vzeroupper 180; AVX512-NEXT: retq 181 %1 = add <8 x i32> %a0, %a1 182 %2 = trunc <8 x i32> %1 to <8 x i16> 183 ret <8 x i16> %2 184} 185 186define <16 x i8> @trunc_add_v16i64_v16i8(<16 x i64> %a0, <16 x i64> %a1) nounwind { 187; SSE-LABEL: trunc_add_v16i64_v16i8: 188; SSE: # %bb.0: 189; SSE-NEXT: paddq {{[0-9]+}}(%rsp), %xmm0 190; SSE-NEXT: paddq {{[0-9]+}}(%rsp), %xmm1 191; SSE-NEXT: paddq {{[0-9]+}}(%rsp), %xmm2 192; SSE-NEXT: paddq {{[0-9]+}}(%rsp), %xmm3 193; SSE-NEXT: paddq {{[0-9]+}}(%rsp), %xmm4 194; SSE-NEXT: paddq {{[0-9]+}}(%rsp), %xmm5 195; SSE-NEXT: paddq {{[0-9]+}}(%rsp), %xmm6 196; SSE-NEXT: paddq {{[0-9]+}}(%rsp), %xmm7 197; SSE-NEXT: movdqa {{.*#+}} xmm8 = [255,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0] 198; SSE-NEXT: pand %xmm8, %xmm7 199; SSE-NEXT: pand %xmm8, %xmm6 200; SSE-NEXT: packuswb %xmm7, %xmm6 201; SSE-NEXT: pand %xmm8, %xmm5 202; SSE-NEXT: pand %xmm8, %xmm4 203; SSE-NEXT: packuswb %xmm5, %xmm4 204; SSE-NEXT: packuswb %xmm6, %xmm4 205; SSE-NEXT: pand %xmm8, %xmm3 206; SSE-NEXT: pand %xmm8, %xmm2 207; SSE-NEXT: packuswb %xmm3, %xmm2 208; SSE-NEXT: pand %xmm8, %xmm1 209; SSE-NEXT: pand %xmm8, %xmm0 210; SSE-NEXT: packuswb %xmm1, %xmm0 211; SSE-NEXT: packuswb %xmm2, %xmm0 212; SSE-NEXT: packuswb %xmm4, %xmm0 213; SSE-NEXT: retq 214; 215; AVX1-LABEL: trunc_add_v16i64_v16i8: 216; AVX1: # %bb.0: 217; AVX1-NEXT: vpaddq %xmm4, %xmm0, %xmm8 218; AVX1-NEXT: vextractf128 $1, %ymm4, %xmm4 219; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm0 220; AVX1-NEXT: vpaddq %xmm4, %xmm0, %xmm0 221; AVX1-NEXT: vpaddq %xmm5, %xmm1, %xmm4 222; AVX1-NEXT: vextractf128 $1, %ymm5, %xmm5 223; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm1 224; AVX1-NEXT: vpaddq %xmm5, %xmm1, %xmm1 225; AVX1-NEXT: vpaddq %xmm6, %xmm2, %xmm5 226; AVX1-NEXT: vextractf128 $1, %ymm6, %xmm6 227; AVX1-NEXT: vextractf128 $1, %ymm2, %xmm2 228; AVX1-NEXT: vpaddq %xmm6, %xmm2, %xmm2 229; AVX1-NEXT: vpaddq %xmm7, %xmm3, %xmm6 230; AVX1-NEXT: vextractf128 $1, %ymm7, %xmm7 231; AVX1-NEXT: vextractf128 $1, %ymm3, %xmm3 232; AVX1-NEXT: vpaddq %xmm7, %xmm3, %xmm3 233; AVX1-NEXT: vmovdqa {{.*#+}} xmm7 = [255,255] 234; AVX1-NEXT: vpand %xmm7, %xmm3, %xmm3 235; AVX1-NEXT: vpand %xmm7, %xmm6, %xmm6 236; AVX1-NEXT: vpackusdw %xmm3, %xmm6, %xmm3 237; AVX1-NEXT: vpand %xmm7, %xmm2, %xmm2 238; AVX1-NEXT: vpand %xmm7, %xmm5, %xmm5 239; AVX1-NEXT: vpackusdw %xmm2, %xmm5, %xmm2 240; AVX1-NEXT: vpackusdw %xmm3, %xmm2, %xmm2 241; AVX1-NEXT: vpand %xmm7, %xmm1, %xmm1 242; AVX1-NEXT: vpand %xmm7, %xmm4, %xmm3 243; AVX1-NEXT: vpackusdw %xmm1, %xmm3, %xmm1 244; AVX1-NEXT: vpand %xmm7, %xmm0, %xmm0 245; AVX1-NEXT: vpand %xmm7, %xmm8, %xmm3 246; AVX1-NEXT: vpackusdw %xmm0, %xmm3, %xmm0 247; AVX1-NEXT: vpackusdw %xmm1, %xmm0, %xmm0 248; AVX1-NEXT: vpackuswb %xmm2, %xmm0, %xmm0 249; AVX1-NEXT: vzeroupper 250; AVX1-NEXT: retq 251; 252; AVX2-SLOW-LABEL: trunc_add_v16i64_v16i8: 253; AVX2-SLOW: # %bb.0: 254; AVX2-SLOW-NEXT: vpaddq %ymm5, %ymm1, %ymm1 255; AVX2-SLOW-NEXT: vpaddq %ymm4, %ymm0, %ymm0 256; AVX2-SLOW-NEXT: vpaddq %ymm7, %ymm3, %ymm3 257; AVX2-SLOW-NEXT: vpaddq %ymm6, %ymm2, %ymm2 258; AVX2-SLOW-NEXT: vperm2i128 {{.*#+}} ymm4 = ymm2[2,3],ymm3[2,3] 259; AVX2-SLOW-NEXT: vinserti128 $1, %xmm3, %ymm2, %ymm2 260; AVX2-SLOW-NEXT: vshufps {{.*#+}} ymm2 = ymm2[0,2],ymm4[0,2],ymm2[4,6],ymm4[4,6] 261; AVX2-SLOW-NEXT: vmovdqa {{.*#+}} ymm3 = [0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15,16,17,20,21,24,25,28,29,24,25,28,29,28,29,30,31] 262; AVX2-SLOW-NEXT: vpshufb %ymm3, %ymm2, %ymm2 263; AVX2-SLOW-NEXT: vpermq {{.*#+}} ymm2 = ymm2[0,2,2,3] 264; AVX2-SLOW-NEXT: vmovdqa {{.*#+}} xmm4 = [255,255,255,255,255,255,255,255] 265; AVX2-SLOW-NEXT: vpand %xmm4, %xmm2, %xmm2 266; AVX2-SLOW-NEXT: vperm2i128 {{.*#+}} ymm5 = ymm0[2,3],ymm1[2,3] 267; AVX2-SLOW-NEXT: vinserti128 $1, %xmm1, %ymm0, %ymm0 268; AVX2-SLOW-NEXT: vshufps {{.*#+}} ymm0 = ymm0[0,2],ymm5[0,2],ymm0[4,6],ymm5[4,6] 269; AVX2-SLOW-NEXT: vpshufb %ymm3, %ymm0, %ymm0 270; AVX2-SLOW-NEXT: vpermq {{.*#+}} ymm0 = ymm0[0,2,2,3] 271; AVX2-SLOW-NEXT: vpand %xmm4, %xmm0, %xmm0 272; AVX2-SLOW-NEXT: vpackuswb %xmm2, %xmm0, %xmm0 273; AVX2-SLOW-NEXT: vzeroupper 274; AVX2-SLOW-NEXT: retq 275; 276; AVX2-FAST-LABEL: trunc_add_v16i64_v16i8: 277; AVX2-FAST: # %bb.0: 278; AVX2-FAST-NEXT: vpaddq %ymm5, %ymm1, %ymm1 279; AVX2-FAST-NEXT: vpaddq %ymm4, %ymm0, %ymm0 280; AVX2-FAST-NEXT: vpaddq %ymm7, %ymm3, %ymm3 281; AVX2-FAST-NEXT: vpaddq %ymm6, %ymm2, %ymm2 282; AVX2-FAST-NEXT: vmovdqa {{.*#+}} ymm4 = [0,2,4,6,4,6,6,7] 283; AVX2-FAST-NEXT: vpermd %ymm2, %ymm4, %ymm2 284; AVX2-FAST-NEXT: vpermd %ymm3, %ymm4, %ymm3 285; AVX2-FAST-NEXT: vinserti128 $1, %xmm3, %ymm2, %ymm2 286; AVX2-FAST-NEXT: vmovdqa {{.*#+}} ymm3 = [0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15,16,17,20,21,24,25,28,29,24,25,28,29,28,29,30,31] 287; AVX2-FAST-NEXT: vpshufb %ymm3, %ymm2, %ymm2 288; AVX2-FAST-NEXT: vpermq {{.*#+}} ymm2 = ymm2[0,2,2,3] 289; AVX2-FAST-NEXT: vmovdqa {{.*#+}} xmm5 = [255,255,255,255,255,255,255,255] 290; AVX2-FAST-NEXT: vpand %xmm5, %xmm2, %xmm2 291; AVX2-FAST-NEXT: vpermd %ymm0, %ymm4, %ymm0 292; AVX2-FAST-NEXT: vpermd %ymm1, %ymm4, %ymm1 293; AVX2-FAST-NEXT: vinserti128 $1, %xmm1, %ymm0, %ymm0 294; AVX2-FAST-NEXT: vpshufb %ymm3, %ymm0, %ymm0 295; AVX2-FAST-NEXT: vpermq {{.*#+}} ymm0 = ymm0[0,2,2,3] 296; AVX2-FAST-NEXT: vpand %xmm5, %xmm0, %xmm0 297; AVX2-FAST-NEXT: vpackuswb %xmm2, %xmm0, %xmm0 298; AVX2-FAST-NEXT: vzeroupper 299; AVX2-FAST-NEXT: retq 300; 301; AVX512-LABEL: trunc_add_v16i64_v16i8: 302; AVX512: # %bb.0: 303; AVX512-NEXT: vpaddq %zmm3, %zmm1, %zmm1 304; AVX512-NEXT: vpaddq %zmm2, %zmm0, %zmm0 305; AVX512-NEXT: vpmovqd %zmm0, %ymm0 306; AVX512-NEXT: vpmovqd %zmm1, %ymm1 307; AVX512-NEXT: vinserti64x4 $1, %ymm1, %zmm0, %zmm0 308; AVX512-NEXT: vpmovdb %zmm0, %xmm0 309; AVX512-NEXT: vzeroupper 310; AVX512-NEXT: retq 311 %1 = add <16 x i64> %a0, %a1 312 %2 = trunc <16 x i64> %1 to <16 x i8> 313 ret <16 x i8> %2 314} 315 316define <16 x i8> @trunc_add_v16i32_v16i8(<16 x i32> %a0, <16 x i32> %a1) nounwind { 317; SSE-LABEL: trunc_add_v16i32_v16i8: 318; SSE: # %bb.0: 319; SSE-NEXT: paddd %xmm4, %xmm0 320; SSE-NEXT: paddd %xmm5, %xmm1 321; SSE-NEXT: paddd %xmm6, %xmm2 322; SSE-NEXT: paddd %xmm7, %xmm3 323; SSE-NEXT: movdqa {{.*#+}} xmm4 = [255,0,0,0,255,0,0,0,255,0,0,0,255,0,0,0] 324; SSE-NEXT: pand %xmm4, %xmm3 325; SSE-NEXT: pand %xmm4, %xmm2 326; SSE-NEXT: packuswb %xmm3, %xmm2 327; SSE-NEXT: pand %xmm4, %xmm1 328; SSE-NEXT: pand %xmm4, %xmm0 329; SSE-NEXT: packuswb %xmm1, %xmm0 330; SSE-NEXT: packuswb %xmm2, %xmm0 331; SSE-NEXT: retq 332; 333; AVX1-LABEL: trunc_add_v16i32_v16i8: 334; AVX1: # %bb.0: 335; AVX1-NEXT: vpaddd %xmm2, %xmm0, %xmm4 336; AVX1-NEXT: vextractf128 $1, %ymm2, %xmm2 337; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm0 338; AVX1-NEXT: vpaddd %xmm2, %xmm0, %xmm0 339; AVX1-NEXT: vpaddd %xmm3, %xmm1, %xmm2 340; AVX1-NEXT: vextractf128 $1, %ymm3, %xmm3 341; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm1 342; AVX1-NEXT: vpaddd %xmm3, %xmm1, %xmm1 343; AVX1-NEXT: vmovdqa {{.*#+}} xmm3 = [255,255,255,255] 344; AVX1-NEXT: vpand %xmm3, %xmm1, %xmm1 345; AVX1-NEXT: vpand %xmm3, %xmm2, %xmm2 346; AVX1-NEXT: vpackusdw %xmm1, %xmm2, %xmm1 347; AVX1-NEXT: vpand %xmm3, %xmm0, %xmm0 348; AVX1-NEXT: vpand %xmm3, %xmm4, %xmm2 349; AVX1-NEXT: vpackusdw %xmm0, %xmm2, %xmm0 350; AVX1-NEXT: vpackuswb %xmm1, %xmm0, %xmm0 351; AVX1-NEXT: vzeroupper 352; AVX1-NEXT: retq 353; 354; AVX2-LABEL: trunc_add_v16i32_v16i8: 355; AVX2: # %bb.0: 356; AVX2-NEXT: vpaddd %ymm2, %ymm0, %ymm0 357; AVX2-NEXT: vpaddd %ymm3, %ymm1, %ymm1 358; AVX2-NEXT: vmovdqa {{.*#+}} ymm2 = [0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15,16,17,20,21,24,25,28,29,24,25,28,29,28,29,30,31] 359; AVX2-NEXT: vpshufb %ymm2, %ymm1, %ymm1 360; AVX2-NEXT: vpermq {{.*#+}} ymm1 = ymm1[0,2,2,3] 361; AVX2-NEXT: vmovdqa {{.*#+}} xmm3 = [255,255,255,255,255,255,255,255] 362; AVX2-NEXT: vpand %xmm3, %xmm1, %xmm1 363; AVX2-NEXT: vpshufb %ymm2, %ymm0, %ymm0 364; AVX2-NEXT: vpermq {{.*#+}} ymm0 = ymm0[0,2,2,3] 365; AVX2-NEXT: vpand %xmm3, %xmm0, %xmm0 366; AVX2-NEXT: vpackuswb %xmm1, %xmm0, %xmm0 367; AVX2-NEXT: vzeroupper 368; AVX2-NEXT: retq 369; 370; AVX512-LABEL: trunc_add_v16i32_v16i8: 371; AVX512: # %bb.0: 372; AVX512-NEXT: vpaddd %zmm1, %zmm0, %zmm0 373; AVX512-NEXT: vpmovdb %zmm0, %xmm0 374; AVX512-NEXT: vzeroupper 375; AVX512-NEXT: retq 376 %1 = add <16 x i32> %a0, %a1 377 %2 = trunc <16 x i32> %1 to <16 x i8> 378 ret <16 x i8> %2 379} 380 381define <16 x i8> @trunc_add_v16i16_v16i8(<16 x i16> %a0, <16 x i16> %a1) nounwind { 382; SSE-LABEL: trunc_add_v16i16_v16i8: 383; SSE: # %bb.0: 384; SSE-NEXT: paddw %xmm2, %xmm0 385; SSE-NEXT: paddw %xmm3, %xmm1 386; SSE-NEXT: movdqa {{.*#+}} xmm2 = [255,255,255,255,255,255,255,255] 387; SSE-NEXT: pand %xmm2, %xmm1 388; SSE-NEXT: pand %xmm2, %xmm0 389; SSE-NEXT: packuswb %xmm1, %xmm0 390; SSE-NEXT: retq 391; 392; AVX1-LABEL: trunc_add_v16i16_v16i8: 393; AVX1: # %bb.0: 394; AVX1-NEXT: vpaddw %xmm1, %xmm0, %xmm2 395; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm1 396; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm0 397; AVX1-NEXT: vpaddw %xmm1, %xmm0, %xmm0 398; AVX1-NEXT: vmovdqa {{.*#+}} xmm1 = [255,255,255,255,255,255,255,255] 399; AVX1-NEXT: vpand %xmm1, %xmm0, %xmm0 400; AVX1-NEXT: vpand %xmm1, %xmm2, %xmm1 401; AVX1-NEXT: vpackuswb %xmm0, %xmm1, %xmm0 402; AVX1-NEXT: vzeroupper 403; AVX1-NEXT: retq 404; 405; AVX2-LABEL: trunc_add_v16i16_v16i8: 406; AVX2: # %bb.0: 407; AVX2-NEXT: vpaddw %ymm1, %ymm0, %ymm0 408; AVX2-NEXT: vpand {{.*}}(%rip), %ymm0, %ymm0 409; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1 410; AVX2-NEXT: vpackuswb %xmm1, %xmm0, %xmm0 411; AVX2-NEXT: vzeroupper 412; AVX2-NEXT: retq 413; 414; AVX512F-LABEL: trunc_add_v16i16_v16i8: 415; AVX512F: # %bb.0: 416; AVX512F-NEXT: vpaddw %ymm1, %ymm0, %ymm0 417; 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],zero 418; AVX512F-NEXT: vpmovdb %zmm0, %xmm0 419; AVX512F-NEXT: vzeroupper 420; AVX512F-NEXT: retq 421; 422; AVX512BW-LABEL: trunc_add_v16i16_v16i8: 423; AVX512BW: # %bb.0: 424; AVX512BW-NEXT: vpaddw %ymm1, %ymm0, %ymm0 425; AVX512BW-NEXT: vpmovwb %zmm0, %ymm0 426; AVX512BW-NEXT: # kill: def $xmm0 killed $xmm0 killed $ymm0 427; AVX512BW-NEXT: vzeroupper 428; AVX512BW-NEXT: retq 429; 430; AVX512DQ-LABEL: trunc_add_v16i16_v16i8: 431; AVX512DQ: # %bb.0: 432; AVX512DQ-NEXT: vpaddw %ymm1, %ymm0, %ymm0 433; 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],zero 434; AVX512DQ-NEXT: vpmovdb %zmm0, %xmm0 435; AVX512DQ-NEXT: vzeroupper 436; AVX512DQ-NEXT: retq 437 %1 = add <16 x i16> %a0, %a1 438 %2 = trunc <16 x i16> %1 to <16 x i8> 439 ret <16 x i8> %2 440} 441 442define <8 x i16> @trunc_add_v8i32_v8i16_sext_8i8(<16 x i8> %a0, <8 x i32> %a1) { 443; SSE-LABEL: trunc_add_v8i32_v8i16_sext_8i8: 444; SSE: # %bb.0: 445; SSE-NEXT: pslld $16, %xmm2 446; SSE-NEXT: psrad $16, %xmm2 447; SSE-NEXT: pslld $16, %xmm1 448; SSE-NEXT: psrad $16, %xmm1 449; SSE-NEXT: packssdw %xmm2, %xmm1 450; SSE-NEXT: punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7] 451; SSE-NEXT: psraw $8, %xmm0 452; SSE-NEXT: paddw %xmm1, %xmm0 453; SSE-NEXT: retq 454; 455; AVX1-LABEL: trunc_add_v8i32_v8i16_sext_8i8: 456; AVX1: # %bb.0: 457; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2 458; AVX1-NEXT: vmovdqa {{.*#+}} xmm3 = [0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15] 459; AVX1-NEXT: vpshufb %xmm3, %xmm2, %xmm2 460; AVX1-NEXT: vpshufb %xmm3, %xmm1, %xmm1 461; AVX1-NEXT: vpunpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm2[0] 462; AVX1-NEXT: vpmovsxbw %xmm0, %xmm0 463; AVX1-NEXT: vpaddw %xmm1, %xmm0, %xmm0 464; AVX1-NEXT: vzeroupper 465; AVX1-NEXT: retq 466; 467; AVX2-LABEL: trunc_add_v8i32_v8i16_sext_8i8: 468; AVX2: # %bb.0: 469; AVX2-NEXT: vpmovsxbw %xmm0, %xmm0 470; AVX2-NEXT: vpshufb {{.*#+}} ymm1 = ymm1[0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15,16,17,20,21,24,25,28,29,24,25,28,29,28,29,30,31] 471; AVX2-NEXT: vpermq {{.*#+}} ymm1 = ymm1[0,2,2,3] 472; AVX2-NEXT: vpaddw %xmm1, %xmm0, %xmm0 473; AVX2-NEXT: vzeroupper 474; AVX2-NEXT: retq 475; 476; AVX512-LABEL: trunc_add_v8i32_v8i16_sext_8i8: 477; AVX512: # %bb.0: 478; AVX512-NEXT: # kill: def $ymm1 killed $ymm1 def $zmm1 479; AVX512-NEXT: vpmovdw %zmm1, %ymm1 480; AVX512-NEXT: vpmovsxbw %xmm0, %xmm0 481; AVX512-NEXT: vpaddw %xmm1, %xmm0, %xmm0 482; AVX512-NEXT: vzeroupper 483; AVX512-NEXT: retq 484 %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> 485 %2 = sext <8 x i8> %1 to <8 x i32> 486 %3 = add <8 x i32> %2, %a1 487 %4 = trunc <8 x i32> %3 to <8 x i16> 488 ret <8 x i16> %4 489} 490 491; 492; add to constant 493; 494 495define <4 x i32> @trunc_add_const_v4i64_v4i32(<4 x i64> %a0) nounwind { 496; SSE-LABEL: trunc_add_const_v4i64_v4i32: 497; SSE: # %bb.0: 498; SSE-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,2],xmm1[0,2] 499; SSE-NEXT: paddd {{.*}}(%rip), %xmm0 500; SSE-NEXT: retq 501; 502; AVX1-LABEL: trunc_add_const_v4i64_v4i32: 503; AVX1: # %bb.0: 504; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1 505; AVX1-NEXT: vshufps {{.*#+}} xmm0 = xmm0[0,2],xmm1[0,2] 506; AVX1-NEXT: vpaddd {{.*}}(%rip), %xmm0, %xmm0 507; AVX1-NEXT: vzeroupper 508; AVX1-NEXT: retq 509; 510; AVX2-SLOW-LABEL: trunc_add_const_v4i64_v4i32: 511; AVX2-SLOW: # %bb.0: 512; AVX2-SLOW-NEXT: vextractf128 $1, %ymm0, %xmm1 513; AVX2-SLOW-NEXT: vshufps {{.*#+}} xmm0 = xmm0[0,2],xmm1[0,2] 514; AVX2-SLOW-NEXT: vpaddd {{.*}}(%rip), %xmm0, %xmm0 515; AVX2-SLOW-NEXT: vzeroupper 516; AVX2-SLOW-NEXT: retq 517; 518; AVX2-FAST-LABEL: trunc_add_const_v4i64_v4i32: 519; AVX2-FAST: # %bb.0: 520; AVX2-FAST-NEXT: vmovdqa {{.*#+}} ymm1 = [0,2,4,6,4,6,6,7] 521; AVX2-FAST-NEXT: vpermd %ymm0, %ymm1, %ymm0 522; AVX2-FAST-NEXT: vpaddd {{.*}}(%rip), %xmm0, %xmm0 523; AVX2-FAST-NEXT: vzeroupper 524; AVX2-FAST-NEXT: retq 525; 526; AVX512-LABEL: trunc_add_const_v4i64_v4i32: 527; AVX512: # %bb.0: 528; AVX512-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm0 529; AVX512-NEXT: vpmovqd %zmm0, %ymm0 530; AVX512-NEXT: vpaddd {{.*}}(%rip), %xmm0, %xmm0 531; AVX512-NEXT: vzeroupper 532; AVX512-NEXT: retq 533 %1 = add <4 x i64> %a0, <i64 0, i64 1, i64 2, i64 3> 534 %2 = trunc <4 x i64> %1 to <4 x i32> 535 ret <4 x i32> %2 536} 537 538define <8 x i16> @trunc_add_const_v8i64_v8i16(<8 x i64> %a0) nounwind { 539; SSE-LABEL: trunc_add_const_v8i64_v8i16: 540; SSE: # %bb.0: 541; SSE-NEXT: pshufd {{.*#+}} xmm1 = xmm1[0,2,2,3] 542; SSE-NEXT: pshuflw {{.*#+}} xmm1 = xmm1[0,2,2,3,4,5,6,7] 543; SSE-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3] 544; SSE-NEXT: pshuflw {{.*#+}} xmm4 = xmm0[0,2,2,3,4,5,6,7] 545; SSE-NEXT: punpckldq {{.*#+}} xmm4 = xmm4[0],xmm1[0],xmm4[1],xmm1[1] 546; SSE-NEXT: pshufd {{.*#+}} xmm0 = xmm3[0,2,2,3] 547; SSE-NEXT: pshuflw {{.*#+}} xmm1 = xmm0[0,1,0,2,4,5,6,7] 548; SSE-NEXT: pshufd {{.*#+}} xmm0 = xmm2[0,2,2,3] 549; SSE-NEXT: pshuflw {{.*#+}} xmm0 = xmm0[0,1,0,2,4,5,6,7] 550; SSE-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1] 551; SSE-NEXT: movsd {{.*#+}} xmm0 = xmm4[0],xmm0[1] 552; SSE-NEXT: paddw {{.*}}(%rip), %xmm0 553; SSE-NEXT: retq 554; 555; AVX1-LABEL: trunc_add_const_v8i64_v8i16: 556; AVX1: # %bb.0: 557; AVX1-NEXT: vmovaps {{.*#+}} ymm2 = [65535,65535,65535,65535] 558; AVX1-NEXT: vandps %ymm2, %ymm1, %ymm1 559; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm3 560; AVX1-NEXT: vpackusdw %xmm3, %xmm1, %xmm1 561; AVX1-NEXT: vandps %ymm2, %ymm0, %ymm0 562; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2 563; AVX1-NEXT: vpackusdw %xmm2, %xmm0, %xmm0 564; AVX1-NEXT: vpackusdw %xmm1, %xmm0, %xmm0 565; AVX1-NEXT: vpaddw {{.*}}(%rip), %xmm0, %xmm0 566; AVX1-NEXT: vzeroupper 567; AVX1-NEXT: retq 568; 569; AVX2-SLOW-LABEL: trunc_add_const_v8i64_v8i16: 570; AVX2-SLOW: # %bb.0: 571; AVX2-SLOW-NEXT: vperm2f128 {{.*#+}} ymm2 = ymm0[2,3],ymm1[2,3] 572; AVX2-SLOW-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0 573; AVX2-SLOW-NEXT: vshufps {{.*#+}} ymm0 = ymm0[0,2],ymm2[0,2],ymm0[4,6],ymm2[4,6] 574; AVX2-SLOW-NEXT: vpshufb {{.*#+}} ymm0 = ymm0[0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15,16,17,20,21,24,25,28,29,24,25,28,29,28,29,30,31] 575; AVX2-SLOW-NEXT: vpermq {{.*#+}} ymm0 = ymm0[0,2,2,3] 576; AVX2-SLOW-NEXT: vpaddw {{.*}}(%rip), %xmm0, %xmm0 577; AVX2-SLOW-NEXT: vzeroupper 578; AVX2-SLOW-NEXT: retq 579; 580; AVX2-FAST-LABEL: trunc_add_const_v8i64_v8i16: 581; AVX2-FAST: # %bb.0: 582; AVX2-FAST-NEXT: vmovdqa {{.*#+}} ymm2 = [0,2,4,6,4,6,6,7] 583; AVX2-FAST-NEXT: vpermd %ymm0, %ymm2, %ymm0 584; AVX2-FAST-NEXT: vpermd %ymm1, %ymm2, %ymm1 585; AVX2-FAST-NEXT: vinserti128 $1, %xmm1, %ymm0, %ymm0 586; AVX2-FAST-NEXT: vpshufb {{.*#+}} ymm0 = ymm0[0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15,16,17,20,21,24,25,28,29,24,25,28,29,28,29,30,31] 587; AVX2-FAST-NEXT: vpermq {{.*#+}} ymm0 = ymm0[0,2,2,3] 588; AVX2-FAST-NEXT: vpaddw {{.*}}(%rip), %xmm0, %xmm0 589; AVX2-FAST-NEXT: vzeroupper 590; AVX2-FAST-NEXT: retq 591; 592; AVX512-LABEL: trunc_add_const_v8i64_v8i16: 593; AVX512: # %bb.0: 594; AVX512-NEXT: vpmovqw %zmm0, %xmm0 595; AVX512-NEXT: vpaddw {{.*}}(%rip), %xmm0, %xmm0 596; AVX512-NEXT: vzeroupper 597; AVX512-NEXT: retq 598 %1 = add <8 x i64> %a0, <i64 0, i64 1, i64 2, i64 3, i64 4, i64 5, i64 6, i64 7> 599 %2 = trunc <8 x i64> %1 to <8 x i16> 600 ret <8 x i16> %2 601} 602 603define <8 x i16> @trunc_add_const_v8i32_v8i16(<8 x i32> %a0) nounwind { 604; SSE-LABEL: trunc_add_const_v8i32_v8i16: 605; SSE: # %bb.0: 606; SSE-NEXT: pslld $16, %xmm1 607; SSE-NEXT: psrad $16, %xmm1 608; SSE-NEXT: pslld $16, %xmm0 609; SSE-NEXT: psrad $16, %xmm0 610; SSE-NEXT: packssdw %xmm1, %xmm0 611; SSE-NEXT: paddw {{.*}}(%rip), %xmm0 612; SSE-NEXT: retq 613; 614; AVX1-LABEL: trunc_add_const_v8i32_v8i16: 615; AVX1: # %bb.0: 616; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1 617; AVX1-NEXT: vmovdqa {{.*#+}} xmm2 = [0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15] 618; AVX1-NEXT: vpshufb %xmm2, %xmm1, %xmm1 619; AVX1-NEXT: vpshufb %xmm2, %xmm0, %xmm0 620; AVX1-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0] 621; AVX1-NEXT: vpaddw {{.*}}(%rip), %xmm0, %xmm0 622; AVX1-NEXT: vzeroupper 623; AVX1-NEXT: retq 624; 625; AVX2-LABEL: trunc_add_const_v8i32_v8i16: 626; AVX2: # %bb.0: 627; AVX2-NEXT: vpshufb {{.*#+}} ymm0 = ymm0[0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15,16,17,20,21,24,25,28,29,24,25,28,29,28,29,30,31] 628; AVX2-NEXT: vpermq {{.*#+}} ymm0 = ymm0[0,2,2,3] 629; AVX2-NEXT: vpaddw {{.*}}(%rip), %xmm0, %xmm0 630; AVX2-NEXT: vzeroupper 631; AVX2-NEXT: retq 632; 633; AVX512-LABEL: trunc_add_const_v8i32_v8i16: 634; AVX512: # %bb.0: 635; AVX512-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm0 636; AVX512-NEXT: vpmovdw %zmm0, %ymm0 637; AVX512-NEXT: vpaddw {{.*}}(%rip), %xmm0, %xmm0 638; AVX512-NEXT: vzeroupper 639; AVX512-NEXT: retq 640 %1 = add <8 x i32> %a0, <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7> 641 %2 = trunc <8 x i32> %1 to <8 x i16> 642 ret <8 x i16> %2 643} 644 645define <16 x i8> @trunc_add_const_v16i64_v16i8(<16 x i64> %a0) nounwind { 646; SSE-LABEL: trunc_add_const_v16i64_v16i8: 647; SSE: # %bb.0: 648; SSE-NEXT: movdqa {{.*#+}} xmm8 = [255,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0] 649; SSE-NEXT: pand %xmm8, %xmm7 650; SSE-NEXT: pand %xmm8, %xmm6 651; SSE-NEXT: packuswb %xmm7, %xmm6 652; SSE-NEXT: pand %xmm8, %xmm5 653; SSE-NEXT: pand %xmm8, %xmm4 654; SSE-NEXT: packuswb %xmm5, %xmm4 655; SSE-NEXT: packuswb %xmm6, %xmm4 656; SSE-NEXT: pand %xmm8, %xmm3 657; SSE-NEXT: pand %xmm8, %xmm2 658; SSE-NEXT: packuswb %xmm3, %xmm2 659; SSE-NEXT: pand %xmm8, %xmm1 660; SSE-NEXT: pand %xmm8, %xmm0 661; SSE-NEXT: packuswb %xmm1, %xmm0 662; SSE-NEXT: packuswb %xmm2, %xmm0 663; SSE-NEXT: packuswb %xmm4, %xmm0 664; SSE-NEXT: paddb {{.*}}(%rip), %xmm0 665; SSE-NEXT: retq 666; 667; AVX1-LABEL: trunc_add_const_v16i64_v16i8: 668; AVX1: # %bb.0: 669; AVX1-NEXT: vmovaps {{.*#+}} ymm4 = [255,255,255,255] 670; AVX1-NEXT: vandps %ymm4, %ymm3, %ymm3 671; AVX1-NEXT: vextractf128 $1, %ymm3, %xmm5 672; AVX1-NEXT: vpackusdw %xmm5, %xmm3, %xmm3 673; AVX1-NEXT: vandps %ymm4, %ymm2, %ymm2 674; AVX1-NEXT: vextractf128 $1, %ymm2, %xmm5 675; AVX1-NEXT: vpackusdw %xmm5, %xmm2, %xmm2 676; AVX1-NEXT: vpackusdw %xmm3, %xmm2, %xmm2 677; AVX1-NEXT: vandps %ymm4, %ymm1, %ymm1 678; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm3 679; AVX1-NEXT: vpackusdw %xmm3, %xmm1, %xmm1 680; AVX1-NEXT: vandps %ymm4, %ymm0, %ymm0 681; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm3 682; AVX1-NEXT: vpackusdw %xmm3, %xmm0, %xmm0 683; AVX1-NEXT: vpackusdw %xmm1, %xmm0, %xmm0 684; AVX1-NEXT: vpackuswb %xmm2, %xmm0, %xmm0 685; AVX1-NEXT: vpaddb {{.*}}(%rip), %xmm0, %xmm0 686; AVX1-NEXT: vzeroupper 687; AVX1-NEXT: retq 688; 689; AVX2-SLOW-LABEL: trunc_add_const_v16i64_v16i8: 690; AVX2-SLOW: # %bb.0: 691; AVX2-SLOW-NEXT: vperm2f128 {{.*#+}} ymm4 = ymm2[2,3],ymm3[2,3] 692; AVX2-SLOW-NEXT: vinsertf128 $1, %xmm3, %ymm2, %ymm2 693; AVX2-SLOW-NEXT: vshufps {{.*#+}} ymm2 = ymm2[0,2],ymm4[0,2],ymm2[4,6],ymm4[4,6] 694; AVX2-SLOW-NEXT: vmovdqa {{.*#+}} ymm3 = [0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15,16,17,20,21,24,25,28,29,24,25,28,29,28,29,30,31] 695; AVX2-SLOW-NEXT: vpshufb %ymm3, %ymm2, %ymm2 696; AVX2-SLOW-NEXT: vpermq {{.*#+}} ymm2 = ymm2[0,2,2,3] 697; AVX2-SLOW-NEXT: vmovdqa {{.*#+}} xmm4 = [255,255,255,255,255,255,255,255] 698; AVX2-SLOW-NEXT: vpand %xmm4, %xmm2, %xmm2 699; AVX2-SLOW-NEXT: vperm2f128 {{.*#+}} ymm5 = ymm0[2,3],ymm1[2,3] 700; AVX2-SLOW-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0 701; AVX2-SLOW-NEXT: vshufps {{.*#+}} ymm0 = ymm0[0,2],ymm5[0,2],ymm0[4,6],ymm5[4,6] 702; AVX2-SLOW-NEXT: vpshufb %ymm3, %ymm0, %ymm0 703; AVX2-SLOW-NEXT: vpermq {{.*#+}} ymm0 = ymm0[0,2,2,3] 704; AVX2-SLOW-NEXT: vpand %xmm4, %xmm0, %xmm0 705; AVX2-SLOW-NEXT: vpackuswb %xmm2, %xmm0, %xmm0 706; AVX2-SLOW-NEXT: vpaddb {{.*}}(%rip), %xmm0, %xmm0 707; AVX2-SLOW-NEXT: vzeroupper 708; AVX2-SLOW-NEXT: retq 709; 710; AVX2-FAST-LABEL: trunc_add_const_v16i64_v16i8: 711; AVX2-FAST: # %bb.0: 712; AVX2-FAST-NEXT: vmovdqa {{.*#+}} ymm4 = [0,2,4,6,4,6,6,7] 713; AVX2-FAST-NEXT: vpermd %ymm2, %ymm4, %ymm2 714; AVX2-FAST-NEXT: vpermd %ymm3, %ymm4, %ymm3 715; AVX2-FAST-NEXT: vinserti128 $1, %xmm3, %ymm2, %ymm2 716; AVX2-FAST-NEXT: vmovdqa {{.*#+}} ymm3 = [0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15,16,17,20,21,24,25,28,29,24,25,28,29,28,29,30,31] 717; AVX2-FAST-NEXT: vpshufb %ymm3, %ymm2, %ymm2 718; AVX2-FAST-NEXT: vpermq {{.*#+}} ymm2 = ymm2[0,2,2,3] 719; AVX2-FAST-NEXT: vmovdqa {{.*#+}} xmm5 = [255,255,255,255,255,255,255,255] 720; AVX2-FAST-NEXT: vpand %xmm5, %xmm2, %xmm2 721; AVX2-FAST-NEXT: vpermd %ymm0, %ymm4, %ymm0 722; AVX2-FAST-NEXT: vpermd %ymm1, %ymm4, %ymm1 723; AVX2-FAST-NEXT: vinserti128 $1, %xmm1, %ymm0, %ymm0 724; AVX2-FAST-NEXT: vpshufb %ymm3, %ymm0, %ymm0 725; AVX2-FAST-NEXT: vpermq {{.*#+}} ymm0 = ymm0[0,2,2,3] 726; AVX2-FAST-NEXT: vpand %xmm5, %xmm0, %xmm0 727; AVX2-FAST-NEXT: vpackuswb %xmm2, %xmm0, %xmm0 728; AVX2-FAST-NEXT: vpaddb {{.*}}(%rip), %xmm0, %xmm0 729; AVX2-FAST-NEXT: vzeroupper 730; AVX2-FAST-NEXT: retq 731; 732; AVX512-LABEL: trunc_add_const_v16i64_v16i8: 733; AVX512: # %bb.0: 734; AVX512-NEXT: vpmovqd %zmm0, %ymm0 735; AVX512-NEXT: vpmovqd %zmm1, %ymm1 736; AVX512-NEXT: vinserti64x4 $1, %ymm1, %zmm0, %zmm0 737; AVX512-NEXT: vpmovdb %zmm0, %xmm0 738; AVX512-NEXT: vpaddb {{.*}}(%rip), %xmm0, %xmm0 739; AVX512-NEXT: vzeroupper 740; AVX512-NEXT: retq 741 %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> 742 %2 = trunc <16 x i64> %1 to <16 x i8> 743 ret <16 x i8> %2 744} 745 746define <16 x i8> @trunc_add_const_v16i32_v16i8(<16 x i32> %a0) nounwind { 747; SSE-LABEL: trunc_add_const_v16i32_v16i8: 748; SSE: # %bb.0: 749; SSE-NEXT: movdqa {{.*#+}} xmm4 = [255,0,0,0,255,0,0,0,255,0,0,0,255,0,0,0] 750; SSE-NEXT: pand %xmm4, %xmm3 751; SSE-NEXT: pand %xmm4, %xmm2 752; SSE-NEXT: packuswb %xmm3, %xmm2 753; SSE-NEXT: pand %xmm4, %xmm1 754; SSE-NEXT: pand %xmm4, %xmm0 755; SSE-NEXT: packuswb %xmm1, %xmm0 756; SSE-NEXT: packuswb %xmm2, %xmm0 757; SSE-NEXT: paddb {{.*}}(%rip), %xmm0 758; SSE-NEXT: retq 759; 760; AVX1-LABEL: trunc_add_const_v16i32_v16i8: 761; AVX1: # %bb.0: 762; AVX1-NEXT: vmovaps {{.*#+}} ymm2 = [255,255,255,255,255,255,255,255] 763; AVX1-NEXT: vandps %ymm2, %ymm1, %ymm1 764; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm3 765; AVX1-NEXT: vpackusdw %xmm3, %xmm1, %xmm1 766; AVX1-NEXT: vandps %ymm2, %ymm0, %ymm0 767; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2 768; AVX1-NEXT: vpackusdw %xmm2, %xmm0, %xmm0 769; AVX1-NEXT: vpackuswb %xmm1, %xmm0, %xmm0 770; AVX1-NEXT: vpaddb {{.*}}(%rip), %xmm0, %xmm0 771; AVX1-NEXT: vzeroupper 772; AVX1-NEXT: retq 773; 774; AVX2-LABEL: trunc_add_const_v16i32_v16i8: 775; AVX2: # %bb.0: 776; AVX2-NEXT: vmovdqa {{.*#+}} ymm2 = [0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15,16,17,20,21,24,25,28,29,24,25,28,29,28,29,30,31] 777; AVX2-NEXT: vpshufb %ymm2, %ymm1, %ymm1 778; AVX2-NEXT: vpermq {{.*#+}} ymm1 = ymm1[0,2,2,3] 779; AVX2-NEXT: vmovdqa {{.*#+}} xmm3 = [255,255,255,255,255,255,255,255] 780; AVX2-NEXT: vpand %xmm3, %xmm1, %xmm1 781; AVX2-NEXT: vpshufb %ymm2, %ymm0, %ymm0 782; AVX2-NEXT: vpermq {{.*#+}} ymm0 = ymm0[0,2,2,3] 783; AVX2-NEXT: vpand %xmm3, %xmm0, %xmm0 784; AVX2-NEXT: vpackuswb %xmm1, %xmm0, %xmm0 785; AVX2-NEXT: vpaddb {{.*}}(%rip), %xmm0, %xmm0 786; AVX2-NEXT: vzeroupper 787; AVX2-NEXT: retq 788; 789; AVX512-LABEL: trunc_add_const_v16i32_v16i8: 790; AVX512: # %bb.0: 791; AVX512-NEXT: vpmovdb %zmm0, %xmm0 792; AVX512-NEXT: vpaddb {{.*}}(%rip), %xmm0, %xmm0 793; AVX512-NEXT: vzeroupper 794; AVX512-NEXT: retq 795 %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> 796 %2 = trunc <16 x i32> %1 to <16 x i8> 797 ret <16 x i8> %2 798} 799 800define <16 x i8> @trunc_add_const_v16i16_v16i8(<16 x i16> %a0) nounwind { 801; SSE-LABEL: trunc_add_const_v16i16_v16i8: 802; SSE: # %bb.0: 803; SSE-NEXT: movdqa {{.*#+}} xmm2 = [255,255,255,255,255,255,255,255] 804; SSE-NEXT: pand %xmm2, %xmm1 805; SSE-NEXT: pand %xmm2, %xmm0 806; SSE-NEXT: packuswb %xmm1, %xmm0 807; SSE-NEXT: paddb {{.*}}(%rip), %xmm0 808; SSE-NEXT: retq 809; 810; AVX1-LABEL: trunc_add_const_v16i16_v16i8: 811; AVX1: # %bb.0: 812; AVX1-NEXT: vandps {{.*}}(%rip), %ymm0, %ymm0 813; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1 814; AVX1-NEXT: vpackuswb %xmm1, %xmm0, %xmm0 815; AVX1-NEXT: vpaddb {{.*}}(%rip), %xmm0, %xmm0 816; AVX1-NEXT: vzeroupper 817; AVX1-NEXT: retq 818; 819; AVX2-LABEL: trunc_add_const_v16i16_v16i8: 820; AVX2: # %bb.0: 821; AVX2-NEXT: vpand {{.*}}(%rip), %ymm0, %ymm0 822; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1 823; AVX2-NEXT: vpackuswb %xmm1, %xmm0, %xmm0 824; AVX2-NEXT: vpaddb {{.*}}(%rip), %xmm0, %xmm0 825; AVX2-NEXT: vzeroupper 826; AVX2-NEXT: retq 827; 828; AVX512F-LABEL: trunc_add_const_v16i16_v16i8: 829; AVX512F: # %bb.0: 830; 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],zero 831; AVX512F-NEXT: vpmovdb %zmm0, %xmm0 832; AVX512F-NEXT: vpaddb {{.*}}(%rip), %xmm0, %xmm0 833; AVX512F-NEXT: vzeroupper 834; AVX512F-NEXT: retq 835; 836; AVX512BW-LABEL: trunc_add_const_v16i16_v16i8: 837; AVX512BW: # %bb.0: 838; AVX512BW-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm0 839; AVX512BW-NEXT: vpmovwb %zmm0, %ymm0 840; AVX512BW-NEXT: vpaddb {{.*}}(%rip), %xmm0, %xmm0 841; AVX512BW-NEXT: vzeroupper 842; AVX512BW-NEXT: retq 843; 844; AVX512DQ-LABEL: trunc_add_const_v16i16_v16i8: 845; AVX512DQ: # %bb.0: 846; 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],zero 847; AVX512DQ-NEXT: vpmovdb %zmm0, %xmm0 848; AVX512DQ-NEXT: vpaddb {{.*}}(%rip), %xmm0, %xmm0 849; AVX512DQ-NEXT: vzeroupper 850; AVX512DQ-NEXT: retq 851 %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> 852 %2 = trunc <16 x i16> %1 to <16 x i8> 853 ret <16 x i8> %2 854} 855 856; 857; sub 858; 859 860define <4 x i32> @trunc_sub_v4i64_v4i32(<4 x i64> %a0, <4 x i64> %a1) nounwind { 861; SSE-LABEL: trunc_sub_v4i64_v4i32: 862; SSE: # %bb.0: 863; SSE-NEXT: psubq %xmm3, %xmm1 864; SSE-NEXT: psubq %xmm2, %xmm0 865; SSE-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,2],xmm1[0,2] 866; SSE-NEXT: retq 867; 868; AVX1-LABEL: trunc_sub_v4i64_v4i32: 869; AVX1: # %bb.0: 870; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2 871; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm3 872; AVX1-NEXT: vpsubq %xmm2, %xmm3, %xmm2 873; AVX1-NEXT: vpsubq %xmm1, %xmm0, %xmm0 874; AVX1-NEXT: vshufps {{.*#+}} xmm0 = xmm0[0,2],xmm2[0,2] 875; AVX1-NEXT: vzeroupper 876; AVX1-NEXT: retq 877; 878; AVX2-SLOW-LABEL: trunc_sub_v4i64_v4i32: 879; AVX2-SLOW: # %bb.0: 880; AVX2-SLOW-NEXT: vpsubq %ymm1, %ymm0, %ymm0 881; AVX2-SLOW-NEXT: vextracti128 $1, %ymm0, %xmm1 882; AVX2-SLOW-NEXT: vshufps {{.*#+}} xmm0 = xmm0[0,2],xmm1[0,2] 883; AVX2-SLOW-NEXT: vzeroupper 884; AVX2-SLOW-NEXT: retq 885; 886; AVX2-FAST-LABEL: trunc_sub_v4i64_v4i32: 887; AVX2-FAST: # %bb.0: 888; AVX2-FAST-NEXT: vpsubq %ymm1, %ymm0, %ymm0 889; AVX2-FAST-NEXT: vmovdqa {{.*#+}} ymm1 = [0,2,4,6,4,6,6,7] 890; AVX2-FAST-NEXT: vpermd %ymm0, %ymm1, %ymm0 891; AVX2-FAST-NEXT: # kill: def $xmm0 killed $xmm0 killed $ymm0 892; AVX2-FAST-NEXT: vzeroupper 893; AVX2-FAST-NEXT: retq 894; 895; AVX512-LABEL: trunc_sub_v4i64_v4i32: 896; AVX512: # %bb.0: 897; AVX512-NEXT: vpsubq %ymm1, %ymm0, %ymm0 898; AVX512-NEXT: vpmovqd %zmm0, %ymm0 899; AVX512-NEXT: # kill: def $xmm0 killed $xmm0 killed $ymm0 900; AVX512-NEXT: vzeroupper 901; AVX512-NEXT: retq 902 %1 = sub <4 x i64> %a0, %a1 903 %2 = trunc <4 x i64> %1 to <4 x i32> 904 ret <4 x i32> %2 905} 906 907define <8 x i16> @trunc_sub_v8i64_v8i16(<8 x i64> %a0, <8 x i64> %a1) nounwind { 908; SSE-LABEL: trunc_sub_v8i64_v8i16: 909; SSE: # %bb.0: 910; SSE-NEXT: psubq %xmm6, %xmm2 911; SSE-NEXT: psubq %xmm7, %xmm3 912; SSE-NEXT: psubq %xmm4, %xmm0 913; SSE-NEXT: psubq %xmm5, %xmm1 914; SSE-NEXT: pshufd {{.*#+}} xmm1 = xmm1[0,2,2,3] 915; SSE-NEXT: pshuflw {{.*#+}} xmm1 = xmm1[0,2,2,3,4,5,6,7] 916; SSE-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3] 917; SSE-NEXT: pshuflw {{.*#+}} xmm4 = xmm0[0,2,2,3,4,5,6,7] 918; SSE-NEXT: punpckldq {{.*#+}} xmm4 = xmm4[0],xmm1[0],xmm4[1],xmm1[1] 919; SSE-NEXT: pshufd {{.*#+}} xmm0 = xmm3[0,2,2,3] 920; SSE-NEXT: pshuflw {{.*#+}} xmm1 = xmm0[0,1,0,2,4,5,6,7] 921; SSE-NEXT: pshufd {{.*#+}} xmm0 = xmm2[0,2,2,3] 922; SSE-NEXT: pshuflw {{.*#+}} xmm0 = xmm0[0,1,0,2,4,5,6,7] 923; SSE-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1] 924; SSE-NEXT: movsd {{.*#+}} xmm0 = xmm4[0],xmm0[1] 925; SSE-NEXT: retq 926; 927; AVX1-LABEL: trunc_sub_v8i64_v8i16: 928; AVX1: # %bb.0: 929; AVX1-NEXT: vpsubq %xmm2, %xmm0, %xmm4 930; AVX1-NEXT: vextractf128 $1, %ymm2, %xmm2 931; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm0 932; AVX1-NEXT: vpsubq %xmm2, %xmm0, %xmm0 933; AVX1-NEXT: vpsubq %xmm3, %xmm1, %xmm2 934; AVX1-NEXT: vextractf128 $1, %ymm3, %xmm3 935; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm1 936; AVX1-NEXT: vpsubq %xmm3, %xmm1, %xmm1 937; AVX1-NEXT: vpxor %xmm3, %xmm3, %xmm3 938; AVX1-NEXT: vpblendw {{.*#+}} xmm1 = xmm1[0],xmm3[1,2,3],xmm1[4],xmm3[5,6,7] 939; AVX1-NEXT: vpblendw {{.*#+}} xmm2 = xmm2[0],xmm3[1,2,3],xmm2[4],xmm3[5,6,7] 940; AVX1-NEXT: vpackusdw %xmm1, %xmm2, %xmm1 941; AVX1-NEXT: vpblendw {{.*#+}} xmm0 = xmm0[0],xmm3[1,2,3],xmm0[4],xmm3[5,6,7] 942; AVX1-NEXT: vpblendw {{.*#+}} xmm2 = xmm4[0],xmm3[1,2,3],xmm4[4],xmm3[5,6,7] 943; AVX1-NEXT: vpackusdw %xmm0, %xmm2, %xmm0 944; AVX1-NEXT: vpackusdw %xmm1, %xmm0, %xmm0 945; AVX1-NEXT: vzeroupper 946; AVX1-NEXT: retq 947; 948; AVX2-SLOW-LABEL: trunc_sub_v8i64_v8i16: 949; AVX2-SLOW: # %bb.0: 950; AVX2-SLOW-NEXT: vpsubq %ymm3, %ymm1, %ymm1 951; AVX2-SLOW-NEXT: vpsubq %ymm2, %ymm0, %ymm0 952; AVX2-SLOW-NEXT: vperm2i128 {{.*#+}} ymm2 = ymm0[2,3],ymm1[2,3] 953; AVX2-SLOW-NEXT: vinserti128 $1, %xmm1, %ymm0, %ymm0 954; AVX2-SLOW-NEXT: vshufps {{.*#+}} ymm0 = ymm0[0,2],ymm2[0,2],ymm0[4,6],ymm2[4,6] 955; AVX2-SLOW-NEXT: vpshufb {{.*#+}} ymm0 = ymm0[0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15,16,17,20,21,24,25,28,29,24,25,28,29,28,29,30,31] 956; AVX2-SLOW-NEXT: vpermq {{.*#+}} ymm0 = ymm0[0,2,2,3] 957; AVX2-SLOW-NEXT: # kill: def $xmm0 killed $xmm0 killed $ymm0 958; AVX2-SLOW-NEXT: vzeroupper 959; AVX2-SLOW-NEXT: retq 960; 961; AVX2-FAST-LABEL: trunc_sub_v8i64_v8i16: 962; AVX2-FAST: # %bb.0: 963; AVX2-FAST-NEXT: vpsubq %ymm3, %ymm1, %ymm1 964; AVX2-FAST-NEXT: vpsubq %ymm2, %ymm0, %ymm0 965; AVX2-FAST-NEXT: vmovdqa {{.*#+}} ymm2 = [0,2,4,6,4,6,6,7] 966; AVX2-FAST-NEXT: vpermd %ymm0, %ymm2, %ymm0 967; AVX2-FAST-NEXT: vpermd %ymm1, %ymm2, %ymm1 968; AVX2-FAST-NEXT: vinserti128 $1, %xmm1, %ymm0, %ymm0 969; AVX2-FAST-NEXT: vpshufb {{.*#+}} ymm0 = ymm0[0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15,16,17,20,21,24,25,28,29,24,25,28,29,28,29,30,31] 970; AVX2-FAST-NEXT: vpermq {{.*#+}} ymm0 = ymm0[0,2,2,3] 971; AVX2-FAST-NEXT: # kill: def $xmm0 killed $xmm0 killed $ymm0 972; AVX2-FAST-NEXT: vzeroupper 973; AVX2-FAST-NEXT: retq 974; 975; AVX512-LABEL: trunc_sub_v8i64_v8i16: 976; AVX512: # %bb.0: 977; AVX512-NEXT: vpsubq %zmm1, %zmm0, %zmm0 978; AVX512-NEXT: vpmovqw %zmm0, %xmm0 979; AVX512-NEXT: vzeroupper 980; AVX512-NEXT: retq 981 %1 = sub <8 x i64> %a0, %a1 982 %2 = trunc <8 x i64> %1 to <8 x i16> 983 ret <8 x i16> %2 984} 985 986define <8 x i16> @trunc_sub_v8i32_v8i16(<8 x i32> %a0, <8 x i32> %a1) nounwind { 987; SSE-LABEL: trunc_sub_v8i32_v8i16: 988; SSE: # %bb.0: 989; SSE-NEXT: psubd %xmm2, %xmm0 990; SSE-NEXT: psubd %xmm3, %xmm1 991; SSE-NEXT: pslld $16, %xmm1 992; SSE-NEXT: psrad $16, %xmm1 993; SSE-NEXT: pslld $16, %xmm0 994; SSE-NEXT: psrad $16, %xmm0 995; SSE-NEXT: packssdw %xmm1, %xmm0 996; SSE-NEXT: retq 997; 998; AVX1-LABEL: trunc_sub_v8i32_v8i16: 999; AVX1: # %bb.0: 1000; AVX1-NEXT: vpsubd %xmm1, %xmm0, %xmm2 1001; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm1 1002; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm0 1003; AVX1-NEXT: vpsubd %xmm1, %xmm0, %xmm0 1004; AVX1-NEXT: vmovdqa {{.*#+}} xmm1 = [0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15] 1005; AVX1-NEXT: vpshufb %xmm1, %xmm0, %xmm0 1006; AVX1-NEXT: vpshufb %xmm1, %xmm2, %xmm1 1007; AVX1-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm1[0],xmm0[0] 1008; AVX1-NEXT: vzeroupper 1009; AVX1-NEXT: retq 1010; 1011; AVX2-LABEL: trunc_sub_v8i32_v8i16: 1012; AVX2: # %bb.0: 1013; AVX2-NEXT: vpsubd %ymm1, %ymm0, %ymm0 1014; AVX2-NEXT: vpshufb {{.*#+}} ymm0 = ymm0[0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15,16,17,20,21,24,25,28,29,24,25,28,29,28,29,30,31] 1015; AVX2-NEXT: vpermq {{.*#+}} ymm0 = ymm0[0,2,2,3] 1016; AVX2-NEXT: # kill: def $xmm0 killed $xmm0 killed $ymm0 1017; AVX2-NEXT: vzeroupper 1018; AVX2-NEXT: retq 1019; 1020; AVX512-LABEL: trunc_sub_v8i32_v8i16: 1021; AVX512: # %bb.0: 1022; AVX512-NEXT: vpsubd %ymm1, %ymm0, %ymm0 1023; AVX512-NEXT: vpmovdw %zmm0, %ymm0 1024; AVX512-NEXT: # kill: def $xmm0 killed $xmm0 killed $ymm0 1025; AVX512-NEXT: vzeroupper 1026; AVX512-NEXT: retq 1027 %1 = sub <8 x i32> %a0, %a1 1028 %2 = trunc <8 x i32> %1 to <8 x i16> 1029 ret <8 x i16> %2 1030} 1031 1032define <16 x i8> @trunc_sub_v16i64_v16i8(<16 x i64> %a0, <16 x i64> %a1) nounwind { 1033; SSE-LABEL: trunc_sub_v16i64_v16i8: 1034; SSE: # %bb.0: 1035; SSE-NEXT: psubq {{[0-9]+}}(%rsp), %xmm0 1036; SSE-NEXT: psubq {{[0-9]+}}(%rsp), %xmm1 1037; SSE-NEXT: psubq {{[0-9]+}}(%rsp), %xmm2 1038; SSE-NEXT: psubq {{[0-9]+}}(%rsp), %xmm3 1039; SSE-NEXT: psubq {{[0-9]+}}(%rsp), %xmm4 1040; SSE-NEXT: psubq {{[0-9]+}}(%rsp), %xmm5 1041; SSE-NEXT: psubq {{[0-9]+}}(%rsp), %xmm6 1042; SSE-NEXT: psubq {{[0-9]+}}(%rsp), %xmm7 1043; SSE-NEXT: movdqa {{.*#+}} xmm8 = [255,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0] 1044; SSE-NEXT: pand %xmm8, %xmm7 1045; SSE-NEXT: pand %xmm8, %xmm6 1046; SSE-NEXT: packuswb %xmm7, %xmm6 1047; SSE-NEXT: pand %xmm8, %xmm5 1048; SSE-NEXT: pand %xmm8, %xmm4 1049; SSE-NEXT: packuswb %xmm5, %xmm4 1050; SSE-NEXT: packuswb %xmm6, %xmm4 1051; SSE-NEXT: pand %xmm8, %xmm3 1052; SSE-NEXT: pand %xmm8, %xmm2 1053; SSE-NEXT: packuswb %xmm3, %xmm2 1054; SSE-NEXT: pand %xmm8, %xmm1 1055; SSE-NEXT: pand %xmm8, %xmm0 1056; SSE-NEXT: packuswb %xmm1, %xmm0 1057; SSE-NEXT: packuswb %xmm2, %xmm0 1058; SSE-NEXT: packuswb %xmm4, %xmm0 1059; SSE-NEXT: retq 1060; 1061; AVX1-LABEL: trunc_sub_v16i64_v16i8: 1062; AVX1: # %bb.0: 1063; AVX1-NEXT: vpsubq %xmm4, %xmm0, %xmm8 1064; AVX1-NEXT: vextractf128 $1, %ymm4, %xmm4 1065; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm0 1066; AVX1-NEXT: vpsubq %xmm4, %xmm0, %xmm0 1067; AVX1-NEXT: vpsubq %xmm5, %xmm1, %xmm4 1068; AVX1-NEXT: vextractf128 $1, %ymm5, %xmm5 1069; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm1 1070; AVX1-NEXT: vpsubq %xmm5, %xmm1, %xmm1 1071; AVX1-NEXT: vpsubq %xmm6, %xmm2, %xmm5 1072; AVX1-NEXT: vextractf128 $1, %ymm6, %xmm6 1073; AVX1-NEXT: vextractf128 $1, %ymm2, %xmm2 1074; AVX1-NEXT: vpsubq %xmm6, %xmm2, %xmm2 1075; AVX1-NEXT: vpsubq %xmm7, %xmm3, %xmm6 1076; AVX1-NEXT: vextractf128 $1, %ymm7, %xmm7 1077; AVX1-NEXT: vextractf128 $1, %ymm3, %xmm3 1078; AVX1-NEXT: vpsubq %xmm7, %xmm3, %xmm3 1079; AVX1-NEXT: vmovdqa {{.*#+}} xmm7 = [255,255] 1080; AVX1-NEXT: vpand %xmm7, %xmm3, %xmm3 1081; AVX1-NEXT: vpand %xmm7, %xmm6, %xmm6 1082; AVX1-NEXT: vpackusdw %xmm3, %xmm6, %xmm3 1083; AVX1-NEXT: vpand %xmm7, %xmm2, %xmm2 1084; AVX1-NEXT: vpand %xmm7, %xmm5, %xmm5 1085; AVX1-NEXT: vpackusdw %xmm2, %xmm5, %xmm2 1086; AVX1-NEXT: vpackusdw %xmm3, %xmm2, %xmm2 1087; AVX1-NEXT: vpand %xmm7, %xmm1, %xmm1 1088; AVX1-NEXT: vpand %xmm7, %xmm4, %xmm3 1089; AVX1-NEXT: vpackusdw %xmm1, %xmm3, %xmm1 1090; AVX1-NEXT: vpand %xmm7, %xmm0, %xmm0 1091; AVX1-NEXT: vpand %xmm7, %xmm8, %xmm3 1092; AVX1-NEXT: vpackusdw %xmm0, %xmm3, %xmm0 1093; AVX1-NEXT: vpackusdw %xmm1, %xmm0, %xmm0 1094; AVX1-NEXT: vpackuswb %xmm2, %xmm0, %xmm0 1095; AVX1-NEXT: vzeroupper 1096; AVX1-NEXT: retq 1097; 1098; AVX2-SLOW-LABEL: trunc_sub_v16i64_v16i8: 1099; AVX2-SLOW: # %bb.0: 1100; AVX2-SLOW-NEXT: vpsubq %ymm5, %ymm1, %ymm1 1101; AVX2-SLOW-NEXT: vpsubq %ymm4, %ymm0, %ymm0 1102; AVX2-SLOW-NEXT: vpsubq %ymm7, %ymm3, %ymm3 1103; AVX2-SLOW-NEXT: vpsubq %ymm6, %ymm2, %ymm2 1104; AVX2-SLOW-NEXT: vperm2i128 {{.*#+}} ymm4 = ymm2[2,3],ymm3[2,3] 1105; AVX2-SLOW-NEXT: vinserti128 $1, %xmm3, %ymm2, %ymm2 1106; AVX2-SLOW-NEXT: vshufps {{.*#+}} ymm2 = ymm2[0,2],ymm4[0,2],ymm2[4,6],ymm4[4,6] 1107; AVX2-SLOW-NEXT: vmovdqa {{.*#+}} ymm3 = [0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15,16,17,20,21,24,25,28,29,24,25,28,29,28,29,30,31] 1108; AVX2-SLOW-NEXT: vpshufb %ymm3, %ymm2, %ymm2 1109; AVX2-SLOW-NEXT: vpermq {{.*#+}} ymm2 = ymm2[0,2,2,3] 1110; AVX2-SLOW-NEXT: vmovdqa {{.*#+}} xmm4 = [255,255,255,255,255,255,255,255] 1111; AVX2-SLOW-NEXT: vpand %xmm4, %xmm2, %xmm2 1112; AVX2-SLOW-NEXT: vperm2i128 {{.*#+}} ymm5 = ymm0[2,3],ymm1[2,3] 1113; AVX2-SLOW-NEXT: vinserti128 $1, %xmm1, %ymm0, %ymm0 1114; AVX2-SLOW-NEXT: vshufps {{.*#+}} ymm0 = ymm0[0,2],ymm5[0,2],ymm0[4,6],ymm5[4,6] 1115; AVX2-SLOW-NEXT: vpshufb %ymm3, %ymm0, %ymm0 1116; AVX2-SLOW-NEXT: vpermq {{.*#+}} ymm0 = ymm0[0,2,2,3] 1117; AVX2-SLOW-NEXT: vpand %xmm4, %xmm0, %xmm0 1118; AVX2-SLOW-NEXT: vpackuswb %xmm2, %xmm0, %xmm0 1119; AVX2-SLOW-NEXT: vzeroupper 1120; AVX2-SLOW-NEXT: retq 1121; 1122; AVX2-FAST-LABEL: trunc_sub_v16i64_v16i8: 1123; AVX2-FAST: # %bb.0: 1124; AVX2-FAST-NEXT: vpsubq %ymm5, %ymm1, %ymm1 1125; AVX2-FAST-NEXT: vpsubq %ymm4, %ymm0, %ymm0 1126; AVX2-FAST-NEXT: vpsubq %ymm7, %ymm3, %ymm3 1127; AVX2-FAST-NEXT: vpsubq %ymm6, %ymm2, %ymm2 1128; AVX2-FAST-NEXT: vmovdqa {{.*#+}} ymm4 = [0,2,4,6,4,6,6,7] 1129; AVX2-FAST-NEXT: vpermd %ymm2, %ymm4, %ymm2 1130; AVX2-FAST-NEXT: vpermd %ymm3, %ymm4, %ymm3 1131; AVX2-FAST-NEXT: vinserti128 $1, %xmm3, %ymm2, %ymm2 1132; AVX2-FAST-NEXT: vmovdqa {{.*#+}} ymm3 = [0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15,16,17,20,21,24,25,28,29,24,25,28,29,28,29,30,31] 1133; AVX2-FAST-NEXT: vpshufb %ymm3, %ymm2, %ymm2 1134; AVX2-FAST-NEXT: vpermq {{.*#+}} ymm2 = ymm2[0,2,2,3] 1135; AVX2-FAST-NEXT: vmovdqa {{.*#+}} xmm5 = [255,255,255,255,255,255,255,255] 1136; AVX2-FAST-NEXT: vpand %xmm5, %xmm2, %xmm2 1137; AVX2-FAST-NEXT: vpermd %ymm0, %ymm4, %ymm0 1138; AVX2-FAST-NEXT: vpermd %ymm1, %ymm4, %ymm1 1139; AVX2-FAST-NEXT: vinserti128 $1, %xmm1, %ymm0, %ymm0 1140; AVX2-FAST-NEXT: vpshufb %ymm3, %ymm0, %ymm0 1141; AVX2-FAST-NEXT: vpermq {{.*#+}} ymm0 = ymm0[0,2,2,3] 1142; AVX2-FAST-NEXT: vpand %xmm5, %xmm0, %xmm0 1143; AVX2-FAST-NEXT: vpackuswb %xmm2, %xmm0, %xmm0 1144; AVX2-FAST-NEXT: vzeroupper 1145; AVX2-FAST-NEXT: retq 1146; 1147; AVX512-LABEL: trunc_sub_v16i64_v16i8: 1148; AVX512: # %bb.0: 1149; AVX512-NEXT: vpsubq %zmm3, %zmm1, %zmm1 1150; AVX512-NEXT: vpsubq %zmm2, %zmm0, %zmm0 1151; AVX512-NEXT: vpmovqd %zmm0, %ymm0 1152; AVX512-NEXT: vpmovqd %zmm1, %ymm1 1153; AVX512-NEXT: vinserti64x4 $1, %ymm1, %zmm0, %zmm0 1154; AVX512-NEXT: vpmovdb %zmm0, %xmm0 1155; AVX512-NEXT: vzeroupper 1156; AVX512-NEXT: retq 1157 %1 = sub <16 x i64> %a0, %a1 1158 %2 = trunc <16 x i64> %1 to <16 x i8> 1159 ret <16 x i8> %2 1160} 1161 1162define <16 x i8> @trunc_sub_v16i32_v16i8(<16 x i32> %a0, <16 x i32> %a1) nounwind { 1163; SSE-LABEL: trunc_sub_v16i32_v16i8: 1164; SSE: # %bb.0: 1165; SSE-NEXT: psubd %xmm4, %xmm0 1166; SSE-NEXT: psubd %xmm5, %xmm1 1167; SSE-NEXT: psubd %xmm6, %xmm2 1168; SSE-NEXT: psubd %xmm7, %xmm3 1169; SSE-NEXT: movdqa {{.*#+}} xmm4 = [255,0,0,0,255,0,0,0,255,0,0,0,255,0,0,0] 1170; SSE-NEXT: pand %xmm4, %xmm3 1171; SSE-NEXT: pand %xmm4, %xmm2 1172; SSE-NEXT: packuswb %xmm3, %xmm2 1173; SSE-NEXT: pand %xmm4, %xmm1 1174; SSE-NEXT: pand %xmm4, %xmm0 1175; SSE-NEXT: packuswb %xmm1, %xmm0 1176; SSE-NEXT: packuswb %xmm2, %xmm0 1177; SSE-NEXT: retq 1178; 1179; AVX1-LABEL: trunc_sub_v16i32_v16i8: 1180; AVX1: # %bb.0: 1181; AVX1-NEXT: vpsubd %xmm2, %xmm0, %xmm4 1182; AVX1-NEXT: vextractf128 $1, %ymm2, %xmm2 1183; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm0 1184; AVX1-NEXT: vpsubd %xmm2, %xmm0, %xmm0 1185; AVX1-NEXT: vpsubd %xmm3, %xmm1, %xmm2 1186; AVX1-NEXT: vextractf128 $1, %ymm3, %xmm3 1187; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm1 1188; AVX1-NEXT: vpsubd %xmm3, %xmm1, %xmm1 1189; AVX1-NEXT: vmovdqa {{.*#+}} xmm3 = [255,255,255,255] 1190; AVX1-NEXT: vpand %xmm3, %xmm1, %xmm1 1191; AVX1-NEXT: vpand %xmm3, %xmm2, %xmm2 1192; AVX1-NEXT: vpackusdw %xmm1, %xmm2, %xmm1 1193; AVX1-NEXT: vpand %xmm3, %xmm0, %xmm0 1194; AVX1-NEXT: vpand %xmm3, %xmm4, %xmm2 1195; AVX1-NEXT: vpackusdw %xmm0, %xmm2, %xmm0 1196; AVX1-NEXT: vpackuswb %xmm1, %xmm0, %xmm0 1197; AVX1-NEXT: vzeroupper 1198; AVX1-NEXT: retq 1199; 1200; AVX2-LABEL: trunc_sub_v16i32_v16i8: 1201; AVX2: # %bb.0: 1202; AVX2-NEXT: vpsubd %ymm2, %ymm0, %ymm0 1203; AVX2-NEXT: vpsubd %ymm3, %ymm1, %ymm1 1204; AVX2-NEXT: vmovdqa {{.*#+}} ymm2 = [0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15,16,17,20,21,24,25,28,29,24,25,28,29,28,29,30,31] 1205; AVX2-NEXT: vpshufb %ymm2, %ymm1, %ymm1 1206; AVX2-NEXT: vpermq {{.*#+}} ymm1 = ymm1[0,2,2,3] 1207; AVX2-NEXT: vmovdqa {{.*#+}} xmm3 = [255,255,255,255,255,255,255,255] 1208; AVX2-NEXT: vpand %xmm3, %xmm1, %xmm1 1209; AVX2-NEXT: vpshufb %ymm2, %ymm0, %ymm0 1210; AVX2-NEXT: vpermq {{.*#+}} ymm0 = ymm0[0,2,2,3] 1211; AVX2-NEXT: vpand %xmm3, %xmm0, %xmm0 1212; AVX2-NEXT: vpackuswb %xmm1, %xmm0, %xmm0 1213; AVX2-NEXT: vzeroupper 1214; AVX2-NEXT: retq 1215; 1216; AVX512-LABEL: trunc_sub_v16i32_v16i8: 1217; AVX512: # %bb.0: 1218; AVX512-NEXT: vpsubd %zmm1, %zmm0, %zmm0 1219; AVX512-NEXT: vpmovdb %zmm0, %xmm0 1220; AVX512-NEXT: vzeroupper 1221; AVX512-NEXT: retq 1222 %1 = sub <16 x i32> %a0, %a1 1223 %2 = trunc <16 x i32> %1 to <16 x i8> 1224 ret <16 x i8> %2 1225} 1226 1227define <16 x i8> @trunc_sub_v16i16_v16i8(<16 x i16> %a0, <16 x i16> %a1) nounwind { 1228; SSE-LABEL: trunc_sub_v16i16_v16i8: 1229; SSE: # %bb.0: 1230; SSE-NEXT: psubw %xmm2, %xmm0 1231; SSE-NEXT: psubw %xmm3, %xmm1 1232; SSE-NEXT: movdqa {{.*#+}} xmm2 = [255,255,255,255,255,255,255,255] 1233; SSE-NEXT: pand %xmm2, %xmm1 1234; SSE-NEXT: pand %xmm2, %xmm0 1235; SSE-NEXT: packuswb %xmm1, %xmm0 1236; SSE-NEXT: retq 1237; 1238; AVX1-LABEL: trunc_sub_v16i16_v16i8: 1239; AVX1: # %bb.0: 1240; AVX1-NEXT: vpsubw %xmm1, %xmm0, %xmm2 1241; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm1 1242; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm0 1243; AVX1-NEXT: vpsubw %xmm1, %xmm0, %xmm0 1244; AVX1-NEXT: vmovdqa {{.*#+}} xmm1 = [255,255,255,255,255,255,255,255] 1245; AVX1-NEXT: vpand %xmm1, %xmm0, %xmm0 1246; AVX1-NEXT: vpand %xmm1, %xmm2, %xmm1 1247; AVX1-NEXT: vpackuswb %xmm0, %xmm1, %xmm0 1248; AVX1-NEXT: vzeroupper 1249; AVX1-NEXT: retq 1250; 1251; AVX2-LABEL: trunc_sub_v16i16_v16i8: 1252; AVX2: # %bb.0: 1253; AVX2-NEXT: vpsubw %ymm1, %ymm0, %ymm0 1254; AVX2-NEXT: vpand {{.*}}(%rip), %ymm0, %ymm0 1255; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1 1256; AVX2-NEXT: vpackuswb %xmm1, %xmm0, %xmm0 1257; AVX2-NEXT: vzeroupper 1258; AVX2-NEXT: retq 1259; 1260; AVX512F-LABEL: trunc_sub_v16i16_v16i8: 1261; AVX512F: # %bb.0: 1262; AVX512F-NEXT: vpsubw %ymm1, %ymm0, %ymm0 1263; 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],zero 1264; AVX512F-NEXT: vpmovdb %zmm0, %xmm0 1265; AVX512F-NEXT: vzeroupper 1266; AVX512F-NEXT: retq 1267; 1268; AVX512BW-LABEL: trunc_sub_v16i16_v16i8: 1269; AVX512BW: # %bb.0: 1270; AVX512BW-NEXT: vpsubw %ymm1, %ymm0, %ymm0 1271; AVX512BW-NEXT: vpmovwb %zmm0, %ymm0 1272; AVX512BW-NEXT: # kill: def $xmm0 killed $xmm0 killed $ymm0 1273; AVX512BW-NEXT: vzeroupper 1274; AVX512BW-NEXT: retq 1275; 1276; AVX512DQ-LABEL: trunc_sub_v16i16_v16i8: 1277; AVX512DQ: # %bb.0: 1278; AVX512DQ-NEXT: vpsubw %ymm1, %ymm0, %ymm0 1279; 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],zero 1280; AVX512DQ-NEXT: vpmovdb %zmm0, %xmm0 1281; AVX512DQ-NEXT: vzeroupper 1282; AVX512DQ-NEXT: retq 1283 %1 = sub <16 x i16> %a0, %a1 1284 %2 = trunc <16 x i16> %1 to <16 x i8> 1285 ret <16 x i8> %2 1286} 1287 1288define <16 x i8> @trunc_ext_sub_v16i16_v16i8(<16 x i8> %x, <16 x i8> %y) { 1289; SSE-LABEL: trunc_ext_sub_v16i16_v16i8: 1290; SSE: # %bb.0: 1291; SSE-NEXT: psubb %xmm1, %xmm0 1292; SSE-NEXT: retq 1293; 1294; AVX-LABEL: trunc_ext_sub_v16i16_v16i8: 1295; AVX: # %bb.0: 1296; AVX-NEXT: vpsubb %xmm1, %xmm0, %xmm0 1297; AVX-NEXT: retq 1298 %a = zext <16 x i8> %x to <16 x i16> 1299 %b = zext <16 x i8> %y to <16 x i16> 1300 %c = sub <16 x i16> %a, %b 1301 %d = trunc <16 x i16> %c to <16 x i8> 1302 ret <16 x i8> %d 1303} 1304 1305; 1306; sub to constant 1307; 1308 1309define <4 x i32> @trunc_sub_const_v4i64_v4i32(<4 x i64> %a0) nounwind { 1310; SSE-LABEL: trunc_sub_const_v4i64_v4i32: 1311; SSE: # %bb.0: 1312; SSE-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,2],xmm1[0,2] 1313; SSE-NEXT: psubd {{.*}}(%rip), %xmm0 1314; SSE-NEXT: retq 1315; 1316; AVX1-LABEL: trunc_sub_const_v4i64_v4i32: 1317; AVX1: # %bb.0: 1318; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1 1319; AVX1-NEXT: vshufps {{.*#+}} xmm0 = xmm0[0,2],xmm1[0,2] 1320; AVX1-NEXT: vpsubd {{.*}}(%rip), %xmm0, %xmm0 1321; AVX1-NEXT: vzeroupper 1322; AVX1-NEXT: retq 1323; 1324; AVX2-SLOW-LABEL: trunc_sub_const_v4i64_v4i32: 1325; AVX2-SLOW: # %bb.0: 1326; AVX2-SLOW-NEXT: vextractf128 $1, %ymm0, %xmm1 1327; AVX2-SLOW-NEXT: vshufps {{.*#+}} xmm0 = xmm0[0,2],xmm1[0,2] 1328; AVX2-SLOW-NEXT: vpsubd {{.*}}(%rip), %xmm0, %xmm0 1329; AVX2-SLOW-NEXT: vzeroupper 1330; AVX2-SLOW-NEXT: retq 1331; 1332; AVX2-FAST-LABEL: trunc_sub_const_v4i64_v4i32: 1333; AVX2-FAST: # %bb.0: 1334; AVX2-FAST-NEXT: vmovdqa {{.*#+}} ymm1 = [0,2,4,6,4,6,6,7] 1335; AVX2-FAST-NEXT: vpermd %ymm0, %ymm1, %ymm0 1336; AVX2-FAST-NEXT: vpsubd {{.*}}(%rip), %xmm0, %xmm0 1337; AVX2-FAST-NEXT: vzeroupper 1338; AVX2-FAST-NEXT: retq 1339; 1340; AVX512-LABEL: trunc_sub_const_v4i64_v4i32: 1341; AVX512: # %bb.0: 1342; AVX512-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm0 1343; AVX512-NEXT: vpmovqd %zmm0, %ymm0 1344; AVX512-NEXT: vpsubd {{.*}}(%rip), %xmm0, %xmm0 1345; AVX512-NEXT: vzeroupper 1346; AVX512-NEXT: retq 1347 %1 = sub <4 x i64> %a0, <i64 0, i64 1, i64 2, i64 3> 1348 %2 = trunc <4 x i64> %1 to <4 x i32> 1349 ret <4 x i32> %2 1350} 1351 1352define <8 x i16> @trunc_sub_const_v8i64_v8i16(<8 x i64> %a0) nounwind { 1353; SSE-LABEL: trunc_sub_const_v8i64_v8i16: 1354; SSE: # %bb.0: 1355; SSE-NEXT: pshufd {{.*#+}} xmm1 = xmm1[0,2,2,3] 1356; SSE-NEXT: pshuflw {{.*#+}} xmm1 = xmm1[0,2,2,3,4,5,6,7] 1357; SSE-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3] 1358; SSE-NEXT: pshuflw {{.*#+}} xmm4 = xmm0[0,2,2,3,4,5,6,7] 1359; SSE-NEXT: punpckldq {{.*#+}} xmm4 = xmm4[0],xmm1[0],xmm4[1],xmm1[1] 1360; SSE-NEXT: pshufd {{.*#+}} xmm0 = xmm3[0,2,2,3] 1361; SSE-NEXT: pshuflw {{.*#+}} xmm1 = xmm0[0,1,0,2,4,5,6,7] 1362; SSE-NEXT: pshufd {{.*#+}} xmm0 = xmm2[0,2,2,3] 1363; SSE-NEXT: pshuflw {{.*#+}} xmm0 = xmm0[0,1,0,2,4,5,6,7] 1364; SSE-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1] 1365; SSE-NEXT: movsd {{.*#+}} xmm0 = xmm4[0],xmm0[1] 1366; SSE-NEXT: psubw {{.*}}(%rip), %xmm0 1367; SSE-NEXT: retq 1368; 1369; AVX1-LABEL: trunc_sub_const_v8i64_v8i16: 1370; AVX1: # %bb.0: 1371; AVX1-NEXT: vmovaps {{.*#+}} ymm2 = [65535,65535,65535,65535] 1372; AVX1-NEXT: vandps %ymm2, %ymm1, %ymm1 1373; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm3 1374; AVX1-NEXT: vpackusdw %xmm3, %xmm1, %xmm1 1375; AVX1-NEXT: vandps %ymm2, %ymm0, %ymm0 1376; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2 1377; AVX1-NEXT: vpackusdw %xmm2, %xmm0, %xmm0 1378; AVX1-NEXT: vpackusdw %xmm1, %xmm0, %xmm0 1379; AVX1-NEXT: vpsubw {{.*}}(%rip), %xmm0, %xmm0 1380; AVX1-NEXT: vzeroupper 1381; AVX1-NEXT: retq 1382; 1383; AVX2-SLOW-LABEL: trunc_sub_const_v8i64_v8i16: 1384; AVX2-SLOW: # %bb.0: 1385; AVX2-SLOW-NEXT: vperm2f128 {{.*#+}} ymm2 = ymm0[2,3],ymm1[2,3] 1386; AVX2-SLOW-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0 1387; AVX2-SLOW-NEXT: vshufps {{.*#+}} ymm0 = ymm0[0,2],ymm2[0,2],ymm0[4,6],ymm2[4,6] 1388; AVX2-SLOW-NEXT: vpshufb {{.*#+}} ymm0 = ymm0[0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15,16,17,20,21,24,25,28,29,24,25,28,29,28,29,30,31] 1389; AVX2-SLOW-NEXT: vpermq {{.*#+}} ymm0 = ymm0[0,2,2,3] 1390; AVX2-SLOW-NEXT: vpsubw {{.*}}(%rip), %xmm0, %xmm0 1391; AVX2-SLOW-NEXT: vzeroupper 1392; AVX2-SLOW-NEXT: retq 1393; 1394; AVX2-FAST-LABEL: trunc_sub_const_v8i64_v8i16: 1395; AVX2-FAST: # %bb.0: 1396; AVX2-FAST-NEXT: vmovdqa {{.*#+}} ymm2 = [0,2,4,6,4,6,6,7] 1397; AVX2-FAST-NEXT: vpermd %ymm0, %ymm2, %ymm0 1398; AVX2-FAST-NEXT: vpermd %ymm1, %ymm2, %ymm1 1399; AVX2-FAST-NEXT: vinserti128 $1, %xmm1, %ymm0, %ymm0 1400; AVX2-FAST-NEXT: vpshufb {{.*#+}} ymm0 = ymm0[0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15,16,17,20,21,24,25,28,29,24,25,28,29,28,29,30,31] 1401; AVX2-FAST-NEXT: vpermq {{.*#+}} ymm0 = ymm0[0,2,2,3] 1402; AVX2-FAST-NEXT: vpsubw {{.*}}(%rip), %xmm0, %xmm0 1403; AVX2-FAST-NEXT: vzeroupper 1404; AVX2-FAST-NEXT: retq 1405; 1406; AVX512-LABEL: trunc_sub_const_v8i64_v8i16: 1407; AVX512: # %bb.0: 1408; AVX512-NEXT: vpmovqw %zmm0, %xmm0 1409; AVX512-NEXT: vpsubw {{.*}}(%rip), %xmm0, %xmm0 1410; AVX512-NEXT: vzeroupper 1411; AVX512-NEXT: retq 1412 %1 = sub <8 x i64> %a0, <i64 0, i64 1, i64 2, i64 3, i64 4, i64 5, i64 6, i64 7> 1413 %2 = trunc <8 x i64> %1 to <8 x i16> 1414 ret <8 x i16> %2 1415} 1416 1417define <8 x i16> @trunc_sub_const_v8i32_v8i16(<8 x i32> %a0) nounwind { 1418; SSE-LABEL: trunc_sub_const_v8i32_v8i16: 1419; SSE: # %bb.0: 1420; SSE-NEXT: pslld $16, %xmm1 1421; SSE-NEXT: psrad $16, %xmm1 1422; SSE-NEXT: pslld $16, %xmm0 1423; SSE-NEXT: psrad $16, %xmm0 1424; SSE-NEXT: packssdw %xmm1, %xmm0 1425; SSE-NEXT: psubw {{.*}}(%rip), %xmm0 1426; SSE-NEXT: retq 1427; 1428; AVX1-LABEL: trunc_sub_const_v8i32_v8i16: 1429; AVX1: # %bb.0: 1430; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1 1431; AVX1-NEXT: vmovdqa {{.*#+}} xmm2 = [0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15] 1432; AVX1-NEXT: vpshufb %xmm2, %xmm1, %xmm1 1433; AVX1-NEXT: vpshufb %xmm2, %xmm0, %xmm0 1434; AVX1-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0] 1435; AVX1-NEXT: vpsubw {{.*}}(%rip), %xmm0, %xmm0 1436; AVX1-NEXT: vzeroupper 1437; AVX1-NEXT: retq 1438; 1439; AVX2-LABEL: trunc_sub_const_v8i32_v8i16: 1440; AVX2: # %bb.0: 1441; AVX2-NEXT: vpshufb {{.*#+}} ymm0 = ymm0[0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15,16,17,20,21,24,25,28,29,24,25,28,29,28,29,30,31] 1442; AVX2-NEXT: vpermq {{.*#+}} ymm0 = ymm0[0,2,2,3] 1443; AVX2-NEXT: vpsubw {{.*}}(%rip), %xmm0, %xmm0 1444; AVX2-NEXT: vzeroupper 1445; AVX2-NEXT: retq 1446; 1447; AVX512-LABEL: trunc_sub_const_v8i32_v8i16: 1448; AVX512: # %bb.0: 1449; AVX512-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm0 1450; AVX512-NEXT: vpmovdw %zmm0, %ymm0 1451; AVX512-NEXT: vpsubw {{.*}}(%rip), %xmm0, %xmm0 1452; AVX512-NEXT: vzeroupper 1453; AVX512-NEXT: retq 1454 %1 = sub <8 x i32> %a0, <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7> 1455 %2 = trunc <8 x i32> %1 to <8 x i16> 1456 ret <8 x i16> %2 1457} 1458 1459define <16 x i8> @trunc_sub_const_v16i64_v16i8(<16 x i64> %a0) nounwind { 1460; SSE-LABEL: trunc_sub_const_v16i64_v16i8: 1461; SSE: # %bb.0: 1462; SSE-NEXT: movdqa {{.*#+}} xmm8 = [255,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0] 1463; SSE-NEXT: pand %xmm8, %xmm7 1464; SSE-NEXT: pand %xmm8, %xmm6 1465; SSE-NEXT: packuswb %xmm7, %xmm6 1466; SSE-NEXT: pand %xmm8, %xmm5 1467; SSE-NEXT: pand %xmm8, %xmm4 1468; SSE-NEXT: packuswb %xmm5, %xmm4 1469; SSE-NEXT: packuswb %xmm6, %xmm4 1470; SSE-NEXT: pand %xmm8, %xmm3 1471; SSE-NEXT: pand %xmm8, %xmm2 1472; SSE-NEXT: packuswb %xmm3, %xmm2 1473; SSE-NEXT: pand %xmm8, %xmm1 1474; SSE-NEXT: pand %xmm8, %xmm0 1475; SSE-NEXT: packuswb %xmm1, %xmm0 1476; SSE-NEXT: packuswb %xmm2, %xmm0 1477; SSE-NEXT: packuswb %xmm4, %xmm0 1478; SSE-NEXT: psubb {{.*}}(%rip), %xmm0 1479; SSE-NEXT: retq 1480; 1481; AVX1-LABEL: trunc_sub_const_v16i64_v16i8: 1482; AVX1: # %bb.0: 1483; AVX1-NEXT: vmovaps {{.*#+}} ymm4 = [255,255,255,255] 1484; AVX1-NEXT: vandps %ymm4, %ymm3, %ymm3 1485; AVX1-NEXT: vextractf128 $1, %ymm3, %xmm5 1486; AVX1-NEXT: vpackusdw %xmm5, %xmm3, %xmm3 1487; AVX1-NEXT: vandps %ymm4, %ymm2, %ymm2 1488; AVX1-NEXT: vextractf128 $1, %ymm2, %xmm5 1489; AVX1-NEXT: vpackusdw %xmm5, %xmm2, %xmm2 1490; AVX1-NEXT: vpackusdw %xmm3, %xmm2, %xmm2 1491; AVX1-NEXT: vandps %ymm4, %ymm1, %ymm1 1492; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm3 1493; AVX1-NEXT: vpackusdw %xmm3, %xmm1, %xmm1 1494; AVX1-NEXT: vandps %ymm4, %ymm0, %ymm0 1495; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm3 1496; AVX1-NEXT: vpackusdw %xmm3, %xmm0, %xmm0 1497; AVX1-NEXT: vpackusdw %xmm1, %xmm0, %xmm0 1498; AVX1-NEXT: vpackuswb %xmm2, %xmm0, %xmm0 1499; AVX1-NEXT: vpsubb {{.*}}(%rip), %xmm0, %xmm0 1500; AVX1-NEXT: vzeroupper 1501; AVX1-NEXT: retq 1502; 1503; AVX2-SLOW-LABEL: trunc_sub_const_v16i64_v16i8: 1504; AVX2-SLOW: # %bb.0: 1505; AVX2-SLOW-NEXT: vperm2f128 {{.*#+}} ymm4 = ymm2[2,3],ymm3[2,3] 1506; AVX2-SLOW-NEXT: vinsertf128 $1, %xmm3, %ymm2, %ymm2 1507; AVX2-SLOW-NEXT: vshufps {{.*#+}} ymm2 = ymm2[0,2],ymm4[0,2],ymm2[4,6],ymm4[4,6] 1508; AVX2-SLOW-NEXT: vmovdqa {{.*#+}} ymm3 = [0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15,16,17,20,21,24,25,28,29,24,25,28,29,28,29,30,31] 1509; AVX2-SLOW-NEXT: vpshufb %ymm3, %ymm2, %ymm2 1510; AVX2-SLOW-NEXT: vpermq {{.*#+}} ymm2 = ymm2[0,2,2,3] 1511; AVX2-SLOW-NEXT: vmovdqa {{.*#+}} xmm4 = [255,255,255,255,255,255,255,255] 1512; AVX2-SLOW-NEXT: vpand %xmm4, %xmm2, %xmm2 1513; AVX2-SLOW-NEXT: vperm2f128 {{.*#+}} ymm5 = ymm0[2,3],ymm1[2,3] 1514; AVX2-SLOW-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0 1515; AVX2-SLOW-NEXT: vshufps {{.*#+}} ymm0 = ymm0[0,2],ymm5[0,2],ymm0[4,6],ymm5[4,6] 1516; AVX2-SLOW-NEXT: vpshufb %ymm3, %ymm0, %ymm0 1517; AVX2-SLOW-NEXT: vpermq {{.*#+}} ymm0 = ymm0[0,2,2,3] 1518; AVX2-SLOW-NEXT: vpand %xmm4, %xmm0, %xmm0 1519; AVX2-SLOW-NEXT: vpackuswb %xmm2, %xmm0, %xmm0 1520; AVX2-SLOW-NEXT: vpsubb {{.*}}(%rip), %xmm0, %xmm0 1521; AVX2-SLOW-NEXT: vzeroupper 1522; AVX2-SLOW-NEXT: retq 1523; 1524; AVX2-FAST-LABEL: trunc_sub_const_v16i64_v16i8: 1525; AVX2-FAST: # %bb.0: 1526; AVX2-FAST-NEXT: vmovdqa {{.*#+}} ymm4 = [0,2,4,6,4,6,6,7] 1527; AVX2-FAST-NEXT: vpermd %ymm2, %ymm4, %ymm2 1528; AVX2-FAST-NEXT: vpermd %ymm3, %ymm4, %ymm3 1529; AVX2-FAST-NEXT: vinserti128 $1, %xmm3, %ymm2, %ymm2 1530; AVX2-FAST-NEXT: vmovdqa {{.*#+}} ymm3 = [0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15,16,17,20,21,24,25,28,29,24,25,28,29,28,29,30,31] 1531; AVX2-FAST-NEXT: vpshufb %ymm3, %ymm2, %ymm2 1532; AVX2-FAST-NEXT: vpermq {{.*#+}} ymm2 = ymm2[0,2,2,3] 1533; AVX2-FAST-NEXT: vmovdqa {{.*#+}} xmm5 = [255,255,255,255,255,255,255,255] 1534; AVX2-FAST-NEXT: vpand %xmm5, %xmm2, %xmm2 1535; AVX2-FAST-NEXT: vpermd %ymm0, %ymm4, %ymm0 1536; AVX2-FAST-NEXT: vpermd %ymm1, %ymm4, %ymm1 1537; AVX2-FAST-NEXT: vinserti128 $1, %xmm1, %ymm0, %ymm0 1538; AVX2-FAST-NEXT: vpshufb %ymm3, %ymm0, %ymm0 1539; AVX2-FAST-NEXT: vpermq {{.*#+}} ymm0 = ymm0[0,2,2,3] 1540; AVX2-FAST-NEXT: vpand %xmm5, %xmm0, %xmm0 1541; AVX2-FAST-NEXT: vpackuswb %xmm2, %xmm0, %xmm0 1542; AVX2-FAST-NEXT: vpsubb {{.*}}(%rip), %xmm0, %xmm0 1543; AVX2-FAST-NEXT: vzeroupper 1544; AVX2-FAST-NEXT: retq 1545; 1546; AVX512-LABEL: trunc_sub_const_v16i64_v16i8: 1547; AVX512: # %bb.0: 1548; AVX512-NEXT: vpmovqd %zmm0, %ymm0 1549; AVX512-NEXT: vpmovqd %zmm1, %ymm1 1550; AVX512-NEXT: vinserti64x4 $1, %ymm1, %zmm0, %zmm0 1551; AVX512-NEXT: vpmovdb %zmm0, %xmm0 1552; AVX512-NEXT: vpsubb {{.*}}(%rip), %xmm0, %xmm0 1553; AVX512-NEXT: vzeroupper 1554; AVX512-NEXT: retq 1555 %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> 1556 %2 = trunc <16 x i64> %1 to <16 x i8> 1557 ret <16 x i8> %2 1558} 1559 1560define <16 x i8> @trunc_sub_const_v16i32_v16i8(<16 x i32> %a0) nounwind { 1561; SSE-LABEL: trunc_sub_const_v16i32_v16i8: 1562; SSE: # %bb.0: 1563; SSE-NEXT: movdqa {{.*#+}} xmm4 = [255,0,0,0,255,0,0,0,255,0,0,0,255,0,0,0] 1564; SSE-NEXT: pand %xmm4, %xmm3 1565; SSE-NEXT: pand %xmm4, %xmm2 1566; SSE-NEXT: packuswb %xmm3, %xmm2 1567; SSE-NEXT: pand %xmm4, %xmm1 1568; SSE-NEXT: pand %xmm4, %xmm0 1569; SSE-NEXT: packuswb %xmm1, %xmm0 1570; SSE-NEXT: packuswb %xmm2, %xmm0 1571; SSE-NEXT: psubb {{.*}}(%rip), %xmm0 1572; SSE-NEXT: retq 1573; 1574; AVX1-LABEL: trunc_sub_const_v16i32_v16i8: 1575; AVX1: # %bb.0: 1576; AVX1-NEXT: vmovaps {{.*#+}} ymm2 = [255,255,255,255,255,255,255,255] 1577; AVX1-NEXT: vandps %ymm2, %ymm1, %ymm1 1578; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm3 1579; AVX1-NEXT: vpackusdw %xmm3, %xmm1, %xmm1 1580; AVX1-NEXT: vandps %ymm2, %ymm0, %ymm0 1581; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2 1582; AVX1-NEXT: vpackusdw %xmm2, %xmm0, %xmm0 1583; AVX1-NEXT: vpackuswb %xmm1, %xmm0, %xmm0 1584; AVX1-NEXT: vpsubb {{.*}}(%rip), %xmm0, %xmm0 1585; AVX1-NEXT: vzeroupper 1586; AVX1-NEXT: retq 1587; 1588; AVX2-LABEL: trunc_sub_const_v16i32_v16i8: 1589; AVX2: # %bb.0: 1590; AVX2-NEXT: vmovdqa {{.*#+}} ymm2 = [0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15,16,17,20,21,24,25,28,29,24,25,28,29,28,29,30,31] 1591; AVX2-NEXT: vpshufb %ymm2, %ymm1, %ymm1 1592; AVX2-NEXT: vpermq {{.*#+}} ymm1 = ymm1[0,2,2,3] 1593; AVX2-NEXT: vmovdqa {{.*#+}} xmm3 = [255,255,255,255,255,255,255,255] 1594; AVX2-NEXT: vpand %xmm3, %xmm1, %xmm1 1595; AVX2-NEXT: vpshufb %ymm2, %ymm0, %ymm0 1596; AVX2-NEXT: vpermq {{.*#+}} ymm0 = ymm0[0,2,2,3] 1597; AVX2-NEXT: vpand %xmm3, %xmm0, %xmm0 1598; AVX2-NEXT: vpackuswb %xmm1, %xmm0, %xmm0 1599; AVX2-NEXT: vpsubb {{.*}}(%rip), %xmm0, %xmm0 1600; AVX2-NEXT: vzeroupper 1601; AVX2-NEXT: retq 1602; 1603; AVX512-LABEL: trunc_sub_const_v16i32_v16i8: 1604; AVX512: # %bb.0: 1605; AVX512-NEXT: vpmovdb %zmm0, %xmm0 1606; AVX512-NEXT: vpsubb {{.*}}(%rip), %xmm0, %xmm0 1607; AVX512-NEXT: vzeroupper 1608; AVX512-NEXT: retq 1609 %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> 1610 %2 = trunc <16 x i32> %1 to <16 x i8> 1611 ret <16 x i8> %2 1612} 1613 1614define <16 x i8> @trunc_sub_const_v16i16_v16i8(<16 x i16> %a0) nounwind { 1615; SSE-LABEL: trunc_sub_const_v16i16_v16i8: 1616; SSE: # %bb.0: 1617; SSE-NEXT: movdqa {{.*#+}} xmm2 = [255,255,255,255,255,255,255,255] 1618; SSE-NEXT: pand %xmm2, %xmm1 1619; SSE-NEXT: pand %xmm2, %xmm0 1620; SSE-NEXT: packuswb %xmm1, %xmm0 1621; SSE-NEXT: psubb {{.*}}(%rip), %xmm0 1622; SSE-NEXT: retq 1623; 1624; AVX1-LABEL: trunc_sub_const_v16i16_v16i8: 1625; AVX1: # %bb.0: 1626; AVX1-NEXT: vandps {{.*}}(%rip), %ymm0, %ymm0 1627; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1 1628; AVX1-NEXT: vpackuswb %xmm1, %xmm0, %xmm0 1629; AVX1-NEXT: vpsubb {{.*}}(%rip), %xmm0, %xmm0 1630; AVX1-NEXT: vzeroupper 1631; AVX1-NEXT: retq 1632; 1633; AVX2-LABEL: trunc_sub_const_v16i16_v16i8: 1634; AVX2: # %bb.0: 1635; AVX2-NEXT: vpand {{.*}}(%rip), %ymm0, %ymm0 1636; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1 1637; AVX2-NEXT: vpackuswb %xmm1, %xmm0, %xmm0 1638; AVX2-NEXT: vpsubb {{.*}}(%rip), %xmm0, %xmm0 1639; AVX2-NEXT: vzeroupper 1640; AVX2-NEXT: retq 1641; 1642; AVX512F-LABEL: trunc_sub_const_v16i16_v16i8: 1643; AVX512F: # %bb.0: 1644; 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],zero 1645; AVX512F-NEXT: vpmovdb %zmm0, %xmm0 1646; AVX512F-NEXT: vpsubb {{.*}}(%rip), %xmm0, %xmm0 1647; AVX512F-NEXT: vzeroupper 1648; AVX512F-NEXT: retq 1649; 1650; AVX512BW-LABEL: trunc_sub_const_v16i16_v16i8: 1651; AVX512BW: # %bb.0: 1652; AVX512BW-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm0 1653; AVX512BW-NEXT: vpmovwb %zmm0, %ymm0 1654; AVX512BW-NEXT: vpsubb {{.*}}(%rip), %xmm0, %xmm0 1655; AVX512BW-NEXT: vzeroupper 1656; AVX512BW-NEXT: retq 1657; 1658; AVX512DQ-LABEL: trunc_sub_const_v16i16_v16i8: 1659; AVX512DQ: # %bb.0: 1660; 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],zero 1661; AVX512DQ-NEXT: vpmovdb %zmm0, %xmm0 1662; AVX512DQ-NEXT: vpsubb {{.*}}(%rip), %xmm0, %xmm0 1663; AVX512DQ-NEXT: vzeroupper 1664; AVX512DQ-NEXT: retq 1665 %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> 1666 %2 = trunc <16 x i16> %1 to <16 x i8> 1667 ret <16 x i8> %2 1668} 1669 1670define <16 x i8> @trunc_ext_sub_const_rhs_v16i16_v16i8(<16 x i8> %x) { 1671; SSE-LABEL: trunc_ext_sub_const_rhs_v16i16_v16i8: 1672; SSE: # %bb.0: 1673; SSE-NEXT: psubb {{.*}}(%rip), %xmm0 1674; SSE-NEXT: retq 1675; 1676; AVX-LABEL: trunc_ext_sub_const_rhs_v16i16_v16i8: 1677; AVX: # %bb.0: 1678; AVX-NEXT: vpsubb {{.*}}(%rip), %xmm0, %xmm0 1679; AVX-NEXT: retq 1680 %a = zext <16 x i8> %x to <16 x i16> 1681 %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> 1682 %c = trunc <16 x i16> %b to <16 x i8> 1683 ret <16 x i8> %c 1684} 1685 1686define <16 x i8> @trunc_ext_sub_const_lhs_v16i16_v16i8(<16 x i8> %x) { 1687; SSE-LABEL: trunc_ext_sub_const_lhs_v16i16_v16i8: 1688; SSE: # %bb.0: 1689; SSE-NEXT: movdqa {{.*#+}} xmm1 = [0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15] 1690; SSE-NEXT: psubb %xmm0, %xmm1 1691; SSE-NEXT: movdqa %xmm1, %xmm0 1692; SSE-NEXT: retq 1693; 1694; AVX-LABEL: trunc_ext_sub_const_lhs_v16i16_v16i8: 1695; AVX: # %bb.0: 1696; AVX-NEXT: vmovdqa {{.*#+}} xmm1 = [0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15] 1697; AVX-NEXT: vpsubb %xmm0, %xmm1, %xmm0 1698; AVX-NEXT: retq 1699 %a = zext <16 x i8> %x to <16 x i16> 1700 %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>, %a 1701 %c = trunc <16 x i16> %b to <16 x i8> 1702 ret <16 x i8> %c 1703} 1704 1705; 1706; mul 1707; 1708 1709define <4 x i32> @trunc_mul_v4i64_v4i32(<4 x i64> %a0, <4 x i64> %a1) nounwind { 1710; SSE-LABEL: trunc_mul_v4i64_v4i32: 1711; SSE: # %bb.0: 1712; SSE-NEXT: pmuludq %xmm3, %xmm1 1713; SSE-NEXT: pmuludq %xmm2, %xmm0 1714; SSE-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,2],xmm1[0,2] 1715; SSE-NEXT: retq 1716; 1717; AVX1-LABEL: trunc_mul_v4i64_v4i32: 1718; AVX1: # %bb.0: 1719; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2 1720; AVX1-NEXT: vshufps {{.*#+}} xmm1 = xmm1[0,2],xmm2[0,2] 1721; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2 1722; AVX1-NEXT: vshufps {{.*#+}} xmm0 = xmm0[0,2],xmm2[0,2] 1723; AVX1-NEXT: vpmulld %xmm1, %xmm0, %xmm0 1724; AVX1-NEXT: vzeroupper 1725; AVX1-NEXT: retq 1726; 1727; AVX2-SLOW-LABEL: trunc_mul_v4i64_v4i32: 1728; AVX2-SLOW: # %bb.0: 1729; AVX2-SLOW-NEXT: vextractf128 $1, %ymm1, %xmm2 1730; AVX2-SLOW-NEXT: vshufps {{.*#+}} xmm1 = xmm1[0,2],xmm2[0,2] 1731; AVX2-SLOW-NEXT: vextractf128 $1, %ymm0, %xmm2 1732; AVX2-SLOW-NEXT: vshufps {{.*#+}} xmm0 = xmm0[0,2],xmm2[0,2] 1733; AVX2-SLOW-NEXT: vpmulld %xmm1, %xmm0, %xmm0 1734; AVX2-SLOW-NEXT: vzeroupper 1735; AVX2-SLOW-NEXT: retq 1736; 1737; AVX2-FAST-LABEL: trunc_mul_v4i64_v4i32: 1738; AVX2-FAST: # %bb.0: 1739; AVX2-FAST-NEXT: vmovdqa {{.*#+}} ymm2 = [0,2,4,6,4,6,6,7] 1740; AVX2-FAST-NEXT: vpermd %ymm1, %ymm2, %ymm1 1741; AVX2-FAST-NEXT: vpermd %ymm0, %ymm2, %ymm0 1742; AVX2-FAST-NEXT: vpmulld %xmm1, %xmm0, %xmm0 1743; AVX2-FAST-NEXT: vzeroupper 1744; AVX2-FAST-NEXT: retq 1745; 1746; AVX512F-LABEL: trunc_mul_v4i64_v4i32: 1747; AVX512F: # %bb.0: 1748; AVX512F-NEXT: # kill: def $ymm1 killed $ymm1 def $zmm1 1749; AVX512F-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm0 1750; AVX512F-NEXT: vpmovqd %zmm1, %ymm1 1751; AVX512F-NEXT: vpmovqd %zmm0, %ymm0 1752; AVX512F-NEXT: vpmulld %xmm1, %xmm0, %xmm0 1753; AVX512F-NEXT: vzeroupper 1754; AVX512F-NEXT: retq 1755; 1756; AVX512BW-LABEL: trunc_mul_v4i64_v4i32: 1757; AVX512BW: # %bb.0: 1758; AVX512BW-NEXT: # kill: def $ymm1 killed $ymm1 def $zmm1 1759; AVX512BW-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm0 1760; AVX512BW-NEXT: vpmovqd %zmm1, %ymm1 1761; AVX512BW-NEXT: vpmovqd %zmm0, %ymm0 1762; AVX512BW-NEXT: vpmulld %xmm1, %xmm0, %xmm0 1763; AVX512BW-NEXT: vzeroupper 1764; AVX512BW-NEXT: retq 1765; 1766; AVX512DQ-LABEL: trunc_mul_v4i64_v4i32: 1767; AVX512DQ: # %bb.0: 1768; AVX512DQ-NEXT: # kill: def $ymm1 killed $ymm1 def $zmm1 1769; AVX512DQ-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm0 1770; AVX512DQ-NEXT: vpmullq %zmm1, %zmm0, %zmm0 1771; AVX512DQ-NEXT: vpmovqd %zmm0, %ymm0 1772; AVX512DQ-NEXT: # kill: def $xmm0 killed $xmm0 killed $ymm0 1773; AVX512DQ-NEXT: vzeroupper 1774; AVX512DQ-NEXT: retq 1775 %1 = mul <4 x i64> %a0, %a1 1776 %2 = trunc <4 x i64> %1 to <4 x i32> 1777 ret <4 x i32> %2 1778} 1779 1780define <8 x i16> @trunc_mul_v8i64_v8i16(<8 x i64> %a0, <8 x i64> %a1) nounwind { 1781; SSE-LABEL: trunc_mul_v8i64_v8i16: 1782; SSE: # %bb.0: 1783; SSE-NEXT: pshufd {{.*#+}} xmm5 = xmm5[0,2,2,3] 1784; SSE-NEXT: pshuflw {{.*#+}} xmm5 = xmm5[0,2,2,3,4,5,6,7] 1785; SSE-NEXT: pshufd {{.*#+}} xmm4 = xmm4[0,2,2,3] 1786; SSE-NEXT: pshuflw {{.*#+}} xmm4 = xmm4[0,2,2,3,4,5,6,7] 1787; SSE-NEXT: punpckldq {{.*#+}} xmm4 = xmm4[0],xmm5[0],xmm4[1],xmm5[1] 1788; SSE-NEXT: pshufd {{.*#+}} xmm5 = xmm7[0,2,2,3] 1789; SSE-NEXT: pshuflw {{.*#+}} xmm5 = xmm5[0,1,0,2,4,5,6,7] 1790; SSE-NEXT: pshufd {{.*#+}} xmm6 = xmm6[0,2,2,3] 1791; SSE-NEXT: pshuflw {{.*#+}} xmm6 = xmm6[0,1,0,2,4,5,6,7] 1792; SSE-NEXT: punpckldq {{.*#+}} xmm6 = xmm6[0],xmm5[0],xmm6[1],xmm5[1] 1793; SSE-NEXT: movsd {{.*#+}} xmm6 = xmm4[0],xmm6[1] 1794; SSE-NEXT: pshufd {{.*#+}} xmm1 = xmm1[0,2,2,3] 1795; SSE-NEXT: pshuflw {{.*#+}} xmm1 = xmm1[0,2,2,3,4,5,6,7] 1796; SSE-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3] 1797; SSE-NEXT: pshuflw {{.*#+}} xmm4 = xmm0[0,2,2,3,4,5,6,7] 1798; SSE-NEXT: punpckldq {{.*#+}} xmm4 = xmm4[0],xmm1[0],xmm4[1],xmm1[1] 1799; SSE-NEXT: pshufd {{.*#+}} xmm0 = xmm3[0,2,2,3] 1800; SSE-NEXT: pshuflw {{.*#+}} xmm1 = xmm0[0,1,0,2,4,5,6,7] 1801; SSE-NEXT: pshufd {{.*#+}} xmm0 = xmm2[0,2,2,3] 1802; SSE-NEXT: pshuflw {{.*#+}} xmm0 = xmm0[0,1,0,2,4,5,6,7] 1803; SSE-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1] 1804; SSE-NEXT: movsd {{.*#+}} xmm0 = xmm4[0],xmm0[1] 1805; SSE-NEXT: pmullw %xmm6, %xmm0 1806; SSE-NEXT: retq 1807; 1808; AVX1-LABEL: trunc_mul_v8i64_v8i16: 1809; AVX1: # %bb.0: 1810; AVX1-NEXT: vmovaps {{.*#+}} ymm4 = [65535,65535,65535,65535] 1811; AVX1-NEXT: vandps %ymm4, %ymm3, %ymm3 1812; AVX1-NEXT: vextractf128 $1, %ymm3, %xmm5 1813; AVX1-NEXT: vpackusdw %xmm5, %xmm3, %xmm3 1814; AVX1-NEXT: vandps %ymm4, %ymm2, %ymm2 1815; AVX1-NEXT: vextractf128 $1, %ymm2, %xmm5 1816; AVX1-NEXT: vpackusdw %xmm5, %xmm2, %xmm2 1817; AVX1-NEXT: vpackusdw %xmm3, %xmm2, %xmm2 1818; AVX1-NEXT: vandps %ymm4, %ymm1, %ymm1 1819; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm3 1820; AVX1-NEXT: vpackusdw %xmm3, %xmm1, %xmm1 1821; AVX1-NEXT: vandps %ymm4, %ymm0, %ymm0 1822; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm3 1823; AVX1-NEXT: vpackusdw %xmm3, %xmm0, %xmm0 1824; AVX1-NEXT: vpackusdw %xmm1, %xmm0, %xmm0 1825; AVX1-NEXT: vpmullw %xmm2, %xmm0, %xmm0 1826; AVX1-NEXT: vzeroupper 1827; AVX1-NEXT: retq 1828; 1829; AVX2-SLOW-LABEL: trunc_mul_v8i64_v8i16: 1830; AVX2-SLOW: # %bb.0: 1831; AVX2-SLOW-NEXT: vperm2f128 {{.*#+}} ymm4 = ymm2[2,3],ymm3[2,3] 1832; AVX2-SLOW-NEXT: vinsertf128 $1, %xmm3, %ymm2, %ymm2 1833; AVX2-SLOW-NEXT: vshufps {{.*#+}} ymm2 = ymm2[0,2],ymm4[0,2],ymm2[4,6],ymm4[4,6] 1834; AVX2-SLOW-NEXT: vmovdqa {{.*#+}} ymm3 = [0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15,16,17,20,21,24,25,28,29,24,25,28,29,28,29,30,31] 1835; AVX2-SLOW-NEXT: vpshufb %ymm3, %ymm2, %ymm2 1836; AVX2-SLOW-NEXT: vpermq {{.*#+}} ymm2 = ymm2[0,2,2,3] 1837; AVX2-SLOW-NEXT: vperm2f128 {{.*#+}} ymm4 = ymm0[2,3],ymm1[2,3] 1838; AVX2-SLOW-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0 1839; AVX2-SLOW-NEXT: vshufps {{.*#+}} ymm0 = ymm0[0,2],ymm4[0,2],ymm0[4,6],ymm4[4,6] 1840; AVX2-SLOW-NEXT: vpshufb %ymm3, %ymm0, %ymm0 1841; AVX2-SLOW-NEXT: vpermq {{.*#+}} ymm0 = ymm0[0,2,2,3] 1842; AVX2-SLOW-NEXT: vpmullw %xmm2, %xmm0, %xmm0 1843; AVX2-SLOW-NEXT: vzeroupper 1844; AVX2-SLOW-NEXT: retq 1845; 1846; AVX2-FAST-LABEL: trunc_mul_v8i64_v8i16: 1847; AVX2-FAST: # %bb.0: 1848; AVX2-FAST-NEXT: vmovdqa {{.*#+}} ymm4 = [0,2,4,6,4,6,6,7] 1849; AVX2-FAST-NEXT: vpermd %ymm2, %ymm4, %ymm2 1850; AVX2-FAST-NEXT: vpermd %ymm3, %ymm4, %ymm3 1851; AVX2-FAST-NEXT: vinserti128 $1, %xmm3, %ymm2, %ymm2 1852; AVX2-FAST-NEXT: vmovdqa {{.*#+}} ymm3 = [0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15,16,17,20,21,24,25,28,29,24,25,28,29,28,29,30,31] 1853; AVX2-FAST-NEXT: vpshufb %ymm3, %ymm2, %ymm2 1854; AVX2-FAST-NEXT: vpermq {{.*#+}} ymm2 = ymm2[0,2,2,3] 1855; AVX2-FAST-NEXT: vpermd %ymm0, %ymm4, %ymm0 1856; AVX2-FAST-NEXT: vpermd %ymm1, %ymm4, %ymm1 1857; AVX2-FAST-NEXT: vinserti128 $1, %xmm1, %ymm0, %ymm0 1858; AVX2-FAST-NEXT: vpshufb %ymm3, %ymm0, %ymm0 1859; AVX2-FAST-NEXT: vpermq {{.*#+}} ymm0 = ymm0[0,2,2,3] 1860; AVX2-FAST-NEXT: vpmullw %xmm2, %xmm0, %xmm0 1861; AVX2-FAST-NEXT: vzeroupper 1862; AVX2-FAST-NEXT: retq 1863; 1864; AVX512F-LABEL: trunc_mul_v8i64_v8i16: 1865; AVX512F: # %bb.0: 1866; AVX512F-NEXT: vpmovqw %zmm1, %xmm1 1867; AVX512F-NEXT: vpmovqw %zmm0, %xmm0 1868; AVX512F-NEXT: vpmullw %xmm1, %xmm0, %xmm0 1869; AVX512F-NEXT: vzeroupper 1870; AVX512F-NEXT: retq 1871; 1872; AVX512BW-LABEL: trunc_mul_v8i64_v8i16: 1873; AVX512BW: # %bb.0: 1874; AVX512BW-NEXT: vpmovqw %zmm1, %xmm1 1875; AVX512BW-NEXT: vpmovqw %zmm0, %xmm0 1876; AVX512BW-NEXT: vpmullw %xmm1, %xmm0, %xmm0 1877; AVX512BW-NEXT: vzeroupper 1878; AVX512BW-NEXT: retq 1879; 1880; AVX512DQ-LABEL: trunc_mul_v8i64_v8i16: 1881; AVX512DQ: # %bb.0: 1882; AVX512DQ-NEXT: vpmullq %zmm1, %zmm0, %zmm0 1883; AVX512DQ-NEXT: vpmovqw %zmm0, %xmm0 1884; AVX512DQ-NEXT: vzeroupper 1885; AVX512DQ-NEXT: retq 1886 %1 = mul <8 x i64> %a0, %a1 1887 %2 = trunc <8 x i64> %1 to <8 x i16> 1888 ret <8 x i16> %2 1889} 1890 1891define <8 x i16> @trunc_mul_v8i32_v8i16(<8 x i32> %a0, <8 x i32> %a1) nounwind { 1892; SSE-LABEL: trunc_mul_v8i32_v8i16: 1893; SSE: # %bb.0: 1894; SSE-NEXT: pshufd {{.*#+}} xmm4 = xmm0[1,1,3,3] 1895; SSE-NEXT: pmuludq %xmm2, %xmm0 1896; SSE-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3] 1897; SSE-NEXT: pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3] 1898; SSE-NEXT: pmuludq %xmm4, %xmm2 1899; SSE-NEXT: pshufd {{.*#+}} xmm2 = xmm2[0,2,2,3] 1900; SSE-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1] 1901; SSE-NEXT: pshufd {{.*#+}} xmm2 = xmm1[1,1,3,3] 1902; SSE-NEXT: pmuludq %xmm3, %xmm1 1903; SSE-NEXT: pshufd {{.*#+}} xmm1 = xmm1[0,2,2,3] 1904; SSE-NEXT: pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3] 1905; SSE-NEXT: pmuludq %xmm2, %xmm3 1906; SSE-NEXT: pshufd {{.*#+}} xmm2 = xmm3[0,2,2,3] 1907; SSE-NEXT: punpckldq {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1] 1908; SSE-NEXT: pslld $16, %xmm1 1909; SSE-NEXT: psrad $16, %xmm1 1910; SSE-NEXT: pslld $16, %xmm0 1911; SSE-NEXT: psrad $16, %xmm0 1912; SSE-NEXT: packssdw %xmm1, %xmm0 1913; SSE-NEXT: retq 1914; 1915; AVX1-LABEL: trunc_mul_v8i32_v8i16: 1916; AVX1: # %bb.0: 1917; AVX1-NEXT: vpmulld %xmm1, %xmm0, %xmm2 1918; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm1 1919; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm0 1920; AVX1-NEXT: vpmulld %xmm1, %xmm0, %xmm0 1921; AVX1-NEXT: vmovdqa {{.*#+}} xmm1 = [0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15] 1922; AVX1-NEXT: vpshufb %xmm1, %xmm0, %xmm0 1923; AVX1-NEXT: vpshufb %xmm1, %xmm2, %xmm1 1924; AVX1-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm1[0],xmm0[0] 1925; AVX1-NEXT: vzeroupper 1926; AVX1-NEXT: retq 1927; 1928; AVX2-LABEL: trunc_mul_v8i32_v8i16: 1929; AVX2: # %bb.0: 1930; AVX2-NEXT: vpmulld %ymm1, %ymm0, %ymm0 1931; AVX2-NEXT: vpshufb {{.*#+}} ymm0 = ymm0[0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15,16,17,20,21,24,25,28,29,24,25,28,29,28,29,30,31] 1932; AVX2-NEXT: vpermq {{.*#+}} ymm0 = ymm0[0,2,2,3] 1933; AVX2-NEXT: # kill: def $xmm0 killed $xmm0 killed $ymm0 1934; AVX2-NEXT: vzeroupper 1935; AVX2-NEXT: retq 1936; 1937; AVX512-LABEL: trunc_mul_v8i32_v8i16: 1938; AVX512: # %bb.0: 1939; AVX512-NEXT: vpmulld %ymm1, %ymm0, %ymm0 1940; AVX512-NEXT: vpmovdw %zmm0, %ymm0 1941; AVX512-NEXT: # kill: def $xmm0 killed $xmm0 killed $ymm0 1942; AVX512-NEXT: vzeroupper 1943; AVX512-NEXT: retq 1944 %1 = mul <8 x i32> %a0, %a1 1945 %2 = trunc <8 x i32> %1 to <8 x i16> 1946 ret <8 x i16> %2 1947} 1948 1949define <16 x i8> @trunc_mul_v16i64_v16i8(<16 x i64> %a0, <16 x i64> %a1) nounwind { 1950; SSE-LABEL: trunc_mul_v16i64_v16i8: 1951; SSE: # %bb.0: 1952; SSE-NEXT: pmuludq {{[0-9]+}}(%rsp), %xmm0 1953; SSE-NEXT: pmuludq {{[0-9]+}}(%rsp), %xmm1 1954; SSE-NEXT: pmuludq {{[0-9]+}}(%rsp), %xmm2 1955; SSE-NEXT: pmuludq {{[0-9]+}}(%rsp), %xmm3 1956; SSE-NEXT: pmuludq {{[0-9]+}}(%rsp), %xmm4 1957; SSE-NEXT: pmuludq {{[0-9]+}}(%rsp), %xmm5 1958; SSE-NEXT: pmuludq {{[0-9]+}}(%rsp), %xmm6 1959; SSE-NEXT: pmuludq {{[0-9]+}}(%rsp), %xmm7 1960; SSE-NEXT: movdqa {{.*#+}} xmm8 = [255,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0] 1961; SSE-NEXT: pand %xmm8, %xmm7 1962; SSE-NEXT: pand %xmm8, %xmm6 1963; SSE-NEXT: packuswb %xmm7, %xmm6 1964; SSE-NEXT: pand %xmm8, %xmm5 1965; SSE-NEXT: pand %xmm8, %xmm4 1966; SSE-NEXT: packuswb %xmm5, %xmm4 1967; SSE-NEXT: packuswb %xmm6, %xmm4 1968; SSE-NEXT: pand %xmm8, %xmm3 1969; SSE-NEXT: pand %xmm8, %xmm2 1970; SSE-NEXT: packuswb %xmm3, %xmm2 1971; SSE-NEXT: pand %xmm8, %xmm1 1972; SSE-NEXT: pand %xmm8, %xmm0 1973; SSE-NEXT: packuswb %xmm1, %xmm0 1974; SSE-NEXT: packuswb %xmm2, %xmm0 1975; SSE-NEXT: packuswb %xmm4, %xmm0 1976; SSE-NEXT: retq 1977; 1978; AVX1-LABEL: trunc_mul_v16i64_v16i8: 1979; AVX1: # %bb.0: 1980; AVX1-NEXT: vpmuludq %xmm4, %xmm0, %xmm8 1981; AVX1-NEXT: vextractf128 $1, %ymm4, %xmm4 1982; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm0 1983; AVX1-NEXT: vpmuludq %xmm4, %xmm0, %xmm0 1984; AVX1-NEXT: vpmuludq %xmm5, %xmm1, %xmm4 1985; AVX1-NEXT: vextractf128 $1, %ymm5, %xmm5 1986; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm1 1987; AVX1-NEXT: vpmuludq %xmm5, %xmm1, %xmm1 1988; AVX1-NEXT: vpmuludq %xmm6, %xmm2, %xmm5 1989; AVX1-NEXT: vextractf128 $1, %ymm6, %xmm6 1990; AVX1-NEXT: vextractf128 $1, %ymm2, %xmm2 1991; AVX1-NEXT: vpmuludq %xmm6, %xmm2, %xmm2 1992; AVX1-NEXT: vpmuludq %xmm7, %xmm3, %xmm6 1993; AVX1-NEXT: vextractf128 $1, %ymm7, %xmm7 1994; AVX1-NEXT: vextractf128 $1, %ymm3, %xmm3 1995; AVX1-NEXT: vpmuludq %xmm7, %xmm3, %xmm3 1996; AVX1-NEXT: vmovdqa {{.*#+}} xmm7 = [255,255] 1997; AVX1-NEXT: vpand %xmm7, %xmm3, %xmm3 1998; AVX1-NEXT: vpand %xmm7, %xmm6, %xmm6 1999; AVX1-NEXT: vpackusdw %xmm3, %xmm6, %xmm3 2000; AVX1-NEXT: vpand %xmm7, %xmm2, %xmm2 2001; AVX1-NEXT: vpand %xmm7, %xmm5, %xmm5 2002; AVX1-NEXT: vpackusdw %xmm2, %xmm5, %xmm2 2003; AVX1-NEXT: vpackusdw %xmm3, %xmm2, %xmm2 2004; AVX1-NEXT: vpand %xmm7, %xmm1, %xmm1 2005; AVX1-NEXT: vpand %xmm7, %xmm4, %xmm3 2006; AVX1-NEXT: vpackusdw %xmm1, %xmm3, %xmm1 2007; AVX1-NEXT: vpand %xmm7, %xmm0, %xmm0 2008; AVX1-NEXT: vpand %xmm7, %xmm8, %xmm3 2009; AVX1-NEXT: vpackusdw %xmm0, %xmm3, %xmm0 2010; AVX1-NEXT: vpackusdw %xmm1, %xmm0, %xmm0 2011; AVX1-NEXT: vpackuswb %xmm2, %xmm0, %xmm0 2012; AVX1-NEXT: vzeroupper 2013; AVX1-NEXT: retq 2014; 2015; AVX2-SLOW-LABEL: trunc_mul_v16i64_v16i8: 2016; AVX2-SLOW: # %bb.0: 2017; AVX2-SLOW-NEXT: vextractf128 $1, %ymm7, %xmm8 2018; AVX2-SLOW-NEXT: vshufps {{.*#+}} xmm8 = xmm7[0,2],xmm8[0,2] 2019; AVX2-SLOW-NEXT: vextractf128 $1, %ymm3, %xmm7 2020; AVX2-SLOW-NEXT: vshufps {{.*#+}} xmm3 = xmm3[0,2],xmm7[0,2] 2021; AVX2-SLOW-NEXT: vpmulld %xmm8, %xmm3, %xmm3 2022; AVX2-SLOW-NEXT: vextractf128 $1, %ymm6, %xmm7 2023; AVX2-SLOW-NEXT: vshufps {{.*#+}} xmm6 = xmm6[0,2],xmm7[0,2] 2024; AVX2-SLOW-NEXT: vextractf128 $1, %ymm2, %xmm7 2025; AVX2-SLOW-NEXT: vshufps {{.*#+}} xmm2 = xmm2[0,2],xmm7[0,2] 2026; AVX2-SLOW-NEXT: vpmulld %xmm6, %xmm2, %xmm2 2027; AVX2-SLOW-NEXT: vinserti128 $1, %xmm3, %ymm2, %ymm2 2028; AVX2-SLOW-NEXT: vmovdqa {{.*#+}} ymm3 = [0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15,16,17,20,21,24,25,28,29,24,25,28,29,28,29,30,31] 2029; AVX2-SLOW-NEXT: vpshufb %ymm3, %ymm2, %ymm2 2030; AVX2-SLOW-NEXT: vpermq {{.*#+}} ymm2 = ymm2[0,2,2,3] 2031; AVX2-SLOW-NEXT: vmovdqa {{.*#+}} xmm6 = [255,255,255,255,255,255,255,255] 2032; AVX2-SLOW-NEXT: vpand %xmm6, %xmm2, %xmm2 2033; AVX2-SLOW-NEXT: vextractf128 $1, %ymm5, %xmm7 2034; AVX2-SLOW-NEXT: vshufps {{.*#+}} xmm5 = xmm5[0,2],xmm7[0,2] 2035; AVX2-SLOW-NEXT: vextractf128 $1, %ymm1, %xmm7 2036; AVX2-SLOW-NEXT: vshufps {{.*#+}} xmm1 = xmm1[0,2],xmm7[0,2] 2037; AVX2-SLOW-NEXT: vpmulld %xmm5, %xmm1, %xmm1 2038; AVX2-SLOW-NEXT: vextractf128 $1, %ymm4, %xmm5 2039; AVX2-SLOW-NEXT: vshufps {{.*#+}} xmm4 = xmm4[0,2],xmm5[0,2] 2040; AVX2-SLOW-NEXT: vextractf128 $1, %ymm0, %xmm5 2041; AVX2-SLOW-NEXT: vshufps {{.*#+}} xmm0 = xmm0[0,2],xmm5[0,2] 2042; AVX2-SLOW-NEXT: vpmulld %xmm4, %xmm0, %xmm0 2043; AVX2-SLOW-NEXT: vinserti128 $1, %xmm1, %ymm0, %ymm0 2044; AVX2-SLOW-NEXT: vpshufb %ymm3, %ymm0, %ymm0 2045; AVX2-SLOW-NEXT: vpermq {{.*#+}} ymm0 = ymm0[0,2,2,3] 2046; AVX2-SLOW-NEXT: vpand %xmm6, %xmm0, %xmm0 2047; AVX2-SLOW-NEXT: vpackuswb %xmm2, %xmm0, %xmm0 2048; AVX2-SLOW-NEXT: vzeroupper 2049; AVX2-SLOW-NEXT: retq 2050; 2051; AVX2-FAST-LABEL: trunc_mul_v16i64_v16i8: 2052; AVX2-FAST: # %bb.0: 2053; AVX2-FAST-NEXT: vmovdqa {{.*#+}} ymm8 = [0,2,4,6,4,6,6,7] 2054; AVX2-FAST-NEXT: vpermd %ymm7, %ymm8, %ymm7 2055; AVX2-FAST-NEXT: vpermd %ymm3, %ymm8, %ymm3 2056; AVX2-FAST-NEXT: vpmulld %xmm7, %xmm3, %xmm3 2057; AVX2-FAST-NEXT: vpermd %ymm6, %ymm8, %ymm6 2058; AVX2-FAST-NEXT: vpermd %ymm2, %ymm8, %ymm2 2059; AVX2-FAST-NEXT: vpmulld %xmm6, %xmm2, %xmm2 2060; AVX2-FAST-NEXT: vinserti128 $1, %xmm3, %ymm2, %ymm2 2061; AVX2-FAST-NEXT: vmovdqa {{.*#+}} ymm3 = [0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15,16,17,20,21,24,25,28,29,24,25,28,29,28,29,30,31] 2062; AVX2-FAST-NEXT: vpshufb %ymm3, %ymm2, %ymm2 2063; AVX2-FAST-NEXT: vpermq {{.*#+}} ymm2 = ymm2[0,2,2,3] 2064; AVX2-FAST-NEXT: vmovdqa {{.*#+}} xmm6 = [255,255,255,255,255,255,255,255] 2065; AVX2-FAST-NEXT: vpand %xmm6, %xmm2, %xmm2 2066; AVX2-FAST-NEXT: vpermd %ymm5, %ymm8, %ymm5 2067; AVX2-FAST-NEXT: vpermd %ymm1, %ymm8, %ymm1 2068; AVX2-FAST-NEXT: vpmulld %xmm5, %xmm1, %xmm1 2069; AVX2-FAST-NEXT: vpermd %ymm4, %ymm8, %ymm4 2070; AVX2-FAST-NEXT: vpermd %ymm0, %ymm8, %ymm0 2071; AVX2-FAST-NEXT: vpmulld %xmm4, %xmm0, %xmm0 2072; AVX2-FAST-NEXT: vinserti128 $1, %xmm1, %ymm0, %ymm0 2073; AVX2-FAST-NEXT: vpshufb %ymm3, %ymm0, %ymm0 2074; AVX2-FAST-NEXT: vpermq {{.*#+}} ymm0 = ymm0[0,2,2,3] 2075; AVX2-FAST-NEXT: vpand %xmm6, %xmm0, %xmm0 2076; AVX2-FAST-NEXT: vpackuswb %xmm2, %xmm0, %xmm0 2077; AVX2-FAST-NEXT: vzeroupper 2078; AVX2-FAST-NEXT: retq 2079; 2080; AVX512F-LABEL: trunc_mul_v16i64_v16i8: 2081; AVX512F: # %bb.0: 2082; AVX512F-NEXT: vpmovqd %zmm3, %ymm3 2083; AVX512F-NEXT: vpmovqd %zmm1, %ymm1 2084; AVX512F-NEXT: vpmulld %ymm3, %ymm1, %ymm1 2085; AVX512F-NEXT: vpmovqd %zmm2, %ymm2 2086; AVX512F-NEXT: vpmovqd %zmm0, %ymm0 2087; AVX512F-NEXT: vpmulld %ymm2, %ymm0, %ymm0 2088; AVX512F-NEXT: vinserti64x4 $1, %ymm1, %zmm0, %zmm0 2089; AVX512F-NEXT: vpmovdb %zmm0, %xmm0 2090; AVX512F-NEXT: vzeroupper 2091; AVX512F-NEXT: retq 2092; 2093; AVX512BW-LABEL: trunc_mul_v16i64_v16i8: 2094; AVX512BW: # %bb.0: 2095; AVX512BW-NEXT: vpmovqd %zmm3, %ymm3 2096; AVX512BW-NEXT: vpmovqd %zmm1, %ymm1 2097; AVX512BW-NEXT: vpmulld %ymm3, %ymm1, %ymm1 2098; AVX512BW-NEXT: vpmovqd %zmm2, %ymm2 2099; AVX512BW-NEXT: vpmovqd %zmm0, %ymm0 2100; AVX512BW-NEXT: vpmulld %ymm2, %ymm0, %ymm0 2101; AVX512BW-NEXT: vinserti64x4 $1, %ymm1, %zmm0, %zmm0 2102; AVX512BW-NEXT: vpmovdb %zmm0, %xmm0 2103; AVX512BW-NEXT: vzeroupper 2104; AVX512BW-NEXT: retq 2105; 2106; AVX512DQ-LABEL: trunc_mul_v16i64_v16i8: 2107; AVX512DQ: # %bb.0: 2108; AVX512DQ-NEXT: vpmullq %zmm3, %zmm1, %zmm1 2109; AVX512DQ-NEXT: vpmullq %zmm2, %zmm0, %zmm0 2110; AVX512DQ-NEXT: vpmovqd %zmm0, %ymm0 2111; AVX512DQ-NEXT: vpmovqd %zmm1, %ymm1 2112; AVX512DQ-NEXT: vinserti64x4 $1, %ymm1, %zmm0, %zmm0 2113; AVX512DQ-NEXT: vpmovdb %zmm0, %xmm0 2114; AVX512DQ-NEXT: vzeroupper 2115; AVX512DQ-NEXT: retq 2116 %1 = mul <16 x i64> %a0, %a1 2117 %2 = trunc <16 x i64> %1 to <16 x i8> 2118 ret <16 x i8> %2 2119} 2120 2121define <16 x i8> @trunc_mul_v16i32_v16i8(<16 x i32> %a0, <16 x i32> %a1) nounwind { 2122; SSE-LABEL: trunc_mul_v16i32_v16i8: 2123; SSE: # %bb.0: 2124; SSE-NEXT: pshufd {{.*#+}} xmm8 = xmm0[1,1,3,3] 2125; SSE-NEXT: pmuludq %xmm4, %xmm0 2126; SSE-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3] 2127; SSE-NEXT: pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3] 2128; SSE-NEXT: pmuludq %xmm8, %xmm4 2129; SSE-NEXT: pshufd {{.*#+}} xmm4 = xmm4[0,2,2,3] 2130; SSE-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm4[0],xmm0[1],xmm4[1] 2131; SSE-NEXT: pshufd {{.*#+}} xmm4 = xmm1[1,1,3,3] 2132; SSE-NEXT: pmuludq %xmm5, %xmm1 2133; SSE-NEXT: pshufd {{.*#+}} xmm1 = xmm1[0,2,2,3] 2134; SSE-NEXT: pshufd {{.*#+}} xmm5 = xmm5[1,1,3,3] 2135; SSE-NEXT: pmuludq %xmm4, %xmm5 2136; SSE-NEXT: pshufd {{.*#+}} xmm4 = xmm5[0,2,2,3] 2137; SSE-NEXT: punpckldq {{.*#+}} xmm1 = xmm1[0],xmm4[0],xmm1[1],xmm4[1] 2138; SSE-NEXT: pshufd {{.*#+}} xmm4 = xmm2[1,1,3,3] 2139; SSE-NEXT: pmuludq %xmm6, %xmm2 2140; SSE-NEXT: pshufd {{.*#+}} xmm2 = xmm2[0,2,2,3] 2141; SSE-NEXT: pshufd {{.*#+}} xmm5 = xmm6[1,1,3,3] 2142; SSE-NEXT: pmuludq %xmm4, %xmm5 2143; SSE-NEXT: pshufd {{.*#+}} xmm4 = xmm5[0,2,2,3] 2144; SSE-NEXT: punpckldq {{.*#+}} xmm2 = xmm2[0],xmm4[0],xmm2[1],xmm4[1] 2145; SSE-NEXT: pshufd {{.*#+}} xmm4 = xmm3[1,1,3,3] 2146; SSE-NEXT: pmuludq %xmm7, %xmm3 2147; SSE-NEXT: pshufd {{.*#+}} xmm3 = xmm3[0,2,2,3] 2148; SSE-NEXT: pshufd {{.*#+}} xmm5 = xmm7[1,1,3,3] 2149; SSE-NEXT: pmuludq %xmm4, %xmm5 2150; SSE-NEXT: pshufd {{.*#+}} xmm4 = xmm5[0,2,2,3] 2151; SSE-NEXT: punpckldq {{.*#+}} xmm3 = xmm3[0],xmm4[0],xmm3[1],xmm4[1] 2152; SSE-NEXT: movdqa {{.*#+}} xmm4 = [255,0,0,0,255,0,0,0,255,0,0,0,255,0,0,0] 2153; SSE-NEXT: pand %xmm4, %xmm3 2154; SSE-NEXT: pand %xmm4, %xmm2 2155; SSE-NEXT: packuswb %xmm3, %xmm2 2156; SSE-NEXT: pand %xmm4, %xmm1 2157; SSE-NEXT: pand %xmm4, %xmm0 2158; SSE-NEXT: packuswb %xmm1, %xmm0 2159; SSE-NEXT: packuswb %xmm2, %xmm0 2160; SSE-NEXT: retq 2161; 2162; AVX1-LABEL: trunc_mul_v16i32_v16i8: 2163; AVX1: # %bb.0: 2164; AVX1-NEXT: vpmulld %xmm2, %xmm0, %xmm4 2165; AVX1-NEXT: vextractf128 $1, %ymm2, %xmm2 2166; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm0 2167; AVX1-NEXT: vpmulld %xmm2, %xmm0, %xmm0 2168; AVX1-NEXT: vpmulld %xmm3, %xmm1, %xmm2 2169; AVX1-NEXT: vextractf128 $1, %ymm3, %xmm3 2170; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm1 2171; AVX1-NEXT: vpmulld %xmm3, %xmm1, %xmm1 2172; AVX1-NEXT: vmovdqa {{.*#+}} xmm3 = [255,255,255,255] 2173; AVX1-NEXT: vpand %xmm3, %xmm1, %xmm1 2174; AVX1-NEXT: vpand %xmm3, %xmm2, %xmm2 2175; AVX1-NEXT: vpackusdw %xmm1, %xmm2, %xmm1 2176; AVX1-NEXT: vpand %xmm3, %xmm0, %xmm0 2177; AVX1-NEXT: vpand %xmm3, %xmm4, %xmm2 2178; AVX1-NEXT: vpackusdw %xmm0, %xmm2, %xmm0 2179; AVX1-NEXT: vpackuswb %xmm1, %xmm0, %xmm0 2180; AVX1-NEXT: vzeroupper 2181; AVX1-NEXT: retq 2182; 2183; AVX2-LABEL: trunc_mul_v16i32_v16i8: 2184; AVX2: # %bb.0: 2185; AVX2-NEXT: vpmulld %ymm2, %ymm0, %ymm0 2186; AVX2-NEXT: vpmulld %ymm3, %ymm1, %ymm1 2187; AVX2-NEXT: vmovdqa {{.*#+}} ymm2 = [0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15,16,17,20,21,24,25,28,29,24,25,28,29,28,29,30,31] 2188; AVX2-NEXT: vpshufb %ymm2, %ymm1, %ymm1 2189; AVX2-NEXT: vpermq {{.*#+}} ymm1 = ymm1[0,2,2,3] 2190; AVX2-NEXT: vmovdqa {{.*#+}} xmm3 = [255,255,255,255,255,255,255,255] 2191; AVX2-NEXT: vpand %xmm3, %xmm1, %xmm1 2192; AVX2-NEXT: vpshufb %ymm2, %ymm0, %ymm0 2193; AVX2-NEXT: vpermq {{.*#+}} ymm0 = ymm0[0,2,2,3] 2194; AVX2-NEXT: vpand %xmm3, %xmm0, %xmm0 2195; AVX2-NEXT: vpackuswb %xmm1, %xmm0, %xmm0 2196; AVX2-NEXT: vzeroupper 2197; AVX2-NEXT: retq 2198; 2199; AVX512-LABEL: trunc_mul_v16i32_v16i8: 2200; AVX512: # %bb.0: 2201; AVX512-NEXT: vpmulld %zmm1, %zmm0, %zmm0 2202; AVX512-NEXT: vpmovdb %zmm0, %xmm0 2203; AVX512-NEXT: vzeroupper 2204; AVX512-NEXT: retq 2205 %1 = mul <16 x i32> %a0, %a1 2206 %2 = trunc <16 x i32> %1 to <16 x i8> 2207 ret <16 x i8> %2 2208} 2209 2210define <16 x i8> @trunc_mul_v16i16_v16i8(<16 x i16> %a0, <16 x i16> %a1) nounwind { 2211; SSE-LABEL: trunc_mul_v16i16_v16i8: 2212; SSE: # %bb.0: 2213; SSE-NEXT: pmullw %xmm2, %xmm0 2214; SSE-NEXT: pmullw %xmm3, %xmm1 2215; SSE-NEXT: movdqa {{.*#+}} xmm2 = [255,255,255,255,255,255,255,255] 2216; SSE-NEXT: pand %xmm2, %xmm1 2217; SSE-NEXT: pand %xmm2, %xmm0 2218; SSE-NEXT: packuswb %xmm1, %xmm0 2219; SSE-NEXT: retq 2220; 2221; AVX1-LABEL: trunc_mul_v16i16_v16i8: 2222; AVX1: # %bb.0: 2223; AVX1-NEXT: vpmullw %xmm1, %xmm0, %xmm2 2224; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm1 2225; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm0 2226; AVX1-NEXT: vpmullw %xmm1, %xmm0, %xmm0 2227; AVX1-NEXT: vmovdqa {{.*#+}} xmm1 = [255,255,255,255,255,255,255,255] 2228; AVX1-NEXT: vpand %xmm1, %xmm0, %xmm0 2229; AVX1-NEXT: vpand %xmm1, %xmm2, %xmm1 2230; AVX1-NEXT: vpackuswb %xmm0, %xmm1, %xmm0 2231; AVX1-NEXT: vzeroupper 2232; AVX1-NEXT: retq 2233; 2234; AVX2-LABEL: trunc_mul_v16i16_v16i8: 2235; AVX2: # %bb.0: 2236; AVX2-NEXT: vpmullw %ymm1, %ymm0, %ymm0 2237; AVX2-NEXT: vpand {{.*}}(%rip), %ymm0, %ymm0 2238; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1 2239; AVX2-NEXT: vpackuswb %xmm1, %xmm0, %xmm0 2240; AVX2-NEXT: vzeroupper 2241; AVX2-NEXT: retq 2242; 2243; AVX512F-LABEL: trunc_mul_v16i16_v16i8: 2244; AVX512F: # %bb.0: 2245; AVX512F-NEXT: vpmullw %ymm1, %ymm0, %ymm0 2246; 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],zero 2247; AVX512F-NEXT: vpmovdb %zmm0, %xmm0 2248; AVX512F-NEXT: vzeroupper 2249; AVX512F-NEXT: retq 2250; 2251; AVX512BW-LABEL: trunc_mul_v16i16_v16i8: 2252; AVX512BW: # %bb.0: 2253; AVX512BW-NEXT: vpmullw %ymm1, %ymm0, %ymm0 2254; AVX512BW-NEXT: vpmovwb %zmm0, %ymm0 2255; AVX512BW-NEXT: # kill: def $xmm0 killed $xmm0 killed $ymm0 2256; AVX512BW-NEXT: vzeroupper 2257; AVX512BW-NEXT: retq 2258; 2259; AVX512DQ-LABEL: trunc_mul_v16i16_v16i8: 2260; AVX512DQ: # %bb.0: 2261; AVX512DQ-NEXT: vpmullw %ymm1, %ymm0, %ymm0 2262; 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],zero 2263; AVX512DQ-NEXT: vpmovdb %zmm0, %xmm0 2264; AVX512DQ-NEXT: vzeroupper 2265; AVX512DQ-NEXT: retq 2266 %1 = mul <16 x i16> %a0, %a1 2267 %2 = trunc <16 x i16> %1 to <16 x i8> 2268 ret <16 x i8> %2 2269} 2270 2271define <8 x i16> @trunc_mul_v8i32_v8i16_zext_8i8(<16 x i8> %a0, <8 x i32> %a1) { 2272; SSE-LABEL: trunc_mul_v8i32_v8i16_zext_8i8: 2273; SSE: # %bb.0: 2274; SSE-NEXT: pxor %xmm3, %xmm3 2275; 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] 2276; SSE-NEXT: pslld $16, %xmm2 2277; SSE-NEXT: psrad $16, %xmm2 2278; SSE-NEXT: pslld $16, %xmm1 2279; SSE-NEXT: psrad $16, %xmm1 2280; SSE-NEXT: packssdw %xmm2, %xmm1 2281; SSE-NEXT: pmullw %xmm1, %xmm0 2282; SSE-NEXT: retq 2283; 2284; AVX1-LABEL: trunc_mul_v8i32_v8i16_zext_8i8: 2285; AVX1: # %bb.0: 2286; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2 2287; AVX1-NEXT: vmovdqa {{.*#+}} xmm3 = [0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15] 2288; AVX1-NEXT: vpshufb %xmm3, %xmm2, %xmm2 2289; AVX1-NEXT: vpshufb %xmm3, %xmm1, %xmm1 2290; AVX1-NEXT: vpunpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm2[0] 2291; 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],zero 2292; AVX1-NEXT: vpmullw %xmm1, %xmm0, %xmm0 2293; AVX1-NEXT: vzeroupper 2294; AVX1-NEXT: retq 2295; 2296; AVX2-LABEL: trunc_mul_v8i32_v8i16_zext_8i8: 2297; AVX2: # %bb.0: 2298; 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],zero 2299; AVX2-NEXT: vpshufb {{.*#+}} ymm1 = ymm1[0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15,16,17,20,21,24,25,28,29,24,25,28,29,28,29,30,31] 2300; AVX2-NEXT: vpermq {{.*#+}} ymm1 = ymm1[0,2,2,3] 2301; AVX2-NEXT: vpmullw %xmm1, %xmm0, %xmm0 2302; AVX2-NEXT: vzeroupper 2303; AVX2-NEXT: retq 2304; 2305; AVX512-LABEL: trunc_mul_v8i32_v8i16_zext_8i8: 2306; AVX512: # %bb.0: 2307; AVX512-NEXT: # kill: def $ymm1 killed $ymm1 def $zmm1 2308; AVX512-NEXT: vpmovdw %zmm1, %ymm1 2309; 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],zero 2310; AVX512-NEXT: vpmullw %xmm1, %xmm0, %xmm0 2311; AVX512-NEXT: vzeroupper 2312; AVX512-NEXT: retq 2313 %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> 2314 %2 = zext <8 x i8> %1 to <8 x i32> 2315 %3 = mul <8 x i32> %2, %a1 2316 %4 = trunc <8 x i32> %3 to <8 x i16> 2317 ret <8 x i16> %4 2318} 2319 2320; 2321; mul to constant 2322; 2323 2324define <4 x i32> @trunc_mul_const_v4i64_v4i32(<4 x i64> %a0) nounwind { 2325; SSE-LABEL: trunc_mul_const_v4i64_v4i32: 2326; SSE: # %bb.0: 2327; SSE-NEXT: pmuludq {{.*}}(%rip), %xmm1 2328; SSE-NEXT: pmuludq {{.*}}(%rip), %xmm0 2329; SSE-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,2],xmm1[0,2] 2330; SSE-NEXT: retq 2331; 2332; AVX1-LABEL: trunc_mul_const_v4i64_v4i32: 2333; AVX1: # %bb.0: 2334; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1 2335; AVX1-NEXT: vshufps {{.*#+}} xmm0 = xmm0[0,2],xmm1[0,2] 2336; AVX1-NEXT: vpmulld {{.*}}(%rip), %xmm0, %xmm0 2337; AVX1-NEXT: vzeroupper 2338; AVX1-NEXT: retq 2339; 2340; AVX2-SLOW-LABEL: trunc_mul_const_v4i64_v4i32: 2341; AVX2-SLOW: # %bb.0: 2342; AVX2-SLOW-NEXT: vextractf128 $1, %ymm0, %xmm1 2343; AVX2-SLOW-NEXT: vshufps {{.*#+}} xmm0 = xmm0[0,2],xmm1[0,2] 2344; AVX2-SLOW-NEXT: vpmulld {{.*}}(%rip), %xmm0, %xmm0 2345; AVX2-SLOW-NEXT: vzeroupper 2346; AVX2-SLOW-NEXT: retq 2347; 2348; AVX2-FAST-LABEL: trunc_mul_const_v4i64_v4i32: 2349; AVX2-FAST: # %bb.0: 2350; AVX2-FAST-NEXT: vmovdqa {{.*#+}} ymm1 = [0,2,4,6,4,6,6,7] 2351; AVX2-FAST-NEXT: vpermd %ymm0, %ymm1, %ymm0 2352; AVX2-FAST-NEXT: vpmulld {{.*}}(%rip), %xmm0, %xmm0 2353; AVX2-FAST-NEXT: vzeroupper 2354; AVX2-FAST-NEXT: retq 2355; 2356; AVX512-LABEL: trunc_mul_const_v4i64_v4i32: 2357; AVX512: # %bb.0: 2358; AVX512-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm0 2359; AVX512-NEXT: vpmovqd %zmm0, %ymm0 2360; AVX512-NEXT: vpmulld {{.*}}(%rip), %xmm0, %xmm0 2361; AVX512-NEXT: vzeroupper 2362; AVX512-NEXT: retq 2363 %1 = mul <4 x i64> %a0, <i64 0, i64 1, i64 2, i64 3> 2364 %2 = trunc <4 x i64> %1 to <4 x i32> 2365 ret <4 x i32> %2 2366} 2367 2368define <8 x i16> @trunc_mul_const_v8i64_v8i16(<8 x i64> %a0) nounwind { 2369; SSE-LABEL: trunc_mul_const_v8i64_v8i16: 2370; SSE: # %bb.0: 2371; SSE-NEXT: pshufd {{.*#+}} xmm1 = xmm1[0,2,2,3] 2372; SSE-NEXT: pshuflw {{.*#+}} xmm1 = xmm1[0,2,2,3,4,5,6,7] 2373; SSE-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3] 2374; SSE-NEXT: pshuflw {{.*#+}} xmm4 = xmm0[0,2,2,3,4,5,6,7] 2375; SSE-NEXT: punpckldq {{.*#+}} xmm4 = xmm4[0],xmm1[0],xmm4[1],xmm1[1] 2376; SSE-NEXT: pshufd {{.*#+}} xmm0 = xmm3[0,2,2,3] 2377; SSE-NEXT: pshuflw {{.*#+}} xmm1 = xmm0[0,1,0,2,4,5,6,7] 2378; SSE-NEXT: pshufd {{.*#+}} xmm0 = xmm2[0,2,2,3] 2379; SSE-NEXT: pshuflw {{.*#+}} xmm0 = xmm0[0,1,0,2,4,5,6,7] 2380; SSE-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1] 2381; SSE-NEXT: movsd {{.*#+}} xmm0 = xmm4[0],xmm0[1] 2382; SSE-NEXT: pmullw {{.*}}(%rip), %xmm0 2383; SSE-NEXT: retq 2384; 2385; AVX1-LABEL: trunc_mul_const_v8i64_v8i16: 2386; AVX1: # %bb.0: 2387; AVX1-NEXT: vmovaps {{.*#+}} ymm2 = [65535,65535,65535,65535] 2388; AVX1-NEXT: vandps %ymm2, %ymm1, %ymm1 2389; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm3 2390; AVX1-NEXT: vpackusdw %xmm3, %xmm1, %xmm1 2391; AVX1-NEXT: vandps %ymm2, %ymm0, %ymm0 2392; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2 2393; AVX1-NEXT: vpackusdw %xmm2, %xmm0, %xmm0 2394; AVX1-NEXT: vpackusdw %xmm1, %xmm0, %xmm0 2395; AVX1-NEXT: vpmullw {{.*}}(%rip), %xmm0, %xmm0 2396; AVX1-NEXT: vzeroupper 2397; AVX1-NEXT: retq 2398; 2399; AVX2-SLOW-LABEL: trunc_mul_const_v8i64_v8i16: 2400; AVX2-SLOW: # %bb.0: 2401; AVX2-SLOW-NEXT: vperm2f128 {{.*#+}} ymm2 = ymm0[2,3],ymm1[2,3] 2402; AVX2-SLOW-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0 2403; AVX2-SLOW-NEXT: vshufps {{.*#+}} ymm0 = ymm0[0,2],ymm2[0,2],ymm0[4,6],ymm2[4,6] 2404; AVX2-SLOW-NEXT: vpshufb {{.*#+}} ymm0 = ymm0[0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15,16,17,20,21,24,25,28,29,24,25,28,29,28,29,30,31] 2405; AVX2-SLOW-NEXT: vpermq {{.*#+}} ymm0 = ymm0[0,2,2,3] 2406; AVX2-SLOW-NEXT: vpmullw {{.*}}(%rip), %xmm0, %xmm0 2407; AVX2-SLOW-NEXT: vzeroupper 2408; AVX2-SLOW-NEXT: retq 2409; 2410; AVX2-FAST-LABEL: trunc_mul_const_v8i64_v8i16: 2411; AVX2-FAST: # %bb.0: 2412; AVX2-FAST-NEXT: vmovdqa {{.*#+}} ymm2 = [0,2,4,6,4,6,6,7] 2413; AVX2-FAST-NEXT: vpermd %ymm0, %ymm2, %ymm0 2414; AVX2-FAST-NEXT: vpermd %ymm1, %ymm2, %ymm1 2415; AVX2-FAST-NEXT: vinserti128 $1, %xmm1, %ymm0, %ymm0 2416; AVX2-FAST-NEXT: vpshufb {{.*#+}} ymm0 = ymm0[0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15,16,17,20,21,24,25,28,29,24,25,28,29,28,29,30,31] 2417; AVX2-FAST-NEXT: vpermq {{.*#+}} ymm0 = ymm0[0,2,2,3] 2418; AVX2-FAST-NEXT: vpmullw {{.*}}(%rip), %xmm0, %xmm0 2419; AVX2-FAST-NEXT: vzeroupper 2420; AVX2-FAST-NEXT: retq 2421; 2422; AVX512-LABEL: trunc_mul_const_v8i64_v8i16: 2423; AVX512: # %bb.0: 2424; AVX512-NEXT: vpmovqw %zmm0, %xmm0 2425; AVX512-NEXT: vpmullw {{.*}}(%rip), %xmm0, %xmm0 2426; AVX512-NEXT: vzeroupper 2427; AVX512-NEXT: retq 2428 %1 = mul <8 x i64> %a0, <i64 0, i64 1, i64 2, i64 3, i64 4, i64 5, i64 6, i64 7> 2429 %2 = trunc <8 x i64> %1 to <8 x i16> 2430 ret <8 x i16> %2 2431} 2432 2433define <8 x i16> @trunc_mul_const_v8i32_v8i16(<8 x i32> %a0) nounwind { 2434; SSE-LABEL: trunc_mul_const_v8i32_v8i16: 2435; SSE: # %bb.0: 2436; SSE-NEXT: pslld $16, %xmm1 2437; SSE-NEXT: psrad $16, %xmm1 2438; SSE-NEXT: pslld $16, %xmm0 2439; SSE-NEXT: psrad $16, %xmm0 2440; SSE-NEXT: packssdw %xmm1, %xmm0 2441; SSE-NEXT: pmullw {{.*}}(%rip), %xmm0 2442; SSE-NEXT: retq 2443; 2444; AVX1-LABEL: trunc_mul_const_v8i32_v8i16: 2445; AVX1: # %bb.0: 2446; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1 2447; AVX1-NEXT: vmovdqa {{.*#+}} xmm2 = [0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15] 2448; AVX1-NEXT: vpshufb %xmm2, %xmm1, %xmm1 2449; AVX1-NEXT: vpshufb %xmm2, %xmm0, %xmm0 2450; AVX1-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0] 2451; AVX1-NEXT: vpmullw {{.*}}(%rip), %xmm0, %xmm0 2452; AVX1-NEXT: vzeroupper 2453; AVX1-NEXT: retq 2454; 2455; AVX2-LABEL: trunc_mul_const_v8i32_v8i16: 2456; AVX2: # %bb.0: 2457; AVX2-NEXT: vpshufb {{.*#+}} ymm0 = ymm0[0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15,16,17,20,21,24,25,28,29,24,25,28,29,28,29,30,31] 2458; AVX2-NEXT: vpermq {{.*#+}} ymm0 = ymm0[0,2,2,3] 2459; AVX2-NEXT: vpmullw {{.*}}(%rip), %xmm0, %xmm0 2460; AVX2-NEXT: vzeroupper 2461; AVX2-NEXT: retq 2462; 2463; AVX512-LABEL: trunc_mul_const_v8i32_v8i16: 2464; AVX512: # %bb.0: 2465; AVX512-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm0 2466; AVX512-NEXT: vpmovdw %zmm0, %ymm0 2467; AVX512-NEXT: vpmullw {{.*}}(%rip), %xmm0, %xmm0 2468; AVX512-NEXT: vzeroupper 2469; AVX512-NEXT: retq 2470 %1 = mul <8 x i32> %a0, <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7> 2471 %2 = trunc <8 x i32> %1 to <8 x i16> 2472 ret <8 x i16> %2 2473} 2474 2475define <16 x i8> @trunc_mul_const_v16i64_v16i8(<16 x i64> %a0) nounwind { 2476; SSE-LABEL: trunc_mul_const_v16i64_v16i8: 2477; SSE: # %bb.0: 2478; SSE-NEXT: pmuludq {{.*}}(%rip), %xmm0 2479; SSE-NEXT: pmuludq {{.*}}(%rip), %xmm1 2480; SSE-NEXT: pmuludq {{.*}}(%rip), %xmm2 2481; SSE-NEXT: pmuludq {{.*}}(%rip), %xmm3 2482; SSE-NEXT: pmuludq {{.*}}(%rip), %xmm4 2483; SSE-NEXT: pmuludq {{.*}}(%rip), %xmm5 2484; SSE-NEXT: pmuludq {{.*}}(%rip), %xmm6 2485; SSE-NEXT: pmuludq {{.*}}(%rip), %xmm7 2486; SSE-NEXT: movdqa {{.*#+}} xmm8 = [255,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0] 2487; SSE-NEXT: pand %xmm8, %xmm7 2488; SSE-NEXT: pand %xmm8, %xmm6 2489; SSE-NEXT: packuswb %xmm7, %xmm6 2490; SSE-NEXT: pand %xmm8, %xmm5 2491; SSE-NEXT: pand %xmm8, %xmm4 2492; SSE-NEXT: packuswb %xmm5, %xmm4 2493; SSE-NEXT: packuswb %xmm6, %xmm4 2494; SSE-NEXT: pand %xmm8, %xmm3 2495; SSE-NEXT: pand %xmm8, %xmm2 2496; SSE-NEXT: packuswb %xmm3, %xmm2 2497; SSE-NEXT: pand %xmm8, %xmm1 2498; SSE-NEXT: pand %xmm8, %xmm0 2499; SSE-NEXT: packuswb %xmm1, %xmm0 2500; SSE-NEXT: packuswb %xmm2, %xmm0 2501; SSE-NEXT: packuswb %xmm4, %xmm0 2502; SSE-NEXT: retq 2503; 2504; AVX1-LABEL: trunc_mul_const_v16i64_v16i8: 2505; AVX1: # %bb.0: 2506; AVX1-NEXT: vpmuludq {{.*}}(%rip), %xmm0, %xmm8 2507; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm0 2508; AVX1-NEXT: vpmuludq {{.*}}(%rip), %xmm0, %xmm0 2509; AVX1-NEXT: vpmuludq {{.*}}(%rip), %xmm1, %xmm5 2510; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm1 2511; AVX1-NEXT: vpmuludq {{.*}}(%rip), %xmm1, %xmm1 2512; AVX1-NEXT: vpmuludq {{.*}}(%rip), %xmm2, %xmm6 2513; AVX1-NEXT: vextractf128 $1, %ymm2, %xmm2 2514; AVX1-NEXT: vpmuludq {{.*}}(%rip), %xmm2, %xmm2 2515; AVX1-NEXT: vpmuludq {{.*}}(%rip), %xmm3, %xmm7 2516; AVX1-NEXT: vextractf128 $1, %ymm3, %xmm3 2517; AVX1-NEXT: vpmuludq {{.*}}(%rip), %xmm3, %xmm3 2518; AVX1-NEXT: vmovdqa {{.*#+}} xmm4 = [255,255] 2519; AVX1-NEXT: vpand %xmm4, %xmm3, %xmm3 2520; AVX1-NEXT: vpand %xmm4, %xmm7, %xmm7 2521; AVX1-NEXT: vpackusdw %xmm3, %xmm7, %xmm3 2522; AVX1-NEXT: vpand %xmm4, %xmm2, %xmm2 2523; AVX1-NEXT: vpand %xmm4, %xmm6, %xmm6 2524; AVX1-NEXT: vpackusdw %xmm2, %xmm6, %xmm2 2525; AVX1-NEXT: vpackusdw %xmm3, %xmm2, %xmm2 2526; AVX1-NEXT: vpand %xmm4, %xmm1, %xmm1 2527; AVX1-NEXT: vpand %xmm4, %xmm5, %xmm3 2528; AVX1-NEXT: vpackusdw %xmm1, %xmm3, %xmm1 2529; AVX1-NEXT: vpand %xmm4, %xmm0, %xmm0 2530; AVX1-NEXT: vpand %xmm4, %xmm8, %xmm3 2531; AVX1-NEXT: vpackusdw %xmm0, %xmm3, %xmm0 2532; AVX1-NEXT: vpackusdw %xmm1, %xmm0, %xmm0 2533; AVX1-NEXT: vpackuswb %xmm2, %xmm0, %xmm0 2534; AVX1-NEXT: vzeroupper 2535; AVX1-NEXT: retq 2536; 2537; AVX2-SLOW-LABEL: trunc_mul_const_v16i64_v16i8: 2538; AVX2-SLOW: # %bb.0: 2539; AVX2-SLOW-NEXT: vextractf128 $1, %ymm2, %xmm4 2540; AVX2-SLOW-NEXT: vshufps {{.*#+}} xmm2 = xmm2[0,2],xmm4[0,2] 2541; AVX2-SLOW-NEXT: vpmulld {{.*}}(%rip), %xmm2, %xmm2 2542; AVX2-SLOW-NEXT: vextractf128 $1, %ymm3, %xmm4 2543; AVX2-SLOW-NEXT: vshufps {{.*#+}} xmm3 = xmm3[0,2],xmm4[0,2] 2544; AVX2-SLOW-NEXT: vpmulld {{.*}}(%rip), %xmm3, %xmm3 2545; AVX2-SLOW-NEXT: vinserti128 $1, %xmm3, %ymm2, %ymm2 2546; AVX2-SLOW-NEXT: vmovdqa {{.*#+}} ymm3 = [0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15,16,17,20,21,24,25,28,29,24,25,28,29,28,29,30,31] 2547; AVX2-SLOW-NEXT: vpshufb %ymm3, %ymm2, %ymm2 2548; AVX2-SLOW-NEXT: vpermq {{.*#+}} ymm2 = ymm2[0,2,2,3] 2549; AVX2-SLOW-NEXT: vmovdqa {{.*#+}} xmm4 = [255,255,255,255,255,255,255,255] 2550; AVX2-SLOW-NEXT: vpand %xmm4, %xmm2, %xmm2 2551; AVX2-SLOW-NEXT: vextractf128 $1, %ymm0, %xmm5 2552; AVX2-SLOW-NEXT: vshufps {{.*#+}} xmm0 = xmm0[0,2],xmm5[0,2] 2553; AVX2-SLOW-NEXT: vpmulld {{.*}}(%rip), %xmm0, %xmm0 2554; AVX2-SLOW-NEXT: vextractf128 $1, %ymm1, %xmm5 2555; AVX2-SLOW-NEXT: vshufps {{.*#+}} xmm1 = xmm1[0,2],xmm5[0,2] 2556; AVX2-SLOW-NEXT: vpmulld {{.*}}(%rip), %xmm1, %xmm1 2557; AVX2-SLOW-NEXT: vinserti128 $1, %xmm1, %ymm0, %ymm0 2558; AVX2-SLOW-NEXT: vpshufb %ymm3, %ymm0, %ymm0 2559; AVX2-SLOW-NEXT: vpermq {{.*#+}} ymm0 = ymm0[0,2,2,3] 2560; AVX2-SLOW-NEXT: vpand %xmm4, %xmm0, %xmm0 2561; AVX2-SLOW-NEXT: vpackuswb %xmm2, %xmm0, %xmm0 2562; AVX2-SLOW-NEXT: vzeroupper 2563; AVX2-SLOW-NEXT: retq 2564; 2565; AVX2-FAST-LABEL: trunc_mul_const_v16i64_v16i8: 2566; AVX2-FAST: # %bb.0: 2567; AVX2-FAST-NEXT: vmovdqa {{.*#+}} ymm4 = [0,2,4,6,4,6,6,7] 2568; AVX2-FAST-NEXT: vpermd %ymm2, %ymm4, %ymm2 2569; AVX2-FAST-NEXT: vpmulld {{.*}}(%rip), %xmm2, %xmm2 2570; AVX2-FAST-NEXT: vpermd %ymm3, %ymm4, %ymm3 2571; AVX2-FAST-NEXT: vpmulld {{.*}}(%rip), %xmm3, %xmm3 2572; AVX2-FAST-NEXT: vinserti128 $1, %xmm3, %ymm2, %ymm2 2573; AVX2-FAST-NEXT: vmovdqa {{.*#+}} ymm3 = [0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15,16,17,20,21,24,25,28,29,24,25,28,29,28,29,30,31] 2574; AVX2-FAST-NEXT: vpshufb %ymm3, %ymm2, %ymm2 2575; AVX2-FAST-NEXT: vpermq {{.*#+}} ymm2 = ymm2[0,2,2,3] 2576; AVX2-FAST-NEXT: vmovdqa {{.*#+}} xmm5 = [255,255,255,255,255,255,255,255] 2577; AVX2-FAST-NEXT: vpand %xmm5, %xmm2, %xmm2 2578; AVX2-FAST-NEXT: vpermd %ymm0, %ymm4, %ymm0 2579; AVX2-FAST-NEXT: vpmulld {{.*}}(%rip), %xmm0, %xmm0 2580; AVX2-FAST-NEXT: vpermd %ymm1, %ymm4, %ymm1 2581; AVX2-FAST-NEXT: vpmulld {{.*}}(%rip), %xmm1, %xmm1 2582; AVX2-FAST-NEXT: vinserti128 $1, %xmm1, %ymm0, %ymm0 2583; AVX2-FAST-NEXT: vpshufb %ymm3, %ymm0, %ymm0 2584; AVX2-FAST-NEXT: vpermq {{.*#+}} ymm0 = ymm0[0,2,2,3] 2585; AVX2-FAST-NEXT: vpand %xmm5, %xmm0, %xmm0 2586; AVX2-FAST-NEXT: vpackuswb %xmm2, %xmm0, %xmm0 2587; AVX2-FAST-NEXT: vzeroupper 2588; AVX2-FAST-NEXT: retq 2589; 2590; AVX512-LABEL: trunc_mul_const_v16i64_v16i8: 2591; AVX512: # %bb.0: 2592; AVX512-NEXT: vpmovqd %zmm0, %ymm0 2593; AVX512-NEXT: vpmulld {{.*}}(%rip), %ymm0, %ymm0 2594; AVX512-NEXT: vpmovqd %zmm1, %ymm1 2595; AVX512-NEXT: vpmulld {{.*}}(%rip), %ymm1, %ymm1 2596; AVX512-NEXT: vinserti64x4 $1, %ymm1, %zmm0, %zmm0 2597; AVX512-NEXT: vpmovdb %zmm0, %xmm0 2598; AVX512-NEXT: vzeroupper 2599; AVX512-NEXT: retq 2600 %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> 2601 %2 = trunc <16 x i64> %1 to <16 x i8> 2602 ret <16 x i8> %2 2603} 2604 2605define <16 x i8> @trunc_mul_const_v16i32_v16i8(<16 x i32> %a0) nounwind { 2606; SSE-LABEL: trunc_mul_const_v16i32_v16i8: 2607; SSE: # %bb.0: 2608; SSE-NEXT: movdqa {{.*#+}} xmm4 = [0,1,2,3] 2609; SSE-NEXT: pshufd {{.*#+}} xmm5 = xmm0[1,1,3,3] 2610; SSE-NEXT: pmuludq %xmm4, %xmm0 2611; SSE-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3] 2612; SSE-NEXT: pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3] 2613; SSE-NEXT: pmuludq %xmm5, %xmm4 2614; SSE-NEXT: pshufd {{.*#+}} xmm4 = xmm4[0,2,2,3] 2615; SSE-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm4[0],xmm0[1],xmm4[1] 2616; SSE-NEXT: movdqa {{.*#+}} xmm4 = [4,5,6,7] 2617; SSE-NEXT: pshufd {{.*#+}} xmm5 = xmm1[1,1,3,3] 2618; SSE-NEXT: pmuludq %xmm4, %xmm1 2619; SSE-NEXT: pshufd {{.*#+}} xmm1 = xmm1[0,2,2,3] 2620; SSE-NEXT: pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3] 2621; SSE-NEXT: pmuludq %xmm5, %xmm4 2622; SSE-NEXT: pshufd {{.*#+}} xmm4 = xmm4[0,2,2,3] 2623; SSE-NEXT: punpckldq {{.*#+}} xmm1 = xmm1[0],xmm4[0],xmm1[1],xmm4[1] 2624; SSE-NEXT: movdqa {{.*#+}} xmm4 = [8,9,10,11] 2625; SSE-NEXT: pshufd {{.*#+}} xmm5 = xmm2[1,1,3,3] 2626; SSE-NEXT: pmuludq %xmm4, %xmm2 2627; SSE-NEXT: pshufd {{.*#+}} xmm2 = xmm2[0,2,2,3] 2628; SSE-NEXT: pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3] 2629; SSE-NEXT: pmuludq %xmm5, %xmm4 2630; SSE-NEXT: pshufd {{.*#+}} xmm4 = xmm4[0,2,2,3] 2631; SSE-NEXT: punpckldq {{.*#+}} xmm2 = xmm2[0],xmm4[0],xmm2[1],xmm4[1] 2632; SSE-NEXT: movdqa {{.*#+}} xmm4 = [12,13,14,15] 2633; SSE-NEXT: pshufd {{.*#+}} xmm5 = xmm3[1,1,3,3] 2634; SSE-NEXT: pmuludq %xmm4, %xmm3 2635; SSE-NEXT: pshufd {{.*#+}} xmm3 = xmm3[0,2,2,3] 2636; SSE-NEXT: pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3] 2637; SSE-NEXT: pmuludq %xmm5, %xmm4 2638; SSE-NEXT: pshufd {{.*#+}} xmm4 = xmm4[0,2,2,3] 2639; SSE-NEXT: punpckldq {{.*#+}} xmm3 = xmm3[0],xmm4[0],xmm3[1],xmm4[1] 2640; SSE-NEXT: movdqa {{.*#+}} xmm4 = [255,0,0,0,255,0,0,0,255,0,0,0,255,0,0,0] 2641; SSE-NEXT: pand %xmm4, %xmm3 2642; SSE-NEXT: pand %xmm4, %xmm2 2643; SSE-NEXT: packuswb %xmm3, %xmm2 2644; SSE-NEXT: pand %xmm4, %xmm1 2645; SSE-NEXT: pand %xmm4, %xmm0 2646; SSE-NEXT: packuswb %xmm1, %xmm0 2647; SSE-NEXT: packuswb %xmm2, %xmm0 2648; SSE-NEXT: retq 2649; 2650; AVX1-LABEL: trunc_mul_const_v16i32_v16i8: 2651; AVX1: # %bb.0: 2652; AVX1-NEXT: vpmulld {{.*}}(%rip), %xmm0, %xmm2 2653; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm0 2654; AVX1-NEXT: vpmulld {{.*}}(%rip), %xmm0, %xmm0 2655; AVX1-NEXT: vpmulld {{.*}}(%rip), %xmm1, %xmm3 2656; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm1 2657; AVX1-NEXT: vpmulld {{.*}}(%rip), %xmm1, %xmm1 2658; AVX1-NEXT: vmovdqa {{.*#+}} xmm4 = [255,255,255,255] 2659; AVX1-NEXT: vpand %xmm4, %xmm1, %xmm1 2660; AVX1-NEXT: vpand %xmm4, %xmm3, %xmm3 2661; AVX1-NEXT: vpackusdw %xmm1, %xmm3, %xmm1 2662; AVX1-NEXT: vpand %xmm4, %xmm0, %xmm0 2663; AVX1-NEXT: vpand %xmm4, %xmm2, %xmm2 2664; AVX1-NEXT: vpackusdw %xmm0, %xmm2, %xmm0 2665; AVX1-NEXT: vpackuswb %xmm1, %xmm0, %xmm0 2666; AVX1-NEXT: vzeroupper 2667; AVX1-NEXT: retq 2668; 2669; AVX2-LABEL: trunc_mul_const_v16i32_v16i8: 2670; AVX2: # %bb.0: 2671; AVX2-NEXT: vmovdqa {{.*#+}} ymm2 = [0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15,16,17,20,21,24,25,28,29,24,25,28,29,28,29,30,31] 2672; AVX2-NEXT: vpshufb %ymm2, %ymm1, %ymm1 2673; AVX2-NEXT: vpermq {{.*#+}} ymm1 = ymm1[0,2,2,3] 2674; AVX2-NEXT: vpmullw {{.*}}(%rip), %xmm1, %xmm1 2675; AVX2-NEXT: vmovdqa {{.*#+}} xmm3 = [255,255,255,255,255,255,255,255] 2676; AVX2-NEXT: vpand %xmm3, %xmm1, %xmm1 2677; AVX2-NEXT: vpshufb %ymm2, %ymm0, %ymm0 2678; AVX2-NEXT: vpermq {{.*#+}} ymm0 = ymm0[0,2,2,3] 2679; AVX2-NEXT: vpmullw {{.*}}(%rip), %xmm0, %xmm0 2680; AVX2-NEXT: vpand %xmm3, %xmm0, %xmm0 2681; AVX2-NEXT: vpackuswb %xmm1, %xmm0, %xmm0 2682; AVX2-NEXT: vzeroupper 2683; AVX2-NEXT: retq 2684; 2685; AVX512-LABEL: trunc_mul_const_v16i32_v16i8: 2686; AVX512: # %bb.0: 2687; AVX512-NEXT: vpmulld {{.*}}(%rip), %zmm0, %zmm0 2688; AVX512-NEXT: vpmovdb %zmm0, %xmm0 2689; AVX512-NEXT: vzeroupper 2690; AVX512-NEXT: retq 2691 %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> 2692 %2 = trunc <16 x i32> %1 to <16 x i8> 2693 ret <16 x i8> %2 2694} 2695 2696define <16 x i8> @trunc_mul_const_v16i16_v16i8(<16 x i16> %a0) nounwind { 2697; SSE-LABEL: trunc_mul_const_v16i16_v16i8: 2698; SSE: # %bb.0: 2699; SSE-NEXT: pmullw {{.*}}(%rip), %xmm0 2700; SSE-NEXT: pmullw {{.*}}(%rip), %xmm1 2701; SSE-NEXT: movdqa {{.*#+}} xmm2 = [255,255,255,255,255,255,255,255] 2702; SSE-NEXT: pand %xmm2, %xmm1 2703; SSE-NEXT: pand %xmm2, %xmm0 2704; SSE-NEXT: packuswb %xmm1, %xmm0 2705; SSE-NEXT: retq 2706; 2707; AVX1-LABEL: trunc_mul_const_v16i16_v16i8: 2708; AVX1: # %bb.0: 2709; AVX1-NEXT: vpmullw {{.*}}(%rip), %xmm0, %xmm1 2710; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm0 2711; AVX1-NEXT: vpmullw {{.*}}(%rip), %xmm0, %xmm0 2712; AVX1-NEXT: vmovdqa {{.*#+}} xmm2 = [255,255,255,255,255,255,255,255] 2713; AVX1-NEXT: vpand %xmm2, %xmm0, %xmm0 2714; AVX1-NEXT: vpand %xmm2, %xmm1, %xmm1 2715; AVX1-NEXT: vpackuswb %xmm0, %xmm1, %xmm0 2716; AVX1-NEXT: vzeroupper 2717; AVX1-NEXT: retq 2718; 2719; AVX2-LABEL: trunc_mul_const_v16i16_v16i8: 2720; AVX2: # %bb.0: 2721; AVX2-NEXT: vpmullw {{.*}}(%rip), %ymm0, %ymm0 2722; AVX2-NEXT: vpand {{.*}}(%rip), %ymm0, %ymm0 2723; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1 2724; AVX2-NEXT: vpackuswb %xmm1, %xmm0, %xmm0 2725; AVX2-NEXT: vzeroupper 2726; AVX2-NEXT: retq 2727; 2728; AVX512F-LABEL: trunc_mul_const_v16i16_v16i8: 2729; AVX512F: # %bb.0: 2730; AVX512F-NEXT: vpmullw {{.*}}(%rip), %ymm0, %ymm0 2731; 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],zero 2732; AVX512F-NEXT: vpmovdb %zmm0, %xmm0 2733; AVX512F-NEXT: vzeroupper 2734; AVX512F-NEXT: retq 2735; 2736; AVX512BW-LABEL: trunc_mul_const_v16i16_v16i8: 2737; AVX512BW: # %bb.0: 2738; AVX512BW-NEXT: vpmullw {{.*}}(%rip), %ymm0, %ymm0 2739; AVX512BW-NEXT: vpmovwb %zmm0, %ymm0 2740; AVX512BW-NEXT: # kill: def $xmm0 killed $xmm0 killed $ymm0 2741; AVX512BW-NEXT: vzeroupper 2742; AVX512BW-NEXT: retq 2743; 2744; AVX512DQ-LABEL: trunc_mul_const_v16i16_v16i8: 2745; AVX512DQ: # %bb.0: 2746; AVX512DQ-NEXT: vpmullw {{.*}}(%rip), %ymm0, %ymm0 2747; 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],zero 2748; AVX512DQ-NEXT: vpmovdb %zmm0, %xmm0 2749; AVX512DQ-NEXT: vzeroupper 2750; AVX512DQ-NEXT: retq 2751 %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> 2752 %2 = trunc <16 x i16> %1 to <16 x i8> 2753 ret <16 x i8> %2 2754} 2755 2756; 2757; and 2758; 2759 2760define <4 x i32> @trunc_and_v4i64_v4i32(<4 x i64> %a0, <4 x i64> %a1) nounwind { 2761; SSE-LABEL: trunc_and_v4i64_v4i32: 2762; SSE: # %bb.0: 2763; SSE-NEXT: andps %xmm3, %xmm1 2764; SSE-NEXT: andps %xmm2, %xmm0 2765; SSE-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,2],xmm1[0,2] 2766; SSE-NEXT: retq 2767; 2768; AVX1-LABEL: trunc_and_v4i64_v4i32: 2769; AVX1: # %bb.0: 2770; AVX1-NEXT: vandps %ymm1, %ymm0, %ymm0 2771; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1 2772; AVX1-NEXT: vshufps {{.*#+}} xmm0 = xmm0[0,2],xmm1[0,2] 2773; AVX1-NEXT: vzeroupper 2774; AVX1-NEXT: retq 2775; 2776; AVX2-SLOW-LABEL: trunc_and_v4i64_v4i32: 2777; AVX2-SLOW: # %bb.0: 2778; AVX2-SLOW-NEXT: vandps %ymm1, %ymm0, %ymm0 2779; AVX2-SLOW-NEXT: vextractf128 $1, %ymm0, %xmm1 2780; AVX2-SLOW-NEXT: vshufps {{.*#+}} xmm0 = xmm0[0,2],xmm1[0,2] 2781; AVX2-SLOW-NEXT: vzeroupper 2782; AVX2-SLOW-NEXT: retq 2783; 2784; AVX2-FAST-LABEL: trunc_and_v4i64_v4i32: 2785; AVX2-FAST: # %bb.0: 2786; AVX2-FAST-NEXT: vandps %ymm1, %ymm0, %ymm0 2787; AVX2-FAST-NEXT: vmovaps {{.*#+}} ymm1 = [0,2,4,6,4,6,6,7] 2788; AVX2-FAST-NEXT: vpermps %ymm0, %ymm1, %ymm0 2789; AVX2-FAST-NEXT: # kill: def $xmm0 killed $xmm0 killed $ymm0 2790; AVX2-FAST-NEXT: vzeroupper 2791; AVX2-FAST-NEXT: retq 2792; 2793; AVX512-LABEL: trunc_and_v4i64_v4i32: 2794; AVX512: # %bb.0: 2795; AVX512-NEXT: vpand %ymm1, %ymm0, %ymm0 2796; AVX512-NEXT: vpmovqd %zmm0, %ymm0 2797; AVX512-NEXT: # kill: def $xmm0 killed $xmm0 killed $ymm0 2798; AVX512-NEXT: vzeroupper 2799; AVX512-NEXT: retq 2800 %1 = and <4 x i64> %a0, %a1 2801 %2 = trunc <4 x i64> %1 to <4 x i32> 2802 ret <4 x i32> %2 2803} 2804 2805define <8 x i16> @trunc_and_v8i64_v8i16(<8 x i64> %a0, <8 x i64> %a1) nounwind { 2806; SSE-LABEL: trunc_and_v8i64_v8i16: 2807; SSE: # %bb.0: 2808; SSE-NEXT: pand %xmm6, %xmm2 2809; SSE-NEXT: pand %xmm7, %xmm3 2810; SSE-NEXT: pand %xmm4, %xmm0 2811; SSE-NEXT: pand %xmm5, %xmm1 2812; SSE-NEXT: pshufd {{.*#+}} xmm1 = xmm1[0,2,2,3] 2813; SSE-NEXT: pshuflw {{.*#+}} xmm1 = xmm1[0,2,2,3,4,5,6,7] 2814; SSE-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3] 2815; SSE-NEXT: pshuflw {{.*#+}} xmm4 = xmm0[0,2,2,3,4,5,6,7] 2816; SSE-NEXT: punpckldq {{.*#+}} xmm4 = xmm4[0],xmm1[0],xmm4[1],xmm1[1] 2817; SSE-NEXT: pshufd {{.*#+}} xmm0 = xmm3[0,2,2,3] 2818; SSE-NEXT: pshuflw {{.*#+}} xmm1 = xmm0[0,1,0,2,4,5,6,7] 2819; SSE-NEXT: pshufd {{.*#+}} xmm0 = xmm2[0,2,2,3] 2820; SSE-NEXT: pshuflw {{.*#+}} xmm0 = xmm0[0,1,0,2,4,5,6,7] 2821; SSE-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1] 2822; SSE-NEXT: movsd {{.*#+}} xmm0 = xmm4[0],xmm0[1] 2823; SSE-NEXT: retq 2824; 2825; AVX1-LABEL: trunc_and_v8i64_v8i16: 2826; AVX1: # %bb.0: 2827; AVX1-NEXT: vmovaps {{.*#+}} ymm4 = [65535,65535,65535,65535] 2828; AVX1-NEXT: vandps %ymm4, %ymm3, %ymm3 2829; AVX1-NEXT: vandps %ymm3, %ymm1, %ymm1 2830; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm3 2831; AVX1-NEXT: vpackusdw %xmm3, %xmm1, %xmm1 2832; AVX1-NEXT: vandps %ymm4, %ymm2, %ymm2 2833; AVX1-NEXT: vandps %ymm2, %ymm0, %ymm0 2834; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2 2835; AVX1-NEXT: vpackusdw %xmm2, %xmm0, %xmm0 2836; AVX1-NEXT: vpackusdw %xmm1, %xmm0, %xmm0 2837; AVX1-NEXT: vzeroupper 2838; AVX1-NEXT: retq 2839; 2840; AVX2-SLOW-LABEL: trunc_and_v8i64_v8i16: 2841; AVX2-SLOW: # %bb.0: 2842; AVX2-SLOW-NEXT: vandps %ymm3, %ymm1, %ymm1 2843; AVX2-SLOW-NEXT: vandps %ymm2, %ymm0, %ymm0 2844; AVX2-SLOW-NEXT: vperm2f128 {{.*#+}} ymm2 = ymm0[2,3],ymm1[2,3] 2845; AVX2-SLOW-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0 2846; AVX2-SLOW-NEXT: vshufps {{.*#+}} ymm0 = ymm0[0,2],ymm2[0,2],ymm0[4,6],ymm2[4,6] 2847; AVX2-SLOW-NEXT: vpshufb {{.*#+}} ymm0 = ymm0[0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15,16,17,20,21,24,25,28,29,24,25,28,29,28,29,30,31] 2848; AVX2-SLOW-NEXT: vpermq {{.*#+}} ymm0 = ymm0[0,2,2,3] 2849; AVX2-SLOW-NEXT: # kill: def $xmm0 killed $xmm0 killed $ymm0 2850; AVX2-SLOW-NEXT: vzeroupper 2851; AVX2-SLOW-NEXT: retq 2852; 2853; AVX2-FAST-LABEL: trunc_and_v8i64_v8i16: 2854; AVX2-FAST: # %bb.0: 2855; AVX2-FAST-NEXT: vpand %ymm3, %ymm1, %ymm1 2856; AVX2-FAST-NEXT: vpand %ymm2, %ymm0, %ymm0 2857; AVX2-FAST-NEXT: vmovdqa {{.*#+}} ymm2 = [0,2,4,6,4,6,6,7] 2858; AVX2-FAST-NEXT: vpermd %ymm0, %ymm2, %ymm0 2859; AVX2-FAST-NEXT: vpermd %ymm1, %ymm2, %ymm1 2860; AVX2-FAST-NEXT: vinserti128 $1, %xmm1, %ymm0, %ymm0 2861; AVX2-FAST-NEXT: vpshufb {{.*#+}} ymm0 = ymm0[0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15,16,17,20,21,24,25,28,29,24,25,28,29,28,29,30,31] 2862; AVX2-FAST-NEXT: vpermq {{.*#+}} ymm0 = ymm0[0,2,2,3] 2863; AVX2-FAST-NEXT: # kill: def $xmm0 killed $xmm0 killed $ymm0 2864; AVX2-FAST-NEXT: vzeroupper 2865; AVX2-FAST-NEXT: retq 2866; 2867; AVX512-LABEL: trunc_and_v8i64_v8i16: 2868; AVX512: # %bb.0: 2869; AVX512-NEXT: vpandq %zmm1, %zmm0, %zmm0 2870; AVX512-NEXT: vpmovqw %zmm0, %xmm0 2871; AVX512-NEXT: vzeroupper 2872; AVX512-NEXT: retq 2873 %1 = and <8 x i64> %a0, %a1 2874 %2 = trunc <8 x i64> %1 to <8 x i16> 2875 ret <8 x i16> %2 2876} 2877 2878define <8 x i16> @trunc_and_v8i32_v8i16(<8 x i32> %a0, <8 x i32> %a1) nounwind { 2879; SSE-LABEL: trunc_and_v8i32_v8i16: 2880; SSE: # %bb.0: 2881; SSE-NEXT: pand %xmm2, %xmm0 2882; SSE-NEXT: pand %xmm3, %xmm1 2883; SSE-NEXT: pslld $16, %xmm1 2884; SSE-NEXT: psrad $16, %xmm1 2885; SSE-NEXT: pslld $16, %xmm0 2886; SSE-NEXT: psrad $16, %xmm0 2887; SSE-NEXT: packssdw %xmm1, %xmm0 2888; SSE-NEXT: retq 2889; 2890; AVX1-LABEL: trunc_and_v8i32_v8i16: 2891; AVX1: # %bb.0: 2892; AVX1-NEXT: vandps %ymm1, %ymm0, %ymm0 2893; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1 2894; AVX1-NEXT: vmovdqa {{.*#+}} xmm2 = [0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15] 2895; AVX1-NEXT: vpshufb %xmm2, %xmm1, %xmm1 2896; AVX1-NEXT: vpshufb %xmm2, %xmm0, %xmm0 2897; AVX1-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0] 2898; AVX1-NEXT: vzeroupper 2899; AVX1-NEXT: retq 2900; 2901; AVX2-LABEL: trunc_and_v8i32_v8i16: 2902; AVX2: # %bb.0: 2903; AVX2-NEXT: vpand %ymm1, %ymm0, %ymm0 2904; AVX2-NEXT: vpshufb {{.*#+}} ymm0 = ymm0[0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15,16,17,20,21,24,25,28,29,24,25,28,29,28,29,30,31] 2905; AVX2-NEXT: vpermq {{.*#+}} ymm0 = ymm0[0,2,2,3] 2906; AVX2-NEXT: # kill: def $xmm0 killed $xmm0 killed $ymm0 2907; AVX2-NEXT: vzeroupper 2908; AVX2-NEXT: retq 2909; 2910; AVX512-LABEL: trunc_and_v8i32_v8i16: 2911; AVX512: # %bb.0: 2912; AVX512-NEXT: vpand %ymm1, %ymm0, %ymm0 2913; AVX512-NEXT: vpmovdw %zmm0, %ymm0 2914; AVX512-NEXT: # kill: def $xmm0 killed $xmm0 killed $ymm0 2915; AVX512-NEXT: vzeroupper 2916; AVX512-NEXT: retq 2917 %1 = and <8 x i32> %a0, %a1 2918 %2 = trunc <8 x i32> %1 to <8 x i16> 2919 ret <8 x i16> %2 2920} 2921 2922define <16 x i8> @trunc_and_v16i64_v16i8(<16 x i64> %a0, <16 x i64> %a1) nounwind { 2923; SSE-LABEL: trunc_and_v16i64_v16i8: 2924; SSE: # %bb.0: 2925; SSE-NEXT: pand {{[0-9]+}}(%rsp), %xmm0 2926; SSE-NEXT: pand {{[0-9]+}}(%rsp), %xmm1 2927; SSE-NEXT: pand {{[0-9]+}}(%rsp), %xmm2 2928; SSE-NEXT: pand {{[0-9]+}}(%rsp), %xmm3 2929; SSE-NEXT: pand {{[0-9]+}}(%rsp), %xmm4 2930; SSE-NEXT: pand {{[0-9]+}}(%rsp), %xmm5 2931; SSE-NEXT: pand {{[0-9]+}}(%rsp), %xmm6 2932; SSE-NEXT: pand {{[0-9]+}}(%rsp), %xmm7 2933; SSE-NEXT: movdqa {{.*#+}} xmm8 = [255,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0] 2934; SSE-NEXT: pand %xmm8, %xmm7 2935; SSE-NEXT: pand %xmm8, %xmm6 2936; SSE-NEXT: packuswb %xmm7, %xmm6 2937; SSE-NEXT: pand %xmm8, %xmm5 2938; SSE-NEXT: pand %xmm8, %xmm4 2939; SSE-NEXT: packuswb %xmm5, %xmm4 2940; SSE-NEXT: packuswb %xmm6, %xmm4 2941; SSE-NEXT: pand %xmm8, %xmm3 2942; SSE-NEXT: pand %xmm8, %xmm2 2943; SSE-NEXT: packuswb %xmm3, %xmm2 2944; SSE-NEXT: pand %xmm8, %xmm1 2945; SSE-NEXT: pand %xmm8, %xmm0 2946; SSE-NEXT: packuswb %xmm1, %xmm0 2947; SSE-NEXT: packuswb %xmm2, %xmm0 2948; SSE-NEXT: packuswb %xmm4, %xmm0 2949; SSE-NEXT: retq 2950; 2951; AVX1-LABEL: trunc_and_v16i64_v16i8: 2952; AVX1: # %bb.0: 2953; AVX1-NEXT: vmovaps {{.*#+}} ymm8 = [255,255,255,255] 2954; AVX1-NEXT: vandps %ymm7, %ymm8, %ymm7 2955; AVX1-NEXT: vandps %ymm7, %ymm3, %ymm3 2956; AVX1-NEXT: vextractf128 $1, %ymm3, %xmm7 2957; AVX1-NEXT: vpackusdw %xmm7, %xmm3, %xmm3 2958; AVX1-NEXT: vandps %ymm6, %ymm8, %ymm6 2959; AVX1-NEXT: vandps %ymm6, %ymm2, %ymm2 2960; AVX1-NEXT: vextractf128 $1, %ymm2, %xmm6 2961; AVX1-NEXT: vpackusdw %xmm6, %xmm2, %xmm2 2962; AVX1-NEXT: vpackusdw %xmm3, %xmm2, %xmm2 2963; AVX1-NEXT: vandps %ymm5, %ymm8, %ymm3 2964; AVX1-NEXT: vandps %ymm3, %ymm1, %ymm1 2965; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm3 2966; AVX1-NEXT: vpackusdw %xmm3, %xmm1, %xmm1 2967; AVX1-NEXT: vandps %ymm4, %ymm8, %ymm3 2968; AVX1-NEXT: vandps %ymm3, %ymm0, %ymm0 2969; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm3 2970; AVX1-NEXT: vpackusdw %xmm3, %xmm0, %xmm0 2971; AVX1-NEXT: vpackusdw %xmm1, %xmm0, %xmm0 2972; AVX1-NEXT: vpackuswb %xmm2, %xmm0, %xmm0 2973; AVX1-NEXT: vzeroupper 2974; AVX1-NEXT: retq 2975; 2976; AVX2-SLOW-LABEL: trunc_and_v16i64_v16i8: 2977; AVX2-SLOW: # %bb.0: 2978; AVX2-SLOW-NEXT: vandps %ymm5, %ymm1, %ymm1 2979; AVX2-SLOW-NEXT: vandps %ymm4, %ymm0, %ymm0 2980; AVX2-SLOW-NEXT: vandps %ymm7, %ymm3, %ymm3 2981; AVX2-SLOW-NEXT: vandps %ymm6, %ymm2, %ymm2 2982; AVX2-SLOW-NEXT: vperm2f128 {{.*#+}} ymm4 = ymm2[2,3],ymm3[2,3] 2983; AVX2-SLOW-NEXT: vinsertf128 $1, %xmm3, %ymm2, %ymm2 2984; AVX2-SLOW-NEXT: vshufps {{.*#+}} ymm2 = ymm2[0,2],ymm4[0,2],ymm2[4,6],ymm4[4,6] 2985; AVX2-SLOW-NEXT: vmovdqa {{.*#+}} ymm3 = [0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15,16,17,20,21,24,25,28,29,24,25,28,29,28,29,30,31] 2986; AVX2-SLOW-NEXT: vpshufb %ymm3, %ymm2, %ymm2 2987; AVX2-SLOW-NEXT: vpermq {{.*#+}} ymm2 = ymm2[0,2,2,3] 2988; AVX2-SLOW-NEXT: vmovdqa {{.*#+}} xmm4 = [255,255,255,255,255,255,255,255] 2989; AVX2-SLOW-NEXT: vpand %xmm4, %xmm2, %xmm2 2990; AVX2-SLOW-NEXT: vperm2f128 {{.*#+}} ymm5 = ymm0[2,3],ymm1[2,3] 2991; AVX2-SLOW-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0 2992; AVX2-SLOW-NEXT: vshufps {{.*#+}} ymm0 = ymm0[0,2],ymm5[0,2],ymm0[4,6],ymm5[4,6] 2993; AVX2-SLOW-NEXT: vpshufb %ymm3, %ymm0, %ymm0 2994; AVX2-SLOW-NEXT: vpermq {{.*#+}} ymm0 = ymm0[0,2,2,3] 2995; AVX2-SLOW-NEXT: vpand %xmm4, %xmm0, %xmm0 2996; AVX2-SLOW-NEXT: vpackuswb %xmm2, %xmm0, %xmm0 2997; AVX2-SLOW-NEXT: vzeroupper 2998; AVX2-SLOW-NEXT: retq 2999; 3000; AVX2-FAST-LABEL: trunc_and_v16i64_v16i8: 3001; AVX2-FAST: # %bb.0: 3002; AVX2-FAST-NEXT: vpand %ymm5, %ymm1, %ymm1 3003; AVX2-FAST-NEXT: vpand %ymm4, %ymm0, %ymm0 3004; AVX2-FAST-NEXT: vpand %ymm7, %ymm3, %ymm3 3005; AVX2-FAST-NEXT: vpand %ymm6, %ymm2, %ymm2 3006; AVX2-FAST-NEXT: vmovdqa {{.*#+}} ymm4 = [0,2,4,6,4,6,6,7] 3007; AVX2-FAST-NEXT: vpermd %ymm2, %ymm4, %ymm2 3008; AVX2-FAST-NEXT: vpermd %ymm3, %ymm4, %ymm3 3009; AVX2-FAST-NEXT: vinserti128 $1, %xmm3, %ymm2, %ymm2 3010; AVX2-FAST-NEXT: vmovdqa {{.*#+}} ymm3 = [0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15,16,17,20,21,24,25,28,29,24,25,28,29,28,29,30,31] 3011; AVX2-FAST-NEXT: vpshufb %ymm3, %ymm2, %ymm2 3012; AVX2-FAST-NEXT: vpermq {{.*#+}} ymm2 = ymm2[0,2,2,3] 3013; AVX2-FAST-NEXT: vmovdqa {{.*#+}} xmm5 = [255,255,255,255,255,255,255,255] 3014; AVX2-FAST-NEXT: vpand %xmm5, %xmm2, %xmm2 3015; AVX2-FAST-NEXT: vpermd %ymm0, %ymm4, %ymm0 3016; AVX2-FAST-NEXT: vpermd %ymm1, %ymm4, %ymm1 3017; AVX2-FAST-NEXT: vinserti128 $1, %xmm1, %ymm0, %ymm0 3018; AVX2-FAST-NEXT: vpshufb %ymm3, %ymm0, %ymm0 3019; AVX2-FAST-NEXT: vpermq {{.*#+}} ymm0 = ymm0[0,2,2,3] 3020; AVX2-FAST-NEXT: vpand %xmm5, %xmm0, %xmm0 3021; AVX2-FAST-NEXT: vpackuswb %xmm2, %xmm0, %xmm0 3022; AVX2-FAST-NEXT: vzeroupper 3023; AVX2-FAST-NEXT: retq 3024; 3025; AVX512-LABEL: trunc_and_v16i64_v16i8: 3026; AVX512: # %bb.0: 3027; AVX512-NEXT: vpandq %zmm3, %zmm1, %zmm1 3028; AVX512-NEXT: vpandq %zmm2, %zmm0, %zmm0 3029; AVX512-NEXT: vpmovqd %zmm0, %ymm0 3030; AVX512-NEXT: vpmovqd %zmm1, %ymm1 3031; AVX512-NEXT: vinserti64x4 $1, %ymm1, %zmm0, %zmm0 3032; AVX512-NEXT: vpmovdb %zmm0, %xmm0 3033; AVX512-NEXT: vzeroupper 3034; AVX512-NEXT: retq 3035 %1 = and <16 x i64> %a0, %a1 3036 %2 = trunc <16 x i64> %1 to <16 x i8> 3037 ret <16 x i8> %2 3038} 3039 3040define <16 x i8> @trunc_and_v16i32_v16i8(<16 x i32> %a0, <16 x i32> %a1) nounwind { 3041; SSE-LABEL: trunc_and_v16i32_v16i8: 3042; SSE: # %bb.0: 3043; SSE-NEXT: movdqa {{.*#+}} xmm8 = [255,0,0,0,255,0,0,0,255,0,0,0,255,0,0,0] 3044; SSE-NEXT: pand %xmm8, %xmm7 3045; SSE-NEXT: pand %xmm3, %xmm7 3046; SSE-NEXT: pand %xmm8, %xmm6 3047; SSE-NEXT: pand %xmm2, %xmm6 3048; SSE-NEXT: packuswb %xmm7, %xmm6 3049; SSE-NEXT: pand %xmm8, %xmm5 3050; SSE-NEXT: pand %xmm1, %xmm5 3051; SSE-NEXT: pand %xmm8, %xmm4 3052; SSE-NEXT: pand %xmm4, %xmm0 3053; SSE-NEXT: packuswb %xmm5, %xmm0 3054; SSE-NEXT: packuswb %xmm6, %xmm0 3055; SSE-NEXT: retq 3056; 3057; AVX1-LABEL: trunc_and_v16i32_v16i8: 3058; AVX1: # %bb.0: 3059; AVX1-NEXT: vmovaps {{.*#+}} ymm4 = [255,255,255,255,255,255,255,255] 3060; AVX1-NEXT: vandps %ymm4, %ymm3, %ymm3 3061; AVX1-NEXT: vandps %ymm3, %ymm1, %ymm1 3062; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm3 3063; AVX1-NEXT: vpackusdw %xmm3, %xmm1, %xmm1 3064; AVX1-NEXT: vandps %ymm4, %ymm2, %ymm2 3065; AVX1-NEXT: vandps %ymm2, %ymm0, %ymm0 3066; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2 3067; AVX1-NEXT: vpackusdw %xmm2, %xmm0, %xmm0 3068; AVX1-NEXT: vpackuswb %xmm1, %xmm0, %xmm0 3069; AVX1-NEXT: vzeroupper 3070; AVX1-NEXT: retq 3071; 3072; AVX2-LABEL: trunc_and_v16i32_v16i8: 3073; AVX2: # %bb.0: 3074; AVX2-NEXT: vpand %ymm2, %ymm0, %ymm0 3075; AVX2-NEXT: vpand %ymm3, %ymm1, %ymm1 3076; AVX2-NEXT: vmovdqa {{.*#+}} ymm2 = [0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15,16,17,20,21,24,25,28,29,24,25,28,29,28,29,30,31] 3077; AVX2-NEXT: vpshufb %ymm2, %ymm1, %ymm1 3078; AVX2-NEXT: vpermq {{.*#+}} ymm1 = ymm1[0,2,2,3] 3079; AVX2-NEXT: vmovdqa {{.*#+}} xmm3 = [255,255,255,255,255,255,255,255] 3080; AVX2-NEXT: vpand %xmm3, %xmm1, %xmm1 3081; AVX2-NEXT: vpshufb %ymm2, %ymm0, %ymm0 3082; AVX2-NEXT: vpermq {{.*#+}} ymm0 = ymm0[0,2,2,3] 3083; AVX2-NEXT: vpand %xmm3, %xmm0, %xmm0 3084; AVX2-NEXT: vpackuswb %xmm1, %xmm0, %xmm0 3085; AVX2-NEXT: vzeroupper 3086; AVX2-NEXT: retq 3087; 3088; AVX512-LABEL: trunc_and_v16i32_v16i8: 3089; AVX512: # %bb.0: 3090; AVX512-NEXT: vpandd %zmm1, %zmm0, %zmm0 3091; AVX512-NEXT: vpmovdb %zmm0, %xmm0 3092; AVX512-NEXT: vzeroupper 3093; AVX512-NEXT: retq 3094 %1 = and <16 x i32> %a0, %a1 3095 %2 = trunc <16 x i32> %1 to <16 x i8> 3096 ret <16 x i8> %2 3097} 3098 3099define <16 x i8> @trunc_and_v16i16_v16i8(<16 x i16> %a0, <16 x i16> %a1) nounwind { 3100; SSE-LABEL: trunc_and_v16i16_v16i8: 3101; SSE: # %bb.0: 3102; SSE-NEXT: movdqa {{.*#+}} xmm4 = [255,255,255,255,255,255,255,255] 3103; SSE-NEXT: pand %xmm4, %xmm3 3104; SSE-NEXT: pand %xmm1, %xmm3 3105; SSE-NEXT: pand %xmm4, %xmm2 3106; SSE-NEXT: pand %xmm2, %xmm0 3107; SSE-NEXT: packuswb %xmm3, %xmm0 3108; SSE-NEXT: retq 3109; 3110; AVX1-LABEL: trunc_and_v16i16_v16i8: 3111; AVX1: # %bb.0: 3112; AVX1-NEXT: vandps %ymm1, %ymm0, %ymm0 3113; AVX1-NEXT: vandps {{.*}}(%rip), %ymm0, %ymm0 3114; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1 3115; AVX1-NEXT: vpackuswb %xmm1, %xmm0, %xmm0 3116; AVX1-NEXT: vzeroupper 3117; AVX1-NEXT: retq 3118; 3119; AVX2-LABEL: trunc_and_v16i16_v16i8: 3120; AVX2: # %bb.0: 3121; AVX2-NEXT: vpand %ymm1, %ymm0, %ymm0 3122; AVX2-NEXT: vpand {{.*}}(%rip), %ymm0, %ymm0 3123; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1 3124; AVX2-NEXT: vpackuswb %xmm1, %xmm0, %xmm0 3125; AVX2-NEXT: vzeroupper 3126; AVX2-NEXT: retq 3127; 3128; AVX512F-LABEL: trunc_and_v16i16_v16i8: 3129; AVX512F: # %bb.0: 3130; AVX512F-NEXT: vpand %ymm1, %ymm0, %ymm0 3131; 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],zero 3132; AVX512F-NEXT: vpmovdb %zmm0, %xmm0 3133; AVX512F-NEXT: vzeroupper 3134; AVX512F-NEXT: retq 3135; 3136; AVX512BW-LABEL: trunc_and_v16i16_v16i8: 3137; AVX512BW: # %bb.0: 3138; AVX512BW-NEXT: vpand %ymm1, %ymm0, %ymm0 3139; AVX512BW-NEXT: vpmovwb %zmm0, %ymm0 3140; AVX512BW-NEXT: # kill: def $xmm0 killed $xmm0 killed $ymm0 3141; AVX512BW-NEXT: vzeroupper 3142; AVX512BW-NEXT: retq 3143; 3144; AVX512DQ-LABEL: trunc_and_v16i16_v16i8: 3145; AVX512DQ: # %bb.0: 3146; AVX512DQ-NEXT: vpand %ymm1, %ymm0, %ymm0 3147; 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],zero 3148; AVX512DQ-NEXT: vpmovdb %zmm0, %xmm0 3149; AVX512DQ-NEXT: vzeroupper 3150; AVX512DQ-NEXT: retq 3151 %1 = and <16 x i16> %a0, %a1 3152 %2 = trunc <16 x i16> %1 to <16 x i8> 3153 ret <16 x i8> %2 3154} 3155 3156; 3157; and to constant 3158; 3159 3160define <4 x i32> @trunc_and_const_v4i64_v4i32(<4 x i64> %a0) nounwind { 3161; SSE-LABEL: trunc_and_const_v4i64_v4i32: 3162; SSE: # %bb.0: 3163; SSE-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,2],xmm1[0,2] 3164; SSE-NEXT: andps {{.*}}(%rip), %xmm0 3165; SSE-NEXT: retq 3166; 3167; AVX1-LABEL: trunc_and_const_v4i64_v4i32: 3168; AVX1: # %bb.0: 3169; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1 3170; AVX1-NEXT: vshufps {{.*#+}} xmm0 = xmm0[0,2],xmm1[0,2] 3171; AVX1-NEXT: vandps {{.*}}(%rip), %xmm0, %xmm0 3172; AVX1-NEXT: vzeroupper 3173; AVX1-NEXT: retq 3174; 3175; AVX2-SLOW-LABEL: trunc_and_const_v4i64_v4i32: 3176; AVX2-SLOW: # %bb.0: 3177; AVX2-SLOW-NEXT: vextractf128 $1, %ymm0, %xmm1 3178; AVX2-SLOW-NEXT: vshufps {{.*#+}} xmm0 = xmm0[0,2],xmm1[0,2] 3179; AVX2-SLOW-NEXT: vandps {{.*}}(%rip), %xmm0, %xmm0 3180; AVX2-SLOW-NEXT: vzeroupper 3181; AVX2-SLOW-NEXT: retq 3182; 3183; AVX2-FAST-LABEL: trunc_and_const_v4i64_v4i32: 3184; AVX2-FAST: # %bb.0: 3185; AVX2-FAST-NEXT: vmovaps {{.*#+}} ymm1 = [0,2,4,6,4,6,6,7] 3186; AVX2-FAST-NEXT: vpermps %ymm0, %ymm1, %ymm0 3187; AVX2-FAST-NEXT: vandps {{.*}}(%rip), %xmm0, %xmm0 3188; AVX2-FAST-NEXT: vzeroupper 3189; AVX2-FAST-NEXT: retq 3190; 3191; AVX512-LABEL: trunc_and_const_v4i64_v4i32: 3192; AVX512: # %bb.0: 3193; AVX512-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm0 3194; AVX512-NEXT: vpmovqd %zmm0, %ymm0 3195; AVX512-NEXT: vpand {{.*}}(%rip), %xmm0, %xmm0 3196; AVX512-NEXT: vzeroupper 3197; AVX512-NEXT: retq 3198 %1 = and <4 x i64> %a0, <i64 0, i64 1, i64 2, i64 3> 3199 %2 = trunc <4 x i64> %1 to <4 x i32> 3200 ret <4 x i32> %2 3201} 3202 3203define <8 x i16> @trunc_and_const_v8i64_v8i16(<8 x i64> %a0) nounwind { 3204; SSE-LABEL: trunc_and_const_v8i64_v8i16: 3205; SSE: # %bb.0: 3206; SSE-NEXT: pshufd {{.*#+}} xmm1 = xmm1[0,2,2,3] 3207; SSE-NEXT: pshuflw {{.*#+}} xmm1 = xmm1[0,2,2,3,4,5,6,7] 3208; SSE-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3] 3209; SSE-NEXT: pshuflw {{.*#+}} xmm4 = xmm0[0,2,2,3,4,5,6,7] 3210; SSE-NEXT: punpckldq {{.*#+}} xmm4 = xmm4[0],xmm1[0],xmm4[1],xmm1[1] 3211; SSE-NEXT: pshufd {{.*#+}} xmm0 = xmm3[0,2,2,3] 3212; SSE-NEXT: pshuflw {{.*#+}} xmm1 = xmm0[0,1,0,2,4,5,6,7] 3213; SSE-NEXT: pshufd {{.*#+}} xmm0 = xmm2[0,2,2,3] 3214; SSE-NEXT: pshuflw {{.*#+}} xmm0 = xmm0[0,1,0,2,4,5,6,7] 3215; SSE-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1] 3216; SSE-NEXT: movsd {{.*#+}} xmm0 = xmm4[0],xmm0[1] 3217; SSE-NEXT: andpd {{.*}}(%rip), %xmm0 3218; SSE-NEXT: retq 3219; 3220; AVX1-LABEL: trunc_and_const_v8i64_v8i16: 3221; AVX1: # %bb.0: 3222; AVX1-NEXT: vmovaps {{.*#+}} ymm2 = [65535,65535,65535,65535] 3223; AVX1-NEXT: vandps %ymm2, %ymm1, %ymm1 3224; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm3 3225; AVX1-NEXT: vpackusdw %xmm3, %xmm1, %xmm1 3226; AVX1-NEXT: vandps %ymm2, %ymm0, %ymm0 3227; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2 3228; AVX1-NEXT: vpackusdw %xmm2, %xmm0, %xmm0 3229; AVX1-NEXT: vpackusdw %xmm1, %xmm0, %xmm0 3230; AVX1-NEXT: vpand {{.*}}(%rip), %xmm0, %xmm0 3231; AVX1-NEXT: vzeroupper 3232; AVX1-NEXT: retq 3233; 3234; AVX2-SLOW-LABEL: trunc_and_const_v8i64_v8i16: 3235; AVX2-SLOW: # %bb.0: 3236; AVX2-SLOW-NEXT: vperm2f128 {{.*#+}} ymm2 = ymm0[2,3],ymm1[2,3] 3237; AVX2-SLOW-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0 3238; AVX2-SLOW-NEXT: vshufps {{.*#+}} ymm0 = ymm0[0,2],ymm2[0,2],ymm0[4,6],ymm2[4,6] 3239; AVX2-SLOW-NEXT: vpshufb {{.*#+}} ymm0 = ymm0[0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15,16,17,20,21,24,25,28,29,24,25,28,29,28,29,30,31] 3240; AVX2-SLOW-NEXT: vpermq {{.*#+}} ymm0 = ymm0[0,2,2,3] 3241; AVX2-SLOW-NEXT: vpand {{.*}}(%rip), %xmm0, %xmm0 3242; AVX2-SLOW-NEXT: vzeroupper 3243; AVX2-SLOW-NEXT: retq 3244; 3245; AVX2-FAST-LABEL: trunc_and_const_v8i64_v8i16: 3246; AVX2-FAST: # %bb.0: 3247; AVX2-FAST-NEXT: vmovdqa {{.*#+}} ymm2 = [0,2,4,6,4,6,6,7] 3248; AVX2-FAST-NEXT: vpermd %ymm0, %ymm2, %ymm0 3249; AVX2-FAST-NEXT: vpermd %ymm1, %ymm2, %ymm1 3250; AVX2-FAST-NEXT: vinserti128 $1, %xmm1, %ymm0, %ymm0 3251; AVX2-FAST-NEXT: vpshufb {{.*#+}} ymm0 = ymm0[0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15,16,17,20,21,24,25,28,29,24,25,28,29,28,29,30,31] 3252; AVX2-FAST-NEXT: vpermq {{.*#+}} ymm0 = ymm0[0,2,2,3] 3253; AVX2-FAST-NEXT: vpand {{.*}}(%rip), %xmm0, %xmm0 3254; AVX2-FAST-NEXT: vzeroupper 3255; AVX2-FAST-NEXT: retq 3256; 3257; AVX512-LABEL: trunc_and_const_v8i64_v8i16: 3258; AVX512: # %bb.0: 3259; AVX512-NEXT: vpmovqw %zmm0, %xmm0 3260; AVX512-NEXT: vpand {{.*}}(%rip), %xmm0, %xmm0 3261; AVX512-NEXT: vzeroupper 3262; AVX512-NEXT: retq 3263 %1 = and <8 x i64> %a0, <i64 0, i64 1, i64 2, i64 3, i64 4, i64 5, i64 6, i64 7> 3264 %2 = trunc <8 x i64> %1 to <8 x i16> 3265 ret <8 x i16> %2 3266} 3267 3268define <8 x i16> @trunc_and_const_v8i32_v8i16(<8 x i32> %a0) nounwind { 3269; SSE-LABEL: trunc_and_const_v8i32_v8i16: 3270; SSE: # %bb.0: 3271; SSE-NEXT: pslld $16, %xmm1 3272; SSE-NEXT: psrad $16, %xmm1 3273; SSE-NEXT: pslld $16, %xmm0 3274; SSE-NEXT: psrad $16, %xmm0 3275; SSE-NEXT: packssdw %xmm1, %xmm0 3276; SSE-NEXT: pand {{.*}}(%rip), %xmm0 3277; SSE-NEXT: retq 3278; 3279; AVX1-LABEL: trunc_and_const_v8i32_v8i16: 3280; AVX1: # %bb.0: 3281; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1 3282; AVX1-NEXT: vmovdqa {{.*#+}} xmm2 = [0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15] 3283; AVX1-NEXT: vpshufb %xmm2, %xmm1, %xmm1 3284; AVX1-NEXT: vpshufb %xmm2, %xmm0, %xmm0 3285; AVX1-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0] 3286; AVX1-NEXT: vpand {{.*}}(%rip), %xmm0, %xmm0 3287; AVX1-NEXT: vzeroupper 3288; AVX1-NEXT: retq 3289; 3290; AVX2-LABEL: trunc_and_const_v8i32_v8i16: 3291; AVX2: # %bb.0: 3292; AVX2-NEXT: vpshufb {{.*#+}} ymm0 = ymm0[0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15,16,17,20,21,24,25,28,29,24,25,28,29,28,29,30,31] 3293; AVX2-NEXT: vpermq {{.*#+}} ymm0 = ymm0[0,2,2,3] 3294; AVX2-NEXT: vpand {{.*}}(%rip), %xmm0, %xmm0 3295; AVX2-NEXT: vzeroupper 3296; AVX2-NEXT: retq 3297; 3298; AVX512-LABEL: trunc_and_const_v8i32_v8i16: 3299; AVX512: # %bb.0: 3300; AVX512-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm0 3301; AVX512-NEXT: vpmovdw %zmm0, %ymm0 3302; AVX512-NEXT: vpand {{.*}}(%rip), %xmm0, %xmm0 3303; AVX512-NEXT: vzeroupper 3304; AVX512-NEXT: retq 3305 %1 = and <8 x i32> %a0, <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7> 3306 %2 = trunc <8 x i32> %1 to <8 x i16> 3307 ret <8 x i16> %2 3308} 3309 3310define <16 x i8> @trunc_and_const_v16i64_v16i8(<16 x i64> %a0) nounwind { 3311; SSE-LABEL: trunc_and_const_v16i64_v16i8: 3312; SSE: # %bb.0: 3313; SSE-NEXT: movdqa {{.*#+}} xmm8 = [255,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0] 3314; SSE-NEXT: pand %xmm8, %xmm7 3315; SSE-NEXT: pand %xmm8, %xmm6 3316; SSE-NEXT: packuswb %xmm7, %xmm6 3317; SSE-NEXT: pand %xmm8, %xmm5 3318; SSE-NEXT: pand %xmm8, %xmm4 3319; SSE-NEXT: packuswb %xmm5, %xmm4 3320; SSE-NEXT: packuswb %xmm6, %xmm4 3321; SSE-NEXT: pand %xmm8, %xmm3 3322; SSE-NEXT: pand %xmm8, %xmm2 3323; SSE-NEXT: packuswb %xmm3, %xmm2 3324; SSE-NEXT: pand %xmm8, %xmm1 3325; SSE-NEXT: pand %xmm8, %xmm0 3326; SSE-NEXT: packuswb %xmm1, %xmm0 3327; SSE-NEXT: packuswb %xmm2, %xmm0 3328; SSE-NEXT: packuswb %xmm4, %xmm0 3329; SSE-NEXT: pand {{.*}}(%rip), %xmm0 3330; SSE-NEXT: retq 3331; 3332; AVX1-LABEL: trunc_and_const_v16i64_v16i8: 3333; AVX1: # %bb.0: 3334; AVX1-NEXT: vmovaps {{.*#+}} ymm4 = [255,255,255,255] 3335; AVX1-NEXT: vandps %ymm4, %ymm3, %ymm3 3336; AVX1-NEXT: vextractf128 $1, %ymm3, %xmm5 3337; AVX1-NEXT: vpackusdw %xmm5, %xmm3, %xmm3 3338; AVX1-NEXT: vandps %ymm4, %ymm2, %ymm2 3339; AVX1-NEXT: vextractf128 $1, %ymm2, %xmm5 3340; AVX1-NEXT: vpackusdw %xmm5, %xmm2, %xmm2 3341; AVX1-NEXT: vpackusdw %xmm3, %xmm2, %xmm2 3342; AVX1-NEXT: vandps %ymm4, %ymm1, %ymm1 3343; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm3 3344; AVX1-NEXT: vpackusdw %xmm3, %xmm1, %xmm1 3345; AVX1-NEXT: vandps %ymm4, %ymm0, %ymm0 3346; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm3 3347; AVX1-NEXT: vpackusdw %xmm3, %xmm0, %xmm0 3348; AVX1-NEXT: vpackusdw %xmm1, %xmm0, %xmm0 3349; AVX1-NEXT: vpackuswb %xmm2, %xmm0, %xmm0 3350; AVX1-NEXT: vpand {{.*}}(%rip), %xmm0, %xmm0 3351; AVX1-NEXT: vzeroupper 3352; AVX1-NEXT: retq 3353; 3354; AVX2-SLOW-LABEL: trunc_and_const_v16i64_v16i8: 3355; AVX2-SLOW: # %bb.0: 3356; AVX2-SLOW-NEXT: vperm2f128 {{.*#+}} ymm4 = ymm2[2,3],ymm3[2,3] 3357; AVX2-SLOW-NEXT: vinsertf128 $1, %xmm3, %ymm2, %ymm2 3358; AVX2-SLOW-NEXT: vshufps {{.*#+}} ymm2 = ymm2[0,2],ymm4[0,2],ymm2[4,6],ymm4[4,6] 3359; AVX2-SLOW-NEXT: vmovdqa {{.*#+}} ymm3 = [0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15,16,17,20,21,24,25,28,29,24,25,28,29,28,29,30,31] 3360; AVX2-SLOW-NEXT: vpshufb %ymm3, %ymm2, %ymm2 3361; AVX2-SLOW-NEXT: vpermq {{.*#+}} ymm2 = ymm2[0,2,2,3] 3362; AVX2-SLOW-NEXT: vmovdqa {{.*#+}} xmm4 = [255,255,255,255,255,255,255,255] 3363; AVX2-SLOW-NEXT: vpand %xmm4, %xmm2, %xmm2 3364; AVX2-SLOW-NEXT: vperm2f128 {{.*#+}} ymm5 = ymm0[2,3],ymm1[2,3] 3365; AVX2-SLOW-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0 3366; AVX2-SLOW-NEXT: vshufps {{.*#+}} ymm0 = ymm0[0,2],ymm5[0,2],ymm0[4,6],ymm5[4,6] 3367; AVX2-SLOW-NEXT: vpshufb %ymm3, %ymm0, %ymm0 3368; AVX2-SLOW-NEXT: vpermq {{.*#+}} ymm0 = ymm0[0,2,2,3] 3369; AVX2-SLOW-NEXT: vpand %xmm4, %xmm0, %xmm0 3370; AVX2-SLOW-NEXT: vpackuswb %xmm2, %xmm0, %xmm0 3371; AVX2-SLOW-NEXT: vpand {{.*}}(%rip), %xmm0, %xmm0 3372; AVX2-SLOW-NEXT: vzeroupper 3373; AVX2-SLOW-NEXT: retq 3374; 3375; AVX2-FAST-LABEL: trunc_and_const_v16i64_v16i8: 3376; AVX2-FAST: # %bb.0: 3377; AVX2-FAST-NEXT: vmovdqa {{.*#+}} ymm4 = [0,2,4,6,4,6,6,7] 3378; AVX2-FAST-NEXT: vpermd %ymm2, %ymm4, %ymm2 3379; AVX2-FAST-NEXT: vpermd %ymm3, %ymm4, %ymm3 3380; AVX2-FAST-NEXT: vinserti128 $1, %xmm3, %ymm2, %ymm2 3381; AVX2-FAST-NEXT: vmovdqa {{.*#+}} ymm3 = [0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15,16,17,20,21,24,25,28,29,24,25,28,29,28,29,30,31] 3382; AVX2-FAST-NEXT: vpshufb %ymm3, %ymm2, %ymm2 3383; AVX2-FAST-NEXT: vpermq {{.*#+}} ymm2 = ymm2[0,2,2,3] 3384; AVX2-FAST-NEXT: vmovdqa {{.*#+}} xmm5 = [255,255,255,255,255,255,255,255] 3385; AVX2-FAST-NEXT: vpand %xmm5, %xmm2, %xmm2 3386; AVX2-FAST-NEXT: vpermd %ymm0, %ymm4, %ymm0 3387; AVX2-FAST-NEXT: vpermd %ymm1, %ymm4, %ymm1 3388; AVX2-FAST-NEXT: vinserti128 $1, %xmm1, %ymm0, %ymm0 3389; AVX2-FAST-NEXT: vpshufb %ymm3, %ymm0, %ymm0 3390; AVX2-FAST-NEXT: vpermq {{.*#+}} ymm0 = ymm0[0,2,2,3] 3391; AVX2-FAST-NEXT: vpand %xmm5, %xmm0, %xmm0 3392; AVX2-FAST-NEXT: vpackuswb %xmm2, %xmm0, %xmm0 3393; AVX2-FAST-NEXT: vpand {{.*}}(%rip), %xmm0, %xmm0 3394; AVX2-FAST-NEXT: vzeroupper 3395; AVX2-FAST-NEXT: retq 3396; 3397; AVX512-LABEL: trunc_and_const_v16i64_v16i8: 3398; AVX512: # %bb.0: 3399; AVX512-NEXT: vpmovqd %zmm0, %ymm0 3400; AVX512-NEXT: vpmovqd %zmm1, %ymm1 3401; AVX512-NEXT: vinserti64x4 $1, %ymm1, %zmm0, %zmm0 3402; AVX512-NEXT: vpmovdb %zmm0, %xmm0 3403; AVX512-NEXT: vpand {{.*}}(%rip), %xmm0, %xmm0 3404; AVX512-NEXT: vzeroupper 3405; AVX512-NEXT: retq 3406 %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> 3407 %2 = trunc <16 x i64> %1 to <16 x i8> 3408 ret <16 x i8> %2 3409} 3410 3411define <16 x i8> @trunc_and_const_v16i32_v16i8(<16 x i32> %a0) nounwind { 3412; SSE-LABEL: trunc_and_const_v16i32_v16i8: 3413; SSE: # %bb.0: 3414; SSE-NEXT: movdqa {{.*#+}} xmm4 = [255,0,0,0,255,0,0,0,255,0,0,0,255,0,0,0] 3415; SSE-NEXT: pand %xmm4, %xmm3 3416; SSE-NEXT: pand %xmm4, %xmm2 3417; SSE-NEXT: packuswb %xmm3, %xmm2 3418; SSE-NEXT: pand %xmm4, %xmm1 3419; SSE-NEXT: pand %xmm4, %xmm0 3420; SSE-NEXT: packuswb %xmm1, %xmm0 3421; SSE-NEXT: packuswb %xmm2, %xmm0 3422; SSE-NEXT: pand {{.*}}(%rip), %xmm0 3423; SSE-NEXT: retq 3424; 3425; AVX1-LABEL: trunc_and_const_v16i32_v16i8: 3426; AVX1: # %bb.0: 3427; AVX1-NEXT: vmovaps {{.*#+}} ymm2 = [255,255,255,255,255,255,255,255] 3428; AVX1-NEXT: vandps %ymm2, %ymm1, %ymm1 3429; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm3 3430; AVX1-NEXT: vpackusdw %xmm3, %xmm1, %xmm1 3431; AVX1-NEXT: vandps %ymm2, %ymm0, %ymm0 3432; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2 3433; AVX1-NEXT: vpackusdw %xmm2, %xmm0, %xmm0 3434; AVX1-NEXT: vpackuswb %xmm1, %xmm0, %xmm0 3435; AVX1-NEXT: vpand {{.*}}(%rip), %xmm0, %xmm0 3436; AVX1-NEXT: vzeroupper 3437; AVX1-NEXT: retq 3438; 3439; AVX2-LABEL: trunc_and_const_v16i32_v16i8: 3440; AVX2: # %bb.0: 3441; AVX2-NEXT: vmovdqa {{.*#+}} ymm2 = [0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15,16,17,20,21,24,25,28,29,24,25,28,29,28,29,30,31] 3442; AVX2-NEXT: vpshufb %ymm2, %ymm1, %ymm1 3443; AVX2-NEXT: vpermq {{.*#+}} ymm1 = ymm1[0,2,2,3] 3444; AVX2-NEXT: vmovdqa {{.*#+}} xmm3 = [255,255,255,255,255,255,255,255] 3445; AVX2-NEXT: vpand %xmm3, %xmm1, %xmm1 3446; AVX2-NEXT: vpshufb %ymm2, %ymm0, %ymm0 3447; AVX2-NEXT: vpermq {{.*#+}} ymm0 = ymm0[0,2,2,3] 3448; AVX2-NEXT: vpand %xmm3, %xmm0, %xmm0 3449; AVX2-NEXT: vpackuswb %xmm1, %xmm0, %xmm0 3450; AVX2-NEXT: vpand {{.*}}(%rip), %xmm0, %xmm0 3451; AVX2-NEXT: vzeroupper 3452; AVX2-NEXT: retq 3453; 3454; AVX512-LABEL: trunc_and_const_v16i32_v16i8: 3455; AVX512: # %bb.0: 3456; AVX512-NEXT: vpmovdb %zmm0, %xmm0 3457; AVX512-NEXT: vpand {{.*}}(%rip), %xmm0, %xmm0 3458; AVX512-NEXT: vzeroupper 3459; AVX512-NEXT: retq 3460 %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> 3461 %2 = trunc <16 x i32> %1 to <16 x i8> 3462 ret <16 x i8> %2 3463} 3464 3465define <16 x i8> @trunc_and_const_v16i16_v16i8(<16 x i16> %a0) nounwind { 3466; SSE-LABEL: trunc_and_const_v16i16_v16i8: 3467; SSE: # %bb.0: 3468; SSE-NEXT: movdqa {{.*#+}} xmm2 = [255,255,255,255,255,255,255,255] 3469; SSE-NEXT: pand %xmm2, %xmm1 3470; SSE-NEXT: pand %xmm2, %xmm0 3471; SSE-NEXT: packuswb %xmm1, %xmm0 3472; SSE-NEXT: pand {{.*}}(%rip), %xmm0 3473; SSE-NEXT: retq 3474; 3475; AVX1-LABEL: trunc_and_const_v16i16_v16i8: 3476; AVX1: # %bb.0: 3477; AVX1-NEXT: vandps {{.*}}(%rip), %ymm0, %ymm0 3478; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1 3479; AVX1-NEXT: vpackuswb %xmm1, %xmm0, %xmm0 3480; AVX1-NEXT: vpand {{.*}}(%rip), %xmm0, %xmm0 3481; AVX1-NEXT: vzeroupper 3482; AVX1-NEXT: retq 3483; 3484; AVX2-LABEL: trunc_and_const_v16i16_v16i8: 3485; AVX2: # %bb.0: 3486; AVX2-NEXT: vpand {{.*}}(%rip), %ymm0, %ymm0 3487; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1 3488; AVX2-NEXT: vpackuswb %xmm1, %xmm0, %xmm0 3489; AVX2-NEXT: vpand {{.*}}(%rip), %xmm0, %xmm0 3490; AVX2-NEXT: vzeroupper 3491; AVX2-NEXT: retq 3492; 3493; AVX512F-LABEL: trunc_and_const_v16i16_v16i8: 3494; AVX512F: # %bb.0: 3495; 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],zero 3496; AVX512F-NEXT: vpmovdb %zmm0, %xmm0 3497; AVX512F-NEXT: vpand {{.*}}(%rip), %xmm0, %xmm0 3498; AVX512F-NEXT: vzeroupper 3499; AVX512F-NEXT: retq 3500; 3501; AVX512BW-LABEL: trunc_and_const_v16i16_v16i8: 3502; AVX512BW: # %bb.0: 3503; AVX512BW-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm0 3504; AVX512BW-NEXT: vpmovwb %zmm0, %ymm0 3505; AVX512BW-NEXT: vpand {{.*}}(%rip), %xmm0, %xmm0 3506; AVX512BW-NEXT: vzeroupper 3507; AVX512BW-NEXT: retq 3508; 3509; AVX512DQ-LABEL: trunc_and_const_v16i16_v16i8: 3510; AVX512DQ: # %bb.0: 3511; 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],zero 3512; AVX512DQ-NEXT: vpmovdb %zmm0, %xmm0 3513; AVX512DQ-NEXT: vpand {{.*}}(%rip), %xmm0, %xmm0 3514; AVX512DQ-NEXT: vzeroupper 3515; AVX512DQ-NEXT: retq 3516 %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> 3517 %2 = trunc <16 x i16> %1 to <16 x i8> 3518 ret <16 x i8> %2 3519} 3520 3521; 3522; xor 3523; 3524 3525define <4 x i32> @trunc_xor_v4i64_v4i32(<4 x i64> %a0, <4 x i64> %a1) nounwind { 3526; SSE-LABEL: trunc_xor_v4i64_v4i32: 3527; SSE: # %bb.0: 3528; SSE-NEXT: xorps %xmm3, %xmm1 3529; SSE-NEXT: xorps %xmm2, %xmm0 3530; SSE-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,2],xmm1[0,2] 3531; SSE-NEXT: retq 3532; 3533; AVX1-LABEL: trunc_xor_v4i64_v4i32: 3534; AVX1: # %bb.0: 3535; AVX1-NEXT: vxorps %ymm1, %ymm0, %ymm0 3536; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1 3537; AVX1-NEXT: vshufps {{.*#+}} xmm0 = xmm0[0,2],xmm1[0,2] 3538; AVX1-NEXT: vzeroupper 3539; AVX1-NEXT: retq 3540; 3541; AVX2-SLOW-LABEL: trunc_xor_v4i64_v4i32: 3542; AVX2-SLOW: # %bb.0: 3543; AVX2-SLOW-NEXT: vxorps %ymm1, %ymm0, %ymm0 3544; AVX2-SLOW-NEXT: vextractf128 $1, %ymm0, %xmm1 3545; AVX2-SLOW-NEXT: vshufps {{.*#+}} xmm0 = xmm0[0,2],xmm1[0,2] 3546; AVX2-SLOW-NEXT: vzeroupper 3547; AVX2-SLOW-NEXT: retq 3548; 3549; AVX2-FAST-LABEL: trunc_xor_v4i64_v4i32: 3550; AVX2-FAST: # %bb.0: 3551; AVX2-FAST-NEXT: vxorps %ymm1, %ymm0, %ymm0 3552; AVX2-FAST-NEXT: vmovaps {{.*#+}} ymm1 = [0,2,4,6,4,6,6,7] 3553; AVX2-FAST-NEXT: vpermps %ymm0, %ymm1, %ymm0 3554; AVX2-FAST-NEXT: # kill: def $xmm0 killed $xmm0 killed $ymm0 3555; AVX2-FAST-NEXT: vzeroupper 3556; AVX2-FAST-NEXT: retq 3557; 3558; AVX512-LABEL: trunc_xor_v4i64_v4i32: 3559; AVX512: # %bb.0: 3560; AVX512-NEXT: vpxor %ymm1, %ymm0, %ymm0 3561; AVX512-NEXT: vpmovqd %zmm0, %ymm0 3562; AVX512-NEXT: # kill: def $xmm0 killed $xmm0 killed $ymm0 3563; AVX512-NEXT: vzeroupper 3564; AVX512-NEXT: retq 3565 %1 = xor <4 x i64> %a0, %a1 3566 %2 = trunc <4 x i64> %1 to <4 x i32> 3567 ret <4 x i32> %2 3568} 3569 3570define <8 x i16> @trunc_xor_v8i64_v8i16(<8 x i64> %a0, <8 x i64> %a1) nounwind { 3571; SSE-LABEL: trunc_xor_v8i64_v8i16: 3572; SSE: # %bb.0: 3573; SSE-NEXT: pxor %xmm6, %xmm2 3574; SSE-NEXT: pxor %xmm7, %xmm3 3575; SSE-NEXT: pxor %xmm4, %xmm0 3576; SSE-NEXT: pxor %xmm5, %xmm1 3577; SSE-NEXT: pshufd {{.*#+}} xmm1 = xmm1[0,2,2,3] 3578; SSE-NEXT: pshuflw {{.*#+}} xmm1 = xmm1[0,2,2,3,4,5,6,7] 3579; SSE-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3] 3580; SSE-NEXT: pshuflw {{.*#+}} xmm4 = xmm0[0,2,2,3,4,5,6,7] 3581; SSE-NEXT: punpckldq {{.*#+}} xmm4 = xmm4[0],xmm1[0],xmm4[1],xmm1[1] 3582; SSE-NEXT: pshufd {{.*#+}} xmm0 = xmm3[0,2,2,3] 3583; SSE-NEXT: pshuflw {{.*#+}} xmm1 = xmm0[0,1,0,2,4,5,6,7] 3584; SSE-NEXT: pshufd {{.*#+}} xmm0 = xmm2[0,2,2,3] 3585; SSE-NEXT: pshuflw {{.*#+}} xmm0 = xmm0[0,1,0,2,4,5,6,7] 3586; SSE-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1] 3587; SSE-NEXT: movsd {{.*#+}} xmm0 = xmm4[0],xmm0[1] 3588; SSE-NEXT: retq 3589; 3590; AVX1-LABEL: trunc_xor_v8i64_v8i16: 3591; AVX1: # %bb.0: 3592; AVX1-NEXT: vxorps %ymm2, %ymm0, %ymm0 3593; AVX1-NEXT: vxorps %ymm3, %ymm1, %ymm1 3594; AVX1-NEXT: vmovaps {{.*#+}} ymm2 = [65535,65535,65535,65535] 3595; AVX1-NEXT: vandps %ymm2, %ymm1, %ymm1 3596; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm3 3597; AVX1-NEXT: vpackusdw %xmm3, %xmm1, %xmm1 3598; AVX1-NEXT: vandps %ymm2, %ymm0, %ymm0 3599; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2 3600; AVX1-NEXT: vpackusdw %xmm2, %xmm0, %xmm0 3601; AVX1-NEXT: vpackusdw %xmm1, %xmm0, %xmm0 3602; AVX1-NEXT: vzeroupper 3603; AVX1-NEXT: retq 3604; 3605; AVX2-SLOW-LABEL: trunc_xor_v8i64_v8i16: 3606; AVX2-SLOW: # %bb.0: 3607; AVX2-SLOW-NEXT: vxorps %ymm3, %ymm1, %ymm1 3608; AVX2-SLOW-NEXT: vxorps %ymm2, %ymm0, %ymm0 3609; AVX2-SLOW-NEXT: vperm2f128 {{.*#+}} ymm2 = ymm0[2,3],ymm1[2,3] 3610; AVX2-SLOW-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0 3611; AVX2-SLOW-NEXT: vshufps {{.*#+}} ymm0 = ymm0[0,2],ymm2[0,2],ymm0[4,6],ymm2[4,6] 3612; AVX2-SLOW-NEXT: vpshufb {{.*#+}} ymm0 = ymm0[0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15,16,17,20,21,24,25,28,29,24,25,28,29,28,29,30,31] 3613; AVX2-SLOW-NEXT: vpermq {{.*#+}} ymm0 = ymm0[0,2,2,3] 3614; AVX2-SLOW-NEXT: # kill: def $xmm0 killed $xmm0 killed $ymm0 3615; AVX2-SLOW-NEXT: vzeroupper 3616; AVX2-SLOW-NEXT: retq 3617; 3618; AVX2-FAST-LABEL: trunc_xor_v8i64_v8i16: 3619; AVX2-FAST: # %bb.0: 3620; AVX2-FAST-NEXT: vpxor %ymm3, %ymm1, %ymm1 3621; AVX2-FAST-NEXT: vpxor %ymm2, %ymm0, %ymm0 3622; AVX2-FAST-NEXT: vmovdqa {{.*#+}} ymm2 = [0,2,4,6,4,6,6,7] 3623; AVX2-FAST-NEXT: vpermd %ymm0, %ymm2, %ymm0 3624; AVX2-FAST-NEXT: vpermd %ymm1, %ymm2, %ymm1 3625; AVX2-FAST-NEXT: vinserti128 $1, %xmm1, %ymm0, %ymm0 3626; AVX2-FAST-NEXT: vpshufb {{.*#+}} ymm0 = ymm0[0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15,16,17,20,21,24,25,28,29,24,25,28,29,28,29,30,31] 3627; AVX2-FAST-NEXT: vpermq {{.*#+}} ymm0 = ymm0[0,2,2,3] 3628; AVX2-FAST-NEXT: # kill: def $xmm0 killed $xmm0 killed $ymm0 3629; AVX2-FAST-NEXT: vzeroupper 3630; AVX2-FAST-NEXT: retq 3631; 3632; AVX512-LABEL: trunc_xor_v8i64_v8i16: 3633; AVX512: # %bb.0: 3634; AVX512-NEXT: vpxorq %zmm1, %zmm0, %zmm0 3635; AVX512-NEXT: vpmovqw %zmm0, %xmm0 3636; AVX512-NEXT: vzeroupper 3637; AVX512-NEXT: retq 3638 %1 = xor <8 x i64> %a0, %a1 3639 %2 = trunc <8 x i64> %1 to <8 x i16> 3640 ret <8 x i16> %2 3641} 3642 3643define <8 x i16> @trunc_xor_v8i32_v8i16(<8 x i32> %a0, <8 x i32> %a1) nounwind { 3644; SSE-LABEL: trunc_xor_v8i32_v8i16: 3645; SSE: # %bb.0: 3646; SSE-NEXT: pxor %xmm2, %xmm0 3647; SSE-NEXT: pxor %xmm3, %xmm1 3648; SSE-NEXT: pslld $16, %xmm1 3649; SSE-NEXT: psrad $16, %xmm1 3650; SSE-NEXT: pslld $16, %xmm0 3651; SSE-NEXT: psrad $16, %xmm0 3652; SSE-NEXT: packssdw %xmm1, %xmm0 3653; SSE-NEXT: retq 3654; 3655; AVX1-LABEL: trunc_xor_v8i32_v8i16: 3656; AVX1: # %bb.0: 3657; AVX1-NEXT: vxorps %ymm1, %ymm0, %ymm0 3658; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1 3659; AVX1-NEXT: vmovdqa {{.*#+}} xmm2 = [0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15] 3660; AVX1-NEXT: vpshufb %xmm2, %xmm1, %xmm1 3661; AVX1-NEXT: vpshufb %xmm2, %xmm0, %xmm0 3662; AVX1-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0] 3663; AVX1-NEXT: vzeroupper 3664; AVX1-NEXT: retq 3665; 3666; AVX2-LABEL: trunc_xor_v8i32_v8i16: 3667; AVX2: # %bb.0: 3668; AVX2-NEXT: vpxor %ymm1, %ymm0, %ymm0 3669; AVX2-NEXT: vpshufb {{.*#+}} ymm0 = ymm0[0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15,16,17,20,21,24,25,28,29,24,25,28,29,28,29,30,31] 3670; AVX2-NEXT: vpermq {{.*#+}} ymm0 = ymm0[0,2,2,3] 3671; AVX2-NEXT: # kill: def $xmm0 killed $xmm0 killed $ymm0 3672; AVX2-NEXT: vzeroupper 3673; AVX2-NEXT: retq 3674; 3675; AVX512-LABEL: trunc_xor_v8i32_v8i16: 3676; AVX512: # %bb.0: 3677; AVX512-NEXT: vpxor %ymm1, %ymm0, %ymm0 3678; AVX512-NEXT: vpmovdw %zmm0, %ymm0 3679; AVX512-NEXT: # kill: def $xmm0 killed $xmm0 killed $ymm0 3680; AVX512-NEXT: vzeroupper 3681; AVX512-NEXT: retq 3682 %1 = xor <8 x i32> %a0, %a1 3683 %2 = trunc <8 x i32> %1 to <8 x i16> 3684 ret <8 x i16> %2 3685} 3686 3687define <16 x i8> @trunc_xor_v16i64_v16i8(<16 x i64> %a0, <16 x i64> %a1) nounwind { 3688; SSE-LABEL: trunc_xor_v16i64_v16i8: 3689; SSE: # %bb.0: 3690; SSE-NEXT: pxor {{[0-9]+}}(%rsp), %xmm0 3691; SSE-NEXT: pxor {{[0-9]+}}(%rsp), %xmm1 3692; SSE-NEXT: pxor {{[0-9]+}}(%rsp), %xmm2 3693; SSE-NEXT: pxor {{[0-9]+}}(%rsp), %xmm3 3694; SSE-NEXT: pxor {{[0-9]+}}(%rsp), %xmm4 3695; SSE-NEXT: pxor {{[0-9]+}}(%rsp), %xmm5 3696; SSE-NEXT: pxor {{[0-9]+}}(%rsp), %xmm6 3697; SSE-NEXT: pxor {{[0-9]+}}(%rsp), %xmm7 3698; SSE-NEXT: movdqa {{.*#+}} xmm8 = [255,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0] 3699; SSE-NEXT: pand %xmm8, %xmm7 3700; SSE-NEXT: pand %xmm8, %xmm6 3701; SSE-NEXT: packuswb %xmm7, %xmm6 3702; SSE-NEXT: pand %xmm8, %xmm5 3703; SSE-NEXT: pand %xmm8, %xmm4 3704; SSE-NEXT: packuswb %xmm5, %xmm4 3705; SSE-NEXT: packuswb %xmm6, %xmm4 3706; SSE-NEXT: pand %xmm8, %xmm3 3707; SSE-NEXT: pand %xmm8, %xmm2 3708; SSE-NEXT: packuswb %xmm3, %xmm2 3709; SSE-NEXT: pand %xmm8, %xmm1 3710; SSE-NEXT: pand %xmm8, %xmm0 3711; SSE-NEXT: packuswb %xmm1, %xmm0 3712; SSE-NEXT: packuswb %xmm2, %xmm0 3713; SSE-NEXT: packuswb %xmm4, %xmm0 3714; SSE-NEXT: retq 3715; 3716; AVX1-LABEL: trunc_xor_v16i64_v16i8: 3717; AVX1: # %bb.0: 3718; AVX1-NEXT: vxorps %ymm4, %ymm0, %ymm0 3719; AVX1-NEXT: vxorps %ymm5, %ymm1, %ymm1 3720; AVX1-NEXT: vxorps %ymm6, %ymm2, %ymm2 3721; AVX1-NEXT: vxorps %ymm7, %ymm3, %ymm3 3722; AVX1-NEXT: vmovaps {{.*#+}} ymm4 = [255,255,255,255] 3723; AVX1-NEXT: vandps %ymm4, %ymm3, %ymm3 3724; AVX1-NEXT: vextractf128 $1, %ymm3, %xmm5 3725; AVX1-NEXT: vpackusdw %xmm5, %xmm3, %xmm3 3726; AVX1-NEXT: vandps %ymm4, %ymm2, %ymm2 3727; AVX1-NEXT: vextractf128 $1, %ymm2, %xmm5 3728; AVX1-NEXT: vpackusdw %xmm5, %xmm2, %xmm2 3729; AVX1-NEXT: vpackusdw %xmm3, %xmm2, %xmm2 3730; AVX1-NEXT: vandps %ymm4, %ymm1, %ymm1 3731; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm3 3732; AVX1-NEXT: vpackusdw %xmm3, %xmm1, %xmm1 3733; AVX1-NEXT: vandps %ymm4, %ymm0, %ymm0 3734; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm3 3735; AVX1-NEXT: vpackusdw %xmm3, %xmm0, %xmm0 3736; AVX1-NEXT: vpackusdw %xmm1, %xmm0, %xmm0 3737; AVX1-NEXT: vpackuswb %xmm2, %xmm0, %xmm0 3738; AVX1-NEXT: vzeroupper 3739; AVX1-NEXT: retq 3740; 3741; AVX2-SLOW-LABEL: trunc_xor_v16i64_v16i8: 3742; AVX2-SLOW: # %bb.0: 3743; AVX2-SLOW-NEXT: vxorps %ymm5, %ymm1, %ymm1 3744; AVX2-SLOW-NEXT: vxorps %ymm4, %ymm0, %ymm0 3745; AVX2-SLOW-NEXT: vxorps %ymm7, %ymm3, %ymm3 3746; AVX2-SLOW-NEXT: vxorps %ymm6, %ymm2, %ymm2 3747; AVX2-SLOW-NEXT: vperm2f128 {{.*#+}} ymm4 = ymm2[2,3],ymm3[2,3] 3748; AVX2-SLOW-NEXT: vinsertf128 $1, %xmm3, %ymm2, %ymm2 3749; AVX2-SLOW-NEXT: vshufps {{.*#+}} ymm2 = ymm2[0,2],ymm4[0,2],ymm2[4,6],ymm4[4,6] 3750; AVX2-SLOW-NEXT: vmovdqa {{.*#+}} ymm3 = [0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15,16,17,20,21,24,25,28,29,24,25,28,29,28,29,30,31] 3751; AVX2-SLOW-NEXT: vpshufb %ymm3, %ymm2, %ymm2 3752; AVX2-SLOW-NEXT: vpermq {{.*#+}} ymm2 = ymm2[0,2,2,3] 3753; AVX2-SLOW-NEXT: vmovdqa {{.*#+}} xmm4 = [255,255,255,255,255,255,255,255] 3754; AVX2-SLOW-NEXT: vpand %xmm4, %xmm2, %xmm2 3755; AVX2-SLOW-NEXT: vperm2f128 {{.*#+}} ymm5 = ymm0[2,3],ymm1[2,3] 3756; AVX2-SLOW-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0 3757; AVX2-SLOW-NEXT: vshufps {{.*#+}} ymm0 = ymm0[0,2],ymm5[0,2],ymm0[4,6],ymm5[4,6] 3758; AVX2-SLOW-NEXT: vpshufb %ymm3, %ymm0, %ymm0 3759; AVX2-SLOW-NEXT: vpermq {{.*#+}} ymm0 = ymm0[0,2,2,3] 3760; AVX2-SLOW-NEXT: vpand %xmm4, %xmm0, %xmm0 3761; AVX2-SLOW-NEXT: vpackuswb %xmm2, %xmm0, %xmm0 3762; AVX2-SLOW-NEXT: vzeroupper 3763; AVX2-SLOW-NEXT: retq 3764; 3765; AVX2-FAST-LABEL: trunc_xor_v16i64_v16i8: 3766; AVX2-FAST: # %bb.0: 3767; AVX2-FAST-NEXT: vpxor %ymm5, %ymm1, %ymm1 3768; AVX2-FAST-NEXT: vpxor %ymm4, %ymm0, %ymm0 3769; AVX2-FAST-NEXT: vpxor %ymm7, %ymm3, %ymm3 3770; AVX2-FAST-NEXT: vpxor %ymm6, %ymm2, %ymm2 3771; AVX2-FAST-NEXT: vmovdqa {{.*#+}} ymm4 = [0,2,4,6,4,6,6,7] 3772; AVX2-FAST-NEXT: vpermd %ymm2, %ymm4, %ymm2 3773; AVX2-FAST-NEXT: vpermd %ymm3, %ymm4, %ymm3 3774; AVX2-FAST-NEXT: vinserti128 $1, %xmm3, %ymm2, %ymm2 3775; AVX2-FAST-NEXT: vmovdqa {{.*#+}} ymm3 = [0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15,16,17,20,21,24,25,28,29,24,25,28,29,28,29,30,31] 3776; AVX2-FAST-NEXT: vpshufb %ymm3, %ymm2, %ymm2 3777; AVX2-FAST-NEXT: vpermq {{.*#+}} ymm2 = ymm2[0,2,2,3] 3778; AVX2-FAST-NEXT: vmovdqa {{.*#+}} xmm5 = [255,255,255,255,255,255,255,255] 3779; AVX2-FAST-NEXT: vpand %xmm5, %xmm2, %xmm2 3780; AVX2-FAST-NEXT: vpermd %ymm0, %ymm4, %ymm0 3781; AVX2-FAST-NEXT: vpermd %ymm1, %ymm4, %ymm1 3782; AVX2-FAST-NEXT: vinserti128 $1, %xmm1, %ymm0, %ymm0 3783; AVX2-FAST-NEXT: vpshufb %ymm3, %ymm0, %ymm0 3784; AVX2-FAST-NEXT: vpermq {{.*#+}} ymm0 = ymm0[0,2,2,3] 3785; AVX2-FAST-NEXT: vpand %xmm5, %xmm0, %xmm0 3786; AVX2-FAST-NEXT: vpackuswb %xmm2, %xmm0, %xmm0 3787; AVX2-FAST-NEXT: vzeroupper 3788; AVX2-FAST-NEXT: retq 3789; 3790; AVX512-LABEL: trunc_xor_v16i64_v16i8: 3791; AVX512: # %bb.0: 3792; AVX512-NEXT: vpxorq %zmm3, %zmm1, %zmm1 3793; AVX512-NEXT: vpxorq %zmm2, %zmm0, %zmm0 3794; AVX512-NEXT: vpmovqd %zmm0, %ymm0 3795; AVX512-NEXT: vpmovqd %zmm1, %ymm1 3796; AVX512-NEXT: vinserti64x4 $1, %ymm1, %zmm0, %zmm0 3797; AVX512-NEXT: vpmovdb %zmm0, %xmm0 3798; AVX512-NEXT: vzeroupper 3799; AVX512-NEXT: retq 3800 %1 = xor <16 x i64> %a0, %a1 3801 %2 = trunc <16 x i64> %1 to <16 x i8> 3802 ret <16 x i8> %2 3803} 3804 3805define <16 x i8> @trunc_xor_v16i32_v16i8(<16 x i32> %a0, <16 x i32> %a1) nounwind { 3806; SSE-LABEL: trunc_xor_v16i32_v16i8: 3807; SSE: # %bb.0: 3808; SSE-NEXT: pxor %xmm4, %xmm0 3809; SSE-NEXT: pxor %xmm5, %xmm1 3810; SSE-NEXT: pxor %xmm6, %xmm2 3811; SSE-NEXT: pxor %xmm7, %xmm3 3812; SSE-NEXT: movdqa {{.*#+}} xmm4 = [255,0,0,0,255,0,0,0,255,0,0,0,255,0,0,0] 3813; SSE-NEXT: pand %xmm4, %xmm3 3814; SSE-NEXT: pand %xmm4, %xmm2 3815; SSE-NEXT: packuswb %xmm3, %xmm2 3816; SSE-NEXT: pand %xmm4, %xmm1 3817; SSE-NEXT: pand %xmm4, %xmm0 3818; SSE-NEXT: packuswb %xmm1, %xmm0 3819; SSE-NEXT: packuswb %xmm2, %xmm0 3820; SSE-NEXT: retq 3821; 3822; AVX1-LABEL: trunc_xor_v16i32_v16i8: 3823; AVX1: # %bb.0: 3824; AVX1-NEXT: vxorps %ymm2, %ymm0, %ymm0 3825; AVX1-NEXT: vxorps %ymm3, %ymm1, %ymm1 3826; AVX1-NEXT: vmovaps {{.*#+}} ymm2 = [255,255,255,255,255,255,255,255] 3827; AVX1-NEXT: vandps %ymm2, %ymm1, %ymm1 3828; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm3 3829; AVX1-NEXT: vpackusdw %xmm3, %xmm1, %xmm1 3830; AVX1-NEXT: vandps %ymm2, %ymm0, %ymm0 3831; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2 3832; AVX1-NEXT: vpackusdw %xmm2, %xmm0, %xmm0 3833; AVX1-NEXT: vpackuswb %xmm1, %xmm0, %xmm0 3834; AVX1-NEXT: vzeroupper 3835; AVX1-NEXT: retq 3836; 3837; AVX2-LABEL: trunc_xor_v16i32_v16i8: 3838; AVX2: # %bb.0: 3839; AVX2-NEXT: vpxor %ymm2, %ymm0, %ymm0 3840; AVX2-NEXT: vpxor %ymm3, %ymm1, %ymm1 3841; AVX2-NEXT: vmovdqa {{.*#+}} ymm2 = [0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15,16,17,20,21,24,25,28,29,24,25,28,29,28,29,30,31] 3842; AVX2-NEXT: vpshufb %ymm2, %ymm1, %ymm1 3843; AVX2-NEXT: vpermq {{.*#+}} ymm1 = ymm1[0,2,2,3] 3844; AVX2-NEXT: vmovdqa {{.*#+}} xmm3 = [255,255,255,255,255,255,255,255] 3845; AVX2-NEXT: vpand %xmm3, %xmm1, %xmm1 3846; AVX2-NEXT: vpshufb %ymm2, %ymm0, %ymm0 3847; AVX2-NEXT: vpermq {{.*#+}} ymm0 = ymm0[0,2,2,3] 3848; AVX2-NEXT: vpand %xmm3, %xmm0, %xmm0 3849; AVX2-NEXT: vpackuswb %xmm1, %xmm0, %xmm0 3850; AVX2-NEXT: vzeroupper 3851; AVX2-NEXT: retq 3852; 3853; AVX512-LABEL: trunc_xor_v16i32_v16i8: 3854; AVX512: # %bb.0: 3855; AVX512-NEXT: vpxord %zmm1, %zmm0, %zmm0 3856; AVX512-NEXT: vpmovdb %zmm0, %xmm0 3857; AVX512-NEXT: vzeroupper 3858; AVX512-NEXT: retq 3859 %1 = xor <16 x i32> %a0, %a1 3860 %2 = trunc <16 x i32> %1 to <16 x i8> 3861 ret <16 x i8> %2 3862} 3863 3864define <16 x i8> @trunc_xor_v16i16_v16i8(<16 x i16> %a0, <16 x i16> %a1) nounwind { 3865; SSE-LABEL: trunc_xor_v16i16_v16i8: 3866; SSE: # %bb.0: 3867; SSE-NEXT: pxor %xmm2, %xmm0 3868; SSE-NEXT: pxor %xmm3, %xmm1 3869; SSE-NEXT: movdqa {{.*#+}} xmm2 = [255,255,255,255,255,255,255,255] 3870; SSE-NEXT: pand %xmm2, %xmm1 3871; SSE-NEXT: pand %xmm2, %xmm0 3872; SSE-NEXT: packuswb %xmm1, %xmm0 3873; SSE-NEXT: retq 3874; 3875; AVX1-LABEL: trunc_xor_v16i16_v16i8: 3876; AVX1: # %bb.0: 3877; AVX1-NEXT: vxorps %ymm1, %ymm0, %ymm0 3878; AVX1-NEXT: vandps {{.*}}(%rip), %ymm0, %ymm0 3879; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1 3880; AVX1-NEXT: vpackuswb %xmm1, %xmm0, %xmm0 3881; AVX1-NEXT: vzeroupper 3882; AVX1-NEXT: retq 3883; 3884; AVX2-LABEL: trunc_xor_v16i16_v16i8: 3885; AVX2: # %bb.0: 3886; AVX2-NEXT: vpxor %ymm1, %ymm0, %ymm0 3887; AVX2-NEXT: vpand {{.*}}(%rip), %ymm0, %ymm0 3888; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1 3889; AVX2-NEXT: vpackuswb %xmm1, %xmm0, %xmm0 3890; AVX2-NEXT: vzeroupper 3891; AVX2-NEXT: retq 3892; 3893; AVX512F-LABEL: trunc_xor_v16i16_v16i8: 3894; AVX512F: # %bb.0: 3895; AVX512F-NEXT: vpxor %ymm1, %ymm0, %ymm0 3896; 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],zero 3897; AVX512F-NEXT: vpmovdb %zmm0, %xmm0 3898; AVX512F-NEXT: vzeroupper 3899; AVX512F-NEXT: retq 3900; 3901; AVX512BW-LABEL: trunc_xor_v16i16_v16i8: 3902; AVX512BW: # %bb.0: 3903; AVX512BW-NEXT: vpxor %ymm1, %ymm0, %ymm0 3904; AVX512BW-NEXT: vpmovwb %zmm0, %ymm0 3905; AVX512BW-NEXT: # kill: def $xmm0 killed $xmm0 killed $ymm0 3906; AVX512BW-NEXT: vzeroupper 3907; AVX512BW-NEXT: retq 3908; 3909; AVX512DQ-LABEL: trunc_xor_v16i16_v16i8: 3910; AVX512DQ: # %bb.0: 3911; AVX512DQ-NEXT: vpxor %ymm1, %ymm0, %ymm0 3912; 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],zero 3913; AVX512DQ-NEXT: vpmovdb %zmm0, %xmm0 3914; AVX512DQ-NEXT: vzeroupper 3915; AVX512DQ-NEXT: retq 3916 %1 = xor <16 x i16> %a0, %a1 3917 %2 = trunc <16 x i16> %1 to <16 x i8> 3918 ret <16 x i8> %2 3919} 3920 3921; 3922; xor to constant 3923; 3924 3925define <4 x i32> @trunc_xor_const_v4i64_v4i32(<4 x i64> %a0) nounwind { 3926; SSE-LABEL: trunc_xor_const_v4i64_v4i32: 3927; SSE: # %bb.0: 3928; SSE-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,2],xmm1[0,2] 3929; SSE-NEXT: xorps {{.*}}(%rip), %xmm0 3930; SSE-NEXT: retq 3931; 3932; AVX1-LABEL: trunc_xor_const_v4i64_v4i32: 3933; AVX1: # %bb.0: 3934; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1 3935; AVX1-NEXT: vshufps {{.*#+}} xmm0 = xmm0[0,2],xmm1[0,2] 3936; AVX1-NEXT: vxorps {{.*}}(%rip), %xmm0, %xmm0 3937; AVX1-NEXT: vzeroupper 3938; AVX1-NEXT: retq 3939; 3940; AVX2-SLOW-LABEL: trunc_xor_const_v4i64_v4i32: 3941; AVX2-SLOW: # %bb.0: 3942; AVX2-SLOW-NEXT: vextractf128 $1, %ymm0, %xmm1 3943; AVX2-SLOW-NEXT: vshufps {{.*#+}} xmm0 = xmm0[0,2],xmm1[0,2] 3944; AVX2-SLOW-NEXT: vxorps {{.*}}(%rip), %xmm0, %xmm0 3945; AVX2-SLOW-NEXT: vzeroupper 3946; AVX2-SLOW-NEXT: retq 3947; 3948; AVX2-FAST-LABEL: trunc_xor_const_v4i64_v4i32: 3949; AVX2-FAST: # %bb.0: 3950; AVX2-FAST-NEXT: vmovaps {{.*#+}} ymm1 = [0,2,4,6,4,6,6,7] 3951; AVX2-FAST-NEXT: vpermps %ymm0, %ymm1, %ymm0 3952; AVX2-FAST-NEXT: vxorps {{.*}}(%rip), %xmm0, %xmm0 3953; AVX2-FAST-NEXT: vzeroupper 3954; AVX2-FAST-NEXT: retq 3955; 3956; AVX512-LABEL: trunc_xor_const_v4i64_v4i32: 3957; AVX512: # %bb.0: 3958; AVX512-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm0 3959; AVX512-NEXT: vpmovqd %zmm0, %ymm0 3960; AVX512-NEXT: vpxor {{.*}}(%rip), %xmm0, %xmm0 3961; AVX512-NEXT: vzeroupper 3962; AVX512-NEXT: retq 3963 %1 = xor <4 x i64> %a0, <i64 0, i64 1, i64 2, i64 3> 3964 %2 = trunc <4 x i64> %1 to <4 x i32> 3965 ret <4 x i32> %2 3966} 3967 3968define <8 x i16> @trunc_xor_const_v8i64_v8i16(<8 x i64> %a0) nounwind { 3969; SSE-LABEL: trunc_xor_const_v8i64_v8i16: 3970; SSE: # %bb.0: 3971; SSE-NEXT: pshufd {{.*#+}} xmm1 = xmm1[0,2,2,3] 3972; SSE-NEXT: pshuflw {{.*#+}} xmm1 = xmm1[0,2,2,3,4,5,6,7] 3973; SSE-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3] 3974; SSE-NEXT: pshuflw {{.*#+}} xmm4 = xmm0[0,2,2,3,4,5,6,7] 3975; SSE-NEXT: punpckldq {{.*#+}} xmm4 = xmm4[0],xmm1[0],xmm4[1],xmm1[1] 3976; SSE-NEXT: pshufd {{.*#+}} xmm0 = xmm3[0,2,2,3] 3977; SSE-NEXT: pshuflw {{.*#+}} xmm1 = xmm0[0,1,0,2,4,5,6,7] 3978; SSE-NEXT: pshufd {{.*#+}} xmm0 = xmm2[0,2,2,3] 3979; SSE-NEXT: pshuflw {{.*#+}} xmm0 = xmm0[0,1,0,2,4,5,6,7] 3980; SSE-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1] 3981; SSE-NEXT: movsd {{.*#+}} xmm0 = xmm4[0],xmm0[1] 3982; SSE-NEXT: xorpd {{.*}}(%rip), %xmm0 3983; SSE-NEXT: retq 3984; 3985; AVX1-LABEL: trunc_xor_const_v8i64_v8i16: 3986; AVX1: # %bb.0: 3987; AVX1-NEXT: vmovaps {{.*#+}} ymm2 = [65535,65535,65535,65535] 3988; AVX1-NEXT: vandps %ymm2, %ymm1, %ymm1 3989; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm3 3990; AVX1-NEXT: vpackusdw %xmm3, %xmm1, %xmm1 3991; AVX1-NEXT: vandps %ymm2, %ymm0, %ymm0 3992; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2 3993; AVX1-NEXT: vpackusdw %xmm2, %xmm0, %xmm0 3994; AVX1-NEXT: vpackusdw %xmm1, %xmm0, %xmm0 3995; AVX1-NEXT: vpxor {{.*}}(%rip), %xmm0, %xmm0 3996; AVX1-NEXT: vzeroupper 3997; AVX1-NEXT: retq 3998; 3999; AVX2-SLOW-LABEL: trunc_xor_const_v8i64_v8i16: 4000; AVX2-SLOW: # %bb.0: 4001; AVX2-SLOW-NEXT: vperm2f128 {{.*#+}} ymm2 = ymm0[2,3],ymm1[2,3] 4002; AVX2-SLOW-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0 4003; AVX2-SLOW-NEXT: vshufps {{.*#+}} ymm0 = ymm0[0,2],ymm2[0,2],ymm0[4,6],ymm2[4,6] 4004; AVX2-SLOW-NEXT: vpshufb {{.*#+}} ymm0 = ymm0[0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15,16,17,20,21,24,25,28,29,24,25,28,29,28,29,30,31] 4005; AVX2-SLOW-NEXT: vpermq {{.*#+}} ymm0 = ymm0[0,2,2,3] 4006; AVX2-SLOW-NEXT: vpxor {{.*}}(%rip), %xmm0, %xmm0 4007; AVX2-SLOW-NEXT: vzeroupper 4008; AVX2-SLOW-NEXT: retq 4009; 4010; AVX2-FAST-LABEL: trunc_xor_const_v8i64_v8i16: 4011; AVX2-FAST: # %bb.0: 4012; AVX2-FAST-NEXT: vmovdqa {{.*#+}} ymm2 = [0,2,4,6,4,6,6,7] 4013; AVX2-FAST-NEXT: vpermd %ymm0, %ymm2, %ymm0 4014; AVX2-FAST-NEXT: vpermd %ymm1, %ymm2, %ymm1 4015; AVX2-FAST-NEXT: vinserti128 $1, %xmm1, %ymm0, %ymm0 4016; AVX2-FAST-NEXT: vpshufb {{.*#+}} ymm0 = ymm0[0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15,16,17,20,21,24,25,28,29,24,25,28,29,28,29,30,31] 4017; AVX2-FAST-NEXT: vpermq {{.*#+}} ymm0 = ymm0[0,2,2,3] 4018; AVX2-FAST-NEXT: vpxor {{.*}}(%rip), %xmm0, %xmm0 4019; AVX2-FAST-NEXT: vzeroupper 4020; AVX2-FAST-NEXT: retq 4021; 4022; AVX512-LABEL: trunc_xor_const_v8i64_v8i16: 4023; AVX512: # %bb.0: 4024; AVX512-NEXT: vpmovqw %zmm0, %xmm0 4025; AVX512-NEXT: vpxor {{.*}}(%rip), %xmm0, %xmm0 4026; AVX512-NEXT: vzeroupper 4027; AVX512-NEXT: retq 4028 %1 = xor <8 x i64> %a0, <i64 0, i64 1, i64 2, i64 3, i64 4, i64 5, i64 6, i64 7> 4029 %2 = trunc <8 x i64> %1 to <8 x i16> 4030 ret <8 x i16> %2 4031} 4032 4033define <8 x i16> @trunc_xor_const_v8i32_v8i16(<8 x i32> %a0) nounwind { 4034; SSE-LABEL: trunc_xor_const_v8i32_v8i16: 4035; SSE: # %bb.0: 4036; SSE-NEXT: pslld $16, %xmm1 4037; SSE-NEXT: psrad $16, %xmm1 4038; SSE-NEXT: pslld $16, %xmm0 4039; SSE-NEXT: psrad $16, %xmm0 4040; SSE-NEXT: packssdw %xmm1, %xmm0 4041; SSE-NEXT: pxor {{.*}}(%rip), %xmm0 4042; SSE-NEXT: retq 4043; 4044; AVX1-LABEL: trunc_xor_const_v8i32_v8i16: 4045; AVX1: # %bb.0: 4046; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1 4047; AVX1-NEXT: vmovdqa {{.*#+}} xmm2 = [0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15] 4048; AVX1-NEXT: vpshufb %xmm2, %xmm1, %xmm1 4049; AVX1-NEXT: vpshufb %xmm2, %xmm0, %xmm0 4050; AVX1-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0] 4051; AVX1-NEXT: vpxor {{.*}}(%rip), %xmm0, %xmm0 4052; AVX1-NEXT: vzeroupper 4053; AVX1-NEXT: retq 4054; 4055; AVX2-LABEL: trunc_xor_const_v8i32_v8i16: 4056; AVX2: # %bb.0: 4057; AVX2-NEXT: vpshufb {{.*#+}} ymm0 = ymm0[0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15,16,17,20,21,24,25,28,29,24,25,28,29,28,29,30,31] 4058; AVX2-NEXT: vpermq {{.*#+}} ymm0 = ymm0[0,2,2,3] 4059; AVX2-NEXT: vpxor {{.*}}(%rip), %xmm0, %xmm0 4060; AVX2-NEXT: vzeroupper 4061; AVX2-NEXT: retq 4062; 4063; AVX512-LABEL: trunc_xor_const_v8i32_v8i16: 4064; AVX512: # %bb.0: 4065; AVX512-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm0 4066; AVX512-NEXT: vpmovdw %zmm0, %ymm0 4067; AVX512-NEXT: vpxor {{.*}}(%rip), %xmm0, %xmm0 4068; AVX512-NEXT: vzeroupper 4069; AVX512-NEXT: retq 4070 %1 = xor <8 x i32> %a0, <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7> 4071 %2 = trunc <8 x i32> %1 to <8 x i16> 4072 ret <8 x i16> %2 4073} 4074 4075define <16 x i8> @trunc_xor_const_v16i64_v16i8(<16 x i64> %a0) nounwind { 4076; SSE-LABEL: trunc_xor_const_v16i64_v16i8: 4077; SSE: # %bb.0: 4078; SSE-NEXT: movdqa {{.*#+}} xmm8 = [255,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0] 4079; SSE-NEXT: pand %xmm8, %xmm7 4080; SSE-NEXT: pand %xmm8, %xmm6 4081; SSE-NEXT: packuswb %xmm7, %xmm6 4082; SSE-NEXT: pand %xmm8, %xmm5 4083; SSE-NEXT: pand %xmm8, %xmm4 4084; SSE-NEXT: packuswb %xmm5, %xmm4 4085; SSE-NEXT: packuswb %xmm6, %xmm4 4086; SSE-NEXT: pand %xmm8, %xmm3 4087; SSE-NEXT: pand %xmm8, %xmm2 4088; SSE-NEXT: packuswb %xmm3, %xmm2 4089; SSE-NEXT: pand %xmm8, %xmm1 4090; SSE-NEXT: pand %xmm8, %xmm0 4091; SSE-NEXT: packuswb %xmm1, %xmm0 4092; SSE-NEXT: packuswb %xmm2, %xmm0 4093; SSE-NEXT: packuswb %xmm4, %xmm0 4094; SSE-NEXT: pxor {{.*}}(%rip), %xmm0 4095; SSE-NEXT: retq 4096; 4097; AVX1-LABEL: trunc_xor_const_v16i64_v16i8: 4098; AVX1: # %bb.0: 4099; AVX1-NEXT: vmovaps {{.*#+}} ymm4 = [255,255,255,255] 4100; AVX1-NEXT: vandps %ymm4, %ymm3, %ymm3 4101; AVX1-NEXT: vextractf128 $1, %ymm3, %xmm5 4102; AVX1-NEXT: vpackusdw %xmm5, %xmm3, %xmm3 4103; AVX1-NEXT: vandps %ymm4, %ymm2, %ymm2 4104; AVX1-NEXT: vextractf128 $1, %ymm2, %xmm5 4105; AVX1-NEXT: vpackusdw %xmm5, %xmm2, %xmm2 4106; AVX1-NEXT: vpackusdw %xmm3, %xmm2, %xmm2 4107; AVX1-NEXT: vandps %ymm4, %ymm1, %ymm1 4108; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm3 4109; AVX1-NEXT: vpackusdw %xmm3, %xmm1, %xmm1 4110; AVX1-NEXT: vandps %ymm4, %ymm0, %ymm0 4111; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm3 4112; AVX1-NEXT: vpackusdw %xmm3, %xmm0, %xmm0 4113; AVX1-NEXT: vpackusdw %xmm1, %xmm0, %xmm0 4114; AVX1-NEXT: vpackuswb %xmm2, %xmm0, %xmm0 4115; AVX1-NEXT: vpxor {{.*}}(%rip), %xmm0, %xmm0 4116; AVX1-NEXT: vzeroupper 4117; AVX1-NEXT: retq 4118; 4119; AVX2-SLOW-LABEL: trunc_xor_const_v16i64_v16i8: 4120; AVX2-SLOW: # %bb.0: 4121; AVX2-SLOW-NEXT: vperm2f128 {{.*#+}} ymm4 = ymm2[2,3],ymm3[2,3] 4122; AVX2-SLOW-NEXT: vinsertf128 $1, %xmm3, %ymm2, %ymm2 4123; AVX2-SLOW-NEXT: vshufps {{.*#+}} ymm2 = ymm2[0,2],ymm4[0,2],ymm2[4,6],ymm4[4,6] 4124; AVX2-SLOW-NEXT: vmovdqa {{.*#+}} ymm3 = [0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15,16,17,20,21,24,25,28,29,24,25,28,29,28,29,30,31] 4125; AVX2-SLOW-NEXT: vpshufb %ymm3, %ymm2, %ymm2 4126; AVX2-SLOW-NEXT: vpermq {{.*#+}} ymm2 = ymm2[0,2,2,3] 4127; AVX2-SLOW-NEXT: vmovdqa {{.*#+}} xmm4 = [255,255,255,255,255,255,255,255] 4128; AVX2-SLOW-NEXT: vpand %xmm4, %xmm2, %xmm2 4129; AVX2-SLOW-NEXT: vperm2f128 {{.*#+}} ymm5 = ymm0[2,3],ymm1[2,3] 4130; AVX2-SLOW-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0 4131; AVX2-SLOW-NEXT: vshufps {{.*#+}} ymm0 = ymm0[0,2],ymm5[0,2],ymm0[4,6],ymm5[4,6] 4132; AVX2-SLOW-NEXT: vpshufb %ymm3, %ymm0, %ymm0 4133; AVX2-SLOW-NEXT: vpermq {{.*#+}} ymm0 = ymm0[0,2,2,3] 4134; AVX2-SLOW-NEXT: vpand %xmm4, %xmm0, %xmm0 4135; AVX2-SLOW-NEXT: vpackuswb %xmm2, %xmm0, %xmm0 4136; AVX2-SLOW-NEXT: vpxor {{.*}}(%rip), %xmm0, %xmm0 4137; AVX2-SLOW-NEXT: vzeroupper 4138; AVX2-SLOW-NEXT: retq 4139; 4140; AVX2-FAST-LABEL: trunc_xor_const_v16i64_v16i8: 4141; AVX2-FAST: # %bb.0: 4142; AVX2-FAST-NEXT: vmovdqa {{.*#+}} ymm4 = [0,2,4,6,4,6,6,7] 4143; AVX2-FAST-NEXT: vpermd %ymm2, %ymm4, %ymm2 4144; AVX2-FAST-NEXT: vpermd %ymm3, %ymm4, %ymm3 4145; AVX2-FAST-NEXT: vinserti128 $1, %xmm3, %ymm2, %ymm2 4146; AVX2-FAST-NEXT: vmovdqa {{.*#+}} ymm3 = [0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15,16,17,20,21,24,25,28,29,24,25,28,29,28,29,30,31] 4147; AVX2-FAST-NEXT: vpshufb %ymm3, %ymm2, %ymm2 4148; AVX2-FAST-NEXT: vpermq {{.*#+}} ymm2 = ymm2[0,2,2,3] 4149; AVX2-FAST-NEXT: vmovdqa {{.*#+}} xmm5 = [255,255,255,255,255,255,255,255] 4150; AVX2-FAST-NEXT: vpand %xmm5, %xmm2, %xmm2 4151; AVX2-FAST-NEXT: vpermd %ymm0, %ymm4, %ymm0 4152; AVX2-FAST-NEXT: vpermd %ymm1, %ymm4, %ymm1 4153; AVX2-FAST-NEXT: vinserti128 $1, %xmm1, %ymm0, %ymm0 4154; AVX2-FAST-NEXT: vpshufb %ymm3, %ymm0, %ymm0 4155; AVX2-FAST-NEXT: vpermq {{.*#+}} ymm0 = ymm0[0,2,2,3] 4156; AVX2-FAST-NEXT: vpand %xmm5, %xmm0, %xmm0 4157; AVX2-FAST-NEXT: vpackuswb %xmm2, %xmm0, %xmm0 4158; AVX2-FAST-NEXT: vpxor {{.*}}(%rip), %xmm0, %xmm0 4159; AVX2-FAST-NEXT: vzeroupper 4160; AVX2-FAST-NEXT: retq 4161; 4162; AVX512-LABEL: trunc_xor_const_v16i64_v16i8: 4163; AVX512: # %bb.0: 4164; AVX512-NEXT: vpmovqd %zmm0, %ymm0 4165; AVX512-NEXT: vpmovqd %zmm1, %ymm1 4166; AVX512-NEXT: vinserti64x4 $1, %ymm1, %zmm0, %zmm0 4167; AVX512-NEXT: vpmovdb %zmm0, %xmm0 4168; AVX512-NEXT: vpxor {{.*}}(%rip), %xmm0, %xmm0 4169; AVX512-NEXT: vzeroupper 4170; AVX512-NEXT: retq 4171 %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> 4172 %2 = trunc <16 x i64> %1 to <16 x i8> 4173 ret <16 x i8> %2 4174} 4175 4176define <16 x i8> @trunc_xor_const_v16i32_v16i8(<16 x i32> %a0) nounwind { 4177; SSE-LABEL: trunc_xor_const_v16i32_v16i8: 4178; SSE: # %bb.0: 4179; SSE-NEXT: movdqa {{.*#+}} xmm4 = [255,0,0,0,255,0,0,0,255,0,0,0,255,0,0,0] 4180; SSE-NEXT: pand %xmm4, %xmm3 4181; SSE-NEXT: pand %xmm4, %xmm2 4182; SSE-NEXT: packuswb %xmm3, %xmm2 4183; SSE-NEXT: pand %xmm4, %xmm1 4184; SSE-NEXT: pand %xmm4, %xmm0 4185; SSE-NEXT: packuswb %xmm1, %xmm0 4186; SSE-NEXT: packuswb %xmm2, %xmm0 4187; SSE-NEXT: pxor {{.*}}(%rip), %xmm0 4188; SSE-NEXT: retq 4189; 4190; AVX1-LABEL: trunc_xor_const_v16i32_v16i8: 4191; AVX1: # %bb.0: 4192; AVX1-NEXT: vmovaps {{.*#+}} ymm2 = [255,255,255,255,255,255,255,255] 4193; AVX1-NEXT: vandps %ymm2, %ymm1, %ymm1 4194; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm3 4195; AVX1-NEXT: vpackusdw %xmm3, %xmm1, %xmm1 4196; AVX1-NEXT: vandps %ymm2, %ymm0, %ymm0 4197; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2 4198; AVX1-NEXT: vpackusdw %xmm2, %xmm0, %xmm0 4199; AVX1-NEXT: vpackuswb %xmm1, %xmm0, %xmm0 4200; AVX1-NEXT: vpxor {{.*}}(%rip), %xmm0, %xmm0 4201; AVX1-NEXT: vzeroupper 4202; AVX1-NEXT: retq 4203; 4204; AVX2-LABEL: trunc_xor_const_v16i32_v16i8: 4205; AVX2: # %bb.0: 4206; AVX2-NEXT: vmovdqa {{.*#+}} ymm2 = [0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15,16,17,20,21,24,25,28,29,24,25,28,29,28,29,30,31] 4207; AVX2-NEXT: vpshufb %ymm2, %ymm1, %ymm1 4208; AVX2-NEXT: vpermq {{.*#+}} ymm1 = ymm1[0,2,2,3] 4209; AVX2-NEXT: vmovdqa {{.*#+}} xmm3 = [255,255,255,255,255,255,255,255] 4210; AVX2-NEXT: vpand %xmm3, %xmm1, %xmm1 4211; AVX2-NEXT: vpshufb %ymm2, %ymm0, %ymm0 4212; AVX2-NEXT: vpermq {{.*#+}} ymm0 = ymm0[0,2,2,3] 4213; AVX2-NEXT: vpand %xmm3, %xmm0, %xmm0 4214; AVX2-NEXT: vpackuswb %xmm1, %xmm0, %xmm0 4215; AVX2-NEXT: vpxor {{.*}}(%rip), %xmm0, %xmm0 4216; AVX2-NEXT: vzeroupper 4217; AVX2-NEXT: retq 4218; 4219; AVX512-LABEL: trunc_xor_const_v16i32_v16i8: 4220; AVX512: # %bb.0: 4221; AVX512-NEXT: vpmovdb %zmm0, %xmm0 4222; AVX512-NEXT: vpxor {{.*}}(%rip), %xmm0, %xmm0 4223; AVX512-NEXT: vzeroupper 4224; AVX512-NEXT: retq 4225 %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> 4226 %2 = trunc <16 x i32> %1 to <16 x i8> 4227 ret <16 x i8> %2 4228} 4229 4230define <16 x i8> @trunc_xor_const_v16i16_v16i8(<16 x i16> %a0) nounwind { 4231; SSE-LABEL: trunc_xor_const_v16i16_v16i8: 4232; SSE: # %bb.0: 4233; SSE-NEXT: movdqa {{.*#+}} xmm2 = [255,255,255,255,255,255,255,255] 4234; SSE-NEXT: pand %xmm2, %xmm1 4235; SSE-NEXT: pand %xmm2, %xmm0 4236; SSE-NEXT: packuswb %xmm1, %xmm0 4237; SSE-NEXT: pxor {{.*}}(%rip), %xmm0 4238; SSE-NEXT: retq 4239; 4240; AVX1-LABEL: trunc_xor_const_v16i16_v16i8: 4241; AVX1: # %bb.0: 4242; AVX1-NEXT: vandps {{.*}}(%rip), %ymm0, %ymm0 4243; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1 4244; AVX1-NEXT: vpackuswb %xmm1, %xmm0, %xmm0 4245; AVX1-NEXT: vpxor {{.*}}(%rip), %xmm0, %xmm0 4246; AVX1-NEXT: vzeroupper 4247; AVX1-NEXT: retq 4248; 4249; AVX2-LABEL: trunc_xor_const_v16i16_v16i8: 4250; AVX2: # %bb.0: 4251; AVX2-NEXT: vpand {{.*}}(%rip), %ymm0, %ymm0 4252; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1 4253; AVX2-NEXT: vpackuswb %xmm1, %xmm0, %xmm0 4254; AVX2-NEXT: vpxor {{.*}}(%rip), %xmm0, %xmm0 4255; AVX2-NEXT: vzeroupper 4256; AVX2-NEXT: retq 4257; 4258; AVX512F-LABEL: trunc_xor_const_v16i16_v16i8: 4259; AVX512F: # %bb.0: 4260; 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],zero 4261; AVX512F-NEXT: vpmovdb %zmm0, %xmm0 4262; AVX512F-NEXT: vpxor {{.*}}(%rip), %xmm0, %xmm0 4263; AVX512F-NEXT: vzeroupper 4264; AVX512F-NEXT: retq 4265; 4266; AVX512BW-LABEL: trunc_xor_const_v16i16_v16i8: 4267; AVX512BW: # %bb.0: 4268; AVX512BW-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm0 4269; AVX512BW-NEXT: vpmovwb %zmm0, %ymm0 4270; AVX512BW-NEXT: vpxor {{.*}}(%rip), %xmm0, %xmm0 4271; AVX512BW-NEXT: vzeroupper 4272; AVX512BW-NEXT: retq 4273; 4274; AVX512DQ-LABEL: trunc_xor_const_v16i16_v16i8: 4275; AVX512DQ: # %bb.0: 4276; 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],zero 4277; AVX512DQ-NEXT: vpmovdb %zmm0, %xmm0 4278; AVX512DQ-NEXT: vpxor {{.*}}(%rip), %xmm0, %xmm0 4279; AVX512DQ-NEXT: vzeroupper 4280; AVX512DQ-NEXT: retq 4281 %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> 4282 %2 = trunc <16 x i16> %1 to <16 x i8> 4283 ret <16 x i8> %2 4284} 4285 4286; 4287; or 4288; 4289 4290define <4 x i32> @trunc_or_v4i64_v4i32(<4 x i64> %a0, <4 x i64> %a1) nounwind { 4291; SSE-LABEL: trunc_or_v4i64_v4i32: 4292; SSE: # %bb.0: 4293; SSE-NEXT: orps %xmm3, %xmm1 4294; SSE-NEXT: orps %xmm2, %xmm0 4295; SSE-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,2],xmm1[0,2] 4296; SSE-NEXT: retq 4297; 4298; AVX1-LABEL: trunc_or_v4i64_v4i32: 4299; AVX1: # %bb.0: 4300; AVX1-NEXT: vorps %ymm1, %ymm0, %ymm0 4301; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1 4302; AVX1-NEXT: vshufps {{.*#+}} xmm0 = xmm0[0,2],xmm1[0,2] 4303; AVX1-NEXT: vzeroupper 4304; AVX1-NEXT: retq 4305; 4306; AVX2-SLOW-LABEL: trunc_or_v4i64_v4i32: 4307; AVX2-SLOW: # %bb.0: 4308; AVX2-SLOW-NEXT: vorps %ymm1, %ymm0, %ymm0 4309; AVX2-SLOW-NEXT: vextractf128 $1, %ymm0, %xmm1 4310; AVX2-SLOW-NEXT: vshufps {{.*#+}} xmm0 = xmm0[0,2],xmm1[0,2] 4311; AVX2-SLOW-NEXT: vzeroupper 4312; AVX2-SLOW-NEXT: retq 4313; 4314; AVX2-FAST-LABEL: trunc_or_v4i64_v4i32: 4315; AVX2-FAST: # %bb.0: 4316; AVX2-FAST-NEXT: vorps %ymm1, %ymm0, %ymm0 4317; AVX2-FAST-NEXT: vmovaps {{.*#+}} ymm1 = [0,2,4,6,4,6,6,7] 4318; AVX2-FAST-NEXT: vpermps %ymm0, %ymm1, %ymm0 4319; AVX2-FAST-NEXT: # kill: def $xmm0 killed $xmm0 killed $ymm0 4320; AVX2-FAST-NEXT: vzeroupper 4321; AVX2-FAST-NEXT: retq 4322; 4323; AVX512-LABEL: trunc_or_v4i64_v4i32: 4324; AVX512: # %bb.0: 4325; AVX512-NEXT: vpor %ymm1, %ymm0, %ymm0 4326; AVX512-NEXT: vpmovqd %zmm0, %ymm0 4327; AVX512-NEXT: # kill: def $xmm0 killed $xmm0 killed $ymm0 4328; AVX512-NEXT: vzeroupper 4329; AVX512-NEXT: retq 4330 %1 = or <4 x i64> %a0, %a1 4331 %2 = trunc <4 x i64> %1 to <4 x i32> 4332 ret <4 x i32> %2 4333} 4334 4335define <8 x i16> @trunc_or_v8i64_v8i16(<8 x i64> %a0, <8 x i64> %a1) nounwind { 4336; SSE-LABEL: trunc_or_v8i64_v8i16: 4337; SSE: # %bb.0: 4338; SSE-NEXT: por %xmm6, %xmm2 4339; SSE-NEXT: por %xmm7, %xmm3 4340; SSE-NEXT: por %xmm4, %xmm0 4341; SSE-NEXT: por %xmm5, %xmm1 4342; SSE-NEXT: pshufd {{.*#+}} xmm1 = xmm1[0,2,2,3] 4343; SSE-NEXT: pshuflw {{.*#+}} xmm1 = xmm1[0,2,2,3,4,5,6,7] 4344; SSE-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3] 4345; SSE-NEXT: pshuflw {{.*#+}} xmm4 = xmm0[0,2,2,3,4,5,6,7] 4346; SSE-NEXT: punpckldq {{.*#+}} xmm4 = xmm4[0],xmm1[0],xmm4[1],xmm1[1] 4347; SSE-NEXT: pshufd {{.*#+}} xmm0 = xmm3[0,2,2,3] 4348; SSE-NEXT: pshuflw {{.*#+}} xmm1 = xmm0[0,1,0,2,4,5,6,7] 4349; SSE-NEXT: pshufd {{.*#+}} xmm0 = xmm2[0,2,2,3] 4350; SSE-NEXT: pshuflw {{.*#+}} xmm0 = xmm0[0,1,0,2,4,5,6,7] 4351; SSE-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1] 4352; SSE-NEXT: movsd {{.*#+}} xmm0 = xmm4[0],xmm0[1] 4353; SSE-NEXT: retq 4354; 4355; AVX1-LABEL: trunc_or_v8i64_v8i16: 4356; AVX1: # %bb.0: 4357; AVX1-NEXT: vorps %ymm2, %ymm0, %ymm0 4358; AVX1-NEXT: vorps %ymm3, %ymm1, %ymm1 4359; AVX1-NEXT: vmovaps {{.*#+}} ymm2 = [65535,65535,65535,65535] 4360; AVX1-NEXT: vandps %ymm2, %ymm1, %ymm1 4361; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm3 4362; AVX1-NEXT: vpackusdw %xmm3, %xmm1, %xmm1 4363; AVX1-NEXT: vandps %ymm2, %ymm0, %ymm0 4364; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2 4365; AVX1-NEXT: vpackusdw %xmm2, %xmm0, %xmm0 4366; AVX1-NEXT: vpackusdw %xmm1, %xmm0, %xmm0 4367; AVX1-NEXT: vzeroupper 4368; AVX1-NEXT: retq 4369; 4370; AVX2-SLOW-LABEL: trunc_or_v8i64_v8i16: 4371; AVX2-SLOW: # %bb.0: 4372; AVX2-SLOW-NEXT: vorps %ymm3, %ymm1, %ymm1 4373; AVX2-SLOW-NEXT: vorps %ymm2, %ymm0, %ymm0 4374; AVX2-SLOW-NEXT: vperm2f128 {{.*#+}} ymm2 = ymm0[2,3],ymm1[2,3] 4375; AVX2-SLOW-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0 4376; AVX2-SLOW-NEXT: vshufps {{.*#+}} ymm0 = ymm0[0,2],ymm2[0,2],ymm0[4,6],ymm2[4,6] 4377; AVX2-SLOW-NEXT: vpshufb {{.*#+}} ymm0 = ymm0[0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15,16,17,20,21,24,25,28,29,24,25,28,29,28,29,30,31] 4378; AVX2-SLOW-NEXT: vpermq {{.*#+}} ymm0 = ymm0[0,2,2,3] 4379; AVX2-SLOW-NEXT: # kill: def $xmm0 killed $xmm0 killed $ymm0 4380; AVX2-SLOW-NEXT: vzeroupper 4381; AVX2-SLOW-NEXT: retq 4382; 4383; AVX2-FAST-LABEL: trunc_or_v8i64_v8i16: 4384; AVX2-FAST: # %bb.0: 4385; AVX2-FAST-NEXT: vpor %ymm3, %ymm1, %ymm1 4386; AVX2-FAST-NEXT: vpor %ymm2, %ymm0, %ymm0 4387; AVX2-FAST-NEXT: vmovdqa {{.*#+}} ymm2 = [0,2,4,6,4,6,6,7] 4388; AVX2-FAST-NEXT: vpermd %ymm0, %ymm2, %ymm0 4389; AVX2-FAST-NEXT: vpermd %ymm1, %ymm2, %ymm1 4390; AVX2-FAST-NEXT: vinserti128 $1, %xmm1, %ymm0, %ymm0 4391; AVX2-FAST-NEXT: vpshufb {{.*#+}} ymm0 = ymm0[0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15,16,17,20,21,24,25,28,29,24,25,28,29,28,29,30,31] 4392; AVX2-FAST-NEXT: vpermq {{.*#+}} ymm0 = ymm0[0,2,2,3] 4393; AVX2-FAST-NEXT: # kill: def $xmm0 killed $xmm0 killed $ymm0 4394; AVX2-FAST-NEXT: vzeroupper 4395; AVX2-FAST-NEXT: retq 4396; 4397; AVX512-LABEL: trunc_or_v8i64_v8i16: 4398; AVX512: # %bb.0: 4399; AVX512-NEXT: vporq %zmm1, %zmm0, %zmm0 4400; AVX512-NEXT: vpmovqw %zmm0, %xmm0 4401; AVX512-NEXT: vzeroupper 4402; AVX512-NEXT: retq 4403 %1 = or <8 x i64> %a0, %a1 4404 %2 = trunc <8 x i64> %1 to <8 x i16> 4405 ret <8 x i16> %2 4406} 4407 4408define <8 x i16> @trunc_or_v8i32_v8i16(<8 x i32> %a0, <8 x i32> %a1) nounwind { 4409; SSE-LABEL: trunc_or_v8i32_v8i16: 4410; SSE: # %bb.0: 4411; SSE-NEXT: por %xmm2, %xmm0 4412; SSE-NEXT: por %xmm3, %xmm1 4413; SSE-NEXT: pslld $16, %xmm1 4414; SSE-NEXT: psrad $16, %xmm1 4415; SSE-NEXT: pslld $16, %xmm0 4416; SSE-NEXT: psrad $16, %xmm0 4417; SSE-NEXT: packssdw %xmm1, %xmm0 4418; SSE-NEXT: retq 4419; 4420; AVX1-LABEL: trunc_or_v8i32_v8i16: 4421; AVX1: # %bb.0: 4422; AVX1-NEXT: vorps %ymm1, %ymm0, %ymm0 4423; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1 4424; AVX1-NEXT: vmovdqa {{.*#+}} xmm2 = [0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15] 4425; AVX1-NEXT: vpshufb %xmm2, %xmm1, %xmm1 4426; AVX1-NEXT: vpshufb %xmm2, %xmm0, %xmm0 4427; AVX1-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0] 4428; AVX1-NEXT: vzeroupper 4429; AVX1-NEXT: retq 4430; 4431; AVX2-LABEL: trunc_or_v8i32_v8i16: 4432; AVX2: # %bb.0: 4433; AVX2-NEXT: vpor %ymm1, %ymm0, %ymm0 4434; AVX2-NEXT: vpshufb {{.*#+}} ymm0 = ymm0[0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15,16,17,20,21,24,25,28,29,24,25,28,29,28,29,30,31] 4435; AVX2-NEXT: vpermq {{.*#+}} ymm0 = ymm0[0,2,2,3] 4436; AVX2-NEXT: # kill: def $xmm0 killed $xmm0 killed $ymm0 4437; AVX2-NEXT: vzeroupper 4438; AVX2-NEXT: retq 4439; 4440; AVX512-LABEL: trunc_or_v8i32_v8i16: 4441; AVX512: # %bb.0: 4442; AVX512-NEXT: vpor %ymm1, %ymm0, %ymm0 4443; AVX512-NEXT: vpmovdw %zmm0, %ymm0 4444; AVX512-NEXT: # kill: def $xmm0 killed $xmm0 killed $ymm0 4445; AVX512-NEXT: vzeroupper 4446; AVX512-NEXT: retq 4447 %1 = or <8 x i32> %a0, %a1 4448 %2 = trunc <8 x i32> %1 to <8 x i16> 4449 ret <8 x i16> %2 4450} 4451 4452define <16 x i8> @trunc_or_v16i64_v16i8(<16 x i64> %a0, <16 x i64> %a1) nounwind { 4453; SSE-LABEL: trunc_or_v16i64_v16i8: 4454; SSE: # %bb.0: 4455; SSE-NEXT: por {{[0-9]+}}(%rsp), %xmm0 4456; SSE-NEXT: por {{[0-9]+}}(%rsp), %xmm1 4457; SSE-NEXT: por {{[0-9]+}}(%rsp), %xmm2 4458; SSE-NEXT: por {{[0-9]+}}(%rsp), %xmm3 4459; SSE-NEXT: por {{[0-9]+}}(%rsp), %xmm4 4460; SSE-NEXT: por {{[0-9]+}}(%rsp), %xmm5 4461; SSE-NEXT: por {{[0-9]+}}(%rsp), %xmm6 4462; SSE-NEXT: por {{[0-9]+}}(%rsp), %xmm7 4463; SSE-NEXT: movdqa {{.*#+}} xmm8 = [255,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0] 4464; SSE-NEXT: pand %xmm8, %xmm7 4465; SSE-NEXT: pand %xmm8, %xmm6 4466; SSE-NEXT: packuswb %xmm7, %xmm6 4467; SSE-NEXT: pand %xmm8, %xmm5 4468; SSE-NEXT: pand %xmm8, %xmm4 4469; SSE-NEXT: packuswb %xmm5, %xmm4 4470; SSE-NEXT: packuswb %xmm6, %xmm4 4471; SSE-NEXT: pand %xmm8, %xmm3 4472; SSE-NEXT: pand %xmm8, %xmm2 4473; SSE-NEXT: packuswb %xmm3, %xmm2 4474; SSE-NEXT: pand %xmm8, %xmm1 4475; SSE-NEXT: pand %xmm8, %xmm0 4476; SSE-NEXT: packuswb %xmm1, %xmm0 4477; SSE-NEXT: packuswb %xmm2, %xmm0 4478; SSE-NEXT: packuswb %xmm4, %xmm0 4479; SSE-NEXT: retq 4480; 4481; AVX1-LABEL: trunc_or_v16i64_v16i8: 4482; AVX1: # %bb.0: 4483; AVX1-NEXT: vorps %ymm4, %ymm0, %ymm0 4484; AVX1-NEXT: vorps %ymm5, %ymm1, %ymm1 4485; AVX1-NEXT: vorps %ymm6, %ymm2, %ymm2 4486; AVX1-NEXT: vorps %ymm7, %ymm3, %ymm3 4487; AVX1-NEXT: vmovaps {{.*#+}} ymm4 = [255,255,255,255] 4488; AVX1-NEXT: vandps %ymm4, %ymm3, %ymm3 4489; AVX1-NEXT: vextractf128 $1, %ymm3, %xmm5 4490; AVX1-NEXT: vpackusdw %xmm5, %xmm3, %xmm3 4491; AVX1-NEXT: vandps %ymm4, %ymm2, %ymm2 4492; AVX1-NEXT: vextractf128 $1, %ymm2, %xmm5 4493; AVX1-NEXT: vpackusdw %xmm5, %xmm2, %xmm2 4494; AVX1-NEXT: vpackusdw %xmm3, %xmm2, %xmm2 4495; AVX1-NEXT: vandps %ymm4, %ymm1, %ymm1 4496; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm3 4497; AVX1-NEXT: vpackusdw %xmm3, %xmm1, %xmm1 4498; AVX1-NEXT: vandps %ymm4, %ymm0, %ymm0 4499; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm3 4500; AVX1-NEXT: vpackusdw %xmm3, %xmm0, %xmm0 4501; AVX1-NEXT: vpackusdw %xmm1, %xmm0, %xmm0 4502; AVX1-NEXT: vpackuswb %xmm2, %xmm0, %xmm0 4503; AVX1-NEXT: vzeroupper 4504; AVX1-NEXT: retq 4505; 4506; AVX2-SLOW-LABEL: trunc_or_v16i64_v16i8: 4507; AVX2-SLOW: # %bb.0: 4508; AVX2-SLOW-NEXT: vorps %ymm5, %ymm1, %ymm1 4509; AVX2-SLOW-NEXT: vorps %ymm4, %ymm0, %ymm0 4510; AVX2-SLOW-NEXT: vorps %ymm7, %ymm3, %ymm3 4511; AVX2-SLOW-NEXT: vorps %ymm6, %ymm2, %ymm2 4512; AVX2-SLOW-NEXT: vperm2f128 {{.*#+}} ymm4 = ymm2[2,3],ymm3[2,3] 4513; AVX2-SLOW-NEXT: vinsertf128 $1, %xmm3, %ymm2, %ymm2 4514; AVX2-SLOW-NEXT: vshufps {{.*#+}} ymm2 = ymm2[0,2],ymm4[0,2],ymm2[4,6],ymm4[4,6] 4515; AVX2-SLOW-NEXT: vmovdqa {{.*#+}} ymm3 = [0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15,16,17,20,21,24,25,28,29,24,25,28,29,28,29,30,31] 4516; AVX2-SLOW-NEXT: vpshufb %ymm3, %ymm2, %ymm2 4517; AVX2-SLOW-NEXT: vpermq {{.*#+}} ymm2 = ymm2[0,2,2,3] 4518; AVX2-SLOW-NEXT: vmovdqa {{.*#+}} xmm4 = [255,255,255,255,255,255,255,255] 4519; AVX2-SLOW-NEXT: vpand %xmm4, %xmm2, %xmm2 4520; AVX2-SLOW-NEXT: vperm2f128 {{.*#+}} ymm5 = ymm0[2,3],ymm1[2,3] 4521; AVX2-SLOW-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0 4522; AVX2-SLOW-NEXT: vshufps {{.*#+}} ymm0 = ymm0[0,2],ymm5[0,2],ymm0[4,6],ymm5[4,6] 4523; AVX2-SLOW-NEXT: vpshufb %ymm3, %ymm0, %ymm0 4524; AVX2-SLOW-NEXT: vpermq {{.*#+}} ymm0 = ymm0[0,2,2,3] 4525; AVX2-SLOW-NEXT: vpand %xmm4, %xmm0, %xmm0 4526; AVX2-SLOW-NEXT: vpackuswb %xmm2, %xmm0, %xmm0 4527; AVX2-SLOW-NEXT: vzeroupper 4528; AVX2-SLOW-NEXT: retq 4529; 4530; AVX2-FAST-LABEL: trunc_or_v16i64_v16i8: 4531; AVX2-FAST: # %bb.0: 4532; AVX2-FAST-NEXT: vpor %ymm5, %ymm1, %ymm1 4533; AVX2-FAST-NEXT: vpor %ymm4, %ymm0, %ymm0 4534; AVX2-FAST-NEXT: vpor %ymm7, %ymm3, %ymm3 4535; AVX2-FAST-NEXT: vpor %ymm6, %ymm2, %ymm2 4536; AVX2-FAST-NEXT: vmovdqa {{.*#+}} ymm4 = [0,2,4,6,4,6,6,7] 4537; AVX2-FAST-NEXT: vpermd %ymm2, %ymm4, %ymm2 4538; AVX2-FAST-NEXT: vpermd %ymm3, %ymm4, %ymm3 4539; AVX2-FAST-NEXT: vinserti128 $1, %xmm3, %ymm2, %ymm2 4540; AVX2-FAST-NEXT: vmovdqa {{.*#+}} ymm3 = [0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15,16,17,20,21,24,25,28,29,24,25,28,29,28,29,30,31] 4541; AVX2-FAST-NEXT: vpshufb %ymm3, %ymm2, %ymm2 4542; AVX2-FAST-NEXT: vpermq {{.*#+}} ymm2 = ymm2[0,2,2,3] 4543; AVX2-FAST-NEXT: vmovdqa {{.*#+}} xmm5 = [255,255,255,255,255,255,255,255] 4544; AVX2-FAST-NEXT: vpand %xmm5, %xmm2, %xmm2 4545; AVX2-FAST-NEXT: vpermd %ymm0, %ymm4, %ymm0 4546; AVX2-FAST-NEXT: vpermd %ymm1, %ymm4, %ymm1 4547; AVX2-FAST-NEXT: vinserti128 $1, %xmm1, %ymm0, %ymm0 4548; AVX2-FAST-NEXT: vpshufb %ymm3, %ymm0, %ymm0 4549; AVX2-FAST-NEXT: vpermq {{.*#+}} ymm0 = ymm0[0,2,2,3] 4550; AVX2-FAST-NEXT: vpand %xmm5, %xmm0, %xmm0 4551; AVX2-FAST-NEXT: vpackuswb %xmm2, %xmm0, %xmm0 4552; AVX2-FAST-NEXT: vzeroupper 4553; AVX2-FAST-NEXT: retq 4554; 4555; AVX512-LABEL: trunc_or_v16i64_v16i8: 4556; AVX512: # %bb.0: 4557; AVX512-NEXT: vporq %zmm3, %zmm1, %zmm1 4558; AVX512-NEXT: vporq %zmm2, %zmm0, %zmm0 4559; AVX512-NEXT: vpmovqd %zmm0, %ymm0 4560; AVX512-NEXT: vpmovqd %zmm1, %ymm1 4561; AVX512-NEXT: vinserti64x4 $1, %ymm1, %zmm0, %zmm0 4562; AVX512-NEXT: vpmovdb %zmm0, %xmm0 4563; AVX512-NEXT: vzeroupper 4564; AVX512-NEXT: retq 4565 %1 = or <16 x i64> %a0, %a1 4566 %2 = trunc <16 x i64> %1 to <16 x i8> 4567 ret <16 x i8> %2 4568} 4569 4570define <16 x i8> @trunc_or_v16i32_v16i8(<16 x i32> %a0, <16 x i32> %a1) nounwind { 4571; SSE-LABEL: trunc_or_v16i32_v16i8: 4572; SSE: # %bb.0: 4573; SSE-NEXT: por %xmm4, %xmm0 4574; SSE-NEXT: por %xmm5, %xmm1 4575; SSE-NEXT: por %xmm6, %xmm2 4576; SSE-NEXT: por %xmm7, %xmm3 4577; SSE-NEXT: movdqa {{.*#+}} xmm4 = [255,0,0,0,255,0,0,0,255,0,0,0,255,0,0,0] 4578; SSE-NEXT: pand %xmm4, %xmm3 4579; SSE-NEXT: pand %xmm4, %xmm2 4580; SSE-NEXT: packuswb %xmm3, %xmm2 4581; SSE-NEXT: pand %xmm4, %xmm1 4582; SSE-NEXT: pand %xmm4, %xmm0 4583; SSE-NEXT: packuswb %xmm1, %xmm0 4584; SSE-NEXT: packuswb %xmm2, %xmm0 4585; SSE-NEXT: retq 4586; 4587; AVX1-LABEL: trunc_or_v16i32_v16i8: 4588; AVX1: # %bb.0: 4589; AVX1-NEXT: vorps %ymm2, %ymm0, %ymm0 4590; AVX1-NEXT: vorps %ymm3, %ymm1, %ymm1 4591; AVX1-NEXT: vmovaps {{.*#+}} ymm2 = [255,255,255,255,255,255,255,255] 4592; AVX1-NEXT: vandps %ymm2, %ymm1, %ymm1 4593; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm3 4594; AVX1-NEXT: vpackusdw %xmm3, %xmm1, %xmm1 4595; AVX1-NEXT: vandps %ymm2, %ymm0, %ymm0 4596; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2 4597; AVX1-NEXT: vpackusdw %xmm2, %xmm0, %xmm0 4598; AVX1-NEXT: vpackuswb %xmm1, %xmm0, %xmm0 4599; AVX1-NEXT: vzeroupper 4600; AVX1-NEXT: retq 4601; 4602; AVX2-LABEL: trunc_or_v16i32_v16i8: 4603; AVX2: # %bb.0: 4604; AVX2-NEXT: vpor %ymm2, %ymm0, %ymm0 4605; AVX2-NEXT: vpor %ymm3, %ymm1, %ymm1 4606; AVX2-NEXT: vmovdqa {{.*#+}} ymm2 = [0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15,16,17,20,21,24,25,28,29,24,25,28,29,28,29,30,31] 4607; AVX2-NEXT: vpshufb %ymm2, %ymm1, %ymm1 4608; AVX2-NEXT: vpermq {{.*#+}} ymm1 = ymm1[0,2,2,3] 4609; AVX2-NEXT: vmovdqa {{.*#+}} xmm3 = [255,255,255,255,255,255,255,255] 4610; AVX2-NEXT: vpand %xmm3, %xmm1, %xmm1 4611; AVX2-NEXT: vpshufb %ymm2, %ymm0, %ymm0 4612; AVX2-NEXT: vpermq {{.*#+}} ymm0 = ymm0[0,2,2,3] 4613; AVX2-NEXT: vpand %xmm3, %xmm0, %xmm0 4614; AVX2-NEXT: vpackuswb %xmm1, %xmm0, %xmm0 4615; AVX2-NEXT: vzeroupper 4616; AVX2-NEXT: retq 4617; 4618; AVX512-LABEL: trunc_or_v16i32_v16i8: 4619; AVX512: # %bb.0: 4620; AVX512-NEXT: vpord %zmm1, %zmm0, %zmm0 4621; AVX512-NEXT: vpmovdb %zmm0, %xmm0 4622; AVX512-NEXT: vzeroupper 4623; AVX512-NEXT: retq 4624 %1 = or <16 x i32> %a0, %a1 4625 %2 = trunc <16 x i32> %1 to <16 x i8> 4626 ret <16 x i8> %2 4627} 4628 4629define <16 x i8> @trunc_or_v16i16_v16i8(<16 x i16> %a0, <16 x i16> %a1) nounwind { 4630; SSE-LABEL: trunc_or_v16i16_v16i8: 4631; SSE: # %bb.0: 4632; SSE-NEXT: por %xmm2, %xmm0 4633; SSE-NEXT: por %xmm3, %xmm1 4634; SSE-NEXT: movdqa {{.*#+}} xmm2 = [255,255,255,255,255,255,255,255] 4635; SSE-NEXT: pand %xmm2, %xmm1 4636; SSE-NEXT: pand %xmm2, %xmm0 4637; SSE-NEXT: packuswb %xmm1, %xmm0 4638; SSE-NEXT: retq 4639; 4640; AVX1-LABEL: trunc_or_v16i16_v16i8: 4641; AVX1: # %bb.0: 4642; AVX1-NEXT: vorps %ymm1, %ymm0, %ymm0 4643; AVX1-NEXT: vandps {{.*}}(%rip), %ymm0, %ymm0 4644; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1 4645; AVX1-NEXT: vpackuswb %xmm1, %xmm0, %xmm0 4646; AVX1-NEXT: vzeroupper 4647; AVX1-NEXT: retq 4648; 4649; AVX2-LABEL: trunc_or_v16i16_v16i8: 4650; AVX2: # %bb.0: 4651; AVX2-NEXT: vpor %ymm1, %ymm0, %ymm0 4652; AVX2-NEXT: vpand {{.*}}(%rip), %ymm0, %ymm0 4653; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1 4654; AVX2-NEXT: vpackuswb %xmm1, %xmm0, %xmm0 4655; AVX2-NEXT: vzeroupper 4656; AVX2-NEXT: retq 4657; 4658; AVX512F-LABEL: trunc_or_v16i16_v16i8: 4659; AVX512F: # %bb.0: 4660; AVX512F-NEXT: vpor %ymm1, %ymm0, %ymm0 4661; 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],zero 4662; AVX512F-NEXT: vpmovdb %zmm0, %xmm0 4663; AVX512F-NEXT: vzeroupper 4664; AVX512F-NEXT: retq 4665; 4666; AVX512BW-LABEL: trunc_or_v16i16_v16i8: 4667; AVX512BW: # %bb.0: 4668; AVX512BW-NEXT: vpor %ymm1, %ymm0, %ymm0 4669; AVX512BW-NEXT: vpmovwb %zmm0, %ymm0 4670; AVX512BW-NEXT: # kill: def $xmm0 killed $xmm0 killed $ymm0 4671; AVX512BW-NEXT: vzeroupper 4672; AVX512BW-NEXT: retq 4673; 4674; AVX512DQ-LABEL: trunc_or_v16i16_v16i8: 4675; AVX512DQ: # %bb.0: 4676; AVX512DQ-NEXT: vpor %ymm1, %ymm0, %ymm0 4677; 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],zero 4678; AVX512DQ-NEXT: vpmovdb %zmm0, %xmm0 4679; AVX512DQ-NEXT: vzeroupper 4680; AVX512DQ-NEXT: retq 4681 %1 = or <16 x i16> %a0, %a1 4682 %2 = trunc <16 x i16> %1 to <16 x i8> 4683 ret <16 x i8> %2 4684} 4685 4686; 4687; or to constant 4688; 4689 4690define <4 x i32> @trunc_or_const_v4i64_v4i32(<4 x i64> %a0) nounwind { 4691; SSE-LABEL: trunc_or_const_v4i64_v4i32: 4692; SSE: # %bb.0: 4693; SSE-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,2],xmm1[0,2] 4694; SSE-NEXT: orps {{.*}}(%rip), %xmm0 4695; SSE-NEXT: retq 4696; 4697; AVX1-LABEL: trunc_or_const_v4i64_v4i32: 4698; AVX1: # %bb.0: 4699; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1 4700; AVX1-NEXT: vshufps {{.*#+}} xmm0 = xmm0[0,2],xmm1[0,2] 4701; AVX1-NEXT: vorps {{.*}}(%rip), %xmm0, %xmm0 4702; AVX1-NEXT: vzeroupper 4703; AVX1-NEXT: retq 4704; 4705; AVX2-SLOW-LABEL: trunc_or_const_v4i64_v4i32: 4706; AVX2-SLOW: # %bb.0: 4707; AVX2-SLOW-NEXT: vextractf128 $1, %ymm0, %xmm1 4708; AVX2-SLOW-NEXT: vshufps {{.*#+}} xmm0 = xmm0[0,2],xmm1[0,2] 4709; AVX2-SLOW-NEXT: vorps {{.*}}(%rip), %xmm0, %xmm0 4710; AVX2-SLOW-NEXT: vzeroupper 4711; AVX2-SLOW-NEXT: retq 4712; 4713; AVX2-FAST-LABEL: trunc_or_const_v4i64_v4i32: 4714; AVX2-FAST: # %bb.0: 4715; AVX2-FAST-NEXT: vmovaps {{.*#+}} ymm1 = [0,2,4,6,4,6,6,7] 4716; AVX2-FAST-NEXT: vpermps %ymm0, %ymm1, %ymm0 4717; AVX2-FAST-NEXT: vorps {{.*}}(%rip), %xmm0, %xmm0 4718; AVX2-FAST-NEXT: vzeroupper 4719; AVX2-FAST-NEXT: retq 4720; 4721; AVX512-LABEL: trunc_or_const_v4i64_v4i32: 4722; AVX512: # %bb.0: 4723; AVX512-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm0 4724; AVX512-NEXT: vpmovqd %zmm0, %ymm0 4725; AVX512-NEXT: vpor {{.*}}(%rip), %xmm0, %xmm0 4726; AVX512-NEXT: vzeroupper 4727; AVX512-NEXT: retq 4728 %1 = or <4 x i64> %a0, <i64 0, i64 1, i64 2, i64 3> 4729 %2 = trunc <4 x i64> %1 to <4 x i32> 4730 ret <4 x i32> %2 4731} 4732 4733define <8 x i16> @trunc_or_const_v8i64_v8i16(<8 x i64> %a0) nounwind { 4734; SSE-LABEL: trunc_or_const_v8i64_v8i16: 4735; SSE: # %bb.0: 4736; SSE-NEXT: pshufd {{.*#+}} xmm1 = xmm1[0,2,2,3] 4737; SSE-NEXT: pshuflw {{.*#+}} xmm1 = xmm1[0,2,2,3,4,5,6,7] 4738; SSE-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3] 4739; SSE-NEXT: pshuflw {{.*#+}} xmm4 = xmm0[0,2,2,3,4,5,6,7] 4740; SSE-NEXT: punpckldq {{.*#+}} xmm4 = xmm4[0],xmm1[0],xmm4[1],xmm1[1] 4741; SSE-NEXT: pshufd {{.*#+}} xmm0 = xmm3[0,2,2,3] 4742; SSE-NEXT: pshuflw {{.*#+}} xmm1 = xmm0[0,1,0,2,4,5,6,7] 4743; SSE-NEXT: pshufd {{.*#+}} xmm0 = xmm2[0,2,2,3] 4744; SSE-NEXT: pshuflw {{.*#+}} xmm0 = xmm0[0,1,0,2,4,5,6,7] 4745; SSE-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1] 4746; SSE-NEXT: movsd {{.*#+}} xmm0 = xmm4[0],xmm0[1] 4747; SSE-NEXT: orpd {{.*}}(%rip), %xmm0 4748; SSE-NEXT: retq 4749; 4750; AVX1-LABEL: trunc_or_const_v8i64_v8i16: 4751; AVX1: # %bb.0: 4752; AVX1-NEXT: vmovaps {{.*#+}} ymm2 = [65535,65535,65535,65535] 4753; AVX1-NEXT: vandps %ymm2, %ymm1, %ymm1 4754; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm3 4755; AVX1-NEXT: vpackusdw %xmm3, %xmm1, %xmm1 4756; AVX1-NEXT: vandps %ymm2, %ymm0, %ymm0 4757; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2 4758; AVX1-NEXT: vpackusdw %xmm2, %xmm0, %xmm0 4759; AVX1-NEXT: vpackusdw %xmm1, %xmm0, %xmm0 4760; AVX1-NEXT: vpor {{.*}}(%rip), %xmm0, %xmm0 4761; AVX1-NEXT: vzeroupper 4762; AVX1-NEXT: retq 4763; 4764; AVX2-SLOW-LABEL: trunc_or_const_v8i64_v8i16: 4765; AVX2-SLOW: # %bb.0: 4766; AVX2-SLOW-NEXT: vperm2f128 {{.*#+}} ymm2 = ymm0[2,3],ymm1[2,3] 4767; AVX2-SLOW-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0 4768; AVX2-SLOW-NEXT: vshufps {{.*#+}} ymm0 = ymm0[0,2],ymm2[0,2],ymm0[4,6],ymm2[4,6] 4769; AVX2-SLOW-NEXT: vpshufb {{.*#+}} ymm0 = ymm0[0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15,16,17,20,21,24,25,28,29,24,25,28,29,28,29,30,31] 4770; AVX2-SLOW-NEXT: vpermq {{.*#+}} ymm0 = ymm0[0,2,2,3] 4771; AVX2-SLOW-NEXT: vpor {{.*}}(%rip), %xmm0, %xmm0 4772; AVX2-SLOW-NEXT: vzeroupper 4773; AVX2-SLOW-NEXT: retq 4774; 4775; AVX2-FAST-LABEL: trunc_or_const_v8i64_v8i16: 4776; AVX2-FAST: # %bb.0: 4777; AVX2-FAST-NEXT: vmovdqa {{.*#+}} ymm2 = [0,2,4,6,4,6,6,7] 4778; AVX2-FAST-NEXT: vpermd %ymm0, %ymm2, %ymm0 4779; AVX2-FAST-NEXT: vpermd %ymm1, %ymm2, %ymm1 4780; AVX2-FAST-NEXT: vinserti128 $1, %xmm1, %ymm0, %ymm0 4781; AVX2-FAST-NEXT: vpshufb {{.*#+}} ymm0 = ymm0[0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15,16,17,20,21,24,25,28,29,24,25,28,29,28,29,30,31] 4782; AVX2-FAST-NEXT: vpermq {{.*#+}} ymm0 = ymm0[0,2,2,3] 4783; AVX2-FAST-NEXT: vpor {{.*}}(%rip), %xmm0, %xmm0 4784; AVX2-FAST-NEXT: vzeroupper 4785; AVX2-FAST-NEXT: retq 4786; 4787; AVX512-LABEL: trunc_or_const_v8i64_v8i16: 4788; AVX512: # %bb.0: 4789; AVX512-NEXT: vpmovqw %zmm0, %xmm0 4790; AVX512-NEXT: vpor {{.*}}(%rip), %xmm0, %xmm0 4791; AVX512-NEXT: vzeroupper 4792; AVX512-NEXT: retq 4793 %1 = or <8 x i64> %a0, <i64 0, i64 1, i64 2, i64 3, i64 4, i64 5, i64 6, i64 7> 4794 %2 = trunc <8 x i64> %1 to <8 x i16> 4795 ret <8 x i16> %2 4796} 4797 4798define <8 x i16> @trunc_or_const_v8i32_v8i16(<8 x i32> %a0) nounwind { 4799; SSE-LABEL: trunc_or_const_v8i32_v8i16: 4800; SSE: # %bb.0: 4801; SSE-NEXT: pslld $16, %xmm1 4802; SSE-NEXT: psrad $16, %xmm1 4803; SSE-NEXT: pslld $16, %xmm0 4804; SSE-NEXT: psrad $16, %xmm0 4805; SSE-NEXT: packssdw %xmm1, %xmm0 4806; SSE-NEXT: por {{.*}}(%rip), %xmm0 4807; SSE-NEXT: retq 4808; 4809; AVX1-LABEL: trunc_or_const_v8i32_v8i16: 4810; AVX1: # %bb.0: 4811; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1 4812; AVX1-NEXT: vmovdqa {{.*#+}} xmm2 = [0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15] 4813; AVX1-NEXT: vpshufb %xmm2, %xmm1, %xmm1 4814; AVX1-NEXT: vpshufb %xmm2, %xmm0, %xmm0 4815; AVX1-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0] 4816; AVX1-NEXT: vpor {{.*}}(%rip), %xmm0, %xmm0 4817; AVX1-NEXT: vzeroupper 4818; AVX1-NEXT: retq 4819; 4820; AVX2-LABEL: trunc_or_const_v8i32_v8i16: 4821; AVX2: # %bb.0: 4822; AVX2-NEXT: vpshufb {{.*#+}} ymm0 = ymm0[0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15,16,17,20,21,24,25,28,29,24,25,28,29,28,29,30,31] 4823; AVX2-NEXT: vpermq {{.*#+}} ymm0 = ymm0[0,2,2,3] 4824; AVX2-NEXT: vpor {{.*}}(%rip), %xmm0, %xmm0 4825; AVX2-NEXT: vzeroupper 4826; AVX2-NEXT: retq 4827; 4828; AVX512-LABEL: trunc_or_const_v8i32_v8i16: 4829; AVX512: # %bb.0: 4830; AVX512-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm0 4831; AVX512-NEXT: vpmovdw %zmm0, %ymm0 4832; AVX512-NEXT: vpor {{.*}}(%rip), %xmm0, %xmm0 4833; AVX512-NEXT: vzeroupper 4834; AVX512-NEXT: retq 4835 %1 = or <8 x i32> %a0, <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7> 4836 %2 = trunc <8 x i32> %1 to <8 x i16> 4837 ret <8 x i16> %2 4838} 4839 4840define <16 x i8> @trunc_or_const_v16i64_v16i8(<16 x i64> %a0) nounwind { 4841; SSE-LABEL: trunc_or_const_v16i64_v16i8: 4842; SSE: # %bb.0: 4843; SSE-NEXT: movdqa {{.*#+}} xmm8 = [255,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0] 4844; SSE-NEXT: pand %xmm8, %xmm7 4845; SSE-NEXT: pand %xmm8, %xmm6 4846; SSE-NEXT: packuswb %xmm7, %xmm6 4847; SSE-NEXT: pand %xmm8, %xmm5 4848; SSE-NEXT: pand %xmm8, %xmm4 4849; SSE-NEXT: packuswb %xmm5, %xmm4 4850; SSE-NEXT: packuswb %xmm6, %xmm4 4851; SSE-NEXT: pand %xmm8, %xmm3 4852; SSE-NEXT: pand %xmm8, %xmm2 4853; SSE-NEXT: packuswb %xmm3, %xmm2 4854; SSE-NEXT: pand %xmm8, %xmm1 4855; SSE-NEXT: pand %xmm8, %xmm0 4856; SSE-NEXT: packuswb %xmm1, %xmm0 4857; SSE-NEXT: packuswb %xmm2, %xmm0 4858; SSE-NEXT: packuswb %xmm4, %xmm0 4859; SSE-NEXT: por {{.*}}(%rip), %xmm0 4860; SSE-NEXT: retq 4861; 4862; AVX1-LABEL: trunc_or_const_v16i64_v16i8: 4863; AVX1: # %bb.0: 4864; AVX1-NEXT: vmovaps {{.*#+}} ymm4 = [255,255,255,255] 4865; AVX1-NEXT: vandps %ymm4, %ymm3, %ymm3 4866; AVX1-NEXT: vextractf128 $1, %ymm3, %xmm5 4867; AVX1-NEXT: vpackusdw %xmm5, %xmm3, %xmm3 4868; AVX1-NEXT: vandps %ymm4, %ymm2, %ymm2 4869; AVX1-NEXT: vextractf128 $1, %ymm2, %xmm5 4870; AVX1-NEXT: vpackusdw %xmm5, %xmm2, %xmm2 4871; AVX1-NEXT: vpackusdw %xmm3, %xmm2, %xmm2 4872; AVX1-NEXT: vandps %ymm4, %ymm1, %ymm1 4873; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm3 4874; AVX1-NEXT: vpackusdw %xmm3, %xmm1, %xmm1 4875; AVX1-NEXT: vandps %ymm4, %ymm0, %ymm0 4876; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm3 4877; AVX1-NEXT: vpackusdw %xmm3, %xmm0, %xmm0 4878; AVX1-NEXT: vpackusdw %xmm1, %xmm0, %xmm0 4879; AVX1-NEXT: vpackuswb %xmm2, %xmm0, %xmm0 4880; AVX1-NEXT: vpor {{.*}}(%rip), %xmm0, %xmm0 4881; AVX1-NEXT: vzeroupper 4882; AVX1-NEXT: retq 4883; 4884; AVX2-SLOW-LABEL: trunc_or_const_v16i64_v16i8: 4885; AVX2-SLOW: # %bb.0: 4886; AVX2-SLOW-NEXT: vperm2f128 {{.*#+}} ymm4 = ymm2[2,3],ymm3[2,3] 4887; AVX2-SLOW-NEXT: vinsertf128 $1, %xmm3, %ymm2, %ymm2 4888; AVX2-SLOW-NEXT: vshufps {{.*#+}} ymm2 = ymm2[0,2],ymm4[0,2],ymm2[4,6],ymm4[4,6] 4889; AVX2-SLOW-NEXT: vmovdqa {{.*#+}} ymm3 = [0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15,16,17,20,21,24,25,28,29,24,25,28,29,28,29,30,31] 4890; AVX2-SLOW-NEXT: vpshufb %ymm3, %ymm2, %ymm2 4891; AVX2-SLOW-NEXT: vpermq {{.*#+}} ymm2 = ymm2[0,2,2,3] 4892; AVX2-SLOW-NEXT: vmovdqa {{.*#+}} xmm4 = [255,255,255,255,255,255,255,255] 4893; AVX2-SLOW-NEXT: vpand %xmm4, %xmm2, %xmm2 4894; AVX2-SLOW-NEXT: vperm2f128 {{.*#+}} ymm5 = ymm0[2,3],ymm1[2,3] 4895; AVX2-SLOW-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0 4896; AVX2-SLOW-NEXT: vshufps {{.*#+}} ymm0 = ymm0[0,2],ymm5[0,2],ymm0[4,6],ymm5[4,6] 4897; AVX2-SLOW-NEXT: vpshufb %ymm3, %ymm0, %ymm0 4898; AVX2-SLOW-NEXT: vpermq {{.*#+}} ymm0 = ymm0[0,2,2,3] 4899; AVX2-SLOW-NEXT: vpand %xmm4, %xmm0, %xmm0 4900; AVX2-SLOW-NEXT: vpackuswb %xmm2, %xmm0, %xmm0 4901; AVX2-SLOW-NEXT: vpor {{.*}}(%rip), %xmm0, %xmm0 4902; AVX2-SLOW-NEXT: vzeroupper 4903; AVX2-SLOW-NEXT: retq 4904; 4905; AVX2-FAST-LABEL: trunc_or_const_v16i64_v16i8: 4906; AVX2-FAST: # %bb.0: 4907; AVX2-FAST-NEXT: vmovdqa {{.*#+}} ymm4 = [0,2,4,6,4,6,6,7] 4908; AVX2-FAST-NEXT: vpermd %ymm2, %ymm4, %ymm2 4909; AVX2-FAST-NEXT: vpermd %ymm3, %ymm4, %ymm3 4910; AVX2-FAST-NEXT: vinserti128 $1, %xmm3, %ymm2, %ymm2 4911; AVX2-FAST-NEXT: vmovdqa {{.*#+}} ymm3 = [0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15,16,17,20,21,24,25,28,29,24,25,28,29,28,29,30,31] 4912; AVX2-FAST-NEXT: vpshufb %ymm3, %ymm2, %ymm2 4913; AVX2-FAST-NEXT: vpermq {{.*#+}} ymm2 = ymm2[0,2,2,3] 4914; AVX2-FAST-NEXT: vmovdqa {{.*#+}} xmm5 = [255,255,255,255,255,255,255,255] 4915; AVX2-FAST-NEXT: vpand %xmm5, %xmm2, %xmm2 4916; AVX2-FAST-NEXT: vpermd %ymm0, %ymm4, %ymm0 4917; AVX2-FAST-NEXT: vpermd %ymm1, %ymm4, %ymm1 4918; AVX2-FAST-NEXT: vinserti128 $1, %xmm1, %ymm0, %ymm0 4919; AVX2-FAST-NEXT: vpshufb %ymm3, %ymm0, %ymm0 4920; AVX2-FAST-NEXT: vpermq {{.*#+}} ymm0 = ymm0[0,2,2,3] 4921; AVX2-FAST-NEXT: vpand %xmm5, %xmm0, %xmm0 4922; AVX2-FAST-NEXT: vpackuswb %xmm2, %xmm0, %xmm0 4923; AVX2-FAST-NEXT: vpor {{.*}}(%rip), %xmm0, %xmm0 4924; AVX2-FAST-NEXT: vzeroupper 4925; AVX2-FAST-NEXT: retq 4926; 4927; AVX512-LABEL: trunc_or_const_v16i64_v16i8: 4928; AVX512: # %bb.0: 4929; AVX512-NEXT: vpmovqd %zmm0, %ymm0 4930; AVX512-NEXT: vpmovqd %zmm1, %ymm1 4931; AVX512-NEXT: vinserti64x4 $1, %ymm1, %zmm0, %zmm0 4932; AVX512-NEXT: vpmovdb %zmm0, %xmm0 4933; AVX512-NEXT: vpor {{.*}}(%rip), %xmm0, %xmm0 4934; AVX512-NEXT: vzeroupper 4935; AVX512-NEXT: retq 4936 %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> 4937 %2 = trunc <16 x i64> %1 to <16 x i8> 4938 ret <16 x i8> %2 4939} 4940 4941define <16 x i8> @trunc_or_const_v16i32_v16i8(<16 x i32> %a0) nounwind { 4942; SSE-LABEL: trunc_or_const_v16i32_v16i8: 4943; SSE: # %bb.0: 4944; SSE-NEXT: movdqa {{.*#+}} xmm4 = [255,0,0,0,255,0,0,0,255,0,0,0,255,0,0,0] 4945; SSE-NEXT: pand %xmm4, %xmm3 4946; SSE-NEXT: pand %xmm4, %xmm2 4947; SSE-NEXT: packuswb %xmm3, %xmm2 4948; SSE-NEXT: pand %xmm4, %xmm1 4949; SSE-NEXT: pand %xmm4, %xmm0 4950; SSE-NEXT: packuswb %xmm1, %xmm0 4951; SSE-NEXT: packuswb %xmm2, %xmm0 4952; SSE-NEXT: por {{.*}}(%rip), %xmm0 4953; SSE-NEXT: retq 4954; 4955; AVX1-LABEL: trunc_or_const_v16i32_v16i8: 4956; AVX1: # %bb.0: 4957; AVX1-NEXT: vmovaps {{.*#+}} ymm2 = [255,255,255,255,255,255,255,255] 4958; AVX1-NEXT: vandps %ymm2, %ymm1, %ymm1 4959; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm3 4960; AVX1-NEXT: vpackusdw %xmm3, %xmm1, %xmm1 4961; AVX1-NEXT: vandps %ymm2, %ymm0, %ymm0 4962; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2 4963; AVX1-NEXT: vpackusdw %xmm2, %xmm0, %xmm0 4964; AVX1-NEXT: vpackuswb %xmm1, %xmm0, %xmm0 4965; AVX1-NEXT: vpor {{.*}}(%rip), %xmm0, %xmm0 4966; AVX1-NEXT: vzeroupper 4967; AVX1-NEXT: retq 4968; 4969; AVX2-LABEL: trunc_or_const_v16i32_v16i8: 4970; AVX2: # %bb.0: 4971; AVX2-NEXT: vmovdqa {{.*#+}} ymm2 = [0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15,16,17,20,21,24,25,28,29,24,25,28,29,28,29,30,31] 4972; AVX2-NEXT: vpshufb %ymm2, %ymm1, %ymm1 4973; AVX2-NEXT: vpermq {{.*#+}} ymm1 = ymm1[0,2,2,3] 4974; AVX2-NEXT: vmovdqa {{.*#+}} xmm3 = [255,255,255,255,255,255,255,255] 4975; AVX2-NEXT: vpand %xmm3, %xmm1, %xmm1 4976; AVX2-NEXT: vpshufb %ymm2, %ymm0, %ymm0 4977; AVX2-NEXT: vpermq {{.*#+}} ymm0 = ymm0[0,2,2,3] 4978; AVX2-NEXT: vpand %xmm3, %xmm0, %xmm0 4979; AVX2-NEXT: vpackuswb %xmm1, %xmm0, %xmm0 4980; AVX2-NEXT: vpor {{.*}}(%rip), %xmm0, %xmm0 4981; AVX2-NEXT: vzeroupper 4982; AVX2-NEXT: retq 4983; 4984; AVX512-LABEL: trunc_or_const_v16i32_v16i8: 4985; AVX512: # %bb.0: 4986; AVX512-NEXT: vpmovdb %zmm0, %xmm0 4987; AVX512-NEXT: vpor {{.*}}(%rip), %xmm0, %xmm0 4988; AVX512-NEXT: vzeroupper 4989; AVX512-NEXT: retq 4990 %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> 4991 %2 = trunc <16 x i32> %1 to <16 x i8> 4992 ret <16 x i8> %2 4993} 4994 4995define <16 x i8> @trunc_or_const_v16i16_v16i8(<16 x i16> %a0) nounwind { 4996; SSE-LABEL: trunc_or_const_v16i16_v16i8: 4997; SSE: # %bb.0: 4998; SSE-NEXT: movdqa {{.*#+}} xmm2 = [255,255,255,255,255,255,255,255] 4999; SSE-NEXT: pand %xmm2, %xmm1 5000; SSE-NEXT: pand %xmm2, %xmm0 5001; SSE-NEXT: packuswb %xmm1, %xmm0 5002; SSE-NEXT: por {{.*}}(%rip), %xmm0 5003; SSE-NEXT: retq 5004; 5005; AVX1-LABEL: trunc_or_const_v16i16_v16i8: 5006; AVX1: # %bb.0: 5007; AVX1-NEXT: vandps {{.*}}(%rip), %ymm0, %ymm0 5008; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1 5009; AVX1-NEXT: vpackuswb %xmm1, %xmm0, %xmm0 5010; AVX1-NEXT: vpor {{.*}}(%rip), %xmm0, %xmm0 5011; AVX1-NEXT: vzeroupper 5012; AVX1-NEXT: retq 5013; 5014; AVX2-LABEL: trunc_or_const_v16i16_v16i8: 5015; AVX2: # %bb.0: 5016; AVX2-NEXT: vpand {{.*}}(%rip), %ymm0, %ymm0 5017; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1 5018; AVX2-NEXT: vpackuswb %xmm1, %xmm0, %xmm0 5019; AVX2-NEXT: vpor {{.*}}(%rip), %xmm0, %xmm0 5020; AVX2-NEXT: vzeroupper 5021; AVX2-NEXT: retq 5022; 5023; AVX512F-LABEL: trunc_or_const_v16i16_v16i8: 5024; AVX512F: # %bb.0: 5025; 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],zero 5026; AVX512F-NEXT: vpmovdb %zmm0, %xmm0 5027; AVX512F-NEXT: vpor {{.*}}(%rip), %xmm0, %xmm0 5028; AVX512F-NEXT: vzeroupper 5029; AVX512F-NEXT: retq 5030; 5031; AVX512BW-LABEL: trunc_or_const_v16i16_v16i8: 5032; AVX512BW: # %bb.0: 5033; AVX512BW-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm0 5034; AVX512BW-NEXT: vpmovwb %zmm0, %ymm0 5035; AVX512BW-NEXT: vpor {{.*}}(%rip), %xmm0, %xmm0 5036; AVX512BW-NEXT: vzeroupper 5037; AVX512BW-NEXT: retq 5038; 5039; AVX512DQ-LABEL: trunc_or_const_v16i16_v16i8: 5040; AVX512DQ: # %bb.0: 5041; 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],zero 5042; AVX512DQ-NEXT: vpmovdb %zmm0, %xmm0 5043; AVX512DQ-NEXT: vpor {{.*}}(%rip), %xmm0, %xmm0 5044; AVX512DQ-NEXT: vzeroupper 5045; AVX512DQ-NEXT: retq 5046 %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> 5047 %2 = trunc <16 x i16> %1 to <16 x i8> 5048 ret <16 x i8> %2 5049} 5050 5051; 5052; complex patterns - often created by vectorizer 5053; 5054 5055define <4 x i32> @mul_add_const_v4i64_v4i32(<4 x i32> %a0, <4 x i32> %a1) nounwind { 5056; SSE-LABEL: mul_add_const_v4i64_v4i32: 5057; SSE: # %bb.0: 5058; SSE-NEXT: pshufd {{.*#+}} xmm2 = xmm0[0,1,1,3] 5059; SSE-NEXT: pshufd {{.*#+}} xmm3 = xmm0[2,1,3,3] 5060; SSE-NEXT: pshufd {{.*#+}} xmm0 = xmm1[0,1,1,3] 5061; SSE-NEXT: pmuludq %xmm2, %xmm0 5062; SSE-NEXT: pshufd {{.*#+}} xmm1 = xmm1[2,1,3,3] 5063; SSE-NEXT: pmuludq %xmm3, %xmm1 5064; SSE-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,2],xmm1[0,2] 5065; SSE-NEXT: paddd {{.*}}(%rip), %xmm0 5066; SSE-NEXT: retq 5067; 5068; AVX-LABEL: mul_add_const_v4i64_v4i32: 5069; AVX: # %bb.0: 5070; AVX-NEXT: vpmulld %xmm1, %xmm0, %xmm0 5071; AVX-NEXT: vpaddd {{.*}}(%rip), %xmm0, %xmm0 5072; AVX-NEXT: retq 5073 %1 = sext <4 x i32> %a0 to <4 x i64> 5074 %2 = sext <4 x i32> %a1 to <4 x i64> 5075 %3 = mul <4 x i64> %1, %2 5076 %4 = add <4 x i64> %3, <i64 -3, i64 -1, i64 1, i64 3> 5077 %5 = trunc <4 x i64> %4 to <4 x i32> 5078 ret <4 x i32> %5 5079} 5080 5081define <4 x i32> @mul_add_self_v4i64_v4i32(<4 x i32> %a0, <4 x i32> %a1) nounwind { 5082; SSE-LABEL: mul_add_self_v4i64_v4i32: 5083; SSE: # %bb.0: 5084; SSE-NEXT: pshufd {{.*#+}} xmm2 = xmm0[0,1,1,3] 5085; SSE-NEXT: pshufd {{.*#+}} xmm3 = xmm0[2,1,3,3] 5086; SSE-NEXT: pshufd {{.*#+}} xmm0 = xmm1[0,1,1,3] 5087; SSE-NEXT: pmuludq %xmm2, %xmm0 5088; SSE-NEXT: pshufd {{.*#+}} xmm1 = xmm1[2,1,3,3] 5089; SSE-NEXT: pmuludq %xmm3, %xmm1 5090; SSE-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,2],xmm1[0,2] 5091; SSE-NEXT: paddd %xmm0, %xmm0 5092; SSE-NEXT: retq 5093; 5094; AVX-LABEL: mul_add_self_v4i64_v4i32: 5095; AVX: # %bb.0: 5096; AVX-NEXT: vpmulld %xmm1, %xmm0, %xmm0 5097; AVX-NEXT: vpaddd %xmm0, %xmm0, %xmm0 5098; AVX-NEXT: retq 5099 %1 = sext <4 x i32> %a0 to <4 x i64> 5100 %2 = sext <4 x i32> %a1 to <4 x i64> 5101 %3 = mul <4 x i64> %1, %2 5102 %4 = add <4 x i64> %3, %3 5103 %5 = trunc <4 x i64> %4 to <4 x i32> 5104 ret <4 x i32> %5 5105} 5106 5107define <4 x i32> @mul_add_multiuse_v4i64_v4i32(<4 x i32> %a0, <4 x i32> %a1) nounwind { 5108; SSE-LABEL: mul_add_multiuse_v4i64_v4i32: 5109; SSE: # %bb.0: 5110; SSE-NEXT: pshufd {{.*#+}} xmm2 = xmm0[0,1,1,3] 5111; SSE-NEXT: pshufd {{.*#+}} xmm3 = xmm0[2,1,3,3] 5112; SSE-NEXT: pshufd {{.*#+}} xmm4 = xmm1[0,1,1,3] 5113; SSE-NEXT: pmuludq %xmm2, %xmm4 5114; SSE-NEXT: pshufd {{.*#+}} xmm1 = xmm1[2,1,3,3] 5115; SSE-NEXT: pmuludq %xmm3, %xmm1 5116; SSE-NEXT: shufps {{.*#+}} xmm4 = xmm4[0,2],xmm1[0,2] 5117; SSE-NEXT: paddd %xmm4, %xmm0 5118; SSE-NEXT: retq 5119; 5120; AVX-LABEL: mul_add_multiuse_v4i64_v4i32: 5121; AVX: # %bb.0: 5122; AVX-NEXT: vpmulld %xmm1, %xmm0, %xmm1 5123; AVX-NEXT: vpaddd %xmm1, %xmm0, %xmm0 5124; AVX-NEXT: retq 5125 %1 = sext <4 x i32> %a0 to <4 x i64> 5126 %2 = sext <4 x i32> %a1 to <4 x i64> 5127 %3 = mul <4 x i64> %1, %2 5128 %4 = add <4 x i64> %1, %3 5129 %5 = trunc <4 x i64> %4 to <4 x i32> 5130 ret <4 x i32> %5 5131} 5132