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