1 /* ARM FP16 scalar intrinsics include file.
2 
3    Copyright (C) 2016-2018 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__))
vabsh_f16(float16_t __a)40 vabsh_f16 (float16_t __a)
41 {
42   return __builtin_aarch64_abshf (__a);
43 }
44 
45 __extension__ static __inline uint16_t __attribute__ ((__always_inline__))
vceqzh_f16(float16_t __a)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__))
vcgezh_f16(float16_t __a)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__))
vcgtzh_f16(float16_t __a)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__))
vclezh_f16(float16_t __a)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__))
vcltzh_f16(float16_t __a)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__))
vcvth_f16_s16(int16_t __a)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__))
vcvth_f16_s32(int32_t __a)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__))
vcvth_f16_s64(int64_t __a)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__))
vcvth_f16_u16(uint16_t __a)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__))
vcvth_f16_u32(uint32_t __a)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__))
vcvth_f16_u64(uint64_t __a)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__))
vcvth_s16_f16(float16_t __a)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__))
vcvth_s32_f16(float16_t __a)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__))
vcvth_s64_f16(float16_t __a)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__))
vcvth_u16_f16(float16_t __a)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__))
vcvth_u32_f16(float16_t __a)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__))
vcvth_u64_f16(float16_t __a)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__))
vcvtah_s16_f16(float16_t __a)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__))
vcvtah_s32_f16(float16_t __a)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__))
vcvtah_s64_f16(float16_t __a)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__))
vcvtah_u16_f16(float16_t __a)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__))
vcvtah_u32_f16(float16_t __a)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__))
vcvtah_u64_f16(float16_t __a)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__))
vcvtmh_s16_f16(float16_t __a)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__))
vcvtmh_s32_f16(float16_t __a)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__))
vcvtmh_s64_f16(float16_t __a)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__))
vcvtmh_u16_f16(float16_t __a)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__))
vcvtmh_u32_f16(float16_t __a)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__))
vcvtmh_u64_f16(float16_t __a)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__))
vcvtnh_s16_f16(float16_t __a)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__))
vcvtnh_s32_f16(float16_t __a)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__))
vcvtnh_s64_f16(float16_t __a)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__))
vcvtnh_u16_f16(float16_t __a)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__))
vcvtnh_u32_f16(float16_t __a)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__))
vcvtnh_u64_f16(float16_t __a)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__))
vcvtph_s16_f16(float16_t __a)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__))
vcvtph_s32_f16(float16_t __a)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__))
vcvtph_s64_f16(float16_t __a)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__))
vcvtph_u16_f16(float16_t __a)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__))
vcvtph_u32_f16(float16_t __a)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__))
vcvtph_u64_f16(float16_t __a)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__))
vnegh_f16(float16_t __a)292 vnegh_f16 (float16_t __a)
293 {
294   return __builtin_aarch64_neghf (__a);
295 }
296 
297 __extension__ static __inline float16_t __attribute__ ((__always_inline__))
vrecpeh_f16(float16_t __a)298 vrecpeh_f16 (float16_t __a)
299 {
300   return __builtin_aarch64_frecpehf (__a);
301 }
302 
303 __extension__ static __inline float16_t __attribute__ ((__always_inline__))
vrecpxh_f16(float16_t __a)304 vrecpxh_f16 (float16_t __a)
305 {
306   return __builtin_aarch64_frecpxhf (__a);
307 }
308 
309 __extension__ static __inline float16_t __attribute__ ((__always_inline__))
vrndh_f16(float16_t __a)310 vrndh_f16 (float16_t __a)
311 {
312   return __builtin_aarch64_btrunchf (__a);
313 }
314 
315 __extension__ static __inline float16_t __attribute__ ((__always_inline__))
vrndah_f16(float16_t __a)316 vrndah_f16 (float16_t __a)
317 {
318   return __builtin_aarch64_roundhf (__a);
319 }
320 
321 __extension__ static __inline float16_t __attribute__ ((__always_inline__))
vrndih_f16(float16_t __a)322 vrndih_f16 (float16_t __a)
323 {
324   return __builtin_aarch64_nearbyinthf (__a);
325 }
326 
327 __extension__ static __inline float16_t __attribute__ ((__always_inline__))
vrndmh_f16(float16_t __a)328 vrndmh_f16 (float16_t __a)
329 {
330   return __builtin_aarch64_floorhf (__a);
331 }
332 
333 __extension__ static __inline float16_t __attribute__ ((__always_inline__))
vrndnh_f16(float16_t __a)334 vrndnh_f16 (float16_t __a)
335 {
336   return __builtin_aarch64_frintnhf (__a);
337 }
338 
339 __extension__ static __inline float16_t __attribute__ ((__always_inline__))
vrndph_f16(float16_t __a)340 vrndph_f16 (float16_t __a)
341 {
342   return __builtin_aarch64_ceilhf (__a);
343 }
344 
345 __extension__ static __inline float16_t __attribute__ ((__always_inline__))
vrndxh_f16(float16_t __a)346 vrndxh_f16 (float16_t __a)
347 {
348   return __builtin_aarch64_rinthf (__a);
349 }
350 
351 __extension__ static __inline float16_t __attribute__ ((__always_inline__))
vrsqrteh_f16(float16_t __a)352 vrsqrteh_f16 (float16_t __a)
353 {
354   return __builtin_aarch64_rsqrtehf (__a);
355 }
356 
357 __extension__ static __inline float16_t __attribute__ ((__always_inline__))
vsqrth_f16(float16_t __a)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__))
vaddh_f16(float16_t __a,float16_t __b)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__))
vabdh_f16(float16_t __a,float16_t __b)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__))
vcageh_f16(float16_t __a,float16_t __b)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__))
vcagth_f16(float16_t __a,float16_t __b)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__))
vcaleh_f16(float16_t __a,float16_t __b)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__))
vcalth_f16(float16_t __a,float16_t __b)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__))
vceqh_f16(float16_t __a,float16_t __b)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__))
vcgeh_f16(float16_t __a,float16_t __b)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__))
vcgth_f16(float16_t __a,float16_t __b)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__))
vcleh_f16(float16_t __a,float16_t __b)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__))
vclth_f16(float16_t __a,float16_t __b)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__))
vcvth_n_f16_s16(int16_t __a,const int __b)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__))
vcvth_n_f16_s32(int32_t __a,const int __b)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__))
vcvth_n_f16_s64(int64_t __a,const int __b)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__))
vcvth_n_f16_u16(uint16_t __a,const int __b)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__))
vcvth_n_f16_u32(uint32_t __a,const int __b)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__))
vcvth_n_f16_u64(uint64_t __a,const int __b)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__))
vcvth_n_s16_f16(float16_t __a,const int __b)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__))
vcvth_n_s32_f16(float16_t __a,const int __b)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__))
vcvth_n_s64_f16(float16_t __a,const int __b)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__))
vcvth_n_u16_f16(float16_t __a,const int __b)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__))
vcvth_n_u32_f16(float16_t __a,const int __b)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__))
vcvth_n_u64_f16(float16_t __a,const int __b)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__))
vdivh_f16(float16_t __a,float16_t __b)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__))
vmaxh_f16(float16_t __a,float16_t __b)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__))
vmaxnmh_f16(float16_t __a,float16_t __b)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__))
vminh_f16(float16_t __a,float16_t __b)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__))
vminnmh_f16(float16_t __a,float16_t __b)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__))
vmulh_f16(float16_t __a,float16_t __b)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__))
vmulxh_f16(float16_t __a,float16_t __b)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__))
vrecpsh_f16(float16_t __a,float16_t __b)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__))
vrsqrtsh_f16(float16_t __a,float16_t __b)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__))
vsubh_f16(float16_t __a,float16_t __b)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__))
vfmah_f16(float16_t __a,float16_t __b,float16_t __c)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__))
vfmsh_f16(float16_t __a,float16_t __b,float16_t __c)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
580