[mips][msa] Added support for matching bsel and bseli from normal IR (i.e. not intrin...
[oota-llvm.git] / test / CodeGen / Mips / msa / compare.ll
1 ; RUN: llc -march=mips -mattr=+msa < %s | FileCheck %s
2
3 define void @ceq_v16i8(<16 x i8>* %c, <16 x i8>* %a, <16 x i8>* %b) nounwind {
4   ; CHECK: ceq_v16i8:
5
6   %1 = load <16 x i8>* %a
7   ; CHECK-DAG: ld.b [[R1:\$w[0-9]+]], 0($5)
8   %2 = load <16 x i8>* %b
9   ; CHECK-DAG: ld.b [[R2:\$w[0-9]+]], 0($6)
10   %3 = icmp eq <16 x i8> %1, %2
11   %4 = sext <16 x i1> %3 to <16 x i8>
12   ; CHECK-DAG: ceq.b [[R3:\$w[0-9]+]], [[R1]], [[R2]]
13   store <16 x i8> %4, <16 x i8>* %c
14   ; CHECK-DAG: st.b [[R3]], 0($4)
15
16   ret void
17   ; CHECK: .size ceq_v16i8
18 }
19
20 define void @ceq_v8i16(<8 x i16>* %c, <8 x i16>* %a, <8 x i16>* %b) nounwind {
21   ; CHECK: ceq_v8i16:
22
23   %1 = load <8 x i16>* %a
24   ; CHECK-DAG: ld.h [[R1:\$w[0-9]+]], 0($5)
25   %2 = load <8 x i16>* %b
26   ; CHECK-DAG: ld.h [[R2:\$w[0-9]+]], 0($6)
27   %3 = icmp eq <8 x i16> %1, %2
28   %4 = sext <8 x i1> %3 to <8 x i16>
29   ; CHECK-DAG: ceq.h [[R3:\$w[0-9]+]], [[R1]], [[R2]]
30   store <8 x i16> %4, <8 x i16>* %c
31   ; CHECK-DAG: st.h [[R3]], 0($4)
32
33   ret void
34   ; CHECK: .size ceq_v8i16
35 }
36
37 define void @ceq_v4i32(<4 x i32>* %c, <4 x i32>* %a, <4 x i32>* %b) nounwind {
38   ; CHECK: ceq_v4i32:
39
40   %1 = load <4 x i32>* %a
41   ; CHECK-DAG: ld.w [[R1:\$w[0-9]+]], 0($5)
42   %2 = load <4 x i32>* %b
43   ; CHECK-DAG: ld.w [[R2:\$w[0-9]+]], 0($6)
44   %3 = icmp eq <4 x i32> %1, %2
45   %4 = sext <4 x i1> %3 to <4 x i32>
46   ; CHECK-DAG: ceq.w [[R3:\$w[0-9]+]], [[R1]], [[R2]]
47   store <4 x i32> %4, <4 x i32>* %c
48   ; CHECK-DAG: st.w [[R3]], 0($4)
49
50   ret void
51   ; CHECK: .size ceq_v4i32
52 }
53
54 define void @ceq_v2i64(<2 x i64>* %c, <2 x i64>* %a, <2 x i64>* %b) nounwind {
55   ; CHECK: ceq_v2i64:
56
57   %1 = load <2 x i64>* %a
58   ; CHECK-DAG: ld.d [[R1:\$w[0-9]+]], 0($5)
59   %2 = load <2 x i64>* %b
60   ; CHECK-DAG: ld.d [[R2:\$w[0-9]+]], 0($6)
61   %3 = icmp eq <2 x i64> %1, %2
62   %4 = sext <2 x i1> %3 to <2 x i64>
63   ; CHECK-DAG: ceq.d [[R3:\$w[0-9]+]], [[R1]], [[R2]]
64   store <2 x i64> %4, <2 x i64>* %c
65   ; CHECK-DAG: st.d [[R3]], 0($4)
66
67   ret void
68   ; CHECK: .size ceq_v2i64
69 }
70
71 define void @cle_s_v16i8(<16 x i8>* %c, <16 x i8>* %a, <16 x i8>* %b) nounwind {
72   ; CHECK: cle_s_v16i8:
73
74   %1 = load <16 x i8>* %a
75   ; CHECK-DAG: ld.b [[R1:\$w[0-9]+]], 0($5)
76   %2 = load <16 x i8>* %b
77   ; CHECK-DAG: ld.b [[R2:\$w[0-9]+]], 0($6)
78   %3 = icmp sle <16 x i8> %1, %2
79   %4 = sext <16 x i1> %3 to <16 x i8>
80   ; CHECK-DAG: cle_s.b [[R3:\$w[0-9]+]], [[R1]], [[R2]]
81   store <16 x i8> %4, <16 x i8>* %c
82   ; CHECK-DAG: st.b [[R3]], 0($4)
83
84   ret void
85   ; CHECK: .size cle_s_v16i8
86 }
87
88 define void @cle_s_v8i16(<8 x i16>* %c, <8 x i16>* %a, <8 x i16>* %b) nounwind {
89   ; CHECK: cle_s_v8i16:
90
91   %1 = load <8 x i16>* %a
92   ; CHECK-DAG: ld.h [[R1:\$w[0-9]+]], 0($5)
93   %2 = load <8 x i16>* %b
94   ; CHECK-DAG: ld.h [[R2:\$w[0-9]+]], 0($6)
95   %3 = icmp sle <8 x i16> %1, %2
96   %4 = sext <8 x i1> %3 to <8 x i16>
97   ; CHECK-DAG: cle_s.h [[R3:\$w[0-9]+]], [[R1]], [[R2]]
98   store <8 x i16> %4, <8 x i16>* %c
99   ; CHECK-DAG: st.h [[R3]], 0($4)
100
101   ret void
102   ; CHECK: .size cle_s_v8i16
103 }
104
105 define void @cle_s_v4i32(<4 x i32>* %c, <4 x i32>* %a, <4 x i32>* %b) nounwind {
106   ; CHECK: cle_s_v4i32:
107
108   %1 = load <4 x i32>* %a
109   ; CHECK-DAG: ld.w [[R1:\$w[0-9]+]], 0($5)
110   %2 = load <4 x i32>* %b
111   ; CHECK-DAG: ld.w [[R2:\$w[0-9]+]], 0($6)
112   %3 = icmp sle <4 x i32> %1, %2
113   %4 = sext <4 x i1> %3 to <4 x i32>
114   ; CHECK-DAG: cle_s.w [[R3:\$w[0-9]+]], [[R1]], [[R2]]
115   store <4 x i32> %4, <4 x i32>* %c
116   ; CHECK-DAG: st.w [[R3]], 0($4)
117
118   ret void
119   ; CHECK: .size cle_s_v4i32
120 }
121
122 define void @cle_s_v2i64(<2 x i64>* %c, <2 x i64>* %a, <2 x i64>* %b) nounwind {
123   ; CHECK: cle_s_v2i64:
124
125   %1 = load <2 x i64>* %a
126   ; CHECK-DAG: ld.d [[R1:\$w[0-9]+]], 0($5)
127   %2 = load <2 x i64>* %b
128   ; CHECK-DAG: ld.d [[R2:\$w[0-9]+]], 0($6)
129   %3 = icmp sle <2 x i64> %1, %2
130   %4 = sext <2 x i1> %3 to <2 x i64>
131   ; CHECK-DAG: cle_s.d [[R3:\$w[0-9]+]], [[R1]], [[R2]]
132   store <2 x i64> %4, <2 x i64>* %c
133   ; CHECK-DAG: st.d [[R3]], 0($4)
134
135   ret void
136   ; CHECK: .size cle_s_v2i64
137 }
138
139 define void @cle_u_v16i8(<16 x i8>* %c, <16 x i8>* %a, <16 x i8>* %b) nounwind {
140   ; CHECK: cle_u_v16i8:
141
142   %1 = load <16 x i8>* %a
143   ; CHECK-DAG: ld.b [[R1:\$w[0-9]+]], 0($5)
144   %2 = load <16 x i8>* %b
145   ; CHECK-DAG: ld.b [[R2:\$w[0-9]+]], 0($6)
146   %3 = icmp ule <16 x i8> %1, %2
147   %4 = sext <16 x i1> %3 to <16 x i8>
148   ; CHECK-DAG: cle_u.b [[R3:\$w[0-9]+]], [[R1]], [[R2]]
149   store <16 x i8> %4, <16 x i8>* %c
150   ; CHECK-DAG: st.b [[R3]], 0($4)
151
152   ret void
153   ; CHECK: .size cle_u_v16i8
154 }
155
156 define void @cle_u_v8i16(<8 x i16>* %c, <8 x i16>* %a, <8 x i16>* %b) nounwind {
157   ; CHECK: cle_u_v8i16:
158
159   %1 = load <8 x i16>* %a
160   ; CHECK-DAG: ld.h [[R1:\$w[0-9]+]], 0($5)
161   %2 = load <8 x i16>* %b
162   ; CHECK-DAG: ld.h [[R2:\$w[0-9]+]], 0($6)
163   %3 = icmp ule <8 x i16> %1, %2
164   %4 = sext <8 x i1> %3 to <8 x i16>
165   ; CHECK-DAG: cle_u.h [[R3:\$w[0-9]+]], [[R1]], [[R2]]
166   store <8 x i16> %4, <8 x i16>* %c
167   ; CHECK-DAG: st.h [[R3]], 0($4)
168
169   ret void
170   ; CHECK: .size cle_u_v8i16
171 }
172
173 define void @cle_u_v4i32(<4 x i32>* %c, <4 x i32>* %a, <4 x i32>* %b) nounwind {
174   ; CHECK: cle_u_v4i32:
175
176   %1 = load <4 x i32>* %a
177   ; CHECK-DAG: ld.w [[R1:\$w[0-9]+]], 0($5)
178   %2 = load <4 x i32>* %b
179   ; CHECK-DAG: ld.w [[R2:\$w[0-9]+]], 0($6)
180   %3 = icmp ule <4 x i32> %1, %2
181   %4 = sext <4 x i1> %3 to <4 x i32>
182   ; CHECK-DAG: cle_u.w [[R3:\$w[0-9]+]], [[R1]], [[R2]]
183   store <4 x i32> %4, <4 x i32>* %c
184   ; CHECK-DAG: st.w [[R3]], 0($4)
185
186   ret void
187   ; CHECK: .size cle_u_v4i32
188 }
189
190 define void @cle_u_v2i64(<2 x i64>* %c, <2 x i64>* %a, <2 x i64>* %b) nounwind {
191   ; CHECK: cle_u_v2i64:
192
193   %1 = load <2 x i64>* %a
194   ; CHECK-DAG: ld.d [[R1:\$w[0-9]+]], 0($5)
195   %2 = load <2 x i64>* %b
196   ; CHECK-DAG: ld.d [[R2:\$w[0-9]+]], 0($6)
197   %3 = icmp ule <2 x i64> %1, %2
198   %4 = sext <2 x i1> %3 to <2 x i64>
199   ; CHECK-DAG: cle_u.d [[R3:\$w[0-9]+]], [[R1]], [[R2]]
200   store <2 x i64> %4, <2 x i64>* %c
201   ; CHECK-DAG: st.d [[R3]], 0($4)
202
203   ret void
204   ; CHECK: .size cle_u_v2i64
205 }
206
207 define void @clt_s_v16i8(<16 x i8>* %c, <16 x i8>* %a, <16 x i8>* %b) nounwind {
208   ; CHECK: clt_s_v16i8:
209
210   %1 = load <16 x i8>* %a
211   ; CHECK-DAG: ld.b [[R1:\$w[0-9]+]], 0($5)
212   %2 = load <16 x i8>* %b
213   ; CHECK-DAG: ld.b [[R2:\$w[0-9]+]], 0($6)
214   %3 = icmp slt <16 x i8> %1, %2
215   %4 = sext <16 x i1> %3 to <16 x i8>
216   ; CHECK-DAG: clt_s.b [[R3:\$w[0-9]+]], [[R1]], [[R2]]
217   store <16 x i8> %4, <16 x i8>* %c
218   ; CHECK-DAG: st.b [[R3]], 0($4)
219
220   ret void
221   ; CHECK: .size clt_s_v16i8
222 }
223
224 define void @clt_s_v8i16(<8 x i16>* %c, <8 x i16>* %a, <8 x i16>* %b) nounwind {
225   ; CHECK: clt_s_v8i16:
226
227   %1 = load <8 x i16>* %a
228   ; CHECK-DAG: ld.h [[R1:\$w[0-9]+]], 0($5)
229   %2 = load <8 x i16>* %b
230   ; CHECK-DAG: ld.h [[R2:\$w[0-9]+]], 0($6)
231   %3 = icmp slt <8 x i16> %1, %2
232   %4 = sext <8 x i1> %3 to <8 x i16>
233   ; CHECK-DAG: clt_s.h [[R3:\$w[0-9]+]], [[R1]], [[R2]]
234   store <8 x i16> %4, <8 x i16>* %c
235   ; CHECK-DAG: st.h [[R3]], 0($4)
236
237   ret void
238   ; CHECK: .size clt_s_v8i16
239 }
240
241 define void @clt_s_v4i32(<4 x i32>* %c, <4 x i32>* %a, <4 x i32>* %b) nounwind {
242   ; CHECK: clt_s_v4i32:
243
244   %1 = load <4 x i32>* %a
245   ; CHECK-DAG: ld.w [[R1:\$w[0-9]+]], 0($5)
246   %2 = load <4 x i32>* %b
247   ; CHECK-DAG: ld.w [[R2:\$w[0-9]+]], 0($6)
248   %3 = icmp slt <4 x i32> %1, %2
249   %4 = sext <4 x i1> %3 to <4 x i32>
250   ; CHECK-DAG: clt_s.w [[R3:\$w[0-9]+]], [[R1]], [[R2]]
251   store <4 x i32> %4, <4 x i32>* %c
252   ; CHECK-DAG: st.w [[R3]], 0($4)
253
254   ret void
255   ; CHECK: .size clt_s_v4i32
256 }
257
258 define void @clt_s_v2i64(<2 x i64>* %c, <2 x i64>* %a, <2 x i64>* %b) nounwind {
259   ; CHECK: clt_s_v2i64:
260
261   %1 = load <2 x i64>* %a
262   ; CHECK-DAG: ld.d [[R1:\$w[0-9]+]], 0($5)
263   %2 = load <2 x i64>* %b
264   ; CHECK-DAG: ld.d [[R2:\$w[0-9]+]], 0($6)
265   %3 = icmp slt <2 x i64> %1, %2
266   %4 = sext <2 x i1> %3 to <2 x i64>
267   ; CHECK-DAG: clt_s.d [[R3:\$w[0-9]+]], [[R1]], [[R2]]
268   store <2 x i64> %4, <2 x i64>* %c
269   ; CHECK-DAG: st.d [[R3]], 0($4)
270
271   ret void
272   ; CHECK: .size clt_s_v2i64
273 }
274
275 define void @clt_u_v16i8(<16 x i8>* %c, <16 x i8>* %a, <16 x i8>* %b) nounwind {
276   ; CHECK: clt_u_v16i8:
277
278   %1 = load <16 x i8>* %a
279   ; CHECK-DAG: ld.b [[R1:\$w[0-9]+]], 0($5)
280   %2 = load <16 x i8>* %b
281   ; CHECK-DAG: ld.b [[R2:\$w[0-9]+]], 0($6)
282   %3 = icmp ult <16 x i8> %1, %2
283   %4 = sext <16 x i1> %3 to <16 x i8>
284   ; CHECK-DAG: clt_u.b [[R3:\$w[0-9]+]], [[R1]], [[R2]]
285   store <16 x i8> %4, <16 x i8>* %c
286   ; CHECK-DAG: st.b [[R3]], 0($4)
287
288   ret void
289   ; CHECK: .size clt_u_v16i8
290 }
291
292 define void @clt_u_v8i16(<8 x i16>* %c, <8 x i16>* %a, <8 x i16>* %b) nounwind {
293   ; CHECK: clt_u_v8i16:
294
295   %1 = load <8 x i16>* %a
296   ; CHECK-DAG: ld.h [[R1:\$w[0-9]+]], 0($5)
297   %2 = load <8 x i16>* %b
298   ; CHECK-DAG: ld.h [[R2:\$w[0-9]+]], 0($6)
299   %3 = icmp ult <8 x i16> %1, %2
300   %4 = sext <8 x i1> %3 to <8 x i16>
301   ; CHECK-DAG: clt_u.h [[R3:\$w[0-9]+]], [[R1]], [[R2]]
302   store <8 x i16> %4, <8 x i16>* %c
303   ; CHECK-DAG: st.h [[R3]], 0($4)
304
305   ret void
306   ; CHECK: .size clt_u_v8i16
307 }
308
309 define void @clt_u_v4i32(<4 x i32>* %c, <4 x i32>* %a, <4 x i32>* %b) nounwind {
310   ; CHECK: clt_u_v4i32:
311
312   %1 = load <4 x i32>* %a
313   ; CHECK-DAG: ld.w [[R1:\$w[0-9]+]], 0($5)
314   %2 = load <4 x i32>* %b
315   ; CHECK-DAG: ld.w [[R2:\$w[0-9]+]], 0($6)
316   %3 = icmp ult <4 x i32> %1, %2
317   %4 = sext <4 x i1> %3 to <4 x i32>
318   ; CHECK-DAG: clt_u.w [[R3:\$w[0-9]+]], [[R1]], [[R2]]
319   store <4 x i32> %4, <4 x i32>* %c
320   ; CHECK-DAG: st.w [[R3]], 0($4)
321
322   ret void
323   ; CHECK: .size clt_u_v4i32
324 }
325
326 define void @clt_u_v2i64(<2 x i64>* %c, <2 x i64>* %a, <2 x i64>* %b) nounwind {
327   ; CHECK: clt_u_v2i64:
328
329   %1 = load <2 x i64>* %a
330   ; CHECK-DAG: ld.d [[R1:\$w[0-9]+]], 0($5)
331   %2 = load <2 x i64>* %b
332   ; CHECK-DAG: ld.d [[R2:\$w[0-9]+]], 0($6)
333   %3 = icmp ult <2 x i64> %1, %2
334   %4 = sext <2 x i1> %3 to <2 x i64>
335   ; CHECK-DAG: clt_u.d [[R3:\$w[0-9]+]], [[R1]], [[R2]]
336   store <2 x i64> %4, <2 x i64>* %c
337   ; CHECK-DAG: st.d [[R3]], 0($4)
338
339   ret void
340   ; CHECK: .size clt_u_v2i64
341 }
342
343 define void @ceqi_v16i8(<16 x i8>* %c, <16 x i8>* %a) nounwind {
344   ; CHECK: ceqi_v16i8:
345
346   %1 = load <16 x i8>* %a
347   ; CHECK-DAG: ld.b [[R1:\$w[0-9]+]], 0($5)
348   %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>
349   %3 = sext <16 x i1> %2 to <16 x i8>
350   ; CHECK-DAG: ceqi.b [[R3:\$w[0-9]+]], [[R1]], 1
351   store <16 x i8> %3, <16 x i8>* %c
352   ; CHECK-DAG: st.b [[R3]], 0($4)
353
354   ret void
355   ; CHECK: .size ceqi_v16i8
356 }
357
358 define void @ceqi_v8i16(<8 x i16>* %c, <8 x i16>* %a) nounwind {
359   ; CHECK: ceqi_v8i16:
360
361   %1 = load <8 x i16>* %a
362   ; CHECK-DAG: ld.h [[R1:\$w[0-9]+]], 0($5)
363   %2 = icmp eq <8 x i16> %1, <i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1>
364   %3 = sext <8 x i1> %2 to <8 x i16>
365   ; CHECK-DAG: ceqi.h [[R3:\$w[0-9]+]], [[R1]], 1
366   store <8 x i16> %3, <8 x i16>* %c
367   ; CHECK-DAG: st.h [[R3]], 0($4)
368
369   ret void
370   ; CHECK: .size ceqi_v8i16
371 }
372
373 define void @ceqi_v4i32(<4 x i32>* %c, <4 x i32>* %a) nounwind {
374   ; CHECK: ceqi_v4i32:
375
376   %1 = load <4 x i32>* %a
377   ; CHECK-DAG: ld.w [[R1:\$w[0-9]+]], 0($5)
378   %2 = icmp eq <4 x i32> %1, <i32 1, i32 1, i32 1, i32 1>
379   %3 = sext <4 x i1> %2 to <4 x i32>
380   ; CHECK-DAG: ceqi.w [[R3:\$w[0-9]+]], [[R1]], 1
381   store <4 x i32> %3, <4 x i32>* %c
382   ; CHECK-DAG: st.w [[R3]], 0($4)
383
384   ret void
385   ; CHECK: .size ceqi_v4i32
386 }
387
388 define void @ceqi_v2i64(<2 x i64>* %c, <2 x i64>* %a) nounwind {
389   ; CHECK: ceqi_v2i64:
390
391   %1 = load <2 x i64>* %a
392   ; CHECK-DAG: ld.d [[R1:\$w[0-9]+]], 0($5)
393   %2 = icmp eq <2 x i64> %1, <i64 1, i64 1>
394   %3 = sext <2 x i1> %2 to <2 x i64>
395   ; CHECK-DAG: ceqi.d [[R3:\$w[0-9]+]], [[R1]], 1
396   store <2 x i64> %3, <2 x i64>* %c
397   ; CHECK-DAG: st.d [[R3]], 0($4)
398
399   ret void
400   ; CHECK: .size ceqi_v2i64
401 }
402
403 define void @clei_s_v16i8(<16 x i8>* %c, <16 x i8>* %a) nounwind {
404   ; CHECK: clei_s_v16i8:
405
406   %1 = load <16 x i8>* %a
407   ; CHECK-DAG: ld.b [[R1:\$w[0-9]+]], 0($5)
408   %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>
409   %3 = sext <16 x i1> %2 to <16 x i8>
410   ; CHECK-DAG: clei_s.b [[R3:\$w[0-9]+]], [[R1]], 1
411   store <16 x i8> %3, <16 x i8>* %c
412   ; CHECK-DAG: st.b [[R3]], 0($4)
413
414   ret void
415   ; CHECK: .size clei_s_v16i8
416 }
417
418 define void @clei_s_v8i16(<8 x i16>* %c, <8 x i16>* %a) nounwind {
419   ; CHECK: clei_s_v8i16:
420
421   %1 = load <8 x i16>* %a
422   ; CHECK-DAG: ld.h [[R1:\$w[0-9]+]], 0($5)
423   %2 = icmp sle <8 x i16> %1, <i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1>
424   %3 = sext <8 x i1> %2 to <8 x i16>
425   ; CHECK-DAG: clei_s.h [[R3:\$w[0-9]+]], [[R1]], 1
426   store <8 x i16> %3, <8 x i16>* %c
427   ; CHECK-DAG: st.h [[R3]], 0($4)
428
429   ret void
430   ; CHECK: .size clei_s_v8i16
431 }
432
433 define void @clei_s_v4i32(<4 x i32>* %c, <4 x i32>* %a) nounwind {
434   ; CHECK: clei_s_v4i32:
435
436   %1 = load <4 x i32>* %a
437   ; CHECK-DAG: ld.w [[R1:\$w[0-9]+]], 0($5)
438   %2 = icmp sle <4 x i32> %1, <i32 1, i32 1, i32 1, i32 1>
439   %3 = sext <4 x i1> %2 to <4 x i32>
440   ; CHECK-DAG: clei_s.w [[R3:\$w[0-9]+]], [[R1]], 1
441   store <4 x i32> %3, <4 x i32>* %c
442   ; CHECK-DAG: st.w [[R3]], 0($4)
443
444   ret void
445   ; CHECK: .size clei_s_v4i32
446 }
447
448 define void @clei_s_v2i64(<2 x i64>* %c, <2 x i64>* %a) nounwind {
449   ; CHECK: clei_s_v2i64:
450
451   %1 = load <2 x i64>* %a
452   ; CHECK-DAG: ld.d [[R1:\$w[0-9]+]], 0($5)
453   %2 = icmp sle <2 x i64> %1, <i64 1, i64 1>
454   %3 = sext <2 x i1> %2 to <2 x i64>
455   ; CHECK-DAG: clei_s.d [[R3:\$w[0-9]+]], [[R1]], 1
456   store <2 x i64> %3, <2 x i64>* %c
457   ; CHECK-DAG: st.d [[R3]], 0($4)
458
459   ret void
460   ; CHECK: .size clei_s_v2i64
461 }
462
463 define void @clei_u_v16i8(<16 x i8>* %c, <16 x i8>* %a) nounwind {
464   ; CHECK: clei_u_v16i8:
465
466   %1 = load <16 x i8>* %a
467   ; CHECK-DAG: ld.b [[R1:\$w[0-9]+]], 0($5)
468   %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>
469   %3 = sext <16 x i1> %2 to <16 x i8>
470   ; CHECK-DAG: clei_u.b [[R3:\$w[0-9]+]], [[R1]], 1
471   store <16 x i8> %3, <16 x i8>* %c
472   ; CHECK-DAG: st.b [[R3]], 0($4)
473
474   ret void
475   ; CHECK: .size clei_u_v16i8
476 }
477
478 define void @clei_u_v8i16(<8 x i16>* %c, <8 x i16>* %a) nounwind {
479   ; CHECK: clei_u_v8i16:
480
481   %1 = load <8 x i16>* %a
482   ; CHECK-DAG: ld.h [[R1:\$w[0-9]+]], 0($5)
483   %2 = icmp ule <8 x i16> %1, <i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1>
484   %3 = sext <8 x i1> %2 to <8 x i16>
485   ; CHECK-DAG: clei_u.h [[R3:\$w[0-9]+]], [[R1]], 1
486   store <8 x i16> %3, <8 x i16>* %c
487   ; CHECK-DAG: st.h [[R3]], 0($4)
488
489   ret void
490   ; CHECK: .size clei_u_v8i16
491 }
492
493 define void @clei_u_v4i32(<4 x i32>* %c, <4 x i32>* %a) nounwind {
494   ; CHECK: clei_u_v4i32:
495
496   %1 = load <4 x i32>* %a
497   ; CHECK-DAG: ld.w [[R1:\$w[0-9]+]], 0($5)
498   %2 = icmp ule <4 x i32> %1, <i32 1, i32 1, i32 1, i32 1>
499   %3 = sext <4 x i1> %2 to <4 x i32>
500   ; CHECK-DAG: clei_u.w [[R3:\$w[0-9]+]], [[R1]], 1
501   store <4 x i32> %3, <4 x i32>* %c
502   ; CHECK-DAG: st.w [[R3]], 0($4)
503
504   ret void
505   ; CHECK: .size clei_u_v4i32
506 }
507
508 define void @clei_u_v2i64(<2 x i64>* %c, <2 x i64>* %a) nounwind {
509   ; CHECK: clei_u_v2i64:
510
511   %1 = load <2 x i64>* %a
512   ; CHECK-DAG: ld.d [[R1:\$w[0-9]+]], 0($5)
513   %2 = icmp ule <2 x i64> %1, <i64 1, i64 1>
514   %3 = sext <2 x i1> %2 to <2 x i64>
515   ; CHECK-DAG: clei_u.d [[R3:\$w[0-9]+]], [[R1]], 1
516   store <2 x i64> %3, <2 x i64>* %c
517   ; CHECK-DAG: st.d [[R3]], 0($4)
518
519   ret void
520   ; CHECK: .size clei_u_v2i64
521 }
522
523 define void @clti_s_v16i8(<16 x i8>* %c, <16 x i8>* %a) nounwind {
524   ; CHECK: clti_s_v16i8:
525
526   %1 = load <16 x i8>* %a
527   ; CHECK-DAG: ld.b [[R1:\$w[0-9]+]], 0($5)
528   %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>
529   %3 = sext <16 x i1> %2 to <16 x i8>
530   ; CHECK-DAG: clti_s.b [[R3:\$w[0-9]+]], [[R1]], 1
531   store <16 x i8> %3, <16 x i8>* %c
532   ; CHECK-DAG: st.b [[R3]], 0($4)
533
534   ret void
535   ; CHECK: .size clti_s_v16i8
536 }
537
538 define void @clti_s_v8i16(<8 x i16>* %c, <8 x i16>* %a) nounwind {
539   ; CHECK: clti_s_v8i16:
540
541   %1 = load <8 x i16>* %a
542   ; CHECK-DAG: ld.h [[R1:\$w[0-9]+]], 0($5)
543   %2 = icmp slt <8 x i16> %1, <i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1>
544   %3 = sext <8 x i1> %2 to <8 x i16>
545   ; CHECK-DAG: clti_s.h [[R3:\$w[0-9]+]], [[R1]], 1
546   store <8 x i16> %3, <8 x i16>* %c
547   ; CHECK-DAG: st.h [[R3]], 0($4)
548
549   ret void
550   ; CHECK: .size clti_s_v8i16
551 }
552
553 define void @clti_s_v4i32(<4 x i32>* %c, <4 x i32>* %a) nounwind {
554   ; CHECK: clti_s_v4i32:
555
556   %1 = load <4 x i32>* %a
557   ; CHECK-DAG: ld.w [[R1:\$w[0-9]+]], 0($5)
558   %2 = icmp slt <4 x i32> %1, <i32 1, i32 1, i32 1, i32 1>
559   %3 = sext <4 x i1> %2 to <4 x i32>
560   ; CHECK-DAG: clti_s.w [[R3:\$w[0-9]+]], [[R1]], 1
561   store <4 x i32> %3, <4 x i32>* %c
562   ; CHECK-DAG: st.w [[R3]], 0($4)
563
564   ret void
565   ; CHECK: .size clti_s_v4i32
566 }
567
568 define void @clti_s_v2i64(<2 x i64>* %c, <2 x i64>* %a) nounwind {
569   ; CHECK: clti_s_v2i64:
570
571   %1 = load <2 x i64>* %a
572   ; CHECK-DAG: ld.d [[R1:\$w[0-9]+]], 0($5)
573   %2 = icmp slt <2 x i64> %1, <i64 1, i64 1>
574   %3 = sext <2 x i1> %2 to <2 x i64>
575   ; CHECK-DAG: clti_s.d [[R3:\$w[0-9]+]], [[R1]], 1
576   store <2 x i64> %3, <2 x i64>* %c
577   ; CHECK-DAG: st.d [[R3]], 0($4)
578
579   ret void
580   ; CHECK: .size clti_s_v2i64
581 }
582
583 define void @clti_u_v16i8(<16 x i8>* %c, <16 x i8>* %a) nounwind {
584   ; CHECK: clti_u_v16i8:
585
586   %1 = load <16 x i8>* %a
587   ; CHECK-DAG: ld.b [[R1:\$w[0-9]+]], 0($5)
588   %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>
589   %3 = sext <16 x i1> %2 to <16 x i8>
590   ; CHECK-DAG: clti_u.b [[R3:\$w[0-9]+]], [[R1]], 1
591   store <16 x i8> %3, <16 x i8>* %c
592   ; CHECK-DAG: st.b [[R3]], 0($4)
593
594   ret void
595   ; CHECK: .size clti_u_v16i8
596 }
597
598 define void @clti_u_v8i16(<8 x i16>* %c, <8 x i16>* %a) nounwind {
599   ; CHECK: clti_u_v8i16:
600
601   %1 = load <8 x i16>* %a
602   ; CHECK-DAG: ld.h [[R1:\$w[0-9]+]], 0($5)
603   %2 = icmp ult <8 x i16> %1, <i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1>
604   %3 = sext <8 x i1> %2 to <8 x i16>
605   ; CHECK-DAG: clti_u.h [[R3:\$w[0-9]+]], [[R1]], 1
606   store <8 x i16> %3, <8 x i16>* %c
607   ; CHECK-DAG: st.h [[R3]], 0($4)
608
609   ret void
610   ; CHECK: .size clti_u_v8i16
611 }
612
613 define void @clti_u_v4i32(<4 x i32>* %c, <4 x i32>* %a) nounwind {
614   ; CHECK: clti_u_v4i32:
615
616   %1 = load <4 x i32>* %a
617   ; CHECK-DAG: ld.w [[R1:\$w[0-9]+]], 0($5)
618   %2 = icmp ult <4 x i32> %1, <i32 1, i32 1, i32 1, i32 1>
619   %3 = sext <4 x i1> %2 to <4 x i32>
620   ; CHECK-DAG: clti_u.w [[R3:\$w[0-9]+]], [[R1]], 1
621   store <4 x i32> %3, <4 x i32>* %c
622   ; CHECK-DAG: st.w [[R3]], 0($4)
623
624   ret void
625   ; CHECK: .size clti_u_v4i32
626 }
627
628 define void @clti_u_v2i64(<2 x i64>* %c, <2 x i64>* %a) nounwind {
629   ; CHECK: clti_u_v2i64:
630
631   %1 = load <2 x i64>* %a
632   ; CHECK-DAG: ld.d [[R1:\$w[0-9]+]], 0($5)
633   %2 = icmp ult <2 x i64> %1, <i64 1, i64 1>
634   %3 = sext <2 x i1> %2 to <2 x i64>
635   ; CHECK-DAG: clti_u.d [[R3:\$w[0-9]+]], [[R1]], 1
636   store <2 x i64> %3, <2 x i64>* %c
637   ; CHECK-DAG: st.d [[R3]], 0($4)
638
639   ret void
640   ; CHECK: .size clti_u_v2i64
641 }
642
643 define void @bsel_s_v16i8(<16 x i8>* %d, <16 x i8>* %a, <16 x i8>* %b,
644                         <16 x i8>* %c) nounwind {
645   ; CHECK: bsel_s_v16i8:
646
647   %1 = load <16 x i8>* %a
648   ; CHECK-DAG: ld.b [[R1:\$w[0-9]+]], 0($5)
649   %2 = load <16 x i8>* %b
650   ; CHECK-DAG: ld.b [[R2:\$w[0-9]+]], 0($6)
651   %3 = load <16 x i8>* %c
652   ; CHECK-DAG: ld.b [[R3:\$w[0-9]+]], 0($7)
653   %4 = icmp sgt <16 x i8> %1, %2
654   ; CHECK-DAG: clt_s.b [[R4:\$w[0-9]+]], [[R2]], [[R1]]
655   %5 = select <16 x i1> %4, <16 x i8> %1, <16 x i8> %3
656   ; CHECK-DAG: bsel.v [[R4]], [[R1]], [[R3]]
657   store <16 x i8> %5, <16 x i8>* %d
658   ; CHECK-DAG: st.b [[R4]], 0($4)
659
660   ret void
661   ; CHECK: .size bsel_s_v16i8
662 }
663
664 define void @bsel_s_v8i16(<8 x i16>* %d, <8 x i16>* %a, <8 x i16>* %b,
665                         <8 x i16>* %c) nounwind {
666   ; CHECK: bsel_s_v8i16:
667
668   %1 = load <8 x i16>* %a
669   ; CHECK-DAG: ld.h [[R1:\$w[0-9]+]], 0($5)
670   %2 = load <8 x i16>* %b
671   ; CHECK-DAG: ld.h [[R2:\$w[0-9]+]], 0($6)
672   %3 = load <8 x i16>* %c
673   ; CHECK-DAG: ld.h [[R3:\$w[0-9]+]], 0($7)
674   %4 = icmp sgt <8 x i16> %1, %2
675   ; CHECK-DAG: clt_s.h [[R4:\$w[0-9]+]], [[R2]], [[R1]]
676   %5 = select <8 x i1> %4, <8 x i16> %1, <8 x i16> %3
677   ; CHECK-DAG: bsel.v [[R4]], [[R1]], [[R3]]
678   store <8 x i16> %5, <8 x i16>* %d
679   ; CHECK-DAG: st.h [[R4]], 0($4)
680
681   ret void
682   ; CHECK: .size bsel_s_v8i16
683 }
684
685 define void @bsel_s_v4i32(<4 x i32>* %d, <4 x i32>* %a, <4 x i32>* %b,
686                         <4 x i32>* %c) nounwind {
687   ; CHECK: bsel_s_v4i32:
688
689   %1 = load <4 x i32>* %a
690   ; CHECK-DAG: ld.w [[R1:\$w[0-9]+]], 0($5)
691   %2 = load <4 x i32>* %b
692   ; CHECK-DAG: ld.w [[R2:\$w[0-9]+]], 0($6)
693   %3 = load <4 x i32>* %c
694   ; CHECK-DAG: ld.w [[R3:\$w[0-9]+]], 0($7)
695   %4 = icmp sgt <4 x i32> %1, %2
696   ; CHECK-DAG: clt_s.w [[R4:\$w[0-9]+]], [[R2]], [[R1]]
697   %5 = select <4 x i1> %4, <4 x i32> %1, <4 x i32> %3
698   ; CHECK-DAG: bsel.v [[R4]], [[R1]], [[R3]]
699   store <4 x i32> %5, <4 x i32>* %d
700   ; CHECK-DAG: st.w [[R4]], 0($4)
701
702   ret void
703   ; CHECK: .size bsel_s_v4i32
704 }
705
706 define void @bsel_s_v2i64(<2 x i64>* %d, <2 x i64>* %a, <2 x i64>* %b,
707                         <2 x i64>* %c) nounwind {
708   ; CHECK: bsel_s_v2i64:
709
710   %1 = load <2 x i64>* %a
711   ; CHECK-DAG: ld.d [[R1:\$w[0-9]+]], 0($5)
712   %2 = load <2 x i64>* %b
713   ; CHECK-DAG: ld.d [[R2:\$w[0-9]+]], 0($6)
714   %3 = load <2 x i64>* %c
715   ; CHECK-DAG: ld.d [[R3:\$w[0-9]+]], 0($7)
716   %4 = icmp sgt <2 x i64> %1, %2
717   ; CHECK-DAG: clt_s.d [[R4:\$w[0-9]+]], [[R2]], [[R1]]
718   %5 = select <2 x i1> %4, <2 x i64> %1, <2 x i64> %3
719   ; CHECK-DAG: bsel.v [[R4]], [[R1]], [[R3]]
720   store <2 x i64> %5, <2 x i64>* %d
721   ; CHECK-DAG: st.d [[R4]], 0($4)
722
723   ret void
724   ; CHECK: .size bsel_s_v2i64
725 }
726
727 define void @bsel_u_v16i8(<16 x i8>* %d, <16 x i8>* %a, <16 x i8>* %b,
728                         <16 x i8>* %c) nounwind {
729   ; CHECK: bsel_u_v16i8:
730
731   %1 = load <16 x i8>* %a
732   ; CHECK-DAG: ld.b [[R1:\$w[0-9]+]], 0($5)
733   %2 = load <16 x i8>* %b
734   ; CHECK-DAG: ld.b [[R2:\$w[0-9]+]], 0($6)
735   %3 = load <16 x i8>* %c
736   ; CHECK-DAG: ld.b [[R3:\$w[0-9]+]], 0($7)
737   %4 = icmp ugt <16 x i8> %1, %2
738   ; CHECK-DAG: clt_u.b [[R4:\$w[0-9]+]], [[R2]], [[R1]]
739   %5 = select <16 x i1> %4, <16 x i8> %1, <16 x i8> %3
740   ; CHECK-DAG: bsel.v [[R4]], [[R1]], [[R3]]
741   store <16 x i8> %5, <16 x i8>* %d
742   ; CHECK-DAG: st.b [[R4]], 0($4)
743
744   ret void
745   ; CHECK: .size bsel_u_v16i8
746 }
747
748 define void @bsel_u_v8i16(<8 x i16>* %d, <8 x i16>* %a, <8 x i16>* %b,
749                         <8 x i16>* %c) nounwind {
750   ; CHECK: bsel_u_v8i16:
751
752   %1 = load <8 x i16>* %a
753   ; CHECK-DAG: ld.h [[R1:\$w[0-9]+]], 0($5)
754   %2 = load <8 x i16>* %b
755   ; CHECK-DAG: ld.h [[R2:\$w[0-9]+]], 0($6)
756   %3 = load <8 x i16>* %c
757   ; CHECK-DAG: ld.h [[R3:\$w[0-9]+]], 0($7)
758   %4 = icmp ugt <8 x i16> %1, %2
759   ; CHECK-DAG: clt_u.h [[R4:\$w[0-9]+]], [[R2]], [[R1]]
760   %5 = select <8 x i1> %4, <8 x i16> %1, <8 x i16> %3
761   ; CHECK-DAG: bsel.v [[R4]], [[R1]], [[R3]]
762   store <8 x i16> %5, <8 x i16>* %d
763   ; CHECK-DAG: st.h [[R4]], 0($4)
764
765   ret void
766   ; CHECK: .size bsel_u_v8i16
767 }
768
769 define void @bsel_u_v4i32(<4 x i32>* %d, <4 x i32>* %a, <4 x i32>* %b,
770                         <4 x i32>* %c) nounwind {
771   ; CHECK: bsel_u_v4i32:
772
773   %1 = load <4 x i32>* %a
774   ; CHECK-DAG: ld.w [[R1:\$w[0-9]+]], 0($5)
775   %2 = load <4 x i32>* %b
776   ; CHECK-DAG: ld.w [[R2:\$w[0-9]+]], 0($6)
777   %3 = load <4 x i32>* %c
778   ; CHECK-DAG: ld.w [[R3:\$w[0-9]+]], 0($7)
779   %4 = icmp ugt <4 x i32> %1, %2
780   ; CHECK-DAG: clt_u.w [[R4:\$w[0-9]+]], [[R2]], [[R1]]
781   %5 = select <4 x i1> %4, <4 x i32> %1, <4 x i32> %3
782   ; CHECK-DAG: bsel.v [[R4]], [[R1]], [[R3]]
783   store <4 x i32> %5, <4 x i32>* %d
784   ; CHECK-DAG: st.w [[R4]], 0($4)
785
786   ret void
787   ; CHECK: .size bsel_u_v4i32
788 }
789
790 define void @bsel_u_v2i64(<2 x i64>* %d, <2 x i64>* %a, <2 x i64>* %b,
791                         <2 x i64>* %c) nounwind {
792   ; CHECK: bsel_u_v2i64:
793
794   %1 = load <2 x i64>* %a
795   ; CHECK-DAG: ld.d [[R1:\$w[0-9]+]], 0($5)
796   %2 = load <2 x i64>* %b
797   ; CHECK-DAG: ld.d [[R2:\$w[0-9]+]], 0($6)
798   %3 = load <2 x i64>* %c
799   ; CHECK-DAG: ld.d [[R3:\$w[0-9]+]], 0($7)
800   %4 = icmp ugt <2 x i64> %1, %2
801   ; CHECK-DAG: clt_u.d [[R4:\$w[0-9]+]], [[R2]], [[R1]]
802   %5 = select <2 x i1> %4, <2 x i64> %1, <2 x i64> %3
803   ; CHECK-DAG: bsel.v [[R4]], [[R1]], [[R3]]
804   store <2 x i64> %5, <2 x i64>* %d
805   ; CHECK-DAG: st.d [[R4]], 0($4)
806
807   ret void
808   ; CHECK: .size bsel_u_v2i64
809 }
810
811 define void @bseli_s_v16i8(<16 x i8>* %d, <16 x i8>* %a, <16 x i8>* %b,
812                         <16 x i8>* %c) nounwind {
813   ; CHECK: bseli_s_v16i8:
814
815   %1 = load <16 x i8>* %a
816   ; CHECK-DAG: ld.b [[R1:\$w[0-9]+]], 0($5)
817   %2 = load <16 x i8>* %b
818   ; CHECK-DAG: ld.b [[R2:\$w[0-9]+]], 0($6)
819   %3 = icmp sgt <16 x i8> %1, %2
820   ; CHECK-DAG: clt_s.b [[R4:\$w[0-9]+]], [[R2]], [[R1]]
821   %4 = select <16 x i1> %3, <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>
822   ; CHECK-DAG: bseli.b [[R4]], [[R1]], 1
823   store <16 x i8> %4, <16 x i8>* %d
824   ; CHECK-DAG: st.b [[R4]], 0($4)
825
826   ret void
827   ; CHECK: .size bseli_s_v16i8
828 }
829
830 define void @bseli_s_v8i16(<8 x i16>* %d, <8 x i16>* %a, <8 x i16>* %b,
831                         <8 x i16>* %c) nounwind {
832   ; CHECK: bseli_s_v8i16:
833
834   %1 = load <8 x i16>* %a
835   ; CHECK-DAG: ld.h [[R1:\$w[0-9]+]], 0($5)
836   %2 = load <8 x i16>* %b
837   ; CHECK-DAG: ld.h [[R2:\$w[0-9]+]], 0($6)
838   %3 = icmp sgt <8 x i16> %1, %2
839   ; CHECK-DAG: clt_s.h [[R4:\$w[0-9]+]], [[R2]], [[R1]]
840   %4 = select <8 x i1> %3, <8 x i16> %1, <8 x i16> <i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1>
841   ; CHECK-DAG: ldi.h [[R3:\$w[0-9]+]], 1
842   ; CHECK-DAG: bsel.v [[R4]], [[R1]], [[R3]]
843   store <8 x i16> %4, <8 x i16>* %d
844   ; CHECK-DAG: st.h [[R4]], 0($4)
845
846   ret void
847   ; CHECK: .size bseli_s_v8i16
848 }
849
850 define void @bseli_s_v4i32(<4 x i32>* %d, <4 x i32>* %a, <4 x i32>* %b,
851                         <4 x i32>* %c) nounwind {
852   ; CHECK: bseli_s_v4i32:
853
854   %1 = load <4 x i32>* %a
855   ; CHECK-DAG: ld.w [[R1:\$w[0-9]+]], 0($5)
856   %2 = load <4 x i32>* %b
857   ; CHECK-DAG: ld.w [[R2:\$w[0-9]+]], 0($6)
858   %3 = icmp sgt <4 x i32> %1, %2
859   ; CHECK-DAG: clt_s.w [[R4:\$w[0-9]+]], [[R2]], [[R1]]
860   %4 = select <4 x i1> %3, <4 x i32> %1, <4 x i32> <i32 1, i32 1, i32 1, i32 1>
861   ; CHECK-DAG: ldi.w [[R3:\$w[0-9]+]], 1
862   ; CHECK-DAG: bsel.v [[R4]], [[R1]], [[R3]]
863   store <4 x i32> %4, <4 x i32>* %d
864   ; CHECK-DAG: st.w [[R4]], 0($4)
865
866   ret void
867   ; CHECK: .size bseli_s_v4i32
868 }
869
870 define void @bseli_s_v2i64(<2 x i64>* %d, <2 x i64>* %a, <2 x i64>* %b,
871                         <2 x i64>* %c) nounwind {
872   ; CHECK: bseli_s_v2i64:
873
874   %1 = load <2 x i64>* %a
875   ; CHECK-DAG: ld.d [[R1:\$w[0-9]+]], 0($5)
876   %2 = load <2 x i64>* %b
877   ; CHECK-DAG: ld.d [[R2:\$w[0-9]+]], 0($6)
878   %3 = icmp sgt <2 x i64> %1, %2
879   ; CHECK-DAG: clt_s.d [[R4:\$w[0-9]+]], [[R2]], [[R1]]
880   %4 = select <2 x i1> %3, <2 x i64> %1, <2 x i64> <i64 1, i64 1>
881   ; CHECK-DAG: ldi.d [[R3:\$w[0-9]+]], 1
882   ; CHECK-DAG: bsel.v [[R4]], [[R1]], [[R3]]
883   store <2 x i64> %4, <2 x i64>* %d
884   ; CHECK-DAG: st.d [[R4]], 0($4)
885
886   ret void
887   ; CHECK: .size bseli_s_v2i64
888 }
889
890 define void @bseli_u_v16i8(<16 x i8>* %d, <16 x i8>* %a, <16 x i8>* %b,
891                         <16 x i8>* %c) nounwind {
892   ; CHECK: bseli_u_v16i8:
893
894   %1 = load <16 x i8>* %a
895   ; CHECK-DAG: ld.b [[R1:\$w[0-9]+]], 0($5)
896   %2 = load <16 x i8>* %b
897   ; CHECK-DAG: ld.b [[R2:\$w[0-9]+]], 0($6)
898   %3 = icmp ugt <16 x i8> %1, %2
899   ; CHECK-DAG: clt_u.b [[R4:\$w[0-9]+]], [[R2]], [[R1]]
900   %4 = select <16 x i1> %3, <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>
901   ; CHECK-DAG: bseli.b [[R4]], [[R1]], 1
902   store <16 x i8> %4, <16 x i8>* %d
903   ; CHECK-DAG: st.b [[R4]], 0($4)
904
905   ret void
906   ; CHECK: .size bseli_u_v16i8
907 }
908
909 define void @bseli_u_v8i16(<8 x i16>* %d, <8 x i16>* %a, <8 x i16>* %b,
910                         <8 x i16>* %c) nounwind {
911   ; CHECK: bseli_u_v8i16:
912
913   %1 = load <8 x i16>* %a
914   ; CHECK-DAG: ld.h [[R1:\$w[0-9]+]], 0($5)
915   %2 = load <8 x i16>* %b
916   ; CHECK-DAG: ld.h [[R2:\$w[0-9]+]], 0($6)
917   %3 = icmp ugt <8 x i16> %1, %2
918   ; CHECK-DAG: clt_u.h [[R4:\$w[0-9]+]], [[R2]], [[R1]]
919   %4 = select <8 x i1> %3, <8 x i16> %1, <8 x i16> <i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1>
920   ; CHECK-DAG: ldi.h [[R3:\$w[0-9]+]], 1
921   ; CHECK-DAG: bsel.v [[R4]], [[R1]], [[R3]]
922   store <8 x i16> %4, <8 x i16>* %d
923   ; CHECK-DAG: st.h [[R4]], 0($4)
924
925   ret void
926   ; CHECK: .size bseli_u_v8i16
927 }
928
929 define void @bseli_u_v4i32(<4 x i32>* %d, <4 x i32>* %a, <4 x i32>* %b,
930                         <4 x i32>* %c) nounwind {
931   ; CHECK: bseli_u_v4i32:
932
933   %1 = load <4 x i32>* %a
934   ; CHECK-DAG: ld.w [[R1:\$w[0-9]+]], 0($5)
935   %2 = load <4 x i32>* %b
936   ; CHECK-DAG: ld.w [[R2:\$w[0-9]+]], 0($6)
937   %3 = icmp ugt <4 x i32> %1, %2
938   ; CHECK-DAG: clt_u.w [[R4:\$w[0-9]+]], [[R2]], [[R1]]
939   %4 = select <4 x i1> %3, <4 x i32> %1, <4 x i32> <i32 1, i32 1, i32 1, i32 1>
940   ; CHECK-DAG: ldi.w [[R3:\$w[0-9]+]], 1
941   ; CHECK-DAG: bsel.v [[R4]], [[R1]], [[R3]]
942   store <4 x i32> %4, <4 x i32>* %d
943   ; CHECK-DAG: st.w [[R4]], 0($4)
944
945   ret void
946   ; CHECK: .size bseli_u_v4i32
947 }
948
949 define void @bseli_u_v2i64(<2 x i64>* %d, <2 x i64>* %a, <2 x i64>* %b,
950                         <2 x i64>* %c) nounwind {
951   ; CHECK: bseli_u_v2i64:
952
953   %1 = load <2 x i64>* %a
954   ; CHECK-DAG: ld.d [[R1:\$w[0-9]+]], 0($5)
955   %2 = load <2 x i64>* %b
956   ; CHECK-DAG: ld.d [[R2:\$w[0-9]+]], 0($6)
957   %3 = icmp ugt <2 x i64> %1, %2
958   ; CHECK-DAG: clt_u.d [[R4:\$w[0-9]+]], [[R2]], [[R1]]
959   %4 = select <2 x i1> %3, <2 x i64> %1, <2 x i64> <i64 1, i64 1>
960   ; CHECK-DAG: ldi.d [[R3:\$w[0-9]+]], 1
961   ; CHECK-DAG: bsel.v [[R4]], [[R1]], [[R3]]
962   store <2 x i64> %4, <2 x i64>* %d
963   ; CHECK-DAG: st.d [[R4]], 0($4)
964
965   ret void
966   ; CHECK: .size bseli_u_v2i64
967 }