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