00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042 #pragma ident "@(#) libf/fio/scatgath.c 92.1 06/18/99 18:41:02"
00043
00044 #include <stdint.h>
00045 #if defined(__mips)
00046 #include <sgidefs.h>
00047 #endif
00048
00049 #include <memory.h>
00050 #include <cray/nassert.h>
00051
00052 #ifdef _CRAY1
00053 #define GET_PTR(ptr) ( (long) _dshiftl((long) ptr, (long) ptr, 3) )
00054 #else
00055 #define GET_PTR(ptr) ( (unsigned long) ptr )
00056 #endif
00057
00058 #define PTR_ALIGNED(ptr,type) ( ( GET_PTR(ptr) & (sizeof(type) - 1) ) == 0UL)
00059
00060 #define SIZE_ALIGNED(len,type) ( ( len & (sizeof(type) - 1) ) == 0)
00061
00062
00063
00064
00065
00066
00067
00068
00069
00070
00071
00072
00073
00074
00075
00076
00077
00078
00079
00080
00081
00082
00083
00084
00085
00086 typedef int64_t LARGE;
00087 typedef int32_t MEDIUM;
00088 typedef int16_t SHORT;
00089
00090
00091
00092
00093
00094
00095
00096
00097
00098
00099
00100
00101
00102
00103
00104 void
00105 _gather_data(
00106 void *buf,
00107 long items,
00108 long inc,
00109 int len,
00110 void *ptr)
00111 {
00112 register long i, j, k;
00113 register long step;
00114
00115 assert ( inc % len == 0 );
00116
00117 j = 0;
00118 k = 0;
00119
00120
00121
00122
00123
00124
00125 if ( SIZE_ALIGNED(len, LARGE) && PTR_ALIGNED(ptr, LARGE) ) {
00126 LARGE *lp, *lb;
00127
00128 lp = (LARGE *) ptr;
00129 lb = (LARGE *) buf;
00130 step = inc >> 3;
00131
00132 assert ( sizeof(LARGE) == 8 );
00133
00134 if (len == sizeof(LARGE)) {
00135 #ifdef _CRAY1
00136 #pragma _CRI ivdep
00137 #endif
00138 for (i = 0; i < items; i++) {
00139 lb[i] = lp[k];
00140 k = k + step;
00141 }
00142 }
00143 else if (len == (sizeof(LARGE) << 1)) {
00144 #ifdef _CRAY1
00145 #pragma _CRI ivdep
00146 #endif
00147 for (i = 0; i < items; i++) {
00148 lb[j] = lp[k];
00149 lb[j+1] = lp[k+1];
00150 j = j + 2;
00151 k = k + step;
00152 }
00153 }
00154 else if (len == (sizeof(LARGE) << 2)) {
00155 #ifdef _CRAY1
00156 #pragma _CRI ivdep
00157 #endif
00158 for (i = 0 ; i < items; i++) {
00159 lb[j] = lp[k];
00160 lb[j+1] = lp[k+1];
00161 lb[j+2] = lp[k+2];
00162 lb[j+3] = lp[k+3];
00163 j = j + 4;
00164 k = k + step;
00165 }
00166 }
00167 else
00168 goto general_case;
00169 }
00170
00171
00172
00173
00174
00175
00176 #ifdef MEDIUM
00177 else if ( SIZE_ALIGNED(len, MEDIUM) && PTR_ALIGNED(ptr, MEDIUM) ) {
00178 MEDIUM *ip, *ib;
00179
00180 ip = (MEDIUM *) ptr;
00181 ib = (MEDIUM *) buf;
00182 step = inc >> 2;
00183
00184 assert ( sizeof(MEDIUM) == 4 );
00185
00186 if (len == sizeof(MEDIUM)) {
00187 for (i = 0; i < items; i++) {
00188 ib[i] = ip[k];
00189 k = k + step;
00190 }
00191 }
00192 else if (len == (sizeof(MEDIUM) << 1)) {
00193 for (i = 0; i < items; i++) {
00194 ib[j] = ip[k];
00195 ib[j+1] = ip[k+1];
00196 j = j + 2;
00197 k = k + step;
00198 }
00199 }
00200 else
00201 goto general_case;
00202 }
00203 #endif
00204
00205
00206
00207
00208
00209
00210 #ifdef SMALL
00211 else if ( SIZE_ALIGNED(len, SMALL) && PTR_ALIGNED(ptr, SMALL) ) {
00212 SMALL *sp, *sb;
00213
00214 sp = (SMALL *) ptr;
00215 sb = (SMALL *) buf;
00216 step = inc >> 1;
00217
00218 assert ( sizeof(SMALL) == 2 );
00219
00220 if (len == sizeof(SMALL)) {
00221 for (i = 0; i < items; i++) {
00222 sb[i] = sp[k];
00223 k = k + step;
00224 }
00225 }
00226 else if (len == (sizeof(SMALL) << 1)) {
00227 for (i = 0; i < items; i++) {
00228 sb[j] = sp[k];
00229 sb[j+1] = sp[k+1];
00230 j = j + 2;
00231 k = k + step;
00232 }
00233 }
00234 else
00235 goto general_case;
00236 }
00237 #endif
00238
00239
00240
00241
00242
00243
00244 else {
00245 char *cp, *cb;
00246 general_case:
00247 cp = (char *) ptr;
00248 cb = (char *) buf;
00249
00250
00251
00252 if (len == 1)
00253 for (i = 0; i < items; i++) {
00254 *cb++ = *cp;
00255 cp = cp + inc;
00256 }
00257 else
00258 for (i = 0; i < items; i++) {
00259 (void) memcpy(cb, cp, len);
00260 cb = cb + len;
00261 cp = cp + inc;
00262 }
00263 }
00264
00265 return;
00266 }
00267
00268
00269
00270
00271
00272
00273
00274
00275
00276
00277
00278
00279
00280
00281 void
00282 _scatter_data (
00283 void *ptr,
00284 long items,
00285 long inc,
00286 int len,
00287 void *buf)
00288 {
00289 register long i, j, k;
00290 register long step;
00291
00292 assert ( inc % len == 0 );
00293
00294 j = 0;
00295 k = 0;
00296
00297
00298
00299
00300
00301
00302 if ( SIZE_ALIGNED(len, LARGE) && PTR_ALIGNED(ptr, LARGE) ) {
00303 LARGE *lp, *lb;
00304
00305 lp = (LARGE *) ptr;
00306 lb = (LARGE *) buf;
00307 step = inc >> 3;
00308
00309 assert ( sizeof(LARGE) == 8 );
00310
00311 if (len == sizeof(LARGE)) {
00312 #ifdef _CRAY1
00313 #pragma _CRI ivdep
00314 #endif
00315 for (i = 0; i < items; i++) {
00316 lp[k] = lb[i];
00317 k = k + step;
00318 }
00319 }
00320 else if (len == (sizeof(LARGE) << 1)) {
00321 #ifdef _CRAY1
00322 #pragma _CRI ivdep
00323 #endif
00324 for (i = 0; i < items; i++) {
00325 lp[k] = lb[j];
00326 lp[k+1] = lb[j+1];
00327 j = j + 2;
00328 k = k + step;
00329 }
00330 }
00331 else if (len == (sizeof(LARGE) << 2)) {
00332 #ifdef _CRAY1
00333 #pragma _CRI ivdep
00334 #endif
00335 for (i = 0 ; i < items; i++) {
00336 lp[k] = lb[j];
00337 lp[k+1] = lb[j+1];
00338 lp[k+2] = lb[j+2];
00339 lp[k+3] = lb[j+3];
00340 j = j + 4;
00341 k = k + step;
00342 }
00343 }
00344 else
00345 goto general_case;
00346 }
00347
00348
00349
00350
00351
00352
00353 #ifdef MEDIUM
00354 else if ( SIZE_ALIGNED(len, MEDIUM) && PTR_ALIGNED(ptr, MEDIUM) ) {
00355 MEDIUM *ip, *ib;
00356
00357 ip = (MEDIUM *) ptr;
00358 ib = (MEDIUM *) buf;
00359 step = inc >> 2;
00360
00361 assert ( sizeof(MEDIUM) == 4 );
00362
00363 if (len == sizeof(MEDIUM)) {
00364 for (i = 0; i < items; i++) {
00365 ip[k] = ib[i];
00366 k = k + step;
00367 }
00368 }
00369 else if (len == (sizeof(MEDIUM) << 1)) {
00370 for (i = 0; i < items; i++) {
00371 ip[k] = ib[j];
00372 ip[k+1] = ib[j+1];
00373 j = j + 2;
00374 k = k + step;
00375 }
00376 }
00377 else
00378 goto general_case;
00379 }
00380 #endif
00381
00382
00383
00384
00385
00386
00387 #ifdef SMALL
00388 else if ( SIZE_ALIGNED(len, SMALL) && PTR_ALIGNED(ptr, SMALL) ) {
00389 SMALL *sp, *sb;
00390
00391 sp = (SMALL *) ptr;
00392 sb = (SMALL *) buf;
00393 step = inc >> 1;
00394
00395 assert ( sizeof(SMALL) == 2 );
00396
00397 if (len == sizeof(SMALL)) {
00398 for (i = 0; i < items; i++) {
00399 sp[k] = sb[i];
00400 k = k + step;
00401 }
00402 }
00403 else if (len == (sizeof(SMALL) << 1)) {
00404 for (i = 0; i < items; i++) {
00405 sp[k] = sb[j];
00406 sp[k+1] = sb[j+1];
00407 j = j + 2;
00408 k = k + step;
00409 }
00410 }
00411 else
00412 goto general_case;
00413 }
00414 #endif
00415
00416
00417
00418
00419
00420
00421 else {
00422 char *cp, *cb;
00423 general_case:
00424 cp = (char *) ptr;
00425 cb = (char *) buf;
00426
00427
00428
00429 if (len == 1)
00430 for (i = 0; i < items; i++) {
00431 *cp = *cb++;
00432 cp = cp + inc;
00433 }
00434 else
00435 for (i = 0; i < items; i++) {
00436 (void) memcpy(cp, cb, len);
00437 cb = cb + len;
00438 cp = cp + inc;
00439 }
00440 }
00441
00442 return;
00443 }