xref: /aosp_15_r20/external/llvm/test/CodeGen/AArch64/arm64-neon-3vdiff.ll (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -verify-machineinstrs -mtriple=arm64-none-linux-gnu -mattr=+neon | FileCheck %s
2*9880d681SAndroid Build Coastguard Worker
3*9880d681SAndroid Build Coastguard Workerdeclare <8 x i16> @llvm.aarch64.neon.pmull.v8i16(<8 x i8>, <8 x i8>)
4*9880d681SAndroid Build Coastguard Worker
5*9880d681SAndroid Build Coastguard Workerdeclare <2 x i64> @llvm.aarch64.neon.sqdmull.v2i64(<2 x i32>, <2 x i32>)
6*9880d681SAndroid Build Coastguard Worker
7*9880d681SAndroid Build Coastguard Workerdeclare <2 x i64> @llvm.aarch64.neon.sqsub.v2i64(<2 x i64>, <2 x i64>)
8*9880d681SAndroid Build Coastguard Worker
9*9880d681SAndroid Build Coastguard Workerdeclare <4 x i32> @llvm.aarch64.neon.sqdmull.v4i32(<4 x i16>, <4 x i16>)
10*9880d681SAndroid Build Coastguard Worker
11*9880d681SAndroid Build Coastguard Workerdeclare <4 x i32> @llvm.aarch64.neon.sqsub.v4i32(<4 x i32>, <4 x i32>)
12*9880d681SAndroid Build Coastguard Worker
13*9880d681SAndroid Build Coastguard Workerdeclare <2 x i64> @llvm.aarch64.neon.sqadd.v2i64(<2 x i64>, <2 x i64>)
14*9880d681SAndroid Build Coastguard Worker
15*9880d681SAndroid Build Coastguard Workerdeclare <4 x i32> @llvm.aarch64.neon.sqadd.v4i32(<4 x i32>, <4 x i32>)
16*9880d681SAndroid Build Coastguard Worker
17*9880d681SAndroid Build Coastguard Workerdeclare <2 x i64> @llvm.aarch64.neon.umull.v2i64(<2 x i32>, <2 x i32>)
18*9880d681SAndroid Build Coastguard Worker
19*9880d681SAndroid Build Coastguard Workerdeclare <4 x i32> @llvm.aarch64.neon.umull.v4i32(<4 x i16>, <4 x i16>)
20*9880d681SAndroid Build Coastguard Worker
21*9880d681SAndroid Build Coastguard Workerdeclare <8 x i16> @llvm.aarch64.neon.umull.v8i16(<8 x i8>, <8 x i8>)
22*9880d681SAndroid Build Coastguard Worker
23*9880d681SAndroid Build Coastguard Workerdeclare <2 x i64> @llvm.aarch64.neon.smull.v2i64(<2 x i32>, <2 x i32>)
24*9880d681SAndroid Build Coastguard Worker
25*9880d681SAndroid Build Coastguard Workerdeclare <4 x i32> @llvm.aarch64.neon.smull.v4i32(<4 x i16>, <4 x i16>)
26*9880d681SAndroid Build Coastguard Worker
27*9880d681SAndroid Build Coastguard Workerdeclare <8 x i16> @llvm.aarch64.neon.smull.v8i16(<8 x i8>, <8 x i8>)
28*9880d681SAndroid Build Coastguard Worker
29*9880d681SAndroid Build Coastguard Workerdeclare <2 x i32> @llvm.aarch64.neon.uabd.v2i32(<2 x i32>, <2 x i32>)
30*9880d681SAndroid Build Coastguard Worker
31*9880d681SAndroid Build Coastguard Workerdeclare <4 x i16> @llvm.aarch64.neon.uabd.v4i16(<4 x i16>, <4 x i16>)
32*9880d681SAndroid Build Coastguard Worker
33*9880d681SAndroid Build Coastguard Workerdeclare <8 x i8> @llvm.aarch64.neon.uabd.v8i8(<8 x i8>, <8 x i8>)
34*9880d681SAndroid Build Coastguard Worker
35*9880d681SAndroid Build Coastguard Workerdeclare <2 x i32> @llvm.aarch64.neon.sabd.v2i32(<2 x i32>, <2 x i32>)
36*9880d681SAndroid Build Coastguard Worker
37*9880d681SAndroid Build Coastguard Workerdeclare <4 x i16> @llvm.aarch64.neon.sabd.v4i16(<4 x i16>, <4 x i16>)
38*9880d681SAndroid Build Coastguard Worker
39*9880d681SAndroid Build Coastguard Workerdeclare <8 x i8> @llvm.aarch64.neon.sabd.v8i8(<8 x i8>, <8 x i8>)
40*9880d681SAndroid Build Coastguard Worker
41*9880d681SAndroid Build Coastguard Workerdeclare <2 x i32> @llvm.aarch64.neon.rsubhn.v2i32(<2 x i64>, <2 x i64>)
42*9880d681SAndroid Build Coastguard Worker
43*9880d681SAndroid Build Coastguard Workerdeclare <4 x i16> @llvm.aarch64.neon.rsubhn.v4i16(<4 x i32>, <4 x i32>)
44*9880d681SAndroid Build Coastguard Worker
45*9880d681SAndroid Build Coastguard Workerdeclare <8 x i8> @llvm.aarch64.neon.rsubhn.v8i8(<8 x i16>, <8 x i16>)
46*9880d681SAndroid Build Coastguard Worker
47*9880d681SAndroid Build Coastguard Workerdeclare <2 x i32> @llvm.aarch64.neon.raddhn.v2i32(<2 x i64>, <2 x i64>)
48*9880d681SAndroid Build Coastguard Worker
49*9880d681SAndroid Build Coastguard Workerdeclare <4 x i16> @llvm.aarch64.neon.raddhn.v4i16(<4 x i32>, <4 x i32>)
50*9880d681SAndroid Build Coastguard Worker
51*9880d681SAndroid Build Coastguard Workerdeclare <8 x i8> @llvm.aarch64.neon.raddhn.v8i8(<8 x i16>, <8 x i16>)
52*9880d681SAndroid Build Coastguard Worker
53*9880d681SAndroid Build Coastguard Workerdefine <8 x i16> @test_vaddl_s8(<8 x i8> %a, <8 x i8> %b) {
54*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_vaddl_s8:
55*9880d681SAndroid Build Coastguard Worker; CHECK: saddl {{v[0-9]+}}.8h, {{v[0-9]+}}.8b, {{v[0-9]+}}.8b
56*9880d681SAndroid Build Coastguard Workerentry:
57*9880d681SAndroid Build Coastguard Worker  %vmovl.i.i = sext <8 x i8> %a to <8 x i16>
58*9880d681SAndroid Build Coastguard Worker  %vmovl.i2.i = sext <8 x i8> %b to <8 x i16>
59*9880d681SAndroid Build Coastguard Worker  %add.i = add <8 x i16> %vmovl.i.i, %vmovl.i2.i
60*9880d681SAndroid Build Coastguard Worker  ret <8 x i16> %add.i
61*9880d681SAndroid Build Coastguard Worker}
62*9880d681SAndroid Build Coastguard Worker
63*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @test_vaddl_s16(<4 x i16> %a, <4 x i16> %b) {
64*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_vaddl_s16:
65*9880d681SAndroid Build Coastguard Worker; CHECK: saddl {{v[0-9]+}}.4s, {{v[0-9]+}}.4h, {{v[0-9]+}}.4h
66*9880d681SAndroid Build Coastguard Workerentry:
67*9880d681SAndroid Build Coastguard Worker  %vmovl.i.i = sext <4 x i16> %a to <4 x i32>
68*9880d681SAndroid Build Coastguard Worker  %vmovl.i2.i = sext <4 x i16> %b to <4 x i32>
69*9880d681SAndroid Build Coastguard Worker  %add.i = add <4 x i32> %vmovl.i.i, %vmovl.i2.i
70*9880d681SAndroid Build Coastguard Worker  ret <4 x i32> %add.i
71*9880d681SAndroid Build Coastguard Worker}
72*9880d681SAndroid Build Coastguard Worker
73*9880d681SAndroid Build Coastguard Workerdefine <2 x i64> @test_vaddl_s32(<2 x i32> %a, <2 x i32> %b) {
74*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_vaddl_s32:
75*9880d681SAndroid Build Coastguard Worker; CHECK: saddl {{v[0-9]+}}.2d, {{v[0-9]+}}.2s, {{v[0-9]+}}.2s
76*9880d681SAndroid Build Coastguard Workerentry:
77*9880d681SAndroid Build Coastguard Worker  %vmovl.i.i = sext <2 x i32> %a to <2 x i64>
78*9880d681SAndroid Build Coastguard Worker  %vmovl.i2.i = sext <2 x i32> %b to <2 x i64>
79*9880d681SAndroid Build Coastguard Worker  %add.i = add <2 x i64> %vmovl.i.i, %vmovl.i2.i
80*9880d681SAndroid Build Coastguard Worker  ret <2 x i64> %add.i
81*9880d681SAndroid Build Coastguard Worker}
82*9880d681SAndroid Build Coastguard Worker
83*9880d681SAndroid Build Coastguard Workerdefine <8 x i16> @test_vaddl_u8(<8 x i8> %a, <8 x i8> %b) {
84*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_vaddl_u8:
85*9880d681SAndroid Build Coastguard Worker; CHECK: uaddl {{v[0-9]+}}.8h, {{v[0-9]+}}.8b, {{v[0-9]+}}.8b
86*9880d681SAndroid Build Coastguard Workerentry:
87*9880d681SAndroid Build Coastguard Worker  %vmovl.i.i = zext <8 x i8> %a to <8 x i16>
88*9880d681SAndroid Build Coastguard Worker  %vmovl.i2.i = zext <8 x i8> %b to <8 x i16>
89*9880d681SAndroid Build Coastguard Worker  %add.i = add <8 x i16> %vmovl.i.i, %vmovl.i2.i
90*9880d681SAndroid Build Coastguard Worker  ret <8 x i16> %add.i
91*9880d681SAndroid Build Coastguard Worker}
92*9880d681SAndroid Build Coastguard Worker
93*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @test_vaddl_u16(<4 x i16> %a, <4 x i16> %b) {
94*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_vaddl_u16:
95*9880d681SAndroid Build Coastguard Worker; CHECK: uaddl {{v[0-9]+}}.4s, {{v[0-9]+}}.4h, {{v[0-9]+}}.4h
96*9880d681SAndroid Build Coastguard Workerentry:
97*9880d681SAndroid Build Coastguard Worker  %vmovl.i.i = zext <4 x i16> %a to <4 x i32>
98*9880d681SAndroid Build Coastguard Worker  %vmovl.i2.i = zext <4 x i16> %b to <4 x i32>
99*9880d681SAndroid Build Coastguard Worker  %add.i = add <4 x i32> %vmovl.i.i, %vmovl.i2.i
100*9880d681SAndroid Build Coastguard Worker  ret <4 x i32> %add.i
101*9880d681SAndroid Build Coastguard Worker}
102*9880d681SAndroid Build Coastguard Worker
103*9880d681SAndroid Build Coastguard Workerdefine <2 x i64> @test_vaddl_u32(<2 x i32> %a, <2 x i32> %b) {
104*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_vaddl_u32:
105*9880d681SAndroid Build Coastguard Worker; CHECK: uaddl {{v[0-9]+}}.2d, {{v[0-9]+}}.2s, {{v[0-9]+}}.2s
106*9880d681SAndroid Build Coastguard Workerentry:
107*9880d681SAndroid Build Coastguard Worker  %vmovl.i.i = zext <2 x i32> %a to <2 x i64>
108*9880d681SAndroid Build Coastguard Worker  %vmovl.i2.i = zext <2 x i32> %b to <2 x i64>
109*9880d681SAndroid Build Coastguard Worker  %add.i = add <2 x i64> %vmovl.i.i, %vmovl.i2.i
110*9880d681SAndroid Build Coastguard Worker  ret <2 x i64> %add.i
111*9880d681SAndroid Build Coastguard Worker}
112*9880d681SAndroid Build Coastguard Worker
113*9880d681SAndroid Build Coastguard Workerdefine <8 x i16> @test_vaddl_high_s8(<16 x i8> %a, <16 x i8> %b) {
114*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_vaddl_high_s8:
115*9880d681SAndroid Build Coastguard Worker; CHECK: saddl2 {{v[0-9]+}}.8h, {{v[0-9]+}}.16b, {{v[0-9]+}}.16b
116*9880d681SAndroid Build Coastguard Workerentry:
117*9880d681SAndroid Build Coastguard Worker  %shuffle.i.i.i = shufflevector <16 x i8> %a, <16 x i8> undef, <8 x i32> <i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15>
118*9880d681SAndroid Build Coastguard Worker  %0 = sext <8 x i8> %shuffle.i.i.i to <8 x i16>
119*9880d681SAndroid Build Coastguard Worker  %shuffle.i.i2.i = shufflevector <16 x i8> %b, <16 x i8> undef, <8 x i32> <i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15>
120*9880d681SAndroid Build Coastguard Worker  %1 = sext <8 x i8> %shuffle.i.i2.i to <8 x i16>
121*9880d681SAndroid Build Coastguard Worker  %add.i = add <8 x i16> %0, %1
122*9880d681SAndroid Build Coastguard Worker  ret <8 x i16> %add.i
123*9880d681SAndroid Build Coastguard Worker}
124*9880d681SAndroid Build Coastguard Worker
125*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @test_vaddl_high_s16(<8 x i16> %a, <8 x i16> %b) {
126*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_vaddl_high_s16:
127*9880d681SAndroid Build Coastguard Worker; CHECK: saddl2 {{v[0-9]+}}.4s, {{v[0-9]+}}.8h, {{v[0-9]+}}.8h
128*9880d681SAndroid Build Coastguard Workerentry:
129*9880d681SAndroid Build Coastguard Worker  %shuffle.i.i.i = shufflevector <8 x i16> %a, <8 x i16> undef, <4 x i32> <i32 4, i32 5, i32 6, i32 7>
130*9880d681SAndroid Build Coastguard Worker  %0 = sext <4 x i16> %shuffle.i.i.i to <4 x i32>
131*9880d681SAndroid Build Coastguard Worker  %shuffle.i.i2.i = shufflevector <8 x i16> %b, <8 x i16> undef, <4 x i32> <i32 4, i32 5, i32 6, i32 7>
132*9880d681SAndroid Build Coastguard Worker  %1 = sext <4 x i16> %shuffle.i.i2.i to <4 x i32>
133*9880d681SAndroid Build Coastguard Worker  %add.i = add <4 x i32> %0, %1
134*9880d681SAndroid Build Coastguard Worker  ret <4 x i32> %add.i
135*9880d681SAndroid Build Coastguard Worker}
136*9880d681SAndroid Build Coastguard Worker
137*9880d681SAndroid Build Coastguard Workerdefine <2 x i64> @test_vaddl_high_s32(<4 x i32> %a, <4 x i32> %b) {
138*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_vaddl_high_s32:
139*9880d681SAndroid Build Coastguard Worker; CHECK: saddl2 {{v[0-9]+}}.2d, {{v[0-9]+}}.4s, {{v[0-9]+}}.4s
140*9880d681SAndroid Build Coastguard Workerentry:
141*9880d681SAndroid Build Coastguard Worker  %shuffle.i.i.i = shufflevector <4 x i32> %a, <4 x i32> undef, <2 x i32> <i32 2, i32 3>
142*9880d681SAndroid Build Coastguard Worker  %0 = sext <2 x i32> %shuffle.i.i.i to <2 x i64>
143*9880d681SAndroid Build Coastguard Worker  %shuffle.i.i2.i = shufflevector <4 x i32> %b, <4 x i32> undef, <2 x i32> <i32 2, i32 3>
144*9880d681SAndroid Build Coastguard Worker  %1 = sext <2 x i32> %shuffle.i.i2.i to <2 x i64>
145*9880d681SAndroid Build Coastguard Worker  %add.i = add <2 x i64> %0, %1
146*9880d681SAndroid Build Coastguard Worker  ret <2 x i64> %add.i
147*9880d681SAndroid Build Coastguard Worker}
148*9880d681SAndroid Build Coastguard Worker
149*9880d681SAndroid Build Coastguard Workerdefine <8 x i16> @test_vaddl_high_u8(<16 x i8> %a, <16 x i8> %b) {
150*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_vaddl_high_u8:
151*9880d681SAndroid Build Coastguard Worker; CHECK: uaddl2 {{v[0-9]+}}.8h, {{v[0-9]+}}.16b, {{v[0-9]+}}.16b
152*9880d681SAndroid Build Coastguard Workerentry:
153*9880d681SAndroid Build Coastguard Worker  %shuffle.i.i.i = shufflevector <16 x i8> %a, <16 x i8> undef, <8 x i32> <i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15>
154*9880d681SAndroid Build Coastguard Worker  %0 = zext <8 x i8> %shuffle.i.i.i to <8 x i16>
155*9880d681SAndroid Build Coastguard Worker  %shuffle.i.i2.i = shufflevector <16 x i8> %b, <16 x i8> undef, <8 x i32> <i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15>
156*9880d681SAndroid Build Coastguard Worker  %1 = zext <8 x i8> %shuffle.i.i2.i to <8 x i16>
157*9880d681SAndroid Build Coastguard Worker  %add.i = add <8 x i16> %0, %1
158*9880d681SAndroid Build Coastguard Worker  ret <8 x i16> %add.i
159*9880d681SAndroid Build Coastguard Worker}
160*9880d681SAndroid Build Coastguard Worker
161*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @test_vaddl_high_u16(<8 x i16> %a, <8 x i16> %b) {
162*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_vaddl_high_u16:
163*9880d681SAndroid Build Coastguard Worker; CHECK: uaddl2 {{v[0-9]+}}.4s, {{v[0-9]+}}.8h, {{v[0-9]+}}.8h
164*9880d681SAndroid Build Coastguard Workerentry:
165*9880d681SAndroid Build Coastguard Worker  %shuffle.i.i.i = shufflevector <8 x i16> %a, <8 x i16> undef, <4 x i32> <i32 4, i32 5, i32 6, i32 7>
166*9880d681SAndroid Build Coastguard Worker  %0 = zext <4 x i16> %shuffle.i.i.i to <4 x i32>
167*9880d681SAndroid Build Coastguard Worker  %shuffle.i.i2.i = shufflevector <8 x i16> %b, <8 x i16> undef, <4 x i32> <i32 4, i32 5, i32 6, i32 7>
168*9880d681SAndroid Build Coastguard Worker  %1 = zext <4 x i16> %shuffle.i.i2.i to <4 x i32>
169*9880d681SAndroid Build Coastguard Worker  %add.i = add <4 x i32> %0, %1
170*9880d681SAndroid Build Coastguard Worker  ret <4 x i32> %add.i
171*9880d681SAndroid Build Coastguard Worker}
172*9880d681SAndroid Build Coastguard Worker
173*9880d681SAndroid Build Coastguard Workerdefine <2 x i64> @test_vaddl_high_u32(<4 x i32> %a, <4 x i32> %b) {
174*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_vaddl_high_u32:
175*9880d681SAndroid Build Coastguard Worker; CHECK: uaddl2 {{v[0-9]+}}.2d, {{v[0-9]+}}.4s, {{v[0-9]+}}.4s
176*9880d681SAndroid Build Coastguard Workerentry:
177*9880d681SAndroid Build Coastguard Worker  %shuffle.i.i.i = shufflevector <4 x i32> %a, <4 x i32> undef, <2 x i32> <i32 2, i32 3>
178*9880d681SAndroid Build Coastguard Worker  %0 = zext <2 x i32> %shuffle.i.i.i to <2 x i64>
179*9880d681SAndroid Build Coastguard Worker  %shuffle.i.i2.i = shufflevector <4 x i32> %b, <4 x i32> undef, <2 x i32> <i32 2, i32 3>
180*9880d681SAndroid Build Coastguard Worker  %1 = zext <2 x i32> %shuffle.i.i2.i to <2 x i64>
181*9880d681SAndroid Build Coastguard Worker  %add.i = add <2 x i64> %0, %1
182*9880d681SAndroid Build Coastguard Worker  ret <2 x i64> %add.i
183*9880d681SAndroid Build Coastguard Worker}
184*9880d681SAndroid Build Coastguard Worker
185*9880d681SAndroid Build Coastguard Workerdefine <8 x i16> @test_vaddw_s8(<8 x i16> %a, <8 x i8> %b) {
186*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_vaddw_s8:
187*9880d681SAndroid Build Coastguard Worker; CHECK: saddw {{v[0-9]+}}.8h, {{v[0-9]+}}.8h, {{v[0-9]+}}.8b
188*9880d681SAndroid Build Coastguard Workerentry:
189*9880d681SAndroid Build Coastguard Worker  %vmovl.i.i = sext <8 x i8> %b to <8 x i16>
190*9880d681SAndroid Build Coastguard Worker  %add.i = add <8 x i16> %vmovl.i.i, %a
191*9880d681SAndroid Build Coastguard Worker  ret <8 x i16> %add.i
192*9880d681SAndroid Build Coastguard Worker}
193*9880d681SAndroid Build Coastguard Worker
194*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @test_vaddw_s16(<4 x i32> %a, <4 x i16> %b) {
195*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_vaddw_s16:
196*9880d681SAndroid Build Coastguard Worker; CHECK: saddw {{v[0-9]+}}.4s, {{v[0-9]+}}.4s, {{v[0-9]+}}.4h
197*9880d681SAndroid Build Coastguard Workerentry:
198*9880d681SAndroid Build Coastguard Worker  %vmovl.i.i = sext <4 x i16> %b to <4 x i32>
199*9880d681SAndroid Build Coastguard Worker  %add.i = add <4 x i32> %vmovl.i.i, %a
200*9880d681SAndroid Build Coastguard Worker  ret <4 x i32> %add.i
201*9880d681SAndroid Build Coastguard Worker}
202*9880d681SAndroid Build Coastguard Worker
203*9880d681SAndroid Build Coastguard Workerdefine <2 x i64> @test_vaddw_s32(<2 x i64> %a, <2 x i32> %b) {
204*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_vaddw_s32:
205*9880d681SAndroid Build Coastguard Worker; CHECK: saddw {{v[0-9]+}}.2d, {{v[0-9]+}}.2d, {{v[0-9]+}}.2s
206*9880d681SAndroid Build Coastguard Workerentry:
207*9880d681SAndroid Build Coastguard Worker  %vmovl.i.i = sext <2 x i32> %b to <2 x i64>
208*9880d681SAndroid Build Coastguard Worker  %add.i = add <2 x i64> %vmovl.i.i, %a
209*9880d681SAndroid Build Coastguard Worker  ret <2 x i64> %add.i
210*9880d681SAndroid Build Coastguard Worker}
211*9880d681SAndroid Build Coastguard Worker
212*9880d681SAndroid Build Coastguard Workerdefine <8 x i16> @test_vaddw_u8(<8 x i16> %a, <8 x i8> %b) {
213*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_vaddw_u8:
214*9880d681SAndroid Build Coastguard Worker; CHECK: uaddw {{v[0-9]+}}.8h, {{v[0-9]+}}.8h, {{v[0-9]+}}.8b
215*9880d681SAndroid Build Coastguard Workerentry:
216*9880d681SAndroid Build Coastguard Worker  %vmovl.i.i = zext <8 x i8> %b to <8 x i16>
217*9880d681SAndroid Build Coastguard Worker  %add.i = add <8 x i16> %vmovl.i.i, %a
218*9880d681SAndroid Build Coastguard Worker  ret <8 x i16> %add.i
219*9880d681SAndroid Build Coastguard Worker}
220*9880d681SAndroid Build Coastguard Worker
221*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @test_vaddw_u16(<4 x i32> %a, <4 x i16> %b) {
222*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_vaddw_u16:
223*9880d681SAndroid Build Coastguard Worker; CHECK: uaddw {{v[0-9]+}}.4s, {{v[0-9]+}}.4s, {{v[0-9]+}}.4h
224*9880d681SAndroid Build Coastguard Workerentry:
225*9880d681SAndroid Build Coastguard Worker  %vmovl.i.i = zext <4 x i16> %b to <4 x i32>
226*9880d681SAndroid Build Coastguard Worker  %add.i = add <4 x i32> %vmovl.i.i, %a
227*9880d681SAndroid Build Coastguard Worker  ret <4 x i32> %add.i
228*9880d681SAndroid Build Coastguard Worker}
229*9880d681SAndroid Build Coastguard Worker
230*9880d681SAndroid Build Coastguard Workerdefine <2 x i64> @test_vaddw_u32(<2 x i64> %a, <2 x i32> %b) {
231*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_vaddw_u32:
232*9880d681SAndroid Build Coastguard Worker; CHECK: uaddw {{v[0-9]+}}.2d, {{v[0-9]+}}.2d, {{v[0-9]+}}.2s
233*9880d681SAndroid Build Coastguard Workerentry:
234*9880d681SAndroid Build Coastguard Worker  %vmovl.i.i = zext <2 x i32> %b to <2 x i64>
235*9880d681SAndroid Build Coastguard Worker  %add.i = add <2 x i64> %vmovl.i.i, %a
236*9880d681SAndroid Build Coastguard Worker  ret <2 x i64> %add.i
237*9880d681SAndroid Build Coastguard Worker}
238*9880d681SAndroid Build Coastguard Worker
239*9880d681SAndroid Build Coastguard Workerdefine <8 x i16> @test_vaddw_high_s8(<8 x i16> %a, <16 x i8> %b) {
240*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_vaddw_high_s8:
241*9880d681SAndroid Build Coastguard Worker; CHECK: saddw2 {{v[0-9]+}}.8h, {{v[0-9]+}}.8h, {{v[0-9]+}}.16b
242*9880d681SAndroid Build Coastguard Workerentry:
243*9880d681SAndroid Build Coastguard Worker  %shuffle.i.i.i = shufflevector <16 x i8> %b, <16 x i8> undef, <8 x i32> <i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15>
244*9880d681SAndroid Build Coastguard Worker  %0 = sext <8 x i8> %shuffle.i.i.i to <8 x i16>
245*9880d681SAndroid Build Coastguard Worker  %add.i = add <8 x i16> %0, %a
246*9880d681SAndroid Build Coastguard Worker  ret <8 x i16> %add.i
247*9880d681SAndroid Build Coastguard Worker}
248*9880d681SAndroid Build Coastguard Worker
249*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @test_vaddw_high_s16(<4 x i32> %a, <8 x i16> %b) {
250*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_vaddw_high_s16:
251*9880d681SAndroid Build Coastguard Worker; CHECK: saddw2 {{v[0-9]+}}.4s, {{v[0-9]+}}.4s, {{v[0-9]+}}.8h
252*9880d681SAndroid Build Coastguard Workerentry:
253*9880d681SAndroid Build Coastguard Worker  %shuffle.i.i.i = shufflevector <8 x i16> %b, <8 x i16> undef, <4 x i32> <i32 4, i32 5, i32 6, i32 7>
254*9880d681SAndroid Build Coastguard Worker  %0 = sext <4 x i16> %shuffle.i.i.i to <4 x i32>
255*9880d681SAndroid Build Coastguard Worker  %add.i = add <4 x i32> %0, %a
256*9880d681SAndroid Build Coastguard Worker  ret <4 x i32> %add.i
257*9880d681SAndroid Build Coastguard Worker}
258*9880d681SAndroid Build Coastguard Worker
259*9880d681SAndroid Build Coastguard Workerdefine <2 x i64> @test_vaddw_high_s32(<2 x i64> %a, <4 x i32> %b) {
260*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_vaddw_high_s32:
261*9880d681SAndroid Build Coastguard Worker; CHECK: saddw2 {{v[0-9]+}}.2d, {{v[0-9]+}}.2d, {{v[0-9]+}}.4s
262*9880d681SAndroid Build Coastguard Workerentry:
263*9880d681SAndroid Build Coastguard Worker  %shuffle.i.i.i = shufflevector <4 x i32> %b, <4 x i32> undef, <2 x i32> <i32 2, i32 3>
264*9880d681SAndroid Build Coastguard Worker  %0 = sext <2 x i32> %shuffle.i.i.i to <2 x i64>
265*9880d681SAndroid Build Coastguard Worker  %add.i = add <2 x i64> %0, %a
266*9880d681SAndroid Build Coastguard Worker  ret <2 x i64> %add.i
267*9880d681SAndroid Build Coastguard Worker}
268*9880d681SAndroid Build Coastguard Worker
269*9880d681SAndroid Build Coastguard Workerdefine <8 x i16> @test_vaddw_high_u8(<8 x i16> %a, <16 x i8> %b) {
270*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_vaddw_high_u8:
271*9880d681SAndroid Build Coastguard Worker; CHECK: uaddw2 {{v[0-9]+}}.8h, {{v[0-9]+}}.8h, {{v[0-9]+}}.16b
272*9880d681SAndroid Build Coastguard Workerentry:
273*9880d681SAndroid Build Coastguard Worker  %shuffle.i.i.i = shufflevector <16 x i8> %b, <16 x i8> undef, <8 x i32> <i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15>
274*9880d681SAndroid Build Coastguard Worker  %0 = zext <8 x i8> %shuffle.i.i.i to <8 x i16>
275*9880d681SAndroid Build Coastguard Worker  %add.i = add <8 x i16> %0, %a
276*9880d681SAndroid Build Coastguard Worker  ret <8 x i16> %add.i
277*9880d681SAndroid Build Coastguard Worker}
278*9880d681SAndroid Build Coastguard Worker
279*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @test_vaddw_high_u16(<4 x i32> %a, <8 x i16> %b) {
280*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_vaddw_high_u16:
281*9880d681SAndroid Build Coastguard Worker; CHECK: uaddw2 {{v[0-9]+}}.4s, {{v[0-9]+}}.4s, {{v[0-9]+}}.8h
282*9880d681SAndroid Build Coastguard Workerentry:
283*9880d681SAndroid Build Coastguard Worker  %shuffle.i.i.i = shufflevector <8 x i16> %b, <8 x i16> undef, <4 x i32> <i32 4, i32 5, i32 6, i32 7>
284*9880d681SAndroid Build Coastguard Worker  %0 = zext <4 x i16> %shuffle.i.i.i to <4 x i32>
285*9880d681SAndroid Build Coastguard Worker  %add.i = add <4 x i32> %0, %a
286*9880d681SAndroid Build Coastguard Worker  ret <4 x i32> %add.i
287*9880d681SAndroid Build Coastguard Worker}
288*9880d681SAndroid Build Coastguard Worker
289*9880d681SAndroid Build Coastguard Workerdefine <2 x i64> @test_vaddw_high_u32(<2 x i64> %a, <4 x i32> %b) {
290*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_vaddw_high_u32:
291*9880d681SAndroid Build Coastguard Worker; CHECK: uaddw2 {{v[0-9]+}}.2d, {{v[0-9]+}}.2d, {{v[0-9]+}}.4s
292*9880d681SAndroid Build Coastguard Workerentry:
293*9880d681SAndroid Build Coastguard Worker  %shuffle.i.i.i = shufflevector <4 x i32> %b, <4 x i32> undef, <2 x i32> <i32 2, i32 3>
294*9880d681SAndroid Build Coastguard Worker  %0 = zext <2 x i32> %shuffle.i.i.i to <2 x i64>
295*9880d681SAndroid Build Coastguard Worker  %add.i = add <2 x i64> %0, %a
296*9880d681SAndroid Build Coastguard Worker  ret <2 x i64> %add.i
297*9880d681SAndroid Build Coastguard Worker}
298*9880d681SAndroid Build Coastguard Worker
299*9880d681SAndroid Build Coastguard Workerdefine <8 x i16> @test_vsubl_s8(<8 x i8> %a, <8 x i8> %b) {
300*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_vsubl_s8:
301*9880d681SAndroid Build Coastguard Worker; CHECK: ssubl {{v[0-9]+}}.8h, {{v[0-9]+}}.8b, {{v[0-9]+}}.8b
302*9880d681SAndroid Build Coastguard Workerentry:
303*9880d681SAndroid Build Coastguard Worker  %vmovl.i.i = sext <8 x i8> %a to <8 x i16>
304*9880d681SAndroid Build Coastguard Worker  %vmovl.i2.i = sext <8 x i8> %b to <8 x i16>
305*9880d681SAndroid Build Coastguard Worker  %sub.i = sub <8 x i16> %vmovl.i.i, %vmovl.i2.i
306*9880d681SAndroid Build Coastguard Worker  ret <8 x i16> %sub.i
307*9880d681SAndroid Build Coastguard Worker}
308*9880d681SAndroid Build Coastguard Worker
309*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @test_vsubl_s16(<4 x i16> %a, <4 x i16> %b) {
310*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_vsubl_s16:
311*9880d681SAndroid Build Coastguard Worker; CHECK: ssubl {{v[0-9]+}}.4s, {{v[0-9]+}}.4h, {{v[0-9]+}}.4h
312*9880d681SAndroid Build Coastguard Workerentry:
313*9880d681SAndroid Build Coastguard Worker  %vmovl.i.i = sext <4 x i16> %a to <4 x i32>
314*9880d681SAndroid Build Coastguard Worker  %vmovl.i2.i = sext <4 x i16> %b to <4 x i32>
315*9880d681SAndroid Build Coastguard Worker  %sub.i = sub <4 x i32> %vmovl.i.i, %vmovl.i2.i
316*9880d681SAndroid Build Coastguard Worker  ret <4 x i32> %sub.i
317*9880d681SAndroid Build Coastguard Worker}
318*9880d681SAndroid Build Coastguard Worker
319*9880d681SAndroid Build Coastguard Workerdefine <2 x i64> @test_vsubl_s32(<2 x i32> %a, <2 x i32> %b) {
320*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_vsubl_s32:
321*9880d681SAndroid Build Coastguard Worker; CHECK: ssubl {{v[0-9]+}}.2d, {{v[0-9]+}}.2s, {{v[0-9]+}}.2s
322*9880d681SAndroid Build Coastguard Workerentry:
323*9880d681SAndroid Build Coastguard Worker  %vmovl.i.i = sext <2 x i32> %a to <2 x i64>
324*9880d681SAndroid Build Coastguard Worker  %vmovl.i2.i = sext <2 x i32> %b to <2 x i64>
325*9880d681SAndroid Build Coastguard Worker  %sub.i = sub <2 x i64> %vmovl.i.i, %vmovl.i2.i
326*9880d681SAndroid Build Coastguard Worker  ret <2 x i64> %sub.i
327*9880d681SAndroid Build Coastguard Worker}
328*9880d681SAndroid Build Coastguard Worker
329*9880d681SAndroid Build Coastguard Workerdefine <8 x i16> @test_vsubl_u8(<8 x i8> %a, <8 x i8> %b) {
330*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_vsubl_u8:
331*9880d681SAndroid Build Coastguard Worker; CHECK: usubl {{v[0-9]+}}.8h, {{v[0-9]+}}.8b, {{v[0-9]+}}.8b
332*9880d681SAndroid Build Coastguard Workerentry:
333*9880d681SAndroid Build Coastguard Worker  %vmovl.i.i = zext <8 x i8> %a to <8 x i16>
334*9880d681SAndroid Build Coastguard Worker  %vmovl.i2.i = zext <8 x i8> %b to <8 x i16>
335*9880d681SAndroid Build Coastguard Worker  %sub.i = sub <8 x i16> %vmovl.i.i, %vmovl.i2.i
336*9880d681SAndroid Build Coastguard Worker  ret <8 x i16> %sub.i
337*9880d681SAndroid Build Coastguard Worker}
338*9880d681SAndroid Build Coastguard Worker
339*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @test_vsubl_u16(<4 x i16> %a, <4 x i16> %b) {
340*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_vsubl_u16:
341*9880d681SAndroid Build Coastguard Worker; CHECK: usubl {{v[0-9]+}}.4s, {{v[0-9]+}}.4h, {{v[0-9]+}}.4h
342*9880d681SAndroid Build Coastguard Workerentry:
343*9880d681SAndroid Build Coastguard Worker  %vmovl.i.i = zext <4 x i16> %a to <4 x i32>
344*9880d681SAndroid Build Coastguard Worker  %vmovl.i2.i = zext <4 x i16> %b to <4 x i32>
345*9880d681SAndroid Build Coastguard Worker  %sub.i = sub <4 x i32> %vmovl.i.i, %vmovl.i2.i
346*9880d681SAndroid Build Coastguard Worker  ret <4 x i32> %sub.i
347*9880d681SAndroid Build Coastguard Worker}
348*9880d681SAndroid Build Coastguard Worker
349*9880d681SAndroid Build Coastguard Workerdefine <2 x i64> @test_vsubl_u32(<2 x i32> %a, <2 x i32> %b) {
350*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_vsubl_u32:
351*9880d681SAndroid Build Coastguard Worker; CHECK: usubl {{v[0-9]+}}.2d, {{v[0-9]+}}.2s, {{v[0-9]+}}.2s
352*9880d681SAndroid Build Coastguard Workerentry:
353*9880d681SAndroid Build Coastguard Worker  %vmovl.i.i = zext <2 x i32> %a to <2 x i64>
354*9880d681SAndroid Build Coastguard Worker  %vmovl.i2.i = zext <2 x i32> %b to <2 x i64>
355*9880d681SAndroid Build Coastguard Worker  %sub.i = sub <2 x i64> %vmovl.i.i, %vmovl.i2.i
356*9880d681SAndroid Build Coastguard Worker  ret <2 x i64> %sub.i
357*9880d681SAndroid Build Coastguard Worker}
358*9880d681SAndroid Build Coastguard Worker
359*9880d681SAndroid Build Coastguard Workerdefine <8 x i16> @test_vsubl_high_s8(<16 x i8> %a, <16 x i8> %b) {
360*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_vsubl_high_s8:
361*9880d681SAndroid Build Coastguard Worker; CHECK: ssubl2 {{v[0-9]+}}.8h, {{v[0-9]+}}.16b, {{v[0-9]+}}.16b
362*9880d681SAndroid Build Coastguard Workerentry:
363*9880d681SAndroid Build Coastguard Worker  %shuffle.i.i.i = shufflevector <16 x i8> %a, <16 x i8> undef, <8 x i32> <i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15>
364*9880d681SAndroid Build Coastguard Worker  %0 = sext <8 x i8> %shuffle.i.i.i to <8 x i16>
365*9880d681SAndroid Build Coastguard Worker  %shuffle.i.i2.i = shufflevector <16 x i8> %b, <16 x i8> undef, <8 x i32> <i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15>
366*9880d681SAndroid Build Coastguard Worker  %1 = sext <8 x i8> %shuffle.i.i2.i to <8 x i16>
367*9880d681SAndroid Build Coastguard Worker  %sub.i = sub <8 x i16> %0, %1
368*9880d681SAndroid Build Coastguard Worker  ret <8 x i16> %sub.i
369*9880d681SAndroid Build Coastguard Worker}
370*9880d681SAndroid Build Coastguard Worker
371*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @test_vsubl_high_s16(<8 x i16> %a, <8 x i16> %b) {
372*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_vsubl_high_s16:
373*9880d681SAndroid Build Coastguard Worker; CHECK: ssubl2 {{v[0-9]+}}.4s, {{v[0-9]+}}.8h, {{v[0-9]+}}.8h
374*9880d681SAndroid Build Coastguard Workerentry:
375*9880d681SAndroid Build Coastguard Worker  %shuffle.i.i.i = shufflevector <8 x i16> %a, <8 x i16> undef, <4 x i32> <i32 4, i32 5, i32 6, i32 7>
376*9880d681SAndroid Build Coastguard Worker  %0 = sext <4 x i16> %shuffle.i.i.i to <4 x i32>
377*9880d681SAndroid Build Coastguard Worker  %shuffle.i.i2.i = shufflevector <8 x i16> %b, <8 x i16> undef, <4 x i32> <i32 4, i32 5, i32 6, i32 7>
378*9880d681SAndroid Build Coastguard Worker  %1 = sext <4 x i16> %shuffle.i.i2.i to <4 x i32>
379*9880d681SAndroid Build Coastguard Worker  %sub.i = sub <4 x i32> %0, %1
380*9880d681SAndroid Build Coastguard Worker  ret <4 x i32> %sub.i
381*9880d681SAndroid Build Coastguard Worker}
382*9880d681SAndroid Build Coastguard Worker
383*9880d681SAndroid Build Coastguard Workerdefine <2 x i64> @test_vsubl_high_s32(<4 x i32> %a, <4 x i32> %b) {
384*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_vsubl_high_s32:
385*9880d681SAndroid Build Coastguard Worker; CHECK: ssubl2 {{v[0-9]+}}.2d, {{v[0-9]+}}.4s, {{v[0-9]+}}.4s
386*9880d681SAndroid Build Coastguard Workerentry:
387*9880d681SAndroid Build Coastguard Worker  %shuffle.i.i.i = shufflevector <4 x i32> %a, <4 x i32> undef, <2 x i32> <i32 2, i32 3>
388*9880d681SAndroid Build Coastguard Worker  %0 = sext <2 x i32> %shuffle.i.i.i to <2 x i64>
389*9880d681SAndroid Build Coastguard Worker  %shuffle.i.i2.i = shufflevector <4 x i32> %b, <4 x i32> undef, <2 x i32> <i32 2, i32 3>
390*9880d681SAndroid Build Coastguard Worker  %1 = sext <2 x i32> %shuffle.i.i2.i to <2 x i64>
391*9880d681SAndroid Build Coastguard Worker  %sub.i = sub <2 x i64> %0, %1
392*9880d681SAndroid Build Coastguard Worker  ret <2 x i64> %sub.i
393*9880d681SAndroid Build Coastguard Worker}
394*9880d681SAndroid Build Coastguard Worker
395*9880d681SAndroid Build Coastguard Workerdefine <8 x i16> @test_vsubl_high_u8(<16 x i8> %a, <16 x i8> %b) {
396*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_vsubl_high_u8:
397*9880d681SAndroid Build Coastguard Worker; CHECK: usubl2 {{v[0-9]+}}.8h, {{v[0-9]+}}.16b, {{v[0-9]+}}.16b
398*9880d681SAndroid Build Coastguard Workerentry:
399*9880d681SAndroid Build Coastguard Worker  %shuffle.i.i.i = shufflevector <16 x i8> %a, <16 x i8> undef, <8 x i32> <i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15>
400*9880d681SAndroid Build Coastguard Worker  %0 = zext <8 x i8> %shuffle.i.i.i to <8 x i16>
401*9880d681SAndroid Build Coastguard Worker  %shuffle.i.i2.i = shufflevector <16 x i8> %b, <16 x i8> undef, <8 x i32> <i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15>
402*9880d681SAndroid Build Coastguard Worker  %1 = zext <8 x i8> %shuffle.i.i2.i to <8 x i16>
403*9880d681SAndroid Build Coastguard Worker  %sub.i = sub <8 x i16> %0, %1
404*9880d681SAndroid Build Coastguard Worker  ret <8 x i16> %sub.i
405*9880d681SAndroid Build Coastguard Worker}
406*9880d681SAndroid Build Coastguard Worker
407*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @test_vsubl_high_u16(<8 x i16> %a, <8 x i16> %b) {
408*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_vsubl_high_u16:
409*9880d681SAndroid Build Coastguard Worker; CHECK: usubl2 {{v[0-9]+}}.4s, {{v[0-9]+}}.8h, {{v[0-9]+}}.8h
410*9880d681SAndroid Build Coastguard Workerentry:
411*9880d681SAndroid Build Coastguard Worker  %shuffle.i.i.i = shufflevector <8 x i16> %a, <8 x i16> undef, <4 x i32> <i32 4, i32 5, i32 6, i32 7>
412*9880d681SAndroid Build Coastguard Worker  %0 = zext <4 x i16> %shuffle.i.i.i to <4 x i32>
413*9880d681SAndroid Build Coastguard Worker  %shuffle.i.i2.i = shufflevector <8 x i16> %b, <8 x i16> undef, <4 x i32> <i32 4, i32 5, i32 6, i32 7>
414*9880d681SAndroid Build Coastguard Worker  %1 = zext <4 x i16> %shuffle.i.i2.i to <4 x i32>
415*9880d681SAndroid Build Coastguard Worker  %sub.i = sub <4 x i32> %0, %1
416*9880d681SAndroid Build Coastguard Worker  ret <4 x i32> %sub.i
417*9880d681SAndroid Build Coastguard Worker}
418*9880d681SAndroid Build Coastguard Worker
419*9880d681SAndroid Build Coastguard Workerdefine <2 x i64> @test_vsubl_high_u32(<4 x i32> %a, <4 x i32> %b) {
420*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_vsubl_high_u32:
421*9880d681SAndroid Build Coastguard Worker; CHECK: usubl2 {{v[0-9]+}}.2d, {{v[0-9]+}}.4s, {{v[0-9]+}}.4s
422*9880d681SAndroid Build Coastguard Workerentry:
423*9880d681SAndroid Build Coastguard Worker  %shuffle.i.i.i = shufflevector <4 x i32> %a, <4 x i32> undef, <2 x i32> <i32 2, i32 3>
424*9880d681SAndroid Build Coastguard Worker  %0 = zext <2 x i32> %shuffle.i.i.i to <2 x i64>
425*9880d681SAndroid Build Coastguard Worker  %shuffle.i.i2.i = shufflevector <4 x i32> %b, <4 x i32> undef, <2 x i32> <i32 2, i32 3>
426*9880d681SAndroid Build Coastguard Worker  %1 = zext <2 x i32> %shuffle.i.i2.i to <2 x i64>
427*9880d681SAndroid Build Coastguard Worker  %sub.i = sub <2 x i64> %0, %1
428*9880d681SAndroid Build Coastguard Worker  ret <2 x i64> %sub.i
429*9880d681SAndroid Build Coastguard Worker}
430*9880d681SAndroid Build Coastguard Worker
431*9880d681SAndroid Build Coastguard Workerdefine <8 x i16> @test_vsubw_s8(<8 x i16> %a, <8 x i8> %b) {
432*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_vsubw_s8:
433*9880d681SAndroid Build Coastguard Worker; CHECK: ssubw {{v[0-9]+}}.8h, {{v[0-9]+}}.8h, {{v[0-9]+}}.8b
434*9880d681SAndroid Build Coastguard Workerentry:
435*9880d681SAndroid Build Coastguard Worker  %vmovl.i.i = sext <8 x i8> %b to <8 x i16>
436*9880d681SAndroid Build Coastguard Worker  %sub.i = sub <8 x i16> %a, %vmovl.i.i
437*9880d681SAndroid Build Coastguard Worker  ret <8 x i16> %sub.i
438*9880d681SAndroid Build Coastguard Worker}
439*9880d681SAndroid Build Coastguard Worker
440*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @test_vsubw_s16(<4 x i32> %a, <4 x i16> %b) {
441*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_vsubw_s16:
442*9880d681SAndroid Build Coastguard Worker; CHECK: ssubw {{v[0-9]+}}.4s, {{v[0-9]+}}.4s, {{v[0-9]+}}.4h
443*9880d681SAndroid Build Coastguard Workerentry:
444*9880d681SAndroid Build Coastguard Worker  %vmovl.i.i = sext <4 x i16> %b to <4 x i32>
445*9880d681SAndroid Build Coastguard Worker  %sub.i = sub <4 x i32> %a, %vmovl.i.i
446*9880d681SAndroid Build Coastguard Worker  ret <4 x i32> %sub.i
447*9880d681SAndroid Build Coastguard Worker}
448*9880d681SAndroid Build Coastguard Worker
449*9880d681SAndroid Build Coastguard Workerdefine <2 x i64> @test_vsubw_s32(<2 x i64> %a, <2 x i32> %b) {
450*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_vsubw_s32:
451*9880d681SAndroid Build Coastguard Worker; CHECK: ssubw {{v[0-9]+}}.2d, {{v[0-9]+}}.2d, {{v[0-9]+}}.2s
452*9880d681SAndroid Build Coastguard Workerentry:
453*9880d681SAndroid Build Coastguard Worker  %vmovl.i.i = sext <2 x i32> %b to <2 x i64>
454*9880d681SAndroid Build Coastguard Worker  %sub.i = sub <2 x i64> %a, %vmovl.i.i
455*9880d681SAndroid Build Coastguard Worker  ret <2 x i64> %sub.i
456*9880d681SAndroid Build Coastguard Worker}
457*9880d681SAndroid Build Coastguard Worker
458*9880d681SAndroid Build Coastguard Workerdefine <8 x i16> @test_vsubw_u8(<8 x i16> %a, <8 x i8> %b) {
459*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_vsubw_u8:
460*9880d681SAndroid Build Coastguard Worker; CHECK: usubw {{v[0-9]+}}.8h, {{v[0-9]+}}.8h, {{v[0-9]+}}.8b
461*9880d681SAndroid Build Coastguard Workerentry:
462*9880d681SAndroid Build Coastguard Worker  %vmovl.i.i = zext <8 x i8> %b to <8 x i16>
463*9880d681SAndroid Build Coastguard Worker  %sub.i = sub <8 x i16> %a, %vmovl.i.i
464*9880d681SAndroid Build Coastguard Worker  ret <8 x i16> %sub.i
465*9880d681SAndroid Build Coastguard Worker}
466*9880d681SAndroid Build Coastguard Worker
467*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @test_vsubw_u16(<4 x i32> %a, <4 x i16> %b) {
468*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_vsubw_u16:
469*9880d681SAndroid Build Coastguard Worker; CHECK: usubw {{v[0-9]+}}.4s, {{v[0-9]+}}.4s, {{v[0-9]+}}.4h
470*9880d681SAndroid Build Coastguard Workerentry:
471*9880d681SAndroid Build Coastguard Worker  %vmovl.i.i = zext <4 x i16> %b to <4 x i32>
472*9880d681SAndroid Build Coastguard Worker  %sub.i = sub <4 x i32> %a, %vmovl.i.i
473*9880d681SAndroid Build Coastguard Worker  ret <4 x i32> %sub.i
474*9880d681SAndroid Build Coastguard Worker}
475*9880d681SAndroid Build Coastguard Worker
476*9880d681SAndroid Build Coastguard Workerdefine <2 x i64> @test_vsubw_u32(<2 x i64> %a, <2 x i32> %b) {
477*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_vsubw_u32:
478*9880d681SAndroid Build Coastguard Worker; CHECK: usubw {{v[0-9]+}}.2d, {{v[0-9]+}}.2d, {{v[0-9]+}}.2s
479*9880d681SAndroid Build Coastguard Workerentry:
480*9880d681SAndroid Build Coastguard Worker  %vmovl.i.i = zext <2 x i32> %b to <2 x i64>
481*9880d681SAndroid Build Coastguard Worker  %sub.i = sub <2 x i64> %a, %vmovl.i.i
482*9880d681SAndroid Build Coastguard Worker  ret <2 x i64> %sub.i
483*9880d681SAndroid Build Coastguard Worker}
484*9880d681SAndroid Build Coastguard Worker
485*9880d681SAndroid Build Coastguard Workerdefine <8 x i16> @test_vsubw_high_s8(<8 x i16> %a, <16 x i8> %b) {
486*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_vsubw_high_s8:
487*9880d681SAndroid Build Coastguard Worker; CHECK: ssubw2 {{v[0-9]+}}.8h, {{v[0-9]+}}.8h, {{v[0-9]+}}.16b
488*9880d681SAndroid Build Coastguard Workerentry:
489*9880d681SAndroid Build Coastguard Worker  %shuffle.i.i.i = shufflevector <16 x i8> %b, <16 x i8> undef, <8 x i32> <i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15>
490*9880d681SAndroid Build Coastguard Worker  %0 = sext <8 x i8> %shuffle.i.i.i to <8 x i16>
491*9880d681SAndroid Build Coastguard Worker  %sub.i = sub <8 x i16> %a, %0
492*9880d681SAndroid Build Coastguard Worker  ret <8 x i16> %sub.i
493*9880d681SAndroid Build Coastguard Worker}
494*9880d681SAndroid Build Coastguard Worker
495*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @test_vsubw_high_s16(<4 x i32> %a, <8 x i16> %b) {
496*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_vsubw_high_s16:
497*9880d681SAndroid Build Coastguard Worker; CHECK: ssubw2 {{v[0-9]+}}.4s, {{v[0-9]+}}.4s, {{v[0-9]+}}.8h
498*9880d681SAndroid Build Coastguard Workerentry:
499*9880d681SAndroid Build Coastguard Worker  %shuffle.i.i.i = shufflevector <8 x i16> %b, <8 x i16> undef, <4 x i32> <i32 4, i32 5, i32 6, i32 7>
500*9880d681SAndroid Build Coastguard Worker  %0 = sext <4 x i16> %shuffle.i.i.i to <4 x i32>
501*9880d681SAndroid Build Coastguard Worker  %sub.i = sub <4 x i32> %a, %0
502*9880d681SAndroid Build Coastguard Worker  ret <4 x i32> %sub.i
503*9880d681SAndroid Build Coastguard Worker}
504*9880d681SAndroid Build Coastguard Worker
505*9880d681SAndroid Build Coastguard Workerdefine <2 x i64> @test_vsubw_high_s32(<2 x i64> %a, <4 x i32> %b) {
506*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_vsubw_high_s32:
507*9880d681SAndroid Build Coastguard Worker; CHECK: ssubw2 {{v[0-9]+}}.2d, {{v[0-9]+}}.2d, {{v[0-9]+}}.4s
508*9880d681SAndroid Build Coastguard Workerentry:
509*9880d681SAndroid Build Coastguard Worker  %shuffle.i.i.i = shufflevector <4 x i32> %b, <4 x i32> undef, <2 x i32> <i32 2, i32 3>
510*9880d681SAndroid Build Coastguard Worker  %0 = sext <2 x i32> %shuffle.i.i.i to <2 x i64>
511*9880d681SAndroid Build Coastguard Worker  %sub.i = sub <2 x i64> %a, %0
512*9880d681SAndroid Build Coastguard Worker  ret <2 x i64> %sub.i
513*9880d681SAndroid Build Coastguard Worker}
514*9880d681SAndroid Build Coastguard Worker
515*9880d681SAndroid Build Coastguard Workerdefine <8 x i16> @test_vsubw_high_u8(<8 x i16> %a, <16 x i8> %b) {
516*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_vsubw_high_u8:
517*9880d681SAndroid Build Coastguard Worker; CHECK: usubw2 {{v[0-9]+}}.8h, {{v[0-9]+}}.8h, {{v[0-9]+}}.16b
518*9880d681SAndroid Build Coastguard Workerentry:
519*9880d681SAndroid Build Coastguard Worker  %shuffle.i.i.i = shufflevector <16 x i8> %b, <16 x i8> undef, <8 x i32> <i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15>
520*9880d681SAndroid Build Coastguard Worker  %0 = zext <8 x i8> %shuffle.i.i.i to <8 x i16>
521*9880d681SAndroid Build Coastguard Worker  %sub.i = sub <8 x i16> %a, %0
522*9880d681SAndroid Build Coastguard Worker  ret <8 x i16> %sub.i
523*9880d681SAndroid Build Coastguard Worker}
524*9880d681SAndroid Build Coastguard Worker
525*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @test_vsubw_high_u16(<4 x i32> %a, <8 x i16> %b) {
526*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_vsubw_high_u16:
527*9880d681SAndroid Build Coastguard Worker; CHECK: usubw2 {{v[0-9]+}}.4s, {{v[0-9]+}}.4s, {{v[0-9]+}}.8h
528*9880d681SAndroid Build Coastguard Workerentry:
529*9880d681SAndroid Build Coastguard Worker  %shuffle.i.i.i = shufflevector <8 x i16> %b, <8 x i16> undef, <4 x i32> <i32 4, i32 5, i32 6, i32 7>
530*9880d681SAndroid Build Coastguard Worker  %0 = zext <4 x i16> %shuffle.i.i.i to <4 x i32>
531*9880d681SAndroid Build Coastguard Worker  %sub.i = sub <4 x i32> %a, %0
532*9880d681SAndroid Build Coastguard Worker  ret <4 x i32> %sub.i
533*9880d681SAndroid Build Coastguard Worker}
534*9880d681SAndroid Build Coastguard Worker
535*9880d681SAndroid Build Coastguard Workerdefine <2 x i64> @test_vsubw_high_u32(<2 x i64> %a, <4 x i32> %b) {
536*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_vsubw_high_u32:
537*9880d681SAndroid Build Coastguard Worker; CHECK: usubw2 {{v[0-9]+}}.2d, {{v[0-9]+}}.2d, {{v[0-9]+}}.4s
538*9880d681SAndroid Build Coastguard Workerentry:
539*9880d681SAndroid Build Coastguard Worker  %shuffle.i.i.i = shufflevector <4 x i32> %b, <4 x i32> undef, <2 x i32> <i32 2, i32 3>
540*9880d681SAndroid Build Coastguard Worker  %0 = zext <2 x i32> %shuffle.i.i.i to <2 x i64>
541*9880d681SAndroid Build Coastguard Worker  %sub.i = sub <2 x i64> %a, %0
542*9880d681SAndroid Build Coastguard Worker  ret <2 x i64> %sub.i
543*9880d681SAndroid Build Coastguard Worker}
544*9880d681SAndroid Build Coastguard Worker
545*9880d681SAndroid Build Coastguard Workerdefine <8 x i8> @test_vaddhn_s16(<8 x i16> %a, <8 x i16> %b) {
546*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_vaddhn_s16:
547*9880d681SAndroid Build Coastguard Worker; CHECK: addhn {{v[0-9]+}}.8b, {{v[0-9]+}}.8h, {{v[0-9]+}}.8h
548*9880d681SAndroid Build Coastguard Workerentry:
549*9880d681SAndroid Build Coastguard Worker  %vaddhn.i = add <8 x i16> %a, %b
550*9880d681SAndroid Build Coastguard Worker  %vaddhn1.i = lshr <8 x i16> %vaddhn.i, <i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8>
551*9880d681SAndroid Build Coastguard Worker  %vaddhn2.i = trunc <8 x i16> %vaddhn1.i to <8 x i8>
552*9880d681SAndroid Build Coastguard Worker  ret <8 x i8> %vaddhn2.i
553*9880d681SAndroid Build Coastguard Worker}
554*9880d681SAndroid Build Coastguard Worker
555*9880d681SAndroid Build Coastguard Workerdefine <4 x i16> @test_vaddhn_s32(<4 x i32> %a, <4 x i32> %b) {
556*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_vaddhn_s32:
557*9880d681SAndroid Build Coastguard Worker; CHECK: addhn {{v[0-9]+}}.4h, {{v[0-9]+}}.4s, {{v[0-9]+}}.4s
558*9880d681SAndroid Build Coastguard Workerentry:
559*9880d681SAndroid Build Coastguard Worker  %vaddhn.i = add <4 x i32> %a, %b
560*9880d681SAndroid Build Coastguard Worker  %vaddhn1.i = lshr <4 x i32> %vaddhn.i, <i32 16, i32 16, i32 16, i32 16>
561*9880d681SAndroid Build Coastguard Worker  %vaddhn2.i = trunc <4 x i32> %vaddhn1.i to <4 x i16>
562*9880d681SAndroid Build Coastguard Worker  ret <4 x i16> %vaddhn2.i
563*9880d681SAndroid Build Coastguard Worker}
564*9880d681SAndroid Build Coastguard Worker
565*9880d681SAndroid Build Coastguard Workerdefine <2 x i32> @test_vaddhn_s64(<2 x i64> %a, <2 x i64> %b) {
566*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_vaddhn_s64:
567*9880d681SAndroid Build Coastguard Worker; CHECK: addhn {{v[0-9]+}}.2s, {{v[0-9]+}}.2d, {{v[0-9]+}}.2d
568*9880d681SAndroid Build Coastguard Workerentry:
569*9880d681SAndroid Build Coastguard Worker  %vaddhn.i = add <2 x i64> %a, %b
570*9880d681SAndroid Build Coastguard Worker  %vaddhn1.i = lshr <2 x i64> %vaddhn.i, <i64 32, i64 32>
571*9880d681SAndroid Build Coastguard Worker  %vaddhn2.i = trunc <2 x i64> %vaddhn1.i to <2 x i32>
572*9880d681SAndroid Build Coastguard Worker  ret <2 x i32> %vaddhn2.i
573*9880d681SAndroid Build Coastguard Worker}
574*9880d681SAndroid Build Coastguard Worker
575*9880d681SAndroid Build Coastguard Workerdefine <8 x i8> @test_vaddhn_u16(<8 x i16> %a, <8 x i16> %b) {
576*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_vaddhn_u16:
577*9880d681SAndroid Build Coastguard Worker; CHECK: addhn {{v[0-9]+}}.8b, {{v[0-9]+}}.8h, {{v[0-9]+}}.8h
578*9880d681SAndroid Build Coastguard Workerentry:
579*9880d681SAndroid Build Coastguard Worker  %vaddhn.i = add <8 x i16> %a, %b
580*9880d681SAndroid Build Coastguard Worker  %vaddhn1.i = lshr <8 x i16> %vaddhn.i, <i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8>
581*9880d681SAndroid Build Coastguard Worker  %vaddhn2.i = trunc <8 x i16> %vaddhn1.i to <8 x i8>
582*9880d681SAndroid Build Coastguard Worker  ret <8 x i8> %vaddhn2.i
583*9880d681SAndroid Build Coastguard Worker}
584*9880d681SAndroid Build Coastguard Worker
585*9880d681SAndroid Build Coastguard Workerdefine <4 x i16> @test_vaddhn_u32(<4 x i32> %a, <4 x i32> %b) {
586*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_vaddhn_u32:
587*9880d681SAndroid Build Coastguard Worker; CHECK: addhn {{v[0-9]+}}.4h, {{v[0-9]+}}.4s, {{v[0-9]+}}.4s
588*9880d681SAndroid Build Coastguard Workerentry:
589*9880d681SAndroid Build Coastguard Worker  %vaddhn.i = add <4 x i32> %a, %b
590*9880d681SAndroid Build Coastguard Worker  %vaddhn1.i = lshr <4 x i32> %vaddhn.i, <i32 16, i32 16, i32 16, i32 16>
591*9880d681SAndroid Build Coastguard Worker  %vaddhn2.i = trunc <4 x i32> %vaddhn1.i to <4 x i16>
592*9880d681SAndroid Build Coastguard Worker  ret <4 x i16> %vaddhn2.i
593*9880d681SAndroid Build Coastguard Worker}
594*9880d681SAndroid Build Coastguard Worker
595*9880d681SAndroid Build Coastguard Workerdefine <2 x i32> @test_vaddhn_u64(<2 x i64> %a, <2 x i64> %b) {
596*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_vaddhn_u64:
597*9880d681SAndroid Build Coastguard Worker; CHECK: addhn {{v[0-9]+}}.2s, {{v[0-9]+}}.2d, {{v[0-9]+}}.2d
598*9880d681SAndroid Build Coastguard Workerentry:
599*9880d681SAndroid Build Coastguard Worker  %vaddhn.i = add <2 x i64> %a, %b
600*9880d681SAndroid Build Coastguard Worker  %vaddhn1.i = lshr <2 x i64> %vaddhn.i, <i64 32, i64 32>
601*9880d681SAndroid Build Coastguard Worker  %vaddhn2.i = trunc <2 x i64> %vaddhn1.i to <2 x i32>
602*9880d681SAndroid Build Coastguard Worker  ret <2 x i32> %vaddhn2.i
603*9880d681SAndroid Build Coastguard Worker}
604*9880d681SAndroid Build Coastguard Worker
605*9880d681SAndroid Build Coastguard Workerdefine <16 x i8> @test_vaddhn_high_s16(<8 x i8> %r, <8 x i16> %a, <8 x i16> %b) {
606*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_vaddhn_high_s16:
607*9880d681SAndroid Build Coastguard Worker; CHECK: addhn2 {{v[0-9]+}}.16b, {{v[0-9]+}}.8h, {{v[0-9]+}}.8h
608*9880d681SAndroid Build Coastguard Workerentry:
609*9880d681SAndroid Build Coastguard Worker  %vaddhn.i.i = add <8 x i16> %a, %b
610*9880d681SAndroid Build Coastguard Worker  %vaddhn1.i.i = lshr <8 x i16> %vaddhn.i.i, <i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8>
611*9880d681SAndroid Build Coastguard Worker  %vaddhn2.i.i = trunc <8 x i16> %vaddhn1.i.i to <8 x i8>
612*9880d681SAndroid Build Coastguard Worker  %0 = bitcast <8 x i8> %r to <1 x i64>
613*9880d681SAndroid Build Coastguard Worker  %1 = bitcast <8 x i8> %vaddhn2.i.i to <1 x i64>
614*9880d681SAndroid Build Coastguard Worker  %shuffle.i.i = shufflevector <1 x i64> %0, <1 x i64> %1, <2 x i32> <i32 0, i32 1>
615*9880d681SAndroid Build Coastguard Worker  %2 = bitcast <2 x i64> %shuffle.i.i to <16 x i8>
616*9880d681SAndroid Build Coastguard Worker  ret <16 x i8> %2
617*9880d681SAndroid Build Coastguard Worker}
618*9880d681SAndroid Build Coastguard Worker
619*9880d681SAndroid Build Coastguard Workerdefine <8 x i16> @test_vaddhn_high_s32(<4 x i16> %r, <4 x i32> %a, <4 x i32> %b) {
620*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_vaddhn_high_s32:
621*9880d681SAndroid Build Coastguard Worker; CHECK: addhn2 {{v[0-9]+}}.8h, {{v[0-9]+}}.4s, {{v[0-9]+}}.4s
622*9880d681SAndroid Build Coastguard Workerentry:
623*9880d681SAndroid Build Coastguard Worker  %vaddhn.i.i = add <4 x i32> %a, %b
624*9880d681SAndroid Build Coastguard Worker  %vaddhn1.i.i = lshr <4 x i32> %vaddhn.i.i, <i32 16, i32 16, i32 16, i32 16>
625*9880d681SAndroid Build Coastguard Worker  %vaddhn2.i.i = trunc <4 x i32> %vaddhn1.i.i to <4 x i16>
626*9880d681SAndroid Build Coastguard Worker  %0 = bitcast <4 x i16> %r to <1 x i64>
627*9880d681SAndroid Build Coastguard Worker  %1 = bitcast <4 x i16> %vaddhn2.i.i to <1 x i64>
628*9880d681SAndroid Build Coastguard Worker  %shuffle.i.i = shufflevector <1 x i64> %0, <1 x i64> %1, <2 x i32> <i32 0, i32 1>
629*9880d681SAndroid Build Coastguard Worker  %2 = bitcast <2 x i64> %shuffle.i.i to <8 x i16>
630*9880d681SAndroid Build Coastguard Worker  ret <8 x i16> %2
631*9880d681SAndroid Build Coastguard Worker}
632*9880d681SAndroid Build Coastguard Worker
633*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @test_vaddhn_high_s64(<2 x i32> %r, <2 x i64> %a, <2 x i64> %b) {
634*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_vaddhn_high_s64:
635*9880d681SAndroid Build Coastguard Worker; CHECK: addhn2 {{v[0-9]+}}.4s, {{v[0-9]+}}.2d, {{v[0-9]+}}.2d
636*9880d681SAndroid Build Coastguard Workerentry:
637*9880d681SAndroid Build Coastguard Worker  %vaddhn.i.i = add <2 x i64> %a, %b
638*9880d681SAndroid Build Coastguard Worker  %vaddhn1.i.i = lshr <2 x i64> %vaddhn.i.i, <i64 32, i64 32>
639*9880d681SAndroid Build Coastguard Worker  %vaddhn2.i.i = trunc <2 x i64> %vaddhn1.i.i to <2 x i32>
640*9880d681SAndroid Build Coastguard Worker  %0 = bitcast <2 x i32> %r to <1 x i64>
641*9880d681SAndroid Build Coastguard Worker  %1 = bitcast <2 x i32> %vaddhn2.i.i to <1 x i64>
642*9880d681SAndroid Build Coastguard Worker  %shuffle.i.i = shufflevector <1 x i64> %0, <1 x i64> %1, <2 x i32> <i32 0, i32 1>
643*9880d681SAndroid Build Coastguard Worker  %2 = bitcast <2 x i64> %shuffle.i.i to <4 x i32>
644*9880d681SAndroid Build Coastguard Worker  ret <4 x i32> %2
645*9880d681SAndroid Build Coastguard Worker}
646*9880d681SAndroid Build Coastguard Worker
647*9880d681SAndroid Build Coastguard Workerdefine <16 x i8> @test_vaddhn_high_u16(<8 x i8> %r, <8 x i16> %a, <8 x i16> %b) {
648*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_vaddhn_high_u16:
649*9880d681SAndroid Build Coastguard Worker; CHECK: addhn2 {{v[0-9]+}}.16b, {{v[0-9]+}}.8h, {{v[0-9]+}}.8h
650*9880d681SAndroid Build Coastguard Workerentry:
651*9880d681SAndroid Build Coastguard Worker  %vaddhn.i.i = add <8 x i16> %a, %b
652*9880d681SAndroid Build Coastguard Worker  %vaddhn1.i.i = lshr <8 x i16> %vaddhn.i.i, <i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8>
653*9880d681SAndroid Build Coastguard Worker  %vaddhn2.i.i = trunc <8 x i16> %vaddhn1.i.i to <8 x i8>
654*9880d681SAndroid Build Coastguard Worker  %0 = bitcast <8 x i8> %r to <1 x i64>
655*9880d681SAndroid Build Coastguard Worker  %1 = bitcast <8 x i8> %vaddhn2.i.i to <1 x i64>
656*9880d681SAndroid Build Coastguard Worker  %shuffle.i.i = shufflevector <1 x i64> %0, <1 x i64> %1, <2 x i32> <i32 0, i32 1>
657*9880d681SAndroid Build Coastguard Worker  %2 = bitcast <2 x i64> %shuffle.i.i to <16 x i8>
658*9880d681SAndroid Build Coastguard Worker  ret <16 x i8> %2
659*9880d681SAndroid Build Coastguard Worker}
660*9880d681SAndroid Build Coastguard Worker
661*9880d681SAndroid Build Coastguard Workerdefine <8 x i16> @test_vaddhn_high_u32(<4 x i16> %r, <4 x i32> %a, <4 x i32> %b) {
662*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_vaddhn_high_u32:
663*9880d681SAndroid Build Coastguard Worker; CHECK: addhn2 {{v[0-9]+}}.8h, {{v[0-9]+}}.4s, {{v[0-9]+}}.4s
664*9880d681SAndroid Build Coastguard Workerentry:
665*9880d681SAndroid Build Coastguard Worker  %vaddhn.i.i = add <4 x i32> %a, %b
666*9880d681SAndroid Build Coastguard Worker  %vaddhn1.i.i = lshr <4 x i32> %vaddhn.i.i, <i32 16, i32 16, i32 16, i32 16>
667*9880d681SAndroid Build Coastguard Worker  %vaddhn2.i.i = trunc <4 x i32> %vaddhn1.i.i to <4 x i16>
668*9880d681SAndroid Build Coastguard Worker  %0 = bitcast <4 x i16> %r to <1 x i64>
669*9880d681SAndroid Build Coastguard Worker  %1 = bitcast <4 x i16> %vaddhn2.i.i to <1 x i64>
670*9880d681SAndroid Build Coastguard Worker  %shuffle.i.i = shufflevector <1 x i64> %0, <1 x i64> %1, <2 x i32> <i32 0, i32 1>
671*9880d681SAndroid Build Coastguard Worker  %2 = bitcast <2 x i64> %shuffle.i.i to <8 x i16>
672*9880d681SAndroid Build Coastguard Worker  ret <8 x i16> %2
673*9880d681SAndroid Build Coastguard Worker}
674*9880d681SAndroid Build Coastguard Worker
675*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @test_vaddhn_high_u64(<2 x i32> %r, <2 x i64> %a, <2 x i64> %b) {
676*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_vaddhn_high_u64:
677*9880d681SAndroid Build Coastguard Worker; CHECK: addhn2 {{v[0-9]+}}.4s, {{v[0-9]+}}.2d, {{v[0-9]+}}.2d
678*9880d681SAndroid Build Coastguard Workerentry:
679*9880d681SAndroid Build Coastguard Worker  %vaddhn.i.i = add <2 x i64> %a, %b
680*9880d681SAndroid Build Coastguard Worker  %vaddhn1.i.i = lshr <2 x i64> %vaddhn.i.i, <i64 32, i64 32>
681*9880d681SAndroid Build Coastguard Worker  %vaddhn2.i.i = trunc <2 x i64> %vaddhn1.i.i to <2 x i32>
682*9880d681SAndroid Build Coastguard Worker  %0 = bitcast <2 x i32> %r to <1 x i64>
683*9880d681SAndroid Build Coastguard Worker  %1 = bitcast <2 x i32> %vaddhn2.i.i to <1 x i64>
684*9880d681SAndroid Build Coastguard Worker  %shuffle.i.i = shufflevector <1 x i64> %0, <1 x i64> %1, <2 x i32> <i32 0, i32 1>
685*9880d681SAndroid Build Coastguard Worker  %2 = bitcast <2 x i64> %shuffle.i.i to <4 x i32>
686*9880d681SAndroid Build Coastguard Worker  ret <4 x i32> %2
687*9880d681SAndroid Build Coastguard Worker}
688*9880d681SAndroid Build Coastguard Worker
689*9880d681SAndroid Build Coastguard Workerdefine <8 x i8> @test_vraddhn_s16(<8 x i16> %a, <8 x i16> %b) {
690*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_vraddhn_s16:
691*9880d681SAndroid Build Coastguard Worker; CHECK: raddhn {{v[0-9]+}}.8b, {{v[0-9]+}}.8h, {{v[0-9]+}}.8h
692*9880d681SAndroid Build Coastguard Workerentry:
693*9880d681SAndroid Build Coastguard Worker  %vraddhn2.i = tail call <8 x i8> @llvm.aarch64.neon.raddhn.v8i8(<8 x i16> %a, <8 x i16> %b)
694*9880d681SAndroid Build Coastguard Worker  ret <8 x i8> %vraddhn2.i
695*9880d681SAndroid Build Coastguard Worker}
696*9880d681SAndroid Build Coastguard Worker
697*9880d681SAndroid Build Coastguard Workerdefine <4 x i16> @test_vraddhn_s32(<4 x i32> %a, <4 x i32> %b) {
698*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_vraddhn_s32:
699*9880d681SAndroid Build Coastguard Worker; CHECK: raddhn {{v[0-9]+}}.4h, {{v[0-9]+}}.4s, {{v[0-9]+}}.4s
700*9880d681SAndroid Build Coastguard Workerentry:
701*9880d681SAndroid Build Coastguard Worker  %vraddhn2.i = tail call <4 x i16> @llvm.aarch64.neon.raddhn.v4i16(<4 x i32> %a, <4 x i32> %b)
702*9880d681SAndroid Build Coastguard Worker  ret <4 x i16> %vraddhn2.i
703*9880d681SAndroid Build Coastguard Worker}
704*9880d681SAndroid Build Coastguard Worker
705*9880d681SAndroid Build Coastguard Workerdefine <2 x i32> @test_vraddhn_s64(<2 x i64> %a, <2 x i64> %b) {
706*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_vraddhn_s64:
707*9880d681SAndroid Build Coastguard Worker; CHECK: raddhn {{v[0-9]+}}.2s, {{v[0-9]+}}.2d, {{v[0-9]+}}.2d
708*9880d681SAndroid Build Coastguard Workerentry:
709*9880d681SAndroid Build Coastguard Worker  %vraddhn2.i = tail call <2 x i32> @llvm.aarch64.neon.raddhn.v2i32(<2 x i64> %a, <2 x i64> %b)
710*9880d681SAndroid Build Coastguard Worker  ret <2 x i32> %vraddhn2.i
711*9880d681SAndroid Build Coastguard Worker}
712*9880d681SAndroid Build Coastguard Worker
713*9880d681SAndroid Build Coastguard Workerdefine <8 x i8> @test_vraddhn_u16(<8 x i16> %a, <8 x i16> %b) {
714*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_vraddhn_u16:
715*9880d681SAndroid Build Coastguard Worker; CHECK: raddhn {{v[0-9]+}}.8b, {{v[0-9]+}}.8h, {{v[0-9]+}}.8h
716*9880d681SAndroid Build Coastguard Workerentry:
717*9880d681SAndroid Build Coastguard Worker  %vraddhn2.i = tail call <8 x i8> @llvm.aarch64.neon.raddhn.v8i8(<8 x i16> %a, <8 x i16> %b)
718*9880d681SAndroid Build Coastguard Worker  ret <8 x i8> %vraddhn2.i
719*9880d681SAndroid Build Coastguard Worker}
720*9880d681SAndroid Build Coastguard Worker
721*9880d681SAndroid Build Coastguard Workerdefine <4 x i16> @test_vraddhn_u32(<4 x i32> %a, <4 x i32> %b) {
722*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_vraddhn_u32:
723*9880d681SAndroid Build Coastguard Worker; CHECK: raddhn {{v[0-9]+}}.4h, {{v[0-9]+}}.4s, {{v[0-9]+}}.4s
724*9880d681SAndroid Build Coastguard Workerentry:
725*9880d681SAndroid Build Coastguard Worker  %vraddhn2.i = tail call <4 x i16> @llvm.aarch64.neon.raddhn.v4i16(<4 x i32> %a, <4 x i32> %b)
726*9880d681SAndroid Build Coastguard Worker  ret <4 x i16> %vraddhn2.i
727*9880d681SAndroid Build Coastguard Worker}
728*9880d681SAndroid Build Coastguard Worker
729*9880d681SAndroid Build Coastguard Workerdefine <2 x i32> @test_vraddhn_u64(<2 x i64> %a, <2 x i64> %b) {
730*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_vraddhn_u64:
731*9880d681SAndroid Build Coastguard Worker; CHECK: raddhn {{v[0-9]+}}.2s, {{v[0-9]+}}.2d, {{v[0-9]+}}.2d
732*9880d681SAndroid Build Coastguard Workerentry:
733*9880d681SAndroid Build Coastguard Worker  %vraddhn2.i = tail call <2 x i32> @llvm.aarch64.neon.raddhn.v2i32(<2 x i64> %a, <2 x i64> %b)
734*9880d681SAndroid Build Coastguard Worker  ret <2 x i32> %vraddhn2.i
735*9880d681SAndroid Build Coastguard Worker}
736*9880d681SAndroid Build Coastguard Worker
737*9880d681SAndroid Build Coastguard Workerdefine <16 x i8> @test_vraddhn_high_s16(<8 x i8> %r, <8 x i16> %a, <8 x i16> %b) {
738*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_vraddhn_high_s16:
739*9880d681SAndroid Build Coastguard Worker; CHECK: raddhn2 {{v[0-9]+}}.16b, {{v[0-9]+}}.8h, {{v[0-9]+}}.8h
740*9880d681SAndroid Build Coastguard Workerentry:
741*9880d681SAndroid Build Coastguard Worker  %vraddhn2.i.i = tail call <8 x i8> @llvm.aarch64.neon.raddhn.v8i8(<8 x i16> %a, <8 x i16> %b)
742*9880d681SAndroid Build Coastguard Worker  %0 = bitcast <8 x i8> %r to <1 x i64>
743*9880d681SAndroid Build Coastguard Worker  %1 = bitcast <8 x i8> %vraddhn2.i.i to <1 x i64>
744*9880d681SAndroid Build Coastguard Worker  %shuffle.i.i = shufflevector <1 x i64> %0, <1 x i64> %1, <2 x i32> <i32 0, i32 1>
745*9880d681SAndroid Build Coastguard Worker  %2 = bitcast <2 x i64> %shuffle.i.i to <16 x i8>
746*9880d681SAndroid Build Coastguard Worker  ret <16 x i8> %2
747*9880d681SAndroid Build Coastguard Worker}
748*9880d681SAndroid Build Coastguard Worker
749*9880d681SAndroid Build Coastguard Workerdefine <8 x i16> @test_vraddhn_high_s32(<4 x i16> %r, <4 x i32> %a, <4 x i32> %b) {
750*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_vraddhn_high_s32:
751*9880d681SAndroid Build Coastguard Worker; CHECK: raddhn2 {{v[0-9]+}}.8h, {{v[0-9]+}}.4s, {{v[0-9]+}}.4s
752*9880d681SAndroid Build Coastguard Workerentry:
753*9880d681SAndroid Build Coastguard Worker  %vraddhn2.i.i = tail call <4 x i16> @llvm.aarch64.neon.raddhn.v4i16(<4 x i32> %a, <4 x i32> %b)
754*9880d681SAndroid Build Coastguard Worker  %0 = bitcast <4 x i16> %r to <1 x i64>
755*9880d681SAndroid Build Coastguard Worker  %1 = bitcast <4 x i16> %vraddhn2.i.i to <1 x i64>
756*9880d681SAndroid Build Coastguard Worker  %shuffle.i.i = shufflevector <1 x i64> %0, <1 x i64> %1, <2 x i32> <i32 0, i32 1>
757*9880d681SAndroid Build Coastguard Worker  %2 = bitcast <2 x i64> %shuffle.i.i to <8 x i16>
758*9880d681SAndroid Build Coastguard Worker  ret <8 x i16> %2
759*9880d681SAndroid Build Coastguard Worker}
760*9880d681SAndroid Build Coastguard Worker
761*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @test_vraddhn_high_s64(<2 x i32> %r, <2 x i64> %a, <2 x i64> %b) {
762*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_vraddhn_high_s64:
763*9880d681SAndroid Build Coastguard Worker; CHECK: raddhn2 {{v[0-9]+}}.4s, {{v[0-9]+}}.2d, {{v[0-9]+}}.2d
764*9880d681SAndroid Build Coastguard Workerentry:
765*9880d681SAndroid Build Coastguard Worker  %vraddhn2.i.i = tail call <2 x i32> @llvm.aarch64.neon.raddhn.v2i32(<2 x i64> %a, <2 x i64> %b)
766*9880d681SAndroid Build Coastguard Worker  %0 = bitcast <2 x i32> %r to <1 x i64>
767*9880d681SAndroid Build Coastguard Worker  %1 = bitcast <2 x i32> %vraddhn2.i.i to <1 x i64>
768*9880d681SAndroid Build Coastguard Worker  %shuffle.i.i = shufflevector <1 x i64> %0, <1 x i64> %1, <2 x i32> <i32 0, i32 1>
769*9880d681SAndroid Build Coastguard Worker  %2 = bitcast <2 x i64> %shuffle.i.i to <4 x i32>
770*9880d681SAndroid Build Coastguard Worker  ret <4 x i32> %2
771*9880d681SAndroid Build Coastguard Worker}
772*9880d681SAndroid Build Coastguard Worker
773*9880d681SAndroid Build Coastguard Workerdefine <16 x i8> @test_vraddhn_high_u16(<8 x i8> %r, <8 x i16> %a, <8 x i16> %b) {
774*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_vraddhn_high_u16:
775*9880d681SAndroid Build Coastguard Worker; CHECK: raddhn2 {{v[0-9]+}}.16b, {{v[0-9]+}}.8h, {{v[0-9]+}}.8h
776*9880d681SAndroid Build Coastguard Workerentry:
777*9880d681SAndroid Build Coastguard Worker  %vraddhn2.i.i = tail call <8 x i8> @llvm.aarch64.neon.raddhn.v8i8(<8 x i16> %a, <8 x i16> %b)
778*9880d681SAndroid Build Coastguard Worker  %0 = bitcast <8 x i8> %r to <1 x i64>
779*9880d681SAndroid Build Coastguard Worker  %1 = bitcast <8 x i8> %vraddhn2.i.i to <1 x i64>
780*9880d681SAndroid Build Coastguard Worker  %shuffle.i.i = shufflevector <1 x i64> %0, <1 x i64> %1, <2 x i32> <i32 0, i32 1>
781*9880d681SAndroid Build Coastguard Worker  %2 = bitcast <2 x i64> %shuffle.i.i to <16 x i8>
782*9880d681SAndroid Build Coastguard Worker  ret <16 x i8> %2
783*9880d681SAndroid Build Coastguard Worker}
784*9880d681SAndroid Build Coastguard Worker
785*9880d681SAndroid Build Coastguard Workerdefine <8 x i16> @test_vraddhn_high_u32(<4 x i16> %r, <4 x i32> %a, <4 x i32> %b) {
786*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_vraddhn_high_u32:
787*9880d681SAndroid Build Coastguard Worker; CHECK: raddhn2 {{v[0-9]+}}.8h, {{v[0-9]+}}.4s, {{v[0-9]+}}.4s
788*9880d681SAndroid Build Coastguard Workerentry:
789*9880d681SAndroid Build Coastguard Worker  %vraddhn2.i.i = tail call <4 x i16> @llvm.aarch64.neon.raddhn.v4i16(<4 x i32> %a, <4 x i32> %b)
790*9880d681SAndroid Build Coastguard Worker  %0 = bitcast <4 x i16> %r to <1 x i64>
791*9880d681SAndroid Build Coastguard Worker  %1 = bitcast <4 x i16> %vraddhn2.i.i to <1 x i64>
792*9880d681SAndroid Build Coastguard Worker  %shuffle.i.i = shufflevector <1 x i64> %0, <1 x i64> %1, <2 x i32> <i32 0, i32 1>
793*9880d681SAndroid Build Coastguard Worker  %2 = bitcast <2 x i64> %shuffle.i.i to <8 x i16>
794*9880d681SAndroid Build Coastguard Worker  ret <8 x i16> %2
795*9880d681SAndroid Build Coastguard Worker}
796*9880d681SAndroid Build Coastguard Worker
797*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @test_vraddhn_high_u64(<2 x i32> %r, <2 x i64> %a, <2 x i64> %b) {
798*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_vraddhn_high_u64:
799*9880d681SAndroid Build Coastguard Worker; CHECK: raddhn2 {{v[0-9]+}}.4s, {{v[0-9]+}}.2d, {{v[0-9]+}}.2d
800*9880d681SAndroid Build Coastguard Workerentry:
801*9880d681SAndroid Build Coastguard Worker  %vraddhn2.i.i = tail call <2 x i32> @llvm.aarch64.neon.raddhn.v2i32(<2 x i64> %a, <2 x i64> %b)
802*9880d681SAndroid Build Coastguard Worker  %0 = bitcast <2 x i32> %r to <1 x i64>
803*9880d681SAndroid Build Coastguard Worker  %1 = bitcast <2 x i32> %vraddhn2.i.i to <1 x i64>
804*9880d681SAndroid Build Coastguard Worker  %shuffle.i.i = shufflevector <1 x i64> %0, <1 x i64> %1, <2 x i32> <i32 0, i32 1>
805*9880d681SAndroid Build Coastguard Worker  %2 = bitcast <2 x i64> %shuffle.i.i to <4 x i32>
806*9880d681SAndroid Build Coastguard Worker  ret <4 x i32> %2
807*9880d681SAndroid Build Coastguard Worker}
808*9880d681SAndroid Build Coastguard Worker
809*9880d681SAndroid Build Coastguard Workerdefine <8 x i8> @test_vsubhn_s16(<8 x i16> %a, <8 x i16> %b) {
810*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_vsubhn_s16:
811*9880d681SAndroid Build Coastguard Worker; CHECK: subhn {{v[0-9]+}}.8b, {{v[0-9]+}}.8h, {{v[0-9]+}}.8h
812*9880d681SAndroid Build Coastguard Workerentry:
813*9880d681SAndroid Build Coastguard Worker  %vsubhn.i = sub <8 x i16> %a, %b
814*9880d681SAndroid Build Coastguard Worker  %vsubhn1.i = lshr <8 x i16> %vsubhn.i, <i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8>
815*9880d681SAndroid Build Coastguard Worker  %vsubhn2.i = trunc <8 x i16> %vsubhn1.i to <8 x i8>
816*9880d681SAndroid Build Coastguard Worker  ret <8 x i8> %vsubhn2.i
817*9880d681SAndroid Build Coastguard Worker}
818*9880d681SAndroid Build Coastguard Worker
819*9880d681SAndroid Build Coastguard Workerdefine <4 x i16> @test_vsubhn_s32(<4 x i32> %a, <4 x i32> %b) {
820*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_vsubhn_s32:
821*9880d681SAndroid Build Coastguard Worker; CHECK: subhn {{v[0-9]+}}.4h, {{v[0-9]+}}.4s, {{v[0-9]+}}.4s
822*9880d681SAndroid Build Coastguard Workerentry:
823*9880d681SAndroid Build Coastguard Worker  %vsubhn.i = sub <4 x i32> %a, %b
824*9880d681SAndroid Build Coastguard Worker  %vsubhn1.i = lshr <4 x i32> %vsubhn.i, <i32 16, i32 16, i32 16, i32 16>
825*9880d681SAndroid Build Coastguard Worker  %vsubhn2.i = trunc <4 x i32> %vsubhn1.i to <4 x i16>
826*9880d681SAndroid Build Coastguard Worker  ret <4 x i16> %vsubhn2.i
827*9880d681SAndroid Build Coastguard Worker}
828*9880d681SAndroid Build Coastguard Worker
829*9880d681SAndroid Build Coastguard Workerdefine <2 x i32> @test_vsubhn_s64(<2 x i64> %a, <2 x i64> %b) {
830*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_vsubhn_s64:
831*9880d681SAndroid Build Coastguard Worker; CHECK: subhn {{v[0-9]+}}.2s, {{v[0-9]+}}.2d, {{v[0-9]+}}.2d
832*9880d681SAndroid Build Coastguard Workerentry:
833*9880d681SAndroid Build Coastguard Worker  %vsubhn.i = sub <2 x i64> %a, %b
834*9880d681SAndroid Build Coastguard Worker  %vsubhn1.i = lshr <2 x i64> %vsubhn.i, <i64 32, i64 32>
835*9880d681SAndroid Build Coastguard Worker  %vsubhn2.i = trunc <2 x i64> %vsubhn1.i to <2 x i32>
836*9880d681SAndroid Build Coastguard Worker  ret <2 x i32> %vsubhn2.i
837*9880d681SAndroid Build Coastguard Worker}
838*9880d681SAndroid Build Coastguard Worker
839*9880d681SAndroid Build Coastguard Workerdefine <8 x i8> @test_vsubhn_u16(<8 x i16> %a, <8 x i16> %b) {
840*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_vsubhn_u16:
841*9880d681SAndroid Build Coastguard Worker; CHECK: subhn {{v[0-9]+}}.8b, {{v[0-9]+}}.8h, {{v[0-9]+}}.8h
842*9880d681SAndroid Build Coastguard Workerentry:
843*9880d681SAndroid Build Coastguard Worker  %vsubhn.i = sub <8 x i16> %a, %b
844*9880d681SAndroid Build Coastguard Worker  %vsubhn1.i = lshr <8 x i16> %vsubhn.i, <i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8>
845*9880d681SAndroid Build Coastguard Worker  %vsubhn2.i = trunc <8 x i16> %vsubhn1.i to <8 x i8>
846*9880d681SAndroid Build Coastguard Worker  ret <8 x i8> %vsubhn2.i
847*9880d681SAndroid Build Coastguard Worker}
848*9880d681SAndroid Build Coastguard Worker
849*9880d681SAndroid Build Coastguard Workerdefine <4 x i16> @test_vsubhn_u32(<4 x i32> %a, <4 x i32> %b) {
850*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_vsubhn_u32:
851*9880d681SAndroid Build Coastguard Worker; CHECK: subhn {{v[0-9]+}}.4h, {{v[0-9]+}}.4s, {{v[0-9]+}}.4s
852*9880d681SAndroid Build Coastguard Workerentry:
853*9880d681SAndroid Build Coastguard Worker  %vsubhn.i = sub <4 x i32> %a, %b
854*9880d681SAndroid Build Coastguard Worker  %vsubhn1.i = lshr <4 x i32> %vsubhn.i, <i32 16, i32 16, i32 16, i32 16>
855*9880d681SAndroid Build Coastguard Worker  %vsubhn2.i = trunc <4 x i32> %vsubhn1.i to <4 x i16>
856*9880d681SAndroid Build Coastguard Worker  ret <4 x i16> %vsubhn2.i
857*9880d681SAndroid Build Coastguard Worker}
858*9880d681SAndroid Build Coastguard Worker
859*9880d681SAndroid Build Coastguard Workerdefine <2 x i32> @test_vsubhn_u64(<2 x i64> %a, <2 x i64> %b) {
860*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_vsubhn_u64:
861*9880d681SAndroid Build Coastguard Worker; CHECK: subhn {{v[0-9]+}}.2s, {{v[0-9]+}}.2d, {{v[0-9]+}}.2d
862*9880d681SAndroid Build Coastguard Workerentry:
863*9880d681SAndroid Build Coastguard Worker  %vsubhn.i = sub <2 x i64> %a, %b
864*9880d681SAndroid Build Coastguard Worker  %vsubhn1.i = lshr <2 x i64> %vsubhn.i, <i64 32, i64 32>
865*9880d681SAndroid Build Coastguard Worker  %vsubhn2.i = trunc <2 x i64> %vsubhn1.i to <2 x i32>
866*9880d681SAndroid Build Coastguard Worker  ret <2 x i32> %vsubhn2.i
867*9880d681SAndroid Build Coastguard Worker}
868*9880d681SAndroid Build Coastguard Worker
869*9880d681SAndroid Build Coastguard Workerdefine <16 x i8> @test_vsubhn_high_s16(<8 x i8> %r, <8 x i16> %a, <8 x i16> %b) {
870*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_vsubhn_high_s16:
871*9880d681SAndroid Build Coastguard Worker; CHECK: subhn2 {{v[0-9]+}}.16b, {{v[0-9]+}}.8h, {{v[0-9]+}}.8h
872*9880d681SAndroid Build Coastguard Workerentry:
873*9880d681SAndroid Build Coastguard Worker  %vsubhn.i.i = sub <8 x i16> %a, %b
874*9880d681SAndroid Build Coastguard Worker  %vsubhn1.i.i = lshr <8 x i16> %vsubhn.i.i, <i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8>
875*9880d681SAndroid Build Coastguard Worker  %vsubhn2.i.i = trunc <8 x i16> %vsubhn1.i.i to <8 x i8>
876*9880d681SAndroid Build Coastguard Worker  %0 = bitcast <8 x i8> %r to <1 x i64>
877*9880d681SAndroid Build Coastguard Worker  %1 = bitcast <8 x i8> %vsubhn2.i.i to <1 x i64>
878*9880d681SAndroid Build Coastguard Worker  %shuffle.i.i = shufflevector <1 x i64> %0, <1 x i64> %1, <2 x i32> <i32 0, i32 1>
879*9880d681SAndroid Build Coastguard Worker  %2 = bitcast <2 x i64> %shuffle.i.i to <16 x i8>
880*9880d681SAndroid Build Coastguard Worker  ret <16 x i8> %2
881*9880d681SAndroid Build Coastguard Worker}
882*9880d681SAndroid Build Coastguard Worker
883*9880d681SAndroid Build Coastguard Workerdefine <8 x i16> @test_vsubhn_high_s32(<4 x i16> %r, <4 x i32> %a, <4 x i32> %b) {
884*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_vsubhn_high_s32:
885*9880d681SAndroid Build Coastguard Worker; CHECK: subhn2 {{v[0-9]+}}.8h, {{v[0-9]+}}.4s, {{v[0-9]+}}.4s
886*9880d681SAndroid Build Coastguard Workerentry:
887*9880d681SAndroid Build Coastguard Worker  %vsubhn.i.i = sub <4 x i32> %a, %b
888*9880d681SAndroid Build Coastguard Worker  %vsubhn1.i.i = lshr <4 x i32> %vsubhn.i.i, <i32 16, i32 16, i32 16, i32 16>
889*9880d681SAndroid Build Coastguard Worker  %vsubhn2.i.i = trunc <4 x i32> %vsubhn1.i.i to <4 x i16>
890*9880d681SAndroid Build Coastguard Worker  %0 = bitcast <4 x i16> %r to <1 x i64>
891*9880d681SAndroid Build Coastguard Worker  %1 = bitcast <4 x i16> %vsubhn2.i.i to <1 x i64>
892*9880d681SAndroid Build Coastguard Worker  %shuffle.i.i = shufflevector <1 x i64> %0, <1 x i64> %1, <2 x i32> <i32 0, i32 1>
893*9880d681SAndroid Build Coastguard Worker  %2 = bitcast <2 x i64> %shuffle.i.i to <8 x i16>
894*9880d681SAndroid Build Coastguard Worker  ret <8 x i16> %2
895*9880d681SAndroid Build Coastguard Worker}
896*9880d681SAndroid Build Coastguard Worker
897*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @test_vsubhn_high_s64(<2 x i32> %r, <2 x i64> %a, <2 x i64> %b) {
898*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_vsubhn_high_s64:
899*9880d681SAndroid Build Coastguard Worker; CHECK: subhn2 {{v[0-9]+}}.4s, {{v[0-9]+}}.2d, {{v[0-9]+}}.2d
900*9880d681SAndroid Build Coastguard Workerentry:
901*9880d681SAndroid Build Coastguard Worker  %vsubhn.i.i = sub <2 x i64> %a, %b
902*9880d681SAndroid Build Coastguard Worker  %vsubhn1.i.i = lshr <2 x i64> %vsubhn.i.i, <i64 32, i64 32>
903*9880d681SAndroid Build Coastguard Worker  %vsubhn2.i.i = trunc <2 x i64> %vsubhn1.i.i to <2 x i32>
904*9880d681SAndroid Build Coastguard Worker  %0 = bitcast <2 x i32> %r to <1 x i64>
905*9880d681SAndroid Build Coastguard Worker  %1 = bitcast <2 x i32> %vsubhn2.i.i to <1 x i64>
906*9880d681SAndroid Build Coastguard Worker  %shuffle.i.i = shufflevector <1 x i64> %0, <1 x i64> %1, <2 x i32> <i32 0, i32 1>
907*9880d681SAndroid Build Coastguard Worker  %2 = bitcast <2 x i64> %shuffle.i.i to <4 x i32>
908*9880d681SAndroid Build Coastguard Worker  ret <4 x i32> %2
909*9880d681SAndroid Build Coastguard Worker}
910*9880d681SAndroid Build Coastguard Worker
911*9880d681SAndroid Build Coastguard Workerdefine <16 x i8> @test_vsubhn_high_u16(<8 x i8> %r, <8 x i16> %a, <8 x i16> %b) {
912*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_vsubhn_high_u16:
913*9880d681SAndroid Build Coastguard Worker; CHECK: subhn2 {{v[0-9]+}}.16b, {{v[0-9]+}}.8h, {{v[0-9]+}}.8h
914*9880d681SAndroid Build Coastguard Workerentry:
915*9880d681SAndroid Build Coastguard Worker  %vsubhn.i.i = sub <8 x i16> %a, %b
916*9880d681SAndroid Build Coastguard Worker  %vsubhn1.i.i = lshr <8 x i16> %vsubhn.i.i, <i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8>
917*9880d681SAndroid Build Coastguard Worker  %vsubhn2.i.i = trunc <8 x i16> %vsubhn1.i.i to <8 x i8>
918*9880d681SAndroid Build Coastguard Worker  %0 = bitcast <8 x i8> %r to <1 x i64>
919*9880d681SAndroid Build Coastguard Worker  %1 = bitcast <8 x i8> %vsubhn2.i.i to <1 x i64>
920*9880d681SAndroid Build Coastguard Worker  %shuffle.i.i = shufflevector <1 x i64> %0, <1 x i64> %1, <2 x i32> <i32 0, i32 1>
921*9880d681SAndroid Build Coastguard Worker  %2 = bitcast <2 x i64> %shuffle.i.i to <16 x i8>
922*9880d681SAndroid Build Coastguard Worker  ret <16 x i8> %2
923*9880d681SAndroid Build Coastguard Worker}
924*9880d681SAndroid Build Coastguard Worker
925*9880d681SAndroid Build Coastguard Workerdefine <8 x i16> @test_vsubhn_high_u32(<4 x i16> %r, <4 x i32> %a, <4 x i32> %b) {
926*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_vsubhn_high_u32:
927*9880d681SAndroid Build Coastguard Worker; CHECK: subhn2 {{v[0-9]+}}.8h, {{v[0-9]+}}.4s, {{v[0-9]+}}.4s
928*9880d681SAndroid Build Coastguard Workerentry:
929*9880d681SAndroid Build Coastguard Worker  %vsubhn.i.i = sub <4 x i32> %a, %b
930*9880d681SAndroid Build Coastguard Worker  %vsubhn1.i.i = lshr <4 x i32> %vsubhn.i.i, <i32 16, i32 16, i32 16, i32 16>
931*9880d681SAndroid Build Coastguard Worker  %vsubhn2.i.i = trunc <4 x i32> %vsubhn1.i.i to <4 x i16>
932*9880d681SAndroid Build Coastguard Worker  %0 = bitcast <4 x i16> %r to <1 x i64>
933*9880d681SAndroid Build Coastguard Worker  %1 = bitcast <4 x i16> %vsubhn2.i.i to <1 x i64>
934*9880d681SAndroid Build Coastguard Worker  %shuffle.i.i = shufflevector <1 x i64> %0, <1 x i64> %1, <2 x i32> <i32 0, i32 1>
935*9880d681SAndroid Build Coastguard Worker  %2 = bitcast <2 x i64> %shuffle.i.i to <8 x i16>
936*9880d681SAndroid Build Coastguard Worker  ret <8 x i16> %2
937*9880d681SAndroid Build Coastguard Worker}
938*9880d681SAndroid Build Coastguard Worker
939*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @test_vsubhn_high_u64(<2 x i32> %r, <2 x i64> %a, <2 x i64> %b) {
940*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_vsubhn_high_u64:
941*9880d681SAndroid Build Coastguard Worker; CHECK: subhn2 {{v[0-9]+}}.4s, {{v[0-9]+}}.2d, {{v[0-9]+}}.2d
942*9880d681SAndroid Build Coastguard Workerentry:
943*9880d681SAndroid Build Coastguard Worker  %vsubhn.i.i = sub <2 x i64> %a, %b
944*9880d681SAndroid Build Coastguard Worker  %vsubhn1.i.i = lshr <2 x i64> %vsubhn.i.i, <i64 32, i64 32>
945*9880d681SAndroid Build Coastguard Worker  %vsubhn2.i.i = trunc <2 x i64> %vsubhn1.i.i to <2 x i32>
946*9880d681SAndroid Build Coastguard Worker  %0 = bitcast <2 x i32> %r to <1 x i64>
947*9880d681SAndroid Build Coastguard Worker  %1 = bitcast <2 x i32> %vsubhn2.i.i to <1 x i64>
948*9880d681SAndroid Build Coastguard Worker  %shuffle.i.i = shufflevector <1 x i64> %0, <1 x i64> %1, <2 x i32> <i32 0, i32 1>
949*9880d681SAndroid Build Coastguard Worker  %2 = bitcast <2 x i64> %shuffle.i.i to <4 x i32>
950*9880d681SAndroid Build Coastguard Worker  ret <4 x i32> %2
951*9880d681SAndroid Build Coastguard Worker}
952*9880d681SAndroid Build Coastguard Worker
953*9880d681SAndroid Build Coastguard Workerdefine <8 x i8> @test_vrsubhn_s16(<8 x i16> %a, <8 x i16> %b) {
954*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_vrsubhn_s16:
955*9880d681SAndroid Build Coastguard Worker; CHECK: rsubhn {{v[0-9]+}}.8b, {{v[0-9]+}}.8h, {{v[0-9]+}}.8h
956*9880d681SAndroid Build Coastguard Workerentry:
957*9880d681SAndroid Build Coastguard Worker  %vrsubhn2.i = tail call <8 x i8> @llvm.aarch64.neon.rsubhn.v8i8(<8 x i16> %a, <8 x i16> %b)
958*9880d681SAndroid Build Coastguard Worker  ret <8 x i8> %vrsubhn2.i
959*9880d681SAndroid Build Coastguard Worker}
960*9880d681SAndroid Build Coastguard Worker
961*9880d681SAndroid Build Coastguard Workerdefine <4 x i16> @test_vrsubhn_s32(<4 x i32> %a, <4 x i32> %b) {
962*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_vrsubhn_s32:
963*9880d681SAndroid Build Coastguard Worker; CHECK: rsubhn {{v[0-9]+}}.4h, {{v[0-9]+}}.4s, {{v[0-9]+}}.4s
964*9880d681SAndroid Build Coastguard Workerentry:
965*9880d681SAndroid Build Coastguard Worker  %vrsubhn2.i = tail call <4 x i16> @llvm.aarch64.neon.rsubhn.v4i16(<4 x i32> %a, <4 x i32> %b)
966*9880d681SAndroid Build Coastguard Worker  ret <4 x i16> %vrsubhn2.i
967*9880d681SAndroid Build Coastguard Worker}
968*9880d681SAndroid Build Coastguard Worker
969*9880d681SAndroid Build Coastguard Workerdefine <2 x i32> @test_vrsubhn_s64(<2 x i64> %a, <2 x i64> %b) {
970*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_vrsubhn_s64:
971*9880d681SAndroid Build Coastguard Worker; CHECK: rsubhn {{v[0-9]+}}.2s, {{v[0-9]+}}.2d, {{v[0-9]+}}.2d
972*9880d681SAndroid Build Coastguard Workerentry:
973*9880d681SAndroid Build Coastguard Worker  %vrsubhn2.i = tail call <2 x i32> @llvm.aarch64.neon.rsubhn.v2i32(<2 x i64> %a, <2 x i64> %b)
974*9880d681SAndroid Build Coastguard Worker  ret <2 x i32> %vrsubhn2.i
975*9880d681SAndroid Build Coastguard Worker}
976*9880d681SAndroid Build Coastguard Worker
977*9880d681SAndroid Build Coastguard Workerdefine <8 x i8> @test_vrsubhn_u16(<8 x i16> %a, <8 x i16> %b) {
978*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_vrsubhn_u16:
979*9880d681SAndroid Build Coastguard Worker; CHECK: rsubhn {{v[0-9]+}}.8b, {{v[0-9]+}}.8h, {{v[0-9]+}}.8h
980*9880d681SAndroid Build Coastguard Workerentry:
981*9880d681SAndroid Build Coastguard Worker  %vrsubhn2.i = tail call <8 x i8> @llvm.aarch64.neon.rsubhn.v8i8(<8 x i16> %a, <8 x i16> %b)
982*9880d681SAndroid Build Coastguard Worker  ret <8 x i8> %vrsubhn2.i
983*9880d681SAndroid Build Coastguard Worker}
984*9880d681SAndroid Build Coastguard Worker
985*9880d681SAndroid Build Coastguard Workerdefine <4 x i16> @test_vrsubhn_u32(<4 x i32> %a, <4 x i32> %b) {
986*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_vrsubhn_u32:
987*9880d681SAndroid Build Coastguard Worker; CHECK: rsubhn {{v[0-9]+}}.4h, {{v[0-9]+}}.4s, {{v[0-9]+}}.4s
988*9880d681SAndroid Build Coastguard Workerentry:
989*9880d681SAndroid Build Coastguard Worker  %vrsubhn2.i = tail call <4 x i16> @llvm.aarch64.neon.rsubhn.v4i16(<4 x i32> %a, <4 x i32> %b)
990*9880d681SAndroid Build Coastguard Worker  ret <4 x i16> %vrsubhn2.i
991*9880d681SAndroid Build Coastguard Worker}
992*9880d681SAndroid Build Coastguard Worker
993*9880d681SAndroid Build Coastguard Workerdefine <2 x i32> @test_vrsubhn_u64(<2 x i64> %a, <2 x i64> %b) {
994*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_vrsubhn_u64:
995*9880d681SAndroid Build Coastguard Worker; CHECK: rsubhn {{v[0-9]+}}.2s, {{v[0-9]+}}.2d, {{v[0-9]+}}.2d
996*9880d681SAndroid Build Coastguard Workerentry:
997*9880d681SAndroid Build Coastguard Worker  %vrsubhn2.i = tail call <2 x i32> @llvm.aarch64.neon.rsubhn.v2i32(<2 x i64> %a, <2 x i64> %b)
998*9880d681SAndroid Build Coastguard Worker  ret <2 x i32> %vrsubhn2.i
999*9880d681SAndroid Build Coastguard Worker}
1000*9880d681SAndroid Build Coastguard Worker
1001*9880d681SAndroid Build Coastguard Workerdefine <16 x i8> @test_vrsubhn_high_s16(<8 x i8> %r, <8 x i16> %a, <8 x i16> %b) {
1002*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_vrsubhn_high_s16:
1003*9880d681SAndroid Build Coastguard Worker; CHECK: rsubhn2 {{v[0-9]+}}.16b, {{v[0-9]+}}.8h, {{v[0-9]+}}.8h
1004*9880d681SAndroid Build Coastguard Workerentry:
1005*9880d681SAndroid Build Coastguard Worker  %vrsubhn2.i.i = tail call <8 x i8> @llvm.aarch64.neon.rsubhn.v8i8(<8 x i16> %a, <8 x i16> %b)
1006*9880d681SAndroid Build Coastguard Worker  %0 = bitcast <8 x i8> %r to <1 x i64>
1007*9880d681SAndroid Build Coastguard Worker  %1 = bitcast <8 x i8> %vrsubhn2.i.i to <1 x i64>
1008*9880d681SAndroid Build Coastguard Worker  %shuffle.i.i = shufflevector <1 x i64> %0, <1 x i64> %1, <2 x i32> <i32 0, i32 1>
1009*9880d681SAndroid Build Coastguard Worker  %2 = bitcast <2 x i64> %shuffle.i.i to <16 x i8>
1010*9880d681SAndroid Build Coastguard Worker  ret <16 x i8> %2
1011*9880d681SAndroid Build Coastguard Worker}
1012*9880d681SAndroid Build Coastguard Worker
1013*9880d681SAndroid Build Coastguard Workerdefine <8 x i16> @test_vrsubhn_high_s32(<4 x i16> %r, <4 x i32> %a, <4 x i32> %b) {
1014*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_vrsubhn_high_s32:
1015*9880d681SAndroid Build Coastguard Worker; CHECK: rsubhn2 {{v[0-9]+}}.8h, {{v[0-9]+}}.4s, {{v[0-9]+}}.4s
1016*9880d681SAndroid Build Coastguard Workerentry:
1017*9880d681SAndroid Build Coastguard Worker  %vrsubhn2.i.i = tail call <4 x i16> @llvm.aarch64.neon.rsubhn.v4i16(<4 x i32> %a, <4 x i32> %b)
1018*9880d681SAndroid Build Coastguard Worker  %0 = bitcast <4 x i16> %r to <1 x i64>
1019*9880d681SAndroid Build Coastguard Worker  %1 = bitcast <4 x i16> %vrsubhn2.i.i to <1 x i64>
1020*9880d681SAndroid Build Coastguard Worker  %shuffle.i.i = shufflevector <1 x i64> %0, <1 x i64> %1, <2 x i32> <i32 0, i32 1>
1021*9880d681SAndroid Build Coastguard Worker  %2 = bitcast <2 x i64> %shuffle.i.i to <8 x i16>
1022*9880d681SAndroid Build Coastguard Worker  ret <8 x i16> %2
1023*9880d681SAndroid Build Coastguard Worker}
1024*9880d681SAndroid Build Coastguard Worker
1025*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @test_vrsubhn_high_s64(<2 x i32> %r, <2 x i64> %a, <2 x i64> %b) {
1026*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_vrsubhn_high_s64:
1027*9880d681SAndroid Build Coastguard Worker; CHECK: rsubhn2 {{v[0-9]+}}.4s, {{v[0-9]+}}.2d, {{v[0-9]+}}.2d
1028*9880d681SAndroid Build Coastguard Workerentry:
1029*9880d681SAndroid Build Coastguard Worker  %vrsubhn2.i.i = tail call <2 x i32> @llvm.aarch64.neon.rsubhn.v2i32(<2 x i64> %a, <2 x i64> %b)
1030*9880d681SAndroid Build Coastguard Worker  %0 = bitcast <2 x i32> %r to <1 x i64>
1031*9880d681SAndroid Build Coastguard Worker  %1 = bitcast <2 x i32> %vrsubhn2.i.i to <1 x i64>
1032*9880d681SAndroid Build Coastguard Worker  %shuffle.i.i = shufflevector <1 x i64> %0, <1 x i64> %1, <2 x i32> <i32 0, i32 1>
1033*9880d681SAndroid Build Coastguard Worker  %2 = bitcast <2 x i64> %shuffle.i.i to <4 x i32>
1034*9880d681SAndroid Build Coastguard Worker  ret <4 x i32> %2
1035*9880d681SAndroid Build Coastguard Worker}
1036*9880d681SAndroid Build Coastguard Worker
1037*9880d681SAndroid Build Coastguard Workerdefine <16 x i8> @test_vrsubhn_high_u16(<8 x i8> %r, <8 x i16> %a, <8 x i16> %b) {
1038*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_vrsubhn_high_u16:
1039*9880d681SAndroid Build Coastguard Worker; CHECK: rsubhn2 {{v[0-9]+}}.16b, {{v[0-9]+}}.8h, {{v[0-9]+}}.8h
1040*9880d681SAndroid Build Coastguard Workerentry:
1041*9880d681SAndroid Build Coastguard Worker  %vrsubhn2.i.i = tail call <8 x i8> @llvm.aarch64.neon.rsubhn.v8i8(<8 x i16> %a, <8 x i16> %b)
1042*9880d681SAndroid Build Coastguard Worker  %0 = bitcast <8 x i8> %r to <1 x i64>
1043*9880d681SAndroid Build Coastguard Worker  %1 = bitcast <8 x i8> %vrsubhn2.i.i to <1 x i64>
1044*9880d681SAndroid Build Coastguard Worker  %shuffle.i.i = shufflevector <1 x i64> %0, <1 x i64> %1, <2 x i32> <i32 0, i32 1>
1045*9880d681SAndroid Build Coastguard Worker  %2 = bitcast <2 x i64> %shuffle.i.i to <16 x i8>
1046*9880d681SAndroid Build Coastguard Worker  ret <16 x i8> %2
1047*9880d681SAndroid Build Coastguard Worker}
1048*9880d681SAndroid Build Coastguard Worker
1049*9880d681SAndroid Build Coastguard Workerdefine <8 x i16> @test_vrsubhn_high_u32(<4 x i16> %r, <4 x i32> %a, <4 x i32> %b) {
1050*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_vrsubhn_high_u32:
1051*9880d681SAndroid Build Coastguard Worker; CHECK: rsubhn2 {{v[0-9]+}}.8h, {{v[0-9]+}}.4s, {{v[0-9]+}}.4s
1052*9880d681SAndroid Build Coastguard Workerentry:
1053*9880d681SAndroid Build Coastguard Worker  %vrsubhn2.i.i = tail call <4 x i16> @llvm.aarch64.neon.rsubhn.v4i16(<4 x i32> %a, <4 x i32> %b)
1054*9880d681SAndroid Build Coastguard Worker  %0 = bitcast <4 x i16> %r to <1 x i64>
1055*9880d681SAndroid Build Coastguard Worker  %1 = bitcast <4 x i16> %vrsubhn2.i.i to <1 x i64>
1056*9880d681SAndroid Build Coastguard Worker  %shuffle.i.i = shufflevector <1 x i64> %0, <1 x i64> %1, <2 x i32> <i32 0, i32 1>
1057*9880d681SAndroid Build Coastguard Worker  %2 = bitcast <2 x i64> %shuffle.i.i to <8 x i16>
1058*9880d681SAndroid Build Coastguard Worker  ret <8 x i16> %2
1059*9880d681SAndroid Build Coastguard Worker}
1060*9880d681SAndroid Build Coastguard Worker
1061*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @test_vrsubhn_high_u64(<2 x i32> %r, <2 x i64> %a, <2 x i64> %b) {
1062*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_vrsubhn_high_u64:
1063*9880d681SAndroid Build Coastguard Worker; CHECK: rsubhn2 {{v[0-9]+}}.4s, {{v[0-9]+}}.2d, {{v[0-9]+}}.2d
1064*9880d681SAndroid Build Coastguard Workerentry:
1065*9880d681SAndroid Build Coastguard Worker  %vrsubhn2.i.i = tail call <2 x i32> @llvm.aarch64.neon.rsubhn.v2i32(<2 x i64> %a, <2 x i64> %b)
1066*9880d681SAndroid Build Coastguard Worker  %0 = bitcast <2 x i32> %r to <1 x i64>
1067*9880d681SAndroid Build Coastguard Worker  %1 = bitcast <2 x i32> %vrsubhn2.i.i to <1 x i64>
1068*9880d681SAndroid Build Coastguard Worker  %shuffle.i.i = shufflevector <1 x i64> %0, <1 x i64> %1, <2 x i32> <i32 0, i32 1>
1069*9880d681SAndroid Build Coastguard Worker  %2 = bitcast <2 x i64> %shuffle.i.i to <4 x i32>
1070*9880d681SAndroid Build Coastguard Worker  ret <4 x i32> %2
1071*9880d681SAndroid Build Coastguard Worker}
1072*9880d681SAndroid Build Coastguard Worker
1073*9880d681SAndroid Build Coastguard Workerdefine <8 x i16> @test_vabdl_s8(<8 x i8> %a, <8 x i8> %b) {
1074*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_vabdl_s8:
1075*9880d681SAndroid Build Coastguard Worker; CHECK: sabdl {{v[0-9]+}}.8h, {{v[0-9]+}}.8b, {{v[0-9]+}}.8b
1076*9880d681SAndroid Build Coastguard Workerentry:
1077*9880d681SAndroid Build Coastguard Worker  %vabd.i.i = tail call <8 x i8> @llvm.aarch64.neon.sabd.v8i8(<8 x i8> %a, <8 x i8> %b)
1078*9880d681SAndroid Build Coastguard Worker  %vmovl.i.i = zext <8 x i8> %vabd.i.i to <8 x i16>
1079*9880d681SAndroid Build Coastguard Worker  ret <8 x i16> %vmovl.i.i
1080*9880d681SAndroid Build Coastguard Worker}
1081*9880d681SAndroid Build Coastguard Worker
1082*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @test_vabdl_s16(<4 x i16> %a, <4 x i16> %b) {
1083*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_vabdl_s16:
1084*9880d681SAndroid Build Coastguard Worker; CHECK: sabdl {{v[0-9]+}}.4s, {{v[0-9]+}}.4h, {{v[0-9]+}}.4h
1085*9880d681SAndroid Build Coastguard Workerentry:
1086*9880d681SAndroid Build Coastguard Worker  %vabd2.i.i = tail call <4 x i16> @llvm.aarch64.neon.sabd.v4i16(<4 x i16> %a, <4 x i16> %b)
1087*9880d681SAndroid Build Coastguard Worker  %vmovl.i.i = zext <4 x i16> %vabd2.i.i to <4 x i32>
1088*9880d681SAndroid Build Coastguard Worker  ret <4 x i32> %vmovl.i.i
1089*9880d681SAndroid Build Coastguard Worker}
1090*9880d681SAndroid Build Coastguard Worker
1091*9880d681SAndroid Build Coastguard Workerdefine <2 x i64> @test_vabdl_s32(<2 x i32> %a, <2 x i32> %b) {
1092*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_vabdl_s32:
1093*9880d681SAndroid Build Coastguard Worker; CHECK: sabdl {{v[0-9]+}}.2d, {{v[0-9]+}}.2s, {{v[0-9]+}}.2s
1094*9880d681SAndroid Build Coastguard Workerentry:
1095*9880d681SAndroid Build Coastguard Worker  %vabd2.i.i = tail call <2 x i32> @llvm.aarch64.neon.sabd.v2i32(<2 x i32> %a, <2 x i32> %b)
1096*9880d681SAndroid Build Coastguard Worker  %vmovl.i.i = zext <2 x i32> %vabd2.i.i to <2 x i64>
1097*9880d681SAndroid Build Coastguard Worker  ret <2 x i64> %vmovl.i.i
1098*9880d681SAndroid Build Coastguard Worker}
1099*9880d681SAndroid Build Coastguard Worker
1100*9880d681SAndroid Build Coastguard Workerdefine <8 x i16> @test_vabdl_u8(<8 x i8> %a, <8 x i8> %b) {
1101*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_vabdl_u8:
1102*9880d681SAndroid Build Coastguard Worker; CHECK: uabdl {{v[0-9]+}}.8h, {{v[0-9]+}}.8b, {{v[0-9]+}}.8b
1103*9880d681SAndroid Build Coastguard Workerentry:
1104*9880d681SAndroid Build Coastguard Worker  %vabd.i.i = tail call <8 x i8> @llvm.aarch64.neon.uabd.v8i8(<8 x i8> %a, <8 x i8> %b)
1105*9880d681SAndroid Build Coastguard Worker  %vmovl.i.i = zext <8 x i8> %vabd.i.i to <8 x i16>
1106*9880d681SAndroid Build Coastguard Worker  ret <8 x i16> %vmovl.i.i
1107*9880d681SAndroid Build Coastguard Worker}
1108*9880d681SAndroid Build Coastguard Worker
1109*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @test_vabdl_u16(<4 x i16> %a, <4 x i16> %b) {
1110*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_vabdl_u16:
1111*9880d681SAndroid Build Coastguard Worker; CHECK: uabdl {{v[0-9]+}}.4s, {{v[0-9]+}}.4h, {{v[0-9]+}}.4h
1112*9880d681SAndroid Build Coastguard Workerentry:
1113*9880d681SAndroid Build Coastguard Worker  %vabd2.i.i = tail call <4 x i16> @llvm.aarch64.neon.uabd.v4i16(<4 x i16> %a, <4 x i16> %b)
1114*9880d681SAndroid Build Coastguard Worker  %vmovl.i.i = zext <4 x i16> %vabd2.i.i to <4 x i32>
1115*9880d681SAndroid Build Coastguard Worker  ret <4 x i32> %vmovl.i.i
1116*9880d681SAndroid Build Coastguard Worker}
1117*9880d681SAndroid Build Coastguard Worker
1118*9880d681SAndroid Build Coastguard Workerdefine <2 x i64> @test_vabdl_u32(<2 x i32> %a, <2 x i32> %b) {
1119*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_vabdl_u32:
1120*9880d681SAndroid Build Coastguard Worker; CHECK: uabdl {{v[0-9]+}}.2d, {{v[0-9]+}}.2s, {{v[0-9]+}}.2s
1121*9880d681SAndroid Build Coastguard Workerentry:
1122*9880d681SAndroid Build Coastguard Worker  %vabd2.i.i = tail call <2 x i32> @llvm.aarch64.neon.uabd.v2i32(<2 x i32> %a, <2 x i32> %b)
1123*9880d681SAndroid Build Coastguard Worker  %vmovl.i.i = zext <2 x i32> %vabd2.i.i to <2 x i64>
1124*9880d681SAndroid Build Coastguard Worker  ret <2 x i64> %vmovl.i.i
1125*9880d681SAndroid Build Coastguard Worker}
1126*9880d681SAndroid Build Coastguard Worker
1127*9880d681SAndroid Build Coastguard Workerdefine <8 x i16> @test_vabal_s8(<8 x i16> %a, <8 x i8> %b, <8 x i8> %c) {
1128*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_vabal_s8:
1129*9880d681SAndroid Build Coastguard Worker; CHECK: sabal {{v[0-9]+}}.8h, {{v[0-9]+}}.8b, {{v[0-9]+}}.8b
1130*9880d681SAndroid Build Coastguard Workerentry:
1131*9880d681SAndroid Build Coastguard Worker  %vabd.i.i.i = tail call <8 x i8> @llvm.aarch64.neon.sabd.v8i8(<8 x i8> %b, <8 x i8> %c)
1132*9880d681SAndroid Build Coastguard Worker  %vmovl.i.i.i = zext <8 x i8> %vabd.i.i.i to <8 x i16>
1133*9880d681SAndroid Build Coastguard Worker  %add.i = add <8 x i16> %vmovl.i.i.i, %a
1134*9880d681SAndroid Build Coastguard Worker  ret <8 x i16> %add.i
1135*9880d681SAndroid Build Coastguard Worker}
1136*9880d681SAndroid Build Coastguard Worker
1137*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @test_vabal_s16(<4 x i32> %a, <4 x i16> %b, <4 x i16> %c) {
1138*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_vabal_s16:
1139*9880d681SAndroid Build Coastguard Worker; CHECK: sabal {{v[0-9]+}}.4s, {{v[0-9]+}}.4h, {{v[0-9]+}}.4h
1140*9880d681SAndroid Build Coastguard Workerentry:
1141*9880d681SAndroid Build Coastguard Worker  %vabd2.i.i.i = tail call <4 x i16> @llvm.aarch64.neon.sabd.v4i16(<4 x i16> %b, <4 x i16> %c)
1142*9880d681SAndroid Build Coastguard Worker  %vmovl.i.i.i = zext <4 x i16> %vabd2.i.i.i to <4 x i32>
1143*9880d681SAndroid Build Coastguard Worker  %add.i = add <4 x i32> %vmovl.i.i.i, %a
1144*9880d681SAndroid Build Coastguard Worker  ret <4 x i32> %add.i
1145*9880d681SAndroid Build Coastguard Worker}
1146*9880d681SAndroid Build Coastguard Worker
1147*9880d681SAndroid Build Coastguard Workerdefine <2 x i64> @test_vabal_s32(<2 x i64> %a, <2 x i32> %b, <2 x i32> %c) {
1148*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_vabal_s32:
1149*9880d681SAndroid Build Coastguard Worker; CHECK: sabal {{v[0-9]+}}.2d, {{v[0-9]+}}.2s, {{v[0-9]+}}.2s
1150*9880d681SAndroid Build Coastguard Workerentry:
1151*9880d681SAndroid Build Coastguard Worker  %vabd2.i.i.i = tail call <2 x i32> @llvm.aarch64.neon.sabd.v2i32(<2 x i32> %b, <2 x i32> %c)
1152*9880d681SAndroid Build Coastguard Worker  %vmovl.i.i.i = zext <2 x i32> %vabd2.i.i.i to <2 x i64>
1153*9880d681SAndroid Build Coastguard Worker  %add.i = add <2 x i64> %vmovl.i.i.i, %a
1154*9880d681SAndroid Build Coastguard Worker  ret <2 x i64> %add.i
1155*9880d681SAndroid Build Coastguard Worker}
1156*9880d681SAndroid Build Coastguard Worker
1157*9880d681SAndroid Build Coastguard Workerdefine <8 x i16> @test_vabal_u8(<8 x i16> %a, <8 x i8> %b, <8 x i8> %c) {
1158*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_vabal_u8:
1159*9880d681SAndroid Build Coastguard Worker; CHECK: uabal {{v[0-9]+}}.8h, {{v[0-9]+}}.8b, {{v[0-9]+}}.8b
1160*9880d681SAndroid Build Coastguard Workerentry:
1161*9880d681SAndroid Build Coastguard Worker  %vabd.i.i.i = tail call <8 x i8> @llvm.aarch64.neon.uabd.v8i8(<8 x i8> %b, <8 x i8> %c)
1162*9880d681SAndroid Build Coastguard Worker  %vmovl.i.i.i = zext <8 x i8> %vabd.i.i.i to <8 x i16>
1163*9880d681SAndroid Build Coastguard Worker  %add.i = add <8 x i16> %vmovl.i.i.i, %a
1164*9880d681SAndroid Build Coastguard Worker  ret <8 x i16> %add.i
1165*9880d681SAndroid Build Coastguard Worker}
1166*9880d681SAndroid Build Coastguard Worker
1167*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @test_vabal_u16(<4 x i32> %a, <4 x i16> %b, <4 x i16> %c) {
1168*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_vabal_u16:
1169*9880d681SAndroid Build Coastguard Worker; CHECK: uabal {{v[0-9]+}}.4s, {{v[0-9]+}}.4h, {{v[0-9]+}}.4h
1170*9880d681SAndroid Build Coastguard Workerentry:
1171*9880d681SAndroid Build Coastguard Worker  %vabd2.i.i.i = tail call <4 x i16> @llvm.aarch64.neon.uabd.v4i16(<4 x i16> %b, <4 x i16> %c)
1172*9880d681SAndroid Build Coastguard Worker  %vmovl.i.i.i = zext <4 x i16> %vabd2.i.i.i to <4 x i32>
1173*9880d681SAndroid Build Coastguard Worker  %add.i = add <4 x i32> %vmovl.i.i.i, %a
1174*9880d681SAndroid Build Coastguard Worker  ret <4 x i32> %add.i
1175*9880d681SAndroid Build Coastguard Worker}
1176*9880d681SAndroid Build Coastguard Worker
1177*9880d681SAndroid Build Coastguard Workerdefine <2 x i64> @test_vabal_u32(<2 x i64> %a, <2 x i32> %b, <2 x i32> %c) {
1178*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_vabal_u32:
1179*9880d681SAndroid Build Coastguard Worker; CHECK: uabal {{v[0-9]+}}.2d, {{v[0-9]+}}.2s, {{v[0-9]+}}.2s
1180*9880d681SAndroid Build Coastguard Workerentry:
1181*9880d681SAndroid Build Coastguard Worker  %vabd2.i.i.i = tail call <2 x i32> @llvm.aarch64.neon.uabd.v2i32(<2 x i32> %b, <2 x i32> %c)
1182*9880d681SAndroid Build Coastguard Worker  %vmovl.i.i.i = zext <2 x i32> %vabd2.i.i.i to <2 x i64>
1183*9880d681SAndroid Build Coastguard Worker  %add.i = add <2 x i64> %vmovl.i.i.i, %a
1184*9880d681SAndroid Build Coastguard Worker  ret <2 x i64> %add.i
1185*9880d681SAndroid Build Coastguard Worker}
1186*9880d681SAndroid Build Coastguard Worker
1187*9880d681SAndroid Build Coastguard Workerdefine <8 x i16> @test_vabdl_high_s8(<16 x i8> %a, <16 x i8> %b) {
1188*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_vabdl_high_s8:
1189*9880d681SAndroid Build Coastguard Worker; CHECK: sabdl2 {{v[0-9]+}}.8h, {{v[0-9]+}}.16b, {{v[0-9]+}}.16b
1190*9880d681SAndroid Build Coastguard Workerentry:
1191*9880d681SAndroid Build Coastguard Worker  %shuffle.i.i = shufflevector <16 x i8> %a, <16 x i8> undef, <8 x i32> <i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15>
1192*9880d681SAndroid Build Coastguard Worker  %shuffle.i3.i = shufflevector <16 x i8> %b, <16 x i8> undef, <8 x i32> <i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15>
1193*9880d681SAndroid Build Coastguard Worker  %vabd.i.i.i = tail call <8 x i8> @llvm.aarch64.neon.sabd.v8i8(<8 x i8> %shuffle.i.i, <8 x i8> %shuffle.i3.i)
1194*9880d681SAndroid Build Coastguard Worker  %vmovl.i.i.i = zext <8 x i8> %vabd.i.i.i to <8 x i16>
1195*9880d681SAndroid Build Coastguard Worker  ret <8 x i16> %vmovl.i.i.i
1196*9880d681SAndroid Build Coastguard Worker}
1197*9880d681SAndroid Build Coastguard Worker
1198*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @test_vabdl_high_s16(<8 x i16> %a, <8 x i16> %b) {
1199*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_vabdl_high_s16:
1200*9880d681SAndroid Build Coastguard Worker; CHECK: sabdl2 {{v[0-9]+}}.4s, {{v[0-9]+}}.8h, {{v[0-9]+}}.8h
1201*9880d681SAndroid Build Coastguard Workerentry:
1202*9880d681SAndroid Build Coastguard Worker  %shuffle.i.i = shufflevector <8 x i16> %a, <8 x i16> undef, <4 x i32> <i32 4, i32 5, i32 6, i32 7>
1203*9880d681SAndroid Build Coastguard Worker  %shuffle.i3.i = shufflevector <8 x i16> %b, <8 x i16> undef, <4 x i32> <i32 4, i32 5, i32 6, i32 7>
1204*9880d681SAndroid Build Coastguard Worker  %vabd2.i.i.i = tail call <4 x i16> @llvm.aarch64.neon.sabd.v4i16(<4 x i16> %shuffle.i.i, <4 x i16> %shuffle.i3.i)
1205*9880d681SAndroid Build Coastguard Worker  %vmovl.i.i.i = zext <4 x i16> %vabd2.i.i.i to <4 x i32>
1206*9880d681SAndroid Build Coastguard Worker  ret <4 x i32> %vmovl.i.i.i
1207*9880d681SAndroid Build Coastguard Worker}
1208*9880d681SAndroid Build Coastguard Worker
1209*9880d681SAndroid Build Coastguard Workerdefine <2 x i64> @test_vabdl_high_s32(<4 x i32> %a, <4 x i32> %b) {
1210*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_vabdl_high_s32:
1211*9880d681SAndroid Build Coastguard Worker; CHECK: sabdl2 {{v[0-9]+}}.2d, {{v[0-9]+}}.4s, {{v[0-9]+}}.4s
1212*9880d681SAndroid Build Coastguard Workerentry:
1213*9880d681SAndroid Build Coastguard Worker  %shuffle.i.i = shufflevector <4 x i32> %a, <4 x i32> undef, <2 x i32> <i32 2, i32 3>
1214*9880d681SAndroid Build Coastguard Worker  %shuffle.i3.i = shufflevector <4 x i32> %b, <4 x i32> undef, <2 x i32> <i32 2, i32 3>
1215*9880d681SAndroid Build Coastguard Worker  %vabd2.i.i.i = tail call <2 x i32> @llvm.aarch64.neon.sabd.v2i32(<2 x i32> %shuffle.i.i, <2 x i32> %shuffle.i3.i)
1216*9880d681SAndroid Build Coastguard Worker  %vmovl.i.i.i = zext <2 x i32> %vabd2.i.i.i to <2 x i64>
1217*9880d681SAndroid Build Coastguard Worker  ret <2 x i64> %vmovl.i.i.i
1218*9880d681SAndroid Build Coastguard Worker}
1219*9880d681SAndroid Build Coastguard Worker
1220*9880d681SAndroid Build Coastguard Workerdefine <8 x i16> @test_vabdl_high_u8(<16 x i8> %a, <16 x i8> %b) {
1221*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_vabdl_high_u8:
1222*9880d681SAndroid Build Coastguard Worker; CHECK: uabdl2 {{v[0-9]+}}.8h, {{v[0-9]+}}.16b, {{v[0-9]+}}.16b
1223*9880d681SAndroid Build Coastguard Workerentry:
1224*9880d681SAndroid Build Coastguard Worker  %shuffle.i.i = shufflevector <16 x i8> %a, <16 x i8> undef, <8 x i32> <i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15>
1225*9880d681SAndroid Build Coastguard Worker  %shuffle.i3.i = shufflevector <16 x i8> %b, <16 x i8> undef, <8 x i32> <i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15>
1226*9880d681SAndroid Build Coastguard Worker  %vabd.i.i.i = tail call <8 x i8> @llvm.aarch64.neon.uabd.v8i8(<8 x i8> %shuffle.i.i, <8 x i8> %shuffle.i3.i)
1227*9880d681SAndroid Build Coastguard Worker  %vmovl.i.i.i = zext <8 x i8> %vabd.i.i.i to <8 x i16>
1228*9880d681SAndroid Build Coastguard Worker  ret <8 x i16> %vmovl.i.i.i
1229*9880d681SAndroid Build Coastguard Worker}
1230*9880d681SAndroid Build Coastguard Worker
1231*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @test_vabdl_high_u16(<8 x i16> %a, <8 x i16> %b) {
1232*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_vabdl_high_u16:
1233*9880d681SAndroid Build Coastguard Worker; CHECK: uabdl2 {{v[0-9]+}}.4s, {{v[0-9]+}}.8h, {{v[0-9]+}}.8h
1234*9880d681SAndroid Build Coastguard Workerentry:
1235*9880d681SAndroid Build Coastguard Worker  %shuffle.i.i = shufflevector <8 x i16> %a, <8 x i16> undef, <4 x i32> <i32 4, i32 5, i32 6, i32 7>
1236*9880d681SAndroid Build Coastguard Worker  %shuffle.i3.i = shufflevector <8 x i16> %b, <8 x i16> undef, <4 x i32> <i32 4, i32 5, i32 6, i32 7>
1237*9880d681SAndroid Build Coastguard Worker  %vabd2.i.i.i = tail call <4 x i16> @llvm.aarch64.neon.uabd.v4i16(<4 x i16> %shuffle.i.i, <4 x i16> %shuffle.i3.i)
1238*9880d681SAndroid Build Coastguard Worker  %vmovl.i.i.i = zext <4 x i16> %vabd2.i.i.i to <4 x i32>
1239*9880d681SAndroid Build Coastguard Worker  ret <4 x i32> %vmovl.i.i.i
1240*9880d681SAndroid Build Coastguard Worker}
1241*9880d681SAndroid Build Coastguard Worker
1242*9880d681SAndroid Build Coastguard Workerdefine <2 x i64> @test_vabdl_high_u32(<4 x i32> %a, <4 x i32> %b) {
1243*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_vabdl_high_u32:
1244*9880d681SAndroid Build Coastguard Worker; CHECK: uabdl2 {{v[0-9]+}}.2d, {{v[0-9]+}}.4s, {{v[0-9]+}}.4s
1245*9880d681SAndroid Build Coastguard Workerentry:
1246*9880d681SAndroid Build Coastguard Worker  %shuffle.i.i = shufflevector <4 x i32> %a, <4 x i32> undef, <2 x i32> <i32 2, i32 3>
1247*9880d681SAndroid Build Coastguard Worker  %shuffle.i3.i = shufflevector <4 x i32> %b, <4 x i32> undef, <2 x i32> <i32 2, i32 3>
1248*9880d681SAndroid Build Coastguard Worker  %vabd2.i.i.i = tail call <2 x i32> @llvm.aarch64.neon.uabd.v2i32(<2 x i32> %shuffle.i.i, <2 x i32> %shuffle.i3.i)
1249*9880d681SAndroid Build Coastguard Worker  %vmovl.i.i.i = zext <2 x i32> %vabd2.i.i.i to <2 x i64>
1250*9880d681SAndroid Build Coastguard Worker  ret <2 x i64> %vmovl.i.i.i
1251*9880d681SAndroid Build Coastguard Worker}
1252*9880d681SAndroid Build Coastguard Worker
1253*9880d681SAndroid Build Coastguard Workerdefine <8 x i16> @test_vabal_high_s8(<8 x i16> %a, <16 x i8> %b, <16 x i8> %c) {
1254*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_vabal_high_s8:
1255*9880d681SAndroid Build Coastguard Worker; CHECK: sabal2 {{v[0-9]+}}.8h, {{v[0-9]+}}.16b, {{v[0-9]+}}.16b
1256*9880d681SAndroid Build Coastguard Workerentry:
1257*9880d681SAndroid Build Coastguard Worker  %shuffle.i.i = shufflevector <16 x i8> %b, <16 x i8> undef, <8 x i32> <i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15>
1258*9880d681SAndroid Build Coastguard Worker  %shuffle.i3.i = shufflevector <16 x i8> %c, <16 x i8> undef, <8 x i32> <i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15>
1259*9880d681SAndroid Build Coastguard Worker  %vabd.i.i.i.i = tail call <8 x i8> @llvm.aarch64.neon.sabd.v8i8(<8 x i8> %shuffle.i.i, <8 x i8> %shuffle.i3.i)
1260*9880d681SAndroid Build Coastguard Worker  %vmovl.i.i.i.i = zext <8 x i8> %vabd.i.i.i.i to <8 x i16>
1261*9880d681SAndroid Build Coastguard Worker  %add.i.i = add <8 x i16> %vmovl.i.i.i.i, %a
1262*9880d681SAndroid Build Coastguard Worker  ret <8 x i16> %add.i.i
1263*9880d681SAndroid Build Coastguard Worker}
1264*9880d681SAndroid Build Coastguard Worker
1265*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @test_vabal_high_s16(<4 x i32> %a, <8 x i16> %b, <8 x i16> %c) {
1266*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_vabal_high_s16:
1267*9880d681SAndroid Build Coastguard Worker; CHECK: sabal2 {{v[0-9]+}}.4s, {{v[0-9]+}}.8h, {{v[0-9]+}}.8h
1268*9880d681SAndroid Build Coastguard Workerentry:
1269*9880d681SAndroid Build Coastguard Worker  %shuffle.i.i = shufflevector <8 x i16> %b, <8 x i16> undef, <4 x i32> <i32 4, i32 5, i32 6, i32 7>
1270*9880d681SAndroid Build Coastguard Worker  %shuffle.i3.i = shufflevector <8 x i16> %c, <8 x i16> undef, <4 x i32> <i32 4, i32 5, i32 6, i32 7>
1271*9880d681SAndroid Build Coastguard Worker  %vabd2.i.i.i.i = tail call <4 x i16> @llvm.aarch64.neon.sabd.v4i16(<4 x i16> %shuffle.i.i, <4 x i16> %shuffle.i3.i)
1272*9880d681SAndroid Build Coastguard Worker  %vmovl.i.i.i.i = zext <4 x i16> %vabd2.i.i.i.i to <4 x i32>
1273*9880d681SAndroid Build Coastguard Worker  %add.i.i = add <4 x i32> %vmovl.i.i.i.i, %a
1274*9880d681SAndroid Build Coastguard Worker  ret <4 x i32> %add.i.i
1275*9880d681SAndroid Build Coastguard Worker}
1276*9880d681SAndroid Build Coastguard Worker
1277*9880d681SAndroid Build Coastguard Workerdefine <2 x i64> @test_vabal_high_s32(<2 x i64> %a, <4 x i32> %b, <4 x i32> %c) {
1278*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_vabal_high_s32:
1279*9880d681SAndroid Build Coastguard Worker; CHECK: sabal2 {{v[0-9]+}}.2d, {{v[0-9]+}}.4s, {{v[0-9]+}}.4s
1280*9880d681SAndroid Build Coastguard Workerentry:
1281*9880d681SAndroid Build Coastguard Worker  %shuffle.i.i = shufflevector <4 x i32> %b, <4 x i32> undef, <2 x i32> <i32 2, i32 3>
1282*9880d681SAndroid Build Coastguard Worker  %shuffle.i3.i = shufflevector <4 x i32> %c, <4 x i32> undef, <2 x i32> <i32 2, i32 3>
1283*9880d681SAndroid Build Coastguard Worker  %vabd2.i.i.i.i = tail call <2 x i32> @llvm.aarch64.neon.sabd.v2i32(<2 x i32> %shuffle.i.i, <2 x i32> %shuffle.i3.i)
1284*9880d681SAndroid Build Coastguard Worker  %vmovl.i.i.i.i = zext <2 x i32> %vabd2.i.i.i.i to <2 x i64>
1285*9880d681SAndroid Build Coastguard Worker  %add.i.i = add <2 x i64> %vmovl.i.i.i.i, %a
1286*9880d681SAndroid Build Coastguard Worker  ret <2 x i64> %add.i.i
1287*9880d681SAndroid Build Coastguard Worker}
1288*9880d681SAndroid Build Coastguard Worker
1289*9880d681SAndroid Build Coastguard Workerdefine <8 x i16> @test_vabal_high_u8(<8 x i16> %a, <16 x i8> %b, <16 x i8> %c) {
1290*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_vabal_high_u8:
1291*9880d681SAndroid Build Coastguard Worker; CHECK: uabal2 {{v[0-9]+}}.8h, {{v[0-9]+}}.16b, {{v[0-9]+}}.16b
1292*9880d681SAndroid Build Coastguard Workerentry:
1293*9880d681SAndroid Build Coastguard Worker  %shuffle.i.i = shufflevector <16 x i8> %b, <16 x i8> undef, <8 x i32> <i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15>
1294*9880d681SAndroid Build Coastguard Worker  %shuffle.i3.i = shufflevector <16 x i8> %c, <16 x i8> undef, <8 x i32> <i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15>
1295*9880d681SAndroid Build Coastguard Worker  %vabd.i.i.i.i = tail call <8 x i8> @llvm.aarch64.neon.uabd.v8i8(<8 x i8> %shuffle.i.i, <8 x i8> %shuffle.i3.i)
1296*9880d681SAndroid Build Coastguard Worker  %vmovl.i.i.i.i = zext <8 x i8> %vabd.i.i.i.i to <8 x i16>
1297*9880d681SAndroid Build Coastguard Worker  %add.i.i = add <8 x i16> %vmovl.i.i.i.i, %a
1298*9880d681SAndroid Build Coastguard Worker  ret <8 x i16> %add.i.i
1299*9880d681SAndroid Build Coastguard Worker}
1300*9880d681SAndroid Build Coastguard Worker
1301*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @test_vabal_high_u16(<4 x i32> %a, <8 x i16> %b, <8 x i16> %c) {
1302*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_vabal_high_u16:
1303*9880d681SAndroid Build Coastguard Worker; CHECK: uabal2 {{v[0-9]+}}.4s, {{v[0-9]+}}.8h, {{v[0-9]+}}.8h
1304*9880d681SAndroid Build Coastguard Workerentry:
1305*9880d681SAndroid Build Coastguard Worker  %shuffle.i.i = shufflevector <8 x i16> %b, <8 x i16> undef, <4 x i32> <i32 4, i32 5, i32 6, i32 7>
1306*9880d681SAndroid Build Coastguard Worker  %shuffle.i3.i = shufflevector <8 x i16> %c, <8 x i16> undef, <4 x i32> <i32 4, i32 5, i32 6, i32 7>
1307*9880d681SAndroid Build Coastguard Worker  %vabd2.i.i.i.i = tail call <4 x i16> @llvm.aarch64.neon.uabd.v4i16(<4 x i16> %shuffle.i.i, <4 x i16> %shuffle.i3.i)
1308*9880d681SAndroid Build Coastguard Worker  %vmovl.i.i.i.i = zext <4 x i16> %vabd2.i.i.i.i to <4 x i32>
1309*9880d681SAndroid Build Coastguard Worker  %add.i.i = add <4 x i32> %vmovl.i.i.i.i, %a
1310*9880d681SAndroid Build Coastguard Worker  ret <4 x i32> %add.i.i
1311*9880d681SAndroid Build Coastguard Worker}
1312*9880d681SAndroid Build Coastguard Worker
1313*9880d681SAndroid Build Coastguard Workerdefine <2 x i64> @test_vabal_high_u32(<2 x i64> %a, <4 x i32> %b, <4 x i32> %c) {
1314*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_vabal_high_u32:
1315*9880d681SAndroid Build Coastguard Worker; CHECK: uabal2 {{v[0-9]+}}.2d, {{v[0-9]+}}.4s, {{v[0-9]+}}.4s
1316*9880d681SAndroid Build Coastguard Workerentry:
1317*9880d681SAndroid Build Coastguard Worker  %shuffle.i.i = shufflevector <4 x i32> %b, <4 x i32> undef, <2 x i32> <i32 2, i32 3>
1318*9880d681SAndroid Build Coastguard Worker  %shuffle.i3.i = shufflevector <4 x i32> %c, <4 x i32> undef, <2 x i32> <i32 2, i32 3>
1319*9880d681SAndroid Build Coastguard Worker  %vabd2.i.i.i.i = tail call <2 x i32> @llvm.aarch64.neon.uabd.v2i32(<2 x i32> %shuffle.i.i, <2 x i32> %shuffle.i3.i)
1320*9880d681SAndroid Build Coastguard Worker  %vmovl.i.i.i.i = zext <2 x i32> %vabd2.i.i.i.i to <2 x i64>
1321*9880d681SAndroid Build Coastguard Worker  %add.i.i = add <2 x i64> %vmovl.i.i.i.i, %a
1322*9880d681SAndroid Build Coastguard Worker  ret <2 x i64> %add.i.i
1323*9880d681SAndroid Build Coastguard Worker}
1324*9880d681SAndroid Build Coastguard Worker
1325*9880d681SAndroid Build Coastguard Workerdefine <8 x i16> @test_vmull_s8(<8 x i8> %a, <8 x i8> %b) {
1326*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_vmull_s8:
1327*9880d681SAndroid Build Coastguard Worker; CHECK: smull {{v[0-9]+}}.8h, {{v[0-9]+}}.8b, {{v[0-9]+}}.8b
1328*9880d681SAndroid Build Coastguard Workerentry:
1329*9880d681SAndroid Build Coastguard Worker  %vmull.i = tail call <8 x i16> @llvm.aarch64.neon.smull.v8i16(<8 x i8> %a, <8 x i8> %b)
1330*9880d681SAndroid Build Coastguard Worker  ret <8 x i16> %vmull.i
1331*9880d681SAndroid Build Coastguard Worker}
1332*9880d681SAndroid Build Coastguard Worker
1333*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @test_vmull_s16(<4 x i16> %a, <4 x i16> %b) {
1334*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_vmull_s16:
1335*9880d681SAndroid Build Coastguard Worker; CHECK: smull {{v[0-9]+}}.4s, {{v[0-9]+}}.4h, {{v[0-9]+}}.4h
1336*9880d681SAndroid Build Coastguard Workerentry:
1337*9880d681SAndroid Build Coastguard Worker  %vmull2.i = tail call <4 x i32> @llvm.aarch64.neon.smull.v4i32(<4 x i16> %a, <4 x i16> %b)
1338*9880d681SAndroid Build Coastguard Worker  ret <4 x i32> %vmull2.i
1339*9880d681SAndroid Build Coastguard Worker}
1340*9880d681SAndroid Build Coastguard Worker
1341*9880d681SAndroid Build Coastguard Workerdefine <2 x i64> @test_vmull_s32(<2 x i32> %a, <2 x i32> %b) {
1342*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_vmull_s32:
1343*9880d681SAndroid Build Coastguard Worker; CHECK: smull {{v[0-9]+}}.2d, {{v[0-9]+}}.2s, {{v[0-9]+}}.2s
1344*9880d681SAndroid Build Coastguard Workerentry:
1345*9880d681SAndroid Build Coastguard Worker  %vmull2.i = tail call <2 x i64> @llvm.aarch64.neon.smull.v2i64(<2 x i32> %a, <2 x i32> %b)
1346*9880d681SAndroid Build Coastguard Worker  ret <2 x i64> %vmull2.i
1347*9880d681SAndroid Build Coastguard Worker}
1348*9880d681SAndroid Build Coastguard Worker
1349*9880d681SAndroid Build Coastguard Workerdefine <8 x i16> @test_vmull_u8(<8 x i8> %a, <8 x i8> %b) {
1350*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_vmull_u8:
1351*9880d681SAndroid Build Coastguard Worker; CHECK: umull {{v[0-9]+}}.8h, {{v[0-9]+}}.8b, {{v[0-9]+}}.8b
1352*9880d681SAndroid Build Coastguard Workerentry:
1353*9880d681SAndroid Build Coastguard Worker  %vmull.i = tail call <8 x i16> @llvm.aarch64.neon.umull.v8i16(<8 x i8> %a, <8 x i8> %b)
1354*9880d681SAndroid Build Coastguard Worker  ret <8 x i16> %vmull.i
1355*9880d681SAndroid Build Coastguard Worker}
1356*9880d681SAndroid Build Coastguard Worker
1357*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @test_vmull_u16(<4 x i16> %a, <4 x i16> %b) {
1358*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_vmull_u16:
1359*9880d681SAndroid Build Coastguard Worker; CHECK: umull {{v[0-9]+}}.4s, {{v[0-9]+}}.4h, {{v[0-9]+}}.4h
1360*9880d681SAndroid Build Coastguard Workerentry:
1361*9880d681SAndroid Build Coastguard Worker  %vmull2.i = tail call <4 x i32> @llvm.aarch64.neon.umull.v4i32(<4 x i16> %a, <4 x i16> %b)
1362*9880d681SAndroid Build Coastguard Worker  ret <4 x i32> %vmull2.i
1363*9880d681SAndroid Build Coastguard Worker}
1364*9880d681SAndroid Build Coastguard Worker
1365*9880d681SAndroid Build Coastguard Workerdefine <2 x i64> @test_vmull_u32(<2 x i32> %a, <2 x i32> %b) {
1366*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_vmull_u32:
1367*9880d681SAndroid Build Coastguard Worker; CHECK: umull {{v[0-9]+}}.2d, {{v[0-9]+}}.2s, {{v[0-9]+}}.2s
1368*9880d681SAndroid Build Coastguard Workerentry:
1369*9880d681SAndroid Build Coastguard Worker  %vmull2.i = tail call <2 x i64> @llvm.aarch64.neon.umull.v2i64(<2 x i32> %a, <2 x i32> %b)
1370*9880d681SAndroid Build Coastguard Worker  ret <2 x i64> %vmull2.i
1371*9880d681SAndroid Build Coastguard Worker}
1372*9880d681SAndroid Build Coastguard Worker
1373*9880d681SAndroid Build Coastguard Workerdefine <8 x i16> @test_vmull_high_s8(<16 x i8> %a, <16 x i8> %b) {
1374*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_vmull_high_s8:
1375*9880d681SAndroid Build Coastguard Worker; CHECK: smull2 {{v[0-9]+}}.8h, {{v[0-9]+}}.16b, {{v[0-9]+}}.16b
1376*9880d681SAndroid Build Coastguard Workerentry:
1377*9880d681SAndroid Build Coastguard Worker  %shuffle.i.i = shufflevector <16 x i8> %a, <16 x i8> undef, <8 x i32> <i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15>
1378*9880d681SAndroid Build Coastguard Worker  %shuffle.i3.i = shufflevector <16 x i8> %b, <16 x i8> undef, <8 x i32> <i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15>
1379*9880d681SAndroid Build Coastguard Worker  %vmull.i.i = tail call <8 x i16> @llvm.aarch64.neon.smull.v8i16(<8 x i8> %shuffle.i.i, <8 x i8> %shuffle.i3.i)
1380*9880d681SAndroid Build Coastguard Worker  ret <8 x i16> %vmull.i.i
1381*9880d681SAndroid Build Coastguard Worker}
1382*9880d681SAndroid Build Coastguard Worker
1383*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @test_vmull_high_s16(<8 x i16> %a, <8 x i16> %b) {
1384*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_vmull_high_s16:
1385*9880d681SAndroid Build Coastguard Worker; CHECK: smull2 {{v[0-9]+}}.4s, {{v[0-9]+}}.8h, {{v[0-9]+}}.8h
1386*9880d681SAndroid Build Coastguard Workerentry:
1387*9880d681SAndroid Build Coastguard Worker  %shuffle.i.i = shufflevector <8 x i16> %a, <8 x i16> undef, <4 x i32> <i32 4, i32 5, i32 6, i32 7>
1388*9880d681SAndroid Build Coastguard Worker  %shuffle.i3.i = shufflevector <8 x i16> %b, <8 x i16> undef, <4 x i32> <i32 4, i32 5, i32 6, i32 7>
1389*9880d681SAndroid Build Coastguard Worker  %vmull2.i.i = tail call <4 x i32> @llvm.aarch64.neon.smull.v4i32(<4 x i16> %shuffle.i.i, <4 x i16> %shuffle.i3.i)
1390*9880d681SAndroid Build Coastguard Worker  ret <4 x i32> %vmull2.i.i
1391*9880d681SAndroid Build Coastguard Worker}
1392*9880d681SAndroid Build Coastguard Worker
1393*9880d681SAndroid Build Coastguard Workerdefine <2 x i64> @test_vmull_high_s32(<4 x i32> %a, <4 x i32> %b) {
1394*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_vmull_high_s32:
1395*9880d681SAndroid Build Coastguard Worker; CHECK: smull2 {{v[0-9]+}}.2d, {{v[0-9]+}}.4s, {{v[0-9]+}}.4s
1396*9880d681SAndroid Build Coastguard Workerentry:
1397*9880d681SAndroid Build Coastguard Worker  %shuffle.i.i = shufflevector <4 x i32> %a, <4 x i32> undef, <2 x i32> <i32 2, i32 3>
1398*9880d681SAndroid Build Coastguard Worker  %shuffle.i3.i = shufflevector <4 x i32> %b, <4 x i32> undef, <2 x i32> <i32 2, i32 3>
1399*9880d681SAndroid Build Coastguard Worker  %vmull2.i.i = tail call <2 x i64> @llvm.aarch64.neon.smull.v2i64(<2 x i32> %shuffle.i.i, <2 x i32> %shuffle.i3.i)
1400*9880d681SAndroid Build Coastguard Worker  ret <2 x i64> %vmull2.i.i
1401*9880d681SAndroid Build Coastguard Worker}
1402*9880d681SAndroid Build Coastguard Worker
1403*9880d681SAndroid Build Coastguard Workerdefine <8 x i16> @test_vmull_high_u8(<16 x i8> %a, <16 x i8> %b) {
1404*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_vmull_high_u8:
1405*9880d681SAndroid Build Coastguard Worker; CHECK: umull2 {{v[0-9]+}}.8h, {{v[0-9]+}}.16b, {{v[0-9]+}}.16b
1406*9880d681SAndroid Build Coastguard Workerentry:
1407*9880d681SAndroid Build Coastguard Worker  %shuffle.i.i = shufflevector <16 x i8> %a, <16 x i8> undef, <8 x i32> <i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15>
1408*9880d681SAndroid Build Coastguard Worker  %shuffle.i3.i = shufflevector <16 x i8> %b, <16 x i8> undef, <8 x i32> <i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15>
1409*9880d681SAndroid Build Coastguard Worker  %vmull.i.i = tail call <8 x i16> @llvm.aarch64.neon.umull.v8i16(<8 x i8> %shuffle.i.i, <8 x i8> %shuffle.i3.i)
1410*9880d681SAndroid Build Coastguard Worker  ret <8 x i16> %vmull.i.i
1411*9880d681SAndroid Build Coastguard Worker}
1412*9880d681SAndroid Build Coastguard Worker
1413*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @test_vmull_high_u16(<8 x i16> %a, <8 x i16> %b) {
1414*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_vmull_high_u16:
1415*9880d681SAndroid Build Coastguard Worker; CHECK: umull2 {{v[0-9]+}}.4s, {{v[0-9]+}}.8h, {{v[0-9]+}}.8h
1416*9880d681SAndroid Build Coastguard Workerentry:
1417*9880d681SAndroid Build Coastguard Worker  %shuffle.i.i = shufflevector <8 x i16> %a, <8 x i16> undef, <4 x i32> <i32 4, i32 5, i32 6, i32 7>
1418*9880d681SAndroid Build Coastguard Worker  %shuffle.i3.i = shufflevector <8 x i16> %b, <8 x i16> undef, <4 x i32> <i32 4, i32 5, i32 6, i32 7>
1419*9880d681SAndroid Build Coastguard Worker  %vmull2.i.i = tail call <4 x i32> @llvm.aarch64.neon.umull.v4i32(<4 x i16> %shuffle.i.i, <4 x i16> %shuffle.i3.i)
1420*9880d681SAndroid Build Coastguard Worker  ret <4 x i32> %vmull2.i.i
1421*9880d681SAndroid Build Coastguard Worker}
1422*9880d681SAndroid Build Coastguard Worker
1423*9880d681SAndroid Build Coastguard Workerdefine <2 x i64> @test_vmull_high_u32(<4 x i32> %a, <4 x i32> %b) {
1424*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_vmull_high_u32:
1425*9880d681SAndroid Build Coastguard Worker; CHECK: umull2 {{v[0-9]+}}.2d, {{v[0-9]+}}.4s, {{v[0-9]+}}.4s
1426*9880d681SAndroid Build Coastguard Workerentry:
1427*9880d681SAndroid Build Coastguard Worker  %shuffle.i.i = shufflevector <4 x i32> %a, <4 x i32> undef, <2 x i32> <i32 2, i32 3>
1428*9880d681SAndroid Build Coastguard Worker  %shuffle.i3.i = shufflevector <4 x i32> %b, <4 x i32> undef, <2 x i32> <i32 2, i32 3>
1429*9880d681SAndroid Build Coastguard Worker  %vmull2.i.i = tail call <2 x i64> @llvm.aarch64.neon.umull.v2i64(<2 x i32> %shuffle.i.i, <2 x i32> %shuffle.i3.i)
1430*9880d681SAndroid Build Coastguard Worker  ret <2 x i64> %vmull2.i.i
1431*9880d681SAndroid Build Coastguard Worker}
1432*9880d681SAndroid Build Coastguard Worker
1433*9880d681SAndroid Build Coastguard Workerdefine <8 x i16> @test_vmlal_s8(<8 x i16> %a, <8 x i8> %b, <8 x i8> %c) {
1434*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_vmlal_s8:
1435*9880d681SAndroid Build Coastguard Worker; CHECK: smlal {{v[0-9]+}}.8h, {{v[0-9]+}}.8b, {{v[0-9]+}}.8b
1436*9880d681SAndroid Build Coastguard Workerentry:
1437*9880d681SAndroid Build Coastguard Worker  %vmull.i.i = tail call <8 x i16> @llvm.aarch64.neon.smull.v8i16(<8 x i8> %b, <8 x i8> %c)
1438*9880d681SAndroid Build Coastguard Worker  %add.i = add <8 x i16> %vmull.i.i, %a
1439*9880d681SAndroid Build Coastguard Worker  ret <8 x i16> %add.i
1440*9880d681SAndroid Build Coastguard Worker}
1441*9880d681SAndroid Build Coastguard Worker
1442*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @test_vmlal_s16(<4 x i32> %a, <4 x i16> %b, <4 x i16> %c) {
1443*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_vmlal_s16:
1444*9880d681SAndroid Build Coastguard Worker; CHECK: smlal {{v[0-9]+}}.4s, {{v[0-9]+}}.4h, {{v[0-9]+}}.4h
1445*9880d681SAndroid Build Coastguard Workerentry:
1446*9880d681SAndroid Build Coastguard Worker  %vmull2.i.i = tail call <4 x i32> @llvm.aarch64.neon.smull.v4i32(<4 x i16> %b, <4 x i16> %c)
1447*9880d681SAndroid Build Coastguard Worker  %add.i = add <4 x i32> %vmull2.i.i, %a
1448*9880d681SAndroid Build Coastguard Worker  ret <4 x i32> %add.i
1449*9880d681SAndroid Build Coastguard Worker}
1450*9880d681SAndroid Build Coastguard Worker
1451*9880d681SAndroid Build Coastguard Workerdefine <2 x i64> @test_vmlal_s32(<2 x i64> %a, <2 x i32> %b, <2 x i32> %c) {
1452*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_vmlal_s32:
1453*9880d681SAndroid Build Coastguard Worker; CHECK: smlal {{v[0-9]+}}.2d, {{v[0-9]+}}.2s, {{v[0-9]+}}.2s
1454*9880d681SAndroid Build Coastguard Workerentry:
1455*9880d681SAndroid Build Coastguard Worker  %vmull2.i.i = tail call <2 x i64> @llvm.aarch64.neon.smull.v2i64(<2 x i32> %b, <2 x i32> %c)
1456*9880d681SAndroid Build Coastguard Worker  %add.i = add <2 x i64> %vmull2.i.i, %a
1457*9880d681SAndroid Build Coastguard Worker  ret <2 x i64> %add.i
1458*9880d681SAndroid Build Coastguard Worker}
1459*9880d681SAndroid Build Coastguard Worker
1460*9880d681SAndroid Build Coastguard Workerdefine <8 x i16> @test_vmlal_u8(<8 x i16> %a, <8 x i8> %b, <8 x i8> %c) {
1461*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_vmlal_u8:
1462*9880d681SAndroid Build Coastguard Worker; CHECK: umlal {{v[0-9]+}}.8h, {{v[0-9]+}}.8b, {{v[0-9]+}}.8b
1463*9880d681SAndroid Build Coastguard Workerentry:
1464*9880d681SAndroid Build Coastguard Worker  %vmull.i.i = tail call <8 x i16> @llvm.aarch64.neon.umull.v8i16(<8 x i8> %b, <8 x i8> %c)
1465*9880d681SAndroid Build Coastguard Worker  %add.i = add <8 x i16> %vmull.i.i, %a
1466*9880d681SAndroid Build Coastguard Worker  ret <8 x i16> %add.i
1467*9880d681SAndroid Build Coastguard Worker}
1468*9880d681SAndroid Build Coastguard Worker
1469*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @test_vmlal_u16(<4 x i32> %a, <4 x i16> %b, <4 x i16> %c) {
1470*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_vmlal_u16:
1471*9880d681SAndroid Build Coastguard Worker; CHECK: umlal {{v[0-9]+}}.4s, {{v[0-9]+}}.4h, {{v[0-9]+}}.4h
1472*9880d681SAndroid Build Coastguard Workerentry:
1473*9880d681SAndroid Build Coastguard Worker  %vmull2.i.i = tail call <4 x i32> @llvm.aarch64.neon.umull.v4i32(<4 x i16> %b, <4 x i16> %c)
1474*9880d681SAndroid Build Coastguard Worker  %add.i = add <4 x i32> %vmull2.i.i, %a
1475*9880d681SAndroid Build Coastguard Worker  ret <4 x i32> %add.i
1476*9880d681SAndroid Build Coastguard Worker}
1477*9880d681SAndroid Build Coastguard Worker
1478*9880d681SAndroid Build Coastguard Workerdefine <2 x i64> @test_vmlal_u32(<2 x i64> %a, <2 x i32> %b, <2 x i32> %c) {
1479*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_vmlal_u32:
1480*9880d681SAndroid Build Coastguard Worker; CHECK: umlal {{v[0-9]+}}.2d, {{v[0-9]+}}.2s, {{v[0-9]+}}.2s
1481*9880d681SAndroid Build Coastguard Workerentry:
1482*9880d681SAndroid Build Coastguard Worker  %vmull2.i.i = tail call <2 x i64> @llvm.aarch64.neon.umull.v2i64(<2 x i32> %b, <2 x i32> %c)
1483*9880d681SAndroid Build Coastguard Worker  %add.i = add <2 x i64> %vmull2.i.i, %a
1484*9880d681SAndroid Build Coastguard Worker  ret <2 x i64> %add.i
1485*9880d681SAndroid Build Coastguard Worker}
1486*9880d681SAndroid Build Coastguard Worker
1487*9880d681SAndroid Build Coastguard Workerdefine <8 x i16> @test_vmlal_high_s8(<8 x i16> %a, <16 x i8> %b, <16 x i8> %c) {
1488*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_vmlal_high_s8:
1489*9880d681SAndroid Build Coastguard Worker; CHECK: smlal2 {{v[0-9]+}}.8h, {{v[0-9]+}}.16b, {{v[0-9]+}}.16b
1490*9880d681SAndroid Build Coastguard Workerentry:
1491*9880d681SAndroid Build Coastguard Worker  %shuffle.i.i = shufflevector <16 x i8> %b, <16 x i8> undef, <8 x i32> <i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15>
1492*9880d681SAndroid Build Coastguard Worker  %shuffle.i3.i = shufflevector <16 x i8> %c, <16 x i8> undef, <8 x i32> <i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15>
1493*9880d681SAndroid Build Coastguard Worker  %vmull.i.i.i = tail call <8 x i16> @llvm.aarch64.neon.smull.v8i16(<8 x i8> %shuffle.i.i, <8 x i8> %shuffle.i3.i)
1494*9880d681SAndroid Build Coastguard Worker  %add.i.i = add <8 x i16> %vmull.i.i.i, %a
1495*9880d681SAndroid Build Coastguard Worker  ret <8 x i16> %add.i.i
1496*9880d681SAndroid Build Coastguard Worker}
1497*9880d681SAndroid Build Coastguard Worker
1498*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @test_vmlal_high_s16(<4 x i32> %a, <8 x i16> %b, <8 x i16> %c) {
1499*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_vmlal_high_s16:
1500*9880d681SAndroid Build Coastguard Worker; CHECK: smlal2 {{v[0-9]+}}.4s, {{v[0-9]+}}.8h, {{v[0-9]+}}.8h
1501*9880d681SAndroid Build Coastguard Workerentry:
1502*9880d681SAndroid Build Coastguard Worker  %shuffle.i.i = shufflevector <8 x i16> %b, <8 x i16> undef, <4 x i32> <i32 4, i32 5, i32 6, i32 7>
1503*9880d681SAndroid Build Coastguard Worker  %shuffle.i3.i = shufflevector <8 x i16> %c, <8 x i16> undef, <4 x i32> <i32 4, i32 5, i32 6, i32 7>
1504*9880d681SAndroid Build Coastguard Worker  %vmull2.i.i.i = tail call <4 x i32> @llvm.aarch64.neon.smull.v4i32(<4 x i16> %shuffle.i.i, <4 x i16> %shuffle.i3.i)
1505*9880d681SAndroid Build Coastguard Worker  %add.i.i = add <4 x i32> %vmull2.i.i.i, %a
1506*9880d681SAndroid Build Coastguard Worker  ret <4 x i32> %add.i.i
1507*9880d681SAndroid Build Coastguard Worker}
1508*9880d681SAndroid Build Coastguard Worker
1509*9880d681SAndroid Build Coastguard Workerdefine <2 x i64> @test_vmlal_high_s32(<2 x i64> %a, <4 x i32> %b, <4 x i32> %c) {
1510*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_vmlal_high_s32:
1511*9880d681SAndroid Build Coastguard Worker; CHECK: smlal2 {{v[0-9]+}}.2d, {{v[0-9]+}}.4s, {{v[0-9]+}}.4s
1512*9880d681SAndroid Build Coastguard Workerentry:
1513*9880d681SAndroid Build Coastguard Worker  %shuffle.i.i = shufflevector <4 x i32> %b, <4 x i32> undef, <2 x i32> <i32 2, i32 3>
1514*9880d681SAndroid Build Coastguard Worker  %shuffle.i3.i = shufflevector <4 x i32> %c, <4 x i32> undef, <2 x i32> <i32 2, i32 3>
1515*9880d681SAndroid Build Coastguard Worker  %vmull2.i.i.i = tail call <2 x i64> @llvm.aarch64.neon.smull.v2i64(<2 x i32> %shuffle.i.i, <2 x i32> %shuffle.i3.i)
1516*9880d681SAndroid Build Coastguard Worker  %add.i.i = add <2 x i64> %vmull2.i.i.i, %a
1517*9880d681SAndroid Build Coastguard Worker  ret <2 x i64> %add.i.i
1518*9880d681SAndroid Build Coastguard Worker}
1519*9880d681SAndroid Build Coastguard Worker
1520*9880d681SAndroid Build Coastguard Workerdefine <8 x i16> @test_vmlal_high_u8(<8 x i16> %a, <16 x i8> %b, <16 x i8> %c) {
1521*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_vmlal_high_u8:
1522*9880d681SAndroid Build Coastguard Worker; CHECK: umlal2 {{v[0-9]+}}.8h, {{v[0-9]+}}.16b, {{v[0-9]+}}.16b
1523*9880d681SAndroid Build Coastguard Workerentry:
1524*9880d681SAndroid Build Coastguard Worker  %shuffle.i.i = shufflevector <16 x i8> %b, <16 x i8> undef, <8 x i32> <i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15>
1525*9880d681SAndroid Build Coastguard Worker  %shuffle.i3.i = shufflevector <16 x i8> %c, <16 x i8> undef, <8 x i32> <i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15>
1526*9880d681SAndroid Build Coastguard Worker  %vmull.i.i.i = tail call <8 x i16> @llvm.aarch64.neon.umull.v8i16(<8 x i8> %shuffle.i.i, <8 x i8> %shuffle.i3.i)
1527*9880d681SAndroid Build Coastguard Worker  %add.i.i = add <8 x i16> %vmull.i.i.i, %a
1528*9880d681SAndroid Build Coastguard Worker  ret <8 x i16> %add.i.i
1529*9880d681SAndroid Build Coastguard Worker}
1530*9880d681SAndroid Build Coastguard Worker
1531*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @test_vmlal_high_u16(<4 x i32> %a, <8 x i16> %b, <8 x i16> %c) {
1532*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_vmlal_high_u16:
1533*9880d681SAndroid Build Coastguard Worker; CHECK: umlal2 {{v[0-9]+}}.4s, {{v[0-9]+}}.8h, {{v[0-9]+}}.8h
1534*9880d681SAndroid Build Coastguard Workerentry:
1535*9880d681SAndroid Build Coastguard Worker  %shuffle.i.i = shufflevector <8 x i16> %b, <8 x i16> undef, <4 x i32> <i32 4, i32 5, i32 6, i32 7>
1536*9880d681SAndroid Build Coastguard Worker  %shuffle.i3.i = shufflevector <8 x i16> %c, <8 x i16> undef, <4 x i32> <i32 4, i32 5, i32 6, i32 7>
1537*9880d681SAndroid Build Coastguard Worker  %vmull2.i.i.i = tail call <4 x i32> @llvm.aarch64.neon.umull.v4i32(<4 x i16> %shuffle.i.i, <4 x i16> %shuffle.i3.i)
1538*9880d681SAndroid Build Coastguard Worker  %add.i.i = add <4 x i32> %vmull2.i.i.i, %a
1539*9880d681SAndroid Build Coastguard Worker  ret <4 x i32> %add.i.i
1540*9880d681SAndroid Build Coastguard Worker}
1541*9880d681SAndroid Build Coastguard Worker
1542*9880d681SAndroid Build Coastguard Workerdefine <2 x i64> @test_vmlal_high_u32(<2 x i64> %a, <4 x i32> %b, <4 x i32> %c) {
1543*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_vmlal_high_u32:
1544*9880d681SAndroid Build Coastguard Worker; CHECK: umlal2 {{v[0-9]+}}.2d, {{v[0-9]+}}.4s, {{v[0-9]+}}.4s
1545*9880d681SAndroid Build Coastguard Workerentry:
1546*9880d681SAndroid Build Coastguard Worker  %shuffle.i.i = shufflevector <4 x i32> %b, <4 x i32> undef, <2 x i32> <i32 2, i32 3>
1547*9880d681SAndroid Build Coastguard Worker  %shuffle.i3.i = shufflevector <4 x i32> %c, <4 x i32> undef, <2 x i32> <i32 2, i32 3>
1548*9880d681SAndroid Build Coastguard Worker  %vmull2.i.i.i = tail call <2 x i64> @llvm.aarch64.neon.umull.v2i64(<2 x i32> %shuffle.i.i, <2 x i32> %shuffle.i3.i)
1549*9880d681SAndroid Build Coastguard Worker  %add.i.i = add <2 x i64> %vmull2.i.i.i, %a
1550*9880d681SAndroid Build Coastguard Worker  ret <2 x i64> %add.i.i
1551*9880d681SAndroid Build Coastguard Worker}
1552*9880d681SAndroid Build Coastguard Worker
1553*9880d681SAndroid Build Coastguard Workerdefine <8 x i16> @test_vmlsl_s8(<8 x i16> %a, <8 x i8> %b, <8 x i8> %c) {
1554*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_vmlsl_s8:
1555*9880d681SAndroid Build Coastguard Worker; CHECK: smlsl {{v[0-9]+}}.8h, {{v[0-9]+}}.8b, {{v[0-9]+}}.8b
1556*9880d681SAndroid Build Coastguard Workerentry:
1557*9880d681SAndroid Build Coastguard Worker  %vmull.i.i = tail call <8 x i16> @llvm.aarch64.neon.smull.v8i16(<8 x i8> %b, <8 x i8> %c)
1558*9880d681SAndroid Build Coastguard Worker  %sub.i = sub <8 x i16> %a, %vmull.i.i
1559*9880d681SAndroid Build Coastguard Worker  ret <8 x i16> %sub.i
1560*9880d681SAndroid Build Coastguard Worker}
1561*9880d681SAndroid Build Coastguard Worker
1562*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @test_vmlsl_s16(<4 x i32> %a, <4 x i16> %b, <4 x i16> %c) {
1563*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_vmlsl_s16:
1564*9880d681SAndroid Build Coastguard Worker; CHECK: smlsl {{v[0-9]+}}.4s, {{v[0-9]+}}.4h, {{v[0-9]+}}.4h
1565*9880d681SAndroid Build Coastguard Workerentry:
1566*9880d681SAndroid Build Coastguard Worker  %vmull2.i.i = tail call <4 x i32> @llvm.aarch64.neon.smull.v4i32(<4 x i16> %b, <4 x i16> %c)
1567*9880d681SAndroid Build Coastguard Worker  %sub.i = sub <4 x i32> %a, %vmull2.i.i
1568*9880d681SAndroid Build Coastguard Worker  ret <4 x i32> %sub.i
1569*9880d681SAndroid Build Coastguard Worker}
1570*9880d681SAndroid Build Coastguard Worker
1571*9880d681SAndroid Build Coastguard Workerdefine <2 x i64> @test_vmlsl_s32(<2 x i64> %a, <2 x i32> %b, <2 x i32> %c) {
1572*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_vmlsl_s32:
1573*9880d681SAndroid Build Coastguard Worker; CHECK: smlsl {{v[0-9]+}}.2d, {{v[0-9]+}}.2s, {{v[0-9]+}}.2s
1574*9880d681SAndroid Build Coastguard Workerentry:
1575*9880d681SAndroid Build Coastguard Worker  %vmull2.i.i = tail call <2 x i64> @llvm.aarch64.neon.smull.v2i64(<2 x i32> %b, <2 x i32> %c)
1576*9880d681SAndroid Build Coastguard Worker  %sub.i = sub <2 x i64> %a, %vmull2.i.i
1577*9880d681SAndroid Build Coastguard Worker  ret <2 x i64> %sub.i
1578*9880d681SAndroid Build Coastguard Worker}
1579*9880d681SAndroid Build Coastguard Worker
1580*9880d681SAndroid Build Coastguard Workerdefine <8 x i16> @test_vmlsl_u8(<8 x i16> %a, <8 x i8> %b, <8 x i8> %c) {
1581*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_vmlsl_u8:
1582*9880d681SAndroid Build Coastguard Worker; CHECK: umlsl {{v[0-9]+}}.8h, {{v[0-9]+}}.8b, {{v[0-9]+}}.8b
1583*9880d681SAndroid Build Coastguard Workerentry:
1584*9880d681SAndroid Build Coastguard Worker  %vmull.i.i = tail call <8 x i16> @llvm.aarch64.neon.umull.v8i16(<8 x i8> %b, <8 x i8> %c)
1585*9880d681SAndroid Build Coastguard Worker  %sub.i = sub <8 x i16> %a, %vmull.i.i
1586*9880d681SAndroid Build Coastguard Worker  ret <8 x i16> %sub.i
1587*9880d681SAndroid Build Coastguard Worker}
1588*9880d681SAndroid Build Coastguard Worker
1589*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @test_vmlsl_u16(<4 x i32> %a, <4 x i16> %b, <4 x i16> %c) {
1590*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_vmlsl_u16:
1591*9880d681SAndroid Build Coastguard Worker; CHECK: umlsl {{v[0-9]+}}.4s, {{v[0-9]+}}.4h, {{v[0-9]+}}.4h
1592*9880d681SAndroid Build Coastguard Workerentry:
1593*9880d681SAndroid Build Coastguard Worker  %vmull2.i.i = tail call <4 x i32> @llvm.aarch64.neon.umull.v4i32(<4 x i16> %b, <4 x i16> %c)
1594*9880d681SAndroid Build Coastguard Worker  %sub.i = sub <4 x i32> %a, %vmull2.i.i
1595*9880d681SAndroid Build Coastguard Worker  ret <4 x i32> %sub.i
1596*9880d681SAndroid Build Coastguard Worker}
1597*9880d681SAndroid Build Coastguard Worker
1598*9880d681SAndroid Build Coastguard Workerdefine <2 x i64> @test_vmlsl_u32(<2 x i64> %a, <2 x i32> %b, <2 x i32> %c) {
1599*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_vmlsl_u32:
1600*9880d681SAndroid Build Coastguard Worker; CHECK: umlsl {{v[0-9]+}}.2d, {{v[0-9]+}}.2s, {{v[0-9]+}}.2s
1601*9880d681SAndroid Build Coastguard Workerentry:
1602*9880d681SAndroid Build Coastguard Worker  %vmull2.i.i = tail call <2 x i64> @llvm.aarch64.neon.umull.v2i64(<2 x i32> %b, <2 x i32> %c)
1603*9880d681SAndroid Build Coastguard Worker  %sub.i = sub <2 x i64> %a, %vmull2.i.i
1604*9880d681SAndroid Build Coastguard Worker  ret <2 x i64> %sub.i
1605*9880d681SAndroid Build Coastguard Worker}
1606*9880d681SAndroid Build Coastguard Worker
1607*9880d681SAndroid Build Coastguard Workerdefine <8 x i16> @test_vmlsl_high_s8(<8 x i16> %a, <16 x i8> %b, <16 x i8> %c) {
1608*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_vmlsl_high_s8:
1609*9880d681SAndroid Build Coastguard Worker; CHECK: smlsl2 {{v[0-9]+}}.8h, {{v[0-9]+}}.16b, {{v[0-9]+}}.16b
1610*9880d681SAndroid Build Coastguard Workerentry:
1611*9880d681SAndroid Build Coastguard Worker  %shuffle.i.i = shufflevector <16 x i8> %b, <16 x i8> undef, <8 x i32> <i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15>
1612*9880d681SAndroid Build Coastguard Worker  %shuffle.i3.i = shufflevector <16 x i8> %c, <16 x i8> undef, <8 x i32> <i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15>
1613*9880d681SAndroid Build Coastguard Worker  %vmull.i.i.i = tail call <8 x i16> @llvm.aarch64.neon.smull.v8i16(<8 x i8> %shuffle.i.i, <8 x i8> %shuffle.i3.i)
1614*9880d681SAndroid Build Coastguard Worker  %sub.i.i = sub <8 x i16> %a, %vmull.i.i.i
1615*9880d681SAndroid Build Coastguard Worker  ret <8 x i16> %sub.i.i
1616*9880d681SAndroid Build Coastguard Worker}
1617*9880d681SAndroid Build Coastguard Worker
1618*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @test_vmlsl_high_s16(<4 x i32> %a, <8 x i16> %b, <8 x i16> %c) {
1619*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_vmlsl_high_s16:
1620*9880d681SAndroid Build Coastguard Worker; CHECK: smlsl2 {{v[0-9]+}}.4s, {{v[0-9]+}}.8h, {{v[0-9]+}}.8h
1621*9880d681SAndroid Build Coastguard Workerentry:
1622*9880d681SAndroid Build Coastguard Worker  %shuffle.i.i = shufflevector <8 x i16> %b, <8 x i16> undef, <4 x i32> <i32 4, i32 5, i32 6, i32 7>
1623*9880d681SAndroid Build Coastguard Worker  %shuffle.i3.i = shufflevector <8 x i16> %c, <8 x i16> undef, <4 x i32> <i32 4, i32 5, i32 6, i32 7>
1624*9880d681SAndroid Build Coastguard Worker  %vmull2.i.i.i = tail call <4 x i32> @llvm.aarch64.neon.smull.v4i32(<4 x i16> %shuffle.i.i, <4 x i16> %shuffle.i3.i)
1625*9880d681SAndroid Build Coastguard Worker  %sub.i.i = sub <4 x i32> %a, %vmull2.i.i.i
1626*9880d681SAndroid Build Coastguard Worker  ret <4 x i32> %sub.i.i
1627*9880d681SAndroid Build Coastguard Worker}
1628*9880d681SAndroid Build Coastguard Worker
1629*9880d681SAndroid Build Coastguard Workerdefine <2 x i64> @test_vmlsl_high_s32(<2 x i64> %a, <4 x i32> %b, <4 x i32> %c) {
1630*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_vmlsl_high_s32:
1631*9880d681SAndroid Build Coastguard Worker; CHECK: smlsl2 {{v[0-9]+}}.2d, {{v[0-9]+}}.4s, {{v[0-9]+}}.4s
1632*9880d681SAndroid Build Coastguard Workerentry:
1633*9880d681SAndroid Build Coastguard Worker  %shuffle.i.i = shufflevector <4 x i32> %b, <4 x i32> undef, <2 x i32> <i32 2, i32 3>
1634*9880d681SAndroid Build Coastguard Worker  %shuffle.i3.i = shufflevector <4 x i32> %c, <4 x i32> undef, <2 x i32> <i32 2, i32 3>
1635*9880d681SAndroid Build Coastguard Worker  %vmull2.i.i.i = tail call <2 x i64> @llvm.aarch64.neon.smull.v2i64(<2 x i32> %shuffle.i.i, <2 x i32> %shuffle.i3.i)
1636*9880d681SAndroid Build Coastguard Worker  %sub.i.i = sub <2 x i64> %a, %vmull2.i.i.i
1637*9880d681SAndroid Build Coastguard Worker  ret <2 x i64> %sub.i.i
1638*9880d681SAndroid Build Coastguard Worker}
1639*9880d681SAndroid Build Coastguard Worker
1640*9880d681SAndroid Build Coastguard Workerdefine <8 x i16> @test_vmlsl_high_u8(<8 x i16> %a, <16 x i8> %b, <16 x i8> %c) {
1641*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_vmlsl_high_u8:
1642*9880d681SAndroid Build Coastguard Worker; CHECK: umlsl2 {{v[0-9]+}}.8h, {{v[0-9]+}}.16b, {{v[0-9]+}}.16b
1643*9880d681SAndroid Build Coastguard Workerentry:
1644*9880d681SAndroid Build Coastguard Worker  %shuffle.i.i = shufflevector <16 x i8> %b, <16 x i8> undef, <8 x i32> <i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15>
1645*9880d681SAndroid Build Coastguard Worker  %shuffle.i3.i = shufflevector <16 x i8> %c, <16 x i8> undef, <8 x i32> <i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15>
1646*9880d681SAndroid Build Coastguard Worker  %vmull.i.i.i = tail call <8 x i16> @llvm.aarch64.neon.umull.v8i16(<8 x i8> %shuffle.i.i, <8 x i8> %shuffle.i3.i)
1647*9880d681SAndroid Build Coastguard Worker  %sub.i.i = sub <8 x i16> %a, %vmull.i.i.i
1648*9880d681SAndroid Build Coastguard Worker  ret <8 x i16> %sub.i.i
1649*9880d681SAndroid Build Coastguard Worker}
1650*9880d681SAndroid Build Coastguard Worker
1651*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @test_vmlsl_high_u16(<4 x i32> %a, <8 x i16> %b, <8 x i16> %c) {
1652*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_vmlsl_high_u16:
1653*9880d681SAndroid Build Coastguard Worker; CHECK: umlsl2 {{v[0-9]+}}.4s, {{v[0-9]+}}.8h, {{v[0-9]+}}.8h
1654*9880d681SAndroid Build Coastguard Workerentry:
1655*9880d681SAndroid Build Coastguard Worker  %shuffle.i.i = shufflevector <8 x i16> %b, <8 x i16> undef, <4 x i32> <i32 4, i32 5, i32 6, i32 7>
1656*9880d681SAndroid Build Coastguard Worker  %shuffle.i3.i = shufflevector <8 x i16> %c, <8 x i16> undef, <4 x i32> <i32 4, i32 5, i32 6, i32 7>
1657*9880d681SAndroid Build Coastguard Worker  %vmull2.i.i.i = tail call <4 x i32> @llvm.aarch64.neon.umull.v4i32(<4 x i16> %shuffle.i.i, <4 x i16> %shuffle.i3.i)
1658*9880d681SAndroid Build Coastguard Worker  %sub.i.i = sub <4 x i32> %a, %vmull2.i.i.i
1659*9880d681SAndroid Build Coastguard Worker  ret <4 x i32> %sub.i.i
1660*9880d681SAndroid Build Coastguard Worker}
1661*9880d681SAndroid Build Coastguard Worker
1662*9880d681SAndroid Build Coastguard Workerdefine <2 x i64> @test_vmlsl_high_u32(<2 x i64> %a, <4 x i32> %b, <4 x i32> %c) {
1663*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_vmlsl_high_u32:
1664*9880d681SAndroid Build Coastguard Worker; CHECK: umlsl2 {{v[0-9]+}}.2d, {{v[0-9]+}}.4s, {{v[0-9]+}}.4s
1665*9880d681SAndroid Build Coastguard Workerentry:
1666*9880d681SAndroid Build Coastguard Worker  %shuffle.i.i = shufflevector <4 x i32> %b, <4 x i32> undef, <2 x i32> <i32 2, i32 3>
1667*9880d681SAndroid Build Coastguard Worker  %shuffle.i3.i = shufflevector <4 x i32> %c, <4 x i32> undef, <2 x i32> <i32 2, i32 3>
1668*9880d681SAndroid Build Coastguard Worker  %vmull2.i.i.i = tail call <2 x i64> @llvm.aarch64.neon.umull.v2i64(<2 x i32> %shuffle.i.i, <2 x i32> %shuffle.i3.i)
1669*9880d681SAndroid Build Coastguard Worker  %sub.i.i = sub <2 x i64> %a, %vmull2.i.i.i
1670*9880d681SAndroid Build Coastguard Worker  ret <2 x i64> %sub.i.i
1671*9880d681SAndroid Build Coastguard Worker}
1672*9880d681SAndroid Build Coastguard Worker
1673*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @test_vqdmull_s16(<4 x i16> %a, <4 x i16> %b) {
1674*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_vqdmull_s16:
1675*9880d681SAndroid Build Coastguard Worker; CHECK: sqdmull {{v[0-9]+}}.4s, {{v[0-9]+}}.4h, {{v[0-9]+}}.4h
1676*9880d681SAndroid Build Coastguard Workerentry:
1677*9880d681SAndroid Build Coastguard Worker  %vqdmull2.i = tail call <4 x i32> @llvm.aarch64.neon.sqdmull.v4i32(<4 x i16> %a, <4 x i16> %b)
1678*9880d681SAndroid Build Coastguard Worker  ret <4 x i32> %vqdmull2.i
1679*9880d681SAndroid Build Coastguard Worker}
1680*9880d681SAndroid Build Coastguard Worker
1681*9880d681SAndroid Build Coastguard Workerdefine <2 x i64> @test_vqdmull_s32(<2 x i32> %a, <2 x i32> %b) {
1682*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_vqdmull_s32:
1683*9880d681SAndroid Build Coastguard Worker; CHECK: sqdmull {{v[0-9]+}}.2d, {{v[0-9]+}}.2s, {{v[0-9]+}}.2s
1684*9880d681SAndroid Build Coastguard Workerentry:
1685*9880d681SAndroid Build Coastguard Worker  %vqdmull2.i = tail call <2 x i64> @llvm.aarch64.neon.sqdmull.v2i64(<2 x i32> %a, <2 x i32> %b)
1686*9880d681SAndroid Build Coastguard Worker  ret <2 x i64> %vqdmull2.i
1687*9880d681SAndroid Build Coastguard Worker}
1688*9880d681SAndroid Build Coastguard Worker
1689*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @test_vqdmlal_s16(<4 x i32> %a, <4 x i16> %b, <4 x i16> %c) {
1690*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_vqdmlal_s16:
1691*9880d681SAndroid Build Coastguard Worker; CHECK: sqdmlal {{v[0-9]+}}.4s, {{v[0-9]+}}.4h, {{v[0-9]+}}.4h
1692*9880d681SAndroid Build Coastguard Workerentry:
1693*9880d681SAndroid Build Coastguard Worker  %vqdmlal2.i = tail call <4 x i32> @llvm.aarch64.neon.sqdmull.v4i32(<4 x i16> %b, <4 x i16> %c)
1694*9880d681SAndroid Build Coastguard Worker  %vqdmlal4.i = tail call <4 x i32> @llvm.aarch64.neon.sqadd.v4i32(<4 x i32> %a, <4 x i32> %vqdmlal2.i)
1695*9880d681SAndroid Build Coastguard Worker  ret <4 x i32> %vqdmlal4.i
1696*9880d681SAndroid Build Coastguard Worker}
1697*9880d681SAndroid Build Coastguard Worker
1698*9880d681SAndroid Build Coastguard Workerdefine <2 x i64> @test_vqdmlal_s32(<2 x i64> %a, <2 x i32> %b, <2 x i32> %c) {
1699*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_vqdmlal_s32:
1700*9880d681SAndroid Build Coastguard Worker; CHECK: sqdmlal {{v[0-9]+}}.2d, {{v[0-9]+}}.2s, {{v[0-9]+}}.2s
1701*9880d681SAndroid Build Coastguard Workerentry:
1702*9880d681SAndroid Build Coastguard Worker  %vqdmlal2.i = tail call <2 x i64> @llvm.aarch64.neon.sqdmull.v2i64(<2 x i32> %b, <2 x i32> %c)
1703*9880d681SAndroid Build Coastguard Worker  %vqdmlal4.i = tail call <2 x i64> @llvm.aarch64.neon.sqadd.v2i64(<2 x i64> %a, <2 x i64> %vqdmlal2.i)
1704*9880d681SAndroid Build Coastguard Worker  ret <2 x i64> %vqdmlal4.i
1705*9880d681SAndroid Build Coastguard Worker}
1706*9880d681SAndroid Build Coastguard Worker
1707*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @test_vqdmlsl_s16(<4 x i32> %a, <4 x i16> %b, <4 x i16> %c) {
1708*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_vqdmlsl_s16:
1709*9880d681SAndroid Build Coastguard Worker; CHECK: sqdmlsl {{v[0-9]+}}.4s, {{v[0-9]+}}.4h, {{v[0-9]+}}.4h
1710*9880d681SAndroid Build Coastguard Workerentry:
1711*9880d681SAndroid Build Coastguard Worker  %vqdmlsl2.i = tail call <4 x i32> @llvm.aarch64.neon.sqdmull.v4i32(<4 x i16> %b, <4 x i16> %c)
1712*9880d681SAndroid Build Coastguard Worker  %vqdmlsl4.i = tail call <4 x i32> @llvm.aarch64.neon.sqsub.v4i32(<4 x i32> %a, <4 x i32> %vqdmlsl2.i)
1713*9880d681SAndroid Build Coastguard Worker  ret <4 x i32> %vqdmlsl4.i
1714*9880d681SAndroid Build Coastguard Worker}
1715*9880d681SAndroid Build Coastguard Worker
1716*9880d681SAndroid Build Coastguard Workerdefine <2 x i64> @test_vqdmlsl_s32(<2 x i64> %a, <2 x i32> %b, <2 x i32> %c) {
1717*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_vqdmlsl_s32:
1718*9880d681SAndroid Build Coastguard Worker; CHECK: sqdmlsl {{v[0-9]+}}.2d, {{v[0-9]+}}.2s, {{v[0-9]+}}.2s
1719*9880d681SAndroid Build Coastguard Workerentry:
1720*9880d681SAndroid Build Coastguard Worker  %vqdmlsl2.i = tail call <2 x i64> @llvm.aarch64.neon.sqdmull.v2i64(<2 x i32> %b, <2 x i32> %c)
1721*9880d681SAndroid Build Coastguard Worker  %vqdmlsl4.i = tail call <2 x i64> @llvm.aarch64.neon.sqsub.v2i64(<2 x i64> %a, <2 x i64> %vqdmlsl2.i)
1722*9880d681SAndroid Build Coastguard Worker  ret <2 x i64> %vqdmlsl4.i
1723*9880d681SAndroid Build Coastguard Worker}
1724*9880d681SAndroid Build Coastguard Worker
1725*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @test_vqdmull_high_s16(<8 x i16> %a, <8 x i16> %b) {
1726*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_vqdmull_high_s16:
1727*9880d681SAndroid Build Coastguard Worker; CHECK: sqdmull2 {{v[0-9]+}}.4s, {{v[0-9]+}}.8h, {{v[0-9]+}}.8h
1728*9880d681SAndroid Build Coastguard Workerentry:
1729*9880d681SAndroid Build Coastguard Worker  %shuffle.i.i = shufflevector <8 x i16> %a, <8 x i16> undef, <4 x i32> <i32 4, i32 5, i32 6, i32 7>
1730*9880d681SAndroid Build Coastguard Worker  %shuffle.i3.i = shufflevector <8 x i16> %b, <8 x i16> undef, <4 x i32> <i32 4, i32 5, i32 6, i32 7>
1731*9880d681SAndroid Build Coastguard Worker  %vqdmull2.i.i = tail call <4 x i32> @llvm.aarch64.neon.sqdmull.v4i32(<4 x i16> %shuffle.i.i, <4 x i16> %shuffle.i3.i)
1732*9880d681SAndroid Build Coastguard Worker  ret <4 x i32> %vqdmull2.i.i
1733*9880d681SAndroid Build Coastguard Worker}
1734*9880d681SAndroid Build Coastguard Worker
1735*9880d681SAndroid Build Coastguard Workerdefine <2 x i64> @test_vqdmull_high_s32(<4 x i32> %a, <4 x i32> %b) {
1736*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_vqdmull_high_s32:
1737*9880d681SAndroid Build Coastguard Worker; CHECK: sqdmull2 {{v[0-9]+}}.2d, {{v[0-9]+}}.4s, {{v[0-9]+}}.4s
1738*9880d681SAndroid Build Coastguard Workerentry:
1739*9880d681SAndroid Build Coastguard Worker  %shuffle.i.i = shufflevector <4 x i32> %a, <4 x i32> undef, <2 x i32> <i32 2, i32 3>
1740*9880d681SAndroid Build Coastguard Worker  %shuffle.i3.i = shufflevector <4 x i32> %b, <4 x i32> undef, <2 x i32> <i32 2, i32 3>
1741*9880d681SAndroid Build Coastguard Worker  %vqdmull2.i.i = tail call <2 x i64> @llvm.aarch64.neon.sqdmull.v2i64(<2 x i32> %shuffle.i.i, <2 x i32> %shuffle.i3.i)
1742*9880d681SAndroid Build Coastguard Worker  ret <2 x i64> %vqdmull2.i.i
1743*9880d681SAndroid Build Coastguard Worker}
1744*9880d681SAndroid Build Coastguard Worker
1745*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @test_vqdmlal_high_s16(<4 x i32> %a, <8 x i16> %b, <8 x i16> %c) {
1746*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_vqdmlal_high_s16:
1747*9880d681SAndroid Build Coastguard Worker; CHECK: sqdmlal2 {{v[0-9]+}}.4s, {{v[0-9]+}}.8h, {{v[0-9]+}}.8h
1748*9880d681SAndroid Build Coastguard Workerentry:
1749*9880d681SAndroid Build Coastguard Worker  %shuffle.i.i = shufflevector <8 x i16> %b, <8 x i16> undef, <4 x i32> <i32 4, i32 5, i32 6, i32 7>
1750*9880d681SAndroid Build Coastguard Worker  %shuffle.i3.i = shufflevector <8 x i16> %c, <8 x i16> undef, <4 x i32> <i32 4, i32 5, i32 6, i32 7>
1751*9880d681SAndroid Build Coastguard Worker  %vqdmlal2.i.i = tail call <4 x i32> @llvm.aarch64.neon.sqdmull.v4i32(<4 x i16> %shuffle.i.i, <4 x i16> %shuffle.i3.i)
1752*9880d681SAndroid Build Coastguard Worker  %vqdmlal4.i.i = tail call <4 x i32> @llvm.aarch64.neon.sqadd.v4i32(<4 x i32> %a, <4 x i32> %vqdmlal2.i.i)
1753*9880d681SAndroid Build Coastguard Worker  ret <4 x i32> %vqdmlal4.i.i
1754*9880d681SAndroid Build Coastguard Worker}
1755*9880d681SAndroid Build Coastguard Worker
1756*9880d681SAndroid Build Coastguard Workerdefine <2 x i64> @test_vqdmlal_high_s32(<2 x i64> %a, <4 x i32> %b, <4 x i32> %c) {
1757*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_vqdmlal_high_s32:
1758*9880d681SAndroid Build Coastguard Worker; CHECK: sqdmlal2 {{v[0-9]+}}.2d, {{v[0-9]+}}.4s, {{v[0-9]+}}.4s
1759*9880d681SAndroid Build Coastguard Workerentry:
1760*9880d681SAndroid Build Coastguard Worker  %shuffle.i.i = shufflevector <4 x i32> %b, <4 x i32> undef, <2 x i32> <i32 2, i32 3>
1761*9880d681SAndroid Build Coastguard Worker  %shuffle.i3.i = shufflevector <4 x i32> %c, <4 x i32> undef, <2 x i32> <i32 2, i32 3>
1762*9880d681SAndroid Build Coastguard Worker  %vqdmlal2.i.i = tail call <2 x i64> @llvm.aarch64.neon.sqdmull.v2i64(<2 x i32> %shuffle.i.i, <2 x i32> %shuffle.i3.i)
1763*9880d681SAndroid Build Coastguard Worker  %vqdmlal4.i.i = tail call <2 x i64> @llvm.aarch64.neon.sqadd.v2i64(<2 x i64> %a, <2 x i64> %vqdmlal2.i.i)
1764*9880d681SAndroid Build Coastguard Worker  ret <2 x i64> %vqdmlal4.i.i
1765*9880d681SAndroid Build Coastguard Worker}
1766*9880d681SAndroid Build Coastguard Worker
1767*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @test_vqdmlsl_high_s16(<4 x i32> %a, <8 x i16> %b, <8 x i16> %c) {
1768*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_vqdmlsl_high_s16:
1769*9880d681SAndroid Build Coastguard Worker; CHECK: sqdmlsl2 {{v[0-9]+}}.4s, {{v[0-9]+}}.8h, {{v[0-9]+}}.8h
1770*9880d681SAndroid Build Coastguard Workerentry:
1771*9880d681SAndroid Build Coastguard Worker  %shuffle.i.i = shufflevector <8 x i16> %b, <8 x i16> undef, <4 x i32> <i32 4, i32 5, i32 6, i32 7>
1772*9880d681SAndroid Build Coastguard Worker  %shuffle.i3.i = shufflevector <8 x i16> %c, <8 x i16> undef, <4 x i32> <i32 4, i32 5, i32 6, i32 7>
1773*9880d681SAndroid Build Coastguard Worker  %vqdmlsl2.i.i = tail call <4 x i32> @llvm.aarch64.neon.sqdmull.v4i32(<4 x i16> %shuffle.i.i, <4 x i16> %shuffle.i3.i)
1774*9880d681SAndroid Build Coastguard Worker  %vqdmlsl4.i.i = tail call <4 x i32> @llvm.aarch64.neon.sqsub.v4i32(<4 x i32> %a, <4 x i32> %vqdmlsl2.i.i)
1775*9880d681SAndroid Build Coastguard Worker  ret <4 x i32> %vqdmlsl4.i.i
1776*9880d681SAndroid Build Coastguard Worker}
1777*9880d681SAndroid Build Coastguard Worker
1778*9880d681SAndroid Build Coastguard Workerdefine <2 x i64> @test_vqdmlsl_high_s32(<2 x i64> %a, <4 x i32> %b, <4 x i32> %c) {
1779*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_vqdmlsl_high_s32:
1780*9880d681SAndroid Build Coastguard Worker; CHECK: sqdmlsl2 {{v[0-9]+}}.2d, {{v[0-9]+}}.4s, {{v[0-9]+}}.4s
1781*9880d681SAndroid Build Coastguard Workerentry:
1782*9880d681SAndroid Build Coastguard Worker  %shuffle.i.i = shufflevector <4 x i32> %b, <4 x i32> undef, <2 x i32> <i32 2, i32 3>
1783*9880d681SAndroid Build Coastguard Worker  %shuffle.i3.i = shufflevector <4 x i32> %c, <4 x i32> undef, <2 x i32> <i32 2, i32 3>
1784*9880d681SAndroid Build Coastguard Worker  %vqdmlsl2.i.i = tail call <2 x i64> @llvm.aarch64.neon.sqdmull.v2i64(<2 x i32> %shuffle.i.i, <2 x i32> %shuffle.i3.i)
1785*9880d681SAndroid Build Coastguard Worker  %vqdmlsl4.i.i = tail call <2 x i64> @llvm.aarch64.neon.sqsub.v2i64(<2 x i64> %a, <2 x i64> %vqdmlsl2.i.i)
1786*9880d681SAndroid Build Coastguard Worker  ret <2 x i64> %vqdmlsl4.i.i
1787*9880d681SAndroid Build Coastguard Worker}
1788*9880d681SAndroid Build Coastguard Worker
1789*9880d681SAndroid Build Coastguard Workerdefine <8 x i16> @test_vmull_p8(<8 x i8> %a, <8 x i8> %b) {
1790*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_vmull_p8:
1791*9880d681SAndroid Build Coastguard Worker; CHECK: pmull {{v[0-9]+}}.8h, {{v[0-9]+}}.8b, {{v[0-9]+}}.8b
1792*9880d681SAndroid Build Coastguard Workerentry:
1793*9880d681SAndroid Build Coastguard Worker  %vmull.i = tail call <8 x i16> @llvm.aarch64.neon.pmull.v8i16(<8 x i8> %a, <8 x i8> %b)
1794*9880d681SAndroid Build Coastguard Worker  ret <8 x i16> %vmull.i
1795*9880d681SAndroid Build Coastguard Worker}
1796*9880d681SAndroid Build Coastguard Worker
1797*9880d681SAndroid Build Coastguard Workerdefine <8 x i16> @test_vmull_high_p8(<16 x i8> %a, <16 x i8> %b) {
1798*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_vmull_high_p8:
1799*9880d681SAndroid Build Coastguard Worker; CHECK: pmull2 {{v[0-9]+}}.8h, {{v[0-9]+}}.16b, {{v[0-9]+}}.16b
1800*9880d681SAndroid Build Coastguard Workerentry:
1801*9880d681SAndroid Build Coastguard Worker  %shuffle.i.i = shufflevector <16 x i8> %a, <16 x i8> undef, <8 x i32> <i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15>
1802*9880d681SAndroid Build Coastguard Worker  %shuffle.i3.i = shufflevector <16 x i8> %b, <16 x i8> undef, <8 x i32> <i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15>
1803*9880d681SAndroid Build Coastguard Worker  %vmull.i.i = tail call <8 x i16> @llvm.aarch64.neon.pmull.v8i16(<8 x i8> %shuffle.i.i, <8 x i8> %shuffle.i3.i)
1804*9880d681SAndroid Build Coastguard Worker  ret <8 x i16> %vmull.i.i
1805*9880d681SAndroid Build Coastguard Worker}
1806*9880d681SAndroid Build Coastguard Worker
1807*9880d681SAndroid Build Coastguard Workerdefine i128 @test_vmull_p64(i64 %a, i64 %b) #4 {
1808*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_vmull_p64
1809*9880d681SAndroid Build Coastguard Worker; CHECK: pmull {{v[0-9]+}}.1q, {{v[0-9]+}}.1d, {{v[0-9]+}}.1d
1810*9880d681SAndroid Build Coastguard Workerentry:
1811*9880d681SAndroid Build Coastguard Worker  %vmull2.i = tail call <16 x i8> @llvm.aarch64.neon.pmull64(i64 %a, i64 %b)
1812*9880d681SAndroid Build Coastguard Worker  %vmull3.i = bitcast <16 x i8> %vmull2.i to i128
1813*9880d681SAndroid Build Coastguard Worker  ret i128 %vmull3.i
1814*9880d681SAndroid Build Coastguard Worker}
1815*9880d681SAndroid Build Coastguard Worker
1816*9880d681SAndroid Build Coastguard Workerdefine i128 @test_vmull_high_p64(<2 x i64> %a, <2 x i64> %b) #4 {
1817*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_vmull_high_p64
1818*9880d681SAndroid Build Coastguard Worker; CHECK: pmull2 {{v[0-9]+}}.1q, {{v[0-9]+}}.2d, {{v[0-9]+}}.2d
1819*9880d681SAndroid Build Coastguard Workerentry:
1820*9880d681SAndroid Build Coastguard Worker  %0 = extractelement <2 x i64> %a, i32 1
1821*9880d681SAndroid Build Coastguard Worker  %1 = extractelement <2 x i64> %b, i32 1
1822*9880d681SAndroid Build Coastguard Worker  %vmull2.i.i = tail call <16 x i8> @llvm.aarch64.neon.pmull64(i64 %0, i64 %1) #1
1823*9880d681SAndroid Build Coastguard Worker  %vmull3.i.i = bitcast <16 x i8> %vmull2.i.i to i128
1824*9880d681SAndroid Build Coastguard Worker  ret i128 %vmull3.i.i
1825*9880d681SAndroid Build Coastguard Worker}
1826*9880d681SAndroid Build Coastguard Worker
1827*9880d681SAndroid Build Coastguard Workerdeclare <16 x i8> @llvm.aarch64.neon.pmull64(i64, i64) #5
1828*9880d681SAndroid Build Coastguard Worker
1829*9880d681SAndroid Build Coastguard Worker
1830