1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2; RUN: llc < %s -mtriple=x86_64-apple-darwin -mcpu=skx | FileCheck %s
3
4define <32 x i8> @test256_1(<32 x i8> %x, <32 x i8> %y) nounwind {
5; CHECK-LABEL: test256_1:
6; CHECK:       ## BB#0:
7; CHECK-NEXT:    vpcmpeqb %ymm1, %ymm0, %k1
8; CHECK-NEXT:    vpblendmb %ymm0, %ymm1, %ymm0 {%k1}
9; CHECK-NEXT:    retq
10  %mask = icmp eq <32 x i8> %x, %y
11  %max = select <32 x i1> %mask, <32 x i8> %x, <32 x i8> %y
12  ret <32 x i8> %max
13}
14
15define <32 x i8> @test256_2(<32 x i8> %x, <32 x i8> %y, <32 x i8> %x1) nounwind {
16; CHECK-LABEL: test256_2:
17; CHECK:       ## BB#0:
18; CHECK-NEXT:    vpcmpgtb %ymm1, %ymm0, %k1
19; CHECK-NEXT:    vpblendmb %ymm0, %ymm2, %ymm0 {%k1}
20; CHECK-NEXT:    retq
21  %mask = icmp sgt <32 x i8> %x, %y
22  %max = select <32 x i1> %mask, <32 x i8> %x, <32 x i8> %x1
23  ret <32 x i8> %max
24}
25
26define <16 x i16> @test256_3(<16 x i16> %x, <16 x i16> %y, <16 x i16> %x1) nounwind {
27; CHECK-LABEL: test256_3:
28; CHECK:       ## BB#0:
29; CHECK-NEXT:    vpcmplew %ymm0, %ymm1, %k1
30; CHECK-NEXT:    vpblendmw %ymm2, %ymm1, %ymm0 {%k1}
31; CHECK-NEXT:    retq
32  %mask = icmp sge <16 x i16> %x, %y
33  %max = select <16 x i1> %mask, <16 x i16> %x1, <16 x i16> %y
34  ret <16 x i16> %max
35}
36
37define <32 x i8> @test256_4(<32 x i8> %x, <32 x i8> %y, <32 x i8> %x1) nounwind {
38; CHECK-LABEL: test256_4:
39; CHECK:       ## BB#0:
40; CHECK-NEXT:    vpcmpnleub %ymm1, %ymm0, %k1
41; CHECK-NEXT:    vpblendmb %ymm0, %ymm2, %ymm0 {%k1}
42; CHECK-NEXT:    retq
43  %mask = icmp ugt <32 x i8> %x, %y
44  %max = select <32 x i1> %mask, <32 x i8> %x, <32 x i8> %x1
45  ret <32 x i8> %max
46}
47
48define <16 x i16> @test256_5(<16 x i16> %x, <16 x i16> %x1, <16 x i16>* %yp) nounwind {
49; CHECK-LABEL: test256_5:
50; CHECK:       ## BB#0:
51; CHECK-NEXT:    vpcmpeqw (%rdi), %ymm0, %k1
52; CHECK-NEXT:    vpblendmw %ymm0, %ymm1, %ymm0 {%k1}
53; CHECK-NEXT:    retq
54  %y = load <16 x i16>, <16 x i16>* %yp, align 4
55  %mask = icmp eq <16 x i16> %x, %y
56  %max = select <16 x i1> %mask, <16 x i16> %x, <16 x i16> %x1
57  ret <16 x i16> %max
58}
59
60define <16 x i16> @test256_6(<16 x i16> %x, <16 x i16> %x1, <16 x i16>* %y.ptr) nounwind {
61; CHECK-LABEL: test256_6:
62; CHECK:       ## BB#0:
63; CHECK-NEXT:    vpcmpgtw (%rdi), %ymm0, %k1
64; CHECK-NEXT:    vpblendmw %ymm0, %ymm1, %ymm0 {%k1}
65; CHECK-NEXT:    retq
66  %y = load <16 x i16>, <16 x i16>* %y.ptr, align 4
67  %mask = icmp sgt <16 x i16> %x, %y
68  %max = select <16 x i1> %mask, <16 x i16> %x, <16 x i16> %x1
69  ret <16 x i16> %max
70}
71
72define <16 x i16> @test256_7(<16 x i16> %x, <16 x i16> %x1, <16 x i16>* %y.ptr) nounwind {
73; CHECK-LABEL: test256_7:
74; CHECK:       ## BB#0:
75; CHECK-NEXT:    vpcmplew (%rdi), %ymm0, %k1
76; CHECK-NEXT:    vpblendmw %ymm0, %ymm1, %ymm0 {%k1}
77; CHECK-NEXT:    retq
78  %y = load <16 x i16>, <16 x i16>* %y.ptr, align 4
79  %mask = icmp sle <16 x i16> %x, %y
80  %max = select <16 x i1> %mask, <16 x i16> %x, <16 x i16> %x1
81  ret <16 x i16> %max
82}
83
84define <16 x i16> @test256_8(<16 x i16> %x, <16 x i16> %x1, <16 x i16>* %y.ptr) nounwind {
85; CHECK-LABEL: test256_8:
86; CHECK:       ## BB#0:
87; CHECK-NEXT:    vpcmpleuw (%rdi), %ymm0, %k1
88; CHECK-NEXT:    vpblendmw %ymm0, %ymm1, %ymm0 {%k1}
89; CHECK-NEXT:    retq
90  %y = load <16 x i16>, <16 x i16>* %y.ptr, align 4
91  %mask = icmp ule <16 x i16> %x, %y
92  %max = select <16 x i1> %mask, <16 x i16> %x, <16 x i16> %x1
93  ret <16 x i16> %max
94}
95
96define <16 x i16> @test256_9(<16 x i16> %x, <16 x i16> %y, <16 x i16> %x1, <16 x i16> %y1) nounwind {
97; CHECK-LABEL: test256_9:
98; CHECK:       ## BB#0:
99; CHECK-NEXT:    vpcmpeqw %ymm1, %ymm0, %k1
100; CHECK-NEXT:    vpcmpeqw %ymm3, %ymm2, %k1 {%k1}
101; CHECK-NEXT:    vpblendmw %ymm0, %ymm1, %ymm0 {%k1}
102; CHECK-NEXT:    retq
103  %mask1 = icmp eq <16 x i16> %x1, %y1
104  %mask0 = icmp eq <16 x i16> %x, %y
105  %mask = select <16 x i1> %mask0, <16 x i1> %mask1, <16 x i1> zeroinitializer
106  %max = select <16 x i1> %mask, <16 x i16> %x, <16 x i16> %y
107  ret <16 x i16> %max
108}
109
110define <32 x i8> @test256_10(<32 x i8> %x, <32 x i8> %y, <32 x i8> %x1, <32 x i8> %y1) nounwind {
111; CHECK-LABEL: test256_10:
112; CHECK:       ## BB#0:
113; CHECK-NEXT:    vpcmpleb %ymm1, %ymm0, %k1
114; CHECK-NEXT:    vpcmpleb %ymm2, %ymm3, %k1 {%k1}
115; CHECK-NEXT:    vpblendmb %ymm0, %ymm2, %ymm0 {%k1}
116; CHECK-NEXT:    retq
117  %mask1 = icmp sge <32 x i8> %x1, %y1
118  %mask0 = icmp sle <32 x i8> %x, %y
119  %mask = select <32 x i1> %mask0, <32 x i1> %mask1, <32 x i1> zeroinitializer
120  %max = select <32 x i1> %mask, <32 x i8> %x, <32 x i8> %x1
121  ret <32 x i8> %max
122}
123
124define <32 x i8> @test256_11(<32 x i8> %x, <32 x i8>* %y.ptr, <32 x i8> %x1, <32 x i8> %y1) nounwind {
125; CHECK-LABEL: test256_11:
126; CHECK:       ## BB#0:
127; CHECK-NEXT:    vpcmpgtb %ymm2, %ymm1, %k1
128; CHECK-NEXT:    vpcmpgtb (%rdi), %ymm0, %k1 {%k1}
129; CHECK-NEXT:    vpblendmb %ymm0, %ymm1, %ymm0 {%k1}
130; CHECK-NEXT:    retq
131  %mask1 = icmp sgt <32 x i8> %x1, %y1
132  %y = load <32 x i8>, <32 x i8>* %y.ptr, align 4
133  %mask0 = icmp sgt <32 x i8> %x, %y
134  %mask = select <32 x i1> %mask0, <32 x i1> %mask1, <32 x i1> zeroinitializer
135  %max = select <32 x i1> %mask, <32 x i8> %x, <32 x i8> %x1
136  ret <32 x i8> %max
137}
138
139define <16 x i16> @test256_12(<16 x i16> %x, <16 x i16>* %y.ptr, <16 x i16> %x1, <16 x i16> %y1) nounwind {
140; CHECK-LABEL: test256_12:
141; CHECK:       ## BB#0:
142; CHECK-NEXT:    vpcmplew %ymm1, %ymm2, %k1
143; CHECK-NEXT:    vpcmpleuw (%rdi), %ymm0, %k1 {%k1}
144; CHECK-NEXT:    vpblendmw %ymm0, %ymm1, %ymm0 {%k1}
145; CHECK-NEXT:    retq
146  %mask1 = icmp sge <16 x i16> %x1, %y1
147  %y = load <16 x i16>, <16 x i16>* %y.ptr, align 4
148  %mask0 = icmp ule <16 x i16> %x, %y
149  %mask = select <16 x i1> %mask0, <16 x i1> %mask1, <16 x i1> zeroinitializer
150  %max = select <16 x i1> %mask, <16 x i16> %x, <16 x i16> %x1
151  ret <16 x i16> %max
152}
153
154define <16 x i8> @test128_1(<16 x i8> %x, <16 x i8> %y) nounwind {
155; CHECK-LABEL: test128_1:
156; CHECK:       ## BB#0:
157; CHECK-NEXT:    vpcmpeqb %xmm1, %xmm0, %k1
158; CHECK-NEXT:    vpblendmb %xmm0, %xmm1, %xmm0 {%k1}
159; CHECK-NEXT:    retq
160  %mask = icmp eq <16 x i8> %x, %y
161  %max = select <16 x i1> %mask, <16 x i8> %x, <16 x i8> %y
162  ret <16 x i8> %max
163}
164
165define <16 x i8> @test128_2(<16 x i8> %x, <16 x i8> %y, <16 x i8> %x1) nounwind {
166; CHECK-LABEL: test128_2:
167; CHECK:       ## BB#0:
168; CHECK-NEXT:    vpcmpgtb %xmm1, %xmm0, %k1
169; CHECK-NEXT:    vpblendmb %xmm0, %xmm2, %xmm0 {%k1}
170; CHECK-NEXT:    retq
171  %mask = icmp sgt <16 x i8> %x, %y
172  %max = select <16 x i1> %mask, <16 x i8> %x, <16 x i8> %x1
173  ret <16 x i8> %max
174}
175
176define <8 x i16> @test128_3(<8 x i16> %x, <8 x i16> %y, <8 x i16> %x1) nounwind {
177; CHECK-LABEL: test128_3:
178; CHECK:       ## BB#0:
179; CHECK-NEXT:    vpcmplew %xmm0, %xmm1, %k1
180; CHECK-NEXT:    vpblendmw %xmm2, %xmm1, %xmm0 {%k1}
181; CHECK-NEXT:    retq
182  %mask = icmp sge <8 x i16> %x, %y
183  %max = select <8 x i1> %mask, <8 x i16> %x1, <8 x i16> %y
184  ret <8 x i16> %max
185}
186
187define <16 x i8> @test128_4(<16 x i8> %x, <16 x i8> %y, <16 x i8> %x1) nounwind {
188; CHECK-LABEL: test128_4:
189; CHECK:       ## BB#0:
190; CHECK-NEXT:    vpcmpnleub %xmm1, %xmm0, %k1
191; CHECK-NEXT:    vpblendmb %xmm0, %xmm2, %xmm0 {%k1}
192; CHECK-NEXT:    retq
193  %mask = icmp ugt <16 x i8> %x, %y
194  %max = select <16 x i1> %mask, <16 x i8> %x, <16 x i8> %x1
195  ret <16 x i8> %max
196}
197
198define <8 x i16> @test128_5(<8 x i16> %x, <8 x i16> %x1, <8 x i16>* %yp) nounwind {
199; CHECK-LABEL: test128_5:
200; CHECK:       ## BB#0:
201; CHECK-NEXT:    vpcmpeqw (%rdi), %xmm0, %k1
202; CHECK-NEXT:    vpblendmw %xmm0, %xmm1, %xmm0 {%k1}
203; CHECK-NEXT:    retq
204  %y = load <8 x i16>, <8 x i16>* %yp, align 4
205  %mask = icmp eq <8 x i16> %x, %y
206  %max = select <8 x i1> %mask, <8 x i16> %x, <8 x i16> %x1
207  ret <8 x i16> %max
208}
209
210define <8 x i16> @test128_6(<8 x i16> %x, <8 x i16> %x1, <8 x i16>* %y.ptr) nounwind {
211; CHECK-LABEL: test128_6:
212; CHECK:       ## BB#0:
213; CHECK-NEXT:    vpcmpgtw (%rdi), %xmm0, %k1
214; CHECK-NEXT:    vpblendmw %xmm0, %xmm1, %xmm0 {%k1}
215; CHECK-NEXT:    retq
216  %y = load <8 x i16>, <8 x i16>* %y.ptr, align 4
217  %mask = icmp sgt <8 x i16> %x, %y
218  %max = select <8 x i1> %mask, <8 x i16> %x, <8 x i16> %x1
219  ret <8 x i16> %max
220}
221
222define <8 x i16> @test128_7(<8 x i16> %x, <8 x i16> %x1, <8 x i16>* %y.ptr) nounwind {
223; CHECK-LABEL: test128_7:
224; CHECK:       ## BB#0:
225; CHECK-NEXT:    vpcmplew (%rdi), %xmm0, %k1
226; CHECK-NEXT:    vpblendmw %xmm0, %xmm1, %xmm0 {%k1}
227; CHECK-NEXT:    retq
228  %y = load <8 x i16>, <8 x i16>* %y.ptr, align 4
229  %mask = icmp sle <8 x i16> %x, %y
230  %max = select <8 x i1> %mask, <8 x i16> %x, <8 x i16> %x1
231  ret <8 x i16> %max
232}
233
234define <8 x i16> @test128_8(<8 x i16> %x, <8 x i16> %x1, <8 x i16>* %y.ptr) nounwind {
235; CHECK-LABEL: test128_8:
236; CHECK:       ## BB#0:
237; CHECK-NEXT:    vpcmpleuw (%rdi), %xmm0, %k1
238; CHECK-NEXT:    vpblendmw %xmm0, %xmm1, %xmm0 {%k1}
239; CHECK-NEXT:    retq
240  %y = load <8 x i16>, <8 x i16>* %y.ptr, align 4
241  %mask = icmp ule <8 x i16> %x, %y
242  %max = select <8 x i1> %mask, <8 x i16> %x, <8 x i16> %x1
243  ret <8 x i16> %max
244}
245
246define <8 x i16> @test128_9(<8 x i16> %x, <8 x i16> %y, <8 x i16> %x1, <8 x i16> %y1) nounwind {
247; CHECK-LABEL: test128_9:
248; CHECK:       ## BB#0:
249; CHECK-NEXT:    vpcmpeqw %xmm1, %xmm0, %k1
250; CHECK-NEXT:    vpcmpeqw %xmm3, %xmm2, %k1 {%k1}
251; CHECK-NEXT:    vpblendmw %xmm0, %xmm1, %xmm0 {%k1}
252; CHECK-NEXT:    retq
253  %mask1 = icmp eq <8 x i16> %x1, %y1
254  %mask0 = icmp eq <8 x i16> %x, %y
255  %mask = select <8 x i1> %mask0, <8 x i1> %mask1, <8 x i1> zeroinitializer
256  %max = select <8 x i1> %mask, <8 x i16> %x, <8 x i16> %y
257  ret <8 x i16> %max
258}
259
260define <16 x i8> @test128_10(<16 x i8> %x, <16 x i8> %y, <16 x i8> %x1, <16 x i8> %y1) nounwind {
261; CHECK-LABEL: test128_10:
262; CHECK:       ## BB#0:
263; CHECK-NEXT:    vpcmpleb %xmm1, %xmm0, %k1
264; CHECK-NEXT:    vpcmpleb %xmm2, %xmm3, %k1 {%k1}
265; CHECK-NEXT:    vpblendmb %xmm0, %xmm2, %xmm0 {%k1}
266; CHECK-NEXT:    retq
267  %mask1 = icmp sge <16 x i8> %x1, %y1
268  %mask0 = icmp sle <16 x i8> %x, %y
269  %mask = select <16 x i1> %mask0, <16 x i1> %mask1, <16 x i1> zeroinitializer
270  %max = select <16 x i1> %mask, <16 x i8> %x, <16 x i8> %x1
271  ret <16 x i8> %max
272}
273
274define <16 x i8> @test128_11(<16 x i8> %x, <16 x i8>* %y.ptr, <16 x i8> %x1, <16 x i8> %y1) nounwind {
275; CHECK-LABEL: test128_11:
276; CHECK:       ## BB#0:
277; CHECK-NEXT:    vpcmpgtb %xmm2, %xmm1, %k1
278; CHECK-NEXT:    vpcmpgtb (%rdi), %xmm0, %k1 {%k1}
279; CHECK-NEXT:    vpblendmb %xmm0, %xmm1, %xmm0 {%k1}
280; CHECK-NEXT:    retq
281  %mask1 = icmp sgt <16 x i8> %x1, %y1
282  %y = load <16 x i8>, <16 x i8>* %y.ptr, align 4
283  %mask0 = icmp sgt <16 x i8> %x, %y
284  %mask = select <16 x i1> %mask0, <16 x i1> %mask1, <16 x i1> zeroinitializer
285  %max = select <16 x i1> %mask, <16 x i8> %x, <16 x i8> %x1
286  ret <16 x i8> %max
287}
288
289define <8 x i16> @test128_12(<8 x i16> %x, <8 x i16>* %y.ptr, <8 x i16> %x1, <8 x i16> %y1) nounwind {
290; CHECK-LABEL: test128_12:
291; CHECK:       ## BB#0:
292; CHECK-NEXT:    vpcmplew %xmm1, %xmm2, %k1
293; CHECK-NEXT:    vpcmpleuw (%rdi), %xmm0, %k1 {%k1}
294; CHECK-NEXT:    vpblendmw %xmm0, %xmm1, %xmm0 {%k1}
295; CHECK-NEXT:    retq
296  %mask1 = icmp sge <8 x i16> %x1, %y1
297  %y = load <8 x i16>, <8 x i16>* %y.ptr, align 4
298  %mask0 = icmp ule <8 x i16> %x, %y
299  %mask = select <8 x i1> %mask0, <8 x i1> %mask1, <8 x i1> zeroinitializer
300  %max = select <8 x i1> %mask, <8 x i16> %x, <8 x i16> %x1
301  ret <8 x i16> %max
302}
303