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