Taints the non-acquire RMW's store address with the load part
[oota-llvm.git] / test / CodeGen / Mips / msa / basic_operations.ll
1 ; RUN: llc -march=mips -mattr=+msa,+fp64 < %s | FileCheck -check-prefix=ALL -check-prefix=O32 -check-prefix=MIPS32 -check-prefix=ALL-BE %s
2 ; RUN: llc -march=mipsel -mattr=+msa,+fp64 < %s | FileCheck -check-prefix=ALL -check-prefix=O32 -check-prefix=MIPS32 -check-prefix=ALL-LE %s
3 ; RUN: llc -march=mips64 -target-abi n32 -mattr=+msa,+fp64 < %s | FileCheck -check-prefix=ALL -check-prefix=N32 -check-prefix=MIPS64 -check-prefix=ALL-BE %s
4 ; RUN: llc -march=mips64el -target-abi n32 -mattr=+msa,+fp64 < %s | FileCheck -check-prefix=ALL -check-prefix=N32 -check-prefix=MIPS64 -check-prefix=ALL-LE %s
5 ; RUN: llc -march=mips64 -mattr=+msa,+fp64 < %s | FileCheck -check-prefix=ALL -check-prefix=N64 -check-prefix=MIPS64 -check-prefix=ALL-BE %s
6 ; RUN: llc -march=mips64el -mattr=+msa,+fp64 < %s | FileCheck -check-prefix=ALL -check-prefix=N64 -check-prefix=MIPS64 -check-prefix=ALL-LE %s
7
8 @v4i8 = global <4 x i8> <i8 0, i8 0, i8 0, i8 0>
9 @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>
10 @v8i16 = global <8 x i16> <i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0>
11 @v4i32 = global <4 x i32> <i32 0, i32 0, i32 0, i32 0>
12 @v2i64 = global <2 x i64> <i64 0, i64 0>
13 @i32 = global i32 0
14 @i64 = global i64 0
15
16 define void @const_v16i8() nounwind {
17   ; ALL-LABEL: const_v16i8:
18
19   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
20   ; ALL: ldi.b [[R1:\$w[0-9]+]], 0
21
22   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
23   ; ALL: ldi.b [[R1:\$w[0-9]+]], 1
24
25   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
26   ; O32: addiu [[G_PTR:\$[0-9]+]], {{.*}}, %lo($
27   ; N32: addiu [[G_PTR:\$[0-9]+]], {{.*}}, %got_ofst($
28   ; N64: daddiu [[G_PTR:\$[0-9]+]], {{.*}}, %got_ofst($
29   ; ALL: ld.b  [[R1:\$w[0-9]+]], 0([[G_PTR]])
30
31   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
32   ; O32: addiu [[G_PTR:\$[0-9]+]], {{.*}}, %lo($
33   ; N32: addiu [[G_PTR:\$[0-9]+]], {{.*}}, %got_ofst($
34   ; N64: daddiu [[G_PTR:\$[0-9]+]], {{.*}}, %got_ofst($
35   ; ALL: ld.b  [[R1:\$w[0-9]+]], 0([[G_PTR]])
36
37   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
38   ; ALL-BE: ldi.h [[R1:\$w[0-9]+]], 256
39   ; ALL-LE: ldi.h [[R1:\$w[0-9]+]], 1
40
41   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
42   ; ALL-BE-DAG: lui [[R2:\$[0-9]+]], 258
43   ; ALL-LE-DAG: lui [[R2:\$[0-9]+]], 1027
44   ; ALL-BE-DAG: ori [[R2]], [[R2]], 772
45   ; ALL-LE-DAG: ori [[R2]], [[R2]], 513
46   ; ALL-DAG: fill.w [[R1:\$w[0-9]+]], [[R2]]
47
48   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
49   ; O32: addiu [[G_PTR:\$[0-9]+]], {{.*}}, %lo($
50   ; N32: addiu [[G_PTR:\$[0-9]+]], {{.*}}, %got_ofst($
51   ; N64: daddiu [[G_PTR:\$[0-9]+]], {{.*}}, %got_ofst($
52   ; ALL: ld.b  [[R1:\$w[0-9]+]], 0([[G_PTR]])
53
54   ret void
55 }
56
57 define void @const_v8i16() nounwind {
58   ; ALL-LABEL: const_v8i16:
59
60   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
61   ; ALL: ldi.b [[R1:\$w[0-9]+]], 0
62
63   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
64   ; ALL: ldi.h [[R1:\$w[0-9]+]], 1
65
66   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
67   ; O32: addiu [[G_PTR:\$[0-9]+]], {{.*}}, %lo($
68   ; N32: addiu [[G_PTR:\$[0-9]+]], {{.*}}, %got_ofst($
69   ; N64: daddiu [[G_PTR:\$[0-9]+]], {{.*}}, %got_ofst($
70   ; ALL: ld.h  [[R1:\$w[0-9]+]], 0([[G_PTR]])
71
72   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
73   ; ALL: ldi.b [[R1:\$w[0-9]+]], 4
74
75   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
76   ; ALL-BE-DAG: lui [[R2:\$[0-9]+]], 1
77   ; ALL-LE-DAG: lui [[R2:\$[0-9]+]], 2
78   ; ALL-BE-DAG: ori [[R2]], [[R2]], 2
79   ; ALL-LE-DAG: ori [[R2]], [[R2]], 1
80   ; ALL-DAG: fill.w [[R1:\$w[0-9]+]], [[R2]]
81
82   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
83   ; O32: addiu [[G_PTR:\$[0-9]+]], {{.*}}, %lo($
84   ; N32: addiu [[G_PTR:\$[0-9]+]], {{.*}}, %got_ofst($
85   ; N64: daddiu [[G_PTR:\$[0-9]+]], {{.*}}, %got_ofst($
86   ; ALL: ld.h  [[R1:\$w[0-9]+]], 0([[G_PTR]])
87
88   ret void
89 }
90
91 define void @const_v4i32() nounwind {
92   ; ALL-LABEL: const_v4i32:
93
94   store volatile <4 x i32> <i32 0, i32 0, i32 0, i32 0>, <4 x i32>*@v4i32
95   ; ALL: ldi.b [[R1:\$w[0-9]+]], 0
96
97   store volatile <4 x i32> <i32 1, i32 1, i32 1, i32 1>, <4 x i32>*@v4i32
98   ; ALL: ldi.w [[R1:\$w[0-9]+]], 1
99
100   store volatile <4 x i32> <i32 1, i32 1, i32 1, i32 31>, <4 x i32>*@v4i32
101   ; O32: addiu [[G_PTR:\$[0-9]+]], {{.*}}, %lo($
102   ; N32: addiu [[G_PTR:\$[0-9]+]], {{.*}}, %got_ofst($
103   ; N64: daddiu [[G_PTR:\$[0-9]+]], {{.*}}, %got_ofst($
104   ; ALL: ld.w  [[R1:\$w[0-9]+]], 0([[G_PTR]])
105
106   store volatile <4 x i32> <i32 16843009, i32 16843009, i32 16843009, i32 16843009>, <4 x i32>*@v4i32
107   ; ALL: ldi.b [[R1:\$w[0-9]+]], 1
108
109   store volatile <4 x i32> <i32 65537, i32 65537, i32 65537, i32 65537>, <4 x i32>*@v4i32
110   ; ALL: ldi.h [[R1:\$w[0-9]+]], 1
111
112   store volatile <4 x i32> <i32 1, i32 2, i32 1, i32 2>, <4 x i32>*@v4i32
113   ; O32: addiu [[G_PTR:\$[0-9]+]], {{.*}}, %lo($
114   ; N32: addiu [[G_PTR:\$[0-9]+]], {{.*}}, %got_ofst($
115   ; N64: daddiu [[G_PTR:\$[0-9]+]], {{.*}}, %got_ofst($
116   ; ALL: ld.w  [[R1:\$w[0-9]+]], 0([[G_PTR]])
117
118   store volatile <4 x i32> <i32 3, i32 4, i32 5, i32 6>, <4 x i32>*@v4i32
119   ; O32: addiu [[G_PTR:\$[0-9]+]], {{.*}}, %lo($
120   ; N32: addiu [[G_PTR:\$[0-9]+]], {{.*}}, %got_ofst($
121   ; N64: daddiu [[G_PTR:\$[0-9]+]], {{.*}}, %got_ofst($
122   ; ALL: ld.w  [[R1:\$w[0-9]+]], 0([[G_PTR]])
123
124   ret void
125 }
126
127 define void @const_v2i64() nounwind {
128   ; ALL-LABEL: const_v2i64:
129
130   store volatile <2 x i64> <i64 0, i64 0>, <2 x i64>*@v2i64
131   ; ALL: ldi.b [[R1:\$w[0-9]+]], 0
132
133   store volatile <2 x i64> <i64 72340172838076673, i64 72340172838076673>, <2 x i64>*@v2i64
134   ; ALL: ldi.b [[R1:\$w[0-9]+]], 1
135
136   store volatile <2 x i64> <i64 281479271743489, i64 281479271743489>, <2 x i64>*@v2i64
137   ; ALL: ldi.h [[R1:\$w[0-9]+]], 1
138
139   store volatile <2 x i64> <i64 4294967297, i64 4294967297>, <2 x i64>*@v2i64
140   ; ALL: ldi.w [[R1:\$w[0-9]+]], 1
141
142   store volatile <2 x i64> <i64 1, i64 1>, <2 x i64>*@v2i64
143   ; ALL: ldi.d [[R1:\$w[0-9]+]], 1
144
145   store volatile <2 x i64> <i64 1, i64 31>, <2 x i64>*@v2i64
146   ; O32: addiu [[G_PTR:\$[0-9]+]], {{.*}}, %lo($
147   ; N32: addiu [[G_PTR:\$[0-9]+]], {{.*}}, %got_ofst($
148   ; N64: daddiu [[G_PTR:\$[0-9]+]], {{.*}}, %got_ofst($
149   ; MIPS32: ld.w [[R1:\$w[0-9]+]], 0([[G_PTR]])
150   ; MIPS64: ld.d [[R1:\$w[0-9]+]], 0([[G_PTR]])
151
152   store volatile <2 x i64> <i64 3, i64 4>, <2 x i64>*@v2i64
153   ; O32: addiu [[G_PTR:\$[0-9]+]], {{.*}}, %lo($
154   ; N32: addiu [[G_PTR:\$[0-9]+]], {{.*}}, %got_ofst($
155   ; N64: daddiu [[G_PTR:\$[0-9]+]], {{.*}}, %got_ofst($
156   ; MIPS32: ld.w  [[R1:\$w[0-9]+]], 0([[G_PTR]])
157   ; MIPS64: ld.d  [[R1:\$w[0-9]+]], 0([[G_PTR]])
158
159   ret void
160 }
161
162 define void @nonconst_v16i8(i8 signext %a, i8 signext %b, i8 signext %c, i8 signext %d, i8 signext %e, i8 signext %f, i8 signext %g, i8 signext %h) nounwind {
163   ; ALL-LABEL: nonconst_v16i8:
164
165   %1 = insertelement <16 x i8> undef, i8 %a, i32 0
166   %2 = insertelement <16 x i8> %1, i8 %b, i32 1
167   %3 = insertelement <16 x i8> %2, i8 %c, i32 2
168   %4 = insertelement <16 x i8> %3, i8 %d, i32 3
169   %5 = insertelement <16 x i8> %4, i8 %e, i32 4
170   %6 = insertelement <16 x i8> %5, i8 %f, i32 5
171   %7 = insertelement <16 x i8> %6, i8 %g, i32 6
172   %8 = insertelement <16 x i8> %7, i8 %h, i32 7
173   %9 = insertelement <16 x i8> %8, i8 %h, i32 8
174   %10 = insertelement <16 x i8> %9, i8 %h, i32 9
175   %11 = insertelement <16 x i8> %10, i8 %h, i32 10
176   %12 = insertelement <16 x i8> %11, i8 %h, i32 11
177   %13 = insertelement <16 x i8> %12, i8 %h, i32 12
178   %14 = insertelement <16 x i8> %13, i8 %h, i32 13
179   %15 = insertelement <16 x i8> %14, i8 %h, i32 14
180   %16 = insertelement <16 x i8> %15, i8 %h, i32 15
181   ; ALL-DAG: insert.b [[R1:\$w[0-9]+]][0], $4
182   ; ALL-DAG: insert.b [[R1]][1], $5
183   ; ALL-DAG: insert.b [[R1]][2], $6
184   ; ALL-DAG: insert.b [[R1]][3], $7
185   ; MIPS32-DAG: lw [[R2:\$[0-9]+]], 16($sp)
186   ; MIPS32-DAG: insert.b [[R1]][4], [[R2]]
187   ; MIPS64-DAG: insert.b [[R1]][4], $8
188   ; MIPS32-DAG: lw [[R3:\$[0-9]+]], 20($sp)
189   ; MIPS32-DAG: insert.b [[R1]][5], [[R3]]
190   ; MIPS64-DAG: insert.b [[R1]][5], $9
191   ; MIPS32-DAG: lw [[R4:\$[0-9]+]], 24($sp)
192   ; MIPS32-DAG: insert.b [[R1]][6], [[R4]]
193   ; MIPS64-DAG: insert.b [[R1]][6], $10
194   ; MIPS32-DAG: lw [[R5:\$[0-9]+]], 28($sp)
195   ; MIPS32-DAG: insert.b [[R1]][7], [[R5]]
196   ; MIPS64-DAG: insert.b [[R1]][7], [[R5:\$11]]
197   ; ALL-DAG: insert.b [[R1]][8], [[R5]]
198   ; ALL-DAG: insert.b [[R1]][9], [[R5]]
199   ; ALL-DAG: insert.b [[R1]][10], [[R5]]
200   ; ALL-DAG: insert.b [[R1]][11], [[R5]]
201   ; ALL-DAG: insert.b [[R1]][12], [[R5]]
202   ; ALL-DAG: insert.b [[R1]][13], [[R5]]
203   ; ALL-DAG: insert.b [[R1]][14], [[R5]]
204   ; ALL-DAG: insert.b [[R1]][15], [[R5]]
205
206   store volatile <16 x i8> %16, <16 x i8>*@v16i8
207
208   ret void
209 }
210
211 define void @nonconst_v8i16(i16 signext %a, i16 signext %b, i16 signext %c, i16 signext %d, i16 signext %e, i16 signext %f, i16 signext %g, i16 signext %h) nounwind {
212   ; ALL-LABEL: nonconst_v8i16:
213
214   %1 = insertelement <8 x i16> undef, i16 %a, i32 0
215   %2 = insertelement <8 x i16> %1, i16 %b, i32 1
216   %3 = insertelement <8 x i16> %2, i16 %c, i32 2
217   %4 = insertelement <8 x i16> %3, i16 %d, i32 3
218   %5 = insertelement <8 x i16> %4, i16 %e, i32 4
219   %6 = insertelement <8 x i16> %5, i16 %f, i32 5
220   %7 = insertelement <8 x i16> %6, i16 %g, i32 6
221   %8 = insertelement <8 x i16> %7, i16 %h, i32 7
222   ; ALL-DAG: insert.h [[R1:\$w[0-9]+]][0], $4
223   ; ALL-DAG: insert.h [[R1]][1], $5
224   ; ALL-DAG: insert.h [[R1]][2], $6
225   ; ALL-DAG: insert.h [[R1]][3], $7
226   ; MIPS32-DAG: lw [[R2:\$[0-9]+]], 16($sp)
227   ; MIPS32-DAG: insert.h [[R1]][4], [[R2]]
228   ; MIPS64-DAG: insert.h [[R1]][4], $8
229   ; MIPS32-DAG: lw [[R2:\$[0-9]+]], 20($sp)
230   ; MIPS32-DAG: insert.h [[R1]][5], [[R2]]
231   ; MIPS64-DAG: insert.h [[R1]][5], $9
232   ; MIPS32-DAG: lw [[R2:\$[0-9]+]], 24($sp)
233   ; MIPS32-DAG: insert.h [[R1]][6], [[R2]]
234   ; MIPS64-DAG: insert.h [[R1]][6], $10
235   ; MIPS32-DAG: lw [[R2:\$[0-9]+]], 28($sp)
236   ; MIPS32-DAG: insert.h [[R1]][7], [[R2]]
237   ; MIPS64-DAG: insert.h [[R1]][7], $11
238
239   store volatile <8 x i16> %8, <8 x i16>*@v8i16
240
241   ret void
242 }
243
244 define void @nonconst_v4i32(i32 signext %a, i32 signext %b, i32 signext %c, i32 signext %d) nounwind {
245   ; ALL-LABEL: nonconst_v4i32:
246
247   %1 = insertelement <4 x i32> undef, i32 %a, i32 0
248   %2 = insertelement <4 x i32> %1, i32 %b, i32 1
249   %3 = insertelement <4 x i32> %2, i32 %c, i32 2
250   %4 = insertelement <4 x i32> %3, i32 %d, i32 3
251   ; ALL: insert.w [[R1:\$w[0-9]+]][0], $4
252   ; ALL: insert.w [[R1]][1], $5
253   ; ALL: insert.w [[R1]][2], $6
254   ; ALL: insert.w [[R1]][3], $7
255
256   store volatile <4 x i32> %4, <4 x i32>*@v4i32
257
258   ret void
259 }
260
261 define void @nonconst_v2i64(i64 signext %a, i64 signext %b) nounwind {
262   ; ALL-LABEL: nonconst_v2i64:
263
264   %1 = insertelement <2 x i64> undef, i64 %a, i32 0
265   %2 = insertelement <2 x i64> %1, i64 %b, i32 1
266   ; MIPS32: insert.w [[R1:\$w[0-9]+]][0], $4
267   ; MIPS32: insert.w [[R1]][1], $5
268   ; MIPS32: insert.w [[R1]][2], $6
269   ; MIPS32: insert.w [[R1]][3], $7
270   ; MIPS64: insert.d [[R1:\$w[0-9]+]][0], $4
271   ; MIPS64: insert.d [[R1]][1], $5
272
273   store volatile <2 x i64> %2, <2 x i64>*@v2i64
274
275   ret void
276 }
277
278 define i32 @extract_sext_v16i8() nounwind {
279   ; ALL-LABEL: extract_sext_v16i8:
280
281   %1 = load <16 x i8>, <16 x i8>* @v16i8
282   ; ALL-DAG: ld.b [[R1:\$w[0-9]+]],
283
284   %2 = add <16 x i8> %1, %1
285   ; ALL-DAG: addv.b [[R2:\$w[0-9]+]], [[R1]], [[R1]]
286
287   %3 = extractelement <16 x i8> %2, i32 1
288   %4 = sext i8 %3 to i32
289   ; ALL-DAG: copy_s.b [[R3:\$[0-9]+]], [[R1]][1]
290   ; ALL-NOT: sll
291   ; ALL-NOT: sra
292
293   ret i32 %4
294 }
295
296 define i32 @extract_sext_v8i16() nounwind {
297   ; ALL-LABEL: extract_sext_v8i16:
298
299   %1 = load <8 x i16>, <8 x i16>* @v8i16
300   ; ALL-DAG: ld.h [[R1:\$w[0-9]+]],
301
302   %2 = add <8 x i16> %1, %1
303   ; ALL-DAG: addv.h [[R2:\$w[0-9]+]], [[R1]], [[R1]]
304
305   %3 = extractelement <8 x i16> %2, i32 1
306   %4 = sext i16 %3 to i32
307   ; ALL-DAG: copy_s.h [[R3:\$[0-9]+]], [[R1]][1]
308   ; ALL-NOT: sll
309   ; ALL-NOT: sra
310
311   ret i32 %4
312 }
313
314 define i32 @extract_sext_v4i32() nounwind {
315   ; ALL-LABEL: extract_sext_v4i32:
316
317   %1 = load <4 x i32>, <4 x i32>* @v4i32
318   ; ALL-DAG: ld.w [[R1:\$w[0-9]+]],
319
320   %2 = add <4 x i32> %1, %1
321   ; ALL-DAG: addv.w [[R2:\$w[0-9]+]], [[R1]], [[R1]]
322
323   %3 = extractelement <4 x i32> %2, i32 1
324   ; ALL-DAG: copy_s.w [[R3:\$[0-9]+]], [[R1]][1]
325
326   ret i32 %3
327 }
328
329 define i64 @extract_sext_v2i64() nounwind {
330   ; ALL-LABEL: extract_sext_v2i64:
331
332   %1 = load <2 x i64>, <2 x i64>* @v2i64
333   ; ALL-DAG: ld.d [[R1:\$w[0-9]+]],
334
335   %2 = add <2 x i64> %1, %1
336   ; ALL-DAG: addv.d [[R2:\$w[0-9]+]], [[R1]], [[R1]]
337
338   %3 = extractelement <2 x i64> %2, i32 1
339   ; MIPS32-DAG: copy_s.w [[R3:\$[0-9]+]], [[R1]][2]
340   ; MIPS32-DAG: copy_s.w [[R4:\$[0-9]+]], [[R1]][3]
341   ; MIPS64-DAG: copy_s.d [[R3:\$[0-9]+]], [[R1]][1]
342   ; ALL-NOT: sll
343   ; ALL-NOT: sra
344
345   ret i64 %3
346 }
347
348 define i32 @extract_zext_v16i8() nounwind {
349   ; ALL-LABEL: extract_zext_v16i8:
350
351   %1 = load <16 x i8>, <16 x i8>* @v16i8
352   ; ALL-DAG: ld.b [[R1:\$w[0-9]+]],
353
354   %2 = add <16 x i8> %1, %1
355   ; ALL-DAG: addv.b [[R2:\$w[0-9]+]], [[R1]], [[R1]]
356
357   %3 = extractelement <16 x i8> %2, i32 1
358   %4 = zext i8 %3 to i32
359   ; ALL-DAG: copy_u.b [[R3:\$[0-9]+]], [[R1]][1]
360   ; ALL-NOT: andi
361
362   ret i32 %4
363 }
364
365 define i32 @extract_zext_v8i16() nounwind {
366   ; ALL-LABEL: extract_zext_v8i16:
367
368   %1 = load <8 x i16>, <8 x i16>* @v8i16
369   ; ALL-DAG: ld.h [[R1:\$w[0-9]+]],
370
371   %2 = add <8 x i16> %1, %1
372   ; ALL-DAG: addv.h [[R2:\$w[0-9]+]], [[R1]], [[R1]]
373
374   %3 = extractelement <8 x i16> %2, i32 1
375   %4 = zext i16 %3 to i32
376   ; ALL-DAG: copy_u.h [[R3:\$[0-9]+]], [[R1]][1]
377   ; ALL-NOT: andi
378
379   ret i32 %4
380 }
381
382 define i32 @extract_zext_v4i32() nounwind {
383   ; ALL-LABEL: extract_zext_v4i32:
384
385   %1 = load <4 x i32>, <4 x i32>* @v4i32
386   ; ALL-DAG: ld.w [[R1:\$w[0-9]+]],
387
388   %2 = add <4 x i32> %1, %1
389   ; ALL-DAG: addv.w [[R2:\$w[0-9]+]], [[R1]], [[R1]]
390
391   %3 = extractelement <4 x i32> %2, i32 1
392   ; ALL-DAG: copy_{{[su]}}.w [[R3:\$[0-9]+]], [[R1]][1]
393
394   ret i32 %3
395 }
396
397 define i64 @extract_zext_v2i64() nounwind {
398   ; ALL-LABEL: extract_zext_v2i64:
399
400   %1 = load <2 x i64>, <2 x i64>* @v2i64
401   ; ALL-DAG: ld.d [[R1:\$w[0-9]+]],
402
403   %2 = add <2 x i64> %1, %1
404   ; ALL-DAG: addv.d [[R2:\$w[0-9]+]], [[R1]], [[R1]]
405
406   %3 = extractelement <2 x i64> %2, i32 1
407   ; MIPS32-DAG: copy_{{[su]}}.w [[R3:\$[0-9]+]], [[R1]][2]
408   ; MIPS32-DAG: copy_{{[su]}}.w [[R4:\$[0-9]+]], [[R1]][3]
409   ; MIPS64-DAG: copy_{{[su]}}.d [[R3:\$[0-9]+]], [[R1]][1]
410   ; ALL-NOT: andi
411
412   ret i64 %3
413 }
414
415 define i32 @extract_sext_v16i8_vidx() nounwind {
416   ; ALL-LABEL: extract_sext_v16i8_vidx:
417
418   %1 = load <16 x i8>, <16 x i8>* @v16i8
419   ; O32-DAG: lw [[PTR_V:\$[0-9]+]], %got(v16i8)(
420   ; N32-DAG: lw [[PTR_V:\$[0-9]+]], %got_disp(v16i8)(
421   ; N64-DAG: ld [[PTR_V:\$[0-9]+]], %got_disp(v16i8)(
422   ; ALL-DAG: ld.b [[R1:\$w[0-9]+]], 0([[PTR_V]])
423
424   %2 = add <16 x i8> %1, %1
425   ; ALL-DAG: addv.b [[R2:\$w[0-9]+]], [[R1]], [[R1]]
426
427   %3 = load i32, i32* @i32
428   ; O32-DAG: lw [[PTR_I:\$[0-9]+]], %got(i32)(
429   ; N32-DAG: lw [[PTR_I:\$[0-9]+]], %got_disp(i32)(
430   ; N64-DAG: ld [[PTR_I:\$[0-9]+]], %got_disp(i32)(
431   ; ALL-DAG: lw [[IDX:\$[0-9]+]], 0([[PTR_I]])
432
433   %4 = extractelement <16 x i8> %2, i32 %3
434   %5 = sext i8 %4 to i32
435   ; ALL-DAG: splat.b $w[[R3:[0-9]+]], [[R1]]{{\[}}[[IDX]]]
436   ; ALL-DAG: mfc1 [[R5:\$[0-9]+]], $f[[R3]]
437   ; ALL-DAG: sra [[R6:\$[0-9]+]], [[R5]], 24
438
439   ret i32 %5
440 }
441
442 define i32 @extract_sext_v8i16_vidx() nounwind {
443   ; ALL-LABEL: extract_sext_v8i16_vidx:
444
445   %1 = load <8 x i16>, <8 x i16>* @v8i16
446   ; O32-DAG: lw [[PTR_V:\$[0-9]+]], %got(v8i16)(
447   ; N32-DAG: lw [[PTR_V:\$[0-9]+]], %got_disp(v8i16)(
448   ; N64-DAG: ld [[PTR_V:\$[0-9]+]], %got_disp(v8i16)(
449   ; ALL-DAG: ld.h [[R1:\$w[0-9]+]], 0([[PTR_V]])
450
451   %2 = add <8 x i16> %1, %1
452   ; ALL-DAG: addv.h [[R2:\$w[0-9]+]], [[R1]], [[R1]]
453
454   %3 = load i32, i32* @i32
455   ; O32-DAG: lw [[PTR_I:\$[0-9]+]], %got(i32)(
456   ; N32-DAG: lw [[PTR_I:\$[0-9]+]], %got_disp(i32)(
457   ; N64-DAG: ld [[PTR_I:\$[0-9]+]], %got_disp(i32)(
458   ; ALL-DAG: lw [[IDX:\$[0-9]+]], 0([[PTR_I]])
459
460   %4 = extractelement <8 x i16> %2, i32 %3
461   %5 = sext i16 %4 to i32
462   ; ALL-DAG: splat.h $w[[R3:[0-9]+]], [[R1]]{{\[}}[[IDX]]]
463   ; ALL-DAG: mfc1 [[R5:\$[0-9]+]], $f[[R3]]
464   ; ALL-DAG: sra [[R6:\$[0-9]+]], [[R5]], 16
465
466   ret i32 %5
467 }
468
469 define i32 @extract_sext_v4i32_vidx() nounwind {
470   ; ALL-LABEL: extract_sext_v4i32_vidx:
471
472   %1 = load <4 x i32>, <4 x i32>* @v4i32
473   ; O32-DAG: lw [[PTR_V:\$[0-9]+]], %got(v4i32)(
474   ; N32-DAG: lw [[PTR_V:\$[0-9]+]], %got_disp(v4i32)(
475   ; N64-DAG: ld [[PTR_V:\$[0-9]+]], %got_disp(v4i32)(
476   ; ALL-DAG: ld.w [[R1:\$w[0-9]+]], 0([[PTR_V]])
477
478   %2 = add <4 x i32> %1, %1
479   ; ALL-DAG: addv.w [[R2:\$w[0-9]+]], [[R1]], [[R1]]
480
481   %3 = load i32, i32* @i32
482   ; O32-DAG: lw [[PTR_I:\$[0-9]+]], %got(i32)(
483   ; N32-DAG: lw [[PTR_I:\$[0-9]+]], %got_disp(i32)(
484   ; N64-DAG: ld [[PTR_I:\$[0-9]+]], %got_disp(i32)(
485   ; ALL-DAG: lw [[IDX:\$[0-9]+]], 0([[PTR_I]])
486
487   %4 = extractelement <4 x i32> %2, i32 %3
488   ; ALL-DAG: splat.w $w[[R3:[0-9]+]], [[R1]]{{\[}}[[IDX]]]
489   ; ALL-DAG: mfc1 [[R5:\$[0-9]+]], $f[[R3]]
490   ; ALL-NOT: sra
491
492   ret i32 %4
493 }
494
495 define i64 @extract_sext_v2i64_vidx() nounwind {
496   ; ALL-LABEL: extract_sext_v2i64_vidx:
497
498   %1 = load <2 x i64>, <2 x i64>* @v2i64
499   ; O32-DAG: lw [[PTR_V:\$[0-9]+]], %got(v2i64)(
500   ; N32-DAG: lw [[PTR_V:\$[0-9]+]], %got_disp(v2i64)(
501   ; N64-DAG: ld [[PTR_V:\$[0-9]+]], %got_disp(v2i64)(
502   ; ALL-DAG: ld.d [[R1:\$w[0-9]+]], 0([[PTR_V]])
503
504   %2 = add <2 x i64> %1, %1
505   ; ALL-DAG: addv.d [[R2:\$w[0-9]+]], [[R1]], [[R1]]
506
507   %3 = load i32, i32* @i32
508   ; O32-DAG: lw [[PTR_I:\$[0-9]+]], %got(i32)(
509   ; N32-DAG: lw [[PTR_I:\$[0-9]+]], %got_disp(i32)(
510   ; N64-DAG: ld [[PTR_I:\$[0-9]+]], %got_disp(i32)(
511   ; ALL-DAG: lw [[IDX:\$[0-9]+]], 0([[PTR_I]])
512
513   %4 = extractelement <2 x i64> %2, i32 %3
514   ; MIPS32-DAG: splat.w $w[[R3:[0-9]+]], [[R1]]{{\[}}[[IDX]]]
515   ; MIPS32-DAG: mfc1 [[R5:\$[0-9]+]], $f[[R3]]
516   ; MIPS32-DAG: splat.w $w[[R4:[0-9]+]], [[R1]]{{\[}}[[IDX]]]
517   ; MIPS32-DAG: mfc1 [[R6:\$[0-9]+]], $f[[R4]]
518   ; MIPS64-DAG: splat.d $w[[R3:[0-9]+]], [[R1]]{{\[}}[[IDX]]]
519   ; MIPS64-DAG: dmfc1 [[R5:\$[0-9]+]], $f[[R3]]
520   ; ALL-NOT: sra
521
522   ret i64 %4
523 }
524
525 define i32 @extract_zext_v16i8_vidx() nounwind {
526   ; ALL-LABEL: extract_zext_v16i8_vidx:
527
528   %1 = load <16 x i8>, <16 x i8>* @v16i8
529   ; O32-DAG: lw [[PTR_V:\$[0-9]+]], %got(v16i8)(
530   ; N32-DAG: lw [[PTR_V:\$[0-9]+]], %got_disp(v16i8)(
531   ; N64-DAG: ld [[PTR_V:\$[0-9]+]], %got_disp(v16i8)(
532   ; ALL-DAG: ld.b [[R1:\$w[0-9]+]], 0([[PTR_V]])
533
534   %2 = add <16 x i8> %1, %1
535   ; ALL-DAG: addv.b [[R2:\$w[0-9]+]], [[R1]], [[R1]]
536
537   %3 = load i32, i32* @i32
538   ; O32-DAG: lw [[PTR_I:\$[0-9]+]], %got(i32)(
539   ; N32-DAG: lw [[PTR_I:\$[0-9]+]], %got_disp(i32)(
540   ; N64-DAG: ld [[PTR_I:\$[0-9]+]], %got_disp(i32)(
541   ; ALL-DAG: lw [[IDX:\$[0-9]+]], 0([[PTR_I]])
542
543   %4 = extractelement <16 x i8> %2, i32 %3
544   %5 = zext i8 %4 to i32
545   ; ALL-DAG: splat.b $w[[R3:[0-9]+]], [[R1]]{{\[}}[[IDX]]]
546   ; ALL-DAG: mfc1 [[R5:\$[0-9]+]], $f[[R3]]
547   ; ALL-DAG: srl [[R6:\$[0-9]+]], [[R5]], 24
548
549   ret i32 %5
550 }
551
552 define i32 @extract_zext_v8i16_vidx() nounwind {
553   ; ALL-LABEL: extract_zext_v8i16_vidx:
554
555   %1 = load <8 x i16>, <8 x i16>* @v8i16
556   ; O32-DAG: lw [[PTR_V:\$[0-9]+]], %got(v8i16)(
557   ; N32-DAG: lw [[PTR_V:\$[0-9]+]], %got_disp(v8i16)(
558   ; N64-DAG: ld [[PTR_V:\$[0-9]+]], %got_disp(v8i16)(
559   ; ALL-DAG: ld.h [[R1:\$w[0-9]+]], 0([[PTR_V]])
560
561   %2 = add <8 x i16> %1, %1
562   ; ALL-DAG: addv.h [[R2:\$w[0-9]+]], [[R1]], [[R1]]
563
564   %3 = load i32, i32* @i32
565   ; O32-DAG: lw [[PTR_I:\$[0-9]+]], %got(i32)(
566   ; N32-DAG: lw [[PTR_I:\$[0-9]+]], %got_disp(i32)(
567   ; N64-DAG: ld [[PTR_I:\$[0-9]+]], %got_disp(i32)(
568   ; ALL-DAG: lw [[IDX:\$[0-9]+]], 0([[PTR_I]])
569
570   %4 = extractelement <8 x i16> %2, i32 %3
571   %5 = zext i16 %4 to i32
572   ; ALL-DAG: splat.h $w[[R3:[0-9]+]], [[R1]]{{\[}}[[IDX]]]
573   ; ALL-DAG: mfc1 [[R5:\$[0-9]+]], $f[[R3]]
574   ; ALL-DAG: srl [[R6:\$[0-9]+]], [[R5]], 16
575
576   ret i32 %5
577 }
578
579 define i32 @extract_zext_v4i32_vidx() nounwind {
580   ; ALL-LABEL: extract_zext_v4i32_vidx:
581
582   %1 = load <4 x i32>, <4 x i32>* @v4i32
583   ; O32-DAG: lw [[PTR_V:\$[0-9]+]], %got(v4i32)(
584   ; N32-DAG: lw [[PTR_V:\$[0-9]+]], %got_disp(v4i32)(
585   ; N64-DAG: ld [[PTR_V:\$[0-9]+]], %got_disp(v4i32)(
586   ; ALL-DAG: ld.w [[R1:\$w[0-9]+]], 0([[PTR_V]])
587
588   %2 = add <4 x i32> %1, %1
589   ; ALL-DAG: addv.w [[R2:\$w[0-9]+]], [[R1]], [[R1]]
590
591   %3 = load i32, i32* @i32
592   ; O32-DAG: lw [[PTR_I:\$[0-9]+]], %got(i32)(
593   ; N32-DAG: lw [[PTR_I:\$[0-9]+]], %got_disp(i32)(
594   ; N64-DAG: ld [[PTR_I:\$[0-9]+]], %got_disp(i32)(
595   ; ALL-DAG: lw [[IDX:\$[0-9]+]], 0([[PTR_I]])
596
597   %4 = extractelement <4 x i32> %2, i32 %3
598   ; ALL-DAG: splat.w $w[[R3:[0-9]+]], [[R1]]{{\[}}[[IDX]]]
599   ; ALL-DAG: mfc1 [[R5:\$[0-9]+]], $f[[R3]]
600   ; ALL-NOT: srl
601
602   ret i32 %4
603 }
604
605 define i64 @extract_zext_v2i64_vidx() nounwind {
606   ; ALL-LABEL: extract_zext_v2i64_vidx:
607
608   %1 = load <2 x i64>, <2 x i64>* @v2i64
609   ; O32-DAG: lw [[PTR_V:\$[0-9]+]], %got(v2i64)(
610   ; N32-DAG: lw [[PTR_V:\$[0-9]+]], %got_disp(v2i64)(
611   ; N64-DAG: ld [[PTR_V:\$[0-9]+]], %got_disp(v2i64)(
612   ; ALL-DAG: ld.d [[R1:\$w[0-9]+]], 0([[PTR_V]])
613
614   %2 = add <2 x i64> %1, %1
615   ; ALL-DAG: addv.d [[R2:\$w[0-9]+]], [[R1]], [[R1]]
616
617   %3 = load i32, i32* @i32
618   ; O32-DAG: lw [[PTR_I:\$[0-9]+]], %got(i32)(
619   ; N32-DAG: lw [[PTR_I:\$[0-9]+]], %got_disp(i32)(
620   ; N64-DAG: ld [[PTR_I:\$[0-9]+]], %got_disp(i32)(
621   ; ALL-DAG: lw [[IDX:\$[0-9]+]], 0([[PTR_I]])
622
623   %4 = extractelement <2 x i64> %2, i32 %3
624   ; MIPS32-DAG: splat.w $w[[R3:[0-9]+]], [[R1]]{{\[}}[[IDX]]]
625   ; MIPS32-DAG: mfc1 [[R5:\$[0-9]+]], $f[[R3]]
626   ; MIPS32-DAG: splat.w $w[[R4:[0-9]+]], [[R1]]{{\[}}[[IDX]]]
627   ; MIPS32-DAG: mfc1 [[R6:\$[0-9]+]], $f[[R4]]
628   ; MIPS64-DAG: splat.d $w[[R3:[0-9]+]], [[R1]]{{\[}}[[IDX]]]
629   ; MIPS64-DAG: dmfc1 [[R5:\$[0-9]+]], $f[[R3]]
630   ; ALL-NOT: srl
631
632   ret i64 %4
633 }
634
635 define void @insert_v16i8(i32 signext %a) nounwind {
636   ; ALL-LABEL: insert_v16i8:
637
638   %1 = load <16 x i8>, <16 x i8>* @v16i8
639   ; ALL-DAG: ld.b [[R1:\$w[0-9]+]],
640
641   %a2 = trunc i32 %a to i8
642   %a3 = sext i8 %a2 to i32
643   %a4 = trunc i32 %a3 to i8
644   ; ALL-NOT: andi
645   ; ALL-NOT: sra
646
647   %2 = insertelement <16 x i8> %1, i8 %a4, i32 1
648   ; ALL-DAG: insert.b [[R1]][1], $4
649
650   store <16 x i8> %2, <16 x i8>* @v16i8
651   ; ALL-DAG: st.b [[R1]]
652
653   ret void
654 }
655
656 define void @insert_v8i16(i32 signext %a) nounwind {
657   ; ALL-LABEL: insert_v8i16:
658
659   %1 = load <8 x i16>, <8 x i16>* @v8i16
660   ; ALL-DAG: ld.h [[R1:\$w[0-9]+]],
661
662   %a2 = trunc i32 %a to i16
663   %a3 = sext i16 %a2 to i32
664   %a4 = trunc i32 %a3 to i16
665   ; ALL-NOT: andi
666   ; ALL-NOT: sra
667
668   %2 = insertelement <8 x i16> %1, i16 %a4, i32 1
669   ; ALL-DAG: insert.h [[R1]][1], $4
670
671   store <8 x i16> %2, <8 x i16>* @v8i16
672   ; ALL-DAG: st.h [[R1]]
673
674   ret void
675 }
676
677 define void @insert_v4i32(i32 signext %a) nounwind {
678   ; ALL-LABEL: insert_v4i32:
679
680   %1 = load <4 x i32>, <4 x i32>* @v4i32
681   ; ALL-DAG: ld.w [[R1:\$w[0-9]+]],
682
683   ; ALL-NOT: andi
684   ; ALL-NOT: sra
685
686   %2 = insertelement <4 x i32> %1, i32 %a, i32 1
687   ; ALL-DAG: insert.w [[R1]][1], $4
688
689   store <4 x i32> %2, <4 x i32>* @v4i32
690   ; ALL-DAG: st.w [[R1]]
691
692   ret void
693 }
694
695 define void @insert_v2i64(i64 signext %a) nounwind {
696   ; ALL-LABEL: insert_v2i64:
697
698   %1 = load <2 x i64>, <2 x i64>* @v2i64
699   ; MIPS32-DAG: ld.w [[R1:\$w[0-9]+]],
700   ; MIPS64-DAG: ld.d [[R1:\$w[0-9]+]],
701
702   ; ALL-NOT: andi
703   ; ALL-NOT: sra
704
705   %2 = insertelement <2 x i64> %1, i64 %a, i32 1
706   ; MIPS32-DAG: insert.w [[R1]][2], $4
707   ; MIPS32-DAG: insert.w [[R1]][3], $5
708   ; MIPS64-DAG: insert.d [[R1]][1], $4
709
710   store <2 x i64> %2, <2 x i64>* @v2i64
711   ; MIPS32-DAG: st.w [[R1]]
712   ; MIPS64-DAG: st.d [[R1]]
713
714   ret void
715 }
716
717 define void @insert_v16i8_vidx(i32 signext %a) nounwind {
718   ; ALL-LABEL: insert_v16i8_vidx:
719
720   %1 = load <16 x i8>, <16 x i8>* @v16i8
721   ; ALL-DAG: ld.b [[R1:\$w[0-9]+]],
722
723   %2 = load i32, i32* @i32
724   ; O32-DAG: lw [[PTR_I:\$[0-9]+]], %got(i32)(
725   ; N32-DAG: lw [[PTR_I:\$[0-9]+]], %got_disp(i32)(
726   ; N64-DAG: ld [[PTR_I:\$[0-9]+]], %got_disp(i32)(
727   ; ALL-DAG: lw [[IDX:\$[0-9]+]], 0([[PTR_I]])
728
729   %a2 = trunc i32 %a to i8
730   %a3 = sext i8 %a2 to i32
731   %a4 = trunc i32 %a3 to i8
732   ; ALL-NOT: andi
733   ; ALL-NOT: sra
734
735   %3 = insertelement <16 x i8> %1, i8 %a4, i32 %2
736   ; ALL-DAG: sld.b [[R1]], [[R1]]{{\[}}[[IDX]]]
737   ; ALL-DAG: insert.b [[R1]][0], $4
738   ; O32-DAG: neg [[NIDX:\$[0-9]+]], [[IDX]]
739   ; N32-DAG: neg [[NIDX:\$[0-9]+]], [[IDX]]
740   ; N64-DAG: dneg [[NIDX:\$[0-9]+]], [[IDX]]
741   ; ALL-DAG: sld.b [[R1]], [[R1]]{{\[}}[[NIDX]]]
742
743   store <16 x i8> %3, <16 x i8>* @v16i8
744   ; ALL-DAG: st.b [[R1]]
745
746   ret void
747 }
748
749 define void @insert_v8i16_vidx(i32 signext %a) nounwind {
750   ; ALL-LABEL: insert_v8i16_vidx:
751
752   %1 = load <8 x i16>, <8 x i16>* @v8i16
753   ; ALL-DAG: ld.h [[R1:\$w[0-9]+]],
754
755   %2 = load i32, i32* @i32
756   ; O32-DAG: lw [[PTR_I:\$[0-9]+]], %got(i32)(
757   ; N32-DAG: lw [[PTR_I:\$[0-9]+]], %got_disp(i32)(
758   ; N64-DAG: ld [[PTR_I:\$[0-9]+]], %got_disp(i32)(
759   ; ALL-DAG: lw [[IDX:\$[0-9]+]], 0([[PTR_I]])
760
761   %a2 = trunc i32 %a to i16
762   %a3 = sext i16 %a2 to i32
763   %a4 = trunc i32 %a3 to i16
764   ; ALL-NOT: andi
765   ; ALL-NOT: sra
766
767   %3 = insertelement <8 x i16> %1, i16 %a4, i32 %2
768   ; ALL-DAG: sll [[BIDX:\$[0-9]+]], [[IDX]], 1
769   ; ALL-DAG: sld.b [[R1]], [[R1]]{{\[}}[[BIDX]]]
770   ; ALL-DAG: insert.h [[R1]][0], $4
771   ; O32-DAG: neg [[NIDX:\$[0-9]+]], [[BIDX]]
772   ; N32-DAG: neg [[NIDX:\$[0-9]+]], [[BIDX]]
773   ; N64-DAG: dneg [[NIDX:\$[0-9]+]], [[BIDX]]
774   ; ALL-DAG: sld.b [[R1]], [[R1]]{{\[}}[[NIDX]]]
775
776   store <8 x i16> %3, <8 x i16>* @v8i16
777   ; ALL-DAG: st.h [[R1]]
778
779   ret void
780 }
781
782 define void @insert_v4i32_vidx(i32 signext %a) nounwind {
783   ; ALL-LABEL: insert_v4i32_vidx:
784
785   %1 = load <4 x i32>, <4 x i32>* @v4i32
786   ; ALL-DAG: ld.w [[R1:\$w[0-9]+]],
787
788   %2 = load i32, i32* @i32
789   ; O32-DAG: lw [[PTR_I:\$[0-9]+]], %got(i32)(
790   ; N32-DAG: lw [[PTR_I:\$[0-9]+]], %got_disp(i32)(
791   ; N64-DAG: ld [[PTR_I:\$[0-9]+]], %got_disp(i32)(
792   ; ALL-DAG: lw [[IDX:\$[0-9]+]], 0([[PTR_I]])
793
794   ; ALL-NOT: andi
795   ; ALL-NOT: sra
796
797   %3 = insertelement <4 x i32> %1, i32 %a, i32 %2
798   ; ALL-DAG: sll [[BIDX:\$[0-9]+]], [[IDX]], 2
799   ; ALL-DAG: sld.b [[R1]], [[R1]]{{\[}}[[BIDX]]]
800   ; ALL-DAG: insert.w [[R1]][0], $4
801   ; O32-DAG: neg [[NIDX:\$[0-9]+]], [[BIDX]]
802   ; N32-DAG: neg [[NIDX:\$[0-9]+]], [[BIDX]]
803   ; N64-DAG: dneg [[NIDX:\$[0-9]+]], [[BIDX]]
804   ; ALL-DAG: sld.b [[R1]], [[R1]]{{\[}}[[NIDX]]]
805
806   store <4 x i32> %3, <4 x i32>* @v4i32
807   ; ALL-DAG: st.w [[R1]]
808
809   ret void
810 }
811
812 define void @insert_v2i64_vidx(i64 signext %a) nounwind {
813   ; ALL-LABEL: insert_v2i64_vidx:
814
815   %1 = load <2 x i64>, <2 x i64>* @v2i64
816   ; MIPS32-DAG: ld.w [[R1:\$w[0-9]+]],
817   ; MIPS64-DAG: ld.d [[R1:\$w[0-9]+]],
818
819   %2 = load i32, i32* @i32
820   ; O32-DAG: lw [[PTR_I:\$[0-9]+]], %got(i32)(
821   ; N32-DAG: lw [[PTR_I:\$[0-9]+]], %got_disp(i32)(
822   ; N64-DAG: ld [[PTR_I:\$[0-9]+]], %got_disp(i32)(
823   ; ALL-DAG: lw [[IDX:\$[0-9]+]], 0([[PTR_I]])
824
825   ; ALL-NOT: andi
826   ; ALL-NOT: sra
827
828   %3 = insertelement <2 x i64> %1, i64 %a, i32 %2
829   ; TODO: This code could be a lot better but it works. The legalizer splits
830   ; 64-bit inserts into two 32-bit inserts because there is no i64 type on
831   ; MIPS32. The obvious optimisation is to perform both insert.w's at once while
832   ; the vector is rotated.
833   ; MIPS32-DAG: sll [[BIDX:\$[0-9]+]], [[IDX]], 2
834   ; MIPS32-DAG: sld.b [[R1]], [[R1]]{{\[}}[[BIDX]]]
835   ; MIPS32-DAG: insert.w [[R1]][0], $4
836   ; MIPS32-DAG: neg [[NIDX:\$[0-9]+]], [[BIDX]]
837   ; MIPS32-DAG: sld.b [[R1]], [[R1]]{{\[}}[[NIDX]]]
838   ; MIPS32-DAG: addiu [[IDX2:\$[0-9]+]], [[IDX]], 1
839   ; MIPS32-DAG: sll [[BIDX:\$[0-9]+]], [[IDX2]], 2
840   ; MIPS32-DAG: sld.b [[R1]], [[R1]]{{\[}}[[BIDX]]]
841   ; MIPS32-DAG: insert.w [[R1]][0], $5
842   ; MIPS32-DAG: neg [[NIDX:\$[0-9]+]], [[BIDX]]
843   ; MIPS32-DAG: sld.b [[R1]], [[R1]]{{\[}}[[NIDX]]]
844
845   ; MIPS64-DAG: sll [[BIDX:\$[0-9]+]], [[IDX]], 3
846   ; MIPS64-DAG: sld.b [[R1]], [[R1]]{{\[}}[[BIDX]]]
847   ; MIPS64-DAG: insert.d [[R1]][0], $4
848   ; N32-DAG: neg [[NIDX:\$[0-9]+]], [[BIDX]]
849   ; N64-DAG: dneg [[NIDX:\$[0-9]+]], [[BIDX]]
850   ; MIPS64-DAG: sld.b [[R1]], [[R1]]{{\[}}[[NIDX]]]
851
852   store <2 x i64> %3, <2 x i64>* @v2i64
853   ; MIPS32-DAG: st.w [[R1]]
854   ; MIPS64-DAG: st.d [[R1]]
855
856   ret void
857 }
858
859 define void @truncstore() nounwind {
860   ; ALL-LABEL: truncstore:
861
862   store volatile <4 x i8> <i8 -1, i8 -1, i8 -1, i8 -1>, <4 x i8>*@v4i8
863   ; TODO: What code should be emitted?
864
865   ret void
866 }