2 * This source code is part of
6 * Copyright (c) 1991-2000, University of Groningen, The Netherlands.
7 * Copyright (c) 2001-2012, The GROMACS Development Team
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
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
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.
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.
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!
31 /* Undefine all defines used below so we can include this file multiple times
32 * with different settings from the same source file.
35 /* NOTE: floor and blend are NOT available with SSE2 only acceleration */
37 #undef GMX_X86_SIMD_WIDTH_HERE
62 #undef gmx_movemask_pr
64 #undef gmx_mm_castsi128_pr
66 #undef gmx_cvttpr_epi32
67 #undef gmx_cvtepi32_pr
70 #undef gmx_calc_rsq_pr
73 #undef gmx_pmecorrF_pr
74 #undef gmx_pmecorrV_pr
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.
86 #if !defined GMX_MM128_HERE && !defined GMX_MM256_HERE
87 "You should define GMX_MM128_HERE or GMX_MM256_HERE"
90 #if defined GMX_MM128_HERE && defined GMX_MM256_HERE
91 "You should not define both GMX_MM128_HERE and GMX_MM256_HERE"
96 #define gmx_epi32 __m128i
100 #include "gmx_x86_simd_single.h"
102 #define GMX_X86_SIMD_WIDTH_HERE 4
104 #define gmx_mm_pr __m128
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
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
122 #define gmx_floor_pr _mm_floor_ps
123 #define gmx_blendv_pr _mm_blendv_ps
125 #define gmx_movemask_pr _mm_movemask_ps
127 #define gmx_mm_castsi128_pr gmx_mm_castsi128_ps
129 #define gmx_cvttpr_epi32 _mm_cvttps_epi32
130 #define gmx_cvtepi32_pr _mm_cvtepi32_ps
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
136 #define gmx_pmecorrF_pr gmx_mm_pmecorrF_ps
137 #define gmx_pmecorrV_pr gmx_mm_pmecorrV_ps
139 #else /* ifndef GMX_DOUBLE */
141 #include "gmx_x86_simd_double.h"
143 #define GMX_X86_SIMD_WIDTH_HERE 2
145 #define gmx_mm_pr __m128d
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
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
163 #define gmx_floor_pr _mm_floor_pd
164 #define gmx_blendv_pr _mm_blendv_pd
166 #define gmx_movemask_pr _mm_movemask_pd
168 #define gmx_mm_castsi128_pr gmx_mm_castsi128_pd
170 #define gmx_cvttpr_epi32 _mm_cvttpd_epi32
171 #define gmx_cvtepi32_pr _mm_cvtepi32_pd
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
177 #define gmx_pmecorrF_pr gmx_mm_pmecorrF_pd
178 #define gmx_pmecorrV_pr gmx_mm_pmecorrV_pd
180 #endif /* ifndef GMX_DOUBLE */
182 #endif /* GMX_MM128_HERE */
184 #ifdef GMX_MM256_HERE
186 #define gmx_epi32 __m256i
190 #include "gmx_x86_simd_single.h"
192 #define GMX_X86_SIMD_WIDTH_HERE 8
194 #define gmx_mm_pr __m256
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
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
215 #define gmx_floor_pr _mm256_floor_ps
216 #define gmx_blendv_pr _mm256_blendv_ps
218 #define gmx_movemask_pr _mm256_movemask_ps
220 #define gmx_mm_castsi256_pr _mm256_castsi256_ps
222 #define gmx_cvttpr_epi32 _mm256_cvttps_epi32
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
228 #define gmx_pmecorrF_pr gmx_mm256_pmecorrF_ps
229 #define gmx_pmecorrV_pr gmx_mm256_pmecorrV_ps
233 #include "gmx_x86_simd_double.h"
235 #define GMX_X86_SIMD_WIDTH_HERE 4
237 #define gmx_mm_pr __m256d
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
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
258 #define gmx_floor_pr _mm256_floor_pd
259 #define gmx_blendv_pr _mm256_blendv_pd
261 #define gmx_movemask_pr _mm256_movemask_pd
263 #define gmx_mm_castsi256_pr _mm256_castsi256_pd
265 #define gmx_cvttpr_epi32 _mm256_cvttpd_epi32
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
271 #define gmx_pmecorrF_pr gmx_mm256_pmecorrF_pd
272 #define gmx_pmecorrV_pr gmx_mm256_pmecorrV_pd
276 #endif /* GMX_MM256_HERE */