74e698b47522231ec2672ab4049aecf056f08e9f
[oota-llvm.git] / test / CodeGen / Mips / msa / i5-m.ll
1 ; Both endians should emit the same output for immediate instructions.
2 ; This is not currently true.
3 ; XFAIL: *
4
5 ; Test the MSA intrinsics that are encoded with the I5 instruction format.
6 ; There are lots of these so this covers those beginning with 'm'
7
8 ; RUN: llc -march=mips -mattr=+msa,+fp64 < %s | FileCheck %s
9 ; RUN: llc -march=mipsel -mattr=+msa,+fp64 < %s | FileCheck %s
10
11 @llvm_mips_maxi_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
12 @llvm_mips_maxi_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
13
14 define void @llvm_mips_maxi_s_b_test() nounwind {
15 entry:
16   %0 = load <16 x i8>* @llvm_mips_maxi_s_b_ARG1
17   %1 = tail call <16 x i8> @llvm.mips.maxi.s.b(<16 x i8> %0, i32 14)
18   store <16 x i8> %1, <16 x i8>* @llvm_mips_maxi_s_b_RES
19   ret void
20 }
21
22 declare <16 x i8> @llvm.mips.maxi.s.b(<16 x i8>, i32) nounwind
23
24 ; CHECK: llvm_mips_maxi_s_b_test:
25 ; CHECK: ld.b
26 ; CHECK: maxi_s.b
27 ; CHECK: st.b
28 ; CHECK: .size llvm_mips_maxi_s_b_test
29 ;
30 @llvm_mips_maxi_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
31 @llvm_mips_maxi_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
32
33 define void @llvm_mips_maxi_s_h_test() nounwind {
34 entry:
35   %0 = load <8 x i16>* @llvm_mips_maxi_s_h_ARG1
36   %1 = tail call <8 x i16> @llvm.mips.maxi.s.h(<8 x i16> %0, i32 14)
37   store <8 x i16> %1, <8 x i16>* @llvm_mips_maxi_s_h_RES
38   ret void
39 }
40
41 declare <8 x i16> @llvm.mips.maxi.s.h(<8 x i16>, i32) nounwind
42
43 ; CHECK: llvm_mips_maxi_s_h_test:
44 ; CHECK: ld.h
45 ; CHECK: maxi_s.h
46 ; CHECK: st.h
47 ; CHECK: .size llvm_mips_maxi_s_h_test
48 ;
49 @llvm_mips_maxi_s_w_ARG1 = global <4 x i32> <i32 0, i32 1, i32 2, i32 3>, align 16
50 @llvm_mips_maxi_s_w_RES  = global <4 x i32> <i32 0, i32 0, i32 0, i32 0>, align 16
51
52 define void @llvm_mips_maxi_s_w_test() nounwind {
53 entry:
54   %0 = load <4 x i32>* @llvm_mips_maxi_s_w_ARG1
55   %1 = tail call <4 x i32> @llvm.mips.maxi.s.w(<4 x i32> %0, i32 14)
56   store <4 x i32> %1, <4 x i32>* @llvm_mips_maxi_s_w_RES
57   ret void
58 }
59
60 declare <4 x i32> @llvm.mips.maxi.s.w(<4 x i32>, i32) nounwind
61
62 ; CHECK: llvm_mips_maxi_s_w_test:
63 ; CHECK: ld.w
64 ; CHECK: maxi_s.w
65 ; CHECK: st.w
66 ; CHECK: .size llvm_mips_maxi_s_w_test
67 ;
68 @llvm_mips_maxi_s_d_ARG1 = global <2 x i64> <i64 0, i64 1>, align 16
69 @llvm_mips_maxi_s_d_RES  = global <2 x i64> <i64 0, i64 0>, align 16
70
71 define void @llvm_mips_maxi_s_d_test() nounwind {
72 entry:
73   %0 = load <2 x i64>* @llvm_mips_maxi_s_d_ARG1
74   %1 = tail call <2 x i64> @llvm.mips.maxi.s.d(<2 x i64> %0, i32 14)
75   store <2 x i64> %1, <2 x i64>* @llvm_mips_maxi_s_d_RES
76   ret void
77 }
78
79 declare <2 x i64> @llvm.mips.maxi.s.d(<2 x i64>, i32) nounwind
80
81 ; CHECK: llvm_mips_maxi_s_d_test:
82 ; CHECK: ld.d
83 ; CHECK: maxi_s.d
84 ; CHECK: st.d
85 ; CHECK: .size llvm_mips_maxi_s_d_test
86 ;
87 @llvm_mips_maxi_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
88 @llvm_mips_maxi_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
89
90 define void @llvm_mips_maxi_u_b_test() nounwind {
91 entry:
92   %0 = load <16 x i8>* @llvm_mips_maxi_u_b_ARG1
93   %1 = tail call <16 x i8> @llvm.mips.maxi.u.b(<16 x i8> %0, i32 14)
94   store <16 x i8> %1, <16 x i8>* @llvm_mips_maxi_u_b_RES
95   ret void
96 }
97
98 declare <16 x i8> @llvm.mips.maxi.u.b(<16 x i8>, i32) nounwind
99
100 ; CHECK: llvm_mips_maxi_u_b_test:
101 ; CHECK: ld.b
102 ; CHECK: maxi_u.b
103 ; CHECK: st.b
104 ; CHECK: .size llvm_mips_maxi_u_b_test
105 ;
106 @llvm_mips_maxi_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
107 @llvm_mips_maxi_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
108
109 define void @llvm_mips_maxi_u_h_test() nounwind {
110 entry:
111   %0 = load <8 x i16>* @llvm_mips_maxi_u_h_ARG1
112   %1 = tail call <8 x i16> @llvm.mips.maxi.u.h(<8 x i16> %0, i32 14)
113   store <8 x i16> %1, <8 x i16>* @llvm_mips_maxi_u_h_RES
114   ret void
115 }
116
117 declare <8 x i16> @llvm.mips.maxi.u.h(<8 x i16>, i32) nounwind
118
119 ; CHECK: llvm_mips_maxi_u_h_test:
120 ; CHECK: ld.h
121 ; CHECK: maxi_u.h
122 ; CHECK: st.h
123 ; CHECK: .size llvm_mips_maxi_u_h_test
124 ;
125 @llvm_mips_maxi_u_w_ARG1 = global <4 x i32> <i32 0, i32 1, i32 2, i32 3>, align 16
126 @llvm_mips_maxi_u_w_RES  = global <4 x i32> <i32 0, i32 0, i32 0, i32 0>, align 16
127
128 define void @llvm_mips_maxi_u_w_test() nounwind {
129 entry:
130   %0 = load <4 x i32>* @llvm_mips_maxi_u_w_ARG1
131   %1 = tail call <4 x i32> @llvm.mips.maxi.u.w(<4 x i32> %0, i32 14)
132   store <4 x i32> %1, <4 x i32>* @llvm_mips_maxi_u_w_RES
133   ret void
134 }
135
136 declare <4 x i32> @llvm.mips.maxi.u.w(<4 x i32>, i32) nounwind
137
138 ; CHECK: llvm_mips_maxi_u_w_test:
139 ; CHECK: ld.w
140 ; CHECK: maxi_u.w
141 ; CHECK: st.w
142 ; CHECK: .size llvm_mips_maxi_u_w_test
143 ;
144 @llvm_mips_maxi_u_d_ARG1 = global <2 x i64> <i64 0, i64 1>, align 16
145 @llvm_mips_maxi_u_d_RES  = global <2 x i64> <i64 0, i64 0>, align 16
146
147 define void @llvm_mips_maxi_u_d_test() nounwind {
148 entry:
149   %0 = load <2 x i64>* @llvm_mips_maxi_u_d_ARG1
150   %1 = tail call <2 x i64> @llvm.mips.maxi.u.d(<2 x i64> %0, i32 14)
151   store <2 x i64> %1, <2 x i64>* @llvm_mips_maxi_u_d_RES
152   ret void
153 }
154
155 declare <2 x i64> @llvm.mips.maxi.u.d(<2 x i64>, i32) nounwind
156
157 ; CHECK: llvm_mips_maxi_u_d_test:
158 ; CHECK: ld.d
159 ; CHECK: maxi_u.d
160 ; CHECK: st.d
161 ; CHECK: .size llvm_mips_maxi_u_d_test
162 ;
163 @llvm_mips_mini_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
164 @llvm_mips_mini_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
165
166 define void @llvm_mips_mini_s_b_test() nounwind {
167 entry:
168   %0 = load <16 x i8>* @llvm_mips_mini_s_b_ARG1
169   %1 = tail call <16 x i8> @llvm.mips.mini.s.b(<16 x i8> %0, i32 14)
170   store <16 x i8> %1, <16 x i8>* @llvm_mips_mini_s_b_RES
171   ret void
172 }
173
174 declare <16 x i8> @llvm.mips.mini.s.b(<16 x i8>, i32) nounwind
175
176 ; CHECK: llvm_mips_mini_s_b_test:
177 ; CHECK: ld.b
178 ; CHECK: mini_s.b
179 ; CHECK: st.b
180 ; CHECK: .size llvm_mips_mini_s_b_test
181 ;
182 @llvm_mips_mini_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
183 @llvm_mips_mini_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
184
185 define void @llvm_mips_mini_s_h_test() nounwind {
186 entry:
187   %0 = load <8 x i16>* @llvm_mips_mini_s_h_ARG1
188   %1 = tail call <8 x i16> @llvm.mips.mini.s.h(<8 x i16> %0, i32 14)
189   store <8 x i16> %1, <8 x i16>* @llvm_mips_mini_s_h_RES
190   ret void
191 }
192
193 declare <8 x i16> @llvm.mips.mini.s.h(<8 x i16>, i32) nounwind
194
195 ; CHECK: llvm_mips_mini_s_h_test:
196 ; CHECK: ld.h
197 ; CHECK: mini_s.h
198 ; CHECK: st.h
199 ; CHECK: .size llvm_mips_mini_s_h_test
200 ;
201 @llvm_mips_mini_s_w_ARG1 = global <4 x i32> <i32 0, i32 1, i32 2, i32 3>, align 16
202 @llvm_mips_mini_s_w_RES  = global <4 x i32> <i32 0, i32 0, i32 0, i32 0>, align 16
203
204 define void @llvm_mips_mini_s_w_test() nounwind {
205 entry:
206   %0 = load <4 x i32>* @llvm_mips_mini_s_w_ARG1
207   %1 = tail call <4 x i32> @llvm.mips.mini.s.w(<4 x i32> %0, i32 14)
208   store <4 x i32> %1, <4 x i32>* @llvm_mips_mini_s_w_RES
209   ret void
210 }
211
212 declare <4 x i32> @llvm.mips.mini.s.w(<4 x i32>, i32) nounwind
213
214 ; CHECK: llvm_mips_mini_s_w_test:
215 ; CHECK: ld.w
216 ; CHECK: mini_s.w
217 ; CHECK: st.w
218 ; CHECK: .size llvm_mips_mini_s_w_test
219 ;
220 @llvm_mips_mini_s_d_ARG1 = global <2 x i64> <i64 0, i64 1>, align 16
221 @llvm_mips_mini_s_d_RES  = global <2 x i64> <i64 0, i64 0>, align 16
222
223 define void @llvm_mips_mini_s_d_test() nounwind {
224 entry:
225   %0 = load <2 x i64>* @llvm_mips_mini_s_d_ARG1
226   %1 = tail call <2 x i64> @llvm.mips.mini.s.d(<2 x i64> %0, i32 14)
227   store <2 x i64> %1, <2 x i64>* @llvm_mips_mini_s_d_RES
228   ret void
229 }
230
231 declare <2 x i64> @llvm.mips.mini.s.d(<2 x i64>, i32) nounwind
232
233 ; CHECK: llvm_mips_mini_s_d_test:
234 ; CHECK: ld.d
235 ; CHECK: mini_s.d
236 ; CHECK: st.d
237 ; CHECK: .size llvm_mips_mini_s_d_test
238 ;
239 @llvm_mips_mini_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
240 @llvm_mips_mini_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
241
242 define void @llvm_mips_mini_u_b_test() nounwind {
243 entry:
244   %0 = load <16 x i8>* @llvm_mips_mini_u_b_ARG1
245   %1 = tail call <16 x i8> @llvm.mips.mini.u.b(<16 x i8> %0, i32 14)
246   store <16 x i8> %1, <16 x i8>* @llvm_mips_mini_u_b_RES
247   ret void
248 }
249
250 declare <16 x i8> @llvm.mips.mini.u.b(<16 x i8>, i32) nounwind
251
252 ; CHECK: llvm_mips_mini_u_b_test:
253 ; CHECK: ld.b
254 ; CHECK: mini_u.b
255 ; CHECK: st.b
256 ; CHECK: .size llvm_mips_mini_u_b_test
257 ;
258 @llvm_mips_mini_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
259 @llvm_mips_mini_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
260
261 define void @llvm_mips_mini_u_h_test() nounwind {
262 entry:
263   %0 = load <8 x i16>* @llvm_mips_mini_u_h_ARG1
264   %1 = tail call <8 x i16> @llvm.mips.mini.u.h(<8 x i16> %0, i32 14)
265   store <8 x i16> %1, <8 x i16>* @llvm_mips_mini_u_h_RES
266   ret void
267 }
268
269 declare <8 x i16> @llvm.mips.mini.u.h(<8 x i16>, i32) nounwind
270
271 ; CHECK: llvm_mips_mini_u_h_test:
272 ; CHECK: ld.h
273 ; CHECK: mini_u.h
274 ; CHECK: st.h
275 ; CHECK: .size llvm_mips_mini_u_h_test
276 ;
277 @llvm_mips_mini_u_w_ARG1 = global <4 x i32> <i32 0, i32 1, i32 2, i32 3>, align 16
278 @llvm_mips_mini_u_w_RES  = global <4 x i32> <i32 0, i32 0, i32 0, i32 0>, align 16
279
280 define void @llvm_mips_mini_u_w_test() nounwind {
281 entry:
282   %0 = load <4 x i32>* @llvm_mips_mini_u_w_ARG1
283   %1 = tail call <4 x i32> @llvm.mips.mini.u.w(<4 x i32> %0, i32 14)
284   store <4 x i32> %1, <4 x i32>* @llvm_mips_mini_u_w_RES
285   ret void
286 }
287
288 declare <4 x i32> @llvm.mips.mini.u.w(<4 x i32>, i32) nounwind
289
290 ; CHECK: llvm_mips_mini_u_w_test:
291 ; CHECK: ld.w
292 ; CHECK: mini_u.w
293 ; CHECK: st.w
294 ; CHECK: .size llvm_mips_mini_u_w_test
295 ;
296 @llvm_mips_mini_u_d_ARG1 = global <2 x i64> <i64 0, i64 1>, align 16
297 @llvm_mips_mini_u_d_RES  = global <2 x i64> <i64 0, i64 0>, align 16
298
299 define void @llvm_mips_mini_u_d_test() nounwind {
300 entry:
301   %0 = load <2 x i64>* @llvm_mips_mini_u_d_ARG1
302   %1 = tail call <2 x i64> @llvm.mips.mini.u.d(<2 x i64> %0, i32 14)
303   store <2 x i64> %1, <2 x i64>* @llvm_mips_mini_u_d_RES
304   ret void
305 }
306
307 declare <2 x i64> @llvm.mips.mini.u.d(<2 x i64>, i32) nounwind
308
309 ; CHECK: llvm_mips_mini_u_d_test:
310 ; CHECK: ld.d
311 ; CHECK: mini_u.d
312 ; CHECK: st.d
313 ; CHECK: .size llvm_mips_mini_u_d_test
314 ;