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