(root)/
gcc-13.2.0/
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 __builtin_aarch64_neghf (__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