[mips][msa] Fix vector insertions where the index is variable
[oota-llvm.git] / test / CodeGen / Mips / msa / 3r-a.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 'a'
3
4 ; RUN: llc -march=mips -mattr=+msa,+fp64 < %s | FileCheck %s
5 ; RUN: llc -march=mipsel -mattr=+msa,+fp64 < %s | FileCheck %s
6
7 ; It should fail to compile without fp64.
8 ; RUN: not llc -march=mips -mattr=+msa < %s 2>&1 | \
9 ; RUN:    FileCheck -check-prefix=FP32ERROR %s
10 ; FP32ERROR: LLVM ERROR: MSA requires a 64-bit FPU register file (FR=1 mode).
11
12 @llvm_mips_add_a_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
13 @llvm_mips_add_a_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
14 @llvm_mips_add_a_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
15
16 define void @llvm_mips_add_a_b_test() nounwind {
17 entry:
18   %0 = load <16 x i8>* @llvm_mips_add_a_b_ARG1
19   %1 = load <16 x i8>* @llvm_mips_add_a_b_ARG2
20   %2 = tail call <16 x i8> @llvm.mips.add.a.b(<16 x i8> %0, <16 x i8> %1)
21   store <16 x i8> %2, <16 x i8>* @llvm_mips_add_a_b_RES
22   ret void
23 }
24
25 declare <16 x i8> @llvm.mips.add.a.b(<16 x i8>, <16 x i8>) nounwind
26
27 ; CHECK: llvm_mips_add_a_b_test:
28 ; CHECK-DAG: lw [[R1:\$[0-9]+]], %got(llvm_mips_add_a_b_ARG1)
29 ; CHECK-DAG: lw [[R2:\$[0-9]+]], %got(llvm_mips_add_a_b_ARG2)
30 ; CHECK-DAG: ld.b [[WS:\$w[0-9]+]], 0([[R1]])
31 ; CHECK-DAG: ld.b [[WT:\$w[0-9]+]], 0([[R2]])
32 ; CHECK-DAG: add_a.b [[WD:\$w[0-9]+]], [[WS]], [[WT]]
33 ; CHECK-DAG: lw [[R3:\$[0-9]+]], %got(llvm_mips_add_a_b_RES)
34 ; CHECK-DAG: st.b [[WD]], 0([[R3]])
35 ; CHECK: .size llvm_mips_add_a_b_test
36 ;
37 @llvm_mips_add_a_h_ARG1 = global <8 x i16> <i16 0, i16 1, i16 2, i16 3, i16 4, i16 5, i16 6, i16 7>, align 16
38 @llvm_mips_add_a_h_ARG2 = global <8 x i16> <i16 8, i16 9, i16 10, i16 11, i16 12, i16 13, i16 14, i16 15>, align 16
39 @llvm_mips_add_a_h_RES  = global <8 x i16> <i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0>, align 16
40
41 define void @llvm_mips_add_a_h_test() nounwind {
42 entry:
43   %0 = load <8 x i16>* @llvm_mips_add_a_h_ARG1
44   %1 = load <8 x i16>* @llvm_mips_add_a_h_ARG2
45   %2 = tail call <8 x i16> @llvm.mips.add.a.h(<8 x i16> %0, <8 x i16> %1)
46   store <8 x i16> %2, <8 x i16>* @llvm_mips_add_a_h_RES
47   ret void
48 }
49
50 declare <8 x i16> @llvm.mips.add.a.h(<8 x i16>, <8 x i16>) nounwind
51
52 ; CHECK: llvm_mips_add_a_h_test:
53 ; CHECK-DAG: lw [[R1:\$[0-9]+]], %got(llvm_mips_add_a_h_ARG1)
54 ; CHECK-DAG: lw [[R2:\$[0-9]+]], %got(llvm_mips_add_a_h_ARG2)
55 ; CHECK-DAG: ld.h [[WS:\$w[0-9]+]], 0([[R1]])
56 ; CHECK-DAG: ld.h [[WT:\$w[0-9]+]], 0([[R2]])
57 ; CHECK-DAG: add_a.h [[WD:\$w[0-9]+]], [[WS]], [[WT]]
58 ; CHECK-DAG: lw [[R3:\$[0-9]+]], %got(llvm_mips_add_a_h_RES)
59 ; CHECK-DAG: st.h [[WD]], 0([[R3]])
60 ; CHECK: .size llvm_mips_add_a_h_test
61 ;
62 @llvm_mips_add_a_w_ARG1 = global <4 x i32> <i32 0, i32 1, i32 2, i32 3>, align 16
63 @llvm_mips_add_a_w_ARG2 = global <4 x i32> <i32 4, i32 5, i32 6, i32 7>, align 16
64 @llvm_mips_add_a_w_RES  = global <4 x i32> <i32 0, i32 0, i32 0, i32 0>, align 16
65
66 define void @llvm_mips_add_a_w_test() nounwind {
67 entry:
68   %0 = load <4 x i32>* @llvm_mips_add_a_w_ARG1
69   %1 = load <4 x i32>* @llvm_mips_add_a_w_ARG2
70   %2 = tail call <4 x i32> @llvm.mips.add.a.w(<4 x i32> %0, <4 x i32> %1)
71   store <4 x i32> %2, <4 x i32>* @llvm_mips_add_a_w_RES
72   ret void
73 }
74
75 declare <4 x i32> @llvm.mips.add.a.w(<4 x i32>, <4 x i32>) nounwind
76
77 ; CHECK: llvm_mips_add_a_w_test:
78 ; CHECK-DAG: lw [[R1:\$[0-9]+]], %got(llvm_mips_add_a_w_ARG1)
79 ; CHECK-DAG: lw [[R2:\$[0-9]+]], %got(llvm_mips_add_a_w_ARG2)
80 ; CHECK-DAG: ld.w [[WS:\$w[0-9]+]], 0([[R1]])
81 ; CHECK-DAG: ld.w [[WT:\$w[0-9]+]], 0([[R2]])
82 ; CHECK-DAG: add_a.w [[WD:\$w[0-9]+]], [[WS]], [[WT]]
83 ; CHECK-DAG: lw [[R3:\$[0-9]+]], %got(llvm_mips_add_a_w_RES)
84 ; CHECK-DAG: st.w [[WD]], 0([[R3]])
85 ; CHECK: .size llvm_mips_add_a_w_test
86 ;
87 @llvm_mips_add_a_d_ARG1 = global <2 x i64> <i64 0, i64 1>, align 16
88 @llvm_mips_add_a_d_ARG2 = global <2 x i64> <i64 2, i64 3>, align 16
89 @llvm_mips_add_a_d_RES  = global <2 x i64> <i64 0, i64 0>, align 16
90
91 define void @llvm_mips_add_a_d_test() nounwind {
92 entry:
93   %0 = load <2 x i64>* @llvm_mips_add_a_d_ARG1
94   %1 = load <2 x i64>* @llvm_mips_add_a_d_ARG2
95   %2 = tail call <2 x i64> @llvm.mips.add.a.d(<2 x i64> %0, <2 x i64> %1)
96   store <2 x i64> %2, <2 x i64>* @llvm_mips_add_a_d_RES
97   ret void
98 }
99
100 declare <2 x i64> @llvm.mips.add.a.d(<2 x i64>, <2 x i64>) nounwind
101
102 ; CHECK: llvm_mips_add_a_d_test:
103 ; CHECK-DAG: lw [[R1:\$[0-9]+]], %got(llvm_mips_add_a_d_ARG1)
104 ; CHECK-DAG: lw [[R2:\$[0-9]+]], %got(llvm_mips_add_a_d_ARG2)
105 ; CHECK-DAG: ld.d [[WS:\$w[0-9]+]], 0([[R1]])
106 ; CHECK-DAG: ld.d [[WT:\$w[0-9]+]], 0([[R2]])
107 ; CHECK-DAG: add_a.d [[WD:\$w[0-9]+]], [[WS]], [[WT]]
108 ; CHECK-DAG: lw [[R3:\$[0-9]+]], %got(llvm_mips_add_a_d_RES)
109 ; CHECK-DAG: st.d [[WD]], 0([[R3]])
110 ; CHECK: .size llvm_mips_add_a_d_test
111 ;
112 @llvm_mips_adds_a_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
113 @llvm_mips_adds_a_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
114 @llvm_mips_adds_a_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
115
116 define void @llvm_mips_adds_a_b_test() nounwind {
117 entry:
118   %0 = load <16 x i8>* @llvm_mips_adds_a_b_ARG1
119   %1 = load <16 x i8>* @llvm_mips_adds_a_b_ARG2
120   %2 = tail call <16 x i8> @llvm.mips.adds.a.b(<16 x i8> %0, <16 x i8> %1)
121   store <16 x i8> %2, <16 x i8>* @llvm_mips_adds_a_b_RES
122   ret void
123 }
124
125 declare <16 x i8> @llvm.mips.adds.a.b(<16 x i8>, <16 x i8>) nounwind
126
127 ; CHECK: llvm_mips_adds_a_b_test:
128 ; CHECK-DAG: lw [[R1:\$[0-9]+]], %got(llvm_mips_adds_a_b_ARG1)
129 ; CHECK-DAG: lw [[R2:\$[0-9]+]], %got(llvm_mips_adds_a_b_ARG2)
130 ; CHECK-DAG: ld.b [[WS:\$w[0-9]+]], 0([[R1]])
131 ; CHECK-DAG: ld.b [[WT:\$w[0-9]+]], 0([[R2]])
132 ; CHECK-DAG: adds_a.b [[WD:\$w[0-9]+]], [[WS]], [[WT]]
133 ; CHECK-DAG: lw [[R3:\$[0-9]+]], %got(llvm_mips_adds_a_b_RES)
134 ; CHECK-DAG: st.b [[WD]], 0([[R3]])
135 ; CHECK: .size llvm_mips_adds_a_b_test
136 ;
137 @llvm_mips_adds_a_h_ARG1 = global <8 x i16> <i16 0, i16 1, i16 2, i16 3, i16 4, i16 5, i16 6, i16 7>, align 16
138 @llvm_mips_adds_a_h_ARG2 = global <8 x i16> <i16 8, i16 9, i16 10, i16 11, i16 12, i16 13, i16 14, i16 15>, align 16
139 @llvm_mips_adds_a_h_RES  = global <8 x i16> <i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0>, align 16
140
141 define void @llvm_mips_adds_a_h_test() nounwind {
142 entry:
143   %0 = load <8 x i16>* @llvm_mips_adds_a_h_ARG1
144   %1 = load <8 x i16>* @llvm_mips_adds_a_h_ARG2
145   %2 = tail call <8 x i16> @llvm.mips.adds.a.h(<8 x i16> %0, <8 x i16> %1)
146   store <8 x i16> %2, <8 x i16>* @llvm_mips_adds_a_h_RES
147   ret void
148 }
149
150 declare <8 x i16> @llvm.mips.adds.a.h(<8 x i16>, <8 x i16>) nounwind
151
152 ; CHECK: llvm_mips_adds_a_h_test:
153 ; CHECK-DAG: lw [[R1:\$[0-9]+]], %got(llvm_mips_adds_a_h_ARG1)
154 ; CHECK-DAG: lw [[R2:\$[0-9]+]], %got(llvm_mips_adds_a_h_ARG2)
155 ; CHECK-DAG: ld.h [[WS:\$w[0-9]+]], 0([[R1]])
156 ; CHECK-DAG: ld.h [[WT:\$w[0-9]+]], 0([[R2]])
157 ; CHECK-DAG: adds_a.h [[WD:\$w[0-9]+]], [[WS]], [[WT]]
158 ; CHECK-DAG: lw [[R3:\$[0-9]+]], %got(llvm_mips_adds_a_h_RES)
159 ; CHECK-DAG: st.h [[WD]], 0([[R3]])
160 ; CHECK: .size llvm_mips_adds_a_h_test
161 ;
162 @llvm_mips_adds_a_w_ARG1 = global <4 x i32> <i32 0, i32 1, i32 2, i32 3>, align 16
163 @llvm_mips_adds_a_w_ARG2 = global <4 x i32> <i32 4, i32 5, i32 6, i32 7>, align 16
164 @llvm_mips_adds_a_w_RES  = global <4 x i32> <i32 0, i32 0, i32 0, i32 0>, align 16
165
166 define void @llvm_mips_adds_a_w_test() nounwind {
167 entry:
168   %0 = load <4 x i32>* @llvm_mips_adds_a_w_ARG1
169   %1 = load <4 x i32>* @llvm_mips_adds_a_w_ARG2
170   %2 = tail call <4 x i32> @llvm.mips.adds.a.w(<4 x i32> %0, <4 x i32> %1)
171   store <4 x i32> %2, <4 x i32>* @llvm_mips_adds_a_w_RES
172   ret void
173 }
174
175 declare <4 x i32> @llvm.mips.adds.a.w(<4 x i32>, <4 x i32>) nounwind
176
177 ; CHECK: llvm_mips_adds_a_w_test:
178 ; CHECK-DAG: lw [[R1:\$[0-9]+]], %got(llvm_mips_adds_a_w_ARG1)
179 ; CHECK-DAG: lw [[R2:\$[0-9]+]], %got(llvm_mips_adds_a_w_ARG2)
180 ; CHECK-DAG: ld.w [[WS:\$w[0-9]+]], 0([[R1]])
181 ; CHECK-DAG: ld.w [[WT:\$w[0-9]+]], 0([[R2]])
182 ; CHECK-DAG: adds_a.w [[WD:\$w[0-9]+]], [[WS]], [[WT]]
183 ; CHECK-DAG: lw [[R3:\$[0-9]+]], %got(llvm_mips_adds_a_w_RES)
184 ; CHECK-DAG: st.w [[WD]], 0([[R3]])
185 ; CHECK: .size llvm_mips_adds_a_w_test
186 ;
187 @llvm_mips_adds_a_d_ARG1 = global <2 x i64> <i64 0, i64 1>, align 16
188 @llvm_mips_adds_a_d_ARG2 = global <2 x i64> <i64 2, i64 3>, align 16
189 @llvm_mips_adds_a_d_RES  = global <2 x i64> <i64 0, i64 0>, align 16
190
191 define void @llvm_mips_adds_a_d_test() nounwind {
192 entry:
193   %0 = load <2 x i64>* @llvm_mips_adds_a_d_ARG1
194   %1 = load <2 x i64>* @llvm_mips_adds_a_d_ARG2
195   %2 = tail call <2 x i64> @llvm.mips.adds.a.d(<2 x i64> %0, <2 x i64> %1)
196   store <2 x i64> %2, <2 x i64>* @llvm_mips_adds_a_d_RES
197   ret void
198 }
199
200 declare <2 x i64> @llvm.mips.adds.a.d(<2 x i64>, <2 x i64>) nounwind
201
202 ; CHECK: llvm_mips_adds_a_d_test:
203 ; CHECK-DAG: lw [[R1:\$[0-9]+]], %got(llvm_mips_adds_a_d_ARG1)
204 ; CHECK-DAG: lw [[R2:\$[0-9]+]], %got(llvm_mips_adds_a_d_ARG2)
205 ; CHECK-DAG: ld.d [[WS:\$w[0-9]+]], 0([[R1]])
206 ; CHECK-DAG: ld.d [[WT:\$w[0-9]+]], 0([[R2]])
207 ; CHECK-DAG: adds_a.d [[WD:\$w[0-9]+]], [[WS]], [[WT]]
208 ; CHECK-DAG: lw [[R3:\$[0-9]+]], %got(llvm_mips_adds_a_d_RES)
209 ; CHECK-DAG: st.d [[WD]], 0([[R3]])
210 ; CHECK: .size llvm_mips_adds_a_d_test
211 ;
212 @llvm_mips_adds_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
213 @llvm_mips_adds_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
214 @llvm_mips_adds_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
215
216 define void @llvm_mips_adds_s_b_test() nounwind {
217 entry:
218   %0 = load <16 x i8>* @llvm_mips_adds_s_b_ARG1
219   %1 = load <16 x i8>* @llvm_mips_adds_s_b_ARG2
220   %2 = tail call <16 x i8> @llvm.mips.adds.s.b(<16 x i8> %0, <16 x i8> %1)
221   store <16 x i8> %2, <16 x i8>* @llvm_mips_adds_s_b_RES
222   ret void
223 }
224
225 declare <16 x i8> @llvm.mips.adds.s.b(<16 x i8>, <16 x i8>) nounwind
226
227 ; CHECK: llvm_mips_adds_s_b_test:
228 ; CHECK-DAG: lw [[R1:\$[0-9]+]], %got(llvm_mips_adds_s_b_ARG1)
229 ; CHECK-DAG: lw [[R2:\$[0-9]+]], %got(llvm_mips_adds_s_b_ARG2)
230 ; CHECK-DAG: ld.b [[WS:\$w[0-9]+]], 0([[R1]])
231 ; CHECK-DAG: ld.b [[WT:\$w[0-9]+]], 0([[R2]])
232 ; CHECK-DAG: adds_s.b [[WD:\$w[0-9]+]], [[WS]], [[WT]]
233 ; CHECK-DAG: lw [[R3:\$[0-9]+]], %got(llvm_mips_adds_s_b_RES)
234 ; CHECK-DAG: st.b [[WD]], 0([[R3]])
235 ; CHECK: .size llvm_mips_adds_s_b_test
236 ;
237 @llvm_mips_adds_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
238 @llvm_mips_adds_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
239 @llvm_mips_adds_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
240
241 define void @llvm_mips_adds_s_h_test() nounwind {
242 entry:
243   %0 = load <8 x i16>* @llvm_mips_adds_s_h_ARG1
244   %1 = load <8 x i16>* @llvm_mips_adds_s_h_ARG2
245   %2 = tail call <8 x i16> @llvm.mips.adds.s.h(<8 x i16> %0, <8 x i16> %1)
246   store <8 x i16> %2, <8 x i16>* @llvm_mips_adds_s_h_RES
247   ret void
248 }
249
250 declare <8 x i16> @llvm.mips.adds.s.h(<8 x i16>, <8 x i16>) nounwind
251
252 ; CHECK: llvm_mips_adds_s_h_test:
253 ; CHECK-DAG: lw [[R1:\$[0-9]+]], %got(llvm_mips_adds_s_h_ARG1)
254 ; CHECK-DAG: lw [[R2:\$[0-9]+]], %got(llvm_mips_adds_s_h_ARG2)
255 ; CHECK-DAG: ld.h [[WS:\$w[0-9]+]], 0([[R1]])
256 ; CHECK-DAG: ld.h [[WT:\$w[0-9]+]], 0([[R2]])
257 ; CHECK-DAG: adds_s.h [[WD:\$w[0-9]+]], [[WS]], [[WT]]
258 ; CHECK-DAG: lw [[R3:\$[0-9]+]], %got(llvm_mips_adds_s_h_RES)
259 ; CHECK-DAG: st.h [[WD]], 0([[R3]])
260 ; CHECK: .size llvm_mips_adds_s_h_test
261 ;
262 @llvm_mips_adds_s_w_ARG1 = global <4 x i32> <i32 0, i32 1, i32 2, i32 3>, align 16
263 @llvm_mips_adds_s_w_ARG2 = global <4 x i32> <i32 4, i32 5, i32 6, i32 7>, align 16
264 @llvm_mips_adds_s_w_RES  = global <4 x i32> <i32 0, i32 0, i32 0, i32 0>, align 16
265
266 define void @llvm_mips_adds_s_w_test() nounwind {
267 entry:
268   %0 = load <4 x i32>* @llvm_mips_adds_s_w_ARG1
269   %1 = load <4 x i32>* @llvm_mips_adds_s_w_ARG2
270   %2 = tail call <4 x i32> @llvm.mips.adds.s.w(<4 x i32> %0, <4 x i32> %1)
271   store <4 x i32> %2, <4 x i32>* @llvm_mips_adds_s_w_RES
272   ret void
273 }
274
275 declare <4 x i32> @llvm.mips.adds.s.w(<4 x i32>, <4 x i32>) nounwind
276
277 ; CHECK: llvm_mips_adds_s_w_test:
278 ; CHECK-DAG: lw [[R1:\$[0-9]+]], %got(llvm_mips_adds_s_w_ARG1)
279 ; CHECK-DAG: lw [[R2:\$[0-9]+]], %got(llvm_mips_adds_s_w_ARG2)
280 ; CHECK-DAG: ld.w [[WS:\$w[0-9]+]], 0([[R1]])
281 ; CHECK-DAG: ld.w [[WT:\$w[0-9]+]], 0([[R2]])
282 ; CHECK-DAG: adds_s.w [[WD:\$w[0-9]+]], [[WS]], [[WT]]
283 ; CHECK-DAG: lw [[R3:\$[0-9]+]], %got(llvm_mips_adds_s_w_RES)
284 ; CHECK-DAG: st.w [[WD]], 0([[R3]])
285 ; CHECK: .size llvm_mips_adds_s_w_test
286 ;
287 @llvm_mips_adds_s_d_ARG1 = global <2 x i64> <i64 0, i64 1>, align 16
288 @llvm_mips_adds_s_d_ARG2 = global <2 x i64> <i64 2, i64 3>, align 16
289 @llvm_mips_adds_s_d_RES  = global <2 x i64> <i64 0, i64 0>, align 16
290
291 define void @llvm_mips_adds_s_d_test() nounwind {
292 entry:
293   %0 = load <2 x i64>* @llvm_mips_adds_s_d_ARG1
294   %1 = load <2 x i64>* @llvm_mips_adds_s_d_ARG2
295   %2 = tail call <2 x i64> @llvm.mips.adds.s.d(<2 x i64> %0, <2 x i64> %1)
296   store <2 x i64> %2, <2 x i64>* @llvm_mips_adds_s_d_RES
297   ret void
298 }
299
300 declare <2 x i64> @llvm.mips.adds.s.d(<2 x i64>, <2 x i64>) nounwind
301
302 ; CHECK: llvm_mips_adds_s_d_test:
303 ; CHECK-DAG: lw [[R1:\$[0-9]+]], %got(llvm_mips_adds_s_d_ARG1)
304 ; CHECK-DAG: lw [[R2:\$[0-9]+]], %got(llvm_mips_adds_s_d_ARG2)
305 ; CHECK-DAG: ld.d [[WS:\$w[0-9]+]], 0([[R1]])
306 ; CHECK-DAG: ld.d [[WT:\$w[0-9]+]], 0([[R2]])
307 ; CHECK-DAG: adds_s.d [[WD:\$w[0-9]+]], [[WS]], [[WT]]
308 ; CHECK-DAG: lw [[R3:\$[0-9]+]], %got(llvm_mips_adds_s_d_RES)
309 ; CHECK-DAG: st.d [[WD]], 0([[R3]])
310 ; CHECK: .size llvm_mips_adds_s_d_test
311 ;
312 @llvm_mips_adds_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
313 @llvm_mips_adds_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
314 @llvm_mips_adds_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
315
316 define void @llvm_mips_adds_u_b_test() nounwind {
317 entry:
318   %0 = load <16 x i8>* @llvm_mips_adds_u_b_ARG1
319   %1 = load <16 x i8>* @llvm_mips_adds_u_b_ARG2
320   %2 = tail call <16 x i8> @llvm.mips.adds.u.b(<16 x i8> %0, <16 x i8> %1)
321   store <16 x i8> %2, <16 x i8>* @llvm_mips_adds_u_b_RES
322   ret void
323 }
324
325 declare <16 x i8> @llvm.mips.adds.u.b(<16 x i8>, <16 x i8>) nounwind
326
327 ; CHECK: llvm_mips_adds_u_b_test:
328 ; CHECK-DAG: lw [[R1:\$[0-9]+]], %got(llvm_mips_adds_u_b_ARG1)
329 ; CHECK-DAG: lw [[R2:\$[0-9]+]], %got(llvm_mips_adds_u_b_ARG2)
330 ; CHECK-DAG: ld.b [[WS:\$w[0-9]+]], 0([[R1]])
331 ; CHECK-DAG: ld.b [[WT:\$w[0-9]+]], 0([[R2]])
332 ; CHECK-DAG: adds_u.b [[WD:\$w[0-9]+]], [[WS]], [[WT]]
333 ; CHECK-DAG: lw [[R3:\$[0-9]+]], %got(llvm_mips_adds_u_b_RES)
334 ; CHECK-DAG: st.b [[WD]], 0([[R3]])
335 ; CHECK: .size llvm_mips_adds_u_b_test
336 ;
337 @llvm_mips_adds_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
338 @llvm_mips_adds_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
339 @llvm_mips_adds_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
340
341 define void @llvm_mips_adds_u_h_test() nounwind {
342 entry:
343   %0 = load <8 x i16>* @llvm_mips_adds_u_h_ARG1
344   %1 = load <8 x i16>* @llvm_mips_adds_u_h_ARG2
345   %2 = tail call <8 x i16> @llvm.mips.adds.u.h(<8 x i16> %0, <8 x i16> %1)
346   store <8 x i16> %2, <8 x i16>* @llvm_mips_adds_u_h_RES
347   ret void
348 }
349
350 declare <8 x i16> @llvm.mips.adds.u.h(<8 x i16>, <8 x i16>) nounwind
351
352 ; CHECK: llvm_mips_adds_u_h_test:
353 ; CHECK-DAG: lw [[R1:\$[0-9]+]], %got(llvm_mips_adds_u_h_ARG1)
354 ; CHECK-DAG: lw [[R2:\$[0-9]+]], %got(llvm_mips_adds_u_h_ARG2)
355 ; CHECK-DAG: ld.h [[WS:\$w[0-9]+]], 0([[R1]])
356 ; CHECK-DAG: ld.h [[WT:\$w[0-9]+]], 0([[R2]])
357 ; CHECK-DAG: adds_u.h [[WD:\$w[0-9]+]], [[WS]], [[WT]]
358 ; CHECK-DAG: lw [[R3:\$[0-9]+]], %got(llvm_mips_adds_u_h_RES)
359 ; CHECK-DAG: st.h [[WD]], 0([[R3]])
360 ; CHECK: .size llvm_mips_adds_u_h_test
361 ;
362 @llvm_mips_adds_u_w_ARG1 = global <4 x i32> <i32 0, i32 1, i32 2, i32 3>, align 16
363 @llvm_mips_adds_u_w_ARG2 = global <4 x i32> <i32 4, i32 5, i32 6, i32 7>, align 16
364 @llvm_mips_adds_u_w_RES  = global <4 x i32> <i32 0, i32 0, i32 0, i32 0>, align 16
365
366 define void @llvm_mips_adds_u_w_test() nounwind {
367 entry:
368   %0 = load <4 x i32>* @llvm_mips_adds_u_w_ARG1
369   %1 = load <4 x i32>* @llvm_mips_adds_u_w_ARG2
370   %2 = tail call <4 x i32> @llvm.mips.adds.u.w(<4 x i32> %0, <4 x i32> %1)
371   store <4 x i32> %2, <4 x i32>* @llvm_mips_adds_u_w_RES
372   ret void
373 }
374
375 declare <4 x i32> @llvm.mips.adds.u.w(<4 x i32>, <4 x i32>) nounwind
376
377 ; CHECK: llvm_mips_adds_u_w_test:
378 ; CHECK-DAG: lw [[R1:\$[0-9]+]], %got(llvm_mips_adds_u_w_ARG1)
379 ; CHECK-DAG: lw [[R2:\$[0-9]+]], %got(llvm_mips_adds_u_w_ARG2)
380 ; CHECK-DAG: ld.w [[WS:\$w[0-9]+]], 0([[R1]])
381 ; CHECK-DAG: ld.w [[WT:\$w[0-9]+]], 0([[R2]])
382 ; CHECK-DAG: adds_u.w [[WD:\$w[0-9]+]], [[WS]], [[WT]]
383 ; CHECK-DAG: lw [[R3:\$[0-9]+]], %got(llvm_mips_adds_u_w_RES)
384 ; CHECK-DAG: st.w [[WD]], 0([[R3]])
385 ; CHECK: .size llvm_mips_adds_u_w_test
386 ;
387 @llvm_mips_adds_u_d_ARG1 = global <2 x i64> <i64 0, i64 1>, align 16
388 @llvm_mips_adds_u_d_ARG2 = global <2 x i64> <i64 2, i64 3>, align 16
389 @llvm_mips_adds_u_d_RES  = global <2 x i64> <i64 0, i64 0>, align 16
390
391 define void @llvm_mips_adds_u_d_test() nounwind {
392 entry:
393   %0 = load <2 x i64>* @llvm_mips_adds_u_d_ARG1
394   %1 = load <2 x i64>* @llvm_mips_adds_u_d_ARG2
395   %2 = tail call <2 x i64> @llvm.mips.adds.u.d(<2 x i64> %0, <2 x i64> %1)
396   store <2 x i64> %2, <2 x i64>* @llvm_mips_adds_u_d_RES
397   ret void
398 }
399
400 declare <2 x i64> @llvm.mips.adds.u.d(<2 x i64>, <2 x i64>) nounwind
401
402 ; CHECK: llvm_mips_adds_u_d_test:
403 ; CHECK-DAG: lw [[R1:\$[0-9]+]], %got(llvm_mips_adds_u_d_ARG1)
404 ; CHECK-DAG: lw [[R2:\$[0-9]+]], %got(llvm_mips_adds_u_d_ARG2)
405 ; CHECK-DAG: ld.d [[WS:\$w[0-9]+]], 0([[R1]])
406 ; CHECK-DAG: ld.d [[WT:\$w[0-9]+]], 0([[R2]])
407 ; CHECK-DAG: adds_u.d [[WD:\$w[0-9]+]], [[WS]], [[WT]]
408 ; CHECK-DAG: lw [[R3:\$[0-9]+]], %got(llvm_mips_adds_u_d_RES)
409 ; CHECK-DAG: st.d [[WD]], 0([[R3]])
410 ; CHECK: .size llvm_mips_adds_u_d_test
411 ;
412 @llvm_mips_addv_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
413 @llvm_mips_addv_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
414 @llvm_mips_addv_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
415
416 define void @llvm_mips_addv_b_test() nounwind {
417 entry:
418   %0 = load <16 x i8>* @llvm_mips_addv_b_ARG1
419   %1 = load <16 x i8>* @llvm_mips_addv_b_ARG2
420   %2 = tail call <16 x i8> @llvm.mips.addv.b(<16 x i8> %0, <16 x i8> %1)
421   store <16 x i8> %2, <16 x i8>* @llvm_mips_addv_b_RES
422   ret void
423 }
424
425 declare <16 x i8> @llvm.mips.addv.b(<16 x i8>, <16 x i8>) nounwind
426
427 ; CHECK: llvm_mips_addv_b_test:
428 ; CHECK-DAG: lw [[R1:\$[0-9]+]], %got(llvm_mips_addv_b_ARG1)
429 ; CHECK-DAG: lw [[R2:\$[0-9]+]], %got(llvm_mips_addv_b_ARG2)
430 ; CHECK-DAG: ld.b [[WS:\$w[0-9]+]], 0([[R1]])
431 ; CHECK-DAG: ld.b [[WT:\$w[0-9]+]], 0([[R2]])
432 ; CHECK-DAG: addv.b [[WD:\$w[0-9]+]], [[WS]], [[WT]]
433 ; CHECK-DAG: lw [[R3:\$[0-9]+]], %got(llvm_mips_addv_b_RES)
434 ; CHECK-DAG: st.b [[WD]], 0([[R3]])
435 ; CHECK: .size llvm_mips_addv_b_test
436 ;
437 @llvm_mips_addv_h_ARG1 = global <8 x i16> <i16 0, i16 1, i16 2, i16 3, i16 4, i16 5, i16 6, i16 7>, align 16
438 @llvm_mips_addv_h_ARG2 = global <8 x i16> <i16 8, i16 9, i16 10, i16 11, i16 12, i16 13, i16 14, i16 15>, align 16
439 @llvm_mips_addv_h_RES  = global <8 x i16> <i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0>, align 16
440
441 define void @llvm_mips_addv_h_test() nounwind {
442 entry:
443   %0 = load <8 x i16>* @llvm_mips_addv_h_ARG1
444   %1 = load <8 x i16>* @llvm_mips_addv_h_ARG2
445   %2 = tail call <8 x i16> @llvm.mips.addv.h(<8 x i16> %0, <8 x i16> %1)
446   store <8 x i16> %2, <8 x i16>* @llvm_mips_addv_h_RES
447   ret void
448 }
449
450 declare <8 x i16> @llvm.mips.addv.h(<8 x i16>, <8 x i16>) nounwind
451
452 ; CHECK: llvm_mips_addv_h_test:
453 ; CHECK-DAG: lw [[R1:\$[0-9]+]], %got(llvm_mips_addv_h_ARG1)
454 ; CHECK-DAG: lw [[R2:\$[0-9]+]], %got(llvm_mips_addv_h_ARG2)
455 ; CHECK-DAG: ld.h [[WS:\$w[0-9]+]], 0([[R1]])
456 ; CHECK-DAG: ld.h [[WT:\$w[0-9]+]], 0([[R2]])
457 ; CHECK-DAG: addv.h [[WD:\$w[0-9]+]], [[WS]], [[WT]]
458 ; CHECK-DAG: lw [[R3:\$[0-9]+]], %got(llvm_mips_addv_h_RES)
459 ; CHECK-DAG: st.h [[WD]], 0([[R3]])
460 ; CHECK: .size llvm_mips_addv_h_test
461 ;
462 @llvm_mips_addv_w_ARG1 = global <4 x i32> <i32 0, i32 1, i32 2, i32 3>, align 16
463 @llvm_mips_addv_w_ARG2 = global <4 x i32> <i32 4, i32 5, i32 6, i32 7>, align 16
464 @llvm_mips_addv_w_RES  = global <4 x i32> <i32 0, i32 0, i32 0, i32 0>, align 16
465
466 define void @llvm_mips_addv_w_test() nounwind {
467 entry:
468   %0 = load <4 x i32>* @llvm_mips_addv_w_ARG1
469   %1 = load <4 x i32>* @llvm_mips_addv_w_ARG2
470   %2 = tail call <4 x i32> @llvm.mips.addv.w(<4 x i32> %0, <4 x i32> %1)
471   store <4 x i32> %2, <4 x i32>* @llvm_mips_addv_w_RES
472   ret void
473 }
474
475 declare <4 x i32> @llvm.mips.addv.w(<4 x i32>, <4 x i32>) nounwind
476
477 ; CHECK: llvm_mips_addv_w_test:
478 ; CHECK-DAG: lw [[R1:\$[0-9]+]], %got(llvm_mips_addv_w_ARG1)
479 ; CHECK-DAG: lw [[R2:\$[0-9]+]], %got(llvm_mips_addv_w_ARG2)
480 ; CHECK-DAG: ld.w [[WS:\$w[0-9]+]], 0([[R1]])
481 ; CHECK-DAG: ld.w [[WT:\$w[0-9]+]], 0([[R2]])
482 ; CHECK-DAG: addv.w [[WD:\$w[0-9]+]], [[WS]], [[WT]]
483 ; CHECK-DAG: lw [[R3:\$[0-9]+]], %got(llvm_mips_addv_w_RES)
484 ; CHECK-DAG: st.w [[WD]], 0([[R3]])
485 ; CHECK: .size llvm_mips_addv_w_test
486 ;
487 @llvm_mips_addv_d_ARG1 = global <2 x i64> <i64 0, i64 1>, align 16
488 @llvm_mips_addv_d_ARG2 = global <2 x i64> <i64 2, i64 3>, align 16
489 @llvm_mips_addv_d_RES  = global <2 x i64> <i64 0, i64 0>, align 16
490
491 define void @llvm_mips_addv_d_test() nounwind {
492 entry:
493   %0 = load <2 x i64>* @llvm_mips_addv_d_ARG1
494   %1 = load <2 x i64>* @llvm_mips_addv_d_ARG2
495   %2 = tail call <2 x i64> @llvm.mips.addv.d(<2 x i64> %0, <2 x i64> %1)
496   store <2 x i64> %2, <2 x i64>* @llvm_mips_addv_d_RES
497   ret void
498 }
499
500 declare <2 x i64> @llvm.mips.addv.d(<2 x i64>, <2 x i64>) nounwind
501
502 ; CHECK: llvm_mips_addv_d_test:
503 ; CHECK-DAG: lw [[R1:\$[0-9]+]], %got(llvm_mips_addv_d_ARG1)
504 ; CHECK-DAG: lw [[R2:\$[0-9]+]], %got(llvm_mips_addv_d_ARG2)
505 ; CHECK-DAG: ld.d [[WS:\$w[0-9]+]], 0([[R1]])
506 ; CHECK-DAG: ld.d [[WT:\$w[0-9]+]], 0([[R2]])
507 ; CHECK-DAG: addv.d [[WD:\$w[0-9]+]], [[WS]], [[WT]]
508 ; CHECK-DAG: lw [[R3:\$[0-9]+]], %got(llvm_mips_addv_d_RES)
509 ; CHECK-DAG: st.d [[WD]], 0([[R3]])
510 ; CHECK: .size llvm_mips_addv_d_test
511 ;
512
513 define void @addv_b_test() nounwind {
514 entry:
515   %0 = load <16 x i8>* @llvm_mips_addv_b_ARG1
516   %1 = load <16 x i8>* @llvm_mips_addv_b_ARG2
517   %2 = add <16 x i8> %0, %1
518   store <16 x i8> %2, <16 x i8>* @llvm_mips_addv_b_RES
519   ret void
520 }
521
522 ; CHECK: addv_b_test:
523 ; CHECK-DAG: lw [[R1:\$[0-9]+]], %got(llvm_mips_addv_b_ARG1)
524 ; CHECK-DAG: lw [[R2:\$[0-9]+]], %got(llvm_mips_addv_b_ARG2)
525 ; CHECK-DAG: ld.b [[WS:\$w[0-9]+]], 0([[R1]])
526 ; CHECK-DAG: ld.b [[WT:\$w[0-9]+]], 0([[R2]])
527 ; CHECK-DAG: addv.b [[WD:\$w[0-9]+]], [[WS]], [[WT]]
528 ; CHECK-DAG: lw [[R3:\$[0-9]+]], %got(llvm_mips_addv_b_RES)
529 ; CHECK-DAG: st.b [[WD]], 0([[R3]])
530 ; CHECK: .size addv_b_test
531 ;
532
533 define void @addv_h_test() nounwind {
534 entry:
535   %0 = load <8 x i16>* @llvm_mips_addv_h_ARG1
536   %1 = load <8 x i16>* @llvm_mips_addv_h_ARG2
537   %2 = add <8 x i16> %0, %1
538   store <8 x i16> %2, <8 x i16>* @llvm_mips_addv_h_RES
539   ret void
540 }
541
542 ; CHECK: addv_h_test:
543 ; CHECK-DAG: lw [[R1:\$[0-9]+]], %got(llvm_mips_addv_h_ARG1)
544 ; CHECK-DAG: lw [[R2:\$[0-9]+]], %got(llvm_mips_addv_h_ARG2)
545 ; CHECK-DAG: ld.h [[WS:\$w[0-9]+]], 0([[R1]])
546 ; CHECK-DAG: ld.h [[WT:\$w[0-9]+]], 0([[R2]])
547 ; CHECK-DAG: addv.h [[WD:\$w[0-9]+]], [[WS]], [[WT]]
548 ; CHECK-DAG: lw [[R3:\$[0-9]+]], %got(llvm_mips_addv_h_RES)
549 ; CHECK-DAG: st.h [[WD]], 0([[R3]])
550 ; CHECK: .size addv_h_test
551 ;
552
553 define void @addv_w_test() nounwind {
554 entry:
555   %0 = load <4 x i32>* @llvm_mips_addv_w_ARG1
556   %1 = load <4 x i32>* @llvm_mips_addv_w_ARG2
557   %2 = add <4 x i32> %0, %1
558   store <4 x i32> %2, <4 x i32>* @llvm_mips_addv_w_RES
559   ret void
560 }
561
562 ; CHECK: addv_w_test:
563 ; CHECK-DAG: lw [[R1:\$[0-9]+]], %got(llvm_mips_addv_w_ARG1)
564 ; CHECK-DAG: lw [[R2:\$[0-9]+]], %got(llvm_mips_addv_w_ARG2)
565 ; CHECK-DAG: ld.w [[WS:\$w[0-9]+]], 0([[R1]])
566 ; CHECK-DAG: ld.w [[WT:\$w[0-9]+]], 0([[R2]])
567 ; CHECK-DAG: addv.w [[WD:\$w[0-9]+]], [[WS]], [[WT]]
568 ; CHECK-DAG: lw [[R3:\$[0-9]+]], %got(llvm_mips_addv_w_RES)
569 ; CHECK-DAG: st.w [[WD]], 0([[R3]])
570 ; CHECK: .size addv_w_test
571 ;
572
573 define void @addv_d_test() nounwind {
574 entry:
575   %0 = load <2 x i64>* @llvm_mips_addv_d_ARG1
576   %1 = load <2 x i64>* @llvm_mips_addv_d_ARG2
577   %2 = add <2 x i64> %0, %1
578   store <2 x i64> %2, <2 x i64>* @llvm_mips_addv_d_RES
579   ret void
580 }
581
582 ; CHECK: addv_d_test:
583 ; CHECK-DAG: lw [[R1:\$[0-9]+]], %got(llvm_mips_addv_d_ARG1)
584 ; CHECK-DAG: lw [[R2:\$[0-9]+]], %got(llvm_mips_addv_d_ARG2)
585 ; CHECK-DAG: ld.d [[WS:\$w[0-9]+]], 0([[R1]])
586 ; CHECK-DAG: ld.d [[WT:\$w[0-9]+]], 0([[R2]])
587 ; CHECK-DAG: addv.d [[WD:\$w[0-9]+]], [[WS]], [[WT]]
588 ; CHECK-DAG: lw [[R3:\$[0-9]+]], %got(llvm_mips_addv_d_RES)
589 ; CHECK-DAG: st.d [[WD]], 0([[R3]])
590 ; CHECK: .size addv_d_test
591 ;
592 @llvm_mips_asub_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
593 @llvm_mips_asub_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
594 @llvm_mips_asub_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
595
596 define void @llvm_mips_asub_s_b_test() nounwind {
597 entry:
598   %0 = load <16 x i8>* @llvm_mips_asub_s_b_ARG1
599   %1 = load <16 x i8>* @llvm_mips_asub_s_b_ARG2
600   %2 = tail call <16 x i8> @llvm.mips.asub.s.b(<16 x i8> %0, <16 x i8> %1)
601   store <16 x i8> %2, <16 x i8>* @llvm_mips_asub_s_b_RES
602   ret void
603 }
604
605 declare <16 x i8> @llvm.mips.asub.s.b(<16 x i8>, <16 x i8>) nounwind
606
607 ; CHECK: llvm_mips_asub_s_b_test:
608 ; CHECK-DAG: lw [[R1:\$[0-9]+]], %got(llvm_mips_asub_s_b_ARG1)
609 ; CHECK-DAG: lw [[R2:\$[0-9]+]], %got(llvm_mips_asub_s_b_ARG2)
610 ; CHECK-DAG: ld.b [[WS:\$w[0-9]+]], 0([[R1]])
611 ; CHECK-DAG: ld.b [[WT:\$w[0-9]+]], 0([[R2]])
612 ; CHECK-DAG: asub_s.b [[WD:\$w[0-9]+]], [[WS]], [[WT]]
613 ; CHECK-DAG: lw [[R3:\$[0-9]+]], %got(llvm_mips_asub_s_b_RES)
614 ; CHECK-DAG: st.b [[WD]], 0([[R3]])
615 ; CHECK: .size llvm_mips_asub_s_b_test
616 ;
617 @llvm_mips_asub_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
618 @llvm_mips_asub_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
619 @llvm_mips_asub_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
620
621 define void @llvm_mips_asub_s_h_test() nounwind {
622 entry:
623   %0 = load <8 x i16>* @llvm_mips_asub_s_h_ARG1
624   %1 = load <8 x i16>* @llvm_mips_asub_s_h_ARG2
625   %2 = tail call <8 x i16> @llvm.mips.asub.s.h(<8 x i16> %0, <8 x i16> %1)
626   store <8 x i16> %2, <8 x i16>* @llvm_mips_asub_s_h_RES
627   ret void
628 }
629
630 declare <8 x i16> @llvm.mips.asub.s.h(<8 x i16>, <8 x i16>) nounwind
631
632 ; CHECK: llvm_mips_asub_s_h_test:
633 ; CHECK-DAG: lw [[R1:\$[0-9]+]], %got(llvm_mips_asub_s_h_ARG1)
634 ; CHECK-DAG: lw [[R2:\$[0-9]+]], %got(llvm_mips_asub_s_h_ARG2)
635 ; CHECK-DAG: ld.h [[WS:\$w[0-9]+]], 0([[R1]])
636 ; CHECK-DAG: ld.h [[WT:\$w[0-9]+]], 0([[R2]])
637 ; CHECK-DAG: asub_s.h [[WD:\$w[0-9]+]], [[WS]], [[WT]]
638 ; CHECK-DAG: lw [[R3:\$[0-9]+]], %got(llvm_mips_asub_s_h_RES)
639 ; CHECK-DAG: st.h [[WD]], 0([[R3]])
640 ; CHECK: .size llvm_mips_asub_s_h_test
641 ;
642 @llvm_mips_asub_s_w_ARG1 = global <4 x i32> <i32 0, i32 1, i32 2, i32 3>, align 16
643 @llvm_mips_asub_s_w_ARG2 = global <4 x i32> <i32 4, i32 5, i32 6, i32 7>, align 16
644 @llvm_mips_asub_s_w_RES  = global <4 x i32> <i32 0, i32 0, i32 0, i32 0>, align 16
645
646 define void @llvm_mips_asub_s_w_test() nounwind {
647 entry:
648   %0 = load <4 x i32>* @llvm_mips_asub_s_w_ARG1
649   %1 = load <4 x i32>* @llvm_mips_asub_s_w_ARG2
650   %2 = tail call <4 x i32> @llvm.mips.asub.s.w(<4 x i32> %0, <4 x i32> %1)
651   store <4 x i32> %2, <4 x i32>* @llvm_mips_asub_s_w_RES
652   ret void
653 }
654
655 declare <4 x i32> @llvm.mips.asub.s.w(<4 x i32>, <4 x i32>) nounwind
656
657 ; CHECK: llvm_mips_asub_s_w_test:
658 ; CHECK-DAG: lw [[R1:\$[0-9]+]], %got(llvm_mips_asub_s_w_ARG1)
659 ; CHECK-DAG: lw [[R2:\$[0-9]+]], %got(llvm_mips_asub_s_w_ARG2)
660 ; CHECK-DAG: ld.w [[WS:\$w[0-9]+]], 0([[R1]])
661 ; CHECK-DAG: ld.w [[WT:\$w[0-9]+]], 0([[R2]])
662 ; CHECK-DAG: asub_s.w [[WD:\$w[0-9]+]], [[WS]], [[WT]]
663 ; CHECK-DAG: lw [[R3:\$[0-9]+]], %got(llvm_mips_asub_s_w_RES)
664 ; CHECK-DAG: st.w [[WD]], 0([[R3]])
665 ; CHECK: .size llvm_mips_asub_s_w_test
666 ;
667 @llvm_mips_asub_s_d_ARG1 = global <2 x i64> <i64 0, i64 1>, align 16
668 @llvm_mips_asub_s_d_ARG2 = global <2 x i64> <i64 2, i64 3>, align 16
669 @llvm_mips_asub_s_d_RES  = global <2 x i64> <i64 0, i64 0>, align 16
670
671 define void @llvm_mips_asub_s_d_test() nounwind {
672 entry:
673   %0 = load <2 x i64>* @llvm_mips_asub_s_d_ARG1
674   %1 = load <2 x i64>* @llvm_mips_asub_s_d_ARG2
675   %2 = tail call <2 x i64> @llvm.mips.asub.s.d(<2 x i64> %0, <2 x i64> %1)
676   store <2 x i64> %2, <2 x i64>* @llvm_mips_asub_s_d_RES
677   ret void
678 }
679
680 declare <2 x i64> @llvm.mips.asub.s.d(<2 x i64>, <2 x i64>) nounwind
681
682 ; CHECK: llvm_mips_asub_s_d_test:
683 ; CHECK-DAG: lw [[R1:\$[0-9]+]], %got(llvm_mips_asub_s_d_ARG1)
684 ; CHECK-DAG: lw [[R2:\$[0-9]+]], %got(llvm_mips_asub_s_d_ARG2)
685 ; CHECK-DAG: ld.d [[WS:\$w[0-9]+]], 0([[R1]])
686 ; CHECK-DAG: ld.d [[WT:\$w[0-9]+]], 0([[R2]])
687 ; CHECK-DAG: asub_s.d [[WD:\$w[0-9]+]], [[WS]], [[WT]]
688 ; CHECK-DAG: lw [[R3:\$[0-9]+]], %got(llvm_mips_asub_s_d_RES)
689 ; CHECK-DAG: st.d [[WD]], 0([[R3]])
690 ; CHECK: .size llvm_mips_asub_s_d_test
691 ;
692 @llvm_mips_asub_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
693 @llvm_mips_asub_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
694 @llvm_mips_asub_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
695
696 define void @llvm_mips_asub_u_b_test() nounwind {
697 entry:
698   %0 = load <16 x i8>* @llvm_mips_asub_u_b_ARG1
699   %1 = load <16 x i8>* @llvm_mips_asub_u_b_ARG2
700   %2 = tail call <16 x i8> @llvm.mips.asub.u.b(<16 x i8> %0, <16 x i8> %1)
701   store <16 x i8> %2, <16 x i8>* @llvm_mips_asub_u_b_RES
702   ret void
703 }
704
705 declare <16 x i8> @llvm.mips.asub.u.b(<16 x i8>, <16 x i8>) nounwind
706
707 ; CHECK: llvm_mips_asub_u_b_test:
708 ; CHECK-DAG: lw [[R1:\$[0-9]+]], %got(llvm_mips_asub_u_b_ARG1)
709 ; CHECK-DAG: lw [[R2:\$[0-9]+]], %got(llvm_mips_asub_u_b_ARG2)
710 ; CHECK-DAG: ld.b [[WS:\$w[0-9]+]], 0([[R1]])
711 ; CHECK-DAG: ld.b [[WT:\$w[0-9]+]], 0([[R2]])
712 ; CHECK-DAG: asub_u.b [[WD:\$w[0-9]+]], [[WS]], [[WT]]
713 ; CHECK-DAG: lw [[R3:\$[0-9]+]], %got(llvm_mips_asub_u_b_RES)
714 ; CHECK-DAG: st.b [[WD]], 0([[R3]])
715 ; CHECK: .size llvm_mips_asub_u_b_test
716 ;
717 @llvm_mips_asub_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
718 @llvm_mips_asub_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
719 @llvm_mips_asub_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
720
721 define void @llvm_mips_asub_u_h_test() nounwind {
722 entry:
723   %0 = load <8 x i16>* @llvm_mips_asub_u_h_ARG1
724   %1 = load <8 x i16>* @llvm_mips_asub_u_h_ARG2
725   %2 = tail call <8 x i16> @llvm.mips.asub.u.h(<8 x i16> %0, <8 x i16> %1)
726   store <8 x i16> %2, <8 x i16>* @llvm_mips_asub_u_h_RES
727   ret void
728 }
729
730 declare <8 x i16> @llvm.mips.asub.u.h(<8 x i16>, <8 x i16>) nounwind
731
732 ; CHECK: llvm_mips_asub_u_h_test:
733 ; CHECK-DAG: lw [[R1:\$[0-9]+]], %got(llvm_mips_asub_u_h_ARG1)
734 ; CHECK-DAG: lw [[R2:\$[0-9]+]], %got(llvm_mips_asub_u_h_ARG2)
735 ; CHECK-DAG: ld.h [[WS:\$w[0-9]+]], 0([[R1]])
736 ; CHECK-DAG: ld.h [[WT:\$w[0-9]+]], 0([[R2]])
737 ; CHECK-DAG: asub_u.h [[WD:\$w[0-9]+]], [[WS]], [[WT]]
738 ; CHECK-DAG: lw [[R3:\$[0-9]+]], %got(llvm_mips_asub_u_h_RES)
739 ; CHECK-DAG: st.h [[WD]], 0([[R3]])
740 ; CHECK: .size llvm_mips_asub_u_h_test
741 ;
742 @llvm_mips_asub_u_w_ARG1 = global <4 x i32> <i32 0, i32 1, i32 2, i32 3>, align 16
743 @llvm_mips_asub_u_w_ARG2 = global <4 x i32> <i32 4, i32 5, i32 6, i32 7>, align 16
744 @llvm_mips_asub_u_w_RES  = global <4 x i32> <i32 0, i32 0, i32 0, i32 0>, align 16
745
746 define void @llvm_mips_asub_u_w_test() nounwind {
747 entry:
748   %0 = load <4 x i32>* @llvm_mips_asub_u_w_ARG1
749   %1 = load <4 x i32>* @llvm_mips_asub_u_w_ARG2
750   %2 = tail call <4 x i32> @llvm.mips.asub.u.w(<4 x i32> %0, <4 x i32> %1)
751   store <4 x i32> %2, <4 x i32>* @llvm_mips_asub_u_w_RES
752   ret void
753 }
754
755 declare <4 x i32> @llvm.mips.asub.u.w(<4 x i32>, <4 x i32>) nounwind
756
757 ; CHECK: llvm_mips_asub_u_w_test:
758 ; CHECK-DAG: lw [[R1:\$[0-9]+]], %got(llvm_mips_asub_u_w_ARG1)
759 ; CHECK-DAG: lw [[R2:\$[0-9]+]], %got(llvm_mips_asub_u_w_ARG2)
760 ; CHECK-DAG: ld.w [[WS:\$w[0-9]+]], 0([[R1]])
761 ; CHECK-DAG: ld.w [[WT:\$w[0-9]+]], 0([[R2]])
762 ; CHECK-DAG: asub_u.w [[WD:\$w[0-9]+]], [[WS]], [[WT]]
763 ; CHECK-DAG: lw [[R3:\$[0-9]+]], %got(llvm_mips_asub_u_w_RES)
764 ; CHECK-DAG: st.w [[WD]], 0([[R3]])
765 ; CHECK: .size llvm_mips_asub_u_w_test
766 ;
767 @llvm_mips_asub_u_d_ARG1 = global <2 x i64> <i64 0, i64 1>, align 16
768 @llvm_mips_asub_u_d_ARG2 = global <2 x i64> <i64 2, i64 3>, align 16
769 @llvm_mips_asub_u_d_RES  = global <2 x i64> <i64 0, i64 0>, align 16
770
771 define void @llvm_mips_asub_u_d_test() nounwind {
772 entry:
773   %0 = load <2 x i64>* @llvm_mips_asub_u_d_ARG1
774   %1 = load <2 x i64>* @llvm_mips_asub_u_d_ARG2
775   %2 = tail call <2 x i64> @llvm.mips.asub.u.d(<2 x i64> %0, <2 x i64> %1)
776   store <2 x i64> %2, <2 x i64>* @llvm_mips_asub_u_d_RES
777   ret void
778 }
779
780 declare <2 x i64> @llvm.mips.asub.u.d(<2 x i64>, <2 x i64>) nounwind
781
782 ; CHECK: llvm_mips_asub_u_d_test:
783 ; CHECK-DAG: lw [[R1:\$[0-9]+]], %got(llvm_mips_asub_u_d_ARG1)
784 ; CHECK-DAG: lw [[R2:\$[0-9]+]], %got(llvm_mips_asub_u_d_ARG2)
785 ; CHECK-DAG: ld.d [[WS:\$w[0-9]+]], 0([[R1]])
786 ; CHECK-DAG: ld.d [[WT:\$w[0-9]+]], 0([[R2]])
787 ; CHECK-DAG: asub_u.d [[WD:\$w[0-9]+]], [[WS]], [[WT]]
788 ; CHECK-DAG: lw [[R3:\$[0-9]+]], %got(llvm_mips_asub_u_d_RES)
789 ; CHECK-DAG: st.d [[WD]], 0([[R3]])
790 ; CHECK: .size llvm_mips_asub_u_d_test
791 ;
792 @llvm_mips_ave_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
793 @llvm_mips_ave_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
794 @llvm_mips_ave_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
795
796 define void @llvm_mips_ave_s_b_test() nounwind {
797 entry:
798   %0 = load <16 x i8>* @llvm_mips_ave_s_b_ARG1
799   %1 = load <16 x i8>* @llvm_mips_ave_s_b_ARG2
800   %2 = tail call <16 x i8> @llvm.mips.ave.s.b(<16 x i8> %0, <16 x i8> %1)
801   store <16 x i8> %2, <16 x i8>* @llvm_mips_ave_s_b_RES
802   ret void
803 }
804
805 declare <16 x i8> @llvm.mips.ave.s.b(<16 x i8>, <16 x i8>) nounwind
806
807 ; CHECK: llvm_mips_ave_s_b_test:
808 ; CHECK-DAG: lw [[R1:\$[0-9]+]], %got(llvm_mips_ave_s_b_ARG1)
809 ; CHECK-DAG: lw [[R2:\$[0-9]+]], %got(llvm_mips_ave_s_b_ARG2)
810 ; CHECK-DAG: ld.b [[WS:\$w[0-9]+]], 0([[R1]])
811 ; CHECK-DAG: ld.b [[WT:\$w[0-9]+]], 0([[R2]])
812 ; CHECK-DAG: ave_s.b [[WD:\$w[0-9]+]], [[WS]], [[WT]]
813 ; CHECK-DAG: lw [[R3:\$[0-9]+]], %got(llvm_mips_ave_s_b_RES)
814 ; CHECK-DAG: st.b [[WD]], 0([[R3]])
815 ; CHECK: .size llvm_mips_ave_s_b_test
816 ;
817 @llvm_mips_ave_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
818 @llvm_mips_ave_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
819 @llvm_mips_ave_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
820
821 define void @llvm_mips_ave_s_h_test() nounwind {
822 entry:
823   %0 = load <8 x i16>* @llvm_mips_ave_s_h_ARG1
824   %1 = load <8 x i16>* @llvm_mips_ave_s_h_ARG2
825   %2 = tail call <8 x i16> @llvm.mips.ave.s.h(<8 x i16> %0, <8 x i16> %1)
826   store <8 x i16> %2, <8 x i16>* @llvm_mips_ave_s_h_RES
827   ret void
828 }
829
830 declare <8 x i16> @llvm.mips.ave.s.h(<8 x i16>, <8 x i16>) nounwind
831
832 ; CHECK: llvm_mips_ave_s_h_test:
833 ; CHECK-DAG: lw [[R1:\$[0-9]+]], %got(llvm_mips_ave_s_h_ARG1)
834 ; CHECK-DAG: lw [[R2:\$[0-9]+]], %got(llvm_mips_ave_s_h_ARG2)
835 ; CHECK-DAG: ld.h [[WS:\$w[0-9]+]], 0([[R1]])
836 ; CHECK-DAG: ld.h [[WT:\$w[0-9]+]], 0([[R2]])
837 ; CHECK-DAG: ave_s.h [[WD:\$w[0-9]+]], [[WS]], [[WT]]
838 ; CHECK-DAG: lw [[R3:\$[0-9]+]], %got(llvm_mips_ave_s_h_RES)
839 ; CHECK-DAG: st.h [[WD]], 0([[R3]])
840 ; CHECK: .size llvm_mips_ave_s_h_test
841 ;
842 @llvm_mips_ave_s_w_ARG1 = global <4 x i32> <i32 0, i32 1, i32 2, i32 3>, align 16
843 @llvm_mips_ave_s_w_ARG2 = global <4 x i32> <i32 4, i32 5, i32 6, i32 7>, align 16
844 @llvm_mips_ave_s_w_RES  = global <4 x i32> <i32 0, i32 0, i32 0, i32 0>, align 16
845
846 define void @llvm_mips_ave_s_w_test() nounwind {
847 entry:
848   %0 = load <4 x i32>* @llvm_mips_ave_s_w_ARG1
849   %1 = load <4 x i32>* @llvm_mips_ave_s_w_ARG2
850   %2 = tail call <4 x i32> @llvm.mips.ave.s.w(<4 x i32> %0, <4 x i32> %1)
851   store <4 x i32> %2, <4 x i32>* @llvm_mips_ave_s_w_RES
852   ret void
853 }
854
855 declare <4 x i32> @llvm.mips.ave.s.w(<4 x i32>, <4 x i32>) nounwind
856
857 ; CHECK: llvm_mips_ave_s_w_test:
858 ; CHECK-DAG: lw [[R1:\$[0-9]+]], %got(llvm_mips_ave_s_w_ARG1)
859 ; CHECK-DAG: lw [[R2:\$[0-9]+]], %got(llvm_mips_ave_s_w_ARG2)
860 ; CHECK-DAG: ld.w [[WS:\$w[0-9]+]], 0([[R1]])
861 ; CHECK-DAG: ld.w [[WT:\$w[0-9]+]], 0([[R2]])
862 ; CHECK-DAG: ave_s.w [[WD:\$w[0-9]+]], [[WS]], [[WT]]
863 ; CHECK-DAG: lw [[R3:\$[0-9]+]], %got(llvm_mips_ave_s_w_RES)
864 ; CHECK-DAG: st.w [[WD]], 0([[R3]])
865 ; CHECK: .size llvm_mips_ave_s_w_test
866 ;
867 @llvm_mips_ave_s_d_ARG1 = global <2 x i64> <i64 0, i64 1>, align 16
868 @llvm_mips_ave_s_d_ARG2 = global <2 x i64> <i64 2, i64 3>, align 16
869 @llvm_mips_ave_s_d_RES  = global <2 x i64> <i64 0, i64 0>, align 16
870
871 define void @llvm_mips_ave_s_d_test() nounwind {
872 entry:
873   %0 = load <2 x i64>* @llvm_mips_ave_s_d_ARG1
874   %1 = load <2 x i64>* @llvm_mips_ave_s_d_ARG2
875   %2 = tail call <2 x i64> @llvm.mips.ave.s.d(<2 x i64> %0, <2 x i64> %1)
876   store <2 x i64> %2, <2 x i64>* @llvm_mips_ave_s_d_RES
877   ret void
878 }
879
880 declare <2 x i64> @llvm.mips.ave.s.d(<2 x i64>, <2 x i64>) nounwind
881
882 ; CHECK: llvm_mips_ave_s_d_test:
883 ; CHECK-DAG: lw [[R1:\$[0-9]+]], %got(llvm_mips_ave_s_d_ARG1)
884 ; CHECK-DAG: lw [[R2:\$[0-9]+]], %got(llvm_mips_ave_s_d_ARG2)
885 ; CHECK-DAG: ld.d [[WS:\$w[0-9]+]], 0([[R1]])
886 ; CHECK-DAG: ld.d [[WT:\$w[0-9]+]], 0([[R2]])
887 ; CHECK-DAG: ave_s.d [[WD:\$w[0-9]+]], [[WS]], [[WT]]
888 ; CHECK-DAG: lw [[R3:\$[0-9]+]], %got(llvm_mips_ave_s_d_RES)
889 ; CHECK-DAG: st.d [[WD]], 0([[R3]])
890 ; CHECK: .size llvm_mips_ave_s_d_test
891 ;
892 @llvm_mips_ave_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
893 @llvm_mips_ave_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
894 @llvm_mips_ave_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
895
896 define void @llvm_mips_ave_u_b_test() nounwind {
897 entry:
898   %0 = load <16 x i8>* @llvm_mips_ave_u_b_ARG1
899   %1 = load <16 x i8>* @llvm_mips_ave_u_b_ARG2
900   %2 = tail call <16 x i8> @llvm.mips.ave.u.b(<16 x i8> %0, <16 x i8> %1)
901   store <16 x i8> %2, <16 x i8>* @llvm_mips_ave_u_b_RES
902   ret void
903 }
904
905 declare <16 x i8> @llvm.mips.ave.u.b(<16 x i8>, <16 x i8>) nounwind
906
907 ; CHECK: llvm_mips_ave_u_b_test:
908 ; CHECK-DAG: lw [[R1:\$[0-9]+]], %got(llvm_mips_ave_u_b_ARG1)
909 ; CHECK-DAG: lw [[R2:\$[0-9]+]], %got(llvm_mips_ave_u_b_ARG2)
910 ; CHECK-DAG: ld.b [[WS:\$w[0-9]+]], 0([[R1]])
911 ; CHECK-DAG: ld.b [[WT:\$w[0-9]+]], 0([[R2]])
912 ; CHECK-DAG: ave_u.b [[WD:\$w[0-9]+]], [[WS]], [[WT]]
913 ; CHECK-DAG: lw [[R3:\$[0-9]+]], %got(llvm_mips_ave_u_b_RES)
914 ; CHECK-DAG: st.b [[WD]], 0([[R3]])
915 ; CHECK: .size llvm_mips_ave_u_b_test
916 ;
917 @llvm_mips_ave_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
918 @llvm_mips_ave_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
919 @llvm_mips_ave_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
920
921 define void @llvm_mips_ave_u_h_test() nounwind {
922 entry:
923   %0 = load <8 x i16>* @llvm_mips_ave_u_h_ARG1
924   %1 = load <8 x i16>* @llvm_mips_ave_u_h_ARG2
925   %2 = tail call <8 x i16> @llvm.mips.ave.u.h(<8 x i16> %0, <8 x i16> %1)
926   store <8 x i16> %2, <8 x i16>* @llvm_mips_ave_u_h_RES
927   ret void
928 }
929
930 declare <8 x i16> @llvm.mips.ave.u.h(<8 x i16>, <8 x i16>) nounwind
931
932 ; CHECK: llvm_mips_ave_u_h_test:
933 ; CHECK-DAG: lw [[R1:\$[0-9]+]], %got(llvm_mips_ave_u_h_ARG1)
934 ; CHECK-DAG: lw [[R2:\$[0-9]+]], %got(llvm_mips_ave_u_h_ARG2)
935 ; CHECK-DAG: ld.h [[WS:\$w[0-9]+]], 0([[R1]])
936 ; CHECK-DAG: ld.h [[WT:\$w[0-9]+]], 0([[R2]])
937 ; CHECK-DAG: ave_u.h [[WD:\$w[0-9]+]], [[WS]], [[WT]]
938 ; CHECK-DAG: lw [[R3:\$[0-9]+]], %got(llvm_mips_ave_u_h_RES)
939 ; CHECK-DAG: st.h [[WD]], 0([[R3]])
940 ; CHECK: .size llvm_mips_ave_u_h_test
941 ;
942 @llvm_mips_ave_u_w_ARG1 = global <4 x i32> <i32 0, i32 1, i32 2, i32 3>, align 16
943 @llvm_mips_ave_u_w_ARG2 = global <4 x i32> <i32 4, i32 5, i32 6, i32 7>, align 16
944 @llvm_mips_ave_u_w_RES  = global <4 x i32> <i32 0, i32 0, i32 0, i32 0>, align 16
945
946 define void @llvm_mips_ave_u_w_test() nounwind {
947 entry:
948   %0 = load <4 x i32>* @llvm_mips_ave_u_w_ARG1
949   %1 = load <4 x i32>* @llvm_mips_ave_u_w_ARG2
950   %2 = tail call <4 x i32> @llvm.mips.ave.u.w(<4 x i32> %0, <4 x i32> %1)
951   store <4 x i32> %2, <4 x i32>* @llvm_mips_ave_u_w_RES
952   ret void
953 }
954
955 declare <4 x i32> @llvm.mips.ave.u.w(<4 x i32>, <4 x i32>) nounwind
956
957 ; CHECK: llvm_mips_ave_u_w_test:
958 ; CHECK-DAG: lw [[R1:\$[0-9]+]], %got(llvm_mips_ave_u_w_ARG1)
959 ; CHECK-DAG: lw [[R2:\$[0-9]+]], %got(llvm_mips_ave_u_w_ARG2)
960 ; CHECK-DAG: ld.w [[WS:\$w[0-9]+]], 0([[R1]])
961 ; CHECK-DAG: ld.w [[WT:\$w[0-9]+]], 0([[R2]])
962 ; CHECK-DAG: ave_u.w [[WD:\$w[0-9]+]], [[WS]], [[WT]]
963 ; CHECK-DAG: lw [[R3:\$[0-9]+]], %got(llvm_mips_ave_u_w_RES)
964 ; CHECK-DAG: st.w [[WD]], 0([[R3]])
965 ; CHECK: .size llvm_mips_ave_u_w_test
966 ;
967 @llvm_mips_ave_u_d_ARG1 = global <2 x i64> <i64 0, i64 1>, align 16
968 @llvm_mips_ave_u_d_ARG2 = global <2 x i64> <i64 2, i64 3>, align 16
969 @llvm_mips_ave_u_d_RES  = global <2 x i64> <i64 0, i64 0>, align 16
970
971 define void @llvm_mips_ave_u_d_test() nounwind {
972 entry:
973   %0 = load <2 x i64>* @llvm_mips_ave_u_d_ARG1
974   %1 = load <2 x i64>* @llvm_mips_ave_u_d_ARG2
975   %2 = tail call <2 x i64> @llvm.mips.ave.u.d(<2 x i64> %0, <2 x i64> %1)
976   store <2 x i64> %2, <2 x i64>* @llvm_mips_ave_u_d_RES
977   ret void
978 }
979
980 declare <2 x i64> @llvm.mips.ave.u.d(<2 x i64>, <2 x i64>) nounwind
981
982 ; CHECK: llvm_mips_ave_u_d_test:
983 ; CHECK-DAG: lw [[R1:\$[0-9]+]], %got(llvm_mips_ave_u_d_ARG1)
984 ; CHECK-DAG: lw [[R2:\$[0-9]+]], %got(llvm_mips_ave_u_d_ARG2)
985 ; CHECK-DAG: ld.d [[WS:\$w[0-9]+]], 0([[R1]])
986 ; CHECK-DAG: ld.d [[WT:\$w[0-9]+]], 0([[R2]])
987 ; CHECK-DAG: ave_u.d [[WD:\$w[0-9]+]], [[WS]], [[WT]]
988 ; CHECK-DAG: lw [[R3:\$[0-9]+]], %got(llvm_mips_ave_u_d_RES)
989 ; CHECK-DAG: st.d [[WD]], 0([[R3]])
990 ; CHECK: .size llvm_mips_ave_u_d_test
991 ;
992 @llvm_mips_aver_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_aver_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_aver_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_aver_s_b_test() nounwind {
997 entry:
998   %0 = load <16 x i8>* @llvm_mips_aver_s_b_ARG1
999   %1 = load <16 x i8>* @llvm_mips_aver_s_b_ARG2
1000   %2 = tail call <16 x i8> @llvm.mips.aver.s.b(<16 x i8> %0, <16 x i8> %1)
1001   store <16 x i8> %2, <16 x i8>* @llvm_mips_aver_s_b_RES
1002   ret void
1003 }
1004
1005 declare <16 x i8> @llvm.mips.aver.s.b(<16 x i8>, <16 x i8>) nounwind
1006
1007 ; CHECK: llvm_mips_aver_s_b_test:
1008 ; CHECK-DAG: lw [[R1:\$[0-9]+]], %got(llvm_mips_aver_s_b_ARG1)
1009 ; CHECK-DAG: lw [[R2:\$[0-9]+]], %got(llvm_mips_aver_s_b_ARG2)
1010 ; CHECK-DAG: ld.b [[WS:\$w[0-9]+]], 0([[R1]])
1011 ; CHECK-DAG: ld.b [[WT:\$w[0-9]+]], 0([[R2]])
1012 ; CHECK-DAG: aver_s.b [[WD:\$w[0-9]+]], [[WS]], [[WT]]
1013 ; CHECK-DAG: lw [[R3:\$[0-9]+]], %got(llvm_mips_aver_s_b_RES)
1014 ; CHECK-DAG: st.b [[WD]], 0([[R3]])
1015 ; CHECK: .size llvm_mips_aver_s_b_test
1016 ;
1017 @llvm_mips_aver_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
1018 @llvm_mips_aver_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
1019 @llvm_mips_aver_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
1020
1021 define void @llvm_mips_aver_s_h_test() nounwind {
1022 entry:
1023   %0 = load <8 x i16>* @llvm_mips_aver_s_h_ARG1
1024   %1 = load <8 x i16>* @llvm_mips_aver_s_h_ARG2
1025   %2 = tail call <8 x i16> @llvm.mips.aver.s.h(<8 x i16> %0, <8 x i16> %1)
1026   store <8 x i16> %2, <8 x i16>* @llvm_mips_aver_s_h_RES
1027   ret void
1028 }
1029
1030 declare <8 x i16> @llvm.mips.aver.s.h(<8 x i16>, <8 x i16>) nounwind
1031
1032 ; CHECK: llvm_mips_aver_s_h_test:
1033 ; CHECK-DAG: lw [[R1:\$[0-9]+]], %got(llvm_mips_aver_s_h_ARG1)
1034 ; CHECK-DAG: lw [[R2:\$[0-9]+]], %got(llvm_mips_aver_s_h_ARG2)
1035 ; CHECK-DAG: ld.h [[WS:\$w[0-9]+]], 0([[R1]])
1036 ; CHECK-DAG: ld.h [[WT:\$w[0-9]+]], 0([[R2]])
1037 ; CHECK-DAG: aver_s.h [[WD:\$w[0-9]+]], [[WS]], [[WT]]
1038 ; CHECK-DAG: lw [[R3:\$[0-9]+]], %got(llvm_mips_aver_s_h_RES)
1039 ; CHECK-DAG: st.h [[WD]], 0([[R3]])
1040 ; CHECK: .size llvm_mips_aver_s_h_test
1041 ;
1042 @llvm_mips_aver_s_w_ARG1 = global <4 x i32> <i32 0, i32 1, i32 2, i32 3>, align 16
1043 @llvm_mips_aver_s_w_ARG2 = global <4 x i32> <i32 4, i32 5, i32 6, i32 7>, align 16
1044 @llvm_mips_aver_s_w_RES  = global <4 x i32> <i32 0, i32 0, i32 0, i32 0>, align 16
1045
1046 define void @llvm_mips_aver_s_w_test() nounwind {
1047 entry:
1048   %0 = load <4 x i32>* @llvm_mips_aver_s_w_ARG1
1049   %1 = load <4 x i32>* @llvm_mips_aver_s_w_ARG2
1050   %2 = tail call <4 x i32> @llvm.mips.aver.s.w(<4 x i32> %0, <4 x i32> %1)
1051   store <4 x i32> %2, <4 x i32>* @llvm_mips_aver_s_w_RES
1052   ret void
1053 }
1054
1055 declare <4 x i32> @llvm.mips.aver.s.w(<4 x i32>, <4 x i32>) nounwind
1056
1057 ; CHECK: llvm_mips_aver_s_w_test:
1058 ; CHECK-DAG: lw [[R1:\$[0-9]+]], %got(llvm_mips_aver_s_w_ARG1)
1059 ; CHECK-DAG: lw [[R2:\$[0-9]+]], %got(llvm_mips_aver_s_w_ARG2)
1060 ; CHECK-DAG: ld.w [[WS:\$w[0-9]+]], 0([[R1]])
1061 ; CHECK-DAG: ld.w [[WT:\$w[0-9]+]], 0([[R2]])
1062 ; CHECK-DAG: aver_s.w [[WD:\$w[0-9]+]], [[WS]], [[WT]]
1063 ; CHECK-DAG: lw [[R3:\$[0-9]+]], %got(llvm_mips_aver_s_w_RES)
1064 ; CHECK-DAG: st.w [[WD]], 0([[R3]])
1065 ; CHECK: .size llvm_mips_aver_s_w_test
1066 ;
1067 @llvm_mips_aver_s_d_ARG1 = global <2 x i64> <i64 0, i64 1>, align 16
1068 @llvm_mips_aver_s_d_ARG2 = global <2 x i64> <i64 2, i64 3>, align 16
1069 @llvm_mips_aver_s_d_RES  = global <2 x i64> <i64 0, i64 0>, align 16
1070
1071 define void @llvm_mips_aver_s_d_test() nounwind {
1072 entry:
1073   %0 = load <2 x i64>* @llvm_mips_aver_s_d_ARG1
1074   %1 = load <2 x i64>* @llvm_mips_aver_s_d_ARG2
1075   %2 = tail call <2 x i64> @llvm.mips.aver.s.d(<2 x i64> %0, <2 x i64> %1)
1076   store <2 x i64> %2, <2 x i64>* @llvm_mips_aver_s_d_RES
1077   ret void
1078 }
1079
1080 declare <2 x i64> @llvm.mips.aver.s.d(<2 x i64>, <2 x i64>) nounwind
1081
1082 ; CHECK: llvm_mips_aver_s_d_test:
1083 ; CHECK-DAG: lw [[R1:\$[0-9]+]], %got(llvm_mips_aver_s_d_ARG1)
1084 ; CHECK-DAG: lw [[R2:\$[0-9]+]], %got(llvm_mips_aver_s_d_ARG2)
1085 ; CHECK-DAG: ld.d [[WS:\$w[0-9]+]], 0([[R1]])
1086 ; CHECK-DAG: ld.d [[WT:\$w[0-9]+]], 0([[R2]])
1087 ; CHECK-DAG: aver_s.d [[WD:\$w[0-9]+]], [[WS]], [[WT]]
1088 ; CHECK-DAG: lw [[R3:\$[0-9]+]], %got(llvm_mips_aver_s_d_RES)
1089 ; CHECK-DAG: st.d [[WD]], 0([[R3]])
1090 ; CHECK: .size llvm_mips_aver_s_d_test
1091 ;
1092 @llvm_mips_aver_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
1093 @llvm_mips_aver_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
1094 @llvm_mips_aver_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
1095
1096 define void @llvm_mips_aver_u_b_test() nounwind {
1097 entry:
1098   %0 = load <16 x i8>* @llvm_mips_aver_u_b_ARG1
1099   %1 = load <16 x i8>* @llvm_mips_aver_u_b_ARG2
1100   %2 = tail call <16 x i8> @llvm.mips.aver.u.b(<16 x i8> %0, <16 x i8> %1)
1101   store <16 x i8> %2, <16 x i8>* @llvm_mips_aver_u_b_RES
1102   ret void
1103 }
1104
1105 declare <16 x i8> @llvm.mips.aver.u.b(<16 x i8>, <16 x i8>) nounwind
1106
1107 ; CHECK: llvm_mips_aver_u_b_test:
1108 ; CHECK-DAG: lw [[R1:\$[0-9]+]], %got(llvm_mips_aver_u_b_ARG1)
1109 ; CHECK-DAG: lw [[R2:\$[0-9]+]], %got(llvm_mips_aver_u_b_ARG2)
1110 ; CHECK-DAG: ld.b [[WS:\$w[0-9]+]], 0([[R1]])
1111 ; CHECK-DAG: ld.b [[WT:\$w[0-9]+]], 0([[R2]])
1112 ; CHECK-DAG: aver_u.b [[WD:\$w[0-9]+]], [[WS]], [[WT]]
1113 ; CHECK-DAG: lw [[R3:\$[0-9]+]], %got(llvm_mips_aver_u_b_RES)
1114 ; CHECK-DAG: st.b [[WD]], 0([[R3]])
1115 ; CHECK: .size llvm_mips_aver_u_b_test
1116 ;
1117 @llvm_mips_aver_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
1118 @llvm_mips_aver_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
1119 @llvm_mips_aver_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
1120
1121 define void @llvm_mips_aver_u_h_test() nounwind {
1122 entry:
1123   %0 = load <8 x i16>* @llvm_mips_aver_u_h_ARG1
1124   %1 = load <8 x i16>* @llvm_mips_aver_u_h_ARG2
1125   %2 = tail call <8 x i16> @llvm.mips.aver.u.h(<8 x i16> %0, <8 x i16> %1)
1126   store <8 x i16> %2, <8 x i16>* @llvm_mips_aver_u_h_RES
1127   ret void
1128 }
1129
1130 declare <8 x i16> @llvm.mips.aver.u.h(<8 x i16>, <8 x i16>) nounwind
1131
1132 ; CHECK: llvm_mips_aver_u_h_test:
1133 ; CHECK-DAG: lw [[R1:\$[0-9]+]], %got(llvm_mips_aver_u_h_ARG1)
1134 ; CHECK-DAG: lw [[R2:\$[0-9]+]], %got(llvm_mips_aver_u_h_ARG2)
1135 ; CHECK-DAG: ld.h [[WS:\$w[0-9]+]], 0([[R1]])
1136 ; CHECK-DAG: ld.h [[WT:\$w[0-9]+]], 0([[R2]])
1137 ; CHECK-DAG: aver_u.h [[WD:\$w[0-9]+]], [[WS]], [[WT]]
1138 ; CHECK-DAG: lw [[R3:\$[0-9]+]], %got(llvm_mips_aver_u_h_RES)
1139 ; CHECK-DAG: st.h [[WD]], 0([[R3]])
1140 ; CHECK: .size llvm_mips_aver_u_h_test
1141 ;
1142 @llvm_mips_aver_u_w_ARG1 = global <4 x i32> <i32 0, i32 1, i32 2, i32 3>, align 16
1143 @llvm_mips_aver_u_w_ARG2 = global <4 x i32> <i32 4, i32 5, i32 6, i32 7>, align 16
1144 @llvm_mips_aver_u_w_RES  = global <4 x i32> <i32 0, i32 0, i32 0, i32 0>, align 16
1145
1146 define void @llvm_mips_aver_u_w_test() nounwind {
1147 entry:
1148   %0 = load <4 x i32>* @llvm_mips_aver_u_w_ARG1
1149   %1 = load <4 x i32>* @llvm_mips_aver_u_w_ARG2
1150   %2 = tail call <4 x i32> @llvm.mips.aver.u.w(<4 x i32> %0, <4 x i32> %1)
1151   store <4 x i32> %2, <4 x i32>* @llvm_mips_aver_u_w_RES
1152   ret void
1153 }
1154
1155 declare <4 x i32> @llvm.mips.aver.u.w(<4 x i32>, <4 x i32>) nounwind
1156
1157 ; CHECK: llvm_mips_aver_u_w_test:
1158 ; CHECK-DAG: lw [[R1:\$[0-9]+]], %got(llvm_mips_aver_u_w_ARG1)
1159 ; CHECK-DAG: lw [[R2:\$[0-9]+]], %got(llvm_mips_aver_u_w_ARG2)
1160 ; CHECK-DAG: ld.w [[WS:\$w[0-9]+]], 0([[R1]])
1161 ; CHECK-DAG: ld.w [[WT:\$w[0-9]+]], 0([[R2]])
1162 ; CHECK-DAG: aver_u.w [[WD:\$w[0-9]+]], [[WS]], [[WT]]
1163 ; CHECK-DAG: lw [[R3:\$[0-9]+]], %got(llvm_mips_aver_u_w_RES)
1164 ; CHECK-DAG: st.w [[WD]], 0([[R3]])
1165 ; CHECK: .size llvm_mips_aver_u_w_test
1166 ;
1167 @llvm_mips_aver_u_d_ARG1 = global <2 x i64> <i64 0, i64 1>, align 16
1168 @llvm_mips_aver_u_d_ARG2 = global <2 x i64> <i64 2, i64 3>, align 16
1169 @llvm_mips_aver_u_d_RES  = global <2 x i64> <i64 0, i64 0>, align 16
1170
1171 define void @llvm_mips_aver_u_d_test() nounwind {
1172 entry:
1173   %0 = load <2 x i64>* @llvm_mips_aver_u_d_ARG1
1174   %1 = load <2 x i64>* @llvm_mips_aver_u_d_ARG2
1175   %2 = tail call <2 x i64> @llvm.mips.aver.u.d(<2 x i64> %0, <2 x i64> %1)
1176   store <2 x i64> %2, <2 x i64>* @llvm_mips_aver_u_d_RES
1177   ret void
1178 }
1179
1180 declare <2 x i64> @llvm.mips.aver.u.d(<2 x i64>, <2 x i64>) nounwind
1181
1182 ; CHECK: llvm_mips_aver_u_d_test:
1183 ; CHECK-DAG: lw [[R1:\$[0-9]+]], %got(llvm_mips_aver_u_d_ARG1)
1184 ; CHECK-DAG: lw [[R2:\$[0-9]+]], %got(llvm_mips_aver_u_d_ARG2)
1185 ; CHECK-DAG: ld.d [[WS:\$w[0-9]+]], 0([[R1]])
1186 ; CHECK-DAG: ld.d [[WT:\$w[0-9]+]], 0([[R2]])
1187 ; CHECK-DAG: aver_u.d [[WD:\$w[0-9]+]], [[WS]], [[WT]]
1188 ; CHECK-DAG: lw [[R3:\$[0-9]+]], %got(llvm_mips_aver_u_d_RES)
1189 ; CHECK-DAG: st.d [[WD]], 0([[R3]])
1190 ; CHECK: .size llvm_mips_aver_u_d_test
1191 ;