1; RUN: llc -mtriple aarch64_be < %s -aarch64-enable-ldst-opt=false -o - | FileCheck %s
2; RUN: llc -mtriple aarch64_be < %s -aarch64-enable-ldst-opt=false -fast-isel=true -O0 -o - | FileCheck %s
3
4; Note, we split the functions in to multiple BBs below to isolate the call
5; instruction we want to test, from fast-isel failing to select instructions
6; after it.
7
8; CHECK-LABEL: test_i64_f64:
9declare i64 @test_i64_f64_helper(double %p)
10define void @test_i64_f64(double* %p, i64* %q) {
11; CHECK-NOT: rev
12    %1 = load double, double* %p
13    %2 = fadd double %1, %1
14    %3 = call i64 @test_i64_f64_helper(double %2)
15    br label %return_bb
16return_bb:
17    %4 = add i64 %3, %3
18    store i64 %4, i64* %q
19    ret void
20}
21
22; CHECK-LABEL: test_i64_v1i64:
23declare i64 @test_i64_v1i64_helper(<1 x i64> %p)
24define void @test_i64_v1i64(<1 x i64>* %p, i64* %q) {
25; CHECK-NOT: rev
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)
29    br label %return_bb
30return_bb:
31    %4 = add i64 %3, %3
32    store i64 %4, i64* %q
33    ret void
34}
35
36; CHECK-LABEL: test_i64_v2f32:
37declare i64 @test_i64_v2f32_helper(<2 x float> %p)
38define void @test_i64_v2f32(<2 x float>* %p, i64* %q) {
39; CHECK: rev64 v{{[0-9]+}}.2s
40    %1 = load <2 x float>, <2 x float>* %p
41    %2 = fadd <2 x float> %1, %1
42    %3 = call i64 @test_i64_v2f32_helper(<2 x float> %2)
43    br label %return_bb
44return_bb:
45    %4 = add i64 %3, %3
46    store i64 %4, i64* %q
47    ret void
48}
49
50; CHECK-LABEL: test_i64_v2i32:
51declare i64 @test_i64_v2i32_helper(<2 x i32> %p)
52define void @test_i64_v2i32(<2 x i32>* %p, i64* %q) {
53; CHECK: rev64 v{{[0-9]+}}.2s
54    %1 = load <2 x i32>, <2 x i32>* %p
55    %2 = add <2 x i32> %1, %1
56    %3 = call i64 @test_i64_v2i32_helper(<2 x i32> %2)
57    br label %return_bb
58return_bb:
59    %4 = add i64 %3, %3
60    store i64 %4, i64* %q
61    ret void
62}
63
64; CHECK-LABEL: test_i64_v4i16:
65declare i64 @test_i64_v4i16_helper(<4 x i16> %p)
66define void @test_i64_v4i16(<4 x i16>* %p, i64* %q) {
67; CHECK: rev64 v{{[0-9]+}}.4h
68    %1 = load <4 x i16>, <4 x i16>* %p
69    %2 = add <4 x i16> %1, %1
70    %3 = call i64 @test_i64_v4i16_helper(<4 x i16> %2)
71    br label %return_bb
72return_bb:
73    %4 = add i64 %3, %3
74    store i64 %4, i64* %q
75    ret void
76}
77
78; CHECK-LABEL: test_i64_v8i8:
79declare i64 @test_i64_v8i8_helper(<8 x i8> %p)
80define void @test_i64_v8i8(<8 x i8>* %p, i64* %q) {
81; CHECK: rev64 v{{[0-9]+}}.8b
82    %1 = load <8 x i8>, <8 x i8>* %p
83    %2 = add <8 x i8> %1, %1
84    %3 = call i64 @test_i64_v8i8_helper(<8 x i8> %2)
85    br label %return_bb
86return_bb:
87    %4 = add i64 %3, %3
88    store i64 %4, i64* %q
89    ret void
90}
91
92; CHECK-LABEL: test_f64_i64:
93declare double @test_f64_i64_helper(i64 %p)
94define void @test_f64_i64(i64* %p, double* %q) {
95; CHECK-NOT: rev
96    %1 = load i64, i64* %p
97    %2 = add i64 %1, %1
98    %3 = call double @test_f64_i64_helper(i64 %2)
99    br label %return_bb
100return_bb:
101    %4 = fadd double %3, %3
102    store double %4, double* %q
103    ret void
104}
105
106; CHECK-LABEL: test_f64_v1i64:
107declare double @test_f64_v1i64_helper(<1 x i64> %p)
108define void @test_f64_v1i64(<1 x i64>* %p, double* %q) {
109; CHECK-NOT: rev
110    %1 = load <1 x i64>, <1 x i64>* %p
111    %2 = add <1 x i64> %1, %1
112    %3 = call double @test_f64_v1i64_helper(<1 x i64> %2)
113    br label %return_bb
114return_bb:
115    %4 = fadd double %3, %3
116    store double %4, double* %q
117    ret void
118}
119
120; CHECK-LABEL: test_f64_v2f32:
121declare double @test_f64_v2f32_helper(<2 x float> %p)
122define void @test_f64_v2f32(<2 x float>* %p, double* %q) {
123; CHECK: rev64 v{{[0-9]+}}.2s
124    %1 = load <2 x float>, <2 x float>* %p
125    %2 = fadd <2 x float> %1, %1
126    %3 = call double @test_f64_v2f32_helper(<2 x float> %2)
127    br label %return_bb
128return_bb:
129    %4 = fadd double %3, %3
130    store double %4, double* %q
131    ret void
132}
133
134; CHECK-LABEL: test_f64_v2i32:
135declare double @test_f64_v2i32_helper(<2 x i32> %p)
136define void @test_f64_v2i32(<2 x i32>* %p, double* %q) {
137; CHECK: rev64 v{{[0-9]+}}.2s
138    %1 = load <2 x i32>, <2 x i32>* %p
139    %2 = add <2 x i32> %1, %1
140    %3 = call double @test_f64_v2i32_helper(<2 x i32> %2)
141    br label %return_bb
142return_bb:
143    %4 = fadd double %3, %3
144    store double %4, double* %q
145    ret void
146}
147
148; CHECK-LABEL: test_f64_v4i16:
149declare double @test_f64_v4i16_helper(<4 x i16> %p)
150define void @test_f64_v4i16(<4 x i16>* %p, double* %q) {
151; CHECK: rev64 v{{[0-9]+}}.4h
152    %1 = load <4 x i16>, <4 x i16>* %p
153    %2 = add <4 x i16> %1, %1
154    %3 = call double @test_f64_v4i16_helper(<4 x i16> %2)
155    br label %return_bb
156return_bb:
157    %4 = fadd double %3, %3
158    store double %4, double* %q
159    ret void
160}
161
162; CHECK-LABEL: test_f64_v8i8:
163declare double @test_f64_v8i8_helper(<8 x i8> %p)
164define void @test_f64_v8i8(<8 x i8>* %p, double* %q) {
165; CHECK: rev64 v{{[0-9]+}}.8b
166    %1 = load <8 x i8>, <8 x i8>* %p
167    %2 = add <8 x i8> %1, %1
168    %3 = call double @test_f64_v8i8_helper(<8 x i8> %2)
169    br label %return_bb
170return_bb:
171    %4 = fadd double %3, %3
172    store double %4, double* %q
173    ret void
174}
175
176; CHECK-LABEL: test_v1i64_i64:
177declare <1 x i64> @test_v1i64_i64_helper(i64 %p)
178define void @test_v1i64_i64(i64* %p, <1 x i64>* %q) {
179; CHECK-NOT: rev
180    %1 = load i64, i64* %p
181    %2 = add i64 %1, %1
182    %3 = call <1 x i64> @test_v1i64_i64_helper(i64 %2)
183    br label %return_bb
184return_bb:
185    %4 = add <1 x i64> %3, %3
186    store <1 x i64> %4, <1 x i64>* %q
187    ret void
188}
189
190; CHECK-LABEL: test_v1i64_f64:
191declare <1 x i64> @test_v1i64_f64_helper(double %p)
192define void @test_v1i64_f64(double* %p, <1 x i64>* %q) {
193; CHECK-NOT: rev
194    %1 = load double, double* %p
195    %2 = fadd double %1, %1
196    %3 = call <1 x i64> @test_v1i64_f64_helper(double %2)
197    br label %return_bb
198return_bb:
199    %4 = add <1 x i64> %3, %3
200    store <1 x i64> %4, <1 x i64>* %q
201    ret void
202}
203
204; CHECK-LABEL: test_v1i64_v2f32:
205declare <1 x i64> @test_v1i64_v2f32_helper(<2 x float> %p)
206define void @test_v1i64_v2f32(<2 x float>* %p, <1 x i64>* %q) {
207; CHECK: rev64 v{{[0-9]+}}.2s
208    %1 = load <2 x float>, <2 x float>* %p
209    %2 = fadd <2 x float> %1, %1
210    %3 = call <1 x i64> @test_v1i64_v2f32_helper(<2 x float> %2)
211    br label %return_bb
212return_bb:
213    %4 = add <1 x i64> %3, %3
214    store <1 x i64> %4, <1 x i64>* %q
215    ret void
216}
217
218; CHECK-LABEL: test_v1i64_v2i32:
219declare <1 x i64> @test_v1i64_v2i32_helper(<2 x i32> %p)
220define void @test_v1i64_v2i32(<2 x i32>* %p, <1 x i64>* %q) {
221; CHECK: rev64 v{{[0-9]+}}.2s
222    %1 = load <2 x i32>, <2 x i32>* %p
223    %2 = add <2 x i32> %1, %1
224    %3 = call <1 x i64> @test_v1i64_v2i32_helper(<2 x i32> %2)
225    br label %return_bb
226return_bb:
227    %4 = add <1 x i64> %3, %3
228    store <1 x i64> %4, <1 x i64>* %q
229    ret void
230}
231
232; CHECK-LABEL: test_v1i64_v4i16:
233declare <1 x i64> @test_v1i64_v4i16_helper(<4 x i16> %p)
234define void @test_v1i64_v4i16(<4 x i16>* %p, <1 x i64>* %q) {
235; CHECK: rev64 v{{[0-9]+}}.4h
236    %1 = load <4 x i16>, <4 x i16>* %p
237    %2 = add <4 x i16> %1, %1
238    %3 = call <1 x i64> @test_v1i64_v4i16_helper(<4 x i16> %2)
239    br label %return_bb
240return_bb:
241    %4 = add <1 x i64> %3, %3
242    store <1 x i64> %4, <1 x i64>* %q
243    ret void
244}
245
246; CHECK-LABEL: test_v1i64_v8i8:
247declare <1 x i64> @test_v1i64_v8i8_helper(<8 x i8> %p)
248define void @test_v1i64_v8i8(<8 x i8>* %p, <1 x i64>* %q) {
249; CHECK: rev64 v{{[0-9]+}}.8b
250    %1 = load <8 x i8>, <8 x i8>* %p
251    %2 = add <8 x i8> %1, %1
252    %3 = call <1 x i64> @test_v1i64_v8i8_helper(<8 x i8> %2)
253    br label %return_bb
254return_bb:
255    %4 = add <1 x i64> %3, %3
256    store <1 x i64> %4, <1 x i64>* %q
257    ret void
258}
259
260; CHECK-LABEL: test_v2f32_i64:
261declare <2 x float> @test_v2f32_i64_helper(i64 %p)
262define void @test_v2f32_i64(i64* %p, <2 x float>* %q) {
263; CHECK: rev64 v{{[0-9]+}}.2s
264    %1 = load i64, i64* %p
265    %2 = add i64 %1, %1
266    %3 = call <2 x float> @test_v2f32_i64_helper(i64 %2)
267    br label %return_bb
268return_bb:
269    %4 = fadd <2 x float> %3, %3
270    store <2 x float> %4, <2 x float>* %q
271    ret void
272}
273
274; CHECK-LABEL: test_v2f32_f64:
275declare <2 x float> @test_v2f32_f64_helper(double %p)
276define void @test_v2f32_f64(double* %p, <2 x float>* %q) {
277; CHECK: rev64 v{{[0-9]+}}.2s
278    %1 = load double, double* %p
279    %2 = fadd double %1, %1
280    %3 = call <2 x float> @test_v2f32_f64_helper(double %2)
281    br label %return_bb
282return_bb:
283    %4 = fadd <2 x float> %3, %3
284    store <2 x float> %4, <2 x float>* %q
285    ret void
286}
287
288; CHECK-LABEL: test_v2f32_v1i64:
289declare <2 x float> @test_v2f32_v1i64_helper(<1 x i64> %p)
290define void @test_v2f32_v1i64(<1 x i64>* %p, <2 x float>* %q) {
291; CHECK: rev64 v{{[0-9]+}}.2s
292    %1 = load <1 x i64>, <1 x i64>* %p
293    %2 = add <1 x i64> %1, %1
294    %3 = call <2 x float> @test_v2f32_v1i64_helper(<1 x i64> %2)
295    br label %return_bb
296return_bb:
297    %4 = fadd <2 x float> %3, %3
298    store <2 x float> %4, <2 x float>* %q
299    ret void
300}
301
302; CHECK-LABEL: test_v2f32_v2i32:
303declare <2 x float> @test_v2f32_v2i32_helper(<2 x i32> %p)
304define void @test_v2f32_v2i32(<2 x i32>* %p, <2 x float>* %q) {
305; CHECK: rev64 v{{[0-9]+}}.2s
306; CHECK: rev64 v{{[0-9]+}}.2s
307    %1 = load <2 x i32>, <2 x i32>* %p
308    %2 = add <2 x i32> %1, %1
309    %3 = call <2 x float> @test_v2f32_v2i32_helper(<2 x i32> %2)
310    br label %return_bb
311return_bb:
312    %4 = fadd <2 x float> %3, %3
313    store <2 x float> %4, <2 x float>* %q
314    ret void
315}
316
317; CHECK-LABEL: test_v2f32_v4i16:
318declare <2 x float> @test_v2f32_v4i16_helper(<4 x i16> %p)
319define void @test_v2f32_v4i16(<4 x i16>* %p, <2 x float>* %q) {
320; CHECK: rev64 v{{[0-9]+}}.4h
321; CHECK: rev64 v{{[0-9]+}}.2s
322    %1 = load <4 x i16>, <4 x i16>* %p
323    %2 = add <4 x i16> %1, %1
324    %3 = call <2 x float> @test_v2f32_v4i16_helper(<4 x i16> %2)
325    br label %return_bb
326return_bb:
327    %4 = fadd <2 x float> %3, %3
328    store <2 x float> %4, <2 x float>* %q
329    ret void
330}
331
332; CHECK-LABEL: test_v2f32_v8i8:
333declare <2 x float> @test_v2f32_v8i8_helper(<8 x i8> %p)
334define void @test_v2f32_v8i8(<8 x i8>* %p, <2 x float>* %q) {
335; CHECK: rev64 v{{[0-9]+}}.8b
336; CHECK: rev64 v{{[0-9]+}}.2s
337    %1 = load <8 x i8>, <8 x i8>* %p
338    %2 = add <8 x i8> %1, %1
339    %3 = call <2 x float> @test_v2f32_v8i8_helper(<8 x i8> %2)
340    br label %return_bb
341return_bb:
342    %4 = fadd <2 x float> %3, %3
343    store <2 x float> %4, <2 x float>* %q
344    ret void
345}
346
347; CHECK-LABEL: test_v2i32_i64:
348declare <2 x i32> @test_v2i32_i64_helper(i64 %p)
349define void @test_v2i32_i64(i64* %p, <2 x i32>* %q) {
350; CHECK: rev64 v{{[0-9]+}}.2s
351    %1 = load i64, i64* %p
352    %2 = add i64 %1, %1
353    %3 = call <2 x i32> @test_v2i32_i64_helper(i64 %2)
354    br label %return_bb
355return_bb:
356    %4 = add <2 x i32> %3, %3
357    store <2 x i32> %4, <2 x i32>* %q
358    ret void
359}
360
361; CHECK-LABEL: test_v2i32_f64:
362declare <2 x i32> @test_v2i32_f64_helper(double %p)
363define void @test_v2i32_f64(double* %p, <2 x i32>* %q) {
364; CHECK: rev64 v{{[0-9]+}}.2s
365    %1 = load double, double* %p
366    %2 = fadd double %1, %1
367    %3 = call <2 x i32> @test_v2i32_f64_helper(double %2)
368    br label %return_bb
369return_bb:
370    %4 = add <2 x i32> %3, %3
371    store <2 x i32> %4, <2 x i32>* %q
372    ret void
373}
374
375; CHECK-LABEL: test_v2i32_v1i64:
376declare <2 x i32> @test_v2i32_v1i64_helper(<1 x i64> %p)
377define void @test_v2i32_v1i64(<1 x i64>* %p, <2 x i32>* %q) {
378; CHECK: rev64 v{{[0-9]+}}.2s
379    %1 = load <1 x i64>, <1 x i64>* %p
380    %2 = add <1 x i64> %1, %1
381    %3 = call <2 x i32> @test_v2i32_v1i64_helper(<1 x i64> %2)
382    br label %return_bb
383return_bb:
384    %4 = add <2 x i32> %3, %3
385    store <2 x i32> %4, <2 x i32>* %q
386    ret void
387}
388
389; CHECK-LABEL: test_v2i32_v2f32:
390declare <2 x i32> @test_v2i32_v2f32_helper(<2 x float> %p)
391define void @test_v2i32_v2f32(<2 x float>* %p, <2 x i32>* %q) {
392; CHECK: rev64 v{{[0-9]+}}.2s
393; CHECK: rev64 v{{[0-9]+}}.2s
394    %1 = load <2 x float>, <2 x float>* %p
395    %2 = fadd <2 x float> %1, %1
396    %3 = call <2 x i32> @test_v2i32_v2f32_helper(<2 x float> %2)
397    br label %return_bb
398return_bb:
399    %4 = add <2 x i32> %3, %3
400    store <2 x i32> %4, <2 x i32>* %q
401    ret void
402}
403
404; CHECK-LABEL: test_v2i32_v4i16:
405declare <2 x i32> @test_v2i32_v4i16_helper(<4 x i16> %p)
406define void @test_v2i32_v4i16(<4 x i16>* %p, <2 x i32>* %q) {
407; CHECK: rev64 v{{[0-9]+}}.4h
408; CHECK: rev64 v{{[0-9]+}}.2s
409    %1 = load <4 x i16>, <4 x i16>* %p
410    %2 = add <4 x i16> %1, %1
411    %3 = call <2 x i32> @test_v2i32_v4i16_helper(<4 x i16> %2)
412    br label %return_bb
413return_bb:
414    %4 = add <2 x i32> %3, %3
415    store <2 x i32> %4, <2 x i32>* %q
416    ret void
417}
418
419; CHECK-LABEL: test_v2i32_v8i8:
420declare <2 x i32> @test_v2i32_v8i8_helper(<8 x i8> %p)
421define void @test_v2i32_v8i8(<8 x i8>* %p, <2 x i32>* %q) {
422; CHECK: rev64 v{{[0-9]+}}.8b
423; CHECK: rev64 v{{[0-9]+}}.2s
424    %1 = load <8 x i8>, <8 x i8>* %p
425    %2 = add <8 x i8> %1, %1
426    %3 = call <2 x i32> @test_v2i32_v8i8_helper(<8 x i8> %2)
427    br label %return_bb
428return_bb:
429    %4 = add <2 x i32> %3, %3
430    store <2 x i32> %4, <2 x i32>* %q
431    ret void
432}
433
434; CHECK-LABEL: test_v4i16_i64:
435declare <4 x i16> @test_v4i16_i64_helper(i64 %p)
436define void @test_v4i16_i64(i64* %p, <4 x i16>* %q) {
437; CHECK: rev64 v{{[0-9]+}}.4h
438    %1 = load i64, i64* %p
439    %2 = add i64 %1, %1
440    %3 = call <4 x i16> @test_v4i16_i64_helper(i64 %2)
441    br label %return_bb
442return_bb:
443    %4 = add <4 x i16> %3, %3
444    store <4 x i16> %4, <4 x i16>* %q
445    ret void
446}
447
448; CHECK-LABEL: test_v4i16_f64:
449declare <4 x i16> @test_v4i16_f64_helper(double %p)
450define void @test_v4i16_f64(double* %p, <4 x i16>* %q) {
451; CHECK: rev64 v{{[0-9]+}}.4h
452    %1 = load double, double* %p
453    %2 = fadd double %1, %1
454    %3 = call <4 x i16> @test_v4i16_f64_helper(double %2)
455    br label %return_bb
456return_bb:
457    %4 = add <4 x i16> %3, %3
458    store <4 x i16> %4, <4 x i16>* %q
459    ret void
460}
461
462; CHECK-LABEL: test_v4i16_v1i64:
463declare <4 x i16> @test_v4i16_v1i64_helper(<1 x i64> %p)
464define void @test_v4i16_v1i64(<1 x i64>* %p, <4 x i16>* %q) {
465; CHECK: rev64 v{{[0-9]+}}.4h
466    %1 = load <1 x i64>, <1 x i64>* %p
467    %2 = add <1 x i64> %1, %1
468    %3 = call <4 x i16> @test_v4i16_v1i64_helper(<1 x i64> %2)
469    br label %return_bb
470return_bb:
471    %4 = add <4 x i16> %3, %3
472    store <4 x i16> %4, <4 x i16>* %q
473    ret void
474}
475
476; CHECK-LABEL: test_v4i16_v2f32:
477declare <4 x i16> @test_v4i16_v2f32_helper(<2 x float> %p)
478define void @test_v4i16_v2f32(<2 x float>* %p, <4 x i16>* %q) {
479; CHECK: rev64 v{{[0-9]+}}.2s
480; CHECK: rev64 v{{[0-9]+}}.4h
481    %1 = load <2 x float>, <2 x float>* %p
482    %2 = fadd <2 x float> %1, %1
483    %3 = call <4 x i16> @test_v4i16_v2f32_helper(<2 x float> %2)
484    br label %return_bb
485return_bb:
486    %4 = add <4 x i16> %3, %3
487    store <4 x i16> %4, <4 x i16>* %q
488    ret void
489}
490
491; CHECK-LABEL: test_v4i16_v2i32:
492declare <4 x i16> @test_v4i16_v2i32_helper(<2 x i32> %p)
493define void @test_v4i16_v2i32(<2 x i32>* %p, <4 x i16>* %q) {
494; CHECK: rev64 v{{[0-9]+}}.2s
495; CHECK: rev64 v{{[0-9]+}}.4h
496    %1 = load <2 x i32>, <2 x i32>* %p
497    %2 = add <2 x i32> %1, %1
498    %3 = call <4 x i16> @test_v4i16_v2i32_helper(<2 x i32> %2)
499    br label %return_bb
500return_bb:
501    %4 = add <4 x i16> %3, %3
502    store <4 x i16> %4, <4 x i16>* %q
503    ret void
504}
505
506; CHECK-LABEL: test_v4i16_v8i8:
507declare <4 x i16> @test_v4i16_v8i8_helper(<8 x i8> %p)
508define void @test_v4i16_v8i8(<8 x i8>* %p, <4 x i16>* %q) {
509; CHECK: rev64 v{{[0-9]+}}.8b
510; CHECK: rev64 v{{[0-9]+}}.4h
511    %1 = load <8 x i8>, <8 x i8>* %p
512    %2 = add <8 x i8> %1, %1
513    %3 = call <4 x i16> @test_v4i16_v8i8_helper(<8 x i8> %2)
514    br label %return_bb
515return_bb:
516    %4 = add <4 x i16> %3, %3
517    store <4 x i16> %4, <4 x i16>* %q
518    ret void
519}
520
521; CHECK-LABEL: test_v8i8_i64:
522declare <8 x i8> @test_v8i8_i64_helper(i64 %p)
523define void @test_v8i8_i64(i64* %p, <8 x i8>* %q) {
524; CHECK: rev64 v{{[0-9]+}}.8b
525    %1 = load i64, i64* %p
526    %2 = add i64 %1, %1
527    %3 = call <8 x i8> @test_v8i8_i64_helper(i64 %2)
528    br label %return_bb
529return_bb:
530    %4 = add <8 x i8> %3, %3
531    store <8 x i8> %4, <8 x i8>* %q
532    ret void
533}
534
535; CHECK-LABEL: test_v8i8_f64:
536declare <8 x i8> @test_v8i8_f64_helper(double %p)
537define void @test_v8i8_f64(double* %p, <8 x i8>* %q) {
538; CHECK: rev64 v{{[0-9]+}}.8b
539    %1 = load double, double* %p
540    %2 = fadd double %1, %1
541    %3 = call <8 x i8> @test_v8i8_f64_helper(double %2)
542    br label %return_bb
543return_bb:
544    %4 = add <8 x i8> %3, %3
545    store <8 x i8> %4, <8 x i8>* %q
546    ret void
547}
548
549; CHECK-LABEL: test_v8i8_v1i64:
550declare <8 x i8> @test_v8i8_v1i64_helper(<1 x i64> %p)
551define void @test_v8i8_v1i64(<1 x i64>* %p, <8 x i8>* %q) {
552; CHECK: rev64 v{{[0-9]+}}.8b
553    %1 = load <1 x i64>, <1 x i64>* %p
554    %2 = add <1 x i64> %1, %1
555    %3 = call <8 x i8> @test_v8i8_v1i64_helper(<1 x i64> %2)
556    br label %return_bb
557return_bb:
558    %4 = add <8 x i8> %3, %3
559    store <8 x i8> %4, <8 x i8>* %q
560    ret void
561}
562
563; CHECK-LABEL: test_v8i8_v2f32:
564declare <8 x i8> @test_v8i8_v2f32_helper(<2 x float> %p)
565define void @test_v8i8_v2f32(<2 x float>* %p, <8 x i8>* %q) {
566; CHECK: rev64 v{{[0-9]+}}.2s
567; CHECK: rev64 v{{[0-9]+}}.8b
568    %1 = load <2 x float>, <2 x float>* %p
569    %2 = fadd <2 x float> %1, %1
570    %3 = call <8 x i8> @test_v8i8_v2f32_helper(<2 x float> %2)
571    br label %return_bb
572return_bb:
573    %4 = add <8 x i8> %3, %3
574    store <8 x i8> %4, <8 x i8>* %q
575    ret void
576}
577
578; CHECK-LABEL: test_v8i8_v2i32:
579declare <8 x i8> @test_v8i8_v2i32_helper(<2 x i32> %p)
580define void @test_v8i8_v2i32(<2 x i32>* %p, <8 x i8>* %q) {
581; CHECK: rev64 v{{[0-9]+}}.2s
582; CHECK: rev64 v{{[0-9]+}}.8b
583    %1 = load <2 x i32>, <2 x i32>* %p
584    %2 = add <2 x i32> %1, %1
585    %3 = call <8 x i8> @test_v8i8_v2i32_helper(<2 x i32> %2)
586    br label %return_bb
587return_bb:
588    %4 = add <8 x i8> %3, %3
589    store <8 x i8> %4, <8 x i8>* %q
590    ret void
591}
592
593; CHECK-LABEL: test_v8i8_v4i16:
594declare <8 x i8> @test_v8i8_v4i16_helper(<4 x i16> %p)
595define void @test_v8i8_v4i16(<4 x i16>* %p, <8 x i8>* %q) {
596; CHECK: rev64 v{{[0-9]+}}.4h
597; CHECK: rev64 v{{[0-9]+}}.8b
598    %1 = load <4 x i16>, <4 x i16>* %p
599    %2 = add <4 x i16> %1, %1
600    %3 = call <8 x i8> @test_v8i8_v4i16_helper(<4 x i16> %2)
601    br label %return_bb
602return_bb:
603    %4 = add <8 x i8> %3, %3
604    store <8 x i8> %4, <8 x i8>* %q
605    ret void
606}
607
608; CHECK-LABEL: test_f128_v2f64:
609declare fp128 @test_f128_v2f64_helper(<2 x double> %p)
610define void @test_f128_v2f64(<2 x double>* %p, fp128* %q) {
611; CHECK: ext
612    %1 = load <2 x double>, <2 x double>* %p
613    %2 = fadd <2 x double> %1, %1
614    %3 = call fp128 @test_f128_v2f64_helper(<2 x double> %2)
615    br label %return_bb
616return_bb:
617    %4 = fadd fp128 %3, %3
618    store fp128 %4, fp128* %q
619    ret void
620}
621
622; CHECK-LABEL: test_f128_v2i64:
623declare fp128 @test_f128_v2i64_helper(<2 x i64> %p)
624define void @test_f128_v2i64(<2 x i64>* %p, fp128* %q) {
625; CHECK: ext
626    %1 = load <2 x i64>, <2 x i64>* %p
627    %2 = add <2 x i64> %1, %1
628    %3 = call fp128 @test_f128_v2i64_helper(<2 x i64> %2)
629    br label %return_bb
630return_bb:
631    %4 = fadd fp128 %3, %3
632    store fp128 %4, fp128* %q
633    ret void
634}
635
636; CHECK-LABEL: test_f128_v4f32:
637declare fp128 @test_f128_v4f32_helper(<4 x float> %p)
638define void @test_f128_v4f32(<4 x float>* %p, fp128* %q) {
639; CHECK: rev64 v{{[0-9]+}}.4s
640; CHECK: ext
641    %1 = load <4 x float>, <4 x float>* %p
642    %2 = fadd <4 x float> %1, %1
643    %3 = call fp128 @test_f128_v4f32_helper(<4 x float> %2)
644    br label %return_bb
645return_bb:
646    %4 = fadd fp128 %3, %3
647    store fp128 %4, fp128* %q
648    ret void
649}
650
651; CHECK-LABEL: test_f128_v4i32:
652declare fp128 @test_f128_v4i32_helper(<4 x i32> %p)
653define void @test_f128_v4i32(<4 x i32>* %p, fp128* %q) {
654; CHECK: rev64 v{{[0-9]+}}.4s
655; CHECK: ext
656    %1 = load <4 x i32>, <4 x i32>* %p
657    %2 = add <4 x i32> %1, %1
658    %3 = call fp128 @test_f128_v4i32_helper(<4 x i32> %2)
659    br label %return_bb
660return_bb:
661    %4 = fadd fp128 %3, %3
662    store fp128 %4, fp128* %q
663    ret void
664}
665
666; CHECK-LABEL: test_f128_v8i16:
667declare fp128 @test_f128_v8i16_helper(<8 x i16> %p)
668define void @test_f128_v8i16(<8 x i16>* %p, fp128* %q) {
669; CHECK: rev64 v{{[0-9]+}}.8h
670; CHECK: ext
671    %1 = load <8 x i16>, <8 x i16>* %p
672    %2 = add <8 x i16> %1, %1
673    %3 = call fp128 @test_f128_v8i16_helper(<8 x i16> %2)
674    br label %return_bb
675return_bb:
676    %4 = fadd fp128 %3, %3
677    store fp128 %4, fp128* %q
678    ret void
679}
680
681; CHECK-LABEL: test_f128_v16i8:
682declare fp128 @test_f128_v16i8_helper(<16 x i8> %p)
683define void @test_f128_v16i8(<16 x i8>* %p, fp128* %q) {
684; CHECK: rev64 v{{[0-9]+}}.16b
685; CHECK: ext
686    %1 = load <16 x i8>, <16 x i8>* %p
687    %2 = add <16 x i8> %1, %1
688    %3 = call fp128 @test_f128_v16i8_helper(<16 x i8> %2)
689    br label %return_bb
690return_bb:
691    %4 = fadd fp128 %3, %3
692    store fp128 %4, fp128* %q
693    ret void
694}
695
696; CHECK-LABEL: test_v2f64_f128:
697declare <2 x double> @test_v2f64_f128_helper(fp128 %p)
698define void @test_v2f64_f128(fp128* %p, <2 x double>* %q) {
699; CHECK: ext
700    %1 = load fp128, fp128* %p
701    %2 = fadd fp128 %1, %1
702    %3 = call <2 x double> @test_v2f64_f128_helper(fp128 %2)
703    br label %return_bb
704return_bb:
705    %4 = fadd <2 x double> %3, %3
706    store <2 x double> %4, <2 x double>* %q
707    ret void
708}
709
710; CHECK-LABEL: test_v2f64_v2i64:
711declare <2 x double> @test_v2f64_v2i64_helper(<2 x i64> %p)
712define void @test_v2f64_v2i64(<2 x i64>* %p, <2 x double>* %q) {
713; CHECK: ext
714; CHECK: ext
715    %1 = load <2 x i64>, <2 x i64>* %p
716    %2 = add <2 x i64> %1, %1
717    %3 = call <2 x double> @test_v2f64_v2i64_helper(<2 x i64> %2)
718    br label %return_bb
719return_bb:
720    %4 = fadd <2 x double> %3, %3
721    store <2 x double> %4, <2 x double>* %q
722    ret void
723}
724
725; CHECK-LABEL: test_v2f64_v4f32:
726declare <2 x double> @test_v2f64_v4f32_helper(<4 x float> %p)
727define void @test_v2f64_v4f32(<4 x float>* %p, <2 x double>* %q) {
728; CHECK: rev64 v{{[0-9]+}}.4s
729; CHECK: ext
730; CHECK: ext
731    %1 = load <4 x float>, <4 x float>* %p
732    %2 = fadd <4 x float> %1, %1
733    %3 = call <2 x double> @test_v2f64_v4f32_helper(<4 x float> %2)
734    br label %return_bb
735return_bb:
736    %4 = fadd <2 x double> %3, %3
737    store <2 x double> %4, <2 x double>* %q
738    ret void
739}
740
741; CHECK-LABEL: test_v2f64_v4i32:
742declare <2 x double> @test_v2f64_v4i32_helper(<4 x i32> %p)
743define void @test_v2f64_v4i32(<4 x i32>* %p, <2 x double>* %q) {
744; CHECK: rev64 v{{[0-9]+}}.4s
745; CHECK: ext
746; CHECK: ext
747    %1 = load <4 x i32>, <4 x i32>* %p
748    %2 = add <4 x i32> %1, %1
749    %3 = call <2 x double> @test_v2f64_v4i32_helper(<4 x i32> %2)
750    br label %return_bb
751return_bb:
752    %4 = fadd <2 x double> %3, %3
753    store <2 x double> %4, <2 x double>* %q
754    ret void
755}
756
757; CHECK-LABEL: test_v2f64_v8i16:
758declare <2 x double> @test_v2f64_v8i16_helper(<8 x i16> %p)
759define void @test_v2f64_v8i16(<8 x i16>* %p, <2 x double>* %q) {
760; CHECK: rev64 v{{[0-9]+}}.8h
761; CHECK: ext
762; CHECK: ext
763    %1 = load <8 x i16>, <8 x i16>* %p
764    %2 = add <8 x i16> %1, %1
765    %3 = call <2 x double> @test_v2f64_v8i16_helper(<8 x i16> %2)
766    br label %return_bb
767return_bb:
768    %4 = fadd <2 x double> %3, %3
769    store <2 x double> %4, <2 x double>* %q
770    ret void
771}
772
773; CHECK-LABEL: test_v2f64_v16i8:
774declare <2 x double> @test_v2f64_v16i8_helper(<16 x i8> %p)
775define void @test_v2f64_v16i8(<16 x i8>* %p, <2 x double>* %q) {
776; CHECK: rev64 v{{[0-9]+}}.16b
777; CHECK: ext
778; CHECK: ext
779    %1 = load <16 x i8>, <16 x i8>* %p
780    %2 = add <16 x i8> %1, %1
781    %3 = call <2 x double> @test_v2f64_v16i8_helper(<16 x i8> %2)
782    br label %return_bb
783return_bb:
784    %4 = fadd <2 x double> %3, %3
785    store <2 x double> %4, <2 x double>* %q
786    ret void
787}
788
789; CHECK-LABEL: test_v2i64_f128:
790declare <2 x i64> @test_v2i64_f128_helper(fp128 %p)
791define void @test_v2i64_f128(fp128* %p, <2 x i64>* %q) {
792; CHECK: ext
793    %1 = load fp128, fp128* %p
794    %2 = fadd fp128 %1, %1
795    %3 = call <2 x i64> @test_v2i64_f128_helper(fp128 %2)
796    br label %return_bb
797return_bb:
798    %4 = add <2 x i64> %3, %3
799    store <2 x i64> %4, <2 x i64>* %q
800    ret void
801}
802
803; CHECK-LABEL: test_v2i64_v2f64:
804declare <2 x i64> @test_v2i64_v2f64_helper(<2 x double> %p)
805define void @test_v2i64_v2f64(<2 x double>* %p, <2 x i64>* %q) {
806; CHECK: ext
807; CHECK: ext
808    %1 = load <2 x double>, <2 x double>* %p
809    %2 = fadd <2 x double> %1, %1
810    %3 = call <2 x i64> @test_v2i64_v2f64_helper(<2 x double> %2)
811    br label %return_bb
812return_bb:
813    %4 = add <2 x i64> %3, %3
814    store <2 x i64> %4, <2 x i64>* %q
815    ret void
816}
817
818; CHECK-LABEL: test_v2i64_v4f32:
819declare <2 x i64> @test_v2i64_v4f32_helper(<4 x float> %p)
820define void @test_v2i64_v4f32(<4 x float>* %p, <2 x i64>* %q) {
821; CHECK: rev64 v{{[0-9]+}}.4s
822; CHECK: ext
823; CHECK: ext
824    %1 = load <4 x float>, <4 x float>* %p
825    %2 = fadd <4 x float> %1, %1
826    %3 = call <2 x i64> @test_v2i64_v4f32_helper(<4 x float> %2)
827    br label %return_bb
828return_bb:
829    %4 = add <2 x i64> %3, %3
830    store <2 x i64> %4, <2 x i64>* %q
831    ret void
832}
833
834; CHECK-LABEL: test_v2i64_v4i32:
835declare <2 x i64> @test_v2i64_v4i32_helper(<4 x i32> %p)
836define void @test_v2i64_v4i32(<4 x i32>* %p, <2 x i64>* %q) {
837; CHECK: rev64 v{{[0-9]+}}.4s
838; CHECK: ext
839; CHECK: ext
840    %1 = load <4 x i32>, <4 x i32>* %p
841    %2 = add <4 x i32> %1, %1
842    %3 = call <2 x i64> @test_v2i64_v4i32_helper(<4 x i32> %2)
843    br label %return_bb
844return_bb:
845    %4 = add <2 x i64> %3, %3
846    store <2 x i64> %4, <2 x i64>* %q
847    ret void
848}
849
850; CHECK-LABEL: test_v2i64_v8i16:
851declare <2 x i64> @test_v2i64_v8i16_helper(<8 x i16> %p)
852define void @test_v2i64_v8i16(<8 x i16>* %p, <2 x i64>* %q) {
853; CHECK: rev64 v{{[0-9]+}}.8h
854; CHECK: ext
855; CHECK: ext
856    %1 = load <8 x i16>, <8 x i16>* %p
857    %2 = add <8 x i16> %1, %1
858    %3 = call <2 x i64> @test_v2i64_v8i16_helper(<8 x i16> %2)
859    br label %return_bb
860return_bb:
861    %4 = add <2 x i64> %3, %3
862    store <2 x i64> %4, <2 x i64>* %q
863    ret void
864}
865
866; CHECK-LABEL: test_v2i64_v16i8:
867declare <2 x i64> @test_v2i64_v16i8_helper(<16 x i8> %p)
868define void @test_v2i64_v16i8(<16 x i8>* %p, <2 x i64>* %q) {
869; CHECK: rev64 v{{[0-9]+}}.16b
870; CHECK: ext
871; CHECK: ext
872    %1 = load <16 x i8>, <16 x i8>* %p
873    %2 = add <16 x i8> %1, %1
874    %3 = call <2 x i64> @test_v2i64_v16i8_helper(<16 x i8> %2)
875    br label %return_bb
876return_bb:
877    %4 = add <2 x i64> %3, %3
878    store <2 x i64> %4, <2 x i64>* %q
879    ret void
880}
881
882; CHECK-LABEL: test_v4f32_f128:
883declare <4 x float> @test_v4f32_f128_helper(fp128 %p)
884define void @test_v4f32_f128(fp128* %p, <4 x float>* %q) {
885; CHECK: rev64 v{{[0-9]+}}.4s
886; CHECK: ext
887    %1 = load fp128, fp128* %p
888    %2 = fadd fp128 %1, %1
889    %3 = call <4 x float> @test_v4f32_f128_helper(fp128 %2)
890    br label %return_bb
891return_bb:
892    %4 = fadd <4 x float> %3, %3
893    store <4 x float> %4, <4 x float>* %q
894    ret void
895}
896
897; CHECK-LABEL: test_v4f32_v2f64:
898declare <4 x float> @test_v4f32_v2f64_helper(<2 x double> %p)
899define void @test_v4f32_v2f64(<2 x double>* %p, <4 x float>* %q) {
900; CHECK: ext
901; CHECK: rev64 v{{[0-9]+}}.4s
902; CHECK: ext
903    %1 = load <2 x double>, <2 x double>* %p
904    %2 = fadd <2 x double> %1, %1
905    %3 = call <4 x float> @test_v4f32_v2f64_helper(<2 x double> %2)
906    br label %return_bb
907return_bb:
908    %4 = fadd <4 x float> %3, %3
909    store <4 x float> %4, <4 x float>* %q
910    ret void
911}
912
913; CHECK-LABEL: test_v4f32_v2i64:
914declare <4 x float> @test_v4f32_v2i64_helper(<2 x i64> %p)
915define void @test_v4f32_v2i64(<2 x i64>* %p, <4 x float>* %q) {
916; CHECK: ext
917; CHECK: rev64 v{{[0-9]+}}.4s
918; CHECK: ext
919    %1 = load <2 x i64>, <2 x i64>* %p
920    %2 = add <2 x i64> %1, %1
921    %3 = call <4 x float> @test_v4f32_v2i64_helper(<2 x i64> %2)
922    br label %return_bb
923return_bb:
924    %4 = fadd <4 x float> %3, %3
925    store <4 x float> %4, <4 x float>* %q
926    ret void
927}
928
929; CHECK-LABEL: test_v4f32_v4i32:
930declare <4 x float> @test_v4f32_v4i32_helper(<4 x i32> %p)
931define void @test_v4f32_v4i32(<4 x i32>* %p, <4 x float>* %q) {
932; CHECK: rev64 v{{[0-9]+}}.4s
933; CHECK: ext
934; CHECK: rev64 v{{[0-9]+}}.4s
935; CHECK: ext
936    %1 = load <4 x i32>, <4 x i32>* %p
937    %2 = add <4 x i32> %1, %1
938    %3 = call <4 x float> @test_v4f32_v4i32_helper(<4 x i32> %2)
939    br label %return_bb
940return_bb:
941    %4 = fadd <4 x float> %3, %3
942    store <4 x float> %4, <4 x float>* %q
943    ret void
944}
945
946; CHECK-LABEL: test_v4f32_v8i16:
947declare <4 x float> @test_v4f32_v8i16_helper(<8 x i16> %p)
948define void @test_v4f32_v8i16(<8 x i16>* %p, <4 x float>* %q) {
949; CHECK: rev64 v{{[0-9]+}}.8h
950; CHECK: ext
951; CHECK: rev64 v{{[0-9]+}}.4s
952; CHECK: ext
953    %1 = load <8 x i16>, <8 x i16>* %p
954    %2 = add <8 x i16> %1, %1
955    %3 = call <4 x float> @test_v4f32_v8i16_helper(<8 x i16> %2)
956    br label %return_bb
957return_bb:
958    %4 = fadd <4 x float> %3, %3
959    store <4 x float> %4, <4 x float>* %q
960    ret void
961}
962
963; CHECK-LABEL: test_v4f32_v16i8:
964declare <4 x float> @test_v4f32_v16i8_helper(<16 x i8> %p)
965define void @test_v4f32_v16i8(<16 x i8>* %p, <4 x float>* %q) {
966; CHECK: rev64 v{{[0-9]+}}.16b
967; CHECK: ext
968; CHECK: rev64 v{{[0-9]+}}.4s
969; CHECK: ext
970    %1 = load <16 x i8>, <16 x i8>* %p
971    %2 = add <16 x i8> %1, %1
972    %3 = call <4 x float> @test_v4f32_v16i8_helper(<16 x i8> %2)
973    br label %return_bb
974return_bb:
975    %4 = fadd <4 x float> %3, %3
976    store <4 x float> %4, <4 x float>* %q
977    ret void
978}
979
980; CHECK-LABEL: test_v4i32_f128:
981declare <4 x i32> @test_v4i32_f128_helper(fp128 %p)
982define void @test_v4i32_f128(fp128* %p, <4 x i32>* %q) {
983; CHECK: rev64 v{{[0-9]+}}.4s
984; CHECK: ext
985    %1 = load fp128, fp128* %p
986    %2 = fadd fp128 %1, %1
987    %3 = call <4 x i32> @test_v4i32_f128_helper(fp128 %2)
988    br label %return_bb
989return_bb:
990    %4 = add <4 x i32> %3, %3
991    store <4 x i32> %4, <4 x i32>* %q
992    ret void
993}
994
995; CHECK-LABEL: test_v4i32_v2f64:
996declare <4 x i32> @test_v4i32_v2f64_helper(<2 x double> %p)
997define void @test_v4i32_v2f64(<2 x double>* %p, <4 x i32>* %q) {
998; CHECK: ext
999; CHECK: rev64 v{{[0-9]+}}.4s
1000; CHECK: ext
1001    %1 = load <2 x double>, <2 x double>* %p
1002    %2 = fadd <2 x double> %1, %1
1003    %3 = call <4 x i32> @test_v4i32_v2f64_helper(<2 x double> %2)
1004    br label %return_bb
1005return_bb:
1006    %4 = add <4 x i32> %3, %3
1007    store <4 x i32> %4, <4 x i32>* %q
1008    ret void
1009}
1010
1011; CHECK-LABEL: test_v4i32_v2i64:
1012declare <4 x i32> @test_v4i32_v2i64_helper(<2 x i64> %p)
1013define void @test_v4i32_v2i64(<2 x i64>* %p, <4 x i32>* %q) {
1014; CHECK: ext
1015; CHECK: rev64 v{{[0-9]+}}.4s
1016; CHECK: ext
1017    %1 = load <2 x i64>, <2 x i64>* %p
1018    %2 = add <2 x i64> %1, %1
1019    %3 = call <4 x i32> @test_v4i32_v2i64_helper(<2 x i64> %2)
1020    br label %return_bb
1021return_bb:
1022    %4 = add <4 x i32> %3, %3
1023    store <4 x i32> %4, <4 x i32>* %q
1024    ret void
1025}
1026
1027; CHECK-LABEL: test_v4i32_v4f32:
1028declare <4 x i32> @test_v4i32_v4f32_helper(<4 x float> %p)
1029define void @test_v4i32_v4f32(<4 x float>* %p, <4 x i32>* %q) {
1030; CHECK: rev64 v{{[0-9]+}}.4s
1031; CHECK: ext
1032; CHECK: rev64 v{{[0-9]+}}.4s
1033; CHECK: ext
1034    %1 = load <4 x float>, <4 x float>* %p
1035    %2 = fadd <4 x float> %1, %1
1036    %3 = call <4 x i32> @test_v4i32_v4f32_helper(<4 x float> %2)
1037    br label %return_bb
1038return_bb:
1039    %4 = add <4 x i32> %3, %3
1040    store <4 x i32> %4, <4 x i32>* %q
1041    ret void
1042}
1043
1044; CHECK-LABEL: test_v4i32_v8i16:
1045declare <4 x i32> @test_v4i32_v8i16_helper(<8 x i16> %p)
1046define void @test_v4i32_v8i16(<8 x i16>* %p, <4 x i32>* %q) {
1047; CHECK: rev64 v{{[0-9]+}}.8h
1048; CHECK: ext
1049; CHECK: rev64 v{{[0-9]+}}.4s
1050; CHECK: ext
1051    %1 = load <8 x i16>, <8 x i16>* %p
1052    %2 = add <8 x i16> %1, %1
1053    %3 = call <4 x i32> @test_v4i32_v8i16_helper(<8 x i16> %2)
1054    br label %return_bb
1055return_bb:
1056    %4 = add <4 x i32> %3, %3
1057    store <4 x i32> %4, <4 x i32>* %q
1058    ret void
1059}
1060
1061; CHECK-LABEL: test_v4i32_v16i8:
1062declare <4 x i32> @test_v4i32_v16i8_helper(<16 x i8> %p)
1063define void @test_v4i32_v16i8(<16 x i8>* %p, <4 x i32>* %q) {
1064; CHECK: rev64 v{{[0-9]+}}.16b
1065; CHECK: ext
1066; CHECK: rev64 v{{[0-9]+}}.4s
1067; CHECK: ext
1068    %1 = load <16 x i8>, <16 x i8>* %p
1069    %2 = add <16 x i8> %1, %1
1070    %3 = call <4 x i32> @test_v4i32_v16i8_helper(<16 x i8> %2)
1071    br label %return_bb
1072return_bb:
1073    %4 = add <4 x i32> %3, %3
1074    store <4 x i32> %4, <4 x i32>* %q
1075    ret void
1076}
1077
1078; CHECK-LABEL: test_v8i16_f128:
1079declare <8 x i16> @test_v8i16_f128_helper(fp128 %p)
1080define void @test_v8i16_f128(fp128* %p, <8 x i16>* %q) {
1081; CHECK: rev64 v{{[0-9]+}}.8h
1082; CHECK: ext
1083    %1 = load fp128, fp128* %p
1084    %2 = fadd fp128 %1, %1
1085    %3 = call <8 x i16> @test_v8i16_f128_helper(fp128 %2)
1086    br label %return_bb
1087return_bb:
1088    %4 = add <8 x i16> %3, %3
1089    store <8 x i16> %4, <8 x i16>* %q
1090    ret void
1091}
1092
1093; CHECK-LABEL: test_v8i16_v2f64:
1094declare <8 x i16> @test_v8i16_v2f64_helper(<2 x double> %p)
1095define void @test_v8i16_v2f64(<2 x double>* %p, <8 x i16>* %q) {
1096; CHECK: ext
1097; CHECK: rev64 v{{[0-9]+}}.8h
1098; CHECK: ext
1099    %1 = load <2 x double>, <2 x double>* %p
1100    %2 = fadd <2 x double> %1, %1
1101    %3 = call <8 x i16> @test_v8i16_v2f64_helper(<2 x double> %2)
1102    br label %return_bb
1103return_bb:
1104    %4 = add <8 x i16> %3, %3
1105    store <8 x i16> %4, <8 x i16>* %q
1106    ret void
1107}
1108
1109; CHECK-LABEL: test_v8i16_v2i64:
1110declare <8 x i16> @test_v8i16_v2i64_helper(<2 x i64> %p)
1111define void @test_v8i16_v2i64(<2 x i64>* %p, <8 x i16>* %q) {
1112; CHECK: ext
1113; CHECK: rev64 v{{[0-9]+}}.8h
1114; CHECK: ext
1115    %1 = load <2 x i64>, <2 x i64>* %p
1116    %2 = add <2 x i64> %1, %1
1117    %3 = call <8 x i16> @test_v8i16_v2i64_helper(<2 x i64> %2)
1118    br label %return_bb
1119return_bb:
1120    %4 = add <8 x i16> %3, %3
1121    store <8 x i16> %4, <8 x i16>* %q
1122    ret void
1123}
1124
1125; CHECK-LABEL: test_v8i16_v4f32:
1126declare <8 x i16> @test_v8i16_v4f32_helper(<4 x float> %p)
1127define void @test_v8i16_v4f32(<4 x float>* %p, <8 x i16>* %q) {
1128; CHECK: rev64 v{{[0-9]+}}.4s
1129; CHECK: ext
1130; CHECK: rev64 v{{[0-9]+}}.8h
1131; CHECK: ext
1132    %1 = load <4 x float>, <4 x float>* %p
1133    %2 = fadd <4 x float> %1, %1
1134    %3 = call <8 x i16> @test_v8i16_v4f32_helper(<4 x float> %2)
1135    br label %return_bb
1136return_bb:
1137    %4 = add <8 x i16> %3, %3
1138    store <8 x i16> %4, <8 x i16>* %q
1139    ret void
1140}
1141
1142; CHECK-LABEL: test_v8i16_v4i32:
1143declare <8 x i16> @test_v8i16_v4i32_helper(<4 x i32> %p)
1144define void @test_v8i16_v4i32(<4 x i32>* %p, <8 x i16>* %q) {
1145; CHECK: rev64 v{{[0-9]+}}.4s
1146; CHECK: ext
1147; CHECK: rev64 v{{[0-9]+}}.8h
1148; CHECK: ext
1149    %1 = load <4 x i32>, <4 x i32>* %p
1150    %2 = add <4 x i32> %1, %1
1151    %3 = call <8 x i16> @test_v8i16_v4i32_helper(<4 x i32> %2)
1152    br label %return_bb
1153return_bb:
1154    %4 = add <8 x i16> %3, %3
1155    store <8 x i16> %4, <8 x i16>* %q
1156    ret void
1157}
1158
1159; CHECK-LABEL: test_v8i16_v16i8:
1160declare <8 x i16> @test_v8i16_v16i8_helper(<16 x i8> %p)
1161define void @test_v8i16_v16i8(<16 x i8>* %p, <8 x i16>* %q) {
1162; CHECK: rev64 v{{[0-9]+}}.16b
1163; CHECK: ext
1164; CHECK: rev64 v{{[0-9]+}}.8h
1165; CHECK: ext
1166    %1 = load <16 x i8>, <16 x i8>* %p
1167    %2 = add <16 x i8> %1, %1
1168    %3 = call <8 x i16> @test_v8i16_v16i8_helper(<16 x i8> %2)
1169    br label %return_bb
1170return_bb:
1171    %4 = add <8 x i16> %3, %3
1172    store <8 x i16> %4, <8 x i16>* %q
1173    ret void
1174}
1175
1176; CHECK-LABEL: test_v16i8_f128:
1177declare <16 x i8> @test_v16i8_f128_helper(fp128 %p)
1178define void @test_v16i8_f128(fp128* %p, <16 x i8>* %q) {
1179; CHECK: rev64 v{{[0-9]+}}.16b
1180; CHECK: ext
1181    %1 = load fp128, fp128* %p
1182    %2 = fadd fp128 %1, %1
1183    %3 = call <16 x i8> @test_v16i8_f128_helper(fp128 %2)
1184    br label %return_bb
1185return_bb:
1186    %4 = add <16 x i8> %3, %3
1187    store <16 x i8> %4, <16 x i8>* %q
1188    ret void
1189}
1190
1191; CHECK-LABEL: test_v16i8_v2f64:
1192declare <16 x i8> @test_v16i8_v2f64_helper(<2 x double> %p)
1193define void @test_v16i8_v2f64(<2 x double>* %p, <16 x i8>* %q) {
1194; CHECK: ext
1195; CHECK: rev64 v{{[0-9]+}}.16b
1196; CHECK: ext
1197    %1 = load <2 x double>, <2 x double>* %p
1198    %2 = fadd <2 x double> %1, %1
1199    %3 = call <16 x i8> @test_v16i8_v2f64_helper(<2 x double> %2)
1200    br label %return_bb
1201return_bb:
1202    %4 = add <16 x i8> %3, %3
1203    store <16 x i8> %4, <16 x i8>* %q
1204    ret void
1205}
1206
1207; CHECK-LABEL: test_v16i8_v2i64:
1208declare <16 x i8> @test_v16i8_v2i64_helper(<2 x i64> %p)
1209define void @test_v16i8_v2i64(<2 x i64>* %p, <16 x i8>* %q) {
1210; CHECK: ext
1211; CHECK: rev64 v{{[0-9]+}}.16b
1212; CHECK: ext
1213    %1 = load <2 x i64>, <2 x i64>* %p
1214    %2 = add <2 x i64> %1, %1
1215    %3 = call <16 x i8> @test_v16i8_v2i64_helper(<2 x i64> %2)
1216    br label %return_bb
1217return_bb:
1218    %4 = add <16 x i8> %3, %3
1219    store <16 x i8> %4, <16 x i8>* %q
1220    ret void
1221}
1222
1223; CHECK-LABEL: test_v16i8_v4f32:
1224declare <16 x i8> @test_v16i8_v4f32_helper(<4 x float> %p)
1225define void @test_v16i8_v4f32(<4 x float>* %p, <16 x i8>* %q) {
1226; CHECK: rev64 v{{[0-9]+}}.4s
1227; CHECK: ext
1228; CHECK: rev64 v{{[0-9]+}}.16b
1229; CHECK: ext
1230    %1 = load <4 x float>, <4 x float>* %p
1231    %2 = fadd <4 x float> %1, %1
1232    %3 = call <16 x i8> @test_v16i8_v4f32_helper(<4 x float> %2)
1233    br label %return_bb
1234return_bb:
1235    %4 = add <16 x i8> %3, %3
1236    store <16 x i8> %4, <16 x i8>* %q
1237    ret void
1238}
1239
1240; CHECK-LABEL: test_v16i8_v4i32:
1241declare <16 x i8> @test_v16i8_v4i32_helper(<4 x i32> %p)
1242define void @test_v16i8_v4i32(<4 x i32>* %p, <16 x i8>* %q) {
1243; CHECK: rev64 v{{[0-9]+}}.4s
1244; CHECK: ext
1245; CHECK: rev64 v{{[0-9]+}}.16b
1246; CHECK: ext
1247    %1 = load <4 x i32>, <4 x i32>* %p
1248    %2 = add <4 x i32> %1, %1
1249    %3 = call <16 x i8> @test_v16i8_v4i32_helper(<4 x i32> %2)
1250    br label %return_bb
1251return_bb:
1252    %4 = add <16 x i8> %3, %3
1253    store <16 x i8> %4, <16 x i8>* %q
1254    ret void
1255}
1256
1257; CHECK-LABEL: test_v16i8_v8i16:
1258declare <16 x i8> @test_v16i8_v8i16_helper(<8 x i16> %p)
1259define void @test_v16i8_v8i16(<8 x i16>* %p, <16 x i8>* %q) {
1260; CHECK: rev64 v{{[0-9]+}}.8h
1261; CHECK: ext
1262; CHECK: rev64 v{{[0-9]+}}.16b
1263; CHECK: ext
1264    %1 = load <8 x i16>, <8 x i16>* %p
1265    %2 = add <8 x i16> %1, %1
1266    %3 = call <16 x i8> @test_v16i8_v8i16_helper(<8 x i16> %2)
1267    br label %return_bb
1268return_bb:
1269    %4 = add <16 x i8> %3, %3
1270    store <16 x i8> %4, <16 x i8>* %q
1271    ret void
1272}
1273