]> git.ipfire.org Git - thirdparty/gcc.git/blob - gcc/config/aarch64/arm_fp16.h
c10f9dcf7e097ded1740955addcd73348649dc56
[thirdparty/gcc.git] / gcc / config / aarch64 / arm_fp16.h
1 /* ARM FP16 scalar intrinsics include file.
2
3 Copyright (C) 2016-2023 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 ("+nothing+fp16")
34
35 typedef __fp16 float16_t;
36
37 /* ARMv8.2-A FP16 one operand scalar intrinsics. */
38
39 __extension__ extern __inline float16_t
40 __attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
41 vabsh_f16 (float16_t __a)
42 {
43 return __builtin_aarch64_abshf (__a);
44 }
45
46 __extension__ extern __inline uint16_t
47 __attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
48 vceqzh_f16 (float16_t __a)
49 {
50 return __builtin_aarch64_cmeqhf_uss (__a, 0.0f);
51 }
52
53 __extension__ extern __inline uint16_t
54 __attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
55 vcgezh_f16 (float16_t __a)
56 {
57 return __builtin_aarch64_cmgehf_uss (__a, 0.0f);
58 }
59
60 __extension__ extern __inline uint16_t
61 __attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
62 vcgtzh_f16 (float16_t __a)
63 {
64 return __builtin_aarch64_cmgthf_uss (__a, 0.0f);
65 }
66
67 __extension__ extern __inline uint16_t
68 __attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
69 vclezh_f16 (float16_t __a)
70 {
71 return __builtin_aarch64_cmlehf_uss (__a, 0.0f);
72 }
73
74 __extension__ extern __inline uint16_t
75 __attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
76 vcltzh_f16 (float16_t __a)
77 {
78 return __builtin_aarch64_cmlthf_uss (__a, 0.0f);
79 }
80
81 __extension__ extern __inline float16_t
82 __attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
83 vcvth_f16_s16 (int16_t __a)
84 {
85 return __builtin_aarch64_floathihf (__a);
86 }
87
88 __extension__ extern __inline float16_t
89 __attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
90 vcvth_f16_s32 (int32_t __a)
91 {
92 return __builtin_aarch64_floatsihf (__a);
93 }
94
95 __extension__ extern __inline float16_t
96 __attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
97 vcvth_f16_s64 (int64_t __a)
98 {
99 return __builtin_aarch64_floatdihf (__a);
100 }
101
102 __extension__ extern __inline float16_t
103 __attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
104 vcvth_f16_u16 (uint16_t __a)
105 {
106 return __builtin_aarch64_floatunshihf_us (__a);
107 }
108
109 __extension__ extern __inline float16_t
110 __attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
111 vcvth_f16_u32 (uint32_t __a)
112 {
113 return __builtin_aarch64_floatunssihf_us (__a);
114 }
115
116 __extension__ extern __inline float16_t
117 __attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
118 vcvth_f16_u64 (uint64_t __a)
119 {
120 return __builtin_aarch64_floatunsdihf_us (__a);
121 }
122
123 __extension__ extern __inline int16_t
124 __attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
125 vcvth_s16_f16 (float16_t __a)
126 {
127 return __builtin_aarch64_fix_trunchfhi (__a);
128 }
129
130 __extension__ extern __inline int32_t
131 __attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
132 vcvth_s32_f16 (float16_t __a)
133 {
134 return __builtin_aarch64_fix_trunchfsi (__a);
135 }
136
137 __extension__ extern __inline int64_t
138 __attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
139 vcvth_s64_f16 (float16_t __a)
140 {
141 return __builtin_aarch64_fix_trunchfdi (__a);
142 }
143
144 __extension__ extern __inline uint16_t
145 __attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
146 vcvth_u16_f16 (float16_t __a)
147 {
148 return __builtin_aarch64_fixuns_trunchfhi_us (__a);
149 }
150
151 __extension__ extern __inline uint32_t
152 __attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
153 vcvth_u32_f16 (float16_t __a)
154 {
155 return __builtin_aarch64_fixuns_trunchfsi_us (__a);
156 }
157
158 __extension__ extern __inline uint64_t
159 __attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
160 vcvth_u64_f16 (float16_t __a)
161 {
162 return __builtin_aarch64_fixuns_trunchfdi_us (__a);
163 }
164
165 __extension__ extern __inline int16_t
166 __attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
167 vcvtah_s16_f16 (float16_t __a)
168 {
169 return __builtin_aarch64_lroundhfhi (__a);
170 }
171
172 __extension__ extern __inline int32_t
173 __attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
174 vcvtah_s32_f16 (float16_t __a)
175 {
176 return __builtin_aarch64_lroundhfsi (__a);
177 }
178
179 __extension__ extern __inline int64_t
180 __attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
181 vcvtah_s64_f16 (float16_t __a)
182 {
183 return __builtin_aarch64_lroundhfdi (__a);
184 }
185
186 __extension__ extern __inline uint16_t
187 __attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
188 vcvtah_u16_f16 (float16_t __a)
189 {
190 return __builtin_aarch64_lrounduhfhi_us (__a);
191 }
192
193 __extension__ extern __inline uint32_t
194 __attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
195 vcvtah_u32_f16 (float16_t __a)
196 {
197 return __builtin_aarch64_lrounduhfsi_us (__a);
198 }
199
200 __extension__ extern __inline uint64_t
201 __attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
202 vcvtah_u64_f16 (float16_t __a)
203 {
204 return __builtin_aarch64_lrounduhfdi_us (__a);
205 }
206
207 __extension__ extern __inline int16_t
208 __attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
209 vcvtmh_s16_f16 (float16_t __a)
210 {
211 return __builtin_aarch64_lfloorhfhi (__a);
212 }
213
214 __extension__ extern __inline int32_t
215 __attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
216 vcvtmh_s32_f16 (float16_t __a)
217 {
218 return __builtin_aarch64_lfloorhfsi (__a);
219 }
220
221 __extension__ extern __inline int64_t
222 __attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
223 vcvtmh_s64_f16 (float16_t __a)
224 {
225 return __builtin_aarch64_lfloorhfdi (__a);
226 }
227
228 __extension__ extern __inline uint16_t
229 __attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
230 vcvtmh_u16_f16 (float16_t __a)
231 {
232 return __builtin_aarch64_lflooruhfhi_us (__a);
233 }
234
235 __extension__ extern __inline uint32_t
236 __attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
237 vcvtmh_u32_f16 (float16_t __a)
238 {
239 return __builtin_aarch64_lflooruhfsi_us (__a);
240 }
241
242 __extension__ extern __inline uint64_t
243 __attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
244 vcvtmh_u64_f16 (float16_t __a)
245 {
246 return __builtin_aarch64_lflooruhfdi_us (__a);
247 }
248
249 __extension__ extern __inline int16_t
250 __attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
251 vcvtnh_s16_f16 (float16_t __a)
252 {
253 return __builtin_aarch64_lfrintnhfhi (__a);
254 }
255
256 __extension__ extern __inline int32_t
257 __attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
258 vcvtnh_s32_f16 (float16_t __a)
259 {
260 return __builtin_aarch64_lfrintnhfsi (__a);
261 }
262
263 __extension__ extern __inline int64_t
264 __attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
265 vcvtnh_s64_f16 (float16_t __a)
266 {
267 return __builtin_aarch64_lfrintnhfdi (__a);
268 }
269
270 __extension__ extern __inline uint16_t
271 __attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
272 vcvtnh_u16_f16 (float16_t __a)
273 {
274 return __builtin_aarch64_lfrintnuhfhi_us (__a);
275 }
276
277 __extension__ extern __inline uint32_t
278 __attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
279 vcvtnh_u32_f16 (float16_t __a)
280 {
281 return __builtin_aarch64_lfrintnuhfsi_us (__a);
282 }
283
284 __extension__ extern __inline uint64_t
285 __attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
286 vcvtnh_u64_f16 (float16_t __a)
287 {
288 return __builtin_aarch64_lfrintnuhfdi_us (__a);
289 }
290
291 __extension__ extern __inline int16_t
292 __attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
293 vcvtph_s16_f16 (float16_t __a)
294 {
295 return __builtin_aarch64_lceilhfhi (__a);
296 }
297
298 __extension__ extern __inline int32_t
299 __attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
300 vcvtph_s32_f16 (float16_t __a)
301 {
302 return __builtin_aarch64_lceilhfsi (__a);
303 }
304
305 __extension__ extern __inline int64_t
306 __attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
307 vcvtph_s64_f16 (float16_t __a)
308 {
309 return __builtin_aarch64_lceilhfdi (__a);
310 }
311
312 __extension__ extern __inline uint16_t
313 __attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
314 vcvtph_u16_f16 (float16_t __a)
315 {
316 return __builtin_aarch64_lceiluhfhi_us (__a);
317 }
318
319 __extension__ extern __inline uint32_t
320 __attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
321 vcvtph_u32_f16 (float16_t __a)
322 {
323 return __builtin_aarch64_lceiluhfsi_us (__a);
324 }
325
326 __extension__ extern __inline uint64_t
327 __attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
328 vcvtph_u64_f16 (float16_t __a)
329 {
330 return __builtin_aarch64_lceiluhfdi_us (__a);
331 }
332
333 __extension__ extern __inline float16_t
334 __attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
335 vnegh_f16 (float16_t __a)
336 {
337 return -__a;
338 }
339
340 __extension__ extern __inline float16_t
341 __attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
342 vrecpeh_f16 (float16_t __a)
343 {
344 return __builtin_aarch64_frecpehf (__a);
345 }
346
347 __extension__ extern __inline float16_t
348 __attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
349 vrecpxh_f16 (float16_t __a)
350 {
351 return __builtin_aarch64_frecpxhf (__a);
352 }
353
354 __extension__ extern __inline float16_t
355 __attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
356 vrndh_f16 (float16_t __a)
357 {
358 return __builtin_aarch64_btrunchf (__a);
359 }
360
361 __extension__ extern __inline float16_t
362 __attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
363 vrndah_f16 (float16_t __a)
364 {
365 return __builtin_aarch64_roundhf (__a);
366 }
367
368 __extension__ extern __inline float16_t
369 __attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
370 vrndih_f16 (float16_t __a)
371 {
372 return __builtin_aarch64_nearbyinthf (__a);
373 }
374
375 __extension__ extern __inline float16_t
376 __attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
377 vrndmh_f16 (float16_t __a)
378 {
379 return __builtin_aarch64_floorhf (__a);
380 }
381
382 __extension__ extern __inline float16_t
383 __attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
384 vrndnh_f16 (float16_t __a)
385 {
386 return __builtin_aarch64_roundevenhf (__a);
387 }
388
389 __extension__ extern __inline float16_t
390 __attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
391 vrndph_f16 (float16_t __a)
392 {
393 return __builtin_aarch64_ceilhf (__a);
394 }
395
396 __extension__ extern __inline float16_t
397 __attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
398 vrndxh_f16 (float16_t __a)
399 {
400 return __builtin_aarch64_rinthf (__a);
401 }
402
403 __extension__ extern __inline float16_t
404 __attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
405 vrsqrteh_f16 (float16_t __a)
406 {
407 return __builtin_aarch64_rsqrtehf (__a);
408 }
409
410 __extension__ extern __inline float16_t
411 __attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
412 vsqrth_f16 (float16_t __a)
413 {
414 return __builtin_aarch64_sqrthf (__a);
415 }
416
417 /* ARMv8.2-A FP16 two operands scalar intrinsics. */
418
419 __extension__ extern __inline float16_t
420 __attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
421 vaddh_f16 (float16_t __a, float16_t __b)
422 {
423 return __a + __b;
424 }
425
426 __extension__ extern __inline float16_t
427 __attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
428 vabdh_f16 (float16_t __a, float16_t __b)
429 {
430 return __builtin_aarch64_fabdhf (__a, __b);
431 }
432
433 __extension__ extern __inline uint16_t
434 __attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
435 vcageh_f16 (float16_t __a, float16_t __b)
436 {
437 return __builtin_aarch64_facgehf_uss (__a, __b);
438 }
439
440 __extension__ extern __inline uint16_t
441 __attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
442 vcagth_f16 (float16_t __a, float16_t __b)
443 {
444 return __builtin_aarch64_facgthf_uss (__a, __b);
445 }
446
447 __extension__ extern __inline uint16_t
448 __attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
449 vcaleh_f16 (float16_t __a, float16_t __b)
450 {
451 return __builtin_aarch64_faclehf_uss (__a, __b);
452 }
453
454 __extension__ extern __inline uint16_t
455 __attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
456 vcalth_f16 (float16_t __a, float16_t __b)
457 {
458 return __builtin_aarch64_faclthf_uss (__a, __b);
459 }
460
461 __extension__ extern __inline uint16_t
462 __attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
463 vceqh_f16 (float16_t __a, float16_t __b)
464 {
465 return __builtin_aarch64_cmeqhf_uss (__a, __b);
466 }
467
468 __extension__ extern __inline uint16_t
469 __attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
470 vcgeh_f16 (float16_t __a, float16_t __b)
471 {
472 return __builtin_aarch64_cmgehf_uss (__a, __b);
473 }
474
475 __extension__ extern __inline uint16_t
476 __attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
477 vcgth_f16 (float16_t __a, float16_t __b)
478 {
479 return __builtin_aarch64_cmgthf_uss (__a, __b);
480 }
481
482 __extension__ extern __inline uint16_t
483 __attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
484 vcleh_f16 (float16_t __a, float16_t __b)
485 {
486 return __builtin_aarch64_cmlehf_uss (__a, __b);
487 }
488
489 __extension__ extern __inline uint16_t
490 __attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
491 vclth_f16 (float16_t __a, float16_t __b)
492 {
493 return __builtin_aarch64_cmlthf_uss (__a, __b);
494 }
495
496 __extension__ extern __inline float16_t
497 __attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
498 vcvth_n_f16_s16 (int16_t __a, const int __b)
499 {
500 return __builtin_aarch64_scvtfhi (__a, __b);
501 }
502
503 __extension__ extern __inline float16_t
504 __attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
505 vcvth_n_f16_s32 (int32_t __a, const int __b)
506 {
507 return __builtin_aarch64_scvtfsihf (__a, __b);
508 }
509
510 __extension__ extern __inline float16_t
511 __attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
512 vcvth_n_f16_s64 (int64_t __a, const int __b)
513 {
514 return __builtin_aarch64_scvtfdihf (__a, __b);
515 }
516
517 __extension__ extern __inline float16_t
518 __attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
519 vcvth_n_f16_u16 (uint16_t __a, const int __b)
520 {
521 return __builtin_aarch64_ucvtfhi_sus (__a, __b);
522 }
523
524 __extension__ extern __inline float16_t
525 __attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
526 vcvth_n_f16_u32 (uint32_t __a, const int __b)
527 {
528 return __builtin_aarch64_ucvtfsihf_sus (__a, __b);
529 }
530
531 __extension__ extern __inline float16_t
532 __attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
533 vcvth_n_f16_u64 (uint64_t __a, const int __b)
534 {
535 return __builtin_aarch64_ucvtfdihf_sus (__a, __b);
536 }
537
538 __extension__ extern __inline int16_t
539 __attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
540 vcvth_n_s16_f16 (float16_t __a, const int __b)
541 {
542 return __builtin_aarch64_fcvtzshf (__a, __b);
543 }
544
545 __extension__ extern __inline int32_t
546 __attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
547 vcvth_n_s32_f16 (float16_t __a, const int __b)
548 {
549 return __builtin_aarch64_fcvtzshfsi (__a, __b);
550 }
551
552 __extension__ extern __inline int64_t
553 __attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
554 vcvth_n_s64_f16 (float16_t __a, const int __b)
555 {
556 return __builtin_aarch64_fcvtzshfdi (__a, __b);
557 }
558
559 __extension__ extern __inline uint16_t
560 __attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
561 vcvth_n_u16_f16 (float16_t __a, const int __b)
562 {
563 return __builtin_aarch64_fcvtzuhf_uss (__a, __b);
564 }
565
566 __extension__ extern __inline uint32_t
567 __attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
568 vcvth_n_u32_f16 (float16_t __a, const int __b)
569 {
570 return __builtin_aarch64_fcvtzuhfsi_uss (__a, __b);
571 }
572
573 __extension__ extern __inline uint64_t
574 __attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
575 vcvth_n_u64_f16 (float16_t __a, const int __b)
576 {
577 return __builtin_aarch64_fcvtzuhfdi_uss (__a, __b);
578 }
579
580 __extension__ extern __inline float16_t
581 __attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
582 vdivh_f16 (float16_t __a, float16_t __b)
583 {
584 return __a / __b;
585 }
586
587 __extension__ extern __inline float16_t
588 __attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
589 vmaxh_f16 (float16_t __a, float16_t __b)
590 {
591 return __builtin_aarch64_fmaxhf (__a, __b);
592 }
593
594 __extension__ extern __inline float16_t
595 __attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
596 vmaxnmh_f16 (float16_t __a, float16_t __b)
597 {
598 return __builtin_aarch64_fmaxhf (__a, __b);
599 }
600
601 __extension__ extern __inline float16_t
602 __attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
603 vminh_f16 (float16_t __a, float16_t __b)
604 {
605 return __builtin_aarch64_fminhf (__a, __b);
606 }
607
608 __extension__ extern __inline float16_t
609 __attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
610 vminnmh_f16 (float16_t __a, float16_t __b)
611 {
612 return __builtin_aarch64_fminhf (__a, __b);
613 }
614
615 __extension__ extern __inline float16_t
616 __attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
617 vmulh_f16 (float16_t __a, float16_t __b)
618 {
619 return __a * __b;
620 }
621
622 __extension__ extern __inline float16_t
623 __attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
624 vmulxh_f16 (float16_t __a, float16_t __b)
625 {
626 return __builtin_aarch64_fmulxhf (__a, __b);
627 }
628
629 __extension__ extern __inline float16_t
630 __attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
631 vrecpsh_f16 (float16_t __a, float16_t __b)
632 {
633 return __builtin_aarch64_frecpshf (__a, __b);
634 }
635
636 __extension__ extern __inline float16_t
637 __attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
638 vrsqrtsh_f16 (float16_t __a, float16_t __b)
639 {
640 return __builtin_aarch64_rsqrtshf (__a, __b);
641 }
642
643 __extension__ extern __inline float16_t
644 __attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
645 vsubh_f16 (float16_t __a, float16_t __b)
646 {
647 return __a - __b;
648 }
649
650 /* ARMv8.2-A FP16 three operands scalar intrinsics. */
651
652 __extension__ extern __inline float16_t
653 __attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
654 vfmah_f16 (float16_t __a, float16_t __b, float16_t __c)
655 {
656 return __builtin_aarch64_fmahf (__b, __c, __a);
657 }
658
659 __extension__ extern __inline float16_t
660 __attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
661 vfmsh_f16 (float16_t __a, float16_t __b, float16_t __c)
662 {
663 return __builtin_aarch64_fnmahf (__b, __c, __a);
664 }
665
666 #pragma GCC pop_options
667
668 #endif