[InstCombine] Signed saturation patterns
[llvm-core.git] / test / CodeGen / AArch64 / fp16_intrinsic_scalar_1op.ll
blobc8333b253ec42010e1eee65f28e883718a2d27f4
1 ; RUN: llc < %s -mtriple=aarch64-eabi -mattr=+v8.2a,+fullfp16  | FileCheck %s
3 declare i64 @llvm.aarch64.neon.fcvtpu.i64.f16(half)
4 declare i32 @llvm.aarch64.neon.fcvtpu.i32.f16(half)
5 declare i64 @llvm.aarch64.neon.fcvtps.i64.f16(half)
6 declare i32 @llvm.aarch64.neon.fcvtps.i32.f16(half)
7 declare i64 @llvm.aarch64.neon.fcvtnu.i64.f16(half)
8 declare i32 @llvm.aarch64.neon.fcvtnu.i32.f16(half)
9 declare i64 @llvm.aarch64.neon.fcvtns.i64.f16(half)
10 declare i32 @llvm.aarch64.neon.fcvtns.i32.f16(half)
11 declare i64 @llvm.aarch64.neon.fcvtmu.i64.f16(half)
12 declare i32 @llvm.aarch64.neon.fcvtmu.i32.f16(half)
13 declare i64 @llvm.aarch64.neon.fcvtms.i64.f16(half)
14 declare i32 @llvm.aarch64.neon.fcvtms.i32.f16(half)
15 declare i64 @llvm.aarch64.neon.fcvtau.i64.f16(half)
16 declare i32 @llvm.aarch64.neon.fcvtau.i32.f16(half)
17 declare i64 @llvm.aarch64.neon.fcvtas.i64.f16(half)
18 declare i32 @llvm.aarch64.neon.fcvtas.i32.f16(half)
19 declare half @llvm.aarch64.neon.frsqrte.f16(half)
20 declare half @llvm.aarch64.neon.frecpx.f16(half)
21 declare half @llvm.aarch64.neon.frecpe.f16(half)
23 define dso_local i16 @t2(half %a) {
24 ; CHECK-LABEL: t2:
25 ; CHECK:         fcmp h0, #0.0
26 ; CHECK-NEXT:    csetm w0, eq
27 ; CHECK-NEXT:    ret
28 entry:
29   %0 = fcmp oeq half %a, 0xH0000
30   %vceqz = sext i1 %0 to i16
31   ret i16 %vceqz
34 define dso_local i16 @t3(half %a) {
35 ; CHECK-LABEL: t3:
36 ; CHECK:         fcmp h0, #0.0
37 ; CHECK-NEXT:    csetm w0, ge
38 ; CHECK-NEXT:    ret
39 entry:
40   %0 = fcmp oge half %a, 0xH0000
41   %vcgez = sext i1 %0 to i16
42   ret i16 %vcgez
45 define dso_local i16 @t4(half %a) {
46 ; CHECK-LABEL: t4:
47 ; CHECK:         fcmp h0, #0.0
48 ; CHECK-NEXT:    csetm w0, gt
49 ; CHECK-NEXT:    ret
50 entry:
51   %0 = fcmp ogt half %a, 0xH0000
52   %vcgtz = sext i1 %0 to i16
53   ret i16 %vcgtz
56 define dso_local i16 @t5(half %a) {
57 ; CHECK-LABEL: t5:
58 ; CHECK:         fcmp h0, #0.0
59 ; CHECK-NEXT:    csetm w0, ls
60 ; CHECK-NEXT:    ret
61 entry:
62   %0 = fcmp ole half %a, 0xH0000
63   %vclez = sext i1 %0 to i16
64   ret i16 %vclez
67 define dso_local i16 @t6(half %a) {
68 ; CHECK-LABEL: t6:
69 ; CHECK:         fcmp h0, #0.0
70 ; CHECK-NEXT:    csetm w0, mi
71 ; CHECK-NEXT:    ret
72 entry:
73   %0 = fcmp olt half %a, 0xH0000
74   %vcltz = sext i1 %0 to i16
75   ret i16 %vcltz
78 define dso_local half @t8(i32 %a) {
79 ; CHECK-LABEL: t8:
80 ; CHECK:         scvtf h0, w0
81 ; CHECK-NEXT:    ret
82 entry:
83   %0 = sitofp i32 %a to half
84   ret half %0
87 define dso_local half @t9(i64 %a) {
88 ; CHECK-LABEL: t9:
89 ; CHECK:         scvtf h0, x0
90 ; CHECK-NEXT:    ret
91 entry:
92   %0 = sitofp i64 %a to half
93   ret half %0
96 define dso_local half @t12(i64 %a) {
97 ; CHECK-LABEL: t12:
98 ; CHECK:         ucvtf h0, x0
99 ; CHECK-NEXT:    ret
100 entry:
101   %0 = uitofp i64 %a to half
102   ret half %0
105 define dso_local i16 @t13(half %a) {
106 ; CHECK-LABEL: t13:
107 ; CHECK:         fcvtzs w0, h0
108 ; CHECK-NEXT:    ret
109 entry:
110   %0 = fptosi half %a to i16
111   ret i16 %0
114 define dso_local i64 @t15(half %a) {
115 ; CHECK-LABEL: t15:
116 ; CHECK:         fcvtzs x0, h0
117 ; CHECK-NEXT:    ret
118 entry:
119   %0 = fptosi half %a to i64
120   ret i64 %0
123 define dso_local i16 @t16(half %a) {
124 ; CHECK-LABEL: t16:
125 ; CHECK:         fcvtzs w0, h0
126 ; CHECK-NEXT:    ret
127 entry:
128   %0 = fptoui half %a to i16
129   ret i16 %0
132 define dso_local i64 @t18(half %a) {
133 ; CHECK-LABEL: t18:
134 ; CHECK:         fcvtzu x0, h0
135 ; CHECK-NEXT:    ret
136 entry:
137   %0 = fptoui half %a to i64
138   ret i64 %0
141 define dso_local i16 @t19(half %a) {
142 ; CHECK-LABEL: t19:
143 ; CHECK:         fcvtas w0, h0
144 ; CHECK-NEXT:    ret
145 entry:
146   %fcvt = tail call i32 @llvm.aarch64.neon.fcvtas.i32.f16(half %a)
147   %0 = trunc i32 %fcvt to i16
148   ret i16 %0
151 define dso_local i64 @t21(half %a) {
152 ; CHECK-LABEL: t21:
153 ; CHECK:         fcvtas x0, h0
154 ; CHECK-NEXT:    ret
155 entry:
156   %vcvtah_s64_f16 = tail call i64 @llvm.aarch64.neon.fcvtas.i64.f16(half %a)
157   ret i64 %vcvtah_s64_f16
160 define dso_local i16 @t22(half %a) {
161 ; CHECK-LABEL: t22:
162 ; CHECK:         fcvtau w0, h0
163 ; CHECK-NEXT:    ret
164 entry:
165   %fcvt = tail call i32 @llvm.aarch64.neon.fcvtau.i32.f16(half %a)
166   %0 = trunc i32 %fcvt to i16
167   ret i16 %0
170 define dso_local i64 @t24(half %a) {
171 ; CHECK-LABEL: t24:
172 ; CHECK:         fcvtau x0, h0
173 ; CHECK-NEXT:    ret
174 entry:
175   %vcvtah_u64_f16 = tail call i64 @llvm.aarch64.neon.fcvtau.i64.f16(half %a)
176   ret i64 %vcvtah_u64_f16
179 define dso_local i16 @t25(half %a) {
180 ; CHECK-LABEL: t25:
181 ; CHECK:         fcvtms w0, h0
182 ; CHECK-NEXT:    ret
183 entry:
184   %fcvt = tail call i32 @llvm.aarch64.neon.fcvtms.i32.f16(half %a)
185   %0 = trunc i32 %fcvt to i16
186   ret i16 %0
189 define dso_local i64 @t27(half %a) {
190 ; CHECK-LABEL: t27:
191 ; CHECK:         fcvtms x0, h0
192 ; CHECK-NEXT:    ret
193 entry:
194   %vcvtmh_s64_f16 = tail call i64 @llvm.aarch64.neon.fcvtms.i64.f16(half %a)
195   ret i64 %vcvtmh_s64_f16
198 define dso_local i16 @t28(half %a) {
199 ; CHECK-LABEL: t28:
200 ; CHECK:         fcvtmu w0, h0
201 ; CHECK-NEXT:    ret
202 entry:
203   %fcvt = tail call i32 @llvm.aarch64.neon.fcvtmu.i32.f16(half %a)
204   %0 = trunc i32 %fcvt to i16
205   ret i16 %0
208 define dso_local i64 @t30(half %a) {
209 ; CHECK-LABEL: t30:
210 ; CHECK:         fcvtmu x0, h0
211 ; CHECK-NEXT:    ret
212 entry:
213   %vcvtmh_u64_f16 = tail call i64 @llvm.aarch64.neon.fcvtmu.i64.f16(half %a)
214   ret i64 %vcvtmh_u64_f16
217 define dso_local i16 @t31(half %a) {
218 ; CHECK-LABEL: t31:
219 ; CHECK:         fcvtns w0, h0
220 ; CHECK-NEXT:    ret
221 entry:
222   %fcvt = tail call i32 @llvm.aarch64.neon.fcvtns.i32.f16(half %a)
223   %0 = trunc i32 %fcvt to i16
224   ret i16 %0
227 define dso_local i64 @t33(half %a) {
228 ; CHECK-LABEL: t33:
229 ; CHECK:         fcvtns x0, h0
230 ; CHECK-NEXT:    ret
231 entry:
232   %vcvtnh_s64_f16 = tail call i64 @llvm.aarch64.neon.fcvtns.i64.f16(half %a)
233   ret i64 %vcvtnh_s64_f16
236 define dso_local i16 @t34(half %a) {
237 ; CHECK-LABEL: t34:
238 ; CHECK:         fcvtnu w0, h0
239 ; CHECK-NEXT:    ret
240 entry:
241   %fcvt = tail call i32 @llvm.aarch64.neon.fcvtnu.i32.f16(half %a)
242   %0 = trunc i32 %fcvt to i16
243   ret i16 %0
246 define dso_local i64 @t36(half %a) {
247 ; CHECK-LABEL: t36:
248 ; CHECK:         fcvtnu x0, h0
249 ; CHECK-NEXT:    ret
250 entry:
251   %vcvtnh_u64_f16 = tail call i64 @llvm.aarch64.neon.fcvtnu.i64.f16(half %a)
252   ret i64 %vcvtnh_u64_f16
255 define dso_local i16 @t37(half %a) {
256 ; CHECK-LABEL: t37:
257 ; CHECK:         fcvtps w0, h0
258 ; CHECK-NEXT:    ret
259 entry:
260   %fcvt = tail call i32 @llvm.aarch64.neon.fcvtps.i32.f16(half %a)
261   %0 = trunc i32 %fcvt to i16
262   ret i16 %0
265 define dso_local i64 @t39(half %a) {
266 ; CHECK-LABEL: t39:
267 ; CHECK:         fcvtps x0, h0
268 ; CHECK-NEXT:    ret
269 entry:
270   %vcvtph_s64_f16 = tail call i64 @llvm.aarch64.neon.fcvtps.i64.f16(half %a)
271   ret i64 %vcvtph_s64_f16
274 define dso_local i16 @t40(half %a) {
275 ; CHECK-LABEL: t40:
276 ; CHECK:         fcvtpu w0, h0
277 ; CHECK-NEXT:    ret
278 entry:
279   %fcvt = tail call i32 @llvm.aarch64.neon.fcvtpu.i32.f16(half %a)
280   %0 = trunc i32 %fcvt to i16
281   ret i16 %0
284 define dso_local i64 @t42(half %a) {
285 ; CHECK-LABEL: t42:
286 ; CHECK:         fcvtpu x0, h0
287 ; CHECK-NEXT:    ret
288 entry:
289   %vcvtph_u64_f16 = tail call i64 @llvm.aarch64.neon.fcvtpu.i64.f16(half %a)
290   ret i64 %vcvtph_u64_f16
293 define dso_local half @t44(half %a) {
294 ; CHECK-LABEL: t44:
295 ; CHECK:         frecpe h0, h0
296 ; CHECK-NEXT:    ret
297 entry:
298   %vrecpeh_f16 = tail call half @llvm.aarch64.neon.frecpe.f16(half %a)
299   ret half %vrecpeh_f16
302 define dso_local half @t45(half %a) {
303 ; CHECK-LABEL: t45:
304 ; CHECK:         frecpx h0, h0
305 ; CHECK-NEXT:    ret
306 entry:
307   %vrecpxh_f16 = tail call half @llvm.aarch64.neon.frecpx.f16(half %a)
308   ret half %vrecpxh_f16
311 define dso_local half @t53(half %a) {
312 ; CHECK-LABEL: t53:
313 ; CHECK:         frsqrte h0, h0
314 ; CHECK-NEXT:    ret
315 entry:
316   %vrsqrteh_f16 = tail call half @llvm.aarch64.neon.frsqrte.f16(half %a)
317   ret half %vrsqrteh_f16