1#ifndef SSE_SPIN_PROJ_INLINES_H
2#define SSE_SPIN_PROJ_INLINES_H
29#ifdef DEBUG_GENERIC_SPIN_PROJ_INLINES
34 SSEVec v0, v1, v2, v3, v4, v5, v6, v7;
44 const REAL32* src_shadow = src;
49 v0.vector = _mm_load_ps(src_shadow);
50 v1.vector = _mm_load_ps(src_shadow+4);
51 v2.vector = _mm_load_ps(src_shadow+8);
52 v3.vector = _mm_load_ps(src_shadow+12);
53 v4.vector = _mm_load_ps(src_shadow+16);
54 v5.vector = _mm_load_ps(src_shadow+20);
61 for(
unsigned int site=0; site < n_vec-1; site++) {
64 _mm_prefetch((
const char *)src_shadow, _MM_HINT_T0);
66 v6.vector = v4.vector;
73 v6.vector = _mm_shuffle_ps(v6.vector, v5.vector, 0x1B);
80 v6.vector = _mm_mul_ps(v6.vector, v7.vector);
81 v0.vector = _mm_add_ps(v0.vector, v6.vector);
82 _mm_store_ps(dst_shadow, v0.vector);
84 v6.vector = v5.vector;
91 v6.vector = _mm_shuffle_ps(v6.vector, v3.vector, 0x1B);
98 v6.vector = _mm_mul_ps(v6.vector, v7.vector);
99 v1.vector = _mm_add_ps(v1.vector, v6.vector);
100 _mm_store_ps(dst_shadow+4, v1.vector);
102 v6.vector = v3.vector;
108 v6.vector = _mm_shuffle_ps(v6.vector, v4.vector, 0x1B);
115 v6.vector = _mm_mul_ps(v6.vector, v7.vector);
116 v2.vector = _mm_add_ps(v2.vector, v6.vector);
117 _mm_store_ps(dst_shadow+8, v2.vector);
123 v0.vector = _mm_load_ps(src_shadow);
124 v1.vector = _mm_load_ps(src_shadow+4);
125 v2.vector = _mm_load_ps(src_shadow+8);
126 v3.vector = _mm_load_ps(src_shadow+12);
127 v4.vector = _mm_load_ps(src_shadow+16);
128 v5.vector = _mm_load_ps(src_shadow+20);
134 v6.vector = v4.vector;
141 v6.vector = _mm_shuffle_ps(v6.vector, v5.vector, 0x1B);
148 v6.vector = _mm_mul_ps(v6.vector, v7.vector);
149 v0.vector = _mm_add_ps(v0.vector, v6.vector);
150 _mm_store_ps(dst_shadow, v0.vector);
152 v6.vector = v5.vector;
159 v6.vector = _mm_shuffle_ps(v6.vector, v3.vector, 0x1B);
166 v6.vector = _mm_mul_ps(v6.vector, v7.vector);
167 v1.vector = _mm_add_ps(v1.vector, v6.vector);
168 _mm_store_ps(dst_shadow+4, v1.vector);
170 v6.vector = v3.vector;
176 v6.vector = _mm_shuffle_ps(v6.vector, v4.vector, 0x1B);
183 v6.vector = _mm_mul_ps(v6.vector, v7.vector);
184 v2.vector = _mm_add_ps(v2.vector, v6.vector);
185 _mm_store_ps(dst_shadow+8, v2.vector);
204#ifdef DEBUG_GENERIC_SPIN_PROJ_INLINES
221 const REAL32* src_shadow = src;
223 SSEVec v0, v1, v2, v3, v4, v5, v6, v7;
231 v0.vector = _mm_load_ps(src_shadow);
232 v1.vector = _mm_load_ps(src_shadow+4);
233 v2.vector = _mm_load_ps(src_shadow+8);
234 v3.vector = _mm_load_ps(src_shadow+12);
235 v4.vector = _mm_load_ps(src_shadow+16);
236 v5.vector = _mm_load_ps(src_shadow+20);
238 for(
unsigned int site=0; site < n_vec-1; site++) {
241 _mm_prefetch((
const char *)src_shadow, _MM_HINT_T0);
243 v6.vector = v4.vector;
250 v6.vector = _mm_shuffle_ps(v6.vector, v5.vector, 0x1B);
257 v6.vector = _mm_mul_ps(v6.vector, v7.vector);
258 v0.vector = _mm_sub_ps(v0.vector, v6.vector);
259 _mm_store_ps(dst_shadow, v0.vector);
261 v6.vector = v5.vector;
268 v6.vector = _mm_shuffle_ps(v6.vector, v3.vector, 0x1B);
275 v6.vector = _mm_mul_ps(v6.vector, v7.vector);
276 v1.vector = _mm_sub_ps(v1.vector, v6.vector);
277 _mm_store_ps(dst_shadow+4, v1.vector);
279 v6.vector = v3.vector;
285 v6.vector = _mm_shuffle_ps(v6.vector, v4.vector, 0x1B);
292 v6.vector = _mm_mul_ps(v6.vector, v7.vector);
293 v2.vector = _mm_sub_ps(v2.vector, v6.vector);
294 _mm_store_ps(dst_shadow+8, v2.vector);
299 v0.vector = _mm_load_ps(src_shadow);
300 v1.vector = _mm_load_ps(src_shadow+4);
301 v2.vector = _mm_load_ps(src_shadow+8);
302 v3.vector = _mm_load_ps(src_shadow+12);
303 v4.vector = _mm_load_ps(src_shadow+16);
304 v5.vector = _mm_load_ps(src_shadow+20);
309 v6.vector = v4.vector;
316 v6.vector = _mm_shuffle_ps(v6.vector, v5.vector, 0x1B);
323 v6.vector = _mm_mul_ps(v6.vector, v7.vector);
324 v0.vector = _mm_sub_ps(v0.vector, v6.vector);
325 _mm_store_ps(dst_shadow, v0.vector);
327 v6.vector = v5.vector;
334 v6.vector = _mm_shuffle_ps(v6.vector, v3.vector, 0x1B);
341 v6.vector = _mm_mul_ps(v6.vector, v7.vector);
342 v1.vector = _mm_sub_ps(v1.vector, v6.vector);
343 _mm_store_ps(dst_shadow+4, v1.vector);
345 v6.vector = v3.vector;
351 v6.vector = _mm_shuffle_ps(v6.vector, v4.vector, 0x1B);
358 v6.vector = _mm_mul_ps(v6.vector, v7.vector);
359 v2.vector = _mm_sub_ps(v2.vector, v6.vector);
360 _mm_store_ps(dst_shadow+8, v2.vector);
382#ifdef DEBUG_GENERIC_SPIN_PROJ_INLINES
395 const REAL32* src_shadow = src;
397 SSEVec v0, v1, v2, v3, v4, v5, v6, v7;
405 v0.vector = _mm_load_ps(src_shadow);
406 v1.vector = _mm_load_ps(src_shadow+4);
407 v2.vector = _mm_load_ps(src_shadow+8);
408 v3.vector = _mm_load_ps(src_shadow+12);
409 v4.vector = _mm_load_ps(src_shadow+16);
410 v5.vector = _mm_load_ps(src_shadow+20);
412 for(
unsigned int site=0; site < n_vec-1; site++) {
415 _mm_prefetch((
const char *)src_shadow, _MM_HINT_T0);
417 v6.vector = v4.vector;
424 v6.vector = _mm_shuffle_ps(v6.vector, v5.vector, 0x4E);
431 v0.vector = _mm_sub_ps(v0.vector, v6.vector);
432 _mm_store_ps(dst_shadow, v0.vector);
434 v6.vector = v5.vector;
441 v6.vector = _mm_shuffle_ps(v6.vector, v3.vector, 0x4E);
448 v6.vector = _mm_mul_ps(v6.vector, v7.vector);
449 v1.vector = _mm_add_ps(v1.vector, v6.vector);
450 _mm_store_ps(dst_shadow+4, v1.vector);
452 v6.vector = v3.vector;
459 v6.vector = _mm_shuffle_ps(v6.vector, v4.vector, 0x4E);
466 v2.vector = _mm_add_ps(v2.vector, v6.vector);
467 _mm_store_ps(dst_shadow+8, v2.vector);
472 v0.vector = _mm_load_ps(src_shadow);
473 v1.vector = _mm_load_ps(src_shadow+4);
474 v2.vector = _mm_load_ps(src_shadow+8);
475 v3.vector = _mm_load_ps(src_shadow+12);
476 v4.vector = _mm_load_ps(src_shadow+16);
477 v5.vector = _mm_load_ps(src_shadow+20);
481 v6.vector = v4.vector;
488 v6.vector = _mm_shuffle_ps(v6.vector, v5.vector, 0x4E);
495 v0.vector = _mm_sub_ps(v0.vector, v6.vector);
496 _mm_store_ps(dst_shadow, v0.vector);
498 v6.vector = v5.vector;
505 v6.vector = _mm_shuffle_ps(v6.vector, v3.vector, 0x4E);
512 v6.vector = _mm_mul_ps(v6.vector, v7.vector);
513 v1.vector = _mm_add_ps(v1.vector, v6.vector);
514 _mm_store_ps(dst_shadow+4, v1.vector);
516 v6.vector = v3.vector;
523 v6.vector = _mm_shuffle_ps(v6.vector, v4.vector, 0x4E);
530 v2.vector = _mm_add_ps(v2.vector, v6.vector);
531 _mm_store_ps(dst_shadow+8, v2.vector);
550#ifdef DEBUG_GENERIC_SPIN_PROJ_INLINES
562 const REAL32* src_shadow = src;
564 SSEVec v0, v1, v2, v3, v4, v5, v6, v7;
572 v0.vector = _mm_load_ps(src_shadow);
573 v1.vector = _mm_load_ps(src_shadow+4);
574 v2.vector = _mm_load_ps(src_shadow+8);
575 v3.vector = _mm_load_ps(src_shadow+12);
576 v4.vector = _mm_load_ps(src_shadow+16);
577 v5.vector = _mm_load_ps(src_shadow+20);
579 for(
unsigned int site=0; site < n_vec-1; site++) {
581 _mm_prefetch((
const char *)src_shadow, _MM_HINT_T0);
583 v6.vector = v4.vector;
590 v6.vector = _mm_shuffle_ps(v6.vector, v5.vector, 0x4E);
597 v0.vector = _mm_add_ps(v0.vector, v6.vector);
598 _mm_store_ps(dst_shadow, v0.vector);
600 v6.vector = v5.vector;
607 v6.vector = _mm_shuffle_ps(v6.vector, v3.vector, 0x4E);
615 v6.vector = _mm_mul_ps(v6.vector, v7.vector);
616 v1.vector = _mm_sub_ps(v1.vector, v6.vector);
617 _mm_store_ps(dst_shadow+4, v1.vector);
619 v6.vector = v3.vector;
626 v6.vector = _mm_shuffle_ps(v6.vector, v4.vector, 0x4E);
633 v2.vector = _mm_sub_ps(v2.vector, v6.vector);
634 _mm_store_ps(dst_shadow+8, v2.vector);
638 v0.vector = _mm_load_ps(src_shadow);
639 v1.vector = _mm_load_ps(src_shadow+4);
640 v2.vector = _mm_load_ps(src_shadow+8);
641 v3.vector = _mm_load_ps(src_shadow+12);
642 v4.vector = _mm_load_ps(src_shadow+16);
643 v5.vector = _mm_load_ps(src_shadow+20);
648 v6.vector = v4.vector;
655 v6.vector = _mm_shuffle_ps(v6.vector, v5.vector, 0x4E);
662 v0.vector = _mm_add_ps(v0.vector, v6.vector);
663 _mm_store_ps(dst_shadow, v0.vector);
665 v6.vector = v5.vector;
672 v6.vector = _mm_shuffle_ps(v6.vector, v3.vector, 0x4E);
680 v6.vector = _mm_mul_ps(v6.vector, v7.vector);
681 v1.vector = _mm_sub_ps(v1.vector, v6.vector);
682 _mm_store_ps(dst_shadow+4, v1.vector);
684 v6.vector = v3.vector;
691 v6.vector = _mm_shuffle_ps(v6.vector, v4.vector, 0x4E);
698 v2.vector = _mm_sub_ps(v2.vector, v6.vector);
699 _mm_store_ps(dst_shadow+8, v2.vector);
720#ifdef DEBUG_GENERIC_SPIN_PROJ_INLINES
733 const REAL32* src_shadow = src;
735 SSEVec v0, v1, v2, v3, v4, v5, v6, v7;
750 v0.vector = _mm_load_ps(src_shadow);
751 v1.vector = _mm_load_ps(src_shadow+4);
752 v2.vector = _mm_load_ps(src_shadow+8);
753 v3.vector = _mm_load_ps(src_shadow+12);
754 v4.vector = _mm_load_ps(src_shadow+16);
755 v5.vector = _mm_load_ps(src_shadow+20);
757 for(
unsigned int site=0; site < n_vec-1; site++) {
759 _mm_prefetch((
const char *)src_shadow, _MM_HINT_T0);
771 v3.vector = _mm_shuffle_ps(v3.vector, v3.vector, 0xB1);
778 v3.vector = _mm_mul_ps(v3.vector, v7.vector);
779 v0.vector = _mm_add_ps(v0.vector, v3.vector);
780 _mm_store_ps(dst_shadow, v0.vector);
788 v4.vector = _mm_shuffle_ps(v4.vector, v4.vector, 0xB1);
795 v4.vector = _mm_mul_ps(v4.vector, v6.vector);
796 v1.vector = _mm_add_ps(v1.vector, v4.vector);
797 _mm_store_ps(dst_shadow+4, v1.vector);
804 v5.vector = _mm_shuffle_ps(v5.vector, v5.vector, 0xB1);
811 v5.vector = _mm_mul_ps(v5.vector, v7.vector );
812 v2.vector = _mm_sub_ps(v2.vector, v5.vector);
813 _mm_store_ps(dst_shadow+8, v2.vector);
818 v0.vector = _mm_load_ps(src_shadow);
819 v1.vector = _mm_load_ps(src_shadow+4);
820 v2.vector = _mm_load_ps(src_shadow+8);
821 v3.vector = _mm_load_ps(src_shadow+12);
822 v4.vector = _mm_load_ps(src_shadow+16);
823 v5.vector = _mm_load_ps(src_shadow+20);
837 v3.vector = _mm_shuffle_ps(v3.vector, v3.vector, 0xB1);
844 v3.vector = _mm_mul_ps(v3.vector, v7.vector);
845 v0.vector = _mm_add_ps(v0.vector, v3.vector);
846 _mm_store_ps(dst_shadow, v0.vector);
854 v4.vector = _mm_shuffle_ps(v4.vector, v4.vector, 0xB1);
861 v4.vector = _mm_mul_ps(v4.vector, v6.vector);
862 v1.vector = _mm_add_ps(v1.vector, v4.vector);
863 _mm_store_ps(dst_shadow+4, v1.vector);
870 v5.vector = _mm_shuffle_ps(v5.vector, v5.vector, 0xB1);
877 v5.vector = _mm_mul_ps(v5.vector, v7.vector );
878 v2.vector = _mm_sub_ps(v2.vector, v5.vector);
879 _mm_store_ps(dst_shadow+8, v2.vector);
898#ifdef DEBUG_GENERIC_SPIN_PROJ_INLINES
912 const REAL32* src_shadow = src;
914 SSEVec v0, v1, v2, v3, v4, v5, v6, v7;
929 v0.vector = _mm_load_ps(src_shadow);
930 v1.vector = _mm_load_ps(src_shadow+4);
931 v2.vector = _mm_load_ps(src_shadow+8);
932 v3.vector = _mm_load_ps(src_shadow+12);
933 v4.vector = _mm_load_ps(src_shadow+16);
934 v5.vector = _mm_load_ps(src_shadow+20);
936 for(
unsigned int site=0; site < n_vec-1; site++) {
938 _mm_prefetch((
const char *)src_shadow, _MM_HINT_T0);
950 v3.vector = _mm_shuffle_ps(v3.vector, v3.vector, 0xB1);
957 v3.vector = _mm_mul_ps(v3.vector, v7.vector);
958 v0.vector = _mm_sub_ps(v0.vector, v3.vector);
959 _mm_store_ps(dst_shadow, v0.vector);
967 v4.vector = _mm_shuffle_ps(v4.vector, v4.vector, 0xB1);
974 v4.vector = _mm_mul_ps(v4.vector, v6.vector);
975 v1.vector = _mm_sub_ps(v1.vector, v4.vector);
976 _mm_store_ps(dst_shadow+4, v1.vector);
983 v5.vector = _mm_shuffle_ps(v5.vector, v5.vector, 0xB1);
990 v5.vector = _mm_mul_ps(v5.vector, v7.vector );
991 v2.vector = _mm_add_ps(v2.vector, v5.vector);
992 _mm_store_ps(dst_shadow+8, v2.vector);
997 v0.vector = _mm_load_ps(src_shadow);
998 v1.vector = _mm_load_ps(src_shadow+4);
999 v2.vector = _mm_load_ps(src_shadow+8);
1000 v3.vector = _mm_load_ps(src_shadow+12);
1001 v4.vector = _mm_load_ps(src_shadow+16);
1002 v5.vector = _mm_load_ps(src_shadow+20);
1016 v3.vector = _mm_shuffle_ps(v3.vector, v3.vector, 0xB1);
1023 v3.vector = _mm_mul_ps(v3.vector, v7.vector);
1024 v0.vector = _mm_sub_ps(v0.vector, v3.vector);
1025 _mm_store_ps(dst_shadow, v0.vector);
1033 v4.vector = _mm_shuffle_ps(v4.vector, v4.vector, 0xB1);
1040 v4.vector = _mm_mul_ps(v4.vector, v6.vector);
1041 v1.vector = _mm_sub_ps(v1.vector, v4.vector);
1042 _mm_store_ps(dst_shadow+4, v1.vector);
1049 v5.vector = _mm_shuffle_ps(v5.vector, v5.vector, 0xB1);
1056 v5.vector = _mm_mul_ps(v5.vector, v7.vector );
1057 v2.vector = _mm_add_ps(v2.vector, v5.vector);
1058 _mm_store_ps(dst_shadow+8, v2.vector);
1078#ifdef DEBUG_GENERIC_SPIN_PROJ_INLINES
1089 const REAL32* src_shadow = src;
1090 REAL32* dst_shadow = dst;
1091 SSEVec v0, v1, v2, v3, v4, v5;
1094 v0.
vector = _mm_load_ps(src_shadow);
1095 v1.vector = _mm_load_ps(src_shadow+4);
1096 v2.vector = _mm_load_ps(src_shadow+8);
1097 v3.vector = _mm_load_ps(src_shadow+12);
1098 v4.vector = _mm_load_ps(src_shadow+16);
1099 v5.vector = _mm_load_ps(src_shadow+20);
1101 for(
unsigned int site=0; site < n_vec-1; site++) {
1103 _mm_prefetch((
const char *)src_shadow, _MM_HINT_T0);
1106 v0.vector = _mm_add_ps(v0.vector, v3.vector);
1107 v1.vector = _mm_add_ps(v1.vector, v4.vector);
1108 v2.vector = _mm_add_ps(v2.vector, v5.vector);
1110 _mm_store_ps(dst_shadow, v0.vector);
1111 _mm_store_ps(dst_shadow+4, v1.vector);
1112 _mm_store_ps(dst_shadow+8, v2.vector);
1116 v0.vector = _mm_load_ps(src_shadow);
1117 v1.vector = _mm_load_ps(src_shadow+4);
1118 v2.vector = _mm_load_ps(src_shadow+8);
1119 v3.vector = _mm_load_ps(src_shadow+12);
1120 v4.vector = _mm_load_ps(src_shadow+16);
1121 v5.vector = _mm_load_ps(src_shadow+20);
1127 v0.vector = _mm_add_ps(v0.vector, v3.vector);
1128 v1.vector = _mm_add_ps(v1.vector, v4.vector);
1129 v2.vector = _mm_add_ps(v2.vector, v5.vector);
1131 _mm_store_ps(dst_shadow, v0.vector);
1132 _mm_store_ps(dst_shadow+4, v1.vector);
1133 _mm_store_ps(dst_shadow+8, v2.vector);
1152#ifdef DEBUG_GENERIC_SPIN_PROJ_INLINES
1165 const REAL32* src_shadow = src;
1166 REAL32* dst_shadow = dst;
1167 SSEVec v0, v1, v2, v3, v4, v5;
1170 v0.
vector = _mm_load_ps(src_shadow);
1171 v1.vector = _mm_load_ps(src_shadow+4);
1172 v2.vector = _mm_load_ps(src_shadow+8);
1173 v3.vector = _mm_load_ps(src_shadow+12);
1174 v4.vector = _mm_load_ps(src_shadow+16);
1175 v5.vector = _mm_load_ps(src_shadow+20);
1177 for(
unsigned int site=0; site < n_vec-1; site++) {
1179 _mm_prefetch((
const char *)src_shadow, _MM_HINT_T0);
1182 v0.vector = _mm_sub_ps(v0.vector, v3.vector);
1183 v1.vector = _mm_sub_ps(v1.vector, v4.vector);
1184 v2.vector = _mm_sub_ps(v2.vector, v5.vector);
1186 _mm_store_ps(dst_shadow, v0.vector);
1187 _mm_store_ps(dst_shadow+4, v1.vector);
1188 _mm_store_ps(dst_shadow+8, v2.vector);
1192 v0.vector = _mm_load_ps(src_shadow);
1193 v1.vector = _mm_load_ps(src_shadow+4);
1194 v2.vector = _mm_load_ps(src_shadow+8);
1195 v3.vector = _mm_load_ps(src_shadow+12);
1196 v4.vector = _mm_load_ps(src_shadow+16);
1197 v5.vector = _mm_load_ps(src_shadow+20);
1202 v0.vector = _mm_sub_ps(v0.vector, v3.vector);
1203 v1.vector = _mm_sub_ps(v1.vector, v4.vector);
1204 v2.vector = _mm_sub_ps(v2.vector, v5.vector);
1206 _mm_store_ps(dst_shadow, v0.vector);
1207 _mm_store_ps(dst_shadow+4, v1.vector);
1208 _mm_store_ps(dst_shadow+8, v2.vector);
StandardOutputStream cout
Yet another random number generator.
void inlineSpinProjDir0Minus(const REAL *src, REAL *dst, unsigned int n_vec)
Spin Project (1/2)(1-\gamma_0).
void inlineSpinProjDir0Plus(const REAL *src, REAL *dst, unsigned int n_vec)
Spin Project (1/2)(1+\gamma_0).
void inlineSpinProjDir1Minus(const REAL *src, REAL *dst, unsigned int n_vec)
Spin Project (1/2)(1-\gamma_1).
void inlineSpinProjDir1Plus(const REAL *src, REAL *dst, unsigned int n_vec)
Spin Project (1/2)(1+\gamma_1).
void inlineSpinProjDir3Plus(const REAL *src, REAL *dst, unsigned int n_vec)
Spin Project (1/2)(1+\gamma_3).
void inlineSpinProjDir3Minus(const REAL *src, REAL *dst, unsigned int n_vec)
Spin Project (1/2)(1-\gamma_3).
void inlineSpinProjDir2Minus(const REAL *src, REAL *dst, unsigned int n_vec)
Spin Project (1/2)(1-\gamma_2).
void inlineSpinProjDir2Plus(const REAL *src, REAL *dst, unsigned int n_vec)
Spin Project (1/2)(1+\gamma_2).