Merge release-4-6 into master
[alexxy/gromacs.git] / src / gromacs / legacyheaders / gmx_x86_simd_macros.h
1 /*
2  *                This source code is part of
3  *
4  *                 G   R   O   M   A   C   S
5  *
6  * Copyright (c) 1991-2000, University of Groningen, The Netherlands.
7  * Copyright (c) 2001-2012, The GROMACS Development Team
8  *
9  * Gromacs is a library for molecular simulation and trajectory analysis,
10  * written by Erik Lindahl, David van der Spoel, Berk Hess, and others - for
11  * a full list of developers and information, check out http://www.gromacs.org
12  *
13  * This program is free software; you can redistribute it and/or modify it under 
14  * the terms of the GNU Lesser General Public License as published by the Free 
15  * Software Foundation; either version 2 of the License, or (at your option) any 
16  * later version.
17  * As a special exception, you may use this file as part of a free software
18  * library without restriction.  Specifically, if other files instantiate
19  * templates or use macros or inline functions from this file, or you compile
20  * this file and link it with other files to produce an executable, this
21  * file does not by itself cause the resulting executable to be covered by
22  * the GNU Lesser General Public License.  
23  *
24  * In plain-speak: do not worry about classes/macros/templates either - only
25  * changes to the library have to be LGPL, not an application linking with it.
26  *
27  * To help fund GROMACS development, we humbly ask that you cite
28  * the papers people have written on it - you can find them on the website!
29  */
30
31 /* Undefine all defines used below so we can include this file multiple times
32  * with different settings from the same source file.
33  */
34
35 /* NOTE: floor and blend are NOT available with SSE2 only acceleration */
36
37 #undef GMX_X86_SIMD_WIDTH_HERE
38
39 #undef gmx_epi32
40
41 #undef gmx_mm_pr
42
43 #undef gmx_load_pr
44 #undef gmx_load1_pr
45 #undef gmx_set1_pr
46 #undef gmx_setzero_pr
47 #undef gmx_store_pr
48 #undef gmx_storeu_pr
49
50 #undef gmx_add_pr
51 #undef gmx_sub_pr
52 #undef gmx_mul_pr
53 #undef gmx_max_pr
54 #undef gmx_cmplt_pr
55 #undef gmx_and_pr
56 #undef gmx_or_pr
57 #undef gmx_andnot_pr
58
59 #undef gmx_floor_pr
60 #undef gmx_blendv_pr
61
62 #undef gmx_movemask_pr
63
64 #undef gmx_mm_castsi128_pr
65
66 #undef gmx_cvttpr_epi32
67 #undef gmx_cvtepi32_pr
68
69 #undef gmx_invsqrt_pr
70 #undef gmx_calc_rsq_pr
71 #undef gmx_sum4_pr
72
73 #undef gmx_pmecorrF_pr
74 #undef gmx_pmecorrV_pr
75
76
77 /* By defining GMX_MM128_HERE or GMX_MM256_HERE before including this file
78  * the same intrinsics, with defines, can be compiled for either 128 or 256
79  * bit wide SSE or AVX instructions.
80  * The gmx_ prefix is replaced by _mm_ or _mm256_ (SSE or AVX).
81  * The _pr suffix is replaced by _ps or _pd (single or double precision).
82  * Note that compiler settings will decide if 128-bit intrinsics will
83  * be translated into SSE or AVX instructions.
84  */
85
86 #if !defined GMX_MM128_HERE && !defined GMX_MM256_HERE
87 "You should define GMX_MM128_HERE or GMX_MM256_HERE"
88 #endif
89
90 #if defined GMX_MM128_HERE && defined GMX_MM256_HERE
91 "You should not define both GMX_MM128_HERE and GMX_MM256_HERE"
92 #endif
93
94 #ifdef GMX_MM128_HERE
95
96 #define gmx_epi32  __m128i
97
98 #ifndef GMX_DOUBLE
99
100 #include "gmx_x86_simd_single.h"
101
102 #define GMX_X86_SIMD_WIDTH_HERE  4
103
104 #define gmx_mm_pr  __m128
105
106 #define gmx_load_pr       _mm_load_ps
107 #define gmx_load1_pr      _mm_load1_ps
108 #define gmx_set1_pr       _mm_set1_ps
109 #define gmx_setzero_pr    _mm_setzero_ps
110 #define gmx_store_pr      _mm_store_ps
111 #define gmx_storeu_pr     _mm_storeu_ps
112
113 #define gmx_add_pr        _mm_add_ps
114 #define gmx_sub_pr        _mm_sub_ps
115 #define gmx_mul_pr        _mm_mul_ps
116 #define gmx_max_pr        _mm_max_ps
117 #define gmx_cmplt_pr      _mm_cmplt_ps
118 #define gmx_and_pr        _mm_and_ps
119 #define gmx_or_pr         _mm_or_ps
120 #define gmx_andnot_pr     _mm_andnot_ps
121
122 #define gmx_floor_pr      _mm_floor_ps
123 #define gmx_blendv_pr     _mm_blendv_ps
124
125 #define gmx_movemask_pr   _mm_movemask_ps
126
127 #define gmx_mm_castsi128_pr gmx_mm_castsi128_ps
128
129 #define gmx_cvttpr_epi32  _mm_cvttps_epi32
130 #define gmx_cvtepi32_pr   _mm_cvtepi32_ps
131
132 #define gmx_invsqrt_pr    gmx_mm_invsqrt_ps
133 #define gmx_calc_rsq_pr   gmx_mm_calc_rsq_ps
134 #define gmx_sum4_pr       gmx_mm_sum4_ps
135
136 #define gmx_pmecorrF_pr   gmx_mm_pmecorrF_ps
137 #define gmx_pmecorrV_pr   gmx_mm_pmecorrV_ps
138
139 #else /* ifndef GMX_DOUBLE */
140
141 #include "gmx_x86_simd_double.h"
142
143 #define GMX_X86_SIMD_WIDTH_HERE  2
144
145 #define gmx_mm_pr  __m128d
146
147 #define gmx_load_pr       _mm_load_pd
148 #define gmx_load1_pr      _mm_load1_pd
149 #define gmx_set1_pr       _mm_set1_pd
150 #define gmx_setzero_pr    _mm_setzero_pd
151 #define gmx_store_pr      _mm_store_pd
152 #define gmx_storeu_pr     _mm_storeu_pd
153
154 #define gmx_add_pr        _mm_add_pd
155 #define gmx_sub_pr        _mm_sub_pd
156 #define gmx_mul_pr        _mm_mul_pd
157 #define gmx_max_pr        _mm_max_pd
158 #define gmx_cmplt_pr      _mm_cmplt_pd
159 #define gmx_and_pr        _mm_and_pd
160 #define gmx_or_pr         _mm_or_pd
161 #define gmx_andnot_pr     _mm_andnot_pd
162
163 #define gmx_floor_pr      _mm_floor_pd
164 #define gmx_blendv_pr     _mm_blendv_pd
165
166 #define gmx_movemask_pr   _mm_movemask_pd
167
168 #define gmx_mm_castsi128_pr gmx_mm_castsi128_pd
169
170 #define gmx_cvttpr_epi32  _mm_cvttpd_epi32
171 #define gmx_cvtepi32_pr   _mm_cvtepi32_pd
172
173 #define gmx_invsqrt_pr    gmx_mm_invsqrt_pd
174 #define gmx_calc_rsq_pr   gmx_mm_calc_rsq_pd
175 #define gmx_sum4_pr       gmx_mm_sum4_pd
176
177 #define gmx_pmecorrF_pr   gmx_mm_pmecorrF_pd
178 #define gmx_pmecorrV_pr   gmx_mm_pmecorrV_pd
179
180 #endif /* ifndef GMX_DOUBLE */
181
182 #endif /* GMX_MM128_HERE */
183
184 #ifdef GMX_MM256_HERE
185
186 #define gmx_epi32 __m256i
187
188 #ifndef GMX_DOUBLE
189
190 #include "gmx_x86_simd_single.h"
191
192 #define GMX_X86_SIMD_WIDTH_HERE  8
193
194 #define gmx_mm_pr  __m256
195
196 #define gmx_load_pr       _mm256_load_ps
197 #define gmx_load1_pr(x)   _mm256_set1_ps((x)[0])
198 #define gmx_set1_pr       _mm256_set1_ps
199 #define gmx_setzero_pr    _mm256_setzero_ps
200 #define gmx_store_pr      _mm256_store_ps
201 #define gmx_storeu_pr     _mm256_storeu_ps
202
203 #define gmx_add_pr        _mm256_add_ps
204 #define gmx_sub_pr        _mm256_sub_ps
205 #define gmx_mul_pr        _mm256_mul_ps
206 #define gmx_max_pr        _mm256_max_ps
207 /* Not-equal (ordered, non-signaling)  */
208 #define gmx_cmpneq_pr(x,y)  _mm256_cmp_ps(x,y,0x0c)
209 /* Less-than (ordered, non-signaling)  */
210 #define gmx_cmplt_pr(x,y) _mm256_cmp_ps(x,y,0x11)
211 #define gmx_and_pr        _mm256_and_ps
212 #define gmx_or_pr         _mm256_or_ps
213 #define gmx_andnot_pr     _mm256_andnot_ps
214
215 #define gmx_floor_pr      _mm256_floor_ps
216 #define gmx_blendv_pr     _mm256_blendv_ps
217
218 #define gmx_movemask_pr   _mm256_movemask_ps
219
220 #define gmx_mm_castsi256_pr _mm256_castsi256_ps
221
222 #define gmx_cvttpr_epi32  _mm256_cvttps_epi32
223
224 #define gmx_invsqrt_pr    gmx_mm256_invsqrt_ps
225 #define gmx_calc_rsq_pr   gmx_mm256_calc_rsq_ps
226 #define gmx_sum4_pr       gmx_mm256_sum4_ps
227
228 #define gmx_pmecorrF_pr   gmx_mm256_pmecorrF_ps
229 #define gmx_pmecorrV_pr   gmx_mm256_pmecorrV_ps
230
231 #else
232
233 #include "gmx_x86_simd_double.h"
234
235 #define GMX_X86_SIMD_WIDTH_HERE  4
236
237 #define gmx_mm_pr  __m256d
238
239 #define gmx_load_pr       _mm256_load_pd
240 #define gmx_load1_pr(x)   _mm256_set1_pd((x)[0])
241 #define gmx_set1_pr       _mm256_set1_pd
242 #define gmx_setzero_pr    _mm256_setzero_pd
243 #define gmx_store_pr      _mm256_store_pd
244 #define gmx_storeu_pr     _mm256_storeu_pd
245
246 #define gmx_add_pr        _mm256_add_pd
247 #define gmx_sub_pr        _mm256_sub_pd
248 #define gmx_mul_pr        _mm256_mul_pd
249 #define gmx_max_pr        _mm256_max_pd
250 /* Not-equal (ordered, non-signaling)  */
251 #define gmx_cmpneq_pr(x,y)  _mm256_cmp_pd(x,y,0x0c)
252 /* Less-than (ordered, non-signaling)  */
253 #define gmx_cmplt_pr(x,y) _mm256_cmp_pd(x,y,0x11)
254 #define gmx_and_pr        _mm256_and_pd
255 #define gmx_or_pr         _mm256_or_pd
256 #define gmx_andnot_pr     _mm256_andnot_pd
257
258 #define gmx_floor_pr      _mm256_floor_pd
259 #define gmx_blendv_pr     _mm256_blendv_pd
260
261 #define gmx_movemask_pr   _mm256_movemask_pd
262
263 #define gmx_mm_castsi256_pr _mm256_castsi256_pd
264
265 #define gmx_cvttpr_epi32  _mm256_cvttpd_epi32
266
267 #define gmx_invsqrt_pr    gmx_mm256_invsqrt_pd
268 #define gmx_calc_rsq_pr   gmx_mm256_calc_rsq_pd
269 #define gmx_sum4_pr       gmx_mm256_sum4_pd
270
271 #define gmx_pmecorrF_pr   gmx_mm256_pmecorrF_pd
272 #define gmx_pmecorrV_pr   gmx_mm256_pmecorrV_pd
273
274 #endif
275
276 #endif /* GMX_MM256_HERE */