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