1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc < %s -mtriple=x86_64-- -mattr=+sse2 | FileCheck %s --check-prefixes=SSE,SSE2
3 ; RUN: llc < %s -mtriple=x86_64-- -mattr=+sse4.2 | FileCheck %s --check-prefixes=SSE,SSE42
4 ; RUN: llc < %s -mtriple=x86_64-- -mattr=+avx2 | FileCheck %s --check-prefixes=AVX2
5 ; RUN: llc < %s -mtriple=x86_64-- -mattr=+avx512f | FileCheck %s --check-prefixes=AVX512,AVX512F
6 ; RUN: llc < %s -mtriple=x86_64-- -mattr=+avx512f,avx512vl | FileCheck %s --check-prefixes=AVX512,AVX512VL
8 define <4 x float> @fadd_v4f32(<4 x i1> %b, <4 x float> noundef %x, <4 x float> noundef %y) {
9 ; SSE2-LABEL: fadd_v4f32:
11 ; SSE2-NEXT: pslld $31, %xmm0
12 ; SSE2-NEXT: psrad $31, %xmm0
13 ; SSE2-NEXT: pand %xmm0, %xmm2
14 ; SSE2-NEXT: pandn {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
15 ; SSE2-NEXT: por %xmm2, %xmm0
16 ; SSE2-NEXT: addps %xmm1, %xmm0
19 ; SSE42-LABEL: fadd_v4f32:
21 ; SSE42-NEXT: pslld $31, %xmm0
22 ; SSE42-NEXT: movaps {{.*#+}} xmm3 = [-0.0E+0,-0.0E+0,-0.0E+0,-0.0E+0]
23 ; SSE42-NEXT: blendvps %xmm0, %xmm2, %xmm3
24 ; SSE42-NEXT: addps %xmm1, %xmm3
25 ; SSE42-NEXT: movaps %xmm3, %xmm0
28 ; AVX2-LABEL: fadd_v4f32:
30 ; AVX2-NEXT: vpslld $31, %xmm0, %xmm0
31 ; AVX2-NEXT: vbroadcastss {{.*#+}} xmm3 = [-0.0E+0,-0.0E+0,-0.0E+0,-0.0E+0]
32 ; AVX2-NEXT: vblendvps %xmm0, %xmm2, %xmm3, %xmm0
33 ; AVX2-NEXT: vaddps %xmm0, %xmm1, %xmm0
36 ; AVX512F-LABEL: fadd_v4f32:
38 ; AVX512F-NEXT: # kill: def $xmm2 killed $xmm2 def $zmm2
39 ; AVX512F-NEXT: vpslld $31, %xmm0, %xmm0
40 ; AVX512F-NEXT: vptestmd %zmm0, %zmm0, %k1
41 ; AVX512F-NEXT: vbroadcastss {{.*#+}} xmm0 = [-0.0E+0,-0.0E+0,-0.0E+0,-0.0E+0]
42 ; AVX512F-NEXT: vmovaps %zmm2, %zmm0 {%k1}
43 ; AVX512F-NEXT: vaddps %xmm0, %xmm1, %xmm0
44 ; AVX512F-NEXT: vzeroupper
47 ; AVX512VL-LABEL: fadd_v4f32:
49 ; AVX512VL-NEXT: vpslld $31, %xmm0, %xmm0
50 ; AVX512VL-NEXT: vptestmd %xmm0, %xmm0, %k1
51 ; AVX512VL-NEXT: vaddps %xmm2, %xmm1, %xmm1 {%k1}
52 ; AVX512VL-NEXT: vmovaps %xmm1, %xmm0
54 %s = select <4 x i1> %b, <4 x float> %y, <4 x float> <float -0.0, float -0.0, float -0.0, float -0.0>
55 %r = fadd <4 x float> %x, %s
59 define <8 x float> @fadd_v8f32_commute(<8 x i1> %b, <8 x float> noundef %x, <8 x float> noundef %y) {
60 ; SSE2-LABEL: fadd_v8f32_commute:
62 ; SSE2-NEXT: movdqa %xmm0, %xmm5
63 ; SSE2-NEXT: punpckhwd {{.*#+}} xmm5 = xmm5[4,4,5,5,6,6,7,7]
64 ; SSE2-NEXT: pslld $31, %xmm5
65 ; SSE2-NEXT: psrad $31, %xmm5
66 ; SSE2-NEXT: movdqa {{.*#+}} xmm6 = [-0.0E+0,-0.0E+0,-0.0E+0,-0.0E+0]
67 ; SSE2-NEXT: pand %xmm5, %xmm4
68 ; SSE2-NEXT: pandn %xmm6, %xmm5
69 ; SSE2-NEXT: por %xmm4, %xmm5
70 ; SSE2-NEXT: punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]
71 ; SSE2-NEXT: pslld $31, %xmm0
72 ; SSE2-NEXT: psrad $31, %xmm0
73 ; SSE2-NEXT: pand %xmm0, %xmm3
74 ; SSE2-NEXT: pandn %xmm6, %xmm0
75 ; SSE2-NEXT: por %xmm3, %xmm0
76 ; SSE2-NEXT: addps %xmm1, %xmm0
77 ; SSE2-NEXT: addps %xmm2, %xmm5
78 ; SSE2-NEXT: movaps %xmm5, %xmm1
81 ; SSE42-LABEL: fadd_v8f32_commute:
83 ; SSE42-NEXT: movdqa %xmm0, %xmm5
84 ; SSE42-NEXT: pmovzxwd {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero
85 ; SSE42-NEXT: pslld $31, %xmm0
86 ; SSE42-NEXT: movaps {{.*#+}} xmm6 = [-0.0E+0,-0.0E+0,-0.0E+0,-0.0E+0]
87 ; SSE42-NEXT: movaps %xmm6, %xmm7
88 ; SSE42-NEXT: blendvps %xmm0, %xmm3, %xmm7
89 ; SSE42-NEXT: punpckhwd {{.*#+}} xmm5 = xmm5[4,4,5,5,6,6,7,7]
90 ; SSE42-NEXT: pslld $31, %xmm5
91 ; SSE42-NEXT: movdqa %xmm5, %xmm0
92 ; SSE42-NEXT: blendvps %xmm0, %xmm4, %xmm6
93 ; SSE42-NEXT: addps %xmm1, %xmm7
94 ; SSE42-NEXT: addps %xmm2, %xmm6
95 ; SSE42-NEXT: movaps %xmm7, %xmm0
96 ; SSE42-NEXT: movaps %xmm6, %xmm1
99 ; AVX2-LABEL: fadd_v8f32_commute:
101 ; AVX2-NEXT: vpmovzxwd {{.*#+}} ymm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero
102 ; AVX2-NEXT: vpslld $31, %ymm0, %ymm0
103 ; AVX2-NEXT: vbroadcastss {{.*#+}} ymm3 = [-0.0E+0,-0.0E+0,-0.0E+0,-0.0E+0,-0.0E+0,-0.0E+0,-0.0E+0,-0.0E+0]
104 ; AVX2-NEXT: vblendvps %ymm0, %ymm2, %ymm3, %ymm0
105 ; AVX2-NEXT: vaddps %ymm1, %ymm0, %ymm0
108 ; AVX512F-LABEL: fadd_v8f32_commute:
110 ; AVX512F-NEXT: # kill: def $ymm2 killed $ymm2 def $zmm2
111 ; AVX512F-NEXT: vpmovsxwq %xmm0, %zmm0
112 ; AVX512F-NEXT: vpsllq $63, %zmm0, %zmm0
113 ; AVX512F-NEXT: vptestmq %zmm0, %zmm0, %k1
114 ; AVX512F-NEXT: vbroadcastss {{.*#+}} ymm0 = [-0.0E+0,-0.0E+0,-0.0E+0,-0.0E+0,-0.0E+0,-0.0E+0,-0.0E+0,-0.0E+0]
115 ; AVX512F-NEXT: vmovaps %zmm2, %zmm0 {%k1}
116 ; AVX512F-NEXT: vaddps %ymm1, %ymm0, %ymm0
119 ; AVX512VL-LABEL: fadd_v8f32_commute:
121 ; AVX512VL-NEXT: vpmovsxwd %xmm0, %ymm0
122 ; AVX512VL-NEXT: vpslld $31, %ymm0, %ymm0
123 ; AVX512VL-NEXT: vptestmd %ymm0, %ymm0, %k1
124 ; AVX512VL-NEXT: vaddps %ymm2, %ymm1, %ymm1 {%k1}
125 ; AVX512VL-NEXT: vmovaps %ymm1, %ymm0
126 ; AVX512VL-NEXT: retq
127 %s = select <8 x i1> %b, <8 x float> %y, <8 x float> <float -0.0, float -0.0, float -0.0, float -0.0, float -0.0, float -0.0, float -0.0, float -0.0>
128 %r = fadd <8 x float> %s, %x
132 define <16 x float> @fadd_v16f32_swap(<16 x i1> %b, <16 x float> noundef %x, <16 x float> noundef %y) {
133 ; SSE2-LABEL: fadd_v16f32_swap:
135 ; SSE2-NEXT: movdqa %xmm0, %xmm10
136 ; SSE2-NEXT: punpckhbw {{.*#+}} xmm10 = xmm10[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]
137 ; SSE2-NEXT: movdqa %xmm10, %xmm8
138 ; SSE2-NEXT: punpckhwd {{.*#+}} xmm8 = xmm8[4,4,5,5,6,6,7,7]
139 ; SSE2-NEXT: pslld $31, %xmm8
140 ; SSE2-NEXT: movdqa %xmm8, %xmm9
141 ; SSE2-NEXT: psrad $31, %xmm9
142 ; SSE2-NEXT: pandn {{[0-9]+}}(%rsp), %xmm9
143 ; SSE2-NEXT: por %xmm8, %xmm9
144 ; SSE2-NEXT: punpcklwd {{.*#+}} xmm10 = xmm10[0,0,1,1,2,2,3,3]
145 ; SSE2-NEXT: pslld $31, %xmm10
146 ; SSE2-NEXT: movdqa %xmm10, %xmm8
147 ; SSE2-NEXT: psrad $31, %xmm8
148 ; SSE2-NEXT: pandn %xmm7, %xmm8
149 ; SSE2-NEXT: por %xmm10, %xmm8
150 ; SSE2-NEXT: punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
151 ; SSE2-NEXT: movdqa %xmm0, %xmm10
152 ; SSE2-NEXT: punpckhwd {{.*#+}} xmm10 = xmm10[4,4,5,5,6,6,7,7]
153 ; SSE2-NEXT: pslld $31, %xmm10
154 ; SSE2-NEXT: movdqa %xmm10, %xmm7
155 ; SSE2-NEXT: psrad $31, %xmm7
156 ; SSE2-NEXT: pandn %xmm6, %xmm7
157 ; SSE2-NEXT: por %xmm10, %xmm7
158 ; SSE2-NEXT: punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]
159 ; SSE2-NEXT: pslld $31, %xmm0
160 ; SSE2-NEXT: movdqa %xmm0, %xmm6
161 ; SSE2-NEXT: psrad $31, %xmm6
162 ; SSE2-NEXT: pandn %xmm5, %xmm6
163 ; SSE2-NEXT: por %xmm6, %xmm0
164 ; SSE2-NEXT: addps %xmm1, %xmm0
165 ; SSE2-NEXT: addps %xmm2, %xmm7
166 ; SSE2-NEXT: addps %xmm3, %xmm8
167 ; SSE2-NEXT: addps %xmm4, %xmm9
168 ; SSE2-NEXT: movaps %xmm7, %xmm1
169 ; SSE2-NEXT: movaps %xmm8, %xmm2
170 ; SSE2-NEXT: movaps %xmm9, %xmm3
173 ; SSE42-LABEL: fadd_v16f32_swap:
175 ; SSE42-NEXT: movaps %xmm3, %xmm8
176 ; SSE42-NEXT: movdqa %xmm0, %xmm9
177 ; SSE42-NEXT: movaps {{[0-9]+}}(%rsp), %xmm3
178 ; SSE42-NEXT: pshufd {{.*#+}} xmm0 = xmm0[3,3,3,3]
179 ; SSE42-NEXT: pmovzxbd {{.*#+}} xmm0 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero
180 ; SSE42-NEXT: pslld $31, %xmm0
181 ; SSE42-NEXT: movaps {{.*#+}} xmm10 = [-0.0E+0,-0.0E+0,-0.0E+0,-0.0E+0]
182 ; SSE42-NEXT: blendvps %xmm0, %xmm10, %xmm3
183 ; SSE42-NEXT: pshufd {{.*#+}} xmm0 = xmm9[2,3,2,3]
184 ; SSE42-NEXT: pmovzxbd {{.*#+}} xmm0 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero
185 ; SSE42-NEXT: pslld $31, %xmm0
186 ; SSE42-NEXT: blendvps %xmm0, %xmm10, %xmm7
187 ; SSE42-NEXT: pshufd {{.*#+}} xmm0 = xmm9[1,1,1,1]
188 ; SSE42-NEXT: pmovzxbd {{.*#+}} xmm0 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero
189 ; SSE42-NEXT: pslld $31, %xmm0
190 ; SSE42-NEXT: blendvps %xmm0, %xmm10, %xmm6
191 ; SSE42-NEXT: pmovzxbd {{.*#+}} xmm0 = xmm9[0],zero,zero,zero,xmm9[1],zero,zero,zero,xmm9[2],zero,zero,zero,xmm9[3],zero,zero,zero
192 ; SSE42-NEXT: pslld $31, %xmm0
193 ; SSE42-NEXT: blendvps %xmm0, %xmm10, %xmm5
194 ; SSE42-NEXT: addps %xmm1, %xmm5
195 ; SSE42-NEXT: addps %xmm2, %xmm6
196 ; SSE42-NEXT: addps %xmm8, %xmm7
197 ; SSE42-NEXT: addps %xmm4, %xmm3
198 ; SSE42-NEXT: movaps %xmm5, %xmm0
199 ; SSE42-NEXT: movaps %xmm6, %xmm1
200 ; SSE42-NEXT: movaps %xmm7, %xmm2
203 ; AVX2-LABEL: fadd_v16f32_swap:
205 ; AVX2-NEXT: vpmovzxbd {{.*#+}} ymm5 = 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
206 ; AVX2-NEXT: vpslld $31, %ymm5, %ymm5
207 ; AVX2-NEXT: vbroadcastss {{.*#+}} ymm6 = [-0.0E+0,-0.0E+0,-0.0E+0,-0.0E+0,-0.0E+0,-0.0E+0,-0.0E+0,-0.0E+0]
208 ; AVX2-NEXT: vblendvps %ymm5, %ymm6, %ymm3, %ymm3
209 ; AVX2-NEXT: vpunpckhbw {{.*#+}} xmm0 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]
210 ; AVX2-NEXT: vpmovzxwd {{.*#+}} ymm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero
211 ; AVX2-NEXT: vpslld $31, %ymm0, %ymm0
212 ; AVX2-NEXT: vblendvps %ymm0, %ymm6, %ymm4, %ymm4
213 ; AVX2-NEXT: vaddps %ymm3, %ymm1, %ymm0
214 ; AVX2-NEXT: vaddps %ymm4, %ymm2, %ymm1
217 ; AVX512-LABEL: fadd_v16f32_swap:
219 ; AVX512-NEXT: vpmovsxbd %xmm0, %zmm0
220 ; AVX512-NEXT: vpslld $31, %zmm0, %zmm0
221 ; AVX512-NEXT: vptestmd %zmm0, %zmm0, %k1
222 ; AVX512-NEXT: vaddps %zmm2, %zmm1, %zmm0
223 ; AVX512-NEXT: vmovaps %zmm1, %zmm0 {%k1}
225 %s = select <16 x i1> %b, <16 x float> <float -0.0, float -0.0, float -0.0, float -0.0, float -0.0, float -0.0, float -0.0, float -0.0, float -0.0, float -0.0, float -0.0, float -0.0, float -0.0, float -0.0, float -0.0, float -0.0>, <16 x float> %y
226 %r = fadd <16 x float> %x, %s
230 define <16 x float> @fadd_v16f32_commute_swap(<16 x i1> %b, <16 x float> noundef %x, <16 x float> noundef %y) {
231 ; SSE2-LABEL: fadd_v16f32_commute_swap:
233 ; SSE2-NEXT: movdqa %xmm0, %xmm10
234 ; SSE2-NEXT: punpckhbw {{.*#+}} xmm10 = xmm10[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]
235 ; SSE2-NEXT: movdqa %xmm10, %xmm8
236 ; SSE2-NEXT: punpckhwd {{.*#+}} xmm8 = xmm8[4,4,5,5,6,6,7,7]
237 ; SSE2-NEXT: pslld $31, %xmm8
238 ; SSE2-NEXT: movdqa %xmm8, %xmm9
239 ; SSE2-NEXT: psrad $31, %xmm9
240 ; SSE2-NEXT: pandn {{[0-9]+}}(%rsp), %xmm9
241 ; SSE2-NEXT: por %xmm8, %xmm9
242 ; SSE2-NEXT: punpcklwd {{.*#+}} xmm10 = xmm10[0,0,1,1,2,2,3,3]
243 ; SSE2-NEXT: pslld $31, %xmm10
244 ; SSE2-NEXT: movdqa %xmm10, %xmm8
245 ; SSE2-NEXT: psrad $31, %xmm8
246 ; SSE2-NEXT: pandn %xmm7, %xmm8
247 ; SSE2-NEXT: por %xmm10, %xmm8
248 ; SSE2-NEXT: punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
249 ; SSE2-NEXT: movdqa %xmm0, %xmm10
250 ; SSE2-NEXT: punpckhwd {{.*#+}} xmm10 = xmm10[4,4,5,5,6,6,7,7]
251 ; SSE2-NEXT: pslld $31, %xmm10
252 ; SSE2-NEXT: movdqa %xmm10, %xmm7
253 ; SSE2-NEXT: psrad $31, %xmm7
254 ; SSE2-NEXT: pandn %xmm6, %xmm7
255 ; SSE2-NEXT: por %xmm10, %xmm7
256 ; SSE2-NEXT: punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]
257 ; SSE2-NEXT: pslld $31, %xmm0
258 ; SSE2-NEXT: movdqa %xmm0, %xmm6
259 ; SSE2-NEXT: psrad $31, %xmm6
260 ; SSE2-NEXT: pandn %xmm5, %xmm6
261 ; SSE2-NEXT: por %xmm6, %xmm0
262 ; SSE2-NEXT: addps %xmm1, %xmm0
263 ; SSE2-NEXT: addps %xmm2, %xmm7
264 ; SSE2-NEXT: addps %xmm3, %xmm8
265 ; SSE2-NEXT: addps %xmm4, %xmm9
266 ; SSE2-NEXT: movaps %xmm7, %xmm1
267 ; SSE2-NEXT: movaps %xmm8, %xmm2
268 ; SSE2-NEXT: movaps %xmm9, %xmm3
271 ; SSE42-LABEL: fadd_v16f32_commute_swap:
273 ; SSE42-NEXT: movaps %xmm3, %xmm8
274 ; SSE42-NEXT: movdqa %xmm0, %xmm9
275 ; SSE42-NEXT: movaps {{[0-9]+}}(%rsp), %xmm3
276 ; SSE42-NEXT: pshufd {{.*#+}} xmm0 = xmm0[3,3,3,3]
277 ; SSE42-NEXT: pmovzxbd {{.*#+}} xmm0 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero
278 ; SSE42-NEXT: pslld $31, %xmm0
279 ; SSE42-NEXT: movaps {{.*#+}} xmm10 = [-0.0E+0,-0.0E+0,-0.0E+0,-0.0E+0]
280 ; SSE42-NEXT: blendvps %xmm0, %xmm10, %xmm3
281 ; SSE42-NEXT: pshufd {{.*#+}} xmm0 = xmm9[2,3,2,3]
282 ; SSE42-NEXT: pmovzxbd {{.*#+}} xmm0 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero
283 ; SSE42-NEXT: pslld $31, %xmm0
284 ; SSE42-NEXT: blendvps %xmm0, %xmm10, %xmm7
285 ; SSE42-NEXT: pshufd {{.*#+}} xmm0 = xmm9[1,1,1,1]
286 ; SSE42-NEXT: pmovzxbd {{.*#+}} xmm0 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero
287 ; SSE42-NEXT: pslld $31, %xmm0
288 ; SSE42-NEXT: blendvps %xmm0, %xmm10, %xmm6
289 ; SSE42-NEXT: pmovzxbd {{.*#+}} xmm0 = xmm9[0],zero,zero,zero,xmm9[1],zero,zero,zero,xmm9[2],zero,zero,zero,xmm9[3],zero,zero,zero
290 ; SSE42-NEXT: pslld $31, %xmm0
291 ; SSE42-NEXT: blendvps %xmm0, %xmm10, %xmm5
292 ; SSE42-NEXT: addps %xmm1, %xmm5
293 ; SSE42-NEXT: addps %xmm2, %xmm6
294 ; SSE42-NEXT: addps %xmm8, %xmm7
295 ; SSE42-NEXT: addps %xmm4, %xmm3
296 ; SSE42-NEXT: movaps %xmm5, %xmm0
297 ; SSE42-NEXT: movaps %xmm6, %xmm1
298 ; SSE42-NEXT: movaps %xmm7, %xmm2
301 ; AVX2-LABEL: fadd_v16f32_commute_swap:
303 ; AVX2-NEXT: vpmovzxbd {{.*#+}} ymm5 = 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
304 ; AVX2-NEXT: vpslld $31, %ymm5, %ymm5
305 ; AVX2-NEXT: vbroadcastss {{.*#+}} ymm6 = [-0.0E+0,-0.0E+0,-0.0E+0,-0.0E+0,-0.0E+0,-0.0E+0,-0.0E+0,-0.0E+0]
306 ; AVX2-NEXT: vblendvps %ymm5, %ymm6, %ymm3, %ymm3
307 ; AVX2-NEXT: vpunpckhbw {{.*#+}} xmm0 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]
308 ; AVX2-NEXT: vpmovzxwd {{.*#+}} ymm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero
309 ; AVX2-NEXT: vpslld $31, %ymm0, %ymm0
310 ; AVX2-NEXT: vblendvps %ymm0, %ymm6, %ymm4, %ymm4
311 ; AVX2-NEXT: vaddps %ymm1, %ymm3, %ymm0
312 ; AVX2-NEXT: vaddps %ymm2, %ymm4, %ymm1
315 ; AVX512-LABEL: fadd_v16f32_commute_swap:
317 ; AVX512-NEXT: vpmovsxbd %xmm0, %zmm0
318 ; AVX512-NEXT: vpslld $31, %zmm0, %zmm0
319 ; AVX512-NEXT: vptestmd %zmm0, %zmm0, %k1
320 ; AVX512-NEXT: vaddps %zmm2, %zmm1, %zmm0
321 ; AVX512-NEXT: vmovaps %zmm1, %zmm0 {%k1}
323 %s = select <16 x i1> %b, <16 x float> <float -0.0, float -0.0, float -0.0, float -0.0, float -0.0, float -0.0, float -0.0, float -0.0, float -0.0, float -0.0, float -0.0, float -0.0, float -0.0, float -0.0, float -0.0, float -0.0>, <16 x float> %y
324 %r = fadd <16 x float> %s, %x
328 define <4 x float> @fsub_v4f32(<4 x i1> %b, <4 x float> noundef %x, <4 x float> noundef %y) {
329 ; SSE-LABEL: fsub_v4f32:
331 ; SSE-NEXT: pslld $31, %xmm0
332 ; SSE-NEXT: psrad $31, %xmm0
333 ; SSE-NEXT: pand %xmm2, %xmm0
334 ; SSE-NEXT: subps %xmm0, %xmm1
335 ; SSE-NEXT: movaps %xmm1, %xmm0
338 ; AVX2-LABEL: fsub_v4f32:
340 ; AVX2-NEXT: vpslld $31, %xmm0, %xmm0
341 ; AVX2-NEXT: vpsrad $31, %xmm0, %xmm0
342 ; AVX2-NEXT: vpand %xmm2, %xmm0, %xmm0
343 ; AVX2-NEXT: vsubps %xmm0, %xmm1, %xmm0
346 ; AVX512F-LABEL: fsub_v4f32:
348 ; AVX512F-NEXT: # kill: def $xmm2 killed $xmm2 def $zmm2
349 ; AVX512F-NEXT: vpslld $31, %xmm0, %xmm0
350 ; AVX512F-NEXT: vptestmd %zmm0, %zmm0, %k1
351 ; AVX512F-NEXT: vmovaps %zmm2, %zmm0 {%k1} {z}
352 ; AVX512F-NEXT: vsubps %xmm0, %xmm1, %xmm0
353 ; AVX512F-NEXT: vzeroupper
356 ; AVX512VL-LABEL: fsub_v4f32:
358 ; AVX512VL-NEXT: vpslld $31, %xmm0, %xmm0
359 ; AVX512VL-NEXT: vptestmd %xmm0, %xmm0, %k1
360 ; AVX512VL-NEXT: vsubps %xmm2, %xmm1, %xmm1 {%k1}
361 ; AVX512VL-NEXT: vmovaps %xmm1, %xmm0
362 ; AVX512VL-NEXT: retq
363 %s = select <4 x i1> %b, <4 x float> %y, <4 x float> zeroinitializer
364 %r = fsub <4 x float> %x, %s
368 ; negative test - fsub is not commutative; there is no identity constant for operand 0
370 define <8 x float> @fsub_v8f32_commute(<8 x i1> %b, <8 x float> noundef %x, <8 x float> noundef %y) {
371 ; SSE2-LABEL: fsub_v8f32_commute:
373 ; SSE2-NEXT: movdqa %xmm0, %xmm5
374 ; SSE2-NEXT: punpckhwd {{.*#+}} xmm5 = xmm5[4,4,5,5,6,6,7,7]
375 ; SSE2-NEXT: pslld $31, %xmm5
376 ; SSE2-NEXT: psrad $31, %xmm5
377 ; SSE2-NEXT: pand %xmm4, %xmm5
378 ; SSE2-NEXT: punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]
379 ; SSE2-NEXT: pslld $31, %xmm0
380 ; SSE2-NEXT: psrad $31, %xmm0
381 ; SSE2-NEXT: pand %xmm3, %xmm0
382 ; SSE2-NEXT: subps %xmm1, %xmm0
383 ; SSE2-NEXT: subps %xmm2, %xmm5
384 ; SSE2-NEXT: movaps %xmm5, %xmm1
387 ; SSE42-LABEL: fsub_v8f32_commute:
389 ; SSE42-NEXT: movdqa %xmm0, %xmm5
390 ; SSE42-NEXT: pmovzxwd {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero
391 ; SSE42-NEXT: punpckhwd {{.*#+}} xmm5 = xmm5[4,4,5,5,6,6,7,7]
392 ; SSE42-NEXT: pslld $31, %xmm5
393 ; SSE42-NEXT: psrad $31, %xmm5
394 ; SSE42-NEXT: pand %xmm4, %xmm5
395 ; SSE42-NEXT: pslld $31, %xmm0
396 ; SSE42-NEXT: psrad $31, %xmm0
397 ; SSE42-NEXT: pand %xmm3, %xmm0
398 ; SSE42-NEXT: subps %xmm1, %xmm0
399 ; SSE42-NEXT: subps %xmm2, %xmm5
400 ; SSE42-NEXT: movaps %xmm5, %xmm1
403 ; AVX2-LABEL: fsub_v8f32_commute:
405 ; AVX2-NEXT: vpmovzxwd {{.*#+}} ymm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero
406 ; AVX2-NEXT: vpslld $31, %ymm0, %ymm0
407 ; AVX2-NEXT: vpsrad $31, %ymm0, %ymm0
408 ; AVX2-NEXT: vpand %ymm2, %ymm0, %ymm0
409 ; AVX2-NEXT: vsubps %ymm1, %ymm0, %ymm0
412 ; AVX512F-LABEL: fsub_v8f32_commute:
414 ; AVX512F-NEXT: # kill: def $ymm2 killed $ymm2 def $zmm2
415 ; AVX512F-NEXT: vpmovsxwq %xmm0, %zmm0
416 ; AVX512F-NEXT: vpsllq $63, %zmm0, %zmm0
417 ; AVX512F-NEXT: vptestmq %zmm0, %zmm0, %k1
418 ; AVX512F-NEXT: vmovaps %zmm2, %zmm0 {%k1} {z}
419 ; AVX512F-NEXT: vsubps %ymm1, %ymm0, %ymm0
422 ; AVX512VL-LABEL: fsub_v8f32_commute:
424 ; AVX512VL-NEXT: vpmovsxwd %xmm0, %ymm0
425 ; AVX512VL-NEXT: vpslld $31, %ymm0, %ymm0
426 ; AVX512VL-NEXT: vptestmd %ymm0, %ymm0, %k1
427 ; AVX512VL-NEXT: vmovaps %ymm2, %ymm0 {%k1} {z}
428 ; AVX512VL-NEXT: vsubps %ymm1, %ymm0, %ymm0
429 ; AVX512VL-NEXT: retq
430 %s = select <8 x i1> %b, <8 x float> %y, <8 x float> zeroinitializer
431 %r = fsub <8 x float> %s, %x
435 define <16 x float> @fsub_v16f32_swap(<16 x i1> %b, <16 x float> noundef %x, <16 x float> noundef %y) {
436 ; SSE2-LABEL: fsub_v16f32_swap:
438 ; SSE2-NEXT: movdqa %xmm0, %xmm9
439 ; SSE2-NEXT: punpckhbw {{.*#+}} xmm9 = xmm9[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]
440 ; SSE2-NEXT: movdqa %xmm9, %xmm8
441 ; SSE2-NEXT: punpckhwd {{.*#+}} xmm8 = xmm8[4,4,5,5,6,6,7,7]
442 ; SSE2-NEXT: pslld $31, %xmm8
443 ; SSE2-NEXT: psrad $31, %xmm8
444 ; SSE2-NEXT: pandn {{[0-9]+}}(%rsp), %xmm8
445 ; SSE2-NEXT: punpcklwd {{.*#+}} xmm9 = xmm9[0,0,1,1,2,2,3,3]
446 ; SSE2-NEXT: pslld $31, %xmm9
447 ; SSE2-NEXT: psrad $31, %xmm9
448 ; SSE2-NEXT: pandn %xmm7, %xmm9
449 ; SSE2-NEXT: punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
450 ; SSE2-NEXT: movdqa %xmm0, %xmm7
451 ; SSE2-NEXT: punpckhwd {{.*#+}} xmm7 = xmm7[4,4,5,5,6,6,7,7]
452 ; SSE2-NEXT: pslld $31, %xmm7
453 ; SSE2-NEXT: psrad $31, %xmm7
454 ; SSE2-NEXT: pandn %xmm6, %xmm7
455 ; SSE2-NEXT: punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]
456 ; SSE2-NEXT: pslld $31, %xmm0
457 ; SSE2-NEXT: psrad $31, %xmm0
458 ; SSE2-NEXT: pandn %xmm5, %xmm0
459 ; SSE2-NEXT: subps %xmm0, %xmm1
460 ; SSE2-NEXT: subps %xmm7, %xmm2
461 ; SSE2-NEXT: subps %xmm9, %xmm3
462 ; SSE2-NEXT: subps %xmm8, %xmm4
463 ; SSE2-NEXT: movaps %xmm1, %xmm0
464 ; SSE2-NEXT: movaps %xmm2, %xmm1
465 ; SSE2-NEXT: movaps %xmm3, %xmm2
466 ; SSE2-NEXT: movaps %xmm4, %xmm3
469 ; SSE42-LABEL: fsub_v16f32_swap:
471 ; SSE42-NEXT: pshufd {{.*#+}} xmm8 = xmm0[2,3,2,3]
472 ; SSE42-NEXT: pmovzxbd {{.*#+}} xmm8 = xmm8[0],zero,zero,zero,xmm8[1],zero,zero,zero,xmm8[2],zero,zero,zero,xmm8[3],zero,zero,zero
473 ; SSE42-NEXT: pslld $31, %xmm8
474 ; SSE42-NEXT: psrad $31, %xmm8
475 ; SSE42-NEXT: pandn %xmm7, %xmm8
476 ; SSE42-NEXT: pshufd {{.*#+}} xmm7 = xmm0[1,1,1,1]
477 ; SSE42-NEXT: pmovzxbd {{.*#+}} xmm7 = xmm7[0],zero,zero,zero,xmm7[1],zero,zero,zero,xmm7[2],zero,zero,zero,xmm7[3],zero,zero,zero
478 ; SSE42-NEXT: pslld $31, %xmm7
479 ; SSE42-NEXT: psrad $31, %xmm7
480 ; SSE42-NEXT: pandn %xmm6, %xmm7
481 ; SSE42-NEXT: pmovzxbd {{.*#+}} xmm6 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero
482 ; SSE42-NEXT: pslld $31, %xmm6
483 ; SSE42-NEXT: psrad $31, %xmm6
484 ; SSE42-NEXT: pandn %xmm5, %xmm6
485 ; SSE42-NEXT: pshufd {{.*#+}} xmm0 = xmm0[3,3,3,3]
486 ; SSE42-NEXT: pmovzxbd {{.*#+}} xmm0 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero
487 ; SSE42-NEXT: pslld $31, %xmm0
488 ; SSE42-NEXT: psrad $31, %xmm0
489 ; SSE42-NEXT: pandn {{[0-9]+}}(%rsp), %xmm0
490 ; SSE42-NEXT: subps %xmm6, %xmm1
491 ; SSE42-NEXT: subps %xmm7, %xmm2
492 ; SSE42-NEXT: subps %xmm8, %xmm3
493 ; SSE42-NEXT: subps %xmm0, %xmm4
494 ; SSE42-NEXT: movaps %xmm1, %xmm0
495 ; SSE42-NEXT: movaps %xmm2, %xmm1
496 ; SSE42-NEXT: movaps %xmm3, %xmm2
497 ; SSE42-NEXT: movaps %xmm4, %xmm3
500 ; AVX2-LABEL: fsub_v16f32_swap:
502 ; AVX2-NEXT: vpunpckhbw {{.*#+}} xmm5 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]
503 ; AVX2-NEXT: vpmovzxwd {{.*#+}} ymm5 = xmm5[0],zero,xmm5[1],zero,xmm5[2],zero,xmm5[3],zero,xmm5[4],zero,xmm5[5],zero,xmm5[6],zero,xmm5[7],zero
504 ; AVX2-NEXT: vpslld $31, %ymm5, %ymm5
505 ; AVX2-NEXT: vpsrad $31, %ymm5, %ymm5
506 ; AVX2-NEXT: vpandn %ymm4, %ymm5, %ymm4
507 ; AVX2-NEXT: vpmovzxbd {{.*#+}} ymm0 = 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
508 ; AVX2-NEXT: vpslld $31, %ymm0, %ymm0
509 ; AVX2-NEXT: vpsrad $31, %ymm0, %ymm0
510 ; AVX2-NEXT: vpandn %ymm3, %ymm0, %ymm0
511 ; AVX2-NEXT: vsubps %ymm0, %ymm1, %ymm0
512 ; AVX2-NEXT: vsubps %ymm4, %ymm2, %ymm1
515 ; AVX512-LABEL: fsub_v16f32_swap:
517 ; AVX512-NEXT: vpmovsxbd %xmm0, %zmm0
518 ; AVX512-NEXT: vpslld $31, %zmm0, %zmm0
519 ; AVX512-NEXT: vptestmd %zmm0, %zmm0, %k1
520 ; AVX512-NEXT: vsubps %zmm2, %zmm1, %zmm0
521 ; AVX512-NEXT: vmovaps %zmm1, %zmm0 {%k1}
523 %s = select <16 x i1> %b, <16 x float> zeroinitializer, <16 x float> %y
524 %r = fsub <16 x float> %x, %s
528 ; negative test - fsub is not commutative; there is no identity constant for operand 0
530 define <16 x float> @fsub_v16f32_commute_swap(<16 x i1> %b, <16 x float> noundef %x, <16 x float> noundef %y) {
531 ; SSE2-LABEL: fsub_v16f32_commute_swap:
533 ; SSE2-NEXT: movaps %xmm2, %xmm8
534 ; SSE2-NEXT: movdqa %xmm0, %xmm2
535 ; SSE2-NEXT: punpckhbw {{.*#+}} xmm2 = xmm2[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]
536 ; SSE2-NEXT: movdqa %xmm2, %xmm9
537 ; SSE2-NEXT: punpckhwd {{.*#+}} xmm9 = xmm9[4,4,5,5,6,6,7,7]
538 ; SSE2-NEXT: pslld $31, %xmm9
539 ; SSE2-NEXT: psrad $31, %xmm9
540 ; SSE2-NEXT: pandn {{[0-9]+}}(%rsp), %xmm9
541 ; SSE2-NEXT: punpcklwd {{.*#+}} xmm2 = xmm2[0,0,1,1,2,2,3,3]
542 ; SSE2-NEXT: pslld $31, %xmm2
543 ; SSE2-NEXT: psrad $31, %xmm2
544 ; SSE2-NEXT: pandn %xmm7, %xmm2
545 ; SSE2-NEXT: punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
546 ; SSE2-NEXT: movdqa %xmm0, %xmm7
547 ; SSE2-NEXT: punpckhwd {{.*#+}} xmm7 = xmm7[4,4,5,5,6,6,7,7]
548 ; SSE2-NEXT: pslld $31, %xmm7
549 ; SSE2-NEXT: psrad $31, %xmm7
550 ; SSE2-NEXT: pandn %xmm6, %xmm7
551 ; SSE2-NEXT: punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]
552 ; SSE2-NEXT: pslld $31, %xmm0
553 ; SSE2-NEXT: psrad $31, %xmm0
554 ; SSE2-NEXT: pandn %xmm5, %xmm0
555 ; SSE2-NEXT: subps %xmm1, %xmm0
556 ; SSE2-NEXT: subps %xmm8, %xmm7
557 ; SSE2-NEXT: subps %xmm3, %xmm2
558 ; SSE2-NEXT: subps %xmm4, %xmm9
559 ; SSE2-NEXT: movaps %xmm7, %xmm1
560 ; SSE2-NEXT: movaps %xmm9, %xmm3
563 ; SSE42-LABEL: fsub_v16f32_commute_swap:
565 ; SSE42-NEXT: movaps %xmm2, %xmm8
566 ; SSE42-NEXT: pshufd {{.*#+}} xmm2 = xmm0[2,3,2,3]
567 ; SSE42-NEXT: pmovzxbd {{.*#+}} xmm2 = xmm2[0],zero,zero,zero,xmm2[1],zero,zero,zero,xmm2[2],zero,zero,zero,xmm2[3],zero,zero,zero
568 ; SSE42-NEXT: pslld $31, %xmm2
569 ; SSE42-NEXT: psrad $31, %xmm2
570 ; SSE42-NEXT: pandn %xmm7, %xmm2
571 ; SSE42-NEXT: pshufd {{.*#+}} xmm7 = xmm0[1,1,1,1]
572 ; SSE42-NEXT: pmovzxbd {{.*#+}} xmm7 = xmm7[0],zero,zero,zero,xmm7[1],zero,zero,zero,xmm7[2],zero,zero,zero,xmm7[3],zero,zero,zero
573 ; SSE42-NEXT: pslld $31, %xmm7
574 ; SSE42-NEXT: psrad $31, %xmm7
575 ; SSE42-NEXT: pandn %xmm6, %xmm7
576 ; SSE42-NEXT: pmovzxbd {{.*#+}} xmm6 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero
577 ; SSE42-NEXT: pslld $31, %xmm6
578 ; SSE42-NEXT: psrad $31, %xmm6
579 ; SSE42-NEXT: pandn %xmm5, %xmm6
580 ; SSE42-NEXT: pshufd {{.*#+}} xmm0 = xmm0[3,3,3,3]
581 ; SSE42-NEXT: pmovzxbd {{.*#+}} xmm5 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero
582 ; SSE42-NEXT: pslld $31, %xmm5
583 ; SSE42-NEXT: psrad $31, %xmm5
584 ; SSE42-NEXT: pandn {{[0-9]+}}(%rsp), %xmm5
585 ; SSE42-NEXT: subps %xmm1, %xmm6
586 ; SSE42-NEXT: subps %xmm8, %xmm7
587 ; SSE42-NEXT: subps %xmm3, %xmm2
588 ; SSE42-NEXT: subps %xmm4, %xmm5
589 ; SSE42-NEXT: movaps %xmm6, %xmm0
590 ; SSE42-NEXT: movaps %xmm7, %xmm1
591 ; SSE42-NEXT: movaps %xmm5, %xmm3
594 ; AVX2-LABEL: fsub_v16f32_commute_swap:
596 ; AVX2-NEXT: vpunpckhbw {{.*#+}} xmm5 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]
597 ; AVX2-NEXT: vpmovzxwd {{.*#+}} ymm5 = xmm5[0],zero,xmm5[1],zero,xmm5[2],zero,xmm5[3],zero,xmm5[4],zero,xmm5[5],zero,xmm5[6],zero,xmm5[7],zero
598 ; AVX2-NEXT: vpslld $31, %ymm5, %ymm5
599 ; AVX2-NEXT: vpsrad $31, %ymm5, %ymm5
600 ; AVX2-NEXT: vpandn %ymm4, %ymm5, %ymm4
601 ; AVX2-NEXT: vpmovzxbd {{.*#+}} ymm0 = 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
602 ; AVX2-NEXT: vpslld $31, %ymm0, %ymm0
603 ; AVX2-NEXT: vpsrad $31, %ymm0, %ymm0
604 ; AVX2-NEXT: vpandn %ymm3, %ymm0, %ymm0
605 ; AVX2-NEXT: vsubps %ymm1, %ymm0, %ymm0
606 ; AVX2-NEXT: vsubps %ymm2, %ymm4, %ymm1
609 ; AVX512-LABEL: fsub_v16f32_commute_swap:
611 ; AVX512-NEXT: vpmovsxbd %xmm0, %zmm0
612 ; AVX512-NEXT: vpslld $31, %zmm0, %zmm0
613 ; AVX512-NEXT: vptestnmd %zmm0, %zmm0, %k1
614 ; AVX512-NEXT: vmovaps %zmm2, %zmm0 {%k1} {z}
615 ; AVX512-NEXT: vsubps %zmm1, %zmm0, %zmm0
617 %s = select <16 x i1> %b, <16 x float> zeroinitializer, <16 x float> %y
618 %r = fsub <16 x float> %s, %x
622 define <4 x float> @fmul_v4f32(<4 x i1> %b, <4 x float> noundef %x, <4 x float> noundef %y) {
623 ; SSE2-LABEL: fmul_v4f32:
625 ; SSE2-NEXT: pslld $31, %xmm0
626 ; SSE2-NEXT: psrad $31, %xmm0
627 ; SSE2-NEXT: pand %xmm0, %xmm2
628 ; SSE2-NEXT: pandn {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
629 ; SSE2-NEXT: por %xmm2, %xmm0
630 ; SSE2-NEXT: mulps %xmm1, %xmm0
633 ; SSE42-LABEL: fmul_v4f32:
635 ; SSE42-NEXT: pslld $31, %xmm0
636 ; SSE42-NEXT: movaps {{.*#+}} xmm3 = [1.0E+0,1.0E+0,1.0E+0,1.0E+0]
637 ; SSE42-NEXT: blendvps %xmm0, %xmm2, %xmm3
638 ; SSE42-NEXT: mulps %xmm1, %xmm3
639 ; SSE42-NEXT: movaps %xmm3, %xmm0
642 ; AVX2-LABEL: fmul_v4f32:
644 ; AVX2-NEXT: vpslld $31, %xmm0, %xmm0
645 ; AVX2-NEXT: vbroadcastss {{.*#+}} xmm3 = [1.0E+0,1.0E+0,1.0E+0,1.0E+0]
646 ; AVX2-NEXT: vblendvps %xmm0, %xmm2, %xmm3, %xmm0
647 ; AVX2-NEXT: vmulps %xmm0, %xmm1, %xmm0
650 ; AVX512F-LABEL: fmul_v4f32:
652 ; AVX512F-NEXT: # kill: def $xmm2 killed $xmm2 def $zmm2
653 ; AVX512F-NEXT: vpslld $31, %xmm0, %xmm0
654 ; AVX512F-NEXT: vptestmd %zmm0, %zmm0, %k1
655 ; AVX512F-NEXT: vbroadcastss {{.*#+}} xmm0 = [1.0E+0,1.0E+0,1.0E+0,1.0E+0]
656 ; AVX512F-NEXT: vmovaps %zmm2, %zmm0 {%k1}
657 ; AVX512F-NEXT: vmulps %xmm0, %xmm1, %xmm0
658 ; AVX512F-NEXT: vzeroupper
661 ; AVX512VL-LABEL: fmul_v4f32:
663 ; AVX512VL-NEXT: vpslld $31, %xmm0, %xmm0
664 ; AVX512VL-NEXT: vptestmd %xmm0, %xmm0, %k1
665 ; AVX512VL-NEXT: vmulps %xmm2, %xmm1, %xmm1 {%k1}
666 ; AVX512VL-NEXT: vmovaps %xmm1, %xmm0
667 ; AVX512VL-NEXT: retq
668 %s = select <4 x i1> %b, <4 x float> %y, <4 x float> <float 1.0, float 1.0, float 1.0, float 1.0>
669 %r = fmul <4 x float> %x, %s
673 define <8 x float> @fmul_v8f32_commute(<8 x i1> %b, <8 x float> noundef %x, <8 x float> noundef %y) {
674 ; SSE2-LABEL: fmul_v8f32_commute:
676 ; SSE2-NEXT: movdqa %xmm0, %xmm5
677 ; SSE2-NEXT: punpckhwd {{.*#+}} xmm5 = xmm5[4,4,5,5,6,6,7,7]
678 ; SSE2-NEXT: pslld $31, %xmm5
679 ; SSE2-NEXT: psrad $31, %xmm5
680 ; SSE2-NEXT: movdqa {{.*#+}} xmm6 = [1.0E+0,1.0E+0,1.0E+0,1.0E+0]
681 ; SSE2-NEXT: pand %xmm5, %xmm4
682 ; SSE2-NEXT: pandn %xmm6, %xmm5
683 ; SSE2-NEXT: por %xmm4, %xmm5
684 ; SSE2-NEXT: punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]
685 ; SSE2-NEXT: pslld $31, %xmm0
686 ; SSE2-NEXT: psrad $31, %xmm0
687 ; SSE2-NEXT: pand %xmm0, %xmm3
688 ; SSE2-NEXT: pandn %xmm6, %xmm0
689 ; SSE2-NEXT: por %xmm3, %xmm0
690 ; SSE2-NEXT: mulps %xmm1, %xmm0
691 ; SSE2-NEXT: mulps %xmm2, %xmm5
692 ; SSE2-NEXT: movaps %xmm5, %xmm1
695 ; SSE42-LABEL: fmul_v8f32_commute:
697 ; SSE42-NEXT: movdqa %xmm0, %xmm5
698 ; SSE42-NEXT: pmovzxwd {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero
699 ; SSE42-NEXT: pslld $31, %xmm0
700 ; SSE42-NEXT: movaps {{.*#+}} xmm6 = [1.0E+0,1.0E+0,1.0E+0,1.0E+0]
701 ; SSE42-NEXT: movaps %xmm6, %xmm7
702 ; SSE42-NEXT: blendvps %xmm0, %xmm3, %xmm7
703 ; SSE42-NEXT: punpckhwd {{.*#+}} xmm5 = xmm5[4,4,5,5,6,6,7,7]
704 ; SSE42-NEXT: pslld $31, %xmm5
705 ; SSE42-NEXT: movdqa %xmm5, %xmm0
706 ; SSE42-NEXT: blendvps %xmm0, %xmm4, %xmm6
707 ; SSE42-NEXT: mulps %xmm1, %xmm7
708 ; SSE42-NEXT: mulps %xmm2, %xmm6
709 ; SSE42-NEXT: movaps %xmm7, %xmm0
710 ; SSE42-NEXT: movaps %xmm6, %xmm1
713 ; AVX2-LABEL: fmul_v8f32_commute:
715 ; AVX2-NEXT: vpmovzxwd {{.*#+}} ymm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero
716 ; AVX2-NEXT: vpslld $31, %ymm0, %ymm0
717 ; AVX2-NEXT: vbroadcastss {{.*#+}} ymm3 = [1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0]
718 ; AVX2-NEXT: vblendvps %ymm0, %ymm2, %ymm3, %ymm0
719 ; AVX2-NEXT: vmulps %ymm1, %ymm0, %ymm0
722 ; AVX512F-LABEL: fmul_v8f32_commute:
724 ; AVX512F-NEXT: # kill: def $ymm2 killed $ymm2 def $zmm2
725 ; AVX512F-NEXT: vpmovsxwq %xmm0, %zmm0
726 ; AVX512F-NEXT: vpsllq $63, %zmm0, %zmm0
727 ; AVX512F-NEXT: vptestmq %zmm0, %zmm0, %k1
728 ; AVX512F-NEXT: vbroadcastss {{.*#+}} ymm0 = [1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0]
729 ; AVX512F-NEXT: vmovaps %zmm2, %zmm0 {%k1}
730 ; AVX512F-NEXT: vmulps %ymm1, %ymm0, %ymm0
733 ; AVX512VL-LABEL: fmul_v8f32_commute:
735 ; AVX512VL-NEXT: vpmovsxwd %xmm0, %ymm0
736 ; AVX512VL-NEXT: vpslld $31, %ymm0, %ymm0
737 ; AVX512VL-NEXT: vptestmd %ymm0, %ymm0, %k1
738 ; AVX512VL-NEXT: vmulps %ymm2, %ymm1, %ymm1 {%k1}
739 ; AVX512VL-NEXT: vmovaps %ymm1, %ymm0
740 ; AVX512VL-NEXT: retq
741 %s = select <8 x i1> %b, <8 x float> %y, <8 x float> <float 1.0, float 1.0, float 1.0, float 1.0, float 1.0, float 1.0, float 1.0, float 1.0>
742 %r = fmul <8 x float> %s, %x
746 define <16 x float> @fmul_v16f32_swap(<16 x i1> %b, <16 x float> noundef %x, <16 x float> noundef %y) {
747 ; SSE2-LABEL: fmul_v16f32_swap:
749 ; SSE2-NEXT: movaps %xmm2, %xmm8
750 ; SSE2-NEXT: movdqa %xmm0, %xmm2
751 ; SSE2-NEXT: punpckhbw {{.*#+}} xmm2 = xmm2[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]
752 ; SSE2-NEXT: movdqa %xmm2, %xmm10
753 ; SSE2-NEXT: punpckhwd {{.*#+}} xmm10 = xmm10[4,4,5,5,6,6,7,7]
754 ; SSE2-NEXT: pslld $31, %xmm10
755 ; SSE2-NEXT: psrad $31, %xmm10
756 ; SSE2-NEXT: movdqa {{.*#+}} xmm11 = [1.0E+0,1.0E+0,1.0E+0,1.0E+0]
757 ; SSE2-NEXT: movdqa %xmm11, %xmm9
758 ; SSE2-NEXT: pand %xmm10, %xmm9
759 ; SSE2-NEXT: pandn {{[0-9]+}}(%rsp), %xmm10
760 ; SSE2-NEXT: por %xmm9, %xmm10
761 ; SSE2-NEXT: punpcklwd {{.*#+}} xmm2 = xmm2[0,0,1,1,2,2,3,3]
762 ; SSE2-NEXT: pslld $31, %xmm2
763 ; SSE2-NEXT: psrad $31, %xmm2
764 ; SSE2-NEXT: movdqa %xmm11, %xmm9
765 ; SSE2-NEXT: pand %xmm2, %xmm9
766 ; SSE2-NEXT: pandn %xmm7, %xmm2
767 ; SSE2-NEXT: por %xmm9, %xmm2
768 ; SSE2-NEXT: punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
769 ; SSE2-NEXT: movdqa %xmm0, %xmm9
770 ; SSE2-NEXT: punpckhwd {{.*#+}} xmm9 = xmm9[4,4,5,5,6,6,7,7]
771 ; SSE2-NEXT: pslld $31, %xmm9
772 ; SSE2-NEXT: psrad $31, %xmm9
773 ; SSE2-NEXT: movdqa %xmm11, %xmm7
774 ; SSE2-NEXT: pand %xmm9, %xmm7
775 ; SSE2-NEXT: pandn %xmm6, %xmm9
776 ; SSE2-NEXT: por %xmm7, %xmm9
777 ; SSE2-NEXT: punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]
778 ; SSE2-NEXT: pslld $31, %xmm0
779 ; SSE2-NEXT: psrad $31, %xmm0
780 ; SSE2-NEXT: pand %xmm0, %xmm11
781 ; SSE2-NEXT: pandn %xmm5, %xmm0
782 ; SSE2-NEXT: por %xmm11, %xmm0
783 ; SSE2-NEXT: mulps %xmm1, %xmm0
784 ; SSE2-NEXT: mulps %xmm8, %xmm9
785 ; SSE2-NEXT: mulps %xmm3, %xmm2
786 ; SSE2-NEXT: mulps %xmm4, %xmm10
787 ; SSE2-NEXT: movaps %xmm9, %xmm1
788 ; SSE2-NEXT: movaps %xmm10, %xmm3
791 ; SSE42-LABEL: fmul_v16f32_swap:
793 ; SSE42-NEXT: movaps %xmm3, %xmm8
794 ; SSE42-NEXT: movdqa %xmm0, %xmm9
795 ; SSE42-NEXT: movaps {{[0-9]+}}(%rsp), %xmm3
796 ; SSE42-NEXT: pshufd {{.*#+}} xmm0 = xmm0[3,3,3,3]
797 ; SSE42-NEXT: pmovzxbd {{.*#+}} xmm0 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero
798 ; SSE42-NEXT: pslld $31, %xmm0
799 ; SSE42-NEXT: movaps {{.*#+}} xmm10 = [1.0E+0,1.0E+0,1.0E+0,1.0E+0]
800 ; SSE42-NEXT: blendvps %xmm0, %xmm10, %xmm3
801 ; SSE42-NEXT: pshufd {{.*#+}} xmm0 = xmm9[2,3,2,3]
802 ; SSE42-NEXT: pmovzxbd {{.*#+}} xmm0 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero
803 ; SSE42-NEXT: pslld $31, %xmm0
804 ; SSE42-NEXT: blendvps %xmm0, %xmm10, %xmm7
805 ; SSE42-NEXT: pshufd {{.*#+}} xmm0 = xmm9[1,1,1,1]
806 ; SSE42-NEXT: pmovzxbd {{.*#+}} xmm0 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero
807 ; SSE42-NEXT: pslld $31, %xmm0
808 ; SSE42-NEXT: blendvps %xmm0, %xmm10, %xmm6
809 ; SSE42-NEXT: pmovzxbd {{.*#+}} xmm0 = xmm9[0],zero,zero,zero,xmm9[1],zero,zero,zero,xmm9[2],zero,zero,zero,xmm9[3],zero,zero,zero
810 ; SSE42-NEXT: pslld $31, %xmm0
811 ; SSE42-NEXT: blendvps %xmm0, %xmm10, %xmm5
812 ; SSE42-NEXT: mulps %xmm1, %xmm5
813 ; SSE42-NEXT: mulps %xmm2, %xmm6
814 ; SSE42-NEXT: mulps %xmm8, %xmm7
815 ; SSE42-NEXT: mulps %xmm4, %xmm3
816 ; SSE42-NEXT: movaps %xmm5, %xmm0
817 ; SSE42-NEXT: movaps %xmm6, %xmm1
818 ; SSE42-NEXT: movaps %xmm7, %xmm2
821 ; AVX2-LABEL: fmul_v16f32_swap:
823 ; AVX2-NEXT: vpmovzxbd {{.*#+}} ymm5 = 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
824 ; AVX2-NEXT: vpslld $31, %ymm5, %ymm5
825 ; AVX2-NEXT: vbroadcastss {{.*#+}} ymm6 = [1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0]
826 ; AVX2-NEXT: vblendvps %ymm5, %ymm6, %ymm3, %ymm3
827 ; AVX2-NEXT: vpunpckhbw {{.*#+}} xmm0 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]
828 ; AVX2-NEXT: vpmovzxwd {{.*#+}} ymm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero
829 ; AVX2-NEXT: vpslld $31, %ymm0, %ymm0
830 ; AVX2-NEXT: vblendvps %ymm0, %ymm6, %ymm4, %ymm4
831 ; AVX2-NEXT: vmulps %ymm3, %ymm1, %ymm0
832 ; AVX2-NEXT: vmulps %ymm4, %ymm2, %ymm1
835 ; AVX512-LABEL: fmul_v16f32_swap:
837 ; AVX512-NEXT: vpmovsxbd %xmm0, %zmm0
838 ; AVX512-NEXT: vpslld $31, %zmm0, %zmm0
839 ; AVX512-NEXT: vptestmd %zmm0, %zmm0, %k1
840 ; AVX512-NEXT: vmulps %zmm2, %zmm1, %zmm0
841 ; AVX512-NEXT: vmovaps %zmm1, %zmm0 {%k1}
843 %s = select <16 x i1> %b, <16 x float> <float 1.0, float 1.0, float 1.0, float 1.0, float 1.0, float 1.0, float 1.0, float 1.0, float 1.0, float 1.0, float 1.0, float 1.0, float 1.0, float 1.0, float 1.0, float 1.0>, <16 x float> %y
844 %r = fmul <16 x float> %x, %s
848 define <16 x float> @fmul_v16f32_commute_swap(<16 x i1> %b, <16 x float> noundef %x, <16 x float> noundef %y) {
849 ; SSE2-LABEL: fmul_v16f32_commute_swap:
851 ; SSE2-NEXT: movaps %xmm2, %xmm8
852 ; SSE2-NEXT: movdqa %xmm0, %xmm2
853 ; SSE2-NEXT: punpckhbw {{.*#+}} xmm2 = xmm2[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]
854 ; SSE2-NEXT: movdqa %xmm2, %xmm10
855 ; SSE2-NEXT: punpckhwd {{.*#+}} xmm10 = xmm10[4,4,5,5,6,6,7,7]
856 ; SSE2-NEXT: pslld $31, %xmm10
857 ; SSE2-NEXT: psrad $31, %xmm10
858 ; SSE2-NEXT: movdqa {{.*#+}} xmm11 = [1.0E+0,1.0E+0,1.0E+0,1.0E+0]
859 ; SSE2-NEXT: movdqa %xmm11, %xmm9
860 ; SSE2-NEXT: pand %xmm10, %xmm9
861 ; SSE2-NEXT: pandn {{[0-9]+}}(%rsp), %xmm10
862 ; SSE2-NEXT: por %xmm9, %xmm10
863 ; SSE2-NEXT: punpcklwd {{.*#+}} xmm2 = xmm2[0,0,1,1,2,2,3,3]
864 ; SSE2-NEXT: pslld $31, %xmm2
865 ; SSE2-NEXT: psrad $31, %xmm2
866 ; SSE2-NEXT: movdqa %xmm11, %xmm9
867 ; SSE2-NEXT: pand %xmm2, %xmm9
868 ; SSE2-NEXT: pandn %xmm7, %xmm2
869 ; SSE2-NEXT: por %xmm9, %xmm2
870 ; SSE2-NEXT: punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
871 ; SSE2-NEXT: movdqa %xmm0, %xmm9
872 ; SSE2-NEXT: punpckhwd {{.*#+}} xmm9 = xmm9[4,4,5,5,6,6,7,7]
873 ; SSE2-NEXT: pslld $31, %xmm9
874 ; SSE2-NEXT: psrad $31, %xmm9
875 ; SSE2-NEXT: movdqa %xmm11, %xmm7
876 ; SSE2-NEXT: pand %xmm9, %xmm7
877 ; SSE2-NEXT: pandn %xmm6, %xmm9
878 ; SSE2-NEXT: por %xmm7, %xmm9
879 ; SSE2-NEXT: punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]
880 ; SSE2-NEXT: pslld $31, %xmm0
881 ; SSE2-NEXT: psrad $31, %xmm0
882 ; SSE2-NEXT: pand %xmm0, %xmm11
883 ; SSE2-NEXT: pandn %xmm5, %xmm0
884 ; SSE2-NEXT: por %xmm11, %xmm0
885 ; SSE2-NEXT: mulps %xmm1, %xmm0
886 ; SSE2-NEXT: mulps %xmm8, %xmm9
887 ; SSE2-NEXT: mulps %xmm3, %xmm2
888 ; SSE2-NEXT: mulps %xmm4, %xmm10
889 ; SSE2-NEXT: movaps %xmm9, %xmm1
890 ; SSE2-NEXT: movaps %xmm10, %xmm3
893 ; SSE42-LABEL: fmul_v16f32_commute_swap:
895 ; SSE42-NEXT: movaps %xmm3, %xmm8
896 ; SSE42-NEXT: movdqa %xmm0, %xmm9
897 ; SSE42-NEXT: movaps {{[0-9]+}}(%rsp), %xmm3
898 ; SSE42-NEXT: pshufd {{.*#+}} xmm0 = xmm0[3,3,3,3]
899 ; SSE42-NEXT: pmovzxbd {{.*#+}} xmm0 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero
900 ; SSE42-NEXT: pslld $31, %xmm0
901 ; SSE42-NEXT: movaps {{.*#+}} xmm10 = [1.0E+0,1.0E+0,1.0E+0,1.0E+0]
902 ; SSE42-NEXT: blendvps %xmm0, %xmm10, %xmm3
903 ; SSE42-NEXT: pshufd {{.*#+}} xmm0 = xmm9[2,3,2,3]
904 ; SSE42-NEXT: pmovzxbd {{.*#+}} xmm0 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero
905 ; SSE42-NEXT: pslld $31, %xmm0
906 ; SSE42-NEXT: blendvps %xmm0, %xmm10, %xmm7
907 ; SSE42-NEXT: pshufd {{.*#+}} xmm0 = xmm9[1,1,1,1]
908 ; SSE42-NEXT: pmovzxbd {{.*#+}} xmm0 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero
909 ; SSE42-NEXT: pslld $31, %xmm0
910 ; SSE42-NEXT: blendvps %xmm0, %xmm10, %xmm6
911 ; SSE42-NEXT: pmovzxbd {{.*#+}} xmm0 = xmm9[0],zero,zero,zero,xmm9[1],zero,zero,zero,xmm9[2],zero,zero,zero,xmm9[3],zero,zero,zero
912 ; SSE42-NEXT: pslld $31, %xmm0
913 ; SSE42-NEXT: blendvps %xmm0, %xmm10, %xmm5
914 ; SSE42-NEXT: mulps %xmm1, %xmm5
915 ; SSE42-NEXT: mulps %xmm2, %xmm6
916 ; SSE42-NEXT: mulps %xmm8, %xmm7
917 ; SSE42-NEXT: mulps %xmm4, %xmm3
918 ; SSE42-NEXT: movaps %xmm5, %xmm0
919 ; SSE42-NEXT: movaps %xmm6, %xmm1
920 ; SSE42-NEXT: movaps %xmm7, %xmm2
923 ; AVX2-LABEL: fmul_v16f32_commute_swap:
925 ; AVX2-NEXT: vpmovzxbd {{.*#+}} ymm5 = 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
926 ; AVX2-NEXT: vpslld $31, %ymm5, %ymm5
927 ; AVX2-NEXT: vbroadcastss {{.*#+}} ymm6 = [1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0]
928 ; AVX2-NEXT: vblendvps %ymm5, %ymm6, %ymm3, %ymm3
929 ; AVX2-NEXT: vpunpckhbw {{.*#+}} xmm0 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]
930 ; AVX2-NEXT: vpmovzxwd {{.*#+}} ymm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero
931 ; AVX2-NEXT: vpslld $31, %ymm0, %ymm0
932 ; AVX2-NEXT: vblendvps %ymm0, %ymm6, %ymm4, %ymm4
933 ; AVX2-NEXT: vmulps %ymm1, %ymm3, %ymm0
934 ; AVX2-NEXT: vmulps %ymm2, %ymm4, %ymm1
937 ; AVX512-LABEL: fmul_v16f32_commute_swap:
939 ; AVX512-NEXT: vpmovsxbd %xmm0, %zmm0
940 ; AVX512-NEXT: vpslld $31, %zmm0, %zmm0
941 ; AVX512-NEXT: vptestmd %zmm0, %zmm0, %k1
942 ; AVX512-NEXT: vmulps %zmm2, %zmm1, %zmm0
943 ; AVX512-NEXT: vmovaps %zmm1, %zmm0 {%k1}
945 %s = select <16 x i1> %b, <16 x float> <float 1.0, float 1.0, float 1.0, float 1.0, float 1.0, float 1.0, float 1.0, float 1.0, float 1.0, float 1.0, float 1.0, float 1.0, float 1.0, float 1.0, float 1.0, float 1.0>, <16 x float> %y
946 %r = fmul <16 x float> %s, %x
950 define <4 x float> @fdiv_v4f32(<4 x i1> %b, <4 x float> noundef %x, <4 x float> noundef %y) {
951 ; SSE2-LABEL: fdiv_v4f32:
953 ; SSE2-NEXT: pslld $31, %xmm0
954 ; SSE2-NEXT: psrad $31, %xmm0
955 ; SSE2-NEXT: pand %xmm0, %xmm2
956 ; SSE2-NEXT: pandn {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
957 ; SSE2-NEXT: por %xmm2, %xmm0
958 ; SSE2-NEXT: divps %xmm0, %xmm1
959 ; SSE2-NEXT: movaps %xmm1, %xmm0
962 ; SSE42-LABEL: fdiv_v4f32:
964 ; SSE42-NEXT: pslld $31, %xmm0
965 ; SSE42-NEXT: movaps {{.*#+}} xmm3 = [1.0E+0,1.0E+0,1.0E+0,1.0E+0]
966 ; SSE42-NEXT: blendvps %xmm0, %xmm2, %xmm3
967 ; SSE42-NEXT: divps %xmm3, %xmm1
968 ; SSE42-NEXT: movaps %xmm1, %xmm0
971 ; AVX2-LABEL: fdiv_v4f32:
973 ; AVX2-NEXT: vpslld $31, %xmm0, %xmm0
974 ; AVX2-NEXT: vbroadcastss {{.*#+}} xmm3 = [1.0E+0,1.0E+0,1.0E+0,1.0E+0]
975 ; AVX2-NEXT: vblendvps %xmm0, %xmm2, %xmm3, %xmm0
976 ; AVX2-NEXT: vdivps %xmm0, %xmm1, %xmm0
979 ; AVX512F-LABEL: fdiv_v4f32:
981 ; AVX512F-NEXT: # kill: def $xmm2 killed $xmm2 def $zmm2
982 ; AVX512F-NEXT: vpslld $31, %xmm0, %xmm0
983 ; AVX512F-NEXT: vptestmd %zmm0, %zmm0, %k1
984 ; AVX512F-NEXT: vbroadcastss {{.*#+}} xmm0 = [1.0E+0,1.0E+0,1.0E+0,1.0E+0]
985 ; AVX512F-NEXT: vmovaps %zmm2, %zmm0 {%k1}
986 ; AVX512F-NEXT: vdivps %xmm0, %xmm1, %xmm0
987 ; AVX512F-NEXT: vzeroupper
990 ; AVX512VL-LABEL: fdiv_v4f32:
992 ; AVX512VL-NEXT: vpslld $31, %xmm0, %xmm0
993 ; AVX512VL-NEXT: vptestmd %xmm0, %xmm0, %k1
994 ; AVX512VL-NEXT: vdivps %xmm2, %xmm1, %xmm1 {%k1}
995 ; AVX512VL-NEXT: vmovaps %xmm1, %xmm0
996 ; AVX512VL-NEXT: retq
997 %s = select <4 x i1> %b, <4 x float> %y, <4 x float> <float 1.0, float 1.0, float 1.0, float 1.0>
998 %r = fdiv <4 x float> %x, %s
1002 define <8 x float> @fdiv_v8f32_commute(<8 x i1> %b, <8 x float> noundef %x, <8 x float> noundef %y) {
1003 ; SSE2-LABEL: fdiv_v8f32_commute:
1005 ; SSE2-NEXT: movdqa %xmm0, %xmm5
1006 ; SSE2-NEXT: punpckhwd {{.*#+}} xmm5 = xmm5[4,4,5,5,6,6,7,7]
1007 ; SSE2-NEXT: pslld $31, %xmm5
1008 ; SSE2-NEXT: psrad $31, %xmm5
1009 ; SSE2-NEXT: movdqa {{.*#+}} xmm6 = [1.0E+0,1.0E+0,1.0E+0,1.0E+0]
1010 ; SSE2-NEXT: pand %xmm5, %xmm4
1011 ; SSE2-NEXT: pandn %xmm6, %xmm5
1012 ; SSE2-NEXT: por %xmm4, %xmm5
1013 ; SSE2-NEXT: punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]
1014 ; SSE2-NEXT: pslld $31, %xmm0
1015 ; SSE2-NEXT: psrad $31, %xmm0
1016 ; SSE2-NEXT: pand %xmm0, %xmm3
1017 ; SSE2-NEXT: pandn %xmm6, %xmm0
1018 ; SSE2-NEXT: por %xmm3, %xmm0
1019 ; SSE2-NEXT: divps %xmm1, %xmm0
1020 ; SSE2-NEXT: divps %xmm2, %xmm5
1021 ; SSE2-NEXT: movaps %xmm5, %xmm1
1024 ; SSE42-LABEL: fdiv_v8f32_commute:
1026 ; SSE42-NEXT: movdqa %xmm0, %xmm5
1027 ; SSE42-NEXT: pmovzxwd {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero
1028 ; SSE42-NEXT: pslld $31, %xmm0
1029 ; SSE42-NEXT: movaps {{.*#+}} xmm6 = [1.0E+0,1.0E+0,1.0E+0,1.0E+0]
1030 ; SSE42-NEXT: movaps %xmm6, %xmm7
1031 ; SSE42-NEXT: blendvps %xmm0, %xmm3, %xmm7
1032 ; SSE42-NEXT: punpckhwd {{.*#+}} xmm5 = xmm5[4,4,5,5,6,6,7,7]
1033 ; SSE42-NEXT: pslld $31, %xmm5
1034 ; SSE42-NEXT: movdqa %xmm5, %xmm0
1035 ; SSE42-NEXT: blendvps %xmm0, %xmm4, %xmm6
1036 ; SSE42-NEXT: divps %xmm1, %xmm7
1037 ; SSE42-NEXT: divps %xmm2, %xmm6
1038 ; SSE42-NEXT: movaps %xmm7, %xmm0
1039 ; SSE42-NEXT: movaps %xmm6, %xmm1
1042 ; AVX2-LABEL: fdiv_v8f32_commute:
1044 ; AVX2-NEXT: vpmovzxwd {{.*#+}} ymm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero
1045 ; AVX2-NEXT: vpslld $31, %ymm0, %ymm0
1046 ; AVX2-NEXT: vbroadcastss {{.*#+}} ymm3 = [1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0]
1047 ; AVX2-NEXT: vblendvps %ymm0, %ymm2, %ymm3, %ymm0
1048 ; AVX2-NEXT: vdivps %ymm1, %ymm0, %ymm0
1051 ; AVX512F-LABEL: fdiv_v8f32_commute:
1053 ; AVX512F-NEXT: # kill: def $ymm2 killed $ymm2 def $zmm2
1054 ; AVX512F-NEXT: vpmovsxwq %xmm0, %zmm0
1055 ; AVX512F-NEXT: vpsllq $63, %zmm0, %zmm0
1056 ; AVX512F-NEXT: vptestmq %zmm0, %zmm0, %k1
1057 ; AVX512F-NEXT: vbroadcastss {{.*#+}} ymm0 = [1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0]
1058 ; AVX512F-NEXT: vmovaps %zmm2, %zmm0 {%k1}
1059 ; AVX512F-NEXT: vdivps %ymm1, %ymm0, %ymm0
1060 ; AVX512F-NEXT: retq
1062 ; AVX512VL-LABEL: fdiv_v8f32_commute:
1063 ; AVX512VL: # %bb.0:
1064 ; AVX512VL-NEXT: vpmovsxwd %xmm0, %ymm0
1065 ; AVX512VL-NEXT: vpslld $31, %ymm0, %ymm0
1066 ; AVX512VL-NEXT: vptestmd %ymm0, %ymm0, %k1
1067 ; AVX512VL-NEXT: vbroadcastss {{.*#+}} ymm0 = [1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0]
1068 ; AVX512VL-NEXT: vmovaps %ymm2, %ymm0 {%k1}
1069 ; AVX512VL-NEXT: vdivps %ymm1, %ymm0, %ymm0
1070 ; AVX512VL-NEXT: retq
1071 %s = select <8 x i1> %b, <8 x float> %y, <8 x float> <float 1.0, float 1.0, float 1.0, float 1.0, float 1.0, float 1.0, float 1.0, float 1.0>
1072 %r = fdiv <8 x float> %s, %x
1076 define <16 x float> @fdiv_v16f32_swap(<16 x i1> %b, <16 x float> noundef %x, <16 x float> noundef %y) {
1077 ; SSE2-LABEL: fdiv_v16f32_swap:
1079 ; SSE2-NEXT: movdqa %xmm0, %xmm9
1080 ; SSE2-NEXT: punpckhbw {{.*#+}} xmm9 = xmm9[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]
1081 ; SSE2-NEXT: movdqa %xmm9, %xmm8
1082 ; SSE2-NEXT: punpckhwd {{.*#+}} xmm8 = xmm8[4,4,5,5,6,6,7,7]
1083 ; SSE2-NEXT: pslld $31, %xmm8
1084 ; SSE2-NEXT: psrad $31, %xmm8
1085 ; SSE2-NEXT: movdqa {{.*#+}} xmm10 = [1.0E+0,1.0E+0,1.0E+0,1.0E+0]
1086 ; SSE2-NEXT: movdqa %xmm10, %xmm11
1087 ; SSE2-NEXT: pand %xmm8, %xmm11
1088 ; SSE2-NEXT: pandn {{[0-9]+}}(%rsp), %xmm8
1089 ; SSE2-NEXT: por %xmm11, %xmm8
1090 ; SSE2-NEXT: punpcklwd {{.*#+}} xmm9 = xmm9[0,0,1,1,2,2,3,3]
1091 ; SSE2-NEXT: pslld $31, %xmm9
1092 ; SSE2-NEXT: psrad $31, %xmm9
1093 ; SSE2-NEXT: movdqa %xmm10, %xmm11
1094 ; SSE2-NEXT: pand %xmm9, %xmm11
1095 ; SSE2-NEXT: pandn %xmm7, %xmm9
1096 ; SSE2-NEXT: por %xmm11, %xmm9
1097 ; SSE2-NEXT: punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
1098 ; SSE2-NEXT: movdqa %xmm0, %xmm7
1099 ; SSE2-NEXT: punpckhwd {{.*#+}} xmm7 = xmm7[4,4,5,5,6,6,7,7]
1100 ; SSE2-NEXT: pslld $31, %xmm7
1101 ; SSE2-NEXT: psrad $31, %xmm7
1102 ; SSE2-NEXT: movdqa %xmm10, %xmm11
1103 ; SSE2-NEXT: pand %xmm7, %xmm11
1104 ; SSE2-NEXT: pandn %xmm6, %xmm7
1105 ; SSE2-NEXT: por %xmm11, %xmm7
1106 ; SSE2-NEXT: punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]
1107 ; SSE2-NEXT: pslld $31, %xmm0
1108 ; SSE2-NEXT: psrad $31, %xmm0
1109 ; SSE2-NEXT: pand %xmm0, %xmm10
1110 ; SSE2-NEXT: pandn %xmm5, %xmm0
1111 ; SSE2-NEXT: por %xmm10, %xmm0
1112 ; SSE2-NEXT: divps %xmm0, %xmm1
1113 ; SSE2-NEXT: divps %xmm7, %xmm2
1114 ; SSE2-NEXT: divps %xmm9, %xmm3
1115 ; SSE2-NEXT: divps %xmm8, %xmm4
1116 ; SSE2-NEXT: movaps %xmm1, %xmm0
1117 ; SSE2-NEXT: movaps %xmm2, %xmm1
1118 ; SSE2-NEXT: movaps %xmm3, %xmm2
1119 ; SSE2-NEXT: movaps %xmm4, %xmm3
1122 ; SSE42-LABEL: fdiv_v16f32_swap:
1124 ; SSE42-NEXT: movdqa %xmm0, %xmm8
1125 ; SSE42-NEXT: movaps {{[0-9]+}}(%rsp), %xmm9
1126 ; SSE42-NEXT: pshufd {{.*#+}} xmm0 = xmm0[3,3,3,3]
1127 ; SSE42-NEXT: pmovzxbd {{.*#+}} xmm0 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero
1128 ; SSE42-NEXT: pslld $31, %xmm0
1129 ; SSE42-NEXT: movaps {{.*#+}} xmm10 = [1.0E+0,1.0E+0,1.0E+0,1.0E+0]
1130 ; SSE42-NEXT: blendvps %xmm0, %xmm10, %xmm9
1131 ; SSE42-NEXT: pshufd {{.*#+}} xmm0 = xmm8[2,3,2,3]
1132 ; SSE42-NEXT: pmovzxbd {{.*#+}} xmm0 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero
1133 ; SSE42-NEXT: pslld $31, %xmm0
1134 ; SSE42-NEXT: blendvps %xmm0, %xmm10, %xmm7
1135 ; SSE42-NEXT: pshufd {{.*#+}} xmm0 = xmm8[1,1,1,1]
1136 ; SSE42-NEXT: pmovzxbd {{.*#+}} xmm0 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero
1137 ; SSE42-NEXT: pslld $31, %xmm0
1138 ; SSE42-NEXT: blendvps %xmm0, %xmm10, %xmm6
1139 ; SSE42-NEXT: pmovzxbd {{.*#+}} xmm0 = xmm8[0],zero,zero,zero,xmm8[1],zero,zero,zero,xmm8[2],zero,zero,zero,xmm8[3],zero,zero,zero
1140 ; SSE42-NEXT: pslld $31, %xmm0
1141 ; SSE42-NEXT: blendvps %xmm0, %xmm10, %xmm5
1142 ; SSE42-NEXT: divps %xmm5, %xmm1
1143 ; SSE42-NEXT: divps %xmm6, %xmm2
1144 ; SSE42-NEXT: divps %xmm7, %xmm3
1145 ; SSE42-NEXT: divps %xmm9, %xmm4
1146 ; SSE42-NEXT: movaps %xmm1, %xmm0
1147 ; SSE42-NEXT: movaps %xmm2, %xmm1
1148 ; SSE42-NEXT: movaps %xmm3, %xmm2
1149 ; SSE42-NEXT: movaps %xmm4, %xmm3
1152 ; AVX2-LABEL: fdiv_v16f32_swap:
1154 ; AVX2-NEXT: vpmovzxbd {{.*#+}} ymm5 = 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
1155 ; AVX2-NEXT: vpslld $31, %ymm5, %ymm5
1156 ; AVX2-NEXT: vbroadcastss {{.*#+}} ymm6 = [1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0]
1157 ; AVX2-NEXT: vblendvps %ymm5, %ymm6, %ymm3, %ymm3
1158 ; AVX2-NEXT: vpunpckhbw {{.*#+}} xmm0 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]
1159 ; AVX2-NEXT: vpmovzxwd {{.*#+}} ymm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero
1160 ; AVX2-NEXT: vpslld $31, %ymm0, %ymm0
1161 ; AVX2-NEXT: vblendvps %ymm0, %ymm6, %ymm4, %ymm4
1162 ; AVX2-NEXT: vdivps %ymm3, %ymm1, %ymm0
1163 ; AVX2-NEXT: vdivps %ymm4, %ymm2, %ymm1
1166 ; AVX512-LABEL: fdiv_v16f32_swap:
1168 ; AVX512-NEXT: vpmovsxbd %xmm0, %zmm0
1169 ; AVX512-NEXT: vpslld $31, %zmm0, %zmm0
1170 ; AVX512-NEXT: vptestmd %zmm0, %zmm0, %k1
1171 ; AVX512-NEXT: vdivps %zmm2, %zmm1, %zmm0
1172 ; AVX512-NEXT: vmovaps %zmm1, %zmm0 {%k1}
1174 %s = select <16 x i1> %b, <16 x float> <float 1.0, float 1.0, float 1.0, float 1.0, float 1.0, float 1.0, float 1.0, float 1.0, float 1.0, float 1.0, float 1.0, float 1.0, float 1.0, float 1.0, float 1.0, float 1.0>, <16 x float> %y
1175 %r = fdiv <16 x float> %x, %s
1179 define <16 x float> @fdiv_v16f32_commute_swap(<16 x i1> %b, <16 x float> noundef %x, <16 x float> noundef %y) {
1180 ; SSE2-LABEL: fdiv_v16f32_commute_swap:
1182 ; SSE2-NEXT: movaps %xmm2, %xmm8
1183 ; SSE2-NEXT: movdqa %xmm0, %xmm2
1184 ; SSE2-NEXT: punpckhbw {{.*#+}} xmm2 = xmm2[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]
1185 ; SSE2-NEXT: movdqa %xmm2, %xmm10
1186 ; SSE2-NEXT: punpckhwd {{.*#+}} xmm10 = xmm10[4,4,5,5,6,6,7,7]
1187 ; SSE2-NEXT: pslld $31, %xmm10
1188 ; SSE2-NEXT: psrad $31, %xmm10
1189 ; SSE2-NEXT: movdqa {{.*#+}} xmm11 = [1.0E+0,1.0E+0,1.0E+0,1.0E+0]
1190 ; SSE2-NEXT: movdqa %xmm11, %xmm9
1191 ; SSE2-NEXT: pand %xmm10, %xmm9
1192 ; SSE2-NEXT: pandn {{[0-9]+}}(%rsp), %xmm10
1193 ; SSE2-NEXT: por %xmm9, %xmm10
1194 ; SSE2-NEXT: punpcklwd {{.*#+}} xmm2 = xmm2[0,0,1,1,2,2,3,3]
1195 ; SSE2-NEXT: pslld $31, %xmm2
1196 ; SSE2-NEXT: psrad $31, %xmm2
1197 ; SSE2-NEXT: movdqa %xmm11, %xmm9
1198 ; SSE2-NEXT: pand %xmm2, %xmm9
1199 ; SSE2-NEXT: pandn %xmm7, %xmm2
1200 ; SSE2-NEXT: por %xmm9, %xmm2
1201 ; SSE2-NEXT: punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
1202 ; SSE2-NEXT: movdqa %xmm0, %xmm9
1203 ; SSE2-NEXT: punpckhwd {{.*#+}} xmm9 = xmm9[4,4,5,5,6,6,7,7]
1204 ; SSE2-NEXT: pslld $31, %xmm9
1205 ; SSE2-NEXT: psrad $31, %xmm9
1206 ; SSE2-NEXT: movdqa %xmm11, %xmm7
1207 ; SSE2-NEXT: pand %xmm9, %xmm7
1208 ; SSE2-NEXT: pandn %xmm6, %xmm9
1209 ; SSE2-NEXT: por %xmm7, %xmm9
1210 ; SSE2-NEXT: punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]
1211 ; SSE2-NEXT: pslld $31, %xmm0
1212 ; SSE2-NEXT: psrad $31, %xmm0
1213 ; SSE2-NEXT: pand %xmm0, %xmm11
1214 ; SSE2-NEXT: pandn %xmm5, %xmm0
1215 ; SSE2-NEXT: por %xmm11, %xmm0
1216 ; SSE2-NEXT: divps %xmm1, %xmm0
1217 ; SSE2-NEXT: divps %xmm8, %xmm9
1218 ; SSE2-NEXT: divps %xmm3, %xmm2
1219 ; SSE2-NEXT: divps %xmm4, %xmm10
1220 ; SSE2-NEXT: movaps %xmm9, %xmm1
1221 ; SSE2-NEXT: movaps %xmm10, %xmm3
1224 ; SSE42-LABEL: fdiv_v16f32_commute_swap:
1226 ; SSE42-NEXT: movaps %xmm3, %xmm8
1227 ; SSE42-NEXT: movdqa %xmm0, %xmm9
1228 ; SSE42-NEXT: movaps {{[0-9]+}}(%rsp), %xmm3
1229 ; SSE42-NEXT: pshufd {{.*#+}} xmm0 = xmm0[3,3,3,3]
1230 ; SSE42-NEXT: pmovzxbd {{.*#+}} xmm0 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero
1231 ; SSE42-NEXT: pslld $31, %xmm0
1232 ; SSE42-NEXT: movaps {{.*#+}} xmm10 = [1.0E+0,1.0E+0,1.0E+0,1.0E+0]
1233 ; SSE42-NEXT: blendvps %xmm0, %xmm10, %xmm3
1234 ; SSE42-NEXT: pshufd {{.*#+}} xmm0 = xmm9[2,3,2,3]
1235 ; SSE42-NEXT: pmovzxbd {{.*#+}} xmm0 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero
1236 ; SSE42-NEXT: pslld $31, %xmm0
1237 ; SSE42-NEXT: blendvps %xmm0, %xmm10, %xmm7
1238 ; SSE42-NEXT: pshufd {{.*#+}} xmm0 = xmm9[1,1,1,1]
1239 ; SSE42-NEXT: pmovzxbd {{.*#+}} xmm0 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero
1240 ; SSE42-NEXT: pslld $31, %xmm0
1241 ; SSE42-NEXT: blendvps %xmm0, %xmm10, %xmm6
1242 ; SSE42-NEXT: pmovzxbd {{.*#+}} xmm0 = xmm9[0],zero,zero,zero,xmm9[1],zero,zero,zero,xmm9[2],zero,zero,zero,xmm9[3],zero,zero,zero
1243 ; SSE42-NEXT: pslld $31, %xmm0
1244 ; SSE42-NEXT: blendvps %xmm0, %xmm10, %xmm5
1245 ; SSE42-NEXT: divps %xmm1, %xmm5
1246 ; SSE42-NEXT: divps %xmm2, %xmm6
1247 ; SSE42-NEXT: divps %xmm8, %xmm7
1248 ; SSE42-NEXT: divps %xmm4, %xmm3
1249 ; SSE42-NEXT: movaps %xmm5, %xmm0
1250 ; SSE42-NEXT: movaps %xmm6, %xmm1
1251 ; SSE42-NEXT: movaps %xmm7, %xmm2
1254 ; AVX2-LABEL: fdiv_v16f32_commute_swap:
1256 ; AVX2-NEXT: vpmovzxbd {{.*#+}} ymm5 = 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
1257 ; AVX2-NEXT: vpslld $31, %ymm5, %ymm5
1258 ; AVX2-NEXT: vbroadcastss {{.*#+}} ymm6 = [1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0]
1259 ; AVX2-NEXT: vblendvps %ymm5, %ymm6, %ymm3, %ymm3
1260 ; AVX2-NEXT: vpunpckhbw {{.*#+}} xmm0 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]
1261 ; AVX2-NEXT: vpmovzxwd {{.*#+}} ymm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero
1262 ; AVX2-NEXT: vpslld $31, %ymm0, %ymm0
1263 ; AVX2-NEXT: vblendvps %ymm0, %ymm6, %ymm4, %ymm4
1264 ; AVX2-NEXT: vdivps %ymm1, %ymm3, %ymm0
1265 ; AVX2-NEXT: vdivps %ymm2, %ymm4, %ymm1
1268 ; AVX512-LABEL: fdiv_v16f32_commute_swap:
1270 ; AVX512-NEXT: vpmovsxbd %xmm0, %zmm0
1271 ; AVX512-NEXT: vpslld $31, %zmm0, %zmm0
1272 ; AVX512-NEXT: vptestmd %zmm0, %zmm0, %k1
1273 ; AVX512-NEXT: vbroadcastss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %zmm2 {%k1}
1274 ; AVX512-NEXT: vdivps %zmm1, %zmm2, %zmm0
1276 %s = select <16 x i1> %b, <16 x float> <float 1.0, float 1.0, float 1.0, float 1.0, float 1.0, float 1.0, float 1.0, float 1.0, float 1.0, float 1.0, float 1.0, float 1.0, float 1.0, float 1.0, float 1.0, float 1.0>, <16 x float> %y
1277 %r = fdiv <16 x float> %s, %x
1281 define <8 x float> @fadd_v8f32_cast_cond(i8 noundef zeroext %pb, <8 x float> noundef %x, <8 x float> noundef %y) {
1282 ; SSE2-LABEL: fadd_v8f32_cast_cond:
1284 ; SSE2-NEXT: movd %edi, %xmm4
1285 ; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm4[0,0,0,0]
1286 ; SSE2-NEXT: movdqa {{.*#+}} xmm5 = [16,32,64,128]
1287 ; SSE2-NEXT: movdqa %xmm4, %xmm6
1288 ; SSE2-NEXT: pand %xmm5, %xmm6
1289 ; SSE2-NEXT: pcmpeqd %xmm5, %xmm6
1290 ; SSE2-NEXT: movdqa {{.*#+}} xmm5 = [-0.0E+0,-0.0E+0,-0.0E+0,-0.0E+0]
1291 ; SSE2-NEXT: pand %xmm6, %xmm3
1292 ; SSE2-NEXT: pandn %xmm5, %xmm6
1293 ; SSE2-NEXT: por %xmm3, %xmm6
1294 ; SSE2-NEXT: movdqa {{.*#+}} xmm3 = [1,2,4,8]
1295 ; SSE2-NEXT: pand %xmm3, %xmm4
1296 ; SSE2-NEXT: pcmpeqd %xmm3, %xmm4
1297 ; SSE2-NEXT: pand %xmm4, %xmm2
1298 ; SSE2-NEXT: pandn %xmm5, %xmm4
1299 ; SSE2-NEXT: por %xmm2, %xmm4
1300 ; SSE2-NEXT: addps %xmm4, %xmm0
1301 ; SSE2-NEXT: addps %xmm6, %xmm1
1304 ; SSE42-LABEL: fadd_v8f32_cast_cond:
1306 ; SSE42-NEXT: movaps %xmm0, %xmm4
1307 ; SSE42-NEXT: movd %edi, %xmm0
1308 ; SSE42-NEXT: pshufd {{.*#+}} xmm5 = xmm0[0,0,0,0]
1309 ; SSE42-NEXT: movdqa {{.*#+}} xmm6 = [16,32,64,128]
1310 ; SSE42-NEXT: movdqa %xmm5, %xmm0
1311 ; SSE42-NEXT: pand %xmm6, %xmm0
1312 ; SSE42-NEXT: pcmpeqd %xmm6, %xmm0
1313 ; SSE42-NEXT: movaps {{.*#+}} xmm6 = [-0.0E+0,-0.0E+0,-0.0E+0,-0.0E+0]
1314 ; SSE42-NEXT: movaps %xmm6, %xmm7
1315 ; SSE42-NEXT: blendvps %xmm0, %xmm3, %xmm7
1316 ; SSE42-NEXT: movdqa {{.*#+}} xmm0 = [1,2,4,8]
1317 ; SSE42-NEXT: pand %xmm0, %xmm5
1318 ; SSE42-NEXT: pcmpeqd %xmm0, %xmm5
1319 ; SSE42-NEXT: movdqa %xmm5, %xmm0
1320 ; SSE42-NEXT: blendvps %xmm0, %xmm2, %xmm6
1321 ; SSE42-NEXT: addps %xmm4, %xmm6
1322 ; SSE42-NEXT: addps %xmm7, %xmm1
1323 ; SSE42-NEXT: movaps %xmm6, %xmm0
1326 ; AVX2-LABEL: fadd_v8f32_cast_cond:
1328 ; AVX2-NEXT: vmovd %edi, %xmm2
1329 ; AVX2-NEXT: vpbroadcastb %xmm2, %ymm2
1330 ; AVX2-NEXT: vmovdqa {{.*#+}} ymm3 = [1,2,4,8,16,32,64,128]
1331 ; AVX2-NEXT: vpand %ymm3, %ymm2, %ymm2
1332 ; AVX2-NEXT: vpcmpeqd %ymm3, %ymm2, %ymm2
1333 ; AVX2-NEXT: vbroadcastss {{.*#+}} ymm3 = [-0.0E+0,-0.0E+0,-0.0E+0,-0.0E+0,-0.0E+0,-0.0E+0,-0.0E+0,-0.0E+0]
1334 ; AVX2-NEXT: vblendvps %ymm2, %ymm1, %ymm3, %ymm1
1335 ; AVX2-NEXT: vaddps %ymm1, %ymm0, %ymm0
1338 ; AVX512F-LABEL: fadd_v8f32_cast_cond:
1340 ; AVX512F-NEXT: # kill: def $ymm1 killed $ymm1 def $zmm1
1341 ; AVX512F-NEXT: kmovw %edi, %k1
1342 ; AVX512F-NEXT: vbroadcastss {{.*#+}} ymm2 = [-0.0E+0,-0.0E+0,-0.0E+0,-0.0E+0,-0.0E+0,-0.0E+0,-0.0E+0,-0.0E+0]
1343 ; AVX512F-NEXT: vmovaps %zmm1, %zmm2 {%k1}
1344 ; AVX512F-NEXT: vaddps %ymm2, %ymm0, %ymm0
1345 ; AVX512F-NEXT: retq
1347 ; AVX512VL-LABEL: fadd_v8f32_cast_cond:
1348 ; AVX512VL: # %bb.0:
1349 ; AVX512VL-NEXT: kmovw %edi, %k1
1350 ; AVX512VL-NEXT: vaddps %ymm1, %ymm0, %ymm0 {%k1}
1351 ; AVX512VL-NEXT: retq
1352 %b = bitcast i8 %pb to <8 x i1>
1353 %s = select <8 x i1> %b, <8 x float> %y, <8 x float> <float -0.0, float -0.0, float -0.0, float -0.0, float -0.0, float -0.0, float -0.0, float -0.0>
1354 %r = fadd <8 x float> %x, %s
1358 define <8 x double> @fadd_v8f64_cast_cond(i8 noundef zeroext %pb, <8 x double> noundef %x, <8 x double> noundef %y) {
1359 ; SSE2-LABEL: fadd_v8f64_cast_cond:
1361 ; SSE2-NEXT: movd %edi, %xmm8
1362 ; SSE2-NEXT: pshufd {{.*#+}} xmm9 = xmm8[0,1,0,1]
1363 ; SSE2-NEXT: movdqa {{.*#+}} xmm8 = [64,128]
1364 ; SSE2-NEXT: movdqa %xmm9, %xmm10
1365 ; SSE2-NEXT: pand %xmm8, %xmm10
1366 ; SSE2-NEXT: pcmpeqd %xmm8, %xmm10
1367 ; SSE2-NEXT: pshufd {{.*#+}} xmm8 = xmm10[1,0,3,2]
1368 ; SSE2-NEXT: pand %xmm10, %xmm8
1369 ; SSE2-NEXT: movdqa {{.*#+}} xmm10 = [-0.0E+0,-0.0E+0]
1370 ; SSE2-NEXT: pand %xmm8, %xmm7
1371 ; SSE2-NEXT: pandn %xmm10, %xmm8
1372 ; SSE2-NEXT: por %xmm7, %xmm8
1373 ; SSE2-NEXT: movdqa {{.*#+}} xmm7 = [16,32]
1374 ; SSE2-NEXT: movdqa %xmm9, %xmm11
1375 ; SSE2-NEXT: pand %xmm7, %xmm11
1376 ; SSE2-NEXT: pcmpeqd %xmm7, %xmm11
1377 ; SSE2-NEXT: pshufd {{.*#+}} xmm7 = xmm11[1,0,3,2]
1378 ; SSE2-NEXT: pand %xmm11, %xmm7
1379 ; SSE2-NEXT: pand %xmm7, %xmm6
1380 ; SSE2-NEXT: pandn %xmm10, %xmm7
1381 ; SSE2-NEXT: por %xmm6, %xmm7
1382 ; SSE2-NEXT: movdqa {{.*#+}} xmm6 = [4,8]
1383 ; SSE2-NEXT: movdqa %xmm9, %xmm11
1384 ; SSE2-NEXT: pand %xmm6, %xmm11
1385 ; SSE2-NEXT: pcmpeqd %xmm6, %xmm11
1386 ; SSE2-NEXT: pshufd {{.*#+}} xmm6 = xmm11[1,0,3,2]
1387 ; SSE2-NEXT: pand %xmm11, %xmm6
1388 ; SSE2-NEXT: pand %xmm6, %xmm5
1389 ; SSE2-NEXT: pandn %xmm10, %xmm6
1390 ; SSE2-NEXT: por %xmm5, %xmm6
1391 ; SSE2-NEXT: movdqa {{.*#+}} xmm5 = [1,2]
1392 ; SSE2-NEXT: pand %xmm5, %xmm9
1393 ; SSE2-NEXT: pcmpeqd %xmm5, %xmm9
1394 ; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm9[1,0,3,2]
1395 ; SSE2-NEXT: pand %xmm9, %xmm5
1396 ; SSE2-NEXT: pand %xmm5, %xmm4
1397 ; SSE2-NEXT: pandn %xmm10, %xmm5
1398 ; SSE2-NEXT: por %xmm4, %xmm5
1399 ; SSE2-NEXT: addpd %xmm5, %xmm0
1400 ; SSE2-NEXT: addpd %xmm6, %xmm1
1401 ; SSE2-NEXT: addpd %xmm7, %xmm2
1402 ; SSE2-NEXT: addpd %xmm8, %xmm3
1405 ; SSE42-LABEL: fadd_v8f64_cast_cond:
1407 ; SSE42-NEXT: movapd %xmm0, %xmm9
1408 ; SSE42-NEXT: movd %edi, %xmm0
1409 ; SSE42-NEXT: pshufd {{.*#+}} xmm8 = xmm0[0,1,0,1]
1410 ; SSE42-NEXT: movdqa {{.*#+}} xmm10 = [64,128]
1411 ; SSE42-NEXT: movdqa %xmm8, %xmm0
1412 ; SSE42-NEXT: pand %xmm10, %xmm0
1413 ; SSE42-NEXT: pcmpeqq %xmm10, %xmm0
1414 ; SSE42-NEXT: movapd {{.*#+}} xmm10 = [-0.0E+0,-0.0E+0]
1415 ; SSE42-NEXT: movapd %xmm10, %xmm11
1416 ; SSE42-NEXT: blendvpd %xmm0, %xmm7, %xmm11
1417 ; SSE42-NEXT: movdqa {{.*#+}} xmm7 = [16,32]
1418 ; SSE42-NEXT: movdqa %xmm8, %xmm0
1419 ; SSE42-NEXT: pand %xmm7, %xmm0
1420 ; SSE42-NEXT: pcmpeqq %xmm7, %xmm0
1421 ; SSE42-NEXT: movapd %xmm10, %xmm7
1422 ; SSE42-NEXT: blendvpd %xmm0, %xmm6, %xmm7
1423 ; SSE42-NEXT: movdqa {{.*#+}} xmm6 = [4,8]
1424 ; SSE42-NEXT: movdqa %xmm8, %xmm0
1425 ; SSE42-NEXT: pand %xmm6, %xmm0
1426 ; SSE42-NEXT: pcmpeqq %xmm6, %xmm0
1427 ; SSE42-NEXT: movapd %xmm10, %xmm6
1428 ; SSE42-NEXT: blendvpd %xmm0, %xmm5, %xmm6
1429 ; SSE42-NEXT: movdqa {{.*#+}} xmm0 = [1,2]
1430 ; SSE42-NEXT: pand %xmm0, %xmm8
1431 ; SSE42-NEXT: pcmpeqq %xmm0, %xmm8
1432 ; SSE42-NEXT: movdqa %xmm8, %xmm0
1433 ; SSE42-NEXT: blendvpd %xmm0, %xmm4, %xmm10
1434 ; SSE42-NEXT: addpd %xmm9, %xmm10
1435 ; SSE42-NEXT: addpd %xmm6, %xmm1
1436 ; SSE42-NEXT: addpd %xmm7, %xmm2
1437 ; SSE42-NEXT: addpd %xmm11, %xmm3
1438 ; SSE42-NEXT: movapd %xmm10, %xmm0
1441 ; AVX2-LABEL: fadd_v8f64_cast_cond:
1443 ; AVX2-NEXT: vmovd %edi, %xmm4
1444 ; AVX2-NEXT: vpbroadcastb %xmm4, %ymm4
1445 ; AVX2-NEXT: vmovdqa {{.*#+}} ymm5 = [16,32,64,128]
1446 ; AVX2-NEXT: vpand %ymm5, %ymm4, %ymm6
1447 ; AVX2-NEXT: vpcmpeqq %ymm5, %ymm6, %ymm5
1448 ; AVX2-NEXT: vbroadcastsd {{.*#+}} ymm6 = [-0.0E+0,-0.0E+0,-0.0E+0,-0.0E+0]
1449 ; AVX2-NEXT: vblendvpd %ymm5, %ymm3, %ymm6, %ymm3
1450 ; AVX2-NEXT: vmovdqa {{.*#+}} ymm5 = [1,2,4,8]
1451 ; AVX2-NEXT: vpand %ymm5, %ymm4, %ymm4
1452 ; AVX2-NEXT: vpcmpeqq %ymm5, %ymm4, %ymm4
1453 ; AVX2-NEXT: vblendvpd %ymm4, %ymm2, %ymm6, %ymm2
1454 ; AVX2-NEXT: vaddpd %ymm2, %ymm0, %ymm0
1455 ; AVX2-NEXT: vaddpd %ymm3, %ymm1, %ymm1
1458 ; AVX512-LABEL: fadd_v8f64_cast_cond:
1460 ; AVX512-NEXT: kmovw %edi, %k1
1461 ; AVX512-NEXT: vaddpd %zmm1, %zmm0, %zmm0 {%k1}
1463 %b = bitcast i8 %pb to <8 x i1>
1464 %s = select <8 x i1> %b, <8 x double> %y, <8 x double> <double -0.0, double -0.0, double -0.0, double -0.0, double -0.0, double -0.0, double -0.0, double -0.0>
1465 %r = fadd <8 x double> %x, %s
1469 define <8 x float> @fsub_v8f32_cast_cond(i8 noundef zeroext %pb, <8 x float> noundef %x, <8 x float> noundef %y) {
1470 ; SSE-LABEL: fsub_v8f32_cast_cond:
1472 ; SSE-NEXT: movd %edi, %xmm4
1473 ; SSE-NEXT: pshufd {{.*#+}} xmm4 = xmm4[0,0,0,0]
1474 ; SSE-NEXT: movdqa {{.*#+}} xmm5 = [16,32,64,128]
1475 ; SSE-NEXT: movdqa %xmm4, %xmm6
1476 ; SSE-NEXT: pand %xmm5, %xmm6
1477 ; SSE-NEXT: pcmpeqd %xmm5, %xmm6
1478 ; SSE-NEXT: pand %xmm3, %xmm6
1479 ; SSE-NEXT: movdqa {{.*#+}} xmm3 = [1,2,4,8]
1480 ; SSE-NEXT: pand %xmm3, %xmm4
1481 ; SSE-NEXT: pcmpeqd %xmm3, %xmm4
1482 ; SSE-NEXT: pand %xmm2, %xmm4
1483 ; SSE-NEXT: subps %xmm4, %xmm0
1484 ; SSE-NEXT: subps %xmm6, %xmm1
1487 ; AVX2-LABEL: fsub_v8f32_cast_cond:
1489 ; AVX2-NEXT: vmovd %edi, %xmm2
1490 ; AVX2-NEXT: vpbroadcastb %xmm2, %ymm2
1491 ; AVX2-NEXT: vmovdqa {{.*#+}} ymm3 = [1,2,4,8,16,32,64,128]
1492 ; AVX2-NEXT: vpand %ymm3, %ymm2, %ymm2
1493 ; AVX2-NEXT: vpcmpeqd %ymm3, %ymm2, %ymm2
1494 ; AVX2-NEXT: vpand %ymm1, %ymm2, %ymm1
1495 ; AVX2-NEXT: vsubps %ymm1, %ymm0, %ymm0
1498 ; AVX512F-LABEL: fsub_v8f32_cast_cond:
1500 ; AVX512F-NEXT: # kill: def $ymm1 killed $ymm1 def $zmm1
1501 ; AVX512F-NEXT: kmovw %edi, %k1
1502 ; AVX512F-NEXT: vmovaps %zmm1, %zmm1 {%k1} {z}
1503 ; AVX512F-NEXT: vsubps %ymm1, %ymm0, %ymm0
1504 ; AVX512F-NEXT: retq
1506 ; AVX512VL-LABEL: fsub_v8f32_cast_cond:
1507 ; AVX512VL: # %bb.0:
1508 ; AVX512VL-NEXT: kmovw %edi, %k1
1509 ; AVX512VL-NEXT: vsubps %ymm1, %ymm0, %ymm0 {%k1}
1510 ; AVX512VL-NEXT: retq
1511 %b = bitcast i8 %pb to <8 x i1>
1512 %s = select <8 x i1> %b, <8 x float> %y, <8 x float> zeroinitializer
1513 %r = fsub <8 x float> %x, %s
1517 define <8 x double> @fsub_v8f64_cast_cond(i8 noundef zeroext %pb, <8 x double> noundef %x, <8 x double> noundef %y) {
1518 ; SSE2-LABEL: fsub_v8f64_cast_cond:
1520 ; SSE2-NEXT: movd %edi, %xmm8
1521 ; SSE2-NEXT: pshufd {{.*#+}} xmm9 = xmm8[0,1,0,1]
1522 ; SSE2-NEXT: movdqa {{.*#+}} xmm10 = [64,128]
1523 ; SSE2-NEXT: movdqa %xmm9, %xmm8
1524 ; SSE2-NEXT: pand %xmm10, %xmm8
1525 ; SSE2-NEXT: pcmpeqd %xmm10, %xmm8
1526 ; SSE2-NEXT: pshufd {{.*#+}} xmm10 = xmm8[1,0,3,2]
1527 ; SSE2-NEXT: pand %xmm7, %xmm8
1528 ; SSE2-NEXT: pand %xmm10, %xmm8
1529 ; SSE2-NEXT: movdqa {{.*#+}} xmm10 = [16,32]
1530 ; SSE2-NEXT: movdqa %xmm9, %xmm7
1531 ; SSE2-NEXT: pand %xmm10, %xmm7
1532 ; SSE2-NEXT: pcmpeqd %xmm10, %xmm7
1533 ; SSE2-NEXT: pshufd {{.*#+}} xmm10 = xmm7[1,0,3,2]
1534 ; SSE2-NEXT: pand %xmm6, %xmm7
1535 ; SSE2-NEXT: pand %xmm10, %xmm7
1536 ; SSE2-NEXT: movdqa {{.*#+}} xmm6 = [4,8]
1537 ; SSE2-NEXT: movdqa %xmm9, %xmm10
1538 ; SSE2-NEXT: pand %xmm6, %xmm10
1539 ; SSE2-NEXT: pcmpeqd %xmm6, %xmm10
1540 ; SSE2-NEXT: pshufd {{.*#+}} xmm6 = xmm10[1,0,3,2]
1541 ; SSE2-NEXT: pand %xmm5, %xmm10
1542 ; SSE2-NEXT: pand %xmm6, %xmm10
1543 ; SSE2-NEXT: movdqa {{.*#+}} xmm5 = [1,2]
1544 ; SSE2-NEXT: pand %xmm5, %xmm9
1545 ; SSE2-NEXT: pcmpeqd %xmm5, %xmm9
1546 ; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm9[1,0,3,2]
1547 ; SSE2-NEXT: pand %xmm4, %xmm9
1548 ; SSE2-NEXT: pand %xmm5, %xmm9
1549 ; SSE2-NEXT: subpd %xmm9, %xmm0
1550 ; SSE2-NEXT: subpd %xmm10, %xmm1
1551 ; SSE2-NEXT: subpd %xmm7, %xmm2
1552 ; SSE2-NEXT: subpd %xmm8, %xmm3
1555 ; SSE42-LABEL: fsub_v8f64_cast_cond:
1557 ; SSE42-NEXT: movd %edi, %xmm8
1558 ; SSE42-NEXT: pshufd {{.*#+}} xmm9 = xmm8[0,1,0,1]
1559 ; SSE42-NEXT: movdqa {{.*#+}} xmm10 = [64,128]
1560 ; SSE42-NEXT: movdqa %xmm9, %xmm8
1561 ; SSE42-NEXT: pand %xmm10, %xmm8
1562 ; SSE42-NEXT: pcmpeqq %xmm10, %xmm8
1563 ; SSE42-NEXT: pand %xmm7, %xmm8
1564 ; SSE42-NEXT: movdqa {{.*#+}} xmm7 = [16,32]
1565 ; SSE42-NEXT: movdqa %xmm9, %xmm10
1566 ; SSE42-NEXT: pand %xmm7, %xmm10
1567 ; SSE42-NEXT: pcmpeqq %xmm7, %xmm10
1568 ; SSE42-NEXT: pand %xmm6, %xmm10
1569 ; SSE42-NEXT: movdqa {{.*#+}} xmm6 = [4,8]
1570 ; SSE42-NEXT: movdqa %xmm9, %xmm7
1571 ; SSE42-NEXT: pand %xmm6, %xmm7
1572 ; SSE42-NEXT: pcmpeqq %xmm6, %xmm7
1573 ; SSE42-NEXT: pand %xmm5, %xmm7
1574 ; SSE42-NEXT: movdqa {{.*#+}} xmm5 = [1,2]
1575 ; SSE42-NEXT: pand %xmm5, %xmm9
1576 ; SSE42-NEXT: pcmpeqq %xmm5, %xmm9
1577 ; SSE42-NEXT: pand %xmm4, %xmm9
1578 ; SSE42-NEXT: subpd %xmm9, %xmm0
1579 ; SSE42-NEXT: subpd %xmm7, %xmm1
1580 ; SSE42-NEXT: subpd %xmm10, %xmm2
1581 ; SSE42-NEXT: subpd %xmm8, %xmm3
1584 ; AVX2-LABEL: fsub_v8f64_cast_cond:
1586 ; AVX2-NEXT: vmovd %edi, %xmm4
1587 ; AVX2-NEXT: vpbroadcastb %xmm4, %ymm4
1588 ; AVX2-NEXT: vmovdqa {{.*#+}} ymm5 = [16,32,64,128]
1589 ; AVX2-NEXT: vpand %ymm5, %ymm4, %ymm6
1590 ; AVX2-NEXT: vpcmpeqq %ymm5, %ymm6, %ymm5
1591 ; AVX2-NEXT: vpand %ymm3, %ymm5, %ymm3
1592 ; AVX2-NEXT: vmovdqa {{.*#+}} ymm5 = [1,2,4,8]
1593 ; AVX2-NEXT: vpand %ymm5, %ymm4, %ymm4
1594 ; AVX2-NEXT: vpcmpeqq %ymm5, %ymm4, %ymm4
1595 ; AVX2-NEXT: vpand %ymm2, %ymm4, %ymm2
1596 ; AVX2-NEXT: vsubpd %ymm2, %ymm0, %ymm0
1597 ; AVX2-NEXT: vsubpd %ymm3, %ymm1, %ymm1
1600 ; AVX512-LABEL: fsub_v8f64_cast_cond:
1602 ; AVX512-NEXT: kmovw %edi, %k1
1603 ; AVX512-NEXT: vsubpd %zmm1, %zmm0, %zmm0 {%k1}
1605 %b = bitcast i8 %pb to <8 x i1>
1606 %s = select <8 x i1> %b, <8 x double> %y, <8 x double> zeroinitializer
1607 %r = fsub <8 x double> %x, %s
1611 define <8 x float> @fmul_v8f32_cast_cond(i8 noundef zeroext %pb, <8 x float> noundef %x, <8 x float> noundef %y) {
1612 ; SSE2-LABEL: fmul_v8f32_cast_cond:
1614 ; SSE2-NEXT: movd %edi, %xmm4
1615 ; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm4[0,0,0,0]
1616 ; SSE2-NEXT: movdqa {{.*#+}} xmm5 = [16,32,64,128]
1617 ; SSE2-NEXT: movdqa %xmm4, %xmm6
1618 ; SSE2-NEXT: pand %xmm5, %xmm6
1619 ; SSE2-NEXT: pcmpeqd %xmm5, %xmm6
1620 ; SSE2-NEXT: movdqa {{.*#+}} xmm5 = [1.0E+0,1.0E+0,1.0E+0,1.0E+0]
1621 ; SSE2-NEXT: pand %xmm6, %xmm3
1622 ; SSE2-NEXT: pandn %xmm5, %xmm6
1623 ; SSE2-NEXT: por %xmm3, %xmm6
1624 ; SSE2-NEXT: movdqa {{.*#+}} xmm3 = [1,2,4,8]
1625 ; SSE2-NEXT: pand %xmm3, %xmm4
1626 ; SSE2-NEXT: pcmpeqd %xmm3, %xmm4
1627 ; SSE2-NEXT: pand %xmm4, %xmm2
1628 ; SSE2-NEXT: pandn %xmm5, %xmm4
1629 ; SSE2-NEXT: por %xmm2, %xmm4
1630 ; SSE2-NEXT: mulps %xmm4, %xmm0
1631 ; SSE2-NEXT: mulps %xmm6, %xmm1
1634 ; SSE42-LABEL: fmul_v8f32_cast_cond:
1636 ; SSE42-NEXT: movaps %xmm0, %xmm4
1637 ; SSE42-NEXT: movd %edi, %xmm0
1638 ; SSE42-NEXT: pshufd {{.*#+}} xmm5 = xmm0[0,0,0,0]
1639 ; SSE42-NEXT: movdqa {{.*#+}} xmm6 = [16,32,64,128]
1640 ; SSE42-NEXT: movdqa %xmm5, %xmm0
1641 ; SSE42-NEXT: pand %xmm6, %xmm0
1642 ; SSE42-NEXT: pcmpeqd %xmm6, %xmm0
1643 ; SSE42-NEXT: movaps {{.*#+}} xmm6 = [1.0E+0,1.0E+0,1.0E+0,1.0E+0]
1644 ; SSE42-NEXT: movaps %xmm6, %xmm7
1645 ; SSE42-NEXT: blendvps %xmm0, %xmm3, %xmm7
1646 ; SSE42-NEXT: movdqa {{.*#+}} xmm0 = [1,2,4,8]
1647 ; SSE42-NEXT: pand %xmm0, %xmm5
1648 ; SSE42-NEXT: pcmpeqd %xmm0, %xmm5
1649 ; SSE42-NEXT: movdqa %xmm5, %xmm0
1650 ; SSE42-NEXT: blendvps %xmm0, %xmm2, %xmm6
1651 ; SSE42-NEXT: mulps %xmm4, %xmm6
1652 ; SSE42-NEXT: mulps %xmm7, %xmm1
1653 ; SSE42-NEXT: movaps %xmm6, %xmm0
1656 ; AVX2-LABEL: fmul_v8f32_cast_cond:
1658 ; AVX2-NEXT: vmovd %edi, %xmm2
1659 ; AVX2-NEXT: vpbroadcastb %xmm2, %ymm2
1660 ; AVX2-NEXT: vmovdqa {{.*#+}} ymm3 = [1,2,4,8,16,32,64,128]
1661 ; AVX2-NEXT: vpand %ymm3, %ymm2, %ymm2
1662 ; AVX2-NEXT: vpcmpeqd %ymm3, %ymm2, %ymm2
1663 ; AVX2-NEXT: vbroadcastss {{.*#+}} ymm3 = [1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0]
1664 ; AVX2-NEXT: vblendvps %ymm2, %ymm1, %ymm3, %ymm1
1665 ; AVX2-NEXT: vmulps %ymm1, %ymm0, %ymm0
1668 ; AVX512F-LABEL: fmul_v8f32_cast_cond:
1670 ; AVX512F-NEXT: # kill: def $ymm1 killed $ymm1 def $zmm1
1671 ; AVX512F-NEXT: kmovw %edi, %k1
1672 ; AVX512F-NEXT: vbroadcastss {{.*#+}} ymm2 = [1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0]
1673 ; AVX512F-NEXT: vmovaps %zmm1, %zmm2 {%k1}
1674 ; AVX512F-NEXT: vmulps %ymm2, %ymm0, %ymm0
1675 ; AVX512F-NEXT: retq
1677 ; AVX512VL-LABEL: fmul_v8f32_cast_cond:
1678 ; AVX512VL: # %bb.0:
1679 ; AVX512VL-NEXT: kmovw %edi, %k1
1680 ; AVX512VL-NEXT: vmulps %ymm1, %ymm0, %ymm0 {%k1}
1681 ; AVX512VL-NEXT: retq
1682 %b = bitcast i8 %pb to <8 x i1>
1683 %s = select <8 x i1> %b, <8 x float> %y, <8 x float> <float 1.0, float 1.0, float 1.0, float 1.0, float 1.0, float 1.0, float 1.0, float 1.0>
1684 %r = fmul <8 x float> %x, %s
1688 define <8 x double> @fmul_v8f64_cast_cond(i8 noundef zeroext %pb, <8 x double> noundef %x, <8 x double> noundef %y) {
1689 ; SSE2-LABEL: fmul_v8f64_cast_cond:
1691 ; SSE2-NEXT: movd %edi, %xmm8
1692 ; SSE2-NEXT: pshufd {{.*#+}} xmm9 = xmm8[0,1,0,1]
1693 ; SSE2-NEXT: movdqa {{.*#+}} xmm8 = [64,128]
1694 ; SSE2-NEXT: movdqa %xmm9, %xmm10
1695 ; SSE2-NEXT: pand %xmm8, %xmm10
1696 ; SSE2-NEXT: pcmpeqd %xmm8, %xmm10
1697 ; SSE2-NEXT: pshufd {{.*#+}} xmm8 = xmm10[1,0,3,2]
1698 ; SSE2-NEXT: pand %xmm10, %xmm8
1699 ; SSE2-NEXT: movdqa {{.*#+}} xmm10 = [1.0E+0,1.0E+0]
1700 ; SSE2-NEXT: pand %xmm8, %xmm7
1701 ; SSE2-NEXT: pandn %xmm10, %xmm8
1702 ; SSE2-NEXT: por %xmm7, %xmm8
1703 ; SSE2-NEXT: movdqa {{.*#+}} xmm7 = [16,32]
1704 ; SSE2-NEXT: movdqa %xmm9, %xmm11
1705 ; SSE2-NEXT: pand %xmm7, %xmm11
1706 ; SSE2-NEXT: pcmpeqd %xmm7, %xmm11
1707 ; SSE2-NEXT: pshufd {{.*#+}} xmm7 = xmm11[1,0,3,2]
1708 ; SSE2-NEXT: pand %xmm11, %xmm7
1709 ; SSE2-NEXT: pand %xmm7, %xmm6
1710 ; SSE2-NEXT: pandn %xmm10, %xmm7
1711 ; SSE2-NEXT: por %xmm6, %xmm7
1712 ; SSE2-NEXT: movdqa {{.*#+}} xmm6 = [4,8]
1713 ; SSE2-NEXT: movdqa %xmm9, %xmm11
1714 ; SSE2-NEXT: pand %xmm6, %xmm11
1715 ; SSE2-NEXT: pcmpeqd %xmm6, %xmm11
1716 ; SSE2-NEXT: pshufd {{.*#+}} xmm6 = xmm11[1,0,3,2]
1717 ; SSE2-NEXT: pand %xmm11, %xmm6
1718 ; SSE2-NEXT: pand %xmm6, %xmm5
1719 ; SSE2-NEXT: pandn %xmm10, %xmm6
1720 ; SSE2-NEXT: por %xmm5, %xmm6
1721 ; SSE2-NEXT: movdqa {{.*#+}} xmm5 = [1,2]
1722 ; SSE2-NEXT: pand %xmm5, %xmm9
1723 ; SSE2-NEXT: pcmpeqd %xmm5, %xmm9
1724 ; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm9[1,0,3,2]
1725 ; SSE2-NEXT: pand %xmm9, %xmm5
1726 ; SSE2-NEXT: pand %xmm5, %xmm4
1727 ; SSE2-NEXT: pandn %xmm10, %xmm5
1728 ; SSE2-NEXT: por %xmm4, %xmm5
1729 ; SSE2-NEXT: mulpd %xmm5, %xmm0
1730 ; SSE2-NEXT: mulpd %xmm6, %xmm1
1731 ; SSE2-NEXT: mulpd %xmm7, %xmm2
1732 ; SSE2-NEXT: mulpd %xmm8, %xmm3
1735 ; SSE42-LABEL: fmul_v8f64_cast_cond:
1737 ; SSE42-NEXT: movapd %xmm0, %xmm9
1738 ; SSE42-NEXT: movd %edi, %xmm0
1739 ; SSE42-NEXT: pshufd {{.*#+}} xmm8 = xmm0[0,1,0,1]
1740 ; SSE42-NEXT: movdqa {{.*#+}} xmm10 = [64,128]
1741 ; SSE42-NEXT: movdqa %xmm8, %xmm0
1742 ; SSE42-NEXT: pand %xmm10, %xmm0
1743 ; SSE42-NEXT: pcmpeqq %xmm10, %xmm0
1744 ; SSE42-NEXT: movapd {{.*#+}} xmm10 = [1.0E+0,1.0E+0]
1745 ; SSE42-NEXT: movapd %xmm10, %xmm11
1746 ; SSE42-NEXT: blendvpd %xmm0, %xmm7, %xmm11
1747 ; SSE42-NEXT: movdqa {{.*#+}} xmm7 = [16,32]
1748 ; SSE42-NEXT: movdqa %xmm8, %xmm0
1749 ; SSE42-NEXT: pand %xmm7, %xmm0
1750 ; SSE42-NEXT: pcmpeqq %xmm7, %xmm0
1751 ; SSE42-NEXT: movapd %xmm10, %xmm7
1752 ; SSE42-NEXT: blendvpd %xmm0, %xmm6, %xmm7
1753 ; SSE42-NEXT: movdqa {{.*#+}} xmm6 = [4,8]
1754 ; SSE42-NEXT: movdqa %xmm8, %xmm0
1755 ; SSE42-NEXT: pand %xmm6, %xmm0
1756 ; SSE42-NEXT: pcmpeqq %xmm6, %xmm0
1757 ; SSE42-NEXT: movapd %xmm10, %xmm6
1758 ; SSE42-NEXT: blendvpd %xmm0, %xmm5, %xmm6
1759 ; SSE42-NEXT: movdqa {{.*#+}} xmm0 = [1,2]
1760 ; SSE42-NEXT: pand %xmm0, %xmm8
1761 ; SSE42-NEXT: pcmpeqq %xmm0, %xmm8
1762 ; SSE42-NEXT: movdqa %xmm8, %xmm0
1763 ; SSE42-NEXT: blendvpd %xmm0, %xmm4, %xmm10
1764 ; SSE42-NEXT: mulpd %xmm9, %xmm10
1765 ; SSE42-NEXT: mulpd %xmm6, %xmm1
1766 ; SSE42-NEXT: mulpd %xmm7, %xmm2
1767 ; SSE42-NEXT: mulpd %xmm11, %xmm3
1768 ; SSE42-NEXT: movapd %xmm10, %xmm0
1771 ; AVX2-LABEL: fmul_v8f64_cast_cond:
1773 ; AVX2-NEXT: vmovd %edi, %xmm4
1774 ; AVX2-NEXT: vpbroadcastb %xmm4, %ymm4
1775 ; AVX2-NEXT: vmovdqa {{.*#+}} ymm5 = [16,32,64,128]
1776 ; AVX2-NEXT: vpand %ymm5, %ymm4, %ymm6
1777 ; AVX2-NEXT: vpcmpeqq %ymm5, %ymm6, %ymm5
1778 ; AVX2-NEXT: vbroadcastsd {{.*#+}} ymm6 = [1.0E+0,1.0E+0,1.0E+0,1.0E+0]
1779 ; AVX2-NEXT: vblendvpd %ymm5, %ymm3, %ymm6, %ymm3
1780 ; AVX2-NEXT: vmovdqa {{.*#+}} ymm5 = [1,2,4,8]
1781 ; AVX2-NEXT: vpand %ymm5, %ymm4, %ymm4
1782 ; AVX2-NEXT: vpcmpeqq %ymm5, %ymm4, %ymm4
1783 ; AVX2-NEXT: vblendvpd %ymm4, %ymm2, %ymm6, %ymm2
1784 ; AVX2-NEXT: vmulpd %ymm2, %ymm0, %ymm0
1785 ; AVX2-NEXT: vmulpd %ymm3, %ymm1, %ymm1
1788 ; AVX512-LABEL: fmul_v8f64_cast_cond:
1790 ; AVX512-NEXT: kmovw %edi, %k1
1791 ; AVX512-NEXT: vmulpd %zmm1, %zmm0, %zmm0 {%k1}
1793 %b = bitcast i8 %pb to <8 x i1>
1794 %s = select <8 x i1> %b, <8 x double> %y, <8 x double> <double 1.0, double 1.0, double 1.0, double 1.0, double 1.0, double 1.0, double 1.0, double 1.0>
1795 %r = fmul <8 x double> %x, %s
1799 define <8 x float> @fdiv_v8f32_cast_cond(i8 noundef zeroext %pb, <8 x float> noundef %x, <8 x float> noundef %y) {
1800 ; SSE2-LABEL: fdiv_v8f32_cast_cond:
1802 ; SSE2-NEXT: movd %edi, %xmm4
1803 ; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm4[0,0,0,0]
1804 ; SSE2-NEXT: movdqa {{.*#+}} xmm5 = [16,32,64,128]
1805 ; SSE2-NEXT: movdqa %xmm4, %xmm6
1806 ; SSE2-NEXT: pand %xmm5, %xmm6
1807 ; SSE2-NEXT: pcmpeqd %xmm5, %xmm6
1808 ; SSE2-NEXT: movdqa {{.*#+}} xmm5 = [1.0E+0,1.0E+0,1.0E+0,1.0E+0]
1809 ; SSE2-NEXT: pand %xmm6, %xmm3
1810 ; SSE2-NEXT: pandn %xmm5, %xmm6
1811 ; SSE2-NEXT: por %xmm3, %xmm6
1812 ; SSE2-NEXT: movdqa {{.*#+}} xmm3 = [1,2,4,8]
1813 ; SSE2-NEXT: pand %xmm3, %xmm4
1814 ; SSE2-NEXT: pcmpeqd %xmm3, %xmm4
1815 ; SSE2-NEXT: pand %xmm4, %xmm2
1816 ; SSE2-NEXT: pandn %xmm5, %xmm4
1817 ; SSE2-NEXT: por %xmm2, %xmm4
1818 ; SSE2-NEXT: divps %xmm4, %xmm0
1819 ; SSE2-NEXT: divps %xmm6, %xmm1
1822 ; SSE42-LABEL: fdiv_v8f32_cast_cond:
1824 ; SSE42-NEXT: movaps %xmm0, %xmm4
1825 ; SSE42-NEXT: movd %edi, %xmm0
1826 ; SSE42-NEXT: pshufd {{.*#+}} xmm5 = xmm0[0,0,0,0]
1827 ; SSE42-NEXT: movdqa {{.*#+}} xmm6 = [16,32,64,128]
1828 ; SSE42-NEXT: movdqa %xmm5, %xmm0
1829 ; SSE42-NEXT: pand %xmm6, %xmm0
1830 ; SSE42-NEXT: pcmpeqd %xmm6, %xmm0
1831 ; SSE42-NEXT: movaps {{.*#+}} xmm6 = [1.0E+0,1.0E+0,1.0E+0,1.0E+0]
1832 ; SSE42-NEXT: movaps %xmm6, %xmm7
1833 ; SSE42-NEXT: blendvps %xmm0, %xmm3, %xmm7
1834 ; SSE42-NEXT: movdqa {{.*#+}} xmm0 = [1,2,4,8]
1835 ; SSE42-NEXT: pand %xmm0, %xmm5
1836 ; SSE42-NEXT: pcmpeqd %xmm0, %xmm5
1837 ; SSE42-NEXT: movdqa %xmm5, %xmm0
1838 ; SSE42-NEXT: blendvps %xmm0, %xmm2, %xmm6
1839 ; SSE42-NEXT: divps %xmm6, %xmm4
1840 ; SSE42-NEXT: divps %xmm7, %xmm1
1841 ; SSE42-NEXT: movaps %xmm4, %xmm0
1844 ; AVX2-LABEL: fdiv_v8f32_cast_cond:
1846 ; AVX2-NEXT: vmovd %edi, %xmm2
1847 ; AVX2-NEXT: vpbroadcastb %xmm2, %ymm2
1848 ; AVX2-NEXT: vmovdqa {{.*#+}} ymm3 = [1,2,4,8,16,32,64,128]
1849 ; AVX2-NEXT: vpand %ymm3, %ymm2, %ymm2
1850 ; AVX2-NEXT: vpcmpeqd %ymm3, %ymm2, %ymm2
1851 ; AVX2-NEXT: vbroadcastss {{.*#+}} ymm3 = [1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0]
1852 ; AVX2-NEXT: vblendvps %ymm2, %ymm1, %ymm3, %ymm1
1853 ; AVX2-NEXT: vdivps %ymm1, %ymm0, %ymm0
1856 ; AVX512F-LABEL: fdiv_v8f32_cast_cond:
1858 ; AVX512F-NEXT: # kill: def $ymm1 killed $ymm1 def $zmm1
1859 ; AVX512F-NEXT: kmovw %edi, %k1
1860 ; AVX512F-NEXT: vbroadcastss {{.*#+}} ymm2 = [1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0]
1861 ; AVX512F-NEXT: vmovaps %zmm1, %zmm2 {%k1}
1862 ; AVX512F-NEXT: vdivps %ymm2, %ymm0, %ymm0
1863 ; AVX512F-NEXT: retq
1865 ; AVX512VL-LABEL: fdiv_v8f32_cast_cond:
1866 ; AVX512VL: # %bb.0:
1867 ; AVX512VL-NEXT: kmovw %edi, %k1
1868 ; AVX512VL-NEXT: vdivps %ymm1, %ymm0, %ymm0 {%k1}
1869 ; AVX512VL-NEXT: retq
1870 %b = bitcast i8 %pb to <8 x i1>
1871 %s = select <8 x i1> %b, <8 x float> %y, <8 x float> <float 1.0, float 1.0, float 1.0, float 1.0, float 1.0, float 1.0, float 1.0, float 1.0>
1872 %r = fdiv <8 x float> %x, %s
1876 define <8 x double> @fdiv_v8f64_cast_cond(i8 noundef zeroext %pb, <8 x double> noundef %x, <8 x double> noundef %y) {
1877 ; SSE2-LABEL: fdiv_v8f64_cast_cond:
1879 ; SSE2-NEXT: movd %edi, %xmm8
1880 ; SSE2-NEXT: pshufd {{.*#+}} xmm9 = xmm8[0,1,0,1]
1881 ; SSE2-NEXT: movdqa {{.*#+}} xmm8 = [64,128]
1882 ; SSE2-NEXT: movdqa %xmm9, %xmm10
1883 ; SSE2-NEXT: pand %xmm8, %xmm10
1884 ; SSE2-NEXT: pcmpeqd %xmm8, %xmm10
1885 ; SSE2-NEXT: pshufd {{.*#+}} xmm8 = xmm10[1,0,3,2]
1886 ; SSE2-NEXT: pand %xmm10, %xmm8
1887 ; SSE2-NEXT: movdqa {{.*#+}} xmm10 = [1.0E+0,1.0E+0]
1888 ; SSE2-NEXT: pand %xmm8, %xmm7
1889 ; SSE2-NEXT: pandn %xmm10, %xmm8
1890 ; SSE2-NEXT: por %xmm7, %xmm8
1891 ; SSE2-NEXT: movdqa {{.*#+}} xmm7 = [16,32]
1892 ; SSE2-NEXT: movdqa %xmm9, %xmm11
1893 ; SSE2-NEXT: pand %xmm7, %xmm11
1894 ; SSE2-NEXT: pcmpeqd %xmm7, %xmm11
1895 ; SSE2-NEXT: pshufd {{.*#+}} xmm7 = xmm11[1,0,3,2]
1896 ; SSE2-NEXT: pand %xmm11, %xmm7
1897 ; SSE2-NEXT: pand %xmm7, %xmm6
1898 ; SSE2-NEXT: pandn %xmm10, %xmm7
1899 ; SSE2-NEXT: por %xmm6, %xmm7
1900 ; SSE2-NEXT: movdqa {{.*#+}} xmm6 = [4,8]
1901 ; SSE2-NEXT: movdqa %xmm9, %xmm11
1902 ; SSE2-NEXT: pand %xmm6, %xmm11
1903 ; SSE2-NEXT: pcmpeqd %xmm6, %xmm11
1904 ; SSE2-NEXT: pshufd {{.*#+}} xmm6 = xmm11[1,0,3,2]
1905 ; SSE2-NEXT: pand %xmm11, %xmm6
1906 ; SSE2-NEXT: pand %xmm6, %xmm5
1907 ; SSE2-NEXT: pandn %xmm10, %xmm6
1908 ; SSE2-NEXT: por %xmm5, %xmm6
1909 ; SSE2-NEXT: movdqa {{.*#+}} xmm5 = [1,2]
1910 ; SSE2-NEXT: pand %xmm5, %xmm9
1911 ; SSE2-NEXT: pcmpeqd %xmm5, %xmm9
1912 ; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm9[1,0,3,2]
1913 ; SSE2-NEXT: pand %xmm9, %xmm5
1914 ; SSE2-NEXT: pand %xmm5, %xmm4
1915 ; SSE2-NEXT: pandn %xmm10, %xmm5
1916 ; SSE2-NEXT: por %xmm4, %xmm5
1917 ; SSE2-NEXT: divpd %xmm5, %xmm0
1918 ; SSE2-NEXT: divpd %xmm6, %xmm1
1919 ; SSE2-NEXT: divpd %xmm7, %xmm2
1920 ; SSE2-NEXT: divpd %xmm8, %xmm3
1923 ; SSE42-LABEL: fdiv_v8f64_cast_cond:
1925 ; SSE42-NEXT: movapd %xmm0, %xmm9
1926 ; SSE42-NEXT: movd %edi, %xmm0
1927 ; SSE42-NEXT: pshufd {{.*#+}} xmm8 = xmm0[0,1,0,1]
1928 ; SSE42-NEXT: movdqa {{.*#+}} xmm10 = [64,128]
1929 ; SSE42-NEXT: movdqa %xmm8, %xmm0
1930 ; SSE42-NEXT: pand %xmm10, %xmm0
1931 ; SSE42-NEXT: pcmpeqq %xmm10, %xmm0
1932 ; SSE42-NEXT: movapd {{.*#+}} xmm11 = [1.0E+0,1.0E+0]
1933 ; SSE42-NEXT: movapd %xmm11, %xmm10
1934 ; SSE42-NEXT: blendvpd %xmm0, %xmm7, %xmm10
1935 ; SSE42-NEXT: movdqa {{.*#+}} xmm7 = [16,32]
1936 ; SSE42-NEXT: movdqa %xmm8, %xmm0
1937 ; SSE42-NEXT: pand %xmm7, %xmm0
1938 ; SSE42-NEXT: pcmpeqq %xmm7, %xmm0
1939 ; SSE42-NEXT: movapd %xmm11, %xmm7
1940 ; SSE42-NEXT: blendvpd %xmm0, %xmm6, %xmm7
1941 ; SSE42-NEXT: movdqa {{.*#+}} xmm6 = [4,8]
1942 ; SSE42-NEXT: movdqa %xmm8, %xmm0
1943 ; SSE42-NEXT: pand %xmm6, %xmm0
1944 ; SSE42-NEXT: pcmpeqq %xmm6, %xmm0
1945 ; SSE42-NEXT: movapd %xmm11, %xmm6
1946 ; SSE42-NEXT: blendvpd %xmm0, %xmm5, %xmm6
1947 ; SSE42-NEXT: movdqa {{.*#+}} xmm0 = [1,2]
1948 ; SSE42-NEXT: pand %xmm0, %xmm8
1949 ; SSE42-NEXT: pcmpeqq %xmm0, %xmm8
1950 ; SSE42-NEXT: movdqa %xmm8, %xmm0
1951 ; SSE42-NEXT: blendvpd %xmm0, %xmm4, %xmm11
1952 ; SSE42-NEXT: divpd %xmm11, %xmm9
1953 ; SSE42-NEXT: divpd %xmm6, %xmm1
1954 ; SSE42-NEXT: divpd %xmm7, %xmm2
1955 ; SSE42-NEXT: divpd %xmm10, %xmm3
1956 ; SSE42-NEXT: movapd %xmm9, %xmm0
1959 ; AVX2-LABEL: fdiv_v8f64_cast_cond:
1961 ; AVX2-NEXT: vmovd %edi, %xmm4
1962 ; AVX2-NEXT: vpbroadcastb %xmm4, %ymm4
1963 ; AVX2-NEXT: vmovdqa {{.*#+}} ymm5 = [16,32,64,128]
1964 ; AVX2-NEXT: vpand %ymm5, %ymm4, %ymm6
1965 ; AVX2-NEXT: vpcmpeqq %ymm5, %ymm6, %ymm5
1966 ; AVX2-NEXT: vbroadcastsd {{.*#+}} ymm6 = [1.0E+0,1.0E+0,1.0E+0,1.0E+0]
1967 ; AVX2-NEXT: vblendvpd %ymm5, %ymm3, %ymm6, %ymm3
1968 ; AVX2-NEXT: vmovdqa {{.*#+}} ymm5 = [1,2,4,8]
1969 ; AVX2-NEXT: vpand %ymm5, %ymm4, %ymm4
1970 ; AVX2-NEXT: vpcmpeqq %ymm5, %ymm4, %ymm4
1971 ; AVX2-NEXT: vblendvpd %ymm4, %ymm2, %ymm6, %ymm2
1972 ; AVX2-NEXT: vdivpd %ymm2, %ymm0, %ymm0
1973 ; AVX2-NEXT: vdivpd %ymm3, %ymm1, %ymm1
1976 ; AVX512-LABEL: fdiv_v8f64_cast_cond:
1978 ; AVX512-NEXT: kmovw %edi, %k1
1979 ; AVX512-NEXT: vdivpd %zmm1, %zmm0, %zmm0 {%k1}
1981 %b = bitcast i8 %pb to <8 x i1>
1982 %s = select <8 x i1> %b, <8 x double> %y, <8 x double> <double 1.0, double 1.0, double 1.0, double 1.0, double 1.0, double 1.0, double 1.0, double 1.0>
1983 %r = fdiv <8 x double> %x, %s
1987 define <4 x i32> @add_v4i32(<4 x i1> %b, <4 x i32> noundef %x, <4 x i32> noundef %y) {
1988 ; SSE-LABEL: add_v4i32:
1990 ; SSE-NEXT: pslld $31, %xmm0
1991 ; SSE-NEXT: psrad $31, %xmm0
1992 ; SSE-NEXT: pand %xmm2, %xmm0
1993 ; SSE-NEXT: paddd %xmm1, %xmm0
1996 ; AVX2-LABEL: add_v4i32:
1998 ; AVX2-NEXT: vpslld $31, %xmm0, %xmm0
1999 ; AVX2-NEXT: vpsrad $31, %xmm0, %xmm0
2000 ; AVX2-NEXT: vpand %xmm2, %xmm0, %xmm0
2001 ; AVX2-NEXT: vpaddd %xmm0, %xmm1, %xmm0
2004 ; AVX512F-LABEL: add_v4i32:
2006 ; AVX512F-NEXT: # kill: def $xmm2 killed $xmm2 def $zmm2
2007 ; AVX512F-NEXT: vpslld $31, %xmm0, %xmm0
2008 ; AVX512F-NEXT: vptestmd %zmm0, %zmm0, %k1
2009 ; AVX512F-NEXT: vmovdqa32 %zmm2, %zmm0 {%k1} {z}
2010 ; AVX512F-NEXT: vpaddd %xmm0, %xmm1, %xmm0
2011 ; AVX512F-NEXT: vzeroupper
2012 ; AVX512F-NEXT: retq
2014 ; AVX512VL-LABEL: add_v4i32:
2015 ; AVX512VL: # %bb.0:
2016 ; AVX512VL-NEXT: vpslld $31, %xmm0, %xmm0
2017 ; AVX512VL-NEXT: vptestmd %xmm0, %xmm0, %k1
2018 ; AVX512VL-NEXT: vpaddd %xmm2, %xmm1, %xmm1 {%k1}
2019 ; AVX512VL-NEXT: vmovdqa %xmm1, %xmm0
2020 ; AVX512VL-NEXT: retq
2021 %s = select <4 x i1> %b, <4 x i32> %y, <4 x i32> zeroinitializer
2022 %r = add <4 x i32> %x, %s
2026 define <8 x i32> @add_v8i32_commute(<8 x i1> %b, <8 x i32> noundef %x, <8 x i32> noundef %y) {
2027 ; SSE2-LABEL: add_v8i32_commute:
2029 ; SSE2-NEXT: movdqa %xmm0, %xmm5
2030 ; SSE2-NEXT: punpckhwd {{.*#+}} xmm5 = xmm5[4,4,5,5,6,6,7,7]
2031 ; SSE2-NEXT: pslld $31, %xmm5
2032 ; SSE2-NEXT: psrad $31, %xmm5
2033 ; SSE2-NEXT: pand %xmm4, %xmm5
2034 ; SSE2-NEXT: punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]
2035 ; SSE2-NEXT: pslld $31, %xmm0
2036 ; SSE2-NEXT: psrad $31, %xmm0
2037 ; SSE2-NEXT: pand %xmm3, %xmm0
2038 ; SSE2-NEXT: paddd %xmm1, %xmm0
2039 ; SSE2-NEXT: paddd %xmm2, %xmm5
2040 ; SSE2-NEXT: movdqa %xmm5, %xmm1
2043 ; SSE42-LABEL: add_v8i32_commute:
2045 ; SSE42-NEXT: movdqa %xmm0, %xmm5
2046 ; SSE42-NEXT: pmovzxwd {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero
2047 ; SSE42-NEXT: punpckhwd {{.*#+}} xmm5 = xmm5[4,4,5,5,6,6,7,7]
2048 ; SSE42-NEXT: pslld $31, %xmm5
2049 ; SSE42-NEXT: psrad $31, %xmm5
2050 ; SSE42-NEXT: pand %xmm4, %xmm5
2051 ; SSE42-NEXT: pslld $31, %xmm0
2052 ; SSE42-NEXT: psrad $31, %xmm0
2053 ; SSE42-NEXT: pand %xmm3, %xmm0
2054 ; SSE42-NEXT: paddd %xmm1, %xmm0
2055 ; SSE42-NEXT: paddd %xmm2, %xmm5
2056 ; SSE42-NEXT: movdqa %xmm5, %xmm1
2059 ; AVX2-LABEL: add_v8i32_commute:
2061 ; AVX2-NEXT: vpmovzxwd {{.*#+}} ymm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero
2062 ; AVX2-NEXT: vpslld $31, %ymm0, %ymm0
2063 ; AVX2-NEXT: vpsrad $31, %ymm0, %ymm0
2064 ; AVX2-NEXT: vpand %ymm2, %ymm0, %ymm0
2065 ; AVX2-NEXT: vpaddd %ymm1, %ymm0, %ymm0
2068 ; AVX512F-LABEL: add_v8i32_commute:
2070 ; AVX512F-NEXT: # kill: def $ymm2 killed $ymm2 def $zmm2
2071 ; AVX512F-NEXT: vpmovsxwq %xmm0, %zmm0
2072 ; AVX512F-NEXT: vpsllq $63, %zmm0, %zmm0
2073 ; AVX512F-NEXT: vptestmq %zmm0, %zmm0, %k1
2074 ; AVX512F-NEXT: vmovdqa32 %zmm2, %zmm0 {%k1} {z}
2075 ; AVX512F-NEXT: vpaddd %ymm1, %ymm0, %ymm0
2076 ; AVX512F-NEXT: retq
2078 ; AVX512VL-LABEL: add_v8i32_commute:
2079 ; AVX512VL: # %bb.0:
2080 ; AVX512VL-NEXT: vpmovsxwd %xmm0, %ymm0
2081 ; AVX512VL-NEXT: vpslld $31, %ymm0, %ymm0
2082 ; AVX512VL-NEXT: vptestmd %ymm0, %ymm0, %k1
2083 ; AVX512VL-NEXT: vpaddd %ymm2, %ymm1, %ymm1 {%k1}
2084 ; AVX512VL-NEXT: vmovdqa %ymm1, %ymm0
2085 ; AVX512VL-NEXT: retq
2086 %s = select <8 x i1> %b, <8 x i32> %y, <8 x i32> zeroinitializer
2087 %r = add <8 x i32> %s, %x
2091 define <8 x i32> @add_v8i32_cast_cond(i8 noundef zeroext %pb, <8 x i32> noundef %x, <8 x i32> noundef %y) {
2092 ; SSE-LABEL: add_v8i32_cast_cond:
2094 ; SSE-NEXT: movd %edi, %xmm4
2095 ; SSE-NEXT: pshufd {{.*#+}} xmm4 = xmm4[0,0,0,0]
2096 ; SSE-NEXT: movdqa {{.*#+}} xmm5 = [16,32,64,128]
2097 ; SSE-NEXT: movdqa %xmm4, %xmm6
2098 ; SSE-NEXT: pand %xmm5, %xmm6
2099 ; SSE-NEXT: pcmpeqd %xmm5, %xmm6
2100 ; SSE-NEXT: pand %xmm3, %xmm6
2101 ; SSE-NEXT: movdqa {{.*#+}} xmm3 = [1,2,4,8]
2102 ; SSE-NEXT: pand %xmm3, %xmm4
2103 ; SSE-NEXT: pcmpeqd %xmm3, %xmm4
2104 ; SSE-NEXT: pand %xmm2, %xmm4
2105 ; SSE-NEXT: paddd %xmm4, %xmm0
2106 ; SSE-NEXT: paddd %xmm6, %xmm1
2109 ; AVX2-LABEL: add_v8i32_cast_cond:
2111 ; AVX2-NEXT: vmovd %edi, %xmm2
2112 ; AVX2-NEXT: vpbroadcastb %xmm2, %ymm2
2113 ; AVX2-NEXT: vmovdqa {{.*#+}} ymm3 = [1,2,4,8,16,32,64,128]
2114 ; AVX2-NEXT: vpand %ymm3, %ymm2, %ymm2
2115 ; AVX2-NEXT: vpcmpeqd %ymm3, %ymm2, %ymm2
2116 ; AVX2-NEXT: vpand %ymm1, %ymm2, %ymm1
2117 ; AVX2-NEXT: vpaddd %ymm1, %ymm0, %ymm0
2120 ; AVX512F-LABEL: add_v8i32_cast_cond:
2122 ; AVX512F-NEXT: # kill: def $ymm1 killed $ymm1 def $zmm1
2123 ; AVX512F-NEXT: kmovw %edi, %k1
2124 ; AVX512F-NEXT: vmovdqa32 %zmm1, %zmm1 {%k1} {z}
2125 ; AVX512F-NEXT: vpaddd %ymm1, %ymm0, %ymm0
2126 ; AVX512F-NEXT: retq
2128 ; AVX512VL-LABEL: add_v8i32_cast_cond:
2129 ; AVX512VL: # %bb.0:
2130 ; AVX512VL-NEXT: kmovw %edi, %k1
2131 ; AVX512VL-NEXT: vpaddd %ymm1, %ymm0, %ymm0 {%k1}
2132 ; AVX512VL-NEXT: retq
2133 %b = bitcast i8 %pb to <8 x i1>
2134 %s = select <8 x i1> %b, <8 x i32> %y, <8 x i32> zeroinitializer
2135 %r = add <8 x i32> %x, %s
2139 define <8 x i64> @add_v8i64_cast_cond(i8 noundef zeroext %pb, <8 x i64> noundef %x, <8 x i64> noundef %y) {
2140 ; SSE2-LABEL: add_v8i64_cast_cond:
2142 ; SSE2-NEXT: movd %edi, %xmm8
2143 ; SSE2-NEXT: pshufd {{.*#+}} xmm9 = xmm8[0,1,0,1]
2144 ; SSE2-NEXT: movdqa {{.*#+}} xmm10 = [64,128]
2145 ; SSE2-NEXT: movdqa %xmm9, %xmm8
2146 ; SSE2-NEXT: pand %xmm10, %xmm8
2147 ; SSE2-NEXT: pcmpeqd %xmm10, %xmm8
2148 ; SSE2-NEXT: pshufd {{.*#+}} xmm10 = xmm8[1,0,3,2]
2149 ; SSE2-NEXT: pand %xmm7, %xmm8
2150 ; SSE2-NEXT: pand %xmm10, %xmm8
2151 ; SSE2-NEXT: movdqa {{.*#+}} xmm10 = [16,32]
2152 ; SSE2-NEXT: movdqa %xmm9, %xmm7
2153 ; SSE2-NEXT: pand %xmm10, %xmm7
2154 ; SSE2-NEXT: pcmpeqd %xmm10, %xmm7
2155 ; SSE2-NEXT: pshufd {{.*#+}} xmm10 = xmm7[1,0,3,2]
2156 ; SSE2-NEXT: pand %xmm6, %xmm7
2157 ; SSE2-NEXT: pand %xmm10, %xmm7
2158 ; SSE2-NEXT: movdqa {{.*#+}} xmm6 = [4,8]
2159 ; SSE2-NEXT: movdqa %xmm9, %xmm10
2160 ; SSE2-NEXT: pand %xmm6, %xmm10
2161 ; SSE2-NEXT: pcmpeqd %xmm6, %xmm10
2162 ; SSE2-NEXT: pshufd {{.*#+}} xmm6 = xmm10[1,0,3,2]
2163 ; SSE2-NEXT: pand %xmm5, %xmm10
2164 ; SSE2-NEXT: pand %xmm6, %xmm10
2165 ; SSE2-NEXT: movdqa {{.*#+}} xmm5 = [1,2]
2166 ; SSE2-NEXT: pand %xmm5, %xmm9
2167 ; SSE2-NEXT: pcmpeqd %xmm5, %xmm9
2168 ; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm9[1,0,3,2]
2169 ; SSE2-NEXT: pand %xmm4, %xmm9
2170 ; SSE2-NEXT: pand %xmm5, %xmm9
2171 ; SSE2-NEXT: paddq %xmm9, %xmm0
2172 ; SSE2-NEXT: paddq %xmm10, %xmm1
2173 ; SSE2-NEXT: paddq %xmm7, %xmm2
2174 ; SSE2-NEXT: paddq %xmm8, %xmm3
2177 ; SSE42-LABEL: add_v8i64_cast_cond:
2179 ; SSE42-NEXT: movd %edi, %xmm8
2180 ; SSE42-NEXT: pshufd {{.*#+}} xmm9 = xmm8[0,1,0,1]
2181 ; SSE42-NEXT: movdqa {{.*#+}} xmm10 = [64,128]
2182 ; SSE42-NEXT: movdqa %xmm9, %xmm8
2183 ; SSE42-NEXT: pand %xmm10, %xmm8
2184 ; SSE42-NEXT: pcmpeqq %xmm10, %xmm8
2185 ; SSE42-NEXT: pand %xmm7, %xmm8
2186 ; SSE42-NEXT: movdqa {{.*#+}} xmm7 = [16,32]
2187 ; SSE42-NEXT: movdqa %xmm9, %xmm10
2188 ; SSE42-NEXT: pand %xmm7, %xmm10
2189 ; SSE42-NEXT: pcmpeqq %xmm7, %xmm10
2190 ; SSE42-NEXT: pand %xmm6, %xmm10
2191 ; SSE42-NEXT: movdqa {{.*#+}} xmm6 = [4,8]
2192 ; SSE42-NEXT: movdqa %xmm9, %xmm7
2193 ; SSE42-NEXT: pand %xmm6, %xmm7
2194 ; SSE42-NEXT: pcmpeqq %xmm6, %xmm7
2195 ; SSE42-NEXT: pand %xmm5, %xmm7
2196 ; SSE42-NEXT: movdqa {{.*#+}} xmm5 = [1,2]
2197 ; SSE42-NEXT: pand %xmm5, %xmm9
2198 ; SSE42-NEXT: pcmpeqq %xmm5, %xmm9
2199 ; SSE42-NEXT: pand %xmm4, %xmm9
2200 ; SSE42-NEXT: paddq %xmm9, %xmm0
2201 ; SSE42-NEXT: paddq %xmm7, %xmm1
2202 ; SSE42-NEXT: paddq %xmm10, %xmm2
2203 ; SSE42-NEXT: paddq %xmm8, %xmm3
2206 ; AVX2-LABEL: add_v8i64_cast_cond:
2208 ; AVX2-NEXT: vmovd %edi, %xmm4
2209 ; AVX2-NEXT: vpbroadcastb %xmm4, %ymm4
2210 ; AVX2-NEXT: vmovdqa {{.*#+}} ymm5 = [16,32,64,128]
2211 ; AVX2-NEXT: vpand %ymm5, %ymm4, %ymm6
2212 ; AVX2-NEXT: vpcmpeqq %ymm5, %ymm6, %ymm5
2213 ; AVX2-NEXT: vpand %ymm3, %ymm5, %ymm3
2214 ; AVX2-NEXT: vmovdqa {{.*#+}} ymm5 = [1,2,4,8]
2215 ; AVX2-NEXT: vpand %ymm5, %ymm4, %ymm4
2216 ; AVX2-NEXT: vpcmpeqq %ymm5, %ymm4, %ymm4
2217 ; AVX2-NEXT: vpand %ymm2, %ymm4, %ymm2
2218 ; AVX2-NEXT: vpaddq %ymm2, %ymm0, %ymm0
2219 ; AVX2-NEXT: vpaddq %ymm3, %ymm1, %ymm1
2222 ; AVX512-LABEL: add_v8i64_cast_cond:
2224 ; AVX512-NEXT: kmovw %edi, %k1
2225 ; AVX512-NEXT: vpaddq %zmm1, %zmm0, %zmm0 {%k1}
2227 %b = bitcast i8 %pb to <8 x i1>
2228 %s = select <8 x i1> %b, <8 x i64> %y, <8 x i64> zeroinitializer
2229 %r = add <8 x i64> %x, %s
2233 define <4 x i32> @sub_v4i32(<4 x i1> %b, <4 x i32> noundef %x, <4 x i32> noundef %y) {
2234 ; SSE-LABEL: sub_v4i32:
2236 ; SSE-NEXT: pslld $31, %xmm0
2237 ; SSE-NEXT: psrad $31, %xmm0
2238 ; SSE-NEXT: pand %xmm2, %xmm0
2239 ; SSE-NEXT: psubd %xmm0, %xmm1
2240 ; SSE-NEXT: movdqa %xmm1, %xmm0
2243 ; AVX2-LABEL: sub_v4i32:
2245 ; AVX2-NEXT: vpslld $31, %xmm0, %xmm0
2246 ; AVX2-NEXT: vpsrad $31, %xmm0, %xmm0
2247 ; AVX2-NEXT: vpand %xmm2, %xmm0, %xmm0
2248 ; AVX2-NEXT: vpsubd %xmm0, %xmm1, %xmm0
2251 ; AVX512F-LABEL: sub_v4i32:
2253 ; AVX512F-NEXT: # kill: def $xmm2 killed $xmm2 def $zmm2
2254 ; AVX512F-NEXT: vpslld $31, %xmm0, %xmm0
2255 ; AVX512F-NEXT: vptestmd %zmm0, %zmm0, %k1
2256 ; AVX512F-NEXT: vmovdqa32 %zmm2, %zmm0 {%k1} {z}
2257 ; AVX512F-NEXT: vpsubd %xmm0, %xmm1, %xmm0
2258 ; AVX512F-NEXT: vzeroupper
2259 ; AVX512F-NEXT: retq
2261 ; AVX512VL-LABEL: sub_v4i32:
2262 ; AVX512VL: # %bb.0:
2263 ; AVX512VL-NEXT: vpslld $31, %xmm0, %xmm0
2264 ; AVX512VL-NEXT: vptestmd %xmm0, %xmm0, %k1
2265 ; AVX512VL-NEXT: vpsubd %xmm2, %xmm1, %xmm1 {%k1}
2266 ; AVX512VL-NEXT: vmovdqa %xmm1, %xmm0
2267 ; AVX512VL-NEXT: retq
2268 %s = select <4 x i1> %b, <4 x i32> %y, <4 x i32> zeroinitializer
2269 %r = sub <4 x i32> %x, %s
2273 ; negative test - sub is not commutative; there is no identity constant for operand 0
2275 define <8 x i32> @sub_v8i32_commute(<8 x i1> %b, <8 x i32> noundef %x, <8 x i32> noundef %y) {
2276 ; SSE2-LABEL: sub_v8i32_commute:
2278 ; SSE2-NEXT: movdqa %xmm0, %xmm5
2279 ; SSE2-NEXT: punpckhwd {{.*#+}} xmm5 = xmm5[4,4,5,5,6,6,7,7]
2280 ; SSE2-NEXT: pslld $31, %xmm5
2281 ; SSE2-NEXT: psrad $31, %xmm5
2282 ; SSE2-NEXT: pand %xmm4, %xmm5
2283 ; SSE2-NEXT: punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]
2284 ; SSE2-NEXT: pslld $31, %xmm0
2285 ; SSE2-NEXT: psrad $31, %xmm0
2286 ; SSE2-NEXT: pand %xmm3, %xmm0
2287 ; SSE2-NEXT: psubd %xmm1, %xmm0
2288 ; SSE2-NEXT: psubd %xmm2, %xmm5
2289 ; SSE2-NEXT: movdqa %xmm5, %xmm1
2292 ; SSE42-LABEL: sub_v8i32_commute:
2294 ; SSE42-NEXT: movdqa %xmm0, %xmm5
2295 ; SSE42-NEXT: pmovzxwd {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero
2296 ; SSE42-NEXT: punpckhwd {{.*#+}} xmm5 = xmm5[4,4,5,5,6,6,7,7]
2297 ; SSE42-NEXT: pslld $31, %xmm5
2298 ; SSE42-NEXT: psrad $31, %xmm5
2299 ; SSE42-NEXT: pand %xmm4, %xmm5
2300 ; SSE42-NEXT: pslld $31, %xmm0
2301 ; SSE42-NEXT: psrad $31, %xmm0
2302 ; SSE42-NEXT: pand %xmm3, %xmm0
2303 ; SSE42-NEXT: psubd %xmm1, %xmm0
2304 ; SSE42-NEXT: psubd %xmm2, %xmm5
2305 ; SSE42-NEXT: movdqa %xmm5, %xmm1
2308 ; AVX2-LABEL: sub_v8i32_commute:
2310 ; AVX2-NEXT: vpmovzxwd {{.*#+}} ymm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero
2311 ; AVX2-NEXT: vpslld $31, %ymm0, %ymm0
2312 ; AVX2-NEXT: vpsrad $31, %ymm0, %ymm0
2313 ; AVX2-NEXT: vpand %ymm2, %ymm0, %ymm0
2314 ; AVX2-NEXT: vpsubd %ymm1, %ymm0, %ymm0
2317 ; AVX512F-LABEL: sub_v8i32_commute:
2319 ; AVX512F-NEXT: # kill: def $ymm2 killed $ymm2 def $zmm2
2320 ; AVX512F-NEXT: vpmovsxwq %xmm0, %zmm0
2321 ; AVX512F-NEXT: vpsllq $63, %zmm0, %zmm0
2322 ; AVX512F-NEXT: vptestmq %zmm0, %zmm0, %k1
2323 ; AVX512F-NEXT: vmovdqa32 %zmm2, %zmm0 {%k1} {z}
2324 ; AVX512F-NEXT: vpsubd %ymm1, %ymm0, %ymm0
2325 ; AVX512F-NEXT: retq
2327 ; AVX512VL-LABEL: sub_v8i32_commute:
2328 ; AVX512VL: # %bb.0:
2329 ; AVX512VL-NEXT: vpmovsxwd %xmm0, %ymm0
2330 ; AVX512VL-NEXT: vpslld $31, %ymm0, %ymm0
2331 ; AVX512VL-NEXT: vptestmd %ymm0, %ymm0, %k1
2332 ; AVX512VL-NEXT: vmovdqa32 %ymm2, %ymm0 {%k1} {z}
2333 ; AVX512VL-NEXT: vpsubd %ymm1, %ymm0, %ymm0
2334 ; AVX512VL-NEXT: retq
2335 %s = select <8 x i1> %b, <8 x i32> %y, <8 x i32> zeroinitializer
2336 %r = sub <8 x i32> %s, %x
2340 define <16 x i32> @sub_v16i32_swap(<16 x i1> %b, <16 x i32> noundef %x, <16 x i32> noundef %y) {
2341 ; SSE2-LABEL: sub_v16i32_swap:
2343 ; SSE2-NEXT: movdqa %xmm0, %xmm9
2344 ; SSE2-NEXT: punpckhbw {{.*#+}} xmm9 = xmm9[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]
2345 ; SSE2-NEXT: movdqa %xmm9, %xmm8
2346 ; SSE2-NEXT: punpckhwd {{.*#+}} xmm8 = xmm8[4,4,5,5,6,6,7,7]
2347 ; SSE2-NEXT: pslld $31, %xmm8
2348 ; SSE2-NEXT: psrad $31, %xmm8
2349 ; SSE2-NEXT: pandn {{[0-9]+}}(%rsp), %xmm8
2350 ; SSE2-NEXT: punpcklwd {{.*#+}} xmm9 = xmm9[0,0,1,1,2,2,3,3]
2351 ; SSE2-NEXT: pslld $31, %xmm9
2352 ; SSE2-NEXT: psrad $31, %xmm9
2353 ; SSE2-NEXT: pandn %xmm7, %xmm9
2354 ; SSE2-NEXT: punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
2355 ; SSE2-NEXT: movdqa %xmm0, %xmm7
2356 ; SSE2-NEXT: punpckhwd {{.*#+}} xmm7 = xmm7[4,4,5,5,6,6,7,7]
2357 ; SSE2-NEXT: pslld $31, %xmm7
2358 ; SSE2-NEXT: psrad $31, %xmm7
2359 ; SSE2-NEXT: pandn %xmm6, %xmm7
2360 ; SSE2-NEXT: punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]
2361 ; SSE2-NEXT: pslld $31, %xmm0
2362 ; SSE2-NEXT: psrad $31, %xmm0
2363 ; SSE2-NEXT: pandn %xmm5, %xmm0
2364 ; SSE2-NEXT: psubd %xmm0, %xmm1
2365 ; SSE2-NEXT: psubd %xmm7, %xmm2
2366 ; SSE2-NEXT: psubd %xmm9, %xmm3
2367 ; SSE2-NEXT: psubd %xmm8, %xmm4
2368 ; SSE2-NEXT: movdqa %xmm1, %xmm0
2369 ; SSE2-NEXT: movdqa %xmm2, %xmm1
2370 ; SSE2-NEXT: movdqa %xmm3, %xmm2
2371 ; SSE2-NEXT: movdqa %xmm4, %xmm3
2374 ; SSE42-LABEL: sub_v16i32_swap:
2376 ; SSE42-NEXT: pshufd {{.*#+}} xmm8 = xmm0[2,3,2,3]
2377 ; SSE42-NEXT: pmovzxbd {{.*#+}} xmm8 = xmm8[0],zero,zero,zero,xmm8[1],zero,zero,zero,xmm8[2],zero,zero,zero,xmm8[3],zero,zero,zero
2378 ; SSE42-NEXT: pslld $31, %xmm8
2379 ; SSE42-NEXT: psrad $31, %xmm8
2380 ; SSE42-NEXT: pandn %xmm7, %xmm8
2381 ; SSE42-NEXT: pshufd {{.*#+}} xmm7 = xmm0[1,1,1,1]
2382 ; SSE42-NEXT: pmovzxbd {{.*#+}} xmm7 = xmm7[0],zero,zero,zero,xmm7[1],zero,zero,zero,xmm7[2],zero,zero,zero,xmm7[3],zero,zero,zero
2383 ; SSE42-NEXT: pslld $31, %xmm7
2384 ; SSE42-NEXT: psrad $31, %xmm7
2385 ; SSE42-NEXT: pandn %xmm6, %xmm7
2386 ; SSE42-NEXT: pmovzxbd {{.*#+}} xmm6 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero
2387 ; SSE42-NEXT: pslld $31, %xmm6
2388 ; SSE42-NEXT: psrad $31, %xmm6
2389 ; SSE42-NEXT: pandn %xmm5, %xmm6
2390 ; SSE42-NEXT: pshufd {{.*#+}} xmm0 = xmm0[3,3,3,3]
2391 ; SSE42-NEXT: pmovzxbd {{.*#+}} xmm0 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero
2392 ; SSE42-NEXT: pslld $31, %xmm0
2393 ; SSE42-NEXT: psrad $31, %xmm0
2394 ; SSE42-NEXT: pandn {{[0-9]+}}(%rsp), %xmm0
2395 ; SSE42-NEXT: psubd %xmm6, %xmm1
2396 ; SSE42-NEXT: psubd %xmm7, %xmm2
2397 ; SSE42-NEXT: psubd %xmm8, %xmm3
2398 ; SSE42-NEXT: psubd %xmm0, %xmm4
2399 ; SSE42-NEXT: movdqa %xmm1, %xmm0
2400 ; SSE42-NEXT: movdqa %xmm2, %xmm1
2401 ; SSE42-NEXT: movdqa %xmm3, %xmm2
2402 ; SSE42-NEXT: movdqa %xmm4, %xmm3
2405 ; AVX2-LABEL: sub_v16i32_swap:
2407 ; AVX2-NEXT: vpunpckhbw {{.*#+}} xmm5 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]
2408 ; AVX2-NEXT: vpmovzxwd {{.*#+}} ymm5 = xmm5[0],zero,xmm5[1],zero,xmm5[2],zero,xmm5[3],zero,xmm5[4],zero,xmm5[5],zero,xmm5[6],zero,xmm5[7],zero
2409 ; AVX2-NEXT: vpslld $31, %ymm5, %ymm5
2410 ; AVX2-NEXT: vpsrad $31, %ymm5, %ymm5
2411 ; AVX2-NEXT: vpandn %ymm4, %ymm5, %ymm4
2412 ; AVX2-NEXT: vpmovzxbd {{.*#+}} ymm0 = 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
2413 ; AVX2-NEXT: vpslld $31, %ymm0, %ymm0
2414 ; AVX2-NEXT: vpsrad $31, %ymm0, %ymm0
2415 ; AVX2-NEXT: vpandn %ymm3, %ymm0, %ymm0
2416 ; AVX2-NEXT: vpsubd %ymm0, %ymm1, %ymm0
2417 ; AVX2-NEXT: vpsubd %ymm4, %ymm2, %ymm1
2420 ; AVX512-LABEL: sub_v16i32_swap:
2422 ; AVX512-NEXT: vpmovsxbd %xmm0, %zmm0
2423 ; AVX512-NEXT: vpslld $31, %zmm0, %zmm0
2424 ; AVX512-NEXT: vptestnmd %zmm0, %zmm0, %k1
2425 ; AVX512-NEXT: vpsubd %zmm2, %zmm1, %zmm1 {%k1}
2426 ; AVX512-NEXT: vmovdqa64 %zmm1, %zmm0
2428 %s = select <16 x i1> %b, <16 x i32> zeroinitializer, <16 x i32> %y
2429 %r = sub <16 x i32> %x, %s
2433 ; negative test - sub is not commutative; there is no identity constant for operand 0
2435 define <16 x i32> @sub_v16i32_commute_swap(<16 x i1> %b, <16 x i32> noundef %x, <16 x i32> noundef %y) {
2436 ; SSE2-LABEL: sub_v16i32_commute_swap:
2438 ; SSE2-NEXT: movdqa %xmm2, %xmm8
2439 ; SSE2-NEXT: movdqa %xmm0, %xmm2
2440 ; SSE2-NEXT: punpckhbw {{.*#+}} xmm2 = xmm2[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]
2441 ; SSE2-NEXT: movdqa %xmm2, %xmm9
2442 ; SSE2-NEXT: punpckhwd {{.*#+}} xmm9 = xmm9[4,4,5,5,6,6,7,7]
2443 ; SSE2-NEXT: pslld $31, %xmm9
2444 ; SSE2-NEXT: psrad $31, %xmm9
2445 ; SSE2-NEXT: pandn {{[0-9]+}}(%rsp), %xmm9
2446 ; SSE2-NEXT: punpcklwd {{.*#+}} xmm2 = xmm2[0,0,1,1,2,2,3,3]
2447 ; SSE2-NEXT: pslld $31, %xmm2
2448 ; SSE2-NEXT: psrad $31, %xmm2
2449 ; SSE2-NEXT: pandn %xmm7, %xmm2
2450 ; SSE2-NEXT: punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
2451 ; SSE2-NEXT: movdqa %xmm0, %xmm7
2452 ; SSE2-NEXT: punpckhwd {{.*#+}} xmm7 = xmm7[4,4,5,5,6,6,7,7]
2453 ; SSE2-NEXT: pslld $31, %xmm7
2454 ; SSE2-NEXT: psrad $31, %xmm7
2455 ; SSE2-NEXT: pandn %xmm6, %xmm7
2456 ; SSE2-NEXT: punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]
2457 ; SSE2-NEXT: pslld $31, %xmm0
2458 ; SSE2-NEXT: psrad $31, %xmm0
2459 ; SSE2-NEXT: pandn %xmm5, %xmm0
2460 ; SSE2-NEXT: psubd %xmm1, %xmm0
2461 ; SSE2-NEXT: psubd %xmm8, %xmm7
2462 ; SSE2-NEXT: psubd %xmm3, %xmm2
2463 ; SSE2-NEXT: psubd %xmm4, %xmm9
2464 ; SSE2-NEXT: movdqa %xmm7, %xmm1
2465 ; SSE2-NEXT: movdqa %xmm9, %xmm3
2468 ; SSE42-LABEL: sub_v16i32_commute_swap:
2470 ; SSE42-NEXT: movdqa %xmm2, %xmm8
2471 ; SSE42-NEXT: pshufd {{.*#+}} xmm2 = xmm0[2,3,2,3]
2472 ; SSE42-NEXT: pmovzxbd {{.*#+}} xmm2 = xmm2[0],zero,zero,zero,xmm2[1],zero,zero,zero,xmm2[2],zero,zero,zero,xmm2[3],zero,zero,zero
2473 ; SSE42-NEXT: pslld $31, %xmm2
2474 ; SSE42-NEXT: psrad $31, %xmm2
2475 ; SSE42-NEXT: pandn %xmm7, %xmm2
2476 ; SSE42-NEXT: pshufd {{.*#+}} xmm7 = xmm0[1,1,1,1]
2477 ; SSE42-NEXT: pmovzxbd {{.*#+}} xmm7 = xmm7[0],zero,zero,zero,xmm7[1],zero,zero,zero,xmm7[2],zero,zero,zero,xmm7[3],zero,zero,zero
2478 ; SSE42-NEXT: pslld $31, %xmm7
2479 ; SSE42-NEXT: psrad $31, %xmm7
2480 ; SSE42-NEXT: pandn %xmm6, %xmm7
2481 ; SSE42-NEXT: pmovzxbd {{.*#+}} xmm6 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero
2482 ; SSE42-NEXT: pslld $31, %xmm6
2483 ; SSE42-NEXT: psrad $31, %xmm6
2484 ; SSE42-NEXT: pandn %xmm5, %xmm6
2485 ; SSE42-NEXT: pshufd {{.*#+}} xmm0 = xmm0[3,3,3,3]
2486 ; SSE42-NEXT: pmovzxbd {{.*#+}} xmm5 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero
2487 ; SSE42-NEXT: pslld $31, %xmm5
2488 ; SSE42-NEXT: psrad $31, %xmm5
2489 ; SSE42-NEXT: pandn {{[0-9]+}}(%rsp), %xmm5
2490 ; SSE42-NEXT: psubd %xmm1, %xmm6
2491 ; SSE42-NEXT: psubd %xmm8, %xmm7
2492 ; SSE42-NEXT: psubd %xmm3, %xmm2
2493 ; SSE42-NEXT: psubd %xmm4, %xmm5
2494 ; SSE42-NEXT: movdqa %xmm6, %xmm0
2495 ; SSE42-NEXT: movdqa %xmm7, %xmm1
2496 ; SSE42-NEXT: movdqa %xmm5, %xmm3
2499 ; AVX2-LABEL: sub_v16i32_commute_swap:
2501 ; AVX2-NEXT: vpunpckhbw {{.*#+}} xmm5 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]
2502 ; AVX2-NEXT: vpmovzxwd {{.*#+}} ymm5 = xmm5[0],zero,xmm5[1],zero,xmm5[2],zero,xmm5[3],zero,xmm5[4],zero,xmm5[5],zero,xmm5[6],zero,xmm5[7],zero
2503 ; AVX2-NEXT: vpslld $31, %ymm5, %ymm5
2504 ; AVX2-NEXT: vpsrad $31, %ymm5, %ymm5
2505 ; AVX2-NEXT: vpandn %ymm4, %ymm5, %ymm4
2506 ; AVX2-NEXT: vpmovzxbd {{.*#+}} ymm0 = 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
2507 ; AVX2-NEXT: vpslld $31, %ymm0, %ymm0
2508 ; AVX2-NEXT: vpsrad $31, %ymm0, %ymm0
2509 ; AVX2-NEXT: vpandn %ymm3, %ymm0, %ymm0
2510 ; AVX2-NEXT: vpsubd %ymm1, %ymm0, %ymm0
2511 ; AVX2-NEXT: vpsubd %ymm2, %ymm4, %ymm1
2514 ; AVX512-LABEL: sub_v16i32_commute_swap:
2516 ; AVX512-NEXT: vpmovsxbd %xmm0, %zmm0
2517 ; AVX512-NEXT: vpslld $31, %zmm0, %zmm0
2518 ; AVX512-NEXT: vptestnmd %zmm0, %zmm0, %k1
2519 ; AVX512-NEXT: vmovdqa32 %zmm2, %zmm0 {%k1} {z}
2520 ; AVX512-NEXT: vpsubd %zmm1, %zmm0, %zmm0
2522 %s = select <16 x i1> %b, <16 x i32> zeroinitializer, <16 x i32> %y
2523 %r = sub <16 x i32> %s, %x
2527 define <8 x i32> @sub_v8i32_cast_cond(i8 noundef zeroext %pb, <8 x i32> noundef %x, <8 x i32> noundef %y) {
2528 ; SSE-LABEL: sub_v8i32_cast_cond:
2530 ; SSE-NEXT: movd %edi, %xmm4
2531 ; SSE-NEXT: pshufd {{.*#+}} xmm4 = xmm4[0,0,0,0]
2532 ; SSE-NEXT: movdqa {{.*#+}} xmm5 = [16,32,64,128]
2533 ; SSE-NEXT: movdqa %xmm4, %xmm6
2534 ; SSE-NEXT: pand %xmm5, %xmm6
2535 ; SSE-NEXT: pcmpeqd %xmm5, %xmm6
2536 ; SSE-NEXT: pand %xmm3, %xmm6
2537 ; SSE-NEXT: movdqa {{.*#+}} xmm3 = [1,2,4,8]
2538 ; SSE-NEXT: pand %xmm3, %xmm4
2539 ; SSE-NEXT: pcmpeqd %xmm3, %xmm4
2540 ; SSE-NEXT: pand %xmm2, %xmm4
2541 ; SSE-NEXT: psubd %xmm4, %xmm0
2542 ; SSE-NEXT: psubd %xmm6, %xmm1
2545 ; AVX2-LABEL: sub_v8i32_cast_cond:
2547 ; AVX2-NEXT: vmovd %edi, %xmm2
2548 ; AVX2-NEXT: vpbroadcastb %xmm2, %ymm2
2549 ; AVX2-NEXT: vmovdqa {{.*#+}} ymm3 = [1,2,4,8,16,32,64,128]
2550 ; AVX2-NEXT: vpand %ymm3, %ymm2, %ymm2
2551 ; AVX2-NEXT: vpcmpeqd %ymm3, %ymm2, %ymm2
2552 ; AVX2-NEXT: vpand %ymm1, %ymm2, %ymm1
2553 ; AVX2-NEXT: vpsubd %ymm1, %ymm0, %ymm0
2556 ; AVX512F-LABEL: sub_v8i32_cast_cond:
2558 ; AVX512F-NEXT: # kill: def $ymm1 killed $ymm1 def $zmm1
2559 ; AVX512F-NEXT: kmovw %edi, %k1
2560 ; AVX512F-NEXT: vmovdqa32 %zmm1, %zmm1 {%k1} {z}
2561 ; AVX512F-NEXT: vpsubd %ymm1, %ymm0, %ymm0
2562 ; AVX512F-NEXT: retq
2564 ; AVX512VL-LABEL: sub_v8i32_cast_cond:
2565 ; AVX512VL: # %bb.0:
2566 ; AVX512VL-NEXT: kmovw %edi, %k1
2567 ; AVX512VL-NEXT: vpsubd %ymm1, %ymm0, %ymm0 {%k1}
2568 ; AVX512VL-NEXT: retq
2569 %b = bitcast i8 %pb to <8 x i1>
2570 %s = select <8 x i1> %b, <8 x i32> %y, <8 x i32> zeroinitializer
2571 %r = sub <8 x i32> %x, %s
2575 define <8 x i64> @sub_v8i64_cast_cond(i8 noundef zeroext %pb, <8 x i64> noundef %x, <8 x i64> noundef %y) {
2576 ; SSE2-LABEL: sub_v8i64_cast_cond:
2578 ; SSE2-NEXT: movd %edi, %xmm8
2579 ; SSE2-NEXT: pshufd {{.*#+}} xmm9 = xmm8[0,1,0,1]
2580 ; SSE2-NEXT: movdqa {{.*#+}} xmm10 = [64,128]
2581 ; SSE2-NEXT: movdqa %xmm9, %xmm8
2582 ; SSE2-NEXT: pand %xmm10, %xmm8
2583 ; SSE2-NEXT: pcmpeqd %xmm10, %xmm8
2584 ; SSE2-NEXT: pshufd {{.*#+}} xmm10 = xmm8[1,0,3,2]
2585 ; SSE2-NEXT: pand %xmm7, %xmm8
2586 ; SSE2-NEXT: pand %xmm10, %xmm8
2587 ; SSE2-NEXT: movdqa {{.*#+}} xmm10 = [16,32]
2588 ; SSE2-NEXT: movdqa %xmm9, %xmm7
2589 ; SSE2-NEXT: pand %xmm10, %xmm7
2590 ; SSE2-NEXT: pcmpeqd %xmm10, %xmm7
2591 ; SSE2-NEXT: pshufd {{.*#+}} xmm10 = xmm7[1,0,3,2]
2592 ; SSE2-NEXT: pand %xmm6, %xmm7
2593 ; SSE2-NEXT: pand %xmm10, %xmm7
2594 ; SSE2-NEXT: movdqa {{.*#+}} xmm6 = [4,8]
2595 ; SSE2-NEXT: movdqa %xmm9, %xmm10
2596 ; SSE2-NEXT: pand %xmm6, %xmm10
2597 ; SSE2-NEXT: pcmpeqd %xmm6, %xmm10
2598 ; SSE2-NEXT: pshufd {{.*#+}} xmm6 = xmm10[1,0,3,2]
2599 ; SSE2-NEXT: pand %xmm5, %xmm10
2600 ; SSE2-NEXT: pand %xmm6, %xmm10
2601 ; SSE2-NEXT: movdqa {{.*#+}} xmm5 = [1,2]
2602 ; SSE2-NEXT: pand %xmm5, %xmm9
2603 ; SSE2-NEXT: pcmpeqd %xmm5, %xmm9
2604 ; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm9[1,0,3,2]
2605 ; SSE2-NEXT: pand %xmm4, %xmm9
2606 ; SSE2-NEXT: pand %xmm5, %xmm9
2607 ; SSE2-NEXT: psubq %xmm9, %xmm0
2608 ; SSE2-NEXT: psubq %xmm10, %xmm1
2609 ; SSE2-NEXT: psubq %xmm7, %xmm2
2610 ; SSE2-NEXT: psubq %xmm8, %xmm3
2613 ; SSE42-LABEL: sub_v8i64_cast_cond:
2615 ; SSE42-NEXT: movd %edi, %xmm8
2616 ; SSE42-NEXT: pshufd {{.*#+}} xmm9 = xmm8[0,1,0,1]
2617 ; SSE42-NEXT: movdqa {{.*#+}} xmm10 = [64,128]
2618 ; SSE42-NEXT: movdqa %xmm9, %xmm8
2619 ; SSE42-NEXT: pand %xmm10, %xmm8
2620 ; SSE42-NEXT: pcmpeqq %xmm10, %xmm8
2621 ; SSE42-NEXT: pand %xmm7, %xmm8
2622 ; SSE42-NEXT: movdqa {{.*#+}} xmm7 = [16,32]
2623 ; SSE42-NEXT: movdqa %xmm9, %xmm10
2624 ; SSE42-NEXT: pand %xmm7, %xmm10
2625 ; SSE42-NEXT: pcmpeqq %xmm7, %xmm10
2626 ; SSE42-NEXT: pand %xmm6, %xmm10
2627 ; SSE42-NEXT: movdqa {{.*#+}} xmm6 = [4,8]
2628 ; SSE42-NEXT: movdqa %xmm9, %xmm7
2629 ; SSE42-NEXT: pand %xmm6, %xmm7
2630 ; SSE42-NEXT: pcmpeqq %xmm6, %xmm7
2631 ; SSE42-NEXT: pand %xmm5, %xmm7
2632 ; SSE42-NEXT: movdqa {{.*#+}} xmm5 = [1,2]
2633 ; SSE42-NEXT: pand %xmm5, %xmm9
2634 ; SSE42-NEXT: pcmpeqq %xmm5, %xmm9
2635 ; SSE42-NEXT: pand %xmm4, %xmm9
2636 ; SSE42-NEXT: psubq %xmm9, %xmm0
2637 ; SSE42-NEXT: psubq %xmm7, %xmm1
2638 ; SSE42-NEXT: psubq %xmm10, %xmm2
2639 ; SSE42-NEXT: psubq %xmm8, %xmm3
2642 ; AVX2-LABEL: sub_v8i64_cast_cond:
2644 ; AVX2-NEXT: vmovd %edi, %xmm4
2645 ; AVX2-NEXT: vpbroadcastb %xmm4, %ymm4
2646 ; AVX2-NEXT: vmovdqa {{.*#+}} ymm5 = [16,32,64,128]
2647 ; AVX2-NEXT: vpand %ymm5, %ymm4, %ymm6
2648 ; AVX2-NEXT: vpcmpeqq %ymm5, %ymm6, %ymm5
2649 ; AVX2-NEXT: vpand %ymm3, %ymm5, %ymm3
2650 ; AVX2-NEXT: vmovdqa {{.*#+}} ymm5 = [1,2,4,8]
2651 ; AVX2-NEXT: vpand %ymm5, %ymm4, %ymm4
2652 ; AVX2-NEXT: vpcmpeqq %ymm5, %ymm4, %ymm4
2653 ; AVX2-NEXT: vpand %ymm2, %ymm4, %ymm2
2654 ; AVX2-NEXT: vpsubq %ymm2, %ymm0, %ymm0
2655 ; AVX2-NEXT: vpsubq %ymm3, %ymm1, %ymm1
2658 ; AVX512-LABEL: sub_v8i64_cast_cond:
2660 ; AVX512-NEXT: kmovw %edi, %k1
2661 ; AVX512-NEXT: vpsubq %zmm1, %zmm0, %zmm0 {%k1}
2663 %b = bitcast i8 %pb to <8 x i1>
2664 %s = select <8 x i1> %b, <8 x i64> %y, <8 x i64> zeroinitializer
2665 %r = sub <8 x i64> %x, %s
2669 define <4 x i32> @mul_v4i32(<4 x i1> %b, <4 x i32> noundef %x, <4 x i32> noundef %y) {
2670 ; SSE2-LABEL: mul_v4i32:
2672 ; SSE2-NEXT: pslld $31, %xmm0
2673 ; SSE2-NEXT: psrad $31, %xmm0
2674 ; SSE2-NEXT: pand %xmm0, %xmm2
2675 ; SSE2-NEXT: paddd %xmm0, %xmm2
2676 ; SSE2-NEXT: pcmpeqd %xmm0, %xmm0
2677 ; SSE2-NEXT: psubd %xmm0, %xmm2
2678 ; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm1[1,1,3,3]
2679 ; SSE2-NEXT: pmuludq %xmm2, %xmm1
2680 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm1[0,2,2,3]
2681 ; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm2[1,1,3,3]
2682 ; SSE2-NEXT: pmuludq %xmm3, %xmm1
2683 ; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm1[0,2,2,3]
2684 ; SSE2-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
2687 ; SSE42-LABEL: mul_v4i32:
2689 ; SSE42-NEXT: pslld $31, %xmm0
2690 ; SSE42-NEXT: movaps {{.*#+}} xmm3 = [1,1,1,1]
2691 ; SSE42-NEXT: blendvps %xmm0, %xmm2, %xmm3
2692 ; SSE42-NEXT: pmulld %xmm1, %xmm3
2693 ; SSE42-NEXT: movdqa %xmm3, %xmm0
2696 ; AVX2-LABEL: mul_v4i32:
2698 ; AVX2-NEXT: vpslld $31, %xmm0, %xmm0
2699 ; AVX2-NEXT: vbroadcastss {{.*#+}} xmm3 = [1,1,1,1]
2700 ; AVX2-NEXT: vblendvps %xmm0, %xmm2, %xmm3, %xmm0
2701 ; AVX2-NEXT: vpmulld %xmm0, %xmm1, %xmm0
2704 ; AVX512F-LABEL: mul_v4i32:
2706 ; AVX512F-NEXT: # kill: def $xmm2 killed $xmm2 def $zmm2
2707 ; AVX512F-NEXT: vpslld $31, %xmm0, %xmm0
2708 ; AVX512F-NEXT: vptestmd %zmm0, %zmm0, %k1
2709 ; AVX512F-NEXT: vpbroadcastd {{.*#+}} xmm0 = [1,1,1,1]
2710 ; AVX512F-NEXT: vmovdqa32 %zmm2, %zmm0 {%k1}
2711 ; AVX512F-NEXT: vpmulld %xmm0, %xmm1, %xmm0
2712 ; AVX512F-NEXT: vzeroupper
2713 ; AVX512F-NEXT: retq
2715 ; AVX512VL-LABEL: mul_v4i32:
2716 ; AVX512VL: # %bb.0:
2717 ; AVX512VL-NEXT: vpslld $31, %xmm0, %xmm0
2718 ; AVX512VL-NEXT: vptestmd %xmm0, %xmm0, %k1
2719 ; AVX512VL-NEXT: vpmulld %xmm2, %xmm1, %xmm1 {%k1}
2720 ; AVX512VL-NEXT: vmovdqa %xmm1, %xmm0
2721 ; AVX512VL-NEXT: retq
2722 %s = select <4 x i1> %b, <4 x i32> %y, <4 x i32> <i32 1, i32 1, i32 1, i32 1>
2723 %r = mul <4 x i32> %x, %s
2727 define <8 x i32> @mul_v8i32_commute(<8 x i1> %b, <8 x i32> noundef %x, <8 x i32> noundef %y) {
2728 ; SSE2-LABEL: mul_v8i32_commute:
2730 ; SSE2-NEXT: movdqa %xmm0, %xmm5
2731 ; SSE2-NEXT: punpckhwd {{.*#+}} xmm5 = xmm5[4,4,5,5,6,6,7,7]
2732 ; SSE2-NEXT: pslld $31, %xmm5
2733 ; SSE2-NEXT: psrad $31, %xmm5
2734 ; SSE2-NEXT: pand %xmm5, %xmm4
2735 ; SSE2-NEXT: paddd %xmm5, %xmm4
2736 ; SSE2-NEXT: pcmpeqd %xmm5, %xmm5
2737 ; SSE2-NEXT: psubd %xmm5, %xmm4
2738 ; SSE2-NEXT: punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]
2739 ; SSE2-NEXT: pslld $31, %xmm0
2740 ; SSE2-NEXT: psrad $31, %xmm0
2741 ; SSE2-NEXT: pand %xmm0, %xmm3
2742 ; SSE2-NEXT: paddd %xmm0, %xmm3
2743 ; SSE2-NEXT: psubd %xmm5, %xmm3
2744 ; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm3[1,1,3,3]
2745 ; SSE2-NEXT: pmuludq %xmm1, %xmm3
2746 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm3[0,2,2,3]
2747 ; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
2748 ; SSE2-NEXT: pmuludq %xmm5, %xmm1
2749 ; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm1[0,2,2,3]
2750 ; SSE2-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
2751 ; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm4[1,1,3,3]
2752 ; SSE2-NEXT: pmuludq %xmm2, %xmm4
2753 ; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm4[0,2,2,3]
2754 ; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
2755 ; SSE2-NEXT: pmuludq %xmm3, %xmm2
2756 ; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm2[0,2,2,3]
2757 ; SSE2-NEXT: punpckldq {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1]
2760 ; SSE42-LABEL: mul_v8i32_commute:
2762 ; SSE42-NEXT: movdqa %xmm0, %xmm5
2763 ; SSE42-NEXT: pmovzxwd {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero
2764 ; SSE42-NEXT: pslld $31, %xmm0
2765 ; SSE42-NEXT: movaps {{.*#+}} xmm6 = [1,1,1,1]
2766 ; SSE42-NEXT: movaps %xmm6, %xmm7
2767 ; SSE42-NEXT: blendvps %xmm0, %xmm3, %xmm7
2768 ; SSE42-NEXT: punpckhwd {{.*#+}} xmm5 = xmm5[4,4,5,5,6,6,7,7]
2769 ; SSE42-NEXT: pslld $31, %xmm5
2770 ; SSE42-NEXT: movdqa %xmm5, %xmm0
2771 ; SSE42-NEXT: blendvps %xmm0, %xmm4, %xmm6
2772 ; SSE42-NEXT: pmulld %xmm1, %xmm7
2773 ; SSE42-NEXT: pmulld %xmm2, %xmm6
2774 ; SSE42-NEXT: movdqa %xmm7, %xmm0
2775 ; SSE42-NEXT: movdqa %xmm6, %xmm1
2778 ; AVX2-LABEL: mul_v8i32_commute:
2780 ; AVX2-NEXT: vpmovzxwd {{.*#+}} ymm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero
2781 ; AVX2-NEXT: vpslld $31, %ymm0, %ymm0
2782 ; AVX2-NEXT: vbroadcastss {{.*#+}} ymm3 = [1,1,1,1,1,1,1,1]
2783 ; AVX2-NEXT: vblendvps %ymm0, %ymm2, %ymm3, %ymm0
2784 ; AVX2-NEXT: vpmulld %ymm1, %ymm0, %ymm0
2787 ; AVX512F-LABEL: mul_v8i32_commute:
2789 ; AVX512F-NEXT: # kill: def $ymm2 killed $ymm2 def $zmm2
2790 ; AVX512F-NEXT: vpmovsxwq %xmm0, %zmm0
2791 ; AVX512F-NEXT: vpsllq $63, %zmm0, %zmm0
2792 ; AVX512F-NEXT: vptestmq %zmm0, %zmm0, %k1
2793 ; AVX512F-NEXT: vpbroadcastd {{.*#+}} ymm0 = [1,1,1,1,1,1,1,1]
2794 ; AVX512F-NEXT: vmovdqa32 %zmm2, %zmm0 {%k1}
2795 ; AVX512F-NEXT: vpmulld %ymm1, %ymm0, %ymm0
2796 ; AVX512F-NEXT: retq
2798 ; AVX512VL-LABEL: mul_v8i32_commute:
2799 ; AVX512VL: # %bb.0:
2800 ; AVX512VL-NEXT: vpmovsxwd %xmm0, %ymm0
2801 ; AVX512VL-NEXT: vpslld $31, %ymm0, %ymm0
2802 ; AVX512VL-NEXT: vptestmd %ymm0, %ymm0, %k1
2803 ; AVX512VL-NEXT: vpmulld %ymm2, %ymm1, %ymm1 {%k1}
2804 ; AVX512VL-NEXT: vmovdqa %ymm1, %ymm0
2805 ; AVX512VL-NEXT: retq
2806 %s = select <8 x i1> %b, <8 x i32> %y, <8 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
2807 %r = mul <8 x i32> %s, %x
2811 define <8 x i32> @mul_v8i32_cast_cond(i8 noundef zeroext %pb, <8 x i32> noundef %x, <8 x i32> noundef %y) {
2812 ; SSE2-LABEL: mul_v8i32_cast_cond:
2814 ; SSE2-NEXT: movd %edi, %xmm4
2815 ; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm4[0,0,0,0]
2816 ; SSE2-NEXT: movdqa {{.*#+}} xmm5 = [16,32,64,128]
2817 ; SSE2-NEXT: movdqa %xmm4, %xmm6
2818 ; SSE2-NEXT: pand %xmm5, %xmm6
2819 ; SSE2-NEXT: pcmpeqd %xmm5, %xmm6
2820 ; SSE2-NEXT: pand %xmm6, %xmm3
2821 ; SSE2-NEXT: paddd %xmm6, %xmm3
2822 ; SSE2-NEXT: pcmpeqd %xmm5, %xmm5
2823 ; SSE2-NEXT: psubd %xmm5, %xmm3
2824 ; SSE2-NEXT: movdqa {{.*#+}} xmm6 = [1,2,4,8]
2825 ; SSE2-NEXT: pand %xmm6, %xmm4
2826 ; SSE2-NEXT: pcmpeqd %xmm6, %xmm4
2827 ; SSE2-NEXT: pand %xmm4, %xmm2
2828 ; SSE2-NEXT: paddd %xmm4, %xmm2
2829 ; SSE2-NEXT: psubd %xmm5, %xmm2
2830 ; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm0[1,1,3,3]
2831 ; SSE2-NEXT: pmuludq %xmm2, %xmm0
2832 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
2833 ; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
2834 ; SSE2-NEXT: pmuludq %xmm4, %xmm2
2835 ; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm2[0,2,2,3]
2836 ; SSE2-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1]
2837 ; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm1[1,1,3,3]
2838 ; SSE2-NEXT: pmuludq %xmm3, %xmm1
2839 ; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm1[0,2,2,3]
2840 ; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
2841 ; SSE2-NEXT: pmuludq %xmm2, %xmm3
2842 ; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm3[0,2,2,3]
2843 ; SSE2-NEXT: punpckldq {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1]
2846 ; SSE42-LABEL: mul_v8i32_cast_cond:
2848 ; SSE42-NEXT: movdqa %xmm0, %xmm4
2849 ; SSE42-NEXT: movd %edi, %xmm0
2850 ; SSE42-NEXT: pshufd {{.*#+}} xmm5 = xmm0[0,0,0,0]
2851 ; SSE42-NEXT: movdqa {{.*#+}} xmm6 = [16,32,64,128]
2852 ; SSE42-NEXT: movdqa %xmm5, %xmm0
2853 ; SSE42-NEXT: pand %xmm6, %xmm0
2854 ; SSE42-NEXT: pcmpeqd %xmm6, %xmm0
2855 ; SSE42-NEXT: movaps {{.*#+}} xmm6 = [1,1,1,1]
2856 ; SSE42-NEXT: movaps %xmm6, %xmm7
2857 ; SSE42-NEXT: blendvps %xmm0, %xmm3, %xmm7
2858 ; SSE42-NEXT: movdqa {{.*#+}} xmm0 = [1,2,4,8]
2859 ; SSE42-NEXT: pand %xmm0, %xmm5
2860 ; SSE42-NEXT: pcmpeqd %xmm0, %xmm5
2861 ; SSE42-NEXT: movdqa %xmm5, %xmm0
2862 ; SSE42-NEXT: blendvps %xmm0, %xmm2, %xmm6
2863 ; SSE42-NEXT: pmulld %xmm4, %xmm6
2864 ; SSE42-NEXT: pmulld %xmm7, %xmm1
2865 ; SSE42-NEXT: movdqa %xmm6, %xmm0
2868 ; AVX2-LABEL: mul_v8i32_cast_cond:
2870 ; AVX2-NEXT: vmovd %edi, %xmm2
2871 ; AVX2-NEXT: vpbroadcastb %xmm2, %ymm2
2872 ; AVX2-NEXT: vmovdqa {{.*#+}} ymm3 = [1,2,4,8,16,32,64,128]
2873 ; AVX2-NEXT: vpand %ymm3, %ymm2, %ymm2
2874 ; AVX2-NEXT: vpcmpeqd %ymm3, %ymm2, %ymm2
2875 ; AVX2-NEXT: vbroadcastss {{.*#+}} ymm3 = [1,1,1,1,1,1,1,1]
2876 ; AVX2-NEXT: vblendvps %ymm2, %ymm1, %ymm3, %ymm1
2877 ; AVX2-NEXT: vpmulld %ymm1, %ymm0, %ymm0
2880 ; AVX512F-LABEL: mul_v8i32_cast_cond:
2882 ; AVX512F-NEXT: # kill: def $ymm1 killed $ymm1 def $zmm1
2883 ; AVX512F-NEXT: kmovw %edi, %k1
2884 ; AVX512F-NEXT: vpbroadcastd {{.*#+}} ymm2 = [1,1,1,1,1,1,1,1]
2885 ; AVX512F-NEXT: vmovdqa32 %zmm1, %zmm2 {%k1}
2886 ; AVX512F-NEXT: vpmulld %ymm2, %ymm0, %ymm0
2887 ; AVX512F-NEXT: retq
2889 ; AVX512VL-LABEL: mul_v8i32_cast_cond:
2890 ; AVX512VL: # %bb.0:
2891 ; AVX512VL-NEXT: kmovw %edi, %k1
2892 ; AVX512VL-NEXT: vpmulld %ymm1, %ymm0, %ymm0 {%k1}
2893 ; AVX512VL-NEXT: retq
2894 %b = bitcast i8 %pb to <8 x i1>
2895 %s = select <8 x i1> %b, <8 x i32> %y, <8 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
2896 %r = mul <8 x i32> %x, %s
2900 define <8 x i64> @mul_v8i64_cast_cond(i8 noundef zeroext %pb, <8 x i64> noundef %x, <8 x i64> noundef %y) {
2901 ; SSE2-LABEL: mul_v8i64_cast_cond:
2903 ; SSE2-NEXT: movd %edi, %xmm8
2904 ; SSE2-NEXT: pshufd {{.*#+}} xmm9 = xmm8[0,1,0,1]
2905 ; SSE2-NEXT: movdqa {{.*#+}} xmm8 = [64,128]
2906 ; SSE2-NEXT: movdqa %xmm9, %xmm10
2907 ; SSE2-NEXT: pand %xmm8, %xmm10
2908 ; SSE2-NEXT: pcmpeqd %xmm8, %xmm10
2909 ; SSE2-NEXT: pshufd {{.*#+}} xmm8 = xmm10[1,0,3,2]
2910 ; SSE2-NEXT: pand %xmm10, %xmm8
2911 ; SSE2-NEXT: movdqa {{.*#+}} xmm10 = [1,1]
2912 ; SSE2-NEXT: pand %xmm8, %xmm7
2913 ; SSE2-NEXT: pandn %xmm10, %xmm8
2914 ; SSE2-NEXT: por %xmm7, %xmm8
2915 ; SSE2-NEXT: movdqa {{.*#+}} xmm7 = [16,32]
2916 ; SSE2-NEXT: movdqa %xmm9, %xmm11
2917 ; SSE2-NEXT: pand %xmm7, %xmm11
2918 ; SSE2-NEXT: pcmpeqd %xmm7, %xmm11
2919 ; SSE2-NEXT: pshufd {{.*#+}} xmm7 = xmm11[1,0,3,2]
2920 ; SSE2-NEXT: pand %xmm11, %xmm7
2921 ; SSE2-NEXT: pand %xmm7, %xmm6
2922 ; SSE2-NEXT: pandn %xmm10, %xmm7
2923 ; SSE2-NEXT: por %xmm6, %xmm7
2924 ; SSE2-NEXT: movdqa {{.*#+}} xmm6 = [4,8]
2925 ; SSE2-NEXT: movdqa %xmm9, %xmm11
2926 ; SSE2-NEXT: pand %xmm6, %xmm11
2927 ; SSE2-NEXT: pcmpeqd %xmm6, %xmm11
2928 ; SSE2-NEXT: pshufd {{.*#+}} xmm6 = xmm11[1,0,3,2]
2929 ; SSE2-NEXT: pand %xmm11, %xmm6
2930 ; SSE2-NEXT: pand %xmm6, %xmm5
2931 ; SSE2-NEXT: pandn %xmm10, %xmm6
2932 ; SSE2-NEXT: por %xmm5, %xmm6
2933 ; SSE2-NEXT: movdqa {{.*#+}} xmm5 = [1,2]
2934 ; SSE2-NEXT: pand %xmm5, %xmm9
2935 ; SSE2-NEXT: pcmpeqd %xmm5, %xmm9
2936 ; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm9[1,0,3,2]
2937 ; SSE2-NEXT: pand %xmm9, %xmm5
2938 ; SSE2-NEXT: pand %xmm5, %xmm4
2939 ; SSE2-NEXT: pandn %xmm10, %xmm5
2940 ; SSE2-NEXT: por %xmm4, %xmm5
2941 ; SSE2-NEXT: movdqa %xmm0, %xmm4
2942 ; SSE2-NEXT: psrlq $32, %xmm4
2943 ; SSE2-NEXT: pmuludq %xmm5, %xmm4
2944 ; SSE2-NEXT: movdqa %xmm5, %xmm9
2945 ; SSE2-NEXT: psrlq $32, %xmm9
2946 ; SSE2-NEXT: pmuludq %xmm0, %xmm9
2947 ; SSE2-NEXT: paddq %xmm4, %xmm9
2948 ; SSE2-NEXT: psllq $32, %xmm9
2949 ; SSE2-NEXT: pmuludq %xmm5, %xmm0
2950 ; SSE2-NEXT: paddq %xmm9, %xmm0
2951 ; SSE2-NEXT: movdqa %xmm1, %xmm4
2952 ; SSE2-NEXT: psrlq $32, %xmm4
2953 ; SSE2-NEXT: pmuludq %xmm6, %xmm4
2954 ; SSE2-NEXT: movdqa %xmm6, %xmm5
2955 ; SSE2-NEXT: psrlq $32, %xmm5
2956 ; SSE2-NEXT: pmuludq %xmm1, %xmm5
2957 ; SSE2-NEXT: paddq %xmm4, %xmm5
2958 ; SSE2-NEXT: psllq $32, %xmm5
2959 ; SSE2-NEXT: pmuludq %xmm6, %xmm1
2960 ; SSE2-NEXT: paddq %xmm5, %xmm1
2961 ; SSE2-NEXT: movdqa %xmm2, %xmm4
2962 ; SSE2-NEXT: psrlq $32, %xmm4
2963 ; SSE2-NEXT: pmuludq %xmm7, %xmm4
2964 ; SSE2-NEXT: movdqa %xmm7, %xmm5
2965 ; SSE2-NEXT: psrlq $32, %xmm5
2966 ; SSE2-NEXT: pmuludq %xmm2, %xmm5
2967 ; SSE2-NEXT: paddq %xmm4, %xmm5
2968 ; SSE2-NEXT: psllq $32, %xmm5
2969 ; SSE2-NEXT: pmuludq %xmm7, %xmm2
2970 ; SSE2-NEXT: paddq %xmm5, %xmm2
2971 ; SSE2-NEXT: movdqa %xmm3, %xmm4
2972 ; SSE2-NEXT: psrlq $32, %xmm4
2973 ; SSE2-NEXT: pmuludq %xmm8, %xmm4
2974 ; SSE2-NEXT: movdqa %xmm8, %xmm5
2975 ; SSE2-NEXT: psrlq $32, %xmm5
2976 ; SSE2-NEXT: pmuludq %xmm3, %xmm5
2977 ; SSE2-NEXT: paddq %xmm4, %xmm5
2978 ; SSE2-NEXT: psllq $32, %xmm5
2979 ; SSE2-NEXT: pmuludq %xmm8, %xmm3
2980 ; SSE2-NEXT: paddq %xmm5, %xmm3
2983 ; SSE42-LABEL: mul_v8i64_cast_cond:
2985 ; SSE42-NEXT: movdqa %xmm0, %xmm9
2986 ; SSE42-NEXT: movd %edi, %xmm0
2987 ; SSE42-NEXT: pshufd {{.*#+}} xmm8 = xmm0[0,1,0,1]
2988 ; SSE42-NEXT: movdqa {{.*#+}} xmm10 = [64,128]
2989 ; SSE42-NEXT: movdqa %xmm8, %xmm0
2990 ; SSE42-NEXT: pand %xmm10, %xmm0
2991 ; SSE42-NEXT: pcmpeqq %xmm10, %xmm0
2992 ; SSE42-NEXT: movapd {{.*#+}} xmm10 = [1,1]
2993 ; SSE42-NEXT: movapd %xmm10, %xmm11
2994 ; SSE42-NEXT: blendvpd %xmm0, %xmm7, %xmm11
2995 ; SSE42-NEXT: movdqa {{.*#+}} xmm7 = [16,32]
2996 ; SSE42-NEXT: movdqa %xmm8, %xmm0
2997 ; SSE42-NEXT: pand %xmm7, %xmm0
2998 ; SSE42-NEXT: pcmpeqq %xmm7, %xmm0
2999 ; SSE42-NEXT: movapd %xmm10, %xmm7
3000 ; SSE42-NEXT: blendvpd %xmm0, %xmm6, %xmm7
3001 ; SSE42-NEXT: movdqa {{.*#+}} xmm6 = [4,8]
3002 ; SSE42-NEXT: movdqa %xmm8, %xmm0
3003 ; SSE42-NEXT: pand %xmm6, %xmm0
3004 ; SSE42-NEXT: pcmpeqq %xmm6, %xmm0
3005 ; SSE42-NEXT: movapd %xmm10, %xmm6
3006 ; SSE42-NEXT: blendvpd %xmm0, %xmm5, %xmm6
3007 ; SSE42-NEXT: movdqa {{.*#+}} xmm0 = [1,2]
3008 ; SSE42-NEXT: pand %xmm0, %xmm8
3009 ; SSE42-NEXT: pcmpeqq %xmm0, %xmm8
3010 ; SSE42-NEXT: movdqa %xmm8, %xmm0
3011 ; SSE42-NEXT: blendvpd %xmm0, %xmm4, %xmm10
3012 ; SSE42-NEXT: movdqa %xmm9, %xmm0
3013 ; SSE42-NEXT: psrlq $32, %xmm0
3014 ; SSE42-NEXT: pmuludq %xmm10, %xmm0
3015 ; SSE42-NEXT: movdqa %xmm10, %xmm4
3016 ; SSE42-NEXT: psrlq $32, %xmm4
3017 ; SSE42-NEXT: pmuludq %xmm9, %xmm4
3018 ; SSE42-NEXT: paddq %xmm0, %xmm4
3019 ; SSE42-NEXT: psllq $32, %xmm4
3020 ; SSE42-NEXT: pmuludq %xmm9, %xmm10
3021 ; SSE42-NEXT: paddq %xmm4, %xmm10
3022 ; SSE42-NEXT: movdqa %xmm1, %xmm0
3023 ; SSE42-NEXT: psrlq $32, %xmm0
3024 ; SSE42-NEXT: pmuludq %xmm6, %xmm0
3025 ; SSE42-NEXT: movdqa %xmm6, %xmm4
3026 ; SSE42-NEXT: psrlq $32, %xmm4
3027 ; SSE42-NEXT: pmuludq %xmm1, %xmm4
3028 ; SSE42-NEXT: paddq %xmm0, %xmm4
3029 ; SSE42-NEXT: psllq $32, %xmm4
3030 ; SSE42-NEXT: pmuludq %xmm6, %xmm1
3031 ; SSE42-NEXT: paddq %xmm4, %xmm1
3032 ; SSE42-NEXT: movdqa %xmm2, %xmm0
3033 ; SSE42-NEXT: psrlq $32, %xmm0
3034 ; SSE42-NEXT: pmuludq %xmm7, %xmm0
3035 ; SSE42-NEXT: movdqa %xmm7, %xmm4
3036 ; SSE42-NEXT: psrlq $32, %xmm4
3037 ; SSE42-NEXT: pmuludq %xmm2, %xmm4
3038 ; SSE42-NEXT: paddq %xmm0, %xmm4
3039 ; SSE42-NEXT: psllq $32, %xmm4
3040 ; SSE42-NEXT: pmuludq %xmm7, %xmm2
3041 ; SSE42-NEXT: paddq %xmm4, %xmm2
3042 ; SSE42-NEXT: movdqa %xmm3, %xmm0
3043 ; SSE42-NEXT: psrlq $32, %xmm0
3044 ; SSE42-NEXT: pmuludq %xmm11, %xmm0
3045 ; SSE42-NEXT: movdqa %xmm11, %xmm4
3046 ; SSE42-NEXT: psrlq $32, %xmm4
3047 ; SSE42-NEXT: pmuludq %xmm3, %xmm4
3048 ; SSE42-NEXT: paddq %xmm0, %xmm4
3049 ; SSE42-NEXT: psllq $32, %xmm4
3050 ; SSE42-NEXT: pmuludq %xmm11, %xmm3
3051 ; SSE42-NEXT: paddq %xmm4, %xmm3
3052 ; SSE42-NEXT: movdqa %xmm10, %xmm0
3055 ; AVX2-LABEL: mul_v8i64_cast_cond:
3057 ; AVX2-NEXT: vmovd %edi, %xmm4
3058 ; AVX2-NEXT: vpbroadcastb %xmm4, %ymm4
3059 ; AVX2-NEXT: vmovdqa {{.*#+}} ymm5 = [16,32,64,128]
3060 ; AVX2-NEXT: vpand %ymm5, %ymm4, %ymm6
3061 ; AVX2-NEXT: vpcmpeqq %ymm5, %ymm6, %ymm5
3062 ; AVX2-NEXT: vbroadcastsd {{.*#+}} ymm6 = [1,1,1,1]
3063 ; AVX2-NEXT: vblendvpd %ymm5, %ymm3, %ymm6, %ymm3
3064 ; AVX2-NEXT: vmovdqa {{.*#+}} ymm5 = [1,2,4,8]
3065 ; AVX2-NEXT: vpand %ymm5, %ymm4, %ymm4
3066 ; AVX2-NEXT: vpcmpeqq %ymm5, %ymm4, %ymm4
3067 ; AVX2-NEXT: vblendvpd %ymm4, %ymm2, %ymm6, %ymm2
3068 ; AVX2-NEXT: vpsrlq $32, %ymm0, %ymm4
3069 ; AVX2-NEXT: vpmuludq %ymm2, %ymm4, %ymm4
3070 ; AVX2-NEXT: vpsrlq $32, %ymm2, %ymm5
3071 ; AVX2-NEXT: vpmuludq %ymm5, %ymm0, %ymm5
3072 ; AVX2-NEXT: vpaddq %ymm4, %ymm5, %ymm4
3073 ; AVX2-NEXT: vpsllq $32, %ymm4, %ymm4
3074 ; AVX2-NEXT: vpmuludq %ymm2, %ymm0, %ymm0
3075 ; AVX2-NEXT: vpaddq %ymm4, %ymm0, %ymm0
3076 ; AVX2-NEXT: vpsrlq $32, %ymm1, %ymm2
3077 ; AVX2-NEXT: vpmuludq %ymm3, %ymm2, %ymm2
3078 ; AVX2-NEXT: vpsrlq $32, %ymm3, %ymm4
3079 ; AVX2-NEXT: vpmuludq %ymm4, %ymm1, %ymm4
3080 ; AVX2-NEXT: vpaddq %ymm2, %ymm4, %ymm2
3081 ; AVX2-NEXT: vpsllq $32, %ymm2, %ymm2
3082 ; AVX2-NEXT: vpmuludq %ymm3, %ymm1, %ymm1
3083 ; AVX2-NEXT: vpaddq %ymm2, %ymm1, %ymm1
3086 ; AVX512-LABEL: mul_v8i64_cast_cond:
3088 ; AVX512-NEXT: kmovw %edi, %k1
3089 ; AVX512-NEXT: vpsrlq $32, %zmm1, %zmm2
3090 ; AVX512-NEXT: vpmuludq %zmm2, %zmm0, %zmm2
3091 ; AVX512-NEXT: vpsrlq $32, %zmm0, %zmm3
3092 ; AVX512-NEXT: vpmuludq %zmm1, %zmm3, %zmm3
3093 ; AVX512-NEXT: vpaddq %zmm3, %zmm2, %zmm2
3094 ; AVX512-NEXT: vpsllq $32, %zmm2, %zmm2
3095 ; AVX512-NEXT: vpmuludq %zmm1, %zmm0, %zmm1
3096 ; AVX512-NEXT: vpaddq %zmm2, %zmm1, %zmm0 {%k1}
3098 %b = bitcast i8 %pb to <8 x i1>
3099 %s = select <8 x i1> %b, <8 x i64> %y, <8 x i64> <i64 1, i64 1, i64 1, i64 1, i64 1, i64 1, i64 1, i64 1>
3100 %r = mul <8 x i64> %x, %s
3104 define <4 x i32> @shl_v4i32(<4 x i1> %b, <4 x i32> noundef %x, <4 x i32> noundef %y) {
3105 ; SSE2-LABEL: shl_v4i32:
3107 ; SSE2-NEXT: pslld $31, %xmm0
3108 ; SSE2-NEXT: psrad $31, %xmm0
3109 ; SSE2-NEXT: pand %xmm2, %xmm0
3110 ; SSE2-NEXT: pslld $23, %xmm0
3111 ; SSE2-NEXT: paddd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
3112 ; SSE2-NEXT: cvttps2dq %xmm0, %xmm2
3113 ; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm1[1,1,3,3]
3114 ; SSE2-NEXT: pmuludq %xmm2, %xmm1
3115 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm1[0,2,2,3]
3116 ; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm2[1,1,3,3]
3117 ; SSE2-NEXT: pmuludq %xmm3, %xmm1
3118 ; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm1[0,2,2,3]
3119 ; SSE2-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
3122 ; SSE42-LABEL: shl_v4i32:
3124 ; SSE42-NEXT: pslld $31, %xmm0
3125 ; SSE42-NEXT: psrad $31, %xmm0
3126 ; SSE42-NEXT: pand %xmm2, %xmm0
3127 ; SSE42-NEXT: pslld $23, %xmm0
3128 ; SSE42-NEXT: paddd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
3129 ; SSE42-NEXT: cvttps2dq %xmm0, %xmm0
3130 ; SSE42-NEXT: pmulld %xmm1, %xmm0
3133 ; AVX2-LABEL: shl_v4i32:
3135 ; AVX2-NEXT: vpslld $31, %xmm0, %xmm0
3136 ; AVX2-NEXT: vpsrad $31, %xmm0, %xmm0
3137 ; AVX2-NEXT: vpand %xmm2, %xmm0, %xmm0
3138 ; AVX2-NEXT: vpsllvd %xmm0, %xmm1, %xmm0
3141 ; AVX512F-LABEL: shl_v4i32:
3143 ; AVX512F-NEXT: # kill: def $xmm2 killed $xmm2 def $zmm2
3144 ; AVX512F-NEXT: vpslld $31, %xmm0, %xmm0
3145 ; AVX512F-NEXT: vptestmd %zmm0, %zmm0, %k1
3146 ; AVX512F-NEXT: vmovdqa32 %zmm2, %zmm0 {%k1} {z}
3147 ; AVX512F-NEXT: vpsllvd %xmm0, %xmm1, %xmm0
3148 ; AVX512F-NEXT: vzeroupper
3149 ; AVX512F-NEXT: retq
3151 ; AVX512VL-LABEL: shl_v4i32:
3152 ; AVX512VL: # %bb.0:
3153 ; AVX512VL-NEXT: vpslld $31, %xmm0, %xmm0
3154 ; AVX512VL-NEXT: vptestmd %xmm0, %xmm0, %k1
3155 ; AVX512VL-NEXT: vpsllvd %xmm2, %xmm1, %xmm1 {%k1}
3156 ; AVX512VL-NEXT: vmovdqa %xmm1, %xmm0
3157 ; AVX512VL-NEXT: retq
3158 %s = select <4 x i1> %b, <4 x i32> %y, <4 x i32> zeroinitializer
3159 %r = shl <4 x i32> %x, %s
3163 ; negative test - shl is not commutative; there is no identity constant for operand 0
3165 define <8 x i32> @shl_v8i32_commute(<8 x i1> %b, <8 x i32> noundef %x, <8 x i32> noundef %y) {
3166 ; SSE2-LABEL: shl_v8i32_commute:
3168 ; SSE2-NEXT: movdqa %xmm0, %xmm5
3169 ; SSE2-NEXT: punpckhwd {{.*#+}} xmm5 = xmm5[4,4,5,5,6,6,7,7]
3170 ; SSE2-NEXT: pslld $31, %xmm5
3171 ; SSE2-NEXT: psrad $31, %xmm5
3172 ; SSE2-NEXT: pand %xmm4, %xmm5
3173 ; SSE2-NEXT: punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]
3174 ; SSE2-NEXT: pslld $31, %xmm0
3175 ; SSE2-NEXT: psrad $31, %xmm0
3176 ; SSE2-NEXT: pand %xmm3, %xmm0
3177 ; SSE2-NEXT: pslld $23, %xmm1
3178 ; SSE2-NEXT: movdqa {{.*#+}} xmm3 = [1065353216,1065353216,1065353216,1065353216]
3179 ; SSE2-NEXT: paddd %xmm3, %xmm1
3180 ; SSE2-NEXT: cvttps2dq %xmm1, %xmm1
3181 ; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm0[1,1,3,3]
3182 ; SSE2-NEXT: pmuludq %xmm1, %xmm0
3183 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
3184 ; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
3185 ; SSE2-NEXT: pmuludq %xmm4, %xmm1
3186 ; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm1[0,2,2,3]
3187 ; SSE2-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
3188 ; SSE2-NEXT: pslld $23, %xmm2
3189 ; SSE2-NEXT: paddd %xmm3, %xmm2
3190 ; SSE2-NEXT: cvttps2dq %xmm2, %xmm2
3191 ; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm5[1,1,3,3]
3192 ; SSE2-NEXT: pmuludq %xmm2, %xmm5
3193 ; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm5[0,2,2,3]
3194 ; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
3195 ; SSE2-NEXT: pmuludq %xmm3, %xmm2
3196 ; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm2[0,2,2,3]
3197 ; SSE2-NEXT: punpckldq {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1]
3200 ; SSE42-LABEL: shl_v8i32_commute:
3202 ; SSE42-NEXT: pmovzxwd {{.*#+}} xmm5 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero
3203 ; SSE42-NEXT: punpckhwd {{.*#+}} xmm0 = xmm0[4,4,5,5,6,6,7,7]
3204 ; SSE42-NEXT: pslld $31, %xmm0
3205 ; SSE42-NEXT: psrad $31, %xmm0
3206 ; SSE42-NEXT: pand %xmm4, %xmm0
3207 ; SSE42-NEXT: pslld $31, %xmm5
3208 ; SSE42-NEXT: psrad $31, %xmm5
3209 ; SSE42-NEXT: pand %xmm3, %xmm5
3210 ; SSE42-NEXT: pslld $23, %xmm1
3211 ; SSE42-NEXT: movdqa {{.*#+}} xmm4 = [1065353216,1065353216,1065353216,1065353216]
3212 ; SSE42-NEXT: paddd %xmm4, %xmm1
3213 ; SSE42-NEXT: cvttps2dq %xmm1, %xmm3
3214 ; SSE42-NEXT: pmulld %xmm5, %xmm3
3215 ; SSE42-NEXT: pslld $23, %xmm2
3216 ; SSE42-NEXT: paddd %xmm4, %xmm2
3217 ; SSE42-NEXT: cvttps2dq %xmm2, %xmm1
3218 ; SSE42-NEXT: pmulld %xmm0, %xmm1
3219 ; SSE42-NEXT: movdqa %xmm3, %xmm0
3222 ; AVX2-LABEL: shl_v8i32_commute:
3224 ; AVX2-NEXT: vpmovzxwd {{.*#+}} ymm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero
3225 ; AVX2-NEXT: vpslld $31, %ymm0, %ymm0
3226 ; AVX2-NEXT: vpsrad $31, %ymm0, %ymm0
3227 ; AVX2-NEXT: vpand %ymm2, %ymm0, %ymm0
3228 ; AVX2-NEXT: vpsllvd %ymm1, %ymm0, %ymm0
3231 ; AVX512F-LABEL: shl_v8i32_commute:
3233 ; AVX512F-NEXT: # kill: def $ymm2 killed $ymm2 def $zmm2
3234 ; AVX512F-NEXT: vpmovsxwq %xmm0, %zmm0
3235 ; AVX512F-NEXT: vpsllq $63, %zmm0, %zmm0
3236 ; AVX512F-NEXT: vptestmq %zmm0, %zmm0, %k1
3237 ; AVX512F-NEXT: vmovdqa32 %zmm2, %zmm0 {%k1} {z}
3238 ; AVX512F-NEXT: vpsllvd %ymm1, %ymm0, %ymm0
3239 ; AVX512F-NEXT: retq
3241 ; AVX512VL-LABEL: shl_v8i32_commute:
3242 ; AVX512VL: # %bb.0:
3243 ; AVX512VL-NEXT: vpmovsxwd %xmm0, %ymm0
3244 ; AVX512VL-NEXT: vpslld $31, %ymm0, %ymm0
3245 ; AVX512VL-NEXT: vptestmd %ymm0, %ymm0, %k1
3246 ; AVX512VL-NEXT: vmovdqa32 %ymm2, %ymm0 {%k1} {z}
3247 ; AVX512VL-NEXT: vpsllvd %ymm1, %ymm0, %ymm0
3248 ; AVX512VL-NEXT: retq
3249 %s = select <8 x i1> %b, <8 x i32> %y, <8 x i32> zeroinitializer
3250 %r = shl <8 x i32> %s, %x
3254 define <16 x i32> @shl_v16i32_swap(<16 x i1> %b, <16 x i32> noundef %x, <16 x i32> noundef %y) {
3255 ; SSE2-LABEL: shl_v16i32_swap:
3257 ; SSE2-NEXT: movdqa %xmm0, %xmm9
3258 ; SSE2-NEXT: punpckhbw {{.*#+}} xmm9 = xmm9[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]
3259 ; SSE2-NEXT: movdqa %xmm9, %xmm8
3260 ; SSE2-NEXT: punpckhwd {{.*#+}} xmm8 = xmm8[4,4,5,5,6,6,7,7]
3261 ; SSE2-NEXT: pslld $31, %xmm8
3262 ; SSE2-NEXT: psrad $31, %xmm8
3263 ; SSE2-NEXT: pandn {{[0-9]+}}(%rsp), %xmm8
3264 ; SSE2-NEXT: punpcklwd {{.*#+}} xmm9 = xmm9[0,0,1,1,2,2,3,3]
3265 ; SSE2-NEXT: pslld $31, %xmm9
3266 ; SSE2-NEXT: psrad $31, %xmm9
3267 ; SSE2-NEXT: pandn %xmm7, %xmm9
3268 ; SSE2-NEXT: punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
3269 ; SSE2-NEXT: movdqa %xmm0, %xmm7
3270 ; SSE2-NEXT: punpckhwd {{.*#+}} xmm7 = xmm7[4,4,5,5,6,6,7,7]
3271 ; SSE2-NEXT: pslld $31, %xmm7
3272 ; SSE2-NEXT: psrad $31, %xmm7
3273 ; SSE2-NEXT: pandn %xmm6, %xmm7
3274 ; SSE2-NEXT: punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]
3275 ; SSE2-NEXT: pslld $31, %xmm0
3276 ; SSE2-NEXT: psrad $31, %xmm0
3277 ; SSE2-NEXT: pandn %xmm5, %xmm0
3278 ; SSE2-NEXT: pslld $23, %xmm0
3279 ; SSE2-NEXT: movdqa {{.*#+}} xmm5 = [1065353216,1065353216,1065353216,1065353216]
3280 ; SSE2-NEXT: paddd %xmm5, %xmm0
3281 ; SSE2-NEXT: cvttps2dq %xmm0, %xmm6
3282 ; SSE2-NEXT: pshufd {{.*#+}} xmm10 = xmm1[1,1,3,3]
3283 ; SSE2-NEXT: pmuludq %xmm6, %xmm1
3284 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm1[0,2,2,3]
3285 ; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm6[1,1,3,3]
3286 ; SSE2-NEXT: pmuludq %xmm10, %xmm1
3287 ; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm1[0,2,2,3]
3288 ; SSE2-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
3289 ; SSE2-NEXT: pslld $23, %xmm7
3290 ; SSE2-NEXT: paddd %xmm5, %xmm7
3291 ; SSE2-NEXT: cvttps2dq %xmm7, %xmm6
3292 ; SSE2-NEXT: pshufd {{.*#+}} xmm7 = xmm2[1,1,3,3]
3293 ; SSE2-NEXT: pmuludq %xmm6, %xmm2
3294 ; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm2[0,2,2,3]
3295 ; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm6[1,1,3,3]
3296 ; SSE2-NEXT: pmuludq %xmm7, %xmm2
3297 ; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm2[0,2,2,3]
3298 ; SSE2-NEXT: punpckldq {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1]
3299 ; SSE2-NEXT: pslld $23, %xmm9
3300 ; SSE2-NEXT: paddd %xmm5, %xmm9
3301 ; SSE2-NEXT: cvttps2dq %xmm9, %xmm6
3302 ; SSE2-NEXT: pshufd {{.*#+}} xmm7 = xmm3[1,1,3,3]
3303 ; SSE2-NEXT: pmuludq %xmm6, %xmm3
3304 ; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm3[0,2,2,3]
3305 ; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm6[1,1,3,3]
3306 ; SSE2-NEXT: pmuludq %xmm7, %xmm3
3307 ; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm3[0,2,2,3]
3308 ; SSE2-NEXT: punpckldq {{.*#+}} xmm2 = xmm2[0],xmm3[0],xmm2[1],xmm3[1]
3309 ; SSE2-NEXT: pslld $23, %xmm8
3310 ; SSE2-NEXT: paddd %xmm5, %xmm8
3311 ; SSE2-NEXT: cvttps2dq %xmm8, %xmm5
3312 ; SSE2-NEXT: pshufd {{.*#+}} xmm6 = xmm4[1,1,3,3]
3313 ; SSE2-NEXT: pmuludq %xmm5, %xmm4
3314 ; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm4[0,2,2,3]
3315 ; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm5[1,1,3,3]
3316 ; SSE2-NEXT: pmuludq %xmm6, %xmm4
3317 ; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm4[0,2,2,3]
3318 ; SSE2-NEXT: punpckldq {{.*#+}} xmm3 = xmm3[0],xmm4[0],xmm3[1],xmm4[1]
3321 ; SSE42-LABEL: shl_v16i32_swap:
3323 ; SSE42-NEXT: pshufd {{.*#+}} xmm8 = xmm0[2,3,2,3]
3324 ; SSE42-NEXT: pmovzxbd {{.*#+}} xmm8 = xmm8[0],zero,zero,zero,xmm8[1],zero,zero,zero,xmm8[2],zero,zero,zero,xmm8[3],zero,zero,zero
3325 ; SSE42-NEXT: pslld $31, %xmm8
3326 ; SSE42-NEXT: psrad $31, %xmm8
3327 ; SSE42-NEXT: pandn %xmm7, %xmm8
3328 ; SSE42-NEXT: pshufd {{.*#+}} xmm7 = xmm0[1,1,1,1]
3329 ; SSE42-NEXT: pmovzxbd {{.*#+}} xmm7 = xmm7[0],zero,zero,zero,xmm7[1],zero,zero,zero,xmm7[2],zero,zero,zero,xmm7[3],zero,zero,zero
3330 ; SSE42-NEXT: pslld $31, %xmm7
3331 ; SSE42-NEXT: psrad $31, %xmm7
3332 ; SSE42-NEXT: pandn %xmm6, %xmm7
3333 ; SSE42-NEXT: pmovzxbd {{.*#+}} xmm6 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero
3334 ; SSE42-NEXT: pslld $31, %xmm6
3335 ; SSE42-NEXT: psrad $31, %xmm6
3336 ; SSE42-NEXT: pandn %xmm5, %xmm6
3337 ; SSE42-NEXT: pshufd {{.*#+}} xmm0 = xmm0[3,3,3,3]
3338 ; SSE42-NEXT: pmovzxbd {{.*#+}} xmm5 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero
3339 ; SSE42-NEXT: pslld $31, %xmm5
3340 ; SSE42-NEXT: psrad $31, %xmm5
3341 ; SSE42-NEXT: pandn {{[0-9]+}}(%rsp), %xmm5
3342 ; SSE42-NEXT: pslld $23, %xmm6
3343 ; SSE42-NEXT: movdqa {{.*#+}} xmm9 = [1065353216,1065353216,1065353216,1065353216]
3344 ; SSE42-NEXT: paddd %xmm9, %xmm6
3345 ; SSE42-NEXT: cvttps2dq %xmm6, %xmm0
3346 ; SSE42-NEXT: pmulld %xmm1, %xmm0
3347 ; SSE42-NEXT: pslld $23, %xmm7
3348 ; SSE42-NEXT: paddd %xmm9, %xmm7
3349 ; SSE42-NEXT: cvttps2dq %xmm7, %xmm1
3350 ; SSE42-NEXT: pmulld %xmm2, %xmm1
3351 ; SSE42-NEXT: pslld $23, %xmm8
3352 ; SSE42-NEXT: paddd %xmm9, %xmm8
3353 ; SSE42-NEXT: cvttps2dq %xmm8, %xmm2
3354 ; SSE42-NEXT: pmulld %xmm3, %xmm2
3355 ; SSE42-NEXT: pslld $23, %xmm5
3356 ; SSE42-NEXT: paddd %xmm9, %xmm5
3357 ; SSE42-NEXT: cvttps2dq %xmm5, %xmm3
3358 ; SSE42-NEXT: pmulld %xmm4, %xmm3
3361 ; AVX2-LABEL: shl_v16i32_swap:
3363 ; AVX2-NEXT: vpunpckhbw {{.*#+}} xmm5 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]
3364 ; AVX2-NEXT: vpmovzxwd {{.*#+}} ymm5 = xmm5[0],zero,xmm5[1],zero,xmm5[2],zero,xmm5[3],zero,xmm5[4],zero,xmm5[5],zero,xmm5[6],zero,xmm5[7],zero
3365 ; AVX2-NEXT: vpslld $31, %ymm5, %ymm5
3366 ; AVX2-NEXT: vpsrad $31, %ymm5, %ymm5
3367 ; AVX2-NEXT: vpandn %ymm4, %ymm5, %ymm4
3368 ; AVX2-NEXT: vpmovzxbd {{.*#+}} ymm0 = 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
3369 ; AVX2-NEXT: vpslld $31, %ymm0, %ymm0
3370 ; AVX2-NEXT: vpsrad $31, %ymm0, %ymm0
3371 ; AVX2-NEXT: vpandn %ymm3, %ymm0, %ymm0
3372 ; AVX2-NEXT: vpsllvd %ymm0, %ymm1, %ymm0
3373 ; AVX2-NEXT: vpsllvd %ymm4, %ymm2, %ymm1
3376 ; AVX512-LABEL: shl_v16i32_swap:
3378 ; AVX512-NEXT: vpmovsxbd %xmm0, %zmm0
3379 ; AVX512-NEXT: vpslld $31, %zmm0, %zmm0
3380 ; AVX512-NEXT: vptestnmd %zmm0, %zmm0, %k1
3381 ; AVX512-NEXT: vpsllvd %zmm2, %zmm1, %zmm1 {%k1}
3382 ; AVX512-NEXT: vmovdqa64 %zmm1, %zmm0
3384 %s = select <16 x i1> %b, <16 x i32> zeroinitializer, <16 x i32> %y
3385 %r = shl <16 x i32> %x, %s
3389 ; negative test - shl is not commutative; there is no identity constant for operand 0
3391 define <16 x i32> @shl_v16i32_commute_swap(<16 x i1> %b, <16 x i32> noundef %x, <16 x i32> noundef %y) {
3392 ; SSE2-LABEL: shl_v16i32_commute_swap:
3394 ; SSE2-NEXT: movdqa %xmm0, %xmm9
3395 ; SSE2-NEXT: punpckhbw {{.*#+}} xmm9 = xmm9[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]
3396 ; SSE2-NEXT: movdqa %xmm9, %xmm8
3397 ; SSE2-NEXT: punpckhwd {{.*#+}} xmm8 = xmm8[4,4,5,5,6,6,7,7]
3398 ; SSE2-NEXT: pslld $31, %xmm8
3399 ; SSE2-NEXT: psrad $31, %xmm8
3400 ; SSE2-NEXT: pandn {{[0-9]+}}(%rsp), %xmm8
3401 ; SSE2-NEXT: punpcklwd {{.*#+}} xmm9 = xmm9[0,0,1,1,2,2,3,3]
3402 ; SSE2-NEXT: pslld $31, %xmm9
3403 ; SSE2-NEXT: psrad $31, %xmm9
3404 ; SSE2-NEXT: pandn %xmm7, %xmm9
3405 ; SSE2-NEXT: punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
3406 ; SSE2-NEXT: movdqa %xmm0, %xmm7
3407 ; SSE2-NEXT: punpckhwd {{.*#+}} xmm7 = xmm7[4,4,5,5,6,6,7,7]
3408 ; SSE2-NEXT: pslld $31, %xmm7
3409 ; SSE2-NEXT: psrad $31, %xmm7
3410 ; SSE2-NEXT: pandn %xmm6, %xmm7
3411 ; SSE2-NEXT: punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]
3412 ; SSE2-NEXT: pslld $31, %xmm0
3413 ; SSE2-NEXT: psrad $31, %xmm0
3414 ; SSE2-NEXT: pandn %xmm5, %xmm0
3415 ; SSE2-NEXT: pslld $23, %xmm1
3416 ; SSE2-NEXT: movdqa {{.*#+}} xmm5 = [1065353216,1065353216,1065353216,1065353216]
3417 ; SSE2-NEXT: paddd %xmm5, %xmm1
3418 ; SSE2-NEXT: cvttps2dq %xmm1, %xmm1
3419 ; SSE2-NEXT: pshufd {{.*#+}} xmm6 = xmm0[1,1,3,3]
3420 ; SSE2-NEXT: pmuludq %xmm1, %xmm0
3421 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
3422 ; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
3423 ; SSE2-NEXT: pmuludq %xmm6, %xmm1
3424 ; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm1[0,2,2,3]
3425 ; SSE2-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
3426 ; SSE2-NEXT: pslld $23, %xmm2
3427 ; SSE2-NEXT: paddd %xmm5, %xmm2
3428 ; SSE2-NEXT: cvttps2dq %xmm2, %xmm2
3429 ; SSE2-NEXT: pshufd {{.*#+}} xmm6 = xmm7[1,1,3,3]
3430 ; SSE2-NEXT: pmuludq %xmm2, %xmm7
3431 ; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm7[0,2,2,3]
3432 ; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
3433 ; SSE2-NEXT: pmuludq %xmm6, %xmm2
3434 ; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm2[0,2,2,3]
3435 ; SSE2-NEXT: punpckldq {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1]
3436 ; SSE2-NEXT: pslld $23, %xmm3
3437 ; SSE2-NEXT: paddd %xmm5, %xmm3
3438 ; SSE2-NEXT: cvttps2dq %xmm3, %xmm3
3439 ; SSE2-NEXT: pshufd {{.*#+}} xmm6 = xmm9[1,1,3,3]
3440 ; SSE2-NEXT: pmuludq %xmm3, %xmm9
3441 ; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm9[0,2,2,3]
3442 ; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
3443 ; SSE2-NEXT: pmuludq %xmm6, %xmm3
3444 ; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm3[0,2,2,3]
3445 ; SSE2-NEXT: punpckldq {{.*#+}} xmm2 = xmm2[0],xmm3[0],xmm2[1],xmm3[1]
3446 ; SSE2-NEXT: pslld $23, %xmm4
3447 ; SSE2-NEXT: paddd %xmm5, %xmm4
3448 ; SSE2-NEXT: cvttps2dq %xmm4, %xmm4
3449 ; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm8[1,1,3,3]
3450 ; SSE2-NEXT: pmuludq %xmm4, %xmm8
3451 ; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm8[0,2,2,3]
3452 ; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
3453 ; SSE2-NEXT: pmuludq %xmm5, %xmm4
3454 ; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm4[0,2,2,3]
3455 ; SSE2-NEXT: punpckldq {{.*#+}} xmm3 = xmm3[0],xmm4[0],xmm3[1],xmm4[1]
3458 ; SSE42-LABEL: shl_v16i32_commute_swap:
3460 ; SSE42-NEXT: pshufd {{.*#+}} xmm8 = xmm0[2,3,2,3]
3461 ; SSE42-NEXT: pmovzxbd {{.*#+}} xmm8 = xmm8[0],zero,zero,zero,xmm8[1],zero,zero,zero,xmm8[2],zero,zero,zero,xmm8[3],zero,zero,zero
3462 ; SSE42-NEXT: pslld $31, %xmm8
3463 ; SSE42-NEXT: psrad $31, %xmm8
3464 ; SSE42-NEXT: pandn %xmm7, %xmm8
3465 ; SSE42-NEXT: pshufd {{.*#+}} xmm7 = xmm0[1,1,1,1]
3466 ; SSE42-NEXT: pmovzxbd {{.*#+}} xmm7 = xmm7[0],zero,zero,zero,xmm7[1],zero,zero,zero,xmm7[2],zero,zero,zero,xmm7[3],zero,zero,zero
3467 ; SSE42-NEXT: pslld $31, %xmm7
3468 ; SSE42-NEXT: psrad $31, %xmm7
3469 ; SSE42-NEXT: pandn %xmm6, %xmm7
3470 ; SSE42-NEXT: pmovzxbd {{.*#+}} xmm6 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero
3471 ; SSE42-NEXT: pslld $31, %xmm6
3472 ; SSE42-NEXT: psrad $31, %xmm6
3473 ; SSE42-NEXT: pandn %xmm5, %xmm6
3474 ; SSE42-NEXT: pshufd {{.*#+}} xmm0 = xmm0[3,3,3,3]
3475 ; SSE42-NEXT: pmovzxbd {{.*#+}} xmm5 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero
3476 ; SSE42-NEXT: pslld $31, %xmm5
3477 ; SSE42-NEXT: psrad $31, %xmm5
3478 ; SSE42-NEXT: pandn {{[0-9]+}}(%rsp), %xmm5
3479 ; SSE42-NEXT: pslld $23, %xmm1
3480 ; SSE42-NEXT: movdqa {{.*#+}} xmm9 = [1065353216,1065353216,1065353216,1065353216]
3481 ; SSE42-NEXT: paddd %xmm9, %xmm1
3482 ; SSE42-NEXT: cvttps2dq %xmm1, %xmm0
3483 ; SSE42-NEXT: pmulld %xmm6, %xmm0
3484 ; SSE42-NEXT: pslld $23, %xmm2
3485 ; SSE42-NEXT: paddd %xmm9, %xmm2
3486 ; SSE42-NEXT: cvttps2dq %xmm2, %xmm1
3487 ; SSE42-NEXT: pmulld %xmm7, %xmm1
3488 ; SSE42-NEXT: pslld $23, %xmm3
3489 ; SSE42-NEXT: paddd %xmm9, %xmm3
3490 ; SSE42-NEXT: cvttps2dq %xmm3, %xmm2
3491 ; SSE42-NEXT: pmulld %xmm8, %xmm2
3492 ; SSE42-NEXT: pslld $23, %xmm4
3493 ; SSE42-NEXT: paddd %xmm9, %xmm4
3494 ; SSE42-NEXT: cvttps2dq %xmm4, %xmm3
3495 ; SSE42-NEXT: pmulld %xmm5, %xmm3
3498 ; AVX2-LABEL: shl_v16i32_commute_swap:
3500 ; AVX2-NEXT: vpunpckhbw {{.*#+}} xmm5 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]
3501 ; AVX2-NEXT: vpmovzxwd {{.*#+}} ymm5 = xmm5[0],zero,xmm5[1],zero,xmm5[2],zero,xmm5[3],zero,xmm5[4],zero,xmm5[5],zero,xmm5[6],zero,xmm5[7],zero
3502 ; AVX2-NEXT: vpslld $31, %ymm5, %ymm5
3503 ; AVX2-NEXT: vpsrad $31, %ymm5, %ymm5
3504 ; AVX2-NEXT: vpandn %ymm4, %ymm5, %ymm4
3505 ; AVX2-NEXT: vpmovzxbd {{.*#+}} ymm0 = 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
3506 ; AVX2-NEXT: vpslld $31, %ymm0, %ymm0
3507 ; AVX2-NEXT: vpsrad $31, %ymm0, %ymm0
3508 ; AVX2-NEXT: vpandn %ymm3, %ymm0, %ymm0
3509 ; AVX2-NEXT: vpsllvd %ymm1, %ymm0, %ymm0
3510 ; AVX2-NEXT: vpsllvd %ymm2, %ymm4, %ymm1
3513 ; AVX512-LABEL: shl_v16i32_commute_swap:
3515 ; AVX512-NEXT: vpmovsxbd %xmm0, %zmm0
3516 ; AVX512-NEXT: vpslld $31, %zmm0, %zmm0
3517 ; AVX512-NEXT: vptestnmd %zmm0, %zmm0, %k1
3518 ; AVX512-NEXT: vmovdqa32 %zmm2, %zmm0 {%k1} {z}
3519 ; AVX512-NEXT: vpsllvd %zmm1, %zmm0, %zmm0
3521 %s = select <16 x i1> %b, <16 x i32> zeroinitializer, <16 x i32> %y
3522 %r = shl <16 x i32> %s, %x
3526 define <8 x i32> @shl_v8i32_cast_cond(i8 noundef zeroext %pb, <8 x i32> noundef %x, <8 x i32> noundef %y) {
3527 ; SSE2-LABEL: shl_v8i32_cast_cond:
3529 ; SSE2-NEXT: movd %edi, %xmm4
3530 ; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm4[0,0,0,0]
3531 ; SSE2-NEXT: movdqa {{.*#+}} xmm6 = [16,32,64,128]
3532 ; SSE2-NEXT: movdqa %xmm5, %xmm4
3533 ; SSE2-NEXT: pand %xmm6, %xmm4
3534 ; SSE2-NEXT: pcmpeqd %xmm6, %xmm4
3535 ; SSE2-NEXT: pand %xmm3, %xmm4
3536 ; SSE2-NEXT: movdqa {{.*#+}} xmm3 = [1,2,4,8]
3537 ; SSE2-NEXT: pand %xmm3, %xmm5
3538 ; SSE2-NEXT: pcmpeqd %xmm3, %xmm5
3539 ; SSE2-NEXT: pand %xmm2, %xmm5
3540 ; SSE2-NEXT: pslld $23, %xmm5
3541 ; SSE2-NEXT: movdqa {{.*#+}} xmm2 = [1065353216,1065353216,1065353216,1065353216]
3542 ; SSE2-NEXT: paddd %xmm2, %xmm5
3543 ; SSE2-NEXT: cvttps2dq %xmm5, %xmm3
3544 ; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm0[1,1,3,3]
3545 ; SSE2-NEXT: pmuludq %xmm3, %xmm0
3546 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
3547 ; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
3548 ; SSE2-NEXT: pmuludq %xmm5, %xmm3
3549 ; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm3[0,2,2,3]
3550 ; SSE2-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm3[0],xmm0[1],xmm3[1]
3551 ; SSE2-NEXT: pslld $23, %xmm4
3552 ; SSE2-NEXT: paddd %xmm2, %xmm4
3553 ; SSE2-NEXT: cvttps2dq %xmm4, %xmm2
3554 ; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm1[1,1,3,3]
3555 ; SSE2-NEXT: pmuludq %xmm2, %xmm1
3556 ; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm1[0,2,2,3]
3557 ; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
3558 ; SSE2-NEXT: pmuludq %xmm3, %xmm2
3559 ; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm2[0,2,2,3]
3560 ; SSE2-NEXT: punpckldq {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1]
3563 ; SSE42-LABEL: shl_v8i32_cast_cond:
3565 ; SSE42-NEXT: movd %edi, %xmm4
3566 ; SSE42-NEXT: pshufd {{.*#+}} xmm4 = xmm4[0,0,0,0]
3567 ; SSE42-NEXT: movdqa {{.*#+}} xmm5 = [16,32,64,128]
3568 ; SSE42-NEXT: movdqa %xmm4, %xmm6
3569 ; SSE42-NEXT: pand %xmm5, %xmm6
3570 ; SSE42-NEXT: pcmpeqd %xmm5, %xmm6
3571 ; SSE42-NEXT: pand %xmm3, %xmm6
3572 ; SSE42-NEXT: movdqa {{.*#+}} xmm3 = [1,2,4,8]
3573 ; SSE42-NEXT: pand %xmm3, %xmm4
3574 ; SSE42-NEXT: pcmpeqd %xmm3, %xmm4
3575 ; SSE42-NEXT: pand %xmm2, %xmm4
3576 ; SSE42-NEXT: pslld $23, %xmm4
3577 ; SSE42-NEXT: movdqa {{.*#+}} xmm2 = [1065353216,1065353216,1065353216,1065353216]
3578 ; SSE42-NEXT: paddd %xmm2, %xmm4
3579 ; SSE42-NEXT: cvttps2dq %xmm4, %xmm3
3580 ; SSE42-NEXT: pmulld %xmm3, %xmm0
3581 ; SSE42-NEXT: pslld $23, %xmm6
3582 ; SSE42-NEXT: paddd %xmm2, %xmm6
3583 ; SSE42-NEXT: cvttps2dq %xmm6, %xmm2
3584 ; SSE42-NEXT: pmulld %xmm2, %xmm1
3587 ; AVX2-LABEL: shl_v8i32_cast_cond:
3589 ; AVX2-NEXT: vmovd %edi, %xmm2
3590 ; AVX2-NEXT: vpbroadcastb %xmm2, %ymm2
3591 ; AVX2-NEXT: vmovdqa {{.*#+}} ymm3 = [1,2,4,8,16,32,64,128]
3592 ; AVX2-NEXT: vpand %ymm3, %ymm2, %ymm2
3593 ; AVX2-NEXT: vpcmpeqd %ymm3, %ymm2, %ymm2
3594 ; AVX2-NEXT: vpand %ymm1, %ymm2, %ymm1
3595 ; AVX2-NEXT: vpsllvd %ymm1, %ymm0, %ymm0
3598 ; AVX512F-LABEL: shl_v8i32_cast_cond:
3600 ; AVX512F-NEXT: # kill: def $ymm1 killed $ymm1 def $zmm1
3601 ; AVX512F-NEXT: kmovw %edi, %k1
3602 ; AVX512F-NEXT: vmovdqa32 %zmm1, %zmm1 {%k1} {z}
3603 ; AVX512F-NEXT: vpsllvd %ymm1, %ymm0, %ymm0
3604 ; AVX512F-NEXT: retq
3606 ; AVX512VL-LABEL: shl_v8i32_cast_cond:
3607 ; AVX512VL: # %bb.0:
3608 ; AVX512VL-NEXT: kmovw %edi, %k1
3609 ; AVX512VL-NEXT: vpsllvd %ymm1, %ymm0, %ymm0 {%k1}
3610 ; AVX512VL-NEXT: retq
3611 %b = bitcast i8 %pb to <8 x i1>
3612 %s = select <8 x i1> %b, <8 x i32> %y, <8 x i32> zeroinitializer
3613 %r = shl <8 x i32> %x, %s
3617 define <8 x i64> @shl_v8i64_cast_cond(i8 noundef zeroext %pb, <8 x i64> noundef %x, <8 x i64> noundef %y) {
3618 ; SSE2-LABEL: shl_v8i64_cast_cond:
3620 ; SSE2-NEXT: movd %edi, %xmm8
3621 ; SSE2-NEXT: pshufd {{.*#+}} xmm9 = xmm8[0,1,0,1]
3622 ; SSE2-NEXT: movdqa {{.*#+}} xmm10 = [64,128]
3623 ; SSE2-NEXT: movdqa %xmm9, %xmm8
3624 ; SSE2-NEXT: pand %xmm10, %xmm8
3625 ; SSE2-NEXT: pcmpeqd %xmm10, %xmm8
3626 ; SSE2-NEXT: pshufd {{.*#+}} xmm10 = xmm8[1,0,3,2]
3627 ; SSE2-NEXT: pand %xmm7, %xmm8
3628 ; SSE2-NEXT: pand %xmm10, %xmm8
3629 ; SSE2-NEXT: movdqa {{.*#+}} xmm10 = [16,32]
3630 ; SSE2-NEXT: movdqa %xmm9, %xmm7
3631 ; SSE2-NEXT: pand %xmm10, %xmm7
3632 ; SSE2-NEXT: pcmpeqd %xmm10, %xmm7
3633 ; SSE2-NEXT: pshufd {{.*#+}} xmm10 = xmm7[1,0,3,2]
3634 ; SSE2-NEXT: pand %xmm6, %xmm7
3635 ; SSE2-NEXT: pand %xmm10, %xmm7
3636 ; SSE2-NEXT: movdqa {{.*#+}} xmm6 = [4,8]
3637 ; SSE2-NEXT: movdqa %xmm9, %xmm10
3638 ; SSE2-NEXT: pand %xmm6, %xmm10
3639 ; SSE2-NEXT: pcmpeqd %xmm6, %xmm10
3640 ; SSE2-NEXT: pshufd {{.*#+}} xmm6 = xmm10[1,0,3,2]
3641 ; SSE2-NEXT: pand %xmm5, %xmm10
3642 ; SSE2-NEXT: pand %xmm6, %xmm10
3643 ; SSE2-NEXT: movdqa {{.*#+}} xmm5 = [1,2]
3644 ; SSE2-NEXT: pand %xmm5, %xmm9
3645 ; SSE2-NEXT: pcmpeqd %xmm5, %xmm9
3646 ; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm9[1,0,3,2]
3647 ; SSE2-NEXT: pand %xmm4, %xmm9
3648 ; SSE2-NEXT: pand %xmm5, %xmm9
3649 ; SSE2-NEXT: movdqa %xmm0, %xmm4
3650 ; SSE2-NEXT: psllq %xmm9, %xmm4
3651 ; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm9[2,3,2,3]
3652 ; SSE2-NEXT: psllq %xmm5, %xmm0
3653 ; SSE2-NEXT: movsd {{.*#+}} xmm0 = xmm4[0],xmm0[1]
3654 ; SSE2-NEXT: movdqa %xmm1, %xmm4
3655 ; SSE2-NEXT: psllq %xmm10, %xmm4
3656 ; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm10[2,3,2,3]
3657 ; SSE2-NEXT: psllq %xmm5, %xmm1
3658 ; SSE2-NEXT: movsd {{.*#+}} xmm1 = xmm4[0],xmm1[1]
3659 ; SSE2-NEXT: movdqa %xmm2, %xmm4
3660 ; SSE2-NEXT: psllq %xmm7, %xmm4
3661 ; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm7[2,3,2,3]
3662 ; SSE2-NEXT: psllq %xmm5, %xmm2
3663 ; SSE2-NEXT: movsd {{.*#+}} xmm2 = xmm4[0],xmm2[1]
3664 ; SSE2-NEXT: movdqa %xmm3, %xmm4
3665 ; SSE2-NEXT: psllq %xmm8, %xmm4
3666 ; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm8[2,3,2,3]
3667 ; SSE2-NEXT: psllq %xmm5, %xmm3
3668 ; SSE2-NEXT: movsd {{.*#+}} xmm3 = xmm4[0],xmm3[1]
3671 ; SSE42-LABEL: shl_v8i64_cast_cond:
3673 ; SSE42-NEXT: movd %edi, %xmm8
3674 ; SSE42-NEXT: pshufd {{.*#+}} xmm9 = xmm8[0,1,0,1]
3675 ; SSE42-NEXT: movdqa {{.*#+}} xmm10 = [64,128]
3676 ; SSE42-NEXT: movdqa %xmm9, %xmm8
3677 ; SSE42-NEXT: pand %xmm10, %xmm8
3678 ; SSE42-NEXT: pcmpeqq %xmm10, %xmm8
3679 ; SSE42-NEXT: pand %xmm7, %xmm8
3680 ; SSE42-NEXT: movdqa {{.*#+}} xmm10 = [16,32]
3681 ; SSE42-NEXT: movdqa %xmm9, %xmm7
3682 ; SSE42-NEXT: pand %xmm10, %xmm7
3683 ; SSE42-NEXT: pcmpeqq %xmm10, %xmm7
3684 ; SSE42-NEXT: pand %xmm6, %xmm7
3685 ; SSE42-NEXT: movdqa {{.*#+}} xmm6 = [4,8]
3686 ; SSE42-NEXT: movdqa %xmm9, %xmm10
3687 ; SSE42-NEXT: pand %xmm6, %xmm10
3688 ; SSE42-NEXT: pcmpeqq %xmm6, %xmm10
3689 ; SSE42-NEXT: pand %xmm5, %xmm10
3690 ; SSE42-NEXT: movdqa {{.*#+}} xmm5 = [1,2]
3691 ; SSE42-NEXT: pand %xmm5, %xmm9
3692 ; SSE42-NEXT: pcmpeqq %xmm5, %xmm9
3693 ; SSE42-NEXT: pand %xmm4, %xmm9
3694 ; SSE42-NEXT: movdqa %xmm0, %xmm4
3695 ; SSE42-NEXT: psllq %xmm9, %xmm4
3696 ; SSE42-NEXT: pshufd {{.*#+}} xmm5 = xmm9[2,3,2,3]
3697 ; SSE42-NEXT: psllq %xmm5, %xmm0
3698 ; SSE42-NEXT: pblendw {{.*#+}} xmm0 = xmm4[0,1,2,3],xmm0[4,5,6,7]
3699 ; SSE42-NEXT: movdqa %xmm1, %xmm4
3700 ; SSE42-NEXT: psllq %xmm10, %xmm4
3701 ; SSE42-NEXT: pshufd {{.*#+}} xmm5 = xmm10[2,3,2,3]
3702 ; SSE42-NEXT: psllq %xmm5, %xmm1
3703 ; SSE42-NEXT: pblendw {{.*#+}} xmm1 = xmm4[0,1,2,3],xmm1[4,5,6,7]
3704 ; SSE42-NEXT: movdqa %xmm2, %xmm4
3705 ; SSE42-NEXT: psllq %xmm7, %xmm4
3706 ; SSE42-NEXT: pshufd {{.*#+}} xmm5 = xmm7[2,3,2,3]
3707 ; SSE42-NEXT: psllq %xmm5, %xmm2
3708 ; SSE42-NEXT: pblendw {{.*#+}} xmm2 = xmm4[0,1,2,3],xmm2[4,5,6,7]
3709 ; SSE42-NEXT: movdqa %xmm3, %xmm4
3710 ; SSE42-NEXT: psllq %xmm8, %xmm4
3711 ; SSE42-NEXT: pshufd {{.*#+}} xmm5 = xmm8[2,3,2,3]
3712 ; SSE42-NEXT: psllq %xmm5, %xmm3
3713 ; SSE42-NEXT: pblendw {{.*#+}} xmm3 = xmm4[0,1,2,3],xmm3[4,5,6,7]
3716 ; AVX2-LABEL: shl_v8i64_cast_cond:
3718 ; AVX2-NEXT: vmovd %edi, %xmm4
3719 ; AVX2-NEXT: vpbroadcastb %xmm4, %ymm4
3720 ; AVX2-NEXT: vmovdqa {{.*#+}} ymm5 = [16,32,64,128]
3721 ; AVX2-NEXT: vpand %ymm5, %ymm4, %ymm6
3722 ; AVX2-NEXT: vpcmpeqq %ymm5, %ymm6, %ymm5
3723 ; AVX2-NEXT: vpand %ymm3, %ymm5, %ymm3
3724 ; AVX2-NEXT: vmovdqa {{.*#+}} ymm5 = [1,2,4,8]
3725 ; AVX2-NEXT: vpand %ymm5, %ymm4, %ymm4
3726 ; AVX2-NEXT: vpcmpeqq %ymm5, %ymm4, %ymm4
3727 ; AVX2-NEXT: vpand %ymm2, %ymm4, %ymm2
3728 ; AVX2-NEXT: vpsllvq %ymm2, %ymm0, %ymm0
3729 ; AVX2-NEXT: vpsllvq %ymm3, %ymm1, %ymm1
3732 ; AVX512-LABEL: shl_v8i64_cast_cond:
3734 ; AVX512-NEXT: kmovw %edi, %k1
3735 ; AVX512-NEXT: vpsllvq %zmm1, %zmm0, %zmm0 {%k1}
3737 %b = bitcast i8 %pb to <8 x i1>
3738 %s = select <8 x i1> %b, <8 x i64> %y, <8 x i64> zeroinitializer
3739 %r = shl <8 x i64> %x, %s
3743 define <4 x i32> @lshr_v4i32(<4 x i1> %b, <4 x i32> noundef %x, <4 x i32> noundef %y) {
3744 ; SSE2-LABEL: lshr_v4i32:
3746 ; SSE2-NEXT: pslld $31, %xmm0
3747 ; SSE2-NEXT: psrad $31, %xmm0
3748 ; SSE2-NEXT: pand %xmm2, %xmm0
3749 ; SSE2-NEXT: pshuflw {{.*#+}} xmm2 = xmm0[2,3,3,3,4,5,6,7]
3750 ; SSE2-NEXT: movdqa %xmm1, %xmm3
3751 ; SSE2-NEXT: psrld %xmm2, %xmm3
3752 ; SSE2-NEXT: pshuflw {{.*#+}} xmm4 = xmm0[0,1,1,1,4,5,6,7]
3753 ; SSE2-NEXT: movdqa %xmm1, %xmm2
3754 ; SSE2-NEXT: psrld %xmm4, %xmm2
3755 ; SSE2-NEXT: punpcklqdq {{.*#+}} xmm2 = xmm2[0],xmm3[0]
3756 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[2,3,2,3]
3757 ; SSE2-NEXT: pshuflw {{.*#+}} xmm3 = xmm0[2,3,3,3,4,5,6,7]
3758 ; SSE2-NEXT: movdqa %xmm1, %xmm4
3759 ; SSE2-NEXT: psrld %xmm3, %xmm4
3760 ; SSE2-NEXT: pshuflw {{.*#+}} xmm0 = xmm0[0,1,1,1,4,5,6,7]
3761 ; SSE2-NEXT: psrld %xmm0, %xmm1
3762 ; SSE2-NEXT: punpckhqdq {{.*#+}} xmm1 = xmm1[1],xmm4[1]
3763 ; SSE2-NEXT: shufps {{.*#+}} xmm2 = xmm2[0,3],xmm1[0,3]
3764 ; SSE2-NEXT: movaps %xmm2, %xmm0
3767 ; SSE42-LABEL: lshr_v4i32:
3769 ; SSE42-NEXT: pslld $31, %xmm0
3770 ; SSE42-NEXT: psrad $31, %xmm0
3771 ; SSE42-NEXT: pand %xmm2, %xmm0
3772 ; SSE42-NEXT: pshuflw {{.*#+}} xmm2 = xmm0[2,3,3,3,4,5,6,7]
3773 ; SSE42-NEXT: movdqa %xmm1, %xmm3
3774 ; SSE42-NEXT: psrld %xmm2, %xmm3
3775 ; SSE42-NEXT: pshufd {{.*#+}} xmm2 = xmm0[2,3,2,3]
3776 ; SSE42-NEXT: pshuflw {{.*#+}} xmm4 = xmm2[2,3,3,3,4,5,6,7]
3777 ; SSE42-NEXT: movdqa %xmm1, %xmm5
3778 ; SSE42-NEXT: psrld %xmm4, %xmm5
3779 ; SSE42-NEXT: pblendw {{.*#+}} xmm5 = xmm3[0,1,2,3],xmm5[4,5,6,7]
3780 ; SSE42-NEXT: pshuflw {{.*#+}} xmm3 = xmm0[0,1,1,1,4,5,6,7]
3781 ; SSE42-NEXT: movdqa %xmm1, %xmm0
3782 ; SSE42-NEXT: psrld %xmm3, %xmm0
3783 ; SSE42-NEXT: pshuflw {{.*#+}} xmm2 = xmm2[0,1,1,1,4,5,6,7]
3784 ; SSE42-NEXT: psrld %xmm2, %xmm1
3785 ; SSE42-NEXT: pblendw {{.*#+}} xmm0 = xmm0[0,1,2,3],xmm1[4,5,6,7]
3786 ; SSE42-NEXT: pblendw {{.*#+}} xmm0 = xmm0[0,1],xmm5[2,3],xmm0[4,5],xmm5[6,7]
3789 ; AVX2-LABEL: lshr_v4i32:
3791 ; AVX2-NEXT: vpslld $31, %xmm0, %xmm0
3792 ; AVX2-NEXT: vpsrad $31, %xmm0, %xmm0
3793 ; AVX2-NEXT: vpand %xmm2, %xmm0, %xmm0
3794 ; AVX2-NEXT: vpsrlvd %xmm0, %xmm1, %xmm0
3797 ; AVX512F-LABEL: lshr_v4i32:
3799 ; AVX512F-NEXT: # kill: def $xmm2 killed $xmm2 def $zmm2
3800 ; AVX512F-NEXT: vpslld $31, %xmm0, %xmm0
3801 ; AVX512F-NEXT: vptestmd %zmm0, %zmm0, %k1
3802 ; AVX512F-NEXT: vmovdqa32 %zmm2, %zmm0 {%k1} {z}
3803 ; AVX512F-NEXT: vpsrlvd %xmm0, %xmm1, %xmm0
3804 ; AVX512F-NEXT: vzeroupper
3805 ; AVX512F-NEXT: retq
3807 ; AVX512VL-LABEL: lshr_v4i32:
3808 ; AVX512VL: # %bb.0:
3809 ; AVX512VL-NEXT: vpslld $31, %xmm0, %xmm0
3810 ; AVX512VL-NEXT: vptestmd %xmm0, %xmm0, %k1
3811 ; AVX512VL-NEXT: vpsrlvd %xmm2, %xmm1, %xmm1 {%k1}
3812 ; AVX512VL-NEXT: vmovdqa %xmm1, %xmm0
3813 ; AVX512VL-NEXT: retq
3814 %s = select <4 x i1> %b, <4 x i32> %y, <4 x i32> zeroinitializer
3815 %r = lshr <4 x i32> %x, %s
3819 ; negative test - lshr is not commutative; there is no identity constant for operand 0
3821 define <8 x i32> @lshr_v8i32_commute(<8 x i1> %b, <8 x i32> noundef %x, <8 x i32> noundef %y) {
3822 ; SSE2-LABEL: lshr_v8i32_commute:
3824 ; SSE2-NEXT: movdqa %xmm1, %xmm5
3825 ; SSE2-NEXT: movdqa %xmm0, %xmm1
3826 ; SSE2-NEXT: punpckhwd {{.*#+}} xmm1 = xmm1[4,4,5,5,6,6,7,7]
3827 ; SSE2-NEXT: pslld $31, %xmm1
3828 ; SSE2-NEXT: psrad $31, %xmm1
3829 ; SSE2-NEXT: pand %xmm4, %xmm1
3830 ; SSE2-NEXT: punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]
3831 ; SSE2-NEXT: pslld $31, %xmm0
3832 ; SSE2-NEXT: psrad $31, %xmm0
3833 ; SSE2-NEXT: pand %xmm3, %xmm0
3834 ; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm5[2,3,2,3]
3835 ; SSE2-NEXT: pshuflw {{.*#+}} xmm4 = xmm3[2,3,3,3,4,5,6,7]
3836 ; SSE2-NEXT: movdqa %xmm0, %xmm6
3837 ; SSE2-NEXT: psrld %xmm4, %xmm6
3838 ; SSE2-NEXT: pshuflw {{.*#+}} xmm3 = xmm3[0,1,1,1,4,5,6,7]
3839 ; SSE2-NEXT: movdqa %xmm0, %xmm4
3840 ; SSE2-NEXT: psrld %xmm3, %xmm4
3841 ; SSE2-NEXT: punpckhqdq {{.*#+}} xmm4 = xmm4[1],xmm6[1]
3842 ; SSE2-NEXT: pshuflw {{.*#+}} xmm3 = xmm5[2,3,3,3,4,5,6,7]
3843 ; SSE2-NEXT: movdqa %xmm0, %xmm6
3844 ; SSE2-NEXT: psrld %xmm3, %xmm6
3845 ; SSE2-NEXT: pshuflw {{.*#+}} xmm3 = xmm5[0,1,1,1,4,5,6,7]
3846 ; SSE2-NEXT: psrld %xmm3, %xmm0
3847 ; SSE2-NEXT: punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm6[0]
3848 ; SSE2-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,3],xmm4[0,3]
3849 ; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm2[2,3,2,3]
3850 ; SSE2-NEXT: pshuflw {{.*#+}} xmm4 = xmm3[2,3,3,3,4,5,6,7]
3851 ; SSE2-NEXT: movdqa %xmm1, %xmm5
3852 ; SSE2-NEXT: psrld %xmm4, %xmm5
3853 ; SSE2-NEXT: pshuflw {{.*#+}} xmm3 = xmm3[0,1,1,1,4,5,6,7]
3854 ; SSE2-NEXT: movdqa %xmm1, %xmm4
3855 ; SSE2-NEXT: psrld %xmm3, %xmm4
3856 ; SSE2-NEXT: punpckhqdq {{.*#+}} xmm4 = xmm4[1],xmm5[1]
3857 ; SSE2-NEXT: pshuflw {{.*#+}} xmm3 = xmm2[2,3,3,3,4,5,6,7]
3858 ; SSE2-NEXT: movdqa %xmm1, %xmm5
3859 ; SSE2-NEXT: psrld %xmm3, %xmm5
3860 ; SSE2-NEXT: pshuflw {{.*#+}} xmm2 = xmm2[0,1,1,1,4,5,6,7]
3861 ; SSE2-NEXT: psrld %xmm2, %xmm1
3862 ; SSE2-NEXT: punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm5[0]
3863 ; SSE2-NEXT: shufps {{.*#+}} xmm1 = xmm1[0,3],xmm4[0,3]
3866 ; SSE42-LABEL: lshr_v8i32_commute:
3868 ; SSE42-NEXT: movdqa %xmm0, %xmm5
3869 ; SSE42-NEXT: pmovzxwd {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero
3870 ; SSE42-NEXT: punpckhwd {{.*#+}} xmm5 = xmm5[4,4,5,5,6,6,7,7]
3871 ; SSE42-NEXT: pslld $31, %xmm5
3872 ; SSE42-NEXT: psrad $31, %xmm5
3873 ; SSE42-NEXT: pand %xmm4, %xmm5
3874 ; SSE42-NEXT: pslld $31, %xmm0
3875 ; SSE42-NEXT: psrad $31, %xmm0
3876 ; SSE42-NEXT: pand %xmm3, %xmm0
3877 ; SSE42-NEXT: pshufd {{.*#+}} xmm3 = xmm1[2,3,2,3]
3878 ; SSE42-NEXT: pshuflw {{.*#+}} xmm4 = xmm3[2,3,3,3,4,5,6,7]
3879 ; SSE42-NEXT: movdqa %xmm0, %xmm6
3880 ; SSE42-NEXT: psrld %xmm4, %xmm6
3881 ; SSE42-NEXT: pshuflw {{.*#+}} xmm4 = xmm1[2,3,3,3,4,5,6,7]
3882 ; SSE42-NEXT: movdqa %xmm0, %xmm7
3883 ; SSE42-NEXT: psrld %xmm4, %xmm7
3884 ; SSE42-NEXT: pblendw {{.*#+}} xmm7 = xmm7[0,1,2,3],xmm6[4,5,6,7]
3885 ; SSE42-NEXT: pshuflw {{.*#+}} xmm3 = xmm3[0,1,1,1,4,5,6,7]
3886 ; SSE42-NEXT: movdqa %xmm0, %xmm4
3887 ; SSE42-NEXT: psrld %xmm3, %xmm4
3888 ; SSE42-NEXT: pshuflw {{.*#+}} xmm1 = xmm1[0,1,1,1,4,5,6,7]
3889 ; SSE42-NEXT: psrld %xmm1, %xmm0
3890 ; SSE42-NEXT: pblendw {{.*#+}} xmm0 = xmm0[0,1,2,3],xmm4[4,5,6,7]
3891 ; SSE42-NEXT: pblendw {{.*#+}} xmm0 = xmm0[0,1],xmm7[2,3],xmm0[4,5],xmm7[6,7]
3892 ; SSE42-NEXT: pshufd {{.*#+}} xmm1 = xmm2[2,3,2,3]
3893 ; SSE42-NEXT: pshuflw {{.*#+}} xmm3 = xmm1[2,3,3,3,4,5,6,7]
3894 ; SSE42-NEXT: movdqa %xmm5, %xmm4
3895 ; SSE42-NEXT: psrld %xmm3, %xmm4
3896 ; SSE42-NEXT: pshuflw {{.*#+}} xmm3 = xmm2[2,3,3,3,4,5,6,7]
3897 ; SSE42-NEXT: movdqa %xmm5, %xmm6
3898 ; SSE42-NEXT: psrld %xmm3, %xmm6
3899 ; SSE42-NEXT: pblendw {{.*#+}} xmm6 = xmm6[0,1,2,3],xmm4[4,5,6,7]
3900 ; SSE42-NEXT: pshuflw {{.*#+}} xmm3 = xmm1[0,1,1,1,4,5,6,7]
3901 ; SSE42-NEXT: movdqa %xmm5, %xmm1
3902 ; SSE42-NEXT: psrld %xmm3, %xmm1
3903 ; SSE42-NEXT: pshuflw {{.*#+}} xmm2 = xmm2[0,1,1,1,4,5,6,7]
3904 ; SSE42-NEXT: psrld %xmm2, %xmm5
3905 ; SSE42-NEXT: pblendw {{.*#+}} xmm1 = xmm5[0,1,2,3],xmm1[4,5,6,7]
3906 ; SSE42-NEXT: pblendw {{.*#+}} xmm1 = xmm1[0,1],xmm6[2,3],xmm1[4,5],xmm6[6,7]
3909 ; AVX2-LABEL: lshr_v8i32_commute:
3911 ; AVX2-NEXT: vpmovzxwd {{.*#+}} ymm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero
3912 ; AVX2-NEXT: vpslld $31, %ymm0, %ymm0
3913 ; AVX2-NEXT: vpsrad $31, %ymm0, %ymm0
3914 ; AVX2-NEXT: vpand %ymm2, %ymm0, %ymm0
3915 ; AVX2-NEXT: vpsrlvd %ymm1, %ymm0, %ymm0
3918 ; AVX512F-LABEL: lshr_v8i32_commute:
3920 ; AVX512F-NEXT: # kill: def $ymm2 killed $ymm2 def $zmm2
3921 ; AVX512F-NEXT: vpmovsxwq %xmm0, %zmm0
3922 ; AVX512F-NEXT: vpsllq $63, %zmm0, %zmm0
3923 ; AVX512F-NEXT: vptestmq %zmm0, %zmm0, %k1
3924 ; AVX512F-NEXT: vmovdqa32 %zmm2, %zmm0 {%k1} {z}
3925 ; AVX512F-NEXT: vpsrlvd %ymm1, %ymm0, %ymm0
3926 ; AVX512F-NEXT: retq
3928 ; AVX512VL-LABEL: lshr_v8i32_commute:
3929 ; AVX512VL: # %bb.0:
3930 ; AVX512VL-NEXT: vpmovsxwd %xmm0, %ymm0
3931 ; AVX512VL-NEXT: vpslld $31, %ymm0, %ymm0
3932 ; AVX512VL-NEXT: vptestmd %ymm0, %ymm0, %k1
3933 ; AVX512VL-NEXT: vmovdqa32 %ymm2, %ymm0 {%k1} {z}
3934 ; AVX512VL-NEXT: vpsrlvd %ymm1, %ymm0, %ymm0
3935 ; AVX512VL-NEXT: retq
3936 %s = select <8 x i1> %b, <8 x i32> %y, <8 x i32> zeroinitializer
3937 %r = lshr <8 x i32> %s, %x
3941 define <16 x i32> @lshr_v16i32_swap(<16 x i1> %b, <16 x i32> noundef %x, <16 x i32> noundef %y) {
3942 ; SSE2-LABEL: lshr_v16i32_swap:
3944 ; SSE2-NEXT: movdqa %xmm0, %xmm8
3945 ; SSE2-NEXT: movdqa %xmm0, %xmm10
3946 ; SSE2-NEXT: punpckhbw {{.*#+}} xmm10 = xmm10[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]
3947 ; SSE2-NEXT: movdqa %xmm10, %xmm9
3948 ; SSE2-NEXT: punpckhwd {{.*#+}} xmm9 = xmm9[4,4,5,5,6,6,7,7]
3949 ; SSE2-NEXT: pslld $31, %xmm9
3950 ; SSE2-NEXT: psrad $31, %xmm9
3951 ; SSE2-NEXT: pandn {{[0-9]+}}(%rsp), %xmm9
3952 ; SSE2-NEXT: punpcklwd {{.*#+}} xmm10 = xmm10[0,0,1,1,2,2,3,3]
3953 ; SSE2-NEXT: pslld $31, %xmm10
3954 ; SSE2-NEXT: psrad $31, %xmm10
3955 ; SSE2-NEXT: pandn %xmm7, %xmm10
3956 ; SSE2-NEXT: punpcklbw {{.*#+}} xmm8 = xmm8[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
3957 ; SSE2-NEXT: movdqa %xmm8, %xmm7
3958 ; SSE2-NEXT: punpckhwd {{.*#+}} xmm7 = xmm7[4,4,5,5,6,6,7,7]
3959 ; SSE2-NEXT: pslld $31, %xmm7
3960 ; SSE2-NEXT: psrad $31, %xmm7
3961 ; SSE2-NEXT: pandn %xmm6, %xmm7
3962 ; SSE2-NEXT: punpcklwd {{.*#+}} xmm8 = xmm8[0,0,1,1,2,2,3,3]
3963 ; SSE2-NEXT: pslld $31, %xmm8
3964 ; SSE2-NEXT: psrad $31, %xmm8
3965 ; SSE2-NEXT: pandn %xmm5, %xmm8
3966 ; SSE2-NEXT: pshuflw {{.*#+}} xmm0 = xmm8[2,3,3,3,4,5,6,7]
3967 ; SSE2-NEXT: movdqa %xmm1, %xmm5
3968 ; SSE2-NEXT: psrld %xmm0, %xmm5
3969 ; SSE2-NEXT: pshuflw {{.*#+}} xmm6 = xmm8[0,1,1,1,4,5,6,7]
3970 ; SSE2-NEXT: movdqa %xmm1, %xmm0
3971 ; SSE2-NEXT: psrld %xmm6, %xmm0
3972 ; SSE2-NEXT: punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm5[0]
3973 ; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm8[2,3,2,3]
3974 ; SSE2-NEXT: pshuflw {{.*#+}} xmm6 = xmm5[2,3,3,3,4,5,6,7]
3975 ; SSE2-NEXT: movdqa %xmm1, %xmm8
3976 ; SSE2-NEXT: psrld %xmm6, %xmm8
3977 ; SSE2-NEXT: pshuflw {{.*#+}} xmm5 = xmm5[0,1,1,1,4,5,6,7]
3978 ; SSE2-NEXT: psrld %xmm5, %xmm1
3979 ; SSE2-NEXT: punpckhqdq {{.*#+}} xmm1 = xmm1[1],xmm8[1]
3980 ; SSE2-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,3],xmm1[0,3]
3981 ; SSE2-NEXT: pshuflw {{.*#+}} xmm1 = xmm7[2,3,3,3,4,5,6,7]
3982 ; SSE2-NEXT: movdqa %xmm2, %xmm5
3983 ; SSE2-NEXT: psrld %xmm1, %xmm5
3984 ; SSE2-NEXT: pshuflw {{.*#+}} xmm6 = xmm7[0,1,1,1,4,5,6,7]
3985 ; SSE2-NEXT: movdqa %xmm2, %xmm1
3986 ; SSE2-NEXT: psrld %xmm6, %xmm1
3987 ; SSE2-NEXT: punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm5[0]
3988 ; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm7[2,3,2,3]
3989 ; SSE2-NEXT: pshuflw {{.*#+}} xmm6 = xmm5[2,3,3,3,4,5,6,7]
3990 ; SSE2-NEXT: movdqa %xmm2, %xmm7
3991 ; SSE2-NEXT: psrld %xmm6, %xmm7
3992 ; SSE2-NEXT: pshuflw {{.*#+}} xmm5 = xmm5[0,1,1,1,4,5,6,7]
3993 ; SSE2-NEXT: psrld %xmm5, %xmm2
3994 ; SSE2-NEXT: punpckhqdq {{.*#+}} xmm2 = xmm2[1],xmm7[1]
3995 ; SSE2-NEXT: shufps {{.*#+}} xmm1 = xmm1[0,3],xmm2[0,3]
3996 ; SSE2-NEXT: pshuflw {{.*#+}} xmm2 = xmm10[2,3,3,3,4,5,6,7]
3997 ; SSE2-NEXT: movdqa %xmm3, %xmm5
3998 ; SSE2-NEXT: psrld %xmm2, %xmm5
3999 ; SSE2-NEXT: pshuflw {{.*#+}} xmm6 = xmm10[0,1,1,1,4,5,6,7]
4000 ; SSE2-NEXT: movdqa %xmm3, %xmm2
4001 ; SSE2-NEXT: psrld %xmm6, %xmm2
4002 ; SSE2-NEXT: punpcklqdq {{.*#+}} xmm2 = xmm2[0],xmm5[0]
4003 ; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm10[2,3,2,3]
4004 ; SSE2-NEXT: pshuflw {{.*#+}} xmm6 = xmm5[2,3,3,3,4,5,6,7]
4005 ; SSE2-NEXT: movdqa %xmm3, %xmm7
4006 ; SSE2-NEXT: psrld %xmm6, %xmm7
4007 ; SSE2-NEXT: pshuflw {{.*#+}} xmm5 = xmm5[0,1,1,1,4,5,6,7]
4008 ; SSE2-NEXT: psrld %xmm5, %xmm3
4009 ; SSE2-NEXT: punpckhqdq {{.*#+}} xmm3 = xmm3[1],xmm7[1]
4010 ; SSE2-NEXT: shufps {{.*#+}} xmm2 = xmm2[0,3],xmm3[0,3]
4011 ; SSE2-NEXT: pshuflw {{.*#+}} xmm3 = xmm9[2,3,3,3,4,5,6,7]
4012 ; SSE2-NEXT: movdqa %xmm4, %xmm5
4013 ; SSE2-NEXT: psrld %xmm3, %xmm5
4014 ; SSE2-NEXT: pshuflw {{.*#+}} xmm6 = xmm9[0,1,1,1,4,5,6,7]
4015 ; SSE2-NEXT: movdqa %xmm4, %xmm3
4016 ; SSE2-NEXT: psrld %xmm6, %xmm3
4017 ; SSE2-NEXT: punpcklqdq {{.*#+}} xmm3 = xmm3[0],xmm5[0]
4018 ; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm9[2,3,2,3]
4019 ; SSE2-NEXT: pshuflw {{.*#+}} xmm6 = xmm5[2,3,3,3,4,5,6,7]
4020 ; SSE2-NEXT: movdqa %xmm4, %xmm7
4021 ; SSE2-NEXT: psrld %xmm6, %xmm7
4022 ; SSE2-NEXT: pshuflw {{.*#+}} xmm5 = xmm5[0,1,1,1,4,5,6,7]
4023 ; SSE2-NEXT: psrld %xmm5, %xmm4
4024 ; SSE2-NEXT: punpckhqdq {{.*#+}} xmm4 = xmm4[1],xmm7[1]
4025 ; SSE2-NEXT: shufps {{.*#+}} xmm3 = xmm3[0,3],xmm4[0,3]
4028 ; SSE42-LABEL: lshr_v16i32_swap:
4030 ; SSE42-NEXT: pshufd {{.*#+}} xmm8 = xmm0[2,3,2,3]
4031 ; SSE42-NEXT: pmovzxbd {{.*#+}} xmm8 = xmm8[0],zero,zero,zero,xmm8[1],zero,zero,zero,xmm8[2],zero,zero,zero,xmm8[3],zero,zero,zero
4032 ; SSE42-NEXT: pslld $31, %xmm8
4033 ; SSE42-NEXT: psrad $31, %xmm8
4034 ; SSE42-NEXT: pandn %xmm7, %xmm8
4035 ; SSE42-NEXT: pshufd {{.*#+}} xmm7 = xmm0[1,1,1,1]
4036 ; SSE42-NEXT: pmovzxbd {{.*#+}} xmm7 = xmm7[0],zero,zero,zero,xmm7[1],zero,zero,zero,xmm7[2],zero,zero,zero,xmm7[3],zero,zero,zero
4037 ; SSE42-NEXT: pslld $31, %xmm7
4038 ; SSE42-NEXT: psrad $31, %xmm7
4039 ; SSE42-NEXT: pandn %xmm6, %xmm7
4040 ; SSE42-NEXT: pmovzxbd {{.*#+}} xmm6 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero
4041 ; SSE42-NEXT: pslld $31, %xmm6
4042 ; SSE42-NEXT: psrad $31, %xmm6
4043 ; SSE42-NEXT: pandn %xmm5, %xmm6
4044 ; SSE42-NEXT: pshufd {{.*#+}} xmm0 = xmm0[3,3,3,3]
4045 ; SSE42-NEXT: pmovzxbd {{.*#+}} xmm5 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero
4046 ; SSE42-NEXT: pslld $31, %xmm5
4047 ; SSE42-NEXT: psrad $31, %xmm5
4048 ; SSE42-NEXT: pandn {{[0-9]+}}(%rsp), %xmm5
4049 ; SSE42-NEXT: pshuflw {{.*#+}} xmm0 = xmm6[2,3,3,3,4,5,6,7]
4050 ; SSE42-NEXT: movdqa %xmm1, %xmm9
4051 ; SSE42-NEXT: psrld %xmm0, %xmm9
4052 ; SSE42-NEXT: pshufd {{.*#+}} xmm10 = xmm6[2,3,2,3]
4053 ; SSE42-NEXT: pshuflw {{.*#+}} xmm0 = xmm10[2,3,3,3,4,5,6,7]
4054 ; SSE42-NEXT: movdqa %xmm1, %xmm11
4055 ; SSE42-NEXT: psrld %xmm0, %xmm11
4056 ; SSE42-NEXT: pblendw {{.*#+}} xmm11 = xmm9[0,1,2,3],xmm11[4,5,6,7]
4057 ; SSE42-NEXT: pshuflw {{.*#+}} xmm6 = xmm6[0,1,1,1,4,5,6,7]
4058 ; SSE42-NEXT: movdqa %xmm1, %xmm0
4059 ; SSE42-NEXT: psrld %xmm6, %xmm0
4060 ; SSE42-NEXT: pshuflw {{.*#+}} xmm6 = xmm10[0,1,1,1,4,5,6,7]
4061 ; SSE42-NEXT: psrld %xmm6, %xmm1
4062 ; SSE42-NEXT: pblendw {{.*#+}} xmm0 = xmm0[0,1,2,3],xmm1[4,5,6,7]
4063 ; SSE42-NEXT: pblendw {{.*#+}} xmm0 = xmm0[0,1],xmm11[2,3],xmm0[4,5],xmm11[6,7]
4064 ; SSE42-NEXT: pshuflw {{.*#+}} xmm1 = xmm7[2,3,3,3,4,5,6,7]
4065 ; SSE42-NEXT: movdqa %xmm2, %xmm6
4066 ; SSE42-NEXT: psrld %xmm1, %xmm6
4067 ; SSE42-NEXT: pshufd {{.*#+}} xmm9 = xmm7[2,3,2,3]
4068 ; SSE42-NEXT: pshuflw {{.*#+}} xmm1 = xmm9[2,3,3,3,4,5,6,7]
4069 ; SSE42-NEXT: movdqa %xmm2, %xmm10
4070 ; SSE42-NEXT: psrld %xmm1, %xmm10
4071 ; SSE42-NEXT: pblendw {{.*#+}} xmm10 = xmm6[0,1,2,3],xmm10[4,5,6,7]
4072 ; SSE42-NEXT: pshuflw {{.*#+}} xmm6 = xmm7[0,1,1,1,4,5,6,7]
4073 ; SSE42-NEXT: movdqa %xmm2, %xmm1
4074 ; SSE42-NEXT: psrld %xmm6, %xmm1
4075 ; SSE42-NEXT: pshuflw {{.*#+}} xmm6 = xmm9[0,1,1,1,4,5,6,7]
4076 ; SSE42-NEXT: psrld %xmm6, %xmm2
4077 ; SSE42-NEXT: pblendw {{.*#+}} xmm1 = xmm1[0,1,2,3],xmm2[4,5,6,7]
4078 ; SSE42-NEXT: pblendw {{.*#+}} xmm1 = xmm1[0,1],xmm10[2,3],xmm1[4,5],xmm10[6,7]
4079 ; SSE42-NEXT: pshuflw {{.*#+}} xmm2 = xmm8[2,3,3,3,4,5,6,7]
4080 ; SSE42-NEXT: movdqa %xmm3, %xmm6
4081 ; SSE42-NEXT: psrld %xmm2, %xmm6
4082 ; SSE42-NEXT: pshufd {{.*#+}} xmm7 = xmm8[2,3,2,3]
4083 ; SSE42-NEXT: pshuflw {{.*#+}} xmm2 = xmm7[2,3,3,3,4,5,6,7]
4084 ; SSE42-NEXT: movdqa %xmm3, %xmm9
4085 ; SSE42-NEXT: psrld %xmm2, %xmm9
4086 ; SSE42-NEXT: pblendw {{.*#+}} xmm9 = xmm6[0,1,2,3],xmm9[4,5,6,7]
4087 ; SSE42-NEXT: pshuflw {{.*#+}} xmm6 = xmm8[0,1,1,1,4,5,6,7]
4088 ; SSE42-NEXT: movdqa %xmm3, %xmm2
4089 ; SSE42-NEXT: psrld %xmm6, %xmm2
4090 ; SSE42-NEXT: pshuflw {{.*#+}} xmm6 = xmm7[0,1,1,1,4,5,6,7]
4091 ; SSE42-NEXT: psrld %xmm6, %xmm3
4092 ; SSE42-NEXT: pblendw {{.*#+}} xmm2 = xmm2[0,1,2,3],xmm3[4,5,6,7]
4093 ; SSE42-NEXT: pblendw {{.*#+}} xmm2 = xmm2[0,1],xmm9[2,3],xmm2[4,5],xmm9[6,7]
4094 ; SSE42-NEXT: pshuflw {{.*#+}} xmm3 = xmm5[2,3,3,3,4,5,6,7]
4095 ; SSE42-NEXT: movdqa %xmm4, %xmm6
4096 ; SSE42-NEXT: psrld %xmm3, %xmm6
4097 ; SSE42-NEXT: pshufd {{.*#+}} xmm7 = xmm5[2,3,2,3]
4098 ; SSE42-NEXT: pshuflw {{.*#+}} xmm3 = xmm7[2,3,3,3,4,5,6,7]
4099 ; SSE42-NEXT: movdqa %xmm4, %xmm8
4100 ; SSE42-NEXT: psrld %xmm3, %xmm8
4101 ; SSE42-NEXT: pblendw {{.*#+}} xmm8 = xmm6[0,1,2,3],xmm8[4,5,6,7]
4102 ; SSE42-NEXT: pshuflw {{.*#+}} xmm5 = xmm5[0,1,1,1,4,5,6,7]
4103 ; SSE42-NEXT: movdqa %xmm4, %xmm3
4104 ; SSE42-NEXT: psrld %xmm5, %xmm3
4105 ; SSE42-NEXT: pshuflw {{.*#+}} xmm5 = xmm7[0,1,1,1,4,5,6,7]
4106 ; SSE42-NEXT: psrld %xmm5, %xmm4
4107 ; SSE42-NEXT: pblendw {{.*#+}} xmm3 = xmm3[0,1,2,3],xmm4[4,5,6,7]
4108 ; SSE42-NEXT: pblendw {{.*#+}} xmm3 = xmm3[0,1],xmm8[2,3],xmm3[4,5],xmm8[6,7]
4111 ; AVX2-LABEL: lshr_v16i32_swap:
4113 ; AVX2-NEXT: vpunpckhbw {{.*#+}} xmm5 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]
4114 ; AVX2-NEXT: vpmovzxwd {{.*#+}} ymm5 = xmm5[0],zero,xmm5[1],zero,xmm5[2],zero,xmm5[3],zero,xmm5[4],zero,xmm5[5],zero,xmm5[6],zero,xmm5[7],zero
4115 ; AVX2-NEXT: vpslld $31, %ymm5, %ymm5
4116 ; AVX2-NEXT: vpsrad $31, %ymm5, %ymm5
4117 ; AVX2-NEXT: vpandn %ymm4, %ymm5, %ymm4
4118 ; AVX2-NEXT: vpmovzxbd {{.*#+}} ymm0 = 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
4119 ; AVX2-NEXT: vpslld $31, %ymm0, %ymm0
4120 ; AVX2-NEXT: vpsrad $31, %ymm0, %ymm0
4121 ; AVX2-NEXT: vpandn %ymm3, %ymm0, %ymm0
4122 ; AVX2-NEXT: vpsrlvd %ymm0, %ymm1, %ymm0
4123 ; AVX2-NEXT: vpsrlvd %ymm4, %ymm2, %ymm1
4126 ; AVX512-LABEL: lshr_v16i32_swap:
4128 ; AVX512-NEXT: vpmovsxbd %xmm0, %zmm0
4129 ; AVX512-NEXT: vpslld $31, %zmm0, %zmm0
4130 ; AVX512-NEXT: vptestnmd %zmm0, %zmm0, %k1
4131 ; AVX512-NEXT: vpsrlvd %zmm2, %zmm1, %zmm1 {%k1}
4132 ; AVX512-NEXT: vmovdqa64 %zmm1, %zmm0
4134 %s = select <16 x i1> %b, <16 x i32> zeroinitializer, <16 x i32> %y
4135 %r = lshr <16 x i32> %x, %s
4139 ; negative test - lshr is not commutative; there is no identity constant for operand 0
4141 define <16 x i32> @lshr_v16i32_commute_swap(<16 x i1> %b, <16 x i32> noundef %x, <16 x i32> noundef %y) {
4142 ; SSE2-LABEL: lshr_v16i32_commute_swap:
4144 ; SSE2-NEXT: movdqa %xmm3, %xmm8
4145 ; SSE2-NEXT: movdqa %xmm2, %xmm9
4146 ; SSE2-NEXT: movdqa %xmm1, %xmm10
4147 ; SSE2-NEXT: movdqa %xmm0, %xmm2
4148 ; SSE2-NEXT: punpckhbw {{.*#+}} xmm2 = xmm2[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]
4149 ; SSE2-NEXT: movdqa %xmm2, %xmm3
4150 ; SSE2-NEXT: punpckhwd {{.*#+}} xmm3 = xmm3[4,4,5,5,6,6,7,7]
4151 ; SSE2-NEXT: pslld $31, %xmm3
4152 ; SSE2-NEXT: psrad $31, %xmm3
4153 ; SSE2-NEXT: pandn {{[0-9]+}}(%rsp), %xmm3
4154 ; SSE2-NEXT: punpcklwd {{.*#+}} xmm2 = xmm2[0,0,1,1,2,2,3,3]
4155 ; SSE2-NEXT: pslld $31, %xmm2
4156 ; SSE2-NEXT: psrad $31, %xmm2
4157 ; SSE2-NEXT: pandn %xmm7, %xmm2
4158 ; SSE2-NEXT: punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
4159 ; SSE2-NEXT: movdqa %xmm0, %xmm1
4160 ; SSE2-NEXT: punpckhwd {{.*#+}} xmm1 = xmm1[4,4,5,5,6,6,7,7]
4161 ; SSE2-NEXT: pslld $31, %xmm1
4162 ; SSE2-NEXT: psrad $31, %xmm1
4163 ; SSE2-NEXT: pandn %xmm6, %xmm1
4164 ; SSE2-NEXT: punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]
4165 ; SSE2-NEXT: pslld $31, %xmm0
4166 ; SSE2-NEXT: psrad $31, %xmm0
4167 ; SSE2-NEXT: pandn %xmm5, %xmm0
4168 ; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm10[2,3,2,3]
4169 ; SSE2-NEXT: pshuflw {{.*#+}} xmm6 = xmm5[2,3,3,3,4,5,6,7]
4170 ; SSE2-NEXT: movdqa %xmm0, %xmm7
4171 ; SSE2-NEXT: psrld %xmm6, %xmm7
4172 ; SSE2-NEXT: pshuflw {{.*#+}} xmm5 = xmm5[0,1,1,1,4,5,6,7]
4173 ; SSE2-NEXT: movdqa %xmm0, %xmm6
4174 ; SSE2-NEXT: psrld %xmm5, %xmm6
4175 ; SSE2-NEXT: punpckhqdq {{.*#+}} xmm6 = xmm6[1],xmm7[1]
4176 ; SSE2-NEXT: pshuflw {{.*#+}} xmm5 = xmm10[2,3,3,3,4,5,6,7]
4177 ; SSE2-NEXT: movdqa %xmm0, %xmm7
4178 ; SSE2-NEXT: psrld %xmm5, %xmm7
4179 ; SSE2-NEXT: pshuflw {{.*#+}} xmm5 = xmm10[0,1,1,1,4,5,6,7]
4180 ; SSE2-NEXT: psrld %xmm5, %xmm0
4181 ; SSE2-NEXT: punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm7[0]
4182 ; SSE2-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,3],xmm6[0,3]
4183 ; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm9[2,3,2,3]
4184 ; SSE2-NEXT: pshuflw {{.*#+}} xmm6 = xmm5[2,3,3,3,4,5,6,7]
4185 ; SSE2-NEXT: movdqa %xmm1, %xmm7
4186 ; SSE2-NEXT: psrld %xmm6, %xmm7
4187 ; SSE2-NEXT: pshuflw {{.*#+}} xmm5 = xmm5[0,1,1,1,4,5,6,7]
4188 ; SSE2-NEXT: movdqa %xmm1, %xmm6
4189 ; SSE2-NEXT: psrld %xmm5, %xmm6
4190 ; SSE2-NEXT: punpckhqdq {{.*#+}} xmm6 = xmm6[1],xmm7[1]
4191 ; SSE2-NEXT: pshuflw {{.*#+}} xmm5 = xmm9[2,3,3,3,4,5,6,7]
4192 ; SSE2-NEXT: movdqa %xmm1, %xmm7
4193 ; SSE2-NEXT: psrld %xmm5, %xmm7
4194 ; SSE2-NEXT: pshuflw {{.*#+}} xmm5 = xmm9[0,1,1,1,4,5,6,7]
4195 ; SSE2-NEXT: psrld %xmm5, %xmm1
4196 ; SSE2-NEXT: punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm7[0]
4197 ; SSE2-NEXT: shufps {{.*#+}} xmm1 = xmm1[0,3],xmm6[0,3]
4198 ; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm8[2,3,2,3]
4199 ; SSE2-NEXT: pshuflw {{.*#+}} xmm6 = xmm5[2,3,3,3,4,5,6,7]
4200 ; SSE2-NEXT: movdqa %xmm2, %xmm7
4201 ; SSE2-NEXT: psrld %xmm6, %xmm7
4202 ; SSE2-NEXT: pshuflw {{.*#+}} xmm5 = xmm5[0,1,1,1,4,5,6,7]
4203 ; SSE2-NEXT: movdqa %xmm2, %xmm6
4204 ; SSE2-NEXT: psrld %xmm5, %xmm6
4205 ; SSE2-NEXT: punpckhqdq {{.*#+}} xmm6 = xmm6[1],xmm7[1]
4206 ; SSE2-NEXT: pshuflw {{.*#+}} xmm5 = xmm8[2,3,3,3,4,5,6,7]
4207 ; SSE2-NEXT: movdqa %xmm2, %xmm7
4208 ; SSE2-NEXT: psrld %xmm5, %xmm7
4209 ; SSE2-NEXT: pshuflw {{.*#+}} xmm5 = xmm8[0,1,1,1,4,5,6,7]
4210 ; SSE2-NEXT: psrld %xmm5, %xmm2
4211 ; SSE2-NEXT: punpcklqdq {{.*#+}} xmm2 = xmm2[0],xmm7[0]
4212 ; SSE2-NEXT: shufps {{.*#+}} xmm2 = xmm2[0,3],xmm6[0,3]
4213 ; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm4[2,3,2,3]
4214 ; SSE2-NEXT: pshuflw {{.*#+}} xmm6 = xmm5[2,3,3,3,4,5,6,7]
4215 ; SSE2-NEXT: movdqa %xmm3, %xmm7
4216 ; SSE2-NEXT: psrld %xmm6, %xmm7
4217 ; SSE2-NEXT: pshuflw {{.*#+}} xmm5 = xmm5[0,1,1,1,4,5,6,7]
4218 ; SSE2-NEXT: movdqa %xmm3, %xmm6
4219 ; SSE2-NEXT: psrld %xmm5, %xmm6
4220 ; SSE2-NEXT: punpckhqdq {{.*#+}} xmm6 = xmm6[1],xmm7[1]
4221 ; SSE2-NEXT: pshuflw {{.*#+}} xmm5 = xmm4[2,3,3,3,4,5,6,7]
4222 ; SSE2-NEXT: movdqa %xmm3, %xmm7
4223 ; SSE2-NEXT: psrld %xmm5, %xmm7
4224 ; SSE2-NEXT: pshuflw {{.*#+}} xmm4 = xmm4[0,1,1,1,4,5,6,7]
4225 ; SSE2-NEXT: psrld %xmm4, %xmm3
4226 ; SSE2-NEXT: punpcklqdq {{.*#+}} xmm3 = xmm3[0],xmm7[0]
4227 ; SSE2-NEXT: shufps {{.*#+}} xmm3 = xmm3[0,3],xmm6[0,3]
4230 ; SSE42-LABEL: lshr_v16i32_commute_swap:
4232 ; SSE42-NEXT: movdqa %xmm3, %xmm10
4233 ; SSE42-NEXT: movdqa %xmm2, %xmm9
4234 ; SSE42-NEXT: movdqa %xmm1, %xmm8
4235 ; SSE42-NEXT: movdqa %xmm0, %xmm3
4236 ; SSE42-NEXT: pshufd {{.*#+}} xmm0 = xmm0[2,3,2,3]
4237 ; SSE42-NEXT: pmovzxbd {{.*#+}} xmm2 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero
4238 ; SSE42-NEXT: pslld $31, %xmm2
4239 ; SSE42-NEXT: psrad $31, %xmm2
4240 ; SSE42-NEXT: pandn %xmm7, %xmm2
4241 ; SSE42-NEXT: pshufd {{.*#+}} xmm0 = xmm3[1,1,1,1]
4242 ; SSE42-NEXT: pmovzxbd {{.*#+}} xmm1 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero
4243 ; SSE42-NEXT: pslld $31, %xmm1
4244 ; SSE42-NEXT: psrad $31, %xmm1
4245 ; SSE42-NEXT: pandn %xmm6, %xmm1
4246 ; SSE42-NEXT: pmovzxbd {{.*#+}} xmm0 = xmm3[0],zero,zero,zero,xmm3[1],zero,zero,zero,xmm3[2],zero,zero,zero,xmm3[3],zero,zero,zero
4247 ; SSE42-NEXT: pslld $31, %xmm0
4248 ; SSE42-NEXT: psrad $31, %xmm0
4249 ; SSE42-NEXT: pandn %xmm5, %xmm0
4250 ; SSE42-NEXT: pshufd {{.*#+}} xmm3 = xmm3[3,3,3,3]
4251 ; SSE42-NEXT: pmovzxbd {{.*#+}} xmm3 = xmm3[0],zero,zero,zero,xmm3[1],zero,zero,zero,xmm3[2],zero,zero,zero,xmm3[3],zero,zero,zero
4252 ; SSE42-NEXT: pslld $31, %xmm3
4253 ; SSE42-NEXT: psrad $31, %xmm3
4254 ; SSE42-NEXT: pandn {{[0-9]+}}(%rsp), %xmm3
4255 ; SSE42-NEXT: pshufd {{.*#+}} xmm5 = xmm8[2,3,2,3]
4256 ; SSE42-NEXT: pshuflw {{.*#+}} xmm6 = xmm5[2,3,3,3,4,5,6,7]
4257 ; SSE42-NEXT: movdqa %xmm0, %xmm7
4258 ; SSE42-NEXT: psrld %xmm6, %xmm7
4259 ; SSE42-NEXT: pshuflw {{.*#+}} xmm6 = xmm8[2,3,3,3,4,5,6,7]
4260 ; SSE42-NEXT: movdqa %xmm0, %xmm11
4261 ; SSE42-NEXT: psrld %xmm6, %xmm11
4262 ; SSE42-NEXT: pblendw {{.*#+}} xmm11 = xmm11[0,1,2,3],xmm7[4,5,6,7]
4263 ; SSE42-NEXT: pshuflw {{.*#+}} xmm5 = xmm5[0,1,1,1,4,5,6,7]
4264 ; SSE42-NEXT: movdqa %xmm0, %xmm6
4265 ; SSE42-NEXT: psrld %xmm5, %xmm6
4266 ; SSE42-NEXT: pshuflw {{.*#+}} xmm5 = xmm8[0,1,1,1,4,5,6,7]
4267 ; SSE42-NEXT: psrld %xmm5, %xmm0
4268 ; SSE42-NEXT: pblendw {{.*#+}} xmm0 = xmm0[0,1,2,3],xmm6[4,5,6,7]
4269 ; SSE42-NEXT: pblendw {{.*#+}} xmm0 = xmm0[0,1],xmm11[2,3],xmm0[4,5],xmm11[6,7]
4270 ; SSE42-NEXT: pshufd {{.*#+}} xmm5 = xmm9[2,3,2,3]
4271 ; SSE42-NEXT: pshuflw {{.*#+}} xmm6 = xmm5[2,3,3,3,4,5,6,7]
4272 ; SSE42-NEXT: movdqa %xmm1, %xmm7
4273 ; SSE42-NEXT: psrld %xmm6, %xmm7
4274 ; SSE42-NEXT: pshuflw {{.*#+}} xmm6 = xmm9[2,3,3,3,4,5,6,7]
4275 ; SSE42-NEXT: movdqa %xmm1, %xmm8
4276 ; SSE42-NEXT: psrld %xmm6, %xmm8
4277 ; SSE42-NEXT: pblendw {{.*#+}} xmm8 = xmm8[0,1,2,3],xmm7[4,5,6,7]
4278 ; SSE42-NEXT: pshuflw {{.*#+}} xmm5 = xmm5[0,1,1,1,4,5,6,7]
4279 ; SSE42-NEXT: movdqa %xmm1, %xmm6
4280 ; SSE42-NEXT: psrld %xmm5, %xmm6
4281 ; SSE42-NEXT: pshuflw {{.*#+}} xmm5 = xmm9[0,1,1,1,4,5,6,7]
4282 ; SSE42-NEXT: psrld %xmm5, %xmm1
4283 ; SSE42-NEXT: pblendw {{.*#+}} xmm1 = xmm1[0,1,2,3],xmm6[4,5,6,7]
4284 ; SSE42-NEXT: pblendw {{.*#+}} xmm1 = xmm1[0,1],xmm8[2,3],xmm1[4,5],xmm8[6,7]
4285 ; SSE42-NEXT: pshufd {{.*#+}} xmm5 = xmm10[2,3,2,3]
4286 ; SSE42-NEXT: pshuflw {{.*#+}} xmm6 = xmm5[2,3,3,3,4,5,6,7]
4287 ; SSE42-NEXT: movdqa %xmm2, %xmm7
4288 ; SSE42-NEXT: psrld %xmm6, %xmm7
4289 ; SSE42-NEXT: pshuflw {{.*#+}} xmm6 = xmm10[2,3,3,3,4,5,6,7]
4290 ; SSE42-NEXT: movdqa %xmm2, %xmm8
4291 ; SSE42-NEXT: psrld %xmm6, %xmm8
4292 ; SSE42-NEXT: pblendw {{.*#+}} xmm8 = xmm8[0,1,2,3],xmm7[4,5,6,7]
4293 ; SSE42-NEXT: pshuflw {{.*#+}} xmm5 = xmm5[0,1,1,1,4,5,6,7]
4294 ; SSE42-NEXT: movdqa %xmm2, %xmm6
4295 ; SSE42-NEXT: psrld %xmm5, %xmm6
4296 ; SSE42-NEXT: pshuflw {{.*#+}} xmm5 = xmm10[0,1,1,1,4,5,6,7]
4297 ; SSE42-NEXT: psrld %xmm5, %xmm2
4298 ; SSE42-NEXT: pblendw {{.*#+}} xmm2 = xmm2[0,1,2,3],xmm6[4,5,6,7]
4299 ; SSE42-NEXT: pblendw {{.*#+}} xmm2 = xmm2[0,1],xmm8[2,3],xmm2[4,5],xmm8[6,7]
4300 ; SSE42-NEXT: pshufd {{.*#+}} xmm5 = xmm4[2,3,2,3]
4301 ; SSE42-NEXT: pshuflw {{.*#+}} xmm6 = xmm5[2,3,3,3,4,5,6,7]
4302 ; SSE42-NEXT: movdqa %xmm3, %xmm7
4303 ; SSE42-NEXT: psrld %xmm6, %xmm7
4304 ; SSE42-NEXT: pshuflw {{.*#+}} xmm6 = xmm4[2,3,3,3,4,5,6,7]
4305 ; SSE42-NEXT: movdqa %xmm3, %xmm8
4306 ; SSE42-NEXT: psrld %xmm6, %xmm8
4307 ; SSE42-NEXT: pblendw {{.*#+}} xmm8 = xmm8[0,1,2,3],xmm7[4,5,6,7]
4308 ; SSE42-NEXT: pshuflw {{.*#+}} xmm5 = xmm5[0,1,1,1,4,5,6,7]
4309 ; SSE42-NEXT: movdqa %xmm3, %xmm6
4310 ; SSE42-NEXT: psrld %xmm5, %xmm6
4311 ; SSE42-NEXT: pshuflw {{.*#+}} xmm4 = xmm4[0,1,1,1,4,5,6,7]
4312 ; SSE42-NEXT: psrld %xmm4, %xmm3
4313 ; SSE42-NEXT: pblendw {{.*#+}} xmm3 = xmm3[0,1,2,3],xmm6[4,5,6,7]
4314 ; SSE42-NEXT: pblendw {{.*#+}} xmm3 = xmm3[0,1],xmm8[2,3],xmm3[4,5],xmm8[6,7]
4317 ; AVX2-LABEL: lshr_v16i32_commute_swap:
4319 ; AVX2-NEXT: vpunpckhbw {{.*#+}} xmm5 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]
4320 ; AVX2-NEXT: vpmovzxwd {{.*#+}} ymm5 = xmm5[0],zero,xmm5[1],zero,xmm5[2],zero,xmm5[3],zero,xmm5[4],zero,xmm5[5],zero,xmm5[6],zero,xmm5[7],zero
4321 ; AVX2-NEXT: vpslld $31, %ymm5, %ymm5
4322 ; AVX2-NEXT: vpsrad $31, %ymm5, %ymm5
4323 ; AVX2-NEXT: vpandn %ymm4, %ymm5, %ymm4
4324 ; AVX2-NEXT: vpmovzxbd {{.*#+}} ymm0 = 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
4325 ; AVX2-NEXT: vpslld $31, %ymm0, %ymm0
4326 ; AVX2-NEXT: vpsrad $31, %ymm0, %ymm0
4327 ; AVX2-NEXT: vpandn %ymm3, %ymm0, %ymm0
4328 ; AVX2-NEXT: vpsrlvd %ymm1, %ymm0, %ymm0
4329 ; AVX2-NEXT: vpsrlvd %ymm2, %ymm4, %ymm1
4332 ; AVX512-LABEL: lshr_v16i32_commute_swap:
4334 ; AVX512-NEXT: vpmovsxbd %xmm0, %zmm0
4335 ; AVX512-NEXT: vpslld $31, %zmm0, %zmm0
4336 ; AVX512-NEXT: vptestnmd %zmm0, %zmm0, %k1
4337 ; AVX512-NEXT: vmovdqa32 %zmm2, %zmm0 {%k1} {z}
4338 ; AVX512-NEXT: vpsrlvd %zmm1, %zmm0, %zmm0
4340 %s = select <16 x i1> %b, <16 x i32> zeroinitializer, <16 x i32> %y
4341 %r = lshr <16 x i32> %s, %x
4345 define <8 x i32> @lshr_v8i32_cast_cond(i8 noundef zeroext %pb, <8 x i32> noundef %x, <8 x i32> noundef %y) {
4346 ; SSE2-LABEL: lshr_v8i32_cast_cond:
4348 ; SSE2-NEXT: movd %edi, %xmm4
4349 ; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm4[0,0,0,0]
4350 ; SSE2-NEXT: movdqa {{.*#+}} xmm6 = [16,32,64,128]
4351 ; SSE2-NEXT: movdqa %xmm5, %xmm4
4352 ; SSE2-NEXT: pand %xmm6, %xmm4
4353 ; SSE2-NEXT: pcmpeqd %xmm6, %xmm4
4354 ; SSE2-NEXT: pand %xmm3, %xmm4
4355 ; SSE2-NEXT: movdqa {{.*#+}} xmm3 = [1,2,4,8]
4356 ; SSE2-NEXT: pand %xmm3, %xmm5
4357 ; SSE2-NEXT: pcmpeqd %xmm3, %xmm5
4358 ; SSE2-NEXT: pand %xmm2, %xmm5
4359 ; SSE2-NEXT: pshuflw {{.*#+}} xmm2 = xmm5[2,3,3,3,4,5,6,7]
4360 ; SSE2-NEXT: movdqa %xmm0, %xmm3
4361 ; SSE2-NEXT: psrld %xmm2, %xmm3
4362 ; SSE2-NEXT: pshuflw {{.*#+}} xmm6 = xmm5[0,1,1,1,4,5,6,7]
4363 ; SSE2-NEXT: movdqa %xmm0, %xmm2
4364 ; SSE2-NEXT: psrld %xmm6, %xmm2
4365 ; SSE2-NEXT: punpcklqdq {{.*#+}} xmm2 = xmm2[0],xmm3[0]
4366 ; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm5[2,3,2,3]
4367 ; SSE2-NEXT: pshuflw {{.*#+}} xmm5 = xmm3[2,3,3,3,4,5,6,7]
4368 ; SSE2-NEXT: movdqa %xmm0, %xmm6
4369 ; SSE2-NEXT: psrld %xmm5, %xmm6
4370 ; SSE2-NEXT: pshuflw {{.*#+}} xmm3 = xmm3[0,1,1,1,4,5,6,7]
4371 ; SSE2-NEXT: psrld %xmm3, %xmm0
4372 ; SSE2-NEXT: punpckhqdq {{.*#+}} xmm0 = xmm0[1],xmm6[1]
4373 ; SSE2-NEXT: shufps {{.*#+}} xmm2 = xmm2[0,3],xmm0[0,3]
4374 ; SSE2-NEXT: pshuflw {{.*#+}} xmm0 = xmm4[2,3,3,3,4,5,6,7]
4375 ; SSE2-NEXT: movdqa %xmm1, %xmm5
4376 ; SSE2-NEXT: psrld %xmm0, %xmm5
4377 ; SSE2-NEXT: pshuflw {{.*#+}} xmm0 = xmm4[0,1,1,1,4,5,6,7]
4378 ; SSE2-NEXT: movdqa %xmm1, %xmm3
4379 ; SSE2-NEXT: psrld %xmm0, %xmm3
4380 ; SSE2-NEXT: punpcklqdq {{.*#+}} xmm3 = xmm3[0],xmm5[0]
4381 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm4[2,3,2,3]
4382 ; SSE2-NEXT: pshuflw {{.*#+}} xmm4 = xmm0[2,3,3,3,4,5,6,7]
4383 ; SSE2-NEXT: movdqa %xmm1, %xmm5
4384 ; SSE2-NEXT: psrld %xmm4, %xmm5
4385 ; SSE2-NEXT: pshuflw {{.*#+}} xmm0 = xmm0[0,1,1,1,4,5,6,7]
4386 ; SSE2-NEXT: psrld %xmm0, %xmm1
4387 ; SSE2-NEXT: punpckhqdq {{.*#+}} xmm1 = xmm1[1],xmm5[1]
4388 ; SSE2-NEXT: shufps {{.*#+}} xmm3 = xmm3[0,3],xmm1[0,3]
4389 ; SSE2-NEXT: movaps %xmm2, %xmm0
4390 ; SSE2-NEXT: movaps %xmm3, %xmm1
4393 ; SSE42-LABEL: lshr_v8i32_cast_cond:
4395 ; SSE42-NEXT: movd %edi, %xmm4
4396 ; SSE42-NEXT: pshufd {{.*#+}} xmm5 = xmm4[0,0,0,0]
4397 ; SSE42-NEXT: movdqa {{.*#+}} xmm6 = [16,32,64,128]
4398 ; SSE42-NEXT: movdqa %xmm5, %xmm4
4399 ; SSE42-NEXT: pand %xmm6, %xmm4
4400 ; SSE42-NEXT: pcmpeqd %xmm6, %xmm4
4401 ; SSE42-NEXT: pand %xmm3, %xmm4
4402 ; SSE42-NEXT: movdqa {{.*#+}} xmm3 = [1,2,4,8]
4403 ; SSE42-NEXT: pand %xmm3, %xmm5
4404 ; SSE42-NEXT: pcmpeqd %xmm3, %xmm5
4405 ; SSE42-NEXT: pand %xmm2, %xmm5
4406 ; SSE42-NEXT: pshuflw {{.*#+}} xmm2 = xmm5[2,3,3,3,4,5,6,7]
4407 ; SSE42-NEXT: movdqa %xmm0, %xmm3
4408 ; SSE42-NEXT: psrld %xmm2, %xmm3
4409 ; SSE42-NEXT: pshufd {{.*#+}} xmm2 = xmm5[2,3,2,3]
4410 ; SSE42-NEXT: pshuflw {{.*#+}} xmm6 = xmm2[2,3,3,3,4,5,6,7]
4411 ; SSE42-NEXT: movdqa %xmm0, %xmm7
4412 ; SSE42-NEXT: psrld %xmm6, %xmm7
4413 ; SSE42-NEXT: pblendw {{.*#+}} xmm7 = xmm3[0,1,2,3],xmm7[4,5,6,7]
4414 ; SSE42-NEXT: pshuflw {{.*#+}} xmm3 = xmm5[0,1,1,1,4,5,6,7]
4415 ; SSE42-NEXT: movdqa %xmm0, %xmm5
4416 ; SSE42-NEXT: psrld %xmm3, %xmm5
4417 ; SSE42-NEXT: pshuflw {{.*#+}} xmm2 = xmm2[0,1,1,1,4,5,6,7]
4418 ; SSE42-NEXT: psrld %xmm2, %xmm0
4419 ; SSE42-NEXT: pblendw {{.*#+}} xmm0 = xmm5[0,1,2,3],xmm0[4,5,6,7]
4420 ; SSE42-NEXT: pblendw {{.*#+}} xmm0 = xmm0[0,1],xmm7[2,3],xmm0[4,5],xmm7[6,7]
4421 ; SSE42-NEXT: pshuflw {{.*#+}} xmm2 = xmm4[2,3,3,3,4,5,6,7]
4422 ; SSE42-NEXT: movdqa %xmm1, %xmm3
4423 ; SSE42-NEXT: psrld %xmm2, %xmm3
4424 ; SSE42-NEXT: pshufd {{.*#+}} xmm2 = xmm4[2,3,2,3]
4425 ; SSE42-NEXT: pshuflw {{.*#+}} xmm5 = xmm2[2,3,3,3,4,5,6,7]
4426 ; SSE42-NEXT: movdqa %xmm1, %xmm6
4427 ; SSE42-NEXT: psrld %xmm5, %xmm6
4428 ; SSE42-NEXT: pblendw {{.*#+}} xmm6 = xmm3[0,1,2,3],xmm6[4,5,6,7]
4429 ; SSE42-NEXT: pshuflw {{.*#+}} xmm3 = xmm4[0,1,1,1,4,5,6,7]
4430 ; SSE42-NEXT: movdqa %xmm1, %xmm4
4431 ; SSE42-NEXT: psrld %xmm3, %xmm4
4432 ; SSE42-NEXT: pshuflw {{.*#+}} xmm2 = xmm2[0,1,1,1,4,5,6,7]
4433 ; SSE42-NEXT: psrld %xmm2, %xmm1
4434 ; SSE42-NEXT: pblendw {{.*#+}} xmm1 = xmm4[0,1,2,3],xmm1[4,5,6,7]
4435 ; SSE42-NEXT: pblendw {{.*#+}} xmm1 = xmm1[0,1],xmm6[2,3],xmm1[4,5],xmm6[6,7]
4438 ; AVX2-LABEL: lshr_v8i32_cast_cond:
4440 ; AVX2-NEXT: vmovd %edi, %xmm2
4441 ; AVX2-NEXT: vpbroadcastb %xmm2, %ymm2
4442 ; AVX2-NEXT: vmovdqa {{.*#+}} ymm3 = [1,2,4,8,16,32,64,128]
4443 ; AVX2-NEXT: vpand %ymm3, %ymm2, %ymm2
4444 ; AVX2-NEXT: vpcmpeqd %ymm3, %ymm2, %ymm2
4445 ; AVX2-NEXT: vpand %ymm1, %ymm2, %ymm1
4446 ; AVX2-NEXT: vpsrlvd %ymm1, %ymm0, %ymm0
4449 ; AVX512F-LABEL: lshr_v8i32_cast_cond:
4451 ; AVX512F-NEXT: # kill: def $ymm1 killed $ymm1 def $zmm1
4452 ; AVX512F-NEXT: kmovw %edi, %k1
4453 ; AVX512F-NEXT: vmovdqa32 %zmm1, %zmm1 {%k1} {z}
4454 ; AVX512F-NEXT: vpsrlvd %ymm1, %ymm0, %ymm0
4455 ; AVX512F-NEXT: retq
4457 ; AVX512VL-LABEL: lshr_v8i32_cast_cond:
4458 ; AVX512VL: # %bb.0:
4459 ; AVX512VL-NEXT: kmovw %edi, %k1
4460 ; AVX512VL-NEXT: vpsrlvd %ymm1, %ymm0, %ymm0 {%k1}
4461 ; AVX512VL-NEXT: retq
4462 %b = bitcast i8 %pb to <8 x i1>
4463 %s = select <8 x i1> %b, <8 x i32> %y, <8 x i32> zeroinitializer
4464 %r = lshr <8 x i32> %x, %s
4468 define <8 x i64> @lshr_v8i64_cast_cond(i8 noundef zeroext %pb, <8 x i64> noundef %x, <8 x i64> noundef %y) {
4469 ; SSE2-LABEL: lshr_v8i64_cast_cond:
4471 ; SSE2-NEXT: movd %edi, %xmm8
4472 ; SSE2-NEXT: pshufd {{.*#+}} xmm9 = xmm8[0,1,0,1]
4473 ; SSE2-NEXT: movdqa {{.*#+}} xmm10 = [64,128]
4474 ; SSE2-NEXT: movdqa %xmm9, %xmm8
4475 ; SSE2-NEXT: pand %xmm10, %xmm8
4476 ; SSE2-NEXT: pcmpeqd %xmm10, %xmm8
4477 ; SSE2-NEXT: pshufd {{.*#+}} xmm10 = xmm8[1,0,3,2]
4478 ; SSE2-NEXT: pand %xmm7, %xmm8
4479 ; SSE2-NEXT: pand %xmm10, %xmm8
4480 ; SSE2-NEXT: movdqa {{.*#+}} xmm10 = [16,32]
4481 ; SSE2-NEXT: movdqa %xmm9, %xmm7
4482 ; SSE2-NEXT: pand %xmm10, %xmm7
4483 ; SSE2-NEXT: pcmpeqd %xmm10, %xmm7
4484 ; SSE2-NEXT: pshufd {{.*#+}} xmm10 = xmm7[1,0,3,2]
4485 ; SSE2-NEXT: pand %xmm6, %xmm7
4486 ; SSE2-NEXT: pand %xmm10, %xmm7
4487 ; SSE2-NEXT: movdqa {{.*#+}} xmm6 = [4,8]
4488 ; SSE2-NEXT: movdqa %xmm9, %xmm10
4489 ; SSE2-NEXT: pand %xmm6, %xmm10
4490 ; SSE2-NEXT: pcmpeqd %xmm6, %xmm10
4491 ; SSE2-NEXT: pshufd {{.*#+}} xmm6 = xmm10[1,0,3,2]
4492 ; SSE2-NEXT: pand %xmm5, %xmm10
4493 ; SSE2-NEXT: pand %xmm6, %xmm10
4494 ; SSE2-NEXT: movdqa {{.*#+}} xmm5 = [1,2]
4495 ; SSE2-NEXT: pand %xmm5, %xmm9
4496 ; SSE2-NEXT: pcmpeqd %xmm5, %xmm9
4497 ; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm9[1,0,3,2]
4498 ; SSE2-NEXT: pand %xmm4, %xmm9
4499 ; SSE2-NEXT: pand %xmm5, %xmm9
4500 ; SSE2-NEXT: movdqa %xmm0, %xmm4
4501 ; SSE2-NEXT: psrlq %xmm9, %xmm4
4502 ; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm9[2,3,2,3]
4503 ; SSE2-NEXT: psrlq %xmm5, %xmm0
4504 ; SSE2-NEXT: movsd {{.*#+}} xmm0 = xmm4[0],xmm0[1]
4505 ; SSE2-NEXT: movdqa %xmm1, %xmm4
4506 ; SSE2-NEXT: psrlq %xmm10, %xmm4
4507 ; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm10[2,3,2,3]
4508 ; SSE2-NEXT: psrlq %xmm5, %xmm1
4509 ; SSE2-NEXT: movsd {{.*#+}} xmm1 = xmm4[0],xmm1[1]
4510 ; SSE2-NEXT: movdqa %xmm2, %xmm4
4511 ; SSE2-NEXT: psrlq %xmm7, %xmm4
4512 ; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm7[2,3,2,3]
4513 ; SSE2-NEXT: psrlq %xmm5, %xmm2
4514 ; SSE2-NEXT: movsd {{.*#+}} xmm2 = xmm4[0],xmm2[1]
4515 ; SSE2-NEXT: movdqa %xmm3, %xmm4
4516 ; SSE2-NEXT: psrlq %xmm8, %xmm4
4517 ; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm8[2,3,2,3]
4518 ; SSE2-NEXT: psrlq %xmm5, %xmm3
4519 ; SSE2-NEXT: movsd {{.*#+}} xmm3 = xmm4[0],xmm3[1]
4522 ; SSE42-LABEL: lshr_v8i64_cast_cond:
4524 ; SSE42-NEXT: movd %edi, %xmm8
4525 ; SSE42-NEXT: pshufd {{.*#+}} xmm9 = xmm8[0,1,0,1]
4526 ; SSE42-NEXT: movdqa {{.*#+}} xmm10 = [64,128]
4527 ; SSE42-NEXT: movdqa %xmm9, %xmm8
4528 ; SSE42-NEXT: pand %xmm10, %xmm8
4529 ; SSE42-NEXT: pcmpeqq %xmm10, %xmm8
4530 ; SSE42-NEXT: pand %xmm7, %xmm8
4531 ; SSE42-NEXT: movdqa {{.*#+}} xmm10 = [16,32]
4532 ; SSE42-NEXT: movdqa %xmm9, %xmm7
4533 ; SSE42-NEXT: pand %xmm10, %xmm7
4534 ; SSE42-NEXT: pcmpeqq %xmm10, %xmm7
4535 ; SSE42-NEXT: pand %xmm6, %xmm7
4536 ; SSE42-NEXT: movdqa {{.*#+}} xmm6 = [4,8]
4537 ; SSE42-NEXT: movdqa %xmm9, %xmm10
4538 ; SSE42-NEXT: pand %xmm6, %xmm10
4539 ; SSE42-NEXT: pcmpeqq %xmm6, %xmm10
4540 ; SSE42-NEXT: pand %xmm5, %xmm10
4541 ; SSE42-NEXT: movdqa {{.*#+}} xmm5 = [1,2]
4542 ; SSE42-NEXT: pand %xmm5, %xmm9
4543 ; SSE42-NEXT: pcmpeqq %xmm5, %xmm9
4544 ; SSE42-NEXT: pand %xmm4, %xmm9
4545 ; SSE42-NEXT: movdqa %xmm0, %xmm4
4546 ; SSE42-NEXT: psrlq %xmm9, %xmm4
4547 ; SSE42-NEXT: pshufd {{.*#+}} xmm5 = xmm9[2,3,2,3]
4548 ; SSE42-NEXT: psrlq %xmm5, %xmm0
4549 ; SSE42-NEXT: pblendw {{.*#+}} xmm0 = xmm4[0,1,2,3],xmm0[4,5,6,7]
4550 ; SSE42-NEXT: movdqa %xmm1, %xmm4
4551 ; SSE42-NEXT: psrlq %xmm10, %xmm4
4552 ; SSE42-NEXT: pshufd {{.*#+}} xmm5 = xmm10[2,3,2,3]
4553 ; SSE42-NEXT: psrlq %xmm5, %xmm1
4554 ; SSE42-NEXT: pblendw {{.*#+}} xmm1 = xmm4[0,1,2,3],xmm1[4,5,6,7]
4555 ; SSE42-NEXT: movdqa %xmm2, %xmm4
4556 ; SSE42-NEXT: psrlq %xmm7, %xmm4
4557 ; SSE42-NEXT: pshufd {{.*#+}} xmm5 = xmm7[2,3,2,3]
4558 ; SSE42-NEXT: psrlq %xmm5, %xmm2
4559 ; SSE42-NEXT: pblendw {{.*#+}} xmm2 = xmm4[0,1,2,3],xmm2[4,5,6,7]
4560 ; SSE42-NEXT: movdqa %xmm3, %xmm4
4561 ; SSE42-NEXT: psrlq %xmm8, %xmm4
4562 ; SSE42-NEXT: pshufd {{.*#+}} xmm5 = xmm8[2,3,2,3]
4563 ; SSE42-NEXT: psrlq %xmm5, %xmm3
4564 ; SSE42-NEXT: pblendw {{.*#+}} xmm3 = xmm4[0,1,2,3],xmm3[4,5,6,7]
4567 ; AVX2-LABEL: lshr_v8i64_cast_cond:
4569 ; AVX2-NEXT: vmovd %edi, %xmm4
4570 ; AVX2-NEXT: vpbroadcastb %xmm4, %ymm4
4571 ; AVX2-NEXT: vmovdqa {{.*#+}} ymm5 = [16,32,64,128]
4572 ; AVX2-NEXT: vpand %ymm5, %ymm4, %ymm6
4573 ; AVX2-NEXT: vpcmpeqq %ymm5, %ymm6, %ymm5
4574 ; AVX2-NEXT: vpand %ymm3, %ymm5, %ymm3
4575 ; AVX2-NEXT: vmovdqa {{.*#+}} ymm5 = [1,2,4,8]
4576 ; AVX2-NEXT: vpand %ymm5, %ymm4, %ymm4
4577 ; AVX2-NEXT: vpcmpeqq %ymm5, %ymm4, %ymm4
4578 ; AVX2-NEXT: vpand %ymm2, %ymm4, %ymm2
4579 ; AVX2-NEXT: vpsrlvq %ymm2, %ymm0, %ymm0
4580 ; AVX2-NEXT: vpsrlvq %ymm3, %ymm1, %ymm1
4583 ; AVX512-LABEL: lshr_v8i64_cast_cond:
4585 ; AVX512-NEXT: kmovw %edi, %k1
4586 ; AVX512-NEXT: vpsrlvq %zmm1, %zmm0, %zmm0 {%k1}
4588 %b = bitcast i8 %pb to <8 x i1>
4589 %s = select <8 x i1> %b, <8 x i64> %y, <8 x i64> zeroinitializer
4590 %r = lshr <8 x i64> %x, %s
4594 define <4 x i32> @ashr_v4i32(<4 x i1> %b, <4 x i32> noundef %x, <4 x i32> noundef %y) {
4595 ; SSE2-LABEL: ashr_v4i32:
4597 ; SSE2-NEXT: pslld $31, %xmm0
4598 ; SSE2-NEXT: psrad $31, %xmm0
4599 ; SSE2-NEXT: pand %xmm2, %xmm0
4600 ; SSE2-NEXT: pshuflw {{.*#+}} xmm2 = xmm0[2,3,3,3,4,5,6,7]
4601 ; SSE2-NEXT: movdqa %xmm1, %xmm3
4602 ; SSE2-NEXT: psrad %xmm2, %xmm3
4603 ; SSE2-NEXT: pshuflw {{.*#+}} xmm4 = xmm0[0,1,1,1,4,5,6,7]
4604 ; SSE2-NEXT: movdqa %xmm1, %xmm2
4605 ; SSE2-NEXT: psrad %xmm4, %xmm2
4606 ; SSE2-NEXT: punpcklqdq {{.*#+}} xmm2 = xmm2[0],xmm3[0]
4607 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[2,3,2,3]
4608 ; SSE2-NEXT: pshuflw {{.*#+}} xmm3 = xmm0[2,3,3,3,4,5,6,7]
4609 ; SSE2-NEXT: movdqa %xmm1, %xmm4
4610 ; SSE2-NEXT: psrad %xmm3, %xmm4
4611 ; SSE2-NEXT: pshuflw {{.*#+}} xmm0 = xmm0[0,1,1,1,4,5,6,7]
4612 ; SSE2-NEXT: psrad %xmm0, %xmm1
4613 ; SSE2-NEXT: punpckhqdq {{.*#+}} xmm1 = xmm1[1],xmm4[1]
4614 ; SSE2-NEXT: shufps {{.*#+}} xmm2 = xmm2[0,3],xmm1[0,3]
4615 ; SSE2-NEXT: movaps %xmm2, %xmm0
4618 ; SSE42-LABEL: ashr_v4i32:
4620 ; SSE42-NEXT: pslld $31, %xmm0
4621 ; SSE42-NEXT: psrad $31, %xmm0
4622 ; SSE42-NEXT: pand %xmm2, %xmm0
4623 ; SSE42-NEXT: pshuflw {{.*#+}} xmm2 = xmm0[2,3,3,3,4,5,6,7]
4624 ; SSE42-NEXT: movdqa %xmm1, %xmm3
4625 ; SSE42-NEXT: psrad %xmm2, %xmm3
4626 ; SSE42-NEXT: pshufd {{.*#+}} xmm2 = xmm0[2,3,2,3]
4627 ; SSE42-NEXT: pshuflw {{.*#+}} xmm4 = xmm2[2,3,3,3,4,5,6,7]
4628 ; SSE42-NEXT: movdqa %xmm1, %xmm5
4629 ; SSE42-NEXT: psrad %xmm4, %xmm5
4630 ; SSE42-NEXT: pblendw {{.*#+}} xmm5 = xmm3[0,1,2,3],xmm5[4,5,6,7]
4631 ; SSE42-NEXT: pshuflw {{.*#+}} xmm3 = xmm0[0,1,1,1,4,5,6,7]
4632 ; SSE42-NEXT: movdqa %xmm1, %xmm0
4633 ; SSE42-NEXT: psrad %xmm3, %xmm0
4634 ; SSE42-NEXT: pshuflw {{.*#+}} xmm2 = xmm2[0,1,1,1,4,5,6,7]
4635 ; SSE42-NEXT: psrad %xmm2, %xmm1
4636 ; SSE42-NEXT: pblendw {{.*#+}} xmm0 = xmm0[0,1,2,3],xmm1[4,5,6,7]
4637 ; SSE42-NEXT: pblendw {{.*#+}} xmm0 = xmm0[0,1],xmm5[2,3],xmm0[4,5],xmm5[6,7]
4640 ; AVX2-LABEL: ashr_v4i32:
4642 ; AVX2-NEXT: vpslld $31, %xmm0, %xmm0
4643 ; AVX2-NEXT: vpsrad $31, %xmm0, %xmm0
4644 ; AVX2-NEXT: vpand %xmm2, %xmm0, %xmm0
4645 ; AVX2-NEXT: vpsravd %xmm0, %xmm1, %xmm0
4648 ; AVX512F-LABEL: ashr_v4i32:
4650 ; AVX512F-NEXT: # kill: def $xmm2 killed $xmm2 def $zmm2
4651 ; AVX512F-NEXT: vpslld $31, %xmm0, %xmm0
4652 ; AVX512F-NEXT: vptestmd %zmm0, %zmm0, %k1
4653 ; AVX512F-NEXT: vmovdqa32 %zmm2, %zmm0 {%k1} {z}
4654 ; AVX512F-NEXT: vpsravd %xmm0, %xmm1, %xmm0
4655 ; AVX512F-NEXT: vzeroupper
4656 ; AVX512F-NEXT: retq
4658 ; AVX512VL-LABEL: ashr_v4i32:
4659 ; AVX512VL: # %bb.0:
4660 ; AVX512VL-NEXT: vpslld $31, %xmm0, %xmm0
4661 ; AVX512VL-NEXT: vptestmd %xmm0, %xmm0, %k1
4662 ; AVX512VL-NEXT: vpsravd %xmm2, %xmm1, %xmm1 {%k1}
4663 ; AVX512VL-NEXT: vmovdqa %xmm1, %xmm0
4664 ; AVX512VL-NEXT: retq
4665 %s = select <4 x i1> %b, <4 x i32> %y, <4 x i32> zeroinitializer
4666 %r = ashr <4 x i32> %x, %s
4670 ; negative test - ashr is not commutative; there is no identity constant for operand 0
4672 define <8 x i32> @ashr_v8i32_commute(<8 x i1> %b, <8 x i32> noundef %x, <8 x i32> noundef %y) {
4673 ; SSE2-LABEL: ashr_v8i32_commute:
4675 ; SSE2-NEXT: movdqa %xmm1, %xmm5
4676 ; SSE2-NEXT: movdqa %xmm0, %xmm1
4677 ; SSE2-NEXT: punpckhwd {{.*#+}} xmm1 = xmm1[4,4,5,5,6,6,7,7]
4678 ; SSE2-NEXT: pslld $31, %xmm1
4679 ; SSE2-NEXT: psrad $31, %xmm1
4680 ; SSE2-NEXT: pand %xmm4, %xmm1
4681 ; SSE2-NEXT: punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]
4682 ; SSE2-NEXT: pslld $31, %xmm0
4683 ; SSE2-NEXT: psrad $31, %xmm0
4684 ; SSE2-NEXT: pand %xmm3, %xmm0
4685 ; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm5[2,3,2,3]
4686 ; SSE2-NEXT: pshuflw {{.*#+}} xmm4 = xmm3[2,3,3,3,4,5,6,7]
4687 ; SSE2-NEXT: movdqa %xmm0, %xmm6
4688 ; SSE2-NEXT: psrad %xmm4, %xmm6
4689 ; SSE2-NEXT: pshuflw {{.*#+}} xmm3 = xmm3[0,1,1,1,4,5,6,7]
4690 ; SSE2-NEXT: movdqa %xmm0, %xmm4
4691 ; SSE2-NEXT: psrad %xmm3, %xmm4
4692 ; SSE2-NEXT: punpckhqdq {{.*#+}} xmm4 = xmm4[1],xmm6[1]
4693 ; SSE2-NEXT: pshuflw {{.*#+}} xmm3 = xmm5[2,3,3,3,4,5,6,7]
4694 ; SSE2-NEXT: movdqa %xmm0, %xmm6
4695 ; SSE2-NEXT: psrad %xmm3, %xmm6
4696 ; SSE2-NEXT: pshuflw {{.*#+}} xmm3 = xmm5[0,1,1,1,4,5,6,7]
4697 ; SSE2-NEXT: psrad %xmm3, %xmm0
4698 ; SSE2-NEXT: punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm6[0]
4699 ; SSE2-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,3],xmm4[0,3]
4700 ; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm2[2,3,2,3]
4701 ; SSE2-NEXT: pshuflw {{.*#+}} xmm4 = xmm3[2,3,3,3,4,5,6,7]
4702 ; SSE2-NEXT: movdqa %xmm1, %xmm5
4703 ; SSE2-NEXT: psrad %xmm4, %xmm5
4704 ; SSE2-NEXT: pshuflw {{.*#+}} xmm3 = xmm3[0,1,1,1,4,5,6,7]
4705 ; SSE2-NEXT: movdqa %xmm1, %xmm4
4706 ; SSE2-NEXT: psrad %xmm3, %xmm4
4707 ; SSE2-NEXT: punpckhqdq {{.*#+}} xmm4 = xmm4[1],xmm5[1]
4708 ; SSE2-NEXT: pshuflw {{.*#+}} xmm3 = xmm2[2,3,3,3,4,5,6,7]
4709 ; SSE2-NEXT: movdqa %xmm1, %xmm5
4710 ; SSE2-NEXT: psrad %xmm3, %xmm5
4711 ; SSE2-NEXT: pshuflw {{.*#+}} xmm2 = xmm2[0,1,1,1,4,5,6,7]
4712 ; SSE2-NEXT: psrad %xmm2, %xmm1
4713 ; SSE2-NEXT: punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm5[0]
4714 ; SSE2-NEXT: shufps {{.*#+}} xmm1 = xmm1[0,3],xmm4[0,3]
4717 ; SSE42-LABEL: ashr_v8i32_commute:
4719 ; SSE42-NEXT: movdqa %xmm0, %xmm5
4720 ; SSE42-NEXT: pmovzxwd {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero
4721 ; SSE42-NEXT: punpckhwd {{.*#+}} xmm5 = xmm5[4,4,5,5,6,6,7,7]
4722 ; SSE42-NEXT: pslld $31, %xmm5
4723 ; SSE42-NEXT: psrad $31, %xmm5
4724 ; SSE42-NEXT: pand %xmm4, %xmm5
4725 ; SSE42-NEXT: pslld $31, %xmm0
4726 ; SSE42-NEXT: psrad $31, %xmm0
4727 ; SSE42-NEXT: pand %xmm3, %xmm0
4728 ; SSE42-NEXT: pshufd {{.*#+}} xmm3 = xmm1[2,3,2,3]
4729 ; SSE42-NEXT: pshuflw {{.*#+}} xmm4 = xmm3[2,3,3,3,4,5,6,7]
4730 ; SSE42-NEXT: movdqa %xmm0, %xmm6
4731 ; SSE42-NEXT: psrad %xmm4, %xmm6
4732 ; SSE42-NEXT: pshuflw {{.*#+}} xmm4 = xmm1[2,3,3,3,4,5,6,7]
4733 ; SSE42-NEXT: movdqa %xmm0, %xmm7
4734 ; SSE42-NEXT: psrad %xmm4, %xmm7
4735 ; SSE42-NEXT: pblendw {{.*#+}} xmm7 = xmm7[0,1,2,3],xmm6[4,5,6,7]
4736 ; SSE42-NEXT: pshuflw {{.*#+}} xmm3 = xmm3[0,1,1,1,4,5,6,7]
4737 ; SSE42-NEXT: movdqa %xmm0, %xmm4
4738 ; SSE42-NEXT: psrad %xmm3, %xmm4
4739 ; SSE42-NEXT: pshuflw {{.*#+}} xmm1 = xmm1[0,1,1,1,4,5,6,7]
4740 ; SSE42-NEXT: psrad %xmm1, %xmm0
4741 ; SSE42-NEXT: pblendw {{.*#+}} xmm0 = xmm0[0,1,2,3],xmm4[4,5,6,7]
4742 ; SSE42-NEXT: pblendw {{.*#+}} xmm0 = xmm0[0,1],xmm7[2,3],xmm0[4,5],xmm7[6,7]
4743 ; SSE42-NEXT: pshufd {{.*#+}} xmm1 = xmm2[2,3,2,3]
4744 ; SSE42-NEXT: pshuflw {{.*#+}} xmm3 = xmm1[2,3,3,3,4,5,6,7]
4745 ; SSE42-NEXT: movdqa %xmm5, %xmm4
4746 ; SSE42-NEXT: psrad %xmm3, %xmm4
4747 ; SSE42-NEXT: pshuflw {{.*#+}} xmm3 = xmm2[2,3,3,3,4,5,6,7]
4748 ; SSE42-NEXT: movdqa %xmm5, %xmm6
4749 ; SSE42-NEXT: psrad %xmm3, %xmm6
4750 ; SSE42-NEXT: pblendw {{.*#+}} xmm6 = xmm6[0,1,2,3],xmm4[4,5,6,7]
4751 ; SSE42-NEXT: pshuflw {{.*#+}} xmm3 = xmm1[0,1,1,1,4,5,6,7]
4752 ; SSE42-NEXT: movdqa %xmm5, %xmm1
4753 ; SSE42-NEXT: psrad %xmm3, %xmm1
4754 ; SSE42-NEXT: pshuflw {{.*#+}} xmm2 = xmm2[0,1,1,1,4,5,6,7]
4755 ; SSE42-NEXT: psrad %xmm2, %xmm5
4756 ; SSE42-NEXT: pblendw {{.*#+}} xmm1 = xmm5[0,1,2,3],xmm1[4,5,6,7]
4757 ; SSE42-NEXT: pblendw {{.*#+}} xmm1 = xmm1[0,1],xmm6[2,3],xmm1[4,5],xmm6[6,7]
4760 ; AVX2-LABEL: ashr_v8i32_commute:
4762 ; AVX2-NEXT: vpmovzxwd {{.*#+}} ymm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero
4763 ; AVX2-NEXT: vpslld $31, %ymm0, %ymm0
4764 ; AVX2-NEXT: vpsrad $31, %ymm0, %ymm0
4765 ; AVX2-NEXT: vpand %ymm2, %ymm0, %ymm0
4766 ; AVX2-NEXT: vpsravd %ymm1, %ymm0, %ymm0
4769 ; AVX512F-LABEL: ashr_v8i32_commute:
4771 ; AVX512F-NEXT: # kill: def $ymm2 killed $ymm2 def $zmm2
4772 ; AVX512F-NEXT: vpmovsxwq %xmm0, %zmm0
4773 ; AVX512F-NEXT: vpsllq $63, %zmm0, %zmm0
4774 ; AVX512F-NEXT: vptestmq %zmm0, %zmm0, %k1
4775 ; AVX512F-NEXT: vmovdqa32 %zmm2, %zmm0 {%k1} {z}
4776 ; AVX512F-NEXT: vpsravd %ymm1, %ymm0, %ymm0
4777 ; AVX512F-NEXT: retq
4779 ; AVX512VL-LABEL: ashr_v8i32_commute:
4780 ; AVX512VL: # %bb.0:
4781 ; AVX512VL-NEXT: vpmovsxwd %xmm0, %ymm0
4782 ; AVX512VL-NEXT: vpslld $31, %ymm0, %ymm0
4783 ; AVX512VL-NEXT: vptestmd %ymm0, %ymm0, %k1
4784 ; AVX512VL-NEXT: vmovdqa32 %ymm2, %ymm0 {%k1} {z}
4785 ; AVX512VL-NEXT: vpsravd %ymm1, %ymm0, %ymm0
4786 ; AVX512VL-NEXT: retq
4787 %s = select <8 x i1> %b, <8 x i32> %y, <8 x i32> zeroinitializer
4788 %r = ashr <8 x i32> %s, %x
4792 define <16 x i32> @ashr_v16i32_swap(<16 x i1> %b, <16 x i32> noundef %x, <16 x i32> noundef %y) {
4793 ; SSE2-LABEL: ashr_v16i32_swap:
4795 ; SSE2-NEXT: movdqa %xmm0, %xmm8
4796 ; SSE2-NEXT: movdqa %xmm0, %xmm10
4797 ; SSE2-NEXT: punpckhbw {{.*#+}} xmm10 = xmm10[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]
4798 ; SSE2-NEXT: movdqa %xmm10, %xmm9
4799 ; SSE2-NEXT: punpckhwd {{.*#+}} xmm9 = xmm9[4,4,5,5,6,6,7,7]
4800 ; SSE2-NEXT: pslld $31, %xmm9
4801 ; SSE2-NEXT: psrad $31, %xmm9
4802 ; SSE2-NEXT: pandn {{[0-9]+}}(%rsp), %xmm9
4803 ; SSE2-NEXT: punpcklwd {{.*#+}} xmm10 = xmm10[0,0,1,1,2,2,3,3]
4804 ; SSE2-NEXT: pslld $31, %xmm10
4805 ; SSE2-NEXT: psrad $31, %xmm10
4806 ; SSE2-NEXT: pandn %xmm7, %xmm10
4807 ; SSE2-NEXT: punpcklbw {{.*#+}} xmm8 = xmm8[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
4808 ; SSE2-NEXT: movdqa %xmm8, %xmm7
4809 ; SSE2-NEXT: punpckhwd {{.*#+}} xmm7 = xmm7[4,4,5,5,6,6,7,7]
4810 ; SSE2-NEXT: pslld $31, %xmm7
4811 ; SSE2-NEXT: psrad $31, %xmm7
4812 ; SSE2-NEXT: pandn %xmm6, %xmm7
4813 ; SSE2-NEXT: punpcklwd {{.*#+}} xmm8 = xmm8[0,0,1,1,2,2,3,3]
4814 ; SSE2-NEXT: pslld $31, %xmm8
4815 ; SSE2-NEXT: psrad $31, %xmm8
4816 ; SSE2-NEXT: pandn %xmm5, %xmm8
4817 ; SSE2-NEXT: pshuflw {{.*#+}} xmm0 = xmm8[2,3,3,3,4,5,6,7]
4818 ; SSE2-NEXT: movdqa %xmm1, %xmm5
4819 ; SSE2-NEXT: psrad %xmm0, %xmm5
4820 ; SSE2-NEXT: pshuflw {{.*#+}} xmm6 = xmm8[0,1,1,1,4,5,6,7]
4821 ; SSE2-NEXT: movdqa %xmm1, %xmm0
4822 ; SSE2-NEXT: psrad %xmm6, %xmm0
4823 ; SSE2-NEXT: punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm5[0]
4824 ; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm8[2,3,2,3]
4825 ; SSE2-NEXT: pshuflw {{.*#+}} xmm6 = xmm5[2,3,3,3,4,5,6,7]
4826 ; SSE2-NEXT: movdqa %xmm1, %xmm8
4827 ; SSE2-NEXT: psrad %xmm6, %xmm8
4828 ; SSE2-NEXT: pshuflw {{.*#+}} xmm5 = xmm5[0,1,1,1,4,5,6,7]
4829 ; SSE2-NEXT: psrad %xmm5, %xmm1
4830 ; SSE2-NEXT: punpckhqdq {{.*#+}} xmm1 = xmm1[1],xmm8[1]
4831 ; SSE2-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,3],xmm1[0,3]
4832 ; SSE2-NEXT: pshuflw {{.*#+}} xmm1 = xmm7[2,3,3,3,4,5,6,7]
4833 ; SSE2-NEXT: movdqa %xmm2, %xmm5
4834 ; SSE2-NEXT: psrad %xmm1, %xmm5
4835 ; SSE2-NEXT: pshuflw {{.*#+}} xmm6 = xmm7[0,1,1,1,4,5,6,7]
4836 ; SSE2-NEXT: movdqa %xmm2, %xmm1
4837 ; SSE2-NEXT: psrad %xmm6, %xmm1
4838 ; SSE2-NEXT: punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm5[0]
4839 ; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm7[2,3,2,3]
4840 ; SSE2-NEXT: pshuflw {{.*#+}} xmm6 = xmm5[2,3,3,3,4,5,6,7]
4841 ; SSE2-NEXT: movdqa %xmm2, %xmm7
4842 ; SSE2-NEXT: psrad %xmm6, %xmm7
4843 ; SSE2-NEXT: pshuflw {{.*#+}} xmm5 = xmm5[0,1,1,1,4,5,6,7]
4844 ; SSE2-NEXT: psrad %xmm5, %xmm2
4845 ; SSE2-NEXT: punpckhqdq {{.*#+}} xmm2 = xmm2[1],xmm7[1]
4846 ; SSE2-NEXT: shufps {{.*#+}} xmm1 = xmm1[0,3],xmm2[0,3]
4847 ; SSE2-NEXT: pshuflw {{.*#+}} xmm2 = xmm10[2,3,3,3,4,5,6,7]
4848 ; SSE2-NEXT: movdqa %xmm3, %xmm5
4849 ; SSE2-NEXT: psrad %xmm2, %xmm5
4850 ; SSE2-NEXT: pshuflw {{.*#+}} xmm6 = xmm10[0,1,1,1,4,5,6,7]
4851 ; SSE2-NEXT: movdqa %xmm3, %xmm2
4852 ; SSE2-NEXT: psrad %xmm6, %xmm2
4853 ; SSE2-NEXT: punpcklqdq {{.*#+}} xmm2 = xmm2[0],xmm5[0]
4854 ; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm10[2,3,2,3]
4855 ; SSE2-NEXT: pshuflw {{.*#+}} xmm6 = xmm5[2,3,3,3,4,5,6,7]
4856 ; SSE2-NEXT: movdqa %xmm3, %xmm7
4857 ; SSE2-NEXT: psrad %xmm6, %xmm7
4858 ; SSE2-NEXT: pshuflw {{.*#+}} xmm5 = xmm5[0,1,1,1,4,5,6,7]
4859 ; SSE2-NEXT: psrad %xmm5, %xmm3
4860 ; SSE2-NEXT: punpckhqdq {{.*#+}} xmm3 = xmm3[1],xmm7[1]
4861 ; SSE2-NEXT: shufps {{.*#+}} xmm2 = xmm2[0,3],xmm3[0,3]
4862 ; SSE2-NEXT: pshuflw {{.*#+}} xmm3 = xmm9[2,3,3,3,4,5,6,7]
4863 ; SSE2-NEXT: movdqa %xmm4, %xmm5
4864 ; SSE2-NEXT: psrad %xmm3, %xmm5
4865 ; SSE2-NEXT: pshuflw {{.*#+}} xmm6 = xmm9[0,1,1,1,4,5,6,7]
4866 ; SSE2-NEXT: movdqa %xmm4, %xmm3
4867 ; SSE2-NEXT: psrad %xmm6, %xmm3
4868 ; SSE2-NEXT: punpcklqdq {{.*#+}} xmm3 = xmm3[0],xmm5[0]
4869 ; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm9[2,3,2,3]
4870 ; SSE2-NEXT: pshuflw {{.*#+}} xmm6 = xmm5[2,3,3,3,4,5,6,7]
4871 ; SSE2-NEXT: movdqa %xmm4, %xmm7
4872 ; SSE2-NEXT: psrad %xmm6, %xmm7
4873 ; SSE2-NEXT: pshuflw {{.*#+}} xmm5 = xmm5[0,1,1,1,4,5,6,7]
4874 ; SSE2-NEXT: psrad %xmm5, %xmm4
4875 ; SSE2-NEXT: punpckhqdq {{.*#+}} xmm4 = xmm4[1],xmm7[1]
4876 ; SSE2-NEXT: shufps {{.*#+}} xmm3 = xmm3[0,3],xmm4[0,3]
4879 ; SSE42-LABEL: ashr_v16i32_swap:
4881 ; SSE42-NEXT: pshufd {{.*#+}} xmm8 = xmm0[2,3,2,3]
4882 ; SSE42-NEXT: pmovzxbd {{.*#+}} xmm8 = xmm8[0],zero,zero,zero,xmm8[1],zero,zero,zero,xmm8[2],zero,zero,zero,xmm8[3],zero,zero,zero
4883 ; SSE42-NEXT: pslld $31, %xmm8
4884 ; SSE42-NEXT: psrad $31, %xmm8
4885 ; SSE42-NEXT: pandn %xmm7, %xmm8
4886 ; SSE42-NEXT: pshufd {{.*#+}} xmm7 = xmm0[1,1,1,1]
4887 ; SSE42-NEXT: pmovzxbd {{.*#+}} xmm7 = xmm7[0],zero,zero,zero,xmm7[1],zero,zero,zero,xmm7[2],zero,zero,zero,xmm7[3],zero,zero,zero
4888 ; SSE42-NEXT: pslld $31, %xmm7
4889 ; SSE42-NEXT: psrad $31, %xmm7
4890 ; SSE42-NEXT: pandn %xmm6, %xmm7
4891 ; SSE42-NEXT: pmovzxbd {{.*#+}} xmm6 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero
4892 ; SSE42-NEXT: pslld $31, %xmm6
4893 ; SSE42-NEXT: psrad $31, %xmm6
4894 ; SSE42-NEXT: pandn %xmm5, %xmm6
4895 ; SSE42-NEXT: pshufd {{.*#+}} xmm0 = xmm0[3,3,3,3]
4896 ; SSE42-NEXT: pmovzxbd {{.*#+}} xmm5 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero
4897 ; SSE42-NEXT: pslld $31, %xmm5
4898 ; SSE42-NEXT: psrad $31, %xmm5
4899 ; SSE42-NEXT: pandn {{[0-9]+}}(%rsp), %xmm5
4900 ; SSE42-NEXT: pshuflw {{.*#+}} xmm0 = xmm6[2,3,3,3,4,5,6,7]
4901 ; SSE42-NEXT: movdqa %xmm1, %xmm9
4902 ; SSE42-NEXT: psrad %xmm0, %xmm9
4903 ; SSE42-NEXT: pshufd {{.*#+}} xmm10 = xmm6[2,3,2,3]
4904 ; SSE42-NEXT: pshuflw {{.*#+}} xmm0 = xmm10[2,3,3,3,4,5,6,7]
4905 ; SSE42-NEXT: movdqa %xmm1, %xmm11
4906 ; SSE42-NEXT: psrad %xmm0, %xmm11
4907 ; SSE42-NEXT: pblendw {{.*#+}} xmm11 = xmm9[0,1,2,3],xmm11[4,5,6,7]
4908 ; SSE42-NEXT: pshuflw {{.*#+}} xmm6 = xmm6[0,1,1,1,4,5,6,7]
4909 ; SSE42-NEXT: movdqa %xmm1, %xmm0
4910 ; SSE42-NEXT: psrad %xmm6, %xmm0
4911 ; SSE42-NEXT: pshuflw {{.*#+}} xmm6 = xmm10[0,1,1,1,4,5,6,7]
4912 ; SSE42-NEXT: psrad %xmm6, %xmm1
4913 ; SSE42-NEXT: pblendw {{.*#+}} xmm0 = xmm0[0,1,2,3],xmm1[4,5,6,7]
4914 ; SSE42-NEXT: pblendw {{.*#+}} xmm0 = xmm0[0,1],xmm11[2,3],xmm0[4,5],xmm11[6,7]
4915 ; SSE42-NEXT: pshuflw {{.*#+}} xmm1 = xmm7[2,3,3,3,4,5,6,7]
4916 ; SSE42-NEXT: movdqa %xmm2, %xmm6
4917 ; SSE42-NEXT: psrad %xmm1, %xmm6
4918 ; SSE42-NEXT: pshufd {{.*#+}} xmm9 = xmm7[2,3,2,3]
4919 ; SSE42-NEXT: pshuflw {{.*#+}} xmm1 = xmm9[2,3,3,3,4,5,6,7]
4920 ; SSE42-NEXT: movdqa %xmm2, %xmm10
4921 ; SSE42-NEXT: psrad %xmm1, %xmm10
4922 ; SSE42-NEXT: pblendw {{.*#+}} xmm10 = xmm6[0,1,2,3],xmm10[4,5,6,7]
4923 ; SSE42-NEXT: pshuflw {{.*#+}} xmm6 = xmm7[0,1,1,1,4,5,6,7]
4924 ; SSE42-NEXT: movdqa %xmm2, %xmm1
4925 ; SSE42-NEXT: psrad %xmm6, %xmm1
4926 ; SSE42-NEXT: pshuflw {{.*#+}} xmm6 = xmm9[0,1,1,1,4,5,6,7]
4927 ; SSE42-NEXT: psrad %xmm6, %xmm2
4928 ; SSE42-NEXT: pblendw {{.*#+}} xmm1 = xmm1[0,1,2,3],xmm2[4,5,6,7]
4929 ; SSE42-NEXT: pblendw {{.*#+}} xmm1 = xmm1[0,1],xmm10[2,3],xmm1[4,5],xmm10[6,7]
4930 ; SSE42-NEXT: pshuflw {{.*#+}} xmm2 = xmm8[2,3,3,3,4,5,6,7]
4931 ; SSE42-NEXT: movdqa %xmm3, %xmm6
4932 ; SSE42-NEXT: psrad %xmm2, %xmm6
4933 ; SSE42-NEXT: pshufd {{.*#+}} xmm7 = xmm8[2,3,2,3]
4934 ; SSE42-NEXT: pshuflw {{.*#+}} xmm2 = xmm7[2,3,3,3,4,5,6,7]
4935 ; SSE42-NEXT: movdqa %xmm3, %xmm9
4936 ; SSE42-NEXT: psrad %xmm2, %xmm9
4937 ; SSE42-NEXT: pblendw {{.*#+}} xmm9 = xmm6[0,1,2,3],xmm9[4,5,6,7]
4938 ; SSE42-NEXT: pshuflw {{.*#+}} xmm6 = xmm8[0,1,1,1,4,5,6,7]
4939 ; SSE42-NEXT: movdqa %xmm3, %xmm2
4940 ; SSE42-NEXT: psrad %xmm6, %xmm2
4941 ; SSE42-NEXT: pshuflw {{.*#+}} xmm6 = xmm7[0,1,1,1,4,5,6,7]
4942 ; SSE42-NEXT: psrad %xmm6, %xmm3
4943 ; SSE42-NEXT: pblendw {{.*#+}} xmm2 = xmm2[0,1,2,3],xmm3[4,5,6,7]
4944 ; SSE42-NEXT: pblendw {{.*#+}} xmm2 = xmm2[0,1],xmm9[2,3],xmm2[4,5],xmm9[6,7]
4945 ; SSE42-NEXT: pshuflw {{.*#+}} xmm3 = xmm5[2,3,3,3,4,5,6,7]
4946 ; SSE42-NEXT: movdqa %xmm4, %xmm6
4947 ; SSE42-NEXT: psrad %xmm3, %xmm6
4948 ; SSE42-NEXT: pshufd {{.*#+}} xmm7 = xmm5[2,3,2,3]
4949 ; SSE42-NEXT: pshuflw {{.*#+}} xmm3 = xmm7[2,3,3,3,4,5,6,7]
4950 ; SSE42-NEXT: movdqa %xmm4, %xmm8
4951 ; SSE42-NEXT: psrad %xmm3, %xmm8
4952 ; SSE42-NEXT: pblendw {{.*#+}} xmm8 = xmm6[0,1,2,3],xmm8[4,5,6,7]
4953 ; SSE42-NEXT: pshuflw {{.*#+}} xmm5 = xmm5[0,1,1,1,4,5,6,7]
4954 ; SSE42-NEXT: movdqa %xmm4, %xmm3
4955 ; SSE42-NEXT: psrad %xmm5, %xmm3
4956 ; SSE42-NEXT: pshuflw {{.*#+}} xmm5 = xmm7[0,1,1,1,4,5,6,7]
4957 ; SSE42-NEXT: psrad %xmm5, %xmm4
4958 ; SSE42-NEXT: pblendw {{.*#+}} xmm3 = xmm3[0,1,2,3],xmm4[4,5,6,7]
4959 ; SSE42-NEXT: pblendw {{.*#+}} xmm3 = xmm3[0,1],xmm8[2,3],xmm3[4,5],xmm8[6,7]
4962 ; AVX2-LABEL: ashr_v16i32_swap:
4964 ; AVX2-NEXT: vpunpckhbw {{.*#+}} xmm5 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]
4965 ; AVX2-NEXT: vpmovzxwd {{.*#+}} ymm5 = xmm5[0],zero,xmm5[1],zero,xmm5[2],zero,xmm5[3],zero,xmm5[4],zero,xmm5[5],zero,xmm5[6],zero,xmm5[7],zero
4966 ; AVX2-NEXT: vpslld $31, %ymm5, %ymm5
4967 ; AVX2-NEXT: vpsrad $31, %ymm5, %ymm5
4968 ; AVX2-NEXT: vpandn %ymm4, %ymm5, %ymm4
4969 ; AVX2-NEXT: vpmovzxbd {{.*#+}} ymm0 = 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
4970 ; AVX2-NEXT: vpslld $31, %ymm0, %ymm0
4971 ; AVX2-NEXT: vpsrad $31, %ymm0, %ymm0
4972 ; AVX2-NEXT: vpandn %ymm3, %ymm0, %ymm0
4973 ; AVX2-NEXT: vpsravd %ymm0, %ymm1, %ymm0
4974 ; AVX2-NEXT: vpsravd %ymm4, %ymm2, %ymm1
4977 ; AVX512-LABEL: ashr_v16i32_swap:
4979 ; AVX512-NEXT: vpmovsxbd %xmm0, %zmm0
4980 ; AVX512-NEXT: vpslld $31, %zmm0, %zmm0
4981 ; AVX512-NEXT: vptestnmd %zmm0, %zmm0, %k1
4982 ; AVX512-NEXT: vpsravd %zmm2, %zmm1, %zmm1 {%k1}
4983 ; AVX512-NEXT: vmovdqa64 %zmm1, %zmm0
4985 %s = select <16 x i1> %b, <16 x i32> zeroinitializer, <16 x i32> %y
4986 %r = ashr <16 x i32> %x, %s
4990 ; negative test - ashr is not commutative; there is no identity constant for operand 0
4992 define <16 x i32> @ashr_v16i32_commute_swap(<16 x i1> %b, <16 x i32> noundef %x, <16 x i32> noundef %y) {
4993 ; SSE2-LABEL: ashr_v16i32_commute_swap:
4995 ; SSE2-NEXT: movdqa %xmm3, %xmm8
4996 ; SSE2-NEXT: movdqa %xmm2, %xmm9
4997 ; SSE2-NEXT: movdqa %xmm1, %xmm10
4998 ; SSE2-NEXT: movdqa %xmm0, %xmm2
4999 ; SSE2-NEXT: punpckhbw {{.*#+}} xmm2 = xmm2[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]
5000 ; SSE2-NEXT: movdqa %xmm2, %xmm3
5001 ; SSE2-NEXT: punpckhwd {{.*#+}} xmm3 = xmm3[4,4,5,5,6,6,7,7]
5002 ; SSE2-NEXT: pslld $31, %xmm3
5003 ; SSE2-NEXT: psrad $31, %xmm3
5004 ; SSE2-NEXT: pandn {{[0-9]+}}(%rsp), %xmm3
5005 ; SSE2-NEXT: punpcklwd {{.*#+}} xmm2 = xmm2[0,0,1,1,2,2,3,3]
5006 ; SSE2-NEXT: pslld $31, %xmm2
5007 ; SSE2-NEXT: psrad $31, %xmm2
5008 ; SSE2-NEXT: pandn %xmm7, %xmm2
5009 ; SSE2-NEXT: punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
5010 ; SSE2-NEXT: movdqa %xmm0, %xmm1
5011 ; SSE2-NEXT: punpckhwd {{.*#+}} xmm1 = xmm1[4,4,5,5,6,6,7,7]
5012 ; SSE2-NEXT: pslld $31, %xmm1
5013 ; SSE2-NEXT: psrad $31, %xmm1
5014 ; SSE2-NEXT: pandn %xmm6, %xmm1
5015 ; SSE2-NEXT: punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]
5016 ; SSE2-NEXT: pslld $31, %xmm0
5017 ; SSE2-NEXT: psrad $31, %xmm0
5018 ; SSE2-NEXT: pandn %xmm5, %xmm0
5019 ; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm10[2,3,2,3]
5020 ; SSE2-NEXT: pshuflw {{.*#+}} xmm6 = xmm5[2,3,3,3,4,5,6,7]
5021 ; SSE2-NEXT: movdqa %xmm0, %xmm7
5022 ; SSE2-NEXT: psrad %xmm6, %xmm7
5023 ; SSE2-NEXT: pshuflw {{.*#+}} xmm5 = xmm5[0,1,1,1,4,5,6,7]
5024 ; SSE2-NEXT: movdqa %xmm0, %xmm6
5025 ; SSE2-NEXT: psrad %xmm5, %xmm6
5026 ; SSE2-NEXT: punpckhqdq {{.*#+}} xmm6 = xmm6[1],xmm7[1]
5027 ; SSE2-NEXT: pshuflw {{.*#+}} xmm5 = xmm10[2,3,3,3,4,5,6,7]
5028 ; SSE2-NEXT: movdqa %xmm0, %xmm7
5029 ; SSE2-NEXT: psrad %xmm5, %xmm7
5030 ; SSE2-NEXT: pshuflw {{.*#+}} xmm5 = xmm10[0,1,1,1,4,5,6,7]
5031 ; SSE2-NEXT: psrad %xmm5, %xmm0
5032 ; SSE2-NEXT: punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm7[0]
5033 ; SSE2-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,3],xmm6[0,3]
5034 ; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm9[2,3,2,3]
5035 ; SSE2-NEXT: pshuflw {{.*#+}} xmm6 = xmm5[2,3,3,3,4,5,6,7]
5036 ; SSE2-NEXT: movdqa %xmm1, %xmm7
5037 ; SSE2-NEXT: psrad %xmm6, %xmm7
5038 ; SSE2-NEXT: pshuflw {{.*#+}} xmm5 = xmm5[0,1,1,1,4,5,6,7]
5039 ; SSE2-NEXT: movdqa %xmm1, %xmm6
5040 ; SSE2-NEXT: psrad %xmm5, %xmm6
5041 ; SSE2-NEXT: punpckhqdq {{.*#+}} xmm6 = xmm6[1],xmm7[1]
5042 ; SSE2-NEXT: pshuflw {{.*#+}} xmm5 = xmm9[2,3,3,3,4,5,6,7]
5043 ; SSE2-NEXT: movdqa %xmm1, %xmm7
5044 ; SSE2-NEXT: psrad %xmm5, %xmm7
5045 ; SSE2-NEXT: pshuflw {{.*#+}} xmm5 = xmm9[0,1,1,1,4,5,6,7]
5046 ; SSE2-NEXT: psrad %xmm5, %xmm1
5047 ; SSE2-NEXT: punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm7[0]
5048 ; SSE2-NEXT: shufps {{.*#+}} xmm1 = xmm1[0,3],xmm6[0,3]
5049 ; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm8[2,3,2,3]
5050 ; SSE2-NEXT: pshuflw {{.*#+}} xmm6 = xmm5[2,3,3,3,4,5,6,7]
5051 ; SSE2-NEXT: movdqa %xmm2, %xmm7
5052 ; SSE2-NEXT: psrad %xmm6, %xmm7
5053 ; SSE2-NEXT: pshuflw {{.*#+}} xmm5 = xmm5[0,1,1,1,4,5,6,7]
5054 ; SSE2-NEXT: movdqa %xmm2, %xmm6
5055 ; SSE2-NEXT: psrad %xmm5, %xmm6
5056 ; SSE2-NEXT: punpckhqdq {{.*#+}} xmm6 = xmm6[1],xmm7[1]
5057 ; SSE2-NEXT: pshuflw {{.*#+}} xmm5 = xmm8[2,3,3,3,4,5,6,7]
5058 ; SSE2-NEXT: movdqa %xmm2, %xmm7
5059 ; SSE2-NEXT: psrad %xmm5, %xmm7
5060 ; SSE2-NEXT: pshuflw {{.*#+}} xmm5 = xmm8[0,1,1,1,4,5,6,7]
5061 ; SSE2-NEXT: psrad %xmm5, %xmm2
5062 ; SSE2-NEXT: punpcklqdq {{.*#+}} xmm2 = xmm2[0],xmm7[0]
5063 ; SSE2-NEXT: shufps {{.*#+}} xmm2 = xmm2[0,3],xmm6[0,3]
5064 ; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm4[2,3,2,3]
5065 ; SSE2-NEXT: pshuflw {{.*#+}} xmm6 = xmm5[2,3,3,3,4,5,6,7]
5066 ; SSE2-NEXT: movdqa %xmm3, %xmm7
5067 ; SSE2-NEXT: psrad %xmm6, %xmm7
5068 ; SSE2-NEXT: pshuflw {{.*#+}} xmm5 = xmm5[0,1,1,1,4,5,6,7]
5069 ; SSE2-NEXT: movdqa %xmm3, %xmm6
5070 ; SSE2-NEXT: psrad %xmm5, %xmm6
5071 ; SSE2-NEXT: punpckhqdq {{.*#+}} xmm6 = xmm6[1],xmm7[1]
5072 ; SSE2-NEXT: pshuflw {{.*#+}} xmm5 = xmm4[2,3,3,3,4,5,6,7]
5073 ; SSE2-NEXT: movdqa %xmm3, %xmm7
5074 ; SSE2-NEXT: psrad %xmm5, %xmm7
5075 ; SSE2-NEXT: pshuflw {{.*#+}} xmm4 = xmm4[0,1,1,1,4,5,6,7]
5076 ; SSE2-NEXT: psrad %xmm4, %xmm3
5077 ; SSE2-NEXT: punpcklqdq {{.*#+}} xmm3 = xmm3[0],xmm7[0]
5078 ; SSE2-NEXT: shufps {{.*#+}} xmm3 = xmm3[0,3],xmm6[0,3]
5081 ; SSE42-LABEL: ashr_v16i32_commute_swap:
5083 ; SSE42-NEXT: movdqa %xmm3, %xmm10
5084 ; SSE42-NEXT: movdqa %xmm2, %xmm9
5085 ; SSE42-NEXT: movdqa %xmm1, %xmm8
5086 ; SSE42-NEXT: movdqa %xmm0, %xmm3
5087 ; SSE42-NEXT: pshufd {{.*#+}} xmm0 = xmm0[2,3,2,3]
5088 ; SSE42-NEXT: pmovzxbd {{.*#+}} xmm2 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero
5089 ; SSE42-NEXT: pslld $31, %xmm2
5090 ; SSE42-NEXT: psrad $31, %xmm2
5091 ; SSE42-NEXT: pandn %xmm7, %xmm2
5092 ; SSE42-NEXT: pshufd {{.*#+}} xmm0 = xmm3[1,1,1,1]
5093 ; SSE42-NEXT: pmovzxbd {{.*#+}} xmm1 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero
5094 ; SSE42-NEXT: pslld $31, %xmm1
5095 ; SSE42-NEXT: psrad $31, %xmm1
5096 ; SSE42-NEXT: pandn %xmm6, %xmm1
5097 ; SSE42-NEXT: pmovzxbd {{.*#+}} xmm0 = xmm3[0],zero,zero,zero,xmm3[1],zero,zero,zero,xmm3[2],zero,zero,zero,xmm3[3],zero,zero,zero
5098 ; SSE42-NEXT: pslld $31, %xmm0
5099 ; SSE42-NEXT: psrad $31, %xmm0
5100 ; SSE42-NEXT: pandn %xmm5, %xmm0
5101 ; SSE42-NEXT: pshufd {{.*#+}} xmm3 = xmm3[3,3,3,3]
5102 ; SSE42-NEXT: pmovzxbd {{.*#+}} xmm3 = xmm3[0],zero,zero,zero,xmm3[1],zero,zero,zero,xmm3[2],zero,zero,zero,xmm3[3],zero,zero,zero
5103 ; SSE42-NEXT: pslld $31, %xmm3
5104 ; SSE42-NEXT: psrad $31, %xmm3
5105 ; SSE42-NEXT: pandn {{[0-9]+}}(%rsp), %xmm3
5106 ; SSE42-NEXT: pshufd {{.*#+}} xmm5 = xmm8[2,3,2,3]
5107 ; SSE42-NEXT: pshuflw {{.*#+}} xmm6 = xmm5[2,3,3,3,4,5,6,7]
5108 ; SSE42-NEXT: movdqa %xmm0, %xmm7
5109 ; SSE42-NEXT: psrad %xmm6, %xmm7
5110 ; SSE42-NEXT: pshuflw {{.*#+}} xmm6 = xmm8[2,3,3,3,4,5,6,7]
5111 ; SSE42-NEXT: movdqa %xmm0, %xmm11
5112 ; SSE42-NEXT: psrad %xmm6, %xmm11
5113 ; SSE42-NEXT: pblendw {{.*#+}} xmm11 = xmm11[0,1,2,3],xmm7[4,5,6,7]
5114 ; SSE42-NEXT: pshuflw {{.*#+}} xmm5 = xmm5[0,1,1,1,4,5,6,7]
5115 ; SSE42-NEXT: movdqa %xmm0, %xmm6
5116 ; SSE42-NEXT: psrad %xmm5, %xmm6
5117 ; SSE42-NEXT: pshuflw {{.*#+}} xmm5 = xmm8[0,1,1,1,4,5,6,7]
5118 ; SSE42-NEXT: psrad %xmm5, %xmm0
5119 ; SSE42-NEXT: pblendw {{.*#+}} xmm0 = xmm0[0,1,2,3],xmm6[4,5,6,7]
5120 ; SSE42-NEXT: pblendw {{.*#+}} xmm0 = xmm0[0,1],xmm11[2,3],xmm0[4,5],xmm11[6,7]
5121 ; SSE42-NEXT: pshufd {{.*#+}} xmm5 = xmm9[2,3,2,3]
5122 ; SSE42-NEXT: pshuflw {{.*#+}} xmm6 = xmm5[2,3,3,3,4,5,6,7]
5123 ; SSE42-NEXT: movdqa %xmm1, %xmm7
5124 ; SSE42-NEXT: psrad %xmm6, %xmm7
5125 ; SSE42-NEXT: pshuflw {{.*#+}} xmm6 = xmm9[2,3,3,3,4,5,6,7]
5126 ; SSE42-NEXT: movdqa %xmm1, %xmm8
5127 ; SSE42-NEXT: psrad %xmm6, %xmm8
5128 ; SSE42-NEXT: pblendw {{.*#+}} xmm8 = xmm8[0,1,2,3],xmm7[4,5,6,7]
5129 ; SSE42-NEXT: pshuflw {{.*#+}} xmm5 = xmm5[0,1,1,1,4,5,6,7]
5130 ; SSE42-NEXT: movdqa %xmm1, %xmm6
5131 ; SSE42-NEXT: psrad %xmm5, %xmm6
5132 ; SSE42-NEXT: pshuflw {{.*#+}} xmm5 = xmm9[0,1,1,1,4,5,6,7]
5133 ; SSE42-NEXT: psrad %xmm5, %xmm1
5134 ; SSE42-NEXT: pblendw {{.*#+}} xmm1 = xmm1[0,1,2,3],xmm6[4,5,6,7]
5135 ; SSE42-NEXT: pblendw {{.*#+}} xmm1 = xmm1[0,1],xmm8[2,3],xmm1[4,5],xmm8[6,7]
5136 ; SSE42-NEXT: pshufd {{.*#+}} xmm5 = xmm10[2,3,2,3]
5137 ; SSE42-NEXT: pshuflw {{.*#+}} xmm6 = xmm5[2,3,3,3,4,5,6,7]
5138 ; SSE42-NEXT: movdqa %xmm2, %xmm7
5139 ; SSE42-NEXT: psrad %xmm6, %xmm7
5140 ; SSE42-NEXT: pshuflw {{.*#+}} xmm6 = xmm10[2,3,3,3,4,5,6,7]
5141 ; SSE42-NEXT: movdqa %xmm2, %xmm8
5142 ; SSE42-NEXT: psrad %xmm6, %xmm8
5143 ; SSE42-NEXT: pblendw {{.*#+}} xmm8 = xmm8[0,1,2,3],xmm7[4,5,6,7]
5144 ; SSE42-NEXT: pshuflw {{.*#+}} xmm5 = xmm5[0,1,1,1,4,5,6,7]
5145 ; SSE42-NEXT: movdqa %xmm2, %xmm6
5146 ; SSE42-NEXT: psrad %xmm5, %xmm6
5147 ; SSE42-NEXT: pshuflw {{.*#+}} xmm5 = xmm10[0,1,1,1,4,5,6,7]
5148 ; SSE42-NEXT: psrad %xmm5, %xmm2
5149 ; SSE42-NEXT: pblendw {{.*#+}} xmm2 = xmm2[0,1,2,3],xmm6[4,5,6,7]
5150 ; SSE42-NEXT: pblendw {{.*#+}} xmm2 = xmm2[0,1],xmm8[2,3],xmm2[4,5],xmm8[6,7]
5151 ; SSE42-NEXT: pshufd {{.*#+}} xmm5 = xmm4[2,3,2,3]
5152 ; SSE42-NEXT: pshuflw {{.*#+}} xmm6 = xmm5[2,3,3,3,4,5,6,7]
5153 ; SSE42-NEXT: movdqa %xmm3, %xmm7
5154 ; SSE42-NEXT: psrad %xmm6, %xmm7
5155 ; SSE42-NEXT: pshuflw {{.*#+}} xmm6 = xmm4[2,3,3,3,4,5,6,7]
5156 ; SSE42-NEXT: movdqa %xmm3, %xmm8
5157 ; SSE42-NEXT: psrad %xmm6, %xmm8
5158 ; SSE42-NEXT: pblendw {{.*#+}} xmm8 = xmm8[0,1,2,3],xmm7[4,5,6,7]
5159 ; SSE42-NEXT: pshuflw {{.*#+}} xmm5 = xmm5[0,1,1,1,4,5,6,7]
5160 ; SSE42-NEXT: movdqa %xmm3, %xmm6
5161 ; SSE42-NEXT: psrad %xmm5, %xmm6
5162 ; SSE42-NEXT: pshuflw {{.*#+}} xmm4 = xmm4[0,1,1,1,4,5,6,7]
5163 ; SSE42-NEXT: psrad %xmm4, %xmm3
5164 ; SSE42-NEXT: pblendw {{.*#+}} xmm3 = xmm3[0,1,2,3],xmm6[4,5,6,7]
5165 ; SSE42-NEXT: pblendw {{.*#+}} xmm3 = xmm3[0,1],xmm8[2,3],xmm3[4,5],xmm8[6,7]
5168 ; AVX2-LABEL: ashr_v16i32_commute_swap:
5170 ; AVX2-NEXT: vpunpckhbw {{.*#+}} xmm5 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]
5171 ; AVX2-NEXT: vpmovzxwd {{.*#+}} ymm5 = xmm5[0],zero,xmm5[1],zero,xmm5[2],zero,xmm5[3],zero,xmm5[4],zero,xmm5[5],zero,xmm5[6],zero,xmm5[7],zero
5172 ; AVX2-NEXT: vpslld $31, %ymm5, %ymm5
5173 ; AVX2-NEXT: vpsrad $31, %ymm5, %ymm5
5174 ; AVX2-NEXT: vpandn %ymm4, %ymm5, %ymm4
5175 ; AVX2-NEXT: vpmovzxbd {{.*#+}} ymm0 = 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
5176 ; AVX2-NEXT: vpslld $31, %ymm0, %ymm0
5177 ; AVX2-NEXT: vpsrad $31, %ymm0, %ymm0
5178 ; AVX2-NEXT: vpandn %ymm3, %ymm0, %ymm0
5179 ; AVX2-NEXT: vpsravd %ymm1, %ymm0, %ymm0
5180 ; AVX2-NEXT: vpsravd %ymm2, %ymm4, %ymm1
5183 ; AVX512-LABEL: ashr_v16i32_commute_swap:
5185 ; AVX512-NEXT: vpmovsxbd %xmm0, %zmm0
5186 ; AVX512-NEXT: vpslld $31, %zmm0, %zmm0
5187 ; AVX512-NEXT: vptestnmd %zmm0, %zmm0, %k1
5188 ; AVX512-NEXT: vmovdqa32 %zmm2, %zmm0 {%k1} {z}
5189 ; AVX512-NEXT: vpsravd %zmm1, %zmm0, %zmm0
5191 %s = select <16 x i1> %b, <16 x i32> zeroinitializer, <16 x i32> %y
5192 %r = ashr <16 x i32> %s, %x
5196 define <8 x i32> @ashr_v8i32_cast_cond(i8 noundef zeroext %pb, <8 x i32> noundef %x, <8 x i32> noundef %y) {
5197 ; SSE2-LABEL: ashr_v8i32_cast_cond:
5199 ; SSE2-NEXT: movd %edi, %xmm4
5200 ; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm4[0,0,0,0]
5201 ; SSE2-NEXT: movdqa {{.*#+}} xmm6 = [16,32,64,128]
5202 ; SSE2-NEXT: movdqa %xmm5, %xmm4
5203 ; SSE2-NEXT: pand %xmm6, %xmm4
5204 ; SSE2-NEXT: pcmpeqd %xmm6, %xmm4
5205 ; SSE2-NEXT: pand %xmm3, %xmm4
5206 ; SSE2-NEXT: movdqa {{.*#+}} xmm3 = [1,2,4,8]
5207 ; SSE2-NEXT: pand %xmm3, %xmm5
5208 ; SSE2-NEXT: pcmpeqd %xmm3, %xmm5
5209 ; SSE2-NEXT: pand %xmm2, %xmm5
5210 ; SSE2-NEXT: pshuflw {{.*#+}} xmm2 = xmm5[2,3,3,3,4,5,6,7]
5211 ; SSE2-NEXT: movdqa %xmm0, %xmm3
5212 ; SSE2-NEXT: psrad %xmm2, %xmm3
5213 ; SSE2-NEXT: pshuflw {{.*#+}} xmm6 = xmm5[0,1,1,1,4,5,6,7]
5214 ; SSE2-NEXT: movdqa %xmm0, %xmm2
5215 ; SSE2-NEXT: psrad %xmm6, %xmm2
5216 ; SSE2-NEXT: punpcklqdq {{.*#+}} xmm2 = xmm2[0],xmm3[0]
5217 ; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm5[2,3,2,3]
5218 ; SSE2-NEXT: pshuflw {{.*#+}} xmm5 = xmm3[2,3,3,3,4,5,6,7]
5219 ; SSE2-NEXT: movdqa %xmm0, %xmm6
5220 ; SSE2-NEXT: psrad %xmm5, %xmm6
5221 ; SSE2-NEXT: pshuflw {{.*#+}} xmm3 = xmm3[0,1,1,1,4,5,6,7]
5222 ; SSE2-NEXT: psrad %xmm3, %xmm0
5223 ; SSE2-NEXT: punpckhqdq {{.*#+}} xmm0 = xmm0[1],xmm6[1]
5224 ; SSE2-NEXT: shufps {{.*#+}} xmm2 = xmm2[0,3],xmm0[0,3]
5225 ; SSE2-NEXT: pshuflw {{.*#+}} xmm0 = xmm4[2,3,3,3,4,5,6,7]
5226 ; SSE2-NEXT: movdqa %xmm1, %xmm5
5227 ; SSE2-NEXT: psrad %xmm0, %xmm5
5228 ; SSE2-NEXT: pshuflw {{.*#+}} xmm0 = xmm4[0,1,1,1,4,5,6,7]
5229 ; SSE2-NEXT: movdqa %xmm1, %xmm3
5230 ; SSE2-NEXT: psrad %xmm0, %xmm3
5231 ; SSE2-NEXT: punpcklqdq {{.*#+}} xmm3 = xmm3[0],xmm5[0]
5232 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm4[2,3,2,3]
5233 ; SSE2-NEXT: pshuflw {{.*#+}} xmm4 = xmm0[2,3,3,3,4,5,6,7]
5234 ; SSE2-NEXT: movdqa %xmm1, %xmm5
5235 ; SSE2-NEXT: psrad %xmm4, %xmm5
5236 ; SSE2-NEXT: pshuflw {{.*#+}} xmm0 = xmm0[0,1,1,1,4,5,6,7]
5237 ; SSE2-NEXT: psrad %xmm0, %xmm1
5238 ; SSE2-NEXT: punpckhqdq {{.*#+}} xmm1 = xmm1[1],xmm5[1]
5239 ; SSE2-NEXT: shufps {{.*#+}} xmm3 = xmm3[0,3],xmm1[0,3]
5240 ; SSE2-NEXT: movaps %xmm2, %xmm0
5241 ; SSE2-NEXT: movaps %xmm3, %xmm1
5244 ; SSE42-LABEL: ashr_v8i32_cast_cond:
5246 ; SSE42-NEXT: movd %edi, %xmm4
5247 ; SSE42-NEXT: pshufd {{.*#+}} xmm5 = xmm4[0,0,0,0]
5248 ; SSE42-NEXT: movdqa {{.*#+}} xmm6 = [16,32,64,128]
5249 ; SSE42-NEXT: movdqa %xmm5, %xmm4
5250 ; SSE42-NEXT: pand %xmm6, %xmm4
5251 ; SSE42-NEXT: pcmpeqd %xmm6, %xmm4
5252 ; SSE42-NEXT: pand %xmm3, %xmm4
5253 ; SSE42-NEXT: movdqa {{.*#+}} xmm3 = [1,2,4,8]
5254 ; SSE42-NEXT: pand %xmm3, %xmm5
5255 ; SSE42-NEXT: pcmpeqd %xmm3, %xmm5
5256 ; SSE42-NEXT: pand %xmm2, %xmm5
5257 ; SSE42-NEXT: pshuflw {{.*#+}} xmm2 = xmm5[2,3,3,3,4,5,6,7]
5258 ; SSE42-NEXT: movdqa %xmm0, %xmm3
5259 ; SSE42-NEXT: psrad %xmm2, %xmm3
5260 ; SSE42-NEXT: pshufd {{.*#+}} xmm2 = xmm5[2,3,2,3]
5261 ; SSE42-NEXT: pshuflw {{.*#+}} xmm6 = xmm2[2,3,3,3,4,5,6,7]
5262 ; SSE42-NEXT: movdqa %xmm0, %xmm7
5263 ; SSE42-NEXT: psrad %xmm6, %xmm7
5264 ; SSE42-NEXT: pblendw {{.*#+}} xmm7 = xmm3[0,1,2,3],xmm7[4,5,6,7]
5265 ; SSE42-NEXT: pshuflw {{.*#+}} xmm3 = xmm5[0,1,1,1,4,5,6,7]
5266 ; SSE42-NEXT: movdqa %xmm0, %xmm5
5267 ; SSE42-NEXT: psrad %xmm3, %xmm5
5268 ; SSE42-NEXT: pshuflw {{.*#+}} xmm2 = xmm2[0,1,1,1,4,5,6,7]
5269 ; SSE42-NEXT: psrad %xmm2, %xmm0
5270 ; SSE42-NEXT: pblendw {{.*#+}} xmm0 = xmm5[0,1,2,3],xmm0[4,5,6,7]
5271 ; SSE42-NEXT: pblendw {{.*#+}} xmm0 = xmm0[0,1],xmm7[2,3],xmm0[4,5],xmm7[6,7]
5272 ; SSE42-NEXT: pshuflw {{.*#+}} xmm2 = xmm4[2,3,3,3,4,5,6,7]
5273 ; SSE42-NEXT: movdqa %xmm1, %xmm3
5274 ; SSE42-NEXT: psrad %xmm2, %xmm3
5275 ; SSE42-NEXT: pshufd {{.*#+}} xmm2 = xmm4[2,3,2,3]
5276 ; SSE42-NEXT: pshuflw {{.*#+}} xmm5 = xmm2[2,3,3,3,4,5,6,7]
5277 ; SSE42-NEXT: movdqa %xmm1, %xmm6
5278 ; SSE42-NEXT: psrad %xmm5, %xmm6
5279 ; SSE42-NEXT: pblendw {{.*#+}} xmm6 = xmm3[0,1,2,3],xmm6[4,5,6,7]
5280 ; SSE42-NEXT: pshuflw {{.*#+}} xmm3 = xmm4[0,1,1,1,4,5,6,7]
5281 ; SSE42-NEXT: movdqa %xmm1, %xmm4
5282 ; SSE42-NEXT: psrad %xmm3, %xmm4
5283 ; SSE42-NEXT: pshuflw {{.*#+}} xmm2 = xmm2[0,1,1,1,4,5,6,7]
5284 ; SSE42-NEXT: psrad %xmm2, %xmm1
5285 ; SSE42-NEXT: pblendw {{.*#+}} xmm1 = xmm4[0,1,2,3],xmm1[4,5,6,7]
5286 ; SSE42-NEXT: pblendw {{.*#+}} xmm1 = xmm1[0,1],xmm6[2,3],xmm1[4,5],xmm6[6,7]
5289 ; AVX2-LABEL: ashr_v8i32_cast_cond:
5291 ; AVX2-NEXT: vmovd %edi, %xmm2
5292 ; AVX2-NEXT: vpbroadcastb %xmm2, %ymm2
5293 ; AVX2-NEXT: vmovdqa {{.*#+}} ymm3 = [1,2,4,8,16,32,64,128]
5294 ; AVX2-NEXT: vpand %ymm3, %ymm2, %ymm2
5295 ; AVX2-NEXT: vpcmpeqd %ymm3, %ymm2, %ymm2
5296 ; AVX2-NEXT: vpand %ymm1, %ymm2, %ymm1
5297 ; AVX2-NEXT: vpsravd %ymm1, %ymm0, %ymm0
5300 ; AVX512F-LABEL: ashr_v8i32_cast_cond:
5302 ; AVX512F-NEXT: # kill: def $ymm1 killed $ymm1 def $zmm1
5303 ; AVX512F-NEXT: kmovw %edi, %k1
5304 ; AVX512F-NEXT: vmovdqa32 %zmm1, %zmm1 {%k1} {z}
5305 ; AVX512F-NEXT: vpsravd %ymm1, %ymm0, %ymm0
5306 ; AVX512F-NEXT: retq
5308 ; AVX512VL-LABEL: ashr_v8i32_cast_cond:
5309 ; AVX512VL: # %bb.0:
5310 ; AVX512VL-NEXT: kmovw %edi, %k1
5311 ; AVX512VL-NEXT: vpsravd %ymm1, %ymm0, %ymm0 {%k1}
5312 ; AVX512VL-NEXT: retq
5313 %b = bitcast i8 %pb to <8 x i1>
5314 %s = select <8 x i1> %b, <8 x i32> %y, <8 x i32> zeroinitializer
5315 %r = ashr <8 x i32> %x, %s
5319 define <8 x i64> @ashr_v8i64_cast_cond(i8 noundef zeroext %pb, <8 x i64> noundef %x, <8 x i64> noundef %y) {
5320 ; SSE2-LABEL: ashr_v8i64_cast_cond:
5322 ; SSE2-NEXT: movd %edi, %xmm8
5323 ; SSE2-NEXT: pshufd {{.*#+}} xmm9 = xmm8[0,1,0,1]
5324 ; SSE2-NEXT: movdqa {{.*#+}} xmm10 = [64,128]
5325 ; SSE2-NEXT: movdqa %xmm9, %xmm8
5326 ; SSE2-NEXT: pand %xmm10, %xmm8
5327 ; SSE2-NEXT: pcmpeqd %xmm10, %xmm8
5328 ; SSE2-NEXT: pshufd {{.*#+}} xmm10 = xmm8[1,0,3,2]
5329 ; SSE2-NEXT: pand %xmm7, %xmm8
5330 ; SSE2-NEXT: pand %xmm10, %xmm8
5331 ; SSE2-NEXT: movdqa {{.*#+}} xmm10 = [16,32]
5332 ; SSE2-NEXT: movdqa %xmm9, %xmm7
5333 ; SSE2-NEXT: pand %xmm10, %xmm7
5334 ; SSE2-NEXT: pcmpeqd %xmm10, %xmm7
5335 ; SSE2-NEXT: pshufd {{.*#+}} xmm10 = xmm7[1,0,3,2]
5336 ; SSE2-NEXT: pand %xmm6, %xmm7
5337 ; SSE2-NEXT: pand %xmm10, %xmm7
5338 ; SSE2-NEXT: movdqa {{.*#+}} xmm10 = [4,8]
5339 ; SSE2-NEXT: movdqa %xmm9, %xmm6
5340 ; SSE2-NEXT: pand %xmm10, %xmm6
5341 ; SSE2-NEXT: pcmpeqd %xmm10, %xmm6
5342 ; SSE2-NEXT: pshufd {{.*#+}} xmm10 = xmm6[1,0,3,2]
5343 ; SSE2-NEXT: pand %xmm5, %xmm6
5344 ; SSE2-NEXT: pand %xmm10, %xmm6
5345 ; SSE2-NEXT: movdqa {{.*#+}} xmm5 = [1,2]
5346 ; SSE2-NEXT: pand %xmm5, %xmm9
5347 ; SSE2-NEXT: pcmpeqd %xmm5, %xmm9
5348 ; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm9[1,0,3,2]
5349 ; SSE2-NEXT: pand %xmm4, %xmm9
5350 ; SSE2-NEXT: pand %xmm5, %xmm9
5351 ; SSE2-NEXT: movdqa {{.*#+}} xmm4 = [9223372036854775808,9223372036854775808]
5352 ; SSE2-NEXT: movdqa %xmm4, %xmm5
5353 ; SSE2-NEXT: psrlq %xmm9, %xmm5
5354 ; SSE2-NEXT: pshufd {{.*#+}} xmm10 = xmm9[2,3,2,3]
5355 ; SSE2-NEXT: movdqa %xmm4, %xmm11
5356 ; SSE2-NEXT: psrlq %xmm10, %xmm11
5357 ; SSE2-NEXT: movsd {{.*#+}} xmm11 = xmm5[0],xmm11[1]
5358 ; SSE2-NEXT: movdqa %xmm0, %xmm5
5359 ; SSE2-NEXT: psrlq %xmm9, %xmm5
5360 ; SSE2-NEXT: psrlq %xmm10, %xmm0
5361 ; SSE2-NEXT: movsd {{.*#+}} xmm0 = xmm5[0],xmm0[1]
5362 ; SSE2-NEXT: xorpd %xmm11, %xmm0
5363 ; SSE2-NEXT: psubq %xmm11, %xmm0
5364 ; SSE2-NEXT: movdqa %xmm4, %xmm5
5365 ; SSE2-NEXT: psrlq %xmm6, %xmm5
5366 ; SSE2-NEXT: pshufd {{.*#+}} xmm9 = xmm6[2,3,2,3]
5367 ; SSE2-NEXT: movdqa %xmm4, %xmm10
5368 ; SSE2-NEXT: psrlq %xmm9, %xmm10
5369 ; SSE2-NEXT: movsd {{.*#+}} xmm10 = xmm5[0],xmm10[1]
5370 ; SSE2-NEXT: movdqa %xmm1, %xmm5
5371 ; SSE2-NEXT: psrlq %xmm6, %xmm5
5372 ; SSE2-NEXT: psrlq %xmm9, %xmm1
5373 ; SSE2-NEXT: movsd {{.*#+}} xmm1 = xmm5[0],xmm1[1]
5374 ; SSE2-NEXT: xorpd %xmm10, %xmm1
5375 ; SSE2-NEXT: psubq %xmm10, %xmm1
5376 ; SSE2-NEXT: movdqa %xmm4, %xmm5
5377 ; SSE2-NEXT: psrlq %xmm7, %xmm5
5378 ; SSE2-NEXT: pshufd {{.*#+}} xmm6 = xmm7[2,3,2,3]
5379 ; SSE2-NEXT: movdqa %xmm4, %xmm9
5380 ; SSE2-NEXT: psrlq %xmm6, %xmm9
5381 ; SSE2-NEXT: movsd {{.*#+}} xmm9 = xmm5[0],xmm9[1]
5382 ; SSE2-NEXT: movdqa %xmm2, %xmm5
5383 ; SSE2-NEXT: psrlq %xmm7, %xmm5
5384 ; SSE2-NEXT: psrlq %xmm6, %xmm2
5385 ; SSE2-NEXT: movsd {{.*#+}} xmm2 = xmm5[0],xmm2[1]
5386 ; SSE2-NEXT: xorpd %xmm9, %xmm2
5387 ; SSE2-NEXT: psubq %xmm9, %xmm2
5388 ; SSE2-NEXT: movdqa %xmm4, %xmm5
5389 ; SSE2-NEXT: psrlq %xmm8, %xmm5
5390 ; SSE2-NEXT: pshufd {{.*#+}} xmm6 = xmm8[2,3,2,3]
5391 ; SSE2-NEXT: psrlq %xmm6, %xmm4
5392 ; SSE2-NEXT: movsd {{.*#+}} xmm4 = xmm5[0],xmm4[1]
5393 ; SSE2-NEXT: movdqa %xmm3, %xmm5
5394 ; SSE2-NEXT: psrlq %xmm8, %xmm5
5395 ; SSE2-NEXT: psrlq %xmm6, %xmm3
5396 ; SSE2-NEXT: movsd {{.*#+}} xmm3 = xmm5[0],xmm3[1]
5397 ; SSE2-NEXT: xorpd %xmm4, %xmm3
5398 ; SSE2-NEXT: psubq %xmm4, %xmm3
5401 ; SSE42-LABEL: ashr_v8i64_cast_cond:
5403 ; SSE42-NEXT: movd %edi, %xmm8
5404 ; SSE42-NEXT: pshufd {{.*#+}} xmm9 = xmm8[0,1,0,1]
5405 ; SSE42-NEXT: movdqa {{.*#+}} xmm10 = [64,128]
5406 ; SSE42-NEXT: movdqa %xmm9, %xmm8
5407 ; SSE42-NEXT: pand %xmm10, %xmm8
5408 ; SSE42-NEXT: pcmpeqq %xmm10, %xmm8
5409 ; SSE42-NEXT: pand %xmm7, %xmm8
5410 ; SSE42-NEXT: movdqa {{.*#+}} xmm10 = [16,32]
5411 ; SSE42-NEXT: movdqa %xmm9, %xmm7
5412 ; SSE42-NEXT: pand %xmm10, %xmm7
5413 ; SSE42-NEXT: pcmpeqq %xmm10, %xmm7
5414 ; SSE42-NEXT: pand %xmm6, %xmm7
5415 ; SSE42-NEXT: movdqa {{.*#+}} xmm10 = [4,8]
5416 ; SSE42-NEXT: movdqa %xmm9, %xmm6
5417 ; SSE42-NEXT: pand %xmm10, %xmm6
5418 ; SSE42-NEXT: pcmpeqq %xmm10, %xmm6
5419 ; SSE42-NEXT: pand %xmm5, %xmm6
5420 ; SSE42-NEXT: movdqa {{.*#+}} xmm5 = [1,2]
5421 ; SSE42-NEXT: pand %xmm5, %xmm9
5422 ; SSE42-NEXT: pcmpeqq %xmm5, %xmm9
5423 ; SSE42-NEXT: pand %xmm4, %xmm9
5424 ; SSE42-NEXT: movdqa {{.*#+}} xmm4 = [9223372036854775808,9223372036854775808]
5425 ; SSE42-NEXT: movdqa %xmm4, %xmm5
5426 ; SSE42-NEXT: psrlq %xmm9, %xmm5
5427 ; SSE42-NEXT: pshufd {{.*#+}} xmm10 = xmm9[2,3,2,3]
5428 ; SSE42-NEXT: movdqa %xmm4, %xmm11
5429 ; SSE42-NEXT: psrlq %xmm10, %xmm11
5430 ; SSE42-NEXT: pblendw {{.*#+}} xmm11 = xmm5[0,1,2,3],xmm11[4,5,6,7]
5431 ; SSE42-NEXT: movdqa %xmm0, %xmm5
5432 ; SSE42-NEXT: psrlq %xmm9, %xmm5
5433 ; SSE42-NEXT: psrlq %xmm10, %xmm0
5434 ; SSE42-NEXT: pblendw {{.*#+}} xmm0 = xmm5[0,1,2,3],xmm0[4,5,6,7]
5435 ; SSE42-NEXT: pxor %xmm11, %xmm0
5436 ; SSE42-NEXT: psubq %xmm11, %xmm0
5437 ; SSE42-NEXT: movdqa %xmm4, %xmm5
5438 ; SSE42-NEXT: psrlq %xmm6, %xmm5
5439 ; SSE42-NEXT: pshufd {{.*#+}} xmm9 = xmm6[2,3,2,3]
5440 ; SSE42-NEXT: movdqa %xmm4, %xmm10
5441 ; SSE42-NEXT: psrlq %xmm9, %xmm10
5442 ; SSE42-NEXT: pblendw {{.*#+}} xmm10 = xmm5[0,1,2,3],xmm10[4,5,6,7]
5443 ; SSE42-NEXT: movdqa %xmm1, %xmm5
5444 ; SSE42-NEXT: psrlq %xmm6, %xmm5
5445 ; SSE42-NEXT: psrlq %xmm9, %xmm1
5446 ; SSE42-NEXT: pblendw {{.*#+}} xmm1 = xmm5[0,1,2,3],xmm1[4,5,6,7]
5447 ; SSE42-NEXT: pxor %xmm10, %xmm1
5448 ; SSE42-NEXT: psubq %xmm10, %xmm1
5449 ; SSE42-NEXT: movdqa %xmm4, %xmm5
5450 ; SSE42-NEXT: psrlq %xmm7, %xmm5
5451 ; SSE42-NEXT: pshufd {{.*#+}} xmm6 = xmm7[2,3,2,3]
5452 ; SSE42-NEXT: movdqa %xmm4, %xmm9
5453 ; SSE42-NEXT: psrlq %xmm6, %xmm9
5454 ; SSE42-NEXT: pblendw {{.*#+}} xmm9 = xmm5[0,1,2,3],xmm9[4,5,6,7]
5455 ; SSE42-NEXT: movdqa %xmm2, %xmm5
5456 ; SSE42-NEXT: psrlq %xmm7, %xmm5
5457 ; SSE42-NEXT: psrlq %xmm6, %xmm2
5458 ; SSE42-NEXT: pblendw {{.*#+}} xmm2 = xmm5[0,1,2,3],xmm2[4,5,6,7]
5459 ; SSE42-NEXT: pxor %xmm9, %xmm2
5460 ; SSE42-NEXT: psubq %xmm9, %xmm2
5461 ; SSE42-NEXT: movdqa %xmm4, %xmm5
5462 ; SSE42-NEXT: psrlq %xmm8, %xmm5
5463 ; SSE42-NEXT: pshufd {{.*#+}} xmm6 = xmm8[2,3,2,3]
5464 ; SSE42-NEXT: psrlq %xmm6, %xmm4
5465 ; SSE42-NEXT: pblendw {{.*#+}} xmm4 = xmm5[0,1,2,3],xmm4[4,5,6,7]
5466 ; SSE42-NEXT: movdqa %xmm3, %xmm5
5467 ; SSE42-NEXT: psrlq %xmm8, %xmm5
5468 ; SSE42-NEXT: psrlq %xmm6, %xmm3
5469 ; SSE42-NEXT: pblendw {{.*#+}} xmm3 = xmm5[0,1,2,3],xmm3[4,5,6,7]
5470 ; SSE42-NEXT: pxor %xmm4, %xmm3
5471 ; SSE42-NEXT: psubq %xmm4, %xmm3
5474 ; AVX2-LABEL: ashr_v8i64_cast_cond:
5476 ; AVX2-NEXT: vmovd %edi, %xmm4
5477 ; AVX2-NEXT: vpbroadcastb %xmm4, %ymm4
5478 ; AVX2-NEXT: vmovdqa {{.*#+}} ymm5 = [16,32,64,128]
5479 ; AVX2-NEXT: vpand %ymm5, %ymm4, %ymm6
5480 ; AVX2-NEXT: vpcmpeqq %ymm5, %ymm6, %ymm5
5481 ; AVX2-NEXT: vpand %ymm3, %ymm5, %ymm3
5482 ; AVX2-NEXT: vmovdqa {{.*#+}} ymm5 = [1,2,4,8]
5483 ; AVX2-NEXT: vpand %ymm5, %ymm4, %ymm4
5484 ; AVX2-NEXT: vpcmpeqq %ymm5, %ymm4, %ymm4
5485 ; AVX2-NEXT: vpand %ymm2, %ymm4, %ymm2
5486 ; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm4 = [9223372036854775808,9223372036854775808,9223372036854775808,9223372036854775808]
5487 ; AVX2-NEXT: vpsrlvq %ymm2, %ymm4, %ymm5
5488 ; AVX2-NEXT: vpsrlvq %ymm2, %ymm0, %ymm0
5489 ; AVX2-NEXT: vpxor %ymm5, %ymm0, %ymm0
5490 ; AVX2-NEXT: vpsubq %ymm5, %ymm0, %ymm0
5491 ; AVX2-NEXT: vpsrlvq %ymm3, %ymm4, %ymm2
5492 ; AVX2-NEXT: vpsrlvq %ymm3, %ymm1, %ymm1
5493 ; AVX2-NEXT: vpxor %ymm2, %ymm1, %ymm1
5494 ; AVX2-NEXT: vpsubq %ymm2, %ymm1, %ymm1
5497 ; AVX512-LABEL: ashr_v8i64_cast_cond:
5499 ; AVX512-NEXT: kmovw %edi, %k1
5500 ; AVX512-NEXT: vpsravq %zmm1, %zmm0, %zmm0 {%k1}
5502 %b = bitcast i8 %pb to <8 x i1>
5503 %s = select <8 x i1> %b, <8 x i64> %y, <8 x i64> zeroinitializer
5504 %r = ashr <8 x i64> %x, %s
5508 define <8 x i64> @select_sdiv_neutral_constant_v8i64(<8 x i1> %b, <8 x i64> %x, <8 x i64> %y) {
5509 ; SSE2-LABEL: select_sdiv_neutral_constant_v8i64:
5511 ; SSE2-NEXT: pshufd {{.*#+}} xmm8 = xmm0[2,2,2,2]
5512 ; SSE2-NEXT: pshufhw {{.*#+}} xmm8 = xmm8[0,1,2,3,5,5,5,5]
5513 ; SSE2-NEXT: pshufd {{.*#+}} xmm8 = xmm8[0,0,2,2]
5514 ; SSE2-NEXT: pslld $31, %xmm8
5515 ; SSE2-NEXT: psrad $31, %xmm8
5516 ; SSE2-NEXT: movdqa %xmm8, %xmm10
5517 ; SSE2-NEXT: pandn %xmm7, %xmm10
5518 ; SSE2-NEXT: movdqa {{.*#+}} xmm9 = [1,1]
5519 ; SSE2-NEXT: pand %xmm9, %xmm8
5520 ; SSE2-NEXT: por %xmm10, %xmm8
5521 ; SSE2-NEXT: pshufd {{.*#+}} xmm7 = xmm0[1,1,1,1]
5522 ; SSE2-NEXT: pshufhw {{.*#+}} xmm7 = xmm7[0,1,2,3,5,5,5,5]
5523 ; SSE2-NEXT: pshufd {{.*#+}} xmm7 = xmm7[0,0,2,2]
5524 ; SSE2-NEXT: pslld $31, %xmm7
5525 ; SSE2-NEXT: psrad $31, %xmm7
5526 ; SSE2-NEXT: movdqa %xmm7, %xmm10
5527 ; SSE2-NEXT: pandn %xmm6, %xmm10
5528 ; SSE2-NEXT: pand %xmm9, %xmm7
5529 ; SSE2-NEXT: por %xmm10, %xmm7
5530 ; SSE2-NEXT: pshufd {{.*#+}} xmm6 = xmm0[0,0,0,0]
5531 ; SSE2-NEXT: pshufhw {{.*#+}} xmm6 = xmm6[0,1,2,3,5,5,5,5]
5532 ; SSE2-NEXT: pshufd {{.*#+}} xmm6 = xmm6[0,0,2,2]
5533 ; SSE2-NEXT: pslld $31, %xmm6
5534 ; SSE2-NEXT: psrad $31, %xmm6
5535 ; SSE2-NEXT: movdqa %xmm6, %xmm10
5536 ; SSE2-NEXT: pandn %xmm5, %xmm10
5537 ; SSE2-NEXT: pand %xmm9, %xmm6
5538 ; SSE2-NEXT: por %xmm10, %xmm6
5539 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[3,3,3,3]
5540 ; SSE2-NEXT: pshufhw {{.*#+}} xmm0 = xmm0[0,1,2,3,5,5,5,5]
5541 ; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm0[0,0,2,2]
5542 ; SSE2-NEXT: pslld $31, %xmm5
5543 ; SSE2-NEXT: psrad $31, %xmm5
5544 ; SSE2-NEXT: pand %xmm5, %xmm9
5545 ; SSE2-NEXT: pandn {{[0-9]+}}(%rsp), %xmm5
5546 ; SSE2-NEXT: por %xmm9, %xmm5
5547 ; SSE2-NEXT: movq %xmm6, %rcx
5548 ; SSE2-NEXT: movq %xmm1, %rax
5550 ; SSE2-NEXT: idivq %rcx
5551 ; SSE2-NEXT: movq %rax, %xmm0
5552 ; SSE2-NEXT: pshufd {{.*#+}} xmm6 = xmm6[2,3,2,3]
5553 ; SSE2-NEXT: movq %xmm6, %rcx
5554 ; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm1[2,3,2,3]
5555 ; SSE2-NEXT: movq %xmm1, %rax
5557 ; SSE2-NEXT: idivq %rcx
5558 ; SSE2-NEXT: movq %rax, %xmm1
5559 ; SSE2-NEXT: punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
5560 ; SSE2-NEXT: movq %xmm7, %rcx
5561 ; SSE2-NEXT: movq %xmm2, %rax
5563 ; SSE2-NEXT: idivq %rcx
5564 ; SSE2-NEXT: movq %rax, %xmm1
5565 ; SSE2-NEXT: pshufd {{.*#+}} xmm6 = xmm7[2,3,2,3]
5566 ; SSE2-NEXT: movq %xmm6, %rcx
5567 ; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm2[2,3,2,3]
5568 ; SSE2-NEXT: movq %xmm2, %rax
5570 ; SSE2-NEXT: idivq %rcx
5571 ; SSE2-NEXT: movq %rax, %xmm2
5572 ; SSE2-NEXT: punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm2[0]
5573 ; SSE2-NEXT: movq %xmm8, %rcx
5574 ; SSE2-NEXT: movq %xmm3, %rax
5576 ; SSE2-NEXT: idivq %rcx
5577 ; SSE2-NEXT: movq %rax, %xmm2
5578 ; SSE2-NEXT: pshufd {{.*#+}} xmm6 = xmm8[2,3,2,3]
5579 ; SSE2-NEXT: movq %xmm6, %rcx
5580 ; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm3[2,3,2,3]
5581 ; SSE2-NEXT: movq %xmm3, %rax
5583 ; SSE2-NEXT: idivq %rcx
5584 ; SSE2-NEXT: movq %rax, %xmm3
5585 ; SSE2-NEXT: punpcklqdq {{.*#+}} xmm2 = xmm2[0],xmm3[0]
5586 ; SSE2-NEXT: movq %xmm5, %rcx
5587 ; SSE2-NEXT: movq %xmm4, %rax
5589 ; SSE2-NEXT: idivq %rcx
5590 ; SSE2-NEXT: movq %rax, %xmm3
5591 ; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm5[2,3,2,3]
5592 ; SSE2-NEXT: movq %xmm5, %rcx
5593 ; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm4[2,3,2,3]
5594 ; SSE2-NEXT: movq %xmm4, %rax
5596 ; SSE2-NEXT: idivq %rcx
5597 ; SSE2-NEXT: movq %rax, %xmm4
5598 ; SSE2-NEXT: punpcklqdq {{.*#+}} xmm3 = xmm3[0],xmm4[0]
5601 ; SSE42-LABEL: select_sdiv_neutral_constant_v8i64:
5603 ; SSE42-NEXT: movdqa %xmm0, %xmm8
5604 ; SSE42-NEXT: movapd {{[0-9]+}}(%rsp), %xmm9
5605 ; SSE42-NEXT: pshufd {{.*#+}} xmm0 = xmm0[3,3,3,3]
5606 ; SSE42-NEXT: pmovzxwq {{.*#+}} xmm0 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero
5607 ; SSE42-NEXT: psllq $63, %xmm0
5608 ; SSE42-NEXT: movapd {{.*#+}} xmm10 = [1,1]
5609 ; SSE42-NEXT: blendvpd %xmm0, %xmm10, %xmm9
5610 ; SSE42-NEXT: pshufd {{.*#+}} xmm0 = xmm8[2,3,2,3]
5611 ; SSE42-NEXT: pmovzxwq {{.*#+}} xmm0 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero
5612 ; SSE42-NEXT: psllq $63, %xmm0
5613 ; SSE42-NEXT: blendvpd %xmm0, %xmm10, %xmm7
5614 ; SSE42-NEXT: pshufd {{.*#+}} xmm0 = xmm8[1,1,1,1]
5615 ; SSE42-NEXT: pmovzxwq {{.*#+}} xmm0 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero
5616 ; SSE42-NEXT: psllq $63, %xmm0
5617 ; SSE42-NEXT: blendvpd %xmm0, %xmm10, %xmm6
5618 ; SSE42-NEXT: pmovzxwq {{.*#+}} xmm0 = xmm8[0],zero,zero,zero,xmm8[1],zero,zero,zero
5619 ; SSE42-NEXT: psllq $63, %xmm0
5620 ; SSE42-NEXT: blendvpd %xmm0, %xmm10, %xmm5
5621 ; SSE42-NEXT: pextrq $1, %xmm5, %rcx
5622 ; SSE42-NEXT: pextrq $1, %xmm1, %rax
5624 ; SSE42-NEXT: idivq %rcx
5625 ; SSE42-NEXT: movq %rax, %xmm8
5626 ; SSE42-NEXT: movq %xmm5, %rcx
5627 ; SSE42-NEXT: movq %xmm1, %rax
5629 ; SSE42-NEXT: idivq %rcx
5630 ; SSE42-NEXT: movq %rax, %xmm0
5631 ; SSE42-NEXT: punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm8[0]
5632 ; SSE42-NEXT: pextrq $1, %xmm6, %rcx
5633 ; SSE42-NEXT: pextrq $1, %xmm2, %rax
5635 ; SSE42-NEXT: idivq %rcx
5636 ; SSE42-NEXT: movq %rax, %xmm5
5637 ; SSE42-NEXT: movq %xmm6, %rcx
5638 ; SSE42-NEXT: movq %xmm2, %rax
5640 ; SSE42-NEXT: idivq %rcx
5641 ; SSE42-NEXT: movq %rax, %xmm1
5642 ; SSE42-NEXT: punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm5[0]
5643 ; SSE42-NEXT: pextrq $1, %xmm7, %rcx
5644 ; SSE42-NEXT: pextrq $1, %xmm3, %rax
5646 ; SSE42-NEXT: idivq %rcx
5647 ; SSE42-NEXT: movq %rax, %xmm5
5648 ; SSE42-NEXT: movq %xmm7, %rcx
5649 ; SSE42-NEXT: movq %xmm3, %rax
5651 ; SSE42-NEXT: idivq %rcx
5652 ; SSE42-NEXT: movq %rax, %xmm2
5653 ; SSE42-NEXT: punpcklqdq {{.*#+}} xmm2 = xmm2[0],xmm5[0]
5654 ; SSE42-NEXT: pextrq $1, %xmm9, %rcx
5655 ; SSE42-NEXT: pextrq $1, %xmm4, %rax
5657 ; SSE42-NEXT: idivq %rcx
5658 ; SSE42-NEXT: movq %rax, %xmm5
5659 ; SSE42-NEXT: movq %xmm9, %rcx
5660 ; SSE42-NEXT: movq %xmm4, %rax
5662 ; SSE42-NEXT: idivq %rcx
5663 ; SSE42-NEXT: movq %rax, %xmm3
5664 ; SSE42-NEXT: punpcklqdq {{.*#+}} xmm3 = xmm3[0],xmm5[0]
5667 ; AVX2-LABEL: select_sdiv_neutral_constant_v8i64:
5669 ; AVX2-NEXT: vpmovzxwd {{.*#+}} xmm5 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero
5670 ; AVX2-NEXT: vpslld $31, %xmm5, %xmm5
5671 ; AVX2-NEXT: vpmovsxdq %xmm5, %ymm5
5672 ; AVX2-NEXT: vbroadcastsd {{.*#+}} ymm6 = [1,1,1,1]
5673 ; AVX2-NEXT: vblendvpd %ymm5, %ymm6, %ymm3, %ymm5
5674 ; AVX2-NEXT: vpunpckhwd {{.*#+}} xmm0 = xmm0[4,4,5,5,6,6,7,7]
5675 ; AVX2-NEXT: vpslld $31, %xmm0, %xmm0
5676 ; AVX2-NEXT: vpmovsxdq %xmm0, %ymm0
5677 ; AVX2-NEXT: vblendvpd %ymm0, %ymm6, %ymm4, %ymm3
5678 ; AVX2-NEXT: vextractf128 $1, %ymm5, %xmm0
5679 ; AVX2-NEXT: vpextrq $1, %xmm0, %rcx
5680 ; AVX2-NEXT: vextracti128 $1, %ymm1, %xmm4
5681 ; AVX2-NEXT: vpextrq $1, %xmm4, %rax
5683 ; AVX2-NEXT: idivq %rcx
5684 ; AVX2-NEXT: vmovq %rax, %xmm6
5685 ; AVX2-NEXT: vmovq %xmm0, %rcx
5686 ; AVX2-NEXT: vmovq %xmm4, %rax
5688 ; AVX2-NEXT: idivq %rcx
5689 ; AVX2-NEXT: vmovq %rax, %xmm0
5690 ; AVX2-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm6[0]
5691 ; AVX2-NEXT: vpextrq $1, %xmm5, %rcx
5692 ; AVX2-NEXT: vpextrq $1, %xmm1, %rax
5694 ; AVX2-NEXT: idivq %rcx
5695 ; AVX2-NEXT: vmovq %rax, %xmm4
5696 ; AVX2-NEXT: vmovq %xmm5, %rcx
5697 ; AVX2-NEXT: vmovq %xmm1, %rax
5699 ; AVX2-NEXT: idivq %rcx
5700 ; AVX2-NEXT: vmovq %rax, %xmm1
5701 ; AVX2-NEXT: vpunpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm4[0]
5702 ; AVX2-NEXT: vinserti128 $1, %xmm0, %ymm1, %ymm0
5703 ; AVX2-NEXT: vextractf128 $1, %ymm3, %xmm1
5704 ; AVX2-NEXT: vpextrq $1, %xmm1, %rcx
5705 ; AVX2-NEXT: vextracti128 $1, %ymm2, %xmm4
5706 ; AVX2-NEXT: vpextrq $1, %xmm4, %rax
5708 ; AVX2-NEXT: idivq %rcx
5709 ; AVX2-NEXT: vmovq %rax, %xmm5
5710 ; AVX2-NEXT: vmovq %xmm1, %rcx
5711 ; AVX2-NEXT: vmovq %xmm4, %rax
5713 ; AVX2-NEXT: idivq %rcx
5714 ; AVX2-NEXT: vmovq %rax, %xmm1
5715 ; AVX2-NEXT: vpunpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm5[0]
5716 ; AVX2-NEXT: vpextrq $1, %xmm3, %rcx
5717 ; AVX2-NEXT: vpextrq $1, %xmm2, %rax
5719 ; AVX2-NEXT: idivq %rcx
5720 ; AVX2-NEXT: vmovq %rax, %xmm4
5721 ; AVX2-NEXT: vmovq %xmm3, %rcx
5722 ; AVX2-NEXT: vmovq %xmm2, %rax
5724 ; AVX2-NEXT: idivq %rcx
5725 ; AVX2-NEXT: vmovq %rax, %xmm2
5726 ; AVX2-NEXT: vpunpcklqdq {{.*#+}} xmm2 = xmm2[0],xmm4[0]
5727 ; AVX2-NEXT: vinserti128 $1, %xmm1, %ymm2, %ymm1
5730 ; AVX512F-LABEL: select_sdiv_neutral_constant_v8i64:
5732 ; AVX512F-NEXT: vpmovsxwq %xmm0, %zmm0
5733 ; AVX512F-NEXT: vpsllq $63, %zmm0, %zmm0
5734 ; AVX512F-NEXT: vptestmq %zmm0, %zmm0, %k1
5735 ; AVX512F-NEXT: vpbroadcastq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %zmm2 {%k1}
5736 ; AVX512F-NEXT: vextracti32x4 $3, %zmm2, %xmm0
5737 ; AVX512F-NEXT: vpextrq $1, %xmm0, %rcx
5738 ; AVX512F-NEXT: vextracti32x4 $3, %zmm1, %xmm3
5739 ; AVX512F-NEXT: vpextrq $1, %xmm3, %rax
5740 ; AVX512F-NEXT: cqto
5741 ; AVX512F-NEXT: idivq %rcx
5742 ; AVX512F-NEXT: vmovq %rax, %xmm4
5743 ; AVX512F-NEXT: vmovq %xmm0, %rcx
5744 ; AVX512F-NEXT: vmovq %xmm3, %rax
5745 ; AVX512F-NEXT: cqto
5746 ; AVX512F-NEXT: idivq %rcx
5747 ; AVX512F-NEXT: vmovq %rax, %xmm0
5748 ; AVX512F-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm4[0]
5749 ; AVX512F-NEXT: vextracti32x4 $2, %zmm2, %xmm3
5750 ; AVX512F-NEXT: vpextrq $1, %xmm3, %rcx
5751 ; AVX512F-NEXT: vextracti32x4 $2, %zmm1, %xmm4
5752 ; AVX512F-NEXT: vpextrq $1, %xmm4, %rax
5753 ; AVX512F-NEXT: cqto
5754 ; AVX512F-NEXT: idivq %rcx
5755 ; AVX512F-NEXT: vmovq %rax, %xmm5
5756 ; AVX512F-NEXT: vmovq %xmm3, %rcx
5757 ; AVX512F-NEXT: vmovq %xmm4, %rax
5758 ; AVX512F-NEXT: cqto
5759 ; AVX512F-NEXT: idivq %rcx
5760 ; AVX512F-NEXT: vmovq %rax, %xmm3
5761 ; AVX512F-NEXT: vpunpcklqdq {{.*#+}} xmm3 = xmm3[0],xmm5[0]
5762 ; AVX512F-NEXT: vinserti128 $1, %xmm0, %ymm3, %ymm0
5763 ; AVX512F-NEXT: vextracti128 $1, %ymm2, %xmm3
5764 ; AVX512F-NEXT: vpextrq $1, %xmm3, %rcx
5765 ; AVX512F-NEXT: vextracti128 $1, %ymm1, %xmm4
5766 ; AVX512F-NEXT: vpextrq $1, %xmm4, %rax
5767 ; AVX512F-NEXT: cqto
5768 ; AVX512F-NEXT: idivq %rcx
5769 ; AVX512F-NEXT: vmovq %rax, %xmm5
5770 ; AVX512F-NEXT: vmovq %xmm3, %rcx
5771 ; AVX512F-NEXT: vmovq %xmm4, %rax
5772 ; AVX512F-NEXT: cqto
5773 ; AVX512F-NEXT: idivq %rcx
5774 ; AVX512F-NEXT: vmovq %rax, %xmm3
5775 ; AVX512F-NEXT: vpunpcklqdq {{.*#+}} xmm3 = xmm3[0],xmm5[0]
5776 ; AVX512F-NEXT: vpextrq $1, %xmm2, %rcx
5777 ; AVX512F-NEXT: vpextrq $1, %xmm1, %rax
5778 ; AVX512F-NEXT: cqto
5779 ; AVX512F-NEXT: idivq %rcx
5780 ; AVX512F-NEXT: vmovq %rax, %xmm4
5781 ; AVX512F-NEXT: vmovq %xmm2, %rcx
5782 ; AVX512F-NEXT: vmovq %xmm1, %rax
5783 ; AVX512F-NEXT: cqto
5784 ; AVX512F-NEXT: idivq %rcx
5785 ; AVX512F-NEXT: vmovq %rax, %xmm1
5786 ; AVX512F-NEXT: vpunpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm4[0]
5787 ; AVX512F-NEXT: vinserti128 $1, %xmm3, %ymm1, %ymm1
5788 ; AVX512F-NEXT: vinserti64x4 $1, %ymm0, %zmm1, %zmm0
5789 ; AVX512F-NEXT: retq
5791 ; AVX512VL-LABEL: select_sdiv_neutral_constant_v8i64:
5792 ; AVX512VL: # %bb.0:
5793 ; AVX512VL-NEXT: vpmovsxwd %xmm0, %ymm0
5794 ; AVX512VL-NEXT: vpslld $31, %ymm0, %ymm0
5795 ; AVX512VL-NEXT: vptestmd %ymm0, %ymm0, %k1
5796 ; AVX512VL-NEXT: vpbroadcastq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %zmm2 {%k1}
5797 ; AVX512VL-NEXT: vextracti32x4 $3, %zmm2, %xmm0
5798 ; AVX512VL-NEXT: vpextrq $1, %xmm0, %rcx
5799 ; AVX512VL-NEXT: vextracti32x4 $3, %zmm1, %xmm3
5800 ; AVX512VL-NEXT: vpextrq $1, %xmm3, %rax
5801 ; AVX512VL-NEXT: cqto
5802 ; AVX512VL-NEXT: idivq %rcx
5803 ; AVX512VL-NEXT: vmovq %rax, %xmm4
5804 ; AVX512VL-NEXT: vmovq %xmm0, %rcx
5805 ; AVX512VL-NEXT: vmovq %xmm3, %rax
5806 ; AVX512VL-NEXT: cqto
5807 ; AVX512VL-NEXT: idivq %rcx
5808 ; AVX512VL-NEXT: vmovq %rax, %xmm0
5809 ; AVX512VL-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm4[0]
5810 ; AVX512VL-NEXT: vextracti32x4 $2, %zmm2, %xmm3
5811 ; AVX512VL-NEXT: vpextrq $1, %xmm3, %rcx
5812 ; AVX512VL-NEXT: vextracti32x4 $2, %zmm1, %xmm4
5813 ; AVX512VL-NEXT: vpextrq $1, %xmm4, %rax
5814 ; AVX512VL-NEXT: cqto
5815 ; AVX512VL-NEXT: idivq %rcx
5816 ; AVX512VL-NEXT: vmovq %rax, %xmm5
5817 ; AVX512VL-NEXT: vmovq %xmm3, %rcx
5818 ; AVX512VL-NEXT: vmovq %xmm4, %rax
5819 ; AVX512VL-NEXT: cqto
5820 ; AVX512VL-NEXT: idivq %rcx
5821 ; AVX512VL-NEXT: vmovq %rax, %xmm3
5822 ; AVX512VL-NEXT: vpunpcklqdq {{.*#+}} xmm3 = xmm3[0],xmm5[0]
5823 ; AVX512VL-NEXT: vinserti128 $1, %xmm0, %ymm3, %ymm0
5824 ; AVX512VL-NEXT: vextracti128 $1, %ymm2, %xmm3
5825 ; AVX512VL-NEXT: vpextrq $1, %xmm3, %rcx
5826 ; AVX512VL-NEXT: vextracti128 $1, %ymm1, %xmm4
5827 ; AVX512VL-NEXT: vpextrq $1, %xmm4, %rax
5828 ; AVX512VL-NEXT: cqto
5829 ; AVX512VL-NEXT: idivq %rcx
5830 ; AVX512VL-NEXT: vmovq %rax, %xmm5
5831 ; AVX512VL-NEXT: vmovq %xmm3, %rcx
5832 ; AVX512VL-NEXT: vmovq %xmm4, %rax
5833 ; AVX512VL-NEXT: cqto
5834 ; AVX512VL-NEXT: idivq %rcx
5835 ; AVX512VL-NEXT: vmovq %rax, %xmm3
5836 ; AVX512VL-NEXT: vpunpcklqdq {{.*#+}} xmm3 = xmm3[0],xmm5[0]
5837 ; AVX512VL-NEXT: vpextrq $1, %xmm2, %rcx
5838 ; AVX512VL-NEXT: vpextrq $1, %xmm1, %rax
5839 ; AVX512VL-NEXT: cqto
5840 ; AVX512VL-NEXT: idivq %rcx
5841 ; AVX512VL-NEXT: vmovq %rax, %xmm4
5842 ; AVX512VL-NEXT: vmovq %xmm2, %rcx
5843 ; AVX512VL-NEXT: vmovq %xmm1, %rax
5844 ; AVX512VL-NEXT: cqto
5845 ; AVX512VL-NEXT: idivq %rcx
5846 ; AVX512VL-NEXT: vmovq %rax, %xmm1
5847 ; AVX512VL-NEXT: vpunpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm4[0]
5848 ; AVX512VL-NEXT: vinserti128 $1, %xmm3, %ymm1, %ymm1
5849 ; AVX512VL-NEXT: vinserti64x4 $1, %ymm0, %zmm1, %zmm0
5850 ; AVX512VL-NEXT: retq
5851 %sel = select <8 x i1> %b, <8 x i64> <i64 1, i64 1, i64 1, i64 1, i64 1, i64 1, i64 1, i64 1>, <8 x i64> %y
5852 %r = sdiv <8 x i64> %x, %sel