1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2; RUN: llc < %s -mtriple=x86_64-- -mattr=+avx2             | FileCheck %s --check-prefixes=AVX2
3; RUN: llc < %s -mtriple=x86_64-- -mattr=+avx512f          | FileCheck %s --check-prefixes=AVX512,AVX512F
4; RUN: llc < %s -mtriple=x86_64-- -mattr=+avx512f,avx512vl | FileCheck %s --check-prefixes=AVX512,AVX512VL
5
6define <4 x float> @fadd_v4f32(<4 x i1> %b, <4 x float> noundef %x, <4 x float> noundef %y) {
7; AVX2-LABEL: fadd_v4f32:
8; AVX2:       # %bb.0:
9; AVX2-NEXT:    vpslld $31, %xmm0, %xmm0
10; AVX2-NEXT:    vbroadcastss {{.*#+}} xmm3 = [-0.0E+0,-0.0E+0,-0.0E+0,-0.0E+0]
11; AVX2-NEXT:    vblendvps %xmm0, %xmm2, %xmm3, %xmm0
12; AVX2-NEXT:    vaddps %xmm0, %xmm1, %xmm0
13; AVX2-NEXT:    retq
14;
15; AVX512F-LABEL: fadd_v4f32:
16; AVX512F:       # %bb.0:
17; AVX512F-NEXT:    # kill: def $xmm2 killed $xmm2 def $zmm2
18; AVX512F-NEXT:    vpslld $31, %xmm0, %xmm0
19; AVX512F-NEXT:    vptestmd %zmm0, %zmm0, %k1
20; AVX512F-NEXT:    vbroadcastss {{.*#+}} xmm0 = [-0.0E+0,-0.0E+0,-0.0E+0,-0.0E+0]
21; AVX512F-NEXT:    vmovaps %zmm2, %zmm0 {%k1}
22; AVX512F-NEXT:    vaddps %xmm0, %xmm1, %xmm0
23; AVX512F-NEXT:    vzeroupper
24; AVX512F-NEXT:    retq
25;
26; AVX512VL-LABEL: fadd_v4f32:
27; AVX512VL:       # %bb.0:
28; AVX512VL-NEXT:    vpslld $31, %xmm0, %xmm0
29; AVX512VL-NEXT:    vptestmd %xmm0, %xmm0, %k1
30; AVX512VL-NEXT:    vaddps %xmm2, %xmm1, %xmm1 {%k1}
31; AVX512VL-NEXT:    vmovaps %xmm1, %xmm0
32; AVX512VL-NEXT:    retq
33  %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>
34  %r = fadd <4 x float> %x, %s
35  ret <4 x float> %r
36}
37
38define <8 x float> @fadd_v8f32_commute(<8 x i1> %b, <8 x float> noundef %x, <8 x float> noundef %y) {
39; AVX2-LABEL: fadd_v8f32_commute:
40; AVX2:       # %bb.0:
41; 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
42; AVX2-NEXT:    vpslld $31, %ymm0, %ymm0
43; 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]
44; AVX2-NEXT:    vblendvps %ymm0, %ymm2, %ymm3, %ymm0
45; AVX2-NEXT:    vaddps %ymm1, %ymm0, %ymm0
46; AVX2-NEXT:    retq
47;
48; AVX512F-LABEL: fadd_v8f32_commute:
49; AVX512F:       # %bb.0:
50; AVX512F-NEXT:    # kill: def $ymm2 killed $ymm2 def $zmm2
51; AVX512F-NEXT:    vpmovsxwq %xmm0, %zmm0
52; AVX512F-NEXT:    vpsllq $63, %zmm0, %zmm0
53; AVX512F-NEXT:    vptestmq %zmm0, %zmm0, %k1
54; 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]
55; AVX512F-NEXT:    vmovaps %zmm2, %zmm0 {%k1}
56; AVX512F-NEXT:    vaddps %ymm1, %ymm0, %ymm0
57; AVX512F-NEXT:    retq
58;
59; AVX512VL-LABEL: fadd_v8f32_commute:
60; AVX512VL:       # %bb.0:
61; AVX512VL-NEXT:    vpmovsxwd %xmm0, %ymm0
62; AVX512VL-NEXT:    vpslld $31, %ymm0, %ymm0
63; AVX512VL-NEXT:    vptestmd %ymm0, %ymm0, %k1
64; AVX512VL-NEXT:    vaddps %ymm2, %ymm1, %ymm1 {%k1}
65; AVX512VL-NEXT:    vmovaps %ymm1, %ymm0
66; AVX512VL-NEXT:    retq
67  %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>
68  %r = fadd <8 x float> %s, %x
69  ret <8 x float> %r
70}
71
72define <16 x float> @fadd_v16f32_swap(<16 x i1> %b, <16 x float> noundef %x, <16 x float> noundef %y) {
73; AVX2-LABEL: fadd_v16f32_swap:
74; AVX2:       # %bb.0:
75; AVX2-NEXT:    vpmovzxbw {{.*#+}} xmm5 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero
76; 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
77; AVX2-NEXT:    vpslld $31, %ymm5, %ymm5
78; 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]
79; AVX2-NEXT:    vblendvps %ymm5, %ymm6, %ymm3, %ymm3
80; AVX2-NEXT:    vpunpckhbw {{.*#+}} xmm0 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]
81; 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
82; AVX2-NEXT:    vpslld $31, %ymm0, %ymm0
83; AVX2-NEXT:    vblendvps %ymm0, %ymm6, %ymm4, %ymm4
84; AVX2-NEXT:    vaddps %ymm3, %ymm1, %ymm0
85; AVX2-NEXT:    vaddps %ymm4, %ymm2, %ymm1
86; AVX2-NEXT:    retq
87;
88; AVX512-LABEL: fadd_v16f32_swap:
89; AVX512:       # %bb.0:
90; AVX512-NEXT:    vpmovsxbd %xmm0, %zmm0
91; AVX512-NEXT:    vpslld $31, %zmm0, %zmm0
92; AVX512-NEXT:    vptestmd %zmm0, %zmm0, %k1
93; AVX512-NEXT:    vaddps %zmm2, %zmm1, %zmm0
94; AVX512-NEXT:    vmovaps %zmm1, %zmm0 {%k1}
95; AVX512-NEXT:    retq
96  %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
97  %r = fadd <16 x float> %x, %s
98  ret <16 x float> %r
99}
100
101define <16 x float> @fadd_v16f32_commute_swap(<16 x i1> %b, <16 x float> noundef %x, <16 x float> noundef %y) {
102; AVX2-LABEL: fadd_v16f32_commute_swap:
103; AVX2:       # %bb.0:
104; AVX2-NEXT:    vpmovzxbw {{.*#+}} xmm5 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero
105; 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
106; AVX2-NEXT:    vpslld $31, %ymm5, %ymm5
107; 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]
108; AVX2-NEXT:    vblendvps %ymm5, %ymm6, %ymm3, %ymm3
109; AVX2-NEXT:    vpunpckhbw {{.*#+}} xmm0 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]
110; 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
111; AVX2-NEXT:    vpslld $31, %ymm0, %ymm0
112; AVX2-NEXT:    vblendvps %ymm0, %ymm6, %ymm4, %ymm4
113; AVX2-NEXT:    vaddps %ymm1, %ymm3, %ymm0
114; AVX2-NEXT:    vaddps %ymm2, %ymm4, %ymm1
115; AVX2-NEXT:    retq
116;
117; AVX512-LABEL: fadd_v16f32_commute_swap:
118; AVX512:       # %bb.0:
119; AVX512-NEXT:    vpmovsxbd %xmm0, %zmm0
120; AVX512-NEXT:    vpslld $31, %zmm0, %zmm0
121; AVX512-NEXT:    vptestmd %zmm0, %zmm0, %k1
122; AVX512-NEXT:    vaddps %zmm2, %zmm1, %zmm0
123; AVX512-NEXT:    vmovaps %zmm1, %zmm0 {%k1}
124; AVX512-NEXT:    retq
125  %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
126  %r = fadd <16 x float> %s, %x
127  ret <16 x float> %r
128}
129
130define <4 x float> @fsub_v4f32(<4 x i1> %b, <4 x float> noundef %x, <4 x float> noundef %y) {
131; AVX2-LABEL: fsub_v4f32:
132; AVX2:       # %bb.0:
133; AVX2-NEXT:    vpslld $31, %xmm0, %xmm0
134; AVX2-NEXT:    vpsrad $31, %xmm0, %xmm0
135; AVX2-NEXT:    vpand %xmm2, %xmm0, %xmm0
136; AVX2-NEXT:    vsubps %xmm0, %xmm1, %xmm0
137; AVX2-NEXT:    retq
138;
139; AVX512F-LABEL: fsub_v4f32:
140; AVX512F:       # %bb.0:
141; AVX512F-NEXT:    # kill: def $xmm2 killed $xmm2 def $zmm2
142; AVX512F-NEXT:    vpslld $31, %xmm0, %xmm0
143; AVX512F-NEXT:    vptestmd %zmm0, %zmm0, %k1
144; AVX512F-NEXT:    vmovaps %zmm2, %zmm0 {%k1} {z}
145; AVX512F-NEXT:    vsubps %xmm0, %xmm1, %xmm0
146; AVX512F-NEXT:    vzeroupper
147; AVX512F-NEXT:    retq
148;
149; AVX512VL-LABEL: fsub_v4f32:
150; AVX512VL:       # %bb.0:
151; AVX512VL-NEXT:    vpslld $31, %xmm0, %xmm0
152; AVX512VL-NEXT:    vptestmd %xmm0, %xmm0, %k1
153; AVX512VL-NEXT:    vsubps %xmm2, %xmm1, %xmm1 {%k1}
154; AVX512VL-NEXT:    vmovaps %xmm1, %xmm0
155; AVX512VL-NEXT:    retq
156  %s = select <4 x i1> %b, <4 x float> %y, <4 x float> zeroinitializer
157  %r = fsub <4 x float> %x, %s
158  ret <4 x float> %r
159}
160
161; negative test - fsub is not commutative; there is no identity constant for operand 0
162
163define <8 x float> @fsub_v8f32_commute(<8 x i1> %b, <8 x float> noundef %x, <8 x float> noundef %y) {
164; AVX2-LABEL: fsub_v8f32_commute:
165; AVX2:       # %bb.0:
166; 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
167; AVX2-NEXT:    vpslld $31, %ymm0, %ymm0
168; AVX2-NEXT:    vpsrad $31, %ymm0, %ymm0
169; AVX2-NEXT:    vpand %ymm2, %ymm0, %ymm0
170; AVX2-NEXT:    vsubps %ymm1, %ymm0, %ymm0
171; AVX2-NEXT:    retq
172;
173; AVX512F-LABEL: fsub_v8f32_commute:
174; AVX512F:       # %bb.0:
175; AVX512F-NEXT:    # kill: def $ymm2 killed $ymm2 def $zmm2
176; AVX512F-NEXT:    vpmovsxwq %xmm0, %zmm0
177; AVX512F-NEXT:    vpsllq $63, %zmm0, %zmm0
178; AVX512F-NEXT:    vptestmq %zmm0, %zmm0, %k1
179; AVX512F-NEXT:    vmovaps %zmm2, %zmm0 {%k1} {z}
180; AVX512F-NEXT:    vsubps %ymm1, %ymm0, %ymm0
181; AVX512F-NEXT:    retq
182;
183; AVX512VL-LABEL: fsub_v8f32_commute:
184; AVX512VL:       # %bb.0:
185; AVX512VL-NEXT:    vpmovsxwd %xmm0, %ymm0
186; AVX512VL-NEXT:    vpslld $31, %ymm0, %ymm0
187; AVX512VL-NEXT:    vptestmd %ymm0, %ymm0, %k1
188; AVX512VL-NEXT:    vmovaps %ymm2, %ymm0 {%k1} {z}
189; AVX512VL-NEXT:    vsubps %ymm1, %ymm0, %ymm0
190; AVX512VL-NEXT:    retq
191  %s = select <8 x i1> %b, <8 x float> %y, <8 x float> zeroinitializer
192  %r = fsub <8 x float> %s, %x
193  ret <8 x float> %r
194}
195
196define <16 x float> @fsub_v16f32_swap(<16 x i1> %b, <16 x float> noundef %x, <16 x float> noundef %y) {
197; AVX2-LABEL: fsub_v16f32_swap:
198; AVX2:       # %bb.0:
199; AVX2-NEXT:    vpunpckhbw {{.*#+}} xmm5 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]
200; 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
201; AVX2-NEXT:    vpslld $31, %ymm5, %ymm5
202; AVX2-NEXT:    vpsrad $31, %ymm5, %ymm5
203; AVX2-NEXT:    vpandn %ymm4, %ymm5, %ymm4
204; AVX2-NEXT:    vpmovzxbw {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero
205; 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
206; AVX2-NEXT:    vpslld $31, %ymm0, %ymm0
207; AVX2-NEXT:    vpsrad $31, %ymm0, %ymm0
208; AVX2-NEXT:    vpandn %ymm3, %ymm0, %ymm0
209; AVX2-NEXT:    vsubps %ymm0, %ymm1, %ymm0
210; AVX2-NEXT:    vsubps %ymm4, %ymm2, %ymm1
211; AVX2-NEXT:    retq
212;
213; AVX512-LABEL: fsub_v16f32_swap:
214; AVX512:       # %bb.0:
215; AVX512-NEXT:    vpmovsxbd %xmm0, %zmm0
216; AVX512-NEXT:    vpslld $31, %zmm0, %zmm0
217; AVX512-NEXT:    vptestmd %zmm0, %zmm0, %k1
218; AVX512-NEXT:    vsubps %zmm2, %zmm1, %zmm0
219; AVX512-NEXT:    vmovaps %zmm1, %zmm0 {%k1}
220; AVX512-NEXT:    retq
221  %s = select <16 x i1> %b, <16 x float> zeroinitializer, <16 x float> %y
222  %r = fsub <16 x float> %x, %s
223  ret <16 x float> %r
224}
225
226; negative test - fsub is not commutative; there is no identity constant for operand 0
227
228define <16 x float> @fsub_v16f32_commute_swap(<16 x i1> %b, <16 x float> noundef %x, <16 x float> noundef %y) {
229; AVX2-LABEL: fsub_v16f32_commute_swap:
230; AVX2:       # %bb.0:
231; AVX2-NEXT:    vpunpckhbw {{.*#+}} xmm5 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]
232; 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
233; AVX2-NEXT:    vpslld $31, %ymm5, %ymm5
234; AVX2-NEXT:    vpsrad $31, %ymm5, %ymm5
235; AVX2-NEXT:    vpandn %ymm4, %ymm5, %ymm4
236; AVX2-NEXT:    vpmovzxbw {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero
237; 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
238; AVX2-NEXT:    vpslld $31, %ymm0, %ymm0
239; AVX2-NEXT:    vpsrad $31, %ymm0, %ymm0
240; AVX2-NEXT:    vpandn %ymm3, %ymm0, %ymm0
241; AVX2-NEXT:    vsubps %ymm1, %ymm0, %ymm0
242; AVX2-NEXT:    vsubps %ymm2, %ymm4, %ymm1
243; AVX2-NEXT:    retq
244;
245; AVX512-LABEL: fsub_v16f32_commute_swap:
246; AVX512:       # %bb.0:
247; AVX512-NEXT:    vpmovsxbd %xmm0, %zmm0
248; AVX512-NEXT:    vpslld $31, %zmm0, %zmm0
249; AVX512-NEXT:    vptestnmd %zmm0, %zmm0, %k1
250; AVX512-NEXT:    vmovaps %zmm2, %zmm0 {%k1} {z}
251; AVX512-NEXT:    vsubps %zmm1, %zmm0, %zmm0
252; AVX512-NEXT:    retq
253  %s = select <16 x i1> %b, <16 x float> zeroinitializer, <16 x float> %y
254  %r = fsub <16 x float> %s, %x
255  ret <16 x float> %r
256}
257
258define <4 x float> @fmul_v4f32(<4 x i1> %b, <4 x float> noundef %x, <4 x float> noundef %y) {
259; AVX2-LABEL: fmul_v4f32:
260; AVX2:       # %bb.0:
261; AVX2-NEXT:    vpslld $31, %xmm0, %xmm0
262; AVX2-NEXT:    vbroadcastss {{.*#+}} xmm3 = [1.0E+0,1.0E+0,1.0E+0,1.0E+0]
263; AVX2-NEXT:    vblendvps %xmm0, %xmm2, %xmm3, %xmm0
264; AVX2-NEXT:    vmulps %xmm0, %xmm1, %xmm0
265; AVX2-NEXT:    retq
266;
267; AVX512F-LABEL: fmul_v4f32:
268; AVX512F:       # %bb.0:
269; AVX512F-NEXT:    # kill: def $xmm2 killed $xmm2 def $zmm2
270; AVX512F-NEXT:    vpslld $31, %xmm0, %xmm0
271; AVX512F-NEXT:    vptestmd %zmm0, %zmm0, %k1
272; AVX512F-NEXT:    vbroadcastss {{.*#+}} xmm0 = [1.0E+0,1.0E+0,1.0E+0,1.0E+0]
273; AVX512F-NEXT:    vmovaps %zmm2, %zmm0 {%k1}
274; AVX512F-NEXT:    vmulps %xmm0, %xmm1, %xmm0
275; AVX512F-NEXT:    vzeroupper
276; AVX512F-NEXT:    retq
277;
278; AVX512VL-LABEL: fmul_v4f32:
279; AVX512VL:       # %bb.0:
280; AVX512VL-NEXT:    vpslld $31, %xmm0, %xmm0
281; AVX512VL-NEXT:    vptestmd %xmm0, %xmm0, %k1
282; AVX512VL-NEXT:    vmulps %xmm2, %xmm1, %xmm1 {%k1}
283; AVX512VL-NEXT:    vmovaps %xmm1, %xmm0
284; AVX512VL-NEXT:    retq
285  %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>
286  %r = fmul <4 x float> %x, %s
287  ret <4 x float> %r
288}
289
290define <8 x float> @fmul_v8f32_commute(<8 x i1> %b, <8 x float> noundef %x, <8 x float> noundef %y) {
291; AVX2-LABEL: fmul_v8f32_commute:
292; AVX2:       # %bb.0:
293; 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
294; AVX2-NEXT:    vpslld $31, %ymm0, %ymm0
295; 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]
296; AVX2-NEXT:    vblendvps %ymm0, %ymm2, %ymm3, %ymm0
297; AVX2-NEXT:    vmulps %ymm1, %ymm0, %ymm0
298; AVX2-NEXT:    retq
299;
300; AVX512F-LABEL: fmul_v8f32_commute:
301; AVX512F:       # %bb.0:
302; AVX512F-NEXT:    # kill: def $ymm2 killed $ymm2 def $zmm2
303; AVX512F-NEXT:    vpmovsxwq %xmm0, %zmm0
304; AVX512F-NEXT:    vpsllq $63, %zmm0, %zmm0
305; AVX512F-NEXT:    vptestmq %zmm0, %zmm0, %k1
306; 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]
307; AVX512F-NEXT:    vmovaps %zmm2, %zmm0 {%k1}
308; AVX512F-NEXT:    vmulps %ymm1, %ymm0, %ymm0
309; AVX512F-NEXT:    retq
310;
311; AVX512VL-LABEL: fmul_v8f32_commute:
312; AVX512VL:       # %bb.0:
313; AVX512VL-NEXT:    vpmovsxwd %xmm0, %ymm0
314; AVX512VL-NEXT:    vpslld $31, %ymm0, %ymm0
315; AVX512VL-NEXT:    vptestmd %ymm0, %ymm0, %k1
316; AVX512VL-NEXT:    vmulps %ymm2, %ymm1, %ymm1 {%k1}
317; AVX512VL-NEXT:    vmovaps %ymm1, %ymm0
318; AVX512VL-NEXT:    retq
319  %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>
320  %r = fmul <8 x float> %s, %x
321  ret <8 x float> %r
322}
323
324define <16 x float> @fmul_v16f32_swap(<16 x i1> %b, <16 x float> noundef %x, <16 x float> noundef %y) {
325; AVX2-LABEL: fmul_v16f32_swap:
326; AVX2:       # %bb.0:
327; AVX2-NEXT:    vpmovzxbw {{.*#+}} xmm5 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero
328; 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
329; AVX2-NEXT:    vpslld $31, %ymm5, %ymm5
330; 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]
331; AVX2-NEXT:    vblendvps %ymm5, %ymm6, %ymm3, %ymm3
332; AVX2-NEXT:    vpunpckhbw {{.*#+}} xmm0 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]
333; 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
334; AVX2-NEXT:    vpslld $31, %ymm0, %ymm0
335; AVX2-NEXT:    vblendvps %ymm0, %ymm6, %ymm4, %ymm4
336; AVX2-NEXT:    vmulps %ymm3, %ymm1, %ymm0
337; AVX2-NEXT:    vmulps %ymm4, %ymm2, %ymm1
338; AVX2-NEXT:    retq
339;
340; AVX512-LABEL: fmul_v16f32_swap:
341; AVX512:       # %bb.0:
342; AVX512-NEXT:    vpmovsxbd %xmm0, %zmm0
343; AVX512-NEXT:    vpslld $31, %zmm0, %zmm0
344; AVX512-NEXT:    vptestmd %zmm0, %zmm0, %k1
345; AVX512-NEXT:    vmulps %zmm2, %zmm1, %zmm0
346; AVX512-NEXT:    vmovaps %zmm1, %zmm0 {%k1}
347; AVX512-NEXT:    retq
348  %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
349  %r = fmul <16 x float> %x, %s
350  ret <16 x float> %r
351}
352
353define <16 x float> @fmul_v16f32_commute_swap(<16 x i1> %b, <16 x float> noundef %x, <16 x float> noundef %y) {
354; AVX2-LABEL: fmul_v16f32_commute_swap:
355; AVX2:       # %bb.0:
356; AVX2-NEXT:    vpmovzxbw {{.*#+}} xmm5 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero
357; 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
358; AVX2-NEXT:    vpslld $31, %ymm5, %ymm5
359; 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]
360; AVX2-NEXT:    vblendvps %ymm5, %ymm6, %ymm3, %ymm3
361; AVX2-NEXT:    vpunpckhbw {{.*#+}} xmm0 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]
362; 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
363; AVX2-NEXT:    vpslld $31, %ymm0, %ymm0
364; AVX2-NEXT:    vblendvps %ymm0, %ymm6, %ymm4, %ymm4
365; AVX2-NEXT:    vmulps %ymm1, %ymm3, %ymm0
366; AVX2-NEXT:    vmulps %ymm2, %ymm4, %ymm1
367; AVX2-NEXT:    retq
368;
369; AVX512-LABEL: fmul_v16f32_commute_swap:
370; AVX512:       # %bb.0:
371; AVX512-NEXT:    vpmovsxbd %xmm0, %zmm0
372; AVX512-NEXT:    vpslld $31, %zmm0, %zmm0
373; AVX512-NEXT:    vptestmd %zmm0, %zmm0, %k1
374; AVX512-NEXT:    vmulps %zmm2, %zmm1, %zmm0
375; AVX512-NEXT:    vmovaps %zmm1, %zmm0 {%k1}
376; AVX512-NEXT:    retq
377  %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
378  %r = fmul <16 x float> %s, %x
379  ret <16 x float> %r
380}
381
382define <4 x float> @fdiv_v4f32(<4 x i1> %b, <4 x float> noundef %x, <4 x float> noundef %y) {
383; AVX2-LABEL: fdiv_v4f32:
384; AVX2:       # %bb.0:
385; AVX2-NEXT:    vpslld $31, %xmm0, %xmm0
386; AVX2-NEXT:    vbroadcastss {{.*#+}} xmm3 = [1.0E+0,1.0E+0,1.0E+0,1.0E+0]
387; AVX2-NEXT:    vblendvps %xmm0, %xmm2, %xmm3, %xmm0
388; AVX2-NEXT:    vdivps %xmm0, %xmm1, %xmm0
389; AVX2-NEXT:    retq
390;
391; AVX512F-LABEL: fdiv_v4f32:
392; AVX512F:       # %bb.0:
393; AVX512F-NEXT:    # kill: def $xmm2 killed $xmm2 def $zmm2
394; AVX512F-NEXT:    vpslld $31, %xmm0, %xmm0
395; AVX512F-NEXT:    vptestmd %zmm0, %zmm0, %k1
396; AVX512F-NEXT:    vbroadcastss {{.*#+}} xmm0 = [1.0E+0,1.0E+0,1.0E+0,1.0E+0]
397; AVX512F-NEXT:    vmovaps %zmm2, %zmm0 {%k1}
398; AVX512F-NEXT:    vdivps %xmm0, %xmm1, %xmm0
399; AVX512F-NEXT:    vzeroupper
400; AVX512F-NEXT:    retq
401;
402; AVX512VL-LABEL: fdiv_v4f32:
403; AVX512VL:       # %bb.0:
404; AVX512VL-NEXT:    vpslld $31, %xmm0, %xmm0
405; AVX512VL-NEXT:    vptestmd %xmm0, %xmm0, %k1
406; AVX512VL-NEXT:    vdivps %xmm2, %xmm1, %xmm1 {%k1}
407; AVX512VL-NEXT:    vmovaps %xmm1, %xmm0
408; AVX512VL-NEXT:    retq
409  %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>
410  %r = fdiv <4 x float> %x, %s
411  ret <4 x float> %r
412}
413
414define <8 x float> @fdiv_v8f32_commute(<8 x i1> %b, <8 x float> noundef %x, <8 x float> noundef %y) {
415; AVX2-LABEL: fdiv_v8f32_commute:
416; AVX2:       # %bb.0:
417; 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
418; AVX2-NEXT:    vpslld $31, %ymm0, %ymm0
419; 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]
420; AVX2-NEXT:    vblendvps %ymm0, %ymm2, %ymm3, %ymm0
421; AVX2-NEXT:    vdivps %ymm1, %ymm0, %ymm0
422; AVX2-NEXT:    retq
423;
424; AVX512F-LABEL: fdiv_v8f32_commute:
425; AVX512F:       # %bb.0:
426; AVX512F-NEXT:    # kill: def $ymm2 killed $ymm2 def $zmm2
427; AVX512F-NEXT:    vpmovsxwq %xmm0, %zmm0
428; AVX512F-NEXT:    vpsllq $63, %zmm0, %zmm0
429; AVX512F-NEXT:    vptestmq %zmm0, %zmm0, %k1
430; 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]
431; AVX512F-NEXT:    vmovaps %zmm2, %zmm0 {%k1}
432; AVX512F-NEXT:    vdivps %ymm1, %ymm0, %ymm0
433; AVX512F-NEXT:    retq
434;
435; AVX512VL-LABEL: fdiv_v8f32_commute:
436; AVX512VL:       # %bb.0:
437; AVX512VL-NEXT:    vpmovsxwd %xmm0, %ymm0
438; AVX512VL-NEXT:    vpslld $31, %ymm0, %ymm0
439; AVX512VL-NEXT:    vptestmd %ymm0, %ymm0, %k1
440; 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]
441; AVX512VL-NEXT:    vmovaps %ymm2, %ymm0 {%k1}
442; AVX512VL-NEXT:    vdivps %ymm1, %ymm0, %ymm0
443; AVX512VL-NEXT:    retq
444  %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>
445  %r = fdiv <8 x float> %s, %x
446  ret <8 x float> %r
447}
448
449define <16 x float> @fdiv_v16f32_swap(<16 x i1> %b, <16 x float> noundef %x, <16 x float> noundef %y) {
450; AVX2-LABEL: fdiv_v16f32_swap:
451; AVX2:       # %bb.0:
452; AVX2-NEXT:    vpmovzxbw {{.*#+}} xmm5 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero
453; 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
454; AVX2-NEXT:    vpslld $31, %ymm5, %ymm5
455; 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]
456; AVX2-NEXT:    vblendvps %ymm5, %ymm6, %ymm3, %ymm3
457; AVX2-NEXT:    vpunpckhbw {{.*#+}} xmm0 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]
458; 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
459; AVX2-NEXT:    vpslld $31, %ymm0, %ymm0
460; AVX2-NEXT:    vblendvps %ymm0, %ymm6, %ymm4, %ymm4
461; AVX2-NEXT:    vdivps %ymm3, %ymm1, %ymm0
462; AVX2-NEXT:    vdivps %ymm4, %ymm2, %ymm1
463; AVX2-NEXT:    retq
464;
465; AVX512-LABEL: fdiv_v16f32_swap:
466; AVX512:       # %bb.0:
467; AVX512-NEXT:    vpmovsxbd %xmm0, %zmm0
468; AVX512-NEXT:    vpslld $31, %zmm0, %zmm0
469; AVX512-NEXT:    vptestmd %zmm0, %zmm0, %k1
470; AVX512-NEXT:    vdivps %zmm2, %zmm1, %zmm0
471; AVX512-NEXT:    vmovaps %zmm1, %zmm0 {%k1}
472; AVX512-NEXT:    retq
473  %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
474  %r = fdiv <16 x float> %x, %s
475  ret <16 x float> %r
476}
477
478define <16 x float> @fdiv_v16f32_commute_swap(<16 x i1> %b, <16 x float> noundef %x, <16 x float> noundef %y) {
479; AVX2-LABEL: fdiv_v16f32_commute_swap:
480; AVX2:       # %bb.0:
481; AVX2-NEXT:    vpmovzxbw {{.*#+}} xmm5 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero
482; 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
483; AVX2-NEXT:    vpslld $31, %ymm5, %ymm5
484; 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]
485; AVX2-NEXT:    vblendvps %ymm5, %ymm6, %ymm3, %ymm3
486; AVX2-NEXT:    vpunpckhbw {{.*#+}} xmm0 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]
487; 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
488; AVX2-NEXT:    vpslld $31, %ymm0, %ymm0
489; AVX2-NEXT:    vblendvps %ymm0, %ymm6, %ymm4, %ymm4
490; AVX2-NEXT:    vdivps %ymm1, %ymm3, %ymm0
491; AVX2-NEXT:    vdivps %ymm2, %ymm4, %ymm1
492; AVX2-NEXT:    retq
493;
494; AVX512-LABEL: fdiv_v16f32_commute_swap:
495; AVX512:       # %bb.0:
496; AVX512-NEXT:    vpmovsxbd %xmm0, %zmm0
497; AVX512-NEXT:    vpslld $31, %zmm0, %zmm0
498; AVX512-NEXT:    vptestmd %zmm0, %zmm0, %k1
499; AVX512-NEXT:    vbroadcastss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %zmm2 {%k1}
500; AVX512-NEXT:    vdivps %zmm1, %zmm2, %zmm0
501; AVX512-NEXT:    retq
502  %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
503  %r = fdiv <16 x float> %s, %x
504  ret <16 x float> %r
505}
506
507define <8 x float> @fadd_v8f32_cast_cond(i8 noundef zeroext %pb, <8 x float> noundef %x, <8 x float> noundef %y) {
508; AVX2-LABEL: fadd_v8f32_cast_cond:
509; AVX2:       # %bb.0:
510; AVX2-NEXT:    vmovd %edi, %xmm2
511; AVX2-NEXT:    vpbroadcastb %xmm2, %ymm2
512; AVX2-NEXT:    vmovdqa {{.*#+}} ymm3 = [1,2,4,8,16,32,64,128]
513; AVX2-NEXT:    vpand %ymm3, %ymm2, %ymm2
514; AVX2-NEXT:    vpcmpeqd %ymm3, %ymm2, %ymm2
515; 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]
516; AVX2-NEXT:    vblendvps %ymm2, %ymm1, %ymm3, %ymm1
517; AVX2-NEXT:    vaddps %ymm1, %ymm0, %ymm0
518; AVX2-NEXT:    retq
519;
520; AVX512F-LABEL: fadd_v8f32_cast_cond:
521; AVX512F:       # %bb.0:
522; AVX512F-NEXT:    # kill: def $ymm1 killed $ymm1 def $zmm1
523; AVX512F-NEXT:    kmovw %edi, %k1
524; 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]
525; AVX512F-NEXT:    vmovaps %zmm1, %zmm2 {%k1}
526; AVX512F-NEXT:    vaddps %ymm2, %ymm0, %ymm0
527; AVX512F-NEXT:    retq
528;
529; AVX512VL-LABEL: fadd_v8f32_cast_cond:
530; AVX512VL:       # %bb.0:
531; AVX512VL-NEXT:    kmovw %edi, %k1
532; AVX512VL-NEXT:    vaddps %ymm1, %ymm0, %ymm0 {%k1}
533; AVX512VL-NEXT:    retq
534  %b = bitcast i8 %pb to <8 x i1>
535  %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>
536  %r = fadd <8 x float> %x, %s
537  ret <8 x float> %r
538}
539
540define <8 x double> @fadd_v8f64_cast_cond(i8 noundef zeroext %pb, <8 x double> noundef %x, <8 x double> noundef %y) {
541; AVX2-LABEL: fadd_v8f64_cast_cond:
542; AVX2:       # %bb.0:
543; AVX2-NEXT:    vmovd %edi, %xmm4
544; AVX2-NEXT:    vpbroadcastb %xmm4, %ymm4
545; AVX2-NEXT:    vmovdqa {{.*#+}} ymm5 = [16,32,64,128]
546; AVX2-NEXT:    vpand %ymm5, %ymm4, %ymm6
547; AVX2-NEXT:    vpcmpeqq %ymm5, %ymm6, %ymm5
548; AVX2-NEXT:    vbroadcastsd {{.*#+}} ymm6 = [-0.0E+0,-0.0E+0,-0.0E+0,-0.0E+0]
549; AVX2-NEXT:    vblendvpd %ymm5, %ymm3, %ymm6, %ymm3
550; AVX2-NEXT:    vmovdqa {{.*#+}} ymm5 = [1,2,4,8]
551; AVX2-NEXT:    vpand %ymm5, %ymm4, %ymm4
552; AVX2-NEXT:    vpcmpeqq %ymm5, %ymm4, %ymm4
553; AVX2-NEXT:    vblendvpd %ymm4, %ymm2, %ymm6, %ymm2
554; AVX2-NEXT:    vaddpd %ymm2, %ymm0, %ymm0
555; AVX2-NEXT:    vaddpd %ymm3, %ymm1, %ymm1
556; AVX2-NEXT:    retq
557;
558; AVX512-LABEL: fadd_v8f64_cast_cond:
559; AVX512:       # %bb.0:
560; AVX512-NEXT:    kmovw %edi, %k1
561; AVX512-NEXT:    vaddpd %zmm1, %zmm0, %zmm0 {%k1}
562; AVX512-NEXT:    retq
563  %b = bitcast i8 %pb to <8 x i1>
564  %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>
565  %r = fadd <8 x double> %x, %s
566  ret <8 x double> %r
567}
568
569define <8 x float> @fsub_v8f32_cast_cond(i8 noundef zeroext %pb, <8 x float> noundef %x, <8 x float> noundef %y) {
570; AVX2-LABEL: fsub_v8f32_cast_cond:
571; AVX2:       # %bb.0:
572; AVX2-NEXT:    vmovd %edi, %xmm2
573; AVX2-NEXT:    vpbroadcastb %xmm2, %ymm2
574; AVX2-NEXT:    vmovdqa {{.*#+}} ymm3 = [1,2,4,8,16,32,64,128]
575; AVX2-NEXT:    vpand %ymm3, %ymm2, %ymm2
576; AVX2-NEXT:    vpcmpeqd %ymm3, %ymm2, %ymm2
577; AVX2-NEXT:    vpand %ymm1, %ymm2, %ymm1
578; AVX2-NEXT:    vsubps %ymm1, %ymm0, %ymm0
579; AVX2-NEXT:    retq
580;
581; AVX512F-LABEL: fsub_v8f32_cast_cond:
582; AVX512F:       # %bb.0:
583; AVX512F-NEXT:    # kill: def $ymm1 killed $ymm1 def $zmm1
584; AVX512F-NEXT:    kmovw %edi, %k1
585; AVX512F-NEXT:    vmovaps %zmm1, %zmm1 {%k1} {z}
586; AVX512F-NEXT:    vsubps %ymm1, %ymm0, %ymm0
587; AVX512F-NEXT:    retq
588;
589; AVX512VL-LABEL: fsub_v8f32_cast_cond:
590; AVX512VL:       # %bb.0:
591; AVX512VL-NEXT:    kmovw %edi, %k1
592; AVX512VL-NEXT:    vsubps %ymm1, %ymm0, %ymm0 {%k1}
593; AVX512VL-NEXT:    retq
594  %b = bitcast i8 %pb to <8 x i1>
595  %s = select <8 x i1> %b, <8 x float> %y, <8 x float> zeroinitializer
596  %r = fsub <8 x float> %x, %s
597  ret <8 x float> %r
598}
599
600define <8 x double> @fsub_v8f64_cast_cond(i8 noundef zeroext %pb, <8 x double> noundef %x, <8 x double> noundef %y) {
601; AVX2-LABEL: fsub_v8f64_cast_cond:
602; AVX2:       # %bb.0:
603; AVX2-NEXT:    vmovd %edi, %xmm4
604; AVX2-NEXT:    vpbroadcastb %xmm4, %ymm4
605; AVX2-NEXT:    vmovdqa {{.*#+}} ymm5 = [16,32,64,128]
606; AVX2-NEXT:    vpand %ymm5, %ymm4, %ymm6
607; AVX2-NEXT:    vpcmpeqq %ymm5, %ymm6, %ymm5
608; AVX2-NEXT:    vpand %ymm3, %ymm5, %ymm3
609; AVX2-NEXT:    vmovdqa {{.*#+}} ymm5 = [1,2,4,8]
610; AVX2-NEXT:    vpand %ymm5, %ymm4, %ymm4
611; AVX2-NEXT:    vpcmpeqq %ymm5, %ymm4, %ymm4
612; AVX2-NEXT:    vpand %ymm2, %ymm4, %ymm2
613; AVX2-NEXT:    vsubpd %ymm2, %ymm0, %ymm0
614; AVX2-NEXT:    vsubpd %ymm3, %ymm1, %ymm1
615; AVX2-NEXT:    retq
616;
617; AVX512-LABEL: fsub_v8f64_cast_cond:
618; AVX512:       # %bb.0:
619; AVX512-NEXT:    kmovw %edi, %k1
620; AVX512-NEXT:    vsubpd %zmm1, %zmm0, %zmm0 {%k1}
621; AVX512-NEXT:    retq
622  %b = bitcast i8 %pb to <8 x i1>
623  %s = select <8 x i1> %b, <8 x double> %y, <8 x double> zeroinitializer
624  %r = fsub <8 x double> %x, %s
625  ret <8 x double> %r
626}
627
628define <8 x float> @fmul_v8f32_cast_cond(i8 noundef zeroext %pb, <8 x float> noundef %x, <8 x float> noundef %y) {
629; AVX2-LABEL: fmul_v8f32_cast_cond:
630; AVX2:       # %bb.0:
631; AVX2-NEXT:    vmovd %edi, %xmm2
632; AVX2-NEXT:    vpbroadcastb %xmm2, %ymm2
633; AVX2-NEXT:    vmovdqa {{.*#+}} ymm3 = [1,2,4,8,16,32,64,128]
634; AVX2-NEXT:    vpand %ymm3, %ymm2, %ymm2
635; AVX2-NEXT:    vpcmpeqd %ymm3, %ymm2, %ymm2
636; 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]
637; AVX2-NEXT:    vblendvps %ymm2, %ymm1, %ymm3, %ymm1
638; AVX2-NEXT:    vmulps %ymm1, %ymm0, %ymm0
639; AVX2-NEXT:    retq
640;
641; AVX512F-LABEL: fmul_v8f32_cast_cond:
642; AVX512F:       # %bb.0:
643; AVX512F-NEXT:    # kill: def $ymm1 killed $ymm1 def $zmm1
644; AVX512F-NEXT:    kmovw %edi, %k1
645; 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]
646; AVX512F-NEXT:    vmovaps %zmm1, %zmm2 {%k1}
647; AVX512F-NEXT:    vmulps %ymm2, %ymm0, %ymm0
648; AVX512F-NEXT:    retq
649;
650; AVX512VL-LABEL: fmul_v8f32_cast_cond:
651; AVX512VL:       # %bb.0:
652; AVX512VL-NEXT:    kmovw %edi, %k1
653; AVX512VL-NEXT:    vmulps %ymm1, %ymm0, %ymm0 {%k1}
654; AVX512VL-NEXT:    retq
655  %b = bitcast i8 %pb to <8 x i1>
656  %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>
657  %r = fmul <8 x float> %x, %s
658  ret <8 x float> %r
659}
660
661define <8 x double> @fmul_v8f64_cast_cond(i8 noundef zeroext %pb, <8 x double> noundef %x, <8 x double> noundef %y) {
662; AVX2-LABEL: fmul_v8f64_cast_cond:
663; AVX2:       # %bb.0:
664; AVX2-NEXT:    vmovd %edi, %xmm4
665; AVX2-NEXT:    vpbroadcastb %xmm4, %ymm4
666; AVX2-NEXT:    vmovdqa {{.*#+}} ymm5 = [16,32,64,128]
667; AVX2-NEXT:    vpand %ymm5, %ymm4, %ymm6
668; AVX2-NEXT:    vpcmpeqq %ymm5, %ymm6, %ymm5
669; AVX2-NEXT:    vbroadcastsd {{.*#+}} ymm6 = [1.0E+0,1.0E+0,1.0E+0,1.0E+0]
670; AVX2-NEXT:    vblendvpd %ymm5, %ymm3, %ymm6, %ymm3
671; AVX2-NEXT:    vmovdqa {{.*#+}} ymm5 = [1,2,4,8]
672; AVX2-NEXT:    vpand %ymm5, %ymm4, %ymm4
673; AVX2-NEXT:    vpcmpeqq %ymm5, %ymm4, %ymm4
674; AVX2-NEXT:    vblendvpd %ymm4, %ymm2, %ymm6, %ymm2
675; AVX2-NEXT:    vmulpd %ymm2, %ymm0, %ymm0
676; AVX2-NEXT:    vmulpd %ymm3, %ymm1, %ymm1
677; AVX2-NEXT:    retq
678;
679; AVX512-LABEL: fmul_v8f64_cast_cond:
680; AVX512:       # %bb.0:
681; AVX512-NEXT:    kmovw %edi, %k1
682; AVX512-NEXT:    vmulpd %zmm1, %zmm0, %zmm0 {%k1}
683; AVX512-NEXT:    retq
684  %b = bitcast i8 %pb to <8 x i1>
685  %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>
686  %r = fmul <8 x double> %x, %s
687  ret <8 x double> %r
688}
689
690define <8 x float> @fdiv_v8f32_cast_cond(i8 noundef zeroext %pb, <8 x float> noundef %x, <8 x float> noundef %y) {
691; AVX2-LABEL: fdiv_v8f32_cast_cond:
692; AVX2:       # %bb.0:
693; AVX2-NEXT:    vmovd %edi, %xmm2
694; AVX2-NEXT:    vpbroadcastb %xmm2, %ymm2
695; AVX2-NEXT:    vmovdqa {{.*#+}} ymm3 = [1,2,4,8,16,32,64,128]
696; AVX2-NEXT:    vpand %ymm3, %ymm2, %ymm2
697; AVX2-NEXT:    vpcmpeqd %ymm3, %ymm2, %ymm2
698; 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]
699; AVX2-NEXT:    vblendvps %ymm2, %ymm1, %ymm3, %ymm1
700; AVX2-NEXT:    vdivps %ymm1, %ymm0, %ymm0
701; AVX2-NEXT:    retq
702;
703; AVX512F-LABEL: fdiv_v8f32_cast_cond:
704; AVX512F:       # %bb.0:
705; AVX512F-NEXT:    # kill: def $ymm1 killed $ymm1 def $zmm1
706; AVX512F-NEXT:    kmovw %edi, %k1
707; 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]
708; AVX512F-NEXT:    vmovaps %zmm1, %zmm2 {%k1}
709; AVX512F-NEXT:    vdivps %ymm2, %ymm0, %ymm0
710; AVX512F-NEXT:    retq
711;
712; AVX512VL-LABEL: fdiv_v8f32_cast_cond:
713; AVX512VL:       # %bb.0:
714; AVX512VL-NEXT:    kmovw %edi, %k1
715; AVX512VL-NEXT:    vdivps %ymm1, %ymm0, %ymm0 {%k1}
716; AVX512VL-NEXT:    retq
717  %b = bitcast i8 %pb to <8 x i1>
718  %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>
719  %r = fdiv <8 x float> %x, %s
720  ret <8 x float> %r
721}
722
723define <8 x double> @fdiv_v8f64_cast_cond(i8 noundef zeroext %pb, <8 x double> noundef %x, <8 x double> noundef %y) {
724; AVX2-LABEL: fdiv_v8f64_cast_cond:
725; AVX2:       # %bb.0:
726; AVX2-NEXT:    vmovd %edi, %xmm4
727; AVX2-NEXT:    vpbroadcastb %xmm4, %ymm4
728; AVX2-NEXT:    vmovdqa {{.*#+}} ymm5 = [16,32,64,128]
729; AVX2-NEXT:    vpand %ymm5, %ymm4, %ymm6
730; AVX2-NEXT:    vpcmpeqq %ymm5, %ymm6, %ymm5
731; AVX2-NEXT:    vbroadcastsd {{.*#+}} ymm6 = [1.0E+0,1.0E+0,1.0E+0,1.0E+0]
732; AVX2-NEXT:    vblendvpd %ymm5, %ymm3, %ymm6, %ymm3
733; AVX2-NEXT:    vmovdqa {{.*#+}} ymm5 = [1,2,4,8]
734; AVX2-NEXT:    vpand %ymm5, %ymm4, %ymm4
735; AVX2-NEXT:    vpcmpeqq %ymm5, %ymm4, %ymm4
736; AVX2-NEXT:    vblendvpd %ymm4, %ymm2, %ymm6, %ymm2
737; AVX2-NEXT:    vdivpd %ymm2, %ymm0, %ymm0
738; AVX2-NEXT:    vdivpd %ymm3, %ymm1, %ymm1
739; AVX2-NEXT:    retq
740;
741; AVX512-LABEL: fdiv_v8f64_cast_cond:
742; AVX512:       # %bb.0:
743; AVX512-NEXT:    kmovw %edi, %k1
744; AVX512-NEXT:    vdivpd %zmm1, %zmm0, %zmm0 {%k1}
745; AVX512-NEXT:    retq
746  %b = bitcast i8 %pb to <8 x i1>
747  %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>
748  %r = fdiv <8 x double> %x, %s
749  ret <8 x double> %r
750}
751
752define <4 x i32> @add_v4i32(<4 x i1> %b, <4 x i32> noundef %x, <4 x i32> noundef %y) {
753; AVX2-LABEL: add_v4i32:
754; AVX2:       # %bb.0:
755; AVX2-NEXT:    vpslld $31, %xmm0, %xmm0
756; AVX2-NEXT:    vpsrad $31, %xmm0, %xmm0
757; AVX2-NEXT:    vpand %xmm2, %xmm0, %xmm0
758; AVX2-NEXT:    vpaddd %xmm0, %xmm1, %xmm0
759; AVX2-NEXT:    retq
760;
761; AVX512F-LABEL: add_v4i32:
762; AVX512F:       # %bb.0:
763; AVX512F-NEXT:    # kill: def $xmm2 killed $xmm2 def $zmm2
764; AVX512F-NEXT:    vpslld $31, %xmm0, %xmm0
765; AVX512F-NEXT:    vptestmd %zmm0, %zmm0, %k1
766; AVX512F-NEXT:    vmovdqa32 %zmm2, %zmm0 {%k1} {z}
767; AVX512F-NEXT:    vpaddd %xmm0, %xmm1, %xmm0
768; AVX512F-NEXT:    vzeroupper
769; AVX512F-NEXT:    retq
770;
771; AVX512VL-LABEL: add_v4i32:
772; AVX512VL:       # %bb.0:
773; AVX512VL-NEXT:    vpslld $31, %xmm0, %xmm0
774; AVX512VL-NEXT:    vptestmd %xmm0, %xmm0, %k1
775; AVX512VL-NEXT:    vmovdqa32 %xmm2, %xmm0 {%k1} {z}
776; AVX512VL-NEXT:    vpaddd %xmm0, %xmm1, %xmm0
777; AVX512VL-NEXT:    retq
778  %s = select <4 x i1> %b, <4 x i32> %y, <4 x i32> zeroinitializer
779  %r = add <4 x i32> %x, %s
780  ret <4 x i32> %r
781}
782
783define <8 x i32> @add_v8i32_commute(<8 x i1> %b, <8 x i32> noundef %x, <8 x i32> noundef %y) {
784; AVX2-LABEL: add_v8i32_commute:
785; AVX2:       # %bb.0:
786; 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
787; AVX2-NEXT:    vpslld $31, %ymm0, %ymm0
788; AVX2-NEXT:    vpsrad $31, %ymm0, %ymm0
789; AVX2-NEXT:    vpand %ymm2, %ymm0, %ymm0
790; AVX2-NEXT:    vpaddd %ymm1, %ymm0, %ymm0
791; AVX2-NEXT:    retq
792;
793; AVX512F-LABEL: add_v8i32_commute:
794; AVX512F:       # %bb.0:
795; AVX512F-NEXT:    # kill: def $ymm2 killed $ymm2 def $zmm2
796; AVX512F-NEXT:    vpmovsxwq %xmm0, %zmm0
797; AVX512F-NEXT:    vpsllq $63, %zmm0, %zmm0
798; AVX512F-NEXT:    vptestmq %zmm0, %zmm0, %k1
799; AVX512F-NEXT:    vmovdqa32 %zmm2, %zmm0 {%k1} {z}
800; AVX512F-NEXT:    vpaddd %ymm1, %ymm0, %ymm0
801; AVX512F-NEXT:    retq
802;
803; AVX512VL-LABEL: add_v8i32_commute:
804; AVX512VL:       # %bb.0:
805; AVX512VL-NEXT:    vpmovsxwd %xmm0, %ymm0
806; AVX512VL-NEXT:    vpslld $31, %ymm0, %ymm0
807; AVX512VL-NEXT:    vptestmd %ymm0, %ymm0, %k1
808; AVX512VL-NEXT:    vmovdqa32 %ymm2, %ymm0 {%k1} {z}
809; AVX512VL-NEXT:    vpaddd %ymm1, %ymm0, %ymm0
810; AVX512VL-NEXT:    retq
811  %s = select <8 x i1> %b, <8 x i32> %y, <8 x i32> zeroinitializer
812  %r = add <8 x i32> %s, %x
813  ret <8 x i32> %r
814}
815
816define <8 x i32> @add_v8i32_cast_cond(i8 noundef zeroext %pb, <8 x i32> noundef %x, <8 x i32> noundef %y) {
817; AVX2-LABEL: add_v8i32_cast_cond:
818; AVX2:       # %bb.0:
819; AVX2-NEXT:    vmovd %edi, %xmm2
820; AVX2-NEXT:    vpbroadcastb %xmm2, %ymm2
821; AVX2-NEXT:    vmovdqa {{.*#+}} ymm3 = [1,2,4,8,16,32,64,128]
822; AVX2-NEXT:    vpand %ymm3, %ymm2, %ymm2
823; AVX2-NEXT:    vpcmpeqd %ymm3, %ymm2, %ymm2
824; AVX2-NEXT:    vpand %ymm1, %ymm2, %ymm1
825; AVX2-NEXT:    vpaddd %ymm1, %ymm0, %ymm0
826; AVX2-NEXT:    retq
827;
828; AVX512F-LABEL: add_v8i32_cast_cond:
829; AVX512F:       # %bb.0:
830; AVX512F-NEXT:    # kill: def $ymm1 killed $ymm1 def $zmm1
831; AVX512F-NEXT:    kmovw %edi, %k1
832; AVX512F-NEXT:    vmovdqa32 %zmm1, %zmm1 {%k1} {z}
833; AVX512F-NEXT:    vpaddd %ymm1, %ymm0, %ymm0
834; AVX512F-NEXT:    retq
835;
836; AVX512VL-LABEL: add_v8i32_cast_cond:
837; AVX512VL:       # %bb.0:
838; AVX512VL-NEXT:    kmovw %edi, %k1
839; AVX512VL-NEXT:    vmovdqa32 %ymm1, %ymm1 {%k1} {z}
840; AVX512VL-NEXT:    vpaddd %ymm1, %ymm0, %ymm0
841; AVX512VL-NEXT:    retq
842  %b = bitcast i8 %pb to <8 x i1>
843  %s = select <8 x i1> %b, <8 x i32> %y, <8 x i32> zeroinitializer
844  %r = add <8 x i32> %x, %s
845  ret <8 x i32> %r
846}
847
848define <8 x i64> @add_v8i64_cast_cond(i8 noundef zeroext %pb, <8 x i64> noundef %x, <8 x i64> noundef %y) {
849; AVX2-LABEL: add_v8i64_cast_cond:
850; AVX2:       # %bb.0:
851; AVX2-NEXT:    vmovd %edi, %xmm4
852; AVX2-NEXT:    vpbroadcastb %xmm4, %ymm4
853; AVX2-NEXT:    vmovdqa {{.*#+}} ymm5 = [16,32,64,128]
854; AVX2-NEXT:    vpand %ymm5, %ymm4, %ymm6
855; AVX2-NEXT:    vpcmpeqq %ymm5, %ymm6, %ymm5
856; AVX2-NEXT:    vpand %ymm3, %ymm5, %ymm3
857; AVX2-NEXT:    vmovdqa {{.*#+}} ymm5 = [1,2,4,8]
858; AVX2-NEXT:    vpand %ymm5, %ymm4, %ymm4
859; AVX2-NEXT:    vpcmpeqq %ymm5, %ymm4, %ymm4
860; AVX2-NEXT:    vpand %ymm2, %ymm4, %ymm2
861; AVX2-NEXT:    vpaddq %ymm2, %ymm0, %ymm0
862; AVX2-NEXT:    vpaddq %ymm3, %ymm1, %ymm1
863; AVX2-NEXT:    retq
864;
865; AVX512-LABEL: add_v8i64_cast_cond:
866; AVX512:       # %bb.0:
867; AVX512-NEXT:    kmovw %edi, %k1
868; AVX512-NEXT:    vmovdqa64 %zmm1, %zmm1 {%k1} {z}
869; AVX512-NEXT:    vpaddq %zmm1, %zmm0, %zmm0
870; AVX512-NEXT:    retq
871  %b = bitcast i8 %pb to <8 x i1>
872  %s = select <8 x i1> %b, <8 x i64> %y, <8 x i64> zeroinitializer
873  %r = add <8 x i64> %x, %s
874  ret <8 x i64> %r
875}
876
877define <4 x i32> @sub_v4i32(<4 x i1> %b, <4 x i32> noundef %x, <4 x i32> noundef %y) {
878; AVX2-LABEL: sub_v4i32:
879; AVX2:       # %bb.0:
880; AVX2-NEXT:    vpslld $31, %xmm0, %xmm0
881; AVX2-NEXT:    vpsrad $31, %xmm0, %xmm0
882; AVX2-NEXT:    vpand %xmm2, %xmm0, %xmm0
883; AVX2-NEXT:    vpsubd %xmm0, %xmm1, %xmm0
884; AVX2-NEXT:    retq
885;
886; AVX512F-LABEL: sub_v4i32:
887; AVX512F:       # %bb.0:
888; AVX512F-NEXT:    # kill: def $xmm2 killed $xmm2 def $zmm2
889; AVX512F-NEXT:    vpslld $31, %xmm0, %xmm0
890; AVX512F-NEXT:    vptestmd %zmm0, %zmm0, %k1
891; AVX512F-NEXT:    vmovdqa32 %zmm2, %zmm0 {%k1} {z}
892; AVX512F-NEXT:    vpsubd %xmm0, %xmm1, %xmm0
893; AVX512F-NEXT:    vzeroupper
894; AVX512F-NEXT:    retq
895;
896; AVX512VL-LABEL: sub_v4i32:
897; AVX512VL:       # %bb.0:
898; AVX512VL-NEXT:    vpslld $31, %xmm0, %xmm0
899; AVX512VL-NEXT:    vptestmd %xmm0, %xmm0, %k1
900; AVX512VL-NEXT:    vpsubd %xmm2, %xmm1, %xmm1 {%k1}
901; AVX512VL-NEXT:    vmovdqa %xmm1, %xmm0
902; AVX512VL-NEXT:    retq
903  %s = select <4 x i1> %b, <4 x i32> %y, <4 x i32> zeroinitializer
904  %r = sub <4 x i32> %x, %s
905  ret <4 x i32> %r
906}
907
908; negative test - sub is not commutative; there is no identity constant for operand 0
909
910define <8 x i32> @sub_v8i32_commute(<8 x i1> %b, <8 x i32> noundef %x, <8 x i32> noundef %y) {
911; AVX2-LABEL: sub_v8i32_commute:
912; AVX2:       # %bb.0:
913; 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
914; AVX2-NEXT:    vpslld $31, %ymm0, %ymm0
915; AVX2-NEXT:    vpsrad $31, %ymm0, %ymm0
916; AVX2-NEXT:    vpand %ymm2, %ymm0, %ymm0
917; AVX2-NEXT:    vpsubd %ymm1, %ymm0, %ymm0
918; AVX2-NEXT:    retq
919;
920; AVX512F-LABEL: sub_v8i32_commute:
921; AVX512F:       # %bb.0:
922; AVX512F-NEXT:    # kill: def $ymm2 killed $ymm2 def $zmm2
923; AVX512F-NEXT:    vpmovsxwq %xmm0, %zmm0
924; AVX512F-NEXT:    vpsllq $63, %zmm0, %zmm0
925; AVX512F-NEXT:    vptestmq %zmm0, %zmm0, %k1
926; AVX512F-NEXT:    vmovdqa32 %zmm2, %zmm0 {%k1} {z}
927; AVX512F-NEXT:    vpsubd %ymm1, %ymm0, %ymm0
928; AVX512F-NEXT:    retq
929;
930; AVX512VL-LABEL: sub_v8i32_commute:
931; AVX512VL:       # %bb.0:
932; AVX512VL-NEXT:    vpmovsxwd %xmm0, %ymm0
933; AVX512VL-NEXT:    vpslld $31, %ymm0, %ymm0
934; AVX512VL-NEXT:    vptestmd %ymm0, %ymm0, %k1
935; AVX512VL-NEXT:    vmovdqa32 %ymm2, %ymm0 {%k1} {z}
936; AVX512VL-NEXT:    vpsubd %ymm1, %ymm0, %ymm0
937; AVX512VL-NEXT:    retq
938  %s = select <8 x i1> %b, <8 x i32> %y, <8 x i32> zeroinitializer
939  %r = sub <8 x i32> %s, %x
940  ret <8 x i32> %r
941}
942
943define <16 x i32> @sub_v16i32_swap(<16 x i1> %b, <16 x i32> noundef %x, <16 x i32> noundef %y) {
944; AVX2-LABEL: sub_v16i32_swap:
945; AVX2:       # %bb.0:
946; AVX2-NEXT:    vpunpckhbw {{.*#+}} xmm5 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]
947; 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
948; AVX2-NEXT:    vpslld $31, %ymm5, %ymm5
949; AVX2-NEXT:    vpsrad $31, %ymm5, %ymm5
950; AVX2-NEXT:    vpandn %ymm4, %ymm5, %ymm4
951; AVX2-NEXT:    vpmovzxbw {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero
952; 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
953; AVX2-NEXT:    vpslld $31, %ymm0, %ymm0
954; AVX2-NEXT:    vpsrad $31, %ymm0, %ymm0
955; AVX2-NEXT:    vpandn %ymm3, %ymm0, %ymm0
956; AVX2-NEXT:    vpsubd %ymm0, %ymm1, %ymm0
957; AVX2-NEXT:    vpsubd %ymm4, %ymm2, %ymm1
958; AVX2-NEXT:    retq
959;
960; AVX512-LABEL: sub_v16i32_swap:
961; AVX512:       # %bb.0:
962; AVX512-NEXT:    vpmovsxbd %xmm0, %zmm0
963; AVX512-NEXT:    vpslld $31, %zmm0, %zmm0
964; AVX512-NEXT:    vptestmd %zmm0, %zmm0, %k1
965; AVX512-NEXT:    vpsubd %zmm2, %zmm1, %zmm0
966; AVX512-NEXT:    vmovdqa32 %zmm1, %zmm0 {%k1}
967; AVX512-NEXT:    retq
968  %s = select <16 x i1> %b, <16 x i32> zeroinitializer, <16 x i32> %y
969  %r = sub <16 x i32> %x, %s
970  ret <16 x i32> %r
971}
972
973; negative test - sub is not commutative; there is no identity constant for operand 0
974
975define <16 x i32> @sub_v16i32_commute_swap(<16 x i1> %b, <16 x i32> noundef %x, <16 x i32> noundef %y) {
976; AVX2-LABEL: sub_v16i32_commute_swap:
977; AVX2:       # %bb.0:
978; AVX2-NEXT:    vpunpckhbw {{.*#+}} xmm5 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]
979; 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
980; AVX2-NEXT:    vpslld $31, %ymm5, %ymm5
981; AVX2-NEXT:    vpsrad $31, %ymm5, %ymm5
982; AVX2-NEXT:    vpandn %ymm4, %ymm5, %ymm4
983; AVX2-NEXT:    vpmovzxbw {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero
984; 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
985; AVX2-NEXT:    vpslld $31, %ymm0, %ymm0
986; AVX2-NEXT:    vpsrad $31, %ymm0, %ymm0
987; AVX2-NEXT:    vpandn %ymm3, %ymm0, %ymm0
988; AVX2-NEXT:    vpsubd %ymm1, %ymm0, %ymm0
989; AVX2-NEXT:    vpsubd %ymm2, %ymm4, %ymm1
990; AVX2-NEXT:    retq
991;
992; AVX512-LABEL: sub_v16i32_commute_swap:
993; AVX512:       # %bb.0:
994; AVX512-NEXT:    vpmovsxbd %xmm0, %zmm0
995; AVX512-NEXT:    vpslld $31, %zmm0, %zmm0
996; AVX512-NEXT:    vptestnmd %zmm0, %zmm0, %k1
997; AVX512-NEXT:    vmovdqa32 %zmm2, %zmm0 {%k1} {z}
998; AVX512-NEXT:    vpsubd %zmm1, %zmm0, %zmm0
999; AVX512-NEXT:    retq
1000  %s = select <16 x i1> %b, <16 x i32> zeroinitializer, <16 x i32> %y
1001  %r = sub <16 x i32> %s, %x
1002  ret <16 x i32> %r
1003}
1004
1005define <8 x i32> @sub_v8i32_cast_cond(i8 noundef zeroext %pb, <8 x i32> noundef %x, <8 x i32> noundef %y) {
1006; AVX2-LABEL: sub_v8i32_cast_cond:
1007; AVX2:       # %bb.0:
1008; AVX2-NEXT:    vmovd %edi, %xmm2
1009; AVX2-NEXT:    vpbroadcastb %xmm2, %ymm2
1010; AVX2-NEXT:    vmovdqa {{.*#+}} ymm3 = [1,2,4,8,16,32,64,128]
1011; AVX2-NEXT:    vpand %ymm3, %ymm2, %ymm2
1012; AVX2-NEXT:    vpcmpeqd %ymm3, %ymm2, %ymm2
1013; AVX2-NEXT:    vpand %ymm1, %ymm2, %ymm1
1014; AVX2-NEXT:    vpsubd %ymm1, %ymm0, %ymm0
1015; AVX2-NEXT:    retq
1016;
1017; AVX512F-LABEL: sub_v8i32_cast_cond:
1018; AVX512F:       # %bb.0:
1019; AVX512F-NEXT:    # kill: def $ymm1 killed $ymm1 def $zmm1
1020; AVX512F-NEXT:    kmovw %edi, %k1
1021; AVX512F-NEXT:    vmovdqa32 %zmm1, %zmm1 {%k1} {z}
1022; AVX512F-NEXT:    vpsubd %ymm1, %ymm0, %ymm0
1023; AVX512F-NEXT:    retq
1024;
1025; AVX512VL-LABEL: sub_v8i32_cast_cond:
1026; AVX512VL:       # %bb.0:
1027; AVX512VL-NEXT:    kmovw %edi, %k1
1028; AVX512VL-NEXT:    vpsubd %ymm1, %ymm0, %ymm0 {%k1}
1029; AVX512VL-NEXT:    retq
1030  %b = bitcast i8 %pb to <8 x i1>
1031  %s = select <8 x i1> %b, <8 x i32> %y, <8 x i32> zeroinitializer
1032  %r = sub <8 x i32> %x, %s
1033  ret <8 x i32> %r
1034}
1035
1036define <8 x i64> @sub_v8i64_cast_cond(i8 noundef zeroext %pb, <8 x i64> noundef %x, <8 x i64> noundef %y) {
1037; AVX2-LABEL: sub_v8i64_cast_cond:
1038; AVX2:       # %bb.0:
1039; AVX2-NEXT:    vmovd %edi, %xmm4
1040; AVX2-NEXT:    vpbroadcastb %xmm4, %ymm4
1041; AVX2-NEXT:    vmovdqa {{.*#+}} ymm5 = [16,32,64,128]
1042; AVX2-NEXT:    vpand %ymm5, %ymm4, %ymm6
1043; AVX2-NEXT:    vpcmpeqq %ymm5, %ymm6, %ymm5
1044; AVX2-NEXT:    vpand %ymm3, %ymm5, %ymm3
1045; AVX2-NEXT:    vmovdqa {{.*#+}} ymm5 = [1,2,4,8]
1046; AVX2-NEXT:    vpand %ymm5, %ymm4, %ymm4
1047; AVX2-NEXT:    vpcmpeqq %ymm5, %ymm4, %ymm4
1048; AVX2-NEXT:    vpand %ymm2, %ymm4, %ymm2
1049; AVX2-NEXT:    vpsubq %ymm2, %ymm0, %ymm0
1050; AVX2-NEXT:    vpsubq %ymm3, %ymm1, %ymm1
1051; AVX2-NEXT:    retq
1052;
1053; AVX512-LABEL: sub_v8i64_cast_cond:
1054; AVX512:       # %bb.0:
1055; AVX512-NEXT:    kmovw %edi, %k1
1056; AVX512-NEXT:    vpsubq %zmm1, %zmm0, %zmm0 {%k1}
1057; AVX512-NEXT:    retq
1058  %b = bitcast i8 %pb to <8 x i1>
1059  %s = select <8 x i1> %b, <8 x i64> %y, <8 x i64> zeroinitializer
1060  %r = sub <8 x i64> %x, %s
1061  ret <8 x i64> %r
1062}
1063
1064define <4 x i32> @mul_v4i32(<4 x i1> %b, <4 x i32> noundef %x, <4 x i32> noundef %y) {
1065; AVX2-LABEL: mul_v4i32:
1066; AVX2:       # %bb.0:
1067; AVX2-NEXT:    vpslld $31, %xmm0, %xmm0
1068; AVX2-NEXT:    vbroadcastss {{.*#+}} xmm3 = [1,1,1,1]
1069; AVX2-NEXT:    vblendvps %xmm0, %xmm2, %xmm3, %xmm0
1070; AVX2-NEXT:    vpmulld %xmm0, %xmm1, %xmm0
1071; AVX2-NEXT:    retq
1072;
1073; AVX512F-LABEL: mul_v4i32:
1074; AVX512F:       # %bb.0:
1075; AVX512F-NEXT:    # kill: def $xmm2 killed $xmm2 def $zmm2
1076; AVX512F-NEXT:    vpslld $31, %xmm0, %xmm0
1077; AVX512F-NEXT:    vptestmd %zmm0, %zmm0, %k1
1078; AVX512F-NEXT:    vpbroadcastd {{.*#+}} xmm0 = [1,1,1,1]
1079; AVX512F-NEXT:    vmovdqa32 %zmm2, %zmm0 {%k1}
1080; AVX512F-NEXT:    vpmulld %xmm0, %xmm1, %xmm0
1081; AVX512F-NEXT:    vzeroupper
1082; AVX512F-NEXT:    retq
1083;
1084; AVX512VL-LABEL: mul_v4i32:
1085; AVX512VL:       # %bb.0:
1086; AVX512VL-NEXT:    vpslld $31, %xmm0, %xmm0
1087; AVX512VL-NEXT:    vptestmd %xmm0, %xmm0, %k1
1088; AVX512VL-NEXT:    vpbroadcastd {{.*#+}} xmm0 = [1,1,1,1]
1089; AVX512VL-NEXT:    vmovdqa32 %xmm2, %xmm0 {%k1}
1090; AVX512VL-NEXT:    vpmulld %xmm0, %xmm1, %xmm0
1091; AVX512VL-NEXT:    retq
1092  %s = select <4 x i1> %b, <4 x i32> %y, <4 x i32> <i32 1, i32 1, i32 1, i32 1>
1093  %r = mul <4 x i32> %x, %s
1094  ret <4 x i32> %r
1095}
1096
1097define <8 x i32> @mul_v8i32_commute(<8 x i1> %b, <8 x i32> noundef %x, <8 x i32> noundef %y) {
1098; AVX2-LABEL: mul_v8i32_commute:
1099; AVX2:       # %bb.0:
1100; 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
1101; AVX2-NEXT:    vpslld $31, %ymm0, %ymm0
1102; AVX2-NEXT:    vbroadcastss {{.*#+}} ymm3 = [1,1,1,1,1,1,1,1]
1103; AVX2-NEXT:    vblendvps %ymm0, %ymm2, %ymm3, %ymm0
1104; AVX2-NEXT:    vpmulld %ymm1, %ymm0, %ymm0
1105; AVX2-NEXT:    retq
1106;
1107; AVX512F-LABEL: mul_v8i32_commute:
1108; AVX512F:       # %bb.0:
1109; AVX512F-NEXT:    # kill: def $ymm2 killed $ymm2 def $zmm2
1110; AVX512F-NEXT:    vpmovsxwq %xmm0, %zmm0
1111; AVX512F-NEXT:    vpsllq $63, %zmm0, %zmm0
1112; AVX512F-NEXT:    vptestmq %zmm0, %zmm0, %k1
1113; AVX512F-NEXT:    vpbroadcastd {{.*#+}} ymm0 = [1,1,1,1,1,1,1,1]
1114; AVX512F-NEXT:    vmovdqa32 %zmm2, %zmm0 {%k1}
1115; AVX512F-NEXT:    vpmulld %ymm1, %ymm0, %ymm0
1116; AVX512F-NEXT:    retq
1117;
1118; AVX512VL-LABEL: mul_v8i32_commute:
1119; AVX512VL:       # %bb.0:
1120; AVX512VL-NEXT:    vpmovsxwd %xmm0, %ymm0
1121; AVX512VL-NEXT:    vpslld $31, %ymm0, %ymm0
1122; AVX512VL-NEXT:    vptestmd %ymm0, %ymm0, %k1
1123; AVX512VL-NEXT:    vpbroadcastd {{.*#+}} ymm0 = [1,1,1,1,1,1,1,1]
1124; AVX512VL-NEXT:    vmovdqa32 %ymm2, %ymm0 {%k1}
1125; AVX512VL-NEXT:    vpmulld %ymm1, %ymm0, %ymm0
1126; AVX512VL-NEXT:    retq
1127  %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>
1128  %r = mul <8 x i32> %s, %x
1129  ret <8 x i32> %r
1130}
1131
1132define <8 x i32> @mul_v8i32_cast_cond(i8 noundef zeroext %pb, <8 x i32> noundef %x, <8 x i32> noundef %y) {
1133; AVX2-LABEL: mul_v8i32_cast_cond:
1134; AVX2:       # %bb.0:
1135; AVX2-NEXT:    vmovd %edi, %xmm2
1136; AVX2-NEXT:    vpbroadcastb %xmm2, %ymm2
1137; AVX2-NEXT:    vmovdqa {{.*#+}} ymm3 = [1,2,4,8,16,32,64,128]
1138; AVX2-NEXT:    vpand %ymm3, %ymm2, %ymm2
1139; AVX2-NEXT:    vpcmpeqd %ymm3, %ymm2, %ymm2
1140; AVX2-NEXT:    vbroadcastss {{.*#+}} ymm3 = [1,1,1,1,1,1,1,1]
1141; AVX2-NEXT:    vblendvps %ymm2, %ymm1, %ymm3, %ymm1
1142; AVX2-NEXT:    vpmulld %ymm1, %ymm0, %ymm0
1143; AVX2-NEXT:    retq
1144;
1145; AVX512F-LABEL: mul_v8i32_cast_cond:
1146; AVX512F:       # %bb.0:
1147; AVX512F-NEXT:    # kill: def $ymm1 killed $ymm1 def $zmm1
1148; AVX512F-NEXT:    kmovw %edi, %k1
1149; AVX512F-NEXT:    vpbroadcastd {{.*#+}} ymm2 = [1,1,1,1,1,1,1,1]
1150; AVX512F-NEXT:    vmovdqa32 %zmm1, %zmm2 {%k1}
1151; AVX512F-NEXT:    vpmulld %ymm2, %ymm0, %ymm0
1152; AVX512F-NEXT:    retq
1153;
1154; AVX512VL-LABEL: mul_v8i32_cast_cond:
1155; AVX512VL:       # %bb.0:
1156; AVX512VL-NEXT:    kmovw %edi, %k1
1157; AVX512VL-NEXT:    vpbroadcastd {{.*#+}} ymm2 = [1,1,1,1,1,1,1,1]
1158; AVX512VL-NEXT:    vmovdqa32 %ymm1, %ymm2 {%k1}
1159; AVX512VL-NEXT:    vpmulld %ymm2, %ymm0, %ymm0
1160; AVX512VL-NEXT:    retq
1161  %b = bitcast i8 %pb to <8 x i1>
1162  %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>
1163  %r = mul <8 x i32> %x, %s
1164  ret <8 x i32> %r
1165}
1166
1167define <8 x i64> @mul_v8i64_cast_cond(i8 noundef zeroext %pb, <8 x i64> noundef %x, <8 x i64> noundef %y) {
1168; AVX2-LABEL: mul_v8i64_cast_cond:
1169; AVX2:       # %bb.0:
1170; AVX2-NEXT:    vmovd %edi, %xmm4
1171; AVX2-NEXT:    vpbroadcastb %xmm4, %ymm4
1172; AVX2-NEXT:    vmovdqa {{.*#+}} ymm5 = [16,32,64,128]
1173; AVX2-NEXT:    vpand %ymm5, %ymm4, %ymm6
1174; AVX2-NEXT:    vpcmpeqq %ymm5, %ymm6, %ymm5
1175; AVX2-NEXT:    vbroadcastsd {{.*#+}} ymm6 = [1,1,1,1]
1176; AVX2-NEXT:    vblendvpd %ymm5, %ymm3, %ymm6, %ymm3
1177; AVX2-NEXT:    vmovdqa {{.*#+}} ymm5 = [1,2,4,8]
1178; AVX2-NEXT:    vpand %ymm5, %ymm4, %ymm4
1179; AVX2-NEXT:    vpcmpeqq %ymm5, %ymm4, %ymm4
1180; AVX2-NEXT:    vblendvpd %ymm4, %ymm2, %ymm6, %ymm2
1181; AVX2-NEXT:    vpsrlq $32, %ymm0, %ymm4
1182; AVX2-NEXT:    vpmuludq %ymm2, %ymm4, %ymm4
1183; AVX2-NEXT:    vpsrlq $32, %ymm2, %ymm5
1184; AVX2-NEXT:    vpmuludq %ymm5, %ymm0, %ymm5
1185; AVX2-NEXT:    vpaddq %ymm4, %ymm5, %ymm4
1186; AVX2-NEXT:    vpsllq $32, %ymm4, %ymm4
1187; AVX2-NEXT:    vpmuludq %ymm2, %ymm0, %ymm0
1188; AVX2-NEXT:    vpaddq %ymm4, %ymm0, %ymm0
1189; AVX2-NEXT:    vpsrlq $32, %ymm1, %ymm2
1190; AVX2-NEXT:    vpmuludq %ymm3, %ymm2, %ymm2
1191; AVX2-NEXT:    vpsrlq $32, %ymm3, %ymm4
1192; AVX2-NEXT:    vpmuludq %ymm4, %ymm1, %ymm4
1193; AVX2-NEXT:    vpaddq %ymm2, %ymm4, %ymm2
1194; AVX2-NEXT:    vpsllq $32, %ymm2, %ymm2
1195; AVX2-NEXT:    vpmuludq %ymm3, %ymm1, %ymm1
1196; AVX2-NEXT:    vpaddq %ymm2, %ymm1, %ymm1
1197; AVX2-NEXT:    retq
1198;
1199; AVX512-LABEL: mul_v8i64_cast_cond:
1200; AVX512:       # %bb.0:
1201; AVX512-NEXT:    kmovw %edi, %k1
1202; AVX512-NEXT:    vpbroadcastq {{.*#+}} zmm2 = [1,1,1,1,1,1,1,1]
1203; AVX512-NEXT:    vmovdqa64 %zmm1, %zmm2 {%k1}
1204; AVX512-NEXT:    vpsrlq $32, %zmm0, %zmm1
1205; AVX512-NEXT:    vpmuludq %zmm2, %zmm1, %zmm1
1206; AVX512-NEXT:    vpsrlq $32, %zmm2, %zmm3
1207; AVX512-NEXT:    vpmuludq %zmm3, %zmm0, %zmm3
1208; AVX512-NEXT:    vpaddq %zmm1, %zmm3, %zmm1
1209; AVX512-NEXT:    vpsllq $32, %zmm1, %zmm1
1210; AVX512-NEXT:    vpmuludq %zmm2, %zmm0, %zmm0
1211; AVX512-NEXT:    vpaddq %zmm1, %zmm0, %zmm0
1212; AVX512-NEXT:    retq
1213  %b = bitcast i8 %pb to <8 x i1>
1214  %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>
1215  %r = mul <8 x i64> %x, %s
1216  ret <8 x i64> %r
1217}
1218
1219define <4 x i32> @shl_v4i32(<4 x i1> %b, <4 x i32> noundef %x, <4 x i32> noundef %y) {
1220; AVX2-LABEL: shl_v4i32:
1221; AVX2:       # %bb.0:
1222; AVX2-NEXT:    vpslld $31, %xmm0, %xmm0
1223; AVX2-NEXT:    vpsrad $31, %xmm0, %xmm0
1224; AVX2-NEXT:    vpand %xmm2, %xmm0, %xmm0
1225; AVX2-NEXT:    vpsllvd %xmm0, %xmm1, %xmm0
1226; AVX2-NEXT:    retq
1227;
1228; AVX512F-LABEL: shl_v4i32:
1229; AVX512F:       # %bb.0:
1230; AVX512F-NEXT:    # kill: def $xmm2 killed $xmm2 def $zmm2
1231; AVX512F-NEXT:    vpslld $31, %xmm0, %xmm0
1232; AVX512F-NEXT:    vptestmd %zmm0, %zmm0, %k1
1233; AVX512F-NEXT:    vmovdqa32 %zmm2, %zmm0 {%k1} {z}
1234; AVX512F-NEXT:    vpsllvd %xmm0, %xmm1, %xmm0
1235; AVX512F-NEXT:    vzeroupper
1236; AVX512F-NEXT:    retq
1237;
1238; AVX512VL-LABEL: shl_v4i32:
1239; AVX512VL:       # %bb.0:
1240; AVX512VL-NEXT:    vpslld $31, %xmm0, %xmm0
1241; AVX512VL-NEXT:    vptestmd %xmm0, %xmm0, %k1
1242; AVX512VL-NEXT:    vmovdqa32 %xmm2, %xmm0 {%k1} {z}
1243; AVX512VL-NEXT:    vpsllvd %xmm0, %xmm1, %xmm0
1244; AVX512VL-NEXT:    retq
1245  %s = select <4 x i1> %b, <4 x i32> %y, <4 x i32> zeroinitializer
1246  %r = shl <4 x i32> %x, %s
1247  ret <4 x i32> %r
1248}
1249
1250; negative test - shl is not commutative; there is no identity constant for operand 0
1251
1252define <8 x i32> @shl_v8i32_commute(<8 x i1> %b, <8 x i32> noundef %x, <8 x i32> noundef %y) {
1253; AVX2-LABEL: shl_v8i32_commute:
1254; AVX2:       # %bb.0:
1255; 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
1256; AVX2-NEXT:    vpslld $31, %ymm0, %ymm0
1257; AVX2-NEXT:    vpsrad $31, %ymm0, %ymm0
1258; AVX2-NEXT:    vpand %ymm2, %ymm0, %ymm0
1259; AVX2-NEXT:    vpsllvd %ymm1, %ymm0, %ymm0
1260; AVX2-NEXT:    retq
1261;
1262; AVX512F-LABEL: shl_v8i32_commute:
1263; AVX512F:       # %bb.0:
1264; AVX512F-NEXT:    # kill: def $ymm2 killed $ymm2 def $zmm2
1265; AVX512F-NEXT:    vpmovsxwq %xmm0, %zmm0
1266; AVX512F-NEXT:    vpsllq $63, %zmm0, %zmm0
1267; AVX512F-NEXT:    vptestmq %zmm0, %zmm0, %k1
1268; AVX512F-NEXT:    vmovdqa32 %zmm2, %zmm0 {%k1} {z}
1269; AVX512F-NEXT:    vpsllvd %ymm1, %ymm0, %ymm0
1270; AVX512F-NEXT:    retq
1271;
1272; AVX512VL-LABEL: shl_v8i32_commute:
1273; AVX512VL:       # %bb.0:
1274; AVX512VL-NEXT:    vpmovsxwd %xmm0, %ymm0
1275; AVX512VL-NEXT:    vpslld $31, %ymm0, %ymm0
1276; AVX512VL-NEXT:    vptestmd %ymm0, %ymm0, %k1
1277; AVX512VL-NEXT:    vmovdqa32 %ymm2, %ymm0 {%k1} {z}
1278; AVX512VL-NEXT:    vpsllvd %ymm1, %ymm0, %ymm0
1279; AVX512VL-NEXT:    retq
1280  %s = select <8 x i1> %b, <8 x i32> %y, <8 x i32> zeroinitializer
1281  %r = shl <8 x i32> %s, %x
1282  ret <8 x i32> %r
1283}
1284
1285define <16 x i32> @shl_v16i32_swap(<16 x i1> %b, <16 x i32> noundef %x, <16 x i32> noundef %y) {
1286; AVX2-LABEL: shl_v16i32_swap:
1287; AVX2:       # %bb.0:
1288; AVX2-NEXT:    vpunpckhbw {{.*#+}} xmm5 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]
1289; 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
1290; AVX2-NEXT:    vpslld $31, %ymm5, %ymm5
1291; AVX2-NEXT:    vpsrad $31, %ymm5, %ymm5
1292; AVX2-NEXT:    vpandn %ymm4, %ymm5, %ymm4
1293; AVX2-NEXT:    vpmovzxbw {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero
1294; 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
1295; AVX2-NEXT:    vpslld $31, %ymm0, %ymm0
1296; AVX2-NEXT:    vpsrad $31, %ymm0, %ymm0
1297; AVX2-NEXT:    vpandn %ymm3, %ymm0, %ymm0
1298; AVX2-NEXT:    vpsllvd %ymm0, %ymm1, %ymm0
1299; AVX2-NEXT:    vpsllvd %ymm4, %ymm2, %ymm1
1300; AVX2-NEXT:    retq
1301;
1302; AVX512-LABEL: shl_v16i32_swap:
1303; AVX512:       # %bb.0:
1304; AVX512-NEXT:    vpmovsxbd %xmm0, %zmm0
1305; AVX512-NEXT:    vpslld $31, %zmm0, %zmm0
1306; AVX512-NEXT:    vptestnmd %zmm0, %zmm0, %k1
1307; AVX512-NEXT:    vmovdqa32 %zmm2, %zmm0 {%k1} {z}
1308; AVX512-NEXT:    vpsllvd %zmm0, %zmm1, %zmm0
1309; AVX512-NEXT:    retq
1310  %s = select <16 x i1> %b, <16 x i32> zeroinitializer, <16 x i32> %y
1311  %r = shl <16 x i32> %x, %s
1312  ret <16 x i32> %r
1313}
1314
1315; negative test - shl is not commutative; there is no identity constant for operand 0
1316
1317define <16 x i32> @shl_v16i32_commute_swap(<16 x i1> %b, <16 x i32> noundef %x, <16 x i32> noundef %y) {
1318; AVX2-LABEL: shl_v16i32_commute_swap:
1319; AVX2:       # %bb.0:
1320; AVX2-NEXT:    vpunpckhbw {{.*#+}} xmm5 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]
1321; 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
1322; AVX2-NEXT:    vpslld $31, %ymm5, %ymm5
1323; AVX2-NEXT:    vpsrad $31, %ymm5, %ymm5
1324; AVX2-NEXT:    vpandn %ymm4, %ymm5, %ymm4
1325; AVX2-NEXT:    vpmovzxbw {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero
1326; 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
1327; AVX2-NEXT:    vpslld $31, %ymm0, %ymm0
1328; AVX2-NEXT:    vpsrad $31, %ymm0, %ymm0
1329; AVX2-NEXT:    vpandn %ymm3, %ymm0, %ymm0
1330; AVX2-NEXT:    vpsllvd %ymm1, %ymm0, %ymm0
1331; AVX2-NEXT:    vpsllvd %ymm2, %ymm4, %ymm1
1332; AVX2-NEXT:    retq
1333;
1334; AVX512-LABEL: shl_v16i32_commute_swap:
1335; AVX512:       # %bb.0:
1336; AVX512-NEXT:    vpmovsxbd %xmm0, %zmm0
1337; AVX512-NEXT:    vpslld $31, %zmm0, %zmm0
1338; AVX512-NEXT:    vptestnmd %zmm0, %zmm0, %k1
1339; AVX512-NEXT:    vmovdqa32 %zmm2, %zmm0 {%k1} {z}
1340; AVX512-NEXT:    vpsllvd %zmm1, %zmm0, %zmm0
1341; AVX512-NEXT:    retq
1342  %s = select <16 x i1> %b, <16 x i32> zeroinitializer, <16 x i32> %y
1343  %r = shl <16 x i32> %s, %x
1344  ret <16 x i32> %r
1345}
1346
1347define <8 x i32> @shl_v8i32_cast_cond(i8 noundef zeroext %pb, <8 x i32> noundef %x, <8 x i32> noundef %y) {
1348; AVX2-LABEL: shl_v8i32_cast_cond:
1349; AVX2:       # %bb.0:
1350; AVX2-NEXT:    vmovd %edi, %xmm2
1351; AVX2-NEXT:    vpbroadcastb %xmm2, %ymm2
1352; AVX2-NEXT:    vmovdqa {{.*#+}} ymm3 = [1,2,4,8,16,32,64,128]
1353; AVX2-NEXT:    vpand %ymm3, %ymm2, %ymm2
1354; AVX2-NEXT:    vpcmpeqd %ymm3, %ymm2, %ymm2
1355; AVX2-NEXT:    vpand %ymm1, %ymm2, %ymm1
1356; AVX2-NEXT:    vpsllvd %ymm1, %ymm0, %ymm0
1357; AVX2-NEXT:    retq
1358;
1359; AVX512F-LABEL: shl_v8i32_cast_cond:
1360; AVX512F:       # %bb.0:
1361; AVX512F-NEXT:    # kill: def $ymm1 killed $ymm1 def $zmm1
1362; AVX512F-NEXT:    kmovw %edi, %k1
1363; AVX512F-NEXT:    vmovdqa32 %zmm1, %zmm1 {%k1} {z}
1364; AVX512F-NEXT:    vpsllvd %ymm1, %ymm0, %ymm0
1365; AVX512F-NEXT:    retq
1366;
1367; AVX512VL-LABEL: shl_v8i32_cast_cond:
1368; AVX512VL:       # %bb.0:
1369; AVX512VL-NEXT:    kmovw %edi, %k1
1370; AVX512VL-NEXT:    vmovdqa32 %ymm1, %ymm1 {%k1} {z}
1371; AVX512VL-NEXT:    vpsllvd %ymm1, %ymm0, %ymm0
1372; AVX512VL-NEXT:    retq
1373  %b = bitcast i8 %pb to <8 x i1>
1374  %s = select <8 x i1> %b, <8 x i32> %y, <8 x i32> zeroinitializer
1375  %r = shl <8 x i32> %x, %s
1376  ret <8 x i32> %r
1377}
1378
1379define <8 x i64> @shl_v8i64_cast_cond(i8 noundef zeroext %pb, <8 x i64> noundef %x, <8 x i64> noundef %y) {
1380; AVX2-LABEL: shl_v8i64_cast_cond:
1381; AVX2:       # %bb.0:
1382; AVX2-NEXT:    vmovd %edi, %xmm4
1383; AVX2-NEXT:    vpbroadcastb %xmm4, %ymm4
1384; AVX2-NEXT:    vmovdqa {{.*#+}} ymm5 = [16,32,64,128]
1385; AVX2-NEXT:    vpand %ymm5, %ymm4, %ymm6
1386; AVX2-NEXT:    vpcmpeqq %ymm5, %ymm6, %ymm5
1387; AVX2-NEXT:    vpand %ymm3, %ymm5, %ymm3
1388; AVX2-NEXT:    vmovdqa {{.*#+}} ymm5 = [1,2,4,8]
1389; AVX2-NEXT:    vpand %ymm5, %ymm4, %ymm4
1390; AVX2-NEXT:    vpcmpeqq %ymm5, %ymm4, %ymm4
1391; AVX2-NEXT:    vpand %ymm2, %ymm4, %ymm2
1392; AVX2-NEXT:    vpsllvq %ymm2, %ymm0, %ymm0
1393; AVX2-NEXT:    vpsllvq %ymm3, %ymm1, %ymm1
1394; AVX2-NEXT:    retq
1395;
1396; AVX512-LABEL: shl_v8i64_cast_cond:
1397; AVX512:       # %bb.0:
1398; AVX512-NEXT:    kmovw %edi, %k1
1399; AVX512-NEXT:    vmovdqa64 %zmm1, %zmm1 {%k1} {z}
1400; AVX512-NEXT:    vpsllvq %zmm1, %zmm0, %zmm0
1401; AVX512-NEXT:    retq
1402  %b = bitcast i8 %pb to <8 x i1>
1403  %s = select <8 x i1> %b, <8 x i64> %y, <8 x i64> zeroinitializer
1404  %r = shl <8 x i64> %x, %s
1405  ret <8 x i64> %r
1406}
1407
1408define <4 x i32> @lshr_v4i32(<4 x i1> %b, <4 x i32> noundef %x, <4 x i32> noundef %y) {
1409; AVX2-LABEL: lshr_v4i32:
1410; AVX2:       # %bb.0:
1411; AVX2-NEXT:    vpslld $31, %xmm0, %xmm0
1412; AVX2-NEXT:    vpsrad $31, %xmm0, %xmm0
1413; AVX2-NEXT:    vpand %xmm2, %xmm0, %xmm0
1414; AVX2-NEXT:    vpsrlvd %xmm0, %xmm1, %xmm0
1415; AVX2-NEXT:    retq
1416;
1417; AVX512F-LABEL: lshr_v4i32:
1418; AVX512F:       # %bb.0:
1419; AVX512F-NEXT:    # kill: def $xmm2 killed $xmm2 def $zmm2
1420; AVX512F-NEXT:    vpslld $31, %xmm0, %xmm0
1421; AVX512F-NEXT:    vptestmd %zmm0, %zmm0, %k1
1422; AVX512F-NEXT:    vmovdqa32 %zmm2, %zmm0 {%k1} {z}
1423; AVX512F-NEXT:    vpsrlvd %xmm0, %xmm1, %xmm0
1424; AVX512F-NEXT:    vzeroupper
1425; AVX512F-NEXT:    retq
1426;
1427; AVX512VL-LABEL: lshr_v4i32:
1428; AVX512VL:       # %bb.0:
1429; AVX512VL-NEXT:    vpslld $31, %xmm0, %xmm0
1430; AVX512VL-NEXT:    vptestmd %xmm0, %xmm0, %k1
1431; AVX512VL-NEXT:    vmovdqa32 %xmm2, %xmm0 {%k1} {z}
1432; AVX512VL-NEXT:    vpsrlvd %xmm0, %xmm1, %xmm0
1433; AVX512VL-NEXT:    retq
1434  %s = select <4 x i1> %b, <4 x i32> %y, <4 x i32> zeroinitializer
1435  %r = lshr <4 x i32> %x, %s
1436  ret <4 x i32> %r
1437}
1438
1439; negative test - lshr is not commutative; there is no identity constant for operand 0
1440
1441define <8 x i32> @lshr_v8i32_commute(<8 x i1> %b, <8 x i32> noundef %x, <8 x i32> noundef %y) {
1442; AVX2-LABEL: lshr_v8i32_commute:
1443; AVX2:       # %bb.0:
1444; 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
1445; AVX2-NEXT:    vpslld $31, %ymm0, %ymm0
1446; AVX2-NEXT:    vpsrad $31, %ymm0, %ymm0
1447; AVX2-NEXT:    vpand %ymm2, %ymm0, %ymm0
1448; AVX2-NEXT:    vpsrlvd %ymm1, %ymm0, %ymm0
1449; AVX2-NEXT:    retq
1450;
1451; AVX512F-LABEL: lshr_v8i32_commute:
1452; AVX512F:       # %bb.0:
1453; AVX512F-NEXT:    # kill: def $ymm2 killed $ymm2 def $zmm2
1454; AVX512F-NEXT:    vpmovsxwq %xmm0, %zmm0
1455; AVX512F-NEXT:    vpsllq $63, %zmm0, %zmm0
1456; AVX512F-NEXT:    vptestmq %zmm0, %zmm0, %k1
1457; AVX512F-NEXT:    vmovdqa32 %zmm2, %zmm0 {%k1} {z}
1458; AVX512F-NEXT:    vpsrlvd %ymm1, %ymm0, %ymm0
1459; AVX512F-NEXT:    retq
1460;
1461; AVX512VL-LABEL: lshr_v8i32_commute:
1462; AVX512VL:       # %bb.0:
1463; AVX512VL-NEXT:    vpmovsxwd %xmm0, %ymm0
1464; AVX512VL-NEXT:    vpslld $31, %ymm0, %ymm0
1465; AVX512VL-NEXT:    vptestmd %ymm0, %ymm0, %k1
1466; AVX512VL-NEXT:    vmovdqa32 %ymm2, %ymm0 {%k1} {z}
1467; AVX512VL-NEXT:    vpsrlvd %ymm1, %ymm0, %ymm0
1468; AVX512VL-NEXT:    retq
1469  %s = select <8 x i1> %b, <8 x i32> %y, <8 x i32> zeroinitializer
1470  %r = lshr <8 x i32> %s, %x
1471  ret <8 x i32> %r
1472}
1473
1474define <16 x i32> @lshr_v16i32_swap(<16 x i1> %b, <16 x i32> noundef %x, <16 x i32> noundef %y) {
1475; AVX2-LABEL: lshr_v16i32_swap:
1476; AVX2:       # %bb.0:
1477; AVX2-NEXT:    vpunpckhbw {{.*#+}} xmm5 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]
1478; 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
1479; AVX2-NEXT:    vpslld $31, %ymm5, %ymm5
1480; AVX2-NEXT:    vpsrad $31, %ymm5, %ymm5
1481; AVX2-NEXT:    vpandn %ymm4, %ymm5, %ymm4
1482; AVX2-NEXT:    vpmovzxbw {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero
1483; 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
1484; AVX2-NEXT:    vpslld $31, %ymm0, %ymm0
1485; AVX2-NEXT:    vpsrad $31, %ymm0, %ymm0
1486; AVX2-NEXT:    vpandn %ymm3, %ymm0, %ymm0
1487; AVX2-NEXT:    vpsrlvd %ymm0, %ymm1, %ymm0
1488; AVX2-NEXT:    vpsrlvd %ymm4, %ymm2, %ymm1
1489; AVX2-NEXT:    retq
1490;
1491; AVX512-LABEL: lshr_v16i32_swap:
1492; AVX512:       # %bb.0:
1493; AVX512-NEXT:    vpmovsxbd %xmm0, %zmm0
1494; AVX512-NEXT:    vpslld $31, %zmm0, %zmm0
1495; AVX512-NEXT:    vptestnmd %zmm0, %zmm0, %k1
1496; AVX512-NEXT:    vmovdqa32 %zmm2, %zmm0 {%k1} {z}
1497; AVX512-NEXT:    vpsrlvd %zmm0, %zmm1, %zmm0
1498; AVX512-NEXT:    retq
1499  %s = select <16 x i1> %b, <16 x i32> zeroinitializer, <16 x i32> %y
1500  %r = lshr <16 x i32> %x, %s
1501  ret <16 x i32> %r
1502}
1503
1504; negative test - lshr is not commutative; there is no identity constant for operand 0
1505
1506define <16 x i32> @lshr_v16i32_commute_swap(<16 x i1> %b, <16 x i32> noundef %x, <16 x i32> noundef %y) {
1507; AVX2-LABEL: lshr_v16i32_commute_swap:
1508; AVX2:       # %bb.0:
1509; AVX2-NEXT:    vpunpckhbw {{.*#+}} xmm5 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]
1510; 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
1511; AVX2-NEXT:    vpslld $31, %ymm5, %ymm5
1512; AVX2-NEXT:    vpsrad $31, %ymm5, %ymm5
1513; AVX2-NEXT:    vpandn %ymm4, %ymm5, %ymm4
1514; AVX2-NEXT:    vpmovzxbw {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero
1515; 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
1516; AVX2-NEXT:    vpslld $31, %ymm0, %ymm0
1517; AVX2-NEXT:    vpsrad $31, %ymm0, %ymm0
1518; AVX2-NEXT:    vpandn %ymm3, %ymm0, %ymm0
1519; AVX2-NEXT:    vpsrlvd %ymm1, %ymm0, %ymm0
1520; AVX2-NEXT:    vpsrlvd %ymm2, %ymm4, %ymm1
1521; AVX2-NEXT:    retq
1522;
1523; AVX512-LABEL: lshr_v16i32_commute_swap:
1524; AVX512:       # %bb.0:
1525; AVX512-NEXT:    vpmovsxbd %xmm0, %zmm0
1526; AVX512-NEXT:    vpslld $31, %zmm0, %zmm0
1527; AVX512-NEXT:    vptestnmd %zmm0, %zmm0, %k1
1528; AVX512-NEXT:    vmovdqa32 %zmm2, %zmm0 {%k1} {z}
1529; AVX512-NEXT:    vpsrlvd %zmm1, %zmm0, %zmm0
1530; AVX512-NEXT:    retq
1531  %s = select <16 x i1> %b, <16 x i32> zeroinitializer, <16 x i32> %y
1532  %r = lshr <16 x i32> %s, %x
1533  ret <16 x i32> %r
1534}
1535
1536define <8 x i32> @lshr_v8i32_cast_cond(i8 noundef zeroext %pb, <8 x i32> noundef %x, <8 x i32> noundef %y) {
1537; AVX2-LABEL: lshr_v8i32_cast_cond:
1538; AVX2:       # %bb.0:
1539; AVX2-NEXT:    vmovd %edi, %xmm2
1540; AVX2-NEXT:    vpbroadcastb %xmm2, %ymm2
1541; AVX2-NEXT:    vmovdqa {{.*#+}} ymm3 = [1,2,4,8,16,32,64,128]
1542; AVX2-NEXT:    vpand %ymm3, %ymm2, %ymm2
1543; AVX2-NEXT:    vpcmpeqd %ymm3, %ymm2, %ymm2
1544; AVX2-NEXT:    vpand %ymm1, %ymm2, %ymm1
1545; AVX2-NEXT:    vpsrlvd %ymm1, %ymm0, %ymm0
1546; AVX2-NEXT:    retq
1547;
1548; AVX512F-LABEL: lshr_v8i32_cast_cond:
1549; AVX512F:       # %bb.0:
1550; AVX512F-NEXT:    # kill: def $ymm1 killed $ymm1 def $zmm1
1551; AVX512F-NEXT:    kmovw %edi, %k1
1552; AVX512F-NEXT:    vmovdqa32 %zmm1, %zmm1 {%k1} {z}
1553; AVX512F-NEXT:    vpsrlvd %ymm1, %ymm0, %ymm0
1554; AVX512F-NEXT:    retq
1555;
1556; AVX512VL-LABEL: lshr_v8i32_cast_cond:
1557; AVX512VL:       # %bb.0:
1558; AVX512VL-NEXT:    kmovw %edi, %k1
1559; AVX512VL-NEXT:    vmovdqa32 %ymm1, %ymm1 {%k1} {z}
1560; AVX512VL-NEXT:    vpsrlvd %ymm1, %ymm0, %ymm0
1561; AVX512VL-NEXT:    retq
1562  %b = bitcast i8 %pb to <8 x i1>
1563  %s = select <8 x i1> %b, <8 x i32> %y, <8 x i32> zeroinitializer
1564  %r = lshr <8 x i32> %x, %s
1565  ret <8 x i32> %r
1566}
1567
1568define <8 x i64> @lshr_v8i64_cast_cond(i8 noundef zeroext %pb, <8 x i64> noundef %x, <8 x i64> noundef %y) {
1569; AVX2-LABEL: lshr_v8i64_cast_cond:
1570; AVX2:       # %bb.0:
1571; AVX2-NEXT:    vmovd %edi, %xmm4
1572; AVX2-NEXT:    vpbroadcastb %xmm4, %ymm4
1573; AVX2-NEXT:    vmovdqa {{.*#+}} ymm5 = [16,32,64,128]
1574; AVX2-NEXT:    vpand %ymm5, %ymm4, %ymm6
1575; AVX2-NEXT:    vpcmpeqq %ymm5, %ymm6, %ymm5
1576; AVX2-NEXT:    vpand %ymm3, %ymm5, %ymm3
1577; AVX2-NEXT:    vmovdqa {{.*#+}} ymm5 = [1,2,4,8]
1578; AVX2-NEXT:    vpand %ymm5, %ymm4, %ymm4
1579; AVX2-NEXT:    vpcmpeqq %ymm5, %ymm4, %ymm4
1580; AVX2-NEXT:    vpand %ymm2, %ymm4, %ymm2
1581; AVX2-NEXT:    vpsrlvq %ymm2, %ymm0, %ymm0
1582; AVX2-NEXT:    vpsrlvq %ymm3, %ymm1, %ymm1
1583; AVX2-NEXT:    retq
1584;
1585; AVX512-LABEL: lshr_v8i64_cast_cond:
1586; AVX512:       # %bb.0:
1587; AVX512-NEXT:    kmovw %edi, %k1
1588; AVX512-NEXT:    vmovdqa64 %zmm1, %zmm1 {%k1} {z}
1589; AVX512-NEXT:    vpsrlvq %zmm1, %zmm0, %zmm0
1590; AVX512-NEXT:    retq
1591  %b = bitcast i8 %pb to <8 x i1>
1592  %s = select <8 x i1> %b, <8 x i64> %y, <8 x i64> zeroinitializer
1593  %r = lshr <8 x i64> %x, %s
1594  ret <8 x i64> %r
1595}
1596
1597define <4 x i32> @ashr_v4i32(<4 x i1> %b, <4 x i32> noundef %x, <4 x i32> noundef %y) {
1598; AVX2-LABEL: ashr_v4i32:
1599; AVX2:       # %bb.0:
1600; AVX2-NEXT:    vpslld $31, %xmm0, %xmm0
1601; AVX2-NEXT:    vpsrad $31, %xmm0, %xmm0
1602; AVX2-NEXT:    vpand %xmm2, %xmm0, %xmm0
1603; AVX2-NEXT:    vpsravd %xmm0, %xmm1, %xmm0
1604; AVX2-NEXT:    retq
1605;
1606; AVX512F-LABEL: ashr_v4i32:
1607; AVX512F:       # %bb.0:
1608; AVX512F-NEXT:    # kill: def $xmm2 killed $xmm2 def $zmm2
1609; AVX512F-NEXT:    vpslld $31, %xmm0, %xmm0
1610; AVX512F-NEXT:    vptestmd %zmm0, %zmm0, %k1
1611; AVX512F-NEXT:    vmovdqa32 %zmm2, %zmm0 {%k1} {z}
1612; AVX512F-NEXT:    vpsravd %xmm0, %xmm1, %xmm0
1613; AVX512F-NEXT:    vzeroupper
1614; AVX512F-NEXT:    retq
1615;
1616; AVX512VL-LABEL: ashr_v4i32:
1617; AVX512VL:       # %bb.0:
1618; AVX512VL-NEXT:    vpslld $31, %xmm0, %xmm0
1619; AVX512VL-NEXT:    vptestmd %xmm0, %xmm0, %k1
1620; AVX512VL-NEXT:    vmovdqa32 %xmm2, %xmm0 {%k1} {z}
1621; AVX512VL-NEXT:    vpsravd %xmm0, %xmm1, %xmm0
1622; AVX512VL-NEXT:    retq
1623  %s = select <4 x i1> %b, <4 x i32> %y, <4 x i32> zeroinitializer
1624  %r = ashr <4 x i32> %x, %s
1625  ret <4 x i32> %r
1626}
1627
1628; negative test - ashr is not commutative; there is no identity constant for operand 0
1629
1630define <8 x i32> @ashr_v8i32_commute(<8 x i1> %b, <8 x i32> noundef %x, <8 x i32> noundef %y) {
1631; AVX2-LABEL: ashr_v8i32_commute:
1632; AVX2:       # %bb.0:
1633; 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
1634; AVX2-NEXT:    vpslld $31, %ymm0, %ymm0
1635; AVX2-NEXT:    vpsrad $31, %ymm0, %ymm0
1636; AVX2-NEXT:    vpand %ymm2, %ymm0, %ymm0
1637; AVX2-NEXT:    vpsravd %ymm1, %ymm0, %ymm0
1638; AVX2-NEXT:    retq
1639;
1640; AVX512F-LABEL: ashr_v8i32_commute:
1641; AVX512F:       # %bb.0:
1642; AVX512F-NEXT:    # kill: def $ymm2 killed $ymm2 def $zmm2
1643; AVX512F-NEXT:    vpmovsxwq %xmm0, %zmm0
1644; AVX512F-NEXT:    vpsllq $63, %zmm0, %zmm0
1645; AVX512F-NEXT:    vptestmq %zmm0, %zmm0, %k1
1646; AVX512F-NEXT:    vmovdqa32 %zmm2, %zmm0 {%k1} {z}
1647; AVX512F-NEXT:    vpsravd %ymm1, %ymm0, %ymm0
1648; AVX512F-NEXT:    retq
1649;
1650; AVX512VL-LABEL: ashr_v8i32_commute:
1651; AVX512VL:       # %bb.0:
1652; AVX512VL-NEXT:    vpmovsxwd %xmm0, %ymm0
1653; AVX512VL-NEXT:    vpslld $31, %ymm0, %ymm0
1654; AVX512VL-NEXT:    vptestmd %ymm0, %ymm0, %k1
1655; AVX512VL-NEXT:    vmovdqa32 %ymm2, %ymm0 {%k1} {z}
1656; AVX512VL-NEXT:    vpsravd %ymm1, %ymm0, %ymm0
1657; AVX512VL-NEXT:    retq
1658  %s = select <8 x i1> %b, <8 x i32> %y, <8 x i32> zeroinitializer
1659  %r = ashr <8 x i32> %s, %x
1660  ret <8 x i32> %r
1661}
1662
1663define <16 x i32> @ashr_v16i32_swap(<16 x i1> %b, <16 x i32> noundef %x, <16 x i32> noundef %y) {
1664; AVX2-LABEL: ashr_v16i32_swap:
1665; AVX2:       # %bb.0:
1666; AVX2-NEXT:    vpunpckhbw {{.*#+}} xmm5 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]
1667; 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
1668; AVX2-NEXT:    vpslld $31, %ymm5, %ymm5
1669; AVX2-NEXT:    vpsrad $31, %ymm5, %ymm5
1670; AVX2-NEXT:    vpandn %ymm4, %ymm5, %ymm4
1671; AVX2-NEXT:    vpmovzxbw {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero
1672; 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
1673; AVX2-NEXT:    vpslld $31, %ymm0, %ymm0
1674; AVX2-NEXT:    vpsrad $31, %ymm0, %ymm0
1675; AVX2-NEXT:    vpandn %ymm3, %ymm0, %ymm0
1676; AVX2-NEXT:    vpsravd %ymm0, %ymm1, %ymm0
1677; AVX2-NEXT:    vpsravd %ymm4, %ymm2, %ymm1
1678; AVX2-NEXT:    retq
1679;
1680; AVX512-LABEL: ashr_v16i32_swap:
1681; AVX512:       # %bb.0:
1682; AVX512-NEXT:    vpmovsxbd %xmm0, %zmm0
1683; AVX512-NEXT:    vpslld $31, %zmm0, %zmm0
1684; AVX512-NEXT:    vptestnmd %zmm0, %zmm0, %k1
1685; AVX512-NEXT:    vmovdqa32 %zmm2, %zmm0 {%k1} {z}
1686; AVX512-NEXT:    vpsravd %zmm0, %zmm1, %zmm0
1687; AVX512-NEXT:    retq
1688  %s = select <16 x i1> %b, <16 x i32> zeroinitializer, <16 x i32> %y
1689  %r = ashr <16 x i32> %x, %s
1690  ret <16 x i32> %r
1691}
1692
1693; negative test - ashr is not commutative; there is no identity constant for operand 0
1694
1695define <16 x i32> @ashr_v16i32_commute_swap(<16 x i1> %b, <16 x i32> noundef %x, <16 x i32> noundef %y) {
1696; AVX2-LABEL: ashr_v16i32_commute_swap:
1697; AVX2:       # %bb.0:
1698; AVX2-NEXT:    vpunpckhbw {{.*#+}} xmm5 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]
1699; 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
1700; AVX2-NEXT:    vpslld $31, %ymm5, %ymm5
1701; AVX2-NEXT:    vpsrad $31, %ymm5, %ymm5
1702; AVX2-NEXT:    vpandn %ymm4, %ymm5, %ymm4
1703; AVX2-NEXT:    vpmovzxbw {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero
1704; 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
1705; AVX2-NEXT:    vpslld $31, %ymm0, %ymm0
1706; AVX2-NEXT:    vpsrad $31, %ymm0, %ymm0
1707; AVX2-NEXT:    vpandn %ymm3, %ymm0, %ymm0
1708; AVX2-NEXT:    vpsravd %ymm1, %ymm0, %ymm0
1709; AVX2-NEXT:    vpsravd %ymm2, %ymm4, %ymm1
1710; AVX2-NEXT:    retq
1711;
1712; AVX512-LABEL: ashr_v16i32_commute_swap:
1713; AVX512:       # %bb.0:
1714; AVX512-NEXT:    vpmovsxbd %xmm0, %zmm0
1715; AVX512-NEXT:    vpslld $31, %zmm0, %zmm0
1716; AVX512-NEXT:    vptestnmd %zmm0, %zmm0, %k1
1717; AVX512-NEXT:    vmovdqa32 %zmm2, %zmm0 {%k1} {z}
1718; AVX512-NEXT:    vpsravd %zmm1, %zmm0, %zmm0
1719; AVX512-NEXT:    retq
1720  %s = select <16 x i1> %b, <16 x i32> zeroinitializer, <16 x i32> %y
1721  %r = ashr <16 x i32> %s, %x
1722  ret <16 x i32> %r
1723}
1724
1725define <8 x i32> @ashr_v8i32_cast_cond(i8 noundef zeroext %pb, <8 x i32> noundef %x, <8 x i32> noundef %y) {
1726; AVX2-LABEL: ashr_v8i32_cast_cond:
1727; AVX2:       # %bb.0:
1728; AVX2-NEXT:    vmovd %edi, %xmm2
1729; AVX2-NEXT:    vpbroadcastb %xmm2, %ymm2
1730; AVX2-NEXT:    vmovdqa {{.*#+}} ymm3 = [1,2,4,8,16,32,64,128]
1731; AVX2-NEXT:    vpand %ymm3, %ymm2, %ymm2
1732; AVX2-NEXT:    vpcmpeqd %ymm3, %ymm2, %ymm2
1733; AVX2-NEXT:    vpand %ymm1, %ymm2, %ymm1
1734; AVX2-NEXT:    vpsravd %ymm1, %ymm0, %ymm0
1735; AVX2-NEXT:    retq
1736;
1737; AVX512F-LABEL: ashr_v8i32_cast_cond:
1738; AVX512F:       # %bb.0:
1739; AVX512F-NEXT:    # kill: def $ymm1 killed $ymm1 def $zmm1
1740; AVX512F-NEXT:    kmovw %edi, %k1
1741; AVX512F-NEXT:    vmovdqa32 %zmm1, %zmm1 {%k1} {z}
1742; AVX512F-NEXT:    vpsravd %ymm1, %ymm0, %ymm0
1743; AVX512F-NEXT:    retq
1744;
1745; AVX512VL-LABEL: ashr_v8i32_cast_cond:
1746; AVX512VL:       # %bb.0:
1747; AVX512VL-NEXT:    kmovw %edi, %k1
1748; AVX512VL-NEXT:    vmovdqa32 %ymm1, %ymm1 {%k1} {z}
1749; AVX512VL-NEXT:    vpsravd %ymm1, %ymm0, %ymm0
1750; AVX512VL-NEXT:    retq
1751  %b = bitcast i8 %pb to <8 x i1>
1752  %s = select <8 x i1> %b, <8 x i32> %y, <8 x i32> zeroinitializer
1753  %r = ashr <8 x i32> %x, %s
1754  ret <8 x i32> %r
1755}
1756
1757define <8 x i64> @ashr_v8i64_cast_cond(i8 noundef zeroext %pb, <8 x i64> noundef %x, <8 x i64> noundef %y) {
1758; AVX2-LABEL: ashr_v8i64_cast_cond:
1759; AVX2:       # %bb.0:
1760; AVX2-NEXT:    vmovd %edi, %xmm4
1761; AVX2-NEXT:    vpbroadcastb %xmm4, %ymm4
1762; AVX2-NEXT:    vmovdqa {{.*#+}} ymm5 = [16,32,64,128]
1763; AVX2-NEXT:    vpand %ymm5, %ymm4, %ymm6
1764; AVX2-NEXT:    vpcmpeqq %ymm5, %ymm6, %ymm5
1765; AVX2-NEXT:    vpand %ymm3, %ymm5, %ymm3
1766; AVX2-NEXT:    vmovdqa {{.*#+}} ymm5 = [1,2,4,8]
1767; AVX2-NEXT:    vpand %ymm5, %ymm4, %ymm4
1768; AVX2-NEXT:    vpcmpeqq %ymm5, %ymm4, %ymm4
1769; AVX2-NEXT:    vpand %ymm2, %ymm4, %ymm2
1770; AVX2-NEXT:    vpbroadcastq {{.*#+}} ymm4 = [9223372036854775808,9223372036854775808,9223372036854775808,9223372036854775808]
1771; AVX2-NEXT:    vpsrlvq %ymm2, %ymm4, %ymm5
1772; AVX2-NEXT:    vpsrlvq %ymm2, %ymm0, %ymm0
1773; AVX2-NEXT:    vpxor %ymm5, %ymm0, %ymm0
1774; AVX2-NEXT:    vpsubq %ymm5, %ymm0, %ymm0
1775; AVX2-NEXT:    vpsrlvq %ymm3, %ymm4, %ymm2
1776; AVX2-NEXT:    vpsrlvq %ymm3, %ymm1, %ymm1
1777; AVX2-NEXT:    vpxor %ymm2, %ymm1, %ymm1
1778; AVX2-NEXT:    vpsubq %ymm2, %ymm1, %ymm1
1779; AVX2-NEXT:    retq
1780;
1781; AVX512-LABEL: ashr_v8i64_cast_cond:
1782; AVX512:       # %bb.0:
1783; AVX512-NEXT:    kmovw %edi, %k1
1784; AVX512-NEXT:    vmovdqa64 %zmm1, %zmm1 {%k1} {z}
1785; AVX512-NEXT:    vpsravq %zmm1, %zmm0, %zmm0
1786; AVX512-NEXT:    retq
1787  %b = bitcast i8 %pb to <8 x i1>
1788  %s = select <8 x i1> %b, <8 x i64> %y, <8 x i64> zeroinitializer
1789  %r = ashr <8 x i64> %x, %s
1790  ret <8 x i64> %r
1791}
1792