• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1; RUN: llc -march=mips -mattr=+msa,+fp64 -relocation-model=pic < %s | FileCheck %s -check-prefixes=CHECK,MSA32
2; RUN: llc -march=mips64 -mattr=+msa,+fp64 -relocation-model=pic -target-abi n32 < %s \
3; RUN:      | FileCheck %s -check-prefixes=CHECK,MSA64,MSA64N32
4; RUN: llc -march=mips64 -mattr=+msa,+fp64 -relocation-model=pic -target-abi n64 < %s \
5; RUN:      | FileCheck %s -check-prefixes=CHECK,MSA64,MSA64N64
6
7; Test that the immediate intrinsics don't crash LLVM.
8
9; Some of the intrinsics lower to equivalent forms.
10
11define void @addvi_b(<16 x i8> * %ptr) {
12entry:
13; CHECK-LABEL: addvi_b:
14; CHECK: addvi.b
15  %a = load <16 x i8>, <16 x i8> * %ptr, align 16
16  %r = call <16 x i8> @llvm.mips.addvi.b(<16 x i8> %a, i32 25)
17  store <16 x i8> %r, <16 x i8> * %ptr, align 16
18  ret void
19}
20
21define void @andi_b(<16 x i8> * %ptr) {
22entry:
23; CHECK-LABEL: andi_b:
24; CHECK: andi.b
25  %a = load <16 x i8>, <16 x i8> * %ptr, align 16
26  %r = call <16 x i8> @llvm.mips.andi.b(<16 x i8> %a, i32 25)
27  store <16 x i8> %r, <16 x i8> * %ptr, align 16
28  ret void
29}
30
31define void @bclri_b(<16 x i8> * %ptr) {
32entry:
33; CHECK-LABEL: bclri_b:
34; CHECK: andi.b
35  %a = load <16 x i8>, <16 x i8> * %ptr, align 16
36  %r = call <16 x i8> @llvm.mips.bclri.b(<16 x i8> %a, i32 3)
37  store <16 x i8> %r, <16 x i8> * %ptr, align 16
38  ret void
39}
40
41define void @binsli_b(<16 x i8> * %ptr, <16 x i8> * %ptr2) {
42entry:
43; CHECK-LABEL: binsli_b:
44; CHECK: binsli.b
45  %a = load <16 x i8>, <16 x i8> * %ptr, align 16
46  %b = load <16 x i8>, <16 x i8> * %ptr2, align 16
47  %r = call <16 x i8> @llvm.mips.binsli.b(<16 x i8> %a, <16 x i8> %b, i32 3)
48  store <16 x i8> %r, <16 x i8> * %ptr, align 16
49  ret void
50}
51
52define void @binsri_b(<16 x i8> * %ptr, <16 x i8> * %ptr2) {
53entry:
54; CHECK-LABEL: binsri_b:
55; CHECK: binsri.b
56  %a = load <16 x i8>, <16 x i8> * %ptr, align 16
57  %b = load <16 x i8>, <16 x i8> * %ptr2, align 16
58  %r = call <16 x i8> @llvm.mips.binsri.b(<16 x i8> %a, <16 x i8> %b, i32 5)
59  store <16 x i8> %r, <16 x i8> * %ptr, align 16
60  ret void
61}
62
63define void @bmnzi_b(<16 x i8> * %ptr, <16 x i8> * %ptr2) {
64entry:
65; CHECK-LABEL: bmnzi_b:
66; CHECK: bmnzi.b
67  %a = load <16 x i8>, <16 x i8> * %ptr, align 16
68  %b = load <16 x i8>, <16 x i8> * %ptr2, align 16
69  %r = call <16 x i8> @llvm.mips.bmnzi.b(<16 x i8> %a, <16 x i8> %b, i32 25)
70  store <16 x i8> %r, <16 x i8> * %ptr, align 16
71  ret void
72}
73
74define void @bmzi_b(<16 x i8> * %ptr, <16 x i8> * %ptr2) {
75entry:
76; CHECK-LABEL: bmzi_b:
77; CHECK: bmnzi.b
78  %a = load <16 x i8>, <16 x i8> * %ptr, align 16
79  %b = load <16 x i8>, <16 x i8> * %ptr2, align 16
80  %r = call <16 x i8> @llvm.mips.bmzi.b(<16 x i8> %a, <16 x i8> %b, i32 25)
81  store <16 x i8> %r, <16 x i8> * %ptr, align 16
82  ret void
83}
84
85define void @bnegi_b(<16 x i8> * %ptr) {
86entry:
87; CHECK-LABEL: bnegi_b:
88; CHECK: bnegi.b
89  %a = load <16 x i8>, <16 x i8> * %ptr, align 16
90  %r = call <16 x i8> @llvm.mips.bnegi.b(<16 x i8> %a, i32 6)
91  store <16 x i8> %r, <16 x i8> * %ptr, align 16
92  ret void
93}
94
95define void @bseli_b(<16 x i8> * %ptr) {
96entry:
97; CHECK-LABEL: bseli_b:
98; CHECK: bseli.b
99  %a = load <16 x i8>, <16 x i8> * %ptr, align 16
100  %r = call <16 x i8> @llvm.mips.bseli.b(<16 x i8> %a, <16 x i8> %a, i32 25)
101  store <16 x i8> %r, <16 x i8> * %ptr, align 16
102  ret void
103}
104
105define void @bseti_b(<16 x i8> * %ptr) {
106entry:
107; CHECK-LABEL: bseti_b:
108; CHECK: bseti.b
109  %a = load <16 x i8>, <16 x i8> * %ptr, align 16
110  %r = call <16 x i8> @llvm.mips.bseti.b(<16 x i8> %a, i32 5)
111  store <16 x i8> %r, <16 x i8> * %ptr, align 16
112  ret void
113}
114
115define void @clei_s_b(<16 x i8> * %ptr) {
116entry:
117; CHECK-LABEL: clei_s_b:
118; CHECK: clei_s.b
119  %a = load <16 x i8>, <16 x i8> * %ptr, align 16
120  %r = call <16 x i8> @llvm.mips.clei.s.b(<16 x i8> %a, i32 12)
121  store <16 x i8> %r, <16 x i8> * %ptr, align 16
122  ret void
123}
124
125define void @clei_u_b(<16 x i8> * %ptr) {
126entry:
127; CHECK-LABEL: clei_u_b:
128; CHECK: clei_u.b
129  %a = load <16 x i8>, <16 x i8> * %ptr, align 16
130  %r = call <16 x i8> @llvm.mips.clei.u.b(<16 x i8> %a, i32 25)
131  store <16 x i8> %r, <16 x i8> * %ptr, align 16
132  ret void
133}
134
135define void @clti_s_b(<16 x i8> * %ptr) {
136entry:
137; CHECK-LABEL: clti_s_b:
138; CHECK: clti_s.b
139  %a = load <16 x i8>, <16 x i8> * %ptr, align 16
140  %r = call <16 x i8> @llvm.mips.clti.s.b(<16 x i8> %a, i32 15)
141  store <16 x i8> %r, <16 x i8> * %ptr, align 16
142  ret void
143}
144
145define void @clti_u_b(<16 x i8> * %ptr) {
146entry:
147; CHECK-LABEL: clti_u_b:
148; CHECK: clti_u.b
149  %a = load <16 x i8>, <16 x i8> * %ptr, align 16
150  %r = call <16 x i8> @llvm.mips.clti.u.b(<16 x i8> %a, i32 25)
151  store <16 x i8> %r, <16 x i8> * %ptr, align 16
152  ret void
153}
154
155define void @ldi_b(<16 x i8> * %ptr) {
156entry:
157; CHECK-LABEL: ldi_b:
158; CHECK: ldi.b
159  %r = call <16 x i8> @llvm.mips.ldi.b(i32 3)
160  store <16 x i8> %r, <16 x i8> * %ptr, align 16
161  ret void
162}
163
164define void @maxi_s_b(<16 x i8> * %ptr) {
165entry:
166; CHECK-LABEL: maxi_s_b:
167; CHECK: maxi_s.b
168  %a = load <16 x i8>, <16 x i8> * %ptr, align 16
169  %r = call <16 x i8> @llvm.mips.maxi.s.b(<16 x i8> %a, i32 2)
170  store <16 x i8> %r, <16 x i8> * %ptr, align 16
171  ret void
172}
173
174define void @maxi_u_b(<16 x i8> * %ptr) {
175entry:
176; CHECK-LABEL: maxi_u_b:
177; CHECK: maxi_u.b
178  %a = load <16 x i8>, <16 x i8> * %ptr, align 16
179  %r = call <16 x i8> @llvm.mips.maxi.u.b(<16 x i8> %a, i32 2)
180  store <16 x i8> %r, <16 x i8> * %ptr, align 16
181  ret void
182}
183
184define void @mini_s_b(<16 x i8> * %ptr) {
185entry:
186; CHECK-LABEL: mini_s_b:
187; CHECK: mini_s.b
188  %a = load <16 x i8>, <16 x i8> * %ptr, align 16
189  %r = call <16 x i8> @llvm.mips.mini.s.b(<16 x i8> %a, i32 2)
190  store <16 x i8> %r, <16 x i8> * %ptr, align 16
191  ret void
192}
193
194define void @mini_u_b(<16 x i8> * %ptr) {
195entry:
196; CHECK-LABEL: mini_u_b:
197; CHECK: mini_u.b
198  %a = load <16 x i8>, <16 x i8> * %ptr, align 16
199  %r = call <16 x i8> @llvm.mips.mini.u.b(<16 x i8> %a, i32 2)
200  store <16 x i8> %r, <16 x i8> * %ptr, align 16
201  ret void
202}
203
204define void @nori_b(<16 x i8> * %ptr) {
205entry:
206; CHECK-LABEL: nori_b:
207; CHECK: nori.b
208  %a = load <16 x i8>, <16 x i8> * %ptr, align 16
209  %r = call <16 x i8> @llvm.mips.nori.b(<16 x i8> %a, i32 25)
210  store <16 x i8> %r, <16 x i8> * %ptr, align 16
211  ret void
212}
213
214define void @ori_b(<16 x i8> * %ptr) {
215entry:
216; CHECK-LABEL: ori_b:
217; CHECK: ori.b
218  %a = load <16 x i8>, <16 x i8> * %ptr, align 16
219  %r = call <16 x i8> @llvm.mips.ori.b(<16 x i8> %a, i32 25)
220  store <16 x i8> %r, <16 x i8> * %ptr, align 16
221  ret void
222}
223
224define void @sldi_b(<16 x i8> * %ptr) {
225entry:
226; CHECK-LABEL: sldi_b:
227; CHECK: sldi.b
228  %a = load <16 x i8>, <16 x i8> * %ptr, align 16
229  %r = call <16 x i8> @llvm.mips.sldi.b(<16 x i8> %a, <16 x i8> %a, i32 7)
230  store <16 x i8> %r, <16 x i8> * %ptr, align 16
231  ret void
232}
233
234define void @slli_b(<16 x i8> * %ptr) {
235entry:
236; CHECK-LABEL: slli_b:
237; CHECK: slli.b
238  %a = load <16 x i8>, <16 x i8> * %ptr, align 16
239  %r = call <16 x i8> @llvm.mips.slli.b(<16 x i8> %a, i32 3)
240  store <16 x i8> %r, <16 x i8> * %ptr, align 16
241  ret void
242}
243
244define void @splati_b(<16 x i8> * %ptr) {
245entry:
246; CHECK-LABEL: splati_b:
247; CHECK: splati.b
248  %a = load <16 x i8>, <16 x i8> * %ptr, align 16
249  %r = call <16 x i8> @llvm.mips.splati.b(<16 x i8> %a, i32 3)
250  store <16 x i8> %r, <16 x i8> * %ptr, align 16
251  ret void
252}
253
254define void @srai_b(<16 x i8> * %ptr) {
255entry:
256; CHECK-LABEL: srai_b:
257; CHECK: srai.b
258  %a = load <16 x i8>, <16 x i8> * %ptr, align 16
259  %r = call <16 x i8> @llvm.mips.srai.b(<16 x i8> %a, i32 3)
260  store <16 x i8> %r, <16 x i8> * %ptr, align 16
261  ret void
262}
263
264define void @srari_b(<16 x i8> * %ptr) {
265entry:
266; CHECK-LABEL: srari_b:
267; CHECK: srari.b
268  %a = load <16 x i8>, <16 x i8> * %ptr, align 16
269  %r = call <16 x i8> @llvm.mips.srari.b(<16 x i8> %a, i32 3)
270  store <16 x i8> %r, <16 x i8> * %ptr, align 16
271  ret void
272}
273
274define void @srli_b(<16 x i8> * %ptr) {
275entry:
276; CHECK-LABEL: srli_b:
277; CHECK: srli.b
278  %a = load <16 x i8>, <16 x i8> * %ptr, align 16
279  %r = call <16 x i8> @llvm.mips.srli.b(<16 x i8> %a, i32 3)
280  store <16 x i8> %r, <16 x i8> * %ptr, align 16
281  ret void
282}
283
284define void @srlri_b(<16 x i8> * %ptr) {
285entry:
286; CHECK-LABEL: srlri_b:
287; CHECK: srlri.b
288  %a = load <16 x i8>, <16 x i8> * %ptr, align 16
289  %r = call <16 x i8> @llvm.mips.srlri.b(<16 x i8> %a, i32 3)
290  store <16 x i8> %r, <16 x i8> * %ptr, align 16
291  ret void
292}
293
294define void @ld_b(<16 x i8> * %ptr, i8 * %ldptr, i32 %offset) {
295entry:
296; CHECK-LABEL: ld_b
297; MSA32: addu $[[R0:[0-9]]], $5, $6
298
299; MSA64N32-DAG: sll $[[R2:[0-9]]], $6, 0
300; MSA64N32-DAG: sll $[[R1:[0-9]]], $5, 0
301; MSA64N32: addu $[[R0:[0-9]]], $[[R1]], $[[R2]]
302
303; MSA64N64: sll $[[R1:[0-9]]], $6, 0
304; MSA64N64: daddu $[[R0:[0-9]]], $5, $[[R1]]
305
306; CHECK:    ld.b $w{{[0-9]+}}, 0($[[R0]])
307  %a = call <16 x i8> @llvm.mips.ld.b(i8* %ldptr, i32 %offset)
308  store <16 x i8> %a, <16 x i8> * %ptr, align 16
309  ret void
310}
311
312define void @st_b(<16 x i8> * %ptr, i8 * %ldptr, i32 %offset, i8 * %stptr) {
313entry:
314; CHECK-LABEL: st_b
315; MSA32: addu $[[R0:[0-9]]], $7, $6
316
317; MSA64N32: sll $[[R1:[0-9]]], $6, 0
318; MSA64N32: sll $[[R2:[0-9]]], $7, 0
319; MSA64N32: addu $[[R0:[0-9]]], $[[R2]], $[[R1]]
320
321; MSA64N64: sll $[[R1:[0-9]]], $6, 0
322; MSA64N64: daddu $[[R0:[0-9]]], $7, $[[R1]]
323; CHECK: st.b $w{{[0-9]+}}, 0($[[R0]])
324  %a = call <16 x i8> @llvm.mips.ld.b(i8* %ldptr, i32 0)
325  call void @llvm.mips.st.b(<16 x i8> %a, i8* %stptr, i32 %offset)
326  ret void
327}
328
329define void @addvi_w(<4 x i32> * %ptr) {
330entry:
331; CHECK-LABEL: addvi_w:
332; CHECK: addvi.w
333  %a = load <4 x i32>, <4 x i32> * %ptr, align 16
334  %r = call <4 x i32> @llvm.mips.addvi.w(<4 x i32> %a, i32 25)
335  store <4 x i32> %r, <4 x i32> * %ptr, align 16
336  ret void
337}
338
339define void @bclri_w(<4 x i32> * %ptr) {
340entry:
341; CHECK-LABEL: bclri_w:
342; CHECK: bclri.w
343  %a = load <4 x i32>, <4 x i32> * %ptr, align 16
344  %r = call <4 x i32> @llvm.mips.bclri.w(<4 x i32> %a, i32 25)
345  store <4 x i32> %r, <4 x i32> * %ptr, align 16
346  ret void
347}
348
349define void @binsli_w(<4 x i32> * %ptr, <4 x i32> * %ptr2) {
350entry:
351; CHECK-LABEL: binsli_w:
352; CHECK: binsli.w
353  %a = load <4 x i32>, <4 x i32> * %ptr, align 16
354  %b = load <4 x i32>, <4 x i32> * %ptr2, align 16
355  %r = call <4 x i32> @llvm.mips.binsli.w(<4 x i32> %a, <4 x i32> %b, i32 25)
356  store <4 x i32> %r, <4 x i32> * %ptr, align 16
357  ret void
358}
359
360define void @binsri_w(<4 x i32> * %ptr, <4 x i32> * %ptr2) {
361entry:
362; CHECK-LABEL: binsri_w:
363; CHECK: binsri.w
364  %a = load <4 x i32>, <4 x i32> * %ptr, align 16
365  %b = load <4 x i32>, <4 x i32> * %ptr2, align 16
366  %r = call <4 x i32> @llvm.mips.binsri.w(<4 x i32> %a, <4 x i32> %b, i32 25)
367  store <4 x i32> %r, <4 x i32> * %ptr, align 16
368  ret void
369}
370
371define void @bnegi_w(<4 x i32> * %ptr) {
372entry:
373; CHECK-LABEL: bnegi_w:
374; CHECK: bnegi.w
375  %a = load <4 x i32>, <4 x i32> * %ptr, align 16
376  %r = call <4 x i32> @llvm.mips.bnegi.w(<4 x i32> %a, i32 25)
377  store <4 x i32> %r, <4 x i32> * %ptr, align 16
378  ret void
379}
380
381define void @bseti_w(<4 x i32> * %ptr) {
382entry:
383; CHECK-LABEL: bseti_w:
384; CHECK: bseti.w
385  %a = load <4 x i32>, <4 x i32> * %ptr, align 16
386  %r = call <4 x i32> @llvm.mips.bseti.w(<4 x i32> %a, i32 25)
387  store <4 x i32> %r, <4 x i32> * %ptr, align 16
388  ret void
389}
390
391define void @clei_s_w(<4 x i32> * %ptr) {
392entry:
393; CHECK-LABEL: clei_s_w:
394; CHECK: clei_s.w
395  %a = load <4 x i32>, <4 x i32> * %ptr, align 16
396  %r = call <4 x i32> @llvm.mips.clei.s.w(<4 x i32> %a, i32 14)
397  store <4 x i32> %r, <4 x i32> * %ptr, align 16
398  ret void
399}
400
401define void @clei_u_w(<4 x i32> * %ptr) {
402entry:
403; CHECK-LABEL: clei_u_w:
404; CHECK: clei_u.w
405  %a = load <4 x i32>, <4 x i32> * %ptr, align 16
406  %r = call <4 x i32> @llvm.mips.clei.u.w(<4 x i32> %a, i32 25)
407  store <4 x i32> %r, <4 x i32> * %ptr, align 16
408  ret void
409}
410
411define void @clti_s_w(<4 x i32> * %ptr) {
412entry:
413; CHECK-LABEL: clti_s_w:
414; CHECK: clti_s.w
415  %a = load <4 x i32>, <4 x i32> * %ptr, align 16
416  %r = call <4 x i32> @llvm.mips.clti.s.w(<4 x i32> %a, i32 15)
417  store <4 x i32> %r, <4 x i32> * %ptr, align 16
418  ret void
419}
420
421define void @clti_u_w(<4 x i32> * %ptr) {
422entry:
423; CHECK-LABEL: clti_u_w:
424; CHECK: clti_u.w
425  %a = load <4 x i32>, <4 x i32> * %ptr, align 16
426  %r = call <4 x i32> @llvm.mips.clti.u.w(<4 x i32> %a, i32 25)
427  store <4 x i32> %r, <4 x i32> * %ptr, align 16
428  ret void
429}
430
431define void @maxi_s_w(<4 x i32> * %ptr) {
432entry:
433; CHECK-LABEL: maxi_s_w:
434; CHECK: maxi_s.w
435  %a = load <4 x i32>, <4 x i32> * %ptr, align 16
436  %r = call <4 x i32> @llvm.mips.maxi.s.w(<4 x i32> %a, i32 2)
437  store <4 x i32> %r, <4 x i32> * %ptr, align 16
438  ret void
439}
440
441define void @maxi_u_w(<4 x i32> * %ptr) {
442entry:
443; CHECK-LABEL: maxi_u_w:
444; CHECK: maxi_u.w
445  %a = load <4 x i32>, <4 x i32> * %ptr, align 16
446  %r = call <4 x i32> @llvm.mips.maxi.u.w(<4 x i32> %a, i32 2)
447  store <4 x i32> %r, <4 x i32> * %ptr, align 16
448  ret void
449}
450
451define void @mini_s_w(<4 x i32> * %ptr) {
452entry:
453; CHECK-LABEL: mini_s_w:
454; CHECK: mini_s.w
455  %a = load <4 x i32>, <4 x i32> * %ptr, align 16
456  %r = call <4 x i32> @llvm.mips.mini.s.w(<4 x i32> %a, i32 2)
457  store <4 x i32> %r, <4 x i32> * %ptr, align 16
458  ret void
459}
460
461define void @mini_u_w(<4 x i32> * %ptr) {
462entry:
463; CHECK-LABEL: mini_u_w:
464; CHECK: mini_u.w
465  %a = load <4 x i32>, <4 x i32> * %ptr, align 16
466  %r = call <4 x i32> @llvm.mips.mini.u.w(<4 x i32> %a, i32 2)
467  store <4 x i32> %r, <4 x i32> * %ptr, align 16
468  ret void
469}
470
471define void @ldi_w(<4 x i32> * %ptr) {
472entry:
473; CHECK-LABEL: ldi_w:
474; CHECK: ldi.w
475  %r = call <4 x i32> @llvm.mips.ldi.w(i32 3)
476  store <4 x i32> %r, <4 x i32> * %ptr, align 16
477  ret void
478}
479
480define void @sldi_w(<4 x i32> * %ptr) {
481entry:
482; CHECK-LABEL: sldi_w:
483; CHECK: sldi.w
484  %a = load <4 x i32>, <4 x i32> * %ptr, align 16
485  %r = call <4 x i32> @llvm.mips.sldi.w(<4 x i32> %a, <4 x i32> %a, i32 2)
486  store <4 x i32> %r, <4 x i32> * %ptr, align 16
487  ret void
488}
489
490define void @slli_w(<4 x i32> * %ptr) {
491entry:
492; CHECK-LABEL: slli_w:
493; CHECK: slli.w
494  %a = load <4 x i32>, <4 x i32> * %ptr, align 16
495  %r = call <4 x i32> @llvm.mips.slli.w(<4 x i32> %a, i32 3)
496  store <4 x i32> %r, <4 x i32> * %ptr, align 16
497  ret void
498}
499
500define void @splati_w(<4 x i32> * %ptr) {
501entry:
502; CHECK-LABEL: splati_w:
503; CHECK: splati.w
504  %a = load <4 x i32>, <4 x i32> * %ptr, align 16
505  %r = call <4 x i32> @llvm.mips.splati.w(<4 x i32> %a, i32 3)
506  store <4 x i32> %r, <4 x i32> * %ptr, align 16
507  ret void
508}
509
510define void @srai_w(<4 x i32> * %ptr) {
511entry:
512; CHECK-LABEL: srai_w:
513; CHECK: srai.w
514  %a = load <4 x i32>, <4 x i32> * %ptr, align 16
515  %r = call <4 x i32> @llvm.mips.srai.w(<4 x i32> %a, i32 3)
516  store <4 x i32> %r, <4 x i32> * %ptr, align 16
517  ret void
518}
519
520define void @srari_w(<4 x i32> * %ptr) {
521entry:
522; CHECK-LABEL: srari_w:
523; CHECK: srari.w
524  %a = load <4 x i32>, <4 x i32> * %ptr, align 16
525  %r = call <4 x i32> @llvm.mips.srari.w(<4 x i32> %a, i32 3)
526  store <4 x i32> %r, <4 x i32> * %ptr, align 16
527  ret void
528}
529
530define void @srli_w(<4 x i32> * %ptr) {
531entry:
532; CHECK-LABEL: srli_w:
533; CHECK: srli.w
534  %a = load <4 x i32>, <4 x i32> * %ptr, align 16
535  %r = call <4 x i32> @llvm.mips.srli.w(<4 x i32> %a, i32 3)
536  store <4 x i32> %r, <4 x i32> * %ptr, align 16
537  ret void
538}
539
540define void @srlri_w(<4 x i32> * %ptr) {
541entry:
542; CHECK-LABEL: srlri_w:
543; CHECK: srlri.w
544  %a = load <4 x i32>, <4 x i32> * %ptr, align 16
545  %r = call <4 x i32> @llvm.mips.srlri.w(<4 x i32> %a, i32 3)
546  store <4 x i32> %r, <4 x i32> * %ptr, align 16
547  ret void
548}
549
550define void @ld_w(<4 x i32> * %ptr, i8 * %ldptr, i32 %offset) {
551entry:
552; CHECK-LABEL: ld_w
553; MSA32: addu $[[R0:[0-9]]], $5, $6
554; MSA64N32: sll $[[R2:[0-9]]], $6, 0
555; MSA64N32: sll $[[R1:[0-9]]], $5, 0
556; MSA64N32: addu $[[R0:[0-9]]], $[[R1]], $[[R2]]
557; MSA64N64: sll $[[R1:[0-9]]], $6, 0
558; MSA64N64: daddu $[[R0:[0-9]]], $5, $[[R1]]
559; CHECK: ld.w $w{{[0-9]+}}, 0($[[R0]])
560  %a = call <4 x i32> @llvm.mips.ld.w(i8* %ldptr, i32 %offset)
561  store <4 x i32> %a, <4 x i32> * %ptr, align 16
562  ret void
563}
564
565define void @st_w(<8 x i16> * %ptr, i8 * %ldptr, i32 %offset, i8 * %stptr) {
566entry:
567; CHECK-LABEL: st_w
568; MSA32: addu $[[R0:[0-9]]], $7, $6
569
570; MSA64N32: sll $[[R1:[0-9]+]], $6, 0
571; MSA64N32: sll $[[R2:[0-9]+]], $7, 0
572; MSA64N32: addu $[[R0:[0-9]+]], $[[R2]], $[[R1]]
573
574; MSA64N64: sll $[[R1:[0-9]]], $6, 0
575; MSA64N64: daddu $[[R0:[0-9]]], $7, $[[R1]]
576; CHECK: st.w $w{{[0-9]+}}, 0($[[R0]])
577  %a = call <4 x i32> @llvm.mips.ld.w(i8* %ldptr, i32 0)
578  call void @llvm.mips.st.w(<4 x i32> %a, i8* %stptr, i32 %offset)
579  ret void
580}
581
582define void @addvi_h(<8 x i16> * %ptr) {
583entry:
584; CHECK-LABEL: addvi_h:
585; CHECK: addvi.h
586  %a = load <8 x i16>, <8 x i16> * %ptr, align 16
587  %r = call <8 x i16> @llvm.mips.addvi.h(<8 x i16> %a, i32 25)
588  store <8 x i16> %r, <8 x i16> * %ptr, align 16
589  ret void
590}
591
592define void @bclri_h(<8 x i16> * %ptr) {
593entry:
594; CHECK-LABEL: bclri_h:
595; CHECK: bclri.h
596  %a = load <8 x i16>, <8 x i16> * %ptr, align 16
597  %r = call <8 x i16> @llvm.mips.bclri.h(<8 x i16> %a, i32 8)
598  store <8 x i16> %r, <8 x i16> * %ptr, align 16
599  ret void
600}
601
602define void @binsli_h(<8 x i16> * %ptr, <8 x i16> * %ptr2) {
603entry:
604; CHECK-LABEL: binsli_h:
605; CHECK: binsli.h
606  %a = load <8 x i16>, <8 x i16> * %ptr, align 16
607  %b = load <8 x i16>, <8 x i16> * %ptr2, align 16
608  %r = call <8 x i16> @llvm.mips.binsli.h(<8 x i16> %a, <8 x i16> %b, i32 8)
609  store <8 x i16> %r, <8 x i16> * %ptr, align 16
610  ret void
611}
612
613define void @binsri_h(<8 x i16> * %ptr, <8 x i16> * %ptr2) {
614entry:
615; CHECK-LABEL: binsri_h:
616; CHECK: binsri.h
617  %a = load <8 x i16>, <8 x i16> * %ptr, align 16
618  %b = load <8 x i16>, <8 x i16> * %ptr2, align 16
619  %r = call <8 x i16> @llvm.mips.binsri.h(<8 x i16> %a, <8 x i16> %b, i32 14)
620  store <8 x i16> %r, <8 x i16> * %ptr, align 16
621  ret void
622}
623
624define void @bnegi_h(<8 x i16> * %ptr) {
625entry:
626; CHECK-LABEL: bnegi_h:
627; CHECK: bnegi.h
628  %a = load <8 x i16>, <8 x i16> * %ptr, align 16
629  %r = call <8 x i16> @llvm.mips.bnegi.h(<8 x i16> %a, i32 14)
630  store <8 x i16> %r, <8 x i16> * %ptr, align 16
631  ret void
632}
633
634define void @bseti_h(<8 x i16> * %ptr) {
635entry:
636; CHECK-LABEL: bseti_h:
637; CHECK: bseti.h
638  %a = load <8 x i16>, <8 x i16> * %ptr, align 16
639  %r = call <8 x i16> @llvm.mips.bseti.h(<8 x i16> %a, i32 15)
640  store <8 x i16> %r, <8 x i16> * %ptr, align 16
641  ret void
642}
643
644define void @clei_s_h(<8 x i16> * %ptr) {
645entry:
646; CHECK-LABEL: clei_s_h:
647; CHECK: clei_s.h
648  %a = load <8 x i16>, <8 x i16> * %ptr, align 16
649  %r = call <8 x i16> @llvm.mips.clei.s.h(<8 x i16> %a, i32 13)
650  store <8 x i16> %r, <8 x i16> * %ptr, align 16
651  ret void
652}
653
654define void @clei_u_h(<8 x i16> * %ptr) {
655entry:
656; CHECK-LABEL: clei_u_h:
657; CHECK: clei_u.h
658  %a = load <8 x i16>, <8 x i16> * %ptr, align 16
659  %r = call <8 x i16> @llvm.mips.clei.u.h(<8 x i16> %a, i32 25)
660  store <8 x i16> %r, <8 x i16> * %ptr, align 16
661  ret void
662}
663
664define void @clti_s_h(<8 x i16> * %ptr) {
665entry:
666; CHECK-LABEL: clti_s_h:
667; CHECK: clti_s.h
668  %a = load <8 x i16>, <8 x i16> * %ptr, align 16
669  %r = call <8 x i16> @llvm.mips.clti.s.h(<8 x i16> %a, i32 15)
670  store <8 x i16> %r, <8 x i16> * %ptr, align 16
671  ret void
672}
673
674define void @clti_u_h(<8 x i16> * %ptr) {
675entry:
676; CHECK-LABEL: clti_u_h:
677; CHECK: clti_u.h
678  %a = load <8 x i16>, <8 x i16> * %ptr, align 16
679  %r = call <8 x i16> @llvm.mips.clti.u.h(<8 x i16> %a, i32 25)
680  store <8 x i16> %r, <8 x i16> * %ptr, align 16
681  ret void
682}
683
684define void @maxi_s_h(<8 x i16> * %ptr) {
685entry:
686; CHECK-LABEL: maxi_s_h:
687; CHECK: maxi_s.h
688  %a = load <8 x i16>, <8 x i16> * %ptr, align 16
689  %r = call <8 x i16> @llvm.mips.maxi.s.h(<8 x i16> %a, i32 2)
690  store <8 x i16> %r, <8 x i16> * %ptr, align 16
691  ret void
692}
693
694define void @maxi_u_h(<8 x i16> * %ptr) {
695entry:
696; CHECK-LABEL: maxi_u_h:
697; CHECK: maxi_u.h
698  %a = load <8 x i16>, <8 x i16> * %ptr, align 16
699  %r = call <8 x i16> @llvm.mips.maxi.u.h(<8 x i16> %a, i32 2)
700  store <8 x i16> %r, <8 x i16> * %ptr, align 16
701  ret void
702}
703
704define void @mini_s_h(<8 x i16> * %ptr) {
705entry:
706; CHECK-LABEL: mini_s_h:
707; CHECK: mini_s.h
708  %a = load <8 x i16>, <8 x i16> * %ptr, align 16
709  %r = call <8 x i16> @llvm.mips.mini.s.h(<8 x i16> %a, i32 2)
710  store <8 x i16> %r, <8 x i16> * %ptr, align 16
711  ret void
712}
713
714define void @mini_u_h(<8 x i16> * %ptr) {
715entry:
716; CHECK-LABEL: mini_u_h:
717; CHECK: mini_u.h
718  %a = load <8 x i16>, <8 x i16> * %ptr, align 16
719  %r = call <8 x i16> @llvm.mips.mini.u.h(<8 x i16> %a, i32 2)
720  store <8 x i16> %r, <8 x i16> * %ptr, align 16
721  ret void
722}
723
724define void @ldi_h(<8 x i16> * %ptr) {
725entry:
726; CHECK-LABEL: ldi_h:
727; CHECK: ldi.h
728  %r = call <8 x i16> @llvm.mips.ldi.h(i32 3)
729  store <8 x i16> %r, <8 x i16> * %ptr, align 16
730  ret void
731}
732
733define void @sldi_h(<8 x i16> * %ptr) {
734entry:
735; CHECK-LABEL: sldi_h:
736; CHECK: sldi.h
737  %a = load <8 x i16>, <8 x i16> * %ptr, align 16
738  %r = call <8 x i16> @llvm.mips.sldi.h(<8 x i16> %a, <8 x i16> %a, i32 3)
739  store <8 x i16> %r, <8 x i16> * %ptr, align 16
740  ret void
741}
742
743define void @slli_h(<8 x i16> * %ptr) {
744entry:
745; CHECK-LABEL: slli_h:
746; CHECK: slli.h
747  %a = load <8 x i16>, <8 x i16> * %ptr, align 16
748  %r = call <8 x i16> @llvm.mips.slli.h(<8 x i16> %a, i32 3)
749  store <8 x i16> %r, <8 x i16> * %ptr, align 16
750  ret void
751}
752
753define void @splati_h(<8 x i16> * %ptr) {
754entry:
755; CHECK-LABEL: splati_h:
756; CHECK: splati.h
757  %a = load <8 x i16>, <8 x i16> * %ptr, align 16
758  %r = call <8 x i16> @llvm.mips.splati.h(<8 x i16> %a, i32 3)
759  store <8 x i16> %r, <8 x i16> * %ptr, align 16
760  ret void
761}
762
763define void @srai_h(<8 x i16> * %ptr) {
764entry:
765; CHECK-LABEL: srai_h:
766; CHECK: srai.h
767  %a = load <8 x i16>, <8 x i16> * %ptr, align 16
768  %r = call <8 x i16> @llvm.mips.srai.h(<8 x i16> %a, i32 3)
769  store <8 x i16> %r, <8 x i16> * %ptr, align 16
770  ret void
771}
772
773define void @srari_h(<8 x i16> * %ptr) {
774entry:
775; CHECK-LABEL: srari_h:
776; CHECK: srari.h
777  %a = load <8 x i16>, <8 x i16> * %ptr, align 16
778  %r = call <8 x i16> @llvm.mips.srari.h(<8 x i16> %a, i32 3)
779  store <8 x i16> %r, <8 x i16> * %ptr, align 16
780  ret void
781}
782
783define void @srli_h(<8 x i16> * %ptr) {
784entry:
785; CHECK-LABEL: srli_h:
786; CHECK: srli.h
787  %a = load <8 x i16>, <8 x i16> * %ptr, align 16
788  %r = call <8 x i16> @llvm.mips.srli.h(<8 x i16> %a, i32 3)
789  store <8 x i16> %r, <8 x i16> * %ptr, align 16
790  ret void
791}
792
793define void @srlri_h(<8 x i16> * %ptr) {
794entry:
795; CHECK-LABEL: srlri_h:
796; CHECK: srlri.h
797  %a = load <8 x i16>, <8 x i16> * %ptr, align 16
798  %r = call <8 x i16> @llvm.mips.srlri.h(<8 x i16> %a, i32 3)
799  store <8 x i16> %r, <8 x i16> * %ptr, align 16
800  ret void
801}
802
803define void @ld_h(<8 x i16> * %ptr, i8 * %ldptr, i32 %offset) {
804entry:
805; CHECK-LABEL: ld_h
806; MSA32: addu $[[R0:[0-9]]], $5, $6
807
808; MSA64N32-DAG: sll $[[R2:[0-9]]], $6, 0
809; MSA64N32-DAG: sll $[[R1:[0-9]]], $5, 0
810; MSA64N32: addu $[[R0:[0-9]]], $[[R1]], $[[R2]]
811
812; MSA64N64: sll $[[R1:[0-9]]], $6, 0
813; MSA64N64: daddu $[[R0:[0-9]]], $5, $[[R1]]
814
815; CHECK:    ld.h $w{{[0-9]+}}, 0($[[R0]])
816  %a = call <8 x i16> @llvm.mips.ld.h(i8* %ldptr, i32 %offset)
817  store <8 x i16> %a, <8 x i16> * %ptr, align 16
818  ret void
819}
820
821define void @st_h(<8 x i16> * %ptr, i8 * %ldptr, i32 %offset, i8 * %stptr) {
822entry:
823; CHECK-LABEL: st_h
824; MSA32: addu $[[R0:[0-9]]], $7, $6
825
826; MSA64N32-DAG: sll $[[R1:[0-9]+]], $6, 0
827; MSA64N32-DAG: sll $[[R2:[0-9]+]], $7, 0
828; MSA64N32: addu $[[R0:[0-9]+]], $[[R2]], $[[R1]]
829
830; MSA64N64: sll $[[R1:[0-9]]], $6, 0
831; MSA64N64: daddu $[[R0:[0-9]]], $7, $[[R1]]
832; CHECK: st.h $w{{[0-9]+}}, 0($[[R0]])
833  %a = call <8 x i16> @llvm.mips.ld.h(i8* %ldptr, i32 0)
834  call void @llvm.mips.st.h(<8 x i16> %a, i8* %stptr, i32 %offset)
835  ret void
836}
837
838define i32 @copy_s_b(<16 x i8> * %ptr) {
839entry:
840; CHECK-LABEL: copy_s_b:
841; CHECK: copy_s.b
842  %a = load <16 x i8>, <16 x i8> * %ptr, align 16
843  %r = call i32 @llvm.mips.copy.s.b(<16 x i8> %a, i32 1)
844  ret i32 %r
845}
846define i32 @copy_s_h(<8 x i16> * %ptr) {
847entry:
848; CHECK-LABEL: copy_s_h:
849; CHECK: copy_s.h
850  %a = load <8 x i16>, <8 x i16> * %ptr, align 16
851  %r = call i32 @llvm.mips.copy.s.h(<8 x i16> %a, i32 1)
852  ret i32 %r
853}
854define i32 @copy_s_w(<4 x i32> * %ptr) {
855entry:
856; CHECK-LABEL: copy_s_w:
857; CHECK: copy_s.w
858  %a = load <4 x i32>, <4 x i32> * %ptr, align 16
859  %r = call i32 @llvm.mips.copy.s.w(<4 x i32> %a, i32 1)
860  ret i32 %r
861}
862define i32 @copy_u_b(<16 x i8> * %ptr) {
863entry:
864; CHECK-LABEL: copy_u_b:
865; CHECK: copy_u.b
866  %a = load <16 x i8>, <16 x i8> * %ptr, align 16
867  %r = call i32 @llvm.mips.copy.u.b(<16 x i8> %a, i32 1)
868  ret i32 %r
869}
870define i32 @copy_u_h(<8 x i16> * %ptr) {
871entry:
872; CHECK-LABEL: copy_u_h:
873; CHECK: copy_u.h
874  %a = load <8 x i16>, <8 x i16> * %ptr, align 16
875  %r = call i32 @llvm.mips.copy.u.h(<8 x i16> %a, i32 1)
876  ret i32 %r
877}
878define i32 @copy_u_w(<4 x i32> * %ptr) {
879entry:
880; CHECK-LABEL: copy_u_w:
881; MSA32: copy_s.w
882; MSA64: copy_u.w
883  %a = load <4 x i32>, <4 x i32> * %ptr, align 16
884  %r = call i32 @llvm.mips.copy.u.w(<4 x i32> %a, i32 1)
885  ret i32 %r
886}
887
888define i64 @copy_s_d(<2 x i64> * %ptr) {
889entry:
890; CHECK-LABEL: copy_s_d:
891; MSA32: copy_s.w
892; MSA32: copy_s.w
893; MSA64: copy_s.d
894  %a = load <2 x i64>, <2 x i64> * %ptr, align 16
895  %r = call i64 @llvm.mips.copy.s.d(<2 x i64> %a, i32 1)
896  ret i64 %r
897}
898
899define i64 @copy_u_d(<2 x i64> * %ptr) {
900entry:
901; CHECK-LABEL: copy_u_d:
902; MSA32: copy_s.w
903; MSA32: copy_s.w
904; MSA64: copy_s.d
905  %a = load <2 x i64>, <2 x i64> * %ptr, align 16
906  %r = call i64 @llvm.mips.copy.u.d(<2 x i64> %a, i32 1)
907  ret i64 %r
908}
909
910define void @addvi_d(<2 x i64> * %ptr) {
911entry:
912; CHECK-LABEL: addvi_d:
913; CHECK: addvi.d
914  %a = load <2 x i64>, <2 x i64> * %ptr, align 16
915  %r = call <2 x i64> @llvm.mips.addvi.d(<2 x i64> %a, i32 25)
916  store <2 x i64> %r, <2 x i64> * %ptr, align 16
917  ret void
918}
919
920define void @bclri_d(<2 x i64> * %ptr) {
921entry:
922; CHECK-LABEL: bclri_d:
923; CHECK: bclri.d
924  %a = load <2 x i64>, <2 x i64> * %ptr, align 16
925  %r = call <2 x i64> @llvm.mips.bclri.d(<2 x i64> %a, i32 16)
926  store <2 x i64> %r, <2 x i64> * %ptr, align 16
927  ret void
928}
929
930define void @binsli_d(<2 x i64> * %ptr, <2 x i64> * %ptr2) {
931entry:
932; CHECK-LABEL: binsli_d:
933; CHECK: binsli.d
934  %a = load <2 x i64>, <2 x i64> * %ptr, align 16
935  %b = load <2 x i64>, <2 x i64> * %ptr2, align 16
936  %r = call <2 x i64> @llvm.mips.binsli.d(<2 x i64> %a, <2 x i64> %b, i32 4)
937  store <2 x i64> %r, <2 x i64> * %ptr, align 16
938  ret void
939}
940
941define void @binsri_d(<2 x i64> * %ptr, <2 x i64> * %ptr2) {
942entry:
943; CHECK-LABEL: binsri_d:
944; CHECK: binsri.d
945  %a = load <2 x i64>, <2 x i64> * %ptr, align 16
946  %b = load <2 x i64>, <2 x i64> * %ptr2, align 16
947  %r = call <2 x i64> @llvm.mips.binsri.d(<2 x i64> %a, <2 x i64> %b, i32 5)
948  store <2 x i64> %r, <2 x i64> * %ptr, align 16
949  ret void
950}
951
952define void @bnegi_d(<2 x i64> * %ptr) {
953entry:
954; CHECK-LABEL: bnegi_d:
955; CHECK: bnegi.d
956  %a = load <2 x i64>, <2 x i64> * %ptr, align 16
957  %r = call <2 x i64> @llvm.mips.bnegi.d(<2 x i64> %a, i32 9)
958  store <2 x i64> %r, <2 x i64> * %ptr, align 16
959  ret void
960}
961
962define void @bseti_d(<2 x i64> * %ptr) {
963entry:
964; CHECK-LABEL: bseti_d:
965; CHECK: bseti.d
966  %a = load <2 x i64>, <2 x i64> * %ptr, align 16
967  %r = call <2 x i64> @llvm.mips.bseti.d(<2 x i64> %a, i32 25)
968  store <2 x i64> %r, <2 x i64> * %ptr, align 16
969  ret void
970}
971
972define void @clei_s_d(<2 x i64> * %ptr) {
973entry:
974; CHECK-LABEL: clei_s_d:
975; CHECK: clei_s.d
976  %a = load <2 x i64>, <2 x i64> * %ptr, align 16
977  %r = call <2 x i64> @llvm.mips.clei.s.d(<2 x i64> %a, i32 15)
978  store <2 x i64> %r, <2 x i64> * %ptr, align 16
979  ret void
980}
981
982define void @clei_u_d(<2 x i64> * %ptr) {
983entry:
984; CHECK-LABEL: clei_u_d:
985; CHECK: clei_u.d
986  %a = load <2 x i64>, <2 x i64> * %ptr, align 16
987  %r = call <2 x i64> @llvm.mips.clei.u.d(<2 x i64> %a, i32 25)
988  store <2 x i64> %r, <2 x i64> * %ptr, align 16
989  ret void
990}
991
992define void @clti_s_d(<2 x i64> * %ptr) {
993entry:
994; CHECK-LABEL: clti_s_d:
995; CHECK: clti_s.d
996  %a = load <2 x i64>, <2 x i64> * %ptr, align 16
997  %r = call <2 x i64> @llvm.mips.clti.s.d(<2 x i64> %a, i32 15)
998  store <2 x i64> %r, <2 x i64> * %ptr, align 16
999  ret void
1000}
1001
1002define void @clti_u_d(<2 x i64> * %ptr) {
1003entry:
1004; CHECK-LABEL: clti_u_d:
1005; CHECK: clti_u.d
1006  %a = load <2 x i64>, <2 x i64> * %ptr, align 16
1007  %r = call <2 x i64> @llvm.mips.clti.u.d(<2 x i64> %a, i32 25)
1008  store <2 x i64> %r, <2 x i64> * %ptr, align 16
1009  ret void
1010}
1011
1012define void @ldi_d(<2 x i64> * %ptr) {
1013entry:
1014; CHECK-LABEL: ldi_d:
1015; CHECK: ldi.d
1016  %r = call <2 x i64> @llvm.mips.ldi.d(i32 3)
1017  store <2 x i64> %r, <2 x i64> * %ptr, align 16
1018  ret void
1019}
1020
1021define void @maxi_s_d(<2 x i64> * %ptr) {
1022entry:
1023; CHECK-LABEL: maxi_s_d:
1024; CHECK: maxi_s.d
1025  %a = load <2 x i64>, <2 x i64> * %ptr, align 16
1026  %r = call <2 x i64> @llvm.mips.maxi.s.d(<2 x i64> %a, i32 2)
1027  store <2 x i64> %r, <2 x i64> * %ptr, align 16
1028  ret void
1029}
1030
1031define void @maxi_u_d(<2 x i64> * %ptr) {
1032entry:
1033; CHECK-LABEL: maxi_u_d:
1034; CHECK: maxi_u.d
1035  %a = load <2 x i64>, <2 x i64> * %ptr, align 16
1036  %r = call <2 x i64> @llvm.mips.maxi.u.d(<2 x i64> %a, i32 2)
1037  store <2 x i64> %r, <2 x i64> * %ptr, align 16
1038  ret void
1039}
1040
1041define void @mini_s_d(<2 x i64> * %ptr) {
1042entry:
1043; CHECK-LABEL: mini_s_d:
1044; CHECK: mini_s.d
1045  %a = load <2 x i64>, <2 x i64> * %ptr, align 16
1046  %r = call <2 x i64> @llvm.mips.mini.s.d(<2 x i64> %a, i32 2)
1047  store <2 x i64> %r, <2 x i64> * %ptr, align 16
1048  ret void
1049}
1050
1051define void @mini_u_d(<2 x i64> * %ptr) {
1052entry:
1053; CHECK-LABEL: mini_u_d:
1054; CHECK: mini_u.d
1055  %a = load <2 x i64>, <2 x i64> * %ptr, align 16
1056  %r = call <2 x i64> @llvm.mips.mini.u.d(<2 x i64> %a, i32 2)
1057  store <2 x i64> %r, <2 x i64> * %ptr, align 16
1058  ret void
1059}
1060
1061define void @sldi_d(<2 x i64> * %ptr) {
1062entry:
1063; CHECK-LABEL: sldi_d:
1064; CHECK: sldi.d
1065  %a = load <2 x i64>, <2 x i64> * %ptr, align 16
1066  %r = call <2 x i64> @llvm.mips.sldi.d(<2 x i64> %a, <2 x i64> %a, i32 1)
1067  store <2 x i64> %r, <2 x i64> * %ptr, align 16
1068  ret void
1069}
1070
1071define void @slli_d(<2 x i64> * %ptr) {
1072entry:
1073; CHECK-LABEL: slli_d:
1074; CHECK: slli.d
1075  %a = load <2 x i64>, <2 x i64> * %ptr, align 16
1076  %r = call <2 x i64> @llvm.mips.slli.d(<2 x i64> %a, i32 3)
1077  store <2 x i64> %r, <2 x i64> * %ptr, align 16
1078  ret void
1079}
1080
1081define void @srai_d(<2 x i64> * %ptr) {
1082entry:
1083; CHECK-LABEL: srai_d:
1084; CHECK: srai.d
1085  %a = load <2 x i64>, <2 x i64> * %ptr, align 16
1086  %r = call <2 x i64> @llvm.mips.srai.d(<2 x i64> %a, i32 3)
1087  store <2 x i64> %r, <2 x i64> * %ptr, align 16
1088  ret void
1089}
1090
1091define void @srari_d(<2 x i64> * %ptr) {
1092entry:
1093; CHECK-LABEL: srari_d:
1094; CHECK: srari.d
1095  %a = load <2 x i64>, <2 x i64> * %ptr, align 16
1096  %r = call <2 x i64> @llvm.mips.srari.d(<2 x i64> %a, i32 3)
1097  store <2 x i64> %r, <2 x i64> * %ptr, align 16
1098  ret void
1099}
1100
1101define void @srli_d(<2 x i64> * %ptr) {
1102entry:
1103; CHECK-LABEL: srli_d:
1104; CHECK: srli.d
1105  %a = load <2 x i64>, <2 x i64> * %ptr, align 16
1106  %r = call <2 x i64> @llvm.mips.srli.d(<2 x i64> %a, i32 3)
1107  store <2 x i64> %r, <2 x i64> * %ptr, align 16
1108  ret void
1109}
1110
1111define void @srlri_d(<2 x i64> * %ptr) {
1112entry:
1113; CHECK-LABEL: srlri_d:
1114; CHECK: srlri.d
1115  %a = load <2 x i64>, <2 x i64> * %ptr, align 16
1116  %r = call <2 x i64> @llvm.mips.srlri.d(<2 x i64> %a, i32 3)
1117  store <2 x i64> %r, <2 x i64> * %ptr, align 16
1118  ret void
1119}
1120
1121define void @ld_d(<2 x i64> * %ptr, i8 * %ldptr, i32 %offset) {
1122entry:
1123; CHECK-LABEL: ld_d
1124; MSA32: addu $[[R0:[0-9]]], $5, $6
1125; MSA64N32: sll $[[R2:[0-9]]], $6, 0
1126; MSA64N32: sll $[[R1:[0-9]]], $5, 0
1127; MSA64N32: addu $[[R0:[0-9]]], $[[R1]], $[[R2]]
1128; MSA64N64: sll $[[R1:[0-9]]], $6, 0
1129; MSA64N64: daddu $[[R0:[0-9]]], $5, $[[R1]]
1130; CHECK: ld.d $w{{[0-9]+}}, 0($[[R0]])
1131  %a = call <2 x i64> @llvm.mips.ld.d(i8* %ldptr, i32 %offset)
1132  store <2 x i64> %a, <2 x i64> * %ptr, align 16
1133  ret void
1134}
1135
1136define void @ld_d2(<2 x i64> * %ptr, i8 * %ldptr) {
1137entry:
1138; CHECK-LABEL: ld_d2
1139; MSA32: addiu $[[R0:[0-9]]], $5, 4096
1140; MSA64N32: sll $[[R1:[0-9]]], $5, 0
1141; MSA64N32: addiu $[[R0:[0-9]]], $[[R1]], 4096
1142; MSA64N64: daddiu $[[R0:[0-9]]], $5, 4096
1143; CHECK: ld.d $w{{[0-9]+}}, 0($[[R0]])
1144  %a = call <2 x i64> @llvm.mips.ld.d(i8* %ldptr, i32 4096)
1145  store <2 x i64> %a, <2 x i64> * %ptr, align 16
1146  ret void
1147}
1148
1149define void @st_d(<2 x i64> * %ptr, i8 * %ldptr, i32 %offset, i8 * %stptr) {
1150entry:
1151; CHECK-LABEL: st_d
1152; MSA32: addu $[[R0:[0-9]]], $7, $6
1153
1154; MSA64N32-DAG: sll $[[R1:[0-9]]], $6, 0
1155; MSA64N32-DAG: sll $[[R2:[0-9]+]], $7, 0
1156; MSA64N32: addu $[[R0:[0-9]+]], $[[R2]], $[[R1]]
1157
1158; MSA64N64: sll $[[R1:[0-9]]], $6, 0
1159; MSA64N64: daddu $[[R0:[0-9]]], $7, $[[R1]]
1160; CHECK: st.d $w{{[0-9]+}}, 0($[[R0]])
1161  %a = call <2 x i64> @llvm.mips.ld.d(i8* %ldptr, i32 0)
1162  call void @llvm.mips.st.d(<2 x i64> %a, i8* %stptr, i32 %offset)
1163  ret void
1164}
1165
1166
1167declare <8 x i16> @llvm.mips.ldi.h(i32)
1168declare <8 x i16> @llvm.mips.addvi.h(<8 x i16>, i32)
1169declare <8 x i16> @llvm.mips.bclri.h(<8 x i16>, i32)
1170declare <8 x i16> @llvm.mips.binsli.h(<8 x i16>, <8 x i16>, i32)
1171declare <8 x i16> @llvm.mips.binsri.h(<8 x i16>, <8 x i16>, i32)
1172declare <8 x i16> @llvm.mips.bnegi.h(<8 x i16>, i32)
1173declare <8 x i16> @llvm.mips.bseti.h(<8 x i16>, i32)
1174declare <8 x i16> @llvm.mips.clei.s.h(<8 x i16>, i32)
1175declare <8 x i16> @llvm.mips.clei.u.h(<8 x i16>, i32)
1176declare <8 x i16> @llvm.mips.clti.s.h(<8 x i16>, i32)
1177declare <8 x i16> @llvm.mips.clti.u.h(<8 x i16>, i32)
1178declare <8 x i16> @llvm.mips.maxi.s.h(<8 x i16>, i32)
1179declare <8 x i16> @llvm.mips.maxi.u.h(<8 x i16>, i32)
1180declare <8 x i16> @llvm.mips.mini.s.h(<8 x i16>, i32)
1181declare <8 x i16> @llvm.mips.mini.u.h(<8 x i16>, i32)
1182declare <8 x i16> @llvm.mips.sldi.h(<8 x i16>, <8 x i16>, i32)
1183declare <8 x i16> @llvm.mips.slli.h(<8 x i16>, i32)
1184declare <8 x i16> @llvm.mips.splati.h(<8 x i16>, i32)
1185declare <8 x i16> @llvm.mips.srai.h(<8 x i16>, i32)
1186declare <8 x i16> @llvm.mips.srari.h(<8 x i16>, i32)
1187declare <8 x i16> @llvm.mips.srli.h(<8 x i16>, i32)
1188declare <8 x i16> @llvm.mips.srlri.h(<8 x i16>, i32)
1189declare <4 x i32> @llvm.mips.addvi.w(<4 x i32>, i32)
1190declare <4 x i32> @llvm.mips.bclri.w(<4 x i32>, i32)
1191declare <4 x i32> @llvm.mips.binsli.w(<4 x i32>, <4 x i32>, i32)
1192declare <4 x i32> @llvm.mips.binsri.w(<4 x i32>, <4 x i32>, i32)
1193declare <4 x i32> @llvm.mips.bnegi.w(<4 x i32>, i32)
1194declare <4 x i32> @llvm.mips.bseti.w(<4 x i32>, i32)
1195declare <4 x i32> @llvm.mips.ldi.w(i32)
1196declare <4 x i32> @llvm.mips.clei.s.w(<4 x i32>, i32)
1197declare <4 x i32> @llvm.mips.clei.u.w(<4 x i32>, i32)
1198declare <4 x i32> @llvm.mips.clti.s.w(<4 x i32>, i32)
1199declare <4 x i32> @llvm.mips.clti.u.w(<4 x i32>, i32)
1200declare <4 x i32> @llvm.mips.maxi.s.w(<4 x i32>, i32)
1201declare <4 x i32> @llvm.mips.maxi.u.w(<4 x i32>, i32)
1202declare <4 x i32> @llvm.mips.mini.s.w(<4 x i32>, i32)
1203declare <4 x i32> @llvm.mips.mini.u.w(<4 x i32>, i32)
1204declare <4 x i32> @llvm.mips.sldi.w(<4 x i32>, <4 x i32>, i32)
1205declare <4 x i32> @llvm.mips.slli.w(<4 x i32>, i32)
1206declare <4 x i32> @llvm.mips.splati.w(<4 x i32>, i32)
1207declare <4 x i32> @llvm.mips.srai.w(<4 x i32>, i32)
1208declare <4 x i32> @llvm.mips.srari.w(<4 x i32>, i32)
1209declare <4 x i32> @llvm.mips.srli.w(<4 x i32>, i32)
1210declare <4 x i32> @llvm.mips.srlri.w(<4 x i32>, i32)
1211declare <2 x i64> @llvm.mips.ldi.d(i32)
1212declare <2 x i64> @llvm.mips.addvi.d(<2 x i64>, i32)
1213declare <2 x i64> @llvm.mips.bclri.d(<2 x i64>, i32)
1214declare <2 x i64> @llvm.mips.binsli.d(<2 x i64>, <2 x i64>, i32)
1215declare <2 x i64> @llvm.mips.binsri.d(<2 x i64>, <2 x i64>, i32)
1216declare <2 x i64> @llvm.mips.bnegi.d(<2 x i64>, i32)
1217declare <2 x i64> @llvm.mips.bseti.d(<2 x i64>, i32)
1218declare <2 x i64> @llvm.mips.clei.s.d(<2 x i64>, i32)
1219declare <2 x i64> @llvm.mips.clei.u.d(<2 x i64>, i32)
1220declare <2 x i64> @llvm.mips.clti.s.d(<2 x i64>, i32)
1221declare <2 x i64> @llvm.mips.clti.u.d(<2 x i64>, i32)
1222declare <2 x i64> @llvm.mips.maxi.s.d(<2 x i64>, i32)
1223declare <2 x i64> @llvm.mips.maxi.u.d(<2 x i64>, i32)
1224declare <2 x i64> @llvm.mips.mini.s.d(<2 x i64>, i32)
1225declare <2 x i64> @llvm.mips.mini.u.d(<2 x i64>, i32)
1226declare <2 x i64> @llvm.mips.sldi.d(<2 x i64>, <2 x i64>, i32)
1227declare <2 x i64> @llvm.mips.slli.d(<2 x i64>, i32)
1228declare <2 x i64> @llvm.mips.splati.d(<2 x i64>, i32)
1229declare <2 x i64> @llvm.mips.srai.d(<2 x i64>, i32)
1230declare <2 x i64> @llvm.mips.srari.d(<2 x i64>, i32)
1231declare <2 x i64> @llvm.mips.srli.d(<2 x i64>, i32)
1232declare <2 x i64> @llvm.mips.srlri.d(<2 x i64>, i32)
1233declare <16 x i8> @llvm.mips.ldi.b(i32)
1234declare <16 x i8> @llvm.mips.addvi.b(<16 x i8>, i32)
1235declare <16 x i8> @llvm.mips.andi.b(<16 x i8>, i32)
1236declare <16 x i8> @llvm.mips.bclri.b(<16 x i8>, i32)
1237declare <16 x i8> @llvm.mips.binsli.b(<16 x i8>, <16 x i8>, i32)
1238declare <16 x i8> @llvm.mips.binsri.b(<16 x i8>, <16 x i8>, i32)
1239declare <16 x i8> @llvm.mips.bmnzi.b(<16 x i8>, <16 x i8>, i32)
1240declare <16 x i8> @llvm.mips.bnegi.b(<16 x i8>, i32)
1241declare <16 x i8> @llvm.mips.bseli.b(<16 x i8>, <16 x i8>, i32)
1242declare <16 x i8> @llvm.mips.bseti.b(<16 x i8>, i32)
1243declare <16 x i8> @llvm.mips.clei.s.b(<16 x i8>, i32)
1244declare <16 x i8> @llvm.mips.clei.u.b(<16 x i8>, i32)
1245declare <16 x i8> @llvm.mips.clti.s.b(<16 x i8>, i32)
1246declare <16 x i8> @llvm.mips.clti.u.b(<16 x i8>, i32)
1247declare <16 x i8> @llvm.mips.maxi.s.b(<16 x i8>, i32)
1248declare <16 x i8> @llvm.mips.maxi.u.b(<16 x i8>, i32)
1249declare <16 x i8> @llvm.mips.mini.s.b(<16 x i8>, i32)
1250declare <16 x i8> @llvm.mips.mini.u.b(<16 x i8>, i32)
1251declare <16 x i8> @llvm.mips.nori.b(<16 x i8>, i32)
1252declare <16 x i8> @llvm.mips.ori.b(<16 x i8>, i32)
1253declare <16 x i8> @llvm.mips.sldi.b(<16 x i8>, <16 x i8>, i32)
1254declare <16 x i8> @llvm.mips.slli.b(<16 x i8>, i32)
1255declare <16 x i8> @llvm.mips.splati.b(<16 x i8>, i32)
1256declare <16 x i8> @llvm.mips.srai.b(<16 x i8>, i32)
1257declare <16 x i8> @llvm.mips.srari.b(<16 x i8>, i32)
1258declare <16 x i8> @llvm.mips.srli.b(<16 x i8>, i32)
1259declare <16 x i8> @llvm.mips.srlri.b(<16 x i8>, i32)
1260declare i32 @llvm.mips.copy.s.h(<8 x i16>, i32)
1261declare i32 @llvm.mips.copy.u.h(<8 x i16>, i32)
1262declare i32 @llvm.mips.copy.s.w(<4 x i32>, i32)
1263declare i32 @llvm.mips.copy.u.w(<4 x i32>, i32)
1264declare i64 @llvm.mips.copy.s.d(<2 x i64>, i32)
1265declare i64 @llvm.mips.copy.u.d(<2 x i64>, i32)
1266declare i32 @llvm.mips.copy.s.b(<16 x i8>, i32)
1267declare i32 @llvm.mips.copy.u.b(<16 x i8>, i32)
1268declare <16 x i8> @llvm.mips.bmzi.b(<16 x i8>, <16 x i8>, i32)
1269declare <16 x i8> @llvm.mips.ld.b(i8*, i32)
1270declare <8 x i16> @llvm.mips.ld.h(i8*, i32)
1271declare <4 x i32> @llvm.mips.ld.w(i8*, i32)
1272declare <2 x i64> @llvm.mips.ld.d(i8*, i32)
1273declare void @llvm.mips.st.b(<16 x i8>, i8*, i32)
1274declare void @llvm.mips.st.h(<8 x i16>, i8*, i32)
1275declare void @llvm.mips.st.w(<4 x i32>, i8*, i32)
1276declare void @llvm.mips.st.d(<2 x i64>, i8*, i32)
1277