QDP++
sse_blas_vscal4_double.cc
Go to the documentation of this file.
1
6
8#include <xmmintrin.h>
9
10namespace QDP {
11
12
13
14void vscal4(REAL64 *z,REAL64 *a,REAL64 *x, int n_4spin)
15{
16 __m128d scalar;
17 __m128d tmp1;
18
19 __m128d z1;
20 __m128d x1;
21
22 __m128d z2;
23 __m128d x2;
24
25 __m128d z3;
26 __m128d x3;
27
28 __m128d z4;
29 __m128d x4;
30
31 __m128d z5;
32 __m128d x5;
33
34 __m128d z6;
35 __m128d x6;
36
37
38
39 // Load the scalar into low bytes of scalar
40 scalar = _mm_load_sd(a);
41
42 // cross components into tmp
43 // Zero tmp
44 tmp1 = _mm_setzero_pd();
45 tmp1 = _mm_shuffle_pd(scalar, scalar, 0x1);
46 scalar = _mm_add_pd(scalar, tmp1);
47
48 //QDPIO::cout << "In Balints Routine" << endl;
49
50 double *x_p=x;
51 double *z_p=z;
52
53
54 for(int i=0; i < n_4spin; i++) {
55 x1 = _mm_load_pd(x_p);
56 z1 = _mm_mul_pd(scalar,x1);
57
58 x2 = _mm_load_pd(x_p+2);
59 z2 = _mm_mul_pd(scalar,x2);
60
61 x3 = _mm_load_pd(x_p+4);
62 z3 = _mm_mul_pd(scalar,x3);
63
64 x4 = _mm_load_pd(x_p+6);
65 z4 = _mm_mul_pd(scalar,x4);
66
67 x5 = _mm_load_pd(x_p+8);
68 z5 = _mm_mul_pd(scalar,x5);
69
70 x6 = _mm_load_pd(x_p+10);
71 z6 = _mm_mul_pd(scalar,x6);
72
73 _mm_store_pd(z_p, z1);
74 _mm_store_pd(z_p+2, z2);
75 _mm_store_pd(z_p+4, z3);
76 _mm_store_pd(z_p+6, z4);
77 _mm_store_pd(z_p+8, z5);
78 _mm_store_pd(z_p+10, z6);
79
80 x1 = _mm_load_pd(x_p+12);
81 z1 = _mm_mul_pd(scalar,x1);
82
83 x2 = _mm_load_pd(x_p+14);
84 z2 = _mm_mul_pd(scalar,x2);
85
86 x3 = _mm_load_pd(x_p+16);
87 z3 = _mm_mul_pd(scalar,x3);
88
89 x4 = _mm_load_pd(x_p+18);
90 z4 = _mm_mul_pd(scalar,x4);
91
92 x5 = _mm_load_pd(x_p+20);
93 z5 = _mm_mul_pd(scalar,x5);
94
95 x6 = _mm_load_pd(x_p+22);
96 z6 = _mm_mul_pd(scalar,x6);
97
98 _mm_store_pd(z_p+12, z1);
99 _mm_store_pd(z_p+14, z2);
100 _mm_store_pd(z_p+16, z3);
101 _mm_store_pd(z_p+18, z4);
102 _mm_store_pd(z_p+20, z5);
103 _mm_store_pd(z_p+22, z6);
104
105 x_p+=24; z_p+=24;
106
107 }
108
109}
110
111
112
113} // namespace QDP;
114
double REAL64
Yet another random number generator.
void vscal4(REAL64 *z, REAL64 *a, REAL64 *x, int n_4spin)
Generic Scalar VAXPY routine.