[mips][msa] Added support for matching bmnz, bmnzi, bmz, and bmzi from normal IR...
[oota-llvm.git] / test / CodeGen / Mips / msa / bitwise.ll
1 ; RUN: llc -march=mips -mattr=+msa,+fp64 < %s | FileCheck %s
2
3 define void @and_v16i8(<16 x i8>* %c, <16 x i8>* %a, <16 x i8>* %b) nounwind {
4   ; CHECK: and_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 = and <16 x i8> %1, %2
11   ; CHECK-DAG: and.v [[R3:\$w[0-9]+]], [[R1]], [[R2]]
12   store <16 x i8> %3, <16 x i8>* %c
13   ; CHECK-DAG: st.b [[R3]], 0($4)
14
15   ret void
16   ; CHECK: .size and_v16i8
17 }
18
19 define void @and_v8i16(<8 x i16>* %c, <8 x i16>* %a, <8 x i16>* %b) nounwind {
20   ; CHECK: and_v8i16:
21
22   %1 = load <8 x i16>* %a
23   ; CHECK-DAG: ld.h [[R1:\$w[0-9]+]], 0($5)
24   %2 = load <8 x i16>* %b
25   ; CHECK-DAG: ld.h [[R2:\$w[0-9]+]], 0($6)
26   %3 = and <8 x i16> %1, %2
27   ; CHECK-DAG: and.v [[R3:\$w[0-9]+]], [[R1]], [[R2]]
28   store <8 x i16> %3, <8 x i16>* %c
29   ; CHECK-DAG: st.h [[R3]], 0($4)
30
31   ret void
32   ; CHECK: .size and_v8i16
33 }
34
35 define void @and_v4i32(<4 x i32>* %c, <4 x i32>* %a, <4 x i32>* %b) nounwind {
36   ; CHECK: and_v4i32:
37
38   %1 = load <4 x i32>* %a
39   ; CHECK-DAG: ld.w [[R1:\$w[0-9]+]], 0($5)
40   %2 = load <4 x i32>* %b
41   ; CHECK-DAG: ld.w [[R2:\$w[0-9]+]], 0($6)
42   %3 = and <4 x i32> %1, %2
43   ; CHECK-DAG: and.v [[R3:\$w[0-9]+]], [[R1]], [[R2]]
44   store <4 x i32> %3, <4 x i32>* %c
45   ; CHECK-DAG: st.w [[R3]], 0($4)
46
47   ret void
48   ; CHECK: .size and_v4i32
49 }
50
51 define void @and_v2i64(<2 x i64>* %c, <2 x i64>* %a, <2 x i64>* %b) nounwind {
52   ; CHECK: and_v2i64:
53
54   %1 = load <2 x i64>* %a
55   ; CHECK-DAG: ld.d [[R1:\$w[0-9]+]], 0($5)
56   %2 = load <2 x i64>* %b
57   ; CHECK-DAG: ld.d [[R2:\$w[0-9]+]], 0($6)
58   %3 = and <2 x i64> %1, %2
59   ; CHECK-DAG: and.v [[R3:\$w[0-9]+]], [[R1]], [[R2]]
60   store <2 x i64> %3, <2 x i64>* %c
61   ; CHECK-DAG: st.d [[R3]], 0($4)
62
63   ret void
64   ; CHECK: .size and_v2i64
65 }
66
67 define void @and_v16i8_i(<16 x i8>* %c, <16 x i8>* %a) nounwind {
68   ; CHECK: and_v16i8_i:
69
70   %1 = load <16 x i8>* %a
71   ; CHECK-DAG: ld.b [[R1:\$w[0-9]+]], 0($5)
72   %2 = and <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>
73   ; CHECK-DAG: andi.b [[R4:\$w[0-9]+]], [[R1]], 1
74   store <16 x i8> %2, <16 x i8>* %c
75   ; CHECK-DAG: st.b [[R4]], 0($4)
76
77   ret void
78   ; CHECK: .size and_v16i8_i
79 }
80
81 define void @and_v8i16_i(<8 x i16>* %c, <8 x i16>* %a) nounwind {
82   ; CHECK: and_v8i16_i:
83
84   %1 = load <8 x i16>* %a
85   ; CHECK-DAG: ld.h [[R1:\$w[0-9]+]], 0($5)
86   %2 = and <8 x i16> %1, <i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1>
87   ; CHECK-DAG: ldi.h [[R3:\$w[0-9]+]], 1
88   ; CHECK-DAG: and.v [[R4:\$w[0-9]+]], [[R1]], [[R3]]
89   store <8 x i16> %2, <8 x i16>* %c
90   ; CHECK-DAG: st.h [[R4]], 0($4)
91
92   ret void
93   ; CHECK: .size and_v8i16_i
94 }
95
96 define void @and_v4i32_i(<4 x i32>* %c, <4 x i32>* %a) nounwind {
97   ; CHECK: and_v4i32_i:
98
99   %1 = load <4 x i32>* %a
100   ; CHECK-DAG: ld.w [[R1:\$w[0-9]+]], 0($5)
101   %2 = and <4 x i32> %1, <i32 1, i32 1, i32 1, i32 1>
102   ; CHECK-DAG: ldi.w [[R3:\$w[0-9]+]], 1
103   ; CHECK-DAG: and.v [[R4:\$w[0-9]+]], [[R1]], [[R3]]
104   store <4 x i32> %2, <4 x i32>* %c
105   ; CHECK-DAG: st.w [[R4]], 0($4)
106
107   ret void
108   ; CHECK: .size and_v4i32_i
109 }
110
111 define void @and_v2i64_i(<2 x i64>* %c, <2 x i64>* %a) nounwind {
112   ; CHECK: and_v2i64_i:
113
114   %1 = load <2 x i64>* %a
115   ; CHECK-DAG: ld.d [[R1:\$w[0-9]+]], 0($5)
116   %2 = and <2 x i64> %1, <i64 1, i64 1>
117   ; CHECK-DAG: ldi.d [[R3:\$w[0-9]+]], 1
118   ; CHECK-DAG: and.v [[R4:\$w[0-9]+]], [[R1]], [[R3]]
119   store <2 x i64> %2, <2 x i64>* %c
120   ; CHECK-DAG: st.d [[R4]], 0($4)
121
122   ret void
123   ; CHECK: .size and_v2i64_i
124 }
125
126 define void @or_v16i8(<16 x i8>* %c, <16 x i8>* %a, <16 x i8>* %b) nounwind {
127   ; CHECK: or_v16i8:
128
129   %1 = load <16 x i8>* %a
130   ; CHECK-DAG: ld.b [[R1:\$w[0-9]+]], 0($5)
131   %2 = load <16 x i8>* %b
132   ; CHECK-DAG: ld.b [[R2:\$w[0-9]+]], 0($6)
133   %3 = or <16 x i8> %1, %2
134   ; CHECK-DAG: or.v [[R3:\$w[0-9]+]], [[R1]], [[R2]]
135   store <16 x i8> %3, <16 x i8>* %c
136   ; CHECK-DAG: st.b [[R3]], 0($4)
137
138   ret void
139   ; CHECK: .size or_v16i8
140 }
141
142 define void @or_v8i16(<8 x i16>* %c, <8 x i16>* %a, <8 x i16>* %b) nounwind {
143   ; CHECK: or_v8i16:
144
145   %1 = load <8 x i16>* %a
146   ; CHECK-DAG: ld.h [[R1:\$w[0-9]+]], 0($5)
147   %2 = load <8 x i16>* %b
148   ; CHECK-DAG: ld.h [[R2:\$w[0-9]+]], 0($6)
149   %3 = or <8 x i16> %1, %2
150   ; CHECK-DAG: or.v [[R3:\$w[0-9]+]], [[R1]], [[R2]]
151   store <8 x i16> %3, <8 x i16>* %c
152   ; CHECK-DAG: st.h [[R3]], 0($4)
153
154   ret void
155   ; CHECK: .size or_v8i16
156 }
157
158 define void @or_v4i32(<4 x i32>* %c, <4 x i32>* %a, <4 x i32>* %b) nounwind {
159   ; CHECK: or_v4i32:
160
161   %1 = load <4 x i32>* %a
162   ; CHECK-DAG: ld.w [[R1:\$w[0-9]+]], 0($5)
163   %2 = load <4 x i32>* %b
164   ; CHECK-DAG: ld.w [[R2:\$w[0-9]+]], 0($6)
165   %3 = or <4 x i32> %1, %2
166   ; CHECK-DAG: or.v [[R3:\$w[0-9]+]], [[R1]], [[R2]]
167   store <4 x i32> %3, <4 x i32>* %c
168   ; CHECK-DAG: st.w [[R3]], 0($4)
169
170   ret void
171   ; CHECK: .size or_v4i32
172 }
173
174 define void @or_v2i64(<2 x i64>* %c, <2 x i64>* %a, <2 x i64>* %b) nounwind {
175   ; CHECK: or_v2i64:
176
177   %1 = load <2 x i64>* %a
178   ; CHECK-DAG: ld.d [[R1:\$w[0-9]+]], 0($5)
179   %2 = load <2 x i64>* %b
180   ; CHECK-DAG: ld.d [[R2:\$w[0-9]+]], 0($6)
181   %3 = or <2 x i64> %1, %2
182   ; CHECK-DAG: or.v [[R3:\$w[0-9]+]], [[R1]], [[R2]]
183   store <2 x i64> %3, <2 x i64>* %c
184   ; CHECK-DAG: st.d [[R3]], 0($4)
185
186   ret void
187   ; CHECK: .size or_v2i64
188 }
189
190 define void @or_v16i8_i(<16 x i8>* %c, <16 x i8>* %a) nounwind {
191   ; CHECK: or_v16i8_i:
192
193   %1 = load <16 x i8>* %a
194   ; CHECK-DAG: ld.b [[R1:\$w[0-9]+]], 0($5)
195   %2 = or <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>
196   ; CHECK-DAG: ori.b [[R4:\$w[0-9]+]], [[R1]], 1
197   store <16 x i8> %2, <16 x i8>* %c
198   ; CHECK-DAG: st.b [[R4]], 0($4)
199
200   ret void
201   ; CHECK: .size or_v16i8_i
202 }
203
204 define void @or_v8i16_i(<8 x i16>* %c, <8 x i16>* %a) nounwind {
205   ; CHECK: or_v8i16_i:
206
207   %1 = load <8 x i16>* %a
208   ; CHECK-DAG: ld.h [[R1:\$w[0-9]+]], 0($5)
209   %2 = or <8 x i16> %1, <i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1>
210   ; CHECK-DAG: ldi.h [[R3:\$w[0-9]+]], 1
211   ; CHECK-DAG: or.v [[R4:\$w[0-9]+]], [[R1]], [[R3]]
212   store <8 x i16> %2, <8 x i16>* %c
213   ; CHECK-DAG: st.h [[R4]], 0($4)
214
215   ret void
216   ; CHECK: .size or_v8i16_i
217 }
218
219 define void @or_v4i32_i(<4 x i32>* %c, <4 x i32>* %a) nounwind {
220   ; CHECK: or_v4i32_i:
221
222   %1 = load <4 x i32>* %a
223   ; CHECK-DAG: ld.w [[R1:\$w[0-9]+]], 0($5)
224   %2 = or <4 x i32> %1, <i32 1, i32 1, i32 1, i32 1>
225   ; CHECK-DAG: ldi.w [[R3:\$w[0-9]+]], 1
226   ; CHECK-DAG: or.v [[R4:\$w[0-9]+]], [[R1]], [[R3]]
227   store <4 x i32> %2, <4 x i32>* %c
228   ; CHECK-DAG: st.w [[R4]], 0($4)
229
230   ret void
231   ; CHECK: .size or_v4i32_i
232 }
233
234 define void @or_v2i64_i(<2 x i64>* %c, <2 x i64>* %a) nounwind {
235   ; CHECK: or_v2i64_i:
236
237   %1 = load <2 x i64>* %a
238   ; CHECK-DAG: ld.d [[R1:\$w[0-9]+]], 0($5)
239   %2 = or <2 x i64> %1, <i64 1, i64 1>
240   ; CHECK-DAG: ldi.d [[R3:\$w[0-9]+]], 1
241   ; CHECK-DAG: or.v [[R4:\$w[0-9]+]], [[R1]], [[R3]]
242   store <2 x i64> %2, <2 x i64>* %c
243   ; CHECK-DAG: st.d [[R4]], 0($4)
244
245   ret void
246   ; CHECK: .size or_v2i64_i
247 }
248
249 define void @nor_v16i8(<16 x i8>* %c, <16 x i8>* %a, <16 x i8>* %b) nounwind {
250   ; CHECK: nor_v16i8:
251
252   %1 = load <16 x i8>* %a
253   ; CHECK-DAG: ld.b [[R1:\$w[0-9]+]], 0($5)
254   %2 = load <16 x i8>* %b
255   ; CHECK-DAG: ld.b [[R2:\$w[0-9]+]], 0($6)
256   %3 = or <16 x i8> %1, %2
257   %4 = xor <16 x i8> %3, <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>
258   ; CHECK-DAG: nor.v [[R3:\$w[0-9]+]], [[R1]], [[R2]]
259   store <16 x i8> %4, <16 x i8>* %c
260   ; CHECK-DAG: st.b [[R3]], 0($4)
261
262   ret void
263   ; CHECK: .size nor_v16i8
264 }
265
266 define void @nor_v8i16(<8 x i16>* %c, <8 x i16>* %a, <8 x i16>* %b) nounwind {
267   ; CHECK: nor_v8i16:
268
269   %1 = load <8 x i16>* %a
270   ; CHECK-DAG: ld.h [[R1:\$w[0-9]+]], 0($5)
271   %2 = load <8 x i16>* %b
272   ; CHECK-DAG: ld.h [[R2:\$w[0-9]+]], 0($6)
273   %3 = or <8 x i16> %1, %2
274   %4 = xor <8 x i16> %3, <i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1>
275   ; CHECK-DAG: nor.v [[R3:\$w[0-9]+]], [[R1]], [[R2]]
276   store <8 x i16> %4, <8 x i16>* %c
277   ; CHECK-DAG: st.h [[R3]], 0($4)
278
279   ret void
280   ; CHECK: .size nor_v8i16
281 }
282
283 define void @nor_v4i32(<4 x i32>* %c, <4 x i32>* %a, <4 x i32>* %b) nounwind {
284   ; CHECK: nor_v4i32:
285
286   %1 = load <4 x i32>* %a
287   ; CHECK-DAG: ld.w [[R1:\$w[0-9]+]], 0($5)
288   %2 = load <4 x i32>* %b
289   ; CHECK-DAG: ld.w [[R2:\$w[0-9]+]], 0($6)
290   %3 = or <4 x i32> %1, %2
291   %4 = xor <4 x i32> %3, <i32 -1, i32 -1, i32 -1, i32 -1>
292   ; CHECK-DAG: nor.v [[R3:\$w[0-9]+]], [[R1]], [[R2]]
293   store <4 x i32> %4, <4 x i32>* %c
294   ; CHECK-DAG: st.w [[R3]], 0($4)
295
296   ret void
297   ; CHECK: .size nor_v4i32
298 }
299
300 define void @nor_v2i64(<2 x i64>* %c, <2 x i64>* %a, <2 x i64>* %b) nounwind {
301   ; CHECK: nor_v2i64:
302
303   %1 = load <2 x i64>* %a
304   ; CHECK-DAG: ld.d [[R1:\$w[0-9]+]], 0($5)
305   %2 = load <2 x i64>* %b
306   ; CHECK-DAG: ld.d [[R2:\$w[0-9]+]], 0($6)
307   %3 = or <2 x i64> %1, %2
308   %4 = xor <2 x i64> %3, <i64 -1, i64 -1>
309   ; CHECK-DAG: nor.v [[R3:\$w[0-9]+]], [[R1]], [[R2]]
310   store <2 x i64> %4, <2 x i64>* %c
311   ; CHECK-DAG: st.d [[R3]], 0($4)
312
313   ret void
314   ; CHECK: .size nor_v2i64
315 }
316
317 define void @nor_v16i8_i(<16 x i8>* %c, <16 x i8>* %a) nounwind {
318   ; CHECK: nor_v16i8_i:
319
320   %1 = load <16 x i8>* %a
321   ; CHECK-DAG: ld.b [[R1:\$w[0-9]+]], 0($5)
322   %2 = or <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>
323   %3 = xor <16 x i8> %2, <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>
324   ; CHECK-DAG: ori.b [[R4:\$w[0-9]+]], [[R1]], 1
325   store <16 x i8> %3, <16 x i8>* %c
326   ; CHECK-DAG: st.b [[R4]], 0($4)
327
328   ret void
329   ; CHECK: .size nor_v16i8_i
330 }
331
332 define void @nor_v8i16_i(<8 x i16>* %c, <8 x i16>* %a) nounwind {
333   ; CHECK: nor_v8i16_i:
334
335   %1 = load <8 x i16>* %a
336   ; CHECK-DAG: ld.h [[R1:\$w[0-9]+]], 0($5)
337   %2 = or <8 x i16> %1, <i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1>
338   %3 = xor <8 x i16> %2, <i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1>
339   ; CHECK-DAG: ldi.h [[R3:\$w[0-9]+]], 1
340   ; CHECK-DAG: nor.v [[R4:\$w[0-9]+]], [[R1]], [[R3]]
341   store <8 x i16> %3, <8 x i16>* %c
342   ; CHECK-DAG: st.h [[R4]], 0($4)
343
344   ret void
345   ; CHECK: .size nor_v8i16_i
346 }
347
348 define void @nor_v4i32_i(<4 x i32>* %c, <4 x i32>* %a) nounwind {
349   ; CHECK: nor_v4i32_i:
350
351   %1 = load <4 x i32>* %a
352   ; CHECK-DAG: ld.w [[R1:\$w[0-9]+]], 0($5)
353   %2 = or <4 x i32> %1, <i32 1, i32 1, i32 1, i32 1>
354   %3 = xor <4 x i32> %2, <i32 -1, i32 -1, i32 -1, i32 -1>
355   ; CHECK-DAG: ldi.w [[R3:\$w[0-9]+]], 1
356   ; CHECK-DAG: nor.v [[R4:\$w[0-9]+]], [[R1]], [[R3]]
357   store <4 x i32> %3, <4 x i32>* %c
358   ; CHECK-DAG: st.w [[R4]], 0($4)
359
360   ret void
361   ; CHECK: .size nor_v4i32_i
362 }
363
364 define void @nor_v2i64_i(<2 x i64>* %c, <2 x i64>* %a) nounwind {
365   ; CHECK: nor_v2i64_i:
366
367   %1 = load <2 x i64>* %a
368   ; CHECK-DAG: ld.d [[R1:\$w[0-9]+]], 0($5)
369   %2 = or <2 x i64> %1, <i64 1, i64 1>
370   %3 = xor <2 x i64> %2, <i64 -1, i64 -1>
371   ; CHECK-DAG: ldi.d [[R3:\$w[0-9]+]], 1
372   ; CHECK-DAG: nor.v [[R4:\$w[0-9]+]], [[R1]], [[R3]]
373   store <2 x i64> %3, <2 x i64>* %c
374   ; CHECK-DAG: st.d [[R4]], 0($4)
375
376   ret void
377   ; CHECK: .size nor_v2i64_i
378 }
379
380 define void @xor_v16i8(<16 x i8>* %c, <16 x i8>* %a, <16 x i8>* %b) nounwind {
381   ; CHECK: xor_v16i8:
382
383   %1 = load <16 x i8>* %a
384   ; CHECK-DAG: ld.b [[R1:\$w[0-9]+]], 0($5)
385   %2 = load <16 x i8>* %b
386   ; CHECK-DAG: ld.b [[R2:\$w[0-9]+]], 0($6)
387   %3 = xor <16 x i8> %1, %2
388   ; CHECK-DAG: xor.v [[R3:\$w[0-9]+]], [[R1]], [[R2]]
389   store <16 x i8> %3, <16 x i8>* %c
390   ; CHECK-DAG: st.b [[R3]], 0($4)
391
392   ret void
393   ; CHECK: .size xor_v16i8
394 }
395
396 define void @xor_v8i16(<8 x i16>* %c, <8 x i16>* %a, <8 x i16>* %b) nounwind {
397   ; CHECK: xor_v8i16:
398
399   %1 = load <8 x i16>* %a
400   ; CHECK-DAG: ld.h [[R1:\$w[0-9]+]], 0($5)
401   %2 = load <8 x i16>* %b
402   ; CHECK-DAG: ld.h [[R2:\$w[0-9]+]], 0($6)
403   %3 = xor <8 x i16> %1, %2
404   ; CHECK-DAG: xor.v [[R3:\$w[0-9]+]], [[R1]], [[R2]]
405   store <8 x i16> %3, <8 x i16>* %c
406   ; CHECK-DAG: st.h [[R3]], 0($4)
407
408   ret void
409   ; CHECK: .size xor_v8i16
410 }
411
412 define void @xor_v4i32(<4 x i32>* %c, <4 x i32>* %a, <4 x i32>* %b) nounwind {
413   ; CHECK: xor_v4i32:
414
415   %1 = load <4 x i32>* %a
416   ; CHECK-DAG: ld.w [[R1:\$w[0-9]+]], 0($5)
417   %2 = load <4 x i32>* %b
418   ; CHECK-DAG: ld.w [[R2:\$w[0-9]+]], 0($6)
419   %3 = xor <4 x i32> %1, %2
420   ; CHECK-DAG: xor.v [[R3:\$w[0-9]+]], [[R1]], [[R2]]
421   store <4 x i32> %3, <4 x i32>* %c
422   ; CHECK-DAG: st.w [[R3]], 0($4)
423
424   ret void
425   ; CHECK: .size xor_v4i32
426 }
427
428 define void @xor_v2i64(<2 x i64>* %c, <2 x i64>* %a, <2 x i64>* %b) nounwind {
429   ; CHECK: xor_v2i64:
430
431   %1 = load <2 x i64>* %a
432   ; CHECK-DAG: ld.d [[R1:\$w[0-9]+]], 0($5)
433   %2 = load <2 x i64>* %b
434   ; CHECK-DAG: ld.d [[R2:\$w[0-9]+]], 0($6)
435   %3 = xor <2 x i64> %1, %2
436   ; CHECK-DAG: xor.v [[R3:\$w[0-9]+]], [[R1]], [[R2]]
437   store <2 x i64> %3, <2 x i64>* %c
438   ; CHECK-DAG: st.d [[R3]], 0($4)
439
440   ret void
441   ; CHECK: .size xor_v2i64
442 }
443
444 define void @xor_v16i8_i(<16 x i8>* %c, <16 x i8>* %a) nounwind {
445   ; CHECK: xor_v16i8_i:
446
447   %1 = load <16 x i8>* %a
448   ; CHECK-DAG: ld.b [[R1:\$w[0-9]+]], 0($5)
449   %2 = xor <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>
450   ; CHECK-DAG: xori.b [[R4:\$w[0-9]+]], [[R1]], 1
451   store <16 x i8> %2, <16 x i8>* %c
452   ; CHECK-DAG: st.b [[R4]], 0($4)
453
454   ret void
455   ; CHECK: .size xor_v16i8_i
456 }
457
458 define void @xor_v8i16_i(<8 x i16>* %c, <8 x i16>* %a) nounwind {
459   ; CHECK: xor_v8i16_i:
460
461   %1 = load <8 x i16>* %a
462   ; CHECK-DAG: ld.h [[R1:\$w[0-9]+]], 0($5)
463   %2 = xor <8 x i16> %1, <i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1>
464   ; CHECK-DAG: ldi.h [[R3:\$w[0-9]+]], 1
465   ; CHECK-DAG: xor.v [[R4:\$w[0-9]+]], [[R1]], [[R3]]
466   store <8 x i16> %2, <8 x i16>* %c
467   ; CHECK-DAG: st.h [[R4]], 0($4)
468
469   ret void
470   ; CHECK: .size xor_v8i16_i
471 }
472
473 define void @xor_v4i32_i(<4 x i32>* %c, <4 x i32>* %a) nounwind {
474   ; CHECK: xor_v4i32_i:
475
476   %1 = load <4 x i32>* %a
477   ; CHECK-DAG: ld.w [[R1:\$w[0-9]+]], 0($5)
478   %2 = xor <4 x i32> %1, <i32 1, i32 1, i32 1, i32 1>
479   ; CHECK-DAG: ldi.w [[R3:\$w[0-9]+]], 1
480   ; CHECK-DAG: xor.v [[R4:\$w[0-9]+]], [[R1]], [[R3]]
481   store <4 x i32> %2, <4 x i32>* %c
482   ; CHECK-DAG: st.w [[R4]], 0($4)
483
484   ret void
485   ; CHECK: .size xor_v4i32_i
486 }
487
488 define void @xor_v2i64_i(<2 x i64>* %c, <2 x i64>* %a) nounwind {
489   ; CHECK: xor_v2i64_i:
490
491   %1 = load <2 x i64>* %a
492   ; CHECK-DAG: ld.d [[R1:\$w[0-9]+]], 0($5)
493   %2 = xor <2 x i64> %1, <i64 1, i64 1>
494   ; CHECK-DAG: ldi.d [[R3:\$w[0-9]+]], 1
495   ; CHECK-DAG: xor.v [[R4:\$w[0-9]+]], [[R1]], [[R3]]
496   store <2 x i64> %2, <2 x i64>* %c
497   ; CHECK-DAG: st.d [[R4]], 0($4)
498
499   ret void
500   ; CHECK: .size xor_v2i64_i
501 }
502
503 define void @sll_v16i8(<16 x i8>* %c, <16 x i8>* %a, <16 x i8>* %b) nounwind {
504   ; CHECK: sll_v16i8:
505
506   %1 = load <16 x i8>* %a
507   ; CHECK-DAG: ld.b [[R1:\$w[0-9]+]], 0($5)
508   %2 = load <16 x i8>* %b
509   ; CHECK-DAG: ld.b [[R2:\$w[0-9]+]], 0($6)
510   %3 = shl <16 x i8> %1, %2
511   ; CHECK-DAG: sll.b [[R3:\$w[0-9]+]], [[R1]], [[R2]]
512   store <16 x i8> %3, <16 x i8>* %c
513   ; CHECK-DAG: st.b [[R3]], 0($4)
514
515   ret void
516   ; CHECK: .size sll_v16i8
517 }
518
519 define void @sll_v8i16(<8 x i16>* %c, <8 x i16>* %a, <8 x i16>* %b) nounwind {
520   ; CHECK: sll_v8i16:
521
522   %1 = load <8 x i16>* %a
523   ; CHECK-DAG: ld.h [[R1:\$w[0-9]+]], 0($5)
524   %2 = load <8 x i16>* %b
525   ; CHECK-DAG: ld.h [[R2:\$w[0-9]+]], 0($6)
526   %3 = shl <8 x i16> %1, %2
527   ; CHECK-DAG: sll.h [[R3:\$w[0-9]+]], [[R1]], [[R2]]
528   store <8 x i16> %3, <8 x i16>* %c
529   ; CHECK-DAG: st.h [[R3]], 0($4)
530
531   ret void
532   ; CHECK: .size sll_v8i16
533 }
534
535 define void @sll_v4i32(<4 x i32>* %c, <4 x i32>* %a, <4 x i32>* %b) nounwind {
536   ; CHECK: sll_v4i32:
537
538   %1 = load <4 x i32>* %a
539   ; CHECK-DAG: ld.w [[R1:\$w[0-9]+]], 0($5)
540   %2 = load <4 x i32>* %b
541   ; CHECK-DAG: ld.w [[R2:\$w[0-9]+]], 0($6)
542   %3 = shl <4 x i32> %1, %2
543   ; CHECK-DAG: sll.w [[R3:\$w[0-9]+]], [[R1]], [[R2]]
544   store <4 x i32> %3, <4 x i32>* %c
545   ; CHECK-DAG: st.w [[R3]], 0($4)
546
547   ret void
548   ; CHECK: .size sll_v4i32
549 }
550
551 define void @sll_v2i64(<2 x i64>* %c, <2 x i64>* %a, <2 x i64>* %b) nounwind {
552   ; CHECK: sll_v2i64:
553
554   %1 = load <2 x i64>* %a
555   ; CHECK-DAG: ld.d [[R1:\$w[0-9]+]], 0($5)
556   %2 = load <2 x i64>* %b
557   ; CHECK-DAG: ld.d [[R2:\$w[0-9]+]], 0($6)
558   %3 = shl <2 x i64> %1, %2
559   ; CHECK-DAG: sll.d [[R3:\$w[0-9]+]], [[R1]], [[R2]]
560   store <2 x i64> %3, <2 x i64>* %c
561   ; CHECK-DAG: st.d [[R3]], 0($4)
562
563   ret void
564   ; CHECK: .size sll_v2i64
565 }
566
567 define void @sll_v16i8_i(<16 x i8>* %c, <16 x i8>* %a) nounwind {
568   ; CHECK: sll_v16i8_i:
569
570   %1 = load <16 x i8>* %a
571   ; CHECK-DAG: ld.b [[R1:\$w[0-9]+]], 0($5)
572   %2 = shl <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>
573   ; CHECK-DAG: slli.b [[R4:\$w[0-9]+]], [[R1]], 1
574   store <16 x i8> %2, <16 x i8>* %c
575   ; CHECK-DAG: st.b [[R4]], 0($4)
576
577   ret void
578   ; CHECK: .size sll_v16i8_i
579 }
580
581 define void @sll_v8i16_i(<8 x i16>* %c, <8 x i16>* %a) nounwind {
582   ; CHECK: sll_v8i16_i:
583
584   %1 = load <8 x i16>* %a
585   ; CHECK-DAG: ld.h [[R1:\$w[0-9]+]], 0($5)
586   %2 = shl <8 x i16> %1, <i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1>
587   ; CHECK-DAG: slli.h [[R4:\$w[0-9]+]], [[R1]], 1
588   store <8 x i16> %2, <8 x i16>* %c
589   ; CHECK-DAG: st.h [[R4]], 0($4)
590
591   ret void
592   ; CHECK: .size sll_v8i16_i
593 }
594
595 define void @sll_v4i32_i(<4 x i32>* %c, <4 x i32>* %a) nounwind {
596   ; CHECK: sll_v4i32_i:
597
598   %1 = load <4 x i32>* %a
599   ; CHECK-DAG: ld.w [[R1:\$w[0-9]+]], 0($5)
600   %2 = shl <4 x i32> %1, <i32 1, i32 1, i32 1, i32 1>
601   ; CHECK-DAG: slli.w [[R4:\$w[0-9]+]], [[R1]], 1
602   store <4 x i32> %2, <4 x i32>* %c
603   ; CHECK-DAG: st.w [[R4]], 0($4)
604
605   ret void
606   ; CHECK: .size sll_v4i32_i
607 }
608
609 define void @sll_v2i64_i(<2 x i64>* %c, <2 x i64>* %a) nounwind {
610   ; CHECK: sll_v2i64_i:
611
612   %1 = load <2 x i64>* %a
613   ; CHECK-DAG: ld.d [[R1:\$w[0-9]+]], 0($5)
614   %2 = shl <2 x i64> %1, <i64 1, i64 1>
615   ; CHECK-DAG: slli.d [[R4:\$w[0-9]+]], [[R1]], 1
616   store <2 x i64> %2, <2 x i64>* %c
617   ; CHECK-DAG: st.d [[R4]], 0($4)
618
619   ret void
620   ; CHECK: .size sll_v2i64_i
621 }
622
623 define void @sra_v16i8(<16 x i8>* %c, <16 x i8>* %a, <16 x i8>* %b) nounwind {
624   ; CHECK: sra_v16i8:
625
626   %1 = load <16 x i8>* %a
627   ; CHECK-DAG: ld.b [[R1:\$w[0-9]+]], 0($5)
628   %2 = load <16 x i8>* %b
629   ; CHECK-DAG: ld.b [[R2:\$w[0-9]+]], 0($6)
630   %3 = ashr <16 x i8> %1, %2
631   ; CHECK-DAG: sra.b [[R3:\$w[0-9]+]], [[R1]], [[R2]]
632   store <16 x i8> %3, <16 x i8>* %c
633   ; CHECK-DAG: st.b [[R3]], 0($4)
634
635   ret void
636   ; CHECK: .size sra_v16i8
637 }
638
639 define void @sra_v8i16(<8 x i16>* %c, <8 x i16>* %a, <8 x i16>* %b) nounwind {
640   ; CHECK: sra_v8i16:
641
642   %1 = load <8 x i16>* %a
643   ; CHECK-DAG: ld.h [[R1:\$w[0-9]+]], 0($5)
644   %2 = load <8 x i16>* %b
645   ; CHECK-DAG: ld.h [[R2:\$w[0-9]+]], 0($6)
646   %3 = ashr <8 x i16> %1, %2
647   ; CHECK-DAG: sra.h [[R3:\$w[0-9]+]], [[R1]], [[R2]]
648   store <8 x i16> %3, <8 x i16>* %c
649   ; CHECK-DAG: st.h [[R3]], 0($4)
650
651   ret void
652   ; CHECK: .size sra_v8i16
653 }
654
655 define void @sra_v4i32(<4 x i32>* %c, <4 x i32>* %a, <4 x i32>* %b) nounwind {
656   ; CHECK: sra_v4i32:
657
658   %1 = load <4 x i32>* %a
659   ; CHECK-DAG: ld.w [[R1:\$w[0-9]+]], 0($5)
660   %2 = load <4 x i32>* %b
661   ; CHECK-DAG: ld.w [[R2:\$w[0-9]+]], 0($6)
662   %3 = ashr <4 x i32> %1, %2
663   ; CHECK-DAG: sra.w [[R3:\$w[0-9]+]], [[R1]], [[R2]]
664   store <4 x i32> %3, <4 x i32>* %c
665   ; CHECK-DAG: st.w [[R3]], 0($4)
666
667   ret void
668   ; CHECK: .size sra_v4i32
669 }
670
671 define void @sra_v2i64(<2 x i64>* %c, <2 x i64>* %a, <2 x i64>* %b) nounwind {
672   ; CHECK: sra_v2i64:
673
674   %1 = load <2 x i64>* %a
675   ; CHECK-DAG: ld.d [[R1:\$w[0-9]+]], 0($5)
676   %2 = load <2 x i64>* %b
677   ; CHECK-DAG: ld.d [[R2:\$w[0-9]+]], 0($6)
678   %3 = ashr <2 x i64> %1, %2
679   ; CHECK-DAG: sra.d [[R3:\$w[0-9]+]], [[R1]], [[R2]]
680   store <2 x i64> %3, <2 x i64>* %c
681   ; CHECK-DAG: st.d [[R3]], 0($4)
682
683   ret void
684   ; CHECK: .size sra_v2i64
685 }
686
687 define void @sra_v16i8_i(<16 x i8>* %c, <16 x i8>* %a) nounwind {
688   ; CHECK: sra_v16i8_i:
689
690   %1 = load <16 x i8>* %a
691   ; CHECK-DAG: ld.b [[R1:\$w[0-9]+]], 0($5)
692   %2 = ashr <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>
693   ; CHECK-DAG: srai.b [[R4:\$w[0-9]+]], [[R1]], 1
694   store <16 x i8> %2, <16 x i8>* %c
695   ; CHECK-DAG: st.b [[R4]], 0($4)
696
697   ret void
698   ; CHECK: .size sra_v16i8_i
699 }
700
701 define void @sra_v8i16_i(<8 x i16>* %c, <8 x i16>* %a) nounwind {
702   ; CHECK: sra_v8i16_i:
703
704   %1 = load <8 x i16>* %a
705   ; CHECK-DAG: ld.h [[R1:\$w[0-9]+]], 0($5)
706   %2 = ashr <8 x i16> %1, <i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1>
707   ; CHECK-DAG: srai.h [[R4:\$w[0-9]+]], [[R1]], 1
708   store <8 x i16> %2, <8 x i16>* %c
709   ; CHECK-DAG: st.h [[R4]], 0($4)
710
711   ret void
712   ; CHECK: .size sra_v8i16_i
713 }
714
715 define void @sra_v4i32_i(<4 x i32>* %c, <4 x i32>* %a) nounwind {
716   ; CHECK: sra_v4i32_i:
717
718   %1 = load <4 x i32>* %a
719   ; CHECK-DAG: ld.w [[R1:\$w[0-9]+]], 0($5)
720   %2 = ashr <4 x i32> %1, <i32 1, i32 1, i32 1, i32 1>
721   ; CHECK-DAG: srai.w [[R4:\$w[0-9]+]], [[R1]], 1
722   store <4 x i32> %2, <4 x i32>* %c
723   ; CHECK-DAG: st.w [[R4]], 0($4)
724
725   ret void
726   ; CHECK: .size sra_v4i32_i
727 }
728
729 define void @sra_v2i64_i(<2 x i64>* %c, <2 x i64>* %a) nounwind {
730   ; CHECK: sra_v2i64_i:
731
732   %1 = load <2 x i64>* %a
733   ; CHECK-DAG: ld.d [[R1:\$w[0-9]+]], 0($5)
734   %2 = ashr <2 x i64> %1, <i64 1, i64 1>
735   ; CHECK-DAG: srai.d [[R4:\$w[0-9]+]], [[R1]], 1
736   store <2 x i64> %2, <2 x i64>* %c
737   ; CHECK-DAG: st.d [[R4]], 0($4)
738
739   ret void
740   ; CHECK: .size sra_v2i64_i
741 }
742
743 define void @srl_v16i8(<16 x i8>* %c, <16 x i8>* %a, <16 x i8>* %b) nounwind {
744   ; CHECK: srl_v16i8:
745
746   %1 = load <16 x i8>* %a
747   ; CHECK-DAG: ld.b [[R1:\$w[0-9]+]], 0($5)
748   %2 = load <16 x i8>* %b
749   ; CHECK-DAG: ld.b [[R2:\$w[0-9]+]], 0($6)
750   %3 = lshr <16 x i8> %1, %2
751   ; CHECK-DAG: srl.b [[R3:\$w[0-9]+]], [[R1]], [[R2]]
752   store <16 x i8> %3, <16 x i8>* %c
753   ; CHECK-DAG: st.b [[R3]], 0($4)
754
755   ret void
756   ; CHECK: .size srl_v16i8
757 }
758
759 define void @srl_v8i16(<8 x i16>* %c, <8 x i16>* %a, <8 x i16>* %b) nounwind {
760   ; CHECK: srl_v8i16:
761
762   %1 = load <8 x i16>* %a
763   ; CHECK-DAG: ld.h [[R1:\$w[0-9]+]], 0($5)
764   %2 = load <8 x i16>* %b
765   ; CHECK-DAG: ld.h [[R2:\$w[0-9]+]], 0($6)
766   %3 = lshr <8 x i16> %1, %2
767   ; CHECK-DAG: srl.h [[R3:\$w[0-9]+]], [[R1]], [[R2]]
768   store <8 x i16> %3, <8 x i16>* %c
769   ; CHECK-DAG: st.h [[R3]], 0($4)
770
771   ret void
772   ; CHECK: .size srl_v8i16
773 }
774
775 define void @srl_v4i32(<4 x i32>* %c, <4 x i32>* %a, <4 x i32>* %b) nounwind {
776   ; CHECK: srl_v4i32:
777
778   %1 = load <4 x i32>* %a
779   ; CHECK-DAG: ld.w [[R1:\$w[0-9]+]], 0($5)
780   %2 = load <4 x i32>* %b
781   ; CHECK-DAG: ld.w [[R2:\$w[0-9]+]], 0($6)
782   %3 = lshr <4 x i32> %1, %2
783   ; CHECK-DAG: srl.w [[R3:\$w[0-9]+]], [[R1]], [[R2]]
784   store <4 x i32> %3, <4 x i32>* %c
785   ; CHECK-DAG: st.w [[R3]], 0($4)
786
787   ret void
788   ; CHECK: .size srl_v4i32
789 }
790
791 define void @srl_v2i64(<2 x i64>* %c, <2 x i64>* %a, <2 x i64>* %b) nounwind {
792   ; CHECK: srl_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 = lshr <2 x i64> %1, %2
799   ; CHECK-DAG: srl.d [[R3:\$w[0-9]+]], [[R1]], [[R2]]
800   store <2 x i64> %3, <2 x i64>* %c
801   ; CHECK-DAG: st.d [[R3]], 0($4)
802
803   ret void
804   ; CHECK: .size srl_v2i64
805 }
806
807 define void @srl_v16i8_i(<16 x i8>* %c, <16 x i8>* %a) nounwind {
808   ; CHECK: srl_v16i8_i:
809
810   %1 = load <16 x i8>* %a
811   ; CHECK-DAG: ld.b [[R1:\$w[0-9]+]], 0($5)
812   %2 = lshr <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>
813   ; CHECK-DAG: srli.b [[R4:\$w[0-9]+]], [[R1]], 1
814   store <16 x i8> %2, <16 x i8>* %c
815   ; CHECK-DAG: st.b [[R4]], 0($4)
816
817   ret void
818   ; CHECK: .size srl_v16i8_i
819 }
820
821 define void @srl_v8i16_i(<8 x i16>* %c, <8 x i16>* %a) nounwind {
822   ; CHECK: srl_v8i16_i:
823
824   %1 = load <8 x i16>* %a
825   ; CHECK-DAG: ld.h [[R1:\$w[0-9]+]], 0($5)
826   %2 = lshr <8 x i16> %1, <i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1>
827   ; CHECK-DAG: srli.h [[R4:\$w[0-9]+]], [[R1]], 1
828   store <8 x i16> %2, <8 x i16>* %c
829   ; CHECK-DAG: st.h [[R4]], 0($4)
830
831   ret void
832   ; CHECK: .size srl_v8i16_i
833 }
834
835 define void @srl_v4i32_i(<4 x i32>* %c, <4 x i32>* %a) nounwind {
836   ; CHECK: srl_v4i32_i:
837
838   %1 = load <4 x i32>* %a
839   ; CHECK-DAG: ld.w [[R1:\$w[0-9]+]], 0($5)
840   %2 = lshr <4 x i32> %1, <i32 1, i32 1, i32 1, i32 1>
841   ; CHECK-DAG: srli.w [[R4:\$w[0-9]+]], [[R1]], 1
842   store <4 x i32> %2, <4 x i32>* %c
843   ; CHECK-DAG: st.w [[R4]], 0($4)
844
845   ret void
846   ; CHECK: .size srl_v4i32_i
847 }
848
849 define void @srl_v2i64_i(<2 x i64>* %c, <2 x i64>* %a) nounwind {
850   ; CHECK: srl_v2i64_i:
851
852   %1 = load <2 x i64>* %a
853   ; CHECK-DAG: ld.d [[R1:\$w[0-9]+]], 0($5)
854   %2 = lshr <2 x i64> %1, <i64 1, i64 1>
855   ; CHECK-DAG: srli.d [[R4:\$w[0-9]+]], [[R1]], 1
856   store <2 x i64> %2, <2 x i64>* %c
857   ; CHECK-DAG: st.d [[R4]], 0($4)
858
859   ret void
860   ; CHECK: .size srl_v2i64_i
861 }
862
863 define void @ctpop_v16i8(<16 x i8>* %c, <16 x i8>* %a) nounwind {
864   ; CHECK: ctpop_v16i8:
865
866   %1 = load <16 x i8>* %a
867   ; CHECK-DAG: ld.b [[R1:\$w[0-9]+]], 0($5)
868   %2 = tail call <16 x i8> @llvm.ctpop.v16i8 (<16 x i8> %1)
869   ; CHECK-DAG: pcnt.b [[R3:\$w[0-9]+]], [[R1]]
870   store <16 x i8> %2, <16 x i8>* %c
871   ; CHECK-DAG: st.b [[R3]], 0($4)
872
873   ret void
874   ; CHECK: .size ctpop_v16i8
875 }
876
877 define void @ctpop_v8i16(<8 x i16>* %c, <8 x i16>* %a) nounwind {
878   ; CHECK: ctpop_v8i16:
879
880   %1 = load <8 x i16>* %a
881   ; CHECK-DAG: ld.h [[R1:\$w[0-9]+]], 0($5)
882   %2 = tail call <8 x i16> @llvm.ctpop.v8i16 (<8 x i16> %1)
883   ; CHECK-DAG: pcnt.h [[R3:\$w[0-9]+]], [[R1]]
884   store <8 x i16> %2, <8 x i16>* %c
885   ; CHECK-DAG: st.h [[R3]], 0($4)
886
887   ret void
888   ; CHECK: .size ctpop_v8i16
889 }
890
891 define void @ctpop_v4i32(<4 x i32>* %c, <4 x i32>* %a) nounwind {
892   ; CHECK: ctpop_v4i32:
893
894   %1 = load <4 x i32>* %a
895   ; CHECK-DAG: ld.w [[R1:\$w[0-9]+]], 0($5)
896   %2 = tail call <4 x i32> @llvm.ctpop.v4i32 (<4 x i32> %1)
897   ; CHECK-DAG: pcnt.w [[R3:\$w[0-9]+]], [[R1]]
898   store <4 x i32> %2, <4 x i32>* %c
899   ; CHECK-DAG: st.w [[R3]], 0($4)
900
901   ret void
902   ; CHECK: .size ctpop_v4i32
903 }
904
905 define void @ctpop_v2i64(<2 x i64>* %c, <2 x i64>* %a) nounwind {
906   ; CHECK: ctpop_v2i64:
907
908   %1 = load <2 x i64>* %a
909   ; CHECK-DAG: ld.d [[R1:\$w[0-9]+]], 0($5)
910   %2 = tail call <2 x i64> @llvm.ctpop.v2i64 (<2 x i64> %1)
911   ; CHECK-DAG: pcnt.d [[R3:\$w[0-9]+]], [[R1]]
912   store <2 x i64> %2, <2 x i64>* %c
913   ; CHECK-DAG: st.d [[R3]], 0($4)
914
915   ret void
916   ; CHECK: .size ctpop_v2i64
917 }
918
919 define void @ctlz_v16i8(<16 x i8>* %c, <16 x i8>* %a) nounwind {
920   ; CHECK: ctlz_v16i8:
921
922   %1 = load <16 x i8>* %a
923   ; CHECK-DAG: ld.b [[R1:\$w[0-9]+]], 0($5)
924   %2 = tail call <16 x i8> @llvm.ctlz.v16i8 (<16 x i8> %1)
925   ; CHECK-DAG: nlzc.b [[R3:\$w[0-9]+]], [[R1]]
926   store <16 x i8> %2, <16 x i8>* %c
927   ; CHECK-DAG: st.b [[R3]], 0($4)
928
929   ret void
930   ; CHECK: .size ctlz_v16i8
931 }
932
933 define void @ctlz_v8i16(<8 x i16>* %c, <8 x i16>* %a) nounwind {
934   ; CHECK: ctlz_v8i16:
935
936   %1 = load <8 x i16>* %a
937   ; CHECK-DAG: ld.h [[R1:\$w[0-9]+]], 0($5)
938   %2 = tail call <8 x i16> @llvm.ctlz.v8i16 (<8 x i16> %1)
939   ; CHECK-DAG: nlzc.h [[R3:\$w[0-9]+]], [[R1]]
940   store <8 x i16> %2, <8 x i16>* %c
941   ; CHECK-DAG: st.h [[R3]], 0($4)
942
943   ret void
944   ; CHECK: .size ctlz_v8i16
945 }
946
947 define void @ctlz_v4i32(<4 x i32>* %c, <4 x i32>* %a) nounwind {
948   ; CHECK: ctlz_v4i32:
949
950   %1 = load <4 x i32>* %a
951   ; CHECK-DAG: ld.w [[R1:\$w[0-9]+]], 0($5)
952   %2 = tail call <4 x i32> @llvm.ctlz.v4i32 (<4 x i32> %1)
953   ; CHECK-DAG: nlzc.w [[R3:\$w[0-9]+]], [[R1]]
954   store <4 x i32> %2, <4 x i32>* %c
955   ; CHECK-DAG: st.w [[R3]], 0($4)
956
957   ret void
958   ; CHECK: .size ctlz_v4i32
959 }
960
961 define void @ctlz_v2i64(<2 x i64>* %c, <2 x i64>* %a) nounwind {
962   ; CHECK: ctlz_v2i64:
963
964   %1 = load <2 x i64>* %a
965   ; CHECK-DAG: ld.d [[R1:\$w[0-9]+]], 0($5)
966   %2 = tail call <2 x i64> @llvm.ctlz.v2i64 (<2 x i64> %1)
967   ; CHECK-DAG: nlzc.d [[R3:\$w[0-9]+]], [[R1]]
968   store <2 x i64> %2, <2 x i64>* %c
969   ; CHECK-DAG: st.d [[R3]], 0($4)
970
971   ret void
972   ; CHECK: .size ctlz_v2i64
973 }
974
975 define void @bsel_v16i8(<16 x i8>* %c, <16 x i8>* %a, <16 x i8>* %b, <16 x i8>* %m) nounwind {
976   ; CHECK: bsel_v16i8:
977
978   %1 = load <16 x i8>* %a
979   ; CHECK-DAG: ld.b [[R1:\$w[0-9]+]], 0($5)
980   %2 = load <16 x i8>* %b
981   ; CHECK-DAG: ld.b [[R2:\$w[0-9]+]], 0($6)
982   %3 = load <16 x i8>* %m
983   ; CHECK-DAG: ld.b [[R3:\$w[0-9]+]], 0($7)
984   %4 = xor <16 x i8> %3, <i8 -1, i8 -1, i8 -1, i8 -1,
985                           i8 -1, i8 -1, i8 -1, i8 -1,
986                           i8 -1, i8 -1, i8 -1, i8 -1,
987                           i8 -1, i8 -1, i8 -1, i8 -1>
988   %5 = and <16 x i8> %1, %3
989   %6 = and <16 x i8> %2, %4
990   %7 = or <16 x i8> %5, %6
991   ; bmnz is the same operation
992   ; CHECK-DAG: bmnz.v [[R1]], [[R2]], [[R3]]
993   store <16 x i8> %7, <16 x i8>* %c
994   ; CHECK-DAG: st.b [[R1]], 0($4)
995
996   ret void
997   ; CHECK: .size bsel_v16i8
998 }
999
1000 define void @bsel_v16i8_i(<16 x i8>* %c, <16 x i8>* %a, <16 x i8>* %m) nounwind {
1001   ; CHECK: bsel_v16i8_i:
1002
1003   %1 = load <16 x i8>* %a
1004   ; CHECK-DAG: ld.b [[R1:\$w[0-9]+]], 0($5)
1005   %2 = load <16 x i8>* %m
1006   ; CHECK-DAG: ld.b [[R3:\$w[0-9]+]], 0($6)
1007   %3 = xor <16 x i8> %2, <i8 -1, i8 -1, i8 -1, i8 -1,
1008                           i8 -1, i8 -1, i8 -1, i8 -1,
1009                           i8 -1, i8 -1, i8 -1, i8 -1,
1010                           i8 -1, i8 -1, i8 -1, i8 -1>
1011   %4 = and <16 x i8> %1, %3
1012   %5 = and <16 x i8> <i8 6, i8 6, i8 6, i8 6,
1013                       i8 6, i8 6, i8 6, i8 6,
1014                       i8 6, i8 6, i8 6, i8 6,
1015                       i8 6, i8 6, i8 6, i8 6>, %2
1016   %6 = or <16 x i8> %4, %5
1017   ; CHECK-DAG: bseli.b [[R3]], [[R1]], 6
1018   store <16 x i8> %6, <16 x i8>* %c
1019   ; CHECK-DAG: st.b [[R3]], 0($4)
1020
1021   ret void
1022   ; CHECK: .size bsel_v16i8_i
1023 }
1024
1025 define void @bsel_v8i16(<8 x i16>* %c, <8 x i16>* %a, <8 x i16>* %b) nounwind {
1026   ; CHECK: bsel_v8i16:
1027
1028   %1 = load <8 x i16>* %a
1029   ; CHECK-DAG: ld.h [[R1:\$w[0-9]+]], 0($5)
1030   %2 = load <8 x i16>* %b
1031   ; CHECK-DAG: ld.h [[R2:\$w[0-9]+]], 0($6)
1032   %3 = and <8 x i16> %1, <i16 6, i16 6, i16 6, i16 6,
1033                           i16 6, i16 6, i16 6, i16 6>
1034   %4 = and <8 x i16> %2, <i16 65529, i16 65529, i16 65529, i16 65529,
1035                           i16 65529, i16 65529, i16 65529, i16 65529>
1036   %5 = or <8 x i16> %3, %4
1037   ; CHECK-DAG: ldi.h [[R3:\$w[0-9]+]], 6
1038   ; CHECK-DAG: bsel.v [[R3]], [[R2]], [[R1]]
1039   store <8 x i16> %5, <8 x i16>* %c
1040   ; CHECK-DAG: st.h [[R3]], 0($4)
1041
1042   ret void
1043   ; CHECK: .size bsel_v8i16
1044 }
1045
1046 define void @bsel_v4i32(<4 x i32>* %c, <4 x i32>* %a, <4 x i32>* %b) nounwind {
1047   ; CHECK: bsel_v4i32:
1048
1049   %1 = load <4 x i32>* %a
1050   ; CHECK-DAG: ld.w [[R1:\$w[0-9]+]], 0($5)
1051   %2 = load <4 x i32>* %b
1052   ; CHECK-DAG: ld.w [[R2:\$w[0-9]+]], 0($6)
1053   %3 = and <4 x i32> %1, <i32 6, i32 6, i32 6, i32 6>
1054   %4 = and <4 x i32> %2, <i32 4294967289, i32 4294967289, i32 4294967289, i32 4294967289>
1055   %5 = or <4 x i32> %3, %4
1056   ; CHECK-DAG: ldi.w [[R3:\$w[0-9]+]], 6
1057   ; CHECK-DAG: bsel.v [[R3]], [[R2]], [[R1]]
1058   store <4 x i32> %5, <4 x i32>* %c
1059   ; CHECK-DAG: st.w [[R3]], 0($4)
1060
1061   ret void
1062   ; CHECK: .size bsel_v4i32
1063 }
1064
1065 define void @bsel_v2i64(<2 x i64>* %c, <2 x i64>* %a, <2 x i64>* %b) nounwind {
1066   ; CHECK: bsel_v2i64:
1067
1068   %1 = load <2 x i64>* %a
1069   ; CHECK-DAG: ld.d [[R1:\$w[0-9]+]], 0($5)
1070   %2 = load <2 x i64>* %b
1071   ; CHECK-DAG: ld.d [[R2:\$w[0-9]+]], 0($6)
1072   %3 = and <2 x i64> %1, <i64 6, i64 6>
1073   %4 = and <2 x i64> %2, <i64 18446744073709551609, i64 18446744073709551609>
1074   %5 = or <2 x i64> %3, %4
1075   ; CHECK-DAG: ldi.d [[R3:\$w[0-9]+]], 6
1076   ; CHECK-DAG: bsel.v [[R3]], [[R2]], [[R1]]
1077   store <2 x i64> %5, <2 x i64>* %c
1078   ; CHECK-DAG: st.d [[R3]], 0($4)
1079
1080   ret void
1081   ; CHECK: .size bsel_v2i64
1082 }
1083
1084 define void @binsl_v16i8_i(<16 x i8>* %c, <16 x i8>* %a, <16 x i8>* %b) nounwind {
1085   ; CHECK: binsl_v16i8_i:
1086
1087   %1 = load <16 x i8>* %a
1088   ; CHECK-DAG: ld.b [[R1:\$w[0-9]+]], 0($5)
1089   %2 = load <16 x i8>* %b
1090   ; CHECK-DAG: ld.b [[R2:\$w[0-9]+]], 0($6)
1091   %3 = and <16 x i8> %1, <i8 192, i8 192, i8 192, i8 192,
1092                           i8 192, i8 192, i8 192, i8 192,
1093                           i8 192, i8 192, i8 192, i8 192,
1094                           i8 192, i8 192, i8 192, i8 192>
1095   %4 = and <16 x i8> %2, <i8 63, i8 63, i8 63, i8 63,
1096                           i8 63, i8 63, i8 63, i8 63,
1097                           i8 63, i8 63, i8 63, i8 63,
1098                           i8 63, i8 63, i8 63, i8 63>
1099   %5 = or <16 x i8> %3, %4
1100   ; CHECK-DAG: binsli.b [[R2]], [[R1]], 2
1101   store <16 x i8> %5, <16 x i8>* %c
1102   ; CHECK-DAG: st.b [[R2]], 0($4)
1103
1104   ret void
1105   ; CHECK: .size binsl_v16i8_i
1106 }
1107
1108 define void @binsl_v8i16_i(<8 x i16>* %c, <8 x i16>* %a, <8 x i16>* %b) nounwind {
1109   ; CHECK: binsl_v8i16_i:
1110
1111   %1 = load <8 x i16>* %a
1112   ; CHECK-DAG: ld.h [[R1:\$w[0-9]+]], 0($5)
1113   %2 = load <8 x i16>* %b
1114   ; CHECK-DAG: ld.h [[R2:\$w[0-9]+]], 0($6)
1115   %3 = and <8 x i16> %1, <i16 49152, i16 49152, i16 49152, i16 49152,
1116                           i16 49152, i16 49152, i16 49152, i16 49152>
1117   %4 = and <8 x i16> %2, <i16 16383, i16 16383, i16 16383, i16 16383,
1118                           i16 16383, i16 16383, i16 16383, i16 16383>
1119   %5 = or <8 x i16> %3, %4
1120   ; CHECK-DAG: binsli.h [[R2]], [[R1]], 2
1121   store <8 x i16> %5, <8 x i16>* %c
1122   ; CHECK-DAG: st.h [[R2]], 0($4)
1123
1124   ret void
1125   ; CHECK: .size binsl_v8i16_i
1126 }
1127
1128 define void @binsl_v4i32_i(<4 x i32>* %c, <4 x i32>* %a, <4 x i32>* %b) nounwind {
1129   ; CHECK: binsl_v4i32_i:
1130
1131   %1 = load <4 x i32>* %a
1132   ; CHECK-DAG: ld.w [[R1:\$w[0-9]+]], 0($5)
1133   %2 = load <4 x i32>* %b
1134   ; CHECK-DAG: ld.w [[R2:\$w[0-9]+]], 0($6)
1135   %3 = and <4 x i32> %1, <i32 3221225472, i32 3221225472, i32 3221225472, i32 3221225472>
1136   %4 = and <4 x i32> %2, <i32 1073741823, i32 1073741823, i32 1073741823, i32 1073741823>
1137   %5 = or <4 x i32> %3, %4
1138   ; CHECK-DAG: binsli.w [[R2]], [[R1]], 2
1139   store <4 x i32> %5, <4 x i32>* %c
1140   ; CHECK-DAG: st.w [[R2]], 0($4)
1141
1142   ret void
1143   ; CHECK: .size binsl_v4i32_i
1144 }
1145
1146 define void @binsl_v2i64_i(<2 x i64>* %c, <2 x i64>* %a, <2 x i64>* %b) nounwind {
1147   ; CHECK: binsl_v2i64_i:
1148
1149   %1 = load <2 x i64>* %a
1150   ; CHECK-DAG: ld.d [[R1:\$w[0-9]+]], 0($5)
1151   %2 = load <2 x i64>* %b
1152   ; CHECK-DAG: ld.d [[R2:\$w[0-9]+]], 0($6)
1153   %3 = and <2 x i64> %1, <i64 18446744073709551608, i64 18446744073709551608>
1154   %4 = and <2 x i64> %2, <i64 7, i64 7>
1155   %5 = or <2 x i64> %3, %4
1156   ; TODO: We use a particularly wide mask here to work around a legalization
1157   ;       issue. If the mask doesn't fit within a 10-bit immediate, it gets
1158   ;       legalized into a constant pool. We should add a test to cover the
1159   ;       other cases once they correctly select binsli.d.
1160   ; CHECK-DAG: binsli.d [[R2]], [[R1]], 61
1161   store <2 x i64> %5, <2 x i64>* %c
1162   ; CHECK-DAG: st.d [[R2]], 0($4)
1163
1164   ret void
1165   ; CHECK: .size binsl_v2i64_i
1166 }
1167
1168 define void @binsr_v16i8_i(<16 x i8>* %c, <16 x i8>* %a, <16 x i8>* %b) nounwind {
1169   ; CHECK: binsr_v16i8_i:
1170
1171   %1 = load <16 x i8>* %a
1172   ; CHECK-DAG: ld.b [[R1:\$w[0-9]+]], 0($5)
1173   %2 = load <16 x i8>* %b
1174   ; CHECK-DAG: ld.b [[R2:\$w[0-9]+]], 0($6)
1175   %3 = and <16 x i8> %1, <i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3,
1176                           i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3>
1177   %4 = and <16 x i8> %2, <i8 252, i8 252, i8 252, i8 252,
1178                           i8 252, i8 252, i8 252, i8 252,
1179                           i8 252, i8 252, i8 252, i8 252,
1180                           i8 252, i8 252, i8 252, i8 252>
1181   %5 = or <16 x i8> %3, %4
1182   ; CHECK-DAG: binsri.b [[R2]], [[R1]], 2
1183   store <16 x i8> %5, <16 x i8>* %c
1184   ; CHECK-DAG: st.b [[R2]], 0($4)
1185
1186   ret void
1187   ; CHECK: .size binsr_v16i8_i
1188 }
1189
1190 define void @binsr_v8i16_i(<8 x i16>* %c, <8 x i16>* %a, <8 x i16>* %b) nounwind {
1191   ; CHECK: binsr_v8i16_i:
1192
1193   %1 = load <8 x i16>* %a
1194   ; CHECK-DAG: ld.h [[R1:\$w[0-9]+]], 0($5)
1195   %2 = load <8 x i16>* %b
1196   ; CHECK-DAG: ld.h [[R2:\$w[0-9]+]], 0($6)
1197   %3 = and <8 x i16> %1, <i16 3, i16 3, i16 3, i16 3,
1198                           i16 3, i16 3, i16 3, i16 3>
1199   %4 = and <8 x i16> %2, <i16 65532, i16 65532, i16 65532, i16 65532,
1200                           i16 65532, i16 65532, i16 65532, i16 65532>
1201   %5 = or <8 x i16> %3, %4
1202   ; CHECK-DAG: binsri.h [[R2]], [[R1]], 2
1203   store <8 x i16> %5, <8 x i16>* %c
1204   ; CHECK-DAG: st.h [[R2]], 0($4)
1205
1206   ret void
1207   ; CHECK: .size binsr_v8i16_i
1208 }
1209
1210 define void @binsr_v4i32_i(<4 x i32>* %c, <4 x i32>* %a, <4 x i32>* %b) nounwind {
1211   ; CHECK: binsr_v4i32_i:
1212
1213   %1 = load <4 x i32>* %a
1214   ; CHECK-DAG: ld.w [[R1:\$w[0-9]+]], 0($5)
1215   %2 = load <4 x i32>* %b
1216   ; CHECK-DAG: ld.w [[R2:\$w[0-9]+]], 0($6)
1217   %3 = and <4 x i32> %1, <i32 3, i32 3, i32 3, i32 3>
1218   %4 = and <4 x i32> %2, <i32 4294967292, i32 4294967292, i32 4294967292, i32 4294967292>
1219   %5 = or <4 x i32> %3, %4
1220   ; CHECK-DAG: binsri.w [[R2]], [[R1]], 2
1221   store <4 x i32> %5, <4 x i32>* %c
1222   ; CHECK-DAG: st.w [[R2]], 0($4)
1223
1224   ret void
1225   ; CHECK: .size binsr_v4i32_i
1226 }
1227
1228 define void @binsr_v2i64_i(<2 x i64>* %c, <2 x i64>* %a, <2 x i64>* %b) nounwind {
1229   ; CHECK: binsr_v2i64_i:
1230
1231   %1 = load <2 x i64>* %a
1232   ; CHECK-DAG: ld.d [[R1:\$w[0-9]+]], 0($5)
1233   %2 = load <2 x i64>* %b
1234   ; CHECK-DAG: ld.d [[R2:\$w[0-9]+]], 0($6)
1235   %3 = and <2 x i64> %1, <i64 3, i64 3>
1236   %4 = and <2 x i64> %2, <i64 18446744073709551612, i64 18446744073709551612>
1237   %5 = or <2 x i64> %3, %4
1238   ; CHECK-DAG: binsri.d [[R2]], [[R1]], 2
1239   store <2 x i64> %5, <2 x i64>* %c
1240   ; CHECK-DAG: st.d [[R2]], 0($4)
1241
1242   ret void
1243   ; CHECK: .size binsr_v2i64_i
1244 }
1245
1246 declare <16 x i8> @llvm.ctpop.v16i8(<16 x i8> %val)
1247 declare <8 x i16> @llvm.ctpop.v8i16(<8 x i16> %val)
1248 declare <4 x i32> @llvm.ctpop.v4i32(<4 x i32> %val)
1249 declare <2 x i64> @llvm.ctpop.v2i64(<2 x i64> %val)
1250 declare <16 x i8> @llvm.ctlz.v16i8(<16 x i8> %val)
1251 declare <8 x i16> @llvm.ctlz.v8i16(<8 x i16> %val)
1252 declare <4 x i32> @llvm.ctlz.v4i32(<4 x i32> %val)
1253 declare <2 x i64> @llvm.ctlz.v2i64(<2 x i64> %val)