Home | History | Annotate | Line # | Download | only in i386
fmaintrin.h revision 1.10
      1 /* Copyright (C) 2011-2022 Free Software Foundation, Inc.
      2 
      3    This file is part of GCC.
      4 
      5    GCC is free software; you can redistribute it and/or modify
      6    it under the terms of the GNU General Public License as published by
      7    the Free Software Foundation; either version 3, or (at your option)
      8    any later version.
      9 
     10    GCC is distributed in the hope that it will be useful,
     11    but WITHOUT ANY WARRANTY; without even the implied warranty of
     12    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     13    GNU General Public License for more details.
     14 
     15    Under Section 7 of GPL version 3, you are granted additional
     16    permissions described in the GCC Runtime Library Exception, version
     17    3.1, as published by the Free Software Foundation.
     18 
     19    You should have received a copy of the GNU General Public License and
     20    a copy of the GCC Runtime Library Exception along with this program;
     21    see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
     22    <http://www.gnu.org/licenses/>.  */
     23 
     24 #ifndef _IMMINTRIN_H_INCLUDED
     25 # error "Never use <fmaintrin.h> directly; include <immintrin.h> instead."
     26 #endif
     27 
     28 #ifndef _FMAINTRIN_H_INCLUDED
     29 #define _FMAINTRIN_H_INCLUDED
     30 
     31 #ifndef __FMA__
     32 #pragma GCC push_options
     33 #pragma GCC target("fma")
     34 #define __DISABLE_FMA__
     35 #endif /* __FMA__ */
     36 
     37 extern __inline __m128d
     38 __attribute__((__gnu_inline__, __always_inline__, __artificial__))
     39 _mm_fmadd_pd (__m128d __A, __m128d __B, __m128d __C)
     40 {
     41   return (__m128d)__builtin_ia32_vfmaddpd ((__v2df)__A, (__v2df)__B,
     42                                            (__v2df)__C);
     43 }
     44 
     45 extern __inline __m256d
     46 __attribute__((__gnu_inline__, __always_inline__, __artificial__))
     47 _mm256_fmadd_pd (__m256d __A, __m256d __B, __m256d __C)
     48 {
     49   return (__m256d)__builtin_ia32_vfmaddpd256 ((__v4df)__A, (__v4df)__B,
     50                                               (__v4df)__C);
     51 }
     52 
     53 extern __inline __m128
     54 __attribute__((__gnu_inline__, __always_inline__, __artificial__))
     55 _mm_fmadd_ps (__m128 __A, __m128 __B, __m128 __C)
     56 {
     57   return (__m128)__builtin_ia32_vfmaddps ((__v4sf)__A, (__v4sf)__B,
     58                                           (__v4sf)__C);
     59 }
     60 
     61 extern __inline __m256
     62 __attribute__((__gnu_inline__, __always_inline__, __artificial__))
     63 _mm256_fmadd_ps (__m256 __A, __m256 __B, __m256 __C)
     64 {
     65   return (__m256)__builtin_ia32_vfmaddps256 ((__v8sf)__A, (__v8sf)__B,
     66                                              (__v8sf)__C);
     67 }
     68 
     69 extern __inline __m128d
     70 __attribute__((__gnu_inline__, __always_inline__, __artificial__))
     71 _mm_fmadd_sd (__m128d __A, __m128d __B, __m128d __C)
     72 {
     73   return (__m128d) __builtin_ia32_vfmaddsd3 ((__v2df)__A, (__v2df)__B,
     74                                              (__v2df)__C);
     75 }
     76 
     77 extern __inline __m128
     78 __attribute__((__gnu_inline__, __always_inline__, __artificial__))
     79 _mm_fmadd_ss (__m128 __A, __m128 __B, __m128 __C)
     80 {
     81   return (__m128) __builtin_ia32_vfmaddss3 ((__v4sf)__A, (__v4sf)__B,
     82                                             (__v4sf)__C);
     83 }
     84 
     85 extern __inline __m128d
     86 __attribute__((__gnu_inline__, __always_inline__, __artificial__))
     87 _mm_fmsub_pd (__m128d __A, __m128d __B, __m128d __C)
     88 {
     89   return (__m128d)__builtin_ia32_vfmsubpd ((__v2df)__A, (__v2df)__B,
     90                                            (__v2df)__C);
     91 }
     92 
     93 extern __inline __m256d
     94 __attribute__((__gnu_inline__, __always_inline__, __artificial__))
     95 _mm256_fmsub_pd (__m256d __A, __m256d __B, __m256d __C)
     96 {
     97   return (__m256d)__builtin_ia32_vfmsubpd256 ((__v4df)__A, (__v4df)__B,
     98                                               (__v4df)__C);
     99 }
    100 
    101 extern __inline __m128
    102 __attribute__((__gnu_inline__, __always_inline__, __artificial__))
    103 _mm_fmsub_ps (__m128 __A, __m128 __B, __m128 __C)
    104 {
    105   return (__m128)__builtin_ia32_vfmsubps ((__v4sf)__A, (__v4sf)__B,
    106                                           (__v4sf)__C);
    107 }
    108 
    109 extern __inline __m256
    110 __attribute__((__gnu_inline__, __always_inline__, __artificial__))
    111 _mm256_fmsub_ps (__m256 __A, __m256 __B, __m256 __C)
    112 {
    113   return (__m256)__builtin_ia32_vfmsubps256 ((__v8sf)__A, (__v8sf)__B,
    114                                              (__v8sf)__C);
    115 }
    116 
    117 extern __inline __m128d
    118 __attribute__((__gnu_inline__, __always_inline__, __artificial__))
    119 _mm_fmsub_sd (__m128d __A, __m128d __B, __m128d __C)
    120 {
    121   return (__m128d)__builtin_ia32_vfmsubsd3 ((__v2df)__A, (__v2df)__B,
    122                                             (__v2df)__C);
    123 }
    124 
    125 extern __inline __m128
    126 __attribute__((__gnu_inline__, __always_inline__, __artificial__))
    127 _mm_fmsub_ss (__m128 __A, __m128 __B, __m128 __C)
    128 {
    129   return (__m128)__builtin_ia32_vfmsubss3 ((__v4sf)__A, (__v4sf)__B,
    130                                            (__v4sf)__C);
    131 }
    132 
    133 extern __inline __m128d
    134 __attribute__((__gnu_inline__, __always_inline__, __artificial__))
    135 _mm_fnmadd_pd (__m128d __A, __m128d __B, __m128d __C)
    136 {
    137   return (__m128d)__builtin_ia32_vfnmaddpd ((__v2df)__A, (__v2df)__B,
    138 					    (__v2df)__C);
    139 }
    140 
    141 extern __inline __m256d
    142 __attribute__((__gnu_inline__, __always_inline__, __artificial__))
    143 _mm256_fnmadd_pd (__m256d __A, __m256d __B, __m256d __C)
    144 {
    145   return (__m256d)__builtin_ia32_vfnmaddpd256 ((__v4df)__A, (__v4df)__B,
    146 					       (__v4df)__C);
    147 }
    148 
    149 extern __inline __m128
    150 __attribute__((__gnu_inline__, __always_inline__, __artificial__))
    151 _mm_fnmadd_ps (__m128 __A, __m128 __B, __m128 __C)
    152 {
    153   return (__m128)__builtin_ia32_vfnmaddps ((__v4sf)__A, (__v4sf)__B,
    154 					   (__v4sf)__C);
    155 }
    156 
    157 extern __inline __m256
    158 __attribute__((__gnu_inline__, __always_inline__, __artificial__))
    159 _mm256_fnmadd_ps (__m256 __A, __m256 __B, __m256 __C)
    160 {
    161   return (__m256)__builtin_ia32_vfnmaddps256 ((__v8sf)__A, (__v8sf)__B,
    162 					      (__v8sf)__C);
    163 }
    164 
    165 extern __inline __m128d
    166 __attribute__((__gnu_inline__, __always_inline__, __artificial__))
    167 _mm_fnmadd_sd (__m128d __A, __m128d __B, __m128d __C)
    168 {
    169   return (__m128d)__builtin_ia32_vfnmaddsd3 ((__v2df)__A, (__v2df)__B,
    170 					     (__v2df)__C);
    171 }
    172 
    173 extern __inline __m128
    174 __attribute__((__gnu_inline__, __always_inline__, __artificial__))
    175 _mm_fnmadd_ss (__m128 __A, __m128 __B, __m128 __C)
    176 {
    177   return (__m128)__builtin_ia32_vfnmaddss3 ((__v4sf)__A, (__v4sf)__B,
    178 					    (__v4sf)__C);
    179 }
    180 
    181 extern __inline __m128d
    182 __attribute__((__gnu_inline__, __always_inline__, __artificial__))
    183 _mm_fnmsub_pd (__m128d __A, __m128d __B, __m128d __C)
    184 {
    185   return (__m128d)__builtin_ia32_vfnmsubpd ((__v2df)__A, (__v2df)__B,
    186 					    (__v2df)__C);
    187 }
    188 
    189 extern __inline __m256d
    190 __attribute__((__gnu_inline__, __always_inline__, __artificial__))
    191 _mm256_fnmsub_pd (__m256d __A, __m256d __B, __m256d __C)
    192 {
    193   return (__m256d)__builtin_ia32_vfnmsubpd256 ((__v4df)__A, (__v4df)__B,
    194 					       (__v4df)__C);
    195 }
    196 
    197 extern __inline __m128
    198 __attribute__((__gnu_inline__, __always_inline__, __artificial__))
    199 _mm_fnmsub_ps (__m128 __A, __m128 __B, __m128 __C)
    200 {
    201   return (__m128)__builtin_ia32_vfnmsubps ((__v4sf)__A, (__v4sf)__B,
    202 					   (__v4sf)__C);
    203 }
    204 
    205 extern __inline __m256
    206 __attribute__((__gnu_inline__, __always_inline__, __artificial__))
    207 _mm256_fnmsub_ps (__m256 __A, __m256 __B, __m256 __C)
    208 {
    209   return (__m256)__builtin_ia32_vfnmsubps256 ((__v8sf)__A, (__v8sf)__B,
    210 					      (__v8sf)__C);
    211 }
    212 
    213 extern __inline __m128d
    214 __attribute__((__gnu_inline__, __always_inline__, __artificial__))
    215 _mm_fnmsub_sd (__m128d __A, __m128d __B, __m128d __C)
    216 {
    217   return (__m128d)__builtin_ia32_vfnmsubsd3 ((__v2df)__A, (__v2df)__B,
    218 					     (__v2df)__C);
    219 }
    220 
    221 extern __inline __m128
    222 __attribute__((__gnu_inline__, __always_inline__, __artificial__))
    223 _mm_fnmsub_ss (__m128 __A, __m128 __B, __m128 __C)
    224 {
    225   return (__m128)__builtin_ia32_vfnmsubss3 ((__v4sf)__A, (__v4sf)__B,
    226 					    (__v4sf)__C);
    227 }
    228 
    229 extern __inline __m128d
    230 __attribute__((__gnu_inline__, __always_inline__, __artificial__))
    231 _mm_fmaddsub_pd (__m128d __A, __m128d __B, __m128d __C)
    232 {
    233   return (__m128d)__builtin_ia32_vfmaddsubpd ((__v2df)__A, (__v2df)__B,
    234                                               (__v2df)__C);
    235 }
    236 
    237 extern __inline __m256d
    238 __attribute__((__gnu_inline__, __always_inline__, __artificial__))
    239 _mm256_fmaddsub_pd (__m256d __A, __m256d __B, __m256d __C)
    240 {
    241   return (__m256d)__builtin_ia32_vfmaddsubpd256 ((__v4df)__A,
    242                                                  (__v4df)__B,
    243                                                  (__v4df)__C);
    244 }
    245 
    246 extern __inline __m128
    247 __attribute__((__gnu_inline__, __always_inline__, __artificial__))
    248 _mm_fmaddsub_ps (__m128 __A, __m128 __B, __m128 __C)
    249 {
    250   return (__m128)__builtin_ia32_vfmaddsubps ((__v4sf)__A, (__v4sf)__B,
    251                                              (__v4sf)__C);
    252 }
    253 
    254 extern __inline __m256
    255 __attribute__((__gnu_inline__, __always_inline__, __artificial__))
    256 _mm256_fmaddsub_ps (__m256 __A, __m256 __B, __m256 __C)
    257 {
    258   return (__m256)__builtin_ia32_vfmaddsubps256 ((__v8sf)__A,
    259                                                 (__v8sf)__B,
    260                                                 (__v8sf)__C);
    261 }
    262 
    263 extern __inline __m128d
    264 __attribute__((__gnu_inline__, __always_inline__, __artificial__))
    265 _mm_fmsubadd_pd (__m128d __A, __m128d __B, __m128d __C)
    266 {
    267   return (__m128d)__builtin_ia32_vfmaddsubpd ((__v2df)__A, (__v2df)__B,
    268                                               -(__v2df)__C);
    269 }
    270 
    271 extern __inline __m256d
    272 __attribute__((__gnu_inline__, __always_inline__, __artificial__))
    273 _mm256_fmsubadd_pd (__m256d __A, __m256d __B, __m256d __C)
    274 {
    275   return (__m256d)__builtin_ia32_vfmaddsubpd256 ((__v4df)__A,
    276                                                  (__v4df)__B,
    277                                                  -(__v4df)__C);
    278 }
    279 
    280 extern __inline __m128
    281 __attribute__((__gnu_inline__, __always_inline__, __artificial__))
    282 _mm_fmsubadd_ps (__m128 __A, __m128 __B, __m128 __C)
    283 {
    284   return (__m128)__builtin_ia32_vfmaddsubps ((__v4sf)__A, (__v4sf)__B,
    285                                              -(__v4sf)__C);
    286 }
    287 
    288 extern __inline __m256
    289 __attribute__((__gnu_inline__, __always_inline__, __artificial__))
    290 _mm256_fmsubadd_ps (__m256 __A, __m256 __B, __m256 __C)
    291 {
    292   return (__m256)__builtin_ia32_vfmaddsubps256 ((__v8sf)__A,
    293                                                 (__v8sf)__B,
    294                                                 -(__v8sf)__C);
    295 }
    296 
    297 #ifdef __DISABLE_FMA__
    298 #undef __DISABLE_FMA__
    299 #pragma GCC pop_options
    300 #endif /* __DISABLE_FMA__ */
    301 
    302 #endif
    303