1 ; RUN: llc -mtriple armeb-eabi -mattr v7,neon -float-abi soft %s -o - | FileCheck %s -check-prefix CHECK -check-prefix SOFT
2 ; RUN: llc -mtriple armeb-eabi -mattr v7,neon -float-abi hard %s -o - | FileCheck %s -check-prefix CHECK -check-prefix HARD
4 ; CHECK-LABEL: test_i64_f64:
5 declare i64 @test_i64_f64_helper(double %p)
6 define void @test_i64_f64(double* %p, i64* %q) {
7 ; SOFT: vadd.f64 [[REG:d[0-9]+]]
8 ; SOFT: vmov r1, r0, [[REG]]
10 %1 = load double, double* %p
11 %2 = fadd double %1, %1
12 %3 = call i64 @test_i64_f64_helper(double %2)
20 ; CHECK-LABEL: test_i64_v1i64:
21 declare i64 @test_i64_v1i64_helper(<1 x i64> %p)
22 define void @test_i64_v1i64(<1 x i64>* %p, i64* %q) {
23 ; SOFT: vadd.i64 [[REG:d[0-9]+]]
24 ; SOFT: vmov r1, r0, [[REG]]
26 %1 = load <1 x i64>, <1 x i64>* %p
27 %2 = add <1 x i64> %1, %1
28 %3 = call i64 @test_i64_v1i64_helper(<1 x i64> %2)
36 ; CHECK-LABEL: test_i64_v2f32:
37 declare i64 @test_i64_v2f32_helper(<2 x float> %p)
38 define void @test_i64_v2f32(<2 x float>* %p, i64* %q) {
39 ; SOFT: vrev64.32 [[REG:d[0-9]+]]
40 ; SOFT: vmov r1, r0, [[REG]]
42 %1 = load <2 x float>, <2 x float>* %p
43 %2 = fadd <2 x float> %1, %1
44 %3 = call i64 @test_i64_v2f32_helper(<2 x float> %2)
52 ; CHECK-LABEL: test_i64_v2i32:
53 declare i64 @test_i64_v2i32_helper(<2 x i32> %p)
54 define void @test_i64_v2i32(<2 x i32>* %p, i64* %q) {
55 ; SOFT: vrev64.32 [[REG:d[0-9]+]]
56 ; SOFT: vmov r1, r0, [[REG]]
58 %1 = load <2 x i32>, <2 x i32>* %p
59 %2 = add <2 x i32> %1, %1
60 %3 = call i64 @test_i64_v2i32_helper(<2 x i32> %2)
68 ; CHECK-LABEL: test_i64_v4i16:
69 declare i64 @test_i64_v4i16_helper(<4 x i16> %p)
70 define void @test_i64_v4i16(<4 x i16>* %p, i64* %q) {
71 ; SOFT: vrev64.16 [[REG:d[0-9]+]]
72 ; SOFT: vmov r1, r0, [[REG]]
74 %1 = load <4 x i16>, <4 x i16>* %p
75 %2 = add <4 x i16> %1, %1
76 %3 = call i64 @test_i64_v4i16_helper(<4 x i16> %2)
84 ; CHECK-LABEL: test_i64_v8i8:
85 declare i64 @test_i64_v8i8_helper(<8 x i8> %p)
86 define void @test_i64_v8i8(<8 x i8>* %p, i64* %q) {
87 ; SOFT: vrev64.8 [[REG:d[0-9]+]]
88 ; SOFT: vmov r1, r0, [[REG]]
90 %1 = load <8 x i8>, <8 x i8>* %p
91 %2 = add <8 x i8> %1, %1
92 %3 = call i64 @test_i64_v8i8_helper(<8 x i8> %2)
100 ; CHECK-LABEL: test_f64_i64:
101 declare double @test_f64_i64_helper(i64 %p)
102 define void @test_f64_i64(i64* %p, double* %q) {
105 %1 = load i64, i64* %p
107 %3 = call double @test_f64_i64_helper(i64 %2)
108 %4 = fadd double %3, %3
109 store double %4, double* %q
111 ; SOFT: vmov [[REG:d[0-9]+]], r1, r0
112 ; SOFT: vadd.f64 [[REG]]
113 ; HARD: vadd.f64 {{d[0-9]+}}, d0
116 ; CHECK-LABEL: test_f64_v1i64:
117 declare double @test_f64_v1i64_helper(<1 x i64> %p)
118 define void @test_f64_v1i64(<1 x i64>* %p, double* %q) {
119 ; SOFT: vadd.i64 [[REG:d[0-9]+]]
120 ; SOFT: vmov r1, r0, [[REG]]
122 %1 = load <1 x i64>, <1 x i64>* %p
123 %2 = add <1 x i64> %1, %1
124 %3 = call double @test_f64_v1i64_helper(<1 x i64> %2)
125 %4 = fadd double %3, %3
126 store double %4, double* %q
128 ; SOFT: vmov [[REG:d[0-9]+]], r1, r0
129 ; SOFT: vadd.f64 [[REG]]
130 ; HARD: vadd.f64 {{d[0-9]+}}, d0
133 ; CHECK-LABEL: test_f64_v2f32:
134 declare double @test_f64_v2f32_helper(<2 x float> %p)
135 define void @test_f64_v2f32(<2 x float>* %p, double* %q) {
136 ; SOFT: vrev64.32 [[REG:d[0-9]+]]
137 ; SOFT: vmov r1, r0, [[REG]]
139 %1 = load <2 x float>, <2 x float>* %p
140 %2 = fadd <2 x float> %1, %1
141 %3 = call double @test_f64_v2f32_helper(<2 x float> %2)
142 %4 = fadd double %3, %3
143 store double %4, double* %q
145 ; SOFT: vmov [[REG:d[0-9]+]], r1, r0
146 ; SOFT: vadd.f64 [[REG]]
147 ; HARD: vadd.f64 {{d[0-9]+}}, d0
150 ; CHECK-LABEL: test_f64_v2i32:
151 declare double @test_f64_v2i32_helper(<2 x i32> %p)
152 define void @test_f64_v2i32(<2 x i32>* %p, double* %q) {
153 ; SOFT: vrev64.32 [[REG:d[0-9]+]]
154 ; SOFT: vmov r1, r0, [[REG]]
156 %1 = load <2 x i32>, <2 x i32>* %p
157 %2 = add <2 x i32> %1, %1
158 %3 = call double @test_f64_v2i32_helper(<2 x i32> %2)
159 %4 = fadd double %3, %3
160 store double %4, double* %q
162 ; SOFT: vmov [[REG:d[0-9]+]], r1, r0
163 ; SOFT: vadd.f64 [[REG]]
164 ; HARD: vadd.f64 {{d[0-9]+}}, d0
167 ; CHECK-LABEL: test_f64_v4i16:
168 declare double @test_f64_v4i16_helper(<4 x i16> %p)
169 define void @test_f64_v4i16(<4 x i16>* %p, double* %q) {
170 ; SOFT: vrev64.16 [[REG:d[0-9]+]]
171 ; SOFT: vmov r1, r0, [[REG]]
173 %1 = load <4 x i16>, <4 x i16>* %p
174 %2 = add <4 x i16> %1, %1
175 %3 = call double @test_f64_v4i16_helper(<4 x i16> %2)
176 %4 = fadd double %3, %3
177 store double %4, double* %q
179 ; SOFT: vmov [[REG:d[0-9]+]], r1, r0
180 ; SOFT: vadd.f64 [[REG]]
181 ; HARD: vadd.f64 {{d[0-9]+}}, d0
184 ; CHECK-LABEL: test_f64_v8i8:
185 declare double @test_f64_v8i8_helper(<8 x i8> %p)
186 define void @test_f64_v8i8(<8 x i8>* %p, double* %q) {
187 ; SOFT: vrev64.8 [[REG:d[0-9]+]]
188 ; SOFT: vmov r1, r0, [[REG]]
190 %1 = load <8 x i8>, <8 x i8>* %p
191 %2 = add <8 x i8> %1, %1
192 %3 = call double @test_f64_v8i8_helper(<8 x i8> %2)
193 %4 = fadd double %3, %3
194 store double %4, double* %q
196 ; SOFT: vmov [[REG:d[0-9]+]], r1, r0
197 ; SOFT: vadd.f64 [[REG]]
198 ; HARD: vadd.f64 {{d[0-9]+}}, d0
201 ; CHECK-LABEL: test_v1i64_i64:
202 declare <1 x i64> @test_v1i64_i64_helper(i64 %p)
203 define void @test_v1i64_i64(i64* %p, <1 x i64>* %q) {
206 %1 = load i64, i64* %p
208 %3 = call <1 x i64> @test_v1i64_i64_helper(i64 %2)
209 %4 = add <1 x i64> %3, %3
210 store <1 x i64> %4, <1 x i64>* %q
212 ; SOFT: vmov [[REG:d[0-9]+]], r1, r0
213 ; SOFT: vadd.i64 [[REG]]
214 ; HARD: vadd.i64 {{d[0-9]+}}, d0
217 ; CHECK-LABEL: test_v1i64_f64:
218 declare <1 x i64> @test_v1i64_f64_helper(double %p)
219 define void @test_v1i64_f64(double* %p, <1 x i64>* %q) {
220 ; SOFT: vadd.f64 [[REG:d[0-9]+]]
221 ; SOFT: vmov r1, r0, [[REG]]
223 %1 = load double, double* %p
224 %2 = fadd double %1, %1
225 %3 = call <1 x i64> @test_v1i64_f64_helper(double %2)
226 %4 = add <1 x i64> %3, %3
227 store <1 x i64> %4, <1 x i64>* %q
229 ; SOFT: vmov [[REG:d[0-9]+]], r1, r0
230 ; SOFT: vadd.i64 [[REG]]
231 ; HARD: vadd.i64 {{d[0-9]+}}, d0
234 ; CHECK-LABEL: test_v1i64_v2f32:
235 declare <1 x i64> @test_v1i64_v2f32_helper(<2 x float> %p)
236 define void @test_v1i64_v2f32(<2 x float>* %p, <1 x i64>* %q) {
238 ; SOFT: vadd.f32 [[REG:d[0-9]+]]
239 ; SOFT: vmov r1, r0, [[REG]]
240 %1 = load <2 x float>, <2 x float>* %p
241 %2 = fadd <2 x float> %1, %1
242 %3 = call <1 x i64> @test_v1i64_v2f32_helper(<2 x float> %2)
243 %4 = add <1 x i64> %3, %3
244 store <1 x i64> %4, <1 x i64>* %q
246 ; SOFT: vmov [[REG:d[0-9]+]], r1, r0
247 ; SOFT: vadd.i64 [[REG]]
248 ; HARD: vadd.i64 {{d[0-9]+}}, d0
251 ; CHECK-LABEL: test_v1i64_v2i32:
252 declare <1 x i64> @test_v1i64_v2i32_helper(<2 x i32> %p)
253 define void @test_v1i64_v2i32(<2 x i32>* %p, <1 x i64>* %q) {
255 ; SOFT: vadd.i32 [[REG:d[0-9]+]]
256 ; SOFT: vrev64.32 [[REG]]
257 ; SOFT: vmov r1, r0, [[REG]]
258 %1 = load <2 x i32>, <2 x i32>* %p
259 %2 = add <2 x i32> %1, %1
260 %3 = call <1 x i64> @test_v1i64_v2i32_helper(<2 x i32> %2)
261 %4 = add <1 x i64> %3, %3
262 store <1 x i64> %4, <1 x i64>* %q
264 ; SOFT: vmov [[REG:d[0-9]+]], r1, r0
265 ; SOFT: vadd.i64 [[REG]]
266 ; HARD: vadd.i64 {{d[0-9]+}}, d0
269 ; CHECK-LABEL: test_v1i64_v4i16:
270 declare <1 x i64> @test_v1i64_v4i16_helper(<4 x i16> %p)
271 define void @test_v1i64_v4i16(<4 x i16>* %p, <1 x i64>* %q) {
272 ; SOFT: vrev64.16 [[REG:d[0-9]+]]
273 ; SOFT: vmov r1, r0, [[REG]]
275 %1 = load <4 x i16>, <4 x i16>* %p
276 %2 = add <4 x i16> %1, %1
277 %3 = call <1 x i64> @test_v1i64_v4i16_helper(<4 x i16> %2)
278 %4 = add <1 x i64> %3, %3
279 store <1 x i64> %4, <1 x i64>* %q
281 ; SOFT: vmov [[REG:d[0-9]+]], r1, r0
282 ; SOFT: vadd.i64 [[REG]]
283 ; HARD: vadd.i64 {{d[0-9]+}}, d0
286 ; CHECK-LABEL: test_v1i64_v8i8:
287 declare <1 x i64> @test_v1i64_v8i8_helper(<8 x i8> %p)
288 define void @test_v1i64_v8i8(<8 x i8>* %p, <1 x i64>* %q) {
289 ; SOFT: vrev64.8 [[REG:d[0-9]+]]
290 ; SOFT: vmov r1, r0, [[REG]]
292 %1 = load <8 x i8>, <8 x i8>* %p
293 %2 = add <8 x i8> %1, %1
294 %3 = call <1 x i64> @test_v1i64_v8i8_helper(<8 x i8> %2)
295 %4 = add <1 x i64> %3, %3
296 store <1 x i64> %4, <1 x i64>* %q
298 ; SOFT: vmov [[REG:d[0-9]+]], r1, r0
299 ; SOFT: vadd.i64 [[REG]]
300 ; HARD: vadd.i64 {{d[0-9]+}}, d0
303 ; CHECK-LABEL: test_v2f32_i64:
304 declare <2 x float> @test_v2f32_i64_helper(i64 %p)
305 define void @test_v2f32_i64(i64* %p, <2 x float>* %q) {
308 %1 = load i64, i64* %p
310 %3 = call <2 x float> @test_v2f32_i64_helper(i64 %2)
311 %4 = fadd <2 x float> %3, %3
312 store <2 x float> %4, <2 x float>* %q
314 ; SOFT: vmov [[REG:d[0-9]+]], r1, r0
315 ; SOFT: vrev64.32 [[REG]]
316 ; HARD: vrev64.32 {{d[0-9]+}}, d0
319 ; CHECK-LABEL: test_v2f32_f64:
320 declare <2 x float> @test_v2f32_f64_helper(double %p)
321 define void @test_v2f32_f64(double* %p, <2 x float>* %q) {
322 ; SOFT: vadd.f64 [[REG:d[0-9]+]]
323 ; SOFT: vmov r1, r0, [[REG]]
325 %1 = load double, double* %p
326 %2 = fadd double %1, %1
327 %3 = call <2 x float> @test_v2f32_f64_helper(double %2)
328 %4 = fadd <2 x float> %3, %3
329 store <2 x float> %4, <2 x float>* %q
331 ; SOFT: vmov [[REG:d[0-9]+]], r1, r0
332 ; SOFT: vrev64.32 [[REG]]
333 ; HARD: vrev64.32 {{d[0-9]+}}, d0
336 ; CHECK-LABEL: test_v2f32_v1i64:
337 declare <2 x float> @test_v2f32_v1i64_helper(<1 x i64> %p)
338 define void @test_v2f32_v1i64(<1 x i64>* %p, <2 x float>* %q) {
339 ; SOFT: vadd.i64 [[REG:d[0-9]+]]
340 ; SOFT: vmov r1, r0, [[REG]]
342 %1 = load <1 x i64>, <1 x i64>* %p
343 %2 = add <1 x i64> %1, %1
344 %3 = call <2 x float> @test_v2f32_v1i64_helper(<1 x i64> %2)
345 %4 = fadd <2 x float> %3, %3
346 store <2 x float> %4, <2 x float>* %q
348 ; SOFT: vmov [[REG:d[0-9]+]], r1, r0
349 ; SOFT: vrev64.32 [[REG]]
350 ; HARD: vrev64.32 {{d[0-9]+}}, d0
353 ; CHECK-LABEL: test_v2f32_v2i32:
354 declare <2 x float> @test_v2f32_v2i32_helper(<2 x i32> %p)
355 define void @test_v2f32_v2i32(<2 x i32>* %p, <2 x float>* %q) {
357 ; SOFT: vadd.i32 [[REG:d[0-9]+]]
358 ; SOFT: vrev64.32 [[REG]]
359 ; SOFT: vmov r1, r0, [[REG]]
360 %1 = load <2 x i32>, <2 x i32>* %p
361 %2 = add <2 x i32> %1, %1
362 %3 = call <2 x float> @test_v2f32_v2i32_helper(<2 x i32> %2)
363 %4 = fadd <2 x float> %3, %3
364 store <2 x float> %4, <2 x float>* %q
366 ; SOFT: vmov [[REG:d[0-9]+]], r1, r0
367 ; SOFT: vrev64.32 [[REG]]
368 ; HARD: vrev64.32 {{d[0-9]+}}, d0
371 ; CHECK-LABEL: test_v2f32_v4i16:
372 declare <2 x float> @test_v2f32_v4i16_helper(<4 x i16> %p)
373 define void @test_v2f32_v4i16(<4 x i16>* %p, <2 x float>* %q) {
374 ; SOFT: vrev64.16 [[REG:d[0-9]+]]
375 ; SOFT: vmov r1, r0, [[REG]]
377 %1 = load <4 x i16>, <4 x i16>* %p
378 %2 = add <4 x i16> %1, %1
379 %3 = call <2 x float> @test_v2f32_v4i16_helper(<4 x i16> %2)
380 %4 = fadd <2 x float> %3, %3
381 store <2 x float> %4, <2 x float>* %q
383 ; SOFT: vmov [[REG:d[0-9]+]], r1, r0
384 ; SOFT: vrev64.32 [[REG]]
385 ; HARD: vrev64.32 {{d[0-9]+}}, d0
388 ; CHECK-LABEL: test_v2f32_v8i8:
389 declare <2 x float> @test_v2f32_v8i8_helper(<8 x i8> %p)
390 define void @test_v2f32_v8i8(<8 x i8>* %p, <2 x float>* %q) {
391 ; SOFT: vrev64.8 [[REG:d[0-9]+]]
392 ; SOFT: vmov r1, r0, [[REG]]
394 %1 = load <8 x i8>, <8 x i8>* %p
395 %2 = add <8 x i8> %1, %1
396 %3 = call <2 x float> @test_v2f32_v8i8_helper(<8 x i8> %2)
397 %4 = fadd <2 x float> %3, %3
398 store <2 x float> %4, <2 x float>* %q
400 ; SOFT: vmov [[REG:d[0-9]+]], r1, r0
401 ; SOFT: vrev64.32 [[REG]]
402 ; HARD: vrev64.32 {{d[0-9]+}}, d0
405 ; CHECK-LABEL: test_v2i32_i64:
406 declare <2 x i32> @test_v2i32_i64_helper(i64 %p)
407 define void @test_v2i32_i64(i64* %p, <2 x i32>* %q) {
410 %1 = load i64, i64* %p
412 %3 = call <2 x i32> @test_v2i32_i64_helper(i64 %2)
413 %4 = add <2 x i32> %3, %3
414 store <2 x i32> %4, <2 x i32>* %q
416 ; SOFT: vmov [[REG:d[0-9]+]], r1, r0
417 ; SOFT: vrev64.32 [[REG]]
418 ; HARD: vrev64.32 {{d[0-9]+}}, d0
421 ; CHECK-LABEL: test_v2i32_f64:
422 declare <2 x i32> @test_v2i32_f64_helper(double %p)
423 define void @test_v2i32_f64(double* %p, <2 x i32>* %q) {
424 ; SOFT: vadd.f64 [[REG:d[0-9]+]]
425 ; SOFT: vmov r1, r0, [[REG]]
427 %1 = load double, double* %p
428 %2 = fadd double %1, %1
429 %3 = call <2 x i32> @test_v2i32_f64_helper(double %2)
430 %4 = add <2 x i32> %3, %3
431 store <2 x i32> %4, <2 x i32>* %q
433 ; SOFT: vmov [[REG:d[0-9]+]], r1, r0
434 ; SOFT: vrev64.32 [[REG]]
435 ; HARD: vrev64.32 {{d[0-9]+}}, d0
438 ; CHECK-LABEL: test_v2i32_v1i64:
439 declare <2 x i32> @test_v2i32_v1i64_helper(<1 x i64> %p)
440 define void @test_v2i32_v1i64(<1 x i64>* %p, <2 x i32>* %q) {
441 ; SOFT: vadd.i64 [[REG:d[0-9]+]]
442 ; SOFT: vmov r1, r0, [[REG]]
444 %1 = load <1 x i64>, <1 x i64>* %p
445 %2 = add <1 x i64> %1, %1
446 %3 = call <2 x i32> @test_v2i32_v1i64_helper(<1 x i64> %2)
447 %4 = add <2 x i32> %3, %3
448 store <2 x i32> %4, <2 x i32>* %q
450 ; SOFT: vmov [[REG:d[0-9]+]], r1, r0
451 ; SOFT: vrev64.32 [[REG]]
452 ; HARD: vrev64.32 {{d[0-9]+}}, d0
455 ; CHECK-LABEL: test_v2i32_v2f32:
456 declare <2 x i32> @test_v2i32_v2f32_helper(<2 x float> %p)
457 define void @test_v2i32_v2f32(<2 x float>* %p, <2 x i32>* %q) {
458 ; HARD: vadd.f32 [[REG:d[0-9]+]]
459 ; HARD: vrev64.32 d0, [[REG]]
460 ; SOFT: vadd.f32 [[REG:d[0-9]+]]
461 ; SOFT: vrev64.32 [[REG]]
462 ; SOFT: vmov r1, r0, [[REG]]
463 %1 = load <2 x float>, <2 x float>* %p
464 %2 = fadd <2 x float> %1, %1
465 %3 = call <2 x i32> @test_v2i32_v2f32_helper(<2 x float> %2)
466 %4 = add <2 x i32> %3, %3
467 store <2 x i32> %4, <2 x i32>* %q
469 ; SOFT: vmov [[REG:d[0-9]+]], r1, r0
470 ; SOFT: vrev64.32 [[REG]]
471 ; HARD: vrev64.32 {{d[0-9]+}}, d0
474 ; CHECK-LABEL: test_v2i32_v4i16:
475 declare <2 x i32> @test_v2i32_v4i16_helper(<4 x i16> %p)
476 define void @test_v2i32_v4i16(<4 x i16>* %p, <2 x i32>* %q) {
477 ; SOFT: vrev64.16 [[REG:d[0-9]+]]
478 ; SOFT: vmov r1, r0, [[REG]]
480 %1 = load <4 x i16>, <4 x i16>* %p
481 %2 = add <4 x i16> %1, %1
482 %3 = call <2 x i32> @test_v2i32_v4i16_helper(<4 x i16> %2)
483 %4 = add <2 x i32> %3, %3
484 store <2 x i32> %4, <2 x i32>* %q
486 ; SOFT: vmov [[REG:d[0-9]+]], r1, r0
487 ; SOFT: vrev64.32 [[REG]]
488 ; HARD: vrev64.32 {{d[0-9]+}}, d0
491 ; CHECK-LABEL: test_v2i32_v8i8:
492 declare <2 x i32> @test_v2i32_v8i8_helper(<8 x i8> %p)
493 define void @test_v2i32_v8i8(<8 x i8>* %p, <2 x i32>* %q) {
494 ; SOFT: vrev64.8 [[REG:d[0-9]+]]
495 ; SOFT: vmov r1, r0, [[REG]]
497 %1 = load <8 x i8>, <8 x i8>* %p
498 %2 = add <8 x i8> %1, %1
499 %3 = call <2 x i32> @test_v2i32_v8i8_helper(<8 x i8> %2)
500 %4 = add <2 x i32> %3, %3
501 store <2 x i32> %4, <2 x i32>* %q
503 ; SOFT: vmov [[REG:d[0-9]+]], r1, r0
504 ; SOFT: vrev64.32 [[REG]]
505 ; HARD: vrev64.32 {{d[0-9]+}}, d0
508 ; CHECK-LABEL: test_v4i16_i64:
509 declare <4 x i16> @test_v4i16_i64_helper(i64 %p)
510 define void @test_v4i16_i64(i64* %p, <4 x i16>* %q) {
513 %1 = load i64, i64* %p
515 %3 = call <4 x i16> @test_v4i16_i64_helper(i64 %2)
516 %4 = add <4 x i16> %3, %3
517 store <4 x i16> %4, <4 x i16>* %q
519 ; SOFT: vmov [[REG:d[0-9]+]], r1, r0
520 ; SOFT: vrev64.16 [[REG]]
521 ; HARD: vrev64.16 {{d[0-9]+}}, d0
524 ; CHECK-LABEL: test_v4i16_f64:
525 declare <4 x i16> @test_v4i16_f64_helper(double %p)
526 define void @test_v4i16_f64(double* %p, <4 x i16>* %q) {
527 ; SOFT: vadd.f64 [[REG:d[0-9]+]]
528 ; SOFT: vmov r1, r0, [[REG]]
530 %1 = load double, double* %p
531 %2 = fadd double %1, %1
532 %3 = call <4 x i16> @test_v4i16_f64_helper(double %2)
533 %4 = add <4 x i16> %3, %3
534 store <4 x i16> %4, <4 x i16>* %q
536 ; SOFT: vmov [[REG:d[0-9]+]], r1, r0
537 ; SOFT: vrev64.16 [[REG]]
538 ; HARD: vrev64.16 {{d[0-9]+}}, d0
541 ; CHECK-LABEL: test_v4i16_v1i64:
542 declare <4 x i16> @test_v4i16_v1i64_helper(<1 x i64> %p)
543 define void @test_v4i16_v1i64(<1 x i64>* %p, <4 x i16>* %q) {
544 ; SOFT: vadd.i64 [[REG:d[0-9]+]]
545 ; SOFT: vmov r1, r0, [[REG]]
547 %1 = load <1 x i64>, <1 x i64>* %p
548 %2 = add <1 x i64> %1, %1
549 %3 = call <4 x i16> @test_v4i16_v1i64_helper(<1 x i64> %2)
550 %4 = add <4 x i16> %3, %3
551 store <4 x i16> %4, <4 x i16>* %q
553 ; SOFT: vmov [[REG:d[0-9]+]], r1, r0
554 ; SOFT: vrev64.16 [[REG]]
555 ; HARD: vrev64.16 {{d[0-9]+}}, d0
558 ; CHECK-LABEL: test_v4i16_v2f32:
559 declare <4 x i16> @test_v4i16_v2f32_helper(<2 x float> %p)
560 define void @test_v4i16_v2f32(<2 x float>* %p, <4 x i16>* %q) {
561 ; HARD: vadd.f32 [[REG:d[0-9]+]]
562 ; HARD: vrev64.32 d0, [[REG]]
563 ; SOFT: vadd.f32 [[REG:d[0-9]+]]
564 ; SOFT: vrev64.32 [[REG]]
565 ; SOFT: vmov r1, r0, [[REG]]
566 %1 = load <2 x float>, <2 x float>* %p
567 %2 = fadd <2 x float> %1, %1
568 %3 = call <4 x i16> @test_v4i16_v2f32_helper(<2 x float> %2)
569 %4 = add <4 x i16> %3, %3
570 store <4 x i16> %4, <4 x i16>* %q
572 ; SOFT: vmov [[REG:d[0-9]+]], r1, r0
573 ; SOFT: vrev64.16 [[REG]]
574 ; HARD: vrev64.16 {{d[0-9]+}}, d0
577 ; CHECK-LABEL: test_v4i16_v2i32:
578 declare <4 x i16> @test_v4i16_v2i32_helper(<2 x i32> %p)
579 define void @test_v4i16_v2i32(<2 x i32>* %p, <4 x i16>* %q) {
580 ; HARD: vadd.i32 [[REG:d[0-9]+]]
581 ; HARD: vrev64.32 d0, [[REG]]
582 ; SOFT: vadd.i32 [[REG:d[0-9]+]]
583 ; SOFT: vrev64.32 [[REG]]
584 ; SOFT: vmov r1, r0, [[REG]]
585 %1 = load <2 x i32>, <2 x i32>* %p
586 %2 = add <2 x i32> %1, %1
587 %3 = call <4 x i16> @test_v4i16_v2i32_helper(<2 x i32> %2)
588 %4 = add <4 x i16> %3, %3
589 store <4 x i16> %4, <4 x i16>* %q
591 ; SOFT: vmov [[REG:d[0-9]+]], r1, r0
592 ; SOFT: vrev64.16 [[REG]]
593 ; HARD: vrev64.16 {{d[0-9]+}}, d0
596 ; CHECK-LABEL: test_v4i16_v8i8:
597 declare <4 x i16> @test_v4i16_v8i8_helper(<8 x i8> %p)
598 define void @test_v4i16_v8i8(<8 x i8>* %p, <4 x i16>* %q) {
599 ; SOFT: vrev64.8 [[REG:d[0-9]+]]
600 ; SOFT: vmov r1, r0, [[REG]]
602 %1 = load <8 x i8>, <8 x i8>* %p
603 %2 = add <8 x i8> %1, %1
604 %3 = call <4 x i16> @test_v4i16_v8i8_helper(<8 x i8> %2)
605 %4 = add <4 x i16> %3, %3
606 store <4 x i16> %4, <4 x i16>* %q
608 ; SOFT: vmov [[REG:d[0-9]+]], r1, r0
609 ; SOFT: vrev64.16 [[REG]]
610 ; HARD: vrev64.16 {{d[0-9]+}}, d0
613 ; CHECK-LABEL: test_v8i8_i64:
614 declare <8 x i8> @test_v8i8_i64_helper(i64 %p)
615 define void @test_v8i8_i64(i64* %p, <8 x i8>* %q) {
618 %1 = load i64, i64* %p
620 %3 = call <8 x i8> @test_v8i8_i64_helper(i64 %2)
621 %4 = add <8 x i8> %3, %3
622 store <8 x i8> %4, <8 x i8>* %q
624 ; SOFT: vmov [[REG:d[0-9]+]], r1, r0
625 ; SOFT: vrev64.8 [[REG]]
626 ; HARD: vrev64.8 {{d[0-9]+}}, d0
629 ; CHECK-LABEL: test_v8i8_f64:
630 declare <8 x i8> @test_v8i8_f64_helper(double %p)
631 define void @test_v8i8_f64(double* %p, <8 x i8>* %q) {
632 ; SOFT: vadd.f64 [[REG:d[0-9]+]]
633 ; SOFT: vmov r1, r0, [[REG]]
635 %1 = load double, double* %p
636 %2 = fadd double %1, %1
637 %3 = call <8 x i8> @test_v8i8_f64_helper(double %2)
638 %4 = add <8 x i8> %3, %3
639 store <8 x i8> %4, <8 x i8>* %q
641 ; SOFT: vmov [[REG:d[0-9]+]], r1, r0
642 ; SOFT: vrev64.8 [[REG]]
643 ; HARD: vrev64.8 {{d[0-9]+}}, d0
646 ; CHECK-LABEL: test_v8i8_v1i64:
647 declare <8 x i8> @test_v8i8_v1i64_helper(<1 x i64> %p)
648 define void @test_v8i8_v1i64(<1 x i64>* %p, <8 x i8>* %q) {
649 ; SOFT: vadd.i64 [[REG:d[0-9]+]]
650 ; SOFT: vmov r1, r0, [[REG]]
652 %1 = load <1 x i64>, <1 x i64>* %p
653 %2 = add <1 x i64> %1, %1
654 %3 = call <8 x i8> @test_v8i8_v1i64_helper(<1 x i64> %2)
655 %4 = add <8 x i8> %3, %3
656 store <8 x i8> %4, <8 x i8>* %q
658 ; SOFT: vmov [[REG:d[0-9]+]], r1, r0
659 ; SOFT: vrev64.8 [[REG]]
660 ; HARD: vrev64.8 {{d[0-9]+}}, d0
663 ; CHECK-LABEL: test_v8i8_v2f32:
664 declare <8 x i8> @test_v8i8_v2f32_helper(<2 x float> %p)
665 define void @test_v8i8_v2f32(<2 x float>* %p, <8 x i8>* %q) {
666 ; SOFT: vrev64.32 [[REG:d[0-9]+]]
667 ; SOFT: vmov r1, r0, [[REG]]
669 %1 = load <2 x float>, <2 x float>* %p
670 %2 = fadd <2 x float> %1, %1
671 %3 = call <8 x i8> @test_v8i8_v2f32_helper(<2 x float> %2)
672 %4 = add <8 x i8> %3, %3
673 store <8 x i8> %4, <8 x i8>* %q
675 ; SOFT: vmov [[REG:d[0-9]+]], r1, r0
676 ; SOFT: vrev64.8 [[REG]]
677 ; HARD: vrev64.8 {{d[0-9]+}}, d0
680 ; CHECK-LABEL: test_v8i8_v2i32:
681 declare <8 x i8> @test_v8i8_v2i32_helper(<2 x i32> %p)
682 define void @test_v8i8_v2i32(<2 x i32>* %p, <8 x i8>* %q) {
683 ; SOFT: vrev64.32 [[REG:d[0-9]+]]
684 ; SOFT: vmov r1, r0, [[REG]]
686 %1 = load <2 x i32>, <2 x i32>* %p
687 %2 = add <2 x i32> %1, %1
688 %3 = call <8 x i8> @test_v8i8_v2i32_helper(<2 x i32> %2)
689 %4 = add <8 x i8> %3, %3
690 store <8 x i8> %4, <8 x i8>* %q
692 ; SOFT: vmov [[REG:d[0-9]+]], r1, r0
693 ; SOFT: vrev64.8 [[REG]]
694 ; HARD: vrev64.8 {{d[0-9]+}}, d0
697 ; CHECK-LABEL: test_v8i8_v4i16:
698 declare <8 x i8> @test_v8i8_v4i16_helper(<4 x i16> %p)
699 define void @test_v8i8_v4i16(<4 x i16>* %p, <8 x i8>* %q) {
700 ; SOFT: vrev64.16 [[REG:d[0-9]+]]
701 ; SOFT: vmov r1, r0, [[REG]]
703 %1 = load <4 x i16>, <4 x i16>* %p
704 %2 = add <4 x i16> %1, %1
705 %3 = call <8 x i8> @test_v8i8_v4i16_helper(<4 x i16> %2)
706 %4 = add <8 x i8> %3, %3
707 store <8 x i8> %4, <8 x i8>* %q
709 ; SOFT: vmov [[REG:d[0-9]+]], r1, r0
710 ; SOFT: vrev64.8 [[REG]]
711 ; HARD: vrev64.8 {{d[0-9]+}}, d0
714 ; CHECK-LABEL: test_f128_v2f64:
715 declare fp128 @test_f128_v2f64_helper(<2 x double> %p)
716 define void @test_f128_v2f64(<2 x double>* %p, fp128* %q) {
717 ; SOFT: vadd.f64 [[REG2:d[0-9]+]]
718 ; SOFT: vadd.f64 [[REG1:d[0-9]+]]
719 ; SOFT: vmov r1, r0, [[REG1]]
720 ; SOFT: vmov r3, r2, [[REG2]]
723 %1 = load <2 x double>, <2 x double>* %p
724 %2 = fadd <2 x double> %1, %1
725 %3 = call fp128 @test_f128_v2f64_helper(<2 x double> %2)
726 %4 = fadd fp128 %3, %3
727 store fp128 %4, fp128* %q
729 ; CHECK: stm sp, {r0, r1, r2, r3}
732 ; CHECK-LABEL: test_f128_v2i64:
733 declare fp128 @test_f128_v2i64_helper(<2 x i64> %p)
734 define void @test_f128_v2i64(<2 x i64>* %p, fp128* %q) {
738 %1 = load <2 x i64>, <2 x i64>* %p
739 %2 = add <2 x i64> %1, %1
740 %3 = call fp128 @test_f128_v2i64_helper(<2 x i64> %2)
741 %4 = fadd fp128 %3, %3
742 store fp128 %4, fp128* %q
744 ; CHECK: stm sp, {r0, r1, r2, r3}
747 ; CHECK-LABEL: test_f128_v4f32:
748 declare fp128 @test_f128_v4f32_helper(<4 x float> %p)
749 define void @test_f128_v4f32(<4 x float>* %p, fp128* %q) {
753 %1 = load <4 x float>, <4 x float>* %p
754 %2 = fadd <4 x float> %1, %1
755 %3 = call fp128 @test_f128_v4f32_helper(<4 x float> %2)
756 %4 = fadd fp128 %3, %3
757 store fp128 %4, fp128* %q
759 ; CHECK: stm sp, {r0, r1, r2, r3}
762 ; CHECK-LABEL: test_f128_v4i32:
763 declare fp128 @test_f128_v4i32_helper(<4 x i32> %p)
764 define void @test_f128_v4i32(<4 x i32>* %p, fp128* %q) {
768 %1 = load <4 x i32>, <4 x i32>* %p
769 %2 = add <4 x i32> %1, %1
770 %3 = call fp128 @test_f128_v4i32_helper(<4 x i32> %2)
771 %4 = fadd fp128 %3, %3
772 store fp128 %4, fp128* %q
774 ; CHECK: stm sp, {r0, r1, r2, r3}
777 ; CHECK-LABEL: test_f128_v8i16:
778 declare fp128 @test_f128_v8i16_helper(<8 x i16> %p)
779 define void @test_f128_v8i16(<8 x i16>* %p, fp128* %q) {
783 %1 = load <8 x i16>, <8 x i16>* %p
784 %2 = add <8 x i16> %1, %1
785 %3 = call fp128 @test_f128_v8i16_helper(<8 x i16> %2)
786 %4 = fadd fp128 %3, %3
787 store fp128 %4, fp128* %q
789 ; CHECK: stm sp, {r0, r1, r2, r3}
792 ; CHECK-LABEL: test_f128_v16i8:
793 declare fp128 @test_f128_v16i8_helper(<16 x i8> %p)
794 define void @test_f128_v16i8(<16 x i8>* %p, fp128* %q) {
798 %1 = load <16 x i8>, <16 x i8>* %p
799 %2 = add <16 x i8> %1, %1
800 %3 = call fp128 @test_f128_v16i8_helper(<16 x i8> %2)
801 %4 = fadd fp128 %3, %3
802 store fp128 %4, fp128* %q
804 ; CHECK: stm sp, {r0, r1, r2, r3}
807 ; CHECK-LABEL: test_v2f64_f128:
808 declare <2 x double> @test_v2f64_f128_helper(fp128 %p)
809 define void @test_v2f64_f128(fp128* %p, <2 x double>* %q) {
810 %1 = load fp128, fp128* %p
811 %2 = fadd fp128 %1, %1
812 %3 = call <2 x double> @test_v2f64_f128_helper(fp128 %2)
813 %4 = fadd <2 x double> %3, %3
814 store <2 x double> %4, <2 x double>* %q
816 ; SOFT: vmov {{d[0-9]+}}, r3, r2
817 ; SOFT: vmov {{d[0-9]+}}, r1, r0
821 ; CHECK-LABEL: test_v2f64_v2i64:
822 declare <2 x double> @test_v2f64_v2i64_helper(<2 x i64> %p)
823 define void @test_v2f64_v2i64(<2 x i64>* %p, <2 x double>* %q) {
827 %1 = load <2 x i64>, <2 x i64>* %p
828 %2 = add <2 x i64> %1, %1
829 %3 = call <2 x double> @test_v2f64_v2i64_helper(<2 x i64> %2)
830 %4 = fadd <2 x double> %3, %3
831 store <2 x double> %4, <2 x double>* %q
833 ; SOFT: vmov {{d[0-9]+}}, r3, r2
834 ; SOFT: vmov {{d[0-9]+}}, r1, r0
837 ; CHECK-LABEL: test_v2f64_v4f32:
838 declare <2 x double> @test_v2f64_v4f32_helper(<4 x float> %p)
839 define void @test_v2f64_v4f32(<4 x float>* %p, <2 x double>* %q) {
843 %1 = load <4 x float>, <4 x float>* %p
844 %2 = fadd <4 x float> %1, %1
845 %3 = call <2 x double> @test_v2f64_v4f32_helper(<4 x float> %2)
846 %4 = fadd <2 x double> %3, %3
847 store <2 x double> %4, <2 x double>* %q
849 ; SOFT: vmov {{d[0-9]+}}, r3, r2
850 ; SOFT: vmov {{d[0-9]+}}, r1, r0
853 ; CHECK-LABEL: test_v2f64_v4i32:
854 declare <2 x double> @test_v2f64_v4i32_helper(<4 x i32> %p)
855 define void @test_v2f64_v4i32(<4 x i32>* %p, <2 x double>* %q) {
859 %1 = load <4 x i32>, <4 x i32>* %p
860 %2 = add <4 x i32> %1, %1
861 %3 = call <2 x double> @test_v2f64_v4i32_helper(<4 x i32> %2)
862 %4 = fadd <2 x double> %3, %3
863 store <2 x double> %4, <2 x double>* %q
865 ; SOFT: vmov {{d[0-9]+}}, r3, r2
866 ; SOFT: vmov {{d[0-9]+}}, r1, r0
869 ; CHECK-LABEL: test_v2f64_v8i16:
870 declare <2 x double> @test_v2f64_v8i16_helper(<8 x i16> %p)
871 define void @test_v2f64_v8i16(<8 x i16>* %p, <2 x double>* %q) {
875 %1 = load <8 x i16>, <8 x i16>* %p
876 %2 = add <8 x i16> %1, %1
877 %3 = call <2 x double> @test_v2f64_v8i16_helper(<8 x i16> %2)
878 %4 = fadd <2 x double> %3, %3
879 store <2 x double> %4, <2 x double>* %q
881 ; SOFT: vmov {{d[0-9]+}}, r3, r2
882 ; SOFT: vmov {{d[0-9]+}}, r1, r0
885 ; CHECK-LABEL: test_v2f64_v16i8:
886 declare <2 x double> @test_v2f64_v16i8_helper(<16 x i8> %p)
887 define void @test_v2f64_v16i8(<16 x i8>* %p, <2 x double>* %q) {
891 %1 = load <16 x i8>, <16 x i8>* %p
892 %2 = add <16 x i8> %1, %1
893 %3 = call <2 x double> @test_v2f64_v16i8_helper(<16 x i8> %2)
894 %4 = fadd <2 x double> %3, %3
895 store <2 x double> %4, <2 x double>* %q
897 ; SOFT: vmov {{d[0-9]+}}, r3, r2
898 ; SOFT: vmov {{d[0-9]+}}, r1, r0
901 ; CHECK-LABEL: test_v2i64_f128:
902 declare <2 x i64> @test_v2i64_f128_helper(fp128 %p)
903 define void @test_v2i64_f128(fp128* %p, <2 x i64>* %q) {
904 %1 = load fp128, fp128* %p
905 %2 = fadd fp128 %1, %1
906 %3 = call <2 x i64> @test_v2i64_f128_helper(fp128 %2)
907 %4 = add <2 x i64> %3, %3
908 store <2 x i64> %4, <2 x i64>* %q
910 ; SOFT: vmov {{d[0-9]+}}, r3, r2
911 ; SOFT: vmov {{d[0-9]+}}, r1, r0
914 ; CHECK-LABEL: test_v2i64_v2f64:
915 declare <2 x i64> @test_v2i64_v2f64_helper(<2 x double> %p)
916 define void @test_v2i64_v2f64(<2 x double>* %p, <2 x i64>* %q) {
917 ; SOFT: vmov r1, r0, [[REG1]]
918 ; SOFT: vmov r3, r2, [[REG2]]
921 %1 = load <2 x double>, <2 x double>* %p
922 %2 = fadd <2 x double> %1, %1
923 %3 = call <2 x i64> @test_v2i64_v2f64_helper(<2 x double> %2)
924 %4 = add <2 x i64> %3, %3
925 store <2 x i64> %4, <2 x i64>* %q
927 ; SOFT: vmov {{d[0-9]+}}, r3, r2
928 ; SOFT: vmov {{d[0-9]+}}, r1, r0
931 ; CHECK-LABEL: test_v2i64_v4f32:
932 declare <2 x i64> @test_v2i64_v4f32_helper(<4 x float> %p)
933 define void @test_v2i64_v4f32(<4 x float>* %p, <2 x i64>* %q) {
937 %1 = load <4 x float>, <4 x float>* %p
938 %2 = fadd <4 x float> %1, %1
939 %3 = call <2 x i64> @test_v2i64_v4f32_helper(<4 x float> %2)
940 %4 = add <2 x i64> %3, %3
941 store <2 x i64> %4, <2 x i64>* %q
943 ; SOFT: vmov {{d[0-9]+}}, r3, r2
944 ; SOFT: vmov {{d[0-9]+}}, r1, r0
947 ; CHECK-LABEL: test_v2i64_v4i32:
948 declare <2 x i64> @test_v2i64_v4i32_helper(<4 x i32> %p)
949 define void @test_v2i64_v4i32(<4 x i32>* %p, <2 x i64>* %q) {
953 %1 = load <4 x i32>, <4 x i32>* %p
954 %2 = add <4 x i32> %1, %1
955 %3 = call <2 x i64> @test_v2i64_v4i32_helper(<4 x i32> %2)
956 %4 = add <2 x i64> %3, %3
957 store <2 x i64> %4, <2 x i64>* %q
959 ; SOFT: vmov {{d[0-9]+}}, r3, r2
960 ; SOFT: vmov {{d[0-9]+}}, r1, r0
963 ; CHECK-LABEL: test_v2i64_v8i16:
964 declare <2 x i64> @test_v2i64_v8i16_helper(<8 x i16> %p)
965 define void @test_v2i64_v8i16(<8 x i16>* %p, <2 x i64>* %q) {
969 %1 = load <8 x i16>, <8 x i16>* %p
970 %2 = add <8 x i16> %1, %1
971 %3 = call <2 x i64> @test_v2i64_v8i16_helper(<8 x i16> %2)
972 %4 = add <2 x i64> %3, %3
973 store <2 x i64> %4, <2 x i64>* %q
975 ; SOFT: vmov {{d[0-9]+}}, r3, r2
976 ; SOFT: vmov {{d[0-9]+}}, r1, r0
979 ; CHECK-LABEL: test_v2i64_v16i8:
980 declare <2 x i64> @test_v2i64_v16i8_helper(<16 x i8> %p)
981 define void @test_v2i64_v16i8(<16 x i8>* %p, <2 x i64>* %q) {
985 %1 = load <16 x i8>, <16 x i8>* %p
986 %2 = add <16 x i8> %1, %1
987 %3 = call <2 x i64> @test_v2i64_v16i8_helper(<16 x i8> %2)
988 %4 = add <2 x i64> %3, %3
989 store <2 x i64> %4, <2 x i64>* %q
991 ; SOFT: vmov {{d[0-9]+}}, r3, r2
992 ; SOFT: vmov {{d[0-9]+}}, r1, r0
995 ; CHECK-LABEL: test_v4f32_f128:
996 declare <4 x float> @test_v4f32_f128_helper(fp128 %p)
997 define void @test_v4f32_f128(fp128* %p, <4 x float>* %q) {
998 %1 = load fp128, fp128* %p
999 %2 = fadd fp128 %1, %1
1000 %3 = call <4 x float> @test_v4f32_f128_helper(fp128 %2)
1001 %4 = fadd <4 x float> %3, %3
1002 store <4 x float> %4, <4 x float>* %q
1004 ; SOFT: vmov {{d[0-9]+}}, r3, r2
1005 ; SOFT: vmov {{d[0-9]+}}, r1, r0
1008 ; CHECK-LABEL: test_v4f32_v2f64:
1009 declare <4 x float> @test_v4f32_v2f64_helper(<2 x double> %p)
1010 define void @test_v4f32_v2f64(<2 x double>* %p, <4 x float>* %q) {
1015 %1 = load <2 x double>, <2 x double>* %p
1016 %2 = fadd <2 x double> %1, %1
1017 %3 = call <4 x float> @test_v4f32_v2f64_helper(<2 x double> %2)
1018 %4 = fadd <4 x float> %3, %3
1019 store <4 x float> %4, <4 x float>* %q
1021 ; SOFT: vmov {{d[0-9]+}}, r3, r2
1022 ; SOFT: vmov {{d[0-9]+}}, r1, r0
1025 ; CHECK-LABEL: test_v4f32_v2i64:
1026 declare <4 x float> @test_v4f32_v2i64_helper(<2 x i64> %p)
1027 define void @test_v4f32_v2i64(<2 x i64>* %p, <4 x float>* %q) {
1031 %1 = load <2 x i64>, <2 x i64>* %p
1032 %2 = add <2 x i64> %1, %1
1033 %3 = call <4 x float> @test_v4f32_v2i64_helper(<2 x i64> %2)
1034 %4 = fadd <4 x float> %3, %3
1035 store <4 x float> %4, <4 x float>* %q
1037 ; SOFT: vmov {{d[0-9]+}}, r3, r2
1038 ; SOFT: vmov {{d[0-9]+}}, r1, r0
1041 ; CHECK-LABEL: test_v4f32_v4i32:
1042 declare <4 x float> @test_v4f32_v4i32_helper(<4 x i32> %p)
1043 define void @test_v4f32_v4i32(<4 x i32>* %p, <4 x float>* %q) {
1046 ; HARD: vrev64.32 q0
1047 %1 = load <4 x i32>, <4 x i32>* %p
1048 %2 = add <4 x i32> %1, %1
1049 %3 = call <4 x float> @test_v4f32_v4i32_helper(<4 x i32> %2)
1050 %4 = fadd <4 x float> %3, %3
1051 store <4 x float> %4, <4 x float>* %q
1053 ; SOFT: vmov {{d[0-9]+}}, r3, r2
1054 ; SOFT: vmov {{d[0-9]+}}, r1, r0
1057 ; CHECK-LABEL: test_v4f32_v8i16:
1058 declare <4 x float> @test_v4f32_v8i16_helper(<8 x i16> %p)
1059 define void @test_v4f32_v8i16(<8 x i16>* %p, <4 x float>* %q) {
1062 ; HARD: vrev64.16 q0
1063 %1 = load <8 x i16>, <8 x i16>* %p
1064 %2 = add <8 x i16> %1, %1
1065 %3 = call <4 x float> @test_v4f32_v8i16_helper(<8 x i16> %2)
1066 %4 = fadd <4 x float> %3, %3
1067 store <4 x float> %4, <4 x float>* %q
1069 ; SOFT: vmov {{d[0-9]+}}, r3, r2
1070 ; SOFT: vmov {{d[0-9]+}}, r1, r0
1073 ; CHECK-LABEL: test_v4f32_v16i8:
1074 declare <4 x float> @test_v4f32_v16i8_helper(<16 x i8> %p)
1075 define void @test_v4f32_v16i8(<16 x i8>* %p, <4 x float>* %q) {
1079 %1 = load <16 x i8>, <16 x i8>* %p
1080 %2 = add <16 x i8> %1, %1
1081 %3 = call <4 x float> @test_v4f32_v16i8_helper(<16 x i8> %2)
1082 %4 = fadd <4 x float> %3, %3
1083 store <4 x float> %4, <4 x float>* %q
1085 ; SOFT: vmov {{d[0-9]+}}, r3, r2
1086 ; SOFT: vmov {{d[0-9]+}}, r1, r0
1089 ; CHECK-LABEL: test_v4i32_f128:
1090 declare <4 x i32> @test_v4i32_f128_helper(fp128 %p)
1091 define void @test_v4i32_f128(fp128* %p, <4 x i32>* %q) {
1092 %1 = load fp128, fp128* %p
1093 %2 = fadd fp128 %1, %1
1094 %3 = call <4 x i32> @test_v4i32_f128_helper(fp128 %2)
1095 %4 = add <4 x i32> %3, %3
1096 store <4 x i32> %4, <4 x i32>* %q
1098 ; SOFT: vmov {{d[0-9]+}}, r3, r2
1099 ; SOFT: vmov {{d[0-9]+}}, r1, r0
1102 ; CHECK-LABEL: test_v4i32_v2f64:
1103 declare <4 x i32> @test_v4i32_v2f64_helper(<2 x double> %p)
1104 define void @test_v4i32_v2f64(<2 x double>* %p, <4 x i32>* %q) {
1109 %1 = load <2 x double>, <2 x double>* %p
1110 %2 = fadd <2 x double> %1, %1
1111 %3 = call <4 x i32> @test_v4i32_v2f64_helper(<2 x double> %2)
1112 %4 = add <4 x i32> %3, %3
1113 store <4 x i32> %4, <4 x i32>* %q
1115 ; SOFT: vmov {{d[0-9]+}}, r3, r2
1116 ; SOFT: vmov {{d[0-9]+}}, r1, r0
1119 ; CHECK-LABEL: test_v4i32_v2i64:
1120 declare <4 x i32> @test_v4i32_v2i64_helper(<2 x i64> %p)
1121 define void @test_v4i32_v2i64(<2 x i64>* %p, <4 x i32>* %q) {
1125 %1 = load <2 x i64>, <2 x i64>* %p
1126 %2 = add <2 x i64> %1, %1
1127 %3 = call <4 x i32> @test_v4i32_v2i64_helper(<2 x i64> %2)
1128 %4 = add <4 x i32> %3, %3
1129 store <4 x i32> %4, <4 x i32>* %q
1131 ; SOFT: vmov {{d[0-9]+}}, r3, r2
1132 ; SOFT: vmov {{d[0-9]+}}, r1, r0
1135 ; CHECK-LABEL: test_v4i32_v4f32:
1136 declare <4 x i32> @test_v4i32_v4f32_helper(<4 x float> %p)
1137 define void @test_v4i32_v4f32(<4 x float>* %p, <4 x i32>* %q) {
1140 ; HARD: vrev64.32 q0
1141 %1 = load <4 x float>, <4 x float>* %p
1142 %2 = fadd <4 x float> %1, %1
1143 %3 = call <4 x i32> @test_v4i32_v4f32_helper(<4 x float> %2)
1144 %4 = add <4 x i32> %3, %3
1145 store <4 x i32> %4, <4 x i32>* %q
1147 ; SOFT: vmov {{d[0-9]+}}, r3, r2
1148 ; SOFT: vmov {{d[0-9]+}}, r1, r0
1151 ; CHECK-LABEL: test_v4i32_v8i16:
1152 declare <4 x i32> @test_v4i32_v8i16_helper(<8 x i16> %p)
1153 define void @test_v4i32_v8i16(<8 x i16>* %p, <4 x i32>* %q) {
1156 ; HARD: vrev64.16 q0
1157 %1 = load <8 x i16>, <8 x i16>* %p
1158 %2 = add <8 x i16> %1, %1
1159 %3 = call <4 x i32> @test_v4i32_v8i16_helper(<8 x i16> %2)
1160 %4 = add <4 x i32> %3, %3
1161 store <4 x i32> %4, <4 x i32>* %q
1163 ; SOFT: vmov {{d[0-9]+}}, r3, r2
1164 ; SOFT: vmov {{d[0-9]+}}, r1, r0
1167 ; CHECK-LABEL: test_v4i32_v16i8:
1168 declare <4 x i32> @test_v4i32_v16i8_helper(<16 x i8> %p)
1169 define void @test_v4i32_v16i8(<16 x i8>* %p, <4 x i32>* %q) {
1173 %1 = load <16 x i8>, <16 x i8>* %p
1174 %2 = add <16 x i8> %1, %1
1175 %3 = call <4 x i32> @test_v4i32_v16i8_helper(<16 x i8> %2)
1176 %4 = add <4 x i32> %3, %3
1177 store <4 x i32> %4, <4 x i32>* %q
1179 ; SOFT: vmov {{d[0-9]+}}, r3, r2
1180 ; SOFT: vmov {{d[0-9]+}}, r1, r0
1183 ; CHECK-LABEL: test_v8i16_f128:
1184 declare <8 x i16> @test_v8i16_f128_helper(fp128 %p)
1185 define void @test_v8i16_f128(fp128* %p, <8 x i16>* %q) {
1186 %1 = load fp128, fp128* %p
1187 %2 = fadd fp128 %1, %1
1188 %3 = call <8 x i16> @test_v8i16_f128_helper(fp128 %2)
1189 %4 = add <8 x i16> %3, %3
1190 store <8 x i16> %4, <8 x i16>* %q
1192 ; SOFT: vmov {{d[0-9]+}}, r3, r2
1193 ; SOFT: vmov {{d[0-9]+}}, r1, r0
1196 ; CHECK-LABEL: test_v8i16_v2f64:
1197 declare <8 x i16> @test_v8i16_v2f64_helper(<2 x double> %p)
1198 define void @test_v8i16_v2f64(<2 x double>* %p, <8 x i16>* %q) {
1203 %1 = load <2 x double>, <2 x double>* %p
1204 %2 = fadd <2 x double> %1, %1
1205 %3 = call <8 x i16> @test_v8i16_v2f64_helper(<2 x double> %2)
1206 %4 = add <8 x i16> %3, %3
1207 store <8 x i16> %4, <8 x i16>* %q
1209 ; SOFT: vmov {{d[0-9]+}}, r3, r2
1210 ; SOFT: vmov {{d[0-9]+}}, r1, r0
1213 ; CHECK-LABEL: test_v8i16_v2i64:
1214 declare <8 x i16> @test_v8i16_v2i64_helper(<2 x i64> %p)
1215 define void @test_v8i16_v2i64(<2 x i64>* %p, <8 x i16>* %q) {
1219 %1 = load <2 x i64>, <2 x i64>* %p
1220 %2 = add <2 x i64> %1, %1
1221 %3 = call <8 x i16> @test_v8i16_v2i64_helper(<2 x i64> %2)
1222 %4 = add <8 x i16> %3, %3
1223 store <8 x i16> %4, <8 x i16>* %q
1225 ; SOFT: vmov {{d[0-9]+}}, r3, r2
1226 ; SOFT: vmov {{d[0-9]+}}, r1, r0
1229 ; CHECK-LABEL: test_v8i16_v4f32:
1230 declare <8 x i16> @test_v8i16_v4f32_helper(<4 x float> %p)
1231 define void @test_v8i16_v4f32(<4 x float>* %p, <8 x i16>* %q) {
1234 ; HARD: vrev64.32 q0
1235 %1 = load <4 x float>, <4 x float>* %p
1236 %2 = fadd <4 x float> %1, %1
1237 %3 = call <8 x i16> @test_v8i16_v4f32_helper(<4 x float> %2)
1238 %4 = add <8 x i16> %3, %3
1239 store <8 x i16> %4, <8 x i16>* %q
1241 ; SOFT: vmov {{d[0-9]+}}, r3, r2
1242 ; SOFT: vmov {{d[0-9]+}}, r1, r0
1245 ; CHECK-LABEL: test_v8i16_v4i32:
1246 declare <8 x i16> @test_v8i16_v4i32_helper(<4 x i32> %p)
1247 define void @test_v8i16_v4i32(<4 x i32>* %p, <8 x i16>* %q) {
1250 ; HARD: vrev64.32 q0
1251 %1 = load <4 x i32>, <4 x i32>* %p
1252 %2 = add <4 x i32> %1, %1
1253 %3 = call <8 x i16> @test_v8i16_v4i32_helper(<4 x i32> %2)
1254 %4 = add <8 x i16> %3, %3
1255 store <8 x i16> %4, <8 x i16>* %q
1257 ; SOFT: vmov {{d[0-9]+}}, r3, r2
1258 ; SOFT: vmov {{d[0-9]+}}, r1, r0
1261 ; CHECK-LABEL: test_v8i16_v16i8:
1262 declare <8 x i16> @test_v8i16_v16i8_helper(<16 x i8> %p)
1263 define void @test_v8i16_v16i8(<16 x i8>* %p, <8 x i16>* %q) {
1267 %1 = load <16 x i8>, <16 x i8>* %p
1268 %2 = add <16 x i8> %1, %1
1269 %3 = call <8 x i16> @test_v8i16_v16i8_helper(<16 x i8> %2)
1270 %4 = add <8 x i16> %3, %3
1271 store <8 x i16> %4, <8 x i16>* %q
1273 ; SOFT: vmov {{d[0-9]+}}, r3, r2
1274 ; SOFT: vmov {{d[0-9]+}}, r1, r0
1277 ; CHECK-LABEL: test_v16i8_f128:
1278 declare <16 x i8> @test_v16i8_f128_helper(fp128 %p)
1279 define void @test_v16i8_f128(fp128* %p, <16 x i8>* %q) {
1280 %1 = load fp128, fp128* %p
1281 %2 = fadd fp128 %1, %1
1282 %3 = call <16 x i8> @test_v16i8_f128_helper(fp128 %2)
1283 %4 = add <16 x i8> %3, %3
1284 store <16 x i8> %4, <16 x i8>* %q
1286 ; SOFT: vmov {{d[0-9]+}}, r3, r2
1287 ; SOFT: vmov {{d[0-9]+}}, r1, r0
1290 ; CHECK-LABEL: test_v16i8_v2f64:
1291 declare <16 x i8> @test_v16i8_v2f64_helper(<2 x double> %p)
1292 define void @test_v16i8_v2f64(<2 x double>* %p, <16 x i8>* %q) {
1297 %1 = load <2 x double>, <2 x double>* %p
1298 %2 = fadd <2 x double> %1, %1
1299 %3 = call <16 x i8> @test_v16i8_v2f64_helper(<2 x double> %2)
1300 %4 = add <16 x i8> %3, %3
1301 store <16 x i8> %4, <16 x i8>* %q
1303 ; SOFT: vmov {{d[0-9]+}}, r3, r2
1304 ; SOFT: vmov {{d[0-9]+}}, r1, r0
1307 ; CHECK-LABEL: test_v16i8_v2i64:
1308 declare <16 x i8> @test_v16i8_v2i64_helper(<2 x i64> %p)
1309 define void @test_v16i8_v2i64(<2 x i64>* %p, <16 x i8>* %q) {
1313 %1 = load <2 x i64>, <2 x i64>* %p
1314 %2 = add <2 x i64> %1, %1
1315 %3 = call <16 x i8> @test_v16i8_v2i64_helper(<2 x i64> %2)
1316 %4 = add <16 x i8> %3, %3
1317 store <16 x i8> %4, <16 x i8>* %q
1319 ; SOFT: vmov {{d[0-9]+}}, r3, r2
1320 ; SOFT: vmov {{d[0-9]+}}, r1, r0
1323 ; CHECK-LABEL: test_v16i8_v4f32:
1324 declare <16 x i8> @test_v16i8_v4f32_helper(<4 x float> %p)
1325 define void @test_v16i8_v4f32(<4 x float>* %p, <16 x i8>* %q) {
1328 ; HARD: vrev64.32 q0
1329 %1 = load <4 x float>, <4 x float>* %p
1330 %2 = fadd <4 x float> %1, %1
1331 %3 = call <16 x i8> @test_v16i8_v4f32_helper(<4 x float> %2)
1332 %4 = add <16 x i8> %3, %3
1333 store <16 x i8> %4, <16 x i8>* %q
1335 ; SOFT: vmov {{d[0-9]+}}, r3, r2
1336 ; SOFT: vmov {{d[0-9]+}}, r1, r0
1339 ; CHECK-LABEL: test_v16i8_v4i32:
1340 declare <16 x i8> @test_v16i8_v4i32_helper(<4 x i32> %p)
1341 define void @test_v16i8_v4i32(<4 x i32>* %p, <16 x i8>* %q) {
1344 ; HARD: vrev64.32 q0
1345 %1 = load <4 x i32>, <4 x i32>* %p
1346 %2 = add <4 x i32> %1, %1
1347 %3 = call <16 x i8> @test_v16i8_v4i32_helper(<4 x i32> %2)
1348 %4 = add <16 x i8> %3, %3
1349 store <16 x i8> %4, <16 x i8>* %q
1351 ; SOFT: vmov {{d[0-9]+}}, r3, r2
1352 ; SOFT: vmov {{d[0-9]+}}, r1, r0
1355 ; CHECK-LABEL: test_v16i8_v8i16:
1356 declare <16 x i8> @test_v16i8_v8i16_helper(<8 x i16> %p)
1357 define void @test_v16i8_v8i16(<8 x i16>* %p, <16 x i8>* %q) {
1360 ; HARD: vrev64.16 q0
1361 %1 = load <8 x i16>, <8 x i16>* %p
1362 %2 = add <8 x i16> %1, %1
1363 %3 = call <16 x i8> @test_v16i8_v8i16_helper(<8 x i16> %2)
1364 %4 = add <16 x i8> %3, %3
1365 store <16 x i8> %4, <16 x i8>* %q
1367 ; SOFT: vmov {{d[0-9]+}}, r3, r2
1368 ; SOFT: vmov {{d[0-9]+}}, r1, r0