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