1 /* Copyright (C) 2011-2018 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_vfmaddpd ((__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_vfmaddpd256 ((__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_vfmaddps ((__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_vfmaddps256 ((__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_vfmaddsd3 ((__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_vfmaddss3 ((__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_vfmaddpd (-(__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_vfmaddpd256 (-(__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_vfmaddps (-(__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_vfmaddps256 (-(__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_vfmaddsd3 ((__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_vfmaddss3 ((__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_vfmaddpd (-(__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_vfmaddpd256 (-(__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_vfmaddps (-(__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_vfmaddps256 (-(__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_vfmaddsd3 ((__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_vfmaddss3 ((__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