QDP++
generic_blas_vcaxmy3.h
Go to the documentation of this file.
1// $Id: generic_blas_vcaxmy3.h,v 1.3 2009-09-15 20:48:42 bjoo Exp $
2
7
8#ifndef QDP_GENERIC_BLAS_VCAXMY3
9#define QDP_GENERIC_BLAS_VCAXMY3
10
11namespace QDP {
12// (Vector) out = (Complex) (*scalep) * (Vector) InScale - (Vector) Add
13inline
14void vcaxmy3(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 for( counter = 0; counter < len-1; counter++) {
74 y2i = (double)Add[index_y++];
75 z0r = a_r * x0r - y0r;
76 z0i = a_i * x0r - y0i;
77 x0r = (double)InScale[index_x++];
78 y0r = (double)Add[index_y++];
79 z0r -= a_i * x0i;
80 Out[index_z++] = (REAL)z0r;
81 z0i += a_r * x0i;
82 Out[index_z++] = (REAL)z0i;
83 x0i = (double)InScale[index_x++];
84
85
86
87 z1r = a_r * x1r - y1r;
88 y0i = (double)Add[index_y++];
89 z1i = a_i * x1r - y1i;
90 x1r = (double)InScale[index_x++];
91 y1r = (double)Add[index_y++];
92 z1r -= a_i * x1i;
93 Out[index_z++] = (REAL)z1r;
94 z1i += a_r * x1i;
95 Out[index_z++] = (REAL)z1i;
96 x1i = (double)InScale[index_x++];
97
98 z2r = a_r * x2r - y2r;
99 y1i = (double)Add[index_y++];
100 z2i = a_i * x2r - y2i;
101 x2r = (double)InScale[index_x++];
102 y2r = (double)Add[index_y++];
103 z2r -= a_i * x2i;
104 Out[index_z++] = (REAL)z2r;
105 z2i += a_r * x2i;
106 Out[index_z++] = (REAL)z2i;
107 x2i = (double)InScale[index_x++];
108
109 }
110
111 y2i = (double)Add[index_y++];
112 z0r = a_r * x0r - y0r;
113 z0i = a_i * x0r - y0i;
114 z0r -= a_i * x0i;
115 Out[index_z++] = (REAL)z0r;
116 z0i += a_r * x0i;
117 Out[index_z++] = (REAL)z0i;
118
119 z1r = a_r * x1r - y1r;
120 z1i = a_i * x1r - y1i;
121 z1r -= a_i * x1i;
122 Out[index_z++]= (REAL)z1r;
123 z1i += a_r * x1i;
124 Out[index_z++]= (REAL)z1i;
125
126 z2r = a_r * x2r - y2r;
127 z2i = a_i * x2r - y2i;
128 z2r -= a_i * x2i;
129 Out[index_z++]= (REAL)z2r;
130 z2i += a_r * x2i;
131 Out[index_z++]= (REAL)z2i;
132
133 }
134}
135
136
137} // namespace QDP;
138
139#endif // guard
REAL32 REAL
Yet another random number generator.
void vcaxmy3(REAL *Out, REAL *scalep, REAL *InScale, REAL *Add, int n_3vec)