QDP++
sse_linalg_m_eq_hh_double.cc
Go to the documentation of this file.
1
6
7#include "qdp_diagnostics.h"
8
10#include <xmmintrin.h>
11
12namespace QDP {
13
14
15typedef union {
16 __m128d v;
17 double d[2];
18} VD;
20#include "qdp_config.h"
22#ifndef QDP_USE_SSE3
24 /* SSE 2 */
25#define CCMUL(z,x,y) \
26 { \
27 __m128d t1,t2,t3; \
28 __m128d t4 = _mm_set_pd( (double)(-1),(double)1 ); \
29 t1 = _mm_mul_pd(x,y); \
30 t2 = _mm_shuffle_pd(t1,t1,0x1); \
31 t3 = _mm_shuffle_pd(y,y,0x1);\
32 z = _mm_sub_pd(t1,t2); \
33 t2 = _mm_mul_pd(x,t3); \
34 t3 = _mm_shuffle_pd(t2,t2,0x1); \
35 t3 = _mm_add_pd(t2,t3); \
36 z= _mm_shuffle_pd(z,t3,0x2); \
37 z= _mm_mul_pd(z,t4); \
38 }
39
40#define CCMADD(z,x,y) \
41 { \
42 __m128d t1,t2,t3,t4; \
43 __m128d t5 = _mm_set_pd( (double)(-1),(double)1) ; \
44 t1 = _mm_mul_pd(x,y); \
45 t2 = _mm_shuffle_pd(t1,t1,0x1); \
46 t3 = _mm_shuffle_pd(y,y,0x1);\
47 t4 = _mm_sub_pd(t1,t2); \
48 t2 = _mm_mul_pd(x,t3); \
49 t3 = _mm_shuffle_pd(t2,t2,0x1); \
50 t3 = _mm_add_pd(t2,t3); \
51 t4= _mm_shuffle_pd(t4,t3,0x2); \
52 t4= _mm_mul_pd(t5, t4); \
53 z = _mm_add_pd(z,t4); \
54 }
55
56#else
57QDPXX_MESSAGE("Using SSE3")
58 /* SSE 3 */
59#include <pmmintrin.h>
60#define CCMUL(z,x,y) \
61 { \
62 __m128d t1; \
63 __m128d t2 = _mm_set_pd((double)(-1),(double)1); \
64 t1 = _mm_mul_pd((x),(y)); \
65 (z) = _mm_hsub_pd(t1,t1); \
66 t1 = _mm_shuffle_pd((y),(y),0x1);\
67 t1 = _mm_mul_pd((x),t1); \
68 t1 = _mm_hadd_pd(t1,t1); \
69 (z)= _mm_shuffle_pd((z),t1,0x2); \
70 (z)= _mm_mul_pd((z),t2); \
71 }
72#define CCMADD(z,x,y) \
73 { \
74 __m128d t1,t2; \
75 __m128d t3 = _mm_set_pd((double)(-1), (double)1); \
76 t1 = _mm_mul_pd((x),(y)); \
77 t1 = _mm_hsub_pd(t1,t1); \
78 t2 = _mm_shuffle_pd((y),(y),0x1);\
79 t2 = _mm_mul_pd((x),t2); \
80 t2 = _mm_hadd_pd(t2,t2); \
81 t1= _mm_shuffle_pd(t1,t2,0x2); \
82 t1= _mm_mul_pd(t3,t1); \
83 (z) = _mm_add_pd((z),t1); \
84 }
85
86#endif
87
88 // UNALIGNED
89
90 /* M3 = M1*adj(M2) */
91 void ssed_m_eq_hh_u(REAL64* m3, REAL64* m2, REAL64* m1, int n_mat)
92 {
93 __m128d m1_1;
94 __m128d m1_2;
95 __m128d m1_3;
96
97 __m128d m2_1;
98 __m128d m2_2;
99 __m128d m2_3;
100
101 __m128d m3_11;
102 __m128d m3_12;
103 __m128d m3_13;
104
105
106 REAL64* m1_p=m1;
107 REAL64* m2_p=m2;
108 REAL64* m3_p=m3;
109
110
111 for(int i=0; i < n_mat; i++) {
112 m1_1 = _mm_loadu_pd(m1_p);
113 m1_2 = _mm_loadu_pd(m1_p+2);
114 m1_3 = _mm_loadu_pd(m1_p+4);
115
116 m2_1 = _mm_loadu_pd(m2_p);
117 m2_2 = _mm_loadu_pd(m2_p+6);
118 m2_3 = _mm_loadu_pd(m2_p+12);
119
120
121 CCMUL(m3_11, m2_1, m1_1);
122 m1_1 = _mm_loadu_pd(m1_p+6);
123 CCMADD(m3_11, m2_2, m1_2);
124 m1_2 = _mm_loadu_pd(m1_p+8);
125 CCMADD(m3_11, m2_3, m1_3);
126 m1_3 = _mm_loadu_pd(m1_p+10);
127
128
129 CCMUL(m3_12, m2_1, m1_1);
130 m1_1 = _mm_loadu_pd(m1_p+12);
131 CCMADD(m3_12, m2_2, m1_2);
132 m1_2 = _mm_loadu_pd(m1_p+14);
133 CCMADD(m3_12, m2_3, m1_3);
134 m1_3 = _mm_loadu_pd(m1_p+16);
135
136
137 CCMUL(m3_13, m2_1, m1_1);
138 m2_1 = _mm_loadu_pd(m2_p+2);
139 CCMADD(m3_13, m2_2, m1_2)
140 m2_2 = _mm_loadu_pd(m2_p+8);
141 CCMADD(m3_13, m2_3, m1_3);
142 m2_3 = _mm_loadu_pd(m2_p+14);
143
144 _mm_storeu_pd(m3_p, m3_11);
145 _mm_storeu_pd(m3_p+2, m3_12);
146 _mm_storeu_pd(m3_p+4, m3_13);
147
148 m1_1 = _mm_loadu_pd(m1_p);
149 m1_2 = _mm_loadu_pd(m1_p+2);
150 m1_3 = _mm_loadu_pd(m1_p+4);
151
152 CCMUL(m3_11, m2_1, m1_1);
153 m1_1 = _mm_loadu_pd(m1_p+6);
154 CCMADD(m3_11, m2_2, m1_2);
155 m1_2 = _mm_loadu_pd(m1_p+8);
156 CCMADD(m3_11, m2_3, m1_3);
157 m1_3 = _mm_loadu_pd(m1_p+10);
158
159
160 CCMUL(m3_12, m2_1, m1_1);
161 m1_1 = _mm_loadu_pd(m1_p+12);
162 CCMADD(m3_12, m2_2, m1_2);
163 m1_2 = _mm_loadu_pd(m1_p+14);
164 CCMADD(m3_12, m2_3, m1_3);
165 m1_3 = _mm_loadu_pd(m1_p+16);
166
167
168 CCMUL(m3_13, m2_1, m1_1);
169 m2_1 = _mm_loadu_pd(m2_p+4);
170 CCMADD(m3_13, m2_2, m1_2)
171 m2_2 = _mm_loadu_pd(m2_p+10);
172 CCMADD(m3_13, m2_3, m1_3);
173 m2_3 = _mm_loadu_pd(m2_p+16);
174
175 _mm_storeu_pd(m3_p+6, m3_11);
176 _mm_storeu_pd(m3_p+8, m3_12);
177 _mm_storeu_pd(m3_p+10, m3_13);
178
179 m1_1 = _mm_loadu_pd(m1_p);
180 m1_2 = _mm_loadu_pd(m1_p+2);
181 m1_3 = _mm_loadu_pd(m1_p+4);
182
183 CCMUL(m3_11, m2_1, m1_1);
184 m1_1 = _mm_loadu_pd(m1_p+6);
185 CCMADD(m3_11, m2_2, m1_2);
186 m1_2 = _mm_loadu_pd(m1_p+8);
187 CCMADD(m3_11, m2_3, m1_3);
188 m1_3 = _mm_loadu_pd(m1_p+10);
189
190 CCMUL(m3_12, m2_1, m1_1);
191 m1_1 = _mm_loadu_pd(m1_p+12);
192 CCMADD(m3_12, m2_2, m1_2);
193 m1_2 = _mm_loadu_pd(m1_p+14);
194 CCMADD(m3_12, m2_3, m1_3);
195 m1_3 = _mm_loadu_pd(m1_p+16);
196
197 CCMUL(m3_13, m2_1, m1_1);
198 CCMADD(m3_13, m2_2, m1_2);
199 CCMADD(m3_13, m2_3, m1_3);
200
201 _mm_storeu_pd(m3_p+12, m3_11);
202 _mm_storeu_pd(m3_p+14, m3_12);
203 _mm_storeu_pd(m3_p+16, m3_13);
204
205
206 /* Next matrix */
207 m1_p += 18; m2_p += 18; m3_p += 18;
208 }
209
210 }
211
212 /* M3 += a M1*M2 */
213 void ssed_m_peq_ahh_u(REAL64* m3, REAL64* a, REAL64* m2, REAL64* m1, int n_mat)
214 {
215 __m128d m1_1;
216 __m128d m1_2;
217 __m128d m1_3;
218
219 __m128d m2_1;
220 __m128d m2_2;
221 __m128d m2_3;
222
223 __m128d m3_11;
224 __m128d m3_12;
225 __m128d m3_13;
226
227 __m128d res1,res2,res3;
228
229 __m128d tmp1;
230 __m128d scalar;
231
232 // Load the scalar into low bytes of scalar
233 scalar = _mm_load_sd(a);
234
235 // cross components into tmp
236 // Zero tmp
237 tmp1 = _mm_setzero_pd();
238 tmp1 = _mm_shuffle_pd(scalar, scalar, 0x1);
239 scalar = _mm_add_pd(scalar, tmp1);
240
241
242 REAL64* m1_p=m1;
243 REAL64* m2_p=m2;
244 REAL64* m3_p=m3;
245
246
247 for(int i =0; i < n_mat; i++) {
248 m1_1 = _mm_loadu_pd(m1_p);
249 m1_2 = _mm_loadu_pd(m1_p+2);
250 m1_3 = _mm_loadu_pd(m1_p+4);
251
252
253 m2_1 = _mm_loadu_pd(m2_p);
254 m2_2 = _mm_loadu_pd(m2_p+6);
255 m2_3 = _mm_loadu_pd(m2_p+12);
256
257 res1 = _mm_loadu_pd(m3_p);
258 res2 = _mm_loadu_pd(m3_p+2);
259 res3 = _mm_loadu_pd(m3_p+4);
260
261
262 CCMUL(m3_11, m2_1, m1_1);
263 m1_1 = _mm_loadu_pd(m1_p+6);
264 CCMADD(m3_11, m2_2, m1_2);
265 m1_2 = _mm_loadu_pd(m1_p+8);
266 CCMADD(m3_11, m2_3, m1_3);
267 m1_3 = _mm_loadu_pd(m1_p+10);
268
269 m3_11 = _mm_mul_pd(scalar,m3_11);
270 m3_11 = _mm_add_pd(res1, m3_11);
271
272
273 CCMUL(m3_12, m2_1, m1_1);
274 m1_1 = _mm_loadu_pd(m1_p+12);
275 CCMADD(m3_12, m2_2, m1_2);
276 m1_2 = _mm_loadu_pd(m1_p+14);
277 CCMADD(m3_12, m2_3, m1_3);
278 m1_3 = _mm_loadu_pd(m1_p+16);
279
280 m3_12 = _mm_mul_pd(scalar,m3_12);
281 m3_12 = _mm_add_pd(res2, m3_12);
282
283
284
285 CCMUL(m3_13, m2_1, m1_1);
286 m2_1 = _mm_loadu_pd(m2_p+2);
287 CCMADD(m3_13, m2_2, m1_2)
288 m2_2 = _mm_loadu_pd(m2_p+8);
289 CCMADD(m3_13, m2_3, m1_3);
290 m2_3 = _mm_loadu_pd(m2_p+14);
291
292 m3_13 = _mm_mul_pd(scalar,m3_13);
293 m3_13 = _mm_add_pd(res3, m3_13);
294
295
296
297
298 _mm_storeu_pd(m3_p, m3_11);
299 _mm_storeu_pd(m3_p+2, m3_12);
300 _mm_storeu_pd(m3_p+4, m3_13);
301
302 res1 = _mm_loadu_pd(m3_p+6);
303 res2 = _mm_loadu_pd(m3_p+8);
304 res3 = _mm_loadu_pd(m3_p+10);
305
306 m1_1 = _mm_loadu_pd(m1_p);
307 m1_2 = _mm_loadu_pd(m1_p+2);
308 m1_3 = _mm_loadu_pd(m1_p+4);
309
310 CCMUL(m3_11, m2_1, m1_1);
311 m1_1 = _mm_loadu_pd(m1_p+6);
312 CCMADD(m3_11, m2_2, m1_2);
313 m1_2 = _mm_loadu_pd(m1_p+8);
314 CCMADD(m3_11, m2_3, m1_3);
315 m1_3 = _mm_loadu_pd(m1_p+10);
316
317 m3_11 = _mm_mul_pd(scalar,m3_11);
318 m3_11 = _mm_add_pd(res1, m3_11);
319
320
321 CCMUL(m3_12, m2_1, m1_1);
322 m1_1 = _mm_loadu_pd(m1_p+12);
323 CCMADD(m3_12, m2_2, m1_2);
324 m1_2 = _mm_loadu_pd(m1_p+14);
325 CCMADD(m3_12, m2_3, m1_3);
326 m1_3 = _mm_loadu_pd(m1_p+16);
327
328 m3_12 = _mm_mul_pd(scalar,m3_12);
329 m3_12 = _mm_add_pd(res2, m3_12);
330
331
332
333 CCMUL(m3_13, m2_1, m1_1);
334 m2_1 = _mm_loadu_pd(m2_p+4);
335 CCMADD(m3_13, m2_2, m1_2)
336 m2_2 = _mm_loadu_pd(m2_p+10);
337 CCMADD(m3_13, m2_3, m1_3);
338 m2_3 = _mm_loadu_pd(m2_p+16);
339
340 m3_13 = _mm_mul_pd(scalar,m3_13);
341 m3_13 = _mm_add_pd(res3, m3_13);
342
343
344
345 _mm_storeu_pd(m3_p+6, m3_11);
346 _mm_storeu_pd(m3_p+8, m3_12);
347 _mm_storeu_pd(m3_p+10, m3_13);
348 res1 = _mm_loadu_pd(m3_p+12);
349 res2 = _mm_loadu_pd(m3_p+14);
350 res3 = _mm_loadu_pd(m3_p+16);
351
352
353 m1_1 = _mm_loadu_pd(m1_p);
354 m1_2 = _mm_loadu_pd(m1_p+2);
355 m1_3 = _mm_loadu_pd(m1_p+4);
356
357 CCMUL(m3_11, m2_1, m1_1);
358 m1_1 = _mm_loadu_pd(m1_p+6);
359 CCMADD(m3_11, m2_2, m1_2);
360 m1_2 = _mm_loadu_pd(m1_p+8);
361 CCMADD(m3_11, m2_3, m1_3);
362 m1_3 = _mm_loadu_pd(m1_p+10);
363
364 m3_11 = _mm_mul_pd(scalar,m3_11);
365 m3_11 = _mm_add_pd(res1, m3_11);
366
367
368
369 CCMUL(m3_12, m2_1, m1_1);
370 m1_1 = _mm_loadu_pd(m1_p+12);
371 CCMADD(m3_12, m2_2, m1_2);
372 m1_2 = _mm_loadu_pd(m1_p+14);
373 CCMADD(m3_12, m2_3, m1_3);
374 m1_3 = _mm_loadu_pd(m1_p+16);
375
376 m3_12 = _mm_mul_pd(scalar,m3_12);
377 m3_12 = _mm_add_pd(res2, m3_12);
378
379 CCMUL(m3_13, m2_1, m1_1);
380 CCMADD(m3_13, m2_2, m1_2);
381 CCMADD(m3_13, m2_3, m1_3);
382
383 m3_13 = _mm_mul_pd(scalar,m3_13);
384 m3_13 = _mm_add_pd(res3, m3_13);
385
386 _mm_storeu_pd(m3_p+12, m3_11);
387 _mm_storeu_pd(m3_p+14, m3_12);
388 _mm_storeu_pd(m3_p+16, m3_13);
389
390 m1_p += 18; m2_p += 18; m3_p += 18;
391 }
392
393 }
394
395
396 /* ALIGNED */
397 /* M3 = M1*adj(M2) */
398 void ssed_m_eq_hh(REAL64* m3, REAL64* m2, REAL64* m1, int n_mat)
399 {
400 __m128d m1_1;
401 __m128d m1_2;
402 __m128d m1_3;
403
404 __m128d m2_1;
405 __m128d m2_2;
406 __m128d m2_3;
407
408 __m128d m3_11;
409 __m128d m3_12;
410 __m128d m3_13;
411
412
413 REAL64* m1_p=m1;
414 REAL64* m2_p=m2;
415 REAL64* m3_p=m3;
416
417
418
419 for(int i=0; i < n_mat; i++) {
420 m1_1 = _mm_load_pd(m1_p);
421 m1_2 = _mm_load_pd(m1_p+2);
422 m1_3 = _mm_load_pd(m1_p+4);
423
424 m2_1 = _mm_load_pd(m2_p);
425 m2_2 = _mm_load_pd(m2_p+6);
426 m2_3 = _mm_load_pd(m2_p+12);
427
428
429 CCMUL(m3_11, m2_1, m1_1);
430 m1_1 = _mm_load_pd(m1_p+6);
431 CCMADD(m3_11, m2_2, m1_2);
432 m1_2 = _mm_load_pd(m1_p+8);
433 CCMADD(m3_11, m2_3, m1_3);
434 m1_3 = _mm_load_pd(m1_p+10);
435
436
437 CCMUL(m3_12, m2_1, m1_1);
438 m1_1 = _mm_load_pd(m1_p+12);
439 CCMADD(m3_12, m2_2, m1_2);
440 m1_2 = _mm_load_pd(m1_p+14);
441 CCMADD(m3_12, m2_3, m1_3);
442 m1_3 = _mm_load_pd(m1_p+16);
443
444
445 CCMUL(m3_13, m2_1, m1_1);
446 m2_1 = _mm_load_pd(m2_p+2);
447 CCMADD(m3_13, m2_2, m1_2)
448 m2_2 = _mm_load_pd(m2_p+8);
449 CCMADD(m3_13, m2_3, m1_3);
450 m2_3 = _mm_load_pd(m2_p+14);
451
452 _mm_store_pd(m3_p, m3_11);
453 _mm_store_pd(m3_p+2, m3_12);
454 _mm_store_pd(m3_p+4, m3_13);
455
456 m1_1 = _mm_load_pd(m1_p);
457 m1_2 = _mm_load_pd(m1_p+2);
458 m1_3 = _mm_load_pd(m1_p+4);
459
460 CCMUL(m3_11, m2_1, m1_1);
461 m1_1 = _mm_load_pd(m1_p+6);
462 CCMADD(m3_11, m2_2, m1_2);
463 m1_2 = _mm_load_pd(m1_p+8);
464 CCMADD(m3_11, m2_3, m1_3);
465 m1_3 = _mm_load_pd(m1_p+10);
466
467
468 CCMUL(m3_12, m2_1, m1_1);
469 m1_1 = _mm_load_pd(m1_p+12);
470 CCMADD(m3_12, m2_2, m1_2);
471 m1_2 = _mm_load_pd(m1_p+14);
472 CCMADD(m3_12, m2_3, m1_3);
473 m1_3 = _mm_load_pd(m1_p+16);
474
475
476 CCMUL(m3_13, m2_1, m1_1);
477 m2_1 = _mm_load_pd(m2_p+4);
478 CCMADD(m3_13, m2_2, m1_2)
479 m2_2 = _mm_load_pd(m2_p+10);
480 CCMADD(m3_13, m2_3, m1_3);
481 m2_3 = _mm_load_pd(m2_p+16);
482
483 _mm_store_pd(m3_p+6, m3_11);
484 _mm_store_pd(m3_p+8, m3_12);
485 _mm_store_pd(m3_p+10, m3_13);
486
487 m1_1 = _mm_load_pd(m1_p);
488 m1_2 = _mm_load_pd(m1_p+2);
489 m1_3 = _mm_load_pd(m1_p+4);
490
491 CCMUL(m3_11, m2_1, m1_1);
492 m1_1 = _mm_load_pd(m1_p+6);
493 CCMADD(m3_11, m2_2, m1_2);
494 m1_2 = _mm_load_pd(m1_p+8);
495 CCMADD(m3_11, m2_3, m1_3);
496 m1_3 = _mm_load_pd(m1_p+10);
497
498 CCMUL(m3_12, m2_1, m1_1);
499 m1_1 = _mm_load_pd(m1_p+12);
500 CCMADD(m3_12, m2_2, m1_2);
501 m1_2 = _mm_load_pd(m1_p+14);
502 CCMADD(m3_12, m2_3, m1_3);
503 m1_3 = _mm_load_pd(m1_p+16);
504
505 CCMUL(m3_13, m2_1, m1_1);
506 CCMADD(m3_13, m2_2, m1_2);
507 CCMADD(m3_13, m2_3, m1_3);
508
509 _mm_store_pd(m3_p+12, m3_11);
510 _mm_store_pd(m3_p+14, m3_12);
511 _mm_store_pd(m3_p+16, m3_13);
512
513
514 /* Next matrix */
515 m1_p += 18; m2_p += 18; m3_p += 18;
516 }
517
518 }
519
520 /* M3 += a M1*M2 */
521 void ssed_m_peq_ahh(REAL64* m3, REAL64* a, REAL64* m2, REAL64* m1, int n_mat)
522 {
523 __m128d m1_1;
524 __m128d m1_2;
525 __m128d m1_3;
526
527 __m128d m2_1;
528 __m128d m2_2;
529 __m128d m2_3;
530
531 __m128d m3_11;
532 __m128d m3_12;
533 __m128d m3_13;
534
535 __m128d res1,res2,res3;
536
537 __m128d tmp1;
538 __m128d scalar;
539
540 // Load the scalar into low bytes of scalar
541 scalar = _mm_load_sd(a);
542
543 // cross components into tmp
544 // Zero tmp
545 tmp1 = _mm_setzero_pd();
546 tmp1 = _mm_shuffle_pd(scalar, scalar, 0x1);
547 scalar = _mm_add_pd(scalar, tmp1);
548
549
550 REAL64* m1_p=m1;
551 REAL64* m2_p=m2;
552 REAL64* m3_p=m3;
553
554 for(int i =0; i < n_mat; i++) {
555 m1_1 = _mm_load_pd(m1_p);
556 m1_2 = _mm_load_pd(m1_p+2);
557 m1_3 = _mm_load_pd(m1_p+4);
558
559
560 m2_1 = _mm_load_pd(m2_p);
561 m2_2 = _mm_load_pd(m2_p+6);
562 m2_3 = _mm_load_pd(m2_p+12);
563
564 res1 = _mm_load_pd(m3_p);
565 res2 = _mm_load_pd(m3_p+2);
566 res3 = _mm_load_pd(m3_p+4);
567
568
569 CCMUL(m3_11, m2_1, m1_1);
570 m1_1 = _mm_load_pd(m1_p+6);
571 CCMADD(m3_11, m2_2, m1_2);
572 m1_2 = _mm_load_pd(m1_p+8);
573 CCMADD(m3_11, m2_3, m1_3);
574 m1_3 = _mm_load_pd(m1_p+10);
575
576 m3_11 = _mm_mul_pd(scalar,m3_11);
577 m3_11 = _mm_add_pd(res1, m3_11);
578
579
580 CCMUL(m3_12, m2_1, m1_1);
581 m1_1 = _mm_load_pd(m1_p+12);
582 CCMADD(m3_12, m2_2, m1_2);
583 m1_2 = _mm_load_pd(m1_p+14);
584 CCMADD(m3_12, m2_3, m1_3);
585 m1_3 = _mm_load_pd(m1_p+16);
586
587 m3_12 = _mm_mul_pd(scalar,m3_12);
588 m3_12 = _mm_add_pd(res2, m3_12);
589
590
591
592 CCMUL(m3_13, m2_1, m1_1);
593 m2_1 = _mm_load_pd(m2_p+2);
594 CCMADD(m3_13, m2_2, m1_2)
595 m2_2 = _mm_load_pd(m2_p+8);
596 CCMADD(m3_13, m2_3, m1_3);
597 m2_3 = _mm_load_pd(m2_p+14);
598
599 m3_13 = _mm_mul_pd(scalar,m3_13);
600 m3_13 = _mm_add_pd(res3, m3_13);
601
602
603
604
605 _mm_store_pd(m3_p, m3_11);
606 _mm_store_pd(m3_p+2, m3_12);
607 _mm_store_pd(m3_p+4, m3_13);
608
609 res1 = _mm_load_pd(m3_p+6);
610 res2 = _mm_load_pd(m3_p+8);
611 res3 = _mm_load_pd(m3_p+10);
612
613 m1_1 = _mm_load_pd(m1_p);
614 m1_2 = _mm_load_pd(m1_p+2);
615 m1_3 = _mm_load_pd(m1_p+4);
616
617 CCMUL(m3_11, m2_1, m1_1);
618 m1_1 = _mm_load_pd(m1_p+6);
619 CCMADD(m3_11, m2_2, m1_2);
620 m1_2 = _mm_load_pd(m1_p+8);
621 CCMADD(m3_11, m2_3, m1_3);
622 m1_3 = _mm_load_pd(m1_p+10);
623
624 m3_11 = _mm_mul_pd(scalar,m3_11);
625 m3_11 = _mm_add_pd(res1, m3_11);
626
627
628 CCMUL(m3_12, m2_1, m1_1);
629 m1_1 = _mm_load_pd(m1_p+12);
630 CCMADD(m3_12, m2_2, m1_2);
631 m1_2 = _mm_load_pd(m1_p+14);
632 CCMADD(m3_12, m2_3, m1_3);
633 m1_3 = _mm_load_pd(m1_p+16);
634
635 m3_12 = _mm_mul_pd(scalar,m3_12);
636 m3_12 = _mm_add_pd(res2, m3_12);
637
638
639
640 CCMUL(m3_13, m2_1, m1_1);
641 m2_1 = _mm_load_pd(m2_p+4);
642 CCMADD(m3_13, m2_2, m1_2)
643 m2_2 = _mm_load_pd(m2_p+10);
644 CCMADD(m3_13, m2_3, m1_3);
645 m2_3 = _mm_load_pd(m2_p+16);
646
647 m3_13 = _mm_mul_pd(scalar,m3_13);
648 m3_13 = _mm_add_pd(res3, m3_13);
649
650
651
652 _mm_store_pd(m3_p+6, m3_11);
653 _mm_store_pd(m3_p+8, m3_12);
654 _mm_store_pd(m3_p+10, m3_13);
655 res1 = _mm_load_pd(m3_p+12);
656 res2 = _mm_load_pd(m3_p+14);
657 res3 = _mm_load_pd(m3_p+16);
658
659
660 m1_1 = _mm_load_pd(m1_p);
661 m1_2 = _mm_load_pd(m1_p+2);
662 m1_3 = _mm_load_pd(m1_p+4);
663
664 CCMUL(m3_11, m2_1, m1_1);
665 m1_1 = _mm_load_pd(m1_p+6);
666 CCMADD(m3_11, m2_2, m1_2);
667 m1_2 = _mm_load_pd(m1_p+8);
668 CCMADD(m3_11, m2_3, m1_3);
669 m1_3 = _mm_load_pd(m1_p+10);
670
671 m3_11 = _mm_mul_pd(scalar,m3_11);
672 m3_11 = _mm_add_pd(res1, m3_11);
673
674
675
676 CCMUL(m3_12, m2_1, m1_1);
677 m1_1 = _mm_load_pd(m1_p+12);
678 CCMADD(m3_12, m2_2, m1_2);
679 m1_2 = _mm_load_pd(m1_p+14);
680 CCMADD(m3_12, m2_3, m1_3);
681 m1_3 = _mm_load_pd(m1_p+16);
682
683 m3_12 = _mm_mul_pd(scalar,m3_12);
684 m3_12 = _mm_add_pd(res2, m3_12);
685
686 CCMUL(m3_13, m2_1, m1_1);
687 CCMADD(m3_13, m2_2, m1_2);
688 CCMADD(m3_13, m2_3, m1_3);
689
690 m3_13 = _mm_mul_pd(scalar,m3_13);
691 m3_13 = _mm_add_pd(res3, m3_13);
692
693 _mm_store_pd(m3_p+12, m3_11);
694 _mm_store_pd(m3_p+14, m3_12);
695 _mm_store_pd(m3_p+16, m3_13);
696
697 m1_p += 18; m2_p += 18; m3_p += 18;
698 }
699
700 }
701
702
703
704} // namespace QDP;
705
double REAL64
Yet another random number generator.
void ssed_m_eq_hh_u(REAL64 *m3, REAL64 *m2, REAL64 *m1, int n_mat)
void ssed_m_peq_ahh_u(REAL64 *m3, REAL64 *a, REAL64 *m2, REAL64 *m1, int n_mat)
void ssed_m_peq_ahh(REAL64 *m3, REAL64 *a, REAL64 *m2, REAL64 *m1, int n_mat)
void ssed_m_eq_hh(REAL64 *m3, REAL64 *m2, REAL64 *m1, int n_mat)
#define QDPXX_MESSAGE(s)
#define CCMUL(z, x, y)
#define CCMADD(z, x, y)