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