34 const ptrdiff_t unroll16 = max1(16 * VEC_SIZE >> ldf);
37 const ptrdiff_t unroll8 = max1(8 * VEC_SIZE >> ldf);
40 const ptrdiff_t unroll4 = max1(4 * VEC_SIZE >> ldf);
43 const ptrdiff_t unroll2 = max1(2 * VEC_SIZE >> ldf);
46 const ptrdiff_t unroll1 = max1(1 * VEC_SIZE >> ldf);
53 for (
l = 0;
l <
nri;
l++) {
59 for (;
i < (rimap_inv_max[
l] - unroll16 + 1);
i += unroll16) {
61 for (k = 0; k < (1 << ldf); k += 16 * VEC_SIZE) {
62 register VEC_TYPE a0, a1, a2, a3;
63 register VEC_TYPE a4, a5, a6, a7;
64 register VEC_TYPE a8, a9, aa, ab;
65 register VEC_TYPE ac, ad, ae, af;
67 a0 = a1 = a2 = a3 = VEC_ZERO;
68 a4 = a5 = a6 = a7 = VEC_ZERO;
69 a8 = a9 = aa = ab = VEC_ZERO;
70 ac = ad = ae = af = VEC_ZERO;
74 for (
j = 0;
j < npairs;
j++) {
75 register VEC_TYPE wj = VEC_SCAL(wpair[
j]);
78 register VEC_TYPE pos = LOAD(fi + indexj_pos);
79 register VEC_TYPE neg = LOAD(fi + indexj_neg);
80 a0 = VEC_FMA(wj, VEC_SUB(pos, neg), a0);
81 pos = LOAD(fi + indexj_pos + 1 * VEC_SIZE);
82 neg = LOAD(fi + indexj_neg + 1 * VEC_SIZE);
83 a1 = VEC_FMA(wj, VEC_SUB(pos, neg), a1);
84 pos = LOAD(fi + indexj_pos + 2 * VEC_SIZE);
85 neg = LOAD(fi + indexj_neg + 2 * VEC_SIZE);
86 a2 = VEC_FMA(wj, VEC_SUB(pos, neg), a2);
87 pos = LOAD(fi + indexj_pos + 3 * VEC_SIZE);
88 neg = LOAD(fi + indexj_neg + 3 * VEC_SIZE);
89 a3 = VEC_FMA(wj, VEC_SUB(pos, neg), a3);
90 pos = LOAD(fi + indexj_pos + 4 * VEC_SIZE);
91 neg = LOAD(fi + indexj_neg + 4 * VEC_SIZE);
92 a4 = VEC_FMA(wj, VEC_SUB(pos, neg), a4);
93 pos = LOAD(fi + indexj_pos + 5 * VEC_SIZE);
94 neg = LOAD(fi + indexj_neg + 5 * VEC_SIZE);
95 a5 = VEC_FMA(wj, VEC_SUB(pos, neg), a5);
96 pos = LOAD(fi + indexj_pos + 6 * VEC_SIZE);
97 neg = LOAD(fi + indexj_neg + 6 * VEC_SIZE);
98 a6 = VEC_FMA(wj, VEC_SUB(pos, neg), a6);
99 pos = LOAD(fi + indexj_pos + 7 * VEC_SIZE);
100 neg = LOAD(fi + indexj_neg + 7 * VEC_SIZE);
101 a7 = VEC_FMA(wj, VEC_SUB(pos, neg), a7);
102 pos = LOAD(fi + indexj_pos + 8 * VEC_SIZE);
103 neg = LOAD(fi + indexj_neg + 8 * VEC_SIZE);
104 a8 = VEC_FMA(wj, VEC_SUB(pos, neg), a8);
105 pos = LOAD(fi + indexj_pos + 9 * VEC_SIZE);
106 neg = LOAD(fi + indexj_neg + 9 * VEC_SIZE);
107 a9 = VEC_FMA(wj, VEC_SUB(pos, neg), a9);
108 pos = LOAD(fi + indexj_pos + 10 * VEC_SIZE);
109 neg = LOAD(fi + indexj_neg + 10 * VEC_SIZE);
110 aa = VEC_FMA(wj, VEC_SUB(pos, neg), aa);
111 pos = LOAD(fi + indexj_pos + 11 * VEC_SIZE);
112 neg = LOAD(fi + indexj_neg + 11 * VEC_SIZE);
113 ab = VEC_FMA(wj, VEC_SUB(pos, neg), ab);
114 pos = LOAD(fi + indexj_pos + 12 * VEC_SIZE);
115 neg = LOAD(fi + indexj_neg + 12 * VEC_SIZE);
116 ac = VEC_FMA(wj, VEC_SUB(pos, neg), ac);
117 pos = LOAD(fi + indexj_pos + 13 * VEC_SIZE);
118 neg = LOAD(fi + indexj_neg + 13 * VEC_SIZE);
119 ad = VEC_FMA(wj, VEC_SUB(pos, neg), ad);
120 pos = LOAD(fi + indexj_pos + 14 * VEC_SIZE);
121 neg = LOAD(fi + indexj_neg + 14 * VEC_SIZE);
122 ae = VEC_FMA(wj, VEC_SUB(pos, neg), ae);
123 pos = LOAD(fi + indexj_pos + 15 * VEC_SIZE);
124 neg = LOAD(fi + indexj_neg + 15 * VEC_SIZE);
125 af = VEC_FMA(wj, VEC_SUB(pos, neg), af);
128 STORE(fo + base_ik, a0);
129 STORE(fo + base_ik + 1 * VEC_SIZE, a1);
130 STORE(fo + base_ik + 2 * VEC_SIZE, a2);
131 STORE(fo + base_ik + 3 * VEC_SIZE, a3);
132 STORE(fo + base_ik + 4 * VEC_SIZE, a4);
133 STORE(fo + base_ik + 5 * VEC_SIZE, a5);
134 STORE(fo + base_ik + 6 * VEC_SIZE, a6);
135 STORE(fo + base_ik + 7 * VEC_SIZE, a7);
136 STORE(fo + base_ik + 8 * VEC_SIZE, a8);
137 STORE(fo + base_ik + 9 * VEC_SIZE, a9);
138 STORE(fo + base_ik + 10 * VEC_SIZE, aa);
139 STORE(fo + base_ik + 11 * VEC_SIZE, ab);
140 STORE(fo + base_ik + 12 * VEC_SIZE, ac);
141 STORE(fo + base_ik + 13 * VEC_SIZE, ad);
142 STORE(fo + base_ik + 14 * VEC_SIZE, ae);
143 STORE(fo + base_ik + 15 * VEC_SIZE, af);
149 for (;
i < (rimap_inv_max[
l] - unroll8 + 1);
i += unroll8) {
151 for (k = 0; k < (1 << ldf); k += 8 * VEC_SIZE) {
152 register VEC_TYPE a0, a1, a2, a3;
153 register VEC_TYPE a4, a5, a6, a7;
155 a0 = a1 = a2 = a3 = VEC_ZERO;
156 a4 = a5 = a6 = a7 = VEC_ZERO;
160 for (
j = 0;
j < npairs;
j++) {
161 register VEC_TYPE wj = VEC_SCAL(wpair[
j]);
164 register VEC_TYPE pos = LOAD(fi + indexj_pos);
165 register VEC_TYPE neg = LOAD(fi + indexj_neg);
166 a0 = VEC_FMA(wj, VEC_SUB(pos, neg), a0);
167 pos = LOAD(fi + indexj_pos + 1 * VEC_SIZE);
168 neg = LOAD(fi + indexj_neg + 1 * VEC_SIZE);
169 a1 = VEC_FMA(wj, VEC_SUB(pos, neg), a1);
170 pos = LOAD(fi + indexj_pos + 2 * VEC_SIZE);
171 neg = LOAD(fi + indexj_neg + 2 * VEC_SIZE);
172 a2 = VEC_FMA(wj, VEC_SUB(pos, neg), a2);
173 pos = LOAD(fi + indexj_pos + 3 * VEC_SIZE);
174 neg = LOAD(fi + indexj_neg + 3 * VEC_SIZE);
175 a3 = VEC_FMA(wj, VEC_SUB(pos, neg), a3);
176 pos = LOAD(fi + indexj_pos + 4 * VEC_SIZE);
177 neg = LOAD(fi + indexj_neg + 4 * VEC_SIZE);
178 a4 = VEC_FMA(wj, VEC_SUB(pos, neg), a4);
179 pos = LOAD(fi + indexj_pos + 5 * VEC_SIZE);
180 neg = LOAD(fi + indexj_neg + 5 * VEC_SIZE);
181 a5 = VEC_FMA(wj, VEC_SUB(pos, neg), a5);
182 pos = LOAD(fi + indexj_pos + 6 * VEC_SIZE);
183 neg = LOAD(fi + indexj_neg + 6 * VEC_SIZE);
184 a6 = VEC_FMA(wj, VEC_SUB(pos, neg), a6);
185 pos = LOAD(fi + indexj_pos + 7 * VEC_SIZE);
186 neg = LOAD(fi + indexj_neg + 7 * VEC_SIZE);
187 a7 = VEC_FMA(wj, VEC_SUB(pos, neg), a7);
189 STORE(fo + base_ik, a0);
190 STORE(fo + base_ik + 1 * VEC_SIZE, a1);
191 STORE(fo + base_ik + 2 * VEC_SIZE, a2);
192 STORE(fo + base_ik + 3 * VEC_SIZE, a3);
193 STORE(fo + base_ik + 4 * VEC_SIZE, a4);
194 STORE(fo + base_ik + 5 * VEC_SIZE, a5);
195 STORE(fo + base_ik + 6 * VEC_SIZE, a6);
196 STORE(fo + base_ik + 7 * VEC_SIZE, a7);
202 for (;
i < (rimap_inv_max[
l] - unroll4 + 1);
i += unroll4) {
204 for (k = 0; k < (1 << ldf); k += 4 * VEC_SIZE) {
205 register VEC_TYPE a0, a1, a2, a3;
207 a0 = a1 = a2 = a3 = VEC_ZERO;
211 for (
j = 0;
j < npairs;
j++) {
212 register VEC_TYPE wj = VEC_SCAL(wpair[
j]);
215 register VEC_TYPE pos = LOAD(fi + indexj_pos);
216 register VEC_TYPE neg = LOAD(fi + indexj_neg);
217 a0 = VEC_FMA(wj, VEC_SUB(pos, neg), a0);
218 pos = LOAD(fi + indexj_pos + 1 * VEC_SIZE);
219 neg = LOAD(fi + indexj_neg + 1 * VEC_SIZE);
220 a1 = VEC_FMA(wj, VEC_SUB(pos, neg), a1);
221 pos = LOAD(fi + indexj_pos + 2 * VEC_SIZE);
222 neg = LOAD(fi + indexj_neg + 2 * VEC_SIZE);
223 a2 = VEC_FMA(wj, VEC_SUB(pos, neg), a2);
224 pos = LOAD(fi + indexj_pos + 3 * VEC_SIZE);
225 neg = LOAD(fi + indexj_neg + 3 * VEC_SIZE);
226 a3 = VEC_FMA(wj, VEC_SUB(pos, neg), a3);
228 STORE(fo + base_ik, a0);
229 STORE(fo + base_ik + 1 * VEC_SIZE, a1);
230 STORE(fo + base_ik + 2 * VEC_SIZE, a2);
231 STORE(fo + base_ik + 3 * VEC_SIZE, a3);
237 for (;
i < (rimap_inv_max[
l] - unroll2 + 1);
i += unroll2) {
239 for (k = 0; k < (1 << ldf); k += 2 * VEC_SIZE) {
240 register VEC_TYPE a0, a1;
246 for (
j = 0;
j < npairs;
j++) {
247 register VEC_TYPE wj = VEC_SCAL(wpair[
j]);
250 register VEC_TYPE pos = LOAD(fi + indexj_pos);
251 register VEC_TYPE neg = LOAD(fi + indexj_neg);
252 a0 = VEC_FMA(wj, VEC_SUB(pos, neg), a0);
253 pos = LOAD(fi + indexj_pos + 1 * VEC_SIZE);
254 neg = LOAD(fi + indexj_neg + 1 * VEC_SIZE);
255 a1 = VEC_FMA(wj, VEC_SUB(pos, neg), a1);
257 STORE(fo + base_ik, a0);
258 STORE(fo + base_ik + 1 * VEC_SIZE, a1);
264 for (;
i < (rimap_inv_max[
l] - unroll1 + 1);
i += unroll1) {
266 for (k = 0; k < (1 << ldf); k += VEC_SIZE) {
267 register VEC_TYPE a0 = VEC_ZERO;
269 for (
j = 0;
j < npairs;
j++) {
270 register VEC_TYPE wj = VEC_SCAL(wpair[
j]);
273 register VEC_TYPE pos = LOAD(fi + indexj_pos);
274 register VEC_TYPE neg = LOAD(fi + indexj_neg);
275 a0 = VEC_FMA(wj, VEC_SUB(pos, neg), a0);
277 STORE(fo + base_ik, a0);
287 for (;
i < rimap_inv_max[
l];
i++) {
291 for (
j = 0;
j < npairs;
j++) {
294 const double diff = fi[indexj_pos] - fi[indexj_neg];
295 a += wpair[
j] * diff;
306#if defined(ALIGNED) && defined(FENCE)
const int *restrict index_neg
const int *restrict index_pos