Make utils/update_llc_test_checks.py note that the assertions are
[oota-llvm.git] / test / CodeGen / X86 / vector-shift-ashr-512.ll
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; TODO: Add AVX512BW shift support
3 ; RUN: llc < %s -mtriple=x86_64-apple-darwin -mcpu=knl -mattr=+avx512dq | FileCheck %s --check-prefix=ALL --check-prefix=AVX512 --check-prefix=AVX512DQ
4
5 ;
6 ; Variable Shifts
7 ;
8
9 define <8 x i64> @var_shift_v8i64(<8 x i64> %a, <8 x i64> %b) nounwind {
10 ; ALL-LABEL: var_shift_v8i64:
11 ; ALL:       ## BB#0:
12 ; ALL-NEXT:    vpsravq %zmm1, %zmm0, %zmm0
13 ; ALL-NEXT:    retq
14   %shift = ashr <8 x i64> %a, %b
15   ret <8 x i64> %shift
16 }
17
18 define <16 x i32> @var_shift_v16i32(<16 x i32> %a, <16 x i32> %b) nounwind {
19 ; ALL-LABEL: var_shift_v16i32:
20 ; ALL:       ## BB#0:
21 ; ALL-NEXT:    vpsravd %zmm1, %zmm0, %zmm0
22 ; ALL-NEXT:    retq
23   %shift = ashr <16 x i32> %a, %b
24   ret <16 x i32> %shift
25 }
26
27 define <32 x i16> @var_shift_v32i16(<32 x i16> %a, <32 x i16> %b) nounwind {
28 ; ALL-LABEL: var_shift_v32i16:
29 ; ALL:       ## BB#0:
30 ; ALL-NEXT:    vpxor %ymm4, %ymm4, %ymm4
31 ; ALL-NEXT:    vpunpckhwd {{.*#+}} ymm5 = ymm2[4],ymm4[4],ymm2[5],ymm4[5],ymm2[6],ymm4[6],ymm2[7],ymm4[7],ymm2[12],ymm4[12],ymm2[13],ymm4[13],ymm2[14],ymm4[14],ymm2[15],ymm4[15]
32 ; ALL-NEXT:    vpunpckhwd {{.*#+}} ymm6 = ymm0[4,4,5,5,6,6,7,7,12,12,13,13,14,14,15,15]
33 ; ALL-NEXT:    vpsravd %ymm5, %ymm6, %ymm5
34 ; ALL-NEXT:    vpsrld $16, %ymm5, %ymm5
35 ; ALL-NEXT:    vpunpcklwd {{.*#+}} ymm2 = ymm2[0],ymm4[0],ymm2[1],ymm4[1],ymm2[2],ymm4[2],ymm2[3],ymm4[3],ymm2[8],ymm4[8],ymm2[9],ymm4[9],ymm2[10],ymm4[10],ymm2[11],ymm4[11]
36 ; ALL-NEXT:    vpunpcklwd {{.*#+}} ymm0 = ymm0[0,0,1,1,2,2,3,3,8,8,9,9,10,10,11,11]
37 ; ALL-NEXT:    vpsravd %ymm2, %ymm0, %ymm0
38 ; ALL-NEXT:    vpsrld $16, %ymm0, %ymm0
39 ; ALL-NEXT:    vpackusdw %ymm5, %ymm0, %ymm0
40 ; ALL-NEXT:    vpunpckhwd {{.*#+}} ymm2 = ymm3[4],ymm4[4],ymm3[5],ymm4[5],ymm3[6],ymm4[6],ymm3[7],ymm4[7],ymm3[12],ymm4[12],ymm3[13],ymm4[13],ymm3[14],ymm4[14],ymm3[15],ymm4[15]
41 ; ALL-NEXT:    vpunpckhwd {{.*#+}} ymm5 = ymm1[4,4,5,5,6,6,7,7,12,12,13,13,14,14,15,15]
42 ; ALL-NEXT:    vpsravd %ymm2, %ymm5, %ymm2
43 ; ALL-NEXT:    vpsrld $16, %ymm2, %ymm2
44 ; ALL-NEXT:    vpunpcklwd {{.*#+}} ymm3 = ymm3[0],ymm4[0],ymm3[1],ymm4[1],ymm3[2],ymm4[2],ymm3[3],ymm4[3],ymm3[8],ymm4[8],ymm3[9],ymm4[9],ymm3[10],ymm4[10],ymm3[11],ymm4[11]
45 ; ALL-NEXT:    vpunpcklwd {{.*#+}} ymm1 = ymm1[0,0,1,1,2,2,3,3,8,8,9,9,10,10,11,11]
46 ; ALL-NEXT:    vpsravd %ymm3, %ymm1, %ymm1
47 ; ALL-NEXT:    vpsrld $16, %ymm1, %ymm1
48 ; ALL-NEXT:    vpackusdw %ymm2, %ymm1, %ymm1
49 ; ALL-NEXT:    retq
50   %shift = ashr <32 x i16> %a, %b
51   ret <32 x i16> %shift
52 }
53
54 define <64 x i8> @var_shift_v64i8(<64 x i8> %a, <64 x i8> %b) nounwind {
55 ; ALL-LABEL: var_shift_v64i8:
56 ; ALL:       ## BB#0:
57 ; ALL-NEXT:    vpsllw $5, %ymm2, %ymm2
58 ; ALL-NEXT:    vpunpckhbw {{.*#+}} ymm4 = ymm0[8],ymm2[8],ymm0[9],ymm2[9],ymm0[10],ymm2[10],ymm0[11],ymm2[11],ymm0[12],ymm2[12],ymm0[13],ymm2[13],ymm0[14],ymm2[14],ymm0[15],ymm2[15],ymm0[24],ymm2[24],ymm0[25],ymm2[25],ymm0[26],ymm2[26],ymm0[27],ymm2[27],ymm0[28],ymm2[28],ymm0[29],ymm2[29],ymm0[30],ymm2[30],ymm0[31],ymm2[31]
59 ; ALL-NEXT:    vpunpckhbw {{.*#+}} ymm5 = 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]
60 ; ALL-NEXT:    vpsraw $4, %ymm5, %ymm6
61 ; ALL-NEXT:    vpblendvb %ymm4, %ymm6, %ymm5, %ymm5
62 ; ALL-NEXT:    vpsraw $2, %ymm5, %ymm6
63 ; ALL-NEXT:    vpaddw %ymm4, %ymm4, %ymm4
64 ; ALL-NEXT:    vpblendvb %ymm4, %ymm6, %ymm5, %ymm5
65 ; ALL-NEXT:    vpsraw $1, %ymm5, %ymm6
66 ; ALL-NEXT:    vpaddw %ymm4, %ymm4, %ymm4
67 ; ALL-NEXT:    vpblendvb %ymm4, %ymm6, %ymm5, %ymm4
68 ; ALL-NEXT:    vpsrlw $8, %ymm4, %ymm4
69 ; ALL-NEXT:    vpunpcklbw {{.*#+}} ymm2 = ymm0[0],ymm2[0],ymm0[1],ymm2[1],ymm0[2],ymm2[2],ymm0[3],ymm2[3],ymm0[4],ymm2[4],ymm0[5],ymm2[5],ymm0[6],ymm2[6],ymm0[7],ymm2[7],ymm0[16],ymm2[16],ymm0[17],ymm2[17],ymm0[18],ymm2[18],ymm0[19],ymm2[19],ymm0[20],ymm2[20],ymm0[21],ymm2[21],ymm0[22],ymm2[22],ymm0[23],ymm2[23]
70 ; ALL-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]
71 ; ALL-NEXT:    vpsraw $4, %ymm0, %ymm5
72 ; ALL-NEXT:    vpblendvb %ymm2, %ymm5, %ymm0, %ymm0
73 ; ALL-NEXT:    vpsraw $2, %ymm0, %ymm5
74 ; ALL-NEXT:    vpaddw %ymm2, %ymm2, %ymm2
75 ; ALL-NEXT:    vpblendvb %ymm2, %ymm5, %ymm0, %ymm0
76 ; ALL-NEXT:    vpsraw $1, %ymm0, %ymm5
77 ; ALL-NEXT:    vpaddw %ymm2, %ymm2, %ymm2
78 ; ALL-NEXT:    vpblendvb %ymm2, %ymm5, %ymm0, %ymm0
79 ; ALL-NEXT:    vpsrlw $8, %ymm0, %ymm0
80 ; ALL-NEXT:    vpackuswb %ymm4, %ymm0, %ymm0
81 ; ALL-NEXT:    vpsllw $5, %ymm3, %ymm2
82 ; ALL-NEXT:    vpunpckhbw {{.*#+}} ymm3 = ymm0[8],ymm2[8],ymm0[9],ymm2[9],ymm0[10],ymm2[10],ymm0[11],ymm2[11],ymm0[12],ymm2[12],ymm0[13],ymm2[13],ymm0[14],ymm2[14],ymm0[15],ymm2[15],ymm0[24],ymm2[24],ymm0[25],ymm2[25],ymm0[26],ymm2[26],ymm0[27],ymm2[27],ymm0[28],ymm2[28],ymm0[29],ymm2[29],ymm0[30],ymm2[30],ymm0[31],ymm2[31]
83 ; ALL-NEXT:    vpunpckhbw {{.*#+}} ymm4 = ymm0[8],ymm1[8],ymm0[9],ymm1[9],ymm0[10],ymm1[10],ymm0[11],ymm1[11],ymm0[12],ymm1[12],ymm0[13],ymm1[13],ymm0[14],ymm1[14],ymm0[15],ymm1[15],ymm0[24],ymm1[24],ymm0[25],ymm1[25],ymm0[26],ymm1[26],ymm0[27],ymm1[27],ymm0[28],ymm1[28],ymm0[29],ymm1[29],ymm0[30],ymm1[30],ymm0[31],ymm1[31]
84 ; ALL-NEXT:    vpsraw $4, %ymm4, %ymm5
85 ; ALL-NEXT:    vpblendvb %ymm3, %ymm5, %ymm4, %ymm4
86 ; ALL-NEXT:    vpsraw $2, %ymm4, %ymm5
87 ; ALL-NEXT:    vpaddw %ymm3, %ymm3, %ymm3
88 ; ALL-NEXT:    vpblendvb %ymm3, %ymm5, %ymm4, %ymm4
89 ; ALL-NEXT:    vpsraw $1, %ymm4, %ymm5
90 ; ALL-NEXT:    vpaddw %ymm3, %ymm3, %ymm3
91 ; ALL-NEXT:    vpblendvb %ymm3, %ymm5, %ymm4, %ymm3
92 ; ALL-NEXT:    vpsrlw $8, %ymm3, %ymm3
93 ; ALL-NEXT:    vpunpcklbw {{.*#+}} ymm2 = ymm0[0],ymm2[0],ymm0[1],ymm2[1],ymm0[2],ymm2[2],ymm0[3],ymm2[3],ymm0[4],ymm2[4],ymm0[5],ymm2[5],ymm0[6],ymm2[6],ymm0[7],ymm2[7],ymm0[16],ymm2[16],ymm0[17],ymm2[17],ymm0[18],ymm2[18],ymm0[19],ymm2[19],ymm0[20],ymm2[20],ymm0[21],ymm2[21],ymm0[22],ymm2[22],ymm0[23],ymm2[23]
94 ; ALL-NEXT:    vpunpcklbw {{.*#+}} ymm1 = ymm0[0],ymm1[0],ymm0[1],ymm1[1],ymm0[2],ymm1[2],ymm0[3],ymm1[3],ymm0[4],ymm1[4],ymm0[5],ymm1[5],ymm0[6],ymm1[6],ymm0[7],ymm1[7],ymm0[16],ymm1[16],ymm0[17],ymm1[17],ymm0[18],ymm1[18],ymm0[19],ymm1[19],ymm0[20],ymm1[20],ymm0[21],ymm1[21],ymm0[22],ymm1[22],ymm0[23],ymm1[23]
95 ; ALL-NEXT:    vpsraw $4, %ymm1, %ymm4
96 ; ALL-NEXT:    vpblendvb %ymm2, %ymm4, %ymm1, %ymm1
97 ; ALL-NEXT:    vpsraw $2, %ymm1, %ymm4
98 ; ALL-NEXT:    vpaddw %ymm2, %ymm2, %ymm2
99 ; ALL-NEXT:    vpblendvb %ymm2, %ymm4, %ymm1, %ymm1
100 ; ALL-NEXT:    vpsraw $1, %ymm1, %ymm4
101 ; ALL-NEXT:    vpaddw %ymm2, %ymm2, %ymm2
102 ; ALL-NEXT:    vpblendvb %ymm2, %ymm4, %ymm1, %ymm1
103 ; ALL-NEXT:    vpsrlw $8, %ymm1, %ymm1
104 ; ALL-NEXT:    vpackuswb %ymm3, %ymm1, %ymm1
105 ; ALL-NEXT:    retq
106   %shift = ashr <64 x i8> %a, %b
107   ret <64 x i8> %shift
108 }
109
110 ;
111 ; Uniform Variable Shifts
112 ;
113
114 define <8 x i64> @splatvar_shift_v8i64(<8 x i64> %a, <8 x i64> %b) nounwind {
115 ; ALL-LABEL: splatvar_shift_v8i64:
116 ; ALL:       ## BB#0:
117 ; ALL-NEXT:    vpsraq %xmm1, %zmm0, %zmm0
118 ; ALL-NEXT:    retq
119   %splat = shufflevector <8 x i64> %b, <8 x i64> undef, <8 x i32> zeroinitializer
120   %shift = ashr <8 x i64> %a, %splat
121   ret <8 x i64> %shift
122 }
123
124 define <16 x i32> @splatvar_shift_v16i32(<16 x i32> %a, <16 x i32> %b) nounwind {
125 ; ALL-LABEL: splatvar_shift_v16i32:
126 ; ALL:       ## BB#0:
127 ; ALL-NEXT:    vxorps %xmm2, %xmm2, %xmm2
128 ; ALL-NEXT:    vmovss %xmm1, %xmm2, %xmm1
129 ; ALL-NEXT:    vpsrad %xmm1, %zmm0, %zmm0
130 ; ALL-NEXT:    retq
131   %splat = shufflevector <16 x i32> %b, <16 x i32> undef, <16 x i32> zeroinitializer
132   %shift = ashr <16 x i32> %a, %splat
133   ret <16 x i32> %shift
134 }
135
136 define <32 x i16> @splatvar_shift_v32i16(<32 x i16> %a, <32 x i16> %b) nounwind {
137 ; ALL-LABEL: splatvar_shift_v32i16:
138 ; ALL:       ## BB#0:
139 ; ALL-NEXT:    vmovd %xmm2, %eax
140 ; ALL-NEXT:    movzwl %ax, %eax
141 ; ALL-NEXT:    vmovd %eax, %xmm2
142 ; ALL-NEXT:    vpsraw %xmm2, %ymm0, %ymm0
143 ; ALL-NEXT:    vpsraw %xmm2, %ymm1, %ymm1
144 ; ALL-NEXT:    retq
145   %splat = shufflevector <32 x i16> %b, <32 x i16> undef, <32 x i32> zeroinitializer
146   %shift = ashr <32 x i16> %a, %splat
147   ret <32 x i16> %shift
148 }
149
150 define <64 x i8> @splatvar_shift_v64i8(<64 x i8> %a, <64 x i8> %b) nounwind {
151 ; ALL-LABEL: splatvar_shift_v64i8:
152 ; ALL:       ## BB#0:
153 ; ALL-NEXT:    vpbroadcastb %xmm2, %ymm2
154 ; ALL-NEXT:    vpsllw $5, %ymm2, %ymm2
155 ; ALL-NEXT:    vpunpckhbw {{.*#+}} ymm3 = ymm0[8],ymm2[8],ymm0[9],ymm2[9],ymm0[10],ymm2[10],ymm0[11],ymm2[11],ymm0[12],ymm2[12],ymm0[13],ymm2[13],ymm0[14],ymm2[14],ymm0[15],ymm2[15],ymm0[24],ymm2[24],ymm0[25],ymm2[25],ymm0[26],ymm2[26],ymm0[27],ymm2[27],ymm0[28],ymm2[28],ymm0[29],ymm2[29],ymm0[30],ymm2[30],ymm0[31],ymm2[31]
156 ; ALL-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]
157 ; ALL-NEXT:    vpsraw $4, %ymm4, %ymm5
158 ; ALL-NEXT:    vpblendvb %ymm3, %ymm5, %ymm4, %ymm4
159 ; ALL-NEXT:    vpsraw $2, %ymm4, %ymm5
160 ; ALL-NEXT:    vpaddw %ymm3, %ymm3, %ymm6
161 ; ALL-NEXT:    vpblendvb %ymm6, %ymm5, %ymm4, %ymm4
162 ; ALL-NEXT:    vpsraw $1, %ymm4, %ymm5
163 ; ALL-NEXT:    vpaddw %ymm6, %ymm6, %ymm7
164 ; ALL-NEXT:    vpblendvb %ymm7, %ymm5, %ymm4, %ymm4
165 ; ALL-NEXT:    vpsrlw $8, %ymm4, %ymm4
166 ; ALL-NEXT:    vpunpcklbw {{.*#+}} ymm2 = ymm0[0],ymm2[0],ymm0[1],ymm2[1],ymm0[2],ymm2[2],ymm0[3],ymm2[3],ymm0[4],ymm2[4],ymm0[5],ymm2[5],ymm0[6],ymm2[6],ymm0[7],ymm2[7],ymm0[16],ymm2[16],ymm0[17],ymm2[17],ymm0[18],ymm2[18],ymm0[19],ymm2[19],ymm0[20],ymm2[20],ymm0[21],ymm2[21],ymm0[22],ymm2[22],ymm0[23],ymm2[23]
167 ; ALL-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]
168 ; ALL-NEXT:    vpsraw $4, %ymm0, %ymm5
169 ; ALL-NEXT:    vpblendvb %ymm2, %ymm5, %ymm0, %ymm0
170 ; ALL-NEXT:    vpsraw $2, %ymm0, %ymm5
171 ; ALL-NEXT:    vpaddw %ymm2, %ymm2, %ymm8
172 ; ALL-NEXT:    vpblendvb %ymm8, %ymm5, %ymm0, %ymm0
173 ; ALL-NEXT:    vpsraw $1, %ymm0, %ymm5
174 ; ALL-NEXT:    vpaddw %ymm8, %ymm8, %ymm9
175 ; ALL-NEXT:    vpblendvb %ymm9, %ymm5, %ymm0, %ymm0
176 ; ALL-NEXT:    vpsrlw $8, %ymm0, %ymm0
177 ; ALL-NEXT:    vpackuswb %ymm4, %ymm0, %ymm0
178 ; ALL-NEXT:    vpunpckhbw {{.*#+}} ymm4 = ymm0[8],ymm1[8],ymm0[9],ymm1[9],ymm0[10],ymm1[10],ymm0[11],ymm1[11],ymm0[12],ymm1[12],ymm0[13],ymm1[13],ymm0[14],ymm1[14],ymm0[15],ymm1[15],ymm0[24],ymm1[24],ymm0[25],ymm1[25],ymm0[26],ymm1[26],ymm0[27],ymm1[27],ymm0[28],ymm1[28],ymm0[29],ymm1[29],ymm0[30],ymm1[30],ymm0[31],ymm1[31]
179 ; ALL-NEXT:    vpsraw $4, %ymm4, %ymm5
180 ; ALL-NEXT:    vpblendvb %ymm3, %ymm5, %ymm4, %ymm3
181 ; ALL-NEXT:    vpsraw $2, %ymm3, %ymm4
182 ; ALL-NEXT:    vpblendvb %ymm6, %ymm4, %ymm3, %ymm3
183 ; ALL-NEXT:    vpsraw $1, %ymm3, %ymm4
184 ; ALL-NEXT:    vpblendvb %ymm7, %ymm4, %ymm3, %ymm3
185 ; ALL-NEXT:    vpsrlw $8, %ymm3, %ymm3
186 ; ALL-NEXT:    vpunpcklbw {{.*#+}} ymm1 = ymm0[0],ymm1[0],ymm0[1],ymm1[1],ymm0[2],ymm1[2],ymm0[3],ymm1[3],ymm0[4],ymm1[4],ymm0[5],ymm1[5],ymm0[6],ymm1[6],ymm0[7],ymm1[7],ymm0[16],ymm1[16],ymm0[17],ymm1[17],ymm0[18],ymm1[18],ymm0[19],ymm1[19],ymm0[20],ymm1[20],ymm0[21],ymm1[21],ymm0[22],ymm1[22],ymm0[23],ymm1[23]
187 ; ALL-NEXT:    vpsraw $4, %ymm1, %ymm4
188 ; ALL-NEXT:    vpblendvb %ymm2, %ymm4, %ymm1, %ymm1
189 ; ALL-NEXT:    vpsraw $2, %ymm1, %ymm2
190 ; ALL-NEXT:    vpblendvb %ymm8, %ymm2, %ymm1, %ymm1
191 ; ALL-NEXT:    vpsraw $1, %ymm1, %ymm2
192 ; ALL-NEXT:    vpblendvb %ymm9, %ymm2, %ymm1, %ymm1
193 ; ALL-NEXT:    vpsrlw $8, %ymm1, %ymm1
194 ; ALL-NEXT:    vpackuswb %ymm3, %ymm1, %ymm1
195 ; ALL-NEXT:    retq
196   %splat = shufflevector <64 x i8> %b, <64 x i8> undef, <64 x i32> zeroinitializer
197   %shift = ashr <64 x i8> %a, %splat
198   ret <64 x i8> %shift
199 }
200
201 ;
202 ; Constant Shifts
203 ;
204
205 define <8 x i64> @constant_shift_v8i64(<8 x i64> %a) nounwind {
206 ; ALL-LABEL: constant_shift_v8i64:
207 ; ALL:       ## BB#0:
208 ; ALL-NEXT:    vpsravq {{.*}}(%rip), %zmm0, %zmm0
209 ; ALL-NEXT:    retq
210   %shift = ashr <8 x i64> %a, <i64 1, i64 7, i64 31, i64 62, i64 1, i64 7, i64 31, i64 62>
211   ret <8 x i64> %shift
212 }
213
214 define <16 x i32> @constant_shift_v16i32(<16 x i32> %a) nounwind {
215 ; ALL-LABEL: constant_shift_v16i32:
216 ; ALL:       ## BB#0:
217 ; ALL-NEXT:    vpsravd {{.*}}(%rip), %zmm0, %zmm0
218 ; ALL-NEXT:    retq
219   %shift = ashr <16 x i32> %a, <i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 8, i32 7, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 8, i32 7>
220   ret <16 x i32> %shift
221 }
222
223 define <32 x i16> @constant_shift_v32i16(<32 x i16> %a) nounwind {
224 ; ALL-LABEL: constant_shift_v32i16:
225 ; ALL:       ## BB#0:
226 ; ALL-NEXT:    vpxor %ymm2, %ymm2, %ymm2
227 ; ALL-NEXT:    vmovdqa {{.*#+}} ymm3 = [0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15]
228 ; ALL-NEXT:    vpunpckhwd {{.*#+}} ymm4 = ymm3[4],ymm2[4],ymm3[5],ymm2[5],ymm3[6],ymm2[6],ymm3[7],ymm2[7],ymm3[12],ymm2[12],ymm3[13],ymm2[13],ymm3[14],ymm2[14],ymm3[15],ymm2[15]
229 ; ALL-NEXT:    vpunpckhwd {{.*#+}} ymm5 = ymm0[4,4,5,5,6,6,7,7,12,12,13,13,14,14,15,15]
230 ; ALL-NEXT:    vpsravd %ymm4, %ymm5, %ymm5
231 ; ALL-NEXT:    vpsrld $16, %ymm5, %ymm5
232 ; ALL-NEXT:    vpunpcklwd {{.*#+}} ymm2 = ymm3[0],ymm2[0],ymm3[1],ymm2[1],ymm3[2],ymm2[2],ymm3[3],ymm2[3],ymm3[8],ymm2[8],ymm3[9],ymm2[9],ymm3[10],ymm2[10],ymm3[11],ymm2[11]
233 ; ALL-NEXT:    vpunpcklwd {{.*#+}} ymm0 = ymm0[0,0,1,1,2,2,3,3,8,8,9,9,10,10,11,11]
234 ; ALL-NEXT:    vpsravd %ymm2, %ymm0, %ymm0
235 ; ALL-NEXT:    vpsrld $16, %ymm0, %ymm0
236 ; ALL-NEXT:    vpackusdw %ymm5, %ymm0, %ymm0
237 ; ALL-NEXT:    vpunpckhwd {{.*#+}} ymm3 = ymm1[4,4,5,5,6,6,7,7,12,12,13,13,14,14,15,15]
238 ; ALL-NEXT:    vpsravd %ymm4, %ymm3, %ymm3
239 ; ALL-NEXT:    vpsrld $16, %ymm3, %ymm3
240 ; ALL-NEXT:    vpunpcklwd {{.*#+}} ymm1 = ymm1[0,0,1,1,2,2,3,3,8,8,9,9,10,10,11,11]
241 ; ALL-NEXT:    vpsravd %ymm2, %ymm1, %ymm1
242 ; ALL-NEXT:    vpsrld $16, %ymm1, %ymm1
243 ; ALL-NEXT:    vpackusdw %ymm3, %ymm1, %ymm1
244 ; ALL-NEXT:    retq
245   %shift = ashr <32 x i16> %a, <i16 0, i16 1, i16 2, i16 3, i16 4, i16 5, i16 6, i16 7, i16 8, i16 9, i16 10, i16 11, i16 12, i16 13, i16 14, i16 15, i16 0, i16 1, i16 2, i16 3, i16 4, i16 5, i16 6, i16 7, i16 8, i16 9, i16 10, i16 11, i16 12, i16 13, i16 14, i16 15>
246   ret <32 x i16> %shift
247 }
248
249 define <64 x i8> @constant_shift_v64i8(<64 x i8> %a) nounwind {
250 ; ALL-LABEL: constant_shift_v64i8:
251 ; ALL:       ## BB#0:
252 ; ALL-NEXT:    vmovdqa {{.*#+}} ymm2 = [0,1,2,3,4,5,6,7,7,6,5,4,3,2,1,0,0,1,2,3,4,5,6,7,7,6,5,4,3,2,1,0]
253 ; ALL-NEXT:    vpsllw $5, %ymm2, %ymm2
254 ; ALL-NEXT:    vpunpckhbw {{.*#+}} ymm3 = ymm0[8],ymm2[8],ymm0[9],ymm2[9],ymm0[10],ymm2[10],ymm0[11],ymm2[11],ymm0[12],ymm2[12],ymm0[13],ymm2[13],ymm0[14],ymm2[14],ymm0[15],ymm2[15],ymm0[24],ymm2[24],ymm0[25],ymm2[25],ymm0[26],ymm2[26],ymm0[27],ymm2[27],ymm0[28],ymm2[28],ymm0[29],ymm2[29],ymm0[30],ymm2[30],ymm0[31],ymm2[31]
255 ; ALL-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]
256 ; ALL-NEXT:    vpsraw $4, %ymm4, %ymm5
257 ; ALL-NEXT:    vpblendvb %ymm3, %ymm5, %ymm4, %ymm4
258 ; ALL-NEXT:    vpsraw $2, %ymm4, %ymm5
259 ; ALL-NEXT:    vpaddw %ymm3, %ymm3, %ymm6
260 ; ALL-NEXT:    vpblendvb %ymm6, %ymm5, %ymm4, %ymm4
261 ; ALL-NEXT:    vpsraw $1, %ymm4, %ymm5
262 ; ALL-NEXT:    vpaddw %ymm6, %ymm6, %ymm7
263 ; ALL-NEXT:    vpblendvb %ymm7, %ymm5, %ymm4, %ymm4
264 ; ALL-NEXT:    vpsrlw $8, %ymm4, %ymm4
265 ; ALL-NEXT:    vpunpcklbw {{.*#+}} ymm2 = ymm0[0],ymm2[0],ymm0[1],ymm2[1],ymm0[2],ymm2[2],ymm0[3],ymm2[3],ymm0[4],ymm2[4],ymm0[5],ymm2[5],ymm0[6],ymm2[6],ymm0[7],ymm2[7],ymm0[16],ymm2[16],ymm0[17],ymm2[17],ymm0[18],ymm2[18],ymm0[19],ymm2[19],ymm0[20],ymm2[20],ymm0[21],ymm2[21],ymm0[22],ymm2[22],ymm0[23],ymm2[23]
266 ; ALL-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]
267 ; ALL-NEXT:    vpsraw $4, %ymm0, %ymm5
268 ; ALL-NEXT:    vpblendvb %ymm2, %ymm5, %ymm0, %ymm0
269 ; ALL-NEXT:    vpsraw $2, %ymm0, %ymm5
270 ; ALL-NEXT:    vpaddw %ymm2, %ymm2, %ymm8
271 ; ALL-NEXT:    vpblendvb %ymm8, %ymm5, %ymm0, %ymm0
272 ; ALL-NEXT:    vpsraw $1, %ymm0, %ymm5
273 ; ALL-NEXT:    vpaddw %ymm8, %ymm8, %ymm9
274 ; ALL-NEXT:    vpblendvb %ymm9, %ymm5, %ymm0, %ymm0
275 ; ALL-NEXT:    vpsrlw $8, %ymm0, %ymm0
276 ; ALL-NEXT:    vpackuswb %ymm4, %ymm0, %ymm0
277 ; ALL-NEXT:    vpunpckhbw {{.*#+}} ymm4 = ymm0[8],ymm1[8],ymm0[9],ymm1[9],ymm0[10],ymm1[10],ymm0[11],ymm1[11],ymm0[12],ymm1[12],ymm0[13],ymm1[13],ymm0[14],ymm1[14],ymm0[15],ymm1[15],ymm0[24],ymm1[24],ymm0[25],ymm1[25],ymm0[26],ymm1[26],ymm0[27],ymm1[27],ymm0[28],ymm1[28],ymm0[29],ymm1[29],ymm0[30],ymm1[30],ymm0[31],ymm1[31]
278 ; ALL-NEXT:    vpsraw $4, %ymm4, %ymm5
279 ; ALL-NEXT:    vpblendvb %ymm3, %ymm5, %ymm4, %ymm3
280 ; ALL-NEXT:    vpsraw $2, %ymm3, %ymm4
281 ; ALL-NEXT:    vpblendvb %ymm6, %ymm4, %ymm3, %ymm3
282 ; ALL-NEXT:    vpsraw $1, %ymm3, %ymm4
283 ; ALL-NEXT:    vpblendvb %ymm7, %ymm4, %ymm3, %ymm3
284 ; ALL-NEXT:    vpsrlw $8, %ymm3, %ymm3
285 ; ALL-NEXT:    vpunpcklbw {{.*#+}} ymm1 = ymm0[0],ymm1[0],ymm0[1],ymm1[1],ymm0[2],ymm1[2],ymm0[3],ymm1[3],ymm0[4],ymm1[4],ymm0[5],ymm1[5],ymm0[6],ymm1[6],ymm0[7],ymm1[7],ymm0[16],ymm1[16],ymm0[17],ymm1[17],ymm0[18],ymm1[18],ymm0[19],ymm1[19],ymm0[20],ymm1[20],ymm0[21],ymm1[21],ymm0[22],ymm1[22],ymm0[23],ymm1[23]
286 ; ALL-NEXT:    vpsraw $4, %ymm1, %ymm4
287 ; ALL-NEXT:    vpblendvb %ymm2, %ymm4, %ymm1, %ymm1
288 ; ALL-NEXT:    vpsraw $2, %ymm1, %ymm2
289 ; ALL-NEXT:    vpblendvb %ymm8, %ymm2, %ymm1, %ymm1
290 ; ALL-NEXT:    vpsraw $1, %ymm1, %ymm2
291 ; ALL-NEXT:    vpblendvb %ymm9, %ymm2, %ymm1, %ymm1
292 ; ALL-NEXT:    vpsrlw $8, %ymm1, %ymm1
293 ; ALL-NEXT:    vpackuswb %ymm3, %ymm1, %ymm1
294 ; ALL-NEXT:    retq
295   %shift = ashr <64 x i8> %a, <i8 0, i8 1, i8 2, i8 3, i8 4, i8 5, i8 6, i8 7, i8 7, i8 6, i8 5, i8 4, i8 3, i8 2, i8 1, i8 0, i8 0, i8 1, i8 2, i8 3, i8 4, i8 5, i8 6, i8 7, i8 7, i8 6, i8 5, i8 4, i8 3, i8 2, i8 1, i8 0, i8 0, i8 1, i8 2, i8 3, i8 4, i8 5, i8 6, i8 7, i8 7, i8 6, i8 5, i8 4, i8 3, i8 2, i8 1, i8 0, i8 0, i8 1, i8 2, i8 3, i8 4, i8 5, i8 6, i8 7, i8 7, i8 6, i8 5, i8 4, i8 3, i8 2, i8 1, i8 0>
296   ret <64 x i8> %shift
297 }
298
299 ;
300 ; Uniform Constant Shifts
301 ;
302
303 define <8 x i64> @splatconstant_shift_v8i64(<8 x i64> %a) nounwind {
304 ; ALL-LABEL: splatconstant_shift_v8i64:
305 ; ALL:       ## BB#0:
306 ; ALL-NEXT:    vpsraq $7, %zmm0, %zmm0
307 ; ALL-NEXT:    retq
308   %shift = ashr <8 x i64> %a, <i64 7, i64 7, i64 7, i64 7, i64 7, i64 7, i64 7, i64 7>
309   ret <8 x i64> %shift
310 }
311
312 define <16 x i32> @splatconstant_shift_v16i32(<16 x i32> %a) nounwind {
313 ; ALL-LABEL: splatconstant_shift_v16i32:
314 ; ALL:       ## BB#0:
315 ; ALL-NEXT:    vpsrad $5, %zmm0, %zmm0
316 ; ALL-NEXT:    retq
317   %shift = ashr <16 x i32> %a, <i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5>
318   ret <16 x i32> %shift
319 }
320
321 define <32 x i16> @splatconstant_shift_v32i16(<32 x i16> %a) nounwind {
322 ; ALL-LABEL: splatconstant_shift_v32i16:
323 ; ALL:       ## BB#0:
324 ; ALL-NEXT:    vpsraw $3, %ymm0, %ymm0
325 ; ALL-NEXT:    vpsraw $3, %ymm1, %ymm1
326 ; ALL-NEXT:    retq
327   %shift = ashr <32 x i16> %a, <i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3>
328   ret <32 x i16> %shift
329 }
330
331 define <64 x i8> @splatconstant_shift_v64i8(<64 x i8> %a) nounwind {
332 ; ALL-LABEL: splatconstant_shift_v64i8:
333 ; ALL:       ## BB#0:
334 ; ALL-NEXT:    vpsrlw $3, %ymm0, %ymm0
335 ; ALL-NEXT:    vmovdqa {{.*#+}} ymm2 = [31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31]
336 ; ALL-NEXT:    vpand %ymm2, %ymm0, %ymm0
337 ; ALL-NEXT:    vmovdqa {{.*#+}} ymm3 = [16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16]
338 ; ALL-NEXT:    vpxor %ymm3, %ymm0, %ymm0
339 ; ALL-NEXT:    vpsubb %ymm3, %ymm0, %ymm0
340 ; ALL-NEXT:    vpsrlw $3, %ymm1, %ymm1
341 ; ALL-NEXT:    vpand %ymm2, %ymm1, %ymm1
342 ; ALL-NEXT:    vpxor %ymm3, %ymm1, %ymm1
343 ; ALL-NEXT:    vpsubb %ymm3, %ymm1, %ymm1
344 ; ALL-NEXT:    retq
345   %shift = ashr <64 x i8> %a, <i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3>
346   ret <64 x i8> %shift
347 }