xref: /aosp_15_r20/external/llvm/test/CodeGen/AArch64/arm64-vsub.ll (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -march=arm64 -aarch64-neon-syntax=apple | FileCheck %s
2*9880d681SAndroid Build Coastguard Worker
3*9880d681SAndroid Build Coastguard Workerdefine <8 x i8> @subhn8b(<8 x i16>* %A, <8 x i16>* %B) nounwind {
4*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: subhn8b:
5*9880d681SAndroid Build Coastguard Worker;CHECK: subhn.8b
6*9880d681SAndroid Build Coastguard Worker        %tmp1 = load <8 x i16>, <8 x i16>* %A
7*9880d681SAndroid Build Coastguard Worker        %tmp2 = load <8 x i16>, <8 x i16>* %B
8*9880d681SAndroid Build Coastguard Worker        %tmp3 = call <8 x i8> @llvm.aarch64.neon.subhn.v8i8(<8 x i16> %tmp1, <8 x i16> %tmp2)
9*9880d681SAndroid Build Coastguard Worker        ret <8 x i8> %tmp3
10*9880d681SAndroid Build Coastguard Worker}
11*9880d681SAndroid Build Coastguard Worker
12*9880d681SAndroid Build Coastguard Workerdefine <4 x i16> @subhn4h(<4 x i32>* %A, <4 x i32>* %B) nounwind {
13*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: subhn4h:
14*9880d681SAndroid Build Coastguard Worker;CHECK: subhn.4h
15*9880d681SAndroid Build Coastguard Worker        %tmp1 = load <4 x i32>, <4 x i32>* %A
16*9880d681SAndroid Build Coastguard Worker        %tmp2 = load <4 x i32>, <4 x i32>* %B
17*9880d681SAndroid Build Coastguard Worker        %tmp3 = call <4 x i16> @llvm.aarch64.neon.subhn.v4i16(<4 x i32> %tmp1, <4 x i32> %tmp2)
18*9880d681SAndroid Build Coastguard Worker        ret <4 x i16> %tmp3
19*9880d681SAndroid Build Coastguard Worker}
20*9880d681SAndroid Build Coastguard Worker
21*9880d681SAndroid Build Coastguard Workerdefine <2 x i32> @subhn2s(<2 x i64>* %A, <2 x i64>* %B) nounwind {
22*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: subhn2s:
23*9880d681SAndroid Build Coastguard Worker;CHECK: subhn.2s
24*9880d681SAndroid Build Coastguard Worker        %tmp1 = load <2 x i64>, <2 x i64>* %A
25*9880d681SAndroid Build Coastguard Worker        %tmp2 = load <2 x i64>, <2 x i64>* %B
26*9880d681SAndroid Build Coastguard Worker        %tmp3 = call <2 x i32> @llvm.aarch64.neon.subhn.v2i32(<2 x i64> %tmp1, <2 x i64> %tmp2)
27*9880d681SAndroid Build Coastguard Worker        ret <2 x i32> %tmp3
28*9880d681SAndroid Build Coastguard Worker}
29*9880d681SAndroid Build Coastguard Worker
30*9880d681SAndroid Build Coastguard Workerdefine <16 x i8> @subhn2_16b(<8 x i16> %a, <8 x i16> %b) nounwind  {
31*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: subhn2_16b:
32*9880d681SAndroid Build Coastguard Worker;CHECK: subhn.8b
33*9880d681SAndroid Build Coastguard Worker;CHECK-NEXT: subhn2.16b
34*9880d681SAndroid Build Coastguard Worker  %vsubhn2.i = tail call <8 x i8> @llvm.aarch64.neon.subhn.v8i8(<8 x i16> %a, <8 x i16> %b) nounwind
35*9880d681SAndroid Build Coastguard Worker  %vsubhn_high2.i = tail call <8 x i8> @llvm.aarch64.neon.subhn.v8i8(<8 x i16> %a, <8 x i16> %b) nounwind
36*9880d681SAndroid Build Coastguard Worker  %res = shufflevector <8 x i8> %vsubhn2.i, <8 x i8> %vsubhn_high2.i, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15>
37*9880d681SAndroid Build Coastguard Worker  ret <16 x i8> %res
38*9880d681SAndroid Build Coastguard Worker}
39*9880d681SAndroid Build Coastguard Worker
40*9880d681SAndroid Build Coastguard Workerdefine <8 x i16> @subhn2_8h(<4 x i32> %a, <4 x i32> %b) nounwind  {
41*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: subhn2_8h:
42*9880d681SAndroid Build Coastguard Worker;CHECK: subhn.4h
43*9880d681SAndroid Build Coastguard Worker;CHECK-NEXT: subhn2.8h
44*9880d681SAndroid Build Coastguard Worker  %vsubhn2.i = tail call <4 x i16> @llvm.aarch64.neon.subhn.v4i16(<4 x i32> %a, <4 x i32> %b) nounwind
45*9880d681SAndroid Build Coastguard Worker  %vsubhn_high3.i = tail call <4 x i16> @llvm.aarch64.neon.subhn.v4i16(<4 x i32> %a, <4 x i32> %b) nounwind
46*9880d681SAndroid Build Coastguard Worker  %res = shufflevector <4 x i16> %vsubhn2.i, <4 x i16> %vsubhn_high3.i, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>
47*9880d681SAndroid Build Coastguard Worker  ret <8 x i16> %res
48*9880d681SAndroid Build Coastguard Worker}
49*9880d681SAndroid Build Coastguard Worker
50*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @subhn2_4s(<2 x i64> %a, <2 x i64> %b) nounwind  {
51*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: subhn2_4s:
52*9880d681SAndroid Build Coastguard Worker;CHECK: subhn.2s
53*9880d681SAndroid Build Coastguard Worker;CHECK-NEXT: subhn2.4s
54*9880d681SAndroid Build Coastguard Worker  %vsubhn2.i = tail call <2 x i32> @llvm.aarch64.neon.subhn.v2i32(<2 x i64> %a, <2 x i64> %b) nounwind
55*9880d681SAndroid Build Coastguard Worker  %vsubhn_high3.i = tail call <2 x i32> @llvm.aarch64.neon.subhn.v2i32(<2 x i64> %a, <2 x i64> %b) nounwind
56*9880d681SAndroid Build Coastguard Worker  %res = shufflevector <2 x i32> %vsubhn2.i, <2 x i32> %vsubhn_high3.i, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
57*9880d681SAndroid Build Coastguard Worker  ret <4 x i32> %res
58*9880d681SAndroid Build Coastguard Worker}
59*9880d681SAndroid Build Coastguard Worker
60*9880d681SAndroid Build Coastguard Workerdeclare <2 x i32> @llvm.aarch64.neon.subhn.v2i32(<2 x i64>, <2 x i64>) nounwind readnone
61*9880d681SAndroid Build Coastguard Workerdeclare <4 x i16> @llvm.aarch64.neon.subhn.v4i16(<4 x i32>, <4 x i32>) nounwind readnone
62*9880d681SAndroid Build Coastguard Workerdeclare <8 x i8> @llvm.aarch64.neon.subhn.v8i8(<8 x i16>, <8 x i16>) nounwind readnone
63*9880d681SAndroid Build Coastguard Worker
64*9880d681SAndroid Build Coastguard Workerdefine <8 x i8> @rsubhn8b(<8 x i16>* %A, <8 x i16>* %B) nounwind {
65*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: rsubhn8b:
66*9880d681SAndroid Build Coastguard Worker;CHECK: rsubhn.8b
67*9880d681SAndroid Build Coastguard Worker        %tmp1 = load <8 x i16>, <8 x i16>* %A
68*9880d681SAndroid Build Coastguard Worker        %tmp2 = load <8 x i16>, <8 x i16>* %B
69*9880d681SAndroid Build Coastguard Worker        %tmp3 = call <8 x i8> @llvm.aarch64.neon.rsubhn.v8i8(<8 x i16> %tmp1, <8 x i16> %tmp2)
70*9880d681SAndroid Build Coastguard Worker        ret <8 x i8> %tmp3
71*9880d681SAndroid Build Coastguard Worker}
72*9880d681SAndroid Build Coastguard Worker
73*9880d681SAndroid Build Coastguard Workerdefine <4 x i16> @rsubhn4h(<4 x i32>* %A, <4 x i32>* %B) nounwind {
74*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: rsubhn4h:
75*9880d681SAndroid Build Coastguard Worker;CHECK: rsubhn.4h
76*9880d681SAndroid Build Coastguard Worker        %tmp1 = load <4 x i32>, <4 x i32>* %A
77*9880d681SAndroid Build Coastguard Worker        %tmp2 = load <4 x i32>, <4 x i32>* %B
78*9880d681SAndroid Build Coastguard Worker        %tmp3 = call <4 x i16> @llvm.aarch64.neon.rsubhn.v4i16(<4 x i32> %tmp1, <4 x i32> %tmp2)
79*9880d681SAndroid Build Coastguard Worker        ret <4 x i16> %tmp3
80*9880d681SAndroid Build Coastguard Worker}
81*9880d681SAndroid Build Coastguard Worker
82*9880d681SAndroid Build Coastguard Workerdefine <2 x i32> @rsubhn2s(<2 x i64>* %A, <2 x i64>* %B) nounwind {
83*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: rsubhn2s:
84*9880d681SAndroid Build Coastguard Worker;CHECK: rsubhn.2s
85*9880d681SAndroid Build Coastguard Worker        %tmp1 = load <2 x i64>, <2 x i64>* %A
86*9880d681SAndroid Build Coastguard Worker        %tmp2 = load <2 x i64>, <2 x i64>* %B
87*9880d681SAndroid Build Coastguard Worker        %tmp3 = call <2 x i32> @llvm.aarch64.neon.rsubhn.v2i32(<2 x i64> %tmp1, <2 x i64> %tmp2)
88*9880d681SAndroid Build Coastguard Worker        ret <2 x i32> %tmp3
89*9880d681SAndroid Build Coastguard Worker}
90*9880d681SAndroid Build Coastguard Worker
91*9880d681SAndroid Build Coastguard Workerdefine <16 x i8> @rsubhn2_16b(<8 x i16> %a, <8 x i16> %b) nounwind  {
92*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: rsubhn2_16b:
93*9880d681SAndroid Build Coastguard Worker;CHECK: rsubhn.8b
94*9880d681SAndroid Build Coastguard Worker;CHECK-NEXT: rsubhn2.16b
95*9880d681SAndroid Build Coastguard Worker  %vrsubhn2.i = tail call <8 x i8> @llvm.aarch64.neon.rsubhn.v8i8(<8 x i16> %a, <8 x i16> %b) nounwind
96*9880d681SAndroid Build Coastguard Worker  %vrsubhn_high2.i = tail call <8 x i8> @llvm.aarch64.neon.rsubhn.v8i8(<8 x i16> %a, <8 x i16> %b) nounwind
97*9880d681SAndroid Build Coastguard Worker  %res = shufflevector <8 x i8> %vrsubhn2.i, <8 x i8> %vrsubhn_high2.i, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15>
98*9880d681SAndroid Build Coastguard Worker  ret <16 x i8> %res
99*9880d681SAndroid Build Coastguard Worker}
100*9880d681SAndroid Build Coastguard Worker
101*9880d681SAndroid Build Coastguard Workerdefine <8 x i16> @rsubhn2_8h(<4 x i32> %a, <4 x i32> %b) nounwind  {
102*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: rsubhn2_8h:
103*9880d681SAndroid Build Coastguard Worker;CHECK: rsubhn.4h
104*9880d681SAndroid Build Coastguard Worker;CHECK-NEXT: rsubhn2.8h
105*9880d681SAndroid Build Coastguard Worker  %vrsubhn2.i = tail call <4 x i16> @llvm.aarch64.neon.rsubhn.v4i16(<4 x i32> %a, <4 x i32> %b) nounwind
106*9880d681SAndroid Build Coastguard Worker  %vrsubhn_high3.i = tail call <4 x i16> @llvm.aarch64.neon.rsubhn.v4i16(<4 x i32> %a, <4 x i32> %b) nounwind
107*9880d681SAndroid Build Coastguard Worker  %res = shufflevector <4 x i16> %vrsubhn2.i, <4 x i16> %vrsubhn_high3.i, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>
108*9880d681SAndroid Build Coastguard Worker  ret <8 x i16> %res
109*9880d681SAndroid Build Coastguard Worker}
110*9880d681SAndroid Build Coastguard Worker
111*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @rsubhn2_4s(<2 x i64> %a, <2 x i64> %b) nounwind  {
112*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: rsubhn2_4s:
113*9880d681SAndroid Build Coastguard Worker;CHECK: rsubhn.2s
114*9880d681SAndroid Build Coastguard Worker;CHECK-NEXT: rsubhn2.4s
115*9880d681SAndroid Build Coastguard Worker  %vrsubhn2.i = tail call <2 x i32> @llvm.aarch64.neon.rsubhn.v2i32(<2 x i64> %a, <2 x i64> %b) nounwind
116*9880d681SAndroid Build Coastguard Worker  %vrsubhn_high3.i = tail call <2 x i32> @llvm.aarch64.neon.rsubhn.v2i32(<2 x i64> %a, <2 x i64> %b) nounwind
117*9880d681SAndroid Build Coastguard Worker  %res = shufflevector <2 x i32> %vrsubhn2.i, <2 x i32> %vrsubhn_high3.i, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
118*9880d681SAndroid Build Coastguard Worker  ret <4 x i32> %res
119*9880d681SAndroid Build Coastguard Worker}
120*9880d681SAndroid Build Coastguard Worker
121*9880d681SAndroid Build Coastguard Workerdeclare <2 x i32> @llvm.aarch64.neon.rsubhn.v2i32(<2 x i64>, <2 x i64>) nounwind readnone
122*9880d681SAndroid Build Coastguard Workerdeclare <4 x i16> @llvm.aarch64.neon.rsubhn.v4i16(<4 x i32>, <4 x i32>) nounwind readnone
123*9880d681SAndroid Build Coastguard Workerdeclare <8 x i8> @llvm.aarch64.neon.rsubhn.v8i8(<8 x i16>, <8 x i16>) nounwind readnone
124*9880d681SAndroid Build Coastguard Worker
125*9880d681SAndroid Build Coastguard Workerdefine <8 x i16> @ssubl8h(<8 x i8>* %A, <8 x i8>* %B) nounwind {
126*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: ssubl8h:
127*9880d681SAndroid Build Coastguard Worker;CHECK: ssubl.8h
128*9880d681SAndroid Build Coastguard Worker        %tmp1 = load <8 x i8>, <8 x i8>* %A
129*9880d681SAndroid Build Coastguard Worker        %tmp2 = load <8 x i8>, <8 x i8>* %B
130*9880d681SAndroid Build Coastguard Worker  %tmp3 = sext <8 x i8> %tmp1 to <8 x i16>
131*9880d681SAndroid Build Coastguard Worker  %tmp4 = sext <8 x i8> %tmp2 to <8 x i16>
132*9880d681SAndroid Build Coastguard Worker  %tmp5 = sub <8 x i16> %tmp3, %tmp4
133*9880d681SAndroid Build Coastguard Worker        ret <8 x i16> %tmp5
134*9880d681SAndroid Build Coastguard Worker}
135*9880d681SAndroid Build Coastguard Worker
136*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @ssubl4s(<4 x i16>* %A, <4 x i16>* %B) nounwind {
137*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: ssubl4s:
138*9880d681SAndroid Build Coastguard Worker;CHECK: ssubl.4s
139*9880d681SAndroid Build Coastguard Worker        %tmp1 = load <4 x i16>, <4 x i16>* %A
140*9880d681SAndroid Build Coastguard Worker        %tmp2 = load <4 x i16>, <4 x i16>* %B
141*9880d681SAndroid Build Coastguard Worker  %tmp3 = sext <4 x i16> %tmp1 to <4 x i32>
142*9880d681SAndroid Build Coastguard Worker  %tmp4 = sext <4 x i16> %tmp2 to <4 x i32>
143*9880d681SAndroid Build Coastguard Worker  %tmp5 = sub <4 x i32> %tmp3, %tmp4
144*9880d681SAndroid Build Coastguard Worker        ret <4 x i32> %tmp5
145*9880d681SAndroid Build Coastguard Worker}
146*9880d681SAndroid Build Coastguard Worker
147*9880d681SAndroid Build Coastguard Workerdefine <2 x i64> @ssubl2d(<2 x i32>* %A, <2 x i32>* %B) nounwind {
148*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: ssubl2d:
149*9880d681SAndroid Build Coastguard Worker;CHECK: ssubl.2d
150*9880d681SAndroid Build Coastguard Worker        %tmp1 = load <2 x i32>, <2 x i32>* %A
151*9880d681SAndroid Build Coastguard Worker        %tmp2 = load <2 x i32>, <2 x i32>* %B
152*9880d681SAndroid Build Coastguard Worker  %tmp3 = sext <2 x i32> %tmp1 to <2 x i64>
153*9880d681SAndroid Build Coastguard Worker  %tmp4 = sext <2 x i32> %tmp2 to <2 x i64>
154*9880d681SAndroid Build Coastguard Worker  %tmp5 = sub <2 x i64> %tmp3, %tmp4
155*9880d681SAndroid Build Coastguard Worker        ret <2 x i64> %tmp5
156*9880d681SAndroid Build Coastguard Worker}
157*9880d681SAndroid Build Coastguard Worker
158*9880d681SAndroid Build Coastguard Workerdefine <8 x i16> @ssubl2_8h(<16 x i8>* %A, <16 x i8>* %B) nounwind {
159*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: ssubl2_8h:
160*9880d681SAndroid Build Coastguard Worker;CHECK: ssubl2.8h
161*9880d681SAndroid Build Coastguard Worker        %tmp1 = load <16 x i8>, <16 x i8>* %A
162*9880d681SAndroid Build Coastguard Worker        %high1 = shufflevector <16 x i8> %tmp1, <16 x i8> undef, <8 x i32> <i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15>
163*9880d681SAndroid Build Coastguard Worker        %ext1 = sext <8 x i8> %high1 to <8 x i16>
164*9880d681SAndroid Build Coastguard Worker
165*9880d681SAndroid Build Coastguard Worker        %tmp2 = load <16 x i8>, <16 x i8>* %B
166*9880d681SAndroid Build Coastguard Worker        %high2 = shufflevector <16 x i8> %tmp2, <16 x i8> undef, <8 x i32> <i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15>
167*9880d681SAndroid Build Coastguard Worker        %ext2 = sext <8 x i8> %high2 to <8 x i16>
168*9880d681SAndroid Build Coastguard Worker
169*9880d681SAndroid Build Coastguard Worker        %res = sub <8 x i16> %ext1, %ext2
170*9880d681SAndroid Build Coastguard Worker        ret <8 x i16> %res
171*9880d681SAndroid Build Coastguard Worker}
172*9880d681SAndroid Build Coastguard Worker
173*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @ssubl2_4s(<8 x i16>* %A, <8 x i16>* %B) nounwind {
174*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: ssubl2_4s:
175*9880d681SAndroid Build Coastguard Worker;CHECK: ssubl2.4s
176*9880d681SAndroid Build Coastguard Worker        %tmp1 = load <8 x i16>, <8 x i16>* %A
177*9880d681SAndroid Build Coastguard Worker        %high1 = shufflevector <8 x i16> %tmp1, <8 x i16> undef, <4 x i32> <i32 4, i32 5, i32 6, i32 7>
178*9880d681SAndroid Build Coastguard Worker        %ext1 = sext <4 x i16> %high1 to <4 x i32>
179*9880d681SAndroid Build Coastguard Worker
180*9880d681SAndroid Build Coastguard Worker        %tmp2 = load <8 x i16>, <8 x i16>* %B
181*9880d681SAndroid Build Coastguard Worker        %high2 = shufflevector <8 x i16> %tmp2, <8 x i16> undef, <4 x i32> <i32 4, i32 5, i32 6, i32 7>
182*9880d681SAndroid Build Coastguard Worker        %ext2 = sext <4 x i16> %high2 to <4 x i32>
183*9880d681SAndroid Build Coastguard Worker
184*9880d681SAndroid Build Coastguard Worker        %res = sub <4 x i32> %ext1, %ext2
185*9880d681SAndroid Build Coastguard Worker        ret <4 x i32> %res
186*9880d681SAndroid Build Coastguard Worker}
187*9880d681SAndroid Build Coastguard Worker
188*9880d681SAndroid Build Coastguard Workerdefine <2 x i64> @ssubl2_2d(<4 x i32>* %A, <4 x i32>* %B) nounwind {
189*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: ssubl2_2d:
190*9880d681SAndroid Build Coastguard Worker;CHECK: ssubl2.2d
191*9880d681SAndroid Build Coastguard Worker        %tmp1 = load <4 x i32>, <4 x i32>* %A
192*9880d681SAndroid Build Coastguard Worker        %high1 = shufflevector <4 x i32> %tmp1, <4 x i32> undef, <2 x i32> <i32 2, i32 3>
193*9880d681SAndroid Build Coastguard Worker        %ext1 = sext <2 x i32> %high1 to <2 x i64>
194*9880d681SAndroid Build Coastguard Worker
195*9880d681SAndroid Build Coastguard Worker        %tmp2 = load <4 x i32>, <4 x i32>* %B
196*9880d681SAndroid Build Coastguard Worker        %high2 = shufflevector <4 x i32> %tmp2, <4 x i32> undef, <2 x i32> <i32 2, i32 3>
197*9880d681SAndroid Build Coastguard Worker        %ext2 = sext <2 x i32> %high2 to <2 x i64>
198*9880d681SAndroid Build Coastguard Worker
199*9880d681SAndroid Build Coastguard Worker        %res = sub <2 x i64> %ext1, %ext2
200*9880d681SAndroid Build Coastguard Worker        ret <2 x i64> %res
201*9880d681SAndroid Build Coastguard Worker}
202*9880d681SAndroid Build Coastguard Worker
203*9880d681SAndroid Build Coastguard Workerdefine <8 x i16> @usubl8h(<8 x i8>* %A, <8 x i8>* %B) nounwind {
204*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: usubl8h:
205*9880d681SAndroid Build Coastguard Worker;CHECK: usubl.8h
206*9880d681SAndroid Build Coastguard Worker  %tmp1 = load <8 x i8>, <8 x i8>* %A
207*9880d681SAndroid Build Coastguard Worker  %tmp2 = load <8 x i8>, <8 x i8>* %B
208*9880d681SAndroid Build Coastguard Worker  %tmp3 = zext <8 x i8> %tmp1 to <8 x i16>
209*9880d681SAndroid Build Coastguard Worker  %tmp4 = zext <8 x i8> %tmp2 to <8 x i16>
210*9880d681SAndroid Build Coastguard Worker  %tmp5 = sub <8 x i16> %tmp3, %tmp4
211*9880d681SAndroid Build Coastguard Worker  ret <8 x i16> %tmp5
212*9880d681SAndroid Build Coastguard Worker}
213*9880d681SAndroid Build Coastguard Worker
214*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @usubl4s(<4 x i16>* %A, <4 x i16>* %B) nounwind {
215*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: usubl4s:
216*9880d681SAndroid Build Coastguard Worker;CHECK: usubl.4s
217*9880d681SAndroid Build Coastguard Worker  %tmp1 = load <4 x i16>, <4 x i16>* %A
218*9880d681SAndroid Build Coastguard Worker  %tmp2 = load <4 x i16>, <4 x i16>* %B
219*9880d681SAndroid Build Coastguard Worker  %tmp3 = zext <4 x i16> %tmp1 to <4 x i32>
220*9880d681SAndroid Build Coastguard Worker  %tmp4 = zext <4 x i16> %tmp2 to <4 x i32>
221*9880d681SAndroid Build Coastguard Worker  %tmp5 = sub <4 x i32> %tmp3, %tmp4
222*9880d681SAndroid Build Coastguard Worker  ret <4 x i32> %tmp5
223*9880d681SAndroid Build Coastguard Worker}
224*9880d681SAndroid Build Coastguard Worker
225*9880d681SAndroid Build Coastguard Workerdefine <2 x i64> @usubl2d(<2 x i32>* %A, <2 x i32>* %B) nounwind {
226*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: usubl2d:
227*9880d681SAndroid Build Coastguard Worker;CHECK: usubl.2d
228*9880d681SAndroid Build Coastguard Worker  %tmp1 = load <2 x i32>, <2 x i32>* %A
229*9880d681SAndroid Build Coastguard Worker  %tmp2 = load <2 x i32>, <2 x i32>* %B
230*9880d681SAndroid Build Coastguard Worker  %tmp3 = zext <2 x i32> %tmp1 to <2 x i64>
231*9880d681SAndroid Build Coastguard Worker  %tmp4 = zext <2 x i32> %tmp2 to <2 x i64>
232*9880d681SAndroid Build Coastguard Worker  %tmp5 = sub <2 x i64> %tmp3, %tmp4
233*9880d681SAndroid Build Coastguard Worker  ret <2 x i64> %tmp5
234*9880d681SAndroid Build Coastguard Worker}
235*9880d681SAndroid Build Coastguard Worker
236*9880d681SAndroid Build Coastguard Workerdefine <8 x i16> @usubl2_8h(<16 x i8>* %A, <16 x i8>* %B) nounwind {
237*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: usubl2_8h:
238*9880d681SAndroid Build Coastguard Worker;CHECK: usubl2.8h
239*9880d681SAndroid Build Coastguard Worker  %tmp1 = load <16 x i8>, <16 x i8>* %A
240*9880d681SAndroid Build Coastguard Worker  %high1 = shufflevector <16 x i8> %tmp1, <16 x i8> undef, <8 x i32> <i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15>
241*9880d681SAndroid Build Coastguard Worker  %ext1 = zext <8 x i8> %high1 to <8 x i16>
242*9880d681SAndroid Build Coastguard Worker
243*9880d681SAndroid Build Coastguard Worker  %tmp2 = load <16 x i8>, <16 x i8>* %B
244*9880d681SAndroid Build Coastguard Worker  %high2 = shufflevector <16 x i8> %tmp2, <16 x i8> undef, <8 x i32> <i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15>
245*9880d681SAndroid Build Coastguard Worker  %ext2 = zext <8 x i8> %high2 to <8 x i16>
246*9880d681SAndroid Build Coastguard Worker
247*9880d681SAndroid Build Coastguard Worker  %res = sub <8 x i16> %ext1, %ext2
248*9880d681SAndroid Build Coastguard Worker  ret <8 x i16> %res
249*9880d681SAndroid Build Coastguard Worker}
250*9880d681SAndroid Build Coastguard Worker
251*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @usubl2_4s(<8 x i16>* %A, <8 x i16>* %B) nounwind {
252*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: usubl2_4s:
253*9880d681SAndroid Build Coastguard Worker;CHECK: usubl2.4s
254*9880d681SAndroid Build Coastguard Worker  %tmp1 = load <8 x i16>, <8 x i16>* %A
255*9880d681SAndroid Build Coastguard Worker  %high1 = shufflevector <8 x i16> %tmp1, <8 x i16> undef, <4 x i32> <i32 4, i32 5, i32 6, i32 7>
256*9880d681SAndroid Build Coastguard Worker  %ext1 = zext <4 x i16> %high1 to <4 x i32>
257*9880d681SAndroid Build Coastguard Worker
258*9880d681SAndroid Build Coastguard Worker  %tmp2 = load <8 x i16>, <8 x i16>* %B
259*9880d681SAndroid Build Coastguard Worker  %high2 = shufflevector <8 x i16> %tmp2, <8 x i16> undef, <4 x i32> <i32 4, i32 5, i32 6, i32 7>
260*9880d681SAndroid Build Coastguard Worker  %ext2 = zext <4 x i16> %high2 to <4 x i32>
261*9880d681SAndroid Build Coastguard Worker
262*9880d681SAndroid Build Coastguard Worker  %res = sub <4 x i32> %ext1, %ext2
263*9880d681SAndroid Build Coastguard Worker  ret <4 x i32> %res
264*9880d681SAndroid Build Coastguard Worker}
265*9880d681SAndroid Build Coastguard Worker
266*9880d681SAndroid Build Coastguard Workerdefine <2 x i64> @usubl2_2d(<4 x i32>* %A, <4 x i32>* %B) nounwind {
267*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: usubl2_2d:
268*9880d681SAndroid Build Coastguard Worker;CHECK: usubl2.2d
269*9880d681SAndroid Build Coastguard Worker  %tmp1 = load <4 x i32>, <4 x i32>* %A
270*9880d681SAndroid Build Coastguard Worker  %high1 = shufflevector <4 x i32> %tmp1, <4 x i32> undef, <2 x i32> <i32 2, i32 3>
271*9880d681SAndroid Build Coastguard Worker  %ext1 = zext <2 x i32> %high1 to <2 x i64>
272*9880d681SAndroid Build Coastguard Worker
273*9880d681SAndroid Build Coastguard Worker  %tmp2 = load <4 x i32>, <4 x i32>* %B
274*9880d681SAndroid Build Coastguard Worker  %high2 = shufflevector <4 x i32> %tmp2, <4 x i32> undef, <2 x i32> <i32 2, i32 3>
275*9880d681SAndroid Build Coastguard Worker  %ext2 = zext <2 x i32> %high2 to <2 x i64>
276*9880d681SAndroid Build Coastguard Worker
277*9880d681SAndroid Build Coastguard Worker  %res = sub <2 x i64> %ext1, %ext2
278*9880d681SAndroid Build Coastguard Worker  ret <2 x i64> %res
279*9880d681SAndroid Build Coastguard Worker}
280*9880d681SAndroid Build Coastguard Worker
281*9880d681SAndroid Build Coastguard Workerdefine <8 x i16> @ssubw8h(<8 x i16>* %A, <8 x i8>* %B) nounwind {
282*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: ssubw8h:
283*9880d681SAndroid Build Coastguard Worker;CHECK: ssubw.8h
284*9880d681SAndroid Build Coastguard Worker        %tmp1 = load <8 x i16>, <8 x i16>* %A
285*9880d681SAndroid Build Coastguard Worker        %tmp2 = load <8 x i8>, <8 x i8>* %B
286*9880d681SAndroid Build Coastguard Worker  %tmp3 = sext <8 x i8> %tmp2 to <8 x i16>
287*9880d681SAndroid Build Coastguard Worker  %tmp4 = sub <8 x i16> %tmp1, %tmp3
288*9880d681SAndroid Build Coastguard Worker        ret <8 x i16> %tmp4
289*9880d681SAndroid Build Coastguard Worker}
290*9880d681SAndroid Build Coastguard Worker
291*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @ssubw4s(<4 x i32>* %A, <4 x i16>* %B) nounwind {
292*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: ssubw4s:
293*9880d681SAndroid Build Coastguard Worker;CHECK: ssubw.4s
294*9880d681SAndroid Build Coastguard Worker        %tmp1 = load <4 x i32>, <4 x i32>* %A
295*9880d681SAndroid Build Coastguard Worker        %tmp2 = load <4 x i16>, <4 x i16>* %B
296*9880d681SAndroid Build Coastguard Worker  %tmp3 = sext <4 x i16> %tmp2 to <4 x i32>
297*9880d681SAndroid Build Coastguard Worker  %tmp4 = sub <4 x i32> %tmp1, %tmp3
298*9880d681SAndroid Build Coastguard Worker        ret <4 x i32> %tmp4
299*9880d681SAndroid Build Coastguard Worker}
300*9880d681SAndroid Build Coastguard Worker
301*9880d681SAndroid Build Coastguard Workerdefine <2 x i64> @ssubw2d(<2 x i64>* %A, <2 x i32>* %B) nounwind {
302*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: ssubw2d:
303*9880d681SAndroid Build Coastguard Worker;CHECK: ssubw.2d
304*9880d681SAndroid Build Coastguard Worker        %tmp1 = load <2 x i64>, <2 x i64>* %A
305*9880d681SAndroid Build Coastguard Worker        %tmp2 = load <2 x i32>, <2 x i32>* %B
306*9880d681SAndroid Build Coastguard Worker  %tmp3 = sext <2 x i32> %tmp2 to <2 x i64>
307*9880d681SAndroid Build Coastguard Worker  %tmp4 = sub <2 x i64> %tmp1, %tmp3
308*9880d681SAndroid Build Coastguard Worker        ret <2 x i64> %tmp4
309*9880d681SAndroid Build Coastguard Worker}
310*9880d681SAndroid Build Coastguard Worker
311*9880d681SAndroid Build Coastguard Workerdefine <8 x i16> @ssubw2_8h(<8 x i16>* %A, <16 x i8>* %B) nounwind {
312*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: ssubw2_8h:
313*9880d681SAndroid Build Coastguard Worker;CHECK: ssubw2.8h
314*9880d681SAndroid Build Coastguard Worker        %tmp1 = load <8 x i16>, <8 x i16>* %A
315*9880d681SAndroid Build Coastguard Worker
316*9880d681SAndroid Build Coastguard Worker        %tmp2 = load <16 x i8>, <16 x i8>* %B
317*9880d681SAndroid Build Coastguard Worker        %high2 = shufflevector <16 x i8> %tmp2, <16 x i8> undef, <8 x i32> <i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15>
318*9880d681SAndroid Build Coastguard Worker        %ext2 = sext <8 x i8> %high2 to <8 x i16>
319*9880d681SAndroid Build Coastguard Worker
320*9880d681SAndroid Build Coastguard Worker        %res = sub <8 x i16> %tmp1, %ext2
321*9880d681SAndroid Build Coastguard Worker        ret <8 x i16> %res
322*9880d681SAndroid Build Coastguard Worker}
323*9880d681SAndroid Build Coastguard Worker
324*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @ssubw2_4s(<4 x i32>* %A, <8 x i16>* %B) nounwind {
325*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: ssubw2_4s:
326*9880d681SAndroid Build Coastguard Worker;CHECK: ssubw2.4s
327*9880d681SAndroid Build Coastguard Worker        %tmp1 = load <4 x i32>, <4 x i32>* %A
328*9880d681SAndroid Build Coastguard Worker
329*9880d681SAndroid Build Coastguard Worker        %tmp2 = load <8 x i16>, <8 x i16>* %B
330*9880d681SAndroid Build Coastguard Worker        %high2 = shufflevector <8 x i16> %tmp2, <8 x i16> undef, <4 x i32> <i32 4, i32 5, i32 6, i32 7>
331*9880d681SAndroid Build Coastguard Worker        %ext2 = sext <4 x i16> %high2 to <4 x i32>
332*9880d681SAndroid Build Coastguard Worker
333*9880d681SAndroid Build Coastguard Worker        %res = sub <4 x i32> %tmp1, %ext2
334*9880d681SAndroid Build Coastguard Worker        ret <4 x i32> %res
335*9880d681SAndroid Build Coastguard Worker}
336*9880d681SAndroid Build Coastguard Worker
337*9880d681SAndroid Build Coastguard Workerdefine <2 x i64> @ssubw2_2d(<2 x i64>* %A, <4 x i32>* %B) nounwind {
338*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: ssubw2_2d:
339*9880d681SAndroid Build Coastguard Worker;CHECK: ssubw2.2d
340*9880d681SAndroid Build Coastguard Worker        %tmp1 = load <2 x i64>, <2 x i64>* %A
341*9880d681SAndroid Build Coastguard Worker
342*9880d681SAndroid Build Coastguard Worker        %tmp2 = load <4 x i32>, <4 x i32>* %B
343*9880d681SAndroid Build Coastguard Worker        %high2 = shufflevector <4 x i32> %tmp2, <4 x i32> undef, <2 x i32> <i32 2, i32 3>
344*9880d681SAndroid Build Coastguard Worker        %ext2 = sext <2 x i32> %high2 to <2 x i64>
345*9880d681SAndroid Build Coastguard Worker
346*9880d681SAndroid Build Coastguard Worker        %res = sub <2 x i64> %tmp1, %ext2
347*9880d681SAndroid Build Coastguard Worker        ret <2 x i64> %res
348*9880d681SAndroid Build Coastguard Worker}
349*9880d681SAndroid Build Coastguard Worker
350*9880d681SAndroid Build Coastguard Workerdefine <8 x i16> @usubw8h(<8 x i16>* %A, <8 x i8>* %B) nounwind {
351*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: usubw8h:
352*9880d681SAndroid Build Coastguard Worker;CHECK: usubw.8h
353*9880d681SAndroid Build Coastguard Worker        %tmp1 = load <8 x i16>, <8 x i16>* %A
354*9880d681SAndroid Build Coastguard Worker        %tmp2 = load <8 x i8>, <8 x i8>* %B
355*9880d681SAndroid Build Coastguard Worker  %tmp3 = zext <8 x i8> %tmp2 to <8 x i16>
356*9880d681SAndroid Build Coastguard Worker  %tmp4 = sub <8 x i16> %tmp1, %tmp3
357*9880d681SAndroid Build Coastguard Worker        ret <8 x i16> %tmp4
358*9880d681SAndroid Build Coastguard Worker}
359*9880d681SAndroid Build Coastguard Worker
360*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @usubw4s(<4 x i32>* %A, <4 x i16>* %B) nounwind {
361*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: usubw4s:
362*9880d681SAndroid Build Coastguard Worker;CHECK: usubw.4s
363*9880d681SAndroid Build Coastguard Worker        %tmp1 = load <4 x i32>, <4 x i32>* %A
364*9880d681SAndroid Build Coastguard Worker        %tmp2 = load <4 x i16>, <4 x i16>* %B
365*9880d681SAndroid Build Coastguard Worker  %tmp3 = zext <4 x i16> %tmp2 to <4 x i32>
366*9880d681SAndroid Build Coastguard Worker  %tmp4 = sub <4 x i32> %tmp1, %tmp3
367*9880d681SAndroid Build Coastguard Worker        ret <4 x i32> %tmp4
368*9880d681SAndroid Build Coastguard Worker}
369*9880d681SAndroid Build Coastguard Worker
370*9880d681SAndroid Build Coastguard Workerdefine <2 x i64> @usubw2d(<2 x i64>* %A, <2 x i32>* %B) nounwind {
371*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: usubw2d:
372*9880d681SAndroid Build Coastguard Worker;CHECK: usubw.2d
373*9880d681SAndroid Build Coastguard Worker        %tmp1 = load <2 x i64>, <2 x i64>* %A
374*9880d681SAndroid Build Coastguard Worker        %tmp2 = load <2 x i32>, <2 x i32>* %B
375*9880d681SAndroid Build Coastguard Worker  %tmp3 = zext <2 x i32> %tmp2 to <2 x i64>
376*9880d681SAndroid Build Coastguard Worker  %tmp4 = sub <2 x i64> %tmp1, %tmp3
377*9880d681SAndroid Build Coastguard Worker        ret <2 x i64> %tmp4
378*9880d681SAndroid Build Coastguard Worker}
379*9880d681SAndroid Build Coastguard Worker
380*9880d681SAndroid Build Coastguard Workerdefine <8 x i16> @usubw2_8h(<8 x i16>* %A, <16 x i8>* %B) nounwind {
381*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: usubw2_8h:
382*9880d681SAndroid Build Coastguard Worker;CHECK: usubw2.8h
383*9880d681SAndroid Build Coastguard Worker        %tmp1 = load <8 x i16>, <8 x i16>* %A
384*9880d681SAndroid Build Coastguard Worker
385*9880d681SAndroid Build Coastguard Worker        %tmp2 = load <16 x i8>, <16 x i8>* %B
386*9880d681SAndroid Build Coastguard Worker        %high2 = shufflevector <16 x i8> %tmp2, <16 x i8> undef, <8 x i32> <i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15>
387*9880d681SAndroid Build Coastguard Worker        %ext2 = zext <8 x i8> %high2 to <8 x i16>
388*9880d681SAndroid Build Coastguard Worker
389*9880d681SAndroid Build Coastguard Worker        %res = sub <8 x i16> %tmp1, %ext2
390*9880d681SAndroid Build Coastguard Worker        ret <8 x i16> %res
391*9880d681SAndroid Build Coastguard Worker}
392*9880d681SAndroid Build Coastguard Worker
393*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @usubw2_4s(<4 x i32>* %A, <8 x i16>* %B) nounwind {
394*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: usubw2_4s:
395*9880d681SAndroid Build Coastguard Worker;CHECK: usubw2.4s
396*9880d681SAndroid Build Coastguard Worker        %tmp1 = load <4 x i32>, <4 x i32>* %A
397*9880d681SAndroid Build Coastguard Worker
398*9880d681SAndroid Build Coastguard Worker        %tmp2 = load <8 x i16>, <8 x i16>* %B
399*9880d681SAndroid Build Coastguard Worker        %high2 = shufflevector <8 x i16> %tmp2, <8 x i16> undef, <4 x i32> <i32 4, i32 5, i32 6, i32 7>
400*9880d681SAndroid Build Coastguard Worker        %ext2 = zext <4 x i16> %high2 to <4 x i32>
401*9880d681SAndroid Build Coastguard Worker
402*9880d681SAndroid Build Coastguard Worker        %res = sub <4 x i32> %tmp1, %ext2
403*9880d681SAndroid Build Coastguard Worker        ret <4 x i32> %res
404*9880d681SAndroid Build Coastguard Worker}
405*9880d681SAndroid Build Coastguard Worker
406*9880d681SAndroid Build Coastguard Workerdefine <2 x i64> @usubw2_2d(<2 x i64>* %A, <4 x i32>* %B) nounwind {
407*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: usubw2_2d:
408*9880d681SAndroid Build Coastguard Worker;CHECK: usubw2.2d
409*9880d681SAndroid Build Coastguard Worker        %tmp1 = load <2 x i64>, <2 x i64>* %A
410*9880d681SAndroid Build Coastguard Worker
411*9880d681SAndroid Build Coastguard Worker        %tmp2 = load <4 x i32>, <4 x i32>* %B
412*9880d681SAndroid Build Coastguard Worker        %high2 = shufflevector <4 x i32> %tmp2, <4 x i32> undef, <2 x i32> <i32 2, i32 3>
413*9880d681SAndroid Build Coastguard Worker        %ext2 = zext <2 x i32> %high2 to <2 x i64>
414*9880d681SAndroid Build Coastguard Worker
415*9880d681SAndroid Build Coastguard Worker        %res = sub <2 x i64> %tmp1, %ext2
416*9880d681SAndroid Build Coastguard Worker        ret <2 x i64> %res
417*9880d681SAndroid Build Coastguard Worker}
418