Revert " [LoongArch][ISel] Check the number of sign bits in `PatGprGpr_32` (#107432)"
[llvm-project.git] / llvm / test / CodeGen / X86 / gfni-rotates.ll
blob5fd4dfa7cc262a3ceef6388c317ca91e95c1e271
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=GFNIAVX,GFNIAVX1OR2,GFNIAVX1
4 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx2,+gfni | FileCheck %s --check-prefixes=GFNIAVX,GFNIAVX1OR2,GFNIAVX2
5 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512vl,+gfni | FileCheck %s --check-prefixes=GFNIAVX,GFNIAVX512,GFNIAVX512VL
6 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512bw,+avx512vl,+gfni | FileCheck %s --check-prefixes=GFNIAVX,GFNIAVX512,GFNIAVX512BW
9 ; 128 Bit Vector Rotates
12 define <16 x i8> @var_rotl_v16i8(<16 x i8> %a, <16 x i8> %amt) nounwind {
13 ; GFNISSE-LABEL: var_rotl_v16i8:
14 ; GFNISSE:       # %bb.0:
15 ; GFNISSE-NEXT:    movdqa %xmm1, %xmm2
16 ; GFNISSE-NEXT:    movdqa %xmm0, %xmm1
17 ; GFNISSE-NEXT:    gf2p8affineqb $0, {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
18 ; GFNISSE-NEXT:    movdqa %xmm1, %xmm3
19 ; GFNISSE-NEXT:    gf2p8affineqb $0, {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm3
20 ; GFNISSE-NEXT:    por %xmm0, %xmm3
21 ; GFNISSE-NEXT:    psllw $5, %xmm2
22 ; GFNISSE-NEXT:    movdqa %xmm2, %xmm0
23 ; GFNISSE-NEXT:    pblendvb %xmm0, %xmm3, %xmm1
24 ; GFNISSE-NEXT:    movdqa %xmm1, %xmm0
25 ; GFNISSE-NEXT:    gf2p8affineqb $0, {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
26 ; GFNISSE-NEXT:    movdqa %xmm1, %xmm3
27 ; GFNISSE-NEXT:    gf2p8affineqb $0, {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm3
28 ; GFNISSE-NEXT:    por %xmm0, %xmm3
29 ; GFNISSE-NEXT:    paddb %xmm2, %xmm2
30 ; GFNISSE-NEXT:    movdqa %xmm2, %xmm0
31 ; GFNISSE-NEXT:    pblendvb %xmm0, %xmm3, %xmm1
32 ; GFNISSE-NEXT:    movdqa %xmm1, %xmm0
33 ; GFNISSE-NEXT:    gf2p8affineqb $0, {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
34 ; GFNISSE-NEXT:    movdqa %xmm1, %xmm3
35 ; GFNISSE-NEXT:    paddb %xmm1, %xmm3
36 ; GFNISSE-NEXT:    por %xmm0, %xmm3
37 ; GFNISSE-NEXT:    paddb %xmm2, %xmm2
38 ; GFNISSE-NEXT:    movdqa %xmm2, %xmm0
39 ; GFNISSE-NEXT:    pblendvb %xmm0, %xmm3, %xmm1
40 ; GFNISSE-NEXT:    movdqa %xmm1, %xmm0
41 ; GFNISSE-NEXT:    retq
43 ; GFNIAVX1OR2-LABEL: var_rotl_v16i8:
44 ; GFNIAVX1OR2:       # %bb.0:
45 ; GFNIAVX1OR2-NEXT:    vgf2p8affineqb $0, {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm2
46 ; GFNIAVX1OR2-NEXT:    vgf2p8affineqb $0, {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm3
47 ; GFNIAVX1OR2-NEXT:    vpor %xmm2, %xmm3, %xmm2
48 ; GFNIAVX1OR2-NEXT:    vpsllw $5, %xmm1, %xmm1
49 ; GFNIAVX1OR2-NEXT:    vpblendvb %xmm1, %xmm2, %xmm0, %xmm0
50 ; GFNIAVX1OR2-NEXT:    vgf2p8affineqb $0, {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm2
51 ; GFNIAVX1OR2-NEXT:    vgf2p8affineqb $0, {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm3
52 ; GFNIAVX1OR2-NEXT:    vpor %xmm2, %xmm3, %xmm2
53 ; GFNIAVX1OR2-NEXT:    vpaddb %xmm1, %xmm1, %xmm1
54 ; GFNIAVX1OR2-NEXT:    vpblendvb %xmm1, %xmm2, %xmm0, %xmm0
55 ; GFNIAVX1OR2-NEXT:    vgf2p8affineqb $0, {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm2
56 ; GFNIAVX1OR2-NEXT:    vpaddb %xmm0, %xmm0, %xmm3
57 ; GFNIAVX1OR2-NEXT:    vpor %xmm2, %xmm3, %xmm2
58 ; GFNIAVX1OR2-NEXT:    vpaddb %xmm1, %xmm1, %xmm1
59 ; GFNIAVX1OR2-NEXT:    vpblendvb %xmm1, %xmm2, %xmm0, %xmm0
60 ; GFNIAVX1OR2-NEXT:    retq
62 ; GFNIAVX512VL-LABEL: var_rotl_v16i8:
63 ; GFNIAVX512VL:       # %bb.0:
64 ; GFNIAVX512VL-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
65 ; GFNIAVX512VL-NEXT:    vpslld $8, %zmm0, %zmm2
66 ; GFNIAVX512VL-NEXT:    vpord %zmm2, %zmm0, %zmm0
67 ; GFNIAVX512VL-NEXT:    vpandd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to4}, %xmm1, %xmm1
68 ; GFNIAVX512VL-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
69 ; GFNIAVX512VL-NEXT:    vpsllvd %zmm1, %zmm0, %zmm0
70 ; GFNIAVX512VL-NEXT:    vpsrld $8, %zmm0, %zmm0
71 ; GFNIAVX512VL-NEXT:    vpmovdb %zmm0, %xmm0
72 ; GFNIAVX512VL-NEXT:    vzeroupper
73 ; GFNIAVX512VL-NEXT:    retq
75 ; GFNIAVX512BW-LABEL: var_rotl_v16i8:
76 ; GFNIAVX512BW:       # %bb.0:
77 ; GFNIAVX512BW-NEXT:    vpandd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to4}, %xmm1, %xmm1
78 ; GFNIAVX512BW-NEXT:    vpxor %xmm2, %xmm2, %xmm2
79 ; GFNIAVX512BW-NEXT:    vpunpckhbw {{.*#+}} xmm2 = xmm1[8],xmm2[8],xmm1[9],xmm2[9],xmm1[10],xmm2[10],xmm1[11],xmm2[11],xmm1[12],xmm2[12],xmm1[13],xmm2[13],xmm1[14],xmm2[14],xmm1[15],xmm2[15]
80 ; GFNIAVX512BW-NEXT:    vpunpckhbw {{.*#+}} xmm3 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]
81 ; GFNIAVX512BW-NEXT:    vpsllvw %xmm2, %xmm3, %xmm2
82 ; GFNIAVX512BW-NEXT:    vpsrlw $8, %xmm2, %xmm2
83 ; GFNIAVX512BW-NEXT:    vpunpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
84 ; GFNIAVX512BW-NEXT:    vpmovzxbw {{.*#+}} xmm1 = xmm1[0],zero,xmm1[1],zero,xmm1[2],zero,xmm1[3],zero,xmm1[4],zero,xmm1[5],zero,xmm1[6],zero,xmm1[7],zero
85 ; GFNIAVX512BW-NEXT:    vpsllvw %xmm1, %xmm0, %xmm0
86 ; GFNIAVX512BW-NEXT:    vpsrlw $8, %xmm0, %xmm0
87 ; GFNIAVX512BW-NEXT:    vpackuswb %xmm2, %xmm0, %xmm0
88 ; GFNIAVX512BW-NEXT:    retq
89   %res = call <16 x i8> @llvm.fshl.v16i8(<16 x i8> %a, <16 x i8> %a, <16 x i8> %amt)
90   ret <16 x i8> %res
92 define <16 x i8> @var_rotr_v16i8(<16 x i8> %a, <16 x i8> %amt) nounwind {
93 ; GFNISSE-LABEL: var_rotr_v16i8:
94 ; GFNISSE:       # %bb.0:
95 ; GFNISSE-NEXT:    movdqa %xmm0, %xmm2
96 ; GFNISSE-NEXT:    gf2p8affineqb $0, {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
97 ; GFNISSE-NEXT:    movdqa %xmm2, %xmm3
98 ; GFNISSE-NEXT:    gf2p8affineqb $0, {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm3
99 ; GFNISSE-NEXT:    por %xmm0, %xmm3
100 ; GFNISSE-NEXT:    pxor %xmm0, %xmm0
101 ; GFNISSE-NEXT:    psubb %xmm1, %xmm0
102 ; GFNISSE-NEXT:    psllw $5, %xmm0
103 ; GFNISSE-NEXT:    pblendvb %xmm0, %xmm3, %xmm2
104 ; GFNISSE-NEXT:    movdqa %xmm2, %xmm1
105 ; GFNISSE-NEXT:    gf2p8affineqb $0, {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1
106 ; GFNISSE-NEXT:    movdqa %xmm2, %xmm3
107 ; GFNISSE-NEXT:    gf2p8affineqb $0, {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm3
108 ; GFNISSE-NEXT:    por %xmm1, %xmm3
109 ; GFNISSE-NEXT:    paddb %xmm0, %xmm0
110 ; GFNISSE-NEXT:    pblendvb %xmm0, %xmm3, %xmm2
111 ; GFNISSE-NEXT:    movdqa %xmm2, %xmm1
112 ; GFNISSE-NEXT:    gf2p8affineqb $0, {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1
113 ; GFNISSE-NEXT:    movdqa %xmm2, %xmm3
114 ; GFNISSE-NEXT:    paddb %xmm2, %xmm3
115 ; GFNISSE-NEXT:    por %xmm1, %xmm3
116 ; GFNISSE-NEXT:    paddb %xmm0, %xmm0
117 ; GFNISSE-NEXT:    pblendvb %xmm0, %xmm3, %xmm2
118 ; GFNISSE-NEXT:    movdqa %xmm2, %xmm0
119 ; GFNISSE-NEXT:    retq
121 ; GFNIAVX1OR2-LABEL: var_rotr_v16i8:
122 ; GFNIAVX1OR2:       # %bb.0:
123 ; GFNIAVX1OR2-NEXT:    vgf2p8affineqb $0, {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm2
124 ; GFNIAVX1OR2-NEXT:    vgf2p8affineqb $0, {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm3
125 ; GFNIAVX1OR2-NEXT:    vpor %xmm2, %xmm3, %xmm2
126 ; GFNIAVX1OR2-NEXT:    vpxor %xmm3, %xmm3, %xmm3
127 ; GFNIAVX1OR2-NEXT:    vpsubb %xmm1, %xmm3, %xmm1
128 ; GFNIAVX1OR2-NEXT:    vpsllw $5, %xmm1, %xmm1
129 ; GFNIAVX1OR2-NEXT:    vpblendvb %xmm1, %xmm2, %xmm0, %xmm0
130 ; GFNIAVX1OR2-NEXT:    vgf2p8affineqb $0, {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm2
131 ; GFNIAVX1OR2-NEXT:    vgf2p8affineqb $0, {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm3
132 ; GFNIAVX1OR2-NEXT:    vpor %xmm2, %xmm3, %xmm2
133 ; GFNIAVX1OR2-NEXT:    vpaddb %xmm1, %xmm1, %xmm1
134 ; GFNIAVX1OR2-NEXT:    vpblendvb %xmm1, %xmm2, %xmm0, %xmm0
135 ; GFNIAVX1OR2-NEXT:    vgf2p8affineqb $0, {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm2
136 ; GFNIAVX1OR2-NEXT:    vpaddb %xmm0, %xmm0, %xmm3
137 ; GFNIAVX1OR2-NEXT:    vpor %xmm2, %xmm3, %xmm2
138 ; GFNIAVX1OR2-NEXT:    vpaddb %xmm1, %xmm1, %xmm1
139 ; GFNIAVX1OR2-NEXT:    vpblendvb %xmm1, %xmm2, %xmm0, %xmm0
140 ; GFNIAVX1OR2-NEXT:    retq
142 ; GFNIAVX512VL-LABEL: var_rotr_v16i8:
143 ; GFNIAVX512VL:       # %bb.0:
144 ; GFNIAVX512VL-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
145 ; GFNIAVX512VL-NEXT:    vpslld $8, %zmm0, %zmm2
146 ; GFNIAVX512VL-NEXT:    vpord %zmm2, %zmm0, %zmm0
147 ; GFNIAVX512VL-NEXT:    vpandd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to4}, %xmm1, %xmm1
148 ; GFNIAVX512VL-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
149 ; GFNIAVX512VL-NEXT:    vpsrlvd %zmm1, %zmm0, %zmm0
150 ; GFNIAVX512VL-NEXT:    vpmovdb %zmm0, %xmm0
151 ; GFNIAVX512VL-NEXT:    vzeroupper
152 ; GFNIAVX512VL-NEXT:    retq
154 ; GFNIAVX512BW-LABEL: var_rotr_v16i8:
155 ; GFNIAVX512BW:       # %bb.0:
156 ; GFNIAVX512BW-NEXT:    vpandd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to4}, %xmm1, %xmm1
157 ; GFNIAVX512BW-NEXT:    vpxor %xmm2, %xmm2, %xmm2
158 ; GFNIAVX512BW-NEXT:    vpunpckhbw {{.*#+}} xmm2 = xmm1[8],xmm2[8],xmm1[9],xmm2[9],xmm1[10],xmm2[10],xmm1[11],xmm2[11],xmm1[12],xmm2[12],xmm1[13],xmm2[13],xmm1[14],xmm2[14],xmm1[15],xmm2[15]
159 ; GFNIAVX512BW-NEXT:    vpunpckhbw {{.*#+}} xmm3 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]
160 ; GFNIAVX512BW-NEXT:    vpsrlvw %xmm2, %xmm3, %xmm2
161 ; GFNIAVX512BW-NEXT:    vpunpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
162 ; GFNIAVX512BW-NEXT:    vpmovzxbw {{.*#+}} xmm1 = xmm1[0],zero,xmm1[1],zero,xmm1[2],zero,xmm1[3],zero,xmm1[4],zero,xmm1[5],zero,xmm1[6],zero,xmm1[7],zero
163 ; GFNIAVX512BW-NEXT:    vpsrlvw %xmm1, %xmm0, %xmm0
164 ; GFNIAVX512BW-NEXT:    vinserti128 $1, %xmm2, %ymm0, %ymm0
165 ; GFNIAVX512BW-NEXT:    vpmovwb %ymm0, %xmm0
166 ; GFNIAVX512BW-NEXT:    vzeroupper
167 ; GFNIAVX512BW-NEXT:    retq
168   %res = call <16 x i8> @llvm.fshr.v16i8(<16 x i8> %a, <16 x i8> %a, <16 x i8> %amt)
169   ret <16 x i8> %res
172 define <16 x i8> @splatvar_rotl_v16i8(<16 x i8> %a, <16 x i8> %amt) nounwind {
173 ; GFNISSE-LABEL: splatvar_rotl_v16i8:
174 ; GFNISSE:       # %bb.0:
175 ; GFNISSE-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1
176 ; GFNISSE-NEXT:    movdqa %xmm0, %xmm2
177 ; GFNISSE-NEXT:    punpckhbw {{.*#+}} xmm2 = xmm2[8],xmm0[8],xmm2[9],xmm0[9],xmm2[10],xmm0[10],xmm2[11],xmm0[11],xmm2[12],xmm0[12],xmm2[13],xmm0[13],xmm2[14],xmm0[14],xmm2[15],xmm0[15]
178 ; GFNISSE-NEXT:    psllw %xmm1, %xmm2
179 ; GFNISSE-NEXT:    psrlw $8, %xmm2
180 ; GFNISSE-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
181 ; GFNISSE-NEXT:    psllw %xmm1, %xmm0
182 ; GFNISSE-NEXT:    psrlw $8, %xmm0
183 ; GFNISSE-NEXT:    packuswb %xmm2, %xmm0
184 ; GFNISSE-NEXT:    retq
186 ; GFNIAVX-LABEL: splatvar_rotl_v16i8:
187 ; GFNIAVX:       # %bb.0:
188 ; GFNIAVX-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1
189 ; GFNIAVX-NEXT:    vpunpckhbw {{.*#+}} xmm2 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]
190 ; GFNIAVX-NEXT:    vpsllw %xmm1, %xmm2, %xmm2
191 ; GFNIAVX-NEXT:    vpsrlw $8, %xmm2, %xmm2
192 ; GFNIAVX-NEXT:    vpunpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
193 ; GFNIAVX-NEXT:    vpsllw %xmm1, %xmm0, %xmm0
194 ; GFNIAVX-NEXT:    vpsrlw $8, %xmm0, %xmm0
195 ; GFNIAVX-NEXT:    vpackuswb %xmm2, %xmm0, %xmm0
196 ; GFNIAVX-NEXT:    retq
197   %splat = shufflevector <16 x i8> %amt, <16 x i8> undef, <16 x i32> zeroinitializer
198   %res = call <16 x i8> @llvm.fshl.v16i8(<16 x i8> %a, <16 x i8> %a, <16 x i8> %splat)
199   ret <16 x i8> %res
202 define <16 x i8> @splatvar_rotr_v16i8(<16 x i8> %a, <16 x i8> %amt) nounwind {
203 ; GFNISSE-LABEL: splatvar_rotr_v16i8:
204 ; GFNISSE:       # %bb.0:
205 ; GFNISSE-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1
206 ; GFNISSE-NEXT:    movdqa %xmm0, %xmm2
207 ; GFNISSE-NEXT:    punpckhbw {{.*#+}} xmm2 = xmm2[8],xmm0[8],xmm2[9],xmm0[9],xmm2[10],xmm0[10],xmm2[11],xmm0[11],xmm2[12],xmm0[12],xmm2[13],xmm0[13],xmm2[14],xmm0[14],xmm2[15],xmm0[15]
208 ; GFNISSE-NEXT:    psrlw %xmm1, %xmm2
209 ; GFNISSE-NEXT:    pmovzxbw {{.*#+}} xmm3 = [255,255,255,255,255,255,255,255]
210 ; GFNISSE-NEXT:    pand %xmm3, %xmm2
211 ; GFNISSE-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
212 ; GFNISSE-NEXT:    psrlw %xmm1, %xmm0
213 ; GFNISSE-NEXT:    pand %xmm3, %xmm0
214 ; GFNISSE-NEXT:    packuswb %xmm2, %xmm0
215 ; GFNISSE-NEXT:    retq
217 ; GFNIAVX1-LABEL: splatvar_rotr_v16i8:
218 ; GFNIAVX1:       # %bb.0:
219 ; GFNIAVX1-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1
220 ; GFNIAVX1-NEXT:    vpunpckhbw {{.*#+}} xmm2 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]
221 ; GFNIAVX1-NEXT:    vpsrlw %xmm1, %xmm2, %xmm2
222 ; GFNIAVX1-NEXT:    vbroadcastss {{.*#+}} xmm3 = [255,255,255,255,255,255,255,255]
223 ; GFNIAVX1-NEXT:    vpand %xmm3, %xmm2, %xmm2
224 ; GFNIAVX1-NEXT:    vpunpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
225 ; GFNIAVX1-NEXT:    vpsrlw %xmm1, %xmm0, %xmm0
226 ; GFNIAVX1-NEXT:    vpand %xmm3, %xmm0, %xmm0
227 ; GFNIAVX1-NEXT:    vpackuswb %xmm2, %xmm0, %xmm0
228 ; GFNIAVX1-NEXT:    retq
230 ; GFNIAVX2-LABEL: splatvar_rotr_v16i8:
231 ; GFNIAVX2:       # %bb.0:
232 ; GFNIAVX2-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1
233 ; GFNIAVX2-NEXT:    vpunpckhbw {{.*#+}} xmm2 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]
234 ; GFNIAVX2-NEXT:    vpsrlw %xmm1, %xmm2, %xmm2
235 ; GFNIAVX2-NEXT:    vpbroadcastw {{.*#+}} xmm3 = [255,255,255,255,255,255,255,255]
236 ; GFNIAVX2-NEXT:    vpand %xmm3, %xmm2, %xmm2
237 ; GFNIAVX2-NEXT:    vpunpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
238 ; GFNIAVX2-NEXT:    vpsrlw %xmm1, %xmm0, %xmm0
239 ; GFNIAVX2-NEXT:    vpand %xmm3, %xmm0, %xmm0
240 ; GFNIAVX2-NEXT:    vpackuswb %xmm2, %xmm0, %xmm0
241 ; GFNIAVX2-NEXT:    retq
243 ; GFNIAVX512VL-LABEL: splatvar_rotr_v16i8:
244 ; GFNIAVX512VL:       # %bb.0:
245 ; GFNIAVX512VL-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1
246 ; GFNIAVX512VL-NEXT:    vpunpckhbw {{.*#+}} xmm2 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]
247 ; GFNIAVX512VL-NEXT:    vpsrlw %xmm1, %xmm2, %xmm2
248 ; GFNIAVX512VL-NEXT:    vpbroadcastd {{.*#+}} xmm3 = [255,255,255,255,255,255,255,255]
249 ; GFNIAVX512VL-NEXT:    vpand %xmm3, %xmm2, %xmm2
250 ; GFNIAVX512VL-NEXT:    vpunpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
251 ; GFNIAVX512VL-NEXT:    vpsrlw %xmm1, %xmm0, %xmm0
252 ; GFNIAVX512VL-NEXT:    vpand %xmm3, %xmm0, %xmm0
253 ; GFNIAVX512VL-NEXT:    vpackuswb %xmm2, %xmm0, %xmm0
254 ; GFNIAVX512VL-NEXT:    retq
256 ; GFNIAVX512BW-LABEL: splatvar_rotr_v16i8:
257 ; GFNIAVX512BW:       # %bb.0:
258 ; GFNIAVX512BW-NEXT:    vpunpcklbw {{.*#+}} xmm2 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
259 ; GFNIAVX512BW-NEXT:    vpunpckhbw {{.*#+}} xmm0 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]
260 ; GFNIAVX512BW-NEXT:    vinserti128 $1, %xmm0, %ymm2, %ymm0
261 ; GFNIAVX512BW-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1
262 ; GFNIAVX512BW-NEXT:    vpsrlw %xmm1, %ymm0, %ymm0
263 ; GFNIAVX512BW-NEXT:    vpmovwb %ymm0, %xmm0
264 ; GFNIAVX512BW-NEXT:    vzeroupper
265 ; GFNIAVX512BW-NEXT:    retq
266   %splat = shufflevector <16 x i8> %amt, <16 x i8> undef, <16 x i32> zeroinitializer
267   %res = call <16 x i8> @llvm.fshr.v16i8(<16 x i8> %a, <16 x i8> %a, <16 x i8> %splat)
268   ret <16 x i8> %res
271 define <16 x i8> @constant_rotl_v16i8(<16 x i8> %a) nounwind {
272 ; GFNISSE-LABEL: constant_rotl_v16i8:
273 ; GFNISSE:       # %bb.0:
274 ; GFNISSE-NEXT:    movdqa %xmm0, %xmm1
275 ; GFNISSE-NEXT:    punpckhbw {{.*#+}} xmm1 = xmm1[8],xmm0[8],xmm1[9],xmm0[9],xmm1[10],xmm0[10],xmm1[11],xmm0[11],xmm1[12],xmm0[12],xmm1[13],xmm0[13],xmm1[14],xmm0[14],xmm1[15],xmm0[15]
276 ; GFNISSE-NEXT:    pmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1 # [1,128,64,32,16,8,4,2]
277 ; GFNISSE-NEXT:    psrlw $8, %xmm1
278 ; GFNISSE-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
279 ; GFNISSE-NEXT:    pmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0 # [1,2,4,8,16,32,64,128]
280 ; GFNISSE-NEXT:    psrlw $8, %xmm0
281 ; GFNISSE-NEXT:    packuswb %xmm1, %xmm0
282 ; GFNISSE-NEXT:    retq
284 ; GFNIAVX1OR2-LABEL: constant_rotl_v16i8:
285 ; GFNIAVX1OR2:       # %bb.0:
286 ; GFNIAVX1OR2-NEXT:    vpunpckhbw {{.*#+}} xmm1 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]
287 ; GFNIAVX1OR2-NEXT:    vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1 # [1,128,64,32,16,8,4,2]
288 ; GFNIAVX1OR2-NEXT:    vpsrlw $8, %xmm1, %xmm1
289 ; GFNIAVX1OR2-NEXT:    vpunpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
290 ; GFNIAVX1OR2-NEXT:    vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0 # [1,2,4,8,16,32,64,128]
291 ; GFNIAVX1OR2-NEXT:    vpsrlw $8, %xmm0, %xmm0
292 ; GFNIAVX1OR2-NEXT:    vpackuswb %xmm1, %xmm0, %xmm0
293 ; GFNIAVX1OR2-NEXT:    retq
295 ; GFNIAVX512VL-LABEL: constant_rotl_v16i8:
296 ; GFNIAVX512VL:       # %bb.0:
297 ; GFNIAVX512VL-NEXT:    vpunpckhbw {{.*#+}} xmm1 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]
298 ; GFNIAVX512VL-NEXT:    vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1 # [1,128,64,32,16,8,4,2]
299 ; GFNIAVX512VL-NEXT:    vpsrlw $8, %xmm1, %xmm1
300 ; GFNIAVX512VL-NEXT:    vpunpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
301 ; GFNIAVX512VL-NEXT:    vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0 # [1,2,4,8,16,32,64,128]
302 ; GFNIAVX512VL-NEXT:    vpsrlw $8, %xmm0, %xmm0
303 ; GFNIAVX512VL-NEXT:    vpackuswb %xmm1, %xmm0, %xmm0
304 ; GFNIAVX512VL-NEXT:    retq
306 ; GFNIAVX512BW-LABEL: constant_rotl_v16i8:
307 ; GFNIAVX512BW:       # %bb.0:
308 ; GFNIAVX512BW-NEXT:    vpunpckhbw {{.*#+}} xmm1 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]
309 ; GFNIAVX512BW-NEXT:    vpsllvw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1
310 ; GFNIAVX512BW-NEXT:    vpsrlw $8, %xmm1, %xmm1
311 ; GFNIAVX512BW-NEXT:    vpunpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
312 ; GFNIAVX512BW-NEXT:    vpsllvw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0
313 ; GFNIAVX512BW-NEXT:    vpsrlw $8, %xmm0, %xmm0
314 ; GFNIAVX512BW-NEXT:    vpackuswb %xmm1, %xmm0, %xmm0
315 ; GFNIAVX512BW-NEXT:    retq
316   %res = call <16 x i8> @llvm.fshl.v16i8(<16 x i8> %a, <16 x i8> %a, <16 x i8> <i8 0, i8 1, i8 2, i8 3, i8 4, i8 5, i8 6, i8 7, i8 8, i8 7, i8 6, i8 5, i8 4, i8 3, i8 2, i8 1>)
317   ret <16 x i8> %res
320 define <16 x i8> @constant_rotr_v16i8(<16 x i8> %a) nounwind {
321 ; GFNISSE-LABEL: constant_rotr_v16i8:
322 ; GFNISSE:       # %bb.0:
323 ; GFNISSE-NEXT:    movdqa %xmm0, %xmm1
324 ; GFNISSE-NEXT:    punpckhbw {{.*#+}} xmm1 = xmm1[8],xmm0[8],xmm1[9],xmm0[9],xmm1[10],xmm0[10],xmm1[11],xmm0[11],xmm1[12],xmm0[12],xmm1[13],xmm0[13],xmm1[14],xmm0[14],xmm1[15],xmm0[15]
325 ; GFNISSE-NEXT:    pmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1 # [1,128,64,32,16,8,4,2]
326 ; GFNISSE-NEXT:    psrlw $8, %xmm1
327 ; GFNISSE-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
328 ; GFNISSE-NEXT:    pmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0 # [1,2,4,8,16,32,64,128]
329 ; GFNISSE-NEXT:    psrlw $8, %xmm0
330 ; GFNISSE-NEXT:    packuswb %xmm1, %xmm0
331 ; GFNISSE-NEXT:    retq
333 ; GFNIAVX1OR2-LABEL: constant_rotr_v16i8:
334 ; GFNIAVX1OR2:       # %bb.0:
335 ; GFNIAVX1OR2-NEXT:    vpunpckhbw {{.*#+}} xmm1 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]
336 ; GFNIAVX1OR2-NEXT:    vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1 # [1,128,64,32,16,8,4,2]
337 ; GFNIAVX1OR2-NEXT:    vpsrlw $8, %xmm1, %xmm1
338 ; GFNIAVX1OR2-NEXT:    vpunpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
339 ; GFNIAVX1OR2-NEXT:    vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0 # [1,2,4,8,16,32,64,128]
340 ; GFNIAVX1OR2-NEXT:    vpsrlw $8, %xmm0, %xmm0
341 ; GFNIAVX1OR2-NEXT:    vpackuswb %xmm1, %xmm0, %xmm0
342 ; GFNIAVX1OR2-NEXT:    retq
344 ; GFNIAVX512VL-LABEL: constant_rotr_v16i8:
345 ; GFNIAVX512VL:       # %bb.0:
346 ; GFNIAVX512VL-NEXT:    vpunpckhbw {{.*#+}} xmm1 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]
347 ; GFNIAVX512VL-NEXT:    vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1 # [1,128,64,32,16,8,4,2]
348 ; GFNIAVX512VL-NEXT:    vpsrlw $8, %xmm1, %xmm1
349 ; GFNIAVX512VL-NEXT:    vpunpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
350 ; GFNIAVX512VL-NEXT:    vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0 # [1,2,4,8,16,32,64,128]
351 ; GFNIAVX512VL-NEXT:    vpsrlw $8, %xmm0, %xmm0
352 ; GFNIAVX512VL-NEXT:    vpackuswb %xmm1, %xmm0, %xmm0
353 ; GFNIAVX512VL-NEXT:    retq
355 ; GFNIAVX512BW-LABEL: constant_rotr_v16i8:
356 ; GFNIAVX512BW:       # %bb.0:
357 ; GFNIAVX512BW-NEXT:    vpunpckhbw {{.*#+}} xmm1 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]
358 ; GFNIAVX512BW-NEXT:    vpsllvw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1
359 ; GFNIAVX512BW-NEXT:    vpsrlw $8, %xmm1, %xmm1
360 ; GFNIAVX512BW-NEXT:    vpunpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
361 ; GFNIAVX512BW-NEXT:    vpsllvw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0
362 ; GFNIAVX512BW-NEXT:    vpsrlw $8, %xmm0, %xmm0
363 ; GFNIAVX512BW-NEXT:    vpackuswb %xmm1, %xmm0, %xmm0
364 ; GFNIAVX512BW-NEXT:    retq
365   %res = call <16 x i8> @llvm.fshl.v16i8(<16 x i8> %a, <16 x i8> %a, <16 x i8> <i8 0, i8 1, i8 2, i8 3, i8 4, i8 5, i8 6, i8 7, i8 8, i8 7, i8 6, i8 5, i8 4, i8 3, i8 2, i8 1>)
366   ret <16 x i8> %res
369 define <16 x i8> @splatconstant_rotl_v16i8(<16 x i8> %a) nounwind {
370 ; GFNISSE-LABEL: splatconstant_rotl_v16i8:
371 ; GFNISSE:       # %bb.0:
372 ; GFNISSE-NEXT:    gf2p8affineqb $0, {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
373 ; GFNISSE-NEXT:    retq
375 ; GFNIAVX1OR2-LABEL: splatconstant_rotl_v16i8:
376 ; GFNIAVX1OR2:       # %bb.0:
377 ; GFNIAVX1OR2-NEXT:    vgf2p8affineqb $0, {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0
378 ; GFNIAVX1OR2-NEXT:    retq
380 ; GFNIAVX512-LABEL: splatconstant_rotl_v16i8:
381 ; GFNIAVX512:       # %bb.0:
382 ; GFNIAVX512-NEXT:    vgf2p8affineqb $0, {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to2}, %xmm0, %xmm0
383 ; GFNIAVX512-NEXT:    retq
384   %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>)
385   ret <16 x i8> %res
387 declare <16 x i8> @llvm.fshl.v16i8(<16 x i8>, <16 x i8>, <16 x i8>)
389 define <16 x i8> @splatconstant_rotr_v16i8(<16 x i8> %a) nounwind {
390 ; GFNISSE-LABEL: splatconstant_rotr_v16i8:
391 ; GFNISSE:       # %bb.0:
392 ; GFNISSE-NEXT:    gf2p8affineqb $0, {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
393 ; GFNISSE-NEXT:    retq
395 ; GFNIAVX1OR2-LABEL: splatconstant_rotr_v16i8:
396 ; GFNIAVX1OR2:       # %bb.0:
397 ; GFNIAVX1OR2-NEXT:    vgf2p8affineqb $0, {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0
398 ; GFNIAVX1OR2-NEXT:    retq
400 ; GFNIAVX512-LABEL: splatconstant_rotr_v16i8:
401 ; GFNIAVX512:       # %bb.0:
402 ; GFNIAVX512-NEXT:    vgf2p8affineqb $0, {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to2}, %xmm0, %xmm0
403 ; GFNIAVX512-NEXT:    retq
404   %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>)
405   ret <16 x i8> %res
407 declare <16 x i8> @llvm.fshr.v16i8(<16 x i8>, <16 x i8>, <16 x i8>)
410 ; 256 Bit Vector Rotates
413 define <32 x i8> @var_rotl_v32i8(<32 x i8> %a, <32 x i8> %amt) nounwind {
414 ; GFNISSE-LABEL: var_rotl_v32i8:
415 ; GFNISSE:       # %bb.0:
416 ; GFNISSE-NEXT:    movdqa %xmm2, %xmm4
417 ; GFNISSE-NEXT:    movdqa %xmm0, %xmm2
418 ; GFNISSE-NEXT:    movdqa {{.*#+}} xmm5 = [0,0,0,0,128,64,32,16,0,0,0,0,128,64,32,16]
419 ; GFNISSE-NEXT:    gf2p8affineqb $0, %xmm5, %xmm0
420 ; GFNISSE-NEXT:    pmovsxdq {{.*#+}} xmm6 = [16909320,16909320]
421 ; GFNISSE-NEXT:    movdqa %xmm2, %xmm7
422 ; GFNISSE-NEXT:    gf2p8affineqb $0, %xmm6, %xmm7
423 ; GFNISSE-NEXT:    por %xmm0, %xmm7
424 ; GFNISSE-NEXT:    psllw $5, %xmm4
425 ; GFNISSE-NEXT:    movdqa %xmm4, %xmm0
426 ; GFNISSE-NEXT:    pblendvb %xmm0, %xmm7, %xmm2
427 ; GFNISSE-NEXT:    movdqa {{.*#+}} xmm7 = [0,0,0,0,0,0,128,64,0,0,0,0,0,0,128,64]
428 ; GFNISSE-NEXT:    movdqa %xmm2, %xmm0
429 ; GFNISSE-NEXT:    gf2p8affineqb $0, %xmm7, %xmm0
430 ; GFNISSE-NEXT:    movdqa {{.*#+}} xmm8 = [32,16,8,4,2,1,0,0,32,16,8,4,2,1,0,0]
431 ; GFNISSE-NEXT:    movdqa %xmm2, %xmm9
432 ; GFNISSE-NEXT:    gf2p8affineqb $0, %xmm8, %xmm9
433 ; GFNISSE-NEXT:    por %xmm0, %xmm9
434 ; GFNISSE-NEXT:    paddb %xmm4, %xmm4
435 ; GFNISSE-NEXT:    movdqa %xmm4, %xmm0
436 ; GFNISSE-NEXT:    pblendvb %xmm0, %xmm9, %xmm2
437 ; GFNISSE-NEXT:    movdqa {{.*#+}} xmm9 = [0,0,0,0,0,0,0,128,0,0,0,0,0,0,0,128]
438 ; GFNISSE-NEXT:    movdqa %xmm2, %xmm0
439 ; GFNISSE-NEXT:    gf2p8affineqb $0, %xmm9, %xmm0
440 ; GFNISSE-NEXT:    movdqa %xmm2, %xmm10
441 ; GFNISSE-NEXT:    paddb %xmm2, %xmm10
442 ; GFNISSE-NEXT:    por %xmm0, %xmm10
443 ; GFNISSE-NEXT:    paddb %xmm4, %xmm4
444 ; GFNISSE-NEXT:    movdqa %xmm4, %xmm0
445 ; GFNISSE-NEXT:    pblendvb %xmm0, %xmm10, %xmm2
446 ; GFNISSE-NEXT:    movdqa %xmm1, %xmm0
447 ; GFNISSE-NEXT:    gf2p8affineqb $0, %xmm5, %xmm0
448 ; GFNISSE-NEXT:    movdqa %xmm1, %xmm4
449 ; GFNISSE-NEXT:    gf2p8affineqb $0, %xmm6, %xmm4
450 ; GFNISSE-NEXT:    por %xmm0, %xmm4
451 ; GFNISSE-NEXT:    psllw $5, %xmm3
452 ; GFNISSE-NEXT:    movdqa %xmm3, %xmm0
453 ; GFNISSE-NEXT:    pblendvb %xmm0, %xmm4, %xmm1
454 ; GFNISSE-NEXT:    movdqa %xmm1, %xmm0
455 ; GFNISSE-NEXT:    gf2p8affineqb $0, %xmm7, %xmm0
456 ; GFNISSE-NEXT:    movdqa %xmm1, %xmm4
457 ; GFNISSE-NEXT:    gf2p8affineqb $0, %xmm8, %xmm4
458 ; GFNISSE-NEXT:    por %xmm0, %xmm4
459 ; GFNISSE-NEXT:    paddb %xmm3, %xmm3
460 ; GFNISSE-NEXT:    movdqa %xmm3, %xmm0
461 ; GFNISSE-NEXT:    pblendvb %xmm0, %xmm4, %xmm1
462 ; GFNISSE-NEXT:    movdqa %xmm1, %xmm0
463 ; GFNISSE-NEXT:    gf2p8affineqb $0, %xmm9, %xmm0
464 ; GFNISSE-NEXT:    movdqa %xmm1, %xmm4
465 ; GFNISSE-NEXT:    paddb %xmm1, %xmm4
466 ; GFNISSE-NEXT:    por %xmm0, %xmm4
467 ; GFNISSE-NEXT:    paddb %xmm3, %xmm3
468 ; GFNISSE-NEXT:    movdqa %xmm3, %xmm0
469 ; GFNISSE-NEXT:    pblendvb %xmm0, %xmm4, %xmm1
470 ; GFNISSE-NEXT:    movdqa %xmm2, %xmm0
471 ; GFNISSE-NEXT:    retq
473 ; GFNIAVX1-LABEL: var_rotl_v32i8:
474 ; GFNIAVX1:       # %bb.0:
475 ; GFNIAVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2
476 ; GFNIAVX1-NEXT:    vmovddup {{.*#+}} xmm3 = [0,0,0,0,128,64,32,16,0,0,0,0,128,64,32,16]
477 ; GFNIAVX1-NEXT:    # xmm3 = mem[0,0]
478 ; GFNIAVX1-NEXT:    vgf2p8affineqb $0, %xmm3, %xmm2, %xmm4
479 ; GFNIAVX1-NEXT:    vmovddup {{.*#+}} xmm5 = [8,4,2,1,0,0,0,0,8,4,2,1,0,0,0,0]
480 ; GFNIAVX1-NEXT:    # xmm5 = mem[0,0]
481 ; GFNIAVX1-NEXT:    vgf2p8affineqb $0, %xmm5, %xmm2, %xmm6
482 ; GFNIAVX1-NEXT:    vpor %xmm4, %xmm6, %xmm4
483 ; GFNIAVX1-NEXT:    vextractf128 $1, %ymm1, %xmm6
484 ; GFNIAVX1-NEXT:    vpsllw $5, %xmm6, %xmm6
485 ; GFNIAVX1-NEXT:    vpblendvb %xmm6, %xmm4, %xmm2, %xmm2
486 ; GFNIAVX1-NEXT:    vmovddup {{.*#+}} xmm4 = [0,0,0,0,0,0,128,64,0,0,0,0,0,0,128,64]
487 ; GFNIAVX1-NEXT:    # xmm4 = mem[0,0]
488 ; GFNIAVX1-NEXT:    vgf2p8affineqb $0, %xmm4, %xmm2, %xmm7
489 ; GFNIAVX1-NEXT:    vmovddup {{.*#+}} xmm8 = [32,16,8,4,2,1,0,0,32,16,8,4,2,1,0,0]
490 ; GFNIAVX1-NEXT:    # xmm8 = mem[0,0]
491 ; GFNIAVX1-NEXT:    vgf2p8affineqb $0, %xmm8, %xmm2, %xmm9
492 ; GFNIAVX1-NEXT:    vpor %xmm7, %xmm9, %xmm7
493 ; GFNIAVX1-NEXT:    vpaddb %xmm6, %xmm6, %xmm6
494 ; GFNIAVX1-NEXT:    vpblendvb %xmm6, %xmm7, %xmm2, %xmm2
495 ; GFNIAVX1-NEXT:    vmovddup {{.*#+}} xmm7 = [0,0,0,0,0,0,0,128,0,0,0,0,0,0,0,128]
496 ; GFNIAVX1-NEXT:    # xmm7 = mem[0,0]
497 ; GFNIAVX1-NEXT:    vgf2p8affineqb $0, %xmm7, %xmm2, %xmm9
498 ; GFNIAVX1-NEXT:    vpaddb %xmm2, %xmm2, %xmm10
499 ; GFNIAVX1-NEXT:    vpor %xmm9, %xmm10, %xmm9
500 ; GFNIAVX1-NEXT:    vpaddb %xmm6, %xmm6, %xmm6
501 ; GFNIAVX1-NEXT:    vpblendvb %xmm6, %xmm9, %xmm2, %xmm2
502 ; GFNIAVX1-NEXT:    vgf2p8affineqb $0, %xmm3, %xmm0, %xmm3
503 ; GFNIAVX1-NEXT:    vgf2p8affineqb $0, %xmm5, %xmm0, %xmm5
504 ; GFNIAVX1-NEXT:    vpor %xmm3, %xmm5, %xmm3
505 ; GFNIAVX1-NEXT:    vpsllw $5, %xmm1, %xmm1
506 ; GFNIAVX1-NEXT:    vpblendvb %xmm1, %xmm3, %xmm0, %xmm0
507 ; GFNIAVX1-NEXT:    vgf2p8affineqb $0, %xmm4, %xmm0, %xmm3
508 ; GFNIAVX1-NEXT:    vgf2p8affineqb $0, %xmm8, %xmm0, %xmm4
509 ; GFNIAVX1-NEXT:    vpor %xmm3, %xmm4, %xmm3
510 ; GFNIAVX1-NEXT:    vpaddb %xmm1, %xmm1, %xmm1
511 ; GFNIAVX1-NEXT:    vpblendvb %xmm1, %xmm3, %xmm0, %xmm0
512 ; GFNIAVX1-NEXT:    vgf2p8affineqb $0, %xmm7, %xmm0, %xmm3
513 ; GFNIAVX1-NEXT:    vpaddb %xmm0, %xmm0, %xmm4
514 ; GFNIAVX1-NEXT:    vpor %xmm3, %xmm4, %xmm3
515 ; GFNIAVX1-NEXT:    vpaddb %xmm1, %xmm1, %xmm1
516 ; GFNIAVX1-NEXT:    vpblendvb %xmm1, %xmm3, %xmm0, %xmm0
517 ; GFNIAVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
518 ; GFNIAVX1-NEXT:    retq
520 ; GFNIAVX2-LABEL: var_rotl_v32i8:
521 ; GFNIAVX2:       # %bb.0:
522 ; GFNIAVX2-NEXT:    vgf2p8affineqb $0, {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm2
523 ; GFNIAVX2-NEXT:    vgf2p8affineqb $0, {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm3
524 ; GFNIAVX2-NEXT:    vpor %ymm2, %ymm3, %ymm2
525 ; GFNIAVX2-NEXT:    vpsllw $5, %ymm1, %ymm1
526 ; GFNIAVX2-NEXT:    vpblendvb %ymm1, %ymm2, %ymm0, %ymm0
527 ; GFNIAVX2-NEXT:    vgf2p8affineqb $0, {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm2
528 ; GFNIAVX2-NEXT:    vgf2p8affineqb $0, {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm3
529 ; GFNIAVX2-NEXT:    vpor %ymm2, %ymm3, %ymm2
530 ; GFNIAVX2-NEXT:    vpaddb %ymm1, %ymm1, %ymm1
531 ; GFNIAVX2-NEXT:    vpblendvb %ymm1, %ymm2, %ymm0, %ymm0
532 ; GFNIAVX2-NEXT:    vgf2p8affineqb $0, {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm2
533 ; GFNIAVX2-NEXT:    vpaddb %ymm0, %ymm0, %ymm3
534 ; GFNIAVX2-NEXT:    vpor %ymm2, %ymm3, %ymm2
535 ; GFNIAVX2-NEXT:    vpaddb %ymm1, %ymm1, %ymm1
536 ; GFNIAVX2-NEXT:    vpblendvb %ymm1, %ymm2, %ymm0, %ymm0
537 ; GFNIAVX2-NEXT:    retq
539 ; GFNIAVX512VL-LABEL: var_rotl_v32i8:
540 ; GFNIAVX512VL:       # %bb.0:
541 ; GFNIAVX512VL-NEXT:    vgf2p8affineqb $0, {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to4}, %ymm0, %ymm2
542 ; GFNIAVX512VL-NEXT:    vgf2p8affineqb $0, {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to4}, %ymm0, %ymm3
543 ; GFNIAVX512VL-NEXT:    vpor %ymm2, %ymm3, %ymm2
544 ; GFNIAVX512VL-NEXT:    vpsllw $5, %ymm1, %ymm1
545 ; GFNIAVX512VL-NEXT:    vpblendvb %ymm1, %ymm2, %ymm0, %ymm0
546 ; GFNIAVX512VL-NEXT:    vgf2p8affineqb $0, {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to4}, %ymm0, %ymm2
547 ; GFNIAVX512VL-NEXT:    vgf2p8affineqb $0, {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to4}, %ymm0, %ymm3
548 ; GFNIAVX512VL-NEXT:    vpor %ymm2, %ymm3, %ymm2
549 ; GFNIAVX512VL-NEXT:    vpaddb %ymm1, %ymm1, %ymm1
550 ; GFNIAVX512VL-NEXT:    vpblendvb %ymm1, %ymm2, %ymm0, %ymm0
551 ; GFNIAVX512VL-NEXT:    vgf2p8affineqb $0, {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to4}, %ymm0, %ymm2
552 ; GFNIAVX512VL-NEXT:    vpaddb %ymm0, %ymm0, %ymm3
553 ; GFNIAVX512VL-NEXT:    vpor %ymm2, %ymm3, %ymm2
554 ; GFNIAVX512VL-NEXT:    vpaddb %ymm1, %ymm1, %ymm1
555 ; GFNIAVX512VL-NEXT:    vpblendvb %ymm1, %ymm2, %ymm0, %ymm0
556 ; GFNIAVX512VL-NEXT:    retq
558 ; GFNIAVX512BW-LABEL: var_rotl_v32i8:
559 ; GFNIAVX512BW:       # %bb.0:
560 ; GFNIAVX512BW-NEXT:    vpandd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to8}, %ymm1, %ymm1
561 ; GFNIAVX512BW-NEXT:    vpxor %xmm2, %xmm2, %xmm2
562 ; GFNIAVX512BW-NEXT:    vpunpckhbw {{.*#+}} ymm3 = ymm1[8],ymm2[8],ymm1[9],ymm2[9],ymm1[10],ymm2[10],ymm1[11],ymm2[11],ymm1[12],ymm2[12],ymm1[13],ymm2[13],ymm1[14],ymm2[14],ymm1[15],ymm2[15],ymm1[24],ymm2[24],ymm1[25],ymm2[25],ymm1[26],ymm2[26],ymm1[27],ymm2[27],ymm1[28],ymm2[28],ymm1[29],ymm2[29],ymm1[30],ymm2[30],ymm1[31],ymm2[31]
563 ; GFNIAVX512BW-NEXT:    vpunpckhbw {{.*#+}} ymm4 = 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]
564 ; GFNIAVX512BW-NEXT:    vpsllvw %ymm3, %ymm4, %ymm3
565 ; GFNIAVX512BW-NEXT:    vpsrlw $8, %ymm3, %ymm3
566 ; GFNIAVX512BW-NEXT:    vpunpcklbw {{.*#+}} ymm1 = ymm1[0],ymm2[0],ymm1[1],ymm2[1],ymm1[2],ymm2[2],ymm1[3],ymm2[3],ymm1[4],ymm2[4],ymm1[5],ymm2[5],ymm1[6],ymm2[6],ymm1[7],ymm2[7],ymm1[16],ymm2[16],ymm1[17],ymm2[17],ymm1[18],ymm2[18],ymm1[19],ymm2[19],ymm1[20],ymm2[20],ymm1[21],ymm2[21],ymm1[22],ymm2[22],ymm1[23],ymm2[23]
567 ; GFNIAVX512BW-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]
568 ; GFNIAVX512BW-NEXT:    vpsllvw %ymm1, %ymm0, %ymm0
569 ; GFNIAVX512BW-NEXT:    vpsrlw $8, %ymm0, %ymm0
570 ; GFNIAVX512BW-NEXT:    vpackuswb %ymm3, %ymm0, %ymm0
571 ; GFNIAVX512BW-NEXT:    retq
572   %res = call <32 x i8> @llvm.fshl.v32i8(<32 x i8> %a, <32 x i8> %a, <32 x i8> %amt)
573   ret <32 x i8> %res
575 define <32 x i8> @var_rotr_v32i8(<32 x i8> %a, <32 x i8> %amt) nounwind {
576 ; GFNISSE-LABEL: var_rotr_v32i8:
577 ; GFNISSE:       # %bb.0:
578 ; GFNISSE-NEXT:    movdqa %xmm0, %xmm5
579 ; GFNISSE-NEXT:    movdqa {{.*#+}} xmm6 = [0,0,0,0,128,64,32,16,0,0,0,0,128,64,32,16]
580 ; GFNISSE-NEXT:    gf2p8affineqb $0, %xmm6, %xmm0
581 ; GFNISSE-NEXT:    pmovsxdq {{.*#+}} xmm7 = [16909320,16909320]
582 ; GFNISSE-NEXT:    movdqa %xmm5, %xmm8
583 ; GFNISSE-NEXT:    gf2p8affineqb $0, %xmm7, %xmm8
584 ; GFNISSE-NEXT:    por %xmm0, %xmm8
585 ; GFNISSE-NEXT:    pxor %xmm4, %xmm4
586 ; GFNISSE-NEXT:    pxor %xmm0, %xmm0
587 ; GFNISSE-NEXT:    psubb %xmm2, %xmm0
588 ; GFNISSE-NEXT:    psllw $5, %xmm0
589 ; GFNISSE-NEXT:    pblendvb %xmm0, %xmm8, %xmm5
590 ; GFNISSE-NEXT:    movdqa {{.*#+}} xmm2 = [0,0,0,0,0,0,128,64,0,0,0,0,0,0,128,64]
591 ; GFNISSE-NEXT:    movdqa %xmm5, %xmm9
592 ; GFNISSE-NEXT:    gf2p8affineqb $0, %xmm2, %xmm9
593 ; GFNISSE-NEXT:    movdqa {{.*#+}} xmm8 = [32,16,8,4,2,1,0,0,32,16,8,4,2,1,0,0]
594 ; GFNISSE-NEXT:    movdqa %xmm5, %xmm10
595 ; GFNISSE-NEXT:    gf2p8affineqb $0, %xmm8, %xmm10
596 ; GFNISSE-NEXT:    por %xmm9, %xmm10
597 ; GFNISSE-NEXT:    paddb %xmm0, %xmm0
598 ; GFNISSE-NEXT:    pblendvb %xmm0, %xmm10, %xmm5
599 ; GFNISSE-NEXT:    movdqa {{.*#+}} xmm9 = [0,0,0,0,0,0,0,128,0,0,0,0,0,0,0,128]
600 ; GFNISSE-NEXT:    movdqa %xmm5, %xmm10
601 ; GFNISSE-NEXT:    gf2p8affineqb $0, %xmm9, %xmm10
602 ; GFNISSE-NEXT:    movdqa %xmm5, %xmm11
603 ; GFNISSE-NEXT:    paddb %xmm5, %xmm11
604 ; GFNISSE-NEXT:    por %xmm10, %xmm11
605 ; GFNISSE-NEXT:    paddb %xmm0, %xmm0
606 ; GFNISSE-NEXT:    pblendvb %xmm0, %xmm11, %xmm5
607 ; GFNISSE-NEXT:    movdqa %xmm1, %xmm0
608 ; GFNISSE-NEXT:    gf2p8affineqb $0, %xmm6, %xmm0
609 ; GFNISSE-NEXT:    movdqa %xmm1, %xmm6
610 ; GFNISSE-NEXT:    gf2p8affineqb $0, %xmm7, %xmm6
611 ; GFNISSE-NEXT:    por %xmm0, %xmm6
612 ; GFNISSE-NEXT:    psubb %xmm3, %xmm4
613 ; GFNISSE-NEXT:    psllw $5, %xmm4
614 ; GFNISSE-NEXT:    movdqa %xmm4, %xmm0
615 ; GFNISSE-NEXT:    pblendvb %xmm0, %xmm6, %xmm1
616 ; GFNISSE-NEXT:    movdqa %xmm1, %xmm0
617 ; GFNISSE-NEXT:    gf2p8affineqb $0, %xmm2, %xmm0
618 ; GFNISSE-NEXT:    movdqa %xmm1, %xmm2
619 ; GFNISSE-NEXT:    gf2p8affineqb $0, %xmm8, %xmm2
620 ; GFNISSE-NEXT:    por %xmm0, %xmm2
621 ; GFNISSE-NEXT:    paddb %xmm4, %xmm4
622 ; GFNISSE-NEXT:    movdqa %xmm4, %xmm0
623 ; GFNISSE-NEXT:    pblendvb %xmm0, %xmm2, %xmm1
624 ; GFNISSE-NEXT:    movdqa %xmm1, %xmm0
625 ; GFNISSE-NEXT:    gf2p8affineqb $0, %xmm9, %xmm0
626 ; GFNISSE-NEXT:    movdqa %xmm1, %xmm2
627 ; GFNISSE-NEXT:    paddb %xmm1, %xmm2
628 ; GFNISSE-NEXT:    por %xmm0, %xmm2
629 ; GFNISSE-NEXT:    paddb %xmm4, %xmm4
630 ; GFNISSE-NEXT:    movdqa %xmm4, %xmm0
631 ; GFNISSE-NEXT:    pblendvb %xmm0, %xmm2, %xmm1
632 ; GFNISSE-NEXT:    movdqa %xmm5, %xmm0
633 ; GFNISSE-NEXT:    retq
635 ; GFNIAVX1-LABEL: var_rotr_v32i8:
636 ; GFNIAVX1:       # %bb.0:
637 ; GFNIAVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2
638 ; GFNIAVX1-NEXT:    vmovddup {{.*#+}} xmm3 = [0,0,0,0,128,64,32,16,0,0,0,0,128,64,32,16]
639 ; GFNIAVX1-NEXT:    # xmm3 = mem[0,0]
640 ; GFNIAVX1-NEXT:    vgf2p8affineqb $0, %xmm3, %xmm2, %xmm4
641 ; GFNIAVX1-NEXT:    vmovddup {{.*#+}} xmm5 = [8,4,2,1,0,0,0,0,8,4,2,1,0,0,0,0]
642 ; GFNIAVX1-NEXT:    # xmm5 = mem[0,0]
643 ; GFNIAVX1-NEXT:    vgf2p8affineqb $0, %xmm5, %xmm2, %xmm6
644 ; GFNIAVX1-NEXT:    vpor %xmm4, %xmm6, %xmm4
645 ; GFNIAVX1-NEXT:    vextractf128 $1, %ymm1, %xmm6
646 ; GFNIAVX1-NEXT:    vpxor %xmm7, %xmm7, %xmm7
647 ; GFNIAVX1-NEXT:    vpsubb %xmm6, %xmm7, %xmm6
648 ; GFNIAVX1-NEXT:    vpsllw $5, %xmm6, %xmm6
649 ; GFNIAVX1-NEXT:    vpblendvb %xmm6, %xmm4, %xmm2, %xmm2
650 ; GFNIAVX1-NEXT:    vmovddup {{.*#+}} xmm4 = [0,0,0,0,0,0,128,64,0,0,0,0,0,0,128,64]
651 ; GFNIAVX1-NEXT:    # xmm4 = mem[0,0]
652 ; GFNIAVX1-NEXT:    vgf2p8affineqb $0, %xmm4, %xmm2, %xmm8
653 ; GFNIAVX1-NEXT:    vmovddup {{.*#+}} xmm9 = [32,16,8,4,2,1,0,0,32,16,8,4,2,1,0,0]
654 ; GFNIAVX1-NEXT:    # xmm9 = mem[0,0]
655 ; GFNIAVX1-NEXT:    vgf2p8affineqb $0, %xmm9, %xmm2, %xmm10
656 ; GFNIAVX1-NEXT:    vpor %xmm8, %xmm10, %xmm8
657 ; GFNIAVX1-NEXT:    vpaddb %xmm6, %xmm6, %xmm6
658 ; GFNIAVX1-NEXT:    vpblendvb %xmm6, %xmm8, %xmm2, %xmm2
659 ; GFNIAVX1-NEXT:    vmovddup {{.*#+}} xmm8 = [0,0,0,0,0,0,0,128,0,0,0,0,0,0,0,128]
660 ; GFNIAVX1-NEXT:    # xmm8 = mem[0,0]
661 ; GFNIAVX1-NEXT:    vgf2p8affineqb $0, %xmm8, %xmm2, %xmm10
662 ; GFNIAVX1-NEXT:    vpaddb %xmm2, %xmm2, %xmm11
663 ; GFNIAVX1-NEXT:    vpor %xmm10, %xmm11, %xmm10
664 ; GFNIAVX1-NEXT:    vpaddb %xmm6, %xmm6, %xmm6
665 ; GFNIAVX1-NEXT:    vpblendvb %xmm6, %xmm10, %xmm2, %xmm2
666 ; GFNIAVX1-NEXT:    vgf2p8affineqb $0, %xmm3, %xmm0, %xmm3
667 ; GFNIAVX1-NEXT:    vgf2p8affineqb $0, %xmm5, %xmm0, %xmm5
668 ; GFNIAVX1-NEXT:    vpor %xmm3, %xmm5, %xmm3
669 ; GFNIAVX1-NEXT:    vpsubb %xmm1, %xmm7, %xmm1
670 ; GFNIAVX1-NEXT:    vpsllw $5, %xmm1, %xmm1
671 ; GFNIAVX1-NEXT:    vpblendvb %xmm1, %xmm3, %xmm0, %xmm0
672 ; GFNIAVX1-NEXT:    vgf2p8affineqb $0, %xmm4, %xmm0, %xmm3
673 ; GFNIAVX1-NEXT:    vgf2p8affineqb $0, %xmm9, %xmm0, %xmm4
674 ; GFNIAVX1-NEXT:    vpor %xmm3, %xmm4, %xmm3
675 ; GFNIAVX1-NEXT:    vpaddb %xmm1, %xmm1, %xmm1
676 ; GFNIAVX1-NEXT:    vpblendvb %xmm1, %xmm3, %xmm0, %xmm0
677 ; GFNIAVX1-NEXT:    vgf2p8affineqb $0, %xmm8, %xmm0, %xmm3
678 ; GFNIAVX1-NEXT:    vpaddb %xmm0, %xmm0, %xmm4
679 ; GFNIAVX1-NEXT:    vpor %xmm3, %xmm4, %xmm3
680 ; GFNIAVX1-NEXT:    vpaddb %xmm1, %xmm1, %xmm1
681 ; GFNIAVX1-NEXT:    vpblendvb %xmm1, %xmm3, %xmm0, %xmm0
682 ; GFNIAVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
683 ; GFNIAVX1-NEXT:    retq
685 ; GFNIAVX2-LABEL: var_rotr_v32i8:
686 ; GFNIAVX2:       # %bb.0:
687 ; GFNIAVX2-NEXT:    vgf2p8affineqb $0, {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm2
688 ; GFNIAVX2-NEXT:    vgf2p8affineqb $0, {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm3
689 ; GFNIAVX2-NEXT:    vpor %ymm2, %ymm3, %ymm2
690 ; GFNIAVX2-NEXT:    vpxor %xmm3, %xmm3, %xmm3
691 ; GFNIAVX2-NEXT:    vpsubb %ymm1, %ymm3, %ymm1
692 ; GFNIAVX2-NEXT:    vpsllw $5, %ymm1, %ymm1
693 ; GFNIAVX2-NEXT:    vpblendvb %ymm1, %ymm2, %ymm0, %ymm0
694 ; GFNIAVX2-NEXT:    vgf2p8affineqb $0, {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm2
695 ; GFNIAVX2-NEXT:    vgf2p8affineqb $0, {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm3
696 ; GFNIAVX2-NEXT:    vpor %ymm2, %ymm3, %ymm2
697 ; GFNIAVX2-NEXT:    vpaddb %ymm1, %ymm1, %ymm1
698 ; GFNIAVX2-NEXT:    vpblendvb %ymm1, %ymm2, %ymm0, %ymm0
699 ; GFNIAVX2-NEXT:    vgf2p8affineqb $0, {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm2
700 ; GFNIAVX2-NEXT:    vpaddb %ymm0, %ymm0, %ymm3
701 ; GFNIAVX2-NEXT:    vpor %ymm2, %ymm3, %ymm2
702 ; GFNIAVX2-NEXT:    vpaddb %ymm1, %ymm1, %ymm1
703 ; GFNIAVX2-NEXT:    vpblendvb %ymm1, %ymm2, %ymm0, %ymm0
704 ; GFNIAVX2-NEXT:    retq
706 ; GFNIAVX512VL-LABEL: var_rotr_v32i8:
707 ; GFNIAVX512VL:       # %bb.0:
708 ; GFNIAVX512VL-NEXT:    vgf2p8affineqb $0, {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to4}, %ymm0, %ymm2
709 ; GFNIAVX512VL-NEXT:    vgf2p8affineqb $0, {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to4}, %ymm0, %ymm3
710 ; GFNIAVX512VL-NEXT:    vpor %ymm2, %ymm3, %ymm2
711 ; GFNIAVX512VL-NEXT:    vpsllw $5, %ymm1, %ymm1
712 ; GFNIAVX512VL-NEXT:    vpblendvb %ymm1, %ymm2, %ymm0, %ymm0
713 ; GFNIAVX512VL-NEXT:    vgf2p8affineqb $0, {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to4}, %ymm0, %ymm2
714 ; GFNIAVX512VL-NEXT:    vgf2p8affineqb $0, {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to4}, %ymm0, %ymm3
715 ; GFNIAVX512VL-NEXT:    vpor %ymm2, %ymm3, %ymm2
716 ; GFNIAVX512VL-NEXT:    vpaddb %ymm1, %ymm1, %ymm1
717 ; GFNIAVX512VL-NEXT:    vpblendvb %ymm1, %ymm2, %ymm0, %ymm0
718 ; GFNIAVX512VL-NEXT:    vgf2p8affineqb $0, {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to4}, %ymm0, %ymm2
719 ; GFNIAVX512VL-NEXT:    vgf2p8affineqb $0, {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to4}, %ymm0, %ymm3
720 ; GFNIAVX512VL-NEXT:    vpor %ymm2, %ymm3, %ymm2
721 ; GFNIAVX512VL-NEXT:    vpaddb %ymm1, %ymm1, %ymm1
722 ; GFNIAVX512VL-NEXT:    vpblendvb %ymm1, %ymm2, %ymm0, %ymm0
723 ; GFNIAVX512VL-NEXT:    retq
725 ; GFNIAVX512BW-LABEL: var_rotr_v32i8:
726 ; GFNIAVX512BW:       # %bb.0:
727 ; GFNIAVX512BW-NEXT:    vpandd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to8}, %ymm1, %ymm1
728 ; GFNIAVX512BW-NEXT:    vpxor %xmm2, %xmm2, %xmm2
729 ; GFNIAVX512BW-NEXT:    vpunpckhbw {{.*#+}} ymm3 = ymm1[8],ymm2[8],ymm1[9],ymm2[9],ymm1[10],ymm2[10],ymm1[11],ymm2[11],ymm1[12],ymm2[12],ymm1[13],ymm2[13],ymm1[14],ymm2[14],ymm1[15],ymm2[15],ymm1[24],ymm2[24],ymm1[25],ymm2[25],ymm1[26],ymm2[26],ymm1[27],ymm2[27],ymm1[28],ymm2[28],ymm1[29],ymm2[29],ymm1[30],ymm2[30],ymm1[31],ymm2[31]
730 ; GFNIAVX512BW-NEXT:    vpunpckhbw {{.*#+}} ymm4 = 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]
731 ; GFNIAVX512BW-NEXT:    vpsrlvw %ymm3, %ymm4, %ymm3
732 ; GFNIAVX512BW-NEXT:    vpbroadcastw {{.*#+}} ymm4 = [255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255]
733 ; GFNIAVX512BW-NEXT:    vpand %ymm4, %ymm3, %ymm3
734 ; GFNIAVX512BW-NEXT:    vpunpcklbw {{.*#+}} ymm1 = ymm1[0],ymm2[0],ymm1[1],ymm2[1],ymm1[2],ymm2[2],ymm1[3],ymm2[3],ymm1[4],ymm2[4],ymm1[5],ymm2[5],ymm1[6],ymm2[6],ymm1[7],ymm2[7],ymm1[16],ymm2[16],ymm1[17],ymm2[17],ymm1[18],ymm2[18],ymm1[19],ymm2[19],ymm1[20],ymm2[20],ymm1[21],ymm2[21],ymm1[22],ymm2[22],ymm1[23],ymm2[23]
735 ; GFNIAVX512BW-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]
736 ; GFNIAVX512BW-NEXT:    vpsrlvw %ymm1, %ymm0, %ymm0
737 ; GFNIAVX512BW-NEXT:    vpand %ymm4, %ymm0, %ymm0
738 ; GFNIAVX512BW-NEXT:    vpackuswb %ymm3, %ymm0, %ymm0
739 ; GFNIAVX512BW-NEXT:    retq
740   %res = call <32 x i8> @llvm.fshr.v32i8(<32 x i8> %a, <32 x i8> %a, <32 x i8> %amt)
741   ret <32 x i8> %res
744 define <32 x i8> @splatvar_rotl_v32i8(<32 x i8> %a, <32 x i8> %amt) nounwind {
745 ; GFNISSE-LABEL: splatvar_rotl_v32i8:
746 ; GFNISSE:       # %bb.0:
747 ; GFNISSE-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2
748 ; GFNISSE-NEXT:    movdqa %xmm0, %xmm3
749 ; GFNISSE-NEXT:    punpckhbw {{.*#+}} xmm3 = xmm3[8],xmm0[8],xmm3[9],xmm0[9],xmm3[10],xmm0[10],xmm3[11],xmm0[11],xmm3[12],xmm0[12],xmm3[13],xmm0[13],xmm3[14],xmm0[14],xmm3[15],xmm0[15]
750 ; GFNISSE-NEXT:    psllw %xmm2, %xmm3
751 ; GFNISSE-NEXT:    psrlw $8, %xmm3
752 ; GFNISSE-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
753 ; GFNISSE-NEXT:    psllw %xmm2, %xmm0
754 ; GFNISSE-NEXT:    psrlw $8, %xmm0
755 ; GFNISSE-NEXT:    packuswb %xmm3, %xmm0
756 ; GFNISSE-NEXT:    movdqa %xmm1, %xmm3
757 ; GFNISSE-NEXT:    punpckhbw {{.*#+}} xmm3 = xmm3[8],xmm1[8],xmm3[9],xmm1[9],xmm3[10],xmm1[10],xmm3[11],xmm1[11],xmm3[12],xmm1[12],xmm3[13],xmm1[13],xmm3[14],xmm1[14],xmm3[15],xmm1[15]
758 ; GFNISSE-NEXT:    psllw %xmm2, %xmm3
759 ; GFNISSE-NEXT:    psrlw $8, %xmm3
760 ; GFNISSE-NEXT:    punpcklbw {{.*#+}} xmm1 = xmm1[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
761 ; GFNISSE-NEXT:    psllw %xmm2, %xmm1
762 ; GFNISSE-NEXT:    psrlw $8, %xmm1
763 ; GFNISSE-NEXT:    packuswb %xmm3, %xmm1
764 ; GFNISSE-NEXT:    retq
766 ; GFNIAVX1-LABEL: splatvar_rotl_v32i8:
767 ; GFNIAVX1:       # %bb.0:
768 ; GFNIAVX1-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1
769 ; GFNIAVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2
770 ; GFNIAVX1-NEXT:    vpunpckhbw {{.*#+}} xmm3 = xmm2[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]
771 ; GFNIAVX1-NEXT:    vpsllw %xmm1, %xmm3, %xmm3
772 ; GFNIAVX1-NEXT:    vpsrlw $8, %xmm3, %xmm3
773 ; GFNIAVX1-NEXT:    vpunpcklbw {{.*#+}} xmm2 = xmm2[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
774 ; GFNIAVX1-NEXT:    vpsllw %xmm1, %xmm2, %xmm2
775 ; GFNIAVX1-NEXT:    vpsrlw $8, %xmm2, %xmm2
776 ; GFNIAVX1-NEXT:    vpackuswb %xmm3, %xmm2, %xmm2
777 ; GFNIAVX1-NEXT:    vpunpckhbw {{.*#+}} xmm3 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]
778 ; GFNIAVX1-NEXT:    vpsllw %xmm1, %xmm3, %xmm3
779 ; GFNIAVX1-NEXT:    vpsrlw $8, %xmm3, %xmm3
780 ; GFNIAVX1-NEXT:    vpunpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
781 ; GFNIAVX1-NEXT:    vpsllw %xmm1, %xmm0, %xmm0
782 ; GFNIAVX1-NEXT:    vpsrlw $8, %xmm0, %xmm0
783 ; GFNIAVX1-NEXT:    vpackuswb %xmm3, %xmm0, %xmm0
784 ; GFNIAVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
785 ; GFNIAVX1-NEXT:    retq
787 ; GFNIAVX2-LABEL: splatvar_rotl_v32i8:
788 ; GFNIAVX2:       # %bb.0:
789 ; GFNIAVX2-NEXT:    vpunpckhbw {{.*#+}} ymm2 = 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]
790 ; GFNIAVX2-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1
791 ; GFNIAVX2-NEXT:    vpsllw %xmm1, %ymm2, %ymm2
792 ; GFNIAVX2-NEXT:    vpsrlw $8, %ymm2, %ymm2
793 ; GFNIAVX2-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]
794 ; GFNIAVX2-NEXT:    vpsllw %xmm1, %ymm0, %ymm0
795 ; GFNIAVX2-NEXT:    vpsrlw $8, %ymm0, %ymm0
796 ; GFNIAVX2-NEXT:    vpackuswb %ymm2, %ymm0, %ymm0
797 ; GFNIAVX2-NEXT:    retq
799 ; GFNIAVX512-LABEL: splatvar_rotl_v32i8:
800 ; GFNIAVX512:       # %bb.0:
801 ; GFNIAVX512-NEXT:    vpunpckhbw {{.*#+}} ymm2 = 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]
802 ; GFNIAVX512-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1
803 ; GFNIAVX512-NEXT:    vpsllw %xmm1, %ymm2, %ymm2
804 ; GFNIAVX512-NEXT:    vpsrlw $8, %ymm2, %ymm2
805 ; GFNIAVX512-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]
806 ; GFNIAVX512-NEXT:    vpsllw %xmm1, %ymm0, %ymm0
807 ; GFNIAVX512-NEXT:    vpsrlw $8, %ymm0, %ymm0
808 ; GFNIAVX512-NEXT:    vpackuswb %ymm2, %ymm0, %ymm0
809 ; GFNIAVX512-NEXT:    retq
810   %splat = shufflevector <32 x i8> %amt, <32 x i8> undef, <32 x i32> zeroinitializer
811   %res = call <32 x i8> @llvm.fshl.v32i8(<32 x i8> %a, <32 x i8> %a, <32 x i8> %splat)
812   ret <32 x i8> %res
815 define <32 x i8> @splatvar_rotr_v32i8(<32 x i8> %a, <32 x i8> %amt) nounwind {
816 ; GFNISSE-LABEL: splatvar_rotr_v32i8:
817 ; GFNISSE:       # %bb.0:
818 ; GFNISSE-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2
819 ; GFNISSE-NEXT:    movdqa %xmm0, %xmm3
820 ; GFNISSE-NEXT:    punpckhbw {{.*#+}} xmm3 = xmm3[8],xmm0[8],xmm3[9],xmm0[9],xmm3[10],xmm0[10],xmm3[11],xmm0[11],xmm3[12],xmm0[12],xmm3[13],xmm0[13],xmm3[14],xmm0[14],xmm3[15],xmm0[15]
821 ; GFNISSE-NEXT:    psrlw %xmm2, %xmm3
822 ; GFNISSE-NEXT:    pmovzxbw {{.*#+}} xmm4 = [255,255,255,255,255,255,255,255]
823 ; GFNISSE-NEXT:    pand %xmm4, %xmm3
824 ; GFNISSE-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
825 ; GFNISSE-NEXT:    psrlw %xmm2, %xmm0
826 ; GFNISSE-NEXT:    pand %xmm4, %xmm0
827 ; GFNISSE-NEXT:    packuswb %xmm3, %xmm0
828 ; GFNISSE-NEXT:    movdqa %xmm1, %xmm3
829 ; GFNISSE-NEXT:    punpckhbw {{.*#+}} xmm3 = xmm3[8],xmm1[8],xmm3[9],xmm1[9],xmm3[10],xmm1[10],xmm3[11],xmm1[11],xmm3[12],xmm1[12],xmm3[13],xmm1[13],xmm3[14],xmm1[14],xmm3[15],xmm1[15]
830 ; GFNISSE-NEXT:    psrlw %xmm2, %xmm3
831 ; GFNISSE-NEXT:    pand %xmm4, %xmm3
832 ; GFNISSE-NEXT:    punpcklbw {{.*#+}} xmm1 = xmm1[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
833 ; GFNISSE-NEXT:    psrlw %xmm2, %xmm1
834 ; GFNISSE-NEXT:    pand %xmm4, %xmm1
835 ; GFNISSE-NEXT:    packuswb %xmm3, %xmm1
836 ; GFNISSE-NEXT:    retq
838 ; GFNIAVX1-LABEL: splatvar_rotr_v32i8:
839 ; GFNIAVX1:       # %bb.0:
840 ; GFNIAVX1-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1
841 ; GFNIAVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2
842 ; GFNIAVX1-NEXT:    vpunpckhbw {{.*#+}} xmm3 = xmm2[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]
843 ; GFNIAVX1-NEXT:    vpsrlw %xmm1, %xmm3, %xmm3
844 ; GFNIAVX1-NEXT:    vbroadcastss {{.*#+}} xmm4 = [255,255,255,255,255,255,255,255]
845 ; GFNIAVX1-NEXT:    vpand %xmm4, %xmm3, %xmm3
846 ; GFNIAVX1-NEXT:    vpunpcklbw {{.*#+}} xmm2 = xmm2[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
847 ; GFNIAVX1-NEXT:    vpsrlw %xmm1, %xmm2, %xmm2
848 ; GFNIAVX1-NEXT:    vpand %xmm4, %xmm2, %xmm2
849 ; GFNIAVX1-NEXT:    vpackuswb %xmm3, %xmm2, %xmm2
850 ; GFNIAVX1-NEXT:    vpunpckhbw {{.*#+}} xmm3 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]
851 ; GFNIAVX1-NEXT:    vpsrlw %xmm1, %xmm3, %xmm3
852 ; GFNIAVX1-NEXT:    vpand %xmm4, %xmm3, %xmm3
853 ; GFNIAVX1-NEXT:    vpunpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
854 ; GFNIAVX1-NEXT:    vpsrlw %xmm1, %xmm0, %xmm0
855 ; GFNIAVX1-NEXT:    vpand %xmm4, %xmm0, %xmm0
856 ; GFNIAVX1-NEXT:    vpackuswb %xmm3, %xmm0, %xmm0
857 ; GFNIAVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
858 ; GFNIAVX1-NEXT:    retq
860 ; GFNIAVX2-LABEL: splatvar_rotr_v32i8:
861 ; GFNIAVX2:       # %bb.0:
862 ; GFNIAVX2-NEXT:    vpunpckhbw {{.*#+}} ymm2 = 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]
863 ; GFNIAVX2-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1
864 ; GFNIAVX2-NEXT:    vpsrlw %xmm1, %ymm2, %ymm2
865 ; GFNIAVX2-NEXT:    vpbroadcastw {{.*#+}} ymm3 = [255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255]
866 ; GFNIAVX2-NEXT:    vpand %ymm3, %ymm2, %ymm2
867 ; GFNIAVX2-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]
868 ; GFNIAVX2-NEXT:    vpsrlw %xmm1, %ymm0, %ymm0
869 ; GFNIAVX2-NEXT:    vpand %ymm3, %ymm0, %ymm0
870 ; GFNIAVX2-NEXT:    vpackuswb %ymm2, %ymm0, %ymm0
871 ; GFNIAVX2-NEXT:    retq
873 ; GFNIAVX512VL-LABEL: splatvar_rotr_v32i8:
874 ; GFNIAVX512VL:       # %bb.0:
875 ; GFNIAVX512VL-NEXT:    vpunpckhbw {{.*#+}} ymm2 = 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]
876 ; GFNIAVX512VL-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1
877 ; GFNIAVX512VL-NEXT:    vpsrlw %xmm1, %ymm2, %ymm2
878 ; GFNIAVX512VL-NEXT:    vpbroadcastd {{.*#+}} ymm3 = [255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255]
879 ; GFNIAVX512VL-NEXT:    vpand %ymm3, %ymm2, %ymm2
880 ; GFNIAVX512VL-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]
881 ; GFNIAVX512VL-NEXT:    vpsrlw %xmm1, %ymm0, %ymm0
882 ; GFNIAVX512VL-NEXT:    vpand %ymm3, %ymm0, %ymm0
883 ; GFNIAVX512VL-NEXT:    vpackuswb %ymm2, %ymm0, %ymm0
884 ; GFNIAVX512VL-NEXT:    retq
886 ; GFNIAVX512BW-LABEL: splatvar_rotr_v32i8:
887 ; GFNIAVX512BW:       # %bb.0:
888 ; GFNIAVX512BW-NEXT:    vpunpckhbw {{.*#+}} ymm2 = 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]
889 ; GFNIAVX512BW-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1
890 ; GFNIAVX512BW-NEXT:    vpsrlw %xmm1, %ymm2, %ymm2
891 ; GFNIAVX512BW-NEXT:    vpbroadcastw {{.*#+}} ymm3 = [255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255]
892 ; GFNIAVX512BW-NEXT:    vpand %ymm3, %ymm2, %ymm2
893 ; GFNIAVX512BW-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]
894 ; GFNIAVX512BW-NEXT:    vpsrlw %xmm1, %ymm0, %ymm0
895 ; GFNIAVX512BW-NEXT:    vpand %ymm3, %ymm0, %ymm0
896 ; GFNIAVX512BW-NEXT:    vpackuswb %ymm2, %ymm0, %ymm0
897 ; GFNIAVX512BW-NEXT:    retq
898   %splat = shufflevector <32 x i8> %amt, <32 x i8> undef, <32 x i32> zeroinitializer
899   %res = call <32 x i8> @llvm.fshr.v32i8(<32 x i8> %a, <32 x i8> %a, <32 x i8> %splat)
900   ret <32 x i8> %res
903 define <32 x i8> @constant_rotl_v32i8(<32 x i8> %a) nounwind {
904 ; GFNISSE-LABEL: constant_rotl_v32i8:
905 ; GFNISSE:       # %bb.0:
906 ; GFNISSE-NEXT:    movdqa %xmm0, %xmm2
907 ; GFNISSE-NEXT:    punpckhbw {{.*#+}} xmm2 = xmm2[8],xmm0[8],xmm2[9],xmm0[9],xmm2[10],xmm0[10],xmm2[11],xmm0[11],xmm2[12],xmm0[12],xmm2[13],xmm0[13],xmm2[14],xmm0[14],xmm2[15],xmm0[15]
908 ; GFNISSE-NEXT:    pmovzxbw {{.*#+}} xmm3 = [1,128,64,32,16,8,4,2]
909 ; GFNISSE-NEXT:    pmullw %xmm3, %xmm2
910 ; GFNISSE-NEXT:    psrlw $8, %xmm2
911 ; GFNISSE-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
912 ; GFNISSE-NEXT:    pmovzxbw {{.*#+}} xmm4 = [1,2,4,8,16,32,64,128]
913 ; GFNISSE-NEXT:    pmullw %xmm4, %xmm0
914 ; GFNISSE-NEXT:    psrlw $8, %xmm0
915 ; GFNISSE-NEXT:    packuswb %xmm2, %xmm0
916 ; GFNISSE-NEXT:    movdqa %xmm1, %xmm2
917 ; GFNISSE-NEXT:    punpckhbw {{.*#+}} xmm2 = xmm2[8],xmm1[8],xmm2[9],xmm1[9],xmm2[10],xmm1[10],xmm2[11],xmm1[11],xmm2[12],xmm1[12],xmm2[13],xmm1[13],xmm2[14],xmm1[14],xmm2[15],xmm1[15]
918 ; GFNISSE-NEXT:    pmullw %xmm3, %xmm2
919 ; GFNISSE-NEXT:    psrlw $8, %xmm2
920 ; GFNISSE-NEXT:    punpcklbw {{.*#+}} xmm1 = xmm1[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
921 ; GFNISSE-NEXT:    pmullw %xmm4, %xmm1
922 ; GFNISSE-NEXT:    psrlw $8, %xmm1
923 ; GFNISSE-NEXT:    packuswb %xmm2, %xmm1
924 ; GFNISSE-NEXT:    retq
926 ; GFNIAVX1-LABEL: constant_rotl_v32i8:
927 ; GFNIAVX1:       # %bb.0:
928 ; GFNIAVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
929 ; GFNIAVX1-NEXT:    vpunpckhbw {{.*#+}} xmm2 = xmm1[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]
930 ; GFNIAVX1-NEXT:    vpmovzxbw {{.*#+}} xmm3 = [1,128,64,32,16,8,4,2]
931 ; GFNIAVX1-NEXT:    vpmullw %xmm3, %xmm2, %xmm2
932 ; GFNIAVX1-NEXT:    vpsrlw $8, %xmm2, %xmm2
933 ; GFNIAVX1-NEXT:    vpunpcklbw {{.*#+}} xmm1 = xmm1[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
934 ; GFNIAVX1-NEXT:    vpmovzxbw {{.*#+}} xmm4 = [1,2,4,8,16,32,64,128]
935 ; GFNIAVX1-NEXT:    vpmullw %xmm4, %xmm1, %xmm1
936 ; GFNIAVX1-NEXT:    vpsrlw $8, %xmm1, %xmm1
937 ; GFNIAVX1-NEXT:    vpackuswb %xmm2, %xmm1, %xmm1
938 ; GFNIAVX1-NEXT:    vpunpckhbw {{.*#+}} xmm2 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]
939 ; GFNIAVX1-NEXT:    vpmullw %xmm3, %xmm2, %xmm2
940 ; GFNIAVX1-NEXT:    vpsrlw $8, %xmm2, %xmm2
941 ; GFNIAVX1-NEXT:    vpunpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
942 ; GFNIAVX1-NEXT:    vpmullw %xmm4, %xmm0, %xmm0
943 ; GFNIAVX1-NEXT:    vpsrlw $8, %xmm0, %xmm0
944 ; GFNIAVX1-NEXT:    vpackuswb %xmm2, %xmm0, %xmm0
945 ; GFNIAVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
946 ; GFNIAVX1-NEXT:    retq
948 ; GFNIAVX2-LABEL: constant_rotl_v32i8:
949 ; GFNIAVX2:       # %bb.0:
950 ; GFNIAVX2-NEXT:    vpunpckhbw {{.*#+}} ymm1 = 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]
951 ; GFNIAVX2-NEXT:    vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm1 # [1,128,64,32,16,8,4,2,1,128,64,32,16,8,4,2]
952 ; GFNIAVX2-NEXT:    vpsrlw $8, %ymm1, %ymm1
953 ; GFNIAVX2-NEXT:    vpunpcklbw {{.*#+}} ymm0 = ymm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,16,16,17,17,18,18,19,19,20,20,21,21,22,22,23,23]
954 ; GFNIAVX2-NEXT:    vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0 # [1,2,4,8,16,32,64,128,1,2,4,8,16,32,64,128]
955 ; GFNIAVX2-NEXT:    vpsrlw $8, %ymm0, %ymm0
956 ; GFNIAVX2-NEXT:    vpackuswb %ymm1, %ymm0, %ymm0
957 ; GFNIAVX2-NEXT:    retq
959 ; GFNIAVX512VL-LABEL: constant_rotl_v32i8:
960 ; GFNIAVX512VL:       # %bb.0:
961 ; GFNIAVX512VL-NEXT:    vpunpckhbw {{.*#+}} ymm1 = 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]
962 ; GFNIAVX512VL-NEXT:    vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm1 # [1,128,64,32,16,8,4,2,1,128,64,32,16,8,4,2]
963 ; GFNIAVX512VL-NEXT:    vpsrlw $8, %ymm1, %ymm1
964 ; GFNIAVX512VL-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]
965 ; GFNIAVX512VL-NEXT:    vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0 # [1,2,4,8,16,32,64,128,1,2,4,8,16,32,64,128]
966 ; GFNIAVX512VL-NEXT:    vpsrlw $8, %ymm0, %ymm0
967 ; GFNIAVX512VL-NEXT:    vpackuswb %ymm1, %ymm0, %ymm0
968 ; GFNIAVX512VL-NEXT:    retq
970 ; GFNIAVX512BW-LABEL: constant_rotl_v32i8:
971 ; GFNIAVX512BW:       # %bb.0:
972 ; GFNIAVX512BW-NEXT:    vpunpckhbw {{.*#+}} ymm1 = 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]
973 ; GFNIAVX512BW-NEXT:    vpsllvw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm1
974 ; GFNIAVX512BW-NEXT:    vpsrlw $8, %ymm1, %ymm1
975 ; GFNIAVX512BW-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]
976 ; GFNIAVX512BW-NEXT:    vpsllvw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0
977 ; GFNIAVX512BW-NEXT:    vpsrlw $8, %ymm0, %ymm0
978 ; GFNIAVX512BW-NEXT:    vpackuswb %ymm1, %ymm0, %ymm0
979 ; GFNIAVX512BW-NEXT:    retq
980   %res = call <32 x i8> @llvm.fshl.v32i8(<32 x i8> %a, <32 x i8> %a, <32 x i8> <i8 0, i8 1, i8 2, i8 3, i8 4, i8 5, i8 6, i8 7, i8 8, i8 7, i8 6, i8 5, i8 4, i8 3, i8 2, i8 1, i8 0, i8 1, i8 2, i8 3, i8 4, i8 5, i8 6, i8 7, i8 8, i8 7, i8 6, i8 5, i8 4, i8 3, i8 2, i8 1>)
981   ret <32 x i8> %res
984 define <32 x i8> @constant_rotr_v32i8(<32 x i8> %a) nounwind {
985 ; GFNISSE-LABEL: constant_rotr_v32i8:
986 ; GFNISSE:       # %bb.0:
987 ; GFNISSE-NEXT:    movdqa %xmm0, %xmm2
988 ; GFNISSE-NEXT:    punpckhbw {{.*#+}} xmm2 = xmm2[8],xmm0[8],xmm2[9],xmm0[9],xmm2[10],xmm0[10],xmm2[11],xmm0[11],xmm2[12],xmm0[12],xmm2[13],xmm0[13],xmm2[14],xmm0[14],xmm2[15],xmm0[15]
989 ; GFNISSE-NEXT:    pmovzxbw {{.*#+}} xmm3 = [1,128,64,32,16,8,4,2]
990 ; GFNISSE-NEXT:    pmullw %xmm3, %xmm2
991 ; GFNISSE-NEXT:    psrlw $8, %xmm2
992 ; GFNISSE-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
993 ; GFNISSE-NEXT:    pmovzxbw {{.*#+}} xmm4 = [1,2,4,8,16,32,64,128]
994 ; GFNISSE-NEXT:    pmullw %xmm4, %xmm0
995 ; GFNISSE-NEXT:    psrlw $8, %xmm0
996 ; GFNISSE-NEXT:    packuswb %xmm2, %xmm0
997 ; GFNISSE-NEXT:    movdqa %xmm1, %xmm2
998 ; GFNISSE-NEXT:    punpckhbw {{.*#+}} xmm2 = xmm2[8],xmm1[8],xmm2[9],xmm1[9],xmm2[10],xmm1[10],xmm2[11],xmm1[11],xmm2[12],xmm1[12],xmm2[13],xmm1[13],xmm2[14],xmm1[14],xmm2[15],xmm1[15]
999 ; GFNISSE-NEXT:    pmullw %xmm3, %xmm2
1000 ; GFNISSE-NEXT:    psrlw $8, %xmm2
1001 ; GFNISSE-NEXT:    punpcklbw {{.*#+}} xmm1 = xmm1[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
1002 ; GFNISSE-NEXT:    pmullw %xmm4, %xmm1
1003 ; GFNISSE-NEXT:    psrlw $8, %xmm1
1004 ; GFNISSE-NEXT:    packuswb %xmm2, %xmm1
1005 ; GFNISSE-NEXT:    retq
1007 ; GFNIAVX1-LABEL: constant_rotr_v32i8:
1008 ; GFNIAVX1:       # %bb.0:
1009 ; GFNIAVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
1010 ; GFNIAVX1-NEXT:    vpunpckhbw {{.*#+}} xmm2 = xmm1[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]
1011 ; GFNIAVX1-NEXT:    vpmovzxbw {{.*#+}} xmm3 = [1,128,64,32,16,8,4,2]
1012 ; GFNIAVX1-NEXT:    vpmullw %xmm3, %xmm2, %xmm2
1013 ; GFNIAVX1-NEXT:    vpsrlw $8, %xmm2, %xmm2
1014 ; GFNIAVX1-NEXT:    vpunpcklbw {{.*#+}} xmm1 = xmm1[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
1015 ; GFNIAVX1-NEXT:    vpmovzxbw {{.*#+}} xmm4 = [1,2,4,8,16,32,64,128]
1016 ; GFNIAVX1-NEXT:    vpmullw %xmm4, %xmm1, %xmm1
1017 ; GFNIAVX1-NEXT:    vpsrlw $8, %xmm1, %xmm1
1018 ; GFNIAVX1-NEXT:    vpackuswb %xmm2, %xmm1, %xmm1
1019 ; GFNIAVX1-NEXT:    vpunpckhbw {{.*#+}} xmm2 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]
1020 ; GFNIAVX1-NEXT:    vpmullw %xmm3, %xmm2, %xmm2
1021 ; GFNIAVX1-NEXT:    vpsrlw $8, %xmm2, %xmm2
1022 ; GFNIAVX1-NEXT:    vpunpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
1023 ; GFNIAVX1-NEXT:    vpmullw %xmm4, %xmm0, %xmm0
1024 ; GFNIAVX1-NEXT:    vpsrlw $8, %xmm0, %xmm0
1025 ; GFNIAVX1-NEXT:    vpackuswb %xmm2, %xmm0, %xmm0
1026 ; GFNIAVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
1027 ; GFNIAVX1-NEXT:    retq
1029 ; GFNIAVX2-LABEL: constant_rotr_v32i8:
1030 ; GFNIAVX2:       # %bb.0:
1031 ; GFNIAVX2-NEXT:    vpunpckhbw {{.*#+}} ymm1 = 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]
1032 ; GFNIAVX2-NEXT:    vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm1 # [1,128,64,32,16,8,4,2,1,128,64,32,16,8,4,2]
1033 ; GFNIAVX2-NEXT:    vpsrlw $8, %ymm1, %ymm1
1034 ; GFNIAVX2-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]
1035 ; GFNIAVX2-NEXT:    vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0 # [1,2,4,8,16,32,64,128,1,2,4,8,16,32,64,128]
1036 ; GFNIAVX2-NEXT:    vpsrlw $8, %ymm0, %ymm0
1037 ; GFNIAVX2-NEXT:    vpackuswb %ymm1, %ymm0, %ymm0
1038 ; GFNIAVX2-NEXT:    retq
1040 ; GFNIAVX512VL-LABEL: constant_rotr_v32i8:
1041 ; GFNIAVX512VL:       # %bb.0:
1042 ; GFNIAVX512VL-NEXT:    vpunpckhbw {{.*#+}} ymm1 = 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]
1043 ; GFNIAVX512VL-NEXT:    vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm1 # [1,128,64,32,16,8,4,2,1,128,64,32,16,8,4,2]
1044 ; GFNIAVX512VL-NEXT:    vpsrlw $8, %ymm1, %ymm1
1045 ; GFNIAVX512VL-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]
1046 ; GFNIAVX512VL-NEXT:    vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0 # [1,2,4,8,16,32,64,128,1,2,4,8,16,32,64,128]
1047 ; GFNIAVX512VL-NEXT:    vpsrlw $8, %ymm0, %ymm0
1048 ; GFNIAVX512VL-NEXT:    vpackuswb %ymm1, %ymm0, %ymm0
1049 ; GFNIAVX512VL-NEXT:    retq
1051 ; GFNIAVX512BW-LABEL: constant_rotr_v32i8:
1052 ; GFNIAVX512BW:       # %bb.0:
1053 ; GFNIAVX512BW-NEXT:    vpunpckhbw {{.*#+}} ymm1 = 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]
1054 ; GFNIAVX512BW-NEXT:    vpsllvw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm1
1055 ; GFNIAVX512BW-NEXT:    vpsrlw $8, %ymm1, %ymm1
1056 ; GFNIAVX512BW-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]
1057 ; GFNIAVX512BW-NEXT:    vpsllvw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0
1058 ; GFNIAVX512BW-NEXT:    vpsrlw $8, %ymm0, %ymm0
1059 ; GFNIAVX512BW-NEXT:    vpackuswb %ymm1, %ymm0, %ymm0
1060 ; GFNIAVX512BW-NEXT:    retq
1061   %res = call <32 x i8> @llvm.fshl.v32i8(<32 x i8> %a, <32 x i8> %a, <32 x i8> <i8 0, i8 1, i8 2, i8 3, i8 4, i8 5, i8 6, i8 7, i8 8, i8 7, i8 6, i8 5, i8 4, i8 3, i8 2, i8 1, i8 0, i8 1, i8 2, i8 3, i8 4, i8 5, i8 6, i8 7, i8 8, i8 7, i8 6, i8 5, i8 4, i8 3, i8 2, i8 1>)
1062   ret <32 x i8> %res
1065 define <32 x i8> @splatconstant_rotl_v32i8(<32 x i8> %a) nounwind {
1066 ; GFNISSE-LABEL: splatconstant_rotl_v32i8:
1067 ; GFNISSE:       # %bb.0:
1068 ; GFNISSE-NEXT:    movdqa {{.*#+}} xmm2 = [8,4,2,1,128,64,32,16,8,4,2,1,128,64,32,16]
1069 ; GFNISSE-NEXT:    gf2p8affineqb $0, %xmm2, %xmm0
1070 ; GFNISSE-NEXT:    gf2p8affineqb $0, %xmm2, %xmm1
1071 ; GFNISSE-NEXT:    retq
1073 ; GFNIAVX1OR2-LABEL: splatconstant_rotl_v32i8:
1074 ; GFNIAVX1OR2:       # %bb.0:
1075 ; GFNIAVX1OR2-NEXT:    vgf2p8affineqb $0, {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0
1076 ; GFNIAVX1OR2-NEXT:    retq
1078 ; GFNIAVX512-LABEL: splatconstant_rotl_v32i8:
1079 ; GFNIAVX512:       # %bb.0:
1080 ; GFNIAVX512-NEXT:    vgf2p8affineqb $0, {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to4}, %ymm0, %ymm0
1081 ; GFNIAVX512-NEXT:    retq
1082   %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>)
1083   ret <32 x i8> %res
1085 declare <32 x i8> @llvm.fshl.v32i8(<32 x i8>, <32 x i8>, <32 x i8>)
1087 define <32 x i8> @splatconstant_rotr_v32i8(<32 x i8> %a) nounwind {
1088 ; GFNISSE-LABEL: splatconstant_rotr_v32i8:
1089 ; GFNISSE:       # %bb.0:
1090 ; GFNISSE-NEXT:    movdqa {{.*#+}} xmm2 = [32,16,8,4,2,1,128,64,32,16,8,4,2,1,128,64]
1091 ; GFNISSE-NEXT:    gf2p8affineqb $0, %xmm2, %xmm0
1092 ; GFNISSE-NEXT:    gf2p8affineqb $0, %xmm2, %xmm1
1093 ; GFNISSE-NEXT:    retq
1095 ; GFNIAVX1OR2-LABEL: splatconstant_rotr_v32i8:
1096 ; GFNIAVX1OR2:       # %bb.0:
1097 ; GFNIAVX1OR2-NEXT:    vgf2p8affineqb $0, {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0
1098 ; GFNIAVX1OR2-NEXT:    retq
1100 ; GFNIAVX512-LABEL: splatconstant_rotr_v32i8:
1101 ; GFNIAVX512:       # %bb.0:
1102 ; GFNIAVX512-NEXT:    vgf2p8affineqb $0, {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to4}, %ymm0, %ymm0
1103 ; GFNIAVX512-NEXT:    retq
1104   %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>)
1105   ret <32 x i8> %res
1107 declare <32 x i8> @llvm.fshr.v32i8(<32 x i8>, <32 x i8>, <32 x i8>)
1110 ; 512 Bit Vector Rotates
1113 define <64 x i8> @var_rotl_v64i8(<64 x i8> %a, <64 x i8> %amt) nounwind {
1114 ; GFNISSE-LABEL: var_rotl_v64i8:
1115 ; GFNISSE:       # %bb.0:
1116 ; GFNISSE-NEXT:    movdqa %xmm4, %xmm8
1117 ; GFNISSE-NEXT:    movdqa %xmm0, %xmm4
1118 ; GFNISSE-NEXT:    movdqa {{.*#+}} xmm9 = [0,0,0,0,128,64,32,16,0,0,0,0,128,64,32,16]
1119 ; GFNISSE-NEXT:    gf2p8affineqb $0, %xmm9, %xmm0
1120 ; GFNISSE-NEXT:    pmovsxdq {{.*#+}} xmm10 = [16909320,16909320]
1121 ; GFNISSE-NEXT:    movdqa %xmm4, %xmm11
1122 ; GFNISSE-NEXT:    gf2p8affineqb $0, %xmm10, %xmm11
1123 ; GFNISSE-NEXT:    por %xmm0, %xmm11
1124 ; GFNISSE-NEXT:    psllw $5, %xmm8
1125 ; GFNISSE-NEXT:    movdqa %xmm8, %xmm0
1126 ; GFNISSE-NEXT:    pblendvb %xmm0, %xmm11, %xmm4
1127 ; GFNISSE-NEXT:    movdqa {{.*#+}} xmm11 = [0,0,0,0,0,0,128,64,0,0,0,0,0,0,128,64]
1128 ; GFNISSE-NEXT:    movdqa %xmm4, %xmm0
1129 ; GFNISSE-NEXT:    gf2p8affineqb $0, %xmm11, %xmm0
1130 ; GFNISSE-NEXT:    movdqa {{.*#+}} xmm12 = [32,16,8,4,2,1,0,0,32,16,8,4,2,1,0,0]
1131 ; GFNISSE-NEXT:    movdqa %xmm4, %xmm13
1132 ; GFNISSE-NEXT:    gf2p8affineqb $0, %xmm12, %xmm13
1133 ; GFNISSE-NEXT:    por %xmm0, %xmm13
1134 ; GFNISSE-NEXT:    paddb %xmm8, %xmm8
1135 ; GFNISSE-NEXT:    movdqa %xmm8, %xmm0
1136 ; GFNISSE-NEXT:    pblendvb %xmm0, %xmm13, %xmm4
1137 ; GFNISSE-NEXT:    movdqa {{.*#+}} xmm13 = [0,0,0,0,0,0,0,128,0,0,0,0,0,0,0,128]
1138 ; GFNISSE-NEXT:    movdqa %xmm4, %xmm0
1139 ; GFNISSE-NEXT:    gf2p8affineqb $0, %xmm13, %xmm0
1140 ; GFNISSE-NEXT:    movdqa %xmm4, %xmm14
1141 ; GFNISSE-NEXT:    paddb %xmm4, %xmm14
1142 ; GFNISSE-NEXT:    por %xmm0, %xmm14
1143 ; GFNISSE-NEXT:    paddb %xmm8, %xmm8
1144 ; GFNISSE-NEXT:    movdqa %xmm8, %xmm0
1145 ; GFNISSE-NEXT:    pblendvb %xmm0, %xmm14, %xmm4
1146 ; GFNISSE-NEXT:    movdqa %xmm1, %xmm0
1147 ; GFNISSE-NEXT:    gf2p8affineqb $0, %xmm9, %xmm0
1148 ; GFNISSE-NEXT:    movdqa %xmm1, %xmm8
1149 ; GFNISSE-NEXT:    gf2p8affineqb $0, %xmm10, %xmm8
1150 ; GFNISSE-NEXT:    por %xmm0, %xmm8
1151 ; GFNISSE-NEXT:    psllw $5, %xmm5
1152 ; GFNISSE-NEXT:    movdqa %xmm5, %xmm0
1153 ; GFNISSE-NEXT:    pblendvb %xmm0, %xmm8, %xmm1
1154 ; GFNISSE-NEXT:    movdqa %xmm1, %xmm0
1155 ; GFNISSE-NEXT:    gf2p8affineqb $0, %xmm11, %xmm0
1156 ; GFNISSE-NEXT:    movdqa %xmm1, %xmm8
1157 ; GFNISSE-NEXT:    gf2p8affineqb $0, %xmm12, %xmm8
1158 ; GFNISSE-NEXT:    por %xmm0, %xmm8
1159 ; GFNISSE-NEXT:    paddb %xmm5, %xmm5
1160 ; GFNISSE-NEXT:    movdqa %xmm5, %xmm0
1161 ; GFNISSE-NEXT:    pblendvb %xmm0, %xmm8, %xmm1
1162 ; GFNISSE-NEXT:    movdqa %xmm1, %xmm0
1163 ; GFNISSE-NEXT:    gf2p8affineqb $0, %xmm13, %xmm0
1164 ; GFNISSE-NEXT:    movdqa %xmm1, %xmm8
1165 ; GFNISSE-NEXT:    paddb %xmm1, %xmm8
1166 ; GFNISSE-NEXT:    por %xmm0, %xmm8
1167 ; GFNISSE-NEXT:    paddb %xmm5, %xmm5
1168 ; GFNISSE-NEXT:    movdqa %xmm5, %xmm0
1169 ; GFNISSE-NEXT:    pblendvb %xmm0, %xmm8, %xmm1
1170 ; GFNISSE-NEXT:    movdqa %xmm2, %xmm0
1171 ; GFNISSE-NEXT:    gf2p8affineqb $0, %xmm9, %xmm0
1172 ; GFNISSE-NEXT:    movdqa %xmm2, %xmm5
1173 ; GFNISSE-NEXT:    gf2p8affineqb $0, %xmm10, %xmm5
1174 ; GFNISSE-NEXT:    por %xmm0, %xmm5
1175 ; GFNISSE-NEXT:    psllw $5, %xmm6
1176 ; GFNISSE-NEXT:    movdqa %xmm6, %xmm0
1177 ; GFNISSE-NEXT:    pblendvb %xmm0, %xmm5, %xmm2
1178 ; GFNISSE-NEXT:    movdqa %xmm2, %xmm0
1179 ; GFNISSE-NEXT:    gf2p8affineqb $0, %xmm11, %xmm0
1180 ; GFNISSE-NEXT:    movdqa %xmm2, %xmm5
1181 ; GFNISSE-NEXT:    gf2p8affineqb $0, %xmm12, %xmm5
1182 ; GFNISSE-NEXT:    por %xmm0, %xmm5
1183 ; GFNISSE-NEXT:    paddb %xmm6, %xmm6
1184 ; GFNISSE-NEXT:    movdqa %xmm6, %xmm0
1185 ; GFNISSE-NEXT:    pblendvb %xmm0, %xmm5, %xmm2
1186 ; GFNISSE-NEXT:    movdqa %xmm2, %xmm0
1187 ; GFNISSE-NEXT:    gf2p8affineqb $0, %xmm13, %xmm0
1188 ; GFNISSE-NEXT:    movdqa %xmm2, %xmm5
1189 ; GFNISSE-NEXT:    paddb %xmm2, %xmm5
1190 ; GFNISSE-NEXT:    por %xmm0, %xmm5
1191 ; GFNISSE-NEXT:    paddb %xmm6, %xmm6
1192 ; GFNISSE-NEXT:    movdqa %xmm6, %xmm0
1193 ; GFNISSE-NEXT:    pblendvb %xmm0, %xmm5, %xmm2
1194 ; GFNISSE-NEXT:    movdqa %xmm3, %xmm0
1195 ; GFNISSE-NEXT:    gf2p8affineqb $0, %xmm9, %xmm0
1196 ; GFNISSE-NEXT:    movdqa %xmm3, %xmm5
1197 ; GFNISSE-NEXT:    gf2p8affineqb $0, %xmm10, %xmm5
1198 ; GFNISSE-NEXT:    por %xmm0, %xmm5
1199 ; GFNISSE-NEXT:    psllw $5, %xmm7
1200 ; GFNISSE-NEXT:    movdqa %xmm7, %xmm0
1201 ; GFNISSE-NEXT:    pblendvb %xmm0, %xmm5, %xmm3
1202 ; GFNISSE-NEXT:    movdqa %xmm3, %xmm0
1203 ; GFNISSE-NEXT:    gf2p8affineqb $0, %xmm11, %xmm0
1204 ; GFNISSE-NEXT:    movdqa %xmm3, %xmm5
1205 ; GFNISSE-NEXT:    gf2p8affineqb $0, %xmm12, %xmm5
1206 ; GFNISSE-NEXT:    por %xmm0, %xmm5
1207 ; GFNISSE-NEXT:    paddb %xmm7, %xmm7
1208 ; GFNISSE-NEXT:    movdqa %xmm7, %xmm0
1209 ; GFNISSE-NEXT:    pblendvb %xmm0, %xmm5, %xmm3
1210 ; GFNISSE-NEXT:    movdqa %xmm3, %xmm0
1211 ; GFNISSE-NEXT:    gf2p8affineqb $0, %xmm13, %xmm0
1212 ; GFNISSE-NEXT:    movdqa %xmm3, %xmm5
1213 ; GFNISSE-NEXT:    paddb %xmm3, %xmm5
1214 ; GFNISSE-NEXT:    por %xmm0, %xmm5
1215 ; GFNISSE-NEXT:    paddb %xmm7, %xmm7
1216 ; GFNISSE-NEXT:    movdqa %xmm7, %xmm0
1217 ; GFNISSE-NEXT:    pblendvb %xmm0, %xmm5, %xmm3
1218 ; GFNISSE-NEXT:    movdqa %xmm4, %xmm0
1219 ; GFNISSE-NEXT:    retq
1221 ; GFNIAVX1-LABEL: var_rotl_v64i8:
1222 ; GFNIAVX1:       # %bb.0:
1223 ; GFNIAVX1-NEXT:    vextractf128 $1, %ymm0, %xmm6
1224 ; GFNIAVX1-NEXT:    vmovddup {{.*#+}} xmm4 = [0,0,0,0,128,64,32,16,0,0,0,0,128,64,32,16]
1225 ; GFNIAVX1-NEXT:    # xmm4 = mem[0,0]
1226 ; GFNIAVX1-NEXT:    vgf2p8affineqb $0, %xmm4, %xmm6, %xmm7
1227 ; GFNIAVX1-NEXT:    vmovddup {{.*#+}} xmm5 = [8,4,2,1,0,0,0,0,8,4,2,1,0,0,0,0]
1228 ; GFNIAVX1-NEXT:    # xmm5 = mem[0,0]
1229 ; GFNIAVX1-NEXT:    vgf2p8affineqb $0, %xmm5, %xmm6, %xmm8
1230 ; GFNIAVX1-NEXT:    vpor %xmm7, %xmm8, %xmm7
1231 ; GFNIAVX1-NEXT:    vextractf128 $1, %ymm2, %xmm8
1232 ; GFNIAVX1-NEXT:    vpsllw $5, %xmm8, %xmm8
1233 ; GFNIAVX1-NEXT:    vpblendvb %xmm8, %xmm7, %xmm6, %xmm9
1234 ; GFNIAVX1-NEXT:    vmovddup {{.*#+}} xmm6 = [0,0,0,0,0,0,128,64,0,0,0,0,0,0,128,64]
1235 ; GFNIAVX1-NEXT:    # xmm6 = mem[0,0]
1236 ; GFNIAVX1-NEXT:    vgf2p8affineqb $0, %xmm6, %xmm9, %xmm10
1237 ; GFNIAVX1-NEXT:    vmovddup {{.*#+}} xmm7 = [32,16,8,4,2,1,0,0,32,16,8,4,2,1,0,0]
1238 ; GFNIAVX1-NEXT:    # xmm7 = mem[0,0]
1239 ; GFNIAVX1-NEXT:    vgf2p8affineqb $0, %xmm7, %xmm9, %xmm11
1240 ; GFNIAVX1-NEXT:    vpor %xmm10, %xmm11, %xmm10
1241 ; GFNIAVX1-NEXT:    vpaddb %xmm8, %xmm8, %xmm11
1242 ; GFNIAVX1-NEXT:    vpblendvb %xmm11, %xmm10, %xmm9, %xmm9
1243 ; GFNIAVX1-NEXT:    vmovddup {{.*#+}} xmm8 = [0,0,0,0,0,0,0,128,0,0,0,0,0,0,0,128]
1244 ; GFNIAVX1-NEXT:    # xmm8 = mem[0,0]
1245 ; GFNIAVX1-NEXT:    vgf2p8affineqb $0, %xmm8, %xmm9, %xmm10
1246 ; GFNIAVX1-NEXT:    vpaddb %xmm9, %xmm9, %xmm12
1247 ; GFNIAVX1-NEXT:    vpor %xmm10, %xmm12, %xmm10
1248 ; GFNIAVX1-NEXT:    vpaddb %xmm11, %xmm11, %xmm11
1249 ; GFNIAVX1-NEXT:    vpblendvb %xmm11, %xmm10, %xmm9, %xmm9
1250 ; GFNIAVX1-NEXT:    vgf2p8affineqb $0, %xmm4, %xmm0, %xmm10
1251 ; GFNIAVX1-NEXT:    vgf2p8affineqb $0, %xmm5, %xmm0, %xmm11
1252 ; GFNIAVX1-NEXT:    vpor %xmm10, %xmm11, %xmm10
1253 ; GFNIAVX1-NEXT:    vpsllw $5, %xmm2, %xmm2
1254 ; GFNIAVX1-NEXT:    vpblendvb %xmm2, %xmm10, %xmm0, %xmm0
1255 ; GFNIAVX1-NEXT:    vgf2p8affineqb $0, %xmm6, %xmm0, %xmm10
1256 ; GFNIAVX1-NEXT:    vgf2p8affineqb $0, %xmm7, %xmm0, %xmm11
1257 ; GFNIAVX1-NEXT:    vpor %xmm10, %xmm11, %xmm10
1258 ; GFNIAVX1-NEXT:    vpaddb %xmm2, %xmm2, %xmm2
1259 ; GFNIAVX1-NEXT:    vpblendvb %xmm2, %xmm10, %xmm0, %xmm0
1260 ; GFNIAVX1-NEXT:    vgf2p8affineqb $0, %xmm8, %xmm0, %xmm10
1261 ; GFNIAVX1-NEXT:    vpaddb %xmm0, %xmm0, %xmm11
1262 ; GFNIAVX1-NEXT:    vpor %xmm10, %xmm11, %xmm10
1263 ; GFNIAVX1-NEXT:    vpaddb %xmm2, %xmm2, %xmm2
1264 ; GFNIAVX1-NEXT:    vpblendvb %xmm2, %xmm10, %xmm0, %xmm0
1265 ; GFNIAVX1-NEXT:    vinsertf128 $1, %xmm9, %ymm0, %ymm0
1266 ; GFNIAVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
1267 ; GFNIAVX1-NEXT:    vgf2p8affineqb $0, %xmm4, %xmm2, %xmm9
1268 ; GFNIAVX1-NEXT:    vgf2p8affineqb $0, %xmm5, %xmm2, %xmm10
1269 ; GFNIAVX1-NEXT:    vpor %xmm9, %xmm10, %xmm9
1270 ; GFNIAVX1-NEXT:    vextractf128 $1, %ymm3, %xmm10
1271 ; GFNIAVX1-NEXT:    vpsllw $5, %xmm10, %xmm10
1272 ; GFNIAVX1-NEXT:    vpblendvb %xmm10, %xmm9, %xmm2, %xmm2
1273 ; GFNIAVX1-NEXT:    vgf2p8affineqb $0, %xmm6, %xmm2, %xmm9
1274 ; GFNIAVX1-NEXT:    vgf2p8affineqb $0, %xmm7, %xmm2, %xmm11
1275 ; GFNIAVX1-NEXT:    vpor %xmm9, %xmm11, %xmm9
1276 ; GFNIAVX1-NEXT:    vpaddb %xmm10, %xmm10, %xmm10
1277 ; GFNIAVX1-NEXT:    vpblendvb %xmm10, %xmm9, %xmm2, %xmm2
1278 ; GFNIAVX1-NEXT:    vgf2p8affineqb $0, %xmm8, %xmm2, %xmm9
1279 ; GFNIAVX1-NEXT:    vpaddb %xmm2, %xmm2, %xmm11
1280 ; GFNIAVX1-NEXT:    vpor %xmm9, %xmm11, %xmm9
1281 ; GFNIAVX1-NEXT:    vpaddb %xmm10, %xmm10, %xmm10
1282 ; GFNIAVX1-NEXT:    vpblendvb %xmm10, %xmm9, %xmm2, %xmm2
1283 ; GFNIAVX1-NEXT:    vgf2p8affineqb $0, %xmm4, %xmm1, %xmm4
1284 ; GFNIAVX1-NEXT:    vgf2p8affineqb $0, %xmm5, %xmm1, %xmm5
1285 ; GFNIAVX1-NEXT:    vpor %xmm4, %xmm5, %xmm4
1286 ; GFNIAVX1-NEXT:    vpsllw $5, %xmm3, %xmm3
1287 ; GFNIAVX1-NEXT:    vpblendvb %xmm3, %xmm4, %xmm1, %xmm1
1288 ; GFNIAVX1-NEXT:    vgf2p8affineqb $0, %xmm6, %xmm1, %xmm4
1289 ; GFNIAVX1-NEXT:    vgf2p8affineqb $0, %xmm7, %xmm1, %xmm5
1290 ; GFNIAVX1-NEXT:    vpor %xmm4, %xmm5, %xmm4
1291 ; GFNIAVX1-NEXT:    vpaddb %xmm3, %xmm3, %xmm3
1292 ; GFNIAVX1-NEXT:    vpblendvb %xmm3, %xmm4, %xmm1, %xmm1
1293 ; GFNIAVX1-NEXT:    vgf2p8affineqb $0, %xmm8, %xmm1, %xmm4
1294 ; GFNIAVX1-NEXT:    vpaddb %xmm1, %xmm1, %xmm5
1295 ; GFNIAVX1-NEXT:    vpor %xmm4, %xmm5, %xmm4
1296 ; GFNIAVX1-NEXT:    vpaddb %xmm3, %xmm3, %xmm3
1297 ; GFNIAVX1-NEXT:    vpblendvb %xmm3, %xmm4, %xmm1, %xmm1
1298 ; GFNIAVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm1, %ymm1
1299 ; GFNIAVX1-NEXT:    retq
1301 ; GFNIAVX2-LABEL: var_rotl_v64i8:
1302 ; GFNIAVX2:       # %bb.0:
1303 ; GFNIAVX2-NEXT:    vpbroadcastq {{.*#+}} ymm4 = [0,0,0,0,128,64,32,16,0,0,0,0,128,64,32,16,0,0,0,0,128,64,32,16,0,0,0,0,128,64,32,16]
1304 ; GFNIAVX2-NEXT:    vgf2p8affineqb $0, %ymm4, %ymm0, %ymm5
1305 ; GFNIAVX2-NEXT:    vpbroadcastq {{.*#+}} ymm6 = [8,4,2,1,0,0,0,0,8,4,2,1,0,0,0,0,8,4,2,1,0,0,0,0,8,4,2,1,0,0,0,0]
1306 ; GFNIAVX2-NEXT:    vgf2p8affineqb $0, %ymm6, %ymm0, %ymm7
1307 ; GFNIAVX2-NEXT:    vpor %ymm5, %ymm7, %ymm5
1308 ; GFNIAVX2-NEXT:    vpsllw $5, %ymm2, %ymm2
1309 ; GFNIAVX2-NEXT:    vpblendvb %ymm2, %ymm5, %ymm0, %ymm0
1310 ; GFNIAVX2-NEXT:    vpbroadcastq {{.*#+}} ymm5 = [0,0,0,0,0,0,128,64,0,0,0,0,0,0,128,64,0,0,0,0,0,0,128,64,0,0,0,0,0,0,128,64]
1311 ; GFNIAVX2-NEXT:    vgf2p8affineqb $0, %ymm5, %ymm0, %ymm7
1312 ; GFNIAVX2-NEXT:    vpbroadcastq {{.*#+}} ymm8 = [32,16,8,4,2,1,0,0,32,16,8,4,2,1,0,0,32,16,8,4,2,1,0,0,32,16,8,4,2,1,0,0]
1313 ; GFNIAVX2-NEXT:    vgf2p8affineqb $0, %ymm8, %ymm0, %ymm9
1314 ; GFNIAVX2-NEXT:    vpor %ymm7, %ymm9, %ymm7
1315 ; GFNIAVX2-NEXT:    vpaddb %ymm2, %ymm2, %ymm2
1316 ; GFNIAVX2-NEXT:    vpblendvb %ymm2, %ymm7, %ymm0, %ymm0
1317 ; GFNIAVX2-NEXT:    vpbroadcastq {{.*#+}} ymm7 = [0,0,0,0,0,0,0,128,0,0,0,0,0,0,0,128,0,0,0,0,0,0,0,128,0,0,0,0,0,0,0,128]
1318 ; GFNIAVX2-NEXT:    vgf2p8affineqb $0, %ymm7, %ymm0, %ymm9
1319 ; GFNIAVX2-NEXT:    vpaddb %ymm0, %ymm0, %ymm10
1320 ; GFNIAVX2-NEXT:    vpor %ymm9, %ymm10, %ymm9
1321 ; GFNIAVX2-NEXT:    vpaddb %ymm2, %ymm2, %ymm2
1322 ; GFNIAVX2-NEXT:    vpblendvb %ymm2, %ymm9, %ymm0, %ymm0
1323 ; GFNIAVX2-NEXT:    vgf2p8affineqb $0, %ymm4, %ymm1, %ymm2
1324 ; GFNIAVX2-NEXT:    vgf2p8affineqb $0, %ymm6, %ymm1, %ymm4
1325 ; GFNIAVX2-NEXT:    vpor %ymm2, %ymm4, %ymm2
1326 ; GFNIAVX2-NEXT:    vpsllw $5, %ymm3, %ymm3
1327 ; GFNIAVX2-NEXT:    vpblendvb %ymm3, %ymm2, %ymm1, %ymm1
1328 ; GFNIAVX2-NEXT:    vgf2p8affineqb $0, %ymm5, %ymm1, %ymm2
1329 ; GFNIAVX2-NEXT:    vgf2p8affineqb $0, %ymm8, %ymm1, %ymm4
1330 ; GFNIAVX2-NEXT:    vpor %ymm2, %ymm4, %ymm2
1331 ; GFNIAVX2-NEXT:    vpaddb %ymm3, %ymm3, %ymm3
1332 ; GFNIAVX2-NEXT:    vpblendvb %ymm3, %ymm2, %ymm1, %ymm1
1333 ; GFNIAVX2-NEXT:    vgf2p8affineqb $0, %ymm7, %ymm1, %ymm2
1334 ; GFNIAVX2-NEXT:    vpaddb %ymm1, %ymm1, %ymm4
1335 ; GFNIAVX2-NEXT:    vpor %ymm2, %ymm4, %ymm2
1336 ; GFNIAVX2-NEXT:    vpaddb %ymm3, %ymm3, %ymm3
1337 ; GFNIAVX2-NEXT:    vpblendvb %ymm3, %ymm2, %ymm1, %ymm1
1338 ; GFNIAVX2-NEXT:    retq
1340 ; GFNIAVX512VL-LABEL: var_rotl_v64i8:
1341 ; GFNIAVX512VL:       # %bb.0:
1342 ; GFNIAVX512VL-NEXT:    vextracti64x4 $1, %zmm0, %ymm2
1343 ; GFNIAVX512VL-NEXT:    vpbroadcastq {{.*#+}} ymm3 = [0,0,0,0,128,64,32,16,0,0,0,0,128,64,32,16,0,0,0,0,128,64,32,16,0,0,0,0,128,64,32,16]
1344 ; GFNIAVX512VL-NEXT:    vgf2p8affineqb $0, %ymm3, %ymm2, %ymm4
1345 ; GFNIAVX512VL-NEXT:    vpbroadcastq {{.*#+}} ymm5 = [8,4,2,1,0,0,0,0,8,4,2,1,0,0,0,0,8,4,2,1,0,0,0,0,8,4,2,1,0,0,0,0]
1346 ; GFNIAVX512VL-NEXT:    vgf2p8affineqb $0, %ymm5, %ymm2, %ymm6
1347 ; GFNIAVX512VL-NEXT:    vpor %ymm4, %ymm6, %ymm4
1348 ; GFNIAVX512VL-NEXT:    vextracti64x4 $1, %zmm1, %ymm6
1349 ; GFNIAVX512VL-NEXT:    vpsllw $5, %ymm6, %ymm6
1350 ; GFNIAVX512VL-NEXT:    vpblendvb %ymm6, %ymm4, %ymm2, %ymm2
1351 ; GFNIAVX512VL-NEXT:    vpbroadcastq {{.*#+}} ymm4 = [0,0,0,0,0,0,128,64,0,0,0,0,0,0,128,64,0,0,0,0,0,0,128,64,0,0,0,0,0,0,128,64]
1352 ; GFNIAVX512VL-NEXT:    vgf2p8affineqb $0, %ymm4, %ymm2, %ymm7
1353 ; GFNIAVX512VL-NEXT:    vpbroadcastq {{.*#+}} ymm8 = [32,16,8,4,2,1,0,0,32,16,8,4,2,1,0,0,32,16,8,4,2,1,0,0,32,16,8,4,2,1,0,0]
1354 ; GFNIAVX512VL-NEXT:    vgf2p8affineqb $0, %ymm8, %ymm2, %ymm9
1355 ; GFNIAVX512VL-NEXT:    vpor %ymm7, %ymm9, %ymm7
1356 ; GFNIAVX512VL-NEXT:    vpaddb %ymm6, %ymm6, %ymm6
1357 ; GFNIAVX512VL-NEXT:    vpblendvb %ymm6, %ymm7, %ymm2, %ymm2
1358 ; GFNIAVX512VL-NEXT:    vpbroadcastq {{.*#+}} ymm7 = [0,0,0,0,0,0,0,128,0,0,0,0,0,0,0,128,0,0,0,0,0,0,0,128,0,0,0,0,0,0,0,128]
1359 ; GFNIAVX512VL-NEXT:    vgf2p8affineqb $0, %ymm7, %ymm2, %ymm9
1360 ; GFNIAVX512VL-NEXT:    vpaddb %ymm2, %ymm2, %ymm10
1361 ; GFNIAVX512VL-NEXT:    vpor %ymm9, %ymm10, %ymm9
1362 ; GFNIAVX512VL-NEXT:    vpaddb %ymm6, %ymm6, %ymm6
1363 ; GFNIAVX512VL-NEXT:    vpblendvb %ymm6, %ymm9, %ymm2, %ymm2
1364 ; GFNIAVX512VL-NEXT:    vgf2p8affineqb $0, %ymm3, %ymm0, %ymm3
1365 ; GFNIAVX512VL-NEXT:    vgf2p8affineqb $0, %ymm5, %ymm0, %ymm5
1366 ; GFNIAVX512VL-NEXT:    vpor %ymm3, %ymm5, %ymm3
1367 ; GFNIAVX512VL-NEXT:    vpsllw $5, %ymm1, %ymm1
1368 ; GFNIAVX512VL-NEXT:    vpblendvb %ymm1, %ymm3, %ymm0, %ymm0
1369 ; GFNIAVX512VL-NEXT:    vgf2p8affineqb $0, %ymm4, %ymm0, %ymm3
1370 ; GFNIAVX512VL-NEXT:    vgf2p8affineqb $0, %ymm8, %ymm0, %ymm4
1371 ; GFNIAVX512VL-NEXT:    vpor %ymm3, %ymm4, %ymm3
1372 ; GFNIAVX512VL-NEXT:    vpaddb %ymm1, %ymm1, %ymm1
1373 ; GFNIAVX512VL-NEXT:    vpblendvb %ymm1, %ymm3, %ymm0, %ymm0
1374 ; GFNIAVX512VL-NEXT:    vgf2p8affineqb $0, %ymm7, %ymm0, %ymm3
1375 ; GFNIAVX512VL-NEXT:    vpaddb %ymm0, %ymm0, %ymm4
1376 ; GFNIAVX512VL-NEXT:    vpor %ymm3, %ymm4, %ymm3
1377 ; GFNIAVX512VL-NEXT:    vpaddb %ymm1, %ymm1, %ymm1
1378 ; GFNIAVX512VL-NEXT:    vpblendvb %ymm1, %ymm3, %ymm0, %ymm0
1379 ; GFNIAVX512VL-NEXT:    vinserti64x4 $1, %ymm2, %zmm0, %zmm0
1380 ; GFNIAVX512VL-NEXT:    retq
1382 ; GFNIAVX512BW-LABEL: var_rotl_v64i8:
1383 ; GFNIAVX512BW:       # %bb.0:
1384 ; GFNIAVX512BW-NEXT:    vpandd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to16}, %zmm1, %zmm1
1385 ; GFNIAVX512BW-NEXT:    vpxor %xmm2, %xmm2, %xmm2
1386 ; GFNIAVX512BW-NEXT:    vpunpckhbw {{.*#+}} zmm3 = zmm1[8],zmm2[8],zmm1[9],zmm2[9],zmm1[10],zmm2[10],zmm1[11],zmm2[11],zmm1[12],zmm2[12],zmm1[13],zmm2[13],zmm1[14],zmm2[14],zmm1[15],zmm2[15],zmm1[24],zmm2[24],zmm1[25],zmm2[25],zmm1[26],zmm2[26],zmm1[27],zmm2[27],zmm1[28],zmm2[28],zmm1[29],zmm2[29],zmm1[30],zmm2[30],zmm1[31],zmm2[31],zmm1[40],zmm2[40],zmm1[41],zmm2[41],zmm1[42],zmm2[42],zmm1[43],zmm2[43],zmm1[44],zmm2[44],zmm1[45],zmm2[45],zmm1[46],zmm2[46],zmm1[47],zmm2[47],zmm1[56],zmm2[56],zmm1[57],zmm2[57],zmm1[58],zmm2[58],zmm1[59],zmm2[59],zmm1[60],zmm2[60],zmm1[61],zmm2[61],zmm1[62],zmm2[62],zmm1[63],zmm2[63]
1387 ; GFNIAVX512BW-NEXT:    vpunpckhbw {{.*#+}} zmm4 = zmm0[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,40,40,41,41,42,42,43,43,44,44,45,45,46,46,47,47,56,56,57,57,58,58,59,59,60,60,61,61,62,62,63,63]
1388 ; GFNIAVX512BW-NEXT:    vpsllvw %zmm3, %zmm4, %zmm3
1389 ; GFNIAVX512BW-NEXT:    vpsrlw $8, %zmm3, %zmm3
1390 ; GFNIAVX512BW-NEXT:    vpunpcklbw {{.*#+}} zmm1 = zmm1[0],zmm2[0],zmm1[1],zmm2[1],zmm1[2],zmm2[2],zmm1[3],zmm2[3],zmm1[4],zmm2[4],zmm1[5],zmm2[5],zmm1[6],zmm2[6],zmm1[7],zmm2[7],zmm1[16],zmm2[16],zmm1[17],zmm2[17],zmm1[18],zmm2[18],zmm1[19],zmm2[19],zmm1[20],zmm2[20],zmm1[21],zmm2[21],zmm1[22],zmm2[22],zmm1[23],zmm2[23],zmm1[32],zmm2[32],zmm1[33],zmm2[33],zmm1[34],zmm2[34],zmm1[35],zmm2[35],zmm1[36],zmm2[36],zmm1[37],zmm2[37],zmm1[38],zmm2[38],zmm1[39],zmm2[39],zmm1[48],zmm2[48],zmm1[49],zmm2[49],zmm1[50],zmm2[50],zmm1[51],zmm2[51],zmm1[52],zmm2[52],zmm1[53],zmm2[53],zmm1[54],zmm2[54],zmm1[55],zmm2[55]
1391 ; GFNIAVX512BW-NEXT:    vpunpcklbw {{.*#+}} zmm0 = zmm0[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,32,32,33,33,34,34,35,35,36,36,37,37,38,38,39,39,48,48,49,49,50,50,51,51,52,52,53,53,54,54,55,55]
1392 ; GFNIAVX512BW-NEXT:    vpsllvw %zmm1, %zmm0, %zmm0
1393 ; GFNIAVX512BW-NEXT:    vpsrlw $8, %zmm0, %zmm0
1394 ; GFNIAVX512BW-NEXT:    vpackuswb %zmm3, %zmm0, %zmm0
1395 ; GFNIAVX512BW-NEXT:    retq
1396   %res = call <64 x i8> @llvm.fshl.v64i8(<64 x i8> %a, <64 x i8> %a, <64 x i8> %amt)
1397   ret <64 x i8> %res
1399 define <64 x i8> @var_rotr_v64i8(<64 x i8> %a, <64 x i8> %amt) nounwind {
1400 ; GFNISSE-LABEL: var_rotr_v64i8:
1401 ; GFNISSE:       # %bb.0:
1402 ; GFNISSE-NEXT:    movdqa %xmm0, %xmm9
1403 ; GFNISSE-NEXT:    movdqa {{.*#+}} xmm10 = [0,0,0,0,128,64,32,16,0,0,0,0,128,64,32,16]
1404 ; GFNISSE-NEXT:    gf2p8affineqb $0, %xmm10, %xmm0
1405 ; GFNISSE-NEXT:    pmovsxdq {{.*#+}} xmm11 = [16909320,16909320]
1406 ; GFNISSE-NEXT:    movdqa %xmm9, %xmm12
1407 ; GFNISSE-NEXT:    gf2p8affineqb $0, %xmm11, %xmm12
1408 ; GFNISSE-NEXT:    por %xmm0, %xmm12
1409 ; GFNISSE-NEXT:    pxor %xmm8, %xmm8
1410 ; GFNISSE-NEXT:    pxor %xmm0, %xmm0
1411 ; GFNISSE-NEXT:    psubb %xmm4, %xmm0
1412 ; GFNISSE-NEXT:    psllw $5, %xmm0
1413 ; GFNISSE-NEXT:    pblendvb %xmm0, %xmm12, %xmm9
1414 ; GFNISSE-NEXT:    movdqa {{.*#+}} xmm4 = [0,0,0,0,0,0,128,64,0,0,0,0,0,0,128,64]
1415 ; GFNISSE-NEXT:    movdqa %xmm9, %xmm13
1416 ; GFNISSE-NEXT:    gf2p8affineqb $0, %xmm4, %xmm13
1417 ; GFNISSE-NEXT:    movdqa {{.*#+}} xmm12 = [32,16,8,4,2,1,0,0,32,16,8,4,2,1,0,0]
1418 ; GFNISSE-NEXT:    movdqa %xmm9, %xmm14
1419 ; GFNISSE-NEXT:    gf2p8affineqb $0, %xmm12, %xmm14
1420 ; GFNISSE-NEXT:    por %xmm13, %xmm14
1421 ; GFNISSE-NEXT:    paddb %xmm0, %xmm0
1422 ; GFNISSE-NEXT:    pblendvb %xmm0, %xmm14, %xmm9
1423 ; GFNISSE-NEXT:    movdqa {{.*#+}} xmm13 = [0,0,0,0,0,0,0,128,0,0,0,0,0,0,0,128]
1424 ; GFNISSE-NEXT:    movdqa %xmm9, %xmm14
1425 ; GFNISSE-NEXT:    gf2p8affineqb $0, %xmm13, %xmm14
1426 ; GFNISSE-NEXT:    movdqa %xmm9, %xmm15
1427 ; GFNISSE-NEXT:    paddb %xmm9, %xmm15
1428 ; GFNISSE-NEXT:    por %xmm14, %xmm15
1429 ; GFNISSE-NEXT:    paddb %xmm0, %xmm0
1430 ; GFNISSE-NEXT:    pblendvb %xmm0, %xmm15, %xmm9
1431 ; GFNISSE-NEXT:    movdqa %xmm1, %xmm0
1432 ; GFNISSE-NEXT:    gf2p8affineqb $0, %xmm10, %xmm0
1433 ; GFNISSE-NEXT:    movdqa %xmm1, %xmm14
1434 ; GFNISSE-NEXT:    gf2p8affineqb $0, %xmm11, %xmm14
1435 ; GFNISSE-NEXT:    por %xmm0, %xmm14
1436 ; GFNISSE-NEXT:    pxor %xmm0, %xmm0
1437 ; GFNISSE-NEXT:    psubb %xmm5, %xmm0
1438 ; GFNISSE-NEXT:    psllw $5, %xmm0
1439 ; GFNISSE-NEXT:    pblendvb %xmm0, %xmm14, %xmm1
1440 ; GFNISSE-NEXT:    movdqa %xmm1, %xmm5
1441 ; GFNISSE-NEXT:    gf2p8affineqb $0, %xmm4, %xmm5
1442 ; GFNISSE-NEXT:    movdqa %xmm1, %xmm14
1443 ; GFNISSE-NEXT:    gf2p8affineqb $0, %xmm12, %xmm14
1444 ; GFNISSE-NEXT:    por %xmm5, %xmm14
1445 ; GFNISSE-NEXT:    paddb %xmm0, %xmm0
1446 ; GFNISSE-NEXT:    pblendvb %xmm0, %xmm14, %xmm1
1447 ; GFNISSE-NEXT:    movdqa %xmm1, %xmm5
1448 ; GFNISSE-NEXT:    gf2p8affineqb $0, %xmm13, %xmm5
1449 ; GFNISSE-NEXT:    movdqa %xmm1, %xmm14
1450 ; GFNISSE-NEXT:    paddb %xmm1, %xmm14
1451 ; GFNISSE-NEXT:    por %xmm5, %xmm14
1452 ; GFNISSE-NEXT:    paddb %xmm0, %xmm0
1453 ; GFNISSE-NEXT:    pblendvb %xmm0, %xmm14, %xmm1
1454 ; GFNISSE-NEXT:    movdqa %xmm2, %xmm0
1455 ; GFNISSE-NEXT:    gf2p8affineqb $0, %xmm10, %xmm0
1456 ; GFNISSE-NEXT:    movdqa %xmm2, %xmm5
1457 ; GFNISSE-NEXT:    gf2p8affineqb $0, %xmm11, %xmm5
1458 ; GFNISSE-NEXT:    por %xmm0, %xmm5
1459 ; GFNISSE-NEXT:    pxor %xmm0, %xmm0
1460 ; GFNISSE-NEXT:    psubb %xmm6, %xmm0
1461 ; GFNISSE-NEXT:    psllw $5, %xmm0
1462 ; GFNISSE-NEXT:    pblendvb %xmm0, %xmm5, %xmm2
1463 ; GFNISSE-NEXT:    movdqa %xmm2, %xmm5
1464 ; GFNISSE-NEXT:    gf2p8affineqb $0, %xmm4, %xmm5
1465 ; GFNISSE-NEXT:    movdqa %xmm2, %xmm6
1466 ; GFNISSE-NEXT:    gf2p8affineqb $0, %xmm12, %xmm6
1467 ; GFNISSE-NEXT:    por %xmm5, %xmm6
1468 ; GFNISSE-NEXT:    paddb %xmm0, %xmm0
1469 ; GFNISSE-NEXT:    pblendvb %xmm0, %xmm6, %xmm2
1470 ; GFNISSE-NEXT:    movdqa %xmm2, %xmm5
1471 ; GFNISSE-NEXT:    gf2p8affineqb $0, %xmm13, %xmm5
1472 ; GFNISSE-NEXT:    movdqa %xmm2, %xmm6
1473 ; GFNISSE-NEXT:    paddb %xmm2, %xmm6
1474 ; GFNISSE-NEXT:    por %xmm5, %xmm6
1475 ; GFNISSE-NEXT:    paddb %xmm0, %xmm0
1476 ; GFNISSE-NEXT:    pblendvb %xmm0, %xmm6, %xmm2
1477 ; GFNISSE-NEXT:    movdqa %xmm3, %xmm0
1478 ; GFNISSE-NEXT:    gf2p8affineqb $0, %xmm10, %xmm0
1479 ; GFNISSE-NEXT:    movdqa %xmm3, %xmm5
1480 ; GFNISSE-NEXT:    gf2p8affineqb $0, %xmm11, %xmm5
1481 ; GFNISSE-NEXT:    por %xmm0, %xmm5
1482 ; GFNISSE-NEXT:    psubb %xmm7, %xmm8
1483 ; GFNISSE-NEXT:    psllw $5, %xmm8
1484 ; GFNISSE-NEXT:    movdqa %xmm8, %xmm0
1485 ; GFNISSE-NEXT:    pblendvb %xmm0, %xmm5, %xmm3
1486 ; GFNISSE-NEXT:    movdqa %xmm3, %xmm0
1487 ; GFNISSE-NEXT:    gf2p8affineqb $0, %xmm4, %xmm0
1488 ; GFNISSE-NEXT:    movdqa %xmm3, %xmm4
1489 ; GFNISSE-NEXT:    gf2p8affineqb $0, %xmm12, %xmm4
1490 ; GFNISSE-NEXT:    por %xmm0, %xmm4
1491 ; GFNISSE-NEXT:    paddb %xmm8, %xmm8
1492 ; GFNISSE-NEXT:    movdqa %xmm8, %xmm0
1493 ; GFNISSE-NEXT:    pblendvb %xmm0, %xmm4, %xmm3
1494 ; GFNISSE-NEXT:    movdqa %xmm3, %xmm0
1495 ; GFNISSE-NEXT:    gf2p8affineqb $0, %xmm13, %xmm0
1496 ; GFNISSE-NEXT:    movdqa %xmm3, %xmm4
1497 ; GFNISSE-NEXT:    paddb %xmm3, %xmm4
1498 ; GFNISSE-NEXT:    por %xmm0, %xmm4
1499 ; GFNISSE-NEXT:    paddb %xmm8, %xmm8
1500 ; GFNISSE-NEXT:    movdqa %xmm8, %xmm0
1501 ; GFNISSE-NEXT:    pblendvb %xmm0, %xmm4, %xmm3
1502 ; GFNISSE-NEXT:    movdqa %xmm9, %xmm0
1503 ; GFNISSE-NEXT:    retq
1505 ; GFNIAVX1-LABEL: var_rotr_v64i8:
1506 ; GFNIAVX1:       # %bb.0:
1507 ; GFNIAVX1-NEXT:    vextractf128 $1, %ymm0, %xmm7
1508 ; GFNIAVX1-NEXT:    vmovddup {{.*#+}} xmm4 = [0,0,0,0,128,64,32,16,0,0,0,0,128,64,32,16]
1509 ; GFNIAVX1-NEXT:    # xmm4 = mem[0,0]
1510 ; GFNIAVX1-NEXT:    vgf2p8affineqb $0, %xmm4, %xmm7, %xmm6
1511 ; GFNIAVX1-NEXT:    vmovddup {{.*#+}} xmm5 = [8,4,2,1,0,0,0,0,8,4,2,1,0,0,0,0]
1512 ; GFNIAVX1-NEXT:    # xmm5 = mem[0,0]
1513 ; GFNIAVX1-NEXT:    vgf2p8affineqb $0, %xmm5, %xmm7, %xmm8
1514 ; GFNIAVX1-NEXT:    vpor %xmm6, %xmm8, %xmm8
1515 ; GFNIAVX1-NEXT:    vextractf128 $1, %ymm2, %xmm9
1516 ; GFNIAVX1-NEXT:    vpxor %xmm6, %xmm6, %xmm6
1517 ; GFNIAVX1-NEXT:    vpsubb %xmm9, %xmm6, %xmm9
1518 ; GFNIAVX1-NEXT:    vpsllw $5, %xmm9, %xmm9
1519 ; GFNIAVX1-NEXT:    vpblendvb %xmm9, %xmm8, %xmm7, %xmm10
1520 ; GFNIAVX1-NEXT:    vmovddup {{.*#+}} xmm7 = [0,0,0,0,0,0,128,64,0,0,0,0,0,0,128,64]
1521 ; GFNIAVX1-NEXT:    # xmm7 = mem[0,0]
1522 ; GFNIAVX1-NEXT:    vgf2p8affineqb $0, %xmm7, %xmm10, %xmm11
1523 ; GFNIAVX1-NEXT:    vmovddup {{.*#+}} xmm8 = [32,16,8,4,2,1,0,0,32,16,8,4,2,1,0,0]
1524 ; GFNIAVX1-NEXT:    # xmm8 = mem[0,0]
1525 ; GFNIAVX1-NEXT:    vgf2p8affineqb $0, %xmm8, %xmm10, %xmm12
1526 ; GFNIAVX1-NEXT:    vpor %xmm11, %xmm12, %xmm11
1527 ; GFNIAVX1-NEXT:    vpaddb %xmm9, %xmm9, %xmm12
1528 ; GFNIAVX1-NEXT:    vpblendvb %xmm12, %xmm11, %xmm10, %xmm10
1529 ; GFNIAVX1-NEXT:    vmovddup {{.*#+}} xmm9 = [0,0,0,0,0,0,0,128,0,0,0,0,0,0,0,128]
1530 ; GFNIAVX1-NEXT:    # xmm9 = mem[0,0]
1531 ; GFNIAVX1-NEXT:    vgf2p8affineqb $0, %xmm9, %xmm10, %xmm11
1532 ; GFNIAVX1-NEXT:    vpaddb %xmm10, %xmm10, %xmm13
1533 ; GFNIAVX1-NEXT:    vpor %xmm11, %xmm13, %xmm11
1534 ; GFNIAVX1-NEXT:    vpaddb %xmm12, %xmm12, %xmm12
1535 ; GFNIAVX1-NEXT:    vpblendvb %xmm12, %xmm11, %xmm10, %xmm10
1536 ; GFNIAVX1-NEXT:    vgf2p8affineqb $0, %xmm4, %xmm0, %xmm11
1537 ; GFNIAVX1-NEXT:    vgf2p8affineqb $0, %xmm5, %xmm0, %xmm12
1538 ; GFNIAVX1-NEXT:    vpor %xmm11, %xmm12, %xmm11
1539 ; GFNIAVX1-NEXT:    vpsubb %xmm2, %xmm6, %xmm2
1540 ; GFNIAVX1-NEXT:    vpsllw $5, %xmm2, %xmm2
1541 ; GFNIAVX1-NEXT:    vpblendvb %xmm2, %xmm11, %xmm0, %xmm0
1542 ; GFNIAVX1-NEXT:    vgf2p8affineqb $0, %xmm7, %xmm0, %xmm11
1543 ; GFNIAVX1-NEXT:    vgf2p8affineqb $0, %xmm8, %xmm0, %xmm12
1544 ; GFNIAVX1-NEXT:    vpor %xmm11, %xmm12, %xmm11
1545 ; GFNIAVX1-NEXT:    vpaddb %xmm2, %xmm2, %xmm2
1546 ; GFNIAVX1-NEXT:    vpblendvb %xmm2, %xmm11, %xmm0, %xmm0
1547 ; GFNIAVX1-NEXT:    vgf2p8affineqb $0, %xmm9, %xmm0, %xmm11
1548 ; GFNIAVX1-NEXT:    vpaddb %xmm0, %xmm0, %xmm12
1549 ; GFNIAVX1-NEXT:    vpor %xmm11, %xmm12, %xmm11
1550 ; GFNIAVX1-NEXT:    vpaddb %xmm2, %xmm2, %xmm2
1551 ; GFNIAVX1-NEXT:    vpblendvb %xmm2, %xmm11, %xmm0, %xmm0
1552 ; GFNIAVX1-NEXT:    vinsertf128 $1, %xmm10, %ymm0, %ymm0
1553 ; GFNIAVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
1554 ; GFNIAVX1-NEXT:    vgf2p8affineqb $0, %xmm4, %xmm2, %xmm10
1555 ; GFNIAVX1-NEXT:    vgf2p8affineqb $0, %xmm5, %xmm2, %xmm11
1556 ; GFNIAVX1-NEXT:    vpor %xmm10, %xmm11, %xmm10
1557 ; GFNIAVX1-NEXT:    vextractf128 $1, %ymm3, %xmm11
1558 ; GFNIAVX1-NEXT:    vpsubb %xmm11, %xmm6, %xmm11
1559 ; GFNIAVX1-NEXT:    vpsllw $5, %xmm11, %xmm11
1560 ; GFNIAVX1-NEXT:    vpblendvb %xmm11, %xmm10, %xmm2, %xmm2
1561 ; GFNIAVX1-NEXT:    vgf2p8affineqb $0, %xmm7, %xmm2, %xmm10
1562 ; GFNIAVX1-NEXT:    vgf2p8affineqb $0, %xmm8, %xmm2, %xmm12
1563 ; GFNIAVX1-NEXT:    vpor %xmm10, %xmm12, %xmm10
1564 ; GFNIAVX1-NEXT:    vpaddb %xmm11, %xmm11, %xmm11
1565 ; GFNIAVX1-NEXT:    vpblendvb %xmm11, %xmm10, %xmm2, %xmm2
1566 ; GFNIAVX1-NEXT:    vgf2p8affineqb $0, %xmm9, %xmm2, %xmm10
1567 ; GFNIAVX1-NEXT:    vpaddb %xmm2, %xmm2, %xmm12
1568 ; GFNIAVX1-NEXT:    vpor %xmm10, %xmm12, %xmm10
1569 ; GFNIAVX1-NEXT:    vpaddb %xmm11, %xmm11, %xmm11
1570 ; GFNIAVX1-NEXT:    vpblendvb %xmm11, %xmm10, %xmm2, %xmm2
1571 ; GFNIAVX1-NEXT:    vgf2p8affineqb $0, %xmm4, %xmm1, %xmm4
1572 ; GFNIAVX1-NEXT:    vgf2p8affineqb $0, %xmm5, %xmm1, %xmm5
1573 ; GFNIAVX1-NEXT:    vpor %xmm4, %xmm5, %xmm4
1574 ; GFNIAVX1-NEXT:    vpsubb %xmm3, %xmm6, %xmm3
1575 ; GFNIAVX1-NEXT:    vpsllw $5, %xmm3, %xmm3
1576 ; GFNIAVX1-NEXT:    vpblendvb %xmm3, %xmm4, %xmm1, %xmm1
1577 ; GFNIAVX1-NEXT:    vgf2p8affineqb $0, %xmm7, %xmm1, %xmm4
1578 ; GFNIAVX1-NEXT:    vgf2p8affineqb $0, %xmm8, %xmm1, %xmm5
1579 ; GFNIAVX1-NEXT:    vpor %xmm4, %xmm5, %xmm4
1580 ; GFNIAVX1-NEXT:    vpaddb %xmm3, %xmm3, %xmm3
1581 ; GFNIAVX1-NEXT:    vpblendvb %xmm3, %xmm4, %xmm1, %xmm1
1582 ; GFNIAVX1-NEXT:    vgf2p8affineqb $0, %xmm9, %xmm1, %xmm4
1583 ; GFNIAVX1-NEXT:    vpaddb %xmm1, %xmm1, %xmm5
1584 ; GFNIAVX1-NEXT:    vpor %xmm4, %xmm5, %xmm4
1585 ; GFNIAVX1-NEXT:    vpaddb %xmm3, %xmm3, %xmm3
1586 ; GFNIAVX1-NEXT:    vpblendvb %xmm3, %xmm4, %xmm1, %xmm1
1587 ; GFNIAVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm1, %ymm1
1588 ; GFNIAVX1-NEXT:    retq
1590 ; GFNIAVX2-LABEL: var_rotr_v64i8:
1591 ; GFNIAVX2:       # %bb.0:
1592 ; GFNIAVX2-NEXT:    vpbroadcastq {{.*#+}} ymm4 = [0,0,0,0,128,64,32,16,0,0,0,0,128,64,32,16,0,0,0,0,128,64,32,16,0,0,0,0,128,64,32,16]
1593 ; GFNIAVX2-NEXT:    vgf2p8affineqb $0, %ymm4, %ymm0, %ymm5
1594 ; GFNIAVX2-NEXT:    vpbroadcastq {{.*#+}} ymm6 = [8,4,2,1,0,0,0,0,8,4,2,1,0,0,0,0,8,4,2,1,0,0,0,0,8,4,2,1,0,0,0,0]
1595 ; GFNIAVX2-NEXT:    vgf2p8affineqb $0, %ymm6, %ymm0, %ymm7
1596 ; GFNIAVX2-NEXT:    vpor %ymm5, %ymm7, %ymm5
1597 ; GFNIAVX2-NEXT:    vpxor %xmm7, %xmm7, %xmm7
1598 ; GFNIAVX2-NEXT:    vpsubb %ymm2, %ymm7, %ymm2
1599 ; GFNIAVX2-NEXT:    vpsllw $5, %ymm2, %ymm2
1600 ; GFNIAVX2-NEXT:    vpblendvb %ymm2, %ymm5, %ymm0, %ymm0
1601 ; GFNIAVX2-NEXT:    vpbroadcastq {{.*#+}} ymm5 = [0,0,0,0,0,0,128,64,0,0,0,0,0,0,128,64,0,0,0,0,0,0,128,64,0,0,0,0,0,0,128,64]
1602 ; GFNIAVX2-NEXT:    vgf2p8affineqb $0, %ymm5, %ymm0, %ymm8
1603 ; GFNIAVX2-NEXT:    vpbroadcastq {{.*#+}} ymm9 = [32,16,8,4,2,1,0,0,32,16,8,4,2,1,0,0,32,16,8,4,2,1,0,0,32,16,8,4,2,1,0,0]
1604 ; GFNIAVX2-NEXT:    vgf2p8affineqb $0, %ymm9, %ymm0, %ymm10
1605 ; GFNIAVX2-NEXT:    vpor %ymm8, %ymm10, %ymm8
1606 ; GFNIAVX2-NEXT:    vpaddb %ymm2, %ymm2, %ymm2
1607 ; GFNIAVX2-NEXT:    vpblendvb %ymm2, %ymm8, %ymm0, %ymm0
1608 ; GFNIAVX2-NEXT:    vpbroadcastq {{.*#+}} ymm8 = [0,0,0,0,0,0,0,128,0,0,0,0,0,0,0,128,0,0,0,0,0,0,0,128,0,0,0,0,0,0,0,128]
1609 ; GFNIAVX2-NEXT:    vgf2p8affineqb $0, %ymm8, %ymm0, %ymm10
1610 ; GFNIAVX2-NEXT:    vpaddb %ymm0, %ymm0, %ymm11
1611 ; GFNIAVX2-NEXT:    vpor %ymm10, %ymm11, %ymm10
1612 ; GFNIAVX2-NEXT:    vpaddb %ymm2, %ymm2, %ymm2
1613 ; GFNIAVX2-NEXT:    vpblendvb %ymm2, %ymm10, %ymm0, %ymm0
1614 ; GFNIAVX2-NEXT:    vgf2p8affineqb $0, %ymm4, %ymm1, %ymm2
1615 ; GFNIAVX2-NEXT:    vgf2p8affineqb $0, %ymm6, %ymm1, %ymm4
1616 ; GFNIAVX2-NEXT:    vpor %ymm2, %ymm4, %ymm2
1617 ; GFNIAVX2-NEXT:    vpsubb %ymm3, %ymm7, %ymm3
1618 ; GFNIAVX2-NEXT:    vpsllw $5, %ymm3, %ymm3
1619 ; GFNIAVX2-NEXT:    vpblendvb %ymm3, %ymm2, %ymm1, %ymm1
1620 ; GFNIAVX2-NEXT:    vgf2p8affineqb $0, %ymm5, %ymm1, %ymm2
1621 ; GFNIAVX2-NEXT:    vgf2p8affineqb $0, %ymm9, %ymm1, %ymm4
1622 ; GFNIAVX2-NEXT:    vpor %ymm2, %ymm4, %ymm2
1623 ; GFNIAVX2-NEXT:    vpaddb %ymm3, %ymm3, %ymm3
1624 ; GFNIAVX2-NEXT:    vpblendvb %ymm3, %ymm2, %ymm1, %ymm1
1625 ; GFNIAVX2-NEXT:    vgf2p8affineqb $0, %ymm8, %ymm1, %ymm2
1626 ; GFNIAVX2-NEXT:    vpaddb %ymm1, %ymm1, %ymm4
1627 ; GFNIAVX2-NEXT:    vpor %ymm2, %ymm4, %ymm2
1628 ; GFNIAVX2-NEXT:    vpaddb %ymm3, %ymm3, %ymm3
1629 ; GFNIAVX2-NEXT:    vpblendvb %ymm3, %ymm2, %ymm1, %ymm1
1630 ; GFNIAVX2-NEXT:    retq
1632 ; GFNIAVX512VL-LABEL: var_rotr_v64i8:
1633 ; GFNIAVX512VL:       # %bb.0:
1634 ; GFNIAVX512VL-NEXT:    vextracti64x4 $1, %zmm0, %ymm2
1635 ; GFNIAVX512VL-NEXT:    vpbroadcastq {{.*#+}} ymm3 = [8,4,2,1,0,0,0,0,8,4,2,1,0,0,0,0,8,4,2,1,0,0,0,0,8,4,2,1,0,0,0,0]
1636 ; GFNIAVX512VL-NEXT:    vgf2p8affineqb $0, %ymm3, %ymm2, %ymm4
1637 ; GFNIAVX512VL-NEXT:    vpbroadcastq {{.*#+}} ymm5 = [0,0,0,0,128,64,32,16,0,0,0,0,128,64,32,16,0,0,0,0,128,64,32,16,0,0,0,0,128,64,32,16]
1638 ; GFNIAVX512VL-NEXT:    vgf2p8affineqb $0, %ymm5, %ymm2, %ymm6
1639 ; GFNIAVX512VL-NEXT:    vpor %ymm4, %ymm6, %ymm4
1640 ; GFNIAVX512VL-NEXT:    vextracti64x4 $1, %zmm1, %ymm6
1641 ; GFNIAVX512VL-NEXT:    vpsllw $5, %ymm6, %ymm6
1642 ; GFNIAVX512VL-NEXT:    vpblendvb %ymm6, %ymm4, %ymm2, %ymm2
1643 ; GFNIAVX512VL-NEXT:    vpbroadcastq {{.*#+}} ymm4 = [2,1,0,0,0,0,0,0,2,1,0,0,0,0,0,0,2,1,0,0,0,0,0,0,2,1,0,0,0,0,0,0]
1644 ; GFNIAVX512VL-NEXT:    vgf2p8affineqb $0, %ymm4, %ymm2, %ymm7
1645 ; GFNIAVX512VL-NEXT:    vpbroadcastq {{.*#+}} ymm8 = [0,0,128,64,32,16,8,4,0,0,128,64,32,16,8,4,0,0,128,64,32,16,8,4,0,0,128,64,32,16,8,4]
1646 ; GFNIAVX512VL-NEXT:    vgf2p8affineqb $0, %ymm8, %ymm2, %ymm9
1647 ; GFNIAVX512VL-NEXT:    vpor %ymm7, %ymm9, %ymm7
1648 ; GFNIAVX512VL-NEXT:    vpaddb %ymm6, %ymm6, %ymm6
1649 ; GFNIAVX512VL-NEXT:    vpblendvb %ymm6, %ymm7, %ymm2, %ymm2
1650 ; GFNIAVX512VL-NEXT:    vpbroadcastq {{.*#+}} ymm7 = [1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0]
1651 ; GFNIAVX512VL-NEXT:    vgf2p8affineqb $0, %ymm7, %ymm2, %ymm9
1652 ; GFNIAVX512VL-NEXT:    vpbroadcastq {{.*#+}} ymm10 = [0,128,64,32,16,8,4,2,0,128,64,32,16,8,4,2,0,128,64,32,16,8,4,2,0,128,64,32,16,8,4,2]
1653 ; GFNIAVX512VL-NEXT:    vgf2p8affineqb $0, %ymm10, %ymm2, %ymm11
1654 ; GFNIAVX512VL-NEXT:    vpor %ymm9, %ymm11, %ymm9
1655 ; GFNIAVX512VL-NEXT:    vpaddb %ymm6, %ymm6, %ymm6
1656 ; GFNIAVX512VL-NEXT:    vpblendvb %ymm6, %ymm9, %ymm2, %ymm2
1657 ; GFNIAVX512VL-NEXT:    vgf2p8affineqb $0, %ymm3, %ymm0, %ymm3
1658 ; GFNIAVX512VL-NEXT:    vgf2p8affineqb $0, %ymm5, %ymm0, %ymm5
1659 ; GFNIAVX512VL-NEXT:    vpor %ymm3, %ymm5, %ymm3
1660 ; GFNIAVX512VL-NEXT:    vpsllw $5, %ymm1, %ymm1
1661 ; GFNIAVX512VL-NEXT:    vpblendvb %ymm1, %ymm3, %ymm0, %ymm0
1662 ; GFNIAVX512VL-NEXT:    vgf2p8affineqb $0, %ymm4, %ymm0, %ymm3
1663 ; GFNIAVX512VL-NEXT:    vgf2p8affineqb $0, %ymm8, %ymm0, %ymm4
1664 ; GFNIAVX512VL-NEXT:    vpor %ymm3, %ymm4, %ymm3
1665 ; GFNIAVX512VL-NEXT:    vpaddb %ymm1, %ymm1, %ymm1
1666 ; GFNIAVX512VL-NEXT:    vpblendvb %ymm1, %ymm3, %ymm0, %ymm0
1667 ; GFNIAVX512VL-NEXT:    vgf2p8affineqb $0, %ymm7, %ymm0, %ymm3
1668 ; GFNIAVX512VL-NEXT:    vgf2p8affineqb $0, %ymm10, %ymm0, %ymm4
1669 ; GFNIAVX512VL-NEXT:    vpor %ymm3, %ymm4, %ymm3
1670 ; GFNIAVX512VL-NEXT:    vpaddb %ymm1, %ymm1, %ymm1
1671 ; GFNIAVX512VL-NEXT:    vpblendvb %ymm1, %ymm3, %ymm0, %ymm0
1672 ; GFNIAVX512VL-NEXT:    vinserti64x4 $1, %ymm2, %zmm0, %zmm0
1673 ; GFNIAVX512VL-NEXT:    retq
1675 ; GFNIAVX512BW-LABEL: var_rotr_v64i8:
1676 ; GFNIAVX512BW:       # %bb.0:
1677 ; GFNIAVX512BW-NEXT:    vpandd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to16}, %zmm1, %zmm1
1678 ; GFNIAVX512BW-NEXT:    vpxor %xmm2, %xmm2, %xmm2
1679 ; GFNIAVX512BW-NEXT:    vpunpckhbw {{.*#+}} zmm3 = zmm1[8],zmm2[8],zmm1[9],zmm2[9],zmm1[10],zmm2[10],zmm1[11],zmm2[11],zmm1[12],zmm2[12],zmm1[13],zmm2[13],zmm1[14],zmm2[14],zmm1[15],zmm2[15],zmm1[24],zmm2[24],zmm1[25],zmm2[25],zmm1[26],zmm2[26],zmm1[27],zmm2[27],zmm1[28],zmm2[28],zmm1[29],zmm2[29],zmm1[30],zmm2[30],zmm1[31],zmm2[31],zmm1[40],zmm2[40],zmm1[41],zmm2[41],zmm1[42],zmm2[42],zmm1[43],zmm2[43],zmm1[44],zmm2[44],zmm1[45],zmm2[45],zmm1[46],zmm2[46],zmm1[47],zmm2[47],zmm1[56],zmm2[56],zmm1[57],zmm2[57],zmm1[58],zmm2[58],zmm1[59],zmm2[59],zmm1[60],zmm2[60],zmm1[61],zmm2[61],zmm1[62],zmm2[62],zmm1[63],zmm2[63]
1680 ; GFNIAVX512BW-NEXT:    vpunpckhbw {{.*#+}} zmm4 = zmm0[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,40,40,41,41,42,42,43,43,44,44,45,45,46,46,47,47,56,56,57,57,58,58,59,59,60,60,61,61,62,62,63,63]
1681 ; GFNIAVX512BW-NEXT:    vpsrlvw %zmm3, %zmm4, %zmm3
1682 ; GFNIAVX512BW-NEXT:    vpbroadcastw {{.*#+}} zmm4 = [255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255]
1683 ; GFNIAVX512BW-NEXT:    vpandq %zmm4, %zmm3, %zmm3
1684 ; GFNIAVX512BW-NEXT:    vpunpcklbw {{.*#+}} zmm1 = zmm1[0],zmm2[0],zmm1[1],zmm2[1],zmm1[2],zmm2[2],zmm1[3],zmm2[3],zmm1[4],zmm2[4],zmm1[5],zmm2[5],zmm1[6],zmm2[6],zmm1[7],zmm2[7],zmm1[16],zmm2[16],zmm1[17],zmm2[17],zmm1[18],zmm2[18],zmm1[19],zmm2[19],zmm1[20],zmm2[20],zmm1[21],zmm2[21],zmm1[22],zmm2[22],zmm1[23],zmm2[23],zmm1[32],zmm2[32],zmm1[33],zmm2[33],zmm1[34],zmm2[34],zmm1[35],zmm2[35],zmm1[36],zmm2[36],zmm1[37],zmm2[37],zmm1[38],zmm2[38],zmm1[39],zmm2[39],zmm1[48],zmm2[48],zmm1[49],zmm2[49],zmm1[50],zmm2[50],zmm1[51],zmm2[51],zmm1[52],zmm2[52],zmm1[53],zmm2[53],zmm1[54],zmm2[54],zmm1[55],zmm2[55]
1685 ; GFNIAVX512BW-NEXT:    vpunpcklbw {{.*#+}} zmm0 = zmm0[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,32,32,33,33,34,34,35,35,36,36,37,37,38,38,39,39,48,48,49,49,50,50,51,51,52,52,53,53,54,54,55,55]
1686 ; GFNIAVX512BW-NEXT:    vpsrlvw %zmm1, %zmm0, %zmm0
1687 ; GFNIAVX512BW-NEXT:    vpandq %zmm4, %zmm0, %zmm0
1688 ; GFNIAVX512BW-NEXT:    vpackuswb %zmm3, %zmm0, %zmm0
1689 ; GFNIAVX512BW-NEXT:    retq
1690   %res = call <64 x i8> @llvm.fshr.v64i8(<64 x i8> %a, <64 x i8> %a, <64 x i8> %amt)
1691   ret <64 x i8> %res
1694 define <64 x i8> @splatvar_rotl_v64i8(<64 x i8> %a, <64 x i8> %amt) nounwind {
1695 ; GFNISSE-LABEL: splatvar_rotl_v64i8:
1696 ; GFNISSE:       # %bb.0:
1697 ; GFNISSE-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm4
1698 ; GFNISSE-NEXT:    movdqa %xmm0, %xmm5
1699 ; GFNISSE-NEXT:    punpckhbw {{.*#+}} xmm5 = xmm5[8],xmm0[8],xmm5[9],xmm0[9],xmm5[10],xmm0[10],xmm5[11],xmm0[11],xmm5[12],xmm0[12],xmm5[13],xmm0[13],xmm5[14],xmm0[14],xmm5[15],xmm0[15]
1700 ; GFNISSE-NEXT:    psllw %xmm4, %xmm5
1701 ; GFNISSE-NEXT:    psrlw $8, %xmm5
1702 ; GFNISSE-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
1703 ; GFNISSE-NEXT:    psllw %xmm4, %xmm0
1704 ; GFNISSE-NEXT:    psrlw $8, %xmm0
1705 ; GFNISSE-NEXT:    packuswb %xmm5, %xmm0
1706 ; GFNISSE-NEXT:    movdqa %xmm1, %xmm5
1707 ; GFNISSE-NEXT:    punpckhbw {{.*#+}} xmm5 = xmm5[8],xmm1[8],xmm5[9],xmm1[9],xmm5[10],xmm1[10],xmm5[11],xmm1[11],xmm5[12],xmm1[12],xmm5[13],xmm1[13],xmm5[14],xmm1[14],xmm5[15],xmm1[15]
1708 ; GFNISSE-NEXT:    psllw %xmm4, %xmm5
1709 ; GFNISSE-NEXT:    psrlw $8, %xmm5
1710 ; GFNISSE-NEXT:    punpcklbw {{.*#+}} xmm1 = xmm1[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
1711 ; GFNISSE-NEXT:    psllw %xmm4, %xmm1
1712 ; GFNISSE-NEXT:    psrlw $8, %xmm1
1713 ; GFNISSE-NEXT:    packuswb %xmm5, %xmm1
1714 ; GFNISSE-NEXT:    movdqa %xmm2, %xmm5
1715 ; GFNISSE-NEXT:    punpckhbw {{.*#+}} xmm5 = xmm5[8],xmm2[8],xmm5[9],xmm2[9],xmm5[10],xmm2[10],xmm5[11],xmm2[11],xmm5[12],xmm2[12],xmm5[13],xmm2[13],xmm5[14],xmm2[14],xmm5[15],xmm2[15]
1716 ; GFNISSE-NEXT:    psllw %xmm4, %xmm5
1717 ; GFNISSE-NEXT:    psrlw $8, %xmm5
1718 ; GFNISSE-NEXT:    punpcklbw {{.*#+}} xmm2 = xmm2[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
1719 ; GFNISSE-NEXT:    psllw %xmm4, %xmm2
1720 ; GFNISSE-NEXT:    psrlw $8, %xmm2
1721 ; GFNISSE-NEXT:    packuswb %xmm5, %xmm2
1722 ; GFNISSE-NEXT:    movdqa %xmm3, %xmm5
1723 ; GFNISSE-NEXT:    punpckhbw {{.*#+}} xmm5 = xmm5[8],xmm3[8],xmm5[9],xmm3[9],xmm5[10],xmm3[10],xmm5[11],xmm3[11],xmm5[12],xmm3[12],xmm5[13],xmm3[13],xmm5[14],xmm3[14],xmm5[15],xmm3[15]
1724 ; GFNISSE-NEXT:    psllw %xmm4, %xmm5
1725 ; GFNISSE-NEXT:    psrlw $8, %xmm5
1726 ; GFNISSE-NEXT:    punpcklbw {{.*#+}} xmm3 = xmm3[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
1727 ; GFNISSE-NEXT:    psllw %xmm4, %xmm3
1728 ; GFNISSE-NEXT:    psrlw $8, %xmm3
1729 ; GFNISSE-NEXT:    packuswb %xmm5, %xmm3
1730 ; GFNISSE-NEXT:    retq
1732 ; GFNIAVX1-LABEL: splatvar_rotl_v64i8:
1733 ; GFNIAVX1:       # %bb.0:
1734 ; GFNIAVX1-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2, %xmm2
1735 ; GFNIAVX1-NEXT:    vextractf128 $1, %ymm0, %xmm3
1736 ; GFNIAVX1-NEXT:    vpunpckhbw {{.*#+}} xmm4 = xmm3[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]
1737 ; GFNIAVX1-NEXT:    vpsllw %xmm2, %xmm4, %xmm4
1738 ; GFNIAVX1-NEXT:    vpsrlw $8, %xmm4, %xmm4
1739 ; GFNIAVX1-NEXT:    vpunpcklbw {{.*#+}} xmm3 = xmm3[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
1740 ; GFNIAVX1-NEXT:    vpsllw %xmm2, %xmm3, %xmm3
1741 ; GFNIAVX1-NEXT:    vpsrlw $8, %xmm3, %xmm3
1742 ; GFNIAVX1-NEXT:    vpackuswb %xmm4, %xmm3, %xmm3
1743 ; GFNIAVX1-NEXT:    vpunpckhbw {{.*#+}} xmm4 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]
1744 ; GFNIAVX1-NEXT:    vpsllw %xmm2, %xmm4, %xmm4
1745 ; GFNIAVX1-NEXT:    vpsrlw $8, %xmm4, %xmm4
1746 ; GFNIAVX1-NEXT:    vpunpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
1747 ; GFNIAVX1-NEXT:    vpsllw %xmm2, %xmm0, %xmm0
1748 ; GFNIAVX1-NEXT:    vpsrlw $8, %xmm0, %xmm0
1749 ; GFNIAVX1-NEXT:    vpackuswb %xmm4, %xmm0, %xmm0
1750 ; GFNIAVX1-NEXT:    vinsertf128 $1, %xmm3, %ymm0, %ymm0
1751 ; GFNIAVX1-NEXT:    vextractf128 $1, %ymm1, %xmm3
1752 ; GFNIAVX1-NEXT:    vpunpckhbw {{.*#+}} xmm4 = xmm3[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]
1753 ; GFNIAVX1-NEXT:    vpsllw %xmm2, %xmm4, %xmm4
1754 ; GFNIAVX1-NEXT:    vpsrlw $8, %xmm4, %xmm4
1755 ; GFNIAVX1-NEXT:    vpunpcklbw {{.*#+}} xmm3 = xmm3[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
1756 ; GFNIAVX1-NEXT:    vpsllw %xmm2, %xmm3, %xmm3
1757 ; GFNIAVX1-NEXT:    vpsrlw $8, %xmm3, %xmm3
1758 ; GFNIAVX1-NEXT:    vpackuswb %xmm4, %xmm3, %xmm3
1759 ; GFNIAVX1-NEXT:    vpunpckhbw {{.*#+}} xmm4 = xmm1[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]
1760 ; GFNIAVX1-NEXT:    vpsllw %xmm2, %xmm4, %xmm4
1761 ; GFNIAVX1-NEXT:    vpsrlw $8, %xmm4, %xmm4
1762 ; GFNIAVX1-NEXT:    vpunpcklbw {{.*#+}} xmm1 = xmm1[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
1763 ; GFNIAVX1-NEXT:    vpsllw %xmm2, %xmm1, %xmm1
1764 ; GFNIAVX1-NEXT:    vpsrlw $8, %xmm1, %xmm1
1765 ; GFNIAVX1-NEXT:    vpackuswb %xmm4, %xmm1, %xmm1
1766 ; GFNIAVX1-NEXT:    vinsertf128 $1, %xmm3, %ymm1, %ymm1
1767 ; GFNIAVX1-NEXT:    retq
1769 ; GFNIAVX2-LABEL: splatvar_rotl_v64i8:
1770 ; GFNIAVX2:       # %bb.0:
1771 ; GFNIAVX2-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]
1772 ; GFNIAVX2-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2, %xmm2
1773 ; GFNIAVX2-NEXT:    vpsllw %xmm2, %ymm3, %ymm3
1774 ; GFNIAVX2-NEXT:    vpsrlw $8, %ymm3, %ymm3
1775 ; GFNIAVX2-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]
1776 ; GFNIAVX2-NEXT:    vpsllw %xmm2, %ymm0, %ymm0
1777 ; GFNIAVX2-NEXT:    vpsrlw $8, %ymm0, %ymm0
1778 ; GFNIAVX2-NEXT:    vpackuswb %ymm3, %ymm0, %ymm0
1779 ; GFNIAVX2-NEXT:    vpunpckhbw {{.*#+}} ymm3 = ymm1[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]
1780 ; GFNIAVX2-NEXT:    vpsllw %xmm2, %ymm3, %ymm3
1781 ; GFNIAVX2-NEXT:    vpsrlw $8, %ymm3, %ymm3
1782 ; GFNIAVX2-NEXT:    vpunpcklbw {{.*#+}} ymm1 = ymm1[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]
1783 ; GFNIAVX2-NEXT:    vpsllw %xmm2, %ymm1, %ymm1
1784 ; GFNIAVX2-NEXT:    vpsrlw $8, %ymm1, %ymm1
1785 ; GFNIAVX2-NEXT:    vpackuswb %ymm3, %ymm1, %ymm1
1786 ; GFNIAVX2-NEXT:    retq
1788 ; GFNIAVX512VL-LABEL: splatvar_rotl_v64i8:
1789 ; GFNIAVX512VL:       # %bb.0:
1790 ; GFNIAVX512VL-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1
1791 ; GFNIAVX512VL-NEXT:    vextracti64x4 $1, %zmm0, %ymm2
1792 ; GFNIAVX512VL-NEXT:    vpunpckhbw {{.*#+}} ymm3 = ymm2[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]
1793 ; GFNIAVX512VL-NEXT:    vpsllw %xmm1, %ymm3, %ymm3
1794 ; GFNIAVX512VL-NEXT:    vpsrlw $8, %ymm3, %ymm3
1795 ; GFNIAVX512VL-NEXT:    vpunpcklbw {{.*#+}} ymm2 = ymm2[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]
1796 ; GFNIAVX512VL-NEXT:    vpsllw %xmm1, %ymm2, %ymm2
1797 ; GFNIAVX512VL-NEXT:    vpsrlw $8, %ymm2, %ymm2
1798 ; GFNIAVX512VL-NEXT:    vpackuswb %ymm3, %ymm2, %ymm2
1799 ; GFNIAVX512VL-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]
1800 ; GFNIAVX512VL-NEXT:    vpsllw %xmm1, %ymm3, %ymm3
1801 ; GFNIAVX512VL-NEXT:    vpsrlw $8, %ymm3, %ymm3
1802 ; GFNIAVX512VL-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]
1803 ; GFNIAVX512VL-NEXT:    vpsllw %xmm1, %ymm0, %ymm0
1804 ; GFNIAVX512VL-NEXT:    vpsrlw $8, %ymm0, %ymm0
1805 ; GFNIAVX512VL-NEXT:    vpackuswb %ymm3, %ymm0, %ymm0
1806 ; GFNIAVX512VL-NEXT:    vinserti64x4 $1, %ymm2, %zmm0, %zmm0
1807 ; GFNIAVX512VL-NEXT:    retq
1809 ; GFNIAVX512BW-LABEL: splatvar_rotl_v64i8:
1810 ; GFNIAVX512BW:       # %bb.0:
1811 ; GFNIAVX512BW-NEXT:    vpunpckhbw {{.*#+}} zmm2 = zmm0[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,40,40,41,41,42,42,43,43,44,44,45,45,46,46,47,47,56,56,57,57,58,58,59,59,60,60,61,61,62,62,63,63]
1812 ; GFNIAVX512BW-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1
1813 ; GFNIAVX512BW-NEXT:    vpsllw %xmm1, %zmm2, %zmm2
1814 ; GFNIAVX512BW-NEXT:    vpsrlw $8, %zmm2, %zmm2
1815 ; GFNIAVX512BW-NEXT:    vpunpcklbw {{.*#+}} zmm0 = zmm0[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,32,32,33,33,34,34,35,35,36,36,37,37,38,38,39,39,48,48,49,49,50,50,51,51,52,52,53,53,54,54,55,55]
1816 ; GFNIAVX512BW-NEXT:    vpsllw %xmm1, %zmm0, %zmm0
1817 ; GFNIAVX512BW-NEXT:    vpsrlw $8, %zmm0, %zmm0
1818 ; GFNIAVX512BW-NEXT:    vpackuswb %zmm2, %zmm0, %zmm0
1819 ; GFNIAVX512BW-NEXT:    retq
1820   %splat = shufflevector <64 x i8> %amt, <64 x i8> undef, <64 x i32> zeroinitializer
1821   %res = call <64 x i8> @llvm.fshl.v64i8(<64 x i8> %a, <64 x i8> %a, <64 x i8> %splat)
1822   ret <64 x i8> %res
1825 define <64 x i8> @splatvar_rotr_v64i8(<64 x i8> %a, <64 x i8> %amt) nounwind {
1826 ; GFNISSE-LABEL: splatvar_rotr_v64i8:
1827 ; GFNISSE:       # %bb.0:
1828 ; GFNISSE-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm4
1829 ; GFNISSE-NEXT:    movdqa %xmm0, %xmm6
1830 ; GFNISSE-NEXT:    punpckhbw {{.*#+}} xmm6 = xmm6[8],xmm0[8],xmm6[9],xmm0[9],xmm6[10],xmm0[10],xmm6[11],xmm0[11],xmm6[12],xmm0[12],xmm6[13],xmm0[13],xmm6[14],xmm0[14],xmm6[15],xmm0[15]
1831 ; GFNISSE-NEXT:    psrlw %xmm4, %xmm6
1832 ; GFNISSE-NEXT:    pmovzxbw {{.*#+}} xmm5 = [255,255,255,255,255,255,255,255]
1833 ; GFNISSE-NEXT:    pand %xmm5, %xmm6
1834 ; GFNISSE-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
1835 ; GFNISSE-NEXT:    psrlw %xmm4, %xmm0
1836 ; GFNISSE-NEXT:    pand %xmm5, %xmm0
1837 ; GFNISSE-NEXT:    packuswb %xmm6, %xmm0
1838 ; GFNISSE-NEXT:    movdqa %xmm1, %xmm6
1839 ; GFNISSE-NEXT:    punpckhbw {{.*#+}} xmm6 = xmm6[8],xmm1[8],xmm6[9],xmm1[9],xmm6[10],xmm1[10],xmm6[11],xmm1[11],xmm6[12],xmm1[12],xmm6[13],xmm1[13],xmm6[14],xmm1[14],xmm6[15],xmm1[15]
1840 ; GFNISSE-NEXT:    psrlw %xmm4, %xmm6
1841 ; GFNISSE-NEXT:    pand %xmm5, %xmm6
1842 ; GFNISSE-NEXT:    punpcklbw {{.*#+}} xmm1 = xmm1[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
1843 ; GFNISSE-NEXT:    psrlw %xmm4, %xmm1
1844 ; GFNISSE-NEXT:    pand %xmm5, %xmm1
1845 ; GFNISSE-NEXT:    packuswb %xmm6, %xmm1
1846 ; GFNISSE-NEXT:    movdqa %xmm2, %xmm6
1847 ; GFNISSE-NEXT:    punpckhbw {{.*#+}} xmm6 = xmm6[8],xmm2[8],xmm6[9],xmm2[9],xmm6[10],xmm2[10],xmm6[11],xmm2[11],xmm6[12],xmm2[12],xmm6[13],xmm2[13],xmm6[14],xmm2[14],xmm6[15],xmm2[15]
1848 ; GFNISSE-NEXT:    psrlw %xmm4, %xmm6
1849 ; GFNISSE-NEXT:    pand %xmm5, %xmm6
1850 ; GFNISSE-NEXT:    punpcklbw {{.*#+}} xmm2 = xmm2[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
1851 ; GFNISSE-NEXT:    psrlw %xmm4, %xmm2
1852 ; GFNISSE-NEXT:    pand %xmm5, %xmm2
1853 ; GFNISSE-NEXT:    packuswb %xmm6, %xmm2
1854 ; GFNISSE-NEXT:    movdqa %xmm3, %xmm6
1855 ; GFNISSE-NEXT:    punpckhbw {{.*#+}} xmm6 = xmm6[8],xmm3[8],xmm6[9],xmm3[9],xmm6[10],xmm3[10],xmm6[11],xmm3[11],xmm6[12],xmm3[12],xmm6[13],xmm3[13],xmm6[14],xmm3[14],xmm6[15],xmm3[15]
1856 ; GFNISSE-NEXT:    psrlw %xmm4, %xmm6
1857 ; GFNISSE-NEXT:    pand %xmm5, %xmm6
1858 ; GFNISSE-NEXT:    punpcklbw {{.*#+}} xmm3 = xmm3[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
1859 ; GFNISSE-NEXT:    psrlw %xmm4, %xmm3
1860 ; GFNISSE-NEXT:    pand %xmm5, %xmm3
1861 ; GFNISSE-NEXT:    packuswb %xmm6, %xmm3
1862 ; GFNISSE-NEXT:    retq
1864 ; GFNIAVX1-LABEL: splatvar_rotr_v64i8:
1865 ; GFNIAVX1:       # %bb.0:
1866 ; GFNIAVX1-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2, %xmm2
1867 ; GFNIAVX1-NEXT:    vextractf128 $1, %ymm0, %xmm3
1868 ; GFNIAVX1-NEXT:    vpunpckhbw {{.*#+}} xmm4 = xmm3[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]
1869 ; GFNIAVX1-NEXT:    vpsrlw %xmm2, %xmm4, %xmm4
1870 ; GFNIAVX1-NEXT:    vbroadcastss {{.*#+}} xmm5 = [255,255,255,255,255,255,255,255]
1871 ; GFNIAVX1-NEXT:    vpand %xmm5, %xmm4, %xmm4
1872 ; GFNIAVX1-NEXT:    vpunpcklbw {{.*#+}} xmm3 = xmm3[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
1873 ; GFNIAVX1-NEXT:    vpsrlw %xmm2, %xmm3, %xmm3
1874 ; GFNIAVX1-NEXT:    vpand %xmm5, %xmm3, %xmm3
1875 ; GFNIAVX1-NEXT:    vpackuswb %xmm4, %xmm3, %xmm3
1876 ; GFNIAVX1-NEXT:    vpunpckhbw {{.*#+}} xmm4 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]
1877 ; GFNIAVX1-NEXT:    vpsrlw %xmm2, %xmm4, %xmm4
1878 ; GFNIAVX1-NEXT:    vpand %xmm5, %xmm4, %xmm4
1879 ; GFNIAVX1-NEXT:    vpunpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
1880 ; GFNIAVX1-NEXT:    vpsrlw %xmm2, %xmm0, %xmm0
1881 ; GFNIAVX1-NEXT:    vpand %xmm5, %xmm0, %xmm0
1882 ; GFNIAVX1-NEXT:    vpackuswb %xmm4, %xmm0, %xmm0
1883 ; GFNIAVX1-NEXT:    vinsertf128 $1, %xmm3, %ymm0, %ymm0
1884 ; GFNIAVX1-NEXT:    vextractf128 $1, %ymm1, %xmm3
1885 ; GFNIAVX1-NEXT:    vpunpckhbw {{.*#+}} xmm4 = xmm3[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]
1886 ; GFNIAVX1-NEXT:    vpsrlw %xmm2, %xmm4, %xmm4
1887 ; GFNIAVX1-NEXT:    vpand %xmm5, %xmm4, %xmm4
1888 ; GFNIAVX1-NEXT:    vpunpcklbw {{.*#+}} xmm3 = xmm3[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
1889 ; GFNIAVX1-NEXT:    vpsrlw %xmm2, %xmm3, %xmm3
1890 ; GFNIAVX1-NEXT:    vpand %xmm5, %xmm3, %xmm3
1891 ; GFNIAVX1-NEXT:    vpackuswb %xmm4, %xmm3, %xmm3
1892 ; GFNIAVX1-NEXT:    vpunpckhbw {{.*#+}} xmm4 = xmm1[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]
1893 ; GFNIAVX1-NEXT:    vpsrlw %xmm2, %xmm4, %xmm4
1894 ; GFNIAVX1-NEXT:    vpand %xmm5, %xmm4, %xmm4
1895 ; GFNIAVX1-NEXT:    vpunpcklbw {{.*#+}} xmm1 = xmm1[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
1896 ; GFNIAVX1-NEXT:    vpsrlw %xmm2, %xmm1, %xmm1
1897 ; GFNIAVX1-NEXT:    vpand %xmm5, %xmm1, %xmm1
1898 ; GFNIAVX1-NEXT:    vpackuswb %xmm4, %xmm1, %xmm1
1899 ; GFNIAVX1-NEXT:    vinsertf128 $1, %xmm3, %ymm1, %ymm1
1900 ; GFNIAVX1-NEXT:    retq
1902 ; GFNIAVX2-LABEL: splatvar_rotr_v64i8:
1903 ; GFNIAVX2:       # %bb.0:
1904 ; GFNIAVX2-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]
1905 ; GFNIAVX2-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2, %xmm2
1906 ; GFNIAVX2-NEXT:    vpsrlw %xmm2, %ymm3, %ymm3
1907 ; GFNIAVX2-NEXT:    vpbroadcastw {{.*#+}} ymm4 = [255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255]
1908 ; GFNIAVX2-NEXT:    vpand %ymm4, %ymm3, %ymm3
1909 ; GFNIAVX2-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]
1910 ; GFNIAVX2-NEXT:    vpsrlw %xmm2, %ymm0, %ymm0
1911 ; GFNIAVX2-NEXT:    vpand %ymm4, %ymm0, %ymm0
1912 ; GFNIAVX2-NEXT:    vpackuswb %ymm3, %ymm0, %ymm0
1913 ; GFNIAVX2-NEXT:    vpunpckhbw {{.*#+}} ymm3 = ymm1[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]
1914 ; GFNIAVX2-NEXT:    vpsrlw %xmm2, %ymm3, %ymm3
1915 ; GFNIAVX2-NEXT:    vpand %ymm4, %ymm3, %ymm3
1916 ; GFNIAVX2-NEXT:    vpunpcklbw {{.*#+}} ymm1 = ymm1[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]
1917 ; GFNIAVX2-NEXT:    vpsrlw %xmm2, %ymm1, %ymm1
1918 ; GFNIAVX2-NEXT:    vpand %ymm4, %ymm1, %ymm1
1919 ; GFNIAVX2-NEXT:    vpackuswb %ymm3, %ymm1, %ymm1
1920 ; GFNIAVX2-NEXT:    retq
1922 ; GFNIAVX512VL-LABEL: splatvar_rotr_v64i8:
1923 ; GFNIAVX512VL:       # %bb.0:
1924 ; GFNIAVX512VL-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1
1925 ; GFNIAVX512VL-NEXT:    vextracti64x4 $1, %zmm0, %ymm2
1926 ; GFNIAVX512VL-NEXT:    vpunpckhbw {{.*#+}} ymm3 = ymm2[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]
1927 ; GFNIAVX512VL-NEXT:    vpsrlw %xmm1, %ymm3, %ymm3
1928 ; GFNIAVX512VL-NEXT:    vpbroadcastd {{.*#+}} ymm4 = [255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255]
1929 ; GFNIAVX512VL-NEXT:    vpand %ymm4, %ymm3, %ymm3
1930 ; GFNIAVX512VL-NEXT:    vpunpcklbw {{.*#+}} ymm2 = ymm2[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]
1931 ; GFNIAVX512VL-NEXT:    vpsrlw %xmm1, %ymm2, %ymm2
1932 ; GFNIAVX512VL-NEXT:    vpand %ymm4, %ymm2, %ymm2
1933 ; GFNIAVX512VL-NEXT:    vpackuswb %ymm3, %ymm2, %ymm2
1934 ; GFNIAVX512VL-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]
1935 ; GFNIAVX512VL-NEXT:    vpsrlw %xmm1, %ymm3, %ymm3
1936 ; GFNIAVX512VL-NEXT:    vpand %ymm4, %ymm3, %ymm3
1937 ; GFNIAVX512VL-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]
1938 ; GFNIAVX512VL-NEXT:    vpsrlw %xmm1, %ymm0, %ymm0
1939 ; GFNIAVX512VL-NEXT:    vpand %ymm4, %ymm0, %ymm0
1940 ; GFNIAVX512VL-NEXT:    vpackuswb %ymm3, %ymm0, %ymm0
1941 ; GFNIAVX512VL-NEXT:    vinserti64x4 $1, %ymm2, %zmm0, %zmm0
1942 ; GFNIAVX512VL-NEXT:    retq
1944 ; GFNIAVX512BW-LABEL: splatvar_rotr_v64i8:
1945 ; GFNIAVX512BW:       # %bb.0:
1946 ; GFNIAVX512BW-NEXT:    vpunpckhbw {{.*#+}} zmm2 = zmm0[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,40,40,41,41,42,42,43,43,44,44,45,45,46,46,47,47,56,56,57,57,58,58,59,59,60,60,61,61,62,62,63,63]
1947 ; GFNIAVX512BW-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1
1948 ; GFNIAVX512BW-NEXT:    vpsrlw %xmm1, %zmm2, %zmm2
1949 ; GFNIAVX512BW-NEXT:    vpbroadcastw {{.*#+}} zmm3 = [255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255]
1950 ; GFNIAVX512BW-NEXT:    vpandq %zmm3, %zmm2, %zmm2
1951 ; GFNIAVX512BW-NEXT:    vpunpcklbw {{.*#+}} zmm0 = zmm0[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,32,32,33,33,34,34,35,35,36,36,37,37,38,38,39,39,48,48,49,49,50,50,51,51,52,52,53,53,54,54,55,55]
1952 ; GFNIAVX512BW-NEXT:    vpsrlw %xmm1, %zmm0, %zmm0
1953 ; GFNIAVX512BW-NEXT:    vpandq %zmm3, %zmm0, %zmm0
1954 ; GFNIAVX512BW-NEXT:    vpackuswb %zmm2, %zmm0, %zmm0
1955 ; GFNIAVX512BW-NEXT:    retq
1956   %splat = shufflevector <64 x i8> %amt, <64 x i8> undef, <64 x i32> zeroinitializer
1957   %res = call <64 x i8> @llvm.fshr.v64i8(<64 x i8> %a, <64 x i8> %a, <64 x i8> %splat)
1958   ret <64 x i8> %res
1961 define <64 x i8> @constant_rotl_v64i8(<64 x i8> %a) nounwind {
1962 ; GFNISSE-LABEL: constant_rotl_v64i8:
1963 ; GFNISSE:       # %bb.0:
1964 ; GFNISSE-NEXT:    movdqa %xmm0, %xmm6
1965 ; GFNISSE-NEXT:    punpckhbw {{.*#+}} xmm6 = xmm6[8],xmm0[8],xmm6[9],xmm0[9],xmm6[10],xmm0[10],xmm6[11],xmm0[11],xmm6[12],xmm0[12],xmm6[13],xmm0[13],xmm6[14],xmm0[14],xmm6[15],xmm0[15]
1966 ; GFNISSE-NEXT:    pmovzxbw {{.*#+}} xmm4 = [1,128,64,32,16,8,4,2]
1967 ; GFNISSE-NEXT:    pmullw %xmm4, %xmm6
1968 ; GFNISSE-NEXT:    psrlw $8, %xmm6
1969 ; GFNISSE-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
1970 ; GFNISSE-NEXT:    pmovzxbw {{.*#+}} xmm5 = [1,2,4,8,16,32,64,128]
1971 ; GFNISSE-NEXT:    pmullw %xmm5, %xmm0
1972 ; GFNISSE-NEXT:    psrlw $8, %xmm0
1973 ; GFNISSE-NEXT:    packuswb %xmm6, %xmm0
1974 ; GFNISSE-NEXT:    movdqa %xmm1, %xmm6
1975 ; GFNISSE-NEXT:    punpckhbw {{.*#+}} xmm6 = xmm6[8],xmm1[8],xmm6[9],xmm1[9],xmm6[10],xmm1[10],xmm6[11],xmm1[11],xmm6[12],xmm1[12],xmm6[13],xmm1[13],xmm6[14],xmm1[14],xmm6[15],xmm1[15]
1976 ; GFNISSE-NEXT:    pmullw %xmm4, %xmm6
1977 ; GFNISSE-NEXT:    psrlw $8, %xmm6
1978 ; GFNISSE-NEXT:    punpcklbw {{.*#+}} xmm1 = xmm1[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
1979 ; GFNISSE-NEXT:    pmullw %xmm5, %xmm1
1980 ; GFNISSE-NEXT:    psrlw $8, %xmm1
1981 ; GFNISSE-NEXT:    packuswb %xmm6, %xmm1
1982 ; GFNISSE-NEXT:    movdqa %xmm2, %xmm6
1983 ; GFNISSE-NEXT:    punpckhbw {{.*#+}} xmm6 = xmm6[8],xmm2[8],xmm6[9],xmm2[9],xmm6[10],xmm2[10],xmm6[11],xmm2[11],xmm6[12],xmm2[12],xmm6[13],xmm2[13],xmm6[14],xmm2[14],xmm6[15],xmm2[15]
1984 ; GFNISSE-NEXT:    pmullw %xmm4, %xmm6
1985 ; GFNISSE-NEXT:    psrlw $8, %xmm6
1986 ; GFNISSE-NEXT:    punpcklbw {{.*#+}} xmm2 = xmm2[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
1987 ; GFNISSE-NEXT:    pmullw %xmm5, %xmm2
1988 ; GFNISSE-NEXT:    psrlw $8, %xmm2
1989 ; GFNISSE-NEXT:    packuswb %xmm6, %xmm2
1990 ; GFNISSE-NEXT:    movdqa %xmm3, %xmm6
1991 ; GFNISSE-NEXT:    punpckhbw {{.*#+}} xmm6 = xmm6[8],xmm3[8],xmm6[9],xmm3[9],xmm6[10],xmm3[10],xmm6[11],xmm3[11],xmm6[12],xmm3[12],xmm6[13],xmm3[13],xmm6[14],xmm3[14],xmm6[15],xmm3[15]
1992 ; GFNISSE-NEXT:    pmullw %xmm4, %xmm6
1993 ; GFNISSE-NEXT:    psrlw $8, %xmm6
1994 ; GFNISSE-NEXT:    punpcklbw {{.*#+}} xmm3 = xmm3[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
1995 ; GFNISSE-NEXT:    pmullw %xmm5, %xmm3
1996 ; GFNISSE-NEXT:    psrlw $8, %xmm3
1997 ; GFNISSE-NEXT:    packuswb %xmm6, %xmm3
1998 ; GFNISSE-NEXT:    retq
2000 ; GFNIAVX1-LABEL: constant_rotl_v64i8:
2001 ; GFNIAVX1:       # %bb.0:
2002 ; GFNIAVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2
2003 ; GFNIAVX1-NEXT:    vpunpckhbw {{.*#+}} xmm3 = xmm2[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]
2004 ; GFNIAVX1-NEXT:    vpmovzxbw {{.*#+}} xmm4 = [1,128,64,32,16,8,4,2]
2005 ; GFNIAVX1-NEXT:    vpmullw %xmm4, %xmm3, %xmm3
2006 ; GFNIAVX1-NEXT:    vpsrlw $8, %xmm3, %xmm3
2007 ; GFNIAVX1-NEXT:    vpunpcklbw {{.*#+}} xmm2 = xmm2[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
2008 ; GFNIAVX1-NEXT:    vpmovzxbw {{.*#+}} xmm5 = [1,2,4,8,16,32,64,128]
2009 ; GFNIAVX1-NEXT:    vpmullw %xmm5, %xmm2, %xmm2
2010 ; GFNIAVX1-NEXT:    vpsrlw $8, %xmm2, %xmm2
2011 ; GFNIAVX1-NEXT:    vpackuswb %xmm3, %xmm2, %xmm2
2012 ; GFNIAVX1-NEXT:    vpunpckhbw {{.*#+}} xmm3 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]
2013 ; GFNIAVX1-NEXT:    vpmullw %xmm4, %xmm3, %xmm3
2014 ; GFNIAVX1-NEXT:    vpsrlw $8, %xmm3, %xmm3
2015 ; GFNIAVX1-NEXT:    vpunpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
2016 ; GFNIAVX1-NEXT:    vpmullw %xmm5, %xmm0, %xmm0
2017 ; GFNIAVX1-NEXT:    vpsrlw $8, %xmm0, %xmm0
2018 ; GFNIAVX1-NEXT:    vpackuswb %xmm3, %xmm0, %xmm0
2019 ; GFNIAVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
2020 ; GFNIAVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
2021 ; GFNIAVX1-NEXT:    vpunpckhbw {{.*#+}} xmm3 = xmm2[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]
2022 ; GFNIAVX1-NEXT:    vpmullw %xmm4, %xmm3, %xmm3
2023 ; GFNIAVX1-NEXT:    vpsrlw $8, %xmm3, %xmm3
2024 ; GFNIAVX1-NEXT:    vpunpcklbw {{.*#+}} xmm2 = xmm2[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
2025 ; GFNIAVX1-NEXT:    vpmullw %xmm5, %xmm2, %xmm2
2026 ; GFNIAVX1-NEXT:    vpsrlw $8, %xmm2, %xmm2
2027 ; GFNIAVX1-NEXT:    vpackuswb %xmm3, %xmm2, %xmm2
2028 ; GFNIAVX1-NEXT:    vpunpckhbw {{.*#+}} xmm3 = xmm1[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]
2029 ; GFNIAVX1-NEXT:    vpmullw %xmm4, %xmm3, %xmm3
2030 ; GFNIAVX1-NEXT:    vpsrlw $8, %xmm3, %xmm3
2031 ; GFNIAVX1-NEXT:    vpunpcklbw {{.*#+}} xmm1 = xmm1[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
2032 ; GFNIAVX1-NEXT:    vpmullw %xmm5, %xmm1, %xmm1
2033 ; GFNIAVX1-NEXT:    vpsrlw $8, %xmm1, %xmm1
2034 ; GFNIAVX1-NEXT:    vpackuswb %xmm3, %xmm1, %xmm1
2035 ; GFNIAVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm1, %ymm1
2036 ; GFNIAVX1-NEXT:    retq
2038 ; GFNIAVX2-LABEL: constant_rotl_v64i8:
2039 ; GFNIAVX2:       # %bb.0:
2040 ; GFNIAVX2-NEXT:    vpunpckhbw {{.*#+}} ymm2 = 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]
2041 ; GFNIAVX2-NEXT:    vbroadcasti128 {{.*#+}} ymm3 = [1,128,64,32,16,8,4,2,1,128,64,32,16,8,4,2]
2042 ; GFNIAVX2-NEXT:    # ymm3 = mem[0,1,0,1]
2043 ; GFNIAVX2-NEXT:    vpmullw %ymm3, %ymm2, %ymm2
2044 ; GFNIAVX2-NEXT:    vpsrlw $8, %ymm2, %ymm2
2045 ; GFNIAVX2-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]
2046 ; GFNIAVX2-NEXT:    vbroadcasti128 {{.*#+}} ymm4 = [1,2,4,8,16,32,64,128,1,2,4,8,16,32,64,128]
2047 ; GFNIAVX2-NEXT:    # ymm4 = mem[0,1,0,1]
2048 ; GFNIAVX2-NEXT:    vpmullw %ymm4, %ymm0, %ymm0
2049 ; GFNIAVX2-NEXT:    vpsrlw $8, %ymm0, %ymm0
2050 ; GFNIAVX2-NEXT:    vpackuswb %ymm2, %ymm0, %ymm0
2051 ; GFNIAVX2-NEXT:    vpunpckhbw {{.*#+}} ymm2 = ymm1[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]
2052 ; GFNIAVX2-NEXT:    vpmullw %ymm3, %ymm2, %ymm2
2053 ; GFNIAVX2-NEXT:    vpsrlw $8, %ymm2, %ymm2
2054 ; GFNIAVX2-NEXT:    vpunpcklbw {{.*#+}} ymm1 = ymm1[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]
2055 ; GFNIAVX2-NEXT:    vpmullw %ymm4, %ymm1, %ymm1
2056 ; GFNIAVX2-NEXT:    vpsrlw $8, %ymm1, %ymm1
2057 ; GFNIAVX2-NEXT:    vpackuswb %ymm2, %ymm1, %ymm1
2058 ; GFNIAVX2-NEXT:    retq
2060 ; GFNIAVX512VL-LABEL: constant_rotl_v64i8:
2061 ; GFNIAVX512VL:       # %bb.0:
2062 ; GFNIAVX512VL-NEXT:    vextracti64x4 $1, %zmm0, %ymm1
2063 ; GFNIAVX512VL-NEXT:    vpunpckhbw {{.*#+}} ymm2 = ymm1[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]
2064 ; GFNIAVX512VL-NEXT:    vbroadcasti128 {{.*#+}} ymm3 = [1,128,64,32,16,8,4,2,1,128,64,32,16,8,4,2]
2065 ; GFNIAVX512VL-NEXT:    # ymm3 = mem[0,1,0,1]
2066 ; GFNIAVX512VL-NEXT:    vpmullw %ymm3, %ymm2, %ymm2
2067 ; GFNIAVX512VL-NEXT:    vpsrlw $8, %ymm2, %ymm2
2068 ; GFNIAVX512VL-NEXT:    vpunpcklbw {{.*#+}} ymm1 = ymm1[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]
2069 ; GFNIAVX512VL-NEXT:    vbroadcasti128 {{.*#+}} ymm4 = [1,2,4,8,16,32,64,128,1,2,4,8,16,32,64,128]
2070 ; GFNIAVX512VL-NEXT:    # ymm4 = mem[0,1,0,1]
2071 ; GFNIAVX512VL-NEXT:    vpmullw %ymm4, %ymm1, %ymm1
2072 ; GFNIAVX512VL-NEXT:    vpsrlw $8, %ymm1, %ymm1
2073 ; GFNIAVX512VL-NEXT:    vpackuswb %ymm2, %ymm1, %ymm1
2074 ; GFNIAVX512VL-NEXT:    vpunpckhbw {{.*#+}} ymm2 = 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]
2075 ; GFNIAVX512VL-NEXT:    vpmullw %ymm3, %ymm2, %ymm2
2076 ; GFNIAVX512VL-NEXT:    vpsrlw $8, %ymm2, %ymm2
2077 ; GFNIAVX512VL-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]
2078 ; GFNIAVX512VL-NEXT:    vpmullw %ymm4, %ymm0, %ymm0
2079 ; GFNIAVX512VL-NEXT:    vpsrlw $8, %ymm0, %ymm0
2080 ; GFNIAVX512VL-NEXT:    vpackuswb %ymm2, %ymm0, %ymm0
2081 ; GFNIAVX512VL-NEXT:    vinserti64x4 $1, %ymm1, %zmm0, %zmm0
2082 ; GFNIAVX512VL-NEXT:    retq
2084 ; GFNIAVX512BW-LABEL: constant_rotl_v64i8:
2085 ; GFNIAVX512BW:       # %bb.0:
2086 ; GFNIAVX512BW-NEXT:    vpunpckhbw {{.*#+}} zmm1 = zmm0[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,40,40,41,41,42,42,43,43,44,44,45,45,46,46,47,47,56,56,57,57,58,58,59,59,60,60,61,61,62,62,63,63]
2087 ; GFNIAVX512BW-NEXT:    vpsllvw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %zmm1, %zmm1
2088 ; GFNIAVX512BW-NEXT:    vpsrlw $8, %zmm1, %zmm1
2089 ; GFNIAVX512BW-NEXT:    vpunpcklbw {{.*#+}} zmm0 = zmm0[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,32,32,33,33,34,34,35,35,36,36,37,37,38,38,39,39,48,48,49,49,50,50,51,51,52,52,53,53,54,54,55,55]
2090 ; GFNIAVX512BW-NEXT:    vpsllvw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %zmm0, %zmm0
2091 ; GFNIAVX512BW-NEXT:    vpsrlw $8, %zmm0, %zmm0
2092 ; GFNIAVX512BW-NEXT:    vpackuswb %zmm1, %zmm0, %zmm0
2093 ; GFNIAVX512BW-NEXT:    retq
2094   %res = call <64 x i8> @llvm.fshl.v64i8(<64 x i8> %a, <64 x i8> %a, <64 x i8> <i8 0, i8 1, i8 2, i8 3, i8 4, i8 5, i8 6, i8 7, i8 8, i8 7, i8 6, i8 5, i8 4, i8 3, i8 2, i8 1, i8 0, i8 1, i8 2, i8 3, i8 4, i8 5, i8 6, i8 7, i8 8, i8 7, i8 6, i8 5, i8 4, i8 3, i8 2, i8 1, i8 0, i8 1, i8 2, i8 3, i8 4, i8 5, i8 6, i8 7, i8 8, i8 7, i8 6, i8 5, i8 4, i8 3, i8 2, i8 1, i8 0, i8 1, i8 2, i8 3, i8 4, i8 5, i8 6, i8 7, i8 8, i8 7, i8 6, i8 5, i8 4, i8 3, i8 2, i8 1>)
2095   ret <64 x i8> %res
2098 define <64 x i8> @constant_rotr_v64i8(<64 x i8> %a) nounwind {
2099 ; GFNISSE-LABEL: constant_rotr_v64i8:
2100 ; GFNISSE:       # %bb.0:
2101 ; GFNISSE-NEXT:    movdqa %xmm0, %xmm6
2102 ; GFNISSE-NEXT:    punpckhbw {{.*#+}} xmm6 = xmm6[8],xmm0[8],xmm6[9],xmm0[9],xmm6[10],xmm0[10],xmm6[11],xmm0[11],xmm6[12],xmm0[12],xmm6[13],xmm0[13],xmm6[14],xmm0[14],xmm6[15],xmm0[15]
2103 ; GFNISSE-NEXT:    pmovzxbw {{.*#+}} xmm4 = [1,128,64,32,16,8,4,2]
2104 ; GFNISSE-NEXT:    pmullw %xmm4, %xmm6
2105 ; GFNISSE-NEXT:    psrlw $8, %xmm6
2106 ; GFNISSE-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
2107 ; GFNISSE-NEXT:    pmovzxbw {{.*#+}} xmm5 = [1,2,4,8,16,32,64,128]
2108 ; GFNISSE-NEXT:    pmullw %xmm5, %xmm0
2109 ; GFNISSE-NEXT:    psrlw $8, %xmm0
2110 ; GFNISSE-NEXT:    packuswb %xmm6, %xmm0
2111 ; GFNISSE-NEXT:    movdqa %xmm1, %xmm6
2112 ; GFNISSE-NEXT:    punpckhbw {{.*#+}} xmm6 = xmm6[8],xmm1[8],xmm6[9],xmm1[9],xmm6[10],xmm1[10],xmm6[11],xmm1[11],xmm6[12],xmm1[12],xmm6[13],xmm1[13],xmm6[14],xmm1[14],xmm6[15],xmm1[15]
2113 ; GFNISSE-NEXT:    pmullw %xmm4, %xmm6
2114 ; GFNISSE-NEXT:    psrlw $8, %xmm6
2115 ; GFNISSE-NEXT:    punpcklbw {{.*#+}} xmm1 = xmm1[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
2116 ; GFNISSE-NEXT:    pmullw %xmm5, %xmm1
2117 ; GFNISSE-NEXT:    psrlw $8, %xmm1
2118 ; GFNISSE-NEXT:    packuswb %xmm6, %xmm1
2119 ; GFNISSE-NEXT:    movdqa %xmm2, %xmm6
2120 ; GFNISSE-NEXT:    punpckhbw {{.*#+}} xmm6 = xmm6[8],xmm2[8],xmm6[9],xmm2[9],xmm6[10],xmm2[10],xmm6[11],xmm2[11],xmm6[12],xmm2[12],xmm6[13],xmm2[13],xmm6[14],xmm2[14],xmm6[15],xmm2[15]
2121 ; GFNISSE-NEXT:    pmullw %xmm4, %xmm6
2122 ; GFNISSE-NEXT:    psrlw $8, %xmm6
2123 ; GFNISSE-NEXT:    punpcklbw {{.*#+}} xmm2 = xmm2[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
2124 ; GFNISSE-NEXT:    pmullw %xmm5, %xmm2
2125 ; GFNISSE-NEXT:    psrlw $8, %xmm2
2126 ; GFNISSE-NEXT:    packuswb %xmm6, %xmm2
2127 ; GFNISSE-NEXT:    movdqa %xmm3, %xmm6
2128 ; GFNISSE-NEXT:    punpckhbw {{.*#+}} xmm6 = xmm6[8],xmm3[8],xmm6[9],xmm3[9],xmm6[10],xmm3[10],xmm6[11],xmm3[11],xmm6[12],xmm3[12],xmm6[13],xmm3[13],xmm6[14],xmm3[14],xmm6[15],xmm3[15]
2129 ; GFNISSE-NEXT:    pmullw %xmm4, %xmm6
2130 ; GFNISSE-NEXT:    psrlw $8, %xmm6
2131 ; GFNISSE-NEXT:    punpcklbw {{.*#+}} xmm3 = xmm3[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
2132 ; GFNISSE-NEXT:    pmullw %xmm5, %xmm3
2133 ; GFNISSE-NEXT:    psrlw $8, %xmm3
2134 ; GFNISSE-NEXT:    packuswb %xmm6, %xmm3
2135 ; GFNISSE-NEXT:    retq
2137 ; GFNIAVX1-LABEL: constant_rotr_v64i8:
2138 ; GFNIAVX1:       # %bb.0:
2139 ; GFNIAVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2
2140 ; GFNIAVX1-NEXT:    vpunpckhbw {{.*#+}} xmm3 = xmm2[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]
2141 ; GFNIAVX1-NEXT:    vpmovzxbw {{.*#+}} xmm4 = [1,128,64,32,16,8,4,2]
2142 ; GFNIAVX1-NEXT:    vpmullw %xmm4, %xmm3, %xmm3
2143 ; GFNIAVX1-NEXT:    vpsrlw $8, %xmm3, %xmm3
2144 ; GFNIAVX1-NEXT:    vpunpcklbw {{.*#+}} xmm2 = xmm2[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
2145 ; GFNIAVX1-NEXT:    vpmovzxbw {{.*#+}} xmm5 = [1,2,4,8,16,32,64,128]
2146 ; GFNIAVX1-NEXT:    vpmullw %xmm5, %xmm2, %xmm2
2147 ; GFNIAVX1-NEXT:    vpsrlw $8, %xmm2, %xmm2
2148 ; GFNIAVX1-NEXT:    vpackuswb %xmm3, %xmm2, %xmm2
2149 ; GFNIAVX1-NEXT:    vpunpckhbw {{.*#+}} xmm3 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]
2150 ; GFNIAVX1-NEXT:    vpmullw %xmm4, %xmm3, %xmm3
2151 ; GFNIAVX1-NEXT:    vpsrlw $8, %xmm3, %xmm3
2152 ; GFNIAVX1-NEXT:    vpunpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
2153 ; GFNIAVX1-NEXT:    vpmullw %xmm5, %xmm0, %xmm0
2154 ; GFNIAVX1-NEXT:    vpsrlw $8, %xmm0, %xmm0
2155 ; GFNIAVX1-NEXT:    vpackuswb %xmm3, %xmm0, %xmm0
2156 ; GFNIAVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
2157 ; GFNIAVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
2158 ; GFNIAVX1-NEXT:    vpunpckhbw {{.*#+}} xmm3 = xmm2[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]
2159 ; GFNIAVX1-NEXT:    vpmullw %xmm4, %xmm3, %xmm3
2160 ; GFNIAVX1-NEXT:    vpsrlw $8, %xmm3, %xmm3
2161 ; GFNIAVX1-NEXT:    vpunpcklbw {{.*#+}} xmm2 = xmm2[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
2162 ; GFNIAVX1-NEXT:    vpmullw %xmm5, %xmm2, %xmm2
2163 ; GFNIAVX1-NEXT:    vpsrlw $8, %xmm2, %xmm2
2164 ; GFNIAVX1-NEXT:    vpackuswb %xmm3, %xmm2, %xmm2
2165 ; GFNIAVX1-NEXT:    vpunpckhbw {{.*#+}} xmm3 = xmm1[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]
2166 ; GFNIAVX1-NEXT:    vpmullw %xmm4, %xmm3, %xmm3
2167 ; GFNIAVX1-NEXT:    vpsrlw $8, %xmm3, %xmm3
2168 ; GFNIAVX1-NEXT:    vpunpcklbw {{.*#+}} xmm1 = xmm1[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
2169 ; GFNIAVX1-NEXT:    vpmullw %xmm5, %xmm1, %xmm1
2170 ; GFNIAVX1-NEXT:    vpsrlw $8, %xmm1, %xmm1
2171 ; GFNIAVX1-NEXT:    vpackuswb %xmm3, %xmm1, %xmm1
2172 ; GFNIAVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm1, %ymm1
2173 ; GFNIAVX1-NEXT:    retq
2175 ; GFNIAVX2-LABEL: constant_rotr_v64i8:
2176 ; GFNIAVX2:       # %bb.0:
2177 ; GFNIAVX2-NEXT:    vpunpckhbw {{.*#+}} ymm2 = 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]
2178 ; GFNIAVX2-NEXT:    vbroadcasti128 {{.*#+}} ymm3 = [1,128,64,32,16,8,4,2,1,128,64,32,16,8,4,2]
2179 ; GFNIAVX2-NEXT:    # ymm3 = mem[0,1,0,1]
2180 ; GFNIAVX2-NEXT:    vpmullw %ymm3, %ymm2, %ymm2
2181 ; GFNIAVX2-NEXT:    vpsrlw $8, %ymm2, %ymm2
2182 ; GFNIAVX2-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]
2183 ; GFNIAVX2-NEXT:    vbroadcasti128 {{.*#+}} ymm4 = [1,2,4,8,16,32,64,128,1,2,4,8,16,32,64,128]
2184 ; GFNIAVX2-NEXT:    # ymm4 = mem[0,1,0,1]
2185 ; GFNIAVX2-NEXT:    vpmullw %ymm4, %ymm0, %ymm0
2186 ; GFNIAVX2-NEXT:    vpsrlw $8, %ymm0, %ymm0
2187 ; GFNIAVX2-NEXT:    vpackuswb %ymm2, %ymm0, %ymm0
2188 ; GFNIAVX2-NEXT:    vpunpckhbw {{.*#+}} ymm2 = ymm1[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]
2189 ; GFNIAVX2-NEXT:    vpmullw %ymm3, %ymm2, %ymm2
2190 ; GFNIAVX2-NEXT:    vpsrlw $8, %ymm2, %ymm2
2191 ; GFNIAVX2-NEXT:    vpunpcklbw {{.*#+}} ymm1 = ymm1[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]
2192 ; GFNIAVX2-NEXT:    vpmullw %ymm4, %ymm1, %ymm1
2193 ; GFNIAVX2-NEXT:    vpsrlw $8, %ymm1, %ymm1
2194 ; GFNIAVX2-NEXT:    vpackuswb %ymm2, %ymm1, %ymm1
2195 ; GFNIAVX2-NEXT:    retq
2197 ; GFNIAVX512VL-LABEL: constant_rotr_v64i8:
2198 ; GFNIAVX512VL:       # %bb.0:
2199 ; GFNIAVX512VL-NEXT:    vextracti64x4 $1, %zmm0, %ymm1
2200 ; GFNIAVX512VL-NEXT:    vpunpckhbw {{.*#+}} ymm2 = ymm1[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]
2201 ; GFNIAVX512VL-NEXT:    vbroadcasti128 {{.*#+}} ymm3 = [1,128,64,32,16,8,4,2,1,128,64,32,16,8,4,2]
2202 ; GFNIAVX512VL-NEXT:    # ymm3 = mem[0,1,0,1]
2203 ; GFNIAVX512VL-NEXT:    vpmullw %ymm3, %ymm2, %ymm2
2204 ; GFNIAVX512VL-NEXT:    vpsrlw $8, %ymm2, %ymm2
2205 ; GFNIAVX512VL-NEXT:    vpunpcklbw {{.*#+}} ymm1 = ymm1[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]
2206 ; GFNIAVX512VL-NEXT:    vbroadcasti128 {{.*#+}} ymm4 = [1,2,4,8,16,32,64,128,1,2,4,8,16,32,64,128]
2207 ; GFNIAVX512VL-NEXT:    # ymm4 = mem[0,1,0,1]
2208 ; GFNIAVX512VL-NEXT:    vpmullw %ymm4, %ymm1, %ymm1
2209 ; GFNIAVX512VL-NEXT:    vpsrlw $8, %ymm1, %ymm1
2210 ; GFNIAVX512VL-NEXT:    vpackuswb %ymm2, %ymm1, %ymm1
2211 ; GFNIAVX512VL-NEXT:    vpunpckhbw {{.*#+}} ymm2 = 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]
2212 ; GFNIAVX512VL-NEXT:    vpmullw %ymm3, %ymm2, %ymm2
2213 ; GFNIAVX512VL-NEXT:    vpsrlw $8, %ymm2, %ymm2
2214 ; GFNIAVX512VL-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]
2215 ; GFNIAVX512VL-NEXT:    vpmullw %ymm4, %ymm0, %ymm0
2216 ; GFNIAVX512VL-NEXT:    vpsrlw $8, %ymm0, %ymm0
2217 ; GFNIAVX512VL-NEXT:    vpackuswb %ymm2, %ymm0, %ymm0
2218 ; GFNIAVX512VL-NEXT:    vinserti64x4 $1, %ymm1, %zmm0, %zmm0
2219 ; GFNIAVX512VL-NEXT:    retq
2221 ; GFNIAVX512BW-LABEL: constant_rotr_v64i8:
2222 ; GFNIAVX512BW:       # %bb.0:
2223 ; GFNIAVX512BW-NEXT:    vpunpckhbw {{.*#+}} zmm1 = zmm0[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,40,40,41,41,42,42,43,43,44,44,45,45,46,46,47,47,56,56,57,57,58,58,59,59,60,60,61,61,62,62,63,63]
2224 ; GFNIAVX512BW-NEXT:    vpsllvw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %zmm1, %zmm1
2225 ; GFNIAVX512BW-NEXT:    vpsrlw $8, %zmm1, %zmm1
2226 ; GFNIAVX512BW-NEXT:    vpunpcklbw {{.*#+}} zmm0 = zmm0[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,32,32,33,33,34,34,35,35,36,36,37,37,38,38,39,39,48,48,49,49,50,50,51,51,52,52,53,53,54,54,55,55]
2227 ; GFNIAVX512BW-NEXT:    vpsllvw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %zmm0, %zmm0
2228 ; GFNIAVX512BW-NEXT:    vpsrlw $8, %zmm0, %zmm0
2229 ; GFNIAVX512BW-NEXT:    vpackuswb %zmm1, %zmm0, %zmm0
2230 ; GFNIAVX512BW-NEXT:    retq
2231   %res = call <64 x i8> @llvm.fshl.v64i8(<64 x i8> %a, <64 x i8> %a, <64 x i8> <i8 0, i8 1, i8 2, i8 3, i8 4, i8 5, i8 6, i8 7, i8 8, i8 7, i8 6, i8 5, i8 4, i8 3, i8 2, i8 1, i8 0, i8 1, i8 2, i8 3, i8 4, i8 5, i8 6, i8 7, i8 8, i8 7, i8 6, i8 5, i8 4, i8 3, i8 2, i8 1, i8 0, i8 1, i8 2, i8 3, i8 4, i8 5, i8 6, i8 7, i8 8, i8 7, i8 6, i8 5, i8 4, i8 3, i8 2, i8 1, i8 0, i8 1, i8 2, i8 3, i8 4, i8 5, i8 6, i8 7, i8 8, i8 7, i8 6, i8 5, i8 4, i8 3, i8 2, i8 1>)
2232   ret <64 x i8> %res
2235 define <64 x i8> @splatconstant_rotl_v64i8(<64 x i8> %a) nounwind {
2236 ; GFNISSE-LABEL: splatconstant_rotl_v64i8:
2237 ; GFNISSE:       # %bb.0:
2238 ; GFNISSE-NEXT:    movdqa {{.*#+}} xmm4 = [64,32,16,8,4,2,1,128,64,32,16,8,4,2,1,128]
2239 ; GFNISSE-NEXT:    gf2p8affineqb $0, %xmm4, %xmm0
2240 ; GFNISSE-NEXT:    gf2p8affineqb $0, %xmm4, %xmm1
2241 ; GFNISSE-NEXT:    gf2p8affineqb $0, %xmm4, %xmm2
2242 ; GFNISSE-NEXT:    gf2p8affineqb $0, %xmm4, %xmm3
2243 ; GFNISSE-NEXT:    retq
2245 ; GFNIAVX1-LABEL: splatconstant_rotl_v64i8:
2246 ; GFNIAVX1:       # %bb.0:
2247 ; GFNIAVX1-NEXT:    vbroadcastsd {{.*#+}} ymm2 = [64,32,16,8,4,2,1,128,64,32,16,8,4,2,1,128,64,32,16,8,4,2,1,128,64,32,16,8,4,2,1,128]
2248 ; GFNIAVX1-NEXT:    vgf2p8affineqb $0, %ymm2, %ymm0, %ymm0
2249 ; GFNIAVX1-NEXT:    vgf2p8affineqb $0, %ymm2, %ymm1, %ymm1
2250 ; GFNIAVX1-NEXT:    retq
2252 ; GFNIAVX2-LABEL: splatconstant_rotl_v64i8:
2253 ; GFNIAVX2:       # %bb.0:
2254 ; GFNIAVX2-NEXT:    vpbroadcastq {{.*#+}} ymm2 = [64,32,16,8,4,2,1,128,64,32,16,8,4,2,1,128,64,32,16,8,4,2,1,128,64,32,16,8,4,2,1,128]
2255 ; GFNIAVX2-NEXT:    vgf2p8affineqb $0, %ymm2, %ymm0, %ymm0
2256 ; GFNIAVX2-NEXT:    vgf2p8affineqb $0, %ymm2, %ymm1, %ymm1
2257 ; GFNIAVX2-NEXT:    retq
2259 ; GFNIAVX512-LABEL: splatconstant_rotl_v64i8:
2260 ; GFNIAVX512:       # %bb.0:
2261 ; GFNIAVX512-NEXT:    vgf2p8affineqb $0, {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to8}, %zmm0, %zmm0
2262 ; GFNIAVX512-NEXT:    retq
2263   %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>)
2264   ret <64 x i8> %res
2266 declare <64 x i8> @llvm.fshl.v64i8(<64 x i8>, <64 x i8>, <64 x i8>)
2268 define <64 x i8> @splatconstant_rotr_v64i8(<64 x i8> %a) nounwind {
2269 ; GFNISSE-LABEL: splatconstant_rotr_v64i8:
2270 ; GFNISSE:       # %bb.0:
2271 ; GFNISSE-NEXT:    movdqa {{.*#+}} xmm4 = [2,1,128,64,32,16,8,4,2,1,128,64,32,16,8,4]
2272 ; GFNISSE-NEXT:    gf2p8affineqb $0, %xmm4, %xmm0
2273 ; GFNISSE-NEXT:    gf2p8affineqb $0, %xmm4, %xmm1
2274 ; GFNISSE-NEXT:    gf2p8affineqb $0, %xmm4, %xmm2
2275 ; GFNISSE-NEXT:    gf2p8affineqb $0, %xmm4, %xmm3
2276 ; GFNISSE-NEXT:    retq
2278 ; GFNIAVX1-LABEL: splatconstant_rotr_v64i8:
2279 ; GFNIAVX1:       # %bb.0:
2280 ; GFNIAVX1-NEXT:    vbroadcastsd {{.*#+}} ymm2 = [2,1,128,64,32,16,8,4,2,1,128,64,32,16,8,4,2,1,128,64,32,16,8,4,2,1,128,64,32,16,8,4]
2281 ; GFNIAVX1-NEXT:    vgf2p8affineqb $0, %ymm2, %ymm0, %ymm0
2282 ; GFNIAVX1-NEXT:    vgf2p8affineqb $0, %ymm2, %ymm1, %ymm1
2283 ; GFNIAVX1-NEXT:    retq
2285 ; GFNIAVX2-LABEL: splatconstant_rotr_v64i8:
2286 ; GFNIAVX2:       # %bb.0:
2287 ; GFNIAVX2-NEXT:    vpbroadcastq {{.*#+}} ymm2 = [2,1,128,64,32,16,8,4,2,1,128,64,32,16,8,4,2,1,128,64,32,16,8,4,2,1,128,64,32,16,8,4]
2288 ; GFNIAVX2-NEXT:    vgf2p8affineqb $0, %ymm2, %ymm0, %ymm0
2289 ; GFNIAVX2-NEXT:    vgf2p8affineqb $0, %ymm2, %ymm1, %ymm1
2290 ; GFNIAVX2-NEXT:    retq
2292 ; GFNIAVX512-LABEL: splatconstant_rotr_v64i8:
2293 ; GFNIAVX512:       # %bb.0:
2294 ; GFNIAVX512-NEXT:    vgf2p8affineqb $0, {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to8}, %zmm0, %zmm0
2295 ; GFNIAVX512-NEXT:    retq
2296   %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>)
2297   ret <64 x i8> %res
2299 declare <64 x i8> @llvm.fshr.v64i8(<64 x i8>, <64 x i8>, <64 x i8>)