6 #ifndef CoinAbcHelperFunctions_H
7 #define CoinAbcHelperFunctions_H
21 #define abc_assert(condition) \
24 printf("abc_assert in %s at line %d - %s is false\n", \
25 __FILE__, __LINE__, __STRING(condition)); \
31 #define CILK_FOR_GRAINSIZE 128
34 #include "emmintrin.h"
36 #include <immintrin.h>
38 #include "avx2intrin.h"
48 #define UNROLL_SCATTER 2
49 #define INLINE_SCATTER 1
50 #if INLINE_SCATTER == 0
61 #if UNROLL_SCATTER == 0
62 for (CoinBigIndex j = number - 1; j >= 0; j--) {
64 CoinFactorizationDouble regionValue = region[iRow];
65 CoinFactorizationDouble value = thisElement[j];
67 region[iRow] = regionValue - value * pivotValue;
69 #elif UNROLL_SCATTER == 1
70 if ((number & 1) != 0) {
73 CoinFactorizationDouble regionValue = region[iRow];
74 CoinFactorizationDouble value = thisElement[number];
75 region[iRow] = regionValue - value * pivotValue;
77 for (CoinBigIndex j = number - 1; j >= 0; j -= 2) {
80 CoinFactorizationDouble regionValue0 = region[iRow0];
81 CoinFactorizationDouble regionValue1 = region[iRow1];
82 region[iRow0] = regionValue0 - thisElement[j] * pivotValue;
83 region[iRow1] = regionValue1 - thisElement[j - 1] * pivotValue;
85 #elif UNROLL_SCATTER == 2
86 if ((number & 1) != 0) {
89 CoinFactorizationDouble regionValue = region[iRow];
90 CoinFactorizationDouble value = thisElement[number];
91 region[iRow] = regionValue - value * pivotValue;
93 if ((number & 2) != 0) {
95 CoinFactorizationDouble regionValue0 = region[iRow0];
96 CoinFactorizationDouble value0 = thisElement[number - 1];
98 CoinFactorizationDouble regionValue1 = region[iRow1];
99 CoinFactorizationDouble value1 = thisElement[number - 2];
100 region[iRow0] = regionValue0 - value0 * pivotValue;
101 region[iRow1] = regionValue1 - value1 * pivotValue;
104 #pragma cilk grainsize = CILK_FOR_GRAINSIZE
105 cilk_for(CoinBigIndex j = number - 1; j >= 0; j -= 4)
109 CoinFactorizationDouble regionValue0 = region[iRow0];
110 CoinFactorizationDouble regionValue1 = region[iRow1];
111 region[iRow0] = regionValue0 - thisElement[j] * pivotValue;
112 region[iRow1] = regionValue1 - thisElement[j - 1] * pivotValue;
115 CoinFactorizationDouble regionValue2 = region[iRow2];
116 CoinFactorizationDouble regionValue3 = region[iRow3];
117 region[iRow2] = regionValue2 - thisElement[j - 2] * pivotValue;
118 region[iRow3] = regionValue3 - thisElement[j - 3] * pivotValue;
120 #elif UNROLL_SCATTER == 3
123 CoinFactorizationDouble regionValue0;
124 CoinFactorizationDouble regionValue1;
125 switch (
static_cast< unsigned int >(number)) {
129 iRow0 = thisIndex[0];
130 regionValue0 = region[iRow0];
131 region[iRow0] = regionValue0 - thisElement[0] * pivotValue;
134 iRow0 = thisIndex[0];
135 iRow1 = thisIndex[1];
136 regionValue0 = region[iRow0];
137 regionValue1 = region[iRow1];
138 region[iRow0] = regionValue0 - thisElement[0] * pivotValue;
139 region[iRow1] = regionValue1 - thisElement[1] * pivotValue;
142 iRow0 = thisIndex[0];
143 iRow1 = thisIndex[1];
144 regionValue0 = region[iRow0];
145 regionValue1 = region[iRow1];
146 region[iRow0] = regionValue0 - thisElement[0] * pivotValue;
147 region[iRow1] = regionValue1 - thisElement[1] * pivotValue;
148 iRow0 = thisIndex[2];
149 regionValue0 = region[iRow0];
150 region[iRow0] = regionValue0 - thisElement[2] * pivotValue;
153 iRow0 = thisIndex[0];
154 iRow1 = thisIndex[1];
155 regionValue0 = region[iRow0];
156 regionValue1 = region[iRow1];
157 region[iRow0] = regionValue0 - thisElement[0] * pivotValue;
158 region[iRow1] = regionValue1 - thisElement[1] * pivotValue;
159 iRow0 = thisIndex[2];
160 iRow1 = thisIndex[3];
161 regionValue0 = region[iRow0];
162 regionValue1 = region[iRow1];
163 region[iRow0] = regionValue0 - thisElement[2] * pivotValue;
164 region[iRow1] = regionValue1 - thisElement[3] * pivotValue;
167 iRow0 = thisIndex[0];
168 iRow1 = thisIndex[1];
169 regionValue0 = region[iRow0];
170 regionValue1 = region[iRow1];
171 region[iRow0] = regionValue0 - thisElement[0] * pivotValue;
172 region[iRow1] = regionValue1 - thisElement[1] * pivotValue;
173 iRow0 = thisIndex[2];
174 iRow1 = thisIndex[3];
175 regionValue0 = region[iRow0];
176 regionValue1 = region[iRow1];
177 region[iRow0] = regionValue0 - thisElement[2] * pivotValue;
178 region[iRow1] = regionValue1 - thisElement[3] * pivotValue;
179 iRow0 = thisIndex[4];
180 regionValue0 = region[iRow0];
181 region[iRow0] = regionValue0 - thisElement[4] * pivotValue;
184 iRow0 = thisIndex[0];
185 iRow1 = thisIndex[1];
186 regionValue0 = region[iRow0];
187 regionValue1 = region[iRow1];
188 region[iRow0] = regionValue0 - thisElement[0] * pivotValue;
189 region[iRow1] = regionValue1 - thisElement[1] * pivotValue;
190 iRow0 = thisIndex[2];
191 iRow1 = thisIndex[3];
192 regionValue0 = region[iRow0];
193 regionValue1 = region[iRow1];
194 region[iRow0] = regionValue0 - thisElement[2] * pivotValue;
195 region[iRow1] = regionValue1 - thisElement[3] * pivotValue;
196 iRow0 = thisIndex[4];
197 iRow1 = thisIndex[5];
198 regionValue0 = region[iRow0];
199 regionValue1 = region[iRow1];
200 region[iRow0] = regionValue0 - thisElement[4] * pivotValue;
201 region[iRow1] = regionValue1 - thisElement[5] * pivotValue;
204 iRow0 = thisIndex[0];
205 iRow1 = thisIndex[1];
206 regionValue0 = region[iRow0];
207 regionValue1 = region[iRow1];
208 region[iRow0] = regionValue0 - thisElement[0] * pivotValue;
209 region[iRow1] = regionValue1 - thisElement[1] * pivotValue;
210 iRow0 = thisIndex[2];
211 iRow1 = thisIndex[3];
212 regionValue0 = region[iRow0];
213 regionValue1 = region[iRow1];
214 region[iRow0] = regionValue0 - thisElement[2] * pivotValue;
215 region[iRow1] = regionValue1 - thisElement[3] * pivotValue;
216 iRow0 = thisIndex[4];
217 iRow1 = thisIndex[5];
218 regionValue0 = region[iRow0];
219 regionValue1 = region[iRow1];
220 region[iRow0] = regionValue0 - thisElement[4] * pivotValue;
221 region[iRow1] = regionValue1 - thisElement[5] * pivotValue;
222 iRow0 = thisIndex[6];
223 regionValue0 = region[iRow0];
224 region[iRow0] = regionValue0 - thisElement[6] * pivotValue;
227 iRow0 = thisIndex[0];
228 iRow1 = thisIndex[1];
229 regionValue0 = region[iRow0];
230 regionValue1 = region[iRow1];
231 region[iRow0] = regionValue0 - thisElement[0] * pivotValue;
232 region[iRow1] = regionValue1 - thisElement[1] * pivotValue;
233 iRow0 = thisIndex[2];
234 iRow1 = thisIndex[3];
235 regionValue0 = region[iRow0];
236 regionValue1 = region[iRow1];
237 region[iRow0] = regionValue0 - thisElement[2] * pivotValue;
238 region[iRow1] = regionValue1 - thisElement[3] * pivotValue;
239 iRow0 = thisIndex[4];
240 iRow1 = thisIndex[5];
241 regionValue0 = region[iRow0];
242 regionValue1 = region[iRow1];
243 region[iRow0] = regionValue0 - thisElement[4] * pivotValue;
244 region[iRow1] = regionValue1 - thisElement[5] * pivotValue;
245 iRow0 = thisIndex[6];
246 iRow1 = thisIndex[7];
247 regionValue0 = region[iRow0];
248 regionValue1 = region[iRow1];
249 region[iRow0] = regionValue0 - thisElement[6] * pivotValue;
250 region[iRow1] = regionValue1 - thisElement[7] * pivotValue;
253 if ((number & 1) != 0) {
256 CoinFactorizationDouble regionValue = region[iRow];
257 CoinFactorizationDouble value = thisElement[number];
258 region[iRow] = regionValue - value * pivotValue;
260 for (CoinBigIndex j = number - 1; j >= 0; j -= 2) {
263 CoinFactorizationDouble regionValue0 = region[iRow0];
264 CoinFactorizationDouble regionValue1 = region[iRow1];
265 region[iRow0] = regionValue0 - thisElement[j] * pivotValue;
266 region[iRow1] = regionValue1 - thisElement[j - 1] * pivotValue;
276 #if UNROLL_SCATTER == 0
277 const int *
COIN_RESTRICT thisIndex =
reinterpret_cast< const int *
>(thisElement + number);
278 for (CoinBigIndex j = number - 1; j >= 0; j--) {
280 CoinFactorizationDouble regionValue = region[iRow];
281 CoinFactorizationDouble value = thisElement[j];
283 region[iRow] = regionValue - value * pivotValue;
285 #elif UNROLL_SCATTER == 1
286 const int *
COIN_RESTRICT thisIndex =
reinterpret_cast< const int *
>(thisElement + number);
287 if ((number & 1) != 0) {
290 CoinFactorizationDouble regionValue = region[iRow];
291 CoinFactorizationDouble value = thisElement[number];
292 region[iRow] = regionValue - value * pivotValue;
294 for (CoinBigIndex j = number - 1; j >= 0; j -= 2) {
297 CoinFactorizationDouble regionValue0 = region[iRow0];
298 CoinFactorizationDouble regionValue1 = region[iRow1];
299 region[iRow0] = regionValue0 - thisElement[j] * pivotValue;
300 region[iRow1] = regionValue1 - thisElement[j - 1] * pivotValue;
302 #elif UNROLL_SCATTER == 2
303 const int *
COIN_RESTRICT thisIndex =
reinterpret_cast< const int *
>(thisElement + number);
304 if ((number & 1) != 0) {
307 CoinFactorizationDouble regionValue = region[iRow];
308 CoinFactorizationDouble value = thisElement[number];
309 region[iRow] = regionValue - value * pivotValue;
311 if ((number & 2) != 0) {
313 CoinFactorizationDouble regionValue0 = region[iRow0];
314 CoinFactorizationDouble value0 = thisElement[number - 1];
316 CoinFactorizationDouble regionValue1 = region[iRow1];
317 CoinFactorizationDouble value1 = thisElement[number - 2];
318 region[iRow0] = regionValue0 - value0 * pivotValue;
319 region[iRow1] = regionValue1 - value1 * pivotValue;
323 CoinFactorizationDouble temp[4] __attribute__((aligned(32)));
324 __m256d pv = _mm256_broadcast_sd(&pivotValue);
325 for (CoinBigIndex j = number - 1; j >= 0; j -= 4) {
326 __m256d elements = _mm256_loadu_pd(thisElement + j - 3);
331 temp[0] = region[iRow0];
332 temp[1] = region[iRow1];
333 temp[2] = region[iRow2];
334 temp[3] = region[iRow3];
335 __m256d t0 = _mm256_load_pd(temp);
337 _mm256_store_pd(temp, t0);
338 region[iRow0] = temp[0];
339 region[iRow1] = temp[1];
340 region[iRow2] = temp[2];
341 region[iRow3] = temp[3];
344 #pragma cilk grainsize = CILK_FOR_GRAINSIZE
345 cilk_for(CoinBigIndex j = number - 1; j >= 0; j -= 4)
349 CoinFactorizationDouble regionValue0 = region[iRow0];
350 CoinFactorizationDouble regionValue1 = region[iRow1];
351 region[iRow0] = regionValue0 - thisElement[j] * pivotValue;
352 region[iRow1] = regionValue1 - thisElement[j - 1] * pivotValue;
355 CoinFactorizationDouble regionValue2 = region[iRow2];
356 CoinFactorizationDouble regionValue3 = region[iRow3];
357 region[iRow2] = regionValue2 - thisElement[j - 2] * pivotValue;
358 region[iRow3] = regionValue3 - thisElement[j - 3] * pivotValue;
361 #elif UNROLL_SCATTER == 3
362 const int *
COIN_RESTRICT thisIndex =
reinterpret_cast< const int *
>(thisElement + number);
365 CoinFactorizationDouble regionValue0;
366 CoinFactorizationDouble regionValue1;
367 switch (
static_cast< unsigned int >(number)) {
371 iRow0 = thisIndex[0];
372 regionValue0 = region[iRow0];
373 region[iRow0] = regionValue0 - thisElement[0] * pivotValue;
376 iRow0 = thisIndex[0];
377 iRow1 = thisIndex[1];
378 regionValue0 = region[iRow0];
379 regionValue1 = region[iRow1];
380 region[iRow0] = regionValue0 - thisElement[0] * pivotValue;
381 region[iRow1] = regionValue1 - thisElement[1] * pivotValue;
384 iRow0 = thisIndex[0];
385 iRow1 = thisIndex[1];
386 regionValue0 = region[iRow0];
387 regionValue1 = region[iRow1];
388 region[iRow0] = regionValue0 - thisElement[0] * pivotValue;
389 region[iRow1] = regionValue1 - thisElement[1] * pivotValue;
390 iRow0 = thisIndex[2];
391 regionValue0 = region[iRow0];
392 region[iRow0] = regionValue0 - thisElement[2] * pivotValue;
395 iRow0 = thisIndex[0];
396 iRow1 = thisIndex[1];
397 regionValue0 = region[iRow0];
398 regionValue1 = region[iRow1];
399 region[iRow0] = regionValue0 - thisElement[0] * pivotValue;
400 region[iRow1] = regionValue1 - thisElement[1] * pivotValue;
401 iRow0 = thisIndex[2];
402 iRow1 = thisIndex[3];
403 regionValue0 = region[iRow0];
404 regionValue1 = region[iRow1];
405 region[iRow0] = regionValue0 - thisElement[2] * pivotValue;
406 region[iRow1] = regionValue1 - thisElement[3] * pivotValue;
409 iRow0 = thisIndex[0];
410 iRow1 = thisIndex[1];
411 regionValue0 = region[iRow0];
412 regionValue1 = region[iRow1];
413 region[iRow0] = regionValue0 - thisElement[0] * pivotValue;
414 region[iRow1] = regionValue1 - thisElement[1] * pivotValue;
415 iRow0 = thisIndex[2];
416 iRow1 = thisIndex[3];
417 regionValue0 = region[iRow0];
418 regionValue1 = region[iRow1];
419 region[iRow0] = regionValue0 - thisElement[2] * pivotValue;
420 region[iRow1] = regionValue1 - thisElement[3] * pivotValue;
421 iRow0 = thisIndex[4];
422 regionValue0 = region[iRow0];
423 region[iRow0] = regionValue0 - thisElement[4] * pivotValue;
426 iRow0 = thisIndex[0];
427 iRow1 = thisIndex[1];
428 regionValue0 = region[iRow0];
429 regionValue1 = region[iRow1];
430 region[iRow0] = regionValue0 - thisElement[0] * pivotValue;
431 region[iRow1] = regionValue1 - thisElement[1] * pivotValue;
432 iRow0 = thisIndex[2];
433 iRow1 = thisIndex[3];
434 regionValue0 = region[iRow0];
435 regionValue1 = region[iRow1];
436 region[iRow0] = regionValue0 - thisElement[2] * pivotValue;
437 region[iRow1] = regionValue1 - thisElement[3] * pivotValue;
438 iRow0 = thisIndex[4];
439 iRow1 = thisIndex[5];
440 regionValue0 = region[iRow0];
441 regionValue1 = region[iRow1];
442 region[iRow0] = regionValue0 - thisElement[4] * pivotValue;
443 region[iRow1] = regionValue1 - thisElement[5] * pivotValue;
446 iRow0 = thisIndex[0];
447 iRow1 = thisIndex[1];
448 regionValue0 = region[iRow0];
449 regionValue1 = region[iRow1];
450 region[iRow0] = regionValue0 - thisElement[0] * pivotValue;
451 region[iRow1] = regionValue1 - thisElement[1] * pivotValue;
452 iRow0 = thisIndex[2];
453 iRow1 = thisIndex[3];
454 regionValue0 = region[iRow0];
455 regionValue1 = region[iRow1];
456 region[iRow0] = regionValue0 - thisElement[2] * pivotValue;
457 region[iRow1] = regionValue1 - thisElement[3] * pivotValue;
458 iRow0 = thisIndex[4];
459 iRow1 = thisIndex[5];
460 regionValue0 = region[iRow0];
461 regionValue1 = region[iRow1];
462 region[iRow0] = regionValue0 - thisElement[4] * pivotValue;
463 region[iRow1] = regionValue1 - thisElement[5] * pivotValue;
464 iRow0 = thisIndex[6];
465 regionValue0 = region[iRow0];
466 region[iRow0] = regionValue0 - thisElement[6] * pivotValue;
469 iRow0 = thisIndex[0];
470 iRow1 = thisIndex[1];
471 regionValue0 = region[iRow0];
472 regionValue1 = region[iRow1];
473 region[iRow0] = regionValue0 - thisElement[0] * pivotValue;
474 region[iRow1] = regionValue1 - thisElement[1] * pivotValue;
475 iRow0 = thisIndex[2];
476 iRow1 = thisIndex[3];
477 regionValue0 = region[iRow0];
478 regionValue1 = region[iRow1];
479 region[iRow0] = regionValue0 - thisElement[2] * pivotValue;
480 region[iRow1] = regionValue1 - thisElement[3] * pivotValue;
481 iRow0 = thisIndex[4];
482 iRow1 = thisIndex[5];
483 regionValue0 = region[iRow0];
484 regionValue1 = region[iRow1];
485 region[iRow0] = regionValue0 - thisElement[4] * pivotValue;
486 region[iRow1] = regionValue1 - thisElement[5] * pivotValue;
487 iRow0 = thisIndex[6];
488 iRow1 = thisIndex[7];
489 regionValue0 = region[iRow0];
490 regionValue1 = region[iRow1];
491 region[iRow0] = regionValue0 - thisElement[6] * pivotValue;
492 region[iRow1] = regionValue1 - thisElement[7] * pivotValue;
495 if ((number & 1) != 0) {
498 CoinFactorizationDouble regionValue = region[iRow];
499 CoinFactorizationDouble value = thisElement[number];
500 region[iRow] = regionValue - value * pivotValue;
502 for (CoinBigIndex j = number - 1; j >= 0; j -= 2) {
505 CoinFactorizationDouble regionValue0 = region[iRow0];
506 CoinFactorizationDouble regionValue1 = region[iRow1];
507 region[iRow0] = regionValue0 - thisElement[j] * pivotValue;
508 region[iRow1] = regionValue1 - thisElement[j - 1] * pivotValue;
518 #define coin_prefetch(mem) \
519 __asm__ __volatile__("prefetchnta %0" \
521 : "m"(*(reinterpret_cast< char * >(mem))))
522 #define coin_prefetch_const(mem) \
523 __asm__ __volatile__("prefetchnta %0" \
525 : "m"(*(reinterpret_cast< const char * >(mem))))
527 #define coin_prefetch(mem) \
528 __asm__ __volatile__("prefetch %0" \
530 : "m"(*(reinterpret_cast< char * >(mem))))
531 #define coin_prefetch_const(mem) \
532 __asm__ __volatile__("prefetch %0" \
534 : "m"(*(reinterpret_cast< const char * >(mem))))
538 #define coin_prefetch(mem)
539 #define coin_prefetch_const(mem)
541 #define NEW_CHUNK_SIZE 4
542 #define NEW_CHUNK_SIZE_INCREMENT (NEW_CHUNK_SIZE + NEW_CHUNK_SIZE / 2);
543 #define NEW_CHUNK_SIZE_OFFSET (NEW_CHUNK_SIZE / 2)
547 #define SCATTER_ATTRIBUTE
665 #if INLINE_SCATTER == 0
679 #if UNROLL_SCATTER == 0
680 for (CoinBigIndex j=number-1 ; j >=0; j-- ) {
682 CoinFactorizationDouble regionValue = region[iRow];
683 CoinFactorizationDouble value = thisElement[j];
685 region[iRow] = regionValue - value * pivotValue;
687 #elif UNROLL_SCATTER == 1
691 CoinFactorizationDouble regionValue = region[iRow];
692 CoinFactorizationDouble value = thisElement[0];
694 region[iRow] = regionValue - value * pivotValue;
697 CoinFactorizationDouble work2[4];
698 for ( ; number !=0; number-- ) {
701 work2[0] = region[iRow0];
702 work2[1] = region[iRow1];
704 work2[2] = region[iRow0];
705 work2[3] = region[iRow1];
707 __v4df b = __builtin_ia32_loadupd256(work2);
710 work2[0] -= thisElement[0] * pivotValue;
711 work2[1] -= thisElement[1] * pivotValue;
712 region[iRow0] = work2[0];
713 region[iRow1] = work2[1];
721 #define UNROLL_GATHER 0
722 #define INLINE_GATHER 1
723 #if INLINE_GATHER == 0
734 #if UNROLL_GATHER == 0
735 CoinFactorizationDouble pivotValue = 0.0;
736 for (CoinBigIndex j = 0; j < number; j++) {
737 CoinFactorizationDouble value = thisElement[j];
739 value *= region[jRow];
748 #define UNROLL_MULTIPLY_INDEXED 0
749 #define INLINE_MULTIPLY_INDEXED 0
750 #if INLINE_MULTIPLY_INDEXED == 0
770 void CoinAbcScale(
double *region,
double multiplier,
int size);
776 double *regionChanged,
double multiplier2);
778 void CoinAbcGetNorms(
const double *region,
int size,
double &norm1,
double &norm2);
780 void CoinAbcScatterTo(
const double *regionFrom,
double *regionTo,
const int *index,
int number);
782 void CoinAbcGatherFrom(
const double *regionFrom,
double *regionTo,
const int *index,
int number);
787 const int *indexList,
const int *indexScatter,
int number);
793 void CoinAbcMemcpyLong(
unsigned char *array,
const unsigned char *arrayFrom,
int size);
797 void CoinAbcMemmove(
double *array,
const double *arrayFrom,
int size);
799 void CoinAbcMemmove(
unsigned char *array,
const unsigned char *arrayFrom,
int size);
803 int CoinAbcCompact(
int numberSections,
int alreadyDone,
double *array,
const int *starts,
const int *lengths);
805 int CoinAbcCompact(
int numberSections,
int alreadyDone,
int *array,
const int *starts,
const int *lengths);
807 #if ABC_CREATE_SCATTER_FUNCTION
808 SCATTER_ATTRIBUTE void functionName(ScatterUpdate1)(
int numberIn, CoinFactorizationDouble multiplier,
813 assert(numberIn == 1);
815 const int *
COIN_RESTRICT thisColumn =
reinterpret_cast< const int *
>(element + 1);
816 int iColumn0 = thisColumn[0];
817 double value0 = region[iColumn0];
818 value0 OPERATION multiplier *element[0];
819 region[iColumn0] = value0;
821 SCATTER_ATTRIBUTE void functionName(ScatterUpdate2)(
int numberIn, CoinFactorizationDouble multiplier,
826 assert(numberIn == 2);
828 const int *
COIN_RESTRICT thisColumn =
reinterpret_cast< const int *
>(element + 2);
829 #if NEW_CHUNK_SIZE == 2
833 int iColumn0 = thisColumn[0];
834 int iColumn1 = thisColumn[1];
835 CoinFactorizationDouble value0 = region[iColumn0];
836 CoinFactorizationDouble value1 = region[iColumn1];
839 region[iColumn0] = value0;
840 region[iColumn1] = value1;
842 thisColumn =
reinterpret_cast< const int *
>(element);
845 #if NEW_CHUNK_SIZE == 4
846 int iColumn0 = thisColumn[0];
847 int iColumn1 = thisColumn[1];
848 CoinFactorizationDouble value0 = region[iColumn0];
849 CoinFactorizationDouble value1 = region[iColumn1];
850 value0 OPERATION multiplier *element[0];
851 value1 OPERATION multiplier *element[1];
852 region[iColumn0] = value0;
853 region[iColumn1] = value1;
856 SCATTER_ATTRIBUTE void functionName(ScatterUpdate3)(
int numberIn, CoinFactorizationDouble multiplier,
861 assert(numberIn == 3);
863 const int *
COIN_RESTRICT thisColumn =
reinterpret_cast< const int *
>(element + 3);
867 #if NEW_CHUNK_SIZE == 2
871 int iColumn0 = thisColumn[0];
872 int iColumn1 = thisColumn[1];
873 CoinFactorizationDouble value0 = region[iColumn0];
874 CoinFactorizationDouble value1 = region[iColumn1];
875 value0 OPERATION multiplier *element[0];
876 value1 OPERATION multiplier *element[1];
877 region[iColumn0] = value0;
878 region[iColumn1] = value1;
883 #if NEW_CHUNK_SIZE == 2
884 int iColumn0 = thisColumn[0];
885 double value0 = region[iColumn0];
886 value0 OPERATION multiplier *element[0];
887 region[iColumn0] = value0;
889 int iColumn0 = thisColumn[0];
890 int iColumn1 = thisColumn[1];
891 int iColumn2 = thisColumn[2];
894 double value2 = region[iColumn2];
895 value2 OPERATION multiplier *element[2];
896 set_const_v2df(bb, multiplier);
897 temp[0] = region[iColumn0];
898 temp[1] = region[iColumn1];
899 region[iColumn2] = value2;
900 __v2df v0 = __builtin_ia32_loadupd(temp);
901 __v2df a = __builtin_ia32_loadupd(element);
904 __builtin_ia32_storeupd(temp, v0);
905 region[iColumn0] = temp[0];
906 region[iColumn1] = temp[1];
908 double value0 = region[iColumn0];
909 double value1 = region[iColumn1];
910 double value2 = region[iColumn2];
911 value0 OPERATION multiplier *element[0];
912 value1 OPERATION multiplier *element[1];
913 value2 OPERATION multiplier *element[2];
914 region[iColumn0] = value0;
915 region[iColumn1] = value1;
916 region[iColumn2] = value2;
920 SCATTER_ATTRIBUTE void functionName(ScatterUpdate4)(
int numberIn, CoinFactorizationDouble multiplier,
925 assert(numberIn == 4);
927 const int *
COIN_RESTRICT thisColumn =
reinterpret_cast< const int *
>(element + 4);
934 #if NEW_CHUNK_SIZE == 2
935 int iColumn0 = thisColumn[0];
936 int iColumn1 = thisColumn[1];
937 double value0 = region[iColumn0];
938 double value1 = region[iColumn1];
939 value0 OPERATION multiplier *element[0];
940 value1 OPERATION multiplier *element[1];
941 region[iColumn0] = value0;
942 region[iColumn1] = value1;
943 #elif NEW_CHUNK_SIZE == 4
944 int iColumn0 = thisColumn[0];
945 int iColumn1 = thisColumn[1];
946 int iColumn2 = thisColumn[2];
947 int iColumn3 = thisColumn[3];
950 set_const_v2df(bb, multiplier);
951 temp[0] = region[iColumn0];
952 temp[1] = region[iColumn1];
953 temp[2] = region[iColumn2];
954 temp[3] = region[iColumn3];
955 __v2df v0 = __builtin_ia32_loadupd(temp);
956 __v2df v1 = __builtin_ia32_loadupd(temp + 2);
957 __v2df a = __builtin_ia32_loadupd(element);
960 a = __builtin_ia32_loadupd(element + 2);
963 __builtin_ia32_storeupd(temp, v0);
964 __builtin_ia32_storeupd(temp + 2, v1);
965 region[iColumn0] = temp[0];
966 region[iColumn1] = temp[1];
967 region[iColumn2] = temp[2];
968 region[iColumn3] = temp[3];
970 double value0 = region[iColumn0];
971 double value1 = region[iColumn1];
972 double value2 = region[iColumn2];
973 double value3 = region[iColumn3];
974 value0 OPERATION multiplier *element[0];
975 value1 OPERATION multiplier *element[1];
976 value2 OPERATION multiplier *element[2];
977 value3 OPERATION multiplier *element[3];
978 region[iColumn0] = value0;
979 region[iColumn1] = value1;
980 region[iColumn2] = value2;
981 region[iColumn3] = value3;
990 SCATTER_ATTRIBUTE void functionName(ScatterUpdate5)(
int numberIn, CoinFactorizationDouble multiplier,
995 assert(numberIn == 5);
997 const int *
COIN_RESTRICT thisColumn =
reinterpret_cast< const int *
>(element + 5);
1004 #if NEW_CHUNK_SIZE == 2
1005 int iColumn0 = thisColumn[0];
1006 int iColumn1 = thisColumn[1];
1007 double value0 = region[iColumn0];
1008 double value1 = region[iColumn1];
1009 value0 OPERATION multiplier *element[0];
1010 value1 OPERATION multiplier *element[1];
1011 region[iColumn0] = value0;
1012 region[iColumn1] = value1;
1013 #elif NEW_CHUNK_SIZE == 4
1014 int iColumn0 = thisColumn[0];
1015 int iColumn1 = thisColumn[1];
1016 int iColumn2 = thisColumn[2];
1017 int iColumn3 = thisColumn[3];
1020 set_const_v2df(bb, multiplier);
1021 temp[0] = region[iColumn0];
1022 temp[1] = region[iColumn1];
1023 temp[2] = region[iColumn2];
1024 temp[3] = region[iColumn3];
1025 __v2df v0 = __builtin_ia32_loadupd(temp);
1026 __v2df v1 = __builtin_ia32_loadupd(temp + 2);
1027 __v2df a = __builtin_ia32_loadupd(element);
1030 a = __builtin_ia32_loadupd(element + 2);
1033 __builtin_ia32_storeupd(temp, v0);
1034 __builtin_ia32_storeupd(temp + 2, v1);
1035 region[iColumn0] = temp[0];
1036 region[iColumn1] = temp[1];
1037 region[iColumn2] = temp[2];
1038 region[iColumn3] = temp[3];
1040 double value0 = region[iColumn0];
1041 double value1 = region[iColumn1];
1042 double value2 = region[iColumn2];
1043 double value3 = region[iColumn3];
1044 value0 OPERATION multiplier *element[0];
1045 value1 OPERATION multiplier *element[1];
1046 value2 OPERATION multiplier *element[2];
1047 value3 OPERATION multiplier *element[3];
1048 region[iColumn0] = value0;
1049 region[iColumn1] = value1;
1050 region[iColumn2] = value2;
1051 region[iColumn3] = value3;
1059 int iColumn0 = thisColumn[0];
1060 double value0 = region[iColumn0];
1061 value0 OPERATION multiplier *element[0];
1062 region[iColumn0] = value0;
1064 SCATTER_ATTRIBUTE void functionName(ScatterUpdate6)(
int numberIn, CoinFactorizationDouble multiplier,
1069 assert(numberIn == 6);
1071 const int *
COIN_RESTRICT thisColumn =
reinterpret_cast< const int *
>(element + 6);
1078 #if NEW_CHUNK_SIZE == 2
1079 int iColumn0 = thisColumn[0];
1080 int iColumn1 = thisColumn[1];
1081 double value0 = region[iColumn0];
1082 double value1 = region[iColumn1];
1083 value0 OPERATION multiplier *element[0];
1084 value1 OPERATION multiplier *element[1];
1085 region[iColumn0] = value0;
1086 region[iColumn1] = value1;
1087 #elif NEW_CHUNK_SIZE == 4
1088 int iColumn0 = thisColumn[0];
1089 int iColumn1 = thisColumn[1];
1090 int iColumn2 = thisColumn[2];
1091 int iColumn3 = thisColumn[3];
1094 set_const_v2df(bb, multiplier);
1095 temp[0] = region[iColumn0];
1096 temp[1] = region[iColumn1];
1097 temp[2] = region[iColumn2];
1098 temp[3] = region[iColumn3];
1099 __v2df v0 = __builtin_ia32_loadupd(temp);
1100 __v2df v1 = __builtin_ia32_loadupd(temp + 2);
1101 __v2df a = __builtin_ia32_loadupd(element);
1104 a = __builtin_ia32_loadupd(element + 2);
1107 __builtin_ia32_storeupd(temp, v0);
1108 __builtin_ia32_storeupd(temp + 2, v1);
1109 region[iColumn0] = temp[0];
1110 region[iColumn1] = temp[1];
1111 region[iColumn2] = temp[2];
1112 region[iColumn3] = temp[3];
1114 double value0 = region[iColumn0];
1115 double value1 = region[iColumn1];
1116 double value2 = region[iColumn2];
1117 double value3 = region[iColumn3];
1118 value0 OPERATION multiplier *element[0];
1119 value1 OPERATION multiplier *element[1];
1120 value2 OPERATION multiplier *element[2];
1121 value3 OPERATION multiplier *element[3];
1122 region[iColumn0] = value0;
1123 region[iColumn1] = value1;
1124 region[iColumn2] = value2;
1125 region[iColumn3] = value3;
1133 #if NEW_CHUNK_SIZE == 4
1134 int iColumn0 = thisColumn[0];
1135 int iColumn1 = thisColumn[1];
1136 double value0 = region[iColumn0];
1137 double value1 = region[iColumn1];
1138 value0 OPERATION multiplier *element[0];
1139 value1 OPERATION multiplier *element[1];
1140 region[iColumn0] = value0;
1141 region[iColumn1] = value1;
1144 SCATTER_ATTRIBUTE void functionName(ScatterUpdate7)(
int numberIn, CoinFactorizationDouble multiplier,
1149 assert(numberIn == 7);
1151 const int *
COIN_RESTRICT thisColumn =
reinterpret_cast< const int *
>(element + 7);
1158 #if NEW_CHUNK_SIZE == 2
1159 int iColumn0 = thisColumn[0];
1160 int iColumn1 = thisColumn[1];
1161 double value0 = region[iColumn0];
1162 double value1 = region[iColumn1];
1163 value0 OPERATION multiplier *element[0];
1164 value1 OPERATION multiplier *element[1];
1165 region[iColumn0] = value0;
1166 region[iColumn1] = value1;
1167 #elif NEW_CHUNK_SIZE == 4
1168 int iColumn0 = thisColumn[0];
1169 int iColumn1 = thisColumn[1];
1170 int iColumn2 = thisColumn[2];
1171 int iColumn3 = thisColumn[3];
1174 set_const_v2df(bb, multiplier);
1175 temp[0] = region[iColumn0];
1176 temp[1] = region[iColumn1];
1177 temp[2] = region[iColumn2];
1178 temp[3] = region[iColumn3];
1179 __v2df v0 = __builtin_ia32_loadupd(temp);
1180 __v2df v1 = __builtin_ia32_loadupd(temp + 2);
1181 __v2df a = __builtin_ia32_loadupd(element);
1184 a = __builtin_ia32_loadupd(element + 2);
1187 __builtin_ia32_storeupd(temp, v0);
1188 __builtin_ia32_storeupd(temp + 2, v1);
1189 region[iColumn0] = temp[0];
1190 region[iColumn1] = temp[1];
1191 region[iColumn2] = temp[2];
1192 region[iColumn3] = temp[3];
1194 double value0 = region[iColumn0];
1195 double value1 = region[iColumn1];
1196 double value2 = region[iColumn2];
1197 double value3 = region[iColumn3];
1198 value0 OPERATION multiplier *element[0];
1199 value1 OPERATION multiplier *element[1];
1200 value2 OPERATION multiplier *element[2];
1201 value3 OPERATION multiplier *element[3];
1202 region[iColumn0] = value0;
1203 region[iColumn1] = value1;
1204 region[iColumn2] = value2;
1205 region[iColumn3] = value3;
1213 #if NEW_CHUNK_SIZE == 2
1214 int iColumn0 = thisColumn[0];
1215 double value0 = region[iColumn0];
1216 value0 OPERATION multiplier *element[0];
1217 region[iColumn0] = value0;
1219 int iColumn0 = thisColumn[0];
1220 int iColumn1 = thisColumn[1];
1221 int iColumn2 = thisColumn[2];
1222 double value0 = region[iColumn0];
1223 double value1 = region[iColumn1];
1224 double value2 = region[iColumn2];
1225 value0 OPERATION multiplier *element[0];
1226 value1 OPERATION multiplier *element[1];
1227 value2 OPERATION multiplier *element[2];
1228 region[iColumn0] = value0;
1229 region[iColumn1] = value1;
1230 region[iColumn2] = value2;
1233 SCATTER_ATTRIBUTE void functionName(ScatterUpdate8)(
int numberIn, CoinFactorizationDouble multiplier,
1238 assert(numberIn == 8);
1240 const int *
COIN_RESTRICT thisColumn =
reinterpret_cast< const int *
>(element + 8);
1247 #if NEW_CHUNK_SIZE == 2
1248 int iColumn0 = thisColumn[0];
1249 int iColumn1 = thisColumn[1];
1250 double value0 = region[iColumn0];
1251 double value1 = region[iColumn1];
1252 value0 OPERATION multiplier *element[0];
1253 value1 OPERATION multiplier *element[1];
1254 region[iColumn0] = value0;
1255 region[iColumn1] = value1;
1256 #elif NEW_CHUNK_SIZE == 4
1257 int iColumn0 = thisColumn[0];
1258 int iColumn1 = thisColumn[1];
1259 int iColumn2 = thisColumn[2];
1260 int iColumn3 = thisColumn[3];
1263 set_const_v2df(bb, multiplier);
1264 temp[0] = region[iColumn0];
1265 temp[1] = region[iColumn1];
1266 temp[2] = region[iColumn2];
1267 temp[3] = region[iColumn3];
1268 __v2df v0 = __builtin_ia32_loadupd(temp);
1269 __v2df v1 = __builtin_ia32_loadupd(temp + 2);
1270 __v2df a = __builtin_ia32_loadupd(element);
1273 a = __builtin_ia32_loadupd(element + 2);
1276 __builtin_ia32_storeupd(temp, v0);
1277 __builtin_ia32_storeupd(temp + 2, v1);
1278 region[iColumn0] = temp[0];
1279 region[iColumn1] = temp[1];
1280 region[iColumn2] = temp[2];
1281 region[iColumn3] = temp[3];
1283 double value0 = region[iColumn0];
1284 double value1 = region[iColumn1];
1285 double value2 = region[iColumn2];
1286 double value3 = region[iColumn3];
1287 value0 OPERATION multiplier *element[0];
1288 value1 OPERATION multiplier *element[1];
1289 value2 OPERATION multiplier *element[2];
1290 value3 OPERATION multiplier *element[3];
1291 region[iColumn0] = value0;
1292 region[iColumn1] = value1;
1293 region[iColumn2] = value2;
1294 region[iColumn3] = value3;
1303 SCATTER_ATTRIBUTE void functionName(ScatterUpdate4N)(
int numberIn, CoinFactorizationDouble multiplier,
1307 assert((numberIn & 3) == 0);
1308 const int *
COIN_RESTRICT thisColumn =
reinterpret_cast< const int *
>(element + numberIn);
1316 #if NEW_CHUNK_SIZE == 2
1317 int iColumn0 = thisColumn[0];
1318 int iColumn1 = thisColumn[1];
1319 double value0 = region[iColumn0];
1320 double value1 = region[iColumn1];
1321 value0 OPERATION multiplier *element[0];
1322 value1 OPERATION multiplier *element[1];
1323 region[iColumn0] = value0;
1324 region[iColumn1] = value1;
1325 #elif NEW_CHUNK_SIZE == 4
1326 int iColumn0 = thisColumn[0];
1327 int iColumn1 = thisColumn[1];
1328 int iColumn2 = thisColumn[2];
1329 int iColumn3 = thisColumn[3];
1332 set_const_v2df(bb, multiplier);
1333 temp[0] = region[iColumn0];
1334 temp[1] = region[iColumn1];
1335 temp[2] = region[iColumn2];
1336 temp[3] = region[iColumn3];
1337 __v2df v0 = __builtin_ia32_loadupd(temp);
1338 __v2df v1 = __builtin_ia32_loadupd(temp + 2);
1339 __v2df a = __builtin_ia32_loadupd(element);
1342 a = __builtin_ia32_loadupd(element + 2);
1345 __builtin_ia32_storeupd(temp, v0);
1346 __builtin_ia32_storeupd(temp + 2, v1);
1347 region[iColumn0] = temp[0];
1348 region[iColumn1] = temp[1];
1349 region[iColumn2] = temp[2];
1350 region[iColumn3] = temp[3];
1352 double value0 = region[iColumn0];
1353 double value1 = region[iColumn1];
1354 double value2 = region[iColumn2];
1355 double value3 = region[iColumn3];
1356 value0 OPERATION multiplier *element[0];
1357 value1 OPERATION multiplier *element[1];
1358 value2 OPERATION multiplier *element[2];
1359 value3 OPERATION multiplier *element[3];
1360 region[iColumn0] = value0;
1361 region[iColumn1] = value1;
1362 region[iColumn2] = value2;
1363 region[iColumn3] = value3;
1372 SCATTER_ATTRIBUTE void functionName(ScatterUpdate4NPlus1)(
int numberIn, CoinFactorizationDouble multiplier,
1376 assert((numberIn & 3) == 1);
1377 const int *
COIN_RESTRICT thisColumn =
reinterpret_cast< const int *
>(element + numberIn);
1385 #if NEW_CHUNK_SIZE == 2
1386 int iColumn0 = thisColumn[0];
1387 int iColumn1 = thisColumn[1];
1388 double value0 = region[iColumn0];
1389 double value1 = region[iColumn1];
1390 value0 OPERATION multiplier *element[0];
1391 value1 OPERATION multiplier *element[1];
1392 region[iColumn0] = value0;
1393 region[iColumn1] = value1;
1394 #elif NEW_CHUNK_SIZE == 4
1395 int iColumn0 = thisColumn[0];
1396 int iColumn1 = thisColumn[1];
1397 int iColumn2 = thisColumn[2];
1398 int iColumn3 = thisColumn[3];
1401 set_const_v2df(bb, multiplier);
1402 temp[0] = region[iColumn0];
1403 temp[1] = region[iColumn1];
1404 temp[2] = region[iColumn2];
1405 temp[3] = region[iColumn3];
1406 __v2df v0 = __builtin_ia32_loadupd(temp);
1407 __v2df v1 = __builtin_ia32_loadupd(temp + 2);
1408 __v2df a = __builtin_ia32_loadupd(element);
1411 a = __builtin_ia32_loadupd(element + 2);
1414 __builtin_ia32_storeupd(temp, v0);
1415 __builtin_ia32_storeupd(temp + 2, v1);
1416 region[iColumn0] = temp[0];
1417 region[iColumn1] = temp[1];
1418 region[iColumn2] = temp[2];
1419 region[iColumn3] = temp[3];
1421 double value0 = region[iColumn0];
1422 double value1 = region[iColumn1];
1423 double value2 = region[iColumn2];
1424 double value3 = region[iColumn3];
1425 value0 OPERATION multiplier *element[0];
1426 value1 OPERATION multiplier *element[1];
1427 value2 OPERATION multiplier *element[2];
1428 value3 OPERATION multiplier *element[3];
1429 region[iColumn0] = value0;
1430 region[iColumn1] = value1;
1431 region[iColumn2] = value2;
1432 region[iColumn3] = value3;
1440 int iColumn0 = thisColumn[0];
1441 double value0 = region[iColumn0];
1442 value0 OPERATION multiplier *element[0];
1443 region[iColumn0] = value0;
1445 SCATTER_ATTRIBUTE void functionName(ScatterUpdate4NPlus2)(
int numberIn, CoinFactorizationDouble multiplier,
1449 assert((numberIn & 3) == 2);
1450 const int *
COIN_RESTRICT thisColumn =
reinterpret_cast< const int *
>(element + numberIn);
1458 #if NEW_CHUNK_SIZE == 2
1459 int iColumn0 = thisColumn[0];
1460 int iColumn1 = thisColumn[1];
1461 double value0 = region[iColumn0];
1462 double value1 = region[iColumn1];
1463 value0 OPERATION multiplier *element[0];
1464 value1 OPERATION multiplier *element[1];
1465 region[iColumn0] = value0;
1466 region[iColumn1] = value1;
1467 #elif NEW_CHUNK_SIZE == 4
1468 int iColumn0 = thisColumn[0];
1469 int iColumn1 = thisColumn[1];
1470 int iColumn2 = thisColumn[2];
1471 int iColumn3 = thisColumn[3];
1474 set_const_v2df(bb, multiplier);
1475 temp[0] = region[iColumn0];
1476 temp[1] = region[iColumn1];
1477 temp[2] = region[iColumn2];
1478 temp[3] = region[iColumn3];
1479 __v2df v0 = __builtin_ia32_loadupd(temp);
1480 __v2df v1 = __builtin_ia32_loadupd(temp + 2);
1481 __v2df a = __builtin_ia32_loadupd(element);
1484 a = __builtin_ia32_loadupd(element + 2);
1487 __builtin_ia32_storeupd(temp, v0);
1488 __builtin_ia32_storeupd(temp + 2, v1);
1489 region[iColumn0] = temp[0];
1490 region[iColumn1] = temp[1];
1491 region[iColumn2] = temp[2];
1492 region[iColumn3] = temp[3];
1494 double value0 = region[iColumn0];
1495 double value1 = region[iColumn1];
1496 double value2 = region[iColumn2];
1497 double value3 = region[iColumn3];
1498 value0 OPERATION multiplier *element[0];
1499 value1 OPERATION multiplier *element[1];
1500 value2 OPERATION multiplier *element[2];
1501 value3 OPERATION multiplier *element[3];
1502 region[iColumn0] = value0;
1503 region[iColumn1] = value1;
1504 region[iColumn2] = value2;
1505 region[iColumn3] = value3;
1513 #if NEW_CHUNK_SIZE == 4
1514 int iColumn0 = thisColumn[0];
1515 int iColumn1 = thisColumn[1];
1516 double value0 = region[iColumn0];
1517 double value1 = region[iColumn1];
1518 value0 OPERATION multiplier *element[0];
1519 value1 OPERATION multiplier *element[1];
1520 region[iColumn0] = value0;
1521 region[iColumn1] = value1;
1524 SCATTER_ATTRIBUTE void functionName(ScatterUpdate4NPlus3)(
int numberIn, CoinFactorizationDouble multiplier,
1528 assert((numberIn & 3) == 3);
1529 const int *
COIN_RESTRICT thisColumn =
reinterpret_cast< const int *
>(element + numberIn);
1537 #if NEW_CHUNK_SIZE == 2
1538 int iColumn0 = thisColumn[0];
1539 int iColumn1 = thisColumn[1];
1540 double value0 = region[iColumn0];
1541 double value1 = region[iColumn1];
1542 value0 OPERATION multiplier *element[0];
1543 value1 OPERATION multiplier *element[1];
1544 region[iColumn0] = value0;
1545 region[iColumn1] = value1;
1546 #elif NEW_CHUNK_SIZE == 4
1547 int iColumn0 = thisColumn[0];
1548 int iColumn1 = thisColumn[1];
1549 int iColumn2 = thisColumn[2];
1550 int iColumn3 = thisColumn[3];
1553 set_const_v2df(bb, multiplier);
1554 temp[0] = region[iColumn0];
1555 temp[1] = region[iColumn1];
1556 temp[2] = region[iColumn2];
1557 temp[3] = region[iColumn3];
1558 __v2df v0 = __builtin_ia32_loadupd(temp);
1559 __v2df v1 = __builtin_ia32_loadupd(temp + 2);
1560 __v2df a = __builtin_ia32_loadupd(element);
1563 a = __builtin_ia32_loadupd(element + 2);
1566 __builtin_ia32_storeupd(temp, v0);
1567 __builtin_ia32_storeupd(temp + 2, v1);
1568 region[iColumn0] = temp[0];
1569 region[iColumn1] = temp[1];
1570 region[iColumn2] = temp[2];
1571 region[iColumn3] = temp[3];
1573 double value0 = region[iColumn0];
1574 double value1 = region[iColumn1];
1575 double value2 = region[iColumn2];
1576 double value3 = region[iColumn3];
1577 value0 OPERATION multiplier *element[0];
1578 value1 OPERATION multiplier *element[1];
1579 value2 OPERATION multiplier *element[2];
1580 value3 OPERATION multiplier *element[3];
1581 region[iColumn0] = value0;
1582 region[iColumn1] = value1;
1583 region[iColumn2] = value2;
1584 region[iColumn3] = value3;
1592 #if NEW_CHUNK_SIZE == 2
1593 int iColumn0 = thisColumn[0];
1594 double value0 = region[iColumn0];
1595 value0 OPERATION multiplier *element[0];
1596 region[iColumn0] = value0;
1598 int iColumn0 = thisColumn[0];
1599 int iColumn1 = thisColumn[1];
1600 int iColumn2 = thisColumn[2];
1601 double value0 = region[iColumn0];
1602 double value1 = region[iColumn1];
1603 double value2 = region[iColumn2];
1604 value0 OPERATION multiplier *element[0];
1605 value1 OPERATION multiplier *element[1];
1606 value2 OPERATION multiplier *element[2];
1607 region[iColumn0] = value0;
1608 region[iColumn1] = value1;
1609 region[iColumn2] = value2;