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