[mips][msa] Fix vector insertions where the index is variable
[oota-llvm.git] / test / CodeGen / Mips / msa / compare.ll
1 ; RUN: llc -march=mips -mattr=+msa,+fp64 < %s | FileCheck %s
2 ; RUN: llc -march=mipsel -mattr=+msa,+fp64 < %s | FileCheck %s
3
4 define void @ceq_v16i8(<16 x i8>* %c, <16 x i8>* %a, <16 x i8>* %b) nounwind {
5   ; CHECK: ceq_v16i8:
6
7   %1 = load <16 x i8>* %a
8   ; CHECK-DAG: ld.b [[R1:\$w[0-9]+]], 0($5)
9   %2 = load <16 x i8>* %b
10   ; CHECK-DAG: ld.b [[R2:\$w[0-9]+]], 0($6)
11   %3 = icmp eq <16 x i8> %1, %2
12   %4 = sext <16 x i1> %3 to <16 x i8>
13   ; CHECK-DAG: ceq.b [[R3:\$w[0-9]+]], [[R1]], [[R2]]
14   store <16 x i8> %4, <16 x i8>* %c
15   ; CHECK-DAG: st.b [[R3]], 0($4)
16
17   ret void
18   ; CHECK: .size ceq_v16i8
19 }
20
21 define void @ceq_v8i16(<8 x i16>* %c, <8 x i16>* %a, <8 x i16>* %b) nounwind {
22   ; CHECK: ceq_v8i16:
23
24   %1 = load <8 x i16>* %a
25   ; CHECK-DAG: ld.h [[R1:\$w[0-9]+]], 0($5)
26   %2 = load <8 x i16>* %b
27   ; CHECK-DAG: ld.h [[R2:\$w[0-9]+]], 0($6)
28   %3 = icmp eq <8 x i16> %1, %2
29   %4 = sext <8 x i1> %3 to <8 x i16>
30   ; CHECK-DAG: ceq.h [[R3:\$w[0-9]+]], [[R1]], [[R2]]
31   store <8 x i16> %4, <8 x i16>* %c
32   ; CHECK-DAG: st.h [[R3]], 0($4)
33
34   ret void
35   ; CHECK: .size ceq_v8i16
36 }
37
38 define void @ceq_v4i32(<4 x i32>* %c, <4 x i32>* %a, <4 x i32>* %b) nounwind {
39   ; CHECK: ceq_v4i32:
40
41   %1 = load <4 x i32>* %a
42   ; CHECK-DAG: ld.w [[R1:\$w[0-9]+]], 0($5)
43   %2 = load <4 x i32>* %b
44   ; CHECK-DAG: ld.w [[R2:\$w[0-9]+]], 0($6)
45   %3 = icmp eq <4 x i32> %1, %2
46   %4 = sext <4 x i1> %3 to <4 x i32>
47   ; CHECK-DAG: ceq.w [[R3:\$w[0-9]+]], [[R1]], [[R2]]
48   store <4 x i32> %4, <4 x i32>* %c
49   ; CHECK-DAG: st.w [[R3]], 0($4)
50
51   ret void
52   ; CHECK: .size ceq_v4i32
53 }
54
55 define void @ceq_v2i64(<2 x i64>* %c, <2 x i64>* %a, <2 x i64>* %b) nounwind {
56   ; CHECK: ceq_v2i64:
57
58   %1 = load <2 x i64>* %a
59   ; CHECK-DAG: ld.d [[R1:\$w[0-9]+]], 0($5)
60   %2 = load <2 x i64>* %b
61   ; CHECK-DAG: ld.d [[R2:\$w[0-9]+]], 0($6)
62   %3 = icmp eq <2 x i64> %1, %2
63   %4 = sext <2 x i1> %3 to <2 x i64>
64   ; CHECK-DAG: ceq.d [[R3:\$w[0-9]+]], [[R1]], [[R2]]
65   store <2 x i64> %4, <2 x i64>* %c
66   ; CHECK-DAG: st.d [[R3]], 0($4)
67
68   ret void
69   ; CHECK: .size ceq_v2i64
70 }
71
72 define void @cle_s_v16i8(<16 x i8>* %c, <16 x i8>* %a, <16 x i8>* %b) nounwind {
73   ; CHECK: cle_s_v16i8:
74
75   %1 = load <16 x i8>* %a
76   ; CHECK-DAG: ld.b [[R1:\$w[0-9]+]], 0($5)
77   %2 = load <16 x i8>* %b
78   ; CHECK-DAG: ld.b [[R2:\$w[0-9]+]], 0($6)
79   %3 = icmp sle <16 x i8> %1, %2
80   %4 = sext <16 x i1> %3 to <16 x i8>
81   ; CHECK-DAG: cle_s.b [[R3:\$w[0-9]+]], [[R1]], [[R2]]
82   store <16 x i8> %4, <16 x i8>* %c
83   ; CHECK-DAG: st.b [[R3]], 0($4)
84
85   ret void
86   ; CHECK: .size cle_s_v16i8
87 }
88
89 define void @cle_s_v8i16(<8 x i16>* %c, <8 x i16>* %a, <8 x i16>* %b) nounwind {
90   ; CHECK: cle_s_v8i16:
91
92   %1 = load <8 x i16>* %a
93   ; CHECK-DAG: ld.h [[R1:\$w[0-9]+]], 0($5)
94   %2 = load <8 x i16>* %b
95   ; CHECK-DAG: ld.h [[R2:\$w[0-9]+]], 0($6)
96   %3 = icmp sle <8 x i16> %1, %2
97   %4 = sext <8 x i1> %3 to <8 x i16>
98   ; CHECK-DAG: cle_s.h [[R3:\$w[0-9]+]], [[R1]], [[R2]]
99   store <8 x i16> %4, <8 x i16>* %c
100   ; CHECK-DAG: st.h [[R3]], 0($4)
101
102   ret void
103   ; CHECK: .size cle_s_v8i16
104 }
105
106 define void @cle_s_v4i32(<4 x i32>* %c, <4 x i32>* %a, <4 x i32>* %b) nounwind {
107   ; CHECK: cle_s_v4i32:
108
109   %1 = load <4 x i32>* %a
110   ; CHECK-DAG: ld.w [[R1:\$w[0-9]+]], 0($5)
111   %2 = load <4 x i32>* %b
112   ; CHECK-DAG: ld.w [[R2:\$w[0-9]+]], 0($6)
113   %3 = icmp sle <4 x i32> %1, %2
114   %4 = sext <4 x i1> %3 to <4 x i32>
115   ; CHECK-DAG: cle_s.w [[R3:\$w[0-9]+]], [[R1]], [[R2]]
116   store <4 x i32> %4, <4 x i32>* %c
117   ; CHECK-DAG: st.w [[R3]], 0($4)
118
119   ret void
120   ; CHECK: .size cle_s_v4i32
121 }
122
123 define void @cle_s_v2i64(<2 x i64>* %c, <2 x i64>* %a, <2 x i64>* %b) nounwind {
124   ; CHECK: cle_s_v2i64:
125
126   %1 = load <2 x i64>* %a
127   ; CHECK-DAG: ld.d [[R1:\$w[0-9]+]], 0($5)
128   %2 = load <2 x i64>* %b
129   ; CHECK-DAG: ld.d [[R2:\$w[0-9]+]], 0($6)
130   %3 = icmp sle <2 x i64> %1, %2
131   %4 = sext <2 x i1> %3 to <2 x i64>
132   ; CHECK-DAG: cle_s.d [[R3:\$w[0-9]+]], [[R1]], [[R2]]
133   store <2 x i64> %4, <2 x i64>* %c
134   ; CHECK-DAG: st.d [[R3]], 0($4)
135
136   ret void
137   ; CHECK: .size cle_s_v2i64
138 }
139
140 define void @cle_u_v16i8(<16 x i8>* %c, <16 x i8>* %a, <16 x i8>* %b) nounwind {
141   ; CHECK: cle_u_v16i8:
142
143   %1 = load <16 x i8>* %a
144   ; CHECK-DAG: ld.b [[R1:\$w[0-9]+]], 0($5)
145   %2 = load <16 x i8>* %b
146   ; CHECK-DAG: ld.b [[R2:\$w[0-9]+]], 0($6)
147   %3 = icmp ule <16 x i8> %1, %2
148   %4 = sext <16 x i1> %3 to <16 x i8>
149   ; CHECK-DAG: cle_u.b [[R3:\$w[0-9]+]], [[R1]], [[R2]]
150   store <16 x i8> %4, <16 x i8>* %c
151   ; CHECK-DAG: st.b [[R3]], 0($4)
152
153   ret void
154   ; CHECK: .size cle_u_v16i8
155 }
156
157 define void @cle_u_v8i16(<8 x i16>* %c, <8 x i16>* %a, <8 x i16>* %b) nounwind {
158   ; CHECK: cle_u_v8i16:
159
160   %1 = load <8 x i16>* %a
161   ; CHECK-DAG: ld.h [[R1:\$w[0-9]+]], 0($5)
162   %2 = load <8 x i16>* %b
163   ; CHECK-DAG: ld.h [[R2:\$w[0-9]+]], 0($6)
164   %3 = icmp ule <8 x i16> %1, %2
165   %4 = sext <8 x i1> %3 to <8 x i16>
166   ; CHECK-DAG: cle_u.h [[R3:\$w[0-9]+]], [[R1]], [[R2]]
167   store <8 x i16> %4, <8 x i16>* %c
168   ; CHECK-DAG: st.h [[R3]], 0($4)
169
170   ret void
171   ; CHECK: .size cle_u_v8i16
172 }
173
174 define void @cle_u_v4i32(<4 x i32>* %c, <4 x i32>* %a, <4 x i32>* %b) nounwind {
175   ; CHECK: cle_u_v4i32:
176
177   %1 = load <4 x i32>* %a
178   ; CHECK-DAG: ld.w [[R1:\$w[0-9]+]], 0($5)
179   %2 = load <4 x i32>* %b
180   ; CHECK-DAG: ld.w [[R2:\$w[0-9]+]], 0($6)
181   %3 = icmp ule <4 x i32> %1, %2
182   %4 = sext <4 x i1> %3 to <4 x i32>
183   ; CHECK-DAG: cle_u.w [[R3:\$w[0-9]+]], [[R1]], [[R2]]
184   store <4 x i32> %4, <4 x i32>* %c
185   ; CHECK-DAG: st.w [[R3]], 0($4)
186
187   ret void
188   ; CHECK: .size cle_u_v4i32
189 }
190
191 define void @cle_u_v2i64(<2 x i64>* %c, <2 x i64>* %a, <2 x i64>* %b) nounwind {
192   ; CHECK: cle_u_v2i64:
193
194   %1 = load <2 x i64>* %a
195   ; CHECK-DAG: ld.d [[R1:\$w[0-9]+]], 0($5)
196   %2 = load <2 x i64>* %b
197   ; CHECK-DAG: ld.d [[R2:\$w[0-9]+]], 0($6)
198   %3 = icmp ule <2 x i64> %1, %2
199   %4 = sext <2 x i1> %3 to <2 x i64>
200   ; CHECK-DAG: cle_u.d [[R3:\$w[0-9]+]], [[R1]], [[R2]]
201   store <2 x i64> %4, <2 x i64>* %c
202   ; CHECK-DAG: st.d [[R3]], 0($4)
203
204   ret void
205   ; CHECK: .size cle_u_v2i64
206 }
207
208 define void @clt_s_v16i8(<16 x i8>* %c, <16 x i8>* %a, <16 x i8>* %b) nounwind {
209   ; CHECK: clt_s_v16i8:
210
211   %1 = load <16 x i8>* %a
212   ; CHECK-DAG: ld.b [[R1:\$w[0-9]+]], 0($5)
213   %2 = load <16 x i8>* %b
214   ; CHECK-DAG: ld.b [[R2:\$w[0-9]+]], 0($6)
215   %3 = icmp slt <16 x i8> %1, %2
216   %4 = sext <16 x i1> %3 to <16 x i8>
217   ; CHECK-DAG: clt_s.b [[R3:\$w[0-9]+]], [[R1]], [[R2]]
218   store <16 x i8> %4, <16 x i8>* %c
219   ; CHECK-DAG: st.b [[R3]], 0($4)
220
221   ret void
222   ; CHECK: .size clt_s_v16i8
223 }
224
225 define void @clt_s_v8i16(<8 x i16>* %c, <8 x i16>* %a, <8 x i16>* %b) nounwind {
226   ; CHECK: clt_s_v8i16:
227
228   %1 = load <8 x i16>* %a
229   ; CHECK-DAG: ld.h [[R1:\$w[0-9]+]], 0($5)
230   %2 = load <8 x i16>* %b
231   ; CHECK-DAG: ld.h [[R2:\$w[0-9]+]], 0($6)
232   %3 = icmp slt <8 x i16> %1, %2
233   %4 = sext <8 x i1> %3 to <8 x i16>
234   ; CHECK-DAG: clt_s.h [[R3:\$w[0-9]+]], [[R1]], [[R2]]
235   store <8 x i16> %4, <8 x i16>* %c
236   ; CHECK-DAG: st.h [[R3]], 0($4)
237
238   ret void
239   ; CHECK: .size clt_s_v8i16
240 }
241
242 define void @clt_s_v4i32(<4 x i32>* %c, <4 x i32>* %a, <4 x i32>* %b) nounwind {
243   ; CHECK: clt_s_v4i32:
244
245   %1 = load <4 x i32>* %a
246   ; CHECK-DAG: ld.w [[R1:\$w[0-9]+]], 0($5)
247   %2 = load <4 x i32>* %b
248   ; CHECK-DAG: ld.w [[R2:\$w[0-9]+]], 0($6)
249   %3 = icmp slt <4 x i32> %1, %2
250   %4 = sext <4 x i1> %3 to <4 x i32>
251   ; CHECK-DAG: clt_s.w [[R3:\$w[0-9]+]], [[R1]], [[R2]]
252   store <4 x i32> %4, <4 x i32>* %c
253   ; CHECK-DAG: st.w [[R3]], 0($4)
254
255   ret void
256   ; CHECK: .size clt_s_v4i32
257 }
258
259 define void @clt_s_v2i64(<2 x i64>* %c, <2 x i64>* %a, <2 x i64>* %b) nounwind {
260   ; CHECK: clt_s_v2i64:
261
262   %1 = load <2 x i64>* %a
263   ; CHECK-DAG: ld.d [[R1:\$w[0-9]+]], 0($5)
264   %2 = load <2 x i64>* %b
265   ; CHECK-DAG: ld.d [[R2:\$w[0-9]+]], 0($6)
266   %3 = icmp slt <2 x i64> %1, %2
267   %4 = sext <2 x i1> %3 to <2 x i64>
268   ; CHECK-DAG: clt_s.d [[R3:\$w[0-9]+]], [[R1]], [[R2]]
269   store <2 x i64> %4, <2 x i64>* %c
270   ; CHECK-DAG: st.d [[R3]], 0($4)
271
272   ret void
273   ; CHECK: .size clt_s_v2i64
274 }
275
276 define void @clt_u_v16i8(<16 x i8>* %c, <16 x i8>* %a, <16 x i8>* %b) nounwind {
277   ; CHECK: clt_u_v16i8:
278
279   %1 = load <16 x i8>* %a
280   ; CHECK-DAG: ld.b [[R1:\$w[0-9]+]], 0($5)
281   %2 = load <16 x i8>* %b
282   ; CHECK-DAG: ld.b [[R2:\$w[0-9]+]], 0($6)
283   %3 = icmp ult <16 x i8> %1, %2
284   %4 = sext <16 x i1> %3 to <16 x i8>
285   ; CHECK-DAG: clt_u.b [[R3:\$w[0-9]+]], [[R1]], [[R2]]
286   store <16 x i8> %4, <16 x i8>* %c
287   ; CHECK-DAG: st.b [[R3]], 0($4)
288
289   ret void
290   ; CHECK: .size clt_u_v16i8
291 }
292
293 define void @clt_u_v8i16(<8 x i16>* %c, <8 x i16>* %a, <8 x i16>* %b) nounwind {
294   ; CHECK: clt_u_v8i16:
295
296   %1 = load <8 x i16>* %a
297   ; CHECK-DAG: ld.h [[R1:\$w[0-9]+]], 0($5)
298   %2 = load <8 x i16>* %b
299   ; CHECK-DAG: ld.h [[R2:\$w[0-9]+]], 0($6)
300   %3 = icmp ult <8 x i16> %1, %2
301   %4 = sext <8 x i1> %3 to <8 x i16>
302   ; CHECK-DAG: clt_u.h [[R3:\$w[0-9]+]], [[R1]], [[R2]]
303   store <8 x i16> %4, <8 x i16>* %c
304   ; CHECK-DAG: st.h [[R3]], 0($4)
305
306   ret void
307   ; CHECK: .size clt_u_v8i16
308 }
309
310 define void @clt_u_v4i32(<4 x i32>* %c, <4 x i32>* %a, <4 x i32>* %b) nounwind {
311   ; CHECK: clt_u_v4i32:
312
313   %1 = load <4 x i32>* %a
314   ; CHECK-DAG: ld.w [[R1:\$w[0-9]+]], 0($5)
315   %2 = load <4 x i32>* %b
316   ; CHECK-DAG: ld.w [[R2:\$w[0-9]+]], 0($6)
317   %3 = icmp ult <4 x i32> %1, %2
318   %4 = sext <4 x i1> %3 to <4 x i32>
319   ; CHECK-DAG: clt_u.w [[R3:\$w[0-9]+]], [[R1]], [[R2]]
320   store <4 x i32> %4, <4 x i32>* %c
321   ; CHECK-DAG: st.w [[R3]], 0($4)
322
323   ret void
324   ; CHECK: .size clt_u_v4i32
325 }
326
327 define void @clt_u_v2i64(<2 x i64>* %c, <2 x i64>* %a, <2 x i64>* %b) nounwind {
328   ; CHECK: clt_u_v2i64:
329
330   %1 = load <2 x i64>* %a
331   ; CHECK-DAG: ld.d [[R1:\$w[0-9]+]], 0($5)
332   %2 = load <2 x i64>* %b
333   ; CHECK-DAG: ld.d [[R2:\$w[0-9]+]], 0($6)
334   %3 = icmp ult <2 x i64> %1, %2
335   %4 = sext <2 x i1> %3 to <2 x i64>
336   ; CHECK-DAG: clt_u.d [[R3:\$w[0-9]+]], [[R1]], [[R2]]
337   store <2 x i64> %4, <2 x i64>* %c
338   ; CHECK-DAG: st.d [[R3]], 0($4)
339
340   ret void
341   ; CHECK: .size clt_u_v2i64
342 }
343
344 ; There is no != comparison, but test it anyway since we've had legalizer
345 ; issues in this area.
346 define void @cne_v16i8(<16 x i8>* %c, <16 x i8>* %a, <16 x i8>* %b) nounwind {
347   ; CHECK: cne_v16i8:
348   %1 = load <16 x i8>* %a
349   ; CHECK-DAG: ld.b [[R1:\$w[0-9]+]], 0($5)
350   %2 = load <16 x i8>* %b
351   ; CHECK-DAG: ld.b [[R2:\$w[0-9]+]], 0($6)
352   %3 = icmp ne <16 x i8> %1, %2
353   %4 = sext <16 x i1> %3 to <16 x i8>
354   ; CHECK-DAG: ceq.b [[R3:\$w[0-9]+]], [[R1]], [[R2]]
355   ; CHECK-DAG: xori.b [[R3]], [[R3]], 255
356   store <16 x i8> %4, <16 x i8>* %c
357   ; CHECK-DAG: st.b [[R3]], 0($4)
358
359   ret void
360   ; CHECK: .size cne_v16i8
361 }
362
363 ; There is no != comparison, but test it anyway since we've had legalizer
364 ; issues in this area.
365 define void @cne_v8i16(<8 x i16>* %c, <8 x i16>* %a, <8 x i16>* %b) nounwind {
366   ; CHECK: cne_v8i16:
367
368   %1 = load <8 x i16>* %a
369   ; CHECK-DAG: ld.h [[R1:\$w[0-9]+]], 0($5)
370   %2 = load <8 x i16>* %b
371   ; CHECK-DAG: ld.h [[R2:\$w[0-9]+]], 0($6)
372   %3 = icmp ne <8 x i16> %1, %2
373   %4 = sext <8 x i1> %3 to <8 x i16>
374   ; CHECK-DAG: ceq.h [[R3:\$w[0-9]+]], [[R1]], [[R2]]
375   ; TODO: This should be an 'xori.b [[R3]], [[R3]], 255' but thats an optimisation issue
376   ; CHECK-DAG: ldi.b [[R4:\$w[0-9]+]], -1
377   ; CHECK-DAG: xor.v [[R3]], [[R3]], [[R4]]
378   store <8 x i16> %4, <8 x i16>* %c
379   ; CHECK-DAG: st.h [[R3]], 0($4)
380
381   ret void
382   ; CHECK: .size cne_v8i16
383 }
384
385 ; There is no != comparison, but test it anyway since we've had legalizer
386 ; issues in this area.
387 define void @cne_v4i32(<4 x i32>* %c, <4 x i32>* %a, <4 x i32>* %b) nounwind {
388   ; CHECK: cne_v4i32:
389
390   %1 = load <4 x i32>* %a
391   ; CHECK-DAG: ld.w [[R1:\$w[0-9]+]], 0($5)
392   %2 = load <4 x i32>* %b
393   ; CHECK-DAG: ld.w [[R2:\$w[0-9]+]], 0($6)
394   %3 = icmp ne <4 x i32> %1, %2
395   %4 = sext <4 x i1> %3 to <4 x i32>
396   ; CHECK-DAG: ceq.w [[R3:\$w[0-9]+]], [[R1]], [[R2]]
397   ; TODO: This should be an 'xori.b [[R3]], [[R3]], 255' but thats an optimisation issue
398   ; CHECK-DAG: ldi.b [[R4:\$w[0-9]+]], -1
399   ; CHECK-DAG: xor.v [[R3]], [[R3]], [[R4]]
400   store <4 x i32> %4, <4 x i32>* %c
401   ; CHECK-DAG: st.w [[R3]], 0($4)
402
403   ret void
404   ; CHECK: .size cne_v4i32
405 }
406
407 ; There is no != comparison, but test it anyway since we've had legalizer
408 ; issues in this area.
409 define void @cne_v2i64(<2 x i64>* %c, <2 x i64>* %a, <2 x i64>* %b) nounwind {
410   ; CHECK: cne_v2i64:
411
412   %1 = load <2 x i64>* %a
413   ; CHECK-DAG: ld.d [[R1:\$w[0-9]+]], 0($5)
414   %2 = load <2 x i64>* %b
415   ; CHECK-DAG: ld.d [[R2:\$w[0-9]+]], 0($6)
416   %3 = icmp ne <2 x i64> %1, %2
417   %4 = sext <2 x i1> %3 to <2 x i64>
418   ; CHECK-DAG: ceq.d [[R3:\$w[0-9]+]], [[R1]], [[R2]]
419   ; TODO: This should be an 'xori.b [[R3]], [[R3]], 255' but thats an optimisation issue
420   ; CHECK-DAG: ldi.b [[R4:\$w[0-9]+]], -1
421   ; CHECK-DAG: xor.v [[R3]], [[R3]], [[R4]]
422   store <2 x i64> %4, <2 x i64>* %c
423   ; CHECK-DAG: st.d [[R3]], 0($4)
424
425   ret void
426   ; CHECK: .size cne_v2i64
427 }
428
429 define void @ceqi_v16i8(<16 x i8>* %c, <16 x i8>* %a) nounwind {
430   ; CHECK: ceqi_v16i8:
431
432   %1 = load <16 x i8>* %a
433   ; CHECK-DAG: ld.b [[R1:\$w[0-9]+]], 0($5)
434   %2 = icmp eq <16 x i8> %1, <i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1>
435   %3 = sext <16 x i1> %2 to <16 x i8>
436   ; CHECK-DAG: ceqi.b [[R3:\$w[0-9]+]], [[R1]], 1
437   store <16 x i8> %3, <16 x i8>* %c
438   ; CHECK-DAG: st.b [[R3]], 0($4)
439
440   ret void
441   ; CHECK: .size ceqi_v16i8
442 }
443
444 define void @ceqi_v8i16(<8 x i16>* %c, <8 x i16>* %a) nounwind {
445   ; CHECK: ceqi_v8i16:
446
447   %1 = load <8 x i16>* %a
448   ; CHECK-DAG: ld.h [[R1:\$w[0-9]+]], 0($5)
449   %2 = icmp eq <8 x i16> %1, <i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1>
450   %3 = sext <8 x i1> %2 to <8 x i16>
451   ; CHECK-DAG: ceqi.h [[R3:\$w[0-9]+]], [[R1]], 1
452   store <8 x i16> %3, <8 x i16>* %c
453   ; CHECK-DAG: st.h [[R3]], 0($4)
454
455   ret void
456   ; CHECK: .size ceqi_v8i16
457 }
458
459 define void @ceqi_v4i32(<4 x i32>* %c, <4 x i32>* %a) nounwind {
460   ; CHECK: ceqi_v4i32:
461
462   %1 = load <4 x i32>* %a
463   ; CHECK-DAG: ld.w [[R1:\$w[0-9]+]], 0($5)
464   %2 = icmp eq <4 x i32> %1, <i32 1, i32 1, i32 1, i32 1>
465   %3 = sext <4 x i1> %2 to <4 x i32>
466   ; CHECK-DAG: ceqi.w [[R3:\$w[0-9]+]], [[R1]], 1
467   store <4 x i32> %3, <4 x i32>* %c
468   ; CHECK-DAG: st.w [[R3]], 0($4)
469
470   ret void
471   ; CHECK: .size ceqi_v4i32
472 }
473
474 define void @ceqi_v2i64(<2 x i64>* %c, <2 x i64>* %a) nounwind {
475   ; CHECK: ceqi_v2i64:
476
477   %1 = load <2 x i64>* %a
478   ; CHECK-DAG: ld.d [[R1:\$w[0-9]+]], 0($5)
479   %2 = icmp eq <2 x i64> %1, <i64 1, i64 1>
480   %3 = sext <2 x i1> %2 to <2 x i64>
481   ; CHECK-DAG: ceqi.d [[R3:\$w[0-9]+]], [[R1]], 1
482   store <2 x i64> %3, <2 x i64>* %c
483   ; CHECK-DAG: st.d [[R3]], 0($4)
484
485   ret void
486   ; CHECK: .size ceqi_v2i64
487 }
488
489 define void @clei_s_v16i8(<16 x i8>* %c, <16 x i8>* %a) nounwind {
490   ; CHECK: clei_s_v16i8:
491
492   %1 = load <16 x i8>* %a
493   ; CHECK-DAG: ld.b [[R1:\$w[0-9]+]], 0($5)
494   %2 = icmp sle <16 x i8> %1, <i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1>
495   %3 = sext <16 x i1> %2 to <16 x i8>
496   ; CHECK-DAG: clei_s.b [[R3:\$w[0-9]+]], [[R1]], 1
497   store <16 x i8> %3, <16 x i8>* %c
498   ; CHECK-DAG: st.b [[R3]], 0($4)
499
500   ret void
501   ; CHECK: .size clei_s_v16i8
502 }
503
504 define void @clei_s_v8i16(<8 x i16>* %c, <8 x i16>* %a) nounwind {
505   ; CHECK: clei_s_v8i16:
506
507   %1 = load <8 x i16>* %a
508   ; CHECK-DAG: ld.h [[R1:\$w[0-9]+]], 0($5)
509   %2 = icmp sle <8 x i16> %1, <i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1>
510   %3 = sext <8 x i1> %2 to <8 x i16>
511   ; CHECK-DAG: clei_s.h [[R3:\$w[0-9]+]], [[R1]], 1
512   store <8 x i16> %3, <8 x i16>* %c
513   ; CHECK-DAG: st.h [[R3]], 0($4)
514
515   ret void
516   ; CHECK: .size clei_s_v8i16
517 }
518
519 define void @clei_s_v4i32(<4 x i32>* %c, <4 x i32>* %a) nounwind {
520   ; CHECK: clei_s_v4i32:
521
522   %1 = load <4 x i32>* %a
523   ; CHECK-DAG: ld.w [[R1:\$w[0-9]+]], 0($5)
524   %2 = icmp sle <4 x i32> %1, <i32 1, i32 1, i32 1, i32 1>
525   %3 = sext <4 x i1> %2 to <4 x i32>
526   ; CHECK-DAG: clei_s.w [[R3:\$w[0-9]+]], [[R1]], 1
527   store <4 x i32> %3, <4 x i32>* %c
528   ; CHECK-DAG: st.w [[R3]], 0($4)
529
530   ret void
531   ; CHECK: .size clei_s_v4i32
532 }
533
534 define void @clei_s_v2i64(<2 x i64>* %c, <2 x i64>* %a) nounwind {
535   ; CHECK: clei_s_v2i64:
536
537   %1 = load <2 x i64>* %a
538   ; CHECK-DAG: ld.d [[R1:\$w[0-9]+]], 0($5)
539   %2 = icmp sle <2 x i64> %1, <i64 1, i64 1>
540   %3 = sext <2 x i1> %2 to <2 x i64>
541   ; CHECK-DAG: clei_s.d [[R3:\$w[0-9]+]], [[R1]], 1
542   store <2 x i64> %3, <2 x i64>* %c
543   ; CHECK-DAG: st.d [[R3]], 0($4)
544
545   ret void
546   ; CHECK: .size clei_s_v2i64
547 }
548
549 define void @clei_u_v16i8(<16 x i8>* %c, <16 x i8>* %a) nounwind {
550   ; CHECK: clei_u_v16i8:
551
552   %1 = load <16 x i8>* %a
553   ; CHECK-DAG: ld.b [[R1:\$w[0-9]+]], 0($5)
554   %2 = icmp ule <16 x i8> %1, <i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1>
555   %3 = sext <16 x i1> %2 to <16 x i8>
556   ; CHECK-DAG: clei_u.b [[R3:\$w[0-9]+]], [[R1]], 1
557   store <16 x i8> %3, <16 x i8>* %c
558   ; CHECK-DAG: st.b [[R3]], 0($4)
559
560   ret void
561   ; CHECK: .size clei_u_v16i8
562 }
563
564 define void @clei_u_v8i16(<8 x i16>* %c, <8 x i16>* %a) nounwind {
565   ; CHECK: clei_u_v8i16:
566
567   %1 = load <8 x i16>* %a
568   ; CHECK-DAG: ld.h [[R1:\$w[0-9]+]], 0($5)
569   %2 = icmp ule <8 x i16> %1, <i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1>
570   %3 = sext <8 x i1> %2 to <8 x i16>
571   ; CHECK-DAG: clei_u.h [[R3:\$w[0-9]+]], [[R1]], 1
572   store <8 x i16> %3, <8 x i16>* %c
573   ; CHECK-DAG: st.h [[R3]], 0($4)
574
575   ret void
576   ; CHECK: .size clei_u_v8i16
577 }
578
579 define void @clei_u_v4i32(<4 x i32>* %c, <4 x i32>* %a) nounwind {
580   ; CHECK: clei_u_v4i32:
581
582   %1 = load <4 x i32>* %a
583   ; CHECK-DAG: ld.w [[R1:\$w[0-9]+]], 0($5)
584   %2 = icmp ule <4 x i32> %1, <i32 1, i32 1, i32 1, i32 1>
585   %3 = sext <4 x i1> %2 to <4 x i32>
586   ; CHECK-DAG: clei_u.w [[R3:\$w[0-9]+]], [[R1]], 1
587   store <4 x i32> %3, <4 x i32>* %c
588   ; CHECK-DAG: st.w [[R3]], 0($4)
589
590   ret void
591   ; CHECK: .size clei_u_v4i32
592 }
593
594 define void @clei_u_v2i64(<2 x i64>* %c, <2 x i64>* %a) nounwind {
595   ; CHECK: clei_u_v2i64:
596
597   %1 = load <2 x i64>* %a
598   ; CHECK-DAG: ld.d [[R1:\$w[0-9]+]], 0($5)
599   %2 = icmp ule <2 x i64> %1, <i64 1, i64 1>
600   %3 = sext <2 x i1> %2 to <2 x i64>
601   ; CHECK-DAG: clei_u.d [[R3:\$w[0-9]+]], [[R1]], 1
602   store <2 x i64> %3, <2 x i64>* %c
603   ; CHECK-DAG: st.d [[R3]], 0($4)
604
605   ret void
606   ; CHECK: .size clei_u_v2i64
607 }
608
609 define void @clti_s_v16i8(<16 x i8>* %c, <16 x i8>* %a) nounwind {
610   ; CHECK: clti_s_v16i8:
611
612   %1 = load <16 x i8>* %a
613   ; CHECK-DAG: ld.b [[R1:\$w[0-9]+]], 0($5)
614   %2 = icmp slt <16 x i8> %1, <i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1>
615   %3 = sext <16 x i1> %2 to <16 x i8>
616   ; CHECK-DAG: clti_s.b [[R3:\$w[0-9]+]], [[R1]], 1
617   store <16 x i8> %3, <16 x i8>* %c
618   ; CHECK-DAG: st.b [[R3]], 0($4)
619
620   ret void
621   ; CHECK: .size clti_s_v16i8
622 }
623
624 define void @clti_s_v8i16(<8 x i16>* %c, <8 x i16>* %a) nounwind {
625   ; CHECK: clti_s_v8i16:
626
627   %1 = load <8 x i16>* %a
628   ; CHECK-DAG: ld.h [[R1:\$w[0-9]+]], 0($5)
629   %2 = icmp slt <8 x i16> %1, <i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1>
630   %3 = sext <8 x i1> %2 to <8 x i16>
631   ; CHECK-DAG: clti_s.h [[R3:\$w[0-9]+]], [[R1]], 1
632   store <8 x i16> %3, <8 x i16>* %c
633   ; CHECK-DAG: st.h [[R3]], 0($4)
634
635   ret void
636   ; CHECK: .size clti_s_v8i16
637 }
638
639 define void @clti_s_v4i32(<4 x i32>* %c, <4 x i32>* %a) nounwind {
640   ; CHECK: clti_s_v4i32:
641
642   %1 = load <4 x i32>* %a
643   ; CHECK-DAG: ld.w [[R1:\$w[0-9]+]], 0($5)
644   %2 = icmp slt <4 x i32> %1, <i32 1, i32 1, i32 1, i32 1>
645   %3 = sext <4 x i1> %2 to <4 x i32>
646   ; CHECK-DAG: clti_s.w [[R3:\$w[0-9]+]], [[R1]], 1
647   store <4 x i32> %3, <4 x i32>* %c
648   ; CHECK-DAG: st.w [[R3]], 0($4)
649
650   ret void
651   ; CHECK: .size clti_s_v4i32
652 }
653
654 define void @clti_s_v2i64(<2 x i64>* %c, <2 x i64>* %a) nounwind {
655   ; CHECK: clti_s_v2i64:
656
657   %1 = load <2 x i64>* %a
658   ; CHECK-DAG: ld.d [[R1:\$w[0-9]+]], 0($5)
659   %2 = icmp slt <2 x i64> %1, <i64 1, i64 1>
660   %3 = sext <2 x i1> %2 to <2 x i64>
661   ; CHECK-DAG: clti_s.d [[R3:\$w[0-9]+]], [[R1]], 1
662   store <2 x i64> %3, <2 x i64>* %c
663   ; CHECK-DAG: st.d [[R3]], 0($4)
664
665   ret void
666   ; CHECK: .size clti_s_v2i64
667 }
668
669 define void @clti_u_v16i8(<16 x i8>* %c, <16 x i8>* %a) nounwind {
670   ; CHECK: clti_u_v16i8:
671
672   %1 = load <16 x i8>* %a
673   ; CHECK-DAG: ld.b [[R1:\$w[0-9]+]], 0($5)
674   %2 = icmp ult <16 x i8> %1, <i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1>
675   %3 = sext <16 x i1> %2 to <16 x i8>
676   ; CHECK-DAG: clti_u.b [[R3:\$w[0-9]+]], [[R1]], 1
677   store <16 x i8> %3, <16 x i8>* %c
678   ; CHECK-DAG: st.b [[R3]], 0($4)
679
680   ret void
681   ; CHECK: .size clti_u_v16i8
682 }
683
684 define void @clti_u_v8i16(<8 x i16>* %c, <8 x i16>* %a) nounwind {
685   ; CHECK: clti_u_v8i16:
686
687   %1 = load <8 x i16>* %a
688   ; CHECK-DAG: ld.h [[R1:\$w[0-9]+]], 0($5)
689   %2 = icmp ult <8 x i16> %1, <i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1>
690   %3 = sext <8 x i1> %2 to <8 x i16>
691   ; CHECK-DAG: clti_u.h [[R3:\$w[0-9]+]], [[R1]], 1
692   store <8 x i16> %3, <8 x i16>* %c
693   ; CHECK-DAG: st.h [[R3]], 0($4)
694
695   ret void
696   ; CHECK: .size clti_u_v8i16
697 }
698
699 define void @clti_u_v4i32(<4 x i32>* %c, <4 x i32>* %a) nounwind {
700   ; CHECK: clti_u_v4i32:
701
702   %1 = load <4 x i32>* %a
703   ; CHECK-DAG: ld.w [[R1:\$w[0-9]+]], 0($5)
704   %2 = icmp ult <4 x i32> %1, <i32 1, i32 1, i32 1, i32 1>
705   %3 = sext <4 x i1> %2 to <4 x i32>
706   ; CHECK-DAG: clti_u.w [[R3:\$w[0-9]+]], [[R1]], 1
707   store <4 x i32> %3, <4 x i32>* %c
708   ; CHECK-DAG: st.w [[R3]], 0($4)
709
710   ret void
711   ; CHECK: .size clti_u_v4i32
712 }
713
714 define void @clti_u_v2i64(<2 x i64>* %c, <2 x i64>* %a) nounwind {
715   ; CHECK: clti_u_v2i64:
716
717   %1 = load <2 x i64>* %a
718   ; CHECK-DAG: ld.d [[R1:\$w[0-9]+]], 0($5)
719   %2 = icmp ult <2 x i64> %1, <i64 1, i64 1>
720   %3 = sext <2 x i1> %2 to <2 x i64>
721   ; CHECK-DAG: clti_u.d [[R3:\$w[0-9]+]], [[R1]], 1
722   store <2 x i64> %3, <2 x i64>* %c
723   ; CHECK-DAG: st.d [[R3]], 0($4)
724
725   ret void
726   ; CHECK: .size clti_u_v2i64
727 }
728
729 define void @bsel_s_v16i8(<16 x i8>* %d, <16 x i8>* %a, <16 x i8>* %b,
730                         <16 x i8>* %c) nounwind {
731   ; CHECK: bsel_s_v16i8:
732
733   %1 = load <16 x i8>* %a
734   ; CHECK-DAG: ld.b [[R1:\$w[0-9]+]], 0($5)
735   %2 = load <16 x i8>* %b
736   ; CHECK-DAG: ld.b [[R2:\$w[0-9]+]], 0($6)
737   %3 = load <16 x i8>* %c
738   ; CHECK-DAG: ld.b [[R3:\$w[0-9]+]], 0($7)
739   %4 = icmp sgt <16 x i8> %1, %2
740   ; CHECK-DAG: clt_s.b [[R4:\$w[0-9]+]], [[R2]], [[R1]]
741   %5 = select <16 x i1> %4, <16 x i8> %1, <16 x i8> %3
742   ; bmnz.v is the same operation
743   ; CHECK-DAG: bmnz.v [[R3]], [[R1]], [[R4]]
744   store <16 x i8> %5, <16 x i8>* %d
745   ; CHECK-DAG: st.b [[R3]], 0($4)
746
747   ret void
748   ; CHECK: .size bsel_s_v16i8
749 }
750
751 define void @bsel_s_v8i16(<8 x i16>* %d, <8 x i16>* %a, <8 x i16>* %b,
752                         <8 x i16>* %c) nounwind {
753   ; CHECK: bsel_s_v8i16:
754
755   %1 = load <8 x i16>* %a
756   ; CHECK-DAG: ld.h [[R1:\$w[0-9]+]], 0($5)
757   %2 = load <8 x i16>* %b
758   ; CHECK-DAG: ld.h [[R2:\$w[0-9]+]], 0($6)
759   %3 = load <8 x i16>* %c
760   ; CHECK-DAG: ld.h [[R3:\$w[0-9]+]], 0($7)
761   %4 = icmp sgt <8 x i16> %1, %2
762   ; CHECK-DAG: clt_s.h [[R4:\$w[0-9]+]], [[R2]], [[R1]]
763   %5 = select <8 x i1> %4, <8 x i16> %1, <8 x i16> %3
764   ; Note that IfSet and IfClr are swapped since the condition is inverted
765   ; CHECK-DAG: bsel.v [[R4]], [[R3]], [[R1]]
766   store <8 x i16> %5, <8 x i16>* %d
767   ; CHECK-DAG: st.h [[R4]], 0($4)
768
769   ret void
770   ; CHECK: .size bsel_s_v8i16
771 }
772
773 define void @bsel_s_v4i32(<4 x i32>* %d, <4 x i32>* %a, <4 x i32>* %b,
774                         <4 x i32>* %c) nounwind {
775   ; CHECK: bsel_s_v4i32:
776
777   %1 = load <4 x i32>* %a
778   ; CHECK-DAG: ld.w [[R1:\$w[0-9]+]], 0($5)
779   %2 = load <4 x i32>* %b
780   ; CHECK-DAG: ld.w [[R2:\$w[0-9]+]], 0($6)
781   %3 = load <4 x i32>* %c
782   ; CHECK-DAG: ld.w [[R3:\$w[0-9]+]], 0($7)
783   %4 = icmp sgt <4 x i32> %1, %2
784   ; CHECK-DAG: clt_s.w [[R4:\$w[0-9]+]], [[R2]], [[R1]]
785   %5 = select <4 x i1> %4, <4 x i32> %1, <4 x i32> %3
786   ; Note that IfSet and IfClr are swapped since the condition is inverted
787   ; CHECK-DAG: bsel.v [[R4]], [[R3]], [[R1]]
788   store <4 x i32> %5, <4 x i32>* %d
789   ; CHECK-DAG: st.w [[R4]], 0($4)
790
791   ret void
792   ; CHECK: .size bsel_s_v4i32
793 }
794
795 define void @bsel_s_v2i64(<2 x i64>* %d, <2 x i64>* %a, <2 x i64>* %b,
796                         <2 x i64>* %c) nounwind {
797   ; CHECK: bsel_s_v2i64:
798
799   %1 = load <2 x i64>* %a
800   ; CHECK-DAG: ld.d [[R1:\$w[0-9]+]], 0($5)
801   %2 = load <2 x i64>* %b
802   ; CHECK-DAG: ld.d [[R2:\$w[0-9]+]], 0($6)
803   %3 = load <2 x i64>* %c
804   ; CHECK-DAG: ld.d [[R3:\$w[0-9]+]], 0($7)
805   %4 = icmp sgt <2 x i64> %1, %2
806   ; CHECK-DAG: clt_s.d [[R4:\$w[0-9]+]], [[R2]], [[R1]]
807   %5 = select <2 x i1> %4, <2 x i64> %1, <2 x i64> %3
808   ; Note that IfSet and IfClr are swapped since the condition is inverted
809   ; CHECK-DAG: bsel.v [[R4]], [[R3]], [[R1]]
810   store <2 x i64> %5, <2 x i64>* %d
811   ; CHECK-DAG: st.d [[R4]], 0($4)
812
813   ret void
814   ; CHECK: .size bsel_s_v2i64
815 }
816
817 define void @bsel_u_v16i8(<16 x i8>* %d, <16 x i8>* %a, <16 x i8>* %b,
818                         <16 x i8>* %c) nounwind {
819   ; CHECK: bsel_u_v16i8:
820
821   %1 = load <16 x i8>* %a
822   ; CHECK-DAG: ld.b [[R1:\$w[0-9]+]], 0($5)
823   %2 = load <16 x i8>* %b
824   ; CHECK-DAG: ld.b [[R2:\$w[0-9]+]], 0($6)
825   %3 = load <16 x i8>* %c
826   ; CHECK-DAG: ld.b [[R3:\$w[0-9]+]], 0($7)
827   %4 = icmp ugt <16 x i8> %1, %2
828   ; CHECK-DAG: clt_u.b [[R4:\$w[0-9]+]], [[R2]], [[R1]]
829   %5 = select <16 x i1> %4, <16 x i8> %1, <16 x i8> %3
830   ; bmnz.v is the same operation
831   ; CHECK-DAG: bmnz.v [[R3]], [[R1]], [[R4]]
832   store <16 x i8> %5, <16 x i8>* %d
833   ; CHECK-DAG: st.b [[R3]], 0($4)
834
835   ret void
836   ; CHECK: .size bsel_u_v16i8
837 }
838
839 define void @bsel_u_v8i16(<8 x i16>* %d, <8 x i16>* %a, <8 x i16>* %b,
840                         <8 x i16>* %c) nounwind {
841   ; CHECK: bsel_u_v8i16:
842
843   %1 = load <8 x i16>* %a
844   ; CHECK-DAG: ld.h [[R1:\$w[0-9]+]], 0($5)
845   %2 = load <8 x i16>* %b
846   ; CHECK-DAG: ld.h [[R2:\$w[0-9]+]], 0($6)
847   %3 = load <8 x i16>* %c
848   ; CHECK-DAG: ld.h [[R3:\$w[0-9]+]], 0($7)
849   %4 = icmp ugt <8 x i16> %1, %2
850   ; CHECK-DAG: clt_u.h [[R4:\$w[0-9]+]], [[R2]], [[R1]]
851   %5 = select <8 x i1> %4, <8 x i16> %1, <8 x i16> %3
852   ; Note that IfSet and IfClr are swapped since the condition is inverted
853   ; CHECK-DAG: bsel.v [[R4]], [[R3]], [[R1]]
854   store <8 x i16> %5, <8 x i16>* %d
855   ; CHECK-DAG: st.h [[R4]], 0($4)
856
857   ret void
858   ; CHECK: .size bsel_u_v8i16
859 }
860
861 define void @bsel_u_v4i32(<4 x i32>* %d, <4 x i32>* %a, <4 x i32>* %b,
862                         <4 x i32>* %c) nounwind {
863   ; CHECK: bsel_u_v4i32:
864
865   %1 = load <4 x i32>* %a
866   ; CHECK-DAG: ld.w [[R1:\$w[0-9]+]], 0($5)
867   %2 = load <4 x i32>* %b
868   ; CHECK-DAG: ld.w [[R2:\$w[0-9]+]], 0($6)
869   %3 = load <4 x i32>* %c
870   ; CHECK-DAG: ld.w [[R3:\$w[0-9]+]], 0($7)
871   %4 = icmp ugt <4 x i32> %1, %2
872   ; CHECK-DAG: clt_u.w [[R4:\$w[0-9]+]], [[R2]], [[R1]]
873   %5 = select <4 x i1> %4, <4 x i32> %1, <4 x i32> %3
874   ; Note that IfSet and IfClr are swapped since the condition is inverted
875   ; CHECK-DAG: bsel.v [[R4]], [[R3]], [[R1]]
876   store <4 x i32> %5, <4 x i32>* %d
877   ; CHECK-DAG: st.w [[R4]], 0($4)
878
879   ret void
880   ; CHECK: .size bsel_u_v4i32
881 }
882
883 define void @bsel_u_v2i64(<2 x i64>* %d, <2 x i64>* %a, <2 x i64>* %b,
884                         <2 x i64>* %c) nounwind {
885   ; CHECK: bsel_u_v2i64:
886
887   %1 = load <2 x i64>* %a
888   ; CHECK-DAG: ld.d [[R1:\$w[0-9]+]], 0($5)
889   %2 = load <2 x i64>* %b
890   ; CHECK-DAG: ld.d [[R2:\$w[0-9]+]], 0($6)
891   %3 = load <2 x i64>* %c
892   ; CHECK-DAG: ld.d [[R3:\$w[0-9]+]], 0($7)
893   %4 = icmp ugt <2 x i64> %1, %2
894   ; CHECK-DAG: clt_u.d [[R4:\$w[0-9]+]], [[R2]], [[R1]]
895   %5 = select <2 x i1> %4, <2 x i64> %1, <2 x i64> %3
896   ; Note that IfSet and IfClr are swapped since the condition is inverted
897   ; CHECK-DAG: bsel.v [[R4]], [[R3]], [[R1]]
898   store <2 x i64> %5, <2 x i64>* %d
899   ; CHECK-DAG: st.d [[R4]], 0($4)
900
901   ret void
902   ; CHECK: .size bsel_u_v2i64
903 }
904
905 define void @bseli_s_v16i8(<16 x i8>* %d, <16 x i8>* %a, <16 x i8>* %b,
906                         <16 x i8>* %c) nounwind {
907   ; CHECK: bseli_s_v16i8:
908
909   %1 = load <16 x i8>* %a
910   ; CHECK-DAG: ld.b [[R1:\$w[0-9]+]], 0($5)
911   %2 = load <16 x i8>* %b
912   ; CHECK-DAG: ld.b [[R2:\$w[0-9]+]], 0($6)
913   %3 = icmp sgt <16 x i8> %1, %2
914   ; CHECK-DAG: clt_s.b [[R4:\$w[0-9]+]], [[R2]], [[R1]]
915   %4 = select <16 x i1> %3, <16 x i8> <i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1>, <16 x i8> %1
916   ; CHECK-DAG: bseli.b [[R4]], [[R1]], 1
917   store <16 x i8> %4, <16 x i8>* %d
918   ; CHECK-DAG: st.b [[R4]], 0($4)
919
920   ret void
921   ; CHECK: .size bseli_s_v16i8
922 }
923
924 define void @bseli_s_v8i16(<8 x i16>* %d, <8 x i16>* %a, <8 x i16>* %b,
925                         <8 x i16>* %c) nounwind {
926   ; CHECK: bseli_s_v8i16:
927
928   %1 = load <8 x i16>* %a
929   ; CHECK-DAG: ld.h [[R1:\$w[0-9]+]], 0($5)
930   %2 = load <8 x i16>* %b
931   ; CHECK-DAG: ld.h [[R2:\$w[0-9]+]], 0($6)
932   %3 = icmp sgt <8 x i16> %1, %2
933   ; CHECK-DAG: clt_s.h [[R4:\$w[0-9]+]], [[R2]], [[R1]]
934   %4 = select <8 x i1> %3, <8 x i16> <i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1>, <8 x i16> %1
935   ; CHECK-DAG: ldi.h [[R3:\$w[0-9]+]], 1
936   ; CHECK-DAG: bsel.v [[R4]], [[R1]], [[R3]]
937   store <8 x i16> %4, <8 x i16>* %d
938   ; CHECK-DAG: st.h [[R4]], 0($4)
939
940   ret void
941   ; CHECK: .size bseli_s_v8i16
942 }
943
944 define void @bseli_s_v4i32(<4 x i32>* %d, <4 x i32>* %a, <4 x i32>* %b,
945                         <4 x i32>* %c) nounwind {
946   ; CHECK: bseli_s_v4i32:
947
948   %1 = load <4 x i32>* %a
949   ; CHECK-DAG: ld.w [[R1:\$w[0-9]+]], 0($5)
950   %2 = load <4 x i32>* %b
951   ; CHECK-DAG: ld.w [[R2:\$w[0-9]+]], 0($6)
952   %3 = icmp sgt <4 x i32> %1, %2
953   ; CHECK-DAG: clt_s.w [[R4:\$w[0-9]+]], [[R2]], [[R1]]
954   %4 = select <4 x i1> %3, <4 x i32> <i32 1, i32 1, i32 1, i32 1>, <4 x i32> %1
955   ; CHECK-DAG: ldi.w [[R3:\$w[0-9]+]], 1
956   ; CHECK-DAG: bsel.v [[R4]], [[R1]], [[R3]]
957   store <4 x i32> %4, <4 x i32>* %d
958   ; CHECK-DAG: st.w [[R4]], 0($4)
959
960   ret void
961   ; CHECK: .size bseli_s_v4i32
962 }
963
964 define void @bseli_s_v2i64(<2 x i64>* %d, <2 x i64>* %a, <2 x i64>* %b,
965                         <2 x i64>* %c) nounwind {
966   ; CHECK: bseli_s_v2i64:
967
968   %1 = load <2 x i64>* %a
969   ; CHECK-DAG: ld.d [[R1:\$w[0-9]+]], 0($5)
970   %2 = load <2 x i64>* %b
971   ; CHECK-DAG: ld.d [[R2:\$w[0-9]+]], 0($6)
972   %3 = icmp sgt <2 x i64> %1, %2
973   ; CHECK-DAG: clt_s.d [[R4:\$w[0-9]+]], [[R2]], [[R1]]
974   %4 = select <2 x i1> %3, <2 x i64> <i64 1, i64 1>, <2 x i64> %1
975   ; CHECK-DAG: ldi.d [[R3:\$w[0-9]+]], 1
976   ; CHECK-DAG: bsel.v [[R4]], [[R1]], [[R3]]
977   store <2 x i64> %4, <2 x i64>* %d
978   ; CHECK-DAG: st.d [[R4]], 0($4)
979
980   ret void
981   ; CHECK: .size bseli_s_v2i64
982 }
983
984 define void @bseli_u_v16i8(<16 x i8>* %d, <16 x i8>* %a, <16 x i8>* %b,
985                         <16 x i8>* %c) nounwind {
986   ; CHECK: bseli_u_v16i8:
987
988   %1 = load <16 x i8>* %a
989   ; CHECK-DAG: ld.b [[R1:\$w[0-9]+]], 0($5)
990   %2 = load <16 x i8>* %b
991   ; CHECK-DAG: ld.b [[R2:\$w[0-9]+]], 0($6)
992   %3 = icmp ugt <16 x i8> %1, %2
993   ; CHECK-DAG: clt_u.b [[R4:\$w[0-9]+]], [[R2]], [[R1]]
994   %4 = select <16 x i1> %3, <16 x i8> <i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1>, <16 x i8> %1
995   ; CHECK-DAG: bseli.b [[R4]], [[R1]], 1
996   store <16 x i8> %4, <16 x i8>* %d
997   ; CHECK-DAG: st.b [[R4]], 0($4)
998
999   ret void
1000   ; CHECK: .size bseli_u_v16i8
1001 }
1002
1003 define void @bseli_u_v8i16(<8 x i16>* %d, <8 x i16>* %a, <8 x i16>* %b,
1004                         <8 x i16>* %c) nounwind {
1005   ; CHECK: bseli_u_v8i16:
1006
1007   %1 = load <8 x i16>* %a
1008   ; CHECK-DAG: ld.h [[R1:\$w[0-9]+]], 0($5)
1009   %2 = load <8 x i16>* %b
1010   ; CHECK-DAG: ld.h [[R2:\$w[0-9]+]], 0($6)
1011   %3 = icmp ugt <8 x i16> %1, %2
1012   ; CHECK-DAG: clt_u.h [[R4:\$w[0-9]+]], [[R2]], [[R1]]
1013   %4 = select <8 x i1> %3, <8 x i16> <i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1>, <8 x i16> %1
1014   ; CHECK-DAG: ldi.h [[R3:\$w[0-9]+]], 1
1015   ; CHECK-DAG: bsel.v [[R4]], [[R1]], [[R3]]
1016   store <8 x i16> %4, <8 x i16>* %d
1017   ; CHECK-DAG: st.h [[R4]], 0($4)
1018
1019   ret void
1020   ; CHECK: .size bseli_u_v8i16
1021 }
1022
1023 define void @bseli_u_v4i32(<4 x i32>* %d, <4 x i32>* %a, <4 x i32>* %b,
1024                         <4 x i32>* %c) nounwind {
1025   ; CHECK: bseli_u_v4i32:
1026
1027   %1 = load <4 x i32>* %a
1028   ; CHECK-DAG: ld.w [[R1:\$w[0-9]+]], 0($5)
1029   %2 = load <4 x i32>* %b
1030   ; CHECK-DAG: ld.w [[R2:\$w[0-9]+]], 0($6)
1031   %3 = icmp ugt <4 x i32> %1, %2
1032   ; CHECK-DAG: clt_u.w [[R4:\$w[0-9]+]], [[R2]], [[R1]]
1033   %4 = select <4 x i1> %3, <4 x i32> <i32 1, i32 1, i32 1, i32 1>, <4 x i32> %1
1034   ; CHECK-DAG: ldi.w [[R3:\$w[0-9]+]], 1
1035   ; CHECK-DAG: bsel.v [[R4]], [[R1]], [[R3]]
1036   store <4 x i32> %4, <4 x i32>* %d
1037   ; CHECK-DAG: st.w [[R4]], 0($4)
1038
1039   ret void
1040   ; CHECK: .size bseli_u_v4i32
1041 }
1042
1043 define void @bseli_u_v2i64(<2 x i64>* %d, <2 x i64>* %a, <2 x i64>* %b,
1044                         <2 x i64>* %c) nounwind {
1045   ; CHECK: bseli_u_v2i64:
1046
1047   %1 = load <2 x i64>* %a
1048   ; CHECK-DAG: ld.d [[R1:\$w[0-9]+]], 0($5)
1049   %2 = load <2 x i64>* %b
1050   ; CHECK-DAG: ld.d [[R2:\$w[0-9]+]], 0($6)
1051   %3 = icmp ugt <2 x i64> %1, %2
1052   ; CHECK-DAG: clt_u.d [[R4:\$w[0-9]+]], [[R2]], [[R1]]
1053   %4 = select <2 x i1> %3, <2 x i64> <i64 1, i64 1>, <2 x i64> %1
1054   ; CHECK-DAG: ldi.d [[R3:\$w[0-9]+]], 1
1055   ; CHECK-DAG: bsel.v [[R4]], [[R1]], [[R3]]
1056   store <2 x i64> %4, <2 x i64>* %d
1057   ; CHECK-DAG: st.d [[R4]], 0($4)
1058
1059   ret void
1060   ; CHECK: .size bseli_u_v2i64
1061 }
1062
1063 define void @max_s_v16i8(<16 x i8>* %c, <16 x i8>* %a, <16 x i8>* %b) nounwind {
1064   ; CHECK: max_s_v16i8:
1065
1066   %1 = load <16 x i8>* %a
1067   ; CHECK-DAG: ld.b [[R1:\$w[0-9]+]], 0($5)
1068   %2 = load <16 x i8>* %b
1069   ; CHECK-DAG: ld.b [[R2:\$w[0-9]+]], 0($6)
1070   %3 = icmp sgt <16 x i8> %1, %2
1071   %4 = select <16 x i1> %3, <16 x i8> %1, <16 x i8> %2
1072   ; CHECK-DAG: max_s.b [[R3:\$w[0-9]+]], [[R1]], [[R2]]
1073   store <16 x i8> %4, <16 x i8>* %c
1074   ; CHECK-DAG: st.b [[R3]], 0($4)
1075
1076   ret void
1077   ; CHECK: .size max_s_v16i8
1078 }
1079
1080 define void @max_s_v8i16(<8 x i16>* %c, <8 x i16>* %a, <8 x i16>* %b) nounwind {
1081   ; CHECK: max_s_v8i16:
1082
1083   %1 = load <8 x i16>* %a
1084   ; CHECK-DAG: ld.h [[R1:\$w[0-9]+]], 0($5)
1085   %2 = load <8 x i16>* %b
1086   ; CHECK-DAG: ld.h [[R2:\$w[0-9]+]], 0($6)
1087   %3 = icmp sgt <8 x i16> %1, %2
1088   %4 = select <8 x i1> %3, <8 x i16> %1, <8 x i16> %2
1089   ; CHECK-DAG: max_s.h [[R3:\$w[0-9]+]], [[R1]], [[R2]]
1090   store <8 x i16> %4, <8 x i16>* %c
1091   ; CHECK-DAG: st.h [[R3]], 0($4)
1092
1093   ret void
1094   ; CHECK: .size max_s_v8i16
1095 }
1096
1097 define void @max_s_v4i32(<4 x i32>* %c, <4 x i32>* %a, <4 x i32>* %b) nounwind {
1098   ; CHECK: max_s_v4i32:
1099
1100   %1 = load <4 x i32>* %a
1101   ; CHECK-DAG: ld.w [[R1:\$w[0-9]+]], 0($5)
1102   %2 = load <4 x i32>* %b
1103   ; CHECK-DAG: ld.w [[R2:\$w[0-9]+]], 0($6)
1104   %3 = icmp sgt <4 x i32> %1, %2
1105   %4 = select <4 x i1> %3, <4 x i32> %1, <4 x i32> %2
1106   ; CHECK-DAG: max_s.w [[R3:\$w[0-9]+]], [[R1]], [[R2]]
1107   store <4 x i32> %4, <4 x i32>* %c
1108   ; CHECK-DAG: st.w [[R3]], 0($4)
1109
1110   ret void
1111   ; CHECK: .size max_s_v4i32
1112 }
1113
1114 define void @max_s_v2i64(<2 x i64>* %c, <2 x i64>* %a, <2 x i64>* %b) nounwind {
1115   ; CHECK: max_s_v2i64:
1116
1117   %1 = load <2 x i64>* %a
1118   ; CHECK-DAG: ld.d [[R1:\$w[0-9]+]], 0($5)
1119   %2 = load <2 x i64>* %b
1120   ; CHECK-DAG: ld.d [[R2:\$w[0-9]+]], 0($6)
1121   %3 = icmp sgt <2 x i64> %1, %2
1122   %4 = select <2 x i1> %3, <2 x i64> %1, <2 x i64> %2
1123   ; CHECK-DAG: max_s.d [[R3:\$w[0-9]+]], [[R1]], [[R2]]
1124   store <2 x i64> %4, <2 x i64>* %c
1125   ; CHECK-DAG: st.d [[R3]], 0($4)
1126
1127   ret void
1128   ; CHECK: .size max_s_v2i64
1129 }
1130
1131 define void @max_u_v16i8(<16 x i8>* %c, <16 x i8>* %a, <16 x i8>* %b) nounwind {
1132   ; CHECK: max_u_v16i8:
1133
1134   %1 = load <16 x i8>* %a
1135   ; CHECK-DAG: ld.b [[R1:\$w[0-9]+]], 0($5)
1136   %2 = load <16 x i8>* %b
1137   ; CHECK-DAG: ld.b [[R2:\$w[0-9]+]], 0($6)
1138   %3 = icmp ugt <16 x i8> %1, %2
1139   %4 = select <16 x i1> %3, <16 x i8> %1, <16 x i8> %2
1140   ; CHECK-DAG: max_u.b [[R3:\$w[0-9]+]], [[R1]], [[R2]]
1141   store <16 x i8> %4, <16 x i8>* %c
1142   ; CHECK-DAG: st.b [[R3]], 0($4)
1143
1144   ret void
1145   ; CHECK: .size max_u_v16i8
1146 }
1147
1148 define void @max_u_v8i16(<8 x i16>* %c, <8 x i16>* %a, <8 x i16>* %b) nounwind {
1149   ; CHECK: max_u_v8i16:
1150
1151   %1 = load <8 x i16>* %a
1152   ; CHECK-DAG: ld.h [[R1:\$w[0-9]+]], 0($5)
1153   %2 = load <8 x i16>* %b
1154   ; CHECK-DAG: ld.h [[R2:\$w[0-9]+]], 0($6)
1155   %3 = icmp ugt <8 x i16> %1, %2
1156   %4 = select <8 x i1> %3, <8 x i16> %1, <8 x i16> %2
1157   ; CHECK-DAG: max_u.h [[R3:\$w[0-9]+]], [[R1]], [[R2]]
1158   store <8 x i16> %4, <8 x i16>* %c
1159   ; CHECK-DAG: st.h [[R3]], 0($4)
1160
1161   ret void
1162   ; CHECK: .size max_u_v8i16
1163 }
1164
1165 define void @max_u_v4i32(<4 x i32>* %c, <4 x i32>* %a, <4 x i32>* %b) nounwind {
1166   ; CHECK: max_u_v4i32:
1167
1168   %1 = load <4 x i32>* %a
1169   ; CHECK-DAG: ld.w [[R1:\$w[0-9]+]], 0($5)
1170   %2 = load <4 x i32>* %b
1171   ; CHECK-DAG: ld.w [[R2:\$w[0-9]+]], 0($6)
1172   %3 = icmp ugt <4 x i32> %1, %2
1173   %4 = select <4 x i1> %3, <4 x i32> %1, <4 x i32> %2
1174   ; CHECK-DAG: max_u.w [[R3:\$w[0-9]+]], [[R1]], [[R2]]
1175   store <4 x i32> %4, <4 x i32>* %c
1176   ; CHECK-DAG: st.w [[R3]], 0($4)
1177
1178   ret void
1179   ; CHECK: .size max_u_v4i32
1180 }
1181
1182 define void @max_u_v2i64(<2 x i64>* %c, <2 x i64>* %a, <2 x i64>* %b) nounwind {
1183   ; CHECK: max_u_v2i64:
1184
1185   %1 = load <2 x i64>* %a
1186   ; CHECK-DAG: ld.d [[R1:\$w[0-9]+]], 0($5)
1187   %2 = load <2 x i64>* %b
1188   ; CHECK-DAG: ld.d [[R2:\$w[0-9]+]], 0($6)
1189   %3 = icmp ugt <2 x i64> %1, %2
1190   %4 = select <2 x i1> %3, <2 x i64> %1, <2 x i64> %2
1191   ; CHECK-DAG: max_u.d [[R3:\$w[0-9]+]], [[R1]], [[R2]]
1192   store <2 x i64> %4, <2 x i64>* %c
1193   ; CHECK-DAG: st.d [[R3]], 0($4)
1194
1195   ret void
1196   ; CHECK: .size max_u_v2i64
1197 }
1198
1199 define void @max_s_eq_v16i8(<16 x i8>* %c, <16 x i8>* %a, <16 x i8>* %b) nounwind {
1200   ; CHECK: max_s_eq_v16i8:
1201
1202   %1 = load <16 x i8>* %a
1203   ; CHECK-DAG: ld.b [[R1:\$w[0-9]+]], 0($5)
1204   %2 = load <16 x i8>* %b
1205   ; CHECK-DAG: ld.b [[R2:\$w[0-9]+]], 0($6)
1206   %3 = icmp sge <16 x i8> %1, %2
1207   %4 = select <16 x i1> %3, <16 x i8> %1, <16 x i8> %2
1208   ; CHECK-DAG: max_s.b [[R3:\$w[0-9]+]], [[R1]], [[R2]]
1209   store <16 x i8> %4, <16 x i8>* %c
1210   ; CHECK-DAG: st.b [[R3]], 0($4)
1211
1212   ret void
1213   ; CHECK: .size max_s_eq_v16i8
1214 }
1215
1216 define void @max_s_eq_v8i16(<8 x i16>* %c, <8 x i16>* %a, <8 x i16>* %b) nounwind {
1217   ; CHECK: max_s_eq_v8i16:
1218
1219   %1 = load <8 x i16>* %a
1220   ; CHECK-DAG: ld.h [[R1:\$w[0-9]+]], 0($5)
1221   %2 = load <8 x i16>* %b
1222   ; CHECK-DAG: ld.h [[R2:\$w[0-9]+]], 0($6)
1223   %3 = icmp sge <8 x i16> %1, %2
1224   %4 = select <8 x i1> %3, <8 x i16> %1, <8 x i16> %2
1225   ; CHECK-DAG: max_s.h [[R3:\$w[0-9]+]], [[R1]], [[R2]]
1226   store <8 x i16> %4, <8 x i16>* %c
1227   ; CHECK-DAG: st.h [[R3]], 0($4)
1228
1229   ret void
1230   ; CHECK: .size max_s_eq_v8i16
1231 }
1232
1233 define void @max_s_eq_v4i32(<4 x i32>* %c, <4 x i32>* %a, <4 x i32>* %b) nounwind {
1234   ; CHECK: max_s_eq_v4i32:
1235
1236   %1 = load <4 x i32>* %a
1237   ; CHECK-DAG: ld.w [[R1:\$w[0-9]+]], 0($5)
1238   %2 = load <4 x i32>* %b
1239   ; CHECK-DAG: ld.w [[R2:\$w[0-9]+]], 0($6)
1240   %3 = icmp sge <4 x i32> %1, %2
1241   %4 = select <4 x i1> %3, <4 x i32> %1, <4 x i32> %2
1242   ; CHECK-DAG: max_s.w [[R3:\$w[0-9]+]], [[R1]], [[R2]]
1243   store <4 x i32> %4, <4 x i32>* %c
1244   ; CHECK-DAG: st.w [[R3]], 0($4)
1245
1246   ret void
1247   ; CHECK: .size max_s_eq_v4i32
1248 }
1249
1250 define void @max_s_eq_v2i64(<2 x i64>* %c, <2 x i64>* %a, <2 x i64>* %b) nounwind {
1251   ; CHECK: max_s_eq_v2i64:
1252
1253   %1 = load <2 x i64>* %a
1254   ; CHECK-DAG: ld.d [[R1:\$w[0-9]+]], 0($5)
1255   %2 = load <2 x i64>* %b
1256   ; CHECK-DAG: ld.d [[R2:\$w[0-9]+]], 0($6)
1257   %3 = icmp sge <2 x i64> %1, %2
1258   %4 = select <2 x i1> %3, <2 x i64> %1, <2 x i64> %2
1259   ; CHECK-DAG: max_s.d [[R3:\$w[0-9]+]], [[R1]], [[R2]]
1260   store <2 x i64> %4, <2 x i64>* %c
1261   ; CHECK-DAG: st.d [[R3]], 0($4)
1262
1263   ret void
1264   ; CHECK: .size max_s_eq_v2i64
1265 }
1266
1267 define void @max_u_eq_v16i8(<16 x i8>* %c, <16 x i8>* %a, <16 x i8>* %b) nounwind {
1268   ; CHECK: max_u_eq_v16i8:
1269
1270   %1 = load <16 x i8>* %a
1271   ; CHECK-DAG: ld.b [[R1:\$w[0-9]+]], 0($5)
1272   %2 = load <16 x i8>* %b
1273   ; CHECK-DAG: ld.b [[R2:\$w[0-9]+]], 0($6)
1274   %3 = icmp uge <16 x i8> %1, %2
1275   %4 = select <16 x i1> %3, <16 x i8> %1, <16 x i8> %2
1276   ; CHECK-DAG: max_u.b [[R3:\$w[0-9]+]], [[R1]], [[R2]]
1277   store <16 x i8> %4, <16 x i8>* %c
1278   ; CHECK-DAG: st.b [[R3]], 0($4)
1279
1280   ret void
1281   ; CHECK: .size max_u_eq_v16i8
1282 }
1283
1284 define void @max_u_eq_v8i16(<8 x i16>* %c, <8 x i16>* %a, <8 x i16>* %b) nounwind {
1285   ; CHECK: max_u_eq_v8i16:
1286
1287   %1 = load <8 x i16>* %a
1288   ; CHECK-DAG: ld.h [[R1:\$w[0-9]+]], 0($5)
1289   %2 = load <8 x i16>* %b
1290   ; CHECK-DAG: ld.h [[R2:\$w[0-9]+]], 0($6)
1291   %3 = icmp uge <8 x i16> %1, %2
1292   %4 = select <8 x i1> %3, <8 x i16> %1, <8 x i16> %2
1293   ; CHECK-DAG: max_u.h [[R3:\$w[0-9]+]], [[R1]], [[R2]]
1294   store <8 x i16> %4, <8 x i16>* %c
1295   ; CHECK-DAG: st.h [[R3]], 0($4)
1296
1297   ret void
1298   ; CHECK: .size max_u_eq_v8i16
1299 }
1300
1301 define void @max_u_eq_v4i32(<4 x i32>* %c, <4 x i32>* %a, <4 x i32>* %b) nounwind {
1302   ; CHECK: max_u_eq_v4i32:
1303
1304   %1 = load <4 x i32>* %a
1305   ; CHECK-DAG: ld.w [[R1:\$w[0-9]+]], 0($5)
1306   %2 = load <4 x i32>* %b
1307   ; CHECK-DAG: ld.w [[R2:\$w[0-9]+]], 0($6)
1308   %3 = icmp uge <4 x i32> %1, %2
1309   %4 = select <4 x i1> %3, <4 x i32> %1, <4 x i32> %2
1310   ; CHECK-DAG: max_u.w [[R3:\$w[0-9]+]], [[R1]], [[R2]]
1311   store <4 x i32> %4, <4 x i32>* %c
1312   ; CHECK-DAG: st.w [[R3]], 0($4)
1313
1314   ret void
1315   ; CHECK: .size max_u_eq_v4i32
1316 }
1317
1318 define void @max_u_eq_v2i64(<2 x i64>* %c, <2 x i64>* %a, <2 x i64>* %b) nounwind {
1319   ; CHECK: max_u_eq_v2i64:
1320
1321   %1 = load <2 x i64>* %a
1322   ; CHECK-DAG: ld.d [[R1:\$w[0-9]+]], 0($5)
1323   %2 = load <2 x i64>* %b
1324   ; CHECK-DAG: ld.d [[R2:\$w[0-9]+]], 0($6)
1325   %3 = icmp uge <2 x i64> %1, %2
1326   %4 = select <2 x i1> %3, <2 x i64> %1, <2 x i64> %2
1327   ; CHECK-DAG: max_u.d [[R3:\$w[0-9]+]], [[R1]], [[R2]]
1328   store <2 x i64> %4, <2 x i64>* %c
1329   ; CHECK-DAG: st.d [[R3]], 0($4)
1330
1331   ret void
1332   ; CHECK: .size max_u_eq_v2i64
1333 }
1334
1335 define void @maxi_s_v16i8(<16 x i8>* %c, <16 x i8>* %a) nounwind {
1336   ; CHECK: maxi_s_v16i8:
1337
1338   %1 = load <16 x i8>* %a
1339   ; CHECK-DAG: ld.b [[R1:\$w[0-9]+]], 0($5)
1340   %2 = icmp sgt <16 x i8> %1, <i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1>
1341   %3 = select <16 x i1> %2, <16 x i8> %1, <16 x i8> <i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1>
1342   ; CHECK-DAG: maxi_s.b [[R3:\$w[0-9]+]], [[R1]], 1
1343   store <16 x i8> %3, <16 x i8>* %c
1344   ; CHECK-DAG: st.b [[R3]], 0($4)
1345
1346   ret void
1347   ; CHECK: .size maxi_s_v16i8
1348 }
1349
1350 define void @maxi_s_v8i16(<8 x i16>* %c, <8 x i16>* %a) nounwind {
1351   ; CHECK: maxi_s_v8i16:
1352
1353   %1 = load <8 x i16>* %a
1354   ; CHECK-DAG: ld.h [[R1:\$w[0-9]+]], 0($5)
1355   %2 = icmp sgt <8 x i16> %1, <i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1>
1356   %3 = select <8 x i1> %2, <8 x i16> %1, <8 x i16> <i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1>
1357   ; CHECK-DAG: maxi_s.h [[R3:\$w[0-9]+]], [[R1]], 1
1358   store <8 x i16> %3, <8 x i16>* %c
1359   ; CHECK-DAG: st.h [[R3]], 0($4)
1360
1361   ret void
1362   ; CHECK: .size maxi_s_v8i16
1363 }
1364
1365 define void @maxi_s_v4i32(<4 x i32>* %c, <4 x i32>* %a) nounwind {
1366   ; CHECK: maxi_s_v4i32:
1367
1368   %1 = load <4 x i32>* %a
1369   ; CHECK-DAG: ld.w [[R1:\$w[0-9]+]], 0($5)
1370   %2 = icmp sgt <4 x i32> %1, <i32 1, i32 1, i32 1, i32 1>
1371   %3 = select <4 x i1> %2, <4 x i32> %1, <4 x i32> <i32 1, i32 1, i32 1, i32 1>
1372   ; CHECK-DAG: maxi_s.w [[R3:\$w[0-9]+]], [[R1]], 1
1373   store <4 x i32> %3, <4 x i32>* %c
1374   ; CHECK-DAG: st.w [[R3]], 0($4)
1375
1376   ret void
1377   ; CHECK: .size maxi_s_v4i32
1378 }
1379
1380 define void @maxi_s_v2i64(<2 x i64>* %c, <2 x i64>* %a) nounwind {
1381   ; CHECK: maxi_s_v2i64:
1382
1383   %1 = load <2 x i64>* %a
1384   ; CHECK-DAG: ld.d [[R1:\$w[0-9]+]], 0($5)
1385   %2 = icmp sgt <2 x i64> %1, <i64 1, i64 1>
1386   %3 = select <2 x i1> %2, <2 x i64> %1, <2 x i64> <i64 1, i64 1>
1387   ; CHECK-DAG: maxi_s.d [[R3:\$w[0-9]+]], [[R1]], 1
1388   store <2 x i64> %3, <2 x i64>* %c
1389   ; CHECK-DAG: st.d [[R3]], 0($4)
1390
1391   ret void
1392   ; CHECK: .size maxi_s_v2i64
1393 }
1394
1395 define void @maxi_u_v16i8(<16 x i8>* %c, <16 x i8>* %a) nounwind {
1396   ; CHECK: maxi_u_v16i8:
1397
1398   %1 = load <16 x i8>* %a
1399   ; CHECK-DAG: ld.b [[R1:\$w[0-9]+]], 0($5)
1400   %2 = icmp ugt <16 x i8> %1, <i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1>
1401   %3 = select <16 x i1> %2, <16 x i8> %1, <16 x i8> <i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1>
1402   ; CHECK-DAG: maxi_u.b [[R3:\$w[0-9]+]], [[R1]], 1
1403   store <16 x i8> %3, <16 x i8>* %c
1404   ; CHECK-DAG: st.b [[R3]], 0($4)
1405
1406   ret void
1407   ; CHECK: .size maxi_u_v16i8
1408 }
1409
1410 define void @maxi_u_v8i16(<8 x i16>* %c, <8 x i16>* %a) nounwind {
1411   ; CHECK: maxi_u_v8i16:
1412
1413   %1 = load <8 x i16>* %a
1414   ; CHECK-DAG: ld.h [[R1:\$w[0-9]+]], 0($5)
1415   %2 = icmp ugt <8 x i16> %1, <i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1>
1416   %3 = select <8 x i1> %2, <8 x i16> %1, <8 x i16> <i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1>
1417   ; CHECK-DAG: maxi_u.h [[R3:\$w[0-9]+]], [[R1]], 1
1418   store <8 x i16> %3, <8 x i16>* %c
1419   ; CHECK-DAG: st.h [[R3]], 0($4)
1420
1421   ret void
1422   ; CHECK: .size maxi_u_v8i16
1423 }
1424
1425 define void @maxi_u_v4i32(<4 x i32>* %c, <4 x i32>* %a) nounwind {
1426   ; CHECK: maxi_u_v4i32:
1427
1428   %1 = load <4 x i32>* %a
1429   ; CHECK-DAG: ld.w [[R1:\$w[0-9]+]], 0($5)
1430   %2 = icmp ugt <4 x i32> %1, <i32 1, i32 1, i32 1, i32 1>
1431   %3 = select <4 x i1> %2, <4 x i32> %1, <4 x i32> <i32 1, i32 1, i32 1, i32 1>
1432   ; CHECK-DAG: maxi_u.w [[R3:\$w[0-9]+]], [[R1]], 1
1433   store <4 x i32> %3, <4 x i32>* %c
1434   ; CHECK-DAG: st.w [[R3]], 0($4)
1435
1436   ret void
1437   ; CHECK: .size maxi_u_v4i32
1438 }
1439
1440 define void @maxi_u_v2i64(<2 x i64>* %c, <2 x i64>* %a) nounwind {
1441   ; CHECK: maxi_u_v2i64:
1442
1443   %1 = load <2 x i64>* %a
1444   ; CHECK-DAG: ld.d [[R1:\$w[0-9]+]], 0($5)
1445   %2 = icmp ugt <2 x i64> %1, <i64 1, i64 1>
1446   %3 = select <2 x i1> %2, <2 x i64> %1, <2 x i64> <i64 1, i64 1>
1447   ; CHECK-DAG: maxi_u.d [[R3:\$w[0-9]+]], [[R1]], 1
1448   store <2 x i64> %3, <2 x i64>* %c
1449   ; CHECK-DAG: st.d [[R3]], 0($4)
1450
1451   ret void
1452   ; CHECK: .size maxi_u_v2i64
1453 }
1454
1455 define void @maxi_s_eq_v16i8(<16 x i8>* %c, <16 x i8>* %a) nounwind {
1456   ; CHECK: maxi_s_eq_v16i8:
1457
1458   %1 = load <16 x i8>* %a
1459   ; CHECK-DAG: ld.b [[R1:\$w[0-9]+]], 0($5)
1460   %2 = icmp sge <16 x i8> %1, <i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1>
1461   %3 = select <16 x i1> %2, <16 x i8> %1, <16 x i8> <i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1>
1462   ; CHECK-DAG: maxi_s.b [[R3:\$w[0-9]+]], [[R1]], 1
1463   store <16 x i8> %3, <16 x i8>* %c
1464   ; CHECK-DAG: st.b [[R3]], 0($4)
1465
1466   ret void
1467   ; CHECK: .size maxi_s_eq_v16i8
1468 }
1469
1470 define void @maxi_s_eq_v8i16(<8 x i16>* %c, <8 x i16>* %a) nounwind {
1471   ; CHECK: maxi_s_eq_v8i16:
1472
1473   %1 = load <8 x i16>* %a
1474   ; CHECK-DAG: ld.h [[R1:\$w[0-9]+]], 0($5)
1475   %2 = icmp sge <8 x i16> %1, <i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1>
1476   %3 = select <8 x i1> %2, <8 x i16> %1, <8 x i16> <i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1>
1477   ; CHECK-DAG: maxi_s.h [[R3:\$w[0-9]+]], [[R1]], 1
1478   store <8 x i16> %3, <8 x i16>* %c
1479   ; CHECK-DAG: st.h [[R3]], 0($4)
1480
1481   ret void
1482   ; CHECK: .size maxi_s_eq_v8i16
1483 }
1484
1485 define void @maxi_s_eq_v4i32(<4 x i32>* %c, <4 x i32>* %a) nounwind {
1486   ; CHECK: maxi_s_eq_v4i32:
1487
1488   %1 = load <4 x i32>* %a
1489   ; CHECK-DAG: ld.w [[R1:\$w[0-9]+]], 0($5)
1490   %2 = icmp sge <4 x i32> %1, <i32 1, i32 1, i32 1, i32 1>
1491   %3 = select <4 x i1> %2, <4 x i32> %1, <4 x i32> <i32 1, i32 1, i32 1, i32 1>
1492   ; CHECK-DAG: maxi_s.w [[R3:\$w[0-9]+]], [[R1]], 1
1493   store <4 x i32> %3, <4 x i32>* %c
1494   ; CHECK-DAG: st.w [[R3]], 0($4)
1495
1496   ret void
1497   ; CHECK: .size maxi_s_eq_v4i32
1498 }
1499
1500 define void @maxi_s_eq_v2i64(<2 x i64>* %c, <2 x i64>* %a) nounwind {
1501   ; CHECK: maxi_s_eq_v2i64:
1502
1503   %1 = load <2 x i64>* %a
1504   ; CHECK-DAG: ld.d [[R1:\$w[0-9]+]], 0($5)
1505   %2 = icmp sge <2 x i64> %1, <i64 1, i64 1>
1506   %3 = select <2 x i1> %2, <2 x i64> %1, <2 x i64> <i64 1, i64 1>
1507   ; CHECK-DAG: maxi_s.d [[R3:\$w[0-9]+]], [[R1]], 1
1508   store <2 x i64> %3, <2 x i64>* %c
1509   ; CHECK-DAG: st.d [[R3]], 0($4)
1510
1511   ret void
1512   ; CHECK: .size maxi_s_eq_v2i64
1513 }
1514
1515 define void @maxi_u_eq_v16i8(<16 x i8>* %c, <16 x i8>* %a) nounwind {
1516   ; CHECK: maxi_u_eq_v16i8:
1517
1518   %1 = load <16 x i8>* %a
1519   ; CHECK-DAG: ld.b [[R1:\$w[0-9]+]], 0($5)
1520   %2 = icmp uge <16 x i8> %1, <i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1>
1521   %3 = select <16 x i1> %2, <16 x i8> %1, <16 x i8> <i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1>
1522   ; CHECK-DAG: maxi_u.b [[R3:\$w[0-9]+]], [[R1]], 1
1523   store <16 x i8> %3, <16 x i8>* %c
1524   ; CHECK-DAG: st.b [[R3]], 0($4)
1525
1526   ret void
1527   ; CHECK: .size maxi_u_eq_v16i8
1528 }
1529
1530 define void @maxi_u_eq_v8i16(<8 x i16>* %c, <8 x i16>* %a) nounwind {
1531   ; CHECK: maxi_u_eq_v8i16:
1532
1533   %1 = load <8 x i16>* %a
1534   ; CHECK-DAG: ld.h [[R1:\$w[0-9]+]], 0($5)
1535   %2 = icmp uge <8 x i16> %1, <i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1>
1536   %3 = select <8 x i1> %2, <8 x i16> %1, <8 x i16> <i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1>
1537   ; CHECK-DAG: maxi_u.h [[R3:\$w[0-9]+]], [[R1]], 1
1538   store <8 x i16> %3, <8 x i16>* %c
1539   ; CHECK-DAG: st.h [[R3]], 0($4)
1540
1541   ret void
1542   ; CHECK: .size maxi_u_eq_v8i16
1543 }
1544
1545 define void @maxi_u_eq_v4i32(<4 x i32>* %c, <4 x i32>* %a) nounwind {
1546   ; CHECK: maxi_u_eq_v4i32:
1547
1548   %1 = load <4 x i32>* %a
1549   ; CHECK-DAG: ld.w [[R1:\$w[0-9]+]], 0($5)
1550   %2 = icmp uge <4 x i32> %1, <i32 1, i32 1, i32 1, i32 1>
1551   %3 = select <4 x i1> %2, <4 x i32> %1, <4 x i32> <i32 1, i32 1, i32 1, i32 1>
1552   ; CHECK-DAG: maxi_u.w [[R3:\$w[0-9]+]], [[R1]], 1
1553   store <4 x i32> %3, <4 x i32>* %c
1554   ; CHECK-DAG: st.w [[R3]], 0($4)
1555
1556   ret void
1557   ; CHECK: .size maxi_u_eq_v4i32
1558 }
1559
1560 define void @maxi_u_eq_v2i64(<2 x i64>* %c, <2 x i64>* %a) nounwind {
1561   ; CHECK: maxi_u_eq_v2i64:
1562
1563   %1 = load <2 x i64>* %a
1564   ; CHECK-DAG: ld.d [[R1:\$w[0-9]+]], 0($5)
1565   %2 = icmp uge <2 x i64> %1, <i64 1, i64 1>
1566   %3 = select <2 x i1> %2, <2 x i64> %1, <2 x i64> <i64 1, i64 1>
1567   ; CHECK-DAG: maxi_u.d [[R3:\$w[0-9]+]], [[R1]], 1
1568   store <2 x i64> %3, <2 x i64>* %c
1569   ; CHECK-DAG: st.d [[R3]], 0($4)
1570
1571   ret void
1572   ; CHECK: .size maxi_u_eq_v2i64
1573 }
1574
1575 define void @min_s_v16i8(<16 x i8>* %c, <16 x i8>* %a, <16 x i8>* %b) nounwind {
1576   ; CHECK: min_s_v16i8:
1577
1578   %1 = load <16 x i8>* %a
1579   ; CHECK-DAG: ld.b [[R1:\$w[0-9]+]], 0($5)
1580   %2 = load <16 x i8>* %b
1581   ; CHECK-DAG: ld.b [[R2:\$w[0-9]+]], 0($6)
1582   %3 = icmp sle <16 x i8> %1, %2
1583   %4 = select <16 x i1> %3, <16 x i8> %1, <16 x i8> %2
1584   ; CHECK-DAG: min_s.b [[R3:\$w[0-9]+]], [[R1]], [[R2]]
1585   store <16 x i8> %4, <16 x i8>* %c
1586   ; CHECK-DAG: st.b [[R3]], 0($4)
1587
1588   ret void
1589   ; CHECK: .size min_s_v16i8
1590 }
1591
1592 define void @min_s_v8i16(<8 x i16>* %c, <8 x i16>* %a, <8 x i16>* %b) nounwind {
1593   ; CHECK: min_s_v8i16:
1594
1595   %1 = load <8 x i16>* %a
1596   ; CHECK-DAG: ld.h [[R1:\$w[0-9]+]], 0($5)
1597   %2 = load <8 x i16>* %b
1598   ; CHECK-DAG: ld.h [[R2:\$w[0-9]+]], 0($6)
1599   %3 = icmp slt <8 x i16> %1, %2
1600   %4 = select <8 x i1> %3, <8 x i16> %1, <8 x i16> %2
1601   ; CHECK-DAG: min_s.h [[R3:\$w[0-9]+]], [[R1]], [[R2]]
1602   store <8 x i16> %4, <8 x i16>* %c
1603   ; CHECK-DAG: st.h [[R3]], 0($4)
1604
1605   ret void
1606   ; CHECK: .size min_s_v8i16
1607 }
1608
1609 define void @min_s_v4i32(<4 x i32>* %c, <4 x i32>* %a, <4 x i32>* %b) nounwind {
1610   ; CHECK: min_s_v4i32:
1611
1612   %1 = load <4 x i32>* %a
1613   ; CHECK-DAG: ld.w [[R1:\$w[0-9]+]], 0($5)
1614   %2 = load <4 x i32>* %b
1615   ; CHECK-DAG: ld.w [[R2:\$w[0-9]+]], 0($6)
1616   %3 = icmp slt <4 x i32> %1, %2
1617   %4 = select <4 x i1> %3, <4 x i32> %1, <4 x i32> %2
1618   ; CHECK-DAG: min_s.w [[R3:\$w[0-9]+]], [[R1]], [[R2]]
1619   store <4 x i32> %4, <4 x i32>* %c
1620   ; CHECK-DAG: st.w [[R3]], 0($4)
1621
1622   ret void
1623   ; CHECK: .size min_s_v4i32
1624 }
1625
1626 define void @min_s_v2i64(<2 x i64>* %c, <2 x i64>* %a, <2 x i64>* %b) nounwind {
1627   ; CHECK: min_s_v2i64:
1628
1629   %1 = load <2 x i64>* %a
1630   ; CHECK-DAG: ld.d [[R1:\$w[0-9]+]], 0($5)
1631   %2 = load <2 x i64>* %b
1632   ; CHECK-DAG: ld.d [[R2:\$w[0-9]+]], 0($6)
1633   %3 = icmp slt <2 x i64> %1, %2
1634   %4 = select <2 x i1> %3, <2 x i64> %1, <2 x i64> %2
1635   ; CHECK-DAG: min_s.d [[R3:\$w[0-9]+]], [[R1]], [[R2]]
1636   store <2 x i64> %4, <2 x i64>* %c
1637   ; CHECK-DAG: st.d [[R3]], 0($4)
1638
1639   ret void
1640   ; CHECK: .size min_s_v2i64
1641 }
1642
1643 define void @min_u_v16i8(<16 x i8>* %c, <16 x i8>* %a, <16 x i8>* %b) nounwind {
1644   ; CHECK: min_u_v16i8:
1645
1646   %1 = load <16 x i8>* %a
1647   ; CHECK-DAG: ld.b [[R1:\$w[0-9]+]], 0($5)
1648   %2 = load <16 x i8>* %b
1649   ; CHECK-DAG: ld.b [[R2:\$w[0-9]+]], 0($6)
1650   %3 = icmp ult <16 x i8> %1, %2
1651   %4 = select <16 x i1> %3, <16 x i8> %1, <16 x i8> %2
1652   ; CHECK-DAG: min_u.b [[R3:\$w[0-9]+]], [[R1]], [[R2]]
1653   store <16 x i8> %4, <16 x i8>* %c
1654   ; CHECK-DAG: st.b [[R3]], 0($4)
1655
1656   ret void
1657   ; CHECK: .size min_u_v16i8
1658 }
1659
1660 define void @min_u_v8i16(<8 x i16>* %c, <8 x i16>* %a, <8 x i16>* %b) nounwind {
1661   ; CHECK: min_u_v8i16:
1662
1663   %1 = load <8 x i16>* %a
1664   ; CHECK-DAG: ld.h [[R1:\$w[0-9]+]], 0($5)
1665   %2 = load <8 x i16>* %b
1666   ; CHECK-DAG: ld.h [[R2:\$w[0-9]+]], 0($6)
1667   %3 = icmp ult <8 x i16> %1, %2
1668   %4 = select <8 x i1> %3, <8 x i16> %1, <8 x i16> %2
1669   ; CHECK-DAG: min_u.h [[R3:\$w[0-9]+]], [[R1]], [[R2]]
1670   store <8 x i16> %4, <8 x i16>* %c
1671   ; CHECK-DAG: st.h [[R3]], 0($4)
1672
1673   ret void
1674   ; CHECK: .size min_u_v8i16
1675 }
1676
1677 define void @min_u_v4i32(<4 x i32>* %c, <4 x i32>* %a, <4 x i32>* %b) nounwind {
1678   ; CHECK: min_u_v4i32:
1679
1680   %1 = load <4 x i32>* %a
1681   ; CHECK-DAG: ld.w [[R1:\$w[0-9]+]], 0($5)
1682   %2 = load <4 x i32>* %b
1683   ; CHECK-DAG: ld.w [[R2:\$w[0-9]+]], 0($6)
1684   %3 = icmp ult <4 x i32> %1, %2
1685   %4 = select <4 x i1> %3, <4 x i32> %1, <4 x i32> %2
1686   ; CHECK-DAG: min_u.w [[R3:\$w[0-9]+]], [[R1]], [[R2]]
1687   store <4 x i32> %4, <4 x i32>* %c
1688   ; CHECK-DAG: st.w [[R3]], 0($4)
1689
1690   ret void
1691   ; CHECK: .size min_u_v4i32
1692 }
1693
1694 define void @min_u_v2i64(<2 x i64>* %c, <2 x i64>* %a, <2 x i64>* %b) nounwind {
1695   ; CHECK: min_u_v2i64:
1696
1697   %1 = load <2 x i64>* %a
1698   ; CHECK-DAG: ld.d [[R1:\$w[0-9]+]], 0($5)
1699   %2 = load <2 x i64>* %b
1700   ; CHECK-DAG: ld.d [[R2:\$w[0-9]+]], 0($6)
1701   %3 = icmp ult <2 x i64> %1, %2
1702   %4 = select <2 x i1> %3, <2 x i64> %1, <2 x i64> %2
1703   ; CHECK-DAG: min_u.d [[R3:\$w[0-9]+]], [[R1]], [[R2]]
1704   store <2 x i64> %4, <2 x i64>* %c
1705   ; CHECK-DAG: st.d [[R3]], 0($4)
1706
1707   ret void
1708   ; CHECK: .size min_u_v2i64
1709 }
1710
1711 define void @min_s_eq_v16i8(<16 x i8>* %c, <16 x i8>* %a, <16 x i8>* %b) nounwind {
1712   ; CHECK: min_s_eq_v16i8:
1713
1714   %1 = load <16 x i8>* %a
1715   ; CHECK-DAG: ld.b [[R1:\$w[0-9]+]], 0($5)
1716   %2 = load <16 x i8>* %b
1717   ; CHECK-DAG: ld.b [[R2:\$w[0-9]+]], 0($6)
1718   %3 = icmp sle <16 x i8> %1, %2
1719   %4 = select <16 x i1> %3, <16 x i8> %1, <16 x i8> %2
1720   ; CHECK-DAG: min_s.b [[R3:\$w[0-9]+]], [[R1]], [[R2]]
1721   store <16 x i8> %4, <16 x i8>* %c
1722   ; CHECK-DAG: st.b [[R3]], 0($4)
1723
1724   ret void
1725   ; CHECK: .size min_s_eq_v16i8
1726 }
1727
1728 define void @min_s_eq_v8i16(<8 x i16>* %c, <8 x i16>* %a, <8 x i16>* %b) nounwind {
1729   ; CHECK: min_s_eq_v8i16:
1730
1731   %1 = load <8 x i16>* %a
1732   ; CHECK-DAG: ld.h [[R1:\$w[0-9]+]], 0($5)
1733   %2 = load <8 x i16>* %b
1734   ; CHECK-DAG: ld.h [[R2:\$w[0-9]+]], 0($6)
1735   %3 = icmp sle <8 x i16> %1, %2
1736   %4 = select <8 x i1> %3, <8 x i16> %1, <8 x i16> %2
1737   ; CHECK-DAG: min_s.h [[R3:\$w[0-9]+]], [[R1]], [[R2]]
1738   store <8 x i16> %4, <8 x i16>* %c
1739   ; CHECK-DAG: st.h [[R3]], 0($4)
1740
1741   ret void
1742   ; CHECK: .size min_s_eq_v8i16
1743 }
1744
1745 define void @min_s_eq_v4i32(<4 x i32>* %c, <4 x i32>* %a, <4 x i32>* %b) nounwind {
1746   ; CHECK: min_s_eq_v4i32:
1747
1748   %1 = load <4 x i32>* %a
1749   ; CHECK-DAG: ld.w [[R1:\$w[0-9]+]], 0($5)
1750   %2 = load <4 x i32>* %b
1751   ; CHECK-DAG: ld.w [[R2:\$w[0-9]+]], 0($6)
1752   %3 = icmp sle <4 x i32> %1, %2
1753   %4 = select <4 x i1> %3, <4 x i32> %1, <4 x i32> %2
1754   ; CHECK-DAG: min_s.w [[R3:\$w[0-9]+]], [[R1]], [[R2]]
1755   store <4 x i32> %4, <4 x i32>* %c
1756   ; CHECK-DAG: st.w [[R3]], 0($4)
1757
1758   ret void
1759   ; CHECK: .size min_s_eq_v4i32
1760 }
1761
1762 define void @min_s_eq_v2i64(<2 x i64>* %c, <2 x i64>* %a, <2 x i64>* %b) nounwind {
1763   ; CHECK: min_s_eq_v2i64:
1764
1765   %1 = load <2 x i64>* %a
1766   ; CHECK-DAG: ld.d [[R1:\$w[0-9]+]], 0($5)
1767   %2 = load <2 x i64>* %b
1768   ; CHECK-DAG: ld.d [[R2:\$w[0-9]+]], 0($6)
1769   %3 = icmp sle <2 x i64> %1, %2
1770   %4 = select <2 x i1> %3, <2 x i64> %1, <2 x i64> %2
1771   ; CHECK-DAG: min_s.d [[R3:\$w[0-9]+]], [[R1]], [[R2]]
1772   store <2 x i64> %4, <2 x i64>* %c
1773   ; CHECK-DAG: st.d [[R3]], 0($4)
1774
1775   ret void
1776   ; CHECK: .size min_s_eq_v2i64
1777 }
1778
1779 define void @min_u_eq_v16i8(<16 x i8>* %c, <16 x i8>* %a, <16 x i8>* %b) nounwind {
1780   ; CHECK: min_u_eq_v16i8:
1781
1782   %1 = load <16 x i8>* %a
1783   ; CHECK-DAG: ld.b [[R1:\$w[0-9]+]], 0($5)
1784   %2 = load <16 x i8>* %b
1785   ; CHECK-DAG: ld.b [[R2:\$w[0-9]+]], 0($6)
1786   %3 = icmp ule <16 x i8> %1, %2
1787   %4 = select <16 x i1> %3, <16 x i8> %1, <16 x i8> %2
1788   ; CHECK-DAG: min_u.b [[R3:\$w[0-9]+]], [[R1]], [[R2]]
1789   store <16 x i8> %4, <16 x i8>* %c
1790   ; CHECK-DAG: st.b [[R3]], 0($4)
1791
1792   ret void
1793   ; CHECK: .size min_u_eq_v16i8
1794 }
1795
1796 define void @min_u_eq_v8i16(<8 x i16>* %c, <8 x i16>* %a, <8 x i16>* %b) nounwind {
1797   ; CHECK: min_u_eq_v8i16:
1798
1799   %1 = load <8 x i16>* %a
1800   ; CHECK-DAG: ld.h [[R1:\$w[0-9]+]], 0($5)
1801   %2 = load <8 x i16>* %b
1802   ; CHECK-DAG: ld.h [[R2:\$w[0-9]+]], 0($6)
1803   %3 = icmp ule <8 x i16> %1, %2
1804   %4 = select <8 x i1> %3, <8 x i16> %1, <8 x i16> %2
1805   ; CHECK-DAG: min_u.h [[R3:\$w[0-9]+]], [[R1]], [[R2]]
1806   store <8 x i16> %4, <8 x i16>* %c
1807   ; CHECK-DAG: st.h [[R3]], 0($4)
1808
1809   ret void
1810   ; CHECK: .size min_u_eq_v8i16
1811 }
1812
1813 define void @min_u_eq_v4i32(<4 x i32>* %c, <4 x i32>* %a, <4 x i32>* %b) nounwind {
1814   ; CHECK: min_u_eq_v4i32:
1815
1816   %1 = load <4 x i32>* %a
1817   ; CHECK-DAG: ld.w [[R1:\$w[0-9]+]], 0($5)
1818   %2 = load <4 x i32>* %b
1819   ; CHECK-DAG: ld.w [[R2:\$w[0-9]+]], 0($6)
1820   %3 = icmp ule <4 x i32> %1, %2
1821   %4 = select <4 x i1> %3, <4 x i32> %1, <4 x i32> %2
1822   ; CHECK-DAG: min_u.w [[R3:\$w[0-9]+]], [[R1]], [[R2]]
1823   store <4 x i32> %4, <4 x i32>* %c
1824   ; CHECK-DAG: st.w [[R3]], 0($4)
1825
1826   ret void
1827   ; CHECK: .size min_u_eq_v4i32
1828 }
1829
1830 define void @min_u_eq_v2i64(<2 x i64>* %c, <2 x i64>* %a, <2 x i64>* %b) nounwind {
1831   ; CHECK: min_u_eq_v2i64:
1832
1833   %1 = load <2 x i64>* %a
1834   ; CHECK-DAG: ld.d [[R1:\$w[0-9]+]], 0($5)
1835   %2 = load <2 x i64>* %b
1836   ; CHECK-DAG: ld.d [[R2:\$w[0-9]+]], 0($6)
1837   %3 = icmp ule <2 x i64> %1, %2
1838   %4 = select <2 x i1> %3, <2 x i64> %1, <2 x i64> %2
1839   ; CHECK-DAG: min_u.d [[R3:\$w[0-9]+]], [[R1]], [[R2]]
1840   store <2 x i64> %4, <2 x i64>* %c
1841   ; CHECK-DAG: st.d [[R3]], 0($4)
1842
1843   ret void
1844   ; CHECK: .size min_u_eq_v2i64
1845 }
1846
1847 define void @mini_s_v16i8(<16 x i8>* %c, <16 x i8>* %a) nounwind {
1848   ; CHECK: mini_s_v16i8:
1849
1850   %1 = load <16 x i8>* %a
1851   ; CHECK-DAG: ld.b [[R1:\$w[0-9]+]], 0($5)
1852   %2 = icmp slt <16 x i8> %1, <i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1>
1853   %3 = select <16 x i1> %2, <16 x i8> %1, <16 x i8> <i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1>
1854   ; CHECK-DAG: mini_s.b [[R3:\$w[0-9]+]], [[R1]], 1
1855   store <16 x i8> %3, <16 x i8>* %c
1856   ; CHECK-DAG: st.b [[R3]], 0($4)
1857
1858   ret void
1859   ; CHECK: .size mini_s_v16i8
1860 }
1861
1862 define void @mini_s_v8i16(<8 x i16>* %c, <8 x i16>* %a) nounwind {
1863   ; CHECK: mini_s_v8i16:
1864
1865   %1 = load <8 x i16>* %a
1866   ; CHECK-DAG: ld.h [[R1:\$w[0-9]+]], 0($5)
1867   %2 = icmp slt <8 x i16> %1, <i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1>
1868   %3 = select <8 x i1> %2, <8 x i16> %1, <8 x i16> <i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1>
1869   ; CHECK-DAG: mini_s.h [[R3:\$w[0-9]+]], [[R1]], 1
1870   store <8 x i16> %3, <8 x i16>* %c
1871   ; CHECK-DAG: st.h [[R3]], 0($4)
1872
1873   ret void
1874   ; CHECK: .size mini_s_v8i16
1875 }
1876
1877 define void @mini_s_v4i32(<4 x i32>* %c, <4 x i32>* %a) nounwind {
1878   ; CHECK: mini_s_v4i32:
1879
1880   %1 = load <4 x i32>* %a
1881   ; CHECK-DAG: ld.w [[R1:\$w[0-9]+]], 0($5)
1882   %2 = icmp slt <4 x i32> %1, <i32 1, i32 1, i32 1, i32 1>
1883   %3 = select <4 x i1> %2, <4 x i32> %1, <4 x i32> <i32 1, i32 1, i32 1, i32 1>
1884   ; CHECK-DAG: mini_s.w [[R3:\$w[0-9]+]], [[R1]], 1
1885   store <4 x i32> %3, <4 x i32>* %c
1886   ; CHECK-DAG: st.w [[R3]], 0($4)
1887
1888   ret void
1889   ; CHECK: .size mini_s_v4i32
1890 }
1891
1892 define void @mini_s_v2i64(<2 x i64>* %c, <2 x i64>* %a) nounwind {
1893   ; CHECK: mini_s_v2i64:
1894
1895   %1 = load <2 x i64>* %a
1896   ; CHECK-DAG: ld.d [[R1:\$w[0-9]+]], 0($5)
1897   %2 = icmp slt <2 x i64> %1, <i64 1, i64 1>
1898   %3 = select <2 x i1> %2, <2 x i64> %1, <2 x i64> <i64 1, i64 1>
1899   ; CHECK-DAG: mini_s.d [[R3:\$w[0-9]+]], [[R1]], 1
1900   store <2 x i64> %3, <2 x i64>* %c
1901   ; CHECK-DAG: st.d [[R3]], 0($4)
1902
1903   ret void
1904   ; CHECK: .size mini_s_v2i64
1905 }
1906
1907 define void @mini_u_v16i8(<16 x i8>* %c, <16 x i8>* %a) nounwind {
1908   ; CHECK: mini_u_v16i8:
1909
1910   %1 = load <16 x i8>* %a
1911   ; CHECK-DAG: ld.b [[R1:\$w[0-9]+]], 0($5)
1912   %2 = icmp ult <16 x i8> %1, <i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1>
1913   %3 = select <16 x i1> %2, <16 x i8> %1, <16 x i8> <i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1>
1914   ; CHECK-DAG: mini_u.b [[R3:\$w[0-9]+]], [[R1]], 1
1915   store <16 x i8> %3, <16 x i8>* %c
1916   ; CHECK-DAG: st.b [[R3]], 0($4)
1917
1918   ret void
1919   ; CHECK: .size mini_u_v16i8
1920 }
1921
1922 define void @mini_u_v8i16(<8 x i16>* %c, <8 x i16>* %a) nounwind {
1923   ; CHECK: mini_u_v8i16:
1924
1925   %1 = load <8 x i16>* %a
1926   ; CHECK-DAG: ld.h [[R1:\$w[0-9]+]], 0($5)
1927   %2 = icmp ult <8 x i16> %1, <i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1>
1928   %3 = select <8 x i1> %2, <8 x i16> %1, <8 x i16> <i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1>
1929   ; CHECK-DAG: mini_u.h [[R3:\$w[0-9]+]], [[R1]], 1
1930   store <8 x i16> %3, <8 x i16>* %c
1931   ; CHECK-DAG: st.h [[R3]], 0($4)
1932
1933   ret void
1934   ; CHECK: .size mini_u_v8i16
1935 }
1936
1937 define void @mini_u_v4i32(<4 x i32>* %c, <4 x i32>* %a) nounwind {
1938   ; CHECK: mini_u_v4i32:
1939
1940   %1 = load <4 x i32>* %a
1941   ; CHECK-DAG: ld.w [[R1:\$w[0-9]+]], 0($5)
1942   %2 = icmp ult <4 x i32> %1, <i32 1, i32 1, i32 1, i32 1>
1943   %3 = select <4 x i1> %2, <4 x i32> %1, <4 x i32> <i32 1, i32 1, i32 1, i32 1>
1944   ; CHECK-DAG: mini_u.w [[R3:\$w[0-9]+]], [[R1]], 1
1945   store <4 x i32> %3, <4 x i32>* %c
1946   ; CHECK-DAG: st.w [[R3]], 0($4)
1947
1948   ret void
1949   ; CHECK: .size mini_u_v4i32
1950 }
1951
1952 define void @mini_u_v2i64(<2 x i64>* %c, <2 x i64>* %a) nounwind {
1953   ; CHECK: mini_u_v2i64:
1954
1955   %1 = load <2 x i64>* %a
1956   ; CHECK-DAG: ld.d [[R1:\$w[0-9]+]], 0($5)
1957   %2 = icmp ult <2 x i64> %1, <i64 1, i64 1>
1958   %3 = select <2 x i1> %2, <2 x i64> %1, <2 x i64> <i64 1, i64 1>
1959   ; CHECK-DAG: mini_u.d [[R3:\$w[0-9]+]], [[R1]], 1
1960   store <2 x i64> %3, <2 x i64>* %c
1961   ; CHECK-DAG: st.d [[R3]], 0($4)
1962
1963   ret void
1964   ; CHECK: .size mini_u_v2i64
1965 }
1966
1967 define void @mini_s_eq_v16i8(<16 x i8>* %c, <16 x i8>* %a) nounwind {
1968   ; CHECK: mini_s_eq_v16i8:
1969
1970   %1 = load <16 x i8>* %a
1971   ; CHECK-DAG: ld.b [[R1:\$w[0-9]+]], 0($5)
1972   %2 = icmp sle <16 x i8> %1, <i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1>
1973   %3 = select <16 x i1> %2, <16 x i8> %1, <16 x i8> <i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1>
1974   ; CHECK-DAG: mini_s.b [[R3:\$w[0-9]+]], [[R1]], 1
1975   store <16 x i8> %3, <16 x i8>* %c
1976   ; CHECK-DAG: st.b [[R3]], 0($4)
1977
1978   ret void
1979   ; CHECK: .size mini_s_eq_v16i8
1980 }
1981
1982 define void @mini_s_eq_v8i16(<8 x i16>* %c, <8 x i16>* %a) nounwind {
1983   ; CHECK: mini_s_eq_v8i16:
1984
1985   %1 = load <8 x i16>* %a
1986   ; CHECK-DAG: ld.h [[R1:\$w[0-9]+]], 0($5)
1987   %2 = icmp sle <8 x i16> %1, <i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1>
1988   %3 = select <8 x i1> %2, <8 x i16> %1, <8 x i16> <i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1>
1989   ; CHECK-DAG: mini_s.h [[R3:\$w[0-9]+]], [[R1]], 1
1990   store <8 x i16> %3, <8 x i16>* %c
1991   ; CHECK-DAG: st.h [[R3]], 0($4)
1992
1993   ret void
1994   ; CHECK: .size mini_s_eq_v8i16
1995 }
1996
1997 define void @mini_s_eq_v4i32(<4 x i32>* %c, <4 x i32>* %a) nounwind {
1998   ; CHECK: mini_s_eq_v4i32:
1999
2000   %1 = load <4 x i32>* %a
2001   ; CHECK-DAG: ld.w [[R1:\$w[0-9]+]], 0($5)
2002   %2 = icmp sle <4 x i32> %1, <i32 1, i32 1, i32 1, i32 1>
2003   %3 = select <4 x i1> %2, <4 x i32> %1, <4 x i32> <i32 1, i32 1, i32 1, i32 1>
2004   ; CHECK-DAG: mini_s.w [[R3:\$w[0-9]+]], [[R1]], 1
2005   store <4 x i32> %3, <4 x i32>* %c
2006   ; CHECK-DAG: st.w [[R3]], 0($4)
2007
2008   ret void
2009   ; CHECK: .size mini_s_eq_v4i32
2010 }
2011
2012 define void @mini_s_eq_v2i64(<2 x i64>* %c, <2 x i64>* %a) nounwind {
2013   ; CHECK: mini_s_eq_v2i64:
2014
2015   %1 = load <2 x i64>* %a
2016   ; CHECK-DAG: ld.d [[R1:\$w[0-9]+]], 0($5)
2017   %2 = icmp sle <2 x i64> %1, <i64 1, i64 1>
2018   %3 = select <2 x i1> %2, <2 x i64> %1, <2 x i64> <i64 1, i64 1>
2019   ; CHECK-DAG: mini_s.d [[R3:\$w[0-9]+]], [[R1]], 1
2020   store <2 x i64> %3, <2 x i64>* %c
2021   ; CHECK-DAG: st.d [[R3]], 0($4)
2022
2023   ret void
2024   ; CHECK: .size mini_s_eq_v2i64
2025 }
2026
2027 define void @mini_u_eq_v16i8(<16 x i8>* %c, <16 x i8>* %a) nounwind {
2028   ; CHECK: mini_u_eq_v16i8:
2029
2030   %1 = load <16 x i8>* %a
2031   ; CHECK-DAG: ld.b [[R1:\$w[0-9]+]], 0($5)
2032   %2 = icmp ule <16 x i8> %1, <i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1>
2033   %3 = select <16 x i1> %2, <16 x i8> %1, <16 x i8> <i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1>
2034   ; CHECK-DAG: mini_u.b [[R3:\$w[0-9]+]], [[R1]], 1
2035   store <16 x i8> %3, <16 x i8>* %c
2036   ; CHECK-DAG: st.b [[R3]], 0($4)
2037
2038   ret void
2039   ; CHECK: .size mini_u_eq_v16i8
2040 }
2041
2042 define void @mini_u_eq_v8i16(<8 x i16>* %c, <8 x i16>* %a) nounwind {
2043   ; CHECK: mini_u_eq_v8i16:
2044
2045   %1 = load <8 x i16>* %a
2046   ; CHECK-DAG: ld.h [[R1:\$w[0-9]+]], 0($5)
2047   %2 = icmp ule <8 x i16> %1, <i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1>
2048   %3 = select <8 x i1> %2, <8 x i16> %1, <8 x i16> <i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1>
2049   ; CHECK-DAG: mini_u.h [[R3:\$w[0-9]+]], [[R1]], 1
2050   store <8 x i16> %3, <8 x i16>* %c
2051   ; CHECK-DAG: st.h [[R3]], 0($4)
2052
2053   ret void
2054   ; CHECK: .size mini_u_eq_v8i16
2055 }
2056
2057 define void @mini_u_eq_v4i32(<4 x i32>* %c, <4 x i32>* %a) nounwind {
2058   ; CHECK: mini_u_eq_v4i32:
2059
2060   %1 = load <4 x i32>* %a
2061   ; CHECK-DAG: ld.w [[R1:\$w[0-9]+]], 0($5)
2062   %2 = icmp ule <4 x i32> %1, <i32 1, i32 1, i32 1, i32 1>
2063   %3 = select <4 x i1> %2, <4 x i32> %1, <4 x i32> <i32 1, i32 1, i32 1, i32 1>
2064   ; CHECK-DAG: mini_u.w [[R3:\$w[0-9]+]], [[R1]], 1
2065   store <4 x i32> %3, <4 x i32>* %c
2066   ; CHECK-DAG: st.w [[R3]], 0($4)
2067
2068   ret void
2069   ; CHECK: .size mini_u_eq_v4i32
2070 }
2071
2072 define void @mini_u_eq_v2i64(<2 x i64>* %c, <2 x i64>* %a) nounwind {
2073   ; CHECK: mini_u_eq_v2i64:
2074
2075   %1 = load <2 x i64>* %a
2076   ; CHECK-DAG: ld.d [[R1:\$w[0-9]+]], 0($5)
2077   %2 = icmp ule <2 x i64> %1, <i64 1, i64 1>
2078   %3 = select <2 x i1> %2, <2 x i64> %1, <2 x i64> <i64 1, i64 1>
2079   ; CHECK-DAG: mini_u.d [[R3:\$w[0-9]+]], [[R1]], 1
2080   store <2 x i64> %3, <2 x i64>* %c
2081   ; CHECK-DAG: st.d [[R3]], 0($4)
2082
2083   ret void
2084   ; CHECK: .size mini_u_eq_v2i64
2085 }