1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx | FileCheck %s --check-prefix=ALL --check-prefix=AVX --check-prefix=AVX1 3; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx2 | FileCheck %s --check-prefix=ALL --check-prefix=AVX --check-prefix=AVX2 4; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+xop,+avx | FileCheck %s --check-prefix=ALL --check-prefix=XOP --check-prefix=XOPAVX1 5; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+xop,+avx2 | FileCheck %s --check-prefix=ALL --check-prefix=XOP --check-prefix=XOPAVX2 6; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mcpu=knl -mattr=+avx512dq | FileCheck %s --check-prefix=ALL --check-prefix=AVX512 --check-prefix=AVX512DQ 7; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mcpu=knl -mattr=+avx512bw | FileCheck %s --check-prefix=ALL --check-prefix=AVX512 --check-prefix=AVX512BW 8; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mcpu=knl -mattr=+avx512dq,+avx512vl | FileCheck %s --check-prefix=ALL --check-prefix=AVX512VL --check-prefix=AVX512DQVL 9; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mcpu=knl -mattr=+avx512bw,+avx512vl | FileCheck %s --check-prefix=ALL --check-prefix=AVX512VL --check-prefix=AVX512BWVL 10 11; 12; Variable Shifts 13; 14 15define <4 x i64> @var_shift_v4i64(<4 x i64> %a, <4 x i64> %b) nounwind { 16; AVX1-LABEL: var_shift_v4i64: 17; AVX1: # BB#0: 18; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2 19; AVX1-NEXT: vmovdqa {{.*#+}} xmm3 = [9223372036854775808,9223372036854775808] 20; AVX1-NEXT: vpsrlq %xmm2, %xmm3, %xmm4 21; AVX1-NEXT: vpshufd {{.*#+}} xmm5 = xmm2[2,3,0,1] 22; AVX1-NEXT: vpsrlq %xmm5, %xmm3, %xmm6 23; AVX1-NEXT: vpblendw {{.*#+}} xmm4 = xmm4[0,1,2,3],xmm6[4,5,6,7] 24; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm6 25; AVX1-NEXT: vpsrlq %xmm2, %xmm6, %xmm2 26; AVX1-NEXT: vpsrlq %xmm5, %xmm6, %xmm5 27; AVX1-NEXT: vpblendw {{.*#+}} xmm2 = xmm2[0,1,2,3],xmm5[4,5,6,7] 28; AVX1-NEXT: vpxor %xmm4, %xmm2, %xmm2 29; AVX1-NEXT: vpsubq %xmm4, %xmm2, %xmm2 30; AVX1-NEXT: vpsrlq %xmm1, %xmm3, %xmm4 31; AVX1-NEXT: vpshufd {{.*#+}} xmm5 = xmm1[2,3,0,1] 32; AVX1-NEXT: vpsrlq %xmm5, %xmm3, %xmm3 33; AVX1-NEXT: vpblendw {{.*#+}} xmm3 = xmm4[0,1,2,3],xmm3[4,5,6,7] 34; AVX1-NEXT: vpsrlq %xmm1, %xmm0, %xmm1 35; AVX1-NEXT: vpsrlq %xmm5, %xmm0, %xmm0 36; AVX1-NEXT: vpblendw {{.*#+}} xmm0 = xmm1[0,1,2,3],xmm0[4,5,6,7] 37; AVX1-NEXT: vpxor %xmm3, %xmm0, %xmm0 38; AVX1-NEXT: vpsubq %xmm3, %xmm0, %xmm0 39; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0 40; AVX1-NEXT: retq 41; 42; AVX2-LABEL: var_shift_v4i64: 43; AVX2: # BB#0: 44; AVX2-NEXT: vpbroadcastq {{.*}}(%rip), %ymm2 45; AVX2-NEXT: vpsrlvq %ymm1, %ymm2, %ymm3 46; AVX2-NEXT: vpxor %ymm2, %ymm0, %ymm0 47; AVX2-NEXT: vpsrlvq %ymm1, %ymm0, %ymm0 48; AVX2-NEXT: vpsubq %ymm3, %ymm0, %ymm0 49; AVX2-NEXT: retq 50; 51; XOPAVX1-LABEL: var_shift_v4i64: 52; XOPAVX1: # BB#0: 53; XOPAVX1-NEXT: vextractf128 $1, %ymm1, %xmm2 54; XOPAVX1-NEXT: vpxor %xmm3, %xmm3, %xmm3 55; XOPAVX1-NEXT: vpsubq %xmm2, %xmm3, %xmm2 56; XOPAVX1-NEXT: vextractf128 $1, %ymm0, %xmm4 57; XOPAVX1-NEXT: vpshaq %xmm2, %xmm4, %xmm2 58; XOPAVX1-NEXT: vpsubq %xmm1, %xmm3, %xmm1 59; XOPAVX1-NEXT: vpshaq %xmm1, %xmm0, %xmm0 60; XOPAVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0 61; XOPAVX1-NEXT: retq 62; 63; XOPAVX2-LABEL: var_shift_v4i64: 64; XOPAVX2: # BB#0: 65; XOPAVX2-NEXT: vpbroadcastq {{.*}}(%rip), %ymm2 66; XOPAVX2-NEXT: vpsrlvq %ymm1, %ymm2, %ymm3 67; XOPAVX2-NEXT: vpxor %ymm2, %ymm0, %ymm0 68; XOPAVX2-NEXT: vpsrlvq %ymm1, %ymm0, %ymm0 69; XOPAVX2-NEXT: vpsubq %ymm3, %ymm0, %ymm0 70; XOPAVX2-NEXT: retq 71; 72; AVX512-LABEL: var_shift_v4i64: 73; AVX512: # BB#0: 74; AVX512-NEXT: vpbroadcastq {{.*}}(%rip), %ymm2 75; AVX512-NEXT: vpsrlvq %ymm1, %ymm2, %ymm3 76; AVX512-NEXT: vpxor %ymm2, %ymm0, %ymm0 77; AVX512-NEXT: vpsrlvq %ymm1, %ymm0, %ymm0 78; AVX512-NEXT: vpsubq %ymm3, %ymm0, %ymm0 79; AVX512-NEXT: retq 80; 81; AVX512VL-LABEL: var_shift_v4i64: 82; AVX512VL: # BB#0: 83; AVX512VL-NEXT: vpsravq %ymm1, %ymm0, %ymm0 84; AVX512VL-NEXT: retq 85 %shift = ashr <4 x i64> %a, %b 86 ret <4 x i64> %shift 87} 88 89define <8 x i32> @var_shift_v8i32(<8 x i32> %a, <8 x i32> %b) nounwind { 90; AVX1-LABEL: var_shift_v8i32: 91; AVX1: # BB#0: 92; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2 93; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm3 94; AVX1-NEXT: vpsrldq {{.*#+}} xmm4 = xmm3[12,13,14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero 95; AVX1-NEXT: vpsrad %xmm4, %xmm2, %xmm4 96; AVX1-NEXT: vpsrlq $32, %xmm3, %xmm5 97; AVX1-NEXT: vpsrad %xmm5, %xmm2, %xmm5 98; AVX1-NEXT: vpblendw {{.*#+}} xmm4 = xmm5[0,1,2,3],xmm4[4,5,6,7] 99; AVX1-NEXT: vpxor %xmm5, %xmm5, %xmm5 100; AVX1-NEXT: vpunpckhdq {{.*#+}} xmm6 = xmm3[2],xmm5[2],xmm3[3],xmm5[3] 101; AVX1-NEXT: vpsrad %xmm6, %xmm2, %xmm6 102; AVX1-NEXT: vpmovzxdq {{.*#+}} xmm3 = xmm3[0],zero,xmm3[1],zero 103; AVX1-NEXT: vpsrad %xmm3, %xmm2, %xmm2 104; AVX1-NEXT: vpblendw {{.*#+}} xmm2 = xmm2[0,1,2,3],xmm6[4,5,6,7] 105; AVX1-NEXT: vpblendw {{.*#+}} xmm2 = xmm2[0,1],xmm4[2,3],xmm2[4,5],xmm4[6,7] 106; AVX1-NEXT: vpsrldq {{.*#+}} xmm3 = xmm1[12,13,14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero 107; AVX1-NEXT: vpsrad %xmm3, %xmm0, %xmm3 108; AVX1-NEXT: vpsrlq $32, %xmm1, %xmm4 109; AVX1-NEXT: vpsrad %xmm4, %xmm0, %xmm4 110; AVX1-NEXT: vpblendw {{.*#+}} xmm3 = xmm4[0,1,2,3],xmm3[4,5,6,7] 111; AVX1-NEXT: vpunpckhdq {{.*#+}} xmm4 = xmm1[2],xmm5[2],xmm1[3],xmm5[3] 112; AVX1-NEXT: vpsrad %xmm4, %xmm0, %xmm4 113; AVX1-NEXT: vpmovzxdq {{.*#+}} xmm1 = xmm1[0],zero,xmm1[1],zero 114; AVX1-NEXT: vpsrad %xmm1, %xmm0, %xmm0 115; AVX1-NEXT: vpblendw {{.*#+}} xmm0 = xmm0[0,1,2,3],xmm4[4,5,6,7] 116; AVX1-NEXT: vpblendw {{.*#+}} xmm0 = xmm0[0,1],xmm3[2,3],xmm0[4,5],xmm3[6,7] 117; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0 118; AVX1-NEXT: retq 119; 120; AVX2-LABEL: var_shift_v8i32: 121; AVX2: # BB#0: 122; AVX2-NEXT: vpsravd %ymm1, %ymm0, %ymm0 123; AVX2-NEXT: retq 124; 125; XOPAVX1-LABEL: var_shift_v8i32: 126; XOPAVX1: # BB#0: 127; XOPAVX1-NEXT: vextractf128 $1, %ymm1, %xmm2 128; XOPAVX1-NEXT: vpxor %xmm3, %xmm3, %xmm3 129; XOPAVX1-NEXT: vpsubd %xmm2, %xmm3, %xmm2 130; XOPAVX1-NEXT: vextractf128 $1, %ymm0, %xmm4 131; XOPAVX1-NEXT: vpshad %xmm2, %xmm4, %xmm2 132; XOPAVX1-NEXT: vpsubd %xmm1, %xmm3, %xmm1 133; XOPAVX1-NEXT: vpshad %xmm1, %xmm0, %xmm0 134; XOPAVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0 135; XOPAVX1-NEXT: retq 136; 137; XOPAVX2-LABEL: var_shift_v8i32: 138; XOPAVX2: # BB#0: 139; XOPAVX2-NEXT: vpsravd %ymm1, %ymm0, %ymm0 140; XOPAVX2-NEXT: retq 141; 142; AVX512-LABEL: var_shift_v8i32: 143; AVX512: # BB#0: 144; AVX512-NEXT: vpsravd %ymm1, %ymm0, %ymm0 145; AVX512-NEXT: retq 146; 147; AVX512VL-LABEL: var_shift_v8i32: 148; AVX512VL: # BB#0: 149; AVX512VL-NEXT: vpsravd %ymm1, %ymm0, %ymm0 150; AVX512VL-NEXT: retq 151 %shift = ashr <8 x i32> %a, %b 152 ret <8 x i32> %shift 153} 154 155define <16 x i16> @var_shift_v16i16(<16 x i16> %a, <16 x i16> %b) nounwind { 156; AVX1-LABEL: var_shift_v16i16: 157; AVX1: # BB#0: 158; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2 159; AVX1-NEXT: vpsllw $12, %xmm2, %xmm3 160; AVX1-NEXT: vpsllw $4, %xmm2, %xmm2 161; AVX1-NEXT: vpor %xmm3, %xmm2, %xmm2 162; AVX1-NEXT: vpaddw %xmm2, %xmm2, %xmm3 163; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm4 164; AVX1-NEXT: vpsraw $8, %xmm4, %xmm5 165; AVX1-NEXT: vpblendvb %xmm2, %xmm5, %xmm4, %xmm2 166; AVX1-NEXT: vpsraw $4, %xmm2, %xmm4 167; AVX1-NEXT: vpblendvb %xmm3, %xmm4, %xmm2, %xmm2 168; AVX1-NEXT: vpsraw $2, %xmm2, %xmm4 169; AVX1-NEXT: vpaddw %xmm3, %xmm3, %xmm3 170; AVX1-NEXT: vpblendvb %xmm3, %xmm4, %xmm2, %xmm2 171; AVX1-NEXT: vpsraw $1, %xmm2, %xmm4 172; AVX1-NEXT: vpaddw %xmm3, %xmm3, %xmm3 173; AVX1-NEXT: vpblendvb %xmm3, %xmm4, %xmm2, %xmm2 174; AVX1-NEXT: vpsllw $12, %xmm1, %xmm3 175; AVX1-NEXT: vpsllw $4, %xmm1, %xmm1 176; AVX1-NEXT: vpor %xmm3, %xmm1, %xmm1 177; AVX1-NEXT: vpaddw %xmm1, %xmm1, %xmm3 178; AVX1-NEXT: vpsraw $8, %xmm0, %xmm4 179; AVX1-NEXT: vpblendvb %xmm1, %xmm4, %xmm0, %xmm0 180; AVX1-NEXT: vpsraw $4, %xmm0, %xmm1 181; AVX1-NEXT: vpblendvb %xmm3, %xmm1, %xmm0, %xmm0 182; AVX1-NEXT: vpsraw $2, %xmm0, %xmm1 183; AVX1-NEXT: vpaddw %xmm3, %xmm3, %xmm3 184; AVX1-NEXT: vpblendvb %xmm3, %xmm1, %xmm0, %xmm0 185; AVX1-NEXT: vpsraw $1, %xmm0, %xmm1 186; AVX1-NEXT: vpaddw %xmm3, %xmm3, %xmm3 187; AVX1-NEXT: vpblendvb %xmm3, %xmm1, %xmm0, %xmm0 188; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0 189; AVX1-NEXT: retq 190; 191; AVX2-LABEL: var_shift_v16i16: 192; AVX2: # BB#0: 193; AVX2-NEXT: vpxor %ymm2, %ymm2, %ymm2 194; AVX2-NEXT: vpunpckhwd {{.*#+}} ymm3 = ymm1[4],ymm2[4],ymm1[5],ymm2[5],ymm1[6],ymm2[6],ymm1[7],ymm2[7],ymm1[12],ymm2[12],ymm1[13],ymm2[13],ymm1[14],ymm2[14],ymm1[15],ymm2[15] 195; AVX2-NEXT: vpunpckhwd {{.*#+}} ymm4 = ymm2[4],ymm0[4],ymm2[5],ymm0[5],ymm2[6],ymm0[6],ymm2[7],ymm0[7],ymm2[12],ymm0[12],ymm2[13],ymm0[13],ymm2[14],ymm0[14],ymm2[15],ymm0[15] 196; AVX2-NEXT: vpsravd %ymm3, %ymm4, %ymm3 197; AVX2-NEXT: vpsrld $16, %ymm3, %ymm3 198; AVX2-NEXT: vpunpcklwd {{.*#+}} ymm1 = ymm1[0],ymm2[0],ymm1[1],ymm2[1],ymm1[2],ymm2[2],ymm1[3],ymm2[3],ymm1[8],ymm2[8],ymm1[9],ymm2[9],ymm1[10],ymm2[10],ymm1[11],ymm2[11] 199; AVX2-NEXT: vpunpcklwd {{.*#+}} ymm0 = ymm2[0],ymm0[0],ymm2[1],ymm0[1],ymm2[2],ymm0[2],ymm2[3],ymm0[3],ymm2[8],ymm0[8],ymm2[9],ymm0[9],ymm2[10],ymm0[10],ymm2[11],ymm0[11] 200; AVX2-NEXT: vpsravd %ymm1, %ymm0, %ymm0 201; AVX2-NEXT: vpsrld $16, %ymm0, %ymm0 202; AVX2-NEXT: vpackusdw %ymm3, %ymm0, %ymm0 203; AVX2-NEXT: retq 204; 205; XOPAVX1-LABEL: var_shift_v16i16: 206; XOPAVX1: # BB#0: 207; XOPAVX1-NEXT: vextractf128 $1, %ymm1, %xmm2 208; XOPAVX1-NEXT: vpxor %xmm3, %xmm3, %xmm3 209; XOPAVX1-NEXT: vpsubw %xmm2, %xmm3, %xmm2 210; XOPAVX1-NEXT: vextractf128 $1, %ymm0, %xmm4 211; XOPAVX1-NEXT: vpshaw %xmm2, %xmm4, %xmm2 212; XOPAVX1-NEXT: vpsubw %xmm1, %xmm3, %xmm1 213; XOPAVX1-NEXT: vpshaw %xmm1, %xmm0, %xmm0 214; XOPAVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0 215; XOPAVX1-NEXT: retq 216; 217; XOPAVX2-LABEL: var_shift_v16i16: 218; XOPAVX2: # BB#0: 219; XOPAVX2-NEXT: vextracti128 $1, %ymm1, %xmm2 220; XOPAVX2-NEXT: vpxor %xmm3, %xmm3, %xmm3 221; XOPAVX2-NEXT: vpsubw %xmm2, %xmm3, %xmm2 222; XOPAVX2-NEXT: vextracti128 $1, %ymm0, %xmm4 223; XOPAVX2-NEXT: vpshaw %xmm2, %xmm4, %xmm2 224; XOPAVX2-NEXT: vpsubw %xmm1, %xmm3, %xmm1 225; XOPAVX2-NEXT: vpshaw %xmm1, %xmm0, %xmm0 226; XOPAVX2-NEXT: vinserti128 $1, %xmm2, %ymm0, %ymm0 227; XOPAVX2-NEXT: retq 228; 229; AVX512DQ-LABEL: var_shift_v16i16: 230; AVX512DQ: # BB#0: 231; AVX512DQ-NEXT: vpmovzxwd {{.*#+}} zmm1 = ymm1[0],zero,ymm1[1],zero,ymm1[2],zero,ymm1[3],zero,ymm1[4],zero,ymm1[5],zero,ymm1[6],zero,ymm1[7],zero,ymm1[8],zero,ymm1[9],zero,ymm1[10],zero,ymm1[11],zero,ymm1[12],zero,ymm1[13],zero,ymm1[14],zero,ymm1[15],zero 232; AVX512DQ-NEXT: vpmovsxwd %ymm0, %zmm0 233; AVX512DQ-NEXT: vpsravd %zmm1, %zmm0, %zmm0 234; AVX512DQ-NEXT: vpmovdw %zmm0, %ymm0 235; AVX512DQ-NEXT: retq 236; 237; AVX512BW-LABEL: var_shift_v16i16: 238; AVX512BW: # BB#0: 239; AVX512BW-NEXT: # kill: %YMM1<def> %YMM1<kill> %ZMM1<def> 240; AVX512BW-NEXT: # kill: %YMM0<def> %YMM0<kill> %ZMM0<def> 241; AVX512BW-NEXT: vpsravw %zmm1, %zmm0, %zmm0 242; AVX512BW-NEXT: # kill: %YMM0<def> %YMM0<kill> %ZMM0<kill> 243; AVX512BW-NEXT: retq 244; 245; AVX512DQVL-LABEL: var_shift_v16i16: 246; AVX512DQVL: # BB#0: 247; AVX512DQVL-NEXT: vpmovzxwd {{.*#+}} zmm1 = ymm1[0],zero,ymm1[1],zero,ymm1[2],zero,ymm1[3],zero,ymm1[4],zero,ymm1[5],zero,ymm1[6],zero,ymm1[7],zero,ymm1[8],zero,ymm1[9],zero,ymm1[10],zero,ymm1[11],zero,ymm1[12],zero,ymm1[13],zero,ymm1[14],zero,ymm1[15],zero 248; AVX512DQVL-NEXT: vpmovsxwd %ymm0, %zmm0 249; AVX512DQVL-NEXT: vpsravd %zmm1, %zmm0, %zmm0 250; AVX512DQVL-NEXT: vpmovdw %zmm0, %ymm0 251; AVX512DQVL-NEXT: retq 252; 253; AVX512BWVL-LABEL: var_shift_v16i16: 254; AVX512BWVL: # BB#0: 255; AVX512BWVL-NEXT: vpsravw %ymm1, %ymm0, %ymm0 256; AVX512BWVL-NEXT: retq 257 %shift = ashr <16 x i16> %a, %b 258 ret <16 x i16> %shift 259} 260 261define <32 x i8> @var_shift_v32i8(<32 x i8> %a, <32 x i8> %b) nounwind { 262; AVX1-LABEL: var_shift_v32i8: 263; AVX1: # BB#0: 264; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2 265; AVX1-NEXT: vpsllw $5, %xmm2, %xmm2 266; AVX1-NEXT: vpunpckhbw {{.*#+}} xmm3 = xmm0[8],xmm2[8],xmm0[9],xmm2[9],xmm0[10],xmm2[10],xmm0[11],xmm2[11],xmm0[12],xmm2[12],xmm0[13],xmm2[13],xmm0[14],xmm2[14],xmm0[15],xmm2[15] 267; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm4 268; AVX1-NEXT: vpunpckhbw {{.*#+}} xmm5 = xmm0[8],xmm4[8],xmm0[9],xmm4[9],xmm0[10],xmm4[10],xmm0[11],xmm4[11],xmm0[12],xmm4[12],xmm0[13],xmm4[13],xmm0[14],xmm4[14],xmm0[15],xmm4[15] 269; AVX1-NEXT: vpsraw $4, %xmm5, %xmm6 270; AVX1-NEXT: vpblendvb %xmm3, %xmm6, %xmm5, %xmm5 271; AVX1-NEXT: vpsraw $2, %xmm5, %xmm6 272; AVX1-NEXT: vpaddw %xmm3, %xmm3, %xmm3 273; AVX1-NEXT: vpblendvb %xmm3, %xmm6, %xmm5, %xmm5 274; AVX1-NEXT: vpsraw $1, %xmm5, %xmm6 275; AVX1-NEXT: vpaddw %xmm3, %xmm3, %xmm3 276; AVX1-NEXT: vpblendvb %xmm3, %xmm6, %xmm5, %xmm3 277; AVX1-NEXT: vpsrlw $8, %xmm3, %xmm3 278; AVX1-NEXT: vpunpcklbw {{.*#+}} xmm2 = xmm0[0],xmm2[0],xmm0[1],xmm2[1],xmm0[2],xmm2[2],xmm0[3],xmm2[3],xmm0[4],xmm2[4],xmm0[5],xmm2[5],xmm0[6],xmm2[6],xmm0[7],xmm2[7] 279; AVX1-NEXT: vpunpcklbw {{.*#+}} xmm4 = xmm0[0],xmm4[0],xmm0[1],xmm4[1],xmm0[2],xmm4[2],xmm0[3],xmm4[3],xmm0[4],xmm4[4],xmm0[5],xmm4[5],xmm0[6],xmm4[6],xmm0[7],xmm4[7] 280; AVX1-NEXT: vpsraw $4, %xmm4, %xmm5 281; AVX1-NEXT: vpblendvb %xmm2, %xmm5, %xmm4, %xmm4 282; AVX1-NEXT: vpsraw $2, %xmm4, %xmm5 283; AVX1-NEXT: vpaddw %xmm2, %xmm2, %xmm2 284; AVX1-NEXT: vpblendvb %xmm2, %xmm5, %xmm4, %xmm4 285; AVX1-NEXT: vpsraw $1, %xmm4, %xmm5 286; AVX1-NEXT: vpaddw %xmm2, %xmm2, %xmm2 287; AVX1-NEXT: vpblendvb %xmm2, %xmm5, %xmm4, %xmm2 288; AVX1-NEXT: vpsrlw $8, %xmm2, %xmm2 289; AVX1-NEXT: vpackuswb %xmm3, %xmm2, %xmm2 290; AVX1-NEXT: vpsllw $5, %xmm1, %xmm1 291; AVX1-NEXT: vpunpckhbw {{.*#+}} xmm3 = xmm0[8],xmm1[8],xmm0[9],xmm1[9],xmm0[10],xmm1[10],xmm0[11],xmm1[11],xmm0[12],xmm1[12],xmm0[13],xmm1[13],xmm0[14],xmm1[14],xmm0[15],xmm1[15] 292; AVX1-NEXT: vpunpckhbw {{.*#+}} xmm4 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15] 293; AVX1-NEXT: vpsraw $4, %xmm4, %xmm5 294; AVX1-NEXT: vpblendvb %xmm3, %xmm5, %xmm4, %xmm4 295; AVX1-NEXT: vpsraw $2, %xmm4, %xmm5 296; AVX1-NEXT: vpaddw %xmm3, %xmm3, %xmm3 297; AVX1-NEXT: vpblendvb %xmm3, %xmm5, %xmm4, %xmm4 298; AVX1-NEXT: vpsraw $1, %xmm4, %xmm5 299; AVX1-NEXT: vpaddw %xmm3, %xmm3, %xmm3 300; AVX1-NEXT: vpblendvb %xmm3, %xmm5, %xmm4, %xmm3 301; AVX1-NEXT: vpsrlw $8, %xmm3, %xmm3 302; AVX1-NEXT: vpunpcklbw {{.*#+}} xmm1 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3],xmm0[4],xmm1[4],xmm0[5],xmm1[5],xmm0[6],xmm1[6],xmm0[7],xmm1[7] 303; AVX1-NEXT: vpunpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7] 304; AVX1-NEXT: vpsraw $4, %xmm0, %xmm4 305; AVX1-NEXT: vpblendvb %xmm1, %xmm4, %xmm0, %xmm0 306; AVX1-NEXT: vpsraw $2, %xmm0, %xmm4 307; AVX1-NEXT: vpaddw %xmm1, %xmm1, %xmm1 308; AVX1-NEXT: vpblendvb %xmm1, %xmm4, %xmm0, %xmm0 309; AVX1-NEXT: vpsraw $1, %xmm0, %xmm4 310; AVX1-NEXT: vpaddw %xmm1, %xmm1, %xmm1 311; AVX1-NEXT: vpblendvb %xmm1, %xmm4, %xmm0, %xmm0 312; AVX1-NEXT: vpsrlw $8, %xmm0, %xmm0 313; AVX1-NEXT: vpackuswb %xmm3, %xmm0, %xmm0 314; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0 315; AVX1-NEXT: retq 316; 317; AVX2-LABEL: var_shift_v32i8: 318; AVX2: # BB#0: 319; AVX2-NEXT: vpsllw $5, %ymm1, %ymm1 320; AVX2-NEXT: vpunpckhbw {{.*#+}} ymm2 = ymm0[8],ymm1[8],ymm0[9],ymm1[9],ymm0[10],ymm1[10],ymm0[11],ymm1[11],ymm0[12],ymm1[12],ymm0[13],ymm1[13],ymm0[14],ymm1[14],ymm0[15],ymm1[15],ymm0[24],ymm1[24],ymm0[25],ymm1[25],ymm0[26],ymm1[26],ymm0[27],ymm1[27],ymm0[28],ymm1[28],ymm0[29],ymm1[29],ymm0[30],ymm1[30],ymm0[31],ymm1[31] 321; AVX2-NEXT: vpunpckhbw {{.*#+}} ymm3 = ymm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15,24,24,25,25,26,26,27,27,28,28,29,29,30,30,31,31] 322; AVX2-NEXT: vpsraw $4, %ymm3, %ymm4 323; AVX2-NEXT: vpblendvb %ymm2, %ymm4, %ymm3, %ymm3 324; AVX2-NEXT: vpsraw $2, %ymm3, %ymm4 325; AVX2-NEXT: vpaddw %ymm2, %ymm2, %ymm2 326; AVX2-NEXT: vpblendvb %ymm2, %ymm4, %ymm3, %ymm3 327; AVX2-NEXT: vpsraw $1, %ymm3, %ymm4 328; AVX2-NEXT: vpaddw %ymm2, %ymm2, %ymm2 329; AVX2-NEXT: vpblendvb %ymm2, %ymm4, %ymm3, %ymm2 330; AVX2-NEXT: vpsrlw $8, %ymm2, %ymm2 331; AVX2-NEXT: vpunpcklbw {{.*#+}} ymm1 = ymm0[0],ymm1[0],ymm0[1],ymm1[1],ymm0[2],ymm1[2],ymm0[3],ymm1[3],ymm0[4],ymm1[4],ymm0[5],ymm1[5],ymm0[6],ymm1[6],ymm0[7],ymm1[7],ymm0[16],ymm1[16],ymm0[17],ymm1[17],ymm0[18],ymm1[18],ymm0[19],ymm1[19],ymm0[20],ymm1[20],ymm0[21],ymm1[21],ymm0[22],ymm1[22],ymm0[23],ymm1[23] 332; AVX2-NEXT: vpunpcklbw {{.*#+}} ymm0 = ymm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,16,16,17,17,18,18,19,19,20,20,21,21,22,22,23,23] 333; AVX2-NEXT: vpsraw $4, %ymm0, %ymm3 334; AVX2-NEXT: vpblendvb %ymm1, %ymm3, %ymm0, %ymm0 335; AVX2-NEXT: vpsraw $2, %ymm0, %ymm3 336; AVX2-NEXT: vpaddw %ymm1, %ymm1, %ymm1 337; AVX2-NEXT: vpblendvb %ymm1, %ymm3, %ymm0, %ymm0 338; AVX2-NEXT: vpsraw $1, %ymm0, %ymm3 339; AVX2-NEXT: vpaddw %ymm1, %ymm1, %ymm1 340; AVX2-NEXT: vpblendvb %ymm1, %ymm3, %ymm0, %ymm0 341; AVX2-NEXT: vpsrlw $8, %ymm0, %ymm0 342; AVX2-NEXT: vpackuswb %ymm2, %ymm0, %ymm0 343; AVX2-NEXT: retq 344; 345; XOPAVX1-LABEL: var_shift_v32i8: 346; XOPAVX1: # BB#0: 347; XOPAVX1-NEXT: vextractf128 $1, %ymm1, %xmm2 348; XOPAVX1-NEXT: vpxor %xmm3, %xmm3, %xmm3 349; XOPAVX1-NEXT: vpsubb %xmm2, %xmm3, %xmm2 350; XOPAVX1-NEXT: vextractf128 $1, %ymm0, %xmm4 351; XOPAVX1-NEXT: vpshab %xmm2, %xmm4, %xmm2 352; XOPAVX1-NEXT: vpsubb %xmm1, %xmm3, %xmm1 353; XOPAVX1-NEXT: vpshab %xmm1, %xmm0, %xmm0 354; XOPAVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0 355; XOPAVX1-NEXT: retq 356; 357; XOPAVX2-LABEL: var_shift_v32i8: 358; XOPAVX2: # BB#0: 359; XOPAVX2-NEXT: vextracti128 $1, %ymm1, %xmm2 360; XOPAVX2-NEXT: vpxor %xmm3, %xmm3, %xmm3 361; XOPAVX2-NEXT: vpsubb %xmm2, %xmm3, %xmm2 362; XOPAVX2-NEXT: vextracti128 $1, %ymm0, %xmm4 363; XOPAVX2-NEXT: vpshab %xmm2, %xmm4, %xmm2 364; XOPAVX2-NEXT: vpsubb %xmm1, %xmm3, %xmm1 365; XOPAVX2-NEXT: vpshab %xmm1, %xmm0, %xmm0 366; XOPAVX2-NEXT: vinserti128 $1, %xmm2, %ymm0, %ymm0 367; XOPAVX2-NEXT: retq 368; 369; AVX512DQ-LABEL: var_shift_v32i8: 370; AVX512DQ: # BB#0: 371; AVX512DQ-NEXT: vpsllw $5, %ymm1, %ymm1 372; AVX512DQ-NEXT: vpunpckhbw {{.*#+}} ymm2 = ymm0[8],ymm1[8],ymm0[9],ymm1[9],ymm0[10],ymm1[10],ymm0[11],ymm1[11],ymm0[12],ymm1[12],ymm0[13],ymm1[13],ymm0[14],ymm1[14],ymm0[15],ymm1[15],ymm0[24],ymm1[24],ymm0[25],ymm1[25],ymm0[26],ymm1[26],ymm0[27],ymm1[27],ymm0[28],ymm1[28],ymm0[29],ymm1[29],ymm0[30],ymm1[30],ymm0[31],ymm1[31] 373; AVX512DQ-NEXT: vpunpckhbw {{.*#+}} ymm3 = ymm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15,24,24,25,25,26,26,27,27,28,28,29,29,30,30,31,31] 374; AVX512DQ-NEXT: vpsraw $4, %ymm3, %ymm4 375; AVX512DQ-NEXT: vpblendvb %ymm2, %ymm4, %ymm3, %ymm3 376; AVX512DQ-NEXT: vpsraw $2, %ymm3, %ymm4 377; AVX512DQ-NEXT: vpaddw %ymm2, %ymm2, %ymm2 378; AVX512DQ-NEXT: vpblendvb %ymm2, %ymm4, %ymm3, %ymm3 379; AVX512DQ-NEXT: vpsraw $1, %ymm3, %ymm4 380; AVX512DQ-NEXT: vpaddw %ymm2, %ymm2, %ymm2 381; AVX512DQ-NEXT: vpblendvb %ymm2, %ymm4, %ymm3, %ymm2 382; AVX512DQ-NEXT: vpsrlw $8, %ymm2, %ymm2 383; AVX512DQ-NEXT: vpunpcklbw {{.*#+}} ymm1 = ymm0[0],ymm1[0],ymm0[1],ymm1[1],ymm0[2],ymm1[2],ymm0[3],ymm1[3],ymm0[4],ymm1[4],ymm0[5],ymm1[5],ymm0[6],ymm1[6],ymm0[7],ymm1[7],ymm0[16],ymm1[16],ymm0[17],ymm1[17],ymm0[18],ymm1[18],ymm0[19],ymm1[19],ymm0[20],ymm1[20],ymm0[21],ymm1[21],ymm0[22],ymm1[22],ymm0[23],ymm1[23] 384; AVX512DQ-NEXT: vpunpcklbw {{.*#+}} ymm0 = ymm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,16,16,17,17,18,18,19,19,20,20,21,21,22,22,23,23] 385; AVX512DQ-NEXT: vpsraw $4, %ymm0, %ymm3 386; AVX512DQ-NEXT: vpblendvb %ymm1, %ymm3, %ymm0, %ymm0 387; AVX512DQ-NEXT: vpsraw $2, %ymm0, %ymm3 388; AVX512DQ-NEXT: vpaddw %ymm1, %ymm1, %ymm1 389; AVX512DQ-NEXT: vpblendvb %ymm1, %ymm3, %ymm0, %ymm0 390; AVX512DQ-NEXT: vpsraw $1, %ymm0, %ymm3 391; AVX512DQ-NEXT: vpaddw %ymm1, %ymm1, %ymm1 392; AVX512DQ-NEXT: vpblendvb %ymm1, %ymm3, %ymm0, %ymm0 393; AVX512DQ-NEXT: vpsrlw $8, %ymm0, %ymm0 394; AVX512DQ-NEXT: vpackuswb %ymm2, %ymm0, %ymm0 395; AVX512DQ-NEXT: retq 396; 397; AVX512BW-LABEL: var_shift_v32i8: 398; AVX512BW: # BB#0: 399; AVX512BW-NEXT: vpmovzxbw {{.*#+}} zmm1 = ymm1[0],zero,ymm1[1],zero,ymm1[2],zero,ymm1[3],zero,ymm1[4],zero,ymm1[5],zero,ymm1[6],zero,ymm1[7],zero,ymm1[8],zero,ymm1[9],zero,ymm1[10],zero,ymm1[11],zero,ymm1[12],zero,ymm1[13],zero,ymm1[14],zero,ymm1[15],zero,ymm1[16],zero,ymm1[17],zero,ymm1[18],zero,ymm1[19],zero,ymm1[20],zero,ymm1[21],zero,ymm1[22],zero,ymm1[23],zero,ymm1[24],zero,ymm1[25],zero,ymm1[26],zero,ymm1[27],zero,ymm1[28],zero,ymm1[29],zero,ymm1[30],zero,ymm1[31],zero 400; AVX512BW-NEXT: vpmovsxbw %ymm0, %zmm0 401; AVX512BW-NEXT: vpsravw %zmm1, %zmm0, %zmm0 402; AVX512BW-NEXT: vpmovwb %zmm0, %ymm0 403; AVX512BW-NEXT: retq 404; 405; AVX512DQVL-LABEL: var_shift_v32i8: 406; AVX512DQVL: # BB#0: 407; AVX512DQVL-NEXT: vpsllw $5, %ymm1, %ymm1 408; AVX512DQVL-NEXT: vpunpckhbw {{.*#+}} ymm2 = ymm0[8],ymm1[8],ymm0[9],ymm1[9],ymm0[10],ymm1[10],ymm0[11],ymm1[11],ymm0[12],ymm1[12],ymm0[13],ymm1[13],ymm0[14],ymm1[14],ymm0[15],ymm1[15],ymm0[24],ymm1[24],ymm0[25],ymm1[25],ymm0[26],ymm1[26],ymm0[27],ymm1[27],ymm0[28],ymm1[28],ymm0[29],ymm1[29],ymm0[30],ymm1[30],ymm0[31],ymm1[31] 409; AVX512DQVL-NEXT: vpunpckhbw {{.*#+}} ymm3 = ymm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15,24,24,25,25,26,26,27,27,28,28,29,29,30,30,31,31] 410; AVX512DQVL-NEXT: vpsraw $4, %ymm3, %ymm4 411; AVX512DQVL-NEXT: vpblendvb %ymm2, %ymm4, %ymm3, %ymm3 412; AVX512DQVL-NEXT: vpsraw $2, %ymm3, %ymm4 413; AVX512DQVL-NEXT: vpaddw %ymm2, %ymm2, %ymm2 414; AVX512DQVL-NEXT: vpblendvb %ymm2, %ymm4, %ymm3, %ymm3 415; AVX512DQVL-NEXT: vpsraw $1, %ymm3, %ymm4 416; AVX512DQVL-NEXT: vpaddw %ymm2, %ymm2, %ymm2 417; AVX512DQVL-NEXT: vpblendvb %ymm2, %ymm4, %ymm3, %ymm2 418; AVX512DQVL-NEXT: vpsrlw $8, %ymm2, %ymm2 419; AVX512DQVL-NEXT: vpunpcklbw {{.*#+}} ymm1 = ymm0[0],ymm1[0],ymm0[1],ymm1[1],ymm0[2],ymm1[2],ymm0[3],ymm1[3],ymm0[4],ymm1[4],ymm0[5],ymm1[5],ymm0[6],ymm1[6],ymm0[7],ymm1[7],ymm0[16],ymm1[16],ymm0[17],ymm1[17],ymm0[18],ymm1[18],ymm0[19],ymm1[19],ymm0[20],ymm1[20],ymm0[21],ymm1[21],ymm0[22],ymm1[22],ymm0[23],ymm1[23] 420; AVX512DQVL-NEXT: vpunpcklbw {{.*#+}} ymm0 = ymm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,16,16,17,17,18,18,19,19,20,20,21,21,22,22,23,23] 421; AVX512DQVL-NEXT: vpsraw $4, %ymm0, %ymm3 422; AVX512DQVL-NEXT: vpblendvb %ymm1, %ymm3, %ymm0, %ymm0 423; AVX512DQVL-NEXT: vpsraw $2, %ymm0, %ymm3 424; AVX512DQVL-NEXT: vpaddw %ymm1, %ymm1, %ymm1 425; AVX512DQVL-NEXT: vpblendvb %ymm1, %ymm3, %ymm0, %ymm0 426; AVX512DQVL-NEXT: vpsraw $1, %ymm0, %ymm3 427; AVX512DQVL-NEXT: vpaddw %ymm1, %ymm1, %ymm1 428; AVX512DQVL-NEXT: vpblendvb %ymm1, %ymm3, %ymm0, %ymm0 429; AVX512DQVL-NEXT: vpsrlw $8, %ymm0, %ymm0 430; AVX512DQVL-NEXT: vpackuswb %ymm2, %ymm0, %ymm0 431; AVX512DQVL-NEXT: retq 432; 433; AVX512BWVL-LABEL: var_shift_v32i8: 434; AVX512BWVL: # BB#0: 435; AVX512BWVL-NEXT: vpmovzxbw {{.*#+}} zmm1 = ymm1[0],zero,ymm1[1],zero,ymm1[2],zero,ymm1[3],zero,ymm1[4],zero,ymm1[5],zero,ymm1[6],zero,ymm1[7],zero,ymm1[8],zero,ymm1[9],zero,ymm1[10],zero,ymm1[11],zero,ymm1[12],zero,ymm1[13],zero,ymm1[14],zero,ymm1[15],zero,ymm1[16],zero,ymm1[17],zero,ymm1[18],zero,ymm1[19],zero,ymm1[20],zero,ymm1[21],zero,ymm1[22],zero,ymm1[23],zero,ymm1[24],zero,ymm1[25],zero,ymm1[26],zero,ymm1[27],zero,ymm1[28],zero,ymm1[29],zero,ymm1[30],zero,ymm1[31],zero 436; AVX512BWVL-NEXT: vpmovsxbw %ymm0, %zmm0 437; AVX512BWVL-NEXT: vpsravw %zmm1, %zmm0, %zmm0 438; AVX512BWVL-NEXT: vpmovwb %zmm0, %ymm0 439; AVX512BWVL-NEXT: retq 440 %shift = ashr <32 x i8> %a, %b 441 ret <32 x i8> %shift 442} 443 444; 445; Uniform Variable Shifts 446; 447 448define <4 x i64> @splatvar_shift_v4i64(<4 x i64> %a, <4 x i64> %b) nounwind { 449; AVX1-LABEL: splatvar_shift_v4i64: 450; AVX1: # BB#0: 451; AVX1-NEXT: vmovdqa {{.*#+}} xmm2 = [9223372036854775808,9223372036854775808] 452; AVX1-NEXT: vpsrlq %xmm1, %xmm2, %xmm2 453; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm3 454; AVX1-NEXT: vpsrlq %xmm1, %xmm3, %xmm3 455; AVX1-NEXT: vpxor %xmm2, %xmm3, %xmm3 456; AVX1-NEXT: vpsubq %xmm2, %xmm3, %xmm3 457; AVX1-NEXT: vpsrlq %xmm1, %xmm0, %xmm0 458; AVX1-NEXT: vpxor %xmm2, %xmm0, %xmm0 459; AVX1-NEXT: vpsubq %xmm2, %xmm0, %xmm0 460; AVX1-NEXT: vinsertf128 $1, %xmm3, %ymm0, %ymm0 461; AVX1-NEXT: retq 462; 463; AVX2-LABEL: splatvar_shift_v4i64: 464; AVX2: # BB#0: 465; AVX2-NEXT: vpbroadcastq {{.*}}(%rip), %ymm2 466; AVX2-NEXT: vpsrlq %xmm1, %ymm2, %ymm2 467; AVX2-NEXT: vpsrlq %xmm1, %ymm0, %ymm0 468; AVX2-NEXT: vpxor %ymm2, %ymm0, %ymm0 469; AVX2-NEXT: vpsubq %ymm2, %ymm0, %ymm0 470; AVX2-NEXT: retq 471; 472; XOPAVX1-LABEL: splatvar_shift_v4i64: 473; XOPAVX1: # BB#0: 474; XOPAVX1-NEXT: vmovddup {{.*#+}} xmm1 = xmm1[0,0] 475; XOPAVX1-NEXT: vpxor %xmm2, %xmm2, %xmm2 476; XOPAVX1-NEXT: vpsubq %xmm1, %xmm2, %xmm1 477; XOPAVX1-NEXT: vextractf128 $1, %ymm0, %xmm2 478; XOPAVX1-NEXT: vpshaq %xmm1, %xmm2, %xmm2 479; XOPAVX1-NEXT: vpshaq %xmm1, %xmm0, %xmm0 480; XOPAVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0 481; XOPAVX1-NEXT: retq 482; 483; XOPAVX2-LABEL: splatvar_shift_v4i64: 484; XOPAVX2: # BB#0: 485; XOPAVX2-NEXT: vpbroadcastq {{.*}}(%rip), %ymm2 486; XOPAVX2-NEXT: vpsrlq %xmm1, %ymm2, %ymm2 487; XOPAVX2-NEXT: vpsrlq %xmm1, %ymm0, %ymm0 488; XOPAVX2-NEXT: vpxor %ymm2, %ymm0, %ymm0 489; XOPAVX2-NEXT: vpsubq %ymm2, %ymm0, %ymm0 490; XOPAVX2-NEXT: retq 491; 492; AVX512-LABEL: splatvar_shift_v4i64: 493; AVX512: # BB#0: 494; AVX512-NEXT: vpbroadcastq {{.*}}(%rip), %ymm2 495; AVX512-NEXT: vpsrlq %xmm1, %ymm2, %ymm2 496; AVX512-NEXT: vpsrlq %xmm1, %ymm0, %ymm0 497; AVX512-NEXT: vpxor %ymm2, %ymm0, %ymm0 498; AVX512-NEXT: vpsubq %ymm2, %ymm0, %ymm0 499; AVX512-NEXT: retq 500; 501; AVX512VL-LABEL: splatvar_shift_v4i64: 502; AVX512VL: # BB#0: 503; AVX512VL-NEXT: vpsraq %xmm1, %ymm0, %ymm0 504; AVX512VL-NEXT: retq 505 %splat = shufflevector <4 x i64> %b, <4 x i64> undef, <4 x i32> zeroinitializer 506 %shift = ashr <4 x i64> %a, %splat 507 ret <4 x i64> %shift 508} 509 510define <8 x i32> @splatvar_shift_v8i32(<8 x i32> %a, <8 x i32> %b) nounwind { 511; AVX1-LABEL: splatvar_shift_v8i32: 512; AVX1: # BB#0: 513; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2 514; AVX1-NEXT: vpmovzxdq {{.*#+}} xmm1 = xmm1[0],zero,xmm1[1],zero 515; AVX1-NEXT: vpsrad %xmm1, %xmm2, %xmm2 516; AVX1-NEXT: vpsrad %xmm1, %xmm0, %xmm0 517; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0 518; AVX1-NEXT: retq 519; 520; AVX2-LABEL: splatvar_shift_v8i32: 521; AVX2: # BB#0: 522; AVX2-NEXT: vpmovzxdq {{.*#+}} xmm1 = xmm1[0],zero,xmm1[1],zero 523; AVX2-NEXT: vpsrad %xmm1, %ymm0, %ymm0 524; AVX2-NEXT: retq 525; 526; XOPAVX1-LABEL: splatvar_shift_v8i32: 527; XOPAVX1: # BB#0: 528; XOPAVX1-NEXT: vextractf128 $1, %ymm0, %xmm2 529; XOPAVX1-NEXT: vpmovzxdq {{.*#+}} xmm1 = xmm1[0],zero,xmm1[1],zero 530; XOPAVX1-NEXT: vpsrad %xmm1, %xmm2, %xmm2 531; XOPAVX1-NEXT: vpsrad %xmm1, %xmm0, %xmm0 532; XOPAVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0 533; XOPAVX1-NEXT: retq 534; 535; XOPAVX2-LABEL: splatvar_shift_v8i32: 536; XOPAVX2: # BB#0: 537; XOPAVX2-NEXT: vpmovzxdq {{.*#+}} xmm1 = xmm1[0],zero,xmm1[1],zero 538; XOPAVX2-NEXT: vpsrad %xmm1, %ymm0, %ymm0 539; XOPAVX2-NEXT: retq 540; 541; AVX512-LABEL: splatvar_shift_v8i32: 542; AVX512: # BB#0: 543; AVX512-NEXT: vpmovzxdq {{.*#+}} xmm1 = xmm1[0],zero,xmm1[1],zero 544; AVX512-NEXT: vpsrad %xmm1, %ymm0, %ymm0 545; AVX512-NEXT: retq 546; 547; AVX512VL-LABEL: splatvar_shift_v8i32: 548; AVX512VL: # BB#0: 549; AVX512VL-NEXT: vpmovzxdq {{.*#+}} xmm1 = xmm1[0],zero,xmm1[1],zero 550; AVX512VL-NEXT: vpsrad %xmm1, %ymm0, %ymm0 551; AVX512VL-NEXT: retq 552 %splat = shufflevector <8 x i32> %b, <8 x i32> undef, <8 x i32> zeroinitializer 553 %shift = ashr <8 x i32> %a, %splat 554 ret <8 x i32> %shift 555} 556 557define <16 x i16> @splatvar_shift_v16i16(<16 x i16> %a, <16 x i16> %b) nounwind { 558; AVX1-LABEL: splatvar_shift_v16i16: 559; AVX1: # BB#0: 560; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2 561; AVX1-NEXT: vpmovzxwq {{.*#+}} xmm1 = xmm1[0],zero,zero,zero,xmm1[1],zero,zero,zero 562; AVX1-NEXT: vpsraw %xmm1, %xmm2, %xmm2 563; AVX1-NEXT: vpsraw %xmm1, %xmm0, %xmm0 564; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0 565; AVX1-NEXT: retq 566; 567; AVX2-LABEL: splatvar_shift_v16i16: 568; AVX2: # BB#0: 569; AVX2-NEXT: vpmovzxwq {{.*#+}} xmm1 = xmm1[0],zero,zero,zero,xmm1[1],zero,zero,zero 570; AVX2-NEXT: vpsraw %xmm1, %ymm0, %ymm0 571; AVX2-NEXT: retq 572; 573; XOPAVX1-LABEL: splatvar_shift_v16i16: 574; XOPAVX1: # BB#0: 575; XOPAVX1-NEXT: vextractf128 $1, %ymm0, %xmm2 576; XOPAVX1-NEXT: vpmovzxwq {{.*#+}} xmm1 = xmm1[0],zero,zero,zero,xmm1[1],zero,zero,zero 577; XOPAVX1-NEXT: vpsraw %xmm1, %xmm2, %xmm2 578; XOPAVX1-NEXT: vpsraw %xmm1, %xmm0, %xmm0 579; XOPAVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0 580; XOPAVX1-NEXT: retq 581; 582; XOPAVX2-LABEL: splatvar_shift_v16i16: 583; XOPAVX2: # BB#0: 584; XOPAVX2-NEXT: vpmovzxwq {{.*#+}} xmm1 = xmm1[0],zero,zero,zero,xmm1[1],zero,zero,zero 585; XOPAVX2-NEXT: vpsraw %xmm1, %ymm0, %ymm0 586; XOPAVX2-NEXT: retq 587; 588; AVX512-LABEL: splatvar_shift_v16i16: 589; AVX512: # BB#0: 590; AVX512-NEXT: vpmovzxwq {{.*#+}} xmm1 = xmm1[0],zero,zero,zero,xmm1[1],zero,zero,zero 591; AVX512-NEXT: vpsraw %xmm1, %ymm0, %ymm0 592; AVX512-NEXT: retq 593; 594; AVX512VL-LABEL: splatvar_shift_v16i16: 595; AVX512VL: # BB#0: 596; AVX512VL-NEXT: vpmovzxwq {{.*#+}} xmm1 = xmm1[0],zero,zero,zero,xmm1[1],zero,zero,zero 597; AVX512VL-NEXT: vpsraw %xmm1, %ymm0, %ymm0 598; AVX512VL-NEXT: retq 599 %splat = shufflevector <16 x i16> %b, <16 x i16> undef, <16 x i32> zeroinitializer 600 %shift = ashr <16 x i16> %a, %splat 601 ret <16 x i16> %shift 602} 603 604define <32 x i8> @splatvar_shift_v32i8(<32 x i8> %a, <32 x i8> %b) nounwind { 605; AVX1-LABEL: splatvar_shift_v32i8: 606; AVX1: # BB#0: 607; AVX1-NEXT: vpxor %xmm2, %xmm2, %xmm2 608; AVX1-NEXT: vpshufb %xmm2, %xmm1, %xmm1 609; AVX1-NEXT: vpsllw $5, %xmm1, %xmm1 610; AVX1-NEXT: vpunpckhbw {{.*#+}} xmm2 = xmm0[8],xmm1[8],xmm0[9],xmm1[9],xmm0[10],xmm1[10],xmm0[11],xmm1[11],xmm0[12],xmm1[12],xmm0[13],xmm1[13],xmm0[14],xmm1[14],xmm0[15],xmm1[15] 611; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm3 612; AVX1-NEXT: vpunpckhbw {{.*#+}} xmm4 = xmm0[8],xmm3[8],xmm0[9],xmm3[9],xmm0[10],xmm3[10],xmm0[11],xmm3[11],xmm0[12],xmm3[12],xmm0[13],xmm3[13],xmm0[14],xmm3[14],xmm0[15],xmm3[15] 613; AVX1-NEXT: vpsraw $4, %xmm4, %xmm5 614; AVX1-NEXT: vpblendvb %xmm2, %xmm5, %xmm4, %xmm4 615; AVX1-NEXT: vpsraw $2, %xmm4, %xmm5 616; AVX1-NEXT: vpaddw %xmm2, %xmm2, %xmm6 617; AVX1-NEXT: vpblendvb %xmm6, %xmm5, %xmm4, %xmm4 618; AVX1-NEXT: vpsraw $1, %xmm4, %xmm5 619; AVX1-NEXT: vpaddw %xmm6, %xmm6, %xmm9 620; AVX1-NEXT: vpblendvb %xmm9, %xmm5, %xmm4, %xmm4 621; AVX1-NEXT: vpsrlw $8, %xmm4, %xmm8 622; AVX1-NEXT: vpunpcklbw {{.*#+}} xmm1 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3],xmm0[4],xmm1[4],xmm0[5],xmm1[5],xmm0[6],xmm1[6],xmm0[7],xmm1[7] 623; AVX1-NEXT: vpunpcklbw {{.*#+}} xmm3 = 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] 624; AVX1-NEXT: vpsraw $4, %xmm3, %xmm5 625; AVX1-NEXT: vpblendvb %xmm1, %xmm5, %xmm3, %xmm3 626; AVX1-NEXT: vpsraw $2, %xmm3, %xmm5 627; AVX1-NEXT: vpaddw %xmm1, %xmm1, %xmm4 628; AVX1-NEXT: vpblendvb %xmm4, %xmm5, %xmm3, %xmm3 629; AVX1-NEXT: vpsraw $1, %xmm3, %xmm5 630; AVX1-NEXT: vpaddw %xmm4, %xmm4, %xmm7 631; AVX1-NEXT: vpblendvb %xmm7, %xmm5, %xmm3, %xmm3 632; AVX1-NEXT: vpsrlw $8, %xmm3, %xmm3 633; AVX1-NEXT: vpackuswb %xmm8, %xmm3, %xmm8 634; AVX1-NEXT: vpunpckhbw {{.*#+}} xmm5 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15] 635; AVX1-NEXT: vpsraw $4, %xmm5, %xmm3 636; AVX1-NEXT: vpblendvb %xmm2, %xmm3, %xmm5, %xmm2 637; AVX1-NEXT: vpsraw $2, %xmm2, %xmm3 638; AVX1-NEXT: vpblendvb %xmm6, %xmm3, %xmm2, %xmm2 639; AVX1-NEXT: vpsraw $1, %xmm2, %xmm3 640; AVX1-NEXT: vpblendvb %xmm9, %xmm3, %xmm2, %xmm2 641; AVX1-NEXT: vpsrlw $8, %xmm2, %xmm2 642; AVX1-NEXT: vpunpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7] 643; AVX1-NEXT: vpsraw $4, %xmm0, %xmm3 644; AVX1-NEXT: vpblendvb %xmm1, %xmm3, %xmm0, %xmm0 645; AVX1-NEXT: vpsraw $2, %xmm0, %xmm1 646; AVX1-NEXT: vpblendvb %xmm4, %xmm1, %xmm0, %xmm0 647; AVX1-NEXT: vpsraw $1, %xmm0, %xmm1 648; AVX1-NEXT: vpblendvb %xmm7, %xmm1, %xmm0, %xmm0 649; AVX1-NEXT: vpsrlw $8, %xmm0, %xmm0 650; AVX1-NEXT: vpackuswb %xmm2, %xmm0, %xmm0 651; AVX1-NEXT: vinsertf128 $1, %xmm8, %ymm0, %ymm0 652; AVX1-NEXT: retq 653; 654; AVX2-LABEL: splatvar_shift_v32i8: 655; AVX2: # BB#0: 656; AVX2-NEXT: vpbroadcastb %xmm1, %ymm1 657; AVX2-NEXT: vpsllw $5, %ymm1, %ymm1 658; AVX2-NEXT: vpunpckhbw {{.*#+}} ymm2 = ymm0[8],ymm1[8],ymm0[9],ymm1[9],ymm0[10],ymm1[10],ymm0[11],ymm1[11],ymm0[12],ymm1[12],ymm0[13],ymm1[13],ymm0[14],ymm1[14],ymm0[15],ymm1[15],ymm0[24],ymm1[24],ymm0[25],ymm1[25],ymm0[26],ymm1[26],ymm0[27],ymm1[27],ymm0[28],ymm1[28],ymm0[29],ymm1[29],ymm0[30],ymm1[30],ymm0[31],ymm1[31] 659; AVX2-NEXT: vpunpckhbw {{.*#+}} ymm3 = ymm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15,24,24,25,25,26,26,27,27,28,28,29,29,30,30,31,31] 660; AVX2-NEXT: vpsraw $4, %ymm3, %ymm4 661; AVX2-NEXT: vpblendvb %ymm2, %ymm4, %ymm3, %ymm3 662; AVX2-NEXT: vpsraw $2, %ymm3, %ymm4 663; AVX2-NEXT: vpaddw %ymm2, %ymm2, %ymm2 664; AVX2-NEXT: vpblendvb %ymm2, %ymm4, %ymm3, %ymm3 665; AVX2-NEXT: vpsraw $1, %ymm3, %ymm4 666; AVX2-NEXT: vpaddw %ymm2, %ymm2, %ymm2 667; AVX2-NEXT: vpblendvb %ymm2, %ymm4, %ymm3, %ymm2 668; AVX2-NEXT: vpsrlw $8, %ymm2, %ymm2 669; AVX2-NEXT: vpunpcklbw {{.*#+}} ymm1 = ymm0[0],ymm1[0],ymm0[1],ymm1[1],ymm0[2],ymm1[2],ymm0[3],ymm1[3],ymm0[4],ymm1[4],ymm0[5],ymm1[5],ymm0[6],ymm1[6],ymm0[7],ymm1[7],ymm0[16],ymm1[16],ymm0[17],ymm1[17],ymm0[18],ymm1[18],ymm0[19],ymm1[19],ymm0[20],ymm1[20],ymm0[21],ymm1[21],ymm0[22],ymm1[22],ymm0[23],ymm1[23] 670; AVX2-NEXT: vpunpcklbw {{.*#+}} ymm0 = ymm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,16,16,17,17,18,18,19,19,20,20,21,21,22,22,23,23] 671; AVX2-NEXT: vpsraw $4, %ymm0, %ymm3 672; AVX2-NEXT: vpblendvb %ymm1, %ymm3, %ymm0, %ymm0 673; AVX2-NEXT: vpsraw $2, %ymm0, %ymm3 674; AVX2-NEXT: vpaddw %ymm1, %ymm1, %ymm1 675; AVX2-NEXT: vpblendvb %ymm1, %ymm3, %ymm0, %ymm0 676; AVX2-NEXT: vpsraw $1, %ymm0, %ymm3 677; AVX2-NEXT: vpaddw %ymm1, %ymm1, %ymm1 678; AVX2-NEXT: vpblendvb %ymm1, %ymm3, %ymm0, %ymm0 679; AVX2-NEXT: vpsrlw $8, %ymm0, %ymm0 680; AVX2-NEXT: vpackuswb %ymm2, %ymm0, %ymm0 681; AVX2-NEXT: retq 682; 683; XOPAVX1-LABEL: splatvar_shift_v32i8: 684; XOPAVX1: # BB#0: 685; XOPAVX1-NEXT: vpxor %xmm2, %xmm2, %xmm2 686; XOPAVX1-NEXT: vpshufb %xmm2, %xmm1, %xmm1 687; XOPAVX1-NEXT: vpsubb %xmm1, %xmm2, %xmm1 688; XOPAVX1-NEXT: vextractf128 $1, %ymm0, %xmm2 689; XOPAVX1-NEXT: vpshab %xmm1, %xmm2, %xmm2 690; XOPAVX1-NEXT: vpshab %xmm1, %xmm0, %xmm0 691; XOPAVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0 692; XOPAVX1-NEXT: retq 693; 694; XOPAVX2-LABEL: splatvar_shift_v32i8: 695; XOPAVX2: # BB#0: 696; XOPAVX2-NEXT: vpbroadcastb %xmm1, %ymm1 697; XOPAVX2-NEXT: vextracti128 $1, %ymm1, %xmm2 698; XOPAVX2-NEXT: vpxor %xmm3, %xmm3, %xmm3 699; XOPAVX2-NEXT: vpsubb %xmm2, %xmm3, %xmm2 700; XOPAVX2-NEXT: vextracti128 $1, %ymm0, %xmm4 701; XOPAVX2-NEXT: vpshab %xmm2, %xmm4, %xmm2 702; XOPAVX2-NEXT: vpsubb %xmm1, %xmm3, %xmm1 703; XOPAVX2-NEXT: vpshab %xmm1, %xmm0, %xmm0 704; XOPAVX2-NEXT: vinserti128 $1, %xmm2, %ymm0, %ymm0 705; XOPAVX2-NEXT: retq 706; 707; AVX512DQ-LABEL: splatvar_shift_v32i8: 708; AVX512DQ: # BB#0: 709; AVX512DQ-NEXT: vpbroadcastb %xmm1, %ymm1 710; AVX512DQ-NEXT: vpsllw $5, %ymm1, %ymm1 711; AVX512DQ-NEXT: vpunpckhbw {{.*#+}} ymm2 = ymm0[8],ymm1[8],ymm0[9],ymm1[9],ymm0[10],ymm1[10],ymm0[11],ymm1[11],ymm0[12],ymm1[12],ymm0[13],ymm1[13],ymm0[14],ymm1[14],ymm0[15],ymm1[15],ymm0[24],ymm1[24],ymm0[25],ymm1[25],ymm0[26],ymm1[26],ymm0[27],ymm1[27],ymm0[28],ymm1[28],ymm0[29],ymm1[29],ymm0[30],ymm1[30],ymm0[31],ymm1[31] 712; AVX512DQ-NEXT: vpunpckhbw {{.*#+}} ymm3 = ymm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15,24,24,25,25,26,26,27,27,28,28,29,29,30,30,31,31] 713; AVX512DQ-NEXT: vpsraw $4, %ymm3, %ymm4 714; AVX512DQ-NEXT: vpblendvb %ymm2, %ymm4, %ymm3, %ymm3 715; AVX512DQ-NEXT: vpsraw $2, %ymm3, %ymm4 716; AVX512DQ-NEXT: vpaddw %ymm2, %ymm2, %ymm2 717; AVX512DQ-NEXT: vpblendvb %ymm2, %ymm4, %ymm3, %ymm3 718; AVX512DQ-NEXT: vpsraw $1, %ymm3, %ymm4 719; AVX512DQ-NEXT: vpaddw %ymm2, %ymm2, %ymm2 720; AVX512DQ-NEXT: vpblendvb %ymm2, %ymm4, %ymm3, %ymm2 721; AVX512DQ-NEXT: vpsrlw $8, %ymm2, %ymm2 722; AVX512DQ-NEXT: vpunpcklbw {{.*#+}} ymm1 = ymm0[0],ymm1[0],ymm0[1],ymm1[1],ymm0[2],ymm1[2],ymm0[3],ymm1[3],ymm0[4],ymm1[4],ymm0[5],ymm1[5],ymm0[6],ymm1[6],ymm0[7],ymm1[7],ymm0[16],ymm1[16],ymm0[17],ymm1[17],ymm0[18],ymm1[18],ymm0[19],ymm1[19],ymm0[20],ymm1[20],ymm0[21],ymm1[21],ymm0[22],ymm1[22],ymm0[23],ymm1[23] 723; AVX512DQ-NEXT: vpunpcklbw {{.*#+}} ymm0 = ymm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,16,16,17,17,18,18,19,19,20,20,21,21,22,22,23,23] 724; AVX512DQ-NEXT: vpsraw $4, %ymm0, %ymm3 725; AVX512DQ-NEXT: vpblendvb %ymm1, %ymm3, %ymm0, %ymm0 726; AVX512DQ-NEXT: vpsraw $2, %ymm0, %ymm3 727; AVX512DQ-NEXT: vpaddw %ymm1, %ymm1, %ymm1 728; AVX512DQ-NEXT: vpblendvb %ymm1, %ymm3, %ymm0, %ymm0 729; AVX512DQ-NEXT: vpsraw $1, %ymm0, %ymm3 730; AVX512DQ-NEXT: vpaddw %ymm1, %ymm1, %ymm1 731; AVX512DQ-NEXT: vpblendvb %ymm1, %ymm3, %ymm0, %ymm0 732; AVX512DQ-NEXT: vpsrlw $8, %ymm0, %ymm0 733; AVX512DQ-NEXT: vpackuswb %ymm2, %ymm0, %ymm0 734; AVX512DQ-NEXT: retq 735; 736; AVX512BW-LABEL: splatvar_shift_v32i8: 737; AVX512BW: # BB#0: 738; AVX512BW-NEXT: vpbroadcastb %xmm1, %ymm1 739; AVX512BW-NEXT: vpmovsxbw %ymm0, %zmm0 740; AVX512BW-NEXT: vpmovzxbw {{.*#+}} zmm1 = ymm1[0],zero,ymm1[1],zero,ymm1[2],zero,ymm1[3],zero,ymm1[4],zero,ymm1[5],zero,ymm1[6],zero,ymm1[7],zero,ymm1[8],zero,ymm1[9],zero,ymm1[10],zero,ymm1[11],zero,ymm1[12],zero,ymm1[13],zero,ymm1[14],zero,ymm1[15],zero,ymm1[16],zero,ymm1[17],zero,ymm1[18],zero,ymm1[19],zero,ymm1[20],zero,ymm1[21],zero,ymm1[22],zero,ymm1[23],zero,ymm1[24],zero,ymm1[25],zero,ymm1[26],zero,ymm1[27],zero,ymm1[28],zero,ymm1[29],zero,ymm1[30],zero,ymm1[31],zero 741; AVX512BW-NEXT: vpsravw %zmm1, %zmm0, %zmm0 742; AVX512BW-NEXT: vpmovwb %zmm0, %ymm0 743; AVX512BW-NEXT: retq 744; 745; AVX512DQVL-LABEL: splatvar_shift_v32i8: 746; AVX512DQVL: # BB#0: 747; AVX512DQVL-NEXT: vpbroadcastb %xmm1, %ymm1 748; AVX512DQVL-NEXT: vpsllw $5, %ymm1, %ymm1 749; AVX512DQVL-NEXT: vpunpckhbw {{.*#+}} ymm2 = ymm0[8],ymm1[8],ymm0[9],ymm1[9],ymm0[10],ymm1[10],ymm0[11],ymm1[11],ymm0[12],ymm1[12],ymm0[13],ymm1[13],ymm0[14],ymm1[14],ymm0[15],ymm1[15],ymm0[24],ymm1[24],ymm0[25],ymm1[25],ymm0[26],ymm1[26],ymm0[27],ymm1[27],ymm0[28],ymm1[28],ymm0[29],ymm1[29],ymm0[30],ymm1[30],ymm0[31],ymm1[31] 750; AVX512DQVL-NEXT: vpunpckhbw {{.*#+}} ymm3 = ymm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15,24,24,25,25,26,26,27,27,28,28,29,29,30,30,31,31] 751; AVX512DQVL-NEXT: vpsraw $4, %ymm3, %ymm4 752; AVX512DQVL-NEXT: vpblendvb %ymm2, %ymm4, %ymm3, %ymm3 753; AVX512DQVL-NEXT: vpsraw $2, %ymm3, %ymm4 754; AVX512DQVL-NEXT: vpaddw %ymm2, %ymm2, %ymm2 755; AVX512DQVL-NEXT: vpblendvb %ymm2, %ymm4, %ymm3, %ymm3 756; AVX512DQVL-NEXT: vpsraw $1, %ymm3, %ymm4 757; AVX512DQVL-NEXT: vpaddw %ymm2, %ymm2, %ymm2 758; AVX512DQVL-NEXT: vpblendvb %ymm2, %ymm4, %ymm3, %ymm2 759; AVX512DQVL-NEXT: vpsrlw $8, %ymm2, %ymm2 760; AVX512DQVL-NEXT: vpunpcklbw {{.*#+}} ymm1 = ymm0[0],ymm1[0],ymm0[1],ymm1[1],ymm0[2],ymm1[2],ymm0[3],ymm1[3],ymm0[4],ymm1[4],ymm0[5],ymm1[5],ymm0[6],ymm1[6],ymm0[7],ymm1[7],ymm0[16],ymm1[16],ymm0[17],ymm1[17],ymm0[18],ymm1[18],ymm0[19],ymm1[19],ymm0[20],ymm1[20],ymm0[21],ymm1[21],ymm0[22],ymm1[22],ymm0[23],ymm1[23] 761; AVX512DQVL-NEXT: vpunpcklbw {{.*#+}} ymm0 = ymm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,16,16,17,17,18,18,19,19,20,20,21,21,22,22,23,23] 762; AVX512DQVL-NEXT: vpsraw $4, %ymm0, %ymm3 763; AVX512DQVL-NEXT: vpblendvb %ymm1, %ymm3, %ymm0, %ymm0 764; AVX512DQVL-NEXT: vpsraw $2, %ymm0, %ymm3 765; AVX512DQVL-NEXT: vpaddw %ymm1, %ymm1, %ymm1 766; AVX512DQVL-NEXT: vpblendvb %ymm1, %ymm3, %ymm0, %ymm0 767; AVX512DQVL-NEXT: vpsraw $1, %ymm0, %ymm3 768; AVX512DQVL-NEXT: vpaddw %ymm1, %ymm1, %ymm1 769; AVX512DQVL-NEXT: vpblendvb %ymm1, %ymm3, %ymm0, %ymm0 770; AVX512DQVL-NEXT: vpsrlw $8, %ymm0, %ymm0 771; AVX512DQVL-NEXT: vpackuswb %ymm2, %ymm0, %ymm0 772; AVX512DQVL-NEXT: retq 773; 774; AVX512BWVL-LABEL: splatvar_shift_v32i8: 775; AVX512BWVL: # BB#0: 776; AVX512BWVL-NEXT: vpbroadcastb %xmm1, %ymm1 777; AVX512BWVL-NEXT: vpmovsxbw %ymm0, %zmm0 778; AVX512BWVL-NEXT: vpmovzxbw {{.*#+}} zmm1 = ymm1[0],zero,ymm1[1],zero,ymm1[2],zero,ymm1[3],zero,ymm1[4],zero,ymm1[5],zero,ymm1[6],zero,ymm1[7],zero,ymm1[8],zero,ymm1[9],zero,ymm1[10],zero,ymm1[11],zero,ymm1[12],zero,ymm1[13],zero,ymm1[14],zero,ymm1[15],zero,ymm1[16],zero,ymm1[17],zero,ymm1[18],zero,ymm1[19],zero,ymm1[20],zero,ymm1[21],zero,ymm1[22],zero,ymm1[23],zero,ymm1[24],zero,ymm1[25],zero,ymm1[26],zero,ymm1[27],zero,ymm1[28],zero,ymm1[29],zero,ymm1[30],zero,ymm1[31],zero 779; AVX512BWVL-NEXT: vpsravw %zmm1, %zmm0, %zmm0 780; AVX512BWVL-NEXT: vpmovwb %zmm0, %ymm0 781; AVX512BWVL-NEXT: retq 782 %splat = shufflevector <32 x i8> %b, <32 x i8> undef, <32 x i32> zeroinitializer 783 %shift = ashr <32 x i8> %a, %splat 784 ret <32 x i8> %shift 785} 786 787; 788; Constant Shifts 789; 790 791define <4 x i64> @constant_shift_v4i64(<4 x i64> %a) nounwind { 792; AVX1-LABEL: constant_shift_v4i64: 793; AVX1: # BB#0: 794; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1 795; AVX1-NEXT: vpsrlq $62, %xmm1, %xmm2 796; AVX1-NEXT: vpsrlq $31, %xmm1, %xmm1 797; AVX1-NEXT: vpblendw {{.*#+}} xmm1 = xmm1[0,1,2,3],xmm2[4,5,6,7] 798; AVX1-NEXT: vmovdqa {{.*#+}} xmm2 = [4294967296,2] 799; AVX1-NEXT: vpxor %xmm2, %xmm1, %xmm1 800; AVX1-NEXT: vpsubq %xmm2, %xmm1, %xmm1 801; AVX1-NEXT: vpsrlq $7, %xmm0, %xmm2 802; AVX1-NEXT: vpsrlq $1, %xmm0, %xmm0 803; AVX1-NEXT: vpblendw {{.*#+}} xmm0 = xmm0[0,1,2,3],xmm2[4,5,6,7] 804; AVX1-NEXT: vmovdqa {{.*#+}} xmm2 = [4611686018427387904,72057594037927936] 805; AVX1-NEXT: vpxor %xmm2, %xmm0, %xmm0 806; AVX1-NEXT: vpsubq %xmm2, %xmm0, %xmm0 807; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0 808; AVX1-NEXT: retq 809; 810; AVX2-LABEL: constant_shift_v4i64: 811; AVX2: # BB#0: 812; AVX2-NEXT: vpsrlvq {{.*}}(%rip), %ymm0, %ymm0 813; AVX2-NEXT: vmovdqa {{.*#+}} ymm1 = [4611686018427387904,72057594037927936,4294967296,2] 814; AVX2-NEXT: vpxor %ymm1, %ymm0, %ymm0 815; AVX2-NEXT: vpsubq %ymm1, %ymm0, %ymm0 816; AVX2-NEXT: retq 817; 818; XOPAVX1-LABEL: constant_shift_v4i64: 819; XOPAVX1: # BB#0: 820; XOPAVX1-NEXT: vpxor %xmm1, %xmm1, %xmm1 821; XOPAVX1-NEXT: vpsubq {{.*}}(%rip), %xmm1, %xmm2 822; XOPAVX1-NEXT: vextractf128 $1, %ymm0, %xmm3 823; XOPAVX1-NEXT: vpshaq %xmm2, %xmm3, %xmm2 824; XOPAVX1-NEXT: vpsubq {{.*}}(%rip), %xmm1, %xmm1 825; XOPAVX1-NEXT: vpshaq %xmm1, %xmm0, %xmm0 826; XOPAVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0 827; XOPAVX1-NEXT: retq 828; 829; XOPAVX2-LABEL: constant_shift_v4i64: 830; XOPAVX2: # BB#0: 831; XOPAVX2-NEXT: vpsrlvq {{.*}}(%rip), %ymm0, %ymm0 832; XOPAVX2-NEXT: vmovdqa {{.*#+}} ymm1 = [4611686018427387904,72057594037927936,4294967296,2] 833; XOPAVX2-NEXT: vpxor %ymm1, %ymm0, %ymm0 834; XOPAVX2-NEXT: vpsubq %ymm1, %ymm0, %ymm0 835; XOPAVX2-NEXT: retq 836; 837; AVX512-LABEL: constant_shift_v4i64: 838; AVX512: # BB#0: 839; AVX512-NEXT: vpsrlvq {{.*}}(%rip), %ymm0, %ymm0 840; AVX512-NEXT: vmovdqa {{.*#+}} ymm1 = [4611686018427387904,72057594037927936,4294967296,2] 841; AVX512-NEXT: vpxor %ymm1, %ymm0, %ymm0 842; AVX512-NEXT: vpsubq %ymm1, %ymm0, %ymm0 843; AVX512-NEXT: retq 844; 845; AVX512VL-LABEL: constant_shift_v4i64: 846; AVX512VL: # BB#0: 847; AVX512VL-NEXT: vpsravq {{.*}}(%rip), %ymm0, %ymm0 848; AVX512VL-NEXT: retq 849 %shift = ashr <4 x i64> %a, <i64 1, i64 7, i64 31, i64 62> 850 ret <4 x i64> %shift 851} 852 853define <8 x i32> @constant_shift_v8i32(<8 x i32> %a) nounwind { 854; AVX1-LABEL: constant_shift_v8i32: 855; AVX1: # BB#0: 856; AVX1-NEXT: vpsrad $7, %xmm0, %xmm1 857; AVX1-NEXT: vpsrad $5, %xmm0, %xmm2 858; AVX1-NEXT: vpblendw {{.*#+}} xmm1 = xmm2[0,1,2,3],xmm1[4,5,6,7] 859; AVX1-NEXT: vpsrad $6, %xmm0, %xmm2 860; AVX1-NEXT: vpsrad $4, %xmm0, %xmm3 861; AVX1-NEXT: vpblendw {{.*#+}} xmm2 = xmm3[0,1,2,3],xmm2[4,5,6,7] 862; AVX1-NEXT: vpblendw {{.*#+}} xmm1 = xmm2[0,1],xmm1[2,3],xmm2[4,5],xmm1[6,7] 863; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm0 864; AVX1-NEXT: vpsrad $7, %xmm0, %xmm2 865; AVX1-NEXT: vpsrad $9, %xmm0, %xmm3 866; AVX1-NEXT: vpblendw {{.*#+}} xmm2 = xmm3[0,1,2,3],xmm2[4,5,6,7] 867; AVX1-NEXT: vpsrad $8, %xmm0, %xmm0 868; AVX1-NEXT: vpblendw {{.*#+}} xmm0 = xmm0[0,1],xmm2[2,3],xmm0[4,5],xmm2[6,7] 869; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm0 870; AVX1-NEXT: retq 871; 872; AVX2-LABEL: constant_shift_v8i32: 873; AVX2: # BB#0: 874; AVX2-NEXT: vpsravd {{.*}}(%rip), %ymm0, %ymm0 875; AVX2-NEXT: retq 876; 877; XOPAVX1-LABEL: constant_shift_v8i32: 878; XOPAVX1: # BB#0: 879; XOPAVX1-NEXT: vpshad {{.*}}(%rip), %xmm0, %xmm1 880; XOPAVX1-NEXT: vextractf128 $1, %ymm0, %xmm0 881; XOPAVX1-NEXT: vpshad {{.*}}(%rip), %xmm0, %xmm0 882; XOPAVX1-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm0 883; XOPAVX1-NEXT: retq 884; 885; XOPAVX2-LABEL: constant_shift_v8i32: 886; XOPAVX2: # BB#0: 887; XOPAVX2-NEXT: vpsravd {{.*}}(%rip), %ymm0, %ymm0 888; XOPAVX2-NEXT: retq 889; 890; AVX512-LABEL: constant_shift_v8i32: 891; AVX512: # BB#0: 892; AVX512-NEXT: vpsravd {{.*}}(%rip), %ymm0, %ymm0 893; AVX512-NEXT: retq 894; 895; AVX512VL-LABEL: constant_shift_v8i32: 896; AVX512VL: # BB#0: 897; AVX512VL-NEXT: vpsravd {{.*}}(%rip), %ymm0, %ymm0 898; AVX512VL-NEXT: retq 899 %shift = ashr <8 x i32> %a, <i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 8, i32 7> 900 ret <8 x i32> %shift 901} 902 903define <16 x i16> @constant_shift_v16i16(<16 x i16> %a) nounwind { 904; AVX1-LABEL: constant_shift_v16i16: 905; AVX1: # BB#0: 906; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1 907; AVX1-NEXT: vpsraw $8, %xmm1, %xmm1 908; AVX1-NEXT: vpsraw $4, %xmm1, %xmm2 909; AVX1-NEXT: vpblendw {{.*#+}} xmm1 = xmm1[0,1,2,3],xmm2[4,5,6,7] 910; AVX1-NEXT: vpsraw $2, %xmm1, %xmm2 911; AVX1-NEXT: vpblendw {{.*#+}} xmm1 = xmm1[0,1],xmm2[2,3],xmm1[4,5],xmm2[6,7] 912; AVX1-NEXT: vpsraw $1, %xmm1, %xmm2 913; AVX1-NEXT: vpblendw {{.*#+}} xmm1 = xmm1[0],xmm2[1],xmm1[2],xmm2[3],xmm1[4],xmm2[5],xmm1[6],xmm2[7] 914; AVX1-NEXT: vpsraw $4, %xmm0, %xmm2 915; AVX1-NEXT: vpblendw {{.*#+}} xmm0 = xmm0[0,1,2,3],xmm2[4,5,6,7] 916; AVX1-NEXT: vpsraw $2, %xmm0, %xmm2 917; AVX1-NEXT: vpblendw {{.*#+}} xmm0 = xmm0[0,1],xmm2[2,3],xmm0[4,5],xmm2[6,7] 918; AVX1-NEXT: vpsraw $1, %xmm0, %xmm2 919; AVX1-NEXT: vpblendw {{.*#+}} xmm0 = xmm0[0],xmm2[1],xmm0[2],xmm2[3],xmm0[4],xmm2[5],xmm0[6],xmm2[7] 920; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0 921; AVX1-NEXT: retq 922; 923; AVX2-LABEL: constant_shift_v16i16: 924; AVX2: # BB#0: 925; AVX2-NEXT: vpxor %ymm1, %ymm1, %ymm1 926; AVX2-NEXT: vmovdqa {{.*#+}} ymm2 = [0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15] 927; AVX2-NEXT: vpunpckhwd {{.*#+}} ymm3 = ymm2[4],ymm1[4],ymm2[5],ymm1[5],ymm2[6],ymm1[6],ymm2[7],ymm1[7],ymm2[12],ymm1[12],ymm2[13],ymm1[13],ymm2[14],ymm1[14],ymm2[15],ymm1[15] 928; AVX2-NEXT: vpunpckhwd {{.*#+}} ymm4 = ymm1[4],ymm0[4],ymm1[5],ymm0[5],ymm1[6],ymm0[6],ymm1[7],ymm0[7],ymm1[12],ymm0[12],ymm1[13],ymm0[13],ymm1[14],ymm0[14],ymm1[15],ymm0[15] 929; AVX2-NEXT: vpsravd %ymm3, %ymm4, %ymm3 930; AVX2-NEXT: vpsrld $16, %ymm3, %ymm3 931; AVX2-NEXT: vpunpcklwd {{.*#+}} ymm2 = ymm2[0],ymm1[0],ymm2[1],ymm1[1],ymm2[2],ymm1[2],ymm2[3],ymm1[3],ymm2[8],ymm1[8],ymm2[9],ymm1[9],ymm2[10],ymm1[10],ymm2[11],ymm1[11] 932; AVX2-NEXT: vpunpcklwd {{.*#+}} ymm0 = ymm1[0],ymm0[0],ymm1[1],ymm0[1],ymm1[2],ymm0[2],ymm1[3],ymm0[3],ymm1[8],ymm0[8],ymm1[9],ymm0[9],ymm1[10],ymm0[10],ymm1[11],ymm0[11] 933; AVX2-NEXT: vpsravd %ymm2, %ymm0, %ymm0 934; AVX2-NEXT: vpsrld $16, %ymm0, %ymm0 935; AVX2-NEXT: vpackusdw %ymm3, %ymm0, %ymm0 936; AVX2-NEXT: retq 937; 938; XOPAVX1-LABEL: constant_shift_v16i16: 939; XOPAVX1: # BB#0: 940; XOPAVX1-NEXT: vpxor %xmm1, %xmm1, %xmm1 941; XOPAVX1-NEXT: vpsubw {{.*}}(%rip), %xmm1, %xmm2 942; XOPAVX1-NEXT: vextractf128 $1, %ymm0, %xmm3 943; XOPAVX1-NEXT: vpshaw %xmm2, %xmm3, %xmm2 944; XOPAVX1-NEXT: vpsubw {{.*}}(%rip), %xmm1, %xmm1 945; XOPAVX1-NEXT: vpshaw %xmm1, %xmm0, %xmm0 946; XOPAVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0 947; XOPAVX1-NEXT: retq 948; 949; XOPAVX2-LABEL: constant_shift_v16i16: 950; XOPAVX2: # BB#0: 951; XOPAVX2-NEXT: vpxor %xmm1, %xmm1, %xmm1 952; XOPAVX2-NEXT: vpsubw {{.*}}(%rip), %xmm1, %xmm2 953; XOPAVX2-NEXT: vextracti128 $1, %ymm0, %xmm3 954; XOPAVX2-NEXT: vpshaw %xmm2, %xmm3, %xmm2 955; XOPAVX2-NEXT: vpsubw {{.*}}(%rip), %xmm1, %xmm1 956; XOPAVX2-NEXT: vpshaw %xmm1, %xmm0, %xmm0 957; XOPAVX2-NEXT: vinserti128 $1, %xmm2, %ymm0, %ymm0 958; XOPAVX2-NEXT: retq 959; 960; AVX512DQ-LABEL: constant_shift_v16i16: 961; AVX512DQ: # BB#0: 962; AVX512DQ-NEXT: vpmovsxwd %ymm0, %zmm0 963; AVX512DQ-NEXT: vpsravd {{.*}}(%rip), %zmm0, %zmm0 964; AVX512DQ-NEXT: vpmovdw %zmm0, %ymm0 965; AVX512DQ-NEXT: retq 966; 967; AVX512BW-LABEL: constant_shift_v16i16: 968; AVX512BW: # BB#0: 969; AVX512BW-NEXT: # kill: %YMM0<def> %YMM0<kill> %ZMM0<def> 970; AVX512BW-NEXT: vmovdqa {{.*#+}} ymm1 = [0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15] 971; AVX512BW-NEXT: vpsravw %zmm1, %zmm0, %zmm0 972; AVX512BW-NEXT: # kill: %YMM0<def> %YMM0<kill> %ZMM0<kill> 973; AVX512BW-NEXT: retq 974; 975; AVX512DQVL-LABEL: constant_shift_v16i16: 976; AVX512DQVL: # BB#0: 977; AVX512DQVL-NEXT: vpmovsxwd %ymm0, %zmm0 978; AVX512DQVL-NEXT: vpsravd {{.*}}(%rip), %zmm0, %zmm0 979; AVX512DQVL-NEXT: vpmovdw %zmm0, %ymm0 980; AVX512DQVL-NEXT: retq 981; 982; AVX512BWVL-LABEL: constant_shift_v16i16: 983; AVX512BWVL: # BB#0: 984; AVX512BWVL-NEXT: vpsravw {{.*}}(%rip), %ymm0, %ymm0 985; AVX512BWVL-NEXT: retq 986 %shift = ashr <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> 987 ret <16 x i16> %shift 988} 989 990define <32 x i8> @constant_shift_v32i8(<32 x i8> %a) nounwind { 991; AVX1-LABEL: constant_shift_v32i8: 992; AVX1: # BB#0: 993; AVX1-NEXT: vmovdqa {{.*#+}} xmm1 = [0,1,2,3,4,5,6,7,7,6,5,4,3,2,1,0] 994; AVX1-NEXT: vpsllw $5, %xmm1, %xmm1 995; AVX1-NEXT: vpunpckhbw {{.*#+}} xmm2 = xmm0[8],xmm1[8],xmm0[9],xmm1[9],xmm0[10],xmm1[10],xmm0[11],xmm1[11],xmm0[12],xmm1[12],xmm0[13],xmm1[13],xmm0[14],xmm1[14],xmm0[15],xmm1[15] 996; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm3 997; AVX1-NEXT: vpunpckhbw {{.*#+}} xmm4 = xmm0[8],xmm3[8],xmm0[9],xmm3[9],xmm0[10],xmm3[10],xmm0[11],xmm3[11],xmm0[12],xmm3[12],xmm0[13],xmm3[13],xmm0[14],xmm3[14],xmm0[15],xmm3[15] 998; AVX1-NEXT: vpsraw $4, %xmm4, %xmm5 999; AVX1-NEXT: vpblendvb %xmm2, %xmm5, %xmm4, %xmm4 1000; AVX1-NEXT: vpsraw $2, %xmm4, %xmm5 1001; AVX1-NEXT: vpaddw %xmm2, %xmm2, %xmm6 1002; AVX1-NEXT: vpblendvb %xmm6, %xmm5, %xmm4, %xmm4 1003; AVX1-NEXT: vpsraw $1, %xmm4, %xmm5 1004; AVX1-NEXT: vpaddw %xmm6, %xmm6, %xmm9 1005; AVX1-NEXT: vpblendvb %xmm9, %xmm5, %xmm4, %xmm4 1006; AVX1-NEXT: vpsrlw $8, %xmm4, %xmm8 1007; AVX1-NEXT: vpunpcklbw {{.*#+}} xmm1 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3],xmm0[4],xmm1[4],xmm0[5],xmm1[5],xmm0[6],xmm1[6],xmm0[7],xmm1[7] 1008; AVX1-NEXT: vpunpcklbw {{.*#+}} xmm3 = 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] 1009; AVX1-NEXT: vpsraw $4, %xmm3, %xmm5 1010; AVX1-NEXT: vpblendvb %xmm1, %xmm5, %xmm3, %xmm3 1011; AVX1-NEXT: vpsraw $2, %xmm3, %xmm5 1012; AVX1-NEXT: vpaddw %xmm1, %xmm1, %xmm4 1013; AVX1-NEXT: vpblendvb %xmm4, %xmm5, %xmm3, %xmm3 1014; AVX1-NEXT: vpsraw $1, %xmm3, %xmm5 1015; AVX1-NEXT: vpaddw %xmm4, %xmm4, %xmm7 1016; AVX1-NEXT: vpblendvb %xmm7, %xmm5, %xmm3, %xmm3 1017; AVX1-NEXT: vpsrlw $8, %xmm3, %xmm3 1018; AVX1-NEXT: vpackuswb %xmm8, %xmm3, %xmm8 1019; AVX1-NEXT: vpunpckhbw {{.*#+}} xmm5 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15] 1020; AVX1-NEXT: vpsraw $4, %xmm5, %xmm3 1021; AVX1-NEXT: vpblendvb %xmm2, %xmm3, %xmm5, %xmm2 1022; AVX1-NEXT: vpsraw $2, %xmm2, %xmm3 1023; AVX1-NEXT: vpblendvb %xmm6, %xmm3, %xmm2, %xmm2 1024; AVX1-NEXT: vpsraw $1, %xmm2, %xmm3 1025; AVX1-NEXT: vpblendvb %xmm9, %xmm3, %xmm2, %xmm2 1026; AVX1-NEXT: vpsrlw $8, %xmm2, %xmm2 1027; AVX1-NEXT: vpunpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7] 1028; AVX1-NEXT: vpsraw $4, %xmm0, %xmm3 1029; AVX1-NEXT: vpblendvb %xmm1, %xmm3, %xmm0, %xmm0 1030; AVX1-NEXT: vpsraw $2, %xmm0, %xmm1 1031; AVX1-NEXT: vpblendvb %xmm4, %xmm1, %xmm0, %xmm0 1032; AVX1-NEXT: vpsraw $1, %xmm0, %xmm1 1033; AVX1-NEXT: vpblendvb %xmm7, %xmm1, %xmm0, %xmm0 1034; AVX1-NEXT: vpsrlw $8, %xmm0, %xmm0 1035; AVX1-NEXT: vpackuswb %xmm2, %xmm0, %xmm0 1036; AVX1-NEXT: vinsertf128 $1, %xmm8, %ymm0, %ymm0 1037; AVX1-NEXT: retq 1038; 1039; AVX2-LABEL: constant_shift_v32i8: 1040; AVX2: # BB#0: 1041; AVX2-NEXT: vmovdqa {{.*#+}} ymm1 = [0,1,2,3,4,5,6,7,7,6,5,4,3,2,1,0,0,1,2,3,4,5,6,7,7,6,5,4,3,2,1,0] 1042; AVX2-NEXT: vpsllw $5, %ymm1, %ymm1 1043; AVX2-NEXT: vpunpckhbw {{.*#+}} ymm2 = ymm0[8],ymm1[8],ymm0[9],ymm1[9],ymm0[10],ymm1[10],ymm0[11],ymm1[11],ymm0[12],ymm1[12],ymm0[13],ymm1[13],ymm0[14],ymm1[14],ymm0[15],ymm1[15],ymm0[24],ymm1[24],ymm0[25],ymm1[25],ymm0[26],ymm1[26],ymm0[27],ymm1[27],ymm0[28],ymm1[28],ymm0[29],ymm1[29],ymm0[30],ymm1[30],ymm0[31],ymm1[31] 1044; AVX2-NEXT: vpunpckhbw {{.*#+}} ymm3 = ymm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15,24,24,25,25,26,26,27,27,28,28,29,29,30,30,31,31] 1045; AVX2-NEXT: vpsraw $4, %ymm3, %ymm4 1046; AVX2-NEXT: vpblendvb %ymm2, %ymm4, %ymm3, %ymm3 1047; AVX2-NEXT: vpsraw $2, %ymm3, %ymm4 1048; AVX2-NEXT: vpaddw %ymm2, %ymm2, %ymm2 1049; AVX2-NEXT: vpblendvb %ymm2, %ymm4, %ymm3, %ymm3 1050; AVX2-NEXT: vpsraw $1, %ymm3, %ymm4 1051; AVX2-NEXT: vpaddw %ymm2, %ymm2, %ymm2 1052; AVX2-NEXT: vpblendvb %ymm2, %ymm4, %ymm3, %ymm2 1053; AVX2-NEXT: vpsrlw $8, %ymm2, %ymm2 1054; AVX2-NEXT: vpunpcklbw {{.*#+}} ymm1 = ymm0[0],ymm1[0],ymm0[1],ymm1[1],ymm0[2],ymm1[2],ymm0[3],ymm1[3],ymm0[4],ymm1[4],ymm0[5],ymm1[5],ymm0[6],ymm1[6],ymm0[7],ymm1[7],ymm0[16],ymm1[16],ymm0[17],ymm1[17],ymm0[18],ymm1[18],ymm0[19],ymm1[19],ymm0[20],ymm1[20],ymm0[21],ymm1[21],ymm0[22],ymm1[22],ymm0[23],ymm1[23] 1055; AVX2-NEXT: vpunpcklbw {{.*#+}} ymm0 = ymm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,16,16,17,17,18,18,19,19,20,20,21,21,22,22,23,23] 1056; AVX2-NEXT: vpsraw $4, %ymm0, %ymm3 1057; AVX2-NEXT: vpblendvb %ymm1, %ymm3, %ymm0, %ymm0 1058; AVX2-NEXT: vpsraw $2, %ymm0, %ymm3 1059; AVX2-NEXT: vpaddw %ymm1, %ymm1, %ymm1 1060; AVX2-NEXT: vpblendvb %ymm1, %ymm3, %ymm0, %ymm0 1061; AVX2-NEXT: vpsraw $1, %ymm0, %ymm3 1062; AVX2-NEXT: vpaddw %ymm1, %ymm1, %ymm1 1063; AVX2-NEXT: vpblendvb %ymm1, %ymm3, %ymm0, %ymm0 1064; AVX2-NEXT: vpsrlw $8, %ymm0, %ymm0 1065; AVX2-NEXT: vpackuswb %ymm2, %ymm0, %ymm0 1066; AVX2-NEXT: retq 1067; 1068; XOPAVX1-LABEL: constant_shift_v32i8: 1069; XOPAVX1: # BB#0: 1070; XOPAVX1-NEXT: vpxor %xmm1, %xmm1, %xmm1 1071; XOPAVX1-NEXT: vpsubb {{.*}}(%rip), %xmm1, %xmm1 1072; XOPAVX1-NEXT: vextractf128 $1, %ymm0, %xmm2 1073; XOPAVX1-NEXT: vpshab %xmm1, %xmm2, %xmm2 1074; XOPAVX1-NEXT: vpshab %xmm1, %xmm0, %xmm0 1075; XOPAVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0 1076; XOPAVX1-NEXT: retq 1077; 1078; XOPAVX2-LABEL: constant_shift_v32i8: 1079; XOPAVX2: # BB#0: 1080; XOPAVX2-NEXT: vpxor %xmm1, %xmm1, %xmm1 1081; XOPAVX2-NEXT: vpsubb {{.*}}(%rip), %xmm1, %xmm1 1082; XOPAVX2-NEXT: vextracti128 $1, %ymm0, %xmm2 1083; XOPAVX2-NEXT: vpshab %xmm1, %xmm2, %xmm2 1084; XOPAVX2-NEXT: vpshab %xmm1, %xmm0, %xmm0 1085; XOPAVX2-NEXT: vinserti128 $1, %xmm2, %ymm0, %ymm0 1086; XOPAVX2-NEXT: retq 1087; 1088; AVX512DQ-LABEL: constant_shift_v32i8: 1089; AVX512DQ: # BB#0: 1090; AVX512DQ-NEXT: vmovdqa {{.*#+}} ymm1 = [0,1,2,3,4,5,6,7,7,6,5,4,3,2,1,0,0,1,2,3,4,5,6,7,7,6,5,4,3,2,1,0] 1091; AVX512DQ-NEXT: vpsllw $5, %ymm1, %ymm1 1092; AVX512DQ-NEXT: vpunpckhbw {{.*#+}} ymm2 = ymm0[8],ymm1[8],ymm0[9],ymm1[9],ymm0[10],ymm1[10],ymm0[11],ymm1[11],ymm0[12],ymm1[12],ymm0[13],ymm1[13],ymm0[14],ymm1[14],ymm0[15],ymm1[15],ymm0[24],ymm1[24],ymm0[25],ymm1[25],ymm0[26],ymm1[26],ymm0[27],ymm1[27],ymm0[28],ymm1[28],ymm0[29],ymm1[29],ymm0[30],ymm1[30],ymm0[31],ymm1[31] 1093; AVX512DQ-NEXT: vpunpckhbw {{.*#+}} ymm3 = ymm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15,24,24,25,25,26,26,27,27,28,28,29,29,30,30,31,31] 1094; AVX512DQ-NEXT: vpsraw $4, %ymm3, %ymm4 1095; AVX512DQ-NEXT: vpblendvb %ymm2, %ymm4, %ymm3, %ymm3 1096; AVX512DQ-NEXT: vpsraw $2, %ymm3, %ymm4 1097; AVX512DQ-NEXT: vpaddw %ymm2, %ymm2, %ymm2 1098; AVX512DQ-NEXT: vpblendvb %ymm2, %ymm4, %ymm3, %ymm3 1099; AVX512DQ-NEXT: vpsraw $1, %ymm3, %ymm4 1100; AVX512DQ-NEXT: vpaddw %ymm2, %ymm2, %ymm2 1101; AVX512DQ-NEXT: vpblendvb %ymm2, %ymm4, %ymm3, %ymm2 1102; AVX512DQ-NEXT: vpsrlw $8, %ymm2, %ymm2 1103; AVX512DQ-NEXT: vpunpcklbw {{.*#+}} ymm1 = ymm0[0],ymm1[0],ymm0[1],ymm1[1],ymm0[2],ymm1[2],ymm0[3],ymm1[3],ymm0[4],ymm1[4],ymm0[5],ymm1[5],ymm0[6],ymm1[6],ymm0[7],ymm1[7],ymm0[16],ymm1[16],ymm0[17],ymm1[17],ymm0[18],ymm1[18],ymm0[19],ymm1[19],ymm0[20],ymm1[20],ymm0[21],ymm1[21],ymm0[22],ymm1[22],ymm0[23],ymm1[23] 1104; AVX512DQ-NEXT: vpunpcklbw {{.*#+}} ymm0 = ymm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,16,16,17,17,18,18,19,19,20,20,21,21,22,22,23,23] 1105; AVX512DQ-NEXT: vpsraw $4, %ymm0, %ymm3 1106; AVX512DQ-NEXT: vpblendvb %ymm1, %ymm3, %ymm0, %ymm0 1107; AVX512DQ-NEXT: vpsraw $2, %ymm0, %ymm3 1108; AVX512DQ-NEXT: vpaddw %ymm1, %ymm1, %ymm1 1109; AVX512DQ-NEXT: vpblendvb %ymm1, %ymm3, %ymm0, %ymm0 1110; AVX512DQ-NEXT: vpsraw $1, %ymm0, %ymm3 1111; AVX512DQ-NEXT: vpaddw %ymm1, %ymm1, %ymm1 1112; AVX512DQ-NEXT: vpblendvb %ymm1, %ymm3, %ymm0, %ymm0 1113; AVX512DQ-NEXT: vpsrlw $8, %ymm0, %ymm0 1114; AVX512DQ-NEXT: vpackuswb %ymm2, %ymm0, %ymm0 1115; AVX512DQ-NEXT: retq 1116; 1117; AVX512BW-LABEL: constant_shift_v32i8: 1118; AVX512BW: # BB#0: 1119; AVX512BW-NEXT: vpmovsxbw %ymm0, %zmm0 1120; AVX512BW-NEXT: vpsravw {{.*}}(%rip), %zmm0, %zmm0 1121; AVX512BW-NEXT: vpmovwb %zmm0, %ymm0 1122; AVX512BW-NEXT: retq 1123; 1124; AVX512DQVL-LABEL: constant_shift_v32i8: 1125; AVX512DQVL: # BB#0: 1126; AVX512DQVL-NEXT: vmovdqa {{.*#+}} ymm1 = [0,1,2,3,4,5,6,7,7,6,5,4,3,2,1,0,0,1,2,3,4,5,6,7,7,6,5,4,3,2,1,0] 1127; AVX512DQVL-NEXT: vpsllw $5, %ymm1, %ymm1 1128; AVX512DQVL-NEXT: vpunpckhbw {{.*#+}} ymm2 = ymm0[8],ymm1[8],ymm0[9],ymm1[9],ymm0[10],ymm1[10],ymm0[11],ymm1[11],ymm0[12],ymm1[12],ymm0[13],ymm1[13],ymm0[14],ymm1[14],ymm0[15],ymm1[15],ymm0[24],ymm1[24],ymm0[25],ymm1[25],ymm0[26],ymm1[26],ymm0[27],ymm1[27],ymm0[28],ymm1[28],ymm0[29],ymm1[29],ymm0[30],ymm1[30],ymm0[31],ymm1[31] 1129; AVX512DQVL-NEXT: vpunpckhbw {{.*#+}} ymm3 = ymm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15,24,24,25,25,26,26,27,27,28,28,29,29,30,30,31,31] 1130; AVX512DQVL-NEXT: vpsraw $4, %ymm3, %ymm4 1131; AVX512DQVL-NEXT: vpblendvb %ymm2, %ymm4, %ymm3, %ymm3 1132; AVX512DQVL-NEXT: vpsraw $2, %ymm3, %ymm4 1133; AVX512DQVL-NEXT: vpaddw %ymm2, %ymm2, %ymm2 1134; AVX512DQVL-NEXT: vpblendvb %ymm2, %ymm4, %ymm3, %ymm3 1135; AVX512DQVL-NEXT: vpsraw $1, %ymm3, %ymm4 1136; AVX512DQVL-NEXT: vpaddw %ymm2, %ymm2, %ymm2 1137; AVX512DQVL-NEXT: vpblendvb %ymm2, %ymm4, %ymm3, %ymm2 1138; AVX512DQVL-NEXT: vpsrlw $8, %ymm2, %ymm2 1139; AVX512DQVL-NEXT: vpunpcklbw {{.*#+}} ymm1 = ymm0[0],ymm1[0],ymm0[1],ymm1[1],ymm0[2],ymm1[2],ymm0[3],ymm1[3],ymm0[4],ymm1[4],ymm0[5],ymm1[5],ymm0[6],ymm1[6],ymm0[7],ymm1[7],ymm0[16],ymm1[16],ymm0[17],ymm1[17],ymm0[18],ymm1[18],ymm0[19],ymm1[19],ymm0[20],ymm1[20],ymm0[21],ymm1[21],ymm0[22],ymm1[22],ymm0[23],ymm1[23] 1140; AVX512DQVL-NEXT: vpunpcklbw {{.*#+}} ymm0 = ymm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,16,16,17,17,18,18,19,19,20,20,21,21,22,22,23,23] 1141; AVX512DQVL-NEXT: vpsraw $4, %ymm0, %ymm3 1142; AVX512DQVL-NEXT: vpblendvb %ymm1, %ymm3, %ymm0, %ymm0 1143; AVX512DQVL-NEXT: vpsraw $2, %ymm0, %ymm3 1144; AVX512DQVL-NEXT: vpaddw %ymm1, %ymm1, %ymm1 1145; AVX512DQVL-NEXT: vpblendvb %ymm1, %ymm3, %ymm0, %ymm0 1146; AVX512DQVL-NEXT: vpsraw $1, %ymm0, %ymm3 1147; AVX512DQVL-NEXT: vpaddw %ymm1, %ymm1, %ymm1 1148; AVX512DQVL-NEXT: vpblendvb %ymm1, %ymm3, %ymm0, %ymm0 1149; AVX512DQVL-NEXT: vpsrlw $8, %ymm0, %ymm0 1150; AVX512DQVL-NEXT: vpackuswb %ymm2, %ymm0, %ymm0 1151; AVX512DQVL-NEXT: retq 1152; 1153; AVX512BWVL-LABEL: constant_shift_v32i8: 1154; AVX512BWVL: # BB#0: 1155; AVX512BWVL-NEXT: vpmovsxbw %ymm0, %zmm0 1156; AVX512BWVL-NEXT: vpsravw {{.*}}(%rip), %zmm0, %zmm0 1157; AVX512BWVL-NEXT: vpmovwb %zmm0, %ymm0 1158; AVX512BWVL-NEXT: retq 1159 %shift = ashr <32 x i8> %a, <i8 0, i8 1, i8 2, i8 3, i8 4, i8 5, i8 6, i8 7, i8 7, i8 6, i8 5, i8 4, i8 3, i8 2, i8 1, i8 0, i8 0, i8 1, i8 2, i8 3, i8 4, i8 5, i8 6, i8 7, i8 7, i8 6, i8 5, i8 4, i8 3, i8 2, i8 1, i8 0> 1160 ret <32 x i8> %shift 1161} 1162 1163; 1164; Uniform Constant Shifts 1165; 1166 1167define <4 x i64> @splatconstant_shift_v4i64(<4 x i64> %a) nounwind { 1168; AVX1-LABEL: splatconstant_shift_v4i64: 1169; AVX1: # BB#0: 1170; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1 1171; AVX1-NEXT: vpsrad $7, %xmm1, %xmm2 1172; AVX1-NEXT: vpsrlq $7, %xmm1, %xmm1 1173; AVX1-NEXT: vpblendw {{.*#+}} xmm1 = xmm1[0,1],xmm2[2,3],xmm1[4,5],xmm2[6,7] 1174; AVX1-NEXT: vpsrad $7, %xmm0, %xmm2 1175; AVX1-NEXT: vpsrlq $7, %xmm0, %xmm0 1176; AVX1-NEXT: vpblendw {{.*#+}} xmm0 = xmm0[0,1],xmm2[2,3],xmm0[4,5],xmm2[6,7] 1177; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0 1178; AVX1-NEXT: retq 1179; 1180; AVX2-LABEL: splatconstant_shift_v4i64: 1181; AVX2: # BB#0: 1182; AVX2-NEXT: vpsrad $7, %ymm0, %ymm1 1183; AVX2-NEXT: vpsrlq $7, %ymm0, %ymm0 1184; AVX2-NEXT: vpblendd {{.*#+}} ymm0 = ymm0[0],ymm1[1],ymm0[2],ymm1[3],ymm0[4],ymm1[5],ymm0[6],ymm1[7] 1185; AVX2-NEXT: retq 1186; 1187; XOPAVX1-LABEL: splatconstant_shift_v4i64: 1188; XOPAVX1: # BB#0: 1189; XOPAVX1-NEXT: vpxor %xmm1, %xmm1, %xmm1 1190; XOPAVX1-NEXT: vpsubq {{.*}}(%rip), %xmm1, %xmm1 1191; XOPAVX1-NEXT: vextractf128 $1, %ymm0, %xmm2 1192; XOPAVX1-NEXT: vpshaq %xmm1, %xmm2, %xmm2 1193; XOPAVX1-NEXT: vpshaq %xmm1, %xmm0, %xmm0 1194; XOPAVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0 1195; XOPAVX1-NEXT: retq 1196; 1197; XOPAVX2-LABEL: splatconstant_shift_v4i64: 1198; XOPAVX2: # BB#0: 1199; XOPAVX2-NEXT: vpsrlq $7, %ymm0, %ymm0 1200; XOPAVX2-NEXT: vpbroadcastq {{.*}}(%rip), %ymm1 1201; XOPAVX2-NEXT: vpxor %ymm1, %ymm0, %ymm0 1202; XOPAVX2-NEXT: vpsubq %ymm1, %ymm0, %ymm0 1203; XOPAVX2-NEXT: retq 1204; 1205; AVX512-LABEL: splatconstant_shift_v4i64: 1206; AVX512: # BB#0: 1207; AVX512-NEXT: vpsrad $7, %ymm0, %ymm1 1208; AVX512-NEXT: vpsrlq $7, %ymm0, %ymm0 1209; AVX512-NEXT: vpblendd {{.*#+}} ymm0 = ymm0[0],ymm1[1],ymm0[2],ymm1[3],ymm0[4],ymm1[5],ymm0[6],ymm1[7] 1210; AVX512-NEXT: retq 1211; 1212; AVX512VL-LABEL: splatconstant_shift_v4i64: 1213; AVX512VL: # BB#0: 1214; AVX512VL-NEXT: vpsraq $7, %ymm0, %ymm0 1215; AVX512VL-NEXT: retq 1216 %shift = ashr <4 x i64> %a, <i64 7, i64 7, i64 7, i64 7> 1217 ret <4 x i64> %shift 1218} 1219 1220define <8 x i32> @splatconstant_shift_v8i32(<8 x i32> %a) nounwind { 1221; AVX1-LABEL: splatconstant_shift_v8i32: 1222; AVX1: # BB#0: 1223; AVX1-NEXT: vpsrad $5, %xmm0, %xmm1 1224; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm0 1225; AVX1-NEXT: vpsrad $5, %xmm0, %xmm0 1226; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm0 1227; AVX1-NEXT: retq 1228; 1229; AVX2-LABEL: splatconstant_shift_v8i32: 1230; AVX2: # BB#0: 1231; AVX2-NEXT: vpsrad $5, %ymm0, %ymm0 1232; AVX2-NEXT: retq 1233; 1234; XOPAVX1-LABEL: splatconstant_shift_v8i32: 1235; XOPAVX1: # BB#0: 1236; XOPAVX1-NEXT: vpsrad $5, %xmm0, %xmm1 1237; XOPAVX1-NEXT: vextractf128 $1, %ymm0, %xmm0 1238; XOPAVX1-NEXT: vpsrad $5, %xmm0, %xmm0 1239; XOPAVX1-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm0 1240; XOPAVX1-NEXT: retq 1241; 1242; XOPAVX2-LABEL: splatconstant_shift_v8i32: 1243; XOPAVX2: # BB#0: 1244; XOPAVX2-NEXT: vpsrad $5, %ymm0, %ymm0 1245; XOPAVX2-NEXT: retq 1246; 1247; AVX512-LABEL: splatconstant_shift_v8i32: 1248; AVX512: # BB#0: 1249; AVX512-NEXT: vpsrad $5, %ymm0, %ymm0 1250; AVX512-NEXT: retq 1251; 1252; AVX512VL-LABEL: splatconstant_shift_v8i32: 1253; AVX512VL: # BB#0: 1254; AVX512VL-NEXT: vpsrad $5, %ymm0, %ymm0 1255; AVX512VL-NEXT: retq 1256 %shift = ashr <8 x i32> %a, <i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5> 1257 ret <8 x i32> %shift 1258} 1259 1260define <16 x i16> @splatconstant_shift_v16i16(<16 x i16> %a) nounwind { 1261; AVX1-LABEL: splatconstant_shift_v16i16: 1262; AVX1: # BB#0: 1263; AVX1-NEXT: vpsraw $3, %xmm0, %xmm1 1264; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm0 1265; AVX1-NEXT: vpsraw $3, %xmm0, %xmm0 1266; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm0 1267; AVX1-NEXT: retq 1268; 1269; AVX2-LABEL: splatconstant_shift_v16i16: 1270; AVX2: # BB#0: 1271; AVX2-NEXT: vpsraw $3, %ymm0, %ymm0 1272; AVX2-NEXT: retq 1273; 1274; XOPAVX1-LABEL: splatconstant_shift_v16i16: 1275; XOPAVX1: # BB#0: 1276; XOPAVX1-NEXT: vpsraw $3, %xmm0, %xmm1 1277; XOPAVX1-NEXT: vextractf128 $1, %ymm0, %xmm0 1278; XOPAVX1-NEXT: vpsraw $3, %xmm0, %xmm0 1279; XOPAVX1-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm0 1280; XOPAVX1-NEXT: retq 1281; 1282; XOPAVX2-LABEL: splatconstant_shift_v16i16: 1283; XOPAVX2: # BB#0: 1284; XOPAVX2-NEXT: vpsraw $3, %ymm0, %ymm0 1285; XOPAVX2-NEXT: retq 1286; 1287; AVX512-LABEL: splatconstant_shift_v16i16: 1288; AVX512: # BB#0: 1289; AVX512-NEXT: vpsraw $3, %ymm0, %ymm0 1290; AVX512-NEXT: retq 1291; 1292; AVX512VL-LABEL: splatconstant_shift_v16i16: 1293; AVX512VL: # BB#0: 1294; AVX512VL-NEXT: vpsraw $3, %ymm0, %ymm0 1295; AVX512VL-NEXT: retq 1296 %shift = ashr <16 x i16> %a, <i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3> 1297 ret <16 x i16> %shift 1298} 1299 1300define <32 x i8> @splatconstant_shift_v32i8(<32 x i8> %a) nounwind { 1301; AVX1-LABEL: splatconstant_shift_v32i8: 1302; AVX1: # BB#0: 1303; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1 1304; AVX1-NEXT: vpsrlw $3, %xmm1, %xmm1 1305; AVX1-NEXT: vmovdqa {{.*#+}} xmm2 = [31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31] 1306; AVX1-NEXT: vpand %xmm2, %xmm1, %xmm1 1307; AVX1-NEXT: vmovdqa {{.*#+}} xmm3 = [16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16] 1308; AVX1-NEXT: vpxor %xmm3, %xmm1, %xmm1 1309; AVX1-NEXT: vpsubb %xmm3, %xmm1, %xmm1 1310; AVX1-NEXT: vpsrlw $3, %xmm0, %xmm0 1311; AVX1-NEXT: vpand %xmm2, %xmm0, %xmm0 1312; AVX1-NEXT: vpxor %xmm3, %xmm0, %xmm0 1313; AVX1-NEXT: vpsubb %xmm3, %xmm0, %xmm0 1314; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0 1315; AVX1-NEXT: retq 1316; 1317; AVX2-LABEL: splatconstant_shift_v32i8: 1318; AVX2: # BB#0: 1319; AVX2-NEXT: vpsrlw $3, %ymm0, %ymm0 1320; AVX2-NEXT: vpand {{.*}}(%rip), %ymm0, %ymm0 1321; AVX2-NEXT: vmovdqa {{.*#+}} ymm1 = [16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16] 1322; AVX2-NEXT: vpxor %ymm1, %ymm0, %ymm0 1323; AVX2-NEXT: vpsubb %ymm1, %ymm0, %ymm0 1324; AVX2-NEXT: retq 1325; 1326; XOPAVX1-LABEL: splatconstant_shift_v32i8: 1327; XOPAVX1: # BB#0: 1328; XOPAVX1-NEXT: vpxor %xmm1, %xmm1, %xmm1 1329; XOPAVX1-NEXT: vpsubb {{.*}}(%rip), %xmm1, %xmm1 1330; XOPAVX1-NEXT: vextractf128 $1, %ymm0, %xmm2 1331; XOPAVX1-NEXT: vpshab %xmm1, %xmm2, %xmm2 1332; XOPAVX1-NEXT: vpshab %xmm1, %xmm0, %xmm0 1333; XOPAVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0 1334; XOPAVX1-NEXT: retq 1335; 1336; XOPAVX2-LABEL: splatconstant_shift_v32i8: 1337; XOPAVX2: # BB#0: 1338; XOPAVX2-NEXT: vpsrlw $3, %ymm0, %ymm0 1339; XOPAVX2-NEXT: vpand {{.*}}(%rip), %ymm0, %ymm0 1340; XOPAVX2-NEXT: vmovdqa {{.*#+}} ymm1 = [16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16] 1341; XOPAVX2-NEXT: vpxor %ymm1, %ymm0, %ymm0 1342; XOPAVX2-NEXT: vpsubb %ymm1, %ymm0, %ymm0 1343; XOPAVX2-NEXT: retq 1344; 1345; AVX512-LABEL: splatconstant_shift_v32i8: 1346; AVX512: # BB#0: 1347; AVX512-NEXT: vpsrlw $3, %ymm0, %ymm0 1348; AVX512-NEXT: vpand {{.*}}(%rip), %ymm0, %ymm0 1349; AVX512-NEXT: vmovdqa {{.*#+}} ymm1 = [16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16] 1350; AVX512-NEXT: vpxor %ymm1, %ymm0, %ymm0 1351; AVX512-NEXT: vpsubb %ymm1, %ymm0, %ymm0 1352; AVX512-NEXT: retq 1353; 1354; AVX512VL-LABEL: splatconstant_shift_v32i8: 1355; AVX512VL: # BB#0: 1356; AVX512VL-NEXT: vpsrlw $3, %ymm0, %ymm0 1357; AVX512VL-NEXT: vpand {{.*}}(%rip), %ymm0, %ymm0 1358; AVX512VL-NEXT: vmovdqa {{.*#+}} ymm1 = [16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16] 1359; AVX512VL-NEXT: vpxor %ymm1, %ymm0, %ymm0 1360; AVX512VL-NEXT: vpsubb %ymm1, %ymm0, %ymm0 1361; AVX512VL-NEXT: retq 1362 %shift = ashr <32 x i8> %a, <i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3> 1363 ret <32 x i8> %shift 1364} 1365