QDP++
generic_blas_vcaxpy3.h
Go to the documentation of this file.
1// $Id: generic_blas_vcaxpy3.h,v 1.3 2009-09-15 20:48:42 bjoo Exp $
2
7
8#ifndef QDP_GENERIC_BLAS_VCAXPY3
9#define QDP_GENERIC_BLAS_VCAXPY3
10
11namespace QDP {
12// (Vector) out = (Complex) (*scalep) * (Vector) InScale + (Vector) Add
13inline
14void vcaxpy3(REAL *Out,REAL *scalep,REAL *InScale, REAL *Add,int n_3vec)
15{
16 double a_r;
17 double a_i;
18
19 double x0r;
20 double x0i;
21
22 double x1r;
23 double x1i;
24
25 double x2r;
26 double x2i;
27
28 double y0r;
29 double y0i;
30
31 double y1r;
32 double y1i;
33
34 double y2r;
35 double y2i;
36
37 double z0r;
38 double z0i;
39
40 double z1r;
41 double z1i;
42
43 double z2r;
44 double z2i;
45
46 a_r =(double)(*scalep);
47 a_i =(double)*(scalep+1);
48
49 int index_x = 0;
50 int index_y = 0;
51 int index_z = 0;
52
53 int counter;
54
55 if( n_3vec > 0 ) {
56 int len = n_3vec*4;
57
58 // Prefetch whole vectors
59 x0r = (double)InScale[index_x++];
60 x0i = (double)InScale[index_x++];
61 y0r = (double)Add[index_y++];
62 y0i = (double)Add[index_y++];
63
64 x1r = (double)InScale[index_x++];
65 x1i = (double)InScale[index_x++];
66 y1r = (double)Add[index_y++];
67 y1i = (double)Add[index_y++];
68
69 x2r = (double)InScale[index_x++];
70 x2i = (double)InScale[index_x++];
71 y2r = (double)Add[index_y++];
72
73
74 for( counter = 0; counter < len-1; counter++) {
75 y2i = (double)Add[index_y++];
76 z0r = a_r * x0r + y0r;
77 z0i = a_i * x0r + y0i;
78 x0r = (double)InScale[index_x++];
79 y0r = (double)Add[index_y++];
80 z0r -= a_i * x0i;
81 Out[index_z++] = (REAL)z0r;
82 z0i += a_r * x0i;
83 Out[index_z++] = (REAL)z0i;
84 x0i = (double)InScale[index_x++];
85
86
87
88 z1r = a_r * x1r + y1r;
89 y0i = (double)Add[index_y++];
90 z1i = a_i * x1r + y1i;
91 x1r = (double)InScale[index_x++];
92 y1r = (double)Add[index_y++];
93 z1r -= a_i * x1i;
94 Out[index_z++] = (REAL)z1r;
95 z1i += a_r * x1i;
96 Out[index_z++] = (REAL)z1i;
97 x1i = (double)InScale[index_x++];
98
99 z2r = a_r * x2r + y2r;
100 y1i = (double)Add[index_y++];
101 z2i = a_i * x2r + y2i;
102 x2r = (double)InScale[index_x++];
103 y2r = (double)Add[index_y++];
104 z2r -= a_i * x2i;
105 Out[index_z++] = (REAL)z2r;
106 z2i += a_r * x2i;
107 Out[index_z++] = (REAL)z2i;
108 x2i = (double)InScale[index_x++];
109
110 }
111
112 y2i = (double)Add[index_y++];
113 z0r = a_r * x0r + y0r;
114 z0i = a_i * x0r + y0i;
115 z0r -= a_i * x0i;
116 Out[index_z++] = (REAL)z0r;
117 z0i += a_r * x0i;
118 Out[index_z++] = (REAL)z0i;
119
120 z1r = a_r * x1r + y1r;
121 z1i = a_i * x1r + y1i;
122 z1r -= a_i * x1i;
123 Out[index_z++]= (REAL)z1r;
124 z1i += a_r * x1i;
125 Out[index_z++]= (REAL)z1i;
126
127 z2r = a_r * x2r + y2r;
128 z2i = a_i * x2r + y2i;
129 z2r -= a_i * x2i;
130 Out[index_z++]= (REAL)z2r;
131 z2i += a_r * x2i;
132 Out[index_z++]= (REAL)z2i;
133
134 }
135}
136
137
138} // namespace QDP;
139
140#endif // guard
REAL32 REAL
Yet another random number generator.
void vcaxpy3(REAL *Out, REAL *scalep, REAL *InScale, REAL *Add, int n_3vec)