[mips][micromips] Use call instructions with short delay slots
[oota-llvm.git] / test / CodeGen / Mips / msa / vec.ll
1 ; Test the MSA intrinsics that are encoded with the VEC instruction format.
2
3 ; RUN: llc -march=mips -mattr=+msa,+fp64 < %s | FileCheck -check-prefix=ANYENDIAN %s
4 ; RUN: llc -march=mipsel -mattr=+msa,+fp64 < %s | FileCheck -check-prefix=ANYENDIAN %s
5
6 @llvm_mips_and_v_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_and_v_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_and_v_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_and_v_b_test() nounwind {
11 entry:
12   %0 = load <16 x i8>* @llvm_mips_and_v_b_ARG1
13   %1 = load <16 x i8>* @llvm_mips_and_v_b_ARG2
14   %2 = bitcast <16 x i8> %0 to <16 x i8>
15   %3 = bitcast <16 x i8> %1 to <16 x i8>
16   %4 = tail call <16 x i8> @llvm.mips.and.v(<16 x i8> %2, <16 x i8> %3)
17   %5 = bitcast <16 x i8> %4 to <16 x i8>
18   store <16 x i8> %5, <16 x i8>* @llvm_mips_and_v_b_RES
19   ret void
20 }
21
22 ; ANYENDIAN: llvm_mips_and_v_b_test:
23 ; ANYENDIAN: ld.b
24 ; ANYENDIAN: ld.b
25 ; ANYENDIAN: and.v
26 ; ANYENDIAN: st.b
27 ; ANYENDIAN: .size llvm_mips_and_v_b_test
28 ;
29 @llvm_mips_and_v_h_ARG1 = global <8 x i16> <i16 0, i16 1, i16 2, i16 3, i16 4, i16 5, i16 6, i16 7>, align 16
30 @llvm_mips_and_v_h_ARG2 = global <8 x i16> <i16 8, i16 9, i16 10, i16 11, i16 12, i16 13, i16 14, i16 15>, align 16
31 @llvm_mips_and_v_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_and_v_h_test() nounwind {
34 entry:
35   %0 = load <8 x i16>* @llvm_mips_and_v_h_ARG1
36   %1 = load <8 x i16>* @llvm_mips_and_v_h_ARG2
37   %2 = bitcast <8 x i16> %0 to <16 x i8>
38   %3 = bitcast <8 x i16> %1 to <16 x i8>
39   %4 = tail call <16 x i8> @llvm.mips.and.v(<16 x i8> %2, <16 x i8> %3)
40   %5 = bitcast <16 x i8> %4 to <8 x i16>
41   store <8 x i16> %5, <8 x i16>* @llvm_mips_and_v_h_RES
42   ret void
43 }
44
45 ; ANYENDIAN: llvm_mips_and_v_h_test:
46 ; ANYENDIAN: ld.b
47 ; ANYENDIAN: ld.b
48 ; ANYENDIAN: and.v
49 ; ANYENDIAN: st.b
50 ; ANYENDIAN: .size llvm_mips_and_v_h_test
51 ;
52 @llvm_mips_and_v_w_ARG1 = global <4 x i32> <i32 0, i32 1, i32 2, i32 3>, align 16
53 @llvm_mips_and_v_w_ARG2 = global <4 x i32> <i32 4, i32 5, i32 6, i32 7>, align 16
54 @llvm_mips_and_v_w_RES  = global <4 x i32> <i32 0, i32 0, i32 0, i32 0>, align 16
55
56 define void @llvm_mips_and_v_w_test() nounwind {
57 entry:
58   %0 = load <4 x i32>* @llvm_mips_and_v_w_ARG1
59   %1 = load <4 x i32>* @llvm_mips_and_v_w_ARG2
60   %2 = bitcast <4 x i32> %0 to <16 x i8>
61   %3 = bitcast <4 x i32> %1 to <16 x i8>
62   %4 = tail call <16 x i8> @llvm.mips.and.v(<16 x i8> %2, <16 x i8> %3)
63   %5 = bitcast <16 x i8> %4 to <4 x i32>
64   store <4 x i32> %5, <4 x i32>* @llvm_mips_and_v_w_RES
65   ret void
66 }
67
68 ; ANYENDIAN: llvm_mips_and_v_w_test:
69 ; ANYENDIAN: ld.b
70 ; ANYENDIAN: ld.b
71 ; ANYENDIAN: and.v
72 ; ANYENDIAN: st.b
73 ; ANYENDIAN: .size llvm_mips_and_v_w_test
74 ;
75 @llvm_mips_and_v_d_ARG1 = global <2 x i64> <i64 0, i64 1>, align 16
76 @llvm_mips_and_v_d_ARG2 = global <2 x i64> <i64 2, i64 3>, align 16
77 @llvm_mips_and_v_d_RES  = global <2 x i64> <i64 0, i64 0>, align 16
78
79 define void @llvm_mips_and_v_d_test() nounwind {
80 entry:
81   %0 = load <2 x i64>* @llvm_mips_and_v_d_ARG1
82   %1 = load <2 x i64>* @llvm_mips_and_v_d_ARG2
83   %2 = bitcast <2 x i64> %0 to <16 x i8>
84   %3 = bitcast <2 x i64> %1 to <16 x i8>
85   %4 = tail call <16 x i8> @llvm.mips.and.v(<16 x i8> %2, <16 x i8> %3)
86   %5 = bitcast <16 x i8> %4 to <2 x i64>
87   store <2 x i64> %5, <2 x i64>* @llvm_mips_and_v_d_RES
88   ret void
89 }
90
91 ; ANYENDIAN: llvm_mips_and_v_d_test:
92 ; ANYENDIAN: ld.b
93 ; ANYENDIAN: ld.b
94 ; ANYENDIAN: and.v
95 ; ANYENDIAN: st.b
96 ; ANYENDIAN: .size llvm_mips_and_v_d_test
97 ;
98 define void @and_v_b_test() nounwind {
99 entry:
100   %0 = load <16 x i8>* @llvm_mips_and_v_b_ARG1
101   %1 = load <16 x i8>* @llvm_mips_and_v_b_ARG2
102   %2 = and <16 x i8> %0, %1
103   store <16 x i8> %2, <16 x i8>* @llvm_mips_and_v_b_RES
104   ret void
105 }
106
107 ; ANYENDIAN: and_v_b_test:
108 ; ANYENDIAN: ld.b
109 ; ANYENDIAN: ld.b
110 ; ANYENDIAN: and.v
111 ; ANYENDIAN: st.b
112 ; ANYENDIAN: .size and_v_b_test
113 ;
114 define void @and_v_h_test() nounwind {
115 entry:
116   %0 = load <8 x i16>* @llvm_mips_and_v_h_ARG1
117   %1 = load <8 x i16>* @llvm_mips_and_v_h_ARG2
118   %2 = and <8 x i16> %0, %1
119   store <8 x i16> %2, <8 x i16>* @llvm_mips_and_v_h_RES
120   ret void
121 }
122
123 ; ANYENDIAN: and_v_h_test:
124 ; ANYENDIAN: ld.h
125 ; ANYENDIAN: ld.h
126 ; ANYENDIAN: and.v
127 ; ANYENDIAN: st.h
128 ; ANYENDIAN: .size and_v_h_test
129 ;
130
131 define void @and_v_w_test() nounwind {
132 entry:
133   %0 = load <4 x i32>* @llvm_mips_and_v_w_ARG1
134   %1 = load <4 x i32>* @llvm_mips_and_v_w_ARG2
135   %2 = and <4 x i32> %0, %1
136   store <4 x i32> %2, <4 x i32>* @llvm_mips_and_v_w_RES
137   ret void
138 }
139
140 ; ANYENDIAN: and_v_w_test:
141 ; ANYENDIAN: ld.w
142 ; ANYENDIAN: ld.w
143 ; ANYENDIAN: and.v
144 ; ANYENDIAN: st.w
145 ; ANYENDIAN: .size and_v_w_test
146 ;
147
148 define void @and_v_d_test() nounwind {
149 entry:
150   %0 = load <2 x i64>* @llvm_mips_and_v_d_ARG1
151   %1 = load <2 x i64>* @llvm_mips_and_v_d_ARG2
152   %2 = and <2 x i64> %0, %1
153   store <2 x i64> %2, <2 x i64>* @llvm_mips_and_v_d_RES
154   ret void
155 }
156
157 ; ANYENDIAN: and_v_d_test:
158 ; ANYENDIAN: ld.d
159 ; ANYENDIAN: ld.d
160 ; ANYENDIAN: and.v
161 ; ANYENDIAN: st.d
162 ; ANYENDIAN: .size and_v_d_test
163 ;
164 @llvm_mips_bmnz_v_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
165 @llvm_mips_bmnz_v_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
166 @llvm_mips_bmnz_v_b_ARG3 = 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
167 @llvm_mips_bmnz_v_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
168
169 define void @llvm_mips_bmnz_v_b_test() nounwind {
170 entry:
171   %0 = load <16 x i8>* @llvm_mips_bmnz_v_b_ARG1
172   %1 = load <16 x i8>* @llvm_mips_bmnz_v_b_ARG2
173   %2 = load <16 x i8>* @llvm_mips_bmnz_v_b_ARG3
174   %3 = bitcast <16 x i8> %0 to <16 x i8>
175   %4 = bitcast <16 x i8> %1 to <16 x i8>
176   %5 = bitcast <16 x i8> %2 to <16 x i8>
177   %6 = tail call <16 x i8> @llvm.mips.bmnz.v(<16 x i8> %3, <16 x i8> %4, <16 x i8> %5)
178   %7 = bitcast <16 x i8> %6 to <16 x i8>
179   store <16 x i8> %7, <16 x i8>* @llvm_mips_bmnz_v_b_RES
180   ret void
181 }
182
183 ; ANYENDIAN: llvm_mips_bmnz_v_b_test:
184 ; ANYENDIAN-DAG: lw [[R1:\$[0-9]+]], %got(llvm_mips_bmnz_v_b_ARG1)(
185 ; ANYENDIAN-DAG: lw [[R2:\$[0-9]+]], %got(llvm_mips_bmnz_v_b_ARG2)(
186 ; ANYENDIAN-DAG: lw [[R3:\$[0-9]+]], %got(llvm_mips_bmnz_v_b_ARG3)(
187 ; ANYENDIAN-DAG: ld.b [[R4:\$w[0-9]+]], 0([[R1]])
188 ; ANYENDIAN-DAG: ld.b [[R5:\$w[0-9]+]], 0([[R2]])
189 ; ANYENDIAN-DAG: ld.b [[R6:\$w[0-9]+]], 0([[R3]])
190 ; ANYENDIAN-DAG: bmnz.v [[R4]], [[R5]], [[R6]]
191 ; ANYENDIAN-DAG: st.b [[R4]], 0(
192 ; ANYENDIAN: .size llvm_mips_bmnz_v_b_test
193
194 @llvm_mips_bmnz_v_h_ARG1 = global <8 x i16> <i16 0, i16 1, i16 2, i16 3, i16 4, i16 5, i16 6, i16 7>, align 16
195 @llvm_mips_bmnz_v_h_ARG2 = global <8 x i16> <i16 8, i16 9, i16 10, i16 11, i16 12, i16 13, i16 14, i16 15>, align 16
196 @llvm_mips_bmnz_v_h_ARG3 = global <8 x i16> <i16 0, i16 1, i16 2, i16 3, i16 4, i16 5, i16 6, i16 7>, align 16
197 @llvm_mips_bmnz_v_h_RES  = global <8 x i16> <i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0>, align 16
198
199 define void @llvm_mips_bmnz_v_h_test() nounwind {
200 entry:
201   %0 = load <8 x i16>* @llvm_mips_bmnz_v_h_ARG1
202   %1 = load <8 x i16>* @llvm_mips_bmnz_v_h_ARG2
203   %2 = load <8 x i16>* @llvm_mips_bmnz_v_h_ARG3
204   %3 = bitcast <8 x i16> %0 to <16 x i8>
205   %4 = bitcast <8 x i16> %1 to <16 x i8>
206   %5 = bitcast <8 x i16> %2 to <16 x i8>
207   %6 = tail call <16 x i8> @llvm.mips.bmnz.v(<16 x i8> %3, <16 x i8> %4, <16 x i8> %5)
208   %7 = bitcast <16 x i8> %6 to <8 x i16>
209   store <8 x i16> %7, <8 x i16>* @llvm_mips_bmnz_v_h_RES
210   ret void
211 }
212
213 ; ANYENDIAN: llvm_mips_bmnz_v_h_test:
214 ; ANYENDIAN-DAG: lw [[R1:\$[0-9]+]], %got(llvm_mips_bmnz_v_h_ARG1)(
215 ; ANYENDIAN-DAG: lw [[R2:\$[0-9]+]], %got(llvm_mips_bmnz_v_h_ARG2)(
216 ; ANYENDIAN-DAG: lw [[R3:\$[0-9]+]], %got(llvm_mips_bmnz_v_h_ARG3)(
217 ; ANYENDIAN-DAG: ld.b [[R4:\$w[0-9]+]], 0([[R1]])
218 ; ANYENDIAN-DAG: ld.b [[R5:\$w[0-9]+]], 0([[R2]])
219 ; ANYENDIAN-DAG: ld.b [[R6:\$w[0-9]+]], 0([[R3]])
220 ; ANYENDIAN-DAG: bmnz.v [[R4]], [[R5]], [[R6]]
221 ; ANYENDIAN-DAG: st.b [[R4]], 0(
222 ; ANYENDIAN: .size llvm_mips_bmnz_v_h_test
223
224 @llvm_mips_bmnz_v_w_ARG1 = global <4 x i32> <i32 0, i32 1, i32 2, i32 3>, align 16
225 @llvm_mips_bmnz_v_w_ARG2 = global <4 x i32> <i32 4, i32 5, i32 6, i32 7>, align 16
226 @llvm_mips_bmnz_v_w_ARG3 = global <4 x i32> <i32 0, i32 1, i32 2, i32 3>, align 16
227 @llvm_mips_bmnz_v_w_RES  = global <4 x i32> <i32 0, i32 0, i32 0, i32 0>, align 16
228
229 define void @llvm_mips_bmnz_v_w_test() nounwind {
230 entry:
231   %0 = load <4 x i32>* @llvm_mips_bmnz_v_w_ARG1
232   %1 = load <4 x i32>* @llvm_mips_bmnz_v_w_ARG2
233   %2 = load <4 x i32>* @llvm_mips_bmnz_v_w_ARG3
234   %3 = bitcast <4 x i32> %0 to <16 x i8>
235   %4 = bitcast <4 x i32> %1 to <16 x i8>
236   %5 = bitcast <4 x i32> %2 to <16 x i8>
237   %6 = tail call <16 x i8> @llvm.mips.bmnz.v(<16 x i8> %3, <16 x i8> %4, <16 x i8> %5)
238   %7 = bitcast <16 x i8> %6 to <4 x i32>
239   store <4 x i32> %7, <4 x i32>* @llvm_mips_bmnz_v_w_RES
240   ret void
241 }
242
243 ; ANYENDIAN: llvm_mips_bmnz_v_w_test:
244 ; ANYENDIAN-DAG: lw [[R1:\$[0-9]+]], %got(llvm_mips_bmnz_v_w_ARG1)(
245 ; ANYENDIAN-DAG: lw [[R2:\$[0-9]+]], %got(llvm_mips_bmnz_v_w_ARG2)(
246 ; ANYENDIAN-DAG: lw [[R3:\$[0-9]+]], %got(llvm_mips_bmnz_v_w_ARG3)(
247 ; ANYENDIAN-DAG: ld.b [[R4:\$w[0-9]+]], 0([[R1]])
248 ; ANYENDIAN-DAG: ld.b [[R5:\$w[0-9]+]], 0([[R2]])
249 ; ANYENDIAN-DAG: ld.b [[R6:\$w[0-9]+]], 0([[R3]])
250 ; ANYENDIAN-DAG: bmnz.v [[R4]], [[R5]], [[R6]]
251 ; ANYENDIAN-DAG: st.b [[R4]], 0(
252 ; ANYENDIAN: .size llvm_mips_bmnz_v_w_test
253
254 @llvm_mips_bmnz_v_d_ARG1 = global <2 x i64> <i64 0, i64 1>, align 16
255 @llvm_mips_bmnz_v_d_ARG2 = global <2 x i64> <i64 2, i64 3>, align 16
256 @llvm_mips_bmnz_v_d_ARG3 = global <2 x i64> <i64 0, i64 1>, align 16
257 @llvm_mips_bmnz_v_d_RES  = global <2 x i64> <i64 0, i64 0>, align 16
258
259 define void @llvm_mips_bmnz_v_d_test() nounwind {
260 entry:
261   %0 = load <2 x i64>* @llvm_mips_bmnz_v_d_ARG1
262   %1 = load <2 x i64>* @llvm_mips_bmnz_v_d_ARG2
263   %2 = load <2 x i64>* @llvm_mips_bmnz_v_d_ARG3
264   %3 = bitcast <2 x i64> %0 to <16 x i8>
265   %4 = bitcast <2 x i64> %1 to <16 x i8>
266   %5 = bitcast <2 x i64> %2 to <16 x i8>
267   %6 = tail call <16 x i8> @llvm.mips.bmnz.v(<16 x i8> %3, <16 x i8> %4, <16 x i8> %5)
268   %7 = bitcast <16 x i8> %6 to <2 x i64>
269   store <2 x i64> %7, <2 x i64>* @llvm_mips_bmnz_v_d_RES
270   ret void
271 }
272
273 ; ANYENDIAN: llvm_mips_bmnz_v_d_test:
274 ; ANYENDIAN-DAG: lw [[R1:\$[0-9]+]], %got(llvm_mips_bmnz_v_d_ARG1)(
275 ; ANYENDIAN-DAG: lw [[R2:\$[0-9]+]], %got(llvm_mips_bmnz_v_d_ARG2)(
276 ; ANYENDIAN-DAG: lw [[R3:\$[0-9]+]], %got(llvm_mips_bmnz_v_d_ARG3)(
277 ; ANYENDIAN-DAG: ld.b [[R4:\$w[0-9]+]], 0([[R1]])
278 ; ANYENDIAN-DAG: ld.b [[R5:\$w[0-9]+]], 0([[R2]])
279 ; ANYENDIAN-DAG: ld.b [[R6:\$w[0-9]+]], 0([[R3]])
280 ; ANYENDIAN-DAG: bmnz.v [[R4]], [[R5]], [[R6]]
281 ; ANYENDIAN-DAG: st.b [[R4]], 0(
282 ; ANYENDIAN: .size llvm_mips_bmnz_v_d_test
283
284 @llvm_mips_bmz_v_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
285 @llvm_mips_bmz_v_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
286 @llvm_mips_bmz_v_b_ARG3 = 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
287 @llvm_mips_bmz_v_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
288
289 define void @llvm_mips_bmz_v_b_test() nounwind {
290 entry:
291   %0 = load <16 x i8>* @llvm_mips_bmz_v_b_ARG1
292   %1 = load <16 x i8>* @llvm_mips_bmz_v_b_ARG2
293   %2 = load <16 x i8>* @llvm_mips_bmz_v_b_ARG3
294   %3 = bitcast <16 x i8> %0 to <16 x i8>
295   %4 = bitcast <16 x i8> %1 to <16 x i8>
296   %5 = bitcast <16 x i8> %2 to <16 x i8>
297   %6 = tail call <16 x i8> @llvm.mips.bmz.v(<16 x i8> %3, <16 x i8> %4, <16 x i8> %5)
298   %7 = bitcast <16 x i8> %6 to <16 x i8>
299   store <16 x i8> %7, <16 x i8>* @llvm_mips_bmz_v_b_RES
300   ret void
301 }
302
303 ; ANYENDIAN: llvm_mips_bmz_v_b_test:
304 ; ANYENDIAN-DAG: lw [[R1:\$[0-9]+]], %got(llvm_mips_bmz_v_b_ARG1)(
305 ; ANYENDIAN-DAG: lw [[R2:\$[0-9]+]], %got(llvm_mips_bmz_v_b_ARG2)(
306 ; ANYENDIAN-DAG: lw [[R3:\$[0-9]+]], %got(llvm_mips_bmz_v_b_ARG3)(
307 ; ANYENDIAN-DAG: ld.b [[R4:\$w[0-9]+]], 0([[R1]])
308 ; ANYENDIAN-DAG: ld.b [[R5:\$w[0-9]+]], 0([[R2]])
309 ; ANYENDIAN-DAG: ld.b [[R6:\$w[0-9]+]], 0([[R3]])
310 ; bmnz.v is the same as bmz.v with ws and wd_in swapped
311 ; ANYENDIAN-DAG: bmnz.v [[R5]], [[R4]], [[R6]]
312 ; ANYENDIAN-DAG: st.b [[R5]], 0(
313 ; ANYENDIAN: .size llvm_mips_bmz_v_b_test
314
315 @llvm_mips_bmz_v_h_ARG1 = global <8 x i16> <i16 0, i16 1, i16 2, i16 3, i16 4, i16 5, i16 6, i16 7>, align 16
316 @llvm_mips_bmz_v_h_ARG2 = global <8 x i16> <i16 8, i16 9, i16 10, i16 11, i16 12, i16 13, i16 14, i16 15>, align 16
317 @llvm_mips_bmz_v_h_ARG3 = global <8 x i16> <i16 0, i16 1, i16 2, i16 3, i16 4, i16 5, i16 6, i16 7>, align 16
318 @llvm_mips_bmz_v_h_RES  = global <8 x i16> <i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0>, align 16
319
320 define void @llvm_mips_bmz_v_h_test() nounwind {
321 entry:
322   %0 = load <8 x i16>* @llvm_mips_bmz_v_h_ARG1
323   %1 = load <8 x i16>* @llvm_mips_bmz_v_h_ARG2
324   %2 = load <8 x i16>* @llvm_mips_bmz_v_h_ARG3
325   %3 = bitcast <8 x i16> %0 to <16 x i8>
326   %4 = bitcast <8 x i16> %1 to <16 x i8>
327   %5 = bitcast <8 x i16> %2 to <16 x i8>
328   %6 = tail call <16 x i8> @llvm.mips.bmz.v(<16 x i8> %3, <16 x i8> %4, <16 x i8> %5)
329   %7 = bitcast <16 x i8> %6 to <8 x i16>
330   store <8 x i16> %7, <8 x i16>* @llvm_mips_bmz_v_h_RES
331   ret void
332 }
333
334 ; ANYENDIAN: llvm_mips_bmz_v_h_test:
335 ; ANYENDIAN-DAG: lw [[R1:\$[0-9]+]], %got(llvm_mips_bmz_v_h_ARG1)(
336 ; ANYENDIAN-DAG: lw [[R2:\$[0-9]+]], %got(llvm_mips_bmz_v_h_ARG2)(
337 ; ANYENDIAN-DAG: lw [[R3:\$[0-9]+]], %got(llvm_mips_bmz_v_h_ARG3)(
338 ; ANYENDIAN-DAG: ld.b [[R4:\$w[0-9]+]], 0([[R1]])
339 ; ANYENDIAN-DAG: ld.b [[R5:\$w[0-9]+]], 0([[R2]])
340 ; ANYENDIAN-DAG: ld.b [[R6:\$w[0-9]+]], 0([[R3]])
341 ; bmnz.v is the same as bmz.v with ws and wd_in swapped
342 ; ANYENDIAN-DAG: bmnz.v [[R5]], [[R4]], [[R6]]
343 ; ANYENDIAN-DAG: st.b [[R5]], 0(
344 ; ANYENDIAN: .size llvm_mips_bmz_v_h_test
345
346 @llvm_mips_bmz_v_w_ARG1 = global <4 x i32> <i32 0, i32 1, i32 2, i32 3>, align 16
347 @llvm_mips_bmz_v_w_ARG2 = global <4 x i32> <i32 4, i32 5, i32 6, i32 7>, align 16
348 @llvm_mips_bmz_v_w_ARG3 = global <4 x i32> <i32 0, i32 1, i32 2, i32 3>, align 16
349 @llvm_mips_bmz_v_w_RES  = global <4 x i32> <i32 0, i32 0, i32 0, i32 0>, align 16
350
351 define void @llvm_mips_bmz_v_w_test() nounwind {
352 entry:
353   %0 = load <4 x i32>* @llvm_mips_bmz_v_w_ARG1
354   %1 = load <4 x i32>* @llvm_mips_bmz_v_w_ARG2
355   %2 = load <4 x i32>* @llvm_mips_bmz_v_w_ARG3
356   %3 = bitcast <4 x i32> %0 to <16 x i8>
357   %4 = bitcast <4 x i32> %1 to <16 x i8>
358   %5 = bitcast <4 x i32> %2 to <16 x i8>
359   %6 = tail call <16 x i8> @llvm.mips.bmz.v(<16 x i8> %3, <16 x i8> %4, <16 x i8> %5)
360   %7 = bitcast <16 x i8> %6 to <4 x i32>
361   store <4 x i32> %7, <4 x i32>* @llvm_mips_bmz_v_w_RES
362   ret void
363 }
364
365 ; ANYENDIAN: llvm_mips_bmz_v_w_test:
366 ; ANYENDIAN-DAG: lw [[R1:\$[0-9]+]], %got(llvm_mips_bmz_v_w_ARG1)(
367 ; ANYENDIAN-DAG: lw [[R2:\$[0-9]+]], %got(llvm_mips_bmz_v_w_ARG2)(
368 ; ANYENDIAN-DAG: lw [[R3:\$[0-9]+]], %got(llvm_mips_bmz_v_w_ARG3)(
369 ; ANYENDIAN-DAG: ld.b [[R4:\$w[0-9]+]], 0([[R1]])
370 ; ANYENDIAN-DAG: ld.b [[R5:\$w[0-9]+]], 0([[R2]])
371 ; ANYENDIAN-DAG: ld.b [[R6:\$w[0-9]+]], 0([[R3]])
372 ; bmnz.v is the same as bmz.v with ws and wd_in swapped
373 ; ANYENDIAN-DAG: bmnz.v [[R5]], [[R4]], [[R6]]
374 ; ANYENDIAN-DAG: st.b [[R5]], 0(
375 ; ANYENDIAN: .size llvm_mips_bmz_v_w_test
376
377 @llvm_mips_bmz_v_d_ARG1 = global <2 x i64> <i64 0, i64 1>, align 16
378 @llvm_mips_bmz_v_d_ARG2 = global <2 x i64> <i64 2, i64 3>, align 16
379 @llvm_mips_bmz_v_d_ARG3 = global <2 x i64> <i64 0, i64 1>, align 16
380 @llvm_mips_bmz_v_d_RES  = global <2 x i64> <i64 0, i64 0>, align 16
381
382 define void @llvm_mips_bmz_v_d_test() nounwind {
383 entry:
384   %0 = load <2 x i64>* @llvm_mips_bmz_v_d_ARG1
385   %1 = load <2 x i64>* @llvm_mips_bmz_v_d_ARG2
386   %2 = load <2 x i64>* @llvm_mips_bmz_v_d_ARG3
387   %3 = bitcast <2 x i64> %0 to <16 x i8>
388   %4 = bitcast <2 x i64> %1 to <16 x i8>
389   %5 = bitcast <2 x i64> %2 to <16 x i8>
390   %6 = tail call <16 x i8> @llvm.mips.bmz.v(<16 x i8> %3, <16 x i8> %4, <16 x i8> %5)
391   %7 = bitcast <16 x i8> %6 to <2 x i64>
392   store <2 x i64> %7, <2 x i64>* @llvm_mips_bmz_v_d_RES
393   ret void
394 }
395
396 ; ANYENDIAN: llvm_mips_bmz_v_d_test:
397 ; ANYENDIAN-DAG: lw [[R1:\$[0-9]+]], %got(llvm_mips_bmz_v_d_ARG1)(
398 ; ANYENDIAN-DAG: lw [[R2:\$[0-9]+]], %got(llvm_mips_bmz_v_d_ARG2)(
399 ; ANYENDIAN-DAG: lw [[R3:\$[0-9]+]], %got(llvm_mips_bmz_v_d_ARG3)(
400 ; ANYENDIAN-DAG: ld.b [[R4:\$w[0-9]+]], 0([[R1]])
401 ; ANYENDIAN-DAG: ld.b [[R5:\$w[0-9]+]], 0([[R2]])
402 ; ANYENDIAN-DAG: ld.b [[R6:\$w[0-9]+]], 0([[R3]])
403 ; bmnz.v is the same as bmz.v with ws and wd_in swapped
404 ; ANYENDIAN-DAG: bmnz.v [[R5]], [[R4]], [[R6]]
405 ; ANYENDIAN-DAG: st.b [[R5]], 0(
406 ; ANYENDIAN: .size llvm_mips_bmz_v_d_test
407
408 @llvm_mips_bsel_v_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
409 @llvm_mips_bsel_v_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
410 @llvm_mips_bsel_v_b_ARG3 = 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
411 @llvm_mips_bsel_v_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
412
413 define void @llvm_mips_bsel_v_b_test() nounwind {
414 entry:
415   %0 = load <16 x i8>* @llvm_mips_bsel_v_b_ARG1
416   %1 = load <16 x i8>* @llvm_mips_bsel_v_b_ARG2
417   %2 = load <16 x i8>* @llvm_mips_bsel_v_b_ARG3
418   %3 = bitcast <16 x i8> %0 to <16 x i8>
419   %4 = bitcast <16 x i8> %1 to <16 x i8>
420   %5 = bitcast <16 x i8> %2 to <16 x i8>
421   %6 = tail call <16 x i8> @llvm.mips.bsel.v(<16 x i8> %3, <16 x i8> %4, <16 x i8> %5)
422   %7 = bitcast <16 x i8> %6 to <16 x i8>
423   store <16 x i8> %7, <16 x i8>* @llvm_mips_bsel_v_b_RES
424   ret void
425 }
426
427 ; ANYENDIAN: llvm_mips_bsel_v_b_test:
428 ; ANYENDIAN-DAG: lw [[R1:\$[0-9]+]], %got(llvm_mips_bsel_v_b_ARG1)(
429 ; ANYENDIAN-DAG: lw [[R2:\$[0-9]+]], %got(llvm_mips_bsel_v_b_ARG2)(
430 ; ANYENDIAN-DAG: lw [[R3:\$[0-9]+]], %got(llvm_mips_bsel_v_b_ARG3)(
431 ; ANYENDIAN-DAG: ld.b [[R4:\$w[0-9]+]], 0([[R1]])
432 ; ANYENDIAN-DAG: ld.b [[R5:\$w[0-9]+]], 0([[R2]])
433 ; ANYENDIAN-DAG: ld.b [[R6:\$w[0-9]+]], 0([[R3]])
434 ; bmnz.v is the same as bsel.v with (wd_in, wt, ws) -> (wt, ws, wd_in)
435 ; ANYENDIAN-DAG: bmnz.v [[R5]], [[R6]], [[R4]]
436 ; ANYENDIAN-DAG: st.b [[R5]], 0(
437 ; ANYENDIAN: .size llvm_mips_bsel_v_b_test
438
439 @llvm_mips_bsel_v_h_ARG1 = global <8 x i16> <i16 0, i16 1, i16 2, i16 3, i16 4, i16 5, i16 6, i16 7>, align 16
440 @llvm_mips_bsel_v_h_ARG2 = global <8 x i16> <i16 8, i16 9, i16 10, i16 11, i16 12, i16 13, i16 14, i16 15>, align 16
441 @llvm_mips_bsel_v_h_ARG3 = global <8 x i16> <i16 0, i16 1, i16 2, i16 3, i16 4, i16 5, i16 6, i16 7>, align 16
442 @llvm_mips_bsel_v_h_RES  = global <8 x i16> <i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0>, align 16
443
444 define void @llvm_mips_bsel_v_h_test() nounwind {
445 entry:
446   %0 = load <8 x i16>* @llvm_mips_bsel_v_h_ARG1
447   %1 = load <8 x i16>* @llvm_mips_bsel_v_h_ARG2
448   %2 = load <8 x i16>* @llvm_mips_bsel_v_h_ARG3
449   %3 = bitcast <8 x i16> %0 to <16 x i8>
450   %4 = bitcast <8 x i16> %1 to <16 x i8>
451   %5 = bitcast <8 x i16> %2 to <16 x i8>
452   %6 = tail call <16 x i8> @llvm.mips.bsel.v(<16 x i8> %3, <16 x i8> %4, <16 x i8> %5)
453   %7 = bitcast <16 x i8> %6 to <8 x i16>
454   store <8 x i16> %7, <8 x i16>* @llvm_mips_bsel_v_h_RES
455   ret void
456 }
457
458 ; ANYENDIAN: llvm_mips_bsel_v_h_test:
459 ; ANYENDIAN-DAG: lw [[R1:\$[0-9]+]], %got(llvm_mips_bsel_v_h_ARG1)(
460 ; ANYENDIAN-DAG: lw [[R2:\$[0-9]+]], %got(llvm_mips_bsel_v_h_ARG2)(
461 ; ANYENDIAN-DAG: lw [[R3:\$[0-9]+]], %got(llvm_mips_bsel_v_h_ARG3)(
462 ; ANYENDIAN-DAG: ld.b [[R4:\$w[0-9]+]], 0([[R1]])
463 ; ANYENDIAN-DAG: ld.b [[R5:\$w[0-9]+]], 0([[R2]])
464 ; ANYENDIAN-DAG: ld.b [[R6:\$w[0-9]+]], 0([[R3]])
465 ; bmnz.v is the same as bsel.v with (wd_in, wt, ws) -> (wt, ws, wd_in)
466 ; ANYENDIAN-DAG: bmnz.v [[R5]], [[R6]], [[R4]]
467 ; ANYENDIAN-DAG: st.b [[R5]], 0(
468 ; ANYENDIAN: .size llvm_mips_bsel_v_h_test
469
470 @llvm_mips_bsel_v_w_ARG1 = global <4 x i32> <i32 0, i32 1, i32 2, i32 3>, align 16
471 @llvm_mips_bsel_v_w_ARG2 = global <4 x i32> <i32 4, i32 5, i32 6, i32 7>, align 16
472 @llvm_mips_bsel_v_w_ARG3 = global <4 x i32> <i32 0, i32 1, i32 2, i32 3>, align 16
473 @llvm_mips_bsel_v_w_RES  = global <4 x i32> <i32 0, i32 0, i32 0, i32 0>, align 16
474
475 define void @llvm_mips_bsel_v_w_test() nounwind {
476 entry:
477   %0 = load <4 x i32>* @llvm_mips_bsel_v_w_ARG1
478   %1 = load <4 x i32>* @llvm_mips_bsel_v_w_ARG2
479   %2 = load <4 x i32>* @llvm_mips_bsel_v_w_ARG3
480   %3 = bitcast <4 x i32> %0 to <16 x i8>
481   %4 = bitcast <4 x i32> %1 to <16 x i8>
482   %5 = bitcast <4 x i32> %2 to <16 x i8>
483   %6 = tail call <16 x i8> @llvm.mips.bsel.v(<16 x i8> %3, <16 x i8> %4, <16 x i8> %5)
484   %7 = bitcast <16 x i8> %6 to <4 x i32>
485   store <4 x i32> %7, <4 x i32>* @llvm_mips_bsel_v_w_RES
486   ret void
487 }
488
489 ; ANYENDIAN: llvm_mips_bsel_v_w_test:
490 ; ANYENDIAN-DAG: lw [[R1:\$[0-9]+]], %got(llvm_mips_bsel_v_w_ARG1)(
491 ; ANYENDIAN-DAG: lw [[R2:\$[0-9]+]], %got(llvm_mips_bsel_v_w_ARG2)(
492 ; ANYENDIAN-DAG: lw [[R3:\$[0-9]+]], %got(llvm_mips_bsel_v_w_ARG3)(
493 ; ANYENDIAN-DAG: ld.b [[R4:\$w[0-9]+]], 0([[R1]])
494 ; ANYENDIAN-DAG: ld.b [[R5:\$w[0-9]+]], 0([[R2]])
495 ; ANYENDIAN-DAG: ld.b [[R6:\$w[0-9]+]], 0([[R3]])
496 ; bmnz.v is the same as bsel.v with (wd_in, wt, ws) -> (wt, ws, wd_in)
497 ; ANYENDIAN-DAG: bmnz.v [[R5]], [[R6]], [[R4]]
498 ; ANYENDIAN-DAG: st.b [[R5]], 0(
499 ; ANYENDIAN: .size llvm_mips_bsel_v_w_test
500
501 @llvm_mips_bsel_v_d_ARG1 = global <2 x i64> <i64 0, i64 1>, align 16
502 @llvm_mips_bsel_v_d_ARG2 = global <2 x i64> <i64 2, i64 3>, align 16
503 @llvm_mips_bsel_v_d_ARG3 = global <2 x i64> <i64 0, i64 1>, align 16
504 @llvm_mips_bsel_v_d_RES  = global <2 x i64> <i64 0, i64 0>, align 16
505
506 define void @llvm_mips_bsel_v_d_test() nounwind {
507 entry:
508   %0 = load <2 x i64>* @llvm_mips_bsel_v_d_ARG1
509   %1 = load <2 x i64>* @llvm_mips_bsel_v_d_ARG2
510   %2 = load <2 x i64>* @llvm_mips_bsel_v_d_ARG3
511   %3 = bitcast <2 x i64> %0 to <16 x i8>
512   %4 = bitcast <2 x i64> %1 to <16 x i8>
513   %5 = bitcast <2 x i64> %2 to <16 x i8>
514   %6 = tail call <16 x i8> @llvm.mips.bsel.v(<16 x i8> %3, <16 x i8> %4, <16 x i8> %5)
515   %7 = bitcast <16 x i8> %6 to <2 x i64>
516   store <2 x i64> %7, <2 x i64>* @llvm_mips_bsel_v_d_RES
517   ret void
518 }
519
520 ; ANYENDIAN: llvm_mips_bsel_v_d_test:
521 ; ANYENDIAN-DAG: lw [[R1:\$[0-9]+]], %got(llvm_mips_bsel_v_d_ARG1)(
522 ; ANYENDIAN-DAG: lw [[R2:\$[0-9]+]], %got(llvm_mips_bsel_v_d_ARG2)(
523 ; ANYENDIAN-DAG: lw [[R3:\$[0-9]+]], %got(llvm_mips_bsel_v_d_ARG3)(
524 ; ANYENDIAN-DAG: ld.b [[R4:\$w[0-9]+]], 0([[R1]])
525 ; ANYENDIAN-DAG: ld.b [[R5:\$w[0-9]+]], 0([[R2]])
526 ; ANYENDIAN-DAG: ld.b [[R6:\$w[0-9]+]], 0([[R3]])
527 ; bmnz.v is the same as bsel.v with (wd_in, wt, ws) -> (wt, ws, wd_in)
528 ; ANYENDIAN-DAG: bmnz.v [[R5]], [[R6]], [[R4]]
529 ; ANYENDIAN-DAG: st.b [[R5]], 0(
530 ; ANYENDIAN: .size llvm_mips_bsel_v_d_test
531
532 @llvm_mips_nor_v_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
533 @llvm_mips_nor_v_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
534 @llvm_mips_nor_v_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
535
536 define void @llvm_mips_nor_v_b_test() nounwind {
537 entry:
538   %0 = load <16 x i8>* @llvm_mips_nor_v_b_ARG1
539   %1 = load <16 x i8>* @llvm_mips_nor_v_b_ARG2
540   %2 = bitcast <16 x i8> %0 to <16 x i8>
541   %3 = bitcast <16 x i8> %1 to <16 x i8>
542   %4 = tail call <16 x i8> @llvm.mips.nor.v(<16 x i8> %2, <16 x i8> %3)
543   %5 = bitcast <16 x i8> %4 to <16 x i8>
544   store <16 x i8> %5, <16 x i8>* @llvm_mips_nor_v_b_RES
545   ret void
546 }
547
548 ; ANYENDIAN: llvm_mips_nor_v_b_test:
549 ; ANYENDIAN: ld.b
550 ; ANYENDIAN: ld.b
551 ; ANYENDIAN: nor.v
552 ; ANYENDIAN: st.b
553 ; ANYENDIAN: .size llvm_mips_nor_v_b_test
554 ;
555 @llvm_mips_nor_v_h_ARG1 = global <8 x i16> <i16 0, i16 1, i16 2, i16 3, i16 4, i16 5, i16 6, i16 7>, align 16
556 @llvm_mips_nor_v_h_ARG2 = global <8 x i16> <i16 8, i16 9, i16 10, i16 11, i16 12, i16 13, i16 14, i16 15>, align 16
557 @llvm_mips_nor_v_h_RES  = global <8 x i16> <i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0>, align 16
558
559 define void @llvm_mips_nor_v_h_test() nounwind {
560 entry:
561   %0 = load <8 x i16>* @llvm_mips_nor_v_h_ARG1
562   %1 = load <8 x i16>* @llvm_mips_nor_v_h_ARG2
563   %2 = bitcast <8 x i16> %0 to <16 x i8>
564   %3 = bitcast <8 x i16> %1 to <16 x i8>
565   %4 = tail call <16 x i8> @llvm.mips.nor.v(<16 x i8> %2, <16 x i8> %3)
566   %5 = bitcast <16 x i8> %4 to <8 x i16>
567   store <8 x i16> %5, <8 x i16>* @llvm_mips_nor_v_h_RES
568   ret void
569 }
570
571 ; ANYENDIAN: llvm_mips_nor_v_h_test:
572 ; ANYENDIAN: ld.b
573 ; ANYENDIAN: ld.b
574 ; ANYENDIAN: nor.v
575 ; ANYENDIAN: st.b
576 ; ANYENDIAN: .size llvm_mips_nor_v_h_test
577 ;
578 @llvm_mips_nor_v_w_ARG1 = global <4 x i32> <i32 0, i32 1, i32 2, i32 3>, align 16
579 @llvm_mips_nor_v_w_ARG2 = global <4 x i32> <i32 4, i32 5, i32 6, i32 7>, align 16
580 @llvm_mips_nor_v_w_RES  = global <4 x i32> <i32 0, i32 0, i32 0, i32 0>, align 16
581
582 define void @llvm_mips_nor_v_w_test() nounwind {
583 entry:
584   %0 = load <4 x i32>* @llvm_mips_nor_v_w_ARG1
585   %1 = load <4 x i32>* @llvm_mips_nor_v_w_ARG2
586   %2 = bitcast <4 x i32> %0 to <16 x i8>
587   %3 = bitcast <4 x i32> %1 to <16 x i8>
588   %4 = tail call <16 x i8> @llvm.mips.nor.v(<16 x i8> %2, <16 x i8> %3)
589   %5 = bitcast <16 x i8> %4 to <4 x i32>
590   store <4 x i32> %5, <4 x i32>* @llvm_mips_nor_v_w_RES
591   ret void
592 }
593
594 ; ANYENDIAN: llvm_mips_nor_v_w_test:
595 ; ANYENDIAN: ld.b
596 ; ANYENDIAN: ld.b
597 ; ANYENDIAN: nor.v
598 ; ANYENDIAN: st.b
599 ; ANYENDIAN: .size llvm_mips_nor_v_w_test
600 ;
601 @llvm_mips_nor_v_d_ARG1 = global <2 x i64> <i64 0, i64 1>, align 16
602 @llvm_mips_nor_v_d_ARG2 = global <2 x i64> <i64 2, i64 3>, align 16
603 @llvm_mips_nor_v_d_RES  = global <2 x i64> <i64 0, i64 0>, align 16
604
605 define void @llvm_mips_nor_v_d_test() nounwind {
606 entry:
607   %0 = load <2 x i64>* @llvm_mips_nor_v_d_ARG1
608   %1 = load <2 x i64>* @llvm_mips_nor_v_d_ARG2
609   %2 = bitcast <2 x i64> %0 to <16 x i8>
610   %3 = bitcast <2 x i64> %1 to <16 x i8>
611   %4 = tail call <16 x i8> @llvm.mips.nor.v(<16 x i8> %2, <16 x i8> %3)
612   %5 = bitcast <16 x i8> %4 to <2 x i64>
613   store <2 x i64> %5, <2 x i64>* @llvm_mips_nor_v_d_RES
614   ret void
615 }
616
617 ; ANYENDIAN: llvm_mips_nor_v_d_test:
618 ; ANYENDIAN: ld.b
619 ; ANYENDIAN: ld.b
620 ; ANYENDIAN: nor.v
621 ; ANYENDIAN: st.b
622 ; ANYENDIAN: .size llvm_mips_nor_v_d_test
623 ;
624 @llvm_mips_or_v_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
625 @llvm_mips_or_v_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
626 @llvm_mips_or_v_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
627
628 define void @llvm_mips_or_v_b_test() nounwind {
629 entry:
630   %0 = load <16 x i8>* @llvm_mips_or_v_b_ARG1
631   %1 = load <16 x i8>* @llvm_mips_or_v_b_ARG2
632   %2 = bitcast <16 x i8> %0 to <16 x i8>
633   %3 = bitcast <16 x i8> %1 to <16 x i8>
634   %4 = tail call <16 x i8> @llvm.mips.or.v(<16 x i8> %2, <16 x i8> %3)
635   %5 = bitcast <16 x i8> %4 to <16 x i8>
636   store <16 x i8> %5, <16 x i8>* @llvm_mips_or_v_b_RES
637   ret void
638 }
639
640 ; ANYENDIAN: llvm_mips_or_v_b_test:
641 ; ANYENDIAN: ld.b
642 ; ANYENDIAN: ld.b
643 ; ANYENDIAN: or.v
644 ; ANYENDIAN: st.b
645 ; ANYENDIAN: .size llvm_mips_or_v_b_test
646 ;
647 @llvm_mips_or_v_h_ARG1 = global <8 x i16> <i16 0, i16 1, i16 2, i16 3, i16 4, i16 5, i16 6, i16 7>, align 16
648 @llvm_mips_or_v_h_ARG2 = global <8 x i16> <i16 8, i16 9, i16 10, i16 11, i16 12, i16 13, i16 14, i16 15>, align 16
649 @llvm_mips_or_v_h_RES  = global <8 x i16> <i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0>, align 16
650
651 define void @llvm_mips_or_v_h_test() nounwind {
652 entry:
653   %0 = load <8 x i16>* @llvm_mips_or_v_h_ARG1
654   %1 = load <8 x i16>* @llvm_mips_or_v_h_ARG2
655   %2 = bitcast <8 x i16> %0 to <16 x i8>
656   %3 = bitcast <8 x i16> %1 to <16 x i8>
657   %4 = tail call <16 x i8> @llvm.mips.or.v(<16 x i8> %2, <16 x i8> %3)
658   %5 = bitcast <16 x i8> %4 to <8 x i16>
659   store <8 x i16> %5, <8 x i16>* @llvm_mips_or_v_h_RES
660   ret void
661 }
662
663 ; ANYENDIAN: llvm_mips_or_v_h_test:
664 ; ANYENDIAN: ld.b
665 ; ANYENDIAN: ld.b
666 ; ANYENDIAN: or.v
667 ; ANYENDIAN: st.b
668 ; ANYENDIAN: .size llvm_mips_or_v_h_test
669 ;
670 @llvm_mips_or_v_w_ARG1 = global <4 x i32> <i32 0, i32 1, i32 2, i32 3>, align 16
671 @llvm_mips_or_v_w_ARG2 = global <4 x i32> <i32 4, i32 5, i32 6, i32 7>, align 16
672 @llvm_mips_or_v_w_RES  = global <4 x i32> <i32 0, i32 0, i32 0, i32 0>, align 16
673
674 define void @llvm_mips_or_v_w_test() nounwind {
675 entry:
676   %0 = load <4 x i32>* @llvm_mips_or_v_w_ARG1
677   %1 = load <4 x i32>* @llvm_mips_or_v_w_ARG2
678   %2 = bitcast <4 x i32> %0 to <16 x i8>
679   %3 = bitcast <4 x i32> %1 to <16 x i8>
680   %4 = tail call <16 x i8> @llvm.mips.or.v(<16 x i8> %2, <16 x i8> %3)
681   %5 = bitcast <16 x i8> %4 to <4 x i32>
682   store <4 x i32> %5, <4 x i32>* @llvm_mips_or_v_w_RES
683   ret void
684 }
685
686 ; ANYENDIAN: llvm_mips_or_v_w_test:
687 ; ANYENDIAN: ld.b
688 ; ANYENDIAN: ld.b
689 ; ANYENDIAN: or.v
690 ; ANYENDIAN: st.b
691 ; ANYENDIAN: .size llvm_mips_or_v_w_test
692 ;
693 @llvm_mips_or_v_d_ARG1 = global <2 x i64> <i64 0, i64 1>, align 16
694 @llvm_mips_or_v_d_ARG2 = global <2 x i64> <i64 2, i64 3>, align 16
695 @llvm_mips_or_v_d_RES  = global <2 x i64> <i64 0, i64 0>, align 16
696
697 define void @llvm_mips_or_v_d_test() nounwind {
698 entry:
699   %0 = load <2 x i64>* @llvm_mips_or_v_d_ARG1
700   %1 = load <2 x i64>* @llvm_mips_or_v_d_ARG2
701   %2 = bitcast <2 x i64> %0 to <16 x i8>
702   %3 = bitcast <2 x i64> %1 to <16 x i8>
703   %4 = tail call <16 x i8> @llvm.mips.or.v(<16 x i8> %2, <16 x i8> %3)
704   %5 = bitcast <16 x i8> %4 to <2 x i64>
705   store <2 x i64> %5, <2 x i64>* @llvm_mips_or_v_d_RES
706   ret void
707 }
708
709 ; ANYENDIAN: llvm_mips_or_v_d_test:
710 ; ANYENDIAN: ld.b
711 ; ANYENDIAN: ld.b
712 ; ANYENDIAN: or.v
713 ; ANYENDIAN: st.b
714 ; ANYENDIAN: .size llvm_mips_or_v_d_test
715 ;
716 define void @or_v_b_test() nounwind {
717 entry:
718   %0 = load <16 x i8>* @llvm_mips_or_v_b_ARG1
719   %1 = load <16 x i8>* @llvm_mips_or_v_b_ARG2
720   %2 = or <16 x i8> %0, %1
721   store <16 x i8> %2, <16 x i8>* @llvm_mips_or_v_b_RES
722   ret void
723 }
724
725 ; ANYENDIAN: or_v_b_test:
726 ; ANYENDIAN: ld.b
727 ; ANYENDIAN: ld.b
728 ; ANYENDIAN: or.v
729 ; ANYENDIAN: st.b
730 ; ANYENDIAN: .size or_v_b_test
731 ;
732 define void @or_v_h_test() nounwind {
733 entry:
734   %0 = load <8 x i16>* @llvm_mips_or_v_h_ARG1
735   %1 = load <8 x i16>* @llvm_mips_or_v_h_ARG2
736   %2 = or <8 x i16> %0, %1
737   store <8 x i16> %2, <8 x i16>* @llvm_mips_or_v_h_RES
738   ret void
739 }
740
741 ; ANYENDIAN: or_v_h_test:
742 ; ANYENDIAN: ld.h
743 ; ANYENDIAN: ld.h
744 ; ANYENDIAN: or.v
745 ; ANYENDIAN: st.h
746 ; ANYENDIAN: .size or_v_h_test
747 ;
748
749 define void @or_v_w_test() nounwind {
750 entry:
751   %0 = load <4 x i32>* @llvm_mips_or_v_w_ARG1
752   %1 = load <4 x i32>* @llvm_mips_or_v_w_ARG2
753   %2 = or <4 x i32> %0, %1
754   store <4 x i32> %2, <4 x i32>* @llvm_mips_or_v_w_RES
755   ret void
756 }
757
758 ; ANYENDIAN: or_v_w_test:
759 ; ANYENDIAN: ld.w
760 ; ANYENDIAN: ld.w
761 ; ANYENDIAN: or.v
762 ; ANYENDIAN: st.w
763 ; ANYENDIAN: .size or_v_w_test
764 ;
765
766 define void @or_v_d_test() nounwind {
767 entry:
768   %0 = load <2 x i64>* @llvm_mips_or_v_d_ARG1
769   %1 = load <2 x i64>* @llvm_mips_or_v_d_ARG2
770   %2 = or <2 x i64> %0, %1
771   store <2 x i64> %2, <2 x i64>* @llvm_mips_or_v_d_RES
772   ret void
773 }
774
775 ; ANYENDIAN: or_v_d_test:
776 ; ANYENDIAN: ld.d
777 ; ANYENDIAN: ld.d
778 ; ANYENDIAN: or.v
779 ; ANYENDIAN: st.d
780 ; ANYENDIAN: .size or_v_d_test
781 ;
782 @llvm_mips_xor_v_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
783 @llvm_mips_xor_v_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
784 @llvm_mips_xor_v_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
785
786 define void @llvm_mips_xor_v_b_test() nounwind {
787 entry:
788   %0 = load <16 x i8>* @llvm_mips_xor_v_b_ARG1
789   %1 = load <16 x i8>* @llvm_mips_xor_v_b_ARG2
790   %2 = bitcast <16 x i8> %0 to <16 x i8>
791   %3 = bitcast <16 x i8> %1 to <16 x i8>
792   %4 = tail call <16 x i8> @llvm.mips.xor.v(<16 x i8> %2, <16 x i8> %3)
793   %5 = bitcast <16 x i8> %4 to <16 x i8>
794   store <16 x i8> %5, <16 x i8>* @llvm_mips_xor_v_b_RES
795   ret void
796 }
797
798 ; ANYENDIAN: llvm_mips_xor_v_b_test:
799 ; ANYENDIAN: ld.b
800 ; ANYENDIAN: ld.b
801 ; ANYENDIAN: xor.v
802 ; ANYENDIAN: st.b
803 ; ANYENDIAN: .size llvm_mips_xor_v_b_test
804 ;
805 @llvm_mips_xor_v_h_ARG1 = global <8 x i16> <i16 0, i16 1, i16 2, i16 3, i16 4, i16 5, i16 6, i16 7>, align 16
806 @llvm_mips_xor_v_h_ARG2 = global <8 x i16> <i16 8, i16 9, i16 10, i16 11, i16 12, i16 13, i16 14, i16 15>, align 16
807 @llvm_mips_xor_v_h_RES  = global <8 x i16> <i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0>, align 16
808
809 define void @llvm_mips_xor_v_h_test() nounwind {
810 entry:
811   %0 = load <8 x i16>* @llvm_mips_xor_v_h_ARG1
812   %1 = load <8 x i16>* @llvm_mips_xor_v_h_ARG2
813   %2 = bitcast <8 x i16> %0 to <16 x i8>
814   %3 = bitcast <8 x i16> %1 to <16 x i8>
815   %4 = tail call <16 x i8> @llvm.mips.xor.v(<16 x i8> %2, <16 x i8> %3)
816   %5 = bitcast <16 x i8> %4 to <8 x i16>
817   store <8 x i16> %5, <8 x i16>* @llvm_mips_xor_v_h_RES
818   ret void
819 }
820
821 ; ANYENDIAN: llvm_mips_xor_v_h_test:
822 ; ANYENDIAN: ld.b
823 ; ANYENDIAN: ld.b
824 ; ANYENDIAN: xor.v
825 ; ANYENDIAN: st.b
826 ; ANYENDIAN: .size llvm_mips_xor_v_h_test
827 ;
828 @llvm_mips_xor_v_w_ARG1 = global <4 x i32> <i32 0, i32 1, i32 2, i32 3>, align 16
829 @llvm_mips_xor_v_w_ARG2 = global <4 x i32> <i32 4, i32 5, i32 6, i32 7>, align 16
830 @llvm_mips_xor_v_w_RES  = global <4 x i32> <i32 0, i32 0, i32 0, i32 0>, align 16
831
832 define void @llvm_mips_xor_v_w_test() nounwind {
833 entry:
834   %0 = load <4 x i32>* @llvm_mips_xor_v_w_ARG1
835   %1 = load <4 x i32>* @llvm_mips_xor_v_w_ARG2
836   %2 = bitcast <4 x i32> %0 to <16 x i8>
837   %3 = bitcast <4 x i32> %1 to <16 x i8>
838   %4 = tail call <16 x i8> @llvm.mips.xor.v(<16 x i8> %2, <16 x i8> %3)
839   %5 = bitcast <16 x i8> %4 to <4 x i32>
840   store <4 x i32> %5, <4 x i32>* @llvm_mips_xor_v_w_RES
841   ret void
842 }
843
844 ; ANYENDIAN: llvm_mips_xor_v_w_test:
845 ; ANYENDIAN: ld.b
846 ; ANYENDIAN: ld.b
847 ; ANYENDIAN: xor.v
848 ; ANYENDIAN: st.b
849 ; ANYENDIAN: .size llvm_mips_xor_v_w_test
850 ;
851 @llvm_mips_xor_v_d_ARG1 = global <2 x i64> <i64 0, i64 1>, align 16
852 @llvm_mips_xor_v_d_ARG2 = global <2 x i64> <i64 2, i64 3>, align 16
853 @llvm_mips_xor_v_d_RES  = global <2 x i64> <i64 0, i64 0>, align 16
854
855 define void @llvm_mips_xor_v_d_test() nounwind {
856 entry:
857   %0 = load <2 x i64>* @llvm_mips_xor_v_d_ARG1
858   %1 = load <2 x i64>* @llvm_mips_xor_v_d_ARG2
859   %2 = bitcast <2 x i64> %0 to <16 x i8>
860   %3 = bitcast <2 x i64> %1 to <16 x i8>
861   %4 = tail call <16 x i8> @llvm.mips.xor.v(<16 x i8> %2, <16 x i8> %3)
862   %5 = bitcast <16 x i8> %4 to <2 x i64>
863   store <2 x i64> %5, <2 x i64>* @llvm_mips_xor_v_d_RES
864   ret void
865 }
866
867 ; ANYENDIAN: llvm_mips_xor_v_d_test:
868 ; ANYENDIAN: ld.b
869 ; ANYENDIAN: ld.b
870 ; ANYENDIAN: xor.v
871 ; ANYENDIAN: st.b
872 ; ANYENDIAN: .size llvm_mips_xor_v_d_test
873 ;
874 define void @xor_v_b_test() nounwind {
875 entry:
876   %0 = load <16 x i8>* @llvm_mips_xor_v_b_ARG1
877   %1 = load <16 x i8>* @llvm_mips_xor_v_b_ARG2
878   %2 = xor <16 x i8> %0, %1
879   store <16 x i8> %2, <16 x i8>* @llvm_mips_xor_v_b_RES
880   ret void
881 }
882
883 ; ANYENDIAN: xor_v_b_test:
884 ; ANYENDIAN: ld.b
885 ; ANYENDIAN: ld.b
886 ; ANYENDIAN: xor.v
887 ; ANYENDIAN: st.b
888 ; ANYENDIAN: .size xor_v_b_test
889 ;
890 define void @xor_v_h_test() nounwind {
891 entry:
892   %0 = load <8 x i16>* @llvm_mips_xor_v_h_ARG1
893   %1 = load <8 x i16>* @llvm_mips_xor_v_h_ARG2
894   %2 = xor <8 x i16> %0, %1
895   store <8 x i16> %2, <8 x i16>* @llvm_mips_xor_v_h_RES
896   ret void
897 }
898
899 ; ANYENDIAN: xor_v_h_test:
900 ; ANYENDIAN: ld.h
901 ; ANYENDIAN: ld.h
902 ; ANYENDIAN: xor.v
903 ; ANYENDIAN: st.h
904 ; ANYENDIAN: .size xor_v_h_test
905 ;
906
907 define void @xor_v_w_test() nounwind {
908 entry:
909   %0 = load <4 x i32>* @llvm_mips_xor_v_w_ARG1
910   %1 = load <4 x i32>* @llvm_mips_xor_v_w_ARG2
911   %2 = xor <4 x i32> %0, %1
912   store <4 x i32> %2, <4 x i32>* @llvm_mips_xor_v_w_RES
913   ret void
914 }
915
916 ; ANYENDIAN: xor_v_w_test:
917 ; ANYENDIAN: ld.w
918 ; ANYENDIAN: ld.w
919 ; ANYENDIAN: xor.v
920 ; ANYENDIAN: st.w
921 ; ANYENDIAN: .size xor_v_w_test
922 ;
923
924 define void @xor_v_d_test() nounwind {
925 entry:
926   %0 = load <2 x i64>* @llvm_mips_xor_v_d_ARG1
927   %1 = load <2 x i64>* @llvm_mips_xor_v_d_ARG2
928   %2 = xor <2 x i64> %0, %1
929   store <2 x i64> %2, <2 x i64>* @llvm_mips_xor_v_d_RES
930   ret void
931 }
932
933 ; ANYENDIAN: xor_v_d_test:
934 ; ANYENDIAN: ld.d
935 ; ANYENDIAN: ld.d
936 ; ANYENDIAN: xor.v
937 ; ANYENDIAN: st.d
938 ; ANYENDIAN: .size xor_v_d_test
939 ;
940 declare <16 x i8> @llvm.mips.and.v(<16 x i8>, <16 x i8>) nounwind
941 declare <16 x i8> @llvm.mips.bmnz.v(<16 x i8>, <16 x i8>, <16 x i8>) nounwind
942 declare <16 x i8> @llvm.mips.bmz.v(<16 x i8>, <16 x i8>, <16 x i8>) nounwind
943 declare <16 x i8> @llvm.mips.bsel.v(<16 x i8>, <16 x i8>, <16 x i8>) nounwind
944 declare <16 x i8> @llvm.mips.nor.v(<16 x i8>, <16 x i8>) nounwind
945 declare <16 x i8> @llvm.mips.or.v(<16 x i8>, <16 x i8>) nounwind
946 declare <16 x i8> @llvm.mips.xor.v(<16 x i8>, <16 x i8>) nounwind