1 /*===---- fma4intrin.h - FMA4 intrinsics -----------------------------------===
3 * Permission is hereby granted, free of charge, to any person obtaining a copy
4 * of this software and associated documentation files (the "Software"), to deal
5 * in the Software without restriction, including without limitation the rights
6 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
7 * copies of the Software, and to permit persons to whom the Software is
8 * furnished to do so, subject to the following conditions:
10 * The above copyright notice and this permission notice shall be included in
11 * all copies or substantial portions of the Software.
13 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
15 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
16 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
17 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
18 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21 *===-----------------------------------------------------------------------===
25 #error "Never use <fmaintrin.h> directly; include <immintrin.h> instead."
32 # error "FMA instruction set is not enabled"
35 /* Define the default attributes for the functions in this file. */
36 #define __DEFAULT_FN_ATTRS __attribute__((__always_inline__, __nodebug__))
38 static __inline__ __m128 __DEFAULT_FN_ATTRS
39 _mm_fmadd_ps(__m128 __A, __m128 __B, __m128 __C)
41 return (__m128)__builtin_ia32_vfmaddps(__A, __B, __C);
44 static __inline__ __m128d __DEFAULT_FN_ATTRS
45 _mm_fmadd_pd(__m128d __A, __m128d __B, __m128d __C)
47 return (__m128d)__builtin_ia32_vfmaddpd(__A, __B, __C);
50 static __inline__ __m128 __DEFAULT_FN_ATTRS
51 _mm_fmadd_ss(__m128 __A, __m128 __B, __m128 __C)
53 return (__m128)__builtin_ia32_vfmaddss(__A, __B, __C);
56 static __inline__ __m128d __DEFAULT_FN_ATTRS
57 _mm_fmadd_sd(__m128d __A, __m128d __B, __m128d __C)
59 return (__m128d)__builtin_ia32_vfmaddsd(__A, __B, __C);
62 static __inline__ __m128 __DEFAULT_FN_ATTRS
63 _mm_fmsub_ps(__m128 __A, __m128 __B, __m128 __C)
65 return (__m128)__builtin_ia32_vfmsubps(__A, __B, __C);
68 static __inline__ __m128d __DEFAULT_FN_ATTRS
69 _mm_fmsub_pd(__m128d __A, __m128d __B, __m128d __C)
71 return (__m128d)__builtin_ia32_vfmsubpd(__A, __B, __C);
74 static __inline__ __m128 __DEFAULT_FN_ATTRS
75 _mm_fmsub_ss(__m128 __A, __m128 __B, __m128 __C)
77 return (__m128)__builtin_ia32_vfmsubss(__A, __B, __C);
80 static __inline__ __m128d __DEFAULT_FN_ATTRS
81 _mm_fmsub_sd(__m128d __A, __m128d __B, __m128d __C)
83 return (__m128d)__builtin_ia32_vfmsubsd(__A, __B, __C);
86 static __inline__ __m128 __DEFAULT_FN_ATTRS
87 _mm_fnmadd_ps(__m128 __A, __m128 __B, __m128 __C)
89 return (__m128)__builtin_ia32_vfnmaddps(__A, __B, __C);
92 static __inline__ __m128d __DEFAULT_FN_ATTRS
93 _mm_fnmadd_pd(__m128d __A, __m128d __B, __m128d __C)
95 return (__m128d)__builtin_ia32_vfnmaddpd(__A, __B, __C);
98 static __inline__ __m128 __DEFAULT_FN_ATTRS
99 _mm_fnmadd_ss(__m128 __A, __m128 __B, __m128 __C)
101 return (__m128)__builtin_ia32_vfnmaddss(__A, __B, __C);
104 static __inline__ __m128d __DEFAULT_FN_ATTRS
105 _mm_fnmadd_sd(__m128d __A, __m128d __B, __m128d __C)
107 return (__m128d)__builtin_ia32_vfnmaddsd(__A, __B, __C);
110 static __inline__ __m128 __DEFAULT_FN_ATTRS
111 _mm_fnmsub_ps(__m128 __A, __m128 __B, __m128 __C)
113 return (__m128)__builtin_ia32_vfnmsubps(__A, __B, __C);
116 static __inline__ __m128d __DEFAULT_FN_ATTRS
117 _mm_fnmsub_pd(__m128d __A, __m128d __B, __m128d __C)
119 return (__m128d)__builtin_ia32_vfnmsubpd(__A, __B, __C);
122 static __inline__ __m128 __DEFAULT_FN_ATTRS
123 _mm_fnmsub_ss(__m128 __A, __m128 __B, __m128 __C)
125 return (__m128)__builtin_ia32_vfnmsubss(__A, __B, __C);
128 static __inline__ __m128d __DEFAULT_FN_ATTRS
129 _mm_fnmsub_sd(__m128d __A, __m128d __B, __m128d __C)
131 return (__m128d)__builtin_ia32_vfnmsubsd(__A, __B, __C);
134 static __inline__ __m128 __DEFAULT_FN_ATTRS
135 _mm_fmaddsub_ps(__m128 __A, __m128 __B, __m128 __C)
137 return (__m128)__builtin_ia32_vfmaddsubps(__A, __B, __C);
140 static __inline__ __m128d __DEFAULT_FN_ATTRS
141 _mm_fmaddsub_pd(__m128d __A, __m128d __B, __m128d __C)
143 return (__m128d)__builtin_ia32_vfmaddsubpd(__A, __B, __C);
146 static __inline__ __m128 __DEFAULT_FN_ATTRS
147 _mm_fmsubadd_ps(__m128 __A, __m128 __B, __m128 __C)
149 return (__m128)__builtin_ia32_vfmsubaddps(__A, __B, __C);
152 static __inline__ __m128d __DEFAULT_FN_ATTRS
153 _mm_fmsubadd_pd(__m128d __A, __m128d __B, __m128d __C)
155 return (__m128d)__builtin_ia32_vfmsubaddpd(__A, __B, __C);
158 static __inline__ __m256 __DEFAULT_FN_ATTRS
159 _mm256_fmadd_ps(__m256 __A, __m256 __B, __m256 __C)
161 return (__m256)__builtin_ia32_vfmaddps256(__A, __B, __C);
164 static __inline__ __m256d __DEFAULT_FN_ATTRS
165 _mm256_fmadd_pd(__m256d __A, __m256d __B, __m256d __C)
167 return (__m256d)__builtin_ia32_vfmaddpd256(__A, __B, __C);
170 static __inline__ __m256 __DEFAULT_FN_ATTRS
171 _mm256_fmsub_ps(__m256 __A, __m256 __B, __m256 __C)
173 return (__m256)__builtin_ia32_vfmsubps256(__A, __B, __C);
176 static __inline__ __m256d __DEFAULT_FN_ATTRS
177 _mm256_fmsub_pd(__m256d __A, __m256d __B, __m256d __C)
179 return (__m256d)__builtin_ia32_vfmsubpd256(__A, __B, __C);
182 static __inline__ __m256 __DEFAULT_FN_ATTRS
183 _mm256_fnmadd_ps(__m256 __A, __m256 __B, __m256 __C)
185 return (__m256)__builtin_ia32_vfnmaddps256(__A, __B, __C);
188 static __inline__ __m256d __DEFAULT_FN_ATTRS
189 _mm256_fnmadd_pd(__m256d __A, __m256d __B, __m256d __C)
191 return (__m256d)__builtin_ia32_vfnmaddpd256(__A, __B, __C);
194 static __inline__ __m256 __DEFAULT_FN_ATTRS
195 _mm256_fnmsub_ps(__m256 __A, __m256 __B, __m256 __C)
197 return (__m256)__builtin_ia32_vfnmsubps256(__A, __B, __C);
200 static __inline__ __m256d __DEFAULT_FN_ATTRS
201 _mm256_fnmsub_pd(__m256d __A, __m256d __B, __m256d __C)
203 return (__m256d)__builtin_ia32_vfnmsubpd256(__A, __B, __C);
206 static __inline__ __m256 __DEFAULT_FN_ATTRS
207 _mm256_fmaddsub_ps(__m256 __A, __m256 __B, __m256 __C)
209 return (__m256)__builtin_ia32_vfmaddsubps256(__A, __B, __C);
212 static __inline__ __m256d __DEFAULT_FN_ATTRS
213 _mm256_fmaddsub_pd(__m256d __A, __m256d __B, __m256d __C)
215 return (__m256d)__builtin_ia32_vfmaddsubpd256(__A, __B, __C);
218 static __inline__ __m256 __DEFAULT_FN_ATTRS
219 _mm256_fmsubadd_ps(__m256 __A, __m256 __B, __m256 __C)
221 return (__m256)__builtin_ia32_vfmsubaddps256(__A, __B, __C);
224 static __inline__ __m256d __DEFAULT_FN_ATTRS
225 _mm256_fmsubadd_pd(__m256d __A, __m256d __B, __m256d __C)
227 return (__m256d)__builtin_ia32_vfmsubaddpd256(__A, __B, __C);
230 #undef __DEFAULT_FN_ATTRS
234 #endif /* __FMAINTRIN_H */