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