1 ; RUN: llc -mtriple=aarch64-none-linux-gnu -mattr=+neon < %s | FileCheck %s
3 declare <1 x i64> @llvm.arm.neon.vqaddu.v1i64(<1 x i64>, <1 x i64>)
4 declare <1 x i64> @llvm.arm.neon.vqadds.v1i64(<1 x i64>, <1 x i64>)
6 define <1 x i64> @test_uqadd_v1i64(<1 x i64> %lhs, <1 x i64> %rhs) {
7 ; CHECK: test_uqadd_v1i64:
8 %tmp1 = call <1 x i64> @llvm.arm.neon.vqaddu.v1i64(<1 x i64> %lhs, <1 x i64> %rhs)
9 ; CHECK: uqadd d0, d0, d1
13 define <1 x i64> @test_sqadd_v1i64(<1 x i64> %lhs, <1 x i64> %rhs) {
14 ; CHECK: test_sqadd_v1i64:
15 %tmp1 = call <1 x i64> @llvm.arm.neon.vqadds.v1i64(<1 x i64> %lhs, <1 x i64> %rhs)
16 ; CHECK: sqadd d0, d0, d1
20 declare <1 x i64> @llvm.arm.neon.vqsubu.v1i64(<1 x i64>, <1 x i64>)
21 declare <1 x i64> @llvm.arm.neon.vqsubs.v1i64(<1 x i64>, <1 x i64>)
23 define <1 x i64> @test_uqsub_v1i64(<1 x i64> %lhs, <1 x i64> %rhs) {
24 ; CHECK: test_uqsub_v1i64:
25 %tmp1 = call <1 x i64> @llvm.arm.neon.vqsubu.v1i64(<1 x i64> %lhs, <1 x i64> %rhs)
26 ; CHECK: uqsub d0, d0, d1
30 define <1 x i64> @test_sqsub_v1i64(<1 x i64> %lhs, <1 x i64> %rhs) {
31 ; CHECK: test_sqsub_v1i64:
32 %tmp1 = call <1 x i64> @llvm.arm.neon.vqsubs.v1i64(<1 x i64> %lhs, <1 x i64> %rhs)
33 ; CHECK: sqsub d0, d0, d1
37 declare <1 x i8> @llvm.aarch64.neon.vqaddu.v1i8(<1 x i8>, <1 x i8>)
38 declare <1 x i8> @llvm.aarch64.neon.vqadds.v1i8(<1 x i8>, <1 x i8>)
40 define <1 x i8> @test_uqadd_v1i8_aarch64(<1 x i8> %lhs, <1 x i8> %rhs) {
41 ; CHECK: test_uqadd_v1i8_aarch64:
42 %tmp1 = call <1 x i8> @llvm.aarch64.neon.vqaddu.v1i8(<1 x i8> %lhs, <1 x i8> %rhs)
43 ;CHECK: uqadd {{b[0-31]+}}, {{b[0-31]+}}, {{b[0-31]+}}
47 define <1 x i8> @test_sqadd_v1i8_aarch64(<1 x i8> %lhs, <1 x i8> %rhs) {
48 ; CHECK: test_sqadd_v1i8_aarch64:
49 %tmp1 = call <1 x i8> @llvm.aarch64.neon.vqadds.v1i8(<1 x i8> %lhs, <1 x i8> %rhs)
50 ;CHECK: sqadd {{b[0-31]+}}, {{b[0-31]+}}, {{b[0-31]+}}
54 declare <1 x i8> @llvm.aarch64.neon.vqsubu.v1i8(<1 x i8>, <1 x i8>)
55 declare <1 x i8> @llvm.aarch64.neon.vqsubs.v1i8(<1 x i8>, <1 x i8>)
57 define <1 x i8> @test_uqsub_v1i8_aarch64(<1 x i8> %lhs, <1 x i8> %rhs) {
58 ; CHECK: test_uqsub_v1i8_aarch64:
59 %tmp1 = call <1 x i8> @llvm.aarch64.neon.vqsubu.v1i8(<1 x i8> %lhs, <1 x i8> %rhs)
60 ;CHECK: uqsub {{b[0-31]+}}, {{b[0-31]+}}, {{b[0-31]+}}
64 define <1 x i8> @test_sqsub_v1i8_aarch64(<1 x i8> %lhs, <1 x i8> %rhs) {
65 ; CHECK: test_sqsub_v1i8_aarch64:
66 %tmp1 = call <1 x i8> @llvm.aarch64.neon.vqsubs.v1i8(<1 x i8> %lhs, <1 x i8> %rhs)
67 ;CHECK: sqsub {{b[0-31]+}}, {{b[0-31]+}}, {{b[0-31]+}}
71 declare <1 x i16> @llvm.aarch64.neon.vqaddu.v1i16(<1 x i16>, <1 x i16>)
72 declare <1 x i16> @llvm.aarch64.neon.vqadds.v1i16(<1 x i16>, <1 x i16>)
74 define <1 x i16> @test_uqadd_v1i16_aarch64(<1 x i16> %lhs, <1 x i16> %rhs) {
75 ; CHECK: test_uqadd_v1i16_aarch64:
76 %tmp1 = call <1 x i16> @llvm.aarch64.neon.vqaddu.v1i16(<1 x i16> %lhs, <1 x i16> %rhs)
77 ;CHECK: uqadd {{h[0-31]+}}, {{h[0-31]+}}, {{h[0-31]+}}
81 define <1 x i16> @test_sqadd_v1i16_aarch64(<1 x i16> %lhs, <1 x i16> %rhs) {
82 ; CHECK: test_sqadd_v1i16_aarch64:
83 %tmp1 = call <1 x i16> @llvm.aarch64.neon.vqadds.v1i16(<1 x i16> %lhs, <1 x i16> %rhs)
84 ;CHECK: sqadd {{h[0-31]+}}, {{h[0-31]+}}, {{h[0-31]+}}
88 declare <1 x i16> @llvm.aarch64.neon.vqsubu.v1i16(<1 x i16>, <1 x i16>)
89 declare <1 x i16> @llvm.aarch64.neon.vqsubs.v1i16(<1 x i16>, <1 x i16>)
91 define <1 x i16> @test_uqsub_v1i16_aarch64(<1 x i16> %lhs, <1 x i16> %rhs) {
92 ; CHECK: test_uqsub_v1i16_aarch64:
93 %tmp1 = call <1 x i16> @llvm.aarch64.neon.vqsubu.v1i16(<1 x i16> %lhs, <1 x i16> %rhs)
94 ;CHECK: uqsub {{h[0-31]+}}, {{h[0-31]+}}, {{h[0-31]+}}
98 define <1 x i16> @test_sqsub_v1i16_aarch64(<1 x i16> %lhs, <1 x i16> %rhs) {
99 ; CHECK: test_sqsub_v1i16_aarch64:
100 %tmp1 = call <1 x i16> @llvm.aarch64.neon.vqsubs.v1i16(<1 x i16> %lhs, <1 x i16> %rhs)
101 ;CHECK: sqsub {{h[0-31]+}}, {{h[0-31]+}}, {{h[0-31]+}}
105 declare <1 x i32> @llvm.aarch64.neon.vqaddu.v1i32(<1 x i32>, <1 x i32>)
106 declare <1 x i32> @llvm.aarch64.neon.vqadds.v1i32(<1 x i32>, <1 x i32>)
108 define <1 x i32> @test_uqadd_v1i32_aarch64(<1 x i32> %lhs, <1 x i32> %rhs) {
109 ; CHECK: test_uqadd_v1i32_aarch64:
110 %tmp1 = call <1 x i32> @llvm.aarch64.neon.vqaddu.v1i32(<1 x i32> %lhs, <1 x i32> %rhs)
111 ;CHECK: uqadd {{s[0-31]+}}, {{s[0-31]+}}, {{s[0-31]+}}
115 define <1 x i32> @test_sqadd_v1i32_aarch64(<1 x i32> %lhs, <1 x i32> %rhs) {
116 ; CHECK: test_sqadd_v1i32_aarch64:
117 %tmp1 = call <1 x i32> @llvm.aarch64.neon.vqadds.v1i32(<1 x i32> %lhs, <1 x i32> %rhs)
118 ;CHECK: sqadd {{s[0-31]+}}, {{s[0-31]+}}, {{s[0-31]+}}
122 declare <1 x i32> @llvm.aarch64.neon.vqsubu.v1i32(<1 x i32>, <1 x i32>)
123 declare <1 x i32> @llvm.aarch64.neon.vqsubs.v1i32(<1 x i32>, <1 x i32>)
125 define <1 x i32> @test_uqsub_v1i32_aarch64(<1 x i32> %lhs, <1 x i32> %rhs) {
126 ; CHECK: test_uqsub_v1i32_aarch64:
127 %tmp1 = call <1 x i32> @llvm.aarch64.neon.vqsubu.v1i32(<1 x i32> %lhs, <1 x i32> %rhs)
128 ;CHECK: uqsub {{s[0-31]+}}, {{s[0-31]+}}, {{s[0-31]+}}
132 define <1 x i32> @test_sqsub_v1i32_aarch64(<1 x i32> %lhs, <1 x i32> %rhs) {
133 ; CHECK: test_sqsub_v1i32_aarch64:
134 %tmp1 = call <1 x i32> @llvm.aarch64.neon.vqsubs.v1i32(<1 x i32> %lhs, <1 x i32> %rhs)
135 ;CHECK: sqsub {{s[0-31]+}}, {{s[0-31]+}}, {{s[0-31]+}}
139 declare <1 x i64> @llvm.aarch64.neon.vqaddu.v1i64(<1 x i64>, <1 x i64>)
140 declare <1 x i64> @llvm.aarch64.neon.vqadds.v1i64(<1 x i64>, <1 x i64>)
142 define <1 x i64> @test_uqadd_v1i64_aarch64(<1 x i64> %lhs, <1 x i64> %rhs) {
143 ; CHECK: test_uqadd_v1i64_aarch64:
144 %tmp1 = call <1 x i64> @llvm.aarch64.neon.vqaddu.v1i64(<1 x i64> %lhs, <1 x i64> %rhs)
145 ;CHECK: uqadd {{d[0-31]+}}, {{d[0-31]+}}, {{d[0-31]+}}
149 define <1 x i64> @test_sqadd_v1i64_aarch64(<1 x i64> %lhs, <1 x i64> %rhs) {
150 ; CHECK: test_sqadd_v1i64_aarch64:
151 %tmp1 = call <1 x i64> @llvm.aarch64.neon.vqadds.v1i64(<1 x i64> %lhs, <1 x i64> %rhs)
152 ;CHECK: sqadd {{d[0-31]+}}, {{d[0-31]+}}, {{d[0-31]+}}
156 declare <1 x i64> @llvm.aarch64.neon.vqsubu.v1i64(<1 x i64>, <1 x i64>)
157 declare <1 x i64> @llvm.aarch64.neon.vqsubs.v1i64(<1 x i64>, <1 x i64>)
159 define <1 x i64> @test_uqsub_v1i64_aarch64(<1 x i64> %lhs, <1 x i64> %rhs) {
160 ; CHECK: test_uqsub_v1i64_aarch64:
161 %tmp1 = call <1 x i64> @llvm.aarch64.neon.vqsubu.v1i64(<1 x i64> %lhs, <1 x i64> %rhs)
162 ;CHECK: uqsub {{d[0-31]+}}, {{d[0-31]+}}, {{d[0-31]+}}
166 define <1 x i64> @test_sqsub_v1i64_aarch64(<1 x i64> %lhs, <1 x i64> %rhs) {
167 ; CHECK: test_sqsub_v1i64_aarch64:
168 %tmp1 = call <1 x i64> @llvm.aarch64.neon.vqsubs.v1i64(<1 x i64> %lhs, <1 x i64> %rhs)
169 ;CHECK: sqsub {{d[0-31]+}}, {{d[0-31]+}}, {{d[0-31]+}}
173 define i8 @test_vuqaddb_s8(i8 %a, i8 %b) {
174 ; CHECK: test_vuqaddb_s8
175 ; CHECK: suqadd {{b[0-9]+}}, {{b[0-9]+}}
177 %vuqadd.i = insertelement <1 x i8> undef, i8 %a, i32 0
178 %vuqadd1.i = insertelement <1 x i8> undef, i8 %b, i32 0
179 %vuqadd2.i = call <1 x i8> @llvm.aarch64.neon.vuqadd.v1i8(<1 x i8> %vuqadd.i, <1 x i8> %vuqadd1.i)
180 %0 = extractelement <1 x i8> %vuqadd2.i, i32 0
184 declare <1 x i8> @llvm.aarch64.neon.vsqadd.v1i8(<1 x i8>, <1 x i8>)
186 define i16 @test_vuqaddh_s16(i16 %a, i16 %b) {
187 ; CHECK: test_vuqaddh_s16
188 ; CHECK: suqadd {{h[0-9]+}}, {{h[0-9]+}}
190 %vuqadd.i = insertelement <1 x i16> undef, i16 %a, i32 0
191 %vuqadd1.i = insertelement <1 x i16> undef, i16 %b, i32 0
192 %vuqadd2.i = call <1 x i16> @llvm.aarch64.neon.vuqadd.v1i16(<1 x i16> %vuqadd.i, <1 x i16> %vuqadd1.i)
193 %0 = extractelement <1 x i16> %vuqadd2.i, i32 0
197 declare <1 x i16> @llvm.aarch64.neon.vsqadd.v1i16(<1 x i16>, <1 x i16>)
199 define i32 @test_vuqadds_s32(i32 %a, i32 %b) {
200 ; CHECK: test_vuqadds_s32
201 ; CHECK: suqadd {{s[0-9]+}}, {{s[0-9]+}}
203 %vuqadd.i = insertelement <1 x i32> undef, i32 %a, i32 0
204 %vuqadd1.i = insertelement <1 x i32> undef, i32 %b, i32 0
205 %vuqadd2.i = call <1 x i32> @llvm.aarch64.neon.vuqadd.v1i32(<1 x i32> %vuqadd.i, <1 x i32> %vuqadd1.i)
206 %0 = extractelement <1 x i32> %vuqadd2.i, i32 0
210 declare <1 x i32> @llvm.aarch64.neon.vsqadd.v1i32(<1 x i32>, <1 x i32>)
212 define i64 @test_vuqaddd_s64(i64 %a, i64 %b) {
213 ; CHECK: test_vuqaddd_s64
214 ; CHECK: suqadd {{d[0-9]+}}, {{d[0-9]+}}
216 %vuqadd.i = insertelement <1 x i64> undef, i64 %a, i32 0
217 %vuqadd1.i = insertelement <1 x i64> undef, i64 %b, i32 0
218 %vuqadd2.i = call <1 x i64> @llvm.aarch64.neon.vuqadd.v1i64(<1 x i64> %vuqadd.i, <1 x i64> %vuqadd1.i)
219 %0 = extractelement <1 x i64> %vuqadd2.i, i32 0
223 declare <1 x i64> @llvm.aarch64.neon.vsqadd.v1i64(<1 x i64>, <1 x i64>)
225 define i8 @test_vsqaddb_u8(i8 %a, i8 %b) {
226 ; CHECK: test_vsqaddb_u8
227 ; CHECK: usqadd {{b[0-9]+}}, {{b[0-9]+}}
229 %vsqadd.i = insertelement <1 x i8> undef, i8 %a, i32 0
230 %vsqadd1.i = insertelement <1 x i8> undef, i8 %b, i32 0
231 %vsqadd2.i = call <1 x i8> @llvm.aarch64.neon.vsqadd.v1i8(<1 x i8> %vsqadd.i, <1 x i8> %vsqadd1.i)
232 %0 = extractelement <1 x i8> %vsqadd2.i, i32 0
236 declare <1 x i8> @llvm.aarch64.neon.vuqadd.v1i8(<1 x i8>, <1 x i8>)
238 define i16 @test_vsqaddh_u16(i16 %a, i16 %b) {
239 ; CHECK: test_vsqaddh_u16
240 ; CHECK: usqadd {{h[0-9]+}}, {{h[0-9]+}}
242 %vsqadd.i = insertelement <1 x i16> undef, i16 %a, i32 0
243 %vsqadd1.i = insertelement <1 x i16> undef, i16 %b, i32 0
244 %vsqadd2.i = call <1 x i16> @llvm.aarch64.neon.vsqadd.v1i16(<1 x i16> %vsqadd.i, <1 x i16> %vsqadd1.i)
245 %0 = extractelement <1 x i16> %vsqadd2.i, i32 0
249 declare <1 x i16> @llvm.aarch64.neon.vuqadd.v1i16(<1 x i16>, <1 x i16>)
251 define i32 @test_vsqadds_u32(i32 %a, i32 %b) {
252 ; CHECK: test_vsqadds_u32
253 ; CHECK: usqadd {{s[0-9]+}}, {{s[0-9]+}}
255 %vsqadd.i = insertelement <1 x i32> undef, i32 %a, i32 0
256 %vsqadd1.i = insertelement <1 x i32> undef, i32 %b, i32 0
257 %vsqadd2.i = call <1 x i32> @llvm.aarch64.neon.vsqadd.v1i32(<1 x i32> %vsqadd.i, <1 x i32> %vsqadd1.i)
258 %0 = extractelement <1 x i32> %vsqadd2.i, i32 0
262 declare <1 x i32> @llvm.aarch64.neon.vuqadd.v1i32(<1 x i32>, <1 x i32>)
264 define i64 @test_vsqaddd_u64(i64 %a, i64 %b) {
265 ; CHECK: test_vsqaddd_u64
266 ; CHECK: usqadd {{d[0-9]+}}, {{d[0-9]+}}
268 %vsqadd.i = insertelement <1 x i64> undef, i64 %a, i32 0
269 %vsqadd1.i = insertelement <1 x i64> undef, i64 %b, i32 0
270 %vsqadd2.i = call <1 x i64> @llvm.aarch64.neon.vsqadd.v1i64(<1 x i64> %vsqadd.i, <1 x i64> %vsqadd1.i)
271 %0 = extractelement <1 x i64> %vsqadd2.i, i32 0
275 declare <1 x i64> @llvm.aarch64.neon.vuqadd.v1i64(<1 x i64>, <1 x i64>)