]> git.ipfire.org Git - thirdparty/gcc.git/blob - gcc/config/aarch64/arm_fp16.h
Update copyright years.
[thirdparty/gcc.git] / gcc / config / aarch64 / arm_fp16.h
1 /* ARM FP16 scalar intrinsics include file.
2
3 Copyright (C) 2016-2021 Free Software Foundation, Inc.
4 Contributed by ARM Ltd.
5
6 This file is part of GCC.
7
8 GCC is free software; you can redistribute it and/or modify it
9 under the terms of the GNU General Public License as published
10 by the Free Software Foundation; either version 3, or (at your
11 option) any later version.
12
13 GCC is distributed in the hope that it will be useful, but WITHOUT
14 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
15 or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
16 License for more details.
17
18 Under Section 7 of GPL version 3, you are granted additional
19 permissions described in the GCC Runtime Library Exception, version
20 3.1, as published by the Free Software Foundation.
21
22 You should have received a copy of the GNU General Public License and
23 a copy of the GCC Runtime Library Exception along with this program;
24 see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
25 <http://www.gnu.org/licenses/>. */
26
27 #ifndef _AARCH64_FP16_H_
28 #define _AARCH64_FP16_H_
29
30 #include <stdint.h>
31
32 #pragma GCC push_options
33 #pragma GCC target ("arch=armv8.2-a+fp16")
34
35 typedef __fp16 float16_t;
36
37 /* ARMv8.2-A FP16 one operand scalar intrinsics. */
38
39 __extension__ static __inline float16_t __attribute__ ((__always_inline__))
40 vabsh_f16 (float16_t __a)
41 {
42 return __builtin_aarch64_abshf (__a);
43 }
44
45 __extension__ static __inline uint16_t __attribute__ ((__always_inline__))
46 vceqzh_f16 (float16_t __a)
47 {
48 return __builtin_aarch64_cmeqhf_uss (__a, 0.0f);
49 }
50
51 __extension__ static __inline uint16_t __attribute__ ((__always_inline__))
52 vcgezh_f16 (float16_t __a)
53 {
54 return __builtin_aarch64_cmgehf_uss (__a, 0.0f);
55 }
56
57 __extension__ static __inline uint16_t __attribute__ ((__always_inline__))
58 vcgtzh_f16 (float16_t __a)
59 {
60 return __builtin_aarch64_cmgthf_uss (__a, 0.0f);
61 }
62
63 __extension__ static __inline uint16_t __attribute__ ((__always_inline__))
64 vclezh_f16 (float16_t __a)
65 {
66 return __builtin_aarch64_cmlehf_uss (__a, 0.0f);
67 }
68
69 __extension__ static __inline uint16_t __attribute__ ((__always_inline__))
70 vcltzh_f16 (float16_t __a)
71 {
72 return __builtin_aarch64_cmlthf_uss (__a, 0.0f);
73 }
74
75 __extension__ static __inline float16_t __attribute__ ((__always_inline__))
76 vcvth_f16_s16 (int16_t __a)
77 {
78 return __builtin_aarch64_floathihf (__a);
79 }
80
81 __extension__ static __inline float16_t __attribute__ ((__always_inline__))
82 vcvth_f16_s32 (int32_t __a)
83 {
84 return __builtin_aarch64_floatsihf (__a);
85 }
86
87 __extension__ static __inline float16_t __attribute__ ((__always_inline__))
88 vcvth_f16_s64 (int64_t __a)
89 {
90 return __builtin_aarch64_floatdihf (__a);
91 }
92
93 __extension__ static __inline float16_t __attribute__ ((__always_inline__))
94 vcvth_f16_u16 (uint16_t __a)
95 {
96 return __builtin_aarch64_floatunshihf_us (__a);
97 }
98
99 __extension__ static __inline float16_t __attribute__ ((__always_inline__))
100 vcvth_f16_u32 (uint32_t __a)
101 {
102 return __builtin_aarch64_floatunssihf_us (__a);
103 }
104
105 __extension__ static __inline float16_t __attribute__ ((__always_inline__))
106 vcvth_f16_u64 (uint64_t __a)
107 {
108 return __builtin_aarch64_floatunsdihf_us (__a);
109 }
110
111 __extension__ static __inline int16_t __attribute__ ((__always_inline__))
112 vcvth_s16_f16 (float16_t __a)
113 {
114 return __builtin_aarch64_fix_trunchfhi (__a);
115 }
116
117 __extension__ static __inline int32_t __attribute__ ((__always_inline__))
118 vcvth_s32_f16 (float16_t __a)
119 {
120 return __builtin_aarch64_fix_trunchfsi (__a);
121 }
122
123 __extension__ static __inline int64_t __attribute__ ((__always_inline__))
124 vcvth_s64_f16 (float16_t __a)
125 {
126 return __builtin_aarch64_fix_trunchfdi (__a);
127 }
128
129 __extension__ static __inline uint16_t __attribute__ ((__always_inline__))
130 vcvth_u16_f16 (float16_t __a)
131 {
132 return __builtin_aarch64_fixuns_trunchfhi_us (__a);
133 }
134
135 __extension__ static __inline uint32_t __attribute__ ((__always_inline__))
136 vcvth_u32_f16 (float16_t __a)
137 {
138 return __builtin_aarch64_fixuns_trunchfsi_us (__a);
139 }
140
141 __extension__ static __inline uint64_t __attribute__ ((__always_inline__))
142 vcvth_u64_f16 (float16_t __a)
143 {
144 return __builtin_aarch64_fixuns_trunchfdi_us (__a);
145 }
146
147 __extension__ static __inline int16_t __attribute__ ((__always_inline__))
148 vcvtah_s16_f16 (float16_t __a)
149 {
150 return __builtin_aarch64_lroundhfhi (__a);
151 }
152
153 __extension__ static __inline int32_t __attribute__ ((__always_inline__))
154 vcvtah_s32_f16 (float16_t __a)
155 {
156 return __builtin_aarch64_lroundhfsi (__a);
157 }
158
159 __extension__ static __inline int64_t __attribute__ ((__always_inline__))
160 vcvtah_s64_f16 (float16_t __a)
161 {
162 return __builtin_aarch64_lroundhfdi (__a);
163 }
164
165 __extension__ static __inline uint16_t __attribute__ ((__always_inline__))
166 vcvtah_u16_f16 (float16_t __a)
167 {
168 return __builtin_aarch64_lrounduhfhi_us (__a);
169 }
170
171 __extension__ static __inline uint32_t __attribute__ ((__always_inline__))
172 vcvtah_u32_f16 (float16_t __a)
173 {
174 return __builtin_aarch64_lrounduhfsi_us (__a);
175 }
176
177 __extension__ static __inline uint64_t __attribute__ ((__always_inline__))
178 vcvtah_u64_f16 (float16_t __a)
179 {
180 return __builtin_aarch64_lrounduhfdi_us (__a);
181 }
182
183 __extension__ static __inline int16_t __attribute__ ((__always_inline__))
184 vcvtmh_s16_f16 (float16_t __a)
185 {
186 return __builtin_aarch64_lfloorhfhi (__a);
187 }
188
189 __extension__ static __inline int32_t __attribute__ ((__always_inline__))
190 vcvtmh_s32_f16 (float16_t __a)
191 {
192 return __builtin_aarch64_lfloorhfsi (__a);
193 }
194
195 __extension__ static __inline int64_t __attribute__ ((__always_inline__))
196 vcvtmh_s64_f16 (float16_t __a)
197 {
198 return __builtin_aarch64_lfloorhfdi (__a);
199 }
200
201 __extension__ static __inline uint16_t __attribute__ ((__always_inline__))
202 vcvtmh_u16_f16 (float16_t __a)
203 {
204 return __builtin_aarch64_lflooruhfhi_us (__a);
205 }
206
207 __extension__ static __inline uint32_t __attribute__ ((__always_inline__))
208 vcvtmh_u32_f16 (float16_t __a)
209 {
210 return __builtin_aarch64_lflooruhfsi_us (__a);
211 }
212
213 __extension__ static __inline uint64_t __attribute__ ((__always_inline__))
214 vcvtmh_u64_f16 (float16_t __a)
215 {
216 return __builtin_aarch64_lflooruhfdi_us (__a);
217 }
218
219 __extension__ static __inline int16_t __attribute__ ((__always_inline__))
220 vcvtnh_s16_f16 (float16_t __a)
221 {
222 return __builtin_aarch64_lfrintnhfhi (__a);
223 }
224
225 __extension__ static __inline int32_t __attribute__ ((__always_inline__))
226 vcvtnh_s32_f16 (float16_t __a)
227 {
228 return __builtin_aarch64_lfrintnhfsi (__a);
229 }
230
231 __extension__ static __inline int64_t __attribute__ ((__always_inline__))
232 vcvtnh_s64_f16 (float16_t __a)
233 {
234 return __builtin_aarch64_lfrintnhfdi (__a);
235 }
236
237 __extension__ static __inline uint16_t __attribute__ ((__always_inline__))
238 vcvtnh_u16_f16 (float16_t __a)
239 {
240 return __builtin_aarch64_lfrintnuhfhi_us (__a);
241 }
242
243 __extension__ static __inline uint32_t __attribute__ ((__always_inline__))
244 vcvtnh_u32_f16 (float16_t __a)
245 {
246 return __builtin_aarch64_lfrintnuhfsi_us (__a);
247 }
248
249 __extension__ static __inline uint64_t __attribute__ ((__always_inline__))
250 vcvtnh_u64_f16 (float16_t __a)
251 {
252 return __builtin_aarch64_lfrintnuhfdi_us (__a);
253 }
254
255 __extension__ static __inline int16_t __attribute__ ((__always_inline__))
256 vcvtph_s16_f16 (float16_t __a)
257 {
258 return __builtin_aarch64_lceilhfhi (__a);
259 }
260
261 __extension__ static __inline int32_t __attribute__ ((__always_inline__))
262 vcvtph_s32_f16 (float16_t __a)
263 {
264 return __builtin_aarch64_lceilhfsi (__a);
265 }
266
267 __extension__ static __inline int64_t __attribute__ ((__always_inline__))
268 vcvtph_s64_f16 (float16_t __a)
269 {
270 return __builtin_aarch64_lceilhfdi (__a);
271 }
272
273 __extension__ static __inline uint16_t __attribute__ ((__always_inline__))
274 vcvtph_u16_f16 (float16_t __a)
275 {
276 return __builtin_aarch64_lceiluhfhi_us (__a);
277 }
278
279 __extension__ static __inline uint32_t __attribute__ ((__always_inline__))
280 vcvtph_u32_f16 (float16_t __a)
281 {
282 return __builtin_aarch64_lceiluhfsi_us (__a);
283 }
284
285 __extension__ static __inline uint64_t __attribute__ ((__always_inline__))
286 vcvtph_u64_f16 (float16_t __a)
287 {
288 return __builtin_aarch64_lceiluhfdi_us (__a);
289 }
290
291 __extension__ static __inline float16_t __attribute__ ((__always_inline__))
292 vnegh_f16 (float16_t __a)
293 {
294 return __builtin_aarch64_neghf (__a);
295 }
296
297 __extension__ static __inline float16_t __attribute__ ((__always_inline__))
298 vrecpeh_f16 (float16_t __a)
299 {
300 return __builtin_aarch64_frecpehf (__a);
301 }
302
303 __extension__ static __inline float16_t __attribute__ ((__always_inline__))
304 vrecpxh_f16 (float16_t __a)
305 {
306 return __builtin_aarch64_frecpxhf (__a);
307 }
308
309 __extension__ static __inline float16_t __attribute__ ((__always_inline__))
310 vrndh_f16 (float16_t __a)
311 {
312 return __builtin_aarch64_btrunchf (__a);
313 }
314
315 __extension__ static __inline float16_t __attribute__ ((__always_inline__))
316 vrndah_f16 (float16_t __a)
317 {
318 return __builtin_aarch64_roundhf (__a);
319 }
320
321 __extension__ static __inline float16_t __attribute__ ((__always_inline__))
322 vrndih_f16 (float16_t __a)
323 {
324 return __builtin_aarch64_nearbyinthf (__a);
325 }
326
327 __extension__ static __inline float16_t __attribute__ ((__always_inline__))
328 vrndmh_f16 (float16_t __a)
329 {
330 return __builtin_aarch64_floorhf (__a);
331 }
332
333 __extension__ static __inline float16_t __attribute__ ((__always_inline__))
334 vrndnh_f16 (float16_t __a)
335 {
336 return __builtin_aarch64_frintnhf (__a);
337 }
338
339 __extension__ static __inline float16_t __attribute__ ((__always_inline__))
340 vrndph_f16 (float16_t __a)
341 {
342 return __builtin_aarch64_ceilhf (__a);
343 }
344
345 __extension__ static __inline float16_t __attribute__ ((__always_inline__))
346 vrndxh_f16 (float16_t __a)
347 {
348 return __builtin_aarch64_rinthf (__a);
349 }
350
351 __extension__ static __inline float16_t __attribute__ ((__always_inline__))
352 vrsqrteh_f16 (float16_t __a)
353 {
354 return __builtin_aarch64_rsqrtehf (__a);
355 }
356
357 __extension__ static __inline float16_t __attribute__ ((__always_inline__))
358 vsqrth_f16 (float16_t __a)
359 {
360 return __builtin_aarch64_sqrthf (__a);
361 }
362
363 /* ARMv8.2-A FP16 two operands scalar intrinsics. */
364
365 __extension__ static __inline float16_t __attribute__ ((__always_inline__))
366 vaddh_f16 (float16_t __a, float16_t __b)
367 {
368 return __a + __b;
369 }
370
371 __extension__ static __inline float16_t __attribute__ ((__always_inline__))
372 vabdh_f16 (float16_t __a, float16_t __b)
373 {
374 return __builtin_aarch64_fabdhf (__a, __b);
375 }
376
377 __extension__ static __inline uint16_t __attribute__ ((__always_inline__))
378 vcageh_f16 (float16_t __a, float16_t __b)
379 {
380 return __builtin_aarch64_facgehf_uss (__a, __b);
381 }
382
383 __extension__ static __inline uint16_t __attribute__ ((__always_inline__))
384 vcagth_f16 (float16_t __a, float16_t __b)
385 {
386 return __builtin_aarch64_facgthf_uss (__a, __b);
387 }
388
389 __extension__ static __inline uint16_t __attribute__ ((__always_inline__))
390 vcaleh_f16 (float16_t __a, float16_t __b)
391 {
392 return __builtin_aarch64_faclehf_uss (__a, __b);
393 }
394
395 __extension__ static __inline uint16_t __attribute__ ((__always_inline__))
396 vcalth_f16 (float16_t __a, float16_t __b)
397 {
398 return __builtin_aarch64_faclthf_uss (__a, __b);
399 }
400
401 __extension__ static __inline uint16_t __attribute__ ((__always_inline__))
402 vceqh_f16 (float16_t __a, float16_t __b)
403 {
404 return __builtin_aarch64_cmeqhf_uss (__a, __b);
405 }
406
407 __extension__ static __inline uint16_t __attribute__ ((__always_inline__))
408 vcgeh_f16 (float16_t __a, float16_t __b)
409 {
410 return __builtin_aarch64_cmgehf_uss (__a, __b);
411 }
412
413 __extension__ static __inline uint16_t __attribute__ ((__always_inline__))
414 vcgth_f16 (float16_t __a, float16_t __b)
415 {
416 return __builtin_aarch64_cmgthf_uss (__a, __b);
417 }
418
419 __extension__ static __inline uint16_t __attribute__ ((__always_inline__))
420 vcleh_f16 (float16_t __a, float16_t __b)
421 {
422 return __builtin_aarch64_cmlehf_uss (__a, __b);
423 }
424
425 __extension__ static __inline uint16_t __attribute__ ((__always_inline__))
426 vclth_f16 (float16_t __a, float16_t __b)
427 {
428 return __builtin_aarch64_cmlthf_uss (__a, __b);
429 }
430
431 __extension__ static __inline float16_t __attribute__ ((__always_inline__))
432 vcvth_n_f16_s16 (int16_t __a, const int __b)
433 {
434 return __builtin_aarch64_scvtfhi (__a, __b);
435 }
436
437 __extension__ static __inline float16_t __attribute__ ((__always_inline__))
438 vcvth_n_f16_s32 (int32_t __a, const int __b)
439 {
440 return __builtin_aarch64_scvtfsihf (__a, __b);
441 }
442
443 __extension__ static __inline float16_t __attribute__ ((__always_inline__))
444 vcvth_n_f16_s64 (int64_t __a, const int __b)
445 {
446 return __builtin_aarch64_scvtfdihf (__a, __b);
447 }
448
449 __extension__ static __inline float16_t __attribute__ ((__always_inline__))
450 vcvth_n_f16_u16 (uint16_t __a, const int __b)
451 {
452 return __builtin_aarch64_ucvtfhi_sus (__a, __b);
453 }
454
455 __extension__ static __inline float16_t __attribute__ ((__always_inline__))
456 vcvth_n_f16_u32 (uint32_t __a, const int __b)
457 {
458 return __builtin_aarch64_ucvtfsihf_sus (__a, __b);
459 }
460
461 __extension__ static __inline float16_t __attribute__ ((__always_inline__))
462 vcvth_n_f16_u64 (uint64_t __a, const int __b)
463 {
464 return __builtin_aarch64_ucvtfdihf_sus (__a, __b);
465 }
466
467 __extension__ static __inline int16_t __attribute__ ((__always_inline__))
468 vcvth_n_s16_f16 (float16_t __a, const int __b)
469 {
470 return __builtin_aarch64_fcvtzshf (__a, __b);
471 }
472
473 __extension__ static __inline int32_t __attribute__ ((__always_inline__))
474 vcvth_n_s32_f16 (float16_t __a, const int __b)
475 {
476 return __builtin_aarch64_fcvtzshfsi (__a, __b);
477 }
478
479 __extension__ static __inline int64_t __attribute__ ((__always_inline__))
480 vcvth_n_s64_f16 (float16_t __a, const int __b)
481 {
482 return __builtin_aarch64_fcvtzshfdi (__a, __b);
483 }
484
485 __extension__ static __inline uint16_t __attribute__ ((__always_inline__))
486 vcvth_n_u16_f16 (float16_t __a, const int __b)
487 {
488 return __builtin_aarch64_fcvtzuhf_uss (__a, __b);
489 }
490
491 __extension__ static __inline uint32_t __attribute__ ((__always_inline__))
492 vcvth_n_u32_f16 (float16_t __a, const int __b)
493 {
494 return __builtin_aarch64_fcvtzuhfsi_uss (__a, __b);
495 }
496
497 __extension__ static __inline uint64_t __attribute__ ((__always_inline__))
498 vcvth_n_u64_f16 (float16_t __a, const int __b)
499 {
500 return __builtin_aarch64_fcvtzuhfdi_uss (__a, __b);
501 }
502
503 __extension__ static __inline float16_t __attribute__ ((__always_inline__))
504 vdivh_f16 (float16_t __a, float16_t __b)
505 {
506 return __a / __b;
507 }
508
509 __extension__ static __inline float16_t __attribute__ ((__always_inline__))
510 vmaxh_f16 (float16_t __a, float16_t __b)
511 {
512 return __builtin_aarch64_fmaxhf (__a, __b);
513 }
514
515 __extension__ static __inline float16_t __attribute__ ((__always_inline__))
516 vmaxnmh_f16 (float16_t __a, float16_t __b)
517 {
518 return __builtin_aarch64_fmaxhf (__a, __b);
519 }
520
521 __extension__ static __inline float16_t __attribute__ ((__always_inline__))
522 vminh_f16 (float16_t __a, float16_t __b)
523 {
524 return __builtin_aarch64_fminhf (__a, __b);
525 }
526
527 __extension__ static __inline float16_t __attribute__ ((__always_inline__))
528 vminnmh_f16 (float16_t __a, float16_t __b)
529 {
530 return __builtin_aarch64_fminhf (__a, __b);
531 }
532
533 __extension__ static __inline float16_t __attribute__ ((__always_inline__))
534 vmulh_f16 (float16_t __a, float16_t __b)
535 {
536 return __a * __b;
537 }
538
539 __extension__ static __inline float16_t __attribute__ ((__always_inline__))
540 vmulxh_f16 (float16_t __a, float16_t __b)
541 {
542 return __builtin_aarch64_fmulxhf (__a, __b);
543 }
544
545 __extension__ static __inline float16_t __attribute__ ((__always_inline__))
546 vrecpsh_f16 (float16_t __a, float16_t __b)
547 {
548 return __builtin_aarch64_frecpshf (__a, __b);
549 }
550
551 __extension__ static __inline float16_t __attribute__ ((__always_inline__))
552 vrsqrtsh_f16 (float16_t __a, float16_t __b)
553 {
554 return __builtin_aarch64_rsqrtshf (__a, __b);
555 }
556
557 __extension__ static __inline float16_t __attribute__ ((__always_inline__))
558 vsubh_f16 (float16_t __a, float16_t __b)
559 {
560 return __a - __b;
561 }
562
563 /* ARMv8.2-A FP16 three operands scalar intrinsics. */
564
565 __extension__ static __inline float16_t __attribute__ ((__always_inline__))
566 vfmah_f16 (float16_t __a, float16_t __b, float16_t __c)
567 {
568 return __builtin_aarch64_fmahf (__b, __c, __a);
569 }
570
571 __extension__ static __inline float16_t __attribute__ ((__always_inline__))
572 vfmsh_f16 (float16_t __a, float16_t __b, float16_t __c)
573 {
574 return __builtin_aarch64_fnmahf (__b, __c, __a);
575 }
576
577 #pragma GCC pop_options
578
579 #endif