QDP++
sse_blas_vaxpy3_g5.h
Go to the documentation of this file.
1// $Id: sse_blas_vaxpy3_g5.h,v 1.4 2007-08-20 17:08:14 uid4709 Exp $
2
7
8#ifndef QDP_SSE_BLAS_VAXPY3_G5
9#define QDP_SSE_BLAS_VAXPY3_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 = (Scalar) (*scalep) * (Vector) InScale + (Vector) P{+} Add
23inline
24void axpyz_g5ProjPlus(REAL32 *Out,REAL32 *scalep,REAL32 *InScale, REAL32 *Add,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_mul_ps(vscalep, _mm_load_ps(InScale+ 12)));
46
47 // Spin Component 2: z2r, z2i, z0r, z0r
48 _mm_store_ps(Out+16, _mm_mul_ps(vscalep, _mm_load_ps(InScale+ 16)));
49
50 // Spin Component 3: z1r, z1i, z2r, z2i
51 _mm_store_ps(Out+20, _mm_mul_ps(vscalep, _mm_load_ps(InScale+ 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 axpyz_g5ProjMinus(REAL32 *Out,REAL32 *scalep,REAL32 *InScale, REAL32 *Add,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
71 for(int i=0; i < n_4vec; i++) {
72 // Spin Component 0: z0r, z0i, z1r, z1i
73 _mm_store_ps(Out+0, _mm_mul_ps(vscalep, _mm_load_ps(InScale+ 0)));
74
75 // Spin Component 0: z2r, z2i, Spin Component 1: z0r, z0r
76 _mm_store_ps(Out+4, _mm_mul_ps(vscalep, _mm_load_ps(InScale+ 4)));
77
78 // Spin Component 1: z1r, z1i, z2r, z2i
79 _mm_store_ps(Out+8, _mm_mul_ps(vscalep, _mm_load_ps(InScale+ 8)));
80
81
82 // Spin Component 2: z0r, z0i, z1r, z1i
83 _mm_store_ps(Out+12, _mm_add_ps(_mm_mul_ps(vscalep, _mm_load_ps(InScale+ 12)), _mm_load_ps(Add+ 12)));
84
85 // Spin Component 2: z2r, z2i, SpinComponent 3: z0r, z0i
86 _mm_store_ps(Out+ 16, _mm_add_ps(_mm_mul_ps(vscalep, _mm_load_ps(InScale+ 16)), _mm_load_ps(Add+ 16)));
87
88 // Spin Component 3: z1r, z1i, z2r, z2i
89 _mm_store_ps(Out+ 20, _mm_add_ps(_mm_mul_ps(vscalep, _mm_load_ps(InScale+ 20)), _mm_load_ps(Add+ 20)));
90 // Update offsets
91 Out += 24; InScale += 24; Add += 24;
92 }
93
94}
95
96
97
98// AXMY versions
99// (Vector) out = (Scalar) (*scalep) * (Vector) InScale - (Vector) P{+} Add
100inline
101void axmyz_g5ProjPlus(REAL32 *Out,REAL32 *scalep,REAL32 *InScale, REAL32 *Add,int n_4vec)
102{
103 // GNUC vector type
104
105
106 // Load Vscalep
107
108 v4sf vscalep = _mm_load_ss(scalep);
109 vscalep = _mm_shuffle_ps(vscalep, vscalep, 0);
110
111 for(int i=0; i < n_4vec; i++) {
112
113 // Spin Component 0: z0r, z0i, z1r, z1i
114 _mm_store_ps(Out+ 0, _mm_sub_ps(_mm_mul_ps(vscalep, _mm_load_ps(InScale+ 0)), _mm_load_ps(Add+ 0)));
115
116
117 // Spin Component 0: z2r, z2i, SpinComponent 1: z0r, z0i
118 _mm_store_ps(Out+ 4, _mm_sub_ps(_mm_mul_ps(vscalep, _mm_load_ps(InScale+ 4)), _mm_load_ps(Add+ 4)));
119
120 // Spin Component 1: z1r, z1i, z2r, z2i
121 _mm_store_ps(Out+ 8, _mm_sub_ps(_mm_mul_ps(vscalep, _mm_load_ps(InScale+ 8)), _mm_load_ps(Add+ 8)));
122
123 // Spin Component 2: z0r, z0i, z1r, z1i
124 _mm_store_ps(Out+12, _mm_mul_ps(vscalep, _mm_load_ps(InScale+ 12)));
125
126
127
128 // Spin Component 2: z2r, z2i, z0r, z0r
129 _mm_store_ps(Out+16, _mm_mul_ps(vscalep, _mm_load_ps(InScale+ 16)));
130
131 // Spin Component 3: z1r, z1i, z2r, z2i
132 _mm_store_ps(Out+20, _mm_mul_ps(vscalep, _mm_load_ps(InScale+ 20)));
133
134 // Update offsets
135 Out += 24; InScale += 24; Add += 24;
136 }
137
138
139}
140
141// (Vector) out = (Scalar) (*scalep) * (Vector) InScale - (Vector) P{-} Add
142inline
143void axmyz_g5ProjMinus(REAL32 *Out,REAL32 *scalep,REAL32 *InScale, REAL32 *Add,int n_4vec)
144{
145 // GNUC vector type
146
147
148 // Load Vscalep
149 v4sf vscalep = _mm_load_ss(scalep);
150 vscalep = _mm_shuffle_ps(vscalep, vscalep, 0);
151
152 for(int i=0; i < n_4vec; i++) {
153 // Spin Component 0: z0r, z0i, z1r, z1i
154 _mm_store_ps(Out+0, _mm_mul_ps(vscalep, _mm_load_ps(InScale+ 0)));
155
156 // Spin Component 0: z2r, z2i, Spin Component 1: z0r, z0r
157 _mm_store_ps(Out+4, _mm_mul_ps(vscalep, _mm_load_ps(InScale+ 4)));
158
159 // Spin Component 1: z1r, z1i, z2r, z2i
160 _mm_store_ps(Out+8, _mm_mul_ps(vscalep, _mm_load_ps(InScale+ 8)));
161
162
163 // Spin Component 2: z0r, z0i, z1r, z1i
164 _mm_store_ps(Out+12, _mm_sub_ps(_mm_mul_ps(vscalep, _mm_load_ps(InScale+ 12)), _mm_load_ps(Add+ 12)));
165
166 // Spin Component 2: z2r, z2i, SpinComponent 3: z0r, z0i
167 _mm_store_ps(Out+ 16, _mm_sub_ps(_mm_mul_ps(vscalep, _mm_load_ps(InScale+ 16)), _mm_load_ps(Add+ 16)));
168
169 // Spin Component 3: z1r, z1i, z2r, z2i
170 _mm_store_ps(Out+ 20, _mm_sub_ps(_mm_mul_ps(vscalep, _mm_load_ps(InScale+ 20)), _mm_load_ps(Add+ 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 axmyz_g5ProjMinus(REAL *Out, REAL *scalep, REAL *InScale, REAL *Add, int n_4vec)
void axpyz_g5ProjPlus(REAL *Out, REAL *scalep, REAL *InScale, REAL *Add, int n_4vec)
void axmyz_g5ProjPlus(REAL *Out, REAL *scalep, REAL *InScale, REAL *Add, int n_4vec)
void axpyz_g5ProjMinus(REAL *Out, REAL *scalep, REAL *InScale, REAL *Add, int n_4vec)