1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+sse4.2,+gfni | FileCheck %s --check-prefixes=GFNISSE
3 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx,+gfni | FileCheck %s --check-prefixes=GFNIAVX1OR2,GFNIAVX1
4 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx2,+gfni | FileCheck %s --check-prefixes=GFNIAVX1OR2,GFNIAVX2
5 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512bw,+avx512vl,+gfni | FileCheck %s --check-prefixes=GFNIAVX512
8 ; 128 Bit Vector Funnel Shifts
11 define <16 x i8> @splatconstant_fshl_v16i8(<16 x i8> %a, <16 x i8> %b) nounwind {
12 ; GFNISSE-LABEL: splatconstant_fshl_v16i8:
14 ; GFNISSE-NEXT: psrlw $5, %xmm1
15 ; GFNISSE-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1
16 ; GFNISSE-NEXT: psllw $3, %xmm0
17 ; GFNISSE-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
18 ; GFNISSE-NEXT: por %xmm1, %xmm0
21 ; GFNIAVX1OR2-LABEL: splatconstant_fshl_v16i8:
22 ; GFNIAVX1OR2: # %bb.0:
23 ; GFNIAVX1OR2-NEXT: vpsrlw $5, %xmm1, %xmm1
24 ; GFNIAVX1OR2-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1
25 ; GFNIAVX1OR2-NEXT: vpsllw $3, %xmm0, %xmm0
26 ; GFNIAVX1OR2-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0
27 ; GFNIAVX1OR2-NEXT: vpor %xmm1, %xmm0, %xmm0
28 ; GFNIAVX1OR2-NEXT: retq
30 ; GFNIAVX512-LABEL: splatconstant_fshl_v16i8:
31 ; GFNIAVX512: # %bb.0:
32 ; GFNIAVX512-NEXT: vpsllw $3, %xmm0, %xmm2
33 ; GFNIAVX512-NEXT: vpsrlw $5, %xmm1, %xmm0
34 ; GFNIAVX512-NEXT: vpternlogq $216, {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to2}, %xmm2, %xmm0
35 ; GFNIAVX512-NEXT: retq
36 %res = call <16 x i8> @llvm.fshl.v16i8(<16 x i8> %a, <16 x i8> %b, <16 x i8> <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>)
39 declare <16 x i8> @llvm.fshl.v16i8(<16 x i8>, <16 x i8>, <16 x i8>)
41 define <16 x i8> @splatconstant_fshr_v16i8(<16 x i8> %a, <16 x i8> %b) nounwind {
42 ; GFNISSE-LABEL: splatconstant_fshr_v16i8:
44 ; GFNISSE-NEXT: psrlw $7, %xmm1
45 ; GFNISSE-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1
46 ; GFNISSE-NEXT: paddb %xmm0, %xmm0
47 ; GFNISSE-NEXT: por %xmm1, %xmm0
50 ; GFNIAVX1OR2-LABEL: splatconstant_fshr_v16i8:
51 ; GFNIAVX1OR2: # %bb.0:
52 ; GFNIAVX1OR2-NEXT: vpsrlw $7, %xmm1, %xmm1
53 ; GFNIAVX1OR2-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1
54 ; GFNIAVX1OR2-NEXT: vpaddb %xmm0, %xmm0, %xmm0
55 ; GFNIAVX1OR2-NEXT: vpor %xmm1, %xmm0, %xmm0
56 ; GFNIAVX1OR2-NEXT: retq
58 ; GFNIAVX512-LABEL: splatconstant_fshr_v16i8:
59 ; GFNIAVX512: # %bb.0:
60 ; GFNIAVX512-NEXT: vpsrlw $7, %xmm1, %xmm1
61 ; GFNIAVX512-NEXT: vpaddb %xmm0, %xmm0, %xmm0
62 ; GFNIAVX512-NEXT: vpternlogd $248, {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to4}, %xmm1, %xmm0
63 ; GFNIAVX512-NEXT: retq
64 %res = call <16 x i8> @llvm.fshr.v16i8(<16 x i8> %a, <16 x i8> %b, <16 x i8> <i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7>)
67 declare <16 x i8> @llvm.fshr.v16i8(<16 x i8>, <16 x i8>, <16 x i8>)
70 ; 256 Bit Vector Funnel Shifts
73 define <32 x i8> @splatconstant_fshl_v32i8(<32 x i8> %a, <32 x i8> %b) nounwind {
74 ; GFNISSE-LABEL: splatconstant_fshl_v32i8:
76 ; GFNISSE-NEXT: psrlw $4, %xmm2
77 ; GFNISSE-NEXT: movdqa {{.*#+}} xmm4 = [240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240]
78 ; GFNISSE-NEXT: movdqa %xmm4, %xmm5
79 ; GFNISSE-NEXT: pandn %xmm2, %xmm5
80 ; GFNISSE-NEXT: psllw $4, %xmm0
81 ; GFNISSE-NEXT: pand %xmm4, %xmm0
82 ; GFNISSE-NEXT: por %xmm5, %xmm0
83 ; GFNISSE-NEXT: psrlw $4, %xmm3
84 ; GFNISSE-NEXT: psllw $4, %xmm1
85 ; GFNISSE-NEXT: pand %xmm4, %xmm1
86 ; GFNISSE-NEXT: pandn %xmm3, %xmm4
87 ; GFNISSE-NEXT: por %xmm4, %xmm1
90 ; GFNIAVX1-LABEL: splatconstant_fshl_v32i8:
92 ; GFNIAVX1-NEXT: vextractf128 $1, %ymm1, %xmm2
93 ; GFNIAVX1-NEXT: vpsrlw $4, %xmm2, %xmm2
94 ; GFNIAVX1-NEXT: vbroadcastss {{.*#+}} xmm3 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]
95 ; GFNIAVX1-NEXT: vpand %xmm3, %xmm2, %xmm2
96 ; GFNIAVX1-NEXT: vpsrlw $4, %xmm1, %xmm1
97 ; GFNIAVX1-NEXT: vpand %xmm3, %xmm1, %xmm1
98 ; GFNIAVX1-NEXT: vinsertf128 $1, %xmm2, %ymm1, %ymm1
99 ; GFNIAVX1-NEXT: vextractf128 $1, %ymm0, %xmm2
100 ; GFNIAVX1-NEXT: vpsllw $4, %xmm2, %xmm2
101 ; GFNIAVX1-NEXT: vbroadcastss {{.*#+}} xmm3 = [240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240]
102 ; GFNIAVX1-NEXT: vpand %xmm3, %xmm2, %xmm2
103 ; GFNIAVX1-NEXT: vpsllw $4, %xmm0, %xmm0
104 ; GFNIAVX1-NEXT: vpand %xmm3, %xmm0, %xmm0
105 ; GFNIAVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0
106 ; GFNIAVX1-NEXT: vorps %ymm1, %ymm0, %ymm0
107 ; GFNIAVX1-NEXT: retq
109 ; GFNIAVX2-LABEL: splatconstant_fshl_v32i8:
111 ; GFNIAVX2-NEXT: vpsrlw $4, %ymm1, %ymm1
112 ; GFNIAVX2-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm1
113 ; GFNIAVX2-NEXT: vpsllw $4, %ymm0, %ymm0
114 ; GFNIAVX2-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0
115 ; GFNIAVX2-NEXT: vpor %ymm1, %ymm0, %ymm0
116 ; GFNIAVX2-NEXT: retq
118 ; GFNIAVX512-LABEL: splatconstant_fshl_v32i8:
119 ; GFNIAVX512: # %bb.0:
120 ; GFNIAVX512-NEXT: vpsllw $4, %ymm0, %ymm2
121 ; GFNIAVX512-NEXT: vpsrlw $4, %ymm1, %ymm0
122 ; GFNIAVX512-NEXT: vpternlogq $216, {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to4}, %ymm2, %ymm0
123 ; GFNIAVX512-NEXT: retq
124 %res = call <32 x i8> @llvm.fshl.v32i8(<32 x i8> %a, <32 x i8> %b, <32 x i8> <i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4>)
127 declare <32 x i8> @llvm.fshl.v32i8(<32 x i8>, <32 x i8>, <32 x i8>)
129 define <32 x i8> @splatconstant_fshr_v32i8(<32 x i8> %a, <32 x i8> %b) nounwind {
130 ; GFNISSE-LABEL: splatconstant_fshr_v32i8:
132 ; GFNISSE-NEXT: psrlw $6, %xmm2
133 ; GFNISSE-NEXT: movdqa {{.*#+}} xmm4 = [252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252]
134 ; GFNISSE-NEXT: movdqa %xmm4, %xmm5
135 ; GFNISSE-NEXT: pandn %xmm2, %xmm5
136 ; GFNISSE-NEXT: psllw $2, %xmm0
137 ; GFNISSE-NEXT: pand %xmm4, %xmm0
138 ; GFNISSE-NEXT: por %xmm5, %xmm0
139 ; GFNISSE-NEXT: psrlw $6, %xmm3
140 ; GFNISSE-NEXT: psllw $2, %xmm1
141 ; GFNISSE-NEXT: pand %xmm4, %xmm1
142 ; GFNISSE-NEXT: pandn %xmm3, %xmm4
143 ; GFNISSE-NEXT: por %xmm4, %xmm1
146 ; GFNIAVX1-LABEL: splatconstant_fshr_v32i8:
148 ; GFNIAVX1-NEXT: vextractf128 $1, %ymm1, %xmm2
149 ; GFNIAVX1-NEXT: vpsrlw $6, %xmm2, %xmm2
150 ; GFNIAVX1-NEXT: vbroadcastss {{.*#+}} xmm3 = [3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3]
151 ; GFNIAVX1-NEXT: vpand %xmm3, %xmm2, %xmm2
152 ; GFNIAVX1-NEXT: vpsrlw $6, %xmm1, %xmm1
153 ; GFNIAVX1-NEXT: vpand %xmm3, %xmm1, %xmm1
154 ; GFNIAVX1-NEXT: vinsertf128 $1, %xmm2, %ymm1, %ymm1
155 ; GFNIAVX1-NEXT: vextractf128 $1, %ymm0, %xmm2
156 ; GFNIAVX1-NEXT: vpsllw $2, %xmm2, %xmm2
157 ; GFNIAVX1-NEXT: vbroadcastss {{.*#+}} xmm3 = [252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252]
158 ; GFNIAVX1-NEXT: vpand %xmm3, %xmm2, %xmm2
159 ; GFNIAVX1-NEXT: vpsllw $2, %xmm0, %xmm0
160 ; GFNIAVX1-NEXT: vpand %xmm3, %xmm0, %xmm0
161 ; GFNIAVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0
162 ; GFNIAVX1-NEXT: vorps %ymm1, %ymm0, %ymm0
163 ; GFNIAVX1-NEXT: retq
165 ; GFNIAVX2-LABEL: splatconstant_fshr_v32i8:
167 ; GFNIAVX2-NEXT: vpsrlw $6, %ymm1, %ymm1
168 ; GFNIAVX2-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm1
169 ; GFNIAVX2-NEXT: vpsllw $2, %ymm0, %ymm0
170 ; GFNIAVX2-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0
171 ; GFNIAVX2-NEXT: vpor %ymm1, %ymm0, %ymm0
172 ; GFNIAVX2-NEXT: retq
174 ; GFNIAVX512-LABEL: splatconstant_fshr_v32i8:
175 ; GFNIAVX512: # %bb.0:
176 ; GFNIAVX512-NEXT: vpsllw $2, %ymm0, %ymm2
177 ; GFNIAVX512-NEXT: vpsrlw $6, %ymm1, %ymm0
178 ; GFNIAVX512-NEXT: vpternlogq $216, {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to4}, %ymm2, %ymm0
179 ; GFNIAVX512-NEXT: retq
180 %res = call <32 x i8> @llvm.fshr.v32i8(<32 x i8> %a, <32 x i8> %b, <32 x i8> <i8 6, i8 6, i8 6, i8 6, i8 6, i8 6, i8 6, i8 6, i8 6, i8 6, i8 6, i8 6, i8 6, i8 6, i8 6, i8 6, i8 6, i8 6, i8 6, i8 6, i8 6, i8 6, i8 6, i8 6, i8 6, i8 6, i8 6, i8 6, i8 6, i8 6, i8 6, i8 6>)
183 declare <32 x i8> @llvm.fshr.v32i8(<32 x i8>, <32 x i8>, <32 x i8>)
186 ; 512 Bit Vector Funnel Shifts
189 define <64 x i8> @splatconstant_fshl_v64i8(<64 x i8> %a, <64 x i8> %b) nounwind {
190 ; GFNISSE-LABEL: splatconstant_fshl_v64i8:
192 ; GFNISSE-NEXT: psrlw $7, %xmm4
193 ; GFNISSE-NEXT: movdqa {{.*#+}} xmm8 = [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]
194 ; GFNISSE-NEXT: pand %xmm8, %xmm4
195 ; GFNISSE-NEXT: paddb %xmm0, %xmm0
196 ; GFNISSE-NEXT: por %xmm4, %xmm0
197 ; GFNISSE-NEXT: psrlw $7, %xmm5
198 ; GFNISSE-NEXT: pand %xmm8, %xmm5
199 ; GFNISSE-NEXT: paddb %xmm1, %xmm1
200 ; GFNISSE-NEXT: por %xmm5, %xmm1
201 ; GFNISSE-NEXT: psrlw $7, %xmm6
202 ; GFNISSE-NEXT: pand %xmm8, %xmm6
203 ; GFNISSE-NEXT: paddb %xmm2, %xmm2
204 ; GFNISSE-NEXT: por %xmm6, %xmm2
205 ; GFNISSE-NEXT: psrlw $7, %xmm7
206 ; GFNISSE-NEXT: pand %xmm7, %xmm8
207 ; GFNISSE-NEXT: paddb %xmm3, %xmm3
208 ; GFNISSE-NEXT: por %xmm8, %xmm3
211 ; GFNIAVX1-LABEL: splatconstant_fshl_v64i8:
213 ; GFNIAVX1-NEXT: vextractf128 $1, %ymm2, %xmm4
214 ; GFNIAVX1-NEXT: vpsrlw $7, %xmm4, %xmm4
215 ; GFNIAVX1-NEXT: vbroadcastss {{.*#+}} xmm5 = [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]
216 ; GFNIAVX1-NEXT: vpand %xmm5, %xmm4, %xmm4
217 ; GFNIAVX1-NEXT: vpsrlw $7, %xmm2, %xmm2
218 ; GFNIAVX1-NEXT: vpand %xmm5, %xmm2, %xmm2
219 ; GFNIAVX1-NEXT: vinsertf128 $1, %xmm4, %ymm2, %ymm2
220 ; GFNIAVX1-NEXT: vpaddb %xmm0, %xmm0, %xmm4
221 ; GFNIAVX1-NEXT: vextractf128 $1, %ymm0, %xmm0
222 ; GFNIAVX1-NEXT: vpaddb %xmm0, %xmm0, %xmm0
223 ; GFNIAVX1-NEXT: vinsertf128 $1, %xmm0, %ymm4, %ymm0
224 ; GFNIAVX1-NEXT: vorps %ymm2, %ymm0, %ymm0
225 ; GFNIAVX1-NEXT: vextractf128 $1, %ymm3, %xmm2
226 ; GFNIAVX1-NEXT: vpsrlw $7, %xmm2, %xmm2
227 ; GFNIAVX1-NEXT: vpand %xmm5, %xmm2, %xmm2
228 ; GFNIAVX1-NEXT: vpsrlw $7, %xmm3, %xmm3
229 ; GFNIAVX1-NEXT: vpand %xmm5, %xmm3, %xmm3
230 ; GFNIAVX1-NEXT: vinsertf128 $1, %xmm2, %ymm3, %ymm2
231 ; GFNIAVX1-NEXT: vpaddb %xmm1, %xmm1, %xmm3
232 ; GFNIAVX1-NEXT: vextractf128 $1, %ymm1, %xmm1
233 ; GFNIAVX1-NEXT: vpaddb %xmm1, %xmm1, %xmm1
234 ; GFNIAVX1-NEXT: vinsertf128 $1, %xmm1, %ymm3, %ymm1
235 ; GFNIAVX1-NEXT: vorps %ymm2, %ymm1, %ymm1
236 ; GFNIAVX1-NEXT: retq
238 ; GFNIAVX2-LABEL: splatconstant_fshl_v64i8:
240 ; GFNIAVX2-NEXT: vpsrlw $7, %ymm2, %ymm2
241 ; GFNIAVX2-NEXT: vpbroadcastb {{.*#+}} ymm4 = [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]
242 ; GFNIAVX2-NEXT: vpand %ymm4, %ymm2, %ymm2
243 ; GFNIAVX2-NEXT: vpaddb %ymm0, %ymm0, %ymm0
244 ; GFNIAVX2-NEXT: vpor %ymm2, %ymm0, %ymm0
245 ; GFNIAVX2-NEXT: vpsrlw $7, %ymm3, %ymm2
246 ; GFNIAVX2-NEXT: vpand %ymm4, %ymm2, %ymm2
247 ; GFNIAVX2-NEXT: vpaddb %ymm1, %ymm1, %ymm1
248 ; GFNIAVX2-NEXT: vpor %ymm2, %ymm1, %ymm1
249 ; GFNIAVX2-NEXT: retq
251 ; GFNIAVX512-LABEL: splatconstant_fshl_v64i8:
252 ; GFNIAVX512: # %bb.0:
253 ; GFNIAVX512-NEXT: vpsrlw $7, %zmm1, %zmm1
254 ; GFNIAVX512-NEXT: vpaddb %zmm0, %zmm0, %zmm0
255 ; GFNIAVX512-NEXT: vpternlogd $248, {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to16}, %zmm1, %zmm0
256 ; GFNIAVX512-NEXT: retq
257 %res = call <64 x i8> @llvm.fshl.v64i8(<64 x i8> %a, <64 x i8> %b, <64 x i8> <i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1>)
260 declare <64 x i8> @llvm.fshl.v64i8(<64 x i8>, <64 x i8>, <64 x i8>)
262 define <64 x i8> @splatconstant_fshr_v64i8(<64 x i8> %a, <64 x i8> %b) nounwind {
263 ; GFNISSE-LABEL: splatconstant_fshr_v64i8:
265 ; GFNISSE-NEXT: psrlw $2, %xmm4
266 ; GFNISSE-NEXT: movdqa {{.*#+}} xmm8 = [192,192,192,192,192,192,192,192,192,192,192,192,192,192,192,192]
267 ; GFNISSE-NEXT: movdqa %xmm8, %xmm9
268 ; GFNISSE-NEXT: pandn %xmm4, %xmm9
269 ; GFNISSE-NEXT: psllw $6, %xmm0
270 ; GFNISSE-NEXT: pand %xmm8, %xmm0
271 ; GFNISSE-NEXT: por %xmm9, %xmm0
272 ; GFNISSE-NEXT: psrlw $2, %xmm5
273 ; GFNISSE-NEXT: movdqa %xmm8, %xmm4
274 ; GFNISSE-NEXT: pandn %xmm5, %xmm4
275 ; GFNISSE-NEXT: psllw $6, %xmm1
276 ; GFNISSE-NEXT: pand %xmm8, %xmm1
277 ; GFNISSE-NEXT: por %xmm4, %xmm1
278 ; GFNISSE-NEXT: psrlw $2, %xmm6
279 ; GFNISSE-NEXT: movdqa %xmm8, %xmm4
280 ; GFNISSE-NEXT: pandn %xmm6, %xmm4
281 ; GFNISSE-NEXT: psllw $6, %xmm2
282 ; GFNISSE-NEXT: pand %xmm8, %xmm2
283 ; GFNISSE-NEXT: por %xmm4, %xmm2
284 ; GFNISSE-NEXT: psrlw $2, %xmm7
285 ; GFNISSE-NEXT: psllw $6, %xmm3
286 ; GFNISSE-NEXT: pand %xmm8, %xmm3
287 ; GFNISSE-NEXT: pandn %xmm7, %xmm8
288 ; GFNISSE-NEXT: por %xmm8, %xmm3
291 ; GFNIAVX1-LABEL: splatconstant_fshr_v64i8:
293 ; GFNIAVX1-NEXT: vextractf128 $1, %ymm2, %xmm4
294 ; GFNIAVX1-NEXT: vpsrlw $2, %xmm4, %xmm4
295 ; GFNIAVX1-NEXT: vbroadcastss {{.*#+}} xmm5 = [63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63]
296 ; GFNIAVX1-NEXT: vpand %xmm5, %xmm4, %xmm4
297 ; GFNIAVX1-NEXT: vpsrlw $2, %xmm2, %xmm2
298 ; GFNIAVX1-NEXT: vpand %xmm5, %xmm2, %xmm2
299 ; GFNIAVX1-NEXT: vinsertf128 $1, %xmm4, %ymm2, %ymm2
300 ; GFNIAVX1-NEXT: vextractf128 $1, %ymm0, %xmm4
301 ; GFNIAVX1-NEXT: vpsllw $6, %xmm4, %xmm4
302 ; GFNIAVX1-NEXT: vbroadcastss {{.*#+}} xmm6 = [192,192,192,192,192,192,192,192,192,192,192,192,192,192,192,192]
303 ; GFNIAVX1-NEXT: vpand %xmm6, %xmm4, %xmm4
304 ; GFNIAVX1-NEXT: vpsllw $6, %xmm0, %xmm0
305 ; GFNIAVX1-NEXT: vpand %xmm6, %xmm0, %xmm0
306 ; GFNIAVX1-NEXT: vinsertf128 $1, %xmm4, %ymm0, %ymm0
307 ; GFNIAVX1-NEXT: vorps %ymm2, %ymm0, %ymm0
308 ; GFNIAVX1-NEXT: vextractf128 $1, %ymm3, %xmm2
309 ; GFNIAVX1-NEXT: vpsrlw $2, %xmm2, %xmm2
310 ; GFNIAVX1-NEXT: vpand %xmm5, %xmm2, %xmm2
311 ; GFNIAVX1-NEXT: vpsrlw $2, %xmm3, %xmm3
312 ; GFNIAVX1-NEXT: vpand %xmm5, %xmm3, %xmm3
313 ; GFNIAVX1-NEXT: vinsertf128 $1, %xmm2, %ymm3, %ymm2
314 ; GFNIAVX1-NEXT: vextractf128 $1, %ymm1, %xmm3
315 ; GFNIAVX1-NEXT: vpsllw $6, %xmm3, %xmm3
316 ; GFNIAVX1-NEXT: vpand %xmm6, %xmm3, %xmm3
317 ; GFNIAVX1-NEXT: vpsllw $6, %xmm1, %xmm1
318 ; GFNIAVX1-NEXT: vpand %xmm6, %xmm1, %xmm1
319 ; GFNIAVX1-NEXT: vinsertf128 $1, %xmm3, %ymm1, %ymm1
320 ; GFNIAVX1-NEXT: vorps %ymm2, %ymm1, %ymm1
321 ; GFNIAVX1-NEXT: retq
323 ; GFNIAVX2-LABEL: splatconstant_fshr_v64i8:
325 ; GFNIAVX2-NEXT: vpsrlw $2, %ymm2, %ymm2
326 ; GFNIAVX2-NEXT: vpbroadcastb {{.*#+}} ymm4 = [192,192,192,192,192,192,192,192,192,192,192,192,192,192,192,192,192,192,192,192,192,192,192,192,192,192,192,192,192,192,192,192]
327 ; GFNIAVX2-NEXT: vpandn %ymm2, %ymm4, %ymm2
328 ; GFNIAVX2-NEXT: vpsllw $6, %ymm0, %ymm0
329 ; GFNIAVX2-NEXT: vpand %ymm4, %ymm0, %ymm0
330 ; GFNIAVX2-NEXT: vpor %ymm2, %ymm0, %ymm0
331 ; GFNIAVX2-NEXT: vpsrlw $2, %ymm3, %ymm2
332 ; GFNIAVX2-NEXT: vpandn %ymm2, %ymm4, %ymm2
333 ; GFNIAVX2-NEXT: vpsllw $6, %ymm1, %ymm1
334 ; GFNIAVX2-NEXT: vpand %ymm4, %ymm1, %ymm1
335 ; GFNIAVX2-NEXT: vpor %ymm2, %ymm1, %ymm1
336 ; GFNIAVX2-NEXT: retq
338 ; GFNIAVX512-LABEL: splatconstant_fshr_v64i8:
339 ; GFNIAVX512: # %bb.0:
340 ; GFNIAVX512-NEXT: vpsllw $6, %zmm0, %zmm2
341 ; GFNIAVX512-NEXT: vpsrlw $2, %zmm1, %zmm0
342 ; GFNIAVX512-NEXT: vpternlogq $216, {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to8}, %zmm2, %zmm0
343 ; GFNIAVX512-NEXT: retq
344 %res = call <64 x i8> @llvm.fshr.v64i8(<64 x i8> %a, <64 x i8> %b, <64 x i8> <i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2>)
347 declare <64 x i8> @llvm.fshr.v64i8(<64 x i8>, <64 x i8>, <64 x i8>)