1; RUN: llc -march=mips -mattr=+msa,+fp64 < %s | FileCheck -check-prefix=MIPS32-AE -check-prefix=MIPS32-BE %s
2; RUN: llc -march=mipsel -mattr=+msa,+fp64 < %s | FileCheck -check-prefix=MIPS32-AE -check-prefix=MIPS32-LE %s
3
4@v4i8 = global <4 x i8> <i8 0, i8 0, i8 0, i8 0>
5@v16i8 = global <16 x i8> <i8 0, i8 0, i8 0, i8 0, i8 0, i8 0, i8 0, i8 0, i8 0, i8 0, i8 0, i8 0, i8 0, i8 0, i8 0, i8 0>
6@v8i16 = global <8 x i16> <i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0>
7@v4i32 = global <4 x i32> <i32 0, i32 0, i32 0, i32 0>
8@v2i64 = global <2 x i64> <i64 0, i64 0>
9@i64 = global i64 0
10
11define void @const_v16i8() nounwind {
12  ; MIPS32-AE: const_v16i8:
13
14  store volatile <16 x i8> <i8 0, i8 0, i8 0, i8 0, i8 0, i8 0, i8 0, i8 0, i8 0, i8 0, i8 0, i8 0, i8 0, i8 0, i8 0, i8 0>, <16 x i8>*@v16i8
15  ; MIPS32-AE: ldi.b [[R1:\$w[0-9]+]], 0
16
17  store volatile <16 x i8> <i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1>, <16 x i8>*@v16i8
18  ; MIPS32-AE: ldi.b [[R1:\$w[0-9]+]], 1
19
20  store volatile <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 31>, <16 x i8>*@v16i8
21  ; MIPS32-AE: addiu [[G_PTR:\$[0-9]+]], {{.*}}, %lo($
22  ; MIPS32-AE: ld.b  [[R1:\$w[0-9]+]], 0([[G_PTR]])
23
24  store volatile <16 x i8> <i8 1, i8 2, i8 3, i8 4, i8 5, i8 6, i8 7, i8 8, i8 9, i8 0, i8 1, i8 2, i8 3, i8 4, i8 5, i8 6>, <16 x i8>*@v16i8
25  ; MIPS32-AE: addiu [[G_PTR:\$[0-9]+]], {{.*}}, %lo($
26  ; MIPS32-AE: ld.b  [[R1:\$w[0-9]+]], 0([[G_PTR]])
27
28  store volatile <16 x i8> <i8 1, i8 0, i8 1, i8 0, i8 1, i8 0, i8 1, i8 0, i8 1, i8 0, i8 1, i8 0, i8 1, i8 0, i8 1, i8 0>, <16 x i8>*@v16i8
29  ; MIPS32-BE: ldi.h [[R1:\$w[0-9]+]], 256
30  ; MIPS32-LE: ldi.h [[R1:\$w[0-9]+]], 1
31
32  store volatile <16 x i8> <i8 1, i8 2, i8 3, i8 4, i8 1, i8 2, i8 3, i8 4, i8 1, i8 2, i8 3, i8 4, i8 1, i8 2, i8 3, i8 4>, <16 x i8>*@v16i8
33  ; MIPS32-BE-DAG: lui [[R2:\$[0-9]+]], 258
34  ; MIPS32-LE-DAG: lui [[R2:\$[0-9]+]], 1027
35  ; MIPS32-BE-DAG: ori [[R2]], [[R2]], 772
36  ; MIPS32-LE-DAG: ori [[R2]], [[R2]], 513
37  ; MIPS32-AE-DAG: fill.w [[R1:\$w[0-9]+]], [[R2]]
38
39  store volatile <16 x i8> <i8 1, i8 2, i8 3, i8 4, i8 5, i8 6, i8 7, i8 8, i8 1, i8 2, i8 3, i8 4, i8 5, i8 6, i8 7, i8 8>, <16 x i8>*@v16i8
40  ; MIPS32-AE: addiu [[G_PTR:\$[0-9]+]], {{.*}}, %lo($
41  ; MIPS32-AE: ld.b  [[R1:\$w[0-9]+]], 0([[G_PTR]])
42
43  ret void
44  ; MIPS32-AE: .size const_v16i8
45}
46
47define void @const_v8i16() nounwind {
48  ; MIPS32-AE: const_v8i16:
49
50  store volatile <8 x i16> <i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0>, <8 x i16>*@v8i16
51  ; MIPS32-AE: ldi.b [[R1:\$w[0-9]+]], 0
52
53  store volatile <8 x i16> <i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1>, <8 x i16>*@v8i16
54  ; MIPS32-AE: ldi.h [[R1:\$w[0-9]+]], 1
55
56  store volatile <8 x i16> <i16 1, i16 1, i16 1, i16 2, i16 1, i16 1, i16 1, i16 31>, <8 x i16>*@v8i16
57  ; MIPS32-AE: addiu [[G_PTR:\$[0-9]+]], {{.*}}, %lo($
58  ; MIPS32-AE: ld.h  [[R1:\$w[0-9]+]], 0([[G_PTR]])
59
60  store volatile <8 x i16> <i16 1028, i16 1028, i16 1028, i16 1028, i16 1028, i16 1028, i16 1028, i16 1028>, <8 x i16>*@v8i16
61  ; MIPS32-AE: ldi.b [[R1:\$w[0-9]+]], 4
62
63  store volatile <8 x i16> <i16 1, i16 2, i16 1, i16 2, i16 1, i16 2, i16 1, i16 2>, <8 x i16>*@v8i16
64  ; MIPS32-BE-DAG: lui [[R2:\$[0-9]+]], 1
65  ; MIPS32-LE-DAG: lui [[R2:\$[0-9]+]], 2
66  ; MIPS32-BE-DAG: ori [[R2]], [[R2]], 2
67  ; MIPS32-LE-DAG: ori [[R2]], [[R2]], 1
68  ; MIPS32-AE-DAG: fill.w [[R1:\$w[0-9]+]], [[R2]]
69
70  store volatile <8 x i16> <i16 1, i16 2, i16 3, i16 4, i16 1, i16 2, i16 3, i16 4>, <8 x i16>*@v8i16
71  ; MIPS32-AE: addiu [[G_PTR:\$[0-9]+]], {{.*}}, %lo($
72  ; MIPS32-AE: ld.h  [[R1:\$w[0-9]+]], 0([[G_PTR]])
73
74  ret void
75  ; MIPS32-AE: .size const_v8i16
76}
77
78define void @const_v4i32() nounwind {
79  ; MIPS32-AE: const_v4i32:
80
81  store volatile <4 x i32> <i32 0, i32 0, i32 0, i32 0>, <4 x i32>*@v4i32
82  ; MIPS32-AE: ldi.b [[R1:\$w[0-9]+]], 0
83
84  store volatile <4 x i32> <i32 1, i32 1, i32 1, i32 1>, <4 x i32>*@v4i32
85  ; MIPS32-AE: ldi.w [[R1:\$w[0-9]+]], 1
86
87  store volatile <4 x i32> <i32 1, i32 1, i32 1, i32 31>, <4 x i32>*@v4i32
88  ; MIPS32-AE: addiu [[G_PTR:\$[0-9]+]], {{.*}}, %lo($
89  ; MIPS32-AE: ld.w  [[R1:\$w[0-9]+]], 0([[G_PTR]])
90
91  store volatile <4 x i32> <i32 16843009, i32 16843009, i32 16843009, i32 16843009>, <4 x i32>*@v4i32
92  ; MIPS32-AE: ldi.b [[R1:\$w[0-9]+]], 1
93
94  store volatile <4 x i32> <i32 65537, i32 65537, i32 65537, i32 65537>, <4 x i32>*@v4i32
95  ; MIPS32-AE: ldi.h [[R1:\$w[0-9]+]], 1
96
97  store volatile <4 x i32> <i32 1, i32 2, i32 1, i32 2>, <4 x i32>*@v4i32
98  ; MIPS32-AE: addiu [[G_PTR:\$[0-9]+]], {{.*}}, %lo($
99  ; MIPS32-AE: ld.w  [[R1:\$w[0-9]+]], 0([[G_PTR]])
100
101  store volatile <4 x i32> <i32 3, i32 4, i32 5, i32 6>, <4 x i32>*@v4i32
102  ; MIPS32-AE: addiu [[G_PTR:\$[0-9]+]], {{.*}}, %lo($
103  ; MIPS32-AE: ld.w  [[R1:\$w[0-9]+]], 0([[G_PTR]])
104
105  ret void
106  ; MIPS32-AE: .size const_v4i32
107}
108
109define void @const_v2i64() nounwind {
110  ; MIPS32-AE: const_v2i64:
111
112  store volatile <2 x i64> <i64 0, i64 0>, <2 x i64>*@v2i64
113  ; MIPS32-AE: ldi.b [[R1:\$w[0-9]+]], 0
114
115  store volatile <2 x i64> <i64 72340172838076673, i64 72340172838076673>, <2 x i64>*@v2i64
116  ; MIPS32-AE: ldi.b [[R1:\$w[0-9]+]], 1
117
118  store volatile <2 x i64> <i64 281479271743489, i64 281479271743489>, <2 x i64>*@v2i64
119  ; MIPS32-AE: ldi.h [[R1:\$w[0-9]+]], 1
120
121  store volatile <2 x i64> <i64 4294967297, i64 4294967297>, <2 x i64>*@v2i64
122  ; MIPS32-AE: ldi.w [[R1:\$w[0-9]+]], 1
123
124  store volatile <2 x i64> <i64 1, i64 1>, <2 x i64>*@v2i64
125  ; MIPS32-AE: ldi.d [[R1:\$w[0-9]+]], 1
126
127  store volatile <2 x i64> <i64 1, i64 31>, <2 x i64>*@v2i64
128  ; MIPS32-AE: addiu [[G_PTR:\$[0-9]+]], {{.*}}, %lo($
129  ; MIPS32-AE: ld.w  [[R1:\$w[0-9]+]], 0([[G_PTR]])
130
131  store volatile <2 x i64> <i64 3, i64 4>, <2 x i64>*@v2i64
132  ; MIPS32-AE: addiu [[G_PTR:\$[0-9]+]], {{.*}}, %lo($
133  ; MIPS32-AE: ld.w  [[R1:\$w[0-9]+]], 0([[G_PTR]])
134
135  ret void
136  ; MIPS32-AE: .size const_v2i64
137}
138
139define void @nonconst_v16i8(i8 %a, i8 %b, i8 %c, i8 %d, i8 %e, i8 %f, i8 %g, i8 %h) nounwind {
140  ; MIPS32-AE: nonconst_v16i8:
141
142  %1 = insertelement <16 x i8> undef, i8 %a, i32 0
143  %2 = insertelement <16 x i8> %1, i8 %b, i32 1
144  %3 = insertelement <16 x i8> %2, i8 %c, i32 2
145  %4 = insertelement <16 x i8> %3, i8 %d, i32 3
146  %5 = insertelement <16 x i8> %4, i8 %e, i32 4
147  %6 = insertelement <16 x i8> %5, i8 %f, i32 5
148  %7 = insertelement <16 x i8> %6, i8 %g, i32 6
149  %8 = insertelement <16 x i8> %7, i8 %h, i32 7
150  %9 = insertelement <16 x i8> %8, i8 %h, i32 8
151  %10 = insertelement <16 x i8> %9, i8 %h, i32 9
152  %11 = insertelement <16 x i8> %10, i8 %h, i32 10
153  %12 = insertelement <16 x i8> %11, i8 %h, i32 11
154  %13 = insertelement <16 x i8> %12, i8 %h, i32 12
155  %14 = insertelement <16 x i8> %13, i8 %h, i32 13
156  %15 = insertelement <16 x i8> %14, i8 %h, i32 14
157  %16 = insertelement <16 x i8> %15, i8 %h, i32 15
158  ; MIPS32-AE-DAG: insert.b [[R1:\$w[0-9]+]][0], $4
159  ; MIPS32-AE-DAG: insert.b [[R1]][1], $5
160  ; MIPS32-AE-DAG: insert.b [[R1]][2], $6
161  ; MIPS32-AE-DAG: insert.b [[R1]][3], $7
162  ; MIPS32-BE-DAG: lbu [[R2:\$[0-9]+]], 19($sp)
163  ; MIPS32-LE-DAG: lbu [[R2:\$[0-9]+]], 16($sp)
164  ; MIPS32-AE-DAG: insert.b [[R1]][4], [[R2]]
165  ; MIPS32-BE-DAG: lbu [[R3:\$[0-9]+]], 23($sp)
166  ; MIPS32-LE-DAG: lbu [[R3:\$[0-9]+]], 20($sp)
167  ; MIPS32-AE-DAG: insert.b [[R1]][5], [[R3]]
168  ; MIPS32-BE-DAG: lbu [[R4:\$[0-9]+]], 27($sp)
169  ; MIPS32-LE-DAG: lbu [[R4:\$[0-9]+]], 24($sp)
170  ; MIPS32-AE-DAG: insert.b [[R1]][6], [[R4]]
171  ; MIPS32-BE-DAG: lbu [[R5:\$[0-9]+]], 31($sp)
172  ; MIPS32-LE-DAG: lbu [[R5:\$[0-9]+]], 28($sp)
173  ; MIPS32-AE-DAG: insert.b [[R1]][7], [[R5]]
174  ; MIPS32-AE-DAG: insert.b [[R1]][8], [[R5]]
175  ; MIPS32-AE-DAG: insert.b [[R1]][9], [[R5]]
176  ; MIPS32-AE-DAG: insert.b [[R1]][10], [[R5]]
177  ; MIPS32-AE-DAG: insert.b [[R1]][11], [[R5]]
178  ; MIPS32-AE-DAG: insert.b [[R1]][12], [[R5]]
179  ; MIPS32-AE-DAG: insert.b [[R1]][13], [[R5]]
180  ; MIPS32-AE-DAG: insert.b [[R1]][14], [[R5]]
181  ; MIPS32-AE-DAG: insert.b [[R1]][15], [[R5]]
182
183  store volatile <16 x i8> %16, <16 x i8>*@v16i8
184
185  ret void
186  ; MIPS32-AE: .size nonconst_v16i8
187}
188
189define void @nonconst_v8i16(i16 %a, i16 %b, i16 %c, i16 %d, i16 %e, i16 %f, i16 %g, i16 %h) nounwind {
190  ; MIPS32-AE: nonconst_v8i16:
191
192  %1 = insertelement <8 x i16> undef, i16 %a, i32 0
193  %2 = insertelement <8 x i16> %1, i16 %b, i32 1
194  %3 = insertelement <8 x i16> %2, i16 %c, i32 2
195  %4 = insertelement <8 x i16> %3, i16 %d, i32 3
196  %5 = insertelement <8 x i16> %4, i16 %e, i32 4
197  %6 = insertelement <8 x i16> %5, i16 %f, i32 5
198  %7 = insertelement <8 x i16> %6, i16 %g, i32 6
199  %8 = insertelement <8 x i16> %7, i16 %h, i32 7
200  ; MIPS32-AE-DAG: insert.h [[R1:\$w[0-9]+]][0], $4
201  ; MIPS32-AE-DAG: insert.h [[R1]][1], $5
202  ; MIPS32-AE-DAG: insert.h [[R1]][2], $6
203  ; MIPS32-AE-DAG: insert.h [[R1]][3], $7
204  ; MIPS32-BE-DAG: lhu [[R2:\$[0-9]+]], 18($sp)
205  ; MIPS32-LE-DAG: lhu [[R2:\$[0-9]+]], 16($sp)
206  ; MIPS32-AE-DAG: insert.h [[R1]][4], [[R2]]
207  ; MIPS32-BE-DAG: lhu [[R2:\$[0-9]+]], 22($sp)
208  ; MIPS32-LE-DAG: lhu [[R2:\$[0-9]+]], 20($sp)
209  ; MIPS32-AE-DAG: insert.h [[R1]][5], [[R2]]
210  ; MIPS32-BE-DAG: lhu [[R2:\$[0-9]+]], 26($sp)
211  ; MIPS32-LE-DAG: lhu [[R2:\$[0-9]+]], 24($sp)
212  ; MIPS32-AE-DAG: insert.h [[R1]][6], [[R2]]
213  ; MIPS32-BE-DAG: lhu [[R2:\$[0-9]+]], 30($sp)
214  ; MIPS32-LE-DAG: lhu [[R2:\$[0-9]+]], 28($sp)
215  ; MIPS32-AE-DAG: insert.h [[R1]][7], [[R2]]
216
217  store volatile <8 x i16> %8, <8 x i16>*@v8i16
218
219  ret void
220  ; MIPS32-AE: .size nonconst_v8i16
221}
222
223define void @nonconst_v4i32(i32 %a, i32 %b, i32 %c, i32 %d) nounwind {
224  ; MIPS32-AE: nonconst_v4i32:
225
226  %1 = insertelement <4 x i32> undef, i32 %a, i32 0
227  %2 = insertelement <4 x i32> %1, i32 %b, i32 1
228  %3 = insertelement <4 x i32> %2, i32 %c, i32 2
229  %4 = insertelement <4 x i32> %3, i32 %d, i32 3
230  ; MIPS32-AE: insert.w [[R1:\$w[0-9]+]][0], $4
231  ; MIPS32-AE: insert.w [[R1]][1], $5
232  ; MIPS32-AE: insert.w [[R1]][2], $6
233  ; MIPS32-AE: insert.w [[R1]][3], $7
234
235  store volatile <4 x i32> %4, <4 x i32>*@v4i32
236
237  ret void
238  ; MIPS32-AE: .size nonconst_v4i32
239}
240
241define void @nonconst_v2i64(i64 %a, i64 %b) nounwind {
242  ; MIPS32-AE: nonconst_v2i64:
243
244  %1 = insertelement <2 x i64> undef, i64 %a, i32 0
245  %2 = insertelement <2 x i64> %1, i64 %b, i32 1
246  ; MIPS32-AE: insert.w [[R1:\$w[0-9]+]][0], $4
247  ; MIPS32-AE: insert.w [[R1]][1], $5
248  ; MIPS32-AE: insert.w [[R1]][2], $6
249  ; MIPS32-AE: insert.w [[R1]][3], $7
250
251  store volatile <2 x i64> %2, <2 x i64>*@v2i64
252
253  ret void
254  ; MIPS32-AE: .size nonconst_v2i64
255}
256
257define i32 @extract_sext_v16i8() nounwind {
258  ; MIPS32-AE: extract_sext_v16i8:
259
260  %1 = load <16 x i8>* @v16i8
261  ; MIPS32-AE-DAG: ld.b [[R1:\$w[0-9]+]],
262
263  %2 = add <16 x i8> %1, %1
264  ; MIPS32-AE-DAG: addv.b [[R2:\$w[0-9]+]], [[R1]], [[R1]]
265
266  %3 = extractelement <16 x i8> %2, i32 1
267  %4 = sext i8 %3 to i32
268  ; MIPS32-AE-DAG: copy_s.b [[R3:\$[0-9]+]], [[R1]][1]
269  ; MIPS32-AE-NOT: sll
270  ; MIPS32-AE-NOT: sra
271
272  ret i32 %4
273  ; MIPS32-AE: .size extract_sext_v16i8
274}
275
276define i32 @extract_sext_v8i16() nounwind {
277  ; MIPS32-AE: extract_sext_v8i16:
278
279  %1 = load <8 x i16>* @v8i16
280  ; MIPS32-AE-DAG: ld.h [[R1:\$w[0-9]+]],
281
282  %2 = add <8 x i16> %1, %1
283  ; MIPS32-AE-DAG: addv.h [[R2:\$w[0-9]+]], [[R1]], [[R1]]
284
285  %3 = extractelement <8 x i16> %2, i32 1
286  %4 = sext i16 %3 to i32
287  ; MIPS32-AE-DAG: copy_s.h [[R3:\$[0-9]+]], [[R1]][1]
288  ; MIPS32-AE-NOT: sll
289  ; MIPS32-AE-NOT: sra
290
291  ret i32 %4
292  ; MIPS32-AE: .size extract_sext_v8i16
293}
294
295define i32 @extract_sext_v4i32() nounwind {
296  ; MIPS32-AE: extract_sext_v4i32:
297
298  %1 = load <4 x i32>* @v4i32
299  ; MIPS32-AE-DAG: ld.w [[R1:\$w[0-9]+]],
300
301  %2 = add <4 x i32> %1, %1
302  ; MIPS32-AE-DAG: addv.w [[R2:\$w[0-9]+]], [[R1]], [[R1]]
303
304  %3 = extractelement <4 x i32> %2, i32 1
305  ; MIPS32-AE-DAG: copy_s.w [[R3:\$[0-9]+]], [[R1]][1]
306
307  ret i32 %3
308  ; MIPS32-AE: .size extract_sext_v4i32
309}
310
311define i64 @extract_sext_v2i64() nounwind {
312  ; MIPS32-AE: extract_sext_v2i64:
313
314  %1 = load <2 x i64>* @v2i64
315  ; MIPS32-AE-DAG: ld.d [[R1:\$w[0-9]+]],
316
317  %2 = add <2 x i64> %1, %1
318  ; MIPS32-AE-DAG: addv.d [[R2:\$w[0-9]+]], [[R1]], [[R1]]
319
320  %3 = extractelement <2 x i64> %2, i32 1
321  ; MIPS32-AE-DAG: copy_s.w [[R3:\$[0-9]+]], [[R1]][2]
322  ; MIPS32-AE-DAG: copy_s.w [[R4:\$[0-9]+]], [[R1]][3]
323  ; MIPS32-AE-NOT: sll
324  ; MIPS32-AE-NOT: sra
325
326  ret i64 %3
327  ; MIPS32-AE: .size extract_sext_v2i64
328}
329
330define i32 @extract_zext_v16i8() nounwind {
331  ; MIPS32-AE: extract_zext_v16i8:
332
333  %1 = load <16 x i8>* @v16i8
334  ; MIPS32-AE-DAG: ld.b [[R1:\$w[0-9]+]],
335
336  %2 = add <16 x i8> %1, %1
337  ; MIPS32-AE-DAG: addv.b [[R2:\$w[0-9]+]], [[R1]], [[R1]]
338
339  %3 = extractelement <16 x i8> %2, i32 1
340  %4 = zext i8 %3 to i32
341  ; MIPS32-AE-DAG: copy_u.b [[R3:\$[0-9]+]], [[R1]][1]
342  ; MIPS32-AE-NOT: andi
343
344  ret i32 %4
345  ; MIPS32-AE: .size extract_zext_v16i8
346}
347
348define i32 @extract_zext_v8i16() nounwind {
349  ; MIPS32-AE: extract_zext_v8i16:
350
351  %1 = load <8 x i16>* @v8i16
352  ; MIPS32-AE-DAG: ld.h [[R1:\$w[0-9]+]],
353
354  %2 = add <8 x i16> %1, %1
355  ; MIPS32-AE-DAG: addv.h [[R2:\$w[0-9]+]], [[R1]], [[R1]]
356
357  %3 = extractelement <8 x i16> %2, i32 1
358  %4 = zext i16 %3 to i32
359  ; MIPS32-AE-DAG: copy_u.h [[R3:\$[0-9]+]], [[R1]][1]
360  ; MIPS32-AE-NOT: andi
361
362  ret i32 %4
363  ; MIPS32-AE: .size extract_zext_v8i16
364}
365
366define i32 @extract_zext_v4i32() nounwind {
367  ; MIPS32-AE: extract_zext_v4i32:
368
369  %1 = load <4 x i32>* @v4i32
370  ; MIPS32-AE-DAG: ld.w [[R1:\$w[0-9]+]],
371
372  %2 = add <4 x i32> %1, %1
373  ; MIPS32-AE-DAG: addv.w [[R2:\$w[0-9]+]], [[R1]], [[R1]]
374
375  %3 = extractelement <4 x i32> %2, i32 1
376  ; MIPS32-AE-DAG: copy_{{[su]}}.w [[R3:\$[0-9]+]], [[R1]][1]
377
378  ret i32 %3
379  ; MIPS32-AE: .size extract_zext_v4i32
380}
381
382define i64 @extract_zext_v2i64() nounwind {
383  ; MIPS32-AE: extract_zext_v2i64:
384
385  %1 = load <2 x i64>* @v2i64
386  ; MIPS32-AE-DAG: ld.d [[R1:\$w[0-9]+]],
387
388  %2 = add <2 x i64> %1, %1
389  ; MIPS32-AE-DAG: addv.d [[R2:\$w[0-9]+]], [[R1]], [[R1]]
390
391  %3 = extractelement <2 x i64> %2, i32 1
392  ; MIPS32-AE-DAG: copy_{{[su]}}.w [[R3:\$[0-9]+]], [[R1]][2]
393  ; MIPS32-AE-DAG: copy_{{[su]}}.w [[R4:\$[0-9]+]], [[R1]][3]
394  ; MIPS32-AE-NOT: andi
395
396  ret i64 %3
397  ; MIPS32-AE: .size extract_zext_v2i64
398}
399
400define void @insert_v16i8(i32 %a) nounwind {
401  ; MIPS32-AE: insert_v16i8:
402
403  %1 = load <16 x i8>* @v16i8
404  ; MIPS32-AE-DAG: ld.b [[R1:\$w[0-9]+]],
405
406  %a2 = trunc i32 %a to i8
407  %a3 = sext i8 %a2 to i32
408  %a4 = trunc i32 %a3 to i8
409  ; MIPS32-AE-NOT: andi
410  ; MIPS32-AE-NOT: sra
411
412  %2 = insertelement <16 x i8> %1, i8 %a4, i32 1
413  ; MIPS32-AE-DAG: insert.b [[R1]][1], $4
414
415  store <16 x i8> %2, <16 x i8>* @v16i8
416  ; MIPS32-AE-DAG: st.b [[R1]]
417
418  ret void
419  ; MIPS32-AE: .size insert_v16i8
420}
421
422define void @insert_v8i16(i32 %a) nounwind {
423  ; MIPS32-AE: insert_v8i16:
424
425  %1 = load <8 x i16>* @v8i16
426  ; MIPS32-AE-DAG: ld.h [[R1:\$w[0-9]+]],
427
428  %a2 = trunc i32 %a to i16
429  %a3 = sext i16 %a2 to i32
430  %a4 = trunc i32 %a3 to i16
431  ; MIPS32-AE-NOT: andi
432  ; MIPS32-AE-NOT: sra
433
434  %2 = insertelement <8 x i16> %1, i16 %a4, i32 1
435  ; MIPS32-AE-DAG: insert.h [[R1]][1], $4
436
437  store <8 x i16> %2, <8 x i16>* @v8i16
438  ; MIPS32-AE-DAG: st.h [[R1]]
439
440  ret void
441  ; MIPS32-AE: .size insert_v8i16
442}
443
444define void @insert_v4i32(i32 %a) nounwind {
445  ; MIPS32-AE: insert_v4i32:
446
447  %1 = load <4 x i32>* @v4i32
448  ; MIPS32-AE-DAG: ld.w [[R1:\$w[0-9]+]],
449
450  ; MIPS32-AE-NOT: andi
451  ; MIPS32-AE-NOT: sra
452
453  %2 = insertelement <4 x i32> %1, i32 %a, i32 1
454  ; MIPS32-AE-DAG: insert.w [[R1]][1], $4
455
456  store <4 x i32> %2, <4 x i32>* @v4i32
457  ; MIPS32-AE-DAG: st.w [[R1]]
458
459  ret void
460  ; MIPS32-AE: .size insert_v4i32
461}
462
463define void @insert_v2i64(i64 %a) nounwind {
464  ; MIPS32-AE: insert_v2i64:
465
466  %1 = load <2 x i64>* @v2i64
467  ; MIPS32-AE-DAG: ld.w [[R1:\$w[0-9]+]],
468
469  ; MIPS32-AE-NOT: andi
470  ; MIPS32-AE-NOT: sra
471
472  %2 = insertelement <2 x i64> %1, i64 %a, i32 1
473  ; MIPS32-AE-DAG: insert.w [[R1]][2], $4
474  ; MIPS32-AE-DAG: insert.w [[R1]][3], $5
475
476  store <2 x i64> %2, <2 x i64>* @v2i64
477  ; MIPS32-AE-DAG: st.w [[R1]]
478
479  ret void
480  ; MIPS32-AE: .size insert_v2i64
481}
482
483define void @truncstore() nounwind {
484  ; MIPS32-AE: truncstore:
485
486  store volatile <4 x i8> <i8 -1, i8 -1, i8 -1, i8 -1>, <4 x i8>*@v4i8
487  ; TODO: What code should be emitted?
488
489  ret void
490  ; MIPS32-AE: .size truncstore
491}
492