[mips][msa] Added support for matching mulv, nlzc, sll, sra, srl, and subv from norma...
[oota-llvm.git] / test / CodeGen / Mips / msa / 3rf.ll
1 ; Test the MSA intrinsics that are encoded with the 3RF instruction format.
2
3 ; RUN: llc -march=mips -mattr=+msa < %s | FileCheck %s
4
5 @llvm_mips_fadd_w_ARG1 = global <4 x float> <float 0.000000e+00, float 1.000000e+00, float 2.000000e+00, float 3.000000e+00>, align 16
6 @llvm_mips_fadd_w_ARG2 = global <4 x float> <float 4.000000e+00, float 5.000000e+00, float 6.000000e+00, float 7.000000e+00>, align 16
7 @llvm_mips_fadd_w_RES  = global <4 x float> <float 0.000000e+00, float 0.000000e+00, float 0.000000e+00, float 0.000000e+00>, align 16
8
9 define void @llvm_mips_fadd_w_test() nounwind {
10 entry:
11   %0 = load <4 x float>* @llvm_mips_fadd_w_ARG1
12   %1 = load <4 x float>* @llvm_mips_fadd_w_ARG2
13   %2 = tail call <4 x float> @llvm.mips.fadd.w(<4 x float> %0, <4 x float> %1)
14   store <4 x float> %2, <4 x float>* @llvm_mips_fadd_w_RES
15   ret void
16 }
17
18 declare <4 x float> @llvm.mips.fadd.w(<4 x float>, <4 x float>) nounwind
19
20 ; CHECK: llvm_mips_fadd_w_test:
21 ; CHECK: ld.w
22 ; CHECK: ld.w
23 ; CHECK: fadd.w
24 ; CHECK: st.w
25 ; CHECK: .size llvm_mips_fadd_w_test
26 ;
27 @llvm_mips_fadd_d_ARG1 = global <2 x double> <double 0.000000e+00, double 1.000000e+00>, align 16
28 @llvm_mips_fadd_d_ARG2 = global <2 x double> <double 2.000000e+00, double 3.000000e+00>, align 16
29 @llvm_mips_fadd_d_RES  = global <2 x double> <double 0.000000e+00, double 0.000000e+00>, align 16
30
31 define void @llvm_mips_fadd_d_test() nounwind {
32 entry:
33   %0 = load <2 x double>* @llvm_mips_fadd_d_ARG1
34   %1 = load <2 x double>* @llvm_mips_fadd_d_ARG2
35   %2 = tail call <2 x double> @llvm.mips.fadd.d(<2 x double> %0, <2 x double> %1)
36   store <2 x double> %2, <2 x double>* @llvm_mips_fadd_d_RES
37   ret void
38 }
39
40 declare <2 x double> @llvm.mips.fadd.d(<2 x double>, <2 x double>) nounwind
41
42 ; CHECK: llvm_mips_fadd_d_test:
43 ; CHECK: ld.d
44 ; CHECK: ld.d
45 ; CHECK: fadd.d
46 ; CHECK: st.d
47 ; CHECK: .size llvm_mips_fadd_d_test
48
49 define void @fadd_w_test() nounwind {
50 entry:
51   %0 = load <4 x float>* @llvm_mips_fadd_w_ARG1
52   %1 = load <4 x float>* @llvm_mips_fadd_w_ARG2
53   %2 = fadd <4 x float> %0, %1
54   store <4 x float> %2, <4 x float>* @llvm_mips_fadd_w_RES
55   ret void
56 }
57
58 ; CHECK: fadd_w_test:
59 ; CHECK: ld.w
60 ; CHECK: ld.w
61 ; CHECK: fadd.w
62 ; CHECK: st.w
63 ; CHECK: .size fadd_w_test
64
65 define void @fadd_d_test() nounwind {
66 entry:
67   %0 = load <2 x double>* @llvm_mips_fadd_d_ARG1
68   %1 = load <2 x double>* @llvm_mips_fadd_d_ARG2
69   %2 = fadd <2 x double> %0, %1
70   store <2 x double> %2, <2 x double>* @llvm_mips_fadd_d_RES
71   ret void
72 }
73
74 ; CHECK: fadd_d_test:
75 ; CHECK: ld.d
76 ; CHECK: ld.d
77 ; CHECK: fadd.d
78 ; CHECK: st.d
79 ; CHECK: .size fadd_d_test
80 ;
81 @llvm_mips_fdiv_w_ARG1 = global <4 x float> <float 0.000000e+00, float 1.000000e+00, float 2.000000e+00, float 3.000000e+00>, align 16
82 @llvm_mips_fdiv_w_ARG2 = global <4 x float> <float 4.000000e+00, float 5.000000e+00, float 6.000000e+00, float 7.000000e+00>, align 16
83 @llvm_mips_fdiv_w_RES  = global <4 x float> <float 0.000000e+00, float 0.000000e+00, float 0.000000e+00, float 0.000000e+00>, align 16
84
85 define void @llvm_mips_fdiv_w_test() nounwind {
86 entry:
87   %0 = load <4 x float>* @llvm_mips_fdiv_w_ARG1
88   %1 = load <4 x float>* @llvm_mips_fdiv_w_ARG2
89   %2 = tail call <4 x float> @llvm.mips.fdiv.w(<4 x float> %0, <4 x float> %1)
90   store <4 x float> %2, <4 x float>* @llvm_mips_fdiv_w_RES
91   ret void
92 }
93
94 declare <4 x float> @llvm.mips.fdiv.w(<4 x float>, <4 x float>) nounwind
95
96 ; CHECK: llvm_mips_fdiv_w_test:
97 ; CHECK: ld.w
98 ; CHECK: ld.w
99 ; CHECK: fdiv.w
100 ; CHECK: st.w
101 ; CHECK: .size llvm_mips_fdiv_w_test
102 ;
103 @llvm_mips_fdiv_d_ARG1 = global <2 x double> <double 0.000000e+00, double 1.000000e+00>, align 16
104 @llvm_mips_fdiv_d_ARG2 = global <2 x double> <double 2.000000e+00, double 3.000000e+00>, align 16
105 @llvm_mips_fdiv_d_RES  = global <2 x double> <double 0.000000e+00, double 0.000000e+00>, align 16
106
107 define void @llvm_mips_fdiv_d_test() nounwind {
108 entry:
109   %0 = load <2 x double>* @llvm_mips_fdiv_d_ARG1
110   %1 = load <2 x double>* @llvm_mips_fdiv_d_ARG2
111   %2 = tail call <2 x double> @llvm.mips.fdiv.d(<2 x double> %0, <2 x double> %1)
112   store <2 x double> %2, <2 x double>* @llvm_mips_fdiv_d_RES
113   ret void
114 }
115
116 declare <2 x double> @llvm.mips.fdiv.d(<2 x double>, <2 x double>) nounwind
117
118 ; CHECK: llvm_mips_fdiv_d_test:
119 ; CHECK: ld.d
120 ; CHECK: ld.d
121 ; CHECK: fdiv.d
122 ; CHECK: st.d
123 ; CHECK: .size llvm_mips_fdiv_d_test
124
125 define void @fdiv_w_test() nounwind {
126 entry:
127   %0 = load <4 x float>* @llvm_mips_fdiv_w_ARG1
128   %1 = load <4 x float>* @llvm_mips_fdiv_w_ARG2
129   %2 = fdiv <4 x float> %0, %1
130   store <4 x float> %2, <4 x float>* @llvm_mips_fdiv_w_RES
131   ret void
132 }
133
134 ; CHECK: fdiv_w_test:
135 ; CHECK: ld.w
136 ; CHECK: ld.w
137 ; CHECK: fdiv.w
138 ; CHECK: st.w
139 ; CHECK: .size fdiv_w_test
140
141 define void @fdiv_d_test() nounwind {
142 entry:
143   %0 = load <2 x double>* @llvm_mips_fdiv_d_ARG1
144   %1 = load <2 x double>* @llvm_mips_fdiv_d_ARG2
145   %2 = fdiv <2 x double> %0, %1
146   store <2 x double> %2, <2 x double>* @llvm_mips_fdiv_d_RES
147   ret void
148 }
149
150 ; CHECK: fdiv_d_test:
151 ; CHECK: ld.d
152 ; CHECK: ld.d
153 ; CHECK: fdiv.d
154 ; CHECK: st.d
155 ; CHECK: .size fdiv_d_test
156 ;
157 @llvm_mips_fmin_w_ARG1 = global <4 x float> <float 0.000000e+00, float 1.000000e+00, float 2.000000e+00, float 3.000000e+00>, align 16
158 @llvm_mips_fmin_w_ARG2 = global <4 x float> <float 4.000000e+00, float 5.000000e+00, float 6.000000e+00, float 7.000000e+00>, align 16
159 @llvm_mips_fmin_w_RES  = global <4 x float> <float 0.000000e+00, float 0.000000e+00, float 0.000000e+00, float 0.000000e+00>, align 16
160
161 define void @llvm_mips_fmin_w_test() nounwind {
162 entry:
163   %0 = load <4 x float>* @llvm_mips_fmin_w_ARG1
164   %1 = load <4 x float>* @llvm_mips_fmin_w_ARG2
165   %2 = tail call <4 x float> @llvm.mips.fmin.w(<4 x float> %0, <4 x float> %1)
166   store <4 x float> %2, <4 x float>* @llvm_mips_fmin_w_RES
167   ret void
168 }
169
170 declare <4 x float> @llvm.mips.fmin.w(<4 x float>, <4 x float>) nounwind
171
172 ; CHECK: llvm_mips_fmin_w_test:
173 ; CHECK: ld.w
174 ; CHECK: ld.w
175 ; CHECK: fmin.w
176 ; CHECK: st.w
177 ; CHECK: .size llvm_mips_fmin_w_test
178 ;
179 @llvm_mips_fmin_d_ARG1 = global <2 x double> <double 0.000000e+00, double 1.000000e+00>, align 16
180 @llvm_mips_fmin_d_ARG2 = global <2 x double> <double 2.000000e+00, double 3.000000e+00>, align 16
181 @llvm_mips_fmin_d_RES  = global <2 x double> <double 0.000000e+00, double 0.000000e+00>, align 16
182
183 define void @llvm_mips_fmin_d_test() nounwind {
184 entry:
185   %0 = load <2 x double>* @llvm_mips_fmin_d_ARG1
186   %1 = load <2 x double>* @llvm_mips_fmin_d_ARG2
187   %2 = tail call <2 x double> @llvm.mips.fmin.d(<2 x double> %0, <2 x double> %1)
188   store <2 x double> %2, <2 x double>* @llvm_mips_fmin_d_RES
189   ret void
190 }
191
192 declare <2 x double> @llvm.mips.fmin.d(<2 x double>, <2 x double>) nounwind
193
194 ; CHECK: llvm_mips_fmin_d_test:
195 ; CHECK: ld.d
196 ; CHECK: ld.d
197 ; CHECK: fmin.d
198 ; CHECK: st.d
199 ; CHECK: .size llvm_mips_fmin_d_test
200 ;
201 @llvm_mips_fmin_a_w_ARG1 = global <4 x float> <float 0.000000e+00, float 1.000000e+00, float 2.000000e+00, float 3.000000e+00>, align 16
202 @llvm_mips_fmin_a_w_ARG2 = global <4 x float> <float 4.000000e+00, float 5.000000e+00, float 6.000000e+00, float 7.000000e+00>, align 16
203 @llvm_mips_fmin_a_w_RES  = global <4 x float> <float 0.000000e+00, float 0.000000e+00, float 0.000000e+00, float 0.000000e+00>, align 16
204
205 define void @llvm_mips_fmin_a_w_test() nounwind {
206 entry:
207   %0 = load <4 x float>* @llvm_mips_fmin_a_w_ARG1
208   %1 = load <4 x float>* @llvm_mips_fmin_a_w_ARG2
209   %2 = tail call <4 x float> @llvm.mips.fmin.a.w(<4 x float> %0, <4 x float> %1)
210   store <4 x float> %2, <4 x float>* @llvm_mips_fmin_a_w_RES
211   ret void
212 }
213
214 declare <4 x float> @llvm.mips.fmin.a.w(<4 x float>, <4 x float>) nounwind
215
216 ; CHECK: llvm_mips_fmin_a_w_test:
217 ; CHECK: ld.w
218 ; CHECK: ld.w
219 ; CHECK: fmin_a.w
220 ; CHECK: st.w
221 ; CHECK: .size llvm_mips_fmin_a_w_test
222 ;
223 @llvm_mips_fmin_a_d_ARG1 = global <2 x double> <double 0.000000e+00, double 1.000000e+00>, align 16
224 @llvm_mips_fmin_a_d_ARG2 = global <2 x double> <double 2.000000e+00, double 3.000000e+00>, align 16
225 @llvm_mips_fmin_a_d_RES  = global <2 x double> <double 0.000000e+00, double 0.000000e+00>, align 16
226
227 define void @llvm_mips_fmin_a_d_test() nounwind {
228 entry:
229   %0 = load <2 x double>* @llvm_mips_fmin_a_d_ARG1
230   %1 = load <2 x double>* @llvm_mips_fmin_a_d_ARG2
231   %2 = tail call <2 x double> @llvm.mips.fmin.a.d(<2 x double> %0, <2 x double> %1)
232   store <2 x double> %2, <2 x double>* @llvm_mips_fmin_a_d_RES
233   ret void
234 }
235
236 declare <2 x double> @llvm.mips.fmin.a.d(<2 x double>, <2 x double>) nounwind
237
238 ; CHECK: llvm_mips_fmin_a_d_test:
239 ; CHECK: ld.d
240 ; CHECK: ld.d
241 ; CHECK: fmin_a.d
242 ; CHECK: st.d
243 ; CHECK: .size llvm_mips_fmin_a_d_test
244 ;
245 @llvm_mips_fmax_w_ARG1 = global <4 x float> <float 0.000000e+00, float 1.000000e+00, float 2.000000e+00, float 3.000000e+00>, align 16
246 @llvm_mips_fmax_w_ARG2 = global <4 x float> <float 4.000000e+00, float 5.000000e+00, float 6.000000e+00, float 7.000000e+00>, align 16
247 @llvm_mips_fmax_w_RES  = global <4 x float> <float 0.000000e+00, float 0.000000e+00, float 0.000000e+00, float 0.000000e+00>, align 16
248
249 define void @llvm_mips_fmax_w_test() nounwind {
250 entry:
251   %0 = load <4 x float>* @llvm_mips_fmax_w_ARG1
252   %1 = load <4 x float>* @llvm_mips_fmax_w_ARG2
253   %2 = tail call <4 x float> @llvm.mips.fmax.w(<4 x float> %0, <4 x float> %1)
254   store <4 x float> %2, <4 x float>* @llvm_mips_fmax_w_RES
255   ret void
256 }
257
258 declare <4 x float> @llvm.mips.fmax.w(<4 x float>, <4 x float>) nounwind
259
260 ; CHECK: llvm_mips_fmax_w_test:
261 ; CHECK: ld.w
262 ; CHECK: ld.w
263 ; CHECK: fmax.w
264 ; CHECK: st.w
265 ; CHECK: .size llvm_mips_fmax_w_test
266 ;
267 @llvm_mips_fmax_d_ARG1 = global <2 x double> <double 0.000000e+00, double 1.000000e+00>, align 16
268 @llvm_mips_fmax_d_ARG2 = global <2 x double> <double 2.000000e+00, double 3.000000e+00>, align 16
269 @llvm_mips_fmax_d_RES  = global <2 x double> <double 0.000000e+00, double 0.000000e+00>, align 16
270
271 define void @llvm_mips_fmax_d_test() nounwind {
272 entry:
273   %0 = load <2 x double>* @llvm_mips_fmax_d_ARG1
274   %1 = load <2 x double>* @llvm_mips_fmax_d_ARG2
275   %2 = tail call <2 x double> @llvm.mips.fmax.d(<2 x double> %0, <2 x double> %1)
276   store <2 x double> %2, <2 x double>* @llvm_mips_fmax_d_RES
277   ret void
278 }
279
280 declare <2 x double> @llvm.mips.fmax.d(<2 x double>, <2 x double>) nounwind
281
282 ; CHECK: llvm_mips_fmax_d_test:
283 ; CHECK: ld.d
284 ; CHECK: ld.d
285 ; CHECK: fmax.d
286 ; CHECK: st.d
287 ; CHECK: .size llvm_mips_fmax_d_test
288 ;
289 @llvm_mips_fmax_a_w_ARG1 = global <4 x float> <float 0.000000e+00, float 1.000000e+00, float 2.000000e+00, float 3.000000e+00>, align 16
290 @llvm_mips_fmax_a_w_ARG2 = global <4 x float> <float 4.000000e+00, float 5.000000e+00, float 6.000000e+00, float 7.000000e+00>, align 16
291 @llvm_mips_fmax_a_w_RES  = global <4 x float> <float 0.000000e+00, float 0.000000e+00, float 0.000000e+00, float 0.000000e+00>, align 16
292
293 define void @llvm_mips_fmax_a_w_test() nounwind {
294 entry:
295   %0 = load <4 x float>* @llvm_mips_fmax_a_w_ARG1
296   %1 = load <4 x float>* @llvm_mips_fmax_a_w_ARG2
297   %2 = tail call <4 x float> @llvm.mips.fmax.a.w(<4 x float> %0, <4 x float> %1)
298   store <4 x float> %2, <4 x float>* @llvm_mips_fmax_a_w_RES
299   ret void
300 }
301
302 declare <4 x float> @llvm.mips.fmax.a.w(<4 x float>, <4 x float>) nounwind
303
304 ; CHECK: llvm_mips_fmax_a_w_test:
305 ; CHECK: ld.w
306 ; CHECK: ld.w
307 ; CHECK: fmax_a.w
308 ; CHECK: st.w
309 ; CHECK: .size llvm_mips_fmax_a_w_test
310 ;
311 @llvm_mips_fmax_a_d_ARG1 = global <2 x double> <double 0.000000e+00, double 1.000000e+00>, align 16
312 @llvm_mips_fmax_a_d_ARG2 = global <2 x double> <double 2.000000e+00, double 3.000000e+00>, align 16
313 @llvm_mips_fmax_a_d_RES  = global <2 x double> <double 0.000000e+00, double 0.000000e+00>, align 16
314
315 define void @llvm_mips_fmax_a_d_test() nounwind {
316 entry:
317   %0 = load <2 x double>* @llvm_mips_fmax_a_d_ARG1
318   %1 = load <2 x double>* @llvm_mips_fmax_a_d_ARG2
319   %2 = tail call <2 x double> @llvm.mips.fmax.a.d(<2 x double> %0, <2 x double> %1)
320   store <2 x double> %2, <2 x double>* @llvm_mips_fmax_a_d_RES
321   ret void
322 }
323
324 declare <2 x double> @llvm.mips.fmax.a.d(<2 x double>, <2 x double>) nounwind
325
326 ; CHECK: llvm_mips_fmax_a_d_test:
327 ; CHECK: ld.d
328 ; CHECK: ld.d
329 ; CHECK: fmax_a.d
330 ; CHECK: st.d
331 ; CHECK: .size llvm_mips_fmax_a_d_test
332 ;
333 @llvm_mips_fmul_w_ARG1 = global <4 x float> <float 0.000000e+00, float 1.000000e+00, float 2.000000e+00, float 3.000000e+00>, align 16
334 @llvm_mips_fmul_w_ARG2 = global <4 x float> <float 4.000000e+00, float 5.000000e+00, float 6.000000e+00, float 7.000000e+00>, align 16
335 @llvm_mips_fmul_w_RES  = global <4 x float> <float 0.000000e+00, float 0.000000e+00, float 0.000000e+00, float 0.000000e+00>, align 16
336
337 define void @llvm_mips_fmul_w_test() nounwind {
338 entry:
339   %0 = load <4 x float>* @llvm_mips_fmul_w_ARG1
340   %1 = load <4 x float>* @llvm_mips_fmul_w_ARG2
341   %2 = tail call <4 x float> @llvm.mips.fmul.w(<4 x float> %0, <4 x float> %1)
342   store <4 x float> %2, <4 x float>* @llvm_mips_fmul_w_RES
343   ret void
344 }
345
346 declare <4 x float> @llvm.mips.fmul.w(<4 x float>, <4 x float>) nounwind
347
348 ; CHECK: llvm_mips_fmul_w_test:
349 ; CHECK: ld.w
350 ; CHECK: ld.w
351 ; CHECK: fmul.w
352 ; CHECK: st.w
353 ; CHECK: .size llvm_mips_fmul_w_test
354 ;
355 @llvm_mips_fmul_d_ARG1 = global <2 x double> <double 0.000000e+00, double 1.000000e+00>, align 16
356 @llvm_mips_fmul_d_ARG2 = global <2 x double> <double 2.000000e+00, double 3.000000e+00>, align 16
357 @llvm_mips_fmul_d_RES  = global <2 x double> <double 0.000000e+00, double 0.000000e+00>, align 16
358
359 define void @llvm_mips_fmul_d_test() nounwind {
360 entry:
361   %0 = load <2 x double>* @llvm_mips_fmul_d_ARG1
362   %1 = load <2 x double>* @llvm_mips_fmul_d_ARG2
363   %2 = tail call <2 x double> @llvm.mips.fmul.d(<2 x double> %0, <2 x double> %1)
364   store <2 x double> %2, <2 x double>* @llvm_mips_fmul_d_RES
365   ret void
366 }
367
368 declare <2 x double> @llvm.mips.fmul.d(<2 x double>, <2 x double>) nounwind
369
370 ; CHECK: llvm_mips_fmul_d_test:
371 ; CHECK: ld.d
372 ; CHECK: ld.d
373 ; CHECK: fmul.d
374 ; CHECK: st.d
375 ; CHECK: .size llvm_mips_fmul_d_test
376
377 define void @fmul_w_test() nounwind {
378 entry:
379   %0 = load <4 x float>* @llvm_mips_fmul_w_ARG1
380   %1 = load <4 x float>* @llvm_mips_fmul_w_ARG2
381   %2 = fmul <4 x float> %0, %1
382   store <4 x float> %2, <4 x float>* @llvm_mips_fmul_w_RES
383   ret void
384 }
385
386 ; CHECK: fmul_w_test:
387 ; CHECK: ld.w
388 ; CHECK: ld.w
389 ; CHECK: fmul.w
390 ; CHECK: st.w
391 ; CHECK: .size fmul_w_test
392
393 define void @fmul_d_test() nounwind {
394 entry:
395   %0 = load <2 x double>* @llvm_mips_fmul_d_ARG1
396   %1 = load <2 x double>* @llvm_mips_fmul_d_ARG2
397   %2 = fmul <2 x double> %0, %1
398   store <2 x double> %2, <2 x double>* @llvm_mips_fmul_d_RES
399   ret void
400 }
401
402 ; CHECK: fmul_d_test:
403 ; CHECK: ld.d
404 ; CHECK: ld.d
405 ; CHECK: fmul.d
406 ; CHECK: st.d
407 ; CHECK: .size fmul_d_test
408 ;
409 @llvm_mips_fsub_w_ARG1 = global <4 x float> <float 0.000000e+00, float 1.000000e+00, float 2.000000e+00, float 3.000000e+00>, align 16
410 @llvm_mips_fsub_w_ARG2 = global <4 x float> <float 4.000000e+00, float 5.000000e+00, float 6.000000e+00, float 7.000000e+00>, align 16
411 @llvm_mips_fsub_w_RES  = global <4 x float> <float 0.000000e+00, float 0.000000e+00, float 0.000000e+00, float 0.000000e+00>, align 16
412
413 define void @llvm_mips_fsub_w_test() nounwind {
414 entry:
415   %0 = load <4 x float>* @llvm_mips_fsub_w_ARG1
416   %1 = load <4 x float>* @llvm_mips_fsub_w_ARG2
417   %2 = tail call <4 x float> @llvm.mips.fsub.w(<4 x float> %0, <4 x float> %1)
418   store <4 x float> %2, <4 x float>* @llvm_mips_fsub_w_RES
419   ret void
420 }
421
422 declare <4 x float> @llvm.mips.fsub.w(<4 x float>, <4 x float>) nounwind
423
424 ; CHECK: llvm_mips_fsub_w_test:
425 ; CHECK: ld.w
426 ; CHECK: ld.w
427 ; CHECK: fsub.w
428 ; CHECK: st.w
429 ; CHECK: .size llvm_mips_fsub_w_test
430 ;
431 @llvm_mips_fsub_d_ARG1 = global <2 x double> <double 0.000000e+00, double 1.000000e+00>, align 16
432 @llvm_mips_fsub_d_ARG2 = global <2 x double> <double 2.000000e+00, double 3.000000e+00>, align 16
433 @llvm_mips_fsub_d_RES  = global <2 x double> <double 0.000000e+00, double 0.000000e+00>, align 16
434
435 define void @llvm_mips_fsub_d_test() nounwind {
436 entry:
437   %0 = load <2 x double>* @llvm_mips_fsub_d_ARG1
438   %1 = load <2 x double>* @llvm_mips_fsub_d_ARG2
439   %2 = tail call <2 x double> @llvm.mips.fsub.d(<2 x double> %0, <2 x double> %1)
440   store <2 x double> %2, <2 x double>* @llvm_mips_fsub_d_RES
441   ret void
442 }
443
444 declare <2 x double> @llvm.mips.fsub.d(<2 x double>, <2 x double>) nounwind
445
446 ; CHECK: llvm_mips_fsub_d_test:
447 ; CHECK: ld.d
448 ; CHECK: ld.d
449 ; CHECK: fsub.d
450 ; CHECK: st.d
451 ; CHECK: .size llvm_mips_fsub_d_test
452 ;
453
454 define void @fsub_w_test() nounwind {
455 entry:
456   %0 = load <4 x float>* @llvm_mips_fsub_w_ARG1
457   %1 = load <4 x float>* @llvm_mips_fsub_w_ARG2
458   %2 = fsub <4 x float> %0, %1
459   store <4 x float> %2, <4 x float>* @llvm_mips_fsub_w_RES
460   ret void
461 }
462
463 ; CHECK: fsub_w_test:
464 ; CHECK: ld.w
465 ; CHECK: ld.w
466 ; CHECK: fsub.w
467 ; CHECK: st.w
468 ; CHECK: .size fsub_w_test
469
470 define void @fsub_d_test() nounwind {
471 entry:
472   %0 = load <2 x double>* @llvm_mips_fsub_d_ARG1
473   %1 = load <2 x double>* @llvm_mips_fsub_d_ARG2
474   %2 = fsub <2 x double> %0, %1
475   store <2 x double> %2, <2 x double>* @llvm_mips_fsub_d_RES
476   ret void
477 }
478
479 ; CHECK: fsub_d_test:
480 ; CHECK: ld.d
481 ; CHECK: ld.d
482 ; CHECK: fsub.d
483 ; CHECK: st.d
484 ; CHECK: .size fsub_d_test