1; RUN: llc < %s -mtriple=x86_64-apple-darwin -mcpu=skx | FileCheck %s
2
3; CHECK-LABEL: test256_1
4; CHECK: vpcmpeqq {{.*%k[0-7]}}
5; CHECK: vmovdqa64 {{.*}}%k1
6; CHECK: ret
7define <4 x i64> @test256_1(<4 x i64> %x, <4 x i64> %y) nounwind {
8  %mask = icmp eq <4 x i64> %x, %y
9  %max = select <4 x i1> %mask, <4 x i64> %x, <4 x i64> %y
10  ret <4 x i64> %max
11}
12
13; CHECK-LABEL: test256_2
14; CHECK: vpcmpgtq {{.*%k[0-7]}}
15; CHECK: vmovdqa64 {{.*}}%k1
16; CHECK: ret
17define <4 x i64> @test256_2(<4 x i64> %x, <4 x i64> %y, <4 x i64> %x1) nounwind {
18  %mask = icmp sgt <4 x i64> %x, %y
19  %max = select <4 x i1> %mask, <4 x i64> %x1, <4 x i64> %y
20  ret <4 x i64> %max
21}
22
23; CHECK-LABEL: @test256_3
24; CHECK: vpcmpled {{.*%k[0-7]}}
25; CHECK: vmovdqa32
26; CHECK: ret
27define <8 x i32> @test256_3(<8 x i32> %x, <8 x i32> %y, <8 x i32> %x1) nounwind {
28  %mask = icmp sge <8 x i32> %x, %y
29  %max = select <8 x i1> %mask, <8 x i32> %x1, <8 x i32> %y
30  ret <8 x i32> %max
31}
32
33; CHECK-LABEL: test256_4
34; CHECK: vpcmpnleuq {{.*%k[0-7]}}
35; CHECK: vmovdqa64 {{.*}}%k1
36; CHECK: ret
37define <4 x i64> @test256_4(<4 x i64> %x, <4 x i64> %y, <4 x i64> %x1) nounwind {
38  %mask = icmp ugt <4 x i64> %x, %y
39  %max = select <4 x i1> %mask, <4 x i64> %x1, <4 x i64> %y
40  ret <4 x i64> %max
41}
42
43; CHECK-LABEL: test256_5
44; CHECK: vpcmpeqd  (%rdi){{.*%k[0-7]}}
45; CHECK: vmovdqa32
46; CHECK: ret
47define <8 x i32> @test256_5(<8 x i32> %x, <8 x i32> %x1, <8 x i32>* %yp) nounwind {
48  %y = load <8 x i32>* %yp, align 4
49  %mask = icmp eq <8 x i32> %x, %y
50  %max = select <8 x i1> %mask, <8 x i32> %x, <8 x i32> %x1
51  ret <8 x i32> %max
52}
53
54; CHECK-LABEL: @test256_6
55; CHECK: vpcmpgtd (%rdi){{.*%k[0-7]}}
56; CHECK: vmovdqa32
57; CHECK: ret
58define <8 x i32> @test256_6(<8 x i32> %x, <8 x i32> %x1, <8 x i32>* %y.ptr) nounwind {
59  %y = load <8 x i32>* %y.ptr, align 4
60  %mask = icmp sgt <8 x i32> %x, %y
61  %max = select <8 x i1> %mask, <8 x i32> %x, <8 x i32> %x1
62  ret <8 x i32> %max
63}
64
65; CHECK-LABEL: @test256_7
66; CHECK: vpcmpled (%rdi){{.*%k[0-7]}}
67; CHECK: vmovdqa32
68; CHECK: ret
69define <8 x i32> @test256_7(<8 x i32> %x, <8 x i32> %x1, <8 x i32>* %y.ptr) nounwind {
70  %y = load <8 x i32>* %y.ptr, align 4
71  %mask = icmp sle <8 x i32> %x, %y
72  %max = select <8 x i1> %mask, <8 x i32> %x, <8 x i32> %x1
73  ret <8 x i32> %max
74}
75
76; CHECK-LABEL: @test256_8
77; CHECK: vpcmpleud (%rdi){{.*%k[0-7]}}
78; CHECK: vmovdqa32
79; CHECK: ret
80define <8 x i32> @test256_8(<8 x i32> %x, <8 x i32> %x1, <8 x i32>* %y.ptr) nounwind {
81  %y = load <8 x i32>* %y.ptr, align 4
82  %mask = icmp ule <8 x i32> %x, %y
83  %max = select <8 x i1> %mask, <8 x i32> %x, <8 x i32> %x1
84  ret <8 x i32> %max
85}
86
87; CHECK-LABEL: @test256_9
88; CHECK: vpcmpeqd %ymm{{.*{%k[1-7]}}}
89; CHECK: vmovdqa32
90; CHECK: ret
91define <8 x i32> @test256_9(<8 x i32> %x, <8 x i32> %y, <8 x i32> %x1, <8 x i32> %y1) nounwind {
92  %mask1 = icmp eq <8 x i32> %x1, %y1
93  %mask0 = icmp eq <8 x i32> %x, %y
94  %mask = select <8 x i1> %mask0, <8 x i1> %mask1, <8 x i1> zeroinitializer
95  %max = select <8 x i1> %mask, <8 x i32> %x, <8 x i32> %y
96  ret <8 x i32> %max
97}
98
99; CHECK-LABEL: @test256_10
100; CHECK: vpcmpleq %ymm{{.*{%k[1-7]}}}
101; CHECK: vmovdqa64
102; CHECK: ret
103define <4 x i64> @test256_10(<4 x i64> %x, <4 x i64> %y, <4 x i64> %x1, <4 x i64> %y1) nounwind {
104  %mask1 = icmp sge <4 x i64> %x1, %y1
105  %mask0 = icmp sle <4 x i64> %x, %y
106  %mask = select <4 x i1> %mask0, <4 x i1> %mask1, <4 x i1> zeroinitializer
107  %max = select <4 x i1> %mask, <4 x i64> %x, <4 x i64> %x1
108  ret <4 x i64> %max
109}
110
111; CHECK-LABEL: @test256_11
112; CHECK: vpcmpgtq (%rdi){{.*{%k[1-7]}}}
113; CHECK: vmovdqa64
114; CHECK: ret
115define <4 x i64> @test256_11(<4 x i64> %x, <4 x i64>* %y.ptr, <4 x i64> %x1, <4 x i64> %y1) nounwind {
116  %mask1 = icmp sgt <4 x i64> %x1, %y1
117  %y = load <4 x i64>* %y.ptr, align 4
118  %mask0 = icmp sgt <4 x i64> %x, %y
119  %mask = select <4 x i1> %mask0, <4 x i1> %mask1, <4 x i1> zeroinitializer
120  %max = select <4 x i1> %mask, <4 x i64> %x, <4 x i64> %x1
121  ret <4 x i64> %max
122}
123
124; CHECK-LABEL: @test256_12
125; CHECK: vpcmpleud (%rdi){{.*{%k[1-7]}}}
126; CHECK: vmovdqa32
127; CHECK: ret
128define <8 x i32> @test256_12(<8 x i32> %x, <8 x i32>* %y.ptr, <8 x i32> %x1, <8 x i32> %y1) nounwind {
129  %mask1 = icmp sge <8 x i32> %x1, %y1
130  %y = load <8 x i32>* %y.ptr, align 4
131  %mask0 = icmp ule <8 x i32> %x, %y
132  %mask = select <8 x i1> %mask0, <8 x i1> %mask1, <8 x i1> zeroinitializer
133  %max = select <8 x i1> %mask, <8 x i32> %x, <8 x i32> %x1
134  ret <8 x i32> %max
135}
136
137; CHECK-LABEL: test256_13
138; CHECK: vpcmpeqq  (%rdi){1to4}, %ymm
139; CHECK: vmovdqa64
140; CHECK: ret
141define <4 x i64> @test256_13(<4 x i64> %x, <4 x i64> %x1, i64* %yb.ptr) nounwind {
142  %yb = load i64* %yb.ptr, align 4
143  %y.0 = insertelement <4 x i64> undef, i64 %yb, i32 0
144  %y = shufflevector <4 x i64> %y.0, <4 x i64> undef, <4 x i32> zeroinitializer
145  %mask = icmp eq <4 x i64> %x, %y
146  %max = select <4 x i1> %mask, <4 x i64> %x, <4 x i64> %x1
147  ret <4 x i64> %max
148}
149
150; CHECK-LABEL: test256_14
151; CHECK: vpcmpled  (%rdi){1to8}, %ymm
152; CHECK: vmovdqa32
153; CHECK: ret
154define <8 x i32> @test256_14(<8 x i32> %x, i32* %yb.ptr, <8 x i32> %x1) nounwind {
155  %yb = load i32* %yb.ptr, align 4
156  %y.0 = insertelement <8 x i32> undef, i32 %yb, i32 0
157  %y = shufflevector <8 x i32> %y.0, <8 x i32> undef, <8 x i32> zeroinitializer
158  %mask = icmp sle <8 x i32> %x, %y
159  %max = select <8 x i1> %mask, <8 x i32> %x, <8 x i32> %x1
160  ret <8 x i32> %max
161}
162
163; CHECK-LABEL: test256_15
164; CHECK: vpcmpgtd  (%rdi){1to8}, %ymm{{.*{%k[1-7]}}}
165; CHECK: vmovdqa32
166; CHECK: ret
167define <8 x i32> @test256_15(<8 x i32> %x, i32* %yb.ptr, <8 x i32> %x1, <8 x i32> %y1) nounwind {
168  %mask1 = icmp sge <8 x i32> %x1, %y1
169  %yb = load i32* %yb.ptr, align 4
170  %y.0 = insertelement <8 x i32> undef, i32 %yb, i32 0
171  %y = shufflevector <8 x i32> %y.0, <8 x i32> undef, <8 x i32> zeroinitializer
172  %mask0 = icmp sgt <8 x i32> %x, %y
173  %mask = select <8 x i1> %mask0, <8 x i1> %mask1, <8 x i1> zeroinitializer
174  %max = select <8 x i1> %mask, <8 x i32> %x, <8 x i32> %x1
175  ret <8 x i32> %max
176}
177
178; CHECK-LABEL: test256_16
179; CHECK: vpcmpgtq  (%rdi){1to4}, %ymm{{.*{%k[1-7]}}}
180; CHECK: vmovdqa64
181; CHECK: ret
182define <4 x i64> @test256_16(<4 x i64> %x, i64* %yb.ptr, <4 x i64> %x1, <4 x i64> %y1) nounwind {
183  %mask1 = icmp sge <4 x i64> %x1, %y1
184  %yb = load i64* %yb.ptr, align 4
185  %y.0 = insertelement <4 x i64> undef, i64 %yb, i32 0
186  %y = shufflevector <4 x i64> %y.0, <4 x i64> undef, <4 x i32> zeroinitializer
187  %mask0 = icmp sgt <4 x i64> %x, %y
188  %mask = select <4 x i1> %mask0, <4 x i1> %mask1, <4 x i1> zeroinitializer
189  %max = select <4 x i1> %mask, <4 x i64> %x, <4 x i64> %x1
190  ret <4 x i64> %max
191}
192
193; CHECK-LABEL: test128_1
194; CHECK: vpcmpeqq {{.*%k[0-7]}}
195; CHECK: vmovdqa64 {{.*}}%k1
196; CHECK: ret
197define <2 x i64> @test128_1(<2 x i64> %x, <2 x i64> %y) nounwind {
198  %mask = icmp eq <2 x i64> %x, %y
199  %max = select <2 x i1> %mask, <2 x i64> %x, <2 x i64> %y
200  ret <2 x i64> %max
201}
202
203; CHECK-LABEL: test128_2
204; CHECK: vpcmpgtq {{.*%k[0-7]}}
205; CHECK: vmovdqa64 {{.*}}%k1
206; CHECK: ret
207define <2 x i64> @test128_2(<2 x i64> %x, <2 x i64> %y, <2 x i64> %x1) nounwind {
208  %mask = icmp sgt <2 x i64> %x, %y
209  %max = select <2 x i1> %mask, <2 x i64> %x1, <2 x i64> %y
210  ret <2 x i64> %max
211}
212
213; CHECK-LABEL: @test128_3
214; CHECK: vpcmpled {{.*%k[0-7]}}
215; CHECK: vmovdqa32
216; CHECK: ret
217define <4 x i32> @test128_3(<4 x i32> %x, <4 x i32> %y, <4 x i32> %x1) nounwind {
218  %mask = icmp sge <4 x i32> %x, %y
219  %max = select <4 x i1> %mask, <4 x i32> %x1, <4 x i32> %y
220  ret <4 x i32> %max
221}
222
223; CHECK-LABEL: test128_4
224; CHECK: vpcmpnleuq {{.*%k[0-7]}}
225; CHECK: vmovdqa64 {{.*}}%k1
226; CHECK: ret
227define <2 x i64> @test128_4(<2 x i64> %x, <2 x i64> %y, <2 x i64> %x1) nounwind {
228  %mask = icmp ugt <2 x i64> %x, %y
229  %max = select <2 x i1> %mask, <2 x i64> %x1, <2 x i64> %y
230  ret <2 x i64> %max
231}
232
233; CHECK-LABEL: test128_5
234; CHECK: vpcmpeqd  (%rdi){{.*%k[0-7]}}
235; CHECK: vmovdqa32
236; CHECK: ret
237define <4 x i32> @test128_5(<4 x i32> %x, <4 x i32> %x1, <4 x i32>* %yp) nounwind {
238  %y = load <4 x i32>* %yp, align 4
239  %mask = icmp eq <4 x i32> %x, %y
240  %max = select <4 x i1> %mask, <4 x i32> %x, <4 x i32> %x1
241  ret <4 x i32> %max
242}
243
244; CHECK-LABEL: @test128_6
245; CHECK: vpcmpgtd (%rdi){{.*%k[0-7]}}
246; CHECK: vmovdqa32
247; CHECK: ret
248define <4 x i32> @test128_6(<4 x i32> %x, <4 x i32> %x1, <4 x i32>* %y.ptr) nounwind {
249  %y = load <4 x i32>* %y.ptr, align 4
250  %mask = icmp sgt <4 x i32> %x, %y
251  %max = select <4 x i1> %mask, <4 x i32> %x, <4 x i32> %x1
252  ret <4 x i32> %max
253}
254
255; CHECK-LABEL: @test128_7
256; CHECK: vpcmpled (%rdi){{.*%k[0-7]}}
257; CHECK: vmovdqa32
258; CHECK: ret
259define <4 x i32> @test128_7(<4 x i32> %x, <4 x i32> %x1, <4 x i32>* %y.ptr) nounwind {
260  %y = load <4 x i32>* %y.ptr, align 4
261  %mask = icmp sle <4 x i32> %x, %y
262  %max = select <4 x i1> %mask, <4 x i32> %x, <4 x i32> %x1
263  ret <4 x i32> %max
264}
265
266; CHECK-LABEL: @test128_8
267; CHECK: vpcmpleud (%rdi){{.*%k[0-7]}}
268; CHECK: vmovdqa32
269; CHECK: ret
270define <4 x i32> @test128_8(<4 x i32> %x, <4 x i32> %x1, <4 x i32>* %y.ptr) nounwind {
271  %y = load <4 x i32>* %y.ptr, align 4
272  %mask = icmp ule <4 x i32> %x, %y
273  %max = select <4 x i1> %mask, <4 x i32> %x, <4 x i32> %x1
274  ret <4 x i32> %max
275}
276
277; CHECK-LABEL: @test128_9
278; CHECK: vpcmpeqd %xmm{{.*{%k[1-7]}}}
279; CHECK: vmovdqa32
280; CHECK: ret
281define <4 x i32> @test128_9(<4 x i32> %x, <4 x i32> %y, <4 x i32> %x1, <4 x i32> %y1) nounwind {
282  %mask1 = icmp eq <4 x i32> %x1, %y1
283  %mask0 = icmp eq <4 x i32> %x, %y
284  %mask = select <4 x i1> %mask0, <4 x i1> %mask1, <4 x i1> zeroinitializer
285  %max = select <4 x i1> %mask, <4 x i32> %x, <4 x i32> %y
286  ret <4 x i32> %max
287}
288
289; CHECK-LABEL: @test128_10
290; CHECK: vpcmpleq %xmm{{.*{%k[1-7]}}}
291; CHECK: vmovdqa64
292; CHECK: ret
293define <2 x i64> @test128_10(<2 x i64> %x, <2 x i64> %y, <2 x i64> %x1, <2 x i64> %y1) nounwind {
294  %mask1 = icmp sge <2 x i64> %x1, %y1
295  %mask0 = icmp sle <2 x i64> %x, %y
296  %mask = select <2 x i1> %mask0, <2 x i1> %mask1, <2 x i1> zeroinitializer
297  %max = select <2 x i1> %mask, <2 x i64> %x, <2 x i64> %x1
298  ret <2 x i64> %max
299}
300
301; CHECK-LABEL: @test128_11
302; CHECK: vpcmpgtq (%rdi){{.*{%k[1-7]}}}
303; CHECK: vmovdqa64
304; CHECK: ret
305define <2 x i64> @test128_11(<2 x i64> %x, <2 x i64>* %y.ptr, <2 x i64> %x1, <2 x i64> %y1) nounwind {
306  %mask1 = icmp sgt <2 x i64> %x1, %y1
307  %y = load <2 x i64>* %y.ptr, align 4
308  %mask0 = icmp sgt <2 x i64> %x, %y
309  %mask = select <2 x i1> %mask0, <2 x i1> %mask1, <2 x i1> zeroinitializer
310  %max = select <2 x i1> %mask, <2 x i64> %x, <2 x i64> %x1
311  ret <2 x i64> %max
312}
313
314; CHECK-LABEL: @test128_12
315; CHECK: vpcmpleud (%rdi){{.*{%k[1-7]}}}
316; CHECK: vmovdqa32
317; CHECK: ret
318define <4 x i32> @test128_12(<4 x i32> %x, <4 x i32>* %y.ptr, <4 x i32> %x1, <4 x i32> %y1) nounwind {
319  %mask1 = icmp sge <4 x i32> %x1, %y1
320  %y = load <4 x i32>* %y.ptr, align 4
321  %mask0 = icmp ule <4 x i32> %x, %y
322  %mask = select <4 x i1> %mask0, <4 x i1> %mask1, <4 x i1> zeroinitializer
323  %max = select <4 x i1> %mask, <4 x i32> %x, <4 x i32> %x1
324  ret <4 x i32> %max
325}
326
327; CHECK-LABEL: test128_13
328; CHECK: vpcmpeqq  (%rdi){1to2}, %xmm
329; CHECK: vmovdqa64
330; CHECK: ret
331define <2 x i64> @test128_13(<2 x i64> %x, <2 x i64> %x1, i64* %yb.ptr) nounwind {
332  %yb = load i64* %yb.ptr, align 4
333  %y.0 = insertelement <2 x i64> undef, i64 %yb, i32 0
334  %y = insertelement <2 x i64> %y.0, i64 %yb, i32 1
335  %mask = icmp eq <2 x i64> %x, %y
336  %max = select <2 x i1> %mask, <2 x i64> %x, <2 x i64> %x1
337  ret <2 x i64> %max
338}
339
340; CHECK-LABEL: test128_14
341; CHECK: vpcmpled  (%rdi){1to4}, %xmm
342; CHECK: vmovdqa32
343; CHECK: ret
344define <4 x i32> @test128_14(<4 x i32> %x, i32* %yb.ptr, <4 x i32> %x1) nounwind {
345  %yb = load i32* %yb.ptr, align 4
346  %y.0 = insertelement <4 x i32> undef, i32 %yb, i32 0
347  %y = shufflevector <4 x i32> %y.0, <4 x i32> undef, <4 x i32> zeroinitializer
348  %mask = icmp sle <4 x i32> %x, %y
349  %max = select <4 x i1> %mask, <4 x i32> %x, <4 x i32> %x1
350  ret <4 x i32> %max
351}
352
353; CHECK-LABEL: test128_15
354; CHECK: vpcmpgtd  (%rdi){1to4}, %xmm{{.*{%k[1-7]}}}
355; CHECK: vmovdqa32
356; CHECK: ret
357define <4 x i32> @test128_15(<4 x i32> %x, i32* %yb.ptr, <4 x i32> %x1, <4 x i32> %y1) nounwind {
358  %mask1 = icmp sge <4 x i32> %x1, %y1
359  %yb = load i32* %yb.ptr, align 4
360  %y.0 = insertelement <4 x i32> undef, i32 %yb, i32 0
361  %y = shufflevector <4 x i32> %y.0, <4 x i32> undef, <4 x i32> zeroinitializer
362  %mask0 = icmp sgt <4 x i32> %x, %y
363  %mask = select <4 x i1> %mask0, <4 x i1> %mask1, <4 x i1> zeroinitializer
364  %max = select <4 x i1> %mask, <4 x i32> %x, <4 x i32> %x1
365  ret <4 x i32> %max
366}
367
368; CHECK-LABEL: test128_16
369; CHECK: vpcmpgtq  (%rdi){1to2}, %xmm{{.*{%k[1-7]}}}
370; CHECK: vmovdqa64
371; CHECK: ret
372define <2 x i64> @test128_16(<2 x i64> %x, i64* %yb.ptr, <2 x i64> %x1, <2 x i64> %y1) nounwind {
373  %mask1 = icmp sge <2 x i64> %x1, %y1
374  %yb = load i64* %yb.ptr, align 4
375  %y.0 = insertelement <2 x i64> undef, i64 %yb, i32 0
376  %y = insertelement <2 x i64> %y.0, i64 %yb, i32 1
377  %mask0 = icmp sgt <2 x i64> %x, %y
378  %mask = select <2 x i1> %mask0, <2 x i1> %mask1, <2 x i1> zeroinitializer
379  %max = select <2 x i1> %mask, <2 x i64> %x, <2 x i64> %x1
380  ret <2 x i64> %max
381}
382