OSDN Git Service

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