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 -mattr=+avx512dq | FileCheck %s --check-prefix=ALL --check-prefix=AVX512 --check-prefix=AVX512DQ 7; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512bw | FileCheck %s --check-prefix=ALL --check-prefix=AVX512 --check-prefix=AVX512BW 8; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512dq,+avx512vl | FileCheck %s --check-prefix=ALL --check-prefix=AVX512VL --check-prefix=AVX512DQVL 9; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512bw,+avx512vl | FileCheck %s --check-prefix=ALL --check-prefix=AVX512VL --check-prefix=AVX512BWVL 10; 11; 32-bit runs to make sure we do reasonable things for i64 shifts. 12; RUN: llc < %s -mtriple=i686-unknown-unknown -mattr=+avx | FileCheck %s --check-prefix=ALL --check-prefix=X32-AVX --check-prefix=X32-AVX1 13; RUN: llc < %s -mtriple=i686-unknown-unknown -mattr=+avx2 | FileCheck %s --check-prefix=ALL --check-prefix=X32-AVX --check-prefix=X32-AVX2 14 15; 16; Variable Shifts 17; 18 19define <4 x i64> @var_shift_v4i64(<4 x i64> %a, <4 x i64> %b) nounwind { 20; AVX1-LABEL: var_shift_v4i64: 21; AVX1: # %bb.0: 22; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2 23; AVX1-NEXT: vmovdqa {{.*#+}} xmm3 = [9223372036854775808,9223372036854775808] 24; AVX1-NEXT: vpsrlq %xmm2, %xmm3, %xmm4 25; AVX1-NEXT: vpshufd {{.*#+}} xmm5 = xmm2[2,3,0,1] 26; AVX1-NEXT: vpsrlq %xmm5, %xmm3, %xmm6 27; AVX1-NEXT: vpblendw {{.*#+}} xmm4 = xmm4[0,1,2,3],xmm6[4,5,6,7] 28; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm6 29; AVX1-NEXT: vpsrlq %xmm2, %xmm6, %xmm2 30; AVX1-NEXT: vpsrlq %xmm5, %xmm6, %xmm5 31; AVX1-NEXT: vpblendw {{.*#+}} xmm2 = xmm2[0,1,2,3],xmm5[4,5,6,7] 32; AVX1-NEXT: vpxor %xmm4, %xmm2, %xmm2 33; AVX1-NEXT: vpsubq %xmm4, %xmm2, %xmm2 34; AVX1-NEXT: vpsrlq %xmm1, %xmm3, %xmm4 35; AVX1-NEXT: vpshufd {{.*#+}} xmm5 = xmm1[2,3,0,1] 36; AVX1-NEXT: vpsrlq %xmm5, %xmm3, %xmm3 37; AVX1-NEXT: vpblendw {{.*#+}} xmm3 = xmm4[0,1,2,3],xmm3[4,5,6,7] 38; AVX1-NEXT: vpsrlq %xmm1, %xmm0, %xmm1 39; AVX1-NEXT: vpsrlq %xmm5, %xmm0, %xmm0 40; AVX1-NEXT: vpblendw {{.*#+}} xmm0 = xmm1[0,1,2,3],xmm0[4,5,6,7] 41; AVX1-NEXT: vpxor %xmm3, %xmm0, %xmm0 42; AVX1-NEXT: vpsubq %xmm3, %xmm0, %xmm0 43; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0 44; AVX1-NEXT: retq 45; 46; AVX2-LABEL: var_shift_v4i64: 47; AVX2: # %bb.0: 48; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm2 = [9223372036854775808,9223372036854775808,9223372036854775808,9223372036854775808] 49; AVX2-NEXT: vpsrlvq %ymm1, %ymm2, %ymm3 50; AVX2-NEXT: vpxor %ymm2, %ymm0, %ymm0 51; AVX2-NEXT: vpsrlvq %ymm1, %ymm0, %ymm0 52; AVX2-NEXT: vpsubq %ymm3, %ymm0, %ymm0 53; AVX2-NEXT: retq 54; 55; XOPAVX1-LABEL: var_shift_v4i64: 56; XOPAVX1: # %bb.0: 57; XOPAVX1-NEXT: vextractf128 $1, %ymm1, %xmm2 58; XOPAVX1-NEXT: vpxor %xmm3, %xmm3, %xmm3 59; XOPAVX1-NEXT: vpsubq %xmm2, %xmm3, %xmm2 60; XOPAVX1-NEXT: vextractf128 $1, %ymm0, %xmm4 61; XOPAVX1-NEXT: vpshaq %xmm2, %xmm4, %xmm2 62; XOPAVX1-NEXT: vpsubq %xmm1, %xmm3, %xmm1 63; XOPAVX1-NEXT: vpshaq %xmm1, %xmm0, %xmm0 64; XOPAVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0 65; XOPAVX1-NEXT: retq 66; 67; XOPAVX2-LABEL: var_shift_v4i64: 68; XOPAVX2: # %bb.0: 69; XOPAVX2-NEXT: vpbroadcastq {{.*#+}} ymm2 = [9223372036854775808,9223372036854775808,9223372036854775808,9223372036854775808] 70; XOPAVX2-NEXT: vpsrlvq %ymm1, %ymm2, %ymm3 71; XOPAVX2-NEXT: vpxor %ymm2, %ymm0, %ymm0 72; XOPAVX2-NEXT: vpsrlvq %ymm1, %ymm0, %ymm0 73; XOPAVX2-NEXT: vpsubq %ymm3, %ymm0, %ymm0 74; XOPAVX2-NEXT: retq 75; 76; AVX512-LABEL: var_shift_v4i64: 77; AVX512: # %bb.0: 78; AVX512-NEXT: # kill: def $ymm1 killed $ymm1 def $zmm1 79; AVX512-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm0 80; AVX512-NEXT: vpsravq %zmm1, %zmm0, %zmm0 81; AVX512-NEXT: # kill: def $ymm0 killed $ymm0 killed $zmm0 82; AVX512-NEXT: retq 83; 84; AVX512VL-LABEL: var_shift_v4i64: 85; AVX512VL: # %bb.0: 86; AVX512VL-NEXT: vpsravq %ymm1, %ymm0, %ymm0 87; AVX512VL-NEXT: retq 88; 89; X32-AVX1-LABEL: var_shift_v4i64: 90; X32-AVX1: # %bb.0: 91; X32-AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2 92; X32-AVX1-NEXT: vmovdqa {{.*#+}} xmm3 = [0,2147483648,0,2147483648] 93; X32-AVX1-NEXT: vpsrlq %xmm2, %xmm3, %xmm4 94; X32-AVX1-NEXT: vpshufd {{.*#+}} xmm5 = xmm2[2,3,0,1] 95; X32-AVX1-NEXT: vpsrlq %xmm5, %xmm3, %xmm6 96; X32-AVX1-NEXT: vpblendw {{.*#+}} xmm4 = xmm4[0,1,2,3],xmm6[4,5,6,7] 97; X32-AVX1-NEXT: vextractf128 $1, %ymm0, %xmm6 98; X32-AVX1-NEXT: vpsrlq %xmm2, %xmm6, %xmm2 99; X32-AVX1-NEXT: vpsrlq %xmm5, %xmm6, %xmm5 100; X32-AVX1-NEXT: vpblendw {{.*#+}} xmm2 = xmm2[0,1,2,3],xmm5[4,5,6,7] 101; X32-AVX1-NEXT: vpxor %xmm4, %xmm2, %xmm2 102; X32-AVX1-NEXT: vpsubq %xmm4, %xmm2, %xmm2 103; X32-AVX1-NEXT: vpsrlq %xmm1, %xmm3, %xmm4 104; X32-AVX1-NEXT: vpshufd {{.*#+}} xmm5 = xmm1[2,3,0,1] 105; X32-AVX1-NEXT: vpsrlq %xmm5, %xmm3, %xmm3 106; X32-AVX1-NEXT: vpblendw {{.*#+}} xmm3 = xmm4[0,1,2,3],xmm3[4,5,6,7] 107; X32-AVX1-NEXT: vpsrlq %xmm1, %xmm0, %xmm1 108; X32-AVX1-NEXT: vpsrlq %xmm5, %xmm0, %xmm0 109; X32-AVX1-NEXT: vpblendw {{.*#+}} xmm0 = xmm1[0,1,2,3],xmm0[4,5,6,7] 110; X32-AVX1-NEXT: vpxor %xmm3, %xmm0, %xmm0 111; X32-AVX1-NEXT: vpsubq %xmm3, %xmm0, %xmm0 112; X32-AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0 113; X32-AVX1-NEXT: retl 114; 115; X32-AVX2-LABEL: var_shift_v4i64: 116; X32-AVX2: # %bb.0: 117; X32-AVX2-NEXT: vmovdqa {{.*#+}} ymm2 = [0,2147483648,0,2147483648,0,2147483648,0,2147483648] 118; X32-AVX2-NEXT: vpsrlvq %ymm1, %ymm2, %ymm3 119; X32-AVX2-NEXT: vpxor %ymm2, %ymm0, %ymm0 120; X32-AVX2-NEXT: vpsrlvq %ymm1, %ymm0, %ymm0 121; X32-AVX2-NEXT: vpsubq %ymm3, %ymm0, %ymm0 122; X32-AVX2-NEXT: retl 123 %shift = ashr <4 x i64> %a, %b 124 ret <4 x i64> %shift 125} 126 127define <8 x i32> @var_shift_v8i32(<8 x i32> %a, <8 x i32> %b) nounwind { 128; AVX1-LABEL: var_shift_v8i32: 129; AVX1: # %bb.0: 130; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2 131; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm3 132; AVX1-NEXT: vpsrldq {{.*#+}} xmm4 = xmm3[12,13,14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero 133; AVX1-NEXT: vpsrad %xmm4, %xmm2, %xmm4 134; AVX1-NEXT: vpsrlq $32, %xmm3, %xmm5 135; AVX1-NEXT: vpsrad %xmm5, %xmm2, %xmm5 136; AVX1-NEXT: vpblendw {{.*#+}} xmm4 = xmm5[0,1,2,3],xmm4[4,5,6,7] 137; AVX1-NEXT: vpxor %xmm5, %xmm5, %xmm5 138; AVX1-NEXT: vpunpckhdq {{.*#+}} xmm6 = xmm3[2],xmm5[2],xmm3[3],xmm5[3] 139; AVX1-NEXT: vpsrad %xmm6, %xmm2, %xmm6 140; AVX1-NEXT: vpmovzxdq {{.*#+}} xmm3 = xmm3[0],zero,xmm3[1],zero 141; AVX1-NEXT: vpsrad %xmm3, %xmm2, %xmm2 142; AVX1-NEXT: vpblendw {{.*#+}} xmm2 = xmm2[0,1,2,3],xmm6[4,5,6,7] 143; AVX1-NEXT: vpblendw {{.*#+}} xmm2 = xmm2[0,1],xmm4[2,3],xmm2[4,5],xmm4[6,7] 144; AVX1-NEXT: vpsrldq {{.*#+}} xmm3 = xmm1[12,13,14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero 145; AVX1-NEXT: vpsrad %xmm3, %xmm0, %xmm3 146; AVX1-NEXT: vpsrlq $32, %xmm1, %xmm4 147; AVX1-NEXT: vpsrad %xmm4, %xmm0, %xmm4 148; AVX1-NEXT: vpblendw {{.*#+}} xmm3 = xmm4[0,1,2,3],xmm3[4,5,6,7] 149; AVX1-NEXT: vpunpckhdq {{.*#+}} xmm4 = xmm1[2],xmm5[2],xmm1[3],xmm5[3] 150; AVX1-NEXT: vpsrad %xmm4, %xmm0, %xmm4 151; AVX1-NEXT: vpmovzxdq {{.*#+}} xmm1 = xmm1[0],zero,xmm1[1],zero 152; AVX1-NEXT: vpsrad %xmm1, %xmm0, %xmm0 153; AVX1-NEXT: vpblendw {{.*#+}} xmm0 = xmm0[0,1,2,3],xmm4[4,5,6,7] 154; AVX1-NEXT: vpblendw {{.*#+}} xmm0 = xmm0[0,1],xmm3[2,3],xmm0[4,5],xmm3[6,7] 155; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0 156; AVX1-NEXT: retq 157; 158; AVX2-LABEL: var_shift_v8i32: 159; AVX2: # %bb.0: 160; AVX2-NEXT: vpsravd %ymm1, %ymm0, %ymm0 161; AVX2-NEXT: retq 162; 163; XOPAVX1-LABEL: var_shift_v8i32: 164; XOPAVX1: # %bb.0: 165; XOPAVX1-NEXT: vextractf128 $1, %ymm1, %xmm2 166; XOPAVX1-NEXT: vpxor %xmm3, %xmm3, %xmm3 167; XOPAVX1-NEXT: vpsubd %xmm2, %xmm3, %xmm2 168; XOPAVX1-NEXT: vextractf128 $1, %ymm0, %xmm4 169; XOPAVX1-NEXT: vpshad %xmm2, %xmm4, %xmm2 170; XOPAVX1-NEXT: vpsubd %xmm1, %xmm3, %xmm1 171; XOPAVX1-NEXT: vpshad %xmm1, %xmm0, %xmm0 172; XOPAVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0 173; XOPAVX1-NEXT: retq 174; 175; XOPAVX2-LABEL: var_shift_v8i32: 176; XOPAVX2: # %bb.0: 177; XOPAVX2-NEXT: vpsravd %ymm1, %ymm0, %ymm0 178; XOPAVX2-NEXT: retq 179; 180; AVX512-LABEL: var_shift_v8i32: 181; AVX512: # %bb.0: 182; AVX512-NEXT: vpsravd %ymm1, %ymm0, %ymm0 183; AVX512-NEXT: retq 184; 185; AVX512VL-LABEL: var_shift_v8i32: 186; AVX512VL: # %bb.0: 187; AVX512VL-NEXT: vpsravd %ymm1, %ymm0, %ymm0 188; AVX512VL-NEXT: retq 189; 190; X32-AVX1-LABEL: var_shift_v8i32: 191; X32-AVX1: # %bb.0: 192; X32-AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2 193; X32-AVX1-NEXT: vextractf128 $1, %ymm1, %xmm3 194; X32-AVX1-NEXT: vpsrldq {{.*#+}} xmm4 = xmm3[12,13,14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero 195; X32-AVX1-NEXT: vpsrad %xmm4, %xmm2, %xmm4 196; X32-AVX1-NEXT: vpsrlq $32, %xmm3, %xmm5 197; X32-AVX1-NEXT: vpsrad %xmm5, %xmm2, %xmm5 198; X32-AVX1-NEXT: vpblendw {{.*#+}} xmm4 = xmm5[0,1,2,3],xmm4[4,5,6,7] 199; X32-AVX1-NEXT: vpxor %xmm5, %xmm5, %xmm5 200; X32-AVX1-NEXT: vpunpckhdq {{.*#+}} xmm6 = xmm3[2],xmm5[2],xmm3[3],xmm5[3] 201; X32-AVX1-NEXT: vpsrad %xmm6, %xmm2, %xmm6 202; X32-AVX1-NEXT: vpmovzxdq {{.*#+}} xmm3 = xmm3[0],zero,xmm3[1],zero 203; X32-AVX1-NEXT: vpsrad %xmm3, %xmm2, %xmm2 204; X32-AVX1-NEXT: vpblendw {{.*#+}} xmm2 = xmm2[0,1,2,3],xmm6[4,5,6,7] 205; X32-AVX1-NEXT: vpblendw {{.*#+}} xmm2 = xmm2[0,1],xmm4[2,3],xmm2[4,5],xmm4[6,7] 206; X32-AVX1-NEXT: vpsrldq {{.*#+}} xmm3 = xmm1[12,13,14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero 207; X32-AVX1-NEXT: vpsrad %xmm3, %xmm0, %xmm3 208; X32-AVX1-NEXT: vpsrlq $32, %xmm1, %xmm4 209; X32-AVX1-NEXT: vpsrad %xmm4, %xmm0, %xmm4 210; X32-AVX1-NEXT: vpblendw {{.*#+}} xmm3 = xmm4[0,1,2,3],xmm3[4,5,6,7] 211; X32-AVX1-NEXT: vpunpckhdq {{.*#+}} xmm4 = xmm1[2],xmm5[2],xmm1[3],xmm5[3] 212; X32-AVX1-NEXT: vpsrad %xmm4, %xmm0, %xmm4 213; X32-AVX1-NEXT: vpmovzxdq {{.*#+}} xmm1 = xmm1[0],zero,xmm1[1],zero 214; X32-AVX1-NEXT: vpsrad %xmm1, %xmm0, %xmm0 215; X32-AVX1-NEXT: vpblendw {{.*#+}} xmm0 = xmm0[0,1,2,3],xmm4[4,5,6,7] 216; X32-AVX1-NEXT: vpblendw {{.*#+}} xmm0 = xmm0[0,1],xmm3[2,3],xmm0[4,5],xmm3[6,7] 217; X32-AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0 218; X32-AVX1-NEXT: retl 219; 220; X32-AVX2-LABEL: var_shift_v8i32: 221; X32-AVX2: # %bb.0: 222; X32-AVX2-NEXT: vpsravd %ymm1, %ymm0, %ymm0 223; X32-AVX2-NEXT: retl 224 %shift = ashr <8 x i32> %a, %b 225 ret <8 x i32> %shift 226} 227 228define <16 x i16> @var_shift_v16i16(<16 x i16> %a, <16 x i16> %b) nounwind { 229; AVX1-LABEL: var_shift_v16i16: 230; AVX1: # %bb.0: 231; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2 232; AVX1-NEXT: vpsllw $12, %xmm2, %xmm3 233; AVX1-NEXT: vpsllw $4, %xmm2, %xmm2 234; AVX1-NEXT: vpor %xmm3, %xmm2, %xmm2 235; AVX1-NEXT: vpaddw %xmm2, %xmm2, %xmm3 236; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm4 237; AVX1-NEXT: vpsraw $8, %xmm4, %xmm5 238; AVX1-NEXT: vpblendvb %xmm2, %xmm5, %xmm4, %xmm2 239; AVX1-NEXT: vpsraw $4, %xmm2, %xmm4 240; AVX1-NEXT: vpblendvb %xmm3, %xmm4, %xmm2, %xmm2 241; AVX1-NEXT: vpsraw $2, %xmm2, %xmm4 242; AVX1-NEXT: vpaddw %xmm3, %xmm3, %xmm3 243; AVX1-NEXT: vpblendvb %xmm3, %xmm4, %xmm2, %xmm2 244; AVX1-NEXT: vpsraw $1, %xmm2, %xmm4 245; AVX1-NEXT: vpaddw %xmm3, %xmm3, %xmm3 246; AVX1-NEXT: vpblendvb %xmm3, %xmm4, %xmm2, %xmm2 247; AVX1-NEXT: vpsllw $12, %xmm1, %xmm3 248; AVX1-NEXT: vpsllw $4, %xmm1, %xmm1 249; AVX1-NEXT: vpor %xmm3, %xmm1, %xmm1 250; AVX1-NEXT: vpaddw %xmm1, %xmm1, %xmm3 251; AVX1-NEXT: vpsraw $8, %xmm0, %xmm4 252; AVX1-NEXT: vpblendvb %xmm1, %xmm4, %xmm0, %xmm0 253; AVX1-NEXT: vpsraw $4, %xmm0, %xmm1 254; AVX1-NEXT: vpblendvb %xmm3, %xmm1, %xmm0, %xmm0 255; AVX1-NEXT: vpsraw $2, %xmm0, %xmm1 256; AVX1-NEXT: vpaddw %xmm3, %xmm3, %xmm3 257; AVX1-NEXT: vpblendvb %xmm3, %xmm1, %xmm0, %xmm0 258; AVX1-NEXT: vpsraw $1, %xmm0, %xmm1 259; AVX1-NEXT: vpaddw %xmm3, %xmm3, %xmm3 260; AVX1-NEXT: vpblendvb %xmm3, %xmm1, %xmm0, %xmm0 261; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0 262; AVX1-NEXT: retq 263; 264; AVX2-LABEL: var_shift_v16i16: 265; AVX2: # %bb.0: 266; AVX2-NEXT: vpxor %xmm2, %xmm2, %xmm2 267; 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] 268; 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] 269; AVX2-NEXT: vpsravd %ymm3, %ymm4, %ymm3 270; AVX2-NEXT: vpsrld $16, %ymm3, %ymm3 271; 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] 272; 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] 273; AVX2-NEXT: vpsravd %ymm1, %ymm0, %ymm0 274; AVX2-NEXT: vpsrld $16, %ymm0, %ymm0 275; AVX2-NEXT: vpackusdw %ymm3, %ymm0, %ymm0 276; AVX2-NEXT: retq 277; 278; XOPAVX1-LABEL: var_shift_v16i16: 279; XOPAVX1: # %bb.0: 280; XOPAVX1-NEXT: vextractf128 $1, %ymm1, %xmm2 281; XOPAVX1-NEXT: vpxor %xmm3, %xmm3, %xmm3 282; XOPAVX1-NEXT: vpsubw %xmm2, %xmm3, %xmm2 283; XOPAVX1-NEXT: vextractf128 $1, %ymm0, %xmm4 284; XOPAVX1-NEXT: vpshaw %xmm2, %xmm4, %xmm2 285; XOPAVX1-NEXT: vpsubw %xmm1, %xmm3, %xmm1 286; XOPAVX1-NEXT: vpshaw %xmm1, %xmm0, %xmm0 287; XOPAVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0 288; XOPAVX1-NEXT: retq 289; 290; XOPAVX2-LABEL: var_shift_v16i16: 291; XOPAVX2: # %bb.0: 292; XOPAVX2-NEXT: vextracti128 $1, %ymm1, %xmm2 293; XOPAVX2-NEXT: vpxor %xmm3, %xmm3, %xmm3 294; XOPAVX2-NEXT: vpsubw %xmm2, %xmm3, %xmm2 295; XOPAVX2-NEXT: vextracti128 $1, %ymm0, %xmm4 296; XOPAVX2-NEXT: vpshaw %xmm2, %xmm4, %xmm2 297; XOPAVX2-NEXT: vpsubw %xmm1, %xmm3, %xmm1 298; XOPAVX2-NEXT: vpshaw %xmm1, %xmm0, %xmm0 299; XOPAVX2-NEXT: vinserti128 $1, %xmm2, %ymm0, %ymm0 300; XOPAVX2-NEXT: retq 301; 302; AVX512DQ-LABEL: var_shift_v16i16: 303; AVX512DQ: # %bb.0: 304; 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 305; AVX512DQ-NEXT: vpmovsxwd %ymm0, %zmm0 306; AVX512DQ-NEXT: vpsravd %zmm1, %zmm0, %zmm0 307; AVX512DQ-NEXT: vpmovdw %zmm0, %ymm0 308; AVX512DQ-NEXT: retq 309; 310; AVX512BW-LABEL: var_shift_v16i16: 311; AVX512BW: # %bb.0: 312; AVX512BW-NEXT: # kill: def $ymm1 killed $ymm1 def $zmm1 313; AVX512BW-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm0 314; AVX512BW-NEXT: vpsravw %zmm1, %zmm0, %zmm0 315; AVX512BW-NEXT: # kill: def $ymm0 killed $ymm0 killed $zmm0 316; AVX512BW-NEXT: retq 317; 318; AVX512DQVL-LABEL: var_shift_v16i16: 319; AVX512DQVL: # %bb.0: 320; 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 321; AVX512DQVL-NEXT: vpmovsxwd %ymm0, %zmm0 322; AVX512DQVL-NEXT: vpsravd %zmm1, %zmm0, %zmm0 323; AVX512DQVL-NEXT: vpmovdw %zmm0, %ymm0 324; AVX512DQVL-NEXT: retq 325; 326; AVX512BWVL-LABEL: var_shift_v16i16: 327; AVX512BWVL: # %bb.0: 328; AVX512BWVL-NEXT: vpsravw %ymm1, %ymm0, %ymm0 329; AVX512BWVL-NEXT: retq 330; 331; X32-AVX1-LABEL: var_shift_v16i16: 332; X32-AVX1: # %bb.0: 333; X32-AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2 334; X32-AVX1-NEXT: vpsllw $12, %xmm2, %xmm3 335; X32-AVX1-NEXT: vpsllw $4, %xmm2, %xmm2 336; X32-AVX1-NEXT: vpor %xmm3, %xmm2, %xmm2 337; X32-AVX1-NEXT: vpaddw %xmm2, %xmm2, %xmm3 338; X32-AVX1-NEXT: vextractf128 $1, %ymm0, %xmm4 339; X32-AVX1-NEXT: vpsraw $8, %xmm4, %xmm5 340; X32-AVX1-NEXT: vpblendvb %xmm2, %xmm5, %xmm4, %xmm2 341; X32-AVX1-NEXT: vpsraw $4, %xmm2, %xmm4 342; X32-AVX1-NEXT: vpblendvb %xmm3, %xmm4, %xmm2, %xmm2 343; X32-AVX1-NEXT: vpsraw $2, %xmm2, %xmm4 344; X32-AVX1-NEXT: vpaddw %xmm3, %xmm3, %xmm3 345; X32-AVX1-NEXT: vpblendvb %xmm3, %xmm4, %xmm2, %xmm2 346; X32-AVX1-NEXT: vpsraw $1, %xmm2, %xmm4 347; X32-AVX1-NEXT: vpaddw %xmm3, %xmm3, %xmm3 348; X32-AVX1-NEXT: vpblendvb %xmm3, %xmm4, %xmm2, %xmm2 349; X32-AVX1-NEXT: vpsllw $12, %xmm1, %xmm3 350; X32-AVX1-NEXT: vpsllw $4, %xmm1, %xmm1 351; X32-AVX1-NEXT: vpor %xmm3, %xmm1, %xmm1 352; X32-AVX1-NEXT: vpaddw %xmm1, %xmm1, %xmm3 353; X32-AVX1-NEXT: vpsraw $8, %xmm0, %xmm4 354; X32-AVX1-NEXT: vpblendvb %xmm1, %xmm4, %xmm0, %xmm0 355; X32-AVX1-NEXT: vpsraw $4, %xmm0, %xmm1 356; X32-AVX1-NEXT: vpblendvb %xmm3, %xmm1, %xmm0, %xmm0 357; X32-AVX1-NEXT: vpsraw $2, %xmm0, %xmm1 358; X32-AVX1-NEXT: vpaddw %xmm3, %xmm3, %xmm3 359; X32-AVX1-NEXT: vpblendvb %xmm3, %xmm1, %xmm0, %xmm0 360; X32-AVX1-NEXT: vpsraw $1, %xmm0, %xmm1 361; X32-AVX1-NEXT: vpaddw %xmm3, %xmm3, %xmm3 362; X32-AVX1-NEXT: vpblendvb %xmm3, %xmm1, %xmm0, %xmm0 363; X32-AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0 364; X32-AVX1-NEXT: retl 365; 366; X32-AVX2-LABEL: var_shift_v16i16: 367; X32-AVX2: # %bb.0: 368; X32-AVX2-NEXT: vpxor %xmm2, %xmm2, %xmm2 369; X32-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] 370; X32-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] 371; X32-AVX2-NEXT: vpsravd %ymm3, %ymm4, %ymm3 372; X32-AVX2-NEXT: vpsrld $16, %ymm3, %ymm3 373; X32-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] 374; X32-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] 375; X32-AVX2-NEXT: vpsravd %ymm1, %ymm0, %ymm0 376; X32-AVX2-NEXT: vpsrld $16, %ymm0, %ymm0 377; X32-AVX2-NEXT: vpackusdw %ymm3, %ymm0, %ymm0 378; X32-AVX2-NEXT: retl 379 %shift = ashr <16 x i16> %a, %b 380 ret <16 x i16> %shift 381} 382 383define <32 x i8> @var_shift_v32i8(<32 x i8> %a, <32 x i8> %b) nounwind { 384; AVX1-LABEL: var_shift_v32i8: 385; AVX1: # %bb.0: 386; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2 387; AVX1-NEXT: vpsllw $5, %xmm2, %xmm2 388; 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] 389; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm4 390; 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] 391; AVX1-NEXT: vpsraw $4, %xmm5, %xmm6 392; AVX1-NEXT: vpblendvb %xmm3, %xmm6, %xmm5, %xmm5 393; AVX1-NEXT: vpsraw $2, %xmm5, %xmm6 394; AVX1-NEXT: vpaddw %xmm3, %xmm3, %xmm3 395; AVX1-NEXT: vpblendvb %xmm3, %xmm6, %xmm5, %xmm5 396; AVX1-NEXT: vpsraw $1, %xmm5, %xmm6 397; AVX1-NEXT: vpaddw %xmm3, %xmm3, %xmm3 398; AVX1-NEXT: vpblendvb %xmm3, %xmm6, %xmm5, %xmm3 399; AVX1-NEXT: vpsrlw $8, %xmm3, %xmm3 400; 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] 401; 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] 402; AVX1-NEXT: vpsraw $4, %xmm4, %xmm5 403; AVX1-NEXT: vpblendvb %xmm2, %xmm5, %xmm4, %xmm4 404; AVX1-NEXT: vpsraw $2, %xmm4, %xmm5 405; AVX1-NEXT: vpaddw %xmm2, %xmm2, %xmm2 406; AVX1-NEXT: vpblendvb %xmm2, %xmm5, %xmm4, %xmm4 407; AVX1-NEXT: vpsraw $1, %xmm4, %xmm5 408; AVX1-NEXT: vpaddw %xmm2, %xmm2, %xmm2 409; AVX1-NEXT: vpblendvb %xmm2, %xmm5, %xmm4, %xmm2 410; AVX1-NEXT: vpsrlw $8, %xmm2, %xmm2 411; AVX1-NEXT: vpackuswb %xmm3, %xmm2, %xmm2 412; AVX1-NEXT: vpsllw $5, %xmm1, %xmm1 413; 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] 414; AVX1-NEXT: vpunpckhbw {{.*#+}} xmm4 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15] 415; AVX1-NEXT: vpsraw $4, %xmm4, %xmm5 416; AVX1-NEXT: vpblendvb %xmm3, %xmm5, %xmm4, %xmm4 417; AVX1-NEXT: vpsraw $2, %xmm4, %xmm5 418; AVX1-NEXT: vpaddw %xmm3, %xmm3, %xmm3 419; AVX1-NEXT: vpblendvb %xmm3, %xmm5, %xmm4, %xmm4 420; AVX1-NEXT: vpsraw $1, %xmm4, %xmm5 421; AVX1-NEXT: vpaddw %xmm3, %xmm3, %xmm3 422; AVX1-NEXT: vpblendvb %xmm3, %xmm5, %xmm4, %xmm3 423; AVX1-NEXT: vpsrlw $8, %xmm3, %xmm3 424; 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] 425; AVX1-NEXT: vpunpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7] 426; AVX1-NEXT: vpsraw $4, %xmm0, %xmm4 427; AVX1-NEXT: vpblendvb %xmm1, %xmm4, %xmm0, %xmm0 428; AVX1-NEXT: vpsraw $2, %xmm0, %xmm4 429; AVX1-NEXT: vpaddw %xmm1, %xmm1, %xmm1 430; AVX1-NEXT: vpblendvb %xmm1, %xmm4, %xmm0, %xmm0 431; AVX1-NEXT: vpsraw $1, %xmm0, %xmm4 432; AVX1-NEXT: vpaddw %xmm1, %xmm1, %xmm1 433; AVX1-NEXT: vpblendvb %xmm1, %xmm4, %xmm0, %xmm0 434; AVX1-NEXT: vpsrlw $8, %xmm0, %xmm0 435; AVX1-NEXT: vpackuswb %xmm3, %xmm0, %xmm0 436; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0 437; AVX1-NEXT: retq 438; 439; AVX2-LABEL: var_shift_v32i8: 440; AVX2: # %bb.0: 441; AVX2-NEXT: vpsllw $5, %ymm1, %ymm1 442; 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] 443; 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] 444; AVX2-NEXT: vpsraw $4, %ymm3, %ymm4 445; AVX2-NEXT: vpblendvb %ymm2, %ymm4, %ymm3, %ymm3 446; AVX2-NEXT: vpsraw $2, %ymm3, %ymm4 447; AVX2-NEXT: vpaddw %ymm2, %ymm2, %ymm2 448; AVX2-NEXT: vpblendvb %ymm2, %ymm4, %ymm3, %ymm3 449; AVX2-NEXT: vpsraw $1, %ymm3, %ymm4 450; AVX2-NEXT: vpaddw %ymm2, %ymm2, %ymm2 451; AVX2-NEXT: vpblendvb %ymm2, %ymm4, %ymm3, %ymm2 452; AVX2-NEXT: vpsrlw $8, %ymm2, %ymm2 453; 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] 454; 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] 455; AVX2-NEXT: vpsraw $4, %ymm0, %ymm3 456; AVX2-NEXT: vpblendvb %ymm1, %ymm3, %ymm0, %ymm0 457; AVX2-NEXT: vpsraw $2, %ymm0, %ymm3 458; AVX2-NEXT: vpaddw %ymm1, %ymm1, %ymm1 459; AVX2-NEXT: vpblendvb %ymm1, %ymm3, %ymm0, %ymm0 460; AVX2-NEXT: vpsraw $1, %ymm0, %ymm3 461; AVX2-NEXT: vpaddw %ymm1, %ymm1, %ymm1 462; AVX2-NEXT: vpblendvb %ymm1, %ymm3, %ymm0, %ymm0 463; AVX2-NEXT: vpsrlw $8, %ymm0, %ymm0 464; AVX2-NEXT: vpackuswb %ymm2, %ymm0, %ymm0 465; AVX2-NEXT: retq 466; 467; XOPAVX1-LABEL: var_shift_v32i8: 468; XOPAVX1: # %bb.0: 469; XOPAVX1-NEXT: vextractf128 $1, %ymm1, %xmm2 470; XOPAVX1-NEXT: vpxor %xmm3, %xmm3, %xmm3 471; XOPAVX1-NEXT: vpsubb %xmm2, %xmm3, %xmm2 472; XOPAVX1-NEXT: vextractf128 $1, %ymm0, %xmm4 473; XOPAVX1-NEXT: vpshab %xmm2, %xmm4, %xmm2 474; XOPAVX1-NEXT: vpsubb %xmm1, %xmm3, %xmm1 475; XOPAVX1-NEXT: vpshab %xmm1, %xmm0, %xmm0 476; XOPAVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0 477; XOPAVX1-NEXT: retq 478; 479; XOPAVX2-LABEL: var_shift_v32i8: 480; XOPAVX2: # %bb.0: 481; XOPAVX2-NEXT: vextracti128 $1, %ymm1, %xmm2 482; XOPAVX2-NEXT: vpxor %xmm3, %xmm3, %xmm3 483; XOPAVX2-NEXT: vpsubb %xmm2, %xmm3, %xmm2 484; XOPAVX2-NEXT: vextracti128 $1, %ymm0, %xmm4 485; XOPAVX2-NEXT: vpshab %xmm2, %xmm4, %xmm2 486; XOPAVX2-NEXT: vpsubb %xmm1, %xmm3, %xmm1 487; XOPAVX2-NEXT: vpshab %xmm1, %xmm0, %xmm0 488; XOPAVX2-NEXT: vinserti128 $1, %xmm2, %ymm0, %ymm0 489; XOPAVX2-NEXT: retq 490; 491; AVX512DQ-LABEL: var_shift_v32i8: 492; AVX512DQ: # %bb.0: 493; AVX512DQ-NEXT: vpsllw $5, %ymm1, %ymm1 494; 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] 495; 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] 496; AVX512DQ-NEXT: vpsraw $4, %ymm3, %ymm4 497; AVX512DQ-NEXT: vpblendvb %ymm2, %ymm4, %ymm3, %ymm3 498; AVX512DQ-NEXT: vpsraw $2, %ymm3, %ymm4 499; AVX512DQ-NEXT: vpaddw %ymm2, %ymm2, %ymm2 500; AVX512DQ-NEXT: vpblendvb %ymm2, %ymm4, %ymm3, %ymm3 501; AVX512DQ-NEXT: vpsraw $1, %ymm3, %ymm4 502; AVX512DQ-NEXT: vpaddw %ymm2, %ymm2, %ymm2 503; AVX512DQ-NEXT: vpblendvb %ymm2, %ymm4, %ymm3, %ymm2 504; AVX512DQ-NEXT: vpsrlw $8, %ymm2, %ymm2 505; 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] 506; 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] 507; AVX512DQ-NEXT: vpsraw $4, %ymm0, %ymm3 508; AVX512DQ-NEXT: vpblendvb %ymm1, %ymm3, %ymm0, %ymm0 509; AVX512DQ-NEXT: vpsraw $2, %ymm0, %ymm3 510; AVX512DQ-NEXT: vpaddw %ymm1, %ymm1, %ymm1 511; AVX512DQ-NEXT: vpblendvb %ymm1, %ymm3, %ymm0, %ymm0 512; AVX512DQ-NEXT: vpsraw $1, %ymm0, %ymm3 513; AVX512DQ-NEXT: vpaddw %ymm1, %ymm1, %ymm1 514; AVX512DQ-NEXT: vpblendvb %ymm1, %ymm3, %ymm0, %ymm0 515; AVX512DQ-NEXT: vpsrlw $8, %ymm0, %ymm0 516; AVX512DQ-NEXT: vpackuswb %ymm2, %ymm0, %ymm0 517; AVX512DQ-NEXT: retq 518; 519; AVX512BW-LABEL: var_shift_v32i8: 520; AVX512BW: # %bb.0: 521; 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 522; AVX512BW-NEXT: vpmovsxbw %ymm0, %zmm0 523; AVX512BW-NEXT: vpsravw %zmm1, %zmm0, %zmm0 524; AVX512BW-NEXT: vpmovwb %zmm0, %ymm0 525; AVX512BW-NEXT: retq 526; 527; AVX512DQVL-LABEL: var_shift_v32i8: 528; AVX512DQVL: # %bb.0: 529; AVX512DQVL-NEXT: vpsllw $5, %ymm1, %ymm1 530; 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] 531; 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] 532; AVX512DQVL-NEXT: vpsraw $4, %ymm3, %ymm4 533; AVX512DQVL-NEXT: vpblendvb %ymm2, %ymm4, %ymm3, %ymm3 534; AVX512DQVL-NEXT: vpsraw $2, %ymm3, %ymm4 535; AVX512DQVL-NEXT: vpaddw %ymm2, %ymm2, %ymm2 536; AVX512DQVL-NEXT: vpblendvb %ymm2, %ymm4, %ymm3, %ymm3 537; AVX512DQVL-NEXT: vpsraw $1, %ymm3, %ymm4 538; AVX512DQVL-NEXT: vpaddw %ymm2, %ymm2, %ymm2 539; AVX512DQVL-NEXT: vpblendvb %ymm2, %ymm4, %ymm3, %ymm2 540; AVX512DQVL-NEXT: vpsrlw $8, %ymm2, %ymm2 541; 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] 542; 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] 543; AVX512DQVL-NEXT: vpsraw $4, %ymm0, %ymm3 544; AVX512DQVL-NEXT: vpblendvb %ymm1, %ymm3, %ymm0, %ymm0 545; AVX512DQVL-NEXT: vpsraw $2, %ymm0, %ymm3 546; AVX512DQVL-NEXT: vpaddw %ymm1, %ymm1, %ymm1 547; AVX512DQVL-NEXT: vpblendvb %ymm1, %ymm3, %ymm0, %ymm0 548; AVX512DQVL-NEXT: vpsraw $1, %ymm0, %ymm3 549; AVX512DQVL-NEXT: vpaddw %ymm1, %ymm1, %ymm1 550; AVX512DQVL-NEXT: vpblendvb %ymm1, %ymm3, %ymm0, %ymm0 551; AVX512DQVL-NEXT: vpsrlw $8, %ymm0, %ymm0 552; AVX512DQVL-NEXT: vpackuswb %ymm2, %ymm0, %ymm0 553; AVX512DQVL-NEXT: retq 554; 555; AVX512BWVL-LABEL: var_shift_v32i8: 556; AVX512BWVL: # %bb.0: 557; 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 558; AVX512BWVL-NEXT: vpmovsxbw %ymm0, %zmm0 559; AVX512BWVL-NEXT: vpsravw %zmm1, %zmm0, %zmm0 560; AVX512BWVL-NEXT: vpmovwb %zmm0, %ymm0 561; AVX512BWVL-NEXT: retq 562; 563; X32-AVX1-LABEL: var_shift_v32i8: 564; X32-AVX1: # %bb.0: 565; X32-AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2 566; X32-AVX1-NEXT: vpsllw $5, %xmm2, %xmm2 567; X32-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] 568; X32-AVX1-NEXT: vextractf128 $1, %ymm0, %xmm4 569; X32-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] 570; X32-AVX1-NEXT: vpsraw $4, %xmm5, %xmm6 571; X32-AVX1-NEXT: vpblendvb %xmm3, %xmm6, %xmm5, %xmm5 572; X32-AVX1-NEXT: vpsraw $2, %xmm5, %xmm6 573; X32-AVX1-NEXT: vpaddw %xmm3, %xmm3, %xmm3 574; X32-AVX1-NEXT: vpblendvb %xmm3, %xmm6, %xmm5, %xmm5 575; X32-AVX1-NEXT: vpsraw $1, %xmm5, %xmm6 576; X32-AVX1-NEXT: vpaddw %xmm3, %xmm3, %xmm3 577; X32-AVX1-NEXT: vpblendvb %xmm3, %xmm6, %xmm5, %xmm3 578; X32-AVX1-NEXT: vpsrlw $8, %xmm3, %xmm3 579; X32-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] 580; X32-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] 581; X32-AVX1-NEXT: vpsraw $4, %xmm4, %xmm5 582; X32-AVX1-NEXT: vpblendvb %xmm2, %xmm5, %xmm4, %xmm4 583; X32-AVX1-NEXT: vpsraw $2, %xmm4, %xmm5 584; X32-AVX1-NEXT: vpaddw %xmm2, %xmm2, %xmm2 585; X32-AVX1-NEXT: vpblendvb %xmm2, %xmm5, %xmm4, %xmm4 586; X32-AVX1-NEXT: vpsraw $1, %xmm4, %xmm5 587; X32-AVX1-NEXT: vpaddw %xmm2, %xmm2, %xmm2 588; X32-AVX1-NEXT: vpblendvb %xmm2, %xmm5, %xmm4, %xmm2 589; X32-AVX1-NEXT: vpsrlw $8, %xmm2, %xmm2 590; X32-AVX1-NEXT: vpackuswb %xmm3, %xmm2, %xmm2 591; X32-AVX1-NEXT: vpsllw $5, %xmm1, %xmm1 592; X32-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] 593; X32-AVX1-NEXT: vpunpckhbw {{.*#+}} xmm4 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15] 594; X32-AVX1-NEXT: vpsraw $4, %xmm4, %xmm5 595; X32-AVX1-NEXT: vpblendvb %xmm3, %xmm5, %xmm4, %xmm4 596; X32-AVX1-NEXT: vpsraw $2, %xmm4, %xmm5 597; X32-AVX1-NEXT: vpaddw %xmm3, %xmm3, %xmm3 598; X32-AVX1-NEXT: vpblendvb %xmm3, %xmm5, %xmm4, %xmm4 599; X32-AVX1-NEXT: vpsraw $1, %xmm4, %xmm5 600; X32-AVX1-NEXT: vpaddw %xmm3, %xmm3, %xmm3 601; X32-AVX1-NEXT: vpblendvb %xmm3, %xmm5, %xmm4, %xmm3 602; X32-AVX1-NEXT: vpsrlw $8, %xmm3, %xmm3 603; X32-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] 604; X32-AVX1-NEXT: vpunpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7] 605; X32-AVX1-NEXT: vpsraw $4, %xmm0, %xmm4 606; X32-AVX1-NEXT: vpblendvb %xmm1, %xmm4, %xmm0, %xmm0 607; X32-AVX1-NEXT: vpsraw $2, %xmm0, %xmm4 608; X32-AVX1-NEXT: vpaddw %xmm1, %xmm1, %xmm1 609; X32-AVX1-NEXT: vpblendvb %xmm1, %xmm4, %xmm0, %xmm0 610; X32-AVX1-NEXT: vpsraw $1, %xmm0, %xmm4 611; X32-AVX1-NEXT: vpaddw %xmm1, %xmm1, %xmm1 612; X32-AVX1-NEXT: vpblendvb %xmm1, %xmm4, %xmm0, %xmm0 613; X32-AVX1-NEXT: vpsrlw $8, %xmm0, %xmm0 614; X32-AVX1-NEXT: vpackuswb %xmm3, %xmm0, %xmm0 615; X32-AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0 616; X32-AVX1-NEXT: retl 617; 618; X32-AVX2-LABEL: var_shift_v32i8: 619; X32-AVX2: # %bb.0: 620; X32-AVX2-NEXT: vpsllw $5, %ymm1, %ymm1 621; X32-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] 622; X32-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] 623; X32-AVX2-NEXT: vpsraw $4, %ymm3, %ymm4 624; X32-AVX2-NEXT: vpblendvb %ymm2, %ymm4, %ymm3, %ymm3 625; X32-AVX2-NEXT: vpsraw $2, %ymm3, %ymm4 626; X32-AVX2-NEXT: vpaddw %ymm2, %ymm2, %ymm2 627; X32-AVX2-NEXT: vpblendvb %ymm2, %ymm4, %ymm3, %ymm3 628; X32-AVX2-NEXT: vpsraw $1, %ymm3, %ymm4 629; X32-AVX2-NEXT: vpaddw %ymm2, %ymm2, %ymm2 630; X32-AVX2-NEXT: vpblendvb %ymm2, %ymm4, %ymm3, %ymm2 631; X32-AVX2-NEXT: vpsrlw $8, %ymm2, %ymm2 632; X32-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] 633; X32-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] 634; X32-AVX2-NEXT: vpsraw $4, %ymm0, %ymm3 635; X32-AVX2-NEXT: vpblendvb %ymm1, %ymm3, %ymm0, %ymm0 636; X32-AVX2-NEXT: vpsraw $2, %ymm0, %ymm3 637; X32-AVX2-NEXT: vpaddw %ymm1, %ymm1, %ymm1 638; X32-AVX2-NEXT: vpblendvb %ymm1, %ymm3, %ymm0, %ymm0 639; X32-AVX2-NEXT: vpsraw $1, %ymm0, %ymm3 640; X32-AVX2-NEXT: vpaddw %ymm1, %ymm1, %ymm1 641; X32-AVX2-NEXT: vpblendvb %ymm1, %ymm3, %ymm0, %ymm0 642; X32-AVX2-NEXT: vpsrlw $8, %ymm0, %ymm0 643; X32-AVX2-NEXT: vpackuswb %ymm2, %ymm0, %ymm0 644; X32-AVX2-NEXT: retl 645 %shift = ashr <32 x i8> %a, %b 646 ret <32 x i8> %shift 647} 648 649; 650; Uniform Variable Shifts 651; 652 653define <4 x i64> @splatvar_shift_v4i64(<4 x i64> %a, <4 x i64> %b) nounwind { 654; AVX1-LABEL: splatvar_shift_v4i64: 655; AVX1: # %bb.0: 656; AVX1-NEXT: vmovdqa {{.*#+}} xmm2 = [9223372036854775808,9223372036854775808] 657; AVX1-NEXT: vpsrlq %xmm1, %xmm2, %xmm2 658; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm3 659; AVX1-NEXT: vpsrlq %xmm1, %xmm3, %xmm3 660; AVX1-NEXT: vpxor %xmm2, %xmm3, %xmm3 661; AVX1-NEXT: vpsubq %xmm2, %xmm3, %xmm3 662; AVX1-NEXT: vpsrlq %xmm1, %xmm0, %xmm0 663; AVX1-NEXT: vpxor %xmm2, %xmm0, %xmm0 664; AVX1-NEXT: vpsubq %xmm2, %xmm0, %xmm0 665; AVX1-NEXT: vinsertf128 $1, %xmm3, %ymm0, %ymm0 666; AVX1-NEXT: retq 667; 668; AVX2-LABEL: splatvar_shift_v4i64: 669; AVX2: # %bb.0: 670; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm2 = [9223372036854775808,9223372036854775808,9223372036854775808,9223372036854775808] 671; AVX2-NEXT: vpsrlq %xmm1, %ymm2, %ymm2 672; AVX2-NEXT: vpsrlq %xmm1, %ymm0, %ymm0 673; AVX2-NEXT: vpxor %ymm2, %ymm0, %ymm0 674; AVX2-NEXT: vpsubq %ymm2, %ymm0, %ymm0 675; AVX2-NEXT: retq 676; 677; XOPAVX1-LABEL: splatvar_shift_v4i64: 678; XOPAVX1: # %bb.0: 679; XOPAVX1-NEXT: vmovddup {{.*#+}} xmm1 = xmm1[0,0] 680; XOPAVX1-NEXT: vpxor %xmm2, %xmm2, %xmm2 681; XOPAVX1-NEXT: vpsubq %xmm1, %xmm2, %xmm1 682; XOPAVX1-NEXT: vextractf128 $1, %ymm0, %xmm2 683; XOPAVX1-NEXT: vpshaq %xmm1, %xmm2, %xmm2 684; XOPAVX1-NEXT: vpshaq %xmm1, %xmm0, %xmm0 685; XOPAVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0 686; XOPAVX1-NEXT: retq 687; 688; XOPAVX2-LABEL: splatvar_shift_v4i64: 689; XOPAVX2: # %bb.0: 690; XOPAVX2-NEXT: vpbroadcastq {{.*#+}} ymm2 = [9223372036854775808,9223372036854775808,9223372036854775808,9223372036854775808] 691; XOPAVX2-NEXT: vpsrlq %xmm1, %ymm2, %ymm2 692; XOPAVX2-NEXT: vpsrlq %xmm1, %ymm0, %ymm0 693; XOPAVX2-NEXT: vpxor %ymm2, %ymm0, %ymm0 694; XOPAVX2-NEXT: vpsubq %ymm2, %ymm0, %ymm0 695; XOPAVX2-NEXT: retq 696; 697; AVX512-LABEL: splatvar_shift_v4i64: 698; AVX512: # %bb.0: 699; AVX512-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm0 700; AVX512-NEXT: vpsraq %xmm1, %zmm0, %zmm0 701; AVX512-NEXT: # kill: def $ymm0 killed $ymm0 killed $zmm0 702; AVX512-NEXT: retq 703; 704; AVX512VL-LABEL: splatvar_shift_v4i64: 705; AVX512VL: # %bb.0: 706; AVX512VL-NEXT: vpsraq %xmm1, %ymm0, %ymm0 707; AVX512VL-NEXT: retq 708; 709; X32-AVX1-LABEL: splatvar_shift_v4i64: 710; X32-AVX1: # %bb.0: 711; X32-AVX1-NEXT: vmovdqa {{.*#+}} xmm2 = [0,2147483648,0,2147483648] 712; X32-AVX1-NEXT: vpsrlq %xmm1, %xmm2, %xmm2 713; X32-AVX1-NEXT: vextractf128 $1, %ymm0, %xmm3 714; X32-AVX1-NEXT: vpsrlq %xmm1, %xmm3, %xmm3 715; X32-AVX1-NEXT: vpxor %xmm2, %xmm3, %xmm3 716; X32-AVX1-NEXT: vpsubq %xmm2, %xmm3, %xmm3 717; X32-AVX1-NEXT: vpsrlq %xmm1, %xmm0, %xmm0 718; X32-AVX1-NEXT: vpxor %xmm2, %xmm0, %xmm0 719; X32-AVX1-NEXT: vpsubq %xmm2, %xmm0, %xmm0 720; X32-AVX1-NEXT: vinsertf128 $1, %xmm3, %ymm0, %ymm0 721; X32-AVX1-NEXT: retl 722; 723; X32-AVX2-LABEL: splatvar_shift_v4i64: 724; X32-AVX2: # %bb.0: 725; X32-AVX2-NEXT: vmovdqa {{.*#+}} ymm2 = [0,2147483648,0,2147483648,0,2147483648,0,2147483648] 726; X32-AVX2-NEXT: vpsrlq %xmm1, %ymm2, %ymm2 727; X32-AVX2-NEXT: vpsrlq %xmm1, %ymm0, %ymm0 728; X32-AVX2-NEXT: vpxor %ymm2, %ymm0, %ymm0 729; X32-AVX2-NEXT: vpsubq %ymm2, %ymm0, %ymm0 730; X32-AVX2-NEXT: retl 731 %splat = shufflevector <4 x i64> %b, <4 x i64> undef, <4 x i32> zeroinitializer 732 %shift = ashr <4 x i64> %a, %splat 733 ret <4 x i64> %shift 734} 735 736define <8 x i32> @splatvar_shift_v8i32(<8 x i32> %a, <8 x i32> %b) nounwind { 737; AVX1-LABEL: splatvar_shift_v8i32: 738; AVX1: # %bb.0: 739; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2 740; AVX1-NEXT: vpmovzxdq {{.*#+}} xmm1 = xmm1[0],zero,xmm1[1],zero 741; AVX1-NEXT: vpsrad %xmm1, %xmm2, %xmm2 742; AVX1-NEXT: vpsrad %xmm1, %xmm0, %xmm0 743; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0 744; AVX1-NEXT: retq 745; 746; AVX2-LABEL: splatvar_shift_v8i32: 747; AVX2: # %bb.0: 748; AVX2-NEXT: vpmovzxdq {{.*#+}} xmm1 = xmm1[0],zero,xmm1[1],zero 749; AVX2-NEXT: vpsrad %xmm1, %ymm0, %ymm0 750; AVX2-NEXT: retq 751; 752; XOPAVX1-LABEL: splatvar_shift_v8i32: 753; XOPAVX1: # %bb.0: 754; XOPAVX1-NEXT: vextractf128 $1, %ymm0, %xmm2 755; XOPAVX1-NEXT: vpmovzxdq {{.*#+}} xmm1 = xmm1[0],zero,xmm1[1],zero 756; XOPAVX1-NEXT: vpsrad %xmm1, %xmm2, %xmm2 757; XOPAVX1-NEXT: vpsrad %xmm1, %xmm0, %xmm0 758; XOPAVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0 759; XOPAVX1-NEXT: retq 760; 761; XOPAVX2-LABEL: splatvar_shift_v8i32: 762; XOPAVX2: # %bb.0: 763; XOPAVX2-NEXT: vpmovzxdq {{.*#+}} xmm1 = xmm1[0],zero,xmm1[1],zero 764; XOPAVX2-NEXT: vpsrad %xmm1, %ymm0, %ymm0 765; XOPAVX2-NEXT: retq 766; 767; AVX512-LABEL: splatvar_shift_v8i32: 768; AVX512: # %bb.0: 769; AVX512-NEXT: vpmovzxdq {{.*#+}} xmm1 = xmm1[0],zero,xmm1[1],zero 770; AVX512-NEXT: vpsrad %xmm1, %ymm0, %ymm0 771; AVX512-NEXT: retq 772; 773; AVX512VL-LABEL: splatvar_shift_v8i32: 774; AVX512VL: # %bb.0: 775; AVX512VL-NEXT: vpmovzxdq {{.*#+}} xmm1 = xmm1[0],zero,xmm1[1],zero 776; AVX512VL-NEXT: vpsrad %xmm1, %ymm0, %ymm0 777; AVX512VL-NEXT: retq 778; 779; X32-AVX1-LABEL: splatvar_shift_v8i32: 780; X32-AVX1: # %bb.0: 781; X32-AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2 782; X32-AVX1-NEXT: vpmovzxdq {{.*#+}} xmm1 = xmm1[0],zero,xmm1[1],zero 783; X32-AVX1-NEXT: vpsrad %xmm1, %xmm2, %xmm2 784; X32-AVX1-NEXT: vpsrad %xmm1, %xmm0, %xmm0 785; X32-AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0 786; X32-AVX1-NEXT: retl 787; 788; X32-AVX2-LABEL: splatvar_shift_v8i32: 789; X32-AVX2: # %bb.0: 790; X32-AVX2-NEXT: vpmovzxdq {{.*#+}} xmm1 = xmm1[0],zero,xmm1[1],zero 791; X32-AVX2-NEXT: vpsrad %xmm1, %ymm0, %ymm0 792; X32-AVX2-NEXT: retl 793 %splat = shufflevector <8 x i32> %b, <8 x i32> undef, <8 x i32> zeroinitializer 794 %shift = ashr <8 x i32> %a, %splat 795 ret <8 x i32> %shift 796} 797 798define <16 x i16> @splatvar_shift_v16i16(<16 x i16> %a, <16 x i16> %b) nounwind { 799; AVX1-LABEL: splatvar_shift_v16i16: 800; AVX1: # %bb.0: 801; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2 802; AVX1-NEXT: vpmovzxwq {{.*#+}} xmm1 = xmm1[0],zero,zero,zero,xmm1[1],zero,zero,zero 803; AVX1-NEXT: vpsraw %xmm1, %xmm2, %xmm2 804; AVX1-NEXT: vpsraw %xmm1, %xmm0, %xmm0 805; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0 806; AVX1-NEXT: retq 807; 808; AVX2-LABEL: splatvar_shift_v16i16: 809; AVX2: # %bb.0: 810; AVX2-NEXT: vpmovzxwq {{.*#+}} xmm1 = xmm1[0],zero,zero,zero,xmm1[1],zero,zero,zero 811; AVX2-NEXT: vpsraw %xmm1, %ymm0, %ymm0 812; AVX2-NEXT: retq 813; 814; XOPAVX1-LABEL: splatvar_shift_v16i16: 815; XOPAVX1: # %bb.0: 816; XOPAVX1-NEXT: vextractf128 $1, %ymm0, %xmm2 817; XOPAVX1-NEXT: vpmovzxwq {{.*#+}} xmm1 = xmm1[0],zero,zero,zero,xmm1[1],zero,zero,zero 818; XOPAVX1-NEXT: vpsraw %xmm1, %xmm2, %xmm2 819; XOPAVX1-NEXT: vpsraw %xmm1, %xmm0, %xmm0 820; XOPAVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0 821; XOPAVX1-NEXT: retq 822; 823; XOPAVX2-LABEL: splatvar_shift_v16i16: 824; XOPAVX2: # %bb.0: 825; XOPAVX2-NEXT: vpmovzxwq {{.*#+}} xmm1 = xmm1[0],zero,zero,zero,xmm1[1],zero,zero,zero 826; XOPAVX2-NEXT: vpsraw %xmm1, %ymm0, %ymm0 827; XOPAVX2-NEXT: retq 828; 829; AVX512-LABEL: splatvar_shift_v16i16: 830; AVX512: # %bb.0: 831; AVX512-NEXT: vpmovzxwq {{.*#+}} xmm1 = xmm1[0],zero,zero,zero,xmm1[1],zero,zero,zero 832; AVX512-NEXT: vpsraw %xmm1, %ymm0, %ymm0 833; AVX512-NEXT: retq 834; 835; AVX512VL-LABEL: splatvar_shift_v16i16: 836; AVX512VL: # %bb.0: 837; AVX512VL-NEXT: vpmovzxwq {{.*#+}} xmm1 = xmm1[0],zero,zero,zero,xmm1[1],zero,zero,zero 838; AVX512VL-NEXT: vpsraw %xmm1, %ymm0, %ymm0 839; AVX512VL-NEXT: retq 840; 841; X32-AVX1-LABEL: splatvar_shift_v16i16: 842; X32-AVX1: # %bb.0: 843; X32-AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2 844; X32-AVX1-NEXT: vpmovzxwq {{.*#+}} xmm1 = xmm1[0],zero,zero,zero,xmm1[1],zero,zero,zero 845; X32-AVX1-NEXT: vpsraw %xmm1, %xmm2, %xmm2 846; X32-AVX1-NEXT: vpsraw %xmm1, %xmm0, %xmm0 847; X32-AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0 848; X32-AVX1-NEXT: retl 849; 850; X32-AVX2-LABEL: splatvar_shift_v16i16: 851; X32-AVX2: # %bb.0: 852; X32-AVX2-NEXT: vpmovzxwq {{.*#+}} xmm1 = xmm1[0],zero,zero,zero,xmm1[1],zero,zero,zero 853; X32-AVX2-NEXT: vpsraw %xmm1, %ymm0, %ymm0 854; X32-AVX2-NEXT: retl 855 %splat = shufflevector <16 x i16> %b, <16 x i16> undef, <16 x i32> zeroinitializer 856 %shift = ashr <16 x i16> %a, %splat 857 ret <16 x i16> %shift 858} 859 860define <32 x i8> @splatvar_shift_v32i8(<32 x i8> %a, <32 x i8> %b) nounwind { 861; AVX1-LABEL: splatvar_shift_v32i8: 862; AVX1: # %bb.0: 863; AVX1-NEXT: vpxor %xmm2, %xmm2, %xmm2 864; AVX1-NEXT: vpshufb %xmm2, %xmm1, %xmm1 865; AVX1-NEXT: vpsllw $5, %xmm1, %xmm1 866; 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] 867; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm3 868; 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] 869; AVX1-NEXT: vpsraw $4, %xmm4, %xmm5 870; AVX1-NEXT: vpblendvb %xmm2, %xmm5, %xmm4, %xmm4 871; AVX1-NEXT: vpsraw $2, %xmm4, %xmm5 872; AVX1-NEXT: vpaddw %xmm2, %xmm2, %xmm6 873; AVX1-NEXT: vpblendvb %xmm6, %xmm5, %xmm4, %xmm4 874; AVX1-NEXT: vpsraw $1, %xmm4, %xmm5 875; AVX1-NEXT: vpaddw %xmm6, %xmm6, %xmm9 876; AVX1-NEXT: vpblendvb %xmm9, %xmm5, %xmm4, %xmm4 877; AVX1-NEXT: vpsrlw $8, %xmm4, %xmm8 878; 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] 879; 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] 880; AVX1-NEXT: vpsraw $4, %xmm3, %xmm5 881; AVX1-NEXT: vpblendvb %xmm1, %xmm5, %xmm3, %xmm3 882; AVX1-NEXT: vpsraw $2, %xmm3, %xmm5 883; AVX1-NEXT: vpaddw %xmm1, %xmm1, %xmm4 884; AVX1-NEXT: vpblendvb %xmm4, %xmm5, %xmm3, %xmm3 885; AVX1-NEXT: vpsraw $1, %xmm3, %xmm5 886; AVX1-NEXT: vpaddw %xmm4, %xmm4, %xmm7 887; AVX1-NEXT: vpblendvb %xmm7, %xmm5, %xmm3, %xmm3 888; AVX1-NEXT: vpsrlw $8, %xmm3, %xmm3 889; AVX1-NEXT: vpackuswb %xmm8, %xmm3, %xmm8 890; AVX1-NEXT: vpunpckhbw {{.*#+}} xmm5 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15] 891; AVX1-NEXT: vpsraw $4, %xmm5, %xmm3 892; AVX1-NEXT: vpblendvb %xmm2, %xmm3, %xmm5, %xmm2 893; AVX1-NEXT: vpsraw $2, %xmm2, %xmm3 894; AVX1-NEXT: vpblendvb %xmm6, %xmm3, %xmm2, %xmm2 895; AVX1-NEXT: vpsraw $1, %xmm2, %xmm3 896; AVX1-NEXT: vpblendvb %xmm9, %xmm3, %xmm2, %xmm2 897; AVX1-NEXT: vpsrlw $8, %xmm2, %xmm2 898; AVX1-NEXT: vpunpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7] 899; AVX1-NEXT: vpsraw $4, %xmm0, %xmm3 900; AVX1-NEXT: vpblendvb %xmm1, %xmm3, %xmm0, %xmm0 901; AVX1-NEXT: vpsraw $2, %xmm0, %xmm1 902; AVX1-NEXT: vpblendvb %xmm4, %xmm1, %xmm0, %xmm0 903; AVX1-NEXT: vpsraw $1, %xmm0, %xmm1 904; AVX1-NEXT: vpblendvb %xmm7, %xmm1, %xmm0, %xmm0 905; AVX1-NEXT: vpsrlw $8, %xmm0, %xmm0 906; AVX1-NEXT: vpackuswb %xmm2, %xmm0, %xmm0 907; AVX1-NEXT: vinsertf128 $1, %xmm8, %ymm0, %ymm0 908; AVX1-NEXT: retq 909; 910; AVX2-LABEL: splatvar_shift_v32i8: 911; AVX2: # %bb.0: 912; AVX2-NEXT: vpbroadcastb %xmm1, %ymm1 913; AVX2-NEXT: vpsllw $5, %ymm1, %ymm1 914; 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] 915; 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] 916; AVX2-NEXT: vpsraw $4, %ymm3, %ymm4 917; AVX2-NEXT: vpblendvb %ymm2, %ymm4, %ymm3, %ymm3 918; AVX2-NEXT: vpsraw $2, %ymm3, %ymm4 919; AVX2-NEXT: vpaddw %ymm2, %ymm2, %ymm2 920; AVX2-NEXT: vpblendvb %ymm2, %ymm4, %ymm3, %ymm3 921; AVX2-NEXT: vpsraw $1, %ymm3, %ymm4 922; AVX2-NEXT: vpaddw %ymm2, %ymm2, %ymm2 923; AVX2-NEXT: vpblendvb %ymm2, %ymm4, %ymm3, %ymm2 924; AVX2-NEXT: vpsrlw $8, %ymm2, %ymm2 925; 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] 926; 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] 927; AVX2-NEXT: vpsraw $4, %ymm0, %ymm3 928; AVX2-NEXT: vpblendvb %ymm1, %ymm3, %ymm0, %ymm0 929; AVX2-NEXT: vpsraw $2, %ymm0, %ymm3 930; AVX2-NEXT: vpaddw %ymm1, %ymm1, %ymm1 931; AVX2-NEXT: vpblendvb %ymm1, %ymm3, %ymm0, %ymm0 932; AVX2-NEXT: vpsraw $1, %ymm0, %ymm3 933; AVX2-NEXT: vpaddw %ymm1, %ymm1, %ymm1 934; AVX2-NEXT: vpblendvb %ymm1, %ymm3, %ymm0, %ymm0 935; AVX2-NEXT: vpsrlw $8, %ymm0, %ymm0 936; AVX2-NEXT: vpackuswb %ymm2, %ymm0, %ymm0 937; AVX2-NEXT: retq 938; 939; XOPAVX1-LABEL: splatvar_shift_v32i8: 940; XOPAVX1: # %bb.0: 941; XOPAVX1-NEXT: vpxor %xmm2, %xmm2, %xmm2 942; XOPAVX1-NEXT: vpshufb %xmm2, %xmm1, %xmm1 943; XOPAVX1-NEXT: vpsubb %xmm1, %xmm2, %xmm1 944; XOPAVX1-NEXT: vextractf128 $1, %ymm0, %xmm2 945; XOPAVX1-NEXT: vpshab %xmm1, %xmm2, %xmm2 946; XOPAVX1-NEXT: vpshab %xmm1, %xmm0, %xmm0 947; XOPAVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0 948; XOPAVX1-NEXT: retq 949; 950; XOPAVX2-LABEL: splatvar_shift_v32i8: 951; XOPAVX2: # %bb.0: 952; XOPAVX2-NEXT: vpbroadcastb %xmm1, %ymm1 953; XOPAVX2-NEXT: vextracti128 $1, %ymm1, %xmm2 954; XOPAVX2-NEXT: vpxor %xmm3, %xmm3, %xmm3 955; XOPAVX2-NEXT: vpsubb %xmm2, %xmm3, %xmm2 956; XOPAVX2-NEXT: vextracti128 $1, %ymm0, %xmm4 957; XOPAVX2-NEXT: vpshab %xmm2, %xmm4, %xmm2 958; XOPAVX2-NEXT: vpsubb %xmm1, %xmm3, %xmm1 959; XOPAVX2-NEXT: vpshab %xmm1, %xmm0, %xmm0 960; XOPAVX2-NEXT: vinserti128 $1, %xmm2, %ymm0, %ymm0 961; XOPAVX2-NEXT: retq 962; 963; AVX512DQ-LABEL: splatvar_shift_v32i8: 964; AVX512DQ: # %bb.0: 965; AVX512DQ-NEXT: vpbroadcastb %xmm1, %ymm1 966; AVX512DQ-NEXT: vpsllw $5, %ymm1, %ymm1 967; 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] 968; 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] 969; AVX512DQ-NEXT: vpsraw $4, %ymm3, %ymm4 970; AVX512DQ-NEXT: vpblendvb %ymm2, %ymm4, %ymm3, %ymm3 971; AVX512DQ-NEXT: vpsraw $2, %ymm3, %ymm4 972; AVX512DQ-NEXT: vpaddw %ymm2, %ymm2, %ymm2 973; AVX512DQ-NEXT: vpblendvb %ymm2, %ymm4, %ymm3, %ymm3 974; AVX512DQ-NEXT: vpsraw $1, %ymm3, %ymm4 975; AVX512DQ-NEXT: vpaddw %ymm2, %ymm2, %ymm2 976; AVX512DQ-NEXT: vpblendvb %ymm2, %ymm4, %ymm3, %ymm2 977; AVX512DQ-NEXT: vpsrlw $8, %ymm2, %ymm2 978; 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] 979; 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] 980; AVX512DQ-NEXT: vpsraw $4, %ymm0, %ymm3 981; AVX512DQ-NEXT: vpblendvb %ymm1, %ymm3, %ymm0, %ymm0 982; AVX512DQ-NEXT: vpsraw $2, %ymm0, %ymm3 983; AVX512DQ-NEXT: vpaddw %ymm1, %ymm1, %ymm1 984; AVX512DQ-NEXT: vpblendvb %ymm1, %ymm3, %ymm0, %ymm0 985; AVX512DQ-NEXT: vpsraw $1, %ymm0, %ymm3 986; AVX512DQ-NEXT: vpaddw %ymm1, %ymm1, %ymm1 987; AVX512DQ-NEXT: vpblendvb %ymm1, %ymm3, %ymm0, %ymm0 988; AVX512DQ-NEXT: vpsrlw $8, %ymm0, %ymm0 989; AVX512DQ-NEXT: vpackuswb %ymm2, %ymm0, %ymm0 990; AVX512DQ-NEXT: retq 991; 992; AVX512BW-LABEL: splatvar_shift_v32i8: 993; AVX512BW: # %bb.0: 994; AVX512BW-NEXT: vpbroadcastb %xmm1, %ymm1 995; AVX512BW-NEXT: vpmovsxbw %ymm0, %zmm0 996; 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 997; AVX512BW-NEXT: vpsravw %zmm1, %zmm0, %zmm0 998; AVX512BW-NEXT: vpmovwb %zmm0, %ymm0 999; AVX512BW-NEXT: retq 1000; 1001; AVX512DQVL-LABEL: splatvar_shift_v32i8: 1002; AVX512DQVL: # %bb.0: 1003; AVX512DQVL-NEXT: vpbroadcastb %xmm1, %ymm1 1004; AVX512DQVL-NEXT: vpsllw $5, %ymm1, %ymm1 1005; 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] 1006; 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] 1007; AVX512DQVL-NEXT: vpsraw $4, %ymm3, %ymm4 1008; AVX512DQVL-NEXT: vpblendvb %ymm2, %ymm4, %ymm3, %ymm3 1009; AVX512DQVL-NEXT: vpsraw $2, %ymm3, %ymm4 1010; AVX512DQVL-NEXT: vpaddw %ymm2, %ymm2, %ymm2 1011; AVX512DQVL-NEXT: vpblendvb %ymm2, %ymm4, %ymm3, %ymm3 1012; AVX512DQVL-NEXT: vpsraw $1, %ymm3, %ymm4 1013; AVX512DQVL-NEXT: vpaddw %ymm2, %ymm2, %ymm2 1014; AVX512DQVL-NEXT: vpblendvb %ymm2, %ymm4, %ymm3, %ymm2 1015; AVX512DQVL-NEXT: vpsrlw $8, %ymm2, %ymm2 1016; 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] 1017; 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] 1018; AVX512DQVL-NEXT: vpsraw $4, %ymm0, %ymm3 1019; AVX512DQVL-NEXT: vpblendvb %ymm1, %ymm3, %ymm0, %ymm0 1020; AVX512DQVL-NEXT: vpsraw $2, %ymm0, %ymm3 1021; AVX512DQVL-NEXT: vpaddw %ymm1, %ymm1, %ymm1 1022; AVX512DQVL-NEXT: vpblendvb %ymm1, %ymm3, %ymm0, %ymm0 1023; AVX512DQVL-NEXT: vpsraw $1, %ymm0, %ymm3 1024; AVX512DQVL-NEXT: vpaddw %ymm1, %ymm1, %ymm1 1025; AVX512DQVL-NEXT: vpblendvb %ymm1, %ymm3, %ymm0, %ymm0 1026; AVX512DQVL-NEXT: vpsrlw $8, %ymm0, %ymm0 1027; AVX512DQVL-NEXT: vpackuswb %ymm2, %ymm0, %ymm0 1028; AVX512DQVL-NEXT: retq 1029; 1030; AVX512BWVL-LABEL: splatvar_shift_v32i8: 1031; AVX512BWVL: # %bb.0: 1032; AVX512BWVL-NEXT: vpbroadcastb %xmm1, %ymm1 1033; AVX512BWVL-NEXT: vpmovsxbw %ymm0, %zmm0 1034; 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 1035; AVX512BWVL-NEXT: vpsravw %zmm1, %zmm0, %zmm0 1036; AVX512BWVL-NEXT: vpmovwb %zmm0, %ymm0 1037; AVX512BWVL-NEXT: retq 1038; 1039; X32-AVX1-LABEL: splatvar_shift_v32i8: 1040; X32-AVX1: # %bb.0: 1041; X32-AVX1-NEXT: vpxor %xmm2, %xmm2, %xmm2 1042; X32-AVX1-NEXT: vpshufb %xmm2, %xmm1, %xmm1 1043; X32-AVX1-NEXT: vpsllw $5, %xmm1, %xmm1 1044; X32-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] 1045; X32-AVX1-NEXT: vextractf128 $1, %ymm0, %xmm3 1046; X32-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] 1047; X32-AVX1-NEXT: vpsraw $4, %xmm4, %xmm5 1048; X32-AVX1-NEXT: vpblendvb %xmm2, %xmm5, %xmm4, %xmm4 1049; X32-AVX1-NEXT: vpunpckhbw {{.*#+}} xmm5 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15] 1050; X32-AVX1-NEXT: vpsraw $4, %xmm5, %xmm6 1051; X32-AVX1-NEXT: vpblendvb %xmm2, %xmm6, %xmm5, %xmm5 1052; X32-AVX1-NEXT: vpsraw $2, %xmm4, %xmm6 1053; X32-AVX1-NEXT: vpaddw %xmm2, %xmm2, %xmm2 1054; X32-AVX1-NEXT: vpblendvb %xmm2, %xmm6, %xmm4, %xmm4 1055; X32-AVX1-NEXT: vpsraw $2, %xmm5, %xmm6 1056; X32-AVX1-NEXT: vpblendvb %xmm2, %xmm6, %xmm5, %xmm5 1057; X32-AVX1-NEXT: vpsraw $1, %xmm4, %xmm6 1058; X32-AVX1-NEXT: vpaddw %xmm2, %xmm2, %xmm2 1059; X32-AVX1-NEXT: vpblendvb %xmm2, %xmm6, %xmm4, %xmm4 1060; X32-AVX1-NEXT: vpsraw $1, %xmm5, %xmm6 1061; X32-AVX1-NEXT: vpblendvb %xmm2, %xmm6, %xmm5, %xmm2 1062; X32-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] 1063; X32-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] 1064; X32-AVX1-NEXT: vpsraw $4, %xmm3, %xmm5 1065; X32-AVX1-NEXT: vpblendvb %xmm1, %xmm5, %xmm3, %xmm3 1066; X32-AVX1-NEXT: vpunpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7] 1067; X32-AVX1-NEXT: vpsraw $4, %xmm0, %xmm5 1068; X32-AVX1-NEXT: vpblendvb %xmm1, %xmm5, %xmm0, %xmm0 1069; X32-AVX1-NEXT: vpsraw $2, %xmm3, %xmm5 1070; X32-AVX1-NEXT: vpaddw %xmm1, %xmm1, %xmm1 1071; X32-AVX1-NEXT: vpblendvb %xmm1, %xmm5, %xmm3, %xmm3 1072; X32-AVX1-NEXT: vpsraw $2, %xmm0, %xmm5 1073; X32-AVX1-NEXT: vpblendvb %xmm1, %xmm5, %xmm0, %xmm0 1074; X32-AVX1-NEXT: vpsraw $1, %xmm3, %xmm5 1075; X32-AVX1-NEXT: vpaddw %xmm1, %xmm1, %xmm1 1076; X32-AVX1-NEXT: vpblendvb %xmm1, %xmm5, %xmm3, %xmm3 1077; X32-AVX1-NEXT: vpsraw $1, %xmm0, %xmm5 1078; X32-AVX1-NEXT: vpblendvb %xmm1, %xmm5, %xmm0, %xmm0 1079; X32-AVX1-NEXT: vpsrlw $8, %xmm4, %xmm1 1080; X32-AVX1-NEXT: vpsrlw $8, %xmm3, %xmm3 1081; X32-AVX1-NEXT: vpackuswb %xmm1, %xmm3, %xmm1 1082; X32-AVX1-NEXT: vpsrlw $8, %xmm2, %xmm2 1083; X32-AVX1-NEXT: vpsrlw $8, %xmm0, %xmm0 1084; X32-AVX1-NEXT: vpackuswb %xmm2, %xmm0, %xmm0 1085; X32-AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0 1086; X32-AVX1-NEXT: retl 1087; 1088; X32-AVX2-LABEL: splatvar_shift_v32i8: 1089; X32-AVX2: # %bb.0: 1090; X32-AVX2-NEXT: vpbroadcastb %xmm1, %ymm1 1091; X32-AVX2-NEXT: vpsllw $5, %ymm1, %ymm1 1092; X32-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] 1093; X32-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] 1094; X32-AVX2-NEXT: vpsraw $4, %ymm3, %ymm4 1095; X32-AVX2-NEXT: vpblendvb %ymm2, %ymm4, %ymm3, %ymm3 1096; X32-AVX2-NEXT: vpsraw $2, %ymm3, %ymm4 1097; X32-AVX2-NEXT: vpaddw %ymm2, %ymm2, %ymm2 1098; X32-AVX2-NEXT: vpblendvb %ymm2, %ymm4, %ymm3, %ymm3 1099; X32-AVX2-NEXT: vpsraw $1, %ymm3, %ymm4 1100; X32-AVX2-NEXT: vpaddw %ymm2, %ymm2, %ymm2 1101; X32-AVX2-NEXT: vpblendvb %ymm2, %ymm4, %ymm3, %ymm2 1102; X32-AVX2-NEXT: vpsrlw $8, %ymm2, %ymm2 1103; X32-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] 1104; X32-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] 1105; X32-AVX2-NEXT: vpsraw $4, %ymm0, %ymm3 1106; X32-AVX2-NEXT: vpblendvb %ymm1, %ymm3, %ymm0, %ymm0 1107; X32-AVX2-NEXT: vpsraw $2, %ymm0, %ymm3 1108; X32-AVX2-NEXT: vpaddw %ymm1, %ymm1, %ymm1 1109; X32-AVX2-NEXT: vpblendvb %ymm1, %ymm3, %ymm0, %ymm0 1110; X32-AVX2-NEXT: vpsraw $1, %ymm0, %ymm3 1111; X32-AVX2-NEXT: vpaddw %ymm1, %ymm1, %ymm1 1112; X32-AVX2-NEXT: vpblendvb %ymm1, %ymm3, %ymm0, %ymm0 1113; X32-AVX2-NEXT: vpsrlw $8, %ymm0, %ymm0 1114; X32-AVX2-NEXT: vpackuswb %ymm2, %ymm0, %ymm0 1115; X32-AVX2-NEXT: retl 1116 %splat = shufflevector <32 x i8> %b, <32 x i8> undef, <32 x i32> zeroinitializer 1117 %shift = ashr <32 x i8> %a, %splat 1118 ret <32 x i8> %shift 1119} 1120 1121; 1122; Constant Shifts 1123; 1124 1125define <4 x i64> @constant_shift_v4i64(<4 x i64> %a) nounwind { 1126; AVX1-LABEL: constant_shift_v4i64: 1127; AVX1: # %bb.0: 1128; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1 1129; AVX1-NEXT: vpsrlq $62, %xmm1, %xmm2 1130; AVX1-NEXT: vpsrlq $31, %xmm1, %xmm1 1131; AVX1-NEXT: vpblendw {{.*#+}} xmm1 = xmm1[0,1,2,3],xmm2[4,5,6,7] 1132; AVX1-NEXT: vmovdqa {{.*#+}} xmm2 = [4294967296,2] 1133; AVX1-NEXT: vpxor %xmm2, %xmm1, %xmm1 1134; AVX1-NEXT: vpsubq %xmm2, %xmm1, %xmm1 1135; AVX1-NEXT: vpsrlq $7, %xmm0, %xmm2 1136; AVX1-NEXT: vpsrlq $1, %xmm0, %xmm0 1137; AVX1-NEXT: vpblendw {{.*#+}} xmm0 = xmm0[0,1,2,3],xmm2[4,5,6,7] 1138; AVX1-NEXT: vmovdqa {{.*#+}} xmm2 = [4611686018427387904,72057594037927936] 1139; AVX1-NEXT: vpxor %xmm2, %xmm0, %xmm0 1140; AVX1-NEXT: vpsubq %xmm2, %xmm0, %xmm0 1141; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0 1142; AVX1-NEXT: retq 1143; 1144; AVX2-LABEL: constant_shift_v4i64: 1145; AVX2: # %bb.0: 1146; AVX2-NEXT: vpsrlvq {{.*}}(%rip), %ymm0, %ymm0 1147; AVX2-NEXT: vmovdqa {{.*#+}} ymm1 = [4611686018427387904,72057594037927936,4294967296,2] 1148; AVX2-NEXT: vpxor %ymm1, %ymm0, %ymm0 1149; AVX2-NEXT: vpsubq %ymm1, %ymm0, %ymm0 1150; AVX2-NEXT: retq 1151; 1152; XOPAVX1-LABEL: constant_shift_v4i64: 1153; XOPAVX1: # %bb.0: 1154; XOPAVX1-NEXT: vpshaq {{.*}}(%rip), %xmm0, %xmm1 1155; XOPAVX1-NEXT: vextractf128 $1, %ymm0, %xmm0 1156; XOPAVX1-NEXT: vpshaq {{.*}}(%rip), %xmm0, %xmm0 1157; XOPAVX1-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm0 1158; XOPAVX1-NEXT: retq 1159; 1160; XOPAVX2-LABEL: constant_shift_v4i64: 1161; XOPAVX2: # %bb.0: 1162; XOPAVX2-NEXT: vpsrlvq {{.*}}(%rip), %ymm0, %ymm0 1163; XOPAVX2-NEXT: vmovdqa {{.*#+}} ymm1 = [4611686018427387904,72057594037927936,4294967296,2] 1164; XOPAVX2-NEXT: vpxor %ymm1, %ymm0, %ymm0 1165; XOPAVX2-NEXT: vpsubq %ymm1, %ymm0, %ymm0 1166; XOPAVX2-NEXT: retq 1167; 1168; AVX512-LABEL: constant_shift_v4i64: 1169; AVX512: # %bb.0: 1170; AVX512-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm0 1171; AVX512-NEXT: vmovdqa {{.*#+}} ymm1 = [1,7,31,62] 1172; AVX512-NEXT: vpsravq %zmm1, %zmm0, %zmm0 1173; AVX512-NEXT: # kill: def $ymm0 killed $ymm0 killed $zmm0 1174; AVX512-NEXT: retq 1175; 1176; AVX512VL-LABEL: constant_shift_v4i64: 1177; AVX512VL: # %bb.0: 1178; AVX512VL-NEXT: vpsravq {{.*}}(%rip), %ymm0, %ymm0 1179; AVX512VL-NEXT: retq 1180; 1181; X32-AVX1-LABEL: constant_shift_v4i64: 1182; X32-AVX1: # %bb.0: 1183; X32-AVX1-NEXT: vmovdqa {{.*#+}} xmm1 = [31,0,62,0] 1184; X32-AVX1-NEXT: vmovdqa {{.*#+}} xmm2 = [0,2147483648,0,2147483648] 1185; X32-AVX1-NEXT: vpsrlq %xmm1, %xmm2, %xmm3 1186; X32-AVX1-NEXT: vpshufd {{.*#+}} xmm4 = xmm1[2,3,0,1] 1187; X32-AVX1-NEXT: vpsrlq %xmm4, %xmm2, %xmm5 1188; X32-AVX1-NEXT: vpblendw {{.*#+}} xmm3 = xmm3[0,1,2,3],xmm5[4,5,6,7] 1189; X32-AVX1-NEXT: vextractf128 $1, %ymm0, %xmm5 1190; X32-AVX1-NEXT: vpsrlq %xmm4, %xmm5, %xmm4 1191; X32-AVX1-NEXT: vpsrlq %xmm1, %xmm5, %xmm1 1192; X32-AVX1-NEXT: vpblendw {{.*#+}} xmm1 = xmm1[0,1,2,3],xmm4[4,5,6,7] 1193; X32-AVX1-NEXT: vpxor %xmm3, %xmm1, %xmm1 1194; X32-AVX1-NEXT: vpsubq %xmm3, %xmm1, %xmm1 1195; X32-AVX1-NEXT: vmovdqa {{.*#+}} xmm3 = [1,0,7,0] 1196; X32-AVX1-NEXT: vpsrlq %xmm3, %xmm2, %xmm4 1197; X32-AVX1-NEXT: vpshufd {{.*#+}} xmm5 = xmm3[2,3,0,1] 1198; X32-AVX1-NEXT: vpsrlq %xmm5, %xmm2, %xmm2 1199; X32-AVX1-NEXT: vpblendw {{.*#+}} xmm2 = xmm4[0,1,2,3],xmm2[4,5,6,7] 1200; X32-AVX1-NEXT: vpsrlq %xmm5, %xmm0, %xmm4 1201; X32-AVX1-NEXT: vpsrlq %xmm3, %xmm0, %xmm0 1202; X32-AVX1-NEXT: vpblendw {{.*#+}} xmm0 = xmm0[0,1,2,3],xmm4[4,5,6,7] 1203; X32-AVX1-NEXT: vpxor %xmm2, %xmm0, %xmm0 1204; X32-AVX1-NEXT: vpsubq %xmm2, %xmm0, %xmm0 1205; X32-AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0 1206; X32-AVX1-NEXT: retl 1207; 1208; X32-AVX2-LABEL: constant_shift_v4i64: 1209; X32-AVX2: # %bb.0: 1210; X32-AVX2-NEXT: vmovdqa {{.*#+}} ymm1 = [1,0,7,0,31,0,62,0] 1211; X32-AVX2-NEXT: vmovdqa {{.*#+}} ymm2 = [0,2147483648,0,2147483648,0,2147483648,0,2147483648] 1212; X32-AVX2-NEXT: vpsrlvq %ymm1, %ymm2, %ymm3 1213; X32-AVX2-NEXT: vpxor %ymm2, %ymm0, %ymm0 1214; X32-AVX2-NEXT: vpsrlvq %ymm1, %ymm0, %ymm0 1215; X32-AVX2-NEXT: vpsubq %ymm3, %ymm0, %ymm0 1216; X32-AVX2-NEXT: retl 1217 %shift = ashr <4 x i64> %a, <i64 1, i64 7, i64 31, i64 62> 1218 ret <4 x i64> %shift 1219} 1220 1221define <8 x i32> @constant_shift_v8i32(<8 x i32> %a) nounwind { 1222; AVX1-LABEL: constant_shift_v8i32: 1223; AVX1: # %bb.0: 1224; AVX1-NEXT: vpsrad $7, %xmm0, %xmm1 1225; AVX1-NEXT: vpsrad $5, %xmm0, %xmm2 1226; AVX1-NEXT: vpblendw {{.*#+}} xmm1 = xmm2[0,1,2,3],xmm1[4,5,6,7] 1227; AVX1-NEXT: vpsrad $6, %xmm0, %xmm2 1228; AVX1-NEXT: vpsrad $4, %xmm0, %xmm3 1229; AVX1-NEXT: vpblendw {{.*#+}} xmm2 = xmm3[0,1,2,3],xmm2[4,5,6,7] 1230; AVX1-NEXT: vpblendw {{.*#+}} xmm1 = xmm2[0,1],xmm1[2,3],xmm2[4,5],xmm1[6,7] 1231; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm0 1232; AVX1-NEXT: vpsrad $7, %xmm0, %xmm2 1233; AVX1-NEXT: vpsrad $9, %xmm0, %xmm3 1234; AVX1-NEXT: vpblendw {{.*#+}} xmm2 = xmm3[0,1,2,3],xmm2[4,5,6,7] 1235; AVX1-NEXT: vpsrad $8, %xmm0, %xmm0 1236; AVX1-NEXT: vpblendw {{.*#+}} xmm0 = xmm0[0,1],xmm2[2,3],xmm0[4,5],xmm2[6,7] 1237; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm0 1238; AVX1-NEXT: retq 1239; 1240; AVX2-LABEL: constant_shift_v8i32: 1241; AVX2: # %bb.0: 1242; AVX2-NEXT: vpsravd {{.*}}(%rip), %ymm0, %ymm0 1243; AVX2-NEXT: retq 1244; 1245; XOPAVX1-LABEL: constant_shift_v8i32: 1246; XOPAVX1: # %bb.0: 1247; XOPAVX1-NEXT: vpshad {{.*}}(%rip), %xmm0, %xmm1 1248; XOPAVX1-NEXT: vextractf128 $1, %ymm0, %xmm0 1249; XOPAVX1-NEXT: vpshad {{.*}}(%rip), %xmm0, %xmm0 1250; XOPAVX1-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm0 1251; XOPAVX1-NEXT: retq 1252; 1253; XOPAVX2-LABEL: constant_shift_v8i32: 1254; XOPAVX2: # %bb.0: 1255; XOPAVX2-NEXT: vpsravd {{.*}}(%rip), %ymm0, %ymm0 1256; XOPAVX2-NEXT: retq 1257; 1258; AVX512-LABEL: constant_shift_v8i32: 1259; AVX512: # %bb.0: 1260; AVX512-NEXT: vpsravd {{.*}}(%rip), %ymm0, %ymm0 1261; AVX512-NEXT: retq 1262; 1263; AVX512VL-LABEL: constant_shift_v8i32: 1264; AVX512VL: # %bb.0: 1265; AVX512VL-NEXT: vpsravd {{.*}}(%rip), %ymm0, %ymm0 1266; AVX512VL-NEXT: retq 1267; 1268; X32-AVX1-LABEL: constant_shift_v8i32: 1269; X32-AVX1: # %bb.0: 1270; X32-AVX1-NEXT: vpsrad $7, %xmm0, %xmm1 1271; X32-AVX1-NEXT: vpsrad $5, %xmm0, %xmm2 1272; X32-AVX1-NEXT: vpblendw {{.*#+}} xmm1 = xmm2[0,1,2,3],xmm1[4,5,6,7] 1273; X32-AVX1-NEXT: vpsrad $6, %xmm0, %xmm2 1274; X32-AVX1-NEXT: vpsrad $4, %xmm0, %xmm3 1275; X32-AVX1-NEXT: vpblendw {{.*#+}} xmm2 = xmm3[0,1,2,3],xmm2[4,5,6,7] 1276; X32-AVX1-NEXT: vpblendw {{.*#+}} xmm1 = xmm2[0,1],xmm1[2,3],xmm2[4,5],xmm1[6,7] 1277; X32-AVX1-NEXT: vextractf128 $1, %ymm0, %xmm0 1278; X32-AVX1-NEXT: vpsrad $7, %xmm0, %xmm2 1279; X32-AVX1-NEXT: vpsrad $9, %xmm0, %xmm3 1280; X32-AVX1-NEXT: vpblendw {{.*#+}} xmm2 = xmm3[0,1,2,3],xmm2[4,5,6,7] 1281; X32-AVX1-NEXT: vpsrad $8, %xmm0, %xmm0 1282; X32-AVX1-NEXT: vpblendw {{.*#+}} xmm0 = xmm0[0,1],xmm2[2,3],xmm0[4,5],xmm2[6,7] 1283; X32-AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm0 1284; X32-AVX1-NEXT: retl 1285; 1286; X32-AVX2-LABEL: constant_shift_v8i32: 1287; X32-AVX2: # %bb.0: 1288; X32-AVX2-NEXT: vpsravd {{\.LCPI.*}}, %ymm0, %ymm0 1289; X32-AVX2-NEXT: retl 1290 %shift = ashr <8 x i32> %a, <i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 8, i32 7> 1291 ret <8 x i32> %shift 1292} 1293 1294define <16 x i16> @constant_shift_v16i16(<16 x i16> %a) nounwind { 1295; AVX1-LABEL: constant_shift_v16i16: 1296; AVX1: # %bb.0: 1297; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1 1298; AVX1-NEXT: vpsraw $8, %xmm1, %xmm1 1299; AVX1-NEXT: vpsraw $4, %xmm1, %xmm2 1300; AVX1-NEXT: vpblendw {{.*#+}} xmm1 = xmm1[0,1,2,3],xmm2[4,5,6,7] 1301; AVX1-NEXT: vpsraw $2, %xmm1, %xmm2 1302; AVX1-NEXT: vpblendw {{.*#+}} xmm1 = xmm1[0,1],xmm2[2,3],xmm1[4,5],xmm2[6,7] 1303; AVX1-NEXT: vpsraw $1, %xmm1, %xmm2 1304; AVX1-NEXT: vpblendw {{.*#+}} xmm1 = xmm1[0],xmm2[1],xmm1[2],xmm2[3],xmm1[4],xmm2[5],xmm1[6],xmm2[7] 1305; AVX1-NEXT: vpsraw $4, %xmm0, %xmm2 1306; AVX1-NEXT: vpblendw {{.*#+}} xmm0 = xmm0[0,1,2,3],xmm2[4,5,6,7] 1307; AVX1-NEXT: vpsraw $2, %xmm0, %xmm2 1308; AVX1-NEXT: vpblendw {{.*#+}} xmm0 = xmm0[0,1],xmm2[2,3],xmm0[4,5],xmm2[6,7] 1309; AVX1-NEXT: vpsraw $1, %xmm0, %xmm2 1310; AVX1-NEXT: vpblendw {{.*#+}} xmm0 = xmm0[0],xmm2[1],xmm0[2],xmm2[3],xmm0[4],xmm2[5],xmm0[6],xmm2[7] 1311; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0 1312; AVX1-NEXT: retq 1313; 1314; AVX2-LABEL: constant_shift_v16i16: 1315; AVX2: # %bb.0: 1316; AVX2-NEXT: vpxor %xmm1, %xmm1, %xmm1 1317; AVX2-NEXT: vmovdqa {{.*#+}} ymm2 = [0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15] 1318; 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] 1319; 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] 1320; AVX2-NEXT: vpsravd %ymm3, %ymm4, %ymm3 1321; AVX2-NEXT: vpsrld $16, %ymm3, %ymm3 1322; 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] 1323; 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] 1324; AVX2-NEXT: vpsravd %ymm2, %ymm0, %ymm0 1325; AVX2-NEXT: vpsrld $16, %ymm0, %ymm0 1326; AVX2-NEXT: vpackusdw %ymm3, %ymm0, %ymm0 1327; AVX2-NEXT: retq 1328; 1329; XOPAVX1-LABEL: constant_shift_v16i16: 1330; XOPAVX1: # %bb.0: 1331; XOPAVX1-NEXT: vpshaw {{.*}}(%rip), %xmm0, %xmm1 1332; XOPAVX1-NEXT: vextractf128 $1, %ymm0, %xmm0 1333; XOPAVX1-NEXT: vpshaw {{.*}}(%rip), %xmm0, %xmm0 1334; XOPAVX1-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm0 1335; XOPAVX1-NEXT: retq 1336; 1337; XOPAVX2-LABEL: constant_shift_v16i16: 1338; XOPAVX2: # %bb.0: 1339; XOPAVX2-NEXT: vpshaw {{.*}}(%rip), %xmm0, %xmm1 1340; XOPAVX2-NEXT: vextracti128 $1, %ymm0, %xmm0 1341; XOPAVX2-NEXT: vpshaw {{.*}}(%rip), %xmm0, %xmm0 1342; XOPAVX2-NEXT: vinserti128 $1, %xmm0, %ymm1, %ymm0 1343; XOPAVX2-NEXT: retq 1344; 1345; AVX512DQ-LABEL: constant_shift_v16i16: 1346; AVX512DQ: # %bb.0: 1347; AVX512DQ-NEXT: vpmovsxwd %ymm0, %zmm0 1348; AVX512DQ-NEXT: vpsravd {{.*}}(%rip), %zmm0, %zmm0 1349; AVX512DQ-NEXT: vpmovdw %zmm0, %ymm0 1350; AVX512DQ-NEXT: retq 1351; 1352; AVX512BW-LABEL: constant_shift_v16i16: 1353; AVX512BW: # %bb.0: 1354; AVX512BW-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm0 1355; AVX512BW-NEXT: vmovdqa {{.*#+}} ymm1 = [0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15] 1356; AVX512BW-NEXT: vpsravw %zmm1, %zmm0, %zmm0 1357; AVX512BW-NEXT: # kill: def $ymm0 killed $ymm0 killed $zmm0 1358; AVX512BW-NEXT: retq 1359; 1360; AVX512DQVL-LABEL: constant_shift_v16i16: 1361; AVX512DQVL: # %bb.0: 1362; AVX512DQVL-NEXT: vpmovsxwd %ymm0, %zmm0 1363; AVX512DQVL-NEXT: vpsravd {{.*}}(%rip), %zmm0, %zmm0 1364; AVX512DQVL-NEXT: vpmovdw %zmm0, %ymm0 1365; AVX512DQVL-NEXT: retq 1366; 1367; AVX512BWVL-LABEL: constant_shift_v16i16: 1368; AVX512BWVL: # %bb.0: 1369; AVX512BWVL-NEXT: vpsravw {{.*}}(%rip), %ymm0, %ymm0 1370; AVX512BWVL-NEXT: retq 1371; 1372; X32-AVX1-LABEL: constant_shift_v16i16: 1373; X32-AVX1: # %bb.0: 1374; X32-AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1 1375; X32-AVX1-NEXT: vpsraw $8, %xmm1, %xmm1 1376; X32-AVX1-NEXT: vpsraw $4, %xmm1, %xmm2 1377; X32-AVX1-NEXT: vpblendw {{.*#+}} xmm1 = xmm1[0,1,2,3],xmm2[4,5,6,7] 1378; X32-AVX1-NEXT: vpsraw $2, %xmm1, %xmm2 1379; X32-AVX1-NEXT: vpblendw {{.*#+}} xmm1 = xmm1[0,1],xmm2[2,3],xmm1[4,5],xmm2[6,7] 1380; X32-AVX1-NEXT: vpsraw $1, %xmm1, %xmm2 1381; X32-AVX1-NEXT: vpblendw {{.*#+}} xmm1 = xmm1[0],xmm2[1],xmm1[2],xmm2[3],xmm1[4],xmm2[5],xmm1[6],xmm2[7] 1382; X32-AVX1-NEXT: vpsraw $4, %xmm0, %xmm2 1383; X32-AVX1-NEXT: vpblendw {{.*#+}} xmm0 = xmm0[0,1,2,3],xmm2[4,5,6,7] 1384; X32-AVX1-NEXT: vpsraw $2, %xmm0, %xmm2 1385; X32-AVX1-NEXT: vpblendw {{.*#+}} xmm0 = xmm0[0,1],xmm2[2,3],xmm0[4,5],xmm2[6,7] 1386; X32-AVX1-NEXT: vpsraw $1, %xmm0, %xmm2 1387; X32-AVX1-NEXT: vpblendw {{.*#+}} xmm0 = xmm0[0],xmm2[1],xmm0[2],xmm2[3],xmm0[4],xmm2[5],xmm0[6],xmm2[7] 1388; X32-AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0 1389; X32-AVX1-NEXT: retl 1390; 1391; X32-AVX2-LABEL: constant_shift_v16i16: 1392; X32-AVX2: # %bb.0: 1393; X32-AVX2-NEXT: vpxor %xmm1, %xmm1, %xmm1 1394; X32-AVX2-NEXT: vmovdqa {{.*#+}} ymm2 = [0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15] 1395; X32-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] 1396; X32-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] 1397; X32-AVX2-NEXT: vpsravd %ymm3, %ymm4, %ymm3 1398; X32-AVX2-NEXT: vpsrld $16, %ymm3, %ymm3 1399; X32-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] 1400; X32-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] 1401; X32-AVX2-NEXT: vpsravd %ymm2, %ymm0, %ymm0 1402; X32-AVX2-NEXT: vpsrld $16, %ymm0, %ymm0 1403; X32-AVX2-NEXT: vpackusdw %ymm3, %ymm0, %ymm0 1404; X32-AVX2-NEXT: retl 1405 %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> 1406 ret <16 x i16> %shift 1407} 1408 1409define <32 x i8> @constant_shift_v32i8(<32 x i8> %a) nounwind { 1410; AVX1-LABEL: constant_shift_v32i8: 1411; AVX1: # %bb.0: 1412; AVX1-NEXT: vmovdqa {{.*#+}} xmm1 = [8192,24640,41088,57536,49376,32928,16480,32] 1413; 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] 1414; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm3 1415; 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] 1416; AVX1-NEXT: vpsraw $4, %xmm4, %xmm5 1417; AVX1-NEXT: vpblendvb %xmm2, %xmm5, %xmm4, %xmm4 1418; AVX1-NEXT: vpsraw $2, %xmm4, %xmm5 1419; AVX1-NEXT: vpaddw %xmm2, %xmm2, %xmm6 1420; AVX1-NEXT: vpblendvb %xmm6, %xmm5, %xmm4, %xmm4 1421; AVX1-NEXT: vpsraw $1, %xmm4, %xmm5 1422; AVX1-NEXT: vpaddw %xmm6, %xmm6, %xmm9 1423; AVX1-NEXT: vpblendvb %xmm9, %xmm5, %xmm4, %xmm4 1424; AVX1-NEXT: vpsrlw $8, %xmm4, %xmm8 1425; 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] 1426; 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] 1427; AVX1-NEXT: vpsraw $4, %xmm3, %xmm5 1428; AVX1-NEXT: vpblendvb %xmm1, %xmm5, %xmm3, %xmm3 1429; AVX1-NEXT: vpsraw $2, %xmm3, %xmm5 1430; AVX1-NEXT: vpaddw %xmm1, %xmm1, %xmm4 1431; AVX1-NEXT: vpblendvb %xmm4, %xmm5, %xmm3, %xmm3 1432; AVX1-NEXT: vpsraw $1, %xmm3, %xmm5 1433; AVX1-NEXT: vpaddw %xmm4, %xmm4, %xmm7 1434; AVX1-NEXT: vpblendvb %xmm7, %xmm5, %xmm3, %xmm3 1435; AVX1-NEXT: vpsrlw $8, %xmm3, %xmm3 1436; AVX1-NEXT: vpackuswb %xmm8, %xmm3, %xmm8 1437; AVX1-NEXT: vpunpckhbw {{.*#+}} xmm5 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15] 1438; AVX1-NEXT: vpsraw $4, %xmm5, %xmm3 1439; AVX1-NEXT: vpblendvb %xmm2, %xmm3, %xmm5, %xmm2 1440; AVX1-NEXT: vpsraw $2, %xmm2, %xmm3 1441; AVX1-NEXT: vpblendvb %xmm6, %xmm3, %xmm2, %xmm2 1442; AVX1-NEXT: vpsraw $1, %xmm2, %xmm3 1443; AVX1-NEXT: vpblendvb %xmm9, %xmm3, %xmm2, %xmm2 1444; AVX1-NEXT: vpsrlw $8, %xmm2, %xmm2 1445; AVX1-NEXT: vpunpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7] 1446; AVX1-NEXT: vpsraw $4, %xmm0, %xmm3 1447; AVX1-NEXT: vpblendvb %xmm1, %xmm3, %xmm0, %xmm0 1448; AVX1-NEXT: vpsraw $2, %xmm0, %xmm1 1449; AVX1-NEXT: vpblendvb %xmm4, %xmm1, %xmm0, %xmm0 1450; AVX1-NEXT: vpsraw $1, %xmm0, %xmm1 1451; AVX1-NEXT: vpblendvb %xmm7, %xmm1, %xmm0, %xmm0 1452; AVX1-NEXT: vpsrlw $8, %xmm0, %xmm0 1453; AVX1-NEXT: vpackuswb %xmm2, %xmm0, %xmm0 1454; AVX1-NEXT: vinsertf128 $1, %xmm8, %ymm0, %ymm0 1455; AVX1-NEXT: retq 1456; 1457; AVX2-LABEL: constant_shift_v32i8: 1458; AVX2: # %bb.0: 1459; AVX2-NEXT: vmovdqa {{.*#+}} ymm1 = [8192,24640,41088,57536,49376,32928,16480,32,8192,24640,41088,57536,49376,32928,16480,32] 1460; 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] 1461; 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] 1462; AVX2-NEXT: vpsraw $4, %ymm3, %ymm4 1463; AVX2-NEXT: vpblendvb %ymm2, %ymm4, %ymm3, %ymm3 1464; AVX2-NEXT: vpsraw $2, %ymm3, %ymm4 1465; AVX2-NEXT: vpaddw %ymm2, %ymm2, %ymm2 1466; AVX2-NEXT: vpblendvb %ymm2, %ymm4, %ymm3, %ymm3 1467; AVX2-NEXT: vpsraw $1, %ymm3, %ymm4 1468; AVX2-NEXT: vpaddw %ymm2, %ymm2, %ymm2 1469; AVX2-NEXT: vpblendvb %ymm2, %ymm4, %ymm3, %ymm2 1470; AVX2-NEXT: vpsrlw $8, %ymm2, %ymm2 1471; 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] 1472; 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] 1473; AVX2-NEXT: vpsraw $4, %ymm0, %ymm3 1474; AVX2-NEXT: vpblendvb %ymm1, %ymm3, %ymm0, %ymm0 1475; AVX2-NEXT: vpsraw $2, %ymm0, %ymm3 1476; AVX2-NEXT: vpaddw %ymm1, %ymm1, %ymm1 1477; AVX2-NEXT: vpblendvb %ymm1, %ymm3, %ymm0, %ymm0 1478; AVX2-NEXT: vpsraw $1, %ymm0, %ymm3 1479; AVX2-NEXT: vpaddw %ymm1, %ymm1, %ymm1 1480; AVX2-NEXT: vpblendvb %ymm1, %ymm3, %ymm0, %ymm0 1481; AVX2-NEXT: vpsrlw $8, %ymm0, %ymm0 1482; AVX2-NEXT: vpackuswb %ymm2, %ymm0, %ymm0 1483; AVX2-NEXT: retq 1484; 1485; XOPAVX1-LABEL: constant_shift_v32i8: 1486; XOPAVX1: # %bb.0: 1487; XOPAVX1-NEXT: vextractf128 $1, %ymm0, %xmm1 1488; XOPAVX1-NEXT: vmovdqa {{.*#+}} xmm2 = [0,255,254,253,252,251,250,249,249,250,251,252,253,254,255,0] 1489; XOPAVX1-NEXT: vpshab %xmm2, %xmm1, %xmm1 1490; XOPAVX1-NEXT: vpshab %xmm2, %xmm0, %xmm0 1491; XOPAVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0 1492; XOPAVX1-NEXT: retq 1493; 1494; XOPAVX2-LABEL: constant_shift_v32i8: 1495; XOPAVX2: # %bb.0: 1496; XOPAVX2-NEXT: vextracti128 $1, %ymm0, %xmm1 1497; XOPAVX2-NEXT: vmovdqa {{.*#+}} xmm2 = [0,255,254,253,252,251,250,249,249,250,251,252,253,254,255,0] 1498; XOPAVX2-NEXT: vpshab %xmm2, %xmm1, %xmm1 1499; XOPAVX2-NEXT: vpshab %xmm2, %xmm0, %xmm0 1500; XOPAVX2-NEXT: vinserti128 $1, %xmm1, %ymm0, %ymm0 1501; XOPAVX2-NEXT: retq 1502; 1503; AVX512DQ-LABEL: constant_shift_v32i8: 1504; AVX512DQ: # %bb.0: 1505; AVX512DQ-NEXT: vmovdqa {{.*#+}} ymm1 = [8192,24640,41088,57536,49376,32928,16480,32,8192,24640,41088,57536,49376,32928,16480,32] 1506; 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] 1507; 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] 1508; AVX512DQ-NEXT: vpsraw $4, %ymm3, %ymm4 1509; AVX512DQ-NEXT: vpblendvb %ymm2, %ymm4, %ymm3, %ymm3 1510; AVX512DQ-NEXT: vpsraw $2, %ymm3, %ymm4 1511; AVX512DQ-NEXT: vpaddw %ymm2, %ymm2, %ymm2 1512; AVX512DQ-NEXT: vpblendvb %ymm2, %ymm4, %ymm3, %ymm3 1513; AVX512DQ-NEXT: vpsraw $1, %ymm3, %ymm4 1514; AVX512DQ-NEXT: vpaddw %ymm2, %ymm2, %ymm2 1515; AVX512DQ-NEXT: vpblendvb %ymm2, %ymm4, %ymm3, %ymm2 1516; AVX512DQ-NEXT: vpsrlw $8, %ymm2, %ymm2 1517; 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] 1518; 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] 1519; AVX512DQ-NEXT: vpsraw $4, %ymm0, %ymm3 1520; AVX512DQ-NEXT: vpblendvb %ymm1, %ymm3, %ymm0, %ymm0 1521; AVX512DQ-NEXT: vpsraw $2, %ymm0, %ymm3 1522; AVX512DQ-NEXT: vpaddw %ymm1, %ymm1, %ymm1 1523; AVX512DQ-NEXT: vpblendvb %ymm1, %ymm3, %ymm0, %ymm0 1524; AVX512DQ-NEXT: vpsraw $1, %ymm0, %ymm3 1525; AVX512DQ-NEXT: vpaddw %ymm1, %ymm1, %ymm1 1526; AVX512DQ-NEXT: vpblendvb %ymm1, %ymm3, %ymm0, %ymm0 1527; AVX512DQ-NEXT: vpsrlw $8, %ymm0, %ymm0 1528; AVX512DQ-NEXT: vpackuswb %ymm2, %ymm0, %ymm0 1529; AVX512DQ-NEXT: retq 1530; 1531; AVX512BW-LABEL: constant_shift_v32i8: 1532; AVX512BW: # %bb.0: 1533; AVX512BW-NEXT: vpmovsxbw %ymm0, %zmm0 1534; AVX512BW-NEXT: vpsravw {{.*}}(%rip), %zmm0, %zmm0 1535; AVX512BW-NEXT: vpmovwb %zmm0, %ymm0 1536; AVX512BW-NEXT: retq 1537; 1538; AVX512DQVL-LABEL: constant_shift_v32i8: 1539; AVX512DQVL: # %bb.0: 1540; AVX512DQVL-NEXT: vmovdqa {{.*#+}} ymm1 = [8192,24640,41088,57536,49376,32928,16480,32,8192,24640,41088,57536,49376,32928,16480,32] 1541; 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] 1542; 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] 1543; AVX512DQVL-NEXT: vpsraw $4, %ymm3, %ymm4 1544; AVX512DQVL-NEXT: vpblendvb %ymm2, %ymm4, %ymm3, %ymm3 1545; AVX512DQVL-NEXT: vpsraw $2, %ymm3, %ymm4 1546; AVX512DQVL-NEXT: vpaddw %ymm2, %ymm2, %ymm2 1547; AVX512DQVL-NEXT: vpblendvb %ymm2, %ymm4, %ymm3, %ymm3 1548; AVX512DQVL-NEXT: vpsraw $1, %ymm3, %ymm4 1549; AVX512DQVL-NEXT: vpaddw %ymm2, %ymm2, %ymm2 1550; AVX512DQVL-NEXT: vpblendvb %ymm2, %ymm4, %ymm3, %ymm2 1551; AVX512DQVL-NEXT: vpsrlw $8, %ymm2, %ymm2 1552; 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] 1553; 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] 1554; AVX512DQVL-NEXT: vpsraw $4, %ymm0, %ymm3 1555; AVX512DQVL-NEXT: vpblendvb %ymm1, %ymm3, %ymm0, %ymm0 1556; AVX512DQVL-NEXT: vpsraw $2, %ymm0, %ymm3 1557; AVX512DQVL-NEXT: vpaddw %ymm1, %ymm1, %ymm1 1558; AVX512DQVL-NEXT: vpblendvb %ymm1, %ymm3, %ymm0, %ymm0 1559; AVX512DQVL-NEXT: vpsraw $1, %ymm0, %ymm3 1560; AVX512DQVL-NEXT: vpaddw %ymm1, %ymm1, %ymm1 1561; AVX512DQVL-NEXT: vpblendvb %ymm1, %ymm3, %ymm0, %ymm0 1562; AVX512DQVL-NEXT: vpsrlw $8, %ymm0, %ymm0 1563; AVX512DQVL-NEXT: vpackuswb %ymm2, %ymm0, %ymm0 1564; AVX512DQVL-NEXT: retq 1565; 1566; AVX512BWVL-LABEL: constant_shift_v32i8: 1567; AVX512BWVL: # %bb.0: 1568; AVX512BWVL-NEXT: vpmovsxbw %ymm0, %zmm0 1569; AVX512BWVL-NEXT: vpsravw {{.*}}(%rip), %zmm0, %zmm0 1570; AVX512BWVL-NEXT: vpmovwb %zmm0, %ymm0 1571; AVX512BWVL-NEXT: retq 1572; 1573; X32-AVX1-LABEL: constant_shift_v32i8: 1574; X32-AVX1: # %bb.0: 1575; X32-AVX1-NEXT: vmovdqa {{.*#+}} xmm1 = [8192,24640,41088,57536,49376,32928,16480,32] 1576; X32-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] 1577; X32-AVX1-NEXT: vextractf128 $1, %ymm0, %xmm3 1578; X32-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] 1579; X32-AVX1-NEXT: vpsraw $4, %xmm4, %xmm5 1580; X32-AVX1-NEXT: vpblendvb %xmm2, %xmm5, %xmm4, %xmm4 1581; X32-AVX1-NEXT: vpunpckhbw {{.*#+}} xmm5 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15] 1582; X32-AVX1-NEXT: vpsraw $4, %xmm5, %xmm6 1583; X32-AVX1-NEXT: vpblendvb %xmm2, %xmm6, %xmm5, %xmm5 1584; X32-AVX1-NEXT: vpsraw $2, %xmm4, %xmm6 1585; X32-AVX1-NEXT: vpaddw %xmm2, %xmm2, %xmm2 1586; X32-AVX1-NEXT: vpblendvb %xmm2, %xmm6, %xmm4, %xmm4 1587; X32-AVX1-NEXT: vpsraw $2, %xmm5, %xmm6 1588; X32-AVX1-NEXT: vpblendvb %xmm2, %xmm6, %xmm5, %xmm5 1589; X32-AVX1-NEXT: vpsraw $1, %xmm4, %xmm6 1590; X32-AVX1-NEXT: vpaddw %xmm2, %xmm2, %xmm2 1591; X32-AVX1-NEXT: vpblendvb %xmm2, %xmm6, %xmm4, %xmm4 1592; X32-AVX1-NEXT: vpsraw $1, %xmm5, %xmm6 1593; X32-AVX1-NEXT: vpblendvb %xmm2, %xmm6, %xmm5, %xmm2 1594; X32-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] 1595; X32-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] 1596; X32-AVX1-NEXT: vpsraw $4, %xmm3, %xmm5 1597; X32-AVX1-NEXT: vpblendvb %xmm1, %xmm5, %xmm3, %xmm3 1598; X32-AVX1-NEXT: vpunpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7] 1599; X32-AVX1-NEXT: vpsraw $4, %xmm0, %xmm5 1600; X32-AVX1-NEXT: vpblendvb %xmm1, %xmm5, %xmm0, %xmm0 1601; X32-AVX1-NEXT: vpsraw $2, %xmm3, %xmm5 1602; X32-AVX1-NEXT: vpaddw %xmm1, %xmm1, %xmm1 1603; X32-AVX1-NEXT: vpblendvb %xmm1, %xmm5, %xmm3, %xmm3 1604; X32-AVX1-NEXT: vpsraw $2, %xmm0, %xmm5 1605; X32-AVX1-NEXT: vpblendvb %xmm1, %xmm5, %xmm0, %xmm0 1606; X32-AVX1-NEXT: vpsraw $1, %xmm3, %xmm5 1607; X32-AVX1-NEXT: vpaddw %xmm1, %xmm1, %xmm1 1608; X32-AVX1-NEXT: vpblendvb %xmm1, %xmm5, %xmm3, %xmm3 1609; X32-AVX1-NEXT: vpsraw $1, %xmm0, %xmm5 1610; X32-AVX1-NEXT: vpblendvb %xmm1, %xmm5, %xmm0, %xmm0 1611; X32-AVX1-NEXT: vpsrlw $8, %xmm4, %xmm1 1612; X32-AVX1-NEXT: vpsrlw $8, %xmm3, %xmm3 1613; X32-AVX1-NEXT: vpackuswb %xmm1, %xmm3, %xmm1 1614; X32-AVX1-NEXT: vpsrlw $8, %xmm2, %xmm2 1615; X32-AVX1-NEXT: vpsrlw $8, %xmm0, %xmm0 1616; X32-AVX1-NEXT: vpackuswb %xmm2, %xmm0, %xmm0 1617; X32-AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0 1618; X32-AVX1-NEXT: retl 1619; 1620; X32-AVX2-LABEL: constant_shift_v32i8: 1621; X32-AVX2: # %bb.0: 1622; X32-AVX2-NEXT: vmovdqa {{.*#+}} ymm1 = [8192,24640,41088,57536,49376,32928,16480,32,8192,24640,41088,57536,49376,32928,16480,32] 1623; X32-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] 1624; X32-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] 1625; X32-AVX2-NEXT: vpsraw $4, %ymm3, %ymm4 1626; X32-AVX2-NEXT: vpblendvb %ymm2, %ymm4, %ymm3, %ymm3 1627; X32-AVX2-NEXT: vpsraw $2, %ymm3, %ymm4 1628; X32-AVX2-NEXT: vpaddw %ymm2, %ymm2, %ymm2 1629; X32-AVX2-NEXT: vpblendvb %ymm2, %ymm4, %ymm3, %ymm3 1630; X32-AVX2-NEXT: vpsraw $1, %ymm3, %ymm4 1631; X32-AVX2-NEXT: vpaddw %ymm2, %ymm2, %ymm2 1632; X32-AVX2-NEXT: vpblendvb %ymm2, %ymm4, %ymm3, %ymm2 1633; X32-AVX2-NEXT: vpsrlw $8, %ymm2, %ymm2 1634; X32-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] 1635; X32-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] 1636; X32-AVX2-NEXT: vpsraw $4, %ymm0, %ymm3 1637; X32-AVX2-NEXT: vpblendvb %ymm1, %ymm3, %ymm0, %ymm0 1638; X32-AVX2-NEXT: vpsraw $2, %ymm0, %ymm3 1639; X32-AVX2-NEXT: vpaddw %ymm1, %ymm1, %ymm1 1640; X32-AVX2-NEXT: vpblendvb %ymm1, %ymm3, %ymm0, %ymm0 1641; X32-AVX2-NEXT: vpsraw $1, %ymm0, %ymm3 1642; X32-AVX2-NEXT: vpaddw %ymm1, %ymm1, %ymm1 1643; X32-AVX2-NEXT: vpblendvb %ymm1, %ymm3, %ymm0, %ymm0 1644; X32-AVX2-NEXT: vpsrlw $8, %ymm0, %ymm0 1645; X32-AVX2-NEXT: vpackuswb %ymm2, %ymm0, %ymm0 1646; X32-AVX2-NEXT: retl 1647 %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> 1648 ret <32 x i8> %shift 1649} 1650 1651; 1652; Uniform Constant Shifts 1653; 1654 1655define <4 x i64> @splatconstant_shift_v4i64(<4 x i64> %a) nounwind { 1656; AVX1-LABEL: splatconstant_shift_v4i64: 1657; AVX1: # %bb.0: 1658; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1 1659; AVX1-NEXT: vpsrad $7, %xmm1, %xmm2 1660; AVX1-NEXT: vpsrlq $7, %xmm1, %xmm1 1661; AVX1-NEXT: vpblendw {{.*#+}} xmm1 = xmm1[0,1],xmm2[2,3],xmm1[4,5],xmm2[6,7] 1662; AVX1-NEXT: vpsrad $7, %xmm0, %xmm2 1663; AVX1-NEXT: vpsrlq $7, %xmm0, %xmm0 1664; AVX1-NEXT: vpblendw {{.*#+}} xmm0 = xmm0[0,1],xmm2[2,3],xmm0[4,5],xmm2[6,7] 1665; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0 1666; AVX1-NEXT: retq 1667; 1668; AVX2-LABEL: splatconstant_shift_v4i64: 1669; AVX2: # %bb.0: 1670; AVX2-NEXT: vpsrad $7, %ymm0, %ymm1 1671; AVX2-NEXT: vpsrlq $7, %ymm0, %ymm0 1672; AVX2-NEXT: vpblendd {{.*#+}} ymm0 = ymm0[0],ymm1[1],ymm0[2],ymm1[3],ymm0[4],ymm1[5],ymm0[6],ymm1[7] 1673; AVX2-NEXT: retq 1674; 1675; XOPAVX1-LABEL: splatconstant_shift_v4i64: 1676; XOPAVX1: # %bb.0: 1677; XOPAVX1-NEXT: vextractf128 $1, %ymm0, %xmm1 1678; XOPAVX1-NEXT: vmovdqa {{.*#+}} xmm2 = [18446744073709551609,18446744073709551609] 1679; XOPAVX1-NEXT: vpshaq %xmm2, %xmm1, %xmm1 1680; XOPAVX1-NEXT: vpshaq %xmm2, %xmm0, %xmm0 1681; XOPAVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0 1682; XOPAVX1-NEXT: retq 1683; 1684; XOPAVX2-LABEL: splatconstant_shift_v4i64: 1685; XOPAVX2: # %bb.0: 1686; XOPAVX2-NEXT: vpsrad $7, %ymm0, %ymm1 1687; XOPAVX2-NEXT: vpsrlq $7, %ymm0, %ymm0 1688; XOPAVX2-NEXT: vpblendd {{.*#+}} ymm0 = ymm0[0],ymm1[1],ymm0[2],ymm1[3],ymm0[4],ymm1[5],ymm0[6],ymm1[7] 1689; XOPAVX2-NEXT: retq 1690; 1691; AVX512-LABEL: splatconstant_shift_v4i64: 1692; AVX512: # %bb.0: 1693; AVX512-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm0 1694; AVX512-NEXT: vpsraq $7, %zmm0, %zmm0 1695; AVX512-NEXT: # kill: def $ymm0 killed $ymm0 killed $zmm0 1696; AVX512-NEXT: retq 1697; 1698; AVX512VL-LABEL: splatconstant_shift_v4i64: 1699; AVX512VL: # %bb.0: 1700; AVX512VL-NEXT: vpsraq $7, %ymm0, %ymm0 1701; AVX512VL-NEXT: retq 1702; 1703; X32-AVX1-LABEL: splatconstant_shift_v4i64: 1704; X32-AVX1: # %bb.0: 1705; X32-AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1 1706; X32-AVX1-NEXT: vpsrad $7, %xmm1, %xmm2 1707; X32-AVX1-NEXT: vpsrlq $7, %xmm1, %xmm1 1708; X32-AVX1-NEXT: vpblendw {{.*#+}} xmm1 = xmm1[0,1],xmm2[2,3],xmm1[4,5],xmm2[6,7] 1709; X32-AVX1-NEXT: vpsrad $7, %xmm0, %xmm2 1710; X32-AVX1-NEXT: vpsrlq $7, %xmm0, %xmm0 1711; X32-AVX1-NEXT: vpblendw {{.*#+}} xmm0 = xmm0[0,1],xmm2[2,3],xmm0[4,5],xmm2[6,7] 1712; X32-AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0 1713; X32-AVX1-NEXT: retl 1714; 1715; X32-AVX2-LABEL: splatconstant_shift_v4i64: 1716; X32-AVX2: # %bb.0: 1717; X32-AVX2-NEXT: vpsrad $7, %ymm0, %ymm1 1718; X32-AVX2-NEXT: vpsrlq $7, %ymm0, %ymm0 1719; X32-AVX2-NEXT: vpblendd {{.*#+}} ymm0 = ymm0[0],ymm1[1],ymm0[2],ymm1[3],ymm0[4],ymm1[5],ymm0[6],ymm1[7] 1720; X32-AVX2-NEXT: retl 1721 %shift = ashr <4 x i64> %a, <i64 7, i64 7, i64 7, i64 7> 1722 ret <4 x i64> %shift 1723} 1724 1725define <8 x i32> @splatconstant_shift_v8i32(<8 x i32> %a) nounwind { 1726; AVX1-LABEL: splatconstant_shift_v8i32: 1727; AVX1: # %bb.0: 1728; AVX1-NEXT: vpsrad $5, %xmm0, %xmm1 1729; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm0 1730; AVX1-NEXT: vpsrad $5, %xmm0, %xmm0 1731; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm0 1732; AVX1-NEXT: retq 1733; 1734; AVX2-LABEL: splatconstant_shift_v8i32: 1735; AVX2: # %bb.0: 1736; AVX2-NEXT: vpsrad $5, %ymm0, %ymm0 1737; AVX2-NEXT: retq 1738; 1739; XOPAVX1-LABEL: splatconstant_shift_v8i32: 1740; XOPAVX1: # %bb.0: 1741; XOPAVX1-NEXT: vpsrad $5, %xmm0, %xmm1 1742; XOPAVX1-NEXT: vextractf128 $1, %ymm0, %xmm0 1743; XOPAVX1-NEXT: vpsrad $5, %xmm0, %xmm0 1744; XOPAVX1-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm0 1745; XOPAVX1-NEXT: retq 1746; 1747; XOPAVX2-LABEL: splatconstant_shift_v8i32: 1748; XOPAVX2: # %bb.0: 1749; XOPAVX2-NEXT: vpsrad $5, %ymm0, %ymm0 1750; XOPAVX2-NEXT: retq 1751; 1752; AVX512-LABEL: splatconstant_shift_v8i32: 1753; AVX512: # %bb.0: 1754; AVX512-NEXT: vpsrad $5, %ymm0, %ymm0 1755; AVX512-NEXT: retq 1756; 1757; AVX512VL-LABEL: splatconstant_shift_v8i32: 1758; AVX512VL: # %bb.0: 1759; AVX512VL-NEXT: vpsrad $5, %ymm0, %ymm0 1760; AVX512VL-NEXT: retq 1761; 1762; X32-AVX1-LABEL: splatconstant_shift_v8i32: 1763; X32-AVX1: # %bb.0: 1764; X32-AVX1-NEXT: vpsrad $5, %xmm0, %xmm1 1765; X32-AVX1-NEXT: vextractf128 $1, %ymm0, %xmm0 1766; X32-AVX1-NEXT: vpsrad $5, %xmm0, %xmm0 1767; X32-AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm0 1768; X32-AVX1-NEXT: retl 1769; 1770; X32-AVX2-LABEL: splatconstant_shift_v8i32: 1771; X32-AVX2: # %bb.0: 1772; X32-AVX2-NEXT: vpsrad $5, %ymm0, %ymm0 1773; X32-AVX2-NEXT: retl 1774 %shift = ashr <8 x i32> %a, <i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5> 1775 ret <8 x i32> %shift 1776} 1777 1778define <16 x i16> @splatconstant_shift_v16i16(<16 x i16> %a) nounwind { 1779; AVX1-LABEL: splatconstant_shift_v16i16: 1780; AVX1: # %bb.0: 1781; AVX1-NEXT: vpsraw $3, %xmm0, %xmm1 1782; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm0 1783; AVX1-NEXT: vpsraw $3, %xmm0, %xmm0 1784; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm0 1785; AVX1-NEXT: retq 1786; 1787; AVX2-LABEL: splatconstant_shift_v16i16: 1788; AVX2: # %bb.0: 1789; AVX2-NEXT: vpsraw $3, %ymm0, %ymm0 1790; AVX2-NEXT: retq 1791; 1792; XOPAVX1-LABEL: splatconstant_shift_v16i16: 1793; XOPAVX1: # %bb.0: 1794; XOPAVX1-NEXT: vpsraw $3, %xmm0, %xmm1 1795; XOPAVX1-NEXT: vextractf128 $1, %ymm0, %xmm0 1796; XOPAVX1-NEXT: vpsraw $3, %xmm0, %xmm0 1797; XOPAVX1-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm0 1798; XOPAVX1-NEXT: retq 1799; 1800; XOPAVX2-LABEL: splatconstant_shift_v16i16: 1801; XOPAVX2: # %bb.0: 1802; XOPAVX2-NEXT: vpsraw $3, %ymm0, %ymm0 1803; XOPAVX2-NEXT: retq 1804; 1805; AVX512-LABEL: splatconstant_shift_v16i16: 1806; AVX512: # %bb.0: 1807; AVX512-NEXT: vpsraw $3, %ymm0, %ymm0 1808; AVX512-NEXT: retq 1809; 1810; AVX512VL-LABEL: splatconstant_shift_v16i16: 1811; AVX512VL: # %bb.0: 1812; AVX512VL-NEXT: vpsraw $3, %ymm0, %ymm0 1813; AVX512VL-NEXT: retq 1814; 1815; X32-AVX1-LABEL: splatconstant_shift_v16i16: 1816; X32-AVX1: # %bb.0: 1817; X32-AVX1-NEXT: vpsraw $3, %xmm0, %xmm1 1818; X32-AVX1-NEXT: vextractf128 $1, %ymm0, %xmm0 1819; X32-AVX1-NEXT: vpsraw $3, %xmm0, %xmm0 1820; X32-AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm0 1821; X32-AVX1-NEXT: retl 1822; 1823; X32-AVX2-LABEL: splatconstant_shift_v16i16: 1824; X32-AVX2: # %bb.0: 1825; X32-AVX2-NEXT: vpsraw $3, %ymm0, %ymm0 1826; X32-AVX2-NEXT: retl 1827 %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> 1828 ret <16 x i16> %shift 1829} 1830 1831define <32 x i8> @splatconstant_shift_v32i8(<32 x i8> %a) nounwind { 1832; AVX1-LABEL: splatconstant_shift_v32i8: 1833; AVX1: # %bb.0: 1834; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1 1835; AVX1-NEXT: vpsrlw $3, %xmm1, %xmm1 1836; AVX1-NEXT: vmovdqa {{.*#+}} xmm2 = [31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31] 1837; AVX1-NEXT: vpand %xmm2, %xmm1, %xmm1 1838; AVX1-NEXT: vmovdqa {{.*#+}} xmm3 = [16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16] 1839; AVX1-NEXT: vpxor %xmm3, %xmm1, %xmm1 1840; AVX1-NEXT: vpsubb %xmm3, %xmm1, %xmm1 1841; AVX1-NEXT: vpsrlw $3, %xmm0, %xmm0 1842; AVX1-NEXT: vpand %xmm2, %xmm0, %xmm0 1843; AVX1-NEXT: vpxor %xmm3, %xmm0, %xmm0 1844; AVX1-NEXT: vpsubb %xmm3, %xmm0, %xmm0 1845; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0 1846; AVX1-NEXT: retq 1847; 1848; AVX2-LABEL: splatconstant_shift_v32i8: 1849; AVX2: # %bb.0: 1850; AVX2-NEXT: vpsrlw $3, %ymm0, %ymm0 1851; AVX2-NEXT: vpand {{.*}}(%rip), %ymm0, %ymm0 1852; 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] 1853; AVX2-NEXT: vpxor %ymm1, %ymm0, %ymm0 1854; AVX2-NEXT: vpsubb %ymm1, %ymm0, %ymm0 1855; AVX2-NEXT: retq 1856; 1857; XOPAVX1-LABEL: splatconstant_shift_v32i8: 1858; XOPAVX1: # %bb.0: 1859; XOPAVX1-NEXT: vextractf128 $1, %ymm0, %xmm1 1860; XOPAVX1-NEXT: vmovdqa {{.*#+}} xmm2 = [253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253] 1861; XOPAVX1-NEXT: vpshab %xmm2, %xmm1, %xmm1 1862; XOPAVX1-NEXT: vpshab %xmm2, %xmm0, %xmm0 1863; XOPAVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0 1864; XOPAVX1-NEXT: retq 1865; 1866; XOPAVX2-LABEL: splatconstant_shift_v32i8: 1867; XOPAVX2: # %bb.0: 1868; XOPAVX2-NEXT: vpsrlw $3, %ymm0, %ymm0 1869; XOPAVX2-NEXT: vpand {{.*}}(%rip), %ymm0, %ymm0 1870; 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] 1871; XOPAVX2-NEXT: vpxor %ymm1, %ymm0, %ymm0 1872; XOPAVX2-NEXT: vpsubb %ymm1, %ymm0, %ymm0 1873; XOPAVX2-NEXT: retq 1874; 1875; AVX512-LABEL: splatconstant_shift_v32i8: 1876; AVX512: # %bb.0: 1877; AVX512-NEXT: vpsrlw $3, %ymm0, %ymm0 1878; AVX512-NEXT: vpand {{.*}}(%rip), %ymm0, %ymm0 1879; 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] 1880; AVX512-NEXT: vpxor %ymm1, %ymm0, %ymm0 1881; AVX512-NEXT: vpsubb %ymm1, %ymm0, %ymm0 1882; AVX512-NEXT: retq 1883; 1884; AVX512VL-LABEL: splatconstant_shift_v32i8: 1885; AVX512VL: # %bb.0: 1886; AVX512VL-NEXT: vpsrlw $3, %ymm0, %ymm0 1887; AVX512VL-NEXT: vpand {{.*}}(%rip), %ymm0, %ymm0 1888; 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] 1889; AVX512VL-NEXT: vpxor %ymm1, %ymm0, %ymm0 1890; AVX512VL-NEXT: vpsubb %ymm1, %ymm0, %ymm0 1891; AVX512VL-NEXT: retq 1892; 1893; X32-AVX1-LABEL: splatconstant_shift_v32i8: 1894; X32-AVX1: # %bb.0: 1895; X32-AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1 1896; X32-AVX1-NEXT: vpsrlw $3, %xmm1, %xmm1 1897; X32-AVX1-NEXT: vmovdqa {{.*#+}} xmm2 = [31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31] 1898; X32-AVX1-NEXT: vpand %xmm2, %xmm1, %xmm1 1899; X32-AVX1-NEXT: vmovdqa {{.*#+}} xmm3 = [16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16] 1900; X32-AVX1-NEXT: vpxor %xmm3, %xmm1, %xmm1 1901; X32-AVX1-NEXT: vpsubb %xmm3, %xmm1, %xmm1 1902; X32-AVX1-NEXT: vpsrlw $3, %xmm0, %xmm0 1903; X32-AVX1-NEXT: vpand %xmm2, %xmm0, %xmm0 1904; X32-AVX1-NEXT: vpxor %xmm3, %xmm0, %xmm0 1905; X32-AVX1-NEXT: vpsubb %xmm3, %xmm0, %xmm0 1906; X32-AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0 1907; X32-AVX1-NEXT: retl 1908; 1909; X32-AVX2-LABEL: splatconstant_shift_v32i8: 1910; X32-AVX2: # %bb.0: 1911; X32-AVX2-NEXT: vpsrlw $3, %ymm0, %ymm0 1912; X32-AVX2-NEXT: vpand {{\.LCPI.*}}, %ymm0, %ymm0 1913; X32-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] 1914; X32-AVX2-NEXT: vpxor %ymm1, %ymm0, %ymm0 1915; X32-AVX2-NEXT: vpsubb %ymm1, %ymm0, %ymm0 1916; X32-AVX2-NEXT: retl 1917 %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> 1918 ret <32 x i8> %shift 1919} 1920