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 Rotates
11 define <16 x i8> @splatconstant_rotl_v16i8(<16 x i8> %a) nounwind {
12 ; GFNISSE-LABEL: splatconstant_rotl_v16i8:
14 ; GFNISSE-NEXT: movdqa %xmm0, %xmm1
15 ; GFNISSE-NEXT: psrlw $5, %xmm1
16 ; GFNISSE-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1
17 ; GFNISSE-NEXT: psllw $3, %xmm0
18 ; GFNISSE-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
19 ; GFNISSE-NEXT: por %xmm1, %xmm0
22 ; GFNIAVX1OR2-LABEL: splatconstant_rotl_v16i8:
23 ; GFNIAVX1OR2: # %bb.0:
24 ; GFNIAVX1OR2-NEXT: vpsrlw $5, %xmm0, %xmm1
25 ; GFNIAVX1OR2-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1
26 ; GFNIAVX1OR2-NEXT: vpsllw $3, %xmm0, %xmm0
27 ; GFNIAVX1OR2-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0
28 ; GFNIAVX1OR2-NEXT: vpor %xmm1, %xmm0, %xmm0
29 ; GFNIAVX1OR2-NEXT: retq
31 ; GFNIAVX512-LABEL: splatconstant_rotl_v16i8:
32 ; GFNIAVX512: # %bb.0:
33 ; GFNIAVX512-NEXT: vpsllw $3, %xmm0, %xmm1
34 ; GFNIAVX512-NEXT: vpsrlw $5, %xmm0, %xmm0
35 ; GFNIAVX512-NEXT: vpternlogd $216, {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to4}, %xmm1, %xmm0
36 ; GFNIAVX512-NEXT: retq
37 %res = call <16 x i8> @llvm.fshl.v16i8(<16 x i8> %a, <16 x i8> %a, <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>)
40 declare <16 x i8> @llvm.fshl.v16i8(<16 x i8>, <16 x i8>, <16 x i8>)
42 define <16 x i8> @splatconstant_rotr_v16i8(<16 x i8> %a) nounwind {
43 ; GFNISSE-LABEL: splatconstant_rotr_v16i8:
45 ; GFNISSE-NEXT: movdqa %xmm0, %xmm1
46 ; GFNISSE-NEXT: psrlw $7, %xmm1
47 ; GFNISSE-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1
48 ; GFNISSE-NEXT: paddb %xmm0, %xmm0
49 ; GFNISSE-NEXT: por %xmm1, %xmm0
52 ; GFNIAVX1OR2-LABEL: splatconstant_rotr_v16i8:
53 ; GFNIAVX1OR2: # %bb.0:
54 ; GFNIAVX1OR2-NEXT: vpsrlw $7, %xmm0, %xmm1
55 ; GFNIAVX1OR2-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1
56 ; GFNIAVX1OR2-NEXT: vpaddb %xmm0, %xmm0, %xmm0
57 ; GFNIAVX1OR2-NEXT: vpor %xmm1, %xmm0, %xmm0
58 ; GFNIAVX1OR2-NEXT: retq
60 ; GFNIAVX512-LABEL: splatconstant_rotr_v16i8:
61 ; GFNIAVX512: # %bb.0:
62 ; GFNIAVX512-NEXT: vpsrlw $7, %xmm0, %xmm1
63 ; GFNIAVX512-NEXT: vpaddb %xmm0, %xmm0, %xmm0
64 ; GFNIAVX512-NEXT: vpternlogd $248, {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to4}, %xmm1, %xmm0
65 ; GFNIAVX512-NEXT: retq
66 %res = call <16 x i8> @llvm.fshr.v16i8(<16 x i8> %a, <16 x i8> %a, <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>)
69 declare <16 x i8> @llvm.fshr.v16i8(<16 x i8>, <16 x i8>, <16 x i8>)
72 ; 256 Bit Vector Rotates
75 define <32 x i8> @splatconstant_rotl_v32i8(<32 x i8> %a) nounwind {
76 ; GFNISSE-LABEL: splatconstant_rotl_v32i8:
78 ; GFNISSE-NEXT: movdqa %xmm0, %xmm2
79 ; GFNISSE-NEXT: psrlw $4, %xmm2
80 ; GFNISSE-NEXT: movdqa {{.*#+}} xmm3 = [240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240]
81 ; GFNISSE-NEXT: movdqa %xmm3, %xmm4
82 ; GFNISSE-NEXT: pandn %xmm2, %xmm4
83 ; GFNISSE-NEXT: psllw $4, %xmm0
84 ; GFNISSE-NEXT: pand %xmm3, %xmm0
85 ; GFNISSE-NEXT: por %xmm4, %xmm0
86 ; GFNISSE-NEXT: movdqa %xmm1, %xmm2
87 ; GFNISSE-NEXT: psrlw $4, %xmm2
88 ; GFNISSE-NEXT: psllw $4, %xmm1
89 ; GFNISSE-NEXT: pand %xmm3, %xmm1
90 ; GFNISSE-NEXT: pandn %xmm2, %xmm3
91 ; GFNISSE-NEXT: por %xmm3, %xmm1
94 ; GFNIAVX1-LABEL: splatconstant_rotl_v32i8:
96 ; GFNIAVX1-NEXT: vextractf128 $1, %ymm0, %xmm1
97 ; GFNIAVX1-NEXT: vpsrlw $4, %xmm1, %xmm2
98 ; GFNIAVX1-NEXT: vbroadcastss {{.*#+}} xmm3 = [240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240]
99 ; GFNIAVX1-NEXT: vpandn %xmm2, %xmm3, %xmm2
100 ; GFNIAVX1-NEXT: vpsllw $4, %xmm1, %xmm1
101 ; GFNIAVX1-NEXT: vpand %xmm3, %xmm1, %xmm1
102 ; GFNIAVX1-NEXT: vpor %xmm2, %xmm1, %xmm1
103 ; GFNIAVX1-NEXT: vpsrlw $4, %xmm0, %xmm2
104 ; GFNIAVX1-NEXT: vpandn %xmm2, %xmm3, %xmm2
105 ; GFNIAVX1-NEXT: vpsllw $4, %xmm0, %xmm0
106 ; GFNIAVX1-NEXT: vpand %xmm3, %xmm0, %xmm0
107 ; GFNIAVX1-NEXT: vpor %xmm2, %xmm0, %xmm0
108 ; GFNIAVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0
109 ; GFNIAVX1-NEXT: retq
111 ; GFNIAVX2-LABEL: splatconstant_rotl_v32i8:
113 ; GFNIAVX2-NEXT: vpsrlw $4, %ymm0, %ymm1
114 ; GFNIAVX2-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm1
115 ; GFNIAVX2-NEXT: vpsllw $4, %ymm0, %ymm0
116 ; GFNIAVX2-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0
117 ; GFNIAVX2-NEXT: vpor %ymm1, %ymm0, %ymm0
118 ; GFNIAVX2-NEXT: retq
120 ; GFNIAVX512-LABEL: splatconstant_rotl_v32i8:
121 ; GFNIAVX512: # %bb.0:
122 ; GFNIAVX512-NEXT: vpsllw $4, %ymm0, %ymm1
123 ; GFNIAVX512-NEXT: vpsrlw $4, %ymm0, %ymm0
124 ; GFNIAVX512-NEXT: vpternlogd $216, {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to8}, %ymm1, %ymm0
125 ; GFNIAVX512-NEXT: retq
126 %res = call <32 x i8> @llvm.fshl.v32i8(<32 x i8> %a, <32 x i8> %a, <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>)
129 declare <32 x i8> @llvm.fshl.v32i8(<32 x i8>, <32 x i8>, <32 x i8>)
131 define <32 x i8> @splatconstant_rotr_v32i8(<32 x i8> %a) nounwind {
132 ; GFNISSE-LABEL: splatconstant_rotr_v32i8:
134 ; GFNISSE-NEXT: movdqa %xmm0, %xmm2
135 ; GFNISSE-NEXT: psrlw $6, %xmm2
136 ; GFNISSE-NEXT: movdqa {{.*#+}} xmm3 = [252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252]
137 ; GFNISSE-NEXT: movdqa %xmm3, %xmm4
138 ; GFNISSE-NEXT: pandn %xmm2, %xmm4
139 ; GFNISSE-NEXT: psllw $2, %xmm0
140 ; GFNISSE-NEXT: pand %xmm3, %xmm0
141 ; GFNISSE-NEXT: por %xmm4, %xmm0
142 ; GFNISSE-NEXT: movdqa %xmm1, %xmm2
143 ; GFNISSE-NEXT: psrlw $6, %xmm2
144 ; GFNISSE-NEXT: psllw $2, %xmm1
145 ; GFNISSE-NEXT: pand %xmm3, %xmm1
146 ; GFNISSE-NEXT: pandn %xmm2, %xmm3
147 ; GFNISSE-NEXT: por %xmm3, %xmm1
150 ; GFNIAVX1-LABEL: splatconstant_rotr_v32i8:
152 ; GFNIAVX1-NEXT: vextractf128 $1, %ymm0, %xmm1
153 ; GFNIAVX1-NEXT: vpsrlw $6, %xmm1, %xmm2
154 ; GFNIAVX1-NEXT: vbroadcastss {{.*#+}} xmm3 = [252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252]
155 ; GFNIAVX1-NEXT: vpandn %xmm2, %xmm3, %xmm2
156 ; GFNIAVX1-NEXT: vpsllw $2, %xmm1, %xmm1
157 ; GFNIAVX1-NEXT: vpand %xmm3, %xmm1, %xmm1
158 ; GFNIAVX1-NEXT: vpor %xmm2, %xmm1, %xmm1
159 ; GFNIAVX1-NEXT: vpsrlw $6, %xmm0, %xmm2
160 ; GFNIAVX1-NEXT: vpandn %xmm2, %xmm3, %xmm2
161 ; GFNIAVX1-NEXT: vpsllw $2, %xmm0, %xmm0
162 ; GFNIAVX1-NEXT: vpand %xmm3, %xmm0, %xmm0
163 ; GFNIAVX1-NEXT: vpor %xmm2, %xmm0, %xmm0
164 ; GFNIAVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0
165 ; GFNIAVX1-NEXT: retq
167 ; GFNIAVX2-LABEL: splatconstant_rotr_v32i8:
169 ; GFNIAVX2-NEXT: vpsrlw $6, %ymm0, %ymm1
170 ; GFNIAVX2-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm1
171 ; GFNIAVX2-NEXT: vpsllw $2, %ymm0, %ymm0
172 ; GFNIAVX2-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0
173 ; GFNIAVX2-NEXT: vpor %ymm1, %ymm0, %ymm0
174 ; GFNIAVX2-NEXT: retq
176 ; GFNIAVX512-LABEL: splatconstant_rotr_v32i8:
177 ; GFNIAVX512: # %bb.0:
178 ; GFNIAVX512-NEXT: vpsllw $2, %ymm0, %ymm1
179 ; GFNIAVX512-NEXT: vpsrlw $6, %ymm0, %ymm0
180 ; GFNIAVX512-NEXT: vpternlogd $216, {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to8}, %ymm1, %ymm0
181 ; GFNIAVX512-NEXT: retq
182 %res = call <32 x i8> @llvm.fshr.v32i8(<32 x i8> %a, <32 x i8> %a, <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>)
185 declare <32 x i8> @llvm.fshr.v32i8(<32 x i8>, <32 x i8>, <32 x i8>)
188 ; 512 Bit Vector Rotates
191 define <64 x i8> @splatconstant_rotl_v64i8(<64 x i8> %a) nounwind {
192 ; GFNISSE-LABEL: splatconstant_rotl_v64i8:
194 ; GFNISSE-NEXT: movdqa %xmm0, %xmm4
195 ; GFNISSE-NEXT: psrlw $7, %xmm4
196 ; GFNISSE-NEXT: movdqa {{.*#+}} xmm5 = [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]
197 ; GFNISSE-NEXT: pand %xmm5, %xmm4
198 ; GFNISSE-NEXT: paddb %xmm0, %xmm0
199 ; GFNISSE-NEXT: por %xmm4, %xmm0
200 ; GFNISSE-NEXT: movdqa %xmm1, %xmm4
201 ; GFNISSE-NEXT: psrlw $7, %xmm4
202 ; GFNISSE-NEXT: pand %xmm5, %xmm4
203 ; GFNISSE-NEXT: paddb %xmm1, %xmm1
204 ; GFNISSE-NEXT: por %xmm4, %xmm1
205 ; GFNISSE-NEXT: movdqa %xmm2, %xmm4
206 ; GFNISSE-NEXT: psrlw $7, %xmm4
207 ; GFNISSE-NEXT: pand %xmm5, %xmm4
208 ; GFNISSE-NEXT: paddb %xmm2, %xmm2
209 ; GFNISSE-NEXT: por %xmm4, %xmm2
210 ; GFNISSE-NEXT: movdqa %xmm3, %xmm4
211 ; GFNISSE-NEXT: psrlw $7, %xmm4
212 ; GFNISSE-NEXT: pand %xmm5, %xmm4
213 ; GFNISSE-NEXT: paddb %xmm3, %xmm3
214 ; GFNISSE-NEXT: por %xmm4, %xmm3
217 ; GFNIAVX1-LABEL: splatconstant_rotl_v64i8:
219 ; GFNIAVX1-NEXT: vextractf128 $1, %ymm0, %xmm2
220 ; GFNIAVX1-NEXT: vpsrlw $7, %xmm2, %xmm3
221 ; GFNIAVX1-NEXT: vbroadcastss {{.*#+}} xmm4 = [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]
222 ; GFNIAVX1-NEXT: vpand %xmm4, %xmm3, %xmm3
223 ; GFNIAVX1-NEXT: vpaddb %xmm2, %xmm2, %xmm2
224 ; GFNIAVX1-NEXT: vpor %xmm3, %xmm2, %xmm2
225 ; GFNIAVX1-NEXT: vpsrlw $7, %xmm0, %xmm3
226 ; GFNIAVX1-NEXT: vpand %xmm4, %xmm3, %xmm3
227 ; GFNIAVX1-NEXT: vpaddb %xmm0, %xmm0, %xmm0
228 ; GFNIAVX1-NEXT: vpor %xmm3, %xmm0, %xmm0
229 ; GFNIAVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0
230 ; GFNIAVX1-NEXT: vextractf128 $1, %ymm1, %xmm2
231 ; GFNIAVX1-NEXT: vpsrlw $7, %xmm2, %xmm3
232 ; GFNIAVX1-NEXT: vpand %xmm4, %xmm3, %xmm3
233 ; GFNIAVX1-NEXT: vpaddb %xmm2, %xmm2, %xmm2
234 ; GFNIAVX1-NEXT: vpor %xmm3, %xmm2, %xmm2
235 ; GFNIAVX1-NEXT: vpsrlw $7, %xmm1, %xmm3
236 ; GFNIAVX1-NEXT: vpand %xmm4, %xmm3, %xmm3
237 ; GFNIAVX1-NEXT: vpaddb %xmm1, %xmm1, %xmm1
238 ; GFNIAVX1-NEXT: vpor %xmm3, %xmm1, %xmm1
239 ; GFNIAVX1-NEXT: vinsertf128 $1, %xmm2, %ymm1, %ymm1
240 ; GFNIAVX1-NEXT: retq
242 ; GFNIAVX2-LABEL: splatconstant_rotl_v64i8:
244 ; GFNIAVX2-NEXT: vpsrlw $7, %ymm0, %ymm2
245 ; GFNIAVX2-NEXT: vpbroadcastb {{.*#+}} ymm3 = [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]
246 ; GFNIAVX2-NEXT: vpand %ymm3, %ymm2, %ymm2
247 ; GFNIAVX2-NEXT: vpaddb %ymm0, %ymm0, %ymm0
248 ; GFNIAVX2-NEXT: vpor %ymm2, %ymm0, %ymm0
249 ; GFNIAVX2-NEXT: vpsrlw $7, %ymm1, %ymm2
250 ; GFNIAVX2-NEXT: vpand %ymm3, %ymm2, %ymm2
251 ; GFNIAVX2-NEXT: vpaddb %ymm1, %ymm1, %ymm1
252 ; GFNIAVX2-NEXT: vpor %ymm2, %ymm1, %ymm1
253 ; GFNIAVX2-NEXT: retq
255 ; GFNIAVX512-LABEL: splatconstant_rotl_v64i8:
256 ; GFNIAVX512: # %bb.0:
257 ; GFNIAVX512-NEXT: vpsrlw $7, %zmm0, %zmm1
258 ; GFNIAVX512-NEXT: vpaddb %zmm0, %zmm0, %zmm0
259 ; GFNIAVX512-NEXT: vpternlogd $248, {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to16}, %zmm1, %zmm0
260 ; GFNIAVX512-NEXT: retq
261 %res = call <64 x i8> @llvm.fshl.v64i8(<64 x i8> %a, <64 x i8> %a, <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>)
264 declare <64 x i8> @llvm.fshl.v64i8(<64 x i8>, <64 x i8>, <64 x i8>)
266 define <64 x i8> @splatconstant_rotr_v64i8(<64 x i8> %a) nounwind {
267 ; GFNISSE-LABEL: splatconstant_rotr_v64i8:
269 ; GFNISSE-NEXT: movdqa %xmm0, %xmm5
270 ; GFNISSE-NEXT: psrlw $2, %xmm5
271 ; GFNISSE-NEXT: movdqa {{.*#+}} xmm4 = [192,192,192,192,192,192,192,192,192,192,192,192,192,192,192,192]
272 ; GFNISSE-NEXT: movdqa %xmm4, %xmm6
273 ; GFNISSE-NEXT: pandn %xmm5, %xmm6
274 ; GFNISSE-NEXT: psllw $6, %xmm0
275 ; GFNISSE-NEXT: pand %xmm4, %xmm0
276 ; GFNISSE-NEXT: por %xmm6, %xmm0
277 ; GFNISSE-NEXT: movdqa %xmm1, %xmm5
278 ; GFNISSE-NEXT: psrlw $2, %xmm5
279 ; GFNISSE-NEXT: movdqa %xmm4, %xmm6
280 ; GFNISSE-NEXT: pandn %xmm5, %xmm6
281 ; GFNISSE-NEXT: psllw $6, %xmm1
282 ; GFNISSE-NEXT: pand %xmm4, %xmm1
283 ; GFNISSE-NEXT: por %xmm6, %xmm1
284 ; GFNISSE-NEXT: movdqa %xmm2, %xmm5
285 ; GFNISSE-NEXT: psrlw $2, %xmm5
286 ; GFNISSE-NEXT: movdqa %xmm4, %xmm6
287 ; GFNISSE-NEXT: pandn %xmm5, %xmm6
288 ; GFNISSE-NEXT: psllw $6, %xmm2
289 ; GFNISSE-NEXT: pand %xmm4, %xmm2
290 ; GFNISSE-NEXT: por %xmm6, %xmm2
291 ; GFNISSE-NEXT: movdqa %xmm3, %xmm5
292 ; GFNISSE-NEXT: psrlw $2, %xmm5
293 ; GFNISSE-NEXT: psllw $6, %xmm3
294 ; GFNISSE-NEXT: pand %xmm4, %xmm3
295 ; GFNISSE-NEXT: pandn %xmm5, %xmm4
296 ; GFNISSE-NEXT: por %xmm4, %xmm3
299 ; GFNIAVX1-LABEL: splatconstant_rotr_v64i8:
301 ; GFNIAVX1-NEXT: vextractf128 $1, %ymm0, %xmm2
302 ; GFNIAVX1-NEXT: vpsrlw $2, %xmm2, %xmm3
303 ; GFNIAVX1-NEXT: vbroadcastss {{.*#+}} xmm4 = [192,192,192,192,192,192,192,192,192,192,192,192,192,192,192,192]
304 ; GFNIAVX1-NEXT: vpandn %xmm3, %xmm4, %xmm3
305 ; GFNIAVX1-NEXT: vpsllw $6, %xmm2, %xmm2
306 ; GFNIAVX1-NEXT: vpand %xmm4, %xmm2, %xmm2
307 ; GFNIAVX1-NEXT: vpor %xmm3, %xmm2, %xmm2
308 ; GFNIAVX1-NEXT: vpsrlw $2, %xmm0, %xmm3
309 ; GFNIAVX1-NEXT: vpandn %xmm3, %xmm4, %xmm3
310 ; GFNIAVX1-NEXT: vpsllw $6, %xmm0, %xmm0
311 ; GFNIAVX1-NEXT: vpand %xmm4, %xmm0, %xmm0
312 ; GFNIAVX1-NEXT: vpor %xmm3, %xmm0, %xmm0
313 ; GFNIAVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0
314 ; GFNIAVX1-NEXT: vextractf128 $1, %ymm1, %xmm2
315 ; GFNIAVX1-NEXT: vpsrlw $2, %xmm2, %xmm3
316 ; GFNIAVX1-NEXT: vpandn %xmm3, %xmm4, %xmm3
317 ; GFNIAVX1-NEXT: vpsllw $6, %xmm2, %xmm2
318 ; GFNIAVX1-NEXT: vpand %xmm4, %xmm2, %xmm2
319 ; GFNIAVX1-NEXT: vpor %xmm3, %xmm2, %xmm2
320 ; GFNIAVX1-NEXT: vpsrlw $2, %xmm1, %xmm3
321 ; GFNIAVX1-NEXT: vpandn %xmm3, %xmm4, %xmm3
322 ; GFNIAVX1-NEXT: vpsllw $6, %xmm1, %xmm1
323 ; GFNIAVX1-NEXT: vpand %xmm4, %xmm1, %xmm1
324 ; GFNIAVX1-NEXT: vpor %xmm3, %xmm1, %xmm1
325 ; GFNIAVX1-NEXT: vinsertf128 $1, %xmm2, %ymm1, %ymm1
326 ; GFNIAVX1-NEXT: retq
328 ; GFNIAVX2-LABEL: splatconstant_rotr_v64i8:
330 ; GFNIAVX2-NEXT: vpsrlw $2, %ymm0, %ymm2
331 ; GFNIAVX2-NEXT: vpbroadcastb {{.*#+}} ymm3 = [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]
332 ; GFNIAVX2-NEXT: vpandn %ymm2, %ymm3, %ymm2
333 ; GFNIAVX2-NEXT: vpsllw $6, %ymm0, %ymm0
334 ; GFNIAVX2-NEXT: vpand %ymm3, %ymm0, %ymm0
335 ; GFNIAVX2-NEXT: vpor %ymm2, %ymm0, %ymm0
336 ; GFNIAVX2-NEXT: vpsrlw $2, %ymm1, %ymm2
337 ; GFNIAVX2-NEXT: vpandn %ymm2, %ymm3, %ymm2
338 ; GFNIAVX2-NEXT: vpsllw $6, %ymm1, %ymm1
339 ; GFNIAVX2-NEXT: vpand %ymm3, %ymm1, %ymm1
340 ; GFNIAVX2-NEXT: vpor %ymm2, %ymm1, %ymm1
341 ; GFNIAVX2-NEXT: retq
343 ; GFNIAVX512-LABEL: splatconstant_rotr_v64i8:
344 ; GFNIAVX512: # %bb.0:
345 ; GFNIAVX512-NEXT: vpsllw $6, %zmm0, %zmm1
346 ; GFNIAVX512-NEXT: vpsrlw $2, %zmm0, %zmm0
347 ; GFNIAVX512-NEXT: vpternlogd $216, {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to16}, %zmm1, %zmm0
348 ; GFNIAVX512-NEXT: retq
349 %res = call <64 x i8> @llvm.fshr.v64i8(<64 x i8> %a, <64 x i8> %a, <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>)
352 declare <64 x i8> @llvm.fshr.v64i8(<64 x i8>, <64 x i8>, <64 x i8>)