QDP++
sse_blas_vscal3_g5.h
Go to the documentation of this file.
1// $Id: sse_blas_vscal3_g5.h,v 1.4 2007-08-20 17:08:14 uid4709 Exp $
2
7
8#ifndef QDP_SSE_BLAS_VSCAL_G5
9#define QDP_SSE_BLAS_VSCAL_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 = (*scalep)* P_{+} X
23inline
24void scal_g5ProjPlus(REAL32 *Out, REAL32* scalep, REAL32 *X, int n_4vec)
25{
26 // GNUC vector type
27 v4sf vscalep = _mm_load_ss(scalep); // High bytes
28 vscalep =_mm_shuffle_ps(vscalep, vscalep, 0 );
29
30 REAL32 rzero=0;
31
32 // A zero vector
33 v4sf vzero = _mm_load_ss(&rzero);
34 vzero = _mm_shuffle_ps(vzero, vzero, 0);
35
36 for(int i=0; i < n_4vec; i++) {
37
38 // Spin Component 0: z0r, z0i, z1r, z1i
39 _mm_store_ps(Out+ 0, _mm_mul_ps(vscalep, _mm_load_ps(X+ 0)));
40
41 // Spin Component 0: z2r, z2i, SpinComponent 1: z0r, z0i
42 _mm_store_ps(Out+ 4, _mm_mul_ps(vscalep, _mm_load_ps(X+ 4)));
43
44
45 // Spin Component 1: z1r, z1i, z2r, z2i
46 _mm_store_ps(Out+ 8, _mm_mul_ps(vscalep, _mm_load_ps(X+ 8)));
47
48
49 // Spin Component 2: z0r, z0i, z1r, z1i
50 _mm_store_ps(Out+12, vzero);
51
52 // Spin Component 2: z2r, z2i, z0r, z0r
53 _mm_store_ps(Out+16, vzero);
54
55 // Spin Component 3: z1r, z1i, z2r, z2i
56 _mm_store_ps(Out+20, vzero);
57
58 // Update offsets
59 Out += 24; X += 24;
60 }
61
62}
63
64
65// (Vector) out = (*scalep)* P_{-} X
66inline
67void scal_g5ProjMinus(REAL32 *Out, REAL32* scalep, REAL32 *X, int n_4vec)
68{
69 // GNUC vector type
70
71
72 v4sf vscalep = _mm_load_ss(scalep);
73 vscalep = _mm_shuffle_ps(vscalep, vscalep,0);
74 REAL32 rzero = (REAL32)0;
75
76 // A zero vector
77 v4sf vzero = _mm_load_ss(&rzero);
78 vzero = _mm_shuffle_ps(vzero, vzero, 0);
79
80 for(int i=0; i < n_4vec; i++) {
81 // Spin Component 0: z0r, z0i, z1r, z1i
82 _mm_store_ps(Out+0, vzero);
83
84 // Spin Component 0: z2r, z2i, Spin Component 1: z0r, z0r
85 _mm_store_ps(Out+4, vzero);
86
87 // Spin Component 1: z1r, z1i, z2r, z2i
88 _mm_store_ps(Out+8, vzero);
89
90
91 // Spin Component 2: z0r, z0i, z1r, z1i
92 _mm_store_ps(Out+ 12, _mm_mul_ps(vscalep, _mm_load_ps(X+ 12)));
93
94 // Spin Component 2: z2r, z2i, SpinComponent 3: z0r, z0i
95 _mm_store_ps(Out+ 16, _mm_mul_ps(vscalep, _mm_load_ps(X+ 16)));
96
97
98 // Spin Component 3: z1r, z1i, z2r, z2i
99 _mm_store_ps(Out+ 20, _mm_mul_ps(vscalep, _mm_load_ps(X+ 20)));
100
101
102
103 // Update offsets
104 Out += 24; X += 24;
105 }
106
107}
108
109
110#endif
111
112} // namespace QDP;
113
114
115#endif // GNUC
116
117#endif // guard
Yet another random number generator.
void scal_g5ProjMinus(REAL *Out, REAL *scalep, REAL *In, int n_4vec)
void scal_g5ProjPlus(REAL *Out, REAL *scalep, REAL *In, int n_4vec)