37{
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112 Int GoEast, GoSouth, Xinc, Yinc, ilow, imbloc, inbloc, iupp, kb,
113 lcmt, lcmt00, lmbloc, lnbloc, low, mb, mblkd, mblks, mbloc,
114 nb, nblkd, nblks, nbloc, notran, npcol, npq=0, nprow, pmb,
115 qnb, rows, size, tmp1, tmp2, upp;
116 char * Xptrd, * Yptrd;
117
118
119
120
122
123
124
125 if( ( mblks == 0 ) || ( nblks == 0 ) ) return( 0 );
126
127
128
134
136
139
141 {
142
143
144
145 if( rows )
146 {
147
148
149
150 Xinc = size;
151 Yinc = ( notran ? size : INCY * size );
152 }
153 else
154 {
155
156
157
158 Xinc = INCX * size;
159 Yinc = ( notran ? INCY * size : size );
160 }
161 kb = MN;
162
163
164
165
166
167 if( ( ( lcmt00 == 0 ) && ( VM->
imb1 == VM->
inb1 ) && ( mb == nb ) &&
168 ( nprow == npcol ) ) || ( ( nprow == 1 ) && ( npcol == 1 ) ) )
169 {
171 {
172 npq = ( ( mblks < 2 ) ? imbloc :
173 imbloc + ( mblks - 2 ) * mb + lmbloc );
174 npq =
MIN( npq, kb );
175 if( rows )
TYPE->Fswap( &npq, X, &INCX, Y, &INCY );
176 else TYPE->Fswap( &npq, X, &INCX, Y, &INCY );
177 }
178 return( npq );
179 }
180 pmb = nprow * mb;
181 qnb = npcol * nb;
182
183
184
185
186
187 GoSouth = ( lcmt00 > iupp );
188 GoEast = ( lcmt00 < ilow );
189
190 if( !( GoSouth ) && !( GoEast ) )
191 {
192
193
194
195 if( lcmt00 >= 0 )
196 {
197 tmp1 = imbloc - lcmt00; tmp1 =
MAX( 0, tmp1 );
198 tmp2 =
MIN( tmp1, inbloc ); npq += ( tmp2 =
MIN( tmp2, kb ) );
199 TYPE->Fswap( &tmp2, X+lcmt00*Xinc, &INCX, Y, &INCY );
200 }
201 else
202 {
203 tmp1 = inbloc + lcmt00; tmp1 =
MAX( 0, tmp1 );
204 tmp2 =
MIN( tmp1, imbloc ); npq += ( tmp2 =
MIN( tmp2, kb ) );
205 TYPE->Fswap( &tmp2, X, &INCX, Y-lcmt00*Yinc, &INCY );
206 }
207 if( ( kb -= tmp2 ) == 0 ) return( npq );
208
209
210
211
212
213 GoSouth = !( GoEast = ( ( lcmt00 - ( iupp - upp + pmb ) ) < ilow ) );
214 }
215
216 if( GoSouth )
217 {
218
219
220
221
222 lcmt00 -= iupp - upp + pmb; mblks--; X += imbloc * Xinc;
223
224
225
226
227 while( mblks && ( lcmt00 > upp ) )
228 { lcmt00 -= pmb; mblks--; X += mb * Xinc; }
229
230
231
232 if( mblks <= 0 ) return( npq );
233
234
235
236
237
238
239 lcmt = lcmt00; mblkd = mblks; Xptrd = X;
240
241 while( mblkd && ( lcmt >= ilow ) )
242 {
243
244
245
246 mbloc = ( ( mblkd == 1 ) ? lmbloc : mb );
247 if( lcmt >= 0 )
248 {
249 tmp1 = mbloc - lcmt; tmp1 =
MAX( 0, tmp1 );
250 tmp2 =
MIN( tmp1, inbloc ); npq += ( tmp2 =
MIN( tmp2, kb ) );
251 TYPE->Fswap( &tmp2, Xptrd+lcmt*Xinc, &INCX, Y, &INCY );
252 }
253 else
254 {
255 tmp1 = inbloc + lcmt; tmp1 =
MAX( 0, tmp1 );
256 tmp2 =
MIN( tmp1, mbloc ); npq += ( tmp2 =
MIN( tmp2, kb ) );
257 TYPE->Fswap( &tmp2, Xptrd, &INCX, Y-lcmt*Yinc, &INCY );
258 }
259 if( ( kb -= tmp2 ) == 0 ) return( npq );
260
261
262
263 lcmt -= pmb; mblkd--; Xptrd += mbloc * Xinc;
264 }
265
266
267
268 lcmt00 += low - ilow + qnb; nblks--; Y += inbloc * Yinc;
269 }
270 else if( GoEast )
271 {
272
273
274
275
276 lcmt00 += low - ilow + qnb; nblks--; Y += inbloc * Yinc;
277
278
279
280
281
282 while( nblks && ( lcmt00 < low ) )
283 { lcmt00 += qnb; nblks--; Y += nb * Yinc; }
284
285
286
287 if( nblks <= 0 ) return( npq );
288
289
290
291
292
293 lcmt = lcmt00; nblkd = nblks; Yptrd = Y;
294
295 while( nblkd && ( lcmt <= iupp ) )
296 {
297
298
299
300 nbloc = ( ( nblkd == 1 ) ? lnbloc : nb );
301 if( lcmt >= 0 )
302 {
303 tmp1 = imbloc - lcmt; tmp1 =
MAX( 0, tmp1 );
304 tmp2 =
MIN( tmp1, nbloc ); npq += ( tmp2 =
MIN( tmp2, kb ) );
305 TYPE->Fswap( &tmp2, X+lcmt*Xinc, &INCX, Yptrd, &INCY );
306 }
307 else
308 {
309 tmp1 = nbloc + lcmt; tmp1 =
MAX( 0, tmp1 );
310 tmp2 =
MIN( tmp1, imbloc ); npq += ( tmp2 =
MIN( tmp2, kb ) );
311 TYPE->Fswap( &tmp2, X, &INCX, Yptrd-lcmt*Yinc, &INCY );
312 }
313 if( ( kb -= tmp2 ) == 0 ) return( npq );
314
315
316
317 lcmt += qnb; nblkd--; Yptrd += nbloc * Yinc;
318 }
319
320
321
322 lcmt00 -= iupp - upp + pmb; mblks--; X += imbloc * Xinc;
323 }
324
325
326
327 do
328 {
329
330
331
332
333 if( ( lcmt00 < low ) || ( lcmt00 > upp ) )
334 {
335 while( mblks && nblks )
336 {
337 while( mblks && ( lcmt00 > upp ) )
338 { lcmt00 -= pmb; mblks--; X += mb * Xinc; }
339 if( lcmt00 >= low ) break;
340 while( nblks && ( lcmt00 < low ) )
341 { lcmt00 += qnb; nblks--; Y += nb * Yinc; }
342 if( lcmt00 <= upp ) break;
343 }
344 }
345 if( !mblks || !nblks ) return( npq );
346
347
348
349
350
351 nbloc = ( ( nblks == 1 ) ? lnbloc : nb );
352 lcmt = lcmt00; mblkd = mblks; Xptrd = X;
353
354 while( mblkd && lcmt >= low )
355 {
356
357
358
359 mbloc = ( ( mblkd == 1 ) ? lmbloc : mb );
360 if( lcmt >= 0 )
361 {
362 tmp1 = mbloc - lcmt; tmp1 =
MAX( 0, tmp1 );
363 tmp2 =
MIN( tmp1, nbloc ); npq += ( tmp2 =
MIN( tmp2, kb ) );
364 TYPE->Fswap( &tmp2, Xptrd+lcmt*Xinc, &INCX, Y, &INCY );
365 }
366 else
367 {
368 tmp1 = nbloc + lcmt; tmp1 =
MAX( 0, tmp1 );
369 tmp2 =
MIN( tmp1, mbloc ); npq += ( tmp2 =
MIN( tmp2, kb ) );
370 TYPE->Fswap( &tmp2, Xptrd, &INCX, Y-lcmt*Yinc, &INCY );
371 }
372 if( ( kb -= tmp2 ) == 0 ) return( npq );
373
374
375
376 lcmt -= pmb; mblkd--; Xptrd += mbloc * Xinc;
377 }
378
379
380
381 lcmt00 += qnb; nblks--; Y += nbloc * Yinc;
382
383
384
385 } while( nblks > 0 );
386
387
388
389 return( npq );
390 }
391 else
392 {
393
394
395
396 if( rows )
397 {
398
399
400
401 Xinc = size;
402 Yinc = ( notran ? size : INCY * size );
403 }
404 else
405 {
406
407
408
409 Xinc = INCX * size;
410 Yinc = ( notran ? INCY * size : size );
411 }
412 kb = MN;
413
414
415
416
417
418 if( ( ( lcmt00 == 0 ) && ( VM->
imb1 == VM->
inb1 ) && ( mb == nb ) &&
419 ( nprow == npcol ) ) || ( ( nprow == 1 ) && ( npcol == 1 ) ) )
420 {
422 {
423 npq = ( ( nblks < 2 ) ? inbloc :
424 inbloc + ( nblks - 2 ) * nb + lnbloc );
425 npq =
MIN( npq, kb );
426 if( rows )
TYPE->Fswap( &npq, X, &INCX, Y, &INCY );
427 else TYPE->Fswap( &npq, X, &INCX, Y, &INCY );
428 }
429 return( npq );
430 }
431 pmb = nprow * mb;
432 qnb = npcol * nb;
433
434
435
436
437
438 GoSouth = ( lcmt00 > iupp );
439 GoEast = ( lcmt00 < ilow );
440
441 if( !( GoSouth ) && !( GoEast ) )
442 {
443
444
445
446 if( lcmt00 >= 0 )
447 {
448 tmp1 = imbloc - lcmt00; tmp1 =
MAX( 0, tmp1 );
449 tmp2 =
MIN( tmp1, inbloc ); npq += ( tmp2 =
MIN( tmp2, kb ) );
450 TYPE->Fswap( &tmp2, X, &INCX, Y+lcmt00*Yinc, &INCY );
451 }
452 else
453 {
454 tmp1 = inbloc + lcmt00; tmp1 =
MAX( 0, tmp1 );
455 tmp2 =
MIN( tmp1, imbloc ); npq += ( tmp2 =
MIN( tmp2, kb ) );
456 TYPE->Fswap( &tmp2, X-lcmt00*Xinc, &INCX, Y, &INCY );
457 }
458 if( ( kb -= tmp2 ) == 0 ) return( npq );
459
460
461
462
463
464 GoSouth = !( GoEast = ( ( lcmt00 - ( iupp - upp + pmb ) ) < ilow ) );
465 }
466
467 if( GoSouth )
468 {
469
470
471
472
473 lcmt00 -= iupp - upp + pmb; mblks--; Y += imbloc * Yinc;
474
475
476
477
478 while( mblks && ( lcmt00 > upp ) )
479 { lcmt00 -= pmb; mblks--; Y += mb * Yinc; }
480
481
482
483 if( mblks <= 0 ) return( npq );
484
485
486
487
488
489
490 lcmt = lcmt00; mblkd = mblks; Yptrd = Y;
491
492 while( mblkd && ( lcmt >= ilow ) )
493 {
494
495
496
497 mbloc = ( ( mblkd == 1 ) ? lmbloc : mb );
498 if( lcmt >= 0 )
499 {
500 tmp1 = mbloc - lcmt; tmp1 =
MAX( 0, tmp1 );
501 tmp2 =
MIN( tmp1, inbloc ); npq += ( tmp2 =
MIN( tmp2, kb ) );
502 TYPE->Fswap( &tmp2, X, &INCX, Yptrd+lcmt*Yinc, &INCY );
503 }
504 else
505 {
506 tmp1 = inbloc + lcmt; tmp1 =
MAX( 0, tmp1 );
507 tmp2 =
MIN( tmp1, mbloc ); npq += ( tmp2 =
MIN( tmp2, kb ) );
508 TYPE->Fswap( &tmp2, X-lcmt*Xinc, &INCX, Yptrd, &INCY );
509 }
510 if( ( kb -= tmp2 ) == 0 ) return( npq );
511
512
513
514 lcmt -= pmb; mblkd--; Yptrd += mbloc * Yinc;
515 }
516
517
518
519 lcmt00 += low - ilow + qnb; nblks--; X += inbloc * Xinc;
520 }
521 else if( GoEast )
522 {
523
524
525
526
527 lcmt00 += low - ilow + qnb; nblks--; X += inbloc * Xinc;
528
529
530
531
532
533 while( nblks && ( lcmt00 < low ) )
534 { lcmt00 += qnb; nblks--; X += nb * Xinc; }
535
536
537
538 if( nblks <= 0 ) return( npq );
539
540
541
542
543
544 lcmt = lcmt00; nblkd = nblks; Xptrd = X;
545
546 while( nblkd && ( lcmt <= iupp ) )
547 {
548
549
550
551 nbloc = ( ( nblkd == 1 ) ? lnbloc : nb );
552 if( lcmt >= 0 )
553 {
554 tmp1 = imbloc - lcmt; tmp1 =
MAX( 0, tmp1 );
555 tmp2 =
MIN( tmp1, nbloc ); npq += ( tmp2 =
MIN( tmp2, kb ) );
556 TYPE->Fswap( &tmp2, Xptrd, &INCX, Y+lcmt*Yinc, &INCY );
557 }
558 else
559 {
560 tmp1 = nbloc + lcmt; tmp1 =
MAX( 0, tmp1 );
561 tmp2 =
MIN( tmp1, imbloc ); npq += ( tmp2 =
MIN( tmp2, kb ) );
562 TYPE->Fswap( &tmp2, Xptrd-lcmt*Xinc, &INCX, Y, &INCY );
563 }
564 if( ( kb -= tmp2 ) == 0 ) return( npq );
565
566
567
568 lcmt += qnb; nblkd--; Xptrd += nbloc * Xinc;
569 }
570
571
572
573 lcmt00 -= iupp - upp + pmb; mblks--; Y += imbloc * Yinc;
574 }
575
576
577
578 do
579 {
580
581
582
583
584 if( ( lcmt00 < low ) || ( lcmt00 > upp ) )
585 {
586 while( mblks && nblks )
587 {
588 while( mblks && ( lcmt00 > upp ) )
589 { lcmt00 -= pmb; mblks--; Y += mb * Yinc; }
590 if( lcmt00 >= low ) break;
591 while( nblks && ( lcmt00 < low ) )
592 { lcmt00 += qnb; nblks--; X += nb * Xinc; }
593 if( lcmt00 <= upp ) break;
594 }
595 }
596 if( !( mblks ) || !( nblks ) ) return( npq );
597
598
599
600
601
602 nbloc = ( ( nblks == 1 ) ? lnbloc : nb );
603 lcmt = lcmt00; mblkd = mblks; Yptrd = Y;
604
605
606
607 while( mblkd && lcmt >= low )
608 {
609 mbloc = ( ( mblkd == 1 ) ? lmbloc : mb );
610 if( lcmt >= 0 )
611 {
612 tmp1 = mbloc - lcmt; tmp1 =
MAX( 0, tmp1 );
613 tmp2 =
MIN( tmp1, nbloc ); npq += ( tmp2 =
MIN( tmp2, kb ) );
614 TYPE->Fswap( &tmp2, X, &INCX, Yptrd+lcmt*Yinc, &INCY );
615 }
616 else
617 {
618 tmp1 = nbloc + lcmt; tmp1 =
MAX( 0, tmp1 );
619 tmp2 =
MIN( tmp1, mbloc ); npq += ( tmp2 =
MIN( tmp2, kb ) );
620 TYPE->Fswap( &tmp2, X-lcmt*Xinc, &INCX, Yptrd, &INCY );
621 }
622 if( ( kb -= tmp2 ) == 0 ) return( npq );
623
624
625
626 lcmt -= pmb; mblkd--; Yptrd += mbloc * Yinc;
627 }
628
629
630
631 lcmt00 += qnb; nblks--; X += nbloc * Xinc;
632
633
634
635 } while( nblks > 0 );
636
637
638
639 return( npq );
640 }
641
642
643
644}