[mips][msa] Added support for matching mulv, nlzc, sll, sra, srl, and subv from norma...
[oota-llvm.git] / test / CodeGen / Mips / msa / 3r-s.ll
1 ; Test the MSA intrinsics that are encoded with the 3R instruction format.
2 ; There are lots of these so this covers those beginning with 's'
3
4 ; RUN: llc -march=mips -mattr=+msa < %s | FileCheck %s
5
6 @llvm_mips_sld_b_ARG1 = global <16 x i8> <i8 0, i8 1, i8 2, i8 3, i8 4, i8 5, i8 6, i8 7, i8 8, i8 9, i8 10, i8 11, i8 12, i8 13, i8 14, i8 15>, align 16
7 @llvm_mips_sld_b_ARG2 = global <16 x i8> <i8 16, i8 17, i8 18, i8 19, i8 20, i8 21, i8 22, i8 23, i8 24, i8 25, i8 26, i8 27, i8 28, i8 29, i8 30, i8 31>, align 16
8 @llvm_mips_sld_b_RES  = 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>, align 16
9
10 define void @llvm_mips_sld_b_test() nounwind {
11 entry:
12   %0 = load <16 x i8>* @llvm_mips_sld_b_ARG1
13   %1 = load <16 x i8>* @llvm_mips_sld_b_ARG2
14   %2 = tail call <16 x i8> @llvm.mips.sld.b(<16 x i8> %0, <16 x i8> %1)
15   store <16 x i8> %2, <16 x i8>* @llvm_mips_sld_b_RES
16   ret void
17 }
18
19 declare <16 x i8> @llvm.mips.sld.b(<16 x i8>, <16 x i8>) nounwind
20
21 ; CHECK: llvm_mips_sld_b_test:
22 ; CHECK: ld.b
23 ; CHECK: ld.b
24 ; CHECK: sld.b
25 ; CHECK: st.b
26 ; CHECK: .size llvm_mips_sld_b_test
27 ;
28 @llvm_mips_sld_h_ARG1 = global <8 x i16> <i16 0, i16 1, i16 2, i16 3, i16 4, i16 5, i16 6, i16 7>, align 16
29 @llvm_mips_sld_h_ARG2 = global <8 x i16> <i16 8, i16 9, i16 10, i16 11, i16 12, i16 13, i16 14, i16 15>, align 16
30 @llvm_mips_sld_h_RES  = global <8 x i16> <i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0>, align 16
31
32 define void @llvm_mips_sld_h_test() nounwind {
33 entry:
34   %0 = load <8 x i16>* @llvm_mips_sld_h_ARG1
35   %1 = load <8 x i16>* @llvm_mips_sld_h_ARG2
36   %2 = tail call <8 x i16> @llvm.mips.sld.h(<8 x i16> %0, <8 x i16> %1)
37   store <8 x i16> %2, <8 x i16>* @llvm_mips_sld_h_RES
38   ret void
39 }
40
41 declare <8 x i16> @llvm.mips.sld.h(<8 x i16>, <8 x i16>) nounwind
42
43 ; CHECK: llvm_mips_sld_h_test:
44 ; CHECK: ld.h
45 ; CHECK: ld.h
46 ; CHECK: sld.h
47 ; CHECK: st.h
48 ; CHECK: .size llvm_mips_sld_h_test
49 ;
50 @llvm_mips_sld_w_ARG1 = global <4 x i32> <i32 0, i32 1, i32 2, i32 3>, align 16
51 @llvm_mips_sld_w_ARG2 = global <4 x i32> <i32 4, i32 5, i32 6, i32 7>, align 16
52 @llvm_mips_sld_w_RES  = global <4 x i32> <i32 0, i32 0, i32 0, i32 0>, align 16
53
54 define void @llvm_mips_sld_w_test() nounwind {
55 entry:
56   %0 = load <4 x i32>* @llvm_mips_sld_w_ARG1
57   %1 = load <4 x i32>* @llvm_mips_sld_w_ARG2
58   %2 = tail call <4 x i32> @llvm.mips.sld.w(<4 x i32> %0, <4 x i32> %1)
59   store <4 x i32> %2, <4 x i32>* @llvm_mips_sld_w_RES
60   ret void
61 }
62
63 declare <4 x i32> @llvm.mips.sld.w(<4 x i32>, <4 x i32>) nounwind
64
65 ; CHECK: llvm_mips_sld_w_test:
66 ; CHECK: ld.w
67 ; CHECK: ld.w
68 ; CHECK: sld.w
69 ; CHECK: st.w
70 ; CHECK: .size llvm_mips_sld_w_test
71 ;
72 @llvm_mips_sld_d_ARG1 = global <2 x i64> <i64 0, i64 1>, align 16
73 @llvm_mips_sld_d_ARG2 = global <2 x i64> <i64 2, i64 3>, align 16
74 @llvm_mips_sld_d_RES  = global <2 x i64> <i64 0, i64 0>, align 16
75
76 define void @llvm_mips_sld_d_test() nounwind {
77 entry:
78   %0 = load <2 x i64>* @llvm_mips_sld_d_ARG1
79   %1 = load <2 x i64>* @llvm_mips_sld_d_ARG2
80   %2 = tail call <2 x i64> @llvm.mips.sld.d(<2 x i64> %0, <2 x i64> %1)
81   store <2 x i64> %2, <2 x i64>* @llvm_mips_sld_d_RES
82   ret void
83 }
84
85 declare <2 x i64> @llvm.mips.sld.d(<2 x i64>, <2 x i64>) nounwind
86
87 ; CHECK: llvm_mips_sld_d_test:
88 ; CHECK: ld.d
89 ; CHECK: ld.d
90 ; CHECK: sld.d
91 ; CHECK: st.d
92 ; CHECK: .size llvm_mips_sld_d_test
93 ;
94 @llvm_mips_sll_b_ARG1 = global <16 x i8> <i8 0, i8 1, i8 2, i8 3, i8 4, i8 5, i8 6, i8 7, i8 8, i8 9, i8 10, i8 11, i8 12, i8 13, i8 14, i8 15>, align 16
95 @llvm_mips_sll_b_ARG2 = global <16 x i8> <i8 16, i8 17, i8 18, i8 19, i8 20, i8 21, i8 22, i8 23, i8 24, i8 25, i8 26, i8 27, i8 28, i8 29, i8 30, i8 31>, align 16
96 @llvm_mips_sll_b_RES  = 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>, align 16
97
98 define void @llvm_mips_sll_b_test() nounwind {
99 entry:
100   %0 = load <16 x i8>* @llvm_mips_sll_b_ARG1
101   %1 = load <16 x i8>* @llvm_mips_sll_b_ARG2
102   %2 = tail call <16 x i8> @llvm.mips.sll.b(<16 x i8> %0, <16 x i8> %1)
103   store <16 x i8> %2, <16 x i8>* @llvm_mips_sll_b_RES
104   ret void
105 }
106
107 declare <16 x i8> @llvm.mips.sll.b(<16 x i8>, <16 x i8>) nounwind
108
109 ; CHECK: llvm_mips_sll_b_test:
110 ; CHECK: ld.b
111 ; CHECK: ld.b
112 ; CHECK: sll.b
113 ; CHECK: st.b
114 ; CHECK: .size llvm_mips_sll_b_test
115 ;
116 @llvm_mips_sll_h_ARG1 = global <8 x i16> <i16 0, i16 1, i16 2, i16 3, i16 4, i16 5, i16 6, i16 7>, align 16
117 @llvm_mips_sll_h_ARG2 = global <8 x i16> <i16 8, i16 9, i16 10, i16 11, i16 12, i16 13, i16 14, i16 15>, align 16
118 @llvm_mips_sll_h_RES  = global <8 x i16> <i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0>, align 16
119
120 define void @llvm_mips_sll_h_test() nounwind {
121 entry:
122   %0 = load <8 x i16>* @llvm_mips_sll_h_ARG1
123   %1 = load <8 x i16>* @llvm_mips_sll_h_ARG2
124   %2 = tail call <8 x i16> @llvm.mips.sll.h(<8 x i16> %0, <8 x i16> %1)
125   store <8 x i16> %2, <8 x i16>* @llvm_mips_sll_h_RES
126   ret void
127 }
128
129 declare <8 x i16> @llvm.mips.sll.h(<8 x i16>, <8 x i16>) nounwind
130
131 ; CHECK: llvm_mips_sll_h_test:
132 ; CHECK: ld.h
133 ; CHECK: ld.h
134 ; CHECK: sll.h
135 ; CHECK: st.h
136 ; CHECK: .size llvm_mips_sll_h_test
137 ;
138 @llvm_mips_sll_w_ARG1 = global <4 x i32> <i32 0, i32 1, i32 2, i32 3>, align 16
139 @llvm_mips_sll_w_ARG2 = global <4 x i32> <i32 4, i32 5, i32 6, i32 7>, align 16
140 @llvm_mips_sll_w_RES  = global <4 x i32> <i32 0, i32 0, i32 0, i32 0>, align 16
141
142 define void @llvm_mips_sll_w_test() nounwind {
143 entry:
144   %0 = load <4 x i32>* @llvm_mips_sll_w_ARG1
145   %1 = load <4 x i32>* @llvm_mips_sll_w_ARG2
146   %2 = tail call <4 x i32> @llvm.mips.sll.w(<4 x i32> %0, <4 x i32> %1)
147   store <4 x i32> %2, <4 x i32>* @llvm_mips_sll_w_RES
148   ret void
149 }
150
151 declare <4 x i32> @llvm.mips.sll.w(<4 x i32>, <4 x i32>) nounwind
152
153 ; CHECK: llvm_mips_sll_w_test:
154 ; CHECK: ld.w
155 ; CHECK: ld.w
156 ; CHECK: sll.w
157 ; CHECK: st.w
158 ; CHECK: .size llvm_mips_sll_w_test
159 ;
160 @llvm_mips_sll_d_ARG1 = global <2 x i64> <i64 0, i64 1>, align 16
161 @llvm_mips_sll_d_ARG2 = global <2 x i64> <i64 2, i64 3>, align 16
162 @llvm_mips_sll_d_RES  = global <2 x i64> <i64 0, i64 0>, align 16
163
164 define void @llvm_mips_sll_d_test() nounwind {
165 entry:
166   %0 = load <2 x i64>* @llvm_mips_sll_d_ARG1
167   %1 = load <2 x i64>* @llvm_mips_sll_d_ARG2
168   %2 = tail call <2 x i64> @llvm.mips.sll.d(<2 x i64> %0, <2 x i64> %1)
169   store <2 x i64> %2, <2 x i64>* @llvm_mips_sll_d_RES
170   ret void
171 }
172
173 declare <2 x i64> @llvm.mips.sll.d(<2 x i64>, <2 x i64>) nounwind
174
175 ; CHECK: llvm_mips_sll_d_test:
176 ; CHECK: ld.d
177 ; CHECK: ld.d
178 ; CHECK: sll.d
179 ; CHECK: st.d
180 ; CHECK: .size llvm_mips_sll_d_test
181
182 define void @sll_b_test() nounwind {
183 entry:
184   %0 = load <16 x i8>* @llvm_mips_sll_b_ARG1
185   %1 = load <16 x i8>* @llvm_mips_sll_b_ARG2
186   %2 = shl <16 x i8> %0, %1
187   store <16 x i8> %2, <16 x i8>* @llvm_mips_sll_b_RES
188   ret void
189 }
190
191 ; CHECK: sll_b_test:
192 ; CHECK: ld.b
193 ; CHECK: ld.b
194 ; CHECK: sll.b
195 ; CHECK: st.b
196 ; CHECK: .size sll_b_test
197
198 define void @sll_h_test() nounwind {
199 entry:
200   %0 = load <8 x i16>* @llvm_mips_sll_h_ARG1
201   %1 = load <8 x i16>* @llvm_mips_sll_h_ARG2
202   %2 = shl <8 x i16> %0, %1
203   store <8 x i16> %2, <8 x i16>* @llvm_mips_sll_h_RES
204   ret void
205 }
206
207 ; CHECK: sll_h_test:
208 ; CHECK: ld.h
209 ; CHECK: ld.h
210 ; CHECK: sll.h
211 ; CHECK: st.h
212 ; CHECK: .size sll_h_test
213
214 define void @sll_w_test() nounwind {
215 entry:
216   %0 = load <4 x i32>* @llvm_mips_sll_w_ARG1
217   %1 = load <4 x i32>* @llvm_mips_sll_w_ARG2
218   %2 = shl <4 x i32> %0, %1
219   store <4 x i32> %2, <4 x i32>* @llvm_mips_sll_w_RES
220   ret void
221 }
222
223 ; CHECK: sll_w_test:
224 ; CHECK: ld.w
225 ; CHECK: ld.w
226 ; CHECK: sll.w
227 ; CHECK: st.w
228 ; CHECK: .size sll_w_test
229
230 define void @sll_d_test() nounwind {
231 entry:
232   %0 = load <2 x i64>* @llvm_mips_sll_d_ARG1
233   %1 = load <2 x i64>* @llvm_mips_sll_d_ARG2
234   %2 = shl <2 x i64> %0, %1
235   store <2 x i64> %2, <2 x i64>* @llvm_mips_sll_d_RES
236   ret void
237 }
238
239 ; CHECK: sll_d_test:
240 ; CHECK: ld.d
241 ; CHECK: ld.d
242 ; CHECK: sll.d
243 ; CHECK: st.d
244 ; CHECK: .size sll_d_test
245 ;
246 @llvm_mips_sra_b_ARG1 = global <16 x i8> <i8 0, i8 1, i8 2, i8 3, i8 4, i8 5, i8 6, i8 7, i8 8, i8 9, i8 10, i8 11, i8 12, i8 13, i8 14, i8 15>, align 16
247 @llvm_mips_sra_b_ARG2 = global <16 x i8> <i8 16, i8 17, i8 18, i8 19, i8 20, i8 21, i8 22, i8 23, i8 24, i8 25, i8 26, i8 27, i8 28, i8 29, i8 30, i8 31>, align 16
248 @llvm_mips_sra_b_RES  = 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>, align 16
249
250 define void @llvm_mips_sra_b_test() nounwind {
251 entry:
252   %0 = load <16 x i8>* @llvm_mips_sra_b_ARG1
253   %1 = load <16 x i8>* @llvm_mips_sra_b_ARG2
254   %2 = tail call <16 x i8> @llvm.mips.sra.b(<16 x i8> %0, <16 x i8> %1)
255   store <16 x i8> %2, <16 x i8>* @llvm_mips_sra_b_RES
256   ret void
257 }
258
259 declare <16 x i8> @llvm.mips.sra.b(<16 x i8>, <16 x i8>) nounwind
260
261 ; CHECK: llvm_mips_sra_b_test:
262 ; CHECK: ld.b
263 ; CHECK: ld.b
264 ; CHECK: sra.b
265 ; CHECK: st.b
266 ; CHECK: .size llvm_mips_sra_b_test
267 ;
268 @llvm_mips_sra_h_ARG1 = global <8 x i16> <i16 0, i16 1, i16 2, i16 3, i16 4, i16 5, i16 6, i16 7>, align 16
269 @llvm_mips_sra_h_ARG2 = global <8 x i16> <i16 8, i16 9, i16 10, i16 11, i16 12, i16 13, i16 14, i16 15>, align 16
270 @llvm_mips_sra_h_RES  = global <8 x i16> <i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0>, align 16
271
272 define void @llvm_mips_sra_h_test() nounwind {
273 entry:
274   %0 = load <8 x i16>* @llvm_mips_sra_h_ARG1
275   %1 = load <8 x i16>* @llvm_mips_sra_h_ARG2
276   %2 = tail call <8 x i16> @llvm.mips.sra.h(<8 x i16> %0, <8 x i16> %1)
277   store <8 x i16> %2, <8 x i16>* @llvm_mips_sra_h_RES
278   ret void
279 }
280
281 declare <8 x i16> @llvm.mips.sra.h(<8 x i16>, <8 x i16>) nounwind
282
283 ; CHECK: llvm_mips_sra_h_test:
284 ; CHECK: ld.h
285 ; CHECK: ld.h
286 ; CHECK: sra.h
287 ; CHECK: st.h
288 ; CHECK: .size llvm_mips_sra_h_test
289 ;
290 @llvm_mips_sra_w_ARG1 = global <4 x i32> <i32 0, i32 1, i32 2, i32 3>, align 16
291 @llvm_mips_sra_w_ARG2 = global <4 x i32> <i32 4, i32 5, i32 6, i32 7>, align 16
292 @llvm_mips_sra_w_RES  = global <4 x i32> <i32 0, i32 0, i32 0, i32 0>, align 16
293
294 define void @llvm_mips_sra_w_test() nounwind {
295 entry:
296   %0 = load <4 x i32>* @llvm_mips_sra_w_ARG1
297   %1 = load <4 x i32>* @llvm_mips_sra_w_ARG2
298   %2 = tail call <4 x i32> @llvm.mips.sra.w(<4 x i32> %0, <4 x i32> %1)
299   store <4 x i32> %2, <4 x i32>* @llvm_mips_sra_w_RES
300   ret void
301 }
302
303 declare <4 x i32> @llvm.mips.sra.w(<4 x i32>, <4 x i32>) nounwind
304
305 ; CHECK: llvm_mips_sra_w_test:
306 ; CHECK: ld.w
307 ; CHECK: ld.w
308 ; CHECK: sra.w
309 ; CHECK: st.w
310 ; CHECK: .size llvm_mips_sra_w_test
311 ;
312 @llvm_mips_sra_d_ARG1 = global <2 x i64> <i64 0, i64 1>, align 16
313 @llvm_mips_sra_d_ARG2 = global <2 x i64> <i64 2, i64 3>, align 16
314 @llvm_mips_sra_d_RES  = global <2 x i64> <i64 0, i64 0>, align 16
315
316 define void @llvm_mips_sra_d_test() nounwind {
317 entry:
318   %0 = load <2 x i64>* @llvm_mips_sra_d_ARG1
319   %1 = load <2 x i64>* @llvm_mips_sra_d_ARG2
320   %2 = tail call <2 x i64> @llvm.mips.sra.d(<2 x i64> %0, <2 x i64> %1)
321   store <2 x i64> %2, <2 x i64>* @llvm_mips_sra_d_RES
322   ret void
323 }
324
325 declare <2 x i64> @llvm.mips.sra.d(<2 x i64>, <2 x i64>) nounwind
326
327 ; CHECK: llvm_mips_sra_d_test:
328 ; CHECK: ld.d
329 ; CHECK: ld.d
330 ; CHECK: sra.d
331 ; CHECK: st.d
332 ; CHECK: .size llvm_mips_sra_d_test
333 ;
334
335 define void @sra_b_test() nounwind {
336 entry:
337   %0 = load <16 x i8>* @llvm_mips_sra_b_ARG1
338   %1 = load <16 x i8>* @llvm_mips_sra_b_ARG2
339   %2 = ashr <16 x i8> %0, %1
340   store <16 x i8> %2, <16 x i8>* @llvm_mips_sra_b_RES
341   ret void
342 }
343
344 ; CHECK: sra_b_test:
345 ; CHECK: ld.b
346 ; CHECK: ld.b
347 ; CHECK: sra.b
348 ; CHECK: st.b
349 ; CHECK: .size sra_b_test
350
351 define void @sra_h_test() nounwind {
352 entry:
353   %0 = load <8 x i16>* @llvm_mips_sra_h_ARG1
354   %1 = load <8 x i16>* @llvm_mips_sra_h_ARG2
355   %2 = ashr <8 x i16> %0, %1
356   store <8 x i16> %2, <8 x i16>* @llvm_mips_sra_h_RES
357   ret void
358 }
359
360 ; CHECK: sra_h_test:
361 ; CHECK: ld.h
362 ; CHECK: ld.h
363 ; CHECK: sra.h
364 ; CHECK: st.h
365 ; CHECK: .size sra_h_test
366
367 define void @sra_w_test() nounwind {
368 entry:
369   %0 = load <4 x i32>* @llvm_mips_sra_w_ARG1
370   %1 = load <4 x i32>* @llvm_mips_sra_w_ARG2
371   %2 = ashr <4 x i32> %0, %1
372   store <4 x i32> %2, <4 x i32>* @llvm_mips_sra_w_RES
373   ret void
374 }
375
376 ; CHECK: sra_w_test:
377 ; CHECK: ld.w
378 ; CHECK: ld.w
379 ; CHECK: sra.w
380 ; CHECK: st.w
381 ; CHECK: .size sra_w_test
382
383 define void @sra_d_test() nounwind {
384 entry:
385   %0 = load <2 x i64>* @llvm_mips_sra_d_ARG1
386   %1 = load <2 x i64>* @llvm_mips_sra_d_ARG2
387   %2 = ashr <2 x i64> %0, %1
388   store <2 x i64> %2, <2 x i64>* @llvm_mips_sra_d_RES
389   ret void
390 }
391
392 ; CHECK: sra_d_test:
393 ; CHECK: ld.d
394 ; CHECK: ld.d
395 ; CHECK: sra.d
396 ; CHECK: st.d
397 ; CHECK: .size sra_d_test
398
399 @llvm_mips_srar_b_ARG1 = global <16 x i8> <i8 0, i8 1, i8 2, i8 3, i8 4, i8 5, i8 6, i8 7, i8 8, i8 9, i8 10, i8 11, i8 12, i8 13, i8 14, i8 15>, align 16
400 @llvm_mips_srar_b_ARG2 = global <16 x i8> <i8 16, i8 17, i8 18, i8 19, i8 20, i8 21, i8 22, i8 23, i8 24, i8 25, i8 26, i8 27, i8 28, i8 29, i8 30, i8 31>, align 16
401 @llvm_mips_srar_b_RES  = 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>, align 16
402
403 define void @llvm_mips_srar_b_test() nounwind {
404 entry:
405   %0 = load <16 x i8>* @llvm_mips_srar_b_ARG1
406   %1 = load <16 x i8>* @llvm_mips_srar_b_ARG2
407   %2 = tail call <16 x i8> @llvm.mips.srar.b(<16 x i8> %0, <16 x i8> %1)
408   store <16 x i8> %2, <16 x i8>* @llvm_mips_srar_b_RES
409   ret void
410 }
411
412 declare <16 x i8> @llvm.mips.srar.b(<16 x i8>, <16 x i8>) nounwind
413
414 ; CHECK: llvm_mips_srar_b_test:
415 ; CHECK: ld.b
416 ; CHECK: ld.b
417 ; CHECK: srar.b
418 ; CHECK: st.b
419 ; CHECK: .size llvm_mips_srar_b_test
420 ;
421 @llvm_mips_srar_h_ARG1 = global <8 x i16> <i16 0, i16 1, i16 2, i16 3, i16 4, i16 5, i16 6, i16 7>, align 16
422 @llvm_mips_srar_h_ARG2 = global <8 x i16> <i16 8, i16 9, i16 10, i16 11, i16 12, i16 13, i16 14, i16 15>, align 16
423 @llvm_mips_srar_h_RES  = global <8 x i16> <i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0>, align 16
424
425 define void @llvm_mips_srar_h_test() nounwind {
426 entry:
427   %0 = load <8 x i16>* @llvm_mips_srar_h_ARG1
428   %1 = load <8 x i16>* @llvm_mips_srar_h_ARG2
429   %2 = tail call <8 x i16> @llvm.mips.srar.h(<8 x i16> %0, <8 x i16> %1)
430   store <8 x i16> %2, <8 x i16>* @llvm_mips_srar_h_RES
431   ret void
432 }
433
434 declare <8 x i16> @llvm.mips.srar.h(<8 x i16>, <8 x i16>) nounwind
435
436 ; CHECK: llvm_mips_srar_h_test:
437 ; CHECK: ld.h
438 ; CHECK: ld.h
439 ; CHECK: srar.h
440 ; CHECK: st.h
441 ; CHECK: .size llvm_mips_srar_h_test
442 ;
443 @llvm_mips_srar_w_ARG1 = global <4 x i32> <i32 0, i32 1, i32 2, i32 3>, align 16
444 @llvm_mips_srar_w_ARG2 = global <4 x i32> <i32 4, i32 5, i32 6, i32 7>, align 16
445 @llvm_mips_srar_w_RES  = global <4 x i32> <i32 0, i32 0, i32 0, i32 0>, align 16
446
447 define void @llvm_mips_srar_w_test() nounwind {
448 entry:
449   %0 = load <4 x i32>* @llvm_mips_srar_w_ARG1
450   %1 = load <4 x i32>* @llvm_mips_srar_w_ARG2
451   %2 = tail call <4 x i32> @llvm.mips.srar.w(<4 x i32> %0, <4 x i32> %1)
452   store <4 x i32> %2, <4 x i32>* @llvm_mips_srar_w_RES
453   ret void
454 }
455
456 declare <4 x i32> @llvm.mips.srar.w(<4 x i32>, <4 x i32>) nounwind
457
458 ; CHECK: llvm_mips_srar_w_test:
459 ; CHECK: ld.w
460 ; CHECK: ld.w
461 ; CHECK: srar.w
462 ; CHECK: st.w
463 ; CHECK: .size llvm_mips_srar_w_test
464 ;
465 @llvm_mips_srar_d_ARG1 = global <2 x i64> <i64 0, i64 1>, align 16
466 @llvm_mips_srar_d_ARG2 = global <2 x i64> <i64 2, i64 3>, align 16
467 @llvm_mips_srar_d_RES  = global <2 x i64> <i64 0, i64 0>, align 16
468
469 define void @llvm_mips_srar_d_test() nounwind {
470 entry:
471   %0 = load <2 x i64>* @llvm_mips_srar_d_ARG1
472   %1 = load <2 x i64>* @llvm_mips_srar_d_ARG2
473   %2 = tail call <2 x i64> @llvm.mips.srar.d(<2 x i64> %0, <2 x i64> %1)
474   store <2 x i64> %2, <2 x i64>* @llvm_mips_srar_d_RES
475   ret void
476 }
477
478 declare <2 x i64> @llvm.mips.srar.d(<2 x i64>, <2 x i64>) nounwind
479
480 ; CHECK: llvm_mips_srar_d_test:
481 ; CHECK: ld.d
482 ; CHECK: ld.d
483 ; CHECK: srar.d
484 ; CHECK: st.d
485 ; CHECK: .size llvm_mips_srar_d_test
486 ;
487 @llvm_mips_srl_b_ARG1 = global <16 x i8> <i8 0, i8 1, i8 2, i8 3, i8 4, i8 5, i8 6, i8 7, i8 8, i8 9, i8 10, i8 11, i8 12, i8 13, i8 14, i8 15>, align 16
488 @llvm_mips_srl_b_ARG2 = global <16 x i8> <i8 16, i8 17, i8 18, i8 19, i8 20, i8 21, i8 22, i8 23, i8 24, i8 25, i8 26, i8 27, i8 28, i8 29, i8 30, i8 31>, align 16
489 @llvm_mips_srl_b_RES  = 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>, align 16
490
491 define void @llvm_mips_srl_b_test() nounwind {
492 entry:
493   %0 = load <16 x i8>* @llvm_mips_srl_b_ARG1
494   %1 = load <16 x i8>* @llvm_mips_srl_b_ARG2
495   %2 = tail call <16 x i8> @llvm.mips.srl.b(<16 x i8> %0, <16 x i8> %1)
496   store <16 x i8> %2, <16 x i8>* @llvm_mips_srl_b_RES
497   ret void
498 }
499
500 declare <16 x i8> @llvm.mips.srl.b(<16 x i8>, <16 x i8>) nounwind
501
502 ; CHECK: llvm_mips_srl_b_test:
503 ; CHECK: ld.b
504 ; CHECK: ld.b
505 ; CHECK: srl.b
506 ; CHECK: st.b
507 ; CHECK: .size llvm_mips_srl_b_test
508 ;
509 @llvm_mips_srl_h_ARG1 = global <8 x i16> <i16 0, i16 1, i16 2, i16 3, i16 4, i16 5, i16 6, i16 7>, align 16
510 @llvm_mips_srl_h_ARG2 = global <8 x i16> <i16 8, i16 9, i16 10, i16 11, i16 12, i16 13, i16 14, i16 15>, align 16
511 @llvm_mips_srl_h_RES  = global <8 x i16> <i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0>, align 16
512
513 define void @llvm_mips_srl_h_test() nounwind {
514 entry:
515   %0 = load <8 x i16>* @llvm_mips_srl_h_ARG1
516   %1 = load <8 x i16>* @llvm_mips_srl_h_ARG2
517   %2 = tail call <8 x i16> @llvm.mips.srl.h(<8 x i16> %0, <8 x i16> %1)
518   store <8 x i16> %2, <8 x i16>* @llvm_mips_srl_h_RES
519   ret void
520 }
521
522 declare <8 x i16> @llvm.mips.srl.h(<8 x i16>, <8 x i16>) nounwind
523
524 ; CHECK: llvm_mips_srl_h_test:
525 ; CHECK: ld.h
526 ; CHECK: ld.h
527 ; CHECK: srl.h
528 ; CHECK: st.h
529 ; CHECK: .size llvm_mips_srl_h_test
530 ;
531 @llvm_mips_srl_w_ARG1 = global <4 x i32> <i32 0, i32 1, i32 2, i32 3>, align 16
532 @llvm_mips_srl_w_ARG2 = global <4 x i32> <i32 4, i32 5, i32 6, i32 7>, align 16
533 @llvm_mips_srl_w_RES  = global <4 x i32> <i32 0, i32 0, i32 0, i32 0>, align 16
534
535 define void @llvm_mips_srl_w_test() nounwind {
536 entry:
537   %0 = load <4 x i32>* @llvm_mips_srl_w_ARG1
538   %1 = load <4 x i32>* @llvm_mips_srl_w_ARG2
539   %2 = tail call <4 x i32> @llvm.mips.srl.w(<4 x i32> %0, <4 x i32> %1)
540   store <4 x i32> %2, <4 x i32>* @llvm_mips_srl_w_RES
541   ret void
542 }
543
544 declare <4 x i32> @llvm.mips.srl.w(<4 x i32>, <4 x i32>) nounwind
545
546 ; CHECK: llvm_mips_srl_w_test:
547 ; CHECK: ld.w
548 ; CHECK: ld.w
549 ; CHECK: srl.w
550 ; CHECK: st.w
551 ; CHECK: .size llvm_mips_srl_w_test
552 ;
553 @llvm_mips_srl_d_ARG1 = global <2 x i64> <i64 0, i64 1>, align 16
554 @llvm_mips_srl_d_ARG2 = global <2 x i64> <i64 2, i64 3>, align 16
555 @llvm_mips_srl_d_RES  = global <2 x i64> <i64 0, i64 0>, align 16
556
557 define void @llvm_mips_srl_d_test() nounwind {
558 entry:
559   %0 = load <2 x i64>* @llvm_mips_srl_d_ARG1
560   %1 = load <2 x i64>* @llvm_mips_srl_d_ARG2
561   %2 = tail call <2 x i64> @llvm.mips.srl.d(<2 x i64> %0, <2 x i64> %1)
562   store <2 x i64> %2, <2 x i64>* @llvm_mips_srl_d_RES
563   ret void
564 }
565
566 declare <2 x i64> @llvm.mips.srl.d(<2 x i64>, <2 x i64>) nounwind
567
568 ; CHECK: llvm_mips_srl_d_test:
569 ; CHECK: ld.d
570 ; CHECK: ld.d
571 ; CHECK: srl.d
572 ; CHECK: st.d
573 ; CHECK: .size llvm_mips_srl_d_test
574 ;
575 @llvm_mips_srlr_b_ARG1 = global <16 x i8> <i8 0, i8 1, i8 2, i8 3, i8 4, i8 5, i8 6, i8 7, i8 8, i8 9, i8 10, i8 11, i8 12, i8 13, i8 14, i8 15>, align 16
576 @llvm_mips_srlr_b_ARG2 = global <16 x i8> <i8 16, i8 17, i8 18, i8 19, i8 20, i8 21, i8 22, i8 23, i8 24, i8 25, i8 26, i8 27, i8 28, i8 29, i8 30, i8 31>, align 16
577 @llvm_mips_srlr_b_RES  = 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>, align 16
578
579 define void @llvm_mips_srlr_b_test() nounwind {
580 entry:
581   %0 = load <16 x i8>* @llvm_mips_srlr_b_ARG1
582   %1 = load <16 x i8>* @llvm_mips_srlr_b_ARG2
583   %2 = tail call <16 x i8> @llvm.mips.srlr.b(<16 x i8> %0, <16 x i8> %1)
584   store <16 x i8> %2, <16 x i8>* @llvm_mips_srlr_b_RES
585   ret void
586 }
587
588 declare <16 x i8> @llvm.mips.srlr.b(<16 x i8>, <16 x i8>) nounwind
589
590 ; CHECK: llvm_mips_srlr_b_test:
591 ; CHECK: ld.b
592 ; CHECK: ld.b
593 ; CHECK: srlr.b
594 ; CHECK: st.b
595 ; CHECK: .size llvm_mips_srlr_b_test
596 ;
597 @llvm_mips_srlr_h_ARG1 = global <8 x i16> <i16 0, i16 1, i16 2, i16 3, i16 4, i16 5, i16 6, i16 7>, align 16
598 @llvm_mips_srlr_h_ARG2 = global <8 x i16> <i16 8, i16 9, i16 10, i16 11, i16 12, i16 13, i16 14, i16 15>, align 16
599 @llvm_mips_srlr_h_RES  = global <8 x i16> <i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0>, align 16
600
601 define void @llvm_mips_srlr_h_test() nounwind {
602 entry:
603   %0 = load <8 x i16>* @llvm_mips_srlr_h_ARG1
604   %1 = load <8 x i16>* @llvm_mips_srlr_h_ARG2
605   %2 = tail call <8 x i16> @llvm.mips.srlr.h(<8 x i16> %0, <8 x i16> %1)
606   store <8 x i16> %2, <8 x i16>* @llvm_mips_srlr_h_RES
607   ret void
608 }
609
610 declare <8 x i16> @llvm.mips.srlr.h(<8 x i16>, <8 x i16>) nounwind
611
612 ; CHECK: llvm_mips_srlr_h_test:
613 ; CHECK: ld.h
614 ; CHECK: ld.h
615 ; CHECK: srlr.h
616 ; CHECK: st.h
617 ; CHECK: .size llvm_mips_srlr_h_test
618 ;
619 @llvm_mips_srlr_w_ARG1 = global <4 x i32> <i32 0, i32 1, i32 2, i32 3>, align 16
620 @llvm_mips_srlr_w_ARG2 = global <4 x i32> <i32 4, i32 5, i32 6, i32 7>, align 16
621 @llvm_mips_srlr_w_RES  = global <4 x i32> <i32 0, i32 0, i32 0, i32 0>, align 16
622
623 define void @llvm_mips_srlr_w_test() nounwind {
624 entry:
625   %0 = load <4 x i32>* @llvm_mips_srlr_w_ARG1
626   %1 = load <4 x i32>* @llvm_mips_srlr_w_ARG2
627   %2 = tail call <4 x i32> @llvm.mips.srlr.w(<4 x i32> %0, <4 x i32> %1)
628   store <4 x i32> %2, <4 x i32>* @llvm_mips_srlr_w_RES
629   ret void
630 }
631
632 declare <4 x i32> @llvm.mips.srlr.w(<4 x i32>, <4 x i32>) nounwind
633
634 ; CHECK: llvm_mips_srlr_w_test:
635 ; CHECK: ld.w
636 ; CHECK: ld.w
637 ; CHECK: srlr.w
638 ; CHECK: st.w
639 ; CHECK: .size llvm_mips_srlr_w_test
640 ;
641 @llvm_mips_srlr_d_ARG1 = global <2 x i64> <i64 0, i64 1>, align 16
642 @llvm_mips_srlr_d_ARG2 = global <2 x i64> <i64 2, i64 3>, align 16
643 @llvm_mips_srlr_d_RES  = global <2 x i64> <i64 0, i64 0>, align 16
644
645 define void @llvm_mips_srlr_d_test() nounwind {
646 entry:
647   %0 = load <2 x i64>* @llvm_mips_srlr_d_ARG1
648   %1 = load <2 x i64>* @llvm_mips_srlr_d_ARG2
649   %2 = tail call <2 x i64> @llvm.mips.srlr.d(<2 x i64> %0, <2 x i64> %1)
650   store <2 x i64> %2, <2 x i64>* @llvm_mips_srlr_d_RES
651   ret void
652 }
653
654 declare <2 x i64> @llvm.mips.srlr.d(<2 x i64>, <2 x i64>) nounwind
655
656 ; CHECK: llvm_mips_srlr_d_test:
657 ; CHECK: ld.d
658 ; CHECK: ld.d
659 ; CHECK: srlr.d
660 ; CHECK: st.d
661 ; CHECK: .size llvm_mips_srlr_d_test
662 ;
663
664 define void @srl_b_test() nounwind {
665 entry:
666   %0 = load <16 x i8>* @llvm_mips_srl_b_ARG1
667   %1 = load <16 x i8>* @llvm_mips_srl_b_ARG2
668   %2 = lshr <16 x i8> %0, %1
669   store <16 x i8> %2, <16 x i8>* @llvm_mips_srl_b_RES
670   ret void
671 }
672
673 ; CHECK: srl_b_test:
674 ; CHECK: ld.b
675 ; CHECK: ld.b
676 ; CHECK: srl.b
677 ; CHECK: st.b
678 ; CHECK: .size srl_b_test
679
680 define void @srl_h_test() nounwind {
681 entry:
682   %0 = load <8 x i16>* @llvm_mips_srl_h_ARG1
683   %1 = load <8 x i16>* @llvm_mips_srl_h_ARG2
684   %2 = lshr <8 x i16> %0, %1
685   store <8 x i16> %2, <8 x i16>* @llvm_mips_srl_h_RES
686   ret void
687 }
688
689 ; CHECK: srl_h_test:
690 ; CHECK: ld.h
691 ; CHECK: ld.h
692 ; CHECK: srl.h
693 ; CHECK: st.h
694 ; CHECK: .size srl_h_test
695
696 define void @srl_w_test() nounwind {
697 entry:
698   %0 = load <4 x i32>* @llvm_mips_srl_w_ARG1
699   %1 = load <4 x i32>* @llvm_mips_srl_w_ARG2
700   %2 = lshr <4 x i32> %0, %1
701   store <4 x i32> %2, <4 x i32>* @llvm_mips_srl_w_RES
702   ret void
703 }
704
705 ; CHECK: srl_w_test:
706 ; CHECK: ld.w
707 ; CHECK: ld.w
708 ; CHECK: srl.w
709 ; CHECK: st.w
710 ; CHECK: .size srl_w_test
711
712 define void @srl_d_test() nounwind {
713 entry:
714   %0 = load <2 x i64>* @llvm_mips_srl_d_ARG1
715   %1 = load <2 x i64>* @llvm_mips_srl_d_ARG2
716   %2 = lshr <2 x i64> %0, %1
717   store <2 x i64> %2, <2 x i64>* @llvm_mips_srl_d_RES
718   ret void
719 }
720
721 ; CHECK: srl_d_test:
722 ; CHECK: ld.d
723 ; CHECK: ld.d
724 ; CHECK: srl.d
725 ; CHECK: st.d
726 ; CHECK: .size srl_d_test
727
728 @llvm_mips_subs_s_b_ARG1 = global <16 x i8> <i8 0, i8 1, i8 2, i8 3, i8 4, i8 5, i8 6, i8 7, i8 8, i8 9, i8 10, i8 11, i8 12, i8 13, i8 14, i8 15>, align 16
729 @llvm_mips_subs_s_b_ARG2 = global <16 x i8> <i8 16, i8 17, i8 18, i8 19, i8 20, i8 21, i8 22, i8 23, i8 24, i8 25, i8 26, i8 27, i8 28, i8 29, i8 30, i8 31>, align 16
730 @llvm_mips_subs_s_b_RES  = 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>, align 16
731
732 define void @llvm_mips_subs_s_b_test() nounwind {
733 entry:
734   %0 = load <16 x i8>* @llvm_mips_subs_s_b_ARG1
735   %1 = load <16 x i8>* @llvm_mips_subs_s_b_ARG2
736   %2 = tail call <16 x i8> @llvm.mips.subs.s.b(<16 x i8> %0, <16 x i8> %1)
737   store <16 x i8> %2, <16 x i8>* @llvm_mips_subs_s_b_RES
738   ret void
739 }
740
741 declare <16 x i8> @llvm.mips.subs.s.b(<16 x i8>, <16 x i8>) nounwind
742
743 ; CHECK: llvm_mips_subs_s_b_test:
744 ; CHECK: ld.b
745 ; CHECK: ld.b
746 ; CHECK: subs_s.b
747 ; CHECK: st.b
748 ; CHECK: .size llvm_mips_subs_s_b_test
749 ;
750 @llvm_mips_subs_s_h_ARG1 = global <8 x i16> <i16 0, i16 1, i16 2, i16 3, i16 4, i16 5, i16 6, i16 7>, align 16
751 @llvm_mips_subs_s_h_ARG2 = global <8 x i16> <i16 8, i16 9, i16 10, i16 11, i16 12, i16 13, i16 14, i16 15>, align 16
752 @llvm_mips_subs_s_h_RES  = global <8 x i16> <i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0>, align 16
753
754 define void @llvm_mips_subs_s_h_test() nounwind {
755 entry:
756   %0 = load <8 x i16>* @llvm_mips_subs_s_h_ARG1
757   %1 = load <8 x i16>* @llvm_mips_subs_s_h_ARG2
758   %2 = tail call <8 x i16> @llvm.mips.subs.s.h(<8 x i16> %0, <8 x i16> %1)
759   store <8 x i16> %2, <8 x i16>* @llvm_mips_subs_s_h_RES
760   ret void
761 }
762
763 declare <8 x i16> @llvm.mips.subs.s.h(<8 x i16>, <8 x i16>) nounwind
764
765 ; CHECK: llvm_mips_subs_s_h_test:
766 ; CHECK: ld.h
767 ; CHECK: ld.h
768 ; CHECK: subs_s.h
769 ; CHECK: st.h
770 ; CHECK: .size llvm_mips_subs_s_h_test
771 ;
772 @llvm_mips_subs_s_w_ARG1 = global <4 x i32> <i32 0, i32 1, i32 2, i32 3>, align 16
773 @llvm_mips_subs_s_w_ARG2 = global <4 x i32> <i32 4, i32 5, i32 6, i32 7>, align 16
774 @llvm_mips_subs_s_w_RES  = global <4 x i32> <i32 0, i32 0, i32 0, i32 0>, align 16
775
776 define void @llvm_mips_subs_s_w_test() nounwind {
777 entry:
778   %0 = load <4 x i32>* @llvm_mips_subs_s_w_ARG1
779   %1 = load <4 x i32>* @llvm_mips_subs_s_w_ARG2
780   %2 = tail call <4 x i32> @llvm.mips.subs.s.w(<4 x i32> %0, <4 x i32> %1)
781   store <4 x i32> %2, <4 x i32>* @llvm_mips_subs_s_w_RES
782   ret void
783 }
784
785 declare <4 x i32> @llvm.mips.subs.s.w(<4 x i32>, <4 x i32>) nounwind
786
787 ; CHECK: llvm_mips_subs_s_w_test:
788 ; CHECK: ld.w
789 ; CHECK: ld.w
790 ; CHECK: subs_s.w
791 ; CHECK: st.w
792 ; CHECK: .size llvm_mips_subs_s_w_test
793 ;
794 @llvm_mips_subs_s_d_ARG1 = global <2 x i64> <i64 0, i64 1>, align 16
795 @llvm_mips_subs_s_d_ARG2 = global <2 x i64> <i64 2, i64 3>, align 16
796 @llvm_mips_subs_s_d_RES  = global <2 x i64> <i64 0, i64 0>, align 16
797
798 define void @llvm_mips_subs_s_d_test() nounwind {
799 entry:
800   %0 = load <2 x i64>* @llvm_mips_subs_s_d_ARG1
801   %1 = load <2 x i64>* @llvm_mips_subs_s_d_ARG2
802   %2 = tail call <2 x i64> @llvm.mips.subs.s.d(<2 x i64> %0, <2 x i64> %1)
803   store <2 x i64> %2, <2 x i64>* @llvm_mips_subs_s_d_RES
804   ret void
805 }
806
807 declare <2 x i64> @llvm.mips.subs.s.d(<2 x i64>, <2 x i64>) nounwind
808
809 ; CHECK: llvm_mips_subs_s_d_test:
810 ; CHECK: ld.d
811 ; CHECK: ld.d
812 ; CHECK: subs_s.d
813 ; CHECK: st.d
814 ; CHECK: .size llvm_mips_subs_s_d_test
815 ;
816 @llvm_mips_subs_u_b_ARG1 = global <16 x i8> <i8 0, i8 1, i8 2, i8 3, i8 4, i8 5, i8 6, i8 7, i8 8, i8 9, i8 10, i8 11, i8 12, i8 13, i8 14, i8 15>, align 16
817 @llvm_mips_subs_u_b_ARG2 = global <16 x i8> <i8 16, i8 17, i8 18, i8 19, i8 20, i8 21, i8 22, i8 23, i8 24, i8 25, i8 26, i8 27, i8 28, i8 29, i8 30, i8 31>, align 16
818 @llvm_mips_subs_u_b_RES  = 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>, align 16
819
820 define void @llvm_mips_subs_u_b_test() nounwind {
821 entry:
822   %0 = load <16 x i8>* @llvm_mips_subs_u_b_ARG1
823   %1 = load <16 x i8>* @llvm_mips_subs_u_b_ARG2
824   %2 = tail call <16 x i8> @llvm.mips.subs.u.b(<16 x i8> %0, <16 x i8> %1)
825   store <16 x i8> %2, <16 x i8>* @llvm_mips_subs_u_b_RES
826   ret void
827 }
828
829 declare <16 x i8> @llvm.mips.subs.u.b(<16 x i8>, <16 x i8>) nounwind
830
831 ; CHECK: llvm_mips_subs_u_b_test:
832 ; CHECK: ld.b
833 ; CHECK: ld.b
834 ; CHECK: subs_u.b
835 ; CHECK: st.b
836 ; CHECK: .size llvm_mips_subs_u_b_test
837 ;
838 @llvm_mips_subs_u_h_ARG1 = global <8 x i16> <i16 0, i16 1, i16 2, i16 3, i16 4, i16 5, i16 6, i16 7>, align 16
839 @llvm_mips_subs_u_h_ARG2 = global <8 x i16> <i16 8, i16 9, i16 10, i16 11, i16 12, i16 13, i16 14, i16 15>, align 16
840 @llvm_mips_subs_u_h_RES  = global <8 x i16> <i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0>, align 16
841
842 define void @llvm_mips_subs_u_h_test() nounwind {
843 entry:
844   %0 = load <8 x i16>* @llvm_mips_subs_u_h_ARG1
845   %1 = load <8 x i16>* @llvm_mips_subs_u_h_ARG2
846   %2 = tail call <8 x i16> @llvm.mips.subs.u.h(<8 x i16> %0, <8 x i16> %1)
847   store <8 x i16> %2, <8 x i16>* @llvm_mips_subs_u_h_RES
848   ret void
849 }
850
851 declare <8 x i16> @llvm.mips.subs.u.h(<8 x i16>, <8 x i16>) nounwind
852
853 ; CHECK: llvm_mips_subs_u_h_test:
854 ; CHECK: ld.h
855 ; CHECK: ld.h
856 ; CHECK: subs_u.h
857 ; CHECK: st.h
858 ; CHECK: .size llvm_mips_subs_u_h_test
859 ;
860 @llvm_mips_subs_u_w_ARG1 = global <4 x i32> <i32 0, i32 1, i32 2, i32 3>, align 16
861 @llvm_mips_subs_u_w_ARG2 = global <4 x i32> <i32 4, i32 5, i32 6, i32 7>, align 16
862 @llvm_mips_subs_u_w_RES  = global <4 x i32> <i32 0, i32 0, i32 0, i32 0>, align 16
863
864 define void @llvm_mips_subs_u_w_test() nounwind {
865 entry:
866   %0 = load <4 x i32>* @llvm_mips_subs_u_w_ARG1
867   %1 = load <4 x i32>* @llvm_mips_subs_u_w_ARG2
868   %2 = tail call <4 x i32> @llvm.mips.subs.u.w(<4 x i32> %0, <4 x i32> %1)
869   store <4 x i32> %2, <4 x i32>* @llvm_mips_subs_u_w_RES
870   ret void
871 }
872
873 declare <4 x i32> @llvm.mips.subs.u.w(<4 x i32>, <4 x i32>) nounwind
874
875 ; CHECK: llvm_mips_subs_u_w_test:
876 ; CHECK: ld.w
877 ; CHECK: ld.w
878 ; CHECK: subs_u.w
879 ; CHECK: st.w
880 ; CHECK: .size llvm_mips_subs_u_w_test
881 ;
882 @llvm_mips_subs_u_d_ARG1 = global <2 x i64> <i64 0, i64 1>, align 16
883 @llvm_mips_subs_u_d_ARG2 = global <2 x i64> <i64 2, i64 3>, align 16
884 @llvm_mips_subs_u_d_RES  = global <2 x i64> <i64 0, i64 0>, align 16
885
886 define void @llvm_mips_subs_u_d_test() nounwind {
887 entry:
888   %0 = load <2 x i64>* @llvm_mips_subs_u_d_ARG1
889   %1 = load <2 x i64>* @llvm_mips_subs_u_d_ARG2
890   %2 = tail call <2 x i64> @llvm.mips.subs.u.d(<2 x i64> %0, <2 x i64> %1)
891   store <2 x i64> %2, <2 x i64>* @llvm_mips_subs_u_d_RES
892   ret void
893 }
894
895 declare <2 x i64> @llvm.mips.subs.u.d(<2 x i64>, <2 x i64>) nounwind
896
897 ; CHECK: llvm_mips_subs_u_d_test:
898 ; CHECK: ld.d
899 ; CHECK: ld.d
900 ; CHECK: subs_u.d
901 ; CHECK: st.d
902 ; CHECK: .size llvm_mips_subs_u_d_test
903 ;
904 @llvm_mips_subsus_u_b_ARG1 = global <16 x i8> <i8 0, i8 1, i8 2, i8 3, i8 4, i8 5, i8 6, i8 7, i8 8, i8 9, i8 10, i8 11, i8 12, i8 13, i8 14, i8 15>, align 16
905 @llvm_mips_subsus_u_b_ARG2 = global <16 x i8> <i8 16, i8 17, i8 18, i8 19, i8 20, i8 21, i8 22, i8 23, i8 24, i8 25, i8 26, i8 27, i8 28, i8 29, i8 30, i8 31>, align 16
906 @llvm_mips_subsus_u_b_RES  = 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>, align 16
907
908 define void @llvm_mips_subsus_u_b_test() nounwind {
909 entry:
910   %0 = load <16 x i8>* @llvm_mips_subsus_u_b_ARG1
911   %1 = load <16 x i8>* @llvm_mips_subsus_u_b_ARG2
912   %2 = tail call <16 x i8> @llvm.mips.subsus.u.b(<16 x i8> %0, <16 x i8> %1)
913   store <16 x i8> %2, <16 x i8>* @llvm_mips_subsus_u_b_RES
914   ret void
915 }
916
917 declare <16 x i8> @llvm.mips.subsus.u.b(<16 x i8>, <16 x i8>) nounwind
918
919 ; CHECK: llvm_mips_subsus_u_b_test:
920 ; CHECK: ld.b
921 ; CHECK: ld.b
922 ; CHECK: subsus_u.b
923 ; CHECK: st.b
924 ; CHECK: .size llvm_mips_subsus_u_b_test
925 ;
926 @llvm_mips_subsus_u_h_ARG1 = global <8 x i16> <i16 0, i16 1, i16 2, i16 3, i16 4, i16 5, i16 6, i16 7>, align 16
927 @llvm_mips_subsus_u_h_ARG2 = global <8 x i16> <i16 8, i16 9, i16 10, i16 11, i16 12, i16 13, i16 14, i16 15>, align 16
928 @llvm_mips_subsus_u_h_RES  = global <8 x i16> <i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0>, align 16
929
930 define void @llvm_mips_subsus_u_h_test() nounwind {
931 entry:
932   %0 = load <8 x i16>* @llvm_mips_subsus_u_h_ARG1
933   %1 = load <8 x i16>* @llvm_mips_subsus_u_h_ARG2
934   %2 = tail call <8 x i16> @llvm.mips.subsus.u.h(<8 x i16> %0, <8 x i16> %1)
935   store <8 x i16> %2, <8 x i16>* @llvm_mips_subsus_u_h_RES
936   ret void
937 }
938
939 declare <8 x i16> @llvm.mips.subsus.u.h(<8 x i16>, <8 x i16>) nounwind
940
941 ; CHECK: llvm_mips_subsus_u_h_test:
942 ; CHECK: ld.h
943 ; CHECK: ld.h
944 ; CHECK: subsus_u.h
945 ; CHECK: st.h
946 ; CHECK: .size llvm_mips_subsus_u_h_test
947 ;
948 @llvm_mips_subsus_u_w_ARG1 = global <4 x i32> <i32 0, i32 1, i32 2, i32 3>, align 16
949 @llvm_mips_subsus_u_w_ARG2 = global <4 x i32> <i32 4, i32 5, i32 6, i32 7>, align 16
950 @llvm_mips_subsus_u_w_RES  = global <4 x i32> <i32 0, i32 0, i32 0, i32 0>, align 16
951
952 define void @llvm_mips_subsus_u_w_test() nounwind {
953 entry:
954   %0 = load <4 x i32>* @llvm_mips_subsus_u_w_ARG1
955   %1 = load <4 x i32>* @llvm_mips_subsus_u_w_ARG2
956   %2 = tail call <4 x i32> @llvm.mips.subsus.u.w(<4 x i32> %0, <4 x i32> %1)
957   store <4 x i32> %2, <4 x i32>* @llvm_mips_subsus_u_w_RES
958   ret void
959 }
960
961 declare <4 x i32> @llvm.mips.subsus.u.w(<4 x i32>, <4 x i32>) nounwind
962
963 ; CHECK: llvm_mips_subsus_u_w_test:
964 ; CHECK: ld.w
965 ; CHECK: ld.w
966 ; CHECK: subsus_u.w
967 ; CHECK: st.w
968 ; CHECK: .size llvm_mips_subsus_u_w_test
969 ;
970 @llvm_mips_subsus_u_d_ARG1 = global <2 x i64> <i64 0, i64 1>, align 16
971 @llvm_mips_subsus_u_d_ARG2 = global <2 x i64> <i64 2, i64 3>, align 16
972 @llvm_mips_subsus_u_d_RES  = global <2 x i64> <i64 0, i64 0>, align 16
973
974 define void @llvm_mips_subsus_u_d_test() nounwind {
975 entry:
976   %0 = load <2 x i64>* @llvm_mips_subsus_u_d_ARG1
977   %1 = load <2 x i64>* @llvm_mips_subsus_u_d_ARG2
978   %2 = tail call <2 x i64> @llvm.mips.subsus.u.d(<2 x i64> %0, <2 x i64> %1)
979   store <2 x i64> %2, <2 x i64>* @llvm_mips_subsus_u_d_RES
980   ret void
981 }
982
983 declare <2 x i64> @llvm.mips.subsus.u.d(<2 x i64>, <2 x i64>) nounwind
984
985 ; CHECK: llvm_mips_subsus_u_d_test:
986 ; CHECK: ld.d
987 ; CHECK: ld.d
988 ; CHECK: subsus_u.d
989 ; CHECK: st.d
990 ; CHECK: .size llvm_mips_subsus_u_d_test
991 ;
992 @llvm_mips_subsuu_s_b_ARG1 = global <16 x i8> <i8 0, i8 1, i8 2, i8 3, i8 4, i8 5, i8 6, i8 7, i8 8, i8 9, i8 10, i8 11, i8 12, i8 13, i8 14, i8 15>, align 16
993 @llvm_mips_subsuu_s_b_ARG2 = global <16 x i8> <i8 16, i8 17, i8 18, i8 19, i8 20, i8 21, i8 22, i8 23, i8 24, i8 25, i8 26, i8 27, i8 28, i8 29, i8 30, i8 31>, align 16
994 @llvm_mips_subsuu_s_b_RES  = 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>, align 16
995
996 define void @llvm_mips_subsuu_s_b_test() nounwind {
997 entry:
998   %0 = load <16 x i8>* @llvm_mips_subsuu_s_b_ARG1
999   %1 = load <16 x i8>* @llvm_mips_subsuu_s_b_ARG2
1000   %2 = tail call <16 x i8> @llvm.mips.subsuu.s.b(<16 x i8> %0, <16 x i8> %1)
1001   store <16 x i8> %2, <16 x i8>* @llvm_mips_subsuu_s_b_RES
1002   ret void
1003 }
1004
1005 declare <16 x i8> @llvm.mips.subsuu.s.b(<16 x i8>, <16 x i8>) nounwind
1006
1007 ; CHECK: llvm_mips_subsuu_s_b_test:
1008 ; CHECK: ld.b
1009 ; CHECK: ld.b
1010 ; CHECK: subsuu_s.b
1011 ; CHECK: st.b
1012 ; CHECK: .size llvm_mips_subsuu_s_b_test
1013 ;
1014 @llvm_mips_subsuu_s_h_ARG1 = global <8 x i16> <i16 0, i16 1, i16 2, i16 3, i16 4, i16 5, i16 6, i16 7>, align 16
1015 @llvm_mips_subsuu_s_h_ARG2 = global <8 x i16> <i16 8, i16 9, i16 10, i16 11, i16 12, i16 13, i16 14, i16 15>, align 16
1016 @llvm_mips_subsuu_s_h_RES  = global <8 x i16> <i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0>, align 16
1017
1018 define void @llvm_mips_subsuu_s_h_test() nounwind {
1019 entry:
1020   %0 = load <8 x i16>* @llvm_mips_subsuu_s_h_ARG1
1021   %1 = load <8 x i16>* @llvm_mips_subsuu_s_h_ARG2
1022   %2 = tail call <8 x i16> @llvm.mips.subsuu.s.h(<8 x i16> %0, <8 x i16> %1)
1023   store <8 x i16> %2, <8 x i16>* @llvm_mips_subsuu_s_h_RES
1024   ret void
1025 }
1026
1027 declare <8 x i16> @llvm.mips.subsuu.s.h(<8 x i16>, <8 x i16>) nounwind
1028
1029 ; CHECK: llvm_mips_subsuu_s_h_test:
1030 ; CHECK: ld.h
1031 ; CHECK: ld.h
1032 ; CHECK: subsuu_s.h
1033 ; CHECK: st.h
1034 ; CHECK: .size llvm_mips_subsuu_s_h_test
1035 ;
1036 @llvm_mips_subsuu_s_w_ARG1 = global <4 x i32> <i32 0, i32 1, i32 2, i32 3>, align 16
1037 @llvm_mips_subsuu_s_w_ARG2 = global <4 x i32> <i32 4, i32 5, i32 6, i32 7>, align 16
1038 @llvm_mips_subsuu_s_w_RES  = global <4 x i32> <i32 0, i32 0, i32 0, i32 0>, align 16
1039
1040 define void @llvm_mips_subsuu_s_w_test() nounwind {
1041 entry:
1042   %0 = load <4 x i32>* @llvm_mips_subsuu_s_w_ARG1
1043   %1 = load <4 x i32>* @llvm_mips_subsuu_s_w_ARG2
1044   %2 = tail call <4 x i32> @llvm.mips.subsuu.s.w(<4 x i32> %0, <4 x i32> %1)
1045   store <4 x i32> %2, <4 x i32>* @llvm_mips_subsuu_s_w_RES
1046   ret void
1047 }
1048
1049 declare <4 x i32> @llvm.mips.subsuu.s.w(<4 x i32>, <4 x i32>) nounwind
1050
1051 ; CHECK: llvm_mips_subsuu_s_w_test:
1052 ; CHECK: ld.w
1053 ; CHECK: ld.w
1054 ; CHECK: subsuu_s.w
1055 ; CHECK: st.w
1056 ; CHECK: .size llvm_mips_subsuu_s_w_test
1057 ;
1058 @llvm_mips_subsuu_s_d_ARG1 = global <2 x i64> <i64 0, i64 1>, align 16
1059 @llvm_mips_subsuu_s_d_ARG2 = global <2 x i64> <i64 2, i64 3>, align 16
1060 @llvm_mips_subsuu_s_d_RES  = global <2 x i64> <i64 0, i64 0>, align 16
1061
1062 define void @llvm_mips_subsuu_s_d_test() nounwind {
1063 entry:
1064   %0 = load <2 x i64>* @llvm_mips_subsuu_s_d_ARG1
1065   %1 = load <2 x i64>* @llvm_mips_subsuu_s_d_ARG2
1066   %2 = tail call <2 x i64> @llvm.mips.subsuu.s.d(<2 x i64> %0, <2 x i64> %1)
1067   store <2 x i64> %2, <2 x i64>* @llvm_mips_subsuu_s_d_RES
1068   ret void
1069 }
1070
1071 declare <2 x i64> @llvm.mips.subsuu.s.d(<2 x i64>, <2 x i64>) nounwind
1072
1073 ; CHECK: llvm_mips_subsuu_s_d_test:
1074 ; CHECK: ld.d
1075 ; CHECK: ld.d
1076 ; CHECK: subsuu_s.d
1077 ; CHECK: st.d
1078 ; CHECK: .size llvm_mips_subsuu_s_d_test
1079 ;
1080 @llvm_mips_subv_b_ARG1 = global <16 x i8> <i8 0, i8 1, i8 2, i8 3, i8 4, i8 5, i8 6, i8 7, i8 8, i8 9, i8 10, i8 11, i8 12, i8 13, i8 14, i8 15>, align 16
1081 @llvm_mips_subv_b_ARG2 = global <16 x i8> <i8 16, i8 17, i8 18, i8 19, i8 20, i8 21, i8 22, i8 23, i8 24, i8 25, i8 26, i8 27, i8 28, i8 29, i8 30, i8 31>, align 16
1082 @llvm_mips_subv_b_RES  = 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>, align 16
1083
1084 define void @llvm_mips_subv_b_test() nounwind {
1085 entry:
1086   %0 = load <16 x i8>* @llvm_mips_subv_b_ARG1
1087   %1 = load <16 x i8>* @llvm_mips_subv_b_ARG2
1088   %2 = tail call <16 x i8> @llvm.mips.subv.b(<16 x i8> %0, <16 x i8> %1)
1089   store <16 x i8> %2, <16 x i8>* @llvm_mips_subv_b_RES
1090   ret void
1091 }
1092
1093 declare <16 x i8> @llvm.mips.subv.b(<16 x i8>, <16 x i8>) nounwind
1094
1095 ; CHECK: llvm_mips_subv_b_test:
1096 ; CHECK: ld.b
1097 ; CHECK: ld.b
1098 ; CHECK: subv.b
1099 ; CHECK: st.b
1100 ; CHECK: .size llvm_mips_subv_b_test
1101 ;
1102 @llvm_mips_subv_h_ARG1 = global <8 x i16> <i16 0, i16 1, i16 2, i16 3, i16 4, i16 5, i16 6, i16 7>, align 16
1103 @llvm_mips_subv_h_ARG2 = global <8 x i16> <i16 8, i16 9, i16 10, i16 11, i16 12, i16 13, i16 14, i16 15>, align 16
1104 @llvm_mips_subv_h_RES  = global <8 x i16> <i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0>, align 16
1105
1106 define void @llvm_mips_subv_h_test() nounwind {
1107 entry:
1108   %0 = load <8 x i16>* @llvm_mips_subv_h_ARG1
1109   %1 = load <8 x i16>* @llvm_mips_subv_h_ARG2
1110   %2 = tail call <8 x i16> @llvm.mips.subv.h(<8 x i16> %0, <8 x i16> %1)
1111   store <8 x i16> %2, <8 x i16>* @llvm_mips_subv_h_RES
1112   ret void
1113 }
1114
1115 declare <8 x i16> @llvm.mips.subv.h(<8 x i16>, <8 x i16>) nounwind
1116
1117 ; CHECK: llvm_mips_subv_h_test:
1118 ; CHECK: ld.h
1119 ; CHECK: ld.h
1120 ; CHECK: subv.h
1121 ; CHECK: st.h
1122 ; CHECK: .size llvm_mips_subv_h_test
1123 ;
1124 @llvm_mips_subv_w_ARG1 = global <4 x i32> <i32 0, i32 1, i32 2, i32 3>, align 16
1125 @llvm_mips_subv_w_ARG2 = global <4 x i32> <i32 4, i32 5, i32 6, i32 7>, align 16
1126 @llvm_mips_subv_w_RES  = global <4 x i32> <i32 0, i32 0, i32 0, i32 0>, align 16
1127
1128 define void @llvm_mips_subv_w_test() nounwind {
1129 entry:
1130   %0 = load <4 x i32>* @llvm_mips_subv_w_ARG1
1131   %1 = load <4 x i32>* @llvm_mips_subv_w_ARG2
1132   %2 = tail call <4 x i32> @llvm.mips.subv.w(<4 x i32> %0, <4 x i32> %1)
1133   store <4 x i32> %2, <4 x i32>* @llvm_mips_subv_w_RES
1134   ret void
1135 }
1136
1137 declare <4 x i32> @llvm.mips.subv.w(<4 x i32>, <4 x i32>) nounwind
1138
1139 ; CHECK: llvm_mips_subv_w_test:
1140 ; CHECK: ld.w
1141 ; CHECK: ld.w
1142 ; CHECK: subv.w
1143 ; CHECK: st.w
1144 ; CHECK: .size llvm_mips_subv_w_test
1145 ;
1146 @llvm_mips_subv_d_ARG1 = global <2 x i64> <i64 0, i64 1>, align 16
1147 @llvm_mips_subv_d_ARG2 = global <2 x i64> <i64 2, i64 3>, align 16
1148 @llvm_mips_subv_d_RES  = global <2 x i64> <i64 0, i64 0>, align 16
1149
1150 define void @llvm_mips_subv_d_test() nounwind {
1151 entry:
1152   %0 = load <2 x i64>* @llvm_mips_subv_d_ARG1
1153   %1 = load <2 x i64>* @llvm_mips_subv_d_ARG2
1154   %2 = tail call <2 x i64> @llvm.mips.subv.d(<2 x i64> %0, <2 x i64> %1)
1155   store <2 x i64> %2, <2 x i64>* @llvm_mips_subv_d_RES
1156   ret void
1157 }
1158
1159 declare <2 x i64> @llvm.mips.subv.d(<2 x i64>, <2 x i64>) nounwind
1160
1161 ; CHECK: llvm_mips_subv_d_test:
1162 ; CHECK: ld.d
1163 ; CHECK: ld.d
1164 ; CHECK: subv.d
1165 ; CHECK: st.d
1166 ; CHECK: .size llvm_mips_subv_d_test
1167 ;
1168
1169 define void @subv_b_test() nounwind {
1170 entry:
1171   %0 = load <16 x i8>* @llvm_mips_subv_b_ARG1
1172   %1 = load <16 x i8>* @llvm_mips_subv_b_ARG2
1173   %2 = sub <16 x i8> %0, %1
1174   store <16 x i8> %2, <16 x i8>* @llvm_mips_subv_b_RES
1175   ret void
1176 }
1177
1178 ; CHECK: subv_b_test:
1179 ; CHECK: ld.b
1180 ; CHECK: ld.b
1181 ; CHECK: subv.b
1182 ; CHECK: st.b
1183 ; CHECK: .size subv_b_test
1184
1185 define void @subv_h_test() nounwind {
1186 entry:
1187   %0 = load <8 x i16>* @llvm_mips_subv_h_ARG1
1188   %1 = load <8 x i16>* @llvm_mips_subv_h_ARG2
1189   %2 = sub <8 x i16> %0, %1
1190   store <8 x i16> %2, <8 x i16>* @llvm_mips_subv_h_RES
1191   ret void
1192 }
1193
1194 ; CHECK: subv_h_test:
1195 ; CHECK: ld.h
1196 ; CHECK: ld.h
1197 ; CHECK: subv.h
1198 ; CHECK: st.h
1199 ; CHECK: .size subv_h_test
1200
1201 define void @subv_w_test() nounwind {
1202 entry:
1203   %0 = load <4 x i32>* @llvm_mips_subv_w_ARG1
1204   %1 = load <4 x i32>* @llvm_mips_subv_w_ARG2
1205   %2 = sub <4 x i32> %0, %1
1206   store <4 x i32> %2, <4 x i32>* @llvm_mips_subv_w_RES
1207   ret void
1208 }
1209
1210 ; CHECK: subv_w_test:
1211 ; CHECK: ld.w
1212 ; CHECK: ld.w
1213 ; CHECK: subv.w
1214 ; CHECK: st.w
1215 ; CHECK: .size subv_w_test
1216
1217 define void @subv_d_test() nounwind {
1218 entry:
1219   %0 = load <2 x i64>* @llvm_mips_subv_d_ARG1
1220   %1 = load <2 x i64>* @llvm_mips_subv_d_ARG2
1221   %2 = sub <2 x i64> %0, %1
1222   store <2 x i64> %2, <2 x i64>* @llvm_mips_subv_d_RES
1223   ret void
1224 }
1225
1226 ; CHECK: subv_d_test:
1227 ; CHECK: ld.d
1228 ; CHECK: ld.d
1229 ; CHECK: subv.d
1230 ; CHECK: st.d
1231 ; CHECK: .size subv_d_test
1232 ;