1  /* Copyright (C) 2011-2023 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