QDP++
sse_blas_vaxmyz4_double.cc
Go to the documentation of this file.
1
6
8
9#include <xmmintrin.h>
10
11namespace QDP {
12
13
14void vaxmyz4(REAL64 *Out,REAL64 *scalep,REAL64 *InScale, REAL64 *Add,int n_4vec)
15{
16 __m128d scalar;
17 __m128d tmp1;
18 __m128d tmp2;
19 __m128d tmp3;
20 __m128d in1;
21 __m128d add1;
22 __m128d in2;
23 __m128d add2;
24 __m128d in3;
25 __m128d add3;
26 __m128d in4;
27 __m128d add4;
28 __m128d out1;
29 __m128d out2;
30 __m128d out3;
31
32 // Load the scalar into low bytes of scalar
33 scalar = _mm_load_sd(scalep);
34
35 // cross components into tmp
36 // Zero tmp
37 tmp1 = _mm_setzero_pd();
38 tmp1 = _mm_shuffle_pd(scalar, scalar, 0x1);
39 scalar = _mm_add_pd(scalar, tmp1);
40
41
42 // Do n_3vec 3vectors.
43 double *in_p=InScale;
44 double *add_p=Add;
45 double *out_p=Out;
46
47 for(int i=0; i < n_4vec*4*3*2; i+=2) {
48 add1 = _mm_load_pd(add_p+i);
49 in1 = _mm_load_pd(in_p+i);
50 tmp1 = _mm_mul_pd(scalar, in1);
51 out1 = _mm_sub_pd(tmp1,add1);
52 _mm_store_pd(out_p+i, out1);
53 }
54
55
56}
57
58
59void vaxmy4(REAL64 *Out,REAL64 *scalep,REAL64 *InScale, int n_4spin)
60{
61 __m128d scalar;
62 __m128d tmp1;
63 __m128d tmp2;
64 __m128d tmp3;
65 __m128d in1;
66 __m128d add1;
67 __m128d in2;
68 __m128d add2;
69 __m128d in3;
70 __m128d add3;
71 __m128d in4;
72 __m128d add4;
73 __m128d out1;
74 __m128d out2;
75 __m128d out3;
76
77 // Load the scalar into low bytes of scalar
78 scalar = _mm_load_sd(scalep);
79
80 // cross components into tmp
81 // Zero tmp
82 tmp1 = _mm_setzero_pd();
83 tmp1 = _mm_shuffle_pd(scalar, scalar, 0x1);
84 scalar = _mm_add_pd(scalar, tmp1);
85
86 //QDPIO::cout << "In Balints Routine" << endl;
87
88 double *in_p=InScale;
89 double *out_p=Out;
90
91 for(int i=0; i < n_4spin; i++) {
92 add1 = _mm_load_pd(out_p);
93 in1 = _mm_load_pd(in_p);
94 tmp1 = _mm_mul_pd(scalar, in1);
95 out1 = _mm_sub_pd(tmp1,add1);
96 _mm_store_pd(out_p, out1);
97
98
99 add2 = _mm_load_pd(out_p+2);
100 in2 = _mm_load_pd(in_p+2);
101 tmp2 = _mm_mul_pd(scalar, in2);
102 out2 = _mm_sub_pd(tmp2,add2);
103 _mm_store_pd(out_p+2, out2);
104
105 add3 = _mm_load_pd(out_p+4);
106 in3 = _mm_load_pd(in_p+4);
107 tmp3 = _mm_mul_pd(scalar, in3);
108 out3 = _mm_sub_pd(tmp3,add3);
109 _mm_store_pd(out_p+4, out3);
110
111 add1 = _mm_load_pd(out_p+6);
112 in1 = _mm_load_pd(in_p+6);
113 tmp1 = _mm_mul_pd(scalar, in1);
114 out1 = _mm_sub_pd(tmp1,add1);
115 _mm_store_pd(out_p+6, out1);
116
117 add2 = _mm_load_pd(out_p+8);
118 in2 = _mm_load_pd(in_p+8);
119 tmp2 = _mm_mul_pd(scalar, in2);
120 out2 = _mm_sub_pd(tmp2,add2);
121 _mm_store_pd(out_p+8, out2);
122
123 add3 = _mm_load_pd(out_p+10);
124 in3 = _mm_load_pd(in_p+10);
125 tmp3 = _mm_mul_pd(scalar, in3);
126 out3 = _mm_sub_pd(tmp3,add3);
127 _mm_store_pd(out_p+10, out3);
128
129 add1 = _mm_load_pd(out_p+12);
130 in1 = _mm_load_pd(in_p+12);
131 tmp1 = _mm_mul_pd(scalar, in1);
132 out1 = _mm_sub_pd(tmp1,add1);
133 _mm_store_pd(out_p+12, out1);
134
135 add2 = _mm_load_pd(out_p+14);
136 in2 = _mm_load_pd(in_p+14);
137 tmp2 = _mm_mul_pd(scalar, in2);
138 out2 = _mm_sub_pd(tmp2,add2);
139 _mm_store_pd(out_p+14, out2);
140
141 add3 = _mm_load_pd(out_p+16);
142 in3 = _mm_load_pd(in_p+16);
143 tmp3 = _mm_mul_pd(scalar, in3);
144 out3 = _mm_sub_pd(tmp3,add3);
145 _mm_store_pd(out_p+16, out3);
146
147 add1 = _mm_load_pd(out_p+18);
148 in1 = _mm_load_pd(in_p+18);
149 tmp1 = _mm_mul_pd(scalar, in1);
150 out1 = _mm_sub_pd(tmp1,add1);
151 _mm_store_pd(out_p+18, out1);
152
153 add2 = _mm_load_pd(out_p+20);
154 in2 = _mm_load_pd(in_p+20);
155 tmp2 = _mm_mul_pd(scalar, in2);
156 out2 = _mm_sub_pd(tmp2,add2);
157 _mm_store_pd(out_p+20, out2);
158
159 add3 = _mm_load_pd(out_p+22);
160 in3 = _mm_load_pd(in_p+22);
161 tmp3 = _mm_mul_pd(scalar, in3);
162 out3 = _mm_sub_pd(tmp3,add3);
163 _mm_store_pd(out_p+22, out3);
164
165 out_p+=24; in_p+=24;
166
167 }
168
169
170}
171
172
173} // namespace QDP;
174
double REAL64
Yet another random number generator.
void vaxmyz4(REAL64 *Out, REAL64 *scalep, REAL64 *InScale, REAL64 *Add, int n_4vec)
void vaxmy4(REAL64 *Out, REAL64 *scalep, REAL64 *InScale, int n_4spin)
Generic Scalar VAXPY routine.