QDP++
sse_blas_vadd3_g5.h
Go to the documentation of this file.
1// $Id: sse_blas_vadd3_g5.h,v 1.3 2007-06-10 14:32:11 edwards Exp $
2
7
8#ifndef QDP_SSE_BLAS_VADD_G5
9#define QDP_SSE_BLAS_VADD_G5
10
11#if defined(__GNUC__)
12
13#include "qdp_config.h"
14#include "qdp_sse_intrin.h"
15namespace QDP {
16
17#if BASE_PRECISION==32
18
19
20
21// (Vector) out = X + P_{+} (Vector) Y
22inline
23void add_g5ProjPlus(REAL32 *Out, REAL32 *X, REAL32 *Y,int n_4vec)
24{
25
26 for(int i=0; i < n_4vec; i++) {
27
28 // Spin Component 0: z0r, z0i, z1r, z1i
29 _mm_store_ps(Out+ 0, _mm_add_ps(_mm_load_ps(Y+ 0), _mm_load_ps(X+ 0)));
30
31 // Spin Component 0: z2r, z2i, SpinComponent 1: z0r, z0i
32 _mm_store_ps(Out+ 4, _mm_add_ps(_mm_load_ps(Y+ 4), _mm_load_ps(X+ 4)));
33
34
35 // Spin Component 1: z1r, z1i, z2r, z2i
36 _mm_store_ps(Out+ 8, _mm_add_ps(_mm_load_ps(Y+ 8), _mm_load_ps(X+ 8)));
37
38 // Spin Component 2: z0r, z0i, z1r, z1i
39 _mm_store_ps(Out+12, _mm_load_ps(X+ 12));
40
41 // Spin Component 2: z2r, z2i, z0r, z0r
42 _mm_store_ps(Out+16, _mm_load_ps(X+ 16));
43
44 // Spin Component 3: z1r, z1i, z2r, z2i
45 _mm_store_ps(Out+20, _mm_load_ps(X+ 20));
46
47 // Update offsets
48 Out += 24; Y += 24; X += 24;
49 }
50
51}
52
53// (Vector) out = X + (Vector) P{-} Y
54inline
55void add_g5ProjMinus(REAL32 *Out,REAL32 *X, REAL32 *Y,int n_4vec)
56{
57
58 for(int i=0; i < n_4vec; i++) {
59 // Spin Component 0: z0r, z0i, z1r, z1i
60 _mm_store_ps(Out+0,_mm_load_ps(X+ 0));
61
62 // Spin Component 0: z2r, z2i, Spin Component 1: z0r, z0r
63 _mm_store_ps(Out+4,_mm_load_ps(X+ 4));
64
65 // Spin Component 1: z1r, z1i, z2r, z2i
66 _mm_store_ps(Out+8, _mm_load_ps(X+ 8));
67
68
69 // Spin Component 2: z0r, z0i, z1r, z1i
70 _mm_store_ps(Out+12, _mm_add_ps(_mm_load_ps(X+ 12), _mm_load_ps(Y+ 12)));
71
72 // Spin Component 2: z2r, z2i, SpinComponent 3: z0r, z0i
73 _mm_store_ps(Out+16, _mm_add_ps(_mm_load_ps(X+ 16), _mm_load_ps(Y+ 16)));
74
75 // Spin Component 3: z1r, z1i, z2r, z2i
76 _mm_store_ps(Out+20, _mm_add_ps(_mm_load_ps(X+ 20), _mm_load_ps(Y+ 20)));
77
78 // Update offsets
79 Out += 24; Y += 24; X += 24;
80 }
81
82}
83
84
85
86// AXMY versions
87// (Vector) out = (Scalar) (*scalep) * (Vector) Y - (Vector) P{+} X
88inline
89void sub_g5ProjPlus(REAL32 *Out, REAL32 *X, REAL32 *Y,int n_4vec)
90{
91 for(int i=0; i < n_4vec; i++) {
92 // Spin Component 0: z0r, z0i, z1r, z1i
93 _mm_store_ps(Out+ 0, _mm_sub_ps(_mm_load_ps(X+ 0), _mm_load_ps(Y + 0)));
94
95 // Spin Component 0: z2r, z2i, SpinComponent 1: z0r, z0i
96 _mm_store_ps(Out+ 4, _mm_sub_ps(_mm_load_ps(X+ 4), _mm_load_ps(Y + 4)));
97
98
99 // Spin Component 1: z1r, z1i, z2r, z2i
100 _mm_store_ps(Out+ 8, _mm_sub_ps(_mm_load_ps(X+ 8), _mm_load_ps(Y+ 8)));
101
102
103 // Spin Component 2: z0r, z0i, z1r, z1i
104 _mm_store_ps(Out+12, _mm_load_ps(X + 12));
105
106
107 // Spin Component 2: z2r, z2i, z0r, z0r
108 _mm_store_ps(Out+16, _mm_load_ps(X+ 16));
109
110
111 // Spin Component 3: z1r, z1i, z2r, z2i
112 _mm_store_ps(Out+20, _mm_load_ps(X+20));
113
114 // Update offsets
115 Out += 24; Y += 24; X += 24;
116 }
117
118
119}
120
121// (Vector) out = Y - (Vector) P{-} X
122inline
123void sub_g5ProjMinus(REAL32 *Out,REAL32 *X, REAL32 *Y,int n_4vec)
124{
125
126 for(int i=0; i < n_4vec; i++) {
127 // Spin Component 0: z0r, z0i, z1r, z1i
128 _mm_store_ps(Out+0, _mm_load_ps(X+0));
129
130 // Spin Component 0: z2r, z2i, Spin Component 1: z0r, z0r
131 _mm_store_ps(Out+4, _mm_load_ps(X+4));
132
133 // Spin Component 1: z1r, z1i, z2r, z2i
134 _mm_store_ps(Out+8, _mm_load_ps(X+8));
135
136 // Spin Component 2: z0r, z0i, z1r, z1i
137 _mm_store_ps(Out+12, _mm_sub_ps(_mm_load_ps(X+ 12), _mm_load_ps(Y+ 12)));
138
139 // Spin Component 2: z2r, z2i, SpinComponent 3: z0r, z0i
140 _mm_store_ps(Out+16, _mm_sub_ps(_mm_load_ps(X+ 16), _mm_load_ps(Y+ 16)));
141
142 // Spin Component 3: z1r, z1i, z2r, z2i
143 _mm_store_ps(Out+20, _mm_sub_ps(_mm_load_ps(X+ 20), _mm_load_ps(Y+ 20)));
144
145 // Update offsets
146 Out += 24; Y += 24; X += 24;
147 }
148
149}
150
151
152#endif
153
154} // namespace QDP;
155
156
157#endif // GNUC
158
159#endif // guard
Yet another random number generator.
void add_g5ProjPlus(REAL *Out, REAL *X, REAL *Y, int n_4vec)
void add_g5ProjMinus(REAL *Out, REAL *X, REAL *Y, int n_4vec)
void sub_g5ProjPlus(REAL *Out, REAL *X, REAL *Y, int n_4vec)
void sub_g5ProjMinus(REAL *Out, REAL *X, REAL *Y, int n_4vec)