[AArch64] Add support for NEON scalar floating-point compare instructions.
[oota-llvm.git] / test / CodeGen / AArch64 / neon-scalar-saturating-add-sub.ll
1 ; RUN: llc -mtriple=aarch64-none-linux-gnu -mattr=+neon < %s | FileCheck %s
2
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>)
5
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
10   ret <1 x i64> %tmp1
11 }
12
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
17   ret <1 x i64> %tmp1
18 }
19
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>)
22
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
27   ret <1 x i64> %tmp1
28 }
29
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
34   ret <1 x i64> %tmp1
35 }
36
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>)
39
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]+}}
44   ret <1 x i8> %tmp1
45 }
46
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]+}}
51   ret <1 x i8> %tmp1
52 }
53
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>)
56
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]+}}
61   ret <1 x i8> %tmp1
62 }
63
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]+}}
68   ret <1 x i8> %tmp1
69 }
70
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>)
73
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]+}}
78   ret <1 x i16> %tmp1
79 }
80
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]+}}
85   ret <1 x i16> %tmp1
86 }
87
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>)
90
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]+}}
95   ret <1 x i16> %tmp1
96 }
97
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]+}}
102   ret <1 x i16> %tmp1
103 }
104
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>)
107
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]+}}
112   ret <1 x i32> %tmp1
113 }
114
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]+}}
119   ret <1 x i32> %tmp1
120 }
121
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>)
124
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]+}}
129   ret <1 x i32> %tmp1
130 }
131
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]+}}
136   ret <1 x i32> %tmp1
137 }
138
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>)
141
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]+}}
146   ret <1 x i64> %tmp1
147 }
148
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]+}}
153   ret <1 x i64> %tmp1
154 }
155
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>)
158
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]+}}
163   ret <1 x i64> %tmp1
164 }
165
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]+}}
170   ret <1 x i64> %tmp1
171 }
172
173 define i8 @test_vuqaddb_s8(i8 %a, i8 %b) {
174 ; CHECK: test_vuqaddb_s8
175 ; CHECK: suqadd {{b[0-9]+}}, {{b[0-9]+}}
176 entry:
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
181   ret i8 %0
182 }
183
184 declare <1 x i8> @llvm.aarch64.neon.vsqadd.v1i8(<1 x i8>, <1 x i8>)
185
186 define i16 @test_vuqaddh_s16(i16 %a, i16 %b) {
187 ; CHECK: test_vuqaddh_s16
188 ; CHECK: suqadd {{h[0-9]+}}, {{h[0-9]+}}
189 entry:
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
194   ret i16 %0
195 }
196
197 declare <1 x i16> @llvm.aarch64.neon.vsqadd.v1i16(<1 x i16>, <1 x i16>)
198
199 define i32 @test_vuqadds_s32(i32 %a, i32 %b) {
200 ; CHECK: test_vuqadds_s32
201 ; CHECK: suqadd {{s[0-9]+}}, {{s[0-9]+}}
202 entry:
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
207   ret i32 %0
208 }
209
210 declare <1 x i32> @llvm.aarch64.neon.vsqadd.v1i32(<1 x i32>, <1 x i32>)
211
212 define i64 @test_vuqaddd_s64(i64 %a, i64 %b) {
213 ; CHECK: test_vuqaddd_s64
214 ; CHECK: suqadd {{d[0-9]+}}, {{d[0-9]+}}
215 entry:
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
220   ret i64 %0
221 }
222
223 declare <1 x i64> @llvm.aarch64.neon.vsqadd.v1i64(<1 x i64>, <1 x i64>)
224
225 define i8 @test_vsqaddb_u8(i8 %a, i8 %b) {
226 ; CHECK: test_vsqaddb_u8
227 ; CHECK: usqadd {{b[0-9]+}}, {{b[0-9]+}}
228 entry:
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
233   ret i8 %0
234 }
235
236 declare <1 x i8> @llvm.aarch64.neon.vuqadd.v1i8(<1 x i8>, <1 x i8>)
237
238 define i16 @test_vsqaddh_u16(i16 %a, i16 %b) {
239 ; CHECK: test_vsqaddh_u16
240 ; CHECK: usqadd {{h[0-9]+}}, {{h[0-9]+}}
241 entry:
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
246   ret i16 %0
247 }
248
249 declare <1 x i16> @llvm.aarch64.neon.vuqadd.v1i16(<1 x i16>, <1 x i16>)
250
251 define i32 @test_vsqadds_u32(i32 %a, i32 %b) {
252 ; CHECK: test_vsqadds_u32
253 ; CHECK: usqadd {{s[0-9]+}}, {{s[0-9]+}}
254 entry:
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
259   ret i32 %0
260 }
261
262 declare <1 x i32> @llvm.aarch64.neon.vuqadd.v1i32(<1 x i32>, <1 x i32>)
263
264 define i64 @test_vsqaddd_u64(i64 %a, i64 %b) {
265 ; CHECK: test_vsqaddd_u64
266 ; CHECK: usqadd {{d[0-9]+}}, {{d[0-9]+}}
267 entry:
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
272   ret i64 %0
273 }
274
275 declare <1 x i64> @llvm.aarch64.neon.vuqadd.v1i64(<1 x i64>, <1 x i64>)