0be09945105d25905f5e1e864ffe56bccbcaae90
[alexxy/gromacs.git] / src / gromacs / gmxlib / nonbonded / nb_kernel_sparc64_hpc_ace_double / kernelutil_sparc64_hpc_ace_double.h
1 /*
2  * This file is part of the GROMACS molecular simulation package.
3  *
4  * Copyright (c) 2012,2013, by the GROMACS development team, led by
5  * Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
6  * and including many others, as listed in the AUTHORS file in the
7  * top-level source directory and at http://www.gromacs.org.
8  *
9  * GROMACS is free software; you can redistribute it and/or
10  * modify it under the terms of the GNU Lesser General Public License
11  * as published by the Free Software Foundation; either version 2.1
12  * of the License, or (at your option) any later version.
13  *
14  * GROMACS is distributed in the hope that it will be useful,
15  * but WITHOUT ANY WARRANTY; without even the implied warranty of
16  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
17  * Lesser General Public License for more details.
18  *
19  * You should have received a copy of the GNU Lesser General Public
20  * License along with GROMACS; if not, see
21  * http://www.gnu.org/licenses, or write to the Free Software Foundation,
22  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA.
23  *
24  * If you want to redistribute modifications to GROMACS, please
25  * consider that scientific software is very special. Version
26  * control is crucial - bugs must be traceable. We will be happy to
27  * consider code for inclusion in the official distribution, but
28  * derived work must not be called official GROMACS. Details are found
29  * in the README & COPYING files - if they are missing, get the
30  * official version at http://www.gromacs.org.
31  *
32  * To help us fund GROMACS development, we humbly ask that you cite
33  * the research papers on the package. Check out http://www.gromacs.org.
34  */
35 #ifndef _kernelutil_sparc64_hpc_ace_double_h_
36 #define _kernelutil_sparc64_hpc_ace_double_h_
37
38 /* Fujitsu header borrows the name from SSE2, since some instructions have aliases */
39 #include <emmintrin.h>
40
41 #define GMX_FJSP_SHUFFLE2(x,y) (((x)<<1) | (y))
42
43 #define GMX_FJSP_TRANSPOSE2_V2R8(row0, row1) {           \
44     _fjsp_v2r8 __gmx_t1 = row0;                          \
45     row0           = _fjsp_unpacklo_v2r8(row0,row1);     \
46     row1           = _fjsp_unpackhi_v2r8(__gmx_t1,row1); \
47 }
48
49
50 static void
51 gmx_fjsp_print_v2r8(const char *s, _fjsp_v2r8 a)
52 {
53   double lo,hi;
54
55   _fjsp_storel_v2r8(&lo,a);
56   _fjsp_storeh_v2r8(&hi,a);
57   printf("%s: %g %g\n",s,lo,hi);
58 }
59
60
61 static _fjsp_v2r8
62 gmx_fjsp_set1_v2r8(double d)
63 {
64     return _fjsp_set_v2r8(d,d);
65 }
66
67 static _fjsp_v2r8
68 gmx_fjsp_load1_v2r8(const double * gmx_restrict ptr)
69 {
70     return gmx_fjsp_set1_v2r8(*ptr);
71 }
72
73
74 static int
75 gmx_fjsp_any_lt_v2r8(_fjsp_v2r8 a, _fjsp_v2r8 b)
76 {
77     union
78     {
79         double           d;
80         long long int    i;
81     }
82     conv;
83     
84     a = _fjsp_cmplt_v2r8(a,b);
85     a = _fjsp_or_v2r8(a, _fjsp_unpackhi_v2r8(a,a));
86     _fjsp_storel_v2r8(&(conv.d),a);
87     return (conv.i != 0);
88 }
89
90 /* 1.0/sqrt(x) */
91 static gmx_inline _fjsp_v2r8
92 gmx_fjsp_invsqrt_v2r8(_fjsp_v2r8 x)
93 {
94     const _fjsp_v2r8 half  = gmx_fjsp_set1_v2r8(0.5);
95     const _fjsp_v2r8 three = gmx_fjsp_set1_v2r8(3.0);
96     _fjsp_v2r8 lu = _fjsp_rsqrta_v2r8(x);
97     
98     lu = _fjsp_mul_v2r8(_fjsp_mul_v2r8(half,lu),_fjsp_nmsub_v2r8(_fjsp_mul_v2r8(lu,lu),x,three));
99     /* The HPC-ACE instruction set is only available in double precision, while
100      * single precision is typically sufficient for Gromacs. If you define 
101      * "GMX_RELAXED_DOUBLE_PRECISION" during compile, we stick to two Newton-Raphson 
102      * iterations and accept 32bits of accuracy in 1.0/sqrt(x) and 1.0/x, rather than full 
103      * double precision (53 bits). This is still clearly higher than single precision (24 bits).
104      */
105 #ifndef GMX_RELAXED_DOUBLE_PRECISION
106     lu = _fjsp_mul_v2r8(_fjsp_mul_v2r8(half,lu),_fjsp_nmsub_v2r8(_fjsp_mul_v2r8(lu,lu),x,three));
107 #endif
108     return _fjsp_mul_v2r8(_fjsp_mul_v2r8(half,lu),_fjsp_nmsub_v2r8(_fjsp_mul_v2r8(lu,lu),x,three));
109 }
110
111
112 /* 1.0/x */
113 static gmx_inline _fjsp_v2r8
114 gmx_fjsp_inv_v2r8(_fjsp_v2r8 x)
115 {
116     const _fjsp_v2r8 two  = gmx_fjsp_set1_v2r8(2.0);    
117     __m128d lu = _fjsp_rcpa_v2r8(x);
118     
119     /* Perform three N-R steps for double precision */
120     lu         = _fjsp_mul_v2r8(lu,_fjsp_nmsub_v2r8(lu,x,two));
121     /* The HPC-ACE instruction set is only available in double precision, while
122      * single precision is typically sufficient for Gromacs. If you define
123      * "GMX_RELAXED_DOUBLE_PRECISION" during compile, we stick to two Newton-Raphson
124      * iterations and accept 32bits of accuracy in 1.0/sqrt(x) and 1.0/x, rather than full
125      * double precision (53 bits). This is still clearly higher than single precision (24 bits).
126      */
127 #ifndef GMX_RELAXED_DOUBLE_PRECISION
128     lu         = _fjsp_mul_v2r8(lu,_fjsp_nmsub_v2r8(lu,x,two));
129 #endif
130     return _fjsp_mul_v2r8(lu,_fjsp_nmsub_v2r8(lu,x,two));
131 }
132
133
134 static gmx_inline _fjsp_v2r8
135 gmx_fjsp_calc_rsq_v2r8(_fjsp_v2r8 dx, _fjsp_v2r8 dy, _fjsp_v2r8 dz)
136 {
137     return _fjsp_madd_v2r8(dx,dx,_fjsp_madd_v2r8(dy,dy,_fjsp_mul_v2r8(dz,dz)));
138 }
139
140 /* Normal sum of four ymm registers */
141 #define gmx_fjsp_sum4_v2r8(t0,t1,t2,t3)  _fjsp_add_v2r8(_fjsp_add_v2r8(t0,t1),_fjsp_add_v2r8(t2,t3))
142
143
144
145
146
147 static _fjsp_v2r8
148 gmx_fjsp_load_2real_swizzle_v2r8(const double * gmx_restrict ptrA,
149                                  const double * gmx_restrict ptrB)
150 {
151     return _fjsp_unpacklo_v2r8(_fjsp_loadl_v2r8(_fjsp_setzero_v2r8(),ptrA),_fjsp_loadl_v2r8(_fjsp_setzero_v2r8(),ptrB));
152 }
153
154 static _fjsp_v2r8
155 gmx_fjsp_load_1real_v2r8(const double * gmx_restrict ptrA)
156 {
157     return _fjsp_loadl_v2r8(_fjsp_setzero_v2r8(),ptrA);
158 }
159
160
161 static void
162 gmx_fjsp_store_2real_swizzle_v2r8(double * gmx_restrict ptrA,
163                                 double * gmx_restrict ptrB,
164                                 _fjsp_v2r8 xmm1)
165 {
166     _fjsp_v2r8 t2;
167     
168     t2       = _fjsp_unpackhi_v2r8(xmm1,xmm1);
169     _fjsp_storel_v2r8(ptrA,xmm1);                                           
170     _fjsp_storel_v2r8(ptrB,t2);                                         
171 }
172
173 static void
174 gmx_fjsp_store_1real_v2r8(double * gmx_restrict ptrA, _fjsp_v2r8 xmm1)
175 {
176     _fjsp_storel_v2r8(ptrA,xmm1);
177 }
178
179
180 /* Similar to store, but increments value in memory */
181 static void
182 gmx_fjsp_increment_2real_swizzle_v2r8(double * gmx_restrict ptrA,
183                                     double * gmx_restrict ptrB, _fjsp_v2r8 xmm1)
184 {
185     _fjsp_v2r8 t1;
186     
187     t1   = _fjsp_unpackhi_v2r8(xmm1,xmm1);
188     xmm1 = _fjsp_add_v2r8(xmm1,_fjsp_loadl_v2r8(_fjsp_setzero_v2r8(),ptrA));
189     t1   = _fjsp_add_v2r8(t1,_fjsp_loadl_v2r8(_fjsp_setzero_v2r8(),ptrB));
190     _fjsp_storel_v2r8(ptrA,xmm1);
191     _fjsp_storel_v2r8(ptrB,t1);
192 }
193
194 static void
195 gmx_fjsp_increment_1real_v2r8(double * gmx_restrict ptrA, _fjsp_v2r8 xmm1)
196 {
197     _fjsp_v2r8 tmp;
198     
199     tmp = _fjsp_loadl_v2r8(_fjsp_setzero_v2r8(),ptrA);
200     tmp = _fjsp_add_v2r8(tmp,xmm1);
201     _fjsp_storel_v2r8(ptrA,tmp);
202 }
203
204
205
206 static gmx_inline void
207 gmx_fjsp_load_2pair_swizzle_v2r8(const double * gmx_restrict p1,
208                              const double * gmx_restrict p2,
209                              _fjsp_v2r8 * gmx_restrict c6,
210                              _fjsp_v2r8 * gmx_restrict c12)
211 {
212     _fjsp_v2r8 t1,t2,t3;
213     
214     /* The c6/c12 array should be aligned */
215     t1   = _fjsp_load_v2r8(p1);
216     t2   = _fjsp_load_v2r8(p2);
217     *c6  = _fjsp_unpacklo_v2r8(t1,t2);  
218     *c12 = _fjsp_unpackhi_v2r8(t1,t2);                    
219 }
220
221 static gmx_inline void
222 gmx_fjsp_load_1pair_swizzle_v2r8(const double * gmx_restrict p1,
223                              _fjsp_v2r8 * gmx_restrict c6,
224                              _fjsp_v2r8 * gmx_restrict c12)
225 {
226     *c6     = _fjsp_loadl_v2r8(_fjsp_setzero_v2r8(),p1);
227     *c12    = _fjsp_loadl_v2r8(_fjsp_setzero_v2r8(),p1+1);
228 }
229
230
231 static gmx_inline void
232 gmx_fjsp_load_shift_and_1rvec_broadcast_v2r8(const double * gmx_restrict xyz_shift,
233                                          const double * gmx_restrict xyz,
234                                          _fjsp_v2r8 * gmx_restrict x1,
235                                          _fjsp_v2r8 * gmx_restrict y1,
236                                          _fjsp_v2r8 * gmx_restrict z1)
237 {
238     _fjsp_v2r8 mem_xy,mem_z,mem_sxy,mem_sz;
239     
240     mem_xy  = _fjsp_load_v2r8(xyz);
241     mem_z   = _fjsp_loadl_v2r8(_fjsp_setzero_v2r8(),xyz+2);
242     mem_sxy = _fjsp_load_v2r8(xyz_shift);
243     mem_sz  = _fjsp_loadl_v2r8(_fjsp_setzero_v2r8(),xyz_shift+2);
244     
245     mem_xy  = _fjsp_add_v2r8(mem_xy,mem_sxy);
246     mem_z   = _fjsp_add_v2r8(mem_z,mem_sz);
247     
248     *x1  = _fjsp_shuffle_v2r8(mem_xy,mem_xy,GMX_FJSP_SHUFFLE2(0,0));
249     *y1  = _fjsp_shuffle_v2r8(mem_xy,mem_xy,GMX_FJSP_SHUFFLE2(1,1));
250     *z1  = _fjsp_shuffle_v2r8(mem_z,mem_z,GMX_FJSP_SHUFFLE2(0,0));
251 }
252
253
254 static gmx_inline void
255 gmx_fjsp_load_shift_and_3rvec_broadcast_v2r8(const double * gmx_restrict xyz_shift,
256                                          const double * gmx_restrict xyz,
257                                          _fjsp_v2r8 * gmx_restrict x1, _fjsp_v2r8 * gmx_restrict y1, _fjsp_v2r8 * gmx_restrict z1,
258                                          _fjsp_v2r8 * gmx_restrict x2, _fjsp_v2r8 * gmx_restrict y2, _fjsp_v2r8 * gmx_restrict z2,
259                                          _fjsp_v2r8 * gmx_restrict x3, _fjsp_v2r8 * gmx_restrict y3, _fjsp_v2r8 * gmx_restrict z3)
260 {
261     _fjsp_v2r8 t1,t2,t3,t4,t5,sxy,sz,szx,syz;
262     
263     t1  = _fjsp_load_v2r8(xyz);
264     t2  = _fjsp_load_v2r8(xyz+2);
265     t3  = _fjsp_load_v2r8(xyz+4);
266     t4  = _fjsp_load_v2r8(xyz+6);
267     t5  = _fjsp_loadl_v2r8(_fjsp_setzero_v2r8(),xyz+8);
268     
269     sxy = _fjsp_load_v2r8(xyz_shift);
270     sz  = _fjsp_loadl_v2r8(_fjsp_setzero_v2r8(),xyz_shift+2);
271     szx = _fjsp_shuffle_v2r8(sz,sxy,GMX_FJSP_SHUFFLE2(0,0));
272     syz = _fjsp_shuffle_v2r8(sxy,sz,GMX_FJSP_SHUFFLE2(0,1));
273     
274     t1  = _fjsp_add_v2r8(t1,sxy);
275     t2  = _fjsp_add_v2r8(t2,szx);
276     t3  = _fjsp_add_v2r8(t3,syz);
277     t4  = _fjsp_add_v2r8(t4,sxy);
278     t5  = _fjsp_add_v2r8(t5,sz);
279     
280     *x1  = _fjsp_shuffle_v2r8(t1,t1,GMX_FJSP_SHUFFLE2(0,0));
281     *y1  = _fjsp_shuffle_v2r8(t1,t1,GMX_FJSP_SHUFFLE2(1,1));
282     *z1  = _fjsp_shuffle_v2r8(t2,t2,GMX_FJSP_SHUFFLE2(0,0));
283     *x2  = _fjsp_shuffle_v2r8(t2,t2,GMX_FJSP_SHUFFLE2(1,1));
284     *y2  = _fjsp_shuffle_v2r8(t3,t3,GMX_FJSP_SHUFFLE2(0,0));
285     *z2  = _fjsp_shuffle_v2r8(t3,t3,GMX_FJSP_SHUFFLE2(1,1));
286     *x3  = _fjsp_shuffle_v2r8(t4,t4,GMX_FJSP_SHUFFLE2(0,0));
287     *y3  = _fjsp_shuffle_v2r8(t4,t4,GMX_FJSP_SHUFFLE2(1,1));
288     *z3  = _fjsp_shuffle_v2r8(t5,t5,GMX_FJSP_SHUFFLE2(0,0));
289 }
290
291
292 static gmx_inline void
293 gmx_fjsp_load_shift_and_4rvec_broadcast_v2r8(const double * gmx_restrict xyz_shift,
294                                          const double * gmx_restrict xyz,
295                                          _fjsp_v2r8 * gmx_restrict x1, _fjsp_v2r8 * gmx_restrict y1, _fjsp_v2r8 * gmx_restrict z1,
296                                          _fjsp_v2r8 * gmx_restrict x2, _fjsp_v2r8 * gmx_restrict y2, _fjsp_v2r8 * gmx_restrict z2,
297                                          _fjsp_v2r8 * gmx_restrict x3, _fjsp_v2r8 * gmx_restrict y3, _fjsp_v2r8 * gmx_restrict z3,
298                                          _fjsp_v2r8 * gmx_restrict x4, _fjsp_v2r8 * gmx_restrict y4, _fjsp_v2r8 * gmx_restrict z4)
299 {
300     _fjsp_v2r8 t1,t2,t3,t4,t5,t6,sxy,sz,szx,syz;
301     
302     t1  = _fjsp_load_v2r8(xyz);
303     t2  = _fjsp_load_v2r8(xyz+2);
304     t3  = _fjsp_load_v2r8(xyz+4);
305     t4  = _fjsp_load_v2r8(xyz+6);
306     t5  = _fjsp_load_v2r8(xyz+8);
307     t6  = _fjsp_load_v2r8(xyz+10);
308     
309     sxy = _fjsp_load_v2r8(xyz_shift);
310     sz  = _fjsp_loadl_v2r8(_fjsp_setzero_v2r8(),xyz_shift+2);
311     szx = _fjsp_shuffle_v2r8(sz,sxy,GMX_FJSP_SHUFFLE2(0,0));
312     syz = _fjsp_shuffle_v2r8(sxy,sz,GMX_FJSP_SHUFFLE2(0,1));
313     
314     t1  = _fjsp_add_v2r8(t1,sxy);
315     t2  = _fjsp_add_v2r8(t2,szx);
316     t3  = _fjsp_add_v2r8(t3,syz);
317     t4  = _fjsp_add_v2r8(t4,sxy);
318     t5  = _fjsp_add_v2r8(t5,szx);
319     t6  = _fjsp_add_v2r8(t6,syz);
320     
321     *x1  = _fjsp_shuffle_v2r8(t1,t1,GMX_FJSP_SHUFFLE2(0,0));
322     *y1  = _fjsp_shuffle_v2r8(t1,t1,GMX_FJSP_SHUFFLE2(1,1));
323     *z1  = _fjsp_shuffle_v2r8(t2,t2,GMX_FJSP_SHUFFLE2(0,0));
324     *x2  = _fjsp_shuffle_v2r8(t2,t2,GMX_FJSP_SHUFFLE2(1,1));
325     *y2  = _fjsp_shuffle_v2r8(t3,t3,GMX_FJSP_SHUFFLE2(0,0));
326     *z2  = _fjsp_shuffle_v2r8(t3,t3,GMX_FJSP_SHUFFLE2(1,1));
327     *x3  = _fjsp_shuffle_v2r8(t4,t4,GMX_FJSP_SHUFFLE2(0,0));
328     *y3  = _fjsp_shuffle_v2r8(t4,t4,GMX_FJSP_SHUFFLE2(1,1));
329     *z3  = _fjsp_shuffle_v2r8(t5,t5,GMX_FJSP_SHUFFLE2(0,0));
330     *x4  = _fjsp_shuffle_v2r8(t5,t5,GMX_FJSP_SHUFFLE2(1,1));
331     *y4  = _fjsp_shuffle_v2r8(t6,t6,GMX_FJSP_SHUFFLE2(0,0));
332     *z4  = _fjsp_shuffle_v2r8(t6,t6,GMX_FJSP_SHUFFLE2(1,1));
333 }
334
335
336
337 static gmx_inline void
338 gmx_fjsp_load_1rvec_1ptr_swizzle_v2r8(const double * gmx_restrict p1,
339                                   _fjsp_v2r8 * gmx_restrict x, _fjsp_v2r8 * gmx_restrict y, _fjsp_v2r8 * gmx_restrict z)
340 {
341          *x            = _fjsp_loadl_v2r8(_fjsp_setzero_v2r8(),p1);
342      *y            = _fjsp_loadl_v2r8(_fjsp_setzero_v2r8(),p1+1);
343      *z            = _fjsp_loadl_v2r8(_fjsp_setzero_v2r8(),p1+2);
344 }
345
346 static gmx_inline void
347 gmx_fjsp_load_3rvec_1ptr_swizzle_v2r8(const double * gmx_restrict p1,
348                                   _fjsp_v2r8 * gmx_restrict x1, _fjsp_v2r8 * gmx_restrict y1, _fjsp_v2r8 * gmx_restrict z1,
349                                   _fjsp_v2r8 * gmx_restrict x2, _fjsp_v2r8 * gmx_restrict y2, _fjsp_v2r8 * gmx_restrict z2,
350                                   _fjsp_v2r8 * gmx_restrict x3, _fjsp_v2r8 * gmx_restrict y3, _fjsp_v2r8 * gmx_restrict z3)
351 {
352          *x1            = _fjsp_loadl_v2r8(_fjsp_setzero_v2r8(),p1);
353      *y1            = _fjsp_loadl_v2r8(_fjsp_setzero_v2r8(),p1+1);
354      *z1            = _fjsp_loadl_v2r8(_fjsp_setzero_v2r8(),p1+2);
355          *x2            = _fjsp_loadl_v2r8(_fjsp_setzero_v2r8(),p1+3);
356      *y2            = _fjsp_loadl_v2r8(_fjsp_setzero_v2r8(),p1+4);
357      *z2            = _fjsp_loadl_v2r8(_fjsp_setzero_v2r8(),p1+5);
358          *x3            = _fjsp_loadl_v2r8(_fjsp_setzero_v2r8(),p1+6);
359      *y3            = _fjsp_loadl_v2r8(_fjsp_setzero_v2r8(),p1+7);
360      *z3            = _fjsp_loadl_v2r8(_fjsp_setzero_v2r8(),p1+8);
361 }
362
363 static gmx_inline void
364 gmx_fjsp_load_4rvec_1ptr_swizzle_v2r8(const double * gmx_restrict p1,
365                                   _fjsp_v2r8 * gmx_restrict x1, _fjsp_v2r8 * gmx_restrict y1, _fjsp_v2r8 * gmx_restrict z1,
366                                   _fjsp_v2r8 * gmx_restrict x2, _fjsp_v2r8 * gmx_restrict y2, _fjsp_v2r8 * gmx_restrict z2,
367                                   _fjsp_v2r8 * gmx_restrict x3, _fjsp_v2r8 * gmx_restrict y3, _fjsp_v2r8 * gmx_restrict z3,
368                                   _fjsp_v2r8 * gmx_restrict x4, _fjsp_v2r8 * gmx_restrict y4, _fjsp_v2r8 * gmx_restrict z4)
369 {
370     *x1            = _fjsp_loadl_v2r8(_fjsp_setzero_v2r8(),p1);
371     *y1            = _fjsp_loadl_v2r8(_fjsp_setzero_v2r8(),p1+1);
372     *z1            = _fjsp_loadl_v2r8(_fjsp_setzero_v2r8(),p1+2);
373     *x2            = _fjsp_loadl_v2r8(_fjsp_setzero_v2r8(),p1+3);
374     *y2            = _fjsp_loadl_v2r8(_fjsp_setzero_v2r8(),p1+4);
375     *z2            = _fjsp_loadl_v2r8(_fjsp_setzero_v2r8(),p1+5);
376     *x3            = _fjsp_loadl_v2r8(_fjsp_setzero_v2r8(),p1+6);
377     *y3            = _fjsp_loadl_v2r8(_fjsp_setzero_v2r8(),p1+7);
378     *z3            = _fjsp_loadl_v2r8(_fjsp_setzero_v2r8(),p1+8);
379     *x4            = _fjsp_loadl_v2r8(_fjsp_setzero_v2r8(),p1+9);
380     *y4            = _fjsp_loadl_v2r8(_fjsp_setzero_v2r8(),p1+10);
381     *z4            = _fjsp_loadl_v2r8(_fjsp_setzero_v2r8(),p1+11);
382 }
383
384
385 static gmx_inline void
386 gmx_fjsp_load_1rvec_2ptr_swizzle_v2r8(const double * gmx_restrict ptrA,
387                                   const double * gmx_restrict ptrB,
388                                   _fjsp_v2r8 * gmx_restrict x1, _fjsp_v2r8 * gmx_restrict y1, _fjsp_v2r8 * gmx_restrict z1)
389 {
390     _fjsp_v2r8 t1,t2,t3,t4;
391     t1           = _fjsp_load_v2r8(ptrA);
392     t2           = _fjsp_load_v2r8(ptrB);
393     t3           = _fjsp_loadl_v2r8(_fjsp_setzero_v2r8(),ptrA+2);
394     t4           = _fjsp_loadl_v2r8(_fjsp_setzero_v2r8(),ptrB+2);
395     GMX_FJSP_TRANSPOSE2_V2R8(t1,t2);
396     *x1          = t1;
397     *y1          = t2;
398     *z1          = _fjsp_unpacklo_v2r8(t3,t4);
399 }
400
401 static gmx_inline void
402 gmx_fjsp_load_3rvec_2ptr_swizzle_v2r8(const double * gmx_restrict ptrA, const double * gmx_restrict ptrB,
403                                   _fjsp_v2r8 * gmx_restrict x1, _fjsp_v2r8 * gmx_restrict y1, _fjsp_v2r8 * gmx_restrict z1,
404                                   _fjsp_v2r8 * gmx_restrict x2, _fjsp_v2r8 * gmx_restrict y2, _fjsp_v2r8 * gmx_restrict z2,
405                                   _fjsp_v2r8 * gmx_restrict x3, _fjsp_v2r8 * gmx_restrict y3, _fjsp_v2r8 * gmx_restrict z3)
406 {
407 _fjsp_v2r8 t1,t2,t3,t4,t5,t6,t7,t8,t9,t10;
408     t1           = _fjsp_load_v2r8(ptrA);
409     t2           = _fjsp_load_v2r8(ptrB);
410     t3           = _fjsp_load_v2r8(ptrA+2);
411     t4           = _fjsp_load_v2r8(ptrB+2);
412     t5           = _fjsp_load_v2r8(ptrA+4);
413     t6           = _fjsp_load_v2r8(ptrB+4);
414     t7           = _fjsp_load_v2r8(ptrA+6);
415     t8           = _fjsp_load_v2r8(ptrB+6);
416     t9           = _fjsp_loadl_v2r8(_fjsp_setzero_v2r8(),ptrA+8);
417     t10          = _fjsp_loadl_v2r8(_fjsp_setzero_v2r8(),ptrB+8);
418     GMX_FJSP_TRANSPOSE2_V2R8(t1,t2);
419     GMX_FJSP_TRANSPOSE2_V2R8(t3,t4);
420     GMX_FJSP_TRANSPOSE2_V2R8(t5,t6);
421     GMX_FJSP_TRANSPOSE2_V2R8(t7,t8);
422     *x1          = t1;
423     *y1          = t2;
424     *z1          = t3;
425     *x2          = t4;
426     *y2          = t5;
427     *z2          = t6;
428     *x3          = t7;
429     *y3          = t8;
430     *z3          = _fjsp_unpacklo_v2r8(t9,t10);
431 }
432
433
434 static gmx_inline void
435 gmx_fjsp_load_4rvec_2ptr_swizzle_v2r8(const double * gmx_restrict ptrA, const double * gmx_restrict ptrB,
436                                   _fjsp_v2r8 * gmx_restrict x1, _fjsp_v2r8 * gmx_restrict y1, _fjsp_v2r8 * gmx_restrict z1,
437                                   _fjsp_v2r8 * gmx_restrict x2, _fjsp_v2r8 * gmx_restrict y2, _fjsp_v2r8 * gmx_restrict z2,
438                                   _fjsp_v2r8 * gmx_restrict x3, _fjsp_v2r8 * gmx_restrict y3, _fjsp_v2r8 * gmx_restrict z3,
439                                   _fjsp_v2r8 * gmx_restrict x4, _fjsp_v2r8 * gmx_restrict y4, _fjsp_v2r8 * gmx_restrict z4)
440 {
441     _fjsp_v2r8 t1,t2,t3,t4,t5,t6;
442     t1           = _fjsp_load_v2r8(ptrA);
443     t2           = _fjsp_load_v2r8(ptrB);
444     t3           = _fjsp_load_v2r8(ptrA+2);
445     t4           = _fjsp_load_v2r8(ptrB+2);
446     t5           = _fjsp_load_v2r8(ptrA+4);
447     t6           = _fjsp_load_v2r8(ptrB+4);
448     GMX_FJSP_TRANSPOSE2_V2R8(t1,t2);
449     GMX_FJSP_TRANSPOSE2_V2R8(t3,t4);
450     GMX_FJSP_TRANSPOSE2_V2R8(t5,t6);
451     *x1          = t1;
452     *y1          = t2;
453     *z1          = t3;
454     *x2          = t4;
455     *y2          = t5;
456     *z2          = t6;
457     t1           = _fjsp_load_v2r8(ptrA+6);
458     t2           = _fjsp_load_v2r8(ptrB+6);
459     t3           = _fjsp_load_v2r8(ptrA+8);
460     t4           = _fjsp_load_v2r8(ptrB+8);
461     t5           = _fjsp_load_v2r8(ptrA+10);
462     t6           = _fjsp_load_v2r8(ptrB+10);
463     GMX_FJSP_TRANSPOSE2_V2R8(t1,t2);
464     GMX_FJSP_TRANSPOSE2_V2R8(t3,t4);
465     GMX_FJSP_TRANSPOSE2_V2R8(t5,t6);
466     *x3          = t1;
467     *y3          = t2;
468     *z3          = t3;
469     *x4          = t4;
470     *y4          = t5;
471     *z4          = t6;
472 }
473
474
475 static void
476 gmx_fjsp_decrement_1rvec_1ptr_swizzle_v2r8(double * gmx_restrict ptrA,
477                                        _fjsp_v2r8 x1, _fjsp_v2r8 y1, _fjsp_v2r8 z1)
478 {
479     _fjsp_v2r8 t1,t2,t3;
480     
481     t1           = _fjsp_loadl_v2r8(_fjsp_setzero_v2r8(),ptrA);
482     t2           = _fjsp_loadl_v2r8(_fjsp_setzero_v2r8(),ptrA+1);
483     t3           = _fjsp_loadl_v2r8(_fjsp_setzero_v2r8(),ptrA+2);
484     
485     t1           = _fjsp_sub_v2r8(t1,x1);
486     t2           = _fjsp_sub_v2r8(t2,y1);
487     t3           = _fjsp_sub_v2r8(t3,z1);
488     _fjsp_storel_v2r8(ptrA,t1);
489     _fjsp_storel_v2r8(ptrA+1,t2);
490     _fjsp_storel_v2r8(ptrA+2,t3);
491 }
492
493 static void
494 gmx_fjsp_decrement_fma_1rvec_1ptr_swizzle_v2r8(double * gmx_restrict ptrA, _fjsp_v2r8 fscal,
495                                            _fjsp_v2r8 dx1, _fjsp_v2r8 dy1, _fjsp_v2r8 dz1)
496 {
497   _fjsp_v2r8 t1,t2,t3;
498
499   t1           = _fjsp_loadl_v2r8(_fjsp_setzero_v2r8(),ptrA);
500   t2           = _fjsp_loadl_v2r8(_fjsp_setzero_v2r8(),ptrA+1);
501   t3           = _fjsp_loadl_v2r8(_fjsp_setzero_v2r8(),ptrA+2);
502
503   t1           = _fjsp_nmsub_v2r8(fscal,dx1,t1);
504   t2           = _fjsp_nmsub_v2r8(fscal,dy1,t2);
505   t3           = _fjsp_nmsub_v2r8(fscal,dz1,t3);
506   _fjsp_storel_v2r8(ptrA,t1);
507   _fjsp_storel_v2r8(ptrA+1,t2);
508   _fjsp_storel_v2r8(ptrA+2,t3);
509 }
510
511
512 static void
513 gmx_fjsp_decrement_3rvec_1ptr_swizzle_v2r8(double * gmx_restrict ptrA,
514                                        _fjsp_v2r8 x1, _fjsp_v2r8 y1, _fjsp_v2r8 z1,
515                                        _fjsp_v2r8 x2, _fjsp_v2r8 y2, _fjsp_v2r8 z2,
516                                        _fjsp_v2r8 x3, _fjsp_v2r8 y3, _fjsp_v2r8 z3) 
517 {
518     _fjsp_v2r8 t1,t2,t3,t4,t5;
519     
520     t1          = _fjsp_load_v2r8(ptrA);
521     t2          = _fjsp_load_v2r8(ptrA+2);
522     t3          = _fjsp_load_v2r8(ptrA+4);
523     t4          = _fjsp_load_v2r8(ptrA+6);
524     t5          = _fjsp_loadl_v2r8(_fjsp_setzero_v2r8(),ptrA+8);
525     
526     x1          = _fjsp_unpacklo_v2r8(x1,y1);
527     z1          = _fjsp_unpacklo_v2r8(z1,x2);
528     y2          = _fjsp_unpacklo_v2r8(y2,z2);
529     x3          = _fjsp_unpacklo_v2r8(x3,y3);
530     /* nothing to be done for z3 */
531     
532     t1          = _fjsp_sub_v2r8(t1,x1);
533     t2          = _fjsp_sub_v2r8(t2,z1);
534     t3          = _fjsp_sub_v2r8(t3,y2);
535     t4          = _fjsp_sub_v2r8(t4,x3);
536     t5          = _fjsp_sub_v2r8(t5,z3);
537     _fjsp_storel_v2r8(ptrA,t1);
538     _fjsp_storeh_v2r8(ptrA+1,t1);
539     _fjsp_storel_v2r8(ptrA+2,t2);
540     _fjsp_storeh_v2r8(ptrA+3,t2);
541     _fjsp_storel_v2r8(ptrA+4,t3);
542     _fjsp_storeh_v2r8(ptrA+5,t3);
543     _fjsp_storel_v2r8(ptrA+6,t4);
544     _fjsp_storeh_v2r8(ptrA+7,t4);
545     _fjsp_storel_v2r8(ptrA+8,t5);
546 }
547
548
549 static void
550 gmx_fjsp_decrement_4rvec_1ptr_swizzle_v2r8(double * gmx_restrict ptrA,
551                                        _fjsp_v2r8 x1, _fjsp_v2r8 y1, _fjsp_v2r8 z1,
552                                        _fjsp_v2r8 x2, _fjsp_v2r8 y2, _fjsp_v2r8 z2,
553                                        _fjsp_v2r8 x3, _fjsp_v2r8 y3, _fjsp_v2r8 z3,
554                                        _fjsp_v2r8 x4, _fjsp_v2r8 y4, _fjsp_v2r8 z4) 
555 {
556     _fjsp_v2r8 t1,t2,t3,t4,t5,t6;
557     
558     t1          = _fjsp_load_v2r8(ptrA);
559     t2          = _fjsp_load_v2r8(ptrA+2);
560     t3          = _fjsp_load_v2r8(ptrA+4);
561     t4          = _fjsp_load_v2r8(ptrA+6);
562     t5          = _fjsp_load_v2r8(ptrA+8);
563     t6          = _fjsp_load_v2r8(ptrA+10);
564     
565     x1          = _fjsp_unpacklo_v2r8(x1,y1);
566     z1          = _fjsp_unpacklo_v2r8(z1,x2);
567     y2          = _fjsp_unpacklo_v2r8(y2,z2);
568     x3          = _fjsp_unpacklo_v2r8(x3,y3);
569     z3          = _fjsp_unpacklo_v2r8(z3,x4);
570     y4          = _fjsp_unpacklo_v2r8(y4,z4);
571     
572     _fjsp_storel_v2r8(ptrA,    _fjsp_sub_v2r8( t1,x1 ));
573     _fjsp_storeh_v2r8(ptrA+1,  _fjsp_sub_v2r8( t1,x1 ));
574     _fjsp_storel_v2r8(ptrA+2,  _fjsp_sub_v2r8( t2,z1 ));
575     _fjsp_storeh_v2r8(ptrA+3,  _fjsp_sub_v2r8( t2,z1 ));
576     _fjsp_storel_v2r8(ptrA+4,  _fjsp_sub_v2r8( t3,y2 ));
577     _fjsp_storeh_v2r8(ptrA+5,  _fjsp_sub_v2r8( t3,y2 ));
578     _fjsp_storel_v2r8(ptrA+6,  _fjsp_sub_v2r8( t4,x3 ));
579     _fjsp_storeh_v2r8(ptrA+7,  _fjsp_sub_v2r8( t4,x3 ));
580     _fjsp_storel_v2r8(ptrA+8,  _fjsp_sub_v2r8( t5,z3 ));
581     _fjsp_storeh_v2r8(ptrA+9,  _fjsp_sub_v2r8( t5,z3 ));
582     _fjsp_storel_v2r8(ptrA+10, _fjsp_sub_v2r8( t6,y4 ));
583     _fjsp_storeh_v2r8(ptrA+11, _fjsp_sub_v2r8( t6,y4 ));
584 }
585
586 static void
587 gmx_fjsp_decrement_1rvec_2ptr_swizzle_v2r8(double * gmx_restrict ptrA, double * gmx_restrict ptrB,
588                                            _fjsp_v2r8 x1, _fjsp_v2r8 y1, _fjsp_v2r8 z1)
589 {
590   _fjsp_v2r8 t1,t2,t3,t4,t5,t6,t7;
591     
592   t1          = _fjsp_load_v2r8(ptrA);
593   t2          = _fjsp_loadl_v2r8(_fjsp_setzero_v2r8(),ptrA+2);
594   t3          = _fjsp_load_v2r8(ptrB);
595   t4          = _fjsp_loadl_v2r8(_fjsp_setzero_v2r8(),ptrB+2);
596     
597   t5          = _fjsp_unpacklo_v2r8(x1,y1);
598   t6          = _fjsp_unpackhi_v2r8(x1,y1);
599   t7          = _fjsp_unpackhi_v2r8(z1,z1);
600     
601   t1          = _fjsp_sub_v2r8(t1,t5);
602   t2          = _fjsp_sub_v2r8(t2,z1);
603     
604   t3          = _fjsp_sub_v2r8(t3,t6);
605   t4          = _fjsp_sub_v2r8(t4,t7);
606     
607   _fjsp_storel_v2r8(ptrA,t1);
608   _fjsp_storeh_v2r8(ptrA+1,t1);
609   _fjsp_storel_v2r8(ptrA+2,t2);
610   _fjsp_storel_v2r8(ptrB,t3);
611   _fjsp_storeh_v2r8(ptrB+1,t3);
612   _fjsp_storel_v2r8(ptrB+2,t4);
613 }
614
615
616 static void
617 gmx_fjsp_decrement_fma_1rvec_2ptr_swizzle_v2r8(double * gmx_restrict ptrA, double * gmx_restrict ptrB,
618                                                _fjsp_v2r8 fscal, _fjsp_v2r8 dx1, _fjsp_v2r8 dy1, _fjsp_v2r8 dz1)
619 {
620   _fjsp_v2r8 t1,t2,t3,t4,t5,t6,t7,fscalA,fscalB;
621     
622     t1          = _fjsp_load_v2r8(ptrA);
623     t2          = _fjsp_loadl_v2r8(_fjsp_setzero_v2r8(),ptrA+2);
624     t3          = _fjsp_load_v2r8(ptrB);
625     t4          = _fjsp_loadl_v2r8(_fjsp_setzero_v2r8(),ptrB+2);
626     fscalA      = _fjsp_unpacklo_v2r8(fscal,fscal);
627     fscalB      = _fjsp_unpackhi_v2r8(fscal,fscal);
628     
629     t5          = _fjsp_unpacklo_v2r8(dx1,dy1);
630     t6          = _fjsp_unpackhi_v2r8(dx1,dy1);
631     t7          = _fjsp_unpackhi_v2r8(dz1,dz1);
632     
633     t1          = _fjsp_nmsub_v2r8(fscalA,t5,t1);
634     t2          = _fjsp_nmsub_v2r8(fscalA,dz1,t2);
635     
636     t3          = _fjsp_nmsub_v2r8(fscalB,t6,t3);
637     t4          = _fjsp_nmsub_v2r8(fscalB,t7,t4);
638     
639     _fjsp_storel_v2r8(ptrA,t1);
640     _fjsp_storeh_v2r8(ptrA+1,t1);
641     _fjsp_storel_v2r8(ptrA+2,t2);
642     _fjsp_storel_v2r8(ptrB,t3);
643     _fjsp_storeh_v2r8(ptrB+1,t3);
644     _fjsp_storel_v2r8(ptrB+2,t4);
645 }
646
647
648 static void
649 gmx_fjsp_decrement_3rvec_2ptr_swizzle_v2r8(double * gmx_restrict ptrA, double * gmx_restrict ptrB,
650                                        _fjsp_v2r8 x1, _fjsp_v2r8 y1, _fjsp_v2r8 z1,
651                                        _fjsp_v2r8 x2, _fjsp_v2r8 y2, _fjsp_v2r8 z2,
652                                        _fjsp_v2r8 x3, _fjsp_v2r8 y3, _fjsp_v2r8 z3) 
653 {
654     _fjsp_v2r8 t1,t2,t3,t4,t5,t6,t7,t8,t9,t10;
655     _fjsp_v2r8 tA,tB,tC,tD,tE,tF,tG,tH,tI;
656     
657     t1          = _fjsp_load_v2r8(ptrA);
658     t2          = _fjsp_load_v2r8(ptrA+2);
659     t3          = _fjsp_load_v2r8(ptrA+4);
660     t4          = _fjsp_load_v2r8(ptrA+6);
661     t5          = _fjsp_loadl_v2r8(_fjsp_setzero_v2r8(),ptrA+8);
662     t6          = _fjsp_load_v2r8(ptrB);
663     t7          = _fjsp_load_v2r8(ptrB+2);
664     t8          = _fjsp_load_v2r8(ptrB+4);
665     t9          = _fjsp_load_v2r8(ptrB+6);
666     t10         = _fjsp_loadl_v2r8(_fjsp_setzero_v2r8(),ptrB+8);
667     
668     tA          = _fjsp_unpacklo_v2r8(x1,y1);
669     tB          = _fjsp_unpackhi_v2r8(x1,y1);
670     tC          = _fjsp_unpacklo_v2r8(z1,x2);
671     tD          = _fjsp_unpackhi_v2r8(z1,x2);
672     tE          = _fjsp_unpacklo_v2r8(y2,z2);
673     tF          = _fjsp_unpackhi_v2r8(y2,z2);
674     tG          = _fjsp_unpacklo_v2r8(x3,y3);
675     tH          = _fjsp_unpackhi_v2r8(x3,y3);
676     tI          = _fjsp_unpackhi_v2r8(z3,z3);
677     
678     t1          = _fjsp_sub_v2r8(t1,tA);
679     t2          = _fjsp_sub_v2r8(t2,tC);
680     t3          = _fjsp_sub_v2r8(t3,tE);
681     t4          = _fjsp_sub_v2r8(t4,tG);
682     t5          = _fjsp_sub_v2r8(t5,z3);
683     
684     t6          = _fjsp_sub_v2r8(t6,tB);
685     t7          = _fjsp_sub_v2r8(t7,tD);
686     t8          = _fjsp_sub_v2r8(t8,tF);
687     t9          = _fjsp_sub_v2r8(t9,tH);
688     t10         = _fjsp_sub_v2r8(t10,tI);
689     
690     _fjsp_storel_v2r8(ptrA,t1);
691     _fjsp_storeh_v2r8(ptrA+1,t1);
692     _fjsp_storel_v2r8(ptrA+2,t2);
693     _fjsp_storeh_v2r8(ptrA+3,t2);
694     _fjsp_storel_v2r8(ptrA+4,t3);
695     _fjsp_storeh_v2r8(ptrA+5,t3);
696     _fjsp_storel_v2r8(ptrA+6,t4);
697     _fjsp_storeh_v2r8(ptrA+7,t4);
698     _fjsp_storel_v2r8(ptrA+8,t5);
699     _fjsp_storel_v2r8(ptrB,t6);
700     _fjsp_storeh_v2r8(ptrB+1,t6);
701     _fjsp_storel_v2r8(ptrB+2,t7);
702     _fjsp_storeh_v2r8(ptrB+3,t7);
703     _fjsp_storel_v2r8(ptrB+4,t8);
704     _fjsp_storeh_v2r8(ptrB+5,t8);
705     _fjsp_storel_v2r8(ptrB+6,t9);
706     _fjsp_storeh_v2r8(ptrB+7,t9);
707     _fjsp_storel_v2r8(ptrB+8,t10);
708 }
709
710
711 static void
712 gmx_fjsp_decrement_4rvec_2ptr_swizzle_v2r8(double * gmx_restrict ptrA, double * gmx_restrict ptrB,
713                                        _fjsp_v2r8 x1, _fjsp_v2r8 y1, _fjsp_v2r8 z1,
714                                        _fjsp_v2r8 x2, _fjsp_v2r8 y2, _fjsp_v2r8 z2,
715                                        _fjsp_v2r8 x3, _fjsp_v2r8 y3, _fjsp_v2r8 z3,
716                                        _fjsp_v2r8 x4, _fjsp_v2r8 y4, _fjsp_v2r8 z4) 
717 {
718     _fjsp_v2r8 t1,t2,t3,t4,t5,t6,t7,t8,t9,t10,t11,t12;
719     _fjsp_v2r8 tA,tB,tC,tD,tE,tF,tG,tH,tI,tJ,tK,tL;
720     
721     t1          = _fjsp_load_v2r8(ptrA);
722     t2          = _fjsp_load_v2r8(ptrA+2);
723     t3          = _fjsp_load_v2r8(ptrA+4);
724     t4          = _fjsp_load_v2r8(ptrA+6);
725     t5          = _fjsp_load_v2r8(ptrA+8);
726     t6          = _fjsp_load_v2r8(ptrA+10);
727     t7          = _fjsp_load_v2r8(ptrB);
728     t8          = _fjsp_load_v2r8(ptrB+2);
729     t9          = _fjsp_load_v2r8(ptrB+4);
730     t10         = _fjsp_load_v2r8(ptrB+6);
731     t11         = _fjsp_load_v2r8(ptrB+8);
732     t12         = _fjsp_load_v2r8(ptrB+10);
733     
734     tA          = _fjsp_unpacklo_v2r8(x1,y1);
735     tB          = _fjsp_unpackhi_v2r8(x1,y1);
736     tC          = _fjsp_unpacklo_v2r8(z1,x2);
737     tD          = _fjsp_unpackhi_v2r8(z1,x2);
738     tE          = _fjsp_unpacklo_v2r8(y2,z2);
739     tF          = _fjsp_unpackhi_v2r8(y2,z2);
740     tG          = _fjsp_unpacklo_v2r8(x3,y3);
741     tH          = _fjsp_unpackhi_v2r8(x3,y3);
742     tI          = _fjsp_unpacklo_v2r8(z3,x4);
743     tJ          = _fjsp_unpackhi_v2r8(z3,x4);
744     tK          = _fjsp_unpacklo_v2r8(y4,z4);
745     tL          = _fjsp_unpackhi_v2r8(y4,z4);
746     
747     t1          = _fjsp_sub_v2r8(t1,tA);
748     t2          = _fjsp_sub_v2r8(t2,tC);
749     t3          = _fjsp_sub_v2r8(t3,tE);
750     t4          = _fjsp_sub_v2r8(t4,tG);
751     t5          = _fjsp_sub_v2r8(t5,tI);
752     t6          = _fjsp_sub_v2r8(t6,tK);
753     
754     t7          = _fjsp_sub_v2r8(t7,tB);
755     t8          = _fjsp_sub_v2r8(t8,tD);
756     t9          = _fjsp_sub_v2r8(t9,tF);
757     t10         = _fjsp_sub_v2r8(t10,tH);
758     t11         = _fjsp_sub_v2r8(t11,tJ);
759     t12         = _fjsp_sub_v2r8(t12,tL);
760     
761     _fjsp_storel_v2r8(ptrA,  t1);
762     _fjsp_storeh_v2r8(ptrA+1,t1);
763     _fjsp_storel_v2r8(ptrA+2,t2);
764     _fjsp_storeh_v2r8(ptrA+3,t2);
765     _fjsp_storel_v2r8(ptrA+4,t3);
766     _fjsp_storeh_v2r8(ptrA+5,t3);
767     _fjsp_storel_v2r8(ptrA+6,t4);
768     _fjsp_storeh_v2r8(ptrA+7,t4);
769     _fjsp_storel_v2r8(ptrA+8,t5);
770     _fjsp_storeh_v2r8(ptrA+9,t5);
771     _fjsp_storel_v2r8(ptrA+10,t6);
772     _fjsp_storeh_v2r8(ptrA+11,t6);
773     _fjsp_storel_v2r8(ptrB,  t7);
774     _fjsp_storeh_v2r8(ptrB+1,t7);
775     _fjsp_storel_v2r8(ptrB+2,t8);
776     _fjsp_storeh_v2r8(ptrB+3,t8);
777     _fjsp_storel_v2r8(ptrB+4,t9);
778     _fjsp_storeh_v2r8(ptrB+5,t9);
779     _fjsp_storel_v2r8(ptrB+6,t10);
780     _fjsp_storeh_v2r8(ptrB+7,t10);
781     _fjsp_storel_v2r8(ptrB+8,t11);
782     _fjsp_storeh_v2r8(ptrB+9,t11);
783     _fjsp_storel_v2r8(ptrB+10,t12);
784     _fjsp_storeh_v2r8(ptrB+11,t12);
785 }
786
787
788
789 static gmx_inline void
790 gmx_fjsp_update_iforce_1atom_swizzle_v2r8(_fjsp_v2r8 fix1, _fjsp_v2r8 fiy1, _fjsp_v2r8 fiz1,
791                                       double * gmx_restrict fptr,
792                                       double * gmx_restrict fshiftptr)
793 {
794     __m128d t1,t2,t3,t4;
795     
796     /* transpose data */
797     t1 = fix1;
798     fix1 = _fjsp_unpacklo_v2r8(fix1,fiy1); /* y0 x0 */
799     fiy1 = _fjsp_unpackhi_v2r8(t1,fiy1);   /* y1 x1 */
800     
801     fix1 = _fjsp_add_v2r8(fix1,fiy1);
802     fiz1 = _fjsp_add_v2r8( fiz1, _fjsp_unpackhi_v2r8(fiz1,fiz1 ));
803     
804     t4 = _fjsp_add_v2r8( _fjsp_load_v2r8(fptr), fix1 );
805     _fjsp_storel_v2r8( fptr, t4 );
806     _fjsp_storeh_v2r8( fptr+1, t4 );
807     _fjsp_storel_v2r8( fptr+2, _fjsp_add_v2r8( _fjsp_loadl_v2r8(_fjsp_setzero_v2r8(),fptr+2), fiz1 ));
808     
809     t4 = _fjsp_add_v2r8( _fjsp_load_v2r8(fshiftptr), fix1 );
810     _fjsp_storel_v2r8( fshiftptr, t4 );
811     _fjsp_storeh_v2r8( fshiftptr+1, t4 );
812     _fjsp_storel_v2r8( fshiftptr+2, _fjsp_add_v2r8( _fjsp_loadl_v2r8(_fjsp_setzero_v2r8(),fshiftptr+2), fiz1 ));
813 }
814
815 static gmx_inline void
816 gmx_fjsp_update_iforce_3atom_swizzle_v2r8(_fjsp_v2r8 fix1, _fjsp_v2r8 fiy1, _fjsp_v2r8 fiz1,
817                                       _fjsp_v2r8 fix2, _fjsp_v2r8 fiy2, _fjsp_v2r8 fiz2,
818                                       _fjsp_v2r8 fix3, _fjsp_v2r8 fiy3, _fjsp_v2r8 fiz3,
819                                       double * gmx_restrict fptr,
820                                       double * gmx_restrict fshiftptr)
821 {
822     __m128d t1,t2,t3,t4,t5,t6;
823     
824     /* transpose data */
825     GMX_FJSP_TRANSPOSE2_V2R8(fix1,fiy1);
826     GMX_FJSP_TRANSPOSE2_V2R8(fiz1,fix2);
827     GMX_FJSP_TRANSPOSE2_V2R8(fiy2,fiz2);
828     t1 = fix3;
829     fix3 = _fjsp_unpacklo_v2r8(fix3,fiy3); /* y0 x0 */
830     fiy3 = _fjsp_unpackhi_v2r8(t1,fiy3);   /* y1 x1 */
831     
832     fix1 = _fjsp_add_v2r8(fix1,fiy1);
833     fiz1 = _fjsp_add_v2r8(fiz1,fix2);
834     fiy2 = _fjsp_add_v2r8(fiy2,fiz2);
835     
836     fix3 = _fjsp_add_v2r8(fix3,fiy3);
837     fiz3 = _fjsp_add_v2r8( fiz3, _fjsp_unpackhi_v2r8(fiz3,fiz3));
838     
839     t3 = _fjsp_add_v2r8( _fjsp_load_v2r8(fptr), fix1 );
840     t4 = _fjsp_add_v2r8( _fjsp_load_v2r8(fptr+2), fiz1 );
841     t5 = _fjsp_add_v2r8( _fjsp_load_v2r8(fptr+4), fiy2 );
842     t6 = _fjsp_add_v2r8( _fjsp_load_v2r8(fptr+6), fix3 );
843
844     _fjsp_storel_v2r8( fptr,   t3 );
845     _fjsp_storeh_v2r8( fptr+1, t3 );
846     _fjsp_storel_v2r8( fptr+2, t4 );
847     _fjsp_storeh_v2r8( fptr+3, t4 );
848     _fjsp_storel_v2r8( fptr+4, t5 );
849     _fjsp_storeh_v2r8( fptr+5, t5 );
850     _fjsp_storel_v2r8( fptr+6, t6 );
851     _fjsp_storeh_v2r8( fptr+7, t6 );
852     _fjsp_storel_v2r8( fptr+8, _fjsp_add_v2r8( _fjsp_loadl_v2r8(_fjsp_setzero_v2r8(),fptr+8), fiz3 ));
853     
854     fix1 = _fjsp_add_v2r8(fix1,fix3);
855     t1   = _fjsp_shuffle_v2r8(fiz1,fiy2,GMX_FJSP_SHUFFLE2(0,1));
856     fix1 = _fjsp_add_v2r8(fix1,t1); /* x and y sums */
857     
858     t2   = _fjsp_shuffle_v2r8(fiy2,fiy2,GMX_FJSP_SHUFFLE2(1,1));
859     fiz1 = _fjsp_add_v2r8(fiz1,fiz3);
860     fiz1 = _fjsp_add_v2r8(fiz1,t2); /* z sum */
861     
862     t3 = _fjsp_add_v2r8( _fjsp_load_v2r8(fshiftptr), fix1 );
863     _fjsp_storel_v2r8( fshiftptr, t3 );
864     _fjsp_storeh_v2r8( fshiftptr+1, t3 );
865     _fjsp_storel_v2r8( fshiftptr+2, _fjsp_add_v2r8( _fjsp_loadl_v2r8(_fjsp_setzero_v2r8(),fshiftptr+2), fiz1 ));
866 }
867
868
869 static gmx_inline void
870 gmx_fjsp_update_iforce_4atom_swizzle_v2r8(_fjsp_v2r8 fix1, _fjsp_v2r8 fiy1, _fjsp_v2r8 fiz1,
871                                       _fjsp_v2r8 fix2, _fjsp_v2r8 fiy2, _fjsp_v2r8 fiz2,
872                                       _fjsp_v2r8 fix3, _fjsp_v2r8 fiy3, _fjsp_v2r8 fiz3,
873                                       _fjsp_v2r8 fix4, _fjsp_v2r8 fiy4, _fjsp_v2r8 fiz4,
874                                       double * gmx_restrict fptr,
875                                       double * gmx_restrict fshiftptr)
876 {
877     __m128d t1,t2,t3,t4,t5,t6,t7,t8;
878     
879     /* transpose data */
880     GMX_FJSP_TRANSPOSE2_V2R8(fix1,fiy1);
881     GMX_FJSP_TRANSPOSE2_V2R8(fiz1,fix2);
882     GMX_FJSP_TRANSPOSE2_V2R8(fiy2,fiz2);
883     GMX_FJSP_TRANSPOSE2_V2R8(fix3,fiy3);
884     GMX_FJSP_TRANSPOSE2_V2R8(fiz3,fix4);
885     GMX_FJSP_TRANSPOSE2_V2R8(fiy4,fiz4);
886     
887     fix1 = _fjsp_add_v2r8(fix1,fiy1);
888     fiz1 = _fjsp_add_v2r8(fiz1,fix2);
889     fiy2 = _fjsp_add_v2r8(fiy2,fiz2);
890     fix3 = _fjsp_add_v2r8(fix3,fiy3);
891     fiz3 = _fjsp_add_v2r8(fiz3,fix4);
892     fiy4 = _fjsp_add_v2r8(fiy4,fiz4);
893     
894     t3 = _fjsp_add_v2r8( _fjsp_load_v2r8(fptr),    fix1 );
895     t4 = _fjsp_add_v2r8( _fjsp_load_v2r8(fptr+2),  fiz1 );
896     t5 = _fjsp_add_v2r8( _fjsp_load_v2r8(fptr+4),  fiy2 );
897     t6 = _fjsp_add_v2r8( _fjsp_load_v2r8(fptr+6),  fix3 );
898     t7 = _fjsp_add_v2r8( _fjsp_load_v2r8(fptr+8),  fiz3 );
899     t8 = _fjsp_add_v2r8( _fjsp_load_v2r8(fptr+10), fiy4 );
900     _fjsp_storel_v2r8( fptr,    t3 );
901     _fjsp_storeh_v2r8( fptr+1,  t3 );
902     _fjsp_storel_v2r8( fptr+2,  t4 );
903     _fjsp_storeh_v2r8( fptr+3,  t4 );
904     _fjsp_storel_v2r8( fptr+4,  t5 );
905     _fjsp_storeh_v2r8( fptr+5,  t5 );
906     _fjsp_storel_v2r8( fptr+6,  t6 );
907     _fjsp_storeh_v2r8( fptr+7,  t6 );
908     _fjsp_storel_v2r8( fptr+8,  t7 );
909     _fjsp_storeh_v2r8( fptr+9,  t7 );
910     _fjsp_storel_v2r8( fptr+10, t8 );
911     _fjsp_storeh_v2r8( fptr+11, t8 );
912
913     t1 = _fjsp_shuffle_v2r8(fiz1,fiy2,GMX_FJSP_SHUFFLE2(0,1));
914     fix1 = _fjsp_add_v2r8(fix1,t1);
915     t2 = _fjsp_shuffle_v2r8(fiz3,fiy4,GMX_FJSP_SHUFFLE2(0,1));
916     fix3 = _fjsp_add_v2r8(fix3,t2);
917     fix1 = _fjsp_add_v2r8(fix1,fix3); /* x and y sums */
918     
919     fiz1 = _fjsp_add_v2r8(fiz1, _fjsp_unpackhi_v2r8(fiy2,fiy2));
920     fiz3 = _fjsp_add_v2r8(fiz3, _fjsp_unpackhi_v2r8(fiy4,fiy4));
921     fiz1 = _fjsp_add_v2r8(fiz1,fiz3); /* z sum */
922     
923     t3 = _fjsp_add_v2r8( _fjsp_load_v2r8(fshiftptr), fix1 );
924     _fjsp_storel_v2r8( fshiftptr, t3 );
925     _fjsp_storeh_v2r8( fshiftptr+1, t3 );
926     _fjsp_storel_v2r8( fshiftptr+2, _fjsp_add_v2r8( _fjsp_loadl_v2r8(_fjsp_setzero_v2r8(),fshiftptr+2), fiz1 ));
927 }
928
929
930
931 static gmx_inline void
932 gmx_fjsp_update_1pot_v2r8(_fjsp_v2r8 pot1, double * gmx_restrict ptrA)
933 {
934     pot1 = _fjsp_add_v2r8(pot1, _fjsp_unpackhi_v2r8(pot1,pot1));
935     _fjsp_storel_v2r8(ptrA,_fjsp_add_v2r8(pot1,_fjsp_loadl_v2r8(_fjsp_setzero_v2r8(),ptrA)));
936 }
937
938 static gmx_inline void
939 gmx_fjsp_update_2pot_v2r8(_fjsp_v2r8 pot1, double * gmx_restrict ptrA,
940                       _fjsp_v2r8 pot2, double * gmx_restrict ptrB)
941 {
942     GMX_FJSP_TRANSPOSE2_V2R8(pot1,pot2);
943     pot1 = _fjsp_add_v2r8(pot1,pot2);
944     pot2 = _fjsp_unpackhi_v2r8(pot1,pot1);
945     
946     _fjsp_storel_v2r8(ptrA,_fjsp_add_v2r8(pot1,_fjsp_loadl_v2r8(_fjsp_setzero_v2r8(),ptrA)));
947     _fjsp_storel_v2r8(ptrB,_fjsp_add_v2r8(pot2,_fjsp_loadl_v2r8(_fjsp_setzero_v2r8(),ptrB)));
948 }
949
950
951 #endif /* _kernelutil_sparc64_hpc_ace_double_h_ */