• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512bw,+avx512vl,+prefer-256-bit | FileCheck %s --check-prefix=ALL --check-prefix=AVX256 --check-prefix=AVX256BW --check-prefix=AVX256BWVL
3; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512bw,+avx512vl,-prefer-256-bit | FileCheck %s --check-prefix=ALL --check-prefix=AVX512 --check-prefix=AVX512BW --check-prefix=AVX512BWVL
4; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512vl,+prefer-256-bit | FileCheck %s --check-prefix=ALL --check-prefix=AVX256 --check-prefix=AVX256VL
5; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512vl,-prefer-256-bit | FileCheck %s --check-prefix=ALL --check-prefix=AVX512 --check-prefix=AVX512VL
6; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512bw,+prefer-256-bit | FileCheck %s --check-prefix=ALL --check-prefix=AVX512 --check-prefix=AVX512BW --check-prefix=AVX512BWNOVL
7; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512bw,-prefer-256-bit | FileCheck %s --check-prefix=ALL --check-prefix=AVX512 --check-prefix=AVX512BW --check-prefix=AVX512BWNOVL
8
9define <32 x i8> @var_shl_v32i8(<32 x i8> %a, <32 x i8> %b) {
10; AVX256-LABEL: var_shl_v32i8:
11; AVX256:       # %bb.0:
12; AVX256-NEXT:    vpsllw $5, %ymm1, %ymm1
13; AVX256-NEXT:    vpsllw $4, %ymm0, %ymm2
14; AVX256-NEXT:    vpand {{.*}}(%rip), %ymm2, %ymm2
15; AVX256-NEXT:    vpblendvb %ymm1, %ymm2, %ymm0, %ymm0
16; AVX256-NEXT:    vpsllw $2, %ymm0, %ymm2
17; AVX256-NEXT:    vpand {{.*}}(%rip), %ymm2, %ymm2
18; AVX256-NEXT:    vpaddb %ymm1, %ymm1, %ymm1
19; AVX256-NEXT:    vpblendvb %ymm1, %ymm2, %ymm0, %ymm0
20; AVX256-NEXT:    vpaddb %ymm0, %ymm0, %ymm2
21; AVX256-NEXT:    vpaddb %ymm1, %ymm1, %ymm1
22; AVX256-NEXT:    vpblendvb %ymm1, %ymm2, %ymm0, %ymm0
23; AVX256-NEXT:    retq
24;
25; AVX512BW-LABEL: var_shl_v32i8:
26; AVX512BW:       # %bb.0:
27; 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
28; AVX512BW-NEXT:    vpmovzxbw {{.*#+}} zmm0 = ymm0[0],zero,ymm0[1],zero,ymm0[2],zero,ymm0[3],zero,ymm0[4],zero,ymm0[5],zero,ymm0[6],zero,ymm0[7],zero,ymm0[8],zero,ymm0[9],zero,ymm0[10],zero,ymm0[11],zero,ymm0[12],zero,ymm0[13],zero,ymm0[14],zero,ymm0[15],zero,ymm0[16],zero,ymm0[17],zero,ymm0[18],zero,ymm0[19],zero,ymm0[20],zero,ymm0[21],zero,ymm0[22],zero,ymm0[23],zero,ymm0[24],zero,ymm0[25],zero,ymm0[26],zero,ymm0[27],zero,ymm0[28],zero,ymm0[29],zero,ymm0[30],zero,ymm0[31],zero
29; AVX512BW-NEXT:    vpsllvw %zmm1, %zmm0, %zmm0
30; AVX512BW-NEXT:    vpmovwb %zmm0, %ymm0
31; AVX512BW-NEXT:    retq
32;
33; AVX512VL-LABEL: var_shl_v32i8:
34; AVX512VL:       # %bb.0:
35; AVX512VL-NEXT:    vpsllw $5, %ymm1, %ymm1
36; AVX512VL-NEXT:    vpsllw $4, %ymm0, %ymm2
37; AVX512VL-NEXT:    vpand {{.*}}(%rip), %ymm2, %ymm2
38; AVX512VL-NEXT:    vpblendvb %ymm1, %ymm2, %ymm0, %ymm0
39; AVX512VL-NEXT:    vpsllw $2, %ymm0, %ymm2
40; AVX512VL-NEXT:    vpand {{.*}}(%rip), %ymm2, %ymm2
41; AVX512VL-NEXT:    vpaddb %ymm1, %ymm1, %ymm1
42; AVX512VL-NEXT:    vpblendvb %ymm1, %ymm2, %ymm0, %ymm0
43; AVX512VL-NEXT:    vpaddb %ymm0, %ymm0, %ymm2
44; AVX512VL-NEXT:    vpaddb %ymm1, %ymm1, %ymm1
45; AVX512VL-NEXT:    vpblendvb %ymm1, %ymm2, %ymm0, %ymm0
46; AVX512VL-NEXT:    retq
47  %shift = shl <32 x i8> %a, %b
48  ret <32 x i8> %shift
49}
50
51define <16 x i16> @var_shl_v16i16(<16 x i16> %a, <16 x i16> %b) {
52; AVX256BW-LABEL: var_shl_v16i16:
53; AVX256BW:       # %bb.0:
54; AVX256BW-NEXT:    vpsllvw %ymm1, %ymm0, %ymm0
55; AVX256BW-NEXT:    retq
56;
57; AVX512BWVL-LABEL: var_shl_v16i16:
58; AVX512BWVL:       # %bb.0:
59; AVX512BWVL-NEXT:    vpsllvw %ymm1, %ymm0, %ymm0
60; AVX512BWVL-NEXT:    retq
61;
62; AVX256VL-LABEL: var_shl_v16i16:
63; AVX256VL:       # %bb.0:
64; AVX256VL-NEXT:    vpxor %xmm2, %xmm2, %xmm2
65; AVX256VL-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]
66; AVX256VL-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]
67; AVX256VL-NEXT:    vpsllvd %ymm3, %ymm4, %ymm3
68; AVX256VL-NEXT:    vpsrld $16, %ymm3, %ymm3
69; AVX256VL-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]
70; AVX256VL-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]
71; AVX256VL-NEXT:    vpsllvd %ymm1, %ymm0, %ymm0
72; AVX256VL-NEXT:    vpsrld $16, %ymm0, %ymm0
73; AVX256VL-NEXT:    vpackusdw %ymm3, %ymm0, %ymm0
74; AVX256VL-NEXT:    retq
75;
76; AVX512VL-LABEL: var_shl_v16i16:
77; AVX512VL:       # %bb.0:
78; AVX512VL-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
79; AVX512VL-NEXT:    vpmovzxwd {{.*#+}} zmm0 = ymm0[0],zero,ymm0[1],zero,ymm0[2],zero,ymm0[3],zero,ymm0[4],zero,ymm0[5],zero,ymm0[6],zero,ymm0[7],zero,ymm0[8],zero,ymm0[9],zero,ymm0[10],zero,ymm0[11],zero,ymm0[12],zero,ymm0[13],zero,ymm0[14],zero,ymm0[15],zero
80; AVX512VL-NEXT:    vpsllvd %zmm1, %zmm0, %zmm0
81; AVX512VL-NEXT:    vpmovdw %zmm0, %ymm0
82; AVX512VL-NEXT:    retq
83;
84; AVX512BWNOVL-LABEL: var_shl_v16i16:
85; AVX512BWNOVL:       # %bb.0:
86; AVX512BWNOVL-NEXT:    # kill: def $ymm1 killed $ymm1 def $zmm1
87; AVX512BWNOVL-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
88; AVX512BWNOVL-NEXT:    vpsllvw %zmm1, %zmm0, %zmm0
89; AVX512BWNOVL-NEXT:    # kill: def $ymm0 killed $ymm0 killed $zmm0
90; AVX512BWNOVL-NEXT:    retq
91  %shift = shl <16 x i16> %a, %b
92  ret <16 x i16> %shift
93}
94
95define <16 x i8> @var_shl_v16i8(<16 x i8> %a, <16 x i8> %b) {
96; AVX256BW-LABEL: var_shl_v16i8:
97; AVX256BW:       # %bb.0:
98; AVX256BW-NEXT:    vpmovzxbw {{.*#+}} ymm1 = xmm1[0],zero,xmm1[1],zero,xmm1[2],zero,xmm1[3],zero,xmm1[4],zero,xmm1[5],zero,xmm1[6],zero,xmm1[7],zero,xmm1[8],zero,xmm1[9],zero,xmm1[10],zero,xmm1[11],zero,xmm1[12],zero,xmm1[13],zero,xmm1[14],zero,xmm1[15],zero
99; AVX256BW-NEXT:    vpmovzxbw {{.*#+}} ymm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero,xmm0[8],zero,xmm0[9],zero,xmm0[10],zero,xmm0[11],zero,xmm0[12],zero,xmm0[13],zero,xmm0[14],zero,xmm0[15],zero
100; AVX256BW-NEXT:    vpsllvw %ymm1, %ymm0, %ymm0
101; AVX256BW-NEXT:    vpmovwb %ymm0, %xmm0
102; AVX256BW-NEXT:    vzeroupper
103; AVX256BW-NEXT:    retq
104;
105; AVX512BWVL-LABEL: var_shl_v16i8:
106; AVX512BWVL:       # %bb.0:
107; AVX512BWVL-NEXT:    vpmovzxbw {{.*#+}} ymm1 = xmm1[0],zero,xmm1[1],zero,xmm1[2],zero,xmm1[3],zero,xmm1[4],zero,xmm1[5],zero,xmm1[6],zero,xmm1[7],zero,xmm1[8],zero,xmm1[9],zero,xmm1[10],zero,xmm1[11],zero,xmm1[12],zero,xmm1[13],zero,xmm1[14],zero,xmm1[15],zero
108; AVX512BWVL-NEXT:    vpmovzxbw {{.*#+}} ymm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero,xmm0[8],zero,xmm0[9],zero,xmm0[10],zero,xmm0[11],zero,xmm0[12],zero,xmm0[13],zero,xmm0[14],zero,xmm0[15],zero
109; AVX512BWVL-NEXT:    vpsllvw %ymm1, %ymm0, %ymm0
110; AVX512BWVL-NEXT:    vpmovwb %ymm0, %xmm0
111; AVX512BWVL-NEXT:    vzeroupper
112; AVX512BWVL-NEXT:    retq
113;
114; AVX256VL-LABEL: var_shl_v16i8:
115; AVX256VL:       # %bb.0:
116; AVX256VL-NEXT:    vpsllw $5, %xmm1, %xmm1
117; AVX256VL-NEXT:    vpsllw $4, %xmm0, %xmm2
118; AVX256VL-NEXT:    vpand {{.*}}(%rip), %xmm2, %xmm2
119; AVX256VL-NEXT:    vpblendvb %xmm1, %xmm2, %xmm0, %xmm0
120; AVX256VL-NEXT:    vpsllw $2, %xmm0, %xmm2
121; AVX256VL-NEXT:    vpand {{.*}}(%rip), %xmm2, %xmm2
122; AVX256VL-NEXT:    vpaddb %xmm1, %xmm1, %xmm1
123; AVX256VL-NEXT:    vpblendvb %xmm1, %xmm2, %xmm0, %xmm0
124; AVX256VL-NEXT:    vpaddb %xmm0, %xmm0, %xmm2
125; AVX256VL-NEXT:    vpaddb %xmm1, %xmm1, %xmm1
126; AVX256VL-NEXT:    vpblendvb %xmm1, %xmm2, %xmm0, %xmm0
127; AVX256VL-NEXT:    retq
128;
129; AVX512VL-LABEL: var_shl_v16i8:
130; AVX512VL:       # %bb.0:
131; AVX512VL-NEXT:    vpmovzxbd {{.*#+}} zmm1 = xmm1[0],zero,zero,zero,xmm1[1],zero,zero,zero,xmm1[2],zero,zero,zero,xmm1[3],zero,zero,zero,xmm1[4],zero,zero,zero,xmm1[5],zero,zero,zero,xmm1[6],zero,zero,zero,xmm1[7],zero,zero,zero,xmm1[8],zero,zero,zero,xmm1[9],zero,zero,zero,xmm1[10],zero,zero,zero,xmm1[11],zero,zero,zero,xmm1[12],zero,zero,zero,xmm1[13],zero,zero,zero,xmm1[14],zero,zero,zero,xmm1[15],zero,zero,zero
132; AVX512VL-NEXT:    vpmovzxbd {{.*#+}} zmm0 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero,xmm0[4],zero,zero,zero,xmm0[5],zero,zero,zero,xmm0[6],zero,zero,zero,xmm0[7],zero,zero,zero,xmm0[8],zero,zero,zero,xmm0[9],zero,zero,zero,xmm0[10],zero,zero,zero,xmm0[11],zero,zero,zero,xmm0[12],zero,zero,zero,xmm0[13],zero,zero,zero,xmm0[14],zero,zero,zero,xmm0[15],zero,zero,zero
133; AVX512VL-NEXT:    vpsllvd %zmm1, %zmm0, %zmm0
134; AVX512VL-NEXT:    vpmovdb %zmm0, %xmm0
135; AVX512VL-NEXT:    vzeroupper
136; AVX512VL-NEXT:    retq
137;
138; AVX512BWNOVL-LABEL: var_shl_v16i8:
139; AVX512BWNOVL:       # %bb.0:
140; AVX512BWNOVL-NEXT:    vpmovzxbw {{.*#+}} ymm1 = xmm1[0],zero,xmm1[1],zero,xmm1[2],zero,xmm1[3],zero,xmm1[4],zero,xmm1[5],zero,xmm1[6],zero,xmm1[7],zero,xmm1[8],zero,xmm1[9],zero,xmm1[10],zero,xmm1[11],zero,xmm1[12],zero,xmm1[13],zero,xmm1[14],zero,xmm1[15],zero
141; AVX512BWNOVL-NEXT:    vpmovzxbw {{.*#+}} ymm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero,xmm0[8],zero,xmm0[9],zero,xmm0[10],zero,xmm0[11],zero,xmm0[12],zero,xmm0[13],zero,xmm0[14],zero,xmm0[15],zero
142; AVX512BWNOVL-NEXT:    vpsllvw %zmm1, %zmm0, %zmm0
143; AVX512BWNOVL-NEXT:    vpmovwb %zmm0, %ymm0
144; AVX512BWNOVL-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0
145; AVX512BWNOVL-NEXT:    vzeroupper
146; AVX512BWNOVL-NEXT:    retq
147  %shift = shl <16 x i8> %a, %b
148  ret <16 x i8> %shift
149}
150
151define <32 x i8> @var_lshr_v32i8(<32 x i8> %a, <32 x i8> %b) {
152; AVX256-LABEL: var_lshr_v32i8:
153; AVX256:       # %bb.0:
154; AVX256-NEXT:    vpsllw $5, %ymm1, %ymm1
155; AVX256-NEXT:    vpsrlw $4, %ymm0, %ymm2
156; AVX256-NEXT:    vpand {{.*}}(%rip), %ymm2, %ymm2
157; AVX256-NEXT:    vpblendvb %ymm1, %ymm2, %ymm0, %ymm0
158; AVX256-NEXT:    vpsrlw $2, %ymm0, %ymm2
159; AVX256-NEXT:    vpand {{.*}}(%rip), %ymm2, %ymm2
160; AVX256-NEXT:    vpaddb %ymm1, %ymm1, %ymm1
161; AVX256-NEXT:    vpblendvb %ymm1, %ymm2, %ymm0, %ymm0
162; AVX256-NEXT:    vpsrlw $1, %ymm0, %ymm2
163; AVX256-NEXT:    vpand {{.*}}(%rip), %ymm2, %ymm2
164; AVX256-NEXT:    vpaddb %ymm1, %ymm1, %ymm1
165; AVX256-NEXT:    vpblendvb %ymm1, %ymm2, %ymm0, %ymm0
166; AVX256-NEXT:    retq
167;
168; AVX512BW-LABEL: var_lshr_v32i8:
169; AVX512BW:       # %bb.0:
170; 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
171; AVX512BW-NEXT:    vpmovzxbw {{.*#+}} zmm0 = ymm0[0],zero,ymm0[1],zero,ymm0[2],zero,ymm0[3],zero,ymm0[4],zero,ymm0[5],zero,ymm0[6],zero,ymm0[7],zero,ymm0[8],zero,ymm0[9],zero,ymm0[10],zero,ymm0[11],zero,ymm0[12],zero,ymm0[13],zero,ymm0[14],zero,ymm0[15],zero,ymm0[16],zero,ymm0[17],zero,ymm0[18],zero,ymm0[19],zero,ymm0[20],zero,ymm0[21],zero,ymm0[22],zero,ymm0[23],zero,ymm0[24],zero,ymm0[25],zero,ymm0[26],zero,ymm0[27],zero,ymm0[28],zero,ymm0[29],zero,ymm0[30],zero,ymm0[31],zero
172; AVX512BW-NEXT:    vpsrlvw %zmm1, %zmm0, %zmm0
173; AVX512BW-NEXT:    vpmovwb %zmm0, %ymm0
174; AVX512BW-NEXT:    retq
175;
176; AVX512VL-LABEL: var_lshr_v32i8:
177; AVX512VL:       # %bb.0:
178; AVX512VL-NEXT:    vpsllw $5, %ymm1, %ymm1
179; AVX512VL-NEXT:    vpsrlw $4, %ymm0, %ymm2
180; AVX512VL-NEXT:    vpand {{.*}}(%rip), %ymm2, %ymm2
181; AVX512VL-NEXT:    vpblendvb %ymm1, %ymm2, %ymm0, %ymm0
182; AVX512VL-NEXT:    vpsrlw $2, %ymm0, %ymm2
183; AVX512VL-NEXT:    vpand {{.*}}(%rip), %ymm2, %ymm2
184; AVX512VL-NEXT:    vpaddb %ymm1, %ymm1, %ymm1
185; AVX512VL-NEXT:    vpblendvb %ymm1, %ymm2, %ymm0, %ymm0
186; AVX512VL-NEXT:    vpsrlw $1, %ymm0, %ymm2
187; AVX512VL-NEXT:    vpand {{.*}}(%rip), %ymm2, %ymm2
188; AVX512VL-NEXT:    vpaddb %ymm1, %ymm1, %ymm1
189; AVX512VL-NEXT:    vpblendvb %ymm1, %ymm2, %ymm0, %ymm0
190; AVX512VL-NEXT:    retq
191  %shift = lshr <32 x i8> %a, %b
192  ret <32 x i8> %shift
193}
194
195define <16 x i16> @var_lshr_v16i16(<16 x i16> %a, <16 x i16> %b) {
196; AVX256BW-LABEL: var_lshr_v16i16:
197; AVX256BW:       # %bb.0:
198; AVX256BW-NEXT:    vpsrlvw %ymm1, %ymm0, %ymm0
199; AVX256BW-NEXT:    retq
200;
201; AVX512BWVL-LABEL: var_lshr_v16i16:
202; AVX512BWVL:       # %bb.0:
203; AVX512BWVL-NEXT:    vpsrlvw %ymm1, %ymm0, %ymm0
204; AVX512BWVL-NEXT:    retq
205;
206; AVX256VL-LABEL: var_lshr_v16i16:
207; AVX256VL:       # %bb.0:
208; AVX256VL-NEXT:    vpxor %xmm2, %xmm2, %xmm2
209; AVX256VL-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]
210; AVX256VL-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]
211; AVX256VL-NEXT:    vpsrlvd %ymm3, %ymm4, %ymm3
212; AVX256VL-NEXT:    vpsrld $16, %ymm3, %ymm3
213; AVX256VL-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]
214; AVX256VL-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]
215; AVX256VL-NEXT:    vpsrlvd %ymm1, %ymm0, %ymm0
216; AVX256VL-NEXT:    vpsrld $16, %ymm0, %ymm0
217; AVX256VL-NEXT:    vpackusdw %ymm3, %ymm0, %ymm0
218; AVX256VL-NEXT:    retq
219;
220; AVX512VL-LABEL: var_lshr_v16i16:
221; AVX512VL:       # %bb.0:
222; AVX512VL-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
223; AVX512VL-NEXT:    vpmovzxwd {{.*#+}} zmm0 = ymm0[0],zero,ymm0[1],zero,ymm0[2],zero,ymm0[3],zero,ymm0[4],zero,ymm0[5],zero,ymm0[6],zero,ymm0[7],zero,ymm0[8],zero,ymm0[9],zero,ymm0[10],zero,ymm0[11],zero,ymm0[12],zero,ymm0[13],zero,ymm0[14],zero,ymm0[15],zero
224; AVX512VL-NEXT:    vpsrlvd %zmm1, %zmm0, %zmm0
225; AVX512VL-NEXT:    vpmovdw %zmm0, %ymm0
226; AVX512VL-NEXT:    retq
227;
228; AVX512BWNOVL-LABEL: var_lshr_v16i16:
229; AVX512BWNOVL:       # %bb.0:
230; AVX512BWNOVL-NEXT:    # kill: def $ymm1 killed $ymm1 def $zmm1
231; AVX512BWNOVL-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
232; AVX512BWNOVL-NEXT:    vpsrlvw %zmm1, %zmm0, %zmm0
233; AVX512BWNOVL-NEXT:    # kill: def $ymm0 killed $ymm0 killed $zmm0
234; AVX512BWNOVL-NEXT:    retq
235  %shift = lshr <16 x i16> %a, %b
236  ret <16 x i16> %shift
237}
238
239define <16 x i8> @var_lshr_v16i8(<16 x i8> %a, <16 x i8> %b) {
240; AVX256BW-LABEL: var_lshr_v16i8:
241; AVX256BW:       # %bb.0:
242; AVX256BW-NEXT:    vpmovzxbw {{.*#+}} ymm1 = xmm1[0],zero,xmm1[1],zero,xmm1[2],zero,xmm1[3],zero,xmm1[4],zero,xmm1[5],zero,xmm1[6],zero,xmm1[7],zero,xmm1[8],zero,xmm1[9],zero,xmm1[10],zero,xmm1[11],zero,xmm1[12],zero,xmm1[13],zero,xmm1[14],zero,xmm1[15],zero
243; AVX256BW-NEXT:    vpmovzxbw {{.*#+}} ymm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero,xmm0[8],zero,xmm0[9],zero,xmm0[10],zero,xmm0[11],zero,xmm0[12],zero,xmm0[13],zero,xmm0[14],zero,xmm0[15],zero
244; AVX256BW-NEXT:    vpsrlvw %ymm1, %ymm0, %ymm0
245; AVX256BW-NEXT:    vpmovwb %ymm0, %xmm0
246; AVX256BW-NEXT:    vzeroupper
247; AVX256BW-NEXT:    retq
248;
249; AVX512BWVL-LABEL: var_lshr_v16i8:
250; AVX512BWVL:       # %bb.0:
251; AVX512BWVL-NEXT:    vpmovzxbw {{.*#+}} ymm1 = xmm1[0],zero,xmm1[1],zero,xmm1[2],zero,xmm1[3],zero,xmm1[4],zero,xmm1[5],zero,xmm1[6],zero,xmm1[7],zero,xmm1[8],zero,xmm1[9],zero,xmm1[10],zero,xmm1[11],zero,xmm1[12],zero,xmm1[13],zero,xmm1[14],zero,xmm1[15],zero
252; AVX512BWVL-NEXT:    vpmovzxbw {{.*#+}} ymm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero,xmm0[8],zero,xmm0[9],zero,xmm0[10],zero,xmm0[11],zero,xmm0[12],zero,xmm0[13],zero,xmm0[14],zero,xmm0[15],zero
253; AVX512BWVL-NEXT:    vpsrlvw %ymm1, %ymm0, %ymm0
254; AVX512BWVL-NEXT:    vpmovwb %ymm0, %xmm0
255; AVX512BWVL-NEXT:    vzeroupper
256; AVX512BWVL-NEXT:    retq
257;
258; AVX256VL-LABEL: var_lshr_v16i8:
259; AVX256VL:       # %bb.0:
260; AVX256VL-NEXT:    vpsllw $5, %xmm1, %xmm1
261; AVX256VL-NEXT:    vpsrlw $4, %xmm0, %xmm2
262; AVX256VL-NEXT:    vpand {{.*}}(%rip), %xmm2, %xmm2
263; AVX256VL-NEXT:    vpblendvb %xmm1, %xmm2, %xmm0, %xmm0
264; AVX256VL-NEXT:    vpsrlw $2, %xmm0, %xmm2
265; AVX256VL-NEXT:    vpand {{.*}}(%rip), %xmm2, %xmm2
266; AVX256VL-NEXT:    vpaddb %xmm1, %xmm1, %xmm1
267; AVX256VL-NEXT:    vpblendvb %xmm1, %xmm2, %xmm0, %xmm0
268; AVX256VL-NEXT:    vpsrlw $1, %xmm0, %xmm2
269; AVX256VL-NEXT:    vpand {{.*}}(%rip), %xmm2, %xmm2
270; AVX256VL-NEXT:    vpaddb %xmm1, %xmm1, %xmm1
271; AVX256VL-NEXT:    vpblendvb %xmm1, %xmm2, %xmm0, %xmm0
272; AVX256VL-NEXT:    retq
273;
274; AVX512VL-LABEL: var_lshr_v16i8:
275; AVX512VL:       # %bb.0:
276; AVX512VL-NEXT:    vpmovzxbd {{.*#+}} zmm1 = xmm1[0],zero,zero,zero,xmm1[1],zero,zero,zero,xmm1[2],zero,zero,zero,xmm1[3],zero,zero,zero,xmm1[4],zero,zero,zero,xmm1[5],zero,zero,zero,xmm1[6],zero,zero,zero,xmm1[7],zero,zero,zero,xmm1[8],zero,zero,zero,xmm1[9],zero,zero,zero,xmm1[10],zero,zero,zero,xmm1[11],zero,zero,zero,xmm1[12],zero,zero,zero,xmm1[13],zero,zero,zero,xmm1[14],zero,zero,zero,xmm1[15],zero,zero,zero
277; AVX512VL-NEXT:    vpmovzxbd {{.*#+}} zmm0 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero,xmm0[4],zero,zero,zero,xmm0[5],zero,zero,zero,xmm0[6],zero,zero,zero,xmm0[7],zero,zero,zero,xmm0[8],zero,zero,zero,xmm0[9],zero,zero,zero,xmm0[10],zero,zero,zero,xmm0[11],zero,zero,zero,xmm0[12],zero,zero,zero,xmm0[13],zero,zero,zero,xmm0[14],zero,zero,zero,xmm0[15],zero,zero,zero
278; AVX512VL-NEXT:    vpsrlvd %zmm1, %zmm0, %zmm0
279; AVX512VL-NEXT:    vpmovdb %zmm0, %xmm0
280; AVX512VL-NEXT:    vzeroupper
281; AVX512VL-NEXT:    retq
282;
283; AVX512BWNOVL-LABEL: var_lshr_v16i8:
284; AVX512BWNOVL:       # %bb.0:
285; AVX512BWNOVL-NEXT:    vpmovzxbw {{.*#+}} ymm1 = xmm1[0],zero,xmm1[1],zero,xmm1[2],zero,xmm1[3],zero,xmm1[4],zero,xmm1[5],zero,xmm1[6],zero,xmm1[7],zero,xmm1[8],zero,xmm1[9],zero,xmm1[10],zero,xmm1[11],zero,xmm1[12],zero,xmm1[13],zero,xmm1[14],zero,xmm1[15],zero
286; AVX512BWNOVL-NEXT:    vpmovzxbw {{.*#+}} ymm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero,xmm0[8],zero,xmm0[9],zero,xmm0[10],zero,xmm0[11],zero,xmm0[12],zero,xmm0[13],zero,xmm0[14],zero,xmm0[15],zero
287; AVX512BWNOVL-NEXT:    vpsrlvw %zmm1, %zmm0, %zmm0
288; AVX512BWNOVL-NEXT:    vpmovwb %zmm0, %ymm0
289; AVX512BWNOVL-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0
290; AVX512BWNOVL-NEXT:    vzeroupper
291; AVX512BWNOVL-NEXT:    retq
292  %shift = lshr <16 x i8> %a, %b
293  ret <16 x i8> %shift
294}
295
296define <32 x i8> @var_ashr_v32i8(<32 x i8> %a, <32 x i8> %b) {
297; AVX256-LABEL: var_ashr_v32i8:
298; AVX256:       # %bb.0:
299; AVX256-NEXT:    vpsllw $5, %ymm1, %ymm1
300; AVX256-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]
301; AVX256-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]
302; AVX256-NEXT:    vpsraw $4, %ymm3, %ymm4
303; AVX256-NEXT:    vpblendvb %ymm2, %ymm4, %ymm3, %ymm3
304; AVX256-NEXT:    vpsraw $2, %ymm3, %ymm4
305; AVX256-NEXT:    vpaddw %ymm2, %ymm2, %ymm2
306; AVX256-NEXT:    vpblendvb %ymm2, %ymm4, %ymm3, %ymm3
307; AVX256-NEXT:    vpsraw $1, %ymm3, %ymm4
308; AVX256-NEXT:    vpaddw %ymm2, %ymm2, %ymm2
309; AVX256-NEXT:    vpblendvb %ymm2, %ymm4, %ymm3, %ymm2
310; AVX256-NEXT:    vpsrlw $8, %ymm2, %ymm2
311; AVX256-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]
312; AVX256-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]
313; AVX256-NEXT:    vpsraw $4, %ymm0, %ymm3
314; AVX256-NEXT:    vpblendvb %ymm1, %ymm3, %ymm0, %ymm0
315; AVX256-NEXT:    vpsraw $2, %ymm0, %ymm3
316; AVX256-NEXT:    vpaddw %ymm1, %ymm1, %ymm1
317; AVX256-NEXT:    vpblendvb %ymm1, %ymm3, %ymm0, %ymm0
318; AVX256-NEXT:    vpsraw $1, %ymm0, %ymm3
319; AVX256-NEXT:    vpaddw %ymm1, %ymm1, %ymm1
320; AVX256-NEXT:    vpblendvb %ymm1, %ymm3, %ymm0, %ymm0
321; AVX256-NEXT:    vpsrlw $8, %ymm0, %ymm0
322; AVX256-NEXT:    vpackuswb %ymm2, %ymm0, %ymm0
323; AVX256-NEXT:    retq
324;
325; AVX512BW-LABEL: var_ashr_v32i8:
326; AVX512BW:       # %bb.0:
327; 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
328; AVX512BW-NEXT:    vpmovsxbw %ymm0, %zmm0
329; AVX512BW-NEXT:    vpsravw %zmm1, %zmm0, %zmm0
330; AVX512BW-NEXT:    vpmovwb %zmm0, %ymm0
331; AVX512BW-NEXT:    retq
332;
333; AVX512VL-LABEL: var_ashr_v32i8:
334; AVX512VL:       # %bb.0:
335; AVX512VL-NEXT:    vpsllw $5, %ymm1, %ymm1
336; AVX512VL-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]
337; AVX512VL-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]
338; AVX512VL-NEXT:    vpsraw $4, %ymm3, %ymm4
339; AVX512VL-NEXT:    vpblendvb %ymm2, %ymm4, %ymm3, %ymm3
340; AVX512VL-NEXT:    vpsraw $2, %ymm3, %ymm4
341; AVX512VL-NEXT:    vpaddw %ymm2, %ymm2, %ymm2
342; AVX512VL-NEXT:    vpblendvb %ymm2, %ymm4, %ymm3, %ymm3
343; AVX512VL-NEXT:    vpsraw $1, %ymm3, %ymm4
344; AVX512VL-NEXT:    vpaddw %ymm2, %ymm2, %ymm2
345; AVX512VL-NEXT:    vpblendvb %ymm2, %ymm4, %ymm3, %ymm2
346; AVX512VL-NEXT:    vpsrlw $8, %ymm2, %ymm2
347; AVX512VL-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]
348; AVX512VL-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]
349; AVX512VL-NEXT:    vpsraw $4, %ymm0, %ymm3
350; AVX512VL-NEXT:    vpblendvb %ymm1, %ymm3, %ymm0, %ymm0
351; AVX512VL-NEXT:    vpsraw $2, %ymm0, %ymm3
352; AVX512VL-NEXT:    vpaddw %ymm1, %ymm1, %ymm1
353; AVX512VL-NEXT:    vpblendvb %ymm1, %ymm3, %ymm0, %ymm0
354; AVX512VL-NEXT:    vpsraw $1, %ymm0, %ymm3
355; AVX512VL-NEXT:    vpaddw %ymm1, %ymm1, %ymm1
356; AVX512VL-NEXT:    vpblendvb %ymm1, %ymm3, %ymm0, %ymm0
357; AVX512VL-NEXT:    vpsrlw $8, %ymm0, %ymm0
358; AVX512VL-NEXT:    vpackuswb %ymm2, %ymm0, %ymm0
359; AVX512VL-NEXT:    retq
360  %shift = ashr <32 x i8> %a, %b
361  ret <32 x i8> %shift
362}
363
364define <16 x i16> @var_ashr_v16i16(<16 x i16> %a, <16 x i16> %b) {
365; AVX256BW-LABEL: var_ashr_v16i16:
366; AVX256BW:       # %bb.0:
367; AVX256BW-NEXT:    vpsravw %ymm1, %ymm0, %ymm0
368; AVX256BW-NEXT:    retq
369;
370; AVX512BWVL-LABEL: var_ashr_v16i16:
371; AVX512BWVL:       # %bb.0:
372; AVX512BWVL-NEXT:    vpsravw %ymm1, %ymm0, %ymm0
373; AVX512BWVL-NEXT:    retq
374;
375; AVX256VL-LABEL: var_ashr_v16i16:
376; AVX256VL:       # %bb.0:
377; AVX256VL-NEXT:    vpxor %xmm2, %xmm2, %xmm2
378; AVX256VL-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]
379; AVX256VL-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]
380; AVX256VL-NEXT:    vpsravd %ymm3, %ymm4, %ymm3
381; AVX256VL-NEXT:    vpsrld $16, %ymm3, %ymm3
382; AVX256VL-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]
383; AVX256VL-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]
384; AVX256VL-NEXT:    vpsravd %ymm1, %ymm0, %ymm0
385; AVX256VL-NEXT:    vpsrld $16, %ymm0, %ymm0
386; AVX256VL-NEXT:    vpackusdw %ymm3, %ymm0, %ymm0
387; AVX256VL-NEXT:    retq
388;
389; AVX512VL-LABEL: var_ashr_v16i16:
390; AVX512VL:       # %bb.0:
391; AVX512VL-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
392; AVX512VL-NEXT:    vpmovsxwd %ymm0, %zmm0
393; AVX512VL-NEXT:    vpsravd %zmm1, %zmm0, %zmm0
394; AVX512VL-NEXT:    vpmovdw %zmm0, %ymm0
395; AVX512VL-NEXT:    retq
396;
397; AVX512BWNOVL-LABEL: var_ashr_v16i16:
398; AVX512BWNOVL:       # %bb.0:
399; AVX512BWNOVL-NEXT:    # kill: def $ymm1 killed $ymm1 def $zmm1
400; AVX512BWNOVL-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
401; AVX512BWNOVL-NEXT:    vpsravw %zmm1, %zmm0, %zmm0
402; AVX512BWNOVL-NEXT:    # kill: def $ymm0 killed $ymm0 killed $zmm0
403; AVX512BWNOVL-NEXT:    retq
404  %shift = ashr <16 x i16> %a, %b
405  ret <16 x i16> %shift
406}
407
408define <16 x i8> @var_ashr_v16i8(<16 x i8> %a, <16 x i8> %b) {
409; AVX256BW-LABEL: var_ashr_v16i8:
410; AVX256BW:       # %bb.0:
411; AVX256BW-NEXT:    vpmovzxbw {{.*#+}} ymm1 = xmm1[0],zero,xmm1[1],zero,xmm1[2],zero,xmm1[3],zero,xmm1[4],zero,xmm1[5],zero,xmm1[6],zero,xmm1[7],zero,xmm1[8],zero,xmm1[9],zero,xmm1[10],zero,xmm1[11],zero,xmm1[12],zero,xmm1[13],zero,xmm1[14],zero,xmm1[15],zero
412; AVX256BW-NEXT:    vpmovsxbw %xmm0, %ymm0
413; AVX256BW-NEXT:    vpsravw %ymm1, %ymm0, %ymm0
414; AVX256BW-NEXT:    vpmovwb %ymm0, %xmm0
415; AVX256BW-NEXT:    vzeroupper
416; AVX256BW-NEXT:    retq
417;
418; AVX512BWVL-LABEL: var_ashr_v16i8:
419; AVX512BWVL:       # %bb.0:
420; AVX512BWVL-NEXT:    vpmovzxbw {{.*#+}} ymm1 = xmm1[0],zero,xmm1[1],zero,xmm1[2],zero,xmm1[3],zero,xmm1[4],zero,xmm1[5],zero,xmm1[6],zero,xmm1[7],zero,xmm1[8],zero,xmm1[9],zero,xmm1[10],zero,xmm1[11],zero,xmm1[12],zero,xmm1[13],zero,xmm1[14],zero,xmm1[15],zero
421; AVX512BWVL-NEXT:    vpmovsxbw %xmm0, %ymm0
422; AVX512BWVL-NEXT:    vpsravw %ymm1, %ymm0, %ymm0
423; AVX512BWVL-NEXT:    vpmovwb %ymm0, %xmm0
424; AVX512BWVL-NEXT:    vzeroupper
425; AVX512BWVL-NEXT:    retq
426;
427; AVX256VL-LABEL: var_ashr_v16i8:
428; AVX256VL:       # %bb.0:
429; AVX256VL-NEXT:    vpsllw $5, %xmm1, %xmm1
430; AVX256VL-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]
431; AVX256VL-NEXT:    vpunpckhbw {{.*#+}} xmm3 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]
432; AVX256VL-NEXT:    vpsraw $4, %xmm3, %xmm4
433; AVX256VL-NEXT:    vpblendvb %xmm2, %xmm4, %xmm3, %xmm3
434; AVX256VL-NEXT:    vpsraw $2, %xmm3, %xmm4
435; AVX256VL-NEXT:    vpaddw %xmm2, %xmm2, %xmm2
436; AVX256VL-NEXT:    vpblendvb %xmm2, %xmm4, %xmm3, %xmm3
437; AVX256VL-NEXT:    vpsraw $1, %xmm3, %xmm4
438; AVX256VL-NEXT:    vpaddw %xmm2, %xmm2, %xmm2
439; AVX256VL-NEXT:    vpblendvb %xmm2, %xmm4, %xmm3, %xmm2
440; AVX256VL-NEXT:    vpsrlw $8, %xmm2, %xmm2
441; AVX256VL-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]
442; AVX256VL-NEXT:    vpunpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
443; AVX256VL-NEXT:    vpsraw $4, %xmm0, %xmm3
444; AVX256VL-NEXT:    vpblendvb %xmm1, %xmm3, %xmm0, %xmm0
445; AVX256VL-NEXT:    vpsraw $2, %xmm0, %xmm3
446; AVX256VL-NEXT:    vpaddw %xmm1, %xmm1, %xmm1
447; AVX256VL-NEXT:    vpblendvb %xmm1, %xmm3, %xmm0, %xmm0
448; AVX256VL-NEXT:    vpsraw $1, %xmm0, %xmm3
449; AVX256VL-NEXT:    vpaddw %xmm1, %xmm1, %xmm1
450; AVX256VL-NEXT:    vpblendvb %xmm1, %xmm3, %xmm0, %xmm0
451; AVX256VL-NEXT:    vpsrlw $8, %xmm0, %xmm0
452; AVX256VL-NEXT:    vpackuswb %xmm2, %xmm0, %xmm0
453; AVX256VL-NEXT:    retq
454;
455; AVX512VL-LABEL: var_ashr_v16i8:
456; AVX512VL:       # %bb.0:
457; AVX512VL-NEXT:    vpmovzxbd {{.*#+}} zmm1 = xmm1[0],zero,zero,zero,xmm1[1],zero,zero,zero,xmm1[2],zero,zero,zero,xmm1[3],zero,zero,zero,xmm1[4],zero,zero,zero,xmm1[5],zero,zero,zero,xmm1[6],zero,zero,zero,xmm1[7],zero,zero,zero,xmm1[8],zero,zero,zero,xmm1[9],zero,zero,zero,xmm1[10],zero,zero,zero,xmm1[11],zero,zero,zero,xmm1[12],zero,zero,zero,xmm1[13],zero,zero,zero,xmm1[14],zero,zero,zero,xmm1[15],zero,zero,zero
458; AVX512VL-NEXT:    vpmovsxbd %xmm0, %zmm0
459; AVX512VL-NEXT:    vpsravd %zmm1, %zmm0, %zmm0
460; AVX512VL-NEXT:    vpmovdb %zmm0, %xmm0
461; AVX512VL-NEXT:    vzeroupper
462; AVX512VL-NEXT:    retq
463;
464; AVX512BWNOVL-LABEL: var_ashr_v16i8:
465; AVX512BWNOVL:       # %bb.0:
466; AVX512BWNOVL-NEXT:    vpmovzxbw {{.*#+}} ymm1 = xmm1[0],zero,xmm1[1],zero,xmm1[2],zero,xmm1[3],zero,xmm1[4],zero,xmm1[5],zero,xmm1[6],zero,xmm1[7],zero,xmm1[8],zero,xmm1[9],zero,xmm1[10],zero,xmm1[11],zero,xmm1[12],zero,xmm1[13],zero,xmm1[14],zero,xmm1[15],zero
467; AVX512BWNOVL-NEXT:    vpmovsxbw %xmm0, %ymm0
468; AVX512BWNOVL-NEXT:    vpsravw %zmm1, %zmm0, %zmm0
469; AVX512BWNOVL-NEXT:    vpmovwb %zmm0, %ymm0
470; AVX512BWNOVL-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0
471; AVX512BWNOVL-NEXT:    vzeroupper
472; AVX512BWNOVL-NEXT:    retq
473  %shift = ashr <16 x i8> %a, %b
474  ret <16 x i8> %shift
475}
476